diff --git a/.appveyor.yml b/.appveyor.yml index 5453e5c..b94562b 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -1,13 +1,13 @@ # Test against the latest version of this Node.js version environment: nodejs_version: "8" + FORCE_COLOR: 1 # Install scripts. (runs after repo cloning) install: # Get the latest stable version of Node.js or io.js - ps: Install-Product node $env:nodejs_version # install modules - - npm install grunt cli - npm install # Post-install test scripts. @@ -16,9 +16,8 @@ test_script: - node --version - npm --version # run tests - - node_modules\.bin\grunt.cmd - - npm run test-ci - - node_modules\.bin\grunt.cmd uploadCoverage + - npm test + - npm run uploadCoverage # Don't actually build. build: off diff --git a/.travis.yml b/.travis.yml index 9e8bd23..5202a30 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,13 +6,12 @@ env: global: - SAUCE_USERNAME: dojo2-ts-ci - SAUCE_ACCESS_KEY: e92610e3-834e-4bec-a3b5-6f7b9d874601 + - FORCE_COLOR: 1 install: -- travis_retry npm install grunt cli - travis_retry npm install script: -- grunt -- npm run test-ci -- grunt uploadCoverage +- npm test +- npm run uploadCoverage notifications: slack: secure: O9m3cCkl3H8VXRIuKLFfx91C01n9yLlehem9K3snnBMiyrtGWR2aXo+t1eeZYGfFWIl8UBEaSPlDurI1KspIcW/JbszuYAVje21rbl+ptkp008f5gDVfFCFpqdM9S5+lrVJLlx1mrikWKBRsjYqZHYV9EJx/ss+P86JsQ0utC7zgBFYId+UCMybAemzi1FPfeULFWpoi8QavoN8fNr4yHBayrqOlqnnIhlYLoTiGL6yY8L/meUrmWVxSY3JMDxLeIYNppt4puvTGUD1hU2LZgFZp1y6jGMcAlZI5amGV+iyTl/h2w1wiB6q5tolJ1JslosFvh53y7+1Crbm8wQDkX42+z7Rn3/jXRUBFwLZBGZQ99FcE0Yz+XBaQA3GuCgPNd0rcHmJxeYAKMm7jg2B8Nzd6It3q5mjdp9ITA5kR2G7g+iH8R4y112FXCpvt4/RUvHuyhl7w8lFlHK+LslH3DBjDi3fKUuwiGtU8oD3xpCunJ4JUgQmAWIOy3mpFIOX4QPcBKqByp10fNw3G73JDsJ9DXrFGb/+WnA2OgpDnKOnjoporwufRZLeioRwCJAWM0DbFDvRc1mbnECwcKiedzKdTxSWUGyJ6sxKydZtC11tF356BkzIsf3x7cKSed2LI8VXYNiPOJu9P+/s5/jRf/7kZ+i2ETfuKZC2awhgkBGo= diff --git a/intern.json b/intern.json index d7d83bb..9464977 100644 --- a/intern.json +++ b/intern.json @@ -1,14 +1,14 @@ { - "suites": [ - "./_build/tests/unit/all.js", - "./_build/tests/functional/all.js" - ], - - "coverage": [ - "./_build/src/**/*.js" - ], - - "configs": { - "local": {} - } + "extends": "./node_modules/@dojo/scripts/intern/base.json", + "capabilities+": { + "name": "@dojo/cli-build-widget" + }, + "suites": [ + "./dist/dev/tests/unit/all.js", + "./dist/dev/tests/functional/all.js" + ], + "coverage": [ + "./dist/dev/src/**/*.js", + "!./dist/dev/src/template/**/*" + ] } diff --git a/npm-shrinkwrap.json b/package-lock.json similarity index 62% rename from npm-shrinkwrap.json rename to package-lock.json index bead97e..454428f 100644 --- a/npm-shrinkwrap.json +++ b/package-lock.json @@ -1,32 +1,30 @@ { "name": "@dojo/cli-build-widget", - "version": "2.0.4", + "version": "3.0.0-pre", "lockfileVersion": 1, "requires": true, "dependencies": { "@dojo/cli": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@dojo/cli/-/cli-2.0.0.tgz", - "integrity": "sha512-MIJDEZOE9rQuch31NF24QvpvewzB9h6pj2qrXcjaj2/PYmIHBGlcAOCRZ/JBesPjbYTwasU4pqygTsf2mQt0zA==", - "dev": true, - "requires": { - "chalk": "2.3.0", - "cliui": "4.1.0", - "configstore": "3.1.2", - "cross-spawn": "5.1.0", - "detect-indent": "5.0.0", - "ejs": "2.5.9", - "execa": "0.8.0", - "fs-extra": "5.0.0", - "globby": "6.1.0", - "inquirer": "4.0.2", - "pkg-dir": "2.0.0", - "slice-ansi": "1.0.0", - "string-width": "2.1.1", - "tslib": "1.8.1", - "typings-core": "2.3.3", - "update-notifier": "2.5.0", - "yargs": "10.1.2" + "version": "3.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@dojo/cli/-/cli-3.0.0-alpha.1.tgz", + "integrity": "sha512-5oLp5n0umN7xTxhUGbOOM1DNWYEryx2rurB8xYJK1GDN52xTPwZLY05GanQcDvuwVh3jgyGubpVjbbZg41vJig==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "configstore": "^3.1.1", + "cross-spawn": "^5.1.0", + "detect-indent": "^5.0.0", + "ejs": "^2.5.7", + "execa": "^0.8.0", + "fs-extra": "^5.0.0", + "globby": "^6.0.0", + "inquirer": "^4.0.2", + "pkg-dir": "^2.0.0", + "slice-ansi": "^1.0.0", + "string-width": "^2.1.1", + "tslib": "~1.8.1", + "update-notifier": "^2.3.0", + "yargs": "^10.0.3" }, "dependencies": { "ansi-align": { @@ -35,7 +33,7 @@ "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", "dev": true, "requires": { - "string-width": "2.1.1" + "string-width": "^2.0.0" } }, "boxen": { @@ -44,13 +42,13 @@ "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", "dev": true, "requires": { - "ansi-align": "2.0.0", - "camelcase": "4.1.0", - "chalk": "2.3.0", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "2.0.0" + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" } }, "camelcase": { @@ -65,9 +63,9 @@ "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" } }, "configstore": { @@ -76,12 +74,12 @@ "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", "dev": true, "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.11", - "make-dir": "1.2.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.3.0", - "xdg-basedir": "3.0.0" + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" } }, "dot-prop": { @@ -90,7 +88,7 @@ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "dev": true, "requires": { - "is-obj": "1.0.1" + "is-obj": "^1.0.0" } }, "find-up": { @@ -99,7 +97,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } }, "fs-extra": { @@ -108,9 +106,9 @@ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "4.0.0", - "universalify": "0.1.1" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, "glob": { @@ -119,12 +117,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "globby": { @@ -133,11 +131,11 @@ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dev": true, "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "got": { @@ -146,17 +144,17 @@ "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.1", - "safe-buffer": "5.1.2", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -171,7 +169,7 @@ "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", "dev": true, "requires": { - "package-json": "4.0.1" + "package-json": "^4.0.0" } }, "package-json": { @@ -180,10 +178,10 @@ "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", "dev": true, "requires": { - "got": "6.7.1", - "registry-auth-token": "3.3.2", - "registry-url": "3.1.0", - "semver": "5.5.0" + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" } }, "string-width": { @@ -192,8 +190,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "timed-out": { @@ -214,16 +212,16 @@ "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", "dev": true, "requires": { - "boxen": "1.3.0", - "chalk": "2.3.0", - "configstore": "3.1.2", - "import-lazy": "2.1.0", - "is-ci": "1.1.0", - "is-installed-globally": "0.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" } }, "widest-line": { @@ -232,7 +230,7 @@ "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", "dev": true, "requires": { - "string-width": "2.1.1" + "string-width": "^2.1.1" } }, "write-file-atomic": { @@ -241,9 +239,9 @@ "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } }, "xdg-basedir": { @@ -258,18 +256,18 @@ "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", "dev": true, "requires": { - "cliui": "4.1.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "8.1.0" + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^8.1.0" } }, "yargs-parser": { @@ -278,45 +276,177 @@ "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", "dev": true, "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" } } } }, "@dojo/core": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@dojo/core/-/core-0.1.0.tgz", - "integrity": "sha512-boiwQHfV7idOZfZnDzgLrofS2LA7ELGKjd6tl0/hLBunJ3psozAd4CpNcT7XC00/OPYFIxVHFEpI+FZNlpUgfw==", - "dev": true + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@dojo/core/-/core-0.5.0.tgz", + "integrity": "sha512-kEyKjH/HRMf7rXxFiOvM0Lco8fPcoGtECZx8kr2tskgrIBPN8F3aaRTT8GZ9duUjoIp953RK8ggbMzBt7+ap+Q==", + "dev": true, + "requires": { + "tslib": "~1.8.1" + } + }, + "@dojo/framework": { + "version": "3.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@dojo/framework/-/framework-3.0.0-alpha.1.tgz", + "integrity": "sha512-Bpu7K7xQ210BH9mVBHYHIZ4CyNiDyUGSEyTZ0AKkRHy6+bggPN6hyatO5rbAhxrksMvk3Rgwi1nCosvLA4d6jQ==", + "requires": { + "@types/cldrjs": "~0.4.20", + "@types/globalize": "0.0.34", + "@types/web-animations-js": "2.2.5", + "@webcomponents/webcomponentsjs": "1.1.0", + "cldr-data": "~32.0.0", + "css-select-umd": "1.3.0-rc0", + "diff": "3.4.0", + "globalize": "1.3.0", + "intersection-observer": "0.4.2", + "pepjs": "0.4.2", + "tslib": "~1.8.0", + "web-animations-js": "2.3.1" + } }, "@dojo/has": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@dojo/has/-/has-2.0.0.tgz", - "integrity": "sha512-WFdsD2jVqsLvOTtEs8Q9TlJF7f0VgO8NXRccuOPKjw9tXKvB6XrnZjGgh+zkLxOUrm8m3rExMu8MHGM8ZHLPPQ==" + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@dojo/has/-/has-0.1.2.tgz", + "integrity": "sha512-122xXU9xHjG/EayITIAiIdKVphZTZ2wM9IEBArarkBQzXZP1shGAbTJq7NHWUoTemw48tvTxr+OOi7wVCm7IXg==", + "dev": true }, "@dojo/interfaces": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@dojo/interfaces/-/interfaces-0.1.0.tgz", - "integrity": "sha512-rpBALDc5Ya/+JrlyFvrt7wKGdGA1xq2gSFGce6j3L9meB8tAFYQvs/bx9DDp+CSdpEzzeVZWr8C4FpoUId2New==", - "dev": true + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@dojo/interfaces/-/interfaces-0.2.1.tgz", + "integrity": "sha512-/bIJJb9q02MxSlfA9G3n6AMTlD80fDx7qDRss/8HxeJ26ix/F/tCnX521c3XrWm/HOBEWp7GiRX5E0hQdIuCNw==", + "dev": true, + "requires": { + "@types/yargs": "^8.0.2" + }, + "dependencies": { + "@types/yargs": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-8.0.3.tgz", + "integrity": "sha512-YdxO7zGQf2qJeMgR0fNO8QTlj88L2zCP5GOddovoTyetgLiNDOUXcWzhWKb4EdZZlOjLQUA0JM8lW7VcKQL+9w==", + "dev": true + } + } + }, + "@dojo/scripts": { + "version": "3.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/@dojo/scripts/-/scripts-3.0.0-alpha.6.tgz", + "integrity": "sha512-f8nQ2jdbzSyJ2Ytwpgqu0jocRGb7xNpmBvZL1Imo1bFQAH/946I+RHLM6DV1gYcie9zYMYMQdc/WeF8RFz6nCA==", + "dev": true, + "requires": { + "chalk": "~2.4.0", + "intern": "~4.2.0", + "parse-git-config": "~2.0.2", + "prettier": "1.13.7", + "rxjs": "^5.5.6", + "tslint": "~5.11.0", + "tslint-language-service": "~0.9.9", + "typescript": "~2.6.2", + "yargs": "~10.1.2" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "prettier": { + "version": "1.13.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.13.7.tgz", + "integrity": "sha512-KIU72UmYPGk4MujZGYMFwinB7lOf2LsDNGSOC8ufevsrPLISrZbNJlWstRi3m0AMuszbH+EFSQ/r6w56RSPK6w==", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "yargs": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", + "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^8.1.0" + } + }, + "yargs-parser": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", + "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } }, "@dojo/shim": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@dojo/shim/-/shim-2.0.0.tgz", - "integrity": "sha512-v/zD80U+8ajNrfxwKH6yy//l6ATQ/LzeYVXcqmBkGQ0NA4vDujLS3ceF3Wt0XL55JXLUYaVSQACMqy0H9DPD3A==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@dojo/shim/-/shim-0.2.7.tgz", + "integrity": "sha512-3R/n4a1/17acl9S5Wtay/0rcKzUqtVVJkCLPrGZq4NmRzWop09Unryqg/GV0Y1V7SbcILHKBL7bOTEfrpVX63g==", + "dev": true, "requires": { "intersection-observer": "0.4.2", "pepjs": "0.4.2", - "tslib": "1.8.1", + "tslib": "~1.8.0", "web-animations-js": "2.3.1" } }, "@dojo/webpack-contrib": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@dojo/webpack-contrib/-/webpack-contrib-2.0.0.tgz", - "integrity": "sha512-k9GgDo5JzCmz1q9sjyhBZOEmix/l5ETFNAenLNS8FfN1Oc5jgfMfNh7tsv58bh8apBj8VHOVPE7IesRuBhHOFw==", + "version": "3.0.0-alpha.2", + "resolved": "https://registry.npmjs.org/@dojo/webpack-contrib/-/webpack-contrib-3.0.0-alpha.2.tgz", + "integrity": "sha512-HPyF4UFj46RCZpwDg3ohHm4Plz09UQQpBFZvVbd9XL0vQg8FNR+HVrLYLitfBFth20NkXLFwHDUfCzYHPjqBQA==", "requires": { - "@dojo/shim": "2.0.0", + "@dojo/framework": "^3.0.0-alpha.1", + "acorn-dynamic-import": "3.0.0", "copy-webpack-plugin": "4.0.1", "filter-css": "0.1.2", "html-webpack-include-assets-plugin": "1.0.2", @@ -326,19 +456,13 @@ "source-map": "0.6.1", "ts-loader": "3.1.1", "typed-css-modules": "0.3.1", - "typescript": "2.6.2" - }, - "dependencies": { - "typescript": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", - "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=" - } + "typescript": "~2.6.1", + "workbox-webpack-plugin": "3.2.0" } }, "@sinonjs/formatio": { "version": "2.0.0", - "resolved": "http://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", "dev": true, "requires": { @@ -346,60 +470,68 @@ } }, "@theintern/digdug": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@theintern/digdug/-/digdug-2.0.4.tgz", - "integrity": "sha512-BTcYNMxOnGlTEaOYqab9WygE2sLz9ZRWRsuTwUttceewzEDn/Ok/4lWdIgwwX+bb3MybvFPU1wBkq8Co+Bfqyw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@theintern/digdug/-/digdug-2.1.2.tgz", + "integrity": "sha512-r1QjsLCeBk6UiK2nA6g3P+nc5V/drSU6w8zmvEWIsCl397xog1h6yEovu8V9KVjISL2LbyyOLEGGnNDSlEpcVQ==", "dev": true, "requires": { - "@dojo/core": "0.3.1", - "@dojo/has": "0.1.2", - "@dojo/interfaces": "0.2.1", - "@dojo/shim": "0.2.7", - "decompress": "4.2.0", - "semver": "5.4.1", - "tslib": "1.8.1" + "@dojo/core": "~2.0.0", + "@dojo/has": "~2.0.0", + "@dojo/interfaces": "~0.2.0", + "@dojo/shim": "~2.0.0", + "command-exists": "~1.2.6", + "decompress": "~4.2.0", + "semver": "~5.5.0", + "tslib": "~1.9.0" }, "dependencies": { "@dojo/core": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@dojo/core/-/core-0.3.1.tgz", - "integrity": "sha512-PEwqxpsuTTG0b2wwy0TLHEFf/R6ZBE4zizo4EXzGUVRc5O44w5Hbn+NN48v/o8hwQRKxmX3ywLI0Z1CMZ6NM6w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@dojo/core/-/core-2.0.0.tgz", + "integrity": "sha512-iojqMIn49L/bwv/Ryy2v7qKeioHxjHQqJNLhEXBJ+zJoQ47IeG92Y5tmdGsZ6SKZk6sFuWHl7gL9Wbw0qVySHw==", "dev": true, "requires": { - "tslib": "1.8.1" + "tslib": "~1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.8.1.tgz", + "integrity": "sha1-aUavLR1lGnsYY7Ux1uWvpBqkTqw=", + "dev": true + } } }, "@dojo/has": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@dojo/has/-/has-0.1.2.tgz", - "integrity": "sha512-122xXU9xHjG/EayITIAiIdKVphZTZ2wM9IEBArarkBQzXZP1shGAbTJq7NHWUoTemw48tvTxr+OOi7wVCm7IXg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@dojo/has/-/has-2.0.0.tgz", + "integrity": "sha512-WFdsD2jVqsLvOTtEs8Q9TlJF7f0VgO8NXRccuOPKjw9tXKvB6XrnZjGgh+zkLxOUrm8m3rExMu8MHGM8ZHLPPQ==", "dev": true }, - "@dojo/interfaces": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@dojo/interfaces/-/interfaces-0.2.1.tgz", - "integrity": "sha512-/bIJJb9q02MxSlfA9G3n6AMTlD80fDx7qDRss/8HxeJ26ix/F/tCnX521c3XrWm/HOBEWp7GiRX5E0hQdIuCNw==", - "dev": true, - "requires": { - "@types/yargs": "8.0.2" - } - }, "@dojo/shim": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@dojo/shim/-/shim-0.2.7.tgz", - "integrity": "sha512-3R/n4a1/17acl9S5Wtay/0rcKzUqtVVJkCLPrGZq4NmRzWop09Unryqg/GV0Y1V7SbcILHKBL7bOTEfrpVX63g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@dojo/shim/-/shim-2.0.0.tgz", + "integrity": "sha512-v/zD80U+8ajNrfxwKH6yy//l6ATQ/LzeYVXcqmBkGQ0NA4vDujLS3ceF3Wt0XL55JXLUYaVSQACMqy0H9DPD3A==", "dev": true, "requires": { "intersection-observer": "0.4.2", "pepjs": "0.4.2", - "tslib": "1.8.1", + "tslib": "~1.8.0", "web-animations-js": "2.3.1" + }, + "dependencies": { + "tslib": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.8.1.tgz", + "integrity": "sha1-aUavLR1lGnsYY7Ux1uWvpBqkTqw=", + "dev": true + } } }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", "dev": true } } @@ -409,25 +541,30 @@ "resolved": "https://registry.npmjs.org/@theintern/istanbul-loader/-/istanbul-loader-1.0.0-beta.1.tgz", "integrity": "sha512-Iwrn+9v+OvLXJkvOR6IuxzYaLaG02XtlDiguArHxQZhQkRFXKf1edlAhUvbE886UKM5q4KIaB9NG7F7Ikjy8TA==", "requires": { - "@types/istanbul-lib-instrument": "1.7.1", - "@types/source-map": "0.5.7", - "@types/webpack": "3.0.14", - "source-map": "0.5.7" + "@types/istanbul-lib-instrument": "~1.7.0", + "@types/source-map": "~0.5.1", + "@types/webpack": "~3.0.10", + "source-map": "~0.5.7" }, "dependencies": { + "@types/node": { + "version": "10.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.5.2.tgz", + "integrity": "sha512-m9zXmifkZsMHZBOyxZWilMwmTlpC8x5Ty360JKTiXvlXZfBWYpsg9ZZvP/Ye+iZUh+Q+MxDLjItVTWIsfwz+8Q==" + }, "@types/tapable": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.2.tgz", - "integrity": "sha512-42zEJkBpNfMEAvWR5WlwtTH22oDzcMjFsL9gDGExwF8X8WvAiw7Vwop7hPw03QT8TKfec83LwbHj6SvpqM4ELQ==" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.4.tgz", + "integrity": "sha512-78AdXtlhpCHT0K3EytMpn4JNxaf5tbqbLcbIRoQIHzpTIyjpxLQKRoxU55ujBXAtg3Nl2h/XWvfDa9dsMOd0pQ==" }, "@types/webpack": { "version": "3.0.14", "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-3.0.14.tgz", "integrity": "sha512-HkN9be7+47PsMH+WjnhtoOpypaUgmpgggwL/P0r8fT7mzuw7c4cpho8eTsnrMz9Fdj35TBnqRcuxG/U7ZcDRJg==", "requires": { - "@types/node": "10.0.2", - "@types/tapable": "1.0.2", - "@types/uglify-js": "3.0.2" + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*" } }, "source-map": { @@ -438,62 +575,32 @@ } }, "@theintern/leadfoot": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@theintern/leadfoot/-/leadfoot-2.0.3.tgz", - "integrity": "sha512-J9wLAMjAU+Wyv5jGmHdVN4xnuyaD24kK7mAoLUPBLRNxflkJoTo9Ph5g4BKUHp+xpKd/IMU00ulgMMf++Xqm4A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@theintern/leadfoot/-/leadfoot-2.1.0.tgz", + "integrity": "sha512-GRl2RUMVOBDFAPHzMTH5vI+MvZNfhmMeb0vh640q4BMVZqoxXmIbRtW5bcJ3M580u56CcrMDCauLAYqQ5NUjFw==", "dev": true, "requires": { - "@dojo/core": "0.3.1", - "@dojo/has": "0.1.2", - "@dojo/interfaces": "0.2.1", - "@dojo/shim": "0.2.7", - "@types/jszip": "0.0.33", - "jszip": "3.1.5", - "tslib": "1.8.1" + "@dojo/core": "~0.5.0", + "@dojo/has": "~0.1.2", + "@dojo/interfaces": "~0.2.1", + "@dojo/shim": "~0.2.7", + "@types/jszip": "~3.1.3", + "jszip": "~3.1.3", + "tslib": "~1.9.0" }, "dependencies": { - "@dojo/core": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@dojo/core/-/core-0.3.1.tgz", - "integrity": "sha512-PEwqxpsuTTG0b2wwy0TLHEFf/R6ZBE4zizo4EXzGUVRc5O44w5Hbn+NN48v/o8hwQRKxmX3ywLI0Z1CMZ6NM6w==", - "dev": true, - "requires": { - "tslib": "1.8.1" - } - }, - "@dojo/has": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@dojo/has/-/has-0.1.2.tgz", - "integrity": "sha512-122xXU9xHjG/EayITIAiIdKVphZTZ2wM9IEBArarkBQzXZP1shGAbTJq7NHWUoTemw48tvTxr+OOi7wVCm7IXg==", + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", "dev": true - }, - "@dojo/interfaces": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@dojo/interfaces/-/interfaces-0.2.1.tgz", - "integrity": "sha512-/bIJJb9q02MxSlfA9G3n6AMTlD80fDx7qDRss/8HxeJ26ix/F/tCnX521c3XrWm/HOBEWp7GiRX5E0hQdIuCNw==", - "dev": true, - "requires": { - "@types/yargs": "8.0.2" - } - }, - "@dojo/shim": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@dojo/shim/-/shim-0.2.7.tgz", - "integrity": "sha512-3R/n4a1/17acl9S5Wtay/0rcKzUqtVVJkCLPrGZq4NmRzWop09Unryqg/GV0Y1V7SbcILHKBL7bOTEfrpVX63g==", - "dev": true, - "requires": { - "intersection-observer": "0.4.2", - "pepjs": "0.4.2", - "tslib": "1.8.1", - "web-animations-js": "2.3.1" - } } } }, "@types/babel-types": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.1.tgz", - "integrity": "sha512-EkcOk09rjhivbovP8WreGRbXW20YRfe/qdgXOGq3it3u3aAOWDRNsQhL/XPAWFF7zhZZ+uR+nT+3b+TCkIap1w==" + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.4.tgz", + "integrity": "sha512-WiZhq3SVJHFRgRYLXvpf65XnV6ipVHhnNaNvE8yCimejrGglkg38kEj0JcizqwSHxmPSjcTlig/6JouxLGEhGw==" }, "@types/benchmark": { "version": "1.0.31", @@ -507,34 +614,30 @@ "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==", "dev": true, "requires": { - "@types/connect": "3.4.32", - "@types/node": "10.0.2" + "@types/connect": "*", + "@types/node": "*" } }, "@types/chai": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.0.10.tgz", - "integrity": "sha512-Ejh1AXTY8lm+x91X/yar3G2z4x9RyKwdTVdyyu7Xj3dNB35fMNCnEWqTO9FgS3zjzlRNqk1MruYhgb8yhRN9rA==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.4.tgz", + "integrity": "sha512-h6+VEw2Vr3ORiFCyyJmcho2zALnUq9cvdB/IO8Xs9itrJVCenC7o26A6+m7D0ihTTr65eS259H5/Ghl/VjYs6g==", "dev": true }, - "@types/chalk": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-2.2.0.tgz", - "integrity": "sha512-1zzPV9FDe1I/WHhRkf9SNgqtRJWZqrBWgu7JGveuHmmyR9CnAPCie2N/x+iHrgnpYBIcCJWHBoMRv2TRWktsvw==", - "dev": true, - "requires": { - "chalk": "2.3.0" - } - }, "@types/charm": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/charm/-/charm-1.0.1.tgz", "integrity": "sha512-F9OalGhk60p/DnACfa1SWtmVTMni0+w9t/qfb5Bu7CsurkEjZFN7Z+ii/VGmYpaViPz7o3tBahRQae9O7skFlQ==", "dev": true, "requires": { - "@types/node": "10.0.2" + "@types/node": "*" } }, + "@types/cldrjs": { + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/@types/cldrjs/-/cldrjs-0.4.20.tgz", + "integrity": "sha512-vQe6BQF9QCHSLUlNjRa/1zicRCnQnTRwhW/FqgVv26A85COY1jfkkO6JjogDv22U3LRhu9pY4uPQOlxGnsuJPA==" + }, "@types/clean-css": { "version": "3.4.30", "resolved": "https://registry.npmjs.org/@types/clean-css/-/clean-css-3.4.30.tgz", @@ -547,7 +650,7 @@ "integrity": "sha512-IRBc1bH7owKMcuxb0B7pFYEAp7uqWzBjmjO0m8Feh7qiXY7ezzLL3cFOC8KWPxPOP81qyB4yoVJA1EvZ9kiLVg==", "dev": true, "requires": { - "@types/webpack": "3.8.1" + "@types/webpack": "*" } }, "@types/connect": { @@ -556,13 +659,13 @@ "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", "dev": true, "requires": { - "@types/node": "10.0.2" + "@types/node": "*" } }, "@types/diff": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@types/diff/-/diff-3.2.2.tgz", - "integrity": "sha512-q3zfJvaTroV5BjAAR+peTHEGAAhGrPX0z2EzCzpt2mwFA+qzUn2nigJLqSekXRtdULKmT8am7zjvTMZSapIgHw==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@types/diff/-/diff-3.5.1.tgz", + "integrity": "sha512-nkT7bd/YM6QRDQjww8PYf0kOj1MvwxQ/WaCinj2Hm1HlL+JqGTm4cDoQeROfiWX/B3SNI1nyLLhLAQpp5sE3hw==", "dev": true }, "@types/events": { @@ -577,7 +680,7 @@ "integrity": "sha512-ThxqSisit0vK4cc3Cb402ktFqZAghNmoeGhTsnXjXesVJUsKaSYQ9v3/g1J+/y2ZJrPljRl7h0Hx0PktOdnBJw==", "dev": true, "requires": { - "@types/node": "10.0.2" + "@types/node": "*" } }, "@types/express": { @@ -586,19 +689,20 @@ "integrity": "sha512-N1Wdp3v4KmdO3W/CM7KXrDwM4xcVZjlHF2dAOs7sNrTUX8PY3G4n9NkaHlfjGFEfgFeHmRRjywoBd4VkujDs9w==", "dev": true, "requires": { - "@types/body-parser": "1.17.0", - "@types/express-serve-static-core": "4.11.1", - "@types/serve-static": "1.13.2" + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/serve-static": "*" } }, "@types/express-serve-static-core": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.11.1.tgz", - "integrity": "sha512-EehCl3tpuqiM8RUb+0255M8PhhSwTtLfmO7zBBdv0ay/VTd/zmrqDfQdZFsa5z/PVMbH2yCMZPXsnrImpATyIw==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz", + "integrity": "sha512-lTeoCu5NxJU4OD9moCgm0ESZzweAx0YqsAcab6OB0EB3+As1OaHtKnaGJvcngQxYsi9UNv0abn4/DRavrRxt4w==", "dev": true, "requires": { - "@types/events": "1.2.0", - "@types/node": "10.0.2" + "@types/events": "*", + "@types/node": "*", + "@types/range-parser": "*" } }, "@types/extract-text-webpack-plugin": { @@ -607,16 +711,7 @@ "integrity": "sha512-QUoYLBzHsWGzfKnThJlDrjrM/plUFlEl558ixQpnXpm0J7QiVxWveGelRcVJRZoabEsUhrziFeiuAl4tOS5Muw==", "dev": true, "requires": { - "@types/webpack": "3.8.1" - } - }, - "@types/fs-extra": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-0.0.33.tgz", - "integrity": "sha1-qHGcQXsIDAEtNJeyjiKKwJdF/fI=", - "dev": true, - "requires": { - "@types/node": "10.0.2" + "@types/webpack": "*" } }, "@types/glob": { @@ -625,9 +720,17 @@ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==", "dev": true, "requires": { - "@types/events": "1.2.0", - "@types/minimatch": "3.0.3", - "@types/node": "10.0.2" + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/globalize": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/globalize/-/globalize-0.0.34.tgz", + "integrity": "sha512-FQTLuqZxqf+T1Ao6RzaIP7HcTcNvgDf0YQfK90YGYt1N6KeU5GE0M/hsxdQlpqvuztxjEwEQqIO3paSO/tZ4Pw==", + "requires": { + "@types/cldrjs": "*" } }, "@types/globby": { @@ -636,16 +739,7 @@ "integrity": "sha512-j3XSDNoK4LO5T+ZviQD6PqfEjm07QFEacOTbJR3hnLWuWX0ZMLJl9oRPgj1PyrfGbXhfHFkksC9QZ9HFltJyrw==", "dev": true, "requires": { - "@types/glob": "5.0.35" - } - }, - "@types/grunt": { - "version": "0.4.22", - "resolved": "https://registry.npmjs.org/@types/grunt/-/grunt-0.4.22.tgz", - "integrity": "sha512-fKrWJ+uFq9j3tP2RLm9cY7Z50LhhPnSHQCliCZP5lPAWC7TydnU+BcLR0KQIHe9Gbn1oGfkRIq3u56MNCC1qyw==", - "dev": true, - "requires": { - "@types/node": "10.0.2" + "@types/glob": "*" } }, "@types/gzip-size": { @@ -654,30 +748,18 @@ "integrity": "sha512-ZM1Ou+Y4wxompumKON1ByEbaoEd+pXjBqvoD+ktVQlIEKHBtL2ZT4KfA7rfCjDZptvQjksTwTAZBylTKi0AnnQ==", "dev": true, "requires": { - "@types/node": "10.0.2" + "@types/node": "*" } }, - "@types/handlebars": { - "version": "4.0.37", - "resolved": "https://registry.npmjs.org/@types/handlebars/-/handlebars-4.0.37.tgz", - "integrity": "sha512-c/g99PQsJEFYdK3LT1qgPAZ61fu/oFOaEhov/6ZuUNMi1xQFbAOSThlX8fAQLf+QoGXtyv4S39OjIRXf3HkBtw==", - "dev": true - }, - "@types/highlight.js": { - "version": "9.12.2", - "resolved": "https://registry.npmjs.org/@types/highlight.js/-/highlight.js-9.12.2.tgz", - "integrity": "sha512-y5x0XD/WXDaGSyiTaTcKS4FurULJtSiYbGTeQd0m2LYZGBcZZ/7fM6t5H/DzeUF+kv8y6UfmF6yJABQsHcp9VQ==", - "dev": true - }, "@types/html-minifier": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/@types/html-minifier/-/html-minifier-3.5.2.tgz", "integrity": "sha512-yikK28/KlVyf8g9i/k+TDFlteLuZ6QQTUdVqvKtzEB+8DSLCTjxfh6IK45KnW4rYFI3Y8T4LWpYJMTmfJleWaQ==", "dev": true, "requires": { - "@types/clean-css": "3.4.30", - "@types/relateurl": "0.2.28", - "@types/uglify-js": "3.0.2" + "@types/clean-css": "*", + "@types/relateurl": "*", + "@types/uglify-js": "*" } }, "@types/html-webpack-plugin": { @@ -686,14 +768,14 @@ "integrity": "sha512-ALdxgFyzydiRQzI/7x7zBLh7HsYJVnvjTaCse3KKleiOhxcFlShyJr1kwqwDrfcbtR/L9afABhkr7kC6NTzpGw==", "dev": true, "requires": { - "@types/html-minifier": "3.5.2", - "@types/webpack": "3.8.1" + "@types/html-minifier": "*", + "@types/webpack": "*" } }, "@types/http-errors": { - "version": "1.5.34", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.5.34.tgz", - "integrity": "sha1-1qVvJde5XdBwR2gL+CVjLil5aBU=", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.6.1.tgz", + "integrity": "sha512-s+RHKSGc3r0m3YEE2UXomJYrpQaY9cDmNDLU2XvG1/LAZsQ7y8emYkTLfcw/ByDtcsTyRQKwr76Bj4PkN2hfWg==", "dev": true }, "@types/istanbul-lib-coverage": { @@ -708,13 +790,13 @@ "dev": true }, "@types/istanbul-lib-instrument": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.1.tgz", - "integrity": "sha512-Ll2qAzv7NItqVliZZ8OMAgAvGstddK2995/7X5YPU84lD3CFnqDfP4sTu5Q1GKReh5Ttw3shKR2e3Fe6Xo0C7A==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.2.tgz", + "integrity": "sha512-SWIpdKneXqThfrKIokt9dXSPeslS2NWcxhtr+/a2+N81aLyOMAsVTMmwaKuCoEahcI0FfhY3/79AR6Vilk9i8A==", "requires": { - "@types/babel-types": "7.0.1", - "@types/istanbul-lib-coverage": "1.1.0", - "source-map": "0.6.1" + "@types/babel-types": "*", + "@types/istanbul-lib-coverage": "*", + "source-map": "^0.6.1" } }, "@types/istanbul-lib-report": { @@ -723,7 +805,7 @@ "integrity": "sha512-nW5QuzmMhr7fHPijtaGOemFFI8Ctrxb/dIXgouSlKmWT16RxWlGLEX/nGghIBOReKe9hPFZXoNh338nFQk2xcA==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "1.1.0" + "@types/istanbul-lib-coverage": "*" } }, "@types/istanbul-lib-source-maps": { @@ -732,8 +814,8 @@ "integrity": "sha512-K0IvmTFbI2GjLG0O4AOLPV2hFItE5Bg/TY41IBZIThhLhYthJc3VjpZpM8/sIaIVtnQcX8b2k3muPDvsvhk+Fg==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "1.1.0", - "source-map": "0.6.1" + "@types/istanbul-lib-coverage": "*", + "source-map": "^0.6.1" } }, "@types/istanbul-reports": { @@ -742,8 +824,8 @@ "integrity": "sha512-wrJUtE1+HuaRz0Le7fc5l1nMTermRh6wlEvOdQPilseNScyYgQK8MdgDP2cf/X8+6e1dtsX/zP4W4kH/jyHvFw==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "1.1.0", - "@types/istanbul-lib-report": "1.1.0" + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" } }, "@types/jsonfile": { @@ -752,14 +834,17 @@ "integrity": "sha512-XlVk21nYr7/EnG3q3RUo8OTsSTBGcGo0Ts6//pJzGORwv2SxP2CLsvPdIXBYwF9ajFnW/gIGA2nhAJgGHh3vNQ==", "dev": true, "requires": { - "@types/node": "10.0.2" + "@types/node": "*" } }, "@types/jszip": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/jszip/-/jszip-0.0.33.tgz", - "integrity": "sha512-zAbqAUQmXP9/ryVysJO6XkogdIdtVIYYGmV7BzhKuagaS+75QZ6muJjeSaG5M8rdE5jQ8gyhkZ23r6l4ICmxyQ==", - "dev": true + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/jszip/-/jszip-3.1.4.tgz", + "integrity": "sha512-UaVbz4buRlBEolZYrxqkrGDOypugYlbqGNrUFB4qBaexrLypTH0jyvaF5jolNy5D+5C4kKV1WJ3Yx9cn/JH8oA==", + "dev": true, + "requires": { + "@types/node": "*" + } }, "@types/loader-utils": { "version": "1.1.0", @@ -767,14 +852,14 @@ "integrity": "sha512-VR4oHG6TzhpemxtBDf0BD8xlOiPo2B6zcFEA2Jjmgf1RqSrHLAiteIksV3YvpVn0Pd4HxV1B3LQ6Mf2pGTyZ7g==", "dev": true, "requires": { - "@types/node": "10.0.2", - "@types/webpack": "3.8.1" + "@types/node": "*", + "@types/webpack": "*" } }, "@types/lodash": { - "version": "4.14.108", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.108.tgz", - "integrity": "sha512-WD2vUOKfBBVHxWUV9iMR9RMfpuf8HquxWeAq2yqGVL7Nc4JW2+sQama0pREMqzNI3Tutj0PyxYUJwuoxxvX+xA==", + "version": "4.14.112", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.112.tgz", + "integrity": "sha512-jDD7sendv3V7iwyRXSlECOR8HCtMN2faVA9ngLdHHihSVIwY7nbfsKl2kA6fimUDU1i5l/zgpG3aevwWnN3zCQ==", "dev": true }, "@types/log-symbols": { @@ -789,15 +874,9 @@ "integrity": "sha512-UMxf+fJ9QS1uyWX+KJCBSoONbNd+Jnof5kMweR+9vckSIYAQivF5AKCaO2OL/TQvRi8dp8YjAbt7b27XM7RFxw==", "dev": true, "requires": { - "@types/node": "10.0.2" + "@types/node": "*" } }, - "@types/marked": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-0.0.28.tgz", - "integrity": "sha1-RLp1Tp+lFDJYPo6zCnxN0km1L6o=", - "dev": true - }, "@types/mime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.0.tgz", @@ -823,9 +902,10 @@ "dev": true }, "@types/node": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.2.tgz", - "integrity": "sha512-DPbG0qQ5kdvXBK0jGdv1yd8vGN7hwH8sB2Q1z1kGaxtCnXkSxYJ009VccGlcgknYoLeMTYu4TTzOditDJMdP2Q==" + "version": "9.6.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.23.tgz", + "integrity": "sha512-d2SJJpwkiPudEQ3+9ysANN2Nvz4QJKUPoe/WL5zyQzI0RaEeZWH5K5xjvUIGszTItHQpFPdH+u51f6G/LkS8Cg==", + "dev": true }, "@types/optimize-css-assets-webpack-plugin": { "version": "1.3.1", @@ -833,7 +913,7 @@ "integrity": "sha1-+T20ppRKui08YjCpNmhKyWMcmU8=", "dev": true, "requires": { - "@types/webpack": "3.8.1" + "@types/webpack": "*" } }, "@types/ora": { @@ -842,7 +922,7 @@ "integrity": "sha512-DrHOHEdYzRjL65n2v+NwTdhC8tACaiCDnUU1wAAbibfZOaRj3KjUb3unnAAWFZuny43qPAvB6ka+Iyj2R2XPxw==", "dev": true, "requires": { - "@types/node": "10.0.2" + "@types/node": "*" } }, "@types/platform": { @@ -851,6 +931,12 @@ "integrity": "sha512-XI6JKLFNBmkADRd2FtUYtEuq5LDKTNXwUIodV3ZfTNkA+g4yo+rXXXdZL3fTE24S92BjpiEVaL3f64Fxm2JOgg==", "dev": true }, + "@types/range-parser": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.2.tgz", + "integrity": "sha512-HtKGu+qG1NPvYe1z7ezLsyIaXYyi8SoAVqWDZgDQ8dLrsZvSzUNCwZyfX33uhWxL/SU0ZDQZ3nwZ0nimt507Kw==", + "dev": true + }, "@types/relateurl": { "version": "0.2.28", "resolved": "https://registry.npmjs.org/@types/relateurl/-/relateurl-0.2.28.tgz", @@ -858,12 +944,12 @@ "dev": true }, "@types/resolve": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.4.tgz", - "integrity": "sha1-m1htZalH3qiMS8JNoLkF/pUgoNU=", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.7.tgz", + "integrity": "sha512-GPewdjkb0Q76o459qgp6pBLzJj/bD3oveS2kfLhIkZ9U3t3AFKtl5DlFB6lGTw0iZmcmxoGC8lpLW3NNJKrN9A==", "dev": true, "requires": { - "@types/node": "10.0.2" + "@types/node": "*" } }, "@types/rimraf": { @@ -872,8 +958,8 @@ "integrity": "sha512-Hm/bnWq0TCy7jmjeN5bKYij9vw5GrDFWME4IuxV08278NtU/VdGbzsBohcCUJ7+QMqmUq5hpRKB39HeQWJjztQ==", "dev": true, "requires": { - "@types/glob": "5.0.35", - "@types/node": "10.0.2" + "@types/glob": "*", + "@types/node": "*" } }, "@types/serve-static": { @@ -882,8 +968,8 @@ "integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==", "dev": true, "requires": { - "@types/express-serve-static-core": "4.11.1", - "@types/mime": "2.0.0" + "@types/express-serve-static-core": "*", + "@types/mime": "*" } }, "@types/shell-quote": { @@ -892,19 +978,10 @@ "integrity": "sha512-BFonQx849sYB2YOJZBUEfbWdaJcqRb6+ASvgUBtcmg2JRTjBaV2Wgn0SD0gWNIZ+rd7KPysPCjLUOUXnBDUlBg==", "dev": true }, - "@types/shelljs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.3.33.tgz", - "integrity": "sha1-32E73biCJe0JzlyDX2INyq8VXms=", - "dev": true, - "requires": { - "@types/node": "10.0.2" - } - }, "@types/sinon": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-4.0.0.tgz", - "integrity": "sha512-cuK4xM8Lg2wd8cxshcQa8RG4IK/xfyB6TNE6tNVvkrShR4xdrYgsV04q6Dp6v1Lp6biEFdzD8k8zg/ujQeiw+A==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-4.3.3.tgz", + "integrity": "sha512-Tt7w/ylBS/OEAlSCwzB0Db1KbxnkycP/1UkQpbvKFYoUuRn4uYsC3xh5TRPrOjTy0i8TIkSz1JdNL4GPVdf3KQ==", "dev": true }, "@types/source-map": { @@ -912,13 +989,13 @@ "resolved": "https://registry.npmjs.org/@types/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LrnsgZIfJaysFkv9rRJp4/uAyqw87oVed3s1hhF83nwbo9c7MG9g5DqR0seHP+lkX4ldmMrVolPjQSe2ZfD0yA==", "requires": { - "source-map": "0.6.1" + "source-map": "*" } }, "@types/statuses": { - "version": "1.2.28", - "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-1.2.28.tgz", - "integrity": "sha1-zF8Z0haUFtVWzcoFtZsp5F+kl+I=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-1.3.0.tgz", + "integrity": "sha512-E0QjLIX1q+ThpQ7HLh5SjMtUtPl0tQjxoLMPwJtFDFtH7C0qdXmCgNcBplZ9m24+sOoQBpc0PT/aMW4jlm3K6g==", "dev": true }, "@types/strip-ansi": { @@ -933,22 +1010,27 @@ "integrity": "sha512-dEoVvo/I9QFomyhY+4Q6Qk+I+dhG59TYceZgC6Q0mCifVPErx6Y83PNTKGDS5e9h9Eti6q0S2mm16BU6iQK+3w==" }, "@types/uglify-js": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.2.tgz", - "integrity": "sha512-o8hU2+4xsyGC27Vujoklvxl88Ew5zmJuTBYMX1Uro2rYUt4HEFJKL6fuq8aGykvS+ssIsIzerWWP2DRxonownQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.3.tgz", + "integrity": "sha512-MAT0BW2ruO0LhQKjvlipLGCF/Yx0y/cj+tT67tK3QIQDrM2+9R78HgJ54VlrE8AbfjYJJBCQCEPM5ZblPVTuww==", "requires": { - "source-map": "0.6.1" + "source-map": "^0.6.1" } }, + "@types/web-animations-js": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@types/web-animations-js/-/web-animations-js-2.2.5.tgz", + "integrity": "sha512-3kjO6yvLt1e673wtcKEz0lgLKqPkBiuwxQj0DQ1jj+48HB03emIlTQYcqKAvB9UwOXq09QrWy/Dm6ZU8xMZVTw==" + }, "@types/webpack": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-3.8.1.tgz", "integrity": "sha512-121nghW8XJ0tFNGuQh5k+VoSMLm71c7bEmNI0MMNDtKiNUcij3nWwypQccfEQrGcmJCAMkoC5vZLtdT4fbbCzw==", "dev": true, "requires": { - "@types/node": "10.0.2", - "@types/tapable": "0.2.5", - "@types/uglify-js": "3.0.2" + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*" } }, "@types/webpack-chunk-hash": { @@ -957,24 +1039,30 @@ "integrity": "sha512-pOc/1z85qE+8Mz4bHmfQb/jKSdq1VSXEo3a3Bhb3yyYUu9jXh0pRRK003L10cnsnOTcgka0o2lj5S0rifnapCw==", "dev": true, "requires": { - "@types/webpack": "3.8.1" + "@types/webpack": "*" } }, "@types/ws": { - "version": "0.0.42", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-0.0.42.tgz", - "integrity": "sha512-+30f9gcx24GZRD9EqqiQM+I5pRf/MJiJoEqp2X62QRwfEjdqyn9mPmjxZAEXBUVunWotE5qkadIPqf2MMcDYNw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-4.0.2.tgz", + "integrity": "sha512-tlDVFHCcJdNqYgjGNDPDCo4tNqhFMymIAdJCcykFbdhYr4X6vD7IlMxY0t3/k6Pfup68YNkMTpRfLKTRuKDmnQ==", "dev": true, "requires": { - "@types/node": "10.0.2" + "@types/events": "*", + "@types/node": "*" } }, "@types/yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha512-Upj9YsBZRgjEVPvsaeGru48d2JiyzBNZkmkebHyoaQ+UM9wqj/rp5mkilRjSq/Ga45yfd/zwrNuML9f2gGfVpw==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-10.0.2.tgz", + "integrity": "sha512-VbsIazac1gy20qTjEZVgDUhs8uuVmGbFkSGcdHpcMoXSC4+0vn/PRHz9YBqpgxKwUi8qoxf3eHff07w7aKNBOg==", "dev": true }, + "@webcomponents/webcomponentsjs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-1.1.0.tgz", + "integrity": "sha512-7toNyVlrl7vJnY3PU0eXIK1KWq8phfnEe1IwOdCMxkIl/BfUkUB2aaVs45R0LSx1qxHRnkqj0vlGtskUvKkNkA==" + }, "abab": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", @@ -983,36 +1071,28 @@ "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "accepts": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "requires": { - "mime-types": "2.1.18", + "mime-types": "~2.1.18", "negotiator": "0.6.1" } }, "acorn": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", - "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", + "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==" }, "acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", "requires": { - "acorn": "4.0.13" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" - } + "acorn": "^5.0.0" } }, "acorn-globals": { @@ -1020,36 +1100,23 @@ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz", "integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==", "requires": { - "acorn": "5.5.3" + "acorn": "^5.0.0" } }, - "agent-base": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", - "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", - "dev": true, - "requires": { - "extend": "3.0.1", - "semver": "5.0.3" - }, - "dependencies": { - "semver": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", - "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=", - "dev": true - } - } + "adm-zip": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz", + "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==" }, "ajv": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "ajv-keywords": { @@ -1062,9 +1129,9 @@ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" } }, "alphanum-sort": { @@ -1082,16 +1149,7 @@ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-1.1.0.tgz", "integrity": "sha1-LwwWWIKXOa3V67FeawxuNCPwFro=", "requires": { - "string-width": "1.0.2" - } - }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" + "string-width": "^1.0.1" } }, "ansi-escapes": { @@ -1104,15 +1162,6 @@ "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -1123,37 +1172,25 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, "any-observable": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.2.0.tgz", "integrity": "sha1-xnhwBYADV5AJCD9UrAq6+1wz0kI=", "dev": true }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true - }, "anymatch": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" } }, "app-root-path": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.0.1.tgz", - "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.1.0.tgz", + "integrity": "sha1-mL9lmTJ+zqGZMJhm6BQDaP0uZGo=", "dev": true }, "append-transform": { @@ -1162,7 +1199,7 @@ "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", "dev": true, "requires": { - "default-require-extensions": "1.0.0" + "default-require-extensions": "^1.0.0" } }, "aproba": { @@ -1175,15 +1212,21 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, + "argv": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", + "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", + "dev": true + }, "arr-diff": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "arr-flatten": { @@ -1229,18 +1272,12 @@ "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", "dev": true }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { @@ -1268,9 +1305,9 @@ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "assert": { @@ -1279,6 +1316,21 @@ "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", "requires": { "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } } }, "assert-plus": { @@ -1303,11 +1355,11 @@ "integrity": "sha1-sTYwDWcCZiWuFTJpgsqZGOXbc8k=" }, "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", "requires": { - "lodash": "4.17.10" + "lodash": "^4.17.10" } }, "async-each": { @@ -1326,21 +1378,21 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "atob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/atob/-/atob-1.1.3.tgz", - "integrity": "sha1-lfE2KbEsOlGl0hWr3OKqnzL4B3M=" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=" }, "autoprefixer": { "version": "6.7.7", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000833", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "browserslist": "^1.7.6", + "caniuse-db": "^1.0.30000634", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^5.2.16", + "postcss-value-parser": "^3.2.3" }, "dependencies": { "chalk": { @@ -1348,11 +1400,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -1372,10 +1424,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -1388,7 +1440,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -1396,7 +1448,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -1416,9 +1468,9 @@ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" }, "dependencies": { "chalk": { @@ -1426,11 +1478,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "strip-ansi": { @@ -1438,7 +1490,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } @@ -1449,14 +1501,14 @@ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.10", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" }, "dependencies": { "detect-indent": { @@ -1465,7 +1517,7 @@ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "jsesc": { @@ -1488,7 +1540,7 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-runtime": { @@ -1496,8 +1548,8 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "2.5.5", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "babel-template": { @@ -1506,11 +1558,11 @@ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.10" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" } }, "babel-traverse": { @@ -1519,15 +1571,15 @@ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.4", - "lodash": "4.17.10" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" } }, "babel-types": { @@ -1536,10 +1588,10 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "1.0.3" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, "babylon": { @@ -1558,13 +1610,13 @@ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { "define-property": { @@ -1572,7 +1624,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -1580,7 +1632,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -1588,7 +1640,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -1596,9 +1648,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "isobject": { @@ -1619,12 +1671,12 @@ "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" }, "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "benchmark": { @@ -1633,8 +1685,8 @@ "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=", "dev": true, "requires": { - "lodash": "4.17.10", - "platform": "1.3.5" + "lodash": "^4.17.4", + "platform": "^1.3.3" } }, "big.js": { @@ -1648,38 +1700,13 @@ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" }, "bl": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", - "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "dev": true, "requires": { - "readable-stream": "1.0.34" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" } }, "bluebird": { @@ -1698,15 +1725,22 @@ "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", "requires": { "bytes": "3.0.0", - "content-type": "1.0.4", + "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "1.1.2", - "http-errors": "1.6.3", + "depd": "~1.1.1", + "http-errors": "~1.6.2", "iconv-lite": "0.4.19", - "on-finished": "2.3.0", + "on-finished": "~2.3.0", "qs": "6.5.1", "raw-body": "2.3.2", - "type-is": "1.6.16" + "type-is": "~1.6.15" + }, + "dependencies": { + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + } } }, "boolbase": { @@ -1719,7 +1753,7 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } }, "boxen": { @@ -1727,14 +1761,14 @@ "resolved": "https://registry.npmjs.org/boxen/-/boxen-0.5.1.tgz", "integrity": "sha1-W3PYhA6388ihVcv2ntPtaNRyABQ=", "requires": { - "camelcase": "2.1.1", - "chalk": "1.1.3", - "cli-boxes": "1.0.0", - "filled-array": "1.1.0", - "object-assign": "4.1.1", - "repeating": "2.0.1", - "string-width": "1.0.2", - "widest-line": "1.0.0" + "camelcase": "^2.1.0", + "chalk": "^1.1.1", + "cli-boxes": "^1.0.0", + "filled-array": "^1.0.0", + "object-assign": "^4.0.1", + "repeating": "^2.0.0", + "string-width": "^1.0.1", + "widest-line": "^1.0.0" }, "dependencies": { "chalk": { @@ -1742,11 +1776,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "strip-ansi": { @@ -1754,7 +1788,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } @@ -1764,7 +1798,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -1773,9 +1807,9 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "brorand": { @@ -1793,12 +1827,12 @@ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "browserify-cipher": { @@ -1806,19 +1840,20 @@ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "requires": { - "browserify-aes": "1.2.0", - "browserify-des": "1.0.1", - "evp_bytestokey": "1.0.3" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, "browserify-des": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", - "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "browserify-rsa": { @@ -1826,8 +1861,8 @@ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" } }, "browserify-sign": { @@ -1835,13 +1870,13 @@ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "elliptic": "6.4.0", - "inherits": "2.0.3", - "parse-asn1": "5.1.1" + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" } }, "browserify-zlib": { @@ -1849,7 +1884,7 @@ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "requires": { - "pako": "1.0.6" + "pako": "~1.0.5" } }, "browserslist": { @@ -1857,8 +1892,8 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { - "caniuse-db": "1.0.30000833", - "electron-to-chromium": "1.3.45" + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" } }, "buffer": { @@ -1866,25 +1901,25 @@ "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "requires": { - "base64-js": "1.3.0", - "ieee754": "1.1.11", - "isarray": "1.0.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, "buffer-alloc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.1.0.tgz", - "integrity": "sha1-BVFNM78WVtNUDGhPZbEgLpDsowM=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "dev": true, "requires": { - "buffer-alloc-unsafe": "0.1.1", - "buffer-fill": "0.1.1" + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" } }, "buffer-alloc-unsafe": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-0.1.1.tgz", - "integrity": "sha1-/+H2dVHdBVc33iUzN7/oU9+rGmo=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", "dev": true }, "buffer-crc32": { @@ -1894,15 +1929,15 @@ "dev": true }, "buffer-fill": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-0.1.1.tgz", - "integrity": "sha512-YgBMBzdRLEfgxJIGu2wrvI2E03tMCFU1p7d1KhB4BOoMN0VxmTFjSyN5JtKt9z8Z9JajMHruI6SE25W96wNv7Q==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", "dev": true }, "buffer-from": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", - "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==" }, "buffer-xor": { "version": "1.0.3", @@ -1929,19 +1964,19 @@ "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", "requires": { - "bluebird": "3.5.1", - "chownr": "1.0.1", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "lru-cache": "4.1.2", - "mississippi": "2.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.6.2", - "ssri": "5.3.0", - "unique-filename": "1.1.0", - "y18n": "4.0.0" + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" }, "dependencies": { "bluebird": { @@ -1954,12 +1989,20 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" } }, "y18n": { @@ -1974,15 +2017,15 @@ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" }, "dependencies": { "isobject": { @@ -1992,13 +2035,22 @@ } } }, + "caller-id": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-id/-/caller-id-0.1.0.tgz", + "integrity": "sha1-Wb2sCJPRLDhxQIJ5Ix+XRYNk8Hs=", + "dev": true, + "requires": { + "stack-trace": "~0.0.7" + } + }, "camel-case": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", "requires": { - "no-case": "2.3.2", - "upper-case": "1.1.3" + "no-case": "^2.2.0", + "upper-case": "^1.1.1" } }, "camelcase": { @@ -2011,8 +2063,8 @@ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" } }, "caniuse-api": { @@ -2020,21 +2072,21 @@ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000833", - "lodash.memoize": "4.1.2", - "lodash.uniq": "4.5.0" + "browserslist": "^1.3.6", + "caniuse-db": "^1.0.30000529", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" } }, "caniuse-db": { - "version": "1.0.30000833", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000833.tgz", - "integrity": "sha1-K9e+cqQBZY0svLj012AN7r6xxnY=" + "version": "1.0.30000869", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000869.tgz", + "integrity": "sha1-w9pZ+o2UVt+Iokuyku3g43mHmMs=" }, "caniuse-lite": { - "version": "1.0.30000833", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000833.tgz", - "integrity": "sha512-tKNuKu4WLImh4NxoTgntxFpDrRiA0Q6Q1NycNhuMST0Kx+Pt8YnRDW6V8xsyH6AtO2CpAoibatEk5eaEhP3O1g==" + "version": "1.0.30000865", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz", + "integrity": "sha512-vs79o1mOSKRGv/1pSkp4EXgl4ZviWeYReXw60XfacPU64uQWZwJT6vZNmxRF9O+6zu71sJwMxLK5JXxbzuVrLw==" }, "capture-stack-trace": { "version": "1.0.0", @@ -2051,8 +2103,8 @@ "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" } }, "chai": { @@ -2061,22 +2113,22 @@ "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", "dev": true, "requires": { - "assertion-error": "1.1.0", - "check-error": "1.0.2", - "deep-eql": "3.0.1", - "get-func-name": "2.0.0", - "pathval": "1.1.0", - "type-detect": "4.0.8" + "assertion-error": "^1.0.1", + "check-error": "^1.0.1", + "deep-eql": "^3.0.0", + "get-func-name": "^2.0.0", + "pathval": "^1.0.0", + "type-detect": "^4.0.0" } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { "ansi-styles": { @@ -2084,15 +2136,15 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "requires": { - "has-flag": "2.0.0" + "has-flag": "^3.0.0" } } } @@ -2109,7 +2161,7 @@ "integrity": "sha1-it02cVOm2aWBMxBSxAkJkdqZXjU=", "dev": true, "requires": { - "inherits": "2.0.3" + "inherits": "^2.0.1" } }, "check-error": { @@ -2123,15 +2175,15 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.2.3", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" }, "dependencies": { "is-extglob": { @@ -2144,7 +2196,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } } } @@ -2165,8 +2217,8 @@ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "clap": { @@ -2174,7 +2226,7 @@ "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", "requires": { - "chalk": "1.1.3" + "chalk": "^1.1.3" }, "dependencies": { "chalk": { @@ -2182,11 +2234,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "strip-ansi": { @@ -2194,7 +2246,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } @@ -2204,10 +2256,10 @@ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { "define-property": { @@ -2215,7 +2267,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "isobject": { @@ -2225,12 +2277,40 @@ } } }, + "cldr-data": { + "version": "32.0.1", + "resolved": "https://registry.npmjs.org/cldr-data/-/cldr-data-32.0.1.tgz", + "integrity": "sha1-eWCDKDbgpkp0voi1XuEF8pgKDyo=", + "requires": { + "cldr-data-downloader": "0.3.x", + "glob": "5.x.x" + } + }, + "cldr-data-downloader": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/cldr-data-downloader/-/cldr-data-downloader-0.3.4.tgz", + "integrity": "sha1-SiWXAiHvg5vh7LWKFnEdo/Pk1sA=", + "requires": { + "adm-zip": "0.4.11", + "mkdirp": "0.5.0", + "nopt": "3.0.x", + "progress": "1.1.8", + "q": "1.0.1", + "request": "~2.83.0", + "request-progress": "0.3.1" + } + }, + "cldrjs": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/cldrjs/-/cldrjs-0.4.8.tgz", + "integrity": "sha1-O5lMRk0qMrWsp8XeF6YKh+RdxPk=" + }, "clean-css": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=", "requires": { - "source-map": "0.5.7" + "source-map": "0.5.x" }, "dependencies": { "source-map": { @@ -2245,7 +2325,7 @@ "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-0.1.17.tgz", "integrity": "sha512-Bts/V725v8Ijosp4K1cqppQXgXcrohxoMsg0CV2xL4y/vua1G5pAfHEW/eJIiKF+GNNG72mdjbipxMRFEms7yg==", "requires": { - "rimraf": "2.6.2" + "rimraf": "^2.6.1" } }, "cli-boxes": { @@ -2258,8 +2338,8 @@ "resolved": "https://registry.npmjs.org/cli-columns/-/cli-columns-3.1.2.tgz", "integrity": "sha1-ZzLZcpee/CrkRKHwjgj6E5yWoY4=", "requires": { - "string-width": "2.1.1", - "strip-ansi": "3.0.1" + "string-width": "^2.0.0", + "strip-ansi": "^3.0.1" }, "dependencies": { "ansi-regex": { @@ -2277,8 +2357,8 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { "strip-ansi": { @@ -2286,7 +2366,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -2296,7 +2376,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" }, "dependencies": { "ansi-regex": { @@ -2313,7 +2393,7 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "requires": { - "restore-cursor": "2.0.0" + "restore-cursor": "^2.0.0" } }, "cli-spinners": { @@ -2328,7 +2408,7 @@ "dev": true, "requires": { "slice-ansi": "0.0.4", - "string-width": "1.0.2" + "string-width": "^1.0.1" }, "dependencies": { "slice-ansi": { @@ -2350,9 +2430,9 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" }, "dependencies": { "strip-ansi": { @@ -2360,7 +2440,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } @@ -2380,7 +2460,14 @@ "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", "requires": { - "q": "1.5.1" + "q": "^1.1.2" + }, + "dependencies": { + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + } } }, "code-point-at": { @@ -2388,215 +2475,55 @@ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, - "codecov.io": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/codecov.io/-/codecov.io-0.1.6.tgz", - "integrity": "sha1-Wd/QLaH/McL7K5Uq2K0W/TeBtyg=", + "codecov": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.0.4.tgz", + "integrity": "sha512-KJyzHdg9B8U9LxXa7hS6jnEW5b1cNckLYc2YpnJ1nEFiOW+/iSzDHp+5MYEIQd9fN3/tC6WmGZmYiwxzkuGp/A==", "dev": true, "requires": { - "request": "2.42.0", - "urlgrey": "0.4.0" + "argv": "^0.0.2", + "ignore-walk": "^3.0.1", + "request": "^2.87.0", + "urlgrey": "^0.4.4" }, "dependencies": { - "asn1": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", - "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=", - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", - "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=", - "dev": true, - "optional": true - }, - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", - "integrity": "sha1-xXED96F/wDfwLXwuZLYC6iI/fWM=", - "dev": true, - "optional": true - }, - "boom": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", - "integrity": "sha1-emNune1O/O+xnO9JR6PGffrukRs=", - "dev": true, - "requires": { - "hoek": "0.9.1" - } - }, - "caseless": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.6.0.tgz", - "integrity": "sha1-gWfBq4OX+1u5X5bSjlqBxQ8kesQ=", - "dev": true - }, - "combined-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", - "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", - "dev": true, - "optional": true, - "requires": { - "delayed-stream": "0.0.5" - } - }, - "cryptiles": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", - "integrity": "sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw=", - "dev": true, - "optional": true, - "requires": { - "boom": "0.4.2" - } - }, - "delayed-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", - "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=", - "dev": true, - "optional": true - }, - "forever-agent": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", - "integrity": "sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA=", - "dev": true - }, - "form-data": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", - "integrity": "sha1-kavXiKupcCsaq/qLwBAxoqyeOxI=", - "dev": true, - "optional": true, - "requires": { - "async": "0.9.2", - "combined-stream": "0.0.7", - "mime": "1.2.11" - } - }, - "hawk": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz", - "integrity": "sha1-h81JH5tG5OKurKM1QWdmiF0tHtk=", - "dev": true, - "optional": true, - "requires": { - "boom": "0.4.2", - "cryptiles": "0.2.2", - "hoek": "0.9.1", - "sntp": "0.2.4" - } - }, - "hoek": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", - "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=", - "dev": true - }, - "http-signature": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", - "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=", - "dev": true, - "optional": true, - "requires": { - "asn1": "0.1.11", - "assert-plus": "0.1.5", - "ctype": "0.5.3" - } - }, - "mime": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=", - "dev": true, - "optional": true - }, - "mime-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", - "integrity": "sha1-mVrhOSq4r/y/yyZB3QVOlDwNXc4=", - "dev": true - }, - "oauth-sign": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.4.0.tgz", - "integrity": "sha1-8ilW8x6nFRqCHl8vsywRPK2Ln2k=", - "dev": true, - "optional": true - }, - "qs": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-1.2.2.tgz", - "integrity": "sha1-GbV/8k3CqZzh+L32r82ln472H4g=", - "dev": true - }, "request": { - "version": "2.42.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.42.0.tgz", - "integrity": "sha1-VyvQFIk4VkBArHqxSLlkI6BjMEo=", - "dev": true, - "requires": { - "aws-sign2": "0.5.0", - "bl": "0.9.5", - "caseless": "0.6.0", - "forever-agent": "0.5.2", - "form-data": "0.1.4", - "hawk": "1.1.1", - "http-signature": "0.10.1", - "json-stringify-safe": "5.0.1", - "mime-types": "1.0.2", - "node-uuid": "1.4.8", - "oauth-sign": "0.4.0", - "qs": "1.2.2", - "stringstream": "0.0.5", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.4.3" - } - }, - "sntp": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", - "integrity": "sha1-+4hfGLDzqtGJ+CSGJTa87ux1CQA=", - "dev": true, - "optional": true, - "requires": { - "hoek": "0.9.1" + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" } - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true } } }, - "coffee-script": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.10.0.tgz", - "integrity": "sha1-EpOLz5vhlI+gBvkuDEyegXBRCMA=", - "dev": true - }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, "color": { @@ -2604,30 +2531,30 @@ "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", "requires": { - "clone": "1.0.4", - "color-convert": "1.9.1", - "color-string": "0.3.0" + "clone": "^1.0.2", + "color-convert": "^1.3.0", + "color-string": "^0.3.0" } }, "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", + "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", "requires": { - "color-name": "1.1.3" + "color-name": "1.1.1" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=" }, "color-string": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", "requires": { - "color-name": "1.1.3" + "color-name": "^1.0.0" } }, "colormin": { @@ -2635,9 +2562,9 @@ "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", "requires": { - "color": "0.11.4", + "color": "^0.11.0", "css-color-names": "0.0.4", - "has": "1.0.1" + "has": "^1.0.1" } }, "colors": { @@ -2650,13 +2577,24 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, + "command-exists": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.7.tgz", + "integrity": "sha512-doWDvhXCcW5LK0cIUWrOQ8oMFXJv3lEQCkJpGVjM8v9SV0uhqYXB943538tEA2CiaWqSyuYUGAm5ezDwEx9xlw==", + "dev": true + }, "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz", + "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==" + }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" }, "commondir": { "version": "1.0.1", @@ -2678,10 +2616,10 @@ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "requires": { - "buffer-from": "1.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "configstore": { @@ -2689,15 +2627,22 @@ "resolved": "https://registry.npmjs.org/configstore/-/configstore-2.1.0.tgz", "integrity": "sha1-c3o6cDbpiGECqmCZ5HuzOrGroaE=", "requires": { - "dot-prop": "3.0.0", - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1", - "object-assign": "4.1.1", - "os-tmpdir": "1.0.2", - "osenv": "0.1.5", - "uuid": "2.0.3", - "write-file-atomic": "1.3.4", - "xdg-basedir": "2.0.0" + "dot-prop": "^3.0.0", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "object-assign": "^4.0.1", + "os-tmpdir": "^1.0.0", + "osenv": "^0.1.0", + "uuid": "^2.0.1", + "write-file-atomic": "^1.1.2", + "xdg-basedir": "^2.0.0" + }, + "dependencies": { + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" + } } }, "console-browserify": { @@ -2705,7 +2650,7 @@ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "requires": { - "date-now": "0.1.4" + "date-now": "^0.1.4" } }, "constants-browserify": { @@ -2743,12 +2688,22 @@ "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "requires": { - "aproba": "1.2.0", - "fs-write-stream-atomic": "1.0.10", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + } } }, "copy-descriptor": { @@ -2761,33 +2716,45 @@ "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.0.1.tgz", "integrity": "sha1-lyjjg7lDFgUNDHRjlY8rhcCqggA=", "requires": { - "bluebird": "2.11.0", - "fs-extra": "0.26.7", - "glob": "6.0.4", - "is-glob": "3.1.0", - "loader-utils": "0.2.17", - "lodash": "4.17.10", - "minimatch": "3.0.4", - "node-dir": "0.1.17" + "bluebird": "^2.10.2", + "fs-extra": "^0.26.4", + "glob": "^6.0.4", + "is-glob": "^3.1.0", + "loader-utils": "^0.2.15", + "lodash": "^4.3.0", + "minimatch": "^3.0.0", + "node-dir": "^0.1.10" }, "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "loader-utils": { "version": "0.2.17", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" } } } }, "core-js": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", - "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" }, "core-util-is": { "version": "1.0.2", @@ -2799,22 +2766,73 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", "requires": { - "is-directory": "0.3.1", - "js-yaml": "3.7.0", - "minimist": "1.2.0", - "object-assign": "4.1.1", - "os-homedir": "1.0.2", - "parse-json": "2.2.0", - "require-from-string": "1.2.1" + "is-directory": "^0.3.1", + "js-yaml": "^3.4.3", + "minimist": "^1.2.0", + "object-assign": "^4.1.0", + "os-homedir": "^1.0.1", + "parse-json": "^2.2.0", + "require-from-string": "^1.1.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "cpx": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/cpx/-/cpx-1.5.0.tgz", + "integrity": "sha1-GFvgGFEdhycN7czCkxceN2VauI8=", + "dev": true, + "requires": { + "babel-runtime": "^6.9.2", + "chokidar": "^1.6.0", + "duplexer": "^0.1.1", + "glob": "^7.0.5", + "glob2base": "^0.0.12", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "resolve": "^1.1.7", + "safe-buffer": "^5.0.1", + "shell-quote": "^1.6.1", + "subarg": "^1.0.0" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + } } }, "create-ecdh": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.1.tgz", - "integrity": "sha512-iZvCCg8XqHQZ1ioNBTzXS/cQSkqkqcPs8xSX4upNB+DAk9Ht3uzQf2J32uAHNCne8LDmKr29AgZrEs4oIrwLuQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" } }, "create-error-class": { @@ -2822,7 +2840,7 @@ "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "requires": { - "capture-stack-trace": "1.0.0" + "capture-stack-trace": "^1.0.0" } }, "create-hash": { @@ -2830,11 +2848,11 @@ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "md5.js": "1.3.4", - "ripemd160": "2.0.2", - "sha.js": "2.4.11" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, "create-hmac": { @@ -2842,12 +2860,12 @@ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "inherits": "2.0.3", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "cross-spawn": { @@ -2855,19 +2873,9 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "requires": { - "lru-cache": "4.1.2", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, - "cross-spawn-async": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz", - "integrity": "sha1-hF/wwINKPe2dFg2sptOQkGuyiMw=", - "dev": true, - "requires": { - "lru-cache": "4.1.2", - "which": "1.3.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "cryptiles": { @@ -2875,7 +2883,7 @@ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", "requires": { - "boom": "5.2.0" + "boom": "5.x.x" }, "dependencies": { "boom": { @@ -2883,7 +2891,7 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } } } @@ -2893,17 +2901,17 @@ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "requires": { - "browserify-cipher": "1.0.1", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "diffie-hellman": "5.0.3", - "inherits": "2.0.3", - "pbkdf2": "3.0.16", - "public-encrypt": "4.0.2", - "randombytes": "2.0.6", - "randomfill": "1.0.4" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, "crypto-random-string": { @@ -2912,41 +2920,15 @@ "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", "dev": true }, - "csproj2ts": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/csproj2ts/-/csproj2ts-0.0.7.tgz", - "integrity": "sha1-drEJRoMlbponCf1cY+7ya/R6FEI=", - "dev": true, - "requires": { - "es6-promise": "2.3.0", - "lodash": "3.10.1", - "semver": "5.5.0", - "xml2js": "0.4.19" - }, - "dependencies": { - "es6-promise": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz", - "integrity": "sha1-lu258v2wGZWCKyY92KratnSBgbw=", - "dev": true - }, - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true - } - } - }, "css": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.1.tgz", - "integrity": "sha1-c6TIHehdtmTU7mdPfUcIXjstVdw=", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.3.tgz", + "integrity": "sha512-0W171WccAjQGGTKLhw4m2nnl0zPHUlTO/I8td4XzJgIB8Hg3ZZx71qT4G4eX8OVsSiaAKiUMy73E3nsbPlg2DQ==", "requires": { - "inherits": "2.0.3", - "source-map": "0.1.43", - "source-map-resolve": "0.3.1", - "urix": "0.1.0" + "inherits": "^2.0.1", + "source-map": "^0.1.38", + "source-map-resolve": "^0.5.1", + "urix": "^0.1.0" }, "dependencies": { "source-map": { @@ -2954,7 +2936,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } @@ -2965,9 +2947,9 @@ "integrity": "sha1-jtJMLAIFBzM5+voAS8jBQfzLKC4=", "requires": { "balanced-match": "0.1.0", - "color": "0.11.4", - "debug": "3.1.0", - "rgb": "0.1.0" + "color": "^0.11.0", + "debug": "^3.1.0", + "rgb": "~0.1.0" }, "dependencies": { "balanced-match": { @@ -2995,20 +2977,20 @@ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.7.tgz", "integrity": "sha512-GxMpax8a/VgcfRrVy0gXD6yLd5ePYbXX/5zGgTVYp4wXtJklS8Z2VaUArJgc//f6/Dzil7BaJObdSv8eKKCPgg==", "requires": { - "babel-code-frame": "6.26.0", - "css-selector-tokenizer": "0.7.0", - "cssnano": "3.10.0", - "icss-utils": "2.1.0", - "loader-utils": "1.1.0", - "lodash.camelcase": "4.3.0", - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-modules-extract-imports": "1.1.0", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0", - "postcss-value-parser": "3.3.0", - "source-list-map": "2.0.0" + "babel-code-frame": "^6.11.0", + "css-selector-tokenizer": "^0.7.0", + "cssnano": ">=2.6.1 <4", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash.camelcase": "^4.3.0", + "object-assign": "^4.0.1", + "postcss": "^5.0.6", + "postcss-modules-extract-imports": "^1.0.0", + "postcss-modules-local-by-default": "^1.0.1", + "postcss-modules-scope": "^1.0.0", + "postcss-modules-values": "^1.1.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" }, "dependencies": { "chalk": { @@ -3016,11 +2998,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -3040,10 +3022,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -3056,7 +3038,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -3064,7 +3046,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -3087,10 +3069,22 @@ "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", "requires": { - "boolbase": "1.0.0", - "css-what": "2.1.0", + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-select-umd": { + "version": "1.3.0-rc0", + "resolved": "https://registry.npmjs.org/css-select-umd/-/css-select-umd-1.3.0-rc0.tgz", + "integrity": "sha512-ggouX0yWeql8nZobF5jscijHx/WIDkEuy7Iq6fU2X6ogQyIPpJ/aGn4ZYM0jpfI0LbvDaQustkj0az/hN1BqwA==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "2.1", "domutils": "1.5.1", - "nth-check": "1.0.1" + "es6-set": "^0.1.5", + "nth-check": "^1.0.1" } }, "css-selector-tokenizer": { @@ -3098,9 +3092,9 @@ "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", "requires": { - "cssesc": "0.1.0", - "fastparse": "1.1.1", - "regexpu-core": "1.0.0" + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" } }, "css-unit-converter": { @@ -3123,38 +3117,38 @@ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", "requires": { - "autoprefixer": "6.7.7", - "decamelize": "1.2.0", - "defined": "1.0.0", - "has": "1.0.1", - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-calc": "5.3.1", - "postcss-colormin": "2.2.2", - "postcss-convert-values": "2.6.1", - "postcss-discard-comments": "2.0.4", - "postcss-discard-duplicates": "2.1.0", - "postcss-discard-empty": "2.1.0", - "postcss-discard-overridden": "0.1.1", - "postcss-discard-unused": "2.2.3", - "postcss-filter-plugins": "2.0.2", - "postcss-merge-idents": "2.1.7", - "postcss-merge-longhand": "2.0.2", - "postcss-merge-rules": "2.1.2", - "postcss-minify-font-values": "1.0.5", - "postcss-minify-gradients": "1.0.5", - "postcss-minify-params": "1.2.2", - "postcss-minify-selectors": "2.1.1", - "postcss-normalize-charset": "1.1.1", - "postcss-normalize-url": "3.0.8", - "postcss-ordered-values": "2.2.3", - "postcss-reduce-idents": "2.4.0", - "postcss-reduce-initial": "1.0.1", - "postcss-reduce-transforms": "1.0.4", - "postcss-svgo": "2.1.6", - "postcss-unique-selectors": "2.0.2", - "postcss-value-parser": "3.3.0", - "postcss-zindex": "2.2.0" + "autoprefixer": "^6.3.1", + "decamelize": "^1.1.2", + "defined": "^1.0.0", + "has": "^1.0.1", + "object-assign": "^4.0.1", + "postcss": "^5.0.14", + "postcss-calc": "^5.2.0", + "postcss-colormin": "^2.1.8", + "postcss-convert-values": "^2.3.4", + "postcss-discard-comments": "^2.0.4", + "postcss-discard-duplicates": "^2.0.1", + "postcss-discard-empty": "^2.0.1", + "postcss-discard-overridden": "^0.1.1", + "postcss-discard-unused": "^2.2.1", + "postcss-filter-plugins": "^2.0.0", + "postcss-merge-idents": "^2.1.5", + "postcss-merge-longhand": "^2.0.1", + "postcss-merge-rules": "^2.0.3", + "postcss-minify-font-values": "^1.0.2", + "postcss-minify-gradients": "^1.0.1", + "postcss-minify-params": "^1.0.4", + "postcss-minify-selectors": "^2.0.4", + "postcss-normalize-charset": "^1.1.0", + "postcss-normalize-url": "^3.0.7", + "postcss-ordered-values": "^2.1.0", + "postcss-reduce-idents": "^2.2.2", + "postcss-reduce-initial": "^1.0.0", + "postcss-reduce-transforms": "^1.0.3", + "postcss-svgo": "^2.1.1", + "postcss-unique-selectors": "^2.0.2", + "postcss-value-parser": "^3.2.3", + "postcss-zindex": "^2.0.1" }, "dependencies": { "chalk": { @@ -3162,11 +3156,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -3186,10 +3180,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -3202,7 +3196,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -3210,7 +3204,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -3220,8 +3214,8 @@ "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", "requires": { - "clap": "1.2.3", - "source-map": "0.5.7" + "clap": "^1.0.9", + "source-map": "^0.5.3" }, "dependencies": { "source-map": { @@ -3232,31 +3226,24 @@ } }, "cssom": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", - "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=" + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", + "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog==" }, "cssstyle": { "version": "0.2.37", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", "requires": { - "cssom": "0.3.2" + "cssom": "0.3.x" } }, - "ctype": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", - "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=", - "dev": true, - "optional": true - }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "requires": { - "array-find-index": "1.0.2" + "array-find-index": "^1.0.1" } }, "cyclist": { @@ -3269,7 +3256,7 @@ "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "requires": { - "es5-ext": "0.10.42" + "es5-ext": "^0.10.9" } }, "dashdash": { @@ -3277,7 +3264,7 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "date-fns": { @@ -3291,24 +3278,6 @@ "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "4.0.1", - "meow": "3.7.0" - }, - "dependencies": { - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - } - } - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -3333,14 +3302,14 @@ "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", "dev": true, "requires": { - "decompress-tar": "4.1.1", - "decompress-tarbz2": "4.1.1", - "decompress-targz": "4.1.1", - "decompress-unzip": "4.0.1", - "graceful-fs": "4.1.11", - "make-dir": "1.2.0", - "pify": "2.3.0", - "strip-dirs": "2.1.0" + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" } }, "decompress-tar": { @@ -3349,9 +3318,9 @@ "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", "dev": true, "requires": { - "file-type": "5.2.0", - "is-stream": "1.1.0", - "tar-stream": "1.6.0" + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" } }, "decompress-tarbz2": { @@ -3360,11 +3329,11 @@ "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", "dev": true, "requires": { - "decompress-tar": "4.1.1", - "file-type": "6.2.0", - "is-stream": "1.1.0", - "seek-bzip": "1.0.5", - "unbzip2-stream": "1.2.5" + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" }, "dependencies": { "file-type": { @@ -3381,9 +3350,9 @@ "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", "dev": true, "requires": { - "decompress-tar": "4.1.1", - "file-type": "5.2.0", - "is-stream": "1.1.0" + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" } }, "decompress-unzip": { @@ -3392,10 +3361,10 @@ "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", "dev": true, "requires": { - "file-type": "3.9.0", - "get-stream": "2.3.1", - "pify": "2.3.0", - "yauzl": "2.9.1" + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" }, "dependencies": { "file-type": { @@ -3410,8 +3379,8 @@ "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", "dev": true, "requires": { - "object-assign": "4.1.1", - "pinkie-promise": "2.0.1" + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" } } } @@ -3428,19 +3397,13 @@ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { - "type-detect": "4.0.8" + "type-detect": "^4.0.0" } }, - "deep-equal": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.1.2.tgz", - "integrity": "sha1-skbCuApXCkfBG+HZvRBw7IeLh84=", - "dev": true - }, "deep-extend": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", - "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==" + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, "deep-is": { "version": "0.1.3", @@ -3453,7 +3416,7 @@ "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", "dev": true, "requires": { - "strip-bom": "2.0.0" + "strip-bom": "^2.0.0" } }, "define-properties": { @@ -3461,8 +3424,8 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" + "foreach": "^2.0.5", + "object-keys": "^1.0.8" } }, "define-property": { @@ -3470,8 +3433,8 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -3479,7 +3442,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -3487,7 +3450,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -3495,9 +3458,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "isobject": { @@ -3532,8 +3495,8 @@ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "destroy": { @@ -3548,18 +3511,18 @@ "dev": true }, "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz", + "integrity": "sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA==" }, "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, "dir-glob": { @@ -3567,8 +3530,8 @@ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", "requires": { - "arrify": "1.0.1", - "path-type": "3.0.0" + "arrify": "^1.0.1", + "path-type": "^3.0.0" }, "dependencies": { "path-type": { @@ -3576,7 +3539,7 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" } }, "pify": { @@ -3591,7 +3554,7 @@ "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", "requires": { - "utila": "0.3.3" + "utila": "~0.3" }, "dependencies": { "utila": { @@ -3606,8 +3569,8 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.1" + "domelementtype": "~1.1.1", + "entities": "~1.1.1" }, "dependencies": { "domelementtype": { @@ -3632,7 +3595,7 @@ "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", "requires": { - "webidl-conversions": "4.0.2" + "webidl-conversions": "^4.0.2" } }, "domhandler": { @@ -3640,7 +3603,7 @@ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", "requires": { - "domelementtype": "1.3.0" + "domelementtype": "1" } }, "domutils": { @@ -3648,8 +3611,8 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" + "dom-serializer": "0", + "domelementtype": "1" } }, "dot-prop": { @@ -3657,39 +3620,7 @@ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", "requires": { - "is-obj": "1.0.1" - } - }, - "dts-generator": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/dts-generator/-/dts-generator-2.1.0.tgz", - "integrity": "sha1-A5uHpPX4R7O47wDd7j6wlUXezv4=", - "dev": true, - "requires": { - "bluebird": "3.3.3", - "glob": "7.0.0", - "mkdirp": "0.5.1" - }, - "dependencies": { - "bluebird": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.3.3.tgz", - "integrity": "sha1-z5akXXe5qXpDxGo2XEYZ9iv5dtA=", - "dev": true - }, - "glob": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.0.tgz", - "integrity": "sha1-OyCjV//89GuzhK7W+K6aZH/basQ=", - "dev": true, - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } + "is-obj": "^1.0.0" } }, "duplexer": { @@ -3702,7 +3633,7 @@ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", "requires": { - "readable-stream": "2.3.6" + "readable-stream": "^2.0.2" } }, "duplexer3": { @@ -3712,14 +3643,14 @@ "dev": true }, "duplexify": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz", - "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", + "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "stream-shift": "1.0.0" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" } }, "ecc-jsbn": { @@ -3728,7 +3659,7 @@ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "ee-first": { @@ -3737,14 +3668,14 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "ejs": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.9.tgz", - "integrity": "sha512-GJCAeDBKfREgkBtgrYSf9hQy9kTb3helv0zGdzqhM7iAkW8FA/ZF97VQDbwFiwIT8MQLLOe5VlPZOEvZAqtUAQ==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==" }, "electron-to-chromium": { - "version": "1.3.45", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.45.tgz", - "integrity": "sha1-RYrBscXHYM6IEaFtK/vZfsMLr7g=" + "version": "1.3.52", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz", + "integrity": "sha1-0tnxJwuko7lnuDHEDvcftNmrXOA=" }, "elegant-spinner": { "version": "1.0.1", @@ -3757,13 +3688,13 @@ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" } }, "emojis-list": { @@ -3781,7 +3712,7 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "requires": { - "once": "1.4.0" + "once": "^1.4.0" } }, "enhanced-resolve": { @@ -3789,10 +3720,10 @@ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "object-assign": "4.1.1", - "tapable": "0.2.8" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.7" } }, "entities": { @@ -3805,25 +3736,49 @@ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "requires": { - "prr": "1.0.1" + "prr": "~1.0.1" } }, "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" } }, "es5-ext": { - "version": "0.10.42", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.42.tgz", - "integrity": "sha512-AJxO1rmPe1bDEfSR6TJ/FgMFYuTBhR5R57KW58iCkYACMyFbrkqVyzXSurYoScDGvgyMpk7uRF/lPUPPTmsRSA==", + "version": "0.10.45", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", + "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "next-tick": "1.0.0" + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "1" } }, "es6-iterator": { @@ -3831,9 +3786,9 @@ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, "es6-map": { @@ -3841,12 +3796,12 @@ "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" } }, "es6-object-assign": { @@ -3856,9 +3811,9 @@ "dev": true }, "es6-promise": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-0.1.2.tgz", - "integrity": "sha1-8RLCn+paCZhTn8tqL9IUQ9KPBfc=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", + "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", "dev": true }, "es6-set": { @@ -3866,11 +3821,11 @@ "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42", - "es6-iterator": "2.0.3", + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "event-emitter": "~0.3.5" } }, "es6-symbol": { @@ -3878,8 +3833,8 @@ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42" + "d": "1", + "es5-ext": "~0.10.14" } }, "es6-weak-map": { @@ -3887,10 +3842,10 @@ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" } }, "escape-html": { @@ -3904,15 +3859,15 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", - "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz", + "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==", "requires": { - "esprima": "3.1.3", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "optionator": "0.8.2", - "source-map": "0.6.1" + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" } }, "escope": { @@ -3920,20 +3875,10 @@ "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.1", - "estraverse": "4.2.0" - } - }, - "eslint-plugin-prettier": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-2.6.0.tgz", - "integrity": "sha512-floiaI4F7hRkTrFe8V2ItOK97QYrX75DjmdzmVITZoAP6Cn06oEDPQRsO6MlHEP/u2SxI3xQ52Kpjw6j5WGfeQ==", - "dev": true, - "requires": { - "fast-diff": "1.1.2", - "jest-docblock": "21.2.0" + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "esprima": { @@ -3946,7 +3891,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.1.0" } }, "estraverse": { @@ -3969,15 +3914,24 @@ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42" + "d": "1", + "es5-ext": "~0.10.14" } }, - "eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", - "dev": true + "event-stream": { + "version": "3.3.4", + "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dev": true, + "requires": { + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" + } }, "events": { "version": "1.1.1", @@ -3989,8 +3943,8 @@ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "requires": { - "md5.js": "1.3.4", - "safe-buffer": "5.1.2" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, "execa": { @@ -3999,21 +3953,15 @@ "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", "dev": true, "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, "exit-hook": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", @@ -4025,7 +3973,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "expand-range": { @@ -4033,7 +3981,16 @@ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "requires": { - "fill-range": "2.2.3" + "fill-range": "^2.1.0" + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" } }, "express": { @@ -4041,38 +3998,43 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", "requires": { - "accepts": "1.3.5", + "accepts": "~1.3.4", "array-flatten": "1.1.1", "body-parser": "1.18.2", "content-disposition": "0.5.2", - "content-type": "1.0.4", + "content-type": "~1.0.4", "cookie": "0.3.1", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "1.1.2", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.1", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "finalhandler": "1.1.0", "fresh": "0.5.2", "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.3", + "proxy-addr": "~2.0.2", "qs": "6.5.1", - "range-parser": "1.2.0", + "range-parser": "~1.2.0", "safe-buffer": "5.1.1", "send": "0.16.1", "serve-static": "1.13.1", "setprototypeof": "1.1.0", - "statuses": "1.3.1", - "type-is": "1.6.16", + "statuses": "~1.3.1", + "type-is": "~1.6.15", "utils-merge": "1.0.1", - "vary": "1.1.2" + "vary": "~1.1.2" }, "dependencies": { + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", @@ -4081,17 +4043,17 @@ } }, "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -4099,7 +4061,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -4110,9 +4072,9 @@ "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.19", - "tmp": "0.0.33" + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" } }, "extglob": { @@ -4120,7 +4082,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" }, "dependencies": { "is-extglob": { @@ -4135,10 +4097,10 @@ "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", "requires": { - "async": "2.6.0", - "loader-utils": "1.1.0", - "schema-utils": "0.3.0", - "webpack-sources": "1.1.0" + "async": "^2.4.1", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0", + "webpack-sources": "^1.0.1" } }, "extsprintf": { @@ -4151,12 +4113,6 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" }, - "fast-diff": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", - "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==", - "dev": true - }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", @@ -4172,22 +4128,13 @@ "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=" }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": "0.7.0" - } - }, "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", "dev": true, "requires": { - "pend": "1.2.0" + "pend": "~1.2.0" } }, "figures": { @@ -4196,7 +4143,7 @@ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5" + "escape-string-regexp": "^1.0.5" } }, "file-loader": { @@ -4204,16 +4151,10 @@ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.5.tgz", "integrity": "sha512-RzGHDatcVNpGISTvCpfUfOGpYuSR7HSsSg87ki+wF6rw1Hm0RALPTiAdsxAq1UwLf0RRhbe22/eHK6nhXspiOQ==", "requires": { - "loader-utils": "1.1.0", - "schema-utils": "0.3.0" + "loader-utils": "^1.0.2", + "schema-utils": "^0.3.0" } }, - "file-sync-cmp": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", - "integrity": "sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs=", - "dev": true - }, "file-type": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", @@ -4231,15 +4172,15 @@ "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==" }, "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, "filled-array": { @@ -4252,11 +4193,11 @@ "resolved": "https://registry.npmjs.org/filter-css/-/filter-css-0.1.2.tgz", "integrity": "sha1-Sk0BWyGhRamWFxA4+AYMAxV17gk=", "requires": { - "css": "2.2.1", - "get-stdin": "5.0.1", - "lodash": "4.17.10", - "meow": "3.7.0", - "update-notifier": "0.7.0" + "css": "^2.2.0", + "get-stdin": "^5.0.1", + "lodash": "^4.13.1", + "meow": "^3.1.0", + "update-notifier": "^0.7.0" } }, "finalhandler": { @@ -4265,12 +4206,12 @@ "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", "requires": { "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.3.1", - "unpipe": "1.0.0" + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" } }, "find-cache-dir": { @@ -4278,11 +4219,17 @@ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", "requires": { - "commondir": "1.0.1", - "make-dir": "1.2.0", - "pkg-dir": "2.0.0" + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" } }, + "find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "dev": true + }, "find-parent-dir": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", @@ -4294,32 +4241,8 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", - "dev": true, - "requires": { - "glob": "5.0.15" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "flatten": { @@ -4332,8 +4255,8 @@ "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" } }, "for-in": { @@ -4346,7 +4269,7 @@ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } }, "foreach": { @@ -4364,18 +4287,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "requires": { - "asynckit": "0.4.0", + "asynckit": "^0.4.0", "combined-stream": "1.0.6", - "mime-types": "2.1.18" - } - }, - "formatio": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", - "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", - "dev": true, - "requires": { - "samsam": "1.3.0" + "mime-types": "^2.1.12" } }, "forwarded": { @@ -4388,7 +4302,7 @@ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "requires": { - "map-cache": "0.2.2" + "map-cache": "^0.2.2" } }, "fresh": { @@ -4396,13 +4310,19 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, "from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } }, "fs-constants": { @@ -4422,11 +4342,11 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1", - "path-is-absolute": "1.0.1", - "rimraf": "2.6.2" + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" }, "dependencies": { "jsonfile": { @@ -4434,7 +4354,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } } } @@ -4444,10 +4364,10 @@ "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", "requires": { - "graceful-fs": "4.1.11", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "readable-stream": "2.3.6" + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" } }, "fs.realpath": { @@ -4456,13 +4376,13 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.3.tgz", - "integrity": "sha512-X+57O5YkDTiEQGiw8i7wYc2nQgweIekqkepI8Q3y4wVlurgBt2SuwxTeYUYMZIGpLZH3r/TsMjczCMXE5ZOt7Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", "optional": true, "requires": { - "nan": "2.10.0", - "node-pre-gyp": "0.9.1" + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" }, "dependencies": { "abbrev": { @@ -4484,8 +4404,8 @@ "bundled": true, "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "balanced-match": { @@ -4496,7 +4416,7 @@ "version": "1.1.11", "bundled": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -4531,7 +4451,7 @@ } }, "deep-extend": { - "version": "0.4.2", + "version": "0.5.1", "bundled": true, "optional": true }, @@ -4550,7 +4470,7 @@ "bundled": true, "optional": true, "requires": { - "minipass": "2.2.4" + "minipass": "^2.2.1" } }, "fs.realpath": { @@ -4563,14 +4483,14 @@ "bundled": true, "optional": true, "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "glob": { @@ -4578,12 +4498,12 @@ "bundled": true, "optional": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "has-unicode": { @@ -4596,7 +4516,7 @@ "bundled": true, "optional": true, "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": "^2.1.0" } }, "ignore-walk": { @@ -4604,7 +4524,7 @@ "bundled": true, "optional": true, "requires": { - "minimatch": "3.0.4" + "minimatch": "^3.0.4" } }, "inflight": { @@ -4612,8 +4532,8 @@ "bundled": true, "optional": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -4629,7 +4549,7 @@ "version": "1.0.0", "bundled": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "isarray": { @@ -4641,7 +4561,7 @@ "version": "3.0.4", "bundled": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -4652,8 +4572,8 @@ "version": "2.2.4", "bundled": true, "requires": { - "safe-buffer": "5.1.1", - "yallist": "3.0.2" + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" } }, "minizlib": { @@ -4661,7 +4581,7 @@ "bundled": true, "optional": true, "requires": { - "minipass": "2.2.4" + "minipass": "^2.2.1" } }, "mkdirp": { @@ -4681,26 +4601,26 @@ "bundled": true, "optional": true, "requires": { - "debug": "2.6.9", - "iconv-lite": "0.4.21", - "sax": "1.2.4" + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" } }, "node-pre-gyp": { - "version": "0.9.1", + "version": "0.10.0", "bundled": true, "optional": true, "requires": { - "detect-libc": "1.0.3", - "mkdirp": "0.5.1", - "needle": "2.2.0", - "nopt": "4.0.1", - "npm-packlist": "1.1.10", - "npmlog": "4.1.2", - "rc": "1.2.6", - "rimraf": "2.6.2", - "semver": "5.5.0", - "tar": "4.4.1" + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" } }, "nopt": { @@ -4708,8 +4628,8 @@ "bundled": true, "optional": true, "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" + "abbrev": "1", + "osenv": "^0.1.4" } }, "npm-bundled": { @@ -4722,8 +4642,8 @@ "bundled": true, "optional": true, "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.3" + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" } }, "npmlog": { @@ -4731,10 +4651,10 @@ "bundled": true, "optional": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { @@ -4750,7 +4670,7 @@ "version": "1.4.0", "bundled": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { @@ -4768,8 +4688,8 @@ "bundled": true, "optional": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "path-is-absolute": { @@ -4783,14 +4703,14 @@ "optional": true }, "rc": { - "version": "1.2.6", + "version": "1.2.7", "bundled": true, "optional": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -4805,13 +4725,13 @@ "bundled": true, "optional": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "rimraf": { @@ -4819,7 +4739,7 @@ "bundled": true, "optional": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "safe-buffer": { @@ -4855,9 +4775,9 @@ "version": "1.0.2", "bundled": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -4865,14 +4785,14 @@ "bundled": true, "optional": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "strip-ansi": { "version": "3.0.1", "bundled": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { @@ -4885,13 +4805,13 @@ "bundled": true, "optional": true, "requires": { - "chownr": "1.0.1", - "fs-minipass": "1.2.5", - "minipass": "2.2.4", - "minizlib": "1.1.0", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.1", - "yallist": "3.0.2" + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" } }, "util-deprecate": { @@ -4904,7 +4824,7 @@ "bundled": true, "optional": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2" } }, "wrappy": { @@ -4922,42 +4842,10 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, - "gaze": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", - "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", - "dev": true, - "requires": { - "globule": "1.2.0" - } - }, - "generic-names": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-1.0.3.tgz", - "integrity": "sha1-LXhqEhruUIh2eWk56OO/+DbCCRc=", - "dev": true, - "requires": { - "loader-utils": "0.2.17" - }, - "dependencies": { - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - } - } - }, "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" }, "get-func-name": { "version": "2.0.0", @@ -4986,18 +4874,12 @@ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" }, - "getobject": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", - "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", - "dev": true - }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "git-config-path": { @@ -5006,9 +4888,9 @@ "integrity": "sha1-bTP37WPbDQ4RgTFQO6s6ykfVRmQ=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "fs-exists-sync": "0.1.0", - "homedir-polyfill": "1.0.1" + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "homedir-polyfill": "^1.0.0" }, "dependencies": { "extend-shallow": { @@ -5017,21 +4899,21 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } }, "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-base": { @@ -5039,8 +4921,8 @@ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" }, "dependencies": { "is-extglob": { @@ -5053,7 +4935,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } } } @@ -5063,7 +4945,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "requires": { - "is-glob": "2.0.1" + "is-glob": "^2.0.0" }, "dependencies": { "is-extglob": { @@ -5076,18 +4958,35 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } } } }, + "glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "dev": true, + "requires": { + "find-index": "^0.1.1" + } + }, "global-dirs": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", "dev": true, "requires": { - "ini": "1.3.5" + "ini": "^1.3.4" + } + }, + "globalize": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/globalize/-/globalize-1.3.0.tgz", + "integrity": "sha1-xWUkuKz9LOONDJfd/c6zj2RLM5I=", + "requires": { + "cldrjs": "^0.4.6" } }, "globals": { @@ -5101,12 +5000,12 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", "requires": { - "array-union": "1.0.2", - "dir-glob": "2.0.0", - "glob": "7.1.2", - "ignore": "3.3.8", - "pify": "3.0.0", - "slash": "1.0.0" + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" }, "dependencies": { "glob": { @@ -5114,12 +5013,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "pify": { @@ -5129,53 +5028,26 @@ } } }, - "globule": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", - "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", - "dev": true, - "requires": { - "glob": "7.1.2", - "lodash": "4.17.10", - "minimatch": "3.0.4" - }, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } - } - }, "got": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", "requires": { - "create-error-class": "3.0.2", - "duplexer2": "0.1.4", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.1", - "node-status-codes": "1.0.0", - "object-assign": "4.1.1", - "parse-json": "2.2.0", - "pinkie-promise": "2.0.1", - "read-all-stream": "3.1.0", - "readable-stream": "2.3.6", - "timed-out": "3.1.3", - "unzip-response": "1.0.2", - "url-parse-lax": "1.0.0" + "create-error-class": "^3.0.1", + "duplexer2": "^0.1.4", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "node-status-codes": "^1.0.0", + "object-assign": "^4.0.1", + "parse-json": "^2.1.0", + "pinkie-promise": "^2.0.0", + "read-all-stream": "^3.0.0", + "readable-stream": "^2.0.5", + "timed-out": "^3.0.0", + "unzip-response": "^1.0.2", + "url-parse-lax": "^1.0.0" } }, "graceful-fs": { @@ -5189,1518 +5061,95 @@ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", "dev": true }, - "grunt": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.1.tgz", - "integrity": "sha1-6HeHZOlEsY8yuw8QuQeEdcnftWs=", + "gzip-size": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-4.1.0.tgz", + "integrity": "sha1-iuCWJX6r59acRb4rZ8RIEk/7UXw=", + "requires": { + "duplexer": "^0.1.1", + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", "dev": true, "requires": { - "coffee-script": "1.10.0", - "dateformat": "1.0.12", - "eventemitter2": "0.4.14", - "exit": "0.1.2", - "findup-sync": "0.3.0", - "glob": "7.0.6", - "grunt-cli": "1.2.0", - "grunt-known-options": "1.1.0", - "grunt-legacy-log": "1.0.2", - "grunt-legacy-util": "1.0.0", - "iconv-lite": "0.4.19", - "js-yaml": "3.5.5", - "minimatch": "3.0.4", - "nopt": "3.0.6", - "path-is-absolute": "1.0.1", - "rimraf": "2.2.8" + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" }, "dependencies": { - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, - "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } + "optional": true }, - "grunt-cli": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", - "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "dev": true, + "optional": true, "requires": { - "findup-sync": "0.3.0", - "grunt-known-options": "1.1.0", - "nopt": "3.0.6", - "resolve": "1.1.7" + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" } }, - "js-yaml": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz", - "integrity": "sha1-A3fDgBfKvHMisNH7zSWkkWQfL74=", + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "argparse": "1.0.10", - "esprima": "2.7.3" + "amdefine": ">=0.0.4" } }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "dev": true, + "optional": true, "requires": { - "abbrev": "1.1.1" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true + } } }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - }, - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true - } - } - }, - "grunt-contrib-clean": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-1.1.0.tgz", - "integrity": "sha1-Vkq/LQN4qYOhW54/MO51tzjEBjg=", - "dev": true, - "requires": { - "async": "1.5.2", - "rimraf": "2.6.2" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - } - } - }, - "grunt-contrib-copy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz", - "integrity": "sha1-cGDGWB6QS4qw0A8HbgqPbj58NXM=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "file-sync-cmp": "0.1.1" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - } - } - }, - "grunt-contrib-watch": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.0.1.tgz", - "integrity": "sha512-8Zka/svGl6+ZwF7d6z/CfXwsb4cDODnajmZsY4nUAs9Ob0kJEcsLiDf5qm2HdDoEcm3NHjWCrFiWx+PZ2y4D7A==", - "dev": true, - "requires": { - "async": "1.5.2", - "gaze": "1.1.2", - "lodash": "4.17.10", - "tiny-lr": "0.2.1" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - } - } - }, - "grunt-dojo2": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/grunt-dojo2/-/grunt-dojo2-0.1.3.tgz", - "integrity": "sha512-GmuQ8F2fTTKh7WjU/dkQ+YLGDHvXMjJTYP3Nnox5TMRwZF44V/wzpnL3d/E2L1gajsWMn3qcVTwDtmmnOIeZ3A==", - "dev": true, - "requires": { - "codecov.io": "0.1.6", - "cssnano": "3.10.0", - "dts-generator": "2.1.0", - "execa": "0.4.0", - "glob": "7.1.2", - "grunt-contrib-clean": "1.1.0", - "grunt-contrib-copy": "1.0.0", - "grunt-contrib-watch": "1.0.1", - "grunt-postcss": "0.8.0", - "grunt-text-replace": "0.4.0", - "grunt-ts": "5.5.1", - "grunt-tslint": "4.0.1", - "grunt-typings": "0.1.5", - "intern": "4.1.0", - "istanbul-lib-coverage": "1.1.2", - "istanbul-lib-report": "1.1.3", - "istanbul-reports": "1.1.4", - "lodash": "4.17.10", - "parse-git-config": "0.4.3", - "pkg-dir": "1.0.0", - "postcss-cssnext": "2.11.0", - "postcss-import": "9.1.0", - "postcss-modules": "0.6.4", - "remap-istanbul": "0.11.1", - "resolve-from": "2.0.0", - "shelljs": "0.7.8", - "tslint": "4.5.1", - "typed-css-modules": "0.3.1", - "typedoc": "0.5.9", - "umd-wrapper": "0.1.0" - }, - "dependencies": { - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "dev": true, - "requires": { - "string-width": "2.1.1" - } - }, - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true - }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "dev": true, - "requires": { - "ansi-align": "2.0.0", - "camelcase": "4.1.0", - "chalk": "2.4.1", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.2" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "color-convert": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", - "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", - "dev": true, - "requires": { - "color-name": "1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "color-convert": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", - "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", - "dev": true - }, - "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", - "dev": true - }, - "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", - "dev": true, - "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.11", - "make-dir": "1.2.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.3.0", - "xdg-basedir": "3.0.0" - } - }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "dev": true, - "requires": { - "is-obj": "1.0.1" - } - }, - "execa": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.4.0.tgz", - "integrity": "sha1-TrZGejaglfq7KXD/nV4/t7zm68M=", - "dev": true, - "requires": { - "cross-spawn-async": "2.2.5", - "is-stream": "1.1.0", - "npm-run-path": "1.0.0", - "object-assign": "4.1.1", - "path-key": "1.0.0", - "strip-eof": "1.0.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "dev": true, - "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.1", - "safe-buffer": "5.1.2", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" - } - }, - "grunt-tslint": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/grunt-tslint/-/grunt-tslint-4.0.1.tgz", - "integrity": "sha1-dcRuAluereAUYrvrSfb9TBl4O1o=", - "dev": true - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "dev": true, - "requires": { - "package-json": "4.0.1" - } - }, - "npm-run-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-1.0.0.tgz", - "integrity": "sha1-9cMr9ZX+ga6Sfa7FLoL4sACsPI8=", - "dev": true, - "requires": { - "path-key": "1.0.0" - } - }, - "onecolor": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/onecolor/-/onecolor-2.4.2.tgz", - "integrity": "sha1-pT7D/xccNEYBbdUhDRobVEv32HQ=", - "dev": true - }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "dev": true, - "requires": { - "got": "6.7.1", - "registry-auth-token": "3.3.2", - "registry-url": "3.1.0", - "semver": "5.5.0" - } - }, - "path-key": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-1.0.0.tgz", - "integrity": "sha1-XVPVeAGWRsDWiADbThRua9wqx68=", - "dev": true - }, - "pixrem": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pixrem/-/pixrem-3.0.2.tgz", - "integrity": "sha1-MNG6+0w73Ojpu0vVahOYVhkyDDQ=", - "dev": true, - "requires": { - "browserslist": "1.7.7", - "postcss": "5.2.18", - "reduce-css-calc": "1.3.0" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "1.1.2" - } - }, - "pleeease-filters": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/pleeease-filters/-/pleeease-filters-3.0.1.tgz", - "integrity": "sha1-Tf4OjxBGYTUXxktyi8gGCKfr8i8=", - "dev": true, - "requires": { - "onecolor": "2.4.2", - "postcss": "5.2.18" - } - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" - }, - "dependencies": { - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "postcss-apply": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/postcss-apply/-/postcss-apply-0.3.0.tgz", - "integrity": "sha1-ovN8W9+ogeTBX08kXsDNlt0ucNU=", - "dev": true, - "requires": { - "balanced-match": "0.4.2", - "postcss": "5.2.18" - } - }, - "postcss-attribute-case-insensitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-1.0.1.tgz", - "integrity": "sha1-zrc3d+EGFn6yM/GTjJvZ8uaXMI0=", - "dev": true, - "requires": { - "postcss": "5.2.18", - "postcss-selector-parser": "2.2.3" - } - }, - "postcss-color-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-function/-/postcss-color-function-2.0.1.tgz", - "integrity": "sha1-mtIm9VDop8f4uKd4YFRbbdf1UkE=", - "dev": true, - "requires": { - "css-color-function": "1.3.3", - "postcss": "5.2.18", - "postcss-message-helpers": "2.0.0", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-color-gray": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-3.0.1.tgz", - "integrity": "sha1-dEMu3mbdg7HRNjVlxos3bhj/Z3A=", - "dev": true, - "requires": { - "color": "0.11.4", - "postcss": "5.2.18", - "postcss-message-helpers": "2.0.0", - "reduce-function-call": "1.0.2" - } - }, - "postcss-color-hex-alpha": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-2.0.0.tgz", - "integrity": "sha1-RP1uyt5mAoZIyIHLZQTNy/3GzQk=", - "dev": true, - "requires": { - "color": "0.10.1", - "postcss": "5.2.18", - "postcss-message-helpers": "2.0.0" - }, - "dependencies": { - "color": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/color/-/color-0.10.1.tgz", - "integrity": "sha1-wEGI34KiCd3rzOzazT7DIPGTc58=", - "dev": true, - "requires": { - "color-convert": "0.5.3", - "color-string": "0.3.0" - } - } - } - }, - "postcss-color-hsl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-color-hsl/-/postcss-color-hsl-1.0.5.tgz", - "integrity": "sha1-9Tuxw0gxDOMHrYnjGBqGRzi15oc=", - "dev": true, - "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0", - "units-css": "0.4.0" - } - }, - "postcss-color-hwb": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-hwb/-/postcss-color-hwb-2.0.1.tgz", - "integrity": "sha1-1jr6+bcMtZX5AKKcn+V78qMvq+w=", - "dev": true, - "requires": { - "color": "0.11.4", - "postcss": "5.2.18", - "postcss-message-helpers": "2.0.0", - "reduce-function-call": "1.0.2" - } - }, - "postcss-color-rebeccapurple": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-2.0.1.tgz", - "integrity": "sha1-dMZETny7fYVhO19yht96SRYIRRw=", - "dev": true, - "requires": { - "color": "0.11.4", - "postcss": "5.2.18" - } - }, - "postcss-color-rgb": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/postcss-color-rgb/-/postcss-color-rgb-1.1.4.tgz", - "integrity": "sha1-8pJD4i6OjBNDRHQJI3LUzmBb6Lw=", - "dev": true, - "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-color-rgba-fallback": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-color-rgba-fallback/-/postcss-color-rgba-fallback-2.2.0.tgz", - "integrity": "sha1-bSlJG+WZCpMXPUfnx29YELCUAro=", - "dev": true, - "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0", - "rgb-hex": "1.0.0" - } - }, - "postcss-cssnext": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/postcss-cssnext/-/postcss-cssnext-2.11.0.tgz", - "integrity": "sha1-MeaPAB5AlgTacDtm3hS4uMjJ8rE=", - "dev": true, - "requires": { - "autoprefixer": "6.7.7", - "caniuse-api": "1.6.1", - "chalk": "1.1.3", - "pixrem": "3.0.2", - "pleeease-filters": "3.0.1", - "postcss": "5.2.18", - "postcss-apply": "0.3.0", - "postcss-attribute-case-insensitive": "1.0.1", - "postcss-calc": "5.3.1", - "postcss-color-function": "2.0.1", - "postcss-color-gray": "3.0.1", - "postcss-color-hex-alpha": "2.0.0", - "postcss-color-hsl": "1.0.5", - "postcss-color-hwb": "2.0.1", - "postcss-color-rebeccapurple": "2.0.1", - "postcss-color-rgb": "1.1.4", - "postcss-color-rgba-fallback": "2.2.0", - "postcss-custom-media": "5.0.1", - "postcss-custom-properties": "5.0.2", - "postcss-custom-selectors": "3.0.0", - "postcss-font-family-system-ui": "1.0.2", - "postcss-font-variant": "2.0.1", - "postcss-image-set-polyfill": "0.3.5", - "postcss-initial": "1.5.3", - "postcss-media-minmax": "2.1.2", - "postcss-nesting": "2.3.1", - "postcss-pseudo-class-any-link": "1.0.0", - "postcss-pseudoelements": "3.0.0", - "postcss-replace-overflow-wrap": "1.0.0", - "postcss-selector-matches": "2.0.5", - "postcss-selector-not": "2.0.0" - } - }, - "postcss-custom-media": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-5.0.1.tgz", - "integrity": "sha1-E40loYS/LrVN4S1VpsAcMKnYvYE=", - "dev": true, - "requires": { - "postcss": "5.2.18" - } - }, - "postcss-custom-properties": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-5.0.2.tgz", - "integrity": "sha1-lxnXjy2pz59TgQrrwj1GVhMKzrE=", - "dev": true, - "requires": { - "balanced-match": "0.4.2", - "postcss": "5.2.18" - } - }, - "postcss-custom-selectors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-3.0.0.tgz", - "integrity": "sha1-j4Ekn17Qeo0JF89qOf5bBWt/lqw=", - "dev": true, - "requires": { - "balanced-match": "0.2.1", - "postcss": "5.2.18", - "postcss-selector-matches": "2.0.5" - }, - "dependencies": { - "balanced-match": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.1.tgz", - "integrity": "sha1-e8ZYtL7WHu5CStdPdfXD4sTfPMc=", - "dev": true - } - } - }, - "postcss-font-family-system-ui": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/postcss-font-family-system-ui/-/postcss-font-family-system-ui-1.0.2.tgz", - "integrity": "sha1-PhpeP7fjHl6ecUOcyw6AFFVpJ8c=", - "dev": true, - "requires": { - "lodash": "4.17.10", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-font-variant": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-2.0.1.tgz", - "integrity": "sha1-fKKRA/WfoCyjrOLKIrL3VoU9Tvg=", - "dev": true, - "requires": { - "postcss": "5.2.18" - } - }, - "postcss-import": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-9.1.0.tgz", - "integrity": "sha1-lf6YdqHnmvSfvcNYnwH+WqfMHoA=", - "dev": true, - "requires": { - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0", - "promise-each": "2.2.0", - "read-cache": "1.0.0", - "resolve": "1.7.1" - } - }, - "postcss-initial": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-1.5.3.tgz", - "integrity": "sha1-IMPpHJaCLdsb7UlQjbltVrrDd9A=", - "dev": true, - "requires": { - "lodash.template": "4.4.0", - "postcss": "5.2.18" - } - }, - "postcss-media-minmax": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-2.1.2.tgz", - "integrity": "sha1-RExc+JJqteT9iiUJ6Sl+dRZJzfg=", - "dev": true, - "requires": { - "postcss": "5.2.18" - } - }, - "postcss-nesting": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-2.3.1.tgz", - "integrity": "sha1-lKa2pO9wf77CCof+5clXdZtOAc8=", - "dev": true, - "requires": { - "postcss": "5.2.18" - } - }, - "postcss-pseudo-class-any-link": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-1.0.0.tgz", - "integrity": "sha1-kDI5GWQB0zX+c6x1YYb6YuaTryY=", - "dev": true, - "requires": { - "postcss": "5.2.18", - "postcss-selector-parser": "1.3.3" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-1.3.3.tgz", - "integrity": "sha1-0u4Z33pk+O8hwacchvfUg1yIwoE=", - "dev": true, - "requires": { - "flatten": "1.0.2", - "indexes-of": "1.0.1", - "uniq": "1.0.1" - } - } - } - }, - "postcss-pseudoelements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-pseudoelements/-/postcss-pseudoelements-3.0.0.tgz", - "integrity": "sha1-bGghd8eQC6BTtt8X+MWQKEx7i7w=", - "dev": true, - "requires": { - "postcss": "5.2.18" - } - }, - "postcss-replace-overflow-wrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-1.0.0.tgz", - "integrity": "sha1-8KA7Meq5Y2ppNr/SEOKu8bQ0pkM=", - "dev": true, - "requires": { - "postcss": "5.2.18" - } - }, - "postcss-selector-matches": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-2.0.5.tgz", - "integrity": "sha1-+g9Dvle2jneqTNEYBwI0kqExAn8=", - "dev": true, - "requires": { - "balanced-match": "0.4.2", - "postcss": "5.2.18" - } - }, - "postcss-selector-not": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-2.0.0.tgz", - "integrity": "sha1-xzrSGj91I0vuf+4mnhVP1qhpeY0=", - "dev": true, - "requires": { - "balanced-match": "0.2.1", - "postcss": "5.2.18" - }, - "dependencies": { - "balanced-match": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.1.tgz", - "integrity": "sha1-e8ZYtL7WHu5CStdPdfXD4sTfPMc=", - "dev": true - } - } - }, - "rgb-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgb-hex/-/rgb-hex-1.0.0.tgz", - "integrity": "sha1-v6+M2c2RZLWibXHrTxWgllMks8E=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true - }, - "tslint": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-4.5.1.tgz", - "integrity": "sha1-BTVocb7yOkNJBnNABvwYgza6gks=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "colors": "1.1.2", - "diff": "3.5.0", - "findup-sync": "0.3.0", - "glob": "7.1.2", - "optimist": "0.6.1", - "resolve": "1.7.1", - "tsutils": "1.9.1", - "update-notifier": "2.5.0" - } - }, - "tsutils": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-1.9.1.tgz", - "integrity": "sha1-ufmrROVa+WgYMdXyjQrur1x1DLA=", - "dev": true - }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", - "dev": true - }, - "update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", - "dev": true, - "requires": { - "boxen": "1.3.0", - "chalk": "2.4.1", - "configstore": "3.1.2", - "import-lazy": "2.1.0", - "is-ci": "1.1.0", - "is-installed-globally": "0.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.2" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "color-convert": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", - "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", - "dev": true, - "requires": { - "color-name": "1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "widest-line": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", - "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", - "dev": true, - "requires": { - "string-width": "2.1.1" - } - }, - "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" - } - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", - "dev": true - } - } - }, - "grunt-known-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz", - "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=", - "dev": true - }, - "grunt-legacy-log": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-1.0.2.tgz", - "integrity": "sha512-WdedTJ/6zCXnI/coaouzqvkI19uwqbcPkdsXiDRKJyB5rOUlOxnCnTVbpeUdEckKVir2uHF3rDBYppj2p6N3+g==", - "dev": true, - "requires": { - "colors": "1.1.2", - "grunt-legacy-log-utils": "1.0.0", - "hooker": "0.2.3", - "lodash": "4.17.10" - } - }, - "grunt-legacy-log-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-1.0.0.tgz", - "integrity": "sha1-p7ji0Ps1taUPSvmG/BEnSevJbz0=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "lodash": "4.3.0" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "lodash": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", - "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - } - } - }, - "grunt-legacy-util": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.0.0.tgz", - "integrity": "sha1-OGqnjcbtUJhsKxiVcmWxtIq7m4Y=", - "dev": true, - "requires": { - "async": "1.5.2", - "exit": "0.1.2", - "getobject": "0.1.0", - "hooker": "0.2.3", - "lodash": "4.3.0", - "underscore.string": "3.2.3", - "which": "1.2.14" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "lodash": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", - "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", - "dev": true - }, - "which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", - "dev": true, - "requires": { - "isexe": "2.0.0" - } - } - } - }, - "grunt-postcss": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/grunt-postcss/-/grunt-postcss-0.8.0.tgz", - "integrity": "sha1-jzCor2B5A84MRfAfC+QsYOMc6w4=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "diff": "2.2.3", - "postcss": "5.2.18" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "diff": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/diff/-/diff-2.2.3.tgz", - "integrity": "sha1-YOr9DSjukG5Oj/ClLBIpUhAzv5k=", - "dev": true - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" - }, - "dependencies": { - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - } - } - }, - "grunt-text-replace": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/grunt-text-replace/-/grunt-text-replace-0.4.0.tgz", - "integrity": "sha1-252c5Z4v5J2id+nbwZXD4Rz7FsI=", - "dev": true - }, - "grunt-ts": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/grunt-ts/-/grunt-ts-5.5.1.tgz", - "integrity": "sha1-lXIBxrQhx3cilATwcILY5pnRIZk=", - "dev": true, - "requires": { - "chokidar": "1.0.6", - "csproj2ts": "0.0.7", - "es6-promise": "0.1.2", - "lodash": "2.4.1", - "ncp": "0.5.1", - "rimraf": "2.2.6", - "semver": "5.5.0", - "strip-bom": "2.0.0", - "typescript": "1.8.9", - "underscore": "1.5.1", - "underscore.string": "2.3.3" - }, - "dependencies": { - "async-each": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-0.1.6.tgz", - "integrity": "sha1-tn6Z7c3fllQeRK9WKQzX1cbnBDk=", - "dev": true - }, - "chokidar": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.0.6.tgz", - "integrity": "sha1-ChwLzh4kmTr8EFpbgeom3aAeI68=", - "dev": true, - "requires": { - "anymatch": "1.3.2", - "arrify": "1.0.1", - "async-each": "0.1.6", - "fsevents": "0.3.8", - "glob-parent": "1.3.0", - "is-binary-path": "1.0.1", - "is-glob": "1.1.3", - "path-is-absolute": "1.0.1", - "readdirp": "1.4.0" - } - }, - "fsevents": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-0.3.8.tgz", - "integrity": "sha1-mZLxAyySXIKVVNDVmAHcoDE6U1Y=", - "dev": true, - "optional": true, - "requires": { - "nan": "2.10.0" - } - }, - "glob-parent": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-1.3.0.tgz", - "integrity": "sha1-lx7dgW7V21hwW1gHlkemTQrveWg=", - "dev": true, - "requires": { - "is-glob": "2.0.1" - }, - "dependencies": { - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - } - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-1.1.3.tgz", - "integrity": "sha1-tMZLgwPTkRRJKkYNNkzPsNPAoEU=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "lodash": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", - "integrity": "sha1-W3cjA03aTSYuWkb7LFjXzCL3FCA=", - "dev": true - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true - }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", - "dev": true, - "requires": { - "lru-cache": "2.7.3", - "sigmund": "1.0.1" - } - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "readdirp": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-1.4.0.tgz", - "integrity": "sha1-xd5vyz3sgFI8HHARPxoZDYr4LIk=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "minimatch": "0.2.14", - "readable-stream": "1.0.34" - } - }, - "rimraf": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz", - "integrity": "sha1-xZWXVpsU2VatKcrMQr3d9fDqT0w=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "typescript": { - "version": "1.8.9", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-1.8.9.tgz", - "integrity": "sha1-s7OnQFn9McvT7K2V1iRlk55+1fo=", - "dev": true - }, - "underscore.string": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", - "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", - "dev": true - } - } - }, - "grunt-tslint": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/grunt-tslint/-/grunt-tslint-5.0.1.tgz", - "integrity": "sha1-dDK9G9VuijolAACI1cYf3MNC8MI=", - "dev": true - }, - "grunt-typings": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/grunt-typings/-/grunt-typings-0.1.5.tgz", - "integrity": "sha1-GluJR6DWBCIxs6oTjACnOjlhW9w=", - "dev": true, - "requires": { - "typings-core": "1.6.1" - }, - "dependencies": { - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "popsicle": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/popsicle/-/popsicle-8.2.0.tgz", - "integrity": "sha1-/0QBAFyrQ6lBipFBBhHAAZdxLSE=", - "dev": true, - "requires": { - "any-promise": "1.3.0", - "arrify": "1.0.1", - "concat-stream": "1.6.2", - "form-data": "2.3.2", - "make-error-cause": "1.2.2", - "throwback": "1.1.1", - "tough-cookie": "2.3.4", - "xtend": "4.0.1" - } - }, - "promise-finally": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/promise-finally/-/promise-finally-2.2.1.tgz", - "integrity": "sha1-ImFsS6kCkW6Yi9RsVNfKoIkQzXc=", - "dev": true, - "requires": { - "any-promise": "1.3.0" - } - }, - "typings-core": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/typings-core/-/typings-core-1.6.1.tgz", - "integrity": "sha1-zkspMeovGbuPPay+xpmDrE6WSjc=", - "dev": true, - "requires": { - "any-promise": "1.3.0", - "array-uniq": "1.0.3", - "configstore": "2.1.0", - "debug": "2.6.9", - "detect-indent": "4.0.0", - "graceful-fs": "4.1.11", - "has": "1.0.1", - "invariant": "2.2.4", - "is-absolute": "0.2.6", - "listify": "1.0.0", - "lockfile": "1.0.4", - "make-error-cause": "1.2.2", - "mkdirp": "0.5.1", - "object.pick": "1.3.0", - "parse-json": "2.2.0", - "popsicle": "8.2.0", - "popsicle-proxy-agent": "3.0.0", - "popsicle-retry": "3.2.1", - "popsicle-rewrite": "1.0.0", - "popsicle-status": "2.0.1", - "promise-finally": "2.2.1", - "rc": "1.2.7", - "rimraf": "2.6.2", - "sort-keys": "1.1.2", - "string-template": "1.0.0", - "strip-bom": "2.0.0", - "thenify": "3.3.0", - "throat": "3.2.0", - "touch": "1.0.0", - "typescript": "2.6.1", - "xtend": "4.0.1", - "zip-object": "0.1.0" - } - } - } - }, - "gzip-size": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-4.1.0.tgz", - "integrity": "sha1-iuCWJX6r59acRb4rZ8RIEk/7UXw=", - "requires": { - "duplexer": "0.1.1", - "pify": "3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", - "dev": true, - "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "optional": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - } - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "optional": true, - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true - } - } - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "optional": true }, "yargs": { "version": "3.10.0", @@ -6709,9 +5158,9 @@ "dev": true, "optional": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" } } @@ -6727,16 +5176,16 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" + "ajv": "^5.1.0", + "har-schema": "^2.0.0" } }, "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "requires": { - "function-bind": "1.1.1" + "function-bind": "^1.1.1" } }, "has-ansi": { @@ -6744,13 +5193,13 @@ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbols": { "version": "1.0.0", @@ -6762,9 +5211,9 @@ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" }, "dependencies": { "isobject": { @@ -6779,8 +5228,8 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "is-number": { @@ -6788,7 +5237,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -6796,7 +5245,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -6806,7 +5255,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -6816,17 +5265,17 @@ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", + "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, "hawk": { @@ -6834,10 +5283,10 @@ "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.1", - "sntp": "2.1.0" + "boom": "4.x.x", + "cryptiles": "3.x.x", + "hoek": "4.x.x", + "sntp": "2.x.x" } }, "he": { @@ -6845,20 +5294,14 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" }, - "highlight.js": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.12.0.tgz", - "integrity": "sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4=", - "dev": true - }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, "hoek": { @@ -6872,19 +5315,13 @@ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", "dev": true, "requires": { - "parse-passwd": "1.0.0" + "parse-passwd": "^1.0.0" } }, - "hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", - "dev": true - }, "hosted-git-info": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==" + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" }, "html-comment-regex": { "version": "1.1.1", @@ -6896,7 +5333,7 @@ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "requires": { - "whatwg-encoding": "1.0.3" + "whatwg-encoding": "^1.0.1" } }, "html-entities": { @@ -6905,17 +5342,17 @@ "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" }, "html-minifier": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.15.tgz", - "integrity": "sha512-OZa4rfb6tZOZ3Z8Xf0jKxXkiDcFWldQePGYFDcgKqES2sXeWaEv9y6QQvWUtX3ySI3feApQi5uCsHLINQ6NoAw==", + "version": "3.5.19", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.19.tgz", + "integrity": "sha512-Qr2JC9nsjK8oCrEmuB430ZIA8YWbF3D5LSjywD75FTuXmeqacwHgIM8wp3vHYzzPbklSjp53RdmDuzR4ub2HzA==", "requires": { - "camel-case": "3.0.0", - "clean-css": "4.1.11", - "commander": "2.15.1", - "he": "1.1.1", - "param-case": "2.1.1", - "relateurl": "0.2.7", - "uglify-js": "3.3.23" + "camel-case": "3.0.x", + "clean-css": "4.1.x", + "commander": "2.16.x", + "he": "1.1.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" } }, "html-webpack-include-assets-plugin": { @@ -6923,9 +5360,9 @@ "resolved": "https://registry.npmjs.org/html-webpack-include-assets-plugin/-/html-webpack-include-assets-plugin-1.0.2.tgz", "integrity": "sha512-e9ck8RWk+z6aV2XThCCpV/Cn8wK0SWoi8K7b1ZnOP9BSckh3z9/NFoWFc453aywCsyq8RQGhAPx/BOHpaACqkA==", "requires": { - "glob": "7.1.2", - "minimatch": "3.0.4", - "slash": "1.0.0" + "glob": "^7.1.2", + "minimatch": "^3.0.4", + "slash": "^1.0.0" }, "dependencies": { "glob": { @@ -6933,12 +5370,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } } } @@ -6948,12 +5385,12 @@ "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", "requires": { - "bluebird": "3.5.1", - "html-minifier": "3.5.15", - "loader-utils": "0.2.17", - "lodash": "4.17.10", - "pretty-error": "2.1.1", - "toposort": "1.0.7" + "bluebird": "^3.4.7", + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "toposort": "^1.0.0" }, "dependencies": { "bluebird": { @@ -6966,10 +5403,10 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" } } } @@ -6979,10 +5416,10 @@ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.1.0", - "domutils": "1.1.6", - "readable-stream": "1.0.34" + "domelementtype": "1", + "domhandler": "2.1", + "domutils": "1.1", + "readable-stream": "1.0" }, "dependencies": { "domutils": { @@ -6990,7 +5427,7 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", "requires": { - "domelementtype": "1.3.0" + "domelementtype": "1" } }, "isarray": { @@ -7003,10 +5440,10 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "string_decoder": { @@ -7021,10 +5458,10 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { - "depd": "1.1.2", + "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": "1.5.0" + "statuses": ">= 1.4.0 < 2" }, "dependencies": { "statuses": { @@ -7034,31 +5471,14 @@ } } }, - "http-parser-js": { - "version": "0.4.12", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.12.tgz", - "integrity": "sha1-uc+/Sizybw/DSxDKFImid3HjR08=", - "dev": true - }, - "http-proxy-agent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-1.0.0.tgz", - "integrity": "sha1-zBzjjkU7+YSg93AtLdWcc9CBKEo=", - "dev": true, - "requires": { - "agent-base": "2.1.1", - "debug": "2.6.9", - "extend": "3.0.1" - } - }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.1" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "https-browserify": { @@ -7066,26 +5486,15 @@ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, - "https-proxy-agent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", - "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", - "dev": true, - "requires": { - "agent-base": "2.1.1", - "debug": "2.6.9", - "extend": "3.0.1" - } - }, "husky": { "version": "0.14.3", "resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz", "integrity": "sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA==", "dev": true, "requires": { - "is-ci": "1.1.0", - "normalize-path": "1.0.0", - "strip-indent": "2.0.0" + "is-ci": "^1.0.10", + "normalize-path": "^1.0.0", + "strip-indent": "^2.0.0" }, "dependencies": { "normalize-path": { @@ -7117,13 +5526,13 @@ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", "requires": { - "postcss": "6.0.1" + "postcss": "^6.0.1" } }, "ieee754": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.11.tgz", - "integrity": "sha512-VhDzCKN7K8ufStx/CLj5/PDTMgph+qwN5Pkd5i0sGnVwk56zJ0lkT8Qzi1xqWLS0Wp29DgDtNeS7v8/wMoZeHg==" + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" }, "iferr": { "version": "0.1.5", @@ -7131,9 +5540,18 @@ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" }, "ignore": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", - "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==" + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" + }, + "ignore-walk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } }, "immediate": { "version": "3.0.6", @@ -7152,8 +5570,8 @@ "resolved": "https://registry.npmjs.org/imports-loader/-/imports-loader-0.7.1.tgz", "integrity": "sha1-8gS180cCoywdt9SNidXoZ6BEElM=", "requires": { - "loader-utils": "1.1.0", - "source-map": "0.5.7" + "loader-utils": "^1.0.2", + "source-map": "^0.5.6" }, "dependencies": { "source-map": { @@ -7173,7 +5591,7 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "indexes-of": { @@ -7191,8 +5609,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -7211,20 +5629,20 @@ "integrity": "sha512-+f3qDNeZpkhFJ61NBA9jXDrGGhoQuqfEum9A681c9oHoIbGgVqjogKynjB/vNVP+nVu9w3FbFQ35c0ibU0MaIQ==", "dev": true, "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.3.0", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.2.0", - "figures": "2.0.0", - "lodash": "4.17.10", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" }, "dependencies": { "is-fullwidth-code-point": { @@ -7239,214 +5657,152 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } } } }, "intern": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/intern/-/intern-4.1.0.tgz", - "integrity": "sha512-6RtCkpWtpDiR2mzHn5N6pZdej4MePan7J5Acs2n2iSmqCUP97UbyEPDVsObxo7Mv+IktI0auqft7/WPHxFehpg==", - "dev": true, - "requires": { - "@dojo/core": "0.1.0", - "@dojo/has": "0.1.2", - "@dojo/interfaces": "0.1.0", - "@dojo/shim": "0.1.0", - "@theintern/digdug": "2.0.4", - "@theintern/leadfoot": "2.0.3", - "@types/benchmark": "1.0.31", - "@types/chai": "4.0.10", - "@types/charm": "1.0.1", - "@types/diff": "3.2.2", - "@types/express": "4.0.39", - "@types/http-errors": "1.5.34", - "@types/istanbul-lib-coverage": "1.1.0", - "@types/istanbul-lib-hook": "1.0.0", - "@types/istanbul-lib-instrument": "1.7.1", - "@types/istanbul-lib-report": "1.1.0", - "@types/istanbul-lib-source-maps": "1.2.1", - "@types/istanbul-reports": "1.1.0", - "@types/lodash": "4.14.108", - "@types/mime-types": "2.1.0", - "@types/platform": "1.3.1", - "@types/resolve": "0.0.4", - "@types/shell-quote": "1.6.0", - "@types/source-map": "0.1.29", - "@types/statuses": "1.2.28", - "@types/ws": "0.0.42", - "benchmark": "2.1.4", - "body-parser": "1.17.2", - "chai": "4.1.2", - "charm": "1.0.2", - "diff": "3.2.0", - "express": "4.15.5", - "glob": "7.1.2", - "http-errors": "1.6.3", - "istanbul-lib-coverage": "1.1.2", - "istanbul-lib-hook": "1.0.7", - "istanbul-lib-instrument": "1.7.5", - "istanbul-lib-report": "1.1.3", - "istanbul-lib-source-maps": "1.2.3", - "istanbul-reports": "1.1.4", - "lodash": "4.17.10", - "mime-types": "2.1.18", - "minimatch": "3.0.4", - "platform": "1.3.5", - "resolve": "1.4.0", - "shell-quote": "1.6.1", - "source-map": "0.5.7", - "statuses": "1.3.1", - "tslib": "1.8.1", - "ws": "2.3.1" + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/intern/-/intern-4.2.2.tgz", + "integrity": "sha512-yVe+IsWXAdZaj2LX9PiZ9KUQzru67zuCcIf28ulxh9bp7dvLvmyeEH1d+DpF78+zvl7ebAOEvX3NDQSc/PEdOQ==", + "dev": true, + "requires": { + "@dojo/core": "~0.5.0", + "@dojo/has": "~0.1.2", + "@dojo/interfaces": "~0.2.1", + "@dojo/shim": "~0.2.7", + "@theintern/digdug": "~2.1.0", + "@theintern/leadfoot": "~2.1.0", + "@types/benchmark": "~1.0.30", + "@types/chai": "~4.1.2", + "@types/charm": "~1.0.0", + "@types/diff": "~3.5.1", + "@types/express": "~4.11.1", + "@types/http-errors": "~1.6.1", + "@types/istanbul-lib-coverage": "~1.1.0", + "@types/istanbul-lib-hook": "~1.0.0", + "@types/istanbul-lib-instrument": "~1.7.1", + "@types/istanbul-lib-report": "~1.1.0", + "@types/istanbul-lib-source-maps": "~1.2.1", + "@types/istanbul-reports": "~1.1.0", + "@types/lodash": "~4.14.107", + "@types/mime-types": "~2.1.0", + "@types/platform": "~1.3.0", + "@types/resolve": "0.0.7", + "@types/shell-quote": "~1.6.0", + "@types/statuses": "~1.3.0", + "@types/ws": "~4.0.2", + "benchmark": "~2.1.4", + "body-parser": "~1.18.2", + "chai": "~4.1.2", + "charm": "~1.0.2", + "diff": "~3.5.0", + "express": "~4.16.3", + "glob": "~7.1.1", + "http-errors": "~1.6.3", + "istanbul-lib-coverage": "~1.2.0", + "istanbul-lib-hook": "~1.1.0", + "istanbul-lib-instrument": "~1.10.0", + "istanbul-lib-report": "~1.1.3", + "istanbul-lib-source-maps": "~1.2.4", + "istanbul-reports": "~1.3.0", + "lodash": "~4.17.5", + "mime-types": "~2.1.18", + "minimatch": "~3.0.4", + "platform": "~1.3.5", + "resolve": "~1.7.1", + "shell-quote": "~1.6.1", + "source-map": "~0.6.1", + "statuses": "~1.5.0", + "tslib": "~1.9.0", + "ws": "~5.1.1" }, "dependencies": { - "@dojo/has": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@dojo/has/-/has-0.1.2.tgz", - "integrity": "sha512-122xXU9xHjG/EayITIAiIdKVphZTZ2wM9IEBArarkBQzXZP1shGAbTJq7NHWUoTemw48tvTxr+OOi7wVCm7IXg==", - "dev": true - }, - "@dojo/shim": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@dojo/shim/-/shim-0.1.0.tgz", - "integrity": "sha512-008RP8DB175ib26dde7wQWFiYIbSACFaArLdLHYdY/cQLN9s3yVj2Gtp5C/9YoY3Ziy9wA241myOjy6QcVHcWw==", - "dev": true - }, "@types/express": { - "version": "4.0.39", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.0.39.tgz", - "integrity": "sha512-dBUam7jEjyuEofigUXCtublUHknRZvcRgITlGsTbFgPvnTwtQUt2NgLakbsf+PsGo/Nupqr3IXCYsOpBpofyrA==", - "dev": true, - "requires": { - "@types/body-parser": "1.17.0", - "@types/express-serve-static-core": "4.11.1", - "@types/serve-static": "1.13.2" - } - }, - "@types/source-map": { - "version": "0.1.29", - "resolved": "https://registry.npmjs.org/@types/source-map/-/source-map-0.1.29.tgz", - "integrity": "sha1-1wSKYBgLCfiqbVO9oxHGtRy9cBg=", - "dev": true - }, - "body-parser": { - "version": "1.17.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz", - "integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=", - "dev": true, - "requires": { - "bytes": "2.4.0", - "content-type": "1.0.4", - "debug": "2.6.7", - "depd": "1.1.2", - "http-errors": "1.6.3", - "iconv-lite": "0.4.15", - "on-finished": "2.3.0", - "qs": "6.4.0", - "raw-body": "2.2.0", - "type-is": "1.6.16" - } - }, - "bytes": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", - "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=", - "dev": true - }, - "debug": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", - "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.11.1.tgz", + "integrity": "sha512-ttWle8cnPA5rAelauSWeWJimtY2RsUf2aspYZs7xPHiWgOlPn6nnUfBMtrkcnjFJuIHJF4gNOdVvpLK2Zmvh6g==", "dev": true, "requires": { - "ms": "2.0.0" + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/serve-static": "*" } }, "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, "express": { - "version": "4.15.5", - "resolved": "https://registry.npmjs.org/express/-/express-4.15.5.tgz", - "integrity": "sha1-ZwI1ypWYiQpa6BcLg9tyK4Qu2Sc=", + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", "dev": true, "requires": { - "accepts": "1.3.5", + "accepts": "~1.3.5", "array-flatten": "1.1.1", + "body-parser": "1.18.2", "content-disposition": "0.5.2", - "content-type": "1.0.4", + "content-type": "~1.0.4", "cookie": "0.3.1", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "1.1.2", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", - "finalhandler": "1.0.6", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", "fresh": "0.5.2", "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "1.1.5", - "qs": "6.5.0", - "range-parser": "1.2.0", - "send": "0.15.6", - "serve-static": "1.12.6", - "setprototypeof": "1.0.3", - "statuses": "1.3.1", - "type-is": "1.6.16", - "utils-merge": "1.0.0", - "vary": "1.1.2" + "proxy-addr": "~2.0.3", + "qs": "6.5.1", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "qs": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.0.tgz", - "integrity": "sha512-fjVFjW9yhqMhVGwRExCXLhJKrLlkYSaxNWdyc9rmHlrVZbk35YHH312dFd7191uQeXkI3mKLZTIbSvIeFwFemg==", + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", "dev": true } } }, "finalhandler": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz", - "integrity": "sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "dev": true, "requires": { "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.3.1", - "unpipe": "1.0.0" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true } } }, @@ -7456,144 +5812,95 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "iconv-lite": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", - "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=", - "dev": true - }, - "ipaddr.js": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", - "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=", - "dev": true - }, - "mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=", - "dev": true - }, - "proxy-addr": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", - "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=", - "dev": true, - "requires": { - "forwarded": "0.1.2", - "ipaddr.js": "1.4.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", "dev": true }, - "raw-body": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz", - "integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y=", - "dev": true, - "requires": { - "bytes": "2.4.0", - "iconv-lite": "0.4.15", - "unpipe": "1.0.0" - } - }, "resolve": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.5" } }, "safe-buffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", "dev": true }, "send": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/send/-/send-0.15.6.tgz", - "integrity": "sha1-IPI6nJJbdiq4JwX+L52yUqzkfjQ=", + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "dev": true, "requires": { "debug": "2.6.9", - "depd": "1.1.2", - "destroy": "1.0.4", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.6.3", - "mime": "1.3.4", + "http-errors": "~1.6.2", + "mime": "1.4.1", "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.3.1" + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true } } }, "serve-static": { - "version": "1.12.6", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.6.tgz", - "integrity": "sha1-uXN3P2NEmTTaVOW+ul4x2fQhFXc=", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "dev": true, "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.2", - "send": "0.15.6" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" } }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, - "utils-merge": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=", + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", "dev": true }, "ws": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-2.3.1.tgz", - "integrity": "sha1-a5Sz5EfLajY/eF6vlK9jWejoHIA=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.1.1.tgz", + "integrity": "sha512-bOusvpCb09TOBLbpMKszd45WKC2KPtxiyiHanv+H2DE3Az+1db5a/L7sVJZVDPUC1Br8f0SKRr1KjLpD1U/IAw==", "dev": true, "requires": { - "safe-buffer": "5.0.1", - "ultron": "1.1.1" + "async-limiter": "~1.0.0" } } } @@ -7614,7 +5921,7 @@ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, "requires": { - "loose-envify": "1.3.1" + "loose-envify": "^1.0.0" } }, "invert-kv": { @@ -7627,24 +5934,6 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" }, - "is-absolute": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", - "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", - "dev": true, - "requires": { - "is-relative": "0.2.1", - "is-windows": "0.2.0" - }, - "dependencies": { - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", - "dev": true - } - } - }, "is-absolute-url": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", @@ -7655,7 +5944,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-arrayish": { @@ -7668,7 +5957,7 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "requires": { - "binary-extensions": "1.11.0" + "binary-extensions": "^1.0.0" } }, "is-buffer": { @@ -7681,16 +5970,22 @@ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, "is-ci": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", "dev": true, "requires": { - "ci-info": "1.1.3" + "ci-info": "^1.0.0" } }, "is-data-descriptor": { @@ -7698,17 +5993,23 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { @@ -7733,7 +6034,7 @@ "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "requires": { - "is-primitive": "2.0.0" + "is-primitive": "^2.0.0" } }, "is-extendable": { @@ -7751,7 +6052,7 @@ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -7759,7 +6060,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-glob": { @@ -7767,7 +6068,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } }, "is-installed-globally": { @@ -7776,8 +6077,8 @@ "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", "dev": true, "requires": { - "global-dirs": "0.1.1", - "is-path-inside": "1.0.1" + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" } }, "is-natural-number": { @@ -7796,7 +6097,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-obj": { @@ -7810,21 +6111,14 @@ "integrity": "sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=", "dev": true, "requires": { - "symbol-observable": "0.2.4" - } - }, - "is-odd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", - "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", - "requires": { - "is-number": "4.0.0" + "symbol-observable": "^0.2.2" }, "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + "symbol-observable": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz", + "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=", + "dev": true } } }, @@ -7834,7 +6128,7 @@ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, "requires": { - "path-is-inside": "1.0.2" + "path-is-inside": "^1.0.1" } }, "is-plain-obj": { @@ -7847,7 +6141,7 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" }, "dependencies": { "isobject": { @@ -7878,21 +6172,21 @@ "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, "is-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", "dev": true }, - "is-relative": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", - "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", - "dev": true, - "requires": { - "is-unc-path": "0.1.2" - } - }, "is-retry-allowed": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", @@ -7908,9 +6202,15 @@ "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", "requires": { - "html-comment-regex": "1.1.1" + "html-comment-regex": "^1.1.0" } }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, "is-there": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/is-there/-/is-there-4.4.3.tgz", @@ -7921,15 +6221,6 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, - "is-unc-path": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", - "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", - "dev": true, - "requires": { - "unc-path-regex": "0.1.2" - } - }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -7945,6 +6236,21 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, + "isemail": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.1.3.tgz", + "integrity": "sha512-5xbsG5wYADIcB+mfLsd+nst1V/D+I7EU7LEZPo2GOIMu4JzfcRs5yQoypP4avA7QtUqgxYLKBYNv4IdzBmbhdw==", + "requires": { + "punycode": "2.x.x" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -7968,148 +6274,34 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, - "istanbul": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", - "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", - "dev": true, - "requires": { - "abbrev": "1.0.9", - "async": "1.5.2", - "escodegen": "1.8.1", - "esprima": "2.7.3", - "glob": "5.0.15", - "handlebars": "4.0.11", - "js-yaml": "3.7.0", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "once": "1.4.0", - "resolve": "1.1.7", - "supports-color": "3.2.3", - "which": "1.3.0", - "wordwrap": "1.0.0" - }, - "dependencies": { - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", - "dev": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", - "dev": true, - "requires": { - "esprima": "2.7.3", - "estraverse": "1.9.3", - "esutils": "2.0.2", - "optionator": "0.8.2", - "source-map": "0.2.0" - } - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", - "dev": true - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1.0.9" - } - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - }, - "source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", - "dev": true, - "optional": true, - "requires": { - "amdefine": "1.0.1" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, "istanbul-lib-coverage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.2.tgz", - "integrity": "sha512-tZYA0v5A7qBSsOzcebJJ/z3lk3oSzH62puG78DbBA1+zupipX2CakDyiPV3pOb8He+jBwVimuwB0dTnh38hX0w==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", + "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", "dev": true }, "istanbul-lib-hook": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz", - "integrity": "sha512-3U2HB9y1ZV9UmFlE12Fx+nPtFqIymzrqCksrXujm3NVbAZIJg/RfYgO1XiIa0mbmxTjWpVEVlkIZJ25xVIAfkQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz", + "integrity": "sha512-U3qEgwVDUerZ0bt8cfl3dSP3S6opBoOtk3ROO5f2EfBr/SRiD9FQqzwaZBqFORu8W7O0EXpai+k7kxHK13beRg==", "dev": true, "requires": { - "append-transform": "0.4.0" + "append-transform": "^0.4.0" } }, "istanbul-lib-instrument": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.5.tgz", - "integrity": "sha1-rbWW+PDLi5XnOSBjUaOKWGryGx4=", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", + "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", "dev": true, "requires": { - "babel-generator": "6.26.1", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "istanbul-lib-coverage": "1.1.2", - "semver": "5.5.0" + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.0", + "semver": "^5.3.0" } }, "istanbul-lib-report": { @@ -8118,10 +6310,10 @@ "integrity": "sha512-D4jVbMDtT2dPmloPJS/rmeP626N5Pr3Rp+SovrPn1+zPChGHcggd/0sL29jnbm4oK9W0wHjCRsdch9oLd7cm6g==", "dev": true, "requires": { - "istanbul-lib-coverage": "1.1.2", - "mkdirp": "0.5.1", - "path-parse": "1.0.5", - "supports-color": "3.2.3" + "istanbul-lib-coverage": "^1.1.2", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" }, "dependencies": { "has-flag": { @@ -8130,28 +6322,37 @@ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", "dev": true }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "istanbul-lib-source-maps": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz", - "integrity": "sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz", + "integrity": "sha512-8O2T/3VhrQHn0XcJbP1/GN7kXMiRAlPi+fj3uEHrjBD8Oz7Py0prSC25C09NuAZS6bgW1NNKAvCSHZXB0irSGA==", "dev": true, "requires": { - "debug": "3.1.0", - "istanbul-lib-coverage": "1.1.2", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.7" + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.0", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" }, "dependencies": { "debug": { @@ -8163,6 +6364,15 @@ "ms": "2.0.0" } }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -8172,20 +6382,14 @@ } }, "istanbul-reports": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.4.tgz", - "integrity": "sha512-DfSTVOTkuO+kRmbO8Gk650Wqm1WRGr6lrdi2EwDK1vxpS71vdlLd613EpzOKdIFioB5f/scJTjeWBnvd1FWejg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz", + "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==", "dev": true, "requires": { - "handlebars": "4.0.11" + "handlebars": "^4.0.3" } }, - "jest-docblock": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz", - "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==", - "dev": true - }, "jest-get-type": { "version": "21.2.0", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-21.2.0.tgz", @@ -8198,16 +6402,26 @@ "integrity": "sha512-k4HLI1rZQjlU+EC682RlQ6oZvLrE5SCh3brseQc24vbZTxzT/k/3urar5QMCVgjadmSO7lECeGdc6YxnM3yEGg==", "dev": true, "requires": { - "chalk": "2.3.0", - "jest-get-type": "21.2.0", - "leven": "2.1.0", - "pretty-format": "21.2.1" + "chalk": "^2.0.1", + "jest-get-type": "^21.2.0", + "leven": "^2.1.0", + "pretty-format": "^21.2.1" + } + }, + "joi": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-11.4.0.tgz", + "integrity": "sha512-O7Uw+w/zEWgbL6OcHbyACKSj0PkQeUgmehdoXVSxt92QFCq4+1390Rwh5moI2K/OgC7D8RHRZqHZxT2husMJHA==", + "requires": { + "hoek": "4.x.x", + "isemail": "3.x.x", + "topo": "2.x.x" } }, "js-base64": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", - "integrity": "sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw==" + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.8.tgz", + "integrity": "sha512-hm2nYpDrwoO/OzBhdcqs/XGT6XjSuSSCVEpia+Kl2J6x4CYt5hISlVL/AYU1khoDXv0AQVgxtdJySb9gjAn56Q==" }, "js-tokens": { "version": "3.0.2", @@ -8219,8 +6433,8 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", "requires": { - "argparse": "1.0.10", - "esprima": "2.7.3" + "argparse": "^1.0.7", + "esprima": "^2.6.0" }, "dependencies": { "esprima": { @@ -8241,32 +6455,32 @@ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.6.2.tgz", "integrity": "sha512-pAeZhpbSlUp5yQcS6cBQJwkbzmv4tWFaYxHbFVSxzXefqjvtRA851Z5N2P+TguVG9YeUDcgb8pdeVQRJh0XR3Q==", "requires": { - "abab": "1.0.4", - "acorn": "5.5.3", - "acorn-globals": "4.1.0", - "array-equal": "1.0.0", - "browser-process-hrtime": "0.1.2", - "content-type-parser": "1.0.2", - "cssom": "0.3.2", - "cssstyle": "0.2.37", - "domexception": "1.0.1", - "escodegen": "1.9.1", - "html-encoding-sniffer": "1.0.2", - "left-pad": "1.3.0", - "nwmatcher": "1.4.4", + "abab": "^1.0.4", + "acorn": "^5.3.0", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "browser-process-hrtime": "^0.1.2", + "content-type-parser": "^1.0.2", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.2.37 < 0.3.0", + "domexception": "^1.0.0", + "escodegen": "^1.9.0", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.2.0", + "nwmatcher": "^1.4.3", "parse5": "4.0.0", - "pn": "1.1.0", - "request": "2.85.0", - "request-promise-native": "1.0.5", - "sax": "1.2.4", - "symbol-tree": "3.2.2", - "tough-cookie": "2.3.4", - "w3c-hr-time": "1.0.1", - "webidl-conversions": "4.0.2", - "whatwg-encoding": "1.0.3", - "whatwg-url": "6.4.1", - "ws": "4.1.0", - "xml-name-validator": "3.0.0" + "pn": "^1.1.0", + "request": "^2.83.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.3", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-url": "^6.4.0", + "ws": "^4.0.0", + "xml-name-validator": "^3.0.0" } }, "jsesc": { @@ -8284,6 +6498,12 @@ "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -8294,6 +6514,14 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "requires": { + "jsonify": "~0.0.0" + } + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -8309,39 +6537,13 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } }, "jsonify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jspm-config": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/jspm-config/-/jspm-config-0.3.4.tgz", - "integrity": "sha1-RMJpAuSujs4jZs7cn/FrEKXzkcY=", - "dev": true, - "requires": { - "any-promise": "1.3.0", - "graceful-fs": "4.1.11", - "make-error-cause": "1.2.2", - "object.pick": "1.3.0", - "parse-json": "2.2.0", - "strip-bom": "3.0.0", - "thenify": "3.3.0", - "throat": "3.2.0", - "xtend": "4.0.1" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" }, "jsprim": { "version": "1.4.1", @@ -8360,11 +6562,11 @@ "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", "dev": true, "requires": { - "core-js": "2.3.0", - "es6-promise": "3.0.2", - "lie": "3.1.1", - "pako": "1.0.6", - "readable-stream": "2.0.6" + "core-js": "~2.3.0", + "es6-promise": "~3.0.2", + "lie": "~3.1.0", + "pako": "~1.0.2", + "readable-stream": "~2.0.6" }, "dependencies": { "core-js": { @@ -8373,12 +6575,6 @@ "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", "dev": true }, - "es6-promise": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", - "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", - "dev": true - }, "process-nextick-args": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", @@ -8391,12 +6587,12 @@ "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "0.10.31", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -8418,7 +6614,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "klaw": { @@ -8426,7 +6622,7 @@ "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.9" } }, "last-call-webpack-plugin": { @@ -8434,8 +6630,8 @@ "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-2.1.2.tgz", "integrity": "sha512-CZc+m2xZm51J8qSwdODeiiNeqh8CYkKEq6Rw8IkE4i/4yqf2cJhjQPsA6BtAV970ePRNhwEOXhy2U5xc5Jwh9Q==", "requires": { - "lodash": "4.17.10", - "webpack-sources": "1.1.0" + "lodash": "^4.17.4", + "webpack-sources": "^1.0.1" } }, "latest-version": { @@ -8443,7 +6639,7 @@ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-2.0.0.tgz", "integrity": "sha1-VvjWE5YghHuAF/jx9NeOIRMkFos=", "requires": { - "package-json": "2.4.0" + "package-json": "^2.0.0" } }, "lazy-cache": { @@ -8456,7 +6652,7 @@ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "left-pad": { @@ -8475,8 +6671,8 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, "lie": { @@ -8485,7 +6681,7 @@ "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", "dev": true, "requires": { - "immediate": "3.0.6" + "immediate": "~3.0.5" } }, "lint-staged": { @@ -8494,26 +6690,26 @@ "integrity": "sha512-ZUftK94S4vedpQG1LlA2tc2AuQXXBwc+1lB+j8SEfG5+p2dqu3Ug8iYQ8jdap+uLkhDw4OaJXqE+CZ/L+vfv+Q==", "dev": true, "requires": { - "app-root-path": "2.0.1", - "chalk": "2.3.0", - "commander": "2.15.1", - "cosmiconfig": "3.1.0", - "debug": "3.1.0", - "dedent": "0.7.0", - "execa": "0.8.0", - "find-parent-dir": "0.3.0", - "is-glob": "4.0.0", - "jest-validate": "21.2.1", - "listr": "0.13.0", - "lodash": "4.17.10", - "log-symbols": "2.1.0", - "minimatch": "3.0.4", - "npm-which": "3.0.1", - "p-map": "1.2.0", - "path-is-inside": "1.0.2", - "pify": "3.0.0", + "app-root-path": "^2.0.0", + "chalk": "^2.1.0", + "commander": "^2.11.0", + "cosmiconfig": "^3.1.0", + "debug": "^3.1.0", + "dedent": "^0.7.0", + "execa": "^0.8.0", + "find-parent-dir": "^0.3.0", + "is-glob": "^4.0.0", + "jest-validate": "^21.1.0", + "listr": "^0.13.0", + "lodash": "^4.17.4", + "log-symbols": "^2.0.0", + "minimatch": "^3.0.0", + "npm-which": "^3.0.1", + "p-map": "^1.1.1", + "path-is-inside": "^1.0.2", + "pify": "^3.0.0", "staged-git-files": "0.0.4", - "stringify-object": "3.2.2" + "stringify-object": "^3.2.0" }, "dependencies": { "cosmiconfig": { @@ -8522,10 +6718,10 @@ "integrity": "sha512-zedsBhLSbPBms+kE7AH4vHg6JsKDz6epSv2/+5XHs8ILHlgDciSJfSWf8sX9aQ52Jb7KI7VswUTsLpR/G0cr2Q==", "dev": true, "requires": { - "is-directory": "0.3.1", - "js-yaml": "3.11.0", - "parse-json": "3.0.0", - "require-from-string": "2.0.2" + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^3.0.0", + "require-from-string": "^2.0.1" } }, "debug": { @@ -8538,9 +6734,9 @@ } }, "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "is-glob": { @@ -8549,17 +6745,17 @@ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } }, "js-yaml": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", - "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "dev": true, "requires": { - "argparse": "1.0.10", - "esprima": "4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "parse-json": { @@ -8568,7 +6764,7 @@ "integrity": "sha1-+m9HsY4jgm6tMvJj50TQ4ehH+xM=", "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.3.1" } }, "pify": { @@ -8585,35 +6781,29 @@ } } }, - "listify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/listify/-/listify-1.0.0.tgz", - "integrity": "sha1-A8p7otFQ1CZ3c/dOV1WNEFPSvuM=", - "dev": true - }, "listr": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/listr/-/listr-0.13.0.tgz", "integrity": "sha1-ILsLowuuZg7oTMBQPfS+PVYjiH0=", "dev": true, "requires": { - "chalk": "1.1.3", - "cli-truncate": "0.2.1", - "figures": "1.7.0", - "indent-string": "2.1.0", - "is-observable": "0.2.0", - "is-promise": "2.1.0", - "is-stream": "1.1.0", - "listr-silent-renderer": "1.1.1", - "listr-update-renderer": "0.4.0", - "listr-verbose-renderer": "0.4.1", - "log-symbols": "1.0.2", - "log-update": "1.0.2", - "ora": "0.2.3", - "p-map": "1.2.0", - "rxjs": "5.5.10", - "stream-to-observable": "0.2.0", - "strip-ansi": "3.0.1" + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "figures": "^1.7.0", + "indent-string": "^2.1.0", + "is-observable": "^0.2.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.4.0", + "listr-verbose-renderer": "^0.4.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "ora": "^0.2.3", + "p-map": "^1.1.1", + "rxjs": "^5.4.2", + "stream-to-observable": "^0.2.0", + "strip-ansi": "^3.0.1" }, "dependencies": { "ansi-escapes": { @@ -8628,11 +6818,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "cli-cursor": { @@ -8641,7 +6831,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "restore-cursor": "^1.0.1" } }, "cli-spinners": { @@ -8656,8 +6846,8 @@ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, "log-symbols": { @@ -8666,7 +6856,7 @@ "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", "dev": true, "requires": { - "chalk": "1.1.3" + "chalk": "^1.0.0" } }, "log-update": { @@ -8675,8 +6865,8 @@ "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", "dev": true, "requires": { - "ansi-escapes": "1.4.0", - "cli-cursor": "1.0.2" + "ansi-escapes": "^1.0.0", + "cli-cursor": "^1.0.2" } }, "onetime": { @@ -8691,10 +6881,10 @@ "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", "dev": true, "requires": { - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-spinners": "0.1.2", - "object-assign": "4.1.1" + "chalk": "^1.1.1", + "cli-cursor": "^1.0.2", + "cli-spinners": "^0.1.2", + "object-assign": "^4.0.1" } }, "restore-cursor": { @@ -8703,8 +6893,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" } }, "strip-ansi": { @@ -8713,7 +6903,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } @@ -8730,14 +6920,14 @@ "integrity": "sha1-NE2YDaLKLosUW6MFkI8yrj9MyKc=", "dev": true, "requires": { - "chalk": "1.1.3", - "cli-truncate": "0.2.1", - "elegant-spinner": "1.0.1", - "figures": "1.7.0", - "indent-string": "3.2.0", - "log-symbols": "1.0.2", - "log-update": "1.0.2", - "strip-ansi": "3.0.1" + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "strip-ansi": "^3.0.1" }, "dependencies": { "ansi-escapes": { @@ -8752,11 +6942,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "cli-cursor": { @@ -8765,7 +6955,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "restore-cursor": "^1.0.1" } }, "figures": { @@ -8774,8 +6964,8 @@ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, "indent-string": { @@ -8790,7 +6980,7 @@ "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", "dev": true, "requires": { - "chalk": "1.1.3" + "chalk": "^1.0.0" } }, "log-update": { @@ -8799,8 +6989,8 @@ "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", "dev": true, "requires": { - "ansi-escapes": "1.4.0", - "cli-cursor": "1.0.2" + "ansi-escapes": "^1.0.0", + "cli-cursor": "^1.0.2" } }, "onetime": { @@ -8815,8 +7005,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" } }, "strip-ansi": { @@ -8825,7 +7015,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } @@ -8836,10 +7026,10 @@ "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", "dev": true, "requires": { - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "date-fns": "1.29.0", - "figures": "1.7.0" + "chalk": "^1.1.3", + "cli-cursor": "^1.0.2", + "date-fns": "^1.27.2", + "figures": "^1.7.0" }, "dependencies": { "chalk": { @@ -8848,11 +7038,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "cli-cursor": { @@ -8861,7 +7051,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "restore-cursor": "^1.0.1" } }, "figures": { @@ -8870,8 +7060,8 @@ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, "onetime": { @@ -8886,8 +7076,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" } }, "strip-ansi": { @@ -8896,27 +7086,21 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } }, - "livereload-js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.3.0.tgz", - "integrity": "sha512-j1R0/FeGa64Y+NmqfZhyoVRzcFlOZ8sNlKzHjh4VvLULFACZhn68XrX5DFg2FhMvSMJmROuFxRSa560ECWKBMg==", - "dev": true - }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, "loader-runner": { @@ -8929,9 +7113,9 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" } }, "locate-path": { @@ -8939,8 +7123,8 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "dependencies": { "path-exists": { @@ -8950,15 +7134,6 @@ } } }, - "lockfile": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", - "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", - "dev": true, - "requires": { - "signal-exit": "3.0.2" - } - }, "lodash": { "version": "4.17.10", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", @@ -8974,6 +7149,11 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", @@ -8995,8 +7175,8 @@ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.templatesettings": "4.1.0" + "lodash._reinterpolate": "~3.0.0", + "lodash.templatesettings": "^4.0.0" } }, "lodash.templatesettings": { @@ -9004,7 +7184,7 @@ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", "requires": { - "lodash._reinterpolate": "3.0.0" + "lodash._reinterpolate": "~3.0.0" } }, "lodash.uniq": { @@ -9017,7 +7197,7 @@ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.1.0.tgz", "integrity": "sha512-zLeLrzMA1A2vRF1e/0Mo+LNINzi6jzBylHj5WqvQ/WK/5WCZt8si9SyN4p9llr/HRYvVR1AoXHRHl4WTHyQAzQ==", "requires": { - "chalk": "2.3.0" + "chalk": "^2.0.1" } }, "log-update": { @@ -9025,9 +7205,9 @@ "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", "requires": { - "ansi-escapes": "3.1.0", - "cli-cursor": "2.1.0", - "wrap-ansi": "3.0.1" + "ansi-escapes": "^3.0.0", + "cli-cursor": "^2.0.0", + "wrap-ansi": "^3.0.1" }, "dependencies": { "is-fullwidth-code-point": { @@ -9040,8 +7220,8 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "wrap-ansi": { @@ -9049,8 +7229,8 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" } } } @@ -9060,14 +7240,14 @@ "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-1.0.5.tgz", "integrity": "sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==", "requires": { - "es6-symbol": "3.1.1", - "object.assign": "4.1.0" + "es6-symbol": "^3.1.1", + "object.assign": "^4.1.0" } }, "lolex": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.3.2.tgz", - "integrity": "sha512-A5pN2tkFj7H0dGIAM6MFvHKMJcPnjZsOMvR7ujCjfgW5TbV6H9vb1PgxLtHvjqNZTHsUolz+6/WEO0N1xNx2ng==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.1.tgz", + "integrity": "sha512-Oo2Si3RMKV3+lV5MsSWplDQFoTClz/24S0MMHYcgGWWmFXr6TMlqcqk/l1GtH+d5wLBwNRiqGnwDRMirtFalJw==", "dev": true }, "longest": { @@ -9076,12 +7256,12 @@ "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" }, "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "requires": { - "js-tokens": "3.0.2" + "js-tokens": "^3.0.0 || ^4.0.0" } }, "loud-rejection": { @@ -9089,8 +7269,8 @@ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" } }, "lower-case": { @@ -9104,25 +7284,20 @@ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, "lru-cache": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", - "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, - "macaddress": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", - "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=" - }, "make-dir": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", - "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" }, "dependencies": { "pify": { @@ -9132,21 +7307,6 @@ } } }, - "make-error": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", - "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", - "dev": true - }, - "make-error-cause": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-1.2.2.tgz", - "integrity": "sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0=", - "dev": true, - "requires": { - "make-error": "1.3.4" - } - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -9157,32 +7317,37 @@ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "dev": true + }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "requires": { - "object-visit": "1.0.1" + "object-visit": "^1.0.0" } }, - "marked": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", - "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", - "dev": true - }, "math-expression-evaluator": { "version": "1.2.17", "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=" }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=" + }, "md5.js": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, "media-typer": { @@ -9195,7 +7360,7 @@ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" } }, "memory-fs": { @@ -9203,25 +7368,38 @@ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.6" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true + }, "meow": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } } }, "merge-descriptors": { @@ -9239,19 +7417,19 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" }, "dependencies": { "is-extglob": { @@ -9264,7 +7442,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } } } @@ -9274,8 +7452,8 @@ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" } }, "mime": { @@ -9284,16 +7462,16 @@ "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" }, "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", + "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==" }, "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "version": "2.1.19", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", + "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", "requires": { - "mime-db": "1.33.0" + "mime-db": "~1.35.0" } }, "mimic-fn": { @@ -9316,29 +7494,29 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mississippi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", "requires": { - "concat-stream": "1.6.2", - "duplexify": "3.5.4", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.3", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "2.0.1", - "pumpify": "1.4.0", - "stream-each": "1.2.2", - "through2": "2.0.3" + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" } }, "mixin-deep": { @@ -9346,8 +7524,8 @@ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -9355,24 +7533,26 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", "requires": { "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } + } + }, + "mock-require": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mock-require/-/mock-require-2.0.2.tgz", + "integrity": "sha1-HqpxqtIwE3c9En3H6Ro/u0g31g0=", + "dev": true, + "requires": { + "caller-id": "^0.1.0" } }, "mockery": { @@ -9386,12 +7566,22 @@ "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "requires": { - "aproba": "1.2.0", - "copy-concurrently": "1.0.5", - "fs-write-stream-atomic": "1.0.10", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + } } }, "ms": { @@ -9412,22 +7602,21 @@ "optional": true }, "nanomatch": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", - "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-odd": "2.0.0", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "arr-diff": { @@ -9447,12 +7636,6 @@ } } }, - "ncp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.5.1.tgz", - "integrity": "sha1-dDmFMW49tFkoG1hxaehFc1oFQ58=", - "dev": true - }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", @@ -9468,17 +7651,23 @@ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" }, + "nice-try": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", + "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", + "dev": true + }, "nise": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.3.3.tgz", - "integrity": "sha512-v1J/FLUB9PfGqZLGDBhQqODkbLotP0WtLo9R4EJY2PPu5f5Xg4o0rA8FDlmrjFSv9vBBKcfnOSpfYYuu5RTHqg==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.2.tgz", + "integrity": "sha512-BxH/DxoQYYdhKgVAfqVy4pzXRZELHOIewzoesxpjYvpU+7YOalQhGNPf7wAx8pLrTNPrHRDlLOkAl8UI0ZpXjw==", "dev": true, "requires": { - "@sinonjs/formatio": "2.0.0", - "just-extend": "1.1.27", - "lolex": "2.3.2", - "path-to-regexp": "1.7.0", - "text-encoding": "0.6.4" + "@sinonjs/formatio": "^2.0.0", + "just-extend": "^1.1.27", + "lolex": "^2.3.2", + "path-to-regexp": "^1.7.0", + "text-encoding": "^0.6.4" }, "dependencies": { "isarray": { @@ -9503,7 +7692,7 @@ "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "requires": { - "lower-case": "1.1.4" + "lower-case": "^1.1.1" } }, "node-dir": { @@ -9511,7 +7700,7 @@ "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=", "requires": { - "minimatch": "3.0.4" + "minimatch": "^3.0.2" } }, "node-libs-browser": { @@ -9519,28 +7708,28 @@ "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.2.0", - "events": "1.1.1", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.6", - "stream-browserify": "2.0.1", - "stream-http": "2.8.1", - "string_decoder": "1.1.1", - "timers-browserify": "2.0.10", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", + "url": "^0.11.0", + "util": "^0.10.3", "vm-browserify": "0.0.4" } }, @@ -9549,19 +7738,12 @@ "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=" }, - "node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", - "dev": true - }, "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "dev": true, + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "requires": { - "abbrev": "1.1.1" + "abbrev": "1" } }, "normalize-package-data": { @@ -9569,10 +7751,10 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "requires": { - "hosted-git-info": "2.6.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { @@ -9580,7 +7762,7 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } }, "normalize-range": { @@ -9593,10 +7775,10 @@ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", "requires": { - "object-assign": "4.1.1", - "prepend-http": "1.0.4", - "query-string": "4.3.4", - "sort-keys": "1.1.2" + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" } }, "npm-path": { @@ -9605,7 +7787,102 @@ "integrity": "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==", "dev": true, "requires": { - "which": "1.3.0" + "which": "^1.2.10" + } + }, + "npm-run-all": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.3.tgz", + "integrity": "sha512-aOG0N3Eo/WW+q6sUIdzcV2COS8VnTZCmdji0VQIAZF3b+a3YWb0AD0vFIyjKec18A7beLGbaQ5jFTNI2bPt9Cg==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.4", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "ps-tree": "^1.1.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } } }, "npm-run-path": { @@ -9613,7 +7890,7 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "npm-which": { @@ -9622,9 +7899,9 @@ "integrity": "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=", "dev": true, "requires": { - "commander": "2.15.1", - "npm-path": "2.0.4", - "which": "1.3.0" + "commander": "^2.9.0", + "npm-path": "^2.0.2", + "which": "^1.2.10" } }, "nth-check": { @@ -9632,7 +7909,7 @@ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", "requires": { - "boolbase": "1.0.0" + "boolbase": "~1.0.0" } }, "num2fraction": { @@ -9665,9 +7942,9 @@ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { "define-property": { @@ -9675,22 +7952,22 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } }, "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==" }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.0" }, "dependencies": { "isobject": { @@ -9705,10 +7982,10 @@ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "requires": { - "define-properties": "1.1.2", - "function-bind": "1.1.1", - "has-symbols": "1.0.0", - "object-keys": "1.0.11" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" } }, "object.omit": { @@ -9716,8 +7993,8 @@ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" } }, "object.pick": { @@ -9725,7 +8002,7 @@ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" }, "dependencies": { "isobject": { @@ -9748,7 +8025,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onecolor": { @@ -9761,7 +8038,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" } }, "opener": { @@ -9775,16 +8052,10 @@ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "minimist": "0.0.10", - "wordwrap": "0.0.3" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" }, "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", @@ -9798,8 +8069,8 @@ "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-3.2.0.tgz", "integrity": "sha512-Fjn7wyyadPAriuH2DHamDQw5B8GohEWbroBkKoPeP+vSF2PIAPI7WDihi8WieMRb/At4q7Ea7zTKaMDuSoIAAg==", "requires": { - "cssnano": "3.10.0", - "last-call-webpack-plugin": "2.1.2" + "cssnano": "^3.4.0", + "last-call-webpack-plugin": "^2.1.2" } }, "optionator": { @@ -9807,12 +8078,12 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" } }, "ora": { @@ -9820,10 +8091,10 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-1.3.0.tgz", "integrity": "sha1-gAeN0rkqk0r2ajrXKluRBpTt5Ro=", "requires": { - "chalk": "1.1.3", - "cli-cursor": "2.1.0", - "cli-spinners": "1.3.1", - "log-symbols": "1.0.2" + "chalk": "^1.1.1", + "cli-cursor": "^2.1.0", + "cli-spinners": "^1.0.0", + "log-symbols": "^1.0.2" }, "dependencies": { "chalk": { @@ -9831,11 +8102,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "log-symbols": { @@ -9843,7 +8114,7 @@ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", "requires": { - "chalk": "1.1.3" + "chalk": "^1.0.0" } }, "strip-ansi": { @@ -9851,7 +8122,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } @@ -9871,9 +8142,9 @@ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" }, "dependencies": { "execa": { @@ -9881,13 +8152,13 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } } } @@ -9902,8 +8173,8 @@ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "p-finally": { @@ -9912,11 +8183,11 @@ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "requires": { - "p-try": "1.0.0" + "p-try": "^1.0.0" } }, "p-locate": { @@ -9924,7 +8195,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { - "p-limit": "1.2.0" + "p-limit": "^1.1.0" } }, "p-map": { @@ -9943,10 +8214,10 @@ "resolved": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz", "integrity": "sha1-DRW9Z9HLvduyyiIv8u24a8sxqLs=", "requires": { - "got": "5.7.1", - "registry-auth-token": "3.3.2", - "registry-url": "3.1.0", - "semver": "5.5.0" + "got": "^5.0.0", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" } }, "pako": { @@ -9959,9 +8230,9 @@ "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" } }, "param-case": { @@ -9969,7 +8240,7 @@ "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", "requires": { - "no-case": "2.3.2" + "no-case": "^2.2.0" } }, "parse-asn1": { @@ -9977,34 +8248,22 @@ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "requires": { - "asn1.js": "4.10.1", - "browserify-aes": "1.2.0", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.16" + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" } }, "parse-git-config": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-0.4.3.tgz", - "integrity": "sha1-Z9YiSN1aJOYFP4R1EF8fuelLuwA=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-2.0.2.tgz", + "integrity": "sha512-ObBoF8oac1DKo78J6R+O9KwhMNL0yCmizi4/WKyB6rQXNHe4SmLMhnLrpPogWT2BbJUx1LcIzec/ftAiveSVhQ==", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "fs-exists-sync": "0.1.0", - "git-config-path": "1.0.1", - "ini": "1.3.5" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } + "expand-tilde": "^2.0.2", + "git-config-path": "^1.0.1", + "ini": "^1.3.5" } }, "parse-glob": { @@ -10012,10 +8271,10 @@ "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" }, "dependencies": { "is-extglob": { @@ -10028,7 +8287,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } } } @@ -10038,7 +8297,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.2.0" } }, "parse-passwd": { @@ -10077,7 +8336,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { @@ -10111,9 +8370,9 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "pathval": { @@ -10122,16 +8381,25 @@ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "requires": { + "through": "~2.3" + } + }, "pbkdf2": { "version": "3.0.16", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", "requires": { - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "pend": { @@ -10165,7 +8433,7 @@ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pixrem": { @@ -10173,9 +8441,9 @@ "resolved": "https://registry.npmjs.org/pixrem/-/pixrem-4.0.1.tgz", "integrity": "sha1-LaSh3m7EQjxfw3lOkwuB1EkOxoY=", "requires": { - "browserslist": "2.11.3", - "postcss": "6.0.1", - "reduce-css-calc": "1.3.0" + "browserslist": "^2.0.0", + "postcss": "^6.0.0", + "reduce-css-calc": "^1.2.7" }, "dependencies": { "browserslist": { @@ -10183,8 +8451,8 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", "requires": { - "caniuse-lite": "1.0.30000833", - "electron-to-chromium": "1.3.45" + "caniuse-lite": "^1.0.30000792", + "electron-to-chromium": "^1.3.30" } } } @@ -10194,7 +8462,7 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "requires": { - "find-up": "2.1.0" + "find-up": "^2.1.0" }, "dependencies": { "find-up": { @@ -10202,7 +8470,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } } } @@ -10218,54 +8486,8 @@ "resolved": "https://registry.npmjs.org/pleeease-filters/-/pleeease-filters-4.0.0.tgz", "integrity": "sha1-ZjKy+wVkjSdY2GU4T7zteeHMrsc=", "requires": { - "onecolor": "3.0.5", - "postcss": "6.0.1" - } - }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "dev": true, - "requires": { - "ansi-cyan": "0.1.1", - "ansi-red": "0.1.1", - "arr-diff": "1.1.0", - "arr-union": "2.1.0", - "extend-shallow": "1.1.4" - }, - "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "1.1.0", - "array-slice": "0.2.3" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "1.1.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true - } + "onecolor": "^3.0.4", + "postcss": "^6.0.1" } }, "pn": { @@ -10273,50 +8495,6 @@ "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" }, - "popsicle": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/popsicle/-/popsicle-9.2.0.tgz", - "integrity": "sha512-petRj39w05GvH1WKuGFmzxR9+k+R9E7zX5XWTFee7P/qf88hMuLT7aAO/RsmldpQMtJsWQISkTQlfMRECKlxhw==", - "dev": true, - "requires": { - "concat-stream": "1.6.2", - "form-data": "2.3.2", - "make-error-cause": "1.2.2", - "tough-cookie": "2.3.4" - } - }, - "popsicle-proxy-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/popsicle-proxy-agent/-/popsicle-proxy-agent-3.0.0.tgz", - "integrity": "sha1-uRM8VdlFdZq37mG3cRNkYg066tw=", - "dev": true, - "requires": { - "http-proxy-agent": "1.0.0", - "https-proxy-agent": "1.0.0" - } - }, - "popsicle-retry": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/popsicle-retry/-/popsicle-retry-3.2.1.tgz", - "integrity": "sha1-4G6GZTO0KnoSPrMwy+Y6fOvLoQw=", - "dev": true, - "requires": { - "any-promise": "1.3.0", - "xtend": "4.0.1" - } - }, - "popsicle-rewrite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/popsicle-rewrite/-/popsicle-rewrite-1.0.0.tgz", - "integrity": "sha1-HdTo6pwxgjUfuCD4eTTZkvf7kAc=", - "dev": true - }, - "popsicle-status": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/popsicle-status/-/popsicle-status-2.0.1.tgz", - "integrity": "sha1-jdcMT+fGlBCa3XhP/oDqysHnso0=", - "dev": true - }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -10327,9 +8505,9 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.1.tgz", "integrity": "sha1-AA29H47vIXqjaLmiEsX8QLKo8/I=", "requires": { - "chalk": "1.1.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" }, "dependencies": { "chalk": { @@ -10337,11 +8515,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -10366,7 +8544,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -10374,7 +8552,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -10384,9 +8562,9 @@ "resolved": "https://registry.npmjs.org/postcss-apply/-/postcss-apply-0.8.0.tgz", "integrity": "sha1-FOVEu7XLbxweBIhXll15rgZrE0M=", "requires": { - "babel-runtime": "6.26.0", - "balanced-match": "0.4.2", - "postcss": "6.0.1" + "babel-runtime": "^6.23.0", + "balanced-match": "^0.4.2", + "postcss": "^6.0.0" }, "dependencies": { "balanced-match": { @@ -10401,8 +8579,8 @@ "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-2.0.0.tgz", "integrity": "sha1-lNxCLI+QmX8WvTOjZUu77AhJY7Q=", "requires": { - "postcss": "6.0.1", - "postcss-selector-parser": "2.2.3" + "postcss": "^6.0.0", + "postcss-selector-parser": "^2.2.3" } }, "postcss-calc": { @@ -10410,9 +8588,9 @@ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", "requires": { - "postcss": "5.2.18", - "postcss-message-helpers": "2.0.0", - "reduce-css-calc": "1.3.0" + "postcss": "^5.0.2", + "postcss-message-helpers": "^2.0.0", + "reduce-css-calc": "^1.2.6" }, "dependencies": { "chalk": { @@ -10420,11 +8598,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -10444,10 +8622,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -10460,7 +8638,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -10468,7 +8646,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -10478,10 +8656,10 @@ "resolved": "https://registry.npmjs.org/postcss-color-function/-/postcss-color-function-4.0.1.tgz", "integrity": "sha1-QCs/LOvD9pR+YY+2vjZU++zvZEQ=", "requires": { - "css-color-function": "1.3.3", - "postcss": "6.0.1", - "postcss-message-helpers": "2.0.0", - "postcss-value-parser": "3.3.0" + "css-color-function": "~1.3.3", + "postcss": "^6.0.1", + "postcss-message-helpers": "^2.0.0", + "postcss-value-parser": "^3.3.0" } }, "postcss-color-gray": { @@ -10489,37 +8667,19 @@ "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-4.1.0.tgz", "integrity": "sha512-L4iLKQLdqChz6ZOgGb6dRxkBNw78JFYcJmBz1orHpZoeLtuhDDGegRtX9gSyfoCIM7rWZ3VNOyiqqvk83BEN+w==", "requires": { - "color": "2.0.1", - "postcss": "6.0.22", - "postcss-message-helpers": "2.0.0", - "reduce-function-call": "1.0.2" + "color": "^2.0.1", + "postcss": "^6.0.14", + "postcss-message-helpers": "^2.0.0", + "reduce-function-call": "^1.0.2" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, "color": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color/-/color-2.0.1.tgz", "integrity": "sha512-ubUCVVKfT7r2w2D3qtHakj8mbmKms+tThR8gI8zEYCbUBl8/voqFGt3kgBqGwXAopgXybnkuOq+qMYCRrp4cXw==", "requires": { - "color-convert": "1.9.1", - "color-string": "1.5.2" + "color-convert": "^1.9.1", + "color-string": "^1.5.2" } }, "color-string": { @@ -10527,23 +8687,18 @@ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.2.tgz", "integrity": "sha1-JuRYFLw8mny9Z1FkikFDRRSnc6k=", "requires": { - "color-name": "1.1.3", - "simple-swizzle": "0.2.2" + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, "postcss": { - "version": "6.0.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", - "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.4.0" + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" } }, "supports-color": { @@ -10551,7 +8706,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -10561,9 +8716,9 @@ "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-3.0.0.tgz", "integrity": "sha1-HlPmyKyyN5Vej9CLfs2xuLgwn5U=", "requires": { - "color": "1.0.3", - "postcss": "6.0.1", - "postcss-message-helpers": "2.0.0" + "color": "^1.0.3", + "postcss": "^6.0.1", + "postcss-message-helpers": "^2.0.0" }, "dependencies": { "color": { @@ -10571,8 +8726,8 @@ "resolved": "https://registry.npmjs.org/color/-/color-1.0.3.tgz", "integrity": "sha1-5I6DLYXxTvaU+0aIEcLVz+cptV0=", "requires": { - "color-convert": "1.9.1", - "color-string": "1.5.2" + "color-convert": "^1.8.2", + "color-string": "^1.4.0" } }, "color-string": { @@ -10580,8 +8735,8 @@ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.2.tgz", "integrity": "sha1-JuRYFLw8mny9Z1FkikFDRRSnc6k=", "requires": { - "color-name": "1.1.3", - "simple-swizzle": "0.2.2" + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" } } } @@ -10591,9 +8746,9 @@ "resolved": "https://registry.npmjs.org/postcss-color-hsl/-/postcss-color-hsl-2.0.0.tgz", "integrity": "sha1-EnA2ZvoxBDDj8wpFTawThjF9WEQ=", "requires": { - "postcss": "6.0.1", - "postcss-value-parser": "3.3.0", - "units-css": "0.4.0" + "postcss": "^6.0.1", + "postcss-value-parser": "^3.3.0", + "units-css": "^0.4.0" } }, "postcss-color-hwb": { @@ -10601,10 +8756,10 @@ "resolved": "https://registry.npmjs.org/postcss-color-hwb/-/postcss-color-hwb-3.0.0.tgz", "integrity": "sha1-NAKxnvTYSXVAwftQcr6YY8qVVx4=", "requires": { - "color": "1.0.3", - "postcss": "6.0.1", - "postcss-message-helpers": "2.0.0", - "reduce-function-call": "1.0.2" + "color": "^1.0.3", + "postcss": "^6.0.1", + "postcss-message-helpers": "^2.0.0", + "reduce-function-call": "^1.0.2" }, "dependencies": { "color": { @@ -10612,8 +8767,8 @@ "resolved": "https://registry.npmjs.org/color/-/color-1.0.3.tgz", "integrity": "sha1-5I6DLYXxTvaU+0aIEcLVz+cptV0=", "requires": { - "color-convert": "1.9.1", - "color-string": "1.5.2" + "color-convert": "^1.8.2", + "color-string": "^1.4.0" } }, "color-string": { @@ -10621,8 +8776,8 @@ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.2.tgz", "integrity": "sha1-JuRYFLw8mny9Z1FkikFDRRSnc6k=", "requires": { - "color-name": "1.1.3", - "simple-swizzle": "0.2.2" + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" } } } @@ -10632,41 +8787,18 @@ "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-3.1.0.tgz", "integrity": "sha512-212hJUk9uSsbwO5ECqVjmh/iLsmiVL1xy9ce9TVf+X3cK/ZlUIlaMdoxje/YpsL9cmUH3I7io+/G2LyWx5rg1g==", "requires": { - "postcss": "6.0.22", - "postcss-values-parser": "1.5.0" + "postcss": "^6.0.22", + "postcss-values-parser": "^1.5.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, "postcss": { - "version": "6.0.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", - "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.4.0" + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" } }, "supports-color": { @@ -10674,7 +8806,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -10684,8 +8816,8 @@ "resolved": "https://registry.npmjs.org/postcss-color-rgb/-/postcss-color-rgb-2.0.0.tgz", "integrity": "sha1-FFOcinExSUtILg3RzCZf9lFLUmM=", "requires": { - "postcss": "6.0.1", - "postcss-value-parser": "3.3.0" + "postcss": "^6.0.1", + "postcss-value-parser": "^3.3.0" } }, "postcss-color-rgba-fallback": { @@ -10693,42 +8825,19 @@ "resolved": "https://registry.npmjs.org/postcss-color-rgba-fallback/-/postcss-color-rgba-fallback-3.0.0.tgz", "integrity": "sha1-N9XJNToHoJJwkSqCYGu0Kg1wLAQ=", "requires": { - "postcss": "6.0.22", - "postcss-value-parser": "3.3.0", - "rgb-hex": "2.1.0" + "postcss": "^6.0.6", + "postcss-value-parser": "^3.3.0", + "rgb-hex": "^2.1.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, "postcss": { - "version": "6.0.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", - "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.4.0" + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" } }, "supports-color": { @@ -10736,7 +8845,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -10746,9 +8855,9 @@ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", "requires": { - "colormin": "1.1.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "colormin": "^1.0.5", + "postcss": "^5.0.13", + "postcss-value-parser": "^3.2.3" }, "dependencies": { "chalk": { @@ -10756,11 +8865,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -10780,10 +8889,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -10796,7 +8905,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -10804,7 +8913,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -10814,8 +8923,8 @@ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "postcss": "^5.0.11", + "postcss-value-parser": "^3.1.2" }, "dependencies": { "chalk": { @@ -10823,11 +8932,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -10847,10 +8956,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -10863,7 +8972,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -10871,7 +8980,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -10881,58 +8990,50 @@ "resolved": "https://registry.npmjs.org/postcss-cssnext/-/postcss-cssnext-3.1.0.tgz", "integrity": "sha512-awPDhI4OKetcHCr560iVCoDuP6e/vn0r6EAqdWPpAavJMvkBSZ6kDpSN4b3mB3Ti57hQMunHHM8Wvx9PeuYXtA==", "requires": { - "autoprefixer": "7.2.6", - "caniuse-api": "2.0.0", - "chalk": "2.3.0", - "pixrem": "4.0.1", - "pleeease-filters": "4.0.0", - "postcss": "6.0.22", - "postcss-apply": "0.8.0", - "postcss-attribute-case-insensitive": "2.0.0", - "postcss-calc": "6.0.1", - "postcss-color-function": "4.0.1", - "postcss-color-gray": "4.1.0", - "postcss-color-hex-alpha": "3.0.0", - "postcss-color-hsl": "2.0.0", - "postcss-color-hwb": "3.0.0", - "postcss-color-rebeccapurple": "3.1.0", - "postcss-color-rgb": "2.0.0", - "postcss-color-rgba-fallback": "3.0.0", - "postcss-custom-media": "6.0.0", - "postcss-custom-properties": "6.3.1", - "postcss-custom-selectors": "4.0.1", - "postcss-font-family-system-ui": "3.0.0", - "postcss-font-variant": "3.0.0", - "postcss-image-set-polyfill": "0.3.5", - "postcss-initial": "2.0.0", - "postcss-media-minmax": "3.0.0", - "postcss-nesting": "4.2.1", - "postcss-pseudo-class-any-link": "4.0.0", - "postcss-pseudoelements": "5.0.0", - "postcss-replace-overflow-wrap": "2.0.0", - "postcss-selector-matches": "3.0.1", - "postcss-selector-not": "3.0.1" + "autoprefixer": "^7.1.1", + "caniuse-api": "^2.0.0", + "chalk": "^2.0.1", + "pixrem": "^4.0.0", + "pleeease-filters": "^4.0.0", + "postcss": "^6.0.5", + "postcss-apply": "^0.8.0", + "postcss-attribute-case-insensitive": "^2.0.0", + "postcss-calc": "^6.0.0", + "postcss-color-function": "^4.0.0", + "postcss-color-gray": "^4.0.0", + "postcss-color-hex-alpha": "^3.0.0", + "postcss-color-hsl": "^2.0.0", + "postcss-color-hwb": "^3.0.0", + "postcss-color-rebeccapurple": "^3.0.0", + "postcss-color-rgb": "^2.0.0", + "postcss-color-rgba-fallback": "^3.0.0", + "postcss-custom-media": "^6.0.0", + "postcss-custom-properties": "^6.1.0", + "postcss-custom-selectors": "^4.0.1", + "postcss-font-family-system-ui": "^3.0.0", + "postcss-font-variant": "^3.0.0", + "postcss-image-set-polyfill": "^0.3.5", + "postcss-initial": "^2.0.0", + "postcss-media-minmax": "^3.0.0", + "postcss-nesting": "^4.0.1", + "postcss-pseudo-class-any-link": "^4.0.0", + "postcss-pseudoelements": "^5.0.0", + "postcss-replace-overflow-wrap": "^2.0.0", + "postcss-selector-matches": "^3.0.1", + "postcss-selector-not": "^3.0.1" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "1.9.1" - } - }, "autoprefixer": { "version": "7.2.6", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", "requires": { - "browserslist": "2.11.3", - "caniuse-lite": "1.0.30000833", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "6.0.22", - "postcss-value-parser": "3.3.0" + "browserslist": "^2.11.3", + "caniuse-lite": "^1.0.30000805", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^6.0.17", + "postcss-value-parser": "^3.2.3" } }, "browserslist": { @@ -10940,8 +9041,8 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", "requires": { - "caniuse-lite": "1.0.30000833", - "electron-to-chromium": "1.3.45" + "caniuse-lite": "^1.0.30000792", + "electron-to-chromium": "^1.3.30" } }, "caniuse-api": { @@ -10949,37 +9050,20 @@ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-2.0.0.tgz", "integrity": "sha1-sd21pZZrFvSNxJmERNS7xsfZ2DQ=", "requires": { - "browserslist": "2.11.3", - "caniuse-lite": "1.0.30000833", - "lodash.memoize": "4.1.2", - "lodash.uniq": "4.5.0" + "browserslist": "^2.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, "postcss": { - "version": "6.0.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", - "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.4.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - } + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" } }, "postcss-calc": { @@ -10987,10 +9071,10 @@ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-6.0.1.tgz", "integrity": "sha1-PSQXG79udinUIqQ26/5t2VEfQzA=", "requires": { - "css-unit-converter": "1.1.1", - "postcss": "6.0.22", - "postcss-selector-parser": "2.2.3", - "reduce-css-calc": "2.1.4" + "css-unit-converter": "^1.1.1", + "postcss": "^6.0.0", + "postcss-selector-parser": "^2.2.2", + "reduce-css-calc": "^2.0.0" } }, "reduce-css-calc": { @@ -10998,8 +9082,8 @@ "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.4.tgz", "integrity": "sha512-i/vWQbyd3aJRmip9OVSN9V6nIjLf/gg/ctxb0CpvHWtcRysFl/ngDBQD+rqavxdw/doScA3GMBXhzkHQ4GCzFQ==", "requires": { - "css-unit-converter": "1.1.1", - "postcss-value-parser": "3.3.0" + "css-unit-converter": "^1.1.1", + "postcss-value-parser": "^3.3.0" } }, "supports-color": { @@ -11007,7 +9091,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -11017,7 +9101,7 @@ "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-6.0.0.tgz", "integrity": "sha1-vlMnhBEOyylQRPtTlaGABushpzc=", "requires": { - "postcss": "6.0.1" + "postcss": "^6.0.1" } }, "postcss-custom-properties": { @@ -11025,41 +9109,18 @@ "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-6.3.1.tgz", "integrity": "sha512-zoiwn4sCiUFbr4KcgcNZLFkR6gVQom647L+z1p/KBVHZ1OYwT87apnS42atJtx6XlX2yI7N5fjXbFixShQO2QQ==", "requires": { - "balanced-match": "1.0.0", - "postcss": "6.0.22" + "balanced-match": "^1.0.0", + "postcss": "^6.0.18" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, "postcss": { - "version": "6.0.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", - "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.4.0" + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" } }, "supports-color": { @@ -11067,7 +9128,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -11077,8 +9138,8 @@ "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-4.0.1.tgz", "integrity": "sha1-eBOC+UxS5yfvXKR3bqKt9JphE4I=", "requires": { - "postcss": "6.0.1", - "postcss-selector-matches": "3.0.1" + "postcss": "^6.0.1", + "postcss-selector-matches": "^3.0.0" } }, "postcss-discard-comments": { @@ -11086,7 +9147,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.14" }, "dependencies": { "chalk": { @@ -11094,11 +9155,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -11118,10 +9179,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -11134,7 +9195,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -11142,7 +9203,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -11152,7 +9213,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.4" }, "dependencies": { "chalk": { @@ -11160,11 +9221,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -11184,10 +9245,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -11200,7 +9261,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -11208,7 +9269,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -11218,7 +9279,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.14" }, "dependencies": { "chalk": { @@ -11226,11 +9287,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -11250,10 +9311,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -11266,7 +9327,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -11274,7 +9335,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -11284,7 +9345,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.16" }, "dependencies": { "chalk": { @@ -11292,11 +9353,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -11316,10 +9377,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -11332,7 +9393,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -11340,7 +9401,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -11350,8 +9411,8 @@ "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", "requires": { - "postcss": "5.2.18", - "uniqs": "2.0.0" + "postcss": "^5.0.14", + "uniqs": "^2.0.0" }, "dependencies": { "chalk": { @@ -11359,11 +9420,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -11383,10 +9444,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -11399,7 +9460,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -11407,18 +9468,17 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "postcss-filter-plugins": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", - "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz", + "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", "requires": { - "postcss": "5.2.18", - "uniqid": "4.1.1" + "postcss": "^5.0.4" }, "dependencies": { "chalk": { @@ -11426,11 +9486,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -11450,10 +9510,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -11466,7 +9526,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -11474,7 +9534,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -11484,7 +9544,7 @@ "resolved": "https://registry.npmjs.org/postcss-font-family-system-ui/-/postcss-font-family-system-ui-3.0.0.tgz", "integrity": "sha512-58G/hTxMSSKlIRpcPUjlyo6hV2MEzvcVO2m4L/T7Bb2fJTG4DYYfQjQeRvuimKQh1V1sOzCIz99g+H2aFNtlQw==", "requires": { - "postcss": "6.0.1" + "postcss": "^6.0" } }, "postcss-font-variant": { @@ -11492,7 +9552,7 @@ "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-3.0.0.tgz", "integrity": "sha1-CMzIj2BQuoLtjvLMdsDGprQfGD4=", "requires": { - "postcss": "6.0.1" + "postcss": "^6.0.1" } }, "postcss-image-set-polyfill": { @@ -11500,8 +9560,8 @@ "resolved": "https://registry.npmjs.org/postcss-image-set-polyfill/-/postcss-image-set-polyfill-0.3.5.tgz", "integrity": "sha1-Dxk0E3AM8fgr05Bm7wFtZaShgYE=", "requires": { - "postcss": "6.0.1", - "postcss-media-query-parser": "0.2.3" + "postcss": "^6.0.1", + "postcss-media-query-parser": "^0.2.3" } }, "postcss-import": { @@ -11509,10 +9569,10 @@ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.0.0.tgz", "integrity": "sha1-qWLi34LTvFptpqOGhBdHIE9B71s=", "requires": { - "postcss": "6.0.1", - "postcss-value-parser": "3.3.0", - "read-cache": "1.0.0", - "resolve": "1.7.1" + "postcss": "^6.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" } }, "postcss-initial": { @@ -11520,8 +9580,8 @@ "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-2.0.0.tgz", "integrity": "sha1-cnFfczbgu3k1HZnuZcSiU6hEG6Q=", "requires": { - "lodash.template": "4.4.0", - "postcss": "6.0.1" + "lodash.template": "^4.2.4", + "postcss": "^6.0.1" } }, "postcss-load-config": { @@ -11529,10 +9589,10 @@ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", "requires": { - "cosmiconfig": "2.2.2", - "object-assign": "4.1.1", - "postcss-load-options": "1.2.0", - "postcss-load-plugins": "2.3.0" + "cosmiconfig": "^2.1.0", + "object-assign": "^4.1.0", + "postcss-load-options": "^1.2.0", + "postcss-load-plugins": "^2.3.0" } }, "postcss-load-options": { @@ -11540,8 +9600,8 @@ "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", "requires": { - "cosmiconfig": "2.2.2", - "object-assign": "4.1.1" + "cosmiconfig": "^2.1.0", + "object-assign": "^4.1.0" } }, "postcss-load-plugins": { @@ -11549,8 +9609,8 @@ "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", "requires": { - "cosmiconfig": "2.2.2", - "object-assign": "4.1.1" + "cosmiconfig": "^2.1.1", + "object-assign": "^4.1.0" } }, "postcss-loader": { @@ -11558,10 +9618,10 @@ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.8.tgz", "integrity": "sha512-KtXBiQ/r/WYW8LxTSJK7h8wLqvCMSub/BqmRnud/Mu8RzwflW9cmXxwsMwbn15TNv287Hcufdb3ZSs7xHKnG8Q==", "requires": { - "loader-utils": "1.1.0", - "postcss": "6.0.1", - "postcss-load-config": "1.2.0", - "schema-utils": "0.3.0" + "loader-utils": "^1.1.0", + "postcss": "^6.0.0", + "postcss-load-config": "^1.2.0", + "schema-utils": "^0.3.0" } }, "postcss-media-minmax": { @@ -11569,7 +9629,7 @@ "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-3.0.0.tgz", "integrity": "sha1-Z1JWA3pD70C8Twdgv9BtTcadSNI=", "requires": { - "postcss": "6.0.1" + "postcss": "^6.0.1" } }, "postcss-media-query-parser": { @@ -11582,9 +9642,9 @@ "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", "requires": { - "has": "1.0.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "has": "^1.0.1", + "postcss": "^5.0.10", + "postcss-value-parser": "^3.1.1" }, "dependencies": { "chalk": { @@ -11592,11 +9652,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -11616,10 +9676,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -11632,7 +9692,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -11640,7 +9700,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -11650,7 +9710,7 @@ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.4" }, "dependencies": { "chalk": { @@ -11658,11 +9718,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -11682,10 +9742,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -11698,7 +9758,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -11706,7 +9766,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -11716,11 +9776,11 @@ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", "requires": { - "browserslist": "1.7.7", - "caniuse-api": "1.6.1", - "postcss": "5.2.18", - "postcss-selector-parser": "2.2.3", - "vendors": "1.0.2" + "browserslist": "^1.5.2", + "caniuse-api": "^1.5.2", + "postcss": "^5.0.4", + "postcss-selector-parser": "^2.2.2", + "vendors": "^1.0.0" }, "dependencies": { "chalk": { @@ -11728,11 +9788,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -11752,10 +9812,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -11768,7 +9828,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -11776,7 +9836,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -11791,9 +9851,9 @@ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", "requires": { - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "object-assign": "^4.0.1", + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" }, "dependencies": { "chalk": { @@ -11801,11 +9861,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -11825,10 +9885,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -11841,7 +9901,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -11849,7 +9909,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -11857,79 +9917,10 @@ "postcss-minify-gradients": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", - "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", - "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "postcss-minify-params": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", - "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", + "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0", - "uniqs": "2.0.0" + "postcss": "^5.0.12", + "postcss-value-parser": "^3.3.0" }, "dependencies": { "chalk": { @@ -11937,11 +9928,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -11961,10 +9952,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -11977,7 +9968,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -11985,20 +9976,20 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, - "postcss-minify-selectors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", - "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", + "postcss-minify-params": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", + "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", "requires": { - "alphanum-sort": "1.0.2", - "has": "1.0.1", - "postcss": "5.2.18", - "postcss-selector-parser": "2.2.3" + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.2", + "postcss-value-parser": "^3.0.2", + "uniqs": "^2.0.0" }, "dependencies": { "chalk": { @@ -12006,11 +9997,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -12030,10 +10021,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12046,7 +10037,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -12054,84 +10045,76 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, - "postcss-modules": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-0.6.4.tgz", - "integrity": "sha1-d6WLt3uhtDkrJwwLWYUv116JqLQ=", - "dev": true, + "postcss-minify-selectors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", + "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", "requires": { - "css-modules-loader-core": "1.1.0", - "generic-names": "1.0.3", - "postcss": "5.2.18", - "string-hash": "1.1.3" + "alphanum-sort": "^1.0.2", + "has": "^1.0.1", + "postcss": "^5.0.14", + "postcss-selector-parser": "^2.0.0" }, "dependencies": { "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" } } }, "has-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12141,7 +10124,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", "requires": { - "postcss": "6.0.1" + "postcss": "^6.0.1" } }, "postcss-modules-local-by-default": { @@ -12149,8 +10132,8 @@ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", "requires": { - "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.1" + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" } }, "postcss-modules-scope": { @@ -12158,8 +10141,8 @@ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", "requires": { - "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.1" + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" } }, "postcss-modules-values": { @@ -12167,8 +10150,8 @@ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", "requires": { - "icss-replace-symbols": "1.1.0", - "postcss": "6.0.1" + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" } }, "postcss-nesting": { @@ -12176,40 +10159,17 @@ "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-4.2.1.tgz", "integrity": "sha512-IkyWXICwagCnlaviRexi7qOdwPw3+xVVjgFfGsxmztvRVaNxAlrypOIKqDE5mxY+BVxnId1rnUKBRQoNE2VDaA==", "requires": { - "postcss": "6.0.22" + "postcss": "^6.0.11" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, "postcss": { - "version": "6.0.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", - "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.4.0" + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" } }, "supports-color": { @@ -12217,7 +10177,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -12227,7 +10187,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.5" }, "dependencies": { "chalk": { @@ -12235,11 +10195,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -12259,10 +10219,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12275,7 +10235,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -12283,7 +10243,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12293,10 +10253,10 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", "requires": { - "is-absolute-url": "2.1.0", - "normalize-url": "1.9.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "is-absolute-url": "^2.0.0", + "normalize-url": "^1.4.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3" }, "dependencies": { "chalk": { @@ -12304,11 +10264,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -12328,10 +10288,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12344,7 +10304,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -12352,7 +10312,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12362,8 +10322,8 @@ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.1" }, "dependencies": { "chalk": { @@ -12371,11 +10331,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -12395,10 +10355,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12411,7 +10371,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -12419,7 +10379,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12429,8 +10389,8 @@ "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-4.0.0.tgz", "integrity": "sha1-kVKgYT00UHIFE+iJKFS65C0O5o4=", "requires": { - "postcss": "6.0.1", - "postcss-selector-parser": "2.2.3" + "postcss": "^6.0.1", + "postcss-selector-parser": "^2.2.3" } }, "postcss-pseudoelements": { @@ -12438,7 +10398,7 @@ "resolved": "https://registry.npmjs.org/postcss-pseudoelements/-/postcss-pseudoelements-5.0.0.tgz", "integrity": "sha1-7vGU6NUkZFylIKlJ6V5RjoEkAss=", "requires": { - "postcss": "6.0.1" + "postcss": "^6.0.0" } }, "postcss-reduce-idents": { @@ -12446,8 +10406,8 @@ "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" }, "dependencies": { "chalk": { @@ -12455,11 +10415,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -12479,10 +10439,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12495,7 +10455,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -12503,7 +10463,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12513,7 +10473,7 @@ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.4" }, "dependencies": { "chalk": { @@ -12521,11 +10481,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -12545,10 +10505,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12561,7 +10521,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -12569,7 +10529,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12579,9 +10539,9 @@ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", "requires": { - "has": "1.0.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "has": "^1.0.1", + "postcss": "^5.0.8", + "postcss-value-parser": "^3.0.1" }, "dependencies": { "chalk": { @@ -12589,11 +10549,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -12613,10 +10573,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12629,7 +10589,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -12637,7 +10597,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12647,7 +10607,7 @@ "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-2.0.0.tgz", "integrity": "sha1-eU22+qVPjbEAhUOSqTr0V2i04ls=", "requires": { - "postcss": "6.0.1" + "postcss": "^6.0.1" } }, "postcss-selector-matches": { @@ -12655,8 +10615,8 @@ "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-3.0.1.tgz", "integrity": "sha1-5WNAEeE5UIgYYbvdWMLQER/8lqs=", "requires": { - "balanced-match": "0.4.2", - "postcss": "6.0.1" + "balanced-match": "^0.4.2", + "postcss": "^6.0.1" }, "dependencies": { "balanced-match": { @@ -12671,8 +10631,8 @@ "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-3.0.1.tgz", "integrity": "sha1-Lk2y8JZTNsAefOx9tsYN/3ZzNdk=", "requires": { - "balanced-match": "0.4.2", - "postcss": "6.0.1" + "balanced-match": "^0.4.2", + "postcss": "^6.0.1" }, "dependencies": { "balanced-match": { @@ -12687,9 +10647,9 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", "requires": { - "flatten": "1.0.2", - "indexes-of": "1.0.1", - "uniq": "1.0.1" + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } }, "postcss-svgo": { @@ -12697,10 +10657,10 @@ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", "requires": { - "is-svg": "2.1.0", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0", - "svgo": "0.7.2" + "is-svg": "^2.0.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3", + "svgo": "^0.7.0" }, "dependencies": { "chalk": { @@ -12708,11 +10668,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -12732,10 +10692,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12748,7 +10708,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -12756,7 +10716,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12766,9 +10726,9 @@ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.18", - "uniqs": "2.0.0" + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" }, "dependencies": { "chalk": { @@ -12776,11 +10736,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -12800,10 +10760,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12816,7 +10776,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -12824,7 +10784,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12839,9 +10799,9 @@ "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-1.5.0.tgz", "integrity": "sha512-3M3p+2gMp0AH3da530TlX8kiO1nxdTnc3C6vr8dMxRLIlh8UYkz0/wcwptSXjhtx2Fr0TySI7a+BHDQ8NL7LaQ==", "requires": { - "flatten": "1.0.2", - "indexes-of": "1.0.1", - "uniq": "1.0.1" + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } }, "postcss-zindex": { @@ -12849,9 +10809,9 @@ "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", "requires": { - "has": "1.0.1", - "postcss": "5.2.18", - "uniqs": "2.0.0" + "has": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" }, "dependencies": { "chalk": { @@ -12859,11 +10819,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -12883,10 +10843,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12899,7 +10859,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -12907,7 +10867,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12933,13 +10893,18 @@ "integrity": "sha512-fHWjCwoRZgjP1rvLP7OGqOznq7xH1sHMQUFLX8qLRO79hI57+6xbc5vB904LxEkCfgFgyr3vv06JkafgCSzoZg==", "dev": true }, + "pretty-bytes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=" + }, "pretty-error": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", "requires": { - "renderkid": "2.0.1", - "utila": "0.4.0" + "renderkid": "^2.0.1", + "utila": "~0.4" } }, "pretty-format": { @@ -12948,8 +10913,8 @@ "integrity": "sha512-ZdWPGYAnYfcVP8yKA3zFjCn8s4/17TeYH28MXuC8vTp0o21eXjbFGcOAXZEaDaOFJjc3h2qa7HQNHNshhvoh2A==", "dev": true, "requires": { - "ansi-regex": "3.0.0", - "ansi-styles": "3.2.1" + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" }, "dependencies": { "ansi-regex": { @@ -12964,7 +10929,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } } } @@ -12987,31 +10952,7 @@ "progress": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true - }, - "promise-each": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/promise-each/-/promise-each-2.2.0.tgz", - "integrity": "sha1-M1MXTv8mlEgQN+BOAfd6oPttG2A=", - "dev": true, - "requires": { - "any-promise": "0.1.0" - }, - "dependencies": { - "any-promise": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-0.1.0.tgz", - "integrity": "sha1-gwtoCqflbzNFHUsEnzvYBESY7ic=", - "dev": true - } - } - }, - "promise-finally": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/promise-finally/-/promise-finally-3.0.0.tgz", - "integrity": "sha1-3dXQ+JVDKxIGzrjaEnUGTRjnqiM=", - "dev": true + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=" }, "promise-inflight": { "version": "1.0.1", @@ -13023,7 +10964,7 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", "requires": { - "forwarded": "0.1.2", + "forwarded": "~0.1.2", "ipaddr.js": "1.6.0" } }, @@ -13032,6 +10973,15 @@ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" }, + "ps-tree": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz", + "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=", + "dev": true, + "requires": { + "event-stream": "~3.3.0" + } + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -13042,11 +10992,11 @@ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "parse-asn1": "5.1.1", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" } }, "pump": { @@ -13054,18 +11004,18 @@ "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, "pumpify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz", - "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "requires": { - "duplexify": "3.5.4", - "inherits": "2.0.3", - "pump": "2.0.1" + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" } }, "punycode": { @@ -13074,22 +11024,22 @@ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.0.1.tgz", + "integrity": "sha1-EYcq7t7okmgRCxCnGESP+xARKhQ=" }, "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "query-string": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", "requires": { - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" } }, "querystring": { @@ -13103,39 +11053,24 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" }, "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", + "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" }, "dependencies": { "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } - } - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" }, "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "1.1.6" - } + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" } } }, @@ -13144,7 +11079,7 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "^5.1.0" } }, "randomfill": { @@ -13152,8 +11087,8 @@ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "requires": { - "randombytes": "2.0.6", - "safe-buffer": "5.1.2" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, "range-parser": { @@ -13185,7 +11120,7 @@ "depd": "1.1.1", "inherits": "2.0.3", "setprototypeof": "1.0.3", - "statuses": "1.3.1" + "statuses": ">= 1.3.1 < 2" } }, "setprototypeof": { @@ -13196,14 +11131,21 @@ } }, "rc": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz", - "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "requires": { - "deep-extend": "0.5.1", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } } }, "read-all-stream": { @@ -13211,8 +11153,8 @@ "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", "requires": { - "pinkie-promise": "2.0.1", - "readable-stream": "2.3.6" + "pinkie-promise": "^2.0.0", + "readable-stream": "^2.0.0" } }, "read-cache": { @@ -13220,7 +11162,7 @@ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", "requires": { - "pify": "2.3.0" + "pify": "^2.3.0" } }, "read-pkg": { @@ -13228,9 +11170,9 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -13238,8 +11180,8 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" } }, "readable-stream": { @@ -13247,13 +11189,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "readdirp": { @@ -13261,10 +11203,10 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.6", - "set-immediate-shim": "1.0.1" + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" } }, "recast": { @@ -13273,16 +11215,16 @@ "integrity": "sha512-UgJBjELa0DaLUbblnIOPUj0UgdbetzYzrvWtHCXX8N5aCTHoMSx6ATkA2JH0hS7tP6dMJ5/CtVZEC4yW7V/8Dw==", "requires": { "ast-types": "0.9.12", - "core-js": "2.5.5", - "esprima": "4.0.0", - "private": "0.1.8", - "source-map": "0.6.1" + "core-js": "^2.4.1", + "esprima": "~4.0.0", + "private": "~0.1.5", + "source-map": "~0.6.1" }, "dependencies": { "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" } } }, @@ -13292,7 +11234,7 @@ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "1.7.1" + "resolve": "^1.1.6" } }, "redent": { @@ -13300,8 +11242,8 @@ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" } }, "reduce-css-calc": { @@ -13309,9 +11251,9 @@ "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", "requires": { - "balanced-match": "0.4.2", - "math-expression-evaluator": "1.2.17", - "reduce-function-call": "1.0.2" + "balanced-match": "^0.4.2", + "math-expression-evaluator": "^1.2.14", + "reduce-function-call": "^1.0.1" }, "dependencies": { "balanced-match": { @@ -13326,7 +11268,7 @@ "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", "requires": { - "balanced-match": "0.4.2" + "balanced-match": "^0.4.2" }, "dependencies": { "balanced-match": { @@ -13337,9 +11279,9 @@ } }, "regenerate": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" }, "regenerator-runtime": { "version": "0.11.1", @@ -13351,7 +11293,7 @@ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "requires": { - "is-equal-shallow": "0.1.3" + "is-equal-shallow": "^0.1.3" } }, "regex-not": { @@ -13359,8 +11301,8 @@ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, "regexpu-core": { @@ -13368,9 +11310,9 @@ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, "registry-auth-token": { @@ -13378,8 +11320,8 @@ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", "requires": { - "rc": "1.2.7", - "safe-buffer": "5.1.2" + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" } }, "registry-url": { @@ -13387,7 +11329,7 @@ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "requires": { - "rc": "1.2.7" + "rc": "^1.0.1" } }, "regjsgen": { @@ -13400,7 +11342,7 @@ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" } }, "relateurl": { @@ -13408,58 +11350,6 @@ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" }, - "remap-istanbul": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/remap-istanbul/-/remap-istanbul-0.11.1.tgz", - "integrity": "sha512-Itv3XvYjD6G+9xDzAeFohx4GUwbFjfqFt0UXlC826jHR18E49fEiEGqZUxUASwMq4z7wwUv2H9/XF2d6qj0iaQ==", - "dev": true, - "requires": { - "amdefine": "1.0.1", - "istanbul": "0.4.5", - "minimatch": "3.0.4", - "plugin-error": "0.1.2", - "source-map": "0.6.1", - "through2": "2.0.1" - }, - "dependencies": { - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "0.10.31", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.1.tgz", - "integrity": "sha1-OE51MU1J8y3hLuu4E2uOtrXVnak=", - "dev": true, - "requires": { - "readable-stream": "2.0.6", - "xtend": "4.0.1" - } - } - } - }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -13470,11 +11360,11 @@ "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", "requires": { - "css-select": "1.2.0", - "dom-converter": "0.1.4", - "htmlparser2": "3.3.0", - "strip-ansi": "3.0.1", - "utila": "0.3.3" + "css-select": "^1.1.0", + "dom-converter": "~0.1", + "htmlparser2": "~3.3.0", + "strip-ansi": "^3.0.0", + "utila": "~0.3" }, "dependencies": { "strip-ansi": { @@ -13482,7 +11372,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "utila": { @@ -13507,43 +11397,44 @@ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "request": { - "version": "2.85.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", - "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "hawk": "~6.0.2", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "stringstream": "~0.0.5", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" + } + }, + "request-progress": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-0.3.1.tgz", + "integrity": "sha1-ByHBBdipasayzossia4tXs/Pazo=", "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.7.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.2", - "stringstream": "0.0.5", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" - }, - "dependencies": { - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" - } + "throttleit": "~0.0.2" } }, "request-promise-core": { @@ -13551,7 +11442,7 @@ "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", "requires": { - "lodash": "4.17.10" + "lodash": "^4.13.1" } }, "request-promise-native": { @@ -13560,8 +11451,8 @@ "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", "requires": { "request-promise-core": "1.1.1", - "stealthy-require": "1.1.1", - "tough-cookie": "2.3.4" + "stealthy-require": "^1.1.0", + "tough-cookie": ">=2.3.3" } }, "require-directory": { @@ -13580,19 +11471,13 @@ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, "resolve": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", - "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.5" } }, - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", - "dev": true - }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -13603,17 +11488,8 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" - } - }, - "resumer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", - "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", - "dev": true, - "requires": { - "through": "2.3.8" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, "ret": { @@ -13636,7 +11512,7 @@ "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "requires": { - "align-text": "0.1.4" + "align-text": "^0.1.1" } }, "rimraf": { @@ -13644,7 +11520,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" }, "dependencies": { "glob": { @@ -13652,12 +11528,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } } } @@ -13667,8 +11543,8 @@ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, "run-async": { @@ -13677,7 +11553,7 @@ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "is-promise": "2.1.0" + "is-promise": "^2.1.0" } }, "run-queue": { @@ -13685,7 +11561,7 @@ "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "requires": { - "aproba": "1.2.0" + "aproba": "^1.1.1" } }, "rx-lite": { @@ -13700,24 +11576,16 @@ "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", "dev": true, "requires": { - "rx-lite": "4.0.8" + "rx-lite": "*" } }, "rxjs": { - "version": "5.5.10", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.10.tgz", - "integrity": "sha512-SRjimIDUHJkon+2hFo7xnvNC4ZEHGzCRwh9P7nzX3zPkCGFEg/tuElrNR7L/rZMagnK2JeH2jQwPRpmyXyLB6A==", + "version": "5.5.11", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", + "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", "dev": true, "requires": { "symbol-observable": "1.0.1" - }, - "dependencies": { - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true - } } }, "safe-buffer": { @@ -13730,9 +11598,14 @@ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "requires": { - "ret": "0.1.15" + "ret": "~0.1.10" } }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "samsam": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", @@ -13749,7 +11622,7 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", "requires": { - "ajv": "5.5.2" + "ajv": "^5.0.0" } }, "seek-bzip": { @@ -13758,7 +11631,7 @@ "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", "dev": true, "requires": { - "commander": "2.8.1" + "commander": "~2.8.1" }, "dependencies": { "commander": { @@ -13767,7 +11640,7 @@ "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "dev": true, "requires": { - "graceful-readlink": "1.0.1" + "graceful-readlink": ">= 1.0.0" } } } @@ -13782,7 +11655,7 @@ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "requires": { - "semver": "5.5.0" + "semver": "^5.0.3" } }, "send": { @@ -13791,18 +11664,18 @@ "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", "requires": { "debug": "2.6.9", - "depd": "1.1.2", - "destroy": "1.0.4", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.1", + "destroy": "~1.0.4", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.6.3", + "http-errors": "~1.6.2", "mime": "1.4.1", "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.3.1" + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.3.1" } }, "serve-static": { @@ -13810,9 +11683,9 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.2", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", "send": "0.16.1" } }, @@ -13831,10 +11704,10 @@ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -13842,7 +11715,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -13862,8 +11735,8 @@ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "shebang-command": { @@ -13871,7 +11744,7 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -13885,10 +11758,10 @@ "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", "dev": true, "requires": { - "array-filter": "0.0.1", - "array-map": "0.0.0", - "array-reduce": "0.0.0", - "jsonify": "0.0.0" + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" } }, "shelljs": { @@ -13897,9 +11770,9 @@ "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", "dev": true, "requires": { - "glob": "7.1.2", - "interpret": "1.1.0", - "rechoir": "0.6.2" + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" }, "dependencies": { "glob": { @@ -13908,12 +11781,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } } } @@ -13924,17 +11797,19 @@ "integrity": "sha1-CjBNAgsO3xMGrYFXDoDwNG31ijk=", "dev": true, "requires": { - "es6-object-assign": "1.1.0", - "minimist": "1.2.0", - "shelljs": "0.7.8" + "es6-object-assign": "^1.0.3", + "minimist": "^1.2.0", + "shelljs": "^0.7.3" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } } }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -13945,38 +11820,38 @@ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", "requires": { - "is-arrayish": "0.3.1" + "is-arrayish": "^0.3.1" }, "dependencies": { "is-arrayish": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.1.tgz", - "integrity": "sha1-wt/DhquqDD4zxI2z/ocFnmkGXv0=" + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" } } }, "sinon": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.1.2.tgz", - "integrity": "sha512-5uLBZPdCWl59Lpbf45ygKj7Z0LVol+ftBe7RDIXOQV/sF58pcFmbK8raA7bt6eljNuGnvBP+/ZxlicVn0emDjA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.5.0.tgz", + "integrity": "sha512-trdx+mB0VBBgoYucy6a9L7/jfQOmvGeaKZT4OOJ+lPAtI8623xyGr8wLiE4eojzBS8G9yXbhx42GHUOVLr4X2w==", "dev": true, "requires": { - "diff": "3.5.0", - "formatio": "1.2.0", - "lodash.get": "4.4.2", - "lolex": "2.3.2", - "nise": "1.3.3", - "supports-color": "4.5.0", - "type-detect": "4.0.8" + "@sinonjs/formatio": "^2.0.0", + "diff": "^3.1.0", + "lodash.get": "^4.4.2", + "lolex": "^2.2.0", + "nise": "^1.2.0", + "supports-color": "^5.1.0", + "type-detect": "^4.0.5" }, "dependencies": { "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^3.0.0" } } } @@ -13992,7 +11867,7 @@ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0" + "is-fullwidth-code-point": "^2.0.0" }, "dependencies": { "is-fullwidth-code-point": { @@ -14013,27 +11888,22 @@ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.1", - "use": "3.1.0" + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" }, "dependencies": { - "atob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=" - }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -14041,30 +11911,13 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "source-map-resolve": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", - "requires": { - "atob": "2.1.1", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" } } }, @@ -14073,9 +11926,9 @@ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { @@ -14083,7 +11936,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -14091,7 +11944,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -14099,7 +11952,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -14107,9 +11960,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "isobject": { @@ -14129,7 +11982,7 @@ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.2.0" } }, "sntp": { @@ -14137,7 +11990,7 @@ "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } }, "sort-keys": { @@ -14145,7 +11998,7 @@ "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", "requires": { - "is-plain-obj": "1.1.0" + "is-plain-obj": "^1.0.0" } }, "source-list-map": { @@ -14163,9 +12016,9 @@ "resolved": "https://registry.npmjs.org/source-map-loader-cli/-/source-map-loader-cli-0.0.1.tgz", "integrity": "sha1-jMo9HE1oSeJgEvNDq4qqqgQgz+w=", "requires": { - "async": "0.9.2", - "loader-utils": "0.2.17", - "source-map": "0.1.43" + "async": "^0.9.0", + "loader-utils": "~0.2.2", + "source-map": "~0.1.33" }, "dependencies": { "async": { @@ -14178,10 +12031,10 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" } }, "source-map": { @@ -14189,34 +12042,35 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } }, "source-map-resolve": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.3.1.tgz", - "integrity": "sha1-YQ9hIqRFuN1RU1oqcbeD38Ekh2E=", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "requires": { - "atob": "1.1.3", - "resolve-url": "0.2.1", - "source-map-url": "0.3.0", - "urix": "0.1.0" + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "source-map-url": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.3.0.tgz", - "integrity": "sha1-fsrxO1e80J2opAxdJp2zN5nUqvk=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, "spdx-correct": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { @@ -14229,8 +12083,8 @@ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { @@ -14239,12 +12093,12 @@ "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" }, "split": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/split/-/split-0.2.10.tgz", - "integrity": "sha1-Zwl8YB1pfOE2j0GPBs0gHPBSGlc=", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", "dev": true, "requires": { - "through": "2.3.8" + "through": "2" } }, "split-string": { @@ -14252,7 +12106,7 @@ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "requires": { - "extend-shallow": "3.0.2" + "extend-shallow": "^3.0.0" } }, "sprintf-js": { @@ -14261,18 +12115,19 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "sshpk": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", - "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" } }, "ssri": { @@ -14280,9 +12135,15 @@ "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "^5.1.1" } }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true + }, "staged-git-files": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/staged-git-files/-/staged-git-files-0.0.4.tgz", @@ -14294,8 +12155,8 @@ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { "define-property": { @@ -14303,7 +12164,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -14323,8 +12184,8 @@ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" } }, "stream-combiner": { @@ -14333,7 +12194,7 @@ "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", "dev": true, "requires": { - "duplexer": "0.1.1" + "duplexer": "~0.1.1" } }, "stream-each": { @@ -14341,20 +12202,20 @@ "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" } }, "stream-http": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.1.tgz", - "integrity": "sha512-cQ0jo17BLca2r0GfRdZKYAGLU6JRoIWxqSOakUMuKOT6MOK7AAlE856L33QuDmAy/eeOrhLee3dZKX0Uadu93A==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" } }, "stream-shift": { @@ -14368,7 +12229,7 @@ "integrity": "sha1-WdbqOT2HwsDdrBCqDVYbxrpvDhA=", "dev": true, "requires": { - "any-observable": "0.2.0" + "any-observable": "^0.2.0" } }, "strict-uri-encode": { @@ -14376,26 +12237,14 @@ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, - "string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=", - "dev": true - }, - "string-template": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string-template/-/string-template-1.0.0.tgz", - "integrity": "sha1-np8iM9wA8hhxjsN5oopWc+zKi5Y=", - "dev": true - }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" }, "dependencies": { "strip-ansi": { @@ -14403,17 +12252,28 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } }, + "string.prototype.padend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", + "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.4.3", + "function-bind": "^1.0.2" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } }, "stringify-object": { @@ -14422,22 +12282,22 @@ "integrity": "sha512-O696NF21oLiDy8PhpWu8AEqoZHw++QW6mUv0UvKZe8gWSdSvMXkiLufK7OmnP27Dro4GU5kb9U7JIO0mBuCRQg==", "dev": true, "requires": { - "get-own-enumerable-property-symbols": "2.0.1", - "is-obj": "1.0.1", - "is-regexp": "1.0.0" + "get-own-enumerable-property-symbols": "^2.0.1", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" } }, "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", + "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==" }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" }, "dependencies": { "ansi-regex": { @@ -14452,7 +12312,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } }, "strip-dirs": { @@ -14461,7 +12321,7 @@ "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", "dev": true, "requires": { - "is-natural-number": "4.0.1" + "is-natural-number": "^4.0.1" } }, "strip-eof": { @@ -14474,7 +12334,7 @@ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "requires": { - "get-stdin": "4.0.1" + "get-stdin": "^4.0.1" }, "dependencies": { "get-stdin": { @@ -14494,8 +12354,25 @@ "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.0.tgz", "integrity": "sha512-9mx9sC9nX1dgP96MZOODpGC6l1RzQBITI2D5WJhu+wnbrSYVKLGuy14XJSLVQih/0GFrPpjelt+s//VcZQ2Evw==", "requires": { - "loader-utils": "1.1.0", - "schema-utils": "0.3.0" + "loader-utils": "^1.0.2", + "schema-utils": "^0.3.0" + } + }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "dev": true, + "requires": { + "minimist": "^1.1.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } } }, "supports-color": { @@ -14508,19 +12385,29 @@ "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", "requires": { - "coa": "1.0.4", - "colors": "1.1.2", - "csso": "2.3.2", - "js-yaml": "3.7.0", - "mkdirp": "0.5.1", - "sax": "1.2.4", - "whet.extend": "0.9.9" + "coa": "~1.0.1", + "colors": "~1.1.2", + "csso": "~2.3.1", + "js-yaml": "~3.7.0", + "mkdirp": "~0.5.1", + "sax": "~1.2.1", + "whet.extend": "~0.9.9" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + } } }, "symbol-observable": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz", - "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", "dev": true }, "symbol-tree": { @@ -14528,60 +12415,24 @@ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" }, - "tapable": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", - "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=" - }, - "tape": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tape/-/tape-2.3.0.tgz", - "integrity": "sha1-Df7scJIn+8yRcKvn8EaWKycUMds=", - "dev": true, - "requires": { - "deep-equal": "0.1.2", - "defined": "0.0.0", - "inherits": "2.0.3", - "jsonify": "0.0.0", - "resumer": "0.0.0", - "split": "0.2.10", - "stream-combiner": "0.0.4", - "through": "2.3.8" - }, - "dependencies": { - "defined": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", - "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=", - "dev": true - } - } - }, + "tapable": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", + "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=" + }, "tar-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.0.tgz", - "integrity": "sha512-lh2iAPG/BHNmN6WB9Ybdynk9rEJ5GD/dy4zscHmVlwa1dq2tpE+BH78i5vjYwYVWEaOXGBjzxr89aVACF17Cpw==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", + "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==", "dev": true, "requires": { - "bl": "1.2.2", - "buffer-alloc": "1.1.0", - "end-of-stream": "1.4.1", - "fs-constants": "1.0.0", - "readable-stream": "2.3.6", - "to-buffer": "1.1.1", - "xtend": "4.0.1" - }, - "dependencies": { - "bl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", - "dev": true, - "requires": { - "readable-stream": "2.3.6", - "safe-buffer": "5.1.2" - } - } + "bl": "^1.0.0", + "buffer-alloc": "^1.1.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.0", + "xtend": "^4.0.0" } }, "term-size": { @@ -14590,7 +12441,7 @@ "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", "dev": true, "requires": { - "execa": "0.7.0" + "execa": "^0.7.0" }, "dependencies": { "execa": { @@ -14599,13 +12450,13 @@ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } } } @@ -14616,20 +12467,10 @@ "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", "dev": true }, - "thenify": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", - "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", - "dev": true, - "requires": { - "any-promise": "1.3.0" - } - }, - "throat": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-3.2.0.tgz", - "integrity": "sha512-/EY8VpvlqJ+sFtLPeOgc8Pl7kQVOWv0woD87KTXVHPIAE842FGT+rokxIhe8xIUP1cfgrkt0as0vDLjDiMtr8w==", - "dev": true + "throttleit": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", + "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=" }, "through": { "version": "2.3.8", @@ -14642,17 +12483,8 @@ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" - } - }, - "throwback": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/throwback/-/throwback-1.1.1.tgz", - "integrity": "sha1-8AfnwXYEptFtegfEGqDo/txhhKQ=", - "dev": true, - "requires": { - "any-promise": "1.3.0" + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" } }, "timed-out": { @@ -14665,111 +12497,7 @@ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", "requires": { - "setimmediate": "1.0.5" - } - }, - "tiny-lr": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.2.1.tgz", - "integrity": "sha1-s/26gC5dVqM8L28QeUsy5Hescp0=", - "dev": true, - "requires": { - "body-parser": "1.14.2", - "debug": "2.2.0", - "faye-websocket": "0.10.0", - "livereload-js": "2.3.0", - "parseurl": "1.3.2", - "qs": "5.1.0" - }, - "dependencies": { - "body-parser": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", - "integrity": "sha1-EBXLH+LEQ4WCWVgdtTMy+NDPUPk=", - "dev": true, - "requires": { - "bytes": "2.2.0", - "content-type": "1.0.4", - "debug": "2.2.0", - "depd": "1.1.2", - "http-errors": "1.3.1", - "iconv-lite": "0.4.13", - "on-finished": "2.3.0", - "qs": "5.2.0", - "raw-body": "2.1.7", - "type-is": "1.6.16" - }, - "dependencies": { - "qs": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", - "integrity": "sha1-qfMRQq9GjLcrJbMBNrokVoNJFr4=", - "dev": true - } - } - }, - "bytes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", - "integrity": "sha1-/TVGSkA/b5EXwt42Cez/nK4ABYg=", - "dev": true - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "http-errors": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", - "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "statuses": "1.3.1" - } - }, - "iconv-lite": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", - "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", - "dev": true - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - }, - "qs": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz", - "integrity": "sha1-TZMuXH6kEcynajEtOaYGIA/VDNk=", - "dev": true - }, - "raw-body": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", - "integrity": "sha1-rf6s4uT7MJgFgBTQjActzFl1h3Q=", - "dev": true, - "requires": { - "bytes": "2.4.0", - "iconv-lite": "0.4.13", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", - "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=", - "dev": true - } - } - } + "setimmediate": "^1.0.4" } }, "tmp": { @@ -14778,7 +12506,7 @@ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.2" } }, "to-arraybuffer": { @@ -14803,7 +12531,7 @@ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "to-regex": { @@ -14811,10 +12539,10 @@ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, "to-regex-range": { @@ -14822,8 +12550,8 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" }, "dependencies": { "is-number": { @@ -14831,31 +12559,30 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } } } }, + "topo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/topo/-/topo-2.0.2.tgz", + "integrity": "sha1-zVYVdSU5BXwNwEkaYhw7xvvh0YI=", + "requires": { + "hoek": "4.x.x" + } + }, "toposort": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=" }, - "touch": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-1.0.0.tgz", - "integrity": "sha1-RJy+LbrlqMgDjjDXH6D/RklHxN4=", - "dev": true, - "requires": { - "nopt": "1.0.10" - } - }, "tough-cookie": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "tr46": { @@ -14863,13 +12590,13 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", "requires": { - "punycode": "2.1.0" + "punycode": "^2.1.0" }, "dependencies": { "punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" } } }, @@ -14889,10 +12616,10 @@ "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-3.1.1.tgz", "integrity": "sha512-AQmLFSIgTiR8AlS5BxqvoHpZ3OUTwHHuDZTAZ2KcKsYRz/yANGeQn4Se/DCQ4cn1/eVvN37f/caVW4+kUPNNHw==", "requires": { - "chalk": "2.3.0", - "enhanced-resolve": "3.4.1", - "loader-utils": "1.1.0", - "semver": "5.5.0" + "chalk": "^2.3.0", + "enhanced-resolve": "^3.0.0", + "loader-utils": "^1.0.2", + "semver": "^5.0.1" } }, "tslib": { @@ -14901,21 +12628,22 @@ "integrity": "sha1-aUavLR1lGnsYY7Ux1uWvpBqkTqw=" }, "tslint": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.8.0.tgz", - "integrity": "sha1-H0mtWy53x2w69N3K5VKuTjYS6xM=", - "requires": { - "babel-code-frame": "6.26.0", - "builtin-modules": "1.1.1", - "chalk": "2.3.0", - "commander": "2.15.1", - "diff": "3.5.0", - "glob": "7.1.2", - "minimatch": "3.0.4", - "resolve": "1.7.1", - "semver": "5.5.0", - "tslib": "1.8.1", - "tsutils": "2.26.2" + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz", + "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", + "requires": { + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.7.0", + "minimatch": "^3.0.4", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.27.2" }, "dependencies": { "glob": { @@ -14923,44 +12651,53 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } } } }, + "tslint-language-service": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/tslint-language-service/-/tslint-language-service-0.9.9.tgz", + "integrity": "sha1-9UbcOEg5eeb7PPpZWErYUls61No=", + "dev": true, + "requires": { + "mock-require": "^2.0.2" + } + }, "tslint-loader": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/tslint-loader/-/tslint-loader-3.5.3.tgz", "integrity": "sha1-ND90Ei2U81a2iUV9P1n2SmmrYG8=", "requires": { - "loader-utils": "1.1.0", - "mkdirp": "0.5.1", - "object-assign": "4.1.1", - "rimraf": "2.6.2", - "semver": "5.5.0" - } - }, - "tslint-plugin-prettier": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tslint-plugin-prettier/-/tslint-plugin-prettier-1.3.0.tgz", - "integrity": "sha512-6UqeeV6EABp0RdQkW6eC1vwnAXcKMGJgPeJ5soXiKdSm2vv7c3dp+835CM8pjgx9l4uSa7tICm1Kli+SMsADDg==", - "dev": true, - "requires": { - "eslint-plugin-prettier": "2.6.0", - "tslib": "1.8.1" + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "object-assign": "^4.1.1", + "rimraf": "^2.4.4", + "semver": "^5.3.0" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + } } }, "tsutils": { - "version": "2.26.2", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.26.2.tgz", - "integrity": "sha512-uzwnhmrSbyinPCiwfzGsOY3IulBTwoky7r83HmZdz9QNCjhSCzavkh47KLWuU0zF2F2WbpmmzoJUIEiYyd+jEQ==", + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.28.0.tgz", + "integrity": "sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==", "requires": { - "tslib": "1.8.1" + "tslib": "^1.8.1" } }, "tty-browserify": { @@ -14971,332 +12708,100 @@ "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "1.1.2" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "2.1.18" - } - }, - "typed-css-modules": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/typed-css-modules/-/typed-css-modules-0.3.1.tgz", - "integrity": "sha512-RHIKxvl9ytIGM1H13dFTJI44EslhMAZQobY6Do8EIy7JsZI65REQ+N5NHInyOAfvnEWmhIaMrlrDGdLFFIRGow==", - "requires": { - "camelcase": "4.1.0", - "chalk": "2.3.0", - "chokidar": "1.7.0", - "css-modules-loader-core": "1.1.0", - "glob": "7.1.2", - "is-there": "4.4.3", - "mkdirp": "0.5.1", - "yargs": "8.0.2" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "typedoc": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.5.9.tgz", - "integrity": "sha1-40mCQ4tleokM/YXogliz2HWYJBA=", - "dev": true, - "requires": { - "@types/fs-extra": "0.0.33", - "@types/handlebars": "4.0.37", - "@types/highlight.js": "9.12.2", - "@types/lodash": "4.14.108", - "@types/marked": "0.0.28", - "@types/minimatch": "2.0.29", - "@types/shelljs": "0.3.33", - "fs-extra": "2.1.2", - "handlebars": "4.0.5", - "highlight.js": "9.12.0", - "lodash": "4.17.10", - "marked": "0.3.19", - "minimatch": "3.0.4", - "progress": "1.1.8", - "shelljs": "0.7.8", - "typedoc-default-themes": "0.4.4", - "typescript": "2.2.1" - }, - "dependencies": { - "@types/minimatch": { - "version": "2.0.29", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-2.0.29.tgz", - "integrity": "sha1-UALhT3Xi1x5WQoHfBDHIwbSio2o=", - "dev": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "optional": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - } - }, - "fs-extra": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", - "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0" - } - }, - "handlebars": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.5.tgz", - "integrity": "sha1-ksbta7FkEQxQ1NjQ+93HCAbG+Oc=", - "dev": true, - "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11" - } - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - }, - "typescript": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.2.1.tgz", - "integrity": "sha1-SGK2YrmIpMj/aRzHlpYi0k23auk=", - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "optional": true, - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true - } - } - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - } + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" } }, - "typedoc-default-themes": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.4.4.tgz", - "integrity": "sha1-q+mX3PF0YrYnQ4vGO2XFDTY8JS8=", - "dev": true + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true }, - "typescript": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.1.tgz", - "integrity": "sha1-7znN6ierrAtQAkLWcmq5DgyEZjE=", + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, - "typings-core": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/typings-core/-/typings-core-2.3.3.tgz", - "integrity": "sha1-CexUzVsR3V8e8vwKsx03ACyita0=", - "dev": true, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", "requires": { - "array-uniq": "1.0.3", - "configstore": "3.1.2", - "debug": "2.6.9", - "detect-indent": "5.0.0", - "graceful-fs": "4.1.11", - "has": "1.0.1", - "invariant": "2.2.4", - "is-absolute": "0.2.6", - "jspm-config": "0.3.4", - "listify": "1.0.0", - "lockfile": "1.0.4", - "make-error-cause": "1.2.2", - "mkdirp": "0.5.1", - "object.pick": "1.3.0", - "parse-json": "2.2.0", - "popsicle": "9.2.0", - "popsicle-proxy-agent": "3.0.0", - "popsicle-retry": "3.2.1", - "popsicle-rewrite": "1.0.0", - "popsicle-status": "2.0.1", - "promise-finally": "3.0.0", - "rc": "1.2.7", - "rimraf": "2.6.2", - "sort-keys": "1.1.2", - "string-template": "1.0.0", - "strip-bom": "3.0.0", - "thenify": "3.3.0", - "throat": "3.2.0", - "touch": "1.0.0", - "typescript": "2.6.1", - "xtend": "4.0.1", - "zip-object": "0.1.0" + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "typed-css-modules": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/typed-css-modules/-/typed-css-modules-0.3.1.tgz", + "integrity": "sha512-RHIKxvl9ytIGM1H13dFTJI44EslhMAZQobY6Do8EIy7JsZI65REQ+N5NHInyOAfvnEWmhIaMrlrDGdLFFIRGow==", + "requires": { + "camelcase": "^4.1.0", + "chalk": "^2.1.0", + "chokidar": "^1.6.1", + "css-modules-loader-core": "^1.1.0", + "glob": "^7.1.2", + "is-there": "^4.4.2", + "mkdirp": "^0.5.1", + "yargs": "^8.0.2" }, "dependencies": { - "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", - "dev": true, - "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.11", - "make-dir": "1.2.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.3.0", - "xdg-basedir": "3.0.0" - } + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "dev": true, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { - "is-obj": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", - "dev": true, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" + "minimist": "0.0.8" } - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", - "dev": true } } }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typescript": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", + "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=" + }, "uglify-js": { - "version": "3.3.23", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.23.tgz", - "integrity": "sha512-Ks+KqLGDsYn4z+pU7JsKCzC0T3mPYl+rU+VcPZiQOazjE4Uqi4UCRY3qPMDbJi7ze37n1lDXj3biz1ik93vqvw==", + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.5.tgz", + "integrity": "sha512-Fm52gLqJqFBnT+Sn411NPDnsgaWiYeRLw42x7Va/mS8TKgaepwoGY7JLXHSEef3d3PmdFXSz1Zx7KMLL89E2QA==", "requires": { - "commander": "2.15.1", - "source-map": "0.6.1" + "commander": "~2.16.0", + "source-map": "~0.6.1" } }, "uglify-to-browserify": { @@ -15310,13 +12815,13 @@ "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.1.0.tgz", "integrity": "sha512-x5+BK4OvEZZvaoXln/Z1JMGq3Nvp5A8d7oQ7Xpyf17lqZV9NYvugfj5aTaYcxDWNoILgVdnlPWNpAWgVdwT1/g==", "requires": { - "cacache": "10.0.4", - "find-cache-dir": "1.0.0", - "schema-utils": "0.3.0", - "source-map": "0.6.1", - "uglify-es": "3.3.9", - "webpack-sources": "1.1.0", - "worker-farm": "1.6.0" + "cacache": "^10.0.0", + "find-cache-dir": "^1.0.0", + "schema-utils": "^0.3.0", + "source-map": "^0.6.1", + "uglify-es": "^3.1.3", + "webpack-sources": "^1.0.1", + "worker-farm": "^1.4.1" }, "dependencies": { "commander": { @@ -15329,26 +12834,20 @@ "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", "requires": { - "commander": "2.13.0", - "source-map": "0.6.1" + "commander": "~2.13.0", + "source-map": "~0.6.1" } } } }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true - }, "umd-compat-loader": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/umd-compat-loader/-/umd-compat-loader-2.1.1.tgz", "integrity": "sha512-rbU2eHzW6tp64cF3X9o93wNYeG6hwvmTTktnd4nW9CdY2rMdw/py0J4C9h/b9HNfn1H0HF7jQQNxGvrm5qio7g==", "requires": { - "ast-types": "0.9.12", - "loader-utils": "1.1.0", - "recast": "0.11.23" + "ast-types": "^0.9.2", + "loader-utils": "^1.0.3", + "recast": "^0.11.17" }, "dependencies": { "recast": { @@ -15357,9 +12856,9 @@ "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", "requires": { "ast-types": "0.9.6", - "esprima": "3.1.3", - "private": "0.1.8", - "source-map": "0.5.7" + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" }, "dependencies": { "ast-types": { @@ -15376,20 +12875,14 @@ } } }, - "umd-wrapper": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/umd-wrapper/-/umd-wrapper-0.1.0.tgz", - "integrity": "sha1-iym4cLCCVDqas7Siooe0uNcVMt4=", - "dev": true - }, "unbzip2-stream": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz", "integrity": "sha512-izD3jxT8xkzwtXRUZjtmRwKnZoeECrfZ8ra/ketwOcusbZEp4mjULMnJOCfTDZBgGQAAY1AJ/IgxcwkavcX9Og==", "dev": true, "requires": { - "buffer": "3.6.0", - "through": "2.3.8" + "buffer": "^3.0.1", + "through": "^2.3.6" }, "dependencies": { "base64-js": { @@ -15405,39 +12898,21 @@ "dev": true, "requires": { "base64-js": "0.0.8", - "ieee754": "1.1.11", - "isarray": "1.0.0" + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } } } }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "underscore": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.5.1.tgz", - "integrity": "sha1-0r3oF9F2/63olKtxRY5oKhS4bck=", - "dev": true - }, - "underscore.string": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.2.3.tgz", - "integrity": "sha1-gGmSYzZl1eX8tNsfs6hi62jp5to=", - "dev": true - }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" }, "dependencies": { "extend-shallow": { @@ -15445,7 +12920,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "set-value": { @@ -15453,10 +12928,10 @@ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" } } } @@ -15466,14 +12941,6 @@ "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" }, - "uniqid": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", - "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", - "requires": { - "macaddress": "0.2.8" - } - }, "uniqs": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", @@ -15484,7 +12951,7 @@ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", "requires": { - "unique-slug": "2.0.0" + "unique-slug": "^2.0.0" } }, "unique-slug": { @@ -15492,7 +12959,7 @@ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", "requires": { - "imurmurhash": "0.1.4" + "imurmurhash": "^0.1.4" } }, "unique-string": { @@ -15501,7 +12968,7 @@ "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "dev": true, "requires": { - "crypto-random-string": "1.0.0" + "crypto-random-string": "^1.0.0" } }, "units-css": { @@ -15509,15 +12976,14 @@ "resolved": "https://registry.npmjs.org/units-css/-/units-css-0.4.0.tgz", "integrity": "sha1-1iKGU6UZg9fBb/KPi53Dsf/tOgc=", "requires": { - "isnumeric": "0.2.0", - "viewport-dimensions": "0.2.0" + "isnumeric": "^0.2.0", + "viewport-dimensions": "^0.2.0" } }, "universalify": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", - "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", - "dev": true + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, "unpipe": { "version": "1.0.0", @@ -15529,8 +12995,8 @@ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { "has-value": { @@ -15538,9 +13004,9 @@ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { "isobject": { @@ -15571,23 +13037,23 @@ "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=" }, "upath": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.5.tgz", - "integrity": "sha512-qbKn90aDQ0YEwvXoLqj0oiuUYroLX2lVHZ+b+xwjozFasAOC4GneDq5+OaIG5Zj+jFmbz/uO+f7a9qxjktJQww==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==" }, "update-notifier": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-0.7.0.tgz", "integrity": "sha1-FDxFMzg9CJCO9wVGIGOV/htauwY=", "requires": { - "ansi-align": "1.1.0", - "boxen": "0.5.1", - "chalk": "1.1.3", - "configstore": "2.1.0", - "is-npm": "1.0.0", - "latest-version": "2.0.0", - "semver-diff": "2.1.0", - "xdg-basedir": "2.0.0" + "ansi-align": "^1.0.0", + "boxen": "^0.5.1", + "chalk": "^1.0.0", + "configstore": "^2.0.0", + "is-npm": "^1.0.0", + "latest-version": "^2.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^2.0.0" }, "dependencies": { "chalk": { @@ -15595,11 +13061,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "strip-ansi": { @@ -15607,7 +13073,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } @@ -15648,46 +13114,26 @@ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "requires": { - "prepend-http": "1.0.4" + "prepend-http": "^1.0.1" } }, "urlgrey": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.0.tgz", - "integrity": "sha1-8GU1cED7NcOzEdTl3DZITZbb6gY=", - "dev": true, - "requires": { - "tape": "2.3.0" - } + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", + "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=", + "dev": true }, "use": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", - "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", - "requires": { - "kind-of": "6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - } + "inherits": "2.0.3" } }, "util-deprecate": { @@ -15706,17 +13152,17 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, "validate-npm-package-license": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "vary": { @@ -15734,9 +13180,9 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" } }, "viewport-dimensions": { @@ -15757,7 +13203,7 @@ "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", "requires": { - "browser-process-hrtime": "0.1.2" + "browser-process-hrtime": "^0.1.2" } }, "watchpack": { @@ -15765,9 +13211,9 @@ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", "requires": { - "chokidar": "2.0.3", - "graceful-fs": "4.1.11", - "neo-async": "2.5.1" + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" }, "dependencies": { "anymatch": { @@ -15775,8 +13221,8 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, "arr-diff": { @@ -15794,16 +13240,16 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -15811,28 +13257,29 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } }, "chokidar": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", - "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", - "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "fsevents": "1.2.3", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0", - "upath": "1.0.5" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" } }, "expand-brackets": { @@ -15840,13 +13287,13 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -15854,7 +13301,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -15862,7 +13309,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -15870,7 +13317,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -15878,7 +13325,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -15888,7 +13335,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -15896,7 +13343,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -15906,9 +13353,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -15923,14 +13370,14 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -15938,7 +13385,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -15946,7 +13393,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -15956,10 +13403,10 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -15967,7 +13414,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -15977,8 +13424,8 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { @@ -15986,7 +13433,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -15996,7 +13443,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -16004,7 +13451,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -16012,9 +13459,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "is-glob": { @@ -16022,7 +13469,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } }, "is-number": { @@ -16030,7 +13477,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -16038,7 +13485,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -16058,19 +13505,19 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } } } @@ -16090,30 +13537,45 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.8.1.tgz", "integrity": "sha512-5ZXLWWsMqHKFr5y0N3Eo5IIisxeEeRAajNq4mELb/WELOR7srdbQk2N5XiyNy2A/AgvlR3AmeBCZJW8lHrolbw==", "requires": { - "acorn": "5.5.3", - "acorn-dynamic-import": "2.0.2", - "ajv": "5.5.2", - "ajv-keywords": "2.1.1", - "async": "2.6.0", - "enhanced-resolve": "3.4.1", - "escope": "3.6.0", - "interpret": "1.1.0", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.5.0", - "tapable": "0.2.8", - "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.6.0", - "webpack-sources": "1.1.0", - "yargs": "8.0.2" - }, - "dependencies": { + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^5.1.5", + "ajv-keywords": "^2.0.0", + "async": "^2.1.2", + "enhanced-resolve": "^3.4.0", + "escope": "^3.6.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^4.2.1", + "tapable": "^0.2.7", + "uglifyjs-webpack-plugin": "^0.4.6", + "watchpack": "^1.4.0", + "webpack-sources": "^1.0.1", + "yargs": "^8.0.2" + }, + "dependencies": { + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "requires": { + "acorn": "^4.0.3" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + } + } + }, "camelcase": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", @@ -16124,11 +13586,16 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", + "center-align": "^0.1.1", + "right-align": "^0.1.1", "wordwrap": "0.0.2" } }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -16139,7 +13606,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } }, "uglify-js": { @@ -16147,9 +13614,9 @@ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" }, "dependencies": { "yargs": { @@ -16157,9 +13624,9 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" } } @@ -16170,9 +13637,9 @@ "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", "requires": { - "source-map": "0.5.7", - "uglify-js": "2.8.29", - "webpack-sources": "1.1.0" + "source-map": "^0.5.6", + "uglify-js": "^2.8.29", + "webpack-sources": "^1.0.1" } }, "wordwrap": { @@ -16187,16 +13654,16 @@ "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer-sunburst/-/webpack-bundle-analyzer-sunburst-1.3.0.tgz", "integrity": "sha512-1Z3Kh3H9589hr/svTieSY7GIPfZUZ9bgckW+9NDCI9RYuD4Yen5/Jz0zQdYeQQBY7pc3OzlDJzJbqZzNu/whxg==", "requires": { - "acorn": "4.0.13", - "chalk": "1.1.3", - "commander": "2.15.1", - "ejs": "2.5.9", - "express": "4.16.2", - "filesize": "3.6.1", - "gzip-size": "3.0.0", - "lodash": "4.17.10", - "mkdirp": "0.5.1", - "opener": "1.4.3" + "acorn": "^4.0.3", + "chalk": "^1.1.3", + "commander": "^2.9.0", + "ejs": "^2.5.2", + "express": "^4.14.0", + "filesize": "^3.3.0", + "gzip-size": "^3.0.0", + "lodash": "^4.17.2", + "mkdirp": "^0.5.1", + "opener": "^1.4.2" }, "dependencies": { "acorn": { @@ -16209,11 +13676,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "gzip-size": { @@ -16221,7 +13688,15 @@ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", "requires": { - "duplexer": "0.1.1" + "duplexer": "^0.1.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" } }, "strip-ansi": { @@ -16229,7 +13704,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } @@ -16239,18 +13714,23 @@ "resolved": "https://registry.npmjs.org/webpack-chunk-hash/-/webpack-chunk-hash-0.5.0.tgz", "integrity": "sha1-Hbo4ID1zwearBptoEKWjdAI5new=", "requires": { - "@types/webpack": "3.8.12" + "@types/webpack": "^3.0.5" }, "dependencies": { + "@types/node": { + "version": "10.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.5.2.tgz", + "integrity": "sha512-m9zXmifkZsMHZBOyxZWilMwmTlpC8x5Ty360JKTiXvlXZfBWYpsg9ZZvP/Ye+iZUh+Q+MxDLjItVTWIsfwz+8Q==" + }, "@types/webpack": { - "version": "3.8.12", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-3.8.12.tgz", - "integrity": "sha512-Q8ro/vCAyE8piwBvRgzeerrVkGy3XBmK2O2bk5g+NBHDqR0R2qZGwpBsz+js5mBH9PvvenQCojqB9nZC9Gz4MQ==", + "version": "3.8.14", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-3.8.14.tgz", + "integrity": "sha512-QljpyEEOgvFeF76Pi271NS/cVB7P0lrMp1b07b6cpii8d5BvN3qoN7TybL9MLdKRro1qyV9TxQqahuZDjAZrhg==", "requires": { - "@types/node": "10.0.2", - "@types/tapable": "0.2.5", - "@types/uglify-js": "3.0.2", - "source-map": "0.6.1" + "@types/node": "*", + "@types/tapable": "^0", + "@types/uglify-js": "*", + "source-map": "^0.6.0" } } } @@ -16260,13 +13740,13 @@ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-2.0.3.tgz", "integrity": "sha512-8zIUzfCbpaDxKSAyC8ZhDA0P5EBvlafHcj4yoSP8lrvW0ZyWW7tsrqazI7q+zAhRi22TTE3g9sycQEZeyUbpqg==", "requires": { - "loud-rejection": "1.6.0", - "memory-fs": "0.4.1", - "mime": "2.3.1", - "path-is-absolute": "1.0.1", - "range-parser": "1.2.0", - "url-join": "2.0.5", - "webpack-log": "1.2.0" + "loud-rejection": "^1.6.0", + "memory-fs": "~0.4.1", + "mime": "^2.1.0", + "path-is-absolute": "^1.0.0", + "range-parser": "^1.0.3", + "url-join": "^2.0.2", + "webpack-log": "^1.0.1" }, "dependencies": { "mime": { @@ -16282,9 +13762,9 @@ "integrity": "sha512-P6xiOLy10QlSVSO7GanU9PLxN6zLLQ7RG16MPTvmFwf2KUG7jMp6m+fmdgsR7xoaVVLA7OlX3YO6JjoZEKjCuA==", "requires": { "ansi-html": "0.0.7", - "html-entities": "1.2.1", - "querystring": "0.2.0", - "strip-ansi": "3.0.1" + "html-entities": "^1.2.0", + "querystring": "^0.2.0", + "strip-ansi": "^3.0.0" }, "dependencies": { "strip-ansi": { @@ -16292,7 +13772,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } @@ -16302,17 +13782,10 @@ "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-1.2.0.tgz", "integrity": "sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==", "requires": { - "chalk": "2.3.0", - "log-symbols": "2.1.0", - "loglevelnext": "1.0.5", - "uuid": "3.2.1" - }, - "dependencies": { - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" - } + "chalk": "^2.1.0", + "log-symbols": "^2.1.0", + "loglevelnext": "^1.0.1", + "uuid": "^3.1.0" } }, "webpack-mild-compile": { @@ -16325,26 +13798,10 @@ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", "requires": { - "source-list-map": "2.0.0", - "source-map": "0.6.1" - } - }, - "websocket-driver": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", - "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", - "dev": true, - "requires": { - "http-parser-js": "0.4.12", - "websocket-extensions": "0.1.3" + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" } }, - "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", - "dev": true - }, "whatwg-encoding": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz", @@ -16354,13 +13811,13 @@ } }, "whatwg-url": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.1.tgz", - "integrity": "sha512-FwygsxsXx27x6XXuExA/ox3Ktwcbf+OAvrKmLulotDAiO1Q6ixchPFaHYsis2zZBZSJTR0+dR+JVtf7MlbqZjw==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", "requires": { - "lodash.sortby": "4.7.0", - "tr46": "1.0.1", - "webidl-conversions": "4.0.2" + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, "whet.extend": { @@ -16369,11 +13826,11 @@ "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=" }, "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { @@ -16386,7 +13843,7 @@ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.1" } }, "window-size": { @@ -16399,12 +13856,174 @@ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" }, + "workbox-background-sync": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-3.4.1.tgz", + "integrity": "sha512-Ksb2nCg/2wOyBMhSBqSbtCEwuKaf5sHgTY8HdCxbLIQSzDh9/qZqg+1P11CKlgJmHtje3EK3B8EsrzukZo10xA==", + "requires": { + "workbox-core": "^3.4.1" + } + }, + "workbox-broadcast-cache-update": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/workbox-broadcast-cache-update/-/workbox-broadcast-cache-update-3.4.1.tgz", + "integrity": "sha512-+WPqHFk4ER4RICAMOYrP88yBbiUQ9ZOFNruqwbl9YxGfbADV16OEGmYpIs+Az6HT6DNDCx8eQqtFiaG8N3O11Q==", + "requires": { + "workbox-core": "^3.4.1" + } + }, + "workbox-build": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-3.4.1.tgz", + "integrity": "sha512-Qi04XdHjkXbRN0CV5XO1oqDWbJSIm7VYhxmxjtnVcKK8PrMT6rOUFUi9ziDI+8UQgcXbLK4ZChWf2ptZS1/MbA==", + "requires": { + "babel-runtime": "^6.26.0", + "common-tags": "^1.4.0", + "fs-extra": "^4.0.2", + "glob": "^7.1.2", + "joi": "^11.1.1", + "lodash.template": "^4.4.0", + "pretty-bytes": "^4.0.2", + "workbox-background-sync": "^3.4.1", + "workbox-broadcast-cache-update": "^3.4.1", + "workbox-cache-expiration": "^3.4.1", + "workbox-cacheable-response": "^3.4.1", + "workbox-core": "^3.4.1", + "workbox-google-analytics": "^3.4.1", + "workbox-navigation-preload": "^3.4.1", + "workbox-precaching": "^3.4.1", + "workbox-range-requests": "^3.4.1", + "workbox-routing": "^3.4.1", + "workbox-strategies": "^3.4.1", + "workbox-streams": "^3.4.1", + "workbox-sw": "^3.4.1" + }, + "dependencies": { + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "workbox-cache-expiration": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/workbox-cache-expiration/-/workbox-cache-expiration-3.4.1.tgz", + "integrity": "sha512-AzOPB+dwfxg13v4+q5jWkxsw/oim9mPIzew1anu8ALA3vB8qySaJJToXp+ZlVh/Co+sDK0tgjlB76bvSFHgZ4g==", + "requires": { + "workbox-core": "^3.4.1" + } + }, + "workbox-cacheable-response": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-3.4.1.tgz", + "integrity": "sha512-SO2k830JT93GitPwc5tzJI49d9VwyVxXwiCbyvo+Sqo+dcvWSrmpsyuXdzy6zuasbPrWUF0vsFj1uGtZbOym8Q==", + "requires": { + "workbox-core": "^3.4.1" + } + }, + "workbox-core": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-3.4.1.tgz", + "integrity": "sha512-RqMV2so9/KLAu9aUxJ/85pvrZMUn835B8zoHmqRyGNetiDr8B1zSBeKXPZAjFlX/88KdhizNwiRlJtqlXtM4tA==" + }, + "workbox-google-analytics": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-3.4.1.tgz", + "integrity": "sha512-w6Osz2Rr1/4+W0gram6Yzg6NNWLvHP51RwFCNAZSpEnipr0qSEtD+yvwrdaHfiJHWhcK2yH/V6E1MV8Hrczmvw==", + "requires": { + "workbox-background-sync": "^3.4.1", + "workbox-core": "^3.4.1", + "workbox-routing": "^3.4.1", + "workbox-strategies": "^3.4.1" + } + }, + "workbox-navigation-preload": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-3.4.1.tgz", + "integrity": "sha512-P3FHAcyZ8db2QiW/BpMkuosC1OkRsEoUaT7U3QOgg7JSjjsJoEbF7G5olNe+P+PQYdVhJA7TCuptI6dy2gLS/g==", + "requires": { + "workbox-core": "^3.4.1" + } + }, + "workbox-precaching": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-3.4.1.tgz", + "integrity": "sha512-ykU2mly9xmRrCW6iMeUWYydWiso/WSE16+7wponhI0WC53jiQSt2JvykWm0VpWFJSs6ZTSZZ1WK2gs/brRnPug==", + "requires": { + "workbox-core": "^3.4.1" + } + }, + "workbox-range-requests": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-3.4.1.tgz", + "integrity": "sha512-ktgjl6liZrRTmQjPw1pBblC5umHnTb8XcvFVitdGz17B23jj6cUV4EXzEU2ilGn6jO6+MLV1Vn9SWajtLSc2Gg==", + "requires": { + "workbox-core": "^3.4.1" + } + }, + "workbox-routing": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-3.4.1.tgz", + "integrity": "sha512-6j6cXMUYfMPYTycmElxVOfBTr6WV5zAn/JUFJ7GJ5pYFIE9cqztprnrcOsWJ42+AiNIeHPbKfyIWE/rZVviMxQ==", + "requires": { + "workbox-core": "^3.4.1" + } + }, + "workbox-strategies": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-3.4.1.tgz", + "integrity": "sha512-7mJuzFsgejflzjfnChXCFma1S0mi9WC6wlSU2wE50M7bJmEuf9A3j3MojpKcsTEM58hbhbnU6QF/u9iIV7+opw==", + "requires": { + "workbox-core": "^3.4.1" + } + }, + "workbox-streams": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-3.4.1.tgz", + "integrity": "sha512-krw+5bp+oe9Za5c6WlTWM3SgZGfExYcqRSn1gsyYgKeXmgzTwf+DOb5Lwult0KSWlJfq8B3Wk7sW8Sl7lRzSbA==", + "requires": { + "workbox-core": "^3.4.1" + } + }, + "workbox-sw": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-3.4.1.tgz", + "integrity": "sha512-nnm2by5oaQGXRH7x4M5/n2KqjUGVmP4P8azUmJITnYa3DWVYn/ghDg3LJ5+h4A28vYq9V6ePgATaEPfb6B5pug==" + }, + "workbox-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-zl1/2ChVhwcpSumDd3jSUfbDIk5MtTSW5xc/h/WPkBpYi4dwvfwmQ8KAXc1qBIEoDz++R483zwYTyJQJ0g6f3w==", + "requires": { + "json-stable-stringify": "^1.0.1", + "workbox-build": "^3.2.0" + } + }, "worker-farm": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", "requires": { - "errno": "0.1.7" + "errno": "~0.1.7" } }, "wrap-ansi": { @@ -16412,8 +14031,8 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" }, "dependencies": { "strip-ansi": { @@ -16421,7 +14040,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } @@ -16436,9 +14055,9 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" } }, "ws": { @@ -16446,8 +14065,8 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", "requires": { - "async-limiter": "1.0.0", - "safe-buffer": "5.1.2" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0" } }, "xdg-basedir": { @@ -16455,7 +14074,7 @@ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz", "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=", "requires": { - "os-homedir": "1.0.2" + "os-homedir": "^1.0.0" } }, "xml-name-validator": { @@ -16463,22 +14082,6 @@ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "dev": true, - "requires": { - "sax": "1.2.4", - "xmlbuilder": "9.0.7" - } - }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "dev": true - }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", @@ -16499,19 +14102,19 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" }, "dependencies": { "camelcase": { @@ -16524,7 +14127,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } }, "is-fullwidth-code-point": { @@ -16537,10 +14140,10 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" } }, "path-type": { @@ -16548,7 +14151,7 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "requires": { - "pify": "2.3.0" + "pify": "^2.0.0" } }, "read-pkg": { @@ -16556,9 +14159,9 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" } }, "read-pkg-up": { @@ -16566,8 +14169,8 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" } }, "string-width": { @@ -16575,8 +14178,8 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-bom": { @@ -16591,7 +14194,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" }, "dependencies": { "camelcase": { @@ -16602,20 +14205,14 @@ } }, "yauzl": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz", - "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", "dev": true, "requires": { - "buffer-crc32": "0.2.13", - "fd-slicer": "1.0.1" + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" } - }, - "zip-object": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/zip-object/-/zip-object-0.1.0.tgz", - "integrity": "sha1-waDaBMiMg3dW4khoCgP/kC7D9To=", - "dev": true } } } diff --git a/package.json b/package.json index 02d9e29..9346170 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dojo/cli-build-widget", - "version": "2.0.5-pre", + "version": "3.0.0-pre", "description": "CLI command to build Dojo 2 custom elements", "engines": { "npm": ">=3.0.0" @@ -17,16 +17,26 @@ "url": "https://github.com/dojo/cli-build-widget.git" }, "scripts": { - "test": "npm run setup-tests && grunt test --color", - "test-ci": "npm run setup-tests && grunt dev && grunt intern:node --test-reporter --color", - "clean": "shx rm -rf dist", - "setup-tests": "npm run build-test-artifact && cd test-app && shx rm -rf node_modules && npm i && npm run install-build-widget", - "build-test-artifact": "npm run clean dist && grunt dist && grunt release-publish-flat --dry-run && shx mv dist/dojo-cli-build-widget-* dist/dojo-cli-build-widget.tgz", - "prettier": "prettier --write 'src/**/*.ts' 'tests/**/*.ts'", - "generate-unix-fixtures": "cd test-app && npm run generate-unix-fixtures && cd ..", - "generate-windows-fixtures": "cd test-app && npm run generate-windows-fixtures && cd ..", + "artifact:install": "cd test-app && shx rm -rf node_modules && npm i && npm run install-build-widget", + "artifact:package": "cd dist && npm pack -q ./release && shx mv dojo-cli-build-widget-* dojo-cli-build-widget.tgz && cd ..", + "build:static:dev": "cpx \"{src,tests}/**/*.{d.ts,html,md,json,js,css}\" dist/dev", + "build:static:release": "cpx \"src/**/*.{d.ts,json,js}\" dist/release", + "build:cjs": "tsc", + "build": "npm-run-all -p build:** -s package", + "clean": "rimraf dist coverage test-app/output", + "generate:unix-fixtures": "cd test-app && npm run generate-unix-fixtures && cd ..", + "generate:windows-fixtures": "cd test-app && npm run generate-windows-fixtures && cd ..", + "intern": "intern", + "lint:tslint": "tslint -p .", + "lint:prettier": "prettier -l \"{src,tests}/**/*.{ts,tsx}\"", + "lint": "run-p lint:*", + "package": "dojo-package", "precommit": "lint-staged", - "test-release": "npm run clean dist && grunt release --pre-release-tag=rc --dry-run --skip-checks --initial --dry-run" + "prettier": "prettier --write \"{src,tests}/**/*.{ts,tsx}\"", + "test": "run-s lint build artifact:package artifact:install intern", + "uploadCoverage": "codecov --file=coverage/coverage.json", + "watch:ts": "dojo-tsc-watcher -p tsconfig.json -- dojo-package", + "watch": "run-p watch:ts \"build:static:** -- --watch\"" }, "lint-staged": { "*.{ts,tsx}": [ @@ -35,15 +45,13 @@ ] }, "devDependencies": { - "@dojo/cli": "2.0.0", - "@types/chalk": "2.2.0", + "@dojo/cli": "^3.0.0-alpha.1", + "@dojo/scripts": "^3.0.0-alpha.6", "@types/clean-webpack-plugin": "0.1.0", "@types/execa": "0.8.0", "@types/express": "4.11.0", "@types/extract-text-webpack-plugin": "3.0.0", - "@types/glob": "5.0.*", "@types/globby": "6.1.0", - "@types/grunt": "0.4.*", "@types/gzip-size": "4.0.0", "@types/html-webpack-plugin": "2.30.1", "@types/jsonfile": "4.0.1", @@ -51,37 +59,34 @@ "@types/log-symbols": "2.0.0", "@types/log-update": "2.0.0", "@types/mockery": "1.4.29", + "@types/node": "~9.6.5", "@types/optimize-css-assets-webpack-plugin": "1.3.1", "@types/ora": "^1.3.1", "@types/rimraf": "2.0.2", - "@types/sinon": "4.0.0", + "@types/sinon": "~4.3.3", "@types/strip-ansi": "3.0.0", "@types/tapable": "^0.2.5", "@types/webpack": "3.8.1", "@types/webpack-chunk-hash": "0.4.0", - "@types/yargs": "8.0.2", - "codecov.io": "0.1.6", + "@types/yargs": "^10.0.0", + "cpx": "~1.5.0", + "codecov": "~3.0.4", "execa": "0.8.0", - "grunt": "1.0.1", - "grunt-dojo2": "latest", - "grunt-tslint": "5.0.1", - "husky": "0.14.3", - "intern": "4.1.0", + "husky": "^0.14.3", "lint-staged": "6.0.0", "mockery": "2.1.0", + "npm-run-all": "~4.1.3", "prettier": "1.8.2", "rimraf": "2.6.2", "shelljs": "0.7.8", "shx": "0.2.2", - "sinon": "4.1.2", - "tslint-plugin-prettier": "1.3.0", - "typescript": "2.6.1" + "sinon": "~4.5.0" }, "dependencies": { - "@dojo/has": "2.0.0", - "@dojo/webpack-contrib": "2.0.0", + "@dojo/framework": "^3.0.0-alpha.1", + "@dojo/webpack-contrib": "^3.0.0-alpha.2", "@theintern/istanbul-loader": "1.0.0-beta.1", - "chalk": "2.3.0", + "chalk": "~2.4.0", "clean-webpack-plugin": "0.1.17", "cli-columns": "3.1.2", "css-loader": "0.28.7", @@ -108,7 +113,7 @@ "strip-ansi": "4.0.0", "style-loader": "0.19.0", "ts-loader": "3.1.1", - "tslint": "5.8.0", + "tslint": "~5.11.0", "tslint-loader": "3.5.3", "typed-css-modules": "0.3.1", "uglifyjs-webpack-plugin": "1.1.0", diff --git a/src/template/custom-element.js b/src/template/custom-element.js index 96540f3..4bc1183 100644 --- a/src/template/custom-element.js +++ b/src/template/custom-element.js @@ -1,4 +1,4 @@ -var registerCustomElement = require('@dojo/widget-core/registerCustomElement').default; +var registerCustomElement = require('@dojo/framework/widget-core/registerCustomElement').default; var defaultExport = widgetFactory.default; defaultExport && registerCustomElement(defaultExport); diff --git a/test-app/fixtures/unix/dev/menu-item/menu-item-1.0.0.js b/test-app/fixtures/unix/dev/menu-item/menu-item-1.0.0.js index d6ab50d..5e07ffb 100644 --- a/test-app/fixtures/unix/dev/menu-item/menu-item-1.0.0.js +++ b/test-app/fixtures/unix/dev/menu-item/menu-item-1.0.0.js @@ -73,19 +73,19 @@ /************************************************************************/ /******/ ({ -/***/ "./node_modules/@dojo/core/Destroyable.mjs": +/***/ "./node_modules/@dojo/framework/core/Destroyable.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__lang__ = __webpack_require__("./node_modules/@dojo/core/lang.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Promise__ = __webpack_require__("./node_modules/@dojo/shim/Promise.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__lang__ = __webpack_require__("./node_modules/@dojo/framework/core/lang.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__shim_Promise__ = __webpack_require__("./node_modules/@dojo/framework/shim/Promise.mjs"); /** * No operation function to replace own once instance is destoryed */ function noop() { - return __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Promise__["a" /* default */].resolve(false); + return __WEBPACK_IMPORTED_MODULE_1__shim_Promise__["a" /* default */].resolve(false); } /** * No op function used to replace own, once instance has been destoryed @@ -123,7 +123,7 @@ class Destroyable { * @returns {Promise { + return new __WEBPACK_IMPORTED_MODULE_1__shim_Promise__["a" /* default */]((resolve) => { this.handles.forEach((handle) => { handle && handle.destroy && handle.destroy(); }); @@ -140,19 +140,19 @@ class Destroyable { /***/ }), -/***/ "./node_modules/@dojo/core/Evented.mjs": +/***/ "./node_modules/@dojo/framework/core/Evented.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export isGlobMatch */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__ = __webpack_require__("./node_modules/@dojo/shim/Map.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Destroyable__ = __webpack_require__("./node_modules/@dojo/core/Destroyable.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_Map__ = __webpack_require__("./node_modules/@dojo/framework/shim/Map.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Destroyable__ = __webpack_require__("./node_modules/@dojo/framework/core/Destroyable.mjs"); /** * Map of computed regular expressions, keyed by string */ -const regexMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */](); +const regexMap = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["b" /* default */](); /** * Determines is the event type glob has been matched * @@ -183,12 +183,12 @@ class Evented extends __WEBPACK_IMPORTED_MODULE_1__Destroyable__["a" /* Destroya /** * map of listeners keyed by event type */ - this.listenersMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */](); + this.listenersMap = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["b" /* default */](); } emit(event) { this.listenersMap.forEach((methods, type) => { if (isGlobMatch(type, event.type)) { - methods.forEach((method) => { + [...methods].forEach((method) => { method.call(this, event); }); } @@ -224,7 +224,7 @@ class Evented extends __WEBPACK_IMPORTED_MODULE_1__Destroyable__["a" /* Destroya /***/ }), -/***/ "./node_modules/@dojo/core/lang.mjs": +/***/ "./node_modules/@dojo/framework/core/lang.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -238,8 +238,8 @@ class Evented extends __WEBPACK_IMPORTED_MODULE_1__Destroyable__["a" /* Destroya /* unused harmony export partial */ /* unused harmony export createHandle */ /* harmony export (immutable) */ __webpack_exports__["b"] = createCompositeHandle; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_object__ = __webpack_require__("./node_modules/@dojo/shim/object.mjs"); -/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return __WEBPACK_IMPORTED_MODULE_0__dojo_shim_object__["a"]; }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_object__ = __webpack_require__("./node_modules/@dojo/framework/shim/object.mjs"); +/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return __WEBPACK_IMPORTED_MODULE_0__shim_object__["a"]; }); const slice = Array.prototype.slice; @@ -317,7 +317,7 @@ function create(prototype, ...mixins) { } const args = mixins.slice(); args.unshift(Object.create(prototype)); - return __WEBPACK_IMPORTED_MODULE_0__dojo_shim_object__["a" /* assign */].apply(null, args); + return __WEBPACK_IMPORTED_MODULE_0__shim_object__["a" /* assign */].apply(null, args); } function deepAssign(target, ...sources) { return _mixin({ @@ -439,7 +439,7 @@ function createCompositeHandle(...handles) { /***/ }), -/***/ "./node_modules/@dojo/has/has.mjs": +/***/ "./node_modules/@dojo/framework/has/has.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -652,16 +652,16 @@ add('host-node', function () { /***/ }), -/***/ "./node_modules/@dojo/shim/Map.mjs": +/***/ "./node_modules/@dojo/framework/shim/Map.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Map; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__iterator__ = __webpack_require__("./node_modules/@dojo/shim/iterator.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__object__ = __webpack_require__("./node_modules/@dojo/shim/object.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__iterator__ = __webpack_require__("./node_modules/@dojo/framework/shim/iterator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__object__ = __webpack_require__("./node_modules/@dojo/framework/shim/object.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); @@ -761,15 +761,15 @@ var _a; /***/ }), -/***/ "./node_modules/@dojo/shim/Promise.mjs": +/***/ "./node_modules/@dojo/framework/shim/Promise.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export ShimPromise */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__support_queue__ = __webpack_require__("./node_modules/@dojo/shim/support/queue.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__support_queue__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/queue.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); @@ -974,15 +974,15 @@ var _a; /***/ }), -/***/ "./node_modules/@dojo/shim/Symbol.mjs": +/***/ "./node_modules/@dojo/framework/shim/Symbol.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export Symbol */ /* unused harmony export isSymbol */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__support_util__ = __webpack_require__("./node_modules/@dojo/shim/support/util.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__support_util__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/util.mjs"); @@ -1131,15 +1131,15 @@ function isSymbol(value) { /***/ }), -/***/ "./node_modules/@dojo/shim/WeakMap.mjs": +/***/ "./node_modules/@dojo/framework/shim/WeakMap.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export WeakMap */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__iterator__ = __webpack_require__("./node_modules/@dojo/shim/iterator.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__iterator__ = __webpack_require__("./node_modules/@dojo/framework/shim/iterator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); @@ -1254,7 +1254,7 @@ if (false) { /***/ }), -/***/ "./node_modules/@dojo/shim/array.mjs": +/***/ "./node_modules/@dojo/framework/shim/array.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -1265,11 +1265,11 @@ if (false) { /* unused harmony export find */ /* unused harmony export findIndex */ /* unused harmony export includes */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__iterator__ = __webpack_require__("./node_modules/@dojo/shim/iterator.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__number__ = __webpack_require__("./node_modules/@dojo/shim/number.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__support_util__ = __webpack_require__("./node_modules/@dojo/shim/support/util.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__iterator__ = __webpack_require__("./node_modules/@dojo/framework/shim/iterator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__number__ = __webpack_require__("./node_modules/@dojo/framework/shim/number.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__support_util__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/util.mjs"); @@ -1521,7 +1521,7 @@ else { /***/ }), -/***/ "./node_modules/@dojo/shim/global.mjs": +/***/ "./node_modules/@dojo/framework/shim/global.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -1547,7 +1547,7 @@ else { /***/ }), -/***/ "./node_modules/@dojo/shim/iterator.mjs": +/***/ "./node_modules/@dojo/framework/shim/iterator.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -1555,8 +1555,8 @@ else { /* unused harmony export isArrayLike */ /* unused harmony export get */ /* unused harmony export forOf */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__string__ = __webpack_require__("./node_modules/@dojo/shim/string.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__string__ = __webpack_require__("./node_modules/@dojo/framework/shim/string.mjs"); const staticDone = { done: true, value: undefined }; @@ -1673,7 +1673,7 @@ function forOf(iterable, callback, thisArg) { /***/ }), -/***/ "./node_modules/@dojo/shim/number.mjs": +/***/ "./node_modules/@dojo/framework/shim/number.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -1681,7 +1681,7 @@ function forOf(iterable, callback, thisArg) { /* unused harmony export isFinite */ /* unused harmony export isInteger */ /* unused harmony export isSafeInteger */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); /** * The smallest interval between two representable numbers. @@ -1745,7 +1745,7 @@ function isSafeInteger(value) { /***/ }), -/***/ "./node_modules/@dojo/shim/object.mjs": +/***/ "./node_modules/@dojo/framework/shim/object.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -1758,9 +1758,9 @@ function isSafeInteger(value) { /* unused harmony export getOwnPropertyDescriptors */ /* unused harmony export entries */ /* unused harmony export values */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); @@ -1875,7 +1875,7 @@ else { /***/ }), -/***/ "./node_modules/@dojo/shim/string.mjs": +/***/ "./node_modules/@dojo/framework/shim/string.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -1889,9 +1889,9 @@ else { /* unused harmony export startsWith */ /* unused harmony export padEnd */ /* unused harmony export padStart */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__support_util__ = __webpack_require__("./node_modules/@dojo/shim/support/util.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__support_util__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/util.mjs"); @@ -2200,33 +2200,33 @@ else { /***/ }), -/***/ "./node_modules/@dojo/shim/support/has.mjs": +/***/ "./node_modules/@dojo/framework/shim/support/has.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_has_has__ = __webpack_require__("./node_modules/@dojo/has/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__has_has__ = __webpack_require__("./node_modules/@dojo/framework/has/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); /* unused harmony reexport namespace */ -/* unused harmony default export */ var _unused_webpack_default_export = (__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["b" /* default */]); +/* unused harmony default export */ var _unused_webpack_default_export = (__WEBPACK_IMPORTED_MODULE_0__has_has__["b" /* default */]); /* ECMAScript 6 and 7 Features */ /* Array */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-array', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-array', () => { return (['from', 'of'].every((key) => key in __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Array) && ['findIndex', 'find', 'copyWithin'].every((key) => key in __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Array.prototype)); }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-array-fill', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-array-fill', () => { if ('fill' in __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Array.prototype) { /* Some versions of Safari do not properly implement this */ return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1; } return false; }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es7-array', () => 'includes' in __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Array.prototype, true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es7-array', () => 'includes' in __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Array.prototype, true); /* Map */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-map', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-map', () => { if (typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Map === 'function') { /* IE11 and older versions of Safari are missing critical ES6 Map functionality @@ -2249,7 +2249,7 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-map', () return false; }, true); /* Math */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-math', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-math', () => { return [ 'clz32', 'sign', @@ -2269,7 +2269,7 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-math', ( 'hypot' ].every((name) => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Math[name] === 'function'); }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-math-imul', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-math-imul', () => { if ('imul' in __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Math) { /* Some versions of Safari on ios do not properly implement this */ return Math.imul(0xffffffff, 5) === -5; @@ -2277,19 +2277,19 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-math-imu return false; }, true); /* Object */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-object', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-object', () => { return true && ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Object[name] === 'function'); }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es2017-object', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es2017-object', () => { return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Object[name] === 'function'); }, true); /* Observable */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es-observable', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Observable !== 'undefined', true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es-observable', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Observable !== 'undefined', true); /* Promise */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-promise', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Promise !== 'undefined' && true, true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-promise', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Promise !== 'undefined' && true, true); /* Set */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-set', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-set', () => { if (typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Set === 'function') { /* IE11 and older versions of Safari are missing critical ES6 Set functionality */ const set = new __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Set([1]); @@ -2298,7 +2298,7 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-set', () return false; }, true); /* String */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-string', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-string', () => { return ([ /* static methods */ 'fromCodePoint' @@ -2313,7 +2313,7 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-string', 'includes' ].every((key) => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].String.prototype[key] === 'function')); }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-string-raw', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-string-raw', () => { function getCallSite(callSite, ...substitutions) { const result = [...callSite]; result.raw = callSite.raw; @@ -2328,13 +2328,13 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-string-r } return false; }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es2017-string', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es2017-string', () => { return ['padStart', 'padEnd'].every((key) => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].String.prototype[key] === 'function'); }, true); /* Symbol */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-symbol', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Symbol !== 'undefined' && typeof Symbol() === 'symbol', true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-symbol', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Symbol !== 'undefined' && typeof Symbol() === 'symbol', true); /* WeakMap */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-weakmap', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-weakmap', () => { if (typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].WeakMap !== 'undefined') { /* IE11 and older versions of Safari are missing critical ES6 Map functionality */ const key1 = {}; @@ -2346,16 +2346,16 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-weakmap' return false; }, true); /* Miscellaneous features */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('microtasks', () => true || false || true, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('postmessage', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('microtasks', () => true || false || true, true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('postmessage', () => { // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist. return typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].window !== 'undefined' && typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].postMessage === 'function'; }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('raf', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].requestAnimationFrame === 'function', true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('setimmediate', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].setImmediate !== 'undefined', true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('raf', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].requestAnimationFrame === 'function', true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('setimmediate', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].setImmediate !== 'undefined', true); /* DOM Features */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('dom-mutationobserver', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('dom-mutationobserver', () => { if (true && Boolean(__WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].MutationObserver || __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].WebKitMutationObserver)) { // IE11 has an unreliable MutationObserver implementation where setProperty() does not // generate a mutation event, observers can crash, and the queue does not drain @@ -2371,18 +2371,18 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('dom-mutation } return false; }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('dom-webanimation', () => true && __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Animation !== undefined && __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].KeyframeEffect !== undefined, true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('dom-webanimation', () => true && __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Animation !== undefined && __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].KeyframeEffect !== undefined, true); //# sourceMappingURL=has.mjs.map /***/ }), -/***/ "./node_modules/@dojo/shim/support/queue.mjs": +/***/ "./node_modules/@dojo/framework/shim/support/queue.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export queueMicroTask */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); function executeTask(item) { @@ -2576,7 +2576,7 @@ let queueMicroTask = (function () { /***/ }), -/***/ "./node_modules/@dojo/shim/support/util.mjs": +/***/ "./node_modules/@dojo/framework/shim/support/util.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -2608,13 +2608,13 @@ function wrapNative(nativeFunction) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/Injector.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/Injector.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__ = __webpack_require__("./node_modules/@dojo/core/Evented.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__core_Evented__ = __webpack_require__("./node_modules/@dojo/framework/core/Evented.mjs"); -class Injector extends __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__["a" /* Evented */] { +class Injector extends __WEBPACK_IMPORTED_MODULE_0__core_Evented__["a" /* Evented */] { constructor(payload) { super(); this._payload = payload; @@ -2639,13 +2639,13 @@ class Injector extends __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__["a" /* E /***/ }), -/***/ "./node_modules/@dojo/widget-core/NodeHandler.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export NodeEventType */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__ = __webpack_require__("./node_modules/@dojo/core/Evented.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Map__ = __webpack_require__("./node_modules/@dojo/shim/Map.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__core_Evented__ = __webpack_require__("./node_modules/@dojo/framework/core/Evented.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__shim_Map__ = __webpack_require__("./node_modules/@dojo/framework/shim/Map.mjs"); /** @@ -2658,10 +2658,10 @@ var NodeEventType; NodeEventType["Projector"] = "Projector"; NodeEventType["Widget"] = "Widget"; })(NodeEventType || (NodeEventType = {})); -class NodeHandler extends __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__["a" /* Evented */] { +class NodeHandler extends __WEBPACK_IMPORTED_MODULE_0__core_Evented__["a" /* Evented */] { constructor() { super(...arguments); - this._nodeMap = new __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Map__["b" /* default */](); + this._nodeMap = new __WEBPACK_IMPORTED_MODULE_1__shim_Map__["b" /* default */](); } get(key) { return this._nodeMap.get(key); @@ -2690,16 +2690,16 @@ class NodeHandler extends __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__["a" / /***/ }), -/***/ "./node_modules/@dojo/widget-core/Registry.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/Registry.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["d"] = isWidgetBaseConstructor; /* unused harmony export isWidgetConstructorDefaultExport */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Promise__ = __webpack_require__("./node_modules/@dojo/shim/Promise.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Map__ = __webpack_require__("./node_modules/@dojo/shim/Map.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__dojo_shim_Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__ = __webpack_require__("./node_modules/@dojo/core/Evented.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_Promise__ = __webpack_require__("./node_modules/@dojo/framework/shim/Promise.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__shim_Map__ = __webpack_require__("./node_modules/@dojo/framework/shim/Map.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__shim_Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__core_Evented__ = __webpack_require__("./node_modules/@dojo/framework/core/Evented.mjs"); @@ -2707,7 +2707,7 @@ class NodeHandler extends __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__["a" / /** * Widget base symbol type */ -const WIDGET_BASE_TYPE = Object(__WEBPACK_IMPORTED_MODULE_2__dojo_shim_Symbol__["a" /* default */])('Widget Base'); +const WIDGET_BASE_TYPE = Object(__WEBPACK_IMPORTED_MODULE_2__shim_Symbol__["a" /* default */])('Widget Base'); /* harmony export (immutable) */ __webpack_exports__["b"] = WIDGET_BASE_TYPE; /** @@ -2728,7 +2728,7 @@ function isWidgetConstructorDefaultExport(item) { /** * The Registry implementation */ -class Registry extends __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__["a" /* Evented */] { +class Registry extends __WEBPACK_IMPORTED_MODULE_3__core_Evented__["a" /* Evented */] { /** * Emit loaded event for registry label */ @@ -2741,13 +2741,13 @@ class Registry extends __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__["a" /* E } define(label, item) { if (this._widgetRegistry === undefined) { - this._widgetRegistry = new __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Map__["b" /* default */](); + this._widgetRegistry = new __WEBPACK_IMPORTED_MODULE_1__shim_Map__["b" /* default */](); } if (this._widgetRegistry.has(label)) { throw new Error(`widget has already been registered for '${label.toString()}'`); } this._widgetRegistry.set(label, item); - if (item instanceof __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Promise__["a" /* default */]) { + if (item instanceof __WEBPACK_IMPORTED_MODULE_0__shim_Promise__["a" /* default */]) { item.then((widgetCtor) => { this._widgetRegistry.set(label, widgetCtor); this.emitLoadedEvent(label, widgetCtor); @@ -2762,12 +2762,12 @@ class Registry extends __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__["a" /* E } defineInjector(label, injectorFactory) { if (this._injectorRegistry === undefined) { - this._injectorRegistry = new __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Map__["b" /* default */](); + this._injectorRegistry = new __WEBPACK_IMPORTED_MODULE_1__shim_Map__["b" /* default */](); } if (this._injectorRegistry.has(label)) { throw new Error(`injector has already been registered for '${label.toString()}'`); } - const invalidator = new __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__["a" /* Evented */](); + const invalidator = new __WEBPACK_IMPORTED_MODULE_3__core_Evented__["a" /* Evented */](); const injectorItem = { injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })), invalidator @@ -2783,7 +2783,7 @@ class Registry extends __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__["a" /* E if (isWidgetBaseConstructor(item)) { return item; } - if (item instanceof __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Promise__["a" /* default */]) { + if (item instanceof __WEBPACK_IMPORTED_MODULE_0__shim_Promise__["a" /* default */]) { return null; } const promise = item(); @@ -2820,22 +2820,22 @@ class Registry extends __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__["a" /* E /***/ }), -/***/ "./node_modules/@dojo/widget-core/RegistryHandler.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__ = __webpack_require__("./node_modules/@dojo/shim/Map.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_core_Evented__ = __webpack_require__("./node_modules/@dojo/core/Evented.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Registry__ = __webpack_require__("./node_modules/@dojo/widget-core/Registry.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_Map__ = __webpack_require__("./node_modules/@dojo/framework/shim/Map.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__core_Evented__ = __webpack_require__("./node_modules/@dojo/framework/core/Evented.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Registry__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.mjs"); -class RegistryHandler extends __WEBPACK_IMPORTED_MODULE_1__dojo_core_Evented__["a" /* Evented */] { +class RegistryHandler extends __WEBPACK_IMPORTED_MODULE_1__core_Evented__["a" /* Evented */] { constructor() { super(); this._registry = new __WEBPACK_IMPORTED_MODULE_2__Registry__["a" /* Registry */](); - this._registryWidgetLabelMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["a" /* Map */](); - this._registryInjectorLabelMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["a" /* Map */](); + this._registryWidgetLabelMap = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["a" /* Map */](); + this._registryInjectorLabelMap = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["a" /* Map */](); this.own(this._registry); const destroy = () => { if (this.baseRegistry) { @@ -2904,19 +2904,19 @@ class RegistryHandler extends __WEBPACK_IMPORTED_MODULE_1__dojo_core_Evented__[" /***/ }), -/***/ "./node_modules/@dojo/widget-core/WidgetBase.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__ = __webpack_require__("./node_modules/@dojo/shim/Map.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_shim_WeakMap__ = __webpack_require__("./node_modules/@dojo/shim/WeakMap.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__dojo_shim_Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__d__ = __webpack_require__("./node_modules/@dojo/widget-core/d.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__diff__ = __webpack_require__("./node_modules/@dojo/widget-core/diff.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__RegistryHandler__ = __webpack_require__("./node_modules/@dojo/widget-core/RegistryHandler.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__NodeHandler__ = __webpack_require__("./node_modules/@dojo/widget-core/NodeHandler.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__vdom__ = __webpack_require__("./node_modules/@dojo/widget-core/vdom.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__Registry__ = __webpack_require__("./node_modules/@dojo/widget-core/Registry.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_Map__ = __webpack_require__("./node_modules/@dojo/framework/shim/Map.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__shim_WeakMap__ = __webpack_require__("./node_modules/@dojo/framework/shim/WeakMap.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__shim_Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__d__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__diff__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/diff.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__RegistryHandler__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__NodeHandler__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/NodeHandler.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__vdom__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/vdom.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__Registry__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.mjs"); @@ -2926,9 +2926,9 @@ class RegistryHandler extends __WEBPACK_IMPORTED_MODULE_1__dojo_core_Evented__[" -const decoratorMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */](); +const decoratorMap = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["b" /* default */](); const boundAuto = __WEBPACK_IMPORTED_MODULE_4__diff__["a" /* auto */].bind(null); -const noBind = __WEBPACK_IMPORTED_MODULE_2__dojo_shim_Symbol__["a" /* default */].for('dojoNoBind'); +const noBind = __WEBPACK_IMPORTED_MODULE_2__shim_Symbol__["a" /* default */].for('dojoNoBind'); /* harmony export (immutable) */ __webpack_exports__["b"] = noBind; /** @@ -2950,7 +2950,7 @@ class WidgetBase { this._nodeHandler = new __WEBPACK_IMPORTED_MODULE_6__NodeHandler__["a" /* default */](); this._handles = []; this._children = []; - this._decoratorCache = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */](); + this._decoratorCache = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["b" /* default */](); this._properties = {}; this._boundRenderFunc = this.render.bind(this); this._boundInvalidate = this.invalidate.bind(this); @@ -2975,7 +2975,7 @@ class WidgetBase { } meta(MetaType) { if (this._metaMap === undefined) { - this._metaMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */](); + this._metaMap = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["b" /* default */](); } let cached = this._metaMap.get(MetaType); if (!cached) { @@ -3059,9 +3059,14 @@ class WidgetBase { } } if (runReactions) { - this._mapDiffPropertyReactions(properties, changedPropertyKeys).forEach((args, reaction) => { - if (args.changed) { - reaction.call(this, args.previousProperties, args.newProperties); + const reactionFunctions = this.getDecorator('diffReaction'); + const executedReactions = []; + reactionFunctions.forEach(({ reaction, propertyName }) => { + const propertyChanged = changedPropertyKeys.indexOf(propertyName) !== -1; + const reactionRun = executedReactions.indexOf(reaction) !== -1; + if (propertyChanged && !reactionRun) { + reaction.call(this, this._properties, diffPropertyResults); + executedReactions.push(reaction); } }); } @@ -3124,7 +3129,7 @@ class WidgetBase { if (this.hasOwnProperty('constructor')) { let decoratorList = decoratorMap.get(this.constructor); if (!decoratorList) { - decoratorList = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */](); + decoratorList = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["b" /* default */](); decoratorMap.set(this.constructor, decoratorList); } let specificDecoratorList = decoratorList.get(decoratorKey); @@ -3176,26 +3181,6 @@ class WidgetBase { this._decoratorCache.set(decoratorKey, allDecorators); return allDecorators; } - _mapDiffPropertyReactions(newProperties, changedPropertyKeys) { - const reactionFunctions = this.getDecorator('diffReaction'); - return reactionFunctions.reduce((reactionPropertyMap, { reaction, propertyName }) => { - let reactionArguments = reactionPropertyMap.get(reaction); - if (reactionArguments === undefined) { - reactionArguments = { - previousProperties: {}, - newProperties: {}, - changed: false - }; - } - reactionArguments.previousProperties[propertyName] = this._properties[propertyName]; - reactionArguments.newProperties[propertyName] = newProperties[propertyName]; - if (changedPropertyKeys.indexOf(propertyName) !== -1) { - reactionArguments.changed = true; - } - reactionPropertyMap.set(reaction, reactionArguments); - return reactionPropertyMap; - }, new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */]()); - } /** * Binds unbound property functions to the specified `bind` property * @@ -3204,7 +3189,7 @@ class WidgetBase { _bindFunctionProperty(property, bind) { if (typeof property === 'function' && !property[noBind] && Object(__WEBPACK_IMPORTED_MODULE_8__Registry__["d" /* isWidgetBaseConstructor */])(property) === false) { if (this._bindFunctionPropertyMap === undefined) { - this._bindFunctionPropertyMap = new __WEBPACK_IMPORTED_MODULE_1__dojo_shim_WeakMap__["a" /* default */](); + this._bindFunctionPropertyMap = new __WEBPACK_IMPORTED_MODULE_1__shim_WeakMap__["a" /* default */](); } const bindInfo = this._bindFunctionPropertyMap.get(property) || {}; let { boundFunc, scope } = bindInfo; @@ -3258,7 +3243,7 @@ class WidgetBase { runAfterRenders(dNode) { const afterRenders = this.getDecorator('afterRender'); if (afterRenders.length > 0) { - return afterRenders.reduce((dNode, afterRenderFunction) => { + dNode = afterRenders.reduce((dNode, afterRenderFunction) => { return afterRenderFunction.call(this, dNode); }, dNode); } @@ -3298,7 +3283,7 @@ WidgetBase._type = __WEBPACK_IMPORTED_MODULE_8__Registry__["b" /* WIDGET_BASE_TY /***/ }), -/***/ "./node_modules/@dojo/widget-core/animations/cssTransitions.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -3368,7 +3353,7 @@ function enter(node, properties, enterAnimation) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/d.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/d.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -3380,24 +3365,24 @@ function enter(node, properties, enterAnimation) { /* harmony export (immutable) */ __webpack_exports__["h"] = w; /* harmony export (immutable) */ __webpack_exports__["g"] = v; /* harmony export (immutable) */ __webpack_exports__["c"] = dom; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); /** * The symbol identifier for a WNode type */ -const WNODE = Object(__WEBPACK_IMPORTED_MODULE_0__dojo_shim_Symbol__["a" /* default */])('Identifier for a WNode.'); +const WNODE = Object(__WEBPACK_IMPORTED_MODULE_0__shim_Symbol__["a" /* default */])('Identifier for a WNode.'); /* harmony export (immutable) */ __webpack_exports__["b"] = WNODE; /** * The symbol identifier for a VNode type */ -const VNODE = Object(__WEBPACK_IMPORTED_MODULE_0__dojo_shim_Symbol__["a" /* default */])('Identifier for a VNode.'); +const VNODE = Object(__WEBPACK_IMPORTED_MODULE_0__shim_Symbol__["a" /* default */])('Identifier for a VNode.'); /* harmony export (immutable) */ __webpack_exports__["a"] = VNODE; /** * The symbol identifier for a VNode type created using dom() */ -const DOMVNODE = Object(__WEBPACK_IMPORTED_MODULE_0__dojo_shim_Symbol__["a" /* default */])('Identifier for a VNode created using existing dom.'); +const DOMVNODE = Object(__WEBPACK_IMPORTED_MODULE_0__shim_Symbol__["a" /* default */])('Identifier for a VNode created using existing dom.'); /* unused harmony export DOMVNODE */ /** @@ -3499,12 +3484,12 @@ function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, child /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/afterRender.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = afterRender; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"); function afterRender(method) { return Object(__WEBPACK_IMPORTED_MODULE_0__handleDecorator__["a" /* handleDecorator */])((target, propertyKey) => { @@ -3516,13 +3501,13 @@ function afterRender(method) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = alwaysRender; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__beforeProperties__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__beforeProperties__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs"); function alwaysRender() { @@ -3537,12 +3522,12 @@ function alwaysRender() { /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = beforeProperties; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"); function beforeProperties(method) { return Object(__WEBPACK_IMPORTED_MODULE_0__handleDecorator__["a" /* handleDecorator */])((target, propertyKey) => { @@ -3554,13 +3539,13 @@ function beforeProperties(method) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/customElement.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = customElement; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__registerCustomElement__ = __webpack_require__("./node_modules/@dojo/widget-core/registerCustomElement.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Registry__ = __webpack_require__("./node_modules/@dojo/widget-core/Registry.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__registerCustomElement__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Registry__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.mjs"); /** @@ -3584,12 +3569,14 @@ function customElement({ tag, properties = [], attributes = [], events = [], chi /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = diffProperty; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__diff__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/diff.mjs"); + /** * Decorator that can be used to register a function as a specific property diff @@ -3598,7 +3585,7 @@ function customElement({ tag, properties = [], attributes = [], events = [], chi * @param diffType The diff type, default is DiffType.AUTO. * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM */ -function diffProperty(propertyName, diffFunction, reactionFunction) { +function diffProperty(propertyName, diffFunction = __WEBPACK_IMPORTED_MODULE_1__diff__["a" /* auto */], reactionFunction) { return Object(__WEBPACK_IMPORTED_MODULE_0__handleDecorator__["a" /* handleDecorator */])((target, propertyKey) => { target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null)); target.addDecorator('registeredDiffProperty', propertyName); @@ -3615,7 +3602,7 @@ function diffProperty(propertyName, diffFunction, reactionFunction) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -3641,21 +3628,21 @@ function handleDecorator(handler) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/inject.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = inject; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_WeakMap__ = __webpack_require__("./node_modules/@dojo/shim/WeakMap.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__handleDecorator__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__beforeProperties__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_WeakMap__ = __webpack_require__("./node_modules/@dojo/framework/shim/WeakMap.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__handleDecorator__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__beforeProperties__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs"); /** * Map of instances against registered injectors. */ -const registeredInjectorsMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_WeakMap__["a" /* default */](); +const registeredInjectorsMap = new __WEBPACK_IMPORTED_MODULE_0__shim_WeakMap__["a" /* default */](); /** * Decorator retrieves an injector from an available registry using the name and * calls the `getProperties` function with the payload from the injector @@ -3689,7 +3676,7 @@ function inject({ name, getProperties }) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/diff.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/diff.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -3698,7 +3685,7 @@ function inject({ name, getProperties }) { /* unused harmony export reference */ /* harmony export (immutable) */ __webpack_exports__["b"] = shallow; /* harmony export (immutable) */ __webpack_exports__["a"] = auto; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Registry__ = __webpack_require__("./node_modules/@dojo/widget-core/Registry.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Registry__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.mjs"); function isObjectOrArray(value) { return Object.prototype.toString.call(value) === '[object Object]' || Array.isArray(value); @@ -3768,7 +3755,7 @@ function auto(previousProperty, newProperty) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/mixins/Projector.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -3776,11 +3763,11 @@ function auto(previousProperty, newProperty) { /* unused harmony export AttachType */ /* harmony export (immutable) */ __webpack_exports__["a"] = ProjectorMixin; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_core_lang__ = __webpack_require__("./node_modules/@dojo/core/lang.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__animations_cssTransitions__ = __webpack_require__("./node_modules/@dojo/widget-core/animations/cssTransitions.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__decorators_afterRender__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/afterRender.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__d__ = __webpack_require__("./node_modules/@dojo/widget-core/d.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__vdom__ = __webpack_require__("./node_modules/@dojo/widget-core/vdom.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__core_lang__ = __webpack_require__("./node_modules/@dojo/framework/core/lang.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__animations_cssTransitions__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__decorators_afterRender__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__d__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__vdom__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/vdom.mjs"); @@ -3878,7 +3865,7 @@ function ProjectorMixin(Base) { this._projectorProperties.registry.destroy(); } } - this._projectorProperties = Object(__WEBPACK_IMPORTED_MODULE_1__dojo_core_lang__["a" /* assign */])({}, properties); + this._projectorProperties = Object(__WEBPACK_IMPORTED_MODULE_1__core_lang__["a" /* assign */])({}, properties); super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry }); super.__setProperties__(properties); } @@ -3929,10 +3916,7 @@ function ProjectorMixin(Base) { } } __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __decorate */]([ - Object(__WEBPACK_IMPORTED_MODULE_3__decorators_afterRender__["a" /* afterRender */])(), - __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __metadata */]("design:type", Function), - __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __metadata */]("design:paramtypes", [Object]), - __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __metadata */]("design:returntype", void 0) + Object(__WEBPACK_IMPORTED_MODULE_3__decorators_afterRender__["a" /* afterRender */])() ], Projector.prototype, "afterRender", null); return Projector; } @@ -3941,7 +3925,7 @@ function ProjectorMixin(Base) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/mixins/Themed.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -3949,11 +3933,11 @@ function ProjectorMixin(Base) { /* harmony export (immutable) */ __webpack_exports__["b"] = registerThemeInjector; /* harmony export (immutable) */ __webpack_exports__["a"] = ThemedMixin; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Injector__ = __webpack_require__("./node_modules/@dojo/widget-core/Injector.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__decorators_inject__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/inject.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__decorators_handleDecorator__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/diffProperty.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__diff__ = __webpack_require__("./node_modules/@dojo/widget-core/diff.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Injector__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/Injector.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__decorators_inject__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/inject.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__decorators_handleDecorator__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__diff__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/diff.mjs"); @@ -4066,7 +4050,7 @@ function ThemedMixin(Base) { const baseThemes = this.getDecorator('baseThemeClasses'); if (!this._registeredBaseTheme) { this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => { - const _a = THEME_KEY, key = baseTheme[_a], classes = __WEBPACK_IMPORTED_MODULE_0_tslib__["c" /* __rest */](baseTheme, [typeof _a === "symbol" ? _a : _a + ""]); + const _a = THEME_KEY, key = baseTheme[_a], classes = __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __rest */](baseTheme, [typeof _a === "symbol" ? _a : _a + ""]); this._registeredBaseThemeKeys.push(key); return Object.assign({}, finalBaseTheme, classes); }, {}); @@ -4080,10 +4064,7 @@ function ThemedMixin(Base) { }; __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __decorate */]([ Object(__WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__["a" /* diffProperty */])('theme', __WEBPACK_IMPORTED_MODULE_5__diff__["b" /* shallow */]), - Object(__WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__["a" /* diffProperty */])('extraClasses', __WEBPACK_IMPORTED_MODULE_5__diff__["b" /* shallow */]), - __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __metadata */]("design:type", Function), - __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __metadata */]("design:paramtypes", []), - __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __metadata */]("design:returntype", void 0) + Object(__WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__["a" /* diffProperty */])('extraClasses', __WEBPACK_IMPORTED_MODULE_5__diff__["b" /* shallow */]) ], Themed.prototype, "onPropertiesChanged", null); Themed = __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __decorate */]([ Object(__WEBPACK_IMPORTED_MODULE_2__decorators_inject__["a" /* inject */])({ @@ -4103,7 +4084,7 @@ function ThemedMixin(Base) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/registerCustomElement.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -4113,13 +4094,13 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony export (immutable) */ __webpack_exports__["create"] = create; /* harmony export (immutable) */ __webpack_exports__["register"] = register; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__WidgetBase__ = __webpack_require__("./node_modules/@dojo/widget-core/WidgetBase.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mixins_Projector__ = __webpack_require__("./node_modules/@dojo/widget-core/mixins/Projector.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__dojo_shim_array__ = __webpack_require__("./node_modules/@dojo/shim/array.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__d__ = __webpack_require__("./node_modules/@dojo/widget-core/d.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__mixins_Themed__ = __webpack_require__("./node_modules/@dojo/widget-core/mixins/Themed.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__decorators_alwaysRender__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__WidgetBase__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/WidgetBase.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mixins_Projector__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__shim_array__ = __webpack_require__("./node_modules/@dojo/framework/shim/array.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__d__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__shim_global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__mixins_Themed__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__decorators_alwaysRender__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs"); @@ -4216,7 +4197,7 @@ function create(descriptor, WidgetConstructor) { }); Object.defineProperties(this, domProperties); const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children; - Object(__WEBPACK_IMPORTED_MODULE_3__dojo_shim_array__["a" /* from */])(children).forEach((childNode) => { + Object(__WEBPACK_IMPORTED_MODULE_3__shim_array__["a" /* from */])(children).forEach((childNode) => { if (childType === CustomElementChildType.DOJO) { childNode.addEventListener('dojo-ce-render', () => this._render()); childNode.addEventListener('dojo-ce-connected', () => this._render()); @@ -4236,7 +4217,7 @@ function create(descriptor, WidgetConstructor) { }; const registry = registryFactory(); const themeContext = Object(__WEBPACK_IMPORTED_MODULE_6__mixins_Themed__["b" /* registerThemeInjector */])(this._getTheme(), registry); - __WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */].addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme())); + __WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */].addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme())); const Projector = Object(__WEBPACK_IMPORTED_MODULE_2__mixins_Projector__["a" /* ProjectorMixin */])(Wrapper); this._projector = new Projector(); this._projector.setProperties({ registry }); @@ -4248,8 +4229,8 @@ function create(descriptor, WidgetConstructor) { })); } _getTheme() { - if (__WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */] && __WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */].dojoce && __WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */].dojoce.theme) { - return __WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */].dojoce.themes[__WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */].dojoce.theme]; + if (__WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */] && __WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */].dojoce && __WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */].dojoce.theme) { + return __WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */].dojoce.themes[__WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */].dojoce.theme]; } } _childConnected(e) { @@ -4329,25 +4310,25 @@ function register(WidgetConstructor) { if (!descriptor) { throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?'); } - __WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */].customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor)); + __WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */].customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor)); } /* harmony default export */ __webpack_exports__["default"] = (register); //# sourceMappingURL=registerCustomElement.mjs.map /***/ }), -/***/ "./node_modules/@dojo/widget-core/vdom.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/vdom.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export toParentVNode */ /* unused harmony export toTextVNode */ /* unused harmony export filterAndDecorateChildren */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_shim_array__ = __webpack_require__("./node_modules/@dojo/shim/array.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__d__ = __webpack_require__("./node_modules/@dojo/widget-core/d.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Registry__ = __webpack_require__("./node_modules/@dojo/widget-core/Registry.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__ = __webpack_require__("./node_modules/@dojo/shim/WeakMap.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__shim_array__ = __webpack_require__("./node_modules/@dojo/framework/shim/array.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__d__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Registry__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__ = __webpack_require__("./node_modules/@dojo/framework/shim/WeakMap.mjs"); @@ -4357,11 +4338,13 @@ const NAMESPACE_W3 = 'http://www.w3.org/'; const NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg'; const NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink'; const emptyArray = []; -const widgetInstanceMap = new __WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__["a" /* default */](); +const nodeOperations = ['focus', 'blur', 'scrollIntoView', 'click']; +const widgetInstanceMap = new __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__["a" /* default */](); /* harmony export (immutable) */ __webpack_exports__["b"] = widgetInstanceMap; -const instanceMap = new __WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__["a" /* default */](); -const projectorStateMap = new __WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__["a" /* default */](); +const instanceMap = new __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__["a" /* default */](); +const nextSiblingMap = new __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__["a" /* default */](); +const projectorStateMap = new __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__["a" /* default */](); function same(dnode1, dnode2) { if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["e" /* isVNode */])(dnode1) && Object(__WEBPACK_IMPORTED_MODULE_2__d__["e" /* isVNode */])(dnode2)) { if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["d" /* isDomVNode */])(dnode1) || Object(__WEBPACK_IMPORTED_MODULE_2__d__["d" /* isDomVNode */])(dnode2)) { @@ -4418,7 +4401,7 @@ function checkStyleValue(styleValue) { } function updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) { const projectorState = projectorStateMap.get(projectionOptions.projectorInstance); - const eventMap = projectorState.nodeMap.get(domNode) || new __WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__["a" /* default */](); + const eventMap = projectorState.nodeMap.get(domNode) || new __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__["a" /* default */](); if (previousValue) { const previousEvent = eventMap.get(previousValue); domNode.removeEventListener(eventName, previousEvent); @@ -4478,7 +4461,7 @@ function buildPreviousProperties(domNode, previous, current) { }, {}); return newProperties; } -function focusNode(propValue, previousValue, domNode, projectionOptions) { +function nodeOperation(propName, propValue, previousValue, domNode, projectionOptions) { let result; if (typeof propValue === 'function') { result = propValue(); @@ -4489,7 +4472,7 @@ function focusNode(propValue, previousValue, domNode, projectionOptions) { if (result === true) { const projectorState = projectorStateMap.get(projectionOptions.projectorInstance); projectorState.deferredRenderCallbacks.push(() => { - domNode.focus(); + domNode[propName](); }); } } @@ -4585,8 +4568,8 @@ function updateProperties(domNode, previousProperties, properties, projectionOpt } } } - else if (propName === 'focus') { - focusNode(propValue, previousValue, domNode, projectionOptions); + else if (nodeOperations.indexOf(propName) !== -1) { + nodeOperation(propName, propValue, previousValue, domNode, projectionOptions); } else if (propName === 'styles') { const styleNames = Object.keys(propValue); @@ -4740,7 +4723,8 @@ function nodeAdded(dnode, transitions) { } function nodeToRemove(dnode, transitions, projectionOptions) { if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["f" /* isWNode */])(dnode)) { - const rendered = dnode.rendered || emptyArray; + const item = instanceMap.get(dnode.instance); + const rendered = (item ? item.dnode.rendered : dnode.rendered) || emptyArray; if (dnode.instance) { const instanceData = widgetInstanceMap.get(dnode.instance); instanceData.onDetach(); @@ -4804,7 +4788,7 @@ function checkDistinguishable(childNodes, indexToCheck, parentInstance) { } } } -function updateChildren(parentVNode, oldChildren, newChildren, parentInstance, projectionOptions) { +function updateChildren(parentVNode, siblings, oldChildren, newChildren, parentInstance, projectionOptions) { oldChildren = oldChildren || emptyArray; newChildren = newChildren; const oldChildrenLength = oldChildren.length; @@ -4824,38 +4808,49 @@ function updateChildren(parentVNode, oldChildren, newChildren, parentInstance, p addDeferredProperties(newChild, projectionOptions); } if (oldChild !== undefined && same(oldChild, newChild)) { - textUpdated = updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance) || textUpdated; oldIndex++; newIndex++; + textUpdated = + updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance, oldChildren.slice(oldIndex), newChildren.slice(newIndex)) || textUpdated; continue; } const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1); const addChild = () => { let insertBeforeDomNode = undefined; + let childrenArray = oldChildren; + let nextIndex = oldIndex + 1; let child = oldChildren[oldIndex]; + if (!child) { + child = siblings[0]; + nextIndex = 1; + childrenArray = siblings; + } if (child) { - let nextIndex = oldIndex + 1; let insertBeforeChildren = [child]; while (insertBeforeChildren.length) { const insertBefore = insertBeforeChildren.shift(); if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["f" /* isWNode */])(insertBefore)) { - if (insertBefore.rendered) { - insertBeforeChildren.push(...insertBefore.rendered); + const item = instanceMap.get(insertBefore.instance); + if (item && item.dnode.rendered) { + insertBeforeChildren.push(...item.dnode.rendered); } } else { if (insertBefore.domNode) { + if (insertBefore.domNode.parentElement !== parentVNode.domNode) { + break; + } insertBeforeDomNode = insertBefore.domNode; break; } } - if (insertBeforeChildren.length === 0 && oldChildren[nextIndex]) { - insertBeforeChildren.push(oldChildren[nextIndex]); + if (insertBeforeChildren.length === 0 && childrenArray[nextIndex]) { + insertBeforeChildren.push(childrenArray[nextIndex]); nextIndex++; } } } - createDom(newChild, parentVNode, insertBeforeDomNode, projectionOptions, parentInstance); + createDom(newChild, parentVNode, newChildren.slice(newIndex + 1), insertBeforeDomNode, projectionOptions, parentInstance); nodeAdded(newChild, transitions); const indexToCheck = newIndex; projectorState.afterRenderCallbacks.push(() => { @@ -4916,12 +4911,13 @@ function addChildren(parentVNode, children, projectionOptions, parentInstance, i } const projectorState = projectorStateMap.get(projectionOptions.projectorInstance); if (projectorState.merge && childNodes === undefined) { - childNodes = Object(__WEBPACK_IMPORTED_MODULE_1__dojo_shim_array__["a" /* from */])(parentVNode.domNode.childNodes); + childNodes = Object(__WEBPACK_IMPORTED_MODULE_1__shim_array__["a" /* from */])(parentVNode.domNode.childNodes); } const transitions = projectionOptions.transitions; projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 }); for (let i = 0; i < children.length; i++) { const child = children[i]; + const nextSiblings = children.slice(i + 1); if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["e" /* isVNode */])(child)) { if (projectorState.merge && childNodes) { let domElement = undefined; @@ -4932,10 +4928,10 @@ function addChildren(parentVNode, children, projectionOptions, parentInstance, i } } } - createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance); + createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance); } else { - createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes); + createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes); } nodeAdded(child, transitions); } @@ -4963,7 +4959,7 @@ function initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOpt } dnode.inserted = true; } -function createDom(dnode, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes) { +function createDom(dnode, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes) { let domNode; const projectorState = projectorStateMap.get(projectionOptions.projectorInstance); if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["f" /* isWNode */])(dnode)) { @@ -4978,6 +4974,7 @@ function createDom(dnode, parentVNode, insertBefore, projectionOptions, parentIn } const instance = new widgetConstructor(); dnode.instance = instance; + nextSiblingMap.set(instance, nextSiblings); const instanceData = widgetInstanceMap.get(instance); instanceData.invalidate = () => { instanceData.dirty = true; @@ -5058,7 +5055,7 @@ function createDom(dnode, parentVNode, insertBefore, projectionOptions, parentIn } } } -function updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance) { +function updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance, oldNextSiblings, nextSiblings) { if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["f" /* isWNode */])(dnode)) { const { instance } = previous; const { parentVNode, dnode: node } = instanceMap.get(instance); @@ -5068,12 +5065,13 @@ function updateDom(previous, dnode, projectionOptions, parentVNode, parentInstan instance.__setCoreProperties__(dnode.coreProperties); instance.__setChildren__(dnode.children); instance.__setProperties__(dnode.properties); + nextSiblingMap.set(instance, nextSiblings); dnode.instance = instance; if (instanceData.dirty === true) { const rendered = instance.__render__(); instanceData.rendering = false; dnode.rendered = filterAndDecorateChildren(rendered, instance); - updateChildren(parentVNode, previousRendered, dnode.rendered, instance, projectionOptions); + updateChildren(parentVNode, oldNextSiblings, previousRendered, dnode.rendered, instance, projectionOptions); } else { instanceData.rendering = false; @@ -5106,7 +5104,7 @@ function updateDom(previous, dnode, projectionOptions, parentVNode, parentInstan const children = filterAndDecorateChildren(dnode.children, parentInstance); dnode.children = children; updated = - updateChildren(dnode, previous.children, children, parentInstance, projectionOptions) || updated; + updateChildren(dnode, oldNextSiblings, previous.children, children, parentInstance, projectionOptions) || updated; } const previousProperties = buildPreviousProperties(domNode, previous, dnode); if (dnode.attributes && dnode.events) { @@ -5156,7 +5154,7 @@ function runDeferredRenderCallbacks(projectionOptions) { } } else { - __WEBPACK_IMPORTED_MODULE_0__dojo_shim_global__["a" /* default */].requestAnimationFrame(() => { + __WEBPACK_IMPORTED_MODULE_0__shim_global__["a" /* default */].requestAnimationFrame(() => { while (projectorState.deferredRenderCallbacks.length) { const callback = projectorState.deferredRenderCallbacks.shift(); callback && callback(); @@ -5174,8 +5172,8 @@ function runAfterRenderCallbacks(projectionOptions) { } } else { - if (__WEBPACK_IMPORTED_MODULE_0__dojo_shim_global__["a" /* default */].requestIdleCallback) { - __WEBPACK_IMPORTED_MODULE_0__dojo_shim_global__["a" /* default */].requestIdleCallback(() => { + if (__WEBPACK_IMPORTED_MODULE_0__shim_global__["a" /* default */].requestIdleCallback) { + __WEBPACK_IMPORTED_MODULE_0__shim_global__["a" /* default */].requestIdleCallback(() => { while (projectorState.afterRenderCallbacks.length) { const callback = projectorState.afterRenderCallbacks.shift(); callback && callback(); @@ -5198,7 +5196,7 @@ function scheduleRender(projectionOptions) { render(projectionOptions); } else if (projectorState.renderScheduled === undefined) { - projectorState.renderScheduled = __WEBPACK_IMPORTED_MODULE_0__dojo_shim_global__["a" /* default */].requestAnimationFrame(() => { + projectorState.renderScheduled = __WEBPACK_IMPORTED_MODULE_0__shim_global__["a" /* default */].requestAnimationFrame(() => { render(projectionOptions); }); } @@ -5217,7 +5215,8 @@ function render(projectionOptions) { previouslyRendered.push(instance); const { parentVNode, dnode } = instanceMap.get(instance); const instanceData = widgetInstanceMap.get(instance); - updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance); + const nextSiblings = nextSiblingMap.get(instance); + updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance, nextSiblings, nextSiblings); } } runAfterRenderCallbacks(projectionOptions); @@ -5230,7 +5229,7 @@ const dom = { const projectorState = { afterRenderCallbacks: [], deferredRenderCallbacks: [], - nodeMap: new __WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__["a" /* default */](), + nodeMap: new __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__["a" /* default */](), renderScheduled: undefined, renderQueue: [], merge: projectionOptions.merge || false, @@ -5248,7 +5247,7 @@ const dom = { scheduleRender(finalProjectorOptions); } }; - updateDom(node, node, finalProjectorOptions, parentVNode, instance); + updateDom(node, node, finalProjectorOptions, parentVNode, instance, [], []); projectorState.afterRenderCallbacks.push(() => { instanceData.onAttach(); }); @@ -5282,7 +5281,7 @@ const dom = { /*** IMPORTS FROM imports-loader ***/ var widgetFactory = __webpack_require__("./src/menu-item/MenuItem.ts"); -var registerCustomElement = __webpack_require__("./node_modules/@dojo/widget-core/registerCustomElement.mjs").default; +var registerCustomElement = __webpack_require__("./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs").default; var defaultExport = widgetFactory.default; defaultExport && registerCustomElement(defaultExport); @@ -5488,10 +5487,10 @@ process.umask = function() { return 0; }; "use strict"; /* unused harmony export __extends */ /* unused harmony export __assign */ -/* harmony export (immutable) */ __webpack_exports__["c"] = __rest; +/* harmony export (immutable) */ __webpack_exports__["b"] = __rest; /* harmony export (immutable) */ __webpack_exports__["a"] = __decorate; /* unused harmony export __param */ -/* harmony export (immutable) */ __webpack_exports__["b"] = __metadata; +/* unused harmony export __metadata */ /* unused harmony export __awaiter */ /* unused harmony export __generator */ /* unused harmony export __exportStar */ @@ -5708,10 +5707,10 @@ module.exports = g; Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MenuItem", function() { return MenuItem; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_widget_core_d__ = __webpack_require__("./node_modules/@dojo/widget-core/d.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__dojo_widget_core_decorators_customElement__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/customElement.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__dojo_widget_core_mixins_Themed__ = __webpack_require__("./node_modules/@dojo/widget-core/mixins/Themed.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__dojo_widget_core_WidgetBase__ = __webpack_require__("./node_modules/@dojo/widget-core/WidgetBase.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_framework_widget_core_d__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__dojo_framework_widget_core_decorators_customElement__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__dojo_framework_widget_core_mixins_Themed__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__dojo_framework_widget_core_WidgetBase__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/WidgetBase.mjs"); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__menuItem_m_css__ = __webpack_require__("./src/menu-item/menuItem.m.css"); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__menuItem_m_css___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5__menuItem_m_css__); @@ -5720,14 +5719,14 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); -let MenuItem = class MenuItem extends Object(__WEBPACK_IMPORTED_MODULE_3__dojo_widget_core_mixins_Themed__["a" /* ThemedMixin */])(__WEBPACK_IMPORTED_MODULE_4__dojo_widget_core_WidgetBase__["a" /* WidgetBase */]) { +let MenuItem = class MenuItem extends Object(__WEBPACK_IMPORTED_MODULE_3__dojo_framework_widget_core_mixins_Themed__["a" /* ThemedMixin */])(__WEBPACK_IMPORTED_MODULE_4__dojo_framework_widget_core_WidgetBase__["a" /* WidgetBase */]) { _onClick() { this.properties.onSelected && this.properties.onSelected(this.properties.data); } render() { const { title, selected } = this.properties; - return Object(__WEBPACK_IMPORTED_MODULE_1__dojo_widget_core_d__["g" /* v */])('li', { classes: this.theme(__WEBPACK_IMPORTED_MODULE_5__menuItem_m_css__["root"]) }, [ - Object(__WEBPACK_IMPORTED_MODULE_1__dojo_widget_core_d__["g" /* v */])('span', { + return Object(__WEBPACK_IMPORTED_MODULE_1__dojo_framework_widget_core_d__["g" /* v */])('li', { classes: this.theme(__WEBPACK_IMPORTED_MODULE_5__menuItem_m_css__["root"]) }, [ + Object(__WEBPACK_IMPORTED_MODULE_1__dojo_framework_widget_core_d__["g" /* v */])('span', { classes: this.theme([__WEBPACK_IMPORTED_MODULE_5__menuItem_m_css__["item"], selected ? __WEBPACK_IMPORTED_MODULE_5__menuItem_m_css__["selected"] : null]), onclick: this._onClick }, [title]) @@ -5735,13 +5734,13 @@ let MenuItem = class MenuItem extends Object(__WEBPACK_IMPORTED_MODULE_3__dojo_w } }; MenuItem = __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __decorate */]([ - Object(__WEBPACK_IMPORTED_MODULE_2__dojo_widget_core_decorators_customElement__["a" /* customElement */])({ + Object(__WEBPACK_IMPORTED_MODULE_2__dojo_framework_widget_core_decorators_customElement__["a" /* customElement */])({ tag: 'demo-menu-item', attributes: ['title', 'selected'], events: ['onSelected'], properties: ['data', 'selected'] }), - Object(__WEBPACK_IMPORTED_MODULE_3__dojo_widget_core_mixins_Themed__["c" /* theme */])(__WEBPACK_IMPORTED_MODULE_5__menuItem_m_css__) + Object(__WEBPACK_IMPORTED_MODULE_3__dojo_framework_widget_core_mixins_Themed__["c" /* theme */])(__WEBPACK_IMPORTED_MODULE_5__menuItem_m_css__) ], MenuItem); /* harmony default export */ __webpack_exports__["default"] = (MenuItem); @@ -5766,4 +5765,4 @@ module.exports = __webpack_require__("./node_modules/imports-loader/index.js?wid /***/ }) /******/ }));; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgOWRjNTQxZGRkOTk2ODFhYWZhN2MiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2NvcmUvRGVzdHJveWFibGUubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9jb3JlL0V2ZW50ZWQubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9jb3JlL2xhbmcubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9oYXMvaGFzLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9NYXAubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL1Byb21pc2UubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL1N5bWJvbC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vV2Vha01hcC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vYXJyYXkubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL2dsb2JhbC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vaXRlcmF0b3IubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL251bWJlci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vb2JqZWN0Lm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdHJpbmcubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL3N1cHBvcnQvaGFzLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdXBwb3J0L3F1ZXVlLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdXBwb3J0L3V0aWwubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9JbmplY3Rvci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL05vZGVIYW5kbGVyLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvUmVnaXN0cnkubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9SZWdpc3RyeUhhbmRsZXIubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9XaWRnZXRCYXNlLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvYW5pbWF0aW9ucy9jc3NUcmFuc2l0aW9ucy5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2QubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2FmdGVyUmVuZGVyLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9hbHdheXNSZW5kZXIubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2JlZm9yZVByb3BlcnRpZXMubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2N1c3RvbUVsZW1lbnQubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2RpZmZQcm9wZXJ0eS5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaGFuZGxlRGVjb3JhdG9yLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9pbmplY3QubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kaWZmLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvbWl4aW5zL1Byb2plY3Rvci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL21peGlucy9UaGVtZWQubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9yZWdpc3RlckN1c3RvbUVsZW1lbnQubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS92ZG9tLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vY2xpLWJ1aWxkLXdpZGdldC90ZW1wbGF0ZS9jdXN0b20tZWxlbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbWVudS1pdGVtL01lbnVJdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9tZW51LWl0ZW0vbWVudUl0ZW0ubS5jc3M/NmE5NSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUFzRCwrREFBK0Q7O0FBRXJIO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7QUM3RGdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEIsaUJBQWlCLE9BQU87QUFDeEI7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvQkFBb0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQSx3Qzs7Ozs7Ozs7Ozs7QUN2REE7QUFDc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsZ0NBQWdDO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2RWlCO0FBQ0E7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiwyQkFBMkI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLG9CQUFvQjtBQUMzQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsaUM7Ozs7Ozs7Ozs7OztBQ25NQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLE9BQU8saUJBQWlCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxRQUFRO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRUFBMkUsUUFBUTtBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxnQzs7Ozs7Ozs7Ozs7Ozs7O0FDbk1vQztBQUNwQztBQUN5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLHFCQUFxQjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxZQUFZO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFELFlBQVk7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0M7Ozs7Ozs7Ozs7Ozs7QUMvRkE7QUFDeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsTUFBTTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MsV0FBVztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsTUFBTTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QixxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7Ozs7O0FDdE1BO0FBQ0E7QUFDNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsSUFBSTtBQUNwQixnQkFBZ0IsT0FBTztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxJQUFJO0FBQ2hCLFlBQVksVUFBVTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxtQzs7Ozs7Ozs7Ozs7OztBQ2hKQTtBQUNzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxxQkFBcUI7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGdDQUFnQztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlHQTtBQUNrQztBQUNQO0FBQzNCO0FBQ3FCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3RELG9EQUFvRDtBQUNwRCxpREFBaUQ7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRUFBcUU7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsc0JBQXNCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFlBQVk7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLFNBQVM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0M7Ozs7Ozs7O0FDdlBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG1DOzs7Ozs7Ozs7Ozs7Ozs7QUNqQkE7QUFDaUQ7QUFDakQsb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDOzs7Ozs7Ozs7Ozs7O0FDOUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyREE7QUFDQTtBQUNtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0Q7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLElBQUk7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlHQTtBQUNBO0FBQ3FCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELFlBQVk7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RkFBd0Y7QUFDeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DOzs7Ozs7Ozs7OztBQ3hTbUI7QUFDbkI7MEVBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsRUFBRTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCxFQUFFO0FBQ2pFLG1DQUFtQyxtQkFBbUI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxnQzs7Ozs7Ozs7Ozs7QUNyS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFBQTtBQUFBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4RUFBOEU7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFBQTtBQUFBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsYUFBYSxrQkFBa0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Qzs7Ozs7Ozs7QUNyWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZELGNBQWM7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSw4REFBOEQsZUFBZTtBQUM3RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQXFCLGlCQUFpQixZQUFZLFNBQVMscUJBQXFCO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCOzs7Ozs7Ozs7O0FDNUcwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDOzs7Ozs7Ozs7OztBQ1AwQjtBQUNDO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUM7Ozs7Ozs7Ozs7QUNWMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSw2Qzs7Ozs7Ozs7Ozs7QUNQaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUErQixnUEFBc0k7QUFDcks7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEM7Ozs7Ozs7Ozs7QUNuQjBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxhQUFhO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHlDOzs7Ozs7OztBQ3JCQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Qzs7Ozs7Ozs7Ozs7O0FDakJBO0FBQzBCO0FBQ0M7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUF3QixzQkFBc0I7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsd0JBQXdCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EsbUM7Ozs7Ozs7Ozs7Ozs7O0FDcEMyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDakVBO0FBQ2lCO0FBQ2pCO0FBQ3NCO0FBQ1Y7QUFDRTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxvREFBb0Q7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGdDQUFnQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0hBQWlEO0FBQ2pELHlDQUF5QyxnREFBZ0Q7QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVGQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsYUFBYTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNELDRCQUE0QixxQkFBcUI7QUFDdkc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDOzs7Ozs7Ozs7Ozs7Ozs7OztBQzVKQTtBQUNtQjtBQUNGO0FBQ1M7QUFDSDtBQUNMO0FBQ2xCO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLLElBQUk7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsVUFBVTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFdBQVcsRUFBRTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDLGlCQUFpQixJQUFJO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QyxhQUFhLElBQUk7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvSUE7QUFDNkI7QUFDSjtBQUNWO0FBQ0U7QUFDakI7QUFDZ0M7QUFDVDtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyx3REFBd0Q7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLElBQUk7QUFDbkM7QUFDQTtBQUNBO0FBQ0EsYUFBYSxJQUFJO0FBQ2pCLDRFQUF3QixvREFBb0Q7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcseUNBQXlDO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGlDQUFpQztBQUNwRCwrQ0FBK0M7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUdBQTZDLG1DQUFtQztBQUNoRjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxXQUFXO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsVUFBVTtBQUNyQyx3R0FBb0Q7QUFDcEQsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsSUFBSTtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0Q7Ozs7Ozs7Ozs7Ozs7Ozs7QUNwTkE7QUFDNEI7QUFDeUI7QUFDbkI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qix1QkFBdUI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsdUJBQXVCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLG1DQUFtQztBQUM5QztBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0EsZ0JBQWdCLGVBQWUsc0NBQXNDO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLElBQUk7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixlQUFlO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsdUNBQXVDO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsZUFBZTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLDRCQUE0QjtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLDRCQUE0QjtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLHVCQUF1QjtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLDJCQUEyQjtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixnQkFBZ0I7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixxQkFBcUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSxpQkFBaUIsS0FBSztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHFCQUFxQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixxQkFBcUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsMkJBQTJCO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQSxXQUFXLE1BQU07QUFDakI7QUFDQSx1QkFBdUIsdUJBQXVCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsV0FBVyxrTEFBa0wsZUFBZTtBQUMxUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxzQkFBc0IscUNBQXFDO0FBQ25HO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsdUJBQXVCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0Msc0JBQXNCLHFDQUFxQztBQUNuRyxtQkFBbUIscUJBQXFCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDLG9DQUFvQztBQUNwQyx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0EsaURBQWlELHFCQUFxQjtBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsb0JBQW9CO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsMkNBQTJDO0FBQzVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMscUJBQXFCO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RCxzQkFBc0IsMkJBQTJCO0FBQ3pHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFdBQVc7QUFDMUIsZUFBZSwyQkFBMkI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxxQkFBcUI7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRCxzQkFBc0IsMkJBQTJCO0FBQ3JHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQscUJBQXFCO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFdBQVc7QUFDMUI7QUFDQTtBQUNBLG1CQUFtQixxQkFBcUI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtFQUFrRTtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsMkJBQTJCO0FBQzlEO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCwrQ0FBK0M7QUFDaEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTCw4REFBOEQ7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQSxpQzs7Ozs7OztBQ3g1QkE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7QUNOQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHNCQUFzQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDOztBQUVyQztBQUNBO0FBQ0E7O0FBRUEsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixVQUFVOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdkx0QztBQUFBO0FBQ0E7QUFDQSwrREFBK0Q7QUFDL0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU0sZ0JBQWdCLHNDQUFzQyxpQkFBaUIsRUFBRTtBQUMvRSxxQkFBcUIsdURBQXVEOztBQUU1RTtBQUNBO0FBQ0EsbUJBQW1CLHNCQUFzQjtBQUN6QztBQUNBOztBQUVBO0FBQ0EsNENBQTRDLE9BQU87QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTRELGNBQWM7QUFDMUU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7O0FBRUE7QUFDQSxtQ0FBbUMsb0NBQW9DO0FBQ3ZFOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUNBQW1DLE1BQU0sNkJBQTZCLEVBQUUsWUFBWSxXQUFXLEVBQUU7QUFDakcsa0NBQWtDLE1BQU0saUNBQWlDLEVBQUUsWUFBWSxXQUFXLEVBQUU7QUFDcEcsK0JBQStCLGlFQUFpRSx1QkFBdUIsRUFBRSw0QkFBNEI7QUFDcko7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSxhQUFhLDZCQUE2QiwwQkFBMEIsYUFBYSxFQUFFLHFCQUFxQjtBQUN4RyxnQkFBZ0IscURBQXFELG9FQUFvRSxhQUFhLEVBQUU7QUFDeEosc0JBQXNCLHNCQUFzQixxQkFBcUIsR0FBRztBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsa0NBQWtDLFNBQVM7QUFDM0Msa0NBQWtDLFdBQVcsVUFBVTtBQUN2RCx5Q0FBeUMsY0FBYztBQUN2RDtBQUNBLDZHQUE2RyxPQUFPLFVBQVU7QUFDOUgsZ0ZBQWdGLGlCQUFpQixPQUFPO0FBQ3hHLHdEQUF3RCxnQkFBZ0IsUUFBUSxPQUFPO0FBQ3ZGLDhDQUE4QyxnQkFBZ0IsZ0JBQWdCLE9BQU87QUFDckY7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBLFNBQVMsWUFBWSxhQUFhLE9BQU8sRUFBRSxVQUFVLFdBQVc7QUFDaEUsbUNBQW1DLFNBQVM7QUFDNUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixNQUFNLGdCQUFnQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixzQkFBc0I7QUFDdkM7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCLHNCQUFzQjtBQUNsRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixzRkFBc0YsYUFBYSxFQUFFO0FBQ3RILHNCQUFzQixnQ0FBZ0MscUNBQXFDLDBDQUEwQyxFQUFFLEVBQUUsR0FBRztBQUM1SSwyQkFBMkIsTUFBTSxlQUFlLEVBQUUsWUFBWSxvQkFBb0IsRUFBRTtBQUNwRixzQkFBc0Isb0dBQW9HO0FBQzFILDZCQUE2Qix1QkFBdUI7QUFDcEQsNEJBQTRCLHdCQUF3QjtBQUNwRCwyQkFBMkIseURBQXlEO0FBQ3BGOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsNENBQTRDLFNBQVMsRUFBRSxxREFBcUQsYUFBYSxFQUFFO0FBQzVJLHlCQUF5QixnQ0FBZ0Msb0JBQW9CLGdEQUFnRCxnQkFBZ0IsR0FBRztBQUNoSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0NBQWdDLHVDQUF1QyxhQUFhLEVBQUUsRUFBRSxPQUFPLGtCQUFrQjtBQUNqSDtBQUNBOzs7Ozs7OztBQ3JLQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNENBQTRDOztBQUU1Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3BCd0M7QUFDbUM7QUFFTjtBQUNYO0FBRWxCO0FBZ0J4QyxJQUFhLFFBQVEsR0FBckIsY0FBc0IsU0FBUSw0RkFBVyxDQUFDLGdGQUFVLENBQXFCO0lBQ2hFLFFBQVE7UUFDZixJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFUyxNQUFNO1FBQ2YsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBRTVDLE1BQU0sQ0FBQyxzRUFBQyxDQUFDLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHFEQUFRLENBQUMsRUFBRSxFQUFFO1lBQ2pELHNFQUFDLENBQ0EsTUFBTSxFQUNOO2dCQUNDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMscURBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLHlEQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMvRCxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVE7YUFDdEIsRUFDRCxDQUFDLEtBQUssQ0FBQyxDQUNQO1NBQ0QsQ0FBQyxDQUFDO0lBQ0osQ0FBQztDQUNEO0FBbkJZLFFBQVE7SUFQcEIseUdBQWEsQ0FBcUI7UUFDbEMsR0FBRyxFQUFFLGdCQUFnQjtRQUNyQixVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDO1FBQ2pDLE1BQU0sRUFBRSxDQUFDLFlBQVksQ0FBQztRQUN0QixVQUFVLEVBQUUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDO0tBQ2hDLENBQUM7SUFDRCxzRkFBSyxDQUFDLDZDQUFHLENBQUM7R0FDRSxRQUFRLENBbUJwQjtBQW5Cb0I7QUFxQnJCLCtEQUFlLFFBQVEsRUFBQzs7Ozs7Ozs7QUMzQ3hCO0FBQ0Esa0JBQWtCLHdJIiwiZmlsZSI6Im1lbnUtaXRlbS0xLjAuMC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIDlkYzU0MWRkZDk5NjgxYWFmYTdjIiwiaW1wb3J0IHsgY3JlYXRlQ29tcG9zaXRlSGFuZGxlIH0gZnJvbSAnLi9sYW5nJztcbmltcG9ydCBQcm9taXNlIGZyb20gJ0Bkb2pvL3NoaW0vUHJvbWlzZSc7XG4vKipcbiAqIE5vIG9wZXJhdGlvbiBmdW5jdGlvbiB0byByZXBsYWNlIG93biBvbmNlIGluc3RhbmNlIGlzIGRlc3RvcnllZFxuICovXG5mdW5jdGlvbiBub29wKCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xufVxuLyoqXG4gKiBObyBvcCBmdW5jdGlvbiB1c2VkIHRvIHJlcGxhY2Ugb3duLCBvbmNlIGluc3RhbmNlIGhhcyBiZWVuIGRlc3RvcnllZFxuICovXG5mdW5jdGlvbiBkZXN0cm95ZWQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsIG1hZGUgdG8gZGVzdHJveWVkIG1ldGhvZCcpO1xufVxuZXhwb3J0IGNsYXNzIERlc3Ryb3lhYmxlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVzID0gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGhhbmRsZXMgZm9yIHRoZSBpbnN0YW5jZSB0aGF0IHdpbGwgYmUgZGVzdHJveWVkIHdoZW4gYHRoaXMuZGVzdHJveWAgaXMgY2FsbGVkXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hhbmRsZX0gaGFuZGxlIFRoZSBoYW5kbGUgdG8gYWRkIGZvciB0aGUgaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7SGFuZGxlfSBhIGhhbmRsZSBmb3IgdGhlIGhhbmRsZSwgcmVtb3ZlcyB0aGUgaGFuZGxlIGZvciB0aGUgaW5zdGFuY2UgYW5kIGNhbGxzIGRlc3Ryb3lcbiAgICAgKi9cbiAgICBvd24oaGFuZGxlcykge1xuICAgICAgICBjb25zdCBoYW5kbGUgPSBBcnJheS5pc0FycmF5KGhhbmRsZXMpID8gY3JlYXRlQ29tcG9zaXRlSGFuZGxlKC4uLmhhbmRsZXMpIDogaGFuZGxlcztcbiAgICAgICAgY29uc3QgeyBoYW5kbGVzOiBfaGFuZGxlcyB9ID0gdGhpcztcbiAgICAgICAgX2hhbmRsZXMucHVzaChoYW5kbGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgICAgICAgICBfaGFuZGxlcy5zcGxpY2UoX2hhbmRsZXMuaW5kZXhPZihoYW5kbGUpKTtcbiAgICAgICAgICAgICAgICBoYW5kbGUuZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZXN0cnB5cyBhbGwgaGFuZGVycyByZWdpc3RlcmVkIGZvciB0aGUgaW5zdGFuY2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPGFueX0gYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSBhbGwgaGFuZGxlcyBoYXZlIGJlZW4gZGVzdHJveWVkXG4gICAgICovXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZXMuZm9yRWFjaCgoaGFuZGxlKSA9PiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlICYmIGhhbmRsZS5kZXN0cm95ICYmIGhhbmRsZS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveSA9IG5vb3A7XG4gICAgICAgICAgICB0aGlzLm93biA9IGRlc3Ryb3llZDtcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IERlc3Ryb3lhYmxlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVzdHJveWFibGUubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2NvcmUvRGVzdHJveWFibGUubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9jb3JlL0Rlc3Ryb3lhYmxlLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBNYXAgZnJvbSAnQGRvam8vc2hpbS9NYXAnO1xuaW1wb3J0IHsgRGVzdHJveWFibGUgfSBmcm9tICcuL0Rlc3Ryb3lhYmxlJztcbi8qKlxuICogTWFwIG9mIGNvbXB1dGVkIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIGtleWVkIGJ5IHN0cmluZ1xuICovXG5jb25zdCByZWdleE1hcCA9IG5ldyBNYXAoKTtcbi8qKlxuICogRGV0ZXJtaW5lcyBpcyB0aGUgZXZlbnQgdHlwZSBnbG9iIGhhcyBiZWVuIG1hdGNoZWRcbiAqXG4gKiBAcmV0dXJucyBib29sZWFuIHRoYXQgaW5kaWNhdGVzIGlmIHRoZSBnbG9iIGlzIG1hdGNoZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzR2xvYk1hdGNoKGdsb2JTdHJpbmcsIHRhcmdldFN0cmluZykge1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0U3RyaW5nID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgZ2xvYlN0cmluZyA9PT0gJ3N0cmluZycgJiYgZ2xvYlN0cmluZy5pbmRleE9mKCcqJykgIT09IC0xKSB7XG4gICAgICAgIGxldCByZWdleDtcbiAgICAgICAgaWYgKHJlZ2V4TWFwLmhhcyhnbG9iU3RyaW5nKSkge1xuICAgICAgICAgICAgcmVnZXggPSByZWdleE1hcC5nZXQoZ2xvYlN0cmluZyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZWdleCA9IG5ldyBSZWdFeHAoYF4ke2dsb2JTdHJpbmcucmVwbGFjZSgvXFwqL2csICcuKicpfSRgKTtcbiAgICAgICAgICAgIHJlZ2V4TWFwLnNldChnbG9iU3RyaW5nLCByZWdleCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodGFyZ2V0U3RyaW5nKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBnbG9iU3RyaW5nID09PSB0YXJnZXRTdHJpbmc7XG4gICAgfVxufVxuLyoqXG4gKiBFdmVudCBDbGFzc1xuICovXG5leHBvcnQgY2xhc3MgRXZlbnRlZCBleHRlbmRzIERlc3Ryb3lhYmxlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIG1hcCBvZiBsaXN0ZW5lcnMga2V5ZWQgYnkgZXZlbnQgdHlwZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5saXN0ZW5lcnNNYXAgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIGVtaXQoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnNNYXAuZm9yRWFjaCgobWV0aG9kcywgdHlwZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzR2xvYk1hdGNoKHR5cGUsIGV2ZW50LnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kcy5mb3JFYWNoKChtZXRob2QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmNhbGwodGhpcywgZXZlbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGlzdGVuZXIpKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVzID0gbGlzdGVuZXIubWFwKChsaXN0ZW5lcikgPT4gdGhpcy5fYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcy5mb3JFYWNoKChoYW5kbGUpID0+IGhhbmRsZS5kZXN0cm95KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKTtcbiAgICB9XG4gICAgX2FkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzTWFwLmdldCh0eXBlKSB8fCBbXTtcbiAgICAgICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICB0aGlzLmxpc3RlbmVyc01hcC5zZXQodHlwZSwgbGlzdGVuZXJzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyc01hcC5nZXQodHlwZSkgfHwgW107XG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShsaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lciksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IEV2ZW50ZWQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FdmVudGVkLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9jb3JlL0V2ZW50ZWQubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9jb3JlL0V2ZW50ZWQubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IHsgYXNzaWduIH0gZnJvbSAnQGRvam8vc2hpbS9vYmplY3QnO1xuZXhwb3J0IHsgYXNzaWduIH0gZnJvbSAnQGRvam8vc2hpbS9vYmplY3QnO1xuY29uc3Qgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5jb25zdCBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG4vKipcbiAqIFR5cGUgZ3VhcmQgdGhhdCBlbnN1cmVzIHRoYXQgdGhlIHZhbHVlIGNhbiBiZSBjb2VyY2VkIHRvIE9iamVjdFxuICogdG8gd2VlZCBvdXQgaG9zdCBvYmplY3RzIHRoYXQgZG8gbm90IGRlcml2ZSBmcm9tIE9iamVjdC5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjaGVjayBpZiB3ZSB3YW50IHRvIGRlZXAgY29weSBhbiBvYmplY3Qgb3Igbm90LlxuICogTm90ZTogSW4gRVM2IGl0IGlzIHBvc3NpYmxlIHRvIG1vZGlmeSBhbiBvYmplY3QncyBTeW1ib2wudG9TdHJpbmdUYWcgcHJvcGVydHksIHdoaWNoIHdpbGxcbiAqIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgYHRvU3RyaW5nYC4gVGhpcyBpcyBhIHJhcmUgZWRnZSBjYXNlIHRoYXQgaXMgZGlmZmljdWx0IHRvIGhhbmRsZSxcbiAqIHNvIGl0IGlzIG5vdCBoYW5kbGVkIGhlcmUuXG4gKiBAcGFyYW0gIHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybiAgICAgICBJZiB0aGUgdmFsdWUgaXMgY29lcmNpYmxlIGludG8gYW4gT2JqZWN0XG4gKi9cbmZ1bmN0aW9uIHNob3VsZERlZXBDb3B5T2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xufVxuZnVuY3Rpb24gY29weUFycmF5KGFycmF5LCBpbmhlcml0ZWQpIHtcbiAgICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gY29weUFycmF5KGl0ZW0sIGluaGVyaXRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFzaG91bGREZWVwQ29weU9iamVjdChpdGVtKVxuICAgICAgICAgICAgPyBpdGVtXG4gICAgICAgICAgICA6IF9taXhpbih7XG4gICAgICAgICAgICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpbmhlcml0ZWQ6IGluaGVyaXRlZCxcbiAgICAgICAgICAgICAgICBzb3VyY2VzOiBbaXRlbV0sXG4gICAgICAgICAgICAgICAgdGFyZ2V0OiB7fVxuICAgICAgICAgICAgfSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBfbWl4aW4oa3dBcmdzKSB7XG4gICAgY29uc3QgZGVlcCA9IGt3QXJncy5kZWVwO1xuICAgIGNvbnN0IGluaGVyaXRlZCA9IGt3QXJncy5pbmhlcml0ZWQ7XG4gICAgY29uc3QgdGFyZ2V0ID0ga3dBcmdzLnRhcmdldDtcbiAgICBjb25zdCBjb3BpZWQgPSBrd0FyZ3MuY29waWVkIHx8IFtdO1xuICAgIGNvbnN0IGNvcGllZENsb25lID0gWy4uLmNvcGllZF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrd0FyZ3Muc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBrd0FyZ3Muc291cmNlc1tpXTtcbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gbnVsbCB8fCBzb3VyY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgICAgICAgIGlmIChjb3BpZWRDbG9uZS5pbmRleE9mKHZhbHVlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkZWVwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb3B5QXJyYXkodmFsdWUsIGluaGVyaXRlZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2hvdWxkRGVlcENvcHlPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRWYWx1ZSA9IHRhcmdldFtrZXldIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkLnB1c2goc291cmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gX21peGluKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRlZDogaW5oZXJpdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM6IFt2YWx1ZV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUocHJvdG90eXBlLCAuLi5taXhpbnMpIHtcbiAgICBpZiAoIW1peGlucy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2xhbmcuY3JlYXRlIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBtaXhpbiBvYmplY3QuJyk7XG4gICAgfVxuICAgIGNvbnN0IGFyZ3MgPSBtaXhpbnMuc2xpY2UoKTtcbiAgICBhcmdzLnVuc2hpZnQoT2JqZWN0LmNyZWF0ZShwcm90b3R5cGUpKTtcbiAgICByZXR1cm4gYXNzaWduLmFwcGx5KG51bGwsIGFyZ3MpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBBc3NpZ24odGFyZ2V0LCAuLi5zb3VyY2VzKSB7XG4gICAgcmV0dXJuIF9taXhpbih7XG4gICAgICAgIGRlZXA6IHRydWUsXG4gICAgICAgIGluaGVyaXRlZDogZmFsc2UsXG4gICAgICAgIHNvdXJjZXM6IHNvdXJjZXMsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVlcE1peGluKHRhcmdldCwgLi4uc291cmNlcykge1xuICAgIHJldHVybiBfbWl4aW4oe1xuICAgICAgICBkZWVwOiB0cnVlLFxuICAgICAgICBpbmhlcml0ZWQ6IHRydWUsXG4gICAgICAgIHNvdXJjZXM6IHNvdXJjZXMsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0XG4gICAgfSk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHVzaW5nIHRoZSBwcm92aWRlZCBzb3VyY2UncyBwcm90b3R5cGUgYXMgdGhlIHByb3RvdHlwZSBmb3IgdGhlIG5ldyBvYmplY3QsIGFuZCB0aGVuXG4gKiBkZWVwIGNvcGllcyB0aGUgcHJvdmlkZWQgc291cmNlJ3MgdmFsdWVzIGludG8gdGhlIG5ldyB0YXJnZXQuXG4gKlxuICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IHRvIGR1cGxpY2F0ZVxuICogQHJldHVybiBUaGUgbmV3IG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZHVwbGljYXRlKHNvdXJjZSkge1xuICAgIGNvbnN0IHRhcmdldCA9IE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHNvdXJjZSkpO1xuICAgIHJldHVybiBkZWVwTWl4aW4odGFyZ2V0LCBzb3VyY2UpO1xufVxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdHdvIHZhbHVlcyBhcmUgdGhlIHNhbWUgdmFsdWUuXG4gKlxuICogQHBhcmFtIGEgRmlyc3QgdmFsdWUgdG8gY29tcGFyZVxuICogQHBhcmFtIGIgU2Vjb25kIHZhbHVlIHRvIGNvbXBhcmVcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWVzIGFyZSB0aGUgc2FtZTsgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0lkZW50aWNhbChhLCBiKSB7XG4gICAgcmV0dXJuIChhID09PSBiIHx8XG4gICAgICAgIC8qIGJvdGggdmFsdWVzIGFyZSBOYU4gKi9cbiAgICAgICAgKGEgIT09IGEgJiYgYiAhPT0gYikpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBiaW5kcyBhIG1ldGhvZCB0byB0aGUgc3BlY2lmaWVkIG9iamVjdCBhdCBydW50aW1lLiBUaGlzIGlzIHNpbWlsYXIgdG9cbiAqIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAsIGJ1dCBpbnN0ZWFkIG9mIGEgZnVuY3Rpb24gaXQgdGFrZXMgdGhlIG5hbWUgb2YgYSBtZXRob2Qgb24gYW4gb2JqZWN0LlxuICogQXMgYSByZXN1bHQsIHRoZSBmdW5jdGlvbiByZXR1cm5lZCBieSBgbGF0ZUJpbmRgIHdpbGwgYWx3YXlzIGNhbGwgdGhlIGZ1bmN0aW9uIGN1cnJlbnRseSBhc3NpZ25lZCB0b1xuICogdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBvbiB0aGUgb2JqZWN0IGFzIG9mIHRoZSBtb21lbnQgdGhlIGZ1bmN0aW9uIGl0IHJldHVybnMgaXMgY2FsbGVkLlxuICpcbiAqIEBwYXJhbSBpbnN0YW5jZSBUaGUgY29udGV4dCBvYmplY3RcbiAqIEBwYXJhbSBtZXRob2QgVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBvbiB0aGUgY29udGV4dCBvYmplY3QgdG8gYmluZCB0byBpdHNlbGZcbiAqIEBwYXJhbSBzdXBwbGllZEFyZ3MgQW4gb3B0aW9uYWwgYXJyYXkgb2YgdmFsdWVzIHRvIHByZXBlbmQgdG8gdGhlIGBpbnN0YW5jZVttZXRob2RdYCBhcmd1bWVudHMgbGlzdFxuICogQHJldHVybiBUaGUgYm91bmQgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhdGVCaW5kKGluc3RhbmNlLCBtZXRob2QsIC4uLnN1cHBsaWVkQXJncykge1xuICAgIHJldHVybiBzdXBwbGllZEFyZ3MubGVuZ3RoXG4gICAgICAgID8gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IGFyZ3VtZW50cy5sZW5ndGggPyBzdXBwbGllZEFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkgOiBzdXBwbGllZEFyZ3M7XG4gICAgICAgICAgICAvLyBUUzcwMTdcbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZVttZXRob2RdLmFwcGx5KGluc3RhbmNlLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIFRTNzAxN1xuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlW21ldGhvZF0uYXBwbHkoaW5zdGFuY2UsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gbWl4aW4odGFyZ2V0LCAuLi5zb3VyY2VzKSB7XG4gICAgcmV0dXJuIF9taXhpbih7XG4gICAgICAgIGRlZXA6IGZhbHNlLFxuICAgICAgICBpbmhlcml0ZWQ6IHRydWUsXG4gICAgICAgIHNvdXJjZXM6IHNvdXJjZXMsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0XG4gICAgfSk7XG59XG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB3aGljaCBpbnZva2VzIHRoZSBnaXZlbiBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgcHJlcGVuZGVkIHRvIGl0cyBhcmd1bWVudCBsaXN0LlxuICogTGlrZSBgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRgLCBidXQgZG9lcyBub3QgYWx0ZXIgZXhlY3V0aW9uIGNvbnRleHQuXG4gKlxuICogQHBhcmFtIHRhcmdldEZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0aGF0IG5lZWRzIHRvIGJlIGJvdW5kXG4gKiBAcGFyYW0gc3VwcGxpZWRBcmdzIEFuIG9wdGlvbmFsIGFycmF5IG9mIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRoZSBgdGFyZ2V0RnVuY3Rpb25gIGFyZ3VtZW50cyBsaXN0XG4gKiBAcmV0dXJuIFRoZSBib3VuZCBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFydGlhbCh0YXJnZXRGdW5jdGlvbiwgLi4uc3VwcGxpZWRBcmdzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IGFyZ3VtZW50cy5sZW5ndGggPyBzdXBwbGllZEFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkgOiBzdXBwbGllZEFyZ3M7XG4gICAgICAgIHJldHVybiB0YXJnZXRGdW5jdGlvbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xufVxuLyoqXG4gKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgZGVzdHJveSBtZXRob2QgdGhhdCwgd2hlbiBjYWxsZWQsIGNhbGxzIHRoZSBwYXNzZWQtaW4gZGVzdHJ1Y3Rvci5cbiAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBhIHVuaWZpZWQgaW50ZXJmYWNlIGZvciBjcmVhdGluZyBcInJlbW92ZVwiIC8gXCJkZXN0cm95XCIgaGFuZGxlcnMgZm9yXG4gKiBldmVudCBsaXN0ZW5lcnMsIHRpbWVycywgZXRjLlxuICpcbiAqIEBwYXJhbSBkZXN0cnVjdG9yIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBoYW5kbGUncyBgZGVzdHJveWAgbWV0aG9kIGlzIGludm9rZWRcbiAqIEByZXR1cm4gVGhlIGhhbmRsZSBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhhbmRsZShkZXN0cnVjdG9yKSB7XG4gICAgbGV0IGNhbGxlZCA9IGZhbHNlO1xuICAgIHJldHVybiB7XG4gICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghY2FsbGVkKSB7XG4gICAgICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBkZXN0cnVjdG9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgc2luZ2xlIGhhbmRsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlc3Ryb3kgbXVsdGlwbGUgaGFuZGxlcyBzaW11bHRhbmVvdXNseS5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlcyBBbiBhcnJheSBvZiBoYW5kbGVzIHdpdGggYGRlc3Ryb3lgIG1ldGhvZHNcbiAqIEByZXR1cm4gVGhlIGhhbmRsZSBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbXBvc2l0ZUhhbmRsZSguLi5oYW5kbGVzKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhhbmRsZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGFuZGxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaGFuZGxlc1tpXS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxhbmcubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2NvcmUvbGFuZy5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2NvcmUvbGFuZy5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJmdW5jdGlvbiBpc0ZlYXR1cmVUZXN0VGhlbmFibGUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgdmFsdWUudGhlbjtcbn1cbi8qKlxuICogQSBjYWNoZSBvZiByZXN1bHRzIG9mIGZlYXR1cmUgdGVzdHNcbiAqL1xuZXhwb3J0IGNvbnN0IHRlc3RDYWNoZSA9IHt9O1xuLyoqXG4gKiBBIGNhY2hlIG9mIHRoZSB1bi1yZXNvbHZlZCBmZWF0dXJlIHRlc3RzXG4gKi9cbmV4cG9ydCBjb25zdCB0ZXN0RnVuY3Rpb25zID0ge307XG4vKipcbiAqIEEgY2FjaGUgb2YgdW5yZXNvbHZlZCB0aGVuYWJsZXMgKHByb2JhYmx5IHByb21pc2VzKVxuICogQHR5cGUge3t9fVxuICovXG5jb25zdCB0ZXN0VGhlbmFibGVzID0ge307XG4vKipcbiAqIEEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgc2NvcGUgKGB3aW5kb3dgIGluIGEgYnJvd3NlciwgYGdsb2JhbGAgaW4gTm9kZUpTKVxuICovXG5jb25zdCBnbG9iYWxTY29wZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gQnJvd3NlcnNcbiAgICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gTm9kZVxuICAgICAgICByZXR1cm4gZ2xvYmFsO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gV2ViIHdvcmtlcnNcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIHt9O1xufSkoKTtcbi8qIEdyYWIgdGhlIHN0YXRpY0ZlYXR1cmVzIGlmIHRoZXJlIGFyZSBhdmFpbGFibGUgKi9cbmNvbnN0IHsgc3RhdGljRmVhdHVyZXMgfSA9IGdsb2JhbFNjb3BlLkRvam9IYXNFbnZpcm9ubWVudCB8fCB7fTtcbi8qIENsZWFuaW5nIHVwIHRoZSBEb2pvSGFzRW52aW9ybm1lbnQgKi9cbmlmICgnRG9qb0hhc0Vudmlyb25tZW50JyBpbiBnbG9iYWxTY29wZSkge1xuICAgIGRlbGV0ZSBnbG9iYWxTY29wZS5Eb2pvSGFzRW52aXJvbm1lbnQ7XG59XG4vKipcbiAqIEN1c3RvbSB0eXBlIGd1YXJkIHRvIG5hcnJvdyB0aGUgYHN0YXRpY0ZlYXR1cmVzYCB0byBlaXRoZXIgYSBtYXAgb3IgYSBmdW5jdGlvbiB0aGF0XG4gKiByZXR1cm5zIGEgbWFwLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gZ3VhcmQgZm9yXG4gKi9cbmZ1bmN0aW9uIGlzU3RhdGljRmVhdHVyZUZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbi8qKlxuICogVGhlIGNhY2hlIG9mIGFzc2VydGVkIGZlYXR1cmVzIHRoYXQgd2VyZSBhdmFpbGFibGUgaW4gdGhlIGdsb2JhbCBzY29wZSB3aGVuIHRoZVxuICogbW9kdWxlIGxvYWRlZFxuICovXG5jb25zdCBzdGF0aWNDYWNoZSA9IHN0YXRpY0ZlYXR1cmVzXG4gICAgPyBpc1N0YXRpY0ZlYXR1cmVGdW5jdGlvbihzdGF0aWNGZWF0dXJlcykgPyBzdGF0aWNGZWF0dXJlcy5hcHBseShnbG9iYWxTY29wZSkgOiBzdGF0aWNGZWF0dXJlc1xuICAgIDoge307IC8qIFByb3ZpZGluZyBhbiBlbXB0eSBjYWNoZSwgaWYgbm9uZSB3YXMgaW4gdGhlIGVudmlyb25tZW50XG5cbi8qKlxuKiBBTUQgcGx1Z2luIGZ1bmN0aW9uLlxuKlxuKiBDb25kaXRpb25hbCBsb2FkcyBtb2R1bGVzIGJhc2VkIG9uIGEgaGFzIGZlYXR1cmUgdGVzdCB2YWx1ZS5cbipcbiogQHBhcmFtIHJlc291cmNlSWQgR2l2ZXMgdGhlIHJlc29sdmVkIG1vZHVsZSBpZCB0byBsb2FkLlxuKiBAcGFyYW0gcmVxdWlyZSBUaGUgbG9hZGVyIHJlcXVpcmUgZnVuY3Rpb24gd2l0aCByZXNwZWN0IHRvIHRoZSBtb2R1bGUgdGhhdCBjb250YWluZWQgdGhlIHBsdWdpbiByZXNvdXJjZSBpbiBpdHNcbiogICAgICAgICAgICAgICAgZGVwZW5kZW5jeSBsaXN0LlxuKiBAcGFyYW0gbG9hZCBDYWxsYmFjayB0byBsb2FkZXIgdGhhdCBjb25zdW1lcyByZXN1bHQgb2YgcGx1Z2luIGRlbWFuZC5cbiovXG5leHBvcnQgZnVuY3Rpb24gbG9hZChyZXNvdXJjZUlkLCByZXF1aXJlLCBsb2FkLCBjb25maWcpIHtcbiAgICByZXNvdXJjZUlkID8gcmVxdWlyZShbcmVzb3VyY2VJZF0sIGxvYWQpIDogbG9hZCgpO1xufVxuLyoqXG4gKiBBTUQgcGx1Z2luIGZ1bmN0aW9uLlxuICpcbiAqIFJlc29sdmVzIHJlc291cmNlSWQgaW50byBhIG1vZHVsZSBpZCBiYXNlZCBvbiBwb3NzaWJseS1uZXN0ZWQgdGVuYXJ5IGV4cHJlc3Npb24gdGhhdCBicmFuY2hlcyBvbiBoYXMgZmVhdHVyZSB0ZXN0XG4gKiB2YWx1ZShzKS5cbiAqXG4gKiBAcGFyYW0gcmVzb3VyY2VJZCBUaGUgaWQgb2YgdGhlIG1vZHVsZVxuICogQHBhcmFtIG5vcm1hbGl6ZSBSZXNvbHZlcyBhIHJlbGF0aXZlIG1vZHVsZSBpZCBpbnRvIGFuIGFic29sdXRlIG1vZHVsZSBpZFxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKHJlc291cmNlSWQsIG5vcm1hbGl6ZSkge1xuICAgIGNvbnN0IHRva2VucyA9IHJlc291cmNlSWQubWF0Y2goL1tcXD86XXxbXjpcXD9dKi9nKSB8fCBbXTtcbiAgICBsZXQgaSA9IDA7XG4gICAgZnVuY3Rpb24gZ2V0KHNraXApIHtcbiAgICAgICAgY29uc3QgdGVybSA9IHRva2Vuc1tpKytdO1xuICAgICAgICBpZiAodGVybSA9PT0gJzonKSB7XG4gICAgICAgICAgICAvLyBlbXB0eSBzdHJpbmcgbW9kdWxlIG5hbWUsIHJlc29sdmVzIHRvIG51bGxcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gcG9zdGZpeGVkIHdpdGggYSA/IG1lYW5zIGl0IGlzIGEgZmVhdHVyZSB0byBicmFuY2ggb24sIHRoZSB0ZXJtIGlzIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlXG4gICAgICAgICAgICBpZiAodG9rZW5zW2krK10gPT09ICc/Jykge1xuICAgICAgICAgICAgICAgIGlmICghc2tpcCAmJiBoYXModGVybSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hlZCB0aGUgZmVhdHVyZSwgZ2V0IHRoZSBmaXJzdCB2YWx1ZSBmcm9tIHRoZSBvcHRpb25zXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRpZCBub3QgbWF0Y2gsIGdldCB0aGUgc2Vjb25kIHZhbHVlLCBwYXNzaW5nIG92ZXIgdGhlIGZpcnN0XG4gICAgICAgICAgICAgICAgICAgIGdldCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChza2lwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhIG1vZHVsZVxuICAgICAgICAgICAgcmV0dXJuIHRlcm07XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaWQgPSBnZXQoKTtcbiAgICByZXR1cm4gaWQgJiYgbm9ybWFsaXplKGlkKTtcbn1cbi8qKlxuICogQ2hlY2sgaWYgYSBmZWF0dXJlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZFxuICpcbiAqIEBwYXJhbSBmZWF0dXJlIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGlzdHMoZmVhdHVyZSkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRGZWF0dXJlID0gZmVhdHVyZS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBCb29sZWFuKG5vcm1hbGl6ZWRGZWF0dXJlIGluIHN0YXRpY0NhY2hlIHx8IG5vcm1hbGl6ZWRGZWF0dXJlIGluIHRlc3RDYWNoZSB8fCB0ZXN0RnVuY3Rpb25zW25vcm1hbGl6ZWRGZWF0dXJlXSk7XG59XG4vKipcbiAqIFJlZ2lzdGVyIGEgbmV3IHRlc3QgZm9yIGEgbmFtZWQgZmVhdHVyZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaGFzLmFkZCgnZG9tLWFkZGV2ZW50bGlzdGVuZXInLCAhIWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpO1xuICpcbiAqIEBleGFtcGxlXG4gKiBoYXMuYWRkKCd0b3VjaC1ldmVudHMnLCBmdW5jdGlvbiAoKSB7XG4gKiAgICByZXR1cm4gJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnRcbiAqIH0pO1xuICpcbiAqIEBwYXJhbSBmZWF0dXJlIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlXG4gKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHJlcG9ydGVkIG9mIHRoZSBmZWF0dXJlLCBvciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBvbmNlIG9uIGZpcnN0IHRlc3RcbiAqIEBwYXJhbSBvdmVyd3JpdGUgaWYgYW4gZXhpc3RpbmcgdmFsdWUgc2hvdWxkIGJlIG92ZXJ3cml0dGVuLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZChmZWF0dXJlLCB2YWx1ZSwgb3ZlcndyaXRlID0gZmFsc2UpIHtcbiAgICBjb25zdCBub3JtYWxpemVkRmVhdHVyZSA9IGZlYXR1cmUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoZXhpc3RzKG5vcm1hbGl6ZWRGZWF0dXJlKSAmJiAhb3ZlcndyaXRlICYmICEobm9ybWFsaXplZEZlYXR1cmUgaW4gc3RhdGljQ2FjaGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEZlYXR1cmUgXCIke2ZlYXR1cmV9XCIgZXhpc3RzIGFuZCBvdmVyd3JpdGUgbm90IHRydWUuYCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNGZWF0dXJlVGVzdFRoZW5hYmxlKHZhbHVlKSkge1xuICAgICAgICB0ZXN0VGhlbmFibGVzW2ZlYXR1cmVdID0gdmFsdWUudGhlbigocmVzb2x2ZWRWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgdGVzdENhY2hlW2ZlYXR1cmVdID0gcmVzb2x2ZWRWYWx1ZTtcbiAgICAgICAgICAgIGRlbGV0ZSB0ZXN0VGhlbmFibGVzW2ZlYXR1cmVdO1xuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgdGVzdFRoZW5hYmxlc1tmZWF0dXJlXTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0ZXN0Q2FjaGVbbm9ybWFsaXplZEZlYXR1cmVdID0gdmFsdWU7XG4gICAgICAgIGRlbGV0ZSB0ZXN0RnVuY3Rpb25zW25vcm1hbGl6ZWRGZWF0dXJlXTtcbiAgICB9XG59XG4vKipcbiAqIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBvZiBhIG5hbWVkIGZlYXR1cmUuXG4gKlxuICogQHBhcmFtIGZlYXR1cmUgVGhlIG5hbWUgKGlmIGEgc3RyaW5nKSBvciBpZGVudGlmaWVyIChpZiBhbiBpbnRlZ2VyKSBvZiB0aGUgZmVhdHVyZSB0byB0ZXN0LlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBoYXMoZmVhdHVyZSkge1xuICAgIGxldCByZXN1bHQ7XG4gICAgY29uc3Qgbm9ybWFsaXplZEZlYXR1cmUgPSBmZWF0dXJlLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRGZWF0dXJlIGluIHN0YXRpY0NhY2hlKSB7XG4gICAgICAgIHJlc3VsdCA9IHN0YXRpY0NhY2hlW25vcm1hbGl6ZWRGZWF0dXJlXTtcbiAgICB9XG4gICAgZWxzZSBpZiAodGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV0pIHtcbiAgICAgICAgcmVzdWx0ID0gdGVzdENhY2hlW25vcm1hbGl6ZWRGZWF0dXJlXSA9IHRlc3RGdW5jdGlvbnNbbm9ybWFsaXplZEZlYXR1cmVdLmNhbGwobnVsbCk7XG4gICAgICAgIGRlbGV0ZSB0ZXN0RnVuY3Rpb25zW25vcm1hbGl6ZWRGZWF0dXJlXTtcbiAgICB9XG4gICAgZWxzZSBpZiAobm9ybWFsaXplZEZlYXR1cmUgaW4gdGVzdENhY2hlKSB7XG4gICAgICAgIHJlc3VsdCA9IHRlc3RDYWNoZVtub3JtYWxpemVkRmVhdHVyZV07XG4gICAgfVxuICAgIGVsc2UgaWYgKGZlYXR1cmUgaW4gdGVzdFRoZW5hYmxlcykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBBdHRlbXB0IHRvIGRldGVjdCB1bnJlZ2lzdGVyZWQgaGFzIGZlYXR1cmUgXCIke2ZlYXR1cmV9XCJgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qXG4gKiBPdXQgb2YgdGhlIGJveCBmZWF0dXJlIHRlc3RzXG4gKi9cbi8qIEVudmlyb25tZW50cyAqL1xuLyogVXNlZCBhcyBhIHZhbHVlIHRvIHByb3ZpZGUgYSBkZWJ1ZyBvbmx5IGNvZGUgcGF0aCAqL1xuYWRkKCdkZWJ1ZycsIHRydWUpO1xuLyogRGV0ZWN0cyBpZiB0aGUgZW52aXJvbm1lbnQgaXMgXCJicm93c2VyIGxpa2VcIiAqL1xuYWRkKCdob3N0LWJyb3dzZXInLCB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBsb2NhdGlvbiAhPT0gJ3VuZGVmaW5lZCcpO1xuLyogRGV0ZWN0cyBpZiB0aGUgZW52aXJvbm1lbnQgYXBwZWFycyB0byBiZSBOb2RlSlMgKi9cbmFkZCgnaG9zdC1ub2RlJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgcHJvY2Vzcy52ZXJzaW9ucyAmJiBwcm9jZXNzLnZlcnNpb25zLm5vZGUpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MudmVyc2lvbnMubm9kZTtcbiAgICB9XG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhcy5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vaGFzL2hhcy5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2hhcy9oYXMubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IHsgaXNBcnJheUxpa2UsIFNoaW1JdGVyYXRvciB9IGZyb20gJy4vaXRlcmF0b3InO1xuaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XG5pbXBvcnQgeyBpcyBhcyBvYmplY3RJcyB9IGZyb20gJy4vb2JqZWN0JztcbmltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XG5pbXBvcnQgJy4vU3ltYm9sJztcbmV4cG9ydCBsZXQgTWFwID0gZ2xvYmFsLk1hcDtcbmlmICghdHJ1ZSkge1xuICAgIE1hcCA9IChfYSA9IGNsYXNzIE1hcCB7XG4gICAgICAgICAgICBjb25zdHJ1Y3RvcihpdGVyYWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnTWFwJztcbiAgICAgICAgICAgICAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXJyYXlMaWtlKGl0ZXJhYmxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVyYWJsZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQodmFsdWVbMF0sIHZhbHVlWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldCh2YWx1ZVswXSwgdmFsdWVbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiB1c2luZyBPYmplY3QuaXNcbiAgICAgICAgICAgICAqIHRvIGNoZWNrIGZvciBlcXVhbGl0eS4gU2VlIGh0dHA6Ly9temwubGEvMXp1S08yVlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBfaW5kZXhPZktleShrZXlzLCBrZXkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0SXMoa2V5c1tpXSwga2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ2V0IHNpemUoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2tleXMubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xlYXIoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5sZW5ndGggPSB0aGlzLl92YWx1ZXMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZShrZXkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2luZGV4T2ZLZXkodGhpcy5fa2V5cywga2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW50cmllcygpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLl9rZXlzLm1hcCgoa2V5LCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBba2V5LCB0aGlzLl92YWx1ZXNbaV1dO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2hpbUl0ZXJhdG9yKHZhbHVlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3JFYWNoKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IHRoaXMuX2tleXM7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5fdmFsdWVzO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgdmFsdWVzW2ldLCBrZXlzW2ldLCB0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnZXQoa2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9pbmRleE9mS2V5KHRoaXMuX2tleXMsIGtleSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4IDwgMCA/IHVuZGVmaW5lZCA6IHRoaXMuX3ZhbHVlc1tpbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYXMoa2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luZGV4T2ZLZXkodGhpcy5fa2V5cywga2V5KSA+IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAga2V5cygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNoaW1JdGVyYXRvcih0aGlzLl9rZXlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5faW5kZXhPZktleSh0aGlzLl9rZXlzLCBrZXkpO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kZXggPCAwID8gdGhpcy5fa2V5cy5sZW5ndGggOiBpbmRleDtcbiAgICAgICAgICAgICAgICB0aGlzLl9rZXlzW2luZGV4XSA9IGtleTtcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZXMoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaGltSXRlcmF0b3IodGhpcy5fdmFsdWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgX2FbU3ltYm9sLnNwZWNpZXNdID0gX2EsXG4gICAgICAgIF9hKTtcbn1cbmV4cG9ydCBkZWZhdWx0IE1hcDtcbnZhciBfYTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1hcC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9NYXAubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL01hcC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4vZ2xvYmFsJztcbmltcG9ydCB7IHF1ZXVlTWljcm9UYXNrIH0gZnJvbSAnLi9zdXBwb3J0L3F1ZXVlJztcbmltcG9ydCAnLi9TeW1ib2wnO1xuaW1wb3J0IGhhcyBmcm9tICcuL3N1cHBvcnQvaGFzJztcbmV4cG9ydCBsZXQgU2hpbVByb21pc2UgPSBnbG9iYWwuUHJvbWlzZTtcbmV4cG9ydCBjb25zdCBpc1RoZW5hYmxlID0gZnVuY3Rpb24gaXNUaGVuYWJsZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn07XG5pZiAoIXRydWUpIHtcbiAgICBnbG9iYWwuUHJvbWlzZSA9IFNoaW1Qcm9taXNlID0gKF9hID0gY2xhc3MgUHJvbWlzZSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgUHJvbWlzZS5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAcGFyYW0gZXhlY3V0b3JcbiAgICAgICAgICAgICAqIFRoZSBleGVjdXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgaW1tZWRpYXRlbHkgd2hlbiB0aGUgUHJvbWlzZSBpcyBpbnN0YW50aWF0ZWQuIEl0IGlzIHJlc3BvbnNpYmxlIGZvclxuICAgICAgICAgICAgICogc3RhcnRpbmcgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gd2hlbiBpdCBpcyBpbnZva2VkLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIFRoZSBleGVjdXRvciBtdXN0IGNhbGwgZWl0aGVyIHRoZSBwYXNzZWQgYHJlc29sdmVgIGZ1bmN0aW9uIHdoZW4gdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZFxuICAgICAgICAgICAgICogc3VjY2Vzc2Z1bGx5LCBvciB0aGUgYHJlamVjdGAgZnVuY3Rpb24gd2hlbiB0aGUgb3BlcmF0aW9uIGZhaWxzLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdHJ1Y3RvcihleGVjdXRvcikge1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoaXMgcHJvbWlzZS5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gMSAvKiBQZW5kaW5nICovO1xuICAgICAgICAgICAgICAgIHRoaXNbU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdQcm9taXNlJztcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBJZiB0cnVlLCB0aGUgcmVzb2x1dGlvbiBvZiB0aGlzIHByb21pc2UgaXMgY2hhaW5lZCAoXCJsb2NrZWQgaW5cIikgdG8gYW5vdGhlciBwcm9taXNlLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGxldCBpc0NoYWluZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGlzIHByb21pc2UgaXMgaW4gYSByZXNvbHZlZCBzdGF0ZS5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBjb25zdCBpc1Jlc29sdmVkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZSAhPT0gMSAvKiBQZW5kaW5nICovIHx8IGlzQ2hhaW5lZDtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIENhbGxiYWNrcyB0aGF0IHNob3VsZCBiZSBpbnZva2VkIG9uY2UgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBsZXQgY2FsbGJhY2tzID0gW107XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogSW5pdGlhbGx5IHB1c2hlcyBjYWxsYmFja3Mgb250byBhIHF1ZXVlIGZvciBleGVjdXRpb24gb25jZSB0aGlzIHByb21pc2Ugc2V0dGxlcy4gQWZ0ZXIgdGhlIHByb21pc2Ugc2V0dGxlcyxcbiAgICAgICAgICAgICAgICAgKiBlbnF1ZXVlcyBjYWxsYmFja3MgZm9yIGV4ZWN1dGlvbiBvbiB0aGUgbmV4dCBldmVudCBsb29wIHR1cm4uXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgbGV0IHdoZW5GaW5pc2hlZCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIFNldHRsZXMgdGhpcyBwcm9taXNlLlxuICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIG5ld1N0YXRlIFRoZSByZXNvbHZlZCBzdGF0ZSBmb3IgdGhpcyBwcm9taXNlLlxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7VHxhbnl9IHZhbHVlIFRoZSByZXNvbHZlZCB2YWx1ZSBmb3IgdGhpcyBwcm9taXNlLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IHNldHRsZSA9IChuZXdTdGF0ZSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQSBwcm9taXNlIGNhbiBvbmx5IGJlIHNldHRsZWQgb25jZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT09IDEgLyogUGVuZGluZyAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlZFZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHdoZW5GaW5pc2hlZCA9IHF1ZXVlTWljcm9UYXNrO1xuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGVucXVldWUgYSBjYWxsYmFjayBydW5uZXIgaWYgdGhlcmUgYXJlIGNhbGxiYWNrcyBzbyB0aGF0IGluaXRpYWxseSBmdWxmaWxsZWQgUHJvbWlzZXMgZG9uJ3QgaGF2ZSB0b1xuICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGFuIGV4dHJhIHR1cm4uXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja3MgJiYgY2FsbGJhY2tzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlTWljcm9UYXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IGNhbGxiYWNrcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzW2ldLmNhbGwobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogUmVzb2x2ZXMgdGhpcyBwcm9taXNlLlxuICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIG5ld1N0YXRlIFRoZSByZXNvbHZlZCBzdGF0ZSBmb3IgdGhpcyBwcm9taXNlLlxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7VHxhbnl9IHZhbHVlIFRoZSByZXNvbHZlZCB2YWx1ZSBmb3IgdGhpcyBwcm9taXNlLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmUgPSAobmV3U3RhdGUsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1Jlc29sdmVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNUaGVuYWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnRoZW4oc2V0dGxlLmJpbmQobnVsbCwgMCAvKiBGdWxmaWxsZWQgKi8pLCBzZXR0bGUuYmluZChudWxsLCAyIC8qIFJlamVjdGVkICovKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NoYWluZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGxlKG5ld1N0YXRlLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMudGhlbiA9IChvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbkZpbmlzaGVkIGluaXRpYWxseSBxdWV1ZXMgdXAgY2FsbGJhY2tzIGZvciBleGVjdXRpb24gYWZ0ZXIgdGhlIHByb21pc2UgaGFzIHNldHRsZWQuIE9uY2UgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9taXNlIGhhcyBzZXR0bGVkLCB3aGVuRmluaXNoZWQgd2lsbCBzY2hlZHVsZSBjYWxsYmFja3MgZm9yIGV4ZWN1dGlvbiBvbiB0aGUgbmV4dCB0dXJuIHRocm91Z2ggdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudCBsb29wLlxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlbkZpbmlzaGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuc3RhdGUgPT09IDIgLyogUmVqZWN0ZWQgKi8gPyBvblJlamVjdGVkIDogb25GdWxmaWxsZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjYWxsYmFjayh0aGlzLnJlc29sdmVkVmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gMiAvKiBSZWplY3RlZCAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhpcy5yZXNvbHZlZFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5yZXNvbHZlZFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBleGVjdXRvcihyZXNvbHZlLmJpbmQobnVsbCwgMCAvKiBGdWxmaWxsZWQgKi8pLCByZXNvbHZlLmJpbmQobnVsbCwgMiAvKiBSZWplY3RlZCAqLykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGxlKDIgLyogUmVqZWN0ZWQgKi8sIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0aWMgYWxsKGl0ZXJhYmxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21wbGV0ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3B1bGF0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZnVsZmlsbChpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc1tpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICsrY29tcGxldGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2goKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmaW5pc2goKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9wdWxhdGluZyB8fCBjb21wbGV0ZSA8IHRvdGFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHByb2Nlc3NJdGVtKGluZGV4LCBpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICArK3RvdGFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzVGhlbmFibGUoaXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbiBpdGVtIFByb21pc2UgcmVqZWN0cywgdGhpcyBQcm9taXNlIGlzIGltbWVkaWF0ZWx5IHJlamVjdGVkIHdpdGggdGhlIGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9taXNlJ3MgcmVqZWN0aW9uIGVycm9yLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0udGhlbihmdWxmaWxsLmJpbmQobnVsbCwgaW5kZXgpLCByZWplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKGl0ZW0pLnRoZW4oZnVsZmlsbC5iaW5kKG51bGwsIGluZGV4KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGl0ZXJhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzSXRlbShpLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBmaW5pc2goKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRpYyByYWNlKGl0ZXJhYmxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZXJhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIFByb21pc2UgaXRlbSByZWplY3RzLCB0aGlzIFByb21pc2UgaXMgaW1tZWRpYXRlbHkgcmVqZWN0ZWQgd2l0aCB0aGUgaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb21pc2UncyByZWplY3Rpb24gZXJyb3IuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoaXRlbSkudGhlbihyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdGljIHJlamVjdChyZWFzb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRpYyByZXNvbHZlKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2gob25SZWplY3RlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgX2FbU3ltYm9sLnNwZWNpZXNdID0gU2hpbVByb21pc2UsXG4gICAgICAgIF9hKTtcbn1cbmV4cG9ydCBkZWZhdWx0IFNoaW1Qcm9taXNlO1xudmFyIF9hO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJvbWlzZS5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9Qcm9taXNlLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9Qcm9taXNlLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XG5pbXBvcnQgZ2xvYmFsIGZyb20gJy4vZ2xvYmFsJztcbmltcG9ydCB7IGdldFZhbHVlRGVzY3JpcHRvciB9IGZyb20gJy4vc3VwcG9ydC91dGlsJztcbmV4cG9ydCBsZXQgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbmlmICghdHJ1ZSkge1xuICAgIC8qKlxuICAgICAqIFRocm93cyBpZiB0aGUgdmFsdWUgaXMgbm90IGEgc3ltYm9sLCB1c2VkIGludGVybmFsbHkgd2l0aGluIHRoZSBTaGltXG4gICAgICogQHBhcmFtICB7YW55fSAgICB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJuIHtzeW1ib2x9ICAgICAgIFJldHVybnMgdGhlIHN5bWJvbCBvciB0aHJvd3NcbiAgICAgKi9cbiAgICBjb25zdCB2YWxpZGF0ZVN5bWJvbCA9IGZ1bmN0aW9uIHZhbGlkYXRlU3ltYm9sKHZhbHVlKSB7XG4gICAgICAgIGlmICghaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHZhbHVlICsgJyBpcyBub3QgYSBzeW1ib2wnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBjb25zdCBkZWZpbmVQcm9wZXJ0aWVzID0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXM7XG4gICAgY29uc3QgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG4gICAgY29uc3QgY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcbiAgICBjb25zdCBvYmpQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuICAgIGNvbnN0IGdsb2JhbFN5bWJvbHMgPSB7fTtcbiAgICBjb25zdCBnZXRTeW1ib2xOYW1lID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgY3JlYXRlZCA9IGNyZWF0ZShudWxsKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChkZXNjKSB7XG4gICAgICAgICAgICBsZXQgcG9zdGZpeCA9IDA7XG4gICAgICAgICAgICBsZXQgbmFtZTtcbiAgICAgICAgICAgIHdoaWxlIChjcmVhdGVkW1N0cmluZyhkZXNjKSArIChwb3N0Zml4IHx8ICcnKV0pIHtcbiAgICAgICAgICAgICAgICArK3Bvc3RmaXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZXNjICs9IFN0cmluZyhwb3N0Zml4IHx8ICcnKTtcbiAgICAgICAgICAgIGNyZWF0ZWRbZGVzY10gPSB0cnVlO1xuICAgICAgICAgICAgbmFtZSA9ICdAQCcgKyBkZXNjO1xuICAgICAgICAgICAgLy8gRklYTUU6IFRlbXBvcmFyeSBndWFyZCB1bnRpbCB0aGUgZHVwbGljYXRlIGV4ZWN1dGlvbiB3aGVuIHRlc3RpbmcgY2FuIGJlXG4gICAgICAgICAgICAvLyBwaW5uZWQgZG93bi5cbiAgICAgICAgICAgIGlmICghT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmpQcm90b3R5cGUsIG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgZGVmaW5lUHJvcGVydHkob2JqUHJvdG90eXBlLCBuYW1lLCB7XG4gICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVQcm9wZXJ0eSh0aGlzLCBuYW1lLCBnZXRWYWx1ZURlc2NyaXB0b3IodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgICAgIH07XG4gICAgfSkoKTtcbiAgICBjb25zdCBJbnRlcm5hbFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbChkZXNjcmlwdGlvbikge1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEludGVybmFsU3ltYm9sKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUeXBlRXJyb3I6IFN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvcicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTeW1ib2woZGVzY3JpcHRpb24pO1xuICAgIH07XG4gICAgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbChkZXNjcmlwdGlvbikge1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFN5bWJvbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHlwZUVycm9yOiBTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3InKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzeW0gPSBPYmplY3QuY3JlYXRlKEludGVybmFsU3ltYm9sLnByb3RvdHlwZSk7XG4gICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCA/ICcnIDogU3RyaW5nKGRlc2NyaXB0aW9uKTtcbiAgICAgICAgcmV0dXJuIGRlZmluZVByb3BlcnRpZXMoc3ltLCB7XG4gICAgICAgICAgICBfX2Rlc2NyaXB0aW9uX186IGdldFZhbHVlRGVzY3JpcHRvcihkZXNjcmlwdGlvbiksXG4gICAgICAgICAgICBfX25hbWVfXzogZ2V0VmFsdWVEZXNjcmlwdG9yKGdldFN5bWJvbE5hbWUoZGVzY3JpcHRpb24pKVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qIERlY29yYXRlIHRoZSBTeW1ib2wgZnVuY3Rpb24gd2l0aCB0aGUgYXBwcm9wcmlhdGUgcHJvcGVydGllcyAqL1xuICAgIGRlZmluZVByb3BlcnR5KFN5bWJvbCwgJ2ZvcicsIGdldFZhbHVlRGVzY3JpcHRvcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmIChnbG9iYWxTeW1ib2xzW2tleV0pIHtcbiAgICAgICAgICAgIHJldHVybiBnbG9iYWxTeW1ib2xzW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChnbG9iYWxTeW1ib2xzW2tleV0gPSBTeW1ib2woU3RyaW5nKGtleSkpKTtcbiAgICB9KSk7XG4gICAgZGVmaW5lUHJvcGVydGllcyhTeW1ib2wsIHtcbiAgICAgICAga2V5Rm9yOiBnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgICAgICAgbGV0IGtleTtcbiAgICAgICAgICAgIHZhbGlkYXRlU3ltYm9sKHN5bSk7XG4gICAgICAgICAgICBmb3IgKGtleSBpbiBnbG9iYWxTeW1ib2xzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGdsb2JhbFN5bWJvbHNba2V5XSA9PT0gc3ltKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgaGFzSW5zdGFuY2U6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdoYXNJbnN0YW5jZScpLCBmYWxzZSwgZmFsc2UpLFxuICAgICAgICBpc0NvbmNhdFNwcmVhZGFibGU6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdpc0NvbmNhdFNwcmVhZGFibGUnKSwgZmFsc2UsIGZhbHNlKSxcbiAgICAgICAgaXRlcmF0b3I6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdpdGVyYXRvcicpLCBmYWxzZSwgZmFsc2UpLFxuICAgICAgICBtYXRjaDogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ21hdGNoJyksIGZhbHNlLCBmYWxzZSksXG4gICAgICAgIG9ic2VydmFibGU6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdvYnNlcnZhYmxlJyksIGZhbHNlLCBmYWxzZSksXG4gICAgICAgIHJlcGxhY2U6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdyZXBsYWNlJyksIGZhbHNlLCBmYWxzZSksXG4gICAgICAgIHNlYXJjaDogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3NlYXJjaCcpLCBmYWxzZSwgZmFsc2UpLFxuICAgICAgICBzcGVjaWVzOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignc3BlY2llcycpLCBmYWxzZSwgZmFsc2UpLFxuICAgICAgICBzcGxpdDogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3NwbGl0JyksIGZhbHNlLCBmYWxzZSksXG4gICAgICAgIHRvUHJpbWl0aXZlOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcigndG9QcmltaXRpdmUnKSwgZmFsc2UsIGZhbHNlKSxcbiAgICAgICAgdG9TdHJpbmdUYWc6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCd0b1N0cmluZ1RhZycpLCBmYWxzZSwgZmFsc2UpLFxuICAgICAgICB1bnNjb3BhYmxlczogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3Vuc2NvcGFibGVzJyksIGZhbHNlLCBmYWxzZSlcbiAgICB9KTtcbiAgICAvKiBEZWNvcmF0ZSB0aGUgSW50ZXJuYWxTeW1ib2wgb2JqZWN0ICovXG4gICAgZGVmaW5lUHJvcGVydGllcyhJbnRlcm5hbFN5bWJvbC5wcm90b3R5cGUsIHtcbiAgICAgICAgY29uc3RydWN0b3I6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wpLFxuICAgICAgICB0b1N0cmluZzogZ2V0VmFsdWVEZXNjcmlwdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9fbmFtZV9fO1xuICAgICAgICB9LCBmYWxzZSwgZmFsc2UpXG4gICAgfSk7XG4gICAgLyogRGVjb3JhdGUgdGhlIFN5bWJvbC5wcm90b3R5cGUgKi9cbiAgICBkZWZpbmVQcm9wZXJ0aWVzKFN5bWJvbC5wcm90b3R5cGUsIHtcbiAgICAgICAgdG9TdHJpbmc6IGdldFZhbHVlRGVzY3JpcHRvcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1N5bWJvbCAoJyArIHZhbGlkYXRlU3ltYm9sKHRoaXMpLl9fZGVzY3JpcHRpb25fXyArICcpJztcbiAgICAgICAgfSksXG4gICAgICAgIHZhbHVlT2Y6IGdldFZhbHVlRGVzY3JpcHRvcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVTeW1ib2wodGhpcyk7XG4gICAgICAgIH0pXG4gICAgfSk7XG4gICAgZGVmaW5lUHJvcGVydHkoU3ltYm9sLnByb3RvdHlwZSwgU3ltYm9sLnRvUHJpbWl0aXZlLCBnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVTeW1ib2wodGhpcyk7XG4gICAgfSkpO1xuICAgIGRlZmluZVByb3BlcnR5KFN5bWJvbC5wcm90b3R5cGUsIFN5bWJvbC50b1N0cmluZ1RhZywgZ2V0VmFsdWVEZXNjcmlwdG9yKCdTeW1ib2wnLCBmYWxzZSwgZmFsc2UsIHRydWUpKTtcbiAgICBkZWZpbmVQcm9wZXJ0eShJbnRlcm5hbFN5bWJvbC5wcm90b3R5cGUsIFN5bWJvbC50b1ByaW1pdGl2ZSwgZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5wcm90b3R5cGVbU3ltYm9sLnRvUHJpbWl0aXZlXSwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7XG4gICAgZGVmaW5lUHJvcGVydHkoSW50ZXJuYWxTeW1ib2wucHJvdG90eXBlLCBTeW1ib2wudG9TdHJpbmdUYWcsIGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wucHJvdG90eXBlW1N5bWJvbC50b1N0cmluZ1RhZ10sIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpO1xufVxuLyoqXG4gKiBBIGN1c3RvbSBndWFyZCBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgaWYgYW4gb2JqZWN0IGlzIGEgc3ltYm9sIG9yIG5vdFxuICogQHBhcmFtICB7YW55fSAgICAgICB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2sgdG8gc2VlIGlmIGl0IGlzIGEgc3ltYm9sIG9yIG5vdFxuICogQHJldHVybiB7aXMgc3ltYm9sfSAgICAgICBSZXR1cm5zIHRydWUgaWYgYSBzeW1ib2wgb3Igbm90IChhbmQgbmFycm93cyB0aGUgdHlwZSBndWFyZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gICAgcmV0dXJuICh2YWx1ZSAmJiAodHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJyB8fCB2YWx1ZVsnQEB0b1N0cmluZ1RhZyddID09PSAnU3ltYm9sJykpIHx8IGZhbHNlO1xufVxuLyoqXG4gKiBGaWxsIGFueSBtaXNzaW5nIHdlbGwga25vd24gc3ltYm9scyBpZiB0aGUgbmF0aXZlIFN5bWJvbCBpcyBtaXNzaW5nIHRoZW1cbiAqL1xuW1xuICAgICdoYXNJbnN0YW5jZScsXG4gICAgJ2lzQ29uY2F0U3ByZWFkYWJsZScsXG4gICAgJ2l0ZXJhdG9yJyxcbiAgICAnc3BlY2llcycsXG4gICAgJ3JlcGxhY2UnLFxuICAgICdzZWFyY2gnLFxuICAgICdzcGxpdCcsXG4gICAgJ21hdGNoJyxcbiAgICAndG9QcmltaXRpdmUnLFxuICAgICd0b1N0cmluZ1RhZycsXG4gICAgJ3Vuc2NvcGFibGVzJyxcbiAgICAnb2JzZXJ2YWJsZSdcbl0uZm9yRWFjaCgod2VsbEtub3duKSA9PiB7XG4gICAgaWYgKCFTeW1ib2xbd2VsbEtub3duXSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3ltYm9sLCB3ZWxsS25vd24sIGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKHdlbGxLbm93biksIGZhbHNlLCBmYWxzZSkpO1xuICAgIH1cbn0pO1xuZXhwb3J0IGRlZmF1bHQgU3ltYm9sO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3ltYm9sLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL1N5bWJvbC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vU3ltYm9sLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xuaW1wb3J0IHsgaXNBcnJheUxpa2UgfSBmcm9tICcuL2l0ZXJhdG9yJztcbmltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XG5pbXBvcnQgJy4vU3ltYm9sJztcbmV4cG9ydCBsZXQgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xuaWYgKCF0cnVlKSB7XG4gICAgY29uc3QgREVMRVRFRCA9IHt9O1xuICAgIGNvbnN0IGdldFVJRCA9IGZ1bmN0aW9uIGdldFVJRCgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDAwMCk7XG4gICAgfTtcbiAgICBjb25zdCBnZW5lcmF0ZU5hbWUgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgc3RhcnRJZCA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAlIDEwMDAwMDAwMCk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBnZW5lcmF0ZU5hbWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gJ19fd20nICsgZ2V0VUlEKCkgKyAoc3RhcnRJZCsrICsgJ19fJyk7XG4gICAgICAgIH07XG4gICAgfSkoKTtcbiAgICBXZWFrTWFwID0gY2xhc3MgV2Vha01hcCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKGl0ZXJhYmxlKSB7XG4gICAgICAgICAgICB0aGlzW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnV2Vha01hcCc7XG4gICAgICAgICAgICB0aGlzLl9uYW1lID0gZ2VuZXJhdGVOYW1lKCk7XG4gICAgICAgICAgICB0aGlzLl9mcm96ZW5FbnRyaWVzID0gW107XG4gICAgICAgICAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNBcnJheUxpa2UoaXRlcmFibGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlcmFibGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KGl0ZW1bMF0sIGl0ZW1bMV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX2dldEZyb3plbkVudHJ5SW5kZXgoa2V5KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2Zyb3plbkVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZnJvemVuRW50cmllc1tpXS5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlKGtleSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0ga2V5W3RoaXMuX25hbWVdO1xuICAgICAgICAgICAgaWYgKGVudHJ5ICYmIGVudHJ5LmtleSA9PT0ga2V5ICYmIGVudHJ5LnZhbHVlICE9PSBERUxFVEVEKSB7XG4gICAgICAgICAgICAgICAgZW50cnkudmFsdWUgPSBERUxFVEVEO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZnJvemVuSW5kZXggPSB0aGlzLl9nZXRGcm96ZW5FbnRyeUluZGV4KGtleSk7XG4gICAgICAgICAgICBpZiAoZnJvemVuSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Zyb3plbkVudHJpZXMuc3BsaWNlKGZyb3plbkluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBnZXQoa2V5KSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwga2V5ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0ga2V5W3RoaXMuX25hbWVdO1xuICAgICAgICAgICAgaWYgKGVudHJ5ICYmIGVudHJ5LmtleSA9PT0ga2V5ICYmIGVudHJ5LnZhbHVlICE9PSBERUxFVEVEKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZnJvemVuSW5kZXggPSB0aGlzLl9nZXRGcm96ZW5FbnRyeUluZGV4KGtleSk7XG4gICAgICAgICAgICBpZiAoZnJvemVuSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mcm96ZW5FbnRyaWVzW2Zyb3plbkluZGV4XS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBoYXMoa2V5KSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwga2V5ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBrZXlbdGhpcy5fbmFtZV07XG4gICAgICAgICAgICBpZiAoQm9vbGVhbihlbnRyeSAmJiBlbnRyeS5rZXkgPT09IGtleSAmJiBlbnRyeS52YWx1ZSAhPT0gREVMRVRFRCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZyb3plbkluZGV4ID0gdGhpcy5fZ2V0RnJvemVuRW50cnlJbmRleChrZXkpO1xuICAgICAgICAgICAgaWYgKGZyb3plbkluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKCFrZXkgfHwgKHR5cGVvZiBrZXkgIT09ICdvYmplY3QnICYmIHR5cGVvZiBrZXkgIT09ICdmdW5jdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCB2YWx1ZSB1c2VkIGFzIHdlYWsgbWFwIGtleScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGVudHJ5ID0ga2V5W3RoaXMuX25hbWVdO1xuICAgICAgICAgICAgaWYgKCFlbnRyeSB8fCBlbnRyeS5rZXkgIT09IGtleSkge1xuICAgICAgICAgICAgICAgIGVudHJ5ID0gT2JqZWN0LmNyZWF0ZShudWxsLCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogeyB2YWx1ZToga2V5IH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmlzRnJvemVuKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZnJvemVuRW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShrZXksIHRoaXMuX25hbWUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlbnRyeVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbnRyeS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0IGRlZmF1bHQgV2Vha01hcDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdlYWtNYXAubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vV2Vha01hcC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vV2Vha01hcC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4vZ2xvYmFsJztcbmltcG9ydCB7IGlzQXJyYXlMaWtlLCBpc0l0ZXJhYmxlIH0gZnJvbSAnLi9pdGVyYXRvcic7XG5pbXBvcnQgeyBNQVhfU0FGRV9JTlRFR0VSIH0gZnJvbSAnLi9udW1iZXInO1xuaW1wb3J0IGhhcyBmcm9tICcuL3N1cHBvcnQvaGFzJztcbmltcG9ydCB7IHdyYXBOYXRpdmUgfSBmcm9tICcuL3N1cHBvcnQvdXRpbCc7XG5leHBvcnQgbGV0IGZyb207XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgYXJyYXkgZnJvbSB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gYXJndW1lbnRzIEFueSBudW1iZXIgb2YgYXJndW1lbnRzIGZvciB0aGUgYXJyYXlcbiAqIEByZXR1cm4gQW4gYXJyYXkgZnJvbSB0aGUgZ2l2ZW4gYXJndW1lbnRzXG4gKi9cbmV4cG9ydCBsZXQgb2Y7XG4vKiBFUzYgQXJyYXkgaW5zdGFuY2UgbWV0aG9kcyAqL1xuLyoqXG4gKiBDb3BpZXMgZGF0YSBpbnRlcm5hbGx5IHdpdGhpbiBhbiBhcnJheSBvciBhcnJheS1saWtlIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgYXJyYXktbGlrZSBvYmplY3RcbiAqIEBwYXJhbSBvZmZzZXQgVGhlIGluZGV4IHRvIHN0YXJ0IGNvcHlpbmcgdmFsdWVzIHRvOyBpZiBuZWdhdGl2ZSwgaXQgY291bnRzIGJhY2t3YXJkcyBmcm9tIGxlbmd0aFxuICogQHBhcmFtIHN0YXJ0IFRoZSBmaXJzdCAoaW5jbHVzaXZlKSBpbmRleCB0byBjb3B5OyBpZiBuZWdhdGl2ZSwgaXQgY291bnRzIGJhY2t3YXJkcyBmcm9tIGxlbmd0aFxuICogQHBhcmFtIGVuZCBUaGUgbGFzdCAoZXhjbHVzaXZlKSBpbmRleCB0byBjb3B5OyBpZiBuZWdhdGl2ZSwgaXQgY291bnRzIGJhY2t3YXJkcyBmcm9tIGxlbmd0aFxuICogQHJldHVybiBUaGUgdGFyZ2V0XG4gKi9cbmV4cG9ydCBsZXQgY29weVdpdGhpbjtcbi8qKlxuICogRmlsbHMgZWxlbWVudHMgb2YgYW4gYXJyYXktbGlrZSBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCB0byBmaWxsXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGZpbGwgZWFjaCBlbGVtZW50IG9mIHRoZSB0YXJnZXQgd2l0aFxuICogQHBhcmFtIHN0YXJ0IFRoZSBmaXJzdCBpbmRleCB0byBmaWxsXG4gKiBAcGFyYW0gZW5kIFRoZSAoZXhjbHVzaXZlKSBpbmRleCBhdCB3aGljaCB0byBzdG9wIGZpbGxpbmdcbiAqIEByZXR1cm4gVGhlIGZpbGxlZCB0YXJnZXRcbiAqL1xuZXhwb3J0IGxldCBmaWxsO1xuLyoqXG4gKiBGaW5kcyBhbmQgcmV0dXJucyB0aGUgZmlyc3QgaW5zdGFuY2UgbWF0Y2hpbmcgdGhlIGNhbGxiYWNrIG9yIHVuZGVmaW5lZCBpZiBvbmUgaXMgbm90IGZvdW5kLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgQW4gYXJyYXktbGlrZSBvYmplY3RcbiAqIEBwYXJhbSBjYWxsYmFjayBBIGZ1bmN0aW9uIHJldHVybmluZyBpZiB0aGUgY3VycmVudCB2YWx1ZSBtYXRjaGVzIGEgY3JpdGVyaWFcbiAqIEBwYXJhbSB0aGlzQXJnIFRoZSBleGVjdXRpb24gY29udGV4dCBmb3IgdGhlIGZpbmQgZnVuY3Rpb25cbiAqIEByZXR1cm4gVGhlIGZpcnN0IGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGNhbGxiYWNrLCBvciB1bmRlZmluZWQgaWYgb25lIGRvZXMgbm90IGV4aXN0XG4gKi9cbmV4cG9ydCBsZXQgZmluZDtcbi8qKlxuICogUGVyZm9ybXMgYSBsaW5lYXIgc2VhcmNoIGFuZCByZXR1cm5zIHRoZSBmaXJzdCBpbmRleCB3aG9zZSB2YWx1ZSBzYXRpc2ZpZXMgdGhlIHBhc3NlZCBjYWxsYmFjayxcbiAqIG9yIC0xIGlmIG5vIHZhbHVlcyBzYXRpc2Z5IGl0LlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgQW4gYXJyYXktbGlrZSBvYmplY3RcbiAqIEBwYXJhbSBjYWxsYmFjayBBIGZ1bmN0aW9uIHJldHVybmluZyB0cnVlIGlmIHRoZSBjdXJyZW50IHZhbHVlIHNhdGlzZmllcyBpdHMgY3JpdGVyaWFcbiAqIEBwYXJhbSB0aGlzQXJnIFRoZSBleGVjdXRpb24gY29udGV4dCBmb3IgdGhlIGZpbmQgZnVuY3Rpb25cbiAqIEByZXR1cm4gVGhlIGZpcnN0IGluZGV4IHdob3NlIHZhbHVlIHNhdGlzZmllcyB0aGUgcGFzc2VkIGNhbGxiYWNrLCBvciAtMSBpZiBubyB2YWx1ZXMgc2F0aXNmeSBpdFxuICovXG5leHBvcnQgbGV0IGZpbmRJbmRleDtcbi8qIEVTNyBBcnJheSBpbnN0YW5jZSBtZXRob2RzICovXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhbiBhcnJheSBpbmNsdWRlcyBhIGdpdmVuIHZhbHVlXG4gKlxuICogQHBhcmFtIHRhcmdldCB0aGUgdGFyZ2V0IGFycmF5LWxpa2Ugb2JqZWN0XG4gKiBAcGFyYW0gc2VhcmNoRWxlbWVudCB0aGUgaXRlbSB0byBzZWFyY2ggZm9yXG4gKiBAcGFyYW0gZnJvbUluZGV4IHRoZSBzdGFydGluZyBpbmRleCB0byBzZWFyY2ggZnJvbVxuICogQHJldHVybiBgdHJ1ZWAgaWYgdGhlIGFycmF5IGluY2x1ZGVzIHRoZSBlbGVtZW50LCBvdGhlcndpc2UgYGZhbHNlYFxuICovXG5leHBvcnQgbGV0IGluY2x1ZGVzO1xuaWYgKHRydWUgJiYgdHJ1ZSkge1xuICAgIGZyb20gPSBnbG9iYWwuQXJyYXkuZnJvbTtcbiAgICBvZiA9IGdsb2JhbC5BcnJheS5vZjtcbiAgICBjb3B5V2l0aGluID0gd3JhcE5hdGl2ZShnbG9iYWwuQXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4pO1xuICAgIGZpbGwgPSB3cmFwTmF0aXZlKGdsb2JhbC5BcnJheS5wcm90b3R5cGUuZmlsbCk7XG4gICAgZmluZCA9IHdyYXBOYXRpdmUoZ2xvYmFsLkFycmF5LnByb3RvdHlwZS5maW5kKTtcbiAgICBmaW5kSW5kZXggPSB3cmFwTmF0aXZlKGdsb2JhbC5BcnJheS5wcm90b3R5cGUuZmluZEluZGV4KTtcbn1cbmVsc2Uge1xuICAgIC8vIEl0IGlzIG9ubHkgb2xkZXIgdmVyc2lvbnMgb2YgU2FmYXJpL2lPUyB0aGF0IGhhdmUgYSBiYWQgZmlsbCBpbXBsZW1lbnRhdGlvbiBhbmQgc28gYXJlbid0IGluIHRoZSB3aWxkXG4gICAgLy8gVG8gbWFrZSB0aGluZ3MgZWFzaWVyLCBpZiB0aGVyZSBpcyBhIGJhZCBmaWxsIGltcGxlbWVudGF0aW9uLCB0aGUgd2hvbGUgc2V0IG9mIGZ1bmN0aW9ucyB3aWxsIGJlIGZpbGxlZFxuICAgIC8qKlxuICAgICAqIEVuc3VyZXMgYSBub24tbmVnYXRpdmUsIG5vbi1pbmZpbml0ZSwgc2FmZSBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIHRvIHZhbGlkYXRlXG4gICAgICogQHJldHVybiBBIHByb3BlciBsZW5ndGhcbiAgICAgKi9cbiAgICBjb25zdCB0b0xlbmd0aCA9IGZ1bmN0aW9uIHRvTGVuZ3RoKGxlbmd0aCkge1xuICAgICAgICBpZiAoaXNOYU4obGVuZ3RoKSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aCk7XG4gICAgICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICAgICAgICBsZW5ndGggPSBNYXRoLmZsb29yKGxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRW5zdXJlIGEgbm9uLW5lZ2F0aXZlLCByZWFsLCBzYWZlIGludGVnZXJcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KGxlbmd0aCwgMCksIE1BWF9TQUZFX0lOVEVHRVIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRnJvbSBFUzYgNy4xLjQgVG9JbnRlZ2VyKClcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSBBIHZhbHVlIHRvIGNvbnZlcnRcbiAgICAgKiBAcmV0dXJuIEFuIGludGVnZXJcbiAgICAgKi9cbiAgICBjb25zdCB0b0ludGVnZXIgPSBmdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgPT09IDAgfHwgIWlzRmluaXRlKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAodmFsdWUgPiAwID8gMSA6IC0xKSAqIE1hdGguZmxvb3IoTWF0aC5hYnModmFsdWUpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6ZXMgYW4gb2Zmc2V0IGFnYWluc3QgYSBnaXZlbiBsZW5ndGgsIHdyYXBwaW5nIGl0IGlmIG5lZ2F0aXZlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSBvcmlnaW5hbCBvZmZzZXRcbiAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSB0b3RhbCBsZW5ndGggdG8gbm9ybWFsaXplIGFnYWluc3RcbiAgICAgKiBAcmV0dXJuIElmIG5lZ2F0aXZlLCBwcm92aWRlIGEgZGlzdGFuY2UgZnJvbSB0aGUgZW5kIChsZW5ndGgpOyBvdGhlcndpc2UgcHJvdmlkZSBhIGRpc3RhbmNlIGZyb20gMFxuICAgICAqL1xuICAgIGNvbnN0IG5vcm1hbGl6ZU9mZnNldCA9IGZ1bmN0aW9uIG5vcm1hbGl6ZU9mZnNldCh2YWx1ZSwgbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA8IDAgPyBNYXRoLm1heChsZW5ndGggKyB2YWx1ZSwgMCkgOiBNYXRoLm1pbih2YWx1ZSwgbGVuZ3RoKTtcbiAgICB9O1xuICAgIGZyb20gPSBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZSwgbWFwRnVuY3Rpb24sIHRoaXNBcmcpIHtcbiAgICAgICAgaWYgKGFycmF5TGlrZSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdmcm9tOiByZXF1aXJlcyBhbiBhcnJheS1saWtlIG9iamVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXBGdW5jdGlvbiAmJiB0aGlzQXJnKSB7XG4gICAgICAgICAgICBtYXBGdW5jdGlvbiA9IG1hcEZ1bmN0aW9uLmJpbmQodGhpc0FyZyk7XG4gICAgICAgIH1cbiAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWUgKi9cbiAgICAgICAgY29uc3QgQ29uc3RydWN0b3IgPSB0aGlzO1xuICAgICAgICBjb25zdCBsZW5ndGggPSB0b0xlbmd0aChhcnJheUxpa2UubGVuZ3RoKTtcbiAgICAgICAgLy8gU3VwcG9ydCBleHRlbnNpb25cbiAgICAgICAgY29uc3QgYXJyYXkgPSB0eXBlb2YgQ29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicgPyBPYmplY3QobmV3IENvbnN0cnVjdG9yKGxlbmd0aCkpIDogbmV3IEFycmF5KGxlbmd0aCk7XG4gICAgICAgIGlmICghaXNBcnJheUxpa2UoYXJyYXlMaWtlKSAmJiAhaXNJdGVyYWJsZShhcnJheUxpa2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgdGhpcyBpcyBhbiBhcnJheSBhbmQgdGhlIG5vcm1hbGl6ZWQgbGVuZ3RoIGlzIDAsIGp1c3QgcmV0dXJuIGFuIGVtcHR5IGFycmF5LiB0aGlzIHByZXZlbnRzIGEgcHJvYmxlbVxuICAgICAgICAvLyB3aXRoIHRoZSBpdGVyYXRpb24gb24gSUUgd2hlbiB1c2luZyBhIE5hTiBhcnJheSBsZW5ndGguXG4gICAgICAgIGlmIChpc0FycmF5TGlrZShhcnJheUxpa2UpKSB7XG4gICAgICAgICAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheUxpa2UubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IG1hcEZ1bmN0aW9uID8gbWFwRnVuY3Rpb24oYXJyYXlMaWtlW2ldLCBpKSA6IGFycmF5TGlrZVtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgYXJyYXlMaWtlKSB7XG4gICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBtYXBGdW5jdGlvbiA/IG1hcEZ1bmN0aW9uKHZhbHVlLCBpKSA6IHZhbHVlO1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJyYXlMaWtlLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhcnJheS5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH07XG4gICAgb2YgPSBmdW5jdGlvbiBvZiguLi5pdGVtcykge1xuICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoaXRlbXMpO1xuICAgIH07XG4gICAgY29weVdpdGhpbiA9IGZ1bmN0aW9uIGNvcHlXaXRoaW4odGFyZ2V0LCBvZmZzZXQsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjb3B5V2l0aGluOiB0YXJnZXQgbXVzdCBiZSBhbiBhcnJheS1saWtlIG9iamVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRvTGVuZ3RoKHRhcmdldC5sZW5ndGgpO1xuICAgICAgICBvZmZzZXQgPSBub3JtYWxpemVPZmZzZXQodG9JbnRlZ2VyKG9mZnNldCksIGxlbmd0aCk7XG4gICAgICAgIHN0YXJ0ID0gbm9ybWFsaXplT2Zmc2V0KHRvSW50ZWdlcihzdGFydCksIGxlbmd0aCk7XG4gICAgICAgIGVuZCA9IG5vcm1hbGl6ZU9mZnNldChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvSW50ZWdlcihlbmQpLCBsZW5ndGgpO1xuICAgICAgICBsZXQgY291bnQgPSBNYXRoLm1pbihlbmQgLSBzdGFydCwgbGVuZ3RoIC0gb2Zmc2V0KTtcbiAgICAgICAgbGV0IGRpcmVjdGlvbiA9IDE7XG4gICAgICAgIGlmIChvZmZzZXQgPiBzdGFydCAmJiBvZmZzZXQgPCBzdGFydCArIGNvdW50KSB7XG4gICAgICAgICAgICBkaXJlY3Rpb24gPSAtMTtcbiAgICAgICAgICAgIHN0YXJ0ICs9IGNvdW50IC0gMTtcbiAgICAgICAgICAgIG9mZnNldCArPSBjb3VudCAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGNvdW50ID4gMCkge1xuICAgICAgICAgICAgaWYgKHN0YXJ0IGluIHRhcmdldCkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtvZmZzZXRdID0gdGFyZ2V0W3N0YXJ0XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0YXJnZXRbb2Zmc2V0XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZnNldCArPSBkaXJlY3Rpb247XG4gICAgICAgICAgICBzdGFydCArPSBkaXJlY3Rpb247XG4gICAgICAgICAgICBjb3VudC0tO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfTtcbiAgICBmaWxsID0gZnVuY3Rpb24gZmlsbCh0YXJnZXQsIHZhbHVlLCBzdGFydCwgZW5kKSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRvTGVuZ3RoKHRhcmdldC5sZW5ndGgpO1xuICAgICAgICBsZXQgaSA9IG5vcm1hbGl6ZU9mZnNldCh0b0ludGVnZXIoc3RhcnQpLCBsZW5ndGgpO1xuICAgICAgICBlbmQgPSBub3JtYWxpemVPZmZzZXQoZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0ludGVnZXIoZW5kKSwgbGVuZ3RoKTtcbiAgICAgICAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICAgICAgICAgIHRhcmdldFtpKytdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9O1xuICAgIGZpbmQgPSBmdW5jdGlvbiBmaW5kKHRhcmdldCwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBmaW5kSW5kZXgodGFyZ2V0LCBjYWxsYmFjaywgdGhpc0FyZyk7XG4gICAgICAgIHJldHVybiBpbmRleCAhPT0gLTEgPyB0YXJnZXRbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgIH07XG4gICAgZmluZEluZGV4ID0gZnVuY3Rpb24gZmluZEluZGV4KHRhcmdldCwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdG9MZW5ndGgodGFyZ2V0Lmxlbmd0aCk7XG4gICAgICAgIGlmICghY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZpbmQ6IHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpc0FyZykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjay5iaW5kKHRoaXNBcmcpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjayh0YXJnZXRbaV0sIGksIHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfTtcbn1cbmlmICh0cnVlKSB7XG4gICAgaW5jbHVkZXMgPSB3cmFwTmF0aXZlKGdsb2JhbC5BcnJheS5wcm90b3R5cGUuaW5jbHVkZXMpO1xufVxuZWxzZSB7XG4gICAgLyoqXG4gICAgICogRW5zdXJlcyBhIG5vbi1uZWdhdGl2ZSwgbm9uLWluZmluaXRlLCBzYWZlIGludGVnZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgdG8gdmFsaWRhdGVcbiAgICAgKiBAcmV0dXJuIEEgcHJvcGVyIGxlbmd0aFxuICAgICAqL1xuICAgIGNvbnN0IHRvTGVuZ3RoID0gZnVuY3Rpb24gdG9MZW5ndGgobGVuZ3RoKSB7XG4gICAgICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpO1xuICAgICAgICBpZiAoaXNOYU4obGVuZ3RoKSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgICAgICAgIGxlbmd0aCA9IE1hdGguZmxvb3IobGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgYSBub24tbmVnYXRpdmUsIHJlYWwsIHNhZmUgaW50ZWdlclxuICAgICAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobGVuZ3RoLCAwKSwgTUFYX1NBRkVfSU5URUdFUik7XG4gICAgfTtcbiAgICBpbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzKHRhcmdldCwgc2VhcmNoRWxlbWVudCwgZnJvbUluZGV4ID0gMCkge1xuICAgICAgICBsZXQgbGVuID0gdG9MZW5ndGgodGFyZ2V0Lmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSBmcm9tSW5kZXg7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEVsZW1lbnQgPSB0YXJnZXRbaV07XG4gICAgICAgICAgICBpZiAoc2VhcmNoRWxlbWVudCA9PT0gY3VycmVudEVsZW1lbnQgfHxcbiAgICAgICAgICAgICAgICAoc2VhcmNoRWxlbWVudCAhPT0gc2VhcmNoRWxlbWVudCAmJiBjdXJyZW50RWxlbWVudCAhPT0gY3VycmVudEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcnJheS5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9hcnJheS5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vYXJyYXkubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiY29uc3QgZ2xvYmFsT2JqZWN0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gZ2xvYmFsIHNwZWMgZGVmaW5lcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdCBjYWxsZWQgJ2dsb2JhbCdcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZ2xvYmFsXG4gICAgICAgIC8vIGBnbG9iYWxgIGlzIGFsc28gZGVmaW5lZCBpbiBOb2RlSlNcbiAgICAgICAgcmV0dXJuIGdsb2JhbDtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gd2luZG93IGlzIGRlZmluZWQgaW4gYnJvd3NlcnNcbiAgICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIHNlbGYgaXMgZGVmaW5lZCBpbiBXZWJXb3JrZXJzXG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cbn0pKCk7XG5leHBvcnQgZGVmYXVsdCBnbG9iYWxPYmplY3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nbG9iYWwubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vZ2xvYmFsLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9nbG9iYWwubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0ICcuL1N5bWJvbCc7XG5pbXBvcnQgeyBISUdIX1NVUlJPR0FURV9NQVgsIEhJR0hfU1VSUk9HQVRFX01JTiB9IGZyb20gJy4vc3RyaW5nJztcbmNvbnN0IHN0YXRpY0RvbmUgPSB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbi8qKlxuICogQSBjbGFzcyB0aGF0IF9zaGltc18gYW4gaXRlcmF0b3IgaW50ZXJmYWNlIG9uIGFycmF5IGxpa2Ugb2JqZWN0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNoaW1JdGVyYXRvciB7XG4gICAgY29uc3RydWN0b3IobGlzdCkge1xuICAgICAgICB0aGlzLl9uZXh0SW5kZXggPSAtMTtcbiAgICAgICAgaWYgKGlzSXRlcmFibGUobGlzdCkpIHtcbiAgICAgICAgICAgIHRoaXMuX25hdGl2ZUl0ZXJhdG9yID0gbGlzdFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9saXN0ID0gbGlzdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIG5leHQgaXRlcmF0aW9uIHJlc3VsdCBmb3IgdGhlIEl0ZXJhdG9yXG4gICAgICovXG4gICAgbmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX25hdGl2ZUl0ZXJhdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbmF0aXZlSXRlcmF0b3IubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fbGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRpY0RvbmU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCsrdGhpcy5fbmV4dEluZGV4IDwgdGhpcy5fbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZG9uZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuX2xpc3RbdGhpcy5fbmV4dEluZGV4XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdGljRG9uZTtcbiAgICB9XG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbi8qKlxuICogQSB0eXBlIGd1YXJkIGZvciBjaGVja2luZyBpZiBzb21ldGhpbmcgaGFzIGFuIEl0ZXJhYmxlIGludGVyZmFjZVxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdHlwZSBndWFyZCBhZ2FpbnN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0l0ZXJhYmxlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZVtTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nO1xufVxuLyoqXG4gKiBBIHR5cGUgZ3VhcmQgZm9yIGNoZWNraW5nIGlmIHNvbWV0aGluZyBpcyBBcnJheUxpa2VcbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHR5cGUgZ3VhcmQgYWdhaW5zdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLmxlbmd0aCA9PT0gJ251bWJlcic7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGl0ZXJhdG9yIGZvciBhbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0gaXRlcmFibGUgVGhlIGl0ZXJhYmxlIG9iamVjdCB0byByZXR1cm4gdGhlIGl0ZXJhdG9yIGZvclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0KGl0ZXJhYmxlKSB7XG4gICAgaWYgKGlzSXRlcmFibGUoaXRlcmFibGUpKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzQXJyYXlMaWtlKGl0ZXJhYmxlKSkge1xuICAgICAgICByZXR1cm4gbmV3IFNoaW1JdGVyYXRvcihpdGVyYWJsZSk7XG4gICAgfVxufVxuLyoqXG4gKiBTaGltcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBgZm9yIC4uLiBvZmAgYmxvY2tzXG4gKlxuICogQHBhcmFtIGl0ZXJhYmxlIFRoZSBvYmplY3QgdGhlIHByb3ZpZGVzIGFuIGludGVyYXRvciBpbnRlcmZhY2VcbiAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2ggaXRlbSBvZiB0aGUgaXRlcmFibGVcbiAqIEBwYXJhbSB0aGlzQXJnIE9wdGlvbmFsIHNjb3BlIHRvIHBhc3MgdGhlIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JPZihpdGVyYWJsZSwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICBsZXQgYnJva2VuID0gZmFsc2U7XG4gICAgZnVuY3Rpb24gZG9CcmVhaygpIHtcbiAgICAgICAgYnJva2VuID0gdHJ1ZTtcbiAgICB9XG4gICAgLyogV2UgbmVlZCB0byBoYW5kbGUgaXRlcmF0aW9uIG9mIGRvdWJsZSBieXRlIHN0cmluZ3MgcHJvcGVybHkgKi9cbiAgICBpZiAoaXNBcnJheUxpa2UoaXRlcmFibGUpICYmIHR5cGVvZiBpdGVyYWJsZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgbCA9IGl0ZXJhYmxlLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBjaGFyID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICBpZiAoaSArIDEgPCBsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSA+PSBISUdIX1NVUlJPR0FURV9NSU4gJiYgY29kZSA8PSBISUdIX1NVUlJPR0FURV9NQVgpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhciArPSBpdGVyYWJsZVsrK2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgY2hhciwgaXRlcmFibGUsIGRvQnJlYWspO1xuICAgICAgICAgICAgaWYgKGJyb2tlbikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSBnZXQoaXRlcmFibGUpO1xuICAgICAgICBpZiAoaXRlcmF0b3IpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICB3aGlsZSAoIXJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzQXJnLCByZXN1bHQudmFsdWUsIGl0ZXJhYmxlLCBkb0JyZWFrKTtcbiAgICAgICAgICAgICAgICBpZiAoYnJva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXRlcmF0b3IubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vaXRlcmF0b3IubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL2l0ZXJhdG9yLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xuLyoqXG4gKiBUaGUgc21hbGxlc3QgaW50ZXJ2YWwgYmV0d2VlbiB0d28gcmVwcmVzZW50YWJsZSBudW1iZXJzLlxuICovXG5leHBvcnQgY29uc3QgRVBTSUxPTiA9IDE7XG4vKipcbiAqIFRoZSBtYXhpbXVtIHNhZmUgaW50ZWdlciBpbiBKYXZhU2NyaXB0XG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfU0FGRV9JTlRFR0VSID0gTWF0aC5wb3coMiwgNTMpIC0gMTtcbi8qKlxuICogVGhlIG1pbmltdW0gc2FmZSBpbnRlZ2VyIGluIEphdmFTY3JpcHRcbiAqL1xuZXhwb3J0IGNvbnN0IE1JTl9TQUZFX0lOVEVHRVIgPSAtTUFYX1NBRkVfSU5URUdFUjtcbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXNzZWQgdmFsdWUgaXMgTmFOIHdpdGhvdXQgY29lcnNpb24uXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIE5hTiwgZmFsc2UgaWYgaXQgaXMgbm90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05hTih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGdsb2JhbC5pc05hTih2YWx1ZSk7XG59XG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGFzc2VkIHZhbHVlIGlzIGEgZmluaXRlIG51bWJlciB3aXRob3V0IGNvZXJzaW9uLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBmaW5pdGUsIGZhbHNlIGlmIGl0IGlzIG5vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNGaW5pdGUodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBnbG9iYWwuaXNGaW5pdGUodmFsdWUpO1xufVxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhc3NlZCB2YWx1ZSBpcyBhbiBpbnRlZ2VyLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLCBmYWxzZSBpZiBpdCBpcyBub3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW50ZWdlcih2YWx1ZSkge1xuICAgIHJldHVybiBpc0Zpbml0ZSh2YWx1ZSkgJiYgTWF0aC5mbG9vcih2YWx1ZSkgPT09IHZhbHVlO1xufVxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhc3NlZCB2YWx1ZSBpcyBhbiBpbnRlZ2VyIHRoYXQgaXMgJ3NhZmUsJyBtZWFuaW5nOlxuICogICAxLiBpdCBjYW4gYmUgZXhwcmVzc2VkIGFzIGFuIElFRUUtNzU0IGRvdWJsZSBwcmVjaXNpb24gbnVtYmVyXG4gKiAgIDIuIGl0IGhhcyBhIG9uZS10by1vbmUgbWFwcGluZyB0byBhIG1hdGhlbWF0aWNhbCBpbnRlZ2VyLCBtZWFuaW5nIGl0c1xuICogICAgICBJRUVFLTc1NCByZXByZXNlbnRhdGlvbiBjYW5ub3QgYmUgdGhlIHJlc3VsdCBvZiByb3VuZGluZyBhbnkgb3RoZXJcbiAqICAgICAgaW50ZWdlciB0byBmaXQgdGhlIElFRUUtNzU0IHJlcHJlc2VudGF0aW9uXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGFuIGludGVnZXIsIGZhbHNlIGlmIGl0IGlzIG5vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTYWZlSW50ZWdlcih2YWx1ZSkge1xuICAgIHJldHVybiBpc0ludGVnZXIodmFsdWUpICYmIE1hdGguYWJzKHZhbHVlKSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bnVtYmVyLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL251bWJlci5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vbnVtYmVyLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xuaW1wb3J0IGhhcyBmcm9tICcuL3N1cHBvcnQvaGFzJztcbmltcG9ydCB7IGlzU3ltYm9sIH0gZnJvbSAnLi9TeW1ib2wnO1xuZXhwb3J0IGxldCBhc3NpZ247XG4vKipcbiAqIEdldHMgdGhlIG93biBwcm9wZXJ0eSBkZXNjcmlwdG9yIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LlxuICogQW4gb3duIHByb3BlcnR5IGRlc2NyaXB0b3IgaXMgb25lIHRoYXQgaXMgZGVmaW5lZCBkaXJlY3RseSBvbiB0aGUgb2JqZWN0IGFuZCBpcyBub3RcbiAqIGluaGVyaXRlZCBmcm9tIHRoZSBvYmplY3QncyBwcm90b3R5cGUuXG4gKiBAcGFyYW0gbyBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgcHJvcGVydHkuXG4gKiBAcGFyYW0gcCBOYW1lIG9mIHRoZSBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGxldCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4vKipcbiAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSBvd24gcHJvcGVydGllcyBvZiBhbiBvYmplY3QuIFRoZSBvd24gcHJvcGVydGllcyBvZiBhbiBvYmplY3QgYXJlIHRob3NlIHRoYXQgYXJlIGRlZmluZWQgZGlyZWN0bHlcbiAqIG9uIHRoYXQgb2JqZWN0LCBhbmQgYXJlIG5vdCBpbmhlcml0ZWQgZnJvbSB0aGUgb2JqZWN0J3MgcHJvdG90eXBlLiBUaGUgcHJvcGVydGllcyBvZiBhbiBvYmplY3QgaW5jbHVkZSBib3RoIGZpZWxkcyAob2JqZWN0cykgYW5kIGZ1bmN0aW9ucy5cbiAqIEBwYXJhbSBvIE9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBvd24gcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGxldCBnZXRPd25Qcm9wZXJ0eU5hbWVzO1xuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBzeW1ib2wgcHJvcGVydGllcyBmb3VuZCBkaXJlY3RseSBvbiBvYmplY3Qgby5cbiAqIEBwYXJhbSBvIE9iamVjdCB0byByZXRyaWV2ZSB0aGUgc3ltYm9scyBmcm9tLlxuICovXG5leHBvcnQgbGV0IGdldE93blByb3BlcnR5U3ltYm9scztcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZXMgYXJlIHRoZSBzYW1lIHZhbHVlLCBmYWxzZSBvdGhlcndpc2UuXG4gKiBAcGFyYW0gdmFsdWUxIFRoZSBmaXJzdCB2YWx1ZS5cbiAqIEBwYXJhbSB2YWx1ZTIgVGhlIHNlY29uZCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGxldCBpcztcbi8qKlxuICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydGllcyBhbmQgbWV0aG9kcyBvZiBhbiBvYmplY3QuXG4gKiBAcGFyYW0gbyBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgcHJvcGVydGllcyBhbmQgbWV0aG9kcy4gVGhpcyBjYW4gYmUgYW4gb2JqZWN0IHRoYXQgeW91IGNyZWF0ZWQgb3IgYW4gZXhpc3RpbmcgRG9jdW1lbnQgT2JqZWN0IE1vZGVsIChET00pIG9iamVjdC5cbiAqL1xuZXhwb3J0IGxldCBrZXlzO1xuLyogRVM3IE9iamVjdCBzdGF0aWMgbWV0aG9kcyAqL1xuZXhwb3J0IGxldCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzO1xuZXhwb3J0IGxldCBlbnRyaWVzO1xuZXhwb3J0IGxldCB2YWx1ZXM7XG5pZiAodHJ1ZSkge1xuICAgIGNvbnN0IGdsb2JhbE9iamVjdCA9IGdsb2JhbC5PYmplY3Q7XG4gICAgYXNzaWduID0gZ2xvYmFsT2JqZWN0LmFzc2lnbjtcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBnbG9iYWxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuICAgIGdldE93blByb3BlcnR5TmFtZXMgPSBnbG9iYWxPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcbiAgICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnbG9iYWxPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuICAgIGlzID0gZ2xvYmFsT2JqZWN0LmlzO1xuICAgIGtleXMgPSBnbG9iYWxPYmplY3Qua2V5cztcbn1cbmVsc2Uge1xuICAgIGtleXMgPSBmdW5jdGlvbiBzeW1ib2xBd2FyZUtleXMobykge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMobykuZmlsdGVyKChrZXkpID0+ICFCb29sZWFuKGtleS5tYXRjaCgvXkBALisvKSkpO1xuICAgIH07XG4gICAgYXNzaWduID0gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgLi4uc291cmNlcykge1xuICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFR5cGVFcnJvciBpZiB1bmRlZmluZWQgb3IgbnVsbFxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG8gPSBPYmplY3QodGFyZ2V0KTtcbiAgICAgICAgc291cmNlcy5mb3JFYWNoKChuZXh0U291cmNlKSA9PiB7XG4gICAgICAgICAgICBpZiAobmV4dFNvdXJjZSkge1xuICAgICAgICAgICAgICAgIC8vIFNraXAgb3ZlciBpZiB1bmRlZmluZWQgb3IgbnVsbFxuICAgICAgICAgICAgICAgIGtleXMobmV4dFNvdXJjZSkuZm9yRWFjaCgobmV4dEtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0b1tuZXh0S2V5XSA9IG5leHRTb3VyY2VbbmV4dEtleV07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdG87XG4gICAgfTtcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobywgcHJvcCkge1xuICAgICAgICBpZiAoaXNTeW1ib2wocHJvcCkpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8sIHByb3ApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobywgcHJvcCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKG8pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG8pLmZpbHRlcigoa2V5KSA9PiAhQm9vbGVhbihrZXkubWF0Y2goL15AQC4rLykpKTtcbiAgICB9O1xuICAgIGdldE93blByb3BlcnR5U3ltYm9scyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhvKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvKVxuICAgICAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBCb29sZWFuKGtleS5tYXRjaCgvXkBALisvKSkpXG4gICAgICAgICAgICAubWFwKChrZXkpID0+IFN5bWJvbC5mb3Ioa2V5LnN1YnN0cmluZygyKSkpO1xuICAgIH07XG4gICAgaXMgPSBmdW5jdGlvbiBpcyh2YWx1ZTEsIHZhbHVlMikge1xuICAgICAgICBpZiAodmFsdWUxID09PSB2YWx1ZTIpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTEgIT09IDAgfHwgMSAvIHZhbHVlMSA9PT0gMSAvIHZhbHVlMjsgLy8gLTBcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUxICE9PSB2YWx1ZTEgJiYgdmFsdWUyICE9PSB2YWx1ZTI7IC8vIE5hTlxuICAgIH07XG59XG5pZiAodHJ1ZSkge1xuICAgIGNvbnN0IGdsb2JhbE9iamVjdCA9IGdsb2JhbC5PYmplY3Q7XG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA9IGdsb2JhbE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzO1xuICAgIGVudHJpZXMgPSBnbG9iYWxPYmplY3QuZW50cmllcztcbiAgICB2YWx1ZXMgPSBnbG9iYWxPYmplY3QudmFsdWVzO1xufVxuZWxzZSB7XG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobykge1xuICAgICAgICByZXR1cm4gZ2V0T3duUHJvcGVydHlOYW1lcyhvKS5yZWR1Y2UoKHByZXZpb3VzLCBrZXkpID0+IHtcbiAgICAgICAgICAgIHByZXZpb3VzW2tleV0gPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobywga2V5KTtcbiAgICAgICAgICAgIHJldHVybiBwcmV2aW91cztcbiAgICAgICAgfSwge30pO1xuICAgIH07XG4gICAgZW50cmllcyA9IGZ1bmN0aW9uIGVudHJpZXMobykge1xuICAgICAgICByZXR1cm4ga2V5cyhvKS5tYXAoKGtleSkgPT4gW2tleSwgb1trZXldXSk7XG4gICAgfTtcbiAgICB2YWx1ZXMgPSBmdW5jdGlvbiB2YWx1ZXMobykge1xuICAgICAgICByZXR1cm4ga2V5cyhvKS5tYXAoKGtleSkgPT4gb1trZXldKTtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b2JqZWN0Lm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL29iamVjdC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vb2JqZWN0Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xuaW1wb3J0IGhhcyBmcm9tICcuL3N1cHBvcnQvaGFzJztcbmltcG9ydCB7IHdyYXBOYXRpdmUgfSBmcm9tICcuL3N1cHBvcnQvdXRpbCc7XG4vKipcbiAqIFRoZSBtaW5pbXVtIGxvY2F0aW9uIG9mIGhpZ2ggc3Vycm9nYXRlc1xuICovXG5leHBvcnQgY29uc3QgSElHSF9TVVJST0dBVEVfTUlOID0gMHhkODAwO1xuLyoqXG4gKiBUaGUgbWF4aW11bSBsb2NhdGlvbiBvZiBoaWdoIHN1cnJvZ2F0ZXNcbiAqL1xuZXhwb3J0IGNvbnN0IEhJR0hfU1VSUk9HQVRFX01BWCA9IDB4ZGJmZjtcbi8qKlxuICogVGhlIG1pbmltdW0gbG9jYXRpb24gb2YgbG93IHN1cnJvZ2F0ZXNcbiAqL1xuZXhwb3J0IGNvbnN0IExPV19TVVJST0dBVEVfTUlOID0gMHhkYzAwO1xuLyoqXG4gKiBUaGUgbWF4aW11bSBsb2NhdGlvbiBvZiBsb3cgc3Vycm9nYXRlc1xuICovXG5leHBvcnQgY29uc3QgTE9XX1NVUlJPR0FURV9NQVggPSAweGRmZmY7XG4vKiBFUzYgc3RhdGljIG1ldGhvZHMgKi9cbi8qKlxuICogUmV0dXJuIHRoZSBTdHJpbmcgdmFsdWUgd2hvc2UgZWxlbWVudHMgYXJlLCBpbiBvcmRlciwgdGhlIGVsZW1lbnRzIGluIHRoZSBMaXN0IGVsZW1lbnRzLlxuICogSWYgbGVuZ3RoIGlzIDAsIHRoZSBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuXG4gKiBAcGFyYW0gY29kZVBvaW50cyBUaGUgY29kZSBwb2ludHMgdG8gZ2VuZXJhdGUgdGhlIHN0cmluZ1xuICovXG5leHBvcnQgbGV0IGZyb21Db2RlUG9pbnQ7XG4vKipcbiAqIGByYXdgIGlzIGludGVuZGVkIGZvciB1c2UgYXMgYSB0YWcgZnVuY3Rpb24gb2YgYSBUYWdnZWQgVGVtcGxhdGUgU3RyaW5nLiBXaGVuIGNhbGxlZFxuICogYXMgc3VjaCB0aGUgZmlyc3QgYXJndW1lbnQgd2lsbCBiZSBhIHdlbGwgZm9ybWVkIHRlbXBsYXRlIGNhbGwgc2l0ZSBvYmplY3QgYW5kIHRoZSByZXN0XG4gKiBwYXJhbWV0ZXIgd2lsbCBjb250YWluIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzLlxuICogQHBhcmFtIHRlbXBsYXRlIEEgd2VsbC1mb3JtZWQgdGVtcGxhdGUgc3RyaW5nIGNhbGwgc2l0ZSByZXByZXNlbnRhdGlvbi5cbiAqIEBwYXJhbSBzdWJzdGl0dXRpb25zIEEgc2V0IG9mIHN1YnN0aXR1dGlvbiB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBsZXQgcmF3O1xuLyogRVM2IGluc3RhbmNlIG1ldGhvZHMgKi9cbi8qKlxuICogUmV0dXJucyBhIG5vbm5lZ2F0aXZlIGludGVnZXIgTnVtYmVyIGxlc3MgdGhhbiAxMTE0MTEyICgweDExMDAwMCkgdGhhdCBpcyB0aGUgY29kZSBwb2ludFxuICogdmFsdWUgb2YgdGhlIFVURi0xNiBlbmNvZGVkIGNvZGUgcG9pbnQgc3RhcnRpbmcgYXQgdGhlIHN0cmluZyBlbGVtZW50IGF0IHBvc2l0aW9uIHBvcyBpblxuICogdGhlIFN0cmluZyByZXN1bHRpbmcgZnJvbSBjb252ZXJ0aW5nIHRoaXMgb2JqZWN0IHRvIGEgU3RyaW5nLlxuICogSWYgdGhlcmUgaXMgbm8gZWxlbWVudCBhdCB0aGF0IHBvc2l0aW9uLCB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZC5cbiAqIElmIGEgdmFsaWQgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlyIGRvZXMgbm90IGJlZ2luIGF0IHBvcywgdGhlIHJlc3VsdCBpcyB0aGUgY29kZSB1bml0IGF0IHBvcy5cbiAqL1xuZXhwb3J0IGxldCBjb2RlUG9pbnRBdDtcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXF1ZW5jZSBvZiBlbGVtZW50cyBvZiBzZWFyY2hTdHJpbmcgY29udmVydGVkIHRvIGEgU3RyaW5nIGlzIHRoZVxuICogc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiB0aGlzIG9iamVjdCAoY29udmVydGVkIHRvIGEgU3RyaW5nKSBzdGFydGluZyBhdFxuICogZW5kUG9zaXRpb24g4oCTIGxlbmd0aCh0aGlzKS4gT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuXG4gKi9cbmV4cG9ydCBsZXQgZW5kc1dpdGg7XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBzZWFyY2hTdHJpbmcgYXBwZWFycyBhcyBhIHN1YnN0cmluZyBvZiB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhpc1xuICogb2JqZWN0IHRvIGEgU3RyaW5nLCBhdCBvbmUgb3IgbW9yZSBwb3NpdGlvbnMgdGhhdCBhcmVcbiAqIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBwb3NpdGlvbjsgb3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlLlxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHN0cmluZ1xuICogQHBhcmFtIHNlYXJjaFN0cmluZyBzZWFyY2ggc3RyaW5nXG4gKiBAcGFyYW0gcG9zaXRpb24gSWYgcG9zaXRpb24gaXMgdW5kZWZpbmVkLCAwIGlzIGFzc3VtZWQsIHNvIGFzIHRvIHNlYXJjaCBhbGwgb2YgdGhlIFN0cmluZy5cbiAqL1xuZXhwb3J0IGxldCBpbmNsdWRlcztcbi8qKlxuICogUmV0dXJucyB0aGUgU3RyaW5nIHZhbHVlIHJlc3VsdCBvZiBub3JtYWxpemluZyB0aGUgc3RyaW5nIGludG8gdGhlIG5vcm1hbGl6YXRpb24gZm9ybVxuICogbmFtZWQgYnkgZm9ybSBhcyBzcGVjaWZpZWQgaW4gVW5pY29kZSBTdGFuZGFyZCBBbm5leCAjMTUsIFVuaWNvZGUgTm9ybWFsaXphdGlvbiBGb3Jtcy5cbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBzdHJpbmdcbiAqIEBwYXJhbSBmb3JtIEFwcGxpY2FibGUgdmFsdWVzOiBcIk5GQ1wiLCBcIk5GRFwiLCBcIk5GS0NcIiwgb3IgXCJORktEXCIsIElmIG5vdCBzcGVjaWZpZWQgZGVmYXVsdFxuICogaXMgXCJORkNcIlxuICovXG5leHBvcnQgbGV0IG5vcm1hbGl6ZTtcbi8qKlxuICogUmV0dXJucyBhIFN0cmluZyB2YWx1ZSB0aGF0IGlzIG1hZGUgZnJvbSBjb3VudCBjb3BpZXMgYXBwZW5kZWQgdG9nZXRoZXIuIElmIGNvdW50IGlzIDAsXG4gKiBUIGlzIHRoZSBlbXB0eSBTdHJpbmcgaXMgcmV0dXJuZWQuXG4gKiBAcGFyYW0gY291bnQgbnVtYmVyIG9mIGNvcGllcyB0byBhcHBlbmRcbiAqL1xuZXhwb3J0IGxldCByZXBlYXQ7XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VxdWVuY2Ugb2YgZWxlbWVudHMgb2Ygc2VhcmNoU3RyaW5nIGNvbnZlcnRlZCB0byBhIFN0cmluZyBpcyB0aGVcbiAqIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgdGhpcyBvYmplY3QgKGNvbnZlcnRlZCB0byBhIFN0cmluZykgc3RhcnRpbmcgYXRcbiAqIHBvc2l0aW9uLiBPdGhlcndpc2UgcmV0dXJucyBmYWxzZS5cbiAqL1xuZXhwb3J0IGxldCBzdGFydHNXaXRoO1xuLyogRVM3IGluc3RhbmNlIG1ldGhvZHMgKi9cbi8qKlxuICogUGFkcyB0aGUgY3VycmVudCBzdHJpbmcgd2l0aCBhIGdpdmVuIHN0cmluZyAocG9zc2libHkgcmVwZWF0ZWQpIHNvIHRoYXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgcmVhY2hlcyBhIGdpdmVuIGxlbmd0aC5cbiAqIFRoZSBwYWRkaW5nIGlzIGFwcGxpZWQgZnJvbSB0aGUgZW5kIChyaWdodCkgb2YgdGhlIGN1cnJlbnQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBzdHJpbmdcbiAqIEBwYXJhbSBtYXhMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZyBvbmNlIHRoZSBjdXJyZW50IHN0cmluZyBoYXMgYmVlbiBwYWRkZWQuXG4gKiAgICAgICAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgc21hbGxlciB0aGFuIHRoZSBjdXJyZW50IHN0cmluZydzIGxlbmd0aCwgdGhlIGN1cnJlbnQgc3RyaW5nIHdpbGwgYmUgcmV0dXJuZWQgYXMgaXQgaXMuXG4gKlxuICogQHBhcmFtIGZpbGxTdHJpbmcgVGhlIHN0cmluZyB0byBwYWQgdGhlIGN1cnJlbnQgc3RyaW5nIHdpdGguXG4gKiAgICAgICAgSWYgdGhpcyBzdHJpbmcgaXMgdG9vIGxvbmcsIGl0IHdpbGwgYmUgdHJ1bmNhdGVkIGFuZCB0aGUgbGVmdC1tb3N0IHBhcnQgd2lsbCBiZSBhcHBsaWVkLlxuICogICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciBpcyBcIiBcIiAoVSswMDIwKS5cbiAqL1xuZXhwb3J0IGxldCBwYWRFbmQ7XG4vKipcbiAqIFBhZHMgdGhlIGN1cnJlbnQgc3RyaW5nIHdpdGggYSBnaXZlbiBzdHJpbmcgKHBvc3NpYmx5IHJlcGVhdGVkKSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgc3RyaW5nIHJlYWNoZXMgYSBnaXZlbiBsZW5ndGguXG4gKiBUaGUgcGFkZGluZyBpcyBhcHBsaWVkIGZyb20gdGhlIHN0YXJ0IChsZWZ0KSBvZiB0aGUgY3VycmVudCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHN0cmluZ1xuICogQHBhcmFtIG1heExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nIG9uY2UgdGhlIGN1cnJlbnQgc3RyaW5nIGhhcyBiZWVuIHBhZGRlZC5cbiAqICAgICAgICBJZiB0aGlzIHBhcmFtZXRlciBpcyBzbWFsbGVyIHRoYW4gdGhlIGN1cnJlbnQgc3RyaW5nJ3MgbGVuZ3RoLCB0aGUgY3VycmVudCBzdHJpbmcgd2lsbCBiZSByZXR1cm5lZCBhcyBpdCBpcy5cbiAqXG4gKiBAcGFyYW0gZmlsbFN0cmluZyBUaGUgc3RyaW5nIHRvIHBhZCB0aGUgY3VycmVudCBzdHJpbmcgd2l0aC5cbiAqICAgICAgICBJZiB0aGlzIHN0cmluZyBpcyB0b28gbG9uZywgaXQgd2lsbCBiZSB0cnVuY2F0ZWQgYW5kIHRoZSBsZWZ0LW1vc3QgcGFydCB3aWxsIGJlIGFwcGxpZWQuXG4gKiAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlzIFwiIFwiIChVKzAwMjApLlxuICovXG5leHBvcnQgbGV0IHBhZFN0YXJ0O1xuaWYgKHRydWUgJiYgdHJ1ZSkge1xuICAgIGZyb21Db2RlUG9pbnQgPSBnbG9iYWwuU3RyaW5nLmZyb21Db2RlUG9pbnQ7XG4gICAgcmF3ID0gZ2xvYmFsLlN0cmluZy5yYXc7XG4gICAgY29kZVBvaW50QXQgPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0KTtcbiAgICBlbmRzV2l0aCA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUuZW5kc1dpdGgpO1xuICAgIGluY2x1ZGVzID0gd3JhcE5hdGl2ZShnbG9iYWwuU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlcyk7XG4gICAgbm9ybWFsaXplID0gd3JhcE5hdGl2ZShnbG9iYWwuU3RyaW5nLnByb3RvdHlwZS5ub3JtYWxpemUpO1xuICAgIHJlcGVhdCA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUucmVwZWF0KTtcbiAgICBzdGFydHNXaXRoID0gd3JhcE5hdGl2ZShnbG9iYWwuU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoKTtcbn1cbmVsc2Uge1xuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlcyB0aGF0IHRleHQgaXMgZGVmaW5lZCwgYW5kIG5vcm1hbGl6ZXMgcG9zaXRpb24gKGJhc2VkIG9uIHRoZSBnaXZlbiBkZWZhdWx0IGlmIHRoZSBpbnB1dCBpcyBOYU4pLlxuICAgICAqIFVzZWQgYnkgc3RhcnRzV2l0aCwgaW5jbHVkZXMsIGFuZCBlbmRzV2l0aC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gTm9ybWFsaXplZCBwb3NpdGlvbi5cbiAgICAgKi9cbiAgICBjb25zdCBub3JtYWxpemVTdWJzdHJpbmdBcmdzID0gZnVuY3Rpb24gKG5hbWUsIHRleHQsIHNlYXJjaCwgcG9zaXRpb24sIGlzRW5kID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RyaW5nLicgKyBuYW1lICsgJyByZXF1aXJlcyBhIHZhbGlkIHN0cmluZyB0byBzZWFyY2ggYWdhaW5zdC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsZW5ndGggPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiAhPT0gcG9zaXRpb24gPyAoaXNFbmQgPyBsZW5ndGggOiAwKSA6IHBvc2l0aW9uO1xuICAgICAgICByZXR1cm4gW3RleHQsIFN0cmluZyhzZWFyY2gpLCBNYXRoLm1pbihNYXRoLm1heChwb3NpdGlvbiwgMCksIGxlbmd0aCldO1xuICAgIH07XG4gICAgZnJvbUNvZGVQb2ludCA9IGZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoLi4uY29kZVBvaW50cykge1xuICAgICAgICAvLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL21hdGhpYXNieW5lbnMvU3RyaW5nLmZyb21Db2RlUG9pbnRcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xuICAgICAgICBjb25zdCBNQVhfU0laRSA9IDB4NDAwMDtcbiAgICAgICAgbGV0IGNvZGVVbml0cyA9IFtdO1xuICAgICAgICBsZXQgaW5kZXggPSAtMTtcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGNvZGVQb2ludCA9IE51bWJlcihhcmd1bWVudHNbaW5kZXhdKTtcbiAgICAgICAgICAgIC8vIENvZGUgcG9pbnRzIG11c3QgYmUgZmluaXRlIGludGVnZXJzIHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2VcbiAgICAgICAgICAgIGxldCBpc1ZhbGlkID0gaXNGaW5pdGUoY29kZVBvaW50KSAmJiBNYXRoLmZsb29yKGNvZGVQb2ludCkgPT09IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPj0gMCAmJiBjb2RlUG9pbnQgPD0gMHgxMGZmZmY7XG4gICAgICAgICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBSYW5nZUVycm9yKCdzdHJpbmcuZnJvbUNvZGVQb2ludDogSW52YWxpZCBjb2RlIHBvaW50ICcgKyBjb2RlUG9pbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA8PSAweGZmZmYpIHtcbiAgICAgICAgICAgICAgICAvLyBCTVAgY29kZSBwb2ludFxuICAgICAgICAgICAgICAgIGNvZGVVbml0cy5wdXNoKGNvZGVQb2ludCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBBc3RyYWwgY29kZSBwb2ludDsgc3BsaXQgaW4gc3Vycm9nYXRlIGhhbHZlc1xuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nI3N1cnJvZ2F0ZS1mb3JtdWxhZVxuICAgICAgICAgICAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwO1xuICAgICAgICAgICAgICAgIGxldCBoaWdoU3Vycm9nYXRlID0gKGNvZGVQb2ludCA+PiAxMCkgKyBISUdIX1NVUlJPR0FURV9NSU47XG4gICAgICAgICAgICAgICAgbGV0IGxvd1N1cnJvZ2F0ZSA9IGNvZGVQb2ludCAlIDB4NDAwICsgTE9XX1NVUlJPR0FURV9NSU47XG4gICAgICAgICAgICAgICAgY29kZVVuaXRzLnB1c2goaGlnaFN1cnJvZ2F0ZSwgbG93U3Vycm9nYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbmRleCArIDEgPT09IGxlbmd0aCB8fCBjb2RlVW5pdHMubGVuZ3RoID4gTUFYX1NJWkUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGNvZGVVbml0cyk7XG4gICAgICAgICAgICAgICAgY29kZVVuaXRzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIHJhdyA9IGZ1bmN0aW9uIHJhdyhjYWxsU2l0ZSwgLi4uc3Vic3RpdHV0aW9ucykge1xuICAgICAgICBsZXQgcmF3U3RyaW5ncyA9IGNhbGxTaXRlLnJhdztcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICBsZXQgbnVtU3Vic3RpdHV0aW9ucyA9IHN1YnN0aXR1dGlvbnMubGVuZ3RoO1xuICAgICAgICBpZiAoY2FsbFNpdGUgPT0gbnVsbCB8fCBjYWxsU2l0ZS5yYXcgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RyaW5nLnJhdyByZXF1aXJlcyBhIHZhbGlkIGNhbGxTaXRlIG9iamVjdCB3aXRoIGEgcmF3IHZhbHVlJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IHJhd1N0cmluZ3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSByYXdTdHJpbmdzW2ldICsgKGkgPCBudW1TdWJzdGl0dXRpb25zICYmIGkgPCBsZW5ndGggLSAxID8gc3Vic3RpdHV0aW9uc1tpXSA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgY29kZVBvaW50QXQgPSBmdW5jdGlvbiBjb2RlUG9pbnRBdCh0ZXh0LCBwb3NpdGlvbiA9IDApIHtcbiAgICAgICAgLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXRcbiAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RyaW5nLmNvZGVQb2ludEF0IHJlcXVyaWVzIGEgdmFsaWQgc3RyaW5nLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRleHQubGVuZ3RoO1xuICAgICAgICBpZiAocG9zaXRpb24gIT09IHBvc2l0aW9uKSB7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+PSBsZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gR2V0IHRoZSBmaXJzdCBjb2RlIHVuaXRcbiAgICAgICAgY29uc3QgZmlyc3QgPSB0ZXh0LmNoYXJDb2RlQXQocG9zaXRpb24pO1xuICAgICAgICBpZiAoZmlyc3QgPj0gSElHSF9TVVJST0dBVEVfTUlOICYmIGZpcnN0IDw9IEhJR0hfU1VSUk9HQVRFX01BWCAmJiBsZW5ndGggPiBwb3NpdGlvbiArIDEpIHtcbiAgICAgICAgICAgIC8vIFN0YXJ0IG9mIGEgc3Vycm9nYXRlIHBhaXIgKGhpZ2ggc3Vycm9nYXRlIGFuZCB0aGVyZSBpcyBhIG5leHQgY29kZSB1bml0KTsgY2hlY2sgZm9yIGxvdyBzdXJyb2dhdGVcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nI3N1cnJvZ2F0ZS1mb3JtdWxhZVxuICAgICAgICAgICAgY29uc3Qgc2Vjb25kID0gdGV4dC5jaGFyQ29kZUF0KHBvc2l0aW9uICsgMSk7XG4gICAgICAgICAgICBpZiAoc2Vjb25kID49IExPV19TVVJST0dBVEVfTUlOICYmIHNlY29uZCA8PSBMT1dfU1VSUk9HQVRFX01BWCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoZmlyc3QgLSBISUdIX1NVUlJPR0FURV9NSU4pICogMHg0MDAgKyBzZWNvbmQgLSBMT1dfU1VSUk9HQVRFX01JTiArIDB4MTAwMDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpcnN0O1xuICAgIH07XG4gICAgZW5kc1dpdGggPSBmdW5jdGlvbiBlbmRzV2l0aCh0ZXh0LCBzZWFyY2gsIGVuZFBvc2l0aW9uKSB7XG4gICAgICAgIGlmIChlbmRQb3NpdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICBlbmRQb3NpdGlvbiA9IHRleHQubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIFt0ZXh0LCBzZWFyY2gsIGVuZFBvc2l0aW9uXSA9IG5vcm1hbGl6ZVN1YnN0cmluZ0FyZ3MoJ2VuZHNXaXRoJywgdGV4dCwgc2VhcmNoLCBlbmRQb3NpdGlvbiwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gZW5kUG9zaXRpb24gLSBzZWFyY2gubGVuZ3RoO1xuICAgICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQuc2xpY2Uoc3RhcnQsIGVuZFBvc2l0aW9uKSA9PT0gc2VhcmNoO1xuICAgIH07XG4gICAgaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyh0ZXh0LCBzZWFyY2gsIHBvc2l0aW9uID0gMCkge1xuICAgICAgICBbdGV4dCwgc2VhcmNoLCBwb3NpdGlvbl0gPSBub3JtYWxpemVTdWJzdHJpbmdBcmdzKCdpbmNsdWRlcycsIHRleHQsIHNlYXJjaCwgcG9zaXRpb24pO1xuICAgICAgICByZXR1cm4gdGV4dC5pbmRleE9mKHNlYXJjaCwgcG9zaXRpb24pICE9PSAtMTtcbiAgICB9O1xuICAgIHJlcGVhdCA9IGZ1bmN0aW9uIHJlcGVhdCh0ZXh0LCBjb3VudCA9IDApIHtcbiAgICAgICAgLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUucmVwZWF0XG4gICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmluZy5yZXBlYXQgcmVxdWlyZXMgYSB2YWxpZCBzdHJpbmcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvdW50ICE9PSBjb3VudCkge1xuICAgICAgICAgICAgY291bnQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3VudCA8IDAgfHwgY291bnQgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc3RyaW5nLnJlcGVhdCByZXF1aXJlcyBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgY291bnQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICB3aGlsZSAoY291bnQpIHtcbiAgICAgICAgICAgIGlmIChjb3VudCAlIDIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gdGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb3VudCA+IDEpIHtcbiAgICAgICAgICAgICAgICB0ZXh0ICs9IHRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb3VudCA+Pj0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgc3RhcnRzV2l0aCA9IGZ1bmN0aW9uIHN0YXJ0c1dpdGgodGV4dCwgc2VhcmNoLCBwb3NpdGlvbiA9IDApIHtcbiAgICAgICAgc2VhcmNoID0gU3RyaW5nKHNlYXJjaCk7XG4gICAgICAgIFt0ZXh0LCBzZWFyY2gsIHBvc2l0aW9uXSA9IG5vcm1hbGl6ZVN1YnN0cmluZ0FyZ3MoJ3N0YXJ0c1dpdGgnLCB0ZXh0LCBzZWFyY2gsIHBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgZW5kID0gcG9zaXRpb24gKyBzZWFyY2gubGVuZ3RoO1xuICAgICAgICBpZiAoZW5kID4gdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dC5zbGljZShwb3NpdGlvbiwgZW5kKSA9PT0gc2VhcmNoO1xuICAgIH07XG59XG5pZiAodHJ1ZSkge1xuICAgIHBhZEVuZCA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUucGFkRW5kKTtcbiAgICBwYWRTdGFydCA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUucGFkU3RhcnQpO1xufVxuZWxzZSB7XG4gICAgcGFkRW5kID0gZnVuY3Rpb24gcGFkRW5kKHRleHQsIG1heExlbmd0aCwgZmlsbFN0cmluZyA9ICcgJykge1xuICAgICAgICBpZiAodGV4dCA9PT0gbnVsbCB8fCB0ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmluZy5yZXBlYXQgcmVxdWlyZXMgYSB2YWxpZCBzdHJpbmcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heExlbmd0aCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdzdHJpbmcucGFkRW5kIHJlcXVpcmVzIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSBjb3VudC4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4TGVuZ3RoID09PSBudWxsIHx8IG1heExlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IG1heExlbmd0aCA8IDApIHtcbiAgICAgICAgICAgIG1heExlbmd0aCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0clRleHQgPSBTdHJpbmcodGV4dCk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmcgPSBtYXhMZW5ndGggLSBzdHJUZXh0Lmxlbmd0aDtcbiAgICAgICAgaWYgKHBhZGRpbmcgPiAwKSB7XG4gICAgICAgICAgICBzdHJUZXh0ICs9XG4gICAgICAgICAgICAgICAgcmVwZWF0KGZpbGxTdHJpbmcsIE1hdGguZmxvb3IocGFkZGluZyAvIGZpbGxTdHJpbmcubGVuZ3RoKSkgK1xuICAgICAgICAgICAgICAgICAgICBmaWxsU3RyaW5nLnNsaWNlKDAsIHBhZGRpbmcgJSBmaWxsU3RyaW5nLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0clRleHQ7XG4gICAgfTtcbiAgICBwYWRTdGFydCA9IGZ1bmN0aW9uIHBhZFN0YXJ0KHRleHQsIG1heExlbmd0aCwgZmlsbFN0cmluZyA9ICcgJykge1xuICAgICAgICBpZiAodGV4dCA9PT0gbnVsbCB8fCB0ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmluZy5yZXBlYXQgcmVxdWlyZXMgYSB2YWxpZCBzdHJpbmcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heExlbmd0aCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdzdHJpbmcucGFkU3RhcnQgcmVxdWlyZXMgYSBub24tbmVnYXRpdmUgZmluaXRlIGNvdW50LicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXhMZW5ndGggPT09IG51bGwgfHwgbWF4TGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbWF4TGVuZ3RoIDwgMCkge1xuICAgICAgICAgICAgbWF4TGVuZ3RoID0gMDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RyVGV4dCA9IFN0cmluZyh0ZXh0KTtcbiAgICAgICAgY29uc3QgcGFkZGluZyA9IG1heExlbmd0aCAtIHN0clRleHQubGVuZ3RoO1xuICAgICAgICBpZiAocGFkZGluZyA+IDApIHtcbiAgICAgICAgICAgIHN0clRleHQgPVxuICAgICAgICAgICAgICAgIHJlcGVhdChmaWxsU3RyaW5nLCBNYXRoLmZsb29yKHBhZGRpbmcgLyBmaWxsU3RyaW5nLmxlbmd0aCkpICtcbiAgICAgICAgICAgICAgICAgICAgZmlsbFN0cmluZy5zbGljZSgwLCBwYWRkaW5nICUgZmlsbFN0cmluZy5sZW5ndGgpICtcbiAgICAgICAgICAgICAgICAgICAgc3RyVGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyVGV4dDtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5nLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL3N0cmluZy5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vc3RyaW5nLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBoYXMsIHsgYWRkIH0gZnJvbSAnQGRvam8vaGFzL2hhcyc7XG5pbXBvcnQgZ2xvYmFsIGZyb20gJy4uL2dsb2JhbCc7XG5leHBvcnQgZGVmYXVsdCBoYXM7XG5leHBvcnQgKiBmcm9tICdAZG9qby9oYXMvaGFzJztcbi8qIEVDTUFTY3JpcHQgNiBhbmQgNyBGZWF0dXJlcyAqL1xuLyogQXJyYXkgKi9cbmFkZCgnZXM2LWFycmF5JywgKCkgPT4ge1xuICAgIHJldHVybiAoWydmcm9tJywgJ29mJ10uZXZlcnkoKGtleSkgPT4ga2V5IGluIGdsb2JhbC5BcnJheSkgJiZcbiAgICAgICAgWydmaW5kSW5kZXgnLCAnZmluZCcsICdjb3B5V2l0aGluJ10uZXZlcnkoKGtleSkgPT4ga2V5IGluIGdsb2JhbC5BcnJheS5wcm90b3R5cGUpKTtcbn0sIHRydWUpO1xuYWRkKCdlczYtYXJyYXktZmlsbCcsICgpID0+IHtcbiAgICBpZiAoJ2ZpbGwnIGluIGdsb2JhbC5BcnJheS5wcm90b3R5cGUpIHtcbiAgICAgICAgLyogU29tZSB2ZXJzaW9ucyBvZiBTYWZhcmkgZG8gbm90IHByb3Blcmx5IGltcGxlbWVudCB0aGlzICovXG4gICAgICAgIHJldHVybiBbMV0uZmlsbCg5LCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpWzBdID09PSAxO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59LCB0cnVlKTtcbmFkZCgnZXM3LWFycmF5JywgKCkgPT4gJ2luY2x1ZGVzJyBpbiBnbG9iYWwuQXJyYXkucHJvdG90eXBlLCB0cnVlKTtcbi8qIE1hcCAqL1xuYWRkKCdlczYtbWFwJywgKCkgPT4ge1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsLk1hcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvKlxuICAgIElFMTEgYW5kIG9sZGVyIHZlcnNpb25zIG9mIFNhZmFyaSBhcmUgbWlzc2luZyBjcml0aWNhbCBFUzYgTWFwIGZ1bmN0aW9uYWxpdHlcbiAgICBXZSB3cmFwIHRoaXMgaW4gYSB0cnkvY2F0Y2ggYmVjYXVzZSBzb21ldGltZXMgdGhlIE1hcCBjb25zdHJ1Y3RvciBleGlzdHMsIGJ1dCBkb2VzIG5vdFxuICAgIHRha2UgYXJndW1lbnRzIChpT1MgOC40KVxuICAgICAqL1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbWFwID0gbmV3IGdsb2JhbC5NYXAoW1swLCAxXV0pO1xuICAgICAgICAgICAgcmV0dXJuIG1hcC5oYXMoMCkgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgbWFwLmtleXMgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgICAgICAgICB0cnVlICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIG1hcC52YWx1ZXMgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgbWFwLmVudHJpZXMgPT09ICdmdW5jdGlvbic7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBub3QgdGVzdGluZyBvbiBpT1MgYXQgdGhlIG1vbWVudCAqL1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn0sIHRydWUpO1xuLyogTWF0aCAqL1xuYWRkKCdlczYtbWF0aCcsICgpID0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgICAnY2x6MzInLFxuICAgICAgICAnc2lnbicsXG4gICAgICAgICdsb2cxMCcsXG4gICAgICAgICdsb2cyJyxcbiAgICAgICAgJ2xvZzFwJyxcbiAgICAgICAgJ2V4cG0xJyxcbiAgICAgICAgJ2Nvc2gnLFxuICAgICAgICAnc2luaCcsXG4gICAgICAgICd0YW5oJyxcbiAgICAgICAgJ2Fjb3NoJyxcbiAgICAgICAgJ2FzaW5oJyxcbiAgICAgICAgJ2F0YW5oJyxcbiAgICAgICAgJ3RydW5jJyxcbiAgICAgICAgJ2Zyb3VuZCcsXG4gICAgICAgICdjYnJ0JyxcbiAgICAgICAgJ2h5cG90J1xuICAgIF0uZXZlcnkoKG5hbWUpID0+IHR5cGVvZiBnbG9iYWwuTWF0aFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJyk7XG59LCB0cnVlKTtcbmFkZCgnZXM2LW1hdGgtaW11bCcsICgpID0+IHtcbiAgICBpZiAoJ2ltdWwnIGluIGdsb2JhbC5NYXRoKSB7XG4gICAgICAgIC8qIFNvbWUgdmVyc2lvbnMgb2YgU2FmYXJpIG9uIGlvcyBkbyBub3QgcHJvcGVybHkgaW1wbGVtZW50IHRoaXMgKi9cbiAgICAgICAgcmV0dXJuIE1hdGguaW11bCgweGZmZmZmZmZmLCA1KSA9PT0gLTU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn0sIHRydWUpO1xuLyogT2JqZWN0ICovXG5hZGQoJ2VzNi1vYmplY3QnLCAoKSA9PiB7XG4gICAgcmV0dXJuIHRydWUgJiZcbiAgICAgICAgWydhc3NpZ24nLCAnaXMnLCAnZ2V0T3duUHJvcGVydHlTeW1ib2xzJywgJ3NldFByb3RvdHlwZU9mJ10uZXZlcnkoKG5hbWUpID0+IHR5cGVvZiBnbG9iYWwuT2JqZWN0W25hbWVdID09PSAnZnVuY3Rpb24nKTtcbn0sIHRydWUpO1xuYWRkKCdlczIwMTctb2JqZWN0JywgKCkgPT4ge1xuICAgIHJldHVybiBbJ3ZhbHVlcycsICdlbnRyaWVzJywgJ2dldE93blByb3BlcnR5RGVzY3JpcHRvcnMnXS5ldmVyeSgobmFtZSkgPT4gdHlwZW9mIGdsb2JhbC5PYmplY3RbbmFtZV0gPT09ICdmdW5jdGlvbicpO1xufSwgdHJ1ZSk7XG4vKiBPYnNlcnZhYmxlICovXG5hZGQoJ2VzLW9ic2VydmFibGUnLCAoKSA9PiB0eXBlb2YgZ2xvYmFsLk9ic2VydmFibGUgIT09ICd1bmRlZmluZWQnLCB0cnVlKTtcbi8qIFByb21pc2UgKi9cbmFkZCgnZXM2LXByb21pc2UnLCAoKSA9PiB0eXBlb2YgZ2xvYmFsLlByb21pc2UgIT09ICd1bmRlZmluZWQnICYmIHRydWUsIHRydWUpO1xuLyogU2V0ICovXG5hZGQoJ2VzNi1zZXQnLCAoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBnbG9iYWwuU2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8qIElFMTEgYW5kIG9sZGVyIHZlcnNpb25zIG9mIFNhZmFyaSBhcmUgbWlzc2luZyBjcml0aWNhbCBFUzYgU2V0IGZ1bmN0aW9uYWxpdHkgKi9cbiAgICAgICAgY29uc3Qgc2V0ID0gbmV3IGdsb2JhbC5TZXQoWzFdKTtcbiAgICAgICAgcmV0dXJuIHNldC5oYXMoMSkgJiYgJ2tleXMnIGluIHNldCAmJiB0eXBlb2Ygc2V0LmtleXMgPT09ICdmdW5jdGlvbicgJiYgdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufSwgdHJ1ZSk7XG4vKiBTdHJpbmcgKi9cbmFkZCgnZXM2LXN0cmluZycsICgpID0+IHtcbiAgICByZXR1cm4gKFtcbiAgICAgICAgLyogc3RhdGljIG1ldGhvZHMgKi9cbiAgICAgICAgJ2Zyb21Db2RlUG9pbnQnXG4gICAgXS5ldmVyeSgoa2V5KSA9PiB0eXBlb2YgZ2xvYmFsLlN0cmluZ1trZXldID09PSAnZnVuY3Rpb24nKSAmJlxuICAgICAgICBbXG4gICAgICAgICAgICAvKiBpbnN0YW5jZSBtZXRob2RzICovXG4gICAgICAgICAgICAnY29kZVBvaW50QXQnLFxuICAgICAgICAgICAgJ25vcm1hbGl6ZScsXG4gICAgICAgICAgICAncmVwZWF0JyxcbiAgICAgICAgICAgICdzdGFydHNXaXRoJyxcbiAgICAgICAgICAgICdlbmRzV2l0aCcsXG4gICAgICAgICAgICAnaW5jbHVkZXMnXG4gICAgICAgIF0uZXZlcnkoKGtleSkgPT4gdHlwZW9mIGdsb2JhbC5TdHJpbmcucHJvdG90eXBlW2tleV0gPT09ICdmdW5jdGlvbicpKTtcbn0sIHRydWUpO1xuYWRkKCdlczYtc3RyaW5nLXJhdycsICgpID0+IHtcbiAgICBmdW5jdGlvbiBnZXRDYWxsU2l0ZShjYWxsU2l0ZSwgLi4uc3Vic3RpdHV0aW9ucykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbLi4uY2FsbFNpdGVdO1xuICAgICAgICByZXN1bHQucmF3ID0gY2FsbFNpdGUucmF3O1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBpZiAoJ3JhdycgaW4gZ2xvYmFsLlN0cmluZykge1xuICAgICAgICBsZXQgYiA9IDE7XG4gICAgICAgIGxldCBjYWxsU2l0ZSA9IGdldENhbGxTaXRlIGBhXFxuJHtifWA7XG4gICAgICAgIGNhbGxTaXRlLnJhdyA9IFsnYVxcXFxuJ107XG4gICAgICAgIGNvbnN0IHN1cHBvcnRzVHJ1bmMgPSBnbG9iYWwuU3RyaW5nLnJhdyhjYWxsU2l0ZSwgNDIpID09PSAnYTpcXFxcbic7XG4gICAgICAgIHJldHVybiBzdXBwb3J0c1RydW5jO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59LCB0cnVlKTtcbmFkZCgnZXMyMDE3LXN0cmluZycsICgpID0+IHtcbiAgICByZXR1cm4gWydwYWRTdGFydCcsICdwYWRFbmQnXS5ldmVyeSgoa2V5KSA9PiB0eXBlb2YgZ2xvYmFsLlN0cmluZy5wcm90b3R5cGVba2V5XSA9PT0gJ2Z1bmN0aW9uJyk7XG59LCB0cnVlKTtcbi8qIFN5bWJvbCAqL1xuYWRkKCdlczYtc3ltYm9sJywgKCkgPT4gdHlwZW9mIGdsb2JhbC5TeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBTeW1ib2woKSA9PT0gJ3N5bWJvbCcsIHRydWUpO1xuLyogV2Vha01hcCAqL1xuYWRkKCdlczYtd2Vha21hcCcsICgpID0+IHtcbiAgICBpZiAodHlwZW9mIGdsb2JhbC5XZWFrTWFwICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvKiBJRTExIGFuZCBvbGRlciB2ZXJzaW9ucyBvZiBTYWZhcmkgYXJlIG1pc3NpbmcgY3JpdGljYWwgRVM2IE1hcCBmdW5jdGlvbmFsaXR5ICovXG4gICAgICAgIGNvbnN0IGtleTEgPSB7fTtcbiAgICAgICAgY29uc3Qga2V5MiA9IHt9O1xuICAgICAgICBjb25zdCBtYXAgPSBuZXcgZ2xvYmFsLldlYWtNYXAoW1trZXkxLCAxXV0pO1xuICAgICAgICBPYmplY3QuZnJlZXplKGtleTEpO1xuICAgICAgICByZXR1cm4gbWFwLmdldChrZXkxKSA9PT0gMSAmJiBtYXAuc2V0KGtleTIsIDIpID09PSBtYXAgJiYgdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufSwgdHJ1ZSk7XG4vKiBNaXNjZWxsYW5lb3VzIGZlYXR1cmVzICovXG5hZGQoJ21pY3JvdGFza3MnLCAoKSA9PiB0cnVlIHx8IGZhbHNlIHx8IHRydWUsIHRydWUpO1xuYWRkKCdwb3N0bWVzc2FnZScsICgpID0+IHtcbiAgICAvLyBJZiB3aW5kb3cgaXMgdW5kZWZpbmVkLCBhbmQgd2UgaGF2ZSBwb3N0TWVzc2FnZSwgaXQgcHJvYmFibHkgbWVhbnMgd2UncmUgaW4gYSB3ZWIgd29ya2VyLiBXZWIgd29ya2VycyBoYXZlXG4gICAgLy8gcG9zdCBtZXNzYWdlIGJ1dCBpdCBkb2Vzbid0IHdvcmsgaG93IHdlIGV4cGVjdCBpdCB0bywgc28gaXQncyBiZXN0IGp1c3QgdG8gcHJldGVuZCBpdCBkb2Vzbid0IGV4aXN0LlxuICAgIHJldHVybiB0eXBlb2YgZ2xvYmFsLndpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGdsb2JhbC5wb3N0TWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJztcbn0sIHRydWUpO1xuYWRkKCdyYWYnLCAoKSA9PiB0eXBlb2YgZ2xvYmFsLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJywgdHJ1ZSk7XG5hZGQoJ3NldGltbWVkaWF0ZScsICgpID0+IHR5cGVvZiBnbG9iYWwuc2V0SW1tZWRpYXRlICE9PSAndW5kZWZpbmVkJywgdHJ1ZSk7XG4vKiBET00gRmVhdHVyZXMgKi9cbmFkZCgnZG9tLW11dGF0aW9ub2JzZXJ2ZXInLCAoKSA9PiB7XG4gICAgaWYgKHRydWUgJiYgQm9vbGVhbihnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcikpIHtcbiAgICAgICAgLy8gSUUxMSBoYXMgYW4gdW5yZWxpYWJsZSBNdXRhdGlvbk9ic2VydmVyIGltcGxlbWVudGF0aW9uIHdoZXJlIHNldFByb3BlcnR5KCkgZG9lcyBub3RcbiAgICAgICAgLy8gZ2VuZXJhdGUgYSBtdXRhdGlvbiBldmVudCwgb2JzZXJ2ZXJzIGNhbiBjcmFzaCwgYW5kIHRoZSBxdWV1ZSBkb2VzIG5vdCBkcmFpblxuICAgICAgICAvLyByZWxpYWJseS4gVGhlIGZvbGxvd2luZyBmZWF0dXJlIHRlc3Qgd2FzIGFkYXB0ZWQgZnJvbVxuICAgICAgICAvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS90MTBrby80YWNlYjhjNzE2ODFmZGIyNzVlMzNlZmU1ZTU3NmIxNFxuICAgICAgICBjb25zdCBleGFtcGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lICovXG4gICAgICAgIGNvbnN0IEhvc3RNdXRhdGlvbk9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG4gICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEhvc3RNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uICgpIHsgfSk7XG4gICAgICAgIG9ic2VydmVyLm9ic2VydmUoZXhhbXBsZSwgeyBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuICAgICAgICBleGFtcGxlLnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywgJ2Jsb2NrJyk7XG4gICAgICAgIHJldHVybiBCb29sZWFuKG9ic2VydmVyLnRha2VSZWNvcmRzKCkubGVuZ3RoKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufSwgdHJ1ZSk7XG5hZGQoJ2RvbS13ZWJhbmltYXRpb24nLCAoKSA9PiB0cnVlICYmIGdsb2JhbC5BbmltYXRpb24gIT09IHVuZGVmaW5lZCAmJiBnbG9iYWwuS2V5ZnJhbWVFZmZlY3QgIT09IHVuZGVmaW5lZCwgdHJ1ZSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXMubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vc3VwcG9ydC9oYXMubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL3N1cHBvcnQvaGFzLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi4vZ2xvYmFsJztcbmltcG9ydCBoYXMgZnJvbSAnLi9oYXMnO1xuZnVuY3Rpb24gZXhlY3V0ZVRhc2soaXRlbSkge1xuICAgIGlmIChpdGVtICYmIGl0ZW0uaXNBY3RpdmUgJiYgaXRlbS5jYWxsYmFjaykge1xuICAgICAgICBpdGVtLmNhbGxiYWNrKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0UXVldWVIYW5kbGUoaXRlbSwgZGVzdHJ1Y3Rvcikge1xuICAgIHJldHVybiB7XG4gICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgICAgIGl0ZW0uaXNBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIGl0ZW0uY2FsbGJhY2sgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGRlc3RydWN0b3IpIHtcbiAgICAgICAgICAgICAgICBkZXN0cnVjdG9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxubGV0IGNoZWNrTWljcm9UYXNrUXVldWU7XG5sZXQgbWljcm9UYXNrcztcbi8qKlxuICogU2NoZWR1bGVzIGEgY2FsbGJhY2sgdG8gdGhlIG1hY3JvdGFzayBxdWV1ZS5cbiAqXG4gKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGJlIHF1ZXVlZCBhbmQgbGF0ZXIgZXhlY3V0ZWQuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBhIGBkZXN0cm95YCBtZXRob2QgdGhhdCwgd2hlbiBjYWxsZWQsIHByZXZlbnRzIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZyb20gZXhlY3V0aW5nLlxuICovXG5leHBvcnQgY29uc3QgcXVldWVUYXNrID0gKGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgZGVzdHJ1Y3RvcjtcbiAgICBsZXQgZW5xdWV1ZTtcbiAgICAvLyBTaW5jZSB0aGUgSUUgaW1wbGVtZW50YXRpb24gb2YgYHNldEltbWVkaWF0ZWAgaXMgbm90IGZsYXdsZXNzLCB3ZSB3aWxsIHRlc3QgZm9yIGBwb3N0TWVzc2FnZWAgZmlyc3QuXG4gICAgaWYgKHRydWUpIHtcbiAgICAgICAgY29uc3QgcXVldWUgPSBbXTtcbiAgICAgICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIC8vIENvbmZpcm0gdGhhdCB0aGUgZXZlbnQgd2FzIHRyaWdnZXJlZCBieSB0aGUgY3VycmVudCB3aW5kb3cgYW5kIGJ5IHRoaXMgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2UgPT09IGdsb2JhbCAmJiBldmVudC5kYXRhID09PSAnZG9qby1xdWV1ZS1tZXNzYWdlJykge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVRhc2socXVldWUuc2hpZnQoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICBxdWV1ZS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKCdkb2pvLXF1ZXVlLW1lc3NhZ2UnLCAnKicpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChmYWxzZSkge1xuICAgICAgICBkZXN0cnVjdG9yID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlO1xuICAgICAgICBlbnF1ZXVlID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBzZXRJbW1lZGlhdGUoZXhlY3V0ZVRhc2suYmluZChudWxsLCBpdGVtKSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBkZXN0cnVjdG9yID0gZ2xvYmFsLmNsZWFyVGltZW91dDtcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gc2V0VGltZW91dChleGVjdXRlVGFzay5iaW5kKG51bGwsIGl0ZW0pLCAwKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcXVldWVUYXNrKGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICAgICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBpZCA9IGVucXVldWUoaXRlbSk7XG4gICAgICAgIHJldHVybiBnZXRRdWV1ZUhhbmRsZShpdGVtLCBkZXN0cnVjdG9yICYmXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZGVzdHJ1Y3RvcihpZCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gVE9ETzogVXNlIGFzcGVjdC5iZWZvcmUgd2hlbiBpdCBpcyBhdmFpbGFibGUuXG4gICAgcmV0dXJuIHRydWVcbiAgICAgICAgPyBxdWV1ZVRhc2tcbiAgICAgICAgOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNoZWNrTWljcm9UYXNrUXVldWUoKTtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZVRhc2soY2FsbGJhY2spO1xuICAgICAgICB9O1xufSkoKTtcbi8vIFdoZW4gbm8gbWVjaGFuaXNtIGZvciByZWdpc3RlcmluZyBtaWNyb3Rhc2tzIGlzIGV4cG9zZWQgYnkgdGhlIGVudmlyb25tZW50LCBtaWNyb3Rhc2tzIHdpbGxcbi8vIGJlIHF1ZXVlZCBhbmQgdGhlbiBleGVjdXRlZCBpbiBhIHNpbmdsZSBtYWNyb3Rhc2sgYmVmb3JlIHRoZSBvdGhlciBtYWNyb3Rhc2tzIGFyZSBleGVjdXRlZC5cbmlmICghdHJ1ZSkge1xuICAgIGxldCBpc01pY3JvVGFza1F1ZXVlZCA9IGZhbHNlO1xuICAgIG1pY3JvVGFza3MgPSBbXTtcbiAgICBjaGVja01pY3JvVGFza1F1ZXVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWlzTWljcm9UYXNrUXVldWVkKSB7XG4gICAgICAgICAgICBpc01pY3JvVGFza1F1ZXVlZCA9IHRydWU7XG4gICAgICAgICAgICBxdWV1ZVRhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlzTWljcm9UYXNrUXVldWVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKG1pY3JvVGFza3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGl0ZW0gPSBtaWNyb1Rhc2tzLnNoaWZ0KCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlVGFzayhpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn1cbi8qKlxuICogU2NoZWR1bGVzIGFuIGFuaW1hdGlvbiB0YXNrIHdpdGggYHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIGlmIGl0IGV4aXN0cywgb3Igd2l0aCBgcXVldWVUYXNrYCBvdGhlcndpc2UuXG4gKlxuICogU2luY2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lJ3MgYmVoYXZpb3IgZG9lcyBub3QgbWF0Y2ggdGhhdCBleHBlY3RlZCBmcm9tIGBxdWV1ZVRhc2tgLCBpdCBpcyBub3QgdXNlZCB0aGVyZS5cbiAqIEhvd2V2ZXIsIGF0IHRpbWVzIGl0IG1ha2VzIG1vcmUgc2Vuc2UgdG8gZGVsZWdhdGUgdG8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lOyBoZW5jZSB0aGUgZm9sbG93aW5nIG1ldGhvZC5cbiAqXG4gKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGJlIHF1ZXVlZCBhbmQgbGF0ZXIgZXhlY3V0ZWQuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBhIGBkZXN0cm95YCBtZXRob2QgdGhhdCwgd2hlbiBjYWxsZWQsIHByZXZlbnRzIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZyb20gZXhlY3V0aW5nLlxuICovXG5leHBvcnQgY29uc3QgcXVldWVBbmltYXRpb25UYXNrID0gKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRydWUpIHtcbiAgICAgICAgcmV0dXJuIHF1ZXVlVGFzaztcbiAgICB9XG4gICAgZnVuY3Rpb24gcXVldWVBbmltYXRpb25UYXNrKGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICAgICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCByYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShleGVjdXRlVGFzay5iaW5kKG51bGwsIGl0ZW0pKTtcbiAgICAgICAgcmV0dXJuIGdldFF1ZXVlSGFuZGxlKGl0ZW0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFRPRE86IFVzZSBhc3BlY3QuYmVmb3JlIHdoZW4gaXQgaXMgYXZhaWxhYmxlLlxuICAgIHJldHVybiB0cnVlXG4gICAgICAgID8gcXVldWVBbmltYXRpb25UYXNrXG4gICAgICAgIDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjaGVja01pY3JvVGFza1F1ZXVlKCk7XG4gICAgICAgICAgICByZXR1cm4gcXVldWVBbmltYXRpb25UYXNrKGNhbGxiYWNrKTtcbiAgICAgICAgfTtcbn0pKCk7XG4vKipcbiAqIFNjaGVkdWxlcyBhIGNhbGxiYWNrIHRvIHRoZSBtaWNyb3Rhc2sgcXVldWUuXG4gKlxuICogQW55IGNhbGxiYWNrcyByZWdpc3RlcmVkIHdpdGggYHF1ZXVlTWljcm9UYXNrYCB3aWxsIGJlIGV4ZWN1dGVkIGJlZm9yZSB0aGUgbmV4dCBtYWNyb3Rhc2suIElmIG5vIG5hdGl2ZVxuICogbWVjaGFuaXNtIGZvciBzY2hlZHVsaW5nIG1hY3JvdGFza3MgaXMgZXhwb3NlZCwgdGhlbiBhbnkgY2FsbGJhY2tzIHdpbGwgYmUgZmlyZWQgYmVmb3JlIGFueSBtYWNyb3Rhc2tcbiAqIHJlZ2lzdGVyZWQgd2l0aCBgcXVldWVUYXNrYCBvciBgcXVldWVBbmltYXRpb25UYXNrYC5cbiAqXG4gKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGJlIHF1ZXVlZCBhbmQgbGF0ZXIgZXhlY3V0ZWQuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBhIGBkZXN0cm95YCBtZXRob2QgdGhhdCwgd2hlbiBjYWxsZWQsIHByZXZlbnRzIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZyb20gZXhlY3V0aW5nLlxuICovXG5leHBvcnQgbGV0IHF1ZXVlTWljcm9UYXNrID0gKGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgZW5xdWV1ZTtcbiAgICBpZiAoZmFsc2UpIHtcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICBnbG9iYWwucHJvY2Vzcy5uZXh0VGljayhleGVjdXRlVGFzay5iaW5kKG51bGwsIGl0ZW0pKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHJ1ZSkge1xuICAgICAgICBlbnF1ZXVlID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIGdsb2JhbC5Qcm9taXNlLnJlc29sdmUoaXRlbSkudGhlbihleGVjdXRlVGFzayk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKHRydWUpIHtcbiAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWUgKi9cbiAgICAgICAgY29uc3QgSG9zdE11dGF0aW9uT2JzZXJ2ZXIgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBjb25zdCBxdWV1ZSA9IFtdO1xuICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBIb3N0TXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBxdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtICYmIGl0ZW0uaXNBY3RpdmUgJiYgaXRlbS5jYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShub2RlLCB7IGF0dHJpYnV0ZXM6IHRydWUgfSk7XG4gICAgICAgIGVucXVldWUgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgcXVldWUucHVzaChpdGVtKTtcbiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCdxdWV1ZVN0YXR1cycsICcxJyk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBlbnF1ZXVlID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIGNoZWNrTWljcm9UYXNrUXVldWUoKTtcbiAgICAgICAgICAgIG1pY3JvVGFza3MucHVzaChpdGVtKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBpdGVtID0ge1xuICAgICAgICAgICAgaXNBY3RpdmU6IHRydWUsXG4gICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2tcbiAgICAgICAgfTtcbiAgICAgICAgZW5xdWV1ZShpdGVtKTtcbiAgICAgICAgcmV0dXJuIGdldFF1ZXVlSGFuZGxlKGl0ZW0pO1xuICAgIH07XG59KSgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVldWUubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vc3VwcG9ydC9xdWV1ZS5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vc3VwcG9ydC9xdWV1ZS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCIvKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBnZW5lcmF0ZSBhIHZhbHVlIHByb3BlcnR5IGRlc2NyaXB0b3JcbiAqXG4gKiBAcGFyYW0gdmFsdWUgICAgICAgIFRoZSB2YWx1ZSB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciBzaG91bGQgYmUgc2V0IHRvXG4gKiBAcGFyYW0gZW51bWVyYWJsZSAgIElmIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgZW51bWJlcmFibGUsIGRlZmF1bHRzIHRvIGZhbHNlXG4gKiBAcGFyYW0gd3JpdGFibGUgICAgIElmIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgd3JpdGFibGUsIGRlZmF1bHRzIHRvIHRydWVcbiAqIEBwYXJhbSBjb25maWd1cmFibGUgSWYgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBjb25maWd1cmFibGUsIGRlZmF1bHRzIHRvIHRydWVcbiAqIEByZXR1cm4gICAgICAgICAgICAgVGhlIHByb3BlcnR5IGRlc2NyaXB0b3Igb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZURlc2NyaXB0b3IodmFsdWUsIGVudW1lcmFibGUgPSBmYWxzZSwgd3JpdGFibGUgPSB0cnVlLCBjb25maWd1cmFibGUgPSB0cnVlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBlbnVtZXJhYmxlOiBlbnVtZXJhYmxlLFxuICAgICAgICB3cml0YWJsZTogd3JpdGFibGUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogY29uZmlndXJhYmxlXG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3cmFwTmF0aXZlKG5hdGl2ZUZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZUZ1bmN0aW9uLmFwcGx5KHRhcmdldCwgYXJncyk7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWwubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vc3VwcG9ydC91dGlsLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdXBwb3J0L3V0aWwubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IHsgRXZlbnRlZCB9IGZyb20gJ0Bkb2pvL2NvcmUvRXZlbnRlZCc7XG5leHBvcnQgY2xhc3MgSW5qZWN0b3IgZXh0ZW5kcyBFdmVudGVkIHtcbiAgICBjb25zdHJ1Y3RvcihwYXlsb2FkKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX3BheWxvYWQgPSBwYXlsb2FkO1xuICAgIH1cbiAgICBzZXRJbnZhbGlkYXRvcihpbnZhbGlkYXRvcikge1xuICAgICAgICB0aGlzLl9pbnZhbGlkYXRvciA9IGludmFsaWRhdG9yO1xuICAgIH1cbiAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXlsb2FkO1xuICAgIH1cbiAgICBzZXQocGF5bG9hZCkge1xuICAgICAgICB0aGlzLl9wYXlsb2FkID0gcGF5bG9hZDtcbiAgICAgICAgaWYgKHRoaXMuX2ludmFsaWRhdG9yKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRvcigpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgSW5qZWN0b3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JbmplY3Rvci5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvSW5qZWN0b3IubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9JbmplY3Rvci5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgeyBFdmVudGVkIH0gZnJvbSAnQGRvam8vY29yZS9FdmVudGVkJztcbmltcG9ydCBNYXAgZnJvbSAnQGRvam8vc2hpbS9NYXAnO1xuLyoqXG4gKiBFbnVtIHRvIGlkZW50aWZ5IHRoZSB0eXBlIG9mIGV2ZW50LlxuICogTGlzdGVuaW5nIHRvICdQcm9qZWN0b3InIHdpbGwgbm90aWZ5IHdoZW4gcHJvamVjdG9yIGlzIGNyZWF0ZWQgb3IgdXBkYXRlZFxuICogTGlzdGVuaW5nIHRvICdXaWRnZXQnIHdpbGwgbm90aWZ5IHdoZW4gd2lkZ2V0IHJvb3QgaXMgY3JlYXRlZCBvciB1cGRhdGVkXG4gKi9cbmV4cG9ydCB2YXIgTm9kZUV2ZW50VHlwZTtcbihmdW5jdGlvbiAoTm9kZUV2ZW50VHlwZSkge1xuICAgIE5vZGVFdmVudFR5cGVbXCJQcm9qZWN0b3JcIl0gPSBcIlByb2plY3RvclwiO1xuICAgIE5vZGVFdmVudFR5cGVbXCJXaWRnZXRcIl0gPSBcIldpZGdldFwiO1xufSkoTm9kZUV2ZW50VHlwZSB8fCAoTm9kZUV2ZW50VHlwZSA9IHt9KSk7XG5leHBvcnQgY2xhc3MgTm9kZUhhbmRsZXIgZXh0ZW5kcyBFdmVudGVkIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5fbm9kZU1hcCA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgZ2V0KGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbm9kZU1hcC5nZXQoa2V5KTtcbiAgICB9XG4gICAgaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbm9kZU1hcC5oYXMoa2V5KTtcbiAgICB9XG4gICAgYWRkKGVsZW1lbnQsIGtleSkge1xuICAgICAgICB0aGlzLl9ub2RlTWFwLnNldChrZXksIGVsZW1lbnQpO1xuICAgICAgICB0aGlzLmVtaXQoeyB0eXBlOiBrZXkgfSk7XG4gICAgfVxuICAgIGFkZFJvb3QoKSB7XG4gICAgICAgIHRoaXMuZW1pdCh7IHR5cGU6IE5vZGVFdmVudFR5cGUuV2lkZ2V0IH0pO1xuICAgIH1cbiAgICBhZGRQcm9qZWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZW1pdCh7IHR5cGU6IE5vZGVFdmVudFR5cGUuUHJvamVjdG9yIH0pO1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5fbm9kZU1hcC5jbGVhcigpO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IE5vZGVIYW5kbGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9kZUhhbmRsZXIubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL05vZGVIYW5kbGVyLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvTm9kZUhhbmRsZXIubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IFByb21pc2UgZnJvbSAnQGRvam8vc2hpbS9Qcm9taXNlJztcbmltcG9ydCBNYXAgZnJvbSAnQGRvam8vc2hpbS9NYXAnO1xuaW1wb3J0IFN5bWJvbCBmcm9tICdAZG9qby9zaGltL1N5bWJvbCc7XG5pbXBvcnQgeyBFdmVudGVkIH0gZnJvbSAnQGRvam8vY29yZS9FdmVudGVkJztcbi8qKlxuICogV2lkZ2V0IGJhc2Ugc3ltYm9sIHR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IFdJREdFVF9CQVNFX1RZUEUgPSBTeW1ib2woJ1dpZGdldCBCYXNlJyk7XG4vKipcbiAqIENoZWNrcyBpcyB0aGUgaXRlbSBpcyBhIHN1YmNsYXNzIG9mIFdpZGdldEJhc2UgKG9yIGEgV2lkZ2V0QmFzZSlcbiAqXG4gKiBAcGFyYW0gaXRlbSB0aGUgaXRlbSB0byBjaGVja1xuICogQHJldHVybnMgdHJ1ZS9mYWxzZSBpbmRpY2F0aW5nIGlmIHRoZSBpdGVtIGlzIGEgV2lkZ2V0QmFzZUNvbnN0cnVjdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1dpZGdldEJhc2VDb25zdHJ1Y3RvcihpdGVtKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oaXRlbSAmJiBpdGVtLl90eXBlID09PSBXSURHRVRfQkFTRV9UWVBFKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1dpZGdldENvbnN0cnVjdG9yRGVmYXVsdEV4cG9ydChpdGVtKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oaXRlbSAmJlxuICAgICAgICBpdGVtLmhhc093blByb3BlcnR5KCdfX2VzTW9kdWxlJykgJiZcbiAgICAgICAgaXRlbS5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdCcpICYmXG4gICAgICAgIGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yKGl0ZW0uZGVmYXVsdCkpO1xufVxuLyoqXG4gKiBUaGUgUmVnaXN0cnkgaW1wbGVtZW50YXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lzdHJ5IGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgLyoqXG4gICAgICogRW1pdCBsb2FkZWQgZXZlbnQgZm9yIHJlZ2lzdHJ5IGxhYmVsXG4gICAgICovXG4gICAgZW1pdExvYWRlZEV2ZW50KHdpZGdldExhYmVsLCBpdGVtKSB7XG4gICAgICAgIHRoaXMuZW1pdCh7XG4gICAgICAgICAgICB0eXBlOiB3aWRnZXRMYWJlbCxcbiAgICAgICAgICAgIGFjdGlvbjogJ2xvYWRlZCcsXG4gICAgICAgICAgICBpdGVtXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkZWZpbmUobGFiZWwsIGl0ZW0pIHtcbiAgICAgICAgaWYgKHRoaXMuX3dpZGdldFJlZ2lzdHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dpZGdldFJlZ2lzdHJ5ID0gbmV3IE1hcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl93aWRnZXRSZWdpc3RyeS5oYXMobGFiZWwpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHdpZGdldCBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgZm9yICcke2xhYmVsLnRvU3RyaW5nKCl9J2ApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dpZGdldFJlZ2lzdHJ5LnNldChsYWJlbCwgaXRlbSk7XG4gICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgaXRlbS50aGVuKCh3aWRnZXRDdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2lkZ2V0UmVnaXN0cnkuc2V0KGxhYmVsLCB3aWRnZXRDdG9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRMb2FkZWRFdmVudChsYWJlbCwgd2lkZ2V0Q3Rvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpZGdldEN0b3I7XG4gICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yKGl0ZW0pKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXRMb2FkZWRFdmVudChsYWJlbCwgaXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVmaW5lSW5qZWN0b3IobGFiZWwsIGluamVjdG9yRmFjdG9yeSkge1xuICAgICAgICBpZiAodGhpcy5faW5qZWN0b3JSZWdpc3RyeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9pbmplY3RvclJlZ2lzdHJ5ID0gbmV3IE1hcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9pbmplY3RvclJlZ2lzdHJ5LmhhcyhsYWJlbCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW5qZWN0b3IgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIGZvciAnJHtsYWJlbC50b1N0cmluZygpfSdgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnZhbGlkYXRvciA9IG5ldyBFdmVudGVkKCk7XG4gICAgICAgIGNvbnN0IGluamVjdG9ySXRlbSA9IHtcbiAgICAgICAgICAgIGluamVjdG9yOiBpbmplY3RvckZhY3RvcnkoKCkgPT4gaW52YWxpZGF0b3IuZW1pdCh7IHR5cGU6ICdpbnZhbGlkYXRlJyB9KSksXG4gICAgICAgICAgICBpbnZhbGlkYXRvclxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9pbmplY3RvclJlZ2lzdHJ5LnNldChsYWJlbCwgaW5qZWN0b3JJdGVtKTtcbiAgICAgICAgdGhpcy5lbWl0TG9hZGVkRXZlbnQobGFiZWwsIGluamVjdG9ySXRlbSk7XG4gICAgfVxuICAgIGdldChsYWJlbCkge1xuICAgICAgICBpZiAoIXRoaXMuX3dpZGdldFJlZ2lzdHJ5IHx8ICF0aGlzLmhhcyhsYWJlbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl93aWRnZXRSZWdpc3RyeS5nZXQobGFiZWwpO1xuICAgICAgICBpZiAoaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IoaXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IGl0ZW0oKTtcbiAgICAgICAgdGhpcy5fd2lkZ2V0UmVnaXN0cnkuc2V0KGxhYmVsLCBwcm9taXNlKTtcbiAgICAgICAgcHJvbWlzZS50aGVuKCh3aWRnZXRDdG9yKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNXaWRnZXRDb25zdHJ1Y3RvckRlZmF1bHRFeHBvcnQod2lkZ2V0Q3RvcikpIHtcbiAgICAgICAgICAgICAgICB3aWRnZXRDdG9yID0gd2lkZ2V0Q3Rvci5kZWZhdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fd2lkZ2V0UmVnaXN0cnkuc2V0KGxhYmVsLCB3aWRnZXRDdG9yKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdExvYWRlZEV2ZW50KGxhYmVsLCB3aWRnZXRDdG9yKTtcbiAgICAgICAgICAgIHJldHVybiB3aWRnZXRDdG9yO1xuICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGdldEluamVjdG9yKGxhYmVsKSB7XG4gICAgICAgIGlmICghdGhpcy5faW5qZWN0b3JSZWdpc3RyeSB8fCAhdGhpcy5oYXNJbmplY3RvcihsYWJlbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pbmplY3RvclJlZ2lzdHJ5LmdldChsYWJlbCk7XG4gICAgfVxuICAgIGhhcyhsYWJlbCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLl93aWRnZXRSZWdpc3RyeSAmJiB0aGlzLl93aWRnZXRSZWdpc3RyeS5oYXMobGFiZWwpKTtcbiAgICB9XG4gICAgaGFzSW5qZWN0b3IobGFiZWwpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5faW5qZWN0b3JSZWdpc3RyeSAmJiB0aGlzLl9pbmplY3RvclJlZ2lzdHJ5LmhhcyhsYWJlbCkpO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IFJlZ2lzdHJ5O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVnaXN0cnkubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL1JlZ2lzdHJ5Lm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvUmVnaXN0cnkubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IHsgTWFwIH0gZnJvbSAnQGRvam8vc2hpbS9NYXAnO1xuaW1wb3J0IHsgRXZlbnRlZCB9IGZyb20gJ0Bkb2pvL2NvcmUvRXZlbnRlZCc7XG5pbXBvcnQgeyBSZWdpc3RyeSB9IGZyb20gJy4vUmVnaXN0cnknO1xuZXhwb3J0IGNsYXNzIFJlZ2lzdHJ5SGFuZGxlciBleHRlbmRzIEV2ZW50ZWQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9yZWdpc3RyeSA9IG5ldyBSZWdpc3RyeSgpO1xuICAgICAgICB0aGlzLl9yZWdpc3RyeVdpZGdldExhYmVsTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLl9yZWdpc3RyeUluamVjdG9yTGFiZWxNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMub3duKHRoaXMuX3JlZ2lzdHJ5KTtcbiAgICAgICAgY29uc3QgZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJhc2VSZWdpc3RyeSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5V2lkZ2V0TGFiZWxNYXAuZGVsZXRlKHRoaXMuYmFzZVJlZ2lzdHJ5KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RyeUluamVjdG9yTGFiZWxNYXAuZGVsZXRlKHRoaXMuYmFzZVJlZ2lzdHJ5KTtcbiAgICAgICAgICAgICAgICB0aGlzLmJhc2VSZWdpc3RyeSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vd24oeyBkZXN0cm95IH0pO1xuICAgIH1cbiAgICBzZXQgYmFzZShiYXNlUmVnaXN0cnkpIHtcbiAgICAgICAgaWYgKHRoaXMuYmFzZVJlZ2lzdHJ5KSB7XG4gICAgICAgICAgICB0aGlzLl9yZWdpc3RyeVdpZGdldExhYmVsTWFwLmRlbGV0ZSh0aGlzLmJhc2VSZWdpc3RyeSk7XG4gICAgICAgICAgICB0aGlzLl9yZWdpc3RyeUluamVjdG9yTGFiZWxNYXAuZGVsZXRlKHRoaXMuYmFzZVJlZ2lzdHJ5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJhc2VSZWdpc3RyeSA9IGJhc2VSZWdpc3RyeTtcbiAgICB9XG4gICAgZGVmaW5lKGxhYmVsLCB3aWRnZXQpIHtcbiAgICAgICAgdGhpcy5fcmVnaXN0cnkuZGVmaW5lKGxhYmVsLCB3aWRnZXQpO1xuICAgIH1cbiAgICBkZWZpbmVJbmplY3RvcihsYWJlbCwgaW5qZWN0b3IpIHtcbiAgICAgICAgdGhpcy5fcmVnaXN0cnkuZGVmaW5lSW5qZWN0b3IobGFiZWwsIGluamVjdG9yKTtcbiAgICB9XG4gICAgaGFzKGxhYmVsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWdpc3RyeS5oYXMobGFiZWwpIHx8IEJvb2xlYW4odGhpcy5iYXNlUmVnaXN0cnkgJiYgdGhpcy5iYXNlUmVnaXN0cnkuaGFzKGxhYmVsKSk7XG4gICAgfVxuICAgIGhhc0luamVjdG9yKGxhYmVsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWdpc3RyeS5oYXNJbmplY3RvcihsYWJlbCkgfHwgQm9vbGVhbih0aGlzLmJhc2VSZWdpc3RyeSAmJiB0aGlzLmJhc2VSZWdpc3RyeS5oYXNJbmplY3RvcihsYWJlbCkpO1xuICAgIH1cbiAgICBnZXQobGFiZWwsIGdsb2JhbFByZWNlZGVuY2UgPSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0KGxhYmVsLCBnbG9iYWxQcmVjZWRlbmNlLCAnZ2V0JywgdGhpcy5fcmVnaXN0cnlXaWRnZXRMYWJlbE1hcCk7XG4gICAgfVxuICAgIGdldEluamVjdG9yKGxhYmVsLCBnbG9iYWxQcmVjZWRlbmNlID0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldChsYWJlbCwgZ2xvYmFsUHJlY2VkZW5jZSwgJ2dldEluamVjdG9yJywgdGhpcy5fcmVnaXN0cnlJbmplY3RvckxhYmVsTWFwKTtcbiAgICB9XG4gICAgX2dldChsYWJlbCwgZ2xvYmFsUHJlY2VkZW5jZSwgZ2V0RnVuY3Rpb25OYW1lLCBsYWJlbE1hcCkge1xuICAgICAgICBjb25zdCByZWdpc3RyaWVzID0gZ2xvYmFsUHJlY2VkZW5jZSA/IFt0aGlzLmJhc2VSZWdpc3RyeSwgdGhpcy5fcmVnaXN0cnldIDogW3RoaXMuX3JlZ2lzdHJ5LCB0aGlzLmJhc2VSZWdpc3RyeV07XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVnaXN0cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcmVnaXN0cnkgPSByZWdpc3RyaWVzW2ldO1xuICAgICAgICAgICAgaWYgKCFyZWdpc3RyeSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHJlZ2lzdHJ5W2dldEZ1bmN0aW9uTmFtZV0obGFiZWwpO1xuICAgICAgICAgICAgY29uc3QgcmVnaXN0ZXJlZExhYmVscyA9IGxhYmVsTWFwLmdldChyZWdpc3RyeSkgfHwgW107XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVnaXN0ZXJlZExhYmVscy5pbmRleE9mKGxhYmVsKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSByZWdpc3RyeS5vbihsYWJlbCwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5hY3Rpb24gPT09ICdsb2FkZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzW2dldEZ1bmN0aW9uTmFtZV0obGFiZWwsIGdsb2JhbFByZWNlZGVuY2UpID09PSBldmVudC5pdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoeyB0eXBlOiAnaW52YWxpZGF0ZScgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLm93bihoYW5kbGUpO1xuICAgICAgICAgICAgICAgIGxhYmVsTWFwLnNldChyZWdpc3RyeSwgWy4uLnJlZ2lzdGVyZWRMYWJlbHMsIGxhYmVsXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgUmVnaXN0cnlIYW5kbGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVnaXN0cnlIYW5kbGVyLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9SZWdpc3RyeUhhbmRsZXIubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9SZWdpc3RyeUhhbmRsZXIubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IE1hcCBmcm9tICdAZG9qby9zaGltL01hcCc7XG5pbXBvcnQgV2Vha01hcCBmcm9tICdAZG9qby9zaGltL1dlYWtNYXAnO1xuaW1wb3J0IFN5bWJvbCBmcm9tICdAZG9qby9zaGltL1N5bWJvbCc7XG5pbXBvcnQgeyB2IH0gZnJvbSAnLi9kJztcbmltcG9ydCB7IGF1dG8gfSBmcm9tICcuL2RpZmYnO1xuaW1wb3J0IFJlZ2lzdHJ5SGFuZGxlciBmcm9tICcuL1JlZ2lzdHJ5SGFuZGxlcic7XG5pbXBvcnQgTm9kZUhhbmRsZXIgZnJvbSAnLi9Ob2RlSGFuZGxlcic7XG5pbXBvcnQgeyB3aWRnZXRJbnN0YW5jZU1hcCB9IGZyb20gJy4vdmRvbSc7XG5pbXBvcnQgeyBpc1dpZGdldEJhc2VDb25zdHJ1Y3RvciwgV0lER0VUX0JBU0VfVFlQRSB9IGZyb20gJy4vUmVnaXN0cnknO1xuY29uc3QgZGVjb3JhdG9yTWFwID0gbmV3IE1hcCgpO1xuY29uc3QgYm91bmRBdXRvID0gYXV0by5iaW5kKG51bGwpO1xuZXhwb3J0IGNvbnN0IG5vQmluZCA9IFN5bWJvbC5mb3IoJ2Rvam9Ob0JpbmQnKTtcbi8qKlxuICogTWFpbiB3aWRnZXQgYmFzZSBmb3IgYWxsIHdpZGdldHMgdG8gZXh0ZW5kXG4gKi9cbmV4cG9ydCBjbGFzcyBXaWRnZXRCYXNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiBpdCBpcyB0aGUgaW5pdGlhbCBzZXQgcHJvcGVydGllcyBjeWNsZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5faW5pdGlhbFByb3BlcnRpZXMgPSB0cnVlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQXJyYXkgb2YgcHJvcGVydHkga2V5cyBjb25zaWRlcmVkIGNoYW5nZWQgZnJvbSB0aGUgcHJldmlvdXMgc2V0IHByb3BlcnRpZXNcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2NoYW5nZWRQcm9wZXJ0eUtleXMgPSBbXTtcbiAgICAgICAgdGhpcy5fbm9kZUhhbmRsZXIgPSBuZXcgTm9kZUhhbmRsZXIoKTtcbiAgICAgICAgdGhpcy5faGFuZGxlcyA9IFtdO1xuICAgICAgICB0aGlzLl9jaGlsZHJlbiA9IFtdO1xuICAgICAgICB0aGlzLl9kZWNvcmF0b3JDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHt9O1xuICAgICAgICB0aGlzLl9ib3VuZFJlbmRlckZ1bmMgPSB0aGlzLnJlbmRlci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLl9ib3VuZEludmFsaWRhdGUgPSB0aGlzLmludmFsaWRhdGUuYmluZCh0aGlzKTtcbiAgICAgICAgd2lkZ2V0SW5zdGFuY2VNYXAuc2V0KHRoaXMsIHtcbiAgICAgICAgICAgIGRpcnR5OiB0cnVlLFxuICAgICAgICAgICAgb25BdHRhY2g6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQXR0YWNoKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25EZXRhY2g6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRGV0YWNoKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbm9kZUhhbmRsZXI6IHRoaXMuX25vZGVIYW5kbGVyLFxuICAgICAgICAgICAgcmVnaXN0cnk6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RyeTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3JlUHJvcGVydGllczoge30sXG4gICAgICAgICAgICByZW5kZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgaW5wdXRQcm9wZXJ0aWVzOiB7fVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fcnVuQWZ0ZXJDb25zdHJ1Y3RvcnMoKTtcbiAgICB9XG4gICAgbWV0YShNZXRhVHlwZSkge1xuICAgICAgICBpZiAodGhpcy5fbWV0YU1hcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9tZXRhTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjYWNoZWQgPSB0aGlzLl9tZXRhTWFwLmdldChNZXRhVHlwZSk7XG4gICAgICAgIGlmICghY2FjaGVkKSB7XG4gICAgICAgICAgICBjYWNoZWQgPSBuZXcgTWV0YVR5cGUoe1xuICAgICAgICAgICAgICAgIGludmFsaWRhdGU6IHRoaXMuX2JvdW5kSW52YWxpZGF0ZSxcbiAgICAgICAgICAgICAgICBub2RlSGFuZGxlcjogdGhpcy5fbm9kZUhhbmRsZXIsXG4gICAgICAgICAgICAgICAgYmluZDogdGhpc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLm93bihjYWNoZWQpO1xuICAgICAgICAgICAgdGhpcy5fbWV0YU1hcC5zZXQoTWV0YVR5cGUsIGNhY2hlZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG4gICAgb25BdHRhY2goKSB7XG4gICAgICAgIC8vIERvIG5vdGhpbmcgYnkgZGVmYXVsdC5cbiAgICB9XG4gICAgb25EZXRhY2goKSB7XG4gICAgICAgIC8vIERvIG5vdGhpbmcgYnkgZGVmYXVsdC5cbiAgICB9XG4gICAgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9wZXJ0aWVzO1xuICAgIH1cbiAgICBnZXQgY2hhbmdlZFByb3BlcnR5S2V5cygpIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLl9jaGFuZ2VkUHJvcGVydHlLZXlzXTtcbiAgICB9XG4gICAgX19zZXRDb3JlUHJvcGVydGllc19fKGNvcmVQcm9wZXJ0aWVzKSB7XG4gICAgICAgIGNvbnN0IHsgYmFzZVJlZ2lzdHJ5IH0gPSBjb3JlUHJvcGVydGllcztcbiAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHRoaXMpO1xuICAgICAgICBpZiAoaW5zdGFuY2VEYXRhLmNvcmVQcm9wZXJ0aWVzLmJhc2VSZWdpc3RyeSAhPT0gYmFzZVJlZ2lzdHJ5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5ID0gbmV3IFJlZ2lzdHJ5SGFuZGxlcigpO1xuICAgICAgICAgICAgICAgIHRoaXMub3duKHRoaXMuX3JlZ2lzdHJ5KTtcbiAgICAgICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeS5vbignaW52YWxpZGF0ZScsIHRoaXMuX2JvdW5kSW52YWxpZGF0ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnkuYmFzZSA9IGJhc2VSZWdpc3RyeTtcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcyA9IGNvcmVQcm9wZXJ0aWVzO1xuICAgIH1cbiAgICBfX3NldFByb3BlcnRpZXNfXyhvcmlnaW5hbFByb3BlcnRpZXMpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHRoaXMpO1xuICAgICAgICBpbnN0YW5jZURhdGEuaW5wdXRQcm9wZXJ0aWVzID0gb3JpZ2luYWxQcm9wZXJ0aWVzO1xuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gdGhpcy5fcnVuQmVmb3JlUHJvcGVydGllcyhvcmlnaW5hbFByb3BlcnRpZXMpO1xuICAgICAgICBjb25zdCByZWdpc3RlcmVkRGlmZlByb3BlcnR5TmFtZXMgPSB0aGlzLmdldERlY29yYXRvcigncmVnaXN0ZXJlZERpZmZQcm9wZXJ0eScpO1xuICAgICAgICBjb25zdCBjaGFuZ2VkUHJvcGVydHlLZXlzID0gW107XG4gICAgICAgIGNvbnN0IHByb3BlcnR5TmFtZXMgPSBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKTtcbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxQcm9wZXJ0aWVzID09PSBmYWxzZSB8fCByZWdpc3RlcmVkRGlmZlByb3BlcnR5TmFtZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBhbGxQcm9wZXJ0aWVzID0gWy4uLnByb3BlcnR5TmFtZXMsIC4uLk9iamVjdC5rZXlzKHRoaXMuX3Byb3BlcnRpZXMpXTtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrZWRQcm9wZXJ0aWVzID0gW107XG4gICAgICAgICAgICBjb25zdCBkaWZmUHJvcGVydHlSZXN1bHRzID0ge307XG4gICAgICAgICAgICBsZXQgcnVuUmVhY3Rpb25zID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBhbGxQcm9wZXJ0aWVzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChjaGVja2VkUHJvcGVydGllcy5pbmRleE9mKHByb3BlcnR5TmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaGVja2VkUHJvcGVydGllcy5wdXNoKHByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNQcm9wZXJ0eSA9IHRoaXMuX3Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdQcm9wZXJ0eSA9IHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5KHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSwgaW5zdGFuY2VEYXRhLmNvcmVQcm9wZXJ0aWVzLmJpbmQpO1xuICAgICAgICAgICAgICAgIGlmIChyZWdpc3RlcmVkRGlmZlByb3BlcnR5TmFtZXMuaW5kZXhPZihwcm9wZXJ0eU5hbWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBydW5SZWFjdGlvbnMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmRnVuY3Rpb25zID0gdGhpcy5nZXREZWNvcmF0b3IoYGRpZmZQcm9wZXJ0eToke3Byb3BlcnR5TmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaWZmRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkaWZmRnVuY3Rpb25zW2ldKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuY2hhbmdlZCAmJiBjaGFuZ2VkUHJvcGVydHlLZXlzLmluZGV4T2YocHJvcGVydHlOYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkUHJvcGVydHlLZXlzLnB1c2gocHJvcGVydHlOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZQcm9wZXJ0eVJlc3VsdHNbcHJvcGVydHlOYW1lXSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYm91bmRBdXRvKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5jaGFuZ2VkICYmIGNoYW5nZWRQcm9wZXJ0eUtleXMuaW5kZXhPZihwcm9wZXJ0eU5hbWUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFByb3BlcnR5S2V5cy5wdXNoKHByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZSBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaWZmUHJvcGVydHlSZXN1bHRzW3Byb3BlcnR5TmFtZV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVuUmVhY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwRGlmZlByb3BlcnR5UmVhY3Rpb25zKHByb3BlcnRpZXMsIGNoYW5nZWRQcm9wZXJ0eUtleXMpLmZvckVhY2goKGFyZ3MsIHJlYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWN0aW9uLmNhbGwodGhpcywgYXJncy5wcmV2aW91c1Byb3BlcnRpZXMsIGFyZ3MubmV3UHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBkaWZmUHJvcGVydHlSZXN1bHRzO1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlZFByb3BlcnR5S2V5cyA9IGNoYW5nZWRQcm9wZXJ0eUtleXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsUHJvcGVydGllcyA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eShwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0sIGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcy5iaW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWRQcm9wZXJ0eUtleXMucHVzaChwcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZWRQcm9wZXJ0eUtleXMgPSBjaGFuZ2VkUHJvcGVydHlLZXlzO1xuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oe30sIHByb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaGFuZ2VkUHJvcGVydHlLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBjaGlsZHJlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuO1xuICAgIH1cbiAgICBfX3NldENoaWxkcmVuX18oY2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX2NoaWxkcmVuLmxlbmd0aCA+IDAgfHwgY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9fcmVuZGVyX18oKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldCh0aGlzKTtcbiAgICAgICAgaW5zdGFuY2VEYXRhLmRpcnR5ID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlbmRlciA9IHRoaXMuX3J1bkJlZm9yZVJlbmRlcnMoKTtcbiAgICAgICAgbGV0IGROb2RlID0gcmVuZGVyKCk7XG4gICAgICAgIGROb2RlID0gdGhpcy5ydW5BZnRlclJlbmRlcnMoZE5vZGUpO1xuICAgICAgICB0aGlzLl9ub2RlSGFuZGxlci5jbGVhcigpO1xuICAgICAgICByZXR1cm4gZE5vZGU7XG4gICAgfVxuICAgIGludmFsaWRhdGUoKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldCh0aGlzKTtcbiAgICAgICAgaWYgKGluc3RhbmNlRGF0YS5pbnZhbGlkYXRlKSB7XG4gICAgICAgICAgICBpbnN0YW5jZURhdGEuaW52YWxpZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIHYoJ2RpdicsIHt9LCB0aGlzLmNoaWxkcmVuKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdG8gYWRkIGRlY29yYXRvcnMgdG8gV2lkZ2V0QmFzZVxuICAgICAqXG4gICAgICogQHBhcmFtIGRlY29yYXRvcktleSBUaGUga2V5IG9mIHRoZSBkZWNvcmF0b3JcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBkZWNvcmF0b3JcbiAgICAgKi9cbiAgICBhZGREZWNvcmF0b3IoZGVjb3JhdG9yS2V5LCB2YWx1ZSkge1xuICAgICAgICB2YWx1ZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eSgnY29uc3RydWN0b3InKSkge1xuICAgICAgICAgICAgbGV0IGRlY29yYXRvckxpc3QgPSBkZWNvcmF0b3JNYXAuZ2V0KHRoaXMuY29uc3RydWN0b3IpO1xuICAgICAgICAgICAgaWYgKCFkZWNvcmF0b3JMaXN0KSB7XG4gICAgICAgICAgICAgICAgZGVjb3JhdG9yTGlzdCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgICAgICBkZWNvcmF0b3JNYXAuc2V0KHRoaXMuY29uc3RydWN0b3IsIGRlY29yYXRvckxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHNwZWNpZmljRGVjb3JhdG9yTGlzdCA9IGRlY29yYXRvckxpc3QuZ2V0KGRlY29yYXRvcktleSk7XG4gICAgICAgICAgICBpZiAoIXNwZWNpZmljRGVjb3JhdG9yTGlzdCkge1xuICAgICAgICAgICAgICAgIHNwZWNpZmljRGVjb3JhdG9yTGlzdCA9IFtdO1xuICAgICAgICAgICAgICAgIGRlY29yYXRvckxpc3Quc2V0KGRlY29yYXRvcktleSwgc3BlY2lmaWNEZWNvcmF0b3JMaXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNwZWNpZmljRGVjb3JhdG9yTGlzdC5wdXNoKC4uLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSB0aGlzLmdldERlY29yYXRvcihkZWNvcmF0b3JLZXkpO1xuICAgICAgICAgICAgdGhpcy5fZGVjb3JhdG9yQ2FjaGUuc2V0KGRlY29yYXRvcktleSwgWy4uLmRlY29yYXRvcnMsIC4uLnZhbHVlXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdG8gYnVpbGQgdGhlIGxpc3Qgb2YgZGVjb3JhdG9ycyBmcm9tIHRoZSBnbG9iYWwgZGVjb3JhdG9yIG1hcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkZWNvcmF0b3JLZXkgIFRoZSBrZXkgb2YgdGhlIGRlY29yYXRvclxuICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgZGVjb3JhdG9yIHZhbHVlc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2J1aWxkRGVjb3JhdG9yTGlzdChkZWNvcmF0b3JLZXkpIHtcbiAgICAgICAgY29uc3QgYWxsRGVjb3JhdG9ycyA9IFtdO1xuICAgICAgICBsZXQgY29uc3RydWN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yO1xuICAgICAgICB3aGlsZSAoY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlTWFwID0gZGVjb3JhdG9yTWFwLmdldChjb25zdHJ1Y3Rvcik7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VNYXApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWNvcmF0b3JzID0gaW5zdGFuY2VNYXAuZ2V0KGRlY29yYXRvcktleSk7XG4gICAgICAgICAgICAgICAgaWYgKGRlY29yYXRvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsRGVjb3JhdG9ycy51bnNoaWZ0KC4uLmRlY29yYXRvcnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0cnVjdG9yID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNvbnN0cnVjdG9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsRGVjb3JhdG9ycztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdG8gcmV0cmlldmUgZGVjb3JhdG9yIHZhbHVlc1xuICAgICAqXG4gICAgICogQHBhcmFtIGRlY29yYXRvcktleSBUaGUga2V5IG9mIHRoZSBkZWNvcmF0b3JcbiAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBkZWNvcmF0b3IgdmFsdWVzXG4gICAgICovXG4gICAgZ2V0RGVjb3JhdG9yKGRlY29yYXRvcktleSkge1xuICAgICAgICBsZXQgYWxsRGVjb3JhdG9ycyA9IHRoaXMuX2RlY29yYXRvckNhY2hlLmdldChkZWNvcmF0b3JLZXkpO1xuICAgICAgICBpZiAoYWxsRGVjb3JhdG9ycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYWxsRGVjb3JhdG9ycztcbiAgICAgICAgfVxuICAgICAgICBhbGxEZWNvcmF0b3JzID0gdGhpcy5fYnVpbGREZWNvcmF0b3JMaXN0KGRlY29yYXRvcktleSk7XG4gICAgICAgIHRoaXMuX2RlY29yYXRvckNhY2hlLnNldChkZWNvcmF0b3JLZXksIGFsbERlY29yYXRvcnMpO1xuICAgICAgICByZXR1cm4gYWxsRGVjb3JhdG9ycztcbiAgICB9XG4gICAgX21hcERpZmZQcm9wZXJ0eVJlYWN0aW9ucyhuZXdQcm9wZXJ0aWVzLCBjaGFuZ2VkUHJvcGVydHlLZXlzKSB7XG4gICAgICAgIGNvbnN0IHJlYWN0aW9uRnVuY3Rpb25zID0gdGhpcy5nZXREZWNvcmF0b3IoJ2RpZmZSZWFjdGlvbicpO1xuICAgICAgICByZXR1cm4gcmVhY3Rpb25GdW5jdGlvbnMucmVkdWNlKChyZWFjdGlvblByb3BlcnR5TWFwLCB7IHJlYWN0aW9uLCBwcm9wZXJ0eU5hbWUgfSkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlYWN0aW9uQXJndW1lbnRzID0gcmVhY3Rpb25Qcm9wZXJ0eU1hcC5nZXQocmVhY3Rpb24pO1xuICAgICAgICAgICAgaWYgKHJlYWN0aW9uQXJndW1lbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZWFjdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNQcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgbmV3UHJvcGVydGllczoge30sXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWN0aW9uQXJndW1lbnRzLnByZXZpb3VzUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgcmVhY3Rpb25Bcmd1bWVudHMubmV3UHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gbmV3UHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0eUtleXMuaW5kZXhPZihwcm9wZXJ0eU5hbWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHJlYWN0aW9uQXJndW1lbnRzLmNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhY3Rpb25Qcm9wZXJ0eU1hcC5zZXQocmVhY3Rpb24sIHJlYWN0aW9uQXJndW1lbnRzKTtcbiAgICAgICAgICAgIHJldHVybiByZWFjdGlvblByb3BlcnR5TWFwO1xuICAgICAgICB9LCBuZXcgTWFwKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCaW5kcyB1bmJvdW5kIHByb3BlcnR5IGZ1bmN0aW9ucyB0byB0aGUgc3BlY2lmaWVkIGBiaW5kYCBwcm9wZXJ0eVxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgcHJvcGVydGllcyB0byBjaGVjayBmb3IgZnVuY3Rpb25zXG4gICAgICovXG4gICAgX2JpbmRGdW5jdGlvblByb3BlcnR5KHByb3BlcnR5LCBiaW5kKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkgPT09ICdmdW5jdGlvbicgJiYgIXByb3BlcnR5W25vQmluZF0gJiYgaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IocHJvcGVydHkpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5TWFwID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eU1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBiaW5kSW5mbyA9IHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5TWFwLmdldChwcm9wZXJ0eSkgfHwge307XG4gICAgICAgICAgICBsZXQgeyBib3VuZEZ1bmMsIHNjb3BlIH0gPSBiaW5kSW5mbztcbiAgICAgICAgICAgIGlmIChib3VuZEZ1bmMgPT09IHVuZGVmaW5lZCB8fCBzY29wZSAhPT0gYmluZCkge1xuICAgICAgICAgICAgICAgIGJvdW5kRnVuYyA9IHByb3BlcnR5LmJpbmQoYmluZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fYmluZEZ1bmN0aW9uUHJvcGVydHlNYXAuc2V0KHByb3BlcnR5LCB7IGJvdW5kRnVuYywgc2NvcGU6IGJpbmQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYm91bmRGdW5jO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eTtcbiAgICB9XG4gICAgZ2V0IHJlZ2lzdHJ5KCkge1xuICAgICAgICBpZiAodGhpcy5fcmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnlIYW5kbGVyKCk7XG4gICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeSk7XG4gICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeS5vbignaW52YWxpZGF0ZScsIHRoaXMuX2JvdW5kSW52YWxpZGF0ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWdpc3RyeTtcbiAgICB9XG4gICAgX3J1bkJlZm9yZVByb3BlcnRpZXMocHJvcGVydGllcykge1xuICAgICAgICBjb25zdCBiZWZvcmVQcm9wZXJ0aWVzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2JlZm9yZVByb3BlcnRpZXMnKTtcbiAgICAgICAgaWYgKGJlZm9yZVByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJlZm9yZVByb3BlcnRpZXMucmVkdWNlKChwcm9wZXJ0aWVzLCBiZWZvcmVQcm9wZXJ0aWVzRnVuY3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcHJvcGVydGllcywgYmVmb3JlUHJvcGVydGllc0Z1bmN0aW9uLmNhbGwodGhpcywgcHJvcGVydGllcykpO1xuICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcGVydGllcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSdW4gYWxsIHJlZ2lzdGVyZWQgYmVmb3JlIHJlbmRlcnMgYW5kIHJldHVybiB0aGUgdXBkYXRlZCByZW5kZXIgbWV0aG9kXG4gICAgICovXG4gICAgX3J1bkJlZm9yZVJlbmRlcnMoKSB7XG4gICAgICAgIGNvbnN0IGJlZm9yZVJlbmRlcnMgPSB0aGlzLmdldERlY29yYXRvcignYmVmb3JlUmVuZGVyJyk7XG4gICAgICAgIGlmIChiZWZvcmVSZW5kZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBiZWZvcmVSZW5kZXJzLnJlZHVjZSgocmVuZGVyLCBiZWZvcmVSZW5kZXJGdW5jdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRSZW5kZXIgPSBiZWZvcmVSZW5kZXJGdW5jdGlvbi5jYWxsKHRoaXMsIHJlbmRlciwgdGhpcy5fcHJvcGVydGllcywgdGhpcy5fY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIGlmICghdXBkYXRlZFJlbmRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlbmRlciBmdW5jdGlvbiBub3QgcmV0dXJuZWQgZnJvbSBiZWZvcmVSZW5kZXIsIHVzaW5nIHByZXZpb3VzIHJlbmRlcicpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlZFJlbmRlcjtcbiAgICAgICAgICAgIH0sIHRoaXMuX2JvdW5kUmVuZGVyRnVuYyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2JvdW5kUmVuZGVyRnVuYztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUnVuIGFsbCByZWdpc3RlcmVkIGFmdGVyIHJlbmRlcnMgYW5kIHJldHVybiB0aGUgZGVjb3JhdGVkIEROb2Rlc1xuICAgICAqXG4gICAgICogQHBhcmFtIGROb2RlIFRoZSBETm9kZXMgdG8gcnVuIHRocm91Z2ggdGhlIGFmdGVyIHJlbmRlcnNcbiAgICAgKi9cbiAgICBydW5BZnRlclJlbmRlcnMoZE5vZGUpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJSZW5kZXJzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2FmdGVyUmVuZGVyJyk7XG4gICAgICAgIGlmIChhZnRlclJlbmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGFmdGVyUmVuZGVycy5yZWR1Y2UoKGROb2RlLCBhZnRlclJlbmRlckZ1bmN0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFmdGVyUmVuZGVyRnVuY3Rpb24uY2FsbCh0aGlzLCBkTm9kZSk7XG4gICAgICAgICAgICB9LCBkTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX21ldGFNYXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fbWV0YU1hcC5mb3JFYWNoKChtZXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgbWV0YS5hZnRlclJlbmRlcigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGROb2RlO1xuICAgIH1cbiAgICBfcnVuQWZ0ZXJDb25zdHJ1Y3RvcnMoKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyQ29uc3RydWN0b3JzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2FmdGVyQ29uc3RydWN0b3InKTtcbiAgICAgICAgaWYgKGFmdGVyQ29uc3RydWN0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFmdGVyQ29uc3RydWN0b3JzLmZvckVhY2goKGFmdGVyQ29uc3RydWN0b3IpID0+IGFmdGVyQ29uc3RydWN0b3IuY2FsbCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb3duKGhhbmRsZSkge1xuICAgICAgICB0aGlzLl9oYW5kbGVzLnB1c2goaGFuZGxlKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuX2hhbmRsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy5faGFuZGxlcy5wb3AoKTtcbiAgICAgICAgICAgIGlmIChoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGUuZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBzdGF0aWMgaWRlbnRpZmllclxuICovXG5XaWRnZXRCYXNlLl90eXBlID0gV0lER0VUX0JBU0VfVFlQRTtcbmV4cG9ydCBkZWZhdWx0IFdpZGdldEJhc2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaWRnZXRCYXNlLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9XaWRnZXRCYXNlLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvV2lkZ2V0QmFzZS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJsZXQgYnJvd3NlclNwZWNpZmljVHJhbnNpdGlvbkVuZEV2ZW50TmFtZSA9ICcnO1xubGV0IGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSA9ICcnO1xuZnVuY3Rpb24gZGV0ZXJtaW5lQnJvd3NlclN0eWxlTmFtZXMoZWxlbWVudCkge1xuICAgIGlmICgnV2Via2l0VHJhbnNpdGlvbicgaW4gZWxlbWVudC5zdHlsZSkge1xuICAgICAgICBicm93c2VyU3BlY2lmaWNUcmFuc2l0aW9uRW5kRXZlbnROYW1lID0gJ3dlYmtpdFRyYW5zaXRpb25FbmQnO1xuICAgICAgICBicm93c2VyU3BlY2lmaWNBbmltYXRpb25FbmRFdmVudE5hbWUgPSAnd2Via2l0QW5pbWF0aW9uRW5kJztcbiAgICB9XG4gICAgZWxzZSBpZiAoJ3RyYW5zaXRpb24nIGluIGVsZW1lbnQuc3R5bGUgfHwgJ01velRyYW5zaXRpb24nIGluIGVsZW1lbnQuc3R5bGUpIHtcbiAgICAgICAgYnJvd3NlclNwZWNpZmljVHJhbnNpdGlvbkVuZEV2ZW50TmFtZSA9ICd0cmFuc2l0aW9uZW5kJztcbiAgICAgICAgYnJvd3NlclNwZWNpZmljQW5pbWF0aW9uRW5kRXZlbnROYW1lID0gJ2FuaW1hdGlvbmVuZCc7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdXIgYnJvd3NlciBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxufVxuZnVuY3Rpb24gaW5pdGlhbGl6ZShlbGVtZW50KSB7XG4gICAgaWYgKGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSA9PT0gJycpIHtcbiAgICAgICAgZGV0ZXJtaW5lQnJvd3NlclN0eWxlTmFtZXMoZWxlbWVudCk7XG4gICAgfVxufVxuZnVuY3Rpb24gcnVuQW5kQ2xlYW5VcChlbGVtZW50LCBzdGFydEFuaW1hdGlvbiwgZmluaXNoQW5pbWF0aW9uKSB7XG4gICAgaW5pdGlhbGl6ZShlbGVtZW50KTtcbiAgICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcbiAgICBsZXQgdHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFmaW5pc2hlZCkge1xuICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGJyb3dzZXJTcGVjaWZpY1RyYW5zaXRpb25FbmRFdmVudE5hbWUsIHRyYW5zaXRpb25FbmQpO1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSwgdHJhbnNpdGlvbkVuZCk7XG4gICAgICAgICAgICBmaW5pc2hBbmltYXRpb24oKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgc3RhcnRBbmltYXRpb24oKTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoYnJvd3NlclNwZWNpZmljQW5pbWF0aW9uRW5kRXZlbnROYW1lLCB0cmFuc2l0aW9uRW5kKTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoYnJvd3NlclNwZWNpZmljVHJhbnNpdGlvbkVuZEV2ZW50TmFtZSwgdHJhbnNpdGlvbkVuZCk7XG59XG5mdW5jdGlvbiBleGl0KG5vZGUsIHByb3BlcnRpZXMsIGV4aXRBbmltYXRpb24sIHJlbW92ZU5vZGUpIHtcbiAgICBjb25zdCBhY3RpdmVDbGFzcyA9IHByb3BlcnRpZXMuZXhpdEFuaW1hdGlvbkFjdGl2ZSB8fCBgJHtleGl0QW5pbWF0aW9ufS1hY3RpdmVgO1xuICAgIHJ1bkFuZENsZWFuVXAobm9kZSwgKCkgPT4ge1xuICAgICAgICBub2RlLmNsYXNzTGlzdC5hZGQoZXhpdEFuaW1hdGlvbik7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBub2RlLmNsYXNzTGlzdC5hZGQoYWN0aXZlQ2xhc3MpO1xuICAgICAgICB9KTtcbiAgICB9LCAoKSA9PiB7XG4gICAgICAgIHJlbW92ZU5vZGUoKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGVudGVyKG5vZGUsIHByb3BlcnRpZXMsIGVudGVyQW5pbWF0aW9uKSB7XG4gICAgY29uc3QgYWN0aXZlQ2xhc3MgPSBwcm9wZXJ0aWVzLmVudGVyQW5pbWF0aW9uQWN0aXZlIHx8IGAke2VudGVyQW5pbWF0aW9ufS1hY3RpdmVgO1xuICAgIHJ1bkFuZENsZWFuVXAobm9kZSwgKCkgPT4ge1xuICAgICAgICBub2RlLmNsYXNzTGlzdC5hZGQoZW50ZXJBbmltYXRpb24pO1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKGFjdGl2ZUNsYXNzKTtcbiAgICAgICAgfSk7XG4gICAgfSwgKCkgPT4ge1xuICAgICAgICBub2RlLmNsYXNzTGlzdC5yZW1vdmUoZW50ZXJBbmltYXRpb24pO1xuICAgICAgICBub2RlLmNsYXNzTGlzdC5yZW1vdmUoYWN0aXZlQ2xhc3MpO1xuICAgIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQge1xuICAgIGVudGVyLFxuICAgIGV4aXRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jc3NUcmFuc2l0aW9ucy5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvYW5pbWF0aW9ucy9jc3NUcmFuc2l0aW9ucy5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2FuaW1hdGlvbnMvY3NzVHJhbnNpdGlvbnMubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IFN5bWJvbCBmcm9tICdAZG9qby9zaGltL1N5bWJvbCc7XG4vKipcbiAqIFRoZSBzeW1ib2wgaWRlbnRpZmllciBmb3IgYSBXTm9kZSB0eXBlXG4gKi9cbmV4cG9ydCBjb25zdCBXTk9ERSA9IFN5bWJvbCgnSWRlbnRpZmllciBmb3IgYSBXTm9kZS4nKTtcbi8qKlxuICogVGhlIHN5bWJvbCBpZGVudGlmaWVyIGZvciBhIFZOb2RlIHR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IFZOT0RFID0gU3ltYm9sKCdJZGVudGlmaWVyIGZvciBhIFZOb2RlLicpO1xuLyoqXG4gKiBUaGUgc3ltYm9sIGlkZW50aWZpZXIgZm9yIGEgVk5vZGUgdHlwZSBjcmVhdGVkIHVzaW5nIGRvbSgpXG4gKi9cbmV4cG9ydCBjb25zdCBET01WTk9ERSA9IFN5bWJvbCgnSWRlbnRpZmllciBmb3IgYSBWTm9kZSBjcmVhdGVkIHVzaW5nIGV4aXN0aW5nIGRvbS4nKTtcbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBgRE5vZGVgIGlzIGEgYFdOb2RlYCB1c2luZyB0aGUgYHR5cGVgIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1dOb2RlKGNoaWxkKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oY2hpbGQgJiYgdHlwZW9mIGNoaWxkICE9PSAnc3RyaW5nJyAmJiBjaGlsZC50eXBlID09PSBXTk9ERSk7XG59XG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgYEROb2RlYCBpcyBhIGBWTm9kZWAgdXNpbmcgdGhlIGB0eXBlYCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWTm9kZShjaGlsZCkge1xuICAgIHJldHVybiBCb29sZWFuKGNoaWxkICYmIHR5cGVvZiBjaGlsZCAhPT0gJ3N0cmluZycgJiYgKGNoaWxkLnR5cGUgPT09IFZOT0RFIHx8IGNoaWxkLnR5cGUgPT09IERPTVZOT0RFKSk7XG59XG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgYEROb2RlYCBpcyBhIGBWTm9kZWAgY3JlYXRlZCB3aXRoIGBkb20oKWAgdXNpbmcgdGhlIGB0eXBlYCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEb21WTm9kZShjaGlsZCkge1xuICAgIHJldHVybiBCb29sZWFuKGNoaWxkICYmIHR5cGVvZiBjaGlsZCAhPT0gJ3N0cmluZycgJiYgY2hpbGQudHlwZSA9PT0gRE9NVk5PREUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRWxlbWVudE5vZGUodmFsdWUpIHtcbiAgICByZXR1cm4gISF2YWx1ZS50YWdOYW1lO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY29yYXRlKGROb2Rlcywgb3B0aW9uc09yTW9kaWZpZXIsIHByZWRpY2F0ZSkge1xuICAgIGxldCBzaGFsbG93ID0gZmFsc2U7XG4gICAgbGV0IG1vZGlmaWVyO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uc09yTW9kaWZpZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbW9kaWZpZXIgPSBvcHRpb25zT3JNb2RpZmllcjtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG1vZGlmaWVyID0gb3B0aW9uc09yTW9kaWZpZXIubW9kaWZpZXI7XG4gICAgICAgIHByZWRpY2F0ZSA9IG9wdGlvbnNPck1vZGlmaWVyLnByZWRpY2F0ZTtcbiAgICAgICAgc2hhbGxvdyA9IG9wdGlvbnNPck1vZGlmaWVyLnNoYWxsb3cgfHwgZmFsc2U7XG4gICAgfVxuICAgIGxldCBub2RlcyA9IEFycmF5LmlzQXJyYXkoZE5vZGVzKSA/IFsuLi5kTm9kZXNdIDogW2ROb2Rlc107XG4gICAgZnVuY3Rpb24gYnJlYWtlcigpIHtcbiAgICAgICAgbm9kZXMgPSBbXTtcbiAgICB9XG4gICAgd2hpbGUgKG5vZGVzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBub2RlID0gbm9kZXMuc2hpZnQoKTtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIGlmICghc2hhbGxvdyAmJiAoaXNXTm9kZShub2RlKSB8fCBpc1ZOb2RlKG5vZGUpKSAmJiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgbm9kZXMgPSBbLi4ubm9kZXMsIC4uLm5vZGUuY2hpbGRyZW5dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwcmVkaWNhdGUgfHwgcHJlZGljYXRlKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgbW9kaWZpZXIobm9kZSwgYnJlYWtlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGROb2Rlcztcbn1cbi8qKlxuICogV3JhcHBlciBmdW5jdGlvbiBmb3IgY2FsbHMgdG8gY3JlYXRlIGEgd2lkZ2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdyh3aWRnZXRDb25zdHJ1Y3RvciwgcHJvcGVydGllcywgY2hpbGRyZW4gPSBbXSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICB3aWRnZXRDb25zdHJ1Y3RvcixcbiAgICAgICAgcHJvcGVydGllcyxcbiAgICAgICAgdHlwZTogV05PREVcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHYodGFnLCBwcm9wZXJ0aWVzT3JDaGlsZHJlbiA9IHt9LCBjaGlsZHJlbiA9IHVuZGVmaW5lZCkge1xuICAgIGxldCBwcm9wZXJ0aWVzID0gcHJvcGVydGllc09yQ2hpbGRyZW47XG4gICAgbGV0IGRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BlcnRpZXNPckNoaWxkcmVuKSkge1xuICAgICAgICBjaGlsZHJlbiA9IHByb3BlcnRpZXNPckNoaWxkcmVuO1xuICAgICAgICBwcm9wZXJ0aWVzID0ge307XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcHJvcGVydGllcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBkZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayA9IHByb3BlcnRpZXM7XG4gICAgICAgIHByb3BlcnRpZXMgPSB7fTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGFnLFxuICAgICAgICBkZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayxcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgIHR5cGU6IFZOT0RFXG4gICAgfTtcbn1cbi8qKlxuICogQ3JlYXRlIGEgVk5vZGUgZm9yIGFuIGV4aXN0aW5nIERPTSBOb2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZG9tKHsgbm9kZSwgYXR0cnMgPSB7fSwgcHJvcHMgPSB7fSwgb24gPSB7fSwgZGlmZlR5cGUgPSAnbm9uZScgfSwgY2hpbGRyZW4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0YWc6IGlzRWxlbWVudE5vZGUobm9kZSkgPyBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA6ICcnLFxuICAgICAgICBwcm9wZXJ0aWVzOiBwcm9wcyxcbiAgICAgICAgYXR0cmlidXRlczogYXR0cnMsXG4gICAgICAgIGV2ZW50czogb24sXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICB0eXBlOiBET01WTk9ERSxcbiAgICAgICAgZG9tTm9kZTogbm9kZSxcbiAgICAgICAgdGV4dDogaXNFbGVtZW50Tm9kZShub2RlKSA/IHVuZGVmaW5lZCA6IG5vZGUuZGF0YSxcbiAgICAgICAgZGlmZlR5cGVcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2QubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi9oYW5kbGVEZWNvcmF0b3InO1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyUmVuZGVyKG1ldGhvZCkge1xuICAgIHJldHVybiBoYW5kbGVEZWNvcmF0b3IoKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcignYWZ0ZXJSZW5kZXInLCBwcm9wZXJ0eUtleSA/IHRhcmdldFtwcm9wZXJ0eUtleV0gOiBtZXRob2QpO1xuICAgIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQgYWZ0ZXJSZW5kZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hZnRlclJlbmRlci5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9hZnRlclJlbmRlci5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYWZ0ZXJSZW5kZXIubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi9oYW5kbGVEZWNvcmF0b3InO1xuaW1wb3J0IHsgYmVmb3JlUHJvcGVydGllcyB9IGZyb20gJy4vYmVmb3JlUHJvcGVydGllcyc7XG5leHBvcnQgZnVuY3Rpb24gYWx3YXlzUmVuZGVyKCkge1xuICAgIHJldHVybiBoYW5kbGVEZWNvcmF0b3IoKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICAgICAgYmVmb3JlUHJvcGVydGllcyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmludmFsaWRhdGUoKTtcbiAgICAgICAgfSkodGFyZ2V0KTtcbiAgICB9KTtcbn1cbmV4cG9ydCBkZWZhdWx0IGFsd2F5c1JlbmRlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFsd2F5c1JlbmRlci5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9hbHdheXNSZW5kZXIubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2Fsd2F5c1JlbmRlci5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgeyBoYW5kbGVEZWNvcmF0b3IgfSBmcm9tICcuL2hhbmRsZURlY29yYXRvcic7XG5leHBvcnQgZnVuY3Rpb24gYmVmb3JlUHJvcGVydGllcyhtZXRob2QpIHtcbiAgICByZXR1cm4gaGFuZGxlRGVjb3JhdG9yKCh0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICAgIHRhcmdldC5hZGREZWNvcmF0b3IoJ2JlZm9yZVByb3BlcnRpZXMnLCBwcm9wZXJ0eUtleSA/IHRhcmdldFtwcm9wZXJ0eUtleV0gOiBtZXRob2QpO1xuICAgIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQgYmVmb3JlUHJvcGVydGllcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJlZm9yZVByb3BlcnRpZXMubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYmVmb3JlUHJvcGVydGllcy5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYmVmb3JlUHJvcGVydGllcy5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgeyBDdXN0b21FbGVtZW50Q2hpbGRUeXBlIH0gZnJvbSAnLi4vcmVnaXN0ZXJDdXN0b21FbGVtZW50JztcbmltcG9ydCBSZWdpc3RyeSBmcm9tICcuLi9SZWdpc3RyeSc7XG4vKipcbiAqIFRoaXMgRGVjb3JhdG9yIGlzIHByb3ZpZGVkIHByb3BlcnRpZXMgdGhhdCBkZWZpbmUgdGhlIGJlaGF2aW9yIG9mIGEgY3VzdG9tIGVsZW1lbnQsIGFuZFxuICogcmVnaXN0ZXJzIHRoYXQgY3VzdG9tIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjdXN0b21FbGVtZW50KHsgdGFnLCBwcm9wZXJ0aWVzID0gW10sIGF0dHJpYnV0ZXMgPSBbXSwgZXZlbnRzID0gW10sIGNoaWxkVHlwZSA9IEN1c3RvbUVsZW1lbnRDaGlsZFR5cGUuRE9KTywgcmVnaXN0cnlGYWN0b3J5ID0gKCkgPT4gbmV3IFJlZ2lzdHJ5KCkgfSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5wcm90b3R5cGUuX19jdXN0b21FbGVtZW50RGVzY3JpcHRvciA9IHtcbiAgICAgICAgICAgIHRhZ05hbWU6IHRhZyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICAgICAgZXZlbnRzLFxuICAgICAgICAgICAgY2hpbGRUeXBlLFxuICAgICAgICAgICAgcmVnaXN0cnlGYWN0b3J5XG4gICAgICAgIH07XG4gICAgfTtcbn1cbmV4cG9ydCBkZWZhdWx0IGN1c3RvbUVsZW1lbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jdXN0b21FbGVtZW50Lm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2N1c3RvbUVsZW1lbnQubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2N1c3RvbUVsZW1lbnQubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi9oYW5kbGVEZWNvcmF0b3InO1xuLyoqXG4gKiBEZWNvcmF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byByZWdpc3RlciBhIGZ1bmN0aW9uIGFzIGEgc3BlY2lmaWMgcHJvcGVydHkgZGlmZlxuICpcbiAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvZiB3aGljaCB0aGUgZGlmZiBmdW5jdGlvbiBpcyBhcHBsaWVkXG4gKiBAcGFyYW0gZGlmZlR5cGUgICAgICBUaGUgZGlmZiB0eXBlLCBkZWZhdWx0IGlzIERpZmZUeXBlLkFVVE8uXG4gKiBAcGFyYW0gZGlmZkZ1bmN0aW9uICBBIGRpZmYgZnVuY3Rpb24gdG8gcnVuIGlmIGRpZmZUeXBlIGlmIERpZmZUeXBlLkNVU1RPTVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZlByb3BlcnR5KHByb3BlcnR5TmFtZSwgZGlmZkZ1bmN0aW9uLCByZWFjdGlvbkZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIGhhbmRsZURlY29yYXRvcigodGFyZ2V0LCBwcm9wZXJ0eUtleSkgPT4ge1xuICAgICAgICB0YXJnZXQuYWRkRGVjb3JhdG9yKGBkaWZmUHJvcGVydHk6JHtwcm9wZXJ0eU5hbWV9YCwgZGlmZkZ1bmN0aW9uLmJpbmQobnVsbCkpO1xuICAgICAgICB0YXJnZXQuYWRkRGVjb3JhdG9yKCdyZWdpc3RlcmVkRGlmZlByb3BlcnR5JywgcHJvcGVydHlOYW1lKTtcbiAgICAgICAgaWYgKHJlYWN0aW9uRnVuY3Rpb24gfHwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIHRhcmdldC5hZGREZWNvcmF0b3IoJ2RpZmZSZWFjdGlvbicsIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICAgICAgcmVhY3Rpb246IHByb3BlcnR5S2V5ID8gdGFyZ2V0W3Byb3BlcnR5S2V5XSA6IHJlYWN0aW9uRnVuY3Rpb25cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnQgZGVmYXVsdCBkaWZmUHJvcGVydHk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWZmUHJvcGVydHkubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvZGlmZlByb3BlcnR5Lm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9kaWZmUHJvcGVydHkubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiLyoqXG4gKiBHZW5lcmljIGRlY29yYXRvciBoYW5kbGVyIHRvIHRha2UgY2FyZSBvZiB3aGV0aGVyIG9yIG5vdCB0aGUgZGVjb3JhdG9yIHdhcyBjYWxsZWQgYXQgdGhlIGNsYXNzIGxldmVsXG4gKiBvciB0aGUgbWV0aG9kIGxldmVsLlxuICpcbiAqIEBwYXJhbSBoYW5kbGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVEZWNvcmF0b3IoaGFuZGxlcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikge1xuICAgICAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaGFuZGxlcih0YXJnZXQucHJvdG90eXBlLCB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaGFuZGxlcih0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgIH07XG59XG5leHBvcnQgZGVmYXVsdCBoYW5kbGVEZWNvcmF0b3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYW5kbGVEZWNvcmF0b3IubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaGFuZGxlRGVjb3JhdG9yLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9oYW5kbGVEZWNvcmF0b3IubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IFdlYWtNYXAgZnJvbSAnQGRvam8vc2hpbS9XZWFrTWFwJztcbmltcG9ydCB7IGhhbmRsZURlY29yYXRvciB9IGZyb20gJy4vaGFuZGxlRGVjb3JhdG9yJztcbmltcG9ydCB7IGJlZm9yZVByb3BlcnRpZXMgfSBmcm9tICcuL2JlZm9yZVByb3BlcnRpZXMnO1xuLyoqXG4gKiBNYXAgb2YgaW5zdGFuY2VzIGFnYWluc3QgcmVnaXN0ZXJlZCBpbmplY3RvcnMuXG4gKi9cbmNvbnN0IHJlZ2lzdGVyZWRJbmplY3RvcnNNYXAgPSBuZXcgV2Vha01hcCgpO1xuLyoqXG4gKiBEZWNvcmF0b3IgcmV0cmlldmVzIGFuIGluamVjdG9yIGZyb20gYW4gYXZhaWxhYmxlIHJlZ2lzdHJ5IHVzaW5nIHRoZSBuYW1lIGFuZFxuICogY2FsbHMgdGhlIGBnZXRQcm9wZXJ0aWVzYCBmdW5jdGlvbiB3aXRoIHRoZSBwYXlsb2FkIGZyb20gdGhlIGluamVjdG9yXG4gKiBhbmQgY3VycmVudCBwcm9wZXJ0aWVzIHdpdGggdGhlIHRoZSBpbmplY3RlZCBwcm9wZXJ0aWVzIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSBJbmplY3RDb25maWcgdGhlIGluamVjdCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3QoeyBuYW1lLCBnZXRQcm9wZXJ0aWVzIH0pIHtcbiAgICByZXR1cm4gaGFuZGxlRGVjb3JhdG9yKCh0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICAgIGJlZm9yZVByb3BlcnRpZXMoZnVuY3Rpb24gKHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGluamVjdG9ySXRlbSA9IHRoaXMucmVnaXN0cnkuZ2V0SW5qZWN0b3IobmFtZSk7XG4gICAgICAgICAgICBpZiAoaW5qZWN0b3JJdGVtKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBpbmplY3RvciwgaW52YWxpZGF0b3IgfSA9IGluamVjdG9ySXRlbTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWdpc3RlcmVkSW5qZWN0b3JzID0gcmVnaXN0ZXJlZEluamVjdG9yc01hcC5nZXQodGhpcykgfHwgW107XG4gICAgICAgICAgICAgICAgaWYgKHJlZ2lzdGVyZWRJbmplY3RvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWRJbmplY3RvcnNNYXAuc2V0KHRoaXMsIHJlZ2lzdGVyZWRJbmplY3RvcnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVnaXN0ZXJlZEluamVjdG9ycy5pbmRleE9mKGluamVjdG9ySXRlbSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3duKGludmFsaWRhdG9yLm9uKCdpbnZhbGlkYXRlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJlZEluamVjdG9ycy5wdXNoKGluamVjdG9ySXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0aWVzKGluamVjdG9yKCksIHByb3BlcnRpZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSh0YXJnZXQpO1xuICAgIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQgaW5qZWN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5qZWN0Lm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2luamVjdC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaW5qZWN0Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCB7IFdJREdFVF9CQVNFX1RZUEUgfSBmcm9tICcuL1JlZ2lzdHJ5JztcbmZ1bmN0aW9uIGlzT2JqZWN0T3JBcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhbHdheXMocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjaGFuZ2VkOiB0cnVlLFxuICAgICAgICB2YWx1ZTogbmV3UHJvcGVydHlcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZShwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5nZWQ6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogbmV3UHJvcGVydHlcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlZmVyZW5jZShwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5nZWQ6IHByZXZpb3VzUHJvcGVydHkgIT09IG5ld1Byb3BlcnR5LFxuICAgICAgICB2YWx1ZTogbmV3UHJvcGVydHlcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNoYWxsb3cocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpIHtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHZhbGlkT2xkUHJvcGVydHkgPSBwcmV2aW91c1Byb3BlcnR5ICYmIGlzT2JqZWN0T3JBcnJheShwcmV2aW91c1Byb3BlcnR5KTtcbiAgICBjb25zdCB2YWxpZE5ld1Byb3BlcnR5ID0gbmV3UHJvcGVydHkgJiYgaXNPYmplY3RPckFycmF5KG5ld1Byb3BlcnR5KTtcbiAgICBpZiAoIXZhbGlkT2xkUHJvcGVydHkgfHwgIXZhbGlkTmV3UHJvcGVydHkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNoYW5nZWQ6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbmV3UHJvcGVydHlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcHJldmlvdXNLZXlzID0gT2JqZWN0LmtleXMocHJldmlvdXNQcm9wZXJ0eSk7XG4gICAgY29uc3QgbmV3S2V5cyA9IE9iamVjdC5rZXlzKG5ld1Byb3BlcnR5KTtcbiAgICBpZiAocHJldmlvdXNLZXlzLmxlbmd0aCAhPT0gbmV3S2V5cy5sZW5ndGgpIHtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjaGFuZ2VkID0gbmV3S2V5cy5zb21lKChrZXkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXdQcm9wZXJ0eVtrZXldICE9PSBwcmV2aW91c1Byb3BlcnR5W2tleV07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBjaGFuZ2VkLFxuICAgICAgICB2YWx1ZTogbmV3UHJvcGVydHlcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGF1dG8ocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmICh0eXBlb2YgbmV3UHJvcGVydHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKG5ld1Byb3BlcnR5Ll90eXBlID09PSBXSURHRVRfQkFTRV9UWVBFKSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZWZlcmVuY2UocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gaWdub3JlKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChpc09iamVjdE9yQXJyYXkobmV3UHJvcGVydHkpKSB7XG4gICAgICAgIHJlc3VsdCA9IHNoYWxsb3cocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gcmVmZXJlbmNlKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRpZmYubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RpZmYubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kaWZmLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBhc3NpZ24gfSBmcm9tICdAZG9qby9jb3JlL2xhbmcnO1xuaW1wb3J0IGNzc1RyYW5zaXRpb25zIGZyb20gJy4uL2FuaW1hdGlvbnMvY3NzVHJhbnNpdGlvbnMnO1xuaW1wb3J0IHsgYWZ0ZXJSZW5kZXIgfSBmcm9tICcuLy4uL2RlY29yYXRvcnMvYWZ0ZXJSZW5kZXInO1xuaW1wb3J0IHsgdiB9IGZyb20gJy4vLi4vZCc7XG5pbXBvcnQgeyBkb20gfSBmcm9tICcuLy4uL3Zkb20nO1xuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBhdHRhY2ggc3RhdGUgb2YgdGhlIHByb2plY3RvclxuICovXG5leHBvcnQgdmFyIFByb2plY3RvckF0dGFjaFN0YXRlO1xuKGZ1bmN0aW9uIChQcm9qZWN0b3JBdHRhY2hTdGF0ZSkge1xuICAgIFByb2plY3RvckF0dGFjaFN0YXRlW1Byb2plY3RvckF0dGFjaFN0YXRlW1wiQXR0YWNoZWRcIl0gPSAxXSA9IFwiQXR0YWNoZWRcIjtcbiAgICBQcm9qZWN0b3JBdHRhY2hTdGF0ZVtQcm9qZWN0b3JBdHRhY2hTdGF0ZVtcIkRldGFjaGVkXCJdID0gMl0gPSBcIkRldGFjaGVkXCI7XG59KShQcm9qZWN0b3JBdHRhY2hTdGF0ZSB8fCAoUHJvamVjdG9yQXR0YWNoU3RhdGUgPSB7fSkpO1xuLyoqXG4gKiBBdHRhY2ggdHlwZSBmb3IgdGhlIHByb2plY3RvclxuICovXG5leHBvcnQgdmFyIEF0dGFjaFR5cGU7XG4oZnVuY3Rpb24gKEF0dGFjaFR5cGUpIHtcbiAgICBBdHRhY2hUeXBlW0F0dGFjaFR5cGVbXCJBcHBlbmRcIl0gPSAxXSA9IFwiQXBwZW5kXCI7XG4gICAgQXR0YWNoVHlwZVtBdHRhY2hUeXBlW1wiTWVyZ2VcIl0gPSAyXSA9IFwiTWVyZ2VcIjtcbn0pKEF0dGFjaFR5cGUgfHwgKEF0dGFjaFR5cGUgPSB7fSkpO1xuZXhwb3J0IGZ1bmN0aW9uIFByb2plY3Rvck1peGluKEJhc2UpIHtcbiAgICBjbGFzcyBQcm9qZWN0b3IgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykge1xuICAgICAgICAgICAgc3VwZXIoLi4uYXJncyk7XG4gICAgICAgICAgICB0aGlzLl9yb290ID0gZG9jdW1lbnQuYm9keTtcbiAgICAgICAgICAgIHRoaXMuX2FzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX3Byb2plY3RvclByb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rpb25PcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25zOiBjc3NUcmFuc2l0aW9uc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IGRvY3VtZW50LmJvZHk7XG4gICAgICAgICAgICB0aGlzLnByb2plY3RvclN0YXRlID0gUHJvamVjdG9yQXR0YWNoU3RhdGUuRGV0YWNoZWQ7XG4gICAgICAgIH1cbiAgICAgICAgYXBwZW5kKHJvb3QpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogQXR0YWNoVHlwZS5BcHBlbmQsXG4gICAgICAgICAgICAgICAgcm9vdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdHRhY2gob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgbWVyZ2Uocm9vdCkge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBBdHRhY2hUeXBlLk1lcmdlLFxuICAgICAgICAgICAgICAgIHJvb3RcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXR0YWNoKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHNldCByb290KHJvb3QpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb2plY3RvclN0YXRlID09PSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5BdHRhY2hlZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJvamVjdG9yIGFscmVhZHkgYXR0YWNoZWQsIGNhbm5vdCBjaGFuZ2Ugcm9vdCBlbGVtZW50Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9yb290ID0gcm9vdDtcbiAgICAgICAgfVxuICAgICAgICBnZXQgcm9vdCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yb290O1xuICAgICAgICB9XG4gICAgICAgIGdldCBhc3luYygpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hc3luYztcbiAgICAgICAgfVxuICAgICAgICBzZXQgYXN5bmMoYXN5bmMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb2plY3RvclN0YXRlID09PSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5BdHRhY2hlZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJvamVjdG9yIGFscmVhZHkgYXR0YWNoZWQsIGNhbm5vdCBjaGFuZ2UgYXN5bmMgbW9kZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fYXN5bmMgPSBhc3luYztcbiAgICAgICAgfVxuICAgICAgICBzYW5kYm94KGRvYyA9IGRvY3VtZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9qZWN0b3JTdGF0ZSA9PT0gUHJvamVjdG9yQXR0YWNoU3RhdGUuQXR0YWNoZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2plY3RvciBhbHJlYWR5IGF0dGFjaGVkLCBjYW5ub3QgY3JlYXRlIHNhbmRib3gnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2FzeW5jID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c1Jvb3QgPSB0aGlzLnJvb3Q7XG4gICAgICAgICAgICAvKiBmcmVlIHVwIHRoZSBkb2N1bWVudCBmcmFnbWVudCBmb3IgR0MgKi9cbiAgICAgICAgICAgIHRoaXMub3duKHtcbiAgICAgICAgICAgICAgICBkZXN0cm95OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Jvb3QgPSBwcmV2aW91c1Jvb3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl9hdHRhY2goe1xuICAgICAgICAgICAgICAgIC8qIERvY3VtZW50RnJhZ21lbnQgaXMgbm90IGFzc2lnbmFibGUgdG8gRWxlbWVudCwgYnV0IHByb3ZpZGVzIGV2ZXJ5dGhpbmcgbmVlZGVkIHRvIHdvcmsgKi9cbiAgICAgICAgICAgICAgICByb290OiBkb2MuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuICAgICAgICAgICAgICAgIHR5cGU6IEF0dGFjaFR5cGUuQXBwZW5kXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBzZXRDaGlsZHJlbihjaGlsZHJlbikge1xuICAgICAgICAgICAgdGhpcy5fX3NldENoaWxkcmVuX18oY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIHNldFByb3BlcnRpZXMocHJvcGVydGllcykge1xuICAgICAgICAgICAgdGhpcy5fX3NldFByb3BlcnRpZXNfXyhwcm9wZXJ0aWVzKTtcbiAgICAgICAgfVxuICAgICAgICBfX3NldFByb3BlcnRpZXNfXyhwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcHJvamVjdG9yUHJvcGVydGllcyAmJiB0aGlzLl9wcm9qZWN0b3JQcm9wZXJ0aWVzLnJlZ2lzdHJ5ICE9PSBwcm9wZXJ0aWVzLnJlZ2lzdHJ5KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Byb2plY3RvclByb3BlcnRpZXMucmVnaXN0cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvamVjdG9yUHJvcGVydGllcy5yZWdpc3RyeS5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcHJvamVjdG9yUHJvcGVydGllcyA9IGFzc2lnbih7fSwgcHJvcGVydGllcyk7XG4gICAgICAgICAgICBzdXBlci5fX3NldENvcmVQcm9wZXJ0aWVzX18oeyBiaW5kOiB0aGlzLCBiYXNlUmVnaXN0cnk6IHByb3BlcnRpZXMucmVnaXN0cnkgfSk7XG4gICAgICAgICAgICBzdXBlci5fX3NldFByb3BlcnRpZXNfXyhwcm9wZXJ0aWVzKTtcbiAgICAgICAgfVxuICAgICAgICB0b0h0bWwoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9qZWN0b3JTdGF0ZSAhPT0gUHJvamVjdG9yQXR0YWNoU3RhdGUuQXR0YWNoZWQgfHwgIXRoaXMuX3Byb2plY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2plY3RvciBpcyBub3QgYXR0YWNoZWQsIGNhbm5vdCByZXR1cm4gYW4gSFRNTCBzdHJpbmcgb2YgcHJvamVjdGlvbi4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9qZWN0aW9uLmRvbU5vZGUuY2hpbGROb2Rlc1swXS5vdXRlckhUTUw7XG4gICAgICAgIH1cbiAgICAgICAgYWZ0ZXJSZW5kZXIocmVzdWx0KSB7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IHJlc3VsdDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyB8fCByZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBub2RlID0gdignc3BhbicsIHt9LCBbcmVzdWx0XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBkZXN0cm95KCkge1xuICAgICAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIF9hdHRhY2goeyB0eXBlLCByb290IH0pIHtcbiAgICAgICAgICAgIGlmIChyb290KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb290ID0gcm9vdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9hdHRhY2hIYW5kbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYXR0YWNoSGFuZGxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcm9qZWN0b3JTdGF0ZSA9IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkO1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0ge1xuICAgICAgICAgICAgICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvamVjdG9yU3RhdGUgPT09IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm9qZWN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0b3JTdGF0ZSA9IFByb2plY3RvckF0dGFjaFN0YXRlLkRldGFjaGVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMub3duKGhhbmRsZSk7XG4gICAgICAgICAgICB0aGlzLl9hdHRhY2hIYW5kbGUgPSBoYW5kbGU7XG4gICAgICAgICAgICB0aGlzLl9wcm9qZWN0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3Byb2plY3Rpb25PcHRpb25zLCB7IHN5bmM6ICF0aGlzLl9hc3luYyB9KTtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgQXR0YWNoVHlwZS5BcHBlbmQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rpb24gPSBkb20uYXBwZW5kKHRoaXMucm9vdCwgdGhpcywgdGhpcy5fcHJvamVjdGlvbk9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEF0dGFjaFR5cGUuTWVyZ2U6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rpb24gPSBkb20ubWVyZ2UodGhpcy5yb290LCB0aGlzLCB0aGlzLl9wcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2F0dGFjaEhhbmRsZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0c2xpYl8xLl9fZGVjb3JhdGUoW1xuICAgICAgICBhZnRlclJlbmRlcigpLFxuICAgICAgICB0c2xpYl8xLl9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBGdW5jdGlvbiksXG4gICAgICAgIHRzbGliXzEuX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtPYmplY3RdKSxcbiAgICAgICAgdHNsaWJfMS5fX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuICAgIF0sIFByb2plY3Rvci5wcm90b3R5cGUsIFwiYWZ0ZXJSZW5kZXJcIiwgbnVsbCk7XG4gICAgcmV0dXJuIFByb2plY3Rvcjtcbn1cbmV4cG9ydCBkZWZhdWx0IFByb2plY3Rvck1peGluO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJvamVjdG9yLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9taXhpbnMvUHJvamVjdG9yLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvbWl4aW5zL1Byb2plY3Rvci5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgSW5qZWN0b3IgfSBmcm9tICcuLy4uL0luamVjdG9yJztcbmltcG9ydCB7IGluamVjdCB9IGZyb20gJy4vLi4vZGVjb3JhdG9ycy9pbmplY3QnO1xuaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi8uLi9kZWNvcmF0b3JzL2hhbmRsZURlY29yYXRvcic7XG5pbXBvcnQgeyBkaWZmUHJvcGVydHkgfSBmcm9tICcuLy4uL2RlY29yYXRvcnMvZGlmZlByb3BlcnR5JztcbmltcG9ydCB7IHNoYWxsb3cgfSBmcm9tICcuLy4uL2RpZmYnO1xuY29uc3QgVEhFTUVfS0VZID0gJyBfa2V5JztcbmV4cG9ydCBjb25zdCBJTkpFQ1RFRF9USEVNRV9LRVkgPSBTeW1ib2woJ3RoZW1lJyk7XG4vKipcbiAqIERlY29yYXRvciBmb3IgYmFzZSBjc3MgY2xhc3Nlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGhlbWUodGhlbWUpIHtcbiAgICByZXR1cm4gaGFuZGxlRGVjb3JhdG9yKCh0YXJnZXQpID0+IHtcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcignYmFzZVRoZW1lQ2xhc3NlcycsIHRoZW1lKTtcbiAgICB9KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIHJldmVyc2UgbG9va3VwIGZvciB0aGUgY2xhc3NlcyBwYXNzZWQgaW4gdmlhIHRoZSBgdGhlbWVgIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBjbGFzc2VzIFRoZSBiYXNlQ2xhc3NlcyBvYmplY3RcbiAqIEByZXF1aXJlc1xuICovXG5mdW5jdGlvbiBjcmVhdGVUaGVtZUNsYXNzZXNMb29rdXAoY2xhc3Nlcykge1xuICAgIHJldHVybiBjbGFzc2VzLnJlZHVjZSgoY3VycmVudENsYXNzTmFtZXMsIGJhc2VDbGFzcykgPT4ge1xuICAgICAgICBPYmplY3Qua2V5cyhiYXNlQ2xhc3MpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgY3VycmVudENsYXNzTmFtZXNbYmFzZUNsYXNzW2tleV1dID0ga2V5O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzc05hbWVzO1xuICAgIH0sIHt9KTtcbn1cbi8qKlxuICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBpcyBnaXZlbiBhIHRoZW1lIGFuZCBhbiBvcHRpb25hbCByZWdpc3RyeSwgdGhlIHRoZW1lXG4gKiBpbmplY3RvciBpcyBkZWZpbmVkIGFnYWluc3QgdGhlIHJlZ2lzdHJ5LCByZXR1cm5pbmcgdGhlIHRoZW1lLlxuICpcbiAqIEBwYXJhbSB0aGVtZSB0aGUgdGhlbWUgdG8gc2V0XG4gKiBAcGFyYW0gdGhlbWVSZWdpc3RyeSByZWdpc3RyeSB0byBkZWZpbmUgdGhlIHRoZW1lIGluamVjdG9yIGFnYWluc3QuIERlZmF1bHRzXG4gKiB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5XG4gKlxuICogQHJldHVybnMgdGhlIHRoZW1lIGluamVjdG9yIHVzZWQgdG8gc2V0IHRoZSB0aGVtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJUaGVtZUluamVjdG9yKHRoZW1lLCB0aGVtZVJlZ2lzdHJ5KSB7XG4gICAgY29uc3QgdGhlbWVJbmplY3RvciA9IG5ldyBJbmplY3Rvcih0aGVtZSk7XG4gICAgdGhlbWVSZWdpc3RyeS5kZWZpbmVJbmplY3RvcihJTkpFQ1RFRF9USEVNRV9LRVksIChpbnZhbGlkYXRvcikgPT4ge1xuICAgICAgICB0aGVtZUluamVjdG9yLnNldEludmFsaWRhdG9yKGludmFsaWRhdG9yKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHRoZW1lSW5qZWN0b3IuZ2V0KCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoZW1lSW5qZWN0b3I7XG59XG4vKipcbiAqIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGNsYXNzIGRlY29yYXRlZCB3aXRoIHdpdGggVGhlbWVkIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFRoZW1lZE1peGluKEJhc2UpIHtcbiAgICBsZXQgVGhlbWVkID0gY2xhc3MgVGhlbWVkIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogUmVnaXN0ZXJlZCBiYXNlIHRoZW1lIGtleXNcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZEJhc2VUaGVtZUtleXMgPSBbXTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogSW5kaWNhdGVzIGlmIGNsYXNzZXMgbWV0YSBkYXRhIG5lZWQgdG8gYmUgY2FsY3VsYXRlZC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy5fcmVjYWxjdWxhdGVDbGFzc2VzID0gdHJ1ZTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogTG9hZGVkIHRoZW1lXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXMuX3RoZW1lID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhlbWUoY2xhc3Nlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JlY2FsY3VsYXRlQ2xhc3Nlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlY2FsY3VsYXRlVGhlbWVDbGFzc2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjbGFzc2VzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc2VzLm1hcCgoY2xhc3NOYW1lKSA9PiB0aGlzLl9nZXRUaGVtZUNsYXNzKGNsYXNzTmFtZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFRoZW1lQ2xhc3MoY2xhc3Nlcyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZ1bmN0aW9uIGZpcmVkIHdoZW4gYHRoZW1lYCBvciBgZXh0cmFDbGFzc2VzYCBhcmUgY2hhbmdlZC5cbiAgICAgICAgICovXG4gICAgICAgIG9uUHJvcGVydGllc0NoYW5nZWQoKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWNhbGN1bGF0ZUNsYXNzZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIF9nZXRUaGVtZUNsYXNzKGNsYXNzTmFtZSkge1xuICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PT0gdW5kZWZpbmVkIHx8IGNsYXNzTmFtZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBleHRyYUNsYXNzZXMgPSB0aGlzLnByb3BlcnRpZXMuZXh0cmFDbGFzc2VzIHx8IHt9O1xuICAgICAgICAgICAgY29uc3QgdGhlbWVDbGFzc05hbWUgPSB0aGlzLl9iYXNlVGhlbWVDbGFzc2VzUmV2ZXJzZUxvb2t1cFtjbGFzc05hbWVdO1xuICAgICAgICAgICAgbGV0IHJlc3VsdENsYXNzTmFtZXMgPSBbXTtcbiAgICAgICAgICAgIGlmICghdGhlbWVDbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYENsYXNzIG5hbWU6ICcke2NsYXNzTmFtZX0nIG5vdCBmb3VuZCBpbiB0aGVtZWApO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4dHJhQ2xhc3Nlc1t0aGVtZUNsYXNzTmFtZV0pIHtcbiAgICAgICAgICAgICAgICByZXN1bHRDbGFzc05hbWVzLnB1c2goZXh0cmFDbGFzc2VzW3RoZW1lQ2xhc3NOYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fdGhlbWVbdGhlbWVDbGFzc05hbWVdKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0Q2xhc3NOYW1lcy5wdXNoKHRoaXMuX3RoZW1lW3RoZW1lQ2xhc3NOYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHRDbGFzc05hbWVzLnB1c2godGhpcy5fcmVnaXN0ZXJlZEJhc2VUaGVtZVt0aGVtZUNsYXNzTmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENsYXNzTmFtZXMuam9pbignICcpO1xuICAgICAgICB9XG4gICAgICAgIF9yZWNhbGN1bGF0ZVRoZW1lQ2xhc3NlcygpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGhlbWUgPSB7fSB9ID0gdGhpcy5wcm9wZXJ0aWVzO1xuICAgICAgICAgICAgY29uc3QgYmFzZVRoZW1lcyA9IHRoaXMuZ2V0RGVjb3JhdG9yKCdiYXNlVGhlbWVDbGFzc2VzJyk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3JlZ2lzdGVyZWRCYXNlVGhlbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lID0gYmFzZVRoZW1lcy5yZWR1Y2UoKGZpbmFsQmFzZVRoZW1lLCBiYXNlVGhlbWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX2EgPSBUSEVNRV9LRVksIGtleSA9IGJhc2VUaGVtZVtfYV0sIGNsYXNzZXMgPSB0c2xpYl8xLl9fcmVzdChiYXNlVGhlbWUsIFt0eXBlb2YgX2EgPT09IFwic3ltYm9sXCIgPyBfYSA6IF9hICsgXCJcIl0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lS2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBmaW5hbEJhc2VUaGVtZSwgY2xhc3Nlcyk7XG4gICAgICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Jhc2VUaGVtZUNsYXNzZXNSZXZlcnNlTG9va3VwID0gY3JlYXRlVGhlbWVDbGFzc2VzTG9va3VwKGJhc2VUaGVtZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdGhlbWUgPSB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lS2V5cy5yZWR1Y2UoKGJhc2VUaGVtZSwgdGhlbWVLZXkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgYmFzZVRoZW1lLCB0aGVtZVt0aGVtZUtleV0pO1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgdGhpcy5fcmVjYWxjdWxhdGVDbGFzc2VzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHRzbGliXzEuX19kZWNvcmF0ZShbXG4gICAgICAgIGRpZmZQcm9wZXJ0eSgndGhlbWUnLCBzaGFsbG93KSxcbiAgICAgICAgZGlmZlByb3BlcnR5KCdleHRyYUNsYXNzZXMnLCBzaGFsbG93KSxcbiAgICAgICAgdHNsaWJfMS5fX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgICAgICB0c2xpYl8xLl9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbXSksXG4gICAgICAgIHRzbGliXzEuX19tZXRhZGF0YShcImRlc2lnbjpyZXR1cm50eXBlXCIsIHZvaWQgMClcbiAgICBdLCBUaGVtZWQucHJvdG90eXBlLCBcIm9uUHJvcGVydGllc0NoYW5nZWRcIiwgbnVsbCk7XG4gICAgVGhlbWVkID0gdHNsaWJfMS5fX2RlY29yYXRlKFtcbiAgICAgICAgaW5qZWN0KHtcbiAgICAgICAgICAgIG5hbWU6IElOSkVDVEVEX1RIRU1FX0tFWSxcbiAgICAgICAgICAgIGdldFByb3BlcnRpZXM6ICh0aGVtZSwgcHJvcGVydGllcykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcHJvcGVydGllcy50aGVtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB0aGVtZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgXSwgVGhlbWVkKTtcbiAgICByZXR1cm4gVGhlbWVkO1xufVxuZXhwb3J0IGRlZmF1bHQgVGhlbWVkTWl4aW47XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UaGVtZWQubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL21peGlucy9UaGVtZWQubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9taXhpbnMvVGhlbWVkLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBXaWRnZXRCYXNlLCBub0JpbmQgfSBmcm9tICcuL1dpZGdldEJhc2UnO1xuaW1wb3J0IHsgUHJvamVjdG9yTWl4aW4gfSBmcm9tICcuL21peGlucy9Qcm9qZWN0b3InO1xuaW1wb3J0IHsgZnJvbSB9IGZyb20gJ0Bkb2pvL3NoaW0vYXJyYXknO1xuaW1wb3J0IHsgdywgZG9tIH0gZnJvbSAnLi9kJztcbmltcG9ydCBnbG9iYWwgZnJvbSAnQGRvam8vc2hpbS9nbG9iYWwnO1xuaW1wb3J0IHsgcmVnaXN0ZXJUaGVtZUluamVjdG9yIH0gZnJvbSAnLi9taXhpbnMvVGhlbWVkJztcbmltcG9ydCB7IGFsd2F5c1JlbmRlciB9IGZyb20gJy4vZGVjb3JhdG9ycy9hbHdheXNSZW5kZXInO1xuZXhwb3J0IHZhciBDdXN0b21FbGVtZW50Q2hpbGRUeXBlO1xuKGZ1bmN0aW9uIChDdXN0b21FbGVtZW50Q2hpbGRUeXBlKSB7XG4gICAgQ3VzdG9tRWxlbWVudENoaWxkVHlwZVtcIkRPSk9cIl0gPSBcIkRPSk9cIjtcbiAgICBDdXN0b21FbGVtZW50Q2hpbGRUeXBlW1wiTk9ERVwiXSA9IFwiTk9ERVwiO1xuICAgIEN1c3RvbUVsZW1lbnRDaGlsZFR5cGVbXCJURVhUXCJdID0gXCJURVhUXCI7XG59KShDdXN0b21FbGVtZW50Q2hpbGRUeXBlIHx8IChDdXN0b21FbGVtZW50Q2hpbGRUeXBlID0ge30pKTtcbmV4cG9ydCBmdW5jdGlvbiBEb21Ub1dpZGdldFdyYXBwZXIoZG9tTm9kZSkge1xuICAgIGxldCBEb21Ub1dpZGdldFdyYXBwZXIgPSBjbGFzcyBEb21Ub1dpZGdldFdyYXBwZXIgZXh0ZW5kcyBXaWRnZXRCYXNlIHtcbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5rZXlzKHRoaXMucHJvcGVydGllcykucmVkdWNlKChwcm9wcywga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnByb3BlcnRpZXNba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoJ29uJykgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gYF9fJHtrZXl9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvcHNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9wcztcbiAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgICAgIHJldHVybiBkb20oeyBub2RlOiBkb21Ob2RlLCBwcm9wczogcHJvcGVydGllcywgZGlmZlR5cGU6ICdkb20nIH0pO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBnZXQgZG9tTm9kZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBkb21Ob2RlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEb21Ub1dpZGdldFdyYXBwZXIgPSB0c2xpYl8xLl9fZGVjb3JhdGUoW1xuICAgICAgICBhbHdheXNSZW5kZXIoKVxuICAgIF0sIERvbVRvV2lkZ2V0V3JhcHBlcik7XG4gICAgcmV0dXJuIERvbVRvV2lkZ2V0V3JhcHBlcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoZGVzY3JpcHRvciwgV2lkZ2V0Q29uc3RydWN0b3IpIHtcbiAgICBjb25zdCB7IGF0dHJpYnV0ZXMsIGNoaWxkVHlwZSwgcmVnaXN0cnlGYWN0b3J5IH0gPSBkZXNjcmlwdG9yO1xuICAgIGNvbnN0IGF0dHJpYnV0ZU1hcCA9IHt9O1xuICAgIGF0dHJpYnV0ZXMuZm9yRWFjaCgocHJvcGVydHlOYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgYXR0cmlidXRlTWFwW2F0dHJpYnV0ZU5hbWVdID0gcHJvcGVydHlOYW1lO1xuICAgIH0pO1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEhUTUxFbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHt9O1xuICAgICAgICAgICAgdGhpcy5fY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50UHJvcGVydGllcyA9IHt9O1xuICAgICAgICAgICAgdGhpcy5faW5pdGlhbGlzZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9pbml0aWFsaXNlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGRvbVByb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgICAgIGNvbnN0IHsgYXR0cmlidXRlcywgcHJvcGVydGllcywgZXZlbnRzIH0gPSBkZXNjcmlwdG9yO1xuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3Byb3BlcnRpZXMsIHRoaXMuX2F0dHJpYnV0ZXNUb1Byb3BlcnRpZXMoYXR0cmlidXRlcykpO1xuICAgICAgICAgICAgWy4uLmF0dHJpYnV0ZXMsIC4uLnByb3BlcnRpZXNdLmZvckVhY2goKHByb3BlcnR5TmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkUHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lLnJlcGxhY2UoL15vbi8sICdfXycpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyZWRQcm9wZXJ0eU5hbWUgIT09IHByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBkb21Qcm9wZXJ0aWVzW2ZpbHRlcmVkUHJvcGVydHlOYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldDogKCkgPT4gdGhpcy5fZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldDogKHZhbHVlKSA9PiB0aGlzLl9zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb21Qcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogKCkgPT4gdGhpcy5fZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgc2V0OiAodmFsdWUpID0+IHRoaXMuX3NldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZXZlbnRzLmZvckVhY2goKHByb3BlcnR5TmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IHByb3BlcnR5TmFtZS5yZXBsYWNlKC9eb24vLCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZFByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZS5yZXBsYWNlKC9eb24vLCAnX19vbicpO1xuICAgICAgICAgICAgICAgIGRvbVByb3BlcnRpZXNbZmlsdGVyZWRQcm9wZXJ0eU5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICBnZXQ6ICgpID0+IHRoaXMuX2dldEV2ZW50UHJvcGVydHkocHJvcGVydHlOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgc2V0OiAodmFsdWUpID0+IHRoaXMuX3NldEV2ZW50UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50UHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50Q2FsbGJhY2sgPSB0aGlzLl9nZXRFdmVudFByb3BlcnR5KHByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXZlbnRDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRDYWxsYmFjayguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IGFyZ3NcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIGRvbVByb3BlcnRpZXMpO1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBjaGlsZFR5cGUgPT09IEN1c3RvbUVsZW1lbnRDaGlsZFR5cGUuVEVYVCA/IHRoaXMuY2hpbGROb2RlcyA6IHRoaXMuY2hpbGRyZW47XG4gICAgICAgICAgICBmcm9tKGNoaWxkcmVuKS5mb3JFYWNoKChjaGlsZE5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRUeXBlID09PSBDdXN0b21FbGVtZW50Q2hpbGRUeXBlLkRPSk8pIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGROb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2Rvam8tY2UtcmVuZGVyJywgKCkgPT4gdGhpcy5fcmVuZGVyKCkpO1xuICAgICAgICAgICAgICAgICAgICBjaGlsZE5vZGUuYWRkRXZlbnRMaXN0ZW5lcignZG9qby1jZS1jb25uZWN0ZWQnLCAoKSA9PiB0aGlzLl9yZW5kZXIoKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoaWxkcmVuLnB1c2goRG9tVG9XaWRnZXRXcmFwcGVyKGNoaWxkTm9kZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hpbGRyZW4ucHVzaChkb20oeyBub2RlOiBjaGlsZE5vZGUsIGRpZmZUeXBlOiAnZG9tJyB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2Rvam8tY2UtY29ubmVjdGVkJywgKGUpID0+IHRoaXMuX2NoaWxkQ29ubmVjdGVkKGUpKTtcbiAgICAgICAgICAgIGNvbnN0IHdpZGdldFByb3BlcnRpZXMgPSB0aGlzLl9wcm9wZXJ0aWVzO1xuICAgICAgICAgICAgY29uc3QgcmVuZGVyQ2hpbGRyZW4gPSAoKSA9PiB0aGlzLl9fY2hpbGRyZW5fXygpO1xuICAgICAgICAgICAgY29uc3QgV3JhcHBlciA9IGNsYXNzIGV4dGVuZHMgV2lkZ2V0QmFzZSB7XG4gICAgICAgICAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdyhXaWRnZXRDb25zdHJ1Y3Rvciwgd2lkZ2V0UHJvcGVydGllcywgcmVuZGVyQ2hpbGRyZW4oKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gcmVnaXN0cnlGYWN0b3J5KCk7XG4gICAgICAgICAgICBjb25zdCB0aGVtZUNvbnRleHQgPSByZWdpc3RlclRoZW1lSW5qZWN0b3IodGhpcy5fZ2V0VGhlbWUoKSwgcmVnaXN0cnkpO1xuICAgICAgICAgICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Rvam8tdGhlbWUtc2V0JywgKCkgPT4gdGhlbWVDb250ZXh0LnNldCh0aGlzLl9nZXRUaGVtZSgpKSk7XG4gICAgICAgICAgICBjb25zdCBQcm9qZWN0b3IgPSBQcm9qZWN0b3JNaXhpbihXcmFwcGVyKTtcbiAgICAgICAgICAgIHRoaXMuX3Byb2plY3RvciA9IG5ldyBQcm9qZWN0b3IoKTtcbiAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rvci5zZXRQcm9wZXJ0aWVzKHsgcmVnaXN0cnkgfSk7XG4gICAgICAgICAgICB0aGlzLl9wcm9qZWN0b3IuYXBwZW5kKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5faW5pdGlhbGlzZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnZG9qby1jZS1jb25uZWN0ZWQnLCB7XG4gICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHRoaXNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBfZ2V0VGhlbWUoKSB7XG4gICAgICAgICAgICBpZiAoZ2xvYmFsICYmIGdsb2JhbC5kb2pvY2UgJiYgZ2xvYmFsLmRvam9jZS50aGVtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBnbG9iYWwuZG9qb2NlLnRoZW1lc1tnbG9iYWwuZG9qb2NlLnRoZW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfY2hpbGRDb25uZWN0ZWQoZSkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGUuZGV0YWlsO1xuICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50Tm9kZSA9PT0gdGhpcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuX2NoaWxkcmVuLnNvbWUoKGNoaWxkKSA9PiBjaGlsZC5kb21Ob2RlID09PSBub2RlKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgICAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2Rvam8tY2UtcmVuZGVyJywgKCkgPT4gdGhpcy5fcmVuZGVyKCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGlsZHJlbi5wdXNoKERvbVRvV2lkZ2V0V3JhcHBlcihub2RlKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfcmVuZGVyKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Byb2plY3Rvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rvci5pbnZhbGlkYXRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnZG9qby1jZS1yZW5kZXInLCB7XG4gICAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHRoaXNcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX19wcm9wZXJ0aWVzX18oKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcHJvcGVydGllcywgdGhpcy5fZXZlbnRQcm9wZXJ0aWVzKTtcbiAgICAgICAgfVxuICAgICAgICBfX2NoaWxkcmVuX18oKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGRUeXBlID09PSBDdXN0b21FbGVtZW50Q2hpbGRUeXBlLkRPSk8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW4uZmlsdGVyKChDaGlsZCkgPT4gQ2hpbGQuZG9tTm9kZS5pc1dpZGdldCkubWFwKChDaGlsZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRvbU5vZGUgfSA9IENoaWxkO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdyhDaGlsZCwgT2JqZWN0LmFzc2lnbih7fSwgZG9tTm9kZS5fX3Byb3BlcnRpZXNfXygpKSwgWy4uLmRvbU5vZGUuX19jaGlsZHJlbl9fKCldKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jaGlsZHJlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgb2xkVmFsdWUsIHZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBhdHRyaWJ1dGVNYXBbbmFtZV07XG4gICAgICAgICAgICB0aGlzLl9zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBfc2V0RXZlbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9ldmVudFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIF9nZXRFdmVudFByb3BlcnR5KHByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50UHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIF9zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVbbm9CaW5kXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcigpO1xuICAgICAgICB9XG4gICAgICAgIF9nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgX2F0dHJpYnV0ZXNUb1Byb3BlcnRpZXMoYXR0cmlidXRlcykge1xuICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXMucmVkdWNlKChwcm9wZXJ0aWVzLCBwcm9wZXJ0eU5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGF0dHJpYnV0ZU1hcCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzV2lkZ2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyKFdpZGdldENvbnN0cnVjdG9yKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IFdpZGdldENvbnN0cnVjdG9yLnByb3RvdHlwZSAmJiBXaWRnZXRDb25zdHJ1Y3Rvci5wcm90b3R5cGUuX19jdXN0b21FbGVtZW50RGVzY3JpcHRvcjtcbiAgICBpZiAoIWRlc2NyaXB0b3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZ2V0IGRlc2NyaXB0b3IgZm9yIEN1c3RvbSBFbGVtZW50LCBoYXZlIHlvdSBhZGRlZCB0aGUgQGN1c3RvbUVsZW1lbnQgZGVjb3JhdG9yIHRvIHlvdXIgV2lkZ2V0PycpO1xuICAgIH1cbiAgICBnbG9iYWwuY3VzdG9tRWxlbWVudHMuZGVmaW5lKGRlc2NyaXB0b3IudGFnTmFtZSwgY3JlYXRlKGRlc2NyaXB0b3IsIFdpZGdldENvbnN0cnVjdG9yKSk7XG59XG5leHBvcnQgZGVmYXVsdCByZWdpc3Rlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZ2lzdGVyQ3VzdG9tRWxlbWVudC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvcmVnaXN0ZXJDdXN0b21FbGVtZW50Lm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvcmVnaXN0ZXJDdXN0b21FbGVtZW50Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBnbG9iYWwgZnJvbSAnQGRvam8vc2hpbS9nbG9iYWwnO1xuaW1wb3J0IHsgZnJvbSBhcyBhcnJheUZyb20gfSBmcm9tICdAZG9qby9zaGltL2FycmF5JztcbmltcG9ydCB7IGlzV05vZGUsIGlzVk5vZGUsIGlzRG9tVk5vZGUsIFZOT0RFLCBXTk9ERSB9IGZyb20gJy4vZCc7XG5pbXBvcnQgeyBpc1dpZGdldEJhc2VDb25zdHJ1Y3RvciB9IGZyb20gJy4vUmVnaXN0cnknO1xuaW1wb3J0IFdlYWtNYXAgZnJvbSAnQGRvam8vc2hpbS9XZWFrTWFwJztcbmNvbnN0IE5BTUVTUEFDRV9XMyA9ICdodHRwOi8vd3d3LnczLm9yZy8nO1xuY29uc3QgTkFNRVNQQUNFX1NWRyA9IE5BTUVTUEFDRV9XMyArICcyMDAwL3N2Zyc7XG5jb25zdCBOQU1FU1BBQ0VfWExJTksgPSBOQU1FU1BBQ0VfVzMgKyAnMTk5OS94bGluayc7XG5jb25zdCBlbXB0eUFycmF5ID0gW107XG5leHBvcnQgY29uc3Qgd2lkZ2V0SW5zdGFuY2VNYXAgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgaW5zdGFuY2VNYXAgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgcHJvamVjdG9yU3RhdGVNYXAgPSBuZXcgV2Vha01hcCgpO1xuZnVuY3Rpb24gc2FtZShkbm9kZTEsIGRub2RlMikge1xuICAgIGlmIChpc1ZOb2RlKGRub2RlMSkgJiYgaXNWTm9kZShkbm9kZTIpKSB7XG4gICAgICAgIGlmIChpc0RvbVZOb2RlKGRub2RlMSkgfHwgaXNEb21WTm9kZShkbm9kZTIpKSB7XG4gICAgICAgICAgICBpZiAoZG5vZGUxLmRvbU5vZGUgIT09IGRub2RlMi5kb21Ob2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkbm9kZTEudGFnICE9PSBkbm9kZTIudGFnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRub2RlMS5wcm9wZXJ0aWVzLmtleSAhPT0gZG5vZGUyLnByb3BlcnRpZXMua2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzV05vZGUoZG5vZGUxKSAmJiBpc1dOb2RlKGRub2RlMikpIHtcbiAgICAgICAgaWYgKGRub2RlMS5pbnN0YW5jZSA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBkbm9kZTIud2lkZ2V0Q29uc3RydWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRub2RlMS53aWRnZXRDb25zdHJ1Y3RvciAhPT0gZG5vZGUyLndpZGdldENvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRub2RlMS5wcm9wZXJ0aWVzLmtleSAhPT0gZG5vZGUyLnByb3BlcnRpZXMua2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmNvbnN0IG1pc3NpbmdUcmFuc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUHJvdmlkZSBhIHRyYW5zaXRpb25zIG9iamVjdCB0byB0aGUgcHJvamVjdGlvbk9wdGlvbnMgdG8gZG8gYW5pbWF0aW9ucycpO1xufTtcbmZ1bmN0aW9uIGdldFByb2plY3Rpb25PcHRpb25zKHByb2plY3Rvck9wdGlvbnMsIHByb2plY3Rvckluc3RhbmNlKSB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgICAgIG5hbWVzcGFjZTogdW5kZWZpbmVkLFxuICAgICAgICBzdHlsZUFwcGx5ZXI6IGZ1bmN0aW9uIChkb21Ob2RlLCBzdHlsZU5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgICBkb21Ob2RlLnN0eWxlW3N0eWxlTmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNpdGlvbnM6IHtcbiAgICAgICAgICAgIGVudGVyOiBtaXNzaW5nVHJhbnNpdGlvbixcbiAgICAgICAgICAgIGV4aXQ6IG1pc3NpbmdUcmFuc2l0aW9uXG4gICAgICAgIH0sXG4gICAgICAgIGRlcHRoOiAwLFxuICAgICAgICBtZXJnZTogZmFsc2UsXG4gICAgICAgIHN5bmM6IGZhbHNlLFxuICAgICAgICBwcm9qZWN0b3JJbnN0YW5jZVxuICAgIH07XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRzLCBwcm9qZWN0b3JPcHRpb25zKTtcbn1cbmZ1bmN0aW9uIGNoZWNrU3R5bGVWYWx1ZShzdHlsZVZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBzdHlsZVZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0eWxlIHZhbHVlcyBtdXN0IGJlIHN0cmluZ3MnKTtcbiAgICB9XG59XG5mdW5jdGlvbiB1cGRhdGVFdmVudChkb21Ob2RlLCBldmVudE5hbWUsIGN1cnJlbnRWYWx1ZSwgcHJvamVjdGlvbk9wdGlvbnMsIGJpbmQsIHByZXZpb3VzVmFsdWUpIHtcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XG4gICAgY29uc3QgZXZlbnRNYXAgPSBwcm9qZWN0b3JTdGF0ZS5ub2RlTWFwLmdldChkb21Ob2RlKSB8fCBuZXcgV2Vha01hcCgpO1xuICAgIGlmIChwcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzRXZlbnQgPSBldmVudE1hcC5nZXQocHJldmlvdXNWYWx1ZSk7XG4gICAgICAgIGRvbU5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHByZXZpb3VzRXZlbnQpO1xuICAgIH1cbiAgICBsZXQgY2FsbGJhY2sgPSBjdXJyZW50VmFsdWUuYmluZChiaW5kKTtcbiAgICBpZiAoZXZlbnROYW1lID09PSAnaW5wdXQnKSB7XG4gICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICAgICAgY3VycmVudFZhbHVlLmNhbGwodGhpcywgZXZ0KTtcbiAgICAgICAgICAgIGV2dC50YXJnZXRbJ29uaW5wdXQtdmFsdWUnXSA9IGV2dC50YXJnZXQudmFsdWU7XG4gICAgICAgIH0uYmluZChiaW5kKTtcbiAgICB9XG4gICAgZG9tTm9kZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgY2FsbGJhY2spO1xuICAgIGV2ZW50TWFwLnNldChjdXJyZW50VmFsdWUsIGNhbGxiYWNrKTtcbiAgICBwcm9qZWN0b3JTdGF0ZS5ub2RlTWFwLnNldChkb21Ob2RlLCBldmVudE1hcCk7XG59XG5mdW5jdGlvbiBhZGRDbGFzc2VzKGRvbU5vZGUsIGNsYXNzZXMpIHtcbiAgICBpZiAoY2xhc3Nlcykge1xuICAgICAgICBjb25zdCBjbGFzc05hbWVzID0gY2xhc3Nlcy5zcGxpdCgnICcpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsYXNzTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGRvbU5vZGUuY2xhc3NMaXN0LmFkZChjbGFzc05hbWVzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHJlbW92ZUNsYXNzZXMoZG9tTm9kZSwgY2xhc3Nlcykge1xuICAgIGlmIChjbGFzc2VzKSB7XG4gICAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBjbGFzc2VzLnNwbGl0KCcgJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZG9tTm9kZS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZXNbaV0pO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gYnVpbGRQcmV2aW91c1Byb3BlcnRpZXMoZG9tTm9kZSwgcHJldmlvdXMsIGN1cnJlbnQpIHtcbiAgICBjb25zdCB7IGRpZmZUeXBlLCBwcm9wZXJ0aWVzLCBhdHRyaWJ1dGVzIH0gPSBjdXJyZW50O1xuICAgIGlmICghZGlmZlR5cGUgfHwgZGlmZlR5cGUgPT09ICd2ZG9tJykge1xuICAgICAgICByZXR1cm4geyBwcm9wZXJ0aWVzOiBwcmV2aW91cy5wcm9wZXJ0aWVzLCBhdHRyaWJ1dGVzOiBwcmV2aW91cy5hdHRyaWJ1dGVzLCBldmVudHM6IHByZXZpb3VzLmV2ZW50cyB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChkaWZmVHlwZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiB7IHByb3BlcnRpZXM6IHt9LCBhdHRyaWJ1dGVzOiBwcmV2aW91cy5hdHRyaWJ1dGVzID8ge30gOiB1bmRlZmluZWQsIGV2ZW50czogcHJldmlvdXMuZXZlbnRzIH07XG4gICAgfVxuICAgIGxldCBuZXdQcm9wZXJ0aWVzID0ge1xuICAgICAgICBwcm9wZXJ0aWVzOiB7fVxuICAgIH07XG4gICAgaWYgKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgbmV3UHJvcGVydGllcy5hdHRyaWJ1dGVzID0ge307XG4gICAgICAgIG5ld1Byb3BlcnRpZXMuZXZlbnRzID0gcHJldmlvdXMuZXZlbnRzO1xuICAgICAgICBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5mb3JFYWNoKChwcm9wTmFtZSkgPT4ge1xuICAgICAgICAgICAgbmV3UHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BOYW1lXSA9IGRvbU5vZGVbcHJvcE5hbWVdO1xuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaCgoYXR0ck5hbWUpID0+IHtcbiAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMuYXR0cmlidXRlc1thdHRyTmFtZV0gPSBkb21Ob2RlLmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3UHJvcGVydGllcztcbiAgICB9XG4gICAgbmV3UHJvcGVydGllcy5wcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMocHJvcGVydGllcykucmVkdWNlKChwcm9wcywgcHJvcGVydHkpID0+IHtcbiAgICAgICAgcHJvcHNbcHJvcGVydHldID0gZG9tTm9kZS5nZXRBdHRyaWJ1dGUocHJvcGVydHkpIHx8IGRvbU5vZGVbcHJvcGVydHldO1xuICAgICAgICByZXR1cm4gcHJvcHM7XG4gICAgfSwge30pO1xuICAgIHJldHVybiBuZXdQcm9wZXJ0aWVzO1xufVxuZnVuY3Rpb24gZm9jdXNOb2RlKHByb3BWYWx1ZSwgcHJldmlvdXNWYWx1ZSwgZG9tTm9kZSwgcHJvamVjdGlvbk9wdGlvbnMpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmICh0eXBlb2YgcHJvcFZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJlc3VsdCA9IHByb3BWYWx1ZSgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gcHJvcFZhbHVlICYmICFwcmV2aW91c1ZhbHVlO1xuICAgIH1cbiAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcbiAgICAgICAgcHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICBkb21Ob2RlLmZvY3VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlbW92ZU9ycGhhbmVkRXZlbnRzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcywgcHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMsIG9ubHlFdmVudHMgPSBmYWxzZSkge1xuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcbiAgICBjb25zdCBldmVudE1hcCA9IHByb2plY3RvclN0YXRlLm5vZGVNYXAuZ2V0KGRvbU5vZGUpO1xuICAgIGlmIChldmVudE1hcCkge1xuICAgICAgICBPYmplY3Qua2V5cyhwcmV2aW91c1Byb3BlcnRpZXMpLmZvckVhY2goKHByb3BOYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc0V2ZW50ID0gcHJvcE5hbWUuc3Vic3RyKDAsIDIpID09PSAnb24nIHx8IG9ubHlFdmVudHM7XG4gICAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBvbmx5RXZlbnRzID8gcHJvcE5hbWUgOiBwcm9wTmFtZS5zdWJzdHIoMik7XG4gICAgICAgICAgICBpZiAoaXNFdmVudCAmJiAhcHJvcGVydGllc1twcm9wTmFtZV0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudENhbGxiYWNrID0gZXZlbnRNYXAuZ2V0KHByZXZpb3VzUHJvcGVydGllc1twcm9wTmFtZV0pO1xuICAgICAgICAgICAgICAgIGlmIChldmVudENhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbU5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGV2ZW50Q2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gdXBkYXRlQXR0cmlidXRlKGRvbU5vZGUsIGF0dHJOYW1lLCBhdHRyVmFsdWUsIHByb2plY3Rpb25PcHRpb25zKSB7XG4gICAgaWYgKHByb2plY3Rpb25PcHRpb25zLm5hbWVzcGFjZSA9PT0gTkFNRVNQQUNFX1NWRyAmJiBhdHRyTmFtZSA9PT0gJ2hyZWYnKSB7XG4gICAgICAgIGRvbU5vZGUuc2V0QXR0cmlidXRlTlMoTkFNRVNQQUNFX1hMSU5LLCBhdHRyTmFtZSwgYXR0clZhbHVlKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoKGF0dHJOYW1lID09PSAncm9sZScgJiYgYXR0clZhbHVlID09PSAnJykgfHwgYXR0clZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZG9tTm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZG9tTm9kZS5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIGF0dHJWYWx1ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gdXBkYXRlQXR0cmlidXRlcyhkb21Ob2RlLCBwcmV2aW91c0F0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMsIHByb2plY3Rpb25PcHRpb25zKSB7XG4gICAgY29uc3QgYXR0ck5hbWVzID0gT2JqZWN0LmtleXMoYXR0cmlidXRlcyk7XG4gICAgY29uc3QgYXR0ckNvdW50ID0gYXR0ck5hbWVzLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJDb3VudDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGF0dHJOYW1lID0gYXR0ck5hbWVzW2ldO1xuICAgICAgICBjb25zdCBhdHRyVmFsdWUgPSBhdHRyaWJ1dGVzW2F0dHJOYW1lXTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNBdHRyVmFsdWUgPSBwcmV2aW91c0F0dHJpYnV0ZXNbYXR0ck5hbWVdO1xuICAgICAgICBpZiAoYXR0clZhbHVlICE9PSBwcmV2aW91c0F0dHJWYWx1ZSkge1xuICAgICAgICAgICAgdXBkYXRlQXR0cmlidXRlKGRvbU5vZGUsIGF0dHJOYW1lLCBhdHRyVmFsdWUsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHVwZGF0ZVByb3BlcnRpZXMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucywgaW5jbHVkZXNFdmVudHNBbmRBdHRyaWJ1dGVzID0gdHJ1ZSkge1xuICAgIGxldCBwcm9wZXJ0aWVzVXBkYXRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHByb3BOYW1lcyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpO1xuICAgIGNvbnN0IHByb3BDb3VudCA9IHByb3BOYW1lcy5sZW5ndGg7XG4gICAgaWYgKHByb3BOYW1lcy5pbmRleE9mKCdjbGFzc2VzJykgPT09IC0xICYmIHByZXZpb3VzUHJvcGVydGllcy5jbGFzc2VzKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByZXZpb3VzUHJvcGVydGllcy5jbGFzc2VzKSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2aW91c1Byb3BlcnRpZXMuY2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzZXMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLmNsYXNzZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVtb3ZlQ2xhc3Nlcyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMuY2xhc3Nlcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5jbHVkZXNFdmVudHNBbmRBdHRyaWJ1dGVzICYmIHJlbW92ZU9ycGhhbmVkRXZlbnRzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcywgcHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcENvdW50OyBpKyspIHtcbiAgICAgICAgY29uc3QgcHJvcE5hbWUgPSBwcm9wTmFtZXNbaV07XG4gICAgICAgIGxldCBwcm9wVmFsdWUgPSBwcm9wZXJ0aWVzW3Byb3BOYW1lXTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHByZXZpb3VzUHJvcGVydGllc1twcm9wTmFtZV07XG4gICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ2NsYXNzZXMnKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c0NsYXNzZXMgPSBBcnJheS5pc0FycmF5KHByZXZpb3VzVmFsdWUpID8gcHJldmlvdXNWYWx1ZSA6IFtwcmV2aW91c1ZhbHVlXTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDbGFzc2VzID0gQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpID8gcHJvcFZhbHVlIDogW3Byb3BWYWx1ZV07XG4gICAgICAgICAgICBpZiAocHJldmlvdXNDbGFzc2VzICYmIHByZXZpb3VzQ2xhc3Nlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwcm9wVmFsdWUgfHwgcHJvcFZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZpb3VzQ2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3Nlcyhkb21Ob2RlLCBwcmV2aW91c0NsYXNzZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdDbGFzc2VzID0gWy4uLmN1cnJlbnRDbGFzc2VzXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2aW91c0NsYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzQ2xhc3NOYW1lID0gcHJldmlvdXNDbGFzc2VzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzQ2xhc3NOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xhc3NJbmRleCA9IG5ld0NsYXNzZXMuaW5kZXhPZihwcmV2aW91c0NsYXNzTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzZXMoZG9tTm9kZSwgcHJldmlvdXNDbGFzc05hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2xhc3Nlcy5zcGxpY2UoY2xhc3NJbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3Q2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkQ2xhc3Nlcyhkb21Ob2RlLCBuZXdDbGFzc2VzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3VycmVudENsYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkQ2xhc3Nlcyhkb21Ob2RlLCBjdXJyZW50Q2xhc3Nlc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHByb3BOYW1lID09PSAnZm9jdXMnKSB7XG4gICAgICAgICAgICBmb2N1c05vZGUocHJvcFZhbHVlLCBwcmV2aW91c1ZhbHVlLCBkb21Ob2RlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocHJvcE5hbWUgPT09ICdzdHlsZXMnKSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZU5hbWVzID0gT2JqZWN0LmtleXMocHJvcFZhbHVlKTtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlQ291bnQgPSBzdHlsZU5hbWVzLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc3R5bGVDb3VudDsgaisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVOYW1lID0gc3R5bGVOYW1lc1tqXTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdTdHlsZVZhbHVlID0gcHJvcFZhbHVlW3N0eWxlTmFtZV07XG4gICAgICAgICAgICAgICAgY29uc3Qgb2xkU3R5bGVWYWx1ZSA9IHByZXZpb3VzVmFsdWUgJiYgcHJldmlvdXNWYWx1ZVtzdHlsZU5hbWVdO1xuICAgICAgICAgICAgICAgIGlmIChuZXdTdHlsZVZhbHVlID09PSBvbGRTdHlsZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKG5ld1N0eWxlVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tTdHlsZVZhbHVlKG5ld1N0eWxlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uT3B0aW9ucy5zdHlsZUFwcGx5ZXIoZG9tTm9kZSwgc3R5bGVOYW1lLCBuZXdTdHlsZVZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb25PcHRpb25zLnN0eWxlQXBwbHllcihkb21Ob2RlLCBzdHlsZU5hbWUsICcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXByb3BWYWx1ZSAmJiB0eXBlb2YgcHJldmlvdXNWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBwcm9wVmFsdWUgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ3ZhbHVlJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvbVZhbHVlID0gZG9tTm9kZVtwcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKGRvbVZhbHVlICE9PSBwcm9wVmFsdWUgJiZcbiAgICAgICAgICAgICAgICAgICAgKGRvbU5vZGVbJ29uaW5wdXQtdmFsdWUnXVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBkb21WYWx1ZSA9PT0gZG9tTm9kZVsnb25pbnB1dC12YWx1ZSddXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHByb3BWYWx1ZSAhPT0gcHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tTm9kZVtwcm9wTmFtZV0gPSBwcm9wVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGRvbU5vZGVbJ29uaW5wdXQtdmFsdWUnXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByb3BWYWx1ZSAhPT0gcHJldmlvdXNWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocHJvcE5hbWUgIT09ICdrZXknICYmIHByb3BWYWx1ZSAhPT0gcHJldmlvdXNWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgcHJvcFZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnZnVuY3Rpb24nICYmIHByb3BOYW1lLmxhc3RJbmRleE9mKCdvbicsIDApID09PSAwICYmIGluY2x1ZGVzRXZlbnRzQW5kQXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVFdmVudChkb21Ob2RlLCBwcm9wTmFtZS5zdWJzdHIoMiksIHByb3BWYWx1ZSwgcHJvamVjdGlvbk9wdGlvbnMsIHByb3BlcnRpZXMuYmluZCwgcHJldmlvdXNWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHByb3BOYW1lICE9PSAnaW5uZXJIVE1MJyAmJiBpbmNsdWRlc0V2ZW50c0FuZEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQXR0cmlidXRlKGRvbU5vZGUsIHByb3BOYW1lLCBwcm9wVmFsdWUsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvcE5hbWUgPT09ICdzY3JvbGxMZWZ0JyB8fCBwcm9wTmFtZSA9PT0gJ3Njcm9sbFRvcCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbU5vZGVbcHJvcE5hbWVdICE9PSBwcm9wVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbU5vZGVbcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkb21Ob2RlW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvcGVydGllc1VwZGF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9wZXJ0aWVzVXBkYXRlZDtcbn1cbmZ1bmN0aW9uIGZpbmRJbmRleE9mQ2hpbGQoY2hpbGRyZW4sIHNhbWVBcywgc3RhcnQpIHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2FtZShjaGlsZHJlbltpXSwgc2FtZUFzKSkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvUGFyZW50Vk5vZGUoZG9tTm9kZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHRhZzogJycsXG4gICAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgICBjaGlsZHJlbjogdW5kZWZpbmVkLFxuICAgICAgICBkb21Ob2RlLFxuICAgICAgICB0eXBlOiBWTk9ERVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gdG9UZXh0Vk5vZGUoZGF0YSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHRhZzogJycsXG4gICAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgICBjaGlsZHJlbjogdW5kZWZpbmVkLFxuICAgICAgICB0ZXh0OiBgJHtkYXRhfWAsXG4gICAgICAgIGRvbU5vZGU6IHVuZGVmaW5lZCxcbiAgICAgICAgdHlwZTogVk5PREVcbiAgICB9O1xufVxuZnVuY3Rpb24gdG9JbnRlcm5hbFdOb2RlKGluc3RhbmNlLCBpbnN0YW5jZURhdGEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgcmVuZGVyZWQ6IFtdLFxuICAgICAgICBjb3JlUHJvcGVydGllczogaW5zdGFuY2VEYXRhLmNvcmVQcm9wZXJ0aWVzLFxuICAgICAgICBjaGlsZHJlbjogaW5zdGFuY2UuY2hpbGRyZW4sXG4gICAgICAgIHdpZGdldENvbnN0cnVjdG9yOiBpbnN0YW5jZS5jb25zdHJ1Y3RvcixcbiAgICAgICAgcHJvcGVydGllczogaW5zdGFuY2VEYXRhLmlucHV0UHJvcGVydGllcyxcbiAgICAgICAgdHlwZTogV05PREVcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlckFuZERlY29yYXRlQ2hpbGRyZW4oY2hpbGRyZW4sIGluc3RhbmNlKSB7XG4gICAgaWYgKGNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGVtcHR5QXJyYXk7XG4gICAgfVxuICAgIGNoaWxkcmVuID0gQXJyYXkuaXNBcnJheShjaGlsZHJlbikgPyBjaGlsZHJlbiA6IFtjaGlsZHJlbl07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7KSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgIGlmIChjaGlsZCA9PT0gdW5kZWZpbmVkIHx8IGNoaWxkID09PSBudWxsKSB7XG4gICAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjaGlsZHJlbltpXSA9IHRvVGV4dFZOb2RlKGNoaWxkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpc1ZOb2RlKGNoaWxkKSkge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5wcm9wZXJ0aWVzLmJpbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZC5wcm9wZXJ0aWVzLmJpbmQgPSBpbnN0YW5jZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuICYmIGNoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlckFuZERlY29yYXRlQ2hpbGRyZW4oY2hpbGQuY2hpbGRyZW4sIGluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghY2hpbGQuY29yZVByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuY29yZVByb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiaW5kOiBpbnN0YW5jZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VSZWdpc3RyeTogaW5zdGFuY2VEYXRhLmNvcmVQcm9wZXJ0aWVzLmJhc2VSZWdpc3RyeVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuY2hpbGRyZW4gJiYgY2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJBbmREZWNvcmF0ZUNoaWxkcmVuKGNoaWxkLmNoaWxkcmVuLCBpbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGkrKztcbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xufVxuZnVuY3Rpb24gbm9kZUFkZGVkKGRub2RlLCB0cmFuc2l0aW9ucykge1xuICAgIGlmIChpc1ZOb2RlKGRub2RlKSAmJiBkbm9kZS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgIGNvbnN0IGVudGVyQW5pbWF0aW9uID0gZG5vZGUucHJvcGVydGllcy5lbnRlckFuaW1hdGlvbjtcbiAgICAgICAgaWYgKGVudGVyQW5pbWF0aW9uKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVudGVyQW5pbWF0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgZW50ZXJBbmltYXRpb24oZG5vZGUuZG9tTm9kZSwgZG5vZGUucHJvcGVydGllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9ucy5lbnRlcihkbm9kZS5kb21Ob2RlLCBkbm9kZS5wcm9wZXJ0aWVzLCBlbnRlckFuaW1hdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBub2RlVG9SZW1vdmUoZG5vZGUsIHRyYW5zaXRpb25zLCBwcm9qZWN0aW9uT3B0aW9ucykge1xuICAgIGlmIChpc1dOb2RlKGRub2RlKSkge1xuICAgICAgICBjb25zdCByZW5kZXJlZCA9IGRub2RlLnJlbmRlcmVkIHx8IGVtcHR5QXJyYXk7XG4gICAgICAgIGlmIChkbm9kZS5pbnN0YW5jZSkge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGRub2RlLmluc3RhbmNlKTtcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5vbkRldGFjaCgpO1xuICAgICAgICAgICAgaW5zdGFuY2VNYXAuZGVsZXRlKGRub2RlLmluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbmRlcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBub2RlVG9SZW1vdmUocmVuZGVyZWRbaV0sIHRyYW5zaXRpb25zLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlO1xuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gZG5vZGUucHJvcGVydGllcztcbiAgICAgICAgaWYgKGRub2RlLmNoaWxkcmVuICYmIGRub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBub2RlVG9SZW1vdmUoZG5vZGUuY2hpbGRyZW5baV0sIHRyYW5zaXRpb25zLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXhpdEFuaW1hdGlvbiA9IHByb3BlcnRpZXMuZXhpdEFuaW1hdGlvbjtcbiAgICAgICAgaWYgKHByb3BlcnRpZXMgJiYgZXhpdEFuaW1hdGlvbikge1xuICAgICAgICAgICAgZG9tTm9kZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlRG9tTm9kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBkb21Ob2RlICYmIGRvbU5vZGUucGFyZW50Tm9kZSAmJiBkb21Ob2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZG9tTm9kZSk7XG4gICAgICAgICAgICAgICAgZG5vZGUuZG9tTm9kZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGV4aXRBbmltYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBleGl0QW5pbWF0aW9uKGRvbU5vZGUsIHJlbW92ZURvbU5vZGUsIHByb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25zLmV4aXQoZG5vZGUuZG9tTm9kZSwgcHJvcGVydGllcywgZXhpdEFuaW1hdGlvbiwgcmVtb3ZlRG9tTm9kZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRvbU5vZGUgJiYgZG9tTm9kZS5wYXJlbnROb2RlICYmIGRvbU5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkb21Ob2RlKTtcbiAgICAgICAgZG5vZGUuZG9tTm9kZSA9IHVuZGVmaW5lZDtcbiAgICB9XG59XG5mdW5jdGlvbiBjaGVja0Rpc3Rpbmd1aXNoYWJsZShjaGlsZE5vZGVzLCBpbmRleFRvQ2hlY2ssIHBhcmVudEluc3RhbmNlKSB7XG4gICAgY29uc3QgY2hpbGROb2RlID0gY2hpbGROb2Rlc1tpbmRleFRvQ2hlY2tdO1xuICAgIGlmIChpc1ZOb2RlKGNoaWxkTm9kZSkgJiYgIWNoaWxkTm9kZS50YWcpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBUZXh0IG5vZGVzIG5lZWQgbm90IGJlIGRpc3Rpbmd1aXNoYWJsZVxuICAgIH1cbiAgICBjb25zdCB7IGtleSB9ID0gY2hpbGROb2RlLnByb3BlcnRpZXM7XG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gbnVsbCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpICE9PSBpbmRleFRvQ2hlY2spIHtcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gY2hpbGROb2Rlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoc2FtZShub2RlLCBjaGlsZE5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBub2RlSWRlbnRpZmllcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50TmFtZSA9IHBhcmVudEluc3RhbmNlLmNvbnN0cnVjdG9yLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNXTm9kZShjaGlsZE5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlSWRlbnRpZmllciA9IGNoaWxkTm9kZS53aWRnZXRDb25zdHJ1Y3Rvci5uYW1lIHx8ICd1bmtub3duJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVJZGVudGlmaWVyID0gY2hpbGROb2RlLnRhZztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEEgd2lkZ2V0ICgke3BhcmVudE5hbWV9KSBoYXMgaGFkIGEgY2hpbGQgYWRkZGVkIG9yIHJlbW92ZWQsIGJ1dCB0aGV5IHdlcmUgbm90IGFibGUgdG8gdW5pcXVlbHkgaWRlbnRpZmllZC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gcHJvdmlkZSBhIHVuaXF1ZSAna2V5JyBwcm9wZXJ0eSB3aGVuIHVzaW5nIHRoZSBzYW1lIHdpZGdldCBvciBlbGVtZW50ICgke25vZGVJZGVudGlmaWVyfSkgbXVsdGlwbGUgdGltZXMgYXMgc2libGluZ3NgKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gdXBkYXRlQ2hpbGRyZW4ocGFyZW50Vk5vZGUsIG9sZENoaWxkcmVuLCBuZXdDaGlsZHJlbiwgcGFyZW50SW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKSB7XG4gICAgb2xkQ2hpbGRyZW4gPSBvbGRDaGlsZHJlbiB8fCBlbXB0eUFycmF5O1xuICAgIG5ld0NoaWxkcmVuID0gbmV3Q2hpbGRyZW47XG4gICAgY29uc3Qgb2xkQ2hpbGRyZW5MZW5ndGggPSBvbGRDaGlsZHJlbi5sZW5ndGg7XG4gICAgY29uc3QgbmV3Q2hpbGRyZW5MZW5ndGggPSBuZXdDaGlsZHJlbi5sZW5ndGg7XG4gICAgY29uc3QgdHJhbnNpdGlvbnMgPSBwcm9qZWN0aW9uT3B0aW9ucy50cmFuc2l0aW9ucztcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XG4gICAgcHJvamVjdGlvbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9qZWN0aW9uT3B0aW9ucywgeyBkZXB0aDogcHJvamVjdGlvbk9wdGlvbnMuZGVwdGggKyAxIH0pO1xuICAgIGxldCBvbGRJbmRleCA9IDA7XG4gICAgbGV0IG5ld0luZGV4ID0gMDtcbiAgICBsZXQgaTtcbiAgICBsZXQgdGV4dFVwZGF0ZWQgPSBmYWxzZTtcbiAgICB3aGlsZSAobmV3SW5kZXggPCBuZXdDaGlsZHJlbkxlbmd0aCkge1xuICAgICAgICBsZXQgb2xkQ2hpbGQgPSBvbGRJbmRleCA8IG9sZENoaWxkcmVuTGVuZ3RoID8gb2xkQ2hpbGRyZW5bb2xkSW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBuZXdDaGlsZCA9IG5ld0NoaWxkcmVuW25ld0luZGV4XTtcbiAgICAgICAgaWYgKGlzVk5vZGUobmV3Q2hpbGQpICYmIHR5cGVvZiBuZXdDaGlsZC5kZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbmV3Q2hpbGQuaW5zZXJ0ZWQgPSBpc1ZOb2RlKG9sZENoaWxkKSAmJiBvbGRDaGlsZC5pbnNlcnRlZDtcbiAgICAgICAgICAgIGFkZERlZmVycmVkUHJvcGVydGllcyhuZXdDaGlsZCwgcHJvamVjdGlvbk9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvbGRDaGlsZCAhPT0gdW5kZWZpbmVkICYmIHNhbWUob2xkQ2hpbGQsIG5ld0NoaWxkKSkge1xuICAgICAgICAgICAgdGV4dFVwZGF0ZWQgPSB1cGRhdGVEb20ob2xkQ2hpbGQsIG5ld0NoaWxkLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50Vk5vZGUsIHBhcmVudEluc3RhbmNlKSB8fCB0ZXh0VXBkYXRlZDtcbiAgICAgICAgICAgIG9sZEluZGV4Kys7XG4gICAgICAgICAgICBuZXdJbmRleCsrO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmluZE9sZEluZGV4ID0gZmluZEluZGV4T2ZDaGlsZChvbGRDaGlsZHJlbiwgbmV3Q2hpbGQsIG9sZEluZGV4ICsgMSk7XG4gICAgICAgIGNvbnN0IGFkZENoaWxkID0gKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGluc2VydEJlZm9yZURvbU5vZGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSBvbGRDaGlsZHJlbltvbGRJbmRleF07XG4gICAgICAgICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dEluZGV4ID0gb2xkSW5kZXggKyAxO1xuICAgICAgICAgICAgICAgIGxldCBpbnNlcnRCZWZvcmVDaGlsZHJlbiA9IFtjaGlsZF07XG4gICAgICAgICAgICAgICAgd2hpbGUgKGluc2VydEJlZm9yZUNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnNlcnRCZWZvcmUgPSBpbnNlcnRCZWZvcmVDaGlsZHJlbi5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNXTm9kZShpbnNlcnRCZWZvcmUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlLnJlbmRlcmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ2hpbGRyZW4ucHVzaCguLi5pbnNlcnRCZWZvcmUucmVuZGVyZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydEJlZm9yZS5kb21Ob2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlRG9tTm9kZSA9IGluc2VydEJlZm9yZS5kb21Ob2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRCZWZvcmVDaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgb2xkQ2hpbGRyZW5bbmV4dEluZGV4XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ2hpbGRyZW4ucHVzaChvbGRDaGlsZHJlbltuZXh0SW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRJbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3JlYXRlRG9tKG5ld0NoaWxkLCBwYXJlbnRWTm9kZSwgaW5zZXJ0QmVmb3JlRG9tTm9kZSwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudEluc3RhbmNlKTtcbiAgICAgICAgICAgIG5vZGVBZGRlZChuZXdDaGlsZCwgdHJhbnNpdGlvbnMpO1xuICAgICAgICAgICAgY29uc3QgaW5kZXhUb0NoZWNrID0gbmV3SW5kZXg7XG4gICAgICAgICAgICBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjaGVja0Rpc3Rpbmd1aXNoYWJsZShuZXdDaGlsZHJlbiwgaW5kZXhUb0NoZWNrLCBwYXJlbnRJbnN0YW5jZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFvbGRDaGlsZCB8fCBmaW5kT2xkSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICBhZGRDaGlsZCgpO1xuICAgICAgICAgICAgbmV3SW5kZXgrKztcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbW92ZUNoaWxkID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXhUb0NoZWNrID0gb2xkSW5kZXg7XG4gICAgICAgICAgICBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjaGVja0Rpc3Rpbmd1aXNoYWJsZShvbGRDaGlsZHJlbiwgaW5kZXhUb0NoZWNrLCBwYXJlbnRJbnN0YW5jZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpc1dOb2RlKG9sZENoaWxkKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBpbnN0YW5jZU1hcC5nZXQob2xkQ2hpbGQuaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIG9sZENoaWxkID0gaXRlbS5kbm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlVG9SZW1vdmUob2xkQ2hpbGQsIHRyYW5zaXRpb25zLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGZpbmROZXdJbmRleCA9IGZpbmRJbmRleE9mQ2hpbGQobmV3Q2hpbGRyZW4sIG9sZENoaWxkLCBuZXdJbmRleCArIDEpO1xuICAgICAgICBpZiAoZmluZE5ld0luZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmVtb3ZlQ2hpbGQoKTtcbiAgICAgICAgICAgIG9sZEluZGV4Kys7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBhZGRDaGlsZCgpO1xuICAgICAgICByZW1vdmVDaGlsZCgpO1xuICAgICAgICBvbGRJbmRleCsrO1xuICAgICAgICBuZXdJbmRleCsrO1xuICAgIH1cbiAgICBpZiAob2xkQ2hpbGRyZW5MZW5ndGggPiBvbGRJbmRleCkge1xuICAgICAgICAvLyBSZW1vdmUgY2hpbGQgZnJhZ21lbnRzXG4gICAgICAgIGZvciAoaSA9IG9sZEluZGV4OyBpIDwgb2xkQ2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaW5kZXhUb0NoZWNrID0gaTtcbiAgICAgICAgICAgIHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNoZWNrRGlzdGluZ3Vpc2hhYmxlKG9sZENoaWxkcmVuLCBpbmRleFRvQ2hlY2ssIHBhcmVudEluc3RhbmNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IGNoaWxkVG9SZW1vdmUgPSBvbGRDaGlsZHJlbltpXTtcbiAgICAgICAgICAgIGlmIChpc1dOb2RlKGNoaWxkVG9SZW1vdmUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGluc3RhbmNlTWFwLmdldChjaGlsZFRvUmVtb3ZlLmluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZFRvUmVtb3ZlID0gaXRlbS5kbm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlVG9SZW1vdmUoY2hpbGRUb1JlbW92ZSwgdHJhbnNpdGlvbnMsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGV4dFVwZGF0ZWQ7XG59XG5mdW5jdGlvbiBhZGRDaGlsZHJlbihwYXJlbnRWTm9kZSwgY2hpbGRyZW4sIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRJbnN0YW5jZSwgaW5zZXJ0QmVmb3JlID0gdW5kZWZpbmVkLCBjaGlsZE5vZGVzKSB7XG4gICAgaWYgKGNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XG4gICAgaWYgKHByb2plY3RvclN0YXRlLm1lcmdlICYmIGNoaWxkTm9kZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjaGlsZE5vZGVzID0gYXJyYXlGcm9tKHBhcmVudFZOb2RlLmRvbU5vZGUuY2hpbGROb2Rlcyk7XG4gICAgfVxuICAgIGNvbnN0IHRyYW5zaXRpb25zID0gcHJvamVjdGlvbk9wdGlvbnMudHJhbnNpdGlvbnM7XG4gICAgcHJvamVjdGlvbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9qZWN0aW9uT3B0aW9ucywgeyBkZXB0aDogcHJvamVjdGlvbk9wdGlvbnMuZGVwdGggKyAxIH0pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgaWYgKGlzVk5vZGUoY2hpbGQpKSB7XG4gICAgICAgICAgICBpZiAocHJvamVjdG9yU3RhdGUubWVyZ2UgJiYgY2hpbGROb2Rlcykge1xuICAgICAgICAgICAgICAgIGxldCBkb21FbGVtZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHdoaWxlIChjaGlsZC5kb21Ob2RlID09PSB1bmRlZmluZWQgJiYgY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQgPSBjaGlsZE5vZGVzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb21FbGVtZW50ICYmIGRvbUVsZW1lbnQudGFnTmFtZSA9PT0gKGNoaWxkLnRhZy50b1VwcGVyQ2FzZSgpIHx8IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmRvbU5vZGUgPSBkb21FbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3JlYXRlRG9tKGNoaWxkLCBwYXJlbnRWTm9kZSwgaW5zZXJ0QmVmb3JlLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY3JlYXRlRG9tKGNoaWxkLCBwYXJlbnRWTm9kZSwgaW5zZXJ0QmVmb3JlLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UsIGNoaWxkTm9kZXMpO1xuICAgICAgICB9XG4gICAgICAgIG5vZGVBZGRlZChjaGlsZCwgdHJhbnNpdGlvbnMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGluaXRQcm9wZXJ0aWVzQW5kQ2hpbGRyZW4oZG9tTm9kZSwgZG5vZGUsIHBhcmVudEluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xuICAgIGFkZENoaWxkcmVuKGRub2RlLCBkbm9kZS5jaGlsZHJlbiwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudEluc3RhbmNlLCB1bmRlZmluZWQpO1xuICAgIGlmICh0eXBlb2YgZG5vZGUuZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicgJiYgZG5vZGUuaW5zZXJ0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhZGREZWZlcnJlZFByb3BlcnRpZXMoZG5vZGUsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKGRub2RlLmF0dHJpYnV0ZXMgJiYgZG5vZGUuZXZlbnRzKSB7XG4gICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXMoZG9tTm9kZSwge30sIGRub2RlLmF0dHJpYnV0ZXMsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgdXBkYXRlUHJvcGVydGllcyhkb21Ob2RlLCB7fSwgZG5vZGUucHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMsIGZhbHNlKTtcbiAgICAgICAgcmVtb3ZlT3JwaGFuZWRFdmVudHMoZG9tTm9kZSwge30sIGRub2RlLmV2ZW50cywgcHJvamVjdGlvbk9wdGlvbnMsIHRydWUpO1xuICAgICAgICBjb25zdCBldmVudHMgPSBkbm9kZS5ldmVudHM7XG4gICAgICAgIE9iamVjdC5rZXlzKGV2ZW50cykuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHVwZGF0ZUV2ZW50KGRvbU5vZGUsIGV2ZW50LCBldmVudHNbZXZlbnRdLCBwcm9qZWN0aW9uT3B0aW9ucywgZG5vZGUucHJvcGVydGllcy5iaW5kKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB1cGRhdGVQcm9wZXJ0aWVzKGRvbU5vZGUsIHt9LCBkbm9kZS5wcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgfVxuICAgIGlmIChkbm9kZS5wcm9wZXJ0aWVzLmtleSAhPT0gbnVsbCAmJiBkbm9kZS5wcm9wZXJ0aWVzLmtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldChwYXJlbnRJbnN0YW5jZSk7XG4gICAgICAgIGluc3RhbmNlRGF0YS5ub2RlSGFuZGxlci5hZGQoZG9tTm9kZSwgYCR7ZG5vZGUucHJvcGVydGllcy5rZXl9YCk7XG4gICAgfVxuICAgIGRub2RlLmluc2VydGVkID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZURvbShkbm9kZSwgcGFyZW50Vk5vZGUsIGluc2VydEJlZm9yZSwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudEluc3RhbmNlLCBjaGlsZE5vZGVzKSB7XG4gICAgbGV0IGRvbU5vZGU7XG4gICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xuICAgIGlmIChpc1dOb2RlKGRub2RlKSkge1xuICAgICAgICBsZXQgeyB3aWRnZXRDb25zdHJ1Y3RvciB9ID0gZG5vZGU7XG4gICAgICAgIGNvbnN0IHBhcmVudEluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldChwYXJlbnRJbnN0YW5jZSk7XG4gICAgICAgIGlmICghaXNXaWRnZXRCYXNlQ29uc3RydWN0b3Iod2lkZ2V0Q29uc3RydWN0b3IpKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gcGFyZW50SW5zdGFuY2VEYXRhLnJlZ2lzdHJ5KCkuZ2V0KHdpZGdldENvbnN0cnVjdG9yKTtcbiAgICAgICAgICAgIGlmIChpdGVtID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2lkZ2V0Q29uc3RydWN0b3IgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IHdpZGdldENvbnN0cnVjdG9yKCk7XG4gICAgICAgIGRub2RlLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldChpbnN0YW5jZSk7XG4gICAgICAgIGluc3RhbmNlRGF0YS5pbnZhbGlkYXRlID0gKCkgPT4ge1xuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZURhdGEucmVuZGVyaW5nID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHByb2plY3RvclN0YXRlLnJlbmRlclF1ZXVlLnB1c2goeyBpbnN0YW5jZSwgZGVwdGg6IHByb2plY3Rpb25PcHRpb25zLmRlcHRoIH0pO1xuICAgICAgICAgICAgICAgIHNjaGVkdWxlUmVuZGVyKHByb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9IHRydWU7XG4gICAgICAgIGluc3RhbmNlLl9fc2V0Q29yZVByb3BlcnRpZXNfXyhkbm9kZS5jb3JlUHJvcGVydGllcyk7XG4gICAgICAgIGluc3RhbmNlLl9fc2V0Q2hpbGRyZW5fXyhkbm9kZS5jaGlsZHJlbik7XG4gICAgICAgIGluc3RhbmNlLl9fc2V0UHJvcGVydGllc19fKGRub2RlLnByb3BlcnRpZXMpO1xuICAgICAgICBjb25zdCByZW5kZXJlZCA9IGluc3RhbmNlLl9fcmVuZGVyX18oKTtcbiAgICAgICAgaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9IGZhbHNlO1xuICAgICAgICBpZiAocmVuZGVyZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkUmVuZGVyZWQgPSBmaWx0ZXJBbmREZWNvcmF0ZUNoaWxkcmVuKHJlbmRlcmVkLCBpbnN0YW5jZSk7XG4gICAgICAgICAgICBkbm9kZS5yZW5kZXJlZCA9IGZpbHRlcmVkUmVuZGVyZWQ7XG4gICAgICAgICAgICBhZGRDaGlsZHJlbihwYXJlbnRWTm9kZSwgZmlsdGVyZWRSZW5kZXJlZCwgcHJvamVjdGlvbk9wdGlvbnMsIGluc3RhbmNlLCBpbnNlcnRCZWZvcmUsIGNoaWxkTm9kZXMpO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlTWFwLnNldChpbnN0YW5jZSwgeyBkbm9kZSwgcGFyZW50Vk5vZGUgfSk7XG4gICAgICAgIGluc3RhbmNlRGF0YS5ub2RlSGFuZGxlci5hZGRSb290KCk7XG4gICAgICAgIHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLm9uQXR0YWNoKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKHByb2plY3RvclN0YXRlLm1lcmdlICYmIHByb2plY3RvclN0YXRlLm1lcmdlRWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkb21Ob2RlID0gZG5vZGUuZG9tTm9kZSA9IHByb2plY3Rpb25PcHRpb25zLm1lcmdlRWxlbWVudDtcbiAgICAgICAgICAgIHByb2plY3RvclN0YXRlLm1lcmdlRWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGluaXRQcm9wZXJ0aWVzQW5kQ2hpbGRyZW4oZG9tTm9kZSwgZG5vZGUsIHBhcmVudEluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9jID0gcGFyZW50Vk5vZGUuZG9tTm9kZS5vd25lckRvY3VtZW50O1xuICAgICAgICBpZiAoIWRub2RlLnRhZyAmJiB0eXBlb2YgZG5vZGUudGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChkbm9kZS5kb21Ob2RlICE9PSB1bmRlZmluZWQgJiYgcGFyZW50Vk5vZGUuZG9tTm9kZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0RvbU5vZGUgPSBkbm9kZS5kb21Ob2RlLm93bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZG5vZGUudGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudFZOb2RlLmRvbU5vZGUgPT09IGRub2RlLmRvbU5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRWTm9kZS5kb21Ob2RlLnJlcGxhY2VDaGlsZChuZXdEb21Ob2RlLCBkbm9kZS5kb21Ob2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFZOb2RlLmRvbU5vZGUuYXBwZW5kQ2hpbGQobmV3RG9tTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGRub2RlLmRvbU5vZGUucGFyZW50Tm9kZSAmJiBkbm9kZS5kb21Ob2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZG5vZGUuZG9tTm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRub2RlLmRvbU5vZGUgPSBuZXdEb21Ob2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZG9tTm9kZSA9IGRub2RlLmRvbU5vZGUgPSBkb2MuY3JlYXRlVGV4dE5vZGUoZG5vZGUudGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKGluc2VydEJlZm9yZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFZOb2RlLmRvbU5vZGUuaW5zZXJ0QmVmb3JlKGRvbU5vZGUsIGluc2VydEJlZm9yZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRWTm9kZS5kb21Ob2RlLmFwcGVuZENoaWxkKGRvbU5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkbm9kZS5kb21Ob2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZG5vZGUudGFnID09PSAnc3ZnJykge1xuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHByb2plY3Rpb25PcHRpb25zLCB7IG5hbWVzcGFjZTogTkFNRVNQQUNFX1NWRyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByb2plY3Rpb25PcHRpb25zLm5hbWVzcGFjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhwcm9qZWN0aW9uT3B0aW9ucy5uYW1lc3BhY2UsIGRub2RlLnRhZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkb21Ob2RlID0gZG5vZGUuZG9tTm9kZSA9IGRub2RlLmRvbU5vZGUgfHwgZG9jLmNyZWF0ZUVsZW1lbnQoZG5vZGUudGFnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb21Ob2RlID0gZG5vZGUuZG9tTm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluaXRQcm9wZXJ0aWVzQW5kQ2hpbGRyZW4oZG9tTm9kZSwgZG5vZGUsIHBhcmVudEluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRWTm9kZS5kb21Ob2RlLmluc2VydEJlZm9yZShkb21Ob2RlLCBpbnNlcnRCZWZvcmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZG9tTm9kZS5wYXJlbnROb2RlICE9PSBwYXJlbnRWTm9kZS5kb21Ob2RlKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50Vk5vZGUuZG9tTm9kZS5hcHBlbmRDaGlsZChkb21Ob2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHVwZGF0ZURvbShwcmV2aW91cywgZG5vZGUsIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRWTm9kZSwgcGFyZW50SW5zdGFuY2UpIHtcbiAgICBpZiAoaXNXTm9kZShkbm9kZSkpIHtcbiAgICAgICAgY29uc3QgeyBpbnN0YW5jZSB9ID0gcHJldmlvdXM7XG4gICAgICAgIGNvbnN0IHsgcGFyZW50Vk5vZGUsIGRub2RlOiBub2RlIH0gPSBpbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpO1xuICAgICAgICBjb25zdCBwcmV2aW91c1JlbmRlcmVkID0gbm9kZSA/IG5vZGUucmVuZGVyZWQgOiBwcmV2aW91cy5yZW5kZXJlZDtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9IHRydWU7XG4gICAgICAgIGluc3RhbmNlLl9fc2V0Q29yZVByb3BlcnRpZXNfXyhkbm9kZS5jb3JlUHJvcGVydGllcyk7XG4gICAgICAgIGluc3RhbmNlLl9fc2V0Q2hpbGRyZW5fXyhkbm9kZS5jaGlsZHJlbik7XG4gICAgICAgIGluc3RhbmNlLl9fc2V0UHJvcGVydGllc19fKGRub2RlLnByb3BlcnRpZXMpO1xuICAgICAgICBkbm9kZS5pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICBpZiAoaW5zdGFuY2VEYXRhLmRpcnR5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCByZW5kZXJlZCA9IGluc3RhbmNlLl9fcmVuZGVyX18oKTtcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGRub2RlLnJlbmRlcmVkID0gZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihyZW5kZXJlZCwgaW5zdGFuY2UpO1xuICAgICAgICAgICAgdXBkYXRlQ2hpbGRyZW4ocGFyZW50Vk5vZGUsIHByZXZpb3VzUmVuZGVyZWQsIGRub2RlLnJlbmRlcmVkLCBpbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgZG5vZGUucmVuZGVyZWQgPSBwcmV2aW91c1JlbmRlcmVkO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlTWFwLnNldChpbnN0YW5jZSwgeyBkbm9kZSwgcGFyZW50Vk5vZGUgfSk7XG4gICAgICAgIGluc3RhbmNlRGF0YS5ub2RlSGFuZGxlci5hZGRSb290KCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAocHJldmlvdXMgPT09IGRub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9tTm9kZSA9IChkbm9kZS5kb21Ob2RlID0gcHJldmlvdXMuZG9tTm9kZSk7XG4gICAgICAgIGxldCB0ZXh0VXBkYXRlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgdXBkYXRlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoIWRub2RlLnRhZyAmJiB0eXBlb2YgZG5vZGUudGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChkbm9kZS50ZXh0ICE9PSBwcmV2aW91cy50ZXh0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3RG9tTm9kZSA9IGRvbU5vZGUub3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkbm9kZS50ZXh0KTtcbiAgICAgICAgICAgICAgICBkb21Ob2RlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5ld0RvbU5vZGUsIGRvbU5vZGUpO1xuICAgICAgICAgICAgICAgIGRub2RlLmRvbU5vZGUgPSBuZXdEb21Ob2RlO1xuICAgICAgICAgICAgICAgIHRleHRVcGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dFVwZGF0ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoZG5vZGUudGFnICYmIGRub2RlLnRhZy5sYXN0SW5kZXhPZignc3ZnJywgMCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBwcm9qZWN0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHByb2plY3Rpb25PcHRpb25zLCB7IG5hbWVzcGFjZTogTkFNRVNQQUNFX1NWRyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcmV2aW91cy5jaGlsZHJlbiAhPT0gZG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGZpbHRlckFuZERlY29yYXRlQ2hpbGRyZW4oZG5vZGUuY2hpbGRyZW4sIHBhcmVudEluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICBkbm9kZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICAgICAgICAgIHVwZGF0ZWQgPVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlbihkbm9kZSwgcHJldmlvdXMuY2hpbGRyZW4sIGNoaWxkcmVuLCBwYXJlbnRJbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpIHx8IHVwZGF0ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c1Byb3BlcnRpZXMgPSBidWlsZFByZXZpb3VzUHJvcGVydGllcyhkb21Ob2RlLCBwcmV2aW91cywgZG5vZGUpO1xuICAgICAgICAgICAgaWYgKGRub2RlLmF0dHJpYnV0ZXMgJiYgZG5vZGUuZXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlQXR0cmlidXRlcyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMuYXR0cmlidXRlcywgZG5vZGUuYXR0cmlidXRlcywgcHJvamVjdGlvbk9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZWQgPVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVQcm9wZXJ0aWVzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcy5wcm9wZXJ0aWVzLCBkbm9kZS5wcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucywgZmFsc2UpIHx8IHVwZGF0ZWQ7XG4gICAgICAgICAgICAgICAgcmVtb3ZlT3JwaGFuZWRFdmVudHMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLmV2ZW50cywgZG5vZGUuZXZlbnRzLCBwcm9qZWN0aW9uT3B0aW9ucywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRzID0gZG5vZGUuZXZlbnRzO1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGV2ZW50cykuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlRXZlbnQoZG9tTm9kZSwgZXZlbnQsIGV2ZW50c1tldmVudF0sIHByb2plY3Rpb25PcHRpb25zLCBkbm9kZS5wcm9wZXJ0aWVzLmJpbmQsIHByZXZpb3VzUHJvcGVydGllcy5ldmVudHNbZXZlbnRdKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHVwZGF0ZWQgPVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVQcm9wZXJ0aWVzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcy5wcm9wZXJ0aWVzLCBkbm9kZS5wcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZG5vZGUucHJvcGVydGllcy5rZXkgIT09IG51bGwgJiYgZG5vZGUucHJvcGVydGllcy5rZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldChwYXJlbnRJbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VEYXRhLm5vZGVIYW5kbGVyLmFkZChkb21Ob2RlLCBgJHtkbm9kZS5wcm9wZXJ0aWVzLmtleX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlZCAmJiBkbm9kZS5wcm9wZXJ0aWVzICYmIGRub2RlLnByb3BlcnRpZXMudXBkYXRlQW5pbWF0aW9uKSB7XG4gICAgICAgICAgICBkbm9kZS5wcm9wZXJ0aWVzLnVwZGF0ZUFuaW1hdGlvbihkb21Ob2RlLCBkbm9kZS5wcm9wZXJ0aWVzLCBwcmV2aW91cy5wcm9wZXJ0aWVzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGFkZERlZmVycmVkUHJvcGVydGllcyh2bm9kZSwgcHJvamVjdGlvbk9wdGlvbnMpIHtcbiAgICAvLyB0cmFuc2ZlciBhbnkgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBwYXNzZWQgLSBhcyB0aGVzZSBtdXN0IGJlIGRlY29yYXRlZCBwcm9wZXJ0aWVzXG4gICAgdm5vZGUuZGVjb3JhdGVkRGVmZXJyZWRQcm9wZXJ0aWVzID0gdm5vZGUucHJvcGVydGllcztcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gdm5vZGUuZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2soISF2bm9kZS5pbnNlcnRlZCk7XG4gICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xuICAgIHZub2RlLnByb3BlcnRpZXMgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9wZXJ0aWVzLCB2bm9kZS5kZWNvcmF0ZWREZWZlcnJlZFByb3BlcnRpZXMpO1xuICAgIHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbih7fSwgdm5vZGUuZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2soISF2bm9kZS5pbnNlcnRlZCksIHZub2RlLmRlY29yYXRlZERlZmVycmVkUHJvcGVydGllcyk7XG4gICAgICAgIHVwZGF0ZVByb3BlcnRpZXModm5vZGUuZG9tTm9kZSwgdm5vZGUucHJvcGVydGllcywgcHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMpO1xuICAgICAgICB2bm9kZS5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHJ1bkRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzKHByb2plY3Rpb25PcHRpb25zKSB7XG4gICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xuICAgIGlmIChwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHByb2plY3Rpb25PcHRpb25zLnN5bmMpIHtcbiAgICAgICAgICAgIHdoaWxlIChwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGdsb2JhbC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHdoaWxlIChwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gcnVuQWZ0ZXJSZW5kZXJDYWxsYmFja3MocHJvamVjdGlvbk9wdGlvbnMpIHtcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XG4gICAgaWYgKHByb2plY3Rpb25PcHRpb25zLnN5bmMpIHtcbiAgICAgICAgd2hpbGUgKHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5zaGlmdCgpO1xuICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKGdsb2JhbC5yZXF1ZXN0SWRsZUNhbGxiYWNrKSB7XG4gICAgICAgICAgICBnbG9iYWwucmVxdWVzdElkbGVDYWxsYmFjaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB3aGlsZSAocHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gcHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHNjaGVkdWxlUmVuZGVyKHByb2plY3Rpb25PcHRpb25zKSB7XG4gICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xuICAgIGlmIChwcm9qZWN0aW9uT3B0aW9ucy5zeW5jKSB7XG4gICAgICAgIHJlbmRlcihwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHByb2plY3RvclN0YXRlLnJlbmRlclNjaGVkdWxlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb2plY3RvclN0YXRlLnJlbmRlclNjaGVkdWxlZCA9IGdsb2JhbC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgcmVuZGVyKHByb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVuZGVyKHByb2plY3Rpb25PcHRpb25zKSB7XG4gICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xuICAgIHByb2plY3RvclN0YXRlLnJlbmRlclNjaGVkdWxlZCA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZW5kZXJRdWV1ZSA9IHByb2plY3RvclN0YXRlLnJlbmRlclF1ZXVlO1xuICAgIGNvbnN0IHJlbmRlcnMgPSBbLi4ucmVuZGVyUXVldWVdO1xuICAgIHByb2plY3RvclN0YXRlLnJlbmRlclF1ZXVlID0gW107XG4gICAgcmVuZGVycy5zb3J0KChhLCBiKSA9PiBhLmRlcHRoIC0gYi5kZXB0aCk7XG4gICAgY29uc3QgcHJldmlvdXNseVJlbmRlcmVkID0gW107XG4gICAgd2hpbGUgKHJlbmRlcnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHsgaW5zdGFuY2UgfSA9IHJlbmRlcnMuc2hpZnQoKTtcbiAgICAgICAgaWYgKGluc3RhbmNlTWFwLmhhcyhpbnN0YW5jZSkgJiYgcHJldmlvdXNseVJlbmRlcmVkLmluZGV4T2YoaW5zdGFuY2UpID09PSAtMSkge1xuICAgICAgICAgICAgcHJldmlvdXNseVJlbmRlcmVkLnB1c2goaW5zdGFuY2UpO1xuICAgICAgICAgICAgY29uc3QgeyBwYXJlbnRWTm9kZSwgZG5vZGUgfSA9IGluc3RhbmNlTWFwLmdldChpbnN0YW5jZSk7XG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpO1xuICAgICAgICAgICAgdXBkYXRlRG9tKGRub2RlLCB0b0ludGVybmFsV05vZGUoaW5zdGFuY2UsIGluc3RhbmNlRGF0YSksIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRWTm9kZSwgaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJ1bkFmdGVyUmVuZGVyQ2FsbGJhY2tzKHByb2plY3Rpb25PcHRpb25zKTtcbiAgICBydW5EZWZlcnJlZFJlbmRlckNhbGxiYWNrcyhwcm9qZWN0aW9uT3B0aW9ucyk7XG59XG5leHBvcnQgY29uc3QgZG9tID0ge1xuICAgIGFwcGVuZDogZnVuY3Rpb24gKHBhcmVudE5vZGUsIGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldChpbnN0YW5jZSk7XG4gICAgICAgIGNvbnN0IGZpbmFsUHJvamVjdG9yT3B0aW9ucyA9IGdldFByb2plY3Rpb25PcHRpb25zKHByb2plY3Rpb25PcHRpb25zLCBpbnN0YW5jZSk7XG4gICAgICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0ge1xuICAgICAgICAgICAgYWZ0ZXJSZW5kZXJDYWxsYmFja3M6IFtdLFxuICAgICAgICAgICAgZGVmZXJyZWRSZW5kZXJDYWxsYmFja3M6IFtdLFxuICAgICAgICAgICAgbm9kZU1hcDogbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgICAgIHJlbmRlclNjaGVkdWxlZDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcmVuZGVyUXVldWU6IFtdLFxuICAgICAgICAgICAgbWVyZ2U6IHByb2plY3Rpb25PcHRpb25zLm1lcmdlIHx8IGZhbHNlLFxuICAgICAgICAgICAgbWVyZ2VFbGVtZW50OiBwcm9qZWN0aW9uT3B0aW9ucy5tZXJnZUVsZW1lbnRcbiAgICAgICAgfTtcbiAgICAgICAgcHJvamVjdG9yU3RhdGVNYXAuc2V0KGluc3RhbmNlLCBwcm9qZWN0b3JTdGF0ZSk7XG4gICAgICAgIGZpbmFsUHJvamVjdG9yT3B0aW9ucy5yb290Tm9kZSA9IHBhcmVudE5vZGU7XG4gICAgICAgIGNvbnN0IHBhcmVudFZOb2RlID0gdG9QYXJlbnRWTm9kZShmaW5hbFByb2plY3Rvck9wdGlvbnMucm9vdE5vZGUpO1xuICAgICAgICBjb25zdCBub2RlID0gdG9JbnRlcm5hbFdOb2RlKGluc3RhbmNlLCBpbnN0YW5jZURhdGEpO1xuICAgICAgICBpbnN0YW5jZU1hcC5zZXQoaW5zdGFuY2UsIHsgZG5vZGU6IG5vZGUsIHBhcmVudFZOb2RlIH0pO1xuICAgICAgICBpbnN0YW5jZURhdGEuaW52YWxpZGF0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5kaXJ0eSA9IHRydWU7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBwcm9qZWN0b3JTdGF0ZS5yZW5kZXJRdWV1ZS5wdXNoKHsgaW5zdGFuY2UsIGRlcHRoOiBmaW5hbFByb2plY3Rvck9wdGlvbnMuZGVwdGggfSk7XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVSZW5kZXIoZmluYWxQcm9qZWN0b3JPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdXBkYXRlRG9tKG5vZGUsIG5vZGUsIGZpbmFsUHJvamVjdG9yT3B0aW9ucywgcGFyZW50Vk5vZGUsIGluc3RhbmNlKTtcbiAgICAgICAgcHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICBpbnN0YW5jZURhdGEub25BdHRhY2goKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJ1bkRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzKGZpbmFsUHJvamVjdG9yT3B0aW9ucyk7XG4gICAgICAgIHJ1bkFmdGVyUmVuZGVyQ2FsbGJhY2tzKGZpbmFsUHJvamVjdG9yT3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkb21Ob2RlOiBmaW5hbFByb2plY3Rvck9wdGlvbnMucm9vdE5vZGVcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGNyZWF0ZTogZnVuY3Rpb24gKGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksIGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgfSxcbiAgICBtZXJnZTogZnVuY3Rpb24gKGVsZW1lbnQsIGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHByb2plY3Rpb25PcHRpb25zLm1lcmdlID0gdHJ1ZTtcbiAgICAgICAgcHJvamVjdGlvbk9wdGlvbnMubWVyZ2VFbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbiA9IHRoaXMuYXBwZW5kKGVsZW1lbnQucGFyZW50Tm9kZSwgaW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQoaW5zdGFuY2UpO1xuICAgICAgICBwcm9qZWN0b3JTdGF0ZS5tZXJnZSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gcHJvamVjdGlvbjtcbiAgICB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmRvbS5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvdmRvbS5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL3Zkb20ubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiLyoqKiBJTVBPUlRTIEZST00gaW1wb3J0cy1sb2FkZXIgKioqL1xudmFyIHdpZGdldEZhY3RvcnkgPSByZXF1aXJlKFwic3JjL21lbnUtaXRlbS9NZW51SXRlbVwiKTtcblxudmFyIHJlZ2lzdGVyQ3VzdG9tRWxlbWVudCA9IHJlcXVpcmUoJ0Bkb2pvL3dpZGdldC1jb3JlL3JlZ2lzdGVyQ3VzdG9tRWxlbWVudCcpLmRlZmF1bHQ7XG5cbnZhciBkZWZhdWx0RXhwb3J0ID0gd2lkZ2V0RmFjdG9yeS5kZWZhdWx0O1xuZGVmYXVsdEV4cG9ydCAmJiByZWdpc3RlckN1c3RvbUVsZW1lbnQoZGVmYXVsdEV4cG9ydCk7XG5cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2ltcG9ydHMtbG9hZGVyP3dpZGdldEZhY3Rvcnk9c3JjL21lbnUtaXRlbS9NZW51SXRlbSEuL25vZGVfbW9kdWxlcy9AZG9qby9jbGktYnVpbGQtd2lkZ2V0L3RlbXBsYXRlL2N1c3RvbS1lbGVtZW50LmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9pbXBvcnRzLWxvYWRlci9pbmRleC5qcz93aWRnZXRGYWN0b3J5PXNyYy9tZW51LWl0ZW0vTWVudUl0ZW0hLi9ub2RlX21vZHVsZXMvQGRvam8vY2xpLWJ1aWxkLXdpZGdldC90ZW1wbGF0ZS9jdXN0b20tZWxlbWVudC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXHJcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXHJcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcblxyXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXHJcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcclxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcclxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cclxuXHJcblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xyXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIGlmIChlLmluZGV4T2YocFtpXSkgPCAwKVxyXG4gICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHJlc3VsdC52YWx1ZSk7IH0pLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0geVtvcFswXSAmIDIgPyBcInJldHVyblwiIDogb3BbMF0gPyBcInRocm93XCIgOiBcIm5leHRcIl0pICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gWzAsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBleHBvcnRzKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmICghZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7ICB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAob1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpIHx8ICgxLGV2YWwpKFwidGhpc1wiKTtcbn0gY2F0Y2goZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZih0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKVxuXHRcdGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vICh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvd2VicGFjay9idWlsZGluL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCB7IHYgfSBmcm9tICdAZG9qby93aWRnZXQtY29yZS9kJztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdAZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2N1c3RvbUVsZW1lbnQnO1xuaW1wb3J0IHsgV2lkZ2V0UHJvcGVydGllcyB9IGZyb20gJ0Bkb2pvL3dpZGdldC1jb3JlL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgdGhlbWUsIFRoZW1lZE1peGluIH0gZnJvbSAnQGRvam8vd2lkZ2V0LWNvcmUvbWl4aW5zL1RoZW1lZCc7XG5pbXBvcnQgeyBXaWRnZXRCYXNlIH0gZnJvbSAnQGRvam8vd2lkZ2V0LWNvcmUvV2lkZ2V0QmFzZSc7XG5cbmltcG9ydCAqIGFzIGNzcyBmcm9tICcuL21lbnVJdGVtLm0uY3NzJztcblxuZXhwb3J0IGludGVyZmFjZSBNZW51SXRlbVByb3BlcnRpZXMgZXh0ZW5kcyBXaWRnZXRQcm9wZXJ0aWVzIHtcblx0dGl0bGU6IHN0cmluZztcblx0c2VsZWN0ZWQ/OiBib29sZWFuO1xuXHRkYXRhPzogYW55O1xuXHRvblNlbGVjdGVkPzogKGRhdGE6IGFueSkgPT4gdm9pZDtcbn1cblxuQGN1c3RvbUVsZW1lbnQ8TWVudUl0ZW1Qcm9wZXJ0aWVzPih7XG5cdHRhZzogJ2RlbW8tbWVudS1pdGVtJyxcblx0YXR0cmlidXRlczogWyd0aXRsZScsICdzZWxlY3RlZCddLFxuXHRldmVudHM6IFsnb25TZWxlY3RlZCddLFxuXHRwcm9wZXJ0aWVzOiBbJ2RhdGEnLCAnc2VsZWN0ZWQnXVxufSlcbkB0aGVtZShjc3MpXG5leHBvcnQgY2xhc3MgTWVudUl0ZW0gZXh0ZW5kcyBUaGVtZWRNaXhpbihXaWRnZXRCYXNlKTxNZW51SXRlbVByb3BlcnRpZXM+IHtcblx0cHJpdmF0ZSBfb25DbGljaygpIHtcblx0XHR0aGlzLnByb3BlcnRpZXMub25TZWxlY3RlZCAmJiB0aGlzLnByb3BlcnRpZXMub25TZWxlY3RlZCh0aGlzLnByb3BlcnRpZXMuZGF0YSk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgcmVuZGVyKCkge1xuXHRcdGNvbnN0IHsgdGl0bGUsIHNlbGVjdGVkIH0gPSB0aGlzLnByb3BlcnRpZXM7XG5cblx0XHRyZXR1cm4gdignbGknLCB7IGNsYXNzZXM6IHRoaXMudGhlbWUoY3NzLnJvb3QpIH0sIFtcblx0XHRcdHYoXG5cdFx0XHRcdCdzcGFuJyxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNsYXNzZXM6IHRoaXMudGhlbWUoW2Nzcy5pdGVtLCBzZWxlY3RlZCA/IGNzcy5zZWxlY3RlZCA6IG51bGxdKSxcblx0XHRcdFx0XHRvbmNsaWNrOiB0aGlzLl9vbkNsaWNrXG5cdFx0XHRcdH0sXG5cdFx0XHRcdFt0aXRsZV1cblx0XHRcdClcblx0XHRdKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBNZW51SXRlbTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kdHMtbG9hZGVyP3R5cGU9dHMmaW5zdGFuY2VOYW1lPTBfbWVudS1pdGVtIS4vc3JjL21lbnUtaXRlbS9NZW51SXRlbS50cyIsIi8vIHJlbW92ZWQgYnkgZXh0cmFjdC10ZXh0LXdlYnBhY2stcGx1Z2luXG5tb2R1bGUuZXhwb3J0cyA9IHtcIiBfa2V5XCI6XCJ0ZXN0LWFwcC9tZW51SXRlbVwiLFwicm9vdFwiOlwibWVudUl0ZW0tbV9fcm9vdF9fc1VtVWlcIixcIml0ZW1cIjpcIm1lbnVJdGVtLW1fX2l0ZW1fXzJNazZSXCIsXCJzZWxlY3RlZFwiOlwibWVudUl0ZW0tbV9fc2VsZWN0ZWRfXzEtZjNJXCJ9O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL21lbnUtaXRlbS9tZW51SXRlbS5tLmNzc1xuLy8gbW9kdWxlIGlkID0gLi9zcmMvbWVudS1pdGVtL21lbnVJdGVtLm0uY3NzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgZDg5ODVjNzU5MDg5ZmE1MDE3ZjIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9jb3JlL0Rlc3Ryb3lhYmxlLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL2NvcmUvRXZlbnRlZC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9jb3JlL2xhbmcubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvaGFzL2hhcy5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL01hcC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL1Byb21pc2UubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9TeW1ib2wubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9XZWFrTWFwLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vYXJyYXkubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9nbG9iYWwubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9pdGVyYXRvci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL251bWJlci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL29iamVjdC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL3N0cmluZy5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL3N1cHBvcnQvaGFzLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vc3VwcG9ydC9xdWV1ZS5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL3N1cHBvcnQvdXRpbC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9JbmplY3Rvci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9Ob2RlSGFuZGxlci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9SZWdpc3RyeS5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9SZWdpc3RyeUhhbmRsZXIubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvV2lkZ2V0QmFzZS5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9hbmltYXRpb25zL2Nzc1RyYW5zaXRpb25zLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2QubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9hZnRlclJlbmRlci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2Fsd2F5c1JlbmRlci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2JlZm9yZVByb3BlcnRpZXMubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9jdXN0b21FbGVtZW50Lm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvZGlmZlByb3BlcnR5Lm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaGFuZGxlRGVjb3JhdG9yLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaW5qZWN0Lm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RpZmYubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvbWl4aW5zL1Byb2plY3Rvci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9taXhpbnMvVGhlbWVkLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL3JlZ2lzdGVyQ3VzdG9tRWxlbWVudC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS92ZG9tLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vY2xpLWJ1aWxkLXdpZGdldC90ZW1wbGF0ZS9jdXN0b20tZWxlbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbWVudS1pdGVtL01lbnVJdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9tZW51LWl0ZW0vbWVudUl0ZW0ubS5jc3M/NmE5NSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUFzRCwrREFBK0Q7O0FBRXJIO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7QUM3RGdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEIsaUJBQWlCLE9BQU87QUFDeEI7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvQkFBb0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQSx3Qzs7Ozs7Ozs7Ozs7QUN2REE7QUFDc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsZ0NBQWdDO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2RWlCO0FBQ0E7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiwyQkFBMkI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLG9CQUFvQjtBQUMzQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsaUM7Ozs7Ozs7Ozs7OztBQ25NQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLE9BQU8saUJBQWlCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QkFBMkIsTUFBTTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QixxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7Ozs7O0FDdE1BO0FBQ0E7QUFDNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsSUFBSTtBQUNwQixnQkFBZ0IsT0FBTztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxJQUFJO0FBQ2hCLFlBQVksVUFBVTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxtQzs7Ozs7Ozs7Ozs7OztBQ2hKQTtBQUNzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxxQkFBcUI7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGdDQUFnQztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlHQTtBQUNrQztBQUNQO0FBQzNCO0FBQ3FCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3RELG9EQUFvRDtBQUNwRCxpREFBaUQ7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRUFBcUU7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsc0JBQXNCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFlBQVk7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLFNBQVM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0M7Ozs7Ozs7O0FDdlBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG1DOzs7Ozs7Ozs7Ozs7Ozs7QUNqQkE7QUFDaUQ7QUFDakQsb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDOzs7Ozs7Ozs7Ozs7O0FDOUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyREE7QUFDQTtBQUNtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0Q7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLElBQUk7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlHQTtBQUNBO0FBQ3FCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELFlBQVk7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RkFBd0Y7QUFDeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DOzs7Ozs7Ozs7OztBQ3hTbUI7QUFDbkI7MEVBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsRUFBRTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCxFQUFFO0FBQ2pFLG1DQUFtQyxtQkFBbUI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxnQzs7Ozs7Ozs7Ozs7QUNyS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFBQTtBQUFBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4RUFBOEU7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFBQTtBQUFBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsZ0NBQWdDLG1CQUFtQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxrQzs7Ozs7Ozs7O0FDekxBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQzs7Ozs7Ozs7O0FDdEJrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQSxxQzs7Ozs7Ozs7Ozs7QUNwQmtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNB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QUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsc0JBQXNCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFVBQVU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2THRDO0FBQUE7QUFDQTtBQUNBLCtEQUErRDtBQUMvRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFB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LENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVTLE1BQU07UUFDZixNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFFNUMsTUFBTSxDQUFDLGdGQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMscURBQVEsQ0FBQyxFQUFFLEVBQUU7WUFDakQsZ0ZBQUMsQ0FDQSxNQUFNLEVBQ047Z0JBQ0MsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxxREFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMseURBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQy9ELE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUTthQUN0QixFQUNELENBQUMsS0FBSyxDQUFDLENBQ1A7U0FDRCxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0Q7QUFuQlksUUFBUTtJQVBwQixtSEFBYSxDQUFxQjtRQUNsQyxHQUFHLEVBQUUsZ0JBQWdCO1FBQ3JCLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUM7UUFDakMsTUFBTSxFQUFFLENBQUMsWUFBWSxDQUFDO1FBQ3RCLFVBQVUsRUFBRSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUM7S0FDaEMsQ0FBQztJQUNELGdHQUFLLENBQUMsNkNBQUcsQ0FBQztHQUNFLFFBQVEsQ0FtQnBCO0FBbkJvQjtBQXFCckIsK0RBQWUsUUFBUSxFQUFDOzs7Ozs7OztBQzNDeEI7QUFDQSxrQkFBa0Isd0kiLCJmaWxlIjoibWVudS1pdGVtLTEuMC4wLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgZDg5ODVjNzU5MDg5ZmE1MDE3ZjIiLCJpbXBvcnQgeyBjcmVhdGVDb21wb3NpdGVIYW5kbGUgfSBmcm9tICcuL2xhbmcnO1xuaW1wb3J0IFByb21pc2UgZnJvbSAnLi4vc2hpbS9Qcm9taXNlJztcbi8qKlxuICogTm8gb3BlcmF0aW9uIGZ1bmN0aW9uIHRvIHJlcGxhY2Ugb3duIG9uY2UgaW5zdGFuY2UgaXMgZGVzdG9yeWVkXG4gKi9cbmZ1bmN0aW9uIG5vb3AoKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG59XG4vKipcbiAqIE5vIG9wIGZ1bmN0aW9uIHVzZWQgdG8gcmVwbGFjZSBvd24sIG9uY2UgaW5zdGFuY2UgaGFzIGJlZW4gZGVzdG9yeWVkXG4gKi9cbmZ1bmN0aW9uIGRlc3Ryb3llZCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbGwgbWFkZSB0byBkZXN0cm95ZWQgbWV0aG9kJyk7XG59XG5leHBvcnQgY2xhc3MgRGVzdHJveWFibGUge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmhhbmRsZXMgPSBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgaGFuZGxlcyBmb3IgdGhlIGluc3RhbmNlIHRoYXQgd2lsbCBiZSBkZXN0cm95ZWQgd2hlbiBgdGhpcy5kZXN0cm95YCBpcyBjYWxsZWRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SGFuZGxlfSBoYW5kbGUgVGhlIGhhbmRsZSB0byBhZGQgZm9yIHRoZSBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtIYW5kbGV9IGEgaGFuZGxlIGZvciB0aGUgaGFuZGxlLCByZW1vdmVzIHRoZSBoYW5kbGUgZm9yIHRoZSBpbnN0YW5jZSBhbmQgY2FsbHMgZGVzdHJveVxuICAgICAqL1xuICAgIG93bihoYW5kbGVzKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZSA9IEFycmF5LmlzQXJyYXkoaGFuZGxlcykgPyBjcmVhdGVDb21wb3NpdGVIYW5kbGUoLi4uaGFuZGxlcykgOiBoYW5kbGVzO1xuICAgICAgICBjb25zdCB7IGhhbmRsZXM6IF9oYW5kbGVzIH0gPSB0aGlzO1xuICAgICAgICBfaGFuZGxlcy5wdXNoKGhhbmRsZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZXN0cm95KCkge1xuICAgICAgICAgICAgICAgIF9oYW5kbGVzLnNwbGljZShfaGFuZGxlcy5pbmRleE9mKGhhbmRsZSkpO1xuICAgICAgICAgICAgICAgIGhhbmRsZS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlc3RycHlzIGFsbCBoYW5kZXJzIHJlZ2lzdGVyZWQgZm9yIHRoZSBpbnN0YW5jZVxuICAgICAqXG4gICAgICogQHJldHVybnMge1Byb21pc2U8YW55fSBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIGFsbCBoYW5kbGVzIGhhdmUgYmVlbiBkZXN0cm95ZWRcbiAgICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlcy5mb3JFYWNoKChoYW5kbGUpID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGUgJiYgaGFuZGxlLmRlc3Ryb3kgJiYgaGFuZGxlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95ID0gbm9vcDtcbiAgICAgICAgICAgIHRoaXMub3duID0gZGVzdHJveWVkO1xuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgRGVzdHJveWFibGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZXN0cm95YWJsZS5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL2NvcmUvRGVzdHJveWFibGUubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvY29yZS9EZXN0cm95YWJsZS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgTWFwIGZyb20gJy4uL3NoaW0vTWFwJztcbmltcG9ydCB7IERlc3Ryb3lhYmxlIH0gZnJvbSAnLi9EZXN0cm95YWJsZSc7XG4vKipcbiAqIE1hcCBvZiBjb21wdXRlZCByZWd1bGFyIGV4cHJlc3Npb25zLCBrZXllZCBieSBzdHJpbmdcbiAqL1xuY29uc3QgcmVnZXhNYXAgPSBuZXcgTWFwKCk7XG4vKipcbiAqIERldGVybWluZXMgaXMgdGhlIGV2ZW50IHR5cGUgZ2xvYiBoYXMgYmVlbiBtYXRjaGVkXG4gKlxuICogQHJldHVybnMgYm9vbGVhbiB0aGF0IGluZGljYXRlcyBpZiB0aGUgZ2xvYiBpcyBtYXRjaGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0dsb2JNYXRjaChnbG9iU3RyaW5nLCB0YXJnZXRTdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHRhcmdldFN0cmluZyA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIGdsb2JTdHJpbmcgPT09ICdzdHJpbmcnICYmIGdsb2JTdHJpbmcuaW5kZXhPZignKicpICE9PSAtMSkge1xuICAgICAgICBsZXQgcmVnZXg7XG4gICAgICAgIGlmIChyZWdleE1hcC5oYXMoZ2xvYlN0cmluZykpIHtcbiAgICAgICAgICAgIHJlZ2V4ID0gcmVnZXhNYXAuZ2V0KGdsb2JTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVnZXggPSBuZXcgUmVnRXhwKGBeJHtnbG9iU3RyaW5nLnJlcGxhY2UoL1xcKi9nLCAnLionKX0kYCk7XG4gICAgICAgICAgICByZWdleE1hcC5zZXQoZ2xvYlN0cmluZywgcmVnZXgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWdleC50ZXN0KHRhcmdldFN0cmluZyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gZ2xvYlN0cmluZyA9PT0gdGFyZ2V0U3RyaW5nO1xuICAgIH1cbn1cbi8qKlxuICogRXZlbnQgQ2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIEV2ZW50ZWQgZXh0ZW5kcyBEZXN0cm95YWJsZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBtYXAgb2YgbGlzdGVuZXJzIGtleWVkIGJ5IGV2ZW50IHR5cGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubGlzdGVuZXJzTWFwID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBlbWl0KGV2ZW50KSB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzTWFwLmZvckVhY2goKG1ldGhvZHMsIHR5cGUpID0+IHtcbiAgICAgICAgICAgIGlmIChpc0dsb2JNYXRjaCh0eXBlLCBldmVudC50eXBlKSkge1xuICAgICAgICAgICAgICAgIFsuLi5tZXRob2RzXS5mb3JFYWNoKChtZXRob2QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmNhbGwodGhpcywgZXZlbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGlzdGVuZXIpKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVzID0gbGlzdGVuZXIubWFwKChsaXN0ZW5lcikgPT4gdGhpcy5fYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcy5mb3JFYWNoKChoYW5kbGUpID0+IGhhbmRsZS5kZXN0cm95KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKTtcbiAgICB9XG4gICAgX2FkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzTWFwLmdldCh0eXBlKSB8fCBbXTtcbiAgICAgICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICB0aGlzLmxpc3RlbmVyc01hcC5zZXQodHlwZSwgbGlzdGVuZXJzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyc01hcC5nZXQodHlwZSkgfHwgW107XG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShsaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lciksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IEV2ZW50ZWQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FdmVudGVkLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvY29yZS9FdmVudGVkLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL2NvcmUvRXZlbnRlZC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgeyBhc3NpZ24gfSBmcm9tICcuLi9zaGltL29iamVjdCc7XG5leHBvcnQgeyBhc3NpZ24gfSBmcm9tICcuLi9zaGltL29iamVjdCc7XG5jb25zdCBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbmNvbnN0IGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbi8qKlxuICogVHlwZSBndWFyZCB0aGF0IGVuc3VyZXMgdGhhdCB0aGUgdmFsdWUgY2FuIGJlIGNvZXJjZWQgdG8gT2JqZWN0XG4gKiB0byB3ZWVkIG91dCBob3N0IG9iamVjdHMgdGhhdCBkbyBub3QgZGVyaXZlIGZyb20gT2JqZWN0LlxuICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNoZWNrIGlmIHdlIHdhbnQgdG8gZGVlcCBjb3B5IGFuIG9iamVjdCBvciBub3QuXG4gKiBOb3RlOiBJbiBFUzYgaXQgaXMgcG9zc2libGUgdG8gbW9kaWZ5IGFuIG9iamVjdCdzIFN5bWJvbC50b1N0cmluZ1RhZyBwcm9wZXJ0eSwgd2hpY2ggd2lsbFxuICogY2hhbmdlIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBgdG9TdHJpbmdgLiBUaGlzIGlzIGEgcmFyZSBlZGdlIGNhc2UgdGhhdCBpcyBkaWZmaWN1bHQgdG8gaGFuZGxlLFxuICogc28gaXQgaXMgbm90IGhhbmRsZWQgaGVyZS5cbiAqIEBwYXJhbSAgdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJuICAgICAgIElmIHRoZSB2YWx1ZSBpcyBjb2VyY2libGUgaW50byBhbiBPYmplY3RcbiAqL1xuZnVuY3Rpb24gc2hvdWxkRGVlcENvcHlPYmplY3QodmFsdWUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG59XG5mdW5jdGlvbiBjb3B5QXJyYXkoYXJyYXksIGluaGVyaXRlZCkge1xuICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb3B5QXJyYXkoaXRlbSwgaW5oZXJpdGVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXNob3VsZERlZXBDb3B5T2JqZWN0KGl0ZW0pXG4gICAgICAgICAgICA/IGl0ZW1cbiAgICAgICAgICAgIDogX21peGluKHtcbiAgICAgICAgICAgICAgICBkZWVwOiB0cnVlLFxuICAgICAgICAgICAgICAgIGluaGVyaXRlZDogaW5oZXJpdGVkLFxuICAgICAgICAgICAgICAgIHNvdXJjZXM6IFtpdGVtXSxcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IHt9XG4gICAgICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIF9taXhpbihrd0FyZ3MpIHtcbiAgICBjb25zdCBkZWVwID0ga3dBcmdzLmRlZXA7XG4gICAgY29uc3QgaW5oZXJpdGVkID0ga3dBcmdzLmluaGVyaXRlZDtcbiAgICBjb25zdCB0YXJnZXQgPSBrd0FyZ3MudGFyZ2V0O1xuICAgIGNvbnN0IGNvcGllZCA9IGt3QXJncy5jb3BpZWQgfHwgW107XG4gICAgY29uc3QgY29waWVkQ2xvbmUgPSBbLi4uY29waWVkXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGt3QXJncy5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGt3QXJncy5zb3VyY2VzW2ldO1xuICAgICAgICBpZiAoc291cmNlID09PSBudWxsIHx8IHNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gc291cmNlW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKGNvcGllZENsb25lLmluZGV4T2YodmFsdWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRlZXApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvcHlBcnJheSh2YWx1ZSwgaW5oZXJpdGVkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzaG91bGREZWVwQ29weU9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldFZhbHVlID0gdGFyZ2V0W2tleV0gfHwge307XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWQucHVzaChzb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBfbWl4aW4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXA6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdGVkOiBpbmhlcml0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlczogW3ZhbHVlXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IHRhcmdldFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZShwcm90b3R5cGUsIC4uLm1peGlucykge1xuICAgIGlmICghbWl4aW5zLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignbGFuZy5jcmVhdGUgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIG1peGluIG9iamVjdC4nKTtcbiAgICB9XG4gICAgY29uc3QgYXJncyA9IG1peGlucy5zbGljZSgpO1xuICAgIGFyZ3MudW5zaGlmdChPYmplY3QuY3JlYXRlKHByb3RvdHlwZSkpO1xuICAgIHJldHVybiBhc3NpZ24uYXBwbHkobnVsbCwgYXJncyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVlcEFzc2lnbih0YXJnZXQsIC4uLnNvdXJjZXMpIHtcbiAgICByZXR1cm4gX21peGluKHtcbiAgICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgICAgaW5oZXJpdGVkOiBmYWxzZSxcbiAgICAgICAgc291cmNlczogc291cmNlcyxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWVwTWl4aW4odGFyZ2V0LCAuLi5zb3VyY2VzKSB7XG4gICAgcmV0dXJuIF9taXhpbih7XG4gICAgICAgIGRlZXA6IHRydWUsXG4gICAgICAgIGluaGVyaXRlZDogdHJ1ZSxcbiAgICAgICAgc291cmNlczogc291cmNlcyxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRcbiAgICB9KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3QgdXNpbmcgdGhlIHByb3ZpZGVkIHNvdXJjZSdzIHByb3RvdHlwZSBhcyB0aGUgcHJvdG90eXBlIGZvciB0aGUgbmV3IG9iamVjdCwgYW5kIHRoZW5cbiAqIGRlZXAgY29waWVzIHRoZSBwcm92aWRlZCBzb3VyY2UncyB2YWx1ZXMgaW50byB0aGUgbmV3IHRhcmdldC5cbiAqXG4gKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3QgdG8gZHVwbGljYXRlXG4gKiBAcmV0dXJuIFRoZSBuZXcgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkdXBsaWNhdGUoc291cmNlKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2Yoc291cmNlKSk7XG4gICAgcmV0dXJuIGRlZXBNaXhpbih0YXJnZXQsIHNvdXJjZSk7XG59XG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0d28gdmFsdWVzIGFyZSB0aGUgc2FtZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gYSBGaXJzdCB2YWx1ZSB0byBjb21wYXJlXG4gKiBAcGFyYW0gYiBTZWNvbmQgdmFsdWUgdG8gY29tcGFyZVxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZXMgYXJlIHRoZSBzYW1lOyBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSWRlbnRpY2FsKGEsIGIpIHtcbiAgICByZXR1cm4gKGEgPT09IGIgfHxcbiAgICAgICAgLyogYm90aCB2YWx1ZXMgYXJlIE5hTiAqL1xuICAgICAgICAoYSAhPT0gYSAmJiBiICE9PSBiKSk7XG59XG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGJpbmRzIGEgbWV0aG9kIHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGF0IHJ1bnRpbWUuIFRoaXMgaXMgc2ltaWxhciB0b1xuICogYEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kYCwgYnV0IGluc3RlYWQgb2YgYSBmdW5jdGlvbiBpdCB0YWtlcyB0aGUgbmFtZSBvZiBhIG1ldGhvZCBvbiBhbiBvYmplY3QuXG4gKiBBcyBhIHJlc3VsdCwgdGhlIGZ1bmN0aW9uIHJldHVybmVkIGJ5IGBsYXRlQmluZGAgd2lsbCBhbHdheXMgY2FsbCB0aGUgZnVuY3Rpb24gY3VycmVudGx5IGFzc2lnbmVkIHRvXG4gKiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG9uIHRoZSBvYmplY3QgYXMgb2YgdGhlIG1vbWVudCB0aGUgZnVuY3Rpb24gaXQgcmV0dXJucyBpcyBjYWxsZWQuXG4gKlxuICogQHBhcmFtIGluc3RhbmNlIFRoZSBjb250ZXh0IG9iamVjdFxuICogQHBhcmFtIG1ldGhvZCBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIG9uIHRoZSBjb250ZXh0IG9iamVjdCB0byBiaW5kIHRvIGl0c2VsZlxuICogQHBhcmFtIHN1cHBsaWVkQXJncyBBbiBvcHRpb25hbCBhcnJheSBvZiB2YWx1ZXMgdG8gcHJlcGVuZCB0byB0aGUgYGluc3RhbmNlW21ldGhvZF1gIGFyZ3VtZW50cyBsaXN0XG4gKiBAcmV0dXJuIFRoZSBib3VuZCBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gbGF0ZUJpbmQoaW5zdGFuY2UsIG1ldGhvZCwgLi4uc3VwcGxpZWRBcmdzKSB7XG4gICAgcmV0dXJuIHN1cHBsaWVkQXJncy5sZW5ndGhcbiAgICAgICAgPyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBhcmdzID0gYXJndW1lbnRzLmxlbmd0aCA/IHN1cHBsaWVkQXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKSA6IHN1cHBsaWVkQXJncztcbiAgICAgICAgICAgIC8vIFRTNzAxN1xuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlW21ldGhvZF0uYXBwbHkoaW5zdGFuY2UsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gVFM3MDE3XG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VbbWV0aG9kXS5hcHBseShpbnN0YW5jZSwgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtaXhpbih0YXJnZXQsIC4uLnNvdXJjZXMpIHtcbiAgICByZXR1cm4gX21peGluKHtcbiAgICAgICAgZGVlcDogZmFsc2UsXG4gICAgICAgIGluaGVyaXRlZDogdHJ1ZSxcbiAgICAgICAgc291cmNlczogc291cmNlcyxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRcbiAgICB9KTtcbn1cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHdoaWNoIGludm9rZXMgdGhlIGdpdmVuIGZ1bmN0aW9uIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cyBwcmVwZW5kZWQgdG8gaXRzIGFyZ3VtZW50IGxpc3QuXG4gKiBMaWtlIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAsIGJ1dCBkb2VzIG5vdCBhbHRlciBleGVjdXRpb24gY29udGV4dC5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0RnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRoYXQgbmVlZHMgdG8gYmUgYm91bmRcbiAqIEBwYXJhbSBzdXBwbGllZEFyZ3MgQW4gb3B0aW9uYWwgYXJyYXkgb2YgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhlIGB0YXJnZXRGdW5jdGlvbmAgYXJndW1lbnRzIGxpc3RcbiAqIEByZXR1cm4gVGhlIGJvdW5kIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJ0aWFsKHRhcmdldEZ1bmN0aW9uLCAuLi5zdXBwbGllZEFyZ3MpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBhcmdzID0gYXJndW1lbnRzLmxlbmd0aCA/IHN1cHBsaWVkQXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKSA6IHN1cHBsaWVkQXJncztcbiAgICAgICAgcmV0dXJuIHRhcmdldEZ1bmN0aW9uLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG59XG4vKipcbiAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBkZXN0cm95IG1ldGhvZCB0aGF0LCB3aGVuIGNhbGxlZCwgY2FsbHMgdGhlIHBhc3NlZC1pbiBkZXN0cnVjdG9yLlxuICogVGhpcyBpcyBpbnRlbmRlZCB0byBwcm92aWRlIGEgdW5pZmllZCBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIFwicmVtb3ZlXCIgLyBcImRlc3Ryb3lcIiBoYW5kbGVycyBmb3JcbiAqIGV2ZW50IGxpc3RlbmVycywgdGltZXJzLCBldGMuXG4gKlxuICogQHBhcmFtIGRlc3RydWN0b3IgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGhhbmRsZSdzIGBkZXN0cm95YCBtZXRob2QgaXMgaW52b2tlZFxuICogQHJldHVybiBUaGUgaGFuZGxlIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSGFuZGxlKGRlc3RydWN0b3IpIHtcbiAgICBsZXQgY2FsbGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFjYWxsZWQpIHtcbiAgICAgICAgICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGRlc3RydWN0b3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG4vKipcbiAqIFJldHVybnMgYSBzaW5nbGUgaGFuZGxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVzdHJveSBtdWx0aXBsZSBoYW5kbGVzIHNpbXVsdGFuZW91c2x5LlxuICpcbiAqIEBwYXJhbSBoYW5kbGVzIEFuIGFycmF5IG9mIGhhbmRsZXMgd2l0aCBgZGVzdHJveWAgbWV0aG9kc1xuICogQHJldHVybiBUaGUgaGFuZGxlIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29tcG9zaXRlSGFuZGxlKC4uLmhhbmRsZXMpIHtcbiAgICByZXR1cm4gY3JlYXRlSGFuZGxlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoYW5kbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBoYW5kbGVzW2ldLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGFuZy5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL2NvcmUvbGFuZy5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9jb3JlL2xhbmcubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiZnVuY3Rpb24gaXNGZWF0dXJlVGVzdFRoZW5hYmxlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICYmIHZhbHVlLnRoZW47XG59XG4vKipcbiAqIEEgY2FjaGUgb2YgcmVzdWx0cyBvZiBmZWF0dXJlIHRlc3RzXG4gKi9cbmV4cG9ydCBjb25zdCB0ZXN0Q2FjaGUgPSB7fTtcbi8qKlxuICogQSBjYWNoZSBvZiB0aGUgdW4tcmVzb2x2ZWQgZmVhdHVyZSB0ZXN0c1xuICovXG5leHBvcnQgY29uc3QgdGVzdEZ1bmN0aW9ucyA9IHt9O1xuLyoqXG4gKiBBIGNhY2hlIG9mIHVucmVzb2x2ZWQgdGhlbmFibGVzIChwcm9iYWJseSBwcm9taXNlcylcbiAqIEB0eXBlIHt7fX1cbiAqL1xuY29uc3QgdGVzdFRoZW5hYmxlcyA9IHt9O1xuLyoqXG4gKiBBIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIHNjb3BlIChgd2luZG93YCBpbiBhIGJyb3dzZXIsIGBnbG9iYWxgIGluIE5vZGVKUylcbiAqL1xuY29uc3QgZ2xvYmFsU2NvcGUgPSAoZnVuY3Rpb24gKCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIEJyb3dzZXJzXG4gICAgICAgIHJldHVybiB3aW5kb3c7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIE5vZGVcbiAgICAgICAgcmV0dXJuIGdsb2JhbDtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIFdlYiB3b3JrZXJzXG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiB7fTtcbn0pKCk7XG4vKiBHcmFiIHRoZSBzdGF0aWNGZWF0dXJlcyBpZiB0aGVyZSBhcmUgYXZhaWxhYmxlICovXG5jb25zdCB7IHN0YXRpY0ZlYXR1cmVzIH0gPSBnbG9iYWxTY29wZS5Eb2pvSGFzRW52aXJvbm1lbnQgfHwge307XG4vKiBDbGVhbmluZyB1cCB0aGUgRG9qb0hhc0Vudmlvcm5tZW50ICovXG5pZiAoJ0Rvam9IYXNFbnZpcm9ubWVudCcgaW4gZ2xvYmFsU2NvcGUpIHtcbiAgICBkZWxldGUgZ2xvYmFsU2NvcGUuRG9qb0hhc0Vudmlyb25tZW50O1xufVxuLyoqXG4gKiBDdXN0b20gdHlwZSBndWFyZCB0byBuYXJyb3cgdGhlIGBzdGF0aWNGZWF0dXJlc2AgdG8gZWl0aGVyIGEgbWFwIG9yIGEgZnVuY3Rpb24gdGhhdFxuICogcmV0dXJucyBhIG1hcC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGd1YXJkIGZvclxuICovXG5mdW5jdGlvbiBpc1N0YXRpY0ZlYXR1cmVGdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XG59XG4vKipcbiAqIFRoZSBjYWNoZSBvZiBhc3NlcnRlZCBmZWF0dXJlcyB0aGF0IHdlcmUgYXZhaWxhYmxlIGluIHRoZSBnbG9iYWwgc2NvcGUgd2hlbiB0aGVcbiAqIG1vZHVsZSBsb2FkZWRcbiAqL1xuY29uc3Qgc3RhdGljQ2FjaGUgPSBzdGF0aWNGZWF0dXJlc1xuICAgID8gaXNTdGF0aWNGZWF0dXJlRnVuY3Rpb24oc3RhdGljRmVhdHVyZXMpID8gc3RhdGljRmVhdHVyZXMuYXBwbHkoZ2xvYmFsU2NvcGUpIDogc3RhdGljRmVhdHVyZXNcbiAgICA6IHt9OyAvKiBQcm92aWRpbmcgYW4gZW1wdHkgY2FjaGUsIGlmIG5vbmUgd2FzIGluIHRoZSBlbnZpcm9ubWVudFxuXG4vKipcbiogQU1EIHBsdWdpbiBmdW5jdGlvbi5cbipcbiogQ29uZGl0aW9uYWwgbG9hZHMgbW9kdWxlcyBiYXNlZCBvbiBhIGhhcyBmZWF0dXJlIHRlc3QgdmFsdWUuXG4qXG4qIEBwYXJhbSByZXNvdXJjZUlkIEdpdmVzIHRoZSByZXNvbHZlZCBtb2R1bGUgaWQgdG8gbG9hZC5cbiogQHBhcmFtIHJlcXVpcmUgVGhlIGxvYWRlciByZXF1aXJlIGZ1bmN0aW9uIHdpdGggcmVzcGVjdCB0byB0aGUgbW9kdWxlIHRoYXQgY29udGFpbmVkIHRoZSBwbHVnaW4gcmVzb3VyY2UgaW4gaXRzXG4qICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kgbGlzdC5cbiogQHBhcmFtIGxvYWQgQ2FsbGJhY2sgdG8gbG9hZGVyIHRoYXQgY29uc3VtZXMgcmVzdWx0IG9mIHBsdWdpbiBkZW1hbmQuXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWQocmVzb3VyY2VJZCwgcmVxdWlyZSwgbG9hZCwgY29uZmlnKSB7XG4gICAgcmVzb3VyY2VJZCA/IHJlcXVpcmUoW3Jlc291cmNlSWRdLCBsb2FkKSA6IGxvYWQoKTtcbn1cbi8qKlxuICogQU1EIHBsdWdpbiBmdW5jdGlvbi5cbiAqXG4gKiBSZXNvbHZlcyByZXNvdXJjZUlkIGludG8gYSBtb2R1bGUgaWQgYmFzZWQgb24gcG9zc2libHktbmVzdGVkIHRlbmFyeSBleHByZXNzaW9uIHRoYXQgYnJhbmNoZXMgb24gaGFzIGZlYXR1cmUgdGVzdFxuICogdmFsdWUocykuXG4gKlxuICogQHBhcmFtIHJlc291cmNlSWQgVGhlIGlkIG9mIHRoZSBtb2R1bGVcbiAqIEBwYXJhbSBub3JtYWxpemUgUmVzb2x2ZXMgYSByZWxhdGl2ZSBtb2R1bGUgaWQgaW50byBhbiBhYnNvbHV0ZSBtb2R1bGUgaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShyZXNvdXJjZUlkLCBub3JtYWxpemUpIHtcbiAgICBjb25zdCB0b2tlbnMgPSByZXNvdXJjZUlkLm1hdGNoKC9bXFw/Ol18W146XFw/XSovZykgfHwgW107XG4gICAgbGV0IGkgPSAwO1xuICAgIGZ1bmN0aW9uIGdldChza2lwKSB7XG4gICAgICAgIGNvbnN0IHRlcm0gPSB0b2tlbnNbaSsrXTtcbiAgICAgICAgaWYgKHRlcm0gPT09ICc6Jykge1xuICAgICAgICAgICAgLy8gZW1wdHkgc3RyaW5nIG1vZHVsZSBuYW1lLCByZXNvbHZlcyB0byBudWxsXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBvc3RmaXhlZCB3aXRoIGEgPyBtZWFucyBpdCBpcyBhIGZlYXR1cmUgdG8gYnJhbmNoIG9uLCB0aGUgdGVybSBpcyB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZVxuICAgICAgICAgICAgaWYgKHRva2Vuc1tpKytdID09PSAnPycpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNraXAgJiYgaGFzKHRlcm0pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoZWQgdGhlIGZlYXR1cmUsIGdldCB0aGUgZmlyc3QgdmFsdWUgZnJvbSB0aGUgb3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBkaWQgbm90IG1hdGNoLCBnZXQgdGhlIHNlY29uZCB2YWx1ZSwgcGFzc2luZyBvdmVyIHRoZSBmaXJzdFxuICAgICAgICAgICAgICAgICAgICBnZXQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQoc2tpcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYSBtb2R1bGVcbiAgICAgICAgICAgIHJldHVybiB0ZXJtO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGlkID0gZ2V0KCk7XG4gICAgcmV0dXJuIGlkICYmIG5vcm1hbGl6ZShpZCk7XG59XG4vKipcbiAqIENoZWNrIGlmIGEgZmVhdHVyZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWRcbiAqXG4gKiBAcGFyYW0gZmVhdHVyZSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhpc3RzKGZlYXR1cmUpIHtcbiAgICBjb25zdCBub3JtYWxpemVkRmVhdHVyZSA9IGZlYXR1cmUudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gQm9vbGVhbihub3JtYWxpemVkRmVhdHVyZSBpbiBzdGF0aWNDYWNoZSB8fCBub3JtYWxpemVkRmVhdHVyZSBpbiB0ZXN0Q2FjaGUgfHwgdGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV0pO1xufVxuLyoqXG4gKiBSZWdpc3RlciBhIG5ldyB0ZXN0IGZvciBhIG5hbWVkIGZlYXR1cmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGhhcy5hZGQoJ2RvbS1hZGRldmVudGxpc3RlbmVyJywgISFkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogaGFzLmFkZCgndG91Y2gtZXZlbnRzJywgZnVuY3Rpb24gKCkge1xuICogICAgcmV0dXJuICdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50XG4gKiB9KTtcbiAqXG4gKiBAcGFyYW0gZmVhdHVyZSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZVxuICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSByZXBvcnRlZCBvZiB0aGUgZmVhdHVyZSwgb3IgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgb25jZSBvbiBmaXJzdCB0ZXN0XG4gKiBAcGFyYW0gb3ZlcndyaXRlIGlmIGFuIGV4aXN0aW5nIHZhbHVlIHNob3VsZCBiZSBvdmVyd3JpdHRlbi4gRGVmYXVsdHMgdG8gZmFsc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGQoZmVhdHVyZSwgdmFsdWUsIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEZlYXR1cmUgPSBmZWF0dXJlLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGV4aXN0cyhub3JtYWxpemVkRmVhdHVyZSkgJiYgIW92ZXJ3cml0ZSAmJiAhKG5vcm1hbGl6ZWRGZWF0dXJlIGluIHN0YXRpY0NhY2hlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBGZWF0dXJlIFwiJHtmZWF0dXJlfVwiIGV4aXN0cyBhbmQgb3ZlcndyaXRlIG5vdCB0cnVlLmApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRlc3RGdW5jdGlvbnNbbm9ybWFsaXplZEZlYXR1cmVdID0gdmFsdWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzRmVhdHVyZVRlc3RUaGVuYWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgdGVzdFRoZW5hYmxlc1tmZWF0dXJlXSA9IHZhbHVlLnRoZW4oKHJlc29sdmVkVmFsdWUpID0+IHtcbiAgICAgICAgICAgIHRlc3RDYWNoZVtmZWF0dXJlXSA9IHJlc29sdmVkVmFsdWU7XG4gICAgICAgICAgICBkZWxldGUgdGVzdFRoZW5hYmxlc1tmZWF0dXJlXTtcbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIHRlc3RUaGVuYWJsZXNbZmVhdHVyZV07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGVzdENhY2hlW25vcm1hbGl6ZWRGZWF0dXJlXSA9IHZhbHVlO1xuICAgICAgICBkZWxldGUgdGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV07XG4gICAgfVxufVxuLyoqXG4gKiBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgYSBuYW1lZCBmZWF0dXJlLlxuICpcbiAqIEBwYXJhbSBmZWF0dXJlIFRoZSBuYW1lIChpZiBhIHN0cmluZykgb3IgaWRlbnRpZmllciAoaWYgYW4gaW50ZWdlcikgb2YgdGhlIGZlYXR1cmUgdG8gdGVzdC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaGFzKGZlYXR1cmUpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRGZWF0dXJlID0gZmVhdHVyZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChub3JtYWxpemVkRmVhdHVyZSBpbiBzdGF0aWNDYWNoZSkge1xuICAgICAgICByZXN1bHQgPSBzdGF0aWNDYWNoZVtub3JtYWxpemVkRmVhdHVyZV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHRlc3RGdW5jdGlvbnNbbm9ybWFsaXplZEZlYXR1cmVdKSB7XG4gICAgICAgIHJlc3VsdCA9IHRlc3RDYWNoZVtub3JtYWxpemVkRmVhdHVyZV0gPSB0ZXN0RnVuY3Rpb25zW25vcm1hbGl6ZWRGZWF0dXJlXS5jYWxsKG51bGwpO1xuICAgICAgICBkZWxldGUgdGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV07XG4gICAgfVxuICAgIGVsc2UgaWYgKG5vcm1hbGl6ZWRGZWF0dXJlIGluIHRlc3RDYWNoZSkge1xuICAgICAgICByZXN1bHQgPSB0ZXN0Q2FjaGVbbm9ybWFsaXplZEZlYXR1cmVdO1xuICAgIH1cbiAgICBlbHNlIGlmIChmZWF0dXJlIGluIHRlc3RUaGVuYWJsZXMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQXR0ZW1wdCB0byBkZXRlY3QgdW5yZWdpc3RlcmVkIGhhcyBmZWF0dXJlIFwiJHtmZWF0dXJlfVwiYCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKlxuICogT3V0IG9mIHRoZSBib3ggZmVhdHVyZSB0ZXN0c1xuICovXG4vKiBFbnZpcm9ubWVudHMgKi9cbi8qIFVzZWQgYXMgYSB2YWx1ZSB0byBwcm92aWRlIGEgZGVidWcgb25seSBjb2RlIHBhdGggKi9cbmFkZCgnZGVidWcnLCB0cnVlKTtcbi8qIERldGVjdHMgaWYgdGhlIGVudmlyb25tZW50IGlzIFwiYnJvd3NlciBsaWtlXCIgKi9cbmFkZCgnaG9zdC1icm93c2VyJywgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbG9jYXRpb24gIT09ICd1bmRlZmluZWQnKTtcbi8qIERldGVjdHMgaWYgdGhlIGVudmlyb25tZW50IGFwcGVhcnMgdG8gYmUgTm9kZUpTICovXG5hZGQoJ2hvc3Qtbm9kZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmIHByb2Nlc3MudmVyc2lvbnMgJiYgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLnZlcnNpb25zLm5vZGU7XG4gICAgfVxufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXMubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9oYXMvaGFzLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL2hhcy9oYXMubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IHsgaXNBcnJheUxpa2UsIFNoaW1JdGVyYXRvciB9IGZyb20gJy4vaXRlcmF0b3InO1xuaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XG5pbXBvcnQgeyBpcyBhcyBvYmplY3RJcyB9IGZyb20gJy4vb2JqZWN0JztcbmltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XG5pbXBvcnQgJy4vU3ltYm9sJztcbmV4cG9ydCBsZXQgTWFwID0gZ2xvYmFsLk1hcDtcbmlmICghdHJ1ZSkge1xuICAgIE1hcCA9IChfYSA9IGNsYXNzIE1hcCB7XG4gICAgICAgICAgICBjb25zdHJ1Y3RvcihpdGVyYWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnTWFwJztcbiAgICAgICAgICAgICAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXJyYXlMaWtlKGl0ZXJhYmxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVyYWJsZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQodmFsdWVbMF0sIHZhbHVlWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldCh2YWx1ZVswXSwgdmFsdWVbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiB1c2luZyBPYmplY3QuaXNcbiAgICAgICAgICAgICAqIHRvIGNoZWNrIGZvciBlcXVhbGl0eS4gU2VlIGh0dHA6Ly9temwubGEvMXp1S08yVlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBfaW5kZXhPZktleShrZXlzLCBrZXkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0SXMoa2V5c1tpXSwga2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ2V0IHNpemUoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2tleXMubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xlYXIoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5sZW5ndGggPSB0aGlzLl92YWx1ZXMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZShrZXkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2luZGV4T2ZLZXkodGhpcy5fa2V5cywga2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW50cmllcygpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLl9rZXlzLm1hcCgoa2V5LCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBba2V5LCB0aGlzLl92YWx1ZXNbaV1dO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2hpbUl0ZXJhdG9yKHZhbHVlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3JFYWNoKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IHRoaXMuX2tleXM7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5fdmFsdWVzO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgdmFsdWVzW2ldLCBrZXlzW2ldLCB0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnZXQoa2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9pbmRleE9mS2V5KHRoaXMuX2tleXMsIGtleSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4IDwgMCA/IHVuZGVmaW5lZCA6IHRoaXMuX3ZhbHVlc1tpbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYXMoa2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luZGV4T2ZLZXkodGhpcy5fa2V5cywga2V5KSA+IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAga2V5cygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNoaW1JdGVyYXRvcih0aGlzLl9rZXlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5faW5kZXhPZktleSh0aGlzLl9rZXlzLCBrZXkpO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kZXggPCAwID8gdGhpcy5fa2V5cy5sZW5ndGggOiBpbmRleDtcbiAgICAgICAgICAgICAgICB0aGlzLl9rZXlzW2luZGV4XSA9IGtleTtcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZXMoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaGltSXRlcmF0b3IodGhpcy5fdmFsdWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgX2FbU3ltYm9sLnNwZWNpZXNdID0gX2EsXG4gICAgICAgIF9hKTtcbn1cbmV4cG9ydCBkZWZhdWx0IE1hcDtcbnZhciBfYTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1hcC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vTWFwLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vTWFwLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xuaW1wb3J0IHsgcXVldWVNaWNyb1Rhc2sgfSBmcm9tICcuL3N1cHBvcnQvcXVldWUnO1xuaW1wb3J0ICcuL1N5bWJvbCc7XG5pbXBvcnQgaGFzIGZyb20gJy4vc3VwcG9ydC9oYXMnO1xuZXhwb3J0IGxldCBTaGltUHJvbWlzZSA9IGdsb2JhbC5Qcm9taXNlO1xuZXhwb3J0IGNvbnN0IGlzVGhlbmFibGUgPSBmdW5jdGlvbiBpc1RoZW5hYmxlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nO1xufTtcbmlmICghdHJ1ZSkge1xuICAgIGdsb2JhbC5Qcm9taXNlID0gU2hpbVByb21pc2UgPSAoX2EgPSBjbGFzcyBQcm9taXNlIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBQcm9taXNlLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBwYXJhbSBleGVjdXRvclxuICAgICAgICAgICAgICogVGhlIGV4ZWN1dG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbW1lZGlhdGVseSB3aGVuIHRoZSBQcm9taXNlIGlzIGluc3RhbnRpYXRlZC4gSXQgaXMgcmVzcG9uc2libGUgZm9yXG4gICAgICAgICAgICAgKiBzdGFydGluZyB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGVuIGl0IGlzIGludm9rZWQuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogVGhlIGV4ZWN1dG9yIG11c3QgY2FsbCBlaXRoZXIgdGhlIHBhc3NlZCBgcmVzb2x2ZWAgZnVuY3Rpb24gd2hlbiB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkXG4gICAgICAgICAgICAgKiBzdWNjZXNzZnVsbHksIG9yIHRoZSBgcmVqZWN0YCBmdW5jdGlvbiB3aGVuIHRoZSBvcGVyYXRpb24gZmFpbHMuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKGV4ZWN1dG9yKSB7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhpcyBwcm9taXNlLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAxIC8qIFBlbmRpbmcgKi87XG4gICAgICAgICAgICAgICAgdGhpc1tTeW1ib2wudG9TdHJpbmdUYWddID0gJ1Byb21pc2UnO1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIElmIHRydWUsIHRoZSByZXNvbHV0aW9uIG9mIHRoaXMgcHJvbWlzZSBpcyBjaGFpbmVkIChcImxvY2tlZCBpblwiKSB0byBhbm90aGVyIHByb21pc2UuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgbGV0IGlzQ2hhaW5lZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIFdoZXRoZXIgb3Igbm90IHRoaXMgcHJvbWlzZSBpcyBpbiBhIHJlc29sdmVkIHN0YXRlLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzUmVzb2x2ZWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlICE9PSAxIC8qIFBlbmRpbmcgKi8gfHwgaXNDaGFpbmVkO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogQ2FsbGJhY2tzIHRoYXQgc2hvdWxkIGJlIGludm9rZWQgb25jZSB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGxldCBjYWxsYmFja3MgPSBbXTtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBJbml0aWFsbHkgcHVzaGVzIGNhbGxiYWNrcyBvbnRvIGEgcXVldWUgZm9yIGV4ZWN1dGlvbiBvbmNlIHRoaXMgcHJvbWlzZSBzZXR0bGVzLiBBZnRlciB0aGUgcHJvbWlzZSBzZXR0bGVzLFxuICAgICAgICAgICAgICAgICAqIGVucXVldWVzIGNhbGxiYWNrcyBmb3IgZXhlY3V0aW9uIG9uIHRoZSBuZXh0IGV2ZW50IGxvb3AgdHVybi5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBsZXQgd2hlbkZpbmlzaGVkID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogU2V0dGxlcyB0aGlzIHByb21pc2UuXG4gICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gbmV3U3RhdGUgVGhlIHJlc29sdmVkIHN0YXRlIGZvciB0aGlzIHByb21pc2UuXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIHtUfGFueX0gdmFsdWUgVGhlIHJlc29sdmVkIHZhbHVlIGZvciB0aGlzIHByb21pc2UuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY29uc3Qgc2V0dGxlID0gKG5ld1N0YXRlLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBBIHByb21pc2UgY2FuIG9ubHkgYmUgc2V0dGxlZCBvbmNlLlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gMSAvKiBQZW5kaW5nICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmVkVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgd2hlbkZpbmlzaGVkID0gcXVldWVNaWNyb1Rhc2s7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgZW5xdWV1ZSBhIGNhbGxiYWNrIHJ1bm5lciBpZiB0aGVyZSBhcmUgY2FsbGJhY2tzIHNvIHRoYXQgaW5pdGlhbGx5IGZ1bGZpbGxlZCBQcm9taXNlcyBkb24ndCBoYXZlIHRvXG4gICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgYW4gZXh0cmEgdHVybi5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrcyAmJiBjYWxsYmFja3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNaWNyb1Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvdW50ID0gY2FsbGJhY2tzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3NbaV0uY2FsbChudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBSZXNvbHZlcyB0aGlzIHByb21pc2UuXG4gICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gbmV3U3RhdGUgVGhlIHJlc29sdmVkIHN0YXRlIGZvciB0aGlzIHByb21pc2UuXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIHtUfGFueX0gdmFsdWUgVGhlIHJlc29sdmVkIHZhbHVlIGZvciB0aGlzIHByb21pc2UuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZSA9IChuZXdTdGF0ZSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVzb2x2ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1RoZW5hYmxlKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUudGhlbihzZXR0bGUuYmluZChudWxsLCAwIC8qIEZ1bGZpbGxlZCAqLyksIHNldHRsZS5iaW5kKG51bGwsIDIgLyogUmVqZWN0ZWQgKi8pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2hhaW5lZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXR0bGUobmV3U3RhdGUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy50aGVuID0gKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuRmluaXNoZWQgaW5pdGlhbGx5IHF1ZXVlcyB1cCBjYWxsYmFja3MgZm9yIGV4ZWN1dGlvbiBhZnRlciB0aGUgcHJvbWlzZSBoYXMgc2V0dGxlZC4gT25jZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb21pc2UgaGFzIHNldHRsZWQsIHdoZW5GaW5pc2hlZCB3aWxsIHNjaGVkdWxlIGNhbGxiYWNrcyBmb3IgZXhlY3V0aW9uIG9uIHRoZSBuZXh0IHR1cm4gdGhyb3VnaCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IGxvb3AuXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVuRmluaXNoZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy5zdGF0ZSA9PT0gMiAvKiBSZWplY3RlZCAqLyA/IG9uUmVqZWN0ZWQgOiBvbkZ1bGZpbGxlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNhbGxiYWNrKHRoaXMucmVzb2x2ZWRWYWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnN0YXRlID09PSAyIC8qIFJlamVjdGVkICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh0aGlzLnJlc29sdmVkVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnJlc29sdmVkVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yKHJlc29sdmUuYmluZChudWxsLCAwIC8qIEZ1bGZpbGxlZCAqLyksIHJlc29sdmUuYmluZChudWxsLCAyIC8qIFJlamVjdGVkICovKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBzZXR0bGUoMiAvKiBSZWplY3RlZCAqLywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRpYyBhbGwoaXRlcmFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBsZXRlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvcHVsYXRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmdWxmaWxsKGluZGV4LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgKytjb21wbGV0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZpbmlzaCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3B1bGF0aW5nIHx8IGNvbXBsZXRlIDwgdG90YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcHJvY2Vzc0l0ZW0oaW5kZXgsIGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICsrdG90YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNUaGVuYWJsZShpdGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGFuIGl0ZW0gUHJvbWlzZSByZWplY3RzLCB0aGlzIFByb21pc2UgaXMgaW1tZWRpYXRlbHkgcmVqZWN0ZWQgd2l0aCB0aGUgaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb21pc2UncyByZWplY3Rpb24gZXJyb3IuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS50aGVuKGZ1bGZpbGwuYmluZChudWxsLCBpbmRleCksIHJlamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoaXRlbSkudGhlbihmdWxmaWxsLmJpbmQobnVsbCwgaW5kZXgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NJdGVtKGksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwb3B1bGF0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdGljIHJhY2UoaXRlcmFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGEgUHJvbWlzZSBpdGVtIHJlamVjdHMsIHRoaXMgUHJvbWlzZSBpcyBpbW1lZGlhdGVseSByZWplY3RlZCB3aXRoIHRoZSBpdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvbWlzZSdzIHJlamVjdGlvbiBlcnJvci5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShpdGVtKS50aGVuKHJlc29sdmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0aWMgcmVqZWN0KHJlYXNvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcyhmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyZWFzb24pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdGljIHJlc29sdmUodmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaChvblJlamVjdGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBfYVtTeW1ib2wuc3BlY2llc10gPSBTaGltUHJvbWlzZSxcbiAgICAgICAgX2EpO1xufVxuZXhwb3J0IGRlZmF1bHQgU2hpbVByb21pc2U7XG52YXIgX2E7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Qcm9taXNlLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9Qcm9taXNlLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vUHJvbWlzZS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgaGFzIGZyb20gJy4vc3VwcG9ydC9oYXMnO1xuaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XG5pbXBvcnQgeyBnZXRWYWx1ZURlc2NyaXB0b3IgfSBmcm9tICcuL3N1cHBvcnQvdXRpbCc7XG5leHBvcnQgbGV0IFN5bWJvbCA9IGdsb2JhbC5TeW1ib2w7XG5pZiAoIXRydWUpIHtcbiAgICAvKipcbiAgICAgKiBUaHJvd3MgaWYgdGhlIHZhbHVlIGlzIG5vdCBhIHN5bWJvbCwgdXNlZCBpbnRlcm5hbGx5IHdpdGhpbiB0aGUgU2hpbVxuICAgICAqIEBwYXJhbSAge2FueX0gICAgdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrXG4gICAgICogQHJldHVybiB7c3ltYm9sfSAgICAgICBSZXR1cm5zIHRoZSBzeW1ib2wgb3IgdGhyb3dzXG4gICAgICovXG4gICAgY29uc3QgdmFsaWRhdGVTeW1ib2wgPSBmdW5jdGlvbiB2YWxpZGF0ZVN5bWJvbCh2YWx1ZSkge1xuICAgICAgICBpZiAoIWlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcih2YWx1ZSArICcgaXMgbm90IGEgc3ltYm9sJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgY29uc3QgZGVmaW5lUHJvcGVydGllcyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzO1xuICAgIGNvbnN0IGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuICAgIGNvbnN0IGNyZWF0ZSA9IE9iamVjdC5jcmVhdGU7XG4gICAgY29uc3Qgb2JqUHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgICBjb25zdCBnbG9iYWxTeW1ib2xzID0ge307XG4gICAgY29uc3QgZ2V0U3ltYm9sTmFtZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBjcmVhdGUobnVsbCk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZGVzYykge1xuICAgICAgICAgICAgbGV0IHBvc3RmaXggPSAwO1xuICAgICAgICAgICAgbGV0IG5hbWU7XG4gICAgICAgICAgICB3aGlsZSAoY3JlYXRlZFtTdHJpbmcoZGVzYykgKyAocG9zdGZpeCB8fCAnJyldKSB7XG4gICAgICAgICAgICAgICAgKytwb3N0Zml4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVzYyArPSBTdHJpbmcocG9zdGZpeCB8fCAnJyk7XG4gICAgICAgICAgICBjcmVhdGVkW2Rlc2NdID0gdHJ1ZTtcbiAgICAgICAgICAgIG5hbWUgPSAnQEAnICsgZGVzYztcbiAgICAgICAgICAgIC8vIEZJWE1FOiBUZW1wb3JhcnkgZ3VhcmQgdW50aWwgdGhlIGR1cGxpY2F0ZSBleGVjdXRpb24gd2hlbiB0ZXN0aW5nIGNhbiBiZVxuICAgICAgICAgICAgLy8gcGlubmVkIGRvd24uXG4gICAgICAgICAgICBpZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqUHJvdG90eXBlLCBuYW1lKSkge1xuICAgICAgICAgICAgICAgIGRlZmluZVByb3BlcnR5KG9ialByb3RvdHlwZSwgbmFtZSwge1xuICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lUHJvcGVydHkodGhpcywgbmFtZSwgZ2V0VmFsdWVEZXNjcmlwdG9yKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuYW1lO1xuICAgICAgICB9O1xuICAgIH0pKCk7XG4gICAgY29uc3QgSW50ZXJuYWxTeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woZGVzY3JpcHRpb24pIHtcbiAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBJbnRlcm5hbFN5bWJvbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHlwZUVycm9yOiBTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3InKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3ltYm9sKGRlc2NyaXB0aW9uKTtcbiAgICB9O1xuICAgIFN5bWJvbCA9IGdsb2JhbC5TeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woZGVzY3JpcHRpb24pIHtcbiAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBTeW1ib2wpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1R5cGVFcnJvcjogU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3ltID0gT2JqZWN0LmNyZWF0ZShJbnRlcm5hbFN5bWJvbC5wcm90b3R5cGUpO1xuICAgICAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQgPyAnJyA6IFN0cmluZyhkZXNjcmlwdGlvbik7XG4gICAgICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0aWVzKHN5bSwge1xuICAgICAgICAgICAgX19kZXNjcmlwdGlvbl9fOiBnZXRWYWx1ZURlc2NyaXB0b3IoZGVzY3JpcHRpb24pLFxuICAgICAgICAgICAgX19uYW1lX186IGdldFZhbHVlRGVzY3JpcHRvcihnZXRTeW1ib2xOYW1lKGRlc2NyaXB0aW9uKSlcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKiBEZWNvcmF0ZSB0aGUgU3ltYm9sIGZ1bmN0aW9uIHdpdGggdGhlIGFwcHJvcHJpYXRlIHByb3BlcnRpZXMgKi9cbiAgICBkZWZpbmVQcm9wZXJ0eShTeW1ib2wsICdmb3InLCBnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoZ2xvYmFsU3ltYm9sc1trZXldKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsU3ltYm9sc1trZXldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoZ2xvYmFsU3ltYm9sc1trZXldID0gU3ltYm9sKFN0cmluZyhrZXkpKSk7XG4gICAgfSkpO1xuICAgIGRlZmluZVByb3BlcnRpZXMoU3ltYm9sLCB7XG4gICAgICAgIGtleUZvcjogZ2V0VmFsdWVEZXNjcmlwdG9yKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgICAgICAgIGxldCBrZXk7XG4gICAgICAgICAgICB2YWxpZGF0ZVN5bWJvbChzeW0pO1xuICAgICAgICAgICAgZm9yIChrZXkgaW4gZ2xvYmFsU3ltYm9scykge1xuICAgICAgICAgICAgICAgIGlmIChnbG9iYWxTeW1ib2xzW2tleV0gPT09IHN5bSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGhhc0luc3RhbmNlOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignaGFzSW5zdGFuY2UnKSwgZmFsc2UsIGZhbHNlKSxcbiAgICAgICAgaXNDb25jYXRTcHJlYWRhYmxlOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignaXNDb25jYXRTcHJlYWRhYmxlJyksIGZhbHNlLCBmYWxzZSksXG4gICAgICAgIGl0ZXJhdG9yOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignaXRlcmF0b3InKSwgZmFsc2UsIGZhbHNlKSxcbiAgICAgICAgbWF0Y2g6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdtYXRjaCcpLCBmYWxzZSwgZmFsc2UpLFxuICAgICAgICBvYnNlcnZhYmxlOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignb2JzZXJ2YWJsZScpLCBmYWxzZSwgZmFsc2UpLFxuICAgICAgICByZXBsYWNlOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcigncmVwbGFjZScpLCBmYWxzZSwgZmFsc2UpLFxuICAgICAgICBzZWFyY2g6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdzZWFyY2gnKSwgZmFsc2UsIGZhbHNlKSxcbiAgICAgICAgc3BlY2llczogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3NwZWNpZXMnKSwgZmFsc2UsIGZhbHNlKSxcbiAgICAgICAgc3BsaXQ6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdzcGxpdCcpLCBmYWxzZSwgZmFsc2UpLFxuICAgICAgICB0b1ByaW1pdGl2ZTogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3RvUHJpbWl0aXZlJyksIGZhbHNlLCBmYWxzZSksXG4gICAgICAgIHRvU3RyaW5nVGFnOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcigndG9TdHJpbmdUYWcnKSwgZmFsc2UsIGZhbHNlKSxcbiAgICAgICAgdW5zY29wYWJsZXM6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCd1bnNjb3BhYmxlcycpLCBmYWxzZSwgZmFsc2UpXG4gICAgfSk7XG4gICAgLyogRGVjb3JhdGUgdGhlIEludGVybmFsU3ltYm9sIG9iamVjdCAqL1xuICAgIGRlZmluZVByb3BlcnRpZXMoSW50ZXJuYWxTeW1ib2wucHJvdG90eXBlLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sKSxcbiAgICAgICAgdG9TdHJpbmc6IGdldFZhbHVlRGVzY3JpcHRvcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fX25hbWVfXztcbiAgICAgICAgfSwgZmFsc2UsIGZhbHNlKVxuICAgIH0pO1xuICAgIC8qIERlY29yYXRlIHRoZSBTeW1ib2wucHJvdG90eXBlICovXG4gICAgZGVmaW5lUHJvcGVydGllcyhTeW1ib2wucHJvdG90eXBlLCB7XG4gICAgICAgIHRvU3RyaW5nOiBnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuICdTeW1ib2wgKCcgKyB2YWxpZGF0ZVN5bWJvbCh0aGlzKS5fX2Rlc2NyaXB0aW9uX18gKyAnKSc7XG4gICAgICAgIH0pLFxuICAgICAgICB2YWx1ZU9mOiBnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlU3ltYm9sKHRoaXMpO1xuICAgICAgICB9KVxuICAgIH0pO1xuICAgIGRlZmluZVByb3BlcnR5KFN5bWJvbC5wcm90b3R5cGUsIFN5bWJvbC50b1ByaW1pdGl2ZSwgZ2V0VmFsdWVEZXNjcmlwdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlU3ltYm9sKHRoaXMpO1xuICAgIH0pKTtcbiAgICBkZWZpbmVQcm9wZXJ0eShTeW1ib2wucHJvdG90eXBlLCBTeW1ib2wudG9TdHJpbmdUYWcsIGdldFZhbHVlRGVzY3JpcHRvcignU3ltYm9sJywgZmFsc2UsIGZhbHNlLCB0cnVlKSk7XG4gICAgZGVmaW5lUHJvcGVydHkoSW50ZXJuYWxTeW1ib2wucHJvdG90eXBlLCBTeW1ib2wudG9QcmltaXRpdmUsIGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wucHJvdG90eXBlW1N5bWJvbC50b1ByaW1pdGl2ZV0sIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpO1xuICAgIGRlZmluZVByb3BlcnR5KEludGVybmFsU3ltYm9sLnByb3RvdHlwZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLnByb3RvdHlwZVtTeW1ib2wudG9TdHJpbmdUYWddLCBmYWxzZSwgZmFsc2UsIHRydWUpKTtcbn1cbi8qKlxuICogQSBjdXN0b20gZ3VhcmQgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIGlmIGFuIG9iamVjdCBpcyBhIHN5bWJvbCBvciBub3RcbiAqIEBwYXJhbSAge2FueX0gICAgICAgdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrIHRvIHNlZSBpZiBpdCBpcyBhIHN5bWJvbCBvciBub3RcbiAqIEByZXR1cm4ge2lzIHN5bWJvbH0gICAgICAgUmV0dXJucyB0cnVlIGlmIGEgc3ltYm9sIG9yIG5vdCAoYW5kIG5hcnJvd3MgdGhlIHR5cGUgZ3VhcmQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICAgIHJldHVybiAodmFsdWUgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N5bWJvbCcgfHwgdmFsdWVbJ0BAdG9TdHJpbmdUYWcnXSA9PT0gJ1N5bWJvbCcpKSB8fCBmYWxzZTtcbn1cbi8qKlxuICogRmlsbCBhbnkgbWlzc2luZyB3ZWxsIGtub3duIHN5bWJvbHMgaWYgdGhlIG5hdGl2ZSBTeW1ib2wgaXMgbWlzc2luZyB0aGVtXG4gKi9cbltcbiAgICAnaGFzSW5zdGFuY2UnLFxuICAgICdpc0NvbmNhdFNwcmVhZGFibGUnLFxuICAgICdpdGVyYXRvcicsXG4gICAgJ3NwZWNpZXMnLFxuICAgICdyZXBsYWNlJyxcbiAgICAnc2VhcmNoJyxcbiAgICAnc3BsaXQnLFxuICAgICdtYXRjaCcsXG4gICAgJ3RvUHJpbWl0aXZlJyxcbiAgICAndG9TdHJpbmdUYWcnLFxuICAgICd1bnNjb3BhYmxlcycsXG4gICAgJ29ic2VydmFibGUnXG5dLmZvckVhY2goKHdlbGxLbm93bikgPT4ge1xuICAgIGlmICghU3ltYm9sW3dlbGxLbm93bl0pIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN5bWJvbCwgd2VsbEtub3duLCBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcih3ZWxsS25vd24pLCBmYWxzZSwgZmFsc2UpKTtcbiAgICB9XG59KTtcbmV4cG9ydCBkZWZhdWx0IFN5bWJvbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN5bWJvbC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vU3ltYm9sLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vU3ltYm9sLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xuaW1wb3J0IHsgaXNBcnJheUxpa2UgfSBmcm9tICcuL2l0ZXJhdG9yJztcbmltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XG5pbXBvcnQgJy4vU3ltYm9sJztcbmV4cG9ydCBsZXQgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xuaWYgKCF0cnVlKSB7XG4gICAgY29uc3QgREVMRVRFRCA9IHt9O1xuICAgIGNvbnN0IGdldFVJRCA9IGZ1bmN0aW9uIGdldFVJRCgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDAwMCk7XG4gICAgfTtcbiAgICBjb25zdCBnZW5lcmF0ZU5hbWUgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgc3RhcnRJZCA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAlIDEwMDAwMDAwMCk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBnZW5lcmF0ZU5hbWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gJ19fd20nICsgZ2V0VUlEKCkgKyAoc3RhcnRJZCsrICsgJ19fJyk7XG4gICAgICAgIH07XG4gICAgfSkoKTtcbiAgICBXZWFrTWFwID0gY2xhc3MgV2Vha01hcCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKGl0ZXJhYmxlKSB7XG4gICAgICAgICAgICB0aGlzW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnV2Vha01hcCc7XG4gICAgICAgICAgICB0aGlzLl9uYW1lID0gZ2VuZXJhdGVOYW1lKCk7XG4gICAgICAgICAgICB0aGlzLl9mcm96ZW5FbnRyaWVzID0gW107XG4gICAgICAgICAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNBcnJheUxpa2UoaXRlcmFibGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlcmFibGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KGl0ZW1bMF0sIGl0ZW1bMV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX2dldEZyb3plbkVudHJ5SW5kZXgoa2V5KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2Zyb3plbkVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZnJvemVuRW50cmllc1tpXS5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlKGtleSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0ga2V5W3RoaXMuX25hbWVdO1xuICAgICAgICAgICAgaWYgKGVudHJ5ICYmIGVudHJ5LmtleSA9PT0ga2V5ICYmIGVudHJ5LnZhbHVlICE9PSBERUxFVEVEKSB7XG4gICAgICAgICAgICAgICAgZW50cnkudmFsdWUgPSBERUxFVEVEO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZnJvemVuSW5kZXggPSB0aGlzLl9nZXRGcm96ZW5FbnRyeUluZGV4KGtleSk7XG4gICAgICAgICAgICBpZiAoZnJvemVuSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Zyb3plbkVudHJpZXMuc3BsaWNlKGZyb3plbkluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBnZXQoa2V5KSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwga2V5ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0ga2V5W3RoaXMuX25hbWVdO1xuICAgICAgICAgICAgaWYgKGVudHJ5ICYmIGVudHJ5LmtleSA9PT0ga2V5ICYmIGVudHJ5LnZhbHVlICE9PSBERUxFVEVEKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZnJvemVuSW5kZXggPSB0aGlzLl9nZXRGcm96ZW5FbnRyeUluZGV4KGtleSk7XG4gICAgICAgICAgICBpZiAoZnJvemVuSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mcm96ZW5FbnRyaWVzW2Zyb3plbkluZGV4XS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBoYXMoa2V5KSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwga2V5ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBrZXlbdGhpcy5fbmFtZV07XG4gICAgICAgICAgICBpZiAoQm9vbGVhbihlbnRyeSAmJiBlbnRyeS5rZXkgPT09IGtleSAmJiBlbnRyeS52YWx1ZSAhPT0gREVMRVRFRCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZyb3plbkluZGV4ID0gdGhpcy5fZ2V0RnJvemVuRW50cnlJbmRleChrZXkpO1xuICAgICAgICAgICAgaWYgKGZyb3plbkluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKCFrZXkgfHwgKHR5cGVvZiBrZXkgIT09ICdvYmplY3QnICYmIHR5cGVvZiBrZXkgIT09ICdmdW5jdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCB2YWx1ZSB1c2VkIGFzIHdlYWsgbWFwIGtleScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGVudHJ5ID0ga2V5W3RoaXMuX25hbWVdO1xuICAgICAgICAgICAgaWYgKCFlbnRyeSB8fCBlbnRyeS5rZXkgIT09IGtleSkge1xuICAgICAgICAgICAgICAgIGVudHJ5ID0gT2JqZWN0LmNyZWF0ZShudWxsLCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogeyB2YWx1ZToga2V5IH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmlzRnJvemVuKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZnJvemVuRW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShrZXksIHRoaXMuX25hbWUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlbnRyeVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbnRyeS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0IGRlZmF1bHQgV2Vha01hcDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdlYWtNYXAubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL1dlYWtNYXAubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9XZWFrTWFwLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xuaW1wb3J0IHsgaXNBcnJheUxpa2UsIGlzSXRlcmFibGUgfSBmcm9tICcuL2l0ZXJhdG9yJztcbmltcG9ydCB7IE1BWF9TQUZFX0lOVEVHRVIgfSBmcm9tICcuL251bWJlcic7XG5pbXBvcnQgaGFzIGZyb20gJy4vc3VwcG9ydC9oYXMnO1xuaW1wb3J0IHsgd3JhcE5hdGl2ZSB9IGZyb20gJy4vc3VwcG9ydC91dGlsJztcbmV4cG9ydCBsZXQgZnJvbTtcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBhcnJheSBmcm9tIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBhcmd1bWVudHMgQW55IG51bWJlciBvZiBhcmd1bWVudHMgZm9yIHRoZSBhcnJheVxuICogQHJldHVybiBBbiBhcnJheSBmcm9tIHRoZSBnaXZlbiBhcmd1bWVudHNcbiAqL1xuZXhwb3J0IGxldCBvZjtcbi8qIEVTNiBBcnJheSBpbnN0YW5jZSBtZXRob2RzICovXG4vKipcbiAqIENvcGllcyBkYXRhIGludGVybmFsbHkgd2l0aGluIGFuIGFycmF5IG9yIGFycmF5LWxpa2Ugb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBhcnJheS1saWtlIG9iamVjdFxuICogQHBhcmFtIG9mZnNldCBUaGUgaW5kZXggdG8gc3RhcnQgY29weWluZyB2YWx1ZXMgdG87IGlmIG5lZ2F0aXZlLCBpdCBjb3VudHMgYmFja3dhcmRzIGZyb20gbGVuZ3RoXG4gKiBAcGFyYW0gc3RhcnQgVGhlIGZpcnN0IChpbmNsdXNpdmUpIGluZGV4IHRvIGNvcHk7IGlmIG5lZ2F0aXZlLCBpdCBjb3VudHMgYmFja3dhcmRzIGZyb20gbGVuZ3RoXG4gKiBAcGFyYW0gZW5kIFRoZSBsYXN0IChleGNsdXNpdmUpIGluZGV4IHRvIGNvcHk7IGlmIG5lZ2F0aXZlLCBpdCBjb3VudHMgYmFja3dhcmRzIGZyb20gbGVuZ3RoXG4gKiBAcmV0dXJuIFRoZSB0YXJnZXRcbiAqL1xuZXhwb3J0IGxldCBjb3B5V2l0aGluO1xuLyoqXG4gKiBGaWxscyBlbGVtZW50cyBvZiBhbiBhcnJheS1saWtlIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuXG4gKlxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHRvIGZpbGxcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBlYWNoIGVsZW1lbnQgb2YgdGhlIHRhcmdldCB3aXRoXG4gKiBAcGFyYW0gc3RhcnQgVGhlIGZpcnN0IGluZGV4IHRvIGZpbGxcbiAqIEBwYXJhbSBlbmQgVGhlIChleGNsdXNpdmUpIGluZGV4IGF0IHdoaWNoIHRvIHN0b3AgZmlsbGluZ1xuICogQHJldHVybiBUaGUgZmlsbGVkIHRhcmdldFxuICovXG5leHBvcnQgbGV0IGZpbGw7XG4vKipcbiAqIEZpbmRzIGFuZCByZXR1cm5zIHRoZSBmaXJzdCBpbnN0YW5jZSBtYXRjaGluZyB0aGUgY2FsbGJhY2sgb3IgdW5kZWZpbmVkIGlmIG9uZSBpcyBub3QgZm91bmQuXG4gKlxuICogQHBhcmFtIHRhcmdldCBBbiBhcnJheS1saWtlIG9iamVjdFxuICogQHBhcmFtIGNhbGxiYWNrIEEgZnVuY3Rpb24gcmV0dXJuaW5nIGlmIHRoZSBjdXJyZW50IHZhbHVlIG1hdGNoZXMgYSBjcml0ZXJpYVxuICogQHBhcmFtIHRoaXNBcmcgVGhlIGV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgZmluZCBmdW5jdGlvblxuICogQHJldHVybiBUaGUgZmlyc3QgZWxlbWVudCBtYXRjaGluZyB0aGUgY2FsbGJhY2ssIG9yIHVuZGVmaW5lZCBpZiBvbmUgZG9lcyBub3QgZXhpc3RcbiAqL1xuZXhwb3J0IGxldCBmaW5kO1xuLyoqXG4gKiBQZXJmb3JtcyBhIGxpbmVhciBzZWFyY2ggYW5kIHJldHVybnMgdGhlIGZpcnN0IGluZGV4IHdob3NlIHZhbHVlIHNhdGlzZmllcyB0aGUgcGFzc2VkIGNhbGxiYWNrLFxuICogb3IgLTEgaWYgbm8gdmFsdWVzIHNhdGlzZnkgaXQuXG4gKlxuICogQHBhcmFtIHRhcmdldCBBbiBhcnJheS1saWtlIG9iamVjdFxuICogQHBhcmFtIGNhbGxiYWNrIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRydWUgaWYgdGhlIGN1cnJlbnQgdmFsdWUgc2F0aXNmaWVzIGl0cyBjcml0ZXJpYVxuICogQHBhcmFtIHRoaXNBcmcgVGhlIGV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgZmluZCBmdW5jdGlvblxuICogQHJldHVybiBUaGUgZmlyc3QgaW5kZXggd2hvc2UgdmFsdWUgc2F0aXNmaWVzIHRoZSBwYXNzZWQgY2FsbGJhY2ssIG9yIC0xIGlmIG5vIHZhbHVlcyBzYXRpc2Z5IGl0XG4gKi9cbmV4cG9ydCBsZXQgZmluZEluZGV4O1xuLyogRVM3IEFycmF5IGluc3RhbmNlIG1ldGhvZHMgKi9cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGFycmF5IGluY2x1ZGVzIGEgZ2l2ZW4gdmFsdWVcbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IHRoZSB0YXJnZXQgYXJyYXktbGlrZSBvYmplY3RcbiAqIEBwYXJhbSBzZWFyY2hFbGVtZW50IHRoZSBpdGVtIHRvIHNlYXJjaCBmb3JcbiAqIEBwYXJhbSBmcm9tSW5kZXggdGhlIHN0YXJ0aW5nIGluZGV4IHRvIHNlYXJjaCBmcm9tXG4gKiBAcmV0dXJuIGB0cnVlYCBpZiB0aGUgYXJyYXkgaW5jbHVkZXMgdGhlIGVsZW1lbnQsIG90aGVyd2lzZSBgZmFsc2VgXG4gKi9cbmV4cG9ydCBsZXQgaW5jbHVkZXM7XG5pZiAodHJ1ZSAmJiB0cnVlKSB7XG4gICAgZnJvbSA9IGdsb2JhbC5BcnJheS5mcm9tO1xuICAgIG9mID0gZ2xvYmFsLkFycmF5Lm9mO1xuICAgIGNvcHlXaXRoaW4gPSB3cmFwTmF0aXZlKGdsb2JhbC5BcnJheS5wcm90b3R5cGUuY29weVdpdGhpbik7XG4gICAgZmlsbCA9IHdyYXBOYXRpdmUoZ2xvYmFsLkFycmF5LnByb3RvdHlwZS5maWxsKTtcbiAgICBmaW5kID0gd3JhcE5hdGl2ZShnbG9iYWwuQXJyYXkucHJvdG90eXBlLmZpbmQpO1xuICAgIGZpbmRJbmRleCA9IHdyYXBOYXRpdmUoZ2xvYmFsLkFycmF5LnByb3RvdHlwZS5maW5kSW5kZXgpO1xufVxuZWxzZSB7XG4gICAgLy8gSXQgaXMgb25seSBvbGRlciB2ZXJzaW9ucyBvZiBTYWZhcmkvaU9TIHRoYXQgaGF2ZSBhIGJhZCBmaWxsIGltcGxlbWVudGF0aW9uIGFuZCBzbyBhcmVuJ3QgaW4gdGhlIHdpbGRcbiAgICAvLyBUbyBtYWtlIHRoaW5ncyBlYXNpZXIsIGlmIHRoZXJlIGlzIGEgYmFkIGZpbGwgaW1wbGVtZW50YXRpb24sIHRoZSB3aG9sZSBzZXQgb2YgZnVuY3Rpb25zIHdpbGwgYmUgZmlsbGVkXG4gICAgLyoqXG4gICAgICogRW5zdXJlcyBhIG5vbi1uZWdhdGl2ZSwgbm9uLWluZmluaXRlLCBzYWZlIGludGVnZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgdG8gdmFsaWRhdGVcbiAgICAgKiBAcmV0dXJuIEEgcHJvcGVyIGxlbmd0aFxuICAgICAqL1xuICAgIGNvbnN0IHRvTGVuZ3RoID0gZnVuY3Rpb24gdG9MZW5ndGgobGVuZ3RoKSB7XG4gICAgICAgIGlmIChpc05hTihsZW5ndGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKTtcbiAgICAgICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgICAgICAgIGxlbmd0aCA9IE1hdGguZmxvb3IobGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgYSBub24tbmVnYXRpdmUsIHJlYWwsIHNhZmUgaW50ZWdlclxuICAgICAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobGVuZ3RoLCAwKSwgTUFYX1NBRkVfSU5URUdFUik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGcm9tIEVTNiA3LjEuNCBUb0ludGVnZXIoKVxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIEEgdmFsdWUgdG8gY29udmVydFxuICAgICAqIEByZXR1cm4gQW4gaW50ZWdlclxuICAgICAqL1xuICAgIGNvbnN0IHRvSW50ZWdlciA9IGZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSkge1xuICAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gMCB8fCAhaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh2YWx1ZSA+IDAgPyAxIDogLTEpICogTWF0aC5mbG9vcihNYXRoLmFicyh2YWx1ZSkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplcyBhbiBvZmZzZXQgYWdhaW5zdCBhIGdpdmVuIGxlbmd0aCwgd3JhcHBpbmcgaXQgaWYgbmVnYXRpdmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG9yaWdpbmFsIG9mZnNldFxuICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIHRvdGFsIGxlbmd0aCB0byBub3JtYWxpemUgYWdhaW5zdFxuICAgICAqIEByZXR1cm4gSWYgbmVnYXRpdmUsIHByb3ZpZGUgYSBkaXN0YW5jZSBmcm9tIHRoZSBlbmQgKGxlbmd0aCk7IG90aGVyd2lzZSBwcm92aWRlIGEgZGlzdGFuY2UgZnJvbSAwXG4gICAgICovXG4gICAgY29uc3Qgbm9ybWFsaXplT2Zmc2V0ID0gZnVuY3Rpb24gbm9ybWFsaXplT2Zmc2V0KHZhbHVlLCBsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlIDwgMCA/IE1hdGgubWF4KGxlbmd0aCArIHZhbHVlLCAwKSA6IE1hdGgubWluKHZhbHVlLCBsZW5ndGgpO1xuICAgIH07XG4gICAgZnJvbSA9IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlLCBtYXBGdW5jdGlvbiwgdGhpc0FyZykge1xuICAgICAgICBpZiAoYXJyYXlMaWtlID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2Zyb206IHJlcXVpcmVzIGFuIGFycmF5LWxpa2Ugb2JqZWN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hcEZ1bmN0aW9uICYmIHRoaXNBcmcpIHtcbiAgICAgICAgICAgIG1hcEZ1bmN0aW9uID0gbWFwRnVuY3Rpb24uYmluZCh0aGlzQXJnKTtcbiAgICAgICAgfVxuICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZSAqL1xuICAgICAgICBjb25zdCBDb25zdHJ1Y3RvciA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRvTGVuZ3RoKGFycmF5TGlrZS5sZW5ndGgpO1xuICAgICAgICAvLyBTdXBwb3J0IGV4dGVuc2lvblxuICAgICAgICBjb25zdCBhcnJheSA9IHR5cGVvZiBDb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyA/IE9iamVjdChuZXcgQ29uc3RydWN0b3IobGVuZ3RoKSkgOiBuZXcgQXJyYXkobGVuZ3RoKTtcbiAgICAgICAgaWYgKCFpc0FycmF5TGlrZShhcnJheUxpa2UpICYmICFpc0l0ZXJhYmxlKGFycmF5TGlrZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGFycmF5IGFuZCB0aGUgbm9ybWFsaXplZCBsZW5ndGggaXMgMCwganVzdCByZXR1cm4gYW4gZW1wdHkgYXJyYXkuIHRoaXMgcHJldmVudHMgYSBwcm9ibGVtXG4gICAgICAgIC8vIHdpdGggdGhlIGl0ZXJhdGlvbiBvbiBJRSB3aGVuIHVzaW5nIGEgTmFOIGFycmF5IGxlbmd0aC5cbiAgICAgICAgaWYgKGlzQXJyYXlMaWtlKGFycmF5TGlrZSkpIHtcbiAgICAgICAgICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5TGlrZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGFycmF5W2ldID0gbWFwRnVuY3Rpb24gPyBtYXBGdW5jdGlvbihhcnJheUxpa2VbaV0sIGkpIDogYXJyYXlMaWtlW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhcnJheUxpa2UpIHtcbiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IG1hcEZ1bmN0aW9uID8gbWFwRnVuY3Rpb24odmFsdWUsIGkpIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhcnJheUxpa2UubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFycmF5Lmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgfTtcbiAgICBvZiA9IGZ1bmN0aW9uIG9mKC4uLml0ZW1zKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChpdGVtcyk7XG4gICAgfTtcbiAgICBjb3B5V2l0aGluID0gZnVuY3Rpb24gY29weVdpdGhpbih0YXJnZXQsIG9mZnNldCwgc3RhcnQsIGVuZCkge1xuICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NvcHlXaXRoaW46IHRhcmdldCBtdXN0IGJlIGFuIGFycmF5LWxpa2Ugb2JqZWN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdG9MZW5ndGgodGFyZ2V0Lmxlbmd0aCk7XG4gICAgICAgIG9mZnNldCA9IG5vcm1hbGl6ZU9mZnNldCh0b0ludGVnZXIob2Zmc2V0KSwgbGVuZ3RoKTtcbiAgICAgICAgc3RhcnQgPSBub3JtYWxpemVPZmZzZXQodG9JbnRlZ2VyKHN0YXJ0KSwgbGVuZ3RoKTtcbiAgICAgICAgZW5kID0gbm9ybWFsaXplT2Zmc2V0KGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9JbnRlZ2VyKGVuZCksIGxlbmd0aCk7XG4gICAgICAgIGxldCBjb3VudCA9IE1hdGgubWluKGVuZCAtIHN0YXJ0LCBsZW5ndGggLSBvZmZzZXQpO1xuICAgICAgICBsZXQgZGlyZWN0aW9uID0gMTtcbiAgICAgICAgaWYgKG9mZnNldCA+IHN0YXJ0ICYmIG9mZnNldCA8IHN0YXJ0ICsgY291bnQpIHtcbiAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xO1xuICAgICAgICAgICAgc3RhcnQgKz0gY291bnQgLSAxO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IGNvdW50IC0gMTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoY291bnQgPiAwKSB7XG4gICAgICAgICAgICBpZiAoc3RhcnQgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W29mZnNldF0gPSB0YXJnZXRbc3RhcnRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRhcmdldFtvZmZzZXRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2Zmc2V0ICs9IGRpcmVjdGlvbjtcbiAgICAgICAgICAgIHN0YXJ0ICs9IGRpcmVjdGlvbjtcbiAgICAgICAgICAgIGNvdW50LS07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9O1xuICAgIGZpbGwgPSBmdW5jdGlvbiBmaWxsKHRhcmdldCwgdmFsdWUsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdG9MZW5ndGgodGFyZ2V0Lmxlbmd0aCk7XG4gICAgICAgIGxldCBpID0gbm9ybWFsaXplT2Zmc2V0KHRvSW50ZWdlcihzdGFydCksIGxlbmd0aCk7XG4gICAgICAgIGVuZCA9IG5vcm1hbGl6ZU9mZnNldChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvSW50ZWdlcihlbmQpLCBsZW5ndGgpO1xuICAgICAgICB3aGlsZSAoaSA8IGVuZCkge1xuICAgICAgICAgICAgdGFyZ2V0W2krK10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH07XG4gICAgZmluZCA9IGZ1bmN0aW9uIGZpbmQodGFyZ2V0LCBjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgICBjb25zdCBpbmRleCA9IGZpbmRJbmRleCh0YXJnZXQsIGNhbGxiYWNrLCB0aGlzQXJnKTtcbiAgICAgICAgcmV0dXJuIGluZGV4ICE9PSAtMSA/IHRhcmdldFtpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBmaW5kSW5kZXggPSBmdW5jdGlvbiBmaW5kSW5kZXgodGFyZ2V0LCBjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgICBjb25zdCBsZW5ndGggPSB0b0xlbmd0aCh0YXJnZXQubGVuZ3RoKTtcbiAgICAgICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZmluZDogc2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzQXJnKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrLmJpbmQodGhpc0FyZyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKHRhcmdldFtpXSwgaSwgdGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9O1xufVxuaWYgKHRydWUpIHtcbiAgICBpbmNsdWRlcyA9IHdyYXBOYXRpdmUoZ2xvYmFsLkFycmF5LnByb3RvdHlwZS5pbmNsdWRlcyk7XG59XG5lbHNlIHtcbiAgICAvKipcbiAgICAgKiBFbnN1cmVzIGEgbm9uLW5lZ2F0aXZlLCBub24taW5maW5pdGUsIHNhZmUgaW50ZWdlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciB0byB2YWxpZGF0ZVxuICAgICAqIEByZXR1cm4gQSBwcm9wZXIgbGVuZ3RoXG4gICAgICovXG4gICAgY29uc3QgdG9MZW5ndGggPSBmdW5jdGlvbiB0b0xlbmd0aChsZW5ndGgpIHtcbiAgICAgICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aCk7XG4gICAgICAgIGlmIChpc05hTihsZW5ndGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgICAgICAgbGVuZ3RoID0gTWF0aC5mbG9vcihsZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVuc3VyZSBhIG5vbi1uZWdhdGl2ZSwgcmVhbCwgc2FmZSBpbnRlZ2VyXG4gICAgICAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heChsZW5ndGgsIDApLCBNQVhfU0FGRV9JTlRFR0VSKTtcbiAgICB9O1xuICAgIGluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXModGFyZ2V0LCBzZWFyY2hFbGVtZW50LCBmcm9tSW5kZXggPSAwKSB7XG4gICAgICAgIGxldCBsZW4gPSB0b0xlbmd0aCh0YXJnZXQubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGZyb21JbmRleDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RWxlbWVudCA9IHRhcmdldFtpXTtcbiAgICAgICAgICAgIGlmIChzZWFyY2hFbGVtZW50ID09PSBjdXJyZW50RWxlbWVudCB8fFxuICAgICAgICAgICAgICAgIChzZWFyY2hFbGVtZW50ICE9PSBzZWFyY2hFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50ICE9PSBjdXJyZW50RWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFycmF5Lm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9hcnJheS5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL2FycmF5Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImNvbnN0IGdsb2JhbE9iamVjdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIGdsb2JhbCBzcGVjIGRlZmluZXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QgY2FsbGVkICdnbG9iYWwnXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWdsb2JhbFxuICAgICAgICAvLyBgZ2xvYmFsYCBpcyBhbHNvIGRlZmluZWQgaW4gTm9kZUpTXG4gICAgICAgIHJldHVybiBnbG9iYWw7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIHdpbmRvdyBpcyBkZWZpbmVkIGluIGJyb3dzZXJzXG4gICAgICAgIHJldHVybiB3aW5kb3c7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBzZWxmIGlzIGRlZmluZWQgaW4gV2ViV29ya2Vyc1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG59KSgpO1xuZXhwb3J0IGRlZmF1bHQgZ2xvYmFsT2JqZWN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2xvYmFsLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9nbG9iYWwubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9nbG9iYWwubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0ICcuL1N5bWJvbCc7XG5pbXBvcnQgeyBISUdIX1NVUlJPR0FURV9NQVgsIEhJR0hfU1VSUk9HQVRFX01JTiB9IGZyb20gJy4vc3RyaW5nJztcbmNvbnN0IHN0YXRpY0RvbmUgPSB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbi8qKlxuICogQSBjbGFzcyB0aGF0IF9zaGltc18gYW4gaXRlcmF0b3IgaW50ZXJmYWNlIG9uIGFycmF5IGxpa2Ugb2JqZWN0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNoaW1JdGVyYXRvciB7XG4gICAgY29uc3RydWN0b3IobGlzdCkge1xuICAgICAgICB0aGlzLl9uZXh0SW5kZXggPSAtMTtcbiAgICAgICAgaWYgKGlzSXRlcmFibGUobGlzdCkpIHtcbiAgICAgICAgICAgIHRoaXMuX25hdGl2ZUl0ZXJhdG9yID0gbGlzdFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9saXN0ID0gbGlzdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIG5leHQgaXRlcmF0aW9uIHJlc3VsdCBmb3IgdGhlIEl0ZXJhdG9yXG4gICAgICovXG4gICAgbmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX25hdGl2ZUl0ZXJhdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbmF0aXZlSXRlcmF0b3IubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fbGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRpY0RvbmU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCsrdGhpcy5fbmV4dEluZGV4IDwgdGhpcy5fbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZG9uZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuX2xpc3RbdGhpcy5fbmV4dEluZGV4XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdGljRG9uZTtcbiAgICB9XG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbi8qKlxuICogQSB0eXBlIGd1YXJkIGZvciBjaGVja2luZyBpZiBzb21ldGhpbmcgaGFzIGFuIEl0ZXJhYmxlIGludGVyZmFjZVxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdHlwZSBndWFyZCBhZ2FpbnN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0l0ZXJhYmxlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZVtTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nO1xufVxuLyoqXG4gKiBBIHR5cGUgZ3VhcmQgZm9yIGNoZWNraW5nIGlmIHNvbWV0aGluZyBpcyBBcnJheUxpa2VcbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHR5cGUgZ3VhcmQgYWdhaW5zdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLmxlbmd0aCA9PT0gJ251bWJlcic7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGl0ZXJhdG9yIGZvciBhbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0gaXRlcmFibGUgVGhlIGl0ZXJhYmxlIG9iamVjdCB0byByZXR1cm4gdGhlIGl0ZXJhdG9yIGZvclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0KGl0ZXJhYmxlKSB7XG4gICAgaWYgKGlzSXRlcmFibGUoaXRlcmFibGUpKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzQXJyYXlMaWtlKGl0ZXJhYmxlKSkge1xuICAgICAgICByZXR1cm4gbmV3IFNoaW1JdGVyYXRvcihpdGVyYWJsZSk7XG4gICAgfVxufVxuLyoqXG4gKiBTaGltcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBgZm9yIC4uLiBvZmAgYmxvY2tzXG4gKlxuICogQHBhcmFtIGl0ZXJhYmxlIFRoZSBvYmplY3QgdGhlIHByb3ZpZGVzIGFuIGludGVyYXRvciBpbnRlcmZhY2VcbiAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2ggaXRlbSBvZiB0aGUgaXRlcmFibGVcbiAqIEBwYXJhbSB0aGlzQXJnIE9wdGlvbmFsIHNjb3BlIHRvIHBhc3MgdGhlIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JPZihpdGVyYWJsZSwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICBsZXQgYnJva2VuID0gZmFsc2U7XG4gICAgZnVuY3Rpb24gZG9CcmVhaygpIHtcbiAgICAgICAgYnJva2VuID0gdHJ1ZTtcbiAgICB9XG4gICAgLyogV2UgbmVlZCB0byBoYW5kbGUgaXRlcmF0aW9uIG9mIGRvdWJsZSBieXRlIHN0cmluZ3MgcHJvcGVybHkgKi9cbiAgICBpZiAoaXNBcnJheUxpa2UoaXRlcmFibGUpICYmIHR5cGVvZiBpdGVyYWJsZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgbCA9IGl0ZXJhYmxlLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBjaGFyID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICBpZiAoaSArIDEgPCBsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSA+PSBISUdIX1NVUlJPR0FURV9NSU4gJiYgY29kZSA8PSBISUdIX1NVUlJPR0FURV9NQVgpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhciArPSBpdGVyYWJsZVsrK2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgY2hhciwgaXRlcmFibGUsIGRvQnJlYWspO1xuICAgICAgICAgICAgaWYgKGJyb2tlbikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSBnZXQoaXRlcmFibGUpO1xuICAgICAgICBpZiAoaXRlcmF0b3IpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICB3aGlsZSAoIXJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzQXJnLCByZXN1bHQudmFsdWUsIGl0ZXJhYmxlLCBkb0JyZWFrKTtcbiAgICAgICAgICAgICAgICBpZiAoYnJva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXRlcmF0b3IubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL2l0ZXJhdG9yLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vaXRlcmF0b3IubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XG4vKipcbiAqIFRoZSBzbWFsbGVzdCBpbnRlcnZhbCBiZXR3ZWVuIHR3byByZXByZXNlbnRhYmxlIG51bWJlcnMuXG4gKi9cbmV4cG9ydCBjb25zdCBFUFNJTE9OID0gMTtcbi8qKlxuICogVGhlIG1heGltdW0gc2FmZSBpbnRlZ2VyIGluIEphdmFTY3JpcHRcbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9TQUZFX0lOVEVHRVIgPSBNYXRoLnBvdygyLCA1MykgLSAxO1xuLyoqXG4gKiBUaGUgbWluaW11bSBzYWZlIGludGVnZXIgaW4gSmF2YVNjcmlwdFxuICovXG5leHBvcnQgY29uc3QgTUlOX1NBRkVfSU5URUdFUiA9IC1NQVhfU0FGRV9JTlRFR0VSO1xuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhc3NlZCB2YWx1ZSBpcyBOYU4gd2l0aG91dCBjb2Vyc2lvbi5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgTmFOLCBmYWxzZSBpZiBpdCBpcyBub3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTmFOKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgZ2xvYmFsLmlzTmFOKHZhbHVlKTtcbn1cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXNzZWQgdmFsdWUgaXMgYSBmaW5pdGUgbnVtYmVyIHdpdGhvdXQgY29lcnNpb24uXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGZpbml0ZSwgZmFsc2UgaWYgaXQgaXMgbm90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Zpbml0ZSh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGdsb2JhbC5pc0Zpbml0ZSh2YWx1ZSk7XG59XG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGFzc2VkIHZhbHVlIGlzIGFuIGludGVnZXIuXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGFuIGludGVnZXIsIGZhbHNlIGlmIGl0IGlzIG5vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJbnRlZ2VyKHZhbHVlKSB7XG4gICAgcmV0dXJuIGlzRmluaXRlKHZhbHVlKSAmJiBNYXRoLmZsb29yKHZhbHVlKSA9PT0gdmFsdWU7XG59XG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGFzc2VkIHZhbHVlIGlzIGFuIGludGVnZXIgdGhhdCBpcyAnc2FmZSwnIG1lYW5pbmc6XG4gKiAgIDEuIGl0IGNhbiBiZSBleHByZXNzZWQgYXMgYW4gSUVFRS03NTQgZG91YmxlIHByZWNpc2lvbiBudW1iZXJcbiAqICAgMi4gaXQgaGFzIGEgb25lLXRvLW9uZSBtYXBwaW5nIHRvIGEgbWF0aGVtYXRpY2FsIGludGVnZXIsIG1lYW5pbmcgaXRzXG4gKiAgICAgIElFRUUtNzU0IHJlcHJlc2VudGF0aW9uIGNhbm5vdCBiZSB0aGUgcmVzdWx0IG9mIHJvdW5kaW5nIGFueSBvdGhlclxuICogICAgICBpbnRlZ2VyIHRvIGZpdCB0aGUgSUVFRS03NTQgcmVwcmVzZW50YXRpb25cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlciwgZmFsc2UgaWYgaXQgaXMgbm90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlKSB7XG4gICAgcmV0dXJuIGlzSW50ZWdlcih2YWx1ZSkgJiYgTWF0aC5hYnModmFsdWUpIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1udW1iZXIubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL251bWJlci5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL251bWJlci5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4vZ2xvYmFsJztcbmltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XG5pbXBvcnQgeyBpc1N5bWJvbCB9IGZyb20gJy4vU3ltYm9sJztcbmV4cG9ydCBsZXQgYXNzaWduO1xuLyoqXG4gKiBHZXRzIHRoZSBvd24gcHJvcGVydHkgZGVzY3JpcHRvciBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC5cbiAqIEFuIG93biBwcm9wZXJ0eSBkZXNjcmlwdG9yIGlzIG9uZSB0aGF0IGlzIGRlZmluZWQgZGlyZWN0bHkgb24gdGhlIG9iamVjdCBhbmQgaXMgbm90XG4gKiBpbmhlcml0ZWQgZnJvbSB0aGUgb2JqZWN0J3MgcHJvdG90eXBlLlxuICogQHBhcmFtIG8gT2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHByb3BlcnR5LlxuICogQHBhcmFtIHAgTmFtZSBvZiB0aGUgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBsZXQgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgb3duIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0LiBUaGUgb3duIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IGFyZSB0aG9zZSB0aGF0IGFyZSBkZWZpbmVkIGRpcmVjdGx5XG4gKiBvbiB0aGF0IG9iamVjdCwgYW5kIGFyZSBub3QgaW5oZXJpdGVkIGZyb20gdGhlIG9iamVjdCdzIHByb3RvdHlwZS4gVGhlIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IGluY2x1ZGUgYm90aCBmaWVsZHMgKG9iamVjdHMpIGFuZCBmdW5jdGlvbnMuXG4gKiBAcGFyYW0gbyBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgb3duIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBsZXQgZ2V0T3duUHJvcGVydHlOYW1lcztcbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgc3ltYm9sIHByb3BlcnRpZXMgZm91bmQgZGlyZWN0bHkgb24gb2JqZWN0IG8uXG4gKiBAcGFyYW0gbyBPYmplY3QgdG8gcmV0cmlldmUgdGhlIHN5bWJvbHMgZnJvbS5cbiAqL1xuZXhwb3J0IGxldCBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWVzIGFyZSB0aGUgc2FtZSB2YWx1ZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICogQHBhcmFtIHZhbHVlMSBUaGUgZmlyc3QgdmFsdWUuXG4gKiBAcGFyYW0gdmFsdWUyIFRoZSBzZWNvbmQgdmFsdWUuXG4gKi9cbmV4cG9ydCBsZXQgaXM7XG4vKipcbiAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgb2YgYW4gb2JqZWN0LlxuICogQHBhcmFtIG8gT2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMuIFRoaXMgY2FuIGJlIGFuIG9iamVjdCB0aGF0IHlvdSBjcmVhdGVkIG9yIGFuIGV4aXN0aW5nIERvY3VtZW50IE9iamVjdCBNb2RlbCAoRE9NKSBvYmplY3QuXG4gKi9cbmV4cG9ydCBsZXQga2V5cztcbi8qIEVTNyBPYmplY3Qgc3RhdGljIG1ldGhvZHMgKi9cbmV4cG9ydCBsZXQgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycztcbmV4cG9ydCBsZXQgZW50cmllcztcbmV4cG9ydCBsZXQgdmFsdWVzO1xuaWYgKHRydWUpIHtcbiAgICBjb25zdCBnbG9iYWxPYmplY3QgPSBnbG9iYWwuT2JqZWN0O1xuICAgIGFzc2lnbiA9IGdsb2JhbE9iamVjdC5hc3NpZ247XG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2xvYmFsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiAgICBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZ2xvYmFsT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7XG4gICAgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2xvYmFsT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbiAgICBpcyA9IGdsb2JhbE9iamVjdC5pcztcbiAgICBrZXlzID0gZ2xvYmFsT2JqZWN0LmtleXM7XG59XG5lbHNlIHtcbiAgICBrZXlzID0gZnVuY3Rpb24gc3ltYm9sQXdhcmVLZXlzKG8pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG8pLmZpbHRlcigoa2V5KSA9PiAhQm9vbGVhbihrZXkubWF0Y2goL15AQC4rLykpKTtcbiAgICB9O1xuICAgIGFzc2lnbiA9IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIC4uLnNvdXJjZXMpIHtcbiAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUeXBlRXJyb3IgaWYgdW5kZWZpbmVkIG9yIG51bGxcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvID0gT2JqZWN0KHRhcmdldCk7XG4gICAgICAgIHNvdXJjZXMuZm9yRWFjaCgobmV4dFNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgaWYgKG5leHRTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAvLyBTa2lwIG92ZXIgaWYgdW5kZWZpbmVkIG9yIG51bGxcbiAgICAgICAgICAgICAgICBrZXlzKG5leHRTb3VyY2UpLmZvckVhY2goKG5leHRLZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdG9bbmV4dEtleV0gPSBuZXh0U291cmNlW25leHRLZXldO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRvO1xuICAgIH07XG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8sIHByb3ApIHtcbiAgICAgICAgaWYgKGlzU3ltYm9sKHByb3ApKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvLCBwcm9wKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8sIHByb3ApO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhvKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvKS5maWx0ZXIoKGtleSkgPT4gIUJvb2xlYW4oa2V5Lm1hdGNoKC9eQEAuKy8pKSk7XG4gICAgfTtcbiAgICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMobykge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobylcbiAgICAgICAgICAgIC5maWx0ZXIoKGtleSkgPT4gQm9vbGVhbihrZXkubWF0Y2goL15AQC4rLykpKVxuICAgICAgICAgICAgLm1hcCgoa2V5KSA9PiBTeW1ib2wuZm9yKGtleS5zdWJzdHJpbmcoMikpKTtcbiAgICB9O1xuICAgIGlzID0gZnVuY3Rpb24gaXModmFsdWUxLCB2YWx1ZTIpIHtcbiAgICAgICAgaWYgKHZhbHVlMSA9PT0gdmFsdWUyKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUxICE9PSAwIHx8IDEgLyB2YWx1ZTEgPT09IDEgLyB2YWx1ZTI7IC8vIC0wXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlMSAhPT0gdmFsdWUxICYmIHZhbHVlMiAhPT0gdmFsdWUyOyAvLyBOYU5cbiAgICB9O1xufVxuaWYgKHRydWUpIHtcbiAgICBjb25zdCBnbG9iYWxPYmplY3QgPSBnbG9iYWwuT2JqZWN0O1xuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPSBnbG9iYWxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycztcbiAgICBlbnRyaWVzID0gZ2xvYmFsT2JqZWN0LmVudHJpZXM7XG4gICAgdmFsdWVzID0gZ2xvYmFsT2JqZWN0LnZhbHVlcztcbn1cbmVsc2Uge1xuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG8pIHtcbiAgICAgICAgcmV0dXJuIGdldE93blByb3BlcnR5TmFtZXMobykucmVkdWNlKChwcmV2aW91cywga2V5KSA9PiB7XG4gICAgICAgICAgICBwcmV2aW91c1trZXldID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8sIGtleSk7XG4gICAgICAgICAgICByZXR1cm4gcHJldmlvdXM7XG4gICAgICAgIH0sIHt9KTtcbiAgICB9O1xuICAgIGVudHJpZXMgPSBmdW5jdGlvbiBlbnRyaWVzKG8pIHtcbiAgICAgICAgcmV0dXJuIGtleXMobykubWFwKChrZXkpID0+IFtrZXksIG9ba2V5XV0pO1xuICAgIH07XG4gICAgdmFsdWVzID0gZnVuY3Rpb24gdmFsdWVzKG8pIHtcbiAgICAgICAgcmV0dXJuIGtleXMobykubWFwKChrZXkpID0+IG9ba2V5XSk7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9iamVjdC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vb2JqZWN0Lm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vb2JqZWN0Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xuaW1wb3J0IGhhcyBmcm9tICcuL3N1cHBvcnQvaGFzJztcbmltcG9ydCB7IHdyYXBOYXRpdmUgfSBmcm9tICcuL3N1cHBvcnQvdXRpbCc7XG4vKipcbiAqIFRoZSBtaW5pbXVtIGxvY2F0aW9uIG9mIGhpZ2ggc3Vycm9nYXRlc1xuICovXG5leHBvcnQgY29uc3QgSElHSF9TVVJST0dBVEVfTUlOID0gMHhkODAwO1xuLyoqXG4gKiBUaGUgbWF4aW11bSBsb2NhdGlvbiBvZiBoaWdoIHN1cnJvZ2F0ZXNcbiAqL1xuZXhwb3J0IGNvbnN0IEhJR0hfU1VSUk9HQVRFX01BWCA9IDB4ZGJmZjtcbi8qKlxuICogVGhlIG1pbmltdW0gbG9jYXRpb24gb2YgbG93IHN1cnJvZ2F0ZXNcbiAqL1xuZXhwb3J0IGNvbnN0IExPV19TVVJST0dBVEVfTUlOID0gMHhkYzAwO1xuLyoqXG4gKiBUaGUgbWF4aW11bSBsb2NhdGlvbiBvZiBsb3cgc3Vycm9nYXRlc1xuICovXG5leHBvcnQgY29uc3QgTE9XX1NVUlJPR0FURV9NQVggPSAweGRmZmY7XG4vKiBFUzYgc3RhdGljIG1ldGhvZHMgKi9cbi8qKlxuICogUmV0dXJuIHRoZSBTdHJpbmcgdmFsdWUgd2hvc2UgZWxlbWVudHMgYXJlLCBpbiBvcmRlciwgdGhlIGVsZW1lbnRzIGluIHRoZSBMaXN0IGVsZW1lbnRzLlxuICogSWYgbGVuZ3RoIGlzIDAsIHRoZSBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuXG4gKiBAcGFyYW0gY29kZVBvaW50cyBUaGUgY29kZSBwb2ludHMgdG8gZ2VuZXJhdGUgdGhlIHN0cmluZ1xuICovXG5leHBvcnQgbGV0IGZyb21Db2RlUG9pbnQ7XG4vKipcbiAqIGByYXdgIGlzIGludGVuZGVkIGZvciB1c2UgYXMgYSB0YWcgZnVuY3Rpb24gb2YgYSBUYWdnZWQgVGVtcGxhdGUgU3RyaW5nLiBXaGVuIGNhbGxlZFxuICogYXMgc3VjaCB0aGUgZmlyc3QgYXJndW1lbnQgd2lsbCBiZSBhIHdlbGwgZm9ybWVkIHRlbXBsYXRlIGNhbGwgc2l0ZSBvYmplY3QgYW5kIHRoZSByZXN0XG4gKiBwYXJhbWV0ZXIgd2lsbCBjb250YWluIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzLlxuICogQHBhcmFtIHRlbXBsYXRlIEEgd2VsbC1mb3JtZWQgdGVtcGxhdGUgc3RyaW5nIGNhbGwgc2l0ZSByZXByZXNlbnRhdGlvbi5cbiAqIEBwYXJhbSBzdWJzdGl0dXRpb25zIEEgc2V0IG9mIHN1YnN0aXR1dGlvbiB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBsZXQgcmF3O1xuLyogRVM2IGluc3RhbmNlIG1ldGhvZHMgKi9cbi8qKlxuICogUmV0dXJucyBhIG5vbm5lZ2F0aXZlIGludGVnZXIgTnVtYmVyIGxlc3MgdGhhbiAxMTE0MTEyICgweDExMDAwMCkgdGhhdCBpcyB0aGUgY29kZSBwb2ludFxuICogdmFsdWUgb2YgdGhlIFVURi0xNiBlbmNvZGVkIGNvZGUgcG9pbnQgc3RhcnRpbmcgYXQgdGhlIHN0cmluZyBlbGVtZW50IGF0IHBvc2l0aW9uIHBvcyBpblxuICogdGhlIFN0cmluZyByZXN1bHRpbmcgZnJvbSBjb252ZXJ0aW5nIHRoaXMgb2JqZWN0IHRvIGEgU3RyaW5nLlxuICogSWYgdGhlcmUgaXMgbm8gZWxlbWVudCBhdCB0aGF0IHBvc2l0aW9uLCB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZC5cbiAqIElmIGEgdmFsaWQgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlyIGRvZXMgbm90IGJlZ2luIGF0IHBvcywgdGhlIHJlc3VsdCBpcyB0aGUgY29kZSB1bml0IGF0IHBvcy5cbiAqL1xuZXhwb3J0IGxldCBjb2RlUG9pbnRBdDtcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXF1ZW5jZSBvZiBlbGVtZW50cyBvZiBzZWFyY2hTdHJpbmcgY29udmVydGVkIHRvIGEgU3RyaW5nIGlzIHRoZVxuICogc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiB0aGlzIG9iamVjdCAoY29udmVydGVkIHRvIGEgU3RyaW5nKSBzdGFydGluZyBhdFxuICogZW5kUG9zaXRpb24g4oCTIGxlbmd0aCh0aGlzKS4gT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuXG4gKi9cbmV4cG9ydCBsZXQgZW5kc1dpdGg7XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBzZWFyY2hTdHJpbmcgYXBwZWFycyBhcyBhIHN1YnN0cmluZyBvZiB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhpc1xuICogb2JqZWN0IHRvIGEgU3RyaW5nLCBhdCBvbmUgb3IgbW9yZSBwb3NpdGlvbnMgdGhhdCBhcmVcbiAqIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBwb3NpdGlvbjsgb3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlLlxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHN0cmluZ1xuICogQHBhcmFtIHNlYXJjaFN0cmluZyBzZWFyY2ggc3RyaW5nXG4gKiBAcGFyYW0gcG9zaXRpb24gSWYgcG9zaXRpb24gaXMgdW5kZWZpbmVkLCAwIGlzIGFzc3VtZWQsIHNvIGFzIHRvIHNlYXJjaCBhbGwgb2YgdGhlIFN0cmluZy5cbiAqL1xuZXhwb3J0IGxldCBpbmNsdWRlcztcbi8qKlxuICogUmV0dXJucyB0aGUgU3RyaW5nIHZhbHVlIHJlc3VsdCBvZiBub3JtYWxpemluZyB0aGUgc3RyaW5nIGludG8gdGhlIG5vcm1hbGl6YXRpb24gZm9ybVxuICogbmFtZWQgYnkgZm9ybSBhcyBzcGVjaWZpZWQgaW4gVW5pY29kZSBTdGFuZGFyZCBBbm5leCAjMTUsIFVuaWNvZGUgTm9ybWFsaXphdGlvbiBGb3Jtcy5cbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBzdHJpbmdcbiAqIEBwYXJhbSBmb3JtIEFwcGxpY2FibGUgdmFsdWVzOiBcIk5GQ1wiLCBcIk5GRFwiLCBcIk5GS0NcIiwgb3IgXCJORktEXCIsIElmIG5vdCBzcGVjaWZpZWQgZGVmYXVsdFxuICogaXMgXCJORkNcIlxuICovXG5leHBvcnQgbGV0IG5vcm1hbGl6ZTtcbi8qKlxuICogUmV0dXJucyBhIFN0cmluZyB2YWx1ZSB0aGF0IGlzIG1hZGUgZnJvbSBjb3VudCBjb3BpZXMgYXBwZW5kZWQgdG9nZXRoZXIuIElmIGNvdW50IGlzIDAsXG4gKiBUIGlzIHRoZSBlbXB0eSBTdHJpbmcgaXMgcmV0dXJuZWQuXG4gKiBAcGFyYW0gY291bnQgbnVtYmVyIG9mIGNvcGllcyB0byBhcHBlbmRcbiAqL1xuZXhwb3J0IGxldCByZXBlYXQ7XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VxdWVuY2Ugb2YgZWxlbWVudHMgb2Ygc2VhcmNoU3RyaW5nIGNvbnZlcnRlZCB0byBhIFN0cmluZyBpcyB0aGVcbiAqIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgdGhpcyBvYmplY3QgKGNvbnZlcnRlZCB0byBhIFN0cmluZykgc3RhcnRpbmcgYXRcbiAqIHBvc2l0aW9uLiBPdGhlcndpc2UgcmV0dXJucyBmYWxzZS5cbiAqL1xuZXhwb3J0IGxldCBzdGFydHNXaXRoO1xuLyogRVM3IGluc3RhbmNlIG1ldGhvZHMgKi9cbi8qKlxuICogUGFkcyB0aGUgY3VycmVudCBzdHJpbmcgd2l0aCBhIGdpdmVuIHN0cmluZyAocG9zc2libHkgcmVwZWF0ZWQpIHNvIHRoYXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgcmVhY2hlcyBhIGdpdmVuIGxlbmd0aC5cbiAqIFRoZSBwYWRkaW5nIGlzIGFwcGxpZWQgZnJvbSB0aGUgZW5kIChyaWdodCkgb2YgdGhlIGN1cnJlbnQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBzdHJpbmdcbiAqIEBwYXJhbSBtYXhMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZyBvbmNlIHRoZSBjdXJyZW50IHN0cmluZyBoYXMgYmVlbiBwYWRkZWQuXG4gKiAgICAgICAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgc21hbGxlciB0aGFuIHRoZSBjdXJyZW50IHN0cmluZydzIGxlbmd0aCwgdGhlIGN1cnJlbnQgc3RyaW5nIHdpbGwgYmUgcmV0dXJuZWQgYXMgaXQgaXMuXG4gKlxuICogQHBhcmFtIGZpbGxTdHJpbmcgVGhlIHN0cmluZyB0byBwYWQgdGhlIGN1cnJlbnQgc3RyaW5nIHdpdGguXG4gKiAgICAgICAgSWYgdGhpcyBzdHJpbmcgaXMgdG9vIGxvbmcsIGl0IHdpbGwgYmUgdHJ1bmNhdGVkIGFuZCB0aGUgbGVmdC1tb3N0IHBhcnQgd2lsbCBiZSBhcHBsaWVkLlxuICogICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciBpcyBcIiBcIiAoVSswMDIwKS5cbiAqL1xuZXhwb3J0IGxldCBwYWRFbmQ7XG4vKipcbiAqIFBhZHMgdGhlIGN1cnJlbnQgc3RyaW5nIHdpdGggYSBnaXZlbiBzdHJpbmcgKHBvc3NpYmx5IHJlcGVhdGVkKSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgc3RyaW5nIHJlYWNoZXMgYSBnaXZlbiBsZW5ndGguXG4gKiBUaGUgcGFkZGluZyBpcyBhcHBsaWVkIGZyb20gdGhlIHN0YXJ0IChsZWZ0KSBvZiB0aGUgY3VycmVudCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHN0cmluZ1xuICogQHBhcmFtIG1heExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nIG9uY2UgdGhlIGN1cnJlbnQgc3RyaW5nIGhhcyBiZWVuIHBhZGRlZC5cbiAqICAgICAgICBJZiB0aGlzIHBhcmFtZXRlciBpcyBzbWFsbGVyIHRoYW4gdGhlIGN1cnJlbnQgc3RyaW5nJ3MgbGVuZ3RoLCB0aGUgY3VycmVudCBzdHJpbmcgd2lsbCBiZSByZXR1cm5lZCBhcyBpdCBpcy5cbiAqXG4gKiBAcGFyYW0gZmlsbFN0cmluZyBUaGUgc3RyaW5nIHRvIHBhZCB0aGUgY3VycmVudCBzdHJpbmcgd2l0aC5cbiAqICAgICAgICBJZiB0aGlzIHN0cmluZyBpcyB0b28gbG9uZywgaXQgd2lsbCBiZSB0cnVuY2F0ZWQgYW5kIHRoZSBsZWZ0LW1vc3QgcGFydCB3aWxsIGJlIGFwcGxpZWQuXG4gKiAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlzIFwiIFwiIChVKzAwMjApLlxuICovXG5leHBvcnQgbGV0IHBhZFN0YXJ0O1xuaWYgKHRydWUgJiYgdHJ1ZSkge1xuICAgIGZyb21Db2RlUG9pbnQgPSBnbG9iYWwuU3RyaW5nLmZyb21Db2RlUG9pbnQ7XG4gICAgcmF3ID0gZ2xvYmFsLlN0cmluZy5yYXc7XG4gICAgY29kZVBvaW50QXQgPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0KTtcbiAgICBlbmRzV2l0aCA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUuZW5kc1dpdGgpO1xuICAgIGluY2x1ZGVzID0gd3JhcE5hdGl2ZShnbG9iYWwuU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlcyk7XG4gICAgbm9ybWFsaXplID0gd3JhcE5hdGl2ZShnbG9iYWwuU3RyaW5nLnByb3RvdHlwZS5ub3JtYWxpemUpO1xuICAgIHJlcGVhdCA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUucmVwZWF0KTtcbiAgICBzdGFydHNXaXRoID0gd3JhcE5hdGl2ZShnbG9iYWwuU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoKTtcbn1cbmVsc2Uge1xuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlcyB0aGF0IHRleHQgaXMgZGVmaW5lZCwgYW5kIG5vcm1hbGl6ZXMgcG9zaXRpb24gKGJhc2VkIG9uIHRoZSBnaXZlbiBkZWZhdWx0IGlmIHRoZSBpbnB1dCBpcyBOYU4pLlxuICAgICAqIFVzZWQgYnkgc3RhcnRzV2l0aCwgaW5jbHVkZXMsIGFuZCBlbmRzV2l0aC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gTm9ybWFsaXplZCBwb3NpdGlvbi5cbiAgICAgKi9cbiAgICBjb25zdCBub3JtYWxpemVTdWJzdHJpbmdBcmdzID0gZnVuY3Rpb24gKG5hbWUsIHRleHQsIHNlYXJjaCwgcG9zaXRpb24sIGlzRW5kID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RyaW5nLicgKyBuYW1lICsgJyByZXF1aXJlcyBhIHZhbGlkIHN0cmluZyB0byBzZWFyY2ggYWdhaW5zdC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsZW5ndGggPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiAhPT0gcG9zaXRpb24gPyAoaXNFbmQgPyBsZW5ndGggOiAwKSA6IHBvc2l0aW9uO1xuICAgICAgICByZXR1cm4gW3RleHQsIFN0cmluZyhzZWFyY2gpLCBNYXRoLm1pbihNYXRoLm1heChwb3NpdGlvbiwgMCksIGxlbmd0aCldO1xuICAgIH07XG4gICAgZnJvbUNvZGVQb2ludCA9IGZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoLi4uY29kZVBvaW50cykge1xuICAgICAgICAvLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL21hdGhpYXNieW5lbnMvU3RyaW5nLmZyb21Db2RlUG9pbnRcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xuICAgICAgICBjb25zdCBNQVhfU0laRSA9IDB4NDAwMDtcbiAgICAgICAgbGV0IGNvZGVVbml0cyA9IFtdO1xuICAgICAgICBsZXQgaW5kZXggPSAtMTtcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGNvZGVQb2ludCA9IE51bWJlcihhcmd1bWVudHNbaW5kZXhdKTtcbiAgICAgICAgICAgIC8vIENvZGUgcG9pbnRzIG11c3QgYmUgZmluaXRlIGludGVnZXJzIHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2VcbiAgICAgICAgICAgIGxldCBpc1ZhbGlkID0gaXNGaW5pdGUoY29kZVBvaW50KSAmJiBNYXRoLmZsb29yKGNvZGVQb2ludCkgPT09IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPj0gMCAmJiBjb2RlUG9pbnQgPD0gMHgxMGZmZmY7XG4gICAgICAgICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBSYW5nZUVycm9yKCdzdHJpbmcuZnJvbUNvZGVQb2ludDogSW52YWxpZCBjb2RlIHBvaW50ICcgKyBjb2RlUG9pbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA8PSAweGZmZmYpIHtcbiAgICAgICAgICAgICAgICAvLyBCTVAgY29kZSBwb2ludFxuICAgICAgICAgICAgICAgIGNvZGVVbml0cy5wdXNoKGNvZGVQb2ludCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBBc3RyYWwgY29kZSBwb2ludDsgc3BsaXQgaW4gc3Vycm9nYXRlIGhhbHZlc1xuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nI3N1cnJvZ2F0ZS1mb3JtdWxhZVxuICAgICAgICAgICAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwO1xuICAgICAgICAgICAgICAgIGxldCBoaWdoU3Vycm9nYXRlID0gKGNvZGVQb2ludCA+PiAxMCkgKyBISUdIX1NVUlJPR0FURV9NSU47XG4gICAgICAgICAgICAgICAgbGV0IGxvd1N1cnJvZ2F0ZSA9IGNvZGVQb2ludCAlIDB4NDAwICsgTE9XX1NVUlJPR0FURV9NSU47XG4gICAgICAgICAgICAgICAgY29kZVVuaXRzLnB1c2goaGlnaFN1cnJvZ2F0ZSwgbG93U3Vycm9nYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbmRleCArIDEgPT09IGxlbmd0aCB8fCBjb2RlVW5pdHMubGVuZ3RoID4gTUFYX1NJWkUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGNvZGVVbml0cyk7XG4gICAgICAgICAgICAgICAgY29kZVVuaXRzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIHJhdyA9IGZ1bmN0aW9uIHJhdyhjYWxsU2l0ZSwgLi4uc3Vic3RpdHV0aW9ucykge1xuICAgICAgICBsZXQgcmF3U3RyaW5ncyA9IGNhbGxTaXRlLnJhdztcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICBsZXQgbnVtU3Vic3RpdHV0aW9ucyA9IHN1YnN0aXR1dGlvbnMubGVuZ3RoO1xuICAgICAgICBpZiAoY2FsbFNpdGUgPT0gbnVsbCB8fCBjYWxsU2l0ZS5yYXcgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RyaW5nLnJhdyByZXF1aXJlcyBhIHZhbGlkIGNhbGxTaXRlIG9iamVjdCB3aXRoIGEgcmF3IHZhbHVlJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IHJhd1N0cmluZ3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSByYXdTdHJpbmdzW2ldICsgKGkgPCBudW1TdWJzdGl0dXRpb25zICYmIGkgPCBsZW5ndGggLSAxID8gc3Vic3RpdHV0aW9uc1tpXSA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgY29kZVBvaW50QXQgPSBmdW5jdGlvbiBjb2RlUG9pbnRBdCh0ZXh0LCBwb3NpdGlvbiA9IDApIHtcbiAgICAgICAgLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXRcbiAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RyaW5nLmNvZGVQb2ludEF0IHJlcXVyaWVzIGEgdmFsaWQgc3RyaW5nLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRleHQubGVuZ3RoO1xuICAgICAgICBpZiAocG9zaXRpb24gIT09IHBvc2l0aW9uKSB7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+PSBsZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gR2V0IHRoZSBmaXJzdCBjb2RlIHVuaXRcbiAgICAgICAgY29uc3QgZmlyc3QgPSB0ZXh0LmNoYXJDb2RlQXQocG9zaXRpb24pO1xuICAgICAgICBpZiAoZmlyc3QgPj0gSElHSF9TVVJST0dBVEVfTUlOICYmIGZpcnN0IDw9IEhJR0hfU1VSUk9HQVRFX01BWCAmJiBsZW5ndGggPiBwb3NpdGlvbiArIDEpIHtcbiAgICAgICAgICAgIC8vIFN0YXJ0IG9mIGEgc3Vycm9nYXRlIHBhaXIgKGhpZ2ggc3Vycm9nYXRlIGFuZCB0aGVyZSBpcyBhIG5leHQgY29kZSB1bml0KTsgY2hlY2sgZm9yIGxvdyBzdXJyb2dhdGVcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nI3N1cnJvZ2F0ZS1mb3JtdWxhZVxuICAgICAgICAgICAgY29uc3Qgc2Vjb25kID0gdGV4dC5jaGFyQ29kZUF0KHBvc2l0aW9uICsgMSk7XG4gICAgICAgICAgICBpZiAoc2Vjb25kID49IExPV19TVVJST0dBVEVfTUlOICYmIHNlY29uZCA8PSBMT1dfU1VSUk9HQVRFX01BWCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoZmlyc3QgLSBISUdIX1NVUlJPR0FURV9NSU4pICogMHg0MDAgKyBzZWNvbmQgLSBMT1dfU1VSUk9HQVRFX01JTiArIDB4MTAwMDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpcnN0O1xuICAgIH07XG4gICAgZW5kc1dpdGggPSBmdW5jdGlvbiBlbmRzV2l0aCh0ZXh0LCBzZWFyY2gsIGVuZFBvc2l0aW9uKSB7XG4gICAgICAgIGlmIChlbmRQb3NpdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICBlbmRQb3NpdGlvbiA9IHRleHQubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIFt0ZXh0LCBzZWFyY2gsIGVuZFBvc2l0aW9uXSA9IG5vcm1hbGl6ZVN1YnN0cmluZ0FyZ3MoJ2VuZHNXaXRoJywgdGV4dCwgc2VhcmNoLCBlbmRQb3NpdGlvbiwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gZW5kUG9zaXRpb24gLSBzZWFyY2gubGVuZ3RoO1xuICAgICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQuc2xpY2Uoc3RhcnQsIGVuZFBvc2l0aW9uKSA9PT0gc2VhcmNoO1xuICAgIH07XG4gICAgaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyh0ZXh0LCBzZWFyY2gsIHBvc2l0aW9uID0gMCkge1xuICAgICAgICBbdGV4dCwgc2VhcmNoLCBwb3NpdGlvbl0gPSBub3JtYWxpemVTdWJzdHJpbmdBcmdzKCdpbmNsdWRlcycsIHRleHQsIHNlYXJjaCwgcG9zaXRpb24pO1xuICAgICAgICByZXR1cm4gdGV4dC5pbmRleE9mKHNlYXJjaCwgcG9zaXRpb24pICE9PSAtMTtcbiAgICB9O1xuICAgIHJlcGVhdCA9IGZ1bmN0aW9uIHJlcGVhdCh0ZXh0LCBjb3VudCA9IDApIHtcbiAgICAgICAgLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUucmVwZWF0XG4gICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmluZy5yZXBlYXQgcmVxdWlyZXMgYSB2YWxpZCBzdHJpbmcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvdW50ICE9PSBjb3VudCkge1xuICAgICAgICAgICAgY291bnQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3VudCA8IDAgfHwgY291bnQgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc3RyaW5nLnJlcGVhdCByZXF1aXJlcyBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgY291bnQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICB3aGlsZSAoY291bnQpIHtcbiAgICAgICAgICAgIGlmIChjb3VudCAlIDIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gdGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb3VudCA+IDEpIHtcbiAgICAgICAgICAgICAgICB0ZXh0ICs9IHRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb3VudCA+Pj0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgc3RhcnRzV2l0aCA9IGZ1bmN0aW9uIHN0YXJ0c1dpdGgodGV4dCwgc2VhcmNoLCBwb3NpdGlvbiA9IDApIHtcbiAgICAgICAgc2VhcmNoID0gU3RyaW5nKHNlYXJjaCk7XG4gICAgICAgIFt0ZXh0LCBzZWFyY2gsIHBvc2l0aW9uXSA9IG5vcm1hbGl6ZVN1YnN0cmluZ0FyZ3MoJ3N0YXJ0c1dpdGgnLCB0ZXh0LCBzZWFyY2gsIHBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgZW5kID0gcG9zaXRpb24gKyBzZWFyY2gubGVuZ3RoO1xuICAgICAgICBpZiAoZW5kID4gdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dC5zbGljZShwb3NpdGlvbiwgZW5kKSA9PT0gc2VhcmNoO1xuICAgIH07XG59XG5pZiAodHJ1ZSkge1xuICAgIHBhZEVuZCA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUucGFkRW5kKTtcbiAgICBwYWRTdGFydCA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUucGFkU3RhcnQpO1xufVxuZWxzZSB7XG4gICAgcGFkRW5kID0gZnVuY3Rpb24gcGFkRW5kKHRleHQsIG1heExlbmd0aCwgZmlsbFN0cmluZyA9ICcgJykge1xuICAgICAgICBpZiAodGV4dCA9PT0gbnVsbCB8fCB0ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmluZy5yZXBlYXQgcmVxdWlyZXMgYSB2YWxpZCBzdHJpbmcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heExlbmd0aCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdzdHJpbmcucGFkRW5kIHJlcXVpcmVzIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSBjb3VudC4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4TGVuZ3RoID09PSBudWxsIHx8IG1heExlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IG1heExlbmd0aCA8IDApIHtcbiAgICAgICAgICAgIG1heExlbmd0aCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0clRleHQgPSBTdHJpbmcodGV4dCk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmcgPSBtYXhMZW5ndGggLSBzdHJUZXh0Lmxlbmd0aDtcbiAgICAgICAgaWYgKHBhZGRpbmcgPiAwKSB7XG4gICAgICAgICAgICBzdHJUZXh0ICs9XG4gICAgICAgICAgICAgICAgcmVwZWF0KGZpbGxTdHJpbmcsIE1hdGguZmxvb3IocGFkZGluZyAvIGZpbGxTdHJpbmcubGVuZ3RoKSkgK1xuICAgICAgICAgICAgICAgICAgICBmaWxsU3RyaW5nLnNsaWNlKDAsIHBhZGRpbmcgJSBmaWxsU3RyaW5nLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0clRleHQ7XG4gICAgfTtcbiAgICBwYWRTdGFydCA9IGZ1bmN0aW9uIHBhZFN0YXJ0KHRleHQsIG1heExlbmd0aCwgZmlsbFN0cmluZyA9ICcgJykge1xuICAgICAgICBpZiAodGV4dCA9PT0gbnVsbCB8fCB0ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmluZy5yZXBlYXQgcmVxdWlyZXMgYSB2YWxpZCBzdHJpbmcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heExlbmd0aCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdzdHJpbmcucGFkU3RhcnQgcmVxdWlyZXMgYSBub24tbmVnYXRpdmUgZmluaXRlIGNvdW50LicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXhMZW5ndGggPT09IG51bGwgfHwgbWF4TGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbWF4TGVuZ3RoIDwgMCkge1xuICAgICAgICAgICAgbWF4TGVuZ3RoID0gMDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RyVGV4dCA9IFN0cmluZyh0ZXh0KTtcbiAgICAgICAgY29uc3QgcGFkZGluZyA9IG1heExlbmd0aCAtIHN0clRleHQubGVuZ3RoO1xuICAgICAgICBpZiAocGFkZGluZyA+IDApIHtcbiAgICAgICAgICAgIHN0clRleHQgPVxuICAgICAgICAgICAgICAgIHJlcGVhdChmaWxsU3RyaW5nLCBNYXRoLmZsb29yKHBhZGRpbmcgLyBmaWxsU3RyaW5nLmxlbmd0aCkpICtcbiAgICAgICAgICAgICAgICAgICAgZmlsbFN0cmluZy5zbGljZSgwLCBwYWRkaW5nICUgZmlsbFN0cmluZy5sZW5ndGgpICtcbiAgICAgICAgICAgICAgICAgICAgc3RyVGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyVGV4dDtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5nLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9zdHJpbmcubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9zdHJpbmcubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IGhhcywgeyBhZGQgfSBmcm9tICcuLi8uLi9oYXMvaGFzJztcbmltcG9ydCBnbG9iYWwgZnJvbSAnLi4vZ2xvYmFsJztcbmV4cG9ydCBkZWZhdWx0IGhhcztcbmV4cG9ydCAqIGZyb20gJy4uLy4uL2hhcy9oYXMnO1xuLyogRUNNQVNjcmlwdCA2IGFuZCA3IEZlYXR1cmVzICovXG4vKiBBcnJheSAqL1xuYWRkKCdlczYtYXJyYXknLCAoKSA9PiB7XG4gICAgcmV0dXJuIChbJ2Zyb20nLCAnb2YnXS5ldmVyeSgoa2V5KSA9PiBrZXkgaW4gZ2xvYmFsLkFycmF5KSAmJlxuICAgICAgICBbJ2ZpbmRJbmRleCcsICdmaW5kJywgJ2NvcHlXaXRoaW4nXS5ldmVyeSgoa2V5KSA9PiBrZXkgaW4gZ2xvYmFsLkFycmF5LnByb3RvdHlwZSkpO1xufSwgdHJ1ZSk7XG5hZGQoJ2VzNi1hcnJheS1maWxsJywgKCkgPT4ge1xuICAgIGlmICgnZmlsbCcgaW4gZ2xvYmFsLkFycmF5LnByb3RvdHlwZSkge1xuICAgICAgICAvKiBTb21lIHZlcnNpb25zIG9mIFNhZmFyaSBkbyBub3QgcHJvcGVybHkgaW1wbGVtZW50IHRoaXMgKi9cbiAgICAgICAgcmV0dXJuIFsxXS5maWxsKDksIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSlbMF0gPT09IDE7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn0sIHRydWUpO1xuYWRkKCdlczctYXJyYXknLCAoKSA9PiAnaW5jbHVkZXMnIGluIGdsb2JhbC5BcnJheS5wcm90b3R5cGUsIHRydWUpO1xuLyogTWFwICovXG5hZGQoJ2VzNi1tYXAnLCAoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBnbG9iYWwuTWFwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8qXG4gICAgSUUxMSBhbmQgb2xkZXIgdmVyc2lvbnMgb2YgU2FmYXJpIGFyZSBtaXNzaW5nIGNyaXRpY2FsIEVTNiBNYXAgZnVuY3Rpb25hbGl0eVxuICAgIFdlIHdyYXAgdGhpcyBpbiBhIHRyeS9jYXRjaCBiZWNhdXNlIHNvbWV0aW1lcyB0aGUgTWFwIGNvbnN0cnVjdG9yIGV4aXN0cywgYnV0IGRvZXMgbm90XG4gICAgdGFrZSBhcmd1bWVudHMgKGlPUyA4LjQpXG4gICAgICovXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtYXAgPSBuZXcgZ2xvYmFsLk1hcChbWzAsIDFdXSk7XG4gICAgICAgICAgICByZXR1cm4gbWFwLmhhcygwKSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBtYXAua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICAgICAgICAgIHRydWUgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgbWFwLnZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBtYXAuZW50cmllcyA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IG5vdCB0ZXN0aW5nIG9uIGlPUyBhdCB0aGUgbW9tZW50ICovXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufSwgdHJ1ZSk7XG4vKiBNYXRoICovXG5hZGQoJ2VzNi1tYXRoJywgKCkgPT4ge1xuICAgIHJldHVybiBbXG4gICAgICAgICdjbHozMicsXG4gICAgICAgICdzaWduJyxcbiAgICAgICAgJ2xvZzEwJyxcbiAgICAgICAgJ2xvZzInLFxuICAgICAgICAnbG9nMXAnLFxuICAgICAgICAnZXhwbTEnLFxuICAgICAgICAnY29zaCcsXG4gICAgICAgICdzaW5oJyxcbiAgICAgICAgJ3RhbmgnLFxuICAgICAgICAnYWNvc2gnLFxuICAgICAgICAnYXNpbmgnLFxuICAgICAgICAnYXRhbmgnLFxuICAgICAgICAndHJ1bmMnLFxuICAgICAgICAnZnJvdW5kJyxcbiAgICAgICAgJ2NicnQnLFxuICAgICAgICAnaHlwb3QnXG4gICAgXS5ldmVyeSgobmFtZSkgPT4gdHlwZW9mIGdsb2JhbC5NYXRoW25hbWVdID09PSAnZnVuY3Rpb24nKTtcbn0sIHRydWUpO1xuYWRkKCdlczYtbWF0aC1pbXVsJywgKCkgPT4ge1xuICAgIGlmICgnaW11bCcgaW4gZ2xvYmFsLk1hdGgpIHtcbiAgICAgICAgLyogU29tZSB2ZXJzaW9ucyBvZiBTYWZhcmkgb24gaW9zIGRvIG5vdCBwcm9wZXJseSBpbXBsZW1lbnQgdGhpcyAqL1xuICAgICAgICByZXR1cm4gTWF0aC5pbXVsKDB4ZmZmZmZmZmYsIDUpID09PSAtNTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufSwgdHJ1ZSk7XG4vKiBPYmplY3QgKi9cbmFkZCgnZXM2LW9iamVjdCcsICgpID0+IHtcbiAgICByZXR1cm4gdHJ1ZSAmJlxuICAgICAgICBbJ2Fzc2lnbicsICdpcycsICdnZXRPd25Qcm9wZXJ0eVN5bWJvbHMnLCAnc2V0UHJvdG90eXBlT2YnXS5ldmVyeSgobmFtZSkgPT4gdHlwZW9mIGdsb2JhbC5PYmplY3RbbmFtZV0gPT09ICdmdW5jdGlvbicpO1xufSwgdHJ1ZSk7XG5hZGQoJ2VzMjAxNy1vYmplY3QnLCAoKSA9PiB7XG4gICAgcmV0dXJuIFsndmFsdWVzJywgJ2VudHJpZXMnLCAnZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyddLmV2ZXJ5KChuYW1lKSA9PiB0eXBlb2YgZ2xvYmFsLk9iamVjdFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJyk7XG59LCB0cnVlKTtcbi8qIE9ic2VydmFibGUgKi9cbmFkZCgnZXMtb2JzZXJ2YWJsZScsICgpID0+IHR5cGVvZiBnbG9iYWwuT2JzZXJ2YWJsZSAhPT0gJ3VuZGVmaW5lZCcsIHRydWUpO1xuLyogUHJvbWlzZSAqL1xuYWRkKCdlczYtcHJvbWlzZScsICgpID0+IHR5cGVvZiBnbG9iYWwuUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHJ1ZSwgdHJ1ZSk7XG4vKiBTZXQgKi9cbmFkZCgnZXM2LXNldCcsICgpID0+IHtcbiAgICBpZiAodHlwZW9mIGdsb2JhbC5TZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLyogSUUxMSBhbmQgb2xkZXIgdmVyc2lvbnMgb2YgU2FmYXJpIGFyZSBtaXNzaW5nIGNyaXRpY2FsIEVTNiBTZXQgZnVuY3Rpb25hbGl0eSAqL1xuICAgICAgICBjb25zdCBzZXQgPSBuZXcgZ2xvYmFsLlNldChbMV0pO1xuICAgICAgICByZXR1cm4gc2V0LmhhcygxKSAmJiAna2V5cycgaW4gc2V0ICYmIHR5cGVvZiBzZXQua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59LCB0cnVlKTtcbi8qIFN0cmluZyAqL1xuYWRkKCdlczYtc3RyaW5nJywgKCkgPT4ge1xuICAgIHJldHVybiAoW1xuICAgICAgICAvKiBzdGF0aWMgbWV0aG9kcyAqL1xuICAgICAgICAnZnJvbUNvZGVQb2ludCdcbiAgICBdLmV2ZXJ5KChrZXkpID0+IHR5cGVvZiBnbG9iYWwuU3RyaW5nW2tleV0gPT09ICdmdW5jdGlvbicpICYmXG4gICAgICAgIFtcbiAgICAgICAgICAgIC8qIGluc3RhbmNlIG1ldGhvZHMgKi9cbiAgICAgICAgICAgICdjb2RlUG9pbnRBdCcsXG4gICAgICAgICAgICAnbm9ybWFsaXplJyxcbiAgICAgICAgICAgICdyZXBlYXQnLFxuICAgICAgICAgICAgJ3N0YXJ0c1dpdGgnLFxuICAgICAgICAgICAgJ2VuZHNXaXRoJyxcbiAgICAgICAgICAgICdpbmNsdWRlcydcbiAgICAgICAgXS5ldmVyeSgoa2V5KSA9PiB0eXBlb2YgZ2xvYmFsLlN0cmluZy5wcm90b3R5cGVba2V5XSA9PT0gJ2Z1bmN0aW9uJykpO1xufSwgdHJ1ZSk7XG5hZGQoJ2VzNi1zdHJpbmctcmF3JywgKCkgPT4ge1xuICAgIGZ1bmN0aW9uIGdldENhbGxTaXRlKGNhbGxTaXRlLCAuLi5zdWJzdGl0dXRpb25zKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5jYWxsU2l0ZV07XG4gICAgICAgIHJlc3VsdC5yYXcgPSBjYWxsU2l0ZS5yYXc7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGlmICgncmF3JyBpbiBnbG9iYWwuU3RyaW5nKSB7XG4gICAgICAgIGxldCBiID0gMTtcbiAgICAgICAgbGV0IGNhbGxTaXRlID0gZ2V0Q2FsbFNpdGUgYGFcXG4ke2J9YDtcbiAgICAgICAgY2FsbFNpdGUucmF3ID0gWydhXFxcXG4nXTtcbiAgICAgICAgY29uc3Qgc3VwcG9ydHNUcnVuYyA9IGdsb2JhbC5TdHJpbmcucmF3KGNhbGxTaXRlLCA0MikgPT09ICdhOlxcXFxuJztcbiAgICAgICAgcmV0dXJuIHN1cHBvcnRzVHJ1bmM7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn0sIHRydWUpO1xuYWRkKCdlczIwMTctc3RyaW5nJywgKCkgPT4ge1xuICAgIHJldHVybiBbJ3BhZFN0YXJ0JywgJ3BhZEVuZCddLmV2ZXJ5KChrZXkpID0+IHR5cGVvZiBnbG9iYWwuU3RyaW5nLnByb3RvdHlwZVtrZXldID09PSAnZnVuY3Rpb24nKTtcbn0sIHRydWUpO1xuLyogU3ltYm9sICovXG5hZGQoJ2VzNi1zeW1ib2wnLCAoKSA9PiB0eXBlb2YgZ2xvYmFsLlN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIFN5bWJvbCgpID09PSAnc3ltYm9sJywgdHJ1ZSk7XG4vKiBXZWFrTWFwICovXG5hZGQoJ2VzNi13ZWFrbWFwJywgKCkgPT4ge1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsLldlYWtNYXAgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8qIElFMTEgYW5kIG9sZGVyIHZlcnNpb25zIG9mIFNhZmFyaSBhcmUgbWlzc2luZyBjcml0aWNhbCBFUzYgTWFwIGZ1bmN0aW9uYWxpdHkgKi9cbiAgICAgICAgY29uc3Qga2V5MSA9IHt9O1xuICAgICAgICBjb25zdCBrZXkyID0ge307XG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBnbG9iYWwuV2Vha01hcChbW2tleTEsIDFdXSk7XG4gICAgICAgIE9iamVjdC5mcmVlemUoa2V5MSk7XG4gICAgICAgIHJldHVybiBtYXAuZ2V0KGtleTEpID09PSAxICYmIG1hcC5zZXQoa2V5MiwgMikgPT09IG1hcCAmJiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59LCB0cnVlKTtcbi8qIE1pc2NlbGxhbmVvdXMgZmVhdHVyZXMgKi9cbmFkZCgnbWljcm90YXNrcycsICgpID0+IHRydWUgfHwgZmFsc2UgfHwgdHJ1ZSwgdHJ1ZSk7XG5hZGQoJ3Bvc3RtZXNzYWdlJywgKCkgPT4ge1xuICAgIC8vIElmIHdpbmRvdyBpcyB1bmRlZmluZWQsIGFuZCB3ZSBoYXZlIHBvc3RNZXNzYWdlLCBpdCBwcm9iYWJseSBtZWFucyB3ZSdyZSBpbiBhIHdlYiB3b3JrZXIuIFdlYiB3b3JrZXJzIGhhdmVcbiAgICAvLyBwb3N0IG1lc3NhZ2UgYnV0IGl0IGRvZXNuJ3Qgd29yayBob3cgd2UgZXhwZWN0IGl0IHRvLCBzbyBpdCdzIGJlc3QganVzdCB0byBwcmV0ZW5kIGl0IGRvZXNuJ3QgZXhpc3QuXG4gICAgcmV0dXJuIHR5cGVvZiBnbG9iYWwud2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZ2xvYmFsLnBvc3RNZXNzYWdlID09PSAnZnVuY3Rpb24nO1xufSwgdHJ1ZSk7XG5hZGQoJ3JhZicsICgpID0+IHR5cGVvZiBnbG9iYWwucmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nLCB0cnVlKTtcbmFkZCgnc2V0aW1tZWRpYXRlJywgKCkgPT4gdHlwZW9mIGdsb2JhbC5zZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnLCB0cnVlKTtcbi8qIERPTSBGZWF0dXJlcyAqL1xuYWRkKCdkb20tbXV0YXRpb25vYnNlcnZlcicsICgpID0+IHtcbiAgICBpZiAodHJ1ZSAmJiBCb29sZWFuKGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyKSkge1xuICAgICAgICAvLyBJRTExIGhhcyBhbiB1bnJlbGlhYmxlIE11dGF0aW9uT2JzZXJ2ZXIgaW1wbGVtZW50YXRpb24gd2hlcmUgc2V0UHJvcGVydHkoKSBkb2VzIG5vdFxuICAgICAgICAvLyBnZW5lcmF0ZSBhIG11dGF0aW9uIGV2ZW50LCBvYnNlcnZlcnMgY2FuIGNyYXNoLCBhbmQgdGhlIHF1ZXVlIGRvZXMgbm90IGRyYWluXG4gICAgICAgIC8vIHJlbGlhYmx5LiBUaGUgZm9sbG93aW5nIGZlYXR1cmUgdGVzdCB3YXMgYWRhcHRlZCBmcm9tXG4gICAgICAgIC8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3QxMGtvLzRhY2ViOGM3MTY4MWZkYjI3NWUzM2VmZTVlNTc2YjE0XG4gICAgICAgIGNvbnN0IGV4YW1wbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWUgKi9cbiAgICAgICAgY29uc3QgSG9zdE11dGF0aW9uT2JzZXJ2ZXIgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSG9zdE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKCkgeyB9KTtcbiAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShleGFtcGxlLCB7IGF0dHJpYnV0ZXM6IHRydWUgfSk7XG4gICAgICAgIGV4YW1wbGUuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCAnYmxvY2snKTtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4ob2JzZXJ2ZXIudGFrZVJlY29yZHMoKS5sZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59LCB0cnVlKTtcbmFkZCgnZG9tLXdlYmFuaW1hdGlvbicsICgpID0+IHRydWUgJiYgZ2xvYmFsLkFuaW1hdGlvbiAhPT0gdW5kZWZpbmVkICYmIGdsb2JhbC5LZXlmcmFtZUVmZmVjdCAhPT0gdW5kZWZpbmVkLCB0cnVlKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhcy5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vc3VwcG9ydC9oYXMubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9zdXBwb3J0L2hhcy5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4uL2dsb2JhbCc7XG5pbXBvcnQgaGFzIGZyb20gJy4vaGFzJztcbmZ1bmN0aW9uIGV4ZWN1dGVUYXNrKGl0ZW0pIHtcbiAgICBpZiAoaXRlbSAmJiBpdGVtLmlzQWN0aXZlICYmIGl0ZW0uY2FsbGJhY2spIHtcbiAgICAgICAgaXRlbS5jYWxsYmFjaygpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFF1ZXVlSGFuZGxlKGl0ZW0sIGRlc3RydWN0b3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgICAgICBpdGVtLmlzQWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICBpdGVtLmNhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChkZXN0cnVjdG9yKSB7XG4gICAgICAgICAgICAgICAgZGVzdHJ1Y3RvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cbmxldCBjaGVja01pY3JvVGFza1F1ZXVlO1xubGV0IG1pY3JvVGFza3M7XG4vKipcbiAqIFNjaGVkdWxlcyBhIGNhbGxiYWNrIHRvIHRoZSBtYWNyb3Rhc2sgcXVldWUuXG4gKlxuICogQHBhcmFtIGNhbGxiYWNrIHRoZSBmdW5jdGlvbiB0byBiZSBxdWV1ZWQgYW5kIGxhdGVyIGV4ZWN1dGVkLlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggYSBgZGVzdHJveWAgbWV0aG9kIHRoYXQsIHdoZW4gY2FsbGVkLCBwcmV2ZW50cyB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmcm9tIGV4ZWN1dGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IHF1ZXVlVGFzayA9IChmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGRlc3RydWN0b3I7XG4gICAgbGV0IGVucXVldWU7XG4gICAgLy8gU2luY2UgdGhlIElFIGltcGxlbWVudGF0aW9uIG9mIGBzZXRJbW1lZGlhdGVgIGlzIG5vdCBmbGF3bGVzcywgd2Ugd2lsbCB0ZXN0IGZvciBgcG9zdE1lc3NhZ2VgIGZpcnN0LlxuICAgIGlmICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlID0gW107XG4gICAgICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAvLyBDb25maXJtIHRoYXQgdGhlIGV2ZW50IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIGN1cnJlbnQgd2luZG93IGFuZCBieSB0aGlzIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlID09PSBnbG9iYWwgJiYgZXZlbnQuZGF0YSA9PT0gJ2Rvam8tcXVldWUtbWVzc2FnZScpIHtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVUYXNrKHF1ZXVlLnNoaWZ0KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGVucXVldWUgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgcXVldWUucHVzaChpdGVtKTtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZSgnZG9qby1xdWV1ZS1tZXNzYWdlJywgJyonKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZmFsc2UpIHtcbiAgICAgICAgZGVzdHJ1Y3RvciA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gc2V0SW1tZWRpYXRlKGV4ZWN1dGVUYXNrLmJpbmQobnVsbCwgaXRlbSkpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZGVzdHJ1Y3RvciA9IGdsb2JhbC5jbGVhclRpbWVvdXQ7XG4gICAgICAgIGVucXVldWUgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZXhlY3V0ZVRhc2suYmluZChudWxsLCBpdGVtKSwgMCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHF1ZXVlVGFzayhjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBpdGVtID0ge1xuICAgICAgICAgICAgaXNBY3RpdmU6IHRydWUsXG4gICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2tcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaWQgPSBlbnF1ZXVlKGl0ZW0pO1xuICAgICAgICByZXR1cm4gZ2V0UXVldWVIYW5kbGUoaXRlbSwgZGVzdHJ1Y3RvciAmJlxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGRlc3RydWN0b3IoaWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFRPRE86IFVzZSBhc3BlY3QuYmVmb3JlIHdoZW4gaXQgaXMgYXZhaWxhYmxlLlxuICAgIHJldHVybiB0cnVlXG4gICAgICAgID8gcXVldWVUYXNrXG4gICAgICAgIDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjaGVja01pY3JvVGFza1F1ZXVlKCk7XG4gICAgICAgICAgICByZXR1cm4gcXVldWVUYXNrKGNhbGxiYWNrKTtcbiAgICAgICAgfTtcbn0pKCk7XG4vLyBXaGVuIG5vIG1lY2hhbmlzbSBmb3IgcmVnaXN0ZXJpbmcgbWljcm90YXNrcyBpcyBleHBvc2VkIGJ5IHRoZSBlbnZpcm9ubWVudCwgbWljcm90YXNrcyB3aWxsXG4vLyBiZSBxdWV1ZWQgYW5kIHRoZW4gZXhlY3V0ZWQgaW4gYSBzaW5nbGUgbWFjcm90YXNrIGJlZm9yZSB0aGUgb3RoZXIgbWFjcm90YXNrcyBhcmUgZXhlY3V0ZWQuXG5pZiAoIXRydWUpIHtcbiAgICBsZXQgaXNNaWNyb1Rhc2tRdWV1ZWQgPSBmYWxzZTtcbiAgICBtaWNyb1Rhc2tzID0gW107XG4gICAgY2hlY2tNaWNyb1Rhc2tRdWV1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFpc01pY3JvVGFza1F1ZXVlZCkge1xuICAgICAgICAgICAgaXNNaWNyb1Rhc2tRdWV1ZWQgPSB0cnVlO1xuICAgICAgICAgICAgcXVldWVUYXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpc01pY3JvVGFza1F1ZXVlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChtaWNyb1Rhc2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChpdGVtID0gbWljcm9UYXNrcy5zaGlmdCgpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVRhc2soaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59XG4vKipcbiAqIFNjaGVkdWxlcyBhbiBhbmltYXRpb24gdGFzayB3aXRoIGB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lYCBpZiBpdCBleGlzdHMsIG9yIHdpdGggYHF1ZXVlVGFza2Agb3RoZXJ3aXNlLlxuICpcbiAqIFNpbmNlIHJlcXVlc3RBbmltYXRpb25GcmFtZSdzIGJlaGF2aW9yIGRvZXMgbm90IG1hdGNoIHRoYXQgZXhwZWN0ZWQgZnJvbSBgcXVldWVUYXNrYCwgaXQgaXMgbm90IHVzZWQgdGhlcmUuXG4gKiBIb3dldmVyLCBhdCB0aW1lcyBpdCBtYWtlcyBtb3JlIHNlbnNlIHRvIGRlbGVnYXRlIHRvIHJlcXVlc3RBbmltYXRpb25GcmFtZTsgaGVuY2UgdGhlIGZvbGxvd2luZyBtZXRob2QuXG4gKlxuICogQHBhcmFtIGNhbGxiYWNrIHRoZSBmdW5jdGlvbiB0byBiZSBxdWV1ZWQgYW5kIGxhdGVyIGV4ZWN1dGVkLlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggYSBgZGVzdHJveWAgbWV0aG9kIHRoYXQsIHdoZW4gY2FsbGVkLCBwcmV2ZW50cyB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmcm9tIGV4ZWN1dGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IHF1ZXVlQW5pbWF0aW9uVGFzayA9IChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0cnVlKSB7XG4gICAgICAgIHJldHVybiBxdWV1ZVRhc2s7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHF1ZXVlQW5pbWF0aW9uVGFzayhjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBpdGVtID0ge1xuICAgICAgICAgICAgaXNBY3RpdmU6IHRydWUsXG4gICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2tcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZXhlY3V0ZVRhc2suYmluZChudWxsLCBpdGVtKSk7XG4gICAgICAgIHJldHVybiBnZXRRdWV1ZUhhbmRsZShpdGVtLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShyYWZJZCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBUT0RPOiBVc2UgYXNwZWN0LmJlZm9yZSB3aGVuIGl0IGlzIGF2YWlsYWJsZS5cbiAgICByZXR1cm4gdHJ1ZVxuICAgICAgICA/IHF1ZXVlQW5pbWF0aW9uVGFza1xuICAgICAgICA6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgY2hlY2tNaWNyb1Rhc2tRdWV1ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlQW5pbWF0aW9uVGFzayhjYWxsYmFjayk7XG4gICAgICAgIH07XG59KSgpO1xuLyoqXG4gKiBTY2hlZHVsZXMgYSBjYWxsYmFjayB0byB0aGUgbWljcm90YXNrIHF1ZXVlLlxuICpcbiAqIEFueSBjYWxsYmFja3MgcmVnaXN0ZXJlZCB3aXRoIGBxdWV1ZU1pY3JvVGFza2Agd2lsbCBiZSBleGVjdXRlZCBiZWZvcmUgdGhlIG5leHQgbWFjcm90YXNrLiBJZiBubyBuYXRpdmVcbiAqIG1lY2hhbmlzbSBmb3Igc2NoZWR1bGluZyBtYWNyb3Rhc2tzIGlzIGV4cG9zZWQsIHRoZW4gYW55IGNhbGxiYWNrcyB3aWxsIGJlIGZpcmVkIGJlZm9yZSBhbnkgbWFjcm90YXNrXG4gKiByZWdpc3RlcmVkIHdpdGggYHF1ZXVlVGFza2Agb3IgYHF1ZXVlQW5pbWF0aW9uVGFza2AuXG4gKlxuICogQHBhcmFtIGNhbGxiYWNrIHRoZSBmdW5jdGlvbiB0byBiZSBxdWV1ZWQgYW5kIGxhdGVyIGV4ZWN1dGVkLlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggYSBgZGVzdHJveWAgbWV0aG9kIHRoYXQsIHdoZW4gY2FsbGVkLCBwcmV2ZW50cyB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmcm9tIGV4ZWN1dGluZy5cbiAqL1xuZXhwb3J0IGxldCBxdWV1ZU1pY3JvVGFzayA9IChmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGVucXVldWU7XG4gICAgaWYgKGZhbHNlKSB7XG4gICAgICAgIGVucXVldWUgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgZ2xvYmFsLnByb2Nlc3MubmV4dFRpY2soZXhlY3V0ZVRhc2suYmluZChudWxsLCBpdGVtKSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKHRydWUpIHtcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICBnbG9iYWwuUHJvbWlzZS5yZXNvbHZlKGl0ZW0pLnRoZW4oZXhlY3V0ZVRhc2spO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIGlmICh0cnVlKSB7XG4gICAgICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lICovXG4gICAgICAgIGNvbnN0IEhvc3RNdXRhdGlvbk9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgY29uc3QgcXVldWUgPSBbXTtcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSG9zdE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gcXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLmlzQWN0aXZlICYmIGl0ZW0uY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5jYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG9ic2VydmVyLm9ic2VydmUobm9kZSwgeyBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuICAgICAgICBlbnF1ZXVlID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2goaXRlbSk7XG4gICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgncXVldWVTdGF0dXMnLCAnMScpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICBjaGVja01pY3JvVGFza1F1ZXVlKCk7XG4gICAgICAgICAgICBtaWNyb1Rhc2tzLnB1c2goaXRlbSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHtcbiAgICAgICAgICAgIGlzQWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrXG4gICAgICAgIH07XG4gICAgICAgIGVucXVldWUoaXRlbSk7XG4gICAgICAgIHJldHVybiBnZXRRdWV1ZUhhbmRsZShpdGVtKTtcbiAgICB9O1xufSkoKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXF1ZXVlLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9zdXBwb3J0L3F1ZXVlLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vc3VwcG9ydC9xdWV1ZS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCIvKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBnZW5lcmF0ZSBhIHZhbHVlIHByb3BlcnR5IGRlc2NyaXB0b3JcbiAqXG4gKiBAcGFyYW0gdmFsdWUgICAgICAgIFRoZSB2YWx1ZSB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciBzaG91bGQgYmUgc2V0IHRvXG4gKiBAcGFyYW0gZW51bWVyYWJsZSAgIElmIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgZW51bWJlcmFibGUsIGRlZmF1bHRzIHRvIGZhbHNlXG4gKiBAcGFyYW0gd3JpdGFibGUgICAgIElmIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgd3JpdGFibGUsIGRlZmF1bHRzIHRvIHRydWVcbiAqIEBwYXJhbSBjb25maWd1cmFibGUgSWYgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBjb25maWd1cmFibGUsIGRlZmF1bHRzIHRvIHRydWVcbiAqIEByZXR1cm4gICAgICAgICAgICAgVGhlIHByb3BlcnR5IGRlc2NyaXB0b3Igb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZURlc2NyaXB0b3IodmFsdWUsIGVudW1lcmFibGUgPSBmYWxzZSwgd3JpdGFibGUgPSB0cnVlLCBjb25maWd1cmFibGUgPSB0cnVlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBlbnVtZXJhYmxlOiBlbnVtZXJhYmxlLFxuICAgICAgICB3cml0YWJsZTogd3JpdGFibGUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogY29uZmlndXJhYmxlXG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3cmFwTmF0aXZlKG5hdGl2ZUZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZUZ1bmN0aW9uLmFwcGx5KHRhcmdldCwgYXJncyk7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWwubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL3N1cHBvcnQvdXRpbC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL3N1cHBvcnQvdXRpbC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgeyBFdmVudGVkIH0gZnJvbSAnLi4vY29yZS9FdmVudGVkJztcbmV4cG9ydCBjbGFzcyBJbmplY3RvciBleHRlbmRzIEV2ZW50ZWQge1xuICAgIGNvbnN0cnVjdG9yKHBheWxvYWQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fcGF5bG9hZCA9IHBheWxvYWQ7XG4gICAgfVxuICAgIHNldEludmFsaWRhdG9yKGludmFsaWRhdG9yKSB7XG4gICAgICAgIHRoaXMuX2ludmFsaWRhdG9yID0gaW52YWxpZGF0b3I7XG4gICAgfVxuICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BheWxvYWQ7XG4gICAgfVxuICAgIHNldChwYXlsb2FkKSB7XG4gICAgICAgIHRoaXMuX3BheWxvYWQgPSBwYXlsb2FkO1xuICAgICAgICBpZiAodGhpcy5faW52YWxpZGF0b3IpIHtcbiAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdG9yKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBJbmplY3Rvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUluamVjdG9yLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvSW5qZWN0b3IubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvSW5qZWN0b3IubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IHsgRXZlbnRlZCB9IGZyb20gJy4uL2NvcmUvRXZlbnRlZCc7XG5pbXBvcnQgTWFwIGZyb20gJy4uL3NoaW0vTWFwJztcbi8qKlxuICogRW51bSB0byBpZGVudGlmeSB0aGUgdHlwZSBvZiBldmVudC5cbiAqIExpc3RlbmluZyB0byAnUHJvamVjdG9yJyB3aWxsIG5vdGlmeSB3aGVuIHByb2plY3RvciBpcyBjcmVhdGVkIG9yIHVwZGF0ZWRcbiAqIExpc3RlbmluZyB0byAnV2lkZ2V0JyB3aWxsIG5vdGlmeSB3aGVuIHdpZGdldCByb290IGlzIGNyZWF0ZWQgb3IgdXBkYXRlZFxuICovXG5leHBvcnQgdmFyIE5vZGVFdmVudFR5cGU7XG4oZnVuY3Rpb24gKE5vZGVFdmVudFR5cGUpIHtcbiAgICBOb2RlRXZlbnRUeXBlW1wiUHJvamVjdG9yXCJdID0gXCJQcm9qZWN0b3JcIjtcbiAgICBOb2RlRXZlbnRUeXBlW1wiV2lkZ2V0XCJdID0gXCJXaWRnZXRcIjtcbn0pKE5vZGVFdmVudFR5cGUgfHwgKE5vZGVFdmVudFR5cGUgPSB7fSkpO1xuZXhwb3J0IGNsYXNzIE5vZGVIYW5kbGVyIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX25vZGVNYXAgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIGdldChrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vZGVNYXAuZ2V0KGtleSk7XG4gICAgfVxuICAgIGhhcyhrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vZGVNYXAuaGFzKGtleSk7XG4gICAgfVxuICAgIGFkZChlbGVtZW50LCBrZXkpIHtcbiAgICAgICAgdGhpcy5fbm9kZU1hcC5zZXQoa2V5LCBlbGVtZW50KTtcbiAgICAgICAgdGhpcy5lbWl0KHsgdHlwZToga2V5IH0pO1xuICAgIH1cbiAgICBhZGRSb290KCkge1xuICAgICAgICB0aGlzLmVtaXQoeyB0eXBlOiBOb2RlRXZlbnRUeXBlLldpZGdldCB9KTtcbiAgICB9XG4gICAgYWRkUHJvamVjdG9yKCkge1xuICAgICAgICB0aGlzLmVtaXQoeyB0eXBlOiBOb2RlRXZlbnRUeXBlLlByb2plY3RvciB9KTtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX25vZGVNYXAuY2xlYXIoKTtcbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBOb2RlSGFuZGxlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vZGVIYW5kbGVyLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvTm9kZUhhbmRsZXIubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvTm9kZUhhbmRsZXIubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IFByb21pc2UgZnJvbSAnLi4vc2hpbS9Qcm9taXNlJztcbmltcG9ydCBNYXAgZnJvbSAnLi4vc2hpbS9NYXAnO1xuaW1wb3J0IFN5bWJvbCBmcm9tICcuLi9zaGltL1N5bWJvbCc7XG5pbXBvcnQgeyBFdmVudGVkIH0gZnJvbSAnLi4vY29yZS9FdmVudGVkJztcbi8qKlxuICogV2lkZ2V0IGJhc2Ugc3ltYm9sIHR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IFdJREdFVF9CQVNFX1RZUEUgPSBTeW1ib2woJ1dpZGdldCBCYXNlJyk7XG4vKipcbiAqIENoZWNrcyBpcyB0aGUgaXRlbSBpcyBhIHN1YmNsYXNzIG9mIFdpZGdldEJhc2UgKG9yIGEgV2lkZ2V0QmFzZSlcbiAqXG4gKiBAcGFyYW0gaXRlbSB0aGUgaXRlbSB0byBjaGVja1xuICogQHJldHVybnMgdHJ1ZS9mYWxzZSBpbmRpY2F0aW5nIGlmIHRoZSBpdGVtIGlzIGEgV2lkZ2V0QmFzZUNvbnN0cnVjdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1dpZGdldEJhc2VDb25zdHJ1Y3RvcihpdGVtKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oaXRlbSAmJiBpdGVtLl90eXBlID09PSBXSURHRVRfQkFTRV9UWVBFKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1dpZGdldENvbnN0cnVjdG9yRGVmYXVsdEV4cG9ydChpdGVtKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oaXRlbSAmJlxuICAgICAgICBpdGVtLmhhc093blByb3BlcnR5KCdfX2VzTW9kdWxlJykgJiZcbiAgICAgICAgaXRlbS5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdCcpICYmXG4gICAgICAgIGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yKGl0ZW0uZGVmYXVsdCkpO1xufVxuLyoqXG4gKiBUaGUgUmVnaXN0cnkgaW1wbGVtZW50YXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lzdHJ5IGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgLyoqXG4gICAgICogRW1pdCBsb2FkZWQgZXZlbnQgZm9yIHJlZ2lzdHJ5IGxhYmVsXG4gICAgICovXG4gICAgZW1pdExvYWRlZEV2ZW50KHdpZGdldExhYmVsLCBpdGVtKSB7XG4gICAgICAgIHRoaXMuZW1pdCh7XG4gICAgICAgICAgICB0eXBlOiB3aWRnZXRMYWJlbCxcbiAgICAgICAgICAgIGFjdGlvbjogJ2xvYWRlZCcsXG4gICAgICAgICAgICBpdGVtXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkZWZpbmUobGFiZWwsIGl0ZW0pIHtcbiAgICAgICAgaWYgKHRoaXMuX3dpZGdldFJlZ2lzdHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dpZGdldFJlZ2lzdHJ5ID0gbmV3IE1hcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl93aWRnZXRSZWdpc3RyeS5oYXMobGFiZWwpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHdpZGdldCBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgZm9yICcke2xhYmVsLnRvU3RyaW5nKCl9J2ApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dpZGdldFJlZ2lzdHJ5LnNldChsYWJlbCwgaXRlbSk7XG4gICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgaXRlbS50aGVuKCh3aWRnZXRDdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2lkZ2V0UmVnaXN0cnkuc2V0KGxhYmVsLCB3aWRnZXRDdG9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRMb2FkZWRFdmVudChsYWJlbCwgd2lkZ2V0Q3Rvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpZGdldEN0b3I7XG4gICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yKGl0ZW0pKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXRMb2FkZWRFdmVudChsYWJlbCwgaXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVmaW5lSW5qZWN0b3IobGFiZWwsIGluamVjdG9yRmFjdG9yeSkge1xuICAgICAgICBpZiAodGhpcy5faW5qZWN0b3JSZWdpc3RyeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9pbmplY3RvclJlZ2lzdHJ5ID0gbmV3IE1hcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9pbmplY3RvclJlZ2lzdHJ5LmhhcyhsYWJlbCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW5qZWN0b3IgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIGZvciAnJHtsYWJlbC50b1N0cmluZygpfSdgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnZhbGlkYXRvciA9IG5ldyBFdmVudGVkKCk7XG4gICAgICAgIGNvbnN0IGluamVjdG9ySXRlbSA9IHtcbiAgICAgICAgICAgIGluamVjdG9yOiBpbmplY3RvckZhY3RvcnkoKCkgPT4gaW52YWxpZGF0b3IuZW1pdCh7IHR5cGU6ICdpbnZhbGlkYXRlJyB9KSksXG4gICAgICAgICAgICBpbnZhbGlkYXRvclxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9pbmplY3RvclJlZ2lzdHJ5LnNldChsYWJlbCwgaW5qZWN0b3JJdGVtKTtcbiAgICAgICAgdGhpcy5lbWl0TG9hZGVkRXZlbnQobGFiZWwsIGluamVjdG9ySXRlbSk7XG4gICAgfVxuICAgIGdldChsYWJlbCkge1xuICAgICAgICBpZiAoIXRoaXMuX3dpZGdldFJlZ2lzdHJ5IHx8ICF0aGlzLmhhcyhsYWJlbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl93aWRnZXRSZWdpc3RyeS5nZXQobGFiZWwpO1xuICAgICAgICBpZiAoaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IoaXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IGl0ZW0oKTtcbiAgICAgICAgdGhpcy5fd2lkZ2V0UmVnaXN0cnkuc2V0KGxhYmVsLCBwcm9taXNlKTtcbiAgICAgICAgcHJvbWlzZS50aGVuKCh3aWRnZXRDdG9yKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNXaWRnZXRDb25zdHJ1Y3RvckRlZmF1bHRFeHBvcnQod2lkZ2V0Q3RvcikpIHtcbiAgICAgICAgICAgICAgICB3aWRnZXRDdG9yID0gd2lkZ2V0Q3Rvci5kZWZhdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fd2lkZ2V0UmVnaXN0cnkuc2V0KGxhYmVsLCB3aWRnZXRDdG9yKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdExvYWRlZEV2ZW50KGxhYmVsLCB3aWRnZXRDdG9yKTtcbiAgICAgICAgICAgIHJldHVybiB3aWRnZXRDdG9yO1xuICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGdldEluamVjdG9yKGxhYmVsKSB7XG4gICAgICAgIGlmICghdGhpcy5faW5qZWN0b3JSZWdpc3RyeSB8fCAhdGhpcy5oYXNJbmplY3RvcihsYWJlbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pbmplY3RvclJlZ2lzdHJ5LmdldChsYWJlbCk7XG4gICAgfVxuICAgIGhhcyhsYWJlbCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLl93aWRnZXRSZWdpc3RyeSAmJiB0aGlzLl93aWRnZXRSZWdpc3RyeS5oYXMobGFiZWwpKTtcbiAgICB9XG4gICAgaGFzSW5qZWN0b3IobGFiZWwpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5faW5qZWN0b3JSZWdpc3RyeSAmJiB0aGlzLl9pbmplY3RvclJlZ2lzdHJ5LmhhcyhsYWJlbCkpO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IFJlZ2lzdHJ5O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVnaXN0cnkubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9SZWdpc3RyeS5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9SZWdpc3RyeS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgeyBNYXAgfSBmcm9tICcuLi9zaGltL01hcCc7XG5pbXBvcnQgeyBFdmVudGVkIH0gZnJvbSAnLi4vY29yZS9FdmVudGVkJztcbmltcG9ydCB7IFJlZ2lzdHJ5IH0gZnJvbSAnLi9SZWdpc3RyeSc7XG5leHBvcnQgY2xhc3MgUmVnaXN0cnlIYW5kbGVyIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX3JlZ2lzdHJ5ID0gbmV3IFJlZ2lzdHJ5KCk7XG4gICAgICAgIHRoaXMuX3JlZ2lzdHJ5V2lkZ2V0TGFiZWxNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX3JlZ2lzdHJ5SW5qZWN0b3JMYWJlbE1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5vd24odGhpcy5fcmVnaXN0cnkpO1xuICAgICAgICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuYmFzZVJlZ2lzdHJ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnlXaWRnZXRMYWJlbE1hcC5kZWxldGUodGhpcy5iYXNlUmVnaXN0cnkpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5SW5qZWN0b3JMYWJlbE1hcC5kZWxldGUodGhpcy5iYXNlUmVnaXN0cnkpO1xuICAgICAgICAgICAgICAgIHRoaXMuYmFzZVJlZ2lzdHJ5ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm93bih7IGRlc3Ryb3kgfSk7XG4gICAgfVxuICAgIHNldCBiYXNlKGJhc2VSZWdpc3RyeSkge1xuICAgICAgICBpZiAodGhpcy5iYXNlUmVnaXN0cnkpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5V2lkZ2V0TGFiZWxNYXAuZGVsZXRlKHRoaXMuYmFzZVJlZ2lzdHJ5KTtcbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5SW5qZWN0b3JMYWJlbE1hcC5kZWxldGUodGhpcy5iYXNlUmVnaXN0cnkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmFzZVJlZ2lzdHJ5ID0gYmFzZVJlZ2lzdHJ5O1xuICAgIH1cbiAgICBkZWZpbmUobGFiZWwsIHdpZGdldCkge1xuICAgICAgICB0aGlzLl9yZWdpc3RyeS5kZWZpbmUobGFiZWwsIHdpZGdldCk7XG4gICAgfVxuICAgIGRlZmluZUluamVjdG9yKGxhYmVsLCBpbmplY3Rvcikge1xuICAgICAgICB0aGlzLl9yZWdpc3RyeS5kZWZpbmVJbmplY3RvcihsYWJlbCwgaW5qZWN0b3IpO1xuICAgIH1cbiAgICBoYXMobGFiZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZ2lzdHJ5LmhhcyhsYWJlbCkgfHwgQm9vbGVhbih0aGlzLmJhc2VSZWdpc3RyeSAmJiB0aGlzLmJhc2VSZWdpc3RyeS5oYXMobGFiZWwpKTtcbiAgICB9XG4gICAgaGFzSW5qZWN0b3IobGFiZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZ2lzdHJ5Lmhhc0luamVjdG9yKGxhYmVsKSB8fCBCb29sZWFuKHRoaXMuYmFzZVJlZ2lzdHJ5ICYmIHRoaXMuYmFzZVJlZ2lzdHJ5Lmhhc0luamVjdG9yKGxhYmVsKSk7XG4gICAgfVxuICAgIGdldChsYWJlbCwgZ2xvYmFsUHJlY2VkZW5jZSA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXQobGFiZWwsIGdsb2JhbFByZWNlZGVuY2UsICdnZXQnLCB0aGlzLl9yZWdpc3RyeVdpZGdldExhYmVsTWFwKTtcbiAgICB9XG4gICAgZ2V0SW5qZWN0b3IobGFiZWwsIGdsb2JhbFByZWNlZGVuY2UgPSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0KGxhYmVsLCBnbG9iYWxQcmVjZWRlbmNlLCAnZ2V0SW5qZWN0b3InLCB0aGlzLl9yZWdpc3RyeUluamVjdG9yTGFiZWxNYXApO1xuICAgIH1cbiAgICBfZ2V0KGxhYmVsLCBnbG9iYWxQcmVjZWRlbmNlLCBnZXRGdW5jdGlvbk5hbWUsIGxhYmVsTWFwKSB7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJpZXMgPSBnbG9iYWxQcmVjZWRlbmNlID8gW3RoaXMuYmFzZVJlZ2lzdHJ5LCB0aGlzLl9yZWdpc3RyeV0gOiBbdGhpcy5fcmVnaXN0cnksIHRoaXMuYmFzZVJlZ2lzdHJ5XTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWdpc3RyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByZWdpc3RyeSA9IHJlZ2lzdHJpZXNbaV07XG4gICAgICAgICAgICBpZiAoIXJlZ2lzdHJ5KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gcmVnaXN0cnlbZ2V0RnVuY3Rpb25OYW1lXShsYWJlbCk7XG4gICAgICAgICAgICBjb25zdCByZWdpc3RlcmVkTGFiZWxzID0gbGFiZWxNYXAuZ2V0KHJlZ2lzdHJ5KSB8fCBbXTtcbiAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZWdpc3RlcmVkTGFiZWxzLmluZGV4T2YobGFiZWwpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHJlZ2lzdHJ5Lm9uKGxhYmVsLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmFjdGlvbiA9PT0gJ2xvYWRlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbZ2V0RnVuY3Rpb25OYW1lXShsYWJlbCwgZ2xvYmFsUHJlY2VkZW5jZSkgPT09IGV2ZW50Lml0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCh7IHR5cGU6ICdpbnZhbGlkYXRlJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMub3duKGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgbGFiZWxNYXAuc2V0KHJlZ2lzdHJ5LCBbLi4ucmVnaXN0ZXJlZExhYmVscywgbGFiZWxdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBSZWdpc3RyeUhhbmRsZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWdpc3RyeUhhbmRsZXIubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9SZWdpc3RyeUhhbmRsZXIubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvUmVnaXN0cnlIYW5kbGVyLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBNYXAgZnJvbSAnLi4vc2hpbS9NYXAnO1xuaW1wb3J0IFdlYWtNYXAgZnJvbSAnLi4vc2hpbS9XZWFrTWFwJztcbmltcG9ydCBTeW1ib2wgZnJvbSAnLi4vc2hpbS9TeW1ib2wnO1xuaW1wb3J0IHsgdiB9IGZyb20gJy4vZCc7XG5pbXBvcnQgeyBhdXRvIH0gZnJvbSAnLi9kaWZmJztcbmltcG9ydCBSZWdpc3RyeUhhbmRsZXIgZnJvbSAnLi9SZWdpc3RyeUhhbmRsZXInO1xuaW1wb3J0IE5vZGVIYW5kbGVyIGZyb20gJy4vTm9kZUhhbmRsZXInO1xuaW1wb3J0IHsgd2lkZ2V0SW5zdGFuY2VNYXAgfSBmcm9tICcuL3Zkb20nO1xuaW1wb3J0IHsgaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IsIFdJREdFVF9CQVNFX1RZUEUgfSBmcm9tICcuL1JlZ2lzdHJ5JztcbmNvbnN0IGRlY29yYXRvck1hcCA9IG5ldyBNYXAoKTtcbmNvbnN0IGJvdW5kQXV0byA9IGF1dG8uYmluZChudWxsKTtcbmV4cG9ydCBjb25zdCBub0JpbmQgPSBTeW1ib2wuZm9yKCdkb2pvTm9CaW5kJyk7XG4vKipcbiAqIE1haW4gd2lkZ2V0IGJhc2UgZm9yIGFsbCB3aWRnZXRzIHRvIGV4dGVuZFxuICovXG5leHBvcnQgY2xhc3MgV2lkZ2V0QmFzZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgaXQgaXMgdGhlIGluaXRpYWwgc2V0IHByb3BlcnRpZXMgY3ljbGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2luaXRpYWxQcm9wZXJ0aWVzID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFycmF5IG9mIHByb3BlcnR5IGtleXMgY29uc2lkZXJlZCBjaGFuZ2VkIGZyb20gdGhlIHByZXZpb3VzIHNldCBwcm9wZXJ0aWVzXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9jaGFuZ2VkUHJvcGVydHlLZXlzID0gW107XG4gICAgICAgIHRoaXMuX25vZGVIYW5kbGVyID0gbmV3IE5vZGVIYW5kbGVyKCk7XG4gICAgICAgIHRoaXMuX2hhbmRsZXMgPSBbXTtcbiAgICAgICAgdGhpcy5fY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgdGhpcy5fZGVjb3JhdG9yQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgdGhpcy5fYm91bmRSZW5kZXJGdW5jID0gdGhpcy5yZW5kZXIuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5fYm91bmRJbnZhbGlkYXRlID0gdGhpcy5pbnZhbGlkYXRlLmJpbmQodGhpcyk7XG4gICAgICAgIHdpZGdldEluc3RhbmNlTWFwLnNldCh0aGlzLCB7XG4gICAgICAgICAgICBkaXJ0eTogdHJ1ZSxcbiAgICAgICAgICAgIG9uQXR0YWNoOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkF0dGFjaCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uRGV0YWNoOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkRldGFjaCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5vZGVIYW5kbGVyOiB0aGlzLl9ub2RlSGFuZGxlcixcbiAgICAgICAgICAgIHJlZ2lzdHJ5OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0cnk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29yZVByb3BlcnRpZXM6IHt9LFxuICAgICAgICAgICAgcmVuZGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGlucHV0UHJvcGVydGllczoge31cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3J1bkFmdGVyQ29uc3RydWN0b3JzKCk7XG4gICAgfVxuICAgIG1ldGEoTWV0YVR5cGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX21ldGFNYXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fbWV0YU1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2FjaGVkID0gdGhpcy5fbWV0YU1hcC5nZXQoTWV0YVR5cGUpO1xuICAgICAgICBpZiAoIWNhY2hlZCkge1xuICAgICAgICAgICAgY2FjaGVkID0gbmV3IE1ldGFUeXBlKHtcbiAgICAgICAgICAgICAgICBpbnZhbGlkYXRlOiB0aGlzLl9ib3VuZEludmFsaWRhdGUsXG4gICAgICAgICAgICAgICAgbm9kZUhhbmRsZXI6IHRoaXMuX25vZGVIYW5kbGVyLFxuICAgICAgICAgICAgICAgIGJpbmQ6IHRoaXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5vd24oY2FjaGVkKTtcbiAgICAgICAgICAgIHRoaXMuX21ldGFNYXAuc2V0KE1ldGFUeXBlLCBjYWNoZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIG9uQXR0YWNoKCkge1xuICAgICAgICAvLyBEbyBub3RoaW5nIGJ5IGRlZmF1bHQuXG4gICAgfVxuICAgIG9uRGV0YWNoKCkge1xuICAgICAgICAvLyBEbyBub3RoaW5nIGJ5IGRlZmF1bHQuXG4gICAgfVxuICAgIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvcGVydGllcztcbiAgICB9XG4gICAgZ2V0IGNoYW5nZWRQcm9wZXJ0eUtleXMoKSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy5fY2hhbmdlZFByb3BlcnR5S2V5c107XG4gICAgfVxuICAgIF9fc2V0Q29yZVByb3BlcnRpZXNfXyhjb3JlUHJvcGVydGllcykge1xuICAgICAgICBjb25zdCB7IGJhc2VSZWdpc3RyeSB9ID0gY29yZVByb3BlcnRpZXM7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldCh0aGlzKTtcbiAgICAgICAgaWYgKGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcy5iYXNlUmVnaXN0cnkgIT09IGJhc2VSZWdpc3RyeSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JlZ2lzdHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RyeSA9IG5ldyBSZWdpc3RyeUhhbmRsZXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeSk7XG4gICAgICAgICAgICAgICAgdGhpcy5vd24odGhpcy5fcmVnaXN0cnkub24oJ2ludmFsaWRhdGUnLCB0aGlzLl9ib3VuZEludmFsaWRhdGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5LmJhc2UgPSBiYXNlUmVnaXN0cnk7XG4gICAgICAgICAgICB0aGlzLmludmFsaWRhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZURhdGEuY29yZVByb3BlcnRpZXMgPSBjb3JlUHJvcGVydGllcztcbiAgICB9XG4gICAgX19zZXRQcm9wZXJ0aWVzX18ob3JpZ2luYWxQcm9wZXJ0aWVzKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldCh0aGlzKTtcbiAgICAgICAgaW5zdGFuY2VEYXRhLmlucHV0UHJvcGVydGllcyA9IG9yaWdpbmFsUHJvcGVydGllcztcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMuX3J1bkJlZm9yZVByb3BlcnRpZXMob3JpZ2luYWxQcm9wZXJ0aWVzKTtcbiAgICAgICAgY29uc3QgcmVnaXN0ZXJlZERpZmZQcm9wZXJ0eU5hbWVzID0gdGhpcy5nZXREZWNvcmF0b3IoJ3JlZ2lzdGVyZWREaWZmUHJvcGVydHknKTtcbiAgICAgICAgY29uc3QgY2hhbmdlZFByb3BlcnR5S2V5cyA9IFtdO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWVzID0gT2JqZWN0LmtleXMocHJvcGVydGllcyk7XG4gICAgICAgIGlmICh0aGlzLl9pbml0aWFsUHJvcGVydGllcyA9PT0gZmFsc2UgfHwgcmVnaXN0ZXJlZERpZmZQcm9wZXJ0eU5hbWVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgY29uc3QgYWxsUHJvcGVydGllcyA9IFsuLi5wcm9wZXJ0eU5hbWVzLCAuLi5PYmplY3Qua2V5cyh0aGlzLl9wcm9wZXJ0aWVzKV07XG4gICAgICAgICAgICBjb25zdCBjaGVja2VkUHJvcGVydGllcyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgZGlmZlByb3BlcnR5UmVzdWx0cyA9IHt9O1xuICAgICAgICAgICAgbGV0IHJ1blJlYWN0aW9ucyA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gYWxsUHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZFByb3BlcnRpZXMuaW5kZXhPZihwcm9wZXJ0eU5hbWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hlY2tlZFByb3BlcnRpZXMucHVzaChwcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzUHJvcGVydHkgPSB0aGlzLl9wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3UHJvcGVydHkgPSB0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eShwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0sIGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcy5iaW5kKTtcbiAgICAgICAgICAgICAgICBpZiAocmVnaXN0ZXJlZERpZmZQcm9wZXJ0eU5hbWVzLmluZGV4T2YocHJvcGVydHlOYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVuUmVhY3Rpb25zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlmZkZ1bmN0aW9ucyA9IHRoaXMuZ2V0RGVjb3JhdG9yKGBkaWZmUHJvcGVydHk6JHtwcm9wZXJ0eU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZkZ1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGlmZkZ1bmN0aW9uc1tpXShwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmNoYW5nZWQgJiYgY2hhbmdlZFByb3BlcnR5S2V5cy5pbmRleE9mKHByb3BlcnR5TmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFByb3BlcnR5S2V5cy5wdXNoKHByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lIGluIHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmUHJvcGVydHlSZXN1bHRzW3Byb3BlcnR5TmFtZV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGJvdW5kQXV0byhwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuY2hhbmdlZCAmJiBjaGFuZ2VkUHJvcGVydHlLZXlzLmluZGV4T2YocHJvcGVydHlOYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRQcm9wZXJ0eUtleXMucHVzaChwcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlmZlByb3BlcnR5UmVzdWx0c1twcm9wZXJ0eU5hbWVdID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1blJlYWN0aW9ucykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWN0aW9uRnVuY3Rpb25zID0gdGhpcy5nZXREZWNvcmF0b3IoJ2RpZmZSZWFjdGlvbicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVkUmVhY3Rpb25zID0gW107XG4gICAgICAgICAgICAgICAgcmVhY3Rpb25GdW5jdGlvbnMuZm9yRWFjaCgoeyByZWFjdGlvbiwgcHJvcGVydHlOYW1lIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHlDaGFuZ2VkID0gY2hhbmdlZFByb3BlcnR5S2V5cy5pbmRleE9mKHByb3BlcnR5TmFtZSkgIT09IC0xO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFjdGlvblJ1biA9IGV4ZWN1dGVkUmVhY3Rpb25zLmluZGV4T2YocmVhY3Rpb24pICE9PSAtMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Q2hhbmdlZCAmJiAhcmVhY3Rpb25SdW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWN0aW9uLmNhbGwodGhpcywgdGhpcy5fcHJvcGVydGllcywgZGlmZlByb3BlcnR5UmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZFJlYWN0aW9ucy5wdXNoKHJlYWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IGRpZmZQcm9wZXJ0eVJlc3VsdHM7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VkUHJvcGVydHlLZXlzID0gY2hhbmdlZFByb3BlcnR5S2V5cztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxQcm9wZXJ0aWVzID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWVzW2ldO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5KHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSwgaW5zdGFuY2VEYXRhLmNvcmVQcm9wZXJ0aWVzLmJpbmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFByb3BlcnR5S2V5cy5wdXNoKHByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fY2hhbmdlZFByb3BlcnR5S2V5cyA9IGNoYW5nZWRQcm9wZXJ0eUtleXM7XG4gICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2NoYW5nZWRQcm9wZXJ0eUtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGNoaWxkcmVuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW47XG4gICAgfVxuICAgIF9fc2V0Q2hpbGRyZW5fXyhjaGlsZHJlbikge1xuICAgICAgICBpZiAodGhpcy5fY2hpbGRyZW4ubGVuZ3RoID4gMCB8fCBjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX19yZW5kZXJfXygpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHRoaXMpO1xuICAgICAgICBpbnN0YW5jZURhdGEuZGlydHkgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVuZGVyID0gdGhpcy5fcnVuQmVmb3JlUmVuZGVycygpO1xuICAgICAgICBsZXQgZE5vZGUgPSByZW5kZXIoKTtcbiAgICAgICAgZE5vZGUgPSB0aGlzLnJ1bkFmdGVyUmVuZGVycyhkTm9kZSk7XG4gICAgICAgIHRoaXMuX25vZGVIYW5kbGVyLmNsZWFyKCk7XG4gICAgICAgIHJldHVybiBkTm9kZTtcbiAgICB9XG4gICAgaW52YWxpZGF0ZSgpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHRoaXMpO1xuICAgICAgICBpZiAoaW5zdGFuY2VEYXRhLmludmFsaWRhdGUpIHtcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5pbnZhbGlkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gdignZGl2Jywge30sIHRoaXMuY2hpbGRyZW4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB0byBhZGQgZGVjb3JhdG9ycyB0byBXaWRnZXRCYXNlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVjb3JhdG9yS2V5IFRoZSBrZXkgb2YgdGhlIGRlY29yYXRvclxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGRlY29yYXRvclxuICAgICAqL1xuICAgIGFkZERlY29yYXRvcihkZWNvcmF0b3JLZXksIHZhbHVlKSB7XG4gICAgICAgIHZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KCdjb25zdHJ1Y3RvcicpKSB7XG4gICAgICAgICAgICBsZXQgZGVjb3JhdG9yTGlzdCA9IGRlY29yYXRvck1hcC5nZXQodGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgICAgICAgICBpZiAoIWRlY29yYXRvckxpc3QpIHtcbiAgICAgICAgICAgICAgICBkZWNvcmF0b3JMaXN0ID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgICAgIGRlY29yYXRvck1hcC5zZXQodGhpcy5jb25zdHJ1Y3RvciwgZGVjb3JhdG9yTGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc3BlY2lmaWNEZWNvcmF0b3JMaXN0ID0gZGVjb3JhdG9yTGlzdC5nZXQoZGVjb3JhdG9yS2V5KTtcbiAgICAgICAgICAgIGlmICghc3BlY2lmaWNEZWNvcmF0b3JMaXN0KSB7XG4gICAgICAgICAgICAgICAgc3BlY2lmaWNEZWNvcmF0b3JMaXN0ID0gW107XG4gICAgICAgICAgICAgICAgZGVjb3JhdG9yTGlzdC5zZXQoZGVjb3JhdG9yS2V5LCBzcGVjaWZpY0RlY29yYXRvckxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3BlY2lmaWNEZWNvcmF0b3JMaXN0LnB1c2goLi4udmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IHRoaXMuZ2V0RGVjb3JhdG9yKGRlY29yYXRvcktleSk7XG4gICAgICAgICAgICB0aGlzLl9kZWNvcmF0b3JDYWNoZS5zZXQoZGVjb3JhdG9yS2V5LCBbLi4uZGVjb3JhdG9ycywgLi4udmFsdWVdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB0byBidWlsZCB0aGUgbGlzdCBvZiBkZWNvcmF0b3JzIGZyb20gdGhlIGdsb2JhbCBkZWNvcmF0b3IgbWFwLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRlY29yYXRvcktleSAgVGhlIGtleSBvZiB0aGUgZGVjb3JhdG9yXG4gICAgICogQHJldHVybiBBbiBhcnJheSBvZiBkZWNvcmF0b3IgdmFsdWVzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfYnVpbGREZWNvcmF0b3JMaXN0KGRlY29yYXRvcktleSkge1xuICAgICAgICBjb25zdCBhbGxEZWNvcmF0b3JzID0gW107XG4gICAgICAgIGxldCBjb25zdHJ1Y3RvciA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgICAgIHdoaWxlIChjb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VNYXAgPSBkZWNvcmF0b3JNYXAuZ2V0KGNvbnN0cnVjdG9yKTtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZU1hcCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBpbnN0YW5jZU1hcC5nZXQoZGVjb3JhdG9yS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9ycykge1xuICAgICAgICAgICAgICAgICAgICBhbGxEZWNvcmF0b3JzLnVuc2hpZnQoLi4uZGVjb3JhdG9ycyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3RydWN0b3IgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY29uc3RydWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhbGxEZWNvcmF0b3JzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB0byByZXRyaWV2ZSBkZWNvcmF0b3IgdmFsdWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVjb3JhdG9yS2V5IFRoZSBrZXkgb2YgdGhlIGRlY29yYXRvclxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGRlY29yYXRvciB2YWx1ZXNcbiAgICAgKi9cbiAgICBnZXREZWNvcmF0b3IoZGVjb3JhdG9yS2V5KSB7XG4gICAgICAgIGxldCBhbGxEZWNvcmF0b3JzID0gdGhpcy5fZGVjb3JhdG9yQ2FjaGUuZ2V0KGRlY29yYXRvcktleSk7XG4gICAgICAgIGlmIChhbGxEZWNvcmF0b3JzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhbGxEZWNvcmF0b3JzO1xuICAgICAgICB9XG4gICAgICAgIGFsbERlY29yYXRvcnMgPSB0aGlzLl9idWlsZERlY29yYXRvckxpc3QoZGVjb3JhdG9yS2V5KTtcbiAgICAgICAgdGhpcy5fZGVjb3JhdG9yQ2FjaGUuc2V0KGRlY29yYXRvcktleSwgYWxsRGVjb3JhdG9ycyk7XG4gICAgICAgIHJldHVybiBhbGxEZWNvcmF0b3JzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCaW5kcyB1bmJvdW5kIHByb3BlcnR5IGZ1bmN0aW9ucyB0byB0aGUgc3BlY2lmaWVkIGBiaW5kYCBwcm9wZXJ0eVxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgcHJvcGVydGllcyB0byBjaGVjayBmb3IgZnVuY3Rpb25zXG4gICAgICovXG4gICAgX2JpbmRGdW5jdGlvblByb3BlcnR5KHByb3BlcnR5LCBiaW5kKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkgPT09ICdmdW5jdGlvbicgJiYgIXByb3BlcnR5W25vQmluZF0gJiYgaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IocHJvcGVydHkpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5TWFwID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eU1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBiaW5kSW5mbyA9IHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5TWFwLmdldChwcm9wZXJ0eSkgfHwge307XG4gICAgICAgICAgICBsZXQgeyBib3VuZEZ1bmMsIHNjb3BlIH0gPSBiaW5kSW5mbztcbiAgICAgICAgICAgIGlmIChib3VuZEZ1bmMgPT09IHVuZGVmaW5lZCB8fCBzY29wZSAhPT0gYmluZCkge1xuICAgICAgICAgICAgICAgIGJvdW5kRnVuYyA9IHByb3BlcnR5LmJpbmQoYmluZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fYmluZEZ1bmN0aW9uUHJvcGVydHlNYXAuc2V0KHByb3BlcnR5LCB7IGJvdW5kRnVuYywgc2NvcGU6IGJpbmQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYm91bmRGdW5jO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eTtcbiAgICB9XG4gICAgZ2V0IHJlZ2lzdHJ5KCkge1xuICAgICAgICBpZiAodGhpcy5fcmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnlIYW5kbGVyKCk7XG4gICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeSk7XG4gICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeS5vbignaW52YWxpZGF0ZScsIHRoaXMuX2JvdW5kSW52YWxpZGF0ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWdpc3RyeTtcbiAgICB9XG4gICAgX3J1bkJlZm9yZVByb3BlcnRpZXMocHJvcGVydGllcykge1xuICAgICAgICBjb25zdCBiZWZvcmVQcm9wZXJ0aWVzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2JlZm9yZVByb3BlcnRpZXMnKTtcbiAgICAgICAgaWYgKGJlZm9yZVByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJlZm9yZVByb3BlcnRpZXMucmVkdWNlKChwcm9wZXJ0aWVzLCBiZWZvcmVQcm9wZXJ0aWVzRnVuY3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcHJvcGVydGllcywgYmVmb3JlUHJvcGVydGllc0Z1bmN0aW9uLmNhbGwodGhpcywgcHJvcGVydGllcykpO1xuICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcGVydGllcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSdW4gYWxsIHJlZ2lzdGVyZWQgYmVmb3JlIHJlbmRlcnMgYW5kIHJldHVybiB0aGUgdXBkYXRlZCByZW5kZXIgbWV0aG9kXG4gICAgICovXG4gICAgX3J1bkJlZm9yZVJlbmRlcnMoKSB7XG4gICAgICAgIGNvbnN0IGJlZm9yZVJlbmRlcnMgPSB0aGlzLmdldERlY29yYXRvcignYmVmb3JlUmVuZGVyJyk7XG4gICAgICAgIGlmIChiZWZvcmVSZW5kZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBiZWZvcmVSZW5kZXJzLnJlZHVjZSgocmVuZGVyLCBiZWZvcmVSZW5kZXJGdW5jdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRSZW5kZXIgPSBiZWZvcmVSZW5kZXJGdW5jdGlvbi5jYWxsKHRoaXMsIHJlbmRlciwgdGhpcy5fcHJvcGVydGllcywgdGhpcy5fY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIGlmICghdXBkYXRlZFJlbmRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlbmRlciBmdW5jdGlvbiBub3QgcmV0dXJuZWQgZnJvbSBiZWZvcmVSZW5kZXIsIHVzaW5nIHByZXZpb3VzIHJlbmRlcicpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlZFJlbmRlcjtcbiAgICAgICAgICAgIH0sIHRoaXMuX2JvdW5kUmVuZGVyRnVuYyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2JvdW5kUmVuZGVyRnVuYztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUnVuIGFsbCByZWdpc3RlcmVkIGFmdGVyIHJlbmRlcnMgYW5kIHJldHVybiB0aGUgZGVjb3JhdGVkIEROb2Rlc1xuICAgICAqXG4gICAgICogQHBhcmFtIGROb2RlIFRoZSBETm9kZXMgdG8gcnVuIHRocm91Z2ggdGhlIGFmdGVyIHJlbmRlcnNcbiAgICAgKi9cbiAgICBydW5BZnRlclJlbmRlcnMoZE5vZGUpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJSZW5kZXJzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2FmdGVyUmVuZGVyJyk7XG4gICAgICAgIGlmIChhZnRlclJlbmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZE5vZGUgPSBhZnRlclJlbmRlcnMucmVkdWNlKChkTm9kZSwgYWZ0ZXJSZW5kZXJGdW5jdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhZnRlclJlbmRlckZ1bmN0aW9uLmNhbGwodGhpcywgZE5vZGUpO1xuICAgICAgICAgICAgfSwgZE5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9tZXRhTWFwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX21ldGFNYXAuZm9yRWFjaCgobWV0YSkgPT4ge1xuICAgICAgICAgICAgICAgIG1ldGEuYWZ0ZXJSZW5kZXIoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkTm9kZTtcbiAgICB9XG4gICAgX3J1bkFmdGVyQ29uc3RydWN0b3JzKCkge1xuICAgICAgICBjb25zdCBhZnRlckNvbnN0cnVjdG9ycyA9IHRoaXMuZ2V0RGVjb3JhdG9yKCdhZnRlckNvbnN0cnVjdG9yJyk7XG4gICAgICAgIGlmIChhZnRlckNvbnN0cnVjdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhZnRlckNvbnN0cnVjdG9ycy5mb3JFYWNoKChhZnRlckNvbnN0cnVjdG9yKSA9PiBhZnRlckNvbnN0cnVjdG9yLmNhbGwodGhpcykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG93bihoYW5kbGUpIHtcbiAgICAgICAgdGhpcy5faGFuZGxlcy5wdXNoKGhhbmRsZSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLl9oYW5kbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMuX2hhbmRsZXMucG9wKCk7XG4gICAgICAgICAgICBpZiAoaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogc3RhdGljIGlkZW50aWZpZXJcbiAqL1xuV2lkZ2V0QmFzZS5fdHlwZSA9IFdJREdFVF9CQVNFX1RZUEU7XG5leHBvcnQgZGVmYXVsdCBXaWRnZXRCYXNlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2lkZ2V0QmFzZS5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL1dpZGdldEJhc2UubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvV2lkZ2V0QmFzZS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJsZXQgYnJvd3NlclNwZWNpZmljVHJhbnNpdGlvbkVuZEV2ZW50TmFtZSA9ICcnO1xubGV0IGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSA9ICcnO1xuZnVuY3Rpb24gZGV0ZXJtaW5lQnJvd3NlclN0eWxlTmFtZXMoZWxlbWVudCkge1xuICAgIGlmICgnV2Via2l0VHJhbnNpdGlvbicgaW4gZWxlbWVudC5zdHlsZSkge1xuICAgICAgICBicm93c2VyU3BlY2lmaWNUcmFuc2l0aW9uRW5kRXZlbnROYW1lID0gJ3dlYmtpdFRyYW5zaXRpb25FbmQnO1xuICAgICAgICBicm93c2VyU3BlY2lmaWNBbmltYXRpb25FbmRFdmVudE5hbWUgPSAnd2Via2l0QW5pbWF0aW9uRW5kJztcbiAgICB9XG4gICAgZWxzZSBpZiAoJ3RyYW5zaXRpb24nIGluIGVsZW1lbnQuc3R5bGUgfHwgJ01velRyYW5zaXRpb24nIGluIGVsZW1lbnQuc3R5bGUpIHtcbiAgICAgICAgYnJvd3NlclNwZWNpZmljVHJhbnNpdGlvbkVuZEV2ZW50TmFtZSA9ICd0cmFuc2l0aW9uZW5kJztcbiAgICAgICAgYnJvd3NlclNwZWNpZmljQW5pbWF0aW9uRW5kRXZlbnROYW1lID0gJ2FuaW1hdGlvbmVuZCc7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdXIgYnJvd3NlciBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxufVxuZnVuY3Rpb24gaW5pdGlhbGl6ZShlbGVtZW50KSB7XG4gICAgaWYgKGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSA9PT0gJycpIHtcbiAgICAgICAgZGV0ZXJtaW5lQnJvd3NlclN0eWxlTmFtZXMoZWxlbWVudCk7XG4gICAgfVxufVxuZnVuY3Rpb24gcnVuQW5kQ2xlYW5VcChlbGVtZW50LCBzdGFydEFuaW1hdGlvbiwgZmluaXNoQW5pbWF0aW9uKSB7XG4gICAgaW5pdGlhbGl6ZShlbGVtZW50KTtcbiAgICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcbiAgICBsZXQgdHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFmaW5pc2hlZCkge1xuICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGJyb3dzZXJTcGVjaWZpY1RyYW5zaXRpb25FbmRFdmVudE5hbWUsIHRyYW5zaXRpb25FbmQpO1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSwgdHJhbnNpdGlvbkVuZCk7XG4gICAgICAgICAgICBmaW5pc2hBbmltYXRpb24oKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgc3RhcnRBbmltYXRpb24oKTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoYnJvd3NlclNwZWNpZmljQW5pbWF0aW9uRW5kRXZlbnROYW1lLCB0cmFuc2l0aW9uRW5kKTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoYnJvd3NlclNwZWNpZmljVHJhbnNpdGlvbkVuZEV2ZW50TmFtZSwgdHJhbnNpdGlvbkVuZCk7XG59XG5mdW5jdGlvbiBleGl0KG5vZGUsIHByb3BlcnRpZXMsIGV4aXRBbmltYXRpb24sIHJlbW92ZU5vZGUpIHtcbiAgICBjb25zdCBhY3RpdmVDbGFzcyA9IHByb3BlcnRpZXMuZXhpdEFuaW1hdGlvbkFjdGl2ZSB8fCBgJHtleGl0QW5pbWF0aW9ufS1hY3RpdmVgO1xuICAgIHJ1bkFuZENsZWFuVXAobm9kZSwgKCkgPT4ge1xuICAgICAgICBub2RlLmNsYXNzTGlzdC5hZGQoZXhpdEFuaW1hdGlvbik7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBub2RlLmNsYXNzTGlzdC5hZGQoYWN0aXZlQ2xhc3MpO1xuICAgICAgICB9KTtcbiAgICB9LCAoKSA9PiB7XG4gICAgICAgIHJlbW92ZU5vZGUoKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGVudGVyKG5vZGUsIHByb3BlcnRpZXMsIGVudGVyQW5pbWF0aW9uKSB7XG4gICAgY29uc3QgYWN0aXZlQ2xhc3MgPSBwcm9wZXJ0aWVzLmVudGVyQW5pbWF0aW9uQWN0aXZlIHx8IGAke2VudGVyQW5pbWF0aW9ufS1hY3RpdmVgO1xuICAgIHJ1bkFuZENsZWFuVXAobm9kZSwgKCkgPT4ge1xuICAgICAgICBub2RlLmNsYXNzTGlzdC5hZGQoZW50ZXJBbmltYXRpb24pO1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKGFjdGl2ZUNsYXNzKTtcbiAgICAgICAgfSk7XG4gICAgfSwgKCkgPT4ge1xuICAgICAgICBub2RlLmNsYXNzTGlzdC5yZW1vdmUoZW50ZXJBbmltYXRpb24pO1xuICAgICAgICBub2RlLmNsYXNzTGlzdC5yZW1vdmUoYWN0aXZlQ2xhc3MpO1xuICAgIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQge1xuICAgIGVudGVyLFxuICAgIGV4aXRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jc3NUcmFuc2l0aW9ucy5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2FuaW1hdGlvbnMvY3NzVHJhbnNpdGlvbnMubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvYW5pbWF0aW9ucy9jc3NUcmFuc2l0aW9ucy5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgU3ltYm9sIGZyb20gJy4uL3NoaW0vU3ltYm9sJztcbi8qKlxuICogVGhlIHN5bWJvbCBpZGVudGlmaWVyIGZvciBhIFdOb2RlIHR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IFdOT0RFID0gU3ltYm9sKCdJZGVudGlmaWVyIGZvciBhIFdOb2RlLicpO1xuLyoqXG4gKiBUaGUgc3ltYm9sIGlkZW50aWZpZXIgZm9yIGEgVk5vZGUgdHlwZVxuICovXG5leHBvcnQgY29uc3QgVk5PREUgPSBTeW1ib2woJ0lkZW50aWZpZXIgZm9yIGEgVk5vZGUuJyk7XG4vKipcbiAqIFRoZSBzeW1ib2wgaWRlbnRpZmllciBmb3IgYSBWTm9kZSB0eXBlIGNyZWF0ZWQgdXNpbmcgZG9tKClcbiAqL1xuZXhwb3J0IGNvbnN0IERPTVZOT0RFID0gU3ltYm9sKCdJZGVudGlmaWVyIGZvciBhIFZOb2RlIGNyZWF0ZWQgdXNpbmcgZXhpc3RpbmcgZG9tLicpO1xuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIGBETm9kZWAgaXMgYSBgV05vZGVgIHVzaW5nIHRoZSBgdHlwZWAgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV05vZGUoY2hpbGQpIHtcbiAgICByZXR1cm4gQm9vbGVhbihjaGlsZCAmJiB0eXBlb2YgY2hpbGQgIT09ICdzdHJpbmcnICYmIGNoaWxkLnR5cGUgPT09IFdOT0RFKTtcbn1cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBgRE5vZGVgIGlzIGEgYFZOb2RlYCB1c2luZyB0aGUgYHR5cGVgIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZOb2RlKGNoaWxkKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oY2hpbGQgJiYgdHlwZW9mIGNoaWxkICE9PSAnc3RyaW5nJyAmJiAoY2hpbGQudHlwZSA9PT0gVk5PREUgfHwgY2hpbGQudHlwZSA9PT0gRE9NVk5PREUpKTtcbn1cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBgRE5vZGVgIGlzIGEgYFZOb2RlYCBjcmVhdGVkIHdpdGggYGRvbSgpYCB1c2luZyB0aGUgYHR5cGVgIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RvbVZOb2RlKGNoaWxkKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oY2hpbGQgJiYgdHlwZW9mIGNoaWxkICE9PSAnc3RyaW5nJyAmJiBjaGlsZC50eXBlID09PSBET01WTk9ERSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFbGVtZW50Tm9kZSh2YWx1ZSkge1xuICAgIHJldHVybiAhIXZhbHVlLnRhZ05hbWU7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjb3JhdGUoZE5vZGVzLCBvcHRpb25zT3JNb2RpZmllciwgcHJlZGljYXRlKSB7XG4gICAgbGV0IHNoYWxsb3cgPSBmYWxzZTtcbiAgICBsZXQgbW9kaWZpZXI7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zT3JNb2RpZmllciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBtb2RpZmllciA9IG9wdGlvbnNPck1vZGlmaWVyO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbW9kaWZpZXIgPSBvcHRpb25zT3JNb2RpZmllci5tb2RpZmllcjtcbiAgICAgICAgcHJlZGljYXRlID0gb3B0aW9uc09yTW9kaWZpZXIucHJlZGljYXRlO1xuICAgICAgICBzaGFsbG93ID0gb3B0aW9uc09yTW9kaWZpZXIuc2hhbGxvdyB8fCBmYWxzZTtcbiAgICB9XG4gICAgbGV0IG5vZGVzID0gQXJyYXkuaXNBcnJheShkTm9kZXMpID8gWy4uLmROb2Rlc10gOiBbZE5vZGVzXTtcbiAgICBmdW5jdGlvbiBicmVha2VyKCkge1xuICAgICAgICBub2RlcyA9IFtdO1xuICAgIH1cbiAgICB3aGlsZSAobm9kZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlcy5zaGlmdCgpO1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKCFzaGFsbG93ICYmIChpc1dOb2RlKG5vZGUpIHx8IGlzVk5vZGUobm9kZSkpICYmIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBub2RlcyA9IFsuLi5ub2RlcywgLi4ubm9kZS5jaGlsZHJlbl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXByZWRpY2F0ZSB8fCBwcmVkaWNhdGUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICBtb2RpZmllcihub2RlLCBicmVha2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZE5vZGVzO1xufVxuLyoqXG4gKiBXcmFwcGVyIGZ1bmN0aW9uIGZvciBjYWxscyB0byBjcmVhdGUgYSB3aWRnZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3KHdpZGdldENvbnN0cnVjdG9yLCBwcm9wZXJ0aWVzLCBjaGlsZHJlbiA9IFtdKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIHdpZGdldENvbnN0cnVjdG9yLFxuICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICB0eXBlOiBXTk9ERVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gdih0YWcsIHByb3BlcnRpZXNPckNoaWxkcmVuID0ge30sIGNoaWxkcmVuID0gdW5kZWZpbmVkKSB7XG4gICAgbGV0IHByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzT3JDaGlsZHJlbjtcbiAgICBsZXQgZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2s7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcGVydGllc09yQ2hpbGRyZW4pKSB7XG4gICAgICAgIGNoaWxkcmVuID0gcHJvcGVydGllc09yQ2hpbGRyZW47XG4gICAgICAgIHByb3BlcnRpZXMgPSB7fTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcm9wZXJ0aWVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrID0gcHJvcGVydGllcztcbiAgICAgICAgcHJvcGVydGllcyA9IHt9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB0YWcsXG4gICAgICAgIGRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrLFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgcHJvcGVydGllcyxcbiAgICAgICAgdHlwZTogVk5PREVcbiAgICB9O1xufVxuLyoqXG4gKiBDcmVhdGUgYSBWTm9kZSBmb3IgYW4gZXhpc3RpbmcgRE9NIE5vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb20oeyBub2RlLCBhdHRycyA9IHt9LCBwcm9wcyA9IHt9LCBvbiA9IHt9LCBkaWZmVHlwZSA9ICdub25lJyB9LCBjaGlsZHJlbikge1xuICAgIHJldHVybiB7XG4gICAgICAgIHRhZzogaXNFbGVtZW50Tm9kZShub2RlKSA/IG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpIDogJycsXG4gICAgICAgIHByb3BlcnRpZXM6IHByb3BzLFxuICAgICAgICBhdHRyaWJ1dGVzOiBhdHRycyxcbiAgICAgICAgZXZlbnRzOiBvbixcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIHR5cGU6IERPTVZOT0RFLFxuICAgICAgICBkb21Ob2RlOiBub2RlLFxuICAgICAgICB0ZXh0OiBpc0VsZW1lbnROb2RlKG5vZGUpID8gdW5kZWZpbmVkIDogbm9kZS5kYXRhLFxuICAgICAgICBkaWZmVHlwZVxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCB7IGhhbmRsZURlY29yYXRvciB9IGZyb20gJy4vaGFuZGxlRGVjb3JhdG9yJztcbmV4cG9ydCBmdW5jdGlvbiBhZnRlclJlbmRlcihtZXRob2QpIHtcbiAgICByZXR1cm4gaGFuZGxlRGVjb3JhdG9yKCh0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICAgIHRhcmdldC5hZGREZWNvcmF0b3IoJ2FmdGVyUmVuZGVyJywgcHJvcGVydHlLZXkgPyB0YXJnZXRbcHJvcGVydHlLZXldIDogbWV0aG9kKTtcbiAgICB9KTtcbn1cbmV4cG9ydCBkZWZhdWx0IGFmdGVyUmVuZGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWZ0ZXJSZW5kZXIubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2FmdGVyUmVuZGVyLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYWZ0ZXJSZW5kZXIubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi9oYW5kbGVEZWNvcmF0b3InO1xuaW1wb3J0IHsgYmVmb3JlUHJvcGVydGllcyB9IGZyb20gJy4vYmVmb3JlUHJvcGVydGllcyc7XG5leHBvcnQgZnVuY3Rpb24gYWx3YXlzUmVuZGVyKCkge1xuICAgIHJldHVybiBoYW5kbGVEZWNvcmF0b3IoKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICAgICAgYmVmb3JlUHJvcGVydGllcyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmludmFsaWRhdGUoKTtcbiAgICAgICAgfSkodGFyZ2V0KTtcbiAgICB9KTtcbn1cbmV4cG9ydCBkZWZhdWx0IGFsd2F5c1JlbmRlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFsd2F5c1JlbmRlci5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYWx3YXlzUmVuZGVyLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYWx3YXlzUmVuZGVyLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCB7IGhhbmRsZURlY29yYXRvciB9IGZyb20gJy4vaGFuZGxlRGVjb3JhdG9yJztcbmV4cG9ydCBmdW5jdGlvbiBiZWZvcmVQcm9wZXJ0aWVzKG1ldGhvZCkge1xuICAgIHJldHVybiBoYW5kbGVEZWNvcmF0b3IoKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcignYmVmb3JlUHJvcGVydGllcycsIHByb3BlcnR5S2V5ID8gdGFyZ2V0W3Byb3BlcnR5S2V5XSA6IG1ldGhvZCk7XG4gICAgfSk7XG59XG5leHBvcnQgZGVmYXVsdCBiZWZvcmVQcm9wZXJ0aWVzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmVmb3JlUHJvcGVydGllcy5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYmVmb3JlUHJvcGVydGllcy5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2JlZm9yZVByb3BlcnRpZXMubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IHsgQ3VzdG9tRWxlbWVudENoaWxkVHlwZSB9IGZyb20gJy4uL3JlZ2lzdGVyQ3VzdG9tRWxlbWVudCc7XG5pbXBvcnQgUmVnaXN0cnkgZnJvbSAnLi4vUmVnaXN0cnknO1xuLyoqXG4gKiBUaGlzIERlY29yYXRvciBpcyBwcm92aWRlZCBwcm9wZXJ0aWVzIHRoYXQgZGVmaW5lIHRoZSBiZWhhdmlvciBvZiBhIGN1c3RvbSBlbGVtZW50LCBhbmRcbiAqIHJlZ2lzdGVycyB0aGF0IGN1c3RvbSBlbGVtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3VzdG9tRWxlbWVudCh7IHRhZywgcHJvcGVydGllcyA9IFtdLCBhdHRyaWJ1dGVzID0gW10sIGV2ZW50cyA9IFtdLCBjaGlsZFR5cGUgPSBDdXN0b21FbGVtZW50Q2hpbGRUeXBlLkRPSk8sIHJlZ2lzdHJ5RmFjdG9yeSA9ICgpID0+IG5ldyBSZWdpc3RyeSgpIH0pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICB0YXJnZXQucHJvdG90eXBlLl9fY3VzdG9tRWxlbWVudERlc2NyaXB0b3IgPSB7XG4gICAgICAgICAgICB0YWdOYW1lOiB0YWcsXG4gICAgICAgICAgICBhdHRyaWJ1dGVzLFxuICAgICAgICAgICAgcHJvcGVydGllcyxcbiAgICAgICAgICAgIGV2ZW50cyxcbiAgICAgICAgICAgIGNoaWxkVHlwZSxcbiAgICAgICAgICAgIHJlZ2lzdHJ5RmFjdG9yeVxuICAgICAgICB9O1xuICAgIH07XG59XG5leHBvcnQgZGVmYXVsdCBjdXN0b21FbGVtZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3VzdG9tRWxlbWVudC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvY3VzdG9tRWxlbWVudC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2N1c3RvbUVsZW1lbnQubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi9oYW5kbGVEZWNvcmF0b3InO1xuaW1wb3J0IHsgYXV0byB9IGZyb20gJy4vLi4vZGlmZic7XG4vKipcbiAqIERlY29yYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlZ2lzdGVyIGEgZnVuY3Rpb24gYXMgYSBzcGVjaWZpYyBwcm9wZXJ0eSBkaWZmXG4gKlxuICogQHBhcmFtIHByb3BlcnR5TmFtZSAgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IG9mIHdoaWNoIHRoZSBkaWZmIGZ1bmN0aW9uIGlzIGFwcGxpZWRcbiAqIEBwYXJhbSBkaWZmVHlwZSAgICAgIFRoZSBkaWZmIHR5cGUsIGRlZmF1bHQgaXMgRGlmZlR5cGUuQVVUTy5cbiAqIEBwYXJhbSBkaWZmRnVuY3Rpb24gIEEgZGlmZiBmdW5jdGlvbiB0byBydW4gaWYgZGlmZlR5cGUgaWYgRGlmZlR5cGUuQ1VTVE9NXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmUHJvcGVydHkocHJvcGVydHlOYW1lLCBkaWZmRnVuY3Rpb24gPSBhdXRvLCByZWFjdGlvbkZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIGhhbmRsZURlY29yYXRvcigodGFyZ2V0LCBwcm9wZXJ0eUtleSkgPT4ge1xuICAgICAgICB0YXJnZXQuYWRkRGVjb3JhdG9yKGBkaWZmUHJvcGVydHk6JHtwcm9wZXJ0eU5hbWV9YCwgZGlmZkZ1bmN0aW9uLmJpbmQobnVsbCkpO1xuICAgICAgICB0YXJnZXQuYWRkRGVjb3JhdG9yKCdyZWdpc3RlcmVkRGlmZlByb3BlcnR5JywgcHJvcGVydHlOYW1lKTtcbiAgICAgICAgaWYgKHJlYWN0aW9uRnVuY3Rpb24gfHwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIHRhcmdldC5hZGREZWNvcmF0b3IoJ2RpZmZSZWFjdGlvbicsIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICAgICAgcmVhY3Rpb246IHByb3BlcnR5S2V5ID8gdGFyZ2V0W3Byb3BlcnR5S2V5XSA6IHJlYWN0aW9uRnVuY3Rpb25cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnQgZGVmYXVsdCBkaWZmUHJvcGVydHk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWZmUHJvcGVydHkubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2RpZmZQcm9wZXJ0eS5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2RpZmZQcm9wZXJ0eS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCIvKipcbiAqIEdlbmVyaWMgZGVjb3JhdG9yIGhhbmRsZXIgdG8gdGFrZSBjYXJlIG9mIHdoZXRoZXIgb3Igbm90IHRoZSBkZWNvcmF0b3Igd2FzIGNhbGxlZCBhdCB0aGUgY2xhc3MgbGV2ZWxcbiAqIG9yIHRoZSBtZXRob2QgbGV2ZWwuXG4gKlxuICogQHBhcmFtIGhhbmRsZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZURlY29yYXRvcihoYW5kbGVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBoYW5kbGVyKHRhcmdldC5wcm90b3R5cGUsIHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVyKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydCBkZWZhdWx0IGhhbmRsZURlY29yYXRvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhbmRsZURlY29yYXRvci5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaGFuZGxlRGVjb3JhdG9yLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaGFuZGxlRGVjb3JhdG9yLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBXZWFrTWFwIGZyb20gJy4uLy4uL3NoaW0vV2Vha01hcCc7XG5pbXBvcnQgeyBoYW5kbGVEZWNvcmF0b3IgfSBmcm9tICcuL2hhbmRsZURlY29yYXRvcic7XG5pbXBvcnQgeyBiZWZvcmVQcm9wZXJ0aWVzIH0gZnJvbSAnLi9iZWZvcmVQcm9wZXJ0aWVzJztcbi8qKlxuICogTWFwIG9mIGluc3RhbmNlcyBhZ2FpbnN0IHJlZ2lzdGVyZWQgaW5qZWN0b3JzLlxuICovXG5jb25zdCByZWdpc3RlcmVkSW5qZWN0b3JzTWFwID0gbmV3IFdlYWtNYXAoKTtcbi8qKlxuICogRGVjb3JhdG9yIHJldHJpZXZlcyBhbiBpbmplY3RvciBmcm9tIGFuIGF2YWlsYWJsZSByZWdpc3RyeSB1c2luZyB0aGUgbmFtZSBhbmRcbiAqIGNhbGxzIHRoZSBgZ2V0UHJvcGVydGllc2AgZnVuY3Rpb24gd2l0aCB0aGUgcGF5bG9hZCBmcm9tIHRoZSBpbmplY3RvclxuICogYW5kIGN1cnJlbnQgcHJvcGVydGllcyB3aXRoIHRoZSB0aGUgaW5qZWN0ZWQgcHJvcGVydGllcyByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gSW5qZWN0Q29uZmlnIHRoZSBpbmplY3QgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KHsgbmFtZSwgZ2V0UHJvcGVydGllcyB9KSB7XG4gICAgcmV0dXJuIGhhbmRsZURlY29yYXRvcigodGFyZ2V0LCBwcm9wZXJ0eUtleSkgPT4ge1xuICAgICAgICBiZWZvcmVQcm9wZXJ0aWVzKGZ1bmN0aW9uIChwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBjb25zdCBpbmplY3Rvckl0ZW0gPSB0aGlzLnJlZ2lzdHJ5LmdldEluamVjdG9yKG5hbWUpO1xuICAgICAgICAgICAgaWYgKGluamVjdG9ySXRlbSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgaW5qZWN0b3IsIGludmFsaWRhdG9yIH0gPSBpbmplY3Rvckl0ZW07XG4gICAgICAgICAgICAgICAgY29uc3QgcmVnaXN0ZXJlZEluamVjdG9ycyA9IHJlZ2lzdGVyZWRJbmplY3RvcnNNYXAuZ2V0KHRoaXMpIHx8IFtdO1xuICAgICAgICAgICAgICAgIGlmIChyZWdpc3RlcmVkSW5qZWN0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZWdpc3RlcmVkSW5qZWN0b3JzTWFwLnNldCh0aGlzLCByZWdpc3RlcmVkSW5qZWN0b3JzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlZ2lzdGVyZWRJbmplY3RvcnMuaW5kZXhPZihpbmplY3Rvckl0ZW0pID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm93bihpbnZhbGlkYXRvci5vbignaW52YWxpZGF0ZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWRJbmplY3RvcnMucHVzaChpbmplY3Rvckl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJvcGVydGllcyhpbmplY3RvcigpLCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkodGFyZ2V0KTtcbiAgICB9KTtcbn1cbmV4cG9ydCBkZWZhdWx0IGluamVjdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluamVjdC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaW5qZWN0Lm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaW5qZWN0Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCB7IFdJREdFVF9CQVNFX1RZUEUgfSBmcm9tICcuL1JlZ2lzdHJ5JztcbmZ1bmN0aW9uIGlzT2JqZWN0T3JBcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhbHdheXMocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjaGFuZ2VkOiB0cnVlLFxuICAgICAgICB2YWx1ZTogbmV3UHJvcGVydHlcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZShwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5nZWQ6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogbmV3UHJvcGVydHlcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlZmVyZW5jZShwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5nZWQ6IHByZXZpb3VzUHJvcGVydHkgIT09IG5ld1Byb3BlcnR5LFxuICAgICAgICB2YWx1ZTogbmV3UHJvcGVydHlcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNoYWxsb3cocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpIHtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHZhbGlkT2xkUHJvcGVydHkgPSBwcmV2aW91c1Byb3BlcnR5ICYmIGlzT2JqZWN0T3JBcnJheShwcmV2aW91c1Byb3BlcnR5KTtcbiAgICBjb25zdCB2YWxpZE5ld1Byb3BlcnR5ID0gbmV3UHJvcGVydHkgJiYgaXNPYmplY3RPckFycmF5KG5ld1Byb3BlcnR5KTtcbiAgICBpZiAoIXZhbGlkT2xkUHJvcGVydHkgfHwgIXZhbGlkTmV3UHJvcGVydHkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNoYW5nZWQ6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbmV3UHJvcGVydHlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcHJldmlvdXNLZXlzID0gT2JqZWN0LmtleXMocHJldmlvdXNQcm9wZXJ0eSk7XG4gICAgY29uc3QgbmV3S2V5cyA9IE9iamVjdC5rZXlzKG5ld1Byb3BlcnR5KTtcbiAgICBpZiAocHJldmlvdXNLZXlzLmxlbmd0aCAhPT0gbmV3S2V5cy5sZW5ndGgpIHtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjaGFuZ2VkID0gbmV3S2V5cy5zb21lKChrZXkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXdQcm9wZXJ0eVtrZXldICE9PSBwcmV2aW91c1Byb3BlcnR5W2tleV07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBjaGFuZ2VkLFxuICAgICAgICB2YWx1ZTogbmV3UHJvcGVydHlcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGF1dG8ocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmICh0eXBlb2YgbmV3UHJvcGVydHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKG5ld1Byb3BlcnR5Ll90eXBlID09PSBXSURHRVRfQkFTRV9UWVBFKSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZWZlcmVuY2UocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gaWdub3JlKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChpc09iamVjdE9yQXJyYXkobmV3UHJvcGVydHkpKSB7XG4gICAgICAgIHJlc3VsdCA9IHNoYWxsb3cocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gcmVmZXJlbmNlKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRpZmYubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kaWZmLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RpZmYubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGFzc2lnbiB9IGZyb20gJy4uLy4uL2NvcmUvbGFuZyc7XG5pbXBvcnQgY3NzVHJhbnNpdGlvbnMgZnJvbSAnLi4vYW5pbWF0aW9ucy9jc3NUcmFuc2l0aW9ucyc7XG5pbXBvcnQgeyBhZnRlclJlbmRlciB9IGZyb20gJy4vLi4vZGVjb3JhdG9ycy9hZnRlclJlbmRlcic7XG5pbXBvcnQgeyB2IH0gZnJvbSAnLi8uLi9kJztcbmltcG9ydCB7IGRvbSB9IGZyb20gJy4vLi4vdmRvbSc7XG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGF0dGFjaCBzdGF0ZSBvZiB0aGUgcHJvamVjdG9yXG4gKi9cbmV4cG9ydCB2YXIgUHJvamVjdG9yQXR0YWNoU3RhdGU7XG4oZnVuY3Rpb24gKFByb2plY3RvckF0dGFjaFN0YXRlKSB7XG4gICAgUHJvamVjdG9yQXR0YWNoU3RhdGVbUHJvamVjdG9yQXR0YWNoU3RhdGVbXCJBdHRhY2hlZFwiXSA9IDFdID0gXCJBdHRhY2hlZFwiO1xuICAgIFByb2plY3RvckF0dGFjaFN0YXRlW1Byb2plY3RvckF0dGFjaFN0YXRlW1wiRGV0YWNoZWRcIl0gPSAyXSA9IFwiRGV0YWNoZWRcIjtcbn0pKFByb2plY3RvckF0dGFjaFN0YXRlIHx8IChQcm9qZWN0b3JBdHRhY2hTdGF0ZSA9IHt9KSk7XG4vKipcbiAqIEF0dGFjaCB0eXBlIGZvciB0aGUgcHJvamVjdG9yXG4gKi9cbmV4cG9ydCB2YXIgQXR0YWNoVHlwZTtcbihmdW5jdGlvbiAoQXR0YWNoVHlwZSkge1xuICAgIEF0dGFjaFR5cGVbQXR0YWNoVHlwZVtcIkFwcGVuZFwiXSA9IDFdID0gXCJBcHBlbmRcIjtcbiAgICBBdHRhY2hUeXBlW0F0dGFjaFR5cGVbXCJNZXJnZVwiXSA9IDJdID0gXCJNZXJnZVwiO1xufSkoQXR0YWNoVHlwZSB8fCAoQXR0YWNoVHlwZSA9IHt9KSk7XG5leHBvcnQgZnVuY3Rpb24gUHJvamVjdG9yTWl4aW4oQmFzZSkge1xuICAgIGNsYXNzIFByb2plY3RvciBleHRlbmRzIEJhc2Uge1xuICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7XG4gICAgICAgICAgICBzdXBlciguLi5hcmdzKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3QgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgICAgICAgdGhpcy5fYXN5bmMgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fcHJvamVjdG9yUHJvcGVydGllcyA9IHt9O1xuICAgICAgICAgICAgdGhpcy5fcHJvamVjdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbnM6IGNzc1RyYW5zaXRpb25zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5yb290ID0gZG9jdW1lbnQuYm9keTtcbiAgICAgICAgICAgIHRoaXMucHJvamVjdG9yU3RhdGUgPSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5EZXRhY2hlZDtcbiAgICAgICAgfVxuICAgICAgICBhcHBlbmQocm9vdCkge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBBdHRhY2hUeXBlLkFwcGVuZCxcbiAgICAgICAgICAgICAgICByb290XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2F0dGFjaChvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBtZXJnZShyb290KSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IEF0dGFjaFR5cGUuTWVyZ2UsXG4gICAgICAgICAgICAgICAgcm9vdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdHRhY2gob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0IHJvb3Qocm9vdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvamVjdG9yU3RhdGUgPT09IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9qZWN0b3IgYWxyZWFkeSBhdHRhY2hlZCwgY2Fubm90IGNoYW5nZSByb290IGVsZW1lbnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3Jvb3QgPSByb290O1xuICAgICAgICB9XG4gICAgICAgIGdldCByb290KCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3Q7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGFzeW5jKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FzeW5jO1xuICAgICAgICB9XG4gICAgICAgIHNldCBhc3luYyhhc3luYykge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvamVjdG9yU3RhdGUgPT09IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9qZWN0b3IgYWxyZWFkeSBhdHRhY2hlZCwgY2Fubm90IGNoYW5nZSBhc3luYyBtb2RlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9hc3luYyA9IGFzeW5jO1xuICAgICAgICB9XG4gICAgICAgIHNhbmRib3goZG9jID0gZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb2plY3RvclN0YXRlID09PSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5BdHRhY2hlZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJvamVjdG9yIGFscmVhZHkgYXR0YWNoZWQsIGNhbm5vdCBjcmVhdGUgc2FuZGJveCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fYXN5bmMgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzUm9vdCA9IHRoaXMucm9vdDtcbiAgICAgICAgICAgIC8qIGZyZWUgdXAgdGhlIGRvY3VtZW50IGZyYWdtZW50IGZvciBHQyAqL1xuICAgICAgICAgICAgdGhpcy5vd24oe1xuICAgICAgICAgICAgICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcm9vdCA9IHByZXZpb3VzUm9vdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX2F0dGFjaCh7XG4gICAgICAgICAgICAgICAgLyogRG9jdW1lbnRGcmFnbWVudCBpcyBub3QgYXNzaWduYWJsZSB0byBFbGVtZW50LCBidXQgcHJvdmlkZXMgZXZlcnl0aGluZyBuZWVkZWQgdG8gd29yayAqL1xuICAgICAgICAgICAgICAgIHJvb3Q6IGRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG4gICAgICAgICAgICAgICAgdHlwZTogQXR0YWNoVHlwZS5BcHBlbmRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHNldENoaWxkcmVuKGNoaWxkcmVuKSB7XG4gICAgICAgICAgICB0aGlzLl9fc2V0Q2hpbGRyZW5fXyhjaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICB0aGlzLl9fc2V0UHJvcGVydGllc19fKHByb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgICAgIF9fc2V0UHJvcGVydGllc19fKHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9wcm9qZWN0b3JQcm9wZXJ0aWVzICYmIHRoaXMuX3Byb2plY3RvclByb3BlcnRpZXMucmVnaXN0cnkgIT09IHByb3BlcnRpZXMucmVnaXN0cnkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcHJvamVjdG9yUHJvcGVydGllcy5yZWdpc3RyeSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm9qZWN0b3JQcm9wZXJ0aWVzLnJlZ2lzdHJ5LmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9wcm9qZWN0b3JQcm9wZXJ0aWVzID0gYXNzaWduKHt9LCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIHN1cGVyLl9fc2V0Q29yZVByb3BlcnRpZXNfXyh7IGJpbmQ6IHRoaXMsIGJhc2VSZWdpc3RyeTogcHJvcGVydGllcy5yZWdpc3RyeSB9KTtcbiAgICAgICAgICAgIHN1cGVyLl9fc2V0UHJvcGVydGllc19fKHByb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgICAgIHRvSHRtbCgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb2plY3RvclN0YXRlICE9PSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5BdHRhY2hlZCB8fCAhdGhpcy5fcHJvamVjdGlvbikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJvamVjdG9yIGlzIG5vdCBhdHRhY2hlZCwgY2Fubm90IHJldHVybiBhbiBIVE1MIHN0cmluZyBvZiBwcm9qZWN0aW9uLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2plY3Rpb24uZG9tTm9kZS5jaGlsZE5vZGVzWzBdLm91dGVySFRNTDtcbiAgICAgICAgfVxuICAgICAgICBhZnRlclJlbmRlcihyZXN1bHQpIHtcbiAgICAgICAgICAgIGxldCBub2RlID0gcmVzdWx0O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnIHx8IHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG5vZGUgPSB2KCdzcGFuJywge30sIFtyZXN1bHRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgICAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgX2F0dGFjaCh7IHR5cGUsIHJvb3QgfSkge1xuICAgICAgICAgICAgaWYgKHJvb3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3QgPSByb290O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2F0dGFjaEhhbmRsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdHRhY2hIYW5kbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByb2plY3RvclN0YXRlID0gUHJvamVjdG9yQXR0YWNoU3RhdGUuQXR0YWNoZWQ7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB7XG4gICAgICAgICAgICAgICAgZGVzdHJveTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9qZWN0b3JTdGF0ZSA9PT0gUHJvamVjdG9yQXR0YWNoU3RhdGUuQXR0YWNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2plY3RvclN0YXRlID0gUHJvamVjdG9yQXR0YWNoU3RhdGUuRGV0YWNoZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5vd24oaGFuZGxlKTtcbiAgICAgICAgICAgIHRoaXMuX2F0dGFjaEhhbmRsZSA9IGhhbmRsZTtcbiAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rpb25PcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcHJvamVjdGlvbk9wdGlvbnMsIHsgc3luYzogIXRoaXMuX2FzeW5jIH0pO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBBdHRhY2hUeXBlLkFwcGVuZDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvamVjdGlvbiA9IGRvbS5hcHBlbmQodGhpcy5yb290LCB0aGlzLCB0aGlzLl9wcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgQXR0YWNoVHlwZS5NZXJnZTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvamVjdGlvbiA9IGRvbS5tZXJnZSh0aGlzLnJvb3QsIHRoaXMsIHRoaXMuX3Byb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXR0YWNoSGFuZGxlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRzbGliXzEuX19kZWNvcmF0ZShbXG4gICAgICAgIGFmdGVyUmVuZGVyKClcbiAgICBdLCBQcm9qZWN0b3IucHJvdG90eXBlLCBcImFmdGVyUmVuZGVyXCIsIG51bGwpO1xuICAgIHJldHVybiBQcm9qZWN0b3I7XG59XG5leHBvcnQgZGVmYXVsdCBQcm9qZWN0b3JNaXhpbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVByb2plY3Rvci5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL21peGlucy9Qcm9qZWN0b3IubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvbWl4aW5zL1Byb2plY3Rvci5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgSW5qZWN0b3IgfSBmcm9tICcuLy4uL0luamVjdG9yJztcbmltcG9ydCB7IGluamVjdCB9IGZyb20gJy4vLi4vZGVjb3JhdG9ycy9pbmplY3QnO1xuaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi8uLi9kZWNvcmF0b3JzL2hhbmRsZURlY29yYXRvcic7XG5pbXBvcnQgeyBkaWZmUHJvcGVydHkgfSBmcm9tICcuLy4uL2RlY29yYXRvcnMvZGlmZlByb3BlcnR5JztcbmltcG9ydCB7IHNoYWxsb3cgfSBmcm9tICcuLy4uL2RpZmYnO1xuY29uc3QgVEhFTUVfS0VZID0gJyBfa2V5JztcbmV4cG9ydCBjb25zdCBJTkpFQ1RFRF9USEVNRV9LRVkgPSBTeW1ib2woJ3RoZW1lJyk7XG4vKipcbiAqIERlY29yYXRvciBmb3IgYmFzZSBjc3MgY2xhc3Nlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGhlbWUodGhlbWUpIHtcbiAgICByZXR1cm4gaGFuZGxlRGVjb3JhdG9yKCh0YXJnZXQpID0+IHtcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcignYmFzZVRoZW1lQ2xhc3NlcycsIHRoZW1lKTtcbiAgICB9KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIHJldmVyc2UgbG9va3VwIGZvciB0aGUgY2xhc3NlcyBwYXNzZWQgaW4gdmlhIHRoZSBgdGhlbWVgIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBjbGFzc2VzIFRoZSBiYXNlQ2xhc3NlcyBvYmplY3RcbiAqIEByZXF1aXJlc1xuICovXG5mdW5jdGlvbiBjcmVhdGVUaGVtZUNsYXNzZXNMb29rdXAoY2xhc3Nlcykge1xuICAgIHJldHVybiBjbGFzc2VzLnJlZHVjZSgoY3VycmVudENsYXNzTmFtZXMsIGJhc2VDbGFzcykgPT4ge1xuICAgICAgICBPYmplY3Qua2V5cyhiYXNlQ2xhc3MpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgY3VycmVudENsYXNzTmFtZXNbYmFzZUNsYXNzW2tleV1dID0ga2V5O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzc05hbWVzO1xuICAgIH0sIHt9KTtcbn1cbi8qKlxuICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBpcyBnaXZlbiBhIHRoZW1lIGFuZCBhbiBvcHRpb25hbCByZWdpc3RyeSwgdGhlIHRoZW1lXG4gKiBpbmplY3RvciBpcyBkZWZpbmVkIGFnYWluc3QgdGhlIHJlZ2lzdHJ5LCByZXR1cm5pbmcgdGhlIHRoZW1lLlxuICpcbiAqIEBwYXJhbSB0aGVtZSB0aGUgdGhlbWUgdG8gc2V0XG4gKiBAcGFyYW0gdGhlbWVSZWdpc3RyeSByZWdpc3RyeSB0byBkZWZpbmUgdGhlIHRoZW1lIGluamVjdG9yIGFnYWluc3QuIERlZmF1bHRzXG4gKiB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5XG4gKlxuICogQHJldHVybnMgdGhlIHRoZW1lIGluamVjdG9yIHVzZWQgdG8gc2V0IHRoZSB0aGVtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJUaGVtZUluamVjdG9yKHRoZW1lLCB0aGVtZVJlZ2lzdHJ5KSB7XG4gICAgY29uc3QgdGhlbWVJbmplY3RvciA9IG5ldyBJbmplY3Rvcih0aGVtZSk7XG4gICAgdGhlbWVSZWdpc3RyeS5kZWZpbmVJbmplY3RvcihJTkpFQ1RFRF9USEVNRV9LRVksIChpbnZhbGlkYXRvcikgPT4ge1xuICAgICAgICB0aGVtZUluamVjdG9yLnNldEludmFsaWRhdG9yKGludmFsaWRhdG9yKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHRoZW1lSW5qZWN0b3IuZ2V0KCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoZW1lSW5qZWN0b3I7XG59XG4vKipcbiAqIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGNsYXNzIGRlY29yYXRlZCB3aXRoIHdpdGggVGhlbWVkIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFRoZW1lZE1peGluKEJhc2UpIHtcbiAgICBsZXQgVGhlbWVkID0gY2xhc3MgVGhlbWVkIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogUmVnaXN0ZXJlZCBiYXNlIHRoZW1lIGtleXNcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZEJhc2VUaGVtZUtleXMgPSBbXTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogSW5kaWNhdGVzIGlmIGNsYXNzZXMgbWV0YSBkYXRhIG5lZWQgdG8gYmUgY2FsY3VsYXRlZC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy5fcmVjYWxjdWxhdGVDbGFzc2VzID0gdHJ1ZTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogTG9hZGVkIHRoZW1lXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXMuX3RoZW1lID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhlbWUoY2xhc3Nlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JlY2FsY3VsYXRlQ2xhc3Nlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlY2FsY3VsYXRlVGhlbWVDbGFzc2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjbGFzc2VzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc2VzLm1hcCgoY2xhc3NOYW1lKSA9PiB0aGlzLl9nZXRUaGVtZUNsYXNzKGNsYXNzTmFtZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFRoZW1lQ2xhc3MoY2xhc3Nlcyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZ1bmN0aW9uIGZpcmVkIHdoZW4gYHRoZW1lYCBvciBgZXh0cmFDbGFzc2VzYCBhcmUgY2hhbmdlZC5cbiAgICAgICAgICovXG4gICAgICAgIG9uUHJvcGVydGllc0NoYW5nZWQoKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWNhbGN1bGF0ZUNsYXNzZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIF9nZXRUaGVtZUNsYXNzKGNsYXNzTmFtZSkge1xuICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PT0gdW5kZWZpbmVkIHx8IGNsYXNzTmFtZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBleHRyYUNsYXNzZXMgPSB0aGlzLnByb3BlcnRpZXMuZXh0cmFDbGFzc2VzIHx8IHt9O1xuICAgICAgICAgICAgY29uc3QgdGhlbWVDbGFzc05hbWUgPSB0aGlzLl9iYXNlVGhlbWVDbGFzc2VzUmV2ZXJzZUxvb2t1cFtjbGFzc05hbWVdO1xuICAgICAgICAgICAgbGV0IHJlc3VsdENsYXNzTmFtZXMgPSBbXTtcbiAgICAgICAgICAgIGlmICghdGhlbWVDbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYENsYXNzIG5hbWU6ICcke2NsYXNzTmFtZX0nIG5vdCBmb3VuZCBpbiB0aGVtZWApO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4dHJhQ2xhc3Nlc1t0aGVtZUNsYXNzTmFtZV0pIHtcbiAgICAgICAgICAgICAgICByZXN1bHRDbGFzc05hbWVzLnB1c2goZXh0cmFDbGFzc2VzW3RoZW1lQ2xhc3NOYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fdGhlbWVbdGhlbWVDbGFzc05hbWVdKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0Q2xhc3NOYW1lcy5wdXNoKHRoaXMuX3RoZW1lW3RoZW1lQ2xhc3NOYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHRDbGFzc05hbWVzLnB1c2godGhpcy5fcmVnaXN0ZXJlZEJhc2VUaGVtZVt0aGVtZUNsYXNzTmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENsYXNzTmFtZXMuam9pbignICcpO1xuICAgICAgICB9XG4gICAgICAgIF9yZWNhbGN1bGF0ZVRoZW1lQ2xhc3NlcygpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGhlbWUgPSB7fSB9ID0gdGhpcy5wcm9wZXJ0aWVzO1xuICAgICAgICAgICAgY29uc3QgYmFzZVRoZW1lcyA9IHRoaXMuZ2V0RGVjb3JhdG9yKCdiYXNlVGhlbWVDbGFzc2VzJyk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3JlZ2lzdGVyZWRCYXNlVGhlbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lID0gYmFzZVRoZW1lcy5yZWR1Y2UoKGZpbmFsQmFzZVRoZW1lLCBiYXNlVGhlbWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX2EgPSBUSEVNRV9LRVksIGtleSA9IGJhc2VUaGVtZVtfYV0sIGNsYXNzZXMgPSB0c2xpYl8xLl9fcmVzdChiYXNlVGhlbWUsIFt0eXBlb2YgX2EgPT09IFwic3ltYm9sXCIgPyBfYSA6IF9hICsgXCJcIl0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lS2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBmaW5hbEJhc2VUaGVtZSwgY2xhc3Nlcyk7XG4gICAgICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Jhc2VUaGVtZUNsYXNzZXNSZXZlcnNlTG9va3VwID0gY3JlYXRlVGhlbWVDbGFzc2VzTG9va3VwKGJhc2VUaGVtZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdGhlbWUgPSB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lS2V5cy5yZWR1Y2UoKGJhc2VUaGVtZSwgdGhlbWVLZXkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgYmFzZVRoZW1lLCB0aGVtZVt0aGVtZUtleV0pO1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgdGhpcy5fcmVjYWxjdWxhdGVDbGFzc2VzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHRzbGliXzEuX19kZWNvcmF0ZShbXG4gICAgICAgIGRpZmZQcm9wZXJ0eSgndGhlbWUnLCBzaGFsbG93KSxcbiAgICAgICAgZGlmZlByb3BlcnR5KCdleHRyYUNsYXNzZXMnLCBzaGFsbG93KVxuICAgIF0sIFRoZW1lZC5wcm90b3R5cGUsIFwib25Qcm9wZXJ0aWVzQ2hhbmdlZFwiLCBudWxsKTtcbiAgICBUaGVtZWQgPSB0c2xpYl8xLl9fZGVjb3JhdGUoW1xuICAgICAgICBpbmplY3Qoe1xuICAgICAgICAgICAgbmFtZTogSU5KRUNURURfVEhFTUVfS0VZLFxuICAgICAgICAgICAgZ2V0UHJvcGVydGllczogKHRoZW1lLCBwcm9wZXJ0aWVzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFwcm9wZXJ0aWVzLnRoZW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHRoZW1lIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICBdLCBUaGVtZWQpO1xuICAgIHJldHVybiBUaGVtZWQ7XG59XG5leHBvcnQgZGVmYXVsdCBUaGVtZWRNaXhpbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRoZW1lZC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL21peGlucy9UaGVtZWQubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvbWl4aW5zL1RoZW1lZC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgV2lkZ2V0QmFzZSwgbm9CaW5kIH0gZnJvbSAnLi9XaWRnZXRCYXNlJztcbmltcG9ydCB7IFByb2plY3Rvck1peGluIH0gZnJvbSAnLi9taXhpbnMvUHJvamVjdG9yJztcbmltcG9ydCB7IGZyb20gfSBmcm9tICcuLi9zaGltL2FycmF5JztcbmltcG9ydCB7IHcsIGRvbSB9IGZyb20gJy4vZCc7XG5pbXBvcnQgZ2xvYmFsIGZyb20gJy4uL3NoaW0vZ2xvYmFsJztcbmltcG9ydCB7IHJlZ2lzdGVyVGhlbWVJbmplY3RvciB9IGZyb20gJy4vbWl4aW5zL1RoZW1lZCc7XG5pbXBvcnQgeyBhbHdheXNSZW5kZXIgfSBmcm9tICcuL2RlY29yYXRvcnMvYWx3YXlzUmVuZGVyJztcbmV4cG9ydCB2YXIgQ3VzdG9tRWxlbWVudENoaWxkVHlwZTtcbihmdW5jdGlvbiAoQ3VzdG9tRWxlbWVudENoaWxkVHlwZSkge1xuICAgIEN1c3RvbUVsZW1lbnRDaGlsZFR5cGVbXCJET0pPXCJdID0gXCJET0pPXCI7XG4gICAgQ3VzdG9tRWxlbWVudENoaWxkVHlwZVtcIk5PREVcIl0gPSBcIk5PREVcIjtcbiAgICBDdXN0b21FbGVtZW50Q2hpbGRUeXBlW1wiVEVYVFwiXSA9IFwiVEVYVFwiO1xufSkoQ3VzdG9tRWxlbWVudENoaWxkVHlwZSB8fCAoQ3VzdG9tRWxlbWVudENoaWxkVHlwZSA9IHt9KSk7XG5leHBvcnQgZnVuY3Rpb24gRG9tVG9XaWRnZXRXcmFwcGVyKGRvbU5vZGUpIHtcbiAgICBsZXQgRG9tVG9XaWRnZXRXcmFwcGVyID0gY2xhc3MgRG9tVG9XaWRnZXRXcmFwcGVyIGV4dGVuZHMgV2lkZ2V0QmFzZSB7XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyh0aGlzLnByb3BlcnRpZXMpLnJlZHVjZSgocHJvcHMsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5wcm9wZXJ0aWVzW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKGtleS5pbmRleE9mKCdvbicpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IGBfXyR7a2V5fWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByb3BzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvcHM7XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICByZXR1cm4gZG9tKHsgbm9kZTogZG9tTm9kZSwgcHJvcHM6IHByb3BlcnRpZXMsIGRpZmZUeXBlOiAnZG9tJyB9KTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZ2V0IGRvbU5vZGUoKSB7XG4gICAgICAgICAgICByZXR1cm4gZG9tTm9kZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRG9tVG9XaWRnZXRXcmFwcGVyID0gdHNsaWJfMS5fX2RlY29yYXRlKFtcbiAgICAgICAgYWx3YXlzUmVuZGVyKClcbiAgICBdLCBEb21Ub1dpZGdldFdyYXBwZXIpO1xuICAgIHJldHVybiBEb21Ub1dpZGdldFdyYXBwZXI7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKGRlc2NyaXB0b3IsIFdpZGdldENvbnN0cnVjdG9yKSB7XG4gICAgY29uc3QgeyBhdHRyaWJ1dGVzLCBjaGlsZFR5cGUsIHJlZ2lzdHJ5RmFjdG9yeSB9ID0gZGVzY3JpcHRvcjtcbiAgICBjb25zdCBhdHRyaWJ1dGVNYXAgPSB7fTtcbiAgICBhdHRyaWJ1dGVzLmZvckVhY2goKHByb3BlcnR5TmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGF0dHJpYnV0ZU1hcFthdHRyaWJ1dGVOYW1lXSA9IHByb3BlcnR5TmFtZTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkcmVuID0gW107XG4gICAgICAgICAgICB0aGlzLl9ldmVudFByb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxpc2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5faW5pdGlhbGlzZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBkb21Qcm9wZXJ0aWVzID0ge307XG4gICAgICAgICAgICBjb25zdCB7IGF0dHJpYnV0ZXMsIHByb3BlcnRpZXMsIGV2ZW50cyB9ID0gZGVzY3JpcHRvcjtcbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9wcm9wZXJ0aWVzLCB0aGlzLl9hdHRyaWJ1dGVzVG9Qcm9wZXJ0aWVzKGF0dHJpYnV0ZXMpKTtcbiAgICAgICAgICAgIFsuLi5hdHRyaWJ1dGVzLCAuLi5wcm9wZXJ0aWVzXS5mb3JFYWNoKChwcm9wZXJ0eU5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXNbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZFByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZS5yZXBsYWNlKC9eb24vLCAnX18nKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlcmVkUHJvcGVydHlOYW1lICE9PSBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tUHJvcGVydGllc1tmaWx0ZXJlZFByb3BlcnR5TmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXQ6ICgpID0+IHRoaXMuX2dldFByb3BlcnR5KHByb3BlcnR5TmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXQ6ICh2YWx1ZSkgPT4gdGhpcy5fc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZG9tUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICBnZXQ6ICgpID0+IHRoaXMuX2dldFByb3BlcnR5KHByb3BlcnR5TmFtZSksXG4gICAgICAgICAgICAgICAgICAgIHNldDogKHZhbHVlKSA9PiB0aGlzLl9zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGV2ZW50cy5mb3JFYWNoKChwcm9wZXJ0eU5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBwcm9wZXJ0eU5hbWUucmVwbGFjZSgvXm9uLywgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRQcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUucmVwbGFjZSgvXm9uLywgJ19fb24nKTtcbiAgICAgICAgICAgICAgICBkb21Qcm9wZXJ0aWVzW2ZpbHRlcmVkUHJvcGVydHlOYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiAoKSA9PiB0aGlzLl9nZXRFdmVudFByb3BlcnR5KHByb3BlcnR5TmFtZSksXG4gICAgICAgICAgICAgICAgICAgIHNldDogKHZhbHVlKSA9PiB0aGlzLl9zZXRFdmVudFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLl9ldmVudFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudENhbGxiYWNrID0gdGhpcy5fZ2V0RXZlbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV2ZW50Q2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Q2FsbGJhY2soLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBhcmdzXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCBkb21Qcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY2hpbGRUeXBlID09PSBDdXN0b21FbGVtZW50Q2hpbGRUeXBlLlRFWFQgPyB0aGlzLmNoaWxkTm9kZXMgOiB0aGlzLmNoaWxkcmVuO1xuICAgICAgICAgICAgZnJvbShjaGlsZHJlbikuZm9yRWFjaCgoY2hpbGROb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkVHlwZSA9PT0gQ3VzdG9tRWxlbWVudENoaWxkVHlwZS5ET0pPKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkTm9kZS5hZGRFdmVudExpc3RlbmVyKCdkb2pvLWNlLXJlbmRlcicsICgpID0+IHRoaXMuX3JlbmRlcigpKTtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGROb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2Rvam8tY2UtY29ubmVjdGVkJywgKCkgPT4gdGhpcy5fcmVuZGVyKCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGlsZHJlbi5wdXNoKERvbVRvV2lkZ2V0V3JhcHBlcihjaGlsZE5vZGUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoaWxkcmVuLnB1c2goZG9tKHsgbm9kZTogY2hpbGROb2RlLCBkaWZmVHlwZTogJ2RvbScgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdkb2pvLWNlLWNvbm5lY3RlZCcsIChlKSA9PiB0aGlzLl9jaGlsZENvbm5lY3RlZChlKSk7XG4gICAgICAgICAgICBjb25zdCB3aWRnZXRQcm9wZXJ0aWVzID0gdGhpcy5fcHJvcGVydGllcztcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlckNoaWxkcmVuID0gKCkgPT4gdGhpcy5fX2NoaWxkcmVuX18oKTtcbiAgICAgICAgICAgIGNvbnN0IFdyYXBwZXIgPSBjbGFzcyBleHRlbmRzIFdpZGdldEJhc2Uge1xuICAgICAgICAgICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHcoV2lkZ2V0Q29uc3RydWN0b3IsIHdpZGdldFByb3BlcnRpZXMsIHJlbmRlckNoaWxkcmVuKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCByZWdpc3RyeSA9IHJlZ2lzdHJ5RmFjdG9yeSgpO1xuICAgICAgICAgICAgY29uc3QgdGhlbWVDb250ZXh0ID0gcmVnaXN0ZXJUaGVtZUluamVjdG9yKHRoaXMuX2dldFRoZW1lKCksIHJlZ2lzdHJ5KTtcbiAgICAgICAgICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdkb2pvLXRoZW1lLXNldCcsICgpID0+IHRoZW1lQ29udGV4dC5zZXQodGhpcy5fZ2V0VGhlbWUoKSkpO1xuICAgICAgICAgICAgY29uc3QgUHJvamVjdG9yID0gUHJvamVjdG9yTWl4aW4oV3JhcHBlcik7XG4gICAgICAgICAgICB0aGlzLl9wcm9qZWN0b3IgPSBuZXcgUHJvamVjdG9yKCk7XG4gICAgICAgICAgICB0aGlzLl9wcm9qZWN0b3Iuc2V0UHJvcGVydGllcyh7IHJlZ2lzdHJ5IH0pO1xuICAgICAgICAgICAgdGhpcy5fcHJvamVjdG9yLmFwcGVuZCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxpc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2Rvam8tY2UtY29ubmVjdGVkJywge1xuICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgZGV0YWlsOiB0aGlzXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgX2dldFRoZW1lKCkge1xuICAgICAgICAgICAgaWYgKGdsb2JhbCAmJiBnbG9iYWwuZG9qb2NlICYmIGdsb2JhbC5kb2pvY2UudGhlbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2xvYmFsLmRvam9jZS50aGVtZXNbZ2xvYmFsLmRvam9jZS50aGVtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX2NoaWxkQ29ubmVjdGVkKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBlLmRldGFpbDtcbiAgICAgICAgICAgIGlmIChub2RlLnBhcmVudE5vZGUgPT09IHRoaXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdHMgPSB0aGlzLl9jaGlsZHJlbi5zb21lKChjaGlsZCkgPT4gY2hpbGQuZG9tTm9kZSA9PT0gbm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdkb2pvLWNlLXJlbmRlcicsICgpID0+IHRoaXMuX3JlbmRlcigpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hpbGRyZW4ucHVzaChEb21Ub1dpZGdldFdyYXBwZXIobm9kZSkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX3JlbmRlcigpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9wcm9qZWN0b3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9qZWN0b3IuaW52YWxpZGF0ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2Rvam8tY2UtcmVuZGVyJywge1xuICAgICAgICAgICAgICAgICAgICBidWJibGVzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB0aGlzXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9fcHJvcGVydGllc19fKCkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3Byb3BlcnRpZXMsIHRoaXMuX2V2ZW50UHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICAgICAgX19jaGlsZHJlbl9fKCkge1xuICAgICAgICAgICAgaWYgKGNoaWxkVHlwZSA9PT0gQ3VzdG9tRWxlbWVudENoaWxkVHlwZS5ET0pPKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuLmZpbHRlcigoQ2hpbGQpID0+IENoaWxkLmRvbU5vZGUuaXNXaWRnZXQpLm1hcCgoQ2hpbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkb21Ob2RlIH0gPSBDaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHcoQ2hpbGQsIE9iamVjdC5hc3NpZ24oe30sIGRvbU5vZGUuX19wcm9wZXJ0aWVzX18oKSksIFsuLi5kb21Ob2RlLl9fY2hpbGRyZW5fXygpXSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZFZhbHVlLCB2YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gYXR0cmlidXRlTWFwW25hbWVdO1xuICAgICAgICAgICAgdGhpcy5fc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgX3NldEV2ZW50UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fZXZlbnRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBfZ2V0RXZlbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ldmVudFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBfc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHZhbHVlW25vQmluZF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBfZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIF9hdHRyaWJ1dGVzVG9Qcm9wZXJ0aWVzKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzLnJlZHVjZSgocHJvcGVydGllcywgcHJvcGVydHlOYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IHByb3BlcnR5TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGVydGllcztcbiAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhhdHRyaWJ1dGVNYXApO1xuICAgICAgICB9XG4gICAgICAgIGdldCBpc1dpZGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlcihXaWRnZXRDb25zdHJ1Y3Rvcikge1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBXaWRnZXRDb25zdHJ1Y3Rvci5wcm90b3R5cGUgJiYgV2lkZ2V0Q29uc3RydWN0b3IucHJvdG90eXBlLl9fY3VzdG9tRWxlbWVudERlc2NyaXB0b3I7XG4gICAgaWYgKCFkZXNjcmlwdG9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdldCBkZXNjcmlwdG9yIGZvciBDdXN0b20gRWxlbWVudCwgaGF2ZSB5b3UgYWRkZWQgdGhlIEBjdXN0b21FbGVtZW50IGRlY29yYXRvciB0byB5b3VyIFdpZGdldD8nKTtcbiAgICB9XG4gICAgZ2xvYmFsLmN1c3RvbUVsZW1lbnRzLmRlZmluZShkZXNjcmlwdG9yLnRhZ05hbWUsIGNyZWF0ZShkZXNjcmlwdG9yLCBXaWRnZXRDb25zdHJ1Y3RvcikpO1xufVxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWdpc3RlckN1c3RvbUVsZW1lbnQubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9yZWdpc3RlckN1c3RvbUVsZW1lbnQubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvcmVnaXN0ZXJDdXN0b21FbGVtZW50Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi4vc2hpbS9nbG9iYWwnO1xuaW1wb3J0IHsgZnJvbSBhcyBhcnJheUZyb20gfSBmcm9tICcuLi9zaGltL2FycmF5JztcbmltcG9ydCB7IGlzV05vZGUsIGlzVk5vZGUsIGlzRG9tVk5vZGUsIFZOT0RFLCBXTk9ERSB9IGZyb20gJy4vZCc7XG5pbXBvcnQgeyBpc1dpZGdldEJhc2VDb25zdHJ1Y3RvciB9IGZyb20gJy4vUmVnaXN0cnknO1xuaW1wb3J0IFdlYWtNYXAgZnJvbSAnLi4vc2hpbS9XZWFrTWFwJztcbmNvbnN0IE5BTUVTUEFDRV9XMyA9ICdodHRwOi8vd3d3LnczLm9yZy8nO1xuY29uc3QgTkFNRVNQQUNFX1NWRyA9IE5BTUVTUEFDRV9XMyArICcyMDAwL3N2Zyc7XG5jb25zdCBOQU1FU1BBQ0VfWExJTksgPSBOQU1FU1BBQ0VfVzMgKyAnMTk5OS94bGluayc7XG5jb25zdCBlbXB0eUFycmF5ID0gW107XG5jb25zdCBub2RlT3BlcmF0aW9ucyA9IFsnZm9jdXMnLCAnYmx1cicsICdzY3JvbGxJbnRvVmlldycsICdjbGljayddO1xuZXhwb3J0IGNvbnN0IHdpZGdldEluc3RhbmNlTWFwID0gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IGluc3RhbmNlTWFwID0gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IG5leHRTaWJsaW5nTWFwID0gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHByb2plY3RvclN0YXRlTWFwID0gbmV3IFdlYWtNYXAoKTtcbmZ1bmN0aW9uIHNhbWUoZG5vZGUxLCBkbm9kZTIpIHtcbiAgICBpZiAoaXNWTm9kZShkbm9kZTEpICYmIGlzVk5vZGUoZG5vZGUyKSkge1xuICAgICAgICBpZiAoaXNEb21WTm9kZShkbm9kZTEpIHx8IGlzRG9tVk5vZGUoZG5vZGUyKSkge1xuICAgICAgICAgICAgaWYgKGRub2RlMS5kb21Ob2RlICE9PSBkbm9kZTIuZG9tTm9kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZG5vZGUxLnRhZyAhPT0gZG5vZGUyLnRhZykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkbm9kZTEucHJvcGVydGllcy5rZXkgIT09IGRub2RlMi5wcm9wZXJ0aWVzLmtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1dOb2RlKGRub2RlMSkgJiYgaXNXTm9kZShkbm9kZTIpKSB7XG4gICAgICAgIGlmIChkbm9kZTEuaW5zdGFuY2UgPT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZG5vZGUyLndpZGdldENvbnN0cnVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkbm9kZTEud2lkZ2V0Q29uc3RydWN0b3IgIT09IGRub2RlMi53aWRnZXRDb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkbm9kZTEucHJvcGVydGllcy5rZXkgIT09IGRub2RlMi5wcm9wZXJ0aWVzLmtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5jb25zdCBtaXNzaW5nVHJhbnNpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb3ZpZGUgYSB0cmFuc2l0aW9ucyBvYmplY3QgdG8gdGhlIHByb2plY3Rpb25PcHRpb25zIHRvIGRvIGFuaW1hdGlvbnMnKTtcbn07XG5mdW5jdGlvbiBnZXRQcm9qZWN0aW9uT3B0aW9ucyhwcm9qZWN0b3JPcHRpb25zLCBwcm9qZWN0b3JJbnN0YW5jZSkge1xuICAgIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgICAgICBuYW1lc3BhY2U6IHVuZGVmaW5lZCxcbiAgICAgICAgc3R5bGVBcHBseWVyOiBmdW5jdGlvbiAoZG9tTm9kZSwgc3R5bGVOYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgZG9tTm9kZS5zdHlsZVtzdHlsZU5hbWVdID0gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zaXRpb25zOiB7XG4gICAgICAgICAgICBlbnRlcjogbWlzc2luZ1RyYW5zaXRpb24sXG4gICAgICAgICAgICBleGl0OiBtaXNzaW5nVHJhbnNpdGlvblxuICAgICAgICB9LFxuICAgICAgICBkZXB0aDogMCxcbiAgICAgICAgbWVyZ2U6IGZhbHNlLFxuICAgICAgICBzeW5jOiBmYWxzZSxcbiAgICAgICAgcHJvamVjdG9ySW5zdGFuY2VcbiAgICB9O1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0cywgcHJvamVjdG9yT3B0aW9ucyk7XG59XG5mdW5jdGlvbiBjaGVja1N0eWxlVmFsdWUoc3R5bGVWYWx1ZSkge1xuICAgIGlmICh0eXBlb2Ygc3R5bGVWYWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdHlsZSB2YWx1ZXMgbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfVxufVxuZnVuY3Rpb24gdXBkYXRlRXZlbnQoZG9tTm9kZSwgZXZlbnROYW1lLCBjdXJyZW50VmFsdWUsIHByb2plY3Rpb25PcHRpb25zLCBiaW5kLCBwcmV2aW91c1ZhbHVlKSB7XG4gICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xuICAgIGNvbnN0IGV2ZW50TWFwID0gcHJvamVjdG9yU3RhdGUubm9kZU1hcC5nZXQoZG9tTm9kZSkgfHwgbmV3IFdlYWtNYXAoKTtcbiAgICBpZiAocHJldmlvdXNWYWx1ZSkge1xuICAgICAgICBjb25zdCBwcmV2aW91c0V2ZW50ID0gZXZlbnRNYXAuZ2V0KHByZXZpb3VzVmFsdWUpO1xuICAgICAgICBkb21Ob2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBwcmV2aW91c0V2ZW50KTtcbiAgICB9XG4gICAgbGV0IGNhbGxiYWNrID0gY3VycmVudFZhbHVlLmJpbmQoYmluZCk7XG4gICAgaWYgKGV2ZW50TmFtZSA9PT0gJ2lucHV0Jykge1xuICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uIChldnQpIHtcbiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZS5jYWxsKHRoaXMsIGV2dCk7XG4gICAgICAgICAgICBldnQudGFyZ2V0WydvbmlucHV0LXZhbHVlJ10gPSBldnQudGFyZ2V0LnZhbHVlO1xuICAgICAgICB9LmJpbmQoYmluZCk7XG4gICAgfVxuICAgIGRvbU5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrKTtcbiAgICBldmVudE1hcC5zZXQoY3VycmVudFZhbHVlLCBjYWxsYmFjayk7XG4gICAgcHJvamVjdG9yU3RhdGUubm9kZU1hcC5zZXQoZG9tTm9kZSwgZXZlbnRNYXApO1xufVxuZnVuY3Rpb24gYWRkQ2xhc3Nlcyhkb21Ob2RlLCBjbGFzc2VzKSB7XG4gICAgaWYgKGNsYXNzZXMpIHtcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IGNsYXNzZXMuc3BsaXQoJyAnKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGFzc05hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBkb21Ob2RlLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiByZW1vdmVDbGFzc2VzKGRvbU5vZGUsIGNsYXNzZXMpIHtcbiAgICBpZiAoY2xhc3Nlcykge1xuICAgICAgICBjb25zdCBjbGFzc05hbWVzID0gY2xhc3Nlcy5zcGxpdCgnICcpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsYXNzTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGRvbU5vZGUuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWVzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGJ1aWxkUHJldmlvdXNQcm9wZXJ0aWVzKGRvbU5vZGUsIHByZXZpb3VzLCBjdXJyZW50KSB7XG4gICAgY29uc3QgeyBkaWZmVHlwZSwgcHJvcGVydGllcywgYXR0cmlidXRlcyB9ID0gY3VycmVudDtcbiAgICBpZiAoIWRpZmZUeXBlIHx8IGRpZmZUeXBlID09PSAndmRvbScpIHtcbiAgICAgICAgcmV0dXJuIHsgcHJvcGVydGllczogcHJldmlvdXMucHJvcGVydGllcywgYXR0cmlidXRlczogcHJldmlvdXMuYXR0cmlidXRlcywgZXZlbnRzOiBwcmV2aW91cy5ldmVudHMgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZGlmZlR5cGUgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4geyBwcm9wZXJ0aWVzOiB7fSwgYXR0cmlidXRlczogcHJldmlvdXMuYXR0cmlidXRlcyA/IHt9IDogdW5kZWZpbmVkLCBldmVudHM6IHByZXZpb3VzLmV2ZW50cyB9O1xuICAgIH1cbiAgICBsZXQgbmV3UHJvcGVydGllcyA9IHtcbiAgICAgICAgcHJvcGVydGllczoge31cbiAgICB9O1xuICAgIGlmIChhdHRyaWJ1dGVzKSB7XG4gICAgICAgIG5ld1Byb3BlcnRpZXMuYXR0cmlidXRlcyA9IHt9O1xuICAgICAgICBuZXdQcm9wZXJ0aWVzLmV2ZW50cyA9IHByZXZpb3VzLmV2ZW50cztcbiAgICAgICAgT2JqZWN0LmtleXMocHJvcGVydGllcykuZm9yRWFjaCgocHJvcE5hbWUpID0+IHtcbiAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wTmFtZV0gPSBkb21Ob2RlW3Byb3BOYW1lXTtcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goKGF0dHJOYW1lKSA9PiB7XG4gICAgICAgICAgICBuZXdQcm9wZXJ0aWVzLmF0dHJpYnV0ZXNbYXR0ck5hbWVdID0gZG9tTm9kZS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ld1Byb3BlcnRpZXM7XG4gICAgfVxuICAgIG5ld1Byb3BlcnRpZXMucHJvcGVydGllcyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpLnJlZHVjZSgocHJvcHMsIHByb3BlcnR5KSA9PiB7XG4gICAgICAgIHByb3BzW3Byb3BlcnR5XSA9IGRvbU5vZGUuZ2V0QXR0cmlidXRlKHByb3BlcnR5KSB8fCBkb21Ob2RlW3Byb3BlcnR5XTtcbiAgICAgICAgcmV0dXJuIHByb3BzO1xuICAgIH0sIHt9KTtcbiAgICByZXR1cm4gbmV3UHJvcGVydGllcztcbn1cbmZ1bmN0aW9uIG5vZGVPcGVyYXRpb24ocHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJldmlvdXNWYWx1ZSwgZG9tTm9kZSwgcHJvamVjdGlvbk9wdGlvbnMpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmICh0eXBlb2YgcHJvcFZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJlc3VsdCA9IHByb3BWYWx1ZSgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gcHJvcFZhbHVlICYmICFwcmV2aW91c1ZhbHVlO1xuICAgIH1cbiAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcbiAgICAgICAgcHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICBkb21Ob2RlW3Byb3BOYW1lXSgpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiByZW1vdmVPcnBoYW5lZEV2ZW50cyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMsIHByb3BlcnRpZXMsIHByb2plY3Rpb25PcHRpb25zLCBvbmx5RXZlbnRzID0gZmFsc2UpIHtcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XG4gICAgY29uc3QgZXZlbnRNYXAgPSBwcm9qZWN0b3JTdGF0ZS5ub2RlTWFwLmdldChkb21Ob2RlKTtcbiAgICBpZiAoZXZlbnRNYXApIHtcbiAgICAgICAgT2JqZWN0LmtleXMocHJldmlvdXNQcm9wZXJ0aWVzKS5mb3JFYWNoKChwcm9wTmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXNFdmVudCA9IHByb3BOYW1lLnN1YnN0cigwLCAyKSA9PT0gJ29uJyB8fCBvbmx5RXZlbnRzO1xuICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0gb25seUV2ZW50cyA/IHByb3BOYW1lIDogcHJvcE5hbWUuc3Vic3RyKDIpO1xuICAgICAgICAgICAgaWYgKGlzRXZlbnQgJiYgIXByb3BlcnRpZXNbcHJvcE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRDYWxsYmFjayA9IGV2ZW50TWFwLmdldChwcmV2aW91c1Byb3BlcnRpZXNbcHJvcE5hbWVdKTtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICBkb21Ob2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBldmVudENhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHVwZGF0ZUF0dHJpYnV0ZShkb21Ob2RlLCBhdHRyTmFtZSwgYXR0clZhbHVlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xuICAgIGlmIChwcm9qZWN0aW9uT3B0aW9ucy5uYW1lc3BhY2UgPT09IE5BTUVTUEFDRV9TVkcgJiYgYXR0ck5hbWUgPT09ICdocmVmJykge1xuICAgICAgICBkb21Ob2RlLnNldEF0dHJpYnV0ZU5TKE5BTUVTUEFDRV9YTElOSywgYXR0ck5hbWUsIGF0dHJWYWx1ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKChhdHRyTmFtZSA9PT0gJ3JvbGUnICYmIGF0dHJWYWx1ZSA9PT0gJycpIHx8IGF0dHJWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRvbU5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGRvbU5vZGUuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHVwZGF0ZUF0dHJpYnV0ZXMoZG9tTm9kZSwgcHJldmlvdXNBdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzLCBwcm9qZWN0aW9uT3B0aW9ucykge1xuICAgIGNvbnN0IGF0dHJOYW1lcyA9IE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpO1xuICAgIGNvbnN0IGF0dHJDb3VudCA9IGF0dHJOYW1lcy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyQ291bnQ7IGkrKykge1xuICAgICAgICBjb25zdCBhdHRyTmFtZSA9IGF0dHJOYW1lc1tpXTtcbiAgICAgICAgY29uc3QgYXR0clZhbHVlID0gYXR0cmlidXRlc1thdHRyTmFtZV07XG4gICAgICAgIGNvbnN0IHByZXZpb3VzQXR0clZhbHVlID0gcHJldmlvdXNBdHRyaWJ1dGVzW2F0dHJOYW1lXTtcbiAgICAgICAgaWYgKGF0dHJWYWx1ZSAhPT0gcHJldmlvdXNBdHRyVmFsdWUpIHtcbiAgICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZShkb21Ob2RlLCBhdHRyTmFtZSwgYXR0clZhbHVlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB1cGRhdGVQcm9wZXJ0aWVzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcywgcHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMsIGluY2x1ZGVzRXZlbnRzQW5kQXR0cmlidXRlcyA9IHRydWUpIHtcbiAgICBsZXQgcHJvcGVydGllc1VwZGF0ZWQgPSBmYWxzZTtcbiAgICBjb25zdCBwcm9wTmFtZXMgPSBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKTtcbiAgICBjb25zdCBwcm9wQ291bnQgPSBwcm9wTmFtZXMubGVuZ3RoO1xuICAgIGlmIChwcm9wTmFtZXMuaW5kZXhPZignY2xhc3NlcycpID09PSAtMSAmJiBwcmV2aW91c1Byb3BlcnRpZXMuY2xhc3Nlcykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcmV2aW91c1Byb3BlcnRpZXMuY2xhc3NlcykpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldmlvdXNQcm9wZXJ0aWVzLmNsYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICByZW1vdmVDbGFzc2VzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcy5jbGFzc2VzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlbW92ZUNsYXNzZXMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLmNsYXNzZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGluY2x1ZGVzRXZlbnRzQW5kQXR0cmlidXRlcyAmJiByZW1vdmVPcnBoYW5lZEV2ZW50cyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMsIHByb3BlcnRpZXMsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BDb3VudDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHByb3BOYW1lID0gcHJvcE5hbWVzW2ldO1xuICAgICAgICBsZXQgcHJvcFZhbHVlID0gcHJvcGVydGllc1twcm9wTmFtZV07XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBwcmV2aW91c1Byb3BlcnRpZXNbcHJvcE5hbWVdO1xuICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdjbGFzc2VzJykge1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNDbGFzc2VzID0gQXJyYXkuaXNBcnJheShwcmV2aW91c1ZhbHVlKSA/IHByZXZpb3VzVmFsdWUgOiBbcHJldmlvdXNWYWx1ZV07XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50Q2xhc3NlcyA9IEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSA/IHByb3BWYWx1ZSA6IFtwcm9wVmFsdWVdO1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzQ2xhc3NlcyAmJiBwcmV2aW91c0NsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGlmICghcHJvcFZhbHVlIHx8IHByb3BWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2aW91c0NsYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzZXMoZG9tTm9kZSwgcHJldmlvdXNDbGFzc2VzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Q2xhc3NlcyA9IFsuLi5jdXJyZW50Q2xhc3Nlc107XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldmlvdXNDbGFzc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c0NsYXNzTmFtZSA9IHByZXZpb3VzQ2xhc3Nlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c0NsYXNzTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzSW5kZXggPSBuZXdDbGFzc2VzLmluZGV4T2YocHJldmlvdXNDbGFzc05hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc0luZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDbGFzc2VzKGRvbU5vZGUsIHByZXZpb3VzQ2xhc3NOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NsYXNzZXMuc3BsaWNlKGNsYXNzSW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld0NsYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZENsYXNzZXMoZG9tTm9kZSwgbmV3Q2xhc3Nlc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnJlbnRDbGFzc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZENsYXNzZXMoZG9tTm9kZSwgY3VycmVudENsYXNzZXNbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlT3BlcmF0aW9ucy5pbmRleE9mKHByb3BOYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIG5vZGVPcGVyYXRpb24ocHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJldmlvdXNWYWx1ZSwgZG9tTm9kZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHByb3BOYW1lID09PSAnc3R5bGVzJykge1xuICAgICAgICAgICAgY29uc3Qgc3R5bGVOYW1lcyA9IE9iamVjdC5rZXlzKHByb3BWYWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBzdHlsZUNvdW50ID0gc3R5bGVOYW1lcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHN0eWxlQ291bnQ7IGorKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlTmFtZSA9IHN0eWxlTmFtZXNbal07XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3U3R5bGVWYWx1ZSA9IHByb3BWYWx1ZVtzdHlsZU5hbWVdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9sZFN0eWxlVmFsdWUgPSBwcmV2aW91c1ZhbHVlICYmIHByZXZpb3VzVmFsdWVbc3R5bGVOYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAobmV3U3R5bGVWYWx1ZSA9PT0gb2xkU3R5bGVWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvcGVydGllc1VwZGF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChuZXdTdHlsZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrU3R5bGVWYWx1ZShuZXdTdHlsZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbk9wdGlvbnMuc3R5bGVBcHBseWVyKGRvbU5vZGUsIHN0eWxlTmFtZSwgbmV3U3R5bGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uT3B0aW9ucy5zdHlsZUFwcGx5ZXIoZG9tTm9kZSwgc3R5bGVOYW1lLCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFwcm9wVmFsdWUgJiYgdHlwZW9mIHByZXZpb3VzVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcHJvcFZhbHVlID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkb21WYWx1ZSA9IGRvbU5vZGVbcHJvcE5hbWVdO1xuICAgICAgICAgICAgICAgIGlmIChkb21WYWx1ZSAhPT0gcHJvcFZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgIChkb21Ob2RlWydvbmlucHV0LXZhbHVlJ11cbiAgICAgICAgICAgICAgICAgICAgICAgID8gZG9tVmFsdWUgPT09IGRvbU5vZGVbJ29uaW5wdXQtdmFsdWUnXVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBwcm9wVmFsdWUgIT09IHByZXZpb3VzVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbU5vZGVbcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBkb21Ob2RlWydvbmlucHV0LXZhbHVlJ10gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwcm9wVmFsdWUgIT09IHByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc1VwZGF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHByb3BOYW1lICE9PSAna2V5JyAmJiBwcm9wVmFsdWUgIT09IHByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gdHlwZW9mIHByb3BWYWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiBwcm9wTmFtZS5sYXN0SW5kZXhPZignb24nLCAwKSA9PT0gMCAmJiBpbmNsdWRlc0V2ZW50c0FuZEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlRXZlbnQoZG9tTm9kZSwgcHJvcE5hbWUuc3Vic3RyKDIpLCBwcm9wVmFsdWUsIHByb2plY3Rpb25PcHRpb25zLCBwcm9wZXJ0aWVzLmJpbmQsIHByZXZpb3VzVmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiBwcm9wTmFtZSAhPT0gJ2lubmVySFRNTCcgJiYgaW5jbHVkZXNFdmVudHNBbmRBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZShkb21Ob2RlLCBwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByb3BOYW1lID09PSAnc2Nyb2xsTGVmdCcgfHwgcHJvcE5hbWUgPT09ICdzY3JvbGxUb3AnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb21Ob2RlW3Byb3BOYW1lXSAhPT0gcHJvcFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb21Ob2RlW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tTm9kZVtwcm9wTmFtZV0gPSBwcm9wVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXNVcGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcGVydGllc1VwZGF0ZWQ7XG59XG5mdW5jdGlvbiBmaW5kSW5kZXhPZkNoaWxkKGNoaWxkcmVuLCBzYW1lQXMsIHN0YXJ0KSB7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNhbWUoY2hpbGRyZW5baV0sIHNhbWVBcykpIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0b1BhcmVudFZOb2RlKGRvbU5vZGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0YWc6ICcnLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgY2hpbGRyZW46IHVuZGVmaW5lZCxcbiAgICAgICAgZG9tTm9kZSxcbiAgICAgICAgdHlwZTogVk5PREVcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvVGV4dFZOb2RlKGRhdGEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0YWc6ICcnLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgY2hpbGRyZW46IHVuZGVmaW5lZCxcbiAgICAgICAgdGV4dDogYCR7ZGF0YX1gLFxuICAgICAgICBkb21Ob2RlOiB1bmRlZmluZWQsXG4gICAgICAgIHR5cGU6IFZOT0RFXG4gICAgfTtcbn1cbmZ1bmN0aW9uIHRvSW50ZXJuYWxXTm9kZShpbnN0YW5jZSwgaW5zdGFuY2VEYXRhKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgIHJlbmRlcmVkOiBbXSxcbiAgICAgICAgY29yZVByb3BlcnRpZXM6IGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcyxcbiAgICAgICAgY2hpbGRyZW46IGluc3RhbmNlLmNoaWxkcmVuLFxuICAgICAgICB3aWRnZXRDb25zdHJ1Y3RvcjogaW5zdGFuY2UuY29uc3RydWN0b3IsXG4gICAgICAgIHByb3BlcnRpZXM6IGluc3RhbmNlRGF0YS5pbnB1dFByb3BlcnRpZXMsXG4gICAgICAgIHR5cGU6IFdOT0RFXG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJBbmREZWNvcmF0ZUNoaWxkcmVuKGNoaWxkcmVuLCBpbnN0YW5jZSkge1xuICAgIGlmIChjaGlsZHJlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBlbXB0eUFycmF5O1xuICAgIH1cbiAgICBjaGlsZHJlbiA9IEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pID8gY2hpbGRyZW4gOiBbY2hpbGRyZW5dO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCB8fCBjaGlsZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY2hpbGRyZW4uc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hpbGRyZW5baV0gPSB0b1RleHRWTm9kZShjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNWTm9kZShjaGlsZCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQucHJvcGVydGllcy5iaW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQucHJvcGVydGllcy5iaW5kID0gaW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5jaGlsZHJlbiAmJiBjaGlsZC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJBbmREZWNvcmF0ZUNoaWxkcmVuKGNoaWxkLmNoaWxkcmVuLCBpbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNoaWxkLmNvcmVQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldChpbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLmNvcmVQcm9wZXJ0aWVzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmluZDogaW5zdGFuY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXNlUmVnaXN0cnk6IGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcy5iYXNlUmVnaXN0cnlcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuICYmIGNoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihjaGlsZC5jaGlsZHJlbiwgaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpKys7XG4gICAgfVxuICAgIHJldHVybiBjaGlsZHJlbjtcbn1cbmZ1bmN0aW9uIG5vZGVBZGRlZChkbm9kZSwgdHJhbnNpdGlvbnMpIHtcbiAgICBpZiAoaXNWTm9kZShkbm9kZSkgJiYgZG5vZGUucHJvcGVydGllcykge1xuICAgICAgICBjb25zdCBlbnRlckFuaW1hdGlvbiA9IGRub2RlLnByb3BlcnRpZXMuZW50ZXJBbmltYXRpb247XG4gICAgICAgIGlmIChlbnRlckFuaW1hdGlvbikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbnRlckFuaW1hdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGVudGVyQW5pbWF0aW9uKGRub2RlLmRvbU5vZGUsIGRub2RlLnByb3BlcnRpZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbnMuZW50ZXIoZG5vZGUuZG9tTm9kZSwgZG5vZGUucHJvcGVydGllcywgZW50ZXJBbmltYXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gbm9kZVRvUmVtb3ZlKGRub2RlLCB0cmFuc2l0aW9ucywgcHJvamVjdGlvbk9wdGlvbnMpIHtcbiAgICBpZiAoaXNXTm9kZShkbm9kZSkpIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGluc3RhbmNlTWFwLmdldChkbm9kZS5pbnN0YW5jZSk7XG4gICAgICAgIGNvbnN0IHJlbmRlcmVkID0gKGl0ZW0gPyBpdGVtLmRub2RlLnJlbmRlcmVkIDogZG5vZGUucmVuZGVyZWQpIHx8IGVtcHR5QXJyYXk7XG4gICAgICAgIGlmIChkbm9kZS5pbnN0YW5jZSkge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGRub2RlLmluc3RhbmNlKTtcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5vbkRldGFjaCgpO1xuICAgICAgICAgICAgaW5zdGFuY2VNYXAuZGVsZXRlKGRub2RlLmluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbmRlcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBub2RlVG9SZW1vdmUocmVuZGVyZWRbaV0sIHRyYW5zaXRpb25zLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlO1xuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gZG5vZGUucHJvcGVydGllcztcbiAgICAgICAgaWYgKGRub2RlLmNoaWxkcmVuICYmIGRub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBub2RlVG9SZW1vdmUoZG5vZGUuY2hpbGRyZW5baV0sIHRyYW5zaXRpb25zLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXhpdEFuaW1hdGlvbiA9IHByb3BlcnRpZXMuZXhpdEFuaW1hdGlvbjtcbiAgICAgICAgaWYgKHByb3BlcnRpZXMgJiYgZXhpdEFuaW1hdGlvbikge1xuICAgICAgICAgICAgZG9tTm9kZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlRG9tTm9kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBkb21Ob2RlICYmIGRvbU5vZGUucGFyZW50Tm9kZSAmJiBkb21Ob2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZG9tTm9kZSk7XG4gICAgICAgICAgICAgICAgZG5vZGUuZG9tTm9kZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGV4aXRBbmltYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBleGl0QW5pbWF0aW9uKGRvbU5vZGUsIHJlbW92ZURvbU5vZGUsIHByb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25zLmV4aXQoZG5vZGUuZG9tTm9kZSwgcHJvcGVydGllcywgZXhpdEFuaW1hdGlvbiwgcmVtb3ZlRG9tTm9kZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRvbU5vZGUgJiYgZG9tTm9kZS5wYXJlbnROb2RlICYmIGRvbU5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkb21Ob2RlKTtcbiAgICAgICAgZG5vZGUuZG9tTm9kZSA9IHVuZGVmaW5lZDtcbiAgICB9XG59XG5mdW5jdGlvbiBjaGVja0Rpc3Rpbmd1aXNoYWJsZShjaGlsZE5vZGVzLCBpbmRleFRvQ2hlY2ssIHBhcmVudEluc3RhbmNlKSB7XG4gICAgY29uc3QgY2hpbGROb2RlID0gY2hpbGROb2Rlc1tpbmRleFRvQ2hlY2tdO1xuICAgIGlmIChpc1ZOb2RlKGNoaWxkTm9kZSkgJiYgIWNoaWxkTm9kZS50YWcpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBUZXh0IG5vZGVzIG5lZWQgbm90IGJlIGRpc3Rpbmd1aXNoYWJsZVxuICAgIH1cbiAgICBjb25zdCB7IGtleSB9ID0gY2hpbGROb2RlLnByb3BlcnRpZXM7XG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gbnVsbCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpICE9PSBpbmRleFRvQ2hlY2spIHtcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gY2hpbGROb2Rlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoc2FtZShub2RlLCBjaGlsZE5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBub2RlSWRlbnRpZmllcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50TmFtZSA9IHBhcmVudEluc3RhbmNlLmNvbnN0cnVjdG9yLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNXTm9kZShjaGlsZE5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlSWRlbnRpZmllciA9IGNoaWxkTm9kZS53aWRnZXRDb25zdHJ1Y3Rvci5uYW1lIHx8ICd1bmtub3duJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVJZGVudGlmaWVyID0gY2hpbGROb2RlLnRhZztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEEgd2lkZ2V0ICgke3BhcmVudE5hbWV9KSBoYXMgaGFkIGEgY2hpbGQgYWRkZGVkIG9yIHJlbW92ZWQsIGJ1dCB0aGV5IHdlcmUgbm90IGFibGUgdG8gdW5pcXVlbHkgaWRlbnRpZmllZC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gcHJvdmlkZSBhIHVuaXF1ZSAna2V5JyBwcm9wZXJ0eSB3aGVuIHVzaW5nIHRoZSBzYW1lIHdpZGdldCBvciBlbGVtZW50ICgke25vZGVJZGVudGlmaWVyfSkgbXVsdGlwbGUgdGltZXMgYXMgc2libGluZ3NgKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gdXBkYXRlQ2hpbGRyZW4ocGFyZW50Vk5vZGUsIHNpYmxpbmdzLCBvbGRDaGlsZHJlbiwgbmV3Q2hpbGRyZW4sIHBhcmVudEluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xuICAgIG9sZENoaWxkcmVuID0gb2xkQ2hpbGRyZW4gfHwgZW1wdHlBcnJheTtcbiAgICBuZXdDaGlsZHJlbiA9IG5ld0NoaWxkcmVuO1xuICAgIGNvbnN0IG9sZENoaWxkcmVuTGVuZ3RoID0gb2xkQ2hpbGRyZW4ubGVuZ3RoO1xuICAgIGNvbnN0IG5ld0NoaWxkcmVuTGVuZ3RoID0gbmV3Q2hpbGRyZW4ubGVuZ3RoO1xuICAgIGNvbnN0IHRyYW5zaXRpb25zID0gcHJvamVjdGlvbk9wdGlvbnMudHJhbnNpdGlvbnM7XG4gICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xuICAgIHByb2plY3Rpb25PcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvamVjdGlvbk9wdGlvbnMsIHsgZGVwdGg6IHByb2plY3Rpb25PcHRpb25zLmRlcHRoICsgMSB9KTtcbiAgICBsZXQgb2xkSW5kZXggPSAwO1xuICAgIGxldCBuZXdJbmRleCA9IDA7XG4gICAgbGV0IGk7XG4gICAgbGV0IHRleHRVcGRhdGVkID0gZmFsc2U7XG4gICAgd2hpbGUgKG5ld0luZGV4IDwgbmV3Q2hpbGRyZW5MZW5ndGgpIHtcbiAgICAgICAgbGV0IG9sZENoaWxkID0gb2xkSW5kZXggPCBvbGRDaGlsZHJlbkxlbmd0aCA/IG9sZENoaWxkcmVuW29sZEluZGV4XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgbmV3Q2hpbGQgPSBuZXdDaGlsZHJlbltuZXdJbmRleF07XG4gICAgICAgIGlmIChpc1ZOb2RlKG5ld0NoaWxkKSAmJiB0eXBlb2YgbmV3Q2hpbGQuZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG5ld0NoaWxkLmluc2VydGVkID0gaXNWTm9kZShvbGRDaGlsZCkgJiYgb2xkQ2hpbGQuaW5zZXJ0ZWQ7XG4gICAgICAgICAgICBhZGREZWZlcnJlZFByb3BlcnRpZXMobmV3Q2hpbGQsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob2xkQ2hpbGQgIT09IHVuZGVmaW5lZCAmJiBzYW1lKG9sZENoaWxkLCBuZXdDaGlsZCkpIHtcbiAgICAgICAgICAgIG9sZEluZGV4Kys7XG4gICAgICAgICAgICBuZXdJbmRleCsrO1xuICAgICAgICAgICAgdGV4dFVwZGF0ZWQgPVxuICAgICAgICAgICAgICAgIHVwZGF0ZURvbShvbGRDaGlsZCwgbmV3Q2hpbGQsIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRWTm9kZSwgcGFyZW50SW5zdGFuY2UsIG9sZENoaWxkcmVuLnNsaWNlKG9sZEluZGV4KSwgbmV3Q2hpbGRyZW4uc2xpY2UobmV3SW5kZXgpKSB8fCB0ZXh0VXBkYXRlZDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbmRPbGRJbmRleCA9IGZpbmRJbmRleE9mQ2hpbGQob2xkQ2hpbGRyZW4sIG5ld0NoaWxkLCBvbGRJbmRleCArIDEpO1xuICAgICAgICBjb25zdCBhZGRDaGlsZCA9ICgpID0+IHtcbiAgICAgICAgICAgIGxldCBpbnNlcnRCZWZvcmVEb21Ob2RlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgbGV0IGNoaWxkcmVuQXJyYXkgPSBvbGRDaGlsZHJlbjtcbiAgICAgICAgICAgIGxldCBuZXh0SW5kZXggPSBvbGRJbmRleCArIDE7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSBvbGRDaGlsZHJlbltvbGRJbmRleF07XG4gICAgICAgICAgICBpZiAoIWNoaWxkKSB7XG4gICAgICAgICAgICAgICAgY2hpbGQgPSBzaWJsaW5nc1swXTtcbiAgICAgICAgICAgICAgICBuZXh0SW5kZXggPSAxO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuQXJyYXkgPSBzaWJsaW5ncztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjaGlsZCkge1xuICAgICAgICAgICAgICAgIGxldCBpbnNlcnRCZWZvcmVDaGlsZHJlbiA9IFtjaGlsZF07XG4gICAgICAgICAgICAgICAgd2hpbGUgKGluc2VydEJlZm9yZUNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnNlcnRCZWZvcmUgPSBpbnNlcnRCZWZvcmVDaGlsZHJlbi5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNXTm9kZShpbnNlcnRCZWZvcmUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gaW5zdGFuY2VNYXAuZ2V0KGluc2VydEJlZm9yZS5pbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLmRub2RlLnJlbmRlcmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ2hpbGRyZW4ucHVzaCguLi5pdGVtLmRub2RlLnJlbmRlcmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRCZWZvcmUuZG9tTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRCZWZvcmUuZG9tTm9kZS5wYXJlbnRFbGVtZW50ICE9PSBwYXJlbnRWTm9kZS5kb21Ob2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRCZWZvcmVEb21Ob2RlID0gaW5zZXJ0QmVmb3JlLmRvbU5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydEJlZm9yZUNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiBjaGlsZHJlbkFycmF5W25leHRJbmRleF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEJlZm9yZUNoaWxkcmVuLnB1c2goY2hpbGRyZW5BcnJheVtuZXh0SW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRJbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3JlYXRlRG9tKG5ld0NoaWxkLCBwYXJlbnRWTm9kZSwgbmV3Q2hpbGRyZW4uc2xpY2UobmV3SW5kZXggKyAxKSwgaW5zZXJ0QmVmb3JlRG9tTm9kZSwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudEluc3RhbmNlKTtcbiAgICAgICAgICAgIG5vZGVBZGRlZChuZXdDaGlsZCwgdHJhbnNpdGlvbnMpO1xuICAgICAgICAgICAgY29uc3QgaW5kZXhUb0NoZWNrID0gbmV3SW5kZXg7XG4gICAgICAgICAgICBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjaGVja0Rpc3Rpbmd1aXNoYWJsZShuZXdDaGlsZHJlbiwgaW5kZXhUb0NoZWNrLCBwYXJlbnRJbnN0YW5jZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFvbGRDaGlsZCB8fCBmaW5kT2xkSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICBhZGRDaGlsZCgpO1xuICAgICAgICAgICAgbmV3SW5kZXgrKztcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbW92ZUNoaWxkID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXhUb0NoZWNrID0gb2xkSW5kZXg7XG4gICAgICAgICAgICBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjaGVja0Rpc3Rpbmd1aXNoYWJsZShvbGRDaGlsZHJlbiwgaW5kZXhUb0NoZWNrLCBwYXJlbnRJbnN0YW5jZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpc1dOb2RlKG9sZENoaWxkKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBpbnN0YW5jZU1hcC5nZXQob2xkQ2hpbGQuaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIG9sZENoaWxkID0gaXRlbS5kbm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlVG9SZW1vdmUob2xkQ2hpbGQsIHRyYW5zaXRpb25zLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGZpbmROZXdJbmRleCA9IGZpbmRJbmRleE9mQ2hpbGQobmV3Q2hpbGRyZW4sIG9sZENoaWxkLCBuZXdJbmRleCArIDEpO1xuICAgICAgICBpZiAoZmluZE5ld0luZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmVtb3ZlQ2hpbGQoKTtcbiAgICAgICAgICAgIG9sZEluZGV4Kys7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBhZGRDaGlsZCgpO1xuICAgICAgICByZW1vdmVDaGlsZCgpO1xuICAgICAgICBvbGRJbmRleCsrO1xuICAgICAgICBuZXdJbmRleCsrO1xuICAgIH1cbiAgICBpZiAob2xkQ2hpbGRyZW5MZW5ndGggPiBvbGRJbmRleCkge1xuICAgICAgICAvLyBSZW1vdmUgY2hpbGQgZnJhZ21lbnRzXG4gICAgICAgIGZvciAoaSA9IG9sZEluZGV4OyBpIDwgb2xkQ2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaW5kZXhUb0NoZWNrID0gaTtcbiAgICAgICAgICAgIHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNoZWNrRGlzdGluZ3Vpc2hhYmxlKG9sZENoaWxkcmVuLCBpbmRleFRvQ2hlY2ssIHBhcmVudEluc3RhbmNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IGNoaWxkVG9SZW1vdmUgPSBvbGRDaGlsZHJlbltpXTtcbiAgICAgICAgICAgIGlmIChpc1dOb2RlKGNoaWxkVG9SZW1vdmUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGluc3RhbmNlTWFwLmdldChjaGlsZFRvUmVtb3ZlLmluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZFRvUmVtb3ZlID0gaXRlbS5kbm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlVG9SZW1vdmUoY2hpbGRUb1JlbW92ZSwgdHJhbnNpdGlvbnMsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGV4dFVwZGF0ZWQ7XG59XG5mdW5jdGlvbiBhZGRDaGlsZHJlbihwYXJlbnRWTm9kZSwgY2hpbGRyZW4sIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRJbnN0YW5jZSwgaW5zZXJ0QmVmb3JlID0gdW5kZWZpbmVkLCBjaGlsZE5vZGVzKSB7XG4gICAgaWYgKGNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XG4gICAgaWYgKHByb2plY3RvclN0YXRlLm1lcmdlICYmIGNoaWxkTm9kZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjaGlsZE5vZGVzID0gYXJyYXlGcm9tKHBhcmVudFZOb2RlLmRvbU5vZGUuY2hpbGROb2Rlcyk7XG4gICAgfVxuICAgIGNvbnN0IHRyYW5zaXRpb25zID0gcHJvamVjdGlvbk9wdGlvbnMudHJhbnNpdGlvbnM7XG4gICAgcHJvamVjdGlvbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9qZWN0aW9uT3B0aW9ucywgeyBkZXB0aDogcHJvamVjdGlvbk9wdGlvbnMuZGVwdGggKyAxIH0pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgY29uc3QgbmV4dFNpYmxpbmdzID0gY2hpbGRyZW4uc2xpY2UoaSArIDEpO1xuICAgICAgICBpZiAoaXNWTm9kZShjaGlsZCkpIHtcbiAgICAgICAgICAgIGlmIChwcm9qZWN0b3JTdGF0ZS5tZXJnZSAmJiBjaGlsZE5vZGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRvbUVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGNoaWxkLmRvbU5vZGUgPT09IHVuZGVmaW5lZCAmJiBjaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCA9IGNoaWxkTm9kZXMuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbUVsZW1lbnQgJiYgZG9tRWxlbWVudC50YWdOYW1lID09PSAoY2hpbGQudGFnLnRvVXBwZXJDYXNlKCkgfHwgdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZG9tTm9kZSA9IGRvbUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjcmVhdGVEb20oY2hpbGQsIHBhcmVudFZOb2RlLCBuZXh0U2libGluZ3MsIGluc2VydEJlZm9yZSwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudEluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNyZWF0ZURvbShjaGlsZCwgcGFyZW50Vk5vZGUsIG5leHRTaWJsaW5ncywgaW5zZXJ0QmVmb3JlLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UsIGNoaWxkTm9kZXMpO1xuICAgICAgICB9XG4gICAgICAgIG5vZGVBZGRlZChjaGlsZCwgdHJhbnNpdGlvbnMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGluaXRQcm9wZXJ0aWVzQW5kQ2hpbGRyZW4oZG9tTm9kZSwgZG5vZGUsIHBhcmVudEluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xuICAgIGFkZENoaWxkcmVuKGRub2RlLCBkbm9kZS5jaGlsZHJlbiwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudEluc3RhbmNlLCB1bmRlZmluZWQpO1xuICAgIGlmICh0eXBlb2YgZG5vZGUuZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicgJiYgZG5vZGUuaW5zZXJ0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhZGREZWZlcnJlZFByb3BlcnRpZXMoZG5vZGUsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKGRub2RlLmF0dHJpYnV0ZXMgJiYgZG5vZGUuZXZlbnRzKSB7XG4gICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXMoZG9tTm9kZSwge30sIGRub2RlLmF0dHJpYnV0ZXMsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgdXBkYXRlUHJvcGVydGllcyhkb21Ob2RlLCB7fSwgZG5vZGUucHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMsIGZhbHNlKTtcbiAgICAgICAgcmVtb3ZlT3JwaGFuZWRFdmVudHMoZG9tTm9kZSwge30sIGRub2RlLmV2ZW50cywgcHJvamVjdGlvbk9wdGlvbnMsIHRydWUpO1xuICAgICAgICBjb25zdCBldmVudHMgPSBkbm9kZS5ldmVudHM7XG4gICAgICAgIE9iamVjdC5rZXlzKGV2ZW50cykuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHVwZGF0ZUV2ZW50KGRvbU5vZGUsIGV2ZW50LCBldmVudHNbZXZlbnRdLCBwcm9qZWN0aW9uT3B0aW9ucywgZG5vZGUucHJvcGVydGllcy5iaW5kKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB1cGRhdGVQcm9wZXJ0aWVzKGRvbU5vZGUsIHt9LCBkbm9kZS5wcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgfVxuICAgIGlmIChkbm9kZS5wcm9wZXJ0aWVzLmtleSAhPT0gbnVsbCAmJiBkbm9kZS5wcm9wZXJ0aWVzLmtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldChwYXJlbnRJbnN0YW5jZSk7XG4gICAgICAgIGluc3RhbmNlRGF0YS5ub2RlSGFuZGxlci5hZGQoZG9tTm9kZSwgYCR7ZG5vZGUucHJvcGVydGllcy5rZXl9YCk7XG4gICAgfVxuICAgIGRub2RlLmluc2VydGVkID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZURvbShkbm9kZSwgcGFyZW50Vk5vZGUsIG5leHRTaWJsaW5ncywgaW5zZXJ0QmVmb3JlLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UsIGNoaWxkTm9kZXMpIHtcbiAgICBsZXQgZG9tTm9kZTtcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XG4gICAgaWYgKGlzV05vZGUoZG5vZGUpKSB7XG4gICAgICAgIGxldCB7IHdpZGdldENvbnN0cnVjdG9yIH0gPSBkbm9kZTtcbiAgICAgICAgY29uc3QgcGFyZW50SW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHBhcmVudEluc3RhbmNlKTtcbiAgICAgICAgaWYgKCFpc1dpZGdldEJhc2VDb25zdHJ1Y3Rvcih3aWRnZXRDb25zdHJ1Y3RvcikpIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBwYXJlbnRJbnN0YW5jZURhdGEucmVnaXN0cnkoKS5nZXQod2lkZ2V0Q29uc3RydWN0b3IpO1xuICAgICAgICAgICAgaWYgKGl0ZW0gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aWRnZXRDb25zdHJ1Y3RvciA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgd2lkZ2V0Q29uc3RydWN0b3IoKTtcbiAgICAgICAgZG5vZGUuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgbmV4dFNpYmxpbmdNYXAuc2V0KGluc3RhbmNlLCBuZXh0U2libGluZ3MpO1xuICAgICAgICBjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpO1xuICAgICAgICBpbnN0YW5jZURhdGEuaW52YWxpZGF0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5kaXJ0eSA9IHRydWU7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBwcm9qZWN0b3JTdGF0ZS5yZW5kZXJRdWV1ZS5wdXNoKHsgaW5zdGFuY2UsIGRlcHRoOiBwcm9qZWN0aW9uT3B0aW9ucy5kZXB0aCB9KTtcbiAgICAgICAgICAgICAgICBzY2hlZHVsZVJlbmRlcihwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPSB0cnVlO1xuICAgICAgICBpbnN0YW5jZS5fX3NldENvcmVQcm9wZXJ0aWVzX18oZG5vZGUuY29yZVByb3BlcnRpZXMpO1xuICAgICAgICBpbnN0YW5jZS5fX3NldENoaWxkcmVuX18oZG5vZGUuY2hpbGRyZW4pO1xuICAgICAgICBpbnN0YW5jZS5fX3NldFByb3BlcnRpZXNfXyhkbm9kZS5wcm9wZXJ0aWVzKTtcbiAgICAgICAgY29uc3QgcmVuZGVyZWQgPSBpbnN0YW5jZS5fX3JlbmRlcl9fKCk7XG4gICAgICAgIGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHJlbmRlcmVkKSB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJlZFJlbmRlcmVkID0gZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihyZW5kZXJlZCwgaW5zdGFuY2UpO1xuICAgICAgICAgICAgZG5vZGUucmVuZGVyZWQgPSBmaWx0ZXJlZFJlbmRlcmVkO1xuICAgICAgICAgICAgYWRkQ2hpbGRyZW4ocGFyZW50Vk5vZGUsIGZpbHRlcmVkUmVuZGVyZWQsIHByb2plY3Rpb25PcHRpb25zLCBpbnN0YW5jZSwgaW5zZXJ0QmVmb3JlLCBjaGlsZE5vZGVzKTtcbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZU1hcC5zZXQoaW5zdGFuY2UsIHsgZG5vZGUsIHBhcmVudFZOb2RlIH0pO1xuICAgICAgICBpbnN0YW5jZURhdGEubm9kZUhhbmRsZXIuYWRkUm9vdCgpO1xuICAgICAgICBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5vbkF0dGFjaCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChwcm9qZWN0b3JTdGF0ZS5tZXJnZSAmJiBwcm9qZWN0b3JTdGF0ZS5tZXJnZUVsZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZG9tTm9kZSA9IGRub2RlLmRvbU5vZGUgPSBwcm9qZWN0aW9uT3B0aW9ucy5tZXJnZUVsZW1lbnQ7XG4gICAgICAgICAgICBwcm9qZWN0b3JTdGF0ZS5tZXJnZUVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpbml0UHJvcGVydGllc0FuZENoaWxkcmVuKGRvbU5vZGUsIGRub2RlLCBwYXJlbnRJbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvYyA9IHBhcmVudFZOb2RlLmRvbU5vZGUub3duZXJEb2N1bWVudDtcbiAgICAgICAgaWYgKCFkbm9kZS50YWcgJiYgdHlwZW9mIGRub2RlLnRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAoZG5vZGUuZG9tTm9kZSAhPT0gdW5kZWZpbmVkICYmIHBhcmVudFZOb2RlLmRvbU5vZGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdEb21Ob2RlID0gZG5vZGUuZG9tTm9kZS5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRub2RlLnRleHQpO1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRWTm9kZS5kb21Ob2RlID09PSBkbm9kZS5kb21Ob2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Vk5vZGUuZG9tTm9kZS5yZXBsYWNlQ2hpbGQobmV3RG9tTm9kZSwgZG5vZGUuZG9tTm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRWTm9kZS5kb21Ob2RlLmFwcGVuZENoaWxkKG5ld0RvbU5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBkbm9kZS5kb21Ob2RlLnBhcmVudE5vZGUgJiYgZG5vZGUuZG9tTm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRub2RlLmRvbU5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkbm9kZS5kb21Ob2RlID0gbmV3RG9tTm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlID0gZG9jLmNyZWF0ZVRleHROb2RlKGRub2RlLnRleHQpO1xuICAgICAgICAgICAgICAgIGlmIChpbnNlcnRCZWZvcmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRWTm9kZS5kb21Ob2RlLmluc2VydEJlZm9yZShkb21Ob2RlLCBpbnNlcnRCZWZvcmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Vk5vZGUuZG9tTm9kZS5hcHBlbmRDaGlsZChkb21Ob2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoZG5vZGUuZG9tTm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRub2RlLnRhZyA9PT0gJ3N2ZycpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9qZWN0aW9uT3B0aW9ucywgeyBuYW1lc3BhY2U6IE5BTUVTUEFDRV9TVkcgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0aW9uT3B0aW9ucy5uYW1lc3BhY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBkb21Ob2RlID0gZG5vZGUuZG9tTm9kZSA9IGRvYy5jcmVhdGVFbGVtZW50TlMocHJvamVjdGlvbk9wdGlvbnMubmFtZXNwYWNlLCBkbm9kZS50YWcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tTm9kZSA9IGRub2RlLmRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlIHx8IGRvYy5jcmVhdGVFbGVtZW50KGRub2RlLnRhZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZG9tTm9kZSA9IGRub2RlLmRvbU5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbml0UHJvcGVydGllc0FuZENoaWxkcmVuKGRvbU5vZGUsIGRub2RlLCBwYXJlbnRJbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKGluc2VydEJlZm9yZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50Vk5vZGUuZG9tTm9kZS5pbnNlcnRCZWZvcmUoZG9tTm9kZSwgaW5zZXJ0QmVmb3JlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGRvbU5vZGUucGFyZW50Tm9kZSAhPT0gcGFyZW50Vk5vZGUuZG9tTm9kZSkge1xuICAgICAgICAgICAgICAgIHBhcmVudFZOb2RlLmRvbU5vZGUuYXBwZW5kQ2hpbGQoZG9tTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB1cGRhdGVEb20ocHJldmlvdXMsIGRub2RlLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50Vk5vZGUsIHBhcmVudEluc3RhbmNlLCBvbGROZXh0U2libGluZ3MsIG5leHRTaWJsaW5ncykge1xuICAgIGlmIChpc1dOb2RlKGRub2RlKSkge1xuICAgICAgICBjb25zdCB7IGluc3RhbmNlIH0gPSBwcmV2aW91cztcbiAgICAgICAgY29uc3QgeyBwYXJlbnRWTm9kZSwgZG5vZGU6IG5vZGUgfSA9IGluc3RhbmNlTWFwLmdldChpbnN0YW5jZSk7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzUmVuZGVyZWQgPSBub2RlID8gbm9kZS5yZW5kZXJlZCA6IHByZXZpb3VzLnJlbmRlcmVkO1xuICAgICAgICBjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpO1xuICAgICAgICBpbnN0YW5jZURhdGEucmVuZGVyaW5nID0gdHJ1ZTtcbiAgICAgICAgaW5zdGFuY2UuX19zZXRDb3JlUHJvcGVydGllc19fKGRub2RlLmNvcmVQcm9wZXJ0aWVzKTtcbiAgICAgICAgaW5zdGFuY2UuX19zZXRDaGlsZHJlbl9fKGRub2RlLmNoaWxkcmVuKTtcbiAgICAgICAgaW5zdGFuY2UuX19zZXRQcm9wZXJ0aWVzX18oZG5vZGUucHJvcGVydGllcyk7XG4gICAgICAgIG5leHRTaWJsaW5nTWFwLnNldChpbnN0YW5jZSwgbmV4dFNpYmxpbmdzKTtcbiAgICAgICAgZG5vZGUuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgaWYgKGluc3RhbmNlRGF0YS5kaXJ0eSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29uc3QgcmVuZGVyZWQgPSBpbnN0YW5jZS5fX3JlbmRlcl9fKCk7XG4gICAgICAgICAgICBpbnN0YW5jZURhdGEucmVuZGVyaW5nID0gZmFsc2U7XG4gICAgICAgICAgICBkbm9kZS5yZW5kZXJlZCA9IGZpbHRlckFuZERlY29yYXRlQ2hpbGRyZW4ocmVuZGVyZWQsIGluc3RhbmNlKTtcbiAgICAgICAgICAgIHVwZGF0ZUNoaWxkcmVuKHBhcmVudFZOb2RlLCBvbGROZXh0U2libGluZ3MsIHByZXZpb3VzUmVuZGVyZWQsIGRub2RlLnJlbmRlcmVkLCBpbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgZG5vZGUucmVuZGVyZWQgPSBwcmV2aW91c1JlbmRlcmVkO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlTWFwLnNldChpbnN0YW5jZSwgeyBkbm9kZSwgcGFyZW50Vk5vZGUgfSk7XG4gICAgICAgIGluc3RhbmNlRGF0YS5ub2RlSGFuZGxlci5hZGRSb290KCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAocHJldmlvdXMgPT09IGRub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9tTm9kZSA9IChkbm9kZS5kb21Ob2RlID0gcHJldmlvdXMuZG9tTm9kZSk7XG4gICAgICAgIGxldCB0ZXh0VXBkYXRlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgdXBkYXRlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoIWRub2RlLnRhZyAmJiB0eXBlb2YgZG5vZGUudGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChkbm9kZS50ZXh0ICE9PSBwcmV2aW91cy50ZXh0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3RG9tTm9kZSA9IGRvbU5vZGUub3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkbm9kZS50ZXh0KTtcbiAgICAgICAgICAgICAgICBkb21Ob2RlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5ld0RvbU5vZGUsIGRvbU5vZGUpO1xuICAgICAgICAgICAgICAgIGRub2RlLmRvbU5vZGUgPSBuZXdEb21Ob2RlO1xuICAgICAgICAgICAgICAgIHRleHRVcGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dFVwZGF0ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoZG5vZGUudGFnICYmIGRub2RlLnRhZy5sYXN0SW5kZXhPZignc3ZnJywgMCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBwcm9qZWN0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHByb2plY3Rpb25PcHRpb25zLCB7IG5hbWVzcGFjZTogTkFNRVNQQUNFX1NWRyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcmV2aW91cy5jaGlsZHJlbiAhPT0gZG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGZpbHRlckFuZERlY29yYXRlQ2hpbGRyZW4oZG5vZGUuY2hpbGRyZW4sIHBhcmVudEluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICBkbm9kZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICAgICAgICAgIHVwZGF0ZWQgPVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlbihkbm9kZSwgb2xkTmV4dFNpYmxpbmdzLCBwcmV2aW91cy5jaGlsZHJlbiwgY2hpbGRyZW4sIHBhcmVudEluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucykgfHwgdXBkYXRlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzUHJvcGVydGllcyA9IGJ1aWxkUHJldmlvdXNQcm9wZXJ0aWVzKGRvbU5vZGUsIHByZXZpb3VzLCBkbm9kZSk7XG4gICAgICAgICAgICBpZiAoZG5vZGUuYXR0cmlidXRlcyAmJiBkbm9kZS5ldmVudHMpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVBdHRyaWJ1dGVzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcy5hdHRyaWJ1dGVzLCBkbm9kZS5hdHRyaWJ1dGVzLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgdXBkYXRlZCA9XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVByb3BlcnRpZXMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLnByb3BlcnRpZXMsIGRub2RlLnByb3BlcnRpZXMsIHByb2plY3Rpb25PcHRpb25zLCBmYWxzZSkgfHwgdXBkYXRlZDtcbiAgICAgICAgICAgICAgICByZW1vdmVPcnBoYW5lZEV2ZW50cyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMuZXZlbnRzLCBkbm9kZS5ldmVudHMsIHByb2plY3Rpb25PcHRpb25zLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudHMgPSBkbm9kZS5ldmVudHM7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZXZlbnRzKS5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVFdmVudChkb21Ob2RlLCBldmVudCwgZXZlbnRzW2V2ZW50XSwgcHJvamVjdGlvbk9wdGlvbnMsIGRub2RlLnByb3BlcnRpZXMuYmluZCwgcHJldmlvdXNQcm9wZXJ0aWVzLmV2ZW50c1tldmVudF0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlZCA9XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVByb3BlcnRpZXMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLnByb3BlcnRpZXMsIGRub2RlLnByb3BlcnRpZXMsIHByb2plY3Rpb25PcHRpb25zKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkbm9kZS5wcm9wZXJ0aWVzLmtleSAhPT0gbnVsbCAmJiBkbm9kZS5wcm9wZXJ0aWVzLmtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHBhcmVudEluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZURhdGEubm9kZUhhbmRsZXIuYWRkKGRvbU5vZGUsIGAke2Rub2RlLnByb3BlcnRpZXMua2V5fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkICYmIGRub2RlLnByb3BlcnRpZXMgJiYgZG5vZGUucHJvcGVydGllcy51cGRhdGVBbmltYXRpb24pIHtcbiAgICAgICAgICAgIGRub2RlLnByb3BlcnRpZXMudXBkYXRlQW5pbWF0aW9uKGRvbU5vZGUsIGRub2RlLnByb3BlcnRpZXMsIHByZXZpb3VzLnByb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gYWRkRGVmZXJyZWRQcm9wZXJ0aWVzKHZub2RlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xuICAgIC8vIHRyYW5zZmVyIGFueSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBiZWVuIHBhc3NlZCAtIGFzIHRoZXNlIG11c3QgYmUgZGVjb3JhdGVkIHByb3BlcnRpZXNcbiAgICB2bm9kZS5kZWNvcmF0ZWREZWZlcnJlZFByb3BlcnRpZXMgPSB2bm9kZS5wcm9wZXJ0aWVzO1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSB2bm9kZS5kZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayghIXZub2RlLmluc2VydGVkKTtcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XG4gICAgdm5vZGUucHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oe30sIHByb3BlcnRpZXMsIHZub2RlLmRlY29yYXRlZERlZmVycmVkUHJvcGVydGllcyk7XG4gICAgcHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3MucHVzaCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3QuYXNzaWduKHt9LCB2bm9kZS5kZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayghIXZub2RlLmluc2VydGVkKSwgdm5vZGUuZGVjb3JhdGVkRGVmZXJyZWRQcm9wZXJ0aWVzKTtcbiAgICAgICAgdXBkYXRlUHJvcGVydGllcyh2bm9kZS5kb21Ob2RlLCB2bm9kZS5wcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgIHZub2RlLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gcnVuRGVmZXJyZWRSZW5kZXJDYWxsYmFja3MocHJvamVjdGlvbk9wdGlvbnMpIHtcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XG4gICAgaWYgKHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICBpZiAocHJvamVjdGlvbk9wdGlvbnMuc3luYykge1xuICAgICAgICAgICAgd2hpbGUgKHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gcHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZ2xvYmFsLnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBydW5BZnRlclJlbmRlckNhbGxiYWNrcyhwcm9qZWN0aW9uT3B0aW9ucykge1xuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcbiAgICBpZiAocHJvamVjdGlvbk9wdGlvbnMuc3luYykge1xuICAgICAgICB3aGlsZSAocHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnNoaWZ0KCk7XG4gICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoZ2xvYmFsLnJlcXVlc3RJZGxlQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIGdsb2JhbC5yZXF1ZXN0SWRsZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICB3aGlsZSAocHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gcHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHdoaWxlIChwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gc2NoZWR1bGVSZW5kZXIocHJvamVjdGlvbk9wdGlvbnMpIHtcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XG4gICAgaWYgKHByb2plY3Rpb25PcHRpb25zLnN5bmMpIHtcbiAgICAgICAgcmVuZGVyKHByb2plY3Rpb25PcHRpb25zKTtcbiAgICB9XG4gICAgZWxzZSBpZiAocHJvamVjdG9yU3RhdGUucmVuZGVyU2NoZWR1bGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHJvamVjdG9yU3RhdGUucmVuZGVyU2NoZWR1bGVkID0gZ2xvYmFsLnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICByZW5kZXIocHJvamVjdGlvbk9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiByZW5kZXIocHJvamVjdGlvbk9wdGlvbnMpIHtcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XG4gICAgcHJvamVjdG9yU3RhdGUucmVuZGVyU2NoZWR1bGVkID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlbmRlclF1ZXVlID0gcHJvamVjdG9yU3RhdGUucmVuZGVyUXVldWU7XG4gICAgY29uc3QgcmVuZGVycyA9IFsuLi5yZW5kZXJRdWV1ZV07XG4gICAgcHJvamVjdG9yU3RhdGUucmVuZGVyUXVldWUgPSBbXTtcbiAgICByZW5kZXJzLnNvcnQoKGEsIGIpID0+IGEuZGVwdGggLSBiLmRlcHRoKTtcbiAgICBjb25zdCBwcmV2aW91c2x5UmVuZGVyZWQgPSBbXTtcbiAgICB3aGlsZSAocmVuZGVycy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgeyBpbnN0YW5jZSB9ID0gcmVuZGVycy5zaGlmdCgpO1xuICAgICAgICBpZiAoaW5zdGFuY2VNYXAuaGFzKGluc3RhbmNlKSAmJiBwcmV2aW91c2x5UmVuZGVyZWQuaW5kZXhPZihpbnN0YW5jZSkgPT09IC0xKSB7XG4gICAgICAgICAgICBwcmV2aW91c2x5UmVuZGVyZWQucHVzaChpbnN0YW5jZSk7XG4gICAgICAgICAgICBjb25zdCB7IHBhcmVudFZOb2RlLCBkbm9kZSB9ID0gaW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldChpbnN0YW5jZSk7XG4gICAgICAgICAgICBjb25zdCBuZXh0U2libGluZ3MgPSBuZXh0U2libGluZ01hcC5nZXQoaW5zdGFuY2UpO1xuICAgICAgICAgICAgdXBkYXRlRG9tKGRub2RlLCB0b0ludGVybmFsV05vZGUoaW5zdGFuY2UsIGluc3RhbmNlRGF0YSksIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRWTm9kZSwgaW5zdGFuY2UsIG5leHRTaWJsaW5ncywgbmV4dFNpYmxpbmdzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBydW5BZnRlclJlbmRlckNhbGxiYWNrcyhwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgcnVuRGVmZXJyZWRSZW5kZXJDYWxsYmFja3MocHJvamVjdGlvbk9wdGlvbnMpO1xufVxuZXhwb3J0IGNvbnN0IGRvbSA9IHtcbiAgICBhcHBlbmQ6IGZ1bmN0aW9uIChwYXJlbnROb2RlLCBpbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpO1xuICAgICAgICBjb25zdCBmaW5hbFByb2plY3Rvck9wdGlvbnMgPSBnZXRQcm9qZWN0aW9uT3B0aW9ucyhwcm9qZWN0aW9uT3B0aW9ucywgaW5zdGFuY2UpO1xuICAgICAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHtcbiAgICAgICAgICAgIGFmdGVyUmVuZGVyQ2FsbGJhY2tzOiBbXSxcbiAgICAgICAgICAgIGRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzOiBbXSxcbiAgICAgICAgICAgIG5vZGVNYXA6IG5ldyBXZWFrTWFwKCksXG4gICAgICAgICAgICByZW5kZXJTY2hlZHVsZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHJlbmRlclF1ZXVlOiBbXSxcbiAgICAgICAgICAgIG1lcmdlOiBwcm9qZWN0aW9uT3B0aW9ucy5tZXJnZSB8fCBmYWxzZSxcbiAgICAgICAgICAgIG1lcmdlRWxlbWVudDogcHJvamVjdGlvbk9wdGlvbnMubWVyZ2VFbGVtZW50XG4gICAgICAgIH07XG4gICAgICAgIHByb2plY3RvclN0YXRlTWFwLnNldChpbnN0YW5jZSwgcHJvamVjdG9yU3RhdGUpO1xuICAgICAgICBmaW5hbFByb2plY3Rvck9wdGlvbnMucm9vdE5vZGUgPSBwYXJlbnROb2RlO1xuICAgICAgICBjb25zdCBwYXJlbnRWTm9kZSA9IHRvUGFyZW50Vk5vZGUoZmluYWxQcm9qZWN0b3JPcHRpb25zLnJvb3ROb2RlKTtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRvSW50ZXJuYWxXTm9kZShpbnN0YW5jZSwgaW5zdGFuY2VEYXRhKTtcbiAgICAgICAgaW5zdGFuY2VNYXAuc2V0KGluc3RhbmNlLCB7IGRub2RlOiBub2RlLCBwYXJlbnRWTm9kZSB9KTtcbiAgICAgICAgaW5zdGFuY2VEYXRhLmludmFsaWRhdGUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpbnN0YW5jZURhdGEuZGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcHJvamVjdG9yU3RhdGUucmVuZGVyUXVldWUucHVzaCh7IGluc3RhbmNlLCBkZXB0aDogZmluYWxQcm9qZWN0b3JPcHRpb25zLmRlcHRoIH0pO1xuICAgICAgICAgICAgICAgIHNjaGVkdWxlUmVuZGVyKGZpbmFsUHJvamVjdG9yT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHVwZGF0ZURvbShub2RlLCBub2RlLCBmaW5hbFByb2plY3Rvck9wdGlvbnMsIHBhcmVudFZOb2RlLCBpbnN0YW5jZSwgW10sIFtdKTtcbiAgICAgICAgcHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICBpbnN0YW5jZURhdGEub25BdHRhY2goKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJ1bkRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzKGZpbmFsUHJvamVjdG9yT3B0aW9ucyk7XG4gICAgICAgIHJ1bkFmdGVyUmVuZGVyQ2FsbGJhY2tzKGZpbmFsUHJvamVjdG9yT3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkb21Ob2RlOiBmaW5hbFByb2plY3Rvck9wdGlvbnMucm9vdE5vZGVcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGNyZWF0ZTogZnVuY3Rpb24gKGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksIGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgfSxcbiAgICBtZXJnZTogZnVuY3Rpb24gKGVsZW1lbnQsIGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHByb2plY3Rpb25PcHRpb25zLm1lcmdlID0gdHJ1ZTtcbiAgICAgICAgcHJvamVjdGlvbk9wdGlvbnMubWVyZ2VFbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbiA9IHRoaXMuYXBwZW5kKGVsZW1lbnQucGFyZW50Tm9kZSwgaW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQoaW5zdGFuY2UpO1xuICAgICAgICBwcm9qZWN0b3JTdGF0ZS5tZXJnZSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gcHJvamVjdGlvbjtcbiAgICB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmRvbS5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL3Zkb20ubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvdmRvbS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCIvKioqIElNUE9SVFMgRlJPTSBpbXBvcnRzLWxvYWRlciAqKiovXG52YXIgd2lkZ2V0RmFjdG9yeSA9IHJlcXVpcmUoXCJzcmMvbWVudS1pdGVtL01lbnVJdGVtXCIpO1xuXG52YXIgcmVnaXN0ZXJDdXN0b21FbGVtZW50ID0gcmVxdWlyZSgnQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL3JlZ2lzdGVyQ3VzdG9tRWxlbWVudCcpLmRlZmF1bHQ7XG5cbnZhciBkZWZhdWx0RXhwb3J0ID0gd2lkZ2V0RmFjdG9yeS5kZWZhdWx0O1xuZGVmYXVsdEV4cG9ydCAmJiByZWdpc3RlckN1c3RvbUVsZW1lbnQoZGVmYXVsdEV4cG9ydCk7XG5cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2ltcG9ydHMtbG9hZGVyP3dpZGdldEZhY3Rvcnk9c3JjL21lbnUtaXRlbS9NZW51SXRlbSEuL25vZGVfbW9kdWxlcy9AZG9qby9jbGktYnVpbGQtd2lkZ2V0L3RlbXBsYXRlL2N1c3RvbS1lbGVtZW50LmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9pbXBvcnRzLWxvYWRlci9pbmRleC5qcz93aWRnZXRGYWN0b3J5PXNyYy9tZW51LWl0ZW0vTWVudUl0ZW0hLi9ub2RlX21vZHVsZXMvQGRvam8vY2xpLWJ1aWxkLXdpZGdldC90ZW1wbGF0ZS9jdXN0b20tZWxlbWVudC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXHJcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXHJcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcblxyXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXHJcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcclxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcclxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cclxuXHJcblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xyXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIGlmIChlLmluZGV4T2YocFtpXSkgPCAwKVxyXG4gICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHJlc3VsdC52YWx1ZSk7IH0pLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0geVtvcFswXSAmIDIgPyBcInJldHVyblwiIDogb3BbMF0gPyBcInRocm93XCIgOiBcIm5leHRcIl0pICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gWzAsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBleHBvcnRzKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmICghZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7ICB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAob1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpIHx8ICgxLGV2YWwpKFwidGhpc1wiKTtcbn0gY2F0Y2goZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZih0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKVxuXHRcdGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vICh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvd2VicGFjay9idWlsZGluL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCB7IHYgfSBmcm9tICdAZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvY3VzdG9tRWxlbWVudCc7XG5pbXBvcnQgeyBXaWRnZXRQcm9wZXJ0aWVzIH0gZnJvbSAnQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgdGhlbWUsIFRoZW1lZE1peGluIH0gZnJvbSAnQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL21peGlucy9UaGVtZWQnO1xuaW1wb3J0IHsgV2lkZ2V0QmFzZSB9IGZyb20gJ0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9XaWRnZXRCYXNlJztcblxuaW1wb3J0ICogYXMgY3NzIGZyb20gJy4vbWVudUl0ZW0ubS5jc3MnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1lbnVJdGVtUHJvcGVydGllcyBleHRlbmRzIFdpZGdldFByb3BlcnRpZXMge1xuXHR0aXRsZTogc3RyaW5nO1xuXHRzZWxlY3RlZD86IGJvb2xlYW47XG5cdGRhdGE/OiBhbnk7XG5cdG9uU2VsZWN0ZWQ/OiAoZGF0YTogYW55KSA9PiB2b2lkO1xufVxuXG5AY3VzdG9tRWxlbWVudDxNZW51SXRlbVByb3BlcnRpZXM+KHtcblx0dGFnOiAnZGVtby1tZW51LWl0ZW0nLFxuXHRhdHRyaWJ1dGVzOiBbJ3RpdGxlJywgJ3NlbGVjdGVkJ10sXG5cdGV2ZW50czogWydvblNlbGVjdGVkJ10sXG5cdHByb3BlcnRpZXM6IFsnZGF0YScsICdzZWxlY3RlZCddXG59KVxuQHRoZW1lKGNzcylcbmV4cG9ydCBjbGFzcyBNZW51SXRlbSBleHRlbmRzIFRoZW1lZE1peGluKFdpZGdldEJhc2UpPE1lbnVJdGVtUHJvcGVydGllcz4ge1xuXHRwcml2YXRlIF9vbkNsaWNrKCkge1xuXHRcdHRoaXMucHJvcGVydGllcy5vblNlbGVjdGVkICYmIHRoaXMucHJvcGVydGllcy5vblNlbGVjdGVkKHRoaXMucHJvcGVydGllcy5kYXRhKTtcblx0fVxuXG5cdHByb3RlY3RlZCByZW5kZXIoKSB7XG5cdFx0Y29uc3QgeyB0aXRsZSwgc2VsZWN0ZWQgfSA9IHRoaXMucHJvcGVydGllcztcblxuXHRcdHJldHVybiB2KCdsaScsIHsgY2xhc3NlczogdGhpcy50aGVtZShjc3Mucm9vdCkgfSwgW1xuXHRcdFx0dihcblx0XHRcdFx0J3NwYW4nLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y2xhc3NlczogdGhpcy50aGVtZShbY3NzLml0ZW0sIHNlbGVjdGVkID8gY3NzLnNlbGVjdGVkIDogbnVsbF0pLFxuXHRcdFx0XHRcdG9uY2xpY2s6IHRoaXMuX29uQ2xpY2tcblx0XHRcdFx0fSxcblx0XHRcdFx0W3RpdGxlXVxuXHRcdFx0KVxuXHRcdF0pO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE1lbnVJdGVtO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWR0cy1sb2FkZXI/dHlwZT10cyZpbnN0YW5jZU5hbWU9MF9tZW51LWl0ZW0hLi9zcmMvbWVudS1pdGVtL01lbnVJdGVtLnRzIiwiLy8gcmVtb3ZlZCBieSBleHRyYWN0LXRleHQtd2VicGFjay1wbHVnaW5cbm1vZHVsZS5leHBvcnRzID0ge1wiIF9rZXlcIjpcInRlc3QtYXBwL21lbnVJdGVtXCIsXCJyb290XCI6XCJtZW51SXRlbS1tX19yb290X19zVW1VaVwiLFwiaXRlbVwiOlwibWVudUl0ZW0tbV9faXRlbV9fMk1rNlJcIixcInNlbGVjdGVkXCI6XCJtZW51SXRlbS1tX19zZWxlY3RlZF9fMS1mM0lcIn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvbWVudS1pdGVtL21lbnVJdGVtLm0uY3NzXG4vLyBtb2R1bGUgaWQgPSAuL3NyYy9tZW51LWl0ZW0vbWVudUl0ZW0ubS5jc3Ncbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/test-app/fixtures/unix/dev/menu/menu-1.0.0.js b/test-app/fixtures/unix/dev/menu/menu-1.0.0.js index 23fb38d..a4c7b80 100644 --- a/test-app/fixtures/unix/dev/menu/menu-1.0.0.js +++ b/test-app/fixtures/unix/dev/menu/menu-1.0.0.js @@ -73,19 +73,19 @@ /************************************************************************/ /******/ ({ -/***/ "./node_modules/@dojo/core/Destroyable.mjs": +/***/ "./node_modules/@dojo/framework/core/Destroyable.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__lang__ = __webpack_require__("./node_modules/@dojo/core/lang.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Promise__ = __webpack_require__("./node_modules/@dojo/shim/Promise.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__lang__ = __webpack_require__("./node_modules/@dojo/framework/core/lang.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__shim_Promise__ = __webpack_require__("./node_modules/@dojo/framework/shim/Promise.mjs"); /** * No operation function to replace own once instance is destoryed */ function noop() { - return __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Promise__["a" /* default */].resolve(false); + return __WEBPACK_IMPORTED_MODULE_1__shim_Promise__["a" /* default */].resolve(false); } /** * No op function used to replace own, once instance has been destoryed @@ -123,7 +123,7 @@ class Destroyable { * @returns {Promise { + return new __WEBPACK_IMPORTED_MODULE_1__shim_Promise__["a" /* default */]((resolve) => { this.handles.forEach((handle) => { handle && handle.destroy && handle.destroy(); }); @@ -140,19 +140,19 @@ class Destroyable { /***/ }), -/***/ "./node_modules/@dojo/core/Evented.mjs": +/***/ "./node_modules/@dojo/framework/core/Evented.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export isGlobMatch */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__ = __webpack_require__("./node_modules/@dojo/shim/Map.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Destroyable__ = __webpack_require__("./node_modules/@dojo/core/Destroyable.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_Map__ = __webpack_require__("./node_modules/@dojo/framework/shim/Map.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Destroyable__ = __webpack_require__("./node_modules/@dojo/framework/core/Destroyable.mjs"); /** * Map of computed regular expressions, keyed by string */ -const regexMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */](); +const regexMap = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["b" /* default */](); /** * Determines is the event type glob has been matched * @@ -183,12 +183,12 @@ class Evented extends __WEBPACK_IMPORTED_MODULE_1__Destroyable__["a" /* Destroya /** * map of listeners keyed by event type */ - this.listenersMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */](); + this.listenersMap = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["b" /* default */](); } emit(event) { this.listenersMap.forEach((methods, type) => { if (isGlobMatch(type, event.type)) { - methods.forEach((method) => { + [...methods].forEach((method) => { method.call(this, event); }); } @@ -224,7 +224,7 @@ class Evented extends __WEBPACK_IMPORTED_MODULE_1__Destroyable__["a" /* Destroya /***/ }), -/***/ "./node_modules/@dojo/core/lang.mjs": +/***/ "./node_modules/@dojo/framework/core/lang.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -238,8 +238,8 @@ class Evented extends __WEBPACK_IMPORTED_MODULE_1__Destroyable__["a" /* Destroya /* unused harmony export partial */ /* unused harmony export createHandle */ /* harmony export (immutable) */ __webpack_exports__["b"] = createCompositeHandle; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_object__ = __webpack_require__("./node_modules/@dojo/shim/object.mjs"); -/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return __WEBPACK_IMPORTED_MODULE_0__dojo_shim_object__["a"]; }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_object__ = __webpack_require__("./node_modules/@dojo/framework/shim/object.mjs"); +/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return __WEBPACK_IMPORTED_MODULE_0__shim_object__["a"]; }); const slice = Array.prototype.slice; @@ -317,7 +317,7 @@ function create(prototype, ...mixins) { } const args = mixins.slice(); args.unshift(Object.create(prototype)); - return __WEBPACK_IMPORTED_MODULE_0__dojo_shim_object__["a" /* assign */].apply(null, args); + return __WEBPACK_IMPORTED_MODULE_0__shim_object__["a" /* assign */].apply(null, args); } function deepAssign(target, ...sources) { return _mixin({ @@ -439,7 +439,7 @@ function createCompositeHandle(...handles) { /***/ }), -/***/ "./node_modules/@dojo/has/has.mjs": +/***/ "./node_modules/@dojo/framework/has/has.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -652,16 +652,16 @@ add('host-node', function () { /***/ }), -/***/ "./node_modules/@dojo/shim/Map.mjs": +/***/ "./node_modules/@dojo/framework/shim/Map.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Map; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__iterator__ = __webpack_require__("./node_modules/@dojo/shim/iterator.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__object__ = __webpack_require__("./node_modules/@dojo/shim/object.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__iterator__ = __webpack_require__("./node_modules/@dojo/framework/shim/iterator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__object__ = __webpack_require__("./node_modules/@dojo/framework/shim/object.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); @@ -761,15 +761,15 @@ var _a; /***/ }), -/***/ "./node_modules/@dojo/shim/Promise.mjs": +/***/ "./node_modules/@dojo/framework/shim/Promise.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export ShimPromise */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__support_queue__ = __webpack_require__("./node_modules/@dojo/shim/support/queue.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__support_queue__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/queue.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); @@ -974,15 +974,15 @@ var _a; /***/ }), -/***/ "./node_modules/@dojo/shim/Symbol.mjs": +/***/ "./node_modules/@dojo/framework/shim/Symbol.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export Symbol */ /* unused harmony export isSymbol */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__support_util__ = __webpack_require__("./node_modules/@dojo/shim/support/util.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__support_util__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/util.mjs"); @@ -1131,15 +1131,15 @@ function isSymbol(value) { /***/ }), -/***/ "./node_modules/@dojo/shim/WeakMap.mjs": +/***/ "./node_modules/@dojo/framework/shim/WeakMap.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export WeakMap */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__iterator__ = __webpack_require__("./node_modules/@dojo/shim/iterator.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__iterator__ = __webpack_require__("./node_modules/@dojo/framework/shim/iterator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); @@ -1254,7 +1254,7 @@ if (false) { /***/ }), -/***/ "./node_modules/@dojo/shim/array.mjs": +/***/ "./node_modules/@dojo/framework/shim/array.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -1265,11 +1265,11 @@ if (false) { /* unused harmony export find */ /* unused harmony export findIndex */ /* unused harmony export includes */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__iterator__ = __webpack_require__("./node_modules/@dojo/shim/iterator.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__number__ = __webpack_require__("./node_modules/@dojo/shim/number.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__support_util__ = __webpack_require__("./node_modules/@dojo/shim/support/util.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__iterator__ = __webpack_require__("./node_modules/@dojo/framework/shim/iterator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__number__ = __webpack_require__("./node_modules/@dojo/framework/shim/number.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__support_util__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/util.mjs"); @@ -1521,7 +1521,7 @@ else { /***/ }), -/***/ "./node_modules/@dojo/shim/global.mjs": +/***/ "./node_modules/@dojo/framework/shim/global.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -1547,7 +1547,7 @@ else { /***/ }), -/***/ "./node_modules/@dojo/shim/iterator.mjs": +/***/ "./node_modules/@dojo/framework/shim/iterator.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -1555,8 +1555,8 @@ else { /* unused harmony export isArrayLike */ /* unused harmony export get */ /* unused harmony export forOf */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__string__ = __webpack_require__("./node_modules/@dojo/shim/string.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__string__ = __webpack_require__("./node_modules/@dojo/framework/shim/string.mjs"); const staticDone = { done: true, value: undefined }; @@ -1673,7 +1673,7 @@ function forOf(iterable, callback, thisArg) { /***/ }), -/***/ "./node_modules/@dojo/shim/number.mjs": +/***/ "./node_modules/@dojo/framework/shim/number.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -1681,7 +1681,7 @@ function forOf(iterable, callback, thisArg) { /* unused harmony export isFinite */ /* unused harmony export isInteger */ /* unused harmony export isSafeInteger */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); /** * The smallest interval between two representable numbers. @@ -1745,7 +1745,7 @@ function isSafeInteger(value) { /***/ }), -/***/ "./node_modules/@dojo/shim/object.mjs": +/***/ "./node_modules/@dojo/framework/shim/object.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -1758,9 +1758,9 @@ function isSafeInteger(value) { /* unused harmony export getOwnPropertyDescriptors */ /* unused harmony export entries */ /* unused harmony export values */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); @@ -1875,7 +1875,7 @@ else { /***/ }), -/***/ "./node_modules/@dojo/shim/string.mjs": +/***/ "./node_modules/@dojo/framework/shim/string.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -1889,9 +1889,9 @@ else { /* unused harmony export startsWith */ /* unused harmony export padEnd */ /* unused harmony export padStart */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__support_util__ = __webpack_require__("./node_modules/@dojo/shim/support/util.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__support_util__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/util.mjs"); @@ -2200,33 +2200,33 @@ else { /***/ }), -/***/ "./node_modules/@dojo/shim/support/has.mjs": +/***/ "./node_modules/@dojo/framework/shim/support/has.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_has_has__ = __webpack_require__("./node_modules/@dojo/has/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__has_has__ = __webpack_require__("./node_modules/@dojo/framework/has/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); /* unused harmony reexport namespace */ -/* unused harmony default export */ var _unused_webpack_default_export = (__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["b" /* default */]); +/* unused harmony default export */ var _unused_webpack_default_export = (__WEBPACK_IMPORTED_MODULE_0__has_has__["b" /* default */]); /* ECMAScript 6 and 7 Features */ /* Array */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-array', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-array', () => { return (['from', 'of'].every((key) => key in __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Array) && ['findIndex', 'find', 'copyWithin'].every((key) => key in __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Array.prototype)); }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-array-fill', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-array-fill', () => { if ('fill' in __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Array.prototype) { /* Some versions of Safari do not properly implement this */ return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1; } return false; }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es7-array', () => 'includes' in __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Array.prototype, true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es7-array', () => 'includes' in __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Array.prototype, true); /* Map */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-map', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-map', () => { if (typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Map === 'function') { /* IE11 and older versions of Safari are missing critical ES6 Map functionality @@ -2249,7 +2249,7 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-map', () return false; }, true); /* Math */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-math', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-math', () => { return [ 'clz32', 'sign', @@ -2269,7 +2269,7 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-math', ( 'hypot' ].every((name) => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Math[name] === 'function'); }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-math-imul', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-math-imul', () => { if ('imul' in __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Math) { /* Some versions of Safari on ios do not properly implement this */ return Math.imul(0xffffffff, 5) === -5; @@ -2277,19 +2277,19 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-math-imu return false; }, true); /* Object */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-object', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-object', () => { return true && ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Object[name] === 'function'); }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es2017-object', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es2017-object', () => { return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Object[name] === 'function'); }, true); /* Observable */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es-observable', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Observable !== 'undefined', true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es-observable', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Observable !== 'undefined', true); /* Promise */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-promise', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Promise !== 'undefined' && true, true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-promise', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Promise !== 'undefined' && true, true); /* Set */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-set', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-set', () => { if (typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Set === 'function') { /* IE11 and older versions of Safari are missing critical ES6 Set functionality */ const set = new __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Set([1]); @@ -2298,7 +2298,7 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-set', () return false; }, true); /* String */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-string', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-string', () => { return ([ /* static methods */ 'fromCodePoint' @@ -2313,7 +2313,7 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-string', 'includes' ].every((key) => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].String.prototype[key] === 'function')); }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-string-raw', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-string-raw', () => { function getCallSite(callSite, ...substitutions) { const result = [...callSite]; result.raw = callSite.raw; @@ -2328,13 +2328,13 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-string-r } return false; }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es2017-string', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es2017-string', () => { return ['padStart', 'padEnd'].every((key) => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].String.prototype[key] === 'function'); }, true); /* Symbol */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-symbol', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Symbol !== 'undefined' && typeof Symbol() === 'symbol', true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-symbol', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Symbol !== 'undefined' && typeof Symbol() === 'symbol', true); /* WeakMap */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-weakmap', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-weakmap', () => { if (typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].WeakMap !== 'undefined') { /* IE11 and older versions of Safari are missing critical ES6 Map functionality */ const key1 = {}; @@ -2346,16 +2346,16 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-weakmap' return false; }, true); /* Miscellaneous features */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('microtasks', () => true || false || true, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('postmessage', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('microtasks', () => true || false || true, true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('postmessage', () => { // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist. return typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].window !== 'undefined' && typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].postMessage === 'function'; }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('raf', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].requestAnimationFrame === 'function', true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('setimmediate', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].setImmediate !== 'undefined', true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('raf', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].requestAnimationFrame === 'function', true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('setimmediate', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].setImmediate !== 'undefined', true); /* DOM Features */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('dom-mutationobserver', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('dom-mutationobserver', () => { if (true && Boolean(__WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].MutationObserver || __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].WebKitMutationObserver)) { // IE11 has an unreliable MutationObserver implementation where setProperty() does not // generate a mutation event, observers can crash, and the queue does not drain @@ -2371,18 +2371,18 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('dom-mutation } return false; }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('dom-webanimation', () => true && __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Animation !== undefined && __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].KeyframeEffect !== undefined, true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('dom-webanimation', () => true && __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Animation !== undefined && __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].KeyframeEffect !== undefined, true); //# sourceMappingURL=has.mjs.map /***/ }), -/***/ "./node_modules/@dojo/shim/support/queue.mjs": +/***/ "./node_modules/@dojo/framework/shim/support/queue.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export queueMicroTask */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); function executeTask(item) { @@ -2576,7 +2576,7 @@ let queueMicroTask = (function () { /***/ }), -/***/ "./node_modules/@dojo/shim/support/util.mjs": +/***/ "./node_modules/@dojo/framework/shim/support/util.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -2608,13 +2608,13 @@ function wrapNative(nativeFunction) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/Injector.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/Injector.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__ = __webpack_require__("./node_modules/@dojo/core/Evented.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__core_Evented__ = __webpack_require__("./node_modules/@dojo/framework/core/Evented.mjs"); -class Injector extends __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__["a" /* Evented */] { +class Injector extends __WEBPACK_IMPORTED_MODULE_0__core_Evented__["a" /* Evented */] { constructor(payload) { super(); this._payload = payload; @@ -2639,13 +2639,13 @@ class Injector extends __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__["a" /* E /***/ }), -/***/ "./node_modules/@dojo/widget-core/NodeHandler.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export NodeEventType */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__ = __webpack_require__("./node_modules/@dojo/core/Evented.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Map__ = __webpack_require__("./node_modules/@dojo/shim/Map.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__core_Evented__ = __webpack_require__("./node_modules/@dojo/framework/core/Evented.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__shim_Map__ = __webpack_require__("./node_modules/@dojo/framework/shim/Map.mjs"); /** @@ -2658,10 +2658,10 @@ var NodeEventType; NodeEventType["Projector"] = "Projector"; NodeEventType["Widget"] = "Widget"; })(NodeEventType || (NodeEventType = {})); -class NodeHandler extends __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__["a" /* Evented */] { +class NodeHandler extends __WEBPACK_IMPORTED_MODULE_0__core_Evented__["a" /* Evented */] { constructor() { super(...arguments); - this._nodeMap = new __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Map__["b" /* default */](); + this._nodeMap = new __WEBPACK_IMPORTED_MODULE_1__shim_Map__["b" /* default */](); } get(key) { return this._nodeMap.get(key); @@ -2690,16 +2690,16 @@ class NodeHandler extends __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__["a" / /***/ }), -/***/ "./node_modules/@dojo/widget-core/Registry.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/Registry.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["d"] = isWidgetBaseConstructor; /* unused harmony export isWidgetConstructorDefaultExport */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Promise__ = __webpack_require__("./node_modules/@dojo/shim/Promise.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Map__ = __webpack_require__("./node_modules/@dojo/shim/Map.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__dojo_shim_Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__ = __webpack_require__("./node_modules/@dojo/core/Evented.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_Promise__ = __webpack_require__("./node_modules/@dojo/framework/shim/Promise.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__shim_Map__ = __webpack_require__("./node_modules/@dojo/framework/shim/Map.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__shim_Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__core_Evented__ = __webpack_require__("./node_modules/@dojo/framework/core/Evented.mjs"); @@ -2707,7 +2707,7 @@ class NodeHandler extends __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__["a" / /** * Widget base symbol type */ -const WIDGET_BASE_TYPE = Object(__WEBPACK_IMPORTED_MODULE_2__dojo_shim_Symbol__["a" /* default */])('Widget Base'); +const WIDGET_BASE_TYPE = Object(__WEBPACK_IMPORTED_MODULE_2__shim_Symbol__["a" /* default */])('Widget Base'); /* harmony export (immutable) */ __webpack_exports__["b"] = WIDGET_BASE_TYPE; /** @@ -2728,7 +2728,7 @@ function isWidgetConstructorDefaultExport(item) { /** * The Registry implementation */ -class Registry extends __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__["a" /* Evented */] { +class Registry extends __WEBPACK_IMPORTED_MODULE_3__core_Evented__["a" /* Evented */] { /** * Emit loaded event for registry label */ @@ -2741,13 +2741,13 @@ class Registry extends __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__["a" /* E } define(label, item) { if (this._widgetRegistry === undefined) { - this._widgetRegistry = new __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Map__["b" /* default */](); + this._widgetRegistry = new __WEBPACK_IMPORTED_MODULE_1__shim_Map__["b" /* default */](); } if (this._widgetRegistry.has(label)) { throw new Error(`widget has already been registered for '${label.toString()}'`); } this._widgetRegistry.set(label, item); - if (item instanceof __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Promise__["a" /* default */]) { + if (item instanceof __WEBPACK_IMPORTED_MODULE_0__shim_Promise__["a" /* default */]) { item.then((widgetCtor) => { this._widgetRegistry.set(label, widgetCtor); this.emitLoadedEvent(label, widgetCtor); @@ -2762,12 +2762,12 @@ class Registry extends __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__["a" /* E } defineInjector(label, injectorFactory) { if (this._injectorRegistry === undefined) { - this._injectorRegistry = new __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Map__["b" /* default */](); + this._injectorRegistry = new __WEBPACK_IMPORTED_MODULE_1__shim_Map__["b" /* default */](); } if (this._injectorRegistry.has(label)) { throw new Error(`injector has already been registered for '${label.toString()}'`); } - const invalidator = new __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__["a" /* Evented */](); + const invalidator = new __WEBPACK_IMPORTED_MODULE_3__core_Evented__["a" /* Evented */](); const injectorItem = { injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })), invalidator @@ -2783,7 +2783,7 @@ class Registry extends __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__["a" /* E if (isWidgetBaseConstructor(item)) { return item; } - if (item instanceof __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Promise__["a" /* default */]) { + if (item instanceof __WEBPACK_IMPORTED_MODULE_0__shim_Promise__["a" /* default */]) { return null; } const promise = item(); @@ -2820,22 +2820,22 @@ class Registry extends __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__["a" /* E /***/ }), -/***/ "./node_modules/@dojo/widget-core/RegistryHandler.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__ = __webpack_require__("./node_modules/@dojo/shim/Map.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_core_Evented__ = __webpack_require__("./node_modules/@dojo/core/Evented.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Registry__ = __webpack_require__("./node_modules/@dojo/widget-core/Registry.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_Map__ = __webpack_require__("./node_modules/@dojo/framework/shim/Map.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__core_Evented__ = __webpack_require__("./node_modules/@dojo/framework/core/Evented.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Registry__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.mjs"); -class RegistryHandler extends __WEBPACK_IMPORTED_MODULE_1__dojo_core_Evented__["a" /* Evented */] { +class RegistryHandler extends __WEBPACK_IMPORTED_MODULE_1__core_Evented__["a" /* Evented */] { constructor() { super(); this._registry = new __WEBPACK_IMPORTED_MODULE_2__Registry__["a" /* Registry */](); - this._registryWidgetLabelMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["a" /* Map */](); - this._registryInjectorLabelMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["a" /* Map */](); + this._registryWidgetLabelMap = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["a" /* Map */](); + this._registryInjectorLabelMap = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["a" /* Map */](); this.own(this._registry); const destroy = () => { if (this.baseRegistry) { @@ -2904,19 +2904,19 @@ class RegistryHandler extends __WEBPACK_IMPORTED_MODULE_1__dojo_core_Evented__[" /***/ }), -/***/ "./node_modules/@dojo/widget-core/WidgetBase.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__ = __webpack_require__("./node_modules/@dojo/shim/Map.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_shim_WeakMap__ = __webpack_require__("./node_modules/@dojo/shim/WeakMap.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__dojo_shim_Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__d__ = __webpack_require__("./node_modules/@dojo/widget-core/d.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__diff__ = __webpack_require__("./node_modules/@dojo/widget-core/diff.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__RegistryHandler__ = __webpack_require__("./node_modules/@dojo/widget-core/RegistryHandler.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__NodeHandler__ = __webpack_require__("./node_modules/@dojo/widget-core/NodeHandler.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__vdom__ = __webpack_require__("./node_modules/@dojo/widget-core/vdom.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__Registry__ = __webpack_require__("./node_modules/@dojo/widget-core/Registry.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_Map__ = __webpack_require__("./node_modules/@dojo/framework/shim/Map.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__shim_WeakMap__ = __webpack_require__("./node_modules/@dojo/framework/shim/WeakMap.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__shim_Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__d__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__diff__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/diff.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__RegistryHandler__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__NodeHandler__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/NodeHandler.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__vdom__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/vdom.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__Registry__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.mjs"); @@ -2926,9 +2926,9 @@ class RegistryHandler extends __WEBPACK_IMPORTED_MODULE_1__dojo_core_Evented__[" -const decoratorMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */](); +const decoratorMap = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["b" /* default */](); const boundAuto = __WEBPACK_IMPORTED_MODULE_4__diff__["a" /* auto */].bind(null); -const noBind = __WEBPACK_IMPORTED_MODULE_2__dojo_shim_Symbol__["a" /* default */].for('dojoNoBind'); +const noBind = __WEBPACK_IMPORTED_MODULE_2__shim_Symbol__["a" /* default */].for('dojoNoBind'); /* harmony export (immutable) */ __webpack_exports__["b"] = noBind; /** @@ -2950,7 +2950,7 @@ class WidgetBase { this._nodeHandler = new __WEBPACK_IMPORTED_MODULE_6__NodeHandler__["a" /* default */](); this._handles = []; this._children = []; - this._decoratorCache = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */](); + this._decoratorCache = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["b" /* default */](); this._properties = {}; this._boundRenderFunc = this.render.bind(this); this._boundInvalidate = this.invalidate.bind(this); @@ -2975,7 +2975,7 @@ class WidgetBase { } meta(MetaType) { if (this._metaMap === undefined) { - this._metaMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */](); + this._metaMap = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["b" /* default */](); } let cached = this._metaMap.get(MetaType); if (!cached) { @@ -3059,9 +3059,14 @@ class WidgetBase { } } if (runReactions) { - this._mapDiffPropertyReactions(properties, changedPropertyKeys).forEach((args, reaction) => { - if (args.changed) { - reaction.call(this, args.previousProperties, args.newProperties); + const reactionFunctions = this.getDecorator('diffReaction'); + const executedReactions = []; + reactionFunctions.forEach(({ reaction, propertyName }) => { + const propertyChanged = changedPropertyKeys.indexOf(propertyName) !== -1; + const reactionRun = executedReactions.indexOf(reaction) !== -1; + if (propertyChanged && !reactionRun) { + reaction.call(this, this._properties, diffPropertyResults); + executedReactions.push(reaction); } }); } @@ -3124,7 +3129,7 @@ class WidgetBase { if (this.hasOwnProperty('constructor')) { let decoratorList = decoratorMap.get(this.constructor); if (!decoratorList) { - decoratorList = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */](); + decoratorList = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["b" /* default */](); decoratorMap.set(this.constructor, decoratorList); } let specificDecoratorList = decoratorList.get(decoratorKey); @@ -3176,26 +3181,6 @@ class WidgetBase { this._decoratorCache.set(decoratorKey, allDecorators); return allDecorators; } - _mapDiffPropertyReactions(newProperties, changedPropertyKeys) { - const reactionFunctions = this.getDecorator('diffReaction'); - return reactionFunctions.reduce((reactionPropertyMap, { reaction, propertyName }) => { - let reactionArguments = reactionPropertyMap.get(reaction); - if (reactionArguments === undefined) { - reactionArguments = { - previousProperties: {}, - newProperties: {}, - changed: false - }; - } - reactionArguments.previousProperties[propertyName] = this._properties[propertyName]; - reactionArguments.newProperties[propertyName] = newProperties[propertyName]; - if (changedPropertyKeys.indexOf(propertyName) !== -1) { - reactionArguments.changed = true; - } - reactionPropertyMap.set(reaction, reactionArguments); - return reactionPropertyMap; - }, new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */]()); - } /** * Binds unbound property functions to the specified `bind` property * @@ -3204,7 +3189,7 @@ class WidgetBase { _bindFunctionProperty(property, bind) { if (typeof property === 'function' && !property[noBind] && Object(__WEBPACK_IMPORTED_MODULE_8__Registry__["d" /* isWidgetBaseConstructor */])(property) === false) { if (this._bindFunctionPropertyMap === undefined) { - this._bindFunctionPropertyMap = new __WEBPACK_IMPORTED_MODULE_1__dojo_shim_WeakMap__["a" /* default */](); + this._bindFunctionPropertyMap = new __WEBPACK_IMPORTED_MODULE_1__shim_WeakMap__["a" /* default */](); } const bindInfo = this._bindFunctionPropertyMap.get(property) || {}; let { boundFunc, scope } = bindInfo; @@ -3258,7 +3243,7 @@ class WidgetBase { runAfterRenders(dNode) { const afterRenders = this.getDecorator('afterRender'); if (afterRenders.length > 0) { - return afterRenders.reduce((dNode, afterRenderFunction) => { + dNode = afterRenders.reduce((dNode, afterRenderFunction) => { return afterRenderFunction.call(this, dNode); }, dNode); } @@ -3298,7 +3283,7 @@ WidgetBase._type = __WEBPACK_IMPORTED_MODULE_8__Registry__["b" /* WIDGET_BASE_TY /***/ }), -/***/ "./node_modules/@dojo/widget-core/animations/cssTransitions.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -3368,7 +3353,7 @@ function enter(node, properties, enterAnimation) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/d.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/d.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -3380,24 +3365,24 @@ function enter(node, properties, enterAnimation) { /* harmony export (immutable) */ __webpack_exports__["h"] = w; /* harmony export (immutable) */ __webpack_exports__["g"] = v; /* harmony export (immutable) */ __webpack_exports__["c"] = dom; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); /** * The symbol identifier for a WNode type */ -const WNODE = Object(__WEBPACK_IMPORTED_MODULE_0__dojo_shim_Symbol__["a" /* default */])('Identifier for a WNode.'); +const WNODE = Object(__WEBPACK_IMPORTED_MODULE_0__shim_Symbol__["a" /* default */])('Identifier for a WNode.'); /* harmony export (immutable) */ __webpack_exports__["b"] = WNODE; /** * The symbol identifier for a VNode type */ -const VNODE = Object(__WEBPACK_IMPORTED_MODULE_0__dojo_shim_Symbol__["a" /* default */])('Identifier for a VNode.'); +const VNODE = Object(__WEBPACK_IMPORTED_MODULE_0__shim_Symbol__["a" /* default */])('Identifier for a VNode.'); /* harmony export (immutable) */ __webpack_exports__["a"] = VNODE; /** * The symbol identifier for a VNode type created using dom() */ -const DOMVNODE = Object(__WEBPACK_IMPORTED_MODULE_0__dojo_shim_Symbol__["a" /* default */])('Identifier for a VNode created using existing dom.'); +const DOMVNODE = Object(__WEBPACK_IMPORTED_MODULE_0__shim_Symbol__["a" /* default */])('Identifier for a VNode created using existing dom.'); /* unused harmony export DOMVNODE */ /** @@ -3499,12 +3484,12 @@ function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, child /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/afterRender.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = afterRender; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"); function afterRender(method) { return Object(__WEBPACK_IMPORTED_MODULE_0__handleDecorator__["a" /* handleDecorator */])((target, propertyKey) => { @@ -3516,13 +3501,13 @@ function afterRender(method) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = alwaysRender; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__beforeProperties__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__beforeProperties__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs"); function alwaysRender() { @@ -3537,12 +3522,12 @@ function alwaysRender() { /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = beforeProperties; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"); function beforeProperties(method) { return Object(__WEBPACK_IMPORTED_MODULE_0__handleDecorator__["a" /* handleDecorator */])((target, propertyKey) => { @@ -3554,13 +3539,13 @@ function beforeProperties(method) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/customElement.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = customElement; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__registerCustomElement__ = __webpack_require__("./node_modules/@dojo/widget-core/registerCustomElement.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Registry__ = __webpack_require__("./node_modules/@dojo/widget-core/Registry.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__registerCustomElement__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Registry__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.mjs"); /** @@ -3584,12 +3569,14 @@ function customElement({ tag, properties = [], attributes = [], events = [], chi /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = diffProperty; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__diff__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/diff.mjs"); + /** * Decorator that can be used to register a function as a specific property diff @@ -3598,7 +3585,7 @@ function customElement({ tag, properties = [], attributes = [], events = [], chi * @param diffType The diff type, default is DiffType.AUTO. * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM */ -function diffProperty(propertyName, diffFunction, reactionFunction) { +function diffProperty(propertyName, diffFunction = __WEBPACK_IMPORTED_MODULE_1__diff__["a" /* auto */], reactionFunction) { return Object(__WEBPACK_IMPORTED_MODULE_0__handleDecorator__["a" /* handleDecorator */])((target, propertyKey) => { target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null)); target.addDecorator('registeredDiffProperty', propertyName); @@ -3615,7 +3602,7 @@ function diffProperty(propertyName, diffFunction, reactionFunction) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -3641,21 +3628,21 @@ function handleDecorator(handler) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/inject.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = inject; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_WeakMap__ = __webpack_require__("./node_modules/@dojo/shim/WeakMap.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__handleDecorator__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__beforeProperties__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_WeakMap__ = __webpack_require__("./node_modules/@dojo/framework/shim/WeakMap.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__handleDecorator__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__beforeProperties__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs"); /** * Map of instances against registered injectors. */ -const registeredInjectorsMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_WeakMap__["a" /* default */](); +const registeredInjectorsMap = new __WEBPACK_IMPORTED_MODULE_0__shim_WeakMap__["a" /* default */](); /** * Decorator retrieves an injector from an available registry using the name and * calls the `getProperties` function with the payload from the injector @@ -3689,7 +3676,7 @@ function inject({ name, getProperties }) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/diff.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/diff.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -3698,7 +3685,7 @@ function inject({ name, getProperties }) { /* unused harmony export reference */ /* harmony export (immutable) */ __webpack_exports__["b"] = shallow; /* harmony export (immutable) */ __webpack_exports__["a"] = auto; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Registry__ = __webpack_require__("./node_modules/@dojo/widget-core/Registry.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Registry__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.mjs"); function isObjectOrArray(value) { return Object.prototype.toString.call(value) === '[object Object]' || Array.isArray(value); @@ -3768,7 +3755,7 @@ function auto(previousProperty, newProperty) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/mixins/Projector.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -3776,11 +3763,11 @@ function auto(previousProperty, newProperty) { /* unused harmony export AttachType */ /* harmony export (immutable) */ __webpack_exports__["a"] = ProjectorMixin; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_core_lang__ = __webpack_require__("./node_modules/@dojo/core/lang.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__animations_cssTransitions__ = __webpack_require__("./node_modules/@dojo/widget-core/animations/cssTransitions.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__decorators_afterRender__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/afterRender.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__d__ = __webpack_require__("./node_modules/@dojo/widget-core/d.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__vdom__ = __webpack_require__("./node_modules/@dojo/widget-core/vdom.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__core_lang__ = __webpack_require__("./node_modules/@dojo/framework/core/lang.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__animations_cssTransitions__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__decorators_afterRender__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__d__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__vdom__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/vdom.mjs"); @@ -3878,7 +3865,7 @@ function ProjectorMixin(Base) { this._projectorProperties.registry.destroy(); } } - this._projectorProperties = Object(__WEBPACK_IMPORTED_MODULE_1__dojo_core_lang__["a" /* assign */])({}, properties); + this._projectorProperties = Object(__WEBPACK_IMPORTED_MODULE_1__core_lang__["a" /* assign */])({}, properties); super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry }); super.__setProperties__(properties); } @@ -3929,10 +3916,7 @@ function ProjectorMixin(Base) { } } __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __decorate */]([ - Object(__WEBPACK_IMPORTED_MODULE_3__decorators_afterRender__["a" /* afterRender */])(), - __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __metadata */]("design:type", Function), - __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __metadata */]("design:paramtypes", [Object]), - __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __metadata */]("design:returntype", void 0) + Object(__WEBPACK_IMPORTED_MODULE_3__decorators_afterRender__["a" /* afterRender */])() ], Projector.prototype, "afterRender", null); return Projector; } @@ -3941,7 +3925,7 @@ function ProjectorMixin(Base) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/mixins/Themed.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -3949,11 +3933,11 @@ function ProjectorMixin(Base) { /* harmony export (immutable) */ __webpack_exports__["b"] = registerThemeInjector; /* harmony export (immutable) */ __webpack_exports__["a"] = ThemedMixin; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Injector__ = __webpack_require__("./node_modules/@dojo/widget-core/Injector.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__decorators_inject__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/inject.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__decorators_handleDecorator__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/diffProperty.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__diff__ = __webpack_require__("./node_modules/@dojo/widget-core/diff.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Injector__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/Injector.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__decorators_inject__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/inject.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__decorators_handleDecorator__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__diff__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/diff.mjs"); @@ -4066,7 +4050,7 @@ function ThemedMixin(Base) { const baseThemes = this.getDecorator('baseThemeClasses'); if (!this._registeredBaseTheme) { this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => { - const _a = THEME_KEY, key = baseTheme[_a], classes = __WEBPACK_IMPORTED_MODULE_0_tslib__["c" /* __rest */](baseTheme, [typeof _a === "symbol" ? _a : _a + ""]); + const _a = THEME_KEY, key = baseTheme[_a], classes = __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __rest */](baseTheme, [typeof _a === "symbol" ? _a : _a + ""]); this._registeredBaseThemeKeys.push(key); return Object.assign({}, finalBaseTheme, classes); }, {}); @@ -4080,10 +4064,7 @@ function ThemedMixin(Base) { }; __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __decorate */]([ Object(__WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__["a" /* diffProperty */])('theme', __WEBPACK_IMPORTED_MODULE_5__diff__["b" /* shallow */]), - Object(__WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__["a" /* diffProperty */])('extraClasses', __WEBPACK_IMPORTED_MODULE_5__diff__["b" /* shallow */]), - __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __metadata */]("design:type", Function), - __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __metadata */]("design:paramtypes", []), - __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __metadata */]("design:returntype", void 0) + Object(__WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__["a" /* diffProperty */])('extraClasses', __WEBPACK_IMPORTED_MODULE_5__diff__["b" /* shallow */]) ], Themed.prototype, "onPropertiesChanged", null); Themed = __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __decorate */]([ Object(__WEBPACK_IMPORTED_MODULE_2__decorators_inject__["a" /* inject */])({ @@ -4103,7 +4084,7 @@ function ThemedMixin(Base) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/registerCustomElement.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -4113,13 +4094,13 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony export (immutable) */ __webpack_exports__["create"] = create; /* harmony export (immutable) */ __webpack_exports__["register"] = register; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__WidgetBase__ = __webpack_require__("./node_modules/@dojo/widget-core/WidgetBase.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mixins_Projector__ = __webpack_require__("./node_modules/@dojo/widget-core/mixins/Projector.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__dojo_shim_array__ = __webpack_require__("./node_modules/@dojo/shim/array.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__d__ = __webpack_require__("./node_modules/@dojo/widget-core/d.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__mixins_Themed__ = __webpack_require__("./node_modules/@dojo/widget-core/mixins/Themed.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__decorators_alwaysRender__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__WidgetBase__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/WidgetBase.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mixins_Projector__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__shim_array__ = __webpack_require__("./node_modules/@dojo/framework/shim/array.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__d__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__shim_global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__mixins_Themed__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__decorators_alwaysRender__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs"); @@ -4216,7 +4197,7 @@ function create(descriptor, WidgetConstructor) { }); Object.defineProperties(this, domProperties); const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children; - Object(__WEBPACK_IMPORTED_MODULE_3__dojo_shim_array__["a" /* from */])(children).forEach((childNode) => { + Object(__WEBPACK_IMPORTED_MODULE_3__shim_array__["a" /* from */])(children).forEach((childNode) => { if (childType === CustomElementChildType.DOJO) { childNode.addEventListener('dojo-ce-render', () => this._render()); childNode.addEventListener('dojo-ce-connected', () => this._render()); @@ -4236,7 +4217,7 @@ function create(descriptor, WidgetConstructor) { }; const registry = registryFactory(); const themeContext = Object(__WEBPACK_IMPORTED_MODULE_6__mixins_Themed__["b" /* registerThemeInjector */])(this._getTheme(), registry); - __WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */].addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme())); + __WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */].addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme())); const Projector = Object(__WEBPACK_IMPORTED_MODULE_2__mixins_Projector__["a" /* ProjectorMixin */])(Wrapper); this._projector = new Projector(); this._projector.setProperties({ registry }); @@ -4248,8 +4229,8 @@ function create(descriptor, WidgetConstructor) { })); } _getTheme() { - if (__WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */] && __WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */].dojoce && __WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */].dojoce.theme) { - return __WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */].dojoce.themes[__WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */].dojoce.theme]; + if (__WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */] && __WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */].dojoce && __WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */].dojoce.theme) { + return __WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */].dojoce.themes[__WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */].dojoce.theme]; } } _childConnected(e) { @@ -4329,25 +4310,25 @@ function register(WidgetConstructor) { if (!descriptor) { throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?'); } - __WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */].customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor)); + __WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */].customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor)); } /* harmony default export */ __webpack_exports__["default"] = (register); //# sourceMappingURL=registerCustomElement.mjs.map /***/ }), -/***/ "./node_modules/@dojo/widget-core/vdom.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/vdom.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export toParentVNode */ /* unused harmony export toTextVNode */ /* unused harmony export filterAndDecorateChildren */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_shim_array__ = __webpack_require__("./node_modules/@dojo/shim/array.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__d__ = __webpack_require__("./node_modules/@dojo/widget-core/d.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Registry__ = __webpack_require__("./node_modules/@dojo/widget-core/Registry.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__ = __webpack_require__("./node_modules/@dojo/shim/WeakMap.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__shim_array__ = __webpack_require__("./node_modules/@dojo/framework/shim/array.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__d__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Registry__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__ = __webpack_require__("./node_modules/@dojo/framework/shim/WeakMap.mjs"); @@ -4357,11 +4338,13 @@ const NAMESPACE_W3 = 'http://www.w3.org/'; const NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg'; const NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink'; const emptyArray = []; -const widgetInstanceMap = new __WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__["a" /* default */](); +const nodeOperations = ['focus', 'blur', 'scrollIntoView', 'click']; +const widgetInstanceMap = new __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__["a" /* default */](); /* harmony export (immutable) */ __webpack_exports__["b"] = widgetInstanceMap; -const instanceMap = new __WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__["a" /* default */](); -const projectorStateMap = new __WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__["a" /* default */](); +const instanceMap = new __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__["a" /* default */](); +const nextSiblingMap = new __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__["a" /* default */](); +const projectorStateMap = new __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__["a" /* default */](); function same(dnode1, dnode2) { if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["e" /* isVNode */])(dnode1) && Object(__WEBPACK_IMPORTED_MODULE_2__d__["e" /* isVNode */])(dnode2)) { if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["d" /* isDomVNode */])(dnode1) || Object(__WEBPACK_IMPORTED_MODULE_2__d__["d" /* isDomVNode */])(dnode2)) { @@ -4418,7 +4401,7 @@ function checkStyleValue(styleValue) { } function updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) { const projectorState = projectorStateMap.get(projectionOptions.projectorInstance); - const eventMap = projectorState.nodeMap.get(domNode) || new __WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__["a" /* default */](); + const eventMap = projectorState.nodeMap.get(domNode) || new __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__["a" /* default */](); if (previousValue) { const previousEvent = eventMap.get(previousValue); domNode.removeEventListener(eventName, previousEvent); @@ -4478,7 +4461,7 @@ function buildPreviousProperties(domNode, previous, current) { }, {}); return newProperties; } -function focusNode(propValue, previousValue, domNode, projectionOptions) { +function nodeOperation(propName, propValue, previousValue, domNode, projectionOptions) { let result; if (typeof propValue === 'function') { result = propValue(); @@ -4489,7 +4472,7 @@ function focusNode(propValue, previousValue, domNode, projectionOptions) { if (result === true) { const projectorState = projectorStateMap.get(projectionOptions.projectorInstance); projectorState.deferredRenderCallbacks.push(() => { - domNode.focus(); + domNode[propName](); }); } } @@ -4585,8 +4568,8 @@ function updateProperties(domNode, previousProperties, properties, projectionOpt } } } - else if (propName === 'focus') { - focusNode(propValue, previousValue, domNode, projectionOptions); + else if (nodeOperations.indexOf(propName) !== -1) { + nodeOperation(propName, propValue, previousValue, domNode, projectionOptions); } else if (propName === 'styles') { const styleNames = Object.keys(propValue); @@ -4740,7 +4723,8 @@ function nodeAdded(dnode, transitions) { } function nodeToRemove(dnode, transitions, projectionOptions) { if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["f" /* isWNode */])(dnode)) { - const rendered = dnode.rendered || emptyArray; + const item = instanceMap.get(dnode.instance); + const rendered = (item ? item.dnode.rendered : dnode.rendered) || emptyArray; if (dnode.instance) { const instanceData = widgetInstanceMap.get(dnode.instance); instanceData.onDetach(); @@ -4804,7 +4788,7 @@ function checkDistinguishable(childNodes, indexToCheck, parentInstance) { } } } -function updateChildren(parentVNode, oldChildren, newChildren, parentInstance, projectionOptions) { +function updateChildren(parentVNode, siblings, oldChildren, newChildren, parentInstance, projectionOptions) { oldChildren = oldChildren || emptyArray; newChildren = newChildren; const oldChildrenLength = oldChildren.length; @@ -4824,38 +4808,49 @@ function updateChildren(parentVNode, oldChildren, newChildren, parentInstance, p addDeferredProperties(newChild, projectionOptions); } if (oldChild !== undefined && same(oldChild, newChild)) { - textUpdated = updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance) || textUpdated; oldIndex++; newIndex++; + textUpdated = + updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance, oldChildren.slice(oldIndex), newChildren.slice(newIndex)) || textUpdated; continue; } const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1); const addChild = () => { let insertBeforeDomNode = undefined; + let childrenArray = oldChildren; + let nextIndex = oldIndex + 1; let child = oldChildren[oldIndex]; + if (!child) { + child = siblings[0]; + nextIndex = 1; + childrenArray = siblings; + } if (child) { - let nextIndex = oldIndex + 1; let insertBeforeChildren = [child]; while (insertBeforeChildren.length) { const insertBefore = insertBeforeChildren.shift(); if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["f" /* isWNode */])(insertBefore)) { - if (insertBefore.rendered) { - insertBeforeChildren.push(...insertBefore.rendered); + const item = instanceMap.get(insertBefore.instance); + if (item && item.dnode.rendered) { + insertBeforeChildren.push(...item.dnode.rendered); } } else { if (insertBefore.domNode) { + if (insertBefore.domNode.parentElement !== parentVNode.domNode) { + break; + } insertBeforeDomNode = insertBefore.domNode; break; } } - if (insertBeforeChildren.length === 0 && oldChildren[nextIndex]) { - insertBeforeChildren.push(oldChildren[nextIndex]); + if (insertBeforeChildren.length === 0 && childrenArray[nextIndex]) { + insertBeforeChildren.push(childrenArray[nextIndex]); nextIndex++; } } } - createDom(newChild, parentVNode, insertBeforeDomNode, projectionOptions, parentInstance); + createDom(newChild, parentVNode, newChildren.slice(newIndex + 1), insertBeforeDomNode, projectionOptions, parentInstance); nodeAdded(newChild, transitions); const indexToCheck = newIndex; projectorState.afterRenderCallbacks.push(() => { @@ -4916,12 +4911,13 @@ function addChildren(parentVNode, children, projectionOptions, parentInstance, i } const projectorState = projectorStateMap.get(projectionOptions.projectorInstance); if (projectorState.merge && childNodes === undefined) { - childNodes = Object(__WEBPACK_IMPORTED_MODULE_1__dojo_shim_array__["a" /* from */])(parentVNode.domNode.childNodes); + childNodes = Object(__WEBPACK_IMPORTED_MODULE_1__shim_array__["a" /* from */])(parentVNode.domNode.childNodes); } const transitions = projectionOptions.transitions; projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 }); for (let i = 0; i < children.length; i++) { const child = children[i]; + const nextSiblings = children.slice(i + 1); if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["e" /* isVNode */])(child)) { if (projectorState.merge && childNodes) { let domElement = undefined; @@ -4932,10 +4928,10 @@ function addChildren(parentVNode, children, projectionOptions, parentInstance, i } } } - createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance); + createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance); } else { - createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes); + createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes); } nodeAdded(child, transitions); } @@ -4963,7 +4959,7 @@ function initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOpt } dnode.inserted = true; } -function createDom(dnode, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes) { +function createDom(dnode, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes) { let domNode; const projectorState = projectorStateMap.get(projectionOptions.projectorInstance); if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["f" /* isWNode */])(dnode)) { @@ -4978,6 +4974,7 @@ function createDom(dnode, parentVNode, insertBefore, projectionOptions, parentIn } const instance = new widgetConstructor(); dnode.instance = instance; + nextSiblingMap.set(instance, nextSiblings); const instanceData = widgetInstanceMap.get(instance); instanceData.invalidate = () => { instanceData.dirty = true; @@ -5058,7 +5055,7 @@ function createDom(dnode, parentVNode, insertBefore, projectionOptions, parentIn } } } -function updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance) { +function updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance, oldNextSiblings, nextSiblings) { if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["f" /* isWNode */])(dnode)) { const { instance } = previous; const { parentVNode, dnode: node } = instanceMap.get(instance); @@ -5068,12 +5065,13 @@ function updateDom(previous, dnode, projectionOptions, parentVNode, parentInstan instance.__setCoreProperties__(dnode.coreProperties); instance.__setChildren__(dnode.children); instance.__setProperties__(dnode.properties); + nextSiblingMap.set(instance, nextSiblings); dnode.instance = instance; if (instanceData.dirty === true) { const rendered = instance.__render__(); instanceData.rendering = false; dnode.rendered = filterAndDecorateChildren(rendered, instance); - updateChildren(parentVNode, previousRendered, dnode.rendered, instance, projectionOptions); + updateChildren(parentVNode, oldNextSiblings, previousRendered, dnode.rendered, instance, projectionOptions); } else { instanceData.rendering = false; @@ -5106,7 +5104,7 @@ function updateDom(previous, dnode, projectionOptions, parentVNode, parentInstan const children = filterAndDecorateChildren(dnode.children, parentInstance); dnode.children = children; updated = - updateChildren(dnode, previous.children, children, parentInstance, projectionOptions) || updated; + updateChildren(dnode, oldNextSiblings, previous.children, children, parentInstance, projectionOptions) || updated; } const previousProperties = buildPreviousProperties(domNode, previous, dnode); if (dnode.attributes && dnode.events) { @@ -5156,7 +5154,7 @@ function runDeferredRenderCallbacks(projectionOptions) { } } else { - __WEBPACK_IMPORTED_MODULE_0__dojo_shim_global__["a" /* default */].requestAnimationFrame(() => { + __WEBPACK_IMPORTED_MODULE_0__shim_global__["a" /* default */].requestAnimationFrame(() => { while (projectorState.deferredRenderCallbacks.length) { const callback = projectorState.deferredRenderCallbacks.shift(); callback && callback(); @@ -5174,8 +5172,8 @@ function runAfterRenderCallbacks(projectionOptions) { } } else { - if (__WEBPACK_IMPORTED_MODULE_0__dojo_shim_global__["a" /* default */].requestIdleCallback) { - __WEBPACK_IMPORTED_MODULE_0__dojo_shim_global__["a" /* default */].requestIdleCallback(() => { + if (__WEBPACK_IMPORTED_MODULE_0__shim_global__["a" /* default */].requestIdleCallback) { + __WEBPACK_IMPORTED_MODULE_0__shim_global__["a" /* default */].requestIdleCallback(() => { while (projectorState.afterRenderCallbacks.length) { const callback = projectorState.afterRenderCallbacks.shift(); callback && callback(); @@ -5198,7 +5196,7 @@ function scheduleRender(projectionOptions) { render(projectionOptions); } else if (projectorState.renderScheduled === undefined) { - projectorState.renderScheduled = __WEBPACK_IMPORTED_MODULE_0__dojo_shim_global__["a" /* default */].requestAnimationFrame(() => { + projectorState.renderScheduled = __WEBPACK_IMPORTED_MODULE_0__shim_global__["a" /* default */].requestAnimationFrame(() => { render(projectionOptions); }); } @@ -5217,7 +5215,8 @@ function render(projectionOptions) { previouslyRendered.push(instance); const { parentVNode, dnode } = instanceMap.get(instance); const instanceData = widgetInstanceMap.get(instance); - updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance); + const nextSiblings = nextSiblingMap.get(instance); + updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance, nextSiblings, nextSiblings); } } runAfterRenderCallbacks(projectionOptions); @@ -5230,7 +5229,7 @@ const dom = { const projectorState = { afterRenderCallbacks: [], deferredRenderCallbacks: [], - nodeMap: new __WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__["a" /* default */](), + nodeMap: new __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__["a" /* default */](), renderScheduled: undefined, renderQueue: [], merge: projectionOptions.merge || false, @@ -5248,7 +5247,7 @@ const dom = { scheduleRender(finalProjectorOptions); } }; - updateDom(node, node, finalProjectorOptions, parentVNode, instance); + updateDom(node, node, finalProjectorOptions, parentVNode, instance, [], []); projectorState.afterRenderCallbacks.push(() => { instanceData.onAttach(); }); @@ -5282,7 +5281,7 @@ const dom = { /*** IMPORTS FROM imports-loader ***/ var widgetFactory = __webpack_require__("./src/menu/Menu.ts"); -var registerCustomElement = __webpack_require__("./node_modules/@dojo/widget-core/registerCustomElement.mjs").default; +var registerCustomElement = __webpack_require__("./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs").default; var defaultExport = widgetFactory.default; defaultExport && registerCustomElement(defaultExport); @@ -5488,10 +5487,10 @@ process.umask = function() { return 0; }; "use strict"; /* unused harmony export __extends */ /* unused harmony export __assign */ -/* harmony export (immutable) */ __webpack_exports__["c"] = __rest; +/* harmony export (immutable) */ __webpack_exports__["b"] = __rest; /* harmony export (immutable) */ __webpack_exports__["a"] = __decorate; /* unused harmony export __param */ -/* harmony export (immutable) */ __webpack_exports__["b"] = __metadata; +/* unused harmony export __metadata */ /* unused harmony export __awaiter */ /* unused harmony export __generator */ /* unused harmony export __exportStar */ @@ -5708,10 +5707,10 @@ module.exports = g; Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Menu", function() { return Menu; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_widget_core_d__ = __webpack_require__("./node_modules/@dojo/widget-core/d.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__dojo_widget_core_decorators_customElement__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/customElement.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__dojo_widget_core_mixins_Themed__ = __webpack_require__("./node_modules/@dojo/widget-core/mixins/Themed.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__dojo_widget_core_WidgetBase__ = __webpack_require__("./node_modules/@dojo/widget-core/WidgetBase.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_framework_widget_core_d__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__dojo_framework_widget_core_decorators_customElement__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__dojo_framework_widget_core_mixins_Themed__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__dojo_framework_widget_core_WidgetBase__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/WidgetBase.mjs"); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__menu_m_css__ = __webpack_require__("./src/menu/menu.m.css"); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__menu_m_css___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5__menu_m_css__); @@ -5720,7 +5719,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); -let Menu = class Menu extends Object(__WEBPACK_IMPORTED_MODULE_3__dojo_widget_core_mixins_Themed__["a" /* ThemedMixin */])(__WEBPACK_IMPORTED_MODULE_4__dojo_widget_core_WidgetBase__["a" /* WidgetBase */]) { +let Menu = class Menu extends Object(__WEBPACK_IMPORTED_MODULE_3__dojo_framework_widget_core_mixins_Themed__["a" /* ThemedMixin */])(__WEBPACK_IMPORTED_MODULE_4__dojo_framework_widget_core_WidgetBase__["a" /* WidgetBase */]) { _onSelected(id, data) { this._selectedId = id; this.properties.onSelected(data); @@ -5741,19 +5740,19 @@ let Menu = class Menu extends Object(__WEBPACK_IMPORTED_MODULE_3__dojo_widget_co } return child; }); - return Object(__WEBPACK_IMPORTED_MODULE_1__dojo_widget_core_d__["g" /* v */])('nav', { classes: this.theme(__WEBPACK_IMPORTED_MODULE_5__menu_m_css__["root"]) }, [ - Object(__WEBPACK_IMPORTED_MODULE_1__dojo_widget_core_d__["g" /* v */])('ol', { + return Object(__WEBPACK_IMPORTED_MODULE_1__dojo_framework_widget_core_d__["g" /* v */])('nav', { classes: this.theme(__WEBPACK_IMPORTED_MODULE_5__menu_m_css__["root"]) }, [ + Object(__WEBPACK_IMPORTED_MODULE_1__dojo_framework_widget_core_d__["g" /* v */])('ol', { classes: this.theme(__WEBPACK_IMPORTED_MODULE_5__menu_m_css__["menuContainer"]) }, items) ]); } }; Menu = __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __decorate */]([ - Object(__WEBPACK_IMPORTED_MODULE_2__dojo_widget_core_decorators_customElement__["a" /* customElement */])({ + Object(__WEBPACK_IMPORTED_MODULE_2__dojo_framework_widget_core_decorators_customElement__["a" /* customElement */])({ tag: 'demo-menu', events: ['onSelected'] }), - Object(__WEBPACK_IMPORTED_MODULE_3__dojo_widget_core_mixins_Themed__["c" /* theme */])(__WEBPACK_IMPORTED_MODULE_5__menu_m_css__) + Object(__WEBPACK_IMPORTED_MODULE_3__dojo_framework_widget_core_mixins_Themed__["c" /* theme */])(__WEBPACK_IMPORTED_MODULE_5__menu_m_css__) ], Menu); /* harmony default export */ __webpack_exports__["default"] = (Menu); @@ -5778,4 +5777,4 @@ module.exports = __webpack_require__("./node_modules/imports-loader/index.js?wid /***/ }) /******/ }));; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgYzJkMGQxODVmODI0NzQ4ODYzMzQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2NvcmUvRGVzdHJveWFibGUubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9jb3JlL0V2ZW50ZWQubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9jb3JlL2xhbmcubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9oYXMvaGFzLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9NYXAubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL1Byb21pc2UubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL1N5bWJvbC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vV2Vha01hcC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vYXJyYXkubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL2dsb2JhbC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vaXRlcmF0b3IubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL251bWJlci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vb2JqZWN0Lm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdHJpbmcubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL3N1cHBvcnQvaGFzLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdXBwb3J0L3F1ZXVlLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdXBwb3J0L3V0aWwubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9JbmplY3Rvci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL05vZGVIYW5kbGVyLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvUmVnaXN0cnkubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9SZWdpc3RyeUhhbmRsZXIubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9XaWRnZXRCYXNlLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvYW5pbWF0aW9ucy9jc3NUcmFuc2l0aW9ucy5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2QubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2FmdGVyUmVuZGVyLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9hbHdheXNSZW5kZXIubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2JlZm9yZVByb3BlcnRpZXMubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2N1c3RvbUVsZW1lbnQubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2RpZmZQcm9wZXJ0eS5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaGFuZGxlRGVjb3JhdG9yLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9pbmplY3QubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kaWZmLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvbWl4aW5zL1Byb2plY3Rvci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL21peGlucy9UaGVtZWQubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9yZWdpc3RlckN1c3RvbUVsZW1lbnQubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS92ZG9tLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vY2xpLWJ1aWxkLXdpZGdldC90ZW1wbGF0ZS9jdXN0b20tZWxlbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbWVudS9NZW51LnRzIiwid2VicGFjazovLy8uL3NyYy9tZW51L21lbnUubS5jc3M/ZWMxMSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUFzRCwrREFBK0Q7O0FBRXJIO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7QUM3RGdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEIsaUJBQWlCLE9BQU87QUFDeEI7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvQkFBb0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQSx3Qzs7Ozs7Ozs7Ozs7QUN2REE7QUFDc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsZ0NBQWdDO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2RWlCO0FBQ0E7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiwyQkFBMkI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLG9CQUFvQjtBQUMzQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsaUM7Ozs7Ozs7Ozs7OztBQ25NQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLE9BQU8saUJBQWlCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxRQUFRO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRUFBMkUsUUFBUTtBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxnQzs7Ozs7Ozs7Ozs7Ozs7O0FDbk1vQztBQUNwQztBQUN5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLHFCQUFxQjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxZQUFZO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFELFlBQVk7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0M7Ozs7Ozs7Ozs7Ozs7QUMvRkE7QUFDeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsTUFBTTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MsV0FBVztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsTUFBTTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QixxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7Ozs7O0FDdE1BO0FBQ0E7QUFDNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsSUFBSTtBQUNwQixnQkFBZ0IsT0FBTztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxJQUFJO0FBQ2hCLFlBQVksVUFBVTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxtQzs7Ozs7Ozs7Ozs7OztBQ2hKQTtBQUNzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxxQkFBcUI7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGdDQUFnQztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlHQTtBQUNrQztBQUNQO0FBQzNCO0FBQ3FCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3RELG9EQUFvRDtBQUNwRCxpREFBaUQ7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRUFBcUU7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsc0JBQXNCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFlBQVk7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLFNBQVM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0M7Ozs7Ozs7O0FDdlBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG1DOzs7Ozs7Ozs7Ozs7Ozs7QUNqQkE7QUFDaUQ7QUFDakQsb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDOzs7Ozs7Ozs7Ozs7O0FDOUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyREE7QUFDQTtBQUNtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0Q7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLElBQUk7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlHQTtBQUNBO0FBQ3FCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELFlBQVk7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RkFBd0Y7QUFDeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DOzs7Ozs7Ozs7OztBQ3hTbUI7QUFDbkI7MEVBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsRUFBRTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCxFQUFFO0FBQ2pFLG1DQUFtQyxtQkFBbUI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxnQzs7Ozs7Ozs7Ozs7QUNyS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFBQTtBQUFBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4RUFBOEU7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFBQTtBQUFBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsYUFBYSxrQkFBa0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Qzs7Ozs7Ozs7QUNyWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZELGNBQWM7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSw4REFBOEQsZUFBZTtBQUM3RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixxQkFBcUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSxpQkFBaUIsS0FBSztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHFCQUFxQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixxQkFBcUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsMkJBQTJCO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtFQUFrRTtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsMkJBQTJCO0FBQzlEO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCwrQ0FBK0M7QUFDaEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTCw4REFBOEQ7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQSxpQzs7Ozs7OztBQ3g1QkE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7QUNOQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQy9CLENBQUM7aUJBQ0QsQ0FBQztnQkFDRixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7b0JBQ3BDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsS0FBSyxLQUFLLElBQUksQ0FBQyxXQUFXLENBQUM7Z0JBQ2xELENBQUM7Z0JBQ0QsS0FBSyxDQUFDLFVBQVUscUJBQVEsS0FBSyxDQUFDLFVBQVUsRUFBSyxVQUFVLENBQUUsQ0FBQztZQUMzRCxDQUFDO1lBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLHNFQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsaURBQVEsQ0FBQyxFQUFFLEVBQUU7WUFDbEQsc0VBQUMsQ0FDQSxJQUFJLEVBQ0o7Z0JBQ0MsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsMERBQWlCLENBQUM7YUFDdEMsRUFDRCxLQUFLLENBQ0w7U0FDRCxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0Q7QUFuQ1ksSUFBSTtJQUxoQix5R0FBYSxDQUFpQjtRQUM5QixHQUFHLEVBQUUsV0FBVztRQUNoQixNQUFNLEVBQUUsQ0FBQyxZQUFZLENBQUM7S0FDdEIsQ0FBQztJQUNELHNGQUFLLENBQUMseUNBQUcsQ0FBQztHQUNFLElBQUksQ0FtQ2hCO0FBbkNnQjtBQXFDakIsK0RBQWUsSUFBSSxFQUFDOzs7Ozs7OztBQ3ZEcEI7QUFDQSxrQkFBa0IscUciLCJmaWxlIjoibWVudS0xLjAuMC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIGMyZDBkMTg1ZjgyNDc0ODg2MzM0IiwiaW1wb3J0IHsgY3JlYXRlQ29tcG9zaXRlSGFuZGxlIH0gZnJvbSAnLi9sYW5nJztcbmltcG9ydCBQcm9taXNlIGZyb20gJ0Bkb2pvL3NoaW0vUHJvbWlzZSc7XG4vKipcbiAqIE5vIG9wZXJhdGlvbiBmdW5jdGlvbiB0byByZXBsYWNlIG93biBvbmNlIGluc3RhbmNlIGlzIGRlc3RvcnllZFxuICovXG5mdW5jdGlvbiBub29wKCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xufVxuLyoqXG4gKiBObyBvcCBmdW5jdGlvbiB1c2VkIHRvIHJlcGxhY2Ugb3duLCBvbmNlIGluc3RhbmNlIGhhcyBiZWVuIGRlc3RvcnllZFxuICovXG5mdW5jdGlvbiBkZXN0cm95ZWQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsIG1hZGUgdG8gZGVzdHJveWVkIG1ldGhvZCcpO1xufVxuZXhwb3J0IGNsYXNzIERlc3Ryb3lhYmxlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVzID0gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGhhbmRsZXMgZm9yIHRoZSBpbnN0YW5jZSB0aGF0IHdpbGwgYmUgZGVzdHJveWVkIHdoZW4gYHRoaXMuZGVzdHJveWAgaXMgY2FsbGVkXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hhbmRsZX0gaGFuZGxlIFRoZSBoYW5kbGUgdG8gYWRkIGZvciB0aGUgaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7SGFuZGxlfSBhIGhhbmRsZSBmb3IgdGhlIGhhbmRsZSwgcmVtb3ZlcyB0aGUgaGFuZGxlIGZvciB0aGUgaW5zdGFuY2UgYW5kIGNhbGxzIGRlc3Ryb3lcbiAgICAgKi9cbiAgICBvd24oaGFuZGxlcykge1xuICAgICAgICBjb25zdCBoYW5kbGUgPSBBcnJheS5pc0FycmF5KGhhbmRsZXMpID8gY3JlYXRlQ29tcG9zaXRlSGFuZGxlKC4uLmhhbmRsZXMpIDogaGFuZGxlcztcbiAgICAgICAgY29uc3QgeyBoYW5kbGVzOiBfaGFuZGxlcyB9ID0gdGhpcztcbiAgICAgICAgX2hhbmRsZXMucHVzaChoYW5kbGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgICAgICAgICBfaGFuZGxlcy5zcGxpY2UoX2hhbmRsZXMuaW5kZXhPZihoYW5kbGUpKTtcbiAgICAgICAgICAgICAgICBoYW5kbGUuZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZXN0cnB5cyBhbGwgaGFuZGVycyByZWdpc3RlcmVkIGZvciB0aGUgaW5zdGFuY2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPGFueX0gYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSBhbGwgaGFuZGxlcyBoYXZlIGJlZW4gZGVzdHJveWVkXG4gICAgICovXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZXMuZm9yRWFjaCgoaGFuZGxlKSA9PiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlICYmIGhhbmRsZS5kZXN0cm95ICYmIGhhbmRsZS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveSA9IG5vb3A7XG4gICAgICAgICAgICB0aGlzLm93biA9IGRlc3Ryb3llZDtcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IERlc3Ryb3lhYmxlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVzdHJveWFibGUubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2NvcmUvRGVzdHJveWFibGUubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9jb3JlL0Rlc3Ryb3lhYmxlLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgTWFwIGZyb20gJ0Bkb2pvL3NoaW0vTWFwJztcbmltcG9ydCB7IERlc3Ryb3lhYmxlIH0gZnJvbSAnLi9EZXN0cm95YWJsZSc7XG4vKipcbiAqIE1hcCBvZiBjb21wdXRlZCByZWd1bGFyIGV4cHJlc3Npb25zLCBrZXllZCBieSBzdHJpbmdcbiAqL1xuY29uc3QgcmVnZXhNYXAgPSBuZXcgTWFwKCk7XG4vKipcbiAqIERldGVybWluZXMgaXMgdGhlIGV2ZW50IHR5cGUgZ2xvYiBoYXMgYmVlbiBtYXRjaGVkXG4gKlxuICogQHJldHVybnMgYm9vbGVhbiB0aGF0IGluZGljYXRlcyBpZiB0aGUgZ2xvYiBpcyBtYXRjaGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0dsb2JNYXRjaChnbG9iU3RyaW5nLCB0YXJnZXRTdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHRhcmdldFN0cmluZyA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIGdsb2JTdHJpbmcgPT09ICdzdHJpbmcnICYmIGdsb2JTdHJpbmcuaW5kZXhPZignKicpICE9PSAtMSkge1xuICAgICAgICBsZXQgcmVnZXg7XG4gICAgICAgIGlmIChyZWdleE1hcC5oYXMoZ2xvYlN0cmluZykpIHtcbiAgICAgICAgICAgIHJlZ2V4ID0gcmVnZXhNYXAuZ2V0KGdsb2JTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVnZXggPSBuZXcgUmVnRXhwKGBeJHtnbG9iU3RyaW5nLnJlcGxhY2UoL1xcKi9nLCAnLionKX0kYCk7XG4gICAgICAgICAgICByZWdleE1hcC5zZXQoZ2xvYlN0cmluZywgcmVnZXgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWdleC50ZXN0KHRhcmdldFN0cmluZyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gZ2xvYlN0cmluZyA9PT0gdGFyZ2V0U3RyaW5nO1xuICAgIH1cbn1cbi8qKlxuICogRXZlbnQgQ2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIEV2ZW50ZWQgZXh0ZW5kcyBEZXN0cm95YWJsZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBtYXAgb2YgbGlzdGVuZXJzIGtleWVkIGJ5IGV2ZW50IHR5cGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubGlzdGVuZXJzTWFwID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBlbWl0KGV2ZW50KSB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzTWFwLmZvckVhY2goKG1ldGhvZHMsIHR5cGUpID0+IHtcbiAgICAgICAgICAgIGlmIChpc0dsb2JNYXRjaCh0eXBlLCBldmVudC50eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZHMuZm9yRWFjaCgobWV0aG9kKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZC5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxpc3RlbmVyKSkge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlcyA9IGxpc3RlbmVyLm1hcCgobGlzdGVuZXIpID0+IHRoaXMuX2FkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXMuZm9yRWFjaCgoaGFuZGxlKSA9PiBoYW5kbGUuZGVzdHJveSgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7XG4gICAgfVxuICAgIF9hZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyc01hcC5nZXQodHlwZSkgfHwgW107XG4gICAgICAgIGxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnNNYXAuc2V0KHR5cGUsIGxpc3RlbmVycyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZXN0cm95OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnNNYXAuZ2V0KHR5cGUpIHx8IFtdO1xuICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UobGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBFdmVudGVkO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXZlbnRlZC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vY29yZS9FdmVudGVkLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vY29yZS9FdmVudGVkLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgeyBhc3NpZ24gfSBmcm9tICdAZG9qby9zaGltL29iamVjdCc7XG5leHBvcnQgeyBhc3NpZ24gfSBmcm9tICdAZG9qby9zaGltL29iamVjdCc7XG5jb25zdCBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbmNvbnN0IGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbi8qKlxuICogVHlwZSBndWFyZCB0aGF0IGVuc3VyZXMgdGhhdCB0aGUgdmFsdWUgY2FuIGJlIGNvZXJjZWQgdG8gT2JqZWN0XG4gKiB0byB3ZWVkIG91dCBob3N0IG9iamVjdHMgdGhhdCBkbyBub3QgZGVyaXZlIGZyb20gT2JqZWN0LlxuICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNoZWNrIGlmIHdlIHdhbnQgdG8gZGVlcCBjb3B5IGFuIG9iamVjdCBvciBub3QuXG4gKiBOb3RlOiBJbiBFUzYgaXQgaXMgcG9zc2libGUgdG8gbW9kaWZ5IGFuIG9iamVjdCdzIFN5bWJvbC50b1N0cmluZ1RhZyBwcm9wZXJ0eSwgd2hpY2ggd2lsbFxuICogY2hhbmdlIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBgdG9TdHJpbmdgLiBUaGlzIGlzIGEgcmFyZSBlZGdlIGNhc2UgdGhhdCBpcyBkaWZmaWN1bHQgdG8gaGFuZGxlLFxuICogc28gaXQgaXMgbm90IGhhbmRsZWQgaGVyZS5cbiAqIEBwYXJhbSAgdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJuICAgICAgIElmIHRoZSB2YWx1ZSBpcyBjb2VyY2libGUgaW50byBhbiBPYmplY3RcbiAqL1xuZnVuY3Rpb24gc2hvdWxkRGVlcENvcHlPYmplY3QodmFsdWUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG59XG5mdW5jdGlvbiBjb3B5QXJyYXkoYXJyYXksIGluaGVyaXRlZCkge1xuICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb3B5QXJyYXkoaXRlbSwgaW5oZXJpdGVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXNob3VsZERlZXBDb3B5T2JqZWN0KGl0ZW0pXG4gICAgICAgICAgICA/IGl0ZW1cbiAgICAgICAgICAgIDogX21peGluKHtcbiAgICAgICAgICAgICAgICBkZWVwOiB0cnVlLFxuICAgICAgICAgICAgICAgIGluaGVyaXRlZDogaW5oZXJpdGVkLFxuICAgICAgICAgICAgICAgIHNvdXJjZXM6IFtpdGVtXSxcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IHt9XG4gICAgICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIF9taXhpbihrd0FyZ3MpIHtcbiAgICBjb25zdCBkZWVwID0ga3dBcmdzLmRlZXA7XG4gICAgY29uc3QgaW5oZXJpdGVkID0ga3dBcmdzLmluaGVyaXRlZDtcbiAgICBjb25zdCB0YXJnZXQgPSBrd0FyZ3MudGFyZ2V0O1xuICAgIGNvbnN0IGNvcGllZCA9IGt3QXJncy5jb3BpZWQgfHwgW107XG4gICAgY29uc3QgY29waWVkQ2xvbmUgPSBbLi4uY29waWVkXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGt3QXJncy5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGt3QXJncy5zb3VyY2VzW2ldO1xuICAgICAgICBpZiAoc291cmNlID09PSBudWxsIHx8IHNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gc291cmNlW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKGNvcGllZENsb25lLmluZGV4T2YodmFsdWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRlZXApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvcHlBcnJheSh2YWx1ZSwgaW5oZXJpdGVkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzaG91bGREZWVwQ29weU9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldFZhbHVlID0gdGFyZ2V0W2tleV0gfHwge307XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWQucHVzaChzb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBfbWl4aW4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXA6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdGVkOiBpbmhlcml0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlczogW3ZhbHVlXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IHRhcmdldFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZShwcm90b3R5cGUsIC4uLm1peGlucykge1xuICAgIGlmICghbWl4aW5zLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignbGFuZy5jcmVhdGUgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIG1peGluIG9iamVjdC4nKTtcbiAgICB9XG4gICAgY29uc3QgYXJncyA9IG1peGlucy5zbGljZSgpO1xuICAgIGFyZ3MudW5zaGlmdChPYmplY3QuY3JlYXRlKHByb3RvdHlwZSkpO1xuICAgIHJldHVybiBhc3NpZ24uYXBwbHkobnVsbCwgYXJncyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVlcEFzc2lnbih0YXJnZXQsIC4uLnNvdXJjZXMpIHtcbiAgICByZXR1cm4gX21peGluKHtcbiAgICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgICAgaW5oZXJpdGVkOiBmYWxzZSxcbiAgICAgICAgc291cmNlczogc291cmNlcyxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWVwTWl4aW4odGFyZ2V0LCAuLi5zb3VyY2VzKSB7XG4gICAgcmV0dXJuIF9taXhpbih7XG4gICAgICAgIGRlZXA6IHRydWUsXG4gICAgICAgIGluaGVyaXRlZDogdHJ1ZSxcbiAgICAgICAgc291cmNlczogc291cmNlcyxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRcbiAgICB9KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3QgdXNpbmcgdGhlIHByb3ZpZGVkIHNvdXJjZSdzIHByb3RvdHlwZSBhcyB0aGUgcHJvdG90eXBlIGZvciB0aGUgbmV3IG9iamVjdCwgYW5kIHRoZW5cbiAqIGRlZXAgY29waWVzIHRoZSBwcm92aWRlZCBzb3VyY2UncyB2YWx1ZXMgaW50byB0aGUgbmV3IHRhcmdldC5cbiAqXG4gKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3QgdG8gZHVwbGljYXRlXG4gKiBAcmV0dXJuIFRoZSBuZXcgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkdXBsaWNhdGUoc291cmNlKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2Yoc291cmNlKSk7XG4gICAgcmV0dXJuIGRlZXBNaXhpbih0YXJnZXQsIHNvdXJjZSk7XG59XG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0d28gdmFsdWVzIGFyZSB0aGUgc2FtZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gYSBGaXJzdCB2YWx1ZSB0byBjb21wYXJlXG4gKiBAcGFyYW0gYiBTZWNvbmQgdmFsdWUgdG8gY29tcGFyZVxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZXMgYXJlIHRoZSBzYW1lOyBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSWRlbnRpY2FsKGEsIGIpIHtcbiAgICByZXR1cm4gKGEgPT09IGIgfHxcbiAgICAgICAgLyogYm90aCB2YWx1ZXMgYXJlIE5hTiAqL1xuICAgICAgICAoYSAhPT0gYSAmJiBiICE9PSBiKSk7XG59XG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGJpbmRzIGEgbWV0aG9kIHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGF0IHJ1bnRpbWUuIFRoaXMgaXMgc2ltaWxhciB0b1xuICogYEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kYCwgYnV0IGluc3RlYWQgb2YgYSBmdW5jdGlvbiBpdCB0YWtlcyB0aGUgbmFtZSBvZiBhIG1ldGhvZCBvbiBhbiBvYmplY3QuXG4gKiBBcyBhIHJlc3VsdCwgdGhlIGZ1bmN0aW9uIHJldHVybmVkIGJ5IGBsYXRlQmluZGAgd2lsbCBhbHdheXMgY2FsbCB0aGUgZnVuY3Rpb24gY3VycmVudGx5IGFzc2lnbmVkIHRvXG4gKiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG9uIHRoZSBvYmplY3QgYXMgb2YgdGhlIG1vbWVudCB0aGUgZnVuY3Rpb24gaXQgcmV0dXJucyBpcyBjYWxsZWQuXG4gKlxuICogQHBhcmFtIGluc3RhbmNlIFRoZSBjb250ZXh0IG9iamVjdFxuICogQHBhcmFtIG1ldGhvZCBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIG9uIHRoZSBjb250ZXh0IG9iamVjdCB0byBiaW5kIHRvIGl0c2VsZlxuICogQHBhcmFtIHN1cHBsaWVkQXJncyBBbiBvcHRpb25hbCBhcnJheSBvZiB2YWx1ZXMgdG8gcHJlcGVuZCB0byB0aGUgYGluc3RhbmNlW21ldGhvZF1gIGFyZ3VtZW50cyBsaXN0XG4gKiBAcmV0dXJuIFRoZSBib3VuZCBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gbGF0ZUJpbmQoaW5zdGFuY2UsIG1ldGhvZCwgLi4uc3VwcGxpZWRBcmdzKSB7XG4gICAgcmV0dXJuIHN1cHBsaWVkQXJncy5sZW5ndGhcbiAgICAgICAgPyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBhcmdzID0gYXJndW1lbnRzLmxlbmd0aCA/IHN1cHBsaWVkQXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKSA6IHN1cHBsaWVkQXJncztcbiAgICAgICAgICAgIC8vIFRTNzAxN1xuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlW21ldGhvZF0uYXBwbHkoaW5zdGFuY2UsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gVFM3MDE3XG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VbbWV0aG9kXS5hcHBseShpbnN0YW5jZSwgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtaXhpbih0YXJnZXQsIC4uLnNvdXJjZXMpIHtcbiAgICByZXR1cm4gX21peGluKHtcbiAgICAgICAgZGVlcDogZmFsc2UsXG4gICAgICAgIGluaGVyaXRlZDogdHJ1ZSxcbiAgICAgICAgc291cmNlczogc291cmNlcyxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRcbiAgICB9KTtcbn1cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHdoaWNoIGludm9rZXMgdGhlIGdpdmVuIGZ1bmN0aW9uIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cyBwcmVwZW5kZWQgdG8gaXRzIGFyZ3VtZW50IGxpc3QuXG4gKiBMaWtlIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAsIGJ1dCBkb2VzIG5vdCBhbHRlciBleGVjdXRpb24gY29udGV4dC5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0RnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRoYXQgbmVlZHMgdG8gYmUgYm91bmRcbiAqIEBwYXJhbSBzdXBwbGllZEFyZ3MgQW4gb3B0aW9uYWwgYXJyYXkgb2YgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhlIGB0YXJnZXRGdW5jdGlvbmAgYXJndW1lbnRzIGxpc3RcbiAqIEByZXR1cm4gVGhlIGJvdW5kIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJ0aWFsKHRhcmdldEZ1bmN0aW9uLCAuLi5zdXBwbGllZEFyZ3MpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBhcmdzID0gYXJndW1lbnRzLmxlbmd0aCA/IHN1cHBsaWVkQXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKSA6IHN1cHBsaWVkQXJncztcbiAgICAgICAgcmV0dXJuIHRhcmdldEZ1bmN0aW9uLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG59XG4vKipcbiAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBkZXN0cm95IG1ldGhvZCB0aGF0LCB3aGVuIGNhbGxlZCwgY2FsbHMgdGhlIHBhc3NlZC1pbiBkZXN0cnVjdG9yLlxuICogVGhpcyBpcyBpbnRlbmRlZCB0byBwcm92aWRlIGEgdW5pZmllZCBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIFwicmVtb3ZlXCIgLyBcImRlc3Ryb3lcIiBoYW5kbGVycyBmb3JcbiAqIGV2ZW50IGxpc3RlbmVycywgdGltZXJzLCBldGMuXG4gKlxuICogQHBhcmFtIGRlc3RydWN0b3IgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGhhbmRsZSdzIGBkZXN0cm95YCBtZXRob2QgaXMgaW52b2tlZFxuICogQHJldHVybiBUaGUgaGFuZGxlIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSGFuZGxlKGRlc3RydWN0b3IpIHtcbiAgICBsZXQgY2FsbGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFjYWxsZWQpIHtcbiAgICAgICAgICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGRlc3RydWN0b3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG4vKipcbiAqIFJldHVybnMgYSBzaW5nbGUgaGFuZGxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVzdHJveSBtdWx0aXBsZSBoYW5kbGVzIHNpbXVsdGFuZW91c2x5LlxuICpcbiAqIEBwYXJhbSBoYW5kbGVzIEFuIGFycmF5IG9mIGhhbmRsZXMgd2l0aCBgZGVzdHJveWAgbWV0aG9kc1xuICogQHJldHVybiBUaGUgaGFuZGxlIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29tcG9zaXRlSGFuZGxlKC4uLmhhbmRsZXMpIHtcbiAgICByZXR1cm4gY3JlYXRlSGFuZGxlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoYW5kbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBoYW5kbGVzW2ldLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGFuZy5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vY29yZS9sYW5nLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vY29yZS9sYW5nLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJmdW5jdGlvbiBpc0ZlYXR1cmVUZXN0VGhlbmFibGUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgdmFsdWUudGhlbjtcbn1cbi8qKlxuICogQSBjYWNoZSBvZiByZXN1bHRzIG9mIGZlYXR1cmUgdGVzdHNcbiAqL1xuZXhwb3J0IGNvbnN0IHRlc3RDYWNoZSA9IHt9O1xuLyoqXG4gKiBBIGNhY2hlIG9mIHRoZSB1bi1yZXNvbHZlZCBmZWF0dXJlIHRlc3RzXG4gKi9cbmV4cG9ydCBjb25zdCB0ZXN0RnVuY3Rpb25zID0ge307XG4vKipcbiAqIEEgY2FjaGUgb2YgdW5yZXNvbHZlZCB0aGVuYWJsZXMgKHByb2JhYmx5IHByb21pc2VzKVxuICogQHR5cGUge3t9fVxuICovXG5jb25zdCB0ZXN0VGhlbmFibGVzID0ge307XG4vKipcbiAqIEEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgc2NvcGUgKGB3aW5kb3dgIGluIGEgYnJvd3NlciwgYGdsb2JhbGAgaW4gTm9kZUpTKVxuICovXG5jb25zdCBnbG9iYWxTY29wZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gQnJvd3NlcnNcbiAgICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gTm9kZVxuICAgICAgICByZXR1cm4gZ2xvYmFsO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gV2ViIHdvcmtlcnNcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIHt9O1xufSkoKTtcbi8qIEdyYWIgdGhlIHN0YXRpY0ZlYXR1cmVzIGlmIHRoZXJlIGFyZSBhdmFpbGFibGUgKi9cbmNvbnN0IHsgc3RhdGljRmVhdHVyZXMgfSA9IGdsb2JhbFNjb3BlLkRvam9IYXNFbnZpcm9ubWVudCB8fCB7fTtcbi8qIENsZWFuaW5nIHVwIHRoZSBEb2pvSGFzRW52aW9ybm1lbnQgKi9cbmlmICgnRG9qb0hhc0Vudmlyb25tZW50JyBpbiBnbG9iYWxTY29wZSkge1xuICAgIGRlbGV0ZSBnbG9iYWxTY29wZS5Eb2pvSGFzRW52aXJvbm1lbnQ7XG59XG4vKipcbiAqIEN1c3RvbSB0eXBlIGd1YXJkIHRvIG5hcnJvdyB0aGUgYHN0YXRpY0ZlYXR1cmVzYCB0byBlaXRoZXIgYSBtYXAgb3IgYSBmdW5jdGlvbiB0aGF0XG4gKiByZXR1cm5zIGEgbWFwLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gZ3VhcmQgZm9yXG4gKi9cbmZ1bmN0aW9uIGlzU3RhdGljRmVhdHVyZUZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbi8qKlxuICogVGhlIGNhY2hlIG9mIGFzc2VydGVkIGZlYXR1cmVzIHRoYXQgd2VyZSBhdmFpbGFibGUgaW4gdGhlIGdsb2JhbCBzY29wZSB3aGVuIHRoZVxuICogbW9kdWxlIGxvYWRlZFxuICovXG5jb25zdCBzdGF0aWNDYWNoZSA9IHN0YXRpY0ZlYXR1cmVzXG4gICAgPyBpc1N0YXRpY0ZlYXR1cmVGdW5jdGlvbihzdGF0aWNGZWF0dXJlcykgPyBzdGF0aWNGZWF0dXJlcy5hcHBseShnbG9iYWxTY29wZSkgOiBzdGF0aWNGZWF0dXJlc1xuICAgIDoge307IC8qIFByb3ZpZGluZyBhbiBlbXB0eSBjYWNoZSwgaWYgbm9uZSB3YXMgaW4gdGhlIGVudmlyb25tZW50XG5cbi8qKlxuKiBBTUQgcGx1Z2luIGZ1bmN0aW9uLlxuKlxuKiBDb25kaXRpb25hbCBsb2FkcyBtb2R1bGVzIGJhc2VkIG9uIGEgaGFzIGZlYXR1cmUgdGVzdCB2YWx1ZS5cbipcbiogQHBhcmFtIHJlc291cmNlSWQgR2l2ZXMgdGhlIHJlc29sdmVkIG1vZHVsZSBpZCB0byBsb2FkLlxuKiBAcGFyYW0gcmVxdWlyZSBUaGUgbG9hZGVyIHJlcXVpcmUgZnVuY3Rpb24gd2l0aCByZXNwZWN0IHRvIHRoZSBtb2R1bGUgdGhhdCBjb250YWluZWQgdGhlIHBsdWdpbiByZXNvdXJjZSBpbiBpdHNcbiogICAgICAgICAgICAgICAgZGVwZW5kZW5jeSBsaXN0LlxuKiBAcGFyYW0gbG9hZCBDYWxsYmFjayB0byBsb2FkZXIgdGhhdCBjb25zdW1lcyByZXN1bHQgb2YgcGx1Z2luIGRlbWFuZC5cbiovXG5leHBvcnQgZnVuY3Rpb24gbG9hZChyZXNvdXJjZUlkLCByZXF1aXJlLCBsb2FkLCBjb25maWcpIHtcbiAgICByZXNvdXJjZUlkID8gcmVxdWlyZShbcmVzb3VyY2VJZF0sIGxvYWQpIDogbG9hZCgpO1xufVxuLyoqXG4gKiBBTUQgcGx1Z2luIGZ1bmN0aW9uLlxuICpcbiAqIFJlc29sdmVzIHJlc291cmNlSWQgaW50byBhIG1vZHVsZSBpZCBiYXNlZCBvbiBwb3NzaWJseS1uZXN0ZWQgdGVuYXJ5IGV4cHJlc3Npb24gdGhhdCBicmFuY2hlcyBvbiBoYXMgZmVhdHVyZSB0ZXN0XG4gKiB2YWx1ZShzKS5cbiAqXG4gKiBAcGFyYW0gcmVzb3VyY2VJZCBUaGUgaWQgb2YgdGhlIG1vZHVsZVxuICogQHBhcmFtIG5vcm1hbGl6ZSBSZXNvbHZlcyBhIHJlbGF0aXZlIG1vZHVsZSBpZCBpbnRvIGFuIGFic29sdXRlIG1vZHVsZSBpZFxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKHJlc291cmNlSWQsIG5vcm1hbGl6ZSkge1xuICAgIGNvbnN0IHRva2VucyA9IHJlc291cmNlSWQubWF0Y2goL1tcXD86XXxbXjpcXD9dKi9nKSB8fCBbXTtcbiAgICBsZXQgaSA9IDA7XG4gICAgZnVuY3Rpb24gZ2V0KHNraXApIHtcbiAgICAgICAgY29uc3QgdGVybSA9IHRva2Vuc1tpKytdO1xuICAgICAgICBpZiAodGVybSA9PT0gJzonKSB7XG4gICAgICAgICAgICAvLyBlbXB0eSBzdHJpbmcgbW9kdWxlIG5hbWUsIHJlc29sdmVzIHRvIG51bGxcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gcG9zdGZpeGVkIHdpdGggYSA/IG1lYW5zIGl0IGlzIGEgZmVhdHVyZSB0byBicmFuY2ggb24sIHRoZSB0ZXJtIGlzIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlXG4gICAgICAgICAgICBpZiAodG9rZW5zW2krK10gPT09ICc/Jykge1xuICAgICAgICAgICAgICAgIGlmICghc2tpcCAmJiBoYXModGVybSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hlZCB0aGUgZmVhdHVyZSwgZ2V0IHRoZSBmaXJzdCB2YWx1ZSBmcm9tIHRoZSBvcHRpb25zXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRpZCBub3QgbWF0Y2gsIGdldCB0aGUgc2Vjb25kIHZhbHVlLCBwYXNzaW5nIG92ZXIgdGhlIGZpcnN0XG4gICAgICAgICAgICAgICAgICAgIGdldCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChza2lwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhIG1vZHVsZVxuICAgICAgICAgICAgcmV0dXJuIHRlcm07XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaWQgPSBnZXQoKTtcbiAgICByZXR1cm4gaWQgJiYgbm9ybWFsaXplKGlkKTtcbn1cbi8qKlxuICogQ2hlY2sgaWYgYSBmZWF0dXJlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZFxuICpcbiAqIEBwYXJhbSBmZWF0dXJlIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGlzdHMoZmVhdHVyZSkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRGZWF0dXJlID0gZmVhdHVyZS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBCb29sZWFuKG5vcm1hbGl6ZWRGZWF0dXJlIGluIHN0YXRpY0NhY2hlIHx8IG5vcm1hbGl6ZWRGZWF0dXJlIGluIHRlc3RDYWNoZSB8fCB0ZXN0RnVuY3Rpb25zW25vcm1hbGl6ZWRGZWF0dXJlXSk7XG59XG4vKipcbiAqIFJlZ2lzdGVyIGEgbmV3IHRlc3QgZm9yIGEgbmFtZWQgZmVhdHVyZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaGFzLmFkZCgnZG9tLWFkZGV2ZW50bGlzdGVuZXInLCAhIWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpO1xuICpcbiAqIEBleGFtcGxlXG4gKiBoYXMuYWRkKCd0b3VjaC1ldmVudHMnLCBmdW5jdGlvbiAoKSB7XG4gKiAgICByZXR1cm4gJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnRcbiAqIH0pO1xuICpcbiAqIEBwYXJhbSBmZWF0dXJlIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlXG4gKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHJlcG9ydGVkIG9mIHRoZSBmZWF0dXJlLCBvciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBvbmNlIG9uIGZpcnN0IHRlc3RcbiAqIEBwYXJhbSBvdmVyd3JpdGUgaWYgYW4gZXhpc3RpbmcgdmFsdWUgc2hvdWxkIGJlIG92ZXJ3cml0dGVuLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZChmZWF0dXJlLCB2YWx1ZSwgb3ZlcndyaXRlID0gZmFsc2UpIHtcbiAgICBjb25zdCBub3JtYWxpemVkRmVhdHVyZSA9IGZlYXR1cmUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoZXhpc3RzKG5vcm1hbGl6ZWRGZWF0dXJlKSAmJiAhb3ZlcndyaXRlICYmICEobm9ybWFsaXplZEZlYXR1cmUgaW4gc3RhdGljQ2FjaGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEZlYXR1cmUgXCIke2ZlYXR1cmV9XCIgZXhpc3RzIGFuZCBvdmVyd3JpdGUgbm90IHRydWUuYCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNGZWF0dXJlVGVzdFRoZW5hYmxlKHZhbHVlKSkge1xuICAgICAgICB0ZXN0VGhlbmFibGVzW2ZlYXR1cmVdID0gdmFsdWUudGhlbigocmVzb2x2ZWRWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgdGVzdENhY2hlW2ZlYXR1cmVdID0gcmVzb2x2ZWRWYWx1ZTtcbiAgICAgICAgICAgIGRlbGV0ZSB0ZXN0VGhlbmFibGVzW2ZlYXR1cmVdO1xuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgdGVzdFRoZW5hYmxlc1tmZWF0dXJlXTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0ZXN0Q2FjaGVbbm9ybWFsaXplZEZlYXR1cmVdID0gdmFsdWU7XG4gICAgICAgIGRlbGV0ZSB0ZXN0RnVuY3Rpb25zW25vcm1hbGl6ZWRGZWF0dXJlXTtcbiAgICB9XG59XG4vKipcbiAqIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBvZiBhIG5hbWVkIGZlYXR1cmUuXG4gKlxuICogQHBhcmFtIGZlYXR1cmUgVGhlIG5hbWUgKGlmIGEgc3RyaW5nKSBvciBpZGVudGlmaWVyIChpZiBhbiBpbnRlZ2VyKSBvZiB0aGUgZmVhdHVyZSB0byB0ZXN0LlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBoYXMoZmVhdHVyZSkge1xuICAgIGxldCByZXN1bHQ7XG4gICAgY29uc3Qgbm9ybWFsaXplZEZlYXR1cmUgPSBmZWF0dXJlLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRGZWF0dXJlIGluIHN0YXRpY0NhY2hlKSB7XG4gICAgICAgIHJlc3VsdCA9IHN0YXRpY0NhY2hlW25vcm1hbGl6ZWRGZWF0dXJlXTtcbiAgICB9XG4gICAgZWxzZSBpZiAodGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV0pIHtcbiAgICAgICAgcmVzdWx0ID0gdGVzdENhY2hlW25vcm1hbGl6ZWRGZWF0dXJlXSA9IHRlc3RGdW5jdGlvbnNbbm9ybWFsaXplZEZlYXR1cmVdLmNhbGwobnVsbCk7XG4gICAgICAgIGRlbGV0ZSB0ZXN0RnVuY3Rpb25zW25vcm1hbGl6ZWRGZWF0dXJlXTtcbiAgICB9XG4gICAgZWxzZSBpZiAobm9ybWFsaXplZEZlYXR1cmUgaW4gdGVzdENhY2hlKSB7XG4gICAgICAgIHJlc3VsdCA9IHRlc3RDYWNoZVtub3JtYWxpemVkRmVhdHVyZV07XG4gICAgfVxuICAgIGVsc2UgaWYgKGZlYXR1cmUgaW4gdGVzdFRoZW5hYmxlcykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBBdHRlbXB0IHRvIGRldGVjdCB1bnJlZ2lzdGVyZWQgaGFzIGZlYXR1cmUgXCIke2ZlYXR1cmV9XCJgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qXG4gKiBPdXQgb2YgdGhlIGJveCBmZWF0dXJlIHRlc3RzXG4gKi9cbi8qIEVudmlyb25tZW50cyAqL1xuLyogVXNlZCBhcyBhIHZhbHVlIHRvIHByb3ZpZGUgYSBkZWJ1ZyBvbmx5IGNvZGUgcGF0aCAqL1xuYWRkKCdkZWJ1ZycsIHRydWUpO1xuLyogRGV0ZWN0cyBpZiB0aGUgZW52aXJvbm1lbnQgaXMgXCJicm93c2VyIGxpa2VcIiAqL1xuYWRkKCdob3N0LWJyb3dzZXInLCB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBsb2NhdGlvbiAhPT0gJ3VuZGVmaW5lZCcpO1xuLyogRGV0ZWN0cyBpZiB0aGUgZW52aXJvbm1lbnQgYXBwZWFycyB0byBiZSBOb2RlSlMgKi9cbmFkZCgnaG9zdC1ub2RlJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgcHJvY2Vzcy52ZXJzaW9ucyAmJiBwcm9jZXNzLnZlcnNpb25zLm5vZGUpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MudmVyc2lvbnMubm9kZTtcbiAgICB9XG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhcy5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vaGFzL2hhcy5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2hhcy9oYXMubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCB7IGlzQXJyYXlMaWtlLCBTaGltSXRlcmF0b3IgfSBmcm9tICcuL2l0ZXJhdG9yJztcbmltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xuaW1wb3J0IHsgaXMgYXMgb2JqZWN0SXMgfSBmcm9tICcuL29iamVjdCc7XG5pbXBvcnQgaGFzIGZyb20gJy4vc3VwcG9ydC9oYXMnO1xuaW1wb3J0ICcuL1N5bWJvbCc7XG5leHBvcnQgbGV0IE1hcCA9IGdsb2JhbC5NYXA7XG5pZiAoIXRydWUpIHtcbiAgICBNYXAgPSAoX2EgPSBjbGFzcyBNYXAge1xuICAgICAgICAgICAgY29uc3RydWN0b3IoaXRlcmFibGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgdGhpc1tTeW1ib2wudG9TdHJpbmdUYWddID0gJ01hcCc7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5TGlrZShpdGVyYWJsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlcmFibGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGl0ZXJhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQodmFsdWVbMF0sIHZhbHVlWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQW4gYWx0ZXJuYXRpdmUgdG8gQXJyYXkucHJvdG90eXBlLmluZGV4T2YgdXNpbmcgT2JqZWN0LmlzXG4gICAgICAgICAgICAgKiB0byBjaGVjayBmb3IgZXF1YWxpdHkuIFNlZSBodHRwOi8vbXpsLmxhLzF6dUtPMlZcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgX2luZGV4T2ZLZXkoa2V5cywga2V5KSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdElzKGtleXNbaV0sIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdldCBzaXplKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9rZXlzLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNsZWFyKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2tleXMubGVuZ3RoID0gdGhpcy5fdmFsdWVzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUoa2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9pbmRleE9mS2V5KHRoaXMuX2tleXMsIGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2tleXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVudHJpZXMoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5fa2V5cy5tYXAoKGtleSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgdGhpcy5fdmFsdWVzW2ldXTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNoaW1JdGVyYXRvcih2YWx1ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yRWFjaChjYWxsYmFjaywgY29udGV4dCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSB0aGlzLl9rZXlzO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuX3ZhbHVlcztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIHZhbHVlc1tpXSwga2V5c1tpXSwgdGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ2V0KGtleSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5faW5kZXhPZktleSh0aGlzLl9rZXlzLCBrZXkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiB0aGlzLl92YWx1ZXNbaW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFzKGtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbmRleE9mS2V5KHRoaXMuX2tleXMsIGtleSkgPiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGtleXMoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaGltSXRlcmF0b3IodGhpcy5fa2V5cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuX2luZGV4T2ZLZXkodGhpcy5fa2V5cywga2V5KTtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4IDwgMCA/IHRoaXMuX2tleXMubGVuZ3RoIDogaW5kZXg7XG4gICAgICAgICAgICAgICAgdGhpcy5fa2V5c1tpbmRleF0gPSBrZXk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsdWVzKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2hpbUl0ZXJhdG9yKHRoaXMuX3ZhbHVlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIF9hW1N5bWJvbC5zcGVjaWVzXSA9IF9hLFxuICAgICAgICBfYSk7XG59XG5leHBvcnQgZGVmYXVsdCBNYXA7XG52YXIgX2E7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXAubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vTWFwLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9NYXAubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xuaW1wb3J0IHsgcXVldWVNaWNyb1Rhc2sgfSBmcm9tICcuL3N1cHBvcnQvcXVldWUnO1xuaW1wb3J0ICcuL1N5bWJvbCc7XG5pbXBvcnQgaGFzIGZyb20gJy4vc3VwcG9ydC9oYXMnO1xuZXhwb3J0IGxldCBTaGltUHJvbWlzZSA9IGdsb2JhbC5Qcm9taXNlO1xuZXhwb3J0IGNvbnN0IGlzVGhlbmFibGUgPSBmdW5jdGlvbiBpc1RoZW5hYmxlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nO1xufTtcbmlmICghdHJ1ZSkge1xuICAgIGdsb2JhbC5Qcm9taXNlID0gU2hpbVByb21pc2UgPSAoX2EgPSBjbGFzcyBQcm9taXNlIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBQcm9taXNlLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBwYXJhbSBleGVjdXRvclxuICAgICAgICAgICAgICogVGhlIGV4ZWN1dG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbW1lZGlhdGVseSB3aGVuIHRoZSBQcm9taXNlIGlzIGluc3RhbnRpYXRlZC4gSXQgaXMgcmVzcG9uc2libGUgZm9yXG4gICAgICAgICAgICAgKiBzdGFydGluZyB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGVuIGl0IGlzIGludm9rZWQuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogVGhlIGV4ZWN1dG9yIG11c3QgY2FsbCBlaXRoZXIgdGhlIHBhc3NlZCBgcmVzb2x2ZWAgZnVuY3Rpb24gd2hlbiB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkXG4gICAgICAgICAgICAgKiBzdWNjZXNzZnVsbHksIG9yIHRoZSBgcmVqZWN0YCBmdW5jdGlvbiB3aGVuIHRoZSBvcGVyYXRpb24gZmFpbHMuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKGV4ZWN1dG9yKSB7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhpcyBwcm9taXNlLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAxIC8qIFBlbmRpbmcgKi87XG4gICAgICAgICAgICAgICAgdGhpc1tTeW1ib2wudG9TdHJpbmdUYWddID0gJ1Byb21pc2UnO1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIElmIHRydWUsIHRoZSByZXNvbHV0aW9uIG9mIHRoaXMgcHJvbWlzZSBpcyBjaGFpbmVkIChcImxvY2tlZCBpblwiKSB0byBhbm90aGVyIHByb21pc2UuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgbGV0IGlzQ2hhaW5lZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIFdoZXRoZXIgb3Igbm90IHRoaXMgcHJvbWlzZSBpcyBpbiBhIHJlc29sdmVkIHN0YXRlLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzUmVzb2x2ZWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlICE9PSAxIC8qIFBlbmRpbmcgKi8gfHwgaXNDaGFpbmVkO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogQ2FsbGJhY2tzIHRoYXQgc2hvdWxkIGJlIGludm9rZWQgb25jZSB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGxldCBjYWxsYmFja3MgPSBbXTtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBJbml0aWFsbHkgcHVzaGVzIGNhbGxiYWNrcyBvbnRvIGEgcXVldWUgZm9yIGV4ZWN1dGlvbiBvbmNlIHRoaXMgcHJvbWlzZSBzZXR0bGVzLiBBZnRlciB0aGUgcHJvbWlzZSBzZXR0bGVzLFxuICAgICAgICAgICAgICAgICAqIGVucXVldWVzIGNhbGxiYWNrcyBmb3IgZXhlY3V0aW9uIG9uIHRoZSBuZXh0IGV2ZW50IGxvb3AgdHVybi5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBsZXQgd2hlbkZpbmlzaGVkID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogU2V0dGxlcyB0aGlzIHByb21pc2UuXG4gICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gbmV3U3RhdGUgVGhlIHJlc29sdmVkIHN0YXRlIGZvciB0aGlzIHByb21pc2UuXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIHtUfGFueX0gdmFsdWUgVGhlIHJlc29sdmVkIHZhbHVlIGZvciB0aGlzIHByb21pc2UuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY29uc3Qgc2V0dGxlID0gKG5ld1N0YXRlLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBBIHByb21pc2UgY2FuIG9ubHkgYmUgc2V0dGxlZCBvbmNlLlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gMSAvKiBQZW5kaW5nICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmVkVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgd2hlbkZpbmlzaGVkID0gcXVldWVNaWNyb1Rhc2s7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgZW5xdWV1ZSBhIGNhbGxiYWNrIHJ1bm5lciBpZiB0aGVyZSBhcmUgY2FsbGJhY2tzIHNvIHRoYXQgaW5pdGlhbGx5IGZ1bGZpbGxlZCBQcm9taXNlcyBkb24ndCBoYXZlIHRvXG4gICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgYW4gZXh0cmEgdHVybi5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrcyAmJiBjYWxsYmFja3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNaWNyb1Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvdW50ID0gY2FsbGJhY2tzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3NbaV0uY2FsbChudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBSZXNvbHZlcyB0aGlzIHByb21pc2UuXG4gICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gbmV3U3RhdGUgVGhlIHJlc29sdmVkIHN0YXRlIGZvciB0aGlzIHByb21pc2UuXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIHtUfGFueX0gdmFsdWUgVGhlIHJlc29sdmVkIHZhbHVlIGZvciB0aGlzIHByb21pc2UuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZSA9IChuZXdTdGF0ZSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVzb2x2ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1RoZW5hYmxlKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUudGhlbihzZXR0bGUuYmluZChudWxsLCAwIC8qIEZ1bGZpbGxlZCAqLyksIHNldHRsZS5iaW5kKG51bGwsIDIgLyogUmVqZWN0ZWQgKi8pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2hhaW5lZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXR0bGUobmV3U3RhdGUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy50aGVuID0gKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuRmluaXNoZWQgaW5pdGlhbGx5IHF1ZXVlcyB1cCBjYWxsYmFja3MgZm9yIGV4ZWN1dGlvbiBhZnRlciB0aGUgcHJvbWlzZSBoYXMgc2V0dGxlZC4gT25jZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb21pc2UgaGFzIHNldHRsZWQsIHdoZW5GaW5pc2hlZCB3aWxsIHNjaGVkdWxlIGNhbGxiYWNrcyBmb3IgZXhlY3V0aW9uIG9uIHRoZSBuZXh0IHR1cm4gdGhyb3VnaCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IGxvb3AuXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVuRmluaXNoZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy5zdGF0ZSA9PT0gMiAvKiBSZWplY3RlZCAqLyA/IG9uUmVqZWN0ZWQgOiBvbkZ1bGZpbGxlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNhbGxiYWNrKHRoaXMucmVzb2x2ZWRWYWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnN0YXRlID09PSAyIC8qIFJlamVjdGVkICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh0aGlzLnJlc29sdmVkVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnJlc29sdmVkVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yKHJlc29sdmUuYmluZChudWxsLCAwIC8qIEZ1bGZpbGxlZCAqLyksIHJlc29sdmUuYmluZChudWxsLCAyIC8qIFJlamVjdGVkICovKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBzZXR0bGUoMiAvKiBSZWplY3RlZCAqLywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRpYyBhbGwoaXRlcmFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBsZXRlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvcHVsYXRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmdWxmaWxsKGluZGV4LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgKytjb21wbGV0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZpbmlzaCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3B1bGF0aW5nIHx8IGNvbXBsZXRlIDwgdG90YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcHJvY2Vzc0l0ZW0oaW5kZXgsIGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICsrdG90YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNUaGVuYWJsZShpdGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGFuIGl0ZW0gUHJvbWlzZSByZWplY3RzLCB0aGlzIFByb21pc2UgaXMgaW1tZWRpYXRlbHkgcmVqZWN0ZWQgd2l0aCB0aGUgaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb21pc2UncyByZWplY3Rpb24gZXJyb3IuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS50aGVuKGZ1bGZpbGwuYmluZChudWxsLCBpbmRleCksIHJlamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoaXRlbSkudGhlbihmdWxmaWxsLmJpbmQobnVsbCwgaW5kZXgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NJdGVtKGksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwb3B1bGF0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdGljIHJhY2UoaXRlcmFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGEgUHJvbWlzZSBpdGVtIHJlamVjdHMsIHRoaXMgUHJvbWlzZSBpcyBpbW1lZGlhdGVseSByZWplY3RlZCB3aXRoIHRoZSBpdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvbWlzZSdzIHJlamVjdGlvbiBlcnJvci5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShpdGVtKS50aGVuKHJlc29sdmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0aWMgcmVqZWN0KHJlYXNvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcyhmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyZWFzb24pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdGljIHJlc29sdmUodmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaChvblJlamVjdGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBfYVtTeW1ib2wuc3BlY2llc10gPSBTaGltUHJvbWlzZSxcbiAgICAgICAgX2EpO1xufVxuZXhwb3J0IGRlZmF1bHQgU2hpbVByb21pc2U7XG52YXIgX2E7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Qcm9taXNlLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL1Byb21pc2UubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL1Byb21pc2UubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XG5pbXBvcnQgZ2xvYmFsIGZyb20gJy4vZ2xvYmFsJztcbmltcG9ydCB7IGdldFZhbHVlRGVzY3JpcHRvciB9IGZyb20gJy4vc3VwcG9ydC91dGlsJztcbmV4cG9ydCBsZXQgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbmlmICghdHJ1ZSkge1xuICAgIC8qKlxuICAgICAqIFRocm93cyBpZiB0aGUgdmFsdWUgaXMgbm90IGEgc3ltYm9sLCB1c2VkIGludGVybmFsbHkgd2l0aGluIHRoZSBTaGltXG4gICAgICogQHBhcmFtICB7YW55fSAgICB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJuIHtzeW1ib2x9ICAgICAgIFJldHVybnMgdGhlIHN5bWJvbCBvciB0aHJvd3NcbiAgICAgKi9cbiAgICBjb25zdCB2YWxpZGF0ZVN5bWJvbCA9IGZ1bmN0aW9uIHZhbGlkYXRlU3ltYm9sKHZhbHVlKSB7XG4gICAgICAgIGlmICghaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHZhbHVlICsgJyBpcyBub3QgYSBzeW1ib2wnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBjb25zdCBkZWZpbmVQcm9wZXJ0aWVzID0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXM7XG4gICAgY29uc3QgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG4gICAgY29uc3QgY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcbiAgICBjb25zdCBvYmpQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuICAgIGNvbnN0IGdsb2JhbFN5bWJvbHMgPSB7fTtcbiAgICBjb25zdCBnZXRTeW1ib2xOYW1lID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgY3JlYXRlZCA9IGNyZWF0ZShudWxsKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChkZXNjKSB7XG4gICAgICAgICAgICBsZXQgcG9zdGZpeCA9IDA7XG4gICAgICAgICAgICBsZXQgbmFtZTtcbiAgICAgICAgICAgIHdoaWxlIChjcmVhdGVkW1N0cmluZyhkZXNjKSArIChwb3N0Zml4IHx8ICcnKV0pIHtcbiAgICAgICAgICAgICAgICArK3Bvc3RmaXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZXNjICs9IFN0cmluZyhwb3N0Zml4IHx8ICcnKTtcbiAgICAgICAgICAgIGNyZWF0ZWRbZGVzY10gPSB0cnVlO1xuICAgICAgICAgICAgbmFtZSA9ICdAQCcgKyBkZXNjO1xuICAgICAgICAgICAgLy8gRklYTUU6IFRlbXBvcmFyeSBndWFyZCB1bnRpbCB0aGUgZHVwbGljYXRlIGV4ZWN1dGlvbiB3aGVuIHRlc3RpbmcgY2FuIGJlXG4gICAgICAgICAgICAvLyBwaW5uZWQgZG93bi5cbiAgICAgICAgICAgIGlmICghT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmpQcm90b3R5cGUsIG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgZGVmaW5lUHJvcGVydHkob2JqUHJvdG90eXBlLCBuYW1lLCB7XG4gICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVQcm9wZXJ0eSh0aGlzLCBuYW1lLCBnZXRWYWx1ZURlc2NyaXB0b3IodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgICAgIH07XG4gICAgfSkoKTtcbiAgICBjb25zdCBJbnRlcm5hbFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbChkZXNjcmlwdGlvbikge1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEludGVybmFsU3ltYm9sKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUeXBlRXJyb3I6IFN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvcicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTeW1ib2woZGVzY3JpcHRpb24pO1xuICAgIH07XG4gICAgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbChkZXNjcmlwdGlvbikge1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFN5bWJvbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHlwZUVycm9yOiBTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3InKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzeW0gPSBPYmplY3QuY3JlYXRlKEludGVybmFsU3ltYm9sLnByb3RvdHlwZSk7XG4gICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCA/ICcnIDogU3RyaW5nKGRlc2NyaXB0aW9uKTtcbiAgICAgICAgcmV0dXJuIGRlZmluZVByb3BlcnRpZXMoc3ltLCB7XG4gICAgICAgICAgICBfX2Rlc2NyaXB0aW9uX186IGdldFZhbHVlRGVzY3JpcHRvcihkZXNjcmlwdGlvbiksXG4gICAgICAgICAgICBfX25hbWVfXzogZ2V0VmFsdWVEZXNjcmlwdG9yKGdldFN5bWJvbE5hbWUoZGVzY3JpcHRpb24pKVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qIERlY29yYXRlIHRoZSBTeW1ib2wgZnVuY3Rpb24gd2l0aCB0aGUgYXBwcm9wcmlhdGUgcHJvcGVydGllcyAqL1xuICAgIGRlZmluZVByb3BlcnR5KFN5bWJvbCwgJ2ZvcicsIGdldFZhbHVlRGVzY3JpcHRvcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmIChnbG9iYWxTeW1ib2xzW2tleV0pIHtcbiAgICAgICAgICAgIHJldHVybiBnbG9iYWxTeW1ib2xzW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChnbG9iYWxTeW1ib2xzW2tleV0gPSBTeW1ib2woU3RyaW5nKGtleSkpKTtcbiAgICB9KSk7XG4gICAgZGVmaW5lUHJvcGVydGllcyhTeW1ib2wsIHtcbiAgICAgICAga2V5Rm9yOiBnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgICAgICAgbGV0IGtleTtcbiAgICAgICAgICAgIHZhbGlkYXRlU3ltYm9sKHN5bSk7XG4gICAgICAgICAgICBmb3IgKGtleSBpbiBnbG9iYWxTeW1ib2xzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGdsb2JhbFN5bWJvbHNba2V5XSA9PT0gc3ltKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgaGFzSW5zdGFuY2U6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdoYXNJbnN0YW5jZScpLCBmYWxzZSwgZmFsc2UpLFxuICAgICAgICBpc0NvbmNhdFNwcmVhZGFibGU6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdpc0NvbmNhdFNwcmVhZGFibGUnKSwgZmFsc2UsIGZhbHNlKSxcbiAgICAgICAgaXRlcmF0b3I6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdpdGVyYXRvcicpLCBmYWxzZSwgZmFsc2UpLFxuICAgICAgICBtYXRjaDogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ21hdGNoJyksIGZhbHNlLCBmYWxzZSksXG4gICAgICAgIG9ic2VydmFibGU6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdvYnNlcnZhYmxlJyksIGZhbHNlLCBmYWxzZSksXG4gICAgICAgIHJlcGxhY2U6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdyZXBsYWNlJyksIGZhbHNlLCBmYWxzZSksXG4gICAgICAgIHNlYXJjaDogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3NlYXJjaCcpLCBmYWxzZSwgZmFsc2UpLFxuICAgICAgICBzcGVjaWVzOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignc3BlY2llcycpLCBmYWxzZSwgZmFsc2UpLFxuICAgICAgICBzcGxpdDogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3NwbGl0JyksIGZhbHNlLCBmYWxzZSksXG4gICAgICAgIHRvUHJpbWl0aXZlOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcigndG9QcmltaXRpdmUnKSwgZmFsc2UsIGZhbHNlKSxcbiAgICAgICAgdG9TdHJpbmdUYWc6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCd0b1N0cmluZ1RhZycpLCBmYWxzZSwgZmFsc2UpLFxuICAgICAgICB1bnNjb3BhYmxlczogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3Vuc2NvcGFibGVzJyksIGZhbHNlLCBmYWxzZSlcbiAgICB9KTtcbiAgICAvKiBEZWNvcmF0ZSB0aGUgSW50ZXJuYWxTeW1ib2wgb2JqZWN0ICovXG4gICAgZGVmaW5lUHJvcGVydGllcyhJbnRlcm5hbFN5bWJvbC5wcm90b3R5cGUsIHtcbiAgICAgICAgY29uc3RydWN0b3I6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wpLFxuICAgICAgICB0b1N0cmluZzogZ2V0VmFsdWVEZXNjcmlwdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9fbmFtZV9fO1xuICAgICAgICB9LCBmYWxzZSwgZmFsc2UpXG4gICAgfSk7XG4gICAgLyogRGVjb3JhdGUgdGhlIFN5bWJvbC5wcm90b3R5cGUgKi9cbiAgICBkZWZpbmVQcm9wZXJ0aWVzKFN5bWJvbC5wcm90b3R5cGUsIHtcbiAgICAgICAgdG9TdHJpbmc6IGdldFZhbHVlRGVzY3JpcHRvcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1N5bWJvbCAoJyArIHZhbGlkYXRlU3ltYm9sKHRoaXMpLl9fZGVzY3JpcHRpb25fXyArICcpJztcbiAgICAgICAgfSksXG4gICAgICAgIHZhbHVlT2Y6IGdldFZhbHVlRGVzY3JpcHRvcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVTeW1ib2wodGhpcyk7XG4gICAgICAgIH0pXG4gICAgfSk7XG4gICAgZGVmaW5lUHJvcGVydHkoU3ltYm9sLnByb3RvdHlwZSwgU3ltYm9sLnRvUHJpbWl0aXZlLCBnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVTeW1ib2wodGhpcyk7XG4gICAgfSkpO1xuICAgIGRlZmluZVByb3BlcnR5KFN5bWJvbC5wcm90b3R5cGUsIFN5bWJvbC50b1N0cmluZ1RhZywgZ2V0VmFsdWVEZXNjcmlwdG9yKCdTeW1ib2wnLCBmYWxzZSwgZmFsc2UsIHRydWUpKTtcbiAgICBkZWZpbmVQcm9wZXJ0eShJbnRlcm5hbFN5bWJvbC5wcm90b3R5cGUsIFN5bWJvbC50b1ByaW1pdGl2ZSwgZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5wcm90b3R5cGVbU3ltYm9sLnRvUHJpbWl0aXZlXSwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7XG4gICAgZGVmaW5lUHJvcGVydHkoSW50ZXJuYWxTeW1ib2wucHJvdG90eXBlLCBTeW1ib2wudG9TdHJpbmdUYWcsIGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wucHJvdG90eXBlW1N5bWJvbC50b1N0cmluZ1RhZ10sIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpO1xufVxuLyoqXG4gKiBBIGN1c3RvbSBndWFyZCBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgaWYgYW4gb2JqZWN0IGlzIGEgc3ltYm9sIG9yIG5vdFxuICogQHBhcmFtICB7YW55fSAgICAgICB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2sgdG8gc2VlIGlmIGl0IGlzIGEgc3ltYm9sIG9yIG5vdFxuICogQHJldHVybiB7aXMgc3ltYm9sfSAgICAgICBSZXR1cm5zIHRydWUgaWYgYSBzeW1ib2wgb3Igbm90IChhbmQgbmFycm93cyB0aGUgdHlwZSBndWFyZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gICAgcmV0dXJuICh2YWx1ZSAmJiAodHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJyB8fCB2YWx1ZVsnQEB0b1N0cmluZ1RhZyddID09PSAnU3ltYm9sJykpIHx8IGZhbHNlO1xufVxuLyoqXG4gKiBGaWxsIGFueSBtaXNzaW5nIHdlbGwga25vd24gc3ltYm9scyBpZiB0aGUgbmF0aXZlIFN5bWJvbCBpcyBtaXNzaW5nIHRoZW1cbiAqL1xuW1xuICAgICdoYXNJbnN0YW5jZScsXG4gICAgJ2lzQ29uY2F0U3ByZWFkYWJsZScsXG4gICAgJ2l0ZXJhdG9yJyxcbiAgICAnc3BlY2llcycsXG4gICAgJ3JlcGxhY2UnLFxuICAgICdzZWFyY2gnLFxuICAgICdzcGxpdCcsXG4gICAgJ21hdGNoJyxcbiAgICAndG9QcmltaXRpdmUnLFxuICAgICd0b1N0cmluZ1RhZycsXG4gICAgJ3Vuc2NvcGFibGVzJyxcbiAgICAnb2JzZXJ2YWJsZSdcbl0uZm9yRWFjaCgod2VsbEtub3duKSA9PiB7XG4gICAgaWYgKCFTeW1ib2xbd2VsbEtub3duXSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3ltYm9sLCB3ZWxsS25vd24sIGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKHdlbGxLbm93biksIGZhbHNlLCBmYWxzZSkpO1xuICAgIH1cbn0pO1xuZXhwb3J0IGRlZmF1bHQgU3ltYm9sO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3ltYm9sLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL1N5bWJvbC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vU3ltYm9sLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4vZ2xvYmFsJztcbmltcG9ydCB7IGlzQXJyYXlMaWtlIH0gZnJvbSAnLi9pdGVyYXRvcic7XG5pbXBvcnQgaGFzIGZyb20gJy4vc3VwcG9ydC9oYXMnO1xuaW1wb3J0ICcuL1N5bWJvbCc7XG5leHBvcnQgbGV0IFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcbmlmICghdHJ1ZSkge1xuICAgIGNvbnN0IERFTEVURUQgPSB7fTtcbiAgICBjb25zdCBnZXRVSUQgPSBmdW5jdGlvbiBnZXRVSUQoKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwMDApO1xuICAgIH07XG4gICAgY29uc3QgZ2VuZXJhdGVOYW1lID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IHN0YXJ0SWQgPSBNYXRoLmZsb29yKERhdGUubm93KCkgJSAxMDAwMDAwMDApO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gZ2VuZXJhdGVOYW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuICdfX3dtJyArIGdldFVJRCgpICsgKHN0YXJ0SWQrKyArICdfXycpO1xuICAgICAgICB9O1xuICAgIH0pKCk7XG4gICAgV2Vha01hcCA9IGNsYXNzIFdlYWtNYXAge1xuICAgICAgICBjb25zdHJ1Y3RvcihpdGVyYWJsZSkge1xuICAgICAgICAgICAgdGhpc1tTeW1ib2wudG9TdHJpbmdUYWddID0gJ1dlYWtNYXAnO1xuICAgICAgICAgICAgdGhpcy5fbmFtZSA9IGdlbmVyYXRlTmFtZSgpO1xuICAgICAgICAgICAgdGhpcy5fZnJvemVuRW50cmllcyA9IFtdO1xuICAgICAgICAgICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXJyYXlMaWtlKGl0ZXJhYmxlKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZXJhYmxlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldChpdGVtWzBdLCBpdGVtWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9nZXRGcm96ZW5FbnRyeUluZGV4KGtleSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9mcm96ZW5FbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2Zyb3plbkVudHJpZXNbaV0ua2V5ID09PSBrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZShrZXkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IGtleVt0aGlzLl9uYW1lXTtcbiAgICAgICAgICAgIGlmIChlbnRyeSAmJiBlbnRyeS5rZXkgPT09IGtleSAmJiBlbnRyeS52YWx1ZSAhPT0gREVMRVRFRCkge1xuICAgICAgICAgICAgICAgIGVudHJ5LnZhbHVlID0gREVMRVRFRDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZyb3plbkluZGV4ID0gdGhpcy5fZ2V0RnJvemVuRW50cnlJbmRleChrZXkpO1xuICAgICAgICAgICAgaWYgKGZyb3plbkluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mcm96ZW5FbnRyaWVzLnNwbGljZShmcm96ZW5JbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0KGtleSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IGtleVt0aGlzLl9uYW1lXTtcbiAgICAgICAgICAgIGlmIChlbnRyeSAmJiBlbnRyeS5rZXkgPT09IGtleSAmJiBlbnRyeS52YWx1ZSAhPT0gREVMRVRFRCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZyb3plbkluZGV4ID0gdGhpcy5fZ2V0RnJvemVuRW50cnlJbmRleChrZXkpO1xuICAgICAgICAgICAgaWYgKGZyb3plbkluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZnJvemVuRW50cmllc1tmcm96ZW5JbmRleF0udmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaGFzKGtleSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0ga2V5W3RoaXMuX25hbWVdO1xuICAgICAgICAgICAgaWYgKEJvb2xlYW4oZW50cnkgJiYgZW50cnkua2V5ID09PSBrZXkgJiYgZW50cnkudmFsdWUgIT09IERFTEVURUQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmcm96ZW5JbmRleCA9IHRoaXMuX2dldEZyb3plbkVudHJ5SW5kZXgoa2V5KTtcbiAgICAgICAgICAgIGlmIChmcm96ZW5JbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICgha2V5IHx8ICh0eXBlb2Yga2V5ICE9PSAnb2JqZWN0JyAmJiB0eXBlb2Yga2V5ICE9PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgdmFsdWUgdXNlZCBhcyB3ZWFrIG1hcCBrZXknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBlbnRyeSA9IGtleVt0aGlzLl9uYW1lXTtcbiAgICAgICAgICAgIGlmICghZW50cnkgfHwgZW50cnkua2V5ICE9PSBrZXkpIHtcbiAgICAgICAgICAgICAgICBlbnRyeSA9IE9iamVjdC5jcmVhdGUobnVsbCwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IHsgdmFsdWU6IGtleSB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5pc0Zyb3plbihrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Zyb3plbkVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoa2V5LCB0aGlzLl9uYW1lLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZW50cnlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW50cnkudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydCBkZWZhdWx0IFdlYWtNYXA7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1XZWFrTWFwLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL1dlYWtNYXAubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL1dlYWtNYXAubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xuaW1wb3J0IHsgaXNBcnJheUxpa2UsIGlzSXRlcmFibGUgfSBmcm9tICcuL2l0ZXJhdG9yJztcbmltcG9ydCB7IE1BWF9TQUZFX0lOVEVHRVIgfSBmcm9tICcuL251bWJlcic7XG5pbXBvcnQgaGFzIGZyb20gJy4vc3VwcG9ydC9oYXMnO1xuaW1wb3J0IHsgd3JhcE5hdGl2ZSB9IGZyb20gJy4vc3VwcG9ydC91dGlsJztcbmV4cG9ydCBsZXQgZnJvbTtcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBhcnJheSBmcm9tIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBhcmd1bWVudHMgQW55IG51bWJlciBvZiBhcmd1bWVudHMgZm9yIHRoZSBhcnJheVxuICogQHJldHVybiBBbiBhcnJheSBmcm9tIHRoZSBnaXZlbiBhcmd1bWVudHNcbiAqL1xuZXhwb3J0IGxldCBvZjtcbi8qIEVTNiBBcnJheSBpbnN0YW5jZSBtZXRob2RzICovXG4vKipcbiAqIENvcGllcyBkYXRhIGludGVybmFsbHkgd2l0aGluIGFuIGFycmF5IG9yIGFycmF5LWxpa2Ugb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBhcnJheS1saWtlIG9iamVjdFxuICogQHBhcmFtIG9mZnNldCBUaGUgaW5kZXggdG8gc3RhcnQgY29weWluZyB2YWx1ZXMgdG87IGlmIG5lZ2F0aXZlLCBpdCBjb3VudHMgYmFja3dhcmRzIGZyb20gbGVuZ3RoXG4gKiBAcGFyYW0gc3RhcnQgVGhlIGZpcnN0IChpbmNsdXNpdmUpIGluZGV4IHRvIGNvcHk7IGlmIG5lZ2F0aXZlLCBpdCBjb3VudHMgYmFja3dhcmRzIGZyb20gbGVuZ3RoXG4gKiBAcGFyYW0gZW5kIFRoZSBsYXN0IChleGNsdXNpdmUpIGluZGV4IHRvIGNvcHk7IGlmIG5lZ2F0aXZlLCBpdCBjb3VudHMgYmFja3dhcmRzIGZyb20gbGVuZ3RoXG4gKiBAcmV0dXJuIFRoZSB0YXJnZXRcbiAqL1xuZXhwb3J0IGxldCBjb3B5V2l0aGluO1xuLyoqXG4gKiBGaWxscyBlbGVtZW50cyBvZiBhbiBhcnJheS1saWtlIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuXG4gKlxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHRvIGZpbGxcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBlYWNoIGVsZW1lbnQgb2YgdGhlIHRhcmdldCB3aXRoXG4gKiBAcGFyYW0gc3RhcnQgVGhlIGZpcnN0IGluZGV4IHRvIGZpbGxcbiAqIEBwYXJhbSBlbmQgVGhlIChleGNsdXNpdmUpIGluZGV4IGF0IHdoaWNoIHRvIHN0b3AgZmlsbGluZ1xuICogQHJldHVybiBUaGUgZmlsbGVkIHRhcmdldFxuICovXG5leHBvcnQgbGV0IGZpbGw7XG4vKipcbiAqIEZpbmRzIGFuZCByZXR1cm5zIHRoZSBmaXJzdCBpbnN0YW5jZSBtYXRjaGluZyB0aGUgY2FsbGJhY2sgb3IgdW5kZWZpbmVkIGlmIG9uZSBpcyBub3QgZm91bmQuXG4gKlxuICogQHBhcmFtIHRhcmdldCBBbiBhcnJheS1saWtlIG9iamVjdFxuICogQHBhcmFtIGNhbGxiYWNrIEEgZnVuY3Rpb24gcmV0dXJuaW5nIGlmIHRoZSBjdXJyZW50IHZhbHVlIG1hdGNoZXMgYSBjcml0ZXJpYVxuICogQHBhcmFtIHRoaXNBcmcgVGhlIGV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgZmluZCBmdW5jdGlvblxuICogQHJldHVybiBUaGUgZmlyc3QgZWxlbWVudCBtYXRjaGluZyB0aGUgY2FsbGJhY2ssIG9yIHVuZGVmaW5lZCBpZiBvbmUgZG9lcyBub3QgZXhpc3RcbiAqL1xuZXhwb3J0IGxldCBmaW5kO1xuLyoqXG4gKiBQZXJmb3JtcyBhIGxpbmVhciBzZWFyY2ggYW5kIHJldHVybnMgdGhlIGZpcnN0IGluZGV4IHdob3NlIHZhbHVlIHNhdGlzZmllcyB0aGUgcGFzc2VkIGNhbGxiYWNrLFxuICogb3IgLTEgaWYgbm8gdmFsdWVzIHNhdGlzZnkgaXQuXG4gKlxuICogQHBhcmFtIHRhcmdldCBBbiBhcnJheS1saWtlIG9iamVjdFxuICogQHBhcmFtIGNhbGxiYWNrIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRydWUgaWYgdGhlIGN1cnJlbnQgdmFsdWUgc2F0aXNmaWVzIGl0cyBjcml0ZXJpYVxuICogQHBhcmFtIHRoaXNBcmcgVGhlIGV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgZmluZCBmdW5jdGlvblxuICogQHJldHVybiBUaGUgZmlyc3QgaW5kZXggd2hvc2UgdmFsdWUgc2F0aXNmaWVzIHRoZSBwYXNzZWQgY2FsbGJhY2ssIG9yIC0xIGlmIG5vIHZhbHVlcyBzYXRpc2Z5IGl0XG4gKi9cbmV4cG9ydCBsZXQgZmluZEluZGV4O1xuLyogRVM3IEFycmF5IGluc3RhbmNlIG1ldGhvZHMgKi9cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGFycmF5IGluY2x1ZGVzIGEgZ2l2ZW4gdmFsdWVcbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IHRoZSB0YXJnZXQgYXJyYXktbGlrZSBvYmplY3RcbiAqIEBwYXJhbSBzZWFyY2hFbGVtZW50IHRoZSBpdGVtIHRvIHNlYXJjaCBmb3JcbiAqIEBwYXJhbSBmcm9tSW5kZXggdGhlIHN0YXJ0aW5nIGluZGV4IHRvIHNlYXJjaCBmcm9tXG4gKiBAcmV0dXJuIGB0cnVlYCBpZiB0aGUgYXJyYXkgaW5jbHVkZXMgdGhlIGVsZW1lbnQsIG90aGVyd2lzZSBgZmFsc2VgXG4gKi9cbmV4cG9ydCBsZXQgaW5jbHVkZXM7XG5pZiAodHJ1ZSAmJiB0cnVlKSB7XG4gICAgZnJvbSA9IGdsb2JhbC5BcnJheS5mcm9tO1xuICAgIG9mID0gZ2xvYmFsLkFycmF5Lm9mO1xuICAgIGNvcHlXaXRoaW4gPSB3cmFwTmF0aXZlKGdsb2JhbC5BcnJheS5wcm90b3R5cGUuY29weVdpdGhpbik7XG4gICAgZmlsbCA9IHdyYXBOYXRpdmUoZ2xvYmFsLkFycmF5LnByb3RvdHlwZS5maWxsKTtcbiAgICBmaW5kID0gd3JhcE5hdGl2ZShnbG9iYWwuQXJyYXkucHJvdG90eXBlLmZpbmQpO1xuICAgIGZpbmRJbmRleCA9IHdyYXBOYXRpdmUoZ2xvYmFsLkFycmF5LnByb3RvdHlwZS5maW5kSW5kZXgpO1xufVxuZWxzZSB7XG4gICAgLy8gSXQgaXMgb25seSBvbGRlciB2ZXJzaW9ucyBvZiBTYWZhcmkvaU9TIHRoYXQgaGF2ZSBhIGJhZCBmaWxsIGltcGxlbWVudGF0aW9uIGFuZCBzbyBhcmVuJ3QgaW4gdGhlIHdpbGRcbiAgICAvLyBUbyBtYWtlIHRoaW5ncyBlYXNpZXIsIGlmIHRoZXJlIGlzIGEgYmFkIGZpbGwgaW1wbGVtZW50YXRpb24sIHRoZSB3aG9sZSBzZXQgb2YgZnVuY3Rpb25zIHdpbGwgYmUgZmlsbGVkXG4gICAgLyoqXG4gICAgICogRW5zdXJlcyBhIG5vbi1uZWdhdGl2ZSwgbm9uLWluZmluaXRlLCBzYWZlIGludGVnZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgdG8gdmFsaWRhdGVcbiAgICAgKiBAcmV0dXJuIEEgcHJvcGVyIGxlbmd0aFxuICAgICAqL1xuICAgIGNvbnN0IHRvTGVuZ3RoID0gZnVuY3Rpb24gdG9MZW5ndGgobGVuZ3RoKSB7XG4gICAgICAgIGlmIChpc05hTihsZW5ndGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKTtcbiAgICAgICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgICAgICAgIGxlbmd0aCA9IE1hdGguZmxvb3IobGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgYSBub24tbmVnYXRpdmUsIHJlYWwsIHNhZmUgaW50ZWdlclxuICAgICAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobGVuZ3RoLCAwKSwgTUFYX1NBRkVfSU5URUdFUik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGcm9tIEVTNiA3LjEuNCBUb0ludGVnZXIoKVxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIEEgdmFsdWUgdG8gY29udmVydFxuICAgICAqIEByZXR1cm4gQW4gaW50ZWdlclxuICAgICAqL1xuICAgIGNvbnN0IHRvSW50ZWdlciA9IGZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSkge1xuICAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gMCB8fCAhaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh2YWx1ZSA+IDAgPyAxIDogLTEpICogTWF0aC5mbG9vcihNYXRoLmFicyh2YWx1ZSkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplcyBhbiBvZmZzZXQgYWdhaW5zdCBhIGdpdmVuIGxlbmd0aCwgd3JhcHBpbmcgaXQgaWYgbmVnYXRpdmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG9yaWdpbmFsIG9mZnNldFxuICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIHRvdGFsIGxlbmd0aCB0byBub3JtYWxpemUgYWdhaW5zdFxuICAgICAqIEByZXR1cm4gSWYgbmVnYXRpdmUsIHByb3ZpZGUgYSBkaXN0YW5jZSBmcm9tIHRoZSBlbmQgKGxlbmd0aCk7IG90aGVyd2lzZSBwcm92aWRlIGEgZGlzdGFuY2UgZnJvbSAwXG4gICAgICovXG4gICAgY29uc3Qgbm9ybWFsaXplT2Zmc2V0ID0gZnVuY3Rpb24gbm9ybWFsaXplT2Zmc2V0KHZhbHVlLCBsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlIDwgMCA/IE1hdGgubWF4KGxlbmd0aCArIHZhbHVlLCAwKSA6IE1hdGgubWluKHZhbHVlLCBsZW5ndGgpO1xuICAgIH07XG4gICAgZnJvbSA9IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlLCBtYXBGdW5jdGlvbiwgdGhpc0FyZykge1xuICAgICAgICBpZiAoYXJyYXlMaWtlID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2Zyb206IHJlcXVpcmVzIGFuIGFycmF5LWxpa2Ugb2JqZWN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hcEZ1bmN0aW9uICYmIHRoaXNBcmcpIHtcbiAgICAgICAgICAgIG1hcEZ1bmN0aW9uID0gbWFwRnVuY3Rpb24uYmluZCh0aGlzQXJnKTtcbiAgICAgICAgfVxuICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZSAqL1xuICAgICAgICBjb25zdCBDb25zdHJ1Y3RvciA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRvTGVuZ3RoKGFycmF5TGlrZS5sZW5ndGgpO1xuICAgICAgICAvLyBTdXBwb3J0IGV4dGVuc2lvblxuICAgICAgICBjb25zdCBhcnJheSA9IHR5cGVvZiBDb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyA/IE9iamVjdChuZXcgQ29uc3RydWN0b3IobGVuZ3RoKSkgOiBuZXcgQXJyYXkobGVuZ3RoKTtcbiAgICAgICAgaWYgKCFpc0FycmF5TGlrZShhcnJheUxpa2UpICYmICFpc0l0ZXJhYmxlKGFycmF5TGlrZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGFycmF5IGFuZCB0aGUgbm9ybWFsaXplZCBsZW5ndGggaXMgMCwganVzdCByZXR1cm4gYW4gZW1wdHkgYXJyYXkuIHRoaXMgcHJldmVudHMgYSBwcm9ibGVtXG4gICAgICAgIC8vIHdpdGggdGhlIGl0ZXJhdGlvbiBvbiBJRSB3aGVuIHVzaW5nIGEgTmFOIGFycmF5IGxlbmd0aC5cbiAgICAgICAgaWYgKGlzQXJyYXlMaWtlKGFycmF5TGlrZSkpIHtcbiAgICAgICAgICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5TGlrZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGFycmF5W2ldID0gbWFwRnVuY3Rpb24gPyBtYXBGdW5jdGlvbihhcnJheUxpa2VbaV0sIGkpIDogYXJyYXlMaWtlW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhcnJheUxpa2UpIHtcbiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IG1hcEZ1bmN0aW9uID8gbWFwRnVuY3Rpb24odmFsdWUsIGkpIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhcnJheUxpa2UubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFycmF5Lmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgfTtcbiAgICBvZiA9IGZ1bmN0aW9uIG9mKC4uLml0ZW1zKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChpdGVtcyk7XG4gICAgfTtcbiAgICBjb3B5V2l0aGluID0gZnVuY3Rpb24gY29weVdpdGhpbih0YXJnZXQsIG9mZnNldCwgc3RhcnQsIGVuZCkge1xuICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NvcHlXaXRoaW46IHRhcmdldCBtdXN0IGJlIGFuIGFycmF5LWxpa2Ugb2JqZWN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdG9MZW5ndGgodGFyZ2V0Lmxlbmd0aCk7XG4gICAgICAgIG9mZnNldCA9IG5vcm1hbGl6ZU9mZnNldCh0b0ludGVnZXIob2Zmc2V0KSwgbGVuZ3RoKTtcbiAgICAgICAgc3RhcnQgPSBub3JtYWxpemVPZmZzZXQodG9JbnRlZ2VyKHN0YXJ0KSwgbGVuZ3RoKTtcbiAgICAgICAgZW5kID0gbm9ybWFsaXplT2Zmc2V0KGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9JbnRlZ2VyKGVuZCksIGxlbmd0aCk7XG4gICAgICAgIGxldCBjb3VudCA9IE1hdGgubWluKGVuZCAtIHN0YXJ0LCBsZW5ndGggLSBvZmZzZXQpO1xuICAgICAgICBsZXQgZGlyZWN0aW9uID0gMTtcbiAgICAgICAgaWYgKG9mZnNldCA+IHN0YXJ0ICYmIG9mZnNldCA8IHN0YXJ0ICsgY291bnQpIHtcbiAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xO1xuICAgICAgICAgICAgc3RhcnQgKz0gY291bnQgLSAxO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IGNvdW50IC0gMTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoY291bnQgPiAwKSB7XG4gICAgICAgICAgICBpZiAoc3RhcnQgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W29mZnNldF0gPSB0YXJnZXRbc3RhcnRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRhcmdldFtvZmZzZXRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2Zmc2V0ICs9IGRpcmVjdGlvbjtcbiAgICAgICAgICAgIHN0YXJ0ICs9IGRpcmVjdGlvbjtcbiAgICAgICAgICAgIGNvdW50LS07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9O1xuICAgIGZpbGwgPSBmdW5jdGlvbiBmaWxsKHRhcmdldCwgdmFsdWUsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdG9MZW5ndGgodGFyZ2V0Lmxlbmd0aCk7XG4gICAgICAgIGxldCBpID0gbm9ybWFsaXplT2Zmc2V0KHRvSW50ZWdlcihzdGFydCksIGxlbmd0aCk7XG4gICAgICAgIGVuZCA9IG5vcm1hbGl6ZU9mZnNldChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvSW50ZWdlcihlbmQpLCBsZW5ndGgpO1xuICAgICAgICB3aGlsZSAoaSA8IGVuZCkge1xuICAgICAgICAgICAgdGFyZ2V0W2krK10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH07XG4gICAgZmluZCA9IGZ1bmN0aW9uIGZpbmQodGFyZ2V0LCBjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgICBjb25zdCBpbmRleCA9IGZpbmRJbmRleCh0YXJnZXQsIGNhbGxiYWNrLCB0aGlzQXJnKTtcbiAgICAgICAgcmV0dXJuIGluZGV4ICE9PSAtMSA/IHRhcmdldFtpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBmaW5kSW5kZXggPSBmdW5jdGlvbiBmaW5kSW5kZXgodGFyZ2V0LCBjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgICBjb25zdCBsZW5ndGggPSB0b0xlbmd0aCh0YXJnZXQubGVuZ3RoKTtcbiAgICAgICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZmluZDogc2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzQXJnKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrLmJpbmQodGhpc0FyZyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKHRhcmdldFtpXSwgaSwgdGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9O1xufVxuaWYgKHRydWUpIHtcbiAgICBpbmNsdWRlcyA9IHdyYXBOYXRpdmUoZ2xvYmFsLkFycmF5LnByb3RvdHlwZS5pbmNsdWRlcyk7XG59XG5lbHNlIHtcbiAgICAvKipcbiAgICAgKiBFbnN1cmVzIGEgbm9uLW5lZ2F0aXZlLCBub24taW5maW5pdGUsIHNhZmUgaW50ZWdlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciB0byB2YWxpZGF0ZVxuICAgICAqIEByZXR1cm4gQSBwcm9wZXIgbGVuZ3RoXG4gICAgICovXG4gICAgY29uc3QgdG9MZW5ndGggPSBmdW5jdGlvbiB0b0xlbmd0aChsZW5ndGgpIHtcbiAgICAgICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aCk7XG4gICAgICAgIGlmIChpc05hTihsZW5ndGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgICAgICAgbGVuZ3RoID0gTWF0aC5mbG9vcihsZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVuc3VyZSBhIG5vbi1uZWdhdGl2ZSwgcmVhbCwgc2FmZSBpbnRlZ2VyXG4gICAgICAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heChsZW5ndGgsIDApLCBNQVhfU0FGRV9JTlRFR0VSKTtcbiAgICB9O1xuICAgIGluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXModGFyZ2V0LCBzZWFyY2hFbGVtZW50LCBmcm9tSW5kZXggPSAwKSB7XG4gICAgICAgIGxldCBsZW4gPSB0b0xlbmd0aCh0YXJnZXQubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGZyb21JbmRleDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RWxlbWVudCA9IHRhcmdldFtpXTtcbiAgICAgICAgICAgIGlmIChzZWFyY2hFbGVtZW50ID09PSBjdXJyZW50RWxlbWVudCB8fFxuICAgICAgICAgICAgICAgIChzZWFyY2hFbGVtZW50ICE9PSBzZWFyY2hFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50ICE9PSBjdXJyZW50RWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFycmF5Lm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL2FycmF5Lm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9hcnJheS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiY29uc3QgZ2xvYmFsT2JqZWN0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gZ2xvYmFsIHNwZWMgZGVmaW5lcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdCBjYWxsZWQgJ2dsb2JhbCdcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZ2xvYmFsXG4gICAgICAgIC8vIGBnbG9iYWxgIGlzIGFsc28gZGVmaW5lZCBpbiBOb2RlSlNcbiAgICAgICAgcmV0dXJuIGdsb2JhbDtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gd2luZG93IGlzIGRlZmluZWQgaW4gYnJvd3NlcnNcbiAgICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIHNlbGYgaXMgZGVmaW5lZCBpbiBXZWJXb3JrZXJzXG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cbn0pKCk7XG5leHBvcnQgZGVmYXVsdCBnbG9iYWxPYmplY3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nbG9iYWwubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vZ2xvYmFsLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9nbG9iYWwubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCAnLi9TeW1ib2wnO1xuaW1wb3J0IHsgSElHSF9TVVJST0dBVEVfTUFYLCBISUdIX1NVUlJPR0FURV9NSU4gfSBmcm9tICcuL3N0cmluZyc7XG5jb25zdCBzdGF0aWNEb25lID0geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4vKipcbiAqIEEgY2xhc3MgdGhhdCBfc2hpbXNfIGFuIGl0ZXJhdG9yIGludGVyZmFjZSBvbiBhcnJheSBsaWtlIG9iamVjdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTaGltSXRlcmF0b3Ige1xuICAgIGNvbnN0cnVjdG9yKGxpc3QpIHtcbiAgICAgICAgdGhpcy5fbmV4dEluZGV4ID0gLTE7XG4gICAgICAgIGlmIChpc0l0ZXJhYmxlKGxpc3QpKSB7XG4gICAgICAgICAgICB0aGlzLl9uYXRpdmVJdGVyYXRvciA9IGxpc3RbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbGlzdCA9IGxpc3Q7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBuZXh0IGl0ZXJhdGlvbiByZXN1bHQgZm9yIHRoZSBJdGVyYXRvclxuICAgICAqL1xuICAgIG5leHQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9uYXRpdmVJdGVyYXRvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25hdGl2ZUl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2xpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0aWNEb25lO1xuICAgICAgICB9XG4gICAgICAgIGlmICgrK3RoaXMuX25leHRJbmRleCA8IHRoaXMuX2xpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLl9saXN0W3RoaXMuX25leHRJbmRleF1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXRpY0RvbmU7XG4gICAgfVxuICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG4vKipcbiAqIEEgdHlwZSBndWFyZCBmb3IgY2hlY2tpbmcgaWYgc29tZXRoaW5nIGhhcyBhbiBJdGVyYWJsZSBpbnRlcmZhY2VcbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHR5cGUgZ3VhcmQgYWdhaW5zdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJdGVyYWJsZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWVbU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJztcbn1cbi8qKlxuICogQSB0eXBlIGd1YXJkIGZvciBjaGVja2luZyBpZiBzb21ldGhpbmcgaXMgQXJyYXlMaWtlXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB0eXBlIGd1YXJkIGFnYWluc3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5sZW5ndGggPT09ICdudW1iZXInO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpdGVyYXRvciBmb3IgYW4gb2JqZWN0XG4gKlxuICogQHBhcmFtIGl0ZXJhYmxlIFRoZSBpdGVyYWJsZSBvYmplY3QgdG8gcmV0dXJuIHRoZSBpdGVyYXRvciBmb3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldChpdGVyYWJsZSkge1xuICAgIGlmIChpc0l0ZXJhYmxlKGl0ZXJhYmxlKSkge1xuICAgICAgICByZXR1cm4gaXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0FycmF5TGlrZShpdGVyYWJsZSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTaGltSXRlcmF0b3IoaXRlcmFibGUpO1xuICAgIH1cbn1cbi8qKlxuICogU2hpbXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYGZvciAuLi4gb2ZgIGJsb2Nrc1xuICpcbiAqIEBwYXJhbSBpdGVyYWJsZSBUaGUgb2JqZWN0IHRoZSBwcm92aWRlcyBhbiBpbnRlcmF0b3IgaW50ZXJmYWNlXG4gKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIGl0ZW0gb2YgdGhlIGl0ZXJhYmxlXG4gKiBAcGFyYW0gdGhpc0FyZyBPcHRpb25hbCBzY29wZSB0byBwYXNzIHRoZSBjYWxsYmFja1xuICovXG5leHBvcnQgZnVuY3Rpb24gZm9yT2YoaXRlcmFibGUsIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgbGV0IGJyb2tlbiA9IGZhbHNlO1xuICAgIGZ1bmN0aW9uIGRvQnJlYWsoKSB7XG4gICAgICAgIGJyb2tlbiA9IHRydWU7XG4gICAgfVxuICAgIC8qIFdlIG5lZWQgdG8gaGFuZGxlIGl0ZXJhdGlvbiBvZiBkb3VibGUgYnl0ZSBzdHJpbmdzIHByb3Blcmx5ICovXG4gICAgaWYgKGlzQXJyYXlMaWtlKGl0ZXJhYmxlKSAmJiB0eXBlb2YgaXRlcmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IGwgPSBpdGVyYWJsZS5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICBsZXQgY2hhciA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgaWYgKGkgKyAxIDwgbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvZGUgPSBjaGFyLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGUgPj0gSElHSF9TVVJST0dBVEVfTUlOICYmIGNvZGUgPD0gSElHSF9TVVJST0dBVEVfTUFYKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXIgKz0gaXRlcmFibGVbKytpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIGNoYXIsIGl0ZXJhYmxlLCBkb0JyZWFrKTtcbiAgICAgICAgICAgIGlmIChicm9rZW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0gZ2V0KGl0ZXJhYmxlKTtcbiAgICAgICAgaWYgKGl0ZXJhdG9yKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgd2hpbGUgKCFyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgcmVzdWx0LnZhbHVlLCBpdGVyYWJsZSwgZG9CcmVhayk7XG4gICAgICAgICAgICAgICAgaWYgKGJyb2tlbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWl0ZXJhdG9yLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL2l0ZXJhdG9yLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9pdGVyYXRvci5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XG4vKipcbiAqIFRoZSBzbWFsbGVzdCBpbnRlcnZhbCBiZXR3ZWVuIHR3byByZXByZXNlbnRhYmxlIG51bWJlcnMuXG4gKi9cbmV4cG9ydCBjb25zdCBFUFNJTE9OID0gMTtcbi8qKlxuICogVGhlIG1heGltdW0gc2FmZSBpbnRlZ2VyIGluIEphdmFTY3JpcHRcbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9TQUZFX0lOVEVHRVIgPSBNYXRoLnBvdygyLCA1MykgLSAxO1xuLyoqXG4gKiBUaGUgbWluaW11bSBzYWZlIGludGVnZXIgaW4gSmF2YVNjcmlwdFxuICovXG5leHBvcnQgY29uc3QgTUlOX1NBRkVfSU5URUdFUiA9IC1NQVhfU0FGRV9JTlRFR0VSO1xuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhc3NlZCB2YWx1ZSBpcyBOYU4gd2l0aG91dCBjb2Vyc2lvbi5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgTmFOLCBmYWxzZSBpZiBpdCBpcyBub3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTmFOKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgZ2xvYmFsLmlzTmFOKHZhbHVlKTtcbn1cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXNzZWQgdmFsdWUgaXMgYSBmaW5pdGUgbnVtYmVyIHdpdGhvdXQgY29lcnNpb24uXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGZpbml0ZSwgZmFsc2UgaWYgaXQgaXMgbm90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Zpbml0ZSh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGdsb2JhbC5pc0Zpbml0ZSh2YWx1ZSk7XG59XG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGFzc2VkIHZhbHVlIGlzIGFuIGludGVnZXIuXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGFuIGludGVnZXIsIGZhbHNlIGlmIGl0IGlzIG5vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJbnRlZ2VyKHZhbHVlKSB7XG4gICAgcmV0dXJuIGlzRmluaXRlKHZhbHVlKSAmJiBNYXRoLmZsb29yKHZhbHVlKSA9PT0gdmFsdWU7XG59XG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGFzc2VkIHZhbHVlIGlzIGFuIGludGVnZXIgdGhhdCBpcyAnc2FmZSwnIG1lYW5pbmc6XG4gKiAgIDEuIGl0IGNhbiBiZSBleHByZXNzZWQgYXMgYW4gSUVFRS03NTQgZG91YmxlIHByZWNpc2lvbiBudW1iZXJcbiAqICAgMi4gaXQgaGFzIGEgb25lLXRvLW9uZSBtYXBwaW5nIHRvIGEgbWF0aGVtYXRpY2FsIGludGVnZXIsIG1lYW5pbmcgaXRzXG4gKiAgICAgIElFRUUtNzU0IHJlcHJlc2VudGF0aW9uIGNhbm5vdCBiZSB0aGUgcmVzdWx0IG9mIHJvdW5kaW5nIGFueSBvdGhlclxuICogICAgICBpbnRlZ2VyIHRvIGZpdCB0aGUgSUVFRS03NTQgcmVwcmVzZW50YXRpb25cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlciwgZmFsc2UgaWYgaXQgaXMgbm90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlKSB7XG4gICAgcmV0dXJuIGlzSW50ZWdlcih2YWx1ZSkgJiYgTWF0aC5hYnModmFsdWUpIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1udW1iZXIubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vbnVtYmVyLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9udW1iZXIubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xuaW1wb3J0IGhhcyBmcm9tICcuL3N1cHBvcnQvaGFzJztcbmltcG9ydCB7IGlzU3ltYm9sIH0gZnJvbSAnLi9TeW1ib2wnO1xuZXhwb3J0IGxldCBhc3NpZ247XG4vKipcbiAqIEdldHMgdGhlIG93biBwcm9wZXJ0eSBkZXNjcmlwdG9yIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LlxuICogQW4gb3duIHByb3BlcnR5IGRlc2NyaXB0b3IgaXMgb25lIHRoYXQgaXMgZGVmaW5lZCBkaXJlY3RseSBvbiB0aGUgb2JqZWN0IGFuZCBpcyBub3RcbiAqIGluaGVyaXRlZCBmcm9tIHRoZSBvYmplY3QncyBwcm90b3R5cGUuXG4gKiBAcGFyYW0gbyBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgcHJvcGVydHkuXG4gKiBAcGFyYW0gcCBOYW1lIG9mIHRoZSBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGxldCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4vKipcbiAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSBvd24gcHJvcGVydGllcyBvZiBhbiBvYmplY3QuIFRoZSBvd24gcHJvcGVydGllcyBvZiBhbiBvYmplY3QgYXJlIHRob3NlIHRoYXQgYXJlIGRlZmluZWQgZGlyZWN0bHlcbiAqIG9uIHRoYXQgb2JqZWN0LCBhbmQgYXJlIG5vdCBpbmhlcml0ZWQgZnJvbSB0aGUgb2JqZWN0J3MgcHJvdG90eXBlLiBUaGUgcHJvcGVydGllcyBvZiBhbiBvYmplY3QgaW5jbHVkZSBib3RoIGZpZWxkcyAob2JqZWN0cykgYW5kIGZ1bmN0aW9ucy5cbiAqIEBwYXJhbSBvIE9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBvd24gcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGxldCBnZXRPd25Qcm9wZXJ0eU5hbWVzO1xuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBzeW1ib2wgcHJvcGVydGllcyBmb3VuZCBkaXJlY3RseSBvbiBvYmplY3Qgby5cbiAqIEBwYXJhbSBvIE9iamVjdCB0byByZXRyaWV2ZSB0aGUgc3ltYm9scyBmcm9tLlxuICovXG5leHBvcnQgbGV0IGdldE93blByb3BlcnR5U3ltYm9scztcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZXMgYXJlIHRoZSBzYW1lIHZhbHVlLCBmYWxzZSBvdGhlcndpc2UuXG4gKiBAcGFyYW0gdmFsdWUxIFRoZSBmaXJzdCB2YWx1ZS5cbiAqIEBwYXJhbSB2YWx1ZTIgVGhlIHNlY29uZCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGxldCBpcztcbi8qKlxuICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydGllcyBhbmQgbWV0aG9kcyBvZiBhbiBvYmplY3QuXG4gKiBAcGFyYW0gbyBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgcHJvcGVydGllcyBhbmQgbWV0aG9kcy4gVGhpcyBjYW4gYmUgYW4gb2JqZWN0IHRoYXQgeW91IGNyZWF0ZWQgb3IgYW4gZXhpc3RpbmcgRG9jdW1lbnQgT2JqZWN0IE1vZGVsIChET00pIG9iamVjdC5cbiAqL1xuZXhwb3J0IGxldCBrZXlzO1xuLyogRVM3IE9iamVjdCBzdGF0aWMgbWV0aG9kcyAqL1xuZXhwb3J0IGxldCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzO1xuZXhwb3J0IGxldCBlbnRyaWVzO1xuZXhwb3J0IGxldCB2YWx1ZXM7XG5pZiAodHJ1ZSkge1xuICAgIGNvbnN0IGdsb2JhbE9iamVjdCA9IGdsb2JhbC5PYmplY3Q7XG4gICAgYXNzaWduID0gZ2xvYmFsT2JqZWN0LmFzc2lnbjtcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBnbG9iYWxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuICAgIGdldE93blByb3BlcnR5TmFtZXMgPSBnbG9iYWxPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcbiAgICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnbG9iYWxPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuICAgIGlzID0gZ2xvYmFsT2JqZWN0LmlzO1xuICAgIGtleXMgPSBnbG9iYWxPYmplY3Qua2V5cztcbn1cbmVsc2Uge1xuICAgIGtleXMgPSBmdW5jdGlvbiBzeW1ib2xBd2FyZUtleXMobykge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMobykuZmlsdGVyKChrZXkpID0+ICFCb29sZWFuKGtleS5tYXRjaCgvXkBALisvKSkpO1xuICAgIH07XG4gICAgYXNzaWduID0gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgLi4uc291cmNlcykge1xuICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFR5cGVFcnJvciBpZiB1bmRlZmluZWQgb3IgbnVsbFxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG8gPSBPYmplY3QodGFyZ2V0KTtcbiAgICAgICAgc291cmNlcy5mb3JFYWNoKChuZXh0U291cmNlKSA9PiB7XG4gICAgICAgICAgICBpZiAobmV4dFNvdXJjZSkge1xuICAgICAgICAgICAgICAgIC8vIFNraXAgb3ZlciBpZiB1bmRlZmluZWQgb3IgbnVsbFxuICAgICAgICAgICAgICAgIGtleXMobmV4dFNvdXJjZSkuZm9yRWFjaCgobmV4dEtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0b1tuZXh0S2V5XSA9IG5leHRTb3VyY2VbbmV4dEtleV07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdG87XG4gICAgfTtcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobywgcHJvcCkge1xuICAgICAgICBpZiAoaXNTeW1ib2wocHJvcCkpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8sIHByb3ApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobywgcHJvcCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKG8pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG8pLmZpbHRlcigoa2V5KSA9PiAhQm9vbGVhbihrZXkubWF0Y2goL15AQC4rLykpKTtcbiAgICB9O1xuICAgIGdldE93blByb3BlcnR5U3ltYm9scyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhvKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvKVxuICAgICAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBCb29sZWFuKGtleS5tYXRjaCgvXkBALisvKSkpXG4gICAgICAgICAgICAubWFwKChrZXkpID0+IFN5bWJvbC5mb3Ioa2V5LnN1YnN0cmluZygyKSkpO1xuICAgIH07XG4gICAgaXMgPSBmdW5jdGlvbiBpcyh2YWx1ZTEsIHZhbHVlMikge1xuICAgICAgICBpZiAodmFsdWUxID09PSB2YWx1ZTIpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTEgIT09IDAgfHwgMSAvIHZhbHVlMSA9PT0gMSAvIHZhbHVlMjsgLy8gLTBcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUxICE9PSB2YWx1ZTEgJiYgdmFsdWUyICE9PSB2YWx1ZTI7IC8vIE5hTlxuICAgIH07XG59XG5pZiAodHJ1ZSkge1xuICAgIGNvbnN0IGdsb2JhbE9iamVjdCA9IGdsb2JhbC5PYmplY3Q7XG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA9IGdsb2JhbE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzO1xuICAgIGVudHJpZXMgPSBnbG9iYWxPYmplY3QuZW50cmllcztcbiAgICB2YWx1ZXMgPSBnbG9iYWxPYmplY3QudmFsdWVzO1xufVxuZWxzZSB7XG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobykge1xuICAgICAgICByZXR1cm4gZ2V0T3duUHJvcGVydHlOYW1lcyhvKS5yZWR1Y2UoKHByZXZpb3VzLCBrZXkpID0+IHtcbiAgICAgICAgICAgIHByZXZpb3VzW2tleV0gPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobywga2V5KTtcbiAgICAgICAgICAgIHJldHVybiBwcmV2aW91cztcbiAgICAgICAgfSwge30pO1xuICAgIH07XG4gICAgZW50cmllcyA9IGZ1bmN0aW9uIGVudHJpZXMobykge1xuICAgICAgICByZXR1cm4ga2V5cyhvKS5tYXAoKGtleSkgPT4gW2tleSwgb1trZXldXSk7XG4gICAgfTtcbiAgICB2YWx1ZXMgPSBmdW5jdGlvbiB2YWx1ZXMobykge1xuICAgICAgICByZXR1cm4ga2V5cyhvKS5tYXAoKGtleSkgPT4gb1trZXldKTtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b2JqZWN0Lm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL29iamVjdC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vb2JqZWN0Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4vZ2xvYmFsJztcbmltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XG5pbXBvcnQgeyB3cmFwTmF0aXZlIH0gZnJvbSAnLi9zdXBwb3J0L3V0aWwnO1xuLyoqXG4gKiBUaGUgbWluaW11bSBsb2NhdGlvbiBvZiBoaWdoIHN1cnJvZ2F0ZXNcbiAqL1xuZXhwb3J0IGNvbnN0IEhJR0hfU1VSUk9HQVRFX01JTiA9IDB4ZDgwMDtcbi8qKlxuICogVGhlIG1heGltdW0gbG9jYXRpb24gb2YgaGlnaCBzdXJyb2dhdGVzXG4gKi9cbmV4cG9ydCBjb25zdCBISUdIX1NVUlJPR0FURV9NQVggPSAweGRiZmY7XG4vKipcbiAqIFRoZSBtaW5pbXVtIGxvY2F0aW9uIG9mIGxvdyBzdXJyb2dhdGVzXG4gKi9cbmV4cG9ydCBjb25zdCBMT1dfU1VSUk9HQVRFX01JTiA9IDB4ZGMwMDtcbi8qKlxuICogVGhlIG1heGltdW0gbG9jYXRpb24gb2YgbG93IHN1cnJvZ2F0ZXNcbiAqL1xuZXhwb3J0IGNvbnN0IExPV19TVVJST0dBVEVfTUFYID0gMHhkZmZmO1xuLyogRVM2IHN0YXRpYyBtZXRob2RzICovXG4vKipcbiAqIFJldHVybiB0aGUgU3RyaW5nIHZhbHVlIHdob3NlIGVsZW1lbnRzIGFyZSwgaW4gb3JkZXIsIHRoZSBlbGVtZW50cyBpbiB0aGUgTGlzdCBlbGVtZW50cy5cbiAqIElmIGxlbmd0aCBpcyAwLCB0aGUgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLlxuICogQHBhcmFtIGNvZGVQb2ludHMgVGhlIGNvZGUgcG9pbnRzIHRvIGdlbmVyYXRlIHRoZSBzdHJpbmdcbiAqL1xuZXhwb3J0IGxldCBmcm9tQ29kZVBvaW50O1xuLyoqXG4gKiBgcmF3YCBpcyBpbnRlbmRlZCBmb3IgdXNlIGFzIGEgdGFnIGZ1bmN0aW9uIG9mIGEgVGFnZ2VkIFRlbXBsYXRlIFN0cmluZy4gV2hlbiBjYWxsZWRcbiAqIGFzIHN1Y2ggdGhlIGZpcnN0IGFyZ3VtZW50IHdpbGwgYmUgYSB3ZWxsIGZvcm1lZCB0ZW1wbGF0ZSBjYWxsIHNpdGUgb2JqZWN0IGFuZCB0aGUgcmVzdFxuICogcGFyYW1ldGVyIHdpbGwgY29udGFpbiB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcy5cbiAqIEBwYXJhbSB0ZW1wbGF0ZSBBIHdlbGwtZm9ybWVkIHRlbXBsYXRlIHN0cmluZyBjYWxsIHNpdGUgcmVwcmVzZW50YXRpb24uXG4gKiBAcGFyYW0gc3Vic3RpdHV0aW9ucyBBIHNldCBvZiBzdWJzdGl0dXRpb24gdmFsdWVzLlxuICovXG5leHBvcnQgbGV0IHJhdztcbi8qIEVTNiBpbnN0YW5jZSBtZXRob2RzICovXG4vKipcbiAqIFJldHVybnMgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIE51bWJlciBsZXNzIHRoYW4gMTExNDExMiAoMHgxMTAwMDApIHRoYXQgaXMgdGhlIGNvZGUgcG9pbnRcbiAqIHZhbHVlIG9mIHRoZSBVVEYtMTYgZW5jb2RlZCBjb2RlIHBvaW50IHN0YXJ0aW5nIGF0IHRoZSBzdHJpbmcgZWxlbWVudCBhdCBwb3NpdGlvbiBwb3MgaW5cbiAqIHRoZSBTdHJpbmcgcmVzdWx0aW5nIGZyb20gY29udmVydGluZyB0aGlzIG9iamVjdCB0byBhIFN0cmluZy5cbiAqIElmIHRoZXJlIGlzIG5vIGVsZW1lbnQgYXQgdGhhdCBwb3NpdGlvbiwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuXG4gKiBJZiBhIHZhbGlkIFVURi0xNiBzdXJyb2dhdGUgcGFpciBkb2VzIG5vdCBiZWdpbiBhdCBwb3MsIHRoZSByZXN1bHQgaXMgdGhlIGNvZGUgdW5pdCBhdCBwb3MuXG4gKi9cbmV4cG9ydCBsZXQgY29kZVBvaW50QXQ7XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VxdWVuY2Ugb2YgZWxlbWVudHMgb2Ygc2VhcmNoU3RyaW5nIGNvbnZlcnRlZCB0byBhIFN0cmluZyBpcyB0aGVcbiAqIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgdGhpcyBvYmplY3QgKGNvbnZlcnRlZCB0byBhIFN0cmluZykgc3RhcnRpbmcgYXRcbiAqIGVuZFBvc2l0aW9uIOKAkyBsZW5ndGgodGhpcykuIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlLlxuICovXG5leHBvcnQgbGV0IGVuZHNXaXRoO1xuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgc2VhcmNoU3RyaW5nIGFwcGVhcnMgYXMgYSBzdWJzdHJpbmcgb2YgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoaXNcbiAqIG9iamVjdCB0byBhIFN0cmluZywgYXQgb25lIG9yIG1vcmUgcG9zaXRpb25zIHRoYXQgYXJlXG4gKiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gcG9zaXRpb247IG90aGVyd2lzZSwgcmV0dXJucyBmYWxzZS5cbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBzdHJpbmdcbiAqIEBwYXJhbSBzZWFyY2hTdHJpbmcgc2VhcmNoIHN0cmluZ1xuICogQHBhcmFtIHBvc2l0aW9uIElmIHBvc2l0aW9uIGlzIHVuZGVmaW5lZCwgMCBpcyBhc3N1bWVkLCBzbyBhcyB0byBzZWFyY2ggYWxsIG9mIHRoZSBTdHJpbmcuXG4gKi9cbmV4cG9ydCBsZXQgaW5jbHVkZXM7XG4vKipcbiAqIFJldHVybnMgdGhlIFN0cmluZyB2YWx1ZSByZXN1bHQgb2Ygbm9ybWFsaXppbmcgdGhlIHN0cmluZyBpbnRvIHRoZSBub3JtYWxpemF0aW9uIGZvcm1cbiAqIG5hbWVkIGJ5IGZvcm0gYXMgc3BlY2lmaWVkIGluIFVuaWNvZGUgU3RhbmRhcmQgQW5uZXggIzE1LCBVbmljb2RlIE5vcm1hbGl6YXRpb24gRm9ybXMuXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgc3RyaW5nXG4gKiBAcGFyYW0gZm9ybSBBcHBsaWNhYmxlIHZhbHVlczogXCJORkNcIiwgXCJORkRcIiwgXCJORktDXCIsIG9yIFwiTkZLRFwiLCBJZiBub3Qgc3BlY2lmaWVkIGRlZmF1bHRcbiAqIGlzIFwiTkZDXCJcbiAqL1xuZXhwb3J0IGxldCBub3JtYWxpemU7XG4vKipcbiAqIFJldHVybnMgYSBTdHJpbmcgdmFsdWUgdGhhdCBpcyBtYWRlIGZyb20gY291bnQgY29waWVzIGFwcGVuZGVkIHRvZ2V0aGVyLiBJZiBjb3VudCBpcyAwLFxuICogVCBpcyB0aGUgZW1wdHkgU3RyaW5nIGlzIHJldHVybmVkLlxuICogQHBhcmFtIGNvdW50IG51bWJlciBvZiBjb3BpZXMgdG8gYXBwZW5kXG4gKi9cbmV4cG9ydCBsZXQgcmVwZWF0O1xuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcXVlbmNlIG9mIGVsZW1lbnRzIG9mIHNlYXJjaFN0cmluZyBjb252ZXJ0ZWQgdG8gYSBTdHJpbmcgaXMgdGhlXG4gKiBzYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIHRoaXMgb2JqZWN0IChjb252ZXJ0ZWQgdG8gYSBTdHJpbmcpIHN0YXJ0aW5nIGF0XG4gKiBwb3NpdGlvbi4gT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuXG4gKi9cbmV4cG9ydCBsZXQgc3RhcnRzV2l0aDtcbi8qIEVTNyBpbnN0YW5jZSBtZXRob2RzICovXG4vKipcbiAqIFBhZHMgdGhlIGN1cnJlbnQgc3RyaW5nIHdpdGggYSBnaXZlbiBzdHJpbmcgKHBvc3NpYmx5IHJlcGVhdGVkKSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgc3RyaW5nIHJlYWNoZXMgYSBnaXZlbiBsZW5ndGguXG4gKiBUaGUgcGFkZGluZyBpcyBhcHBsaWVkIGZyb20gdGhlIGVuZCAocmlnaHQpIG9mIHRoZSBjdXJyZW50IHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgc3RyaW5nXG4gKiBAcGFyYW0gbWF4TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcgb25jZSB0aGUgY3VycmVudCBzdHJpbmcgaGFzIGJlZW4gcGFkZGVkLlxuICogICAgICAgIElmIHRoaXMgcGFyYW1ldGVyIGlzIHNtYWxsZXIgdGhhbiB0aGUgY3VycmVudCBzdHJpbmcncyBsZW5ndGgsIHRoZSBjdXJyZW50IHN0cmluZyB3aWxsIGJlIHJldHVybmVkIGFzIGl0IGlzLlxuICpcbiAqIEBwYXJhbSBmaWxsU3RyaW5nIFRoZSBzdHJpbmcgdG8gcGFkIHRoZSBjdXJyZW50IHN0cmluZyB3aXRoLlxuICogICAgICAgIElmIHRoaXMgc3RyaW5nIGlzIHRvbyBsb25nLCBpdCB3aWxsIGJlIHRydW5jYXRlZCBhbmQgdGhlIGxlZnQtbW9zdCBwYXJ0IHdpbGwgYmUgYXBwbGllZC5cbiAqICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaXMgXCIgXCIgKFUrMDAyMCkuXG4gKi9cbmV4cG9ydCBsZXQgcGFkRW5kO1xuLyoqXG4gKiBQYWRzIHRoZSBjdXJyZW50IHN0cmluZyB3aXRoIGEgZ2l2ZW4gc3RyaW5nIChwb3NzaWJseSByZXBlYXRlZCkgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHN0cmluZyByZWFjaGVzIGEgZ2l2ZW4gbGVuZ3RoLlxuICogVGhlIHBhZGRpbmcgaXMgYXBwbGllZCBmcm9tIHRoZSBzdGFydCAobGVmdCkgb2YgdGhlIGN1cnJlbnQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBzdHJpbmdcbiAqIEBwYXJhbSBtYXhMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZyBvbmNlIHRoZSBjdXJyZW50IHN0cmluZyBoYXMgYmVlbiBwYWRkZWQuXG4gKiAgICAgICAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgc21hbGxlciB0aGFuIHRoZSBjdXJyZW50IHN0cmluZydzIGxlbmd0aCwgdGhlIGN1cnJlbnQgc3RyaW5nIHdpbGwgYmUgcmV0dXJuZWQgYXMgaXQgaXMuXG4gKlxuICogQHBhcmFtIGZpbGxTdHJpbmcgVGhlIHN0cmluZyB0byBwYWQgdGhlIGN1cnJlbnQgc3RyaW5nIHdpdGguXG4gKiAgICAgICAgSWYgdGhpcyBzdHJpbmcgaXMgdG9vIGxvbmcsIGl0IHdpbGwgYmUgdHJ1bmNhdGVkIGFuZCB0aGUgbGVmdC1tb3N0IHBhcnQgd2lsbCBiZSBhcHBsaWVkLlxuICogICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciBpcyBcIiBcIiAoVSswMDIwKS5cbiAqL1xuZXhwb3J0IGxldCBwYWRTdGFydDtcbmlmICh0cnVlICYmIHRydWUpIHtcbiAgICBmcm9tQ29kZVBvaW50ID0gZ2xvYmFsLlN0cmluZy5mcm9tQ29kZVBvaW50O1xuICAgIHJhdyA9IGdsb2JhbC5TdHJpbmcucmF3O1xuICAgIGNvZGVQb2ludEF0ID0gd3JhcE5hdGl2ZShnbG9iYWwuU3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdCk7XG4gICAgZW5kc1dpdGggPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoKTtcbiAgICBpbmNsdWRlcyA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMpO1xuICAgIG5vcm1hbGl6ZSA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUubm9ybWFsaXplKTtcbiAgICByZXBlYXQgPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLnJlcGVhdCk7XG4gICAgc3RhcnRzV2l0aCA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aCk7XG59XG5lbHNlIHtcbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZXMgdGhhdCB0ZXh0IGlzIGRlZmluZWQsIGFuZCBub3JtYWxpemVzIHBvc2l0aW9uIChiYXNlZCBvbiB0aGUgZ2l2ZW4gZGVmYXVsdCBpZiB0aGUgaW5wdXQgaXMgTmFOKS5cbiAgICAgKiBVc2VkIGJ5IHN0YXJ0c1dpdGgsIGluY2x1ZGVzLCBhbmQgZW5kc1dpdGguXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIE5vcm1hbGl6ZWQgcG9zaXRpb24uXG4gICAgICovXG4gICAgY29uc3Qgbm9ybWFsaXplU3Vic3RyaW5nQXJncyA9IGZ1bmN0aW9uIChuYW1lLCB0ZXh0LCBzZWFyY2gsIHBvc2l0aW9uLCBpc0VuZCA9IGZhbHNlKSB7XG4gICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmluZy4nICsgbmFtZSArICcgcmVxdWlyZXMgYSB2YWxpZCBzdHJpbmcgdG8gc2VhcmNoIGFnYWluc3QuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGV4dC5sZW5ndGg7XG4gICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gIT09IHBvc2l0aW9uID8gKGlzRW5kID8gbGVuZ3RoIDogMCkgOiBwb3NpdGlvbjtcbiAgICAgICAgcmV0dXJuIFt0ZXh0LCBTdHJpbmcoc2VhcmNoKSwgTWF0aC5taW4oTWF0aC5tYXgocG9zaXRpb24sIDApLCBsZW5ndGgpXTtcbiAgICB9O1xuICAgIGZyb21Db2RlUG9pbnQgPSBmdW5jdGlvbiBmcm9tQ29kZVBvaW50KC4uLmNvZGVQb2ludHMpIHtcbiAgICAgICAgLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5mcm9tQ29kZVBvaW50XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcbiAgICAgICAgY29uc3QgTUFYX1NJWkUgPSAweDQwMDA7XG4gICAgICAgIGxldCBjb2RlVW5pdHMgPSBbXTtcbiAgICAgICAgbGV0IGluZGV4ID0gLTE7XG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBjb2RlUG9pbnQgPSBOdW1iZXIoYXJndW1lbnRzW2luZGV4XSk7XG4gICAgICAgICAgICAvLyBDb2RlIHBvaW50cyBtdXN0IGJlIGZpbml0ZSBpbnRlZ2VycyB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlXG4gICAgICAgICAgICBsZXQgaXNWYWxpZCA9IGlzRmluaXRlKGNvZGVQb2ludCkgJiYgTWF0aC5mbG9vcihjb2RlUG9pbnQpID09PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50ID49IDAgJiYgY29kZVBvaW50IDw9IDB4MTBmZmZmO1xuICAgICAgICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcignc3RyaW5nLmZyb21Db2RlUG9pbnQ6IEludmFsaWQgY29kZSBwb2ludCAnICsgY29kZVBvaW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2RlUG9pbnQgPD0gMHhmZmZmKSB7XG4gICAgICAgICAgICAgICAgLy8gQk1QIGNvZGUgcG9pbnRcbiAgICAgICAgICAgICAgICBjb2RlVW5pdHMucHVzaChjb2RlUG9pbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQXN0cmFsIGNvZGUgcG9pbnQ7IHNwbGl0IGluIHN1cnJvZ2F0ZSBoYWx2ZXNcbiAgICAgICAgICAgICAgICAvLyBodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZyNzdXJyb2dhdGUtZm9ybXVsYWVcbiAgICAgICAgICAgICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMDtcbiAgICAgICAgICAgICAgICBsZXQgaGlnaFN1cnJvZ2F0ZSA9IChjb2RlUG9pbnQgPj4gMTApICsgSElHSF9TVVJST0dBVEVfTUlOO1xuICAgICAgICAgICAgICAgIGxldCBsb3dTdXJyb2dhdGUgPSBjb2RlUG9pbnQgJSAweDQwMCArIExPV19TVVJST0dBVEVfTUlOO1xuICAgICAgICAgICAgICAgIGNvZGVVbml0cy5wdXNoKGhpZ2hTdXJyb2dhdGUsIGxvd1N1cnJvZ2F0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5kZXggKyAxID09PSBsZW5ndGggfHwgY29kZVVuaXRzLmxlbmd0aCA+IE1BWF9TSVpFKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGZyb21DaGFyQ29kZS5hcHBseShudWxsLCBjb2RlVW5pdHMpO1xuICAgICAgICAgICAgICAgIGNvZGVVbml0cy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICByYXcgPSBmdW5jdGlvbiByYXcoY2FsbFNpdGUsIC4uLnN1YnN0aXR1dGlvbnMpIHtcbiAgICAgICAgbGV0IHJhd1N0cmluZ3MgPSBjYWxsU2l0ZS5yYXc7XG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgICAgbGV0IG51bVN1YnN0aXR1dGlvbnMgPSBzdWJzdGl0dXRpb25zLmxlbmd0aDtcbiAgICAgICAgaWYgKGNhbGxTaXRlID09IG51bGwgfHwgY2FsbFNpdGUucmF3ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmluZy5yYXcgcmVxdWlyZXMgYSB2YWxpZCBjYWxsU2l0ZSBvYmplY3Qgd2l0aCBhIHJhdyB2YWx1ZScpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSByYXdTdHJpbmdzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gcmF3U3RyaW5nc1tpXSArIChpIDwgbnVtU3Vic3RpdHV0aW9ucyAmJiBpIDwgbGVuZ3RoIC0gMSA/IHN1YnN0aXR1dGlvbnNbaV0gOiAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIGNvZGVQb2ludEF0ID0gZnVuY3Rpb24gY29kZVBvaW50QXQodGV4dCwgcG9zaXRpb24gPSAwKSB7XG4gICAgICAgIC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0XG4gICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmluZy5jb2RlUG9pbnRBdCByZXF1cmllcyBhIHZhbGlkIHN0cmluZy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsZW5ndGggPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgaWYgKHBvc2l0aW9uICE9PSBwb3NpdGlvbikge1xuICAgICAgICAgICAgcG9zaXRpb24gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIEdldCB0aGUgZmlyc3QgY29kZSB1bml0XG4gICAgICAgIGNvbnN0IGZpcnN0ID0gdGV4dC5jaGFyQ29kZUF0KHBvc2l0aW9uKTtcbiAgICAgICAgaWYgKGZpcnN0ID49IEhJR0hfU1VSUk9HQVRFX01JTiAmJiBmaXJzdCA8PSBISUdIX1NVUlJPR0FURV9NQVggJiYgbGVuZ3RoID4gcG9zaXRpb24gKyAxKSB7XG4gICAgICAgICAgICAvLyBTdGFydCBvZiBhIHN1cnJvZ2F0ZSBwYWlyIChoaWdoIHN1cnJvZ2F0ZSBhbmQgdGhlcmUgaXMgYSBuZXh0IGNvZGUgdW5pdCk7IGNoZWNrIGZvciBsb3cgc3Vycm9nYXRlXG4gICAgICAgICAgICAvLyBodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZyNzdXJyb2dhdGUtZm9ybXVsYWVcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZCA9IHRleHQuY2hhckNvZGVBdChwb3NpdGlvbiArIDEpO1xuICAgICAgICAgICAgaWYgKHNlY29uZCA+PSBMT1dfU1VSUk9HQVRFX01JTiAmJiBzZWNvbmQgPD0gTE9XX1NVUlJPR0FURV9NQVgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGZpcnN0IC0gSElHSF9TVVJST0dBVEVfTUlOKSAqIDB4NDAwICsgc2Vjb25kIC0gTE9XX1NVUlJPR0FURV9NSU4gKyAweDEwMDAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaXJzdDtcbiAgICB9O1xuICAgIGVuZHNXaXRoID0gZnVuY3Rpb24gZW5kc1dpdGgodGV4dCwgc2VhcmNoLCBlbmRQb3NpdGlvbikge1xuICAgICAgICBpZiAoZW5kUG9zaXRpb24gPT0gbnVsbCkge1xuICAgICAgICAgICAgZW5kUG9zaXRpb24gPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBbdGV4dCwgc2VhcmNoLCBlbmRQb3NpdGlvbl0gPSBub3JtYWxpemVTdWJzdHJpbmdBcmdzKCdlbmRzV2l0aCcsIHRleHQsIHNlYXJjaCwgZW5kUG9zaXRpb24sIHRydWUpO1xuICAgICAgICBjb25zdCBzdGFydCA9IGVuZFBvc2l0aW9uIC0gc2VhcmNoLmxlbmd0aDtcbiAgICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKHN0YXJ0LCBlbmRQb3NpdGlvbikgPT09IHNlYXJjaDtcbiAgICB9O1xuICAgIGluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXModGV4dCwgc2VhcmNoLCBwb3NpdGlvbiA9IDApIHtcbiAgICAgICAgW3RleHQsIHNlYXJjaCwgcG9zaXRpb25dID0gbm9ybWFsaXplU3Vic3RyaW5nQXJncygnaW5jbHVkZXMnLCB0ZXh0LCBzZWFyY2gsIHBvc2l0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRleHQuaW5kZXhPZihzZWFyY2gsIHBvc2l0aW9uKSAhPT0gLTE7XG4gICAgfTtcbiAgICByZXBlYXQgPSBmdW5jdGlvbiByZXBlYXQodGV4dCwgY291bnQgPSAwKSB7XG4gICAgICAgIC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcucHJvdG90eXBlLnJlcGVhdFxuICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJpbmcucmVwZWF0IHJlcXVpcmVzIGEgdmFsaWQgc3RyaW5nLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3VudCAhPT0gY291bnQpIHtcbiAgICAgICAgICAgIGNvdW50ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY291bnQgPCAwIHx8IGNvdW50ID09PSBJbmZpbml0eSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3N0cmluZy5yZXBlYXQgcmVxdWlyZXMgYSBub24tbmVnYXRpdmUgZmluaXRlIGNvdW50LicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgICAgd2hpbGUgKGNvdW50KSB7XG4gICAgICAgICAgICBpZiAoY291bnQgJSAyKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IHRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY291bnQgPiAxKSB7XG4gICAgICAgICAgICAgICAgdGV4dCArPSB0ZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY291bnQgPj49IDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIHN0YXJ0c1dpdGggPSBmdW5jdGlvbiBzdGFydHNXaXRoKHRleHQsIHNlYXJjaCwgcG9zaXRpb24gPSAwKSB7XG4gICAgICAgIHNlYXJjaCA9IFN0cmluZyhzZWFyY2gpO1xuICAgICAgICBbdGV4dCwgc2VhcmNoLCBwb3NpdGlvbl0gPSBub3JtYWxpemVTdWJzdHJpbmdBcmdzKCdzdGFydHNXaXRoJywgdGV4dCwgc2VhcmNoLCBwb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IGVuZCA9IHBvc2l0aW9uICsgc2VhcmNoLmxlbmd0aDtcbiAgICAgICAgaWYgKGVuZCA+IHRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQuc2xpY2UocG9zaXRpb24sIGVuZCkgPT09IHNlYXJjaDtcbiAgICB9O1xufVxuaWYgKHRydWUpIHtcbiAgICBwYWRFbmQgPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLnBhZEVuZCk7XG4gICAgcGFkU3RhcnQgPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLnBhZFN0YXJ0KTtcbn1cbmVsc2Uge1xuICAgIHBhZEVuZCA9IGZ1bmN0aW9uIHBhZEVuZCh0ZXh0LCBtYXhMZW5ndGgsIGZpbGxTdHJpbmcgPSAnICcpIHtcbiAgICAgICAgaWYgKHRleHQgPT09IG51bGwgfHwgdGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJpbmcucmVwZWF0IHJlcXVpcmVzIGEgdmFsaWQgc3RyaW5nLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXhMZW5ndGggPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc3RyaW5nLnBhZEVuZCByZXF1aXJlcyBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgY291bnQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heExlbmd0aCA9PT0gbnVsbCB8fCBtYXhMZW5ndGggPT09IHVuZGVmaW5lZCB8fCBtYXhMZW5ndGggPCAwKSB7XG4gICAgICAgICAgICBtYXhMZW5ndGggPSAwO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdHJUZXh0ID0gU3RyaW5nKHRleHQpO1xuICAgICAgICBjb25zdCBwYWRkaW5nID0gbWF4TGVuZ3RoIC0gc3RyVGV4dC5sZW5ndGg7XG4gICAgICAgIGlmIChwYWRkaW5nID4gMCkge1xuICAgICAgICAgICAgc3RyVGV4dCArPVxuICAgICAgICAgICAgICAgIHJlcGVhdChmaWxsU3RyaW5nLCBNYXRoLmZsb29yKHBhZGRpbmcgLyBmaWxsU3RyaW5nLmxlbmd0aCkpICtcbiAgICAgICAgICAgICAgICAgICAgZmlsbFN0cmluZy5zbGljZSgwLCBwYWRkaW5nICUgZmlsbFN0cmluZy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHJUZXh0O1xuICAgIH07XG4gICAgcGFkU3RhcnQgPSBmdW5jdGlvbiBwYWRTdGFydCh0ZXh0LCBtYXhMZW5ndGgsIGZpbGxTdHJpbmcgPSAnICcpIHtcbiAgICAgICAgaWYgKHRleHQgPT09IG51bGwgfHwgdGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJpbmcucmVwZWF0IHJlcXVpcmVzIGEgdmFsaWQgc3RyaW5nLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXhMZW5ndGggPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc3RyaW5nLnBhZFN0YXJ0IHJlcXVpcmVzIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSBjb3VudC4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4TGVuZ3RoID09PSBudWxsIHx8IG1heExlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IG1heExlbmd0aCA8IDApIHtcbiAgICAgICAgICAgIG1heExlbmd0aCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0clRleHQgPSBTdHJpbmcodGV4dCk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmcgPSBtYXhMZW5ndGggLSBzdHJUZXh0Lmxlbmd0aDtcbiAgICAgICAgaWYgKHBhZGRpbmcgPiAwKSB7XG4gICAgICAgICAgICBzdHJUZXh0ID1cbiAgICAgICAgICAgICAgICByZXBlYXQoZmlsbFN0cmluZywgTWF0aC5mbG9vcihwYWRkaW5nIC8gZmlsbFN0cmluZy5sZW5ndGgpKSArXG4gICAgICAgICAgICAgICAgICAgIGZpbGxTdHJpbmcuc2xpY2UoMCwgcGFkZGluZyAlIGZpbGxTdHJpbmcubGVuZ3RoKSArXG4gICAgICAgICAgICAgICAgICAgIHN0clRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0clRleHQ7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmluZy5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdHJpbmcubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL3N0cmluZy5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IGhhcywgeyBhZGQgfSBmcm9tICdAZG9qby9oYXMvaGFzJztcbmltcG9ydCBnbG9iYWwgZnJvbSAnLi4vZ2xvYmFsJztcbmV4cG9ydCBkZWZhdWx0IGhhcztcbmV4cG9ydCAqIGZyb20gJ0Bkb2pvL2hhcy9oYXMnO1xuLyogRUNNQVNjcmlwdCA2IGFuZCA3IEZlYXR1cmVzICovXG4vKiBBcnJheSAqL1xuYWRkKCdlczYtYXJyYXknLCAoKSA9PiB7XG4gICAgcmV0dXJuIChbJ2Zyb20nLCAnb2YnXS5ldmVyeSgoa2V5KSA9PiBrZXkgaW4gZ2xvYmFsLkFycmF5KSAmJlxuICAgICAgICBbJ2ZpbmRJbmRleCcsICdmaW5kJywgJ2NvcHlXaXRoaW4nXS5ldmVyeSgoa2V5KSA9PiBrZXkgaW4gZ2xvYmFsLkFycmF5LnByb3RvdHlwZSkpO1xufSwgdHJ1ZSk7XG5hZGQoJ2VzNi1hcnJheS1maWxsJywgKCkgPT4ge1xuICAgIGlmICgnZmlsbCcgaW4gZ2xvYmFsLkFycmF5LnByb3RvdHlwZSkge1xuICAgICAgICAvKiBTb21lIHZlcnNpb25zIG9mIFNhZmFyaSBkbyBub3QgcHJvcGVybHkgaW1wbGVtZW50IHRoaXMgKi9cbiAgICAgICAgcmV0dXJuIFsxXS5maWxsKDksIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSlbMF0gPT09IDE7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn0sIHRydWUpO1xuYWRkKCdlczctYXJyYXknLCAoKSA9PiAnaW5jbHVkZXMnIGluIGdsb2JhbC5BcnJheS5wcm90b3R5cGUsIHRydWUpO1xuLyogTWFwICovXG5hZGQoJ2VzNi1tYXAnLCAoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBnbG9iYWwuTWFwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8qXG4gICAgSUUxMSBhbmQgb2xkZXIgdmVyc2lvbnMgb2YgU2FmYXJpIGFyZSBtaXNzaW5nIGNyaXRpY2FsIEVTNiBNYXAgZnVuY3Rpb25hbGl0eVxuICAgIFdlIHdyYXAgdGhpcyBpbiBhIHRyeS9jYXRjaCBiZWNhdXNlIHNvbWV0aW1lcyB0aGUgTWFwIGNvbnN0cnVjdG9yIGV4aXN0cywgYnV0IGRvZXMgbm90XG4gICAgdGFrZSBhcmd1bWVudHMgKGlPUyA4LjQpXG4gICAgICovXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtYXAgPSBuZXcgZ2xvYmFsLk1hcChbWzAsIDFdXSk7XG4gICAgICAgICAgICByZXR1cm4gbWFwLmhhcygwKSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBtYXAua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICAgICAgICAgIHRydWUgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgbWFwLnZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBtYXAuZW50cmllcyA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IG5vdCB0ZXN0aW5nIG9uIGlPUyBhdCB0aGUgbW9tZW50ICovXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufSwgdHJ1ZSk7XG4vKiBNYXRoICovXG5hZGQoJ2VzNi1tYXRoJywgKCkgPT4ge1xuICAgIHJldHVybiBbXG4gICAgICAgICdjbHozMicsXG4gICAgICAgICdzaWduJyxcbiAgICAgICAgJ2xvZzEwJyxcbiAgICAgICAgJ2xvZzInLFxuICAgICAgICAnbG9nMXAnLFxuICAgICAgICAnZXhwbTEnLFxuICAgICAgICAnY29zaCcsXG4gICAgICAgICdzaW5oJyxcbiAgICAgICAgJ3RhbmgnLFxuICAgICAgICAnYWNvc2gnLFxuICAgICAgICAnYXNpbmgnLFxuICAgICAgICAnYXRhbmgnLFxuICAgICAgICAndHJ1bmMnLFxuICAgICAgICAnZnJvdW5kJyxcbiAgICAgICAgJ2NicnQnLFxuICAgICAgICAnaHlwb3QnXG4gICAgXS5ldmVyeSgobmFtZSkgPT4gdHlwZW9mIGdsb2JhbC5NYXRoW25hbWVdID09PSAnZnVuY3Rpb24nKTtcbn0sIHRydWUpO1xuYWRkKCdlczYtbWF0aC1pbXVsJywgKCkgPT4ge1xuICAgIGlmICgnaW11bCcgaW4gZ2xvYmFsLk1hdGgpIHtcbiAgICAgICAgLyogU29tZSB2ZXJzaW9ucyBvZiBTYWZhcmkgb24gaW9zIGRvIG5vdCBwcm9wZXJseSBpbXBsZW1lbnQgdGhpcyAqL1xuICAgICAgICByZXR1cm4gTWF0aC5pbXVsKDB4ZmZmZmZmZmYsIDUpID09PSAtNTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufSwgdHJ1ZSk7XG4vKiBPYmplY3QgKi9cbmFkZCgnZXM2LW9iamVjdCcsICgpID0+IHtcbiAgICByZXR1cm4gdHJ1ZSAmJlxuICAgICAgICBbJ2Fzc2lnbicsICdpcycsICdnZXRPd25Qcm9wZXJ0eVN5bWJvbHMnLCAnc2V0UHJvdG90eXBlT2YnXS5ldmVyeSgobmFtZSkgPT4gdHlwZW9mIGdsb2JhbC5PYmplY3RbbmFtZV0gPT09ICdmdW5jdGlvbicpO1xufSwgdHJ1ZSk7XG5hZGQoJ2VzMjAxNy1vYmplY3QnLCAoKSA9PiB7XG4gICAgcmV0dXJuIFsndmFsdWVzJywgJ2VudHJpZXMnLCAnZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyddLmV2ZXJ5KChuYW1lKSA9PiB0eXBlb2YgZ2xvYmFsLk9iamVjdFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJyk7XG59LCB0cnVlKTtcbi8qIE9ic2VydmFibGUgKi9cbmFkZCgnZXMtb2JzZXJ2YWJsZScsICgpID0+IHR5cGVvZiBnbG9iYWwuT2JzZXJ2YWJsZSAhPT0gJ3VuZGVmaW5lZCcsIHRydWUpO1xuLyogUHJvbWlzZSAqL1xuYWRkKCdlczYtcHJvbWlzZScsICgpID0+IHR5cGVvZiBnbG9iYWwuUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHJ1ZSwgdHJ1ZSk7XG4vKiBTZXQgKi9cbmFkZCgnZXM2LXNldCcsICgpID0+IHtcbiAgICBpZiAodHlwZW9mIGdsb2JhbC5TZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLyogSUUxMSBhbmQgb2xkZXIgdmVyc2lvbnMgb2YgU2FmYXJpIGFyZSBtaXNzaW5nIGNyaXRpY2FsIEVTNiBTZXQgZnVuY3Rpb25hbGl0eSAqL1xuICAgICAgICBjb25zdCBzZXQgPSBuZXcgZ2xvYmFsLlNldChbMV0pO1xuICAgICAgICByZXR1cm4gc2V0LmhhcygxKSAmJiAna2V5cycgaW4gc2V0ICYmIHR5cGVvZiBzZXQua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59LCB0cnVlKTtcbi8qIFN0cmluZyAqL1xuYWRkKCdlczYtc3RyaW5nJywgKCkgPT4ge1xuICAgIHJldHVybiAoW1xuICAgICAgICAvKiBzdGF0aWMgbWV0aG9kcyAqL1xuICAgICAgICAnZnJvbUNvZGVQb2ludCdcbiAgICBdLmV2ZXJ5KChrZXkpID0+IHR5cGVvZiBnbG9iYWwuU3RyaW5nW2tleV0gPT09ICdmdW5jdGlvbicpICYmXG4gICAgICAgIFtcbiAgICAgICAgICAgIC8qIGluc3RhbmNlIG1ldGhvZHMgKi9cbiAgICAgICAgICAgICdjb2RlUG9pbnRBdCcsXG4gICAgICAgICAgICAnbm9ybWFsaXplJyxcbiAgICAgICAgICAgICdyZXBlYXQnLFxuICAgICAgICAgICAgJ3N0YXJ0c1dpdGgnLFxuICAgICAgICAgICAgJ2VuZHNXaXRoJyxcbiAgICAgICAgICAgICdpbmNsdWRlcydcbiAgICAgICAgXS5ldmVyeSgoa2V5KSA9PiB0eXBlb2YgZ2xvYmFsLlN0cmluZy5wcm90b3R5cGVba2V5XSA9PT0gJ2Z1bmN0aW9uJykpO1xufSwgdHJ1ZSk7XG5hZGQoJ2VzNi1zdHJpbmctcmF3JywgKCkgPT4ge1xuICAgIGZ1bmN0aW9uIGdldENhbGxTaXRlKGNhbGxTaXRlLCAuLi5zdWJzdGl0dXRpb25zKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5jYWxsU2l0ZV07XG4gICAgICAgIHJlc3VsdC5yYXcgPSBjYWxsU2l0ZS5yYXc7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGlmICgncmF3JyBpbiBnbG9iYWwuU3RyaW5nKSB7XG4gICAgICAgIGxldCBiID0gMTtcbiAgICAgICAgbGV0IGNhbGxTaXRlID0gZ2V0Q2FsbFNpdGUgYGFcXG4ke2J9YDtcbiAgICAgICAgY2FsbFNpdGUucmF3ID0gWydhXFxcXG4nXTtcbiAgICAgICAgY29uc3Qgc3VwcG9ydHNUcnVuYyA9IGdsb2JhbC5TdHJpbmcucmF3KGNhbGxTaXRlLCA0MikgPT09ICdhOlxcXFxuJztcbiAgICAgICAgcmV0dXJuIHN1cHBvcnRzVHJ1bmM7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn0sIHRydWUpO1xuYWRkKCdlczIwMTctc3RyaW5nJywgKCkgPT4ge1xuICAgIHJldHVybiBbJ3BhZFN0YXJ0JywgJ3BhZEVuZCddLmV2ZXJ5KChrZXkpID0+IHR5cGVvZiBnbG9iYWwuU3RyaW5nLnByb3RvdHlwZVtrZXldID09PSAnZnVuY3Rpb24nKTtcbn0sIHRydWUpO1xuLyogU3ltYm9sICovXG5hZGQoJ2VzNi1zeW1ib2wnLCAoKSA9PiB0eXBlb2YgZ2xvYmFsLlN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIFN5bWJvbCgpID09PSAnc3ltYm9sJywgdHJ1ZSk7XG4vKiBXZWFrTWFwICovXG5hZGQoJ2VzNi13ZWFrbWFwJywgKCkgPT4ge1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsLldlYWtNYXAgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8qIElFMTEgYW5kIG9sZGVyIHZlcnNpb25zIG9mIFNhZmFyaSBhcmUgbWlzc2luZyBjcml0aWNhbCBFUzYgTWFwIGZ1bmN0aW9uYWxpdHkgKi9cbiAgICAgICAgY29uc3Qga2V5MSA9IHt9O1xuICAgICAgICBjb25zdCBrZXkyID0ge307XG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBnbG9iYWwuV2Vha01hcChbW2tleTEsIDFdXSk7XG4gICAgICAgIE9iamVjdC5mcmVlemUoa2V5MSk7XG4gICAgICAgIHJldHVybiBtYXAuZ2V0KGtleTEpID09PSAxICYmIG1hcC5zZXQoa2V5MiwgMikgPT09IG1hcCAmJiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59LCB0cnVlKTtcbi8qIE1pc2NlbGxhbmVvdXMgZmVhdHVyZXMgKi9cbmFkZCgnbWljcm90YXNrcycsICgpID0+IHRydWUgfHwgZmFsc2UgfHwgdHJ1ZSwgdHJ1ZSk7XG5hZGQoJ3Bvc3RtZXNzYWdlJywgKCkgPT4ge1xuICAgIC8vIElmIHdpbmRvdyBpcyB1bmRlZmluZWQsIGFuZCB3ZSBoYXZlIHBvc3RNZXNzYWdlLCBpdCBwcm9iYWJseSBtZWFucyB3ZSdyZSBpbiBhIHdlYiB3b3JrZXIuIFdlYiB3b3JrZXJzIGhhdmVcbiAgICAvLyBwb3N0IG1lc3NhZ2UgYnV0IGl0IGRvZXNuJ3Qgd29yayBob3cgd2UgZXhwZWN0IGl0IHRvLCBzbyBpdCdzIGJlc3QganVzdCB0byBwcmV0ZW5kIGl0IGRvZXNuJ3QgZXhpc3QuXG4gICAgcmV0dXJuIHR5cGVvZiBnbG9iYWwud2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZ2xvYmFsLnBvc3RNZXNzYWdlID09PSAnZnVuY3Rpb24nO1xufSwgdHJ1ZSk7XG5hZGQoJ3JhZicsICgpID0+IHR5cGVvZiBnbG9iYWwucmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nLCB0cnVlKTtcbmFkZCgnc2V0aW1tZWRpYXRlJywgKCkgPT4gdHlwZW9mIGdsb2JhbC5zZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnLCB0cnVlKTtcbi8qIERPTSBGZWF0dXJlcyAqL1xuYWRkKCdkb20tbXV0YXRpb25vYnNlcnZlcicsICgpID0+IHtcbiAgICBpZiAodHJ1ZSAmJiBCb29sZWFuKGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyKSkge1xuICAgICAgICAvLyBJRTExIGhhcyBhbiB1bnJlbGlhYmxlIE11dGF0aW9uT2JzZXJ2ZXIgaW1wbGVtZW50YXRpb24gd2hlcmUgc2V0UHJvcGVydHkoKSBkb2VzIG5vdFxuICAgICAgICAvLyBnZW5lcmF0ZSBhIG11dGF0aW9uIGV2ZW50LCBvYnNlcnZlcnMgY2FuIGNyYXNoLCBhbmQgdGhlIHF1ZXVlIGRvZXMgbm90IGRyYWluXG4gICAgICAgIC8vIHJlbGlhYmx5LiBUaGUgZm9sbG93aW5nIGZlYXR1cmUgdGVzdCB3YXMgYWRhcHRlZCBmcm9tXG4gICAgICAgIC8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3QxMGtvLzRhY2ViOGM3MTY4MWZkYjI3NWUzM2VmZTVlNTc2YjE0XG4gICAgICAgIGNvbnN0IGV4YW1wbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWUgKi9cbiAgICAgICAgY29uc3QgSG9zdE11dGF0aW9uT2JzZXJ2ZXIgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSG9zdE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKCkgeyB9KTtcbiAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShleGFtcGxlLCB7IGF0dHJpYnV0ZXM6IHRydWUgfSk7XG4gICAgICAgIGV4YW1wbGUuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCAnYmxvY2snKTtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4ob2JzZXJ2ZXIudGFrZVJlY29yZHMoKS5sZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59LCB0cnVlKTtcbmFkZCgnZG9tLXdlYmFuaW1hdGlvbicsICgpID0+IHRydWUgJiYgZ2xvYmFsLkFuaW1hdGlvbiAhPT0gdW5kZWZpbmVkICYmIGdsb2JhbC5LZXlmcmFtZUVmZmVjdCAhPT0gdW5kZWZpbmVkLCB0cnVlKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhcy5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdXBwb3J0L2hhcy5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vc3VwcG9ydC9oYXMubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi4vZ2xvYmFsJztcbmltcG9ydCBoYXMgZnJvbSAnLi9oYXMnO1xuZnVuY3Rpb24gZXhlY3V0ZVRhc2soaXRlbSkge1xuICAgIGlmIChpdGVtICYmIGl0ZW0uaXNBY3RpdmUgJiYgaXRlbS5jYWxsYmFjaykge1xuICAgICAgICBpdGVtLmNhbGxiYWNrKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0UXVldWVIYW5kbGUoaXRlbSwgZGVzdHJ1Y3Rvcikge1xuICAgIHJldHVybiB7XG4gICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgICAgIGl0ZW0uaXNBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIGl0ZW0uY2FsbGJhY2sgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGRlc3RydWN0b3IpIHtcbiAgICAgICAgICAgICAgICBkZXN0cnVjdG9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxubGV0IGNoZWNrTWljcm9UYXNrUXVldWU7XG5sZXQgbWljcm9UYXNrcztcbi8qKlxuICogU2NoZWR1bGVzIGEgY2FsbGJhY2sgdG8gdGhlIG1hY3JvdGFzayBxdWV1ZS5cbiAqXG4gKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGJlIHF1ZXVlZCBhbmQgbGF0ZXIgZXhlY3V0ZWQuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBhIGBkZXN0cm95YCBtZXRob2QgdGhhdCwgd2hlbiBjYWxsZWQsIHByZXZlbnRzIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZyb20gZXhlY3V0aW5nLlxuICovXG5leHBvcnQgY29uc3QgcXVldWVUYXNrID0gKGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgZGVzdHJ1Y3RvcjtcbiAgICBsZXQgZW5xdWV1ZTtcbiAgICAvLyBTaW5jZSB0aGUgSUUgaW1wbGVtZW50YXRpb24gb2YgYHNldEltbWVkaWF0ZWAgaXMgbm90IGZsYXdsZXNzLCB3ZSB3aWxsIHRlc3QgZm9yIGBwb3N0TWVzc2FnZWAgZmlyc3QuXG4gICAgaWYgKHRydWUpIHtcbiAgICAgICAgY29uc3QgcXVldWUgPSBbXTtcbiAgICAgICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIC8vIENvbmZpcm0gdGhhdCB0aGUgZXZlbnQgd2FzIHRyaWdnZXJlZCBieSB0aGUgY3VycmVudCB3aW5kb3cgYW5kIGJ5IHRoaXMgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2UgPT09IGdsb2JhbCAmJiBldmVudC5kYXRhID09PSAnZG9qby1xdWV1ZS1tZXNzYWdlJykge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVRhc2socXVldWUuc2hpZnQoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICBxdWV1ZS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKCdkb2pvLXF1ZXVlLW1lc3NhZ2UnLCAnKicpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChmYWxzZSkge1xuICAgICAgICBkZXN0cnVjdG9yID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlO1xuICAgICAgICBlbnF1ZXVlID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBzZXRJbW1lZGlhdGUoZXhlY3V0ZVRhc2suYmluZChudWxsLCBpdGVtKSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBkZXN0cnVjdG9yID0gZ2xvYmFsLmNsZWFyVGltZW91dDtcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gc2V0VGltZW91dChleGVjdXRlVGFzay5iaW5kKG51bGwsIGl0ZW0pLCAwKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcXVldWVUYXNrKGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICAgICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBpZCA9IGVucXVldWUoaXRlbSk7XG4gICAgICAgIHJldHVybiBnZXRRdWV1ZUhhbmRsZShpdGVtLCBkZXN0cnVjdG9yICYmXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZGVzdHJ1Y3RvcihpZCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gVE9ETzogVXNlIGFzcGVjdC5iZWZvcmUgd2hlbiBpdCBpcyBhdmFpbGFibGUuXG4gICAgcmV0dXJuIHRydWVcbiAgICAgICAgPyBxdWV1ZVRhc2tcbiAgICAgICAgOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNoZWNrTWljcm9UYXNrUXVldWUoKTtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZVRhc2soY2FsbGJhY2spO1xuICAgICAgICB9O1xufSkoKTtcbi8vIFdoZW4gbm8gbWVjaGFuaXNtIGZvciByZWdpc3RlcmluZyBtaWNyb3Rhc2tzIGlzIGV4cG9zZWQgYnkgdGhlIGVudmlyb25tZW50LCBtaWNyb3Rhc2tzIHdpbGxcbi8vIGJlIHF1ZXVlZCBhbmQgdGhlbiBleGVjdXRlZCBpbiBhIHNpbmdsZSBtYWNyb3Rhc2sgYmVmb3JlIHRoZSBvdGhlciBtYWNyb3Rhc2tzIGFyZSBleGVjdXRlZC5cbmlmICghdHJ1ZSkge1xuICAgIGxldCBpc01pY3JvVGFza1F1ZXVlZCA9IGZhbHNlO1xuICAgIG1pY3JvVGFza3MgPSBbXTtcbiAgICBjaGVja01pY3JvVGFza1F1ZXVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWlzTWljcm9UYXNrUXVldWVkKSB7XG4gICAgICAgICAgICBpc01pY3JvVGFza1F1ZXVlZCA9IHRydWU7XG4gICAgICAgICAgICBxdWV1ZVRhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlzTWljcm9UYXNrUXVldWVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKG1pY3JvVGFza3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGl0ZW0gPSBtaWNyb1Rhc2tzLnNoaWZ0KCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlVGFzayhpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn1cbi8qKlxuICogU2NoZWR1bGVzIGFuIGFuaW1hdGlvbiB0YXNrIHdpdGggYHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIGlmIGl0IGV4aXN0cywgb3Igd2l0aCBgcXVldWVUYXNrYCBvdGhlcndpc2UuXG4gKlxuICogU2luY2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lJ3MgYmVoYXZpb3IgZG9lcyBub3QgbWF0Y2ggdGhhdCBleHBlY3RlZCBmcm9tIGBxdWV1ZVRhc2tgLCBpdCBpcyBub3QgdXNlZCB0aGVyZS5cbiAqIEhvd2V2ZXIsIGF0IHRpbWVzIGl0IG1ha2VzIG1vcmUgc2Vuc2UgdG8gZGVsZWdhdGUgdG8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lOyBoZW5jZSB0aGUgZm9sbG93aW5nIG1ldGhvZC5cbiAqXG4gKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGJlIHF1ZXVlZCBhbmQgbGF0ZXIgZXhlY3V0ZWQuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBhIGBkZXN0cm95YCBtZXRob2QgdGhhdCwgd2hlbiBjYWxsZWQsIHByZXZlbnRzIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZyb20gZXhlY3V0aW5nLlxuICovXG5leHBvcnQgY29uc3QgcXVldWVBbmltYXRpb25UYXNrID0gKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRydWUpIHtcbiAgICAgICAgcmV0dXJuIHF1ZXVlVGFzaztcbiAgICB9XG4gICAgZnVuY3Rpb24gcXVldWVBbmltYXRpb25UYXNrKGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICAgICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCByYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShleGVjdXRlVGFzay5iaW5kKG51bGwsIGl0ZW0pKTtcbiAgICAgICAgcmV0dXJuIGdldFF1ZXVlSGFuZGxlKGl0ZW0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFRPRE86IFVzZSBhc3BlY3QuYmVmb3JlIHdoZW4gaXQgaXMgYXZhaWxhYmxlLlxuICAgIHJldHVybiB0cnVlXG4gICAgICAgID8gcXVldWVBbmltYXRpb25UYXNrXG4gICAgICAgIDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjaGVja01pY3JvVGFza1F1ZXVlKCk7XG4gICAgICAgICAgICByZXR1cm4gcXVldWVBbmltYXRpb25UYXNrKGNhbGxiYWNrKTtcbiAgICAgICAgfTtcbn0pKCk7XG4vKipcbiAqIFNjaGVkdWxlcyBhIGNhbGxiYWNrIHRvIHRoZSBtaWNyb3Rhc2sgcXVldWUuXG4gKlxuICogQW55IGNhbGxiYWNrcyByZWdpc3RlcmVkIHdpdGggYHF1ZXVlTWljcm9UYXNrYCB3aWxsIGJlIGV4ZWN1dGVkIGJlZm9yZSB0aGUgbmV4dCBtYWNyb3Rhc2suIElmIG5vIG5hdGl2ZVxuICogbWVjaGFuaXNtIGZvciBzY2hlZHVsaW5nIG1hY3JvdGFza3MgaXMgZXhwb3NlZCwgdGhlbiBhbnkgY2FsbGJhY2tzIHdpbGwgYmUgZmlyZWQgYmVmb3JlIGFueSBtYWNyb3Rhc2tcbiAqIHJlZ2lzdGVyZWQgd2l0aCBgcXVldWVUYXNrYCBvciBgcXVldWVBbmltYXRpb25UYXNrYC5cbiAqXG4gKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGJlIHF1ZXVlZCBhbmQgbGF0ZXIgZXhlY3V0ZWQuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBhIGBkZXN0cm95YCBtZXRob2QgdGhhdCwgd2hlbiBjYWxsZWQsIHByZXZlbnRzIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZyb20gZXhlY3V0aW5nLlxuICovXG5leHBvcnQgbGV0IHF1ZXVlTWljcm9UYXNrID0gKGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgZW5xdWV1ZTtcbiAgICBpZiAoZmFsc2UpIHtcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICBnbG9iYWwucHJvY2Vzcy5uZXh0VGljayhleGVjdXRlVGFzay5iaW5kKG51bGwsIGl0ZW0pKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHJ1ZSkge1xuICAgICAgICBlbnF1ZXVlID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIGdsb2JhbC5Qcm9taXNlLnJlc29sdmUoaXRlbSkudGhlbihleGVjdXRlVGFzayk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKHRydWUpIHtcbiAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWUgKi9cbiAgICAgICAgY29uc3QgSG9zdE11dGF0aW9uT2JzZXJ2ZXIgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBjb25zdCBxdWV1ZSA9IFtdO1xuICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBIb3N0TXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBxdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtICYmIGl0ZW0uaXNBY3RpdmUgJiYgaXRlbS5jYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShub2RlLCB7IGF0dHJpYnV0ZXM6IHRydWUgfSk7XG4gICAgICAgIGVucXVldWUgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgcXVldWUucHVzaChpdGVtKTtcbiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCdxdWV1ZVN0YXR1cycsICcxJyk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBlbnF1ZXVlID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIGNoZWNrTWljcm9UYXNrUXVldWUoKTtcbiAgICAgICAgICAgIG1pY3JvVGFza3MucHVzaChpdGVtKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBpdGVtID0ge1xuICAgICAgICAgICAgaXNBY3RpdmU6IHRydWUsXG4gICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2tcbiAgICAgICAgfTtcbiAgICAgICAgZW5xdWV1ZShpdGVtKTtcbiAgICAgICAgcmV0dXJuIGdldFF1ZXVlSGFuZGxlKGl0ZW0pO1xuICAgIH07XG59KSgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVldWUubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vc3VwcG9ydC9xdWV1ZS5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vc3VwcG9ydC9xdWV1ZS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgYSB2YWx1ZSBwcm9wZXJ0eSBkZXNjcmlwdG9yXG4gKlxuICogQHBhcmFtIHZhbHVlICAgICAgICBUaGUgdmFsdWUgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3Igc2hvdWxkIGJlIHNldCB0b1xuICogQHBhcmFtIGVudW1lcmFibGUgICBJZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGVudW1iZXJhYmxlLCBkZWZhdWx0cyB0byBmYWxzZVxuICogQHBhcmFtIHdyaXRhYmxlICAgICBJZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIHdyaXRhYmxlLCBkZWZhdWx0cyB0byB0cnVlXG4gKiBAcGFyYW0gY29uZmlndXJhYmxlIElmIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uZmlndXJhYmxlLCBkZWZhdWx0cyB0byB0cnVlXG4gKiBAcmV0dXJuICAgICAgICAgICAgIFRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVEZXNjcmlwdG9yKHZhbHVlLCBlbnVtZXJhYmxlID0gZmFsc2UsIHdyaXRhYmxlID0gdHJ1ZSwgY29uZmlndXJhYmxlID0gdHJ1ZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogZW51bWVyYWJsZSxcbiAgICAgICAgd3JpdGFibGU6IHdyaXRhYmxlLFxuICAgICAgICBjb25maWd1cmFibGU6IGNvbmZpZ3VyYWJsZVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gd3JhcE5hdGl2ZShuYXRpdmVGdW5jdGlvbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCAuLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuYXRpdmVGdW5jdGlvbi5hcHBseSh0YXJnZXQsIGFyZ3MpO1xuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlsLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL3N1cHBvcnQvdXRpbC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vc3VwcG9ydC91dGlsLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgeyBFdmVudGVkIH0gZnJvbSAnQGRvam8vY29yZS9FdmVudGVkJztcbmV4cG9ydCBjbGFzcyBJbmplY3RvciBleHRlbmRzIEV2ZW50ZWQge1xuICAgIGNvbnN0cnVjdG9yKHBheWxvYWQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fcGF5bG9hZCA9IHBheWxvYWQ7XG4gICAgfVxuICAgIHNldEludmFsaWRhdG9yKGludmFsaWRhdG9yKSB7XG4gICAgICAgIHRoaXMuX2ludmFsaWRhdG9yID0gaW52YWxpZGF0b3I7XG4gICAgfVxuICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BheWxvYWQ7XG4gICAgfVxuICAgIHNldChwYXlsb2FkKSB7XG4gICAgICAgIHRoaXMuX3BheWxvYWQgPSBwYXlsb2FkO1xuICAgICAgICBpZiAodGhpcy5faW52YWxpZGF0b3IpIHtcbiAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdG9yKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBJbmplY3Rvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUluamVjdG9yLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9JbmplY3Rvci5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL0luamVjdG9yLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgeyBFdmVudGVkIH0gZnJvbSAnQGRvam8vY29yZS9FdmVudGVkJztcbmltcG9ydCBNYXAgZnJvbSAnQGRvam8vc2hpbS9NYXAnO1xuLyoqXG4gKiBFbnVtIHRvIGlkZW50aWZ5IHRoZSB0eXBlIG9mIGV2ZW50LlxuICogTGlzdGVuaW5nIHRvICdQcm9qZWN0b3InIHdpbGwgbm90aWZ5IHdoZW4gcHJvamVjdG9yIGlzIGNyZWF0ZWQgb3IgdXBkYXRlZFxuICogTGlzdGVuaW5nIHRvICdXaWRnZXQnIHdpbGwgbm90aWZ5IHdoZW4gd2lkZ2V0IHJvb3QgaXMgY3JlYXRlZCBvciB1cGRhdGVkXG4gKi9cbmV4cG9ydCB2YXIgTm9kZUV2ZW50VHlwZTtcbihmdW5jdGlvbiAoTm9kZUV2ZW50VHlwZSkge1xuICAgIE5vZGVFdmVudFR5cGVbXCJQcm9qZWN0b3JcIl0gPSBcIlByb2plY3RvclwiO1xuICAgIE5vZGVFdmVudFR5cGVbXCJXaWRnZXRcIl0gPSBcIldpZGdldFwiO1xufSkoTm9kZUV2ZW50VHlwZSB8fCAoTm9kZUV2ZW50VHlwZSA9IHt9KSk7XG5leHBvcnQgY2xhc3MgTm9kZUhhbmRsZXIgZXh0ZW5kcyBFdmVudGVkIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5fbm9kZU1hcCA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgZ2V0KGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbm9kZU1hcC5nZXQoa2V5KTtcbiAgICB9XG4gICAgaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbm9kZU1hcC5oYXMoa2V5KTtcbiAgICB9XG4gICAgYWRkKGVsZW1lbnQsIGtleSkge1xuICAgICAgICB0aGlzLl9ub2RlTWFwLnNldChrZXksIGVsZW1lbnQpO1xuICAgICAgICB0aGlzLmVtaXQoeyB0eXBlOiBrZXkgfSk7XG4gICAgfVxuICAgIGFkZFJvb3QoKSB7XG4gICAgICAgIHRoaXMuZW1pdCh7IHR5cGU6IE5vZGVFdmVudFR5cGUuV2lkZ2V0IH0pO1xuICAgIH1cbiAgICBhZGRQcm9qZWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZW1pdCh7IHR5cGU6IE5vZGVFdmVudFR5cGUuUHJvamVjdG9yIH0pO1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5fbm9kZU1hcC5jbGVhcigpO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IE5vZGVIYW5kbGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9kZUhhbmRsZXIubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL05vZGVIYW5kbGVyLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvTm9kZUhhbmRsZXIubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCBQcm9taXNlIGZyb20gJ0Bkb2pvL3NoaW0vUHJvbWlzZSc7XG5pbXBvcnQgTWFwIGZyb20gJ0Bkb2pvL3NoaW0vTWFwJztcbmltcG9ydCBTeW1ib2wgZnJvbSAnQGRvam8vc2hpbS9TeW1ib2wnO1xuaW1wb3J0IHsgRXZlbnRlZCB9IGZyb20gJ0Bkb2pvL2NvcmUvRXZlbnRlZCc7XG4vKipcbiAqIFdpZGdldCBiYXNlIHN5bWJvbCB0eXBlXG4gKi9cbmV4cG9ydCBjb25zdCBXSURHRVRfQkFTRV9UWVBFID0gU3ltYm9sKCdXaWRnZXQgQmFzZScpO1xuLyoqXG4gKiBDaGVja3MgaXMgdGhlIGl0ZW0gaXMgYSBzdWJjbGFzcyBvZiBXaWRnZXRCYXNlIChvciBhIFdpZGdldEJhc2UpXG4gKlxuICogQHBhcmFtIGl0ZW0gdGhlIGl0ZW0gdG8gY2hlY2tcbiAqIEByZXR1cm5zIHRydWUvZmFsc2UgaW5kaWNhdGluZyBpZiB0aGUgaXRlbSBpcyBhIFdpZGdldEJhc2VDb25zdHJ1Y3RvclxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IoaXRlbSkge1xuICAgIHJldHVybiBCb29sZWFuKGl0ZW0gJiYgaXRlbS5fdHlwZSA9PT0gV0lER0VUX0JBU0VfVFlQRSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNXaWRnZXRDb25zdHJ1Y3RvckRlZmF1bHRFeHBvcnQoaXRlbSkge1xuICAgIHJldHVybiBCb29sZWFuKGl0ZW0gJiZcbiAgICAgICAgaXRlbS5oYXNPd25Qcm9wZXJ0eSgnX19lc01vZHVsZScpICYmXG4gICAgICAgIGl0ZW0uaGFzT3duUHJvcGVydHkoJ2RlZmF1bHQnKSAmJlxuICAgICAgICBpc1dpZGdldEJhc2VDb25zdHJ1Y3RvcihpdGVtLmRlZmF1bHQpKTtcbn1cbi8qKlxuICogVGhlIFJlZ2lzdHJ5IGltcGxlbWVudGF0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWdpc3RyeSBleHRlbmRzIEV2ZW50ZWQge1xuICAgIC8qKlxuICAgICAqIEVtaXQgbG9hZGVkIGV2ZW50IGZvciByZWdpc3RyeSBsYWJlbFxuICAgICAqL1xuICAgIGVtaXRMb2FkZWRFdmVudCh3aWRnZXRMYWJlbCwgaXRlbSkge1xuICAgICAgICB0aGlzLmVtaXQoe1xuICAgICAgICAgICAgdHlwZTogd2lkZ2V0TGFiZWwsXG4gICAgICAgICAgICBhY3Rpb246ICdsb2FkZWQnLFxuICAgICAgICAgICAgaXRlbVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZGVmaW5lKGxhYmVsLCBpdGVtKSB7XG4gICAgICAgIGlmICh0aGlzLl93aWRnZXRSZWdpc3RyeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl93aWRnZXRSZWdpc3RyeSA9IG5ldyBNYXAoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fd2lkZ2V0UmVnaXN0cnkuaGFzKGxhYmVsKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB3aWRnZXQgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIGZvciAnJHtsYWJlbC50b1N0cmluZygpfSdgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93aWRnZXRSZWdpc3RyeS5zZXQobGFiZWwsIGl0ZW0pO1xuICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIGl0ZW0udGhlbigod2lkZ2V0Q3RvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dpZGdldFJlZ2lzdHJ5LnNldChsYWJlbCwgd2lkZ2V0Q3Rvcik7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0TG9hZGVkRXZlbnQobGFiZWwsIHdpZGdldEN0b3IpO1xuICAgICAgICAgICAgICAgIHJldHVybiB3aWRnZXRDdG9yO1xuICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1dpZGdldEJhc2VDb25zdHJ1Y3RvcihpdGVtKSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0TG9hZGVkRXZlbnQobGFiZWwsIGl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlZmluZUluamVjdG9yKGxhYmVsLCBpbmplY3RvckZhY3RvcnkpIHtcbiAgICAgICAgaWYgKHRoaXMuX2luamVjdG9yUmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5faW5qZWN0b3JSZWdpc3RyeSA9IG5ldyBNYXAoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faW5qZWN0b3JSZWdpc3RyeS5oYXMobGFiZWwpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGluamVjdG9yIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBmb3IgJyR7bGFiZWwudG9TdHJpbmcoKX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW52YWxpZGF0b3IgPSBuZXcgRXZlbnRlZCgpO1xuICAgICAgICBjb25zdCBpbmplY3Rvckl0ZW0gPSB7XG4gICAgICAgICAgICBpbmplY3RvcjogaW5qZWN0b3JGYWN0b3J5KCgpID0+IGludmFsaWRhdG9yLmVtaXQoeyB0eXBlOiAnaW52YWxpZGF0ZScgfSkpLFxuICAgICAgICAgICAgaW52YWxpZGF0b3JcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5faW5qZWN0b3JSZWdpc3RyeS5zZXQobGFiZWwsIGluamVjdG9ySXRlbSk7XG4gICAgICAgIHRoaXMuZW1pdExvYWRlZEV2ZW50KGxhYmVsLCBpbmplY3Rvckl0ZW0pO1xuICAgIH1cbiAgICBnZXQobGFiZWwpIHtcbiAgICAgICAgaWYgKCF0aGlzLl93aWRnZXRSZWdpc3RyeSB8fCAhdGhpcy5oYXMobGFiZWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fd2lkZ2V0UmVnaXN0cnkuZ2V0KGxhYmVsKTtcbiAgICAgICAgaWYgKGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yKGl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBpdGVtKCk7XG4gICAgICAgIHRoaXMuX3dpZGdldFJlZ2lzdHJ5LnNldChsYWJlbCwgcHJvbWlzZSk7XG4gICAgICAgIHByb21pc2UudGhlbigod2lkZ2V0Q3RvcikgPT4ge1xuICAgICAgICAgICAgaWYgKGlzV2lkZ2V0Q29uc3RydWN0b3JEZWZhdWx0RXhwb3J0KHdpZGdldEN0b3IpKSB7XG4gICAgICAgICAgICAgICAgd2lkZ2V0Q3RvciA9IHdpZGdldEN0b3IuZGVmYXVsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3dpZGdldFJlZ2lzdHJ5LnNldChsYWJlbCwgd2lkZ2V0Q3Rvcik7XG4gICAgICAgICAgICB0aGlzLmVtaXRMb2FkZWRFdmVudChsYWJlbCwgd2lkZ2V0Q3Rvcik7XG4gICAgICAgICAgICByZXR1cm4gd2lkZ2V0Q3RvcjtcbiAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBnZXRJbmplY3RvcihsYWJlbCkge1xuICAgICAgICBpZiAoIXRoaXMuX2luamVjdG9yUmVnaXN0cnkgfHwgIXRoaXMuaGFzSW5qZWN0b3IobGFiZWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faW5qZWN0b3JSZWdpc3RyeS5nZXQobGFiZWwpO1xuICAgIH1cbiAgICBoYXMobGFiZWwpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5fd2lkZ2V0UmVnaXN0cnkgJiYgdGhpcy5fd2lkZ2V0UmVnaXN0cnkuaGFzKGxhYmVsKSk7XG4gICAgfVxuICAgIGhhc0luamVjdG9yKGxhYmVsKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuX2luamVjdG9yUmVnaXN0cnkgJiYgdGhpcy5faW5qZWN0b3JSZWdpc3RyeS5oYXMobGFiZWwpKTtcbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBSZWdpc3RyeTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlZ2lzdHJ5Lm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9SZWdpc3RyeS5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL1JlZ2lzdHJ5Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgeyBNYXAgfSBmcm9tICdAZG9qby9zaGltL01hcCc7XG5pbXBvcnQgeyBFdmVudGVkIH0gZnJvbSAnQGRvam8vY29yZS9FdmVudGVkJztcbmltcG9ydCB7IFJlZ2lzdHJ5IH0gZnJvbSAnLi9SZWdpc3RyeSc7XG5leHBvcnQgY2xhc3MgUmVnaXN0cnlIYW5kbGVyIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX3JlZ2lzdHJ5ID0gbmV3IFJlZ2lzdHJ5KCk7XG4gICAgICAgIHRoaXMuX3JlZ2lzdHJ5V2lkZ2V0TGFiZWxNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX3JlZ2lzdHJ5SW5qZWN0b3JMYWJlbE1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5vd24odGhpcy5fcmVnaXN0cnkpO1xuICAgICAgICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuYmFzZVJlZ2lzdHJ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnlXaWRnZXRMYWJlbE1hcC5kZWxldGUodGhpcy5iYXNlUmVnaXN0cnkpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5SW5qZWN0b3JMYWJlbE1hcC5kZWxldGUodGhpcy5iYXNlUmVnaXN0cnkpO1xuICAgICAgICAgICAgICAgIHRoaXMuYmFzZVJlZ2lzdHJ5ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm93bih7IGRlc3Ryb3kgfSk7XG4gICAgfVxuICAgIHNldCBiYXNlKGJhc2VSZWdpc3RyeSkge1xuICAgICAgICBpZiAodGhpcy5iYXNlUmVnaXN0cnkpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5V2lkZ2V0TGFiZWxNYXAuZGVsZXRlKHRoaXMuYmFzZVJlZ2lzdHJ5KTtcbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5SW5qZWN0b3JMYWJlbE1hcC5kZWxldGUodGhpcy5iYXNlUmVnaXN0cnkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmFzZVJlZ2lzdHJ5ID0gYmFzZVJlZ2lzdHJ5O1xuICAgIH1cbiAgICBkZWZpbmUobGFiZWwsIHdpZGdldCkge1xuICAgICAgICB0aGlzLl9yZWdpc3RyeS5kZWZpbmUobGFiZWwsIHdpZGdldCk7XG4gICAgfVxuICAgIGRlZmluZUluamVjdG9yKGxhYmVsLCBpbmplY3Rvcikge1xuICAgICAgICB0aGlzLl9yZWdpc3RyeS5kZWZpbmVJbmplY3RvcihsYWJlbCwgaW5qZWN0b3IpO1xuICAgIH1cbiAgICBoYXMobGFiZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZ2lzdHJ5LmhhcyhsYWJlbCkgfHwgQm9vbGVhbih0aGlzLmJhc2VSZWdpc3RyeSAmJiB0aGlzLmJhc2VSZWdpc3RyeS5oYXMobGFiZWwpKTtcbiAgICB9XG4gICAgaGFzSW5qZWN0b3IobGFiZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZ2lzdHJ5Lmhhc0luamVjdG9yKGxhYmVsKSB8fCBCb29sZWFuKHRoaXMuYmFzZVJlZ2lzdHJ5ICYmIHRoaXMuYmFzZVJlZ2lzdHJ5Lmhhc0luamVjdG9yKGxhYmVsKSk7XG4gICAgfVxuICAgIGdldChsYWJlbCwgZ2xvYmFsUHJlY2VkZW5jZSA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXQobGFiZWwsIGdsb2JhbFByZWNlZGVuY2UsICdnZXQnLCB0aGlzLl9yZWdpc3RyeVdpZGdldExhYmVsTWFwKTtcbiAgICB9XG4gICAgZ2V0SW5qZWN0b3IobGFiZWwsIGdsb2JhbFByZWNlZGVuY2UgPSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0KGxhYmVsLCBnbG9iYWxQcmVjZWRlbmNlLCAnZ2V0SW5qZWN0b3InLCB0aGlzLl9yZWdpc3RyeUluamVjdG9yTGFiZWxNYXApO1xuICAgIH1cbiAgICBfZ2V0KGxhYmVsLCBnbG9iYWxQcmVjZWRlbmNlLCBnZXRGdW5jdGlvbk5hbWUsIGxhYmVsTWFwKSB7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJpZXMgPSBnbG9iYWxQcmVjZWRlbmNlID8gW3RoaXMuYmFzZVJlZ2lzdHJ5LCB0aGlzLl9yZWdpc3RyeV0gOiBbdGhpcy5fcmVnaXN0cnksIHRoaXMuYmFzZVJlZ2lzdHJ5XTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWdpc3RyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByZWdpc3RyeSA9IHJlZ2lzdHJpZXNbaV07XG4gICAgICAgICAgICBpZiAoIXJlZ2lzdHJ5KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gcmVnaXN0cnlbZ2V0RnVuY3Rpb25OYW1lXShsYWJlbCk7XG4gICAgICAgICAgICBjb25zdCByZWdpc3RlcmVkTGFiZWxzID0gbGFiZWxNYXAuZ2V0KHJlZ2lzdHJ5KSB8fCBbXTtcbiAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZWdpc3RlcmVkTGFiZWxzLmluZGV4T2YobGFiZWwpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHJlZ2lzdHJ5Lm9uKGxhYmVsLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmFjdGlvbiA9PT0gJ2xvYWRlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbZ2V0RnVuY3Rpb25OYW1lXShsYWJlbCwgZ2xvYmFsUHJlY2VkZW5jZSkgPT09IGV2ZW50Lml0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCh7IHR5cGU6ICdpbnZhbGlkYXRlJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMub3duKGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgbGFiZWxNYXAuc2V0KHJlZ2lzdHJ5LCBbLi4ucmVnaXN0ZXJlZExhYmVscywgbGFiZWxdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBSZWdpc3RyeUhhbmRsZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWdpc3RyeUhhbmRsZXIubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL1JlZ2lzdHJ5SGFuZGxlci5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL1JlZ2lzdHJ5SGFuZGxlci5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IE1hcCBmcm9tICdAZG9qby9zaGltL01hcCc7XG5pbXBvcnQgV2Vha01hcCBmcm9tICdAZG9qby9zaGltL1dlYWtNYXAnO1xuaW1wb3J0IFN5bWJvbCBmcm9tICdAZG9qby9zaGltL1N5bWJvbCc7XG5pbXBvcnQgeyB2IH0gZnJvbSAnLi9kJztcbmltcG9ydCB7IGF1dG8gfSBmcm9tICcuL2RpZmYnO1xuaW1wb3J0IFJlZ2lzdHJ5SGFuZGxlciBmcm9tICcuL1JlZ2lzdHJ5SGFuZGxlcic7XG5pbXBvcnQgTm9kZUhhbmRsZXIgZnJvbSAnLi9Ob2RlSGFuZGxlcic7XG5pbXBvcnQgeyB3aWRnZXRJbnN0YW5jZU1hcCB9IGZyb20gJy4vdmRvbSc7XG5pbXBvcnQgeyBpc1dpZGdldEJhc2VDb25zdHJ1Y3RvciwgV0lER0VUX0JBU0VfVFlQRSB9IGZyb20gJy4vUmVnaXN0cnknO1xuY29uc3QgZGVjb3JhdG9yTWFwID0gbmV3IE1hcCgpO1xuY29uc3QgYm91bmRBdXRvID0gYXV0by5iaW5kKG51bGwpO1xuZXhwb3J0IGNvbnN0IG5vQmluZCA9IFN5bWJvbC5mb3IoJ2Rvam9Ob0JpbmQnKTtcbi8qKlxuICogTWFpbiB3aWRnZXQgYmFzZSBmb3IgYWxsIHdpZGdldHMgdG8gZXh0ZW5kXG4gKi9cbmV4cG9ydCBjbGFzcyBXaWRnZXRCYXNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiBpdCBpcyB0aGUgaW5pdGlhbCBzZXQgcHJvcGVydGllcyBjeWNsZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5faW5pdGlhbFByb3BlcnRpZXMgPSB0cnVlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQXJyYXkgb2YgcHJvcGVydHkga2V5cyBjb25zaWRlcmVkIGNoYW5nZWQgZnJvbSB0aGUgcHJldmlvdXMgc2V0IHByb3BlcnRpZXNcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2NoYW5nZWRQcm9wZXJ0eUtleXMgPSBbXTtcbiAgICAgICAgdGhpcy5fbm9kZUhhbmRsZXIgPSBuZXcgTm9kZUhhbmRsZXIoKTtcbiAgICAgICAgdGhpcy5faGFuZGxlcyA9IFtdO1xuICAgICAgICB0aGlzLl9jaGlsZHJlbiA9IFtdO1xuICAgICAgICB0aGlzLl9kZWNvcmF0b3JDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHt9O1xuICAgICAgICB0aGlzLl9ib3VuZFJlbmRlckZ1bmMgPSB0aGlzLnJlbmRlci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLl9ib3VuZEludmFsaWRhdGUgPSB0aGlzLmludmFsaWRhdGUuYmluZCh0aGlzKTtcbiAgICAgICAgd2lkZ2V0SW5zdGFuY2VNYXAuc2V0KHRoaXMsIHtcbiAgICAgICAgICAgIGRpcnR5OiB0cnVlLFxuICAgICAgICAgICAgb25BdHRhY2g6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQXR0YWNoKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25EZXRhY2g6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRGV0YWNoKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbm9kZUhhbmRsZXI6IHRoaXMuX25vZGVIYW5kbGVyLFxuICAgICAgICAgICAgcmVnaXN0cnk6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RyeTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3JlUHJvcGVydGllczoge30sXG4gICAgICAgICAgICByZW5kZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgaW5wdXRQcm9wZXJ0aWVzOiB7fVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fcnVuQWZ0ZXJDb25zdHJ1Y3RvcnMoKTtcbiAgICB9XG4gICAgbWV0YShNZXRhVHlwZSkge1xuICAgICAgICBpZiAodGhpcy5fbWV0YU1hcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9tZXRhTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjYWNoZWQgPSB0aGlzLl9tZXRhTWFwLmdldChNZXRhVHlwZSk7XG4gICAgICAgIGlmICghY2FjaGVkKSB7XG4gICAgICAgICAgICBjYWNoZWQgPSBuZXcgTWV0YVR5cGUoe1xuICAgICAgICAgICAgICAgIGludmFsaWRhdGU6IHRoaXMuX2JvdW5kSW52YWxpZGF0ZSxcbiAgICAgICAgICAgICAgICBub2RlSGFuZGxlcjogdGhpcy5fbm9kZUhhbmRsZXIsXG4gICAgICAgICAgICAgICAgYmluZDogdGhpc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLm93bihjYWNoZWQpO1xuICAgICAgICAgICAgdGhpcy5fbWV0YU1hcC5zZXQoTWV0YVR5cGUsIGNhY2hlZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG4gICAgb25BdHRhY2goKSB7XG4gICAgICAgIC8vIERvIG5vdGhpbmcgYnkgZGVmYXVsdC5cbiAgICB9XG4gICAgb25EZXRhY2goKSB7XG4gICAgICAgIC8vIERvIG5vdGhpbmcgYnkgZGVmYXVsdC5cbiAgICB9XG4gICAgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9wZXJ0aWVzO1xuICAgIH1cbiAgICBnZXQgY2hhbmdlZFByb3BlcnR5S2V5cygpIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLl9jaGFuZ2VkUHJvcGVydHlLZXlzXTtcbiAgICB9XG4gICAgX19zZXRDb3JlUHJvcGVydGllc19fKGNvcmVQcm9wZXJ0aWVzKSB7XG4gICAgICAgIGNvbnN0IHsgYmFzZVJlZ2lzdHJ5IH0gPSBjb3JlUHJvcGVydGllcztcbiAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHRoaXMpO1xuICAgICAgICBpZiAoaW5zdGFuY2VEYXRhLmNvcmVQcm9wZXJ0aWVzLmJhc2VSZWdpc3RyeSAhPT0gYmFzZVJlZ2lzdHJ5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5ID0gbmV3IFJlZ2lzdHJ5SGFuZGxlcigpO1xuICAgICAgICAgICAgICAgIHRoaXMub3duKHRoaXMuX3JlZ2lzdHJ5KTtcbiAgICAgICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeS5vbignaW52YWxpZGF0ZScsIHRoaXMuX2JvdW5kSW52YWxpZGF0ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnkuYmFzZSA9IGJhc2VSZWdpc3RyeTtcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcyA9IGNvcmVQcm9wZXJ0aWVzO1xuICAgIH1cbiAgICBfX3NldFByb3BlcnRpZXNfXyhvcmlnaW5hbFByb3BlcnRpZXMpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHRoaXMpO1xuICAgICAgICBpbnN0YW5jZURhdGEuaW5wdXRQcm9wZXJ0aWVzID0gb3JpZ2luYWxQcm9wZXJ0aWVzO1xuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gdGhpcy5fcnVuQmVmb3JlUHJvcGVydGllcyhvcmlnaW5hbFByb3BlcnRpZXMpO1xuICAgICAgICBjb25zdCByZWdpc3RlcmVkRGlmZlByb3BlcnR5TmFtZXMgPSB0aGlzLmdldERlY29yYXRvcigncmVnaXN0ZXJlZERpZmZQcm9wZXJ0eScpO1xuICAgICAgICBjb25zdCBjaGFuZ2VkUHJvcGVydHlLZXlzID0gW107XG4gICAgICAgIGNvbnN0IHByb3BlcnR5TmFtZXMgPSBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKTtcbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxQcm9wZXJ0aWVzID09PSBmYWxzZSB8fCByZWdpc3RlcmVkRGlmZlByb3BlcnR5TmFtZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBhbGxQcm9wZXJ0aWVzID0gWy4uLnByb3BlcnR5TmFtZXMsIC4uLk9iamVjdC5rZXlzKHRoaXMuX3Byb3BlcnRpZXMpXTtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrZWRQcm9wZXJ0aWVzID0gW107XG4gICAgICAgICAgICBjb25zdCBkaWZmUHJvcGVydHlSZXN1bHRzID0ge307XG4gICAgICAgICAgICBsZXQgcnVuUmVhY3Rpb25zID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBhbGxQcm9wZXJ0aWVzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChjaGVja2VkUHJvcGVydGllcy5pbmRleE9mKHByb3BlcnR5TmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaGVja2VkUHJvcGVydGllcy5wdXNoKHByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNQcm9wZXJ0eSA9IHRoaXMuX3Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdQcm9wZXJ0eSA9IHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5KHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSwgaW5zdGFuY2VEYXRhLmNvcmVQcm9wZXJ0aWVzLmJpbmQpO1xuICAgICAgICAgICAgICAgIGlmIChyZWdpc3RlcmVkRGlmZlByb3BlcnR5TmFtZXMuaW5kZXhPZihwcm9wZXJ0eU5hbWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBydW5SZWFjdGlvbnMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmRnVuY3Rpb25zID0gdGhpcy5nZXREZWNvcmF0b3IoYGRpZmZQcm9wZXJ0eToke3Byb3BlcnR5TmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaWZmRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkaWZmRnVuY3Rpb25zW2ldKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuY2hhbmdlZCAmJiBjaGFuZ2VkUHJvcGVydHlLZXlzLmluZGV4T2YocHJvcGVydHlOYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkUHJvcGVydHlLZXlzLnB1c2gocHJvcGVydHlOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZQcm9wZXJ0eVJlc3VsdHNbcHJvcGVydHlOYW1lXSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYm91bmRBdXRvKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5jaGFuZ2VkICYmIGNoYW5nZWRQcm9wZXJ0eUtleXMuaW5kZXhPZihwcm9wZXJ0eU5hbWUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFByb3BlcnR5S2V5cy5wdXNoKHByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZSBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaWZmUHJvcGVydHlSZXN1bHRzW3Byb3BlcnR5TmFtZV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVuUmVhY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwRGlmZlByb3BlcnR5UmVhY3Rpb25zKHByb3BlcnRpZXMsIGNoYW5nZWRQcm9wZXJ0eUtleXMpLmZvckVhY2goKGFyZ3MsIHJlYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWN0aW9uLmNhbGwodGhpcywgYXJncy5wcmV2aW91c1Byb3BlcnRpZXMsIGFyZ3MubmV3UHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBkaWZmUHJvcGVydHlSZXN1bHRzO1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlZFByb3BlcnR5S2V5cyA9IGNoYW5nZWRQcm9wZXJ0eUtleXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsUHJvcGVydGllcyA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eShwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0sIGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcy5iaW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWRQcm9wZXJ0eUtleXMucHVzaChwcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZWRQcm9wZXJ0eUtleXMgPSBjaGFuZ2VkUHJvcGVydHlLZXlzO1xuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oe30sIHByb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaGFuZ2VkUHJvcGVydHlLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBjaGlsZHJlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuO1xuICAgIH1cbiAgICBfX3NldENoaWxkcmVuX18oY2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX2NoaWxkcmVuLmxlbmd0aCA+IDAgfHwgY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9fcmVuZGVyX18oKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldCh0aGlzKTtcbiAgICAgICAgaW5zdGFuY2VEYXRhLmRpcnR5ID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlbmRlciA9IHRoaXMuX3J1bkJlZm9yZVJlbmRlcnMoKTtcbiAgICAgICAgbGV0IGROb2RlID0gcmVuZGVyKCk7XG4gICAgICAgIGROb2RlID0gdGhpcy5ydW5BZnRlclJlbmRlcnMoZE5vZGUpO1xuICAgICAgICB0aGlzLl9ub2RlSGFuZGxlci5jbGVhcigpO1xuICAgICAgICByZXR1cm4gZE5vZGU7XG4gICAgfVxuICAgIGludmFsaWRhdGUoKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldCh0aGlzKTtcbiAgICAgICAgaWYgKGluc3RhbmNlRGF0YS5pbnZhbGlkYXRlKSB7XG4gICAgICAgICAgICBpbnN0YW5jZURhdGEuaW52YWxpZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIHYoJ2RpdicsIHt9LCB0aGlzLmNoaWxkcmVuKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdG8gYWRkIGRlY29yYXRvcnMgdG8gV2lkZ2V0QmFzZVxuICAgICAqXG4gICAgICogQHBhcmFtIGRlY29yYXRvcktleSBUaGUga2V5IG9mIHRoZSBkZWNvcmF0b3JcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBkZWNvcmF0b3JcbiAgICAgKi9cbiAgICBhZGREZWNvcmF0b3IoZGVjb3JhdG9yS2V5LCB2YWx1ZSkge1xuICAgICAgICB2YWx1ZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eSgnY29uc3RydWN0b3InKSkge1xuICAgICAgICAgICAgbGV0IGRlY29yYXRvckxpc3QgPSBkZWNvcmF0b3JNYXAuZ2V0KHRoaXMuY29uc3RydWN0b3IpO1xuICAgICAgICAgICAgaWYgKCFkZWNvcmF0b3JMaXN0KSB7XG4gICAgICAgICAgICAgICAgZGVjb3JhdG9yTGlzdCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgICAgICBkZWNvcmF0b3JNYXAuc2V0KHRoaXMuY29uc3RydWN0b3IsIGRlY29yYXRvckxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHNwZWNpZmljRGVjb3JhdG9yTGlzdCA9IGRlY29yYXRvckxpc3QuZ2V0KGRlY29yYXRvcktleSk7XG4gICAgICAgICAgICBpZiAoIXNwZWNpZmljRGVjb3JhdG9yTGlzdCkge1xuICAgICAgICAgICAgICAgIHNwZWNpZmljRGVjb3JhdG9yTGlzdCA9IFtdO1xuICAgICAgICAgICAgICAgIGRlY29yYXRvckxpc3Quc2V0KGRlY29yYXRvcktleSwgc3BlY2lmaWNEZWNvcmF0b3JMaXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNwZWNpZmljRGVjb3JhdG9yTGlzdC5wdXNoKC4uLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSB0aGlzLmdldERlY29yYXRvcihkZWNvcmF0b3JLZXkpO1xuICAgICAgICAgICAgdGhpcy5fZGVjb3JhdG9yQ2FjaGUuc2V0KGRlY29yYXRvcktleSwgWy4uLmRlY29yYXRvcnMsIC4uLnZhbHVlXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdG8gYnVpbGQgdGhlIGxpc3Qgb2YgZGVjb3JhdG9ycyBmcm9tIHRoZSBnbG9iYWwgZGVjb3JhdG9yIG1hcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkZWNvcmF0b3JLZXkgIFRoZSBrZXkgb2YgdGhlIGRlY29yYXRvclxuICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgZGVjb3JhdG9yIHZhbHVlc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2J1aWxkRGVjb3JhdG9yTGlzdChkZWNvcmF0b3JLZXkpIHtcbiAgICAgICAgY29uc3QgYWxsRGVjb3JhdG9ycyA9IFtdO1xuICAgICAgICBsZXQgY29uc3RydWN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yO1xuICAgICAgICB3aGlsZSAoY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlTWFwID0gZGVjb3JhdG9yTWFwLmdldChjb25zdHJ1Y3Rvcik7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VNYXApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWNvcmF0b3JzID0gaW5zdGFuY2VNYXAuZ2V0KGRlY29yYXRvcktleSk7XG4gICAgICAgICAgICAgICAgaWYgKGRlY29yYXRvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsRGVjb3JhdG9ycy51bnNoaWZ0KC4uLmRlY29yYXRvcnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0cnVjdG9yID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNvbnN0cnVjdG9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsRGVjb3JhdG9ycztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdG8gcmV0cmlldmUgZGVjb3JhdG9yIHZhbHVlc1xuICAgICAqXG4gICAgICogQHBhcmFtIGRlY29yYXRvcktleSBUaGUga2V5IG9mIHRoZSBkZWNvcmF0b3JcbiAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBkZWNvcmF0b3IgdmFsdWVzXG4gICAgICovXG4gICAgZ2V0RGVjb3JhdG9yKGRlY29yYXRvcktleSkge1xuICAgICAgICBsZXQgYWxsRGVjb3JhdG9ycyA9IHRoaXMuX2RlY29yYXRvckNhY2hlLmdldChkZWNvcmF0b3JLZXkpO1xuICAgICAgICBpZiAoYWxsRGVjb3JhdG9ycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYWxsRGVjb3JhdG9ycztcbiAgICAgICAgfVxuICAgICAgICBhbGxEZWNvcmF0b3JzID0gdGhpcy5fYnVpbGREZWNvcmF0b3JMaXN0KGRlY29yYXRvcktleSk7XG4gICAgICAgIHRoaXMuX2RlY29yYXRvckNhY2hlLnNldChkZWNvcmF0b3JLZXksIGFsbERlY29yYXRvcnMpO1xuICAgICAgICByZXR1cm4gYWxsRGVjb3JhdG9ycztcbiAgICB9XG4gICAgX21hcERpZmZQcm9wZXJ0eVJlYWN0aW9ucyhuZXdQcm9wZXJ0aWVzLCBjaGFuZ2VkUHJvcGVydHlLZXlzKSB7XG4gICAgICAgIGNvbnN0IHJlYWN0aW9uRnVuY3Rpb25zID0gdGhpcy5nZXREZWNvcmF0b3IoJ2RpZmZSZWFjdGlvbicpO1xuICAgICAgICByZXR1cm4gcmVhY3Rpb25GdW5jdGlvbnMucmVkdWNlKChyZWFjdGlvblByb3BlcnR5TWFwLCB7IHJlYWN0aW9uLCBwcm9wZXJ0eU5hbWUgfSkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlYWN0aW9uQXJndW1lbnRzID0gcmVhY3Rpb25Qcm9wZXJ0eU1hcC5nZXQocmVhY3Rpb24pO1xuICAgICAgICAgICAgaWYgKHJlYWN0aW9uQXJndW1lbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZWFjdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNQcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgbmV3UHJvcGVydGllczoge30sXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWN0aW9uQXJndW1lbnRzLnByZXZpb3VzUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgcmVhY3Rpb25Bcmd1bWVudHMubmV3UHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gbmV3UHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0eUtleXMuaW5kZXhPZihwcm9wZXJ0eU5hbWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHJlYWN0aW9uQXJndW1lbnRzLmNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhY3Rpb25Qcm9wZXJ0eU1hcC5zZXQocmVhY3Rpb24sIHJlYWN0aW9uQXJndW1lbnRzKTtcbiAgICAgICAgICAgIHJldHVybiByZWFjdGlvblByb3BlcnR5TWFwO1xuICAgICAgICB9LCBuZXcgTWFwKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCaW5kcyB1bmJvdW5kIHByb3BlcnR5IGZ1bmN0aW9ucyB0byB0aGUgc3BlY2lmaWVkIGBiaW5kYCBwcm9wZXJ0eVxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgcHJvcGVydGllcyB0byBjaGVjayBmb3IgZnVuY3Rpb25zXG4gICAgICovXG4gICAgX2JpbmRGdW5jdGlvblByb3BlcnR5KHByb3BlcnR5LCBiaW5kKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkgPT09ICdmdW5jdGlvbicgJiYgIXByb3BlcnR5W25vQmluZF0gJiYgaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IocHJvcGVydHkpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5TWFwID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eU1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBiaW5kSW5mbyA9IHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5TWFwLmdldChwcm9wZXJ0eSkgfHwge307XG4gICAgICAgICAgICBsZXQgeyBib3VuZEZ1bmMsIHNjb3BlIH0gPSBiaW5kSW5mbztcbiAgICAgICAgICAgIGlmIChib3VuZEZ1bmMgPT09IHVuZGVmaW5lZCB8fCBzY29wZSAhPT0gYmluZCkge1xuICAgICAgICAgICAgICAgIGJvdW5kRnVuYyA9IHByb3BlcnR5LmJpbmQoYmluZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fYmluZEZ1bmN0aW9uUHJvcGVydHlNYXAuc2V0KHByb3BlcnR5LCB7IGJvdW5kRnVuYywgc2NvcGU6IGJpbmQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYm91bmRGdW5jO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eTtcbiAgICB9XG4gICAgZ2V0IHJlZ2lzdHJ5KCkge1xuICAgICAgICBpZiAodGhpcy5fcmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnlIYW5kbGVyKCk7XG4gICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeSk7XG4gICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeS5vbignaW52YWxpZGF0ZScsIHRoaXMuX2JvdW5kSW52YWxpZGF0ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWdpc3RyeTtcbiAgICB9XG4gICAgX3J1bkJlZm9yZVByb3BlcnRpZXMocHJvcGVydGllcykge1xuICAgICAgICBjb25zdCBiZWZvcmVQcm9wZXJ0aWVzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2JlZm9yZVByb3BlcnRpZXMnKTtcbiAgICAgICAgaWYgKGJlZm9yZVByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJlZm9yZVByb3BlcnRpZXMucmVkdWNlKChwcm9wZXJ0aWVzLCBiZWZvcmVQcm9wZXJ0aWVzRnVuY3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcHJvcGVydGllcywgYmVmb3JlUHJvcGVydGllc0Z1bmN0aW9uLmNhbGwodGhpcywgcHJvcGVydGllcykpO1xuICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcGVydGllcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSdW4gYWxsIHJlZ2lzdGVyZWQgYmVmb3JlIHJlbmRlcnMgYW5kIHJldHVybiB0aGUgdXBkYXRlZCByZW5kZXIgbWV0aG9kXG4gICAgICovXG4gICAgX3J1bkJlZm9yZVJlbmRlcnMoKSB7XG4gICAgICAgIGNvbnN0IGJlZm9yZVJlbmRlcnMgPSB0aGlzLmdldERlY29yYXRvcignYmVmb3JlUmVuZGVyJyk7XG4gICAgICAgIGlmIChiZWZvcmVSZW5kZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBiZWZvcmVSZW5kZXJzLnJlZHVjZSgocmVuZGVyLCBiZWZvcmVSZW5kZXJGdW5jdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRSZW5kZXIgPSBiZWZvcmVSZW5kZXJGdW5jdGlvbi5jYWxsKHRoaXMsIHJlbmRlciwgdGhpcy5fcHJvcGVydGllcywgdGhpcy5fY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIGlmICghdXBkYXRlZFJlbmRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlbmRlciBmdW5jdGlvbiBub3QgcmV0dXJuZWQgZnJvbSBiZWZvcmVSZW5kZXIsIHVzaW5nIHByZXZpb3VzIHJlbmRlcicpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlZFJlbmRlcjtcbiAgICAgICAgICAgIH0sIHRoaXMuX2JvdW5kUmVuZGVyRnVuYyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2JvdW5kUmVuZGVyRnVuYztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUnVuIGFsbCByZWdpc3RlcmVkIGFmdGVyIHJlbmRlcnMgYW5kIHJldHVybiB0aGUgZGVjb3JhdGVkIEROb2Rlc1xuICAgICAqXG4gICAgICogQHBhcmFtIGROb2RlIFRoZSBETm9kZXMgdG8gcnVuIHRocm91Z2ggdGhlIGFmdGVyIHJlbmRlcnNcbiAgICAgKi9cbiAgICBydW5BZnRlclJlbmRlcnMoZE5vZGUpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJSZW5kZXJzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2FmdGVyUmVuZGVyJyk7XG4gICAgICAgIGlmIChhZnRlclJlbmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGFmdGVyUmVuZGVycy5yZWR1Y2UoKGROb2RlLCBhZnRlclJlbmRlckZ1bmN0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFmdGVyUmVuZGVyRnVuY3Rpb24uY2FsbCh0aGlzLCBkTm9kZSk7XG4gICAgICAgICAgICB9LCBkTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX21ldGFNYXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fbWV0YU1hcC5mb3JFYWNoKChtZXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgbWV0YS5hZnRlclJlbmRlcigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGROb2RlO1xuICAgIH1cbiAgICBfcnVuQWZ0ZXJDb25zdHJ1Y3RvcnMoKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyQ29uc3RydWN0b3JzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2FmdGVyQ29uc3RydWN0b3InKTtcbiAgICAgICAgaWYgKGFmdGVyQ29uc3RydWN0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFmdGVyQ29uc3RydWN0b3JzLmZvckVhY2goKGFmdGVyQ29uc3RydWN0b3IpID0+IGFmdGVyQ29uc3RydWN0b3IuY2FsbCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb3duKGhhbmRsZSkge1xuICAgICAgICB0aGlzLl9oYW5kbGVzLnB1c2goaGFuZGxlKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuX2hhbmRsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy5faGFuZGxlcy5wb3AoKTtcbiAgICAgICAgICAgIGlmIChoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGUuZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBzdGF0aWMgaWRlbnRpZmllclxuICovXG5XaWRnZXRCYXNlLl90eXBlID0gV0lER0VUX0JBU0VfVFlQRTtcbmV4cG9ydCBkZWZhdWx0IFdpZGdldEJhc2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaWRnZXRCYXNlLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9XaWRnZXRCYXNlLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvV2lkZ2V0QmFzZS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwibGV0IGJyb3dzZXJTcGVjaWZpY1RyYW5zaXRpb25FbmRFdmVudE5hbWUgPSAnJztcbmxldCBicm93c2VyU3BlY2lmaWNBbmltYXRpb25FbmRFdmVudE5hbWUgPSAnJztcbmZ1bmN0aW9uIGRldGVybWluZUJyb3dzZXJTdHlsZU5hbWVzKGVsZW1lbnQpIHtcbiAgICBpZiAoJ1dlYmtpdFRyYW5zaXRpb24nIGluIGVsZW1lbnQuc3R5bGUpIHtcbiAgICAgICAgYnJvd3NlclNwZWNpZmljVHJhbnNpdGlvbkVuZEV2ZW50TmFtZSA9ICd3ZWJraXRUcmFuc2l0aW9uRW5kJztcbiAgICAgICAgYnJvd3NlclNwZWNpZmljQW5pbWF0aW9uRW5kRXZlbnROYW1lID0gJ3dlYmtpdEFuaW1hdGlvbkVuZCc7XG4gICAgfVxuICAgIGVsc2UgaWYgKCd0cmFuc2l0aW9uJyBpbiBlbGVtZW50LnN0eWxlIHx8ICdNb3pUcmFuc2l0aW9uJyBpbiBlbGVtZW50LnN0eWxlKSB7XG4gICAgICAgIGJyb3dzZXJTcGVjaWZpY1RyYW5zaXRpb25FbmRFdmVudE5hbWUgPSAndHJhbnNpdGlvbmVuZCc7XG4gICAgICAgIGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSA9ICdhbmltYXRpb25lbmQnO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3VyIGJyb3dzZXIgaXMgbm90IHN1cHBvcnRlZCcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGluaXRpYWxpemUoZWxlbWVudCkge1xuICAgIGlmIChicm93c2VyU3BlY2lmaWNBbmltYXRpb25FbmRFdmVudE5hbWUgPT09ICcnKSB7XG4gICAgICAgIGRldGVybWluZUJyb3dzZXJTdHlsZU5hbWVzKGVsZW1lbnQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJ1bkFuZENsZWFuVXAoZWxlbWVudCwgc3RhcnRBbmltYXRpb24sIGZpbmlzaEFuaW1hdGlvbikge1xuICAgIGluaXRpYWxpemUoZWxlbWVudCk7XG4gICAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG4gICAgbGV0IHRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghZmluaXNoZWQpIHtcbiAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihicm93c2VyU3BlY2lmaWNUcmFuc2l0aW9uRW5kRXZlbnROYW1lLCB0cmFuc2l0aW9uRW5kKTtcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihicm93c2VyU3BlY2lmaWNBbmltYXRpb25FbmRFdmVudE5hbWUsIHRyYW5zaXRpb25FbmQpO1xuICAgICAgICAgICAgZmluaXNoQW5pbWF0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHN0YXJ0QW5pbWF0aW9uKCk7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSwgdHJhbnNpdGlvbkVuZCk7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGJyb3dzZXJTcGVjaWZpY1RyYW5zaXRpb25FbmRFdmVudE5hbWUsIHRyYW5zaXRpb25FbmQpO1xufVxuZnVuY3Rpb24gZXhpdChub2RlLCBwcm9wZXJ0aWVzLCBleGl0QW5pbWF0aW9uLCByZW1vdmVOb2RlKSB7XG4gICAgY29uc3QgYWN0aXZlQ2xhc3MgPSBwcm9wZXJ0aWVzLmV4aXRBbmltYXRpb25BY3RpdmUgfHwgYCR7ZXhpdEFuaW1hdGlvbn0tYWN0aXZlYDtcbiAgICBydW5BbmRDbGVhblVwKG5vZGUsICgpID0+IHtcbiAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKGV4aXRBbmltYXRpb24pO1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKGFjdGl2ZUNsYXNzKTtcbiAgICAgICAgfSk7XG4gICAgfSwgKCkgPT4ge1xuICAgICAgICByZW1vdmVOb2RlKCk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBlbnRlcihub2RlLCBwcm9wZXJ0aWVzLCBlbnRlckFuaW1hdGlvbikge1xuICAgIGNvbnN0IGFjdGl2ZUNsYXNzID0gcHJvcGVydGllcy5lbnRlckFuaW1hdGlvbkFjdGl2ZSB8fCBgJHtlbnRlckFuaW1hdGlvbn0tYWN0aXZlYDtcbiAgICBydW5BbmRDbGVhblVwKG5vZGUsICgpID0+IHtcbiAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKGVudGVyQW5pbWF0aW9uKTtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZChhY3RpdmVDbGFzcyk7XG4gICAgICAgIH0pO1xuICAgIH0sICgpID0+IHtcbiAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKGVudGVyQW5pbWF0aW9uKTtcbiAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKGFjdGl2ZUNsYXNzKTtcbiAgICB9KTtcbn1cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBlbnRlcixcbiAgICBleGl0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3NzVHJhbnNpdGlvbnMubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2FuaW1hdGlvbnMvY3NzVHJhbnNpdGlvbnMubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9hbmltYXRpb25zL2Nzc1RyYW5zaXRpb25zLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgU3ltYm9sIGZyb20gJ0Bkb2pvL3NoaW0vU3ltYm9sJztcbi8qKlxuICogVGhlIHN5bWJvbCBpZGVudGlmaWVyIGZvciBhIFdOb2RlIHR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IFdOT0RFID0gU3ltYm9sKCdJZGVudGlmaWVyIGZvciBhIFdOb2RlLicpO1xuLyoqXG4gKiBUaGUgc3ltYm9sIGlkZW50aWZpZXIgZm9yIGEgVk5vZGUgdHlwZVxuICovXG5leHBvcnQgY29uc3QgVk5PREUgPSBTeW1ib2woJ0lkZW50aWZpZXIgZm9yIGEgVk5vZGUuJyk7XG4vKipcbiAqIFRoZSBzeW1ib2wgaWRlbnRpZmllciBmb3IgYSBWTm9kZSB0eXBlIGNyZWF0ZWQgdXNpbmcgZG9tKClcbiAqL1xuZXhwb3J0IGNvbnN0IERPTVZOT0RFID0gU3ltYm9sKCdJZGVudGlmaWVyIGZvciBhIFZOb2RlIGNyZWF0ZWQgdXNpbmcgZXhpc3RpbmcgZG9tLicpO1xuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIGBETm9kZWAgaXMgYSBgV05vZGVgIHVzaW5nIHRoZSBgdHlwZWAgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV05vZGUoY2hpbGQpIHtcbiAgICByZXR1cm4gQm9vbGVhbihjaGlsZCAmJiB0eXBlb2YgY2hpbGQgIT09ICdzdHJpbmcnICYmIGNoaWxkLnR5cGUgPT09IFdOT0RFKTtcbn1cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBgRE5vZGVgIGlzIGEgYFZOb2RlYCB1c2luZyB0aGUgYHR5cGVgIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZOb2RlKGNoaWxkKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oY2hpbGQgJiYgdHlwZW9mIGNoaWxkICE9PSAnc3RyaW5nJyAmJiAoY2hpbGQudHlwZSA9PT0gVk5PREUgfHwgY2hpbGQudHlwZSA9PT0gRE9NVk5PREUpKTtcbn1cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBgRE5vZGVgIGlzIGEgYFZOb2RlYCBjcmVhdGVkIHdpdGggYGRvbSgpYCB1c2luZyB0aGUgYHR5cGVgIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RvbVZOb2RlKGNoaWxkKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oY2hpbGQgJiYgdHlwZW9mIGNoaWxkICE9PSAnc3RyaW5nJyAmJiBjaGlsZC50eXBlID09PSBET01WTk9ERSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFbGVtZW50Tm9kZSh2YWx1ZSkge1xuICAgIHJldHVybiAhIXZhbHVlLnRhZ05hbWU7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjb3JhdGUoZE5vZGVzLCBvcHRpb25zT3JNb2RpZmllciwgcHJlZGljYXRlKSB7XG4gICAgbGV0IHNoYWxsb3cgPSBmYWxzZTtcbiAgICBsZXQgbW9kaWZpZXI7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zT3JNb2RpZmllciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBtb2RpZmllciA9IG9wdGlvbnNPck1vZGlmaWVyO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbW9kaWZpZXIgPSBvcHRpb25zT3JNb2RpZmllci5tb2RpZmllcjtcbiAgICAgICAgcHJlZGljYXRlID0gb3B0aW9uc09yTW9kaWZpZXIucHJlZGljYXRlO1xuICAgICAgICBzaGFsbG93ID0gb3B0aW9uc09yTW9kaWZpZXIuc2hhbGxvdyB8fCBmYWxzZTtcbiAgICB9XG4gICAgbGV0IG5vZGVzID0gQXJyYXkuaXNBcnJheShkTm9kZXMpID8gWy4uLmROb2Rlc10gOiBbZE5vZGVzXTtcbiAgICBmdW5jdGlvbiBicmVha2VyKCkge1xuICAgICAgICBub2RlcyA9IFtdO1xuICAgIH1cbiAgICB3aGlsZSAobm9kZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlcy5zaGlmdCgpO1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKCFzaGFsbG93ICYmIChpc1dOb2RlKG5vZGUpIHx8IGlzVk5vZGUobm9kZSkpICYmIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBub2RlcyA9IFsuLi5ub2RlcywgLi4ubm9kZS5jaGlsZHJlbl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXByZWRpY2F0ZSB8fCBwcmVkaWNhdGUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICBtb2RpZmllcihub2RlLCBicmVha2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZE5vZGVzO1xufVxuLyoqXG4gKiBXcmFwcGVyIGZ1bmN0aW9uIGZvciBjYWxscyB0byBjcmVhdGUgYSB3aWRnZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3KHdpZGdldENvbnN0cnVjdG9yLCBwcm9wZXJ0aWVzLCBjaGlsZHJlbiA9IFtdKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIHdpZGdldENvbnN0cnVjdG9yLFxuICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICB0eXBlOiBXTk9ERVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gdih0YWcsIHByb3BlcnRpZXNPckNoaWxkcmVuID0ge30sIGNoaWxkcmVuID0gdW5kZWZpbmVkKSB7XG4gICAgbGV0IHByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzT3JDaGlsZHJlbjtcbiAgICBsZXQgZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2s7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcGVydGllc09yQ2hpbGRyZW4pKSB7XG4gICAgICAgIGNoaWxkcmVuID0gcHJvcGVydGllc09yQ2hpbGRyZW47XG4gICAgICAgIHByb3BlcnRpZXMgPSB7fTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcm9wZXJ0aWVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrID0gcHJvcGVydGllcztcbiAgICAgICAgcHJvcGVydGllcyA9IHt9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB0YWcsXG4gICAgICAgIGRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrLFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgcHJvcGVydGllcyxcbiAgICAgICAgdHlwZTogVk5PREVcbiAgICB9O1xufVxuLyoqXG4gKiBDcmVhdGUgYSBWTm9kZSBmb3IgYW4gZXhpc3RpbmcgRE9NIE5vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb20oeyBub2RlLCBhdHRycyA9IHt9LCBwcm9wcyA9IHt9LCBvbiA9IHt9LCBkaWZmVHlwZSA9ICdub25lJyB9LCBjaGlsZHJlbikge1xuICAgIHJldHVybiB7XG4gICAgICAgIHRhZzogaXNFbGVtZW50Tm9kZShub2RlKSA/IG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpIDogJycsXG4gICAgICAgIHByb3BlcnRpZXM6IHByb3BzLFxuICAgICAgICBhdHRyaWJ1dGVzOiBhdHRycyxcbiAgICAgICAgZXZlbnRzOiBvbixcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIHR5cGU6IERPTVZOT0RFLFxuICAgICAgICBkb21Ob2RlOiBub2RlLFxuICAgICAgICB0ZXh0OiBpc0VsZW1lbnROb2RlKG5vZGUpID8gdW5kZWZpbmVkIDogbm9kZS5kYXRhLFxuICAgICAgICBkaWZmVHlwZVxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi9oYW5kbGVEZWNvcmF0b3InO1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyUmVuZGVyKG1ldGhvZCkge1xuICAgIHJldHVybiBoYW5kbGVEZWNvcmF0b3IoKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcignYWZ0ZXJSZW5kZXInLCBwcm9wZXJ0eUtleSA/IHRhcmdldFtwcm9wZXJ0eUtleV0gOiBtZXRob2QpO1xuICAgIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQgYWZ0ZXJSZW5kZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hZnRlclJlbmRlci5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9hZnRlclJlbmRlci5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYWZ0ZXJSZW5kZXIubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCB7IGhhbmRsZURlY29yYXRvciB9IGZyb20gJy4vaGFuZGxlRGVjb3JhdG9yJztcbmltcG9ydCB7IGJlZm9yZVByb3BlcnRpZXMgfSBmcm9tICcuL2JlZm9yZVByb3BlcnRpZXMnO1xuZXhwb3J0IGZ1bmN0aW9uIGFsd2F5c1JlbmRlcigpIHtcbiAgICByZXR1cm4gaGFuZGxlRGVjb3JhdG9yKCh0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICAgIGJlZm9yZVByb3BlcnRpZXMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgICAgIH0pKHRhcmdldCk7XG4gICAgfSk7XG59XG5leHBvcnQgZGVmYXVsdCBhbHdheXNSZW5kZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hbHdheXNSZW5kZXIubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYWx3YXlzUmVuZGVyLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9hbHdheXNSZW5kZXIubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCB7IGhhbmRsZURlY29yYXRvciB9IGZyb20gJy4vaGFuZGxlRGVjb3JhdG9yJztcbmV4cG9ydCBmdW5jdGlvbiBiZWZvcmVQcm9wZXJ0aWVzKG1ldGhvZCkge1xuICAgIHJldHVybiBoYW5kbGVEZWNvcmF0b3IoKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcignYmVmb3JlUHJvcGVydGllcycsIHByb3BlcnR5S2V5ID8gdGFyZ2V0W3Byb3BlcnR5S2V5XSA6IG1ldGhvZCk7XG4gICAgfSk7XG59XG5leHBvcnQgZGVmYXVsdCBiZWZvcmVQcm9wZXJ0aWVzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmVmb3JlUHJvcGVydGllcy5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9iZWZvcmVQcm9wZXJ0aWVzLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9iZWZvcmVQcm9wZXJ0aWVzLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgeyBDdXN0b21FbGVtZW50Q2hpbGRUeXBlIH0gZnJvbSAnLi4vcmVnaXN0ZXJDdXN0b21FbGVtZW50JztcbmltcG9ydCBSZWdpc3RyeSBmcm9tICcuLi9SZWdpc3RyeSc7XG4vKipcbiAqIFRoaXMgRGVjb3JhdG9yIGlzIHByb3ZpZGVkIHByb3BlcnRpZXMgdGhhdCBkZWZpbmUgdGhlIGJlaGF2aW9yIG9mIGEgY3VzdG9tIGVsZW1lbnQsIGFuZFxuICogcmVnaXN0ZXJzIHRoYXQgY3VzdG9tIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjdXN0b21FbGVtZW50KHsgdGFnLCBwcm9wZXJ0aWVzID0gW10sIGF0dHJpYnV0ZXMgPSBbXSwgZXZlbnRzID0gW10sIGNoaWxkVHlwZSA9IEN1c3RvbUVsZW1lbnRDaGlsZFR5cGUuRE9KTywgcmVnaXN0cnlGYWN0b3J5ID0gKCkgPT4gbmV3IFJlZ2lzdHJ5KCkgfSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5wcm90b3R5cGUuX19jdXN0b21FbGVtZW50RGVzY3JpcHRvciA9IHtcbiAgICAgICAgICAgIHRhZ05hbWU6IHRhZyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICAgICAgZXZlbnRzLFxuICAgICAgICAgICAgY2hpbGRUeXBlLFxuICAgICAgICAgICAgcmVnaXN0cnlGYWN0b3J5XG4gICAgICAgIH07XG4gICAgfTtcbn1cbmV4cG9ydCBkZWZhdWx0IGN1c3RvbUVsZW1lbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jdXN0b21FbGVtZW50Lm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2N1c3RvbUVsZW1lbnQubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2N1c3RvbUVsZW1lbnQubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCB7IGhhbmRsZURlY29yYXRvciB9IGZyb20gJy4vaGFuZGxlRGVjb3JhdG9yJztcbi8qKlxuICogRGVjb3JhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVnaXN0ZXIgYSBmdW5jdGlvbiBhcyBhIHNwZWNpZmljIHByb3BlcnR5IGRpZmZcbiAqXG4gKiBAcGFyYW0gcHJvcGVydHlOYW1lICBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb2Ygd2hpY2ggdGhlIGRpZmYgZnVuY3Rpb24gaXMgYXBwbGllZFxuICogQHBhcmFtIGRpZmZUeXBlICAgICAgVGhlIGRpZmYgdHlwZSwgZGVmYXVsdCBpcyBEaWZmVHlwZS5BVVRPLlxuICogQHBhcmFtIGRpZmZGdW5jdGlvbiAgQSBkaWZmIGZ1bmN0aW9uIHRvIHJ1biBpZiBkaWZmVHlwZSBpZiBEaWZmVHlwZS5DVVNUT01cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmZQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGRpZmZGdW5jdGlvbiwgcmVhY3Rpb25GdW5jdGlvbikge1xuICAgIHJldHVybiBoYW5kbGVEZWNvcmF0b3IoKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcihgZGlmZlByb3BlcnR5OiR7cHJvcGVydHlOYW1lfWAsIGRpZmZGdW5jdGlvbi5iaW5kKG51bGwpKTtcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcigncmVnaXN0ZXJlZERpZmZQcm9wZXJ0eScsIHByb3BlcnR5TmFtZSk7XG4gICAgICAgIGlmIChyZWFjdGlvbkZ1bmN0aW9uIHx8IHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICB0YXJnZXQuYWRkRGVjb3JhdG9yKCdkaWZmUmVhY3Rpb24nLCB7XG4gICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgICAgIHJlYWN0aW9uOiBwcm9wZXJ0eUtleSA/IHRhcmdldFtwcm9wZXJ0eUtleV0gOiByZWFjdGlvbkZ1bmN0aW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQgZGlmZlByb3BlcnR5O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGlmZlByb3BlcnR5Lm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2RpZmZQcm9wZXJ0eS5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvZGlmZlByb3BlcnR5Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCIvKipcbiAqIEdlbmVyaWMgZGVjb3JhdG9yIGhhbmRsZXIgdG8gdGFrZSBjYXJlIG9mIHdoZXRoZXIgb3Igbm90IHRoZSBkZWNvcmF0b3Igd2FzIGNhbGxlZCBhdCB0aGUgY2xhc3MgbGV2ZWxcbiAqIG9yIHRoZSBtZXRob2QgbGV2ZWwuXG4gKlxuICogQHBhcmFtIGhhbmRsZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZURlY29yYXRvcihoYW5kbGVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBoYW5kbGVyKHRhcmdldC5wcm90b3R5cGUsIHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVyKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydCBkZWZhdWx0IGhhbmRsZURlY29yYXRvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhbmRsZURlY29yYXRvci5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9oYW5kbGVEZWNvcmF0b3IubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2hhbmRsZURlY29yYXRvci5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IFdlYWtNYXAgZnJvbSAnQGRvam8vc2hpbS9XZWFrTWFwJztcbmltcG9ydCB7IGhhbmRsZURlY29yYXRvciB9IGZyb20gJy4vaGFuZGxlRGVjb3JhdG9yJztcbmltcG9ydCB7IGJlZm9yZVByb3BlcnRpZXMgfSBmcm9tICcuL2JlZm9yZVByb3BlcnRpZXMnO1xuLyoqXG4gKiBNYXAgb2YgaW5zdGFuY2VzIGFnYWluc3QgcmVnaXN0ZXJlZCBpbmplY3RvcnMuXG4gKi9cbmNvbnN0IHJlZ2lzdGVyZWRJbmplY3RvcnNNYXAgPSBuZXcgV2Vha01hcCgpO1xuLyoqXG4gKiBEZWNvcmF0b3IgcmV0cmlldmVzIGFuIGluamVjdG9yIGZyb20gYW4gYXZhaWxhYmxlIHJlZ2lzdHJ5IHVzaW5nIHRoZSBuYW1lIGFuZFxuICogY2FsbHMgdGhlIGBnZXRQcm9wZXJ0aWVzYCBmdW5jdGlvbiB3aXRoIHRoZSBwYXlsb2FkIGZyb20gdGhlIGluamVjdG9yXG4gKiBhbmQgY3VycmVudCBwcm9wZXJ0aWVzIHdpdGggdGhlIHRoZSBpbmplY3RlZCBwcm9wZXJ0aWVzIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSBJbmplY3RDb25maWcgdGhlIGluamVjdCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3QoeyBuYW1lLCBnZXRQcm9wZXJ0aWVzIH0pIHtcbiAgICByZXR1cm4gaGFuZGxlRGVjb3JhdG9yKCh0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICAgIGJlZm9yZVByb3BlcnRpZXMoZnVuY3Rpb24gKHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGluamVjdG9ySXRlbSA9IHRoaXMucmVnaXN0cnkuZ2V0SW5qZWN0b3IobmFtZSk7XG4gICAgICAgICAgICBpZiAoaW5qZWN0b3JJdGVtKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBpbmplY3RvciwgaW52YWxpZGF0b3IgfSA9IGluamVjdG9ySXRlbTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWdpc3RlcmVkSW5qZWN0b3JzID0gcmVnaXN0ZXJlZEluamVjdG9yc01hcC5nZXQodGhpcykgfHwgW107XG4gICAgICAgICAgICAgICAgaWYgKHJlZ2lzdGVyZWRJbmplY3RvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWRJbmplY3RvcnNNYXAuc2V0KHRoaXMsIHJlZ2lzdGVyZWRJbmplY3RvcnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVnaXN0ZXJlZEluamVjdG9ycy5pbmRleE9mKGluamVjdG9ySXRlbSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3duKGludmFsaWRhdG9yLm9uKCdpbnZhbGlkYXRlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJlZEluamVjdG9ycy5wdXNoKGluamVjdG9ySXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0aWVzKGluamVjdG9yKCksIHByb3BlcnRpZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSh0YXJnZXQpO1xuICAgIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQgaW5qZWN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5qZWN0Lm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2luamVjdC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaW5qZWN0Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgeyBXSURHRVRfQkFTRV9UWVBFIH0gZnJvbSAnLi9SZWdpc3RyeSc7XG5mdW5jdGlvbiBpc09iamVjdE9yQXJyYXkodmFsdWUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYWx3YXlzKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2hhbmdlZDogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IG5ld1Byb3BlcnR5XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmUocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjaGFuZ2VkOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IG5ld1Byb3BlcnR5XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWZlcmVuY2UocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjaGFuZ2VkOiBwcmV2aW91c1Byb3BlcnR5ICE9PSBuZXdQcm9wZXJ0eSxcbiAgICAgICAgdmFsdWU6IG5ld1Byb3BlcnR5XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzaGFsbG93KHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KSB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBjb25zdCB2YWxpZE9sZFByb3BlcnR5ID0gcHJldmlvdXNQcm9wZXJ0eSAmJiBpc09iamVjdE9yQXJyYXkocHJldmlvdXNQcm9wZXJ0eSk7XG4gICAgY29uc3QgdmFsaWROZXdQcm9wZXJ0eSA9IG5ld1Byb3BlcnR5ICYmIGlzT2JqZWN0T3JBcnJheShuZXdQcm9wZXJ0eSk7XG4gICAgaWYgKCF2YWxpZE9sZFByb3BlcnR5IHx8ICF2YWxpZE5ld1Byb3BlcnR5KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjaGFuZ2VkOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ld1Byb3BlcnR5XG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHByZXZpb3VzS2V5cyA9IE9iamVjdC5rZXlzKHByZXZpb3VzUHJvcGVydHkpO1xuICAgIGNvbnN0IG5ld0tleXMgPSBPYmplY3Qua2V5cyhuZXdQcm9wZXJ0eSk7XG4gICAgaWYgKHByZXZpb3VzS2V5cy5sZW5ndGggIT09IG5ld0tleXMubGVuZ3RoKSB7XG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2hhbmdlZCA9IG5ld0tleXMuc29tZSgoa2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3UHJvcGVydHlba2V5XSAhPT0gcHJldmlvdXNQcm9wZXJ0eVtrZXldO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2hhbmdlZCxcbiAgICAgICAgdmFsdWU6IG5ld1Byb3BlcnR5XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhdXRvKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KSB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAodHlwZW9mIG5ld1Byb3BlcnR5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGlmIChuZXdQcm9wZXJ0eS5fdHlwZSA9PT0gV0lER0VUX0JBU0VfVFlQRSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVmZXJlbmNlKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGlnbm9yZShwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoaXNPYmplY3RPckFycmF5KG5ld1Byb3BlcnR5KSkge1xuICAgICAgICByZXN1bHQgPSBzaGFsbG93KHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHJlZmVyZW5jZShwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWZmLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kaWZmLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGlmZi5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGFzc2lnbiB9IGZyb20gJ0Bkb2pvL2NvcmUvbGFuZyc7XG5pbXBvcnQgY3NzVHJhbnNpdGlvbnMgZnJvbSAnLi4vYW5pbWF0aW9ucy9jc3NUcmFuc2l0aW9ucyc7XG5pbXBvcnQgeyBhZnRlclJlbmRlciB9IGZyb20gJy4vLi4vZGVjb3JhdG9ycy9hZnRlclJlbmRlcic7XG5pbXBvcnQgeyB2IH0gZnJvbSAnLi8uLi9kJztcbmltcG9ydCB7IGRvbSB9IGZyb20gJy4vLi4vdmRvbSc7XG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGF0dGFjaCBzdGF0ZSBvZiB0aGUgcHJvamVjdG9yXG4gKi9cbmV4cG9ydCB2YXIgUHJvamVjdG9yQXR0YWNoU3RhdGU7XG4oZnVuY3Rpb24gKFByb2plY3RvckF0dGFjaFN0YXRlKSB7XG4gICAgUHJvamVjdG9yQXR0YWNoU3RhdGVbUHJvamVjdG9yQXR0YWNoU3RhdGVbXCJBdHRhY2hlZFwiXSA9IDFdID0gXCJBdHRhY2hlZFwiO1xuICAgIFByb2plY3RvckF0dGFjaFN0YXRlW1Byb2plY3RvckF0dGFjaFN0YXRlW1wiRGV0YWNoZWRcIl0gPSAyXSA9IFwiRGV0YWNoZWRcIjtcbn0pKFByb2plY3RvckF0dGFjaFN0YXRlIHx8IChQcm9qZWN0b3JBdHRhY2hTdGF0ZSA9IHt9KSk7XG4vKipcbiAqIEF0dGFjaCB0eXBlIGZvciB0aGUgcHJvamVjdG9yXG4gKi9cbmV4cG9ydCB2YXIgQXR0YWNoVHlwZTtcbihmdW5jdGlvbiAoQXR0YWNoVHlwZSkge1xuICAgIEF0dGFjaFR5cGVbQXR0YWNoVHlwZVtcIkFwcGVuZFwiXSA9IDFdID0gXCJBcHBlbmRcIjtcbiAgICBBdHRhY2hUeXBlW0F0dGFjaFR5cGVbXCJNZXJnZVwiXSA9IDJdID0gXCJNZXJnZVwiO1xufSkoQXR0YWNoVHlwZSB8fCAoQXR0YWNoVHlwZSA9IHt9KSk7XG5leHBvcnQgZnVuY3Rpb24gUHJvamVjdG9yTWl4aW4oQmFzZSkge1xuICAgIGNsYXNzIFByb2plY3RvciBleHRlbmRzIEJhc2Uge1xuICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7XG4gICAgICAgICAgICBzdXBlciguLi5hcmdzKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3QgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgICAgICAgdGhpcy5fYXN5bmMgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fcHJvamVjdG9yUHJvcGVydGllcyA9IHt9O1xuICAgICAgICAgICAgdGhpcy5fcHJvamVjdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbnM6IGNzc1RyYW5zaXRpb25zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5yb290ID0gZG9jdW1lbnQuYm9keTtcbiAgICAgICAgICAgIHRoaXMucHJvamVjdG9yU3RhdGUgPSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5EZXRhY2hlZDtcbiAgICAgICAgfVxuICAgICAgICBhcHBlbmQocm9vdCkge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBBdHRhY2hUeXBlLkFwcGVuZCxcbiAgICAgICAgICAgICAgICByb290XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2F0dGFjaChvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBtZXJnZShyb290KSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IEF0dGFjaFR5cGUuTWVyZ2UsXG4gICAgICAgICAgICAgICAgcm9vdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdHRhY2gob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0IHJvb3Qocm9vdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvamVjdG9yU3RhdGUgPT09IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9qZWN0b3IgYWxyZWFkeSBhdHRhY2hlZCwgY2Fubm90IGNoYW5nZSByb290IGVsZW1lbnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3Jvb3QgPSByb290O1xuICAgICAgICB9XG4gICAgICAgIGdldCByb290KCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3Q7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGFzeW5jKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FzeW5jO1xuICAgICAgICB9XG4gICAgICAgIHNldCBhc3luYyhhc3luYykge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvamVjdG9yU3RhdGUgPT09IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9qZWN0b3IgYWxyZWFkeSBhdHRhY2hlZCwgY2Fubm90IGNoYW5nZSBhc3luYyBtb2RlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9hc3luYyA9IGFzeW5jO1xuICAgICAgICB9XG4gICAgICAgIHNhbmRib3goZG9jID0gZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb2plY3RvclN0YXRlID09PSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5BdHRhY2hlZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJvamVjdG9yIGFscmVhZHkgYXR0YWNoZWQsIGNhbm5vdCBjcmVhdGUgc2FuZGJveCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fYXN5bmMgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzUm9vdCA9IHRoaXMucm9vdDtcbiAgICAgICAgICAgIC8qIGZyZWUgdXAgdGhlIGRvY3VtZW50IGZyYWdtZW50IGZvciBHQyAqL1xuICAgICAgICAgICAgdGhpcy5vd24oe1xuICAgICAgICAgICAgICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcm9vdCA9IHByZXZpb3VzUm9vdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX2F0dGFjaCh7XG4gICAgICAgICAgICAgICAgLyogRG9jdW1lbnRGcmFnbWVudCBpcyBub3QgYXNzaWduYWJsZSB0byBFbGVtZW50LCBidXQgcHJvdmlkZXMgZXZlcnl0aGluZyBuZWVkZWQgdG8gd29yayAqL1xuICAgICAgICAgICAgICAgIHJvb3Q6IGRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG4gICAgICAgICAgICAgICAgdHlwZTogQXR0YWNoVHlwZS5BcHBlbmRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHNldENoaWxkcmVuKGNoaWxkcmVuKSB7XG4gICAgICAgICAgICB0aGlzLl9fc2V0Q2hpbGRyZW5fXyhjaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICB0aGlzLl9fc2V0UHJvcGVydGllc19fKHByb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgICAgIF9fc2V0UHJvcGVydGllc19fKHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9wcm9qZWN0b3JQcm9wZXJ0aWVzICYmIHRoaXMuX3Byb2plY3RvclByb3BlcnRpZXMucmVnaXN0cnkgIT09IHByb3BlcnRpZXMucmVnaXN0cnkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcHJvamVjdG9yUHJvcGVydGllcy5yZWdpc3RyeSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm9qZWN0b3JQcm9wZXJ0aWVzLnJlZ2lzdHJ5LmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9wcm9qZWN0b3JQcm9wZXJ0aWVzID0gYXNzaWduKHt9LCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIHN1cGVyLl9fc2V0Q29yZVByb3BlcnRpZXNfXyh7IGJpbmQ6IHRoaXMsIGJhc2VSZWdpc3RyeTogcHJvcGVydGllcy5yZWdpc3RyeSB9KTtcbiAgICAgICAgICAgIHN1cGVyLl9fc2V0UHJvcGVydGllc19fKHByb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgICAgIHRvSHRtbCgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb2plY3RvclN0YXRlICE9PSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5BdHRhY2hlZCB8fCAhdGhpcy5fcHJvamVjdGlvbikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJvamVjdG9yIGlzIG5vdCBhdHRhY2hlZCwgY2Fubm90IHJldHVybiBhbiBIVE1MIHN0cmluZyBvZiBwcm9qZWN0aW9uLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2plY3Rpb24uZG9tTm9kZS5jaGlsZE5vZGVzWzBdLm91dGVySFRNTDtcbiAgICAgICAgfVxuICAgICAgICBhZnRlclJlbmRlcihyZXN1bHQpIHtcbiAgICAgICAgICAgIGxldCBub2RlID0gcmVzdWx0O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnIHx8IHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG5vZGUgPSB2KCdzcGFuJywge30sIFtyZXN1bHRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgICAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgX2F0dGFjaCh7IHR5cGUsIHJvb3QgfSkge1xuICAgICAgICAgICAgaWYgKHJvb3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3QgPSByb290O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2F0dGFjaEhhbmRsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdHRhY2hIYW5kbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByb2plY3RvclN0YXRlID0gUHJvamVjdG9yQXR0YWNoU3RhdGUuQXR0YWNoZWQ7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB7XG4gICAgICAgICAgICAgICAgZGVzdHJveTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9qZWN0b3JTdGF0ZSA9PT0gUHJvamVjdG9yQXR0YWNoU3RhdGUuQXR0YWNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2plY3RvclN0YXRlID0gUHJvamVjdG9yQXR0YWNoU3RhdGUuRGV0YWNoZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5vd24oaGFuZGxlKTtcbiAgICAgICAgICAgIHRoaXMuX2F0dGFjaEhhbmRsZSA9IGhhbmRsZTtcbiAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rpb25PcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcHJvamVjdGlvbk9wdGlvbnMsIHsgc3luYzogIXRoaXMuX2FzeW5jIH0pO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBBdHRhY2hUeXBlLkFwcGVuZDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvamVjdGlvbiA9IGRvbS5hcHBlbmQodGhpcy5yb290LCB0aGlzLCB0aGlzLl9wcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgQXR0YWNoVHlwZS5NZXJnZTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvamVjdGlvbiA9IGRvbS5tZXJnZSh0aGlzLnJvb3QsIHRoaXMsIHRoaXMuX3Byb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXR0YWNoSGFuZGxlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRzbGliXzEuX19kZWNvcmF0ZShbXG4gICAgICAgIGFmdGVyUmVuZGVyKCksXG4gICAgICAgIHRzbGliXzEuX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEZ1bmN0aW9uKSxcbiAgICAgICAgdHNsaWJfMS5fX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW09iamVjdF0pLFxuICAgICAgICB0c2xpYl8xLl9fbWV0YWRhdGEoXCJkZXNpZ246cmV0dXJudHlwZVwiLCB2b2lkIDApXG4gICAgXSwgUHJvamVjdG9yLnByb3RvdHlwZSwgXCJhZnRlclJlbmRlclwiLCBudWxsKTtcbiAgICByZXR1cm4gUHJvamVjdG9yO1xufVxuZXhwb3J0IGRlZmF1bHQgUHJvamVjdG9yTWl4aW47XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Qcm9qZWN0b3IubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL21peGlucy9Qcm9qZWN0b3IubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9taXhpbnMvUHJvamVjdG9yLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgSW5qZWN0b3IgfSBmcm9tICcuLy4uL0luamVjdG9yJztcbmltcG9ydCB7IGluamVjdCB9IGZyb20gJy4vLi4vZGVjb3JhdG9ycy9pbmplY3QnO1xuaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi8uLi9kZWNvcmF0b3JzL2hhbmRsZURlY29yYXRvcic7XG5pbXBvcnQgeyBkaWZmUHJvcGVydHkgfSBmcm9tICcuLy4uL2RlY29yYXRvcnMvZGlmZlByb3BlcnR5JztcbmltcG9ydCB7IHNoYWxsb3cgfSBmcm9tICcuLy4uL2RpZmYnO1xuY29uc3QgVEhFTUVfS0VZID0gJyBfa2V5JztcbmV4cG9ydCBjb25zdCBJTkpFQ1RFRF9USEVNRV9LRVkgPSBTeW1ib2woJ3RoZW1lJyk7XG4vKipcbiAqIERlY29yYXRvciBmb3IgYmFzZSBjc3MgY2xhc3Nlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGhlbWUodGhlbWUpIHtcbiAgICByZXR1cm4gaGFuZGxlRGVjb3JhdG9yKCh0YXJnZXQpID0+IHtcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcignYmFzZVRoZW1lQ2xhc3NlcycsIHRoZW1lKTtcbiAgICB9KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIHJldmVyc2UgbG9va3VwIGZvciB0aGUgY2xhc3NlcyBwYXNzZWQgaW4gdmlhIHRoZSBgdGhlbWVgIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBjbGFzc2VzIFRoZSBiYXNlQ2xhc3NlcyBvYmplY3RcbiAqIEByZXF1aXJlc1xuICovXG5mdW5jdGlvbiBjcmVhdGVUaGVtZUNsYXNzZXNMb29rdXAoY2xhc3Nlcykge1xuICAgIHJldHVybiBjbGFzc2VzLnJlZHVjZSgoY3VycmVudENsYXNzTmFtZXMsIGJhc2VDbGFzcykgPT4ge1xuICAgICAgICBPYmplY3Qua2V5cyhiYXNlQ2xhc3MpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgY3VycmVudENsYXNzTmFtZXNbYmFzZUNsYXNzW2tleV1dID0ga2V5O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzc05hbWVzO1xuICAgIH0sIHt9KTtcbn1cbi8qKlxuICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBpcyBnaXZlbiBhIHRoZW1lIGFuZCBhbiBvcHRpb25hbCByZWdpc3RyeSwgdGhlIHRoZW1lXG4gKiBpbmplY3RvciBpcyBkZWZpbmVkIGFnYWluc3QgdGhlIHJlZ2lzdHJ5LCByZXR1cm5pbmcgdGhlIHRoZW1lLlxuICpcbiAqIEBwYXJhbSB0aGVtZSB0aGUgdGhlbWUgdG8gc2V0XG4gKiBAcGFyYW0gdGhlbWVSZWdpc3RyeSByZWdpc3RyeSB0byBkZWZpbmUgdGhlIHRoZW1lIGluamVjdG9yIGFnYWluc3QuIERlZmF1bHRzXG4gKiB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5XG4gKlxuICogQHJldHVybnMgdGhlIHRoZW1lIGluamVjdG9yIHVzZWQgdG8gc2V0IHRoZSB0aGVtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJUaGVtZUluamVjdG9yKHRoZW1lLCB0aGVtZVJlZ2lzdHJ5KSB7XG4gICAgY29uc3QgdGhlbWVJbmplY3RvciA9IG5ldyBJbmplY3Rvcih0aGVtZSk7XG4gICAgdGhlbWVSZWdpc3RyeS5kZWZpbmVJbmplY3RvcihJTkpFQ1RFRF9USEVNRV9LRVksIChpbnZhbGlkYXRvcikgPT4ge1xuICAgICAgICB0aGVtZUluamVjdG9yLnNldEludmFsaWRhdG9yKGludmFsaWRhdG9yKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHRoZW1lSW5qZWN0b3IuZ2V0KCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoZW1lSW5qZWN0b3I7XG59XG4vKipcbiAqIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGNsYXNzIGRlY29yYXRlZCB3aXRoIHdpdGggVGhlbWVkIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFRoZW1lZE1peGluKEJhc2UpIHtcbiAgICBsZXQgVGhlbWVkID0gY2xhc3MgVGhlbWVkIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogUmVnaXN0ZXJlZCBiYXNlIHRoZW1lIGtleXNcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZEJhc2VUaGVtZUtleXMgPSBbXTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogSW5kaWNhdGVzIGlmIGNsYXNzZXMgbWV0YSBkYXRhIG5lZWQgdG8gYmUgY2FsY3VsYXRlZC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy5fcmVjYWxjdWxhdGVDbGFzc2VzID0gdHJ1ZTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogTG9hZGVkIHRoZW1lXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXMuX3RoZW1lID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhlbWUoY2xhc3Nlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JlY2FsY3VsYXRlQ2xhc3Nlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlY2FsY3VsYXRlVGhlbWVDbGFzc2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjbGFzc2VzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc2VzLm1hcCgoY2xhc3NOYW1lKSA9PiB0aGlzLl9nZXRUaGVtZUNsYXNzKGNsYXNzTmFtZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFRoZW1lQ2xhc3MoY2xhc3Nlcyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZ1bmN0aW9uIGZpcmVkIHdoZW4gYHRoZW1lYCBvciBgZXh0cmFDbGFzc2VzYCBhcmUgY2hhbmdlZC5cbiAgICAgICAgICovXG4gICAgICAgIG9uUHJvcGVydGllc0NoYW5nZWQoKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWNhbGN1bGF0ZUNsYXNzZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIF9nZXRUaGVtZUNsYXNzKGNsYXNzTmFtZSkge1xuICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PT0gdW5kZWZpbmVkIHx8IGNsYXNzTmFtZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBleHRyYUNsYXNzZXMgPSB0aGlzLnByb3BlcnRpZXMuZXh0cmFDbGFzc2VzIHx8IHt9O1xuICAgICAgICAgICAgY29uc3QgdGhlbWVDbGFzc05hbWUgPSB0aGlzLl9iYXNlVGhlbWVDbGFzc2VzUmV2ZXJzZUxvb2t1cFtjbGFzc05hbWVdO1xuICAgICAgICAgICAgbGV0IHJlc3VsdENsYXNzTmFtZXMgPSBbXTtcbiAgICAgICAgICAgIGlmICghdGhlbWVDbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYENsYXNzIG5hbWU6ICcke2NsYXNzTmFtZX0nIG5vdCBmb3VuZCBpbiB0aGVtZWApO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4dHJhQ2xhc3Nlc1t0aGVtZUNsYXNzTmFtZV0pIHtcbiAgICAgICAgICAgICAgICByZXN1bHRDbGFzc05hbWVzLnB1c2goZXh0cmFDbGFzc2VzW3RoZW1lQ2xhc3NOYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fdGhlbWVbdGhlbWVDbGFzc05hbWVdKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0Q2xhc3NOYW1lcy5wdXNoKHRoaXMuX3RoZW1lW3RoZW1lQ2xhc3NOYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHRDbGFzc05hbWVzLnB1c2godGhpcy5fcmVnaXN0ZXJlZEJhc2VUaGVtZVt0aGVtZUNsYXNzTmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENsYXNzTmFtZXMuam9pbignICcpO1xuICAgICAgICB9XG4gICAgICAgIF9yZWNhbGN1bGF0ZVRoZW1lQ2xhc3NlcygpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGhlbWUgPSB7fSB9ID0gdGhpcy5wcm9wZXJ0aWVzO1xuICAgICAgICAgICAgY29uc3QgYmFzZVRoZW1lcyA9IHRoaXMuZ2V0RGVjb3JhdG9yKCdiYXNlVGhlbWVDbGFzc2VzJyk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3JlZ2lzdGVyZWRCYXNlVGhlbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lID0gYmFzZVRoZW1lcy5yZWR1Y2UoKGZpbmFsQmFzZVRoZW1lLCBiYXNlVGhlbWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX2EgPSBUSEVNRV9LRVksIGtleSA9IGJhc2VUaGVtZVtfYV0sIGNsYXNzZXMgPSB0c2xpYl8xLl9fcmVzdChiYXNlVGhlbWUsIFt0eXBlb2YgX2EgPT09IFwic3ltYm9sXCIgPyBfYSA6IF9hICsgXCJcIl0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lS2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBmaW5hbEJhc2VUaGVtZSwgY2xhc3Nlcyk7XG4gICAgICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Jhc2VUaGVtZUNsYXNzZXNSZXZlcnNlTG9va3VwID0gY3JlYXRlVGhlbWVDbGFzc2VzTG9va3VwKGJhc2VUaGVtZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdGhlbWUgPSB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lS2V5cy5yZWR1Y2UoKGJhc2VUaGVtZSwgdGhlbWVLZXkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgYmFzZVRoZW1lLCB0aGVtZVt0aGVtZUtleV0pO1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgdGhpcy5fcmVjYWxjdWxhdGVDbGFzc2VzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHRzbGliXzEuX19kZWNvcmF0ZShbXG4gICAgICAgIGRpZmZQcm9wZXJ0eSgndGhlbWUnLCBzaGFsbG93KSxcbiAgICAgICAgZGlmZlByb3BlcnR5KCdleHRyYUNsYXNzZXMnLCBzaGFsbG93KSxcbiAgICAgICAgdHNsaWJfMS5fX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgICAgICB0c2xpYl8xLl9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbXSksXG4gICAgICAgIHRzbGliXzEuX19tZXRhZGF0YShcImRlc2lnbjpyZXR1cm50eXBlXCIsIHZvaWQgMClcbiAgICBdLCBUaGVtZWQucHJvdG90eXBlLCBcIm9uUHJvcGVydGllc0NoYW5nZWRcIiwgbnVsbCk7XG4gICAgVGhlbWVkID0gdHNsaWJfMS5fX2RlY29yYXRlKFtcbiAgICAgICAgaW5qZWN0KHtcbiAgICAgICAgICAgIG5hbWU6IElOSkVDVEVEX1RIRU1FX0tFWSxcbiAgICAgICAgICAgIGdldFByb3BlcnRpZXM6ICh0aGVtZSwgcHJvcGVydGllcykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcHJvcGVydGllcy50aGVtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB0aGVtZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgXSwgVGhlbWVkKTtcbiAgICByZXR1cm4gVGhlbWVkO1xufVxuZXhwb3J0IGRlZmF1bHQgVGhlbWVkTWl4aW47XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UaGVtZWQubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL21peGlucy9UaGVtZWQubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9taXhpbnMvVGhlbWVkLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgV2lkZ2V0QmFzZSwgbm9CaW5kIH0gZnJvbSAnLi9XaWRnZXRCYXNlJztcbmltcG9ydCB7IFByb2plY3Rvck1peGluIH0gZnJvbSAnLi9taXhpbnMvUHJvamVjdG9yJztcbmltcG9ydCB7IGZyb20gfSBmcm9tICdAZG9qby9zaGltL2FycmF5JztcbmltcG9ydCB7IHcsIGRvbSB9IGZyb20gJy4vZCc7XG5pbXBvcnQgZ2xvYmFsIGZyb20gJ0Bkb2pvL3NoaW0vZ2xvYmFsJztcbmltcG9ydCB7IHJlZ2lzdGVyVGhlbWVJbmplY3RvciB9IGZyb20gJy4vbWl4aW5zL1RoZW1lZCc7XG5pbXBvcnQgeyBhbHdheXNSZW5kZXIgfSBmcm9tICcuL2RlY29yYXRvcnMvYWx3YXlzUmVuZGVyJztcbmV4cG9ydCB2YXIgQ3VzdG9tRWxlbWVudENoaWxkVHlwZTtcbihmdW5jdGlvbiAoQ3VzdG9tRWxlbWVudENoaWxkVHlwZSkge1xuICAgIEN1c3RvbUVsZW1lbnRDaGlsZFR5cGVbXCJET0pPXCJdID0gXCJET0pPXCI7XG4gICAgQ3VzdG9tRWxlbWVudENoaWxkVHlwZVtcIk5PREVcIl0gPSBcIk5PREVcIjtcbiAgICBDdXN0b21FbGVtZW50Q2hpbGRUeXBlW1wiVEVYVFwiXSA9IFwiVEVYVFwiO1xufSkoQ3VzdG9tRWxlbWVudENoaWxkVHlwZSB8fCAoQ3VzdG9tRWxlbWVudENoaWxkVHlwZSA9IHt9KSk7XG5leHBvcnQgZnVuY3Rpb24gRG9tVG9XaWRnZXRXcmFwcGVyKGRvbU5vZGUpIHtcbiAgICBsZXQgRG9tVG9XaWRnZXRXcmFwcGVyID0gY2xhc3MgRG9tVG9XaWRnZXRXcmFwcGVyIGV4dGVuZHMgV2lkZ2V0QmFzZSB7XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyh0aGlzLnByb3BlcnRpZXMpLnJlZHVjZSgocHJvcHMsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5wcm9wZXJ0aWVzW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKGtleS5pbmRleE9mKCdvbicpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IGBfXyR7a2V5fWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByb3BzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvcHM7XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICByZXR1cm4gZG9tKHsgbm9kZTogZG9tTm9kZSwgcHJvcHM6IHByb3BlcnRpZXMsIGRpZmZUeXBlOiAnZG9tJyB9KTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZ2V0IGRvbU5vZGUoKSB7XG4gICAgICAgICAgICByZXR1cm4gZG9tTm9kZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRG9tVG9XaWRnZXRXcmFwcGVyID0gdHNsaWJfMS5fX2RlY29yYXRlKFtcbiAgICAgICAgYWx3YXlzUmVuZGVyKClcbiAgICBdLCBEb21Ub1dpZGdldFdyYXBwZXIpO1xuICAgIHJldHVybiBEb21Ub1dpZGdldFdyYXBwZXI7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKGRlc2NyaXB0b3IsIFdpZGdldENvbnN0cnVjdG9yKSB7XG4gICAgY29uc3QgeyBhdHRyaWJ1dGVzLCBjaGlsZFR5cGUsIHJlZ2lzdHJ5RmFjdG9yeSB9ID0gZGVzY3JpcHRvcjtcbiAgICBjb25zdCBhdHRyaWJ1dGVNYXAgPSB7fTtcbiAgICBhdHRyaWJ1dGVzLmZvckVhY2goKHByb3BlcnR5TmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGF0dHJpYnV0ZU1hcFthdHRyaWJ1dGVOYW1lXSA9IHByb3BlcnR5TmFtZTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkcmVuID0gW107XG4gICAgICAgICAgICB0aGlzLl9ldmVudFByb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxpc2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5faW5pdGlhbGlzZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBkb21Qcm9wZXJ0aWVzID0ge307XG4gICAgICAgICAgICBjb25zdCB7IGF0dHJpYnV0ZXMsIHByb3BlcnRpZXMsIGV2ZW50cyB9ID0gZGVzY3JpcHRvcjtcbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9wcm9wZXJ0aWVzLCB0aGlzLl9hdHRyaWJ1dGVzVG9Qcm9wZXJ0aWVzKGF0dHJpYnV0ZXMpKTtcbiAgICAgICAgICAgIFsuLi5hdHRyaWJ1dGVzLCAuLi5wcm9wZXJ0aWVzXS5mb3JFYWNoKChwcm9wZXJ0eU5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXNbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZFByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZS5yZXBsYWNlKC9eb24vLCAnX18nKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlcmVkUHJvcGVydHlOYW1lICE9PSBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tUHJvcGVydGllc1tmaWx0ZXJlZFByb3BlcnR5TmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXQ6ICgpID0+IHRoaXMuX2dldFByb3BlcnR5KHByb3BlcnR5TmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXQ6ICh2YWx1ZSkgPT4gdGhpcy5fc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZG9tUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICBnZXQ6ICgpID0+IHRoaXMuX2dldFByb3BlcnR5KHByb3BlcnR5TmFtZSksXG4gICAgICAgICAgICAgICAgICAgIHNldDogKHZhbHVlKSA9PiB0aGlzLl9zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGV2ZW50cy5mb3JFYWNoKChwcm9wZXJ0eU5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBwcm9wZXJ0eU5hbWUucmVwbGFjZSgvXm9uLywgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRQcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUucmVwbGFjZSgvXm9uLywgJ19fb24nKTtcbiAgICAgICAgICAgICAgICBkb21Qcm9wZXJ0aWVzW2ZpbHRlcmVkUHJvcGVydHlOYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiAoKSA9PiB0aGlzLl9nZXRFdmVudFByb3BlcnR5KHByb3BlcnR5TmFtZSksXG4gICAgICAgICAgICAgICAgICAgIHNldDogKHZhbHVlKSA9PiB0aGlzLl9zZXRFdmVudFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLl9ldmVudFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudENhbGxiYWNrID0gdGhpcy5fZ2V0RXZlbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV2ZW50Q2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Q2FsbGJhY2soLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBhcmdzXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCBkb21Qcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY2hpbGRUeXBlID09PSBDdXN0b21FbGVtZW50Q2hpbGRUeXBlLlRFWFQgPyB0aGlzLmNoaWxkTm9kZXMgOiB0aGlzLmNoaWxkcmVuO1xuICAgICAgICAgICAgZnJvbShjaGlsZHJlbikuZm9yRWFjaCgoY2hpbGROb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkVHlwZSA9PT0gQ3VzdG9tRWxlbWVudENoaWxkVHlwZS5ET0pPKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkTm9kZS5hZGRFdmVudExpc3RlbmVyKCdkb2pvLWNlLXJlbmRlcicsICgpID0+IHRoaXMuX3JlbmRlcigpKTtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGROb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2Rvam8tY2UtY29ubmVjdGVkJywgKCkgPT4gdGhpcy5fcmVuZGVyKCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGlsZHJlbi5wdXNoKERvbVRvV2lkZ2V0V3JhcHBlcihjaGlsZE5vZGUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoaWxkcmVuLnB1c2goZG9tKHsgbm9kZTogY2hpbGROb2RlLCBkaWZmVHlwZTogJ2RvbScgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdkb2pvLWNlLWNvbm5lY3RlZCcsIChlKSA9PiB0aGlzLl9jaGlsZENvbm5lY3RlZChlKSk7XG4gICAgICAgICAgICBjb25zdCB3aWRnZXRQcm9wZXJ0aWVzID0gdGhpcy5fcHJvcGVydGllcztcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlckNoaWxkcmVuID0gKCkgPT4gdGhpcy5fX2NoaWxkcmVuX18oKTtcbiAgICAgICAgICAgIGNvbnN0IFdyYXBwZXIgPSBjbGFzcyBleHRlbmRzIFdpZGdldEJhc2Uge1xuICAgICAgICAgICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHcoV2lkZ2V0Q29uc3RydWN0b3IsIHdpZGdldFByb3BlcnRpZXMsIHJlbmRlckNoaWxkcmVuKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCByZWdpc3RyeSA9IHJlZ2lzdHJ5RmFjdG9yeSgpO1xuICAgICAgICAgICAgY29uc3QgdGhlbWVDb250ZXh0ID0gcmVnaXN0ZXJUaGVtZUluamVjdG9yKHRoaXMuX2dldFRoZW1lKCksIHJlZ2lzdHJ5KTtcbiAgICAgICAgICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdkb2pvLXRoZW1lLXNldCcsICgpID0+IHRoZW1lQ29udGV4dC5zZXQodGhpcy5fZ2V0VGhlbWUoKSkpO1xuICAgICAgICAgICAgY29uc3QgUHJvamVjdG9yID0gUHJvamVjdG9yTWl4aW4oV3JhcHBlcik7XG4gICAgICAgICAgICB0aGlzLl9wcm9qZWN0b3IgPSBuZXcgUHJvamVjdG9yKCk7XG4gICAgICAgICAgICB0aGlzLl9wcm9qZWN0b3Iuc2V0UHJvcGVydGllcyh7IHJlZ2lzdHJ5IH0pO1xuICAgICAgICAgICAgdGhpcy5fcHJvamVjdG9yLmFwcGVuZCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxpc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2Rvam8tY2UtY29ubmVjdGVkJywge1xuICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgZGV0YWlsOiB0aGlzXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgX2dldFRoZW1lKCkge1xuICAgICAgICAgICAgaWYgKGdsb2JhbCAmJiBnbG9iYWwuZG9qb2NlICYmIGdsb2JhbC5kb2pvY2UudGhlbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2xvYmFsLmRvam9jZS50aGVtZXNbZ2xvYmFsLmRvam9jZS50aGVtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX2NoaWxkQ29ubmVjdGVkKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBlLmRldGFpbDtcbiAgICAgICAgICAgIGlmIChub2RlLnBhcmVudE5vZGUgPT09IHRoaXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdHMgPSB0aGlzLl9jaGlsZHJlbi5zb21lKChjaGlsZCkgPT4gY2hpbGQuZG9tTm9kZSA9PT0gbm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdkb2pvLWNlLXJlbmRlcicsICgpID0+IHRoaXMuX3JlbmRlcigpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hpbGRyZW4ucHVzaChEb21Ub1dpZGdldFdyYXBwZXIobm9kZSkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX3JlbmRlcigpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9wcm9qZWN0b3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9qZWN0b3IuaW52YWxpZGF0ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2Rvam8tY2UtcmVuZGVyJywge1xuICAgICAgICAgICAgICAgICAgICBidWJibGVzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB0aGlzXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9fcHJvcGVydGllc19fKCkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3Byb3BlcnRpZXMsIHRoaXMuX2V2ZW50UHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICAgICAgX19jaGlsZHJlbl9fKCkge1xuICAgICAgICAgICAgaWYgKGNoaWxkVHlwZSA9PT0gQ3VzdG9tRWxlbWVudENoaWxkVHlwZS5ET0pPKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuLmZpbHRlcigoQ2hpbGQpID0+IENoaWxkLmRvbU5vZGUuaXNXaWRnZXQpLm1hcCgoQ2hpbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkb21Ob2RlIH0gPSBDaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHcoQ2hpbGQsIE9iamVjdC5hc3NpZ24oe30sIGRvbU5vZGUuX19wcm9wZXJ0aWVzX18oKSksIFsuLi5kb21Ob2RlLl9fY2hpbGRyZW5fXygpXSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZFZhbHVlLCB2YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gYXR0cmlidXRlTWFwW25hbWVdO1xuICAgICAgICAgICAgdGhpcy5fc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgX3NldEV2ZW50UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fZXZlbnRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBfZ2V0RXZlbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ldmVudFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBfc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHZhbHVlW25vQmluZF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBfZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIF9hdHRyaWJ1dGVzVG9Qcm9wZXJ0aWVzKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzLnJlZHVjZSgocHJvcGVydGllcywgcHJvcGVydHlOYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IHByb3BlcnR5TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGVydGllcztcbiAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhhdHRyaWJ1dGVNYXApO1xuICAgICAgICB9XG4gICAgICAgIGdldCBpc1dpZGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlcihXaWRnZXRDb25zdHJ1Y3Rvcikge1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBXaWRnZXRDb25zdHJ1Y3Rvci5wcm90b3R5cGUgJiYgV2lkZ2V0Q29uc3RydWN0b3IucHJvdG90eXBlLl9fY3VzdG9tRWxlbWVudERlc2NyaXB0b3I7XG4gICAgaWYgKCFkZXNjcmlwdG9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdldCBkZXNjcmlwdG9yIGZvciBDdXN0b20gRWxlbWVudCwgaGF2ZSB5b3UgYWRkZWQgdGhlIEBjdXN0b21FbGVtZW50IGRlY29yYXRvciB0byB5b3VyIFdpZGdldD8nKTtcbiAgICB9XG4gICAgZ2xvYmFsLmN1c3RvbUVsZW1lbnRzLmRlZmluZShkZXNjcmlwdG9yLnRhZ05hbWUsIGNyZWF0ZShkZXNjcmlwdG9yLCBXaWRnZXRDb25zdHJ1Y3RvcikpO1xufVxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWdpc3RlckN1c3RvbUVsZW1lbnQubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL3JlZ2lzdGVyQ3VzdG9tRWxlbWVudC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL3JlZ2lzdGVyQ3VzdG9tRWxlbWVudC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IGdsb2JhbCBmcm9tICdAZG9qby9zaGltL2dsb2JhbCc7XG5pbXBvcnQgeyBmcm9tIGFzIGFycmF5RnJvbSB9IGZyb20gJ0Bkb2pvL3NoaW0vYXJyYXknO1xuaW1wb3J0IHsgaXNXTm9kZSwgaXNWTm9kZSwgaXNEb21WTm9kZSwgVk5PREUsIFdOT0RFIH0gZnJvbSAnLi9kJztcbmltcG9ydCB7IGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yIH0gZnJvbSAnLi9SZWdpc3RyeSc7XG5pbXBvcnQgV2Vha01hcCBmcm9tICdAZG9qby9zaGltL1dlYWtNYXAnO1xuY29uc3QgTkFNRVNQQUNFX1czID0gJ2h0dHA6Ly93d3cudzMub3JnLyc7XG5jb25zdCBOQU1FU1BBQ0VfU1ZHID0gTkFNRVNQQUNFX1czICsgJzIwMDAvc3ZnJztcbmNvbnN0IE5BTUVTUEFDRV9YTElOSyA9IE5BTUVTUEFDRV9XMyArICcxOTk5L3hsaW5rJztcbmNvbnN0IGVtcHR5QXJyYXkgPSBbXTtcbmV4cG9ydCBjb25zdCB3aWRnZXRJbnN0YW5jZU1hcCA9IG5ldyBXZWFrTWFwKCk7XG5jb25zdCBpbnN0YW5jZU1hcCA9IG5ldyBXZWFrTWFwKCk7XG5jb25zdCBwcm9qZWN0b3JTdGF0ZU1hcCA9IG5ldyBXZWFrTWFwKCk7XG5mdW5jdGlvbiBzYW1lKGRub2RlMSwgZG5vZGUyKSB7XG4gICAgaWYgKGlzVk5vZGUoZG5vZGUxKSAmJiBpc1ZOb2RlKGRub2RlMikpIHtcbiAgICAgICAgaWYgKGlzRG9tVk5vZGUoZG5vZGUxKSB8fCBpc0RvbVZOb2RlKGRub2RlMikpIHtcbiAgICAgICAgICAgIGlmIChkbm9kZTEuZG9tTm9kZSAhPT0gZG5vZGUyLmRvbU5vZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRub2RlMS50YWcgIT09IGRub2RlMi50YWcpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZG5vZGUxLnByb3BlcnRpZXMua2V5ICE9PSBkbm9kZTIucHJvcGVydGllcy5rZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNXTm9kZShkbm9kZTEpICYmIGlzV05vZGUoZG5vZGUyKSkge1xuICAgICAgICBpZiAoZG5vZGUxLmluc3RhbmNlID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIGRub2RlMi53aWRnZXRDb25zdHJ1Y3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZG5vZGUxLndpZGdldENvbnN0cnVjdG9yICE9PSBkbm9kZTIud2lkZ2V0Q29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZG5vZGUxLnByb3BlcnRpZXMua2V5ICE9PSBkbm9kZTIucHJvcGVydGllcy5rZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuY29uc3QgbWlzc2luZ1RyYW5zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQcm92aWRlIGEgdHJhbnNpdGlvbnMgb2JqZWN0IHRvIHRoZSBwcm9qZWN0aW9uT3B0aW9ucyB0byBkbyBhbmltYXRpb25zJyk7XG59O1xuZnVuY3Rpb24gZ2V0UHJvamVjdGlvbk9wdGlvbnMocHJvamVjdG9yT3B0aW9ucywgcHJvamVjdG9ySW5zdGFuY2UpIHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICAgICAgbmFtZXNwYWNlOiB1bmRlZmluZWQsXG4gICAgICAgIHN0eWxlQXBwbHllcjogZnVuY3Rpb24gKGRvbU5vZGUsIHN0eWxlTmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGRvbU5vZGUuc3R5bGVbc3R5bGVOYW1lXSA9IHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICB0cmFuc2l0aW9uczoge1xuICAgICAgICAgICAgZW50ZXI6IG1pc3NpbmdUcmFuc2l0aW9uLFxuICAgICAgICAgICAgZXhpdDogbWlzc2luZ1RyYW5zaXRpb25cbiAgICAgICAgfSxcbiAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgIG1lcmdlOiBmYWxzZSxcbiAgICAgICAgc3luYzogZmFsc2UsXG4gICAgICAgIHByb2plY3Rvckluc3RhbmNlXG4gICAgfTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHMsIHByb2plY3Rvck9wdGlvbnMpO1xufVxuZnVuY3Rpb24gY2hlY2tTdHlsZVZhbHVlKHN0eWxlVmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHN0eWxlVmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU3R5bGUgdmFsdWVzIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHVwZGF0ZUV2ZW50KGRvbU5vZGUsIGV2ZW50TmFtZSwgY3VycmVudFZhbHVlLCBwcm9qZWN0aW9uT3B0aW9ucywgYmluZCwgcHJldmlvdXNWYWx1ZSkge1xuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcbiAgICBjb25zdCBldmVudE1hcCA9IHByb2plY3RvclN0YXRlLm5vZGVNYXAuZ2V0KGRvbU5vZGUpIHx8IG5ldyBXZWFrTWFwKCk7XG4gICAgaWYgKHByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNFdmVudCA9IGV2ZW50TWFwLmdldChwcmV2aW91c1ZhbHVlKTtcbiAgICAgICAgZG9tTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgcHJldmlvdXNFdmVudCk7XG4gICAgfVxuICAgIGxldCBjYWxsYmFjayA9IGN1cnJlbnRWYWx1ZS5iaW5kKGJpbmQpO1xuICAgIGlmIChldmVudE5hbWUgPT09ICdpbnB1dCcpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICAgICAgICBjdXJyZW50VmFsdWUuY2FsbCh0aGlzLCBldnQpO1xuICAgICAgICAgICAgZXZ0LnRhcmdldFsnb25pbnB1dC12YWx1ZSddID0gZXZ0LnRhcmdldC52YWx1ZTtcbiAgICAgICAgfS5iaW5kKGJpbmQpO1xuICAgIH1cbiAgICBkb21Ob2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBjYWxsYmFjayk7XG4gICAgZXZlbnRNYXAuc2V0KGN1cnJlbnRWYWx1ZSwgY2FsbGJhY2spO1xuICAgIHByb2plY3RvclN0YXRlLm5vZGVNYXAuc2V0KGRvbU5vZGUsIGV2ZW50TWFwKTtcbn1cbmZ1bmN0aW9uIGFkZENsYXNzZXMoZG9tTm9kZSwgY2xhc3Nlcykge1xuICAgIGlmIChjbGFzc2VzKSB7XG4gICAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBjbGFzc2VzLnNwbGl0KCcgJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZG9tTm9kZS5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZXNbaV0pO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gcmVtb3ZlQ2xhc3Nlcyhkb21Ob2RlLCBjbGFzc2VzKSB7XG4gICAgaWYgKGNsYXNzZXMpIHtcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IGNsYXNzZXMuc3BsaXQoJyAnKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGFzc05hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBkb21Ob2RlLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBidWlsZFByZXZpb3VzUHJvcGVydGllcyhkb21Ob2RlLCBwcmV2aW91cywgY3VycmVudCkge1xuICAgIGNvbnN0IHsgZGlmZlR5cGUsIHByb3BlcnRpZXMsIGF0dHJpYnV0ZXMgfSA9IGN1cnJlbnQ7XG4gICAgaWYgKCFkaWZmVHlwZSB8fCBkaWZmVHlwZSA9PT0gJ3Zkb20nKSB7XG4gICAgICAgIHJldHVybiB7IHByb3BlcnRpZXM6IHByZXZpb3VzLnByb3BlcnRpZXMsIGF0dHJpYnV0ZXM6IHByZXZpb3VzLmF0dHJpYnV0ZXMsIGV2ZW50czogcHJldmlvdXMuZXZlbnRzIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKGRpZmZUeXBlID09PSAnbm9uZScpIHtcbiAgICAgICAgcmV0dXJuIHsgcHJvcGVydGllczoge30sIGF0dHJpYnV0ZXM6IHByZXZpb3VzLmF0dHJpYnV0ZXMgPyB7fSA6IHVuZGVmaW5lZCwgZXZlbnRzOiBwcmV2aW91cy5ldmVudHMgfTtcbiAgICB9XG4gICAgbGV0IG5ld1Byb3BlcnRpZXMgPSB7XG4gICAgICAgIHByb3BlcnRpZXM6IHt9XG4gICAgfTtcbiAgICBpZiAoYXR0cmlidXRlcykge1xuICAgICAgICBuZXdQcm9wZXJ0aWVzLmF0dHJpYnV0ZXMgPSB7fTtcbiAgICAgICAgbmV3UHJvcGVydGllcy5ldmVudHMgPSBwcmV2aW91cy5ldmVudHM7XG4gICAgICAgIE9iamVjdC5rZXlzKHByb3BlcnRpZXMpLmZvckVhY2goKHByb3BOYW1lKSA9PiB7XG4gICAgICAgICAgICBuZXdQcm9wZXJ0aWVzLnByb3BlcnRpZXNbcHJvcE5hbWVdID0gZG9tTm9kZVtwcm9wTmFtZV07XG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKChhdHRyTmFtZSkgPT4ge1xuICAgICAgICAgICAgbmV3UHJvcGVydGllcy5hdHRyaWJ1dGVzW2F0dHJOYW1lXSA9IGRvbU5vZGUuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXdQcm9wZXJ0aWVzO1xuICAgIH1cbiAgICBuZXdQcm9wZXJ0aWVzLnByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5yZWR1Y2UoKHByb3BzLCBwcm9wZXJ0eSkgPT4ge1xuICAgICAgICBwcm9wc1twcm9wZXJ0eV0gPSBkb21Ob2RlLmdldEF0dHJpYnV0ZShwcm9wZXJ0eSkgfHwgZG9tTm9kZVtwcm9wZXJ0eV07XG4gICAgICAgIHJldHVybiBwcm9wcztcbiAgICB9LCB7fSk7XG4gICAgcmV0dXJuIG5ld1Byb3BlcnRpZXM7XG59XG5mdW5jdGlvbiBmb2N1c05vZGUocHJvcFZhbHVlLCBwcmV2aW91c1ZhbHVlLCBkb21Ob2RlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVzdWx0ID0gcHJvcFZhbHVlKCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBwcm9wVmFsdWUgJiYgIXByZXZpb3VzVmFsdWU7XG4gICAgfVxuICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xuICAgICAgICBwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgIGRvbU5vZGUuZm9jdXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVtb3ZlT3JwaGFuZWRFdmVudHMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucywgb25seUV2ZW50cyA9IGZhbHNlKSB7XG4gICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xuICAgIGNvbnN0IGV2ZW50TWFwID0gcHJvamVjdG9yU3RhdGUubm9kZU1hcC5nZXQoZG9tTm9kZSk7XG4gICAgaWYgKGV2ZW50TWFwKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHByZXZpb3VzUHJvcGVydGllcykuZm9yRWFjaCgocHJvcE5hbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzRXZlbnQgPSBwcm9wTmFtZS5zdWJzdHIoMCwgMikgPT09ICdvbicgfHwgb25seUV2ZW50cztcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IG9ubHlFdmVudHMgPyBwcm9wTmFtZSA6IHByb3BOYW1lLnN1YnN0cigyKTtcbiAgICAgICAgICAgIGlmIChpc0V2ZW50ICYmICFwcm9wZXJ0aWVzW3Byb3BOYW1lXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50Q2FsbGJhY2sgPSBldmVudE1hcC5nZXQocHJldmlvdXNQcm9wZXJ0aWVzW3Byb3BOYW1lXSk7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50Q2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiB1cGRhdGVBdHRyaWJ1dGUoZG9tTm9kZSwgYXR0ck5hbWUsIGF0dHJWYWx1ZSwgcHJvamVjdGlvbk9wdGlvbnMpIHtcbiAgICBpZiAocHJvamVjdGlvbk9wdGlvbnMubmFtZXNwYWNlID09PSBOQU1FU1BBQ0VfU1ZHICYmIGF0dHJOYW1lID09PSAnaHJlZicpIHtcbiAgICAgICAgZG9tTm9kZS5zZXRBdHRyaWJ1dGVOUyhOQU1FU1BBQ0VfWExJTkssIGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIGlmICgoYXR0ck5hbWUgPT09ICdyb2xlJyAmJiBhdHRyVmFsdWUgPT09ICcnKSB8fCBhdHRyVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkb21Ob2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBkb21Ob2RlLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0clZhbHVlKTtcbiAgICB9XG59XG5mdW5jdGlvbiB1cGRhdGVBdHRyaWJ1dGVzKGRvbU5vZGUsIHByZXZpb3VzQXR0cmlidXRlcywgYXR0cmlidXRlcywgcHJvamVjdGlvbk9wdGlvbnMpIHtcbiAgICBjb25zdCBhdHRyTmFtZXMgPSBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKTtcbiAgICBjb25zdCBhdHRyQ291bnQgPSBhdHRyTmFtZXMubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0ckNvdW50OyBpKyspIHtcbiAgICAgICAgY29uc3QgYXR0ck5hbWUgPSBhdHRyTmFtZXNbaV07XG4gICAgICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGF0dHJpYnV0ZXNbYXR0ck5hbWVdO1xuICAgICAgICBjb25zdCBwcmV2aW91c0F0dHJWYWx1ZSA9IHByZXZpb3VzQXR0cmlidXRlc1thdHRyTmFtZV07XG4gICAgICAgIGlmIChhdHRyVmFsdWUgIT09IHByZXZpb3VzQXR0clZhbHVlKSB7XG4gICAgICAgICAgICB1cGRhdGVBdHRyaWJ1dGUoZG9tTm9kZSwgYXR0ck5hbWUsIGF0dHJWYWx1ZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gdXBkYXRlUHJvcGVydGllcyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMsIHByb3BlcnRpZXMsIHByb2plY3Rpb25PcHRpb25zLCBpbmNsdWRlc0V2ZW50c0FuZEF0dHJpYnV0ZXMgPSB0cnVlKSB7XG4gICAgbGV0IHByb3BlcnRpZXNVcGRhdGVkID0gZmFsc2U7XG4gICAgY29uc3QgcHJvcE5hbWVzID0gT2JqZWN0LmtleXMocHJvcGVydGllcyk7XG4gICAgY29uc3QgcHJvcENvdW50ID0gcHJvcE5hbWVzLmxlbmd0aDtcbiAgICBpZiAocHJvcE5hbWVzLmluZGV4T2YoJ2NsYXNzZXMnKSA9PT0gLTEgJiYgcHJldmlvdXNQcm9wZXJ0aWVzLmNsYXNzZXMpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocHJldmlvdXNQcm9wZXJ0aWVzLmNsYXNzZXMpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZpb3VzUHJvcGVydGllcy5jbGFzc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3Nlcyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMuY2xhc3Nlc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZW1vdmVDbGFzc2VzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcy5jbGFzc2VzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbmNsdWRlc0V2ZW50c0FuZEF0dHJpYnV0ZXMgJiYgcmVtb3ZlT3JwaGFuZWRFdmVudHMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wQ291bnQ7IGkrKykge1xuICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHByb3BOYW1lc1tpXTtcbiAgICAgICAgbGV0IHByb3BWYWx1ZSA9IHByb3BlcnRpZXNbcHJvcE5hbWVdO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gcHJldmlvdXNQcm9wZXJ0aWVzW3Byb3BOYW1lXTtcbiAgICAgICAgaWYgKHByb3BOYW1lID09PSAnY2xhc3NlcycpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzQ2xhc3NlcyA9IEFycmF5LmlzQXJyYXkocHJldmlvdXNWYWx1ZSkgPyBwcmV2aW91c1ZhbHVlIDogW3ByZXZpb3VzVmFsdWVdO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudENsYXNzZXMgPSBBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkgPyBwcm9wVmFsdWUgOiBbcHJvcFZhbHVlXTtcbiAgICAgICAgICAgIGlmIChwcmV2aW91c0NsYXNzZXMgJiYgcHJldmlvdXNDbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoIXByb3BWYWx1ZSB8fCBwcm9wVmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldmlvdXNDbGFzc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDbGFzc2VzKGRvbU5vZGUsIHByZXZpb3VzQ2xhc3Nlc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NsYXNzZXMgPSBbLi4uY3VycmVudENsYXNzZXNdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZpb3VzQ2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNDbGFzc05hbWUgPSBwcmV2aW91c0NsYXNzZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNDbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGFzc0luZGV4ID0gbmV3Q2xhc3Nlcy5pbmRleE9mKHByZXZpb3VzQ2xhc3NOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3Nlcyhkb21Ob2RlLCBwcmV2aW91c0NsYXNzTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDbGFzc2VzLnNwbGljZShjbGFzc0luZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdDbGFzc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRDbGFzc2VzKGRvbU5vZGUsIG5ld0NsYXNzZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50Q2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBhZGRDbGFzc2VzKGRvbU5vZGUsIGN1cnJlbnRDbGFzc2VzW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocHJvcE5hbWUgPT09ICdmb2N1cycpIHtcbiAgICAgICAgICAgIGZvY3VzTm9kZShwcm9wVmFsdWUsIHByZXZpb3VzVmFsdWUsIGRvbU5vZGUsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwcm9wTmFtZSA9PT0gJ3N0eWxlcycpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlTmFtZXMgPSBPYmplY3Qua2V5cyhwcm9wVmFsdWUpO1xuICAgICAgICAgICAgY29uc3Qgc3R5bGVDb3VudCA9IHN0eWxlTmFtZXMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzdHlsZUNvdW50OyBqKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZU5hbWUgPSBzdHlsZU5hbWVzW2pdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1N0eWxlVmFsdWUgPSBwcm9wVmFsdWVbc3R5bGVOYW1lXTtcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRTdHlsZVZhbHVlID0gcHJldmlvdXNWYWx1ZSAmJiBwcmV2aW91c1ZhbHVlW3N0eWxlTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKG5ld1N0eWxlVmFsdWUgPT09IG9sZFN0eWxlVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXNVcGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAobmV3U3R5bGVWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjaGVja1N0eWxlVmFsdWUobmV3U3R5bGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb25PcHRpb25zLnN0eWxlQXBwbHllcihkb21Ob2RlLCBzdHlsZU5hbWUsIG5ld1N0eWxlVmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbk9wdGlvbnMuc3R5bGVBcHBseWVyKGRvbU5vZGUsIHN0eWxlTmFtZSwgJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghcHJvcFZhbHVlICYmIHR5cGVvZiBwcmV2aW91c1ZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHByb3BWYWx1ZSA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAndmFsdWUnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZG9tVmFsdWUgPSBkb21Ob2RlW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoZG9tVmFsdWUgIT09IHByb3BWYWx1ZSAmJlxuICAgICAgICAgICAgICAgICAgICAoZG9tTm9kZVsnb25pbnB1dC12YWx1ZSddXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGRvbVZhbHVlID09PSBkb21Ob2RlWydvbmlucHV0LXZhbHVlJ11cbiAgICAgICAgICAgICAgICAgICAgICAgIDogcHJvcFZhbHVlICE9PSBwcmV2aW91c1ZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBkb21Ob2RlW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgZG9tTm9kZVsnb25pbnB1dC12YWx1ZSddID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocHJvcFZhbHVlICE9PSBwcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNVcGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwcm9wTmFtZSAhPT0gJ2tleScgJiYgcHJvcFZhbHVlICE9PSBwcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IHR5cGVvZiBwcm9wVmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdmdW5jdGlvbicgJiYgcHJvcE5hbWUubGFzdEluZGV4T2YoJ29uJywgMCkgPT09IDAgJiYgaW5jbHVkZXNFdmVudHNBbmRBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUV2ZW50KGRvbU5vZGUsIHByb3BOYW1lLnN1YnN0cigyKSwgcHJvcFZhbHVlLCBwcm9qZWN0aW9uT3B0aW9ucywgcHJvcGVydGllcy5iaW5kLCBwcmV2aW91c1ZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgcHJvcE5hbWUgIT09ICdpbm5lckhUTUwnICYmIGluY2x1ZGVzRXZlbnRzQW5kQXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVBdHRyaWJ1dGUoZG9tTm9kZSwgcHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9wTmFtZSA9PT0gJ3Njcm9sbExlZnQnIHx8IHByb3BOYW1lID09PSAnc2Nyb2xsVG9wJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG9tTm9kZVtwcm9wTmFtZV0gIT09IHByb3BWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9tTm9kZVtwcm9wTmFtZV0gPSBwcm9wVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbU5vZGVbcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb3BlcnRpZXNVcGRhdGVkO1xufVxuZnVuY3Rpb24gZmluZEluZGV4T2ZDaGlsZChjaGlsZHJlbiwgc2FtZUFzLCBzdGFydCkge1xuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzYW1lKGNoaWxkcmVuW2ldLCBzYW1lQXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG5leHBvcnQgZnVuY3Rpb24gdG9QYXJlbnRWTm9kZShkb21Ob2RlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGFnOiAnJyxcbiAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIGNoaWxkcmVuOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbU5vZGUsXG4gICAgICAgIHR5cGU6IFZOT0RFXG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0b1RleHRWTm9kZShkYXRhKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGFnOiAnJyxcbiAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIGNoaWxkcmVuOiB1bmRlZmluZWQsXG4gICAgICAgIHRleHQ6IGAke2RhdGF9YCxcbiAgICAgICAgZG9tTm9kZTogdW5kZWZpbmVkLFxuICAgICAgICB0eXBlOiBWTk9ERVxuICAgIH07XG59XG5mdW5jdGlvbiB0b0ludGVybmFsV05vZGUoaW5zdGFuY2UsIGluc3RhbmNlRGF0YSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICByZW5kZXJlZDogW10sXG4gICAgICAgIGNvcmVQcm9wZXJ0aWVzOiBpbnN0YW5jZURhdGEuY29yZVByb3BlcnRpZXMsXG4gICAgICAgIGNoaWxkcmVuOiBpbnN0YW5jZS5jaGlsZHJlbixcbiAgICAgICAgd2lkZ2V0Q29uc3RydWN0b3I6IGluc3RhbmNlLmNvbnN0cnVjdG9yLFxuICAgICAgICBwcm9wZXJ0aWVzOiBpbnN0YW5jZURhdGEuaW5wdXRQcm9wZXJ0aWVzLFxuICAgICAgICB0eXBlOiBXTk9ERVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihjaGlsZHJlbiwgaW5zdGFuY2UpIHtcbiAgICBpZiAoY2hpbGRyZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZW1wdHlBcnJheTtcbiAgICB9XG4gICAgY2hpbGRyZW4gPSBBcnJheS5pc0FycmF5KGNoaWxkcmVuKSA/IGNoaWxkcmVuIDogW2NoaWxkcmVuXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDspIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQgfHwgY2hpbGQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuW2ldID0gdG9UZXh0Vk5vZGUoY2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGlzVk5vZGUoY2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLnByb3BlcnRpZXMuYmluZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLnByb3BlcnRpZXMuYmluZCA9IGluc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuY2hpbGRyZW4gJiYgY2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihjaGlsZC5jaGlsZHJlbiwgaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjaGlsZC5jb3JlUHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICBjaGlsZC5jb3JlUHJvcGVydGllcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQ6IGluc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVJlZ2lzdHJ5OiBpbnN0YW5jZURhdGEuY29yZVByb3BlcnRpZXMuYmFzZVJlZ2lzdHJ5XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5jaGlsZHJlbiAmJiBjaGlsZC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlckFuZERlY29yYXRlQ2hpbGRyZW4oY2hpbGQuY2hpbGRyZW4sIGluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaSsrO1xuICAgIH1cbiAgICByZXR1cm4gY2hpbGRyZW47XG59XG5mdW5jdGlvbiBub2RlQWRkZWQoZG5vZGUsIHRyYW5zaXRpb25zKSB7XG4gICAgaWYgKGlzVk5vZGUoZG5vZGUpICYmIGRub2RlLnByb3BlcnRpZXMpIHtcbiAgICAgICAgY29uc3QgZW50ZXJBbmltYXRpb24gPSBkbm9kZS5wcm9wZXJ0aWVzLmVudGVyQW5pbWF0aW9uO1xuICAgICAgICBpZiAoZW50ZXJBbmltYXRpb24pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZW50ZXJBbmltYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBlbnRlckFuaW1hdGlvbihkbm9kZS5kb21Ob2RlLCBkbm9kZS5wcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25zLmVudGVyKGRub2RlLmRvbU5vZGUsIGRub2RlLnByb3BlcnRpZXMsIGVudGVyQW5pbWF0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIG5vZGVUb1JlbW92ZShkbm9kZSwgdHJhbnNpdGlvbnMsIHByb2plY3Rpb25PcHRpb25zKSB7XG4gICAgaWYgKGlzV05vZGUoZG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IHJlbmRlcmVkID0gZG5vZGUucmVuZGVyZWQgfHwgZW1wdHlBcnJheTtcbiAgICAgICAgaWYgKGRub2RlLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQoZG5vZGUuaW5zdGFuY2UpO1xuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLm9uRGV0YWNoKCk7XG4gICAgICAgICAgICBpbnN0YW5jZU1hcC5kZWxldGUoZG5vZGUuaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVuZGVyZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG5vZGVUb1JlbW92ZShyZW5kZXJlZFtpXSwgdHJhbnNpdGlvbnMsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgZG9tTm9kZSA9IGRub2RlLmRvbU5vZGU7XG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBkbm9kZS5wcm9wZXJ0aWVzO1xuICAgICAgICBpZiAoZG5vZGUuY2hpbGRyZW4gJiYgZG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIG5vZGVUb1JlbW92ZShkbm9kZS5jaGlsZHJlbltpXSwgdHJhbnNpdGlvbnMsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleGl0QW5pbWF0aW9uID0gcHJvcGVydGllcy5leGl0QW5pbWF0aW9uO1xuICAgICAgICBpZiAocHJvcGVydGllcyAmJiBleGl0QW5pbWF0aW9uKSB7XG4gICAgICAgICAgICBkb21Ob2RlLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgICAgICAgICBjb25zdCByZW1vdmVEb21Ob2RlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGRvbU5vZGUgJiYgZG9tTm9kZS5wYXJlbnROb2RlICYmIGRvbU5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkb21Ob2RlKTtcbiAgICAgICAgICAgICAgICBkbm9kZS5kb21Ob2RlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXhpdEFuaW1hdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGV4aXRBbmltYXRpb24oZG9tTm9kZSwgcmVtb3ZlRG9tTm9kZSwgcHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbnMuZXhpdChkbm9kZS5kb21Ob2RlLCBwcm9wZXJ0aWVzLCBleGl0QW5pbWF0aW9uLCByZW1vdmVEb21Ob2RlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZG9tTm9kZSAmJiBkb21Ob2RlLnBhcmVudE5vZGUgJiYgZG9tTm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRvbU5vZGUpO1xuICAgICAgICBkbm9kZS5kb21Ob2RlID0gdW5kZWZpbmVkO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNoZWNrRGlzdGluZ3Vpc2hhYmxlKGNoaWxkTm9kZXMsIGluZGV4VG9DaGVjaywgcGFyZW50SW5zdGFuY2UpIHtcbiAgICBjb25zdCBjaGlsZE5vZGUgPSBjaGlsZE5vZGVzW2luZGV4VG9DaGVja107XG4gICAgaWYgKGlzVk5vZGUoY2hpbGROb2RlKSAmJiAhY2hpbGROb2RlLnRhZykge1xuICAgICAgICByZXR1cm47IC8vIFRleHQgbm9kZXMgbmVlZCBub3QgYmUgZGlzdGluZ3Vpc2hhYmxlXG4gICAgfVxuICAgIGNvbnN0IHsga2V5IH0gPSBjaGlsZE5vZGUucHJvcGVydGllcztcbiAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwga2V5ID09PSBudWxsKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGkgIT09IGluZGV4VG9DaGVjaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjaGlsZE5vZGVzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChzYW1lKG5vZGUsIGNoaWxkTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVJZGVudGlmaWVyO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnROYW1lID0gcGFyZW50SW5zdGFuY2UuY29uc3RydWN0b3IubmFtZSB8fCAndW5rbm93bic7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1dOb2RlKGNoaWxkTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVJZGVudGlmaWVyID0gY2hpbGROb2RlLndpZGdldENvbnN0cnVjdG9yLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUlkZW50aWZpZXIgPSBjaGlsZE5vZGUudGFnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgQSB3aWRnZXQgKCR7cGFyZW50TmFtZX0pIGhhcyBoYWQgYSBjaGlsZCBhZGRkZWQgb3IgcmVtb3ZlZCwgYnV0IHRoZXkgd2VyZSBub3QgYWJsZSB0byB1bmlxdWVseSBpZGVudGlmaWVkLiBJdCBpcyByZWNvbW1lbmRlZCB0byBwcm92aWRlIGEgdW5pcXVlICdrZXknIHByb3BlcnR5IHdoZW4gdXNpbmcgdGhlIHNhbWUgd2lkZ2V0IG9yIGVsZW1lbnQgKCR7bm9kZUlkZW50aWZpZXJ9KSBtdWx0aXBsZSB0aW1lcyBhcyBzaWJsaW5nc2ApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB1cGRhdGVDaGlsZHJlbihwYXJlbnRWTm9kZSwgb2xkQ2hpbGRyZW4sIG5ld0NoaWxkcmVuLCBwYXJlbnRJbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpIHtcbiAgICBvbGRDaGlsZHJlbiA9IG9sZENoaWxkcmVuIHx8IGVtcHR5QXJyYXk7XG4gICAgbmV3Q2hpbGRyZW4gPSBuZXdDaGlsZHJlbjtcbiAgICBjb25zdCBvbGRDaGlsZHJlbkxlbmd0aCA9IG9sZENoaWxkcmVuLmxlbmd0aDtcbiAgICBjb25zdCBuZXdDaGlsZHJlbkxlbmd0aCA9IG5ld0NoaWxkcmVuLmxlbmd0aDtcbiAgICBjb25zdCB0cmFuc2l0aW9ucyA9IHByb2plY3Rpb25PcHRpb25zLnRyYW5zaXRpb25zO1xuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcbiAgICBwcm9qZWN0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHByb2plY3Rpb25PcHRpb25zLCB7IGRlcHRoOiBwcm9qZWN0aW9uT3B0aW9ucy5kZXB0aCArIDEgfSk7XG4gICAgbGV0IG9sZEluZGV4ID0gMDtcbiAgICBsZXQgbmV3SW5kZXggPSAwO1xuICAgIGxldCBpO1xuICAgIGxldCB0ZXh0VXBkYXRlZCA9IGZhbHNlO1xuICAgIHdoaWxlIChuZXdJbmRleCA8IG5ld0NoaWxkcmVuTGVuZ3RoKSB7XG4gICAgICAgIGxldCBvbGRDaGlsZCA9IG9sZEluZGV4IDwgb2xkQ2hpbGRyZW5MZW5ndGggPyBvbGRDaGlsZHJlbltvbGRJbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IG5ld0NoaWxkID0gbmV3Q2hpbGRyZW5bbmV3SW5kZXhdO1xuICAgICAgICBpZiAoaXNWTm9kZShuZXdDaGlsZCkgJiYgdHlwZW9mIG5ld0NoaWxkLmRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBuZXdDaGlsZC5pbnNlcnRlZCA9IGlzVk5vZGUob2xkQ2hpbGQpICYmIG9sZENoaWxkLmluc2VydGVkO1xuICAgICAgICAgICAgYWRkRGVmZXJyZWRQcm9wZXJ0aWVzKG5ld0NoaWxkLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9sZENoaWxkICE9PSB1bmRlZmluZWQgJiYgc2FtZShvbGRDaGlsZCwgbmV3Q2hpbGQpKSB7XG4gICAgICAgICAgICB0ZXh0VXBkYXRlZCA9IHVwZGF0ZURvbShvbGRDaGlsZCwgbmV3Q2hpbGQsIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRWTm9kZSwgcGFyZW50SW5zdGFuY2UpIHx8IHRleHRVcGRhdGVkO1xuICAgICAgICAgICAgb2xkSW5kZXgrKztcbiAgICAgICAgICAgIG5ld0luZGV4Kys7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaW5kT2xkSW5kZXggPSBmaW5kSW5kZXhPZkNoaWxkKG9sZENoaWxkcmVuLCBuZXdDaGlsZCwgb2xkSW5kZXggKyAxKTtcbiAgICAgICAgY29uc3QgYWRkQ2hpbGQgPSAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgaW5zZXJ0QmVmb3JlRG9tTm9kZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IG9sZENoaWxkcmVuW29sZEluZGV4XTtcbiAgICAgICAgICAgIGlmIChjaGlsZCkge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0SW5kZXggPSBvbGRJbmRleCArIDE7XG4gICAgICAgICAgICAgICAgbGV0IGluc2VydEJlZm9yZUNoaWxkcmVuID0gW2NoaWxkXTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoaW5zZXJ0QmVmb3JlQ2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc2VydEJlZm9yZSA9IGluc2VydEJlZm9yZUNoaWxkcmVuLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1dOb2RlKGluc2VydEJlZm9yZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRCZWZvcmUucmVuZGVyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRCZWZvcmVDaGlsZHJlbi5wdXNoKC4uLmluc2VydEJlZm9yZS5yZW5kZXJlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlLmRvbU5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRCZWZvcmVEb21Ob2RlID0gaW5zZXJ0QmVmb3JlLmRvbU5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydEJlZm9yZUNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiBvbGRDaGlsZHJlbltuZXh0SW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRCZWZvcmVDaGlsZHJlbi5wdXNoKG9sZENoaWxkcmVuW25leHRJbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjcmVhdGVEb20obmV3Q2hpbGQsIHBhcmVudFZOb2RlLCBpbnNlcnRCZWZvcmVEb21Ob2RlLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UpO1xuICAgICAgICAgICAgbm9kZUFkZGVkKG5ld0NoaWxkLCB0cmFuc2l0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBpbmRleFRvQ2hlY2sgPSBuZXdJbmRleDtcbiAgICAgICAgICAgIHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNoZWNrRGlzdGluZ3Vpc2hhYmxlKG5ld0NoaWxkcmVuLCBpbmRleFRvQ2hlY2ssIHBhcmVudEluc3RhbmNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoIW9sZENoaWxkIHx8IGZpbmRPbGRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGFkZENoaWxkKCk7XG4gICAgICAgICAgICBuZXdJbmRleCsrO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVtb3ZlQ2hpbGQgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleFRvQ2hlY2sgPSBvbGRJbmRleDtcbiAgICAgICAgICAgIHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNoZWNrRGlzdGluZ3Vpc2hhYmxlKG9sZENoaWxkcmVuLCBpbmRleFRvQ2hlY2ssIHBhcmVudEluc3RhbmNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGlzV05vZGUob2xkQ2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGluc3RhbmNlTWFwLmdldChvbGRDaGlsZC5pbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgb2xkQ2hpbGQgPSBpdGVtLmRub2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGVUb1JlbW92ZShvbGRDaGlsZCwgdHJhbnNpdGlvbnMsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZmluZE5ld0luZGV4ID0gZmluZEluZGV4T2ZDaGlsZChuZXdDaGlsZHJlbiwgb2xkQ2hpbGQsIG5ld0luZGV4ICsgMSk7XG4gICAgICAgIGlmIChmaW5kTmV3SW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZW1vdmVDaGlsZCgpO1xuICAgICAgICAgICAgb2xkSW5kZXgrKztcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGFkZENoaWxkKCk7XG4gICAgICAgIHJlbW92ZUNoaWxkKCk7XG4gICAgICAgIG9sZEluZGV4Kys7XG4gICAgICAgIG5ld0luZGV4Kys7XG4gICAgfVxuICAgIGlmIChvbGRDaGlsZHJlbkxlbmd0aCA+IG9sZEluZGV4KSB7XG4gICAgICAgIC8vIFJlbW92ZSBjaGlsZCBmcmFnbWVudHNcbiAgICAgICAgZm9yIChpID0gb2xkSW5kZXg7IGkgPCBvbGRDaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleFRvQ2hlY2sgPSBpO1xuICAgICAgICAgICAgcHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2hlY2tEaXN0aW5ndWlzaGFibGUob2xkQ2hpbGRyZW4sIGluZGV4VG9DaGVjaywgcGFyZW50SW5zdGFuY2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZXQgY2hpbGRUb1JlbW92ZSA9IG9sZENoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKGlzV05vZGUoY2hpbGRUb1JlbW92ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gaW5zdGFuY2VNYXAuZ2V0KGNoaWxkVG9SZW1vdmUuaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkVG9SZW1vdmUgPSBpdGVtLmRub2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGVUb1JlbW92ZShjaGlsZFRvUmVtb3ZlLCB0cmFuc2l0aW9ucywgcHJvamVjdGlvbk9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0ZXh0VXBkYXRlZDtcbn1cbmZ1bmN0aW9uIGFkZENoaWxkcmVuKHBhcmVudFZOb2RlLCBjaGlsZHJlbiwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudEluc3RhbmNlLCBpbnNlcnRCZWZvcmUgPSB1bmRlZmluZWQsIGNoaWxkTm9kZXMpIHtcbiAgICBpZiAoY2hpbGRyZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcbiAgICBpZiAocHJvamVjdG9yU3RhdGUubWVyZ2UgJiYgY2hpbGROb2RlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNoaWxkTm9kZXMgPSBhcnJheUZyb20ocGFyZW50Vk5vZGUuZG9tTm9kZS5jaGlsZE5vZGVzKTtcbiAgICB9XG4gICAgY29uc3QgdHJhbnNpdGlvbnMgPSBwcm9qZWN0aW9uT3B0aW9ucy50cmFuc2l0aW9ucztcbiAgICBwcm9qZWN0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHByb2plY3Rpb25PcHRpb25zLCB7IGRlcHRoOiBwcm9qZWN0aW9uT3B0aW9ucy5kZXB0aCArIDEgfSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICBpZiAoaXNWTm9kZShjaGlsZCkpIHtcbiAgICAgICAgICAgIGlmIChwcm9qZWN0b3JTdGF0ZS5tZXJnZSAmJiBjaGlsZE5vZGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRvbUVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGNoaWxkLmRvbU5vZGUgPT09IHVuZGVmaW5lZCAmJiBjaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCA9IGNoaWxkTm9kZXMuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbUVsZW1lbnQgJiYgZG9tRWxlbWVudC50YWdOYW1lID09PSAoY2hpbGQudGFnLnRvVXBwZXJDYXNlKCkgfHwgdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZG9tTm9kZSA9IGRvbUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjcmVhdGVEb20oY2hpbGQsIHBhcmVudFZOb2RlLCBpbnNlcnRCZWZvcmUsIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRJbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjcmVhdGVEb20oY2hpbGQsIHBhcmVudFZOb2RlLCBpbnNlcnRCZWZvcmUsIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRJbnN0YW5jZSwgY2hpbGROb2Rlcyk7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZUFkZGVkKGNoaWxkLCB0cmFuc2l0aW9ucyk7XG4gICAgfVxufVxuZnVuY3Rpb24gaW5pdFByb3BlcnRpZXNBbmRDaGlsZHJlbihkb21Ob2RlLCBkbm9kZSwgcGFyZW50SW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKSB7XG4gICAgYWRkQ2hpbGRyZW4oZG5vZGUsIGRub2RlLmNoaWxkcmVuLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UsIHVuZGVmaW5lZCk7XG4gICAgaWYgKHR5cGVvZiBkbm9kZS5kZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyAmJiBkbm9kZS5pbnNlcnRlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFkZERlZmVycmVkUHJvcGVydGllcyhkbm9kZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoZG5vZGUuYXR0cmlidXRlcyAmJiBkbm9kZS5ldmVudHMpIHtcbiAgICAgICAgdXBkYXRlQXR0cmlidXRlcyhkb21Ob2RlLCB7fSwgZG5vZGUuYXR0cmlidXRlcywgcHJvamVjdGlvbk9wdGlvbnMpO1xuICAgICAgICB1cGRhdGVQcm9wZXJ0aWVzKGRvbU5vZGUsIHt9LCBkbm9kZS5wcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucywgZmFsc2UpO1xuICAgICAgICByZW1vdmVPcnBoYW5lZEV2ZW50cyhkb21Ob2RlLCB7fSwgZG5vZGUuZXZlbnRzLCBwcm9qZWN0aW9uT3B0aW9ucywgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IGV2ZW50cyA9IGRub2RlLmV2ZW50cztcbiAgICAgICAgT2JqZWN0LmtleXMoZXZlbnRzKS5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgICAgICAgdXBkYXRlRXZlbnQoZG9tTm9kZSwgZXZlbnQsIGV2ZW50c1tldmVudF0sIHByb2plY3Rpb25PcHRpb25zLCBkbm9kZS5wcm9wZXJ0aWVzLmJpbmQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHVwZGF0ZVByb3BlcnRpZXMoZG9tTm9kZSwge30sIGRub2RlLnByb3BlcnRpZXMsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKGRub2RlLnByb3BlcnRpZXMua2V5ICE9PSBudWxsICYmIGRub2RlLnByb3BlcnRpZXMua2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHBhcmVudEluc3RhbmNlKTtcbiAgICAgICAgaW5zdGFuY2VEYXRhLm5vZGVIYW5kbGVyLmFkZChkb21Ob2RlLCBgJHtkbm9kZS5wcm9wZXJ0aWVzLmtleX1gKTtcbiAgICB9XG4gICAgZG5vZGUuaW5zZXJ0ZWQgPSB0cnVlO1xufVxuZnVuY3Rpb24gY3JlYXRlRG9tKGRub2RlLCBwYXJlbnRWTm9kZSwgaW5zZXJ0QmVmb3JlLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UsIGNoaWxkTm9kZXMpIHtcbiAgICBsZXQgZG9tTm9kZTtcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XG4gICAgaWYgKGlzV05vZGUoZG5vZGUpKSB7XG4gICAgICAgIGxldCB7IHdpZGdldENvbnN0cnVjdG9yIH0gPSBkbm9kZTtcbiAgICAgICAgY29uc3QgcGFyZW50SW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHBhcmVudEluc3RhbmNlKTtcbiAgICAgICAgaWYgKCFpc1dpZGdldEJhc2VDb25zdHJ1Y3Rvcih3aWRnZXRDb25zdHJ1Y3RvcikpIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBwYXJlbnRJbnN0YW5jZURhdGEucmVnaXN0cnkoKS5nZXQod2lkZ2V0Q29uc3RydWN0b3IpO1xuICAgICAgICAgICAgaWYgKGl0ZW0gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aWRnZXRDb25zdHJ1Y3RvciA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgd2lkZ2V0Q29uc3RydWN0b3IoKTtcbiAgICAgICAgZG5vZGUuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgaW5zdGFuY2VEYXRhLmludmFsaWRhdGUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpbnN0YW5jZURhdGEuZGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcHJvamVjdG9yU3RhdGUucmVuZGVyUXVldWUucHVzaCh7IGluc3RhbmNlLCBkZXB0aDogcHJvamVjdGlvbk9wdGlvbnMuZGVwdGggfSk7XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVSZW5kZXIocHJvamVjdGlvbk9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpbnN0YW5jZURhdGEucmVuZGVyaW5nID0gdHJ1ZTtcbiAgICAgICAgaW5zdGFuY2UuX19zZXRDb3JlUHJvcGVydGllc19fKGRub2RlLmNvcmVQcm9wZXJ0aWVzKTtcbiAgICAgICAgaW5zdGFuY2UuX19zZXRDaGlsZHJlbl9fKGRub2RlLmNoaWxkcmVuKTtcbiAgICAgICAgaW5zdGFuY2UuX19zZXRQcm9wZXJ0aWVzX18oZG5vZGUucHJvcGVydGllcyk7XG4gICAgICAgIGNvbnN0IHJlbmRlcmVkID0gaW5zdGFuY2UuX19yZW5kZXJfXygpO1xuICAgICAgICBpbnN0YW5jZURhdGEucmVuZGVyaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChyZW5kZXJlZCkge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRSZW5kZXJlZCA9IGZpbHRlckFuZERlY29yYXRlQ2hpbGRyZW4ocmVuZGVyZWQsIGluc3RhbmNlKTtcbiAgICAgICAgICAgIGRub2RlLnJlbmRlcmVkID0gZmlsdGVyZWRSZW5kZXJlZDtcbiAgICAgICAgICAgIGFkZENoaWxkcmVuKHBhcmVudFZOb2RlLCBmaWx0ZXJlZFJlbmRlcmVkLCBwcm9qZWN0aW9uT3B0aW9ucywgaW5zdGFuY2UsIGluc2VydEJlZm9yZSwgY2hpbGROb2Rlcyk7XG4gICAgICAgIH1cbiAgICAgICAgaW5zdGFuY2VNYXAuc2V0KGluc3RhbmNlLCB7IGRub2RlLCBwYXJlbnRWTm9kZSB9KTtcbiAgICAgICAgaW5zdGFuY2VEYXRhLm5vZGVIYW5kbGVyLmFkZFJvb3QoKTtcbiAgICAgICAgcHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICBpbnN0YW5jZURhdGEub25BdHRhY2goKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAocHJvamVjdG9yU3RhdGUubWVyZ2UgJiYgcHJvamVjdG9yU3RhdGUubWVyZ2VFbGVtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlID0gcHJvamVjdGlvbk9wdGlvbnMubWVyZ2VFbGVtZW50O1xuICAgICAgICAgICAgcHJvamVjdG9yU3RhdGUubWVyZ2VFbGVtZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaW5pdFByb3BlcnRpZXNBbmRDaGlsZHJlbihkb21Ob2RlLCBkbm9kZSwgcGFyZW50SW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb2MgPSBwYXJlbnRWTm9kZS5kb21Ob2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGlmICghZG5vZGUudGFnICYmIHR5cGVvZiBkbm9kZS50ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKGRub2RlLmRvbU5vZGUgIT09IHVuZGVmaW5lZCAmJiBwYXJlbnRWTm9kZS5kb21Ob2RlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3RG9tTm9kZSA9IGRub2RlLmRvbU5vZGUub3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkbm9kZS50ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50Vk5vZGUuZG9tTm9kZSA9PT0gZG5vZGUuZG9tTm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFZOb2RlLmRvbU5vZGUucmVwbGFjZUNoaWxkKG5ld0RvbU5vZGUsIGRub2RlLmRvbU5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Vk5vZGUuZG9tTm9kZS5hcHBlbmRDaGlsZChuZXdEb21Ob2RlKTtcbiAgICAgICAgICAgICAgICAgICAgZG5vZGUuZG9tTm9kZS5wYXJlbnROb2RlICYmIGRub2RlLmRvbU5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkbm9kZS5kb21Ob2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZG5vZGUuZG9tTm9kZSA9IG5ld0RvbU5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb21Ob2RlID0gZG5vZGUuZG9tTm9kZSA9IGRvYy5jcmVhdGVUZXh0Tm9kZShkbm9kZS50ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Vk5vZGUuZG9tTm9kZS5pbnNlcnRCZWZvcmUoZG9tTm9kZSwgaW5zZXJ0QmVmb3JlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFZOb2RlLmRvbU5vZGUuYXBwZW5kQ2hpbGQoZG9tTm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRub2RlLmRvbU5vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmIChkbm9kZS50YWcgPT09ICdzdmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb25PcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvamVjdGlvbk9wdGlvbnMsIHsgbmFtZXNwYWNlOiBOQU1FU1BBQ0VfU1ZHIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocHJvamVjdGlvbk9wdGlvbnMubmFtZXNwYWNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tTm9kZSA9IGRub2RlLmRvbU5vZGUgPSBkb2MuY3JlYXRlRWxlbWVudE5TKHByb2plY3Rpb25PcHRpb25zLm5hbWVzcGFjZSwgZG5vZGUudGFnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlID0gZG5vZGUuZG9tTm9kZSB8fCBkb2MuY3JlYXRlRWxlbWVudChkbm9kZS50YWcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5pdFByb3BlcnRpZXNBbmRDaGlsZHJlbihkb21Ob2RlLCBkbm9kZSwgcGFyZW50SW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgICAgIGlmIChpbnNlcnRCZWZvcmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHBhcmVudFZOb2RlLmRvbU5vZGUuaW5zZXJ0QmVmb3JlKGRvbU5vZGUsIGluc2VydEJlZm9yZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChkb21Ob2RlLnBhcmVudE5vZGUgIT09IHBhcmVudFZOb2RlLmRvbU5vZGUpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRWTm9kZS5kb21Ob2RlLmFwcGVuZENoaWxkKGRvbU5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gdXBkYXRlRG9tKHByZXZpb3VzLCBkbm9kZSwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudFZOb2RlLCBwYXJlbnRJbnN0YW5jZSkge1xuICAgIGlmIChpc1dOb2RlKGRub2RlKSkge1xuICAgICAgICBjb25zdCB7IGluc3RhbmNlIH0gPSBwcmV2aW91cztcbiAgICAgICAgY29uc3QgeyBwYXJlbnRWTm9kZSwgZG5vZGU6IG5vZGUgfSA9IGluc3RhbmNlTWFwLmdldChpbnN0YW5jZSk7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzUmVuZGVyZWQgPSBub2RlID8gbm9kZS5yZW5kZXJlZCA6IHByZXZpb3VzLnJlbmRlcmVkO1xuICAgICAgICBjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpO1xuICAgICAgICBpbnN0YW5jZURhdGEucmVuZGVyaW5nID0gdHJ1ZTtcbiAgICAgICAgaW5zdGFuY2UuX19zZXRDb3JlUHJvcGVydGllc19fKGRub2RlLmNvcmVQcm9wZXJ0aWVzKTtcbiAgICAgICAgaW5zdGFuY2UuX19zZXRDaGlsZHJlbl9fKGRub2RlLmNoaWxkcmVuKTtcbiAgICAgICAgaW5zdGFuY2UuX19zZXRQcm9wZXJ0aWVzX18oZG5vZGUucHJvcGVydGllcyk7XG4gICAgICAgIGRub2RlLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgIGlmIChpbnN0YW5jZURhdGEuZGlydHkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVkID0gaW5zdGFuY2UuX19yZW5kZXJfXygpO1xuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgZG5vZGUucmVuZGVyZWQgPSBmaWx0ZXJBbmREZWNvcmF0ZUNoaWxkcmVuKHJlbmRlcmVkLCBpbnN0YW5jZSk7XG4gICAgICAgICAgICB1cGRhdGVDaGlsZHJlbihwYXJlbnRWTm9kZSwgcHJldmlvdXNSZW5kZXJlZCwgZG5vZGUucmVuZGVyZWQsIGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpbnN0YW5jZURhdGEucmVuZGVyaW5nID0gZmFsc2U7XG4gICAgICAgICAgICBkbm9kZS5yZW5kZXJlZCA9IHByZXZpb3VzUmVuZGVyZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaW5zdGFuY2VNYXAuc2V0KGluc3RhbmNlLCB7IGRub2RlLCBwYXJlbnRWTm9kZSB9KTtcbiAgICAgICAgaW5zdGFuY2VEYXRhLm5vZGVIYW5kbGVyLmFkZFJvb3QoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChwcmV2aW91cyA9PT0gZG5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb21Ob2RlID0gKGRub2RlLmRvbU5vZGUgPSBwcmV2aW91cy5kb21Ob2RlKTtcbiAgICAgICAgbGV0IHRleHRVcGRhdGVkID0gZmFsc2U7XG4gICAgICAgIGxldCB1cGRhdGVkID0gZmFsc2U7XG4gICAgICAgIGlmICghZG5vZGUudGFnICYmIHR5cGVvZiBkbm9kZS50ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKGRub2RlLnRleHQgIT09IHByZXZpb3VzLnRleHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdEb21Ob2RlID0gZG9tTm9kZS5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRub2RlLnRleHQpO1xuICAgICAgICAgICAgICAgIGRvbU5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobmV3RG9tTm9kZSwgZG9tTm9kZSk7XG4gICAgICAgICAgICAgICAgZG5vZGUuZG9tTm9kZSA9IG5ld0RvbU5vZGU7XG4gICAgICAgICAgICAgICAgdGV4dFVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0VXBkYXRlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkbm9kZS50YWcgJiYgZG5vZGUudGFnLmxhc3RJbmRleE9mKCdzdmcnLCAwKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHByb2plY3Rpb25PcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvamVjdGlvbk9wdGlvbnMsIHsgbmFtZXNwYWNlOiBOQU1FU1BBQ0VfU1ZHIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByZXZpb3VzLmNoaWxkcmVuICE9PSBkbm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihkbm9kZS5jaGlsZHJlbiwgcGFyZW50SW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIGRub2RlLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgICAgICAgICAgdXBkYXRlZCA9XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNoaWxkcmVuKGRub2RlLCBwcmV2aW91cy5jaGlsZHJlbiwgY2hpbGRyZW4sIHBhcmVudEluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucykgfHwgdXBkYXRlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzUHJvcGVydGllcyA9IGJ1aWxkUHJldmlvdXNQcm9wZXJ0aWVzKGRvbU5vZGUsIHByZXZpb3VzLCBkbm9kZSk7XG4gICAgICAgICAgICBpZiAoZG5vZGUuYXR0cmlidXRlcyAmJiBkbm9kZS5ldmVudHMpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVBdHRyaWJ1dGVzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcy5hdHRyaWJ1dGVzLCBkbm9kZS5hdHRyaWJ1dGVzLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgdXBkYXRlZCA9XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVByb3BlcnRpZXMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLnByb3BlcnRpZXMsIGRub2RlLnByb3BlcnRpZXMsIHByb2plY3Rpb25PcHRpb25zLCBmYWxzZSkgfHwgdXBkYXRlZDtcbiAgICAgICAgICAgICAgICByZW1vdmVPcnBoYW5lZEV2ZW50cyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMuZXZlbnRzLCBkbm9kZS5ldmVudHMsIHByb2plY3Rpb25PcHRpb25zLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudHMgPSBkbm9kZS5ldmVudHM7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZXZlbnRzKS5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVFdmVudChkb21Ob2RlLCBldmVudCwgZXZlbnRzW2V2ZW50XSwgcHJvamVjdGlvbk9wdGlvbnMsIGRub2RlLnByb3BlcnRpZXMuYmluZCwgcHJldmlvdXNQcm9wZXJ0aWVzLmV2ZW50c1tldmVudF0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlZCA9XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVByb3BlcnRpZXMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLnByb3BlcnRpZXMsIGRub2RlLnByb3BlcnRpZXMsIHByb2plY3Rpb25PcHRpb25zKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkbm9kZS5wcm9wZXJ0aWVzLmtleSAhPT0gbnVsbCAmJiBkbm9kZS5wcm9wZXJ0aWVzLmtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHBhcmVudEluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZURhdGEubm9kZUhhbmRsZXIuYWRkKGRvbU5vZGUsIGAke2Rub2RlLnByb3BlcnRpZXMua2V5fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkICYmIGRub2RlLnByb3BlcnRpZXMgJiYgZG5vZGUucHJvcGVydGllcy51cGRhdGVBbmltYXRpb24pIHtcbiAgICAgICAgICAgIGRub2RlLnByb3BlcnRpZXMudXBkYXRlQW5pbWF0aW9uKGRvbU5vZGUsIGRub2RlLnByb3BlcnRpZXMsIHByZXZpb3VzLnByb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gYWRkRGVmZXJyZWRQcm9wZXJ0aWVzKHZub2RlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xuICAgIC8vIHRyYW5zZmVyIGFueSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBiZWVuIHBhc3NlZCAtIGFzIHRoZXNlIG11c3QgYmUgZGVjb3JhdGVkIHByb3BlcnRpZXNcbiAgICB2bm9kZS5kZWNvcmF0ZWREZWZlcnJlZFByb3BlcnRpZXMgPSB2bm9kZS5wcm9wZXJ0aWVzO1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSB2bm9kZS5kZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayghIXZub2RlLmluc2VydGVkKTtcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XG4gICAgdm5vZGUucHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oe30sIHByb3BlcnRpZXMsIHZub2RlLmRlY29yYXRlZERlZmVycmVkUHJvcGVydGllcyk7XG4gICAgcHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3MucHVzaCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3QuYXNzaWduKHt9LCB2bm9kZS5kZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayghIXZub2RlLmluc2VydGVkKSwgdm5vZGUuZGVjb3JhdGVkRGVmZXJyZWRQcm9wZXJ0aWVzKTtcbiAgICAgICAgdXBkYXRlUHJvcGVydGllcyh2bm9kZS5kb21Ob2RlLCB2bm9kZS5wcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgIHZub2RlLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gcnVuRGVmZXJyZWRSZW5kZXJDYWxsYmFja3MocHJvamVjdGlvbk9wdGlvbnMpIHtcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XG4gICAgaWYgKHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICBpZiAocHJvamVjdGlvbk9wdGlvbnMuc3luYykge1xuICAgICAgICAgICAgd2hpbGUgKHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gcHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZ2xvYmFsLnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBydW5BZnRlclJlbmRlckNhbGxiYWNrcyhwcm9qZWN0aW9uT3B0aW9ucykge1xuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcbiAgICBpZiAocHJvamVjdGlvbk9wdGlvbnMuc3luYykge1xuICAgICAgICB3aGlsZSAocHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnNoaWZ0KCk7XG4gICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoZ2xvYmFsLnJlcXVlc3RJZGxlQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIGdsb2JhbC5yZXF1ZXN0SWRsZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICB3aGlsZSAocHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gcHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHdoaWxlIChwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gc2NoZWR1bGVSZW5kZXIocHJvamVjdGlvbk9wdGlvbnMpIHtcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XG4gICAgaWYgKHByb2plY3Rpb25PcHRpb25zLnN5bmMpIHtcbiAgICAgICAgcmVuZGVyKHByb2plY3Rpb25PcHRpb25zKTtcbiAgICB9XG4gICAgZWxzZSBpZiAocHJvamVjdG9yU3RhdGUucmVuZGVyU2NoZWR1bGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHJvamVjdG9yU3RhdGUucmVuZGVyU2NoZWR1bGVkID0gZ2xvYmFsLnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICByZW5kZXIocHJvamVjdGlvbk9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiByZW5kZXIocHJvamVjdGlvbk9wdGlvbnMpIHtcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XG4gICAgcHJvamVjdG9yU3RhdGUucmVuZGVyU2NoZWR1bGVkID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlbmRlclF1ZXVlID0gcHJvamVjdG9yU3RhdGUucmVuZGVyUXVldWU7XG4gICAgY29uc3QgcmVuZGVycyA9IFsuLi5yZW5kZXJRdWV1ZV07XG4gICAgcHJvamVjdG9yU3RhdGUucmVuZGVyUXVldWUgPSBbXTtcbiAgICByZW5kZXJzLnNvcnQoKGEsIGIpID0+IGEuZGVwdGggLSBiLmRlcHRoKTtcbiAgICBjb25zdCBwcmV2aW91c2x5UmVuZGVyZWQgPSBbXTtcbiAgICB3aGlsZSAocmVuZGVycy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgeyBpbnN0YW5jZSB9ID0gcmVuZGVycy5zaGlmdCgpO1xuICAgICAgICBpZiAoaW5zdGFuY2VNYXAuaGFzKGluc3RhbmNlKSAmJiBwcmV2aW91c2x5UmVuZGVyZWQuaW5kZXhPZihpbnN0YW5jZSkgPT09IC0xKSB7XG4gICAgICAgICAgICBwcmV2aW91c2x5UmVuZGVyZWQucHVzaChpbnN0YW5jZSk7XG4gICAgICAgICAgICBjb25zdCB7IHBhcmVudFZOb2RlLCBkbm9kZSB9ID0gaW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldChpbnN0YW5jZSk7XG4gICAgICAgICAgICB1cGRhdGVEb20oZG5vZGUsIHRvSW50ZXJuYWxXTm9kZShpbnN0YW5jZSwgaW5zdGFuY2VEYXRhKSwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudFZOb2RlLCBpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcnVuQWZ0ZXJSZW5kZXJDYWxsYmFja3MocHJvamVjdGlvbk9wdGlvbnMpO1xuICAgIHJ1bkRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzKHByb2plY3Rpb25PcHRpb25zKTtcbn1cbmV4cG9ydCBjb25zdCBkb20gPSB7XG4gICAgYXBwZW5kOiBmdW5jdGlvbiAocGFyZW50Tm9kZSwgaW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgY29uc3QgZmluYWxQcm9qZWN0b3JPcHRpb25zID0gZ2V0UHJvamVjdGlvbk9wdGlvbnMocHJvamVjdGlvbk9wdGlvbnMsIGluc3RhbmNlKTtcbiAgICAgICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSB7XG4gICAgICAgICAgICBhZnRlclJlbmRlckNhbGxiYWNrczogW10sXG4gICAgICAgICAgICBkZWZlcnJlZFJlbmRlckNhbGxiYWNrczogW10sXG4gICAgICAgICAgICBub2RlTWFwOiBuZXcgV2Vha01hcCgpLFxuICAgICAgICAgICAgcmVuZGVyU2NoZWR1bGVkOiB1bmRlZmluZWQsXG4gICAgICAgICAgICByZW5kZXJRdWV1ZTogW10sXG4gICAgICAgICAgICBtZXJnZTogcHJvamVjdGlvbk9wdGlvbnMubWVyZ2UgfHwgZmFsc2UsXG4gICAgICAgICAgICBtZXJnZUVsZW1lbnQ6IHByb2plY3Rpb25PcHRpb25zLm1lcmdlRWxlbWVudFxuICAgICAgICB9O1xuICAgICAgICBwcm9qZWN0b3JTdGF0ZU1hcC5zZXQoaW5zdGFuY2UsIHByb2plY3RvclN0YXRlKTtcbiAgICAgICAgZmluYWxQcm9qZWN0b3JPcHRpb25zLnJvb3ROb2RlID0gcGFyZW50Tm9kZTtcbiAgICAgICAgY29uc3QgcGFyZW50Vk5vZGUgPSB0b1BhcmVudFZOb2RlKGZpbmFsUHJvamVjdG9yT3B0aW9ucy5yb290Tm9kZSk7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0b0ludGVybmFsV05vZGUoaW5zdGFuY2UsIGluc3RhbmNlRGF0YSk7XG4gICAgICAgIGluc3RhbmNlTWFwLnNldChpbnN0YW5jZSwgeyBkbm9kZTogbm9kZSwgcGFyZW50Vk5vZGUgfSk7XG4gICAgICAgIGluc3RhbmNlRGF0YS5pbnZhbGlkYXRlID0gKCkgPT4ge1xuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZURhdGEucmVuZGVyaW5nID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHByb2plY3RvclN0YXRlLnJlbmRlclF1ZXVlLnB1c2goeyBpbnN0YW5jZSwgZGVwdGg6IGZpbmFsUHJvamVjdG9yT3B0aW9ucy5kZXB0aCB9KTtcbiAgICAgICAgICAgICAgICBzY2hlZHVsZVJlbmRlcihmaW5hbFByb2plY3Rvck9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB1cGRhdGVEb20obm9kZSwgbm9kZSwgZmluYWxQcm9qZWN0b3JPcHRpb25zLCBwYXJlbnRWTm9kZSwgaW5zdGFuY2UpO1xuICAgICAgICBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5vbkF0dGFjaCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcnVuRGVmZXJyZWRSZW5kZXJDYWxsYmFja3MoZmluYWxQcm9qZWN0b3JPcHRpb25zKTtcbiAgICAgICAgcnVuQWZ0ZXJSZW5kZXJDYWxsYmFja3MoZmluYWxQcm9qZWN0b3JPcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbU5vZGU6IGZpbmFsUHJvamVjdG9yT3B0aW9ucy5yb290Tm9kZVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgY3JlYXRlOiBmdW5jdGlvbiAoaW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwgaW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICB9LFxuICAgIG1lcmdlOiBmdW5jdGlvbiAoZWxlbWVudCwgaW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zID0ge30pIHtcbiAgICAgICAgcHJvamVjdGlvbk9wdGlvbnMubWVyZ2UgPSB0cnVlO1xuICAgICAgICBwcm9qZWN0aW9uT3B0aW9ucy5tZXJnZUVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uID0gdGhpcy5hcHBlbmQoZWxlbWVudC5wYXJlbnROb2RlLCBpbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xuICAgICAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChpbnN0YW5jZSk7XG4gICAgICAgIHByb2plY3RvclN0YXRlLm1lcmdlID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBwcm9qZWN0aW9uO1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD12ZG9tLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS92ZG9tLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvdmRvbS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiLyoqKiBJTVBPUlRTIEZST00gaW1wb3J0cy1sb2FkZXIgKioqL1xudmFyIHdpZGdldEZhY3RvcnkgPSByZXF1aXJlKFwic3JjL21lbnUvTWVudVwiKTtcblxudmFyIHJlZ2lzdGVyQ3VzdG9tRWxlbWVudCA9IHJlcXVpcmUoJ0Bkb2pvL3dpZGdldC1jb3JlL3JlZ2lzdGVyQ3VzdG9tRWxlbWVudCcpLmRlZmF1bHQ7XG5cbnZhciBkZWZhdWx0RXhwb3J0ID0gd2lkZ2V0RmFjdG9yeS5kZWZhdWx0O1xuZGVmYXVsdEV4cG9ydCAmJiByZWdpc3RlckN1c3RvbUVsZW1lbnQoZGVmYXVsdEV4cG9ydCk7XG5cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2ltcG9ydHMtbG9hZGVyP3dpZGdldEZhY3Rvcnk9c3JjL21lbnUvTWVudSEuL25vZGVfbW9kdWxlcy9AZG9qby9jbGktYnVpbGQtd2lkZ2V0L3RlbXBsYXRlL2N1c3RvbS1lbGVtZW50LmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9pbXBvcnRzLWxvYWRlci9pbmRleC5qcz93aWRnZXRGYWN0b3J5PXNyYy9tZW51L01lbnUhLi9ub2RlX21vZHVsZXMvQGRvam8vY2xpLWJ1aWxkLXdpZGdldC90ZW1wbGF0ZS9jdXN0b20tZWxlbWVudC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcclxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcclxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuXHJcblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxyXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxyXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxyXG5cclxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXHJcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDApXHJcbiAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUocmVzdWx0LnZhbHVlKTsgfSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSB5W29wWzBdICYgMiA/IFwicmV0dXJuXCIgOiBvcFswXSA/IFwidGhyb3dcIiA6IFwibmV4dFwiXSkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbMCwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIGV4cG9ydHMpIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKCFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBleHBvcnRzW3BdID0gbVtwXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgIH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChvW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9OyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpIHx8ICgxLGV2YWwpKFwidGhpc1wiKTtcbn0gY2F0Y2goZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZih0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKVxuXHRcdGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vICh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvd2VicGFjay9idWlsZGluL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgeyB2IH0gZnJvbSAnQGRvam8vd2lkZ2V0LWNvcmUvZCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9jdXN0b21FbGVtZW50JztcbmltcG9ydCB7IFdpZGdldFByb3BlcnRpZXMsIFdOb2RlIH0gZnJvbSAnQGRvam8vd2lkZ2V0LWNvcmUvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyB0aGVtZSwgVGhlbWVkTWl4aW4gfSBmcm9tICdAZG9qby93aWRnZXQtY29yZS9taXhpbnMvVGhlbWVkJztcbmltcG9ydCB7IFdpZGdldEJhc2UgfSBmcm9tICdAZG9qby93aWRnZXQtY29yZS9XaWRnZXRCYXNlJztcbmltcG9ydCB7IE1lbnVJdGVtLCBNZW51SXRlbVByb3BlcnRpZXMgfSBmcm9tICcuLi9tZW51LWl0ZW0vTWVudUl0ZW0nO1xuXG5pbXBvcnQgKiBhcyBjc3MgZnJvbSAnLi9tZW51Lm0uY3NzJztcblxuaW50ZXJmYWNlIE1lbnVQcm9wZXJ0aWVzIGV4dGVuZHMgV2lkZ2V0UHJvcGVydGllcyB7XG5cdG9uU2VsZWN0ZWQ6IChkYXRhOiBhbnkpID0+IHZvaWQ7XG59XG5cbkBjdXN0b21FbGVtZW50PE1lbnVQcm9wZXJ0aWVzPih7XG5cdHRhZzogJ2RlbW8tbWVudScsXG5cdGV2ZW50czogWydvblNlbGVjdGVkJ11cbn0pXG5AdGhlbWUoY3NzKVxuZXhwb3J0IGNsYXNzIE1lbnUgZXh0ZW5kcyBUaGVtZWRNaXhpbihXaWRnZXRCYXNlKTxNZW51UHJvcGVydGllcywgV05vZGU8TWVudUl0ZW0+PiB7XG5cdHByaXZhdGUgX3NlbGVjdGVkSWQ6IG51bWJlcjtcblxuXHRwcml2YXRlIF9vblNlbGVjdGVkKGlkOiBudW1iZXIsIGRhdGE6IGFueSkge1xuXHRcdHRoaXMuX3NlbGVjdGVkSWQgPSBpZDtcblx0XHR0aGlzLnByb3BlcnRpZXMub25TZWxlY3RlZChkYXRhKTtcblx0XHR0aGlzLmludmFsaWRhdGUoKTtcblx0fVxuXG5cdHByb3RlY3RlZCByZW5kZXIoKSB7XG5cdFx0Y29uc3QgaXRlbXMgPSB0aGlzLmNoaWxkcmVuLm1hcCgoY2hpbGQsIGluZGV4KSA9PiB7XG5cdFx0XHRpZiAoY2hpbGQpIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydGllczogUGFydGlhbDxNZW51SXRlbVByb3BlcnRpZXM+ID0ge1xuXHRcdFx0XHRcdG9uU2VsZWN0ZWQ6IChkYXRhOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMuX29uU2VsZWN0ZWQoaW5kZXgsIGRhdGEpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKHRoaXMuX3NlbGVjdGVkSWQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHByb3BlcnRpZXMuc2VsZWN0ZWQgPSBpbmRleCA9PT0gdGhpcy5fc2VsZWN0ZWRJZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRjaGlsZC5wcm9wZXJ0aWVzID0geyAuLi5jaGlsZC5wcm9wZXJ0aWVzLCAuLi5wcm9wZXJ0aWVzIH07XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY2hpbGQ7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gdignbmF2JywgeyBjbGFzc2VzOiB0aGlzLnRoZW1lKGNzcy5yb290KSB9LCBbXG5cdFx0XHR2KFxuXHRcdFx0XHQnb2wnLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y2xhc3NlczogdGhpcy50aGVtZShjc3MubWVudUNvbnRhaW5lcilcblx0XHRcdFx0fSxcblx0XHRcdFx0aXRlbXNcblx0XHRcdClcblx0XHRdKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBNZW51O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWR0cy1sb2FkZXI/dHlwZT10cyZpbnN0YW5jZU5hbWU9MF9tZW51IS4vc3JjL21lbnUvTWVudS50cyIsIi8vIHJlbW92ZWQgYnkgZXh0cmFjdC10ZXh0LXdlYnBhY2stcGx1Z2luXG5tb2R1bGUuZXhwb3J0cyA9IHtcIiBfa2V5XCI6XCJ0ZXN0LWFwcC9tZW51XCIsXCJyb290XCI6XCJtZW51LW1fX3Jvb3RfXzNiQTZqXCIsXCJtZW51Q29udGFpbmVyXCI6XCJtZW51LW1fX21lbnVDb250YWluZXJfXzFlb0dmXCJ9O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL21lbnUvbWVudS5tLmNzc1xuLy8gbW9kdWxlIGlkID0gLi9zcmMvbWVudS9tZW51Lm0uY3NzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgN2UwYjEwNDFkMDFlMDBjYzljYjMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9jb3JlL0Rlc3Ryb3lhYmxlLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL2NvcmUvRXZlbnRlZC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9jb3JlL2xhbmcubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvaGFzL2hhcy5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL01hcC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL1Byb21pc2UubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9TeW1ib2wubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9XZWFrTWFwLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vYXJyYXkubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9nbG9iYWwubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9pdGVyYXRvci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL251bWJlci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL29iamVjdC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL3N0cmluZy5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL3N1cHBvcnQvaGFzLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vc3VwcG9ydC9xdWV1ZS5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL3N1cHBvcnQvdXRpbC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9JbmplY3Rvci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9Ob2RlSGFuZGxlci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9SZWdpc3RyeS5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9SZWdpc3RyeUhhbmRsZXIubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvV2lkZ2V0QmFzZS5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9hbmltYXRpb25zL2Nzc1RyYW5zaXRpb25zLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2QubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9hZnRlclJlbmRlci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2Fsd2F5c1JlbmRlci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2JlZm9yZVByb3BlcnRpZXMubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9jdXN0b21FbGVtZW50Lm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvZGlmZlByb3BlcnR5Lm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaGFuZGxlRGVjb3JhdG9yLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaW5qZWN0Lm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RpZmYubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvbWl4aW5zL1Byb2plY3Rvci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9taXhpbnMvVGhlbWVkLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL3JlZ2lzdGVyQ3VzdG9tRWxlbWVudC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS92ZG9tLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vY2xpLWJ1aWxkLXdpZGdldC90ZW1wbGF0ZS9jdXN0b20tZWxlbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbWVudS9NZW51LnRzIiwid2VicGFjazovLy8uL3NyYy9tZW51L21lbnUubS5jc3M/ZWMxMSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUFzRCwrREFBK0Q7O0FBRXJIO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7QUM3RGdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEIsaUJBQWlCLE9BQU87QUFDeEI7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvQkFBb0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQSx3Qzs7Ozs7Ozs7Ozs7QUN2REE7QUFDc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsZ0NBQWdDO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2RWlCO0FBQ0E7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiwyQkFBMkI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLG9CQUFvQjtBQUMzQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsaUM7Ozs7Ozs7Ozs7OztBQ25NQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLE9BQU8saUJBQWlCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QixxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7Ozs7O0FDdE1BO0FBQ0E7QUFDNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsSUFBSTtBQUNwQixnQkFBZ0IsT0FBTztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxJQUFJO0FBQ2hCLFlBQVksVUFBVTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxtQzs7Ozs7Ozs7Ozs7OztBQ2hKQTtBQUNzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxxQkFBcUI7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGdDQUFnQztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlHQTtBQUNrQztBQUNQO0FBQzNCO0FBQ3FCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3RELG9EQUFvRDtBQUNwRCxpREFBaUQ7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRUFBcUU7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsc0JBQXNCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFlBQVk7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLFNBQVM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0M7Ozs7Ozs7O0FDdlBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG1DOzs7Ozs7Ozs7Ozs7Ozs7QUNqQkE7QUFDaUQ7QUFDakQsb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDOzs7Ozs7Ozs7Ozs7O0FDOUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyREE7QUFDQTtBQUNtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0Q7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLElBQUk7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlHQTtBQUNBO0FBQ3FCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELFlBQVk7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RkFBd0Y7QUFDeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DOzs7Ozs7Ozs7OztBQ3hTbUI7QUFDbkI7MEVBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsRUFBRTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCxFQUFFO0FBQ2pFLG1DQUFtQyxtQkFBbUI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxnQzs7Ozs7Ozs7Ozs7QUNyS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFBQTtBQUFBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4RUFBOEU7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFBQTtBQUFBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsZ0NBQWdDLG1CQUFtQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxrQzs7Ozs7Ozs7O0FDekxBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQzs7Ozs7Ozs7O0FDdEJrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQSxxQzs7Ozs7Ozs7Ozs7QUNwQmtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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O0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsc0JBQXNCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFVBQVU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2THRDO0FBQUE7QUFDQTtBQUNBLCtEQUErRDtBQUMvRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTSxnQkFBZ0Isc0NBQXNDLGlC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QU0sRUFBRSxDQUFDLFlBQVksQ0FBQztLQUN0QixDQUFDO0lBQ0QsZ0dBQUssQ0FBQyx5Q0FBRyxDQUFDO0dBQ0UsSUFBSSxDQW1DaEI7QUFuQ2dCO0FBcUNqQiwrREFBZSxJQUFJLEVBQUM7Ozs7Ozs7O0FDdkRwQjtBQUNBLGtCQUFrQixxRyIsImZpbGUiOiJtZW51LTEuMC4wLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgN2UwYjEwNDFkMDFlMDBjYzljYjMiLCJpbXBvcnQgeyBjcmVhdGVDb21wb3NpdGVIYW5kbGUgfSBmcm9tICcuL2xhbmcnO1xuaW1wb3J0IFByb21pc2UgZnJvbSAnLi4vc2hpbS9Qcm9taXNlJztcbi8qKlxuICogTm8gb3BlcmF0aW9uIGZ1bmN0aW9uIHRvIHJlcGxhY2Ugb3duIG9uY2UgaW5zdGFuY2UgaXMgZGVzdG9yeWVkXG4gKi9cbmZ1bmN0aW9uIG5vb3AoKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG59XG4vKipcbiAqIE5vIG9wIGZ1bmN0aW9uIHVzZWQgdG8gcmVwbGFjZSBvd24sIG9uY2UgaW5zdGFuY2UgaGFzIGJlZW4gZGVzdG9yeWVkXG4gKi9cbmZ1bmN0aW9uIGRlc3Ryb3llZCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbGwgbWFkZSB0byBkZXN0cm95ZWQgbWV0aG9kJyk7XG59XG5leHBvcnQgY2xhc3MgRGVzdHJveWFibGUge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmhhbmRsZXMgPSBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgaGFuZGxlcyBmb3IgdGhlIGluc3RhbmNlIHRoYXQgd2lsbCBiZSBkZXN0cm95ZWQgd2hlbiBgdGhpcy5kZXN0cm95YCBpcyBjYWxsZWRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SGFuZGxlfSBoYW5kbGUgVGhlIGhhbmRsZSB0byBhZGQgZm9yIHRoZSBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtIYW5kbGV9IGEgaGFuZGxlIGZvciB0aGUgaGFuZGxlLCByZW1vdmVzIHRoZSBoYW5kbGUgZm9yIHRoZSBpbnN0YW5jZSBhbmQgY2FsbHMgZGVzdHJveVxuICAgICAqL1xuICAgIG93bihoYW5kbGVzKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZSA9IEFycmF5LmlzQXJyYXkoaGFuZGxlcykgPyBjcmVhdGVDb21wb3NpdGVIYW5kbGUoLi4uaGFuZGxlcykgOiBoYW5kbGVzO1xuICAgICAgICBjb25zdCB7IGhhbmRsZXM6IF9oYW5kbGVzIH0gPSB0aGlzO1xuICAgICAgICBfaGFuZGxlcy5wdXNoKGhhbmRsZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZXN0cm95KCkge1xuICAgICAgICAgICAgICAgIF9oYW5kbGVzLnNwbGljZShfaGFuZGxlcy5pbmRleE9mKGhhbmRsZSkpO1xuICAgICAgICAgICAgICAgIGhhbmRsZS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlc3RycHlzIGFsbCBoYW5kZXJzIHJlZ2lzdGVyZWQgZm9yIHRoZSBpbnN0YW5jZVxuICAgICAqXG4gICAgICogQHJldHVybnMge1Byb21pc2U8YW55fSBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIGFsbCBoYW5kbGVzIGhhdmUgYmVlbiBkZXN0cm95ZWRcbiAgICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlcy5mb3JFYWNoKChoYW5kbGUpID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGUgJiYgaGFuZGxlLmRlc3Ryb3kgJiYgaGFuZGxlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95ID0gbm9vcDtcbiAgICAgICAgICAgIHRoaXMub3duID0gZGVzdHJveWVkO1xuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgRGVzdHJveWFibGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZXN0cm95YWJsZS5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL2NvcmUvRGVzdHJveWFibGUubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvY29yZS9EZXN0cm95YWJsZS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IE1hcCBmcm9tICcuLi9zaGltL01hcCc7XG5pbXBvcnQgeyBEZXN0cm95YWJsZSB9IGZyb20gJy4vRGVzdHJveWFibGUnO1xuLyoqXG4gKiBNYXAgb2YgY29tcHV0ZWQgcmVndWxhciBleHByZXNzaW9ucywga2V5ZWQgYnkgc3RyaW5nXG4gKi9cbmNvbnN0IHJlZ2V4TWFwID0gbmV3IE1hcCgpO1xuLyoqXG4gKiBEZXRlcm1pbmVzIGlzIHRoZSBldmVudCB0eXBlIGdsb2IgaGFzIGJlZW4gbWF0Y2hlZFxuICpcbiAqIEByZXR1cm5zIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgaWYgdGhlIGdsb2IgaXMgbWF0Y2hlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNHbG9iTWF0Y2goZ2xvYlN0cmluZywgdGFyZ2V0U3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiB0YXJnZXRTdHJpbmcgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBnbG9iU3RyaW5nID09PSAnc3RyaW5nJyAmJiBnbG9iU3RyaW5nLmluZGV4T2YoJyonKSAhPT0gLTEpIHtcbiAgICAgICAgbGV0IHJlZ2V4O1xuICAgICAgICBpZiAocmVnZXhNYXAuaGFzKGdsb2JTdHJpbmcpKSB7XG4gICAgICAgICAgICByZWdleCA9IHJlZ2V4TWFwLmdldChnbG9iU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlZ2V4ID0gbmV3IFJlZ0V4cChgXiR7Z2xvYlN0cmluZy5yZXBsYWNlKC9cXCovZywgJy4qJyl9JGApO1xuICAgICAgICAgICAgcmVnZXhNYXAuc2V0KGdsb2JTdHJpbmcsIHJlZ2V4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVnZXgudGVzdCh0YXJnZXRTdHJpbmcpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGdsb2JTdHJpbmcgPT09IHRhcmdldFN0cmluZztcbiAgICB9XG59XG4vKipcbiAqIEV2ZW50IENsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudGVkIGV4dGVuZHMgRGVzdHJveWFibGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogbWFwIG9mIGxpc3RlbmVycyBrZXllZCBieSBldmVudCB0eXBlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmxpc3RlbmVyc01hcCA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgZW1pdChldmVudCkge1xuICAgICAgICB0aGlzLmxpc3RlbmVyc01hcC5mb3JFYWNoKChtZXRob2RzLCB0eXBlKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNHbG9iTWF0Y2godHlwZSwgZXZlbnQudHlwZSkpIHtcbiAgICAgICAgICAgICAgICBbLi4ubWV0aG9kc10uZm9yRWFjaCgobWV0aG9kKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZC5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxpc3RlbmVyKSkge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlcyA9IGxpc3RlbmVyLm1hcCgobGlzdGVuZXIpID0+IHRoaXMuX2FkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXMuZm9yRWFjaCgoaGFuZGxlKSA9PiBoYW5kbGUuZGVzdHJveSgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7XG4gICAgfVxuICAgIF9hZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyc01hcC5nZXQodHlwZSkgfHwgW107XG4gICAgICAgIGxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnNNYXAuc2V0KHR5cGUsIGxpc3RlbmVycyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZXN0cm95OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnNNYXAuZ2V0KHR5cGUpIHx8IFtdO1xuICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UobGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBFdmVudGVkO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXZlbnRlZC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL2NvcmUvRXZlbnRlZC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9jb3JlL0V2ZW50ZWQubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCB7IGFzc2lnbiB9IGZyb20gJy4uL3NoaW0vb2JqZWN0JztcbmV4cG9ydCB7IGFzc2lnbiB9IGZyb20gJy4uL3NoaW0vb2JqZWN0JztcbmNvbnN0IHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuY29uc3QgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuLyoqXG4gKiBUeXBlIGd1YXJkIHRoYXQgZW5zdXJlcyB0aGF0IHRoZSB2YWx1ZSBjYW4gYmUgY29lcmNlZCB0byBPYmplY3RcbiAqIHRvIHdlZWQgb3V0IGhvc3Qgb2JqZWN0cyB0aGF0IGRvIG5vdCBkZXJpdmUgZnJvbSBPYmplY3QuXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2hlY2sgaWYgd2Ugd2FudCB0byBkZWVwIGNvcHkgYW4gb2JqZWN0IG9yIG5vdC5cbiAqIE5vdGU6IEluIEVTNiBpdCBpcyBwb3NzaWJsZSB0byBtb2RpZnkgYW4gb2JqZWN0J3MgU3ltYm9sLnRvU3RyaW5nVGFnIHByb3BlcnR5LCB3aGljaCB3aWxsXG4gKiBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkIGJ5IGB0b1N0cmluZ2AuIFRoaXMgaXMgYSByYXJlIGVkZ2UgY2FzZSB0aGF0IGlzIGRpZmZpY3VsdCB0byBoYW5kbGUsXG4gKiBzbyBpdCBpcyBub3QgaGFuZGxlZCBoZXJlLlxuICogQHBhcmFtICB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm4gICAgICAgSWYgdGhlIHZhbHVlIGlzIGNvZXJjaWJsZSBpbnRvIGFuIE9iamVjdFxuICovXG5mdW5jdGlvbiBzaG91bGREZWVwQ29weU9iamVjdCh2YWx1ZSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJztcbn1cbmZ1bmN0aW9uIGNvcHlBcnJheShhcnJheSwgaW5oZXJpdGVkKSB7XG4gICAgcmV0dXJuIGFycmF5Lm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvcHlBcnJheShpdGVtLCBpbmhlcml0ZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhc2hvdWxkRGVlcENvcHlPYmplY3QoaXRlbSlcbiAgICAgICAgICAgID8gaXRlbVxuICAgICAgICAgICAgOiBfbWl4aW4oe1xuICAgICAgICAgICAgICAgIGRlZXA6IHRydWUsXG4gICAgICAgICAgICAgICAgaW5oZXJpdGVkOiBpbmhlcml0ZWQsXG4gICAgICAgICAgICAgICAgc291cmNlczogW2l0ZW1dLFxuICAgICAgICAgICAgICAgIHRhcmdldDoge31cbiAgICAgICAgICAgIH0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gX21peGluKGt3QXJncykge1xuICAgIGNvbnN0IGRlZXAgPSBrd0FyZ3MuZGVlcDtcbiAgICBjb25zdCBpbmhlcml0ZWQgPSBrd0FyZ3MuaW5oZXJpdGVkO1xuICAgIGNvbnN0IHRhcmdldCA9IGt3QXJncy50YXJnZXQ7XG4gICAgY29uc3QgY29waWVkID0ga3dBcmdzLmNvcGllZCB8fCBbXTtcbiAgICBjb25zdCBjb3BpZWRDbG9uZSA9IFsuLi5jb3BpZWRdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga3dBcmdzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0ga3dBcmdzLnNvdXJjZXNbaV07XG4gICAgICAgIGlmIChzb3VyY2UgPT09IG51bGwgfHwgc291cmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChpbmhlcml0ZWQgfHwgaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoY29waWVkQ2xvbmUuaW5kZXhPZih2YWx1ZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGVlcCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY29weUFycmF5KHZhbHVlLCBpbmhlcml0ZWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNob3VsZERlZXBDb3B5T2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0VmFsdWUgPSB0YXJnZXRba2V5XSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZC5wdXNoKHNvdXJjZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF9taXhpbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0ZWQ6IGluaGVyaXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzOiBbdmFsdWVdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0VmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSwgLi4ubWl4aW5zKSB7XG4gICAgaWYgKCFtaXhpbnMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdsYW5nLmNyZWF0ZSByZXF1aXJlcyBhdCBsZWFzdCBvbmUgbWl4aW4gb2JqZWN0LicpO1xuICAgIH1cbiAgICBjb25zdCBhcmdzID0gbWl4aW5zLnNsaWNlKCk7XG4gICAgYXJncy51bnNoaWZ0KE9iamVjdC5jcmVhdGUocHJvdG90eXBlKSk7XG4gICAgcmV0dXJuIGFzc2lnbi5hcHBseShudWxsLCBhcmdzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWVwQXNzaWduKHRhcmdldCwgLi4uc291cmNlcykge1xuICAgIHJldHVybiBfbWl4aW4oe1xuICAgICAgICBkZWVwOiB0cnVlLFxuICAgICAgICBpbmhlcml0ZWQ6IGZhbHNlLFxuICAgICAgICBzb3VyY2VzOiBzb3VyY2VzLFxuICAgICAgICB0YXJnZXQ6IHRhcmdldFxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBNaXhpbih0YXJnZXQsIC4uLnNvdXJjZXMpIHtcbiAgICByZXR1cm4gX21peGluKHtcbiAgICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgICAgaW5oZXJpdGVkOiB0cnVlLFxuICAgICAgICBzb3VyY2VzOiBzb3VyY2VzLFxuICAgICAgICB0YXJnZXQ6IHRhcmdldFxuICAgIH0pO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG9iamVjdCB1c2luZyB0aGUgcHJvdmlkZWQgc291cmNlJ3MgcHJvdG90eXBlIGFzIHRoZSBwcm90b3R5cGUgZm9yIHRoZSBuZXcgb2JqZWN0LCBhbmQgdGhlblxuICogZGVlcCBjb3BpZXMgdGhlIHByb3ZpZGVkIHNvdXJjZSdzIHZhbHVlcyBpbnRvIHRoZSBuZXcgdGFyZ2V0LlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCB0byBkdXBsaWNhdGVcbiAqIEByZXR1cm4gVGhlIG5ldyBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGR1cGxpY2F0ZShzb3VyY2UpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihzb3VyY2UpKTtcbiAgICByZXR1cm4gZGVlcE1peGluKHRhcmdldCwgc291cmNlKTtcbn1cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHR3byB2YWx1ZXMgYXJlIHRoZSBzYW1lIHZhbHVlLlxuICpcbiAqIEBwYXJhbSBhIEZpcnN0IHZhbHVlIHRvIGNvbXBhcmVcbiAqIEBwYXJhbSBiIFNlY29uZCB2YWx1ZSB0byBjb21wYXJlXG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlcyBhcmUgdGhlIHNhbWU7IGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJZGVudGljYWwoYSwgYikge1xuICAgIHJldHVybiAoYSA9PT0gYiB8fFxuICAgICAgICAvKiBib3RoIHZhbHVlcyBhcmUgTmFOICovXG4gICAgICAgIChhICE9PSBhICYmIGIgIT09IGIpKTtcbn1cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgYmluZHMgYSBtZXRob2QgdG8gdGhlIHNwZWNpZmllZCBvYmplY3QgYXQgcnVudGltZS4gVGhpcyBpcyBzaW1pbGFyIHRvXG4gKiBgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRgLCBidXQgaW5zdGVhZCBvZiBhIGZ1bmN0aW9uIGl0IHRha2VzIHRoZSBuYW1lIG9mIGEgbWV0aG9kIG9uIGFuIG9iamVjdC5cbiAqIEFzIGEgcmVzdWx0LCB0aGUgZnVuY3Rpb24gcmV0dXJuZWQgYnkgYGxhdGVCaW5kYCB3aWxsIGFsd2F5cyBjYWxsIHRoZSBmdW5jdGlvbiBjdXJyZW50bHkgYXNzaWduZWQgdG9cbiAqIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgb24gdGhlIG9iamVjdCBhcyBvZiB0aGUgbW9tZW50IHRoZSBmdW5jdGlvbiBpdCByZXR1cm5zIGlzIGNhbGxlZC5cbiAqXG4gKiBAcGFyYW0gaW5zdGFuY2UgVGhlIGNvbnRleHQgb2JqZWN0XG4gKiBAcGFyYW0gbWV0aG9kIFRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgb24gdGhlIGNvbnRleHQgb2JqZWN0IHRvIGJpbmQgdG8gaXRzZWxmXG4gKiBAcGFyYW0gc3VwcGxpZWRBcmdzIEFuIG9wdGlvbmFsIGFycmF5IG9mIHZhbHVlcyB0byBwcmVwZW5kIHRvIHRoZSBgaW5zdGFuY2VbbWV0aG9kXWAgYXJndW1lbnRzIGxpc3RcbiAqIEByZXR1cm4gVGhlIGJvdW5kIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXRlQmluZChpbnN0YW5jZSwgbWV0aG9kLCAuLi5zdXBwbGllZEFyZ3MpIHtcbiAgICByZXR1cm4gc3VwcGxpZWRBcmdzLmxlbmd0aFxuICAgICAgICA/IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID8gc3VwcGxpZWRBcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpIDogc3VwcGxpZWRBcmdzO1xuICAgICAgICAgICAgLy8gVFM3MDE3XG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VbbWV0aG9kXS5hcHBseShpbnN0YW5jZSwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBUUzcwMTdcbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZVttZXRob2RdLmFwcGx5KGluc3RhbmNlLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1peGluKHRhcmdldCwgLi4uc291cmNlcykge1xuICAgIHJldHVybiBfbWl4aW4oe1xuICAgICAgICBkZWVwOiBmYWxzZSxcbiAgICAgICAgaW5oZXJpdGVkOiB0cnVlLFxuICAgICAgICBzb3VyY2VzOiBzb3VyY2VzLFxuICAgICAgICB0YXJnZXQ6IHRhcmdldFxuICAgIH0pO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gd2hpY2ggaW52b2tlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzIHByZXBlbmRlZCB0byBpdHMgYXJndW1lbnQgbGlzdC5cbiAqIExpa2UgYEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kYCwgYnV0IGRvZXMgbm90IGFsdGVyIGV4ZWN1dGlvbiBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSB0YXJnZXRGdW5jdGlvbiBUaGUgZnVuY3Rpb24gdGhhdCBuZWVkcyB0byBiZSBib3VuZFxuICogQHBhcmFtIHN1cHBsaWVkQXJncyBBbiBvcHRpb25hbCBhcnJheSBvZiBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aGUgYHRhcmdldEZ1bmN0aW9uYCBhcmd1bWVudHMgbGlzdFxuICogQHJldHVybiBUaGUgYm91bmQgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnRpYWwodGFyZ2V0RnVuY3Rpb24sIC4uLnN1cHBsaWVkQXJncykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID8gc3VwcGxpZWRBcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpIDogc3VwcGxpZWRBcmdzO1xuICAgICAgICByZXR1cm4gdGFyZ2V0RnVuY3Rpb24uYXBwbHkodGhpcywgYXJncyk7XG4gICAgfTtcbn1cbi8qKlxuICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIGRlc3Ryb3kgbWV0aG9kIHRoYXQsIHdoZW4gY2FsbGVkLCBjYWxscyB0aGUgcGFzc2VkLWluIGRlc3RydWN0b3IuXG4gKiBUaGlzIGlzIGludGVuZGVkIHRvIHByb3ZpZGUgYSB1bmlmaWVkIGludGVyZmFjZSBmb3IgY3JlYXRpbmcgXCJyZW1vdmVcIiAvIFwiZGVzdHJveVwiIGhhbmRsZXJzIGZvclxuICogZXZlbnQgbGlzdGVuZXJzLCB0aW1lcnMsIGV0Yy5cbiAqXG4gKiBAcGFyYW0gZGVzdHJ1Y3RvciBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgaGFuZGxlJ3MgYGRlc3Ryb3lgIG1ldGhvZCBpcyBpbnZva2VkXG4gKiBAcmV0dXJuIFRoZSBoYW5kbGUgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIYW5kbGUoZGVzdHJ1Y3Rvcikge1xuICAgIGxldCBjYWxsZWQgPSBmYWxzZTtcbiAgICByZXR1cm4ge1xuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZGVzdHJ1Y3RvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cbi8qKlxuICogUmV0dXJucyBhIHNpbmdsZSBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCB0byBkZXN0cm95IG11bHRpcGxlIGhhbmRsZXMgc2ltdWx0YW5lb3VzbHkuXG4gKlxuICogQHBhcmFtIGhhbmRsZXMgQW4gYXJyYXkgb2YgaGFuZGxlcyB3aXRoIGBkZXN0cm95YCBtZXRob2RzXG4gKiBAcmV0dXJuIFRoZSBoYW5kbGUgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb21wb3NpdGVIYW5kbGUoLi4uaGFuZGxlcykge1xuICAgIHJldHVybiBjcmVhdGVIYW5kbGUoZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhhbmRsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGhhbmRsZXNbaV0uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sYW5nLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvY29yZS9sYW5nLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL2NvcmUvbGFuZy5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiZnVuY3Rpb24gaXNGZWF0dXJlVGVzdFRoZW5hYmxlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICYmIHZhbHVlLnRoZW47XG59XG4vKipcbiAqIEEgY2FjaGUgb2YgcmVzdWx0cyBvZiBmZWF0dXJlIHRlc3RzXG4gKi9cbmV4cG9ydCBjb25zdCB0ZXN0Q2FjaGUgPSB7fTtcbi8qKlxuICogQSBjYWNoZSBvZiB0aGUgdW4tcmVzb2x2ZWQgZmVhdHVyZSB0ZXN0c1xuICovXG5leHBvcnQgY29uc3QgdGVzdEZ1bmN0aW9ucyA9IHt9O1xuLyoqXG4gKiBBIGNhY2hlIG9mIHVucmVzb2x2ZWQgdGhlbmFibGVzIChwcm9iYWJseSBwcm9taXNlcylcbiAqIEB0eXBlIHt7fX1cbiAqL1xuY29uc3QgdGVzdFRoZW5hYmxlcyA9IHt9O1xuLyoqXG4gKiBBIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIHNjb3BlIChgd2luZG93YCBpbiBhIGJyb3dzZXIsIGBnbG9iYWxgIGluIE5vZGVKUylcbiAqL1xuY29uc3QgZ2xvYmFsU2NvcGUgPSAoZnVuY3Rpb24gKCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIEJyb3dzZXJzXG4gICAgICAgIHJldHVybiB3aW5kb3c7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIE5vZGVcbiAgICAgICAgcmV0dXJuIGdsb2JhbDtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIFdlYiB3b3JrZXJzXG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiB7fTtcbn0pKCk7XG4vKiBHcmFiIHRoZSBzdGF0aWNGZWF0dXJlcyBpZiB0aGVyZSBhcmUgYXZhaWxhYmxlICovXG5jb25zdCB7IHN0YXRpY0ZlYXR1cmVzIH0gPSBnbG9iYWxTY29wZS5Eb2pvSGFzRW52aXJvbm1lbnQgfHwge307XG4vKiBDbGVhbmluZyB1cCB0aGUgRG9qb0hhc0Vudmlvcm5tZW50ICovXG5pZiAoJ0Rvam9IYXNFbnZpcm9ubWVudCcgaW4gZ2xvYmFsU2NvcGUpIHtcbiAgICBkZWxldGUgZ2xvYmFsU2NvcGUuRG9qb0hhc0Vudmlyb25tZW50O1xufVxuLyoqXG4gKiBDdXN0b20gdHlwZSBndWFyZCB0byBuYXJyb3cgdGhlIGBzdGF0aWNGZWF0dXJlc2AgdG8gZWl0aGVyIGEgbWFwIG9yIGEgZnVuY3Rpb24gdGhhdFxuICogcmV0dXJucyBhIG1hcC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGd1YXJkIGZvclxuICovXG5mdW5jdGlvbiBpc1N0YXRpY0ZlYXR1cmVGdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XG59XG4vKipcbiAqIFRoZSBjYWNoZSBvZiBhc3NlcnRlZCBmZWF0dXJlcyB0aGF0IHdlcmUgYXZhaWxhYmxlIGluIHRoZSBnbG9iYWwgc2NvcGUgd2hlbiB0aGVcbiAqIG1vZHVsZSBsb2FkZWRcbiAqL1xuY29uc3Qgc3RhdGljQ2FjaGUgPSBzdGF0aWNGZWF0dXJlc1xuICAgID8gaXNTdGF0aWNGZWF0dXJlRnVuY3Rpb24oc3RhdGljRmVhdHVyZXMpID8gc3RhdGljRmVhdHVyZXMuYXBwbHkoZ2xvYmFsU2NvcGUpIDogc3RhdGljRmVhdHVyZXNcbiAgICA6IHt9OyAvKiBQcm92aWRpbmcgYW4gZW1wdHkgY2FjaGUsIGlmIG5vbmUgd2FzIGluIHRoZSBlbnZpcm9ubWVudFxuXG4vKipcbiogQU1EIHBsdWdpbiBmdW5jdGlvbi5cbipcbiogQ29uZGl0aW9uYWwgbG9hZHMgbW9kdWxlcyBiYXNlZCBvbiBhIGhhcyBmZWF0dXJlIHRlc3QgdmFsdWUuXG4qXG4qIEBwYXJhbSByZXNvdXJjZUlkIEdpdmVzIHRoZSByZXNvbHZlZCBtb2R1bGUgaWQgdG8gbG9hZC5cbiogQHBhcmFtIHJlcXVpcmUgVGhlIGxvYWRlciByZXF1aXJlIGZ1bmN0aW9uIHdpdGggcmVzcGVjdCB0byB0aGUgbW9kdWxlIHRoYXQgY29udGFpbmVkIHRoZSBwbHVnaW4gcmVzb3VyY2UgaW4gaXRzXG4qICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kgbGlzdC5cbiogQHBhcmFtIGxvYWQgQ2FsbGJhY2sgdG8gbG9hZGVyIHRoYXQgY29uc3VtZXMgcmVzdWx0IG9mIHBsdWdpbiBkZW1hbmQuXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWQocmVzb3VyY2VJZCwgcmVxdWlyZSwgbG9hZCwgY29uZmlnKSB7XG4gICAgcmVzb3VyY2VJZCA/IHJlcXVpcmUoW3Jlc291cmNlSWRdLCBsb2FkKSA6IGxvYWQoKTtcbn1cbi8qKlxuICogQU1EIHBsdWdpbiBmdW5jdGlvbi5cbiAqXG4gKiBSZXNvbHZlcyByZXNvdXJjZUlkIGludG8gYSBtb2R1bGUgaWQgYmFzZWQgb24gcG9zc2libHktbmVzdGVkIHRlbmFyeSBleHByZXNzaW9uIHRoYXQgYnJhbmNoZXMgb24gaGFzIGZlYXR1cmUgdGVzdFxuICogdmFsdWUocykuXG4gKlxuICogQHBhcmFtIHJlc291cmNlSWQgVGhlIGlkIG9mIHRoZSBtb2R1bGVcbiAqIEBwYXJhbSBub3JtYWxpemUgUmVzb2x2ZXMgYSByZWxhdGl2ZSBtb2R1bGUgaWQgaW50byBhbiBhYnNvbHV0ZSBtb2R1bGUgaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShyZXNvdXJjZUlkLCBub3JtYWxpemUpIHtcbiAgICBjb25zdCB0b2tlbnMgPSByZXNvdXJjZUlkLm1hdGNoKC9bXFw/Ol18W146XFw/XSovZykgfHwgW107XG4gICAgbGV0IGkgPSAwO1xuICAgIGZ1bmN0aW9uIGdldChza2lwKSB7XG4gICAgICAgIGNvbnN0IHRlcm0gPSB0b2tlbnNbaSsrXTtcbiAgICAgICAgaWYgKHRlcm0gPT09ICc6Jykge1xuICAgICAgICAgICAgLy8gZW1wdHkgc3RyaW5nIG1vZHVsZSBuYW1lLCByZXNvbHZlcyB0byBudWxsXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBvc3RmaXhlZCB3aXRoIGEgPyBtZWFucyBpdCBpcyBhIGZlYXR1cmUgdG8gYnJhbmNoIG9uLCB0aGUgdGVybSBpcyB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZVxuICAgICAgICAgICAgaWYgKHRva2Vuc1tpKytdID09PSAnPycpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNraXAgJiYgaGFzKHRlcm0pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoZWQgdGhlIGZlYXR1cmUsIGdldCB0aGUgZmlyc3QgdmFsdWUgZnJvbSB0aGUgb3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBkaWQgbm90IG1hdGNoLCBnZXQgdGhlIHNlY29uZCB2YWx1ZSwgcGFzc2luZyBvdmVyIHRoZSBmaXJzdFxuICAgICAgICAgICAgICAgICAgICBnZXQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQoc2tpcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYSBtb2R1bGVcbiAgICAgICAgICAgIHJldHVybiB0ZXJtO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGlkID0gZ2V0KCk7XG4gICAgcmV0dXJuIGlkICYmIG5vcm1hbGl6ZShpZCk7XG59XG4vKipcbiAqIENoZWNrIGlmIGEgZmVhdHVyZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWRcbiAqXG4gKiBAcGFyYW0gZmVhdHVyZSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhpc3RzKGZlYXR1cmUpIHtcbiAgICBjb25zdCBub3JtYWxpemVkRmVhdHVyZSA9IGZlYXR1cmUudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gQm9vbGVhbihub3JtYWxpemVkRmVhdHVyZSBpbiBzdGF0aWNDYWNoZSB8fCBub3JtYWxpemVkRmVhdHVyZSBpbiB0ZXN0Q2FjaGUgfHwgdGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV0pO1xufVxuLyoqXG4gKiBSZWdpc3RlciBhIG5ldyB0ZXN0IGZvciBhIG5hbWVkIGZlYXR1cmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGhhcy5hZGQoJ2RvbS1hZGRldmVudGxpc3RlbmVyJywgISFkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogaGFzLmFkZCgndG91Y2gtZXZlbnRzJywgZnVuY3Rpb24gKCkge1xuICogICAgcmV0dXJuICdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50XG4gKiB9KTtcbiAqXG4gKiBAcGFyYW0gZmVhdHVyZSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZVxuICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSByZXBvcnRlZCBvZiB0aGUgZmVhdHVyZSwgb3IgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgb25jZSBvbiBmaXJzdCB0ZXN0XG4gKiBAcGFyYW0gb3ZlcndyaXRlIGlmIGFuIGV4aXN0aW5nIHZhbHVlIHNob3VsZCBiZSBvdmVyd3JpdHRlbi4gRGVmYXVsdHMgdG8gZmFsc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGQoZmVhdHVyZSwgdmFsdWUsIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEZlYXR1cmUgPSBmZWF0dXJlLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGV4aXN0cyhub3JtYWxpemVkRmVhdHVyZSkgJiYgIW92ZXJ3cml0ZSAmJiAhKG5vcm1hbGl6ZWRGZWF0dXJlIGluIHN0YXRpY0NhY2hlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBGZWF0dXJlIFwiJHtmZWF0dXJlfVwiIGV4aXN0cyBhbmQgb3ZlcndyaXRlIG5vdCB0cnVlLmApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRlc3RGdW5jdGlvbnNbbm9ybWFsaXplZEZlYXR1cmVdID0gdmFsdWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzRmVhdHVyZVRlc3RUaGVuYWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgdGVzdFRoZW5hYmxlc1tmZWF0dXJlXSA9IHZhbHVlLnRoZW4oKHJlc29sdmVkVmFsdWUpID0+IHtcbiAgICAgICAgICAgIHRlc3RDYWNoZVtmZWF0dXJlXSA9IHJlc29sdmVkVmFsdWU7XG4gICAgICAgICAgICBkZWxldGUgdGVzdFRoZW5hYmxlc1tmZWF0dXJlXTtcbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIHRlc3RUaGVuYWJsZXNbZmVhdHVyZV07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGVzdENhY2hlW25vcm1hbGl6ZWRGZWF0dXJlXSA9IHZhbHVlO1xuICAgICAgICBkZWxldGUgdGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV07XG4gICAgfVxufVxuLyoqXG4gKiBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgYSBuYW1lZCBmZWF0dXJlLlxuICpcbiAqIEBwYXJhbSBmZWF0dXJlIFRoZSBuYW1lIChpZiBhIHN0cmluZykgb3IgaWRlbnRpZmllciAoaWYgYW4gaW50ZWdlcikgb2YgdGhlIGZlYXR1cmUgdG8gdGVzdC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaGFzKGZlYXR1cmUpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRGZWF0dXJlID0gZmVhdHVyZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChub3JtYWxpemVkRmVhdHVyZSBpbiBzdGF0aWNDYWNoZSkge1xuICAgICAgICByZXN1bHQgPSBzdGF0aWNDYWNoZVtub3JtYWxpemVkRmVhdHVyZV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHRlc3RGdW5jdGlvbnNbbm9ybWFsaXplZEZlYXR1cmVdKSB7XG4gICAgICAgIHJlc3VsdCA9IHRlc3RDYWNoZVtub3JtYWxpemVkRmVhdHVyZV0gPSB0ZXN0RnVuY3Rpb25zW25vcm1hbGl6ZWRGZWF0dXJlXS5jYWxsKG51bGwpO1xuICAgICAgICBkZWxldGUgdGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV07XG4gICAgfVxuICAgIGVsc2UgaWYgKG5vcm1hbGl6ZWRGZWF0dXJlIGluIHRlc3RDYWNoZSkge1xuICAgICAgICByZXN1bHQgPSB0ZXN0Q2FjaGVbbm9ybWFsaXplZEZlYXR1cmVdO1xuICAgIH1cbiAgICBlbHNlIGlmIChmZWF0dXJlIGluIHRlc3RUaGVuYWJsZXMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQXR0ZW1wdCB0byBkZXRlY3QgdW5yZWdpc3RlcmVkIGhhcyBmZWF0dXJlIFwiJHtmZWF0dXJlfVwiYCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKlxuICogT3V0IG9mIHRoZSBib3ggZmVhdHVyZSB0ZXN0c1xuICovXG4vKiBFbnZpcm9ubWVudHMgKi9cbi8qIFVzZWQgYXMgYSB2YWx1ZSB0byBwcm92aWRlIGEgZGVidWcgb25seSBjb2RlIHBhdGggKi9cbmFkZCgnZGVidWcnLCB0cnVlKTtcbi8qIERldGVjdHMgaWYgdGhlIGVudmlyb25tZW50IGlzIFwiYnJvd3NlciBsaWtlXCIgKi9cbmFkZCgnaG9zdC1icm93c2VyJywgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbG9jYXRpb24gIT09ICd1bmRlZmluZWQnKTtcbi8qIERldGVjdHMgaWYgdGhlIGVudmlyb25tZW50IGFwcGVhcnMgdG8gYmUgTm9kZUpTICovXG5hZGQoJ2hvc3Qtbm9kZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmIHByb2Nlc3MudmVyc2lvbnMgJiYgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLnZlcnNpb25zLm5vZGU7XG4gICAgfVxufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXMubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9oYXMvaGFzLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL2hhcy9oYXMubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCB7IGlzQXJyYXlMaWtlLCBTaGltSXRlcmF0b3IgfSBmcm9tICcuL2l0ZXJhdG9yJztcbmltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xuaW1wb3J0IHsgaXMgYXMgb2JqZWN0SXMgfSBmcm9tICcuL29iamVjdCc7XG5pbXBvcnQgaGFzIGZyb20gJy4vc3VwcG9ydC9oYXMnO1xuaW1wb3J0ICcuL1N5bWJvbCc7XG5leHBvcnQgbGV0IE1hcCA9IGdsb2JhbC5NYXA7XG5pZiAoIXRydWUpIHtcbiAgICBNYXAgPSAoX2EgPSBjbGFzcyBNYXAge1xuICAgICAgICAgICAgY29uc3RydWN0b3IoaXRlcmFibGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgdGhpc1tTeW1ib2wudG9TdHJpbmdUYWddID0gJ01hcCc7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5TGlrZShpdGVyYWJsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlcmFibGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGl0ZXJhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQodmFsdWVbMF0sIHZhbHVlWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQW4gYWx0ZXJuYXRpdmUgdG8gQXJyYXkucHJvdG90eXBlLmluZGV4T2YgdXNpbmcgT2JqZWN0LmlzXG4gICAgICAgICAgICAgKiB0byBjaGVjayBmb3IgZXF1YWxpdHkuIFNlZSBodHRwOi8vbXpsLmxhLzF6dUtPMlZcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgX2luZGV4T2ZLZXkoa2V5cywga2V5KSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdElzKGtleXNbaV0sIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdldCBzaXplKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9rZXlzLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNsZWFyKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2tleXMubGVuZ3RoID0gdGhpcy5fdmFsdWVzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUoa2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9pbmRleE9mS2V5KHRoaXMuX2tleXMsIGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2tleXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVudHJpZXMoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5fa2V5cy5tYXAoKGtleSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgdGhpcy5fdmFsdWVzW2ldXTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNoaW1JdGVyYXRvcih2YWx1ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yRWFjaChjYWxsYmFjaywgY29udGV4dCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSB0aGlzLl9rZXlzO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuX3ZhbHVlcztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIHZhbHVlc1tpXSwga2V5c1tpXSwgdGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ2V0KGtleSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5faW5kZXhPZktleSh0aGlzLl9rZXlzLCBrZXkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiB0aGlzLl92YWx1ZXNbaW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFzKGtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbmRleE9mS2V5KHRoaXMuX2tleXMsIGtleSkgPiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGtleXMoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaGltSXRlcmF0b3IodGhpcy5fa2V5cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuX2luZGV4T2ZLZXkodGhpcy5fa2V5cywga2V5KTtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4IDwgMCA/IHRoaXMuX2tleXMubGVuZ3RoIDogaW5kZXg7XG4gICAgICAgICAgICAgICAgdGhpcy5fa2V5c1tpbmRleF0gPSBrZXk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsdWVzKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2hpbUl0ZXJhdG9yKHRoaXMuX3ZhbHVlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIF9hW1N5bWJvbC5zcGVjaWVzXSA9IF9hLFxuICAgICAgICBfYSk7XG59XG5leHBvcnQgZGVmYXVsdCBNYXA7XG52YXIgX2E7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXAubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL01hcC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL01hcC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XG5pbXBvcnQgeyBxdWV1ZU1pY3JvVGFzayB9IGZyb20gJy4vc3VwcG9ydC9xdWV1ZSc7XG5pbXBvcnQgJy4vU3ltYm9sJztcbmltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XG5leHBvcnQgbGV0IFNoaW1Qcm9taXNlID0gZ2xvYmFsLlByb21pc2U7XG5leHBvcnQgY29uc3QgaXNUaGVuYWJsZSA9IGZ1bmN0aW9uIGlzVGhlbmFibGUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbic7XG59O1xuaWYgKCF0cnVlKSB7XG4gICAgZ2xvYmFsLlByb21pc2UgPSBTaGltUHJvbWlzZSA9IChfYSA9IGNsYXNzIFByb21pc2Uge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IFByb21pc2UuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQHBhcmFtIGV4ZWN1dG9yXG4gICAgICAgICAgICAgKiBUaGUgZXhlY3V0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIFByb21pc2UgaXMgaW5zdGFudGlhdGVkLiBJdCBpcyByZXNwb25zaWJsZSBmb3JcbiAgICAgICAgICAgICAqIHN0YXJ0aW5nIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoZW4gaXQgaXMgaW52b2tlZC5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBUaGUgZXhlY3V0b3IgbXVzdCBjYWxsIGVpdGhlciB0aGUgcGFzc2VkIGByZXNvbHZlYCBmdW5jdGlvbiB3aGVuIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWRcbiAgICAgICAgICAgICAqIHN1Y2Nlc3NmdWxseSwgb3IgdGhlIGByZWplY3RgIGZ1bmN0aW9uIHdoZW4gdGhlIG9wZXJhdGlvbiBmYWlscy5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3RydWN0b3IoZXhlY3V0b3IpIHtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGlzIHByb21pc2UuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IDEgLyogUGVuZGluZyAqLztcbiAgICAgICAgICAgICAgICB0aGlzW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnUHJvbWlzZSc7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogSWYgdHJ1ZSwgdGhlIHJlc29sdXRpb24gb2YgdGhpcyBwcm9taXNlIGlzIGNoYWluZWQgKFwibG9ja2VkIGluXCIpIHRvIGFub3RoZXIgcHJvbWlzZS5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBsZXQgaXNDaGFpbmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogV2hldGhlciBvciBub3QgdGhpcyBwcm9taXNlIGlzIGluIGEgcmVzb2x2ZWQgc3RhdGUuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY29uc3QgaXNSZXNvbHZlZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUgIT09IDEgLyogUGVuZGluZyAqLyB8fCBpc0NoYWluZWQ7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBDYWxsYmFja3MgdGhhdCBzaG91bGQgYmUgaW52b2tlZCBvbmNlIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgbGV0IGNhbGxiYWNrcyA9IFtdO1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIEluaXRpYWxseSBwdXNoZXMgY2FsbGJhY2tzIG9udG8gYSBxdWV1ZSBmb3IgZXhlY3V0aW9uIG9uY2UgdGhpcyBwcm9taXNlIHNldHRsZXMuIEFmdGVyIHRoZSBwcm9taXNlIHNldHRsZXMsXG4gICAgICAgICAgICAgICAgICogZW5xdWV1ZXMgY2FsbGJhY2tzIGZvciBleGVjdXRpb24gb24gdGhlIG5leHQgZXZlbnQgbG9vcCB0dXJuLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGxldCB3aGVuRmluaXNoZWQgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBTZXR0bGVzIHRoaXMgcHJvbWlzZS5cbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSBuZXdTdGF0ZSBUaGUgcmVzb2x2ZWQgc3RhdGUgZm9yIHRoaXMgcHJvbWlzZS5cbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0ge1R8YW55fSB2YWx1ZSBUaGUgcmVzb2x2ZWQgdmFsdWUgZm9yIHRoaXMgcHJvbWlzZS5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBjb25zdCBzZXR0bGUgPSAobmV3U3RhdGUsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEEgcHJvbWlzZSBjYW4gb25seSBiZSBzZXR0bGVkIG9uY2UuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlICE9PSAxIC8qIFBlbmRpbmcgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZWRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB3aGVuRmluaXNoZWQgPSBxdWV1ZU1pY3JvVGFzaztcbiAgICAgICAgICAgICAgICAgICAgLy8gT25seSBlbnF1ZXVlIGEgY2FsbGJhY2sgcnVubmVyIGlmIHRoZXJlIGFyZSBjYWxsYmFja3Mgc28gdGhhdCBpbml0aWFsbHkgZnVsZmlsbGVkIFByb21pc2VzIGRvbid0IGhhdmUgdG9cbiAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBhbiBleHRyYSB0dXJuLlxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tzICYmIGNhbGxiYWNrcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZU1pY3JvVGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY291bnQgPSBjYWxsYmFja3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrc1tpXS5jYWxsKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIFJlc29sdmVzIHRoaXMgcHJvbWlzZS5cbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSBuZXdTdGF0ZSBUaGUgcmVzb2x2ZWQgc3RhdGUgZm9yIHRoaXMgcHJvbWlzZS5cbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0ge1R8YW55fSB2YWx1ZSBUaGUgcmVzb2x2ZWQgdmFsdWUgZm9yIHRoaXMgcHJvbWlzZS5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlID0gKG5ld1N0YXRlLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNSZXNvbHZlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVGhlbmFibGUodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS50aGVuKHNldHRsZS5iaW5kKG51bGwsIDAgLyogRnVsZmlsbGVkICovKSwgc2V0dGxlLmJpbmQobnVsbCwgMiAvKiBSZWplY3RlZCAqLykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNDaGFpbmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRsZShuZXdTdGF0ZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLnRoZW4gPSAob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW5GaW5pc2hlZCBpbml0aWFsbHkgcXVldWVzIHVwIGNhbGxiYWNrcyBmb3IgZXhlY3V0aW9uIGFmdGVyIHRoZSBwcm9taXNlIGhhcyBzZXR0bGVkLiBPbmNlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvbWlzZSBoYXMgc2V0dGxlZCwgd2hlbkZpbmlzaGVkIHdpbGwgc2NoZWR1bGUgY2FsbGJhY2tzIGZvciBleGVjdXRpb24gb24gdGhlIG5leHQgdHVybiB0aHJvdWdoIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgbG9vcC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZW5GaW5pc2hlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLnN0YXRlID09PSAyIC8qIFJlamVjdGVkICovID8gb25SZWplY3RlZCA6IG9uRnVsZmlsbGVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY2FsbGJhY2sodGhpcy5yZXNvbHZlZFZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09IDIgLyogUmVqZWN0ZWQgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHRoaXMucmVzb2x2ZWRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMucmVzb2x2ZWRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3IocmVzb2x2ZS5iaW5kKG51bGwsIDAgLyogRnVsZmlsbGVkICovKSwgcmVzb2x2ZS5iaW5kKG51bGwsIDIgLyogUmVqZWN0ZWQgKi8pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRsZSgyIC8qIFJlamVjdGVkICovLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdGljIGFsbChpdGVyYWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcyhmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29tcGxldGUgPSAwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcG9wdWxhdGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGwoaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICArK2NvbXBsZXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZmluaXNoKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcHVsYXRpbmcgfHwgY29tcGxldGUgPCB0b3RhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwcm9jZXNzSXRlbShpbmRleCwgaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgKyt0b3RhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1RoZW5hYmxlKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYW4gaXRlbSBQcm9taXNlIHJlamVjdHMsIHRoaXMgUHJvbWlzZSBpcyBpbW1lZGlhdGVseSByZWplY3RlZCB3aXRoIHRoZSBpdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvbWlzZSdzIHJlamVjdGlvbiBlcnJvci5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnRoZW4oZnVsZmlsbC5iaW5kKG51bGwsIGluZGV4KSwgcmVqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShpdGVtKS50aGVuKGZ1bGZpbGwuYmluZChudWxsLCBpbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0l0ZW0oaSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBvcHVsYXRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0aWMgcmFjZShpdGVyYWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcyhmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSBQcm9taXNlIGl0ZW0gcmVqZWN0cywgdGhpcyBQcm9taXNlIGlzIGltbWVkaWF0ZWx5IHJlamVjdGVkIHdpdGggdGhlIGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9taXNlJ3MgcmVqZWN0aW9uIGVycm9yLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0udGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKGl0ZW0pLnRoZW4ocmVzb2x2ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRpYyByZWplY3QocmVhc29uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0aWMgcmVzb2x2ZSh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcyhmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoKG9uUmVqZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIF9hW1N5bWJvbC5zcGVjaWVzXSA9IFNoaW1Qcm9taXNlLFxuICAgICAgICBfYSk7XG59XG5leHBvcnQgZGVmYXVsdCBTaGltUHJvbWlzZTtcbnZhciBfYTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVByb21pc2UubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL1Byb21pc2UubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9Qcm9taXNlLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgaGFzIGZyb20gJy4vc3VwcG9ydC9oYXMnO1xuaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XG5pbXBvcnQgeyBnZXRWYWx1ZURlc2NyaXB0b3IgfSBmcm9tICcuL3N1cHBvcnQvdXRpbCc7XG5leHBvcnQgbGV0IFN5bWJvbCA9IGdsb2JhbC5TeW1ib2w7XG5pZiAoIXRydWUpIHtcbiAgICAvKipcbiAgICAgKiBUaHJvd3MgaWYgdGhlIHZhbHVlIGlzIG5vdCBhIHN5bWJvbCwgdXNlZCBpbnRlcm5hbGx5IHdpdGhpbiB0aGUgU2hpbVxuICAgICAqIEBwYXJhbSAge2FueX0gICAgdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrXG4gICAgICogQHJldHVybiB7c3ltYm9sfSAgICAgICBSZXR1cm5zIHRoZSBzeW1ib2wgb3IgdGhyb3dzXG4gICAgICovXG4gICAgY29uc3QgdmFsaWRhdGVTeW1ib2wgPSBmdW5jdGlvbiB2YWxpZGF0ZVN5bWJvbCh2YWx1ZSkge1xuICAgICAgICBpZiAoIWlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcih2YWx1ZSArICcgaXMgbm90IGEgc3ltYm9sJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgY29uc3QgZGVmaW5lUHJvcGVydGllcyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzO1xuICAgIGNvbnN0IGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuICAgIGNvbnN0IGNyZWF0ZSA9IE9iamVjdC5jcmVhdGU7XG4gICAgY29uc3Qgb2JqUHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgICBjb25zdCBnbG9iYWxTeW1ib2xzID0ge307XG4gICAgY29uc3QgZ2V0U3ltYm9sTmFtZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBjcmVhdGUobnVsbCk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZGVzYykge1xuICAgICAgICAgICAgbGV0IHBvc3RmaXggPSAwO1xuICAgICAgICAgICAgbGV0IG5hbWU7XG4gICAgICAgICAgICB3aGlsZSAoY3JlYXRlZFtTdHJpbmcoZGVzYykgKyAocG9zdGZpeCB8fCAnJyldKSB7XG4gICAgICAgICAgICAgICAgKytwb3N0Zml4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVzYyArPSBTdHJpbmcocG9zdGZpeCB8fCAnJyk7XG4gICAgICAgICAgICBjcmVhdGVkW2Rlc2NdID0gdHJ1ZTtcbiAgICAgICAgICAgIG5hbWUgPSAnQEAnICsgZGVzYztcbiAgICAgICAgICAgIC8vIEZJWE1FOiBUZW1wb3JhcnkgZ3VhcmQgdW50aWwgdGhlIGR1cGxpY2F0ZSBleGVjdXRpb24gd2hlbiB0ZXN0aW5nIGNhbiBiZVxuICAgICAgICAgICAgLy8gcGlubmVkIGRvd24uXG4gICAgICAgICAgICBpZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqUHJvdG90eXBlLCBuYW1lKSkge1xuICAgICAgICAgICAgICAgIGRlZmluZVByb3BlcnR5KG9ialByb3RvdHlwZSwgbmFtZSwge1xuICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lUHJvcGVydHkodGhpcywgbmFtZSwgZ2V0VmFsdWVEZXNjcmlwdG9yKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuYW1lO1xuICAgICAgICB9O1xuICAgIH0pKCk7XG4gICAgY29uc3QgSW50ZXJuYWxTeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woZGVzY3JpcHRpb24pIHtcbiAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBJbnRlcm5hbFN5bWJvbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHlwZUVycm9yOiBTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3InKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3ltYm9sKGRlc2NyaXB0aW9uKTtcbiAgICB9O1xuICAgIFN5bWJvbCA9IGdsb2JhbC5TeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woZGVzY3JpcHRpb24pIHtcbiAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBTeW1ib2wpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1R5cGVFcnJvcjogU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3ltID0gT2JqZWN0LmNyZWF0ZShJbnRlcm5hbFN5bWJvbC5wcm90b3R5cGUpO1xuICAgICAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQgPyAnJyA6IFN0cmluZyhkZXNjcmlwdGlvbik7XG4gICAgICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0aWVzKHN5bSwge1xuICAgICAgICAgICAgX19kZXNjcmlwdGlvbl9fOiBnZXRWYWx1ZURlc2NyaXB0b3IoZGVzY3JpcHRpb24pLFxuICAgICAgICAgICAgX19uYW1lX186IGdldFZhbHVlRGVzY3JpcHRvcihnZXRTeW1ib2xOYW1lKGRlc2NyaXB0aW9uKSlcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKiBEZWNvcmF0ZSB0aGUgU3ltYm9sIGZ1bmN0aW9uIHdpdGggdGhlIGFwcHJvcHJpYXRlIHByb3BlcnRpZXMgKi9cbiAgICBkZWZpbmVQcm9wZXJ0eShTeW1ib2wsICdmb3InLCBnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoZ2xvYmFsU3ltYm9sc1trZXldKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsU3ltYm9sc1trZXldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoZ2xvYmFsU3ltYm9sc1trZXldID0gU3ltYm9sKFN0cmluZyhrZXkpKSk7XG4gICAgfSkpO1xuICAgIGRlZmluZVByb3BlcnRpZXMoU3ltYm9sLCB7XG4gICAgICAgIGtleUZvcjogZ2V0VmFsdWVEZXNjcmlwdG9yKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgICAgICAgIGxldCBrZXk7XG4gICAgICAgICAgICB2YWxpZGF0ZVN5bWJvbChzeW0pO1xuICAgICAgICAgICAgZm9yIChrZXkgaW4gZ2xvYmFsU3ltYm9scykge1xuICAgICAgICAgICAgICAgIGlmIChnbG9iYWxTeW1ib2xzW2tleV0gPT09IHN5bSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGhhc0luc3RhbmNlOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignaGFzSW5zdGFuY2UnKSwgZmFsc2UsIGZhbHNlKSxcbiAgICAgICAgaXNDb25jYXRTcHJlYWRhYmxlOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignaXNDb25jYXRTcHJlYWRhYmxlJyksIGZhbHNlLCBmYWxzZSksXG4gICAgICAgIGl0ZXJhdG9yOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignaXRlcmF0b3InKSwgZmFsc2UsIGZhbHNlKSxcbiAgICAgICAgbWF0Y2g6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdtYXRjaCcpLCBmYWxzZSwgZmFsc2UpLFxuICAgICAgICBvYnNlcnZhYmxlOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignb2JzZXJ2YWJsZScpLCBmYWxzZSwgZmFsc2UpLFxuICAgICAgICByZXBsYWNlOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcigncmVwbGFjZScpLCBmYWxzZSwgZmFsc2UpLFxuICAgICAgICBzZWFyY2g6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdzZWFyY2gnKSwgZmFsc2UsIGZhbHNlKSxcbiAgICAgICAgc3BlY2llczogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3NwZWNpZXMnKSwgZmFsc2UsIGZhbHNlKSxcbiAgICAgICAgc3BsaXQ6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdzcGxpdCcpLCBmYWxzZSwgZmFsc2UpLFxuICAgICAgICB0b1ByaW1pdGl2ZTogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3RvUHJpbWl0aXZlJyksIGZhbHNlLCBmYWxzZSksXG4gICAgICAgIHRvU3RyaW5nVGFnOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcigndG9TdHJpbmdUYWcnKSwgZmFsc2UsIGZhbHNlKSxcbiAgICAgICAgdW5zY29wYWJsZXM6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCd1bnNjb3BhYmxlcycpLCBmYWxzZSwgZmFsc2UpXG4gICAgfSk7XG4gICAgLyogRGVjb3JhdGUgdGhlIEludGVybmFsU3ltYm9sIG9iamVjdCAqL1xuICAgIGRlZmluZVByb3BlcnRpZXMoSW50ZXJuYWxTeW1ib2wucHJvdG90eXBlLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sKSxcbiAgICAgICAgdG9TdHJpbmc6IGdldFZhbHVlRGVzY3JpcHRvcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fX25hbWVfXztcbiAgICAgICAgfSwgZmFsc2UsIGZhbHNlKVxuICAgIH0pO1xuICAgIC8qIERlY29yYXRlIHRoZSBTeW1ib2wucHJvdG90eXBlICovXG4gICAgZGVmaW5lUHJvcGVydGllcyhTeW1ib2wucHJvdG90eXBlLCB7XG4gICAgICAgIHRvU3RyaW5nOiBnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuICdTeW1ib2wgKCcgKyB2YWxpZGF0ZVN5bWJvbCh0aGlzKS5fX2Rlc2NyaXB0aW9uX18gKyAnKSc7XG4gICAgICAgIH0pLFxuICAgICAgICB2YWx1ZU9mOiBnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlU3ltYm9sKHRoaXMpO1xuICAgICAgICB9KVxuICAgIH0pO1xuICAgIGRlZmluZVByb3BlcnR5KFN5bWJvbC5wcm90b3R5cGUsIFN5bWJvbC50b1ByaW1pdGl2ZSwgZ2V0VmFsdWVEZXNjcmlwdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlU3ltYm9sKHRoaXMpO1xuICAgIH0pKTtcbiAgICBkZWZpbmVQcm9wZXJ0eShTeW1ib2wucHJvdG90eXBlLCBTeW1ib2wudG9TdHJpbmdUYWcsIGdldFZhbHVlRGVzY3JpcHRvcignU3ltYm9sJywgZmFsc2UsIGZhbHNlLCB0cnVlKSk7XG4gICAgZGVmaW5lUHJvcGVydHkoSW50ZXJuYWxTeW1ib2wucHJvdG90eXBlLCBTeW1ib2wudG9QcmltaXRpdmUsIGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wucHJvdG90eXBlW1N5bWJvbC50b1ByaW1pdGl2ZV0sIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpO1xuICAgIGRlZmluZVByb3BlcnR5KEludGVybmFsU3ltYm9sLnByb3RvdHlwZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLnByb3RvdHlwZVtTeW1ib2wudG9TdHJpbmdUYWddLCBmYWxzZSwgZmFsc2UsIHRydWUpKTtcbn1cbi8qKlxuICogQSBjdXN0b20gZ3VhcmQgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIGlmIGFuIG9iamVjdCBpcyBhIHN5bWJvbCBvciBub3RcbiAqIEBwYXJhbSAge2FueX0gICAgICAgdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrIHRvIHNlZSBpZiBpdCBpcyBhIHN5bWJvbCBvciBub3RcbiAqIEByZXR1cm4ge2lzIHN5bWJvbH0gICAgICAgUmV0dXJucyB0cnVlIGlmIGEgc3ltYm9sIG9yIG5vdCAoYW5kIG5hcnJvd3MgdGhlIHR5cGUgZ3VhcmQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICAgIHJldHVybiAodmFsdWUgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N5bWJvbCcgfHwgdmFsdWVbJ0BAdG9TdHJpbmdUYWcnXSA9PT0gJ1N5bWJvbCcpKSB8fCBmYWxzZTtcbn1cbi8qKlxuICogRmlsbCBhbnkgbWlzc2luZyB3ZWxsIGtub3duIHN5bWJvbHMgaWYgdGhlIG5hdGl2ZSBTeW1ib2wgaXMgbWlzc2luZyB0aGVtXG4gKi9cbltcbiAgICAnaGFzSW5zdGFuY2UnLFxuICAgICdpc0NvbmNhdFNwcmVhZGFibGUnLFxuICAgICdpdGVyYXRvcicsXG4gICAgJ3NwZWNpZXMnLFxuICAgICdyZXBsYWNlJyxcbiAgICAnc2VhcmNoJyxcbiAgICAnc3BsaXQnLFxuICAgICdtYXRjaCcsXG4gICAgJ3RvUHJpbWl0aXZlJyxcbiAgICAndG9TdHJpbmdUYWcnLFxuICAgICd1bnNjb3BhYmxlcycsXG4gICAgJ29ic2VydmFibGUnXG5dLmZvckVhY2goKHdlbGxLbm93bikgPT4ge1xuICAgIGlmICghU3ltYm9sW3dlbGxLbm93bl0pIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN5bWJvbCwgd2VsbEtub3duLCBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcih3ZWxsS25vd24pLCBmYWxzZSwgZmFsc2UpKTtcbiAgICB9XG59KTtcbmV4cG9ydCBkZWZhdWx0IFN5bWJvbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN5bWJvbC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vU3ltYm9sLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vU3ltYm9sLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4vZ2xvYmFsJztcbmltcG9ydCB7IGlzQXJyYXlMaWtlIH0gZnJvbSAnLi9pdGVyYXRvcic7XG5pbXBvcnQgaGFzIGZyb20gJy4vc3VwcG9ydC9oYXMnO1xuaW1wb3J0ICcuL1N5bWJvbCc7XG5leHBvcnQgbGV0IFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcbmlmICghdHJ1ZSkge1xuICAgIGNvbnN0IERFTEVURUQgPSB7fTtcbiAgICBjb25zdCBnZXRVSUQgPSBmdW5jdGlvbiBnZXRVSUQoKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwMDApO1xuICAgIH07XG4gICAgY29uc3QgZ2VuZXJhdGVOYW1lID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IHN0YXJ0SWQgPSBNYXRoLmZsb29yKERhdGUubm93KCkgJSAxMDAwMDAwMDApO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gZ2VuZXJhdGVOYW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuICdfX3dtJyArIGdldFVJRCgpICsgKHN0YXJ0SWQrKyArICdfXycpO1xuICAgICAgICB9O1xuICAgIH0pKCk7XG4gICAgV2Vha01hcCA9IGNsYXNzIFdlYWtNYXAge1xuICAgICAgICBjb25zdHJ1Y3RvcihpdGVyYWJsZSkge1xuICAgICAgICAgICAgdGhpc1tTeW1ib2wudG9TdHJpbmdUYWddID0gJ1dlYWtNYXAnO1xuICAgICAgICAgICAgdGhpcy5fbmFtZSA9IGdlbmVyYXRlTmFtZSgpO1xuICAgICAgICAgICAgdGhpcy5fZnJvemVuRW50cmllcyA9IFtdO1xuICAgICAgICAgICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXJyYXlMaWtlKGl0ZXJhYmxlKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZXJhYmxlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldChpdGVtWzBdLCBpdGVtWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9nZXRGcm96ZW5FbnRyeUluZGV4KGtleSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9mcm96ZW5FbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2Zyb3plbkVudHJpZXNbaV0ua2V5ID09PSBrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZShrZXkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IGtleVt0aGlzLl9uYW1lXTtcbiAgICAgICAgICAgIGlmIChlbnRyeSAmJiBlbnRyeS5rZXkgPT09IGtleSAmJiBlbnRyeS52YWx1ZSAhPT0gREVMRVRFRCkge1xuICAgICAgICAgICAgICAgIGVudHJ5LnZhbHVlID0gREVMRVRFRDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZyb3plbkluZGV4ID0gdGhpcy5fZ2V0RnJvemVuRW50cnlJbmRleChrZXkpO1xuICAgICAgICAgICAgaWYgKGZyb3plbkluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mcm96ZW5FbnRyaWVzLnNwbGljZShmcm96ZW5JbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0KGtleSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IGtleVt0aGlzLl9uYW1lXTtcbiAgICAgICAgICAgIGlmIChlbnRyeSAmJiBlbnRyeS5rZXkgPT09IGtleSAmJiBlbnRyeS52YWx1ZSAhPT0gREVMRVRFRCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZyb3plbkluZGV4ID0gdGhpcy5fZ2V0RnJvemVuRW50cnlJbmRleChrZXkpO1xuICAgICAgICAgICAgaWYgKGZyb3plbkluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZnJvemVuRW50cmllc1tmcm96ZW5JbmRleF0udmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaGFzKGtleSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0ga2V5W3RoaXMuX25hbWVdO1xuICAgICAgICAgICAgaWYgKEJvb2xlYW4oZW50cnkgJiYgZW50cnkua2V5ID09PSBrZXkgJiYgZW50cnkudmFsdWUgIT09IERFTEVURUQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmcm96ZW5JbmRleCA9IHRoaXMuX2dldEZyb3plbkVudHJ5SW5kZXgoa2V5KTtcbiAgICAgICAgICAgIGlmIChmcm96ZW5JbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICgha2V5IHx8ICh0eXBlb2Yga2V5ICE9PSAnb2JqZWN0JyAmJiB0eXBlb2Yga2V5ICE9PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgdmFsdWUgdXNlZCBhcyB3ZWFrIG1hcCBrZXknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBlbnRyeSA9IGtleVt0aGlzLl9uYW1lXTtcbiAgICAgICAgICAgIGlmICghZW50cnkgfHwgZW50cnkua2V5ICE9PSBrZXkpIHtcbiAgICAgICAgICAgICAgICBlbnRyeSA9IE9iamVjdC5jcmVhdGUobnVsbCwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IHsgdmFsdWU6IGtleSB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5pc0Zyb3plbihrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Zyb3plbkVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoa2V5LCB0aGlzLl9uYW1lLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZW50cnlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW50cnkudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydCBkZWZhdWx0IFdlYWtNYXA7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1XZWFrTWFwLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9XZWFrTWFwLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vV2Vha01hcC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XG5pbXBvcnQgeyBpc0FycmF5TGlrZSwgaXNJdGVyYWJsZSB9IGZyb20gJy4vaXRlcmF0b3InO1xuaW1wb3J0IHsgTUFYX1NBRkVfSU5URUdFUiB9IGZyb20gJy4vbnVtYmVyJztcbmltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XG5pbXBvcnQgeyB3cmFwTmF0aXZlIH0gZnJvbSAnLi9zdXBwb3J0L3V0aWwnO1xuZXhwb3J0IGxldCBmcm9tO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGFycmF5IGZyb20gdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIGFyZ3VtZW50cyBBbnkgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgdGhlIGFycmF5XG4gKiBAcmV0dXJuIEFuIGFycmF5IGZyb20gdGhlIGdpdmVuIGFyZ3VtZW50c1xuICovXG5leHBvcnQgbGV0IG9mO1xuLyogRVM2IEFycmF5IGluc3RhbmNlIG1ldGhvZHMgKi9cbi8qKlxuICogQ29waWVzIGRhdGEgaW50ZXJuYWxseSB3aXRoaW4gYW4gYXJyYXkgb3IgYXJyYXktbGlrZSBvYmplY3QuXG4gKlxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IGFycmF5LWxpa2Ugb2JqZWN0XG4gKiBAcGFyYW0gb2Zmc2V0IFRoZSBpbmRleCB0byBzdGFydCBjb3B5aW5nIHZhbHVlcyB0bzsgaWYgbmVnYXRpdmUsIGl0IGNvdW50cyBiYWNrd2FyZHMgZnJvbSBsZW5ndGhcbiAqIEBwYXJhbSBzdGFydCBUaGUgZmlyc3QgKGluY2x1c2l2ZSkgaW5kZXggdG8gY29weTsgaWYgbmVnYXRpdmUsIGl0IGNvdW50cyBiYWNrd2FyZHMgZnJvbSBsZW5ndGhcbiAqIEBwYXJhbSBlbmQgVGhlIGxhc3QgKGV4Y2x1c2l2ZSkgaW5kZXggdG8gY29weTsgaWYgbmVnYXRpdmUsIGl0IGNvdW50cyBiYWNrd2FyZHMgZnJvbSBsZW5ndGhcbiAqIEByZXR1cm4gVGhlIHRhcmdldFxuICovXG5leHBvcnQgbGV0IGNvcHlXaXRoaW47XG4vKipcbiAqIEZpbGxzIGVsZW1lbnRzIG9mIGFuIGFycmF5LWxpa2Ugb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgdG8gZmlsbFxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBmaWxsIGVhY2ggZWxlbWVudCBvZiB0aGUgdGFyZ2V0IHdpdGhcbiAqIEBwYXJhbSBzdGFydCBUaGUgZmlyc3QgaW5kZXggdG8gZmlsbFxuICogQHBhcmFtIGVuZCBUaGUgKGV4Y2x1c2l2ZSkgaW5kZXggYXQgd2hpY2ggdG8gc3RvcCBmaWxsaW5nXG4gKiBAcmV0dXJuIFRoZSBmaWxsZWQgdGFyZ2V0XG4gKi9cbmV4cG9ydCBsZXQgZmlsbDtcbi8qKlxuICogRmluZHMgYW5kIHJldHVybnMgdGhlIGZpcnN0IGluc3RhbmNlIG1hdGNoaW5nIHRoZSBjYWxsYmFjayBvciB1bmRlZmluZWQgaWYgb25lIGlzIG5vdCBmb3VuZC5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IEFuIGFycmF5LWxpa2Ugb2JqZWN0XG4gKiBAcGFyYW0gY2FsbGJhY2sgQSBmdW5jdGlvbiByZXR1cm5pbmcgaWYgdGhlIGN1cnJlbnQgdmFsdWUgbWF0Y2hlcyBhIGNyaXRlcmlhXG4gKiBAcGFyYW0gdGhpc0FyZyBUaGUgZXhlY3V0aW9uIGNvbnRleHQgZm9yIHRoZSBmaW5kIGZ1bmN0aW9uXG4gKiBAcmV0dXJuIFRoZSBmaXJzdCBlbGVtZW50IG1hdGNoaW5nIHRoZSBjYWxsYmFjaywgb3IgdW5kZWZpbmVkIGlmIG9uZSBkb2VzIG5vdCBleGlzdFxuICovXG5leHBvcnQgbGV0IGZpbmQ7XG4vKipcbiAqIFBlcmZvcm1zIGEgbGluZWFyIHNlYXJjaCBhbmQgcmV0dXJucyB0aGUgZmlyc3QgaW5kZXggd2hvc2UgdmFsdWUgc2F0aXNmaWVzIHRoZSBwYXNzZWQgY2FsbGJhY2ssXG4gKiBvciAtMSBpZiBubyB2YWx1ZXMgc2F0aXNmeSBpdC5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IEFuIGFycmF5LWxpa2Ugb2JqZWN0XG4gKiBAcGFyYW0gY2FsbGJhY2sgQSBmdW5jdGlvbiByZXR1cm5pbmcgdHJ1ZSBpZiB0aGUgY3VycmVudCB2YWx1ZSBzYXRpc2ZpZXMgaXRzIGNyaXRlcmlhXG4gKiBAcGFyYW0gdGhpc0FyZyBUaGUgZXhlY3V0aW9uIGNvbnRleHQgZm9yIHRoZSBmaW5kIGZ1bmN0aW9uXG4gKiBAcmV0dXJuIFRoZSBmaXJzdCBpbmRleCB3aG9zZSB2YWx1ZSBzYXRpc2ZpZXMgdGhlIHBhc3NlZCBjYWxsYmFjaywgb3IgLTEgaWYgbm8gdmFsdWVzIHNhdGlzZnkgaXRcbiAqL1xuZXhwb3J0IGxldCBmaW5kSW5kZXg7XG4vKiBFUzcgQXJyYXkgaW5zdGFuY2UgbWV0aG9kcyAqL1xuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gYXJyYXkgaW5jbHVkZXMgYSBnaXZlbiB2YWx1ZVxuICpcbiAqIEBwYXJhbSB0YXJnZXQgdGhlIHRhcmdldCBhcnJheS1saWtlIG9iamVjdFxuICogQHBhcmFtIHNlYXJjaEVsZW1lbnQgdGhlIGl0ZW0gdG8gc2VhcmNoIGZvclxuICogQHBhcmFtIGZyb21JbmRleCB0aGUgc3RhcnRpbmcgaW5kZXggdG8gc2VhcmNoIGZyb21cbiAqIEByZXR1cm4gYHRydWVgIGlmIHRoZSBhcnJheSBpbmNsdWRlcyB0aGUgZWxlbWVudCwgb3RoZXJ3aXNlIGBmYWxzZWBcbiAqL1xuZXhwb3J0IGxldCBpbmNsdWRlcztcbmlmICh0cnVlICYmIHRydWUpIHtcbiAgICBmcm9tID0gZ2xvYmFsLkFycmF5LmZyb207XG4gICAgb2YgPSBnbG9iYWwuQXJyYXkub2Y7XG4gICAgY29weVdpdGhpbiA9IHdyYXBOYXRpdmUoZ2xvYmFsLkFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluKTtcbiAgICBmaWxsID0gd3JhcE5hdGl2ZShnbG9iYWwuQXJyYXkucHJvdG90eXBlLmZpbGwpO1xuICAgIGZpbmQgPSB3cmFwTmF0aXZlKGdsb2JhbC5BcnJheS5wcm90b3R5cGUuZmluZCk7XG4gICAgZmluZEluZGV4ID0gd3JhcE5hdGl2ZShnbG9iYWwuQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleCk7XG59XG5lbHNlIHtcbiAgICAvLyBJdCBpcyBvbmx5IG9sZGVyIHZlcnNpb25zIG9mIFNhZmFyaS9pT1MgdGhhdCBoYXZlIGEgYmFkIGZpbGwgaW1wbGVtZW50YXRpb24gYW5kIHNvIGFyZW4ndCBpbiB0aGUgd2lsZFxuICAgIC8vIFRvIG1ha2UgdGhpbmdzIGVhc2llciwgaWYgdGhlcmUgaXMgYSBiYWQgZmlsbCBpbXBsZW1lbnRhdGlvbiwgdGhlIHdob2xlIHNldCBvZiBmdW5jdGlvbnMgd2lsbCBiZSBmaWxsZWRcbiAgICAvKipcbiAgICAgKiBFbnN1cmVzIGEgbm9uLW5lZ2F0aXZlLCBub24taW5maW5pdGUsIHNhZmUgaW50ZWdlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciB0byB2YWxpZGF0ZVxuICAgICAqIEByZXR1cm4gQSBwcm9wZXIgbGVuZ3RoXG4gICAgICovXG4gICAgY29uc3QgdG9MZW5ndGggPSBmdW5jdGlvbiB0b0xlbmd0aChsZW5ndGgpIHtcbiAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpO1xuICAgICAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgICAgICAgbGVuZ3RoID0gTWF0aC5mbG9vcihsZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVuc3VyZSBhIG5vbi1uZWdhdGl2ZSwgcmVhbCwgc2FmZSBpbnRlZ2VyXG4gICAgICAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heChsZW5ndGgsIDApLCBNQVhfU0FGRV9JTlRFR0VSKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZyb20gRVM2IDcuMS40IFRvSW50ZWdlcigpXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgQSB2YWx1ZSB0byBjb252ZXJ0XG4gICAgICogQHJldHVybiBBbiBpbnRlZ2VyXG4gICAgICovXG4gICAgY29uc3QgdG9JbnRlZ2VyID0gZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7XG4gICAgICAgIHZhbHVlID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgaWYgKGlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlID09PSAwIHx8ICFpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHZhbHVlID4gMCA/IDEgOiAtMSkgKiBNYXRoLmZsb29yKE1hdGguYWJzKHZhbHVlKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemVzIGFuIG9mZnNldCBhZ2FpbnN0IGEgZ2l2ZW4gbGVuZ3RoLCB3cmFwcGluZyBpdCBpZiBuZWdhdGl2ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgb3JpZ2luYWwgb2Zmc2V0XG4gICAgICogQHBhcmFtIGxlbmd0aCBUaGUgdG90YWwgbGVuZ3RoIHRvIG5vcm1hbGl6ZSBhZ2FpbnN0XG4gICAgICogQHJldHVybiBJZiBuZWdhdGl2ZSwgcHJvdmlkZSBhIGRpc3RhbmNlIGZyb20gdGhlIGVuZCAobGVuZ3RoKTsgb3RoZXJ3aXNlIHByb3ZpZGUgYSBkaXN0YW5jZSBmcm9tIDBcbiAgICAgKi9cbiAgICBjb25zdCBub3JtYWxpemVPZmZzZXQgPSBmdW5jdGlvbiBub3JtYWxpemVPZmZzZXQodmFsdWUsIGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPCAwID8gTWF0aC5tYXgobGVuZ3RoICsgdmFsdWUsIDApIDogTWF0aC5taW4odmFsdWUsIGxlbmd0aCk7XG4gICAgfTtcbiAgICBmcm9tID0gZnVuY3Rpb24gZnJvbShhcnJheUxpa2UsIG1hcEZ1bmN0aW9uLCB0aGlzQXJnKSB7XG4gICAgICAgIGlmIChhcnJheUxpa2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZnJvbTogcmVxdWlyZXMgYW4gYXJyYXktbGlrZSBvYmplY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWFwRnVuY3Rpb24gJiYgdGhpc0FyZykge1xuICAgICAgICAgICAgbWFwRnVuY3Rpb24gPSBtYXBGdW5jdGlvbi5iaW5kKHRoaXNBcmcpO1xuICAgICAgICB9XG4gICAgICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lICovXG4gICAgICAgIGNvbnN0IENvbnN0cnVjdG9yID0gdGhpcztcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdG9MZW5ndGgoYXJyYXlMaWtlLmxlbmd0aCk7XG4gICAgICAgIC8vIFN1cHBvcnQgZXh0ZW5zaW9uXG4gICAgICAgIGNvbnN0IGFycmF5ID0gdHlwZW9mIENvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nID8gT2JqZWN0KG5ldyBDb25zdHJ1Y3RvcihsZW5ndGgpKSA6IG5ldyBBcnJheShsZW5ndGgpO1xuICAgICAgICBpZiAoIWlzQXJyYXlMaWtlKGFycmF5TGlrZSkgJiYgIWlzSXRlcmFibGUoYXJyYXlMaWtlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIHRoaXMgaXMgYW4gYXJyYXkgYW5kIHRoZSBub3JtYWxpemVkIGxlbmd0aCBpcyAwLCBqdXN0IHJldHVybiBhbiBlbXB0eSBhcnJheS4gdGhpcyBwcmV2ZW50cyBhIHByb2JsZW1cbiAgICAgICAgLy8gd2l0aCB0aGUgaXRlcmF0aW9uIG9uIElFIHdoZW4gdXNpbmcgYSBOYU4gYXJyYXkgbGVuZ3RoLlxuICAgICAgICBpZiAoaXNBcnJheUxpa2UoYXJyYXlMaWtlKSkge1xuICAgICAgICAgICAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXlMaWtlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBtYXBGdW5jdGlvbiA/IG1hcEZ1bmN0aW9uKGFycmF5TGlrZVtpXSwgaSkgOiBhcnJheUxpa2VbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGFycmF5TGlrZSkge1xuICAgICAgICAgICAgICAgIGFycmF5W2ldID0gbWFwRnVuY3Rpb24gPyBtYXBGdW5jdGlvbih2YWx1ZSwgaSkgOiB2YWx1ZTtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFycmF5TGlrZS5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXJyYXkubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICB9O1xuICAgIG9mID0gZnVuY3Rpb24gb2YoLi4uaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGl0ZW1zKTtcbiAgICB9O1xuICAgIGNvcHlXaXRoaW4gPSBmdW5jdGlvbiBjb3B5V2l0aGluKHRhcmdldCwgb2Zmc2V0LCBzdGFydCwgZW5kKSB7XG4gICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY29weVdpdGhpbjogdGFyZ2V0IG11c3QgYmUgYW4gYXJyYXktbGlrZSBvYmplY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsZW5ndGggPSB0b0xlbmd0aCh0YXJnZXQubGVuZ3RoKTtcbiAgICAgICAgb2Zmc2V0ID0gbm9ybWFsaXplT2Zmc2V0KHRvSW50ZWdlcihvZmZzZXQpLCBsZW5ndGgpO1xuICAgICAgICBzdGFydCA9IG5vcm1hbGl6ZU9mZnNldCh0b0ludGVnZXIoc3RhcnQpLCBsZW5ndGgpO1xuICAgICAgICBlbmQgPSBub3JtYWxpemVPZmZzZXQoZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0ludGVnZXIoZW5kKSwgbGVuZ3RoKTtcbiAgICAgICAgbGV0IGNvdW50ID0gTWF0aC5taW4oZW5kIC0gc3RhcnQsIGxlbmd0aCAtIG9mZnNldCk7XG4gICAgICAgIGxldCBkaXJlY3Rpb24gPSAxO1xuICAgICAgICBpZiAob2Zmc2V0ID4gc3RhcnQgJiYgb2Zmc2V0IDwgc3RhcnQgKyBjb3VudCkge1xuICAgICAgICAgICAgZGlyZWN0aW9uID0gLTE7XG4gICAgICAgICAgICBzdGFydCArPSBjb3VudCAtIDE7XG4gICAgICAgICAgICBvZmZzZXQgKz0gY291bnQgLSAxO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChjb3VudCA+IDApIHtcbiAgICAgICAgICAgIGlmIChzdGFydCBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbb2Zmc2V0XSA9IHRhcmdldFtzdGFydF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGFyZ2V0W29mZnNldF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgKz0gZGlyZWN0aW9uO1xuICAgICAgICAgICAgc3RhcnQgKz0gZGlyZWN0aW9uO1xuICAgICAgICAgICAgY291bnQtLTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH07XG4gICAgZmlsbCA9IGZ1bmN0aW9uIGZpbGwodGFyZ2V0LCB2YWx1ZSwgc3RhcnQsIGVuZCkge1xuICAgICAgICBjb25zdCBsZW5ndGggPSB0b0xlbmd0aCh0YXJnZXQubGVuZ3RoKTtcbiAgICAgICAgbGV0IGkgPSBub3JtYWxpemVPZmZzZXQodG9JbnRlZ2VyKHN0YXJ0KSwgbGVuZ3RoKTtcbiAgICAgICAgZW5kID0gbm9ybWFsaXplT2Zmc2V0KGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9JbnRlZ2VyKGVuZCksIGxlbmd0aCk7XG4gICAgICAgIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgICAgICAgICB0YXJnZXRbaSsrXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfTtcbiAgICBmaW5kID0gZnVuY3Rpb24gZmluZCh0YXJnZXQsIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gZmluZEluZGV4KHRhcmdldCwgY2FsbGJhY2ssIHRoaXNBcmcpO1xuICAgICAgICByZXR1cm4gaW5kZXggIT09IC0xID8gdGFyZ2V0W2luZGV4XSA6IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIGZpbmRJbmRleCA9IGZ1bmN0aW9uIGZpbmRJbmRleCh0YXJnZXQsIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRvTGVuZ3RoKHRhcmdldC5sZW5ndGgpO1xuICAgICAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdmaW5kOiBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXNBcmcpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2suYmluZCh0aGlzQXJnKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2sodGFyZ2V0W2ldLCBpLCB0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH07XG59XG5pZiAodHJ1ZSkge1xuICAgIGluY2x1ZGVzID0gd3JhcE5hdGl2ZShnbG9iYWwuQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzKTtcbn1cbmVsc2Uge1xuICAgIC8qKlxuICAgICAqIEVuc3VyZXMgYSBub24tbmVnYXRpdmUsIG5vbi1pbmZpbml0ZSwgc2FmZSBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIHRvIHZhbGlkYXRlXG4gICAgICogQHJldHVybiBBIHByb3BlciBsZW5ndGhcbiAgICAgKi9cbiAgICBjb25zdCB0b0xlbmd0aCA9IGZ1bmN0aW9uIHRvTGVuZ3RoKGxlbmd0aCkge1xuICAgICAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKTtcbiAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICAgICAgICBsZW5ndGggPSBNYXRoLmZsb29yKGxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRW5zdXJlIGEgbm9uLW5lZ2F0aXZlLCByZWFsLCBzYWZlIGludGVnZXJcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KGxlbmd0aCwgMCksIE1BWF9TQUZFX0lOVEVHRVIpO1xuICAgIH07XG4gICAgaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyh0YXJnZXQsIHNlYXJjaEVsZW1lbnQsIGZyb21JbmRleCA9IDApIHtcbiAgICAgICAgbGV0IGxlbiA9IHRvTGVuZ3RoKHRhcmdldC5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gZnJvbUluZGV4OyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gdGFyZ2V0W2ldO1xuICAgICAgICAgICAgaWYgKHNlYXJjaEVsZW1lbnQgPT09IGN1cnJlbnRFbGVtZW50IHx8XG4gICAgICAgICAgICAgICAgKHNlYXJjaEVsZW1lbnQgIT09IHNlYXJjaEVsZW1lbnQgJiYgY3VycmVudEVsZW1lbnQgIT09IGN1cnJlbnRFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJyYXkubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL2FycmF5Lm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vYXJyYXkubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImNvbnN0IGdsb2JhbE9iamVjdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIGdsb2JhbCBzcGVjIGRlZmluZXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QgY2FsbGVkICdnbG9iYWwnXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWdsb2JhbFxuICAgICAgICAvLyBgZ2xvYmFsYCBpcyBhbHNvIGRlZmluZWQgaW4gTm9kZUpTXG4gICAgICAgIHJldHVybiBnbG9iYWw7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIHdpbmRvdyBpcyBkZWZpbmVkIGluIGJyb3dzZXJzXG4gICAgICAgIHJldHVybiB3aW5kb3c7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBzZWxmIGlzIGRlZmluZWQgaW4gV2ViV29ya2Vyc1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG59KSgpO1xuZXhwb3J0IGRlZmF1bHQgZ2xvYmFsT2JqZWN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2xvYmFsLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9nbG9iYWwubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9nbG9iYWwubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCAnLi9TeW1ib2wnO1xuaW1wb3J0IHsgSElHSF9TVVJST0dBVEVfTUFYLCBISUdIX1NVUlJPR0FURV9NSU4gfSBmcm9tICcuL3N0cmluZyc7XG5jb25zdCBzdGF0aWNEb25lID0geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4vKipcbiAqIEEgY2xhc3MgdGhhdCBfc2hpbXNfIGFuIGl0ZXJhdG9yIGludGVyZmFjZSBvbiBhcnJheSBsaWtlIG9iamVjdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTaGltSXRlcmF0b3Ige1xuICAgIGNvbnN0cnVjdG9yKGxpc3QpIHtcbiAgICAgICAgdGhpcy5fbmV4dEluZGV4ID0gLTE7XG4gICAgICAgIGlmIChpc0l0ZXJhYmxlKGxpc3QpKSB7XG4gICAgICAgICAgICB0aGlzLl9uYXRpdmVJdGVyYXRvciA9IGxpc3RbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbGlzdCA9IGxpc3Q7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBuZXh0IGl0ZXJhdGlvbiByZXN1bHQgZm9yIHRoZSBJdGVyYXRvclxuICAgICAqL1xuICAgIG5leHQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9uYXRpdmVJdGVyYXRvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25hdGl2ZUl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2xpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0aWNEb25lO1xuICAgICAgICB9XG4gICAgICAgIGlmICgrK3RoaXMuX25leHRJbmRleCA8IHRoaXMuX2xpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLl9saXN0W3RoaXMuX25leHRJbmRleF1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXRpY0RvbmU7XG4gICAgfVxuICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG4vKipcbiAqIEEgdHlwZSBndWFyZCBmb3IgY2hlY2tpbmcgaWYgc29tZXRoaW5nIGhhcyBhbiBJdGVyYWJsZSBpbnRlcmZhY2VcbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHR5cGUgZ3VhcmQgYWdhaW5zdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJdGVyYWJsZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWVbU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJztcbn1cbi8qKlxuICogQSB0eXBlIGd1YXJkIGZvciBjaGVja2luZyBpZiBzb21ldGhpbmcgaXMgQXJyYXlMaWtlXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB0eXBlIGd1YXJkIGFnYWluc3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5sZW5ndGggPT09ICdudW1iZXInO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpdGVyYXRvciBmb3IgYW4gb2JqZWN0XG4gKlxuICogQHBhcmFtIGl0ZXJhYmxlIFRoZSBpdGVyYWJsZSBvYmplY3QgdG8gcmV0dXJuIHRoZSBpdGVyYXRvciBmb3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldChpdGVyYWJsZSkge1xuICAgIGlmIChpc0l0ZXJhYmxlKGl0ZXJhYmxlKSkge1xuICAgICAgICByZXR1cm4gaXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0FycmF5TGlrZShpdGVyYWJsZSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTaGltSXRlcmF0b3IoaXRlcmFibGUpO1xuICAgIH1cbn1cbi8qKlxuICogU2hpbXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYGZvciAuLi4gb2ZgIGJsb2Nrc1xuICpcbiAqIEBwYXJhbSBpdGVyYWJsZSBUaGUgb2JqZWN0IHRoZSBwcm92aWRlcyBhbiBpbnRlcmF0b3IgaW50ZXJmYWNlXG4gKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIGl0ZW0gb2YgdGhlIGl0ZXJhYmxlXG4gKiBAcGFyYW0gdGhpc0FyZyBPcHRpb25hbCBzY29wZSB0byBwYXNzIHRoZSBjYWxsYmFja1xuICovXG5leHBvcnQgZnVuY3Rpb24gZm9yT2YoaXRlcmFibGUsIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgbGV0IGJyb2tlbiA9IGZhbHNlO1xuICAgIGZ1bmN0aW9uIGRvQnJlYWsoKSB7XG4gICAgICAgIGJyb2tlbiA9IHRydWU7XG4gICAgfVxuICAgIC8qIFdlIG5lZWQgdG8gaGFuZGxlIGl0ZXJhdGlvbiBvZiBkb3VibGUgYnl0ZSBzdHJpbmdzIHByb3Blcmx5ICovXG4gICAgaWYgKGlzQXJyYXlMaWtlKGl0ZXJhYmxlKSAmJiB0eXBlb2YgaXRlcmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IGwgPSBpdGVyYWJsZS5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICBsZXQgY2hhciA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgaWYgKGkgKyAxIDwgbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvZGUgPSBjaGFyLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGUgPj0gSElHSF9TVVJST0dBVEVfTUlOICYmIGNvZGUgPD0gSElHSF9TVVJST0dBVEVfTUFYKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXIgKz0gaXRlcmFibGVbKytpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIGNoYXIsIGl0ZXJhYmxlLCBkb0JyZWFrKTtcbiAgICAgICAgICAgIGlmIChicm9rZW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0gZ2V0KGl0ZXJhYmxlKTtcbiAgICAgICAgaWYgKGl0ZXJhdG9yKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgd2hpbGUgKCFyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgcmVzdWx0LnZhbHVlLCBpdGVyYWJsZSwgZG9CcmVhayk7XG4gICAgICAgICAgICAgICAgaWYgKGJyb2tlbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWl0ZXJhdG9yLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9pdGVyYXRvci5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL2l0ZXJhdG9yLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4vZ2xvYmFsJztcbi8qKlxuICogVGhlIHNtYWxsZXN0IGludGVydmFsIGJldHdlZW4gdHdvIHJlcHJlc2VudGFibGUgbnVtYmVycy5cbiAqL1xuZXhwb3J0IGNvbnN0IEVQU0lMT04gPSAxO1xuLyoqXG4gKiBUaGUgbWF4aW11bSBzYWZlIGludGVnZXIgaW4gSmF2YVNjcmlwdFxuICovXG5leHBvcnQgY29uc3QgTUFYX1NBRkVfSU5URUdFUiA9IE1hdGgucG93KDIsIDUzKSAtIDE7XG4vKipcbiAqIFRoZSBtaW5pbXVtIHNhZmUgaW50ZWdlciBpbiBKYXZhU2NyaXB0XG4gKi9cbmV4cG9ydCBjb25zdCBNSU5fU0FGRV9JTlRFR0VSID0gLU1BWF9TQUZFX0lOVEVHRVI7XG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGFzc2VkIHZhbHVlIGlzIE5hTiB3aXRob3V0IGNvZXJzaW9uLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBOYU4sIGZhbHNlIGlmIGl0IGlzIG5vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOYU4odmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBnbG9iYWwuaXNOYU4odmFsdWUpO1xufVxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhc3NlZCB2YWx1ZSBpcyBhIGZpbml0ZSBudW1iZXIgd2l0aG91dCBjb2Vyc2lvbi5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgZmluaXRlLCBmYWxzZSBpZiBpdCBpcyBub3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRmluaXRlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgZ2xvYmFsLmlzRmluaXRlKHZhbHVlKTtcbn1cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXNzZWQgdmFsdWUgaXMgYW4gaW50ZWdlci5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlciwgZmFsc2UgaWYgaXQgaXMgbm90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0ludGVnZXIodmFsdWUpIHtcbiAgICByZXR1cm4gaXNGaW5pdGUodmFsdWUpICYmIE1hdGguZmxvb3IodmFsdWUpID09PSB2YWx1ZTtcbn1cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXNzZWQgdmFsdWUgaXMgYW4gaW50ZWdlciB0aGF0IGlzICdzYWZlLCcgbWVhbmluZzpcbiAqICAgMS4gaXQgY2FuIGJlIGV4cHJlc3NlZCBhcyBhbiBJRUVFLTc1NCBkb3VibGUgcHJlY2lzaW9uIG51bWJlclxuICogICAyLiBpdCBoYXMgYSBvbmUtdG8tb25lIG1hcHBpbmcgdG8gYSBtYXRoZW1hdGljYWwgaW50ZWdlciwgbWVhbmluZyBpdHNcbiAqICAgICAgSUVFRS03NTQgcmVwcmVzZW50YXRpb24gY2Fubm90IGJlIHRoZSByZXN1bHQgb2Ygcm91bmRpbmcgYW55IG90aGVyXG4gKiAgICAgIGludGVnZXIgdG8gZml0IHRoZSBJRUVFLTc1NCByZXByZXNlbnRhdGlvblxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLCBmYWxzZSBpZiBpdCBpcyBub3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2FmZUludGVnZXIodmFsdWUpIHtcbiAgICByZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSAmJiBNYXRoLmFicyh2YWx1ZSkgPD0gTUFYX1NBRkVfSU5URUdFUjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW51bWJlci5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vbnVtYmVyLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vbnVtYmVyLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4vZ2xvYmFsJztcbmltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XG5pbXBvcnQgeyBpc1N5bWJvbCB9IGZyb20gJy4vU3ltYm9sJztcbmV4cG9ydCBsZXQgYXNzaWduO1xuLyoqXG4gKiBHZXRzIHRoZSBvd24gcHJvcGVydHkgZGVzY3JpcHRvciBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC5cbiAqIEFuIG93biBwcm9wZXJ0eSBkZXNjcmlwdG9yIGlzIG9uZSB0aGF0IGlzIGRlZmluZWQgZGlyZWN0bHkgb24gdGhlIG9iamVjdCBhbmQgaXMgbm90XG4gKiBpbmhlcml0ZWQgZnJvbSB0aGUgb2JqZWN0J3MgcHJvdG90eXBlLlxuICogQHBhcmFtIG8gT2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHByb3BlcnR5LlxuICogQHBhcmFtIHAgTmFtZSBvZiB0aGUgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBsZXQgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgb3duIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0LiBUaGUgb3duIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IGFyZSB0aG9zZSB0aGF0IGFyZSBkZWZpbmVkIGRpcmVjdGx5XG4gKiBvbiB0aGF0IG9iamVjdCwgYW5kIGFyZSBub3QgaW5oZXJpdGVkIGZyb20gdGhlIG9iamVjdCdzIHByb3RvdHlwZS4gVGhlIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IGluY2x1ZGUgYm90aCBmaWVsZHMgKG9iamVjdHMpIGFuZCBmdW5jdGlvbnMuXG4gKiBAcGFyYW0gbyBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgb3duIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBsZXQgZ2V0T3duUHJvcGVydHlOYW1lcztcbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgc3ltYm9sIHByb3BlcnRpZXMgZm91bmQgZGlyZWN0bHkgb24gb2JqZWN0IG8uXG4gKiBAcGFyYW0gbyBPYmplY3QgdG8gcmV0cmlldmUgdGhlIHN5bWJvbHMgZnJvbS5cbiAqL1xuZXhwb3J0IGxldCBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWVzIGFyZSB0aGUgc2FtZSB2YWx1ZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICogQHBhcmFtIHZhbHVlMSBUaGUgZmlyc3QgdmFsdWUuXG4gKiBAcGFyYW0gdmFsdWUyIFRoZSBzZWNvbmQgdmFsdWUuXG4gKi9cbmV4cG9ydCBsZXQgaXM7XG4vKipcbiAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgb2YgYW4gb2JqZWN0LlxuICogQHBhcmFtIG8gT2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMuIFRoaXMgY2FuIGJlIGFuIG9iamVjdCB0aGF0IHlvdSBjcmVhdGVkIG9yIGFuIGV4aXN0aW5nIERvY3VtZW50IE9iamVjdCBNb2RlbCAoRE9NKSBvYmplY3QuXG4gKi9cbmV4cG9ydCBsZXQga2V5cztcbi8qIEVTNyBPYmplY3Qgc3RhdGljIG1ldGhvZHMgKi9cbmV4cG9ydCBsZXQgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycztcbmV4cG9ydCBsZXQgZW50cmllcztcbmV4cG9ydCBsZXQgdmFsdWVzO1xuaWYgKHRydWUpIHtcbiAgICBjb25zdCBnbG9iYWxPYmplY3QgPSBnbG9iYWwuT2JqZWN0O1xuICAgIGFzc2lnbiA9IGdsb2JhbE9iamVjdC5hc3NpZ247XG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2xvYmFsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiAgICBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZ2xvYmFsT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7XG4gICAgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2xvYmFsT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbiAgICBpcyA9IGdsb2JhbE9iamVjdC5pcztcbiAgICBrZXlzID0gZ2xvYmFsT2JqZWN0LmtleXM7XG59XG5lbHNlIHtcbiAgICBrZXlzID0gZnVuY3Rpb24gc3ltYm9sQXdhcmVLZXlzKG8pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG8pLmZpbHRlcigoa2V5KSA9PiAhQm9vbGVhbihrZXkubWF0Y2goL15AQC4rLykpKTtcbiAgICB9O1xuICAgIGFzc2lnbiA9IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIC4uLnNvdXJjZXMpIHtcbiAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUeXBlRXJyb3IgaWYgdW5kZWZpbmVkIG9yIG51bGxcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvID0gT2JqZWN0KHRhcmdldCk7XG4gICAgICAgIHNvdXJjZXMuZm9yRWFjaCgobmV4dFNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgaWYgKG5leHRTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAvLyBTa2lwIG92ZXIgaWYgdW5kZWZpbmVkIG9yIG51bGxcbiAgICAgICAgICAgICAgICBrZXlzKG5leHRTb3VyY2UpLmZvckVhY2goKG5leHRLZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdG9bbmV4dEtleV0gPSBuZXh0U291cmNlW25leHRLZXldO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRvO1xuICAgIH07XG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8sIHByb3ApIHtcbiAgICAgICAgaWYgKGlzU3ltYm9sKHByb3ApKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvLCBwcm9wKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8sIHByb3ApO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhvKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvKS5maWx0ZXIoKGtleSkgPT4gIUJvb2xlYW4oa2V5Lm1hdGNoKC9eQEAuKy8pKSk7XG4gICAgfTtcbiAgICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMobykge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobylcbiAgICAgICAgICAgIC5maWx0ZXIoKGtleSkgPT4gQm9vbGVhbihrZXkubWF0Y2goL15AQC4rLykpKVxuICAgICAgICAgICAgLm1hcCgoa2V5KSA9PiBTeW1ib2wuZm9yKGtleS5zdWJzdHJpbmcoMikpKTtcbiAgICB9O1xuICAgIGlzID0gZnVuY3Rpb24gaXModmFsdWUxLCB2YWx1ZTIpIHtcbiAgICAgICAgaWYgKHZhbHVlMSA9PT0gdmFsdWUyKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUxICE9PSAwIHx8IDEgLyB2YWx1ZTEgPT09IDEgLyB2YWx1ZTI7IC8vIC0wXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlMSAhPT0gdmFsdWUxICYmIHZhbHVlMiAhPT0gdmFsdWUyOyAvLyBOYU5cbiAgICB9O1xufVxuaWYgKHRydWUpIHtcbiAgICBjb25zdCBnbG9iYWxPYmplY3QgPSBnbG9iYWwuT2JqZWN0O1xuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPSBnbG9iYWxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycztcbiAgICBlbnRyaWVzID0gZ2xvYmFsT2JqZWN0LmVudHJpZXM7XG4gICAgdmFsdWVzID0gZ2xvYmFsT2JqZWN0LnZhbHVlcztcbn1cbmVsc2Uge1xuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG8pIHtcbiAgICAgICAgcmV0dXJuIGdldE93blByb3BlcnR5TmFtZXMobykucmVkdWNlKChwcmV2aW91cywga2V5KSA9PiB7XG4gICAgICAgICAgICBwcmV2aW91c1trZXldID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8sIGtleSk7XG4gICAgICAgICAgICByZXR1cm4gcHJldmlvdXM7XG4gICAgICAgIH0sIHt9KTtcbiAgICB9O1xuICAgIGVudHJpZXMgPSBmdW5jdGlvbiBlbnRyaWVzKG8pIHtcbiAgICAgICAgcmV0dXJuIGtleXMobykubWFwKChrZXkpID0+IFtrZXksIG9ba2V5XV0pO1xuICAgIH07XG4gICAgdmFsdWVzID0gZnVuY3Rpb24gdmFsdWVzKG8pIHtcbiAgICAgICAgcmV0dXJuIGtleXMobykubWFwKChrZXkpID0+IG9ba2V5XSk7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9iamVjdC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vb2JqZWN0Lm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vb2JqZWN0Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4vZ2xvYmFsJztcbmltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XG5pbXBvcnQgeyB3cmFwTmF0aXZlIH0gZnJvbSAnLi9zdXBwb3J0L3V0aWwnO1xuLyoqXG4gKiBUaGUgbWluaW11bSBsb2NhdGlvbiBvZiBoaWdoIHN1cnJvZ2F0ZXNcbiAqL1xuZXhwb3J0IGNvbnN0IEhJR0hfU1VSUk9HQVRFX01JTiA9IDB4ZDgwMDtcbi8qKlxuICogVGhlIG1heGltdW0gbG9jYXRpb24gb2YgaGlnaCBzdXJyb2dhdGVzXG4gKi9cbmV4cG9ydCBjb25zdCBISUdIX1NVUlJPR0FURV9NQVggPSAweGRiZmY7XG4vKipcbiAqIFRoZSBtaW5pbXVtIGxvY2F0aW9uIG9mIGxvdyBzdXJyb2dhdGVzXG4gKi9cbmV4cG9ydCBjb25zdCBMT1dfU1VSUk9HQVRFX01JTiA9IDB4ZGMwMDtcbi8qKlxuICogVGhlIG1heGltdW0gbG9jYXRpb24gb2YgbG93IHN1cnJvZ2F0ZXNcbiAqL1xuZXhwb3J0IGNvbnN0IExPV19TVVJST0dBVEVfTUFYID0gMHhkZmZmO1xuLyogRVM2IHN0YXRpYyBtZXRob2RzICovXG4vKipcbiAqIFJldHVybiB0aGUgU3RyaW5nIHZhbHVlIHdob3NlIGVsZW1lbnRzIGFyZSwgaW4gb3JkZXIsIHRoZSBlbGVtZW50cyBpbiB0aGUgTGlzdCBlbGVtZW50cy5cbiAqIElmIGxlbmd0aCBpcyAwLCB0aGUgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLlxuICogQHBhcmFtIGNvZGVQb2ludHMgVGhlIGNvZGUgcG9pbnRzIHRvIGdlbmVyYXRlIHRoZSBzdHJpbmdcbiAqL1xuZXhwb3J0IGxldCBmcm9tQ29kZVBvaW50O1xuLyoqXG4gKiBgcmF3YCBpcyBpbnRlbmRlZCBmb3IgdXNlIGFzIGEgdGFnIGZ1bmN0aW9uIG9mIGEgVGFnZ2VkIFRlbXBsYXRlIFN0cmluZy4gV2hlbiBjYWxsZWRcbiAqIGFzIHN1Y2ggdGhlIGZpcnN0IGFyZ3VtZW50IHdpbGwgYmUgYSB3ZWxsIGZvcm1lZCB0ZW1wbGF0ZSBjYWxsIHNpdGUgb2JqZWN0IGFuZCB0aGUgcmVzdFxuICogcGFyYW1ldGVyIHdpbGwgY29udGFpbiB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcy5cbiAqIEBwYXJhbSB0ZW1wbGF0ZSBBIHdlbGwtZm9ybWVkIHRlbXBsYXRlIHN0cmluZyBjYWxsIHNpdGUgcmVwcmVzZW50YXRpb24uXG4gKiBAcGFyYW0gc3Vic3RpdHV0aW9ucyBBIHNldCBvZiBzdWJzdGl0dXRpb24gdmFsdWVzLlxuICovXG5leHBvcnQgbGV0IHJhdztcbi8qIEVTNiBpbnN0YW5jZSBtZXRob2RzICovXG4vKipcbiAqIFJldHVybnMgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIE51bWJlciBsZXNzIHRoYW4gMTExNDExMiAoMHgxMTAwMDApIHRoYXQgaXMgdGhlIGNvZGUgcG9pbnRcbiAqIHZhbHVlIG9mIHRoZSBVVEYtMTYgZW5jb2RlZCBjb2RlIHBvaW50IHN0YXJ0aW5nIGF0IHRoZSBzdHJpbmcgZWxlbWVudCBhdCBwb3NpdGlvbiBwb3MgaW5cbiAqIHRoZSBTdHJpbmcgcmVzdWx0aW5nIGZyb20gY29udmVydGluZyB0aGlzIG9iamVjdCB0byBhIFN0cmluZy5cbiAqIElmIHRoZXJlIGlzIG5vIGVsZW1lbnQgYXQgdGhhdCBwb3NpdGlvbiwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuXG4gKiBJZiBhIHZhbGlkIFVURi0xNiBzdXJyb2dhdGUgcGFpciBkb2VzIG5vdCBiZWdpbiBhdCBwb3MsIHRoZSByZXN1bHQgaXMgdGhlIGNvZGUgdW5pdCBhdCBwb3MuXG4gKi9cbmV4cG9ydCBsZXQgY29kZVBvaW50QXQ7XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VxdWVuY2Ugb2YgZWxlbWVudHMgb2Ygc2VhcmNoU3RyaW5nIGNvbnZlcnRlZCB0byBhIFN0cmluZyBpcyB0aGVcbiAqIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgdGhpcyBvYmplY3QgKGNvbnZlcnRlZCB0byBhIFN0cmluZykgc3RhcnRpbmcgYXRcbiAqIGVuZFBvc2l0aW9uIOKAkyBsZW5ndGgodGhpcykuIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlLlxuICovXG5leHBvcnQgbGV0IGVuZHNXaXRoO1xuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgc2VhcmNoU3RyaW5nIGFwcGVhcnMgYXMgYSBzdWJzdHJpbmcgb2YgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoaXNcbiAqIG9iamVjdCB0byBhIFN0cmluZywgYXQgb25lIG9yIG1vcmUgcG9zaXRpb25zIHRoYXQgYXJlXG4gKiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gcG9zaXRpb247IG90aGVyd2lzZSwgcmV0dXJucyBmYWxzZS5cbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBzdHJpbmdcbiAqIEBwYXJhbSBzZWFyY2hTdHJpbmcgc2VhcmNoIHN0cmluZ1xuICogQHBhcmFtIHBvc2l0aW9uIElmIHBvc2l0aW9uIGlzIHVuZGVmaW5lZCwgMCBpcyBhc3N1bWVkLCBzbyBhcyB0byBzZWFyY2ggYWxsIG9mIHRoZSBTdHJpbmcuXG4gKi9cbmV4cG9ydCBsZXQgaW5jbHVkZXM7XG4vKipcbiAqIFJldHVybnMgdGhlIFN0cmluZyB2YWx1ZSByZXN1bHQgb2Ygbm9ybWFsaXppbmcgdGhlIHN0cmluZyBpbnRvIHRoZSBub3JtYWxpemF0aW9uIGZvcm1cbiAqIG5hbWVkIGJ5IGZvcm0gYXMgc3BlY2lmaWVkIGluIFVuaWNvZGUgU3RhbmRhcmQgQW5uZXggIzE1LCBVbmljb2RlIE5vcm1hbGl6YXRpb24gRm9ybXMuXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgc3RyaW5nXG4gKiBAcGFyYW0gZm9ybSBBcHBsaWNhYmxlIHZhbHVlczogXCJORkNcIiwgXCJORkRcIiwgXCJORktDXCIsIG9yIFwiTkZLRFwiLCBJZiBub3Qgc3BlY2lmaWVkIGRlZmF1bHRcbiAqIGlzIFwiTkZDXCJcbiAqL1xuZXhwb3J0IGxldCBub3JtYWxpemU7XG4vKipcbiAqIFJldHVybnMgYSBTdHJpbmcgdmFsdWUgdGhhdCBpcyBtYWRlIGZyb20gY291bnQgY29waWVzIGFwcGVuZGVkIHRvZ2V0aGVyLiBJZiBjb3VudCBpcyAwLFxuICogVCBpcyB0aGUgZW1wdHkgU3RyaW5nIGlzIHJldHVybmVkLlxuICogQHBhcmFtIGNvdW50IG51bWJlciBvZiBjb3BpZXMgdG8gYXBwZW5kXG4gKi9cbmV4cG9ydCBsZXQgcmVwZWF0O1xuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcXVlbmNlIG9mIGVsZW1lbnRzIG9mIHNlYXJjaFN0cmluZyBjb252ZXJ0ZWQgdG8gYSBTdHJpbmcgaXMgdGhlXG4gKiBzYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIHRoaXMgb2JqZWN0IChjb252ZXJ0ZWQgdG8gYSBTdHJpbmcpIHN0YXJ0aW5nIGF0XG4gKiBwb3NpdGlvbi4gT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuXG4gKi9cbmV4cG9ydCBsZXQgc3RhcnRzV2l0aDtcbi8qIEVTNyBpbnN0YW5jZSBtZXRob2RzICovXG4vKipcbiAqIFBhZHMgdGhlIGN1cnJlbnQgc3RyaW5nIHdpdGggYSBnaXZlbiBzdHJpbmcgKHBvc3NpYmx5IHJlcGVhdGVkKSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgc3RyaW5nIHJlYWNoZXMgYSBnaXZlbiBsZW5ndGguXG4gKiBUaGUgcGFkZGluZyBpcyBhcHBsaWVkIGZyb20gdGhlIGVuZCAocmlnaHQpIG9mIHRoZSBjdXJyZW50IHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgc3RyaW5nXG4gKiBAcGFyYW0gbWF4TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcgb25jZSB0aGUgY3VycmVudCBzdHJpbmcgaGFzIGJlZW4gcGFkZGVkLlxuICogICAgICAgIElmIHRoaXMgcGFyYW1ldGVyIGlzIHNtYWxsZXIgdGhhbiB0aGUgY3VycmVudCBzdHJpbmcncyBsZW5ndGgsIHRoZSBjdXJyZW50IHN0cmluZyB3aWxsIGJlIHJldHVybmVkIGFzIGl0IGlzLlxuICpcbiAqIEBwYXJhbSBmaWxsU3RyaW5nIFRoZSBzdHJpbmcgdG8gcGFkIHRoZSBjdXJyZW50IHN0cmluZyB3aXRoLlxuICogICAgICAgIElmIHRoaXMgc3RyaW5nIGlzIHRvbyBsb25nLCBpdCB3aWxsIGJlIHRydW5jYXRlZCBhbmQgdGhlIGxlZnQtbW9zdCBwYXJ0IHdpbGwgYmUgYXBwbGllZC5cbiAqICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaXMgXCIgXCIgKFUrMDAyMCkuXG4gKi9cbmV4cG9ydCBsZXQgcGFkRW5kO1xuLyoqXG4gKiBQYWRzIHRoZSBjdXJyZW50IHN0cmluZyB3aXRoIGEgZ2l2ZW4gc3RyaW5nIChwb3NzaWJseSByZXBlYXRlZCkgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHN0cmluZyByZWFjaGVzIGEgZ2l2ZW4gbGVuZ3RoLlxuICogVGhlIHBhZGRpbmcgaXMgYXBwbGllZCBmcm9tIHRoZSBzdGFydCAobGVmdCkgb2YgdGhlIGN1cnJlbnQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBzdHJpbmdcbiAqIEBwYXJhbSBtYXhMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZyBvbmNlIHRoZSBjdXJyZW50IHN0cmluZyBoYXMgYmVlbiBwYWRkZWQuXG4gKiAgICAgICAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgc21hbGxlciB0aGFuIHRoZSBjdXJyZW50IHN0cmluZydzIGxlbmd0aCwgdGhlIGN1cnJlbnQgc3RyaW5nIHdpbGwgYmUgcmV0dXJuZWQgYXMgaXQgaXMuXG4gKlxuICogQHBhcmFtIGZpbGxTdHJpbmcgVGhlIHN0cmluZyB0byBwYWQgdGhlIGN1cnJlbnQgc3RyaW5nIHdpdGguXG4gKiAgICAgICAgSWYgdGhpcyBzdHJpbmcgaXMgdG9vIGxvbmcsIGl0IHdpbGwgYmUgdHJ1bmNhdGVkIGFuZCB0aGUgbGVmdC1tb3N0IHBhcnQgd2lsbCBiZSBhcHBsaWVkLlxuICogICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciBpcyBcIiBcIiAoVSswMDIwKS5cbiAqL1xuZXhwb3J0IGxldCBwYWRTdGFydDtcbmlmICh0cnVlICYmIHRydWUpIHtcbiAgICBmcm9tQ29kZVBvaW50ID0gZ2xvYmFsLlN0cmluZy5mcm9tQ29kZVBvaW50O1xuICAgIHJhdyA9IGdsb2JhbC5TdHJpbmcucmF3O1xuICAgIGNvZGVQb2ludEF0ID0gd3JhcE5hdGl2ZShnbG9iYWwuU3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdCk7XG4gICAgZW5kc1dpdGggPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoKTtcbiAgICBpbmNsdWRlcyA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMpO1xuICAgIG5vcm1hbGl6ZSA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUubm9ybWFsaXplKTtcbiAgICByZXBlYXQgPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLnJlcGVhdCk7XG4gICAgc3RhcnRzV2l0aCA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aCk7XG59XG5lbHNlIHtcbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZXMgdGhhdCB0ZXh0IGlzIGRlZmluZWQsIGFuZCBub3JtYWxpemVzIHBvc2l0aW9uIChiYXNlZCBvbiB0aGUgZ2l2ZW4gZGVmYXVsdCBpZiB0aGUgaW5wdXQgaXMgTmFOKS5cbiAgICAgKiBVc2VkIGJ5IHN0YXJ0c1dpdGgsIGluY2x1ZGVzLCBhbmQgZW5kc1dpdGguXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIE5vcm1hbGl6ZWQgcG9zaXRpb24uXG4gICAgICovXG4gICAgY29uc3Qgbm9ybWFsaXplU3Vic3RyaW5nQXJncyA9IGZ1bmN0aW9uIChuYW1lLCB0ZXh0LCBzZWFyY2gsIHBvc2l0aW9uLCBpc0VuZCA9IGZhbHNlKSB7XG4gICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmluZy4nICsgbmFtZSArICcgcmVxdWlyZXMgYSB2YWxpZCBzdHJpbmcgdG8gc2VhcmNoIGFnYWluc3QuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGV4dC5sZW5ndGg7XG4gICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gIT09IHBvc2l0aW9uID8gKGlzRW5kID8gbGVuZ3RoIDogMCkgOiBwb3NpdGlvbjtcbiAgICAgICAgcmV0dXJuIFt0ZXh0LCBTdHJpbmcoc2VhcmNoKSwgTWF0aC5taW4oTWF0aC5tYXgocG9zaXRpb24sIDApLCBsZW5ndGgpXTtcbiAgICB9O1xuICAgIGZyb21Db2RlUG9pbnQgPSBmdW5jdGlvbiBmcm9tQ29kZVBvaW50KC4uLmNvZGVQb2ludHMpIHtcbiAgICAgICAgLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5mcm9tQ29kZVBvaW50XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcbiAgICAgICAgY29uc3QgTUFYX1NJWkUgPSAweDQwMDA7XG4gICAgICAgIGxldCBjb2RlVW5pdHMgPSBbXTtcbiAgICAgICAgbGV0IGluZGV4ID0gLTE7XG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBjb2RlUG9pbnQgPSBOdW1iZXIoYXJndW1lbnRzW2luZGV4XSk7XG4gICAgICAgICAgICAvLyBDb2RlIHBvaW50cyBtdXN0IGJlIGZpbml0ZSBpbnRlZ2VycyB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlXG4gICAgICAgICAgICBsZXQgaXNWYWxpZCA9IGlzRmluaXRlKGNvZGVQb2ludCkgJiYgTWF0aC5mbG9vcihjb2RlUG9pbnQpID09PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50ID49IDAgJiYgY29kZVBvaW50IDw9IDB4MTBmZmZmO1xuICAgICAgICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcignc3RyaW5nLmZyb21Db2RlUG9pbnQ6IEludmFsaWQgY29kZSBwb2ludCAnICsgY29kZVBvaW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2RlUG9pbnQgPD0gMHhmZmZmKSB7XG4gICAgICAgICAgICAgICAgLy8gQk1QIGNvZGUgcG9pbnRcbiAgICAgICAgICAgICAgICBjb2RlVW5pdHMucHVzaChjb2RlUG9pbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQXN0cmFsIGNvZGUgcG9pbnQ7IHNwbGl0IGluIHN1cnJvZ2F0ZSBoYWx2ZXNcbiAgICAgICAgICAgICAgICAvLyBodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZyNzdXJyb2dhdGUtZm9ybXVsYWVcbiAgICAgICAgICAgICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMDtcbiAgICAgICAgICAgICAgICBsZXQgaGlnaFN1cnJvZ2F0ZSA9IChjb2RlUG9pbnQgPj4gMTApICsgSElHSF9TVVJST0dBVEVfTUlOO1xuICAgICAgICAgICAgICAgIGxldCBsb3dTdXJyb2dhdGUgPSBjb2RlUG9pbnQgJSAweDQwMCArIExPV19TVVJST0dBVEVfTUlOO1xuICAgICAgICAgICAgICAgIGNvZGVVbml0cy5wdXNoKGhpZ2hTdXJyb2dhdGUsIGxvd1N1cnJvZ2F0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5kZXggKyAxID09PSBsZW5ndGggfHwgY29kZVVuaXRzLmxlbmd0aCA+IE1BWF9TSVpFKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGZyb21DaGFyQ29kZS5hcHBseShudWxsLCBjb2RlVW5pdHMpO1xuICAgICAgICAgICAgICAgIGNvZGVVbml0cy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICByYXcgPSBmdW5jdGlvbiByYXcoY2FsbFNpdGUsIC4uLnN1YnN0aXR1dGlvbnMpIHtcbiAgICAgICAgbGV0IHJhd1N0cmluZ3MgPSBjYWxsU2l0ZS5yYXc7XG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgICAgbGV0IG51bVN1YnN0aXR1dGlvbnMgPSBzdWJzdGl0dXRpb25zLmxlbmd0aDtcbiAgICAgICAgaWYgKGNhbGxTaXRlID09IG51bGwgfHwgY2FsbFNpdGUucmF3ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmluZy5yYXcgcmVxdWlyZXMgYSB2YWxpZCBjYWxsU2l0ZSBvYmplY3Qgd2l0aCBhIHJhdyB2YWx1ZScpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSByYXdTdHJpbmdzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gcmF3U3RyaW5nc1tpXSArIChpIDwgbnVtU3Vic3RpdHV0aW9ucyAmJiBpIDwgbGVuZ3RoIC0gMSA/IHN1YnN0aXR1dGlvbnNbaV0gOiAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIGNvZGVQb2ludEF0ID0gZnVuY3Rpb24gY29kZVBvaW50QXQodGV4dCwgcG9zaXRpb24gPSAwKSB7XG4gICAgICAgIC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0XG4gICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmluZy5jb2RlUG9pbnRBdCByZXF1cmllcyBhIHZhbGlkIHN0cmluZy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsZW5ndGggPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgaWYgKHBvc2l0aW9uICE9PSBwb3NpdGlvbikge1xuICAgICAgICAgICAgcG9zaXRpb24gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIEdldCB0aGUgZmlyc3QgY29kZSB1bml0XG4gICAgICAgIGNvbnN0IGZpcnN0ID0gdGV4dC5jaGFyQ29kZUF0KHBvc2l0aW9uKTtcbiAgICAgICAgaWYgKGZpcnN0ID49IEhJR0hfU1VSUk9HQVRFX01JTiAmJiBmaXJzdCA8PSBISUdIX1NVUlJPR0FURV9NQVggJiYgbGVuZ3RoID4gcG9zaXRpb24gKyAxKSB7XG4gICAgICAgICAgICAvLyBTdGFydCBvZiBhIHN1cnJvZ2F0ZSBwYWlyIChoaWdoIHN1cnJvZ2F0ZSBhbmQgdGhlcmUgaXMgYSBuZXh0IGNvZGUgdW5pdCk7IGNoZWNrIGZvciBsb3cgc3Vycm9nYXRlXG4gICAgICAgICAgICAvLyBodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZyNzdXJyb2dhdGUtZm9ybXVsYWVcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZCA9IHRleHQuY2hhckNvZGVBdChwb3NpdGlvbiArIDEpO1xuICAgICAgICAgICAgaWYgKHNlY29uZCA+PSBMT1dfU1VSUk9HQVRFX01JTiAmJiBzZWNvbmQgPD0gTE9XX1NVUlJPR0FURV9NQVgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGZpcnN0IC0gSElHSF9TVVJST0dBVEVfTUlOKSAqIDB4NDAwICsgc2Vjb25kIC0gTE9XX1NVUlJPR0FURV9NSU4gKyAweDEwMDAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaXJzdDtcbiAgICB9O1xuICAgIGVuZHNXaXRoID0gZnVuY3Rpb24gZW5kc1dpdGgodGV4dCwgc2VhcmNoLCBlbmRQb3NpdGlvbikge1xuICAgICAgICBpZiAoZW5kUG9zaXRpb24gPT0gbnVsbCkge1xuICAgICAgICAgICAgZW5kUG9zaXRpb24gPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBbdGV4dCwgc2VhcmNoLCBlbmRQb3NpdGlvbl0gPSBub3JtYWxpemVTdWJzdHJpbmdBcmdzKCdlbmRzV2l0aCcsIHRleHQsIHNlYXJjaCwgZW5kUG9zaXRpb24sIHRydWUpO1xuICAgICAgICBjb25zdCBzdGFydCA9IGVuZFBvc2l0aW9uIC0gc2VhcmNoLmxlbmd0aDtcbiAgICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKHN0YXJ0LCBlbmRQb3NpdGlvbikgPT09IHNlYXJjaDtcbiAgICB9O1xuICAgIGluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXModGV4dCwgc2VhcmNoLCBwb3NpdGlvbiA9IDApIHtcbiAgICAgICAgW3RleHQsIHNlYXJjaCwgcG9zaXRpb25dID0gbm9ybWFsaXplU3Vic3RyaW5nQXJncygnaW5jbHVkZXMnLCB0ZXh0LCBzZWFyY2gsIHBvc2l0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRleHQuaW5kZXhPZihzZWFyY2gsIHBvc2l0aW9uKSAhPT0gLTE7XG4gICAgfTtcbiAgICByZXBlYXQgPSBmdW5jdGlvbiByZXBlYXQodGV4dCwgY291bnQgPSAwKSB7XG4gICAgICAgIC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcucHJvdG90eXBlLnJlcGVhdFxuICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJpbmcucmVwZWF0IHJlcXVpcmVzIGEgdmFsaWQgc3RyaW5nLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3VudCAhPT0gY291bnQpIHtcbiAgICAgICAgICAgIGNvdW50ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY291bnQgPCAwIHx8IGNvdW50ID09PSBJbmZpbml0eSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3N0cmluZy5yZXBlYXQgcmVxdWlyZXMgYSBub24tbmVnYXRpdmUgZmluaXRlIGNvdW50LicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgICAgd2hpbGUgKGNvdW50KSB7XG4gICAgICAgICAgICBpZiAoY291bnQgJSAyKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IHRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY291bnQgPiAxKSB7XG4gICAgICAgICAgICAgICAgdGV4dCArPSB0ZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY291bnQgPj49IDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIHN0YXJ0c1dpdGggPSBmdW5jdGlvbiBzdGFydHNXaXRoKHRleHQsIHNlYXJjaCwgcG9zaXRpb24gPSAwKSB7XG4gICAgICAgIHNlYXJjaCA9IFN0cmluZyhzZWFyY2gpO1xuICAgICAgICBbdGV4dCwgc2VhcmNoLCBwb3NpdGlvbl0gPSBub3JtYWxpemVTdWJzdHJpbmdBcmdzKCdzdGFydHNXaXRoJywgdGV4dCwgc2VhcmNoLCBwb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IGVuZCA9IHBvc2l0aW9uICsgc2VhcmNoLmxlbmd0aDtcbiAgICAgICAgaWYgKGVuZCA+IHRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQuc2xpY2UocG9zaXRpb24sIGVuZCkgPT09IHNlYXJjaDtcbiAgICB9O1xufVxuaWYgKHRydWUpIHtcbiAgICBwYWRFbmQgPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLnBhZEVuZCk7XG4gICAgcGFkU3RhcnQgPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLnBhZFN0YXJ0KTtcbn1cbmVsc2Uge1xuICAgIHBhZEVuZCA9IGZ1bmN0aW9uIHBhZEVuZCh0ZXh0LCBtYXhMZW5ndGgsIGZpbGxTdHJpbmcgPSAnICcpIHtcbiAgICAgICAgaWYgKHRleHQgPT09IG51bGwgfHwgdGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJpbmcucmVwZWF0IHJlcXVpcmVzIGEgdmFsaWQgc3RyaW5nLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXhMZW5ndGggPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc3RyaW5nLnBhZEVuZCByZXF1aXJlcyBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgY291bnQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heExlbmd0aCA9PT0gbnVsbCB8fCBtYXhMZW5ndGggPT09IHVuZGVmaW5lZCB8fCBtYXhMZW5ndGggPCAwKSB7XG4gICAgICAgICAgICBtYXhMZW5ndGggPSAwO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdHJUZXh0ID0gU3RyaW5nKHRleHQpO1xuICAgICAgICBjb25zdCBwYWRkaW5nID0gbWF4TGVuZ3RoIC0gc3RyVGV4dC5sZW5ndGg7XG4gICAgICAgIGlmIChwYWRkaW5nID4gMCkge1xuICAgICAgICAgICAgc3RyVGV4dCArPVxuICAgICAgICAgICAgICAgIHJlcGVhdChmaWxsU3RyaW5nLCBNYXRoLmZsb29yKHBhZGRpbmcgLyBmaWxsU3RyaW5nLmxlbmd0aCkpICtcbiAgICAgICAgICAgICAgICAgICAgZmlsbFN0cmluZy5zbGljZSgwLCBwYWRkaW5nICUgZmlsbFN0cmluZy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHJUZXh0O1xuICAgIH07XG4gICAgcGFkU3RhcnQgPSBmdW5jdGlvbiBwYWRTdGFydCh0ZXh0LCBtYXhMZW5ndGgsIGZpbGxTdHJpbmcgPSAnICcpIHtcbiAgICAgICAgaWYgKHRleHQgPT09IG51bGwgfHwgdGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJpbmcucmVwZWF0IHJlcXVpcmVzIGEgdmFsaWQgc3RyaW5nLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXhMZW5ndGggPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc3RyaW5nLnBhZFN0YXJ0IHJlcXVpcmVzIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSBjb3VudC4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4TGVuZ3RoID09PSBudWxsIHx8IG1heExlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IG1heExlbmd0aCA8IDApIHtcbiAgICAgICAgICAgIG1heExlbmd0aCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0clRleHQgPSBTdHJpbmcodGV4dCk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmcgPSBtYXhMZW5ndGggLSBzdHJUZXh0Lmxlbmd0aDtcbiAgICAgICAgaWYgKHBhZGRpbmcgPiAwKSB7XG4gICAgICAgICAgICBzdHJUZXh0ID1cbiAgICAgICAgICAgICAgICByZXBlYXQoZmlsbFN0cmluZywgTWF0aC5mbG9vcihwYWRkaW5nIC8gZmlsbFN0cmluZy5sZW5ndGgpKSArXG4gICAgICAgICAgICAgICAgICAgIGZpbGxTdHJpbmcuc2xpY2UoMCwgcGFkZGluZyAlIGZpbGxTdHJpbmcubGVuZ3RoKSArXG4gICAgICAgICAgICAgICAgICAgIHN0clRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0clRleHQ7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmluZy5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vc3RyaW5nLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vc3RyaW5nLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgaGFzLCB7IGFkZCB9IGZyb20gJy4uLy4uL2hhcy9oYXMnO1xuaW1wb3J0IGdsb2JhbCBmcm9tICcuLi9nbG9iYWwnO1xuZXhwb3J0IGRlZmF1bHQgaGFzO1xuZXhwb3J0ICogZnJvbSAnLi4vLi4vaGFzL2hhcyc7XG4vKiBFQ01BU2NyaXB0IDYgYW5kIDcgRmVhdHVyZXMgKi9cbi8qIEFycmF5ICovXG5hZGQoJ2VzNi1hcnJheScsICgpID0+IHtcbiAgICByZXR1cm4gKFsnZnJvbScsICdvZiddLmV2ZXJ5KChrZXkpID0+IGtleSBpbiBnbG9iYWwuQXJyYXkpICYmXG4gICAgICAgIFsnZmluZEluZGV4JywgJ2ZpbmQnLCAnY29weVdpdGhpbiddLmV2ZXJ5KChrZXkpID0+IGtleSBpbiBnbG9iYWwuQXJyYXkucHJvdG90eXBlKSk7XG59LCB0cnVlKTtcbmFkZCgnZXM2LWFycmF5LWZpbGwnLCAoKSA9PiB7XG4gICAgaWYgKCdmaWxsJyBpbiBnbG9iYWwuQXJyYXkucHJvdG90eXBlKSB7XG4gICAgICAgIC8qIFNvbWUgdmVyc2lvbnMgb2YgU2FmYXJpIGRvIG5vdCBwcm9wZXJseSBpbXBsZW1lbnQgdGhpcyAqL1xuICAgICAgICByZXR1cm4gWzFdLmZpbGwoOSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKVswXSA9PT0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufSwgdHJ1ZSk7XG5hZGQoJ2VzNy1hcnJheScsICgpID0+ICdpbmNsdWRlcycgaW4gZ2xvYmFsLkFycmF5LnByb3RvdHlwZSwgdHJ1ZSk7XG4vKiBNYXAgKi9cbmFkZCgnZXM2LW1hcCcsICgpID0+IHtcbiAgICBpZiAodHlwZW9mIGdsb2JhbC5NYXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLypcbiAgICBJRTExIGFuZCBvbGRlciB2ZXJzaW9ucyBvZiBTYWZhcmkgYXJlIG1pc3NpbmcgY3JpdGljYWwgRVM2IE1hcCBmdW5jdGlvbmFsaXR5XG4gICAgV2Ugd3JhcCB0aGlzIGluIGEgdHJ5L2NhdGNoIGJlY2F1c2Ugc29tZXRpbWVzIHRoZSBNYXAgY29uc3RydWN0b3IgZXhpc3RzLCBidXQgZG9lcyBub3RcbiAgICB0YWtlIGFyZ3VtZW50cyAoaU9TIDguNClcbiAgICAgKi9cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG1hcCA9IG5ldyBnbG9iYWwuTWFwKFtbMCwgMV1dKTtcbiAgICAgICAgICAgIHJldHVybiBtYXAuaGFzKDApICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIG1hcC5rZXlzID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgICAgICAgICAgdHJ1ZSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBtYXAudmFsdWVzID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIG1hcC5lbnRyaWVzID09PSAnZnVuY3Rpb24nO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogbm90IHRlc3Rpbmcgb24gaU9TIGF0IHRoZSBtb21lbnQgKi9cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59LCB0cnVlKTtcbi8qIE1hdGggKi9cbmFkZCgnZXM2LW1hdGgnLCAoKSA9PiB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgJ2NsejMyJyxcbiAgICAgICAgJ3NpZ24nLFxuICAgICAgICAnbG9nMTAnLFxuICAgICAgICAnbG9nMicsXG4gICAgICAgICdsb2cxcCcsXG4gICAgICAgICdleHBtMScsXG4gICAgICAgICdjb3NoJyxcbiAgICAgICAgJ3NpbmgnLFxuICAgICAgICAndGFuaCcsXG4gICAgICAgICdhY29zaCcsXG4gICAgICAgICdhc2luaCcsXG4gICAgICAgICdhdGFuaCcsXG4gICAgICAgICd0cnVuYycsXG4gICAgICAgICdmcm91bmQnLFxuICAgICAgICAnY2JydCcsXG4gICAgICAgICdoeXBvdCdcbiAgICBdLmV2ZXJ5KChuYW1lKSA9PiB0eXBlb2YgZ2xvYmFsLk1hdGhbbmFtZV0gPT09ICdmdW5jdGlvbicpO1xufSwgdHJ1ZSk7XG5hZGQoJ2VzNi1tYXRoLWltdWwnLCAoKSA9PiB7XG4gICAgaWYgKCdpbXVsJyBpbiBnbG9iYWwuTWF0aCkge1xuICAgICAgICAvKiBTb21lIHZlcnNpb25zIG9mIFNhZmFyaSBvbiBpb3MgZG8gbm90IHByb3Blcmx5IGltcGxlbWVudCB0aGlzICovXG4gICAgICAgIHJldHVybiBNYXRoLmltdWwoMHhmZmZmZmZmZiwgNSkgPT09IC01O1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59LCB0cnVlKTtcbi8qIE9iamVjdCAqL1xuYWRkKCdlczYtb2JqZWN0JywgKCkgPT4ge1xuICAgIHJldHVybiB0cnVlICYmXG4gICAgICAgIFsnYXNzaWduJywgJ2lzJywgJ2dldE93blByb3BlcnR5U3ltYm9scycsICdzZXRQcm90b3R5cGVPZiddLmV2ZXJ5KChuYW1lKSA9PiB0eXBlb2YgZ2xvYmFsLk9iamVjdFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJyk7XG59LCB0cnVlKTtcbmFkZCgnZXMyMDE3LW9iamVjdCcsICgpID0+IHtcbiAgICByZXR1cm4gWyd2YWx1ZXMnLCAnZW50cmllcycsICdnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzJ10uZXZlcnkoKG5hbWUpID0+IHR5cGVvZiBnbG9iYWwuT2JqZWN0W25hbWVdID09PSAnZnVuY3Rpb24nKTtcbn0sIHRydWUpO1xuLyogT2JzZXJ2YWJsZSAqL1xuYWRkKCdlcy1vYnNlcnZhYmxlJywgKCkgPT4gdHlwZW9mIGdsb2JhbC5PYnNlcnZhYmxlICE9PSAndW5kZWZpbmVkJywgdHJ1ZSk7XG4vKiBQcm9taXNlICovXG5hZGQoJ2VzNi1wcm9taXNlJywgKCkgPT4gdHlwZW9mIGdsb2JhbC5Qcm9taXNlICE9PSAndW5kZWZpbmVkJyAmJiB0cnVlLCB0cnVlKTtcbi8qIFNldCAqL1xuYWRkKCdlczYtc2V0JywgKCkgPT4ge1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsLlNldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvKiBJRTExIGFuZCBvbGRlciB2ZXJzaW9ucyBvZiBTYWZhcmkgYXJlIG1pc3NpbmcgY3JpdGljYWwgRVM2IFNldCBmdW5jdGlvbmFsaXR5ICovXG4gICAgICAgIGNvbnN0IHNldCA9IG5ldyBnbG9iYWwuU2V0KFsxXSk7XG4gICAgICAgIHJldHVybiBzZXQuaGFzKDEpICYmICdrZXlzJyBpbiBzZXQgJiYgdHlwZW9mIHNldC5rZXlzID09PSAnZnVuY3Rpb24nICYmIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn0sIHRydWUpO1xuLyogU3RyaW5nICovXG5hZGQoJ2VzNi1zdHJpbmcnLCAoKSA9PiB7XG4gICAgcmV0dXJuIChbXG4gICAgICAgIC8qIHN0YXRpYyBtZXRob2RzICovXG4gICAgICAgICdmcm9tQ29kZVBvaW50J1xuICAgIF0uZXZlcnkoKGtleSkgPT4gdHlwZW9mIGdsb2JhbC5TdHJpbmdba2V5XSA9PT0gJ2Z1bmN0aW9uJykgJiZcbiAgICAgICAgW1xuICAgICAgICAgICAgLyogaW5zdGFuY2UgbWV0aG9kcyAqL1xuICAgICAgICAgICAgJ2NvZGVQb2ludEF0JyxcbiAgICAgICAgICAgICdub3JtYWxpemUnLFxuICAgICAgICAgICAgJ3JlcGVhdCcsXG4gICAgICAgICAgICAnc3RhcnRzV2l0aCcsXG4gICAgICAgICAgICAnZW5kc1dpdGgnLFxuICAgICAgICAgICAgJ2luY2x1ZGVzJ1xuICAgICAgICBdLmV2ZXJ5KChrZXkpID0+IHR5cGVvZiBnbG9iYWwuU3RyaW5nLnByb3RvdHlwZVtrZXldID09PSAnZnVuY3Rpb24nKSk7XG59LCB0cnVlKTtcbmFkZCgnZXM2LXN0cmluZy1yYXcnLCAoKSA9PiB7XG4gICAgZnVuY3Rpb24gZ2V0Q2FsbFNpdGUoY2FsbFNpdGUsIC4uLnN1YnN0aXR1dGlvbnMpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gWy4uLmNhbGxTaXRlXTtcbiAgICAgICAgcmVzdWx0LnJhdyA9IGNhbGxTaXRlLnJhdztcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgaWYgKCdyYXcnIGluIGdsb2JhbC5TdHJpbmcpIHtcbiAgICAgICAgbGV0IGIgPSAxO1xuICAgICAgICBsZXQgY2FsbFNpdGUgPSBnZXRDYWxsU2l0ZSBgYVxcbiR7Yn1gO1xuICAgICAgICBjYWxsU2l0ZS5yYXcgPSBbJ2FcXFxcbiddO1xuICAgICAgICBjb25zdCBzdXBwb3J0c1RydW5jID0gZ2xvYmFsLlN0cmluZy5yYXcoY2FsbFNpdGUsIDQyKSA9PT0gJ2E6XFxcXG4nO1xuICAgICAgICByZXR1cm4gc3VwcG9ydHNUcnVuYztcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufSwgdHJ1ZSk7XG5hZGQoJ2VzMjAxNy1zdHJpbmcnLCAoKSA9PiB7XG4gICAgcmV0dXJuIFsncGFkU3RhcnQnLCAncGFkRW5kJ10uZXZlcnkoKGtleSkgPT4gdHlwZW9mIGdsb2JhbC5TdHJpbmcucHJvdG90eXBlW2tleV0gPT09ICdmdW5jdGlvbicpO1xufSwgdHJ1ZSk7XG4vKiBTeW1ib2wgKi9cbmFkZCgnZXM2LXN5bWJvbCcsICgpID0+IHR5cGVvZiBnbG9iYWwuU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgU3ltYm9sKCkgPT09ICdzeW1ib2wnLCB0cnVlKTtcbi8qIFdlYWtNYXAgKi9cbmFkZCgnZXM2LXdlYWttYXAnLCAoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBnbG9iYWwuV2Vha01hcCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLyogSUUxMSBhbmQgb2xkZXIgdmVyc2lvbnMgb2YgU2FmYXJpIGFyZSBtaXNzaW5nIGNyaXRpY2FsIEVTNiBNYXAgZnVuY3Rpb25hbGl0eSAqL1xuICAgICAgICBjb25zdCBrZXkxID0ge307XG4gICAgICAgIGNvbnN0IGtleTIgPSB7fTtcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IGdsb2JhbC5XZWFrTWFwKFtba2V5MSwgMV1dKTtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZShrZXkxKTtcbiAgICAgICAgcmV0dXJuIG1hcC5nZXQoa2V5MSkgPT09IDEgJiYgbWFwLnNldChrZXkyLCAyKSA9PT0gbWFwICYmIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn0sIHRydWUpO1xuLyogTWlzY2VsbGFuZW91cyBmZWF0dXJlcyAqL1xuYWRkKCdtaWNyb3Rhc2tzJywgKCkgPT4gdHJ1ZSB8fCBmYWxzZSB8fCB0cnVlLCB0cnVlKTtcbmFkZCgncG9zdG1lc3NhZ2UnLCAoKSA9PiB7XG4gICAgLy8gSWYgd2luZG93IGlzIHVuZGVmaW5lZCwgYW5kIHdlIGhhdmUgcG9zdE1lc3NhZ2UsIGl0IHByb2JhYmx5IG1lYW5zIHdlJ3JlIGluIGEgd2ViIHdvcmtlci4gV2ViIHdvcmtlcnMgaGF2ZVxuICAgIC8vIHBvc3QgbWVzc2FnZSBidXQgaXQgZG9lc24ndCB3b3JrIGhvdyB3ZSBleHBlY3QgaXQgdG8sIHNvIGl0J3MgYmVzdCBqdXN0IHRvIHByZXRlbmQgaXQgZG9lc24ndCBleGlzdC5cbiAgICByZXR1cm4gdHlwZW9mIGdsb2JhbC53aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBnbG9iYWwucG9zdE1lc3NhZ2UgPT09ICdmdW5jdGlvbic7XG59LCB0cnVlKTtcbmFkZCgncmFmJywgKCkgPT4gdHlwZW9mIGdsb2JhbC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbicsIHRydWUpO1xuYWRkKCdzZXRpbW1lZGlhdGUnLCAoKSA9PiB0eXBlb2YgZ2xvYmFsLnNldEltbWVkaWF0ZSAhPT0gJ3VuZGVmaW5lZCcsIHRydWUpO1xuLyogRE9NIEZlYXR1cmVzICovXG5hZGQoJ2RvbS1tdXRhdGlvbm9ic2VydmVyJywgKCkgPT4ge1xuICAgIGlmICh0cnVlICYmIEJvb2xlYW4oZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXIpKSB7XG4gICAgICAgIC8vIElFMTEgaGFzIGFuIHVucmVsaWFibGUgTXV0YXRpb25PYnNlcnZlciBpbXBsZW1lbnRhdGlvbiB3aGVyZSBzZXRQcm9wZXJ0eSgpIGRvZXMgbm90XG4gICAgICAgIC8vIGdlbmVyYXRlIGEgbXV0YXRpb24gZXZlbnQsIG9ic2VydmVycyBjYW4gY3Jhc2gsIGFuZCB0aGUgcXVldWUgZG9lcyBub3QgZHJhaW5cbiAgICAgICAgLy8gcmVsaWFibHkuIFRoZSBmb2xsb3dpbmcgZmVhdHVyZSB0ZXN0IHdhcyBhZGFwdGVkIGZyb21cbiAgICAgICAgLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vdDEwa28vNGFjZWI4YzcxNjgxZmRiMjc1ZTMzZWZlNWU1NzZiMTRcbiAgICAgICAgY29uc3QgZXhhbXBsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZSAqL1xuICAgICAgICBjb25zdCBIb3N0TXV0YXRpb25PYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xuICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBIb3N0TXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAoKSB7IH0pO1xuICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGV4YW1wbGUsIHsgYXR0cmlidXRlczogdHJ1ZSB9KTtcbiAgICAgICAgZXhhbXBsZS5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdibG9jaycpO1xuICAgICAgICByZXR1cm4gQm9vbGVhbihvYnNlcnZlci50YWtlUmVjb3JkcygpLmxlbmd0aCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn0sIHRydWUpO1xuYWRkKCdkb20td2ViYW5pbWF0aW9uJywgKCkgPT4gdHJ1ZSAmJiBnbG9iYWwuQW5pbWF0aW9uICE9PSB1bmRlZmluZWQgJiYgZ2xvYmFsLktleWZyYW1lRWZmZWN0ICE9PSB1bmRlZmluZWQsIHRydWUpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFzLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9zdXBwb3J0L2hhcy5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL3N1cHBvcnQvaGFzLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4uL2dsb2JhbCc7XG5pbXBvcnQgaGFzIGZyb20gJy4vaGFzJztcbmZ1bmN0aW9uIGV4ZWN1dGVUYXNrKGl0ZW0pIHtcbiAgICBpZiAoaXRlbSAmJiBpdGVtLmlzQWN0aXZlICYmIGl0ZW0uY2FsbGJhY2spIHtcbiAgICAgICAgaXRlbS5jYWxsYmFjaygpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFF1ZXVlSGFuZGxlKGl0ZW0sIGRlc3RydWN0b3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgICAgICBpdGVtLmlzQWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICBpdGVtLmNhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChkZXN0cnVjdG9yKSB7XG4gICAgICAgICAgICAgICAgZGVzdHJ1Y3RvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cbmxldCBjaGVja01pY3JvVGFza1F1ZXVlO1xubGV0IG1pY3JvVGFza3M7XG4vKipcbiAqIFNjaGVkdWxlcyBhIGNhbGxiYWNrIHRvIHRoZSBtYWNyb3Rhc2sgcXVldWUuXG4gKlxuICogQHBhcmFtIGNhbGxiYWNrIHRoZSBmdW5jdGlvbiB0byBiZSBxdWV1ZWQgYW5kIGxhdGVyIGV4ZWN1dGVkLlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggYSBgZGVzdHJveWAgbWV0aG9kIHRoYXQsIHdoZW4gY2FsbGVkLCBwcmV2ZW50cyB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmcm9tIGV4ZWN1dGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IHF1ZXVlVGFzayA9IChmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGRlc3RydWN0b3I7XG4gICAgbGV0IGVucXVldWU7XG4gICAgLy8gU2luY2UgdGhlIElFIGltcGxlbWVudGF0aW9uIG9mIGBzZXRJbW1lZGlhdGVgIGlzIG5vdCBmbGF3bGVzcywgd2Ugd2lsbCB0ZXN0IGZvciBgcG9zdE1lc3NhZ2VgIGZpcnN0LlxuICAgIGlmICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlID0gW107XG4gICAgICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAvLyBDb25maXJtIHRoYXQgdGhlIGV2ZW50IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIGN1cnJlbnQgd2luZG93IGFuZCBieSB0aGlzIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlID09PSBnbG9iYWwgJiYgZXZlbnQuZGF0YSA9PT0gJ2Rvam8tcXVldWUtbWVzc2FnZScpIHtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVUYXNrKHF1ZXVlLnNoaWZ0KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGVucXVldWUgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgcXVldWUucHVzaChpdGVtKTtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZSgnZG9qby1xdWV1ZS1tZXNzYWdlJywgJyonKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZmFsc2UpIHtcbiAgICAgICAgZGVzdHJ1Y3RvciA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gc2V0SW1tZWRpYXRlKGV4ZWN1dGVUYXNrLmJpbmQobnVsbCwgaXRlbSkpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZGVzdHJ1Y3RvciA9IGdsb2JhbC5jbGVhclRpbWVvdXQ7XG4gICAgICAgIGVucXVldWUgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZXhlY3V0ZVRhc2suYmluZChudWxsLCBpdGVtKSwgMCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHF1ZXVlVGFzayhjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBpdGVtID0ge1xuICAgICAgICAgICAgaXNBY3RpdmU6IHRydWUsXG4gICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2tcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaWQgPSBlbnF1ZXVlKGl0ZW0pO1xuICAgICAgICByZXR1cm4gZ2V0UXVldWVIYW5kbGUoaXRlbSwgZGVzdHJ1Y3RvciAmJlxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGRlc3RydWN0b3IoaWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFRPRE86IFVzZSBhc3BlY3QuYmVmb3JlIHdoZW4gaXQgaXMgYXZhaWxhYmxlLlxuICAgIHJldHVybiB0cnVlXG4gICAgICAgID8gcXVldWVUYXNrXG4gICAgICAgIDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjaGVja01pY3JvVGFza1F1ZXVlKCk7XG4gICAgICAgICAgICByZXR1cm4gcXVldWVUYXNrKGNhbGxiYWNrKTtcbiAgICAgICAgfTtcbn0pKCk7XG4vLyBXaGVuIG5vIG1lY2hhbmlzbSBmb3IgcmVnaXN0ZXJpbmcgbWljcm90YXNrcyBpcyBleHBvc2VkIGJ5IHRoZSBlbnZpcm9ubWVudCwgbWljcm90YXNrcyB3aWxsXG4vLyBiZSBxdWV1ZWQgYW5kIHRoZW4gZXhlY3V0ZWQgaW4gYSBzaW5nbGUgbWFjcm90YXNrIGJlZm9yZSB0aGUgb3RoZXIgbWFjcm90YXNrcyBhcmUgZXhlY3V0ZWQuXG5pZiAoIXRydWUpIHtcbiAgICBsZXQgaXNNaWNyb1Rhc2tRdWV1ZWQgPSBmYWxzZTtcbiAgICBtaWNyb1Rhc2tzID0gW107XG4gICAgY2hlY2tNaWNyb1Rhc2tRdWV1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFpc01pY3JvVGFza1F1ZXVlZCkge1xuICAgICAgICAgICAgaXNNaWNyb1Rhc2tRdWV1ZWQgPSB0cnVlO1xuICAgICAgICAgICAgcXVldWVUYXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpc01pY3JvVGFza1F1ZXVlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChtaWNyb1Rhc2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChpdGVtID0gbWljcm9UYXNrcy5zaGlmdCgpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVRhc2soaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59XG4vKipcbiAqIFNjaGVkdWxlcyBhbiBhbmltYXRpb24gdGFzayB3aXRoIGB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lYCBpZiBpdCBleGlzdHMsIG9yIHdpdGggYHF1ZXVlVGFza2Agb3RoZXJ3aXNlLlxuICpcbiAqIFNpbmNlIHJlcXVlc3RBbmltYXRpb25GcmFtZSdzIGJlaGF2aW9yIGRvZXMgbm90IG1hdGNoIHRoYXQgZXhwZWN0ZWQgZnJvbSBgcXVldWVUYXNrYCwgaXQgaXMgbm90IHVzZWQgdGhlcmUuXG4gKiBIb3dldmVyLCBhdCB0aW1lcyBpdCBtYWtlcyBtb3JlIHNlbnNlIHRvIGRlbGVnYXRlIHRvIHJlcXVlc3RBbmltYXRpb25GcmFtZTsgaGVuY2UgdGhlIGZvbGxvd2luZyBtZXRob2QuXG4gKlxuICogQHBhcmFtIGNhbGxiYWNrIHRoZSBmdW5jdGlvbiB0byBiZSBxdWV1ZWQgYW5kIGxhdGVyIGV4ZWN1dGVkLlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggYSBgZGVzdHJveWAgbWV0aG9kIHRoYXQsIHdoZW4gY2FsbGVkLCBwcmV2ZW50cyB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmcm9tIGV4ZWN1dGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IHF1ZXVlQW5pbWF0aW9uVGFzayA9IChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0cnVlKSB7XG4gICAgICAgIHJldHVybiBxdWV1ZVRhc2s7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHF1ZXVlQW5pbWF0aW9uVGFzayhjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBpdGVtID0ge1xuICAgICAgICAgICAgaXNBY3RpdmU6IHRydWUsXG4gICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2tcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZXhlY3V0ZVRhc2suYmluZChudWxsLCBpdGVtKSk7XG4gICAgICAgIHJldHVybiBnZXRRdWV1ZUhhbmRsZShpdGVtLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShyYWZJZCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBUT0RPOiBVc2UgYXNwZWN0LmJlZm9yZSB3aGVuIGl0IGlzIGF2YWlsYWJsZS5cbiAgICByZXR1cm4gdHJ1ZVxuICAgICAgICA/IHF1ZXVlQW5pbWF0aW9uVGFza1xuICAgICAgICA6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgY2hlY2tNaWNyb1Rhc2tRdWV1ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlQW5pbWF0aW9uVGFzayhjYWxsYmFjayk7XG4gICAgICAgIH07XG59KSgpO1xuLyoqXG4gKiBTY2hlZHVsZXMgYSBjYWxsYmFjayB0byB0aGUgbWljcm90YXNrIHF1ZXVlLlxuICpcbiAqIEFueSBjYWxsYmFja3MgcmVnaXN0ZXJlZCB3aXRoIGBxdWV1ZU1pY3JvVGFza2Agd2lsbCBiZSBleGVjdXRlZCBiZWZvcmUgdGhlIG5leHQgbWFjcm90YXNrLiBJZiBubyBuYXRpdmVcbiAqIG1lY2hhbmlzbSBmb3Igc2NoZWR1bGluZyBtYWNyb3Rhc2tzIGlzIGV4cG9zZWQsIHRoZW4gYW55IGNhbGxiYWNrcyB3aWxsIGJlIGZpcmVkIGJlZm9yZSBhbnkgbWFjcm90YXNrXG4gKiByZWdpc3RlcmVkIHdpdGggYHF1ZXVlVGFza2Agb3IgYHF1ZXVlQW5pbWF0aW9uVGFza2AuXG4gKlxuICogQHBhcmFtIGNhbGxiYWNrIHRoZSBmdW5jdGlvbiB0byBiZSBxdWV1ZWQgYW5kIGxhdGVyIGV4ZWN1dGVkLlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggYSBgZGVzdHJveWAgbWV0aG9kIHRoYXQsIHdoZW4gY2FsbGVkLCBwcmV2ZW50cyB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmcm9tIGV4ZWN1dGluZy5cbiAqL1xuZXhwb3J0IGxldCBxdWV1ZU1pY3JvVGFzayA9IChmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGVucXVldWU7XG4gICAgaWYgKGZhbHNlKSB7XG4gICAgICAgIGVucXVldWUgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgZ2xvYmFsLnByb2Nlc3MubmV4dFRpY2soZXhlY3V0ZVRhc2suYmluZChudWxsLCBpdGVtKSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKHRydWUpIHtcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICBnbG9iYWwuUHJvbWlzZS5yZXNvbHZlKGl0ZW0pLnRoZW4oZXhlY3V0ZVRhc2spO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIGlmICh0cnVlKSB7XG4gICAgICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lICovXG4gICAgICAgIGNvbnN0IEhvc3RNdXRhdGlvbk9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgY29uc3QgcXVldWUgPSBbXTtcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSG9zdE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gcXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLmlzQWN0aXZlICYmIGl0ZW0uY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5jYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG9ic2VydmVyLm9ic2VydmUobm9kZSwgeyBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuICAgICAgICBlbnF1ZXVlID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2goaXRlbSk7XG4gICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgncXVldWVTdGF0dXMnLCAnMScpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICBjaGVja01pY3JvVGFza1F1ZXVlKCk7XG4gICAgICAgICAgICBtaWNyb1Rhc2tzLnB1c2goaXRlbSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHtcbiAgICAgICAgICAgIGlzQWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrXG4gICAgICAgIH07XG4gICAgICAgIGVucXVldWUoaXRlbSk7XG4gICAgICAgIHJldHVybiBnZXRRdWV1ZUhhbmRsZShpdGVtKTtcbiAgICB9O1xufSkoKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXF1ZXVlLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9zdXBwb3J0L3F1ZXVlLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vc3VwcG9ydC9xdWV1ZS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgYSB2YWx1ZSBwcm9wZXJ0eSBkZXNjcmlwdG9yXG4gKlxuICogQHBhcmFtIHZhbHVlICAgICAgICBUaGUgdmFsdWUgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3Igc2hvdWxkIGJlIHNldCB0b1xuICogQHBhcmFtIGVudW1lcmFibGUgICBJZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGVudW1iZXJhYmxlLCBkZWZhdWx0cyB0byBmYWxzZVxuICogQHBhcmFtIHdyaXRhYmxlICAgICBJZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIHdyaXRhYmxlLCBkZWZhdWx0cyB0byB0cnVlXG4gKiBAcGFyYW0gY29uZmlndXJhYmxlIElmIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uZmlndXJhYmxlLCBkZWZhdWx0cyB0byB0cnVlXG4gKiBAcmV0dXJuICAgICAgICAgICAgIFRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVEZXNjcmlwdG9yKHZhbHVlLCBlbnVtZXJhYmxlID0gZmFsc2UsIHdyaXRhYmxlID0gdHJ1ZSwgY29uZmlndXJhYmxlID0gdHJ1ZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogZW51bWVyYWJsZSxcbiAgICAgICAgd3JpdGFibGU6IHdyaXRhYmxlLFxuICAgICAgICBjb25maWd1cmFibGU6IGNvbmZpZ3VyYWJsZVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gd3JhcE5hdGl2ZShuYXRpdmVGdW5jdGlvbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCAuLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuYXRpdmVGdW5jdGlvbi5hcHBseSh0YXJnZXQsIGFyZ3MpO1xuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlsLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9zdXBwb3J0L3V0aWwubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9zdXBwb3J0L3V0aWwubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCB7IEV2ZW50ZWQgfSBmcm9tICcuLi9jb3JlL0V2ZW50ZWQnO1xuZXhwb3J0IGNsYXNzIEluamVjdG9yIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgY29uc3RydWN0b3IocGF5bG9hZCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9wYXlsb2FkID0gcGF5bG9hZDtcbiAgICB9XG4gICAgc2V0SW52YWxpZGF0b3IoaW52YWxpZGF0b3IpIHtcbiAgICAgICAgdGhpcy5faW52YWxpZGF0b3IgPSBpbnZhbGlkYXRvcjtcbiAgICB9XG4gICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGF5bG9hZDtcbiAgICB9XG4gICAgc2V0KHBheWxvYWQpIHtcbiAgICAgICAgdGhpcy5fcGF5bG9hZCA9IHBheWxvYWQ7XG4gICAgICAgIGlmICh0aGlzLl9pbnZhbGlkYXRvcikge1xuICAgICAgICAgICAgdGhpcy5faW52YWxpZGF0b3IoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IEluamVjdG9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5qZWN0b3IubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9JbmplY3Rvci5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9JbmplY3Rvci5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IHsgRXZlbnRlZCB9IGZyb20gJy4uL2NvcmUvRXZlbnRlZCc7XG5pbXBvcnQgTWFwIGZyb20gJy4uL3NoaW0vTWFwJztcbi8qKlxuICogRW51bSB0byBpZGVudGlmeSB0aGUgdHlwZSBvZiBldmVudC5cbiAqIExpc3RlbmluZyB0byAnUHJvamVjdG9yJyB3aWxsIG5vdGlmeSB3aGVuIHByb2plY3RvciBpcyBjcmVhdGVkIG9yIHVwZGF0ZWRcbiAqIExpc3RlbmluZyB0byAnV2lkZ2V0JyB3aWxsIG5vdGlmeSB3aGVuIHdpZGdldCByb290IGlzIGNyZWF0ZWQgb3IgdXBkYXRlZFxuICovXG5leHBvcnQgdmFyIE5vZGVFdmVudFR5cGU7XG4oZnVuY3Rpb24gKE5vZGVFdmVudFR5cGUpIHtcbiAgICBOb2RlRXZlbnRUeXBlW1wiUHJvamVjdG9yXCJdID0gXCJQcm9qZWN0b3JcIjtcbiAgICBOb2RlRXZlbnRUeXBlW1wiV2lkZ2V0XCJdID0gXCJXaWRnZXRcIjtcbn0pKE5vZGVFdmVudFR5cGUgfHwgKE5vZGVFdmVudFR5cGUgPSB7fSkpO1xuZXhwb3J0IGNsYXNzIE5vZGVIYW5kbGVyIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX25vZGVNYXAgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIGdldChrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vZGVNYXAuZ2V0KGtleSk7XG4gICAgfVxuICAgIGhhcyhrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vZGVNYXAuaGFzKGtleSk7XG4gICAgfVxuICAgIGFkZChlbGVtZW50LCBrZXkpIHtcbiAgICAgICAgdGhpcy5fbm9kZU1hcC5zZXQoa2V5LCBlbGVtZW50KTtcbiAgICAgICAgdGhpcy5lbWl0KHsgdHlwZToga2V5IH0pO1xuICAgIH1cbiAgICBhZGRSb290KCkge1xuICAgICAgICB0aGlzLmVtaXQoeyB0eXBlOiBOb2RlRXZlbnRUeXBlLldpZGdldCB9KTtcbiAgICB9XG4gICAgYWRkUHJvamVjdG9yKCkge1xuICAgICAgICB0aGlzLmVtaXQoeyB0eXBlOiBOb2RlRXZlbnRUeXBlLlByb2plY3RvciB9KTtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX25vZGVNYXAuY2xlYXIoKTtcbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBOb2RlSGFuZGxlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vZGVIYW5kbGVyLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvTm9kZUhhbmRsZXIubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvTm9kZUhhbmRsZXIubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCBQcm9taXNlIGZyb20gJy4uL3NoaW0vUHJvbWlzZSc7XG5pbXBvcnQgTWFwIGZyb20gJy4uL3NoaW0vTWFwJztcbmltcG9ydCBTeW1ib2wgZnJvbSAnLi4vc2hpbS9TeW1ib2wnO1xuaW1wb3J0IHsgRXZlbnRlZCB9IGZyb20gJy4uL2NvcmUvRXZlbnRlZCc7XG4vKipcbiAqIFdpZGdldCBiYXNlIHN5bWJvbCB0eXBlXG4gKi9cbmV4cG9ydCBjb25zdCBXSURHRVRfQkFTRV9UWVBFID0gU3ltYm9sKCdXaWRnZXQgQmFzZScpO1xuLyoqXG4gKiBDaGVja3MgaXMgdGhlIGl0ZW0gaXMgYSBzdWJjbGFzcyBvZiBXaWRnZXRCYXNlIChvciBhIFdpZGdldEJhc2UpXG4gKlxuICogQHBhcmFtIGl0ZW0gdGhlIGl0ZW0gdG8gY2hlY2tcbiAqIEByZXR1cm5zIHRydWUvZmFsc2UgaW5kaWNhdGluZyBpZiB0aGUgaXRlbSBpcyBhIFdpZGdldEJhc2VDb25zdHJ1Y3RvclxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IoaXRlbSkge1xuICAgIHJldHVybiBCb29sZWFuKGl0ZW0gJiYgaXRlbS5fdHlwZSA9PT0gV0lER0VUX0JBU0VfVFlQRSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNXaWRnZXRDb25zdHJ1Y3RvckRlZmF1bHRFeHBvcnQoaXRlbSkge1xuICAgIHJldHVybiBCb29sZWFuKGl0ZW0gJiZcbiAgICAgICAgaXRlbS5oYXNPd25Qcm9wZXJ0eSgnX19lc01vZHVsZScpICYmXG4gICAgICAgIGl0ZW0uaGFzT3duUHJvcGVydHkoJ2RlZmF1bHQnKSAmJlxuICAgICAgICBpc1dpZGdldEJhc2VDb25zdHJ1Y3RvcihpdGVtLmRlZmF1bHQpKTtcbn1cbi8qKlxuICogVGhlIFJlZ2lzdHJ5IGltcGxlbWVudGF0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWdpc3RyeSBleHRlbmRzIEV2ZW50ZWQge1xuICAgIC8qKlxuICAgICAqIEVtaXQgbG9hZGVkIGV2ZW50IGZvciByZWdpc3RyeSBsYWJlbFxuICAgICAqL1xuICAgIGVtaXRMb2FkZWRFdmVudCh3aWRnZXRMYWJlbCwgaXRlbSkge1xuICAgICAgICB0aGlzLmVtaXQoe1xuICAgICAgICAgICAgdHlwZTogd2lkZ2V0TGFiZWwsXG4gICAgICAgICAgICBhY3Rpb246ICdsb2FkZWQnLFxuICAgICAgICAgICAgaXRlbVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZGVmaW5lKGxhYmVsLCBpdGVtKSB7XG4gICAgICAgIGlmICh0aGlzLl93aWRnZXRSZWdpc3RyeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl93aWRnZXRSZWdpc3RyeSA9IG5ldyBNYXAoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fd2lkZ2V0UmVnaXN0cnkuaGFzKGxhYmVsKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB3aWRnZXQgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIGZvciAnJHtsYWJlbC50b1N0cmluZygpfSdgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93aWRnZXRSZWdpc3RyeS5zZXQobGFiZWwsIGl0ZW0pO1xuICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIGl0ZW0udGhlbigod2lkZ2V0Q3RvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dpZGdldFJlZ2lzdHJ5LnNldChsYWJlbCwgd2lkZ2V0Q3Rvcik7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0TG9hZGVkRXZlbnQobGFiZWwsIHdpZGdldEN0b3IpO1xuICAgICAgICAgICAgICAgIHJldHVybiB3aWRnZXRDdG9yO1xuICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1dpZGdldEJhc2VDb25zdHJ1Y3RvcihpdGVtKSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0TG9hZGVkRXZlbnQobGFiZWwsIGl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlZmluZUluamVjdG9yKGxhYmVsLCBpbmplY3RvckZhY3RvcnkpIHtcbiAgICAgICAgaWYgKHRoaXMuX2luamVjdG9yUmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5faW5qZWN0b3JSZWdpc3RyeSA9IG5ldyBNYXAoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faW5qZWN0b3JSZWdpc3RyeS5oYXMobGFiZWwpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGluamVjdG9yIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBmb3IgJyR7bGFiZWwudG9TdHJpbmcoKX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW52YWxpZGF0b3IgPSBuZXcgRXZlbnRlZCgpO1xuICAgICAgICBjb25zdCBpbmplY3Rvckl0ZW0gPSB7XG4gICAgICAgICAgICBpbmplY3RvcjogaW5qZWN0b3JGYWN0b3J5KCgpID0+IGludmFsaWRhdG9yLmVtaXQoeyB0eXBlOiAnaW52YWxpZGF0ZScgfSkpLFxuICAgICAgICAgICAgaW52YWxpZGF0b3JcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5faW5qZWN0b3JSZWdpc3RyeS5zZXQobGFiZWwsIGluamVjdG9ySXRlbSk7XG4gICAgICAgIHRoaXMuZW1pdExvYWRlZEV2ZW50KGxhYmVsLCBpbmplY3Rvckl0ZW0pO1xuICAgIH1cbiAgICBnZXQobGFiZWwpIHtcbiAgICAgICAgaWYgKCF0aGlzLl93aWRnZXRSZWdpc3RyeSB8fCAhdGhpcy5oYXMobGFiZWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fd2lkZ2V0UmVnaXN0cnkuZ2V0KGxhYmVsKTtcbiAgICAgICAgaWYgKGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yKGl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBpdGVtKCk7XG4gICAgICAgIHRoaXMuX3dpZGdldFJlZ2lzdHJ5LnNldChsYWJlbCwgcHJvbWlzZSk7XG4gICAgICAgIHByb21pc2UudGhlbigod2lkZ2V0Q3RvcikgPT4ge1xuICAgICAgICAgICAgaWYgKGlzV2lkZ2V0Q29uc3RydWN0b3JEZWZhdWx0RXhwb3J0KHdpZGdldEN0b3IpKSB7XG4gICAgICAgICAgICAgICAgd2lkZ2V0Q3RvciA9IHdpZGdldEN0b3IuZGVmYXVsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3dpZGdldFJlZ2lzdHJ5LnNldChsYWJlbCwgd2lkZ2V0Q3Rvcik7XG4gICAgICAgICAgICB0aGlzLmVtaXRMb2FkZWRFdmVudChsYWJlbCwgd2lkZ2V0Q3Rvcik7XG4gICAgICAgICAgICByZXR1cm4gd2lkZ2V0Q3RvcjtcbiAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBnZXRJbmplY3RvcihsYWJlbCkge1xuICAgICAgICBpZiAoIXRoaXMuX2luamVjdG9yUmVnaXN0cnkgfHwgIXRoaXMuaGFzSW5qZWN0b3IobGFiZWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faW5qZWN0b3JSZWdpc3RyeS5nZXQobGFiZWwpO1xuICAgIH1cbiAgICBoYXMobGFiZWwpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5fd2lkZ2V0UmVnaXN0cnkgJiYgdGhpcy5fd2lkZ2V0UmVnaXN0cnkuaGFzKGxhYmVsKSk7XG4gICAgfVxuICAgIGhhc0luamVjdG9yKGxhYmVsKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuX2luamVjdG9yUmVnaXN0cnkgJiYgdGhpcy5faW5qZWN0b3JSZWdpc3RyeS5oYXMobGFiZWwpKTtcbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBSZWdpc3RyeTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlZ2lzdHJ5Lm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvUmVnaXN0cnkubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvUmVnaXN0cnkubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCB7IE1hcCB9IGZyb20gJy4uL3NoaW0vTWFwJztcbmltcG9ydCB7IEV2ZW50ZWQgfSBmcm9tICcuLi9jb3JlL0V2ZW50ZWQnO1xuaW1wb3J0IHsgUmVnaXN0cnkgfSBmcm9tICcuL1JlZ2lzdHJ5JztcbmV4cG9ydCBjbGFzcyBSZWdpc3RyeUhhbmRsZXIgZXh0ZW5kcyBFdmVudGVkIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnkoKTtcbiAgICAgICAgdGhpcy5fcmVnaXN0cnlXaWRnZXRMYWJlbE1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5fcmVnaXN0cnlJbmplY3RvckxhYmVsTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeSk7XG4gICAgICAgIGNvbnN0IGRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5iYXNlUmVnaXN0cnkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RyeVdpZGdldExhYmVsTWFwLmRlbGV0ZSh0aGlzLmJhc2VSZWdpc3RyeSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnlJbmplY3RvckxhYmVsTWFwLmRlbGV0ZSh0aGlzLmJhc2VSZWdpc3RyeSk7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlUmVnaXN0cnkgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub3duKHsgZGVzdHJveSB9KTtcbiAgICB9XG4gICAgc2V0IGJhc2UoYmFzZVJlZ2lzdHJ5KSB7XG4gICAgICAgIGlmICh0aGlzLmJhc2VSZWdpc3RyeSkge1xuICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnlXaWRnZXRMYWJlbE1hcC5kZWxldGUodGhpcy5iYXNlUmVnaXN0cnkpO1xuICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnlJbmplY3RvckxhYmVsTWFwLmRlbGV0ZSh0aGlzLmJhc2VSZWdpc3RyeSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iYXNlUmVnaXN0cnkgPSBiYXNlUmVnaXN0cnk7XG4gICAgfVxuICAgIGRlZmluZShsYWJlbCwgd2lkZ2V0KSB7XG4gICAgICAgIHRoaXMuX3JlZ2lzdHJ5LmRlZmluZShsYWJlbCwgd2lkZ2V0KTtcbiAgICB9XG4gICAgZGVmaW5lSW5qZWN0b3IobGFiZWwsIGluamVjdG9yKSB7XG4gICAgICAgIHRoaXMuX3JlZ2lzdHJ5LmRlZmluZUluamVjdG9yKGxhYmVsLCBpbmplY3Rvcik7XG4gICAgfVxuICAgIGhhcyhsYWJlbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVnaXN0cnkuaGFzKGxhYmVsKSB8fCBCb29sZWFuKHRoaXMuYmFzZVJlZ2lzdHJ5ICYmIHRoaXMuYmFzZVJlZ2lzdHJ5LmhhcyhsYWJlbCkpO1xuICAgIH1cbiAgICBoYXNJbmplY3RvcihsYWJlbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVnaXN0cnkuaGFzSW5qZWN0b3IobGFiZWwpIHx8IEJvb2xlYW4odGhpcy5iYXNlUmVnaXN0cnkgJiYgdGhpcy5iYXNlUmVnaXN0cnkuaGFzSW5qZWN0b3IobGFiZWwpKTtcbiAgICB9XG4gICAgZ2V0KGxhYmVsLCBnbG9iYWxQcmVjZWRlbmNlID0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldChsYWJlbCwgZ2xvYmFsUHJlY2VkZW5jZSwgJ2dldCcsIHRoaXMuX3JlZ2lzdHJ5V2lkZ2V0TGFiZWxNYXApO1xuICAgIH1cbiAgICBnZXRJbmplY3RvcihsYWJlbCwgZ2xvYmFsUHJlY2VkZW5jZSA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXQobGFiZWwsIGdsb2JhbFByZWNlZGVuY2UsICdnZXRJbmplY3RvcicsIHRoaXMuX3JlZ2lzdHJ5SW5qZWN0b3JMYWJlbE1hcCk7XG4gICAgfVxuICAgIF9nZXQobGFiZWwsIGdsb2JhbFByZWNlZGVuY2UsIGdldEZ1bmN0aW9uTmFtZSwgbGFiZWxNYXApIHtcbiAgICAgICAgY29uc3QgcmVnaXN0cmllcyA9IGdsb2JhbFByZWNlZGVuY2UgPyBbdGhpcy5iYXNlUmVnaXN0cnksIHRoaXMuX3JlZ2lzdHJ5XSA6IFt0aGlzLl9yZWdpc3RyeSwgdGhpcy5iYXNlUmVnaXN0cnldO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlZ2lzdHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gcmVnaXN0cmllc1tpXTtcbiAgICAgICAgICAgIGlmICghcmVnaXN0cnkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSByZWdpc3RyeVtnZXRGdW5jdGlvbk5hbWVdKGxhYmVsKTtcbiAgICAgICAgICAgIGNvbnN0IHJlZ2lzdGVyZWRMYWJlbHMgPSBsYWJlbE1hcC5nZXQocmVnaXN0cnkpIHx8IFtdO1xuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlZ2lzdGVyZWRMYWJlbHMuaW5kZXhPZihsYWJlbCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gcmVnaXN0cnkub24obGFiZWwsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuYWN0aW9uID09PSAnbG9hZGVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tnZXRGdW5jdGlvbk5hbWVdKGxhYmVsLCBnbG9iYWxQcmVjZWRlbmNlKSA9PT0gZXZlbnQuaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KHsgdHlwZTogJ2ludmFsaWRhdGUnIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5vd24oaGFuZGxlKTtcbiAgICAgICAgICAgICAgICBsYWJlbE1hcC5zZXQocmVnaXN0cnksIFsuLi5yZWdpc3RlcmVkTGFiZWxzLCBsYWJlbF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IFJlZ2lzdHJ5SGFuZGxlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlZ2lzdHJ5SGFuZGxlci5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL1JlZ2lzdHJ5SGFuZGxlci5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9SZWdpc3RyeUhhbmRsZXIubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCBNYXAgZnJvbSAnLi4vc2hpbS9NYXAnO1xuaW1wb3J0IFdlYWtNYXAgZnJvbSAnLi4vc2hpbS9XZWFrTWFwJztcbmltcG9ydCBTeW1ib2wgZnJvbSAnLi4vc2hpbS9TeW1ib2wnO1xuaW1wb3J0IHsgdiB9IGZyb20gJy4vZCc7XG5pbXBvcnQgeyBhdXRvIH0gZnJvbSAnLi9kaWZmJztcbmltcG9ydCBSZWdpc3RyeUhhbmRsZXIgZnJvbSAnLi9SZWdpc3RyeUhhbmRsZXInO1xuaW1wb3J0IE5vZGVIYW5kbGVyIGZyb20gJy4vTm9kZUhhbmRsZXInO1xuaW1wb3J0IHsgd2lkZ2V0SW5zdGFuY2VNYXAgfSBmcm9tICcuL3Zkb20nO1xuaW1wb3J0IHsgaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IsIFdJREdFVF9CQVNFX1RZUEUgfSBmcm9tICcuL1JlZ2lzdHJ5JztcbmNvbnN0IGRlY29yYXRvck1hcCA9IG5ldyBNYXAoKTtcbmNvbnN0IGJvdW5kQXV0byA9IGF1dG8uYmluZChudWxsKTtcbmV4cG9ydCBjb25zdCBub0JpbmQgPSBTeW1ib2wuZm9yKCdkb2pvTm9CaW5kJyk7XG4vKipcbiAqIE1haW4gd2lkZ2V0IGJhc2UgZm9yIGFsbCB3aWRnZXRzIHRvIGV4dGVuZFxuICovXG5leHBvcnQgY2xhc3MgV2lkZ2V0QmFzZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgaXQgaXMgdGhlIGluaXRpYWwgc2V0IHByb3BlcnRpZXMgY3ljbGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2luaXRpYWxQcm9wZXJ0aWVzID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFycmF5IG9mIHByb3BlcnR5IGtleXMgY29uc2lkZXJlZCBjaGFuZ2VkIGZyb20gdGhlIHByZXZpb3VzIHNldCBwcm9wZXJ0aWVzXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9jaGFuZ2VkUHJvcGVydHlLZXlzID0gW107XG4gICAgICAgIHRoaXMuX25vZGVIYW5kbGVyID0gbmV3IE5vZGVIYW5kbGVyKCk7XG4gICAgICAgIHRoaXMuX2hhbmRsZXMgPSBbXTtcbiAgICAgICAgdGhpcy5fY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgdGhpcy5fZGVjb3JhdG9yQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgdGhpcy5fYm91bmRSZW5kZXJGdW5jID0gdGhpcy5yZW5kZXIuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5fYm91bmRJbnZhbGlkYXRlID0gdGhpcy5pbnZhbGlkYXRlLmJpbmQodGhpcyk7XG4gICAgICAgIHdpZGdldEluc3RhbmNlTWFwLnNldCh0aGlzLCB7XG4gICAgICAgICAgICBkaXJ0eTogdHJ1ZSxcbiAgICAgICAgICAgIG9uQXR0YWNoOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkF0dGFjaCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uRGV0YWNoOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkRldGFjaCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5vZGVIYW5kbGVyOiB0aGlzLl9ub2RlSGFuZGxlcixcbiAgICAgICAgICAgIHJlZ2lzdHJ5OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0cnk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29yZVByb3BlcnRpZXM6IHt9LFxuICAgICAgICAgICAgcmVuZGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGlucHV0UHJvcGVydGllczoge31cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3J1bkFmdGVyQ29uc3RydWN0b3JzKCk7XG4gICAgfVxuICAgIG1ldGEoTWV0YVR5cGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX21ldGFNYXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fbWV0YU1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2FjaGVkID0gdGhpcy5fbWV0YU1hcC5nZXQoTWV0YVR5cGUpO1xuICAgICAgICBpZiAoIWNhY2hlZCkge1xuICAgICAgICAgICAgY2FjaGVkID0gbmV3IE1ldGFUeXBlKHtcbiAgICAgICAgICAgICAgICBpbnZhbGlkYXRlOiB0aGlzLl9ib3VuZEludmFsaWRhdGUsXG4gICAgICAgICAgICAgICAgbm9kZUhhbmRsZXI6IHRoaXMuX25vZGVIYW5kbGVyLFxuICAgICAgICAgICAgICAgIGJpbmQ6IHRoaXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5vd24oY2FjaGVkKTtcbiAgICAgICAgICAgIHRoaXMuX21ldGFNYXAuc2V0KE1ldGFUeXBlLCBjYWNoZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIG9uQXR0YWNoKCkge1xuICAgICAgICAvLyBEbyBub3RoaW5nIGJ5IGRlZmF1bHQuXG4gICAgfVxuICAgIG9uRGV0YWNoKCkge1xuICAgICAgICAvLyBEbyBub3RoaW5nIGJ5IGRlZmF1bHQuXG4gICAgfVxuICAgIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvcGVydGllcztcbiAgICB9XG4gICAgZ2V0IGNoYW5nZWRQcm9wZXJ0eUtleXMoKSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy5fY2hhbmdlZFByb3BlcnR5S2V5c107XG4gICAgfVxuICAgIF9fc2V0Q29yZVByb3BlcnRpZXNfXyhjb3JlUHJvcGVydGllcykge1xuICAgICAgICBjb25zdCB7IGJhc2VSZWdpc3RyeSB9ID0gY29yZVByb3BlcnRpZXM7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldCh0aGlzKTtcbiAgICAgICAgaWYgKGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcy5iYXNlUmVnaXN0cnkgIT09IGJhc2VSZWdpc3RyeSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JlZ2lzdHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RyeSA9IG5ldyBSZWdpc3RyeUhhbmRsZXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeSk7XG4gICAgICAgICAgICAgICAgdGhpcy5vd24odGhpcy5fcmVnaXN0cnkub24oJ2ludmFsaWRhdGUnLCB0aGlzLl9ib3VuZEludmFsaWRhdGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5LmJhc2UgPSBiYXNlUmVnaXN0cnk7XG4gICAgICAgICAgICB0aGlzLmludmFsaWRhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZURhdGEuY29yZVByb3BlcnRpZXMgPSBjb3JlUHJvcGVydGllcztcbiAgICB9XG4gICAgX19zZXRQcm9wZXJ0aWVzX18ob3JpZ2luYWxQcm9wZXJ0aWVzKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldCh0aGlzKTtcbiAgICAgICAgaW5zdGFuY2VEYXRhLmlucHV0UHJvcGVydGllcyA9IG9yaWdpbmFsUHJvcGVydGllcztcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMuX3J1bkJlZm9yZVByb3BlcnRpZXMob3JpZ2luYWxQcm9wZXJ0aWVzKTtcbiAgICAgICAgY29uc3QgcmVnaXN0ZXJlZERpZmZQcm9wZXJ0eU5hbWVzID0gdGhpcy5nZXREZWNvcmF0b3IoJ3JlZ2lzdGVyZWREaWZmUHJvcGVydHknKTtcbiAgICAgICAgY29uc3QgY2hhbmdlZFByb3BlcnR5S2V5cyA9IFtdO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWVzID0gT2JqZWN0LmtleXMocHJvcGVydGllcyk7XG4gICAgICAgIGlmICh0aGlzLl9pbml0aWFsUHJvcGVydGllcyA9PT0gZmFsc2UgfHwgcmVnaXN0ZXJlZERpZmZQcm9wZXJ0eU5hbWVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgY29uc3QgYWxsUHJvcGVydGllcyA9IFsuLi5wcm9wZXJ0eU5hbWVzLCAuLi5PYmplY3Qua2V5cyh0aGlzLl9wcm9wZXJ0aWVzKV07XG4gICAgICAgICAgICBjb25zdCBjaGVja2VkUHJvcGVydGllcyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgZGlmZlByb3BlcnR5UmVzdWx0cyA9IHt9O1xuICAgICAgICAgICAgbGV0IHJ1blJlYWN0aW9ucyA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gYWxsUHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZFByb3BlcnRpZXMuaW5kZXhPZihwcm9wZXJ0eU5hbWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hlY2tlZFByb3BlcnRpZXMucHVzaChwcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzUHJvcGVydHkgPSB0aGlzLl9wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3UHJvcGVydHkgPSB0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eShwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0sIGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcy5iaW5kKTtcbiAgICAgICAgICAgICAgICBpZiAocmVnaXN0ZXJlZERpZmZQcm9wZXJ0eU5hbWVzLmluZGV4T2YocHJvcGVydHlOYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVuUmVhY3Rpb25zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlmZkZ1bmN0aW9ucyA9IHRoaXMuZ2V0RGVjb3JhdG9yKGBkaWZmUHJvcGVydHk6JHtwcm9wZXJ0eU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZkZ1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGlmZkZ1bmN0aW9uc1tpXShwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmNoYW5nZWQgJiYgY2hhbmdlZFByb3BlcnR5S2V5cy5pbmRleE9mKHByb3BlcnR5TmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFByb3BlcnR5S2V5cy5wdXNoKHByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lIGluIHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmUHJvcGVydHlSZXN1bHRzW3Byb3BlcnR5TmFtZV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGJvdW5kQXV0byhwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuY2hhbmdlZCAmJiBjaGFuZ2VkUHJvcGVydHlLZXlzLmluZGV4T2YocHJvcGVydHlOYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRQcm9wZXJ0eUtleXMucHVzaChwcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlmZlByb3BlcnR5UmVzdWx0c1twcm9wZXJ0eU5hbWVdID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1blJlYWN0aW9ucykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWN0aW9uRnVuY3Rpb25zID0gdGhpcy5nZXREZWNvcmF0b3IoJ2RpZmZSZWFjdGlvbicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVkUmVhY3Rpb25zID0gW107XG4gICAgICAgICAgICAgICAgcmVhY3Rpb25GdW5jdGlvbnMuZm9yRWFjaCgoeyByZWFjdGlvbiwgcHJvcGVydHlOYW1lIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHlDaGFuZ2VkID0gY2hhbmdlZFByb3BlcnR5S2V5cy5pbmRleE9mKHByb3BlcnR5TmFtZSkgIT09IC0xO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFjdGlvblJ1biA9IGV4ZWN1dGVkUmVhY3Rpb25zLmluZGV4T2YocmVhY3Rpb24pICE9PSAtMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Q2hhbmdlZCAmJiAhcmVhY3Rpb25SdW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWN0aW9uLmNhbGwodGhpcywgdGhpcy5fcHJvcGVydGllcywgZGlmZlByb3BlcnR5UmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZFJlYWN0aW9ucy5wdXNoKHJlYWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IGRpZmZQcm9wZXJ0eVJlc3VsdHM7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VkUHJvcGVydHlLZXlzID0gY2hhbmdlZFByb3BlcnR5S2V5cztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxQcm9wZXJ0aWVzID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWVzW2ldO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5KHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSwgaW5zdGFuY2VEYXRhLmNvcmVQcm9wZXJ0aWVzLmJpbmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFByb3BlcnR5S2V5cy5wdXNoKHByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fY2hhbmdlZFByb3BlcnR5S2V5cyA9IGNoYW5nZWRQcm9wZXJ0eUtleXM7XG4gICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2NoYW5nZWRQcm9wZXJ0eUtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGNoaWxkcmVuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW47XG4gICAgfVxuICAgIF9fc2V0Q2hpbGRyZW5fXyhjaGlsZHJlbikge1xuICAgICAgICBpZiAodGhpcy5fY2hpbGRyZW4ubGVuZ3RoID4gMCB8fCBjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX19yZW5kZXJfXygpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHRoaXMpO1xuICAgICAgICBpbnN0YW5jZURhdGEuZGlydHkgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVuZGVyID0gdGhpcy5fcnVuQmVmb3JlUmVuZGVycygpO1xuICAgICAgICBsZXQgZE5vZGUgPSByZW5kZXIoKTtcbiAgICAgICAgZE5vZGUgPSB0aGlzLnJ1bkFmdGVyUmVuZGVycyhkTm9kZSk7XG4gICAgICAgIHRoaXMuX25vZGVIYW5kbGVyLmNsZWFyKCk7XG4gICAgICAgIHJldHVybiBkTm9kZTtcbiAgICB9XG4gICAgaW52YWxpZGF0ZSgpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHRoaXMpO1xuICAgICAgICBpZiAoaW5zdGFuY2VEYXRhLmludmFsaWRhdGUpIHtcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5pbnZhbGlkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gdignZGl2Jywge30sIHRoaXMuY2hpbGRyZW4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB0byBhZGQgZGVjb3JhdG9ycyB0byBXaWRnZXRCYXNlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVjb3JhdG9yS2V5IFRoZSBrZXkgb2YgdGhlIGRlY29yYXRvclxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGRlY29yYXRvclxuICAgICAqL1xuICAgIGFkZERlY29yYXRvcihkZWNvcmF0b3JLZXksIHZhbHVlKSB7XG4gICAgICAgIHZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KCdjb25zdHJ1Y3RvcicpKSB7XG4gICAgICAgICAgICBsZXQgZGVjb3JhdG9yTGlzdCA9IGRlY29yYXRvck1hcC5nZXQodGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgICAgICAgICBpZiAoIWRlY29yYXRvckxpc3QpIHtcbiAgICAgICAgICAgICAgICBkZWNvcmF0b3JMaXN0ID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgICAgIGRlY29yYXRvck1hcC5zZXQodGhpcy5jb25zdHJ1Y3RvciwgZGVjb3JhdG9yTGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc3BlY2lmaWNEZWNvcmF0b3JMaXN0ID0gZGVjb3JhdG9yTGlzdC5nZXQoZGVjb3JhdG9yS2V5KTtcbiAgICAgICAgICAgIGlmICghc3BlY2lmaWNEZWNvcmF0b3JMaXN0KSB7XG4gICAgICAgICAgICAgICAgc3BlY2lmaWNEZWNvcmF0b3JMaXN0ID0gW107XG4gICAgICAgICAgICAgICAgZGVjb3JhdG9yTGlzdC5zZXQoZGVjb3JhdG9yS2V5LCBzcGVjaWZpY0RlY29yYXRvckxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3BlY2lmaWNEZWNvcmF0b3JMaXN0LnB1c2goLi4udmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IHRoaXMuZ2V0RGVjb3JhdG9yKGRlY29yYXRvcktleSk7XG4gICAgICAgICAgICB0aGlzLl9kZWNvcmF0b3JDYWNoZS5zZXQoZGVjb3JhdG9yS2V5LCBbLi4uZGVjb3JhdG9ycywgLi4udmFsdWVdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB0byBidWlsZCB0aGUgbGlzdCBvZiBkZWNvcmF0b3JzIGZyb20gdGhlIGdsb2JhbCBkZWNvcmF0b3IgbWFwLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRlY29yYXRvcktleSAgVGhlIGtleSBvZiB0aGUgZGVjb3JhdG9yXG4gICAgICogQHJldHVybiBBbiBhcnJheSBvZiBkZWNvcmF0b3IgdmFsdWVzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfYnVpbGREZWNvcmF0b3JMaXN0KGRlY29yYXRvcktleSkge1xuICAgICAgICBjb25zdCBhbGxEZWNvcmF0b3JzID0gW107XG4gICAgICAgIGxldCBjb25zdHJ1Y3RvciA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgICAgIHdoaWxlIChjb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VNYXAgPSBkZWNvcmF0b3JNYXAuZ2V0KGNvbnN0cnVjdG9yKTtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZU1hcCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBpbnN0YW5jZU1hcC5nZXQoZGVjb3JhdG9yS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9ycykge1xuICAgICAgICAgICAgICAgICAgICBhbGxEZWNvcmF0b3JzLnVuc2hpZnQoLi4uZGVjb3JhdG9ycyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3RydWN0b3IgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY29uc3RydWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhbGxEZWNvcmF0b3JzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB0byByZXRyaWV2ZSBkZWNvcmF0b3IgdmFsdWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVjb3JhdG9yS2V5IFRoZSBrZXkgb2YgdGhlIGRlY29yYXRvclxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGRlY29yYXRvciB2YWx1ZXNcbiAgICAgKi9cbiAgICBnZXREZWNvcmF0b3IoZGVjb3JhdG9yS2V5KSB7XG4gICAgICAgIGxldCBhbGxEZWNvcmF0b3JzID0gdGhpcy5fZGVjb3JhdG9yQ2FjaGUuZ2V0KGRlY29yYXRvcktleSk7XG4gICAgICAgIGlmIChhbGxEZWNvcmF0b3JzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhbGxEZWNvcmF0b3JzO1xuICAgICAgICB9XG4gICAgICAgIGFsbERlY29yYXRvcnMgPSB0aGlzLl9idWlsZERlY29yYXRvckxpc3QoZGVjb3JhdG9yS2V5KTtcbiAgICAgICAgdGhpcy5fZGVjb3JhdG9yQ2FjaGUuc2V0KGRlY29yYXRvcktleSwgYWxsRGVjb3JhdG9ycyk7XG4gICAgICAgIHJldHVybiBhbGxEZWNvcmF0b3JzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCaW5kcyB1bmJvdW5kIHByb3BlcnR5IGZ1bmN0aW9ucyB0byB0aGUgc3BlY2lmaWVkIGBiaW5kYCBwcm9wZXJ0eVxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgcHJvcGVydGllcyB0byBjaGVjayBmb3IgZnVuY3Rpb25zXG4gICAgICovXG4gICAgX2JpbmRGdW5jdGlvblByb3BlcnR5KHByb3BlcnR5LCBiaW5kKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkgPT09ICdmdW5jdGlvbicgJiYgIXByb3BlcnR5W25vQmluZF0gJiYgaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IocHJvcGVydHkpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5TWFwID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eU1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBiaW5kSW5mbyA9IHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5TWFwLmdldChwcm9wZXJ0eSkgfHwge307XG4gICAgICAgICAgICBsZXQgeyBib3VuZEZ1bmMsIHNjb3BlIH0gPSBiaW5kSW5mbztcbiAgICAgICAgICAgIGlmIChib3VuZEZ1bmMgPT09IHVuZGVmaW5lZCB8fCBzY29wZSAhPT0gYmluZCkge1xuICAgICAgICAgICAgICAgIGJvdW5kRnVuYyA9IHByb3BlcnR5LmJpbmQoYmluZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fYmluZEZ1bmN0aW9uUHJvcGVydHlNYXAuc2V0KHByb3BlcnR5LCB7IGJvdW5kRnVuYywgc2NvcGU6IGJpbmQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYm91bmRGdW5jO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eTtcbiAgICB9XG4gICAgZ2V0IHJlZ2lzdHJ5KCkge1xuICAgICAgICBpZiAodGhpcy5fcmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnlIYW5kbGVyKCk7XG4gICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeSk7XG4gICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeS5vbignaW52YWxpZGF0ZScsIHRoaXMuX2JvdW5kSW52YWxpZGF0ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWdpc3RyeTtcbiAgICB9XG4gICAgX3J1bkJlZm9yZVByb3BlcnRpZXMocHJvcGVydGllcykge1xuICAgICAgICBjb25zdCBiZWZvcmVQcm9wZXJ0aWVzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2JlZm9yZVByb3BlcnRpZXMnKTtcbiAgICAgICAgaWYgKGJlZm9yZVByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJlZm9yZVByb3BlcnRpZXMucmVkdWNlKChwcm9wZXJ0aWVzLCBiZWZvcmVQcm9wZXJ0aWVzRnVuY3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcHJvcGVydGllcywgYmVmb3JlUHJvcGVydGllc0Z1bmN0aW9uLmNhbGwodGhpcywgcHJvcGVydGllcykpO1xuICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcGVydGllcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSdW4gYWxsIHJlZ2lzdGVyZWQgYmVmb3JlIHJlbmRlcnMgYW5kIHJldHVybiB0aGUgdXBkYXRlZCByZW5kZXIgbWV0aG9kXG4gICAgICovXG4gICAgX3J1bkJlZm9yZVJlbmRlcnMoKSB7XG4gICAgICAgIGNvbnN0IGJlZm9yZVJlbmRlcnMgPSB0aGlzLmdldERlY29yYXRvcignYmVmb3JlUmVuZGVyJyk7XG4gICAgICAgIGlmIChiZWZvcmVSZW5kZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBiZWZvcmVSZW5kZXJzLnJlZHVjZSgocmVuZGVyLCBiZWZvcmVSZW5kZXJGdW5jdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRSZW5kZXIgPSBiZWZvcmVSZW5kZXJGdW5jdGlvbi5jYWxsKHRoaXMsIHJlbmRlciwgdGhpcy5fcHJvcGVydGllcywgdGhpcy5fY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIGlmICghdXBkYXRlZFJlbmRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlbmRlciBmdW5jdGlvbiBub3QgcmV0dXJuZWQgZnJvbSBiZWZvcmVSZW5kZXIsIHVzaW5nIHByZXZpb3VzIHJlbmRlcicpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlZFJlbmRlcjtcbiAgICAgICAgICAgIH0sIHRoaXMuX2JvdW5kUmVuZGVyRnVuYyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2JvdW5kUmVuZGVyRnVuYztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUnVuIGFsbCByZWdpc3RlcmVkIGFmdGVyIHJlbmRlcnMgYW5kIHJldHVybiB0aGUgZGVjb3JhdGVkIEROb2Rlc1xuICAgICAqXG4gICAgICogQHBhcmFtIGROb2RlIFRoZSBETm9kZXMgdG8gcnVuIHRocm91Z2ggdGhlIGFmdGVyIHJlbmRlcnNcbiAgICAgKi9cbiAgICBydW5BZnRlclJlbmRlcnMoZE5vZGUpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJSZW5kZXJzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2FmdGVyUmVuZGVyJyk7XG4gICAgICAgIGlmIChhZnRlclJlbmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZE5vZGUgPSBhZnRlclJlbmRlcnMucmVkdWNlKChkTm9kZSwgYWZ0ZXJSZW5kZXJGdW5jdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhZnRlclJlbmRlckZ1bmN0aW9uLmNhbGwodGhpcywgZE5vZGUpO1xuICAgICAgICAgICAgfSwgZE5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9tZXRhTWFwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX21ldGFNYXAuZm9yRWFjaCgobWV0YSkgPT4ge1xuICAgICAgICAgICAgICAgIG1ldGEuYWZ0ZXJSZW5kZXIoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkTm9kZTtcbiAgICB9XG4gICAgX3J1bkFmdGVyQ29uc3RydWN0b3JzKCkge1xuICAgICAgICBjb25zdCBhZnRlckNvbnN0cnVjdG9ycyA9IHRoaXMuZ2V0RGVjb3JhdG9yKCdhZnRlckNvbnN0cnVjdG9yJyk7XG4gICAgICAgIGlmIChhZnRlckNvbnN0cnVjdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhZnRlckNvbnN0cnVjdG9ycy5mb3JFYWNoKChhZnRlckNvbnN0cnVjdG9yKSA9PiBhZnRlckNvbnN0cnVjdG9yLmNhbGwodGhpcykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG93bihoYW5kbGUpIHtcbiAgICAgICAgdGhpcy5faGFuZGxlcy5wdXNoKGhhbmRsZSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLl9oYW5kbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMuX2hhbmRsZXMucG9wKCk7XG4gICAgICAgICAgICBpZiAoaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogc3RhdGljIGlkZW50aWZpZXJcbiAqL1xuV2lkZ2V0QmFzZS5fdHlwZSA9IFdJREdFVF9CQVNFX1RZUEU7XG5leHBvcnQgZGVmYXVsdCBXaWRnZXRCYXNlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2lkZ2V0QmFzZS5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL1dpZGdldEJhc2UubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvV2lkZ2V0QmFzZS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwibGV0IGJyb3dzZXJTcGVjaWZpY1RyYW5zaXRpb25FbmRFdmVudE5hbWUgPSAnJztcbmxldCBicm93c2VyU3BlY2lmaWNBbmltYXRpb25FbmRFdmVudE5hbWUgPSAnJztcbmZ1bmN0aW9uIGRldGVybWluZUJyb3dzZXJTdHlsZU5hbWVzKGVsZW1lbnQpIHtcbiAgICBpZiAoJ1dlYmtpdFRyYW5zaXRpb24nIGluIGVsZW1lbnQuc3R5bGUpIHtcbiAgICAgICAgYnJvd3NlclNwZWNpZmljVHJhbnNpdGlvbkVuZEV2ZW50TmFtZSA9ICd3ZWJraXRUcmFuc2l0aW9uRW5kJztcbiAgICAgICAgYnJvd3NlclNwZWNpZmljQW5pbWF0aW9uRW5kRXZlbnROYW1lID0gJ3dlYmtpdEFuaW1hdGlvbkVuZCc7XG4gICAgfVxuICAgIGVsc2UgaWYgKCd0cmFuc2l0aW9uJyBpbiBlbGVtZW50LnN0eWxlIHx8ICdNb3pUcmFuc2l0aW9uJyBpbiBlbGVtZW50LnN0eWxlKSB7XG4gICAgICAgIGJyb3dzZXJTcGVjaWZpY1RyYW5zaXRpb25FbmRFdmVudE5hbWUgPSAndHJhbnNpdGlvbmVuZCc7XG4gICAgICAgIGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSA9ICdhbmltYXRpb25lbmQnO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3VyIGJyb3dzZXIgaXMgbm90IHN1cHBvcnRlZCcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGluaXRpYWxpemUoZWxlbWVudCkge1xuICAgIGlmIChicm93c2VyU3BlY2lmaWNBbmltYXRpb25FbmRFdmVudE5hbWUgPT09ICcnKSB7XG4gICAgICAgIGRldGVybWluZUJyb3dzZXJTdHlsZU5hbWVzKGVsZW1lbnQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJ1bkFuZENsZWFuVXAoZWxlbWVudCwgc3RhcnRBbmltYXRpb24sIGZpbmlzaEFuaW1hdGlvbikge1xuICAgIGluaXRpYWxpemUoZWxlbWVudCk7XG4gICAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG4gICAgbGV0IHRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghZmluaXNoZWQpIHtcbiAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihicm93c2VyU3BlY2lmaWNUcmFuc2l0aW9uRW5kRXZlbnROYW1lLCB0cmFuc2l0aW9uRW5kKTtcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihicm93c2VyU3BlY2lmaWNBbmltYXRpb25FbmRFdmVudE5hbWUsIHRyYW5zaXRpb25FbmQpO1xuICAgICAgICAgICAgZmluaXNoQW5pbWF0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHN0YXJ0QW5pbWF0aW9uKCk7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSwgdHJhbnNpdGlvbkVuZCk7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGJyb3dzZXJTcGVjaWZpY1RyYW5zaXRpb25FbmRFdmVudE5hbWUsIHRyYW5zaXRpb25FbmQpO1xufVxuZnVuY3Rpb24gZXhpdChub2RlLCBwcm9wZXJ0aWVzLCBleGl0QW5pbWF0aW9uLCByZW1vdmVOb2RlKSB7XG4gICAgY29uc3QgYWN0aXZlQ2xhc3MgPSBwcm9wZXJ0aWVzLmV4aXRBbmltYXRpb25BY3RpdmUgfHwgYCR7ZXhpdEFuaW1hdGlvbn0tYWN0aXZlYDtcbiAgICBydW5BbmRDbGVhblVwKG5vZGUsICgpID0+IHtcbiAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKGV4aXRBbmltYXRpb24pO1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKGFjdGl2ZUNsYXNzKTtcbiAgICAgICAgfSk7XG4gICAgfSwgKCkgPT4ge1xuICAgICAgICByZW1vdmVOb2RlKCk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBlbnRlcihub2RlLCBwcm9wZXJ0aWVzLCBlbnRlckFuaW1hdGlvbikge1xuICAgIGNvbnN0IGFjdGl2ZUNsYXNzID0gcHJvcGVydGllcy5lbnRlckFuaW1hdGlvbkFjdGl2ZSB8fCBgJHtlbnRlckFuaW1hdGlvbn0tYWN0aXZlYDtcbiAgICBydW5BbmRDbGVhblVwKG5vZGUsICgpID0+IHtcbiAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKGVudGVyQW5pbWF0aW9uKTtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZChhY3RpdmVDbGFzcyk7XG4gICAgICAgIH0pO1xuICAgIH0sICgpID0+IHtcbiAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKGVudGVyQW5pbWF0aW9uKTtcbiAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKGFjdGl2ZUNsYXNzKTtcbiAgICB9KTtcbn1cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBlbnRlcixcbiAgICBleGl0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3NzVHJhbnNpdGlvbnMubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9hbmltYXRpb25zL2Nzc1RyYW5zaXRpb25zLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2FuaW1hdGlvbnMvY3NzVHJhbnNpdGlvbnMubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCBTeW1ib2wgZnJvbSAnLi4vc2hpbS9TeW1ib2wnO1xuLyoqXG4gKiBUaGUgc3ltYm9sIGlkZW50aWZpZXIgZm9yIGEgV05vZGUgdHlwZVxuICovXG5leHBvcnQgY29uc3QgV05PREUgPSBTeW1ib2woJ0lkZW50aWZpZXIgZm9yIGEgV05vZGUuJyk7XG4vKipcbiAqIFRoZSBzeW1ib2wgaWRlbnRpZmllciBmb3IgYSBWTm9kZSB0eXBlXG4gKi9cbmV4cG9ydCBjb25zdCBWTk9ERSA9IFN5bWJvbCgnSWRlbnRpZmllciBmb3IgYSBWTm9kZS4nKTtcbi8qKlxuICogVGhlIHN5bWJvbCBpZGVudGlmaWVyIGZvciBhIFZOb2RlIHR5cGUgY3JlYXRlZCB1c2luZyBkb20oKVxuICovXG5leHBvcnQgY29uc3QgRE9NVk5PREUgPSBTeW1ib2woJ0lkZW50aWZpZXIgZm9yIGEgVk5vZGUgY3JlYXRlZCB1c2luZyBleGlzdGluZyBkb20uJyk7XG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgYEROb2RlYCBpcyBhIGBXTm9kZWAgdXNpbmcgdGhlIGB0eXBlYCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNXTm9kZShjaGlsZCkge1xuICAgIHJldHVybiBCb29sZWFuKGNoaWxkICYmIHR5cGVvZiBjaGlsZCAhPT0gJ3N0cmluZycgJiYgY2hpbGQudHlwZSA9PT0gV05PREUpO1xufVxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIGBETm9kZWAgaXMgYSBgVk5vZGVgIHVzaW5nIHRoZSBgdHlwZWAgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVk5vZGUoY2hpbGQpIHtcbiAgICByZXR1cm4gQm9vbGVhbihjaGlsZCAmJiB0eXBlb2YgY2hpbGQgIT09ICdzdHJpbmcnICYmIChjaGlsZC50eXBlID09PSBWTk9ERSB8fCBjaGlsZC50eXBlID09PSBET01WTk9ERSkpO1xufVxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIGBETm9kZWAgaXMgYSBgVk5vZGVgIGNyZWF0ZWQgd2l0aCBgZG9tKClgIHVzaW5nIHRoZSBgdHlwZWAgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRG9tVk5vZGUoY2hpbGQpIHtcbiAgICByZXR1cm4gQm9vbGVhbihjaGlsZCAmJiB0eXBlb2YgY2hpbGQgIT09ICdzdHJpbmcnICYmIGNoaWxkLnR5cGUgPT09IERPTVZOT0RFKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0VsZW1lbnROb2RlKHZhbHVlKSB7XG4gICAgcmV0dXJuICEhdmFsdWUudGFnTmFtZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNvcmF0ZShkTm9kZXMsIG9wdGlvbnNPck1vZGlmaWVyLCBwcmVkaWNhdGUpIHtcbiAgICBsZXQgc2hhbGxvdyA9IGZhbHNlO1xuICAgIGxldCBtb2RpZmllcjtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnNPck1vZGlmaWVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG1vZGlmaWVyID0gb3B0aW9uc09yTW9kaWZpZXI7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBtb2RpZmllciA9IG9wdGlvbnNPck1vZGlmaWVyLm1vZGlmaWVyO1xuICAgICAgICBwcmVkaWNhdGUgPSBvcHRpb25zT3JNb2RpZmllci5wcmVkaWNhdGU7XG4gICAgICAgIHNoYWxsb3cgPSBvcHRpb25zT3JNb2RpZmllci5zaGFsbG93IHx8IGZhbHNlO1xuICAgIH1cbiAgICBsZXQgbm9kZXMgPSBBcnJheS5pc0FycmF5KGROb2RlcykgPyBbLi4uZE5vZGVzXSA6IFtkTm9kZXNdO1xuICAgIGZ1bmN0aW9uIGJyZWFrZXIoKSB7XG4gICAgICAgIG5vZGVzID0gW107XG4gICAgfVxuICAgIHdoaWxlIChub2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzLnNoaWZ0KCk7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBpZiAoIXNoYWxsb3cgJiYgKGlzV05vZGUobm9kZSkgfHwgaXNWTm9kZShub2RlKSkgJiYgbm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIG5vZGVzID0gWy4uLm5vZGVzLCAuLi5ub2RlLmNoaWxkcmVuXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcHJlZGljYXRlIHx8IHByZWRpY2F0ZShub2RlKSkge1xuICAgICAgICAgICAgICAgIG1vZGlmaWVyKG5vZGUsIGJyZWFrZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkTm9kZXM7XG59XG4vKipcbiAqIFdyYXBwZXIgZnVuY3Rpb24gZm9yIGNhbGxzIHRvIGNyZWF0ZSBhIHdpZGdldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHcod2lkZ2V0Q29uc3RydWN0b3IsIHByb3BlcnRpZXMsIGNoaWxkcmVuID0gW10pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgd2lkZ2V0Q29uc3RydWN0b3IsXG4gICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgIHR5cGU6IFdOT0RFXG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB2KHRhZywgcHJvcGVydGllc09yQ2hpbGRyZW4gPSB7fSwgY2hpbGRyZW4gPSB1bmRlZmluZWQpIHtcbiAgICBsZXQgcHJvcGVydGllcyA9IHByb3BlcnRpZXNPckNoaWxkcmVuO1xuICAgIGxldCBkZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjaztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wZXJ0aWVzT3JDaGlsZHJlbikpIHtcbiAgICAgICAgY2hpbGRyZW4gPSBwcm9wZXJ0aWVzT3JDaGlsZHJlbjtcbiAgICAgICAgcHJvcGVydGllcyA9IHt9O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHByb3BlcnRpZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2sgPSBwcm9wZXJ0aWVzO1xuICAgICAgICBwcm9wZXJ0aWVzID0ge307XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHRhZyxcbiAgICAgICAgZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2ssXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICB0eXBlOiBWTk9ERVxuICAgIH07XG59XG4vKipcbiAqIENyZWF0ZSBhIFZOb2RlIGZvciBhbiBleGlzdGluZyBET00gTm9kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvbSh7IG5vZGUsIGF0dHJzID0ge30sIHByb3BzID0ge30sIG9uID0ge30sIGRpZmZUeXBlID0gJ25vbmUnIH0sIGNoaWxkcmVuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGFnOiBpc0VsZW1lbnROb2RlKG5vZGUpID8gbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgOiAnJyxcbiAgICAgICAgcHJvcGVydGllczogcHJvcHMsXG4gICAgICAgIGF0dHJpYnV0ZXM6IGF0dHJzLFxuICAgICAgICBldmVudHM6IG9uLFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgdHlwZTogRE9NVk5PREUsXG4gICAgICAgIGRvbU5vZGU6IG5vZGUsXG4gICAgICAgIHRleHQ6IGlzRWxlbWVudE5vZGUobm9kZSkgPyB1bmRlZmluZWQgOiBub2RlLmRhdGEsXG4gICAgICAgIGRpZmZUeXBlXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWQubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2QubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCB7IGhhbmRsZURlY29yYXRvciB9IGZyb20gJy4vaGFuZGxlRGVjb3JhdG9yJztcbmV4cG9ydCBmdW5jdGlvbiBhZnRlclJlbmRlcihtZXRob2QpIHtcbiAgICByZXR1cm4gaGFuZGxlRGVjb3JhdG9yKCh0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICAgIHRhcmdldC5hZGREZWNvcmF0b3IoJ2FmdGVyUmVuZGVyJywgcHJvcGVydHlLZXkgPyB0YXJnZXRbcHJvcGVydHlLZXldIDogbWV0aG9kKTtcbiAgICB9KTtcbn1cbmV4cG9ydCBkZWZhdWx0IGFmdGVyUmVuZGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWZ0ZXJSZW5kZXIubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2FmdGVyUmVuZGVyLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYWZ0ZXJSZW5kZXIubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCB7IGhhbmRsZURlY29yYXRvciB9IGZyb20gJy4vaGFuZGxlRGVjb3JhdG9yJztcbmltcG9ydCB7IGJlZm9yZVByb3BlcnRpZXMgfSBmcm9tICcuL2JlZm9yZVByb3BlcnRpZXMnO1xuZXhwb3J0IGZ1bmN0aW9uIGFsd2F5c1JlbmRlcigpIHtcbiAgICByZXR1cm4gaGFuZGxlRGVjb3JhdG9yKCh0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICAgIGJlZm9yZVByb3BlcnRpZXMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgICAgIH0pKHRhcmdldCk7XG4gICAgfSk7XG59XG5leHBvcnQgZGVmYXVsdCBhbHdheXNSZW5kZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hbHdheXNSZW5kZXIubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2Fsd2F5c1JlbmRlci5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2Fsd2F5c1JlbmRlci5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi9oYW5kbGVEZWNvcmF0b3InO1xuZXhwb3J0IGZ1bmN0aW9uIGJlZm9yZVByb3BlcnRpZXMobWV0aG9kKSB7XG4gICAgcmV0dXJuIGhhbmRsZURlY29yYXRvcigodGFyZ2V0LCBwcm9wZXJ0eUtleSkgPT4ge1xuICAgICAgICB0YXJnZXQuYWRkRGVjb3JhdG9yKCdiZWZvcmVQcm9wZXJ0aWVzJywgcHJvcGVydHlLZXkgPyB0YXJnZXRbcHJvcGVydHlLZXldIDogbWV0aG9kKTtcbiAgICB9KTtcbn1cbmV4cG9ydCBkZWZhdWx0IGJlZm9yZVByb3BlcnRpZXM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iZWZvcmVQcm9wZXJ0aWVzLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9iZWZvcmVQcm9wZXJ0aWVzLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYmVmb3JlUHJvcGVydGllcy5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IHsgQ3VzdG9tRWxlbWVudENoaWxkVHlwZSB9IGZyb20gJy4uL3JlZ2lzdGVyQ3VzdG9tRWxlbWVudCc7XG5pbXBvcnQgUmVnaXN0cnkgZnJvbSAnLi4vUmVnaXN0cnknO1xuLyoqXG4gKiBUaGlzIERlY29yYXRvciBpcyBwcm92aWRlZCBwcm9wZXJ0aWVzIHRoYXQgZGVmaW5lIHRoZSBiZWhhdmlvciBvZiBhIGN1c3RvbSBlbGVtZW50LCBhbmRcbiAqIHJlZ2lzdGVycyB0aGF0IGN1c3RvbSBlbGVtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3VzdG9tRWxlbWVudCh7IHRhZywgcHJvcGVydGllcyA9IFtdLCBhdHRyaWJ1dGVzID0gW10sIGV2ZW50cyA9IFtdLCBjaGlsZFR5cGUgPSBDdXN0b21FbGVtZW50Q2hpbGRUeXBlLkRPSk8sIHJlZ2lzdHJ5RmFjdG9yeSA9ICgpID0+IG5ldyBSZWdpc3RyeSgpIH0pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICB0YXJnZXQucHJvdG90eXBlLl9fY3VzdG9tRWxlbWVudERlc2NyaXB0b3IgPSB7XG4gICAgICAgICAgICB0YWdOYW1lOiB0YWcsXG4gICAgICAgICAgICBhdHRyaWJ1dGVzLFxuICAgICAgICAgICAgcHJvcGVydGllcyxcbiAgICAgICAgICAgIGV2ZW50cyxcbiAgICAgICAgICAgIGNoaWxkVHlwZSxcbiAgICAgICAgICAgIHJlZ2lzdHJ5RmFjdG9yeVxuICAgICAgICB9O1xuICAgIH07XG59XG5leHBvcnQgZGVmYXVsdCBjdXN0b21FbGVtZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3VzdG9tRWxlbWVudC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvY3VzdG9tRWxlbWVudC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2N1c3RvbUVsZW1lbnQubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCB7IGhhbmRsZURlY29yYXRvciB9IGZyb20gJy4vaGFuZGxlRGVjb3JhdG9yJztcbmltcG9ydCB7IGF1dG8gfSBmcm9tICcuLy4uL2RpZmYnO1xuLyoqXG4gKiBEZWNvcmF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byByZWdpc3RlciBhIGZ1bmN0aW9uIGFzIGEgc3BlY2lmaWMgcHJvcGVydHkgZGlmZlxuICpcbiAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvZiB3aGljaCB0aGUgZGlmZiBmdW5jdGlvbiBpcyBhcHBsaWVkXG4gKiBAcGFyYW0gZGlmZlR5cGUgICAgICBUaGUgZGlmZiB0eXBlLCBkZWZhdWx0IGlzIERpZmZUeXBlLkFVVE8uXG4gKiBAcGFyYW0gZGlmZkZ1bmN0aW9uICBBIGRpZmYgZnVuY3Rpb24gdG8gcnVuIGlmIGRpZmZUeXBlIGlmIERpZmZUeXBlLkNVU1RPTVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZlByb3BlcnR5KHByb3BlcnR5TmFtZSwgZGlmZkZ1bmN0aW9uID0gYXV0bywgcmVhY3Rpb25GdW5jdGlvbikge1xuICAgIHJldHVybiBoYW5kbGVEZWNvcmF0b3IoKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcihgZGlmZlByb3BlcnR5OiR7cHJvcGVydHlOYW1lfWAsIGRpZmZGdW5jdGlvbi5iaW5kKG51bGwpKTtcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcigncmVnaXN0ZXJlZERpZmZQcm9wZXJ0eScsIHByb3BlcnR5TmFtZSk7XG4gICAgICAgIGlmIChyZWFjdGlvbkZ1bmN0aW9uIHx8IHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICB0YXJnZXQuYWRkRGVjb3JhdG9yKCdkaWZmUmVhY3Rpb24nLCB7XG4gICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgICAgIHJlYWN0aW9uOiBwcm9wZXJ0eUtleSA/IHRhcmdldFtwcm9wZXJ0eUtleV0gOiByZWFjdGlvbkZ1bmN0aW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQgZGlmZlByb3BlcnR5O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGlmZlByb3BlcnR5Lm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9kaWZmUHJvcGVydHkubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9kaWZmUHJvcGVydHkubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsIi8qKlxuICogR2VuZXJpYyBkZWNvcmF0b3IgaGFuZGxlciB0byB0YWtlIGNhcmUgb2Ygd2hldGhlciBvciBub3QgdGhlIGRlY29yYXRvciB3YXMgY2FsbGVkIGF0IHRoZSBjbGFzcyBsZXZlbFxuICogb3IgdGhlIG1ldGhvZCBsZXZlbC5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlclxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRGVjb3JhdG9yKGhhbmRsZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGhhbmRsZXIodGFyZ2V0LnByb3RvdHlwZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhhbmRsZXIodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0IGRlZmF1bHQgaGFuZGxlRGVjb3JhdG9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFuZGxlRGVjb3JhdG9yLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9oYW5kbGVEZWNvcmF0b3IubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9oYW5kbGVEZWNvcmF0b3IubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCBXZWFrTWFwIGZyb20gJy4uLy4uL3NoaW0vV2Vha01hcCc7XG5pbXBvcnQgeyBoYW5kbGVEZWNvcmF0b3IgfSBmcm9tICcuL2hhbmRsZURlY29yYXRvcic7XG5pbXBvcnQgeyBiZWZvcmVQcm9wZXJ0aWVzIH0gZnJvbSAnLi9iZWZvcmVQcm9wZXJ0aWVzJztcbi8qKlxuICogTWFwIG9mIGluc3RhbmNlcyBhZ2FpbnN0IHJlZ2lzdGVyZWQgaW5qZWN0b3JzLlxuICovXG5jb25zdCByZWdpc3RlcmVkSW5qZWN0b3JzTWFwID0gbmV3IFdlYWtNYXAoKTtcbi8qKlxuICogRGVjb3JhdG9yIHJldHJpZXZlcyBhbiBpbmplY3RvciBmcm9tIGFuIGF2YWlsYWJsZSByZWdpc3RyeSB1c2luZyB0aGUgbmFtZSBhbmRcbiAqIGNhbGxzIHRoZSBgZ2V0UHJvcGVydGllc2AgZnVuY3Rpb24gd2l0aCB0aGUgcGF5bG9hZCBmcm9tIHRoZSBpbmplY3RvclxuICogYW5kIGN1cnJlbnQgcHJvcGVydGllcyB3aXRoIHRoZSB0aGUgaW5qZWN0ZWQgcHJvcGVydGllcyByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gSW5qZWN0Q29uZmlnIHRoZSBpbmplY3QgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KHsgbmFtZSwgZ2V0UHJvcGVydGllcyB9KSB7XG4gICAgcmV0dXJuIGhhbmRsZURlY29yYXRvcigodGFyZ2V0LCBwcm9wZXJ0eUtleSkgPT4ge1xuICAgICAgICBiZWZvcmVQcm9wZXJ0aWVzKGZ1bmN0aW9uIChwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBjb25zdCBpbmplY3Rvckl0ZW0gPSB0aGlzLnJlZ2lzdHJ5LmdldEluamVjdG9yKG5hbWUpO1xuICAgICAgICAgICAgaWYgKGluamVjdG9ySXRlbSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgaW5qZWN0b3IsIGludmFsaWRhdG9yIH0gPSBpbmplY3Rvckl0ZW07XG4gICAgICAgICAgICAgICAgY29uc3QgcmVnaXN0ZXJlZEluamVjdG9ycyA9IHJlZ2lzdGVyZWRJbmplY3RvcnNNYXAuZ2V0KHRoaXMpIHx8IFtdO1xuICAgICAgICAgICAgICAgIGlmIChyZWdpc3RlcmVkSW5qZWN0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZWdpc3RlcmVkSW5qZWN0b3JzTWFwLnNldCh0aGlzLCByZWdpc3RlcmVkSW5qZWN0b3JzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlZ2lzdGVyZWRJbmplY3RvcnMuaW5kZXhPZihpbmplY3Rvckl0ZW0pID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm93bihpbnZhbGlkYXRvci5vbignaW52YWxpZGF0ZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWRJbmplY3RvcnMucHVzaChpbmplY3Rvckl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJvcGVydGllcyhpbmplY3RvcigpLCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkodGFyZ2V0KTtcbiAgICB9KTtcbn1cbmV4cG9ydCBkZWZhdWx0IGluamVjdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluamVjdC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaW5qZWN0Lm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaW5qZWN0Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgeyBXSURHRVRfQkFTRV9UWVBFIH0gZnJvbSAnLi9SZWdpc3RyeSc7XG5mdW5jdGlvbiBpc09iamVjdE9yQXJyYXkodmFsdWUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYWx3YXlzKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2hhbmdlZDogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IG5ld1Byb3BlcnR5XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmUocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjaGFuZ2VkOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IG5ld1Byb3BlcnR5XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWZlcmVuY2UocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjaGFuZ2VkOiBwcmV2aW91c1Byb3BlcnR5ICE9PSBuZXdQcm9wZXJ0eSxcbiAgICAgICAgdmFsdWU6IG5ld1Byb3BlcnR5XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzaGFsbG93KHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KSB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBjb25zdCB2YWxpZE9sZFByb3BlcnR5ID0gcHJldmlvdXNQcm9wZXJ0eSAmJiBpc09iamVjdE9yQXJyYXkocHJldmlvdXNQcm9wZXJ0eSk7XG4gICAgY29uc3QgdmFsaWROZXdQcm9wZXJ0eSA9IG5ld1Byb3BlcnR5ICYmIGlzT2JqZWN0T3JBcnJheShuZXdQcm9wZXJ0eSk7XG4gICAgaWYgKCF2YWxpZE9sZFByb3BlcnR5IHx8ICF2YWxpZE5ld1Byb3BlcnR5KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjaGFuZ2VkOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ld1Byb3BlcnR5XG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHByZXZpb3VzS2V5cyA9IE9iamVjdC5rZXlzKHByZXZpb3VzUHJvcGVydHkpO1xuICAgIGNvbnN0IG5ld0tleXMgPSBPYmplY3Qua2V5cyhuZXdQcm9wZXJ0eSk7XG4gICAgaWYgKHByZXZpb3VzS2V5cy5sZW5ndGggIT09IG5ld0tleXMubGVuZ3RoKSB7XG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2hhbmdlZCA9IG5ld0tleXMuc29tZSgoa2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3UHJvcGVydHlba2V5XSAhPT0gcHJldmlvdXNQcm9wZXJ0eVtrZXldO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2hhbmdlZCxcbiAgICAgICAgdmFsdWU6IG5ld1Byb3BlcnR5XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhdXRvKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KSB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAodHlwZW9mIG5ld1Byb3BlcnR5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGlmIChuZXdQcm9wZXJ0eS5fdHlwZSA9PT0gV0lER0VUX0JBU0VfVFlQRSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVmZXJlbmNlKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGlnbm9yZShwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoaXNPYmplY3RPckFycmF5KG5ld1Byb3BlcnR5KSkge1xuICAgICAgICByZXN1bHQgPSBzaGFsbG93KHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHJlZmVyZW5jZShwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWZmLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGlmZi5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kaWZmLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgYXNzaWduIH0gZnJvbSAnLi4vLi4vY29yZS9sYW5nJztcbmltcG9ydCBjc3NUcmFuc2l0aW9ucyBmcm9tICcuLi9hbmltYXRpb25zL2Nzc1RyYW5zaXRpb25zJztcbmltcG9ydCB7IGFmdGVyUmVuZGVyIH0gZnJvbSAnLi8uLi9kZWNvcmF0b3JzL2FmdGVyUmVuZGVyJztcbmltcG9ydCB7IHYgfSBmcm9tICcuLy4uL2QnO1xuaW1wb3J0IHsgZG9tIH0gZnJvbSAnLi8uLi92ZG9tJztcbi8qKlxuICogUmVwcmVzZW50cyB0aGUgYXR0YWNoIHN0YXRlIG9mIHRoZSBwcm9qZWN0b3JcbiAqL1xuZXhwb3J0IHZhciBQcm9qZWN0b3JBdHRhY2hTdGF0ZTtcbihmdW5jdGlvbiAoUHJvamVjdG9yQXR0YWNoU3RhdGUpIHtcbiAgICBQcm9qZWN0b3JBdHRhY2hTdGF0ZVtQcm9qZWN0b3JBdHRhY2hTdGF0ZVtcIkF0dGFjaGVkXCJdID0gMV0gPSBcIkF0dGFjaGVkXCI7XG4gICAgUHJvamVjdG9yQXR0YWNoU3RhdGVbUHJvamVjdG9yQXR0YWNoU3RhdGVbXCJEZXRhY2hlZFwiXSA9IDJdID0gXCJEZXRhY2hlZFwiO1xufSkoUHJvamVjdG9yQXR0YWNoU3RhdGUgfHwgKFByb2plY3RvckF0dGFjaFN0YXRlID0ge30pKTtcbi8qKlxuICogQXR0YWNoIHR5cGUgZm9yIHRoZSBwcm9qZWN0b3JcbiAqL1xuZXhwb3J0IHZhciBBdHRhY2hUeXBlO1xuKGZ1bmN0aW9uIChBdHRhY2hUeXBlKSB7XG4gICAgQXR0YWNoVHlwZVtBdHRhY2hUeXBlW1wiQXBwZW5kXCJdID0gMV0gPSBcIkFwcGVuZFwiO1xuICAgIEF0dGFjaFR5cGVbQXR0YWNoVHlwZVtcIk1lcmdlXCJdID0gMl0gPSBcIk1lcmdlXCI7XG59KShBdHRhY2hUeXBlIHx8IChBdHRhY2hUeXBlID0ge30pKTtcbmV4cG9ydCBmdW5jdGlvbiBQcm9qZWN0b3JNaXhpbihCYXNlKSB7XG4gICAgY2xhc3MgUHJvamVjdG9yIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdCA9IGRvY3VtZW50LmJvZHk7XG4gICAgICAgICAgICB0aGlzLl9hc3luYyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9wcm9qZWN0b3JQcm9wZXJ0aWVzID0ge307XG4gICAgICAgICAgICB0aGlzLl9wcm9qZWN0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uczogY3NzVHJhbnNpdGlvbnNcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgICAgICAgdGhpcy5wcm9qZWN0b3JTdGF0ZSA9IFByb2plY3RvckF0dGFjaFN0YXRlLkRldGFjaGVkO1xuICAgICAgICB9XG4gICAgICAgIGFwcGVuZChyb290KSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IEF0dGFjaFR5cGUuQXBwZW5kLFxuICAgICAgICAgICAgICAgIHJvb3RcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXR0YWNoKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIG1lcmdlKHJvb3QpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogQXR0YWNoVHlwZS5NZXJnZSxcbiAgICAgICAgICAgICAgICByb290XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2F0dGFjaChvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBzZXQgcm9vdChyb290KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9qZWN0b3JTdGF0ZSA9PT0gUHJvamVjdG9yQXR0YWNoU3RhdGUuQXR0YWNoZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2plY3RvciBhbHJlYWR5IGF0dGFjaGVkLCBjYW5ub3QgY2hhbmdlIHJvb3QgZWxlbWVudCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcm9vdCA9IHJvb3Q7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHJvb3QoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcm9vdDtcbiAgICAgICAgfVxuICAgICAgICBnZXQgYXN5bmMoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXN5bmM7XG4gICAgICAgIH1cbiAgICAgICAgc2V0IGFzeW5jKGFzeW5jKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9qZWN0b3JTdGF0ZSA9PT0gUHJvamVjdG9yQXR0YWNoU3RhdGUuQXR0YWNoZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2plY3RvciBhbHJlYWR5IGF0dGFjaGVkLCBjYW5ub3QgY2hhbmdlIGFzeW5jIG1vZGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2FzeW5jID0gYXN5bmM7XG4gICAgICAgIH1cbiAgICAgICAgc2FuZGJveChkb2MgPSBkb2N1bWVudCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvamVjdG9yU3RhdGUgPT09IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9qZWN0b3IgYWxyZWFkeSBhdHRhY2hlZCwgY2Fubm90IGNyZWF0ZSBzYW5kYm94Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9hc3luYyA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNSb290ID0gdGhpcy5yb290O1xuICAgICAgICAgICAgLyogZnJlZSB1cCB0aGUgZG9jdW1lbnQgZnJhZ21lbnQgZm9yIEdDICovXG4gICAgICAgICAgICB0aGlzLm93bih7XG4gICAgICAgICAgICAgICAgZGVzdHJveTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yb290ID0gcHJldmlvdXNSb290O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fYXR0YWNoKHtcbiAgICAgICAgICAgICAgICAvKiBEb2N1bWVudEZyYWdtZW50IGlzIG5vdCBhc3NpZ25hYmxlIHRvIEVsZW1lbnQsIGJ1dCBwcm92aWRlcyBldmVyeXRoaW5nIG5lZWRlZCB0byB3b3JrICovXG4gICAgICAgICAgICAgICAgcm9vdDogZG9jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBBdHRhY2hUeXBlLkFwcGVuZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0Q2hpbGRyZW4oY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX19zZXRDaGlsZHJlbl9fKGNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX19zZXRQcm9wZXJ0aWVzX18ocHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICAgICAgX19zZXRQcm9wZXJ0aWVzX18ocHJvcGVydGllcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Byb2plY3RvclByb3BlcnRpZXMgJiYgdGhpcy5fcHJvamVjdG9yUHJvcGVydGllcy5yZWdpc3RyeSAhPT0gcHJvcGVydGllcy5yZWdpc3RyeSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9qZWN0b3JQcm9wZXJ0aWVzLnJlZ2lzdHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2plY3RvclByb3BlcnRpZXMucmVnaXN0cnkuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3Byb2plY3RvclByb3BlcnRpZXMgPSBhc3NpZ24oe30sIHByb3BlcnRpZXMpO1xuICAgICAgICAgICAgc3VwZXIuX19zZXRDb3JlUHJvcGVydGllc19fKHsgYmluZDogdGhpcywgYmFzZVJlZ2lzdHJ5OiBwcm9wZXJ0aWVzLnJlZ2lzdHJ5IH0pO1xuICAgICAgICAgICAgc3VwZXIuX19zZXRQcm9wZXJ0aWVzX18ocHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICAgICAgdG9IdG1sKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvamVjdG9yU3RhdGUgIT09IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkIHx8ICF0aGlzLl9wcm9qZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9qZWN0b3IgaXMgbm90IGF0dGFjaGVkLCBjYW5ub3QgcmV0dXJuIGFuIEhUTUwgc3RyaW5nIG9mIHByb2plY3Rpb24uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvamVjdGlvbi5kb21Ob2RlLmNoaWxkTm9kZXNbMF0ub3V0ZXJIVE1MO1xuICAgICAgICB9XG4gICAgICAgIGFmdGVyUmVuZGVyKHJlc3VsdCkge1xuICAgICAgICAgICAgbGV0IG5vZGUgPSByZXN1bHQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgfHwgcmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IHYoJ3NwYW4nLCB7fSwgW3Jlc3VsdF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICBfYXR0YWNoKHsgdHlwZSwgcm9vdCB9KSB7XG4gICAgICAgICAgICBpZiAocm9vdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucm9vdCA9IHJvb3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fYXR0YWNoSGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2F0dGFjaEhhbmRsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHJvamVjdG9yU3RhdGUgPSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5BdHRhY2hlZDtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHtcbiAgICAgICAgICAgICAgICBkZXN0cm95OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb2plY3RvclN0YXRlID09PSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5BdHRhY2hlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvamVjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdG9yU3RhdGUgPSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5EZXRhY2hlZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLm93bihoYW5kbGUpO1xuICAgICAgICAgICAgdGhpcy5fYXR0YWNoSGFuZGxlID0gaGFuZGxlO1xuICAgICAgICAgICAgdGhpcy5fcHJvamVjdGlvbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9wcm9qZWN0aW9uT3B0aW9ucywgeyBzeW5jOiAhdGhpcy5fYXN5bmMgfSk7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEF0dGFjaFR5cGUuQXBwZW5kOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm9qZWN0aW9uID0gZG9tLmFwcGVuZCh0aGlzLnJvb3QsIHRoaXMsIHRoaXMuX3Byb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBBdHRhY2hUeXBlLk1lcmdlOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm9qZWN0aW9uID0gZG9tLm1lcmdlKHRoaXMucm9vdCwgdGhpcywgdGhpcy5fcHJvamVjdGlvbk9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdHRhY2hIYW5kbGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdHNsaWJfMS5fX2RlY29yYXRlKFtcbiAgICAgICAgYWZ0ZXJSZW5kZXIoKVxuICAgIF0sIFByb2plY3Rvci5wcm90b3R5cGUsIFwiYWZ0ZXJSZW5kZXJcIiwgbnVsbCk7XG4gICAgcmV0dXJuIFByb2plY3Rvcjtcbn1cbmV4cG9ydCBkZWZhdWx0IFByb2plY3Rvck1peGluO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJvamVjdG9yLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvbWl4aW5zL1Byb2plY3Rvci5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9taXhpbnMvUHJvamVjdG9yLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgSW5qZWN0b3IgfSBmcm9tICcuLy4uL0luamVjdG9yJztcbmltcG9ydCB7IGluamVjdCB9IGZyb20gJy4vLi4vZGVjb3JhdG9ycy9pbmplY3QnO1xuaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi8uLi9kZWNvcmF0b3JzL2hhbmRsZURlY29yYXRvcic7XG5pbXBvcnQgeyBkaWZmUHJvcGVydHkgfSBmcm9tICcuLy4uL2RlY29yYXRvcnMvZGlmZlByb3BlcnR5JztcbmltcG9ydCB7IHNoYWxsb3cgfSBmcm9tICcuLy4uL2RpZmYnO1xuY29uc3QgVEhFTUVfS0VZID0gJyBfa2V5JztcbmV4cG9ydCBjb25zdCBJTkpFQ1RFRF9USEVNRV9LRVkgPSBTeW1ib2woJ3RoZW1lJyk7XG4vKipcbiAqIERlY29yYXRvciBmb3IgYmFzZSBjc3MgY2xhc3Nlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGhlbWUodGhlbWUpIHtcbiAgICByZXR1cm4gaGFuZGxlRGVjb3JhdG9yKCh0YXJnZXQpID0+IHtcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcignYmFzZVRoZW1lQ2xhc3NlcycsIHRoZW1lKTtcbiAgICB9KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIHJldmVyc2UgbG9va3VwIGZvciB0aGUgY2xhc3NlcyBwYXNzZWQgaW4gdmlhIHRoZSBgdGhlbWVgIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBjbGFzc2VzIFRoZSBiYXNlQ2xhc3NlcyBvYmplY3RcbiAqIEByZXF1aXJlc1xuICovXG5mdW5jdGlvbiBjcmVhdGVUaGVtZUNsYXNzZXNMb29rdXAoY2xhc3Nlcykge1xuICAgIHJldHVybiBjbGFzc2VzLnJlZHVjZSgoY3VycmVudENsYXNzTmFtZXMsIGJhc2VDbGFzcykgPT4ge1xuICAgICAgICBPYmplY3Qua2V5cyhiYXNlQ2xhc3MpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgY3VycmVudENsYXNzTmFtZXNbYmFzZUNsYXNzW2tleV1dID0ga2V5O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzc05hbWVzO1xuICAgIH0sIHt9KTtcbn1cbi8qKlxuICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBpcyBnaXZlbiBhIHRoZW1lIGFuZCBhbiBvcHRpb25hbCByZWdpc3RyeSwgdGhlIHRoZW1lXG4gKiBpbmplY3RvciBpcyBkZWZpbmVkIGFnYWluc3QgdGhlIHJlZ2lzdHJ5LCByZXR1cm5pbmcgdGhlIHRoZW1lLlxuICpcbiAqIEBwYXJhbSB0aGVtZSB0aGUgdGhlbWUgdG8gc2V0XG4gKiBAcGFyYW0gdGhlbWVSZWdpc3RyeSByZWdpc3RyeSB0byBkZWZpbmUgdGhlIHRoZW1lIGluamVjdG9yIGFnYWluc3QuIERlZmF1bHRzXG4gKiB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5XG4gKlxuICogQHJldHVybnMgdGhlIHRoZW1lIGluamVjdG9yIHVzZWQgdG8gc2V0IHRoZSB0aGVtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJUaGVtZUluamVjdG9yKHRoZW1lLCB0aGVtZVJlZ2lzdHJ5KSB7XG4gICAgY29uc3QgdGhlbWVJbmplY3RvciA9IG5ldyBJbmplY3Rvcih0aGVtZSk7XG4gICAgdGhlbWVSZWdpc3RyeS5kZWZpbmVJbmplY3RvcihJTkpFQ1RFRF9USEVNRV9LRVksIChpbnZhbGlkYXRvcikgPT4ge1xuICAgICAgICB0aGVtZUluamVjdG9yLnNldEludmFsaWRhdG9yKGludmFsaWRhdG9yKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHRoZW1lSW5qZWN0b3IuZ2V0KCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoZW1lSW5qZWN0b3I7XG59XG4vKipcbiAqIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGNsYXNzIGRlY29yYXRlZCB3aXRoIHdpdGggVGhlbWVkIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFRoZW1lZE1peGluKEJhc2UpIHtcbiAgICBsZXQgVGhlbWVkID0gY2xhc3MgVGhlbWVkIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogUmVnaXN0ZXJlZCBiYXNlIHRoZW1lIGtleXNcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZEJhc2VUaGVtZUtleXMgPSBbXTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogSW5kaWNhdGVzIGlmIGNsYXNzZXMgbWV0YSBkYXRhIG5lZWQgdG8gYmUgY2FsY3VsYXRlZC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy5fcmVjYWxjdWxhdGVDbGFzc2VzID0gdHJ1ZTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogTG9hZGVkIHRoZW1lXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXMuX3RoZW1lID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhlbWUoY2xhc3Nlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JlY2FsY3VsYXRlQ2xhc3Nlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlY2FsY3VsYXRlVGhlbWVDbGFzc2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjbGFzc2VzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc2VzLm1hcCgoY2xhc3NOYW1lKSA9PiB0aGlzLl9nZXRUaGVtZUNsYXNzKGNsYXNzTmFtZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFRoZW1lQ2xhc3MoY2xhc3Nlcyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZ1bmN0aW9uIGZpcmVkIHdoZW4gYHRoZW1lYCBvciBgZXh0cmFDbGFzc2VzYCBhcmUgY2hhbmdlZC5cbiAgICAgICAgICovXG4gICAgICAgIG9uUHJvcGVydGllc0NoYW5nZWQoKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWNhbGN1bGF0ZUNsYXNzZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIF9nZXRUaGVtZUNsYXNzKGNsYXNzTmFtZSkge1xuICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PT0gdW5kZWZpbmVkIHx8IGNsYXNzTmFtZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBleHRyYUNsYXNzZXMgPSB0aGlzLnByb3BlcnRpZXMuZXh0cmFDbGFzc2VzIHx8IHt9O1xuICAgICAgICAgICAgY29uc3QgdGhlbWVDbGFzc05hbWUgPSB0aGlzLl9iYXNlVGhlbWVDbGFzc2VzUmV2ZXJzZUxvb2t1cFtjbGFzc05hbWVdO1xuICAgICAgICAgICAgbGV0IHJlc3VsdENsYXNzTmFtZXMgPSBbXTtcbiAgICAgICAgICAgIGlmICghdGhlbWVDbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYENsYXNzIG5hbWU6ICcke2NsYXNzTmFtZX0nIG5vdCBmb3VuZCBpbiB0aGVtZWApO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4dHJhQ2xhc3Nlc1t0aGVtZUNsYXNzTmFtZV0pIHtcbiAgICAgICAgICAgICAgICByZXN1bHRDbGFzc05hbWVzLnB1c2goZXh0cmFDbGFzc2VzW3RoZW1lQ2xhc3NOYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fdGhlbWVbdGhlbWVDbGFzc05hbWVdKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0Q2xhc3NOYW1lcy5wdXNoKHRoaXMuX3RoZW1lW3RoZW1lQ2xhc3NOYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHRDbGFzc05hbWVzLnB1c2godGhpcy5fcmVnaXN0ZXJlZEJhc2VUaGVtZVt0aGVtZUNsYXNzTmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENsYXNzTmFtZXMuam9pbignICcpO1xuICAgICAgICB9XG4gICAgICAgIF9yZWNhbGN1bGF0ZVRoZW1lQ2xhc3NlcygpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGhlbWUgPSB7fSB9ID0gdGhpcy5wcm9wZXJ0aWVzO1xuICAgICAgICAgICAgY29uc3QgYmFzZVRoZW1lcyA9IHRoaXMuZ2V0RGVjb3JhdG9yKCdiYXNlVGhlbWVDbGFzc2VzJyk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3JlZ2lzdGVyZWRCYXNlVGhlbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lID0gYmFzZVRoZW1lcy5yZWR1Y2UoKGZpbmFsQmFzZVRoZW1lLCBiYXNlVGhlbWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX2EgPSBUSEVNRV9LRVksIGtleSA9IGJhc2VUaGVtZVtfYV0sIGNsYXNzZXMgPSB0c2xpYl8xLl9fcmVzdChiYXNlVGhlbWUsIFt0eXBlb2YgX2EgPT09IFwic3ltYm9sXCIgPyBfYSA6IF9hICsgXCJcIl0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lS2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBmaW5hbEJhc2VUaGVtZSwgY2xhc3Nlcyk7XG4gICAgICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Jhc2VUaGVtZUNsYXNzZXNSZXZlcnNlTG9va3VwID0gY3JlYXRlVGhlbWVDbGFzc2VzTG9va3VwKGJhc2VUaGVtZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdGhlbWUgPSB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lS2V5cy5yZWR1Y2UoKGJhc2VUaGVtZSwgdGhlbWVLZXkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgYmFzZVRoZW1lLCB0aGVtZVt0aGVtZUtleV0pO1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgdGhpcy5fcmVjYWxjdWxhdGVDbGFzc2VzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHRzbGliXzEuX19kZWNvcmF0ZShbXG4gICAgICAgIGRpZmZQcm9wZXJ0eSgndGhlbWUnLCBzaGFsbG93KSxcbiAgICAgICAgZGlmZlByb3BlcnR5KCdleHRyYUNsYXNzZXMnLCBzaGFsbG93KVxuICAgIF0sIFRoZW1lZC5wcm90b3R5cGUsIFwib25Qcm9wZXJ0aWVzQ2hhbmdlZFwiLCBudWxsKTtcbiAgICBUaGVtZWQgPSB0c2xpYl8xLl9fZGVjb3JhdGUoW1xuICAgICAgICBpbmplY3Qoe1xuICAgICAgICAgICAgbmFtZTogSU5KRUNURURfVEhFTUVfS0VZLFxuICAgICAgICAgICAgZ2V0UHJvcGVydGllczogKHRoZW1lLCBwcm9wZXJ0aWVzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFwcm9wZXJ0aWVzLnRoZW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHRoZW1lIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICBdLCBUaGVtZWQpO1xuICAgIHJldHVybiBUaGVtZWQ7XG59XG5leHBvcnQgZGVmYXVsdCBUaGVtZWRNaXhpbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRoZW1lZC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL21peGlucy9UaGVtZWQubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvbWl4aW5zL1RoZW1lZC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFdpZGdldEJhc2UsIG5vQmluZCB9IGZyb20gJy4vV2lkZ2V0QmFzZSc7XG5pbXBvcnQgeyBQcm9qZWN0b3JNaXhpbiB9IGZyb20gJy4vbWl4aW5zL1Byb2plY3Rvcic7XG5pbXBvcnQgeyBmcm9tIH0gZnJvbSAnLi4vc2hpbS9hcnJheSc7XG5pbXBvcnQgeyB3LCBkb20gfSBmcm9tICcuL2QnO1xuaW1wb3J0IGdsb2JhbCBmcm9tICcuLi9zaGltL2dsb2JhbCc7XG5pbXBvcnQgeyByZWdpc3RlclRoZW1lSW5qZWN0b3IgfSBmcm9tICcuL21peGlucy9UaGVtZWQnO1xuaW1wb3J0IHsgYWx3YXlzUmVuZGVyIH0gZnJvbSAnLi9kZWNvcmF0b3JzL2Fsd2F5c1JlbmRlcic7XG5leHBvcnQgdmFyIEN1c3RvbUVsZW1lbnRDaGlsZFR5cGU7XG4oZnVuY3Rpb24gKEN1c3RvbUVsZW1lbnRDaGlsZFR5cGUpIHtcbiAgICBDdXN0b21FbGVtZW50Q2hpbGRUeXBlW1wiRE9KT1wiXSA9IFwiRE9KT1wiO1xuICAgIEN1c3RvbUVsZW1lbnRDaGlsZFR5cGVbXCJOT0RFXCJdID0gXCJOT0RFXCI7XG4gICAgQ3VzdG9tRWxlbWVudENoaWxkVHlwZVtcIlRFWFRcIl0gPSBcIlRFWFRcIjtcbn0pKEN1c3RvbUVsZW1lbnRDaGlsZFR5cGUgfHwgKEN1c3RvbUVsZW1lbnRDaGlsZFR5cGUgPSB7fSkpO1xuZXhwb3J0IGZ1bmN0aW9uIERvbVRvV2lkZ2V0V3JhcHBlcihkb21Ob2RlKSB7XG4gICAgbGV0IERvbVRvV2lkZ2V0V3JhcHBlciA9IGNsYXNzIERvbVRvV2lkZ2V0V3JhcHBlciBleHRlbmRzIFdpZGdldEJhc2Uge1xuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gT2JqZWN0LmtleXModGhpcy5wcm9wZXJ0aWVzKS5yZWR1Y2UoKHByb3BzLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMucHJvcGVydGllc1trZXldO1xuICAgICAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZignb24nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBgX18ke2tleX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcm9wc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3BzO1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgcmV0dXJuIGRvbSh7IG5vZGU6IGRvbU5vZGUsIHByb3BzOiBwcm9wZXJ0aWVzLCBkaWZmVHlwZTogJ2RvbScgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGdldCBkb21Ob2RlKCkge1xuICAgICAgICAgICAgcmV0dXJuIGRvbU5vZGU7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIERvbVRvV2lkZ2V0V3JhcHBlciA9IHRzbGliXzEuX19kZWNvcmF0ZShbXG4gICAgICAgIGFsd2F5c1JlbmRlcigpXG4gICAgXSwgRG9tVG9XaWRnZXRXcmFwcGVyKTtcbiAgICByZXR1cm4gRG9tVG9XaWRnZXRXcmFwcGVyO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZShkZXNjcmlwdG9yLCBXaWRnZXRDb25zdHJ1Y3Rvcikge1xuICAgIGNvbnN0IHsgYXR0cmlidXRlcywgY2hpbGRUeXBlLCByZWdpc3RyeUZhY3RvcnkgfSA9IGRlc2NyaXB0b3I7XG4gICAgY29uc3QgYXR0cmlidXRlTWFwID0ge307XG4gICAgYXR0cmlidXRlcy5mb3JFYWNoKChwcm9wZXJ0eU5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IHByb3BlcnR5TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBhdHRyaWJ1dGVNYXBbYXR0cmlidXRlTmFtZV0gPSBwcm9wZXJ0eU5hbWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0ge307XG4gICAgICAgICAgICB0aGlzLl9jaGlsZHJlbiA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fZXZlbnRQcm9wZXJ0aWVzID0ge307XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsaXNlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxpc2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZG9tUHJvcGVydGllcyA9IHt9O1xuICAgICAgICAgICAgY29uc3QgeyBhdHRyaWJ1dGVzLCBwcm9wZXJ0aWVzLCBldmVudHMgfSA9IGRlc2NyaXB0b3I7XG4gICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcHJvcGVydGllcywgdGhpcy5fYXR0cmlidXRlc1RvUHJvcGVydGllcyhhdHRyaWJ1dGVzKSk7XG4gICAgICAgICAgICBbLi4uYXR0cmlidXRlcywgLi4ucHJvcGVydGllc10uZm9yRWFjaCgocHJvcGVydHlOYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzW3Byb3BlcnR5TmFtZV07XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRQcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUucmVwbGFjZSgvXm9uLywgJ19fJyk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJlZFByb3BlcnR5TmFtZSAhPT0gcHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbVByb3BlcnRpZXNbZmlsdGVyZWRQcm9wZXJ0eU5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiAoKSA9PiB0aGlzLl9nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiAodmFsdWUpID0+IHRoaXMuX3NldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRvbVByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiAoKSA9PiB0aGlzLl9nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpLFxuICAgICAgICAgICAgICAgICAgICBzZXQ6ICh2YWx1ZSkgPT4gdGhpcy5fc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBldmVudHMuZm9yRWFjaCgocHJvcGVydHlOYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0gcHJvcGVydHlOYW1lLnJlcGxhY2UoL15vbi8sICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkUHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lLnJlcGxhY2UoL15vbi8sICdfX29uJyk7XG4gICAgICAgICAgICAgICAgZG9tUHJvcGVydGllc1tmaWx0ZXJlZFByb3BlcnR5TmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogKCkgPT4gdGhpcy5fZ2V0RXZlbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpLFxuICAgICAgICAgICAgICAgICAgICBzZXQ6ICh2YWx1ZSkgPT4gdGhpcy5fc2V0RXZlbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnRDYWxsYmFjayA9IHRoaXMuX2dldEV2ZW50UHJvcGVydHkocHJvcGVydHlOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBldmVudENhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudENhbGxiYWNrKC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWJibGVzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDogYXJnc1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywgZG9tUHJvcGVydGllcyk7XG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkVHlwZSA9PT0gQ3VzdG9tRWxlbWVudENoaWxkVHlwZS5URVhUID8gdGhpcy5jaGlsZE5vZGVzIDogdGhpcy5jaGlsZHJlbjtcbiAgICAgICAgICAgIGZyb20oY2hpbGRyZW4pLmZvckVhY2goKGNoaWxkTm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZFR5cGUgPT09IEN1c3RvbUVsZW1lbnRDaGlsZFR5cGUuRE9KTykge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZE5vZGUuYWRkRXZlbnRMaXN0ZW5lcignZG9qby1jZS1yZW5kZXInLCAoKSA9PiB0aGlzLl9yZW5kZXIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkTm9kZS5hZGRFdmVudExpc3RlbmVyKCdkb2pvLWNlLWNvbm5lY3RlZCcsICgpID0+IHRoaXMuX3JlbmRlcigpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hpbGRyZW4ucHVzaChEb21Ub1dpZGdldFdyYXBwZXIoY2hpbGROb2RlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGlsZHJlbi5wdXNoKGRvbSh7IG5vZGU6IGNoaWxkTm9kZSwgZGlmZlR5cGU6ICdkb20nIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZG9qby1jZS1jb25uZWN0ZWQnLCAoZSkgPT4gdGhpcy5fY2hpbGRDb25uZWN0ZWQoZSkpO1xuICAgICAgICAgICAgY29uc3Qgd2lkZ2V0UHJvcGVydGllcyA9IHRoaXMuX3Byb3BlcnRpZXM7XG4gICAgICAgICAgICBjb25zdCByZW5kZXJDaGlsZHJlbiA9ICgpID0+IHRoaXMuX19jaGlsZHJlbl9fKCk7XG4gICAgICAgICAgICBjb25zdCBXcmFwcGVyID0gY2xhc3MgZXh0ZW5kcyBXaWRnZXRCYXNlIHtcbiAgICAgICAgICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3KFdpZGdldENvbnN0cnVjdG9yLCB3aWRnZXRQcm9wZXJ0aWVzLCByZW5kZXJDaGlsZHJlbigpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgcmVnaXN0cnkgPSByZWdpc3RyeUZhY3RvcnkoKTtcbiAgICAgICAgICAgIGNvbnN0IHRoZW1lQ29udGV4dCA9IHJlZ2lzdGVyVGhlbWVJbmplY3Rvcih0aGlzLl9nZXRUaGVtZSgpLCByZWdpc3RyeSk7XG4gICAgICAgICAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignZG9qby10aGVtZS1zZXQnLCAoKSA9PiB0aGVtZUNvbnRleHQuc2V0KHRoaXMuX2dldFRoZW1lKCkpKTtcbiAgICAgICAgICAgIGNvbnN0IFByb2plY3RvciA9IFByb2plY3Rvck1peGluKFdyYXBwZXIpO1xuICAgICAgICAgICAgdGhpcy5fcHJvamVjdG9yID0gbmV3IFByb2plY3RvcigpO1xuICAgICAgICAgICAgdGhpcy5fcHJvamVjdG9yLnNldFByb3BlcnRpZXMoeyByZWdpc3RyeSB9KTtcbiAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rvci5hcHBlbmQodGhpcyk7XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsaXNlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdkb2pvLWNlLWNvbm5lY3RlZCcsIHtcbiAgICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgIGRldGFpbDogdGhpc1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIF9nZXRUaGVtZSgpIHtcbiAgICAgICAgICAgIGlmIChnbG9iYWwgJiYgZ2xvYmFsLmRvam9jZSAmJiBnbG9iYWwuZG9qb2NlLnRoZW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdsb2JhbC5kb2pvY2UudGhlbWVzW2dsb2JhbC5kb2pvY2UudGhlbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9jaGlsZENvbm5lY3RlZChlKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gZS5kZXRhaWw7XG4gICAgICAgICAgICBpZiAobm9kZS5wYXJlbnROb2RlID09PSB0aGlzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RzID0gdGhpcy5fY2hpbGRyZW4uc29tZSgoY2hpbGQpID0+IGNoaWxkLmRvbU5vZGUgPT09IG5vZGUpO1xuICAgICAgICAgICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignZG9qby1jZS1yZW5kZXInLCAoKSA9PiB0aGlzLl9yZW5kZXIoKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoaWxkcmVuLnB1c2goRG9tVG9XaWRnZXRXcmFwcGVyKG5vZGUpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9yZW5kZXIoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcHJvamVjdG9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvamVjdG9yLmludmFsaWRhdGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdkb2pvLWNlLXJlbmRlcicsIHtcbiAgICAgICAgICAgICAgICAgICAgYnViYmxlczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDogdGhpc1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfX3Byb3BlcnRpZXNfXygpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9wcm9wZXJ0aWVzLCB0aGlzLl9ldmVudFByb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgICAgIF9fY2hpbGRyZW5fXygpIHtcbiAgICAgICAgICAgIGlmIChjaGlsZFR5cGUgPT09IEN1c3RvbUVsZW1lbnRDaGlsZFR5cGUuRE9KTykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jaGlsZHJlbi5maWx0ZXIoKENoaWxkKSA9PiBDaGlsZC5kb21Ob2RlLmlzV2lkZ2V0KS5tYXAoKENoaWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZG9tTm9kZSB9ID0gQ2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3KENoaWxkLCBPYmplY3QuYXNzaWduKHt9LCBkb21Ob2RlLl9fcHJvcGVydGllc19fKCkpLCBbLi4uZG9tTm9kZS5fX2NoaWxkcmVuX18oKV0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGRWYWx1ZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9IGF0dHJpYnV0ZU1hcFtuYW1lXTtcbiAgICAgICAgICAgIHRoaXMuX3NldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIF9zZXRFdmVudFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50UHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgX2dldEV2ZW50UHJvcGVydHkocHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgX3NldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZVtub0JpbmRdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgX2dldFByb3BlcnR5KHByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBfYXR0cmlidXRlc1RvUHJvcGVydGllcyhhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlcy5yZWR1Y2UoKHByb3BlcnRpZXMsIHByb3BlcnR5TmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoYXR0cmlidXRlTWFwKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgaXNXaWRnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXIoV2lkZ2V0Q29uc3RydWN0b3IpIHtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gV2lkZ2V0Q29uc3RydWN0b3IucHJvdG90eXBlICYmIFdpZGdldENvbnN0cnVjdG9yLnByb3RvdHlwZS5fX2N1c3RvbUVsZW1lbnREZXNjcmlwdG9yO1xuICAgIGlmICghZGVzY3JpcHRvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgZGVzY3JpcHRvciBmb3IgQ3VzdG9tIEVsZW1lbnQsIGhhdmUgeW91IGFkZGVkIHRoZSBAY3VzdG9tRWxlbWVudCBkZWNvcmF0b3IgdG8geW91ciBXaWRnZXQ/Jyk7XG4gICAgfVxuICAgIGdsb2JhbC5jdXN0b21FbGVtZW50cy5kZWZpbmUoZGVzY3JpcHRvci50YWdOYW1lLCBjcmVhdGUoZGVzY3JpcHRvciwgV2lkZ2V0Q29uc3RydWN0b3IpKTtcbn1cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVnaXN0ZXJDdXN0b21FbGVtZW50Lm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvcmVnaXN0ZXJDdXN0b21FbGVtZW50Lm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL3JlZ2lzdGVyQ3VzdG9tRWxlbWVudC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IGdsb2JhbCBmcm9tICcuLi9zaGltL2dsb2JhbCc7XG5pbXBvcnQgeyBmcm9tIGFzIGFycmF5RnJvbSB9IGZyb20gJy4uL3NoaW0vYXJyYXknO1xuaW1wb3J0IHsgaXNXTm9kZSwgaXNWTm9kZSwgaXNEb21WTm9kZSwgVk5PREUsIFdOT0RFIH0gZnJvbSAnLi9kJztcbmltcG9ydCB7IGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yIH0gZnJvbSAnLi9SZWdpc3RyeSc7XG5pbXBvcnQgV2Vha01hcCBmcm9tICcuLi9zaGltL1dlYWtNYXAnO1xuY29uc3QgTkFNRVNQQUNFX1czID0gJ2h0dHA6Ly93d3cudzMub3JnLyc7XG5jb25zdCBOQU1FU1BBQ0VfU1ZHID0gTkFNRVNQQUNFX1czICsgJzIwMDAvc3ZnJztcbmNvbnN0IE5BTUVTUEFDRV9YTElOSyA9IE5BTUVTUEFDRV9XMyArICcxOTk5L3hsaW5rJztcbmNvbnN0IGVtcHR5QXJyYXkgPSBbXTtcbmNvbnN0IG5vZGVPcGVyYXRpb25zID0gWydmb2N1cycsICdibHVyJywgJ3Njcm9sbEludG9WaWV3JywgJ2NsaWNrJ107XG5leHBvcnQgY29uc3Qgd2lkZ2V0SW5zdGFuY2VNYXAgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgaW5zdGFuY2VNYXAgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgbmV4dFNpYmxpbmdNYXAgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgcHJvamVjdG9yU3RhdGVNYXAgPSBuZXcgV2Vha01hcCgpO1xuZnVuY3Rpb24gc2FtZShkbm9kZTEsIGRub2RlMikge1xuICAgIGlmIChpc1ZOb2RlKGRub2RlMSkgJiYgaXNWTm9kZShkbm9kZTIpKSB7XG4gICAgICAgIGlmIChpc0RvbVZOb2RlKGRub2RlMSkgfHwgaXNEb21WTm9kZShkbm9kZTIpKSB7XG4gICAgICAgICAgICBpZiAoZG5vZGUxLmRvbU5vZGUgIT09IGRub2RlMi5kb21Ob2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkbm9kZTEudGFnICE9PSBkbm9kZTIudGFnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRub2RlMS5wcm9wZXJ0aWVzLmtleSAhPT0gZG5vZGUyLnByb3BlcnRpZXMua2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzV05vZGUoZG5vZGUxKSAmJiBpc1dOb2RlKGRub2RlMikpIHtcbiAgICAgICAgaWYgKGRub2RlMS5pbnN0YW5jZSA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBkbm9kZTIud2lkZ2V0Q29uc3RydWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRub2RlMS53aWRnZXRDb25zdHJ1Y3RvciAhPT0gZG5vZGUyLndpZGdldENvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRub2RlMS5wcm9wZXJ0aWVzLmtleSAhPT0gZG5vZGUyLnByb3BlcnRpZXMua2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmNvbnN0IG1pc3NpbmdUcmFuc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUHJvdmlkZSBhIHRyYW5zaXRpb25zIG9iamVjdCB0byB0aGUgcHJvamVjdGlvbk9wdGlvbnMgdG8gZG8gYW5pbWF0aW9ucycpO1xufTtcbmZ1bmN0aW9uIGdldFByb2plY3Rpb25PcHRpb25zKHByb2plY3Rvck9wdGlvbnMsIHByb2plY3Rvckluc3RhbmNlKSB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgICAgIG5hbWVzcGFjZTogdW5kZWZpbmVkLFxuICAgICAgICBzdHlsZUFwcGx5ZXI6IGZ1bmN0aW9uIChkb21Ob2RlLCBzdHlsZU5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgICBkb21Ob2RlLnN0eWxlW3N0eWxlTmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNpdGlvbnM6IHtcbiAgICAgICAgICAgIGVudGVyOiBtaXNzaW5nVHJhbnNpdGlvbixcbiAgICAgICAgICAgIGV4aXQ6IG1pc3NpbmdUcmFuc2l0aW9uXG4gICAgICAgIH0sXG4gICAgICAgIGRlcHRoOiAwLFxuICAgICAgICBtZXJnZTogZmFsc2UsXG4gICAgICAgIHN5bmM6IGZhbHNlLFxuICAgICAgICBwcm9qZWN0b3JJbnN0YW5jZVxuICAgIH07XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRzLCBwcm9qZWN0b3JPcHRpb25zKTtcbn1cbmZ1bmN0aW9uIGNoZWNrU3R5bGVWYWx1ZShzdHlsZVZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBzdHlsZVZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0eWxlIHZhbHVlcyBtdXN0IGJlIHN0cmluZ3MnKTtcbiAgICB9XG59XG5mdW5jdGlvbiB1cGRhdGVFdmVudChkb21Ob2RlLCBldmVudE5hbWUsIGN1cnJlbnRWYWx1ZSwgcHJvamVjdGlvbk9wdGlvbnMsIGJpbmQsIHByZXZpb3VzVmFsdWUpIHtcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XG4gICAgY29uc3QgZXZlbnRNYXAgPSBwcm9qZWN0b3JTdGF0ZS5ub2RlTWFwLmdldChkb21Ob2RlKSB8fCBuZXcgV2Vha01hcCgpO1xuICAgIGlmIChwcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzRXZlbnQgPSBldmVudE1hcC5nZXQocHJldmlvdXNWYWx1ZSk7XG4gICAgICAgIGRvbU5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHByZXZpb3VzRXZlbnQpO1xuICAgIH1cbiAgICBsZXQgY2FsbGJhY2sgPSBjdXJyZW50VmFsdWUuYmluZChiaW5kKTtcbiAgICBpZiAoZXZlbnROYW1lID09PSAnaW5wdXQnKSB7XG4gICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICAgICAgY3VycmVudFZhbHVlLmNhbGwodGhpcywgZXZ0KTtcbiAgICAgICAgICAgIGV2dC50YXJnZXRbJ29uaW5wdXQtdmFsdWUnXSA9IGV2dC50YXJnZXQudmFsdWU7XG4gICAgICAgIH0uYmluZChiaW5kKTtcbiAgICB9XG4gICAgZG9tTm9kZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgY2FsbGJhY2spO1xuICAgIGV2ZW50TWFwLnNldChjdXJyZW50VmFsdWUsIGNhbGxiYWNrKTtcbiAgICBwcm9qZWN0b3JTdGF0ZS5ub2RlTWFwLnNldChkb21Ob2RlLCBldmVudE1hcCk7XG59XG5mdW5jdGlvbiBhZGRDbGFzc2VzKGRvbU5vZGUsIGNsYXNzZXMpIHtcbiAgICBpZiAoY2xhc3Nlcykge1xuICAgICAgICBjb25zdCBjbGFzc05hbWVzID0gY2xhc3Nlcy5zcGxpdCgnICcpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsYXNzTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGRvbU5vZGUuY2xhc3NMaXN0LmFkZChjbGFzc05hbWVzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHJlbW92ZUNsYXNzZXMoZG9tTm9kZSwgY2xhc3Nlcykge1xuICAgIGlmIChjbGFzc2VzKSB7XG4gICAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBjbGFzc2VzLnNwbGl0KCcgJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZG9tTm9kZS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZXNbaV0pO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gYnVpbGRQcmV2aW91c1Byb3BlcnRpZXMoZG9tTm9kZSwgcHJldmlvdXMsIGN1cnJlbnQpIHtcbiAgICBjb25zdCB7IGRpZmZUeXBlLCBwcm9wZXJ0aWVzLCBhdHRyaWJ1dGVzIH0gPSBjdXJyZW50O1xuICAgIGlmICghZGlmZlR5cGUgfHwgZGlmZlR5cGUgPT09ICd2ZG9tJykge1xuICAgICAgICByZXR1cm4geyBwcm9wZXJ0aWVzOiBwcmV2aW91cy5wcm9wZXJ0aWVzLCBhdHRyaWJ1dGVzOiBwcmV2aW91cy5hdHRyaWJ1dGVzLCBldmVudHM6IHByZXZpb3VzLmV2ZW50cyB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChkaWZmVHlwZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiB7IHByb3BlcnRpZXM6IHt9LCBhdHRyaWJ1dGVzOiBwcmV2aW91cy5hdHRyaWJ1dGVzID8ge30gOiB1bmRlZmluZWQsIGV2ZW50czogcHJldmlvdXMuZXZlbnRzIH07XG4gICAgfVxuICAgIGxldCBuZXdQcm9wZXJ0aWVzID0ge1xuICAgICAgICBwcm9wZXJ0aWVzOiB7fVxuICAgIH07XG4gICAgaWYgKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgbmV3UHJvcGVydGllcy5hdHRyaWJ1dGVzID0ge307XG4gICAgICAgIG5ld1Byb3BlcnRpZXMuZXZlbnRzID0gcHJldmlvdXMuZXZlbnRzO1xuICAgICAgICBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5mb3JFYWNoKChwcm9wTmFtZSkgPT4ge1xuICAgICAgICAgICAgbmV3UHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BOYW1lXSA9IGRvbU5vZGVbcHJvcE5hbWVdO1xuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaCgoYXR0ck5hbWUpID0+IHtcbiAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMuYXR0cmlidXRlc1thdHRyTmFtZV0gPSBkb21Ob2RlLmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3UHJvcGVydGllcztcbiAgICB9XG4gICAgbmV3UHJvcGVydGllcy5wcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMocHJvcGVydGllcykucmVkdWNlKChwcm9wcywgcHJvcGVydHkpID0+IHtcbiAgICAgICAgcHJvcHNbcHJvcGVydHldID0gZG9tTm9kZS5nZXRBdHRyaWJ1dGUocHJvcGVydHkpIHx8IGRvbU5vZGVbcHJvcGVydHldO1xuICAgICAgICByZXR1cm4gcHJvcHM7XG4gICAgfSwge30pO1xuICAgIHJldHVybiBuZXdQcm9wZXJ0aWVzO1xufVxuZnVuY3Rpb24gbm9kZU9wZXJhdGlvbihwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcmV2aW91c1ZhbHVlLCBkb21Ob2RlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVzdWx0ID0gcHJvcFZhbHVlKCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBwcm9wVmFsdWUgJiYgIXByZXZpb3VzVmFsdWU7XG4gICAgfVxuICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xuICAgICAgICBwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgIGRvbU5vZGVbcHJvcE5hbWVdKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlbW92ZU9ycGhhbmVkRXZlbnRzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcywgcHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMsIG9ubHlFdmVudHMgPSBmYWxzZSkge1xuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcbiAgICBjb25zdCBldmVudE1hcCA9IHByb2plY3RvclN0YXRlLm5vZGVNYXAuZ2V0KGRvbU5vZGUpO1xuICAgIGlmIChldmVudE1hcCkge1xuICAgICAgICBPYmplY3Qua2V5cyhwcmV2aW91c1Byb3BlcnRpZXMpLmZvckVhY2goKHByb3BOYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc0V2ZW50ID0gcHJvcE5hbWUuc3Vic3RyKDAsIDIpID09PSAnb24nIHx8IG9ubHlFdmVudHM7XG4gICAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBvbmx5RXZlbnRzID8gcHJvcE5hbWUgOiBwcm9wTmFtZS5zdWJzdHIoMik7XG4gICAgICAgICAgICBpZiAoaXNFdmVudCAmJiAhcHJvcGVydGllc1twcm9wTmFtZV0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudENhbGxiYWNrID0gZXZlbnRNYXAuZ2V0KHByZXZpb3VzUHJvcGVydGllc1twcm9wTmFtZV0pO1xuICAgICAgICAgICAgICAgIGlmIChldmVudENhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbU5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGV2ZW50Q2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gdXBkYXRlQXR0cmlidXRlKGRvbU5vZGUsIGF0dHJOYW1lLCBhdHRyVmFsdWUsIHByb2plY3Rpb25PcHRpb25zKSB7XG4gICAgaWYgKHByb2plY3Rpb25PcHRpb25zLm5hbWVzcGFjZSA9PT0gTkFNRVNQQUNFX1NWRyAmJiBhdHRyTmFtZSA9PT0gJ2hyZWYnKSB7XG4gICAgICAgIGRvbU5vZGUuc2V0QXR0cmlidXRlTlMoTkFNRVNQQUNFX1hMSU5LLCBhdHRyTmFtZSwgYXR0clZhbHVlKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoKGF0dHJOYW1lID09PSAncm9sZScgJiYgYXR0clZhbHVlID09PSAnJykgfHwgYXR0clZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZG9tTm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZG9tTm9kZS5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIGF0dHJWYWx1ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gdXBkYXRlQXR0cmlidXRlcyhkb21Ob2RlLCBwcmV2aW91c0F0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMsIHByb2plY3Rpb25PcHRpb25zKSB7XG4gICAgY29uc3QgYXR0ck5hbWVzID0gT2JqZWN0LmtleXMoYXR0cmlidXRlcyk7XG4gICAgY29uc3QgYXR0ckNvdW50ID0gYXR0ck5hbWVzLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJDb3VudDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGF0dHJOYW1lID0gYXR0ck5hbWVzW2ldO1xuICAgICAgICBjb25zdCBhdHRyVmFsdWUgPSBhdHRyaWJ1dGVzW2F0dHJOYW1lXTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNBdHRyVmFsdWUgPSBwcmV2aW91c0F0dHJpYnV0ZXNbYXR0ck5hbWVdO1xuICAgICAgICBpZiAoYXR0clZhbHVlICE9PSBwcmV2aW91c0F0dHJWYWx1ZSkge1xuICAgICAgICAgICAgdXBkYXRlQXR0cmlidXRlKGRvbU5vZGUsIGF0dHJOYW1lLCBhdHRyVmFsdWUsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHVwZGF0ZVByb3BlcnRpZXMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucywgaW5jbHVkZXNFdmVudHNBbmRBdHRyaWJ1dGVzID0gdHJ1ZSkge1xuICAgIGxldCBwcm9wZXJ0aWVzVXBkYXRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHByb3BOYW1lcyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpO1xuICAgIGNvbnN0IHByb3BDb3VudCA9IHByb3BOYW1lcy5sZW5ndGg7XG4gICAgaWYgKHByb3BOYW1lcy5pbmRleE9mKCdjbGFzc2VzJykgPT09IC0xICYmIHByZXZpb3VzUHJvcGVydGllcy5jbGFzc2VzKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByZXZpb3VzUHJvcGVydGllcy5jbGFzc2VzKSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2aW91c1Byb3BlcnRpZXMuY2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzZXMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLmNsYXNzZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVtb3ZlQ2xhc3Nlcyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMuY2xhc3Nlcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5jbHVkZXNFdmVudHNBbmRBdHRyaWJ1dGVzICYmIHJlbW92ZU9ycGhhbmVkRXZlbnRzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcywgcHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcENvdW50OyBpKyspIHtcbiAgICAgICAgY29uc3QgcHJvcE5hbWUgPSBwcm9wTmFtZXNbaV07XG4gICAgICAgIGxldCBwcm9wVmFsdWUgPSBwcm9wZXJ0aWVzW3Byb3BOYW1lXTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHByZXZpb3VzUHJvcGVydGllc1twcm9wTmFtZV07XG4gICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ2NsYXNzZXMnKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c0NsYXNzZXMgPSBBcnJheS5pc0FycmF5KHByZXZpb3VzVmFsdWUpID8gcHJldmlvdXNWYWx1ZSA6IFtwcmV2aW91c1ZhbHVlXTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDbGFzc2VzID0gQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpID8gcHJvcFZhbHVlIDogW3Byb3BWYWx1ZV07XG4gICAgICAgICAgICBpZiAocHJldmlvdXNDbGFzc2VzICYmIHByZXZpb3VzQ2xhc3Nlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwcm9wVmFsdWUgfHwgcHJvcFZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZpb3VzQ2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3Nlcyhkb21Ob2RlLCBwcmV2aW91c0NsYXNzZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdDbGFzc2VzID0gWy4uLmN1cnJlbnRDbGFzc2VzXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2aW91c0NsYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzQ2xhc3NOYW1lID0gcHJldmlvdXNDbGFzc2VzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzQ2xhc3NOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xhc3NJbmRleCA9IG5ld0NsYXNzZXMuaW5kZXhPZihwcmV2aW91c0NsYXNzTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzZXMoZG9tTm9kZSwgcHJldmlvdXNDbGFzc05hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2xhc3Nlcy5zcGxpY2UoY2xhc3NJbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3Q2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkQ2xhc3Nlcyhkb21Ob2RlLCBuZXdDbGFzc2VzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3VycmVudENsYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkQ2xhc3Nlcyhkb21Ob2RlLCBjdXJyZW50Q2xhc3Nlc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGVPcGVyYXRpb25zLmluZGV4T2YocHJvcE5hbWUpICE9PSAtMSkge1xuICAgICAgICAgICAgbm9kZU9wZXJhdGlvbihwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcmV2aW91c1ZhbHVlLCBkb21Ob2RlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocHJvcE5hbWUgPT09ICdzdHlsZXMnKSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZU5hbWVzID0gT2JqZWN0LmtleXMocHJvcFZhbHVlKTtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlQ291bnQgPSBzdHlsZU5hbWVzLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc3R5bGVDb3VudDsgaisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVOYW1lID0gc3R5bGVOYW1lc1tqXTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdTdHlsZVZhbHVlID0gcHJvcFZhbHVlW3N0eWxlTmFtZV07XG4gICAgICAgICAgICAgICAgY29uc3Qgb2xkU3R5bGVWYWx1ZSA9IHByZXZpb3VzVmFsdWUgJiYgcHJldmlvdXNWYWx1ZVtzdHlsZU5hbWVdO1xuICAgICAgICAgICAgICAgIGlmIChuZXdTdHlsZVZhbHVlID09PSBvbGRTdHlsZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKG5ld1N0eWxlVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tTdHlsZVZhbHVlKG5ld1N0eWxlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uT3B0aW9ucy5zdHlsZUFwcGx5ZXIoZG9tTm9kZSwgc3R5bGVOYW1lLCBuZXdTdHlsZVZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb25PcHRpb25zLnN0eWxlQXBwbHllcihkb21Ob2RlLCBzdHlsZU5hbWUsICcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXByb3BWYWx1ZSAmJiB0eXBlb2YgcHJldmlvdXNWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBwcm9wVmFsdWUgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ3ZhbHVlJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvbVZhbHVlID0gZG9tTm9kZVtwcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKGRvbVZhbHVlICE9PSBwcm9wVmFsdWUgJiZcbiAgICAgICAgICAgICAgICAgICAgKGRvbU5vZGVbJ29uaW5wdXQtdmFsdWUnXVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBkb21WYWx1ZSA9PT0gZG9tTm9kZVsnb25pbnB1dC12YWx1ZSddXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHByb3BWYWx1ZSAhPT0gcHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tTm9kZVtwcm9wTmFtZV0gPSBwcm9wVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGRvbU5vZGVbJ29uaW5wdXQtdmFsdWUnXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByb3BWYWx1ZSAhPT0gcHJldmlvdXNWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocHJvcE5hbWUgIT09ICdrZXknICYmIHByb3BWYWx1ZSAhPT0gcHJldmlvdXNWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgcHJvcFZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnZnVuY3Rpb24nICYmIHByb3BOYW1lLmxhc3RJbmRleE9mKCdvbicsIDApID09PSAwICYmIGluY2x1ZGVzRXZlbnRzQW5kQXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVFdmVudChkb21Ob2RlLCBwcm9wTmFtZS5zdWJzdHIoMiksIHByb3BWYWx1ZSwgcHJvamVjdGlvbk9wdGlvbnMsIHByb3BlcnRpZXMuYmluZCwgcHJldmlvdXNWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHByb3BOYW1lICE9PSAnaW5uZXJIVE1MJyAmJiBpbmNsdWRlc0V2ZW50c0FuZEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQXR0cmlidXRlKGRvbU5vZGUsIHByb3BOYW1lLCBwcm9wVmFsdWUsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvcE5hbWUgPT09ICdzY3JvbGxMZWZ0JyB8fCBwcm9wTmFtZSA9PT0gJ3Njcm9sbFRvcCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbU5vZGVbcHJvcE5hbWVdICE9PSBwcm9wVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbU5vZGVbcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkb21Ob2RlW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvcGVydGllc1VwZGF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9wZXJ0aWVzVXBkYXRlZDtcbn1cbmZ1bmN0aW9uIGZpbmRJbmRleE9mQ2hpbGQoY2hpbGRyZW4sIHNhbWVBcywgc3RhcnQpIHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2FtZShjaGlsZHJlbltpXSwgc2FtZUFzKSkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvUGFyZW50Vk5vZGUoZG9tTm9kZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHRhZzogJycsXG4gICAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgICBjaGlsZHJlbjogdW5kZWZpbmVkLFxuICAgICAgICBkb21Ob2RlLFxuICAgICAgICB0eXBlOiBWTk9ERVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gdG9UZXh0Vk5vZGUoZGF0YSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHRhZzogJycsXG4gICAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgICBjaGlsZHJlbjogdW5kZWZpbmVkLFxuICAgICAgICB0ZXh0OiBgJHtkYXRhfWAsXG4gICAgICAgIGRvbU5vZGU6IHVuZGVmaW5lZCxcbiAgICAgICAgdHlwZTogVk5PREVcbiAgICB9O1xufVxuZnVuY3Rpb24gdG9JbnRlcm5hbFdOb2RlKGluc3RhbmNlLCBpbnN0YW5jZURhdGEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgcmVuZGVyZWQ6IFtdLFxuICAgICAgICBjb3JlUHJvcGVydGllczogaW5zdGFuY2VEYXRhLmNvcmVQcm9wZXJ0aWVzLFxuICAgICAgICBjaGlsZHJlbjogaW5zdGFuY2UuY2hpbGRyZW4sXG4gICAgICAgIHdpZGdldENvbnN0cnVjdG9yOiBpbnN0YW5jZS5jb25zdHJ1Y3RvcixcbiAgICAgICAgcHJvcGVydGllczogaW5zdGFuY2VEYXRhLmlucHV0UHJvcGVydGllcyxcbiAgICAgICAgdHlwZTogV05PREVcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlckFuZERlY29yYXRlQ2hpbGRyZW4oY2hpbGRyZW4sIGluc3RhbmNlKSB7XG4gICAgaWYgKGNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGVtcHR5QXJyYXk7XG4gICAgfVxuICAgIGNoaWxkcmVuID0gQXJyYXkuaXNBcnJheShjaGlsZHJlbikgPyBjaGlsZHJlbiA6IFtjaGlsZHJlbl07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7KSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgIGlmIChjaGlsZCA9PT0gdW5kZWZpbmVkIHx8IGNoaWxkID09PSBudWxsKSB7XG4gICAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjaGlsZHJlbltpXSA9IHRvVGV4dFZOb2RlKGNoaWxkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpc1ZOb2RlKGNoaWxkKSkge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5wcm9wZXJ0aWVzLmJpbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZC5wcm9wZXJ0aWVzLmJpbmQgPSBpbnN0YW5jZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuICYmIGNoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlckFuZERlY29yYXRlQ2hpbGRyZW4oY2hpbGQuY2hpbGRyZW4sIGluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghY2hpbGQuY29yZVByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuY29yZVByb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiaW5kOiBpbnN0YW5jZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VSZWdpc3RyeTogaW5zdGFuY2VEYXRhLmNvcmVQcm9wZXJ0aWVzLmJhc2VSZWdpc3RyeVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuY2hpbGRyZW4gJiYgY2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJBbmREZWNvcmF0ZUNoaWxkcmVuKGNoaWxkLmNoaWxkcmVuLCBpbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGkrKztcbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xufVxuZnVuY3Rpb24gbm9kZUFkZGVkKGRub2RlLCB0cmFuc2l0aW9ucykge1xuICAgIGlmIChpc1ZOb2RlKGRub2RlKSAmJiBkbm9kZS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgIGNvbnN0IGVudGVyQW5pbWF0aW9uID0gZG5vZGUucHJvcGVydGllcy5lbnRlckFuaW1hdGlvbjtcbiAgICAgICAgaWYgKGVudGVyQW5pbWF0aW9uKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVudGVyQW5pbWF0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgZW50ZXJBbmltYXRpb24oZG5vZGUuZG9tTm9kZSwgZG5vZGUucHJvcGVydGllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9ucy5lbnRlcihkbm9kZS5kb21Ob2RlLCBkbm9kZS5wcm9wZXJ0aWVzLCBlbnRlckFuaW1hdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBub2RlVG9SZW1vdmUoZG5vZGUsIHRyYW5zaXRpb25zLCBwcm9qZWN0aW9uT3B0aW9ucykge1xuICAgIGlmIChpc1dOb2RlKGRub2RlKSkge1xuICAgICAgICBjb25zdCBpdGVtID0gaW5zdGFuY2VNYXAuZ2V0KGRub2RlLmluc3RhbmNlKTtcbiAgICAgICAgY29uc3QgcmVuZGVyZWQgPSAoaXRlbSA/IGl0ZW0uZG5vZGUucmVuZGVyZWQgOiBkbm9kZS5yZW5kZXJlZCkgfHwgZW1wdHlBcnJheTtcbiAgICAgICAgaWYgKGRub2RlLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQoZG5vZGUuaW5zdGFuY2UpO1xuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLm9uRGV0YWNoKCk7XG4gICAgICAgICAgICBpbnN0YW5jZU1hcC5kZWxldGUoZG5vZGUuaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVuZGVyZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG5vZGVUb1JlbW92ZShyZW5kZXJlZFtpXSwgdHJhbnNpdGlvbnMsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgZG9tTm9kZSA9IGRub2RlLmRvbU5vZGU7XG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBkbm9kZS5wcm9wZXJ0aWVzO1xuICAgICAgICBpZiAoZG5vZGUuY2hpbGRyZW4gJiYgZG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIG5vZGVUb1JlbW92ZShkbm9kZS5jaGlsZHJlbltpXSwgdHJhbnNpdGlvbnMsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleGl0QW5pbWF0aW9uID0gcHJvcGVydGllcy5leGl0QW5pbWF0aW9uO1xuICAgICAgICBpZiAocHJvcGVydGllcyAmJiBleGl0QW5pbWF0aW9uKSB7XG4gICAgICAgICAgICBkb21Ob2RlLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgICAgICAgICBjb25zdCByZW1vdmVEb21Ob2RlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGRvbU5vZGUgJiYgZG9tTm9kZS5wYXJlbnROb2RlICYmIGRvbU5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkb21Ob2RlKTtcbiAgICAgICAgICAgICAgICBkbm9kZS5kb21Ob2RlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXhpdEFuaW1hdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGV4aXRBbmltYXRpb24oZG9tTm9kZSwgcmVtb3ZlRG9tTm9kZSwgcHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbnMuZXhpdChkbm9kZS5kb21Ob2RlLCBwcm9wZXJ0aWVzLCBleGl0QW5pbWF0aW9uLCByZW1vdmVEb21Ob2RlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZG9tTm9kZSAmJiBkb21Ob2RlLnBhcmVudE5vZGUgJiYgZG9tTm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRvbU5vZGUpO1xuICAgICAgICBkbm9kZS5kb21Ob2RlID0gdW5kZWZpbmVkO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNoZWNrRGlzdGluZ3Vpc2hhYmxlKGNoaWxkTm9kZXMsIGluZGV4VG9DaGVjaywgcGFyZW50SW5zdGFuY2UpIHtcbiAgICBjb25zdCBjaGlsZE5vZGUgPSBjaGlsZE5vZGVzW2luZGV4VG9DaGVja107XG4gICAgaWYgKGlzVk5vZGUoY2hpbGROb2RlKSAmJiAhY2hpbGROb2RlLnRhZykge1xuICAgICAgICByZXR1cm47IC8vIFRleHQgbm9kZXMgbmVlZCBub3QgYmUgZGlzdGluZ3Vpc2hhYmxlXG4gICAgfVxuICAgIGNvbnN0IHsga2V5IH0gPSBjaGlsZE5vZGUucHJvcGVydGllcztcbiAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwga2V5ID09PSBudWxsKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGkgIT09IGluZGV4VG9DaGVjaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjaGlsZE5vZGVzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChzYW1lKG5vZGUsIGNoaWxkTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVJZGVudGlmaWVyO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnROYW1lID0gcGFyZW50SW5zdGFuY2UuY29uc3RydWN0b3IubmFtZSB8fCAndW5rbm93bic7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1dOb2RlKGNoaWxkTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVJZGVudGlmaWVyID0gY2hpbGROb2RlLndpZGdldENvbnN0cnVjdG9yLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUlkZW50aWZpZXIgPSBjaGlsZE5vZGUudGFnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgQSB3aWRnZXQgKCR7cGFyZW50TmFtZX0pIGhhcyBoYWQgYSBjaGlsZCBhZGRkZWQgb3IgcmVtb3ZlZCwgYnV0IHRoZXkgd2VyZSBub3QgYWJsZSB0byB1bmlxdWVseSBpZGVudGlmaWVkLiBJdCBpcyByZWNvbW1lbmRlZCB0byBwcm92aWRlIGEgdW5pcXVlICdrZXknIHByb3BlcnR5IHdoZW4gdXNpbmcgdGhlIHNhbWUgd2lkZ2V0IG9yIGVsZW1lbnQgKCR7bm9kZUlkZW50aWZpZXJ9KSBtdWx0aXBsZSB0aW1lcyBhcyBzaWJsaW5nc2ApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB1cGRhdGVDaGlsZHJlbihwYXJlbnRWTm9kZSwgc2libGluZ3MsIG9sZENoaWxkcmVuLCBuZXdDaGlsZHJlbiwgcGFyZW50SW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKSB7XG4gICAgb2xkQ2hpbGRyZW4gPSBvbGRDaGlsZHJlbiB8fCBlbXB0eUFycmF5O1xuICAgIG5ld0NoaWxkcmVuID0gbmV3Q2hpbGRyZW47XG4gICAgY29uc3Qgb2xkQ2hpbGRyZW5MZW5ndGggPSBvbGRDaGlsZHJlbi5sZW5ndGg7XG4gICAgY29uc3QgbmV3Q2hpbGRyZW5MZW5ndGggPSBuZXdDaGlsZHJlbi5sZW5ndGg7XG4gICAgY29uc3QgdHJhbnNpdGlvbnMgPSBwcm9qZWN0aW9uT3B0aW9ucy50cmFuc2l0aW9ucztcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XG4gICAgcHJvamVjdGlvbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9qZWN0aW9uT3B0aW9ucywgeyBkZXB0aDogcHJvamVjdGlvbk9wdGlvbnMuZGVwdGggKyAxIH0pO1xuICAgIGxldCBvbGRJbmRleCA9IDA7XG4gICAgbGV0IG5ld0luZGV4ID0gMDtcbiAgICBsZXQgaTtcbiAgICBsZXQgdGV4dFVwZGF0ZWQgPSBmYWxzZTtcbiAgICB3aGlsZSAobmV3SW5kZXggPCBuZXdDaGlsZHJlbkxlbmd0aCkge1xuICAgICAgICBsZXQgb2xkQ2hpbGQgPSBvbGRJbmRleCA8IG9sZENoaWxkcmVuTGVuZ3RoID8gb2xkQ2hpbGRyZW5bb2xkSW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBuZXdDaGlsZCA9IG5ld0NoaWxkcmVuW25ld0luZGV4XTtcbiAgICAgICAgaWYgKGlzVk5vZGUobmV3Q2hpbGQpICYmIHR5cGVvZiBuZXdDaGlsZC5kZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbmV3Q2hpbGQuaW5zZXJ0ZWQgPSBpc1ZOb2RlKG9sZENoaWxkKSAmJiBvbGRDaGlsZC5pbnNlcnRlZDtcbiAgICAgICAgICAgIGFkZERlZmVycmVkUHJvcGVydGllcyhuZXdDaGlsZCwgcHJvamVjdGlvbk9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvbGRDaGlsZCAhPT0gdW5kZWZpbmVkICYmIHNhbWUob2xkQ2hpbGQsIG5ld0NoaWxkKSkge1xuICAgICAgICAgICAgb2xkSW5kZXgrKztcbiAgICAgICAgICAgIG5ld0luZGV4Kys7XG4gICAgICAgICAgICB0ZXh0VXBkYXRlZCA9XG4gICAgICAgICAgICAgICAgdXBkYXRlRG9tKG9sZENoaWxkLCBuZXdDaGlsZCwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudFZOb2RlLCBwYXJlbnRJbnN0YW5jZSwgb2xkQ2hpbGRyZW4uc2xpY2Uob2xkSW5kZXgpLCBuZXdDaGlsZHJlbi5zbGljZShuZXdJbmRleCkpIHx8IHRleHRVcGRhdGVkO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmluZE9sZEluZGV4ID0gZmluZEluZGV4T2ZDaGlsZChvbGRDaGlsZHJlbiwgbmV3Q2hpbGQsIG9sZEluZGV4ICsgMSk7XG4gICAgICAgIGNvbnN0IGFkZENoaWxkID0gKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGluc2VydEJlZm9yZURvbU5vZGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBsZXQgY2hpbGRyZW5BcnJheSA9IG9sZENoaWxkcmVuO1xuICAgICAgICAgICAgbGV0IG5leHRJbmRleCA9IG9sZEluZGV4ICsgMTtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IG9sZENoaWxkcmVuW29sZEluZGV4XTtcbiAgICAgICAgICAgIGlmICghY2hpbGQpIHtcbiAgICAgICAgICAgICAgICBjaGlsZCA9IHNpYmxpbmdzWzBdO1xuICAgICAgICAgICAgICAgIG5leHRJbmRleCA9IDE7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW5BcnJheSA9IHNpYmxpbmdzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgbGV0IGluc2VydEJlZm9yZUNoaWxkcmVuID0gW2NoaWxkXTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoaW5zZXJ0QmVmb3JlQ2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc2VydEJlZm9yZSA9IGluc2VydEJlZm9yZUNoaWxkcmVuLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1dOb2RlKGluc2VydEJlZm9yZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBpbnN0YW5jZU1hcC5nZXQoaW5zZXJ0QmVmb3JlLmluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtICYmIGl0ZW0uZG5vZGUucmVuZGVyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRCZWZvcmVDaGlsZHJlbi5wdXNoKC4uLml0ZW0uZG5vZGUucmVuZGVyZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydEJlZm9yZS5kb21Ob2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydEJlZm9yZS5kb21Ob2RlLnBhcmVudEVsZW1lbnQgIT09IHBhcmVudFZOb2RlLmRvbU5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEJlZm9yZURvbU5vZGUgPSBpbnNlcnRCZWZvcmUuZG9tTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlQ2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIGNoaWxkcmVuQXJyYXlbbmV4dEluZGV4XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ2hpbGRyZW4ucHVzaChjaGlsZHJlbkFycmF5W25leHRJbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjcmVhdGVEb20obmV3Q2hpbGQsIHBhcmVudFZOb2RlLCBuZXdDaGlsZHJlbi5zbGljZShuZXdJbmRleCArIDEpLCBpbnNlcnRCZWZvcmVEb21Ob2RlLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UpO1xuICAgICAgICAgICAgbm9kZUFkZGVkKG5ld0NoaWxkLCB0cmFuc2l0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBpbmRleFRvQ2hlY2sgPSBuZXdJbmRleDtcbiAgICAgICAgICAgIHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNoZWNrRGlzdGluZ3Vpc2hhYmxlKG5ld0NoaWxkcmVuLCBpbmRleFRvQ2hlY2ssIHBhcmVudEluc3RhbmNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoIW9sZENoaWxkIHx8IGZpbmRPbGRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGFkZENoaWxkKCk7XG4gICAgICAgICAgICBuZXdJbmRleCsrO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVtb3ZlQ2hpbGQgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleFRvQ2hlY2sgPSBvbGRJbmRleDtcbiAgICAgICAgICAgIHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNoZWNrRGlzdGluZ3Vpc2hhYmxlKG9sZENoaWxkcmVuLCBpbmRleFRvQ2hlY2ssIHBhcmVudEluc3RhbmNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGlzV05vZGUob2xkQ2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGluc3RhbmNlTWFwLmdldChvbGRDaGlsZC5pbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgb2xkQ2hpbGQgPSBpdGVtLmRub2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGVUb1JlbW92ZShvbGRDaGlsZCwgdHJhbnNpdGlvbnMsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZmluZE5ld0luZGV4ID0gZmluZEluZGV4T2ZDaGlsZChuZXdDaGlsZHJlbiwgb2xkQ2hpbGQsIG5ld0luZGV4ICsgMSk7XG4gICAgICAgIGlmIChmaW5kTmV3SW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZW1vdmVDaGlsZCgpO1xuICAgICAgICAgICAgb2xkSW5kZXgrKztcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGFkZENoaWxkKCk7XG4gICAgICAgIHJlbW92ZUNoaWxkKCk7XG4gICAgICAgIG9sZEluZGV4Kys7XG4gICAgICAgIG5ld0luZGV4Kys7XG4gICAgfVxuICAgIGlmIChvbGRDaGlsZHJlbkxlbmd0aCA+IG9sZEluZGV4KSB7XG4gICAgICAgIC8vIFJlbW92ZSBjaGlsZCBmcmFnbWVudHNcbiAgICAgICAgZm9yIChpID0gb2xkSW5kZXg7IGkgPCBvbGRDaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleFRvQ2hlY2sgPSBpO1xuICAgICAgICAgICAgcHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2hlY2tEaXN0aW5ndWlzaGFibGUob2xkQ2hpbGRyZW4sIGluZGV4VG9DaGVjaywgcGFyZW50SW5zdGFuY2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZXQgY2hpbGRUb1JlbW92ZSA9IG9sZENoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKGlzV05vZGUoY2hpbGRUb1JlbW92ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gaW5zdGFuY2VNYXAuZ2V0KGNoaWxkVG9SZW1vdmUuaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkVG9SZW1vdmUgPSBpdGVtLmRub2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGVUb1JlbW92ZShjaGlsZFRvUmVtb3ZlLCB0cmFuc2l0aW9ucywgcHJvamVjdGlvbk9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0ZXh0VXBkYXRlZDtcbn1cbmZ1bmN0aW9uIGFkZENoaWxkcmVuKHBhcmVudFZOb2RlLCBjaGlsZHJlbiwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudEluc3RhbmNlLCBpbnNlcnRCZWZvcmUgPSB1bmRlZmluZWQsIGNoaWxkTm9kZXMpIHtcbiAgICBpZiAoY2hpbGRyZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcbiAgICBpZiAocHJvamVjdG9yU3RhdGUubWVyZ2UgJiYgY2hpbGROb2RlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNoaWxkTm9kZXMgPSBhcnJheUZyb20ocGFyZW50Vk5vZGUuZG9tTm9kZS5jaGlsZE5vZGVzKTtcbiAgICB9XG4gICAgY29uc3QgdHJhbnNpdGlvbnMgPSBwcm9qZWN0aW9uT3B0aW9ucy50cmFuc2l0aW9ucztcbiAgICBwcm9qZWN0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHByb2plY3Rpb25PcHRpb25zLCB7IGRlcHRoOiBwcm9qZWN0aW9uT3B0aW9ucy5kZXB0aCArIDEgfSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICBjb25zdCBuZXh0U2libGluZ3MgPSBjaGlsZHJlbi5zbGljZShpICsgMSk7XG4gICAgICAgIGlmIChpc1ZOb2RlKGNoaWxkKSkge1xuICAgICAgICAgICAgaWYgKHByb2plY3RvclN0YXRlLm1lcmdlICYmIGNoaWxkTm9kZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgZG9tRWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoY2hpbGQuZG9tTm9kZSA9PT0gdW5kZWZpbmVkICYmIGNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50ID0gY2hpbGROb2Rlcy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG9tRWxlbWVudCAmJiBkb21FbGVtZW50LnRhZ05hbWUgPT09IChjaGlsZC50YWcudG9VcHBlckNhc2UoKSB8fCB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5kb21Ob2RlID0gZG9tRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNyZWF0ZURvbShjaGlsZCwgcGFyZW50Vk5vZGUsIG5leHRTaWJsaW5ncywgaW5zZXJ0QmVmb3JlLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY3JlYXRlRG9tKGNoaWxkLCBwYXJlbnRWTm9kZSwgbmV4dFNpYmxpbmdzLCBpbnNlcnRCZWZvcmUsIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRJbnN0YW5jZSwgY2hpbGROb2Rlcyk7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZUFkZGVkKGNoaWxkLCB0cmFuc2l0aW9ucyk7XG4gICAgfVxufVxuZnVuY3Rpb24gaW5pdFByb3BlcnRpZXNBbmRDaGlsZHJlbihkb21Ob2RlLCBkbm9kZSwgcGFyZW50SW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKSB7XG4gICAgYWRkQ2hpbGRyZW4oZG5vZGUsIGRub2RlLmNoaWxkcmVuLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UsIHVuZGVmaW5lZCk7XG4gICAgaWYgKHR5cGVvZiBkbm9kZS5kZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyAmJiBkbm9kZS5pbnNlcnRlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFkZERlZmVycmVkUHJvcGVydGllcyhkbm9kZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoZG5vZGUuYXR0cmlidXRlcyAmJiBkbm9kZS5ldmVudHMpIHtcbiAgICAgICAgdXBkYXRlQXR0cmlidXRlcyhkb21Ob2RlLCB7fSwgZG5vZGUuYXR0cmlidXRlcywgcHJvamVjdGlvbk9wdGlvbnMpO1xuICAgICAgICB1cGRhdGVQcm9wZXJ0aWVzKGRvbU5vZGUsIHt9LCBkbm9kZS5wcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucywgZmFsc2UpO1xuICAgICAgICByZW1vdmVPcnBoYW5lZEV2ZW50cyhkb21Ob2RlLCB7fSwgZG5vZGUuZXZlbnRzLCBwcm9qZWN0aW9uT3B0aW9ucywgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IGV2ZW50cyA9IGRub2RlLmV2ZW50cztcbiAgICAgICAgT2JqZWN0LmtleXMoZXZlbnRzKS5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgICAgICAgdXBkYXRlRXZlbnQoZG9tTm9kZSwgZXZlbnQsIGV2ZW50c1tldmVudF0sIHByb2plY3Rpb25PcHRpb25zLCBkbm9kZS5wcm9wZXJ0aWVzLmJpbmQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHVwZGF0ZVByb3BlcnRpZXMoZG9tTm9kZSwge30sIGRub2RlLnByb3BlcnRpZXMsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKGRub2RlLnByb3BlcnRpZXMua2V5ICE9PSBudWxsICYmIGRub2RlLnByb3BlcnRpZXMua2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHBhcmVudEluc3RhbmNlKTtcbiAgICAgICAgaW5zdGFuY2VEYXRhLm5vZGVIYW5kbGVyLmFkZChkb21Ob2RlLCBgJHtkbm9kZS5wcm9wZXJ0aWVzLmtleX1gKTtcbiAgICB9XG4gICAgZG5vZGUuaW5zZXJ0ZWQgPSB0cnVlO1xufVxuZnVuY3Rpb24gY3JlYXRlRG9tKGRub2RlLCBwYXJlbnRWTm9kZSwgbmV4dFNpYmxpbmdzLCBpbnNlcnRCZWZvcmUsIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRJbnN0YW5jZSwgY2hpbGROb2Rlcykge1xuICAgIGxldCBkb21Ob2RlO1xuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcbiAgICBpZiAoaXNXTm9kZShkbm9kZSkpIHtcbiAgICAgICAgbGV0IHsgd2lkZ2V0Q29uc3RydWN0b3IgfSA9IGRub2RlO1xuICAgICAgICBjb25zdCBwYXJlbnRJbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQocGFyZW50SW5zdGFuY2UpO1xuICAgICAgICBpZiAoIWlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yKHdpZGdldENvbnN0cnVjdG9yKSkge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHBhcmVudEluc3RhbmNlRGF0YS5yZWdpc3RyeSgpLmdldCh3aWRnZXRDb25zdHJ1Y3Rvcik7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdpZGdldENvbnN0cnVjdG9yID0gaXRlbTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyB3aWRnZXRDb25zdHJ1Y3RvcigpO1xuICAgICAgICBkbm9kZS5pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICBuZXh0U2libGluZ01hcC5zZXQoaW5zdGFuY2UsIG5leHRTaWJsaW5ncyk7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldChpbnN0YW5jZSk7XG4gICAgICAgIGluc3RhbmNlRGF0YS5pbnZhbGlkYXRlID0gKCkgPT4ge1xuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZURhdGEucmVuZGVyaW5nID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHByb2plY3RvclN0YXRlLnJlbmRlclF1ZXVlLnB1c2goeyBpbnN0YW5jZSwgZGVwdGg6IHByb2plY3Rpb25PcHRpb25zLmRlcHRoIH0pO1xuICAgICAgICAgICAgICAgIHNjaGVkdWxlUmVuZGVyKHByb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9IHRydWU7XG4gICAgICAgIGluc3RhbmNlLl9fc2V0Q29yZVByb3BlcnRpZXNfXyhkbm9kZS5jb3JlUHJvcGVydGllcyk7XG4gICAgICAgIGluc3RhbmNlLl9fc2V0Q2hpbGRyZW5fXyhkbm9kZS5jaGlsZHJlbik7XG4gICAgICAgIGluc3RhbmNlLl9fc2V0UHJvcGVydGllc19fKGRub2RlLnByb3BlcnRpZXMpO1xuICAgICAgICBjb25zdCByZW5kZXJlZCA9IGluc3RhbmNlLl9fcmVuZGVyX18oKTtcbiAgICAgICAgaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9IGZhbHNlO1xuICAgICAgICBpZiAocmVuZGVyZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkUmVuZGVyZWQgPSBmaWx0ZXJBbmREZWNvcmF0ZUNoaWxkcmVuKHJlbmRlcmVkLCBpbnN0YW5jZSk7XG4gICAgICAgICAgICBkbm9kZS5yZW5kZXJlZCA9IGZpbHRlcmVkUmVuZGVyZWQ7XG4gICAgICAgICAgICBhZGRDaGlsZHJlbihwYXJlbnRWTm9kZSwgZmlsdGVyZWRSZW5kZXJlZCwgcHJvamVjdGlvbk9wdGlvbnMsIGluc3RhbmNlLCBpbnNlcnRCZWZvcmUsIGNoaWxkTm9kZXMpO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlTWFwLnNldChpbnN0YW5jZSwgeyBkbm9kZSwgcGFyZW50Vk5vZGUgfSk7XG4gICAgICAgIGluc3RhbmNlRGF0YS5ub2RlSGFuZGxlci5hZGRSb290KCk7XG4gICAgICAgIHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLm9uQXR0YWNoKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKHByb2plY3RvclN0YXRlLm1lcmdlICYmIHByb2plY3RvclN0YXRlLm1lcmdlRWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkb21Ob2RlID0gZG5vZGUuZG9tTm9kZSA9IHByb2plY3Rpb25PcHRpb25zLm1lcmdlRWxlbWVudDtcbiAgICAgICAgICAgIHByb2plY3RvclN0YXRlLm1lcmdlRWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGluaXRQcm9wZXJ0aWVzQW5kQ2hpbGRyZW4oZG9tTm9kZSwgZG5vZGUsIHBhcmVudEluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9jID0gcGFyZW50Vk5vZGUuZG9tTm9kZS5vd25lckRvY3VtZW50O1xuICAgICAgICBpZiAoIWRub2RlLnRhZyAmJiB0eXBlb2YgZG5vZGUudGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChkbm9kZS5kb21Ob2RlICE9PSB1bmRlZmluZWQgJiYgcGFyZW50Vk5vZGUuZG9tTm9kZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0RvbU5vZGUgPSBkbm9kZS5kb21Ob2RlLm93bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZG5vZGUudGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudFZOb2RlLmRvbU5vZGUgPT09IGRub2RlLmRvbU5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRWTm9kZS5kb21Ob2RlLnJlcGxhY2VDaGlsZChuZXdEb21Ob2RlLCBkbm9kZS5kb21Ob2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFZOb2RlLmRvbU5vZGUuYXBwZW5kQ2hpbGQobmV3RG9tTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGRub2RlLmRvbU5vZGUucGFyZW50Tm9kZSAmJiBkbm9kZS5kb21Ob2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZG5vZGUuZG9tTm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRub2RlLmRvbU5vZGUgPSBuZXdEb21Ob2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZG9tTm9kZSA9IGRub2RlLmRvbU5vZGUgPSBkb2MuY3JlYXRlVGV4dE5vZGUoZG5vZGUudGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKGluc2VydEJlZm9yZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFZOb2RlLmRvbU5vZGUuaW5zZXJ0QmVmb3JlKGRvbU5vZGUsIGluc2VydEJlZm9yZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRWTm9kZS5kb21Ob2RlLmFwcGVuZENoaWxkKGRvbU5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkbm9kZS5kb21Ob2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZG5vZGUudGFnID09PSAnc3ZnJykge1xuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHByb2plY3Rpb25PcHRpb25zLCB7IG5hbWVzcGFjZTogTkFNRVNQQUNFX1NWRyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByb2plY3Rpb25PcHRpb25zLm5hbWVzcGFjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhwcm9qZWN0aW9uT3B0aW9ucy5uYW1lc3BhY2UsIGRub2RlLnRhZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkb21Ob2RlID0gZG5vZGUuZG9tTm9kZSA9IGRub2RlLmRvbU5vZGUgfHwgZG9jLmNyZWF0ZUVsZW1lbnQoZG5vZGUudGFnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb21Ob2RlID0gZG5vZGUuZG9tTm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluaXRQcm9wZXJ0aWVzQW5kQ2hpbGRyZW4oZG9tTm9kZSwgZG5vZGUsIHBhcmVudEluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRWTm9kZS5kb21Ob2RlLmluc2VydEJlZm9yZShkb21Ob2RlLCBpbnNlcnRCZWZvcmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZG9tTm9kZS5wYXJlbnROb2RlICE9PSBwYXJlbnRWTm9kZS5kb21Ob2RlKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50Vk5vZGUuZG9tTm9kZS5hcHBlbmRDaGlsZChkb21Ob2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHVwZGF0ZURvbShwcmV2aW91cywgZG5vZGUsIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRWTm9kZSwgcGFyZW50SW5zdGFuY2UsIG9sZE5leHRTaWJsaW5ncywgbmV4dFNpYmxpbmdzKSB7XG4gICAgaWYgKGlzV05vZGUoZG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IHsgaW5zdGFuY2UgfSA9IHByZXZpb3VzO1xuICAgICAgICBjb25zdCB7IHBhcmVudFZOb2RlLCBkbm9kZTogbm9kZSB9ID0gaW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNSZW5kZXJlZCA9IG5vZGUgPyBub2RlLnJlbmRlcmVkIDogcHJldmlvdXMucmVuZGVyZWQ7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldChpbnN0YW5jZSk7XG4gICAgICAgIGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPSB0cnVlO1xuICAgICAgICBpbnN0YW5jZS5fX3NldENvcmVQcm9wZXJ0aWVzX18oZG5vZGUuY29yZVByb3BlcnRpZXMpO1xuICAgICAgICBpbnN0YW5jZS5fX3NldENoaWxkcmVuX18oZG5vZGUuY2hpbGRyZW4pO1xuICAgICAgICBpbnN0YW5jZS5fX3NldFByb3BlcnRpZXNfXyhkbm9kZS5wcm9wZXJ0aWVzKTtcbiAgICAgICAgbmV4dFNpYmxpbmdNYXAuc2V0KGluc3RhbmNlLCBuZXh0U2libGluZ3MpO1xuICAgICAgICBkbm9kZS5pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICBpZiAoaW5zdGFuY2VEYXRhLmRpcnR5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCByZW5kZXJlZCA9IGluc3RhbmNlLl9fcmVuZGVyX18oKTtcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGRub2RlLnJlbmRlcmVkID0gZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihyZW5kZXJlZCwgaW5zdGFuY2UpO1xuICAgICAgICAgICAgdXBkYXRlQ2hpbGRyZW4ocGFyZW50Vk5vZGUsIG9sZE5leHRTaWJsaW5ncywgcHJldmlvdXNSZW5kZXJlZCwgZG5vZGUucmVuZGVyZWQsIGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpbnN0YW5jZURhdGEucmVuZGVyaW5nID0gZmFsc2U7XG4gICAgICAgICAgICBkbm9kZS5yZW5kZXJlZCA9IHByZXZpb3VzUmVuZGVyZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaW5zdGFuY2VNYXAuc2V0KGluc3RhbmNlLCB7IGRub2RlLCBwYXJlbnRWTm9kZSB9KTtcbiAgICAgICAgaW5zdGFuY2VEYXRhLm5vZGVIYW5kbGVyLmFkZFJvb3QoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChwcmV2aW91cyA9PT0gZG5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb21Ob2RlID0gKGRub2RlLmRvbU5vZGUgPSBwcmV2aW91cy5kb21Ob2RlKTtcbiAgICAgICAgbGV0IHRleHRVcGRhdGVkID0gZmFsc2U7XG4gICAgICAgIGxldCB1cGRhdGVkID0gZmFsc2U7XG4gICAgICAgIGlmICghZG5vZGUudGFnICYmIHR5cGVvZiBkbm9kZS50ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKGRub2RlLnRleHQgIT09IHByZXZpb3VzLnRleHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdEb21Ob2RlID0gZG9tTm9kZS5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRub2RlLnRleHQpO1xuICAgICAgICAgICAgICAgIGRvbU5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobmV3RG9tTm9kZSwgZG9tTm9kZSk7XG4gICAgICAgICAgICAgICAgZG5vZGUuZG9tTm9kZSA9IG5ld0RvbU5vZGU7XG4gICAgICAgICAgICAgICAgdGV4dFVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0VXBkYXRlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkbm9kZS50YWcgJiYgZG5vZGUudGFnLmxhc3RJbmRleE9mKCdzdmcnLCAwKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHByb2plY3Rpb25PcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvamVjdGlvbk9wdGlvbnMsIHsgbmFtZXNwYWNlOiBOQU1FU1BBQ0VfU1ZHIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByZXZpb3VzLmNoaWxkcmVuICE9PSBkbm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihkbm9kZS5jaGlsZHJlbiwgcGFyZW50SW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIGRub2RlLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgICAgICAgICAgdXBkYXRlZCA9XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNoaWxkcmVuKGRub2RlLCBvbGROZXh0U2libGluZ3MsIHByZXZpb3VzLmNoaWxkcmVuLCBjaGlsZHJlbiwgcGFyZW50SW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKSB8fCB1cGRhdGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNQcm9wZXJ0aWVzID0gYnVpbGRQcmV2aW91c1Byb3BlcnRpZXMoZG9tTm9kZSwgcHJldmlvdXMsIGRub2RlKTtcbiAgICAgICAgICAgIGlmIChkbm9kZS5hdHRyaWJ1dGVzICYmIGRub2RlLmV2ZW50cykge1xuICAgICAgICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLmF0dHJpYnV0ZXMsIGRub2RlLmF0dHJpYnV0ZXMsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVkID1cbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlUHJvcGVydGllcyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMucHJvcGVydGllcywgZG5vZGUucHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMsIGZhbHNlKSB8fCB1cGRhdGVkO1xuICAgICAgICAgICAgICAgIHJlbW92ZU9ycGhhbmVkRXZlbnRzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcy5ldmVudHMsIGRub2RlLmV2ZW50cywgcHJvamVjdGlvbk9wdGlvbnMsIHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IGRub2RlLmV2ZW50cztcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhldmVudHMpLmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUV2ZW50KGRvbU5vZGUsIGV2ZW50LCBldmVudHNbZXZlbnRdLCBwcm9qZWN0aW9uT3B0aW9ucywgZG5vZGUucHJvcGVydGllcy5iaW5kLCBwcmV2aW91c1Byb3BlcnRpZXMuZXZlbnRzW2V2ZW50XSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVkID1cbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlUHJvcGVydGllcyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMucHJvcGVydGllcywgZG5vZGUucHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRub2RlLnByb3BlcnRpZXMua2V5ICE9PSBudWxsICYmIGRub2RlLnByb3BlcnRpZXMua2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQocGFyZW50SW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIGluc3RhbmNlRGF0YS5ub2RlSGFuZGxlci5hZGQoZG9tTm9kZSwgYCR7ZG5vZGUucHJvcGVydGllcy5rZXl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWQgJiYgZG5vZGUucHJvcGVydGllcyAmJiBkbm9kZS5wcm9wZXJ0aWVzLnVwZGF0ZUFuaW1hdGlvbikge1xuICAgICAgICAgICAgZG5vZGUucHJvcGVydGllcy51cGRhdGVBbmltYXRpb24oZG9tTm9kZSwgZG5vZGUucHJvcGVydGllcywgcHJldmlvdXMucHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBhZGREZWZlcnJlZFByb3BlcnRpZXModm5vZGUsIHByb2plY3Rpb25PcHRpb25zKSB7XG4gICAgLy8gdHJhbnNmZXIgYW55IHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gcGFzc2VkIC0gYXMgdGhlc2UgbXVzdCBiZSBkZWNvcmF0ZWQgcHJvcGVydGllc1xuICAgIHZub2RlLmRlY29yYXRlZERlZmVycmVkUHJvcGVydGllcyA9IHZub2RlLnByb3BlcnRpZXM7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHZub2RlLmRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrKCEhdm5vZGUuaW5zZXJ0ZWQpO1xuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcbiAgICB2bm9kZS5wcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvcGVydGllcywgdm5vZGUuZGVjb3JhdGVkRGVmZXJyZWRQcm9wZXJ0aWVzKTtcbiAgICBwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oe30sIHZub2RlLmRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrKCEhdm5vZGUuaW5zZXJ0ZWQpLCB2bm9kZS5kZWNvcmF0ZWREZWZlcnJlZFByb3BlcnRpZXMpO1xuICAgICAgICB1cGRhdGVQcm9wZXJ0aWVzKHZub2RlLmRvbU5vZGUsIHZub2RlLnByb3BlcnRpZXMsIHByb3BlcnRpZXMsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgdm5vZGUucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBydW5EZWZlcnJlZFJlbmRlckNhbGxiYWNrcyhwcm9qZWN0aW9uT3B0aW9ucykge1xuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcbiAgICBpZiAocHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgIGlmIChwcm9qZWN0aW9uT3B0aW9ucy5zeW5jKSB7XG4gICAgICAgICAgICB3aGlsZSAocHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBnbG9iYWwucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICB3aGlsZSAocHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gcHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHJ1bkFmdGVyUmVuZGVyQ2FsbGJhY2tzKHByb2plY3Rpb25PcHRpb25zKSB7XG4gICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xuICAgIGlmIChwcm9qZWN0aW9uT3B0aW9ucy5zeW5jKSB7XG4gICAgICAgIHdoaWxlIChwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gcHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3Muc2hpZnQoKTtcbiAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChnbG9iYWwucmVxdWVzdElkbGVDYWxsYmFjaykge1xuICAgICAgICAgICAgZ2xvYmFsLnJlcXVlc3RJZGxlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgIHdoaWxlIChwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBzY2hlZHVsZVJlbmRlcihwcm9qZWN0aW9uT3B0aW9ucykge1xuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcbiAgICBpZiAocHJvamVjdGlvbk9wdGlvbnMuc3luYykge1xuICAgICAgICByZW5kZXIocHJvamVjdGlvbk9wdGlvbnMpO1xuICAgIH1cbiAgICBlbHNlIGlmIChwcm9qZWN0b3JTdGF0ZS5yZW5kZXJTY2hlZHVsZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9qZWN0b3JTdGF0ZS5yZW5kZXJTY2hlZHVsZWQgPSBnbG9iYWwucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIHJlbmRlcihwcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlbmRlcihwcm9qZWN0aW9uT3B0aW9ucykge1xuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcbiAgICBwcm9qZWN0b3JTdGF0ZS5yZW5kZXJTY2hlZHVsZWQgPSB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVuZGVyUXVldWUgPSBwcm9qZWN0b3JTdGF0ZS5yZW5kZXJRdWV1ZTtcbiAgICBjb25zdCByZW5kZXJzID0gWy4uLnJlbmRlclF1ZXVlXTtcbiAgICBwcm9qZWN0b3JTdGF0ZS5yZW5kZXJRdWV1ZSA9IFtdO1xuICAgIHJlbmRlcnMuc29ydCgoYSwgYikgPT4gYS5kZXB0aCAtIGIuZGVwdGgpO1xuICAgIGNvbnN0IHByZXZpb3VzbHlSZW5kZXJlZCA9IFtdO1xuICAgIHdoaWxlIChyZW5kZXJzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCB7IGluc3RhbmNlIH0gPSByZW5kZXJzLnNoaWZ0KCk7XG4gICAgICAgIGlmIChpbnN0YW5jZU1hcC5oYXMoaW5zdGFuY2UpICYmIHByZXZpb3VzbHlSZW5kZXJlZC5pbmRleE9mKGluc3RhbmNlKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHByZXZpb3VzbHlSZW5kZXJlZC5wdXNoKGluc3RhbmNlKTtcbiAgICAgICAgICAgIGNvbnN0IHsgcGFyZW50Vk5vZGUsIGRub2RlIH0gPSBpbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpO1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgICAgIGNvbnN0IG5leHRTaWJsaW5ncyA9IG5leHRTaWJsaW5nTWFwLmdldChpbnN0YW5jZSk7XG4gICAgICAgICAgICB1cGRhdGVEb20oZG5vZGUsIHRvSW50ZXJuYWxXTm9kZShpbnN0YW5jZSwgaW5zdGFuY2VEYXRhKSwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudFZOb2RlLCBpbnN0YW5jZSwgbmV4dFNpYmxpbmdzLCBuZXh0U2libGluZ3MpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJ1bkFmdGVyUmVuZGVyQ2FsbGJhY2tzKHByb2plY3Rpb25PcHRpb25zKTtcbiAgICBydW5EZWZlcnJlZFJlbmRlckNhbGxiYWNrcyhwcm9qZWN0aW9uT3B0aW9ucyk7XG59XG5leHBvcnQgY29uc3QgZG9tID0ge1xuICAgIGFwcGVuZDogZnVuY3Rpb24gKHBhcmVudE5vZGUsIGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldChpbnN0YW5jZSk7XG4gICAgICAgIGNvbnN0IGZpbmFsUHJvamVjdG9yT3B0aW9ucyA9IGdldFByb2plY3Rpb25PcHRpb25zKHByb2plY3Rpb25PcHRpb25zLCBpbnN0YW5jZSk7XG4gICAgICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0ge1xuICAgICAgICAgICAgYWZ0ZXJSZW5kZXJDYWxsYmFja3M6IFtdLFxuICAgICAgICAgICAgZGVmZXJyZWRSZW5kZXJDYWxsYmFja3M6IFtdLFxuICAgICAgICAgICAgbm9kZU1hcDogbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgICAgIHJlbmRlclNjaGVkdWxlZDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcmVuZGVyUXVldWU6IFtdLFxuICAgICAgICAgICAgbWVyZ2U6IHByb2plY3Rpb25PcHRpb25zLm1lcmdlIHx8IGZhbHNlLFxuICAgICAgICAgICAgbWVyZ2VFbGVtZW50OiBwcm9qZWN0aW9uT3B0aW9ucy5tZXJnZUVsZW1lbnRcbiAgICAgICAgfTtcbiAgICAgICAgcHJvamVjdG9yU3RhdGVNYXAuc2V0KGluc3RhbmNlLCBwcm9qZWN0b3JTdGF0ZSk7XG4gICAgICAgIGZpbmFsUHJvamVjdG9yT3B0aW9ucy5yb290Tm9kZSA9IHBhcmVudE5vZGU7XG4gICAgICAgIGNvbnN0IHBhcmVudFZOb2RlID0gdG9QYXJlbnRWTm9kZShmaW5hbFByb2plY3Rvck9wdGlvbnMucm9vdE5vZGUpO1xuICAgICAgICBjb25zdCBub2RlID0gdG9JbnRlcm5hbFdOb2RlKGluc3RhbmNlLCBpbnN0YW5jZURhdGEpO1xuICAgICAgICBpbnN0YW5jZU1hcC5zZXQoaW5zdGFuY2UsIHsgZG5vZGU6IG5vZGUsIHBhcmVudFZOb2RlIH0pO1xuICAgICAgICBpbnN0YW5jZURhdGEuaW52YWxpZGF0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5kaXJ0eSA9IHRydWU7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBwcm9qZWN0b3JTdGF0ZS5yZW5kZXJRdWV1ZS5wdXNoKHsgaW5zdGFuY2UsIGRlcHRoOiBmaW5hbFByb2plY3Rvck9wdGlvbnMuZGVwdGggfSk7XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVSZW5kZXIoZmluYWxQcm9qZWN0b3JPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdXBkYXRlRG9tKG5vZGUsIG5vZGUsIGZpbmFsUHJvamVjdG9yT3B0aW9ucywgcGFyZW50Vk5vZGUsIGluc3RhbmNlLCBbXSwgW10pO1xuICAgICAgICBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5vbkF0dGFjaCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcnVuRGVmZXJyZWRSZW5kZXJDYWxsYmFja3MoZmluYWxQcm9qZWN0b3JPcHRpb25zKTtcbiAgICAgICAgcnVuQWZ0ZXJSZW5kZXJDYWxsYmFja3MoZmluYWxQcm9qZWN0b3JPcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbU5vZGU6IGZpbmFsUHJvamVjdG9yT3B0aW9ucy5yb290Tm9kZVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgY3JlYXRlOiBmdW5jdGlvbiAoaW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwgaW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKTtcbiAgICB9LFxuICAgIG1lcmdlOiBmdW5jdGlvbiAoZWxlbWVudCwgaW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zID0ge30pIHtcbiAgICAgICAgcHJvamVjdGlvbk9wdGlvbnMubWVyZ2UgPSB0cnVlO1xuICAgICAgICBwcm9qZWN0aW9uT3B0aW9ucy5tZXJnZUVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uID0gdGhpcy5hcHBlbmQoZWxlbWVudC5wYXJlbnROb2RlLCBpbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xuICAgICAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChpbnN0YW5jZSk7XG4gICAgICAgIHByb2plY3RvclN0YXRlLm1lcmdlID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBwcm9qZWN0aW9uO1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD12ZG9tLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvdmRvbS5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS92ZG9tLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCIvKioqIElNUE9SVFMgRlJPTSBpbXBvcnRzLWxvYWRlciAqKiovXG52YXIgd2lkZ2V0RmFjdG9yeSA9IHJlcXVpcmUoXCJzcmMvbWVudS9NZW51XCIpO1xuXG52YXIgcmVnaXN0ZXJDdXN0b21FbGVtZW50ID0gcmVxdWlyZSgnQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL3JlZ2lzdGVyQ3VzdG9tRWxlbWVudCcpLmRlZmF1bHQ7XG5cbnZhciBkZWZhdWx0RXhwb3J0ID0gd2lkZ2V0RmFjdG9yeS5kZWZhdWx0O1xuZGVmYXVsdEV4cG9ydCAmJiByZWdpc3RlckN1c3RvbUVsZW1lbnQoZGVmYXVsdEV4cG9ydCk7XG5cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2ltcG9ydHMtbG9hZGVyP3dpZGdldEZhY3Rvcnk9c3JjL21lbnUvTWVudSEuL25vZGVfbW9kdWxlcy9AZG9qby9jbGktYnVpbGQtd2lkZ2V0L3RlbXBsYXRlL2N1c3RvbS1lbGVtZW50LmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9pbXBvcnRzLWxvYWRlci9pbmRleC5qcz93aWRnZXRGYWN0b3J5PXNyYy9tZW51L01lbnUhLi9ub2RlX21vZHVsZXMvQGRvam8vY2xpLWJ1aWxkLXdpZGdldC90ZW1wbGF0ZS9jdXN0b20tZWxlbWVudC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcclxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcclxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuXHJcblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxyXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxyXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxyXG5cclxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXHJcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDApXHJcbiAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUocmVzdWx0LnZhbHVlKTsgfSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSB5W29wWzBdICYgMiA/IFwicmV0dXJuXCIgOiBvcFswXSA/IFwidGhyb3dcIiA6IFwibmV4dFwiXSkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbMCwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIGV4cG9ydHMpIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKCFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBleHBvcnRzW3BdID0gbVtwXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgIH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChvW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9OyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpIHx8ICgxLGV2YWwpKFwidGhpc1wiKTtcbn0gY2F0Y2goZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZih0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKVxuXHRcdGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vICh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvd2VicGFjay9idWlsZGluL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgeyB2IH0gZnJvbSAnQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2QnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2N1c3RvbUVsZW1lbnQnO1xuaW1wb3J0IHsgV2lkZ2V0UHJvcGVydGllcywgV05vZGUgfSBmcm9tICdAZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyB0aGVtZSwgVGhlbWVkTWl4aW4gfSBmcm9tICdAZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvbWl4aW5zL1RoZW1lZCc7XG5pbXBvcnQgeyBXaWRnZXRCYXNlIH0gZnJvbSAnQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL1dpZGdldEJhc2UnO1xuaW1wb3J0IHsgTWVudUl0ZW0sIE1lbnVJdGVtUHJvcGVydGllcyB9IGZyb20gJy4uL21lbnUtaXRlbS9NZW51SXRlbSc7XG5cbmltcG9ydCAqIGFzIGNzcyBmcm9tICcuL21lbnUubS5jc3MnO1xuXG5pbnRlcmZhY2UgTWVudVByb3BlcnRpZXMgZXh0ZW5kcyBXaWRnZXRQcm9wZXJ0aWVzIHtcblx0b25TZWxlY3RlZDogKGRhdGE6IGFueSkgPT4gdm9pZDtcbn1cblxuQGN1c3RvbUVsZW1lbnQ8TWVudVByb3BlcnRpZXM+KHtcblx0dGFnOiAnZGVtby1tZW51Jyxcblx0ZXZlbnRzOiBbJ29uU2VsZWN0ZWQnXVxufSlcbkB0aGVtZShjc3MpXG5leHBvcnQgY2xhc3MgTWVudSBleHRlbmRzIFRoZW1lZE1peGluKFdpZGdldEJhc2UpPE1lbnVQcm9wZXJ0aWVzLCBXTm9kZTxNZW51SXRlbT4+IHtcblx0cHJpdmF0ZSBfc2VsZWN0ZWRJZDogbnVtYmVyO1xuXG5cdHByaXZhdGUgX29uU2VsZWN0ZWQoaWQ6IG51bWJlciwgZGF0YTogYW55KSB7XG5cdFx0dGhpcy5fc2VsZWN0ZWRJZCA9IGlkO1xuXHRcdHRoaXMucHJvcGVydGllcy5vblNlbGVjdGVkKGRhdGEpO1xuXHRcdHRoaXMuaW52YWxpZGF0ZSgpO1xuXHR9XG5cblx0cHJvdGVjdGVkIHJlbmRlcigpIHtcblx0XHRjb25zdCBpdGVtcyA9IHRoaXMuY2hpbGRyZW4ubWFwKChjaGlsZCwgaW5kZXgpID0+IHtcblx0XHRcdGlmIChjaGlsZCkge1xuXHRcdFx0XHRjb25zdCBwcm9wZXJ0aWVzOiBQYXJ0aWFsPE1lbnVJdGVtUHJvcGVydGllcz4gPSB7XG5cdFx0XHRcdFx0b25TZWxlY3RlZDogKGRhdGE6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5fb25TZWxlY3RlZChpbmRleCwgZGF0YSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAodGhpcy5fc2VsZWN0ZWRJZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cHJvcGVydGllcy5zZWxlY3RlZCA9IGluZGV4ID09PSB0aGlzLl9zZWxlY3RlZElkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNoaWxkLnByb3BlcnRpZXMgPSB7IC4uLmNoaWxkLnByb3BlcnRpZXMsIC4uLnByb3BlcnRpZXMgfTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBjaGlsZDtcblx0XHR9KTtcblxuXHRcdHJldHVybiB2KCduYXYnLCB7IGNsYXNzZXM6IHRoaXMudGhlbWUoY3NzLnJvb3QpIH0sIFtcblx0XHRcdHYoXG5cdFx0XHRcdCdvbCcsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjbGFzc2VzOiB0aGlzLnRoZW1lKGNzcy5tZW51Q29udGFpbmVyKVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRpdGVtc1xuXHRcdFx0KVxuXHRcdF0pO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE1lbnU7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZHRzLWxvYWRlcj90eXBlPXRzJmluc3RhbmNlTmFtZT0wX21lbnUhLi9zcmMvbWVudS9NZW51LnRzIiwiLy8gcmVtb3ZlZCBieSBleHRyYWN0LXRleHQtd2VicGFjay1wbHVnaW5cbm1vZHVsZS5leHBvcnRzID0ge1wiIF9rZXlcIjpcInRlc3QtYXBwL21lbnVcIixcInJvb3RcIjpcIm1lbnUtbV9fcm9vdF9fM2JBNmpcIixcIm1lbnVDb250YWluZXJcIjpcIm1lbnUtbV9fbWVudUNvbnRhaW5lcl9fMWVvR2ZcIn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvbWVudS9tZW51Lm0uY3NzXG4vLyBtb2R1bGUgaWQgPSAuL3NyYy9tZW51L21lbnUubS5jc3Ncbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51Il0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/test-app/fixtures/unix/dist/menu-item/menu-item-1.0.0.js b/test-app/fixtures/unix/dist/menu-item/menu-item-1.0.0.js index f805ed0..3e1453e 100644 --- a/test-app/fixtures/unix/dist/menu-item/menu-item-1.0.0.js +++ b/test-app/fixtures/unix/dist/menu-item/menu-item-1.0.0.js @@ -6,7 +6,7 @@ * All rights reserved * */ -!function(e){var t={};function o(r){if(t[r])return t[r].exports;var s=t[r]={i:r,l:!1,exports:{}};return e[r].call(s.exports,s,s.exports,o),s.l=!0,s.exports}o.m=e,o.c=t,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}({"./node_modules/@dojo/core/Destroyable.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/core/lang.mjs"),s=o("./node_modules/@dojo/shim/Promise.mjs");function n(){return s.a.resolve(!1)}function i(){throw new Error("Call made to destroyed method")}class d{constructor(){this.handles=[]}own(e){const t=Array.isArray(e)?Object(r.b)(...e):e,{handles:o}=this;return o.push(t),{destroy(){o.splice(o.indexOf(t)),t.destroy()}}}destroy(){return new s.a(e=>{this.handles.forEach(e=>{e&&e.destroy&&e.destroy()}),this.destroy=n,this.own=i,e(!0)})}}t.a=d},"./node_modules/@dojo/core/Evented.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/Map.mjs"),s=o("./node_modules/@dojo/core/Destroyable.mjs");const n=new r.b;class i extends s.a{constructor(){super(...arguments),this.listenersMap=new r.b}emit(e){this.listenersMap.forEach((t,o)=>{(function(e,t){if("string"==typeof t&&"string"==typeof e&&-1!==e.indexOf("*")){let o;return n.has(e)?o=n.get(e):(o=new RegExp(`^${e.replace(/\*/g,".*")}$`),n.set(e,o)),o.test(t)}return e===t})(o,e.type)&&t.forEach(t=>{t.call(this,e)})})}on(e,t){if(Array.isArray(t)){const o=t.map(t=>this._addListener(e,t));return{destroy(){o.forEach(e=>e.destroy())}}}return this._addListener(e,t)}_addListener(e,t){const o=this.listenersMap.get(e)||[];return o.push(t),this.listenersMap.set(e,o),{destroy:()=>{const o=this.listenersMap.get(e)||[];o.splice(o.indexOf(t),1)}}}}t.a=i},"./node_modules/@dojo/core/lang.mjs":function(e,t,o){"use strict";t.b=function(...e){return function(e){let t=!1;return{destroy:function(){t||(t=!0,e())}}}(function(){for(let t=0;t{r[e]=t,delete n[e]},()=>{delete n[e]})}function l(e){let t;const o=e.toLowerCase();if(o in a)t=a[o];else if(s[o])t=r[o]=s[o].call(null),delete s[o];else{if(!(o in r)){if(e in n)return!1;throw new TypeError(`Attempt to detect unregistered has feature "${e}"`)}t=r[o]}return t}c("debug",!0),c("host-browser","undefined"!=typeof document&&"undefined"!=typeof location),c("host-node",function(){if("object"==typeof o&&o.versions&&o.versions.node)return o.versions.node})}).call(t,o("./node_modules/webpack/buildin/global.js"),o("./node_modules/process/browser.js"))},"./node_modules/@dojo/shim/Map.mjs":function(e,t,o){"use strict";o.d(t,"a",function(){return s});o("./node_modules/@dojo/shim/iterator.mjs");var r=o("./node_modules/@dojo/shim/global.mjs");o("./node_modules/@dojo/shim/object.mjs"),o("./node_modules/@dojo/shim/support/has.mjs"),o("./node_modules/@dojo/shim/Symbol.mjs");let s=r.a.Map;t.b=s},"./node_modules/@dojo/shim/Promise.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/global.mjs");o("./node_modules/@dojo/shim/support/queue.mjs"),o("./node_modules/@dojo/shim/Symbol.mjs"),o("./node_modules/@dojo/shim/support/has.mjs");let s=r.a.Promise;t.a=s},"./node_modules/@dojo/shim/Symbol.mjs":function(e,t,o){"use strict";o("./node_modules/@dojo/shim/support/has.mjs");var r=o("./node_modules/@dojo/shim/global.mjs"),s=o("./node_modules/@dojo/shim/support/util.mjs");let n=r.a.Symbol;["hasInstance","isConcatSpreadable","iterator","species","replace","search","split","match","toPrimitive","toStringTag","unscopables","observable"].forEach(e=>{n[e]||Object.defineProperty(n,e,Object(s.a)(n.for(e),!1,!1))}),t.a=n},"./node_modules/@dojo/shim/WeakMap.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/global.mjs");o("./node_modules/@dojo/shim/iterator.mjs"),o("./node_modules/@dojo/shim/support/has.mjs"),o("./node_modules/@dojo/shim/Symbol.mjs");let s=r.a.WeakMap;t.a=s},"./node_modules/@dojo/shim/array.mjs":function(e,t,o){"use strict";o.d(t,"a",function(){return n});var r=o("./node_modules/@dojo/shim/global.mjs"),s=(o("./node_modules/@dojo/shim/iterator.mjs"),o("./node_modules/@dojo/shim/number.mjs"),o("./node_modules/@dojo/shim/support/has.mjs"),o("./node_modules/@dojo/shim/support/util.mjs"));let n,i,d,a,c,l,u;n=r.a.Array.from,i=r.a.Array.of,d=Object(s.b)(r.a.Array.prototype.copyWithin),a=Object(s.b)(r.a.Array.prototype.fill),c=Object(s.b)(r.a.Array.prototype.find),l=Object(s.b)(r.a.Array.prototype.findIndex),u=Object(s.b)(r.a.Array.prototype.includes)},"./node_modules/@dojo/shim/global.mjs":function(e,t,o){"use strict";(function(e){const o=void 0!==e?e:"undefined"!=typeof window?window:"undefined"!=typeof self?self:void 0;t.a=o}).call(t,o("./node_modules/webpack/buildin/global.js"))},"./node_modules/@dojo/shim/iterator.mjs":function(e,t,o){"use strict";o("./node_modules/@dojo/shim/Symbol.mjs"),o("./node_modules/@dojo/shim/string.mjs")},"./node_modules/@dojo/shim/number.mjs":function(e,t,o){"use strict";o("./node_modules/@dojo/shim/global.mjs");Math.pow(2,53)},"./node_modules/@dojo/shim/object.mjs":function(e,t,o){"use strict";o.d(t,"a",function(){return s});var r=o("./node_modules/@dojo/shim/global.mjs");o("./node_modules/@dojo/shim/support/has.mjs"),o("./node_modules/@dojo/shim/Symbol.mjs");let s,n,i,d,a,c,l,u,h;{const e=r.a.Object;s=e.assign,n=e.getOwnPropertyDescriptor,i=e.getOwnPropertyNames,d=e.getOwnPropertySymbols,a=e.is,c=e.keys}{const e=r.a.Object;l=e.getOwnPropertyDescriptors,u=e.entries,h=e.values}},"./node_modules/@dojo/shim/string.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/global.mjs"),s=(o("./node_modules/@dojo/shim/support/has.mjs"),o("./node_modules/@dojo/shim/support/util.mjs"));t.b=55296;t.a=56319;let n,i,d,a,c,l,u,h,p,m;n=r.a.String.fromCodePoint,i=r.a.String.raw,d=Object(s.b)(r.a.String.prototype.codePointAt),a=Object(s.b)(r.a.String.prototype.endsWith),c=Object(s.b)(r.a.String.prototype.includes),l=Object(s.b)(r.a.String.prototype.normalize),u=Object(s.b)(r.a.String.prototype.repeat),h=Object(s.b)(r.a.String.prototype.startsWith),p=Object(s.b)(r.a.String.prototype.padEnd),m=Object(s.b)(r.a.String.prototype.padStart)},"./node_modules/@dojo/shim/support/has.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/has/has.mjs"),s=o("./node_modules/@dojo/shim/global.mjs");r.b;Object(r.a)("es6-array",()=>["from","of"].every(e=>e in s.a.Array)&&["findIndex","find","copyWithin"].every(e=>e in s.a.Array.prototype),!0),Object(r.a)("es6-array-fill",()=>"fill"in s.a.Array.prototype&&1===[1].fill(9,Number.POSITIVE_INFINITY)[0],!0),Object(r.a)("es7-array",()=>"includes"in s.a.Array.prototype,!0),Object(r.a)("es6-map",()=>{if("function"==typeof s.a.Map)try{const e=new s.a.Map([[0,1]]);return e.has(0)&&"function"==typeof e.keys&&"function"==typeof e.values&&"function"==typeof e.entries}catch(e){return!1}return!1},!0),Object(r.a)("es6-math",()=>["clz32","sign","log10","log2","log1p","expm1","cosh","sinh","tanh","acosh","asinh","atanh","trunc","fround","cbrt","hypot"].every(e=>"function"==typeof s.a.Math[e]),!0),Object(r.a)("es6-math-imul",()=>"imul"in s.a.Math&&-5===Math.imul(4294967295,5),!0),Object(r.a)("es6-object",()=>["assign","is","getOwnPropertySymbols","setPrototypeOf"].every(e=>"function"==typeof s.a.Object[e]),!0),Object(r.a)("es2017-object",()=>["values","entries","getOwnPropertyDescriptors"].every(e=>"function"==typeof s.a.Object[e]),!0),Object(r.a)("es-observable",()=>void 0!==s.a.Observable,!0),Object(r.a)("es6-promise",()=>void 0!==s.a.Promise&&!0,!0),Object(r.a)("es6-set",()=>{if("function"==typeof s.a.Set){const e=new s.a.Set([1]);return e.has(1)&&"keys"in e&&"function"==typeof e.keys&&!0}return!1},!0),Object(r.a)("es6-string",()=>["fromCodePoint"].every(e=>"function"==typeof s.a.String[e])&&["codePointAt","normalize","repeat","startsWith","endsWith","includes"].every(e=>"function"==typeof s.a.String.prototype[e]),!0),Object(r.a)("es6-string-raw",()=>{function e(e,...t){const o=[...e];return o.raw=e.raw,o}if("raw"in s.a.String){let t=e`a\n${1}`;return t.raw=["a\\n"],"a:\\n"===s.a.String.raw(t,42)}return!1},!0),Object(r.a)("es2017-string",()=>["padStart","padEnd"].every(e=>"function"==typeof s.a.String.prototype[e]),!0),Object(r.a)("es6-symbol",()=>void 0!==s.a.Symbol&&"symbol"==typeof Symbol(),!0),Object(r.a)("es6-weakmap",()=>{if(void 0!==s.a.WeakMap){const e={},t={},o=new s.a.WeakMap([[e,1]]);return Object.freeze(e),1===o.get(e)&&o.set(t,2)===o&&!0}return!1},!0),Object(r.a)("microtasks",()=>!0,!0),Object(r.a)("postmessage",()=>void 0!==s.a.window&&"function"==typeof s.a.postMessage,!0),Object(r.a)("raf",()=>"function"==typeof s.a.requestAnimationFrame,!0),Object(r.a)("setimmediate",()=>void 0!==s.a.setImmediate,!0),Object(r.a)("dom-mutationobserver",()=>{if(Boolean(s.a.MutationObserver||s.a.WebKitMutationObserver)){const e=document.createElement("div"),t=new(s.a.MutationObserver||s.a.WebKitMutationObserver)(function(){});return t.observe(e,{attributes:!0}),e.style.setProperty("display","block"),Boolean(t.takeRecords().length)}return!1},!0),Object(r.a)("dom-webanimation",()=>void 0!==s.a.Animation&&void 0!==s.a.KeyframeEffect,!0)},"./node_modules/@dojo/shim/support/queue.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/global.mjs");o("./node_modules/@dojo/shim/support/has.mjs");function s(e){e&&e.isActive&&e.callback&&e.callback()}function n(e,t){return{destroy:function(){this.destroy=function(){},e.isActive=!1,e.callback=null,t&&t()}}}!function(){let e,t;{const e=[];r.a.addEventListener("message",function(t){t.source===r.a&&"dojo-queue-message"===t.data&&(t.stopPropagation(),e.length&&s(e.shift()))}),t=function(t){e.push(t),r.a.postMessage("dojo-queue-message","*")}}function o(o){const r={isActive:!0,callback:o},s=t(r);return n(r,e&&function(){e(s)})}}();!function(){function e(e){const t={isActive:!0,callback:e},o=requestAnimationFrame(s.bind(null,t));return n(t,function(){cancelAnimationFrame(o)})}}();!function(){let e;e=function(e){r.a.Promise.resolve(e).then(s)}}()},"./node_modules/@dojo/shim/support/util.mjs":function(e,t,o){"use strict";t.a=function(e,t=!1,o=!0,r=!0){return{value:e,enumerable:t,writable:o,configurable:r}},t.b=function(e){return function(t,...o){return e.apply(t,o)}}},"./node_modules/@dojo/widget-core/Injector.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/core/Evented.mjs");class s extends r.a{constructor(e){super(),this._payload=e}setInvalidator(e){this._invalidator=e}get(){return this._payload}set(e){this._payload=e,this._invalidator&&this._invalidator()}}t.a=s},"./node_modules/@dojo/widget-core/NodeHandler.mjs":function(e,t,o){"use strict";var r,s=o("./node_modules/@dojo/core/Evented.mjs"),n=o("./node_modules/@dojo/shim/Map.mjs");!function(e){e.Projector="Projector",e.Widget="Widget"}(r||(r={}));t.a=class extends s.a{constructor(){super(...arguments),this._nodeMap=new n.b}get(e){return this._nodeMap.get(e)}has(e){return this._nodeMap.has(e)}add(e,t){this._nodeMap.set(t,e),this.emit({type:t})}addRoot(){this.emit({type:r.Widget})}addProjector(){this.emit({type:r.Projector})}clear(){this._nodeMap.clear()}}},"./node_modules/@dojo/widget-core/Registry.mjs":function(e,t,o){"use strict";t.d=a;var r=o("./node_modules/@dojo/shim/Promise.mjs"),s=o("./node_modules/@dojo/shim/Map.mjs"),n=o("./node_modules/@dojo/shim/Symbol.mjs"),i=o("./node_modules/@dojo/core/Evented.mjs");const d=Object(n.a)("Widget Base");function a(e){return Boolean(e&&e._type===d)}t.b=d;class c extends i.a{emitLoadedEvent(e,t){this.emit({type:e,action:"loaded",item:t})}define(e,t){if(void 0===this._widgetRegistry&&(this._widgetRegistry=new s.b),this._widgetRegistry.has(e))throw new Error(`widget has already been registered for '${e.toString()}'`);this._widgetRegistry.set(e,t),t instanceof r.a?t.then(t=>(this._widgetRegistry.set(e,t),this.emitLoadedEvent(e,t),t),e=>{throw e}):a(t)&&this.emitLoadedEvent(e,t)}defineInjector(e,t){if(void 0===this._injectorRegistry&&(this._injectorRegistry=new s.b),this._injectorRegistry.has(e))throw new Error(`injector has already been registered for '${e.toString()}'`);const o=new i.a,r={injector:t(()=>o.emit({type:"invalidate"})),invalidator:o};this._injectorRegistry.set(e,r),this.emitLoadedEvent(e,r)}get(e){if(!this._widgetRegistry||!this.has(e))return null;const t=this._widgetRegistry.get(e);if(a(t))return t;if(t instanceof r.a)return null;const o=t();return this._widgetRegistry.set(e,o),o.then(t=>((function(e){return Boolean(e&&e.hasOwnProperty("__esModule")&&e.hasOwnProperty("default")&&a(e.default))})(t)&&(t=t.default),this._widgetRegistry.set(e,t),this.emitLoadedEvent(e,t),t),e=>{throw e}),null}getInjector(e){return this._injectorRegistry&&this.hasInjector(e)?this._injectorRegistry.get(e):null}has(e){return Boolean(this._widgetRegistry&&this._widgetRegistry.has(e))}hasInjector(e){return Boolean(this._injectorRegistry&&this._injectorRegistry.has(e))}}t.a=c,t.c=c},"./node_modules/@dojo/widget-core/RegistryHandler.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/Map.mjs"),s=o("./node_modules/@dojo/core/Evented.mjs"),n=o("./node_modules/@dojo/widget-core/Registry.mjs");t.a=class extends s.a{constructor(){super(),this._registry=new n.a,this._registryWidgetLabelMap=new r.a,this._registryInjectorLabelMap=new r.a,this.own(this._registry),this.own({destroy:()=>{this.baseRegistry&&(this._registryWidgetLabelMap.delete(this.baseRegistry),this._registryInjectorLabelMap.delete(this.baseRegistry),this.baseRegistry=void 0)}})}set base(e){this.baseRegistry&&(this._registryWidgetLabelMap.delete(this.baseRegistry),this._registryInjectorLabelMap.delete(this.baseRegistry)),this.baseRegistry=e}define(e,t){this._registry.define(e,t)}defineInjector(e,t){this._registry.defineInjector(e,t)}has(e){return this._registry.has(e)||Boolean(this.baseRegistry&&this.baseRegistry.has(e))}hasInjector(e){return this._registry.hasInjector(e)||Boolean(this.baseRegistry&&this.baseRegistry.hasInjector(e))}get(e,t=!1){return this._get(e,t,"get",this._registryWidgetLabelMap)}getInjector(e,t=!1){return this._get(e,t,"getInjector",this._registryInjectorLabelMap)}_get(e,t,o,r){const s=t?[this.baseRegistry,this._registry]:[this._registry,this.baseRegistry];for(let n=0;n{"loaded"===r.action&&this[o](e,t)===r.item&&this.emit({type:"invalidate"})});this.own(s),r.set(i,[...a,e])}}return null}}},"./node_modules/@dojo/widget-core/WidgetBase.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/Map.mjs"),s=o("./node_modules/@dojo/shim/WeakMap.mjs"),n=o("./node_modules/@dojo/shim/Symbol.mjs"),i=o("./node_modules/@dojo/widget-core/d.mjs"),d=o("./node_modules/@dojo/widget-core/diff.mjs"),a=o("./node_modules/@dojo/widget-core/RegistryHandler.mjs"),c=o("./node_modules/@dojo/widget-core/NodeHandler.mjs"),l=o("./node_modules/@dojo/widget-core/vdom.mjs"),u=o("./node_modules/@dojo/widget-core/Registry.mjs");const h=new r.b,p=d.a.bind(null),m=n.a.for("dojoNoBind");t.b=m;class f{constructor(){this._initialProperties=!0,this._changedPropertyKeys=[],this._nodeHandler=new c.a,this._handles=[],this._children=[],this._decoratorCache=new r.b,this._properties={},this._boundRenderFunc=this.render.bind(this),this._boundInvalidate=this.invalidate.bind(this),l.b.set(this,{dirty:!0,onAttach:()=>{this.onAttach()},onDetach:()=>{this.onDetach(),this.destroy()},nodeHandler:this._nodeHandler,registry:()=>this.registry,coreProperties:{},rendering:!1,inputProperties:{}}),this._runAfterConstructors()}meta(e){void 0===this._metaMap&&(this._metaMap=new r.b);let t=this._metaMap.get(e);return t||(t=new e({invalidate:this._boundInvalidate,nodeHandler:this._nodeHandler,bind:this}),this.own(t),this._metaMap.set(e,t)),t}onAttach(){}onDetach(){}get properties(){return this._properties}get changedPropertyKeys(){return[...this._changedPropertyKeys]}__setCoreProperties__(e){const{baseRegistry:t}=e,o=l.b.get(this);o.coreProperties.baseRegistry!==t&&(void 0===this._registry&&(this._registry=new a.a,this.own(this._registry),this.own(this._registry.on("invalidate",this._boundInvalidate))),this._registry.base=t,this.invalidate()),o.coreProperties=e}__setProperties__(e){const t=l.b.get(this);t.inputProperties=e;const o=this._runBeforeProperties(e),r=this.getDecorator("registeredDiffProperty"),s=[],n=Object.keys(o);if(!1===this._initialProperties||0!==r.length){const e=[...n,...Object.keys(this._properties)],i=[],d={};let a=!1;for(let n=0;n{e.changed&&t.call(this,e.previousProperties,e.newProperties)}),this._properties=d,this._changedPropertyKeys=s}else{this._initialProperties=!1;for(let e=0;e0&&this.invalidate()}get children(){return this._children}__setChildren__(e){(this._children.length>0||e.length>0)&&(this._children=e,this.invalidate())}__render__(){l.b.get(this).dirty=!1;let e=this._runBeforeRenders()();return e=this.runAfterRenders(e),this._nodeHandler.clear(),e}invalidate(){const e=l.b.get(this);e.invalidate&&e.invalidate()}render(){return Object(i.g)("div",{},this.children)}addDecorator(e,t){if(t=Array.isArray(t)?t:[t],this.hasOwnProperty("constructor")){let o=h.get(this.constructor);o||(o=new r.b,h.set(this.constructor,o));let s=o.get(e);s||(s=[],o.set(e,s)),s.push(...t)}else{const o=this.getDecorator(e);this._decoratorCache.set(e,[...o,...t])}}_buildDecoratorList(e){const t=[];let o=this.constructor;for(;o;){const r=h.get(o);if(r){const o=r.get(e);o&&t.unshift(...o)}o=Object.getPrototypeOf(o)}return t}getDecorator(e){let t=this._decoratorCache.get(e);return void 0!==t?t:(t=this._buildDecoratorList(e),this._decoratorCache.set(e,t),t)}_mapDiffPropertyReactions(e,t){return this.getDecorator("diffReaction").reduce((o,{reaction:r,propertyName:s})=>{let n=o.get(r);return void 0===n&&(n={previousProperties:{},newProperties:{},changed:!1}),n.previousProperties[s]=this._properties[s],n.newProperties[s]=e[s],-1!==t.indexOf(s)&&(n.changed=!0),o.set(r,n),o},new r.b)}_bindFunctionProperty(e,t){if("function"==typeof e&&!e[m]&&!1===Object(u.d)(e)){void 0===this._bindFunctionPropertyMap&&(this._bindFunctionPropertyMap=new s.a);const o=this._bindFunctionPropertyMap.get(e)||{};let{boundFunc:r,scope:n}=o;return void 0!==r&&n===t||(r=e.bind(t),this._bindFunctionPropertyMap.set(e,{boundFunc:r,scope:t})),r}return e}get registry(){return void 0===this._registry&&(this._registry=new a.a,this.own(this._registry),this.own(this._registry.on("invalidate",this._boundInvalidate))),this._registry}_runBeforeProperties(e){const t=this.getDecorator("beforeProperties");return t.length>0?t.reduce((e,t)=>Object.assign({},e,t.call(this,e)),Object.assign({},e)):e}_runBeforeRenders(){const e=this.getDecorator("beforeRender");return e.length>0?e.reduce((e,t)=>{const o=t.call(this,e,this._properties,this._children);return o||(console.warn("Render function not returned from beforeRender, using previous render"),e)},this._boundRenderFunc):this._boundRenderFunc}runAfterRenders(e){const t=this.getDecorator("afterRender");return t.length>0?t.reduce((e,t)=>t.call(this,e),e):(void 0!==this._metaMap&&this._metaMap.forEach(e=>{e.afterRender()}),e)}_runAfterConstructors(){const e=this.getDecorator("afterConstructor");e.length>0&&e.forEach(e=>e.call(this))}own(e){this._handles.push(e)}destroy(){for(;this._handles.length>0;){const e=this._handles.pop();e&&e.destroy()}}}t.a=f,f._type=u.b},"./node_modules/@dojo/widget-core/animations/cssTransitions.mjs":function(e,t,o){"use strict";let r="",s="";function n(e){""===s&&function(e){if("WebkitTransition"in e.style)r="webkitTransitionEnd",s="webkitAnimationEnd";else{if(!("transition"in e.style||"MozTransition"in e.style))throw new Error("Your browser is not supported");r="transitionend",s="animationend"}}(e)}function i(e,t,o){n(e);let i=!1,d=function(){i||(i=!0,e.removeEventListener(r,d),e.removeEventListener(s,d),o())};t(),e.addEventListener(s,d),e.addEventListener(r,d)}t.a={enter:function(e,t,o){const r=t.enterAnimationActive||`${o}-active`;i(e,()=>{e.classList.add(o),requestAnimationFrame(function(){e.classList.add(r)})},()=>{e.classList.remove(o),e.classList.remove(r)})},exit:function(e,t,o,r){const s=t.exitAnimationActive||`${o}-active`;i(e,()=>{e.classList.add(o),requestAnimationFrame(function(){e.classList.add(s)})},()=>{r()})}}},"./node_modules/@dojo/widget-core/d.mjs":function(e,t,o){"use strict";t.f=d,t.e=a,t.d=function(e){return Boolean(e&&"string"!=typeof e&&e.type===i)},t.h=function(e,t,o=[]){return{children:o,widgetConstructor:e,properties:t,type:s}},t.g=function(e,t={},o){let r,s=t;Array.isArray(t)&&(o=t,s={});"function"==typeof s&&(r=s,s={});return{tag:e,deferredPropertiesCallback:r,children:o,properties:s,type:n}},t.c=function({node:e,attrs:t={},props:o={},on:r={},diffType:s="none"},n){return{tag:c(e)?e.tagName.toLowerCase():"",properties:o,attributes:t,events:r,children:n,type:i,domNode:e,text:c(e)?void 0:e.data,diffType:s}};var r=o("./node_modules/@dojo/shim/Symbol.mjs");const s=Object(r.a)("Identifier for a WNode.");t.b=s;const n=Object(r.a)("Identifier for a VNode.");t.a=n;const i=Object(r.a)("Identifier for a VNode created using existing dom.");function d(e){return Boolean(e&&"string"!=typeof e&&e.type===s)}function a(e){return Boolean(e&&"string"!=typeof e&&(e.type===n||e.type===i))}function c(e){return!!e.tagName}},"./node_modules/@dojo/widget-core/decorators/afterRender.mjs":function(e,t,o){"use strict";t.a=s;var r=o("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs");function s(e){return Object(r.a)((t,o)=>{t.addDecorator("afterRender",o?t[o]:e)})}},"./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs":function(e,t,o){"use strict";t.a=n;var r=o("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"),s=o("./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs");function n(){return Object(r.a)((e,t)=>{Object(s.a)(function(){this.invalidate()})(e)})}},"./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs":function(e,t,o){"use strict";t.a=s;var r=o("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs");function s(e){return Object(r.a)((t,o)=>{t.addDecorator("beforeProperties",o?t[o]:e)})}},"./node_modules/@dojo/widget-core/decorators/customElement.mjs":function(e,t,o){"use strict";t.a=n;var r=o("./node_modules/@dojo/widget-core/registerCustomElement.mjs"),s=o("./node_modules/@dojo/widget-core/Registry.mjs");function n({tag:e,properties:t=[],attributes:o=[],events:n=[],childType:i=r.CustomElementChildType.DOJO,registryFactory:d=(()=>new s.c)}){return function(r){r.prototype.__customElementDescriptor={tagName:e,attributes:o,properties:t,events:n,childType:i,registryFactory:d}}}},"./node_modules/@dojo/widget-core/decorators/diffProperty.mjs":function(e,t,o){"use strict";t.a=s;var r=o("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs");function s(e,t,o){return Object(r.a)((r,s)=>{r.addDecorator(`diffProperty:${e}`,t.bind(null)),r.addDecorator("registeredDiffProperty",e),(o||s)&&r.addDecorator("diffReaction",{propertyName:e,reaction:s?r[s]:o})})}},"./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs":function(e,t,o){"use strict";function r(e){return function(t,o,r){"function"==typeof t?e(t.prototype,void 0):e(t,o)}}t.a=r},"./node_modules/@dojo/widget-core/decorators/inject.mjs":function(e,t,o){"use strict";t.a=d;var r=o("./node_modules/@dojo/shim/WeakMap.mjs"),s=o("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"),n=o("./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs");const i=new r.a;function d({name:e,getProperties:t}){return Object(s.a)((o,r)=>{Object(n.a)(function(o){const r=this.registry.getInjector(e);if(r){const{injector:e,invalidator:s}=r,n=i.get(this)||[];return 0===n.length&&i.set(this,n),-1===n.indexOf(r)&&(this.own(s.on("invalidate",()=>{this.invalidate()})),n.push(r)),t(e(),o)}})(o)})}},"./node_modules/@dojo/widget-core/diff.mjs":function(e,t,o){"use strict";t.b=i,t.a=function(e,t){let o;o="function"==typeof t?t._type===r.b?n(e,t):function(e,t){return{changed:!1,value:t}}(0,t):s(t)?i(e,t):n(e,t);return o};var r=o("./node_modules/@dojo/widget-core/Registry.mjs");function s(e){return"[object Object]"===Object.prototype.toString.call(e)||Array.isArray(e)}function n(e,t){return{changed:e!==t,value:t}}function i(e,t){let o=!1;const r=e&&s(e),n=t&&s(t);if(!r||!n)return{changed:!0,value:t};const i=Object.keys(e),d=Object.keys(t);return{changed:o=i.length!==d.length||d.some(o=>t[o]!==e[o]),value:t}}},"./node_modules/@dojo/widget-core/mixins/Projector.mjs":function(e,t,o){"use strict";t.a=u;var r,s,n=o("./node_modules/tslib/tslib.es6.js"),i=o("./node_modules/@dojo/core/lang.mjs"),d=o("./node_modules/@dojo/widget-core/animations/cssTransitions.mjs"),a=o("./node_modules/@dojo/widget-core/decorators/afterRender.mjs"),c=o("./node_modules/@dojo/widget-core/d.mjs"),l=o("./node_modules/@dojo/widget-core/vdom.mjs");function u(e){class t extends e{constructor(...e){super(...e),this._root=document.body,this._async=!0,this._projectorProperties={},this._projectionOptions={transitions:d.a},this.root=document.body,this.projectorState=r.Detached}append(e){const t={type:s.Append,root:e};return this._attach(t)}merge(e){const t={type:s.Merge,root:e};return this._attach(t)}set root(e){if(this.projectorState===r.Attached)throw new Error("Projector already attached, cannot change root element");this._root=e}get root(){return this._root}get async(){return this._async}set async(e){if(this.projectorState===r.Attached)throw new Error("Projector already attached, cannot change async mode");this._async=e}sandbox(e=document){if(this.projectorState===r.Attached)throw new Error("Projector already attached, cannot create sandbox");this._async=!1;const t=this.root;this.own({destroy:()=>{this._root=t}}),this._attach({root:e.createDocumentFragment(),type:s.Append})}setChildren(e){this.__setChildren__(e)}setProperties(e){this.__setProperties__(e)}__setProperties__(e){this._projectorProperties&&this._projectorProperties.registry!==e.registry&&this._projectorProperties.registry&&this._projectorProperties.registry.destroy(),this._projectorProperties=Object(i.a)({},e),super.__setCoreProperties__({bind:this,baseRegistry:e.registry}),super.__setProperties__(e)}toHtml(){if(this.projectorState!==r.Attached||!this._projection)throw new Error("Projector is not attached, cannot return an HTML string of projection.");return this._projection.domNode.childNodes[0].outerHTML}afterRender(e){let t=e;return"string"!=typeof e&&null!==e&&void 0!==e||(t=Object(c.g)("span",{},[e])),t}destroy(){super.destroy()}_attach({type:e,root:t}){if(t&&(this.root=t),this._attachHandle)return this._attachHandle;this.projectorState=r.Attached;const o={destroy:()=>{this.projectorState===r.Attached&&(this._projection=void 0,this.projectorState=r.Detached)}};switch(this.own(o),this._attachHandle=o,this._projectionOptions=Object.assign({},this._projectionOptions,{sync:!this._async}),e){case s.Append:this._projection=l.a.append(this.root,this,this._projectionOptions);break;case s.Merge:this._projection=l.a.merge(this.root,this,this._projectionOptions)}return this._attachHandle}}return n.a([Object(a.a)(),n.b("design:type",Function),n.b("design:paramtypes",[Object]),n.b("design:returntype",void 0)],t.prototype,"afterRender",null),t}!function(e){e[e.Attached=1]="Attached",e[e.Detached=2]="Detached"}(r||(r={})),function(e){e[e.Append=1]="Append",e[e.Merge=2]="Merge"}(s||(s={}))},"./node_modules/@dojo/widget-core/mixins/Themed.mjs":function(e,t,o){"use strict";t.c=function(e){return Object(i.a)(t=>{t.addDecorator("baseThemeClasses",e)})},t.b=function(e,t){const o=new s.a(e);return t.defineInjector(l,e=>(o.setInvalidator(e),()=>o.get())),o},t.a=u;var r=o("./node_modules/tslib/tslib.es6.js"),s=o("./node_modules/@dojo/widget-core/Injector.mjs"),n=o("./node_modules/@dojo/widget-core/decorators/inject.mjs"),i=o("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"),d=o("./node_modules/@dojo/widget-core/decorators/diffProperty.mjs"),a=o("./node_modules/@dojo/widget-core/diff.mjs");const c=" _key",l=Symbol("theme");function u(e){let t=class extends e{constructor(){super(...arguments),this._registeredBaseThemeKeys=[],this._recalculateClasses=!0,this._theme={}}theme(e){return this._recalculateClasses&&this._recalculateThemeClasses(),Array.isArray(e)?e.map(e=>this._getThemeClass(e)):this._getThemeClass(e)}onPropertiesChanged(){this._recalculateClasses=!0}_getThemeClass(e){if(void 0===e||null===e)return e;const t=this.properties.extraClasses||{},o=this._baseThemeClassesReverseLookup[e];let r=[];return o?(t[o]&&r.push(t[o]),this._theme[o]?r.push(this._theme[o]):r.push(this._registeredBaseTheme[o]),r.join(" ")):(console.warn(`Class name: '${e}' not found in theme`),null)}_recalculateThemeClasses(){const{theme:e={}}=this.properties,t=this.getDecorator("baseThemeClasses");this._registeredBaseTheme||(this._registeredBaseTheme=t.reduce((e,t)=>{const o=c,s=t[o],n=r.c(t,["symbol"==typeof o?o:o+""]);return this._registeredBaseThemeKeys.push(s),Object.assign({},e,n)},{}),this._baseThemeClassesReverseLookup=t.reduce((e,t)=>(Object.keys(t).forEach(o=>{e[t[o]]=o}),e),{})),this._theme=this._registeredBaseThemeKeys.reduce((t,o)=>Object.assign({},t,e[o]),{}),this._recalculateClasses=!1}};return r.a([Object(d.a)("theme",a.b),Object(d.a)("extraClasses",a.b),r.b("design:type",Function),r.b("design:paramtypes",[]),r.b("design:returntype",void 0)],t.prototype,"onPropertiesChanged",null),t=r.a([Object(n.a)({name:l,getProperties:(e,t)=>t.theme?{}:{theme:e}})],t)}},"./node_modules/@dojo/widget-core/registerCustomElement.mjs":function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),o.d(t,"CustomElementChildType",function(){return r}),t.DomToWidgetWrapper=h,t.create=p,t.register=m;var r,s=o("./node_modules/tslib/tslib.es6.js"),n=o("./node_modules/@dojo/widget-core/WidgetBase.mjs"),i=o("./node_modules/@dojo/widget-core/mixins/Projector.mjs"),d=o("./node_modules/@dojo/shim/array.mjs"),a=o("./node_modules/@dojo/widget-core/d.mjs"),c=o("./node_modules/@dojo/shim/global.mjs"),l=o("./node_modules/@dojo/widget-core/mixins/Themed.mjs"),u=o("./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs");function h(e){let t=class extends n.a{render(){const t=Object.keys(this.properties).reduce((e,t)=>{const o=this.properties[t];return 0===t.indexOf("on")&&(t=`__${t}`),e[t]=o,e},{});return Object(a.c)({node:e,props:t,diffType:"dom"})}static get domNode(){return e}};return t=s.a([Object(u.a)()],t)}function p(e,t){const{attributes:o,childType:s,registryFactory:u}=e,p={};return o.forEach(e=>{const t=e.toLowerCase();p[t]=e}),class extends HTMLElement{constructor(){super(...arguments),this._properties={},this._children=[],this._eventProperties={},this._initialised=!1}connectedCallback(){if(this._initialised)return;const o={},{attributes:p,properties:m,events:f}=e;this._properties=Object.assign({},this._properties,this._attributesToProperties(p)),[...p,...m].forEach(e=>{const t=this[e],r=e.replace(/^on/,"__");void 0!==t&&(this._properties[e]=t),r!==e&&(o[r]={get:()=>this._getProperty(e),set:t=>this._setProperty(e,t)}),o[e]={get:()=>this._getProperty(e),set:t=>this._setProperty(e,t)}}),f.forEach(e=>{const t=e.replace(/^on/,"").toLowerCase(),r=e.replace(/^on/,"__on");o[r]={get:()=>this._getEventProperty(e),set:t=>this._setEventProperty(e,t)},this._eventProperties[e]=void 0,this._properties[e]=((...o)=>{const r=this._getEventProperty(e);"function"==typeof r&&r(...o),this.dispatchEvent(new CustomEvent(t,{bubbles:!1,detail:o}))})}),Object.defineProperties(this,o);const g=s===r.TEXT?this.childNodes:this.children;Object(d.a)(g).forEach(e=>{s===r.DOJO?(e.addEventListener("dojo-ce-render",()=>this._render()),e.addEventListener("dojo-ce-connected",()=>this._render()),this._children.push(h(e))):this._children.push(Object(a.c)({node:e,diffType:"dom"}))}),this.addEventListener("dojo-ce-connected",e=>this._childConnected(e));const j=this._properties,_=()=>this.__children__(),y=u(),b=Object(l.b)(this._getTheme(),y);c.a.addEventListener("dojo-theme-set",()=>b.set(this._getTheme()));const v=Object(i.a)(class extends n.a{render(){return Object(a.h)(t,j,_())}});this._projector=new v,this._projector.setProperties({registry:y}),this._projector.append(this),this._initialised=!0,this.dispatchEvent(new CustomEvent("dojo-ce-connected",{bubbles:!0,detail:this}))}_getTheme(){if(c.a&&c.a.dojoce&&c.a.dojoce.theme)return c.a.dojoce.themes[c.a.dojoce.theme]}_childConnected(e){const t=e.detail;if(t.parentNode===this){this._children.some(e=>e.domNode===t)||(t.addEventListener("dojo-ce-render",()=>this._render()),this._children.push(h(t)),this._render())}}_render(){this._projector&&(this._projector.invalidate(),this.dispatchEvent(new CustomEvent("dojo-ce-render",{bubbles:!1,detail:this})))}__properties__(){return Object.assign({},this._properties,this._eventProperties)}__children__(){return s===r.DOJO?this._children.filter(e=>e.domNode.isWidget).map(e=>{const{domNode:t}=e;return Object(a.h)(e,Object.assign({},t.__properties__()),[...t.__children__()])}):this._children}attributeChangedCallback(e,t,o){const r=p[e];this._setProperty(r,o)}_setEventProperty(e,t){this._eventProperties[e]=t}_getEventProperty(e){return this._eventProperties[e]}_setProperty(e,t){"function"==typeof t&&(t[n.b]=!0),this._properties[e]=t,this._render()}_getProperty(e){return this._properties[e]}_attributesToProperties(e){return e.reduce((e,t)=>{const o=t.toLowerCase(),r=this.getAttribute(o);return null!==r&&(e[t]=r),e},{})}static get observedAttributes(){return Object.keys(p)}get isWidget(){return!0}}}function m(e){const t=e.prototype&&e.prototype.__customElementDescriptor;if(!t)throw new Error("Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?");c.a.customElements.define(t.tagName,p(t,e))}!function(e){e.DOJO="DOJO",e.NODE="NODE",e.TEXT="TEXT"}(r||(r={})),t.default=m},"./node_modules/@dojo/widget-core/vdom.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/global.mjs"),s=o("./node_modules/@dojo/shim/array.mjs"),n=o("./node_modules/@dojo/widget-core/d.mjs"),i=o("./node_modules/@dojo/widget-core/Registry.mjs"),d=o("./node_modules/@dojo/shim/WeakMap.mjs");const a="http://www.w3.org/2000/svg",c="http://www.w3.org/1999/xlink",l=[],u=new d.a;t.b=u;const h=new d.a,p=new d.a;function m(e,t){return Object(n.e)(e)&&Object(n.e)(t)?(!Object(n.d)(e)&&!Object(n.d)(t)||e.domNode===t.domNode)&&(e.tag===t.tag&&e.properties.key===t.properties.key):!(!Object(n.f)(e)||!Object(n.f)(t))&&((void 0!==e.instance||"string"!=typeof t.widgetConstructor)&&(e.widgetConstructor===t.widgetConstructor&&e.properties.key===t.properties.key))}const f=function(){throw new Error("Provide a transitions object to the projectionOptions to do animations")};function g(e){if("string"!=typeof e)throw new Error("Style values must be strings")}function j(e,t,o,r,s,n){const i=p.get(r.projectorInstance),a=i.nodeMap.get(e)||new d.a;if(n){const o=a.get(n);e.removeEventListener(t,o)}let c=o.bind(s);"input"===t&&(c=function(e){o.call(this,e),e.target["oninput-value"]=e.target.value}.bind(s)),e.addEventListener(t,c),a.set(o,c),i.nodeMap.set(e,a)}function _(e,t){if(t){const o=t.split(" ");for(let t=0;t{o.focus()})}}function v(e,t,o,r,s=!1){const n=p.get(r.projectorInstance).nodeMap.get(e);n&&Object.keys(t).forEach(r=>{const i="on"===r.substr(0,2)||s,d=s?r:r.substr(2);if(i&&!o[r]){const o=n.get(t[r]);o&&e.removeEventListener(d,o)}})}function w(e,t,o,r){r.namespace===a&&"href"===t?e.setAttributeNS(c,t,o):"role"===t&&""===o||void 0===o?e.removeAttribute(t):e.setAttribute(t,o)}function O(e,t,o,r){const s=Object.keys(o),n=s.length;for(let i=0;i0)if(c&&0!==c.length){const r=[...o];for(let o=0;o0&&R(r.children,t));else{if(!r.coreProperties){const e=u.get(t);r.coreProperties={bind:t,baseRegistry:e.coreProperties.baseRegistry}}r.children&&r.children.length>0&&R(r.children,t)}o++}else e.splice(o,1)}return e}function k(e,t){if(Object(n.e)(e)&&e.properties){const o=e.properties.enterAnimation;o&&("function"==typeof o?o(e.domNode,e.properties):t.enter(e.domNode,e.properties,o))}}function N(e,t,o){if(Object(n.f)(e)){const r=e.rendered||l;if(e.instance){u.get(e.instance).onDetach(),h.delete(e.instance)}for(let e=0;e0)for(let r=0;r{let i=void 0,d=t[f];if(d){let e=f+1,o=[d];for(;o.length;){const r=o.shift();if(Object(n.f)(r))r.rendered&&o.push(...r.rendered);else if(r.domNode){i=r.domNode;break}0===o.length&&t[e]&&(o.push(t[e]),e++)}}D(l,e,i,s,r),k(l,a);const u=g;c.afterRenderCallbacks.push(()=>{A(o,u,r)})};if(!d||-1===u){p(),g++;continue}const _=()=>{const e=f;if(c.afterRenderCallbacks.push(()=>{A(t,e,r)}),Object(n.f)(d)){const e=h.get(d.instance);e&&(d=e.dnode)}N(d,a,s)};-1!==E(o,d,g+1)?(p(),_(),f++,g++):(_(),f++)}if(i>f)for(u=f;u{A(t,e,r)});let o=t[u];if(Object(n.f)(o)){const e=h.get(o.instance);e&&(o=e.dnode)}N(o,a,s)}return j}function T(e,t,o,r,i,d){if(void 0===t)return;const a=p.get(o.projectorInstance);a.merge&&void 0===d&&(d=Object(s.a)(e.domNode.childNodes));const c=o.transitions;o=Object.assign({},o,{depth:o.depth+1});for(let s=0;s0;)(e=d.shift())&&e.tagName===(l.tag.toUpperCase()||void 0)&&(l.domNode=e)}D(l,e,i,o,r)}else D(l,e,i,o,r,d);k(l,c)}}function x(e,t,o,r){if(T(t,t.children,r,o,void 0),"function"==typeof t.deferredPropertiesCallback&&void 0===t.inserted&&S(t,r),t.attributes&&t.events){O(e,{},t.attributes,r),P(e,{},t.properties,r,!1),v(e,{},t.events,r,!0);const o=t.events;Object.keys(o).forEach(s=>{j(e,s,o[s],r,t.properties.bind)})}else P(e,{},t.properties,r);if(null!==t.properties.key&&void 0!==t.properties.key){u.get(o).nodeHandler.add(e,`${t.properties.key}`)}t.inserted=!0}function D(e,t,o,r,s,d){let c;const l=p.get(r.projectorInstance);if(Object(n.f)(e)){let{widgetConstructor:n}=e;const a=u.get(s);if(!Object(i.d)(n)){const e=a.registry().get(n);if(null===e)return;n=e}const c=new n;e.instance=c;const p=u.get(c);p.invalidate=(()=>{p.dirty=!0,!1===p.rendering&&(l.renderQueue.push({instance:c,depth:r.depth}),F(r))}),p.rendering=!0,c.__setCoreProperties__(e.coreProperties),c.__setChildren__(e.children),c.__setProperties__(e.properties);const m=c.__render__();if(p.rendering=!1,m){const s=R(m,c);e.rendered=s,T(t,s,r,c,o,d)}h.set(c,{dnode:e,parentVNode:t}),p.nodeHandler.addRoot(),l.afterRenderCallbacks.push(()=>{p.onAttach()})}else{if(l.merge&&void 0!==l.mergeElement)return c=e.domNode=r.mergeElement,l.mergeElement=void 0,void x(c,e,s,r);const n=t.domNode.ownerDocument;if(e.tag||"string"!=typeof e.text)void 0===e.domNode?("svg"===e.tag&&(r=Object.assign({},r,{namespace:a})),c=void 0!==r.namespace?e.domNode=n.createElementNS(r.namespace,e.tag):e.domNode=e.domNode||n.createElement(e.tag)):c=e.domNode,x(c,e,s,r),void 0!==o?t.domNode.insertBefore(c,o):c.parentNode!==t.domNode&&t.domNode.appendChild(c);else if(void 0!==e.domNode&&t.domNode){const o=e.domNode.ownerDocument.createTextNode(e.text);t.domNode===e.domNode.parentNode?t.domNode.replaceChild(o,e.domNode):(t.domNode.appendChild(o),e.domNode.parentNode&&e.domNode.parentNode.removeChild(e.domNode)),e.domNode=o}else c=e.domNode=n.createTextNode(e.text),void 0!==o?t.domNode.insertBefore(c,o):t.domNode.appendChild(c)}}function I(e,t,o,r,s){if(Object(n.f)(t)){const{instance:r}=e,{parentVNode:s,dnode:n}=h.get(r),i=n?n.rendered:e.rendered,d=u.get(r);if(d.rendering=!0,r.__setCoreProperties__(t.coreProperties),r.__setChildren__(t.children),r.__setProperties__(t.properties),t.instance=r,!0===d.dirty){const e=r.__render__();d.rendering=!1,t.rendered=R(e,r),M(s,i,t.rendered,r,o)}else d.rendering=!1,t.rendered=i;h.set(r,{dnode:t,parentVNode:s}),d.nodeHandler.addRoot()}else{if(e===t)return!1;const r=t.domNode=e.domNode;let n=!1,i=!1;if(t.tag||"string"!=typeof t.text){if(t.tag&&0===t.tag.lastIndexOf("svg",0)&&(o=Object.assign({},o,{namespace:a})),e.children!==t.children){const r=R(t.children,s);t.children=r,i=M(t,e.children,r,s,o)||i}const n=function(e,t,o){const{diffType:r,properties:s,attributes:n}=o;if(!r||"vdom"===r)return{properties:t.properties,attributes:t.attributes,events:t.events};if("none"===r)return{properties:{},attributes:t.attributes?{}:void 0,events:t.events};let i={properties:{}};return n?(i.attributes={},i.events=t.events,Object.keys(s).forEach(t=>{i.properties[t]=e[t]}),Object.keys(n).forEach(t=>{i.attributes[t]=e.getAttribute(t)}),i):(i.properties=Object.keys(s).reduce((t,o)=>(t[o]=e.getAttribute(o)||e[o],t),{}),i)}(r,e,t);if(t.attributes&&t.events){O(r,n.attributes,t.attributes,o),i=P(r,n.properties,t.properties,o,!1)||i,v(r,n.events,t.events,o,!0);const e=t.events;Object.keys(e).forEach(s=>{j(r,s,e[s],o,t.properties.bind,n.events[s])})}else i=P(r,n.properties,t.properties,o)||i;if(null!==t.properties.key&&void 0!==t.properties.key){u.get(s).nodeHandler.add(r,`${t.properties.key}`)}}else if(t.text!==e.text){const e=r.ownerDocument.createTextNode(t.text);return r.parentNode.replaceChild(e,r),t.domNode=e,n=!0}i&&t.properties&&t.properties.updateAnimation&&t.properties.updateAnimation(r,t.properties,e.properties)}}function S(e,t){e.decoratedDeferredProperties=e.properties;const o=e.deferredPropertiesCallback(!!e.inserted),r=p.get(t.projectorInstance);e.properties=Object.assign({},o,e.decoratedDeferredProperties),r.deferredRenderCallbacks.push(()=>{const o=Object.assign({},e.deferredPropertiesCallback(!!e.inserted),e.decoratedDeferredProperties);P(e.domNode,e.properties,o,t),e.properties=o})}function L(e){const t=p.get(e.projectorInstance);if(t.deferredRenderCallbacks.length)if(e.sync)for(;t.deferredRenderCallbacks.length;){const e=t.deferredRenderCallbacks.shift();e&&e()}else r.a.requestAnimationFrame(()=>{for(;t.deferredRenderCallbacks.length;){const e=t.deferredRenderCallbacks.shift();e&&e()}})}function W(e){const t=p.get(e.projectorInstance);if(e.sync)for(;t.afterRenderCallbacks.length;){const e=t.afterRenderCallbacks.shift();e&&e()}else r.a.requestIdleCallback?r.a.requestIdleCallback(()=>{for(;t.afterRenderCallbacks.length;){const e=t.afterRenderCallbacks.shift();e&&e()}}):setTimeout(()=>{for(;t.afterRenderCallbacks.length;){const e=t.afterRenderCallbacks.shift();e&&e()}})}function F(e){const t=p.get(e.projectorInstance);e.sync?B(e):void 0===t.renderScheduled&&(t.renderScheduled=r.a.requestAnimationFrame(()=>{B(e)}))}function B(e){const t=p.get(e.projectorInstance);t.renderScheduled=void 0;const o=[...t.renderQueue];t.renderQueue=[],o.sort((e,t)=>e.depth-t.depth);const r=[];for(;o.length;){const{instance:t}=o.shift();if(h.has(t)&&-1===r.indexOf(t)){r.push(t);const{parentVNode:o,dnode:s}=h.get(t);I(s,C(t,u.get(t)),e,0,t)}}W(e),L(e)}const H={append:function(e,t,o={}){const r=u.get(t),s=function(e,t){const o={namespace:void 0,styleApplyer:function(e,t,o){e.style[t]=o},transitions:{enter:f,exit:f},depth:0,merge:!1,sync:!1,projectorInstance:t};return Object.assign({},o,e)}(o,t),i={afterRenderCallbacks:[],deferredRenderCallbacks:[],nodeMap:new d.a,renderScheduled:void 0,renderQueue:[],merge:o.merge||!1,mergeElement:o.mergeElement};p.set(t,i),s.rootNode=e;const a={tag:"",properties:{},children:void 0,domNode:s.rootNode,type:n.a};const c=C(t,r);return h.set(t,{dnode:c,parentVNode:a}),r.invalidate=(()=>{r.dirty=!0,!1===r.rendering&&(i.renderQueue.push({instance:t,depth:s.depth}),F(s))}),I(c,c,s,0,t),i.afterRenderCallbacks.push(()=>{r.onAttach()}),L(s),W(s),{domNode:s.rootNode}},create:function(e,t){return this.append(document.createElement("div"),e,t)},merge:function(e,t,o={}){o.merge=!0,o.mergeElement=e;const r=this.append(e.parentNode,t,o);return p.get(t).merge=!1,r}};t.a=H},"./node_modules/imports-loader/index.js?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js":function(e,t,o){var r=o("./src/menu-item/MenuItem.ts"),s=o("./node_modules/@dojo/widget-core/registerCustomElement.mjs").default,n=r.default;n&&s(n)},"./node_modules/process/browser.js":function(e,t){var o,r,s=e.exports={};function n(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function d(e){if(o===setTimeout)return setTimeout(e,0);if((o===n||!o)&&setTimeout)return o=setTimeout,setTimeout(e,0);try{return o(e,0)}catch(t){try{return o.call(null,e,0)}catch(t){return o.call(this,e,0)}}}!function(){try{o="function"==typeof setTimeout?setTimeout:n}catch(e){o=n}try{r="function"==typeof clearTimeout?clearTimeout:i}catch(e){r=i}}();var a,c=[],l=!1,u=-1;function h(){l&&a&&(l=!1,a.length?c=a.concat(c):u=-1,c.length&&p())}function p(){if(!l){var e=d(h);l=!0;for(var t=c.length;t;){for(a=c,c=[];++u1)for(var o=1;o=0;d--)(s=e[d])&&(i=(n<3?s(i):n>3?s(t,o,i):s(t,o))||i);return n>3&&i&&Object.defineProperty(t,o,i),i},t.b=function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}; +!function(e){var t={};function o(r){if(t[r])return t[r].exports;var s=t[r]={i:r,l:!1,exports:{}};return e[r].call(s.exports,s,s.exports,o),s.l=!0,s.exports}o.m=e,o.c=t,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}({"./node_modules/@dojo/framework/core/Destroyable.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/core/lang.mjs"),s=o("./node_modules/@dojo/framework/shim/Promise.mjs");function n(){return s.a.resolve(!1)}function i(){throw new Error("Call made to destroyed method")}class d{constructor(){this.handles=[]}own(e){const t=Array.isArray(e)?Object(r.b)(...e):e,{handles:o}=this;return o.push(t),{destroy(){o.splice(o.indexOf(t)),t.destroy()}}}destroy(){return new s.a(e=>{this.handles.forEach(e=>{e&&e.destroy&&e.destroy()}),this.destroy=n,this.own=i,e(!0)})}}t.a=d},"./node_modules/@dojo/framework/core/Evented.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/Map.mjs"),s=o("./node_modules/@dojo/framework/core/Destroyable.mjs");const n=new r.b;class i extends s.a{constructor(){super(...arguments),this.listenersMap=new r.b}emit(e){this.listenersMap.forEach((t,o)=>{(function(e,t){if("string"==typeof t&&"string"==typeof e&&-1!==e.indexOf("*")){let o;return n.has(e)?o=n.get(e):(o=new RegExp(`^${e.replace(/\*/g,".*")}$`),n.set(e,o)),o.test(t)}return e===t})(o,e.type)&&[...t].forEach(t=>{t.call(this,e)})})}on(e,t){if(Array.isArray(t)){const o=t.map(t=>this._addListener(e,t));return{destroy(){o.forEach(e=>e.destroy())}}}return this._addListener(e,t)}_addListener(e,t){const o=this.listenersMap.get(e)||[];return o.push(t),this.listenersMap.set(e,o),{destroy:()=>{const o=this.listenersMap.get(e)||[];o.splice(o.indexOf(t),1)}}}}t.a=i},"./node_modules/@dojo/framework/core/lang.mjs":function(e,t,o){"use strict";t.b=function(...e){return function(e){let t=!1;return{destroy:function(){t||(t=!0,e())}}}(function(){for(let t=0;t{r[e]=t,delete n[e]},()=>{delete n[e]})}function l(e){let t;const o=e.toLowerCase();if(o in a)t=a[o];else if(s[o])t=r[o]=s[o].call(null),delete s[o];else{if(!(o in r)){if(e in n)return!1;throw new TypeError(`Attempt to detect unregistered has feature "${e}"`)}t=r[o]}return t}c("debug",!0),c("host-browser","undefined"!=typeof document&&"undefined"!=typeof location),c("host-node",function(){if("object"==typeof o&&o.versions&&o.versions.node)return o.versions.node})}).call(t,o("./node_modules/webpack/buildin/global.js"),o("./node_modules/process/browser.js"))},"./node_modules/@dojo/framework/shim/Map.mjs":function(e,t,o){"use strict";o.d(t,"a",function(){return s});o("./node_modules/@dojo/framework/shim/iterator.mjs");var r=o("./node_modules/@dojo/framework/shim/global.mjs");o("./node_modules/@dojo/framework/shim/object.mjs"),o("./node_modules/@dojo/framework/shim/support/has.mjs"),o("./node_modules/@dojo/framework/shim/Symbol.mjs");let s=r.a.Map;t.b=s},"./node_modules/@dojo/framework/shim/Promise.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/global.mjs");o("./node_modules/@dojo/framework/shim/support/queue.mjs"),o("./node_modules/@dojo/framework/shim/Symbol.mjs"),o("./node_modules/@dojo/framework/shim/support/has.mjs");let s=r.a.Promise;t.a=s},"./node_modules/@dojo/framework/shim/Symbol.mjs":function(e,t,o){"use strict";o("./node_modules/@dojo/framework/shim/support/has.mjs");var r=o("./node_modules/@dojo/framework/shim/global.mjs"),s=o("./node_modules/@dojo/framework/shim/support/util.mjs");let n=r.a.Symbol;["hasInstance","isConcatSpreadable","iterator","species","replace","search","split","match","toPrimitive","toStringTag","unscopables","observable"].forEach(e=>{n[e]||Object.defineProperty(n,e,Object(s.a)(n.for(e),!1,!1))}),t.a=n},"./node_modules/@dojo/framework/shim/WeakMap.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/global.mjs");o("./node_modules/@dojo/framework/shim/iterator.mjs"),o("./node_modules/@dojo/framework/shim/support/has.mjs"),o("./node_modules/@dojo/framework/shim/Symbol.mjs");let s=r.a.WeakMap;t.a=s},"./node_modules/@dojo/framework/shim/array.mjs":function(e,t,o){"use strict";o.d(t,"a",function(){return n});var r=o("./node_modules/@dojo/framework/shim/global.mjs"),s=(o("./node_modules/@dojo/framework/shim/iterator.mjs"),o("./node_modules/@dojo/framework/shim/number.mjs"),o("./node_modules/@dojo/framework/shim/support/has.mjs"),o("./node_modules/@dojo/framework/shim/support/util.mjs"));let n,i,d,a,c,l,u;n=r.a.Array.from,i=r.a.Array.of,d=Object(s.b)(r.a.Array.prototype.copyWithin),a=Object(s.b)(r.a.Array.prototype.fill),c=Object(s.b)(r.a.Array.prototype.find),l=Object(s.b)(r.a.Array.prototype.findIndex),u=Object(s.b)(r.a.Array.prototype.includes)},"./node_modules/@dojo/framework/shim/global.mjs":function(e,t,o){"use strict";(function(e){const o=void 0!==e?e:"undefined"!=typeof window?window:"undefined"!=typeof self?self:void 0;t.a=o}).call(t,o("./node_modules/webpack/buildin/global.js"))},"./node_modules/@dojo/framework/shim/iterator.mjs":function(e,t,o){"use strict";o("./node_modules/@dojo/framework/shim/Symbol.mjs"),o("./node_modules/@dojo/framework/shim/string.mjs")},"./node_modules/@dojo/framework/shim/number.mjs":function(e,t,o){"use strict";o("./node_modules/@dojo/framework/shim/global.mjs");Math.pow(2,53)},"./node_modules/@dojo/framework/shim/object.mjs":function(e,t,o){"use strict";o.d(t,"a",function(){return s});var r=o("./node_modules/@dojo/framework/shim/global.mjs");o("./node_modules/@dojo/framework/shim/support/has.mjs"),o("./node_modules/@dojo/framework/shim/Symbol.mjs");let s,n,i,d,a,c,l,u,m;{const e=r.a.Object;s=e.assign,n=e.getOwnPropertyDescriptor,i=e.getOwnPropertyNames,d=e.getOwnPropertySymbols,a=e.is,c=e.keys}{const e=r.a.Object;l=e.getOwnPropertyDescriptors,u=e.entries,m=e.values}},"./node_modules/@dojo/framework/shim/string.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/global.mjs"),s=(o("./node_modules/@dojo/framework/shim/support/has.mjs"),o("./node_modules/@dojo/framework/shim/support/util.mjs"));t.b=55296;t.a=56319;let n,i,d,a,c,l,u,m,h,p;n=r.a.String.fromCodePoint,i=r.a.String.raw,d=Object(s.b)(r.a.String.prototype.codePointAt),a=Object(s.b)(r.a.String.prototype.endsWith),c=Object(s.b)(r.a.String.prototype.includes),l=Object(s.b)(r.a.String.prototype.normalize),u=Object(s.b)(r.a.String.prototype.repeat),m=Object(s.b)(r.a.String.prototype.startsWith),h=Object(s.b)(r.a.String.prototype.padEnd),p=Object(s.b)(r.a.String.prototype.padStart)},"./node_modules/@dojo/framework/shim/support/has.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/has/has.mjs"),s=o("./node_modules/@dojo/framework/shim/global.mjs");r.b;Object(r.a)("es6-array",()=>["from","of"].every(e=>e in s.a.Array)&&["findIndex","find","copyWithin"].every(e=>e in s.a.Array.prototype),!0),Object(r.a)("es6-array-fill",()=>"fill"in s.a.Array.prototype&&1===[1].fill(9,Number.POSITIVE_INFINITY)[0],!0),Object(r.a)("es7-array",()=>"includes"in s.a.Array.prototype,!0),Object(r.a)("es6-map",()=>{if("function"==typeof s.a.Map)try{const e=new s.a.Map([[0,1]]);return e.has(0)&&"function"==typeof e.keys&&"function"==typeof e.values&&"function"==typeof e.entries}catch(e){return!1}return!1},!0),Object(r.a)("es6-math",()=>["clz32","sign","log10","log2","log1p","expm1","cosh","sinh","tanh","acosh","asinh","atanh","trunc","fround","cbrt","hypot"].every(e=>"function"==typeof s.a.Math[e]),!0),Object(r.a)("es6-math-imul",()=>"imul"in s.a.Math&&-5===Math.imul(4294967295,5),!0),Object(r.a)("es6-object",()=>["assign","is","getOwnPropertySymbols","setPrototypeOf"].every(e=>"function"==typeof s.a.Object[e]),!0),Object(r.a)("es2017-object",()=>["values","entries","getOwnPropertyDescriptors"].every(e=>"function"==typeof s.a.Object[e]),!0),Object(r.a)("es-observable",()=>void 0!==s.a.Observable,!0),Object(r.a)("es6-promise",()=>void 0!==s.a.Promise&&!0,!0),Object(r.a)("es6-set",()=>{if("function"==typeof s.a.Set){const e=new s.a.Set([1]);return e.has(1)&&"keys"in e&&"function"==typeof e.keys&&!0}return!1},!0),Object(r.a)("es6-string",()=>["fromCodePoint"].every(e=>"function"==typeof s.a.String[e])&&["codePointAt","normalize","repeat","startsWith","endsWith","includes"].every(e=>"function"==typeof s.a.String.prototype[e]),!0),Object(r.a)("es6-string-raw",()=>{function e(e,...t){const o=[...e];return o.raw=e.raw,o}if("raw"in s.a.String){let t=e`a\n${1}`;return t.raw=["a\\n"],"a:\\n"===s.a.String.raw(t,42)}return!1},!0),Object(r.a)("es2017-string",()=>["padStart","padEnd"].every(e=>"function"==typeof s.a.String.prototype[e]),!0),Object(r.a)("es6-symbol",()=>void 0!==s.a.Symbol&&"symbol"==typeof Symbol(),!0),Object(r.a)("es6-weakmap",()=>{if(void 0!==s.a.WeakMap){const e={},t={},o=new s.a.WeakMap([[e,1]]);return Object.freeze(e),1===o.get(e)&&o.set(t,2)===o&&!0}return!1},!0),Object(r.a)("microtasks",()=>!0,!0),Object(r.a)("postmessage",()=>void 0!==s.a.window&&"function"==typeof s.a.postMessage,!0),Object(r.a)("raf",()=>"function"==typeof s.a.requestAnimationFrame,!0),Object(r.a)("setimmediate",()=>void 0!==s.a.setImmediate,!0),Object(r.a)("dom-mutationobserver",()=>{if(Boolean(s.a.MutationObserver||s.a.WebKitMutationObserver)){const e=document.createElement("div"),t=new(s.a.MutationObserver||s.a.WebKitMutationObserver)(function(){});return t.observe(e,{attributes:!0}),e.style.setProperty("display","block"),Boolean(t.takeRecords().length)}return!1},!0),Object(r.a)("dom-webanimation",()=>void 0!==s.a.Animation&&void 0!==s.a.KeyframeEffect,!0)},"./node_modules/@dojo/framework/shim/support/queue.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/global.mjs");o("./node_modules/@dojo/framework/shim/support/has.mjs");function s(e){e&&e.isActive&&e.callback&&e.callback()}function n(e,t){return{destroy:function(){this.destroy=function(){},e.isActive=!1,e.callback=null,t&&t()}}}!function(){let e,t;{const e=[];r.a.addEventListener("message",function(t){t.source===r.a&&"dojo-queue-message"===t.data&&(t.stopPropagation(),e.length&&s(e.shift()))}),t=function(t){e.push(t),r.a.postMessage("dojo-queue-message","*")}}function o(o){const r={isActive:!0,callback:o},s=t(r);return n(r,e&&function(){e(s)})}}();!function(){function e(e){const t={isActive:!0,callback:e},o=requestAnimationFrame(s.bind(null,t));return n(t,function(){cancelAnimationFrame(o)})}}();!function(){let e;e=function(e){r.a.Promise.resolve(e).then(s)}}()},"./node_modules/@dojo/framework/shim/support/util.mjs":function(e,t,o){"use strict";t.a=function(e,t=!1,o=!0,r=!0){return{value:e,enumerable:t,writable:o,configurable:r}},t.b=function(e){return function(t,...o){return e.apply(t,o)}}},"./node_modules/@dojo/framework/widget-core/Injector.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/core/Evented.mjs");class s extends r.a{constructor(e){super(),this._payload=e}setInvalidator(e){this._invalidator=e}get(){return this._payload}set(e){this._payload=e,this._invalidator&&this._invalidator()}}t.a=s},"./node_modules/@dojo/framework/widget-core/NodeHandler.mjs":function(e,t,o){"use strict";var r,s=o("./node_modules/@dojo/framework/core/Evented.mjs"),n=o("./node_modules/@dojo/framework/shim/Map.mjs");!function(e){e.Projector="Projector",e.Widget="Widget"}(r||(r={}));t.a=class extends s.a{constructor(){super(...arguments),this._nodeMap=new n.b}get(e){return this._nodeMap.get(e)}has(e){return this._nodeMap.has(e)}add(e,t){this._nodeMap.set(t,e),this.emit({type:t})}addRoot(){this.emit({type:r.Widget})}addProjector(){this.emit({type:r.Projector})}clear(){this._nodeMap.clear()}}},"./node_modules/@dojo/framework/widget-core/Registry.mjs":function(e,t,o){"use strict";t.d=a;var r=o("./node_modules/@dojo/framework/shim/Promise.mjs"),s=o("./node_modules/@dojo/framework/shim/Map.mjs"),n=o("./node_modules/@dojo/framework/shim/Symbol.mjs"),i=o("./node_modules/@dojo/framework/core/Evented.mjs");const d=Object(n.a)("Widget Base");function a(e){return Boolean(e&&e._type===d)}t.b=d;class c extends i.a{emitLoadedEvent(e,t){this.emit({type:e,action:"loaded",item:t})}define(e,t){if(void 0===this._widgetRegistry&&(this._widgetRegistry=new s.b),this._widgetRegistry.has(e))throw new Error(`widget has already been registered for '${e.toString()}'`);this._widgetRegistry.set(e,t),t instanceof r.a?t.then(t=>(this._widgetRegistry.set(e,t),this.emitLoadedEvent(e,t),t),e=>{throw e}):a(t)&&this.emitLoadedEvent(e,t)}defineInjector(e,t){if(void 0===this._injectorRegistry&&(this._injectorRegistry=new s.b),this._injectorRegistry.has(e))throw new Error(`injector has already been registered for '${e.toString()}'`);const o=new i.a,r={injector:t(()=>o.emit({type:"invalidate"})),invalidator:o};this._injectorRegistry.set(e,r),this.emitLoadedEvent(e,r)}get(e){if(!this._widgetRegistry||!this.has(e))return null;const t=this._widgetRegistry.get(e);if(a(t))return t;if(t instanceof r.a)return null;const o=t();return this._widgetRegistry.set(e,o),o.then(t=>((function(e){return Boolean(e&&e.hasOwnProperty("__esModule")&&e.hasOwnProperty("default")&&a(e.default))})(t)&&(t=t.default),this._widgetRegistry.set(e,t),this.emitLoadedEvent(e,t),t),e=>{throw e}),null}getInjector(e){return this._injectorRegistry&&this.hasInjector(e)?this._injectorRegistry.get(e):null}has(e){return Boolean(this._widgetRegistry&&this._widgetRegistry.has(e))}hasInjector(e){return Boolean(this._injectorRegistry&&this._injectorRegistry.has(e))}}t.a=c,t.c=c},"./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/Map.mjs"),s=o("./node_modules/@dojo/framework/core/Evented.mjs"),n=o("./node_modules/@dojo/framework/widget-core/Registry.mjs");t.a=class extends s.a{constructor(){super(),this._registry=new n.a,this._registryWidgetLabelMap=new r.a,this._registryInjectorLabelMap=new r.a,this.own(this._registry),this.own({destroy:()=>{this.baseRegistry&&(this._registryWidgetLabelMap.delete(this.baseRegistry),this._registryInjectorLabelMap.delete(this.baseRegistry),this.baseRegistry=void 0)}})}set base(e){this.baseRegistry&&(this._registryWidgetLabelMap.delete(this.baseRegistry),this._registryInjectorLabelMap.delete(this.baseRegistry)),this.baseRegistry=e}define(e,t){this._registry.define(e,t)}defineInjector(e,t){this._registry.defineInjector(e,t)}has(e){return this._registry.has(e)||Boolean(this.baseRegistry&&this.baseRegistry.has(e))}hasInjector(e){return this._registry.hasInjector(e)||Boolean(this.baseRegistry&&this.baseRegistry.hasInjector(e))}get(e,t=!1){return this._get(e,t,"get",this._registryWidgetLabelMap)}getInjector(e,t=!1){return this._get(e,t,"getInjector",this._registryInjectorLabelMap)}_get(e,t,o,r){const s=t?[this.baseRegistry,this._registry]:[this._registry,this.baseRegistry];for(let n=0;n{"loaded"===r.action&&this[o](e,t)===r.item&&this.emit({type:"invalidate"})});this.own(s),r.set(i,[...a,e])}}return null}}},"./node_modules/@dojo/framework/widget-core/WidgetBase.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/Map.mjs"),s=o("./node_modules/@dojo/framework/shim/WeakMap.mjs"),n=o("./node_modules/@dojo/framework/shim/Symbol.mjs"),i=o("./node_modules/@dojo/framework/widget-core/d.mjs"),d=o("./node_modules/@dojo/framework/widget-core/diff.mjs"),a=o("./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs"),c=o("./node_modules/@dojo/framework/widget-core/NodeHandler.mjs"),l=o("./node_modules/@dojo/framework/widget-core/vdom.mjs"),u=o("./node_modules/@dojo/framework/widget-core/Registry.mjs");const m=new r.b,h=d.a.bind(null),p=n.a.for("dojoNoBind");t.b=p;class f{constructor(){this._initialProperties=!0,this._changedPropertyKeys=[],this._nodeHandler=new c.a,this._handles=[],this._children=[],this._decoratorCache=new r.b,this._properties={},this._boundRenderFunc=this.render.bind(this),this._boundInvalidate=this.invalidate.bind(this),l.b.set(this,{dirty:!0,onAttach:()=>{this.onAttach()},onDetach:()=>{this.onDetach(),this.destroy()},nodeHandler:this._nodeHandler,registry:()=>this.registry,coreProperties:{},rendering:!1,inputProperties:{}}),this._runAfterConstructors()}meta(e){void 0===this._metaMap&&(this._metaMap=new r.b);let t=this._metaMap.get(e);return t||(t=new e({invalidate:this._boundInvalidate,nodeHandler:this._nodeHandler,bind:this}),this.own(t),this._metaMap.set(e,t)),t}onAttach(){}onDetach(){}get properties(){return this._properties}get changedPropertyKeys(){return[...this._changedPropertyKeys]}__setCoreProperties__(e){const{baseRegistry:t}=e,o=l.b.get(this);o.coreProperties.baseRegistry!==t&&(void 0===this._registry&&(this._registry=new a.a,this.own(this._registry),this.own(this._registry.on("invalidate",this._boundInvalidate))),this._registry.base=t,this.invalidate()),o.coreProperties=e}__setProperties__(e){const t=l.b.get(this);t.inputProperties=e;const o=this._runBeforeProperties(e),r=this.getDecorator("registeredDiffProperty"),s=[],n=Object.keys(o);if(!1===this._initialProperties||0!==r.length){const e=[...n,...Object.keys(this._properties)],i=[],d={};let a=!1;for(let n=0;n{const r=-1!==s.indexOf(o),n=-1!==e.indexOf(t);r&&!n&&(t.call(this,this._properties,d),e.push(t))})}this._properties=d,this._changedPropertyKeys=s}else{this._initialProperties=!1;for(let e=0;e0&&this.invalidate()}get children(){return this._children}__setChildren__(e){(this._children.length>0||e.length>0)&&(this._children=e,this.invalidate())}__render__(){l.b.get(this).dirty=!1;let e=this._runBeforeRenders()();return e=this.runAfterRenders(e),this._nodeHandler.clear(),e}invalidate(){const e=l.b.get(this);e.invalidate&&e.invalidate()}render(){return Object(i.g)("div",{},this.children)}addDecorator(e,t){if(t=Array.isArray(t)?t:[t],this.hasOwnProperty("constructor")){let o=m.get(this.constructor);o||(o=new r.b,m.set(this.constructor,o));let s=o.get(e);s||(s=[],o.set(e,s)),s.push(...t)}else{const o=this.getDecorator(e);this._decoratorCache.set(e,[...o,...t])}}_buildDecoratorList(e){const t=[];let o=this.constructor;for(;o;){const r=m.get(o);if(r){const o=r.get(e);o&&t.unshift(...o)}o=Object.getPrototypeOf(o)}return t}getDecorator(e){let t=this._decoratorCache.get(e);return void 0!==t?t:(t=this._buildDecoratorList(e),this._decoratorCache.set(e,t),t)}_bindFunctionProperty(e,t){if("function"==typeof e&&!e[p]&&!1===Object(u.d)(e)){void 0===this._bindFunctionPropertyMap&&(this._bindFunctionPropertyMap=new s.a);const o=this._bindFunctionPropertyMap.get(e)||{};let{boundFunc:r,scope:n}=o;return void 0!==r&&n===t||(r=e.bind(t),this._bindFunctionPropertyMap.set(e,{boundFunc:r,scope:t})),r}return e}get registry(){return void 0===this._registry&&(this._registry=new a.a,this.own(this._registry),this.own(this._registry.on("invalidate",this._boundInvalidate))),this._registry}_runBeforeProperties(e){const t=this.getDecorator("beforeProperties");return t.length>0?t.reduce((e,t)=>Object.assign({},e,t.call(this,e)),Object.assign({},e)):e}_runBeforeRenders(){const e=this.getDecorator("beforeRender");return e.length>0?e.reduce((e,t)=>{const o=t.call(this,e,this._properties,this._children);return o||(console.warn("Render function not returned from beforeRender, using previous render"),e)},this._boundRenderFunc):this._boundRenderFunc}runAfterRenders(e){const t=this.getDecorator("afterRender");return t.length>0&&(e=t.reduce((e,t)=>t.call(this,e),e)),void 0!==this._metaMap&&this._metaMap.forEach(e=>{e.afterRender()}),e}_runAfterConstructors(){const e=this.getDecorator("afterConstructor");e.length>0&&e.forEach(e=>e.call(this))}own(e){this._handles.push(e)}destroy(){for(;this._handles.length>0;){const e=this._handles.pop();e&&e.destroy()}}}t.a=f,f._type=u.b},"./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs":function(e,t,o){"use strict";let r="",s="";function n(e){""===s&&function(e){if("WebkitTransition"in e.style)r="webkitTransitionEnd",s="webkitAnimationEnd";else{if(!("transition"in e.style||"MozTransition"in e.style))throw new Error("Your browser is not supported");r="transitionend",s="animationend"}}(e)}function i(e,t,o){n(e);let i=!1,d=function(){i||(i=!0,e.removeEventListener(r,d),e.removeEventListener(s,d),o())};t(),e.addEventListener(s,d),e.addEventListener(r,d)}t.a={enter:function(e,t,o){const r=t.enterAnimationActive||`${o}-active`;i(e,()=>{e.classList.add(o),requestAnimationFrame(function(){e.classList.add(r)})},()=>{e.classList.remove(o),e.classList.remove(r)})},exit:function(e,t,o,r){const s=t.exitAnimationActive||`${o}-active`;i(e,()=>{e.classList.add(o),requestAnimationFrame(function(){e.classList.add(s)})},()=>{r()})}}},"./node_modules/@dojo/framework/widget-core/d.mjs":function(e,t,o){"use strict";t.f=d,t.e=a,t.d=function(e){return Boolean(e&&"string"!=typeof e&&e.type===i)},t.h=function(e,t,o=[]){return{children:o,widgetConstructor:e,properties:t,type:s}},t.g=function(e,t={},o){let r,s=t;Array.isArray(t)&&(o=t,s={});"function"==typeof s&&(r=s,s={});return{tag:e,deferredPropertiesCallback:r,children:o,properties:s,type:n}},t.c=function({node:e,attrs:t={},props:o={},on:r={},diffType:s="none"},n){return{tag:c(e)?e.tagName.toLowerCase():"",properties:o,attributes:t,events:r,children:n,type:i,domNode:e,text:c(e)?void 0:e.data,diffType:s}};var r=o("./node_modules/@dojo/framework/shim/Symbol.mjs");const s=Object(r.a)("Identifier for a WNode.");t.b=s;const n=Object(r.a)("Identifier for a VNode.");t.a=n;const i=Object(r.a)("Identifier for a VNode created using existing dom.");function d(e){return Boolean(e&&"string"!=typeof e&&e.type===s)}function a(e){return Boolean(e&&"string"!=typeof e&&(e.type===n||e.type===i))}function c(e){return!!e.tagName}},"./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs":function(e,t,o){"use strict";t.a=s;var r=o("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs");function s(e){return Object(r.a)((t,o)=>{t.addDecorator("afterRender",o?t[o]:e)})}},"./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs":function(e,t,o){"use strict";t.a=n;var r=o("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"),s=o("./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs");function n(){return Object(r.a)((e,t)=>{Object(s.a)(function(){this.invalidate()})(e)})}},"./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs":function(e,t,o){"use strict";t.a=s;var r=o("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs");function s(e){return Object(r.a)((t,o)=>{t.addDecorator("beforeProperties",o?t[o]:e)})}},"./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs":function(e,t,o){"use strict";t.a=n;var r=o("./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs"),s=o("./node_modules/@dojo/framework/widget-core/Registry.mjs");function n({tag:e,properties:t=[],attributes:o=[],events:n=[],childType:i=r.CustomElementChildType.DOJO,registryFactory:d=(()=>new s.c)}){return function(r){r.prototype.__customElementDescriptor={tagName:e,attributes:o,properties:t,events:n,childType:i,registryFactory:d}}}},"./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs":function(e,t,o){"use strict";t.a=n;var r=o("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"),s=o("./node_modules/@dojo/framework/widget-core/diff.mjs");function n(e,t=s.a,o){return Object(r.a)((r,s)=>{r.addDecorator(`diffProperty:${e}`,t.bind(null)),r.addDecorator("registeredDiffProperty",e),(o||s)&&r.addDecorator("diffReaction",{propertyName:e,reaction:s?r[s]:o})})}},"./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs":function(e,t,o){"use strict";function r(e){return function(t,o,r){"function"==typeof t?e(t.prototype,void 0):e(t,o)}}t.a=r},"./node_modules/@dojo/framework/widget-core/decorators/inject.mjs":function(e,t,o){"use strict";t.a=d;var r=o("./node_modules/@dojo/framework/shim/WeakMap.mjs"),s=o("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"),n=o("./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs");const i=new r.a;function d({name:e,getProperties:t}){return Object(s.a)((o,r)=>{Object(n.a)(function(o){const r=this.registry.getInjector(e);if(r){const{injector:e,invalidator:s}=r,n=i.get(this)||[];return 0===n.length&&i.set(this,n),-1===n.indexOf(r)&&(this.own(s.on("invalidate",()=>{this.invalidate()})),n.push(r)),t(e(),o)}})(o)})}},"./node_modules/@dojo/framework/widget-core/diff.mjs":function(e,t,o){"use strict";t.b=i,t.a=function(e,t){let o;o="function"==typeof t?t._type===r.b?n(e,t):function(e,t){return{changed:!1,value:t}}(0,t):s(t)?i(e,t):n(e,t);return o};var r=o("./node_modules/@dojo/framework/widget-core/Registry.mjs");function s(e){return"[object Object]"===Object.prototype.toString.call(e)||Array.isArray(e)}function n(e,t){return{changed:e!==t,value:t}}function i(e,t){let o=!1;const r=e&&s(e),n=t&&s(t);if(!r||!n)return{changed:!0,value:t};const i=Object.keys(e),d=Object.keys(t);return{changed:o=i.length!==d.length||d.some(o=>t[o]!==e[o]),value:t}}},"./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs":function(e,t,o){"use strict";t.a=u;var r,s,n=o("./node_modules/tslib/tslib.es6.js"),i=o("./node_modules/@dojo/framework/core/lang.mjs"),d=o("./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs"),a=o("./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs"),c=o("./node_modules/@dojo/framework/widget-core/d.mjs"),l=o("./node_modules/@dojo/framework/widget-core/vdom.mjs");function u(e){class t extends e{constructor(...e){super(...e),this._root=document.body,this._async=!0,this._projectorProperties={},this._projectionOptions={transitions:d.a},this.root=document.body,this.projectorState=r.Detached}append(e){const t={type:s.Append,root:e};return this._attach(t)}merge(e){const t={type:s.Merge,root:e};return this._attach(t)}set root(e){if(this.projectorState===r.Attached)throw new Error("Projector already attached, cannot change root element");this._root=e}get root(){return this._root}get async(){return this._async}set async(e){if(this.projectorState===r.Attached)throw new Error("Projector already attached, cannot change async mode");this._async=e}sandbox(e=document){if(this.projectorState===r.Attached)throw new Error("Projector already attached, cannot create sandbox");this._async=!1;const t=this.root;this.own({destroy:()=>{this._root=t}}),this._attach({root:e.createDocumentFragment(),type:s.Append})}setChildren(e){this.__setChildren__(e)}setProperties(e){this.__setProperties__(e)}__setProperties__(e){this._projectorProperties&&this._projectorProperties.registry!==e.registry&&this._projectorProperties.registry&&this._projectorProperties.registry.destroy(),this._projectorProperties=Object(i.a)({},e),super.__setCoreProperties__({bind:this,baseRegistry:e.registry}),super.__setProperties__(e)}toHtml(){if(this.projectorState!==r.Attached||!this._projection)throw new Error("Projector is not attached, cannot return an HTML string of projection.");return this._projection.domNode.childNodes[0].outerHTML}afterRender(e){let t=e;return"string"!=typeof e&&null!==e&&void 0!==e||(t=Object(c.g)("span",{},[e])),t}destroy(){super.destroy()}_attach({type:e,root:t}){if(t&&(this.root=t),this._attachHandle)return this._attachHandle;this.projectorState=r.Attached;const o={destroy:()=>{this.projectorState===r.Attached&&(this._projection=void 0,this.projectorState=r.Detached)}};switch(this.own(o),this._attachHandle=o,this._projectionOptions=Object.assign({},this._projectionOptions,{sync:!this._async}),e){case s.Append:this._projection=l.a.append(this.root,this,this._projectionOptions);break;case s.Merge:this._projection=l.a.merge(this.root,this,this._projectionOptions)}return this._attachHandle}}return n.a([Object(a.a)()],t.prototype,"afterRender",null),t}!function(e){e[e.Attached=1]="Attached",e[e.Detached=2]="Detached"}(r||(r={})),function(e){e[e.Append=1]="Append",e[e.Merge=2]="Merge"}(s||(s={}))},"./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs":function(e,t,o){"use strict";t.c=function(e){return Object(i.a)(t=>{t.addDecorator("baseThemeClasses",e)})},t.b=function(e,t){const o=new s.a(e);return t.defineInjector(l,e=>(o.setInvalidator(e),()=>o.get())),o},t.a=u;var r=o("./node_modules/tslib/tslib.es6.js"),s=o("./node_modules/@dojo/framework/widget-core/Injector.mjs"),n=o("./node_modules/@dojo/framework/widget-core/decorators/inject.mjs"),i=o("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"),d=o("./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs"),a=o("./node_modules/@dojo/framework/widget-core/diff.mjs");const c=" _key",l=Symbol("theme");function u(e){let t=class extends e{constructor(){super(...arguments),this._registeredBaseThemeKeys=[],this._recalculateClasses=!0,this._theme={}}theme(e){return this._recalculateClasses&&this._recalculateThemeClasses(),Array.isArray(e)?e.map(e=>this._getThemeClass(e)):this._getThemeClass(e)}onPropertiesChanged(){this._recalculateClasses=!0}_getThemeClass(e){if(void 0===e||null===e)return e;const t=this.properties.extraClasses||{},o=this._baseThemeClassesReverseLookup[e];let r=[];return o?(t[o]&&r.push(t[o]),this._theme[o]?r.push(this._theme[o]):r.push(this._registeredBaseTheme[o]),r.join(" ")):(console.warn(`Class name: '${e}' not found in theme`),null)}_recalculateThemeClasses(){const{theme:e={}}=this.properties,t=this.getDecorator("baseThemeClasses");this._registeredBaseTheme||(this._registeredBaseTheme=t.reduce((e,t)=>{const o=c,s=t[o],n=r.b(t,["symbol"==typeof o?o:o+""]);return this._registeredBaseThemeKeys.push(s),Object.assign({},e,n)},{}),this._baseThemeClassesReverseLookup=t.reduce((e,t)=>(Object.keys(t).forEach(o=>{e[t[o]]=o}),e),{})),this._theme=this._registeredBaseThemeKeys.reduce((t,o)=>Object.assign({},t,e[o]),{}),this._recalculateClasses=!1}};return r.a([Object(d.a)("theme",a.b),Object(d.a)("extraClasses",a.b)],t.prototype,"onPropertiesChanged",null),t=r.a([Object(n.a)({name:l,getProperties:(e,t)=>t.theme?{}:{theme:e}})],t)}},"./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs":function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),o.d(t,"CustomElementChildType",function(){return r}),t.DomToWidgetWrapper=m,t.create=h,t.register=p;var r,s=o("./node_modules/tslib/tslib.es6.js"),n=o("./node_modules/@dojo/framework/widget-core/WidgetBase.mjs"),i=o("./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs"),d=o("./node_modules/@dojo/framework/shim/array.mjs"),a=o("./node_modules/@dojo/framework/widget-core/d.mjs"),c=o("./node_modules/@dojo/framework/shim/global.mjs"),l=o("./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs"),u=o("./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs");function m(e){let t=class extends n.a{render(){const t=Object.keys(this.properties).reduce((e,t)=>{const o=this.properties[t];return 0===t.indexOf("on")&&(t=`__${t}`),e[t]=o,e},{});return Object(a.c)({node:e,props:t,diffType:"dom"})}static get domNode(){return e}};return t=s.a([Object(u.a)()],t)}function h(e,t){const{attributes:o,childType:s,registryFactory:u}=e,h={};return o.forEach(e=>{const t=e.toLowerCase();h[t]=e}),class extends HTMLElement{constructor(){super(...arguments),this._properties={},this._children=[],this._eventProperties={},this._initialised=!1}connectedCallback(){if(this._initialised)return;const o={},{attributes:h,properties:p,events:f}=e;this._properties=Object.assign({},this._properties,this._attributesToProperties(h)),[...h,...p].forEach(e=>{const t=this[e],r=e.replace(/^on/,"__");void 0!==t&&(this._properties[e]=t),r!==e&&(o[r]={get:()=>this._getProperty(e),set:t=>this._setProperty(e,t)}),o[e]={get:()=>this._getProperty(e),set:t=>this._setProperty(e,t)}}),f.forEach(e=>{const t=e.replace(/^on/,"").toLowerCase(),r=e.replace(/^on/,"__on");o[r]={get:()=>this._getEventProperty(e),set:t=>this._setEventProperty(e,t)},this._eventProperties[e]=void 0,this._properties[e]=((...o)=>{const r=this._getEventProperty(e);"function"==typeof r&&r(...o),this.dispatchEvent(new CustomEvent(t,{bubbles:!1,detail:o}))})}),Object.defineProperties(this,o);const g=s===r.TEXT?this.childNodes:this.children;Object(d.a)(g).forEach(e=>{s===r.DOJO?(e.addEventListener("dojo-ce-render",()=>this._render()),e.addEventListener("dojo-ce-connected",()=>this._render()),this._children.push(m(e))):this._children.push(Object(a.c)({node:e,diffType:"dom"}))}),this.addEventListener("dojo-ce-connected",e=>this._childConnected(e));const j=this._properties,_=()=>this.__children__(),y=u(),b=Object(l.b)(this._getTheme(),y);c.a.addEventListener("dojo-theme-set",()=>b.set(this._getTheme()));const w=Object(i.a)(class extends n.a{render(){return Object(a.h)(t,j,_())}});this._projector=new w,this._projector.setProperties({registry:y}),this._projector.append(this),this._initialised=!0,this.dispatchEvent(new CustomEvent("dojo-ce-connected",{bubbles:!0,detail:this}))}_getTheme(){if(c.a&&c.a.dojoce&&c.a.dojoce.theme)return c.a.dojoce.themes[c.a.dojoce.theme]}_childConnected(e){const t=e.detail;if(t.parentNode===this){this._children.some(e=>e.domNode===t)||(t.addEventListener("dojo-ce-render",()=>this._render()),this._children.push(m(t)),this._render())}}_render(){this._projector&&(this._projector.invalidate(),this.dispatchEvent(new CustomEvent("dojo-ce-render",{bubbles:!1,detail:this})))}__properties__(){return Object.assign({},this._properties,this._eventProperties)}__children__(){return s===r.DOJO?this._children.filter(e=>e.domNode.isWidget).map(e=>{const{domNode:t}=e;return Object(a.h)(e,Object.assign({},t.__properties__()),[...t.__children__()])}):this._children}attributeChangedCallback(e,t,o){const r=h[e];this._setProperty(r,o)}_setEventProperty(e,t){this._eventProperties[e]=t}_getEventProperty(e){return this._eventProperties[e]}_setProperty(e,t){"function"==typeof t&&(t[n.b]=!0),this._properties[e]=t,this._render()}_getProperty(e){return this._properties[e]}_attributesToProperties(e){return e.reduce((e,t)=>{const o=t.toLowerCase(),r=this.getAttribute(o);return null!==r&&(e[t]=r),e},{})}static get observedAttributes(){return Object.keys(h)}get isWidget(){return!0}}}function p(e){const t=e.prototype&&e.prototype.__customElementDescriptor;if(!t)throw new Error("Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?");c.a.customElements.define(t.tagName,h(t,e))}!function(e){e.DOJO="DOJO",e.NODE="NODE",e.TEXT="TEXT"}(r||(r={})),t.default=p},"./node_modules/@dojo/framework/widget-core/vdom.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/global.mjs"),s=o("./node_modules/@dojo/framework/shim/array.mjs"),n=o("./node_modules/@dojo/framework/widget-core/d.mjs"),i=o("./node_modules/@dojo/framework/widget-core/Registry.mjs"),d=o("./node_modules/@dojo/framework/shim/WeakMap.mjs");const a="http://www.w3.org/2000/svg",c="http://www.w3.org/1999/xlink",l=[],u=["focus","blur","scrollIntoView","click"],m=new d.a;t.b=m;const h=new d.a,p=new d.a,f=new d.a;function g(e,t){return Object(n.e)(e)&&Object(n.e)(t)?(!Object(n.d)(e)&&!Object(n.d)(t)||e.domNode===t.domNode)&&(e.tag===t.tag&&e.properties.key===t.properties.key):!(!Object(n.f)(e)||!Object(n.f)(t))&&((void 0!==e.instance||"string"!=typeof t.widgetConstructor)&&(e.widgetConstructor===t.widgetConstructor&&e.properties.key===t.properties.key))}const j=function(){throw new Error("Provide a transitions object to the projectionOptions to do animations")};function _(e){if("string"!=typeof e)throw new Error("Style values must be strings")}function y(e,t,o,r,s,n){const i=f.get(r.projectorInstance),a=i.nodeMap.get(e)||new d.a;if(n){const o=a.get(n);e.removeEventListener(t,o)}let c=o.bind(s);"input"===t&&(c=function(e){o.call(this,e),e.target["oninput-value"]=e.target.value}.bind(s)),e.addEventListener(t,c),a.set(o,c),i.nodeMap.set(e,a)}function b(e,t){if(t){const o=t.split(" ");for(let t=0;t{r[e]()})}}function k(e,t,o,r,s=!1){const n=f.get(r.projectorInstance).nodeMap.get(e);n&&Object.keys(t).forEach(r=>{const i="on"===r.substr(0,2)||s,d=s?r:r.substr(2);if(i&&!o[r]){const o=n.get(t[r]);o&&e.removeEventListener(d,o)}})}function O(e,t,o,r){r.namespace===a&&"href"===t?e.setAttributeNS(c,t,o):"role"===t&&""===o||void 0===o?e.removeAttribute(t):e.setAttribute(t,o)}function P(e,t,o,r){const s=Object.keys(o),n=s.length;for(let i=0;i0)if(c&&0!==c.length){const r=[...o];for(let o=0;o0&&R(r.children,t));else{if(!r.coreProperties){const e=m.get(t);r.coreProperties={bind:t,baseRegistry:e.coreProperties.baseRegistry}}r.children&&r.children.length>0&&R(r.children,t)}o++}else e.splice(o,1)}return e}function A(e,t){if(Object(n.e)(e)&&e.properties){const o=e.properties.enterAnimation;o&&("function"==typeof o?o(e.domNode,e.properties):t.enter(e.domNode,e.properties,o))}}function M(e,t,o){if(Object(n.f)(e)){const r=h.get(e.instance),s=(r?r.dnode.rendered:e.rendered)||l;if(e.instance){m.get(e.instance).onDetach(),h.delete(e.instance)}for(let e=0;e0)for(let r=0;r{let d=void 0,a=o,m=p+1,f=o[p];if(f||(f=t[0],m=1,a=t),f){let t=[f];for(;t.length;){const o=t.shift();if(Object(n.f)(o)){const e=h.get(o.instance);e&&e.dnode.rendered&&t.push(...e.dnode.rendered)}else if(o.domNode){if(o.domNode.parentElement!==e.domNode)break;d=o.domNode;break}0===t.length&&a[m]&&(t.push(a[m]),m++)}}S(l,e,r.slice(j+1),d,i,s),A(l,c);const g=j;u.afterRenderCallbacks.push(()=>{x(r,g,s)})};if(!a||-1===m){f(),j++;continue}const y=()=>{const e=p;if(u.afterRenderCallbacks.push(()=>{x(o,e,s)}),Object(n.f)(a)){const e=h.get(a.instance);e&&(a=e.dnode)}M(a,c,i)};-1!==C(r,a,j+1)?(f(),y(),p++,j++):(y(),p++)}if(d>p)for(m=p;m{x(o,e,s)});let t=o[m];if(Object(n.f)(t)){const e=h.get(t.instance);e&&(t=e.dnode)}M(t,c,i)}return _}function I(e,t,o,r,i,d){if(void 0===t)return;const a=f.get(o.projectorInstance);a.merge&&void 0===d&&(d=Object(s.a)(e.domNode.childNodes));const c=o.transitions;o=Object.assign({},o,{depth:o.depth+1});for(let s=0;s0;)(e=d.shift())&&e.tagName===(l.tag.toUpperCase()||void 0)&&(l.domNode=e)}S(l,e,u,i,o,r)}else S(l,e,u,i,o,r,d);A(l,c)}}function D(e,t,o,r){if(I(t,t.children,r,o,void 0),"function"==typeof t.deferredPropertiesCallback&&void 0===t.inserted&&W(t,r),t.attributes&&t.events){P(e,{},t.attributes,r),E(e,{},t.properties,r,!1),k(e,{},t.events,r,!0);const o=t.events;Object.keys(o).forEach(s=>{y(e,s,o[s],r,t.properties.bind)})}else E(e,{},t.properties,r);if(null!==t.properties.key&&void 0!==t.properties.key){m.get(o).nodeHandler.add(e,`${t.properties.key}`)}t.inserted=!0}function S(e,t,o,r,s,d,c){let l;const u=f.get(s.projectorInstance);if(Object(n.f)(e)){let{widgetConstructor:n}=e;const a=m.get(d);if(!Object(i.d)(n)){const e=a.registry().get(n);if(null===e)return;n=e}const l=new n;e.instance=l,p.set(l,o);const f=m.get(l);f.invalidate=(()=>{f.dirty=!0,!1===f.rendering&&(u.renderQueue.push({instance:l,depth:s.depth}),H(s))}),f.rendering=!0,l.__setCoreProperties__(e.coreProperties),l.__setChildren__(e.children),l.__setProperties__(e.properties);const g=l.__render__();if(f.rendering=!1,g){const o=R(g,l);e.rendered=o,I(t,o,s,l,r,c)}h.set(l,{dnode:e,parentVNode:t}),f.nodeHandler.addRoot(),u.afterRenderCallbacks.push(()=>{f.onAttach()})}else{if(u.merge&&void 0!==u.mergeElement)return l=e.domNode=s.mergeElement,u.mergeElement=void 0,void D(l,e,d,s);const o=t.domNode.ownerDocument;if(e.tag||"string"!=typeof e.text)void 0===e.domNode?("svg"===e.tag&&(s=Object.assign({},s,{namespace:a})),l=void 0!==s.namespace?e.domNode=o.createElementNS(s.namespace,e.tag):e.domNode=e.domNode||o.createElement(e.tag)):l=e.domNode,D(l,e,d,s),void 0!==r?t.domNode.insertBefore(l,r):l.parentNode!==t.domNode&&t.domNode.appendChild(l);else if(void 0!==e.domNode&&t.domNode){const o=e.domNode.ownerDocument.createTextNode(e.text);t.domNode===e.domNode.parentNode?t.domNode.replaceChild(o,e.domNode):(t.domNode.appendChild(o),e.domNode.parentNode&&e.domNode.parentNode.removeChild(e.domNode)),e.domNode=o}else l=e.domNode=o.createTextNode(e.text),void 0!==r?t.domNode.insertBefore(l,r):t.domNode.appendChild(l)}}function L(e,t,o,r,s,i,d){if(Object(n.f)(t)){const{instance:r}=e,{parentVNode:s,dnode:n}=h.get(r),a=n?n.rendered:e.rendered,c=m.get(r);if(c.rendering=!0,r.__setCoreProperties__(t.coreProperties),r.__setChildren__(t.children),r.__setProperties__(t.properties),p.set(r,d),t.instance=r,!0===c.dirty){const e=r.__render__();c.rendering=!1,t.rendered=R(e,r),T(s,i,a,t.rendered,r,o)}else c.rendering=!1,t.rendered=a;h.set(r,{dnode:t,parentVNode:s}),c.nodeHandler.addRoot()}else{if(e===t)return!1;const r=t.domNode=e.domNode;let n=!1,d=!1;if(t.tag||"string"!=typeof t.text){if(t.tag&&0===t.tag.lastIndexOf("svg",0)&&(o=Object.assign({},o,{namespace:a})),e.children!==t.children){const r=R(t.children,s);t.children=r,d=T(t,i,e.children,r,s,o)||d}const n=function(e,t,o){const{diffType:r,properties:s,attributes:n}=o;if(!r||"vdom"===r)return{properties:t.properties,attributes:t.attributes,events:t.events};if("none"===r)return{properties:{},attributes:t.attributes?{}:void 0,events:t.events};let i={properties:{}};return n?(i.attributes={},i.events=t.events,Object.keys(s).forEach(t=>{i.properties[t]=e[t]}),Object.keys(n).forEach(t=>{i.attributes[t]=e.getAttribute(t)}),i):(i.properties=Object.keys(s).reduce((t,o)=>(t[o]=e.getAttribute(o)||e[o],t),{}),i)}(r,e,t);if(t.attributes&&t.events){P(r,n.attributes,t.attributes,o),d=E(r,n.properties,t.properties,o,!1)||d,k(r,n.events,t.events,o,!0);const e=t.events;Object.keys(e).forEach(s=>{y(r,s,e[s],o,t.properties.bind,n.events[s])})}else d=E(r,n.properties,t.properties,o)||d;if(null!==t.properties.key&&void 0!==t.properties.key){m.get(s).nodeHandler.add(r,`${t.properties.key}`)}}else if(t.text!==e.text){const e=r.ownerDocument.createTextNode(t.text);return r.parentNode.replaceChild(e,r),t.domNode=e,n=!0}d&&t.properties&&t.properties.updateAnimation&&t.properties.updateAnimation(r,t.properties,e.properties)}}function W(e,t){e.decoratedDeferredProperties=e.properties;const o=e.deferredPropertiesCallback(!!e.inserted),r=f.get(t.projectorInstance);e.properties=Object.assign({},o,e.decoratedDeferredProperties),r.deferredRenderCallbacks.push(()=>{const o=Object.assign({},e.deferredPropertiesCallback(!!e.inserted),e.decoratedDeferredProperties);E(e.domNode,e.properties,o,t),e.properties=o})}function B(e){const t=f.get(e.projectorInstance);if(t.deferredRenderCallbacks.length)if(e.sync)for(;t.deferredRenderCallbacks.length;){const e=t.deferredRenderCallbacks.shift();e&&e()}else r.a.requestAnimationFrame(()=>{for(;t.deferredRenderCallbacks.length;){const e=t.deferredRenderCallbacks.shift();e&&e()}})}function F(e){const t=f.get(e.projectorInstance);if(e.sync)for(;t.afterRenderCallbacks.length;){const e=t.afterRenderCallbacks.shift();e&&e()}else r.a.requestIdleCallback?r.a.requestIdleCallback(()=>{for(;t.afterRenderCallbacks.length;){const e=t.afterRenderCallbacks.shift();e&&e()}}):setTimeout(()=>{for(;t.afterRenderCallbacks.length;){const e=t.afterRenderCallbacks.shift();e&&e()}})}function H(e){const t=f.get(e.projectorInstance);e.sync?$(e):void 0===t.renderScheduled&&(t.renderScheduled=r.a.requestAnimationFrame(()=>{$(e)}))}function $(e){const t=f.get(e.projectorInstance);t.renderScheduled=void 0;const o=[...t.renderQueue];t.renderQueue=[],o.sort((e,t)=>e.depth-t.depth);const r=[];for(;o.length;){const{instance:t}=o.shift();if(h.has(t)&&-1===r.indexOf(t)){r.push(t);const{parentVNode:o,dnode:s}=h.get(t),n=m.get(t),i=p.get(t);L(s,N(t,n),e,0,t,i,i)}}F(e),B(e)}const q={append:function(e,t,o={}){const r=m.get(t),s=function(e,t){const o={namespace:void 0,styleApplyer:function(e,t,o){e.style[t]=o},transitions:{enter:j,exit:j},depth:0,merge:!1,sync:!1,projectorInstance:t};return Object.assign({},o,e)}(o,t),i={afterRenderCallbacks:[],deferredRenderCallbacks:[],nodeMap:new d.a,renderScheduled:void 0,renderQueue:[],merge:o.merge||!1,mergeElement:o.mergeElement};f.set(t,i),s.rootNode=e;const a={tag:"",properties:{},children:void 0,domNode:s.rootNode,type:n.a};const c=N(t,r);return h.set(t,{dnode:c,parentVNode:a}),r.invalidate=(()=>{r.dirty=!0,!1===r.rendering&&(i.renderQueue.push({instance:t,depth:s.depth}),H(s))}),L(c,c,s,0,t,[],[]),i.afterRenderCallbacks.push(()=>{r.onAttach()}),B(s),F(s),{domNode:s.rootNode}},create:function(e,t){return this.append(document.createElement("div"),e,t)},merge:function(e,t,o={}){o.merge=!0,o.mergeElement=e;const r=this.append(e.parentNode,t,o);return f.get(t).merge=!1,r}};t.a=q},"./node_modules/imports-loader/index.js?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js":function(e,t,o){var r=o("./src/menu-item/MenuItem.ts"),s=o("./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs").default,n=r.default;n&&s(n)},"./node_modules/process/browser.js":function(e,t){var o,r,s=e.exports={};function n(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function d(e){if(o===setTimeout)return setTimeout(e,0);if((o===n||!o)&&setTimeout)return o=setTimeout,setTimeout(e,0);try{return o(e,0)}catch(t){try{return o.call(null,e,0)}catch(t){return o.call(this,e,0)}}}!function(){try{o="function"==typeof setTimeout?setTimeout:n}catch(e){o=n}try{r="function"==typeof clearTimeout?clearTimeout:i}catch(e){r=i}}();var a,c=[],l=!1,u=-1;function m(){l&&a&&(l=!1,a.length?c=a.concat(c):u=-1,c.length&&h())}function h(){if(!l){var e=d(m);l=!0;for(var t=c.length;t;){for(a=c,c=[];++u1)for(var o=1;o=0;d--)(s=e[d])&&(i=(n<3?s(i):n>3?s(t,o,i):s(t,o))||i);return n>3&&i&&Object.defineProperty(t,o,i),i}; /*! ***************************************************************************** Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use @@ -21,5 +21,5 @@ MERCHANTABLITY OR NON-INFRINGEMENT. See the Apache Version 2.0 License for specific language governing permissions and limitations under the License. ***************************************************************************** */ -Object.setPrototypeOf||Array;Object.assign},"./node_modules/webpack/buildin/global.js":function(e,t){var o;o=function(){return this}();try{o=o||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(o=window)}e.exports=o},"./src/menu-item/MenuItem.ts":function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),o.d(t,"MenuItem",function(){return c});var r=o("./node_modules/tslib/tslib.es6.js"),s=o("./node_modules/@dojo/widget-core/d.mjs"),n=o("./node_modules/@dojo/widget-core/decorators/customElement.mjs"),i=o("./node_modules/@dojo/widget-core/mixins/Themed.mjs"),d=o("./node_modules/@dojo/widget-core/WidgetBase.mjs"),a=o("./src/menu-item/menuItem.m.css");o.n(a);let c=class extends(Object(i.a)(d.a)){_onClick(){this.properties.onSelected&&this.properties.onSelected(this.properties.data)}render(){const{title:e,selected:t}=this.properties;return Object(s.g)("li",{classes:this.theme(a.root)},[Object(s.g)("span",{classes:this.theme([a.item,t?a.selected:null]),onclick:this._onClick},[e])])}};c=r.a([Object(n.a)({tag:"demo-menu-item",attributes:["title","selected"],events:["onSelected"],properties:["data","selected"]}),Object(i.c)(a)],c),t.default=c},"./src/menu-item/menuItem.m.css":function(e,t){e.exports={" _key":"test-app/menuItem",root:"sUmUi4Sh",item:"_2Mk6Rdqa",selected:"_1-f3ItOh"}},0:function(e,t,o){e.exports=o("./node_modules/imports-loader/index.js?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js")}}); +Object.setPrototypeOf||Array;Object.assign},"./node_modules/webpack/buildin/global.js":function(e,t){var o;o=function(){return this}();try{o=o||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(o=window)}e.exports=o},"./src/menu-item/MenuItem.ts":function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),o.d(t,"MenuItem",function(){return c});var r=o("./node_modules/tslib/tslib.es6.js"),s=o("./node_modules/@dojo/framework/widget-core/d.mjs"),n=o("./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs"),i=o("./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs"),d=o("./node_modules/@dojo/framework/widget-core/WidgetBase.mjs"),a=o("./src/menu-item/menuItem.m.css");o.n(a);let c=class extends(Object(i.a)(d.a)){_onClick(){this.properties.onSelected&&this.properties.onSelected(this.properties.data)}render(){const{title:e,selected:t}=this.properties;return Object(s.g)("li",{classes:this.theme(a.root)},[Object(s.g)("span",{classes:this.theme([a.item,t?a.selected:null]),onclick:this._onClick},[e])])}};c=r.a([Object(n.a)({tag:"demo-menu-item",attributes:["title","selected"],events:["onSelected"],properties:["data","selected"]}),Object(i.c)(a)],c),t.default=c},"./src/menu-item/menuItem.m.css":function(e,t){e.exports={" _key":"test-app/menuItem",root:"sUmUi4Sh",item:"_2Mk6Rdqa",selected:"_1-f3ItOh"}},0:function(e,t,o){e.exports=o("./node_modules/imports-loader/index.js?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js")}}); //# sourceMappingURL=menu-item-1.0.0.js.map \ No newline at end of file diff --git a/test-app/fixtures/unix/dist/menu-item/menu-item-1.0.0.js.map b/test-app/fixtures/unix/dist/menu-item/menu-item-1.0.0.js.map index 47d1c4b..1139523 100644 --- a/test-app/fixtures/unix/dist/menu-item/menu-item-1.0.0.js.map +++ b/test-app/fixtures/unix/dist/menu-item/menu-item-1.0.0.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 931d3d7713b7be398580","webpack:///./node_modules/@dojo/core/Destroyable.mjs","webpack:///./node_modules/@dojo/core/Evented.mjs","webpack:///./node_modules/@dojo/core/lang.mjs","webpack:///./node_modules/@dojo/has/has.mjs","webpack:///./node_modules/@dojo/shim/Map.mjs","webpack:///./node_modules/@dojo/shim/Promise.mjs","webpack:///./node_modules/@dojo/shim/Symbol.mjs","webpack:///./node_modules/@dojo/shim/WeakMap.mjs","webpack:///./node_modules/@dojo/shim/array.mjs","webpack:///./node_modules/@dojo/shim/global.mjs","webpack:///./node_modules/@dojo/shim/number.mjs","webpack:///./node_modules/@dojo/shim/object.mjs","webpack:///./node_modules/@dojo/shim/string.mjs","webpack:///./node_modules/@dojo/shim/support/has.mjs","webpack:///./node_modules/@dojo/shim/support/queue.mjs","webpack:///./node_modules/@dojo/shim/support/util.mjs","webpack:///./node_modules/@dojo/widget-core/Injector.mjs","webpack:///./node_modules/@dojo/widget-core/NodeHandler.mjs","webpack:///./node_modules/@dojo/widget-core/Registry.mjs","webpack:///./node_modules/@dojo/widget-core/RegistryHandler.mjs","webpack:///./node_modules/@dojo/widget-core/WidgetBase.mjs","webpack:///./node_modules/@dojo/widget-core/animations/cssTransitions.mjs","webpack:///./node_modules/@dojo/widget-core/d.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/afterRender.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/customElement.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/diffProperty.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/inject.mjs","webpack:///./node_modules/@dojo/widget-core/diff.mjs","webpack:///./node_modules/@dojo/widget-core/mixins/Projector.mjs","webpack:///./node_modules/@dojo/widget-core/mixins/Themed.mjs","webpack:///./node_modules/@dojo/widget-core/registerCustomElement.mjs","webpack:///./node_modules/@dojo/widget-core/vdom.mjs","webpack:///./node_modules/@dojo/cli-build-widget/template/custom-element.js","webpack:///./node_modules/process/browser.js","webpack:///./node_modules/tslib/tslib.es6.js","webpack:///(webpack)/buildin/global.js","webpack:///./src/menu-item/MenuItem.ts","webpack:///./src/menu-item/menuItem.m.css?6a95"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","noop","__WEBPACK_IMPORTED_MODULE_1__dojo_shim_Promise__","resolve","destroyed","Error","Destroyable","[object Object]","this","handles","handle","Array","isArray","__WEBPACK_IMPORTED_MODULE_0__lang__","_handles","push","splice","indexOf","destroy","forEach","own","__webpack_exports__","regexMap","__WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__","Evented","__WEBPACK_IMPORTED_MODULE_1__Destroyable__","super","arguments","listenersMap","event","methods","type","globString","targetString","regex","has","RegExp","replace","set","test","isGlobMatch","method","listener","map","_addListener","listeners","destructor","called","createHandle","length","slice","testCache","testFunctions","testThenables","globalScope","window","global","self","staticFeatures","DojoHasEnvironment","staticCache","apply","add","feature","value","overwrite","normalizedFeature","toLowerCase","Boolean","exists","TypeError","then","isFeatureTestThenable","resolvedValue","result","document","location","process","versions","node","Map","__WEBPACK_IMPORTED_MODULE_1__global__","ShimPromise","__WEBPACK_IMPORTED_MODULE_0__global__","Promise","Symbol","wellKnown","__WEBPACK_IMPORTED_MODULE_2__support_util__","for","WeakMap","from","of","copyWithin","fill","find","findIndex","includes","__WEBPACK_IMPORTED_MODULE_4__support_util__","globalObject","Math","pow","assign","getOwnPropertyDescriptor","getOwnPropertyNames","getOwnPropertySymbols","is","keys","getOwnPropertyDescriptors","entries","values","fromCodePoint","raw","codePointAt","endsWith","normalize","repeat","startsWith","padEnd","padStart","String","__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__","every","key","Number","POSITIVE_INFINITY","e","imul","Observable","Set","getCallSite","callSite","substitutions","key1","key2","freeze","postMessage","requestAnimationFrame","setImmediate","MutationObserver","WebKitMutationObserver","example","createElement","observer","observe","attributes","style","setProperty","takeRecords","undefined","Animation","KeyframeEffect","executeTask","item","isActive","callback","getQueueHandle","enqueue","queue","addEventListener","source","data","stopPropagation","shift","queueTask","id","queueAnimationTask","rafId","bind","cancelAnimationFrame","writable","nativeFunction","target","args","Injector","__WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__","payload","_payload","invalidator","_invalidator","NodeEventType","_nodeMap","__WEBPACK_IMPORTED_MODULE_1__dojo_shim_Map__","element","emit","Widget","Projector","clear","WIDGET_BASE_TYPE","__WEBPACK_IMPORTED_MODULE_2__dojo_shim_Symbol__","isWidgetBaseConstructor","_type","Registry","__WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__","widgetLabel","action","label","_widgetRegistry","toString","__WEBPACK_IMPORTED_MODULE_0__dojo_shim_Promise__","widgetCtor","emitLoadedEvent","error","injectorFactory","_injectorRegistry","injectorItem","injector","promise","default","isWidgetConstructorDefaultExport","hasInjector","__WEBPACK_IMPORTED_MODULE_1__dojo_core_Evented__","_registry","__WEBPACK_IMPORTED_MODULE_2__Registry__","_registryWidgetLabelMap","_registryInjectorLabelMap","baseRegistry","delete","base","widget","define","defineInjector","globalPrecedence","_get","getFunctionName","labelMap","registries","registry","registeredLabels","on","decoratorMap","boundAuto","__WEBPACK_IMPORTED_MODULE_4__diff__","noBind","WidgetBase","_initialProperties","_changedPropertyKeys","_nodeHandler","__WEBPACK_IMPORTED_MODULE_6__NodeHandler__","_children","_decoratorCache","_properties","_boundRenderFunc","render","_boundInvalidate","invalidate","__WEBPACK_IMPORTED_MODULE_7__vdom__","dirty","onAttach","onDetach","nodeHandler","coreProperties","rendering","inputProperties","_runAfterConstructors","MetaType","_metaMap","cached","properties","changedPropertyKeys","instanceData","__WEBPACK_IMPORTED_MODULE_5__RegistryHandler__","originalProperties","_runBeforeProperties","registeredDiffPropertyNames","getDecorator","propertyNames","allProperties","checkedProperties","diffPropertyResults","runReactions","propertyName","previousProperty","newProperty","_bindFunctionProperty","diffFunctions","changed","_mapDiffPropertyReactions","reaction","previousProperties","newProperties","children","dNode","_runBeforeRenders","runAfterRenders","__WEBPACK_IMPORTED_MODULE_3__d__","decoratorKey","decoratorList","constructor","specificDecoratorList","decorators","allDecorators","instanceMap","unshift","getPrototypeOf","_buildDecoratorList","reduce","reactionPropertyMap","reactionArguments","__WEBPACK_IMPORTED_MODULE_8__Registry__","_bindFunctionPropertyMap","__WEBPACK_IMPORTED_MODULE_1__dojo_shim_WeakMap__","bindInfo","boundFunc","scope","beforeProperties","beforePropertiesFunction","beforeRenders","beforeRenderFunction","updatedRender","console","warn","afterRenders","afterRenderFunction","meta","afterRender","afterConstructors","afterConstructor","pop","browserSpecificTransitionEndEventName","browserSpecificAnimationEndEventName","initialize","determineBrowserStyleNames","runAndCleanUp","startAnimation","finishAnimation","finished","transitionEnd","removeEventListener","enter","enterAnimation","activeClass","enterAnimationActive","classList","remove","exit","exitAnimation","removeNode","exitAnimationActive","child","DOMVNODE","widgetConstructor","WNODE","tag","propertiesOrChildren","deferredPropertiesCallback","VNODE","attrs","props","diffType","isElementNode","tagName","events","domNode","text","__WEBPACK_IMPORTED_MODULE_0__dojo_shim_Symbol__","isWNode","isVNode","__WEBPACK_IMPORTED_MODULE_0__handleDecorator__","propertyKey","addDecorator","alwaysRender","__WEBPACK_IMPORTED_MODULE_1__beforeProperties__","customElement","childType","__WEBPACK_IMPORTED_MODULE_0__registerCustomElement__","DOJO","registryFactory","__WEBPACK_IMPORTED_MODULE_1__Registry__","__customElementDescriptor","diffProperty","diffFunction","reactionFunction","handleDecorator","handler","descriptor","registeredInjectorsMap","__WEBPACK_IMPORTED_MODULE_0__dojo_shim_WeakMap__","inject","getProperties","__WEBPACK_IMPORTED_MODULE_1__handleDecorator__","__WEBPACK_IMPORTED_MODULE_2__beforeProperties__","getInjector","registeredInjectors","__WEBPACK_IMPORTED_MODULE_0__Registry__","reference","ignore","isObjectOrArray","shallow","validOldProperty","validNewProperty","previousKeys","newKeys","some","ProjectorAttachState","AttachType","ProjectorMixin","Base","_root","body","_async","_projectorProperties","_projectionOptions","transitions","__WEBPACK_IMPORTED_MODULE_2__animations_cssTransitions__","root","projectorState","Detached","options","Append","_attach","Merge","Attached","async","doc","previousRoot","createDocumentFragment","__setChildren__","__setProperties__","__WEBPACK_IMPORTED_MODULE_1__dojo_core_lang__","__setCoreProperties__","_projection","childNodes","outerHTML","__WEBPACK_IMPORTED_MODULE_4__d__","_attachHandle","sync","__WEBPACK_IMPORTED_MODULE_5__vdom__","append","merge","__WEBPACK_IMPORTED_MODULE_0_tslib__","__WEBPACK_IMPORTED_MODULE_3__decorators_afterRender__","Function","theme","__WEBPACK_IMPORTED_MODULE_3__decorators_handleDecorator__","themeRegistry","themeInjector","__WEBPACK_IMPORTED_MODULE_1__Injector__","INJECTED_THEME_KEY","setInvalidator","THEME_KEY","ThemedMixin","Themed","_registeredBaseThemeKeys","_recalculateClasses","_theme","classes","_recalculateThemeClasses","className","_getThemeClass","extraClasses","themeClassName","_baseThemeClassesReverseLookup","resultClassNames","_registeredBaseTheme","join","baseThemes","finalBaseTheme","baseTheme","_a","currentClassNames","baseClass","themeKey","__WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__","__WEBPACK_IMPORTED_MODULE_5__diff__","__WEBPACK_IMPORTED_MODULE_2__decorators_inject__","CustomElementChildType","DomToWidgetWrapper","__WEBPACK_IMPORTED_MODULE_1__WidgetBase__","__WEBPACK_IMPORTED_MODULE_7__decorators_alwaysRender__","create","WidgetConstructor","attributeMap","attributeName","HTMLElement","_eventProperties","_initialised","domProperties","_attributesToProperties","filteredPropertyName","_getProperty","_setProperty","eventName","_getEventProperty","_setEventProperty","eventCallback","dispatchEvent","CustomEvent","bubbles","detail","defineProperties","TEXT","__WEBPACK_IMPORTED_MODULE_3__dojo_shim_array__","childNode","_render","_childConnected","widgetProperties","renderChildren","__children__","themeContext","__WEBPACK_IMPORTED_MODULE_6__mixins_Themed__","_getTheme","__WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__","__WEBPACK_IMPORTED_MODULE_2__mixins_Projector__","_projector","setProperties","dojoce","themes","parentNode","filter","Child","isWidget","__properties__","oldValue","getAttribute","observedAttributes","register","customElements","NAMESPACE_SVG","NAMESPACE_W3","NAMESPACE_XLINK","emptyArray","widgetInstanceMap","__WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__","projectorStateMap","same","dnode1","dnode2","__WEBPACK_IMPORTED_MODULE_2__d__","instance","missingTransition","checkStyleValue","styleValue","updateEvent","currentValue","projectionOptions","previousValue","projectorInstance","eventMap","nodeMap","previousEvent","evt","addClasses","classNames","split","removeClasses","focusNode","propValue","deferredRenderCallbacks","focus","removeOrphanedEvents","onlyEvents","propName","isEvent","substr","updateAttribute","attrName","attrValue","namespace","setAttributeNS","removeAttribute","setAttribute","updateAttributes","previousAttributes","attrNames","attrCount","updateProperties","includesEventsAndAttributes","propertiesUpdated","propNames","propCount","previousClasses","currentClasses","newClasses","previousClassName","classIndex","styleNames","styleCount","j","styleName","newStyleValue","styleApplyer","domValue","lastIndexOf","findIndexOfChild","sameAs","start","toInternalWNode","rendered","filterAndDecorateChildren","nodeAdded","dnode","nodeToRemove","pointerEvents","removeDomNode","removeChild","checkDistinguishable","indexToCheck","parentInstance","nodeIdentifier","parentName","updateChildren","parentVNode","oldChildren","newChildren","oldChildrenLength","newChildrenLength","depth","oldIndex","newIndex","textUpdated","oldChild","newChild","inserted","addDeferredProperties","updateDom","findOldIndex","addChild","insertBeforeDomNode","nextIndex","insertBeforeChildren","insertBefore","createDom","afterRenderCallbacks","childToRemove","addChildren","__WEBPACK_IMPORTED_MODULE_1__dojo_shim_array__","domElement","toUpperCase","initPropertiesAndChildren","parentInstanceData","__WEBPACK_IMPORTED_MODULE_3__Registry__","renderQueue","scheduleRender","__render__","filteredRendered","addRoot","mergeElement","ownerDocument","createElementNS","appendChild","newDomNode","createTextNode","replaceChild","previous","previousRendered","updated","current","buildPreviousProperties","updateAnimation","vnode","decoratedDeferredProperties","runDeferredRenderCallbacks","__WEBPACK_IMPORTED_MODULE_0__dojo_shim_global__","runAfterRenderCallbacks","requestIdleCallback","setTimeout","renderScheduled","renders","sort","a","b","previouslyRendered","dom","finalProjectorOptions","projectorOptions","defaults","getProjectionOptions","rootNode","projection","widgetFactory","registerCustomElement","defaultExport","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","fun","clearTimeout","currentQueue","draining","queueIndex","cleanUpNextTick","concat","drainQueue","timeout","len","run","marker","runClearTimeout","Item","array","nextTick","title","browser","env","argv","version","addListener","once","off","removeListener","removeAllListeners","prependListener","prependOnceListener","binding","cwd","chdir","dir","umask","t","desc","r","Reflect","decorate","metadataKey","metadataValue","metadata","setPrototypeOf","g","eval","MenuItem","__WEBPACK_IMPORTED_MODULE_3__dojo_widget_core_mixins_Themed__","__WEBPACK_IMPORTED_MODULE_4__dojo_widget_core_WidgetBase__","onSelected","selected","__WEBPACK_IMPORTED_MODULE_1__dojo_widget_core_d__","__WEBPACK_IMPORTED_MODULE_5__menuItem_m_css__","onclick","_onClick","__WEBPACK_IMPORTED_MODULE_2__dojo_widget_core_decorators_customElement__"," _key"],"mappings":"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","file":"menu-item-1.0.0.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 931d3d7713b7be398580","import { createCompositeHandle } from './lang';\nimport Promise from '@dojo/shim/Promise';\n/**\n * No operation function to replace own once instance is destoryed\n */\nfunction noop() {\n return Promise.resolve(false);\n}\n/**\n * No op function used to replace own, once instance has been destoryed\n */\nfunction destroyed() {\n throw new Error('Call made to destroyed method');\n}\nexport class Destroyable {\n /**\n * @constructor\n */\n constructor() {\n this.handles = [];\n }\n /**\n * Register handles for the instance that will be destroyed when `this.destroy` is called\n *\n * @param {Handle} handle The handle to add for the instance\n * @returns {Handle} a handle for the handle, removes the handle for the instance and calls destroy\n */\n own(handles) {\n const handle = Array.isArray(handles) ? createCompositeHandle(...handles) : handles;\n const { handles: _handles } = this;\n _handles.push(handle);\n return {\n destroy() {\n _handles.splice(_handles.indexOf(handle));\n handle.destroy();\n }\n };\n }\n /**\n * Destrpys all handers registered for the instance\n *\n * @returns {Promise {\n this.handles.forEach((handle) => {\n handle && handle.destroy && handle.destroy();\n });\n this.destroy = noop;\n this.own = destroyed;\n resolve(true);\n });\n }\n}\nexport default Destroyable;\n//# sourceMappingURL=Destroyable.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/core/Destroyable.mjs\n// module id = ./node_modules/@dojo/core/Destroyable.mjs\n// module chunks = menu-item","import Map from '@dojo/shim/Map';\nimport { Destroyable } from './Destroyable';\n/**\n * Map of computed regular expressions, keyed by string\n */\nconst regexMap = new Map();\n/**\n * Determines is the event type glob has been matched\n *\n * @returns boolean that indicates if the glob is matched\n */\nexport function isGlobMatch(globString, targetString) {\n if (typeof targetString === 'string' && typeof globString === 'string' && globString.indexOf('*') !== -1) {\n let regex;\n if (regexMap.has(globString)) {\n regex = regexMap.get(globString);\n }\n else {\n regex = new RegExp(`^${globString.replace(/\\*/g, '.*')}$`);\n regexMap.set(globString, regex);\n }\n return regex.test(targetString);\n }\n else {\n return globString === targetString;\n }\n}\n/**\n * Event Class\n */\nexport class Evented extends Destroyable {\n constructor() {\n super(...arguments);\n /**\n * map of listeners keyed by event type\n */\n this.listenersMap = new Map();\n }\n emit(event) {\n this.listenersMap.forEach((methods, type) => {\n if (isGlobMatch(type, event.type)) {\n methods.forEach((method) => {\n method.call(this, event);\n });\n }\n });\n }\n on(type, listener) {\n if (Array.isArray(listener)) {\n const handles = listener.map((listener) => this._addListener(type, listener));\n return {\n destroy() {\n handles.forEach((handle) => handle.destroy());\n }\n };\n }\n return this._addListener(type, listener);\n }\n _addListener(type, listener) {\n const listeners = this.listenersMap.get(type) || [];\n listeners.push(listener);\n this.listenersMap.set(type, listeners);\n return {\n destroy: () => {\n const listeners = this.listenersMap.get(type) || [];\n listeners.splice(listeners.indexOf(listener), 1);\n }\n };\n }\n}\nexport default Evented;\n//# sourceMappingURL=Evented.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/core/Evented.mjs\n// module id = ./node_modules/@dojo/core/Evented.mjs\n// module chunks = menu-item","import { assign } from '@dojo/shim/object';\nexport { assign } from '@dojo/shim/object';\nconst slice = Array.prototype.slice;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Type guard that ensures that the value can be coerced to Object\n * to weed out host objects that do not derive from Object.\n * This function is used to check if we want to deep copy an object or not.\n * Note: In ES6 it is possible to modify an object's Symbol.toStringTag property, which will\n * change the value returned by `toString`. This is a rare edge case that is difficult to handle,\n * so it is not handled here.\n * @param value The value to check\n * @return If the value is coercible into an Object\n */\nfunction shouldDeepCopyObject(value) {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\nfunction copyArray(array, inherited) {\n return array.map(function (item) {\n if (Array.isArray(item)) {\n return copyArray(item, inherited);\n }\n return !shouldDeepCopyObject(item)\n ? item\n : _mixin({\n deep: true,\n inherited: inherited,\n sources: [item],\n target: {}\n });\n });\n}\nfunction _mixin(kwArgs) {\n const deep = kwArgs.deep;\n const inherited = kwArgs.inherited;\n const target = kwArgs.target;\n const copied = kwArgs.copied || [];\n const copiedClone = [...copied];\n for (let i = 0; i < kwArgs.sources.length; i++) {\n const source = kwArgs.sources[i];\n if (source === null || source === undefined) {\n continue;\n }\n for (let key in source) {\n if (inherited || hasOwnProperty.call(source, key)) {\n let value = source[key];\n if (copiedClone.indexOf(value) !== -1) {\n continue;\n }\n if (deep) {\n if (Array.isArray(value)) {\n value = copyArray(value, inherited);\n }\n else if (shouldDeepCopyObject(value)) {\n const targetValue = target[key] || {};\n copied.push(source);\n value = _mixin({\n deep: true,\n inherited: inherited,\n sources: [value],\n target: targetValue,\n copied\n });\n }\n }\n target[key] = value;\n }\n }\n }\n return target;\n}\nexport function create(prototype, ...mixins) {\n if (!mixins.length) {\n throw new RangeError('lang.create requires at least one mixin object.');\n }\n const args = mixins.slice();\n args.unshift(Object.create(prototype));\n return assign.apply(null, args);\n}\nexport function deepAssign(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: false,\n sources: sources,\n target: target\n });\n}\nexport function deepMixin(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Creates a new object using the provided source's prototype as the prototype for the new object, and then\n * deep copies the provided source's values into the new target.\n *\n * @param source The object to duplicate\n * @return The new object\n */\nexport function duplicate(source) {\n const target = Object.create(Object.getPrototypeOf(source));\n return deepMixin(target, source);\n}\n/**\n * Determines whether two values are the same value.\n *\n * @param a First value to compare\n * @param b Second value to compare\n * @return true if the values are the same; false otherwise\n */\nexport function isIdentical(a, b) {\n return (a === b ||\n /* both values are NaN */\n (a !== a && b !== b));\n}\n/**\n * Returns a function that binds a method to the specified object at runtime. This is similar to\n * `Function.prototype.bind`, but instead of a function it takes the name of a method on an object.\n * As a result, the function returned by `lateBind` will always call the function currently assigned to\n * the specified property on the object as of the moment the function it returns is called.\n *\n * @param instance The context object\n * @param method The name of the method on the context object to bind to itself\n * @param suppliedArgs An optional array of values to prepend to the `instance[method]` arguments list\n * @return The bound function\n */\nexport function lateBind(instance, method, ...suppliedArgs) {\n return suppliedArgs.length\n ? function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n // TS7017\n return instance[method].apply(instance, args);\n }\n : function () {\n // TS7017\n return instance[method].apply(instance, arguments);\n };\n}\nexport function mixin(target, ...sources) {\n return _mixin({\n deep: false,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Returns a function which invokes the given function with the given arguments prepended to its argument list.\n * Like `Function.prototype.bind`, but does not alter execution context.\n *\n * @param targetFunction The function that needs to be bound\n * @param suppliedArgs An optional array of arguments to prepend to the `targetFunction` arguments list\n * @return The bound function\n */\nexport function partial(targetFunction, ...suppliedArgs) {\n return function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n return targetFunction.apply(this, args);\n };\n}\n/**\n * Returns an object with a destroy method that, when called, calls the passed-in destructor.\n * This is intended to provide a unified interface for creating \"remove\" / \"destroy\" handlers for\n * event listeners, timers, etc.\n *\n * @param destructor A function that will be called when the handle's `destroy` method is invoked\n * @return The handle object\n */\nexport function createHandle(destructor) {\n let called = false;\n return {\n destroy: function () {\n if (!called) {\n called = true;\n destructor();\n }\n }\n };\n}\n/**\n * Returns a single handle that can be used to destroy multiple handles simultaneously.\n *\n * @param handles An array of handles with `destroy` methods\n * @return The handle object\n */\nexport function createCompositeHandle(...handles) {\n return createHandle(function () {\n for (let i = 0; i < handles.length; i++) {\n handles[i].destroy();\n }\n });\n}\n//# sourceMappingURL=lang.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/core/lang.mjs\n// module id = ./node_modules/@dojo/core/lang.mjs\n// module chunks = menu-item","function isFeatureTestThenable(value) {\n return value && value.then;\n}\n/**\n * A cache of results of feature tests\n */\nexport const testCache = {};\n/**\n * A cache of the un-resolved feature tests\n */\nexport const testFunctions = {};\n/**\n * A cache of unresolved thenables (probably promises)\n * @type {{}}\n */\nconst testThenables = {};\n/**\n * A reference to the global scope (`window` in a browser, `global` in NodeJS)\n */\nconst globalScope = (function () {\n /* istanbul ignore else */\n if (typeof window !== 'undefined') {\n // Browsers\n return window;\n }\n else if (typeof global !== 'undefined') {\n // Node\n return global;\n }\n else if (typeof self !== 'undefined') {\n // Web workers\n return self;\n }\n /* istanbul ignore next */\n return {};\n})();\n/* Grab the staticFeatures if there are available */\nconst { staticFeatures } = globalScope.DojoHasEnvironment || {};\n/* Cleaning up the DojoHasEnviornment */\nif ('DojoHasEnvironment' in globalScope) {\n delete globalScope.DojoHasEnvironment;\n}\n/**\n * Custom type guard to narrow the `staticFeatures` to either a map or a function that\n * returns a map.\n *\n * @param value The value to guard for\n */\nfunction isStaticFeatureFunction(value) {\n return typeof value === 'function';\n}\n/**\n * The cache of asserted features that were available in the global scope when the\n * module loaded\n */\nconst staticCache = staticFeatures\n ? isStaticFeatureFunction(staticFeatures) ? staticFeatures.apply(globalScope) : staticFeatures\n : {}; /* Providing an empty cache, if none was in the environment\n\n/**\n* AMD plugin function.\n*\n* Conditional loads modules based on a has feature test value.\n*\n* @param resourceId Gives the resolved module id to load.\n* @param require The loader require function with respect to the module that contained the plugin resource in its\n* dependency list.\n* @param load Callback to loader that consumes result of plugin demand.\n*/\nexport function load(resourceId, require, load, config) {\n resourceId ? require([resourceId], load) : load();\n}\n/**\n * AMD plugin function.\n *\n * Resolves resourceId into a module id based on possibly-nested tenary expression that branches on has feature test\n * value(s).\n *\n * @param resourceId The id of the module\n * @param normalize Resolves a relative module id into an absolute module id\n */\nexport function normalize(resourceId, normalize) {\n const tokens = resourceId.match(/[\\?:]|[^:\\?]*/g) || [];\n let i = 0;\n function get(skip) {\n const term = tokens[i++];\n if (term === ':') {\n // empty string module name, resolves to null\n return null;\n }\n else {\n // postfixed with a ? means it is a feature to branch on, the term is the name of the feature\n if (tokens[i++] === '?') {\n if (!skip && has(term)) {\n // matched the feature, get the first value from the options\n return get();\n }\n else {\n // did not match, get the second value, passing over the first\n get(true);\n return get(skip);\n }\n }\n // a module\n return term;\n }\n }\n const id = get();\n return id && normalize(id);\n}\n/**\n * Check if a feature has already been registered\n *\n * @param feature the name of the feature\n */\nexport function exists(feature) {\n const normalizedFeature = feature.toLowerCase();\n return Boolean(normalizedFeature in staticCache || normalizedFeature in testCache || testFunctions[normalizedFeature]);\n}\n/**\n * Register a new test for a named feature.\n *\n * @example\n * has.add('dom-addeventlistener', !!document.addEventListener);\n *\n * @example\n * has.add('touch-events', function () {\n * return 'ontouchstart' in document\n * });\n *\n * @param feature the name of the feature\n * @param value the value reported of the feature, or a function that will be executed once on first test\n * @param overwrite if an existing value should be overwritten. Defaults to false.\n */\nexport function add(feature, value, overwrite = false) {\n const normalizedFeature = feature.toLowerCase();\n if (exists(normalizedFeature) && !overwrite && !(normalizedFeature in staticCache)) {\n throw new TypeError(`Feature \"${feature}\" exists and overwrite not true.`);\n }\n if (typeof value === 'function') {\n testFunctions[normalizedFeature] = value;\n }\n else if (isFeatureTestThenable(value)) {\n testThenables[feature] = value.then((resolvedValue) => {\n testCache[feature] = resolvedValue;\n delete testThenables[feature];\n }, () => {\n delete testThenables[feature];\n });\n }\n else {\n testCache[normalizedFeature] = value;\n delete testFunctions[normalizedFeature];\n }\n}\n/**\n * Return the current value of a named feature.\n *\n * @param feature The name (if a string) or identifier (if an integer) of the feature to test.\n */\nexport default function has(feature) {\n let result;\n const normalizedFeature = feature.toLowerCase();\n if (normalizedFeature in staticCache) {\n result = staticCache[normalizedFeature];\n }\n else if (testFunctions[normalizedFeature]) {\n result = testCache[normalizedFeature] = testFunctions[normalizedFeature].call(null);\n delete testFunctions[normalizedFeature];\n }\n else if (normalizedFeature in testCache) {\n result = testCache[normalizedFeature];\n }\n else if (feature in testThenables) {\n return false;\n }\n else {\n throw new TypeError(`Attempt to detect unregistered has feature \"${feature}\"`);\n }\n return result;\n}\n/*\n * Out of the box feature tests\n */\n/* Environments */\n/* Used as a value to provide a debug only code path */\nadd('debug', true);\n/* Detects if the environment is \"browser like\" */\nadd('host-browser', typeof document !== 'undefined' && typeof location !== 'undefined');\n/* Detects if the environment appears to be NodeJS */\nadd('host-node', function () {\n if (typeof process === 'object' && process.versions && process.versions.node) {\n return process.versions.node;\n }\n});\n//# sourceMappingURL=has.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/has/has.mjs\n// module id = ./node_modules/@dojo/has/has.mjs\n// module chunks = menu-item","import { isArrayLike, ShimIterator } from './iterator';\nimport global from './global';\nimport { is as objectIs } from './object';\nimport has from './support/has';\nimport './Symbol';\nexport let Map = global.Map;\nif (!true) {\n Map = (_a = class Map {\n constructor(iterable) {\n this._keys = [];\n this._values = [];\n this[Symbol.toStringTag] = 'Map';\n if (iterable) {\n if (isArrayLike(iterable)) {\n for (let i = 0; i < iterable.length; i++) {\n const value = iterable[i];\n this.set(value[0], value[1]);\n }\n }\n else {\n for (const value of iterable) {\n this.set(value[0], value[1]);\n }\n }\n }\n }\n /**\n * An alternative to Array.prototype.indexOf using Object.is\n * to check for equality. See http://mzl.la/1zuKO2V\n */\n _indexOfKey(keys, key) {\n for (let i = 0, length = keys.length; i < length; i++) {\n if (objectIs(keys[i], key)) {\n return i;\n }\n }\n return -1;\n }\n get size() {\n return this._keys.length;\n }\n clear() {\n this._keys.length = this._values.length = 0;\n }\n delete(key) {\n const index = this._indexOfKey(this._keys, key);\n if (index < 0) {\n return false;\n }\n this._keys.splice(index, 1);\n this._values.splice(index, 1);\n return true;\n }\n entries() {\n const values = this._keys.map((key, i) => {\n return [key, this._values[i]];\n });\n return new ShimIterator(values);\n }\n forEach(callback, context) {\n const keys = this._keys;\n const values = this._values;\n for (let i = 0, length = keys.length; i < length; i++) {\n callback.call(context, values[i], keys[i], this);\n }\n }\n get(key) {\n const index = this._indexOfKey(this._keys, key);\n return index < 0 ? undefined : this._values[index];\n }\n has(key) {\n return this._indexOfKey(this._keys, key) > -1;\n }\n keys() {\n return new ShimIterator(this._keys);\n }\n set(key, value) {\n let index = this._indexOfKey(this._keys, key);\n index = index < 0 ? this._keys.length : index;\n this._keys[index] = key;\n this._values[index] = value;\n return this;\n }\n values() {\n return new ShimIterator(this._values);\n }\n [Symbol.iterator]() {\n return this.entries();\n }\n },\n _a[Symbol.species] = _a,\n _a);\n}\nexport default Map;\nvar _a;\n//# sourceMappingURL=Map.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/Map.mjs\n// module id = ./node_modules/@dojo/shim/Map.mjs\n// module chunks = menu-item","import global from './global';\nimport { queueMicroTask } from './support/queue';\nimport './Symbol';\nimport has from './support/has';\nexport let ShimPromise = global.Promise;\nexport const isThenable = function isThenable(value) {\n return value && typeof value.then === 'function';\n};\nif (!true) {\n global.Promise = ShimPromise = (_a = class Promise {\n /**\n * Creates a new Promise.\n *\n * @constructor\n *\n * @param executor\n * The executor function is called immediately when the Promise is instantiated. It is responsible for\n * starting the asynchronous operation when it is invoked.\n *\n * The executor must call either the passed `resolve` function when the asynchronous operation has completed\n * successfully, or the `reject` function when the operation fails.\n */\n constructor(executor) {\n /**\n * The current state of this promise.\n */\n this.state = 1 /* Pending */;\n this[Symbol.toStringTag] = 'Promise';\n /**\n * If true, the resolution of this promise is chained (\"locked in\") to another promise.\n */\n let isChained = false;\n /**\n * Whether or not this promise is in a resolved state.\n */\n const isResolved = () => {\n return this.state !== 1 /* Pending */ || isChained;\n };\n /**\n * Callbacks that should be invoked once the asynchronous operation has completed.\n */\n let callbacks = [];\n /**\n * Initially pushes callbacks onto a queue for execution once this promise settles. After the promise settles,\n * enqueues callbacks for execution on the next event loop turn.\n */\n let whenFinished = function (callback) {\n if (callbacks) {\n callbacks.push(callback);\n }\n };\n /**\n * Settles this promise.\n *\n * @param newState The resolved state for this promise.\n * @param {T|any} value The resolved value for this promise.\n */\n const settle = (newState, value) => {\n // A promise can only be settled once.\n if (this.state !== 1 /* Pending */) {\n return;\n }\n this.state = newState;\n this.resolvedValue = value;\n whenFinished = queueMicroTask;\n // Only enqueue a callback runner if there are callbacks so that initially fulfilled Promises don't have to\n // wait an extra turn.\n if (callbacks && callbacks.length > 0) {\n queueMicroTask(function () {\n if (callbacks) {\n let count = callbacks.length;\n for (let i = 0; i < count; ++i) {\n callbacks[i].call(null);\n }\n callbacks = null;\n }\n });\n }\n };\n /**\n * Resolves this promise.\n *\n * @param newState The resolved state for this promise.\n * @param {T|any} value The resolved value for this promise.\n */\n const resolve = (newState, value) => {\n if (isResolved()) {\n return;\n }\n if (isThenable(value)) {\n value.then(settle.bind(null, 0 /* Fulfilled */), settle.bind(null, 2 /* Rejected */));\n isChained = true;\n }\n else {\n settle(newState, value);\n }\n };\n this.then = (onFulfilled, onRejected) => {\n return new Promise((resolve, reject) => {\n // whenFinished initially queues up callbacks for execution after the promise has settled. Once the\n // promise has settled, whenFinished will schedule callbacks for execution on the next turn through the\n // event loop.\n whenFinished(() => {\n const callback = this.state === 2 /* Rejected */ ? onRejected : onFulfilled;\n if (typeof callback === 'function') {\n try {\n resolve(callback(this.resolvedValue));\n }\n catch (error) {\n reject(error);\n }\n }\n else if (this.state === 2 /* Rejected */) {\n reject(this.resolvedValue);\n }\n else {\n resolve(this.resolvedValue);\n }\n });\n });\n };\n try {\n executor(resolve.bind(null, 0 /* Fulfilled */), resolve.bind(null, 2 /* Rejected */));\n }\n catch (error) {\n settle(2 /* Rejected */, error);\n }\n }\n static all(iterable) {\n return new this(function (resolve, reject) {\n const values = [];\n let complete = 0;\n let total = 0;\n let populating = true;\n function fulfill(index, value) {\n values[index] = value;\n ++complete;\n finish();\n }\n function finish() {\n if (populating || complete < total) {\n return;\n }\n resolve(values);\n }\n function processItem(index, item) {\n ++total;\n if (isThenable(item)) {\n // If an item Promise rejects, this Promise is immediately rejected with the item\n // Promise's rejection error.\n item.then(fulfill.bind(null, index), reject);\n }\n else {\n Promise.resolve(item).then(fulfill.bind(null, index));\n }\n }\n let i = 0;\n for (const value of iterable) {\n processItem(i, value);\n i++;\n }\n populating = false;\n finish();\n });\n }\n static race(iterable) {\n return new this(function (resolve, reject) {\n for (const item of iterable) {\n if (item instanceof Promise) {\n // If a Promise item rejects, this Promise is immediately rejected with the item\n // Promise's rejection error.\n item.then(resolve, reject);\n }\n else {\n Promise.resolve(item).then(resolve);\n }\n }\n });\n }\n static reject(reason) {\n return new this(function (resolve, reject) {\n reject(reason);\n });\n }\n static resolve(value) {\n return new this(function (resolve) {\n resolve(value);\n });\n }\n catch(onRejected) {\n return this.then(undefined, onRejected);\n }\n },\n _a[Symbol.species] = ShimPromise,\n _a);\n}\nexport default ShimPromise;\nvar _a;\n//# sourceMappingURL=Promise.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/Promise.mjs\n// module id = ./node_modules/@dojo/shim/Promise.mjs\n// module chunks = menu-item","import has from './support/has';\nimport global from './global';\nimport { getValueDescriptor } from './support/util';\nexport let Symbol = global.Symbol;\nif (!true) {\n /**\n * Throws if the value is not a symbol, used internally within the Shim\n * @param {any} value The value to check\n * @return {symbol} Returns the symbol or throws\n */\n const validateSymbol = function validateSymbol(value) {\n if (!isSymbol(value)) {\n throw new TypeError(value + ' is not a symbol');\n }\n return value;\n };\n const defineProperties = Object.defineProperties;\n const defineProperty = Object.defineProperty;\n const create = Object.create;\n const objPrototype = Object.prototype;\n const globalSymbols = {};\n const getSymbolName = (function () {\n const created = create(null);\n return function (desc) {\n let postfix = 0;\n let name;\n while (created[String(desc) + (postfix || '')]) {\n ++postfix;\n }\n desc += String(postfix || '');\n created[desc] = true;\n name = '@@' + desc;\n // FIXME: Temporary guard until the duplicate execution when testing can be\n // pinned down.\n if (!Object.getOwnPropertyDescriptor(objPrototype, name)) {\n defineProperty(objPrototype, name, {\n set: function (value) {\n defineProperty(this, name, getValueDescriptor(value));\n }\n });\n }\n return name;\n };\n })();\n const InternalSymbol = function Symbol(description) {\n if (this instanceof InternalSymbol) {\n throw new TypeError('TypeError: Symbol is not a constructor');\n }\n return Symbol(description);\n };\n Symbol = global.Symbol = function Symbol(description) {\n if (this instanceof Symbol) {\n throw new TypeError('TypeError: Symbol is not a constructor');\n }\n const sym = Object.create(InternalSymbol.prototype);\n description = description === undefined ? '' : String(description);\n return defineProperties(sym, {\n __description__: getValueDescriptor(description),\n __name__: getValueDescriptor(getSymbolName(description))\n });\n };\n /* Decorate the Symbol function with the appropriate properties */\n defineProperty(Symbol, 'for', getValueDescriptor(function (key) {\n if (globalSymbols[key]) {\n return globalSymbols[key];\n }\n return (globalSymbols[key] = Symbol(String(key)));\n }));\n defineProperties(Symbol, {\n keyFor: getValueDescriptor(function (sym) {\n let key;\n validateSymbol(sym);\n for (key in globalSymbols) {\n if (globalSymbols[key] === sym) {\n return key;\n }\n }\n }),\n hasInstance: getValueDescriptor(Symbol.for('hasInstance'), false, false),\n isConcatSpreadable: getValueDescriptor(Symbol.for('isConcatSpreadable'), false, false),\n iterator: getValueDescriptor(Symbol.for('iterator'), false, false),\n match: getValueDescriptor(Symbol.for('match'), false, false),\n observable: getValueDescriptor(Symbol.for('observable'), false, false),\n replace: getValueDescriptor(Symbol.for('replace'), false, false),\n search: getValueDescriptor(Symbol.for('search'), false, false),\n species: getValueDescriptor(Symbol.for('species'), false, false),\n split: getValueDescriptor(Symbol.for('split'), false, false),\n toPrimitive: getValueDescriptor(Symbol.for('toPrimitive'), false, false),\n toStringTag: getValueDescriptor(Symbol.for('toStringTag'), false, false),\n unscopables: getValueDescriptor(Symbol.for('unscopables'), false, false)\n });\n /* Decorate the InternalSymbol object */\n defineProperties(InternalSymbol.prototype, {\n constructor: getValueDescriptor(Symbol),\n toString: getValueDescriptor(function () {\n return this.__name__;\n }, false, false)\n });\n /* Decorate the Symbol.prototype */\n defineProperties(Symbol.prototype, {\n toString: getValueDescriptor(function () {\n return 'Symbol (' + validateSymbol(this).__description__ + ')';\n }),\n valueOf: getValueDescriptor(function () {\n return validateSymbol(this);\n })\n });\n defineProperty(Symbol.prototype, Symbol.toPrimitive, getValueDescriptor(function () {\n return validateSymbol(this);\n }));\n defineProperty(Symbol.prototype, Symbol.toStringTag, getValueDescriptor('Symbol', false, false, true));\n defineProperty(InternalSymbol.prototype, Symbol.toPrimitive, getValueDescriptor(Symbol.prototype[Symbol.toPrimitive], false, false, true));\n defineProperty(InternalSymbol.prototype, Symbol.toStringTag, getValueDescriptor(Symbol.prototype[Symbol.toStringTag], false, false, true));\n}\n/**\n * A custom guard function that determines if an object is a symbol or not\n * @param {any} value The value to check to see if it is a symbol or not\n * @return {is symbol} Returns true if a symbol or not (and narrows the type guard)\n */\nexport function isSymbol(value) {\n return (value && (typeof value === 'symbol' || value['@@toStringTag'] === 'Symbol')) || false;\n}\n/**\n * Fill any missing well known symbols if the native Symbol is missing them\n */\n[\n 'hasInstance',\n 'isConcatSpreadable',\n 'iterator',\n 'species',\n 'replace',\n 'search',\n 'split',\n 'match',\n 'toPrimitive',\n 'toStringTag',\n 'unscopables',\n 'observable'\n].forEach((wellKnown) => {\n if (!Symbol[wellKnown]) {\n Object.defineProperty(Symbol, wellKnown, getValueDescriptor(Symbol.for(wellKnown), false, false));\n }\n});\nexport default Symbol;\n//# sourceMappingURL=Symbol.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/Symbol.mjs\n// module id = ./node_modules/@dojo/shim/Symbol.mjs\n// module chunks = menu-item","import global from './global';\nimport { isArrayLike } from './iterator';\nimport has from './support/has';\nimport './Symbol';\nexport let WeakMap = global.WeakMap;\nif (!true) {\n const DELETED = {};\n const getUID = function getUID() {\n return Math.floor(Math.random() * 100000000);\n };\n const generateName = (function () {\n let startId = Math.floor(Date.now() % 100000000);\n return function generateName() {\n return '__wm' + getUID() + (startId++ + '__');\n };\n })();\n WeakMap = class WeakMap {\n constructor(iterable) {\n this[Symbol.toStringTag] = 'WeakMap';\n this._name = generateName();\n this._frozenEntries = [];\n if (iterable) {\n if (isArrayLike(iterable)) {\n for (let i = 0; i < iterable.length; i++) {\n const item = iterable[i];\n this.set(item[0], item[1]);\n }\n }\n else {\n for (const [key, value] of iterable) {\n this.set(key, value);\n }\n }\n }\n }\n _getFrozenEntryIndex(key) {\n for (let i = 0; i < this._frozenEntries.length; i++) {\n if (this._frozenEntries[i].key === key) {\n return i;\n }\n }\n return -1;\n }\n delete(key) {\n if (key === undefined || key === null) {\n return false;\n }\n const entry = key[this._name];\n if (entry && entry.key === key && entry.value !== DELETED) {\n entry.value = DELETED;\n return true;\n }\n const frozenIndex = this._getFrozenEntryIndex(key);\n if (frozenIndex >= 0) {\n this._frozenEntries.splice(frozenIndex, 1);\n return true;\n }\n return false;\n }\n get(key) {\n if (key === undefined || key === null) {\n return undefined;\n }\n const entry = key[this._name];\n if (entry && entry.key === key && entry.value !== DELETED) {\n return entry.value;\n }\n const frozenIndex = this._getFrozenEntryIndex(key);\n if (frozenIndex >= 0) {\n return this._frozenEntries[frozenIndex].value;\n }\n }\n has(key) {\n if (key === undefined || key === null) {\n return false;\n }\n const entry = key[this._name];\n if (Boolean(entry && entry.key === key && entry.value !== DELETED)) {\n return true;\n }\n const frozenIndex = this._getFrozenEntryIndex(key);\n if (frozenIndex >= 0) {\n return true;\n }\n return false;\n }\n set(key, value) {\n if (!key || (typeof key !== 'object' && typeof key !== 'function')) {\n throw new TypeError('Invalid value used as weak map key');\n }\n let entry = key[this._name];\n if (!entry || entry.key !== key) {\n entry = Object.create(null, {\n key: { value: key }\n });\n if (Object.isFrozen(key)) {\n this._frozenEntries.push(entry);\n }\n else {\n Object.defineProperty(key, this._name, {\n value: entry\n });\n }\n }\n entry.value = value;\n return this;\n }\n };\n}\nexport default WeakMap;\n//# sourceMappingURL=WeakMap.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/WeakMap.mjs\n// module id = ./node_modules/@dojo/shim/WeakMap.mjs\n// module chunks = menu-item","import global from './global';\nimport { isArrayLike, isIterable } from './iterator';\nimport { MAX_SAFE_INTEGER } from './number';\nimport has from './support/has';\nimport { wrapNative } from './support/util';\nexport let from;\n/**\n * Creates a new array from the function parameters.\n *\n * @param arguments Any number of arguments for the array\n * @return An array from the given arguments\n */\nexport let of;\n/* ES6 Array instance methods */\n/**\n * Copies data internally within an array or array-like object.\n *\n * @param target The target array-like object\n * @param offset The index to start copying values to; if negative, it counts backwards from length\n * @param start The first (inclusive) index to copy; if negative, it counts backwards from length\n * @param end The last (exclusive) index to copy; if negative, it counts backwards from length\n * @return The target\n */\nexport let copyWithin;\n/**\n * Fills elements of an array-like object with the specified value.\n *\n * @param target The target to fill\n * @param value The value to fill each element of the target with\n * @param start The first index to fill\n * @param end The (exclusive) index at which to stop filling\n * @return The filled target\n */\nexport let fill;\n/**\n * Finds and returns the first instance matching the callback or undefined if one is not found.\n *\n * @param target An array-like object\n * @param callback A function returning if the current value matches a criteria\n * @param thisArg The execution context for the find function\n * @return The first element matching the callback, or undefined if one does not exist\n */\nexport let find;\n/**\n * Performs a linear search and returns the first index whose value satisfies the passed callback,\n * or -1 if no values satisfy it.\n *\n * @param target An array-like object\n * @param callback A function returning true if the current value satisfies its criteria\n * @param thisArg The execution context for the find function\n * @return The first index whose value satisfies the passed callback, or -1 if no values satisfy it\n */\nexport let findIndex;\n/* ES7 Array instance methods */\n/**\n * Determines whether an array includes a given value\n *\n * @param target the target array-like object\n * @param searchElement the item to search for\n * @param fromIndex the starting index to search from\n * @return `true` if the array includes the element, otherwise `false`\n */\nexport let includes;\nif (true && true) {\n from = global.Array.from;\n of = global.Array.of;\n copyWithin = wrapNative(global.Array.prototype.copyWithin);\n fill = wrapNative(global.Array.prototype.fill);\n find = wrapNative(global.Array.prototype.find);\n findIndex = wrapNative(global.Array.prototype.findIndex);\n}\nelse {\n // It is only older versions of Safari/iOS that have a bad fill implementation and so aren't in the wild\n // To make things easier, if there is a bad fill implementation, the whole set of functions will be filled\n /**\n * Ensures a non-negative, non-infinite, safe integer.\n *\n * @param length The number to validate\n * @return A proper length\n */\n const toLength = function toLength(length) {\n if (isNaN(length)) {\n return 0;\n }\n length = Number(length);\n if (isFinite(length)) {\n length = Math.floor(length);\n }\n // Ensure a non-negative, real, safe integer\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\n };\n /**\n * From ES6 7.1.4 ToInteger()\n *\n * @param value A value to convert\n * @return An integer\n */\n const toInteger = function toInteger(value) {\n value = Number(value);\n if (isNaN(value)) {\n return 0;\n }\n if (value === 0 || !isFinite(value)) {\n return value;\n }\n return (value > 0 ? 1 : -1) * Math.floor(Math.abs(value));\n };\n /**\n * Normalizes an offset against a given length, wrapping it if negative.\n *\n * @param value The original offset\n * @param length The total length to normalize against\n * @return If negative, provide a distance from the end (length); otherwise provide a distance from 0\n */\n const normalizeOffset = function normalizeOffset(value, length) {\n return value < 0 ? Math.max(length + value, 0) : Math.min(value, length);\n };\n from = function from(arrayLike, mapFunction, thisArg) {\n if (arrayLike == null) {\n throw new TypeError('from: requires an array-like object');\n }\n if (mapFunction && thisArg) {\n mapFunction = mapFunction.bind(thisArg);\n }\n /* tslint:disable-next-line:variable-name */\n const Constructor = this;\n const length = toLength(arrayLike.length);\n // Support extension\n const array = typeof Constructor === 'function' ? Object(new Constructor(length)) : new Array(length);\n if (!isArrayLike(arrayLike) && !isIterable(arrayLike)) {\n return array;\n }\n // if this is an array and the normalized length is 0, just return an empty array. this prevents a problem\n // with the iteration on IE when using a NaN array length.\n if (isArrayLike(arrayLike)) {\n if (length === 0) {\n return [];\n }\n for (let i = 0; i < arrayLike.length; i++) {\n array[i] = mapFunction ? mapFunction(arrayLike[i], i) : arrayLike[i];\n }\n }\n else {\n let i = 0;\n for (const value of arrayLike) {\n array[i] = mapFunction ? mapFunction(value, i) : value;\n i++;\n }\n }\n if (arrayLike.length !== undefined) {\n array.length = length;\n }\n return array;\n };\n of = function of(...items) {\n return Array.prototype.slice.call(items);\n };\n copyWithin = function copyWithin(target, offset, start, end) {\n if (target == null) {\n throw new TypeError('copyWithin: target must be an array-like object');\n }\n const length = toLength(target.length);\n offset = normalizeOffset(toInteger(offset), length);\n start = normalizeOffset(toInteger(start), length);\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\n let count = Math.min(end - start, length - offset);\n let direction = 1;\n if (offset > start && offset < start + count) {\n direction = -1;\n start += count - 1;\n offset += count - 1;\n }\n while (count > 0) {\n if (start in target) {\n target[offset] = target[start];\n }\n else {\n delete target[offset];\n }\n offset += direction;\n start += direction;\n count--;\n }\n return target;\n };\n fill = function fill(target, value, start, end) {\n const length = toLength(target.length);\n let i = normalizeOffset(toInteger(start), length);\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\n while (i < end) {\n target[i++] = value;\n }\n return target;\n };\n find = function find(target, callback, thisArg) {\n const index = findIndex(target, callback, thisArg);\n return index !== -1 ? target[index] : undefined;\n };\n findIndex = function findIndex(target, callback, thisArg) {\n const length = toLength(target.length);\n if (!callback) {\n throw new TypeError('find: second argument must be a function');\n }\n if (thisArg) {\n callback = callback.bind(thisArg);\n }\n for (let i = 0; i < length; i++) {\n if (callback(target[i], i, target)) {\n return i;\n }\n }\n return -1;\n };\n}\nif (true) {\n includes = wrapNative(global.Array.prototype.includes);\n}\nelse {\n /**\n * Ensures a non-negative, non-infinite, safe integer.\n *\n * @param length The number to validate\n * @return A proper length\n */\n const toLength = function toLength(length) {\n length = Number(length);\n if (isNaN(length)) {\n return 0;\n }\n if (isFinite(length)) {\n length = Math.floor(length);\n }\n // Ensure a non-negative, real, safe integer\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\n };\n includes = function includes(target, searchElement, fromIndex = 0) {\n let len = toLength(target.length);\n for (let i = fromIndex; i < len; ++i) {\n const currentElement = target[i];\n if (searchElement === currentElement ||\n (searchElement !== searchElement && currentElement !== currentElement)) {\n return true;\n }\n }\n return false;\n };\n}\n//# sourceMappingURL=array.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/array.mjs\n// module id = ./node_modules/@dojo/shim/array.mjs\n// module chunks = menu-item","const globalObject = (function () {\n if (typeof global !== 'undefined') {\n // global spec defines a reference to the global object called 'global'\n // https://github.com/tc39/proposal-global\n // `global` is also defined in NodeJS\n return global;\n }\n else if (typeof window !== 'undefined') {\n // window is defined in browsers\n return window;\n }\n else if (typeof self !== 'undefined') {\n // self is defined in WebWorkers\n return self;\n }\n})();\nexport default globalObject;\n//# sourceMappingURL=global.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/global.mjs\n// module id = ./node_modules/@dojo/shim/global.mjs\n// module chunks = menu-item","import global from './global';\n/**\n * The smallest interval between two representable numbers.\n */\nexport const EPSILON = 1;\n/**\n * The maximum safe integer in JavaScript\n */\nexport const MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n/**\n * The minimum safe integer in JavaScript\n */\nexport const MIN_SAFE_INTEGER = -MAX_SAFE_INTEGER;\n/**\n * Determines whether the passed value is NaN without coersion.\n *\n * @param value The value to test\n * @return true if the value is NaN, false if it is not\n */\nexport function isNaN(value) {\n return typeof value === 'number' && global.isNaN(value);\n}\n/**\n * Determines whether the passed value is a finite number without coersion.\n *\n * @param value The value to test\n * @return true if the value is finite, false if it is not\n */\nexport function isFinite(value) {\n return typeof value === 'number' && global.isFinite(value);\n}\n/**\n * Determines whether the passed value is an integer.\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isInteger(value) {\n return isFinite(value) && Math.floor(value) === value;\n}\n/**\n * Determines whether the passed value is an integer that is 'safe,' meaning:\n * 1. it can be expressed as an IEEE-754 double precision number\n * 2. it has a one-to-one mapping to a mathematical integer, meaning its\n * IEEE-754 representation cannot be the result of rounding any other\n * integer to fit the IEEE-754 representation\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isSafeInteger(value) {\n return isInteger(value) && Math.abs(value) <= MAX_SAFE_INTEGER;\n}\n//# sourceMappingURL=number.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/number.mjs\n// module id = ./node_modules/@dojo/shim/number.mjs\n// module chunks = menu-item","import global from './global';\nimport has from './support/has';\nimport { isSymbol } from './Symbol';\nexport let assign;\n/**\n * Gets the own property descriptor of the specified object.\n * An own property descriptor is one that is defined directly on the object and is not\n * inherited from the object's prototype.\n * @param o Object that contains the property.\n * @param p Name of the property.\n */\nexport let getOwnPropertyDescriptor;\n/**\n * Returns the names of the own properties of an object. The own properties of an object are those that are defined directly\n * on that object, and are not inherited from the object's prototype. The properties of an object include both fields (objects) and functions.\n * @param o Object that contains the own properties.\n */\nexport let getOwnPropertyNames;\n/**\n * Returns an array of all symbol properties found directly on object o.\n * @param o Object to retrieve the symbols from.\n */\nexport let getOwnPropertySymbols;\n/**\n * Returns true if the values are the same value, false otherwise.\n * @param value1 The first value.\n * @param value2 The second value.\n */\nexport let is;\n/**\n * Returns the names of the enumerable properties and methods of an object.\n * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.\n */\nexport let keys;\n/* ES7 Object static methods */\nexport let getOwnPropertyDescriptors;\nexport let entries;\nexport let values;\nif (true) {\n const globalObject = global.Object;\n assign = globalObject.assign;\n getOwnPropertyDescriptor = globalObject.getOwnPropertyDescriptor;\n getOwnPropertyNames = globalObject.getOwnPropertyNames;\n getOwnPropertySymbols = globalObject.getOwnPropertySymbols;\n is = globalObject.is;\n keys = globalObject.keys;\n}\nelse {\n keys = function symbolAwareKeys(o) {\n return Object.keys(o).filter((key) => !Boolean(key.match(/^@@.+/)));\n };\n assign = function assign(target, ...sources) {\n if (target == null) {\n // TypeError if undefined or null\n throw new TypeError('Cannot convert undefined or null to object');\n }\n const to = Object(target);\n sources.forEach((nextSource) => {\n if (nextSource) {\n // Skip over if undefined or null\n keys(nextSource).forEach((nextKey) => {\n to[nextKey] = nextSource[nextKey];\n });\n }\n });\n return to;\n };\n getOwnPropertyDescriptor = function getOwnPropertyDescriptor(o, prop) {\n if (isSymbol(prop)) {\n return Object.getOwnPropertyDescriptor(o, prop);\n }\n else {\n return Object.getOwnPropertyDescriptor(o, prop);\n }\n };\n getOwnPropertyNames = function getOwnPropertyNames(o) {\n return Object.getOwnPropertyNames(o).filter((key) => !Boolean(key.match(/^@@.+/)));\n };\n getOwnPropertySymbols = function getOwnPropertySymbols(o) {\n return Object.getOwnPropertyNames(o)\n .filter((key) => Boolean(key.match(/^@@.+/)))\n .map((key) => Symbol.for(key.substring(2)));\n };\n is = function is(value1, value2) {\n if (value1 === value2) {\n return value1 !== 0 || 1 / value1 === 1 / value2; // -0\n }\n return value1 !== value1 && value2 !== value2; // NaN\n };\n}\nif (true) {\n const globalObject = global.Object;\n getOwnPropertyDescriptors = globalObject.getOwnPropertyDescriptors;\n entries = globalObject.entries;\n values = globalObject.values;\n}\nelse {\n getOwnPropertyDescriptors = function getOwnPropertyDescriptors(o) {\n return getOwnPropertyNames(o).reduce((previous, key) => {\n previous[key] = getOwnPropertyDescriptor(o, key);\n return previous;\n }, {});\n };\n entries = function entries(o) {\n return keys(o).map((key) => [key, o[key]]);\n };\n values = function values(o) {\n return keys(o).map((key) => o[key]);\n };\n}\n//# sourceMappingURL=object.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/object.mjs\n// module id = ./node_modules/@dojo/shim/object.mjs\n// module chunks = menu-item","import global from './global';\nimport has from './support/has';\nimport { wrapNative } from './support/util';\n/**\n * The minimum location of high surrogates\n */\nexport const HIGH_SURROGATE_MIN = 0xd800;\n/**\n * The maximum location of high surrogates\n */\nexport const HIGH_SURROGATE_MAX = 0xdbff;\n/**\n * The minimum location of low surrogates\n */\nexport const LOW_SURROGATE_MIN = 0xdc00;\n/**\n * The maximum location of low surrogates\n */\nexport const LOW_SURROGATE_MAX = 0xdfff;\n/* ES6 static methods */\n/**\n * Return the String value whose elements are, in order, the elements in the List elements.\n * If length is 0, the empty string is returned.\n * @param codePoints The code points to generate the string\n */\nexport let fromCodePoint;\n/**\n * `raw` is intended for use as a tag function of a Tagged Template String. When called\n * as such the first argument will be a well formed template call site object and the rest\n * parameter will contain the substitution values.\n * @param template A well-formed template string call site representation.\n * @param substitutions A set of substitution values.\n */\nexport let raw;\n/* ES6 instance methods */\n/**\n * Returns a nonnegative integer Number less than 1114112 (0x110000) that is the code point\n * value of the UTF-16 encoded code point starting at the string element at position pos in\n * the String resulting from converting this object to a String.\n * If there is no element at that position, the result is undefined.\n * If a valid UTF-16 surrogate pair does not begin at pos, the result is the code unit at pos.\n */\nexport let codePointAt;\n/**\n * Returns true if the sequence of elements of searchString converted to a String is the\n * same as the corresponding elements of this object (converted to a String) starting at\n * endPosition – length(this). Otherwise returns false.\n */\nexport let endsWith;\n/**\n * Returns true if searchString appears as a substring of the result of converting this\n * object to a String, at one or more positions that are\n * greater than or equal to position; otherwise, returns false.\n * @param target The target string\n * @param searchString search string\n * @param position If position is undefined, 0 is assumed, so as to search all of the String.\n */\nexport let includes;\n/**\n * Returns the String value result of normalizing the string into the normalization form\n * named by form as specified in Unicode Standard Annex #15, Unicode Normalization Forms.\n * @param target The target string\n * @param form Applicable values: \"NFC\", \"NFD\", \"NFKC\", or \"NFKD\", If not specified default\n * is \"NFC\"\n */\nexport let normalize;\n/**\n * Returns a String value that is made from count copies appended together. If count is 0,\n * T is the empty String is returned.\n * @param count number of copies to append\n */\nexport let repeat;\n/**\n * Returns true if the sequence of elements of searchString converted to a String is the\n * same as the corresponding elements of this object (converted to a String) starting at\n * position. Otherwise returns false.\n */\nexport let startsWith;\n/* ES7 instance methods */\n/**\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\n * The padding is applied from the end (right) of the current string.\n *\n * @param target The target string\n * @param maxLength The length of the resulting string once the current string has been padded.\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\n *\n * @param fillString The string to pad the current string with.\n * If this string is too long, it will be truncated and the left-most part will be applied.\n * The default value for this parameter is \" \" (U+0020).\n */\nexport let padEnd;\n/**\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\n * The padding is applied from the start (left) of the current string.\n *\n * @param target The target string\n * @param maxLength The length of the resulting string once the current string has been padded.\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\n *\n * @param fillString The string to pad the current string with.\n * If this string is too long, it will be truncated and the left-most part will be applied.\n * The default value for this parameter is \" \" (U+0020).\n */\nexport let padStart;\nif (true && true) {\n fromCodePoint = global.String.fromCodePoint;\n raw = global.String.raw;\n codePointAt = wrapNative(global.String.prototype.codePointAt);\n endsWith = wrapNative(global.String.prototype.endsWith);\n includes = wrapNative(global.String.prototype.includes);\n normalize = wrapNative(global.String.prototype.normalize);\n repeat = wrapNative(global.String.prototype.repeat);\n startsWith = wrapNative(global.String.prototype.startsWith);\n}\nelse {\n /**\n * Validates that text is defined, and normalizes position (based on the given default if the input is NaN).\n * Used by startsWith, includes, and endsWith.\n *\n * @return Normalized position.\n */\n const normalizeSubstringArgs = function (name, text, search, position, isEnd = false) {\n if (text == null) {\n throw new TypeError('string.' + name + ' requires a valid string to search against.');\n }\n const length = text.length;\n position = position !== position ? (isEnd ? length : 0) : position;\n return [text, String(search), Math.min(Math.max(position, 0), length)];\n };\n fromCodePoint = function fromCodePoint(...codePoints) {\n // Adapted from https://github.com/mathiasbynens/String.fromCodePoint\n const length = arguments.length;\n if (!length) {\n return '';\n }\n const fromCharCode = String.fromCharCode;\n const MAX_SIZE = 0x4000;\n let codeUnits = [];\n let index = -1;\n let result = '';\n while (++index < length) {\n let codePoint = Number(arguments[index]);\n // Code points must be finite integers within the valid range\n let isValid = isFinite(codePoint) && Math.floor(codePoint) === codePoint && codePoint >= 0 && codePoint <= 0x10ffff;\n if (!isValid) {\n throw RangeError('string.fromCodePoint: Invalid code point ' + codePoint);\n }\n if (codePoint <= 0xffff) {\n // BMP code point\n codeUnits.push(codePoint);\n }\n else {\n // Astral code point; split in surrogate halves\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n codePoint -= 0x10000;\n let highSurrogate = (codePoint >> 10) + HIGH_SURROGATE_MIN;\n let lowSurrogate = codePoint % 0x400 + LOW_SURROGATE_MIN;\n codeUnits.push(highSurrogate, lowSurrogate);\n }\n if (index + 1 === length || codeUnits.length > MAX_SIZE) {\n result += fromCharCode.apply(null, codeUnits);\n codeUnits.length = 0;\n }\n }\n return result;\n };\n raw = function raw(callSite, ...substitutions) {\n let rawStrings = callSite.raw;\n let result = '';\n let numSubstitutions = substitutions.length;\n if (callSite == null || callSite.raw == null) {\n throw new TypeError('string.raw requires a valid callSite object with a raw value');\n }\n for (let i = 0, length = rawStrings.length; i < length; i++) {\n result += rawStrings[i] + (i < numSubstitutions && i < length - 1 ? substitutions[i] : '');\n }\n return result;\n };\n codePointAt = function codePointAt(text, position = 0) {\n // Adapted from https://github.com/mathiasbynens/String.prototype.codePointAt\n if (text == null) {\n throw new TypeError('string.codePointAt requries a valid string.');\n }\n const length = text.length;\n if (position !== position) {\n position = 0;\n }\n if (position < 0 || position >= length) {\n return undefined;\n }\n // Get the first code unit\n const first = text.charCodeAt(position);\n if (first >= HIGH_SURROGATE_MIN && first <= HIGH_SURROGATE_MAX && length > position + 1) {\n // Start of a surrogate pair (high surrogate and there is a next code unit); check for low surrogate\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n const second = text.charCodeAt(position + 1);\n if (second >= LOW_SURROGATE_MIN && second <= LOW_SURROGATE_MAX) {\n return (first - HIGH_SURROGATE_MIN) * 0x400 + second - LOW_SURROGATE_MIN + 0x10000;\n }\n }\n return first;\n };\n endsWith = function endsWith(text, search, endPosition) {\n if (endPosition == null) {\n endPosition = text.length;\n }\n [text, search, endPosition] = normalizeSubstringArgs('endsWith', text, search, endPosition, true);\n const start = endPosition - search.length;\n if (start < 0) {\n return false;\n }\n return text.slice(start, endPosition) === search;\n };\n includes = function includes(text, search, position = 0) {\n [text, search, position] = normalizeSubstringArgs('includes', text, search, position);\n return text.indexOf(search, position) !== -1;\n };\n repeat = function repeat(text, count = 0) {\n // Adapted from https://github.com/mathiasbynens/String.prototype.repeat\n if (text == null) {\n throw new TypeError('string.repeat requires a valid string.');\n }\n if (count !== count) {\n count = 0;\n }\n if (count < 0 || count === Infinity) {\n throw new RangeError('string.repeat requires a non-negative finite count.');\n }\n let result = '';\n while (count) {\n if (count % 2) {\n result += text;\n }\n if (count > 1) {\n text += text;\n }\n count >>= 1;\n }\n return result;\n };\n startsWith = function startsWith(text, search, position = 0) {\n search = String(search);\n [text, search, position] = normalizeSubstringArgs('startsWith', text, search, position);\n const end = position + search.length;\n if (end > text.length) {\n return false;\n }\n return text.slice(position, end) === search;\n };\n}\nif (true) {\n padEnd = wrapNative(global.String.prototype.padEnd);\n padStart = wrapNative(global.String.prototype.padStart);\n}\nelse {\n padEnd = function padEnd(text, maxLength, fillString = ' ') {\n if (text === null || text === undefined) {\n throw new TypeError('string.repeat requires a valid string.');\n }\n if (maxLength === Infinity) {\n throw new RangeError('string.padEnd requires a non-negative finite count.');\n }\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\n maxLength = 0;\n }\n let strText = String(text);\n const padding = maxLength - strText.length;\n if (padding > 0) {\n strText +=\n repeat(fillString, Math.floor(padding / fillString.length)) +\n fillString.slice(0, padding % fillString.length);\n }\n return strText;\n };\n padStart = function padStart(text, maxLength, fillString = ' ') {\n if (text === null || text === undefined) {\n throw new TypeError('string.repeat requires a valid string.');\n }\n if (maxLength === Infinity) {\n throw new RangeError('string.padStart requires a non-negative finite count.');\n }\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\n maxLength = 0;\n }\n let strText = String(text);\n const padding = maxLength - strText.length;\n if (padding > 0) {\n strText =\n repeat(fillString, Math.floor(padding / fillString.length)) +\n fillString.slice(0, padding % fillString.length) +\n strText;\n }\n return strText;\n };\n}\n//# sourceMappingURL=string.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/string.mjs\n// module id = ./node_modules/@dojo/shim/string.mjs\n// module chunks = menu-item","import has, { add } from '@dojo/has/has';\nimport global from '../global';\nexport default has;\nexport * from '@dojo/has/has';\n/* ECMAScript 6 and 7 Features */\n/* Array */\nadd('es6-array', () => {\n return (['from', 'of'].every((key) => key in global.Array) &&\n ['findIndex', 'find', 'copyWithin'].every((key) => key in global.Array.prototype));\n}, true);\nadd('es6-array-fill', () => {\n if ('fill' in global.Array.prototype) {\n /* Some versions of Safari do not properly implement this */\n return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1;\n }\n return false;\n}, true);\nadd('es7-array', () => 'includes' in global.Array.prototype, true);\n/* Map */\nadd('es6-map', () => {\n if (typeof global.Map === 'function') {\n /*\n IE11 and older versions of Safari are missing critical ES6 Map functionality\n We wrap this in a try/catch because sometimes the Map constructor exists, but does not\n take arguments (iOS 8.4)\n */\n try {\n const map = new global.Map([[0, 1]]);\n return map.has(0) &&\n typeof map.keys === 'function' &&\n true &&\n typeof map.values === 'function' &&\n typeof map.entries === 'function';\n }\n catch (e) {\n /* istanbul ignore next: not testing on iOS at the moment */\n return false;\n }\n }\n return false;\n}, true);\n/* Math */\nadd('es6-math', () => {\n return [\n 'clz32',\n 'sign',\n 'log10',\n 'log2',\n 'log1p',\n 'expm1',\n 'cosh',\n 'sinh',\n 'tanh',\n 'acosh',\n 'asinh',\n 'atanh',\n 'trunc',\n 'fround',\n 'cbrt',\n 'hypot'\n ].every((name) => typeof global.Math[name] === 'function');\n}, true);\nadd('es6-math-imul', () => {\n if ('imul' in global.Math) {\n /* Some versions of Safari on ios do not properly implement this */\n return Math.imul(0xffffffff, 5) === -5;\n }\n return false;\n}, true);\n/* Object */\nadd('es6-object', () => {\n return true &&\n ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof global.Object[name] === 'function');\n}, true);\nadd('es2017-object', () => {\n return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof global.Object[name] === 'function');\n}, true);\n/* Observable */\nadd('es-observable', () => typeof global.Observable !== 'undefined', true);\n/* Promise */\nadd('es6-promise', () => typeof global.Promise !== 'undefined' && true, true);\n/* Set */\nadd('es6-set', () => {\n if (typeof global.Set === 'function') {\n /* IE11 and older versions of Safari are missing critical ES6 Set functionality */\n const set = new global.Set([1]);\n return set.has(1) && 'keys' in set && typeof set.keys === 'function' && true;\n }\n return false;\n}, true);\n/* String */\nadd('es6-string', () => {\n return ([\n /* static methods */\n 'fromCodePoint'\n ].every((key) => typeof global.String[key] === 'function') &&\n [\n /* instance methods */\n 'codePointAt',\n 'normalize',\n 'repeat',\n 'startsWith',\n 'endsWith',\n 'includes'\n ].every((key) => typeof global.String.prototype[key] === 'function'));\n}, true);\nadd('es6-string-raw', () => {\n function getCallSite(callSite, ...substitutions) {\n const result = [...callSite];\n result.raw = callSite.raw;\n return result;\n }\n if ('raw' in global.String) {\n let b = 1;\n let callSite = getCallSite `a\\n${b}`;\n callSite.raw = ['a\\\\n'];\n const supportsTrunc = global.String.raw(callSite, 42) === 'a:\\\\n';\n return supportsTrunc;\n }\n return false;\n}, true);\nadd('es2017-string', () => {\n return ['padStart', 'padEnd'].every((key) => typeof global.String.prototype[key] === 'function');\n}, true);\n/* Symbol */\nadd('es6-symbol', () => typeof global.Symbol !== 'undefined' && typeof Symbol() === 'symbol', true);\n/* WeakMap */\nadd('es6-weakmap', () => {\n if (typeof global.WeakMap !== 'undefined') {\n /* IE11 and older versions of Safari are missing critical ES6 Map functionality */\n const key1 = {};\n const key2 = {};\n const map = new global.WeakMap([[key1, 1]]);\n Object.freeze(key1);\n return map.get(key1) === 1 && map.set(key2, 2) === map && true;\n }\n return false;\n}, true);\n/* Miscellaneous features */\nadd('microtasks', () => true || false || true, true);\nadd('postmessage', () => {\n // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have\n // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist.\n return typeof global.window !== 'undefined' && typeof global.postMessage === 'function';\n}, true);\nadd('raf', () => typeof global.requestAnimationFrame === 'function', true);\nadd('setimmediate', () => typeof global.setImmediate !== 'undefined', true);\n/* DOM Features */\nadd('dom-mutationobserver', () => {\n if (true && Boolean(global.MutationObserver || global.WebKitMutationObserver)) {\n // IE11 has an unreliable MutationObserver implementation where setProperty() does not\n // generate a mutation event, observers can crash, and the queue does not drain\n // reliably. The following feature test was adapted from\n // https://gist.github.com/t10ko/4aceb8c71681fdb275e33efe5e576b14\n const example = document.createElement('div');\n /* tslint:disable-next-line:variable-name */\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\n const observer = new HostMutationObserver(function () { });\n observer.observe(example, { attributes: true });\n example.style.setProperty('display', 'block');\n return Boolean(observer.takeRecords().length);\n }\n return false;\n}, true);\nadd('dom-webanimation', () => true && global.Animation !== undefined && global.KeyframeEffect !== undefined, true);\n//# sourceMappingURL=has.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/support/has.mjs\n// module id = ./node_modules/@dojo/shim/support/has.mjs\n// module chunks = menu-item","import global from '../global';\nimport has from './has';\nfunction executeTask(item) {\n if (item && item.isActive && item.callback) {\n item.callback();\n }\n}\nfunction getQueueHandle(item, destructor) {\n return {\n destroy: function () {\n this.destroy = function () { };\n item.isActive = false;\n item.callback = null;\n if (destructor) {\n destructor();\n }\n }\n };\n}\nlet checkMicroTaskQueue;\nlet microTasks;\n/**\n * Schedules a callback to the macrotask queue.\n *\n * @param callback the function to be queued and later executed.\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\n */\nexport const queueTask = (function () {\n let destructor;\n let enqueue;\n // Since the IE implementation of `setImmediate` is not flawless, we will test for `postMessage` first.\n if (true) {\n const queue = [];\n global.addEventListener('message', function (event) {\n // Confirm that the event was triggered by the current window and by this particular implementation.\n if (event.source === global && event.data === 'dojo-queue-message') {\n event.stopPropagation();\n if (queue.length) {\n executeTask(queue.shift());\n }\n }\n });\n enqueue = function (item) {\n queue.push(item);\n global.postMessage('dojo-queue-message', '*');\n };\n }\n else if (false) {\n destructor = global.clearImmediate;\n enqueue = function (item) {\n return setImmediate(executeTask.bind(null, item));\n };\n }\n else {\n destructor = global.clearTimeout;\n enqueue = function (item) {\n return setTimeout(executeTask.bind(null, item), 0);\n };\n }\n function queueTask(callback) {\n const item = {\n isActive: true,\n callback: callback\n };\n const id = enqueue(item);\n return getQueueHandle(item, destructor &&\n function () {\n destructor(id);\n });\n }\n // TODO: Use aspect.before when it is available.\n return true\n ? queueTask\n : function (callback) {\n checkMicroTaskQueue();\n return queueTask(callback);\n };\n})();\n// When no mechanism for registering microtasks is exposed by the environment, microtasks will\n// be queued and then executed in a single macrotask before the other macrotasks are executed.\nif (!true) {\n let isMicroTaskQueued = false;\n microTasks = [];\n checkMicroTaskQueue = function () {\n if (!isMicroTaskQueued) {\n isMicroTaskQueued = true;\n queueTask(function () {\n isMicroTaskQueued = false;\n if (microTasks.length) {\n let item;\n while ((item = microTasks.shift())) {\n executeTask(item);\n }\n }\n });\n }\n };\n}\n/**\n * Schedules an animation task with `window.requestAnimationFrame` if it exists, or with `queueTask` otherwise.\n *\n * Since requestAnimationFrame's behavior does not match that expected from `queueTask`, it is not used there.\n * However, at times it makes more sense to delegate to requestAnimationFrame; hence the following method.\n *\n * @param callback the function to be queued and later executed.\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\n */\nexport const queueAnimationTask = (function () {\n if (!true) {\n return queueTask;\n }\n function queueAnimationTask(callback) {\n const item = {\n isActive: true,\n callback: callback\n };\n const rafId = requestAnimationFrame(executeTask.bind(null, item));\n return getQueueHandle(item, function () {\n cancelAnimationFrame(rafId);\n });\n }\n // TODO: Use aspect.before when it is available.\n return true\n ? queueAnimationTask\n : function (callback) {\n checkMicroTaskQueue();\n return queueAnimationTask(callback);\n };\n})();\n/**\n * Schedules a callback to the microtask queue.\n *\n * Any callbacks registered with `queueMicroTask` will be executed before the next macrotask. If no native\n * mechanism for scheduling macrotasks is exposed, then any callbacks will be fired before any macrotask\n * registered with `queueTask` or `queueAnimationTask`.\n *\n * @param callback the function to be queued and later executed.\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\n */\nexport let queueMicroTask = (function () {\n let enqueue;\n if (false) {\n enqueue = function (item) {\n global.process.nextTick(executeTask.bind(null, item));\n };\n }\n else if (true) {\n enqueue = function (item) {\n global.Promise.resolve(item).then(executeTask);\n };\n }\n else if (true) {\n /* tslint:disable-next-line:variable-name */\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\n const node = document.createElement('div');\n const queue = [];\n const observer = new HostMutationObserver(function () {\n while (queue.length > 0) {\n const item = queue.shift();\n if (item && item.isActive && item.callback) {\n item.callback();\n }\n }\n });\n observer.observe(node, { attributes: true });\n enqueue = function (item) {\n queue.push(item);\n node.setAttribute('queueStatus', '1');\n };\n }\n else {\n enqueue = function (item) {\n checkMicroTaskQueue();\n microTasks.push(item);\n };\n }\n return function (callback) {\n const item = {\n isActive: true,\n callback: callback\n };\n enqueue(item);\n return getQueueHandle(item);\n };\n})();\n//# sourceMappingURL=queue.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/support/queue.mjs\n// module id = ./node_modules/@dojo/shim/support/queue.mjs\n// module chunks = menu-item","/**\n * Helper function to generate a value property descriptor\n *\n * @param value The value the property descriptor should be set to\n * @param enumerable If the property should be enumberable, defaults to false\n * @param writable If the property should be writable, defaults to true\n * @param configurable If the property should be configurable, defaults to true\n * @return The property descriptor object\n */\nexport function getValueDescriptor(value, enumerable = false, writable = true, configurable = true) {\n return {\n value: value,\n enumerable: enumerable,\n writable: writable,\n configurable: configurable\n };\n}\nexport function wrapNative(nativeFunction) {\n return function (target, ...args) {\n return nativeFunction.apply(target, args);\n };\n}\n//# sourceMappingURL=util.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/support/util.mjs\n// module id = ./node_modules/@dojo/shim/support/util.mjs\n// module chunks = menu-item","import { Evented } from '@dojo/core/Evented';\nexport class Injector extends Evented {\n constructor(payload) {\n super();\n this._payload = payload;\n }\n setInvalidator(invalidator) {\n this._invalidator = invalidator;\n }\n get() {\n return this._payload;\n }\n set(payload) {\n this._payload = payload;\n if (this._invalidator) {\n this._invalidator();\n }\n }\n}\nexport default Injector;\n//# sourceMappingURL=Injector.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/Injector.mjs\n// module id = ./node_modules/@dojo/widget-core/Injector.mjs\n// module chunks = menu-item","import { Evented } from '@dojo/core/Evented';\nimport Map from '@dojo/shim/Map';\n/**\n * Enum to identify the type of event.\n * Listening to 'Projector' will notify when projector is created or updated\n * Listening to 'Widget' will notify when widget root is created or updated\n */\nexport var NodeEventType;\n(function (NodeEventType) {\n NodeEventType[\"Projector\"] = \"Projector\";\n NodeEventType[\"Widget\"] = \"Widget\";\n})(NodeEventType || (NodeEventType = {}));\nexport class NodeHandler extends Evented {\n constructor() {\n super(...arguments);\n this._nodeMap = new Map();\n }\n get(key) {\n return this._nodeMap.get(key);\n }\n has(key) {\n return this._nodeMap.has(key);\n }\n add(element, key) {\n this._nodeMap.set(key, element);\n this.emit({ type: key });\n }\n addRoot() {\n this.emit({ type: NodeEventType.Widget });\n }\n addProjector() {\n this.emit({ type: NodeEventType.Projector });\n }\n clear() {\n this._nodeMap.clear();\n }\n}\nexport default NodeHandler;\n//# sourceMappingURL=NodeHandler.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/NodeHandler.mjs\n// module id = ./node_modules/@dojo/widget-core/NodeHandler.mjs\n// module chunks = menu-item","import Promise from '@dojo/shim/Promise';\nimport Map from '@dojo/shim/Map';\nimport Symbol from '@dojo/shim/Symbol';\nimport { Evented } from '@dojo/core/Evented';\n/**\n * Widget base symbol type\n */\nexport const WIDGET_BASE_TYPE = Symbol('Widget Base');\n/**\n * Checks is the item is a subclass of WidgetBase (or a WidgetBase)\n *\n * @param item the item to check\n * @returns true/false indicating if the item is a WidgetBaseConstructor\n */\nexport function isWidgetBaseConstructor(item) {\n return Boolean(item && item._type === WIDGET_BASE_TYPE);\n}\nexport function isWidgetConstructorDefaultExport(item) {\n return Boolean(item &&\n item.hasOwnProperty('__esModule') &&\n item.hasOwnProperty('default') &&\n isWidgetBaseConstructor(item.default));\n}\n/**\n * The Registry implementation\n */\nexport class Registry extends Evented {\n /**\n * Emit loaded event for registry label\n */\n emitLoadedEvent(widgetLabel, item) {\n this.emit({\n type: widgetLabel,\n action: 'loaded',\n item\n });\n }\n define(label, item) {\n if (this._widgetRegistry === undefined) {\n this._widgetRegistry = new Map();\n }\n if (this._widgetRegistry.has(label)) {\n throw new Error(`widget has already been registered for '${label.toString()}'`);\n }\n this._widgetRegistry.set(label, item);\n if (item instanceof Promise) {\n item.then((widgetCtor) => {\n this._widgetRegistry.set(label, widgetCtor);\n this.emitLoadedEvent(label, widgetCtor);\n return widgetCtor;\n }, (error) => {\n throw error;\n });\n }\n else if (isWidgetBaseConstructor(item)) {\n this.emitLoadedEvent(label, item);\n }\n }\n defineInjector(label, injectorFactory) {\n if (this._injectorRegistry === undefined) {\n this._injectorRegistry = new Map();\n }\n if (this._injectorRegistry.has(label)) {\n throw new Error(`injector has already been registered for '${label.toString()}'`);\n }\n const invalidator = new Evented();\n const injectorItem = {\n injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })),\n invalidator\n };\n this._injectorRegistry.set(label, injectorItem);\n this.emitLoadedEvent(label, injectorItem);\n }\n get(label) {\n if (!this._widgetRegistry || !this.has(label)) {\n return null;\n }\n const item = this._widgetRegistry.get(label);\n if (isWidgetBaseConstructor(item)) {\n return item;\n }\n if (item instanceof Promise) {\n return null;\n }\n const promise = item();\n this._widgetRegistry.set(label, promise);\n promise.then((widgetCtor) => {\n if (isWidgetConstructorDefaultExport(widgetCtor)) {\n widgetCtor = widgetCtor.default;\n }\n this._widgetRegistry.set(label, widgetCtor);\n this.emitLoadedEvent(label, widgetCtor);\n return widgetCtor;\n }, (error) => {\n throw error;\n });\n return null;\n }\n getInjector(label) {\n if (!this._injectorRegistry || !this.hasInjector(label)) {\n return null;\n }\n return this._injectorRegistry.get(label);\n }\n has(label) {\n return Boolean(this._widgetRegistry && this._widgetRegistry.has(label));\n }\n hasInjector(label) {\n return Boolean(this._injectorRegistry && this._injectorRegistry.has(label));\n }\n}\nexport default Registry;\n//# sourceMappingURL=Registry.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/Registry.mjs\n// module id = ./node_modules/@dojo/widget-core/Registry.mjs\n// module chunks = menu-item","import { Map } from '@dojo/shim/Map';\nimport { Evented } from '@dojo/core/Evented';\nimport { Registry } from './Registry';\nexport class RegistryHandler extends Evented {\n constructor() {\n super();\n this._registry = new Registry();\n this._registryWidgetLabelMap = new Map();\n this._registryInjectorLabelMap = new Map();\n this.own(this._registry);\n const destroy = () => {\n if (this.baseRegistry) {\n this._registryWidgetLabelMap.delete(this.baseRegistry);\n this._registryInjectorLabelMap.delete(this.baseRegistry);\n this.baseRegistry = undefined;\n }\n };\n this.own({ destroy });\n }\n set base(baseRegistry) {\n if (this.baseRegistry) {\n this._registryWidgetLabelMap.delete(this.baseRegistry);\n this._registryInjectorLabelMap.delete(this.baseRegistry);\n }\n this.baseRegistry = baseRegistry;\n }\n define(label, widget) {\n this._registry.define(label, widget);\n }\n defineInjector(label, injector) {\n this._registry.defineInjector(label, injector);\n }\n has(label) {\n return this._registry.has(label) || Boolean(this.baseRegistry && this.baseRegistry.has(label));\n }\n hasInjector(label) {\n return this._registry.hasInjector(label) || Boolean(this.baseRegistry && this.baseRegistry.hasInjector(label));\n }\n get(label, globalPrecedence = false) {\n return this._get(label, globalPrecedence, 'get', this._registryWidgetLabelMap);\n }\n getInjector(label, globalPrecedence = false) {\n return this._get(label, globalPrecedence, 'getInjector', this._registryInjectorLabelMap);\n }\n _get(label, globalPrecedence, getFunctionName, labelMap) {\n const registries = globalPrecedence ? [this.baseRegistry, this._registry] : [this._registry, this.baseRegistry];\n for (let i = 0; i < registries.length; i++) {\n const registry = registries[i];\n if (!registry) {\n continue;\n }\n const item = registry[getFunctionName](label);\n const registeredLabels = labelMap.get(registry) || [];\n if (item) {\n return item;\n }\n else if (registeredLabels.indexOf(label) === -1) {\n const handle = registry.on(label, (event) => {\n if (event.action === 'loaded' &&\n this[getFunctionName](label, globalPrecedence) === event.item) {\n this.emit({ type: 'invalidate' });\n }\n });\n this.own(handle);\n labelMap.set(registry, [...registeredLabels, label]);\n }\n }\n return null;\n }\n}\nexport default RegistryHandler;\n//# sourceMappingURL=RegistryHandler.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/RegistryHandler.mjs\n// module id = ./node_modules/@dojo/widget-core/RegistryHandler.mjs\n// module chunks = menu-item","import Map from '@dojo/shim/Map';\nimport WeakMap from '@dojo/shim/WeakMap';\nimport Symbol from '@dojo/shim/Symbol';\nimport { v } from './d';\nimport { auto } from './diff';\nimport RegistryHandler from './RegistryHandler';\nimport NodeHandler from './NodeHandler';\nimport { widgetInstanceMap } from './vdom';\nimport { isWidgetBaseConstructor, WIDGET_BASE_TYPE } from './Registry';\nconst decoratorMap = new Map();\nconst boundAuto = auto.bind(null);\nexport const noBind = Symbol.for('dojoNoBind');\n/**\n * Main widget base for all widgets to extend\n */\nexport class WidgetBase {\n /**\n * @constructor\n */\n constructor() {\n /**\n * Indicates if it is the initial set properties cycle\n */\n this._initialProperties = true;\n /**\n * Array of property keys considered changed from the previous set properties\n */\n this._changedPropertyKeys = [];\n this._nodeHandler = new NodeHandler();\n this._handles = [];\n this._children = [];\n this._decoratorCache = new Map();\n this._properties = {};\n this._boundRenderFunc = this.render.bind(this);\n this._boundInvalidate = this.invalidate.bind(this);\n widgetInstanceMap.set(this, {\n dirty: true,\n onAttach: () => {\n this.onAttach();\n },\n onDetach: () => {\n this.onDetach();\n this.destroy();\n },\n nodeHandler: this._nodeHandler,\n registry: () => {\n return this.registry;\n },\n coreProperties: {},\n rendering: false,\n inputProperties: {}\n });\n this._runAfterConstructors();\n }\n meta(MetaType) {\n if (this._metaMap === undefined) {\n this._metaMap = new Map();\n }\n let cached = this._metaMap.get(MetaType);\n if (!cached) {\n cached = new MetaType({\n invalidate: this._boundInvalidate,\n nodeHandler: this._nodeHandler,\n bind: this\n });\n this.own(cached);\n this._metaMap.set(MetaType, cached);\n }\n return cached;\n }\n onAttach() {\n // Do nothing by default.\n }\n onDetach() {\n // Do nothing by default.\n }\n get properties() {\n return this._properties;\n }\n get changedPropertyKeys() {\n return [...this._changedPropertyKeys];\n }\n __setCoreProperties__(coreProperties) {\n const { baseRegistry } = coreProperties;\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.coreProperties.baseRegistry !== baseRegistry) {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n this._registry.base = baseRegistry;\n this.invalidate();\n }\n instanceData.coreProperties = coreProperties;\n }\n __setProperties__(originalProperties) {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.inputProperties = originalProperties;\n const properties = this._runBeforeProperties(originalProperties);\n const registeredDiffPropertyNames = this.getDecorator('registeredDiffProperty');\n const changedPropertyKeys = [];\n const propertyNames = Object.keys(properties);\n if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) {\n const allProperties = [...propertyNames, ...Object.keys(this._properties)];\n const checkedProperties = [];\n const diffPropertyResults = {};\n let runReactions = false;\n for (let i = 0; i < allProperties.length; i++) {\n const propertyName = allProperties[i];\n if (checkedProperties.indexOf(propertyName) !== -1) {\n continue;\n }\n checkedProperties.push(propertyName);\n const previousProperty = this._properties[propertyName];\n const newProperty = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n if (registeredDiffPropertyNames.indexOf(propertyName) !== -1) {\n runReactions = true;\n const diffFunctions = this.getDecorator(`diffProperty:${propertyName}`);\n for (let i = 0; i < diffFunctions.length; i++) {\n const result = diffFunctions[i](previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n else {\n const result = boundAuto(previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n if (runReactions) {\n this._mapDiffPropertyReactions(properties, changedPropertyKeys).forEach((args, reaction) => {\n if (args.changed) {\n reaction.call(this, args.previousProperties, args.newProperties);\n }\n });\n }\n this._properties = diffPropertyResults;\n this._changedPropertyKeys = changedPropertyKeys;\n }\n else {\n this._initialProperties = false;\n for (let i = 0; i < propertyNames.length; i++) {\n const propertyName = propertyNames[i];\n if (typeof properties[propertyName] === 'function') {\n properties[propertyName] = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n }\n else {\n changedPropertyKeys.push(propertyName);\n }\n }\n this._changedPropertyKeys = changedPropertyKeys;\n this._properties = Object.assign({}, properties);\n }\n if (this._changedPropertyKeys.length > 0) {\n this.invalidate();\n }\n }\n get children() {\n return this._children;\n }\n __setChildren__(children) {\n if (this._children.length > 0 || children.length > 0) {\n this._children = children;\n this.invalidate();\n }\n }\n __render__() {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.dirty = false;\n const render = this._runBeforeRenders();\n let dNode = render();\n dNode = this.runAfterRenders(dNode);\n this._nodeHandler.clear();\n return dNode;\n }\n invalidate() {\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.invalidate) {\n instanceData.invalidate();\n }\n }\n render() {\n return v('div', {}, this.children);\n }\n /**\n * Function to add decorators to WidgetBase\n *\n * @param decoratorKey The key of the decorator\n * @param value The value of the decorator\n */\n addDecorator(decoratorKey, value) {\n value = Array.isArray(value) ? value : [value];\n if (this.hasOwnProperty('constructor')) {\n let decoratorList = decoratorMap.get(this.constructor);\n if (!decoratorList) {\n decoratorList = new Map();\n decoratorMap.set(this.constructor, decoratorList);\n }\n let specificDecoratorList = decoratorList.get(decoratorKey);\n if (!specificDecoratorList) {\n specificDecoratorList = [];\n decoratorList.set(decoratorKey, specificDecoratorList);\n }\n specificDecoratorList.push(...value);\n }\n else {\n const decorators = this.getDecorator(decoratorKey);\n this._decoratorCache.set(decoratorKey, [...decorators, ...value]);\n }\n }\n /**\n * Function to build the list of decorators from the global decorator map.\n *\n * @param decoratorKey The key of the decorator\n * @return An array of decorator values\n * @private\n */\n _buildDecoratorList(decoratorKey) {\n const allDecorators = [];\n let constructor = this.constructor;\n while (constructor) {\n const instanceMap = decoratorMap.get(constructor);\n if (instanceMap) {\n const decorators = instanceMap.get(decoratorKey);\n if (decorators) {\n allDecorators.unshift(...decorators);\n }\n }\n constructor = Object.getPrototypeOf(constructor);\n }\n return allDecorators;\n }\n /**\n * Function to retrieve decorator values\n *\n * @param decoratorKey The key of the decorator\n * @returns An array of decorator values\n */\n getDecorator(decoratorKey) {\n let allDecorators = this._decoratorCache.get(decoratorKey);\n if (allDecorators !== undefined) {\n return allDecorators;\n }\n allDecorators = this._buildDecoratorList(decoratorKey);\n this._decoratorCache.set(decoratorKey, allDecorators);\n return allDecorators;\n }\n _mapDiffPropertyReactions(newProperties, changedPropertyKeys) {\n const reactionFunctions = this.getDecorator('diffReaction');\n return reactionFunctions.reduce((reactionPropertyMap, { reaction, propertyName }) => {\n let reactionArguments = reactionPropertyMap.get(reaction);\n if (reactionArguments === undefined) {\n reactionArguments = {\n previousProperties: {},\n newProperties: {},\n changed: false\n };\n }\n reactionArguments.previousProperties[propertyName] = this._properties[propertyName];\n reactionArguments.newProperties[propertyName] = newProperties[propertyName];\n if (changedPropertyKeys.indexOf(propertyName) !== -1) {\n reactionArguments.changed = true;\n }\n reactionPropertyMap.set(reaction, reactionArguments);\n return reactionPropertyMap;\n }, new Map());\n }\n /**\n * Binds unbound property functions to the specified `bind` property\n *\n * @param properties properties to check for functions\n */\n _bindFunctionProperty(property, bind) {\n if (typeof property === 'function' && !property[noBind] && isWidgetBaseConstructor(property) === false) {\n if (this._bindFunctionPropertyMap === undefined) {\n this._bindFunctionPropertyMap = new WeakMap();\n }\n const bindInfo = this._bindFunctionPropertyMap.get(property) || {};\n let { boundFunc, scope } = bindInfo;\n if (boundFunc === undefined || scope !== bind) {\n boundFunc = property.bind(bind);\n this._bindFunctionPropertyMap.set(property, { boundFunc, scope: bind });\n }\n return boundFunc;\n }\n return property;\n }\n get registry() {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n return this._registry;\n }\n _runBeforeProperties(properties) {\n const beforeProperties = this.getDecorator('beforeProperties');\n if (beforeProperties.length > 0) {\n return beforeProperties.reduce((properties, beforePropertiesFunction) => {\n return Object.assign({}, properties, beforePropertiesFunction.call(this, properties));\n }, Object.assign({}, properties));\n }\n return properties;\n }\n /**\n * Run all registered before renders and return the updated render method\n */\n _runBeforeRenders() {\n const beforeRenders = this.getDecorator('beforeRender');\n if (beforeRenders.length > 0) {\n return beforeRenders.reduce((render, beforeRenderFunction) => {\n const updatedRender = beforeRenderFunction.call(this, render, this._properties, this._children);\n if (!updatedRender) {\n console.warn('Render function not returned from beforeRender, using previous render');\n return render;\n }\n return updatedRender;\n }, this._boundRenderFunc);\n }\n return this._boundRenderFunc;\n }\n /**\n * Run all registered after renders and return the decorated DNodes\n *\n * @param dNode The DNodes to run through the after renders\n */\n runAfterRenders(dNode) {\n const afterRenders = this.getDecorator('afterRender');\n if (afterRenders.length > 0) {\n return afterRenders.reduce((dNode, afterRenderFunction) => {\n return afterRenderFunction.call(this, dNode);\n }, dNode);\n }\n if (this._metaMap !== undefined) {\n this._metaMap.forEach((meta) => {\n meta.afterRender();\n });\n }\n return dNode;\n }\n _runAfterConstructors() {\n const afterConstructors = this.getDecorator('afterConstructor');\n if (afterConstructors.length > 0) {\n afterConstructors.forEach((afterConstructor) => afterConstructor.call(this));\n }\n }\n own(handle) {\n this._handles.push(handle);\n }\n destroy() {\n while (this._handles.length > 0) {\n const handle = this._handles.pop();\n if (handle) {\n handle.destroy();\n }\n }\n }\n}\n/**\n * static identifier\n */\nWidgetBase._type = WIDGET_BASE_TYPE;\nexport default WidgetBase;\n//# sourceMappingURL=WidgetBase.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/WidgetBase.mjs\n// module id = ./node_modules/@dojo/widget-core/WidgetBase.mjs\n// module chunks = menu-item","let browserSpecificTransitionEndEventName = '';\nlet browserSpecificAnimationEndEventName = '';\nfunction determineBrowserStyleNames(element) {\n if ('WebkitTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'webkitTransitionEnd';\n browserSpecificAnimationEndEventName = 'webkitAnimationEnd';\n }\n else if ('transition' in element.style || 'MozTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'transitionend';\n browserSpecificAnimationEndEventName = 'animationend';\n }\n else {\n throw new Error('Your browser is not supported');\n }\n}\nfunction initialize(element) {\n if (browserSpecificAnimationEndEventName === '') {\n determineBrowserStyleNames(element);\n }\n}\nfunction runAndCleanUp(element, startAnimation, finishAnimation) {\n initialize(element);\n let finished = false;\n let transitionEnd = function () {\n if (!finished) {\n finished = true;\n element.removeEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n element.removeEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n finishAnimation();\n }\n };\n startAnimation();\n element.addEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n element.addEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n}\nfunction exit(node, properties, exitAnimation, removeNode) {\n const activeClass = properties.exitAnimationActive || `${exitAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(exitAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n removeNode();\n });\n}\nfunction enter(node, properties, enterAnimation) {\n const activeClass = properties.enterAnimationActive || `${enterAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(enterAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n node.classList.remove(enterAnimation);\n node.classList.remove(activeClass);\n });\n}\nexport default {\n enter,\n exit\n};\n//# sourceMappingURL=cssTransitions.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/animations/cssTransitions.mjs\n// module id = ./node_modules/@dojo/widget-core/animations/cssTransitions.mjs\n// module chunks = menu-item","import Symbol from '@dojo/shim/Symbol';\n/**\n * The symbol identifier for a WNode type\n */\nexport const WNODE = Symbol('Identifier for a WNode.');\n/**\n * The symbol identifier for a VNode type\n */\nexport const VNODE = Symbol('Identifier for a VNode.');\n/**\n * The symbol identifier for a VNode type created using dom()\n */\nexport const DOMVNODE = Symbol('Identifier for a VNode created using existing dom.');\n/**\n * Helper function that returns true if the `DNode` is a `WNode` using the `type` property\n */\nexport function isWNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === WNODE);\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` using the `type` property\n */\nexport function isVNode(child) {\n return Boolean(child && typeof child !== 'string' && (child.type === VNODE || child.type === DOMVNODE));\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` created with `dom()` using the `type` property\n */\nexport function isDomVNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === DOMVNODE);\n}\nexport function isElementNode(value) {\n return !!value.tagName;\n}\nexport function decorate(dNodes, optionsOrModifier, predicate) {\n let shallow = false;\n let modifier;\n if (typeof optionsOrModifier === 'function') {\n modifier = optionsOrModifier;\n }\n else {\n modifier = optionsOrModifier.modifier;\n predicate = optionsOrModifier.predicate;\n shallow = optionsOrModifier.shallow || false;\n }\n let nodes = Array.isArray(dNodes) ? [...dNodes] : [dNodes];\n function breaker() {\n nodes = [];\n }\n while (nodes.length) {\n const node = nodes.shift();\n if (node) {\n if (!shallow && (isWNode(node) || isVNode(node)) && node.children) {\n nodes = [...nodes, ...node.children];\n }\n if (!predicate || predicate(node)) {\n modifier(node, breaker);\n }\n }\n }\n return dNodes;\n}\n/**\n * Wrapper function for calls to create a widget.\n */\nexport function w(widgetConstructor, properties, children = []) {\n return {\n children,\n widgetConstructor,\n properties,\n type: WNODE\n };\n}\nexport function v(tag, propertiesOrChildren = {}, children = undefined) {\n let properties = propertiesOrChildren;\n let deferredPropertiesCallback;\n if (Array.isArray(propertiesOrChildren)) {\n children = propertiesOrChildren;\n properties = {};\n }\n if (typeof properties === 'function') {\n deferredPropertiesCallback = properties;\n properties = {};\n }\n return {\n tag,\n deferredPropertiesCallback,\n children,\n properties,\n type: VNODE\n };\n}\n/**\n * Create a VNode for an existing DOM Node.\n */\nexport function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, children) {\n return {\n tag: isElementNode(node) ? node.tagName.toLowerCase() : '',\n properties: props,\n attributes: attrs,\n events: on,\n children,\n type: DOMVNODE,\n domNode: node,\n text: isElementNode(node) ? undefined : node.data,\n diffType\n };\n}\n//# sourceMappingURL=d.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/d.mjs\n// module id = ./node_modules/@dojo/widget-core/d.mjs\n// module chunks = menu-item","import { handleDecorator } from './handleDecorator';\nexport function afterRender(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('afterRender', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default afterRender;\n//# sourceMappingURL=afterRender.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/afterRender.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/afterRender.mjs\n// module chunks = menu-item","import { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\nexport function alwaysRender() {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function () {\n this.invalidate();\n })(target);\n });\n}\nexport default alwaysRender;\n//# sourceMappingURL=alwaysRender.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs\n// module chunks = menu-item","import { handleDecorator } from './handleDecorator';\nexport function beforeProperties(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('beforeProperties', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default beforeProperties;\n//# sourceMappingURL=beforeProperties.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs\n// module chunks = menu-item","import { CustomElementChildType } from '../registerCustomElement';\nimport Registry from '../Registry';\n/**\n * This Decorator is provided properties that define the behavior of a custom element, and\n * registers that custom element.\n */\nexport function customElement({ tag, properties = [], attributes = [], events = [], childType = CustomElementChildType.DOJO, registryFactory = () => new Registry() }) {\n return function (target) {\n target.prototype.__customElementDescriptor = {\n tagName: tag,\n attributes,\n properties,\n events,\n childType,\n registryFactory\n };\n };\n}\nexport default customElement;\n//# sourceMappingURL=customElement.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/customElement.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/customElement.mjs\n// module chunks = menu-item","import { handleDecorator } from './handleDecorator';\n/**\n * Decorator that can be used to register a function as a specific property diff\n *\n * @param propertyName The name of the property of which the diff function is applied\n * @param diffType The diff type, default is DiffType.AUTO.\n * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM\n */\nexport function diffProperty(propertyName, diffFunction, reactionFunction) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null));\n target.addDecorator('registeredDiffProperty', propertyName);\n if (reactionFunction || propertyKey) {\n target.addDecorator('diffReaction', {\n propertyName,\n reaction: propertyKey ? target[propertyKey] : reactionFunction\n });\n }\n });\n}\nexport default diffProperty;\n//# sourceMappingURL=diffProperty.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/diffProperty.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/diffProperty.mjs\n// module chunks = menu-item","/**\n * Generic decorator handler to take care of whether or not the decorator was called at the class level\n * or the method level.\n *\n * @param handler\n */\nexport function handleDecorator(handler) {\n return function (target, propertyKey, descriptor) {\n if (typeof target === 'function') {\n handler(target.prototype, undefined);\n }\n else {\n handler(target, propertyKey);\n }\n };\n}\nexport default handleDecorator;\n//# sourceMappingURL=handleDecorator.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs\n// module chunks = menu-item","import WeakMap from '@dojo/shim/WeakMap';\nimport { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\n/**\n * Map of instances against registered injectors.\n */\nconst registeredInjectorsMap = new WeakMap();\n/**\n * Decorator retrieves an injector from an available registry using the name and\n * calls the `getProperties` function with the payload from the injector\n * and current properties with the the injected properties returned.\n *\n * @param InjectConfig the inject configuration\n */\nexport function inject({ name, getProperties }) {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function (properties) {\n const injectorItem = this.registry.getInjector(name);\n if (injectorItem) {\n const { injector, invalidator } = injectorItem;\n const registeredInjectors = registeredInjectorsMap.get(this) || [];\n if (registeredInjectors.length === 0) {\n registeredInjectorsMap.set(this, registeredInjectors);\n }\n if (registeredInjectors.indexOf(injectorItem) === -1) {\n this.own(invalidator.on('invalidate', () => {\n this.invalidate();\n }));\n registeredInjectors.push(injectorItem);\n }\n return getProperties(injector(), properties);\n }\n })(target);\n });\n}\nexport default inject;\n//# sourceMappingURL=inject.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/inject.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/inject.mjs\n// module chunks = menu-item","import { WIDGET_BASE_TYPE } from './Registry';\nfunction isObjectOrArray(value) {\n return Object.prototype.toString.call(value) === '[object Object]' || Array.isArray(value);\n}\nexport function always(previousProperty, newProperty) {\n return {\n changed: true,\n value: newProperty\n };\n}\nexport function ignore(previousProperty, newProperty) {\n return {\n changed: false,\n value: newProperty\n };\n}\nexport function reference(previousProperty, newProperty) {\n return {\n changed: previousProperty !== newProperty,\n value: newProperty\n };\n}\nexport function shallow(previousProperty, newProperty) {\n let changed = false;\n const validOldProperty = previousProperty && isObjectOrArray(previousProperty);\n const validNewProperty = newProperty && isObjectOrArray(newProperty);\n if (!validOldProperty || !validNewProperty) {\n return {\n changed: true,\n value: newProperty\n };\n }\n const previousKeys = Object.keys(previousProperty);\n const newKeys = Object.keys(newProperty);\n if (previousKeys.length !== newKeys.length) {\n changed = true;\n }\n else {\n changed = newKeys.some((key) => {\n return newProperty[key] !== previousProperty[key];\n });\n }\n return {\n changed,\n value: newProperty\n };\n}\nexport function auto(previousProperty, newProperty) {\n let result;\n if (typeof newProperty === 'function') {\n if (newProperty._type === WIDGET_BASE_TYPE) {\n result = reference(previousProperty, newProperty);\n }\n else {\n result = ignore(previousProperty, newProperty);\n }\n }\n else if (isObjectOrArray(newProperty)) {\n result = shallow(previousProperty, newProperty);\n }\n else {\n result = reference(previousProperty, newProperty);\n }\n return result;\n}\n//# sourceMappingURL=diff.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/diff.mjs\n// module id = ./node_modules/@dojo/widget-core/diff.mjs\n// module chunks = menu-item","import * as tslib_1 from \"tslib\";\nimport { assign } from '@dojo/core/lang';\nimport cssTransitions from '../animations/cssTransitions';\nimport { afterRender } from './../decorators/afterRender';\nimport { v } from './../d';\nimport { dom } from './../vdom';\n/**\n * Represents the attach state of the projector\n */\nexport var ProjectorAttachState;\n(function (ProjectorAttachState) {\n ProjectorAttachState[ProjectorAttachState[\"Attached\"] = 1] = \"Attached\";\n ProjectorAttachState[ProjectorAttachState[\"Detached\"] = 2] = \"Detached\";\n})(ProjectorAttachState || (ProjectorAttachState = {}));\n/**\n * Attach type for the projector\n */\nexport var AttachType;\n(function (AttachType) {\n AttachType[AttachType[\"Append\"] = 1] = \"Append\";\n AttachType[AttachType[\"Merge\"] = 2] = \"Merge\";\n})(AttachType || (AttachType = {}));\nexport function ProjectorMixin(Base) {\n class Projector extends Base {\n constructor(...args) {\n super(...args);\n this._root = document.body;\n this._async = true;\n this._projectorProperties = {};\n this._projectionOptions = {\n transitions: cssTransitions\n };\n this.root = document.body;\n this.projectorState = ProjectorAttachState.Detached;\n }\n append(root) {\n const options = {\n type: AttachType.Append,\n root\n };\n return this._attach(options);\n }\n merge(root) {\n const options = {\n type: AttachType.Merge,\n root\n };\n return this._attach(options);\n }\n set root(root) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change root element');\n }\n this._root = root;\n }\n get root() {\n return this._root;\n }\n get async() {\n return this._async;\n }\n set async(async) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change async mode');\n }\n this._async = async;\n }\n sandbox(doc = document) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot create sandbox');\n }\n this._async = false;\n const previousRoot = this.root;\n /* free up the document fragment for GC */\n this.own({\n destroy: () => {\n this._root = previousRoot;\n }\n });\n this._attach({\n /* DocumentFragment is not assignable to Element, but provides everything needed to work */\n root: doc.createDocumentFragment(),\n type: AttachType.Append\n });\n }\n setChildren(children) {\n this.__setChildren__(children);\n }\n setProperties(properties) {\n this.__setProperties__(properties);\n }\n __setProperties__(properties) {\n if (this._projectorProperties && this._projectorProperties.registry !== properties.registry) {\n if (this._projectorProperties.registry) {\n this._projectorProperties.registry.destroy();\n }\n }\n this._projectorProperties = assign({}, properties);\n super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry });\n super.__setProperties__(properties);\n }\n toHtml() {\n if (this.projectorState !== ProjectorAttachState.Attached || !this._projection) {\n throw new Error('Projector is not attached, cannot return an HTML string of projection.');\n }\n return this._projection.domNode.childNodes[0].outerHTML;\n }\n afterRender(result) {\n let node = result;\n if (typeof result === 'string' || result === null || result === undefined) {\n node = v('span', {}, [result]);\n }\n return node;\n }\n destroy() {\n super.destroy();\n }\n _attach({ type, root }) {\n if (root) {\n this.root = root;\n }\n if (this._attachHandle) {\n return this._attachHandle;\n }\n this.projectorState = ProjectorAttachState.Attached;\n const handle = {\n destroy: () => {\n if (this.projectorState === ProjectorAttachState.Attached) {\n this._projection = undefined;\n this.projectorState = ProjectorAttachState.Detached;\n }\n }\n };\n this.own(handle);\n this._attachHandle = handle;\n this._projectionOptions = Object.assign({}, this._projectionOptions, { sync: !this._async });\n switch (type) {\n case AttachType.Append:\n this._projection = dom.append(this.root, this, this._projectionOptions);\n break;\n case AttachType.Merge:\n this._projection = dom.merge(this.root, this, this._projectionOptions);\n break;\n }\n return this._attachHandle;\n }\n }\n tslib_1.__decorate([\n afterRender(),\n tslib_1.__metadata(\"design:type\", Function),\n tslib_1.__metadata(\"design:paramtypes\", [Object]),\n tslib_1.__metadata(\"design:returntype\", void 0)\n ], Projector.prototype, \"afterRender\", null);\n return Projector;\n}\nexport default ProjectorMixin;\n//# sourceMappingURL=Projector.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/mixins/Projector.mjs\n// module id = ./node_modules/@dojo/widget-core/mixins/Projector.mjs\n// module chunks = menu-item","import * as tslib_1 from \"tslib\";\nimport { Injector } from './../Injector';\nimport { inject } from './../decorators/inject';\nimport { handleDecorator } from './../decorators/handleDecorator';\nimport { diffProperty } from './../decorators/diffProperty';\nimport { shallow } from './../diff';\nconst THEME_KEY = ' _key';\nexport const INJECTED_THEME_KEY = Symbol('theme');\n/**\n * Decorator for base css classes\n */\nexport function theme(theme) {\n return handleDecorator((target) => {\n target.addDecorator('baseThemeClasses', theme);\n });\n}\n/**\n * Creates a reverse lookup for the classes passed in via the `theme` function.\n *\n * @param classes The baseClasses object\n * @requires\n */\nfunction createThemeClassesLookup(classes) {\n return classes.reduce((currentClassNames, baseClass) => {\n Object.keys(baseClass).forEach((key) => {\n currentClassNames[baseClass[key]] = key;\n });\n return currentClassNames;\n }, {});\n}\n/**\n * Convenience function that is given a theme and an optional registry, the theme\n * injector is defined against the registry, returning the theme.\n *\n * @param theme the theme to set\n * @param themeRegistry registry to define the theme injector against. Defaults\n * to the global registry\n *\n * @returns the theme injector used to set the theme\n */\nexport function registerThemeInjector(theme, themeRegistry) {\n const themeInjector = new Injector(theme);\n themeRegistry.defineInjector(INJECTED_THEME_KEY, (invalidator) => {\n themeInjector.setInvalidator(invalidator);\n return () => themeInjector.get();\n });\n return themeInjector;\n}\n/**\n * Function that returns a class decorated with with Themed functionality\n */\nexport function ThemedMixin(Base) {\n let Themed = class Themed extends Base {\n constructor() {\n super(...arguments);\n /**\n * Registered base theme keys\n */\n this._registeredBaseThemeKeys = [];\n /**\n * Indicates if classes meta data need to be calculated.\n */\n this._recalculateClasses = true;\n /**\n * Loaded theme\n */\n this._theme = {};\n }\n theme(classes) {\n if (this._recalculateClasses) {\n this._recalculateThemeClasses();\n }\n if (Array.isArray(classes)) {\n return classes.map((className) => this._getThemeClass(className));\n }\n return this._getThemeClass(classes);\n }\n /**\n * Function fired when `theme` or `extraClasses` are changed.\n */\n onPropertiesChanged() {\n this._recalculateClasses = true;\n }\n _getThemeClass(className) {\n if (className === undefined || className === null) {\n return className;\n }\n const extraClasses = this.properties.extraClasses || {};\n const themeClassName = this._baseThemeClassesReverseLookup[className];\n let resultClassNames = [];\n if (!themeClassName) {\n console.warn(`Class name: '${className}' not found in theme`);\n return null;\n }\n if (extraClasses[themeClassName]) {\n resultClassNames.push(extraClasses[themeClassName]);\n }\n if (this._theme[themeClassName]) {\n resultClassNames.push(this._theme[themeClassName]);\n }\n else {\n resultClassNames.push(this._registeredBaseTheme[themeClassName]);\n }\n return resultClassNames.join(' ');\n }\n _recalculateThemeClasses() {\n const { theme = {} } = this.properties;\n const baseThemes = this.getDecorator('baseThemeClasses');\n if (!this._registeredBaseTheme) {\n this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => {\n const _a = THEME_KEY, key = baseTheme[_a], classes = tslib_1.__rest(baseTheme, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n this._registeredBaseThemeKeys.push(key);\n return Object.assign({}, finalBaseTheme, classes);\n }, {});\n this._baseThemeClassesReverseLookup = createThemeClassesLookup(baseThemes);\n }\n this._theme = this._registeredBaseThemeKeys.reduce((baseTheme, themeKey) => {\n return Object.assign({}, baseTheme, theme[themeKey]);\n }, {});\n this._recalculateClasses = false;\n }\n };\n tslib_1.__decorate([\n diffProperty('theme', shallow),\n diffProperty('extraClasses', shallow),\n tslib_1.__metadata(\"design:type\", Function),\n tslib_1.__metadata(\"design:paramtypes\", []),\n tslib_1.__metadata(\"design:returntype\", void 0)\n ], Themed.prototype, \"onPropertiesChanged\", null);\n Themed = tslib_1.__decorate([\n inject({\n name: INJECTED_THEME_KEY,\n getProperties: (theme, properties) => {\n if (!properties.theme) {\n return { theme };\n }\n return {};\n }\n })\n ], Themed);\n return Themed;\n}\nexport default ThemedMixin;\n//# sourceMappingURL=Themed.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/mixins/Themed.mjs\n// module id = ./node_modules/@dojo/widget-core/mixins/Themed.mjs\n// module chunks = menu-item","import * as tslib_1 from \"tslib\";\nimport { WidgetBase, noBind } from './WidgetBase';\nimport { ProjectorMixin } from './mixins/Projector';\nimport { from } from '@dojo/shim/array';\nimport { w, dom } from './d';\nimport global from '@dojo/shim/global';\nimport { registerThemeInjector } from './mixins/Themed';\nimport { alwaysRender } from './decorators/alwaysRender';\nexport var CustomElementChildType;\n(function (CustomElementChildType) {\n CustomElementChildType[\"DOJO\"] = \"DOJO\";\n CustomElementChildType[\"NODE\"] = \"NODE\";\n CustomElementChildType[\"TEXT\"] = \"TEXT\";\n})(CustomElementChildType || (CustomElementChildType = {}));\nexport function DomToWidgetWrapper(domNode) {\n let DomToWidgetWrapper = class DomToWidgetWrapper extends WidgetBase {\n render() {\n const properties = Object.keys(this.properties).reduce((props, key) => {\n const value = this.properties[key];\n if (key.indexOf('on') === 0) {\n key = `__${key}`;\n }\n props[key] = value;\n return props;\n }, {});\n return dom({ node: domNode, props: properties, diffType: 'dom' });\n }\n static get domNode() {\n return domNode;\n }\n };\n DomToWidgetWrapper = tslib_1.__decorate([\n alwaysRender()\n ], DomToWidgetWrapper);\n return DomToWidgetWrapper;\n}\nexport function create(descriptor, WidgetConstructor) {\n const { attributes, childType, registryFactory } = descriptor;\n const attributeMap = {};\n attributes.forEach((propertyName) => {\n const attributeName = propertyName.toLowerCase();\n attributeMap[attributeName] = propertyName;\n });\n return class extends HTMLElement {\n constructor() {\n super(...arguments);\n this._properties = {};\n this._children = [];\n this._eventProperties = {};\n this._initialised = false;\n }\n connectedCallback() {\n if (this._initialised) {\n return;\n }\n const domProperties = {};\n const { attributes, properties, events } = descriptor;\n this._properties = Object.assign({}, this._properties, this._attributesToProperties(attributes));\n [...attributes, ...properties].forEach((propertyName) => {\n const value = this[propertyName];\n const filteredPropertyName = propertyName.replace(/^on/, '__');\n if (value !== undefined) {\n this._properties[propertyName] = value;\n }\n if (filteredPropertyName !== propertyName) {\n domProperties[filteredPropertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n }\n domProperties[propertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n });\n events.forEach((propertyName) => {\n const eventName = propertyName.replace(/^on/, '').toLowerCase();\n const filteredPropertyName = propertyName.replace(/^on/, '__on');\n domProperties[filteredPropertyName] = {\n get: () => this._getEventProperty(propertyName),\n set: (value) => this._setEventProperty(propertyName, value)\n };\n this._eventProperties[propertyName] = undefined;\n this._properties[propertyName] = (...args) => {\n const eventCallback = this._getEventProperty(propertyName);\n if (typeof eventCallback === 'function') {\n eventCallback(...args);\n }\n this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: false,\n detail: args\n }));\n };\n });\n Object.defineProperties(this, domProperties);\n const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children;\n from(children).forEach((childNode) => {\n if (childType === CustomElementChildType.DOJO) {\n childNode.addEventListener('dojo-ce-render', () => this._render());\n childNode.addEventListener('dojo-ce-connected', () => this._render());\n this._children.push(DomToWidgetWrapper(childNode));\n }\n else {\n this._children.push(dom({ node: childNode, diffType: 'dom' }));\n }\n });\n this.addEventListener('dojo-ce-connected', (e) => this._childConnected(e));\n const widgetProperties = this._properties;\n const renderChildren = () => this.__children__();\n const Wrapper = class extends WidgetBase {\n render() {\n return w(WidgetConstructor, widgetProperties, renderChildren());\n }\n };\n const registry = registryFactory();\n const themeContext = registerThemeInjector(this._getTheme(), registry);\n global.addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme()));\n const Projector = ProjectorMixin(Wrapper);\n this._projector = new Projector();\n this._projector.setProperties({ registry });\n this._projector.append(this);\n this._initialised = true;\n this.dispatchEvent(new CustomEvent('dojo-ce-connected', {\n bubbles: true,\n detail: this\n }));\n }\n _getTheme() {\n if (global && global.dojoce && global.dojoce.theme) {\n return global.dojoce.themes[global.dojoce.theme];\n }\n }\n _childConnected(e) {\n const node = e.detail;\n if (node.parentNode === this) {\n const exists = this._children.some((child) => child.domNode === node);\n if (!exists) {\n node.addEventListener('dojo-ce-render', () => this._render());\n this._children.push(DomToWidgetWrapper(node));\n this._render();\n }\n }\n }\n _render() {\n if (this._projector) {\n this._projector.invalidate();\n this.dispatchEvent(new CustomEvent('dojo-ce-render', {\n bubbles: false,\n detail: this\n }));\n }\n }\n __properties__() {\n return Object.assign({}, this._properties, this._eventProperties);\n }\n __children__() {\n if (childType === CustomElementChildType.DOJO) {\n return this._children.filter((Child) => Child.domNode.isWidget).map((Child) => {\n const { domNode } = Child;\n return w(Child, Object.assign({}, domNode.__properties__()), [...domNode.__children__()]);\n });\n }\n else {\n return this._children;\n }\n }\n attributeChangedCallback(name, oldValue, value) {\n const propertyName = attributeMap[name];\n this._setProperty(propertyName, value);\n }\n _setEventProperty(propertyName, value) {\n this._eventProperties[propertyName] = value;\n }\n _getEventProperty(propertyName) {\n return this._eventProperties[propertyName];\n }\n _setProperty(propertyName, value) {\n if (typeof value === 'function') {\n value[noBind] = true;\n }\n this._properties[propertyName] = value;\n this._render();\n }\n _getProperty(propertyName) {\n return this._properties[propertyName];\n }\n _attributesToProperties(attributes) {\n return attributes.reduce((properties, propertyName) => {\n const attributeName = propertyName.toLowerCase();\n const value = this.getAttribute(attributeName);\n if (value !== null) {\n properties[propertyName] = value;\n }\n return properties;\n }, {});\n }\n static get observedAttributes() {\n return Object.keys(attributeMap);\n }\n get isWidget() {\n return true;\n }\n };\n}\nexport function register(WidgetConstructor) {\n const descriptor = WidgetConstructor.prototype && WidgetConstructor.prototype.__customElementDescriptor;\n if (!descriptor) {\n throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?');\n }\n global.customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor));\n}\nexport default register;\n//# sourceMappingURL=registerCustomElement.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/registerCustomElement.mjs\n// module id = ./node_modules/@dojo/widget-core/registerCustomElement.mjs\n// module chunks = menu-item","import global from '@dojo/shim/global';\nimport { from as arrayFrom } from '@dojo/shim/array';\nimport { isWNode, isVNode, isDomVNode, VNODE, WNODE } from './d';\nimport { isWidgetBaseConstructor } from './Registry';\nimport WeakMap from '@dojo/shim/WeakMap';\nconst NAMESPACE_W3 = 'http://www.w3.org/';\nconst NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg';\nconst NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink';\nconst emptyArray = [];\nexport const widgetInstanceMap = new WeakMap();\nconst instanceMap = new WeakMap();\nconst projectorStateMap = new WeakMap();\nfunction same(dnode1, dnode2) {\n if (isVNode(dnode1) && isVNode(dnode2)) {\n if (isDomVNode(dnode1) || isDomVNode(dnode2)) {\n if (dnode1.domNode !== dnode2.domNode) {\n return false;\n }\n }\n if (dnode1.tag !== dnode2.tag) {\n return false;\n }\n if (dnode1.properties.key !== dnode2.properties.key) {\n return false;\n }\n return true;\n }\n else if (isWNode(dnode1) && isWNode(dnode2)) {\n if (dnode1.instance === undefined && typeof dnode2.widgetConstructor === 'string') {\n return false;\n }\n if (dnode1.widgetConstructor !== dnode2.widgetConstructor) {\n return false;\n }\n if (dnode1.properties.key !== dnode2.properties.key) {\n return false;\n }\n return true;\n }\n return false;\n}\nconst missingTransition = function () {\n throw new Error('Provide a transitions object to the projectionOptions to do animations');\n};\nfunction getProjectionOptions(projectorOptions, projectorInstance) {\n const defaults = {\n namespace: undefined,\n styleApplyer: function (domNode, styleName, value) {\n domNode.style[styleName] = value;\n },\n transitions: {\n enter: missingTransition,\n exit: missingTransition\n },\n depth: 0,\n merge: false,\n sync: false,\n projectorInstance\n };\n return Object.assign({}, defaults, projectorOptions);\n}\nfunction checkStyleValue(styleValue) {\n if (typeof styleValue !== 'string') {\n throw new Error('Style values must be strings');\n }\n}\nfunction updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n const eventMap = projectorState.nodeMap.get(domNode) || new WeakMap();\n if (previousValue) {\n const previousEvent = eventMap.get(previousValue);\n domNode.removeEventListener(eventName, previousEvent);\n }\n let callback = currentValue.bind(bind);\n if (eventName === 'input') {\n callback = function (evt) {\n currentValue.call(this, evt);\n evt.target['oninput-value'] = evt.target.value;\n }.bind(bind);\n }\n domNode.addEventListener(eventName, callback);\n eventMap.set(currentValue, callback);\n projectorState.nodeMap.set(domNode, eventMap);\n}\nfunction addClasses(domNode, classes) {\n if (classes) {\n const classNames = classes.split(' ');\n for (let i = 0; i < classNames.length; i++) {\n domNode.classList.add(classNames[i]);\n }\n }\n}\nfunction removeClasses(domNode, classes) {\n if (classes) {\n const classNames = classes.split(' ');\n for (let i = 0; i < classNames.length; i++) {\n domNode.classList.remove(classNames[i]);\n }\n }\n}\nfunction buildPreviousProperties(domNode, previous, current) {\n const { diffType, properties, attributes } = current;\n if (!diffType || diffType === 'vdom') {\n return { properties: previous.properties, attributes: previous.attributes, events: previous.events };\n }\n else if (diffType === 'none') {\n return { properties: {}, attributes: previous.attributes ? {} : undefined, events: previous.events };\n }\n let newProperties = {\n properties: {}\n };\n if (attributes) {\n newProperties.attributes = {};\n newProperties.events = previous.events;\n Object.keys(properties).forEach((propName) => {\n newProperties.properties[propName] = domNode[propName];\n });\n Object.keys(attributes).forEach((attrName) => {\n newProperties.attributes[attrName] = domNode.getAttribute(attrName);\n });\n return newProperties;\n }\n newProperties.properties = Object.keys(properties).reduce((props, property) => {\n props[property] = domNode.getAttribute(property) || domNode[property];\n return props;\n }, {});\n return newProperties;\n}\nfunction focusNode(propValue, previousValue, domNode, projectionOptions) {\n let result;\n if (typeof propValue === 'function') {\n result = propValue();\n }\n else {\n result = propValue && !previousValue;\n }\n if (result === true) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectorState.deferredRenderCallbacks.push(() => {\n domNode.focus();\n });\n }\n}\nfunction removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions, onlyEvents = false) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n const eventMap = projectorState.nodeMap.get(domNode);\n if (eventMap) {\n Object.keys(previousProperties).forEach((propName) => {\n const isEvent = propName.substr(0, 2) === 'on' || onlyEvents;\n const eventName = onlyEvents ? propName : propName.substr(2);\n if (isEvent && !properties[propName]) {\n const eventCallback = eventMap.get(previousProperties[propName]);\n if (eventCallback) {\n domNode.removeEventListener(eventName, eventCallback);\n }\n }\n });\n }\n}\nfunction updateAttribute(domNode, attrName, attrValue, projectionOptions) {\n if (projectionOptions.namespace === NAMESPACE_SVG && attrName === 'href') {\n domNode.setAttributeNS(NAMESPACE_XLINK, attrName, attrValue);\n }\n else if ((attrName === 'role' && attrValue === '') || attrValue === undefined) {\n domNode.removeAttribute(attrName);\n }\n else {\n domNode.setAttribute(attrName, attrValue);\n }\n}\nfunction updateAttributes(domNode, previousAttributes, attributes, projectionOptions) {\n const attrNames = Object.keys(attributes);\n const attrCount = attrNames.length;\n for (let i = 0; i < attrCount; i++) {\n const attrName = attrNames[i];\n const attrValue = attributes[attrName];\n const previousAttrValue = previousAttributes[attrName];\n if (attrValue !== previousAttrValue) {\n updateAttribute(domNode, attrName, attrValue, projectionOptions);\n }\n }\n}\nfunction updateProperties(domNode, previousProperties, properties, projectionOptions, includesEventsAndAttributes = true) {\n let propertiesUpdated = false;\n const propNames = Object.keys(properties);\n const propCount = propNames.length;\n if (propNames.indexOf('classes') === -1 && previousProperties.classes) {\n if (Array.isArray(previousProperties.classes)) {\n for (let i = 0; i < previousProperties.classes.length; i++) {\n removeClasses(domNode, previousProperties.classes[i]);\n }\n }\n else {\n removeClasses(domNode, previousProperties.classes);\n }\n }\n includesEventsAndAttributes && removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions);\n for (let i = 0; i < propCount; i++) {\n const propName = propNames[i];\n let propValue = properties[propName];\n const previousValue = previousProperties[propName];\n if (propName === 'classes') {\n const previousClasses = Array.isArray(previousValue) ? previousValue : [previousValue];\n const currentClasses = Array.isArray(propValue) ? propValue : [propValue];\n if (previousClasses && previousClasses.length > 0) {\n if (!propValue || propValue.length === 0) {\n for (let i = 0; i < previousClasses.length; i++) {\n removeClasses(domNode, previousClasses[i]);\n }\n }\n else {\n const newClasses = [...currentClasses];\n for (let i = 0; i < previousClasses.length; i++) {\n const previousClassName = previousClasses[i];\n if (previousClassName) {\n const classIndex = newClasses.indexOf(previousClassName);\n if (classIndex === -1) {\n removeClasses(domNode, previousClassName);\n }\n else {\n newClasses.splice(classIndex, 1);\n }\n }\n }\n for (let i = 0; i < newClasses.length; i++) {\n addClasses(domNode, newClasses[i]);\n }\n }\n }\n else {\n for (let i = 0; i < currentClasses.length; i++) {\n addClasses(domNode, currentClasses[i]);\n }\n }\n }\n else if (propName === 'focus') {\n focusNode(propValue, previousValue, domNode, projectionOptions);\n }\n else if (propName === 'styles') {\n const styleNames = Object.keys(propValue);\n const styleCount = styleNames.length;\n for (let j = 0; j < styleCount; j++) {\n const styleName = styleNames[j];\n const newStyleValue = propValue[styleName];\n const oldStyleValue = previousValue && previousValue[styleName];\n if (newStyleValue === oldStyleValue) {\n continue;\n }\n propertiesUpdated = true;\n if (newStyleValue) {\n checkStyleValue(newStyleValue);\n projectionOptions.styleApplyer(domNode, styleName, newStyleValue);\n }\n else {\n projectionOptions.styleApplyer(domNode, styleName, '');\n }\n }\n }\n else {\n if (!propValue && typeof previousValue === 'string') {\n propValue = '';\n }\n if (propName === 'value') {\n const domValue = domNode[propName];\n if (domValue !== propValue &&\n (domNode['oninput-value']\n ? domValue === domNode['oninput-value']\n : propValue !== previousValue)) {\n domNode[propName] = propValue;\n domNode['oninput-value'] = undefined;\n }\n if (propValue !== previousValue) {\n propertiesUpdated = true;\n }\n }\n else if (propName !== 'key' && propValue !== previousValue) {\n const type = typeof propValue;\n if (type === 'function' && propName.lastIndexOf('on', 0) === 0 && includesEventsAndAttributes) {\n updateEvent(domNode, propName.substr(2), propValue, projectionOptions, properties.bind, previousValue);\n }\n else if (type === 'string' && propName !== 'innerHTML' && includesEventsAndAttributes) {\n updateAttribute(domNode, propName, propValue, projectionOptions);\n }\n else if (propName === 'scrollLeft' || propName === 'scrollTop') {\n if (domNode[propName] !== propValue) {\n domNode[propName] = propValue;\n }\n }\n else {\n domNode[propName] = propValue;\n }\n propertiesUpdated = true;\n }\n }\n }\n return propertiesUpdated;\n}\nfunction findIndexOfChild(children, sameAs, start) {\n for (let i = start; i < children.length; i++) {\n if (same(children[i], sameAs)) {\n return i;\n }\n }\n return -1;\n}\nexport function toParentVNode(domNode) {\n return {\n tag: '',\n properties: {},\n children: undefined,\n domNode,\n type: VNODE\n };\n}\nexport function toTextVNode(data) {\n return {\n tag: '',\n properties: {},\n children: undefined,\n text: `${data}`,\n domNode: undefined,\n type: VNODE\n };\n}\nfunction toInternalWNode(instance, instanceData) {\n return {\n instance,\n rendered: [],\n coreProperties: instanceData.coreProperties,\n children: instance.children,\n widgetConstructor: instance.constructor,\n properties: instanceData.inputProperties,\n type: WNODE\n };\n}\nexport function filterAndDecorateChildren(children, instance) {\n if (children === undefined) {\n return emptyArray;\n }\n children = Array.isArray(children) ? children : [children];\n for (let i = 0; i < children.length;) {\n const child = children[i];\n if (child === undefined || child === null) {\n children.splice(i, 1);\n continue;\n }\n else if (typeof child === 'string') {\n children[i] = toTextVNode(child);\n }\n else {\n if (isVNode(child)) {\n if (child.properties.bind === undefined) {\n child.properties.bind = instance;\n if (child.children && child.children.length > 0) {\n filterAndDecorateChildren(child.children, instance);\n }\n }\n }\n else {\n if (!child.coreProperties) {\n const instanceData = widgetInstanceMap.get(instance);\n child.coreProperties = {\n bind: instance,\n baseRegistry: instanceData.coreProperties.baseRegistry\n };\n }\n if (child.children && child.children.length > 0) {\n filterAndDecorateChildren(child.children, instance);\n }\n }\n }\n i++;\n }\n return children;\n}\nfunction nodeAdded(dnode, transitions) {\n if (isVNode(dnode) && dnode.properties) {\n const enterAnimation = dnode.properties.enterAnimation;\n if (enterAnimation) {\n if (typeof enterAnimation === 'function') {\n enterAnimation(dnode.domNode, dnode.properties);\n }\n else {\n transitions.enter(dnode.domNode, dnode.properties, enterAnimation);\n }\n }\n }\n}\nfunction nodeToRemove(dnode, transitions, projectionOptions) {\n if (isWNode(dnode)) {\n const rendered = dnode.rendered || emptyArray;\n if (dnode.instance) {\n const instanceData = widgetInstanceMap.get(dnode.instance);\n instanceData.onDetach();\n instanceMap.delete(dnode.instance);\n }\n for (let i = 0; i < rendered.length; i++) {\n nodeToRemove(rendered[i], transitions, projectionOptions);\n }\n }\n else {\n const domNode = dnode.domNode;\n const properties = dnode.properties;\n if (dnode.children && dnode.children.length > 0) {\n for (let i = 0; i < dnode.children.length; i++) {\n nodeToRemove(dnode.children[i], transitions, projectionOptions);\n }\n }\n const exitAnimation = properties.exitAnimation;\n if (properties && exitAnimation) {\n domNode.style.pointerEvents = 'none';\n const removeDomNode = function () {\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\n dnode.domNode = undefined;\n };\n if (typeof exitAnimation === 'function') {\n exitAnimation(domNode, removeDomNode, properties);\n return;\n }\n else {\n transitions.exit(dnode.domNode, properties, exitAnimation, removeDomNode);\n return;\n }\n }\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\n dnode.domNode = undefined;\n }\n}\nfunction checkDistinguishable(childNodes, indexToCheck, parentInstance) {\n const childNode = childNodes[indexToCheck];\n if (isVNode(childNode) && !childNode.tag) {\n return; // Text nodes need not be distinguishable\n }\n const { key } = childNode.properties;\n if (key === undefined || key === null) {\n for (let i = 0; i < childNodes.length; i++) {\n if (i !== indexToCheck) {\n const node = childNodes[i];\n if (same(node, childNode)) {\n let nodeIdentifier;\n const parentName = parentInstance.constructor.name || 'unknown';\n if (isWNode(childNode)) {\n nodeIdentifier = childNode.widgetConstructor.name || 'unknown';\n }\n else {\n nodeIdentifier = childNode.tag;\n }\n console.warn(`A widget (${parentName}) has had a child addded or removed, but they were not able to uniquely identified. It is recommended to provide a unique 'key' property when using the same widget or element (${nodeIdentifier}) multiple times as siblings`);\n break;\n }\n }\n }\n }\n}\nfunction updateChildren(parentVNode, oldChildren, newChildren, parentInstance, projectionOptions) {\n oldChildren = oldChildren || emptyArray;\n newChildren = newChildren;\n const oldChildrenLength = oldChildren.length;\n const newChildrenLength = newChildren.length;\n const transitions = projectionOptions.transitions;\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\n let oldIndex = 0;\n let newIndex = 0;\n let i;\n let textUpdated = false;\n while (newIndex < newChildrenLength) {\n let oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : undefined;\n const newChild = newChildren[newIndex];\n if (isVNode(newChild) && typeof newChild.deferredPropertiesCallback === 'function') {\n newChild.inserted = isVNode(oldChild) && oldChild.inserted;\n addDeferredProperties(newChild, projectionOptions);\n }\n if (oldChild !== undefined && same(oldChild, newChild)) {\n textUpdated = updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance) || textUpdated;\n oldIndex++;\n newIndex++;\n continue;\n }\n const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);\n const addChild = () => {\n let insertBeforeDomNode = undefined;\n let child = oldChildren[oldIndex];\n if (child) {\n let nextIndex = oldIndex + 1;\n let insertBeforeChildren = [child];\n while (insertBeforeChildren.length) {\n const insertBefore = insertBeforeChildren.shift();\n if (isWNode(insertBefore)) {\n if (insertBefore.rendered) {\n insertBeforeChildren.push(...insertBefore.rendered);\n }\n }\n else {\n if (insertBefore.domNode) {\n insertBeforeDomNode = insertBefore.domNode;\n break;\n }\n }\n if (insertBeforeChildren.length === 0 && oldChildren[nextIndex]) {\n insertBeforeChildren.push(oldChildren[nextIndex]);\n nextIndex++;\n }\n }\n }\n createDom(newChild, parentVNode, insertBeforeDomNode, projectionOptions, parentInstance);\n nodeAdded(newChild, transitions);\n const indexToCheck = newIndex;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(newChildren, indexToCheck, parentInstance);\n });\n };\n if (!oldChild || findOldIndex === -1) {\n addChild();\n newIndex++;\n continue;\n }\n const removeChild = () => {\n const indexToCheck = oldIndex;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\n });\n if (isWNode(oldChild)) {\n const item = instanceMap.get(oldChild.instance);\n if (item) {\n oldChild = item.dnode;\n }\n }\n nodeToRemove(oldChild, transitions, projectionOptions);\n };\n const findNewIndex = findIndexOfChild(newChildren, oldChild, newIndex + 1);\n if (findNewIndex === -1) {\n removeChild();\n oldIndex++;\n continue;\n }\n addChild();\n removeChild();\n oldIndex++;\n newIndex++;\n }\n if (oldChildrenLength > oldIndex) {\n // Remove child fragments\n for (i = oldIndex; i < oldChildrenLength; i++) {\n const indexToCheck = i;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\n });\n let childToRemove = oldChildren[i];\n if (isWNode(childToRemove)) {\n const item = instanceMap.get(childToRemove.instance);\n if (item) {\n childToRemove = item.dnode;\n }\n }\n nodeToRemove(childToRemove, transitions, projectionOptions);\n }\n }\n return textUpdated;\n}\nfunction addChildren(parentVNode, children, projectionOptions, parentInstance, insertBefore = undefined, childNodes) {\n if (children === undefined) {\n return;\n }\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectorState.merge && childNodes === undefined) {\n childNodes = arrayFrom(parentVNode.domNode.childNodes);\n }\n const transitions = projectionOptions.transitions;\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n if (isVNode(child)) {\n if (projectorState.merge && childNodes) {\n let domElement = undefined;\n while (child.domNode === undefined && childNodes.length > 0) {\n domElement = childNodes.shift();\n if (domElement && domElement.tagName === (child.tag.toUpperCase() || undefined)) {\n child.domNode = domElement;\n }\n }\n }\n createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance);\n }\n else {\n createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes);\n }\n nodeAdded(child, transitions);\n }\n}\nfunction initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions) {\n addChildren(dnode, dnode.children, projectionOptions, parentInstance, undefined);\n if (typeof dnode.deferredPropertiesCallback === 'function' && dnode.inserted === undefined) {\n addDeferredProperties(dnode, projectionOptions);\n }\n if (dnode.attributes && dnode.events) {\n updateAttributes(domNode, {}, dnode.attributes, projectionOptions);\n updateProperties(domNode, {}, dnode.properties, projectionOptions, false);\n removeOrphanedEvents(domNode, {}, dnode.events, projectionOptions, true);\n const events = dnode.events;\n Object.keys(events).forEach((event) => {\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind);\n });\n }\n else {\n updateProperties(domNode, {}, dnode.properties, projectionOptions);\n }\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\n const instanceData = widgetInstanceMap.get(parentInstance);\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\n }\n dnode.inserted = true;\n}\nfunction createDom(dnode, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes) {\n let domNode;\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (isWNode(dnode)) {\n let { widgetConstructor } = dnode;\n const parentInstanceData = widgetInstanceMap.get(parentInstance);\n if (!isWidgetBaseConstructor(widgetConstructor)) {\n const item = parentInstanceData.registry().get(widgetConstructor);\n if (item === null) {\n return;\n }\n widgetConstructor = item;\n }\n const instance = new widgetConstructor();\n dnode.instance = instance;\n const instanceData = widgetInstanceMap.get(instance);\n instanceData.invalidate = () => {\n instanceData.dirty = true;\n if (instanceData.rendering === false) {\n projectorState.renderQueue.push({ instance, depth: projectionOptions.depth });\n scheduleRender(projectionOptions);\n }\n };\n instanceData.rendering = true;\n instance.__setCoreProperties__(dnode.coreProperties);\n instance.__setChildren__(dnode.children);\n instance.__setProperties__(dnode.properties);\n const rendered = instance.__render__();\n instanceData.rendering = false;\n if (rendered) {\n const filteredRendered = filterAndDecorateChildren(rendered, instance);\n dnode.rendered = filteredRendered;\n addChildren(parentVNode, filteredRendered, projectionOptions, instance, insertBefore, childNodes);\n }\n instanceMap.set(instance, { dnode, parentVNode });\n instanceData.nodeHandler.addRoot();\n projectorState.afterRenderCallbacks.push(() => {\n instanceData.onAttach();\n });\n }\n else {\n if (projectorState.merge && projectorState.mergeElement !== undefined) {\n domNode = dnode.domNode = projectionOptions.mergeElement;\n projectorState.mergeElement = undefined;\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\n return;\n }\n const doc = parentVNode.domNode.ownerDocument;\n if (!dnode.tag && typeof dnode.text === 'string') {\n if (dnode.domNode !== undefined && parentVNode.domNode) {\n const newDomNode = dnode.domNode.ownerDocument.createTextNode(dnode.text);\n if (parentVNode.domNode === dnode.domNode.parentNode) {\n parentVNode.domNode.replaceChild(newDomNode, dnode.domNode);\n }\n else {\n parentVNode.domNode.appendChild(newDomNode);\n dnode.domNode.parentNode && dnode.domNode.parentNode.removeChild(dnode.domNode);\n }\n dnode.domNode = newDomNode;\n }\n else {\n domNode = dnode.domNode = doc.createTextNode(dnode.text);\n if (insertBefore !== undefined) {\n parentVNode.domNode.insertBefore(domNode, insertBefore);\n }\n else {\n parentVNode.domNode.appendChild(domNode);\n }\n }\n }\n else {\n if (dnode.domNode === undefined) {\n if (dnode.tag === 'svg') {\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\n }\n if (projectionOptions.namespace !== undefined) {\n domNode = dnode.domNode = doc.createElementNS(projectionOptions.namespace, dnode.tag);\n }\n else {\n domNode = dnode.domNode = dnode.domNode || doc.createElement(dnode.tag);\n }\n }\n else {\n domNode = dnode.domNode;\n }\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\n if (insertBefore !== undefined) {\n parentVNode.domNode.insertBefore(domNode, insertBefore);\n }\n else if (domNode.parentNode !== parentVNode.domNode) {\n parentVNode.domNode.appendChild(domNode);\n }\n }\n }\n}\nfunction updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance) {\n if (isWNode(dnode)) {\n const { instance } = previous;\n const { parentVNode, dnode: node } = instanceMap.get(instance);\n const previousRendered = node ? node.rendered : previous.rendered;\n const instanceData = widgetInstanceMap.get(instance);\n instanceData.rendering = true;\n instance.__setCoreProperties__(dnode.coreProperties);\n instance.__setChildren__(dnode.children);\n instance.__setProperties__(dnode.properties);\n dnode.instance = instance;\n if (instanceData.dirty === true) {\n const rendered = instance.__render__();\n instanceData.rendering = false;\n dnode.rendered = filterAndDecorateChildren(rendered, instance);\n updateChildren(parentVNode, previousRendered, dnode.rendered, instance, projectionOptions);\n }\n else {\n instanceData.rendering = false;\n dnode.rendered = previousRendered;\n }\n instanceMap.set(instance, { dnode, parentVNode });\n instanceData.nodeHandler.addRoot();\n }\n else {\n if (previous === dnode) {\n return false;\n }\n const domNode = (dnode.domNode = previous.domNode);\n let textUpdated = false;\n let updated = false;\n if (!dnode.tag && typeof dnode.text === 'string') {\n if (dnode.text !== previous.text) {\n const newDomNode = domNode.ownerDocument.createTextNode(dnode.text);\n domNode.parentNode.replaceChild(newDomNode, domNode);\n dnode.domNode = newDomNode;\n textUpdated = true;\n return textUpdated;\n }\n }\n else {\n if (dnode.tag && dnode.tag.lastIndexOf('svg', 0) === 0) {\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\n }\n if (previous.children !== dnode.children) {\n const children = filterAndDecorateChildren(dnode.children, parentInstance);\n dnode.children = children;\n updated =\n updateChildren(dnode, previous.children, children, parentInstance, projectionOptions) || updated;\n }\n const previousProperties = buildPreviousProperties(domNode, previous, dnode);\n if (dnode.attributes && dnode.events) {\n updateAttributes(domNode, previousProperties.attributes, dnode.attributes, projectionOptions);\n updated =\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions, false) || updated;\n removeOrphanedEvents(domNode, previousProperties.events, dnode.events, projectionOptions, true);\n const events = dnode.events;\n Object.keys(events).forEach((event) => {\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind, previousProperties.events[event]);\n });\n }\n else {\n updated =\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions) ||\n updated;\n }\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\n const instanceData = widgetInstanceMap.get(parentInstance);\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\n }\n }\n if (updated && dnode.properties && dnode.properties.updateAnimation) {\n dnode.properties.updateAnimation(domNode, dnode.properties, previous.properties);\n }\n }\n}\nfunction addDeferredProperties(vnode, projectionOptions) {\n // transfer any properties that have been passed - as these must be decorated properties\n vnode.decoratedDeferredProperties = vnode.properties;\n const properties = vnode.deferredPropertiesCallback(!!vnode.inserted);\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n vnode.properties = Object.assign({}, properties, vnode.decoratedDeferredProperties);\n projectorState.deferredRenderCallbacks.push(() => {\n const properties = Object.assign({}, vnode.deferredPropertiesCallback(!!vnode.inserted), vnode.decoratedDeferredProperties);\n updateProperties(vnode.domNode, vnode.properties, properties, projectionOptions);\n vnode.properties = properties;\n });\n}\nfunction runDeferredRenderCallbacks(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectorState.deferredRenderCallbacks.length) {\n if (projectionOptions.sync) {\n while (projectorState.deferredRenderCallbacks.length) {\n const callback = projectorState.deferredRenderCallbacks.shift();\n callback && callback();\n }\n }\n else {\n global.requestAnimationFrame(() => {\n while (projectorState.deferredRenderCallbacks.length) {\n const callback = projectorState.deferredRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n }\n}\nfunction runAfterRenderCallbacks(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectionOptions.sync) {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n }\n else {\n if (global.requestIdleCallback) {\n global.requestIdleCallback(() => {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n else {\n setTimeout(() => {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n }\n}\nfunction scheduleRender(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectionOptions.sync) {\n render(projectionOptions);\n }\n else if (projectorState.renderScheduled === undefined) {\n projectorState.renderScheduled = global.requestAnimationFrame(() => {\n render(projectionOptions);\n });\n }\n}\nfunction render(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectorState.renderScheduled = undefined;\n const renderQueue = projectorState.renderQueue;\n const renders = [...renderQueue];\n projectorState.renderQueue = [];\n renders.sort((a, b) => a.depth - b.depth);\n const previouslyRendered = [];\n while (renders.length) {\n const { instance } = renders.shift();\n if (instanceMap.has(instance) && previouslyRendered.indexOf(instance) === -1) {\n previouslyRendered.push(instance);\n const { parentVNode, dnode } = instanceMap.get(instance);\n const instanceData = widgetInstanceMap.get(instance);\n updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance);\n }\n }\n runAfterRenderCallbacks(projectionOptions);\n runDeferredRenderCallbacks(projectionOptions);\n}\nexport const dom = {\n append: function (parentNode, instance, projectionOptions = {}) {\n const instanceData = widgetInstanceMap.get(instance);\n const finalProjectorOptions = getProjectionOptions(projectionOptions, instance);\n const projectorState = {\n afterRenderCallbacks: [],\n deferredRenderCallbacks: [],\n nodeMap: new WeakMap(),\n renderScheduled: undefined,\n renderQueue: [],\n merge: projectionOptions.merge || false,\n mergeElement: projectionOptions.mergeElement\n };\n projectorStateMap.set(instance, projectorState);\n finalProjectorOptions.rootNode = parentNode;\n const parentVNode = toParentVNode(finalProjectorOptions.rootNode);\n const node = toInternalWNode(instance, instanceData);\n instanceMap.set(instance, { dnode: node, parentVNode });\n instanceData.invalidate = () => {\n instanceData.dirty = true;\n if (instanceData.rendering === false) {\n projectorState.renderQueue.push({ instance, depth: finalProjectorOptions.depth });\n scheduleRender(finalProjectorOptions);\n }\n };\n updateDom(node, node, finalProjectorOptions, parentVNode, instance);\n projectorState.afterRenderCallbacks.push(() => {\n instanceData.onAttach();\n });\n runDeferredRenderCallbacks(finalProjectorOptions);\n runAfterRenderCallbacks(finalProjectorOptions);\n return {\n domNode: finalProjectorOptions.rootNode\n };\n },\n create: function (instance, projectionOptions) {\n return this.append(document.createElement('div'), instance, projectionOptions);\n },\n merge: function (element, instance, projectionOptions = {}) {\n projectionOptions.merge = true;\n projectionOptions.mergeElement = element;\n const projection = this.append(element.parentNode, instance, projectionOptions);\n const projectorState = projectorStateMap.get(instance);\n projectorState.merge = false;\n return projection;\n }\n};\n//# sourceMappingURL=vdom.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/vdom.mjs\n// module id = ./node_modules/@dojo/widget-core/vdom.mjs\n// module chunks = menu-item","/*** IMPORTS FROM imports-loader ***/\nvar widgetFactory = require(\"src/menu-item/MenuItem\");\n\nvar registerCustomElement = require('@dojo/widget-core/registerCustomElement').default;\n\nvar defaultExport = widgetFactory.default;\ndefaultExport && registerCustomElement(defaultExport);\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/imports-loader?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js\n// module id = ./node_modules/imports-loader/index.js?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js\n// module chunks = menu-item","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/process/browser.js\n// module id = ./node_modules/process/browser.js\n// module chunks = menu-item","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)\r\n t[p[i]] = s[p[i]];\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = y[op[0] & 2 ? \"return\" : op[0] ? \"throw\" : \"next\"]) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [0, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { if (o[n]) i[n] = function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; }; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator];\r\n return m ? m.call(o) : typeof __values === \"function\" ? __values(o) : o[Symbol.iterator]();\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/tslib/tslib.es6.js\n// module id = ./node_modules/tslib/tslib.es6.js\n// module chunks = menu-item","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\n} catch(e) {\n\t// This works if the window reference is available\n\tif(typeof window === \"object\")\n\t\tg = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = ./node_modules/webpack/buildin/global.js\n// module chunks = menu-item","import { v } from '@dojo/widget-core/d';\nimport { customElement } from '@dojo/widget-core/decorators/customElement';\nimport { WidgetProperties } from '@dojo/widget-core/interfaces';\nimport { theme, ThemedMixin } from '@dojo/widget-core/mixins/Themed';\nimport { WidgetBase } from '@dojo/widget-core/WidgetBase';\n\nimport * as css from './menuItem.m.css';\n\nexport interface MenuItemProperties extends WidgetProperties {\n\ttitle: string;\n\tselected?: boolean;\n\tdata?: any;\n\tonSelected?: (data: any) => void;\n}\n\n@customElement({\n\ttag: 'demo-menu-item',\n\tattributes: ['title', 'selected'],\n\tevents: ['onSelected'],\n\tproperties: ['data', 'selected']\n})\n@theme(css)\nexport class MenuItem extends ThemedMixin(WidgetBase) {\n\tprivate _onClick() {\n\t\tthis.properties.onSelected && this.properties.onSelected(this.properties.data);\n\t}\n\n\tprotected render() {\n\t\tconst { title, selected } = this.properties;\n\n\t\treturn v('li', { classes: this.theme(css.root) }, [\n\t\t\tv(\n\t\t\t\t'span',\n\t\t\t\t{\n\t\t\t\t\tclasses: this.theme([css.item, selected ? css.selected : null]),\n\t\t\t\t\tonclick: this._onClick\n\t\t\t\t},\n\t\t\t\t[title]\n\t\t\t)\n\t\t]);\n\t}\n}\n\nexport default MenuItem;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@dojo/webpack-contrib/css-module-dts-loader?type=ts&instanceName=0_menu-item!./src/menu-item/MenuItem.ts","// removed by extract-text-webpack-plugin\nmodule.exports = {\" _key\":\"test-app/menuItem\",\"root\":\"sUmUi4Sh\",\"item\":\"_2Mk6Rdqa\",\"selected\":\"_1-f3ItOh\"};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/menu-item/menuItem.m.css\n// module id = ./src/menu-item/menuItem.m.css\n// module chunks = menu-item"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap ea035e8f5bc7b3c31aa9","webpack:///./node_modules/@dojo/framework/core/Destroyable.mjs","webpack:///./node_modules/@dojo/framework/core/Evented.mjs","webpack:///./node_modules/@dojo/framework/core/lang.mjs","webpack:///./node_modules/@dojo/framework/has/has.mjs","webpack:///./node_modules/@dojo/framework/shim/Map.mjs","webpack:///./node_modules/@dojo/framework/shim/Promise.mjs","webpack:///./node_modules/@dojo/framework/shim/Symbol.mjs","webpack:///./node_modules/@dojo/framework/shim/WeakMap.mjs","webpack:///./node_modules/@dojo/framework/shim/array.mjs","webpack:///./node_modules/@dojo/framework/shim/global.mjs","webpack:///./node_modules/@dojo/framework/shim/number.mjs","webpack:///./node_modules/@dojo/framework/shim/object.mjs","webpack:///./node_modules/@dojo/framework/shim/string.mjs","webpack:///./node_modules/@dojo/framework/shim/support/has.mjs","webpack:///./node_modules/@dojo/framework/shim/support/queue.mjs","webpack:///./node_modules/@dojo/framework/shim/support/util.mjs","webpack:///./node_modules/@dojo/framework/widget-core/Injector.mjs","webpack:///./node_modules/@dojo/framework/widget-core/NodeHandler.mjs","webpack:///./node_modules/@dojo/framework/widget-core/Registry.mjs","webpack:///./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs","webpack:///./node_modules/@dojo/framework/widget-core/WidgetBase.mjs","webpack:///./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs","webpack:///./node_modules/@dojo/framework/widget-core/d.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/inject.mjs","webpack:///./node_modules/@dojo/framework/widget-core/diff.mjs","webpack:///./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs","webpack:///./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs","webpack:///./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs","webpack:///./node_modules/@dojo/framework/widget-core/vdom.mjs","webpack:///./node_modules/@dojo/cli-build-widget/template/custom-element.js","webpack:///./node_modules/process/browser.js","webpack:///./node_modules/tslib/tslib.es6.js","webpack:///(webpack)/buildin/global.js","webpack:///./src/menu-item/MenuItem.ts","webpack:///./src/menu-item/menuItem.m.css?6a95"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","noop","__WEBPACK_IMPORTED_MODULE_1__shim_Promise__","resolve","destroyed","Error","Destroyable","[object Object]","this","handles","handle","Array","isArray","__WEBPACK_IMPORTED_MODULE_0__lang__","_handles","push","splice","indexOf","destroy","forEach","own","__webpack_exports__","regexMap","__WEBPACK_IMPORTED_MODULE_0__shim_Map__","Evented","__WEBPACK_IMPORTED_MODULE_1__Destroyable__","super","arguments","listenersMap","event","methods","type","globString","targetString","regex","has","RegExp","replace","set","test","isGlobMatch","method","listener","map","_addListener","listeners","destructor","called","createHandle","length","slice","testCache","testFunctions","testThenables","globalScope","window","global","self","staticFeatures","DojoHasEnvironment","staticCache","apply","add","feature","value","overwrite","normalizedFeature","toLowerCase","Boolean","exists","TypeError","then","isFeatureTestThenable","resolvedValue","result","document","location","process","versions","node","Map","__WEBPACK_IMPORTED_MODULE_1__global__","ShimPromise","__WEBPACK_IMPORTED_MODULE_0__global__","Promise","Symbol","wellKnown","__WEBPACK_IMPORTED_MODULE_2__support_util__","for","WeakMap","from","of","copyWithin","fill","find","findIndex","includes","__WEBPACK_IMPORTED_MODULE_4__support_util__","globalObject","Math","pow","assign","getOwnPropertyDescriptor","getOwnPropertyNames","getOwnPropertySymbols","is","keys","getOwnPropertyDescriptors","entries","values","fromCodePoint","raw","codePointAt","endsWith","normalize","repeat","startsWith","padEnd","padStart","String","__WEBPACK_IMPORTED_MODULE_0__has_has__","every","key","Number","POSITIVE_INFINITY","e","imul","Observable","Set","getCallSite","callSite","substitutions","key1","key2","freeze","postMessage","requestAnimationFrame","setImmediate","MutationObserver","WebKitMutationObserver","example","createElement","observer","observe","attributes","style","setProperty","takeRecords","undefined","Animation","KeyframeEffect","executeTask","item","isActive","callback","getQueueHandle","enqueue","queue","addEventListener","source","data","stopPropagation","shift","queueTask","id","queueAnimationTask","rafId","bind","cancelAnimationFrame","writable","nativeFunction","target","args","Injector","__WEBPACK_IMPORTED_MODULE_0__core_Evented__","payload","_payload","invalidator","_invalidator","NodeEventType","_nodeMap","__WEBPACK_IMPORTED_MODULE_1__shim_Map__","element","emit","Widget","Projector","clear","WIDGET_BASE_TYPE","__WEBPACK_IMPORTED_MODULE_2__shim_Symbol__","isWidgetBaseConstructor","_type","Registry","__WEBPACK_IMPORTED_MODULE_3__core_Evented__","widgetLabel","action","label","_widgetRegistry","toString","__WEBPACK_IMPORTED_MODULE_0__shim_Promise__","widgetCtor","emitLoadedEvent","error","injectorFactory","_injectorRegistry","injectorItem","injector","promise","default","isWidgetConstructorDefaultExport","hasInjector","__WEBPACK_IMPORTED_MODULE_1__core_Evented__","_registry","__WEBPACK_IMPORTED_MODULE_2__Registry__","_registryWidgetLabelMap","_registryInjectorLabelMap","baseRegistry","delete","base","widget","define","defineInjector","globalPrecedence","_get","getFunctionName","labelMap","registries","registry","registeredLabels","on","decoratorMap","boundAuto","__WEBPACK_IMPORTED_MODULE_4__diff__","noBind","WidgetBase","_initialProperties","_changedPropertyKeys","_nodeHandler","__WEBPACK_IMPORTED_MODULE_6__NodeHandler__","_children","_decoratorCache","_properties","_boundRenderFunc","render","_boundInvalidate","invalidate","__WEBPACK_IMPORTED_MODULE_7__vdom__","dirty","onAttach","onDetach","nodeHandler","coreProperties","rendering","inputProperties","_runAfterConstructors","MetaType","_metaMap","cached","properties","changedPropertyKeys","instanceData","__WEBPACK_IMPORTED_MODULE_5__RegistryHandler__","originalProperties","_runBeforeProperties","registeredDiffPropertyNames","getDecorator","propertyNames","allProperties","checkedProperties","diffPropertyResults","runReactions","propertyName","previousProperty","newProperty","_bindFunctionProperty","diffFunctions","changed","executedReactions","reaction","propertyChanged","reactionRun","children","dNode","_runBeforeRenders","runAfterRenders","__WEBPACK_IMPORTED_MODULE_3__d__","decoratorKey","decoratorList","constructor","specificDecoratorList","decorators","allDecorators","instanceMap","unshift","getPrototypeOf","_buildDecoratorList","__WEBPACK_IMPORTED_MODULE_8__Registry__","_bindFunctionPropertyMap","__WEBPACK_IMPORTED_MODULE_1__shim_WeakMap__","bindInfo","boundFunc","scope","beforeProperties","reduce","beforePropertiesFunction","beforeRenders","beforeRenderFunction","updatedRender","console","warn","afterRenders","afterRenderFunction","meta","afterRender","afterConstructors","afterConstructor","pop","browserSpecificTransitionEndEventName","browserSpecificAnimationEndEventName","initialize","determineBrowserStyleNames","runAndCleanUp","startAnimation","finishAnimation","finished","transitionEnd","removeEventListener","enter","enterAnimation","activeClass","enterAnimationActive","classList","remove","exit","exitAnimation","removeNode","exitAnimationActive","child","DOMVNODE","widgetConstructor","WNODE","tag","propertiesOrChildren","deferredPropertiesCallback","VNODE","attrs","props","diffType","isElementNode","tagName","events","domNode","text","__WEBPACK_IMPORTED_MODULE_0__shim_Symbol__","isWNode","isVNode","__WEBPACK_IMPORTED_MODULE_0__handleDecorator__","propertyKey","addDecorator","alwaysRender","__WEBPACK_IMPORTED_MODULE_1__beforeProperties__","customElement","childType","__WEBPACK_IMPORTED_MODULE_0__registerCustomElement__","DOJO","registryFactory","__WEBPACK_IMPORTED_MODULE_1__Registry__","__customElementDescriptor","diffProperty","diffFunction","__WEBPACK_IMPORTED_MODULE_1__diff__","reactionFunction","handleDecorator","handler","descriptor","registeredInjectorsMap","__WEBPACK_IMPORTED_MODULE_0__shim_WeakMap__","inject","getProperties","__WEBPACK_IMPORTED_MODULE_1__handleDecorator__","__WEBPACK_IMPORTED_MODULE_2__beforeProperties__","getInjector","registeredInjectors","__WEBPACK_IMPORTED_MODULE_0__Registry__","reference","ignore","isObjectOrArray","shallow","validOldProperty","validNewProperty","previousKeys","newKeys","some","ProjectorAttachState","AttachType","ProjectorMixin","Base","_root","body","_async","_projectorProperties","_projectionOptions","transitions","__WEBPACK_IMPORTED_MODULE_2__animations_cssTransitions__","root","projectorState","Detached","options","Append","_attach","Merge","Attached","async","doc","previousRoot","createDocumentFragment","__setChildren__","__setProperties__","__WEBPACK_IMPORTED_MODULE_1__core_lang__","__setCoreProperties__","_projection","childNodes","outerHTML","__WEBPACK_IMPORTED_MODULE_4__d__","_attachHandle","sync","__WEBPACK_IMPORTED_MODULE_5__vdom__","append","merge","__WEBPACK_IMPORTED_MODULE_0_tslib__","__WEBPACK_IMPORTED_MODULE_3__decorators_afterRender__","theme","__WEBPACK_IMPORTED_MODULE_3__decorators_handleDecorator__","themeRegistry","themeInjector","__WEBPACK_IMPORTED_MODULE_1__Injector__","INJECTED_THEME_KEY","setInvalidator","THEME_KEY","ThemedMixin","Themed","_registeredBaseThemeKeys","_recalculateClasses","_theme","classes","_recalculateThemeClasses","className","_getThemeClass","extraClasses","themeClassName","_baseThemeClassesReverseLookup","resultClassNames","_registeredBaseTheme","join","baseThemes","finalBaseTheme","baseTheme","_a","currentClassNames","baseClass","themeKey","__WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__","__WEBPACK_IMPORTED_MODULE_5__diff__","__WEBPACK_IMPORTED_MODULE_2__decorators_inject__","CustomElementChildType","DomToWidgetWrapper","__WEBPACK_IMPORTED_MODULE_1__WidgetBase__","__WEBPACK_IMPORTED_MODULE_7__decorators_alwaysRender__","create","WidgetConstructor","attributeMap","attributeName","HTMLElement","_eventProperties","_initialised","domProperties","_attributesToProperties","filteredPropertyName","_getProperty","_setProperty","eventName","_getEventProperty","_setEventProperty","eventCallback","dispatchEvent","CustomEvent","bubbles","detail","defineProperties","TEXT","__WEBPACK_IMPORTED_MODULE_3__shim_array__","childNode","_render","_childConnected","widgetProperties","renderChildren","__children__","themeContext","__WEBPACK_IMPORTED_MODULE_6__mixins_Themed__","_getTheme","__WEBPACK_IMPORTED_MODULE_5__shim_global__","__WEBPACK_IMPORTED_MODULE_2__mixins_Projector__","_projector","setProperties","dojoce","themes","parentNode","filter","Child","isWidget","__properties__","oldValue","getAttribute","observedAttributes","register","customElements","NAMESPACE_SVG","NAMESPACE_W3","NAMESPACE_XLINK","emptyArray","nodeOperations","widgetInstanceMap","__WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__","nextSiblingMap","projectorStateMap","same","dnode1","dnode2","__WEBPACK_IMPORTED_MODULE_2__d__","instance","missingTransition","checkStyleValue","styleValue","updateEvent","currentValue","projectionOptions","previousValue","projectorInstance","eventMap","nodeMap","previousEvent","evt","addClasses","classNames","split","removeClasses","nodeOperation","propName","propValue","deferredRenderCallbacks","removeOrphanedEvents","previousProperties","onlyEvents","isEvent","substr","updateAttribute","attrName","attrValue","namespace","setAttributeNS","removeAttribute","setAttribute","updateAttributes","previousAttributes","attrNames","attrCount","updateProperties","includesEventsAndAttributes","propertiesUpdated","propNames","propCount","previousClasses","currentClasses","newClasses","previousClassName","classIndex","styleNames","styleCount","j","styleName","newStyleValue","styleApplyer","domValue","lastIndexOf","findIndexOfChild","sameAs","start","toInternalWNode","rendered","filterAndDecorateChildren","nodeAdded","dnode","nodeToRemove","pointerEvents","removeDomNode","removeChild","checkDistinguishable","indexToCheck","parentInstance","nodeIdentifier","parentName","updateChildren","parentVNode","siblings","oldChildren","newChildren","oldChildrenLength","newChildrenLength","depth","oldIndex","newIndex","textUpdated","oldChild","newChild","inserted","addDeferredProperties","updateDom","findOldIndex","addChild","insertBeforeDomNode","childrenArray","nextIndex","insertBeforeChildren","insertBefore","parentElement","createDom","afterRenderCallbacks","childToRemove","addChildren","__WEBPACK_IMPORTED_MODULE_1__shim_array__","nextSiblings","domElement","toUpperCase","initPropertiesAndChildren","parentInstanceData","__WEBPACK_IMPORTED_MODULE_3__Registry__","renderQueue","scheduleRender","__render__","filteredRendered","addRoot","mergeElement","ownerDocument","createElementNS","appendChild","newDomNode","createTextNode","replaceChild","previous","oldNextSiblings","previousRendered","updated","current","newProperties","buildPreviousProperties","updateAnimation","vnode","decoratedDeferredProperties","runDeferredRenderCallbacks","__WEBPACK_IMPORTED_MODULE_0__shim_global__","runAfterRenderCallbacks","requestIdleCallback","setTimeout","renderScheduled","renders","sort","a","b","previouslyRendered","dom","finalProjectorOptions","projectorOptions","defaults","getProjectionOptions","rootNode","projection","widgetFactory","registerCustomElement","defaultExport","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","fun","clearTimeout","currentQueue","draining","queueIndex","cleanUpNextTick","concat","drainQueue","timeout","len","run","marker","runClearTimeout","Item","array","nextTick","title","browser","env","argv","version","addListener","once","off","removeListener","removeAllListeners","prependListener","prependOnceListener","binding","cwd","chdir","dir","umask","t","desc","r","Reflect","decorate","setPrototypeOf","g","Function","eval","MenuItem","__WEBPACK_IMPORTED_MODULE_3__dojo_framework_widget_core_mixins_Themed__","__WEBPACK_IMPORTED_MODULE_4__dojo_framework_widget_core_WidgetBase__","onSelected","selected","__WEBPACK_IMPORTED_MODULE_1__dojo_framework_widget_core_d__","__WEBPACK_IMPORTED_MODULE_5__menuItem_m_css__","onclick","_onClick","__WEBPACK_IMPORTED_MODULE_2__dojo_framework_widget_core_decorators_customElement__"," _key"],"mappings":"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","file":"menu-item-1.0.0.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap ea035e8f5bc7b3c31aa9","import { createCompositeHandle } from './lang';\nimport Promise from '../shim/Promise';\n/**\n * No operation function to replace own once instance is destoryed\n */\nfunction noop() {\n return Promise.resolve(false);\n}\n/**\n * No op function used to replace own, once instance has been destoryed\n */\nfunction destroyed() {\n throw new Error('Call made to destroyed method');\n}\nexport class Destroyable {\n /**\n * @constructor\n */\n constructor() {\n this.handles = [];\n }\n /**\n * Register handles for the instance that will be destroyed when `this.destroy` is called\n *\n * @param {Handle} handle The handle to add for the instance\n * @returns {Handle} a handle for the handle, removes the handle for the instance and calls destroy\n */\n own(handles) {\n const handle = Array.isArray(handles) ? createCompositeHandle(...handles) : handles;\n const { handles: _handles } = this;\n _handles.push(handle);\n return {\n destroy() {\n _handles.splice(_handles.indexOf(handle));\n handle.destroy();\n }\n };\n }\n /**\n * Destrpys all handers registered for the instance\n *\n * @returns {Promise {\n this.handles.forEach((handle) => {\n handle && handle.destroy && handle.destroy();\n });\n this.destroy = noop;\n this.own = destroyed;\n resolve(true);\n });\n }\n}\nexport default Destroyable;\n//# sourceMappingURL=Destroyable.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/core/Destroyable.mjs\n// module id = ./node_modules/@dojo/framework/core/Destroyable.mjs\n// module chunks = menu-item","import Map from '../shim/Map';\nimport { Destroyable } from './Destroyable';\n/**\n * Map of computed regular expressions, keyed by string\n */\nconst regexMap = new Map();\n/**\n * Determines is the event type glob has been matched\n *\n * @returns boolean that indicates if the glob is matched\n */\nexport function isGlobMatch(globString, targetString) {\n if (typeof targetString === 'string' && typeof globString === 'string' && globString.indexOf('*') !== -1) {\n let regex;\n if (regexMap.has(globString)) {\n regex = regexMap.get(globString);\n }\n else {\n regex = new RegExp(`^${globString.replace(/\\*/g, '.*')}$`);\n regexMap.set(globString, regex);\n }\n return regex.test(targetString);\n }\n else {\n return globString === targetString;\n }\n}\n/**\n * Event Class\n */\nexport class Evented extends Destroyable {\n constructor() {\n super(...arguments);\n /**\n * map of listeners keyed by event type\n */\n this.listenersMap = new Map();\n }\n emit(event) {\n this.listenersMap.forEach((methods, type) => {\n if (isGlobMatch(type, event.type)) {\n [...methods].forEach((method) => {\n method.call(this, event);\n });\n }\n });\n }\n on(type, listener) {\n if (Array.isArray(listener)) {\n const handles = listener.map((listener) => this._addListener(type, listener));\n return {\n destroy() {\n handles.forEach((handle) => handle.destroy());\n }\n };\n }\n return this._addListener(type, listener);\n }\n _addListener(type, listener) {\n const listeners = this.listenersMap.get(type) || [];\n listeners.push(listener);\n this.listenersMap.set(type, listeners);\n return {\n destroy: () => {\n const listeners = this.listenersMap.get(type) || [];\n listeners.splice(listeners.indexOf(listener), 1);\n }\n };\n }\n}\nexport default Evented;\n//# sourceMappingURL=Evented.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/core/Evented.mjs\n// module id = ./node_modules/@dojo/framework/core/Evented.mjs\n// module chunks = menu-item","import { assign } from '../shim/object';\nexport { assign } from '../shim/object';\nconst slice = Array.prototype.slice;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Type guard that ensures that the value can be coerced to Object\n * to weed out host objects that do not derive from Object.\n * This function is used to check if we want to deep copy an object or not.\n * Note: In ES6 it is possible to modify an object's Symbol.toStringTag property, which will\n * change the value returned by `toString`. This is a rare edge case that is difficult to handle,\n * so it is not handled here.\n * @param value The value to check\n * @return If the value is coercible into an Object\n */\nfunction shouldDeepCopyObject(value) {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\nfunction copyArray(array, inherited) {\n return array.map(function (item) {\n if (Array.isArray(item)) {\n return copyArray(item, inherited);\n }\n return !shouldDeepCopyObject(item)\n ? item\n : _mixin({\n deep: true,\n inherited: inherited,\n sources: [item],\n target: {}\n });\n });\n}\nfunction _mixin(kwArgs) {\n const deep = kwArgs.deep;\n const inherited = kwArgs.inherited;\n const target = kwArgs.target;\n const copied = kwArgs.copied || [];\n const copiedClone = [...copied];\n for (let i = 0; i < kwArgs.sources.length; i++) {\n const source = kwArgs.sources[i];\n if (source === null || source === undefined) {\n continue;\n }\n for (let key in source) {\n if (inherited || hasOwnProperty.call(source, key)) {\n let value = source[key];\n if (copiedClone.indexOf(value) !== -1) {\n continue;\n }\n if (deep) {\n if (Array.isArray(value)) {\n value = copyArray(value, inherited);\n }\n else if (shouldDeepCopyObject(value)) {\n const targetValue = target[key] || {};\n copied.push(source);\n value = _mixin({\n deep: true,\n inherited: inherited,\n sources: [value],\n target: targetValue,\n copied\n });\n }\n }\n target[key] = value;\n }\n }\n }\n return target;\n}\nexport function create(prototype, ...mixins) {\n if (!mixins.length) {\n throw new RangeError('lang.create requires at least one mixin object.');\n }\n const args = mixins.slice();\n args.unshift(Object.create(prototype));\n return assign.apply(null, args);\n}\nexport function deepAssign(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: false,\n sources: sources,\n target: target\n });\n}\nexport function deepMixin(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Creates a new object using the provided source's prototype as the prototype for the new object, and then\n * deep copies the provided source's values into the new target.\n *\n * @param source The object to duplicate\n * @return The new object\n */\nexport function duplicate(source) {\n const target = Object.create(Object.getPrototypeOf(source));\n return deepMixin(target, source);\n}\n/**\n * Determines whether two values are the same value.\n *\n * @param a First value to compare\n * @param b Second value to compare\n * @return true if the values are the same; false otherwise\n */\nexport function isIdentical(a, b) {\n return (a === b ||\n /* both values are NaN */\n (a !== a && b !== b));\n}\n/**\n * Returns a function that binds a method to the specified object at runtime. This is similar to\n * `Function.prototype.bind`, but instead of a function it takes the name of a method on an object.\n * As a result, the function returned by `lateBind` will always call the function currently assigned to\n * the specified property on the object as of the moment the function it returns is called.\n *\n * @param instance The context object\n * @param method The name of the method on the context object to bind to itself\n * @param suppliedArgs An optional array of values to prepend to the `instance[method]` arguments list\n * @return The bound function\n */\nexport function lateBind(instance, method, ...suppliedArgs) {\n return suppliedArgs.length\n ? function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n // TS7017\n return instance[method].apply(instance, args);\n }\n : function () {\n // TS7017\n return instance[method].apply(instance, arguments);\n };\n}\nexport function mixin(target, ...sources) {\n return _mixin({\n deep: false,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Returns a function which invokes the given function with the given arguments prepended to its argument list.\n * Like `Function.prototype.bind`, but does not alter execution context.\n *\n * @param targetFunction The function that needs to be bound\n * @param suppliedArgs An optional array of arguments to prepend to the `targetFunction` arguments list\n * @return The bound function\n */\nexport function partial(targetFunction, ...suppliedArgs) {\n return function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n return targetFunction.apply(this, args);\n };\n}\n/**\n * Returns an object with a destroy method that, when called, calls the passed-in destructor.\n * This is intended to provide a unified interface for creating \"remove\" / \"destroy\" handlers for\n * event listeners, timers, etc.\n *\n * @param destructor A function that will be called when the handle's `destroy` method is invoked\n * @return The handle object\n */\nexport function createHandle(destructor) {\n let called = false;\n return {\n destroy: function () {\n if (!called) {\n called = true;\n destructor();\n }\n }\n };\n}\n/**\n * Returns a single handle that can be used to destroy multiple handles simultaneously.\n *\n * @param handles An array of handles with `destroy` methods\n * @return The handle object\n */\nexport function createCompositeHandle(...handles) {\n return createHandle(function () {\n for (let i = 0; i < handles.length; i++) {\n handles[i].destroy();\n }\n });\n}\n//# sourceMappingURL=lang.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/core/lang.mjs\n// module id = ./node_modules/@dojo/framework/core/lang.mjs\n// module chunks = menu-item","function isFeatureTestThenable(value) {\n return value && value.then;\n}\n/**\n * A cache of results of feature tests\n */\nexport const testCache = {};\n/**\n * A cache of the un-resolved feature tests\n */\nexport const testFunctions = {};\n/**\n * A cache of unresolved thenables (probably promises)\n * @type {{}}\n */\nconst testThenables = {};\n/**\n * A reference to the global scope (`window` in a browser, `global` in NodeJS)\n */\nconst globalScope = (function () {\n /* istanbul ignore else */\n if (typeof window !== 'undefined') {\n // Browsers\n return window;\n }\n else if (typeof global !== 'undefined') {\n // Node\n return global;\n }\n else if (typeof self !== 'undefined') {\n // Web workers\n return self;\n }\n /* istanbul ignore next */\n return {};\n})();\n/* Grab the staticFeatures if there are available */\nconst { staticFeatures } = globalScope.DojoHasEnvironment || {};\n/* Cleaning up the DojoHasEnviornment */\nif ('DojoHasEnvironment' in globalScope) {\n delete globalScope.DojoHasEnvironment;\n}\n/**\n * Custom type guard to narrow the `staticFeatures` to either a map or a function that\n * returns a map.\n *\n * @param value The value to guard for\n */\nfunction isStaticFeatureFunction(value) {\n return typeof value === 'function';\n}\n/**\n * The cache of asserted features that were available in the global scope when the\n * module loaded\n */\nconst staticCache = staticFeatures\n ? isStaticFeatureFunction(staticFeatures) ? staticFeatures.apply(globalScope) : staticFeatures\n : {}; /* Providing an empty cache, if none was in the environment\n\n/**\n* AMD plugin function.\n*\n* Conditional loads modules based on a has feature test value.\n*\n* @param resourceId Gives the resolved module id to load.\n* @param require The loader require function with respect to the module that contained the plugin resource in its\n* dependency list.\n* @param load Callback to loader that consumes result of plugin demand.\n*/\nexport function load(resourceId, require, load, config) {\n resourceId ? require([resourceId], load) : load();\n}\n/**\n * AMD plugin function.\n *\n * Resolves resourceId into a module id based on possibly-nested tenary expression that branches on has feature test\n * value(s).\n *\n * @param resourceId The id of the module\n * @param normalize Resolves a relative module id into an absolute module id\n */\nexport function normalize(resourceId, normalize) {\n const tokens = resourceId.match(/[\\?:]|[^:\\?]*/g) || [];\n let i = 0;\n function get(skip) {\n const term = tokens[i++];\n if (term === ':') {\n // empty string module name, resolves to null\n return null;\n }\n else {\n // postfixed with a ? means it is a feature to branch on, the term is the name of the feature\n if (tokens[i++] === '?') {\n if (!skip && has(term)) {\n // matched the feature, get the first value from the options\n return get();\n }\n else {\n // did not match, get the second value, passing over the first\n get(true);\n return get(skip);\n }\n }\n // a module\n return term;\n }\n }\n const id = get();\n return id && normalize(id);\n}\n/**\n * Check if a feature has already been registered\n *\n * @param feature the name of the feature\n */\nexport function exists(feature) {\n const normalizedFeature = feature.toLowerCase();\n return Boolean(normalizedFeature in staticCache || normalizedFeature in testCache || testFunctions[normalizedFeature]);\n}\n/**\n * Register a new test for a named feature.\n *\n * @example\n * has.add('dom-addeventlistener', !!document.addEventListener);\n *\n * @example\n * has.add('touch-events', function () {\n * return 'ontouchstart' in document\n * });\n *\n * @param feature the name of the feature\n * @param value the value reported of the feature, or a function that will be executed once on first test\n * @param overwrite if an existing value should be overwritten. Defaults to false.\n */\nexport function add(feature, value, overwrite = false) {\n const normalizedFeature = feature.toLowerCase();\n if (exists(normalizedFeature) && !overwrite && !(normalizedFeature in staticCache)) {\n throw new TypeError(`Feature \"${feature}\" exists and overwrite not true.`);\n }\n if (typeof value === 'function') {\n testFunctions[normalizedFeature] = value;\n }\n else if (isFeatureTestThenable(value)) {\n testThenables[feature] = value.then((resolvedValue) => {\n testCache[feature] = resolvedValue;\n delete testThenables[feature];\n }, () => {\n delete testThenables[feature];\n });\n }\n else {\n testCache[normalizedFeature] = value;\n delete testFunctions[normalizedFeature];\n }\n}\n/**\n * Return the current value of a named feature.\n *\n * @param feature The name (if a string) or identifier (if an integer) of the feature to test.\n */\nexport default function has(feature) {\n let result;\n const normalizedFeature = feature.toLowerCase();\n if (normalizedFeature in staticCache) {\n result = staticCache[normalizedFeature];\n }\n else if (testFunctions[normalizedFeature]) {\n result = testCache[normalizedFeature] = testFunctions[normalizedFeature].call(null);\n delete testFunctions[normalizedFeature];\n }\n else if (normalizedFeature in testCache) {\n result = testCache[normalizedFeature];\n }\n else if (feature in testThenables) {\n return false;\n }\n else {\n throw new TypeError(`Attempt to detect unregistered has feature \"${feature}\"`);\n }\n return result;\n}\n/*\n * Out of the box feature tests\n */\n/* Environments */\n/* Used as a value to provide a debug only code path */\nadd('debug', true);\n/* Detects if the environment is \"browser like\" */\nadd('host-browser', typeof document !== 'undefined' && typeof location !== 'undefined');\n/* Detects if the environment appears to be NodeJS */\nadd('host-node', function () {\n if (typeof process === 'object' && process.versions && process.versions.node) {\n return process.versions.node;\n }\n});\n//# sourceMappingURL=has.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/has/has.mjs\n// module id = ./node_modules/@dojo/framework/has/has.mjs\n// module chunks = menu-item","import { isArrayLike, ShimIterator } from './iterator';\nimport global from './global';\nimport { is as objectIs } from './object';\nimport has from './support/has';\nimport './Symbol';\nexport let Map = global.Map;\nif (!true) {\n Map = (_a = class Map {\n constructor(iterable) {\n this._keys = [];\n this._values = [];\n this[Symbol.toStringTag] = 'Map';\n if (iterable) {\n if (isArrayLike(iterable)) {\n for (let i = 0; i < iterable.length; i++) {\n const value = iterable[i];\n this.set(value[0], value[1]);\n }\n }\n else {\n for (const value of iterable) {\n this.set(value[0], value[1]);\n }\n }\n }\n }\n /**\n * An alternative to Array.prototype.indexOf using Object.is\n * to check for equality. See http://mzl.la/1zuKO2V\n */\n _indexOfKey(keys, key) {\n for (let i = 0, length = keys.length; i < length; i++) {\n if (objectIs(keys[i], key)) {\n return i;\n }\n }\n return -1;\n }\n get size() {\n return this._keys.length;\n }\n clear() {\n this._keys.length = this._values.length = 0;\n }\n delete(key) {\n const index = this._indexOfKey(this._keys, key);\n if (index < 0) {\n return false;\n }\n this._keys.splice(index, 1);\n this._values.splice(index, 1);\n return true;\n }\n entries() {\n const values = this._keys.map((key, i) => {\n return [key, this._values[i]];\n });\n return new ShimIterator(values);\n }\n forEach(callback, context) {\n const keys = this._keys;\n const values = this._values;\n for (let i = 0, length = keys.length; i < length; i++) {\n callback.call(context, values[i], keys[i], this);\n }\n }\n get(key) {\n const index = this._indexOfKey(this._keys, key);\n return index < 0 ? undefined : this._values[index];\n }\n has(key) {\n return this._indexOfKey(this._keys, key) > -1;\n }\n keys() {\n return new ShimIterator(this._keys);\n }\n set(key, value) {\n let index = this._indexOfKey(this._keys, key);\n index = index < 0 ? this._keys.length : index;\n this._keys[index] = key;\n this._values[index] = value;\n return this;\n }\n values() {\n return new ShimIterator(this._values);\n }\n [Symbol.iterator]() {\n return this.entries();\n }\n },\n _a[Symbol.species] = _a,\n _a);\n}\nexport default Map;\nvar _a;\n//# sourceMappingURL=Map.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/Map.mjs\n// module id = ./node_modules/@dojo/framework/shim/Map.mjs\n// module chunks = menu-item","import global from './global';\nimport { queueMicroTask } from './support/queue';\nimport './Symbol';\nimport has from './support/has';\nexport let ShimPromise = global.Promise;\nexport const isThenable = function isThenable(value) {\n return value && typeof value.then === 'function';\n};\nif (!true) {\n global.Promise = ShimPromise = (_a = class Promise {\n /**\n * Creates a new Promise.\n *\n * @constructor\n *\n * @param executor\n * The executor function is called immediately when the Promise is instantiated. It is responsible for\n * starting the asynchronous operation when it is invoked.\n *\n * The executor must call either the passed `resolve` function when the asynchronous operation has completed\n * successfully, or the `reject` function when the operation fails.\n */\n constructor(executor) {\n /**\n * The current state of this promise.\n */\n this.state = 1 /* Pending */;\n this[Symbol.toStringTag] = 'Promise';\n /**\n * If true, the resolution of this promise is chained (\"locked in\") to another promise.\n */\n let isChained = false;\n /**\n * Whether or not this promise is in a resolved state.\n */\n const isResolved = () => {\n return this.state !== 1 /* Pending */ || isChained;\n };\n /**\n * Callbacks that should be invoked once the asynchronous operation has completed.\n */\n let callbacks = [];\n /**\n * Initially pushes callbacks onto a queue for execution once this promise settles. After the promise settles,\n * enqueues callbacks for execution on the next event loop turn.\n */\n let whenFinished = function (callback) {\n if (callbacks) {\n callbacks.push(callback);\n }\n };\n /**\n * Settles this promise.\n *\n * @param newState The resolved state for this promise.\n * @param {T|any} value The resolved value for this promise.\n */\n const settle = (newState, value) => {\n // A promise can only be settled once.\n if (this.state !== 1 /* Pending */) {\n return;\n }\n this.state = newState;\n this.resolvedValue = value;\n whenFinished = queueMicroTask;\n // Only enqueue a callback runner if there are callbacks so that initially fulfilled Promises don't have to\n // wait an extra turn.\n if (callbacks && callbacks.length > 0) {\n queueMicroTask(function () {\n if (callbacks) {\n let count = callbacks.length;\n for (let i = 0; i < count; ++i) {\n callbacks[i].call(null);\n }\n callbacks = null;\n }\n });\n }\n };\n /**\n * Resolves this promise.\n *\n * @param newState The resolved state for this promise.\n * @param {T|any} value The resolved value for this promise.\n */\n const resolve = (newState, value) => {\n if (isResolved()) {\n return;\n }\n if (isThenable(value)) {\n value.then(settle.bind(null, 0 /* Fulfilled */), settle.bind(null, 2 /* Rejected */));\n isChained = true;\n }\n else {\n settle(newState, value);\n }\n };\n this.then = (onFulfilled, onRejected) => {\n return new Promise((resolve, reject) => {\n // whenFinished initially queues up callbacks for execution after the promise has settled. Once the\n // promise has settled, whenFinished will schedule callbacks for execution on the next turn through the\n // event loop.\n whenFinished(() => {\n const callback = this.state === 2 /* Rejected */ ? onRejected : onFulfilled;\n if (typeof callback === 'function') {\n try {\n resolve(callback(this.resolvedValue));\n }\n catch (error) {\n reject(error);\n }\n }\n else if (this.state === 2 /* Rejected */) {\n reject(this.resolvedValue);\n }\n else {\n resolve(this.resolvedValue);\n }\n });\n });\n };\n try {\n executor(resolve.bind(null, 0 /* Fulfilled */), resolve.bind(null, 2 /* Rejected */));\n }\n catch (error) {\n settle(2 /* Rejected */, error);\n }\n }\n static all(iterable) {\n return new this(function (resolve, reject) {\n const values = [];\n let complete = 0;\n let total = 0;\n let populating = true;\n function fulfill(index, value) {\n values[index] = value;\n ++complete;\n finish();\n }\n function finish() {\n if (populating || complete < total) {\n return;\n }\n resolve(values);\n }\n function processItem(index, item) {\n ++total;\n if (isThenable(item)) {\n // If an item Promise rejects, this Promise is immediately rejected with the item\n // Promise's rejection error.\n item.then(fulfill.bind(null, index), reject);\n }\n else {\n Promise.resolve(item).then(fulfill.bind(null, index));\n }\n }\n let i = 0;\n for (const value of iterable) {\n processItem(i, value);\n i++;\n }\n populating = false;\n finish();\n });\n }\n static race(iterable) {\n return new this(function (resolve, reject) {\n for (const item of iterable) {\n if (item instanceof Promise) {\n // If a Promise item rejects, this Promise is immediately rejected with the item\n // Promise's rejection error.\n item.then(resolve, reject);\n }\n else {\n Promise.resolve(item).then(resolve);\n }\n }\n });\n }\n static reject(reason) {\n return new this(function (resolve, reject) {\n reject(reason);\n });\n }\n static resolve(value) {\n return new this(function (resolve) {\n resolve(value);\n });\n }\n catch(onRejected) {\n return this.then(undefined, onRejected);\n }\n },\n _a[Symbol.species] = ShimPromise,\n _a);\n}\nexport default ShimPromise;\nvar _a;\n//# sourceMappingURL=Promise.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/Promise.mjs\n// module id = ./node_modules/@dojo/framework/shim/Promise.mjs\n// module chunks = menu-item","import has from './support/has';\nimport global from './global';\nimport { getValueDescriptor } from './support/util';\nexport let Symbol = global.Symbol;\nif (!true) {\n /**\n * Throws if the value is not a symbol, used internally within the Shim\n * @param {any} value The value to check\n * @return {symbol} Returns the symbol or throws\n */\n const validateSymbol = function validateSymbol(value) {\n if (!isSymbol(value)) {\n throw new TypeError(value + ' is not a symbol');\n }\n return value;\n };\n const defineProperties = Object.defineProperties;\n const defineProperty = Object.defineProperty;\n const create = Object.create;\n const objPrototype = Object.prototype;\n const globalSymbols = {};\n const getSymbolName = (function () {\n const created = create(null);\n return function (desc) {\n let postfix = 0;\n let name;\n while (created[String(desc) + (postfix || '')]) {\n ++postfix;\n }\n desc += String(postfix || '');\n created[desc] = true;\n name = '@@' + desc;\n // FIXME: Temporary guard until the duplicate execution when testing can be\n // pinned down.\n if (!Object.getOwnPropertyDescriptor(objPrototype, name)) {\n defineProperty(objPrototype, name, {\n set: function (value) {\n defineProperty(this, name, getValueDescriptor(value));\n }\n });\n }\n return name;\n };\n })();\n const InternalSymbol = function Symbol(description) {\n if (this instanceof InternalSymbol) {\n throw new TypeError('TypeError: Symbol is not a constructor');\n }\n return Symbol(description);\n };\n Symbol = global.Symbol = function Symbol(description) {\n if (this instanceof Symbol) {\n throw new TypeError('TypeError: Symbol is not a constructor');\n }\n const sym = Object.create(InternalSymbol.prototype);\n description = description === undefined ? '' : String(description);\n return defineProperties(sym, {\n __description__: getValueDescriptor(description),\n __name__: getValueDescriptor(getSymbolName(description))\n });\n };\n /* Decorate the Symbol function with the appropriate properties */\n defineProperty(Symbol, 'for', getValueDescriptor(function (key) {\n if (globalSymbols[key]) {\n return globalSymbols[key];\n }\n return (globalSymbols[key] = Symbol(String(key)));\n }));\n defineProperties(Symbol, {\n keyFor: getValueDescriptor(function (sym) {\n let key;\n validateSymbol(sym);\n for (key in globalSymbols) {\n if (globalSymbols[key] === sym) {\n return key;\n }\n }\n }),\n hasInstance: getValueDescriptor(Symbol.for('hasInstance'), false, false),\n isConcatSpreadable: getValueDescriptor(Symbol.for('isConcatSpreadable'), false, false),\n iterator: getValueDescriptor(Symbol.for('iterator'), false, false),\n match: getValueDescriptor(Symbol.for('match'), false, false),\n observable: getValueDescriptor(Symbol.for('observable'), false, false),\n replace: getValueDescriptor(Symbol.for('replace'), false, false),\n search: getValueDescriptor(Symbol.for('search'), false, false),\n species: getValueDescriptor(Symbol.for('species'), false, false),\n split: getValueDescriptor(Symbol.for('split'), false, false),\n toPrimitive: getValueDescriptor(Symbol.for('toPrimitive'), false, false),\n toStringTag: getValueDescriptor(Symbol.for('toStringTag'), false, false),\n unscopables: getValueDescriptor(Symbol.for('unscopables'), false, false)\n });\n /* Decorate the InternalSymbol object */\n defineProperties(InternalSymbol.prototype, {\n constructor: getValueDescriptor(Symbol),\n toString: getValueDescriptor(function () {\n return this.__name__;\n }, false, false)\n });\n /* Decorate the Symbol.prototype */\n defineProperties(Symbol.prototype, {\n toString: getValueDescriptor(function () {\n return 'Symbol (' + validateSymbol(this).__description__ + ')';\n }),\n valueOf: getValueDescriptor(function () {\n return validateSymbol(this);\n })\n });\n defineProperty(Symbol.prototype, Symbol.toPrimitive, getValueDescriptor(function () {\n return validateSymbol(this);\n }));\n defineProperty(Symbol.prototype, Symbol.toStringTag, getValueDescriptor('Symbol', false, false, true));\n defineProperty(InternalSymbol.prototype, Symbol.toPrimitive, getValueDescriptor(Symbol.prototype[Symbol.toPrimitive], false, false, true));\n defineProperty(InternalSymbol.prototype, Symbol.toStringTag, getValueDescriptor(Symbol.prototype[Symbol.toStringTag], false, false, true));\n}\n/**\n * A custom guard function that determines if an object is a symbol or not\n * @param {any} value The value to check to see if it is a symbol or not\n * @return {is symbol} Returns true if a symbol or not (and narrows the type guard)\n */\nexport function isSymbol(value) {\n return (value && (typeof value === 'symbol' || value['@@toStringTag'] === 'Symbol')) || false;\n}\n/**\n * Fill any missing well known symbols if the native Symbol is missing them\n */\n[\n 'hasInstance',\n 'isConcatSpreadable',\n 'iterator',\n 'species',\n 'replace',\n 'search',\n 'split',\n 'match',\n 'toPrimitive',\n 'toStringTag',\n 'unscopables',\n 'observable'\n].forEach((wellKnown) => {\n if (!Symbol[wellKnown]) {\n Object.defineProperty(Symbol, wellKnown, getValueDescriptor(Symbol.for(wellKnown), false, false));\n }\n});\nexport default Symbol;\n//# sourceMappingURL=Symbol.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/Symbol.mjs\n// module id = ./node_modules/@dojo/framework/shim/Symbol.mjs\n// module chunks = menu-item","import global from './global';\nimport { isArrayLike } from './iterator';\nimport has from './support/has';\nimport './Symbol';\nexport let WeakMap = global.WeakMap;\nif (!true) {\n const DELETED = {};\n const getUID = function getUID() {\n return Math.floor(Math.random() * 100000000);\n };\n const generateName = (function () {\n let startId = Math.floor(Date.now() % 100000000);\n return function generateName() {\n return '__wm' + getUID() + (startId++ + '__');\n };\n })();\n WeakMap = class WeakMap {\n constructor(iterable) {\n this[Symbol.toStringTag] = 'WeakMap';\n this._name = generateName();\n this._frozenEntries = [];\n if (iterable) {\n if (isArrayLike(iterable)) {\n for (let i = 0; i < iterable.length; i++) {\n const item = iterable[i];\n this.set(item[0], item[1]);\n }\n }\n else {\n for (const [key, value] of iterable) {\n this.set(key, value);\n }\n }\n }\n }\n _getFrozenEntryIndex(key) {\n for (let i = 0; i < this._frozenEntries.length; i++) {\n if (this._frozenEntries[i].key === key) {\n return i;\n }\n }\n return -1;\n }\n delete(key) {\n if (key === undefined || key === null) {\n return false;\n }\n const entry = key[this._name];\n if (entry && entry.key === key && entry.value !== DELETED) {\n entry.value = DELETED;\n return true;\n }\n const frozenIndex = this._getFrozenEntryIndex(key);\n if (frozenIndex >= 0) {\n this._frozenEntries.splice(frozenIndex, 1);\n return true;\n }\n return false;\n }\n get(key) {\n if (key === undefined || key === null) {\n return undefined;\n }\n const entry = key[this._name];\n if (entry && entry.key === key && entry.value !== DELETED) {\n return entry.value;\n }\n const frozenIndex = this._getFrozenEntryIndex(key);\n if (frozenIndex >= 0) {\n return this._frozenEntries[frozenIndex].value;\n }\n }\n has(key) {\n if (key === undefined || key === null) {\n return false;\n }\n const entry = key[this._name];\n if (Boolean(entry && entry.key === key && entry.value !== DELETED)) {\n return true;\n }\n const frozenIndex = this._getFrozenEntryIndex(key);\n if (frozenIndex >= 0) {\n return true;\n }\n return false;\n }\n set(key, value) {\n if (!key || (typeof key !== 'object' && typeof key !== 'function')) {\n throw new TypeError('Invalid value used as weak map key');\n }\n let entry = key[this._name];\n if (!entry || entry.key !== key) {\n entry = Object.create(null, {\n key: { value: key }\n });\n if (Object.isFrozen(key)) {\n this._frozenEntries.push(entry);\n }\n else {\n Object.defineProperty(key, this._name, {\n value: entry\n });\n }\n }\n entry.value = value;\n return this;\n }\n };\n}\nexport default WeakMap;\n//# sourceMappingURL=WeakMap.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/WeakMap.mjs\n// module id = ./node_modules/@dojo/framework/shim/WeakMap.mjs\n// module chunks = menu-item","import global from './global';\nimport { isArrayLike, isIterable } from './iterator';\nimport { MAX_SAFE_INTEGER } from './number';\nimport has from './support/has';\nimport { wrapNative } from './support/util';\nexport let from;\n/**\n * Creates a new array from the function parameters.\n *\n * @param arguments Any number of arguments for the array\n * @return An array from the given arguments\n */\nexport let of;\n/* ES6 Array instance methods */\n/**\n * Copies data internally within an array or array-like object.\n *\n * @param target The target array-like object\n * @param offset The index to start copying values to; if negative, it counts backwards from length\n * @param start The first (inclusive) index to copy; if negative, it counts backwards from length\n * @param end The last (exclusive) index to copy; if negative, it counts backwards from length\n * @return The target\n */\nexport let copyWithin;\n/**\n * Fills elements of an array-like object with the specified value.\n *\n * @param target The target to fill\n * @param value The value to fill each element of the target with\n * @param start The first index to fill\n * @param end The (exclusive) index at which to stop filling\n * @return The filled target\n */\nexport let fill;\n/**\n * Finds and returns the first instance matching the callback or undefined if one is not found.\n *\n * @param target An array-like object\n * @param callback A function returning if the current value matches a criteria\n * @param thisArg The execution context for the find function\n * @return The first element matching the callback, or undefined if one does not exist\n */\nexport let find;\n/**\n * Performs a linear search and returns the first index whose value satisfies the passed callback,\n * or -1 if no values satisfy it.\n *\n * @param target An array-like object\n * @param callback A function returning true if the current value satisfies its criteria\n * @param thisArg The execution context for the find function\n * @return The first index whose value satisfies the passed callback, or -1 if no values satisfy it\n */\nexport let findIndex;\n/* ES7 Array instance methods */\n/**\n * Determines whether an array includes a given value\n *\n * @param target the target array-like object\n * @param searchElement the item to search for\n * @param fromIndex the starting index to search from\n * @return `true` if the array includes the element, otherwise `false`\n */\nexport let includes;\nif (true && true) {\n from = global.Array.from;\n of = global.Array.of;\n copyWithin = wrapNative(global.Array.prototype.copyWithin);\n fill = wrapNative(global.Array.prototype.fill);\n find = wrapNative(global.Array.prototype.find);\n findIndex = wrapNative(global.Array.prototype.findIndex);\n}\nelse {\n // It is only older versions of Safari/iOS that have a bad fill implementation and so aren't in the wild\n // To make things easier, if there is a bad fill implementation, the whole set of functions will be filled\n /**\n * Ensures a non-negative, non-infinite, safe integer.\n *\n * @param length The number to validate\n * @return A proper length\n */\n const toLength = function toLength(length) {\n if (isNaN(length)) {\n return 0;\n }\n length = Number(length);\n if (isFinite(length)) {\n length = Math.floor(length);\n }\n // Ensure a non-negative, real, safe integer\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\n };\n /**\n * From ES6 7.1.4 ToInteger()\n *\n * @param value A value to convert\n * @return An integer\n */\n const toInteger = function toInteger(value) {\n value = Number(value);\n if (isNaN(value)) {\n return 0;\n }\n if (value === 0 || !isFinite(value)) {\n return value;\n }\n return (value > 0 ? 1 : -1) * Math.floor(Math.abs(value));\n };\n /**\n * Normalizes an offset against a given length, wrapping it if negative.\n *\n * @param value The original offset\n * @param length The total length to normalize against\n * @return If negative, provide a distance from the end (length); otherwise provide a distance from 0\n */\n const normalizeOffset = function normalizeOffset(value, length) {\n return value < 0 ? Math.max(length + value, 0) : Math.min(value, length);\n };\n from = function from(arrayLike, mapFunction, thisArg) {\n if (arrayLike == null) {\n throw new TypeError('from: requires an array-like object');\n }\n if (mapFunction && thisArg) {\n mapFunction = mapFunction.bind(thisArg);\n }\n /* tslint:disable-next-line:variable-name */\n const Constructor = this;\n const length = toLength(arrayLike.length);\n // Support extension\n const array = typeof Constructor === 'function' ? Object(new Constructor(length)) : new Array(length);\n if (!isArrayLike(arrayLike) && !isIterable(arrayLike)) {\n return array;\n }\n // if this is an array and the normalized length is 0, just return an empty array. this prevents a problem\n // with the iteration on IE when using a NaN array length.\n if (isArrayLike(arrayLike)) {\n if (length === 0) {\n return [];\n }\n for (let i = 0; i < arrayLike.length; i++) {\n array[i] = mapFunction ? mapFunction(arrayLike[i], i) : arrayLike[i];\n }\n }\n else {\n let i = 0;\n for (const value of arrayLike) {\n array[i] = mapFunction ? mapFunction(value, i) : value;\n i++;\n }\n }\n if (arrayLike.length !== undefined) {\n array.length = length;\n }\n return array;\n };\n of = function of(...items) {\n return Array.prototype.slice.call(items);\n };\n copyWithin = function copyWithin(target, offset, start, end) {\n if (target == null) {\n throw new TypeError('copyWithin: target must be an array-like object');\n }\n const length = toLength(target.length);\n offset = normalizeOffset(toInteger(offset), length);\n start = normalizeOffset(toInteger(start), length);\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\n let count = Math.min(end - start, length - offset);\n let direction = 1;\n if (offset > start && offset < start + count) {\n direction = -1;\n start += count - 1;\n offset += count - 1;\n }\n while (count > 0) {\n if (start in target) {\n target[offset] = target[start];\n }\n else {\n delete target[offset];\n }\n offset += direction;\n start += direction;\n count--;\n }\n return target;\n };\n fill = function fill(target, value, start, end) {\n const length = toLength(target.length);\n let i = normalizeOffset(toInteger(start), length);\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\n while (i < end) {\n target[i++] = value;\n }\n return target;\n };\n find = function find(target, callback, thisArg) {\n const index = findIndex(target, callback, thisArg);\n return index !== -1 ? target[index] : undefined;\n };\n findIndex = function findIndex(target, callback, thisArg) {\n const length = toLength(target.length);\n if (!callback) {\n throw new TypeError('find: second argument must be a function');\n }\n if (thisArg) {\n callback = callback.bind(thisArg);\n }\n for (let i = 0; i < length; i++) {\n if (callback(target[i], i, target)) {\n return i;\n }\n }\n return -1;\n };\n}\nif (true) {\n includes = wrapNative(global.Array.prototype.includes);\n}\nelse {\n /**\n * Ensures a non-negative, non-infinite, safe integer.\n *\n * @param length The number to validate\n * @return A proper length\n */\n const toLength = function toLength(length) {\n length = Number(length);\n if (isNaN(length)) {\n return 0;\n }\n if (isFinite(length)) {\n length = Math.floor(length);\n }\n // Ensure a non-negative, real, safe integer\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\n };\n includes = function includes(target, searchElement, fromIndex = 0) {\n let len = toLength(target.length);\n for (let i = fromIndex; i < len; ++i) {\n const currentElement = target[i];\n if (searchElement === currentElement ||\n (searchElement !== searchElement && currentElement !== currentElement)) {\n return true;\n }\n }\n return false;\n };\n}\n//# sourceMappingURL=array.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/array.mjs\n// module id = ./node_modules/@dojo/framework/shim/array.mjs\n// module chunks = menu-item","const globalObject = (function () {\n if (typeof global !== 'undefined') {\n // global spec defines a reference to the global object called 'global'\n // https://github.com/tc39/proposal-global\n // `global` is also defined in NodeJS\n return global;\n }\n else if (typeof window !== 'undefined') {\n // window is defined in browsers\n return window;\n }\n else if (typeof self !== 'undefined') {\n // self is defined in WebWorkers\n return self;\n }\n})();\nexport default globalObject;\n//# sourceMappingURL=global.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/global.mjs\n// module id = ./node_modules/@dojo/framework/shim/global.mjs\n// module chunks = menu-item","import global from './global';\n/**\n * The smallest interval between two representable numbers.\n */\nexport const EPSILON = 1;\n/**\n * The maximum safe integer in JavaScript\n */\nexport const MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n/**\n * The minimum safe integer in JavaScript\n */\nexport const MIN_SAFE_INTEGER = -MAX_SAFE_INTEGER;\n/**\n * Determines whether the passed value is NaN without coersion.\n *\n * @param value The value to test\n * @return true if the value is NaN, false if it is not\n */\nexport function isNaN(value) {\n return typeof value === 'number' && global.isNaN(value);\n}\n/**\n * Determines whether the passed value is a finite number without coersion.\n *\n * @param value The value to test\n * @return true if the value is finite, false if it is not\n */\nexport function isFinite(value) {\n return typeof value === 'number' && global.isFinite(value);\n}\n/**\n * Determines whether the passed value is an integer.\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isInteger(value) {\n return isFinite(value) && Math.floor(value) === value;\n}\n/**\n * Determines whether the passed value is an integer that is 'safe,' meaning:\n * 1. it can be expressed as an IEEE-754 double precision number\n * 2. it has a one-to-one mapping to a mathematical integer, meaning its\n * IEEE-754 representation cannot be the result of rounding any other\n * integer to fit the IEEE-754 representation\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isSafeInteger(value) {\n return isInteger(value) && Math.abs(value) <= MAX_SAFE_INTEGER;\n}\n//# sourceMappingURL=number.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/number.mjs\n// module id = ./node_modules/@dojo/framework/shim/number.mjs\n// module chunks = menu-item","import global from './global';\nimport has from './support/has';\nimport { isSymbol } from './Symbol';\nexport let assign;\n/**\n * Gets the own property descriptor of the specified object.\n * An own property descriptor is one that is defined directly on the object and is not\n * inherited from the object's prototype.\n * @param o Object that contains the property.\n * @param p Name of the property.\n */\nexport let getOwnPropertyDescriptor;\n/**\n * Returns the names of the own properties of an object. The own properties of an object are those that are defined directly\n * on that object, and are not inherited from the object's prototype. The properties of an object include both fields (objects) and functions.\n * @param o Object that contains the own properties.\n */\nexport let getOwnPropertyNames;\n/**\n * Returns an array of all symbol properties found directly on object o.\n * @param o Object to retrieve the symbols from.\n */\nexport let getOwnPropertySymbols;\n/**\n * Returns true if the values are the same value, false otherwise.\n * @param value1 The first value.\n * @param value2 The second value.\n */\nexport let is;\n/**\n * Returns the names of the enumerable properties and methods of an object.\n * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.\n */\nexport let keys;\n/* ES7 Object static methods */\nexport let getOwnPropertyDescriptors;\nexport let entries;\nexport let values;\nif (true) {\n const globalObject = global.Object;\n assign = globalObject.assign;\n getOwnPropertyDescriptor = globalObject.getOwnPropertyDescriptor;\n getOwnPropertyNames = globalObject.getOwnPropertyNames;\n getOwnPropertySymbols = globalObject.getOwnPropertySymbols;\n is = globalObject.is;\n keys = globalObject.keys;\n}\nelse {\n keys = function symbolAwareKeys(o) {\n return Object.keys(o).filter((key) => !Boolean(key.match(/^@@.+/)));\n };\n assign = function assign(target, ...sources) {\n if (target == null) {\n // TypeError if undefined or null\n throw new TypeError('Cannot convert undefined or null to object');\n }\n const to = Object(target);\n sources.forEach((nextSource) => {\n if (nextSource) {\n // Skip over if undefined or null\n keys(nextSource).forEach((nextKey) => {\n to[nextKey] = nextSource[nextKey];\n });\n }\n });\n return to;\n };\n getOwnPropertyDescriptor = function getOwnPropertyDescriptor(o, prop) {\n if (isSymbol(prop)) {\n return Object.getOwnPropertyDescriptor(o, prop);\n }\n else {\n return Object.getOwnPropertyDescriptor(o, prop);\n }\n };\n getOwnPropertyNames = function getOwnPropertyNames(o) {\n return Object.getOwnPropertyNames(o).filter((key) => !Boolean(key.match(/^@@.+/)));\n };\n getOwnPropertySymbols = function getOwnPropertySymbols(o) {\n return Object.getOwnPropertyNames(o)\n .filter((key) => Boolean(key.match(/^@@.+/)))\n .map((key) => Symbol.for(key.substring(2)));\n };\n is = function is(value1, value2) {\n if (value1 === value2) {\n return value1 !== 0 || 1 / value1 === 1 / value2; // -0\n }\n return value1 !== value1 && value2 !== value2; // NaN\n };\n}\nif (true) {\n const globalObject = global.Object;\n getOwnPropertyDescriptors = globalObject.getOwnPropertyDescriptors;\n entries = globalObject.entries;\n values = globalObject.values;\n}\nelse {\n getOwnPropertyDescriptors = function getOwnPropertyDescriptors(o) {\n return getOwnPropertyNames(o).reduce((previous, key) => {\n previous[key] = getOwnPropertyDescriptor(o, key);\n return previous;\n }, {});\n };\n entries = function entries(o) {\n return keys(o).map((key) => [key, o[key]]);\n };\n values = function values(o) {\n return keys(o).map((key) => o[key]);\n };\n}\n//# sourceMappingURL=object.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/object.mjs\n// module id = ./node_modules/@dojo/framework/shim/object.mjs\n// module chunks = menu-item","import global from './global';\nimport has from './support/has';\nimport { wrapNative } from './support/util';\n/**\n * The minimum location of high surrogates\n */\nexport const HIGH_SURROGATE_MIN = 0xd800;\n/**\n * The maximum location of high surrogates\n */\nexport const HIGH_SURROGATE_MAX = 0xdbff;\n/**\n * The minimum location of low surrogates\n */\nexport const LOW_SURROGATE_MIN = 0xdc00;\n/**\n * The maximum location of low surrogates\n */\nexport const LOW_SURROGATE_MAX = 0xdfff;\n/* ES6 static methods */\n/**\n * Return the String value whose elements are, in order, the elements in the List elements.\n * If length is 0, the empty string is returned.\n * @param codePoints The code points to generate the string\n */\nexport let fromCodePoint;\n/**\n * `raw` is intended for use as a tag function of a Tagged Template String. When called\n * as such the first argument will be a well formed template call site object and the rest\n * parameter will contain the substitution values.\n * @param template A well-formed template string call site representation.\n * @param substitutions A set of substitution values.\n */\nexport let raw;\n/* ES6 instance methods */\n/**\n * Returns a nonnegative integer Number less than 1114112 (0x110000) that is the code point\n * value of the UTF-16 encoded code point starting at the string element at position pos in\n * the String resulting from converting this object to a String.\n * If there is no element at that position, the result is undefined.\n * If a valid UTF-16 surrogate pair does not begin at pos, the result is the code unit at pos.\n */\nexport let codePointAt;\n/**\n * Returns true if the sequence of elements of searchString converted to a String is the\n * same as the corresponding elements of this object (converted to a String) starting at\n * endPosition – length(this). Otherwise returns false.\n */\nexport let endsWith;\n/**\n * Returns true if searchString appears as a substring of the result of converting this\n * object to a String, at one or more positions that are\n * greater than or equal to position; otherwise, returns false.\n * @param target The target string\n * @param searchString search string\n * @param position If position is undefined, 0 is assumed, so as to search all of the String.\n */\nexport let includes;\n/**\n * Returns the String value result of normalizing the string into the normalization form\n * named by form as specified in Unicode Standard Annex #15, Unicode Normalization Forms.\n * @param target The target string\n * @param form Applicable values: \"NFC\", \"NFD\", \"NFKC\", or \"NFKD\", If not specified default\n * is \"NFC\"\n */\nexport let normalize;\n/**\n * Returns a String value that is made from count copies appended together. If count is 0,\n * T is the empty String is returned.\n * @param count number of copies to append\n */\nexport let repeat;\n/**\n * Returns true if the sequence of elements of searchString converted to a String is the\n * same as the corresponding elements of this object (converted to a String) starting at\n * position. Otherwise returns false.\n */\nexport let startsWith;\n/* ES7 instance methods */\n/**\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\n * The padding is applied from the end (right) of the current string.\n *\n * @param target The target string\n * @param maxLength The length of the resulting string once the current string has been padded.\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\n *\n * @param fillString The string to pad the current string with.\n * If this string is too long, it will be truncated and the left-most part will be applied.\n * The default value for this parameter is \" \" (U+0020).\n */\nexport let padEnd;\n/**\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\n * The padding is applied from the start (left) of the current string.\n *\n * @param target The target string\n * @param maxLength The length of the resulting string once the current string has been padded.\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\n *\n * @param fillString The string to pad the current string with.\n * If this string is too long, it will be truncated and the left-most part will be applied.\n * The default value for this parameter is \" \" (U+0020).\n */\nexport let padStart;\nif (true && true) {\n fromCodePoint = global.String.fromCodePoint;\n raw = global.String.raw;\n codePointAt = wrapNative(global.String.prototype.codePointAt);\n endsWith = wrapNative(global.String.prototype.endsWith);\n includes = wrapNative(global.String.prototype.includes);\n normalize = wrapNative(global.String.prototype.normalize);\n repeat = wrapNative(global.String.prototype.repeat);\n startsWith = wrapNative(global.String.prototype.startsWith);\n}\nelse {\n /**\n * Validates that text is defined, and normalizes position (based on the given default if the input is NaN).\n * Used by startsWith, includes, and endsWith.\n *\n * @return Normalized position.\n */\n const normalizeSubstringArgs = function (name, text, search, position, isEnd = false) {\n if (text == null) {\n throw new TypeError('string.' + name + ' requires a valid string to search against.');\n }\n const length = text.length;\n position = position !== position ? (isEnd ? length : 0) : position;\n return [text, String(search), Math.min(Math.max(position, 0), length)];\n };\n fromCodePoint = function fromCodePoint(...codePoints) {\n // Adapted from https://github.com/mathiasbynens/String.fromCodePoint\n const length = arguments.length;\n if (!length) {\n return '';\n }\n const fromCharCode = String.fromCharCode;\n const MAX_SIZE = 0x4000;\n let codeUnits = [];\n let index = -1;\n let result = '';\n while (++index < length) {\n let codePoint = Number(arguments[index]);\n // Code points must be finite integers within the valid range\n let isValid = isFinite(codePoint) && Math.floor(codePoint) === codePoint && codePoint >= 0 && codePoint <= 0x10ffff;\n if (!isValid) {\n throw RangeError('string.fromCodePoint: Invalid code point ' + codePoint);\n }\n if (codePoint <= 0xffff) {\n // BMP code point\n codeUnits.push(codePoint);\n }\n else {\n // Astral code point; split in surrogate halves\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n codePoint -= 0x10000;\n let highSurrogate = (codePoint >> 10) + HIGH_SURROGATE_MIN;\n let lowSurrogate = codePoint % 0x400 + LOW_SURROGATE_MIN;\n codeUnits.push(highSurrogate, lowSurrogate);\n }\n if (index + 1 === length || codeUnits.length > MAX_SIZE) {\n result += fromCharCode.apply(null, codeUnits);\n codeUnits.length = 0;\n }\n }\n return result;\n };\n raw = function raw(callSite, ...substitutions) {\n let rawStrings = callSite.raw;\n let result = '';\n let numSubstitutions = substitutions.length;\n if (callSite == null || callSite.raw == null) {\n throw new TypeError('string.raw requires a valid callSite object with a raw value');\n }\n for (let i = 0, length = rawStrings.length; i < length; i++) {\n result += rawStrings[i] + (i < numSubstitutions && i < length - 1 ? substitutions[i] : '');\n }\n return result;\n };\n codePointAt = function codePointAt(text, position = 0) {\n // Adapted from https://github.com/mathiasbynens/String.prototype.codePointAt\n if (text == null) {\n throw new TypeError('string.codePointAt requries a valid string.');\n }\n const length = text.length;\n if (position !== position) {\n position = 0;\n }\n if (position < 0 || position >= length) {\n return undefined;\n }\n // Get the first code unit\n const first = text.charCodeAt(position);\n if (first >= HIGH_SURROGATE_MIN && first <= HIGH_SURROGATE_MAX && length > position + 1) {\n // Start of a surrogate pair (high surrogate and there is a next code unit); check for low surrogate\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n const second = text.charCodeAt(position + 1);\n if (second >= LOW_SURROGATE_MIN && second <= LOW_SURROGATE_MAX) {\n return (first - HIGH_SURROGATE_MIN) * 0x400 + second - LOW_SURROGATE_MIN + 0x10000;\n }\n }\n return first;\n };\n endsWith = function endsWith(text, search, endPosition) {\n if (endPosition == null) {\n endPosition = text.length;\n }\n [text, search, endPosition] = normalizeSubstringArgs('endsWith', text, search, endPosition, true);\n const start = endPosition - search.length;\n if (start < 0) {\n return false;\n }\n return text.slice(start, endPosition) === search;\n };\n includes = function includes(text, search, position = 0) {\n [text, search, position] = normalizeSubstringArgs('includes', text, search, position);\n return text.indexOf(search, position) !== -1;\n };\n repeat = function repeat(text, count = 0) {\n // Adapted from https://github.com/mathiasbynens/String.prototype.repeat\n if (text == null) {\n throw new TypeError('string.repeat requires a valid string.');\n }\n if (count !== count) {\n count = 0;\n }\n if (count < 0 || count === Infinity) {\n throw new RangeError('string.repeat requires a non-negative finite count.');\n }\n let result = '';\n while (count) {\n if (count % 2) {\n result += text;\n }\n if (count > 1) {\n text += text;\n }\n count >>= 1;\n }\n return result;\n };\n startsWith = function startsWith(text, search, position = 0) {\n search = String(search);\n [text, search, position] = normalizeSubstringArgs('startsWith', text, search, position);\n const end = position + search.length;\n if (end > text.length) {\n return false;\n }\n return text.slice(position, end) === search;\n };\n}\nif (true) {\n padEnd = wrapNative(global.String.prototype.padEnd);\n padStart = wrapNative(global.String.prototype.padStart);\n}\nelse {\n padEnd = function padEnd(text, maxLength, fillString = ' ') {\n if (text === null || text === undefined) {\n throw new TypeError('string.repeat requires a valid string.');\n }\n if (maxLength === Infinity) {\n throw new RangeError('string.padEnd requires a non-negative finite count.');\n }\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\n maxLength = 0;\n }\n let strText = String(text);\n const padding = maxLength - strText.length;\n if (padding > 0) {\n strText +=\n repeat(fillString, Math.floor(padding / fillString.length)) +\n fillString.slice(0, padding % fillString.length);\n }\n return strText;\n };\n padStart = function padStart(text, maxLength, fillString = ' ') {\n if (text === null || text === undefined) {\n throw new TypeError('string.repeat requires a valid string.');\n }\n if (maxLength === Infinity) {\n throw new RangeError('string.padStart requires a non-negative finite count.');\n }\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\n maxLength = 0;\n }\n let strText = String(text);\n const padding = maxLength - strText.length;\n if (padding > 0) {\n strText =\n repeat(fillString, Math.floor(padding / fillString.length)) +\n fillString.slice(0, padding % fillString.length) +\n strText;\n }\n return strText;\n };\n}\n//# sourceMappingURL=string.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/string.mjs\n// module id = ./node_modules/@dojo/framework/shim/string.mjs\n// module chunks = menu-item","import has, { add } from '../../has/has';\nimport global from '../global';\nexport default has;\nexport * from '../../has/has';\n/* ECMAScript 6 and 7 Features */\n/* Array */\nadd('es6-array', () => {\n return (['from', 'of'].every((key) => key in global.Array) &&\n ['findIndex', 'find', 'copyWithin'].every((key) => key in global.Array.prototype));\n}, true);\nadd('es6-array-fill', () => {\n if ('fill' in global.Array.prototype) {\n /* Some versions of Safari do not properly implement this */\n return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1;\n }\n return false;\n}, true);\nadd('es7-array', () => 'includes' in global.Array.prototype, true);\n/* Map */\nadd('es6-map', () => {\n if (typeof global.Map === 'function') {\n /*\n IE11 and older versions of Safari are missing critical ES6 Map functionality\n We wrap this in a try/catch because sometimes the Map constructor exists, but does not\n take arguments (iOS 8.4)\n */\n try {\n const map = new global.Map([[0, 1]]);\n return map.has(0) &&\n typeof map.keys === 'function' &&\n true &&\n typeof map.values === 'function' &&\n typeof map.entries === 'function';\n }\n catch (e) {\n /* istanbul ignore next: not testing on iOS at the moment */\n return false;\n }\n }\n return false;\n}, true);\n/* Math */\nadd('es6-math', () => {\n return [\n 'clz32',\n 'sign',\n 'log10',\n 'log2',\n 'log1p',\n 'expm1',\n 'cosh',\n 'sinh',\n 'tanh',\n 'acosh',\n 'asinh',\n 'atanh',\n 'trunc',\n 'fround',\n 'cbrt',\n 'hypot'\n ].every((name) => typeof global.Math[name] === 'function');\n}, true);\nadd('es6-math-imul', () => {\n if ('imul' in global.Math) {\n /* Some versions of Safari on ios do not properly implement this */\n return Math.imul(0xffffffff, 5) === -5;\n }\n return false;\n}, true);\n/* Object */\nadd('es6-object', () => {\n return true &&\n ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof global.Object[name] === 'function');\n}, true);\nadd('es2017-object', () => {\n return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof global.Object[name] === 'function');\n}, true);\n/* Observable */\nadd('es-observable', () => typeof global.Observable !== 'undefined', true);\n/* Promise */\nadd('es6-promise', () => typeof global.Promise !== 'undefined' && true, true);\n/* Set */\nadd('es6-set', () => {\n if (typeof global.Set === 'function') {\n /* IE11 and older versions of Safari are missing critical ES6 Set functionality */\n const set = new global.Set([1]);\n return set.has(1) && 'keys' in set && typeof set.keys === 'function' && true;\n }\n return false;\n}, true);\n/* String */\nadd('es6-string', () => {\n return ([\n /* static methods */\n 'fromCodePoint'\n ].every((key) => typeof global.String[key] === 'function') &&\n [\n /* instance methods */\n 'codePointAt',\n 'normalize',\n 'repeat',\n 'startsWith',\n 'endsWith',\n 'includes'\n ].every((key) => typeof global.String.prototype[key] === 'function'));\n}, true);\nadd('es6-string-raw', () => {\n function getCallSite(callSite, ...substitutions) {\n const result = [...callSite];\n result.raw = callSite.raw;\n return result;\n }\n if ('raw' in global.String) {\n let b = 1;\n let callSite = getCallSite `a\\n${b}`;\n callSite.raw = ['a\\\\n'];\n const supportsTrunc = global.String.raw(callSite, 42) === 'a:\\\\n';\n return supportsTrunc;\n }\n return false;\n}, true);\nadd('es2017-string', () => {\n return ['padStart', 'padEnd'].every((key) => typeof global.String.prototype[key] === 'function');\n}, true);\n/* Symbol */\nadd('es6-symbol', () => typeof global.Symbol !== 'undefined' && typeof Symbol() === 'symbol', true);\n/* WeakMap */\nadd('es6-weakmap', () => {\n if (typeof global.WeakMap !== 'undefined') {\n /* IE11 and older versions of Safari are missing critical ES6 Map functionality */\n const key1 = {};\n const key2 = {};\n const map = new global.WeakMap([[key1, 1]]);\n Object.freeze(key1);\n return map.get(key1) === 1 && map.set(key2, 2) === map && true;\n }\n return false;\n}, true);\n/* Miscellaneous features */\nadd('microtasks', () => true || false || true, true);\nadd('postmessage', () => {\n // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have\n // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist.\n return typeof global.window !== 'undefined' && typeof global.postMessage === 'function';\n}, true);\nadd('raf', () => typeof global.requestAnimationFrame === 'function', true);\nadd('setimmediate', () => typeof global.setImmediate !== 'undefined', true);\n/* DOM Features */\nadd('dom-mutationobserver', () => {\n if (true && Boolean(global.MutationObserver || global.WebKitMutationObserver)) {\n // IE11 has an unreliable MutationObserver implementation where setProperty() does not\n // generate a mutation event, observers can crash, and the queue does not drain\n // reliably. The following feature test was adapted from\n // https://gist.github.com/t10ko/4aceb8c71681fdb275e33efe5e576b14\n const example = document.createElement('div');\n /* tslint:disable-next-line:variable-name */\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\n const observer = new HostMutationObserver(function () { });\n observer.observe(example, { attributes: true });\n example.style.setProperty('display', 'block');\n return Boolean(observer.takeRecords().length);\n }\n return false;\n}, true);\nadd('dom-webanimation', () => true && global.Animation !== undefined && global.KeyframeEffect !== undefined, true);\n//# sourceMappingURL=has.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/support/has.mjs\n// module id = ./node_modules/@dojo/framework/shim/support/has.mjs\n// module chunks = menu-item","import global from '../global';\nimport has from './has';\nfunction executeTask(item) {\n if (item && item.isActive && item.callback) {\n item.callback();\n }\n}\nfunction getQueueHandle(item, destructor) {\n return {\n destroy: function () {\n this.destroy = function () { };\n item.isActive = false;\n item.callback = null;\n if (destructor) {\n destructor();\n }\n }\n };\n}\nlet checkMicroTaskQueue;\nlet microTasks;\n/**\n * Schedules a callback to the macrotask queue.\n *\n * @param callback the function to be queued and later executed.\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\n */\nexport const queueTask = (function () {\n let destructor;\n let enqueue;\n // Since the IE implementation of `setImmediate` is not flawless, we will test for `postMessage` first.\n if (true) {\n const queue = [];\n global.addEventListener('message', function (event) {\n // Confirm that the event was triggered by the current window and by this particular implementation.\n if (event.source === global && event.data === 'dojo-queue-message') {\n event.stopPropagation();\n if (queue.length) {\n executeTask(queue.shift());\n }\n }\n });\n enqueue = function (item) {\n queue.push(item);\n global.postMessage('dojo-queue-message', '*');\n };\n }\n else if (false) {\n destructor = global.clearImmediate;\n enqueue = function (item) {\n return setImmediate(executeTask.bind(null, item));\n };\n }\n else {\n destructor = global.clearTimeout;\n enqueue = function (item) {\n return setTimeout(executeTask.bind(null, item), 0);\n };\n }\n function queueTask(callback) {\n const item = {\n isActive: true,\n callback: callback\n };\n const id = enqueue(item);\n return getQueueHandle(item, destructor &&\n function () {\n destructor(id);\n });\n }\n // TODO: Use aspect.before when it is available.\n return true\n ? queueTask\n : function (callback) {\n checkMicroTaskQueue();\n return queueTask(callback);\n };\n})();\n// When no mechanism for registering microtasks is exposed by the environment, microtasks will\n// be queued and then executed in a single macrotask before the other macrotasks are executed.\nif (!true) {\n let isMicroTaskQueued = false;\n microTasks = [];\n checkMicroTaskQueue = function () {\n if (!isMicroTaskQueued) {\n isMicroTaskQueued = true;\n queueTask(function () {\n isMicroTaskQueued = false;\n if (microTasks.length) {\n let item;\n while ((item = microTasks.shift())) {\n executeTask(item);\n }\n }\n });\n }\n };\n}\n/**\n * Schedules an animation task with `window.requestAnimationFrame` if it exists, or with `queueTask` otherwise.\n *\n * Since requestAnimationFrame's behavior does not match that expected from `queueTask`, it is not used there.\n * However, at times it makes more sense to delegate to requestAnimationFrame; hence the following method.\n *\n * @param callback the function to be queued and later executed.\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\n */\nexport const queueAnimationTask = (function () {\n if (!true) {\n return queueTask;\n }\n function queueAnimationTask(callback) {\n const item = {\n isActive: true,\n callback: callback\n };\n const rafId = requestAnimationFrame(executeTask.bind(null, item));\n return getQueueHandle(item, function () {\n cancelAnimationFrame(rafId);\n });\n }\n // TODO: Use aspect.before when it is available.\n return true\n ? queueAnimationTask\n : function (callback) {\n checkMicroTaskQueue();\n return queueAnimationTask(callback);\n };\n})();\n/**\n * Schedules a callback to the microtask queue.\n *\n * Any callbacks registered with `queueMicroTask` will be executed before the next macrotask. If no native\n * mechanism for scheduling macrotasks is exposed, then any callbacks will be fired before any macrotask\n * registered with `queueTask` or `queueAnimationTask`.\n *\n * @param callback the function to be queued and later executed.\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\n */\nexport let queueMicroTask = (function () {\n let enqueue;\n if (false) {\n enqueue = function (item) {\n global.process.nextTick(executeTask.bind(null, item));\n };\n }\n else if (true) {\n enqueue = function (item) {\n global.Promise.resolve(item).then(executeTask);\n };\n }\n else if (true) {\n /* tslint:disable-next-line:variable-name */\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\n const node = document.createElement('div');\n const queue = [];\n const observer = new HostMutationObserver(function () {\n while (queue.length > 0) {\n const item = queue.shift();\n if (item && item.isActive && item.callback) {\n item.callback();\n }\n }\n });\n observer.observe(node, { attributes: true });\n enqueue = function (item) {\n queue.push(item);\n node.setAttribute('queueStatus', '1');\n };\n }\n else {\n enqueue = function (item) {\n checkMicroTaskQueue();\n microTasks.push(item);\n };\n }\n return function (callback) {\n const item = {\n isActive: true,\n callback: callback\n };\n enqueue(item);\n return getQueueHandle(item);\n };\n})();\n//# sourceMappingURL=queue.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/support/queue.mjs\n// module id = ./node_modules/@dojo/framework/shim/support/queue.mjs\n// module chunks = menu-item","/**\n * Helper function to generate a value property descriptor\n *\n * @param value The value the property descriptor should be set to\n * @param enumerable If the property should be enumberable, defaults to false\n * @param writable If the property should be writable, defaults to true\n * @param configurable If the property should be configurable, defaults to true\n * @return The property descriptor object\n */\nexport function getValueDescriptor(value, enumerable = false, writable = true, configurable = true) {\n return {\n value: value,\n enumerable: enumerable,\n writable: writable,\n configurable: configurable\n };\n}\nexport function wrapNative(nativeFunction) {\n return function (target, ...args) {\n return nativeFunction.apply(target, args);\n };\n}\n//# sourceMappingURL=util.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/support/util.mjs\n// module id = ./node_modules/@dojo/framework/shim/support/util.mjs\n// module chunks = menu-item","import { Evented } from '../core/Evented';\nexport class Injector extends Evented {\n constructor(payload) {\n super();\n this._payload = payload;\n }\n setInvalidator(invalidator) {\n this._invalidator = invalidator;\n }\n get() {\n return this._payload;\n }\n set(payload) {\n this._payload = payload;\n if (this._invalidator) {\n this._invalidator();\n }\n }\n}\nexport default Injector;\n//# sourceMappingURL=Injector.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/Injector.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/Injector.mjs\n// module chunks = menu-item","import { Evented } from '../core/Evented';\nimport Map from '../shim/Map';\n/**\n * Enum to identify the type of event.\n * Listening to 'Projector' will notify when projector is created or updated\n * Listening to 'Widget' will notify when widget root is created or updated\n */\nexport var NodeEventType;\n(function (NodeEventType) {\n NodeEventType[\"Projector\"] = \"Projector\";\n NodeEventType[\"Widget\"] = \"Widget\";\n})(NodeEventType || (NodeEventType = {}));\nexport class NodeHandler extends Evented {\n constructor() {\n super(...arguments);\n this._nodeMap = new Map();\n }\n get(key) {\n return this._nodeMap.get(key);\n }\n has(key) {\n return this._nodeMap.has(key);\n }\n add(element, key) {\n this._nodeMap.set(key, element);\n this.emit({ type: key });\n }\n addRoot() {\n this.emit({ type: NodeEventType.Widget });\n }\n addProjector() {\n this.emit({ type: NodeEventType.Projector });\n }\n clear() {\n this._nodeMap.clear();\n }\n}\nexport default NodeHandler;\n//# sourceMappingURL=NodeHandler.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/NodeHandler.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/NodeHandler.mjs\n// module chunks = menu-item","import Promise from '../shim/Promise';\nimport Map from '../shim/Map';\nimport Symbol from '../shim/Symbol';\nimport { Evented } from '../core/Evented';\n/**\n * Widget base symbol type\n */\nexport const WIDGET_BASE_TYPE = Symbol('Widget Base');\n/**\n * Checks is the item is a subclass of WidgetBase (or a WidgetBase)\n *\n * @param item the item to check\n * @returns true/false indicating if the item is a WidgetBaseConstructor\n */\nexport function isWidgetBaseConstructor(item) {\n return Boolean(item && item._type === WIDGET_BASE_TYPE);\n}\nexport function isWidgetConstructorDefaultExport(item) {\n return Boolean(item &&\n item.hasOwnProperty('__esModule') &&\n item.hasOwnProperty('default') &&\n isWidgetBaseConstructor(item.default));\n}\n/**\n * The Registry implementation\n */\nexport class Registry extends Evented {\n /**\n * Emit loaded event for registry label\n */\n emitLoadedEvent(widgetLabel, item) {\n this.emit({\n type: widgetLabel,\n action: 'loaded',\n item\n });\n }\n define(label, item) {\n if (this._widgetRegistry === undefined) {\n this._widgetRegistry = new Map();\n }\n if (this._widgetRegistry.has(label)) {\n throw new Error(`widget has already been registered for '${label.toString()}'`);\n }\n this._widgetRegistry.set(label, item);\n if (item instanceof Promise) {\n item.then((widgetCtor) => {\n this._widgetRegistry.set(label, widgetCtor);\n this.emitLoadedEvent(label, widgetCtor);\n return widgetCtor;\n }, (error) => {\n throw error;\n });\n }\n else if (isWidgetBaseConstructor(item)) {\n this.emitLoadedEvent(label, item);\n }\n }\n defineInjector(label, injectorFactory) {\n if (this._injectorRegistry === undefined) {\n this._injectorRegistry = new Map();\n }\n if (this._injectorRegistry.has(label)) {\n throw new Error(`injector has already been registered for '${label.toString()}'`);\n }\n const invalidator = new Evented();\n const injectorItem = {\n injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })),\n invalidator\n };\n this._injectorRegistry.set(label, injectorItem);\n this.emitLoadedEvent(label, injectorItem);\n }\n get(label) {\n if (!this._widgetRegistry || !this.has(label)) {\n return null;\n }\n const item = this._widgetRegistry.get(label);\n if (isWidgetBaseConstructor(item)) {\n return item;\n }\n if (item instanceof Promise) {\n return null;\n }\n const promise = item();\n this._widgetRegistry.set(label, promise);\n promise.then((widgetCtor) => {\n if (isWidgetConstructorDefaultExport(widgetCtor)) {\n widgetCtor = widgetCtor.default;\n }\n this._widgetRegistry.set(label, widgetCtor);\n this.emitLoadedEvent(label, widgetCtor);\n return widgetCtor;\n }, (error) => {\n throw error;\n });\n return null;\n }\n getInjector(label) {\n if (!this._injectorRegistry || !this.hasInjector(label)) {\n return null;\n }\n return this._injectorRegistry.get(label);\n }\n has(label) {\n return Boolean(this._widgetRegistry && this._widgetRegistry.has(label));\n }\n hasInjector(label) {\n return Boolean(this._injectorRegistry && this._injectorRegistry.has(label));\n }\n}\nexport default Registry;\n//# sourceMappingURL=Registry.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/Registry.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/Registry.mjs\n// module chunks = menu-item","import { Map } from '../shim/Map';\nimport { Evented } from '../core/Evented';\nimport { Registry } from './Registry';\nexport class RegistryHandler extends Evented {\n constructor() {\n super();\n this._registry = new Registry();\n this._registryWidgetLabelMap = new Map();\n this._registryInjectorLabelMap = new Map();\n this.own(this._registry);\n const destroy = () => {\n if (this.baseRegistry) {\n this._registryWidgetLabelMap.delete(this.baseRegistry);\n this._registryInjectorLabelMap.delete(this.baseRegistry);\n this.baseRegistry = undefined;\n }\n };\n this.own({ destroy });\n }\n set base(baseRegistry) {\n if (this.baseRegistry) {\n this._registryWidgetLabelMap.delete(this.baseRegistry);\n this._registryInjectorLabelMap.delete(this.baseRegistry);\n }\n this.baseRegistry = baseRegistry;\n }\n define(label, widget) {\n this._registry.define(label, widget);\n }\n defineInjector(label, injector) {\n this._registry.defineInjector(label, injector);\n }\n has(label) {\n return this._registry.has(label) || Boolean(this.baseRegistry && this.baseRegistry.has(label));\n }\n hasInjector(label) {\n return this._registry.hasInjector(label) || Boolean(this.baseRegistry && this.baseRegistry.hasInjector(label));\n }\n get(label, globalPrecedence = false) {\n return this._get(label, globalPrecedence, 'get', this._registryWidgetLabelMap);\n }\n getInjector(label, globalPrecedence = false) {\n return this._get(label, globalPrecedence, 'getInjector', this._registryInjectorLabelMap);\n }\n _get(label, globalPrecedence, getFunctionName, labelMap) {\n const registries = globalPrecedence ? [this.baseRegistry, this._registry] : [this._registry, this.baseRegistry];\n for (let i = 0; i < registries.length; i++) {\n const registry = registries[i];\n if (!registry) {\n continue;\n }\n const item = registry[getFunctionName](label);\n const registeredLabels = labelMap.get(registry) || [];\n if (item) {\n return item;\n }\n else if (registeredLabels.indexOf(label) === -1) {\n const handle = registry.on(label, (event) => {\n if (event.action === 'loaded' &&\n this[getFunctionName](label, globalPrecedence) === event.item) {\n this.emit({ type: 'invalidate' });\n }\n });\n this.own(handle);\n labelMap.set(registry, [...registeredLabels, label]);\n }\n }\n return null;\n }\n}\nexport default RegistryHandler;\n//# sourceMappingURL=RegistryHandler.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs\n// module chunks = menu-item","import Map from '../shim/Map';\nimport WeakMap from '../shim/WeakMap';\nimport Symbol from '../shim/Symbol';\nimport { v } from './d';\nimport { auto } from './diff';\nimport RegistryHandler from './RegistryHandler';\nimport NodeHandler from './NodeHandler';\nimport { widgetInstanceMap } from './vdom';\nimport { isWidgetBaseConstructor, WIDGET_BASE_TYPE } from './Registry';\nconst decoratorMap = new Map();\nconst boundAuto = auto.bind(null);\nexport const noBind = Symbol.for('dojoNoBind');\n/**\n * Main widget base for all widgets to extend\n */\nexport class WidgetBase {\n /**\n * @constructor\n */\n constructor() {\n /**\n * Indicates if it is the initial set properties cycle\n */\n this._initialProperties = true;\n /**\n * Array of property keys considered changed from the previous set properties\n */\n this._changedPropertyKeys = [];\n this._nodeHandler = new NodeHandler();\n this._handles = [];\n this._children = [];\n this._decoratorCache = new Map();\n this._properties = {};\n this._boundRenderFunc = this.render.bind(this);\n this._boundInvalidate = this.invalidate.bind(this);\n widgetInstanceMap.set(this, {\n dirty: true,\n onAttach: () => {\n this.onAttach();\n },\n onDetach: () => {\n this.onDetach();\n this.destroy();\n },\n nodeHandler: this._nodeHandler,\n registry: () => {\n return this.registry;\n },\n coreProperties: {},\n rendering: false,\n inputProperties: {}\n });\n this._runAfterConstructors();\n }\n meta(MetaType) {\n if (this._metaMap === undefined) {\n this._metaMap = new Map();\n }\n let cached = this._metaMap.get(MetaType);\n if (!cached) {\n cached = new MetaType({\n invalidate: this._boundInvalidate,\n nodeHandler: this._nodeHandler,\n bind: this\n });\n this.own(cached);\n this._metaMap.set(MetaType, cached);\n }\n return cached;\n }\n onAttach() {\n // Do nothing by default.\n }\n onDetach() {\n // Do nothing by default.\n }\n get properties() {\n return this._properties;\n }\n get changedPropertyKeys() {\n return [...this._changedPropertyKeys];\n }\n __setCoreProperties__(coreProperties) {\n const { baseRegistry } = coreProperties;\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.coreProperties.baseRegistry !== baseRegistry) {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n this._registry.base = baseRegistry;\n this.invalidate();\n }\n instanceData.coreProperties = coreProperties;\n }\n __setProperties__(originalProperties) {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.inputProperties = originalProperties;\n const properties = this._runBeforeProperties(originalProperties);\n const registeredDiffPropertyNames = this.getDecorator('registeredDiffProperty');\n const changedPropertyKeys = [];\n const propertyNames = Object.keys(properties);\n if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) {\n const allProperties = [...propertyNames, ...Object.keys(this._properties)];\n const checkedProperties = [];\n const diffPropertyResults = {};\n let runReactions = false;\n for (let i = 0; i < allProperties.length; i++) {\n const propertyName = allProperties[i];\n if (checkedProperties.indexOf(propertyName) !== -1) {\n continue;\n }\n checkedProperties.push(propertyName);\n const previousProperty = this._properties[propertyName];\n const newProperty = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n if (registeredDiffPropertyNames.indexOf(propertyName) !== -1) {\n runReactions = true;\n const diffFunctions = this.getDecorator(`diffProperty:${propertyName}`);\n for (let i = 0; i < diffFunctions.length; i++) {\n const result = diffFunctions[i](previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n else {\n const result = boundAuto(previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n if (runReactions) {\n const reactionFunctions = this.getDecorator('diffReaction');\n const executedReactions = [];\n reactionFunctions.forEach(({ reaction, propertyName }) => {\n const propertyChanged = changedPropertyKeys.indexOf(propertyName) !== -1;\n const reactionRun = executedReactions.indexOf(reaction) !== -1;\n if (propertyChanged && !reactionRun) {\n reaction.call(this, this._properties, diffPropertyResults);\n executedReactions.push(reaction);\n }\n });\n }\n this._properties = diffPropertyResults;\n this._changedPropertyKeys = changedPropertyKeys;\n }\n else {\n this._initialProperties = false;\n for (let i = 0; i < propertyNames.length; i++) {\n const propertyName = propertyNames[i];\n if (typeof properties[propertyName] === 'function') {\n properties[propertyName] = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n }\n else {\n changedPropertyKeys.push(propertyName);\n }\n }\n this._changedPropertyKeys = changedPropertyKeys;\n this._properties = Object.assign({}, properties);\n }\n if (this._changedPropertyKeys.length > 0) {\n this.invalidate();\n }\n }\n get children() {\n return this._children;\n }\n __setChildren__(children) {\n if (this._children.length > 0 || children.length > 0) {\n this._children = children;\n this.invalidate();\n }\n }\n __render__() {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.dirty = false;\n const render = this._runBeforeRenders();\n let dNode = render();\n dNode = this.runAfterRenders(dNode);\n this._nodeHandler.clear();\n return dNode;\n }\n invalidate() {\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.invalidate) {\n instanceData.invalidate();\n }\n }\n render() {\n return v('div', {}, this.children);\n }\n /**\n * Function to add decorators to WidgetBase\n *\n * @param decoratorKey The key of the decorator\n * @param value The value of the decorator\n */\n addDecorator(decoratorKey, value) {\n value = Array.isArray(value) ? value : [value];\n if (this.hasOwnProperty('constructor')) {\n let decoratorList = decoratorMap.get(this.constructor);\n if (!decoratorList) {\n decoratorList = new Map();\n decoratorMap.set(this.constructor, decoratorList);\n }\n let specificDecoratorList = decoratorList.get(decoratorKey);\n if (!specificDecoratorList) {\n specificDecoratorList = [];\n decoratorList.set(decoratorKey, specificDecoratorList);\n }\n specificDecoratorList.push(...value);\n }\n else {\n const decorators = this.getDecorator(decoratorKey);\n this._decoratorCache.set(decoratorKey, [...decorators, ...value]);\n }\n }\n /**\n * Function to build the list of decorators from the global decorator map.\n *\n * @param decoratorKey The key of the decorator\n * @return An array of decorator values\n * @private\n */\n _buildDecoratorList(decoratorKey) {\n const allDecorators = [];\n let constructor = this.constructor;\n while (constructor) {\n const instanceMap = decoratorMap.get(constructor);\n if (instanceMap) {\n const decorators = instanceMap.get(decoratorKey);\n if (decorators) {\n allDecorators.unshift(...decorators);\n }\n }\n constructor = Object.getPrototypeOf(constructor);\n }\n return allDecorators;\n }\n /**\n * Function to retrieve decorator values\n *\n * @param decoratorKey The key of the decorator\n * @returns An array of decorator values\n */\n getDecorator(decoratorKey) {\n let allDecorators = this._decoratorCache.get(decoratorKey);\n if (allDecorators !== undefined) {\n return allDecorators;\n }\n allDecorators = this._buildDecoratorList(decoratorKey);\n this._decoratorCache.set(decoratorKey, allDecorators);\n return allDecorators;\n }\n /**\n * Binds unbound property functions to the specified `bind` property\n *\n * @param properties properties to check for functions\n */\n _bindFunctionProperty(property, bind) {\n if (typeof property === 'function' && !property[noBind] && isWidgetBaseConstructor(property) === false) {\n if (this._bindFunctionPropertyMap === undefined) {\n this._bindFunctionPropertyMap = new WeakMap();\n }\n const bindInfo = this._bindFunctionPropertyMap.get(property) || {};\n let { boundFunc, scope } = bindInfo;\n if (boundFunc === undefined || scope !== bind) {\n boundFunc = property.bind(bind);\n this._bindFunctionPropertyMap.set(property, { boundFunc, scope: bind });\n }\n return boundFunc;\n }\n return property;\n }\n get registry() {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n return this._registry;\n }\n _runBeforeProperties(properties) {\n const beforeProperties = this.getDecorator('beforeProperties');\n if (beforeProperties.length > 0) {\n return beforeProperties.reduce((properties, beforePropertiesFunction) => {\n return Object.assign({}, properties, beforePropertiesFunction.call(this, properties));\n }, Object.assign({}, properties));\n }\n return properties;\n }\n /**\n * Run all registered before renders and return the updated render method\n */\n _runBeforeRenders() {\n const beforeRenders = this.getDecorator('beforeRender');\n if (beforeRenders.length > 0) {\n return beforeRenders.reduce((render, beforeRenderFunction) => {\n const updatedRender = beforeRenderFunction.call(this, render, this._properties, this._children);\n if (!updatedRender) {\n console.warn('Render function not returned from beforeRender, using previous render');\n return render;\n }\n return updatedRender;\n }, this._boundRenderFunc);\n }\n return this._boundRenderFunc;\n }\n /**\n * Run all registered after renders and return the decorated DNodes\n *\n * @param dNode The DNodes to run through the after renders\n */\n runAfterRenders(dNode) {\n const afterRenders = this.getDecorator('afterRender');\n if (afterRenders.length > 0) {\n dNode = afterRenders.reduce((dNode, afterRenderFunction) => {\n return afterRenderFunction.call(this, dNode);\n }, dNode);\n }\n if (this._metaMap !== undefined) {\n this._metaMap.forEach((meta) => {\n meta.afterRender();\n });\n }\n return dNode;\n }\n _runAfterConstructors() {\n const afterConstructors = this.getDecorator('afterConstructor');\n if (afterConstructors.length > 0) {\n afterConstructors.forEach((afterConstructor) => afterConstructor.call(this));\n }\n }\n own(handle) {\n this._handles.push(handle);\n }\n destroy() {\n while (this._handles.length > 0) {\n const handle = this._handles.pop();\n if (handle) {\n handle.destroy();\n }\n }\n }\n}\n/**\n * static identifier\n */\nWidgetBase._type = WIDGET_BASE_TYPE;\nexport default WidgetBase;\n//# sourceMappingURL=WidgetBase.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/WidgetBase.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/WidgetBase.mjs\n// module chunks = menu-item","let browserSpecificTransitionEndEventName = '';\nlet browserSpecificAnimationEndEventName = '';\nfunction determineBrowserStyleNames(element) {\n if ('WebkitTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'webkitTransitionEnd';\n browserSpecificAnimationEndEventName = 'webkitAnimationEnd';\n }\n else if ('transition' in element.style || 'MozTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'transitionend';\n browserSpecificAnimationEndEventName = 'animationend';\n }\n else {\n throw new Error('Your browser is not supported');\n }\n}\nfunction initialize(element) {\n if (browserSpecificAnimationEndEventName === '') {\n determineBrowserStyleNames(element);\n }\n}\nfunction runAndCleanUp(element, startAnimation, finishAnimation) {\n initialize(element);\n let finished = false;\n let transitionEnd = function () {\n if (!finished) {\n finished = true;\n element.removeEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n element.removeEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n finishAnimation();\n }\n };\n startAnimation();\n element.addEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n element.addEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n}\nfunction exit(node, properties, exitAnimation, removeNode) {\n const activeClass = properties.exitAnimationActive || `${exitAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(exitAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n removeNode();\n });\n}\nfunction enter(node, properties, enterAnimation) {\n const activeClass = properties.enterAnimationActive || `${enterAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(enterAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n node.classList.remove(enterAnimation);\n node.classList.remove(activeClass);\n });\n}\nexport default {\n enter,\n exit\n};\n//# sourceMappingURL=cssTransitions.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs\n// module chunks = menu-item","import Symbol from '../shim/Symbol';\n/**\n * The symbol identifier for a WNode type\n */\nexport const WNODE = Symbol('Identifier for a WNode.');\n/**\n * The symbol identifier for a VNode type\n */\nexport const VNODE = Symbol('Identifier for a VNode.');\n/**\n * The symbol identifier for a VNode type created using dom()\n */\nexport const DOMVNODE = Symbol('Identifier for a VNode created using existing dom.');\n/**\n * Helper function that returns true if the `DNode` is a `WNode` using the `type` property\n */\nexport function isWNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === WNODE);\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` using the `type` property\n */\nexport function isVNode(child) {\n return Boolean(child && typeof child !== 'string' && (child.type === VNODE || child.type === DOMVNODE));\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` created with `dom()` using the `type` property\n */\nexport function isDomVNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === DOMVNODE);\n}\nexport function isElementNode(value) {\n return !!value.tagName;\n}\nexport function decorate(dNodes, optionsOrModifier, predicate) {\n let shallow = false;\n let modifier;\n if (typeof optionsOrModifier === 'function') {\n modifier = optionsOrModifier;\n }\n else {\n modifier = optionsOrModifier.modifier;\n predicate = optionsOrModifier.predicate;\n shallow = optionsOrModifier.shallow || false;\n }\n let nodes = Array.isArray(dNodes) ? [...dNodes] : [dNodes];\n function breaker() {\n nodes = [];\n }\n while (nodes.length) {\n const node = nodes.shift();\n if (node) {\n if (!shallow && (isWNode(node) || isVNode(node)) && node.children) {\n nodes = [...nodes, ...node.children];\n }\n if (!predicate || predicate(node)) {\n modifier(node, breaker);\n }\n }\n }\n return dNodes;\n}\n/**\n * Wrapper function for calls to create a widget.\n */\nexport function w(widgetConstructor, properties, children = []) {\n return {\n children,\n widgetConstructor,\n properties,\n type: WNODE\n };\n}\nexport function v(tag, propertiesOrChildren = {}, children = undefined) {\n let properties = propertiesOrChildren;\n let deferredPropertiesCallback;\n if (Array.isArray(propertiesOrChildren)) {\n children = propertiesOrChildren;\n properties = {};\n }\n if (typeof properties === 'function') {\n deferredPropertiesCallback = properties;\n properties = {};\n }\n return {\n tag,\n deferredPropertiesCallback,\n children,\n properties,\n type: VNODE\n };\n}\n/**\n * Create a VNode for an existing DOM Node.\n */\nexport function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, children) {\n return {\n tag: isElementNode(node) ? node.tagName.toLowerCase() : '',\n properties: props,\n attributes: attrs,\n events: on,\n children,\n type: DOMVNODE,\n domNode: node,\n text: isElementNode(node) ? undefined : node.data,\n diffType\n };\n}\n//# sourceMappingURL=d.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/d.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/d.mjs\n// module chunks = menu-item","import { handleDecorator } from './handleDecorator';\nexport function afterRender(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('afterRender', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default afterRender;\n//# sourceMappingURL=afterRender.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs\n// module chunks = menu-item","import { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\nexport function alwaysRender() {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function () {\n this.invalidate();\n })(target);\n });\n}\nexport default alwaysRender;\n//# sourceMappingURL=alwaysRender.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs\n// module chunks = menu-item","import { handleDecorator } from './handleDecorator';\nexport function beforeProperties(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('beforeProperties', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default beforeProperties;\n//# sourceMappingURL=beforeProperties.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs\n// module chunks = menu-item","import { CustomElementChildType } from '../registerCustomElement';\nimport Registry from '../Registry';\n/**\n * This Decorator is provided properties that define the behavior of a custom element, and\n * registers that custom element.\n */\nexport function customElement({ tag, properties = [], attributes = [], events = [], childType = CustomElementChildType.DOJO, registryFactory = () => new Registry() }) {\n return function (target) {\n target.prototype.__customElementDescriptor = {\n tagName: tag,\n attributes,\n properties,\n events,\n childType,\n registryFactory\n };\n };\n}\nexport default customElement;\n//# sourceMappingURL=customElement.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs\n// module chunks = menu-item","import { handleDecorator } from './handleDecorator';\nimport { auto } from './../diff';\n/**\n * Decorator that can be used to register a function as a specific property diff\n *\n * @param propertyName The name of the property of which the diff function is applied\n * @param diffType The diff type, default is DiffType.AUTO.\n * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM\n */\nexport function diffProperty(propertyName, diffFunction = auto, reactionFunction) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null));\n target.addDecorator('registeredDiffProperty', propertyName);\n if (reactionFunction || propertyKey) {\n target.addDecorator('diffReaction', {\n propertyName,\n reaction: propertyKey ? target[propertyKey] : reactionFunction\n });\n }\n });\n}\nexport default diffProperty;\n//# sourceMappingURL=diffProperty.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs\n// module chunks = menu-item","/**\n * Generic decorator handler to take care of whether or not the decorator was called at the class level\n * or the method level.\n *\n * @param handler\n */\nexport function handleDecorator(handler) {\n return function (target, propertyKey, descriptor) {\n if (typeof target === 'function') {\n handler(target.prototype, undefined);\n }\n else {\n handler(target, propertyKey);\n }\n };\n}\nexport default handleDecorator;\n//# sourceMappingURL=handleDecorator.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs\n// module chunks = menu-item","import WeakMap from '../../shim/WeakMap';\nimport { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\n/**\n * Map of instances against registered injectors.\n */\nconst registeredInjectorsMap = new WeakMap();\n/**\n * Decorator retrieves an injector from an available registry using the name and\n * calls the `getProperties` function with the payload from the injector\n * and current properties with the the injected properties returned.\n *\n * @param InjectConfig the inject configuration\n */\nexport function inject({ name, getProperties }) {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function (properties) {\n const injectorItem = this.registry.getInjector(name);\n if (injectorItem) {\n const { injector, invalidator } = injectorItem;\n const registeredInjectors = registeredInjectorsMap.get(this) || [];\n if (registeredInjectors.length === 0) {\n registeredInjectorsMap.set(this, registeredInjectors);\n }\n if (registeredInjectors.indexOf(injectorItem) === -1) {\n this.own(invalidator.on('invalidate', () => {\n this.invalidate();\n }));\n registeredInjectors.push(injectorItem);\n }\n return getProperties(injector(), properties);\n }\n })(target);\n });\n}\nexport default inject;\n//# sourceMappingURL=inject.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/inject.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/inject.mjs\n// module chunks = menu-item","import { WIDGET_BASE_TYPE } from './Registry';\nfunction isObjectOrArray(value) {\n return Object.prototype.toString.call(value) === '[object Object]' || Array.isArray(value);\n}\nexport function always(previousProperty, newProperty) {\n return {\n changed: true,\n value: newProperty\n };\n}\nexport function ignore(previousProperty, newProperty) {\n return {\n changed: false,\n value: newProperty\n };\n}\nexport function reference(previousProperty, newProperty) {\n return {\n changed: previousProperty !== newProperty,\n value: newProperty\n };\n}\nexport function shallow(previousProperty, newProperty) {\n let changed = false;\n const validOldProperty = previousProperty && isObjectOrArray(previousProperty);\n const validNewProperty = newProperty && isObjectOrArray(newProperty);\n if (!validOldProperty || !validNewProperty) {\n return {\n changed: true,\n value: newProperty\n };\n }\n const previousKeys = Object.keys(previousProperty);\n const newKeys = Object.keys(newProperty);\n if (previousKeys.length !== newKeys.length) {\n changed = true;\n }\n else {\n changed = newKeys.some((key) => {\n return newProperty[key] !== previousProperty[key];\n });\n }\n return {\n changed,\n value: newProperty\n };\n}\nexport function auto(previousProperty, newProperty) {\n let result;\n if (typeof newProperty === 'function') {\n if (newProperty._type === WIDGET_BASE_TYPE) {\n result = reference(previousProperty, newProperty);\n }\n else {\n result = ignore(previousProperty, newProperty);\n }\n }\n else if (isObjectOrArray(newProperty)) {\n result = shallow(previousProperty, newProperty);\n }\n else {\n result = reference(previousProperty, newProperty);\n }\n return result;\n}\n//# sourceMappingURL=diff.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/diff.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/diff.mjs\n// module chunks = menu-item","import * as tslib_1 from \"tslib\";\nimport { assign } from '../../core/lang';\nimport cssTransitions from '../animations/cssTransitions';\nimport { afterRender } from './../decorators/afterRender';\nimport { v } from './../d';\nimport { dom } from './../vdom';\n/**\n * Represents the attach state of the projector\n */\nexport var ProjectorAttachState;\n(function (ProjectorAttachState) {\n ProjectorAttachState[ProjectorAttachState[\"Attached\"] = 1] = \"Attached\";\n ProjectorAttachState[ProjectorAttachState[\"Detached\"] = 2] = \"Detached\";\n})(ProjectorAttachState || (ProjectorAttachState = {}));\n/**\n * Attach type for the projector\n */\nexport var AttachType;\n(function (AttachType) {\n AttachType[AttachType[\"Append\"] = 1] = \"Append\";\n AttachType[AttachType[\"Merge\"] = 2] = \"Merge\";\n})(AttachType || (AttachType = {}));\nexport function ProjectorMixin(Base) {\n class Projector extends Base {\n constructor(...args) {\n super(...args);\n this._root = document.body;\n this._async = true;\n this._projectorProperties = {};\n this._projectionOptions = {\n transitions: cssTransitions\n };\n this.root = document.body;\n this.projectorState = ProjectorAttachState.Detached;\n }\n append(root) {\n const options = {\n type: AttachType.Append,\n root\n };\n return this._attach(options);\n }\n merge(root) {\n const options = {\n type: AttachType.Merge,\n root\n };\n return this._attach(options);\n }\n set root(root) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change root element');\n }\n this._root = root;\n }\n get root() {\n return this._root;\n }\n get async() {\n return this._async;\n }\n set async(async) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change async mode');\n }\n this._async = async;\n }\n sandbox(doc = document) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot create sandbox');\n }\n this._async = false;\n const previousRoot = this.root;\n /* free up the document fragment for GC */\n this.own({\n destroy: () => {\n this._root = previousRoot;\n }\n });\n this._attach({\n /* DocumentFragment is not assignable to Element, but provides everything needed to work */\n root: doc.createDocumentFragment(),\n type: AttachType.Append\n });\n }\n setChildren(children) {\n this.__setChildren__(children);\n }\n setProperties(properties) {\n this.__setProperties__(properties);\n }\n __setProperties__(properties) {\n if (this._projectorProperties && this._projectorProperties.registry !== properties.registry) {\n if (this._projectorProperties.registry) {\n this._projectorProperties.registry.destroy();\n }\n }\n this._projectorProperties = assign({}, properties);\n super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry });\n super.__setProperties__(properties);\n }\n toHtml() {\n if (this.projectorState !== ProjectorAttachState.Attached || !this._projection) {\n throw new Error('Projector is not attached, cannot return an HTML string of projection.');\n }\n return this._projection.domNode.childNodes[0].outerHTML;\n }\n afterRender(result) {\n let node = result;\n if (typeof result === 'string' || result === null || result === undefined) {\n node = v('span', {}, [result]);\n }\n return node;\n }\n destroy() {\n super.destroy();\n }\n _attach({ type, root }) {\n if (root) {\n this.root = root;\n }\n if (this._attachHandle) {\n return this._attachHandle;\n }\n this.projectorState = ProjectorAttachState.Attached;\n const handle = {\n destroy: () => {\n if (this.projectorState === ProjectorAttachState.Attached) {\n this._projection = undefined;\n this.projectorState = ProjectorAttachState.Detached;\n }\n }\n };\n this.own(handle);\n this._attachHandle = handle;\n this._projectionOptions = Object.assign({}, this._projectionOptions, { sync: !this._async });\n switch (type) {\n case AttachType.Append:\n this._projection = dom.append(this.root, this, this._projectionOptions);\n break;\n case AttachType.Merge:\n this._projection = dom.merge(this.root, this, this._projectionOptions);\n break;\n }\n return this._attachHandle;\n }\n }\n tslib_1.__decorate([\n afterRender()\n ], Projector.prototype, \"afterRender\", null);\n return Projector;\n}\nexport default ProjectorMixin;\n//# sourceMappingURL=Projector.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs\n// module chunks = menu-item","import * as tslib_1 from \"tslib\";\nimport { Injector } from './../Injector';\nimport { inject } from './../decorators/inject';\nimport { handleDecorator } from './../decorators/handleDecorator';\nimport { diffProperty } from './../decorators/diffProperty';\nimport { shallow } from './../diff';\nconst THEME_KEY = ' _key';\nexport const INJECTED_THEME_KEY = Symbol('theme');\n/**\n * Decorator for base css classes\n */\nexport function theme(theme) {\n return handleDecorator((target) => {\n target.addDecorator('baseThemeClasses', theme);\n });\n}\n/**\n * Creates a reverse lookup for the classes passed in via the `theme` function.\n *\n * @param classes The baseClasses object\n * @requires\n */\nfunction createThemeClassesLookup(classes) {\n return classes.reduce((currentClassNames, baseClass) => {\n Object.keys(baseClass).forEach((key) => {\n currentClassNames[baseClass[key]] = key;\n });\n return currentClassNames;\n }, {});\n}\n/**\n * Convenience function that is given a theme and an optional registry, the theme\n * injector is defined against the registry, returning the theme.\n *\n * @param theme the theme to set\n * @param themeRegistry registry to define the theme injector against. Defaults\n * to the global registry\n *\n * @returns the theme injector used to set the theme\n */\nexport function registerThemeInjector(theme, themeRegistry) {\n const themeInjector = new Injector(theme);\n themeRegistry.defineInjector(INJECTED_THEME_KEY, (invalidator) => {\n themeInjector.setInvalidator(invalidator);\n return () => themeInjector.get();\n });\n return themeInjector;\n}\n/**\n * Function that returns a class decorated with with Themed functionality\n */\nexport function ThemedMixin(Base) {\n let Themed = class Themed extends Base {\n constructor() {\n super(...arguments);\n /**\n * Registered base theme keys\n */\n this._registeredBaseThemeKeys = [];\n /**\n * Indicates if classes meta data need to be calculated.\n */\n this._recalculateClasses = true;\n /**\n * Loaded theme\n */\n this._theme = {};\n }\n theme(classes) {\n if (this._recalculateClasses) {\n this._recalculateThemeClasses();\n }\n if (Array.isArray(classes)) {\n return classes.map((className) => this._getThemeClass(className));\n }\n return this._getThemeClass(classes);\n }\n /**\n * Function fired when `theme` or `extraClasses` are changed.\n */\n onPropertiesChanged() {\n this._recalculateClasses = true;\n }\n _getThemeClass(className) {\n if (className === undefined || className === null) {\n return className;\n }\n const extraClasses = this.properties.extraClasses || {};\n const themeClassName = this._baseThemeClassesReverseLookup[className];\n let resultClassNames = [];\n if (!themeClassName) {\n console.warn(`Class name: '${className}' not found in theme`);\n return null;\n }\n if (extraClasses[themeClassName]) {\n resultClassNames.push(extraClasses[themeClassName]);\n }\n if (this._theme[themeClassName]) {\n resultClassNames.push(this._theme[themeClassName]);\n }\n else {\n resultClassNames.push(this._registeredBaseTheme[themeClassName]);\n }\n return resultClassNames.join(' ');\n }\n _recalculateThemeClasses() {\n const { theme = {} } = this.properties;\n const baseThemes = this.getDecorator('baseThemeClasses');\n if (!this._registeredBaseTheme) {\n this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => {\n const _a = THEME_KEY, key = baseTheme[_a], classes = tslib_1.__rest(baseTheme, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n this._registeredBaseThemeKeys.push(key);\n return Object.assign({}, finalBaseTheme, classes);\n }, {});\n this._baseThemeClassesReverseLookup = createThemeClassesLookup(baseThemes);\n }\n this._theme = this._registeredBaseThemeKeys.reduce((baseTheme, themeKey) => {\n return Object.assign({}, baseTheme, theme[themeKey]);\n }, {});\n this._recalculateClasses = false;\n }\n };\n tslib_1.__decorate([\n diffProperty('theme', shallow),\n diffProperty('extraClasses', shallow)\n ], Themed.prototype, \"onPropertiesChanged\", null);\n Themed = tslib_1.__decorate([\n inject({\n name: INJECTED_THEME_KEY,\n getProperties: (theme, properties) => {\n if (!properties.theme) {\n return { theme };\n }\n return {};\n }\n })\n ], Themed);\n return Themed;\n}\nexport default ThemedMixin;\n//# sourceMappingURL=Themed.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs\n// module chunks = menu-item","import * as tslib_1 from \"tslib\";\nimport { WidgetBase, noBind } from './WidgetBase';\nimport { ProjectorMixin } from './mixins/Projector';\nimport { from } from '../shim/array';\nimport { w, dom } from './d';\nimport global from '../shim/global';\nimport { registerThemeInjector } from './mixins/Themed';\nimport { alwaysRender } from './decorators/alwaysRender';\nexport var CustomElementChildType;\n(function (CustomElementChildType) {\n CustomElementChildType[\"DOJO\"] = \"DOJO\";\n CustomElementChildType[\"NODE\"] = \"NODE\";\n CustomElementChildType[\"TEXT\"] = \"TEXT\";\n})(CustomElementChildType || (CustomElementChildType = {}));\nexport function DomToWidgetWrapper(domNode) {\n let DomToWidgetWrapper = class DomToWidgetWrapper extends WidgetBase {\n render() {\n const properties = Object.keys(this.properties).reduce((props, key) => {\n const value = this.properties[key];\n if (key.indexOf('on') === 0) {\n key = `__${key}`;\n }\n props[key] = value;\n return props;\n }, {});\n return dom({ node: domNode, props: properties, diffType: 'dom' });\n }\n static get domNode() {\n return domNode;\n }\n };\n DomToWidgetWrapper = tslib_1.__decorate([\n alwaysRender()\n ], DomToWidgetWrapper);\n return DomToWidgetWrapper;\n}\nexport function create(descriptor, WidgetConstructor) {\n const { attributes, childType, registryFactory } = descriptor;\n const attributeMap = {};\n attributes.forEach((propertyName) => {\n const attributeName = propertyName.toLowerCase();\n attributeMap[attributeName] = propertyName;\n });\n return class extends HTMLElement {\n constructor() {\n super(...arguments);\n this._properties = {};\n this._children = [];\n this._eventProperties = {};\n this._initialised = false;\n }\n connectedCallback() {\n if (this._initialised) {\n return;\n }\n const domProperties = {};\n const { attributes, properties, events } = descriptor;\n this._properties = Object.assign({}, this._properties, this._attributesToProperties(attributes));\n [...attributes, ...properties].forEach((propertyName) => {\n const value = this[propertyName];\n const filteredPropertyName = propertyName.replace(/^on/, '__');\n if (value !== undefined) {\n this._properties[propertyName] = value;\n }\n if (filteredPropertyName !== propertyName) {\n domProperties[filteredPropertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n }\n domProperties[propertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n });\n events.forEach((propertyName) => {\n const eventName = propertyName.replace(/^on/, '').toLowerCase();\n const filteredPropertyName = propertyName.replace(/^on/, '__on');\n domProperties[filteredPropertyName] = {\n get: () => this._getEventProperty(propertyName),\n set: (value) => this._setEventProperty(propertyName, value)\n };\n this._eventProperties[propertyName] = undefined;\n this._properties[propertyName] = (...args) => {\n const eventCallback = this._getEventProperty(propertyName);\n if (typeof eventCallback === 'function') {\n eventCallback(...args);\n }\n this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: false,\n detail: args\n }));\n };\n });\n Object.defineProperties(this, domProperties);\n const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children;\n from(children).forEach((childNode) => {\n if (childType === CustomElementChildType.DOJO) {\n childNode.addEventListener('dojo-ce-render', () => this._render());\n childNode.addEventListener('dojo-ce-connected', () => this._render());\n this._children.push(DomToWidgetWrapper(childNode));\n }\n else {\n this._children.push(dom({ node: childNode, diffType: 'dom' }));\n }\n });\n this.addEventListener('dojo-ce-connected', (e) => this._childConnected(e));\n const widgetProperties = this._properties;\n const renderChildren = () => this.__children__();\n const Wrapper = class extends WidgetBase {\n render() {\n return w(WidgetConstructor, widgetProperties, renderChildren());\n }\n };\n const registry = registryFactory();\n const themeContext = registerThemeInjector(this._getTheme(), registry);\n global.addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme()));\n const Projector = ProjectorMixin(Wrapper);\n this._projector = new Projector();\n this._projector.setProperties({ registry });\n this._projector.append(this);\n this._initialised = true;\n this.dispatchEvent(new CustomEvent('dojo-ce-connected', {\n bubbles: true,\n detail: this\n }));\n }\n _getTheme() {\n if (global && global.dojoce && global.dojoce.theme) {\n return global.dojoce.themes[global.dojoce.theme];\n }\n }\n _childConnected(e) {\n const node = e.detail;\n if (node.parentNode === this) {\n const exists = this._children.some((child) => child.domNode === node);\n if (!exists) {\n node.addEventListener('dojo-ce-render', () => this._render());\n this._children.push(DomToWidgetWrapper(node));\n this._render();\n }\n }\n }\n _render() {\n if (this._projector) {\n this._projector.invalidate();\n this.dispatchEvent(new CustomEvent('dojo-ce-render', {\n bubbles: false,\n detail: this\n }));\n }\n }\n __properties__() {\n return Object.assign({}, this._properties, this._eventProperties);\n }\n __children__() {\n if (childType === CustomElementChildType.DOJO) {\n return this._children.filter((Child) => Child.domNode.isWidget).map((Child) => {\n const { domNode } = Child;\n return w(Child, Object.assign({}, domNode.__properties__()), [...domNode.__children__()]);\n });\n }\n else {\n return this._children;\n }\n }\n attributeChangedCallback(name, oldValue, value) {\n const propertyName = attributeMap[name];\n this._setProperty(propertyName, value);\n }\n _setEventProperty(propertyName, value) {\n this._eventProperties[propertyName] = value;\n }\n _getEventProperty(propertyName) {\n return this._eventProperties[propertyName];\n }\n _setProperty(propertyName, value) {\n if (typeof value === 'function') {\n value[noBind] = true;\n }\n this._properties[propertyName] = value;\n this._render();\n }\n _getProperty(propertyName) {\n return this._properties[propertyName];\n }\n _attributesToProperties(attributes) {\n return attributes.reduce((properties, propertyName) => {\n const attributeName = propertyName.toLowerCase();\n const value = this.getAttribute(attributeName);\n if (value !== null) {\n properties[propertyName] = value;\n }\n return properties;\n }, {});\n }\n static get observedAttributes() {\n return Object.keys(attributeMap);\n }\n get isWidget() {\n return true;\n }\n };\n}\nexport function register(WidgetConstructor) {\n const descriptor = WidgetConstructor.prototype && WidgetConstructor.prototype.__customElementDescriptor;\n if (!descriptor) {\n throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?');\n }\n global.customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor));\n}\nexport default register;\n//# sourceMappingURL=registerCustomElement.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs\n// module chunks = menu-item","import global from '../shim/global';\nimport { from as arrayFrom } from '../shim/array';\nimport { isWNode, isVNode, isDomVNode, VNODE, WNODE } from './d';\nimport { isWidgetBaseConstructor } from './Registry';\nimport WeakMap from '../shim/WeakMap';\nconst NAMESPACE_W3 = 'http://www.w3.org/';\nconst NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg';\nconst NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink';\nconst emptyArray = [];\nconst nodeOperations = ['focus', 'blur', 'scrollIntoView', 'click'];\nexport const widgetInstanceMap = new WeakMap();\nconst instanceMap = new WeakMap();\nconst nextSiblingMap = new WeakMap();\nconst projectorStateMap = new WeakMap();\nfunction same(dnode1, dnode2) {\n if (isVNode(dnode1) && isVNode(dnode2)) {\n if (isDomVNode(dnode1) || isDomVNode(dnode2)) {\n if (dnode1.domNode !== dnode2.domNode) {\n return false;\n }\n }\n if (dnode1.tag !== dnode2.tag) {\n return false;\n }\n if (dnode1.properties.key !== dnode2.properties.key) {\n return false;\n }\n return true;\n }\n else if (isWNode(dnode1) && isWNode(dnode2)) {\n if (dnode1.instance === undefined && typeof dnode2.widgetConstructor === 'string') {\n return false;\n }\n if (dnode1.widgetConstructor !== dnode2.widgetConstructor) {\n return false;\n }\n if (dnode1.properties.key !== dnode2.properties.key) {\n return false;\n }\n return true;\n }\n return false;\n}\nconst missingTransition = function () {\n throw new Error('Provide a transitions object to the projectionOptions to do animations');\n};\nfunction getProjectionOptions(projectorOptions, projectorInstance) {\n const defaults = {\n namespace: undefined,\n styleApplyer: function (domNode, styleName, value) {\n domNode.style[styleName] = value;\n },\n transitions: {\n enter: missingTransition,\n exit: missingTransition\n },\n depth: 0,\n merge: false,\n sync: false,\n projectorInstance\n };\n return Object.assign({}, defaults, projectorOptions);\n}\nfunction checkStyleValue(styleValue) {\n if (typeof styleValue !== 'string') {\n throw new Error('Style values must be strings');\n }\n}\nfunction updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n const eventMap = projectorState.nodeMap.get(domNode) || new WeakMap();\n if (previousValue) {\n const previousEvent = eventMap.get(previousValue);\n domNode.removeEventListener(eventName, previousEvent);\n }\n let callback = currentValue.bind(bind);\n if (eventName === 'input') {\n callback = function (evt) {\n currentValue.call(this, evt);\n evt.target['oninput-value'] = evt.target.value;\n }.bind(bind);\n }\n domNode.addEventListener(eventName, callback);\n eventMap.set(currentValue, callback);\n projectorState.nodeMap.set(domNode, eventMap);\n}\nfunction addClasses(domNode, classes) {\n if (classes) {\n const classNames = classes.split(' ');\n for (let i = 0; i < classNames.length; i++) {\n domNode.classList.add(classNames[i]);\n }\n }\n}\nfunction removeClasses(domNode, classes) {\n if (classes) {\n const classNames = classes.split(' ');\n for (let i = 0; i < classNames.length; i++) {\n domNode.classList.remove(classNames[i]);\n }\n }\n}\nfunction buildPreviousProperties(domNode, previous, current) {\n const { diffType, properties, attributes } = current;\n if (!diffType || diffType === 'vdom') {\n return { properties: previous.properties, attributes: previous.attributes, events: previous.events };\n }\n else if (diffType === 'none') {\n return { properties: {}, attributes: previous.attributes ? {} : undefined, events: previous.events };\n }\n let newProperties = {\n properties: {}\n };\n if (attributes) {\n newProperties.attributes = {};\n newProperties.events = previous.events;\n Object.keys(properties).forEach((propName) => {\n newProperties.properties[propName] = domNode[propName];\n });\n Object.keys(attributes).forEach((attrName) => {\n newProperties.attributes[attrName] = domNode.getAttribute(attrName);\n });\n return newProperties;\n }\n newProperties.properties = Object.keys(properties).reduce((props, property) => {\n props[property] = domNode.getAttribute(property) || domNode[property];\n return props;\n }, {});\n return newProperties;\n}\nfunction nodeOperation(propName, propValue, previousValue, domNode, projectionOptions) {\n let result;\n if (typeof propValue === 'function') {\n result = propValue();\n }\n else {\n result = propValue && !previousValue;\n }\n if (result === true) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectorState.deferredRenderCallbacks.push(() => {\n domNode[propName]();\n });\n }\n}\nfunction removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions, onlyEvents = false) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n const eventMap = projectorState.nodeMap.get(domNode);\n if (eventMap) {\n Object.keys(previousProperties).forEach((propName) => {\n const isEvent = propName.substr(0, 2) === 'on' || onlyEvents;\n const eventName = onlyEvents ? propName : propName.substr(2);\n if (isEvent && !properties[propName]) {\n const eventCallback = eventMap.get(previousProperties[propName]);\n if (eventCallback) {\n domNode.removeEventListener(eventName, eventCallback);\n }\n }\n });\n }\n}\nfunction updateAttribute(domNode, attrName, attrValue, projectionOptions) {\n if (projectionOptions.namespace === NAMESPACE_SVG && attrName === 'href') {\n domNode.setAttributeNS(NAMESPACE_XLINK, attrName, attrValue);\n }\n else if ((attrName === 'role' && attrValue === '') || attrValue === undefined) {\n domNode.removeAttribute(attrName);\n }\n else {\n domNode.setAttribute(attrName, attrValue);\n }\n}\nfunction updateAttributes(domNode, previousAttributes, attributes, projectionOptions) {\n const attrNames = Object.keys(attributes);\n const attrCount = attrNames.length;\n for (let i = 0; i < attrCount; i++) {\n const attrName = attrNames[i];\n const attrValue = attributes[attrName];\n const previousAttrValue = previousAttributes[attrName];\n if (attrValue !== previousAttrValue) {\n updateAttribute(domNode, attrName, attrValue, projectionOptions);\n }\n }\n}\nfunction updateProperties(domNode, previousProperties, properties, projectionOptions, includesEventsAndAttributes = true) {\n let propertiesUpdated = false;\n const propNames = Object.keys(properties);\n const propCount = propNames.length;\n if (propNames.indexOf('classes') === -1 && previousProperties.classes) {\n if (Array.isArray(previousProperties.classes)) {\n for (let i = 0; i < previousProperties.classes.length; i++) {\n removeClasses(domNode, previousProperties.classes[i]);\n }\n }\n else {\n removeClasses(domNode, previousProperties.classes);\n }\n }\n includesEventsAndAttributes && removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions);\n for (let i = 0; i < propCount; i++) {\n const propName = propNames[i];\n let propValue = properties[propName];\n const previousValue = previousProperties[propName];\n if (propName === 'classes') {\n const previousClasses = Array.isArray(previousValue) ? previousValue : [previousValue];\n const currentClasses = Array.isArray(propValue) ? propValue : [propValue];\n if (previousClasses && previousClasses.length > 0) {\n if (!propValue || propValue.length === 0) {\n for (let i = 0; i < previousClasses.length; i++) {\n removeClasses(domNode, previousClasses[i]);\n }\n }\n else {\n const newClasses = [...currentClasses];\n for (let i = 0; i < previousClasses.length; i++) {\n const previousClassName = previousClasses[i];\n if (previousClassName) {\n const classIndex = newClasses.indexOf(previousClassName);\n if (classIndex === -1) {\n removeClasses(domNode, previousClassName);\n }\n else {\n newClasses.splice(classIndex, 1);\n }\n }\n }\n for (let i = 0; i < newClasses.length; i++) {\n addClasses(domNode, newClasses[i]);\n }\n }\n }\n else {\n for (let i = 0; i < currentClasses.length; i++) {\n addClasses(domNode, currentClasses[i]);\n }\n }\n }\n else if (nodeOperations.indexOf(propName) !== -1) {\n nodeOperation(propName, propValue, previousValue, domNode, projectionOptions);\n }\n else if (propName === 'styles') {\n const styleNames = Object.keys(propValue);\n const styleCount = styleNames.length;\n for (let j = 0; j < styleCount; j++) {\n const styleName = styleNames[j];\n const newStyleValue = propValue[styleName];\n const oldStyleValue = previousValue && previousValue[styleName];\n if (newStyleValue === oldStyleValue) {\n continue;\n }\n propertiesUpdated = true;\n if (newStyleValue) {\n checkStyleValue(newStyleValue);\n projectionOptions.styleApplyer(domNode, styleName, newStyleValue);\n }\n else {\n projectionOptions.styleApplyer(domNode, styleName, '');\n }\n }\n }\n else {\n if (!propValue && typeof previousValue === 'string') {\n propValue = '';\n }\n if (propName === 'value') {\n const domValue = domNode[propName];\n if (domValue !== propValue &&\n (domNode['oninput-value']\n ? domValue === domNode['oninput-value']\n : propValue !== previousValue)) {\n domNode[propName] = propValue;\n domNode['oninput-value'] = undefined;\n }\n if (propValue !== previousValue) {\n propertiesUpdated = true;\n }\n }\n else if (propName !== 'key' && propValue !== previousValue) {\n const type = typeof propValue;\n if (type === 'function' && propName.lastIndexOf('on', 0) === 0 && includesEventsAndAttributes) {\n updateEvent(domNode, propName.substr(2), propValue, projectionOptions, properties.bind, previousValue);\n }\n else if (type === 'string' && propName !== 'innerHTML' && includesEventsAndAttributes) {\n updateAttribute(domNode, propName, propValue, projectionOptions);\n }\n else if (propName === 'scrollLeft' || propName === 'scrollTop') {\n if (domNode[propName] !== propValue) {\n domNode[propName] = propValue;\n }\n }\n else {\n domNode[propName] = propValue;\n }\n propertiesUpdated = true;\n }\n }\n }\n return propertiesUpdated;\n}\nfunction findIndexOfChild(children, sameAs, start) {\n for (let i = start; i < children.length; i++) {\n if (same(children[i], sameAs)) {\n return i;\n }\n }\n return -1;\n}\nexport function toParentVNode(domNode) {\n return {\n tag: '',\n properties: {},\n children: undefined,\n domNode,\n type: VNODE\n };\n}\nexport function toTextVNode(data) {\n return {\n tag: '',\n properties: {},\n children: undefined,\n text: `${data}`,\n domNode: undefined,\n type: VNODE\n };\n}\nfunction toInternalWNode(instance, instanceData) {\n return {\n instance,\n rendered: [],\n coreProperties: instanceData.coreProperties,\n children: instance.children,\n widgetConstructor: instance.constructor,\n properties: instanceData.inputProperties,\n type: WNODE\n };\n}\nexport function filterAndDecorateChildren(children, instance) {\n if (children === undefined) {\n return emptyArray;\n }\n children = Array.isArray(children) ? children : [children];\n for (let i = 0; i < children.length;) {\n const child = children[i];\n if (child === undefined || child === null) {\n children.splice(i, 1);\n continue;\n }\n else if (typeof child === 'string') {\n children[i] = toTextVNode(child);\n }\n else {\n if (isVNode(child)) {\n if (child.properties.bind === undefined) {\n child.properties.bind = instance;\n if (child.children && child.children.length > 0) {\n filterAndDecorateChildren(child.children, instance);\n }\n }\n }\n else {\n if (!child.coreProperties) {\n const instanceData = widgetInstanceMap.get(instance);\n child.coreProperties = {\n bind: instance,\n baseRegistry: instanceData.coreProperties.baseRegistry\n };\n }\n if (child.children && child.children.length > 0) {\n filterAndDecorateChildren(child.children, instance);\n }\n }\n }\n i++;\n }\n return children;\n}\nfunction nodeAdded(dnode, transitions) {\n if (isVNode(dnode) && dnode.properties) {\n const enterAnimation = dnode.properties.enterAnimation;\n if (enterAnimation) {\n if (typeof enterAnimation === 'function') {\n enterAnimation(dnode.domNode, dnode.properties);\n }\n else {\n transitions.enter(dnode.domNode, dnode.properties, enterAnimation);\n }\n }\n }\n}\nfunction nodeToRemove(dnode, transitions, projectionOptions) {\n if (isWNode(dnode)) {\n const item = instanceMap.get(dnode.instance);\n const rendered = (item ? item.dnode.rendered : dnode.rendered) || emptyArray;\n if (dnode.instance) {\n const instanceData = widgetInstanceMap.get(dnode.instance);\n instanceData.onDetach();\n instanceMap.delete(dnode.instance);\n }\n for (let i = 0; i < rendered.length; i++) {\n nodeToRemove(rendered[i], transitions, projectionOptions);\n }\n }\n else {\n const domNode = dnode.domNode;\n const properties = dnode.properties;\n if (dnode.children && dnode.children.length > 0) {\n for (let i = 0; i < dnode.children.length; i++) {\n nodeToRemove(dnode.children[i], transitions, projectionOptions);\n }\n }\n const exitAnimation = properties.exitAnimation;\n if (properties && exitAnimation) {\n domNode.style.pointerEvents = 'none';\n const removeDomNode = function () {\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\n dnode.domNode = undefined;\n };\n if (typeof exitAnimation === 'function') {\n exitAnimation(domNode, removeDomNode, properties);\n return;\n }\n else {\n transitions.exit(dnode.domNode, properties, exitAnimation, removeDomNode);\n return;\n }\n }\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\n dnode.domNode = undefined;\n }\n}\nfunction checkDistinguishable(childNodes, indexToCheck, parentInstance) {\n const childNode = childNodes[indexToCheck];\n if (isVNode(childNode) && !childNode.tag) {\n return; // Text nodes need not be distinguishable\n }\n const { key } = childNode.properties;\n if (key === undefined || key === null) {\n for (let i = 0; i < childNodes.length; i++) {\n if (i !== indexToCheck) {\n const node = childNodes[i];\n if (same(node, childNode)) {\n let nodeIdentifier;\n const parentName = parentInstance.constructor.name || 'unknown';\n if (isWNode(childNode)) {\n nodeIdentifier = childNode.widgetConstructor.name || 'unknown';\n }\n else {\n nodeIdentifier = childNode.tag;\n }\n console.warn(`A widget (${parentName}) has had a child addded or removed, but they were not able to uniquely identified. It is recommended to provide a unique 'key' property when using the same widget or element (${nodeIdentifier}) multiple times as siblings`);\n break;\n }\n }\n }\n }\n}\nfunction updateChildren(parentVNode, siblings, oldChildren, newChildren, parentInstance, projectionOptions) {\n oldChildren = oldChildren || emptyArray;\n newChildren = newChildren;\n const oldChildrenLength = oldChildren.length;\n const newChildrenLength = newChildren.length;\n const transitions = projectionOptions.transitions;\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\n let oldIndex = 0;\n let newIndex = 0;\n let i;\n let textUpdated = false;\n while (newIndex < newChildrenLength) {\n let oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : undefined;\n const newChild = newChildren[newIndex];\n if (isVNode(newChild) && typeof newChild.deferredPropertiesCallback === 'function') {\n newChild.inserted = isVNode(oldChild) && oldChild.inserted;\n addDeferredProperties(newChild, projectionOptions);\n }\n if (oldChild !== undefined && same(oldChild, newChild)) {\n oldIndex++;\n newIndex++;\n textUpdated =\n updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance, oldChildren.slice(oldIndex), newChildren.slice(newIndex)) || textUpdated;\n continue;\n }\n const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);\n const addChild = () => {\n let insertBeforeDomNode = undefined;\n let childrenArray = oldChildren;\n let nextIndex = oldIndex + 1;\n let child = oldChildren[oldIndex];\n if (!child) {\n child = siblings[0];\n nextIndex = 1;\n childrenArray = siblings;\n }\n if (child) {\n let insertBeforeChildren = [child];\n while (insertBeforeChildren.length) {\n const insertBefore = insertBeforeChildren.shift();\n if (isWNode(insertBefore)) {\n const item = instanceMap.get(insertBefore.instance);\n if (item && item.dnode.rendered) {\n insertBeforeChildren.push(...item.dnode.rendered);\n }\n }\n else {\n if (insertBefore.domNode) {\n if (insertBefore.domNode.parentElement !== parentVNode.domNode) {\n break;\n }\n insertBeforeDomNode = insertBefore.domNode;\n break;\n }\n }\n if (insertBeforeChildren.length === 0 && childrenArray[nextIndex]) {\n insertBeforeChildren.push(childrenArray[nextIndex]);\n nextIndex++;\n }\n }\n }\n createDom(newChild, parentVNode, newChildren.slice(newIndex + 1), insertBeforeDomNode, projectionOptions, parentInstance);\n nodeAdded(newChild, transitions);\n const indexToCheck = newIndex;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(newChildren, indexToCheck, parentInstance);\n });\n };\n if (!oldChild || findOldIndex === -1) {\n addChild();\n newIndex++;\n continue;\n }\n const removeChild = () => {\n const indexToCheck = oldIndex;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\n });\n if (isWNode(oldChild)) {\n const item = instanceMap.get(oldChild.instance);\n if (item) {\n oldChild = item.dnode;\n }\n }\n nodeToRemove(oldChild, transitions, projectionOptions);\n };\n const findNewIndex = findIndexOfChild(newChildren, oldChild, newIndex + 1);\n if (findNewIndex === -1) {\n removeChild();\n oldIndex++;\n continue;\n }\n addChild();\n removeChild();\n oldIndex++;\n newIndex++;\n }\n if (oldChildrenLength > oldIndex) {\n // Remove child fragments\n for (i = oldIndex; i < oldChildrenLength; i++) {\n const indexToCheck = i;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\n });\n let childToRemove = oldChildren[i];\n if (isWNode(childToRemove)) {\n const item = instanceMap.get(childToRemove.instance);\n if (item) {\n childToRemove = item.dnode;\n }\n }\n nodeToRemove(childToRemove, transitions, projectionOptions);\n }\n }\n return textUpdated;\n}\nfunction addChildren(parentVNode, children, projectionOptions, parentInstance, insertBefore = undefined, childNodes) {\n if (children === undefined) {\n return;\n }\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectorState.merge && childNodes === undefined) {\n childNodes = arrayFrom(parentVNode.domNode.childNodes);\n }\n const transitions = projectionOptions.transitions;\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n const nextSiblings = children.slice(i + 1);\n if (isVNode(child)) {\n if (projectorState.merge && childNodes) {\n let domElement = undefined;\n while (child.domNode === undefined && childNodes.length > 0) {\n domElement = childNodes.shift();\n if (domElement && domElement.tagName === (child.tag.toUpperCase() || undefined)) {\n child.domNode = domElement;\n }\n }\n }\n createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance);\n }\n else {\n createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes);\n }\n nodeAdded(child, transitions);\n }\n}\nfunction initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions) {\n addChildren(dnode, dnode.children, projectionOptions, parentInstance, undefined);\n if (typeof dnode.deferredPropertiesCallback === 'function' && dnode.inserted === undefined) {\n addDeferredProperties(dnode, projectionOptions);\n }\n if (dnode.attributes && dnode.events) {\n updateAttributes(domNode, {}, dnode.attributes, projectionOptions);\n updateProperties(domNode, {}, dnode.properties, projectionOptions, false);\n removeOrphanedEvents(domNode, {}, dnode.events, projectionOptions, true);\n const events = dnode.events;\n Object.keys(events).forEach((event) => {\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind);\n });\n }\n else {\n updateProperties(domNode, {}, dnode.properties, projectionOptions);\n }\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\n const instanceData = widgetInstanceMap.get(parentInstance);\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\n }\n dnode.inserted = true;\n}\nfunction createDom(dnode, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes) {\n let domNode;\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (isWNode(dnode)) {\n let { widgetConstructor } = dnode;\n const parentInstanceData = widgetInstanceMap.get(parentInstance);\n if (!isWidgetBaseConstructor(widgetConstructor)) {\n const item = parentInstanceData.registry().get(widgetConstructor);\n if (item === null) {\n return;\n }\n widgetConstructor = item;\n }\n const instance = new widgetConstructor();\n dnode.instance = instance;\n nextSiblingMap.set(instance, nextSiblings);\n const instanceData = widgetInstanceMap.get(instance);\n instanceData.invalidate = () => {\n instanceData.dirty = true;\n if (instanceData.rendering === false) {\n projectorState.renderQueue.push({ instance, depth: projectionOptions.depth });\n scheduleRender(projectionOptions);\n }\n };\n instanceData.rendering = true;\n instance.__setCoreProperties__(dnode.coreProperties);\n instance.__setChildren__(dnode.children);\n instance.__setProperties__(dnode.properties);\n const rendered = instance.__render__();\n instanceData.rendering = false;\n if (rendered) {\n const filteredRendered = filterAndDecorateChildren(rendered, instance);\n dnode.rendered = filteredRendered;\n addChildren(parentVNode, filteredRendered, projectionOptions, instance, insertBefore, childNodes);\n }\n instanceMap.set(instance, { dnode, parentVNode });\n instanceData.nodeHandler.addRoot();\n projectorState.afterRenderCallbacks.push(() => {\n instanceData.onAttach();\n });\n }\n else {\n if (projectorState.merge && projectorState.mergeElement !== undefined) {\n domNode = dnode.domNode = projectionOptions.mergeElement;\n projectorState.mergeElement = undefined;\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\n return;\n }\n const doc = parentVNode.domNode.ownerDocument;\n if (!dnode.tag && typeof dnode.text === 'string') {\n if (dnode.domNode !== undefined && parentVNode.domNode) {\n const newDomNode = dnode.domNode.ownerDocument.createTextNode(dnode.text);\n if (parentVNode.domNode === dnode.domNode.parentNode) {\n parentVNode.domNode.replaceChild(newDomNode, dnode.domNode);\n }\n else {\n parentVNode.domNode.appendChild(newDomNode);\n dnode.domNode.parentNode && dnode.domNode.parentNode.removeChild(dnode.domNode);\n }\n dnode.domNode = newDomNode;\n }\n else {\n domNode = dnode.domNode = doc.createTextNode(dnode.text);\n if (insertBefore !== undefined) {\n parentVNode.domNode.insertBefore(domNode, insertBefore);\n }\n else {\n parentVNode.domNode.appendChild(domNode);\n }\n }\n }\n else {\n if (dnode.domNode === undefined) {\n if (dnode.tag === 'svg') {\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\n }\n if (projectionOptions.namespace !== undefined) {\n domNode = dnode.domNode = doc.createElementNS(projectionOptions.namespace, dnode.tag);\n }\n else {\n domNode = dnode.domNode = dnode.domNode || doc.createElement(dnode.tag);\n }\n }\n else {\n domNode = dnode.domNode;\n }\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\n if (insertBefore !== undefined) {\n parentVNode.domNode.insertBefore(domNode, insertBefore);\n }\n else if (domNode.parentNode !== parentVNode.domNode) {\n parentVNode.domNode.appendChild(domNode);\n }\n }\n }\n}\nfunction updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance, oldNextSiblings, nextSiblings) {\n if (isWNode(dnode)) {\n const { instance } = previous;\n const { parentVNode, dnode: node } = instanceMap.get(instance);\n const previousRendered = node ? node.rendered : previous.rendered;\n const instanceData = widgetInstanceMap.get(instance);\n instanceData.rendering = true;\n instance.__setCoreProperties__(dnode.coreProperties);\n instance.__setChildren__(dnode.children);\n instance.__setProperties__(dnode.properties);\n nextSiblingMap.set(instance, nextSiblings);\n dnode.instance = instance;\n if (instanceData.dirty === true) {\n const rendered = instance.__render__();\n instanceData.rendering = false;\n dnode.rendered = filterAndDecorateChildren(rendered, instance);\n updateChildren(parentVNode, oldNextSiblings, previousRendered, dnode.rendered, instance, projectionOptions);\n }\n else {\n instanceData.rendering = false;\n dnode.rendered = previousRendered;\n }\n instanceMap.set(instance, { dnode, parentVNode });\n instanceData.nodeHandler.addRoot();\n }\n else {\n if (previous === dnode) {\n return false;\n }\n const domNode = (dnode.domNode = previous.domNode);\n let textUpdated = false;\n let updated = false;\n if (!dnode.tag && typeof dnode.text === 'string') {\n if (dnode.text !== previous.text) {\n const newDomNode = domNode.ownerDocument.createTextNode(dnode.text);\n domNode.parentNode.replaceChild(newDomNode, domNode);\n dnode.domNode = newDomNode;\n textUpdated = true;\n return textUpdated;\n }\n }\n else {\n if (dnode.tag && dnode.tag.lastIndexOf('svg', 0) === 0) {\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\n }\n if (previous.children !== dnode.children) {\n const children = filterAndDecorateChildren(dnode.children, parentInstance);\n dnode.children = children;\n updated =\n updateChildren(dnode, oldNextSiblings, previous.children, children, parentInstance, projectionOptions) || updated;\n }\n const previousProperties = buildPreviousProperties(domNode, previous, dnode);\n if (dnode.attributes && dnode.events) {\n updateAttributes(domNode, previousProperties.attributes, dnode.attributes, projectionOptions);\n updated =\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions, false) || updated;\n removeOrphanedEvents(domNode, previousProperties.events, dnode.events, projectionOptions, true);\n const events = dnode.events;\n Object.keys(events).forEach((event) => {\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind, previousProperties.events[event]);\n });\n }\n else {\n updated =\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions) ||\n updated;\n }\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\n const instanceData = widgetInstanceMap.get(parentInstance);\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\n }\n }\n if (updated && dnode.properties && dnode.properties.updateAnimation) {\n dnode.properties.updateAnimation(domNode, dnode.properties, previous.properties);\n }\n }\n}\nfunction addDeferredProperties(vnode, projectionOptions) {\n // transfer any properties that have been passed - as these must be decorated properties\n vnode.decoratedDeferredProperties = vnode.properties;\n const properties = vnode.deferredPropertiesCallback(!!vnode.inserted);\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n vnode.properties = Object.assign({}, properties, vnode.decoratedDeferredProperties);\n projectorState.deferredRenderCallbacks.push(() => {\n const properties = Object.assign({}, vnode.deferredPropertiesCallback(!!vnode.inserted), vnode.decoratedDeferredProperties);\n updateProperties(vnode.domNode, vnode.properties, properties, projectionOptions);\n vnode.properties = properties;\n });\n}\nfunction runDeferredRenderCallbacks(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectorState.deferredRenderCallbacks.length) {\n if (projectionOptions.sync) {\n while (projectorState.deferredRenderCallbacks.length) {\n const callback = projectorState.deferredRenderCallbacks.shift();\n callback && callback();\n }\n }\n else {\n global.requestAnimationFrame(() => {\n while (projectorState.deferredRenderCallbacks.length) {\n const callback = projectorState.deferredRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n }\n}\nfunction runAfterRenderCallbacks(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectionOptions.sync) {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n }\n else {\n if (global.requestIdleCallback) {\n global.requestIdleCallback(() => {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n else {\n setTimeout(() => {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n }\n}\nfunction scheduleRender(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectionOptions.sync) {\n render(projectionOptions);\n }\n else if (projectorState.renderScheduled === undefined) {\n projectorState.renderScheduled = global.requestAnimationFrame(() => {\n render(projectionOptions);\n });\n }\n}\nfunction render(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectorState.renderScheduled = undefined;\n const renderQueue = projectorState.renderQueue;\n const renders = [...renderQueue];\n projectorState.renderQueue = [];\n renders.sort((a, b) => a.depth - b.depth);\n const previouslyRendered = [];\n while (renders.length) {\n const { instance } = renders.shift();\n if (instanceMap.has(instance) && previouslyRendered.indexOf(instance) === -1) {\n previouslyRendered.push(instance);\n const { parentVNode, dnode } = instanceMap.get(instance);\n const instanceData = widgetInstanceMap.get(instance);\n const nextSiblings = nextSiblingMap.get(instance);\n updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance, nextSiblings, nextSiblings);\n }\n }\n runAfterRenderCallbacks(projectionOptions);\n runDeferredRenderCallbacks(projectionOptions);\n}\nexport const dom = {\n append: function (parentNode, instance, projectionOptions = {}) {\n const instanceData = widgetInstanceMap.get(instance);\n const finalProjectorOptions = getProjectionOptions(projectionOptions, instance);\n const projectorState = {\n afterRenderCallbacks: [],\n deferredRenderCallbacks: [],\n nodeMap: new WeakMap(),\n renderScheduled: undefined,\n renderQueue: [],\n merge: projectionOptions.merge || false,\n mergeElement: projectionOptions.mergeElement\n };\n projectorStateMap.set(instance, projectorState);\n finalProjectorOptions.rootNode = parentNode;\n const parentVNode = toParentVNode(finalProjectorOptions.rootNode);\n const node = toInternalWNode(instance, instanceData);\n instanceMap.set(instance, { dnode: node, parentVNode });\n instanceData.invalidate = () => {\n instanceData.dirty = true;\n if (instanceData.rendering === false) {\n projectorState.renderQueue.push({ instance, depth: finalProjectorOptions.depth });\n scheduleRender(finalProjectorOptions);\n }\n };\n updateDom(node, node, finalProjectorOptions, parentVNode, instance, [], []);\n projectorState.afterRenderCallbacks.push(() => {\n instanceData.onAttach();\n });\n runDeferredRenderCallbacks(finalProjectorOptions);\n runAfterRenderCallbacks(finalProjectorOptions);\n return {\n domNode: finalProjectorOptions.rootNode\n };\n },\n create: function (instance, projectionOptions) {\n return this.append(document.createElement('div'), instance, projectionOptions);\n },\n merge: function (element, instance, projectionOptions = {}) {\n projectionOptions.merge = true;\n projectionOptions.mergeElement = element;\n const projection = this.append(element.parentNode, instance, projectionOptions);\n const projectorState = projectorStateMap.get(instance);\n projectorState.merge = false;\n return projection;\n }\n};\n//# sourceMappingURL=vdom.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/vdom.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/vdom.mjs\n// module chunks = menu-item","/*** IMPORTS FROM imports-loader ***/\nvar widgetFactory = require(\"src/menu-item/MenuItem\");\n\nvar registerCustomElement = require('@dojo/framework/widget-core/registerCustomElement').default;\n\nvar defaultExport = widgetFactory.default;\ndefaultExport && registerCustomElement(defaultExport);\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/imports-loader?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js\n// module id = ./node_modules/imports-loader/index.js?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js\n// module chunks = menu-item","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/process/browser.js\n// module id = ./node_modules/process/browser.js\n// module chunks = menu-item","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)\r\n t[p[i]] = s[p[i]];\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = y[op[0] & 2 ? \"return\" : op[0] ? \"throw\" : \"next\"]) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [0, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { if (o[n]) i[n] = function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; }; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator];\r\n return m ? m.call(o) : typeof __values === \"function\" ? __values(o) : o[Symbol.iterator]();\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/tslib/tslib.es6.js\n// module id = ./node_modules/tslib/tslib.es6.js\n// module chunks = menu-item","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\n} catch(e) {\n\t// This works if the window reference is available\n\tif(typeof window === \"object\")\n\t\tg = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = ./node_modules/webpack/buildin/global.js\n// module chunks = menu-item","import { v } from '@dojo/framework/widget-core/d';\nimport { customElement } from '@dojo/framework/widget-core/decorators/customElement';\nimport { WidgetProperties } from '@dojo/framework/widget-core/interfaces';\nimport { theme, ThemedMixin } from '@dojo/framework/widget-core/mixins/Themed';\nimport { WidgetBase } from '@dojo/framework/widget-core/WidgetBase';\n\nimport * as css from './menuItem.m.css';\n\nexport interface MenuItemProperties extends WidgetProperties {\n\ttitle: string;\n\tselected?: boolean;\n\tdata?: any;\n\tonSelected?: (data: any) => void;\n}\n\n@customElement({\n\ttag: 'demo-menu-item',\n\tattributes: ['title', 'selected'],\n\tevents: ['onSelected'],\n\tproperties: ['data', 'selected']\n})\n@theme(css)\nexport class MenuItem extends ThemedMixin(WidgetBase) {\n\tprivate _onClick() {\n\t\tthis.properties.onSelected && this.properties.onSelected(this.properties.data);\n\t}\n\n\tprotected render() {\n\t\tconst { title, selected } = this.properties;\n\n\t\treturn v('li', { classes: this.theme(css.root) }, [\n\t\t\tv(\n\t\t\t\t'span',\n\t\t\t\t{\n\t\t\t\t\tclasses: this.theme([css.item, selected ? css.selected : null]),\n\t\t\t\t\tonclick: this._onClick\n\t\t\t\t},\n\t\t\t\t[title]\n\t\t\t)\n\t\t]);\n\t}\n}\n\nexport default MenuItem;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@dojo/webpack-contrib/css-module-dts-loader?type=ts&instanceName=0_menu-item!./src/menu-item/MenuItem.ts","// removed by extract-text-webpack-plugin\nmodule.exports = {\" _key\":\"test-app/menuItem\",\"root\":\"sUmUi4Sh\",\"item\":\"_2Mk6Rdqa\",\"selected\":\"_1-f3ItOh\"};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/menu-item/menuItem.m.css\n// module id = ./src/menu-item/menuItem.m.css\n// module chunks = menu-item"],"sourceRoot":""} \ No newline at end of file diff --git a/test-app/fixtures/unix/dist/menu/menu-1.0.0.js b/test-app/fixtures/unix/dist/menu/menu-1.0.0.js index 7d7e6dc..56bbb6d 100644 --- a/test-app/fixtures/unix/dist/menu/menu-1.0.0.js +++ b/test-app/fixtures/unix/dist/menu/menu-1.0.0.js @@ -6,7 +6,7 @@ * All rights reserved * */ -!function(e){var t={};function o(r){if(t[r])return t[r].exports;var s=t[r]={i:r,l:!1,exports:{}};return e[r].call(s.exports,s,s.exports,o),s.l=!0,s.exports}o.m=e,o.c=t,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}({"./node_modules/@dojo/core/Destroyable.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/core/lang.mjs"),s=o("./node_modules/@dojo/shim/Promise.mjs");function n(){return s.a.resolve(!1)}function i(){throw new Error("Call made to destroyed method")}class d{constructor(){this.handles=[]}own(e){const t=Array.isArray(e)?Object(r.b)(...e):e,{handles:o}=this;return o.push(t),{destroy(){o.splice(o.indexOf(t)),t.destroy()}}}destroy(){return new s.a(e=>{this.handles.forEach(e=>{e&&e.destroy&&e.destroy()}),this.destroy=n,this.own=i,e(!0)})}}t.a=d},"./node_modules/@dojo/core/Evented.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/Map.mjs"),s=o("./node_modules/@dojo/core/Destroyable.mjs");const n=new r.b;class i extends s.a{constructor(){super(...arguments),this.listenersMap=new r.b}emit(e){this.listenersMap.forEach((t,o)=>{(function(e,t){if("string"==typeof t&&"string"==typeof e&&-1!==e.indexOf("*")){let o;return n.has(e)?o=n.get(e):(o=new RegExp(`^${e.replace(/\*/g,".*")}$`),n.set(e,o)),o.test(t)}return e===t})(o,e.type)&&t.forEach(t=>{t.call(this,e)})})}on(e,t){if(Array.isArray(t)){const o=t.map(t=>this._addListener(e,t));return{destroy(){o.forEach(e=>e.destroy())}}}return this._addListener(e,t)}_addListener(e,t){const o=this.listenersMap.get(e)||[];return o.push(t),this.listenersMap.set(e,o),{destroy:()=>{const o=this.listenersMap.get(e)||[];o.splice(o.indexOf(t),1)}}}}t.a=i},"./node_modules/@dojo/core/lang.mjs":function(e,t,o){"use strict";t.b=function(...e){return function(e){let t=!1;return{destroy:function(){t||(t=!0,e())}}}(function(){for(let t=0;t{r[e]=t,delete n[e]},()=>{delete n[e]})}function u(e){let t;const o=e.toLowerCase();if(o in a)t=a[o];else if(s[o])t=r[o]=s[o].call(null),delete s[o];else{if(!(o in r)){if(e in n)return!1;throw new TypeError(`Attempt to detect unregistered has feature "${e}"`)}t=r[o]}return t}c("debug",!0),c("host-browser","undefined"!=typeof document&&"undefined"!=typeof location),c("host-node",function(){if("object"==typeof o&&o.versions&&o.versions.node)return o.versions.node})}).call(t,o("./node_modules/webpack/buildin/global.js"),o("./node_modules/process/browser.js"))},"./node_modules/@dojo/shim/Map.mjs":function(e,t,o){"use strict";o.d(t,"a",function(){return s});o("./node_modules/@dojo/shim/iterator.mjs");var r=o("./node_modules/@dojo/shim/global.mjs");o("./node_modules/@dojo/shim/object.mjs"),o("./node_modules/@dojo/shim/support/has.mjs"),o("./node_modules/@dojo/shim/Symbol.mjs");let s=r.a.Map;t.b=s},"./node_modules/@dojo/shim/Promise.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/global.mjs");o("./node_modules/@dojo/shim/support/queue.mjs"),o("./node_modules/@dojo/shim/Symbol.mjs"),o("./node_modules/@dojo/shim/support/has.mjs");let s=r.a.Promise;t.a=s},"./node_modules/@dojo/shim/Symbol.mjs":function(e,t,o){"use strict";o("./node_modules/@dojo/shim/support/has.mjs");var r=o("./node_modules/@dojo/shim/global.mjs"),s=o("./node_modules/@dojo/shim/support/util.mjs");let n=r.a.Symbol;["hasInstance","isConcatSpreadable","iterator","species","replace","search","split","match","toPrimitive","toStringTag","unscopables","observable"].forEach(e=>{n[e]||Object.defineProperty(n,e,Object(s.a)(n.for(e),!1,!1))}),t.a=n},"./node_modules/@dojo/shim/WeakMap.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/global.mjs");o("./node_modules/@dojo/shim/iterator.mjs"),o("./node_modules/@dojo/shim/support/has.mjs"),o("./node_modules/@dojo/shim/Symbol.mjs");let s=r.a.WeakMap;t.a=s},"./node_modules/@dojo/shim/array.mjs":function(e,t,o){"use strict";o.d(t,"a",function(){return n});var r=o("./node_modules/@dojo/shim/global.mjs"),s=(o("./node_modules/@dojo/shim/iterator.mjs"),o("./node_modules/@dojo/shim/number.mjs"),o("./node_modules/@dojo/shim/support/has.mjs"),o("./node_modules/@dojo/shim/support/util.mjs"));let n,i,d,a,c,u,l;n=r.a.Array.from,i=r.a.Array.of,d=Object(s.b)(r.a.Array.prototype.copyWithin),a=Object(s.b)(r.a.Array.prototype.fill),c=Object(s.b)(r.a.Array.prototype.find),u=Object(s.b)(r.a.Array.prototype.findIndex),l=Object(s.b)(r.a.Array.prototype.includes)},"./node_modules/@dojo/shim/global.mjs":function(e,t,o){"use strict";(function(e){const o=void 0!==e?e:"undefined"!=typeof window?window:"undefined"!=typeof self?self:void 0;t.a=o}).call(t,o("./node_modules/webpack/buildin/global.js"))},"./node_modules/@dojo/shim/iterator.mjs":function(e,t,o){"use strict";o("./node_modules/@dojo/shim/Symbol.mjs"),o("./node_modules/@dojo/shim/string.mjs")},"./node_modules/@dojo/shim/number.mjs":function(e,t,o){"use strict";o("./node_modules/@dojo/shim/global.mjs");Math.pow(2,53)},"./node_modules/@dojo/shim/object.mjs":function(e,t,o){"use strict";o.d(t,"a",function(){return s});var r=o("./node_modules/@dojo/shim/global.mjs");o("./node_modules/@dojo/shim/support/has.mjs"),o("./node_modules/@dojo/shim/Symbol.mjs");let s,n,i,d,a,c,u,l,h;{const e=r.a.Object;s=e.assign,n=e.getOwnPropertyDescriptor,i=e.getOwnPropertyNames,d=e.getOwnPropertySymbols,a=e.is,c=e.keys}{const e=r.a.Object;u=e.getOwnPropertyDescriptors,l=e.entries,h=e.values}},"./node_modules/@dojo/shim/string.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/global.mjs"),s=(o("./node_modules/@dojo/shim/support/has.mjs"),o("./node_modules/@dojo/shim/support/util.mjs"));t.b=55296;t.a=56319;let n,i,d,a,c,u,l,h,p,m;n=r.a.String.fromCodePoint,i=r.a.String.raw,d=Object(s.b)(r.a.String.prototype.codePointAt),a=Object(s.b)(r.a.String.prototype.endsWith),c=Object(s.b)(r.a.String.prototype.includes),u=Object(s.b)(r.a.String.prototype.normalize),l=Object(s.b)(r.a.String.prototype.repeat),h=Object(s.b)(r.a.String.prototype.startsWith),p=Object(s.b)(r.a.String.prototype.padEnd),m=Object(s.b)(r.a.String.prototype.padStart)},"./node_modules/@dojo/shim/support/has.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/has/has.mjs"),s=o("./node_modules/@dojo/shim/global.mjs");r.b;Object(r.a)("es6-array",()=>["from","of"].every(e=>e in s.a.Array)&&["findIndex","find","copyWithin"].every(e=>e in s.a.Array.prototype),!0),Object(r.a)("es6-array-fill",()=>"fill"in s.a.Array.prototype&&1===[1].fill(9,Number.POSITIVE_INFINITY)[0],!0),Object(r.a)("es7-array",()=>"includes"in s.a.Array.prototype,!0),Object(r.a)("es6-map",()=>{if("function"==typeof s.a.Map)try{const e=new s.a.Map([[0,1]]);return e.has(0)&&"function"==typeof e.keys&&"function"==typeof e.values&&"function"==typeof e.entries}catch(e){return!1}return!1},!0),Object(r.a)("es6-math",()=>["clz32","sign","log10","log2","log1p","expm1","cosh","sinh","tanh","acosh","asinh","atanh","trunc","fround","cbrt","hypot"].every(e=>"function"==typeof s.a.Math[e]),!0),Object(r.a)("es6-math-imul",()=>"imul"in s.a.Math&&-5===Math.imul(4294967295,5),!0),Object(r.a)("es6-object",()=>["assign","is","getOwnPropertySymbols","setPrototypeOf"].every(e=>"function"==typeof s.a.Object[e]),!0),Object(r.a)("es2017-object",()=>["values","entries","getOwnPropertyDescriptors"].every(e=>"function"==typeof s.a.Object[e]),!0),Object(r.a)("es-observable",()=>void 0!==s.a.Observable,!0),Object(r.a)("es6-promise",()=>void 0!==s.a.Promise&&!0,!0),Object(r.a)("es6-set",()=>{if("function"==typeof s.a.Set){const e=new s.a.Set([1]);return e.has(1)&&"keys"in e&&"function"==typeof e.keys&&!0}return!1},!0),Object(r.a)("es6-string",()=>["fromCodePoint"].every(e=>"function"==typeof s.a.String[e])&&["codePointAt","normalize","repeat","startsWith","endsWith","includes"].every(e=>"function"==typeof s.a.String.prototype[e]),!0),Object(r.a)("es6-string-raw",()=>{function e(e,...t){const o=[...e];return o.raw=e.raw,o}if("raw"in s.a.String){let t=e`a\n${1}`;return t.raw=["a\\n"],"a:\\n"===s.a.String.raw(t,42)}return!1},!0),Object(r.a)("es2017-string",()=>["padStart","padEnd"].every(e=>"function"==typeof s.a.String.prototype[e]),!0),Object(r.a)("es6-symbol",()=>void 0!==s.a.Symbol&&"symbol"==typeof Symbol(),!0),Object(r.a)("es6-weakmap",()=>{if(void 0!==s.a.WeakMap){const e={},t={},o=new s.a.WeakMap([[e,1]]);return Object.freeze(e),1===o.get(e)&&o.set(t,2)===o&&!0}return!1},!0),Object(r.a)("microtasks",()=>!0,!0),Object(r.a)("postmessage",()=>void 0!==s.a.window&&"function"==typeof s.a.postMessage,!0),Object(r.a)("raf",()=>"function"==typeof s.a.requestAnimationFrame,!0),Object(r.a)("setimmediate",()=>void 0!==s.a.setImmediate,!0),Object(r.a)("dom-mutationobserver",()=>{if(Boolean(s.a.MutationObserver||s.a.WebKitMutationObserver)){const e=document.createElement("div"),t=new(s.a.MutationObserver||s.a.WebKitMutationObserver)(function(){});return t.observe(e,{attributes:!0}),e.style.setProperty("display","block"),Boolean(t.takeRecords().length)}return!1},!0),Object(r.a)("dom-webanimation",()=>void 0!==s.a.Animation&&void 0!==s.a.KeyframeEffect,!0)},"./node_modules/@dojo/shim/support/queue.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/global.mjs");o("./node_modules/@dojo/shim/support/has.mjs");function s(e){e&&e.isActive&&e.callback&&e.callback()}function n(e,t){return{destroy:function(){this.destroy=function(){},e.isActive=!1,e.callback=null,t&&t()}}}!function(){let e,t;{const e=[];r.a.addEventListener("message",function(t){t.source===r.a&&"dojo-queue-message"===t.data&&(t.stopPropagation(),e.length&&s(e.shift()))}),t=function(t){e.push(t),r.a.postMessage("dojo-queue-message","*")}}function o(o){const r={isActive:!0,callback:o},s=t(r);return n(r,e&&function(){e(s)})}}();!function(){function e(e){const t={isActive:!0,callback:e},o=requestAnimationFrame(s.bind(null,t));return n(t,function(){cancelAnimationFrame(o)})}}();!function(){let e;e=function(e){r.a.Promise.resolve(e).then(s)}}()},"./node_modules/@dojo/shim/support/util.mjs":function(e,t,o){"use strict";t.a=function(e,t=!1,o=!0,r=!0){return{value:e,enumerable:t,writable:o,configurable:r}},t.b=function(e){return function(t,...o){return e.apply(t,o)}}},"./node_modules/@dojo/widget-core/Injector.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/core/Evented.mjs");class s extends r.a{constructor(e){super(),this._payload=e}setInvalidator(e){this._invalidator=e}get(){return this._payload}set(e){this._payload=e,this._invalidator&&this._invalidator()}}t.a=s},"./node_modules/@dojo/widget-core/NodeHandler.mjs":function(e,t,o){"use strict";var r,s=o("./node_modules/@dojo/core/Evented.mjs"),n=o("./node_modules/@dojo/shim/Map.mjs");!function(e){e.Projector="Projector",e.Widget="Widget"}(r||(r={}));t.a=class extends s.a{constructor(){super(...arguments),this._nodeMap=new n.b}get(e){return this._nodeMap.get(e)}has(e){return this._nodeMap.has(e)}add(e,t){this._nodeMap.set(t,e),this.emit({type:t})}addRoot(){this.emit({type:r.Widget})}addProjector(){this.emit({type:r.Projector})}clear(){this._nodeMap.clear()}}},"./node_modules/@dojo/widget-core/Registry.mjs":function(e,t,o){"use strict";t.d=a;var r=o("./node_modules/@dojo/shim/Promise.mjs"),s=o("./node_modules/@dojo/shim/Map.mjs"),n=o("./node_modules/@dojo/shim/Symbol.mjs"),i=o("./node_modules/@dojo/core/Evented.mjs");const d=Object(n.a)("Widget Base");function a(e){return Boolean(e&&e._type===d)}t.b=d;class c extends i.a{emitLoadedEvent(e,t){this.emit({type:e,action:"loaded",item:t})}define(e,t){if(void 0===this._widgetRegistry&&(this._widgetRegistry=new s.b),this._widgetRegistry.has(e))throw new Error(`widget has already been registered for '${e.toString()}'`);this._widgetRegistry.set(e,t),t instanceof r.a?t.then(t=>(this._widgetRegistry.set(e,t),this.emitLoadedEvent(e,t),t),e=>{throw e}):a(t)&&this.emitLoadedEvent(e,t)}defineInjector(e,t){if(void 0===this._injectorRegistry&&(this._injectorRegistry=new s.b),this._injectorRegistry.has(e))throw new Error(`injector has already been registered for '${e.toString()}'`);const o=new i.a,r={injector:t(()=>o.emit({type:"invalidate"})),invalidator:o};this._injectorRegistry.set(e,r),this.emitLoadedEvent(e,r)}get(e){if(!this._widgetRegistry||!this.has(e))return null;const t=this._widgetRegistry.get(e);if(a(t))return t;if(t instanceof r.a)return null;const o=t();return this._widgetRegistry.set(e,o),o.then(t=>((function(e){return Boolean(e&&e.hasOwnProperty("__esModule")&&e.hasOwnProperty("default")&&a(e.default))})(t)&&(t=t.default),this._widgetRegistry.set(e,t),this.emitLoadedEvent(e,t),t),e=>{throw e}),null}getInjector(e){return this._injectorRegistry&&this.hasInjector(e)?this._injectorRegistry.get(e):null}has(e){return Boolean(this._widgetRegistry&&this._widgetRegistry.has(e))}hasInjector(e){return Boolean(this._injectorRegistry&&this._injectorRegistry.has(e))}}t.a=c,t.c=c},"./node_modules/@dojo/widget-core/RegistryHandler.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/Map.mjs"),s=o("./node_modules/@dojo/core/Evented.mjs"),n=o("./node_modules/@dojo/widget-core/Registry.mjs");t.a=class extends s.a{constructor(){super(),this._registry=new n.a,this._registryWidgetLabelMap=new r.a,this._registryInjectorLabelMap=new r.a,this.own(this._registry),this.own({destroy:()=>{this.baseRegistry&&(this._registryWidgetLabelMap.delete(this.baseRegistry),this._registryInjectorLabelMap.delete(this.baseRegistry),this.baseRegistry=void 0)}})}set base(e){this.baseRegistry&&(this._registryWidgetLabelMap.delete(this.baseRegistry),this._registryInjectorLabelMap.delete(this.baseRegistry)),this.baseRegistry=e}define(e,t){this._registry.define(e,t)}defineInjector(e,t){this._registry.defineInjector(e,t)}has(e){return this._registry.has(e)||Boolean(this.baseRegistry&&this.baseRegistry.has(e))}hasInjector(e){return this._registry.hasInjector(e)||Boolean(this.baseRegistry&&this.baseRegistry.hasInjector(e))}get(e,t=!1){return this._get(e,t,"get",this._registryWidgetLabelMap)}getInjector(e,t=!1){return this._get(e,t,"getInjector",this._registryInjectorLabelMap)}_get(e,t,o,r){const s=t?[this.baseRegistry,this._registry]:[this._registry,this.baseRegistry];for(let n=0;n{"loaded"===r.action&&this[o](e,t)===r.item&&this.emit({type:"invalidate"})});this.own(s),r.set(i,[...a,e])}}return null}}},"./node_modules/@dojo/widget-core/WidgetBase.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/Map.mjs"),s=o("./node_modules/@dojo/shim/WeakMap.mjs"),n=o("./node_modules/@dojo/shim/Symbol.mjs"),i=o("./node_modules/@dojo/widget-core/d.mjs"),d=o("./node_modules/@dojo/widget-core/diff.mjs"),a=o("./node_modules/@dojo/widget-core/RegistryHandler.mjs"),c=o("./node_modules/@dojo/widget-core/NodeHandler.mjs"),u=o("./node_modules/@dojo/widget-core/vdom.mjs"),l=o("./node_modules/@dojo/widget-core/Registry.mjs");const h=new r.b,p=d.a.bind(null),m=n.a.for("dojoNoBind");t.b=m;class f{constructor(){this._initialProperties=!0,this._changedPropertyKeys=[],this._nodeHandler=new c.a,this._handles=[],this._children=[],this._decoratorCache=new r.b,this._properties={},this._boundRenderFunc=this.render.bind(this),this._boundInvalidate=this.invalidate.bind(this),u.b.set(this,{dirty:!0,onAttach:()=>{this.onAttach()},onDetach:()=>{this.onDetach(),this.destroy()},nodeHandler:this._nodeHandler,registry:()=>this.registry,coreProperties:{},rendering:!1,inputProperties:{}}),this._runAfterConstructors()}meta(e){void 0===this._metaMap&&(this._metaMap=new r.b);let t=this._metaMap.get(e);return t||(t=new e({invalidate:this._boundInvalidate,nodeHandler:this._nodeHandler,bind:this}),this.own(t),this._metaMap.set(e,t)),t}onAttach(){}onDetach(){}get properties(){return this._properties}get changedPropertyKeys(){return[...this._changedPropertyKeys]}__setCoreProperties__(e){const{baseRegistry:t}=e,o=u.b.get(this);o.coreProperties.baseRegistry!==t&&(void 0===this._registry&&(this._registry=new a.a,this.own(this._registry),this.own(this._registry.on("invalidate",this._boundInvalidate))),this._registry.base=t,this.invalidate()),o.coreProperties=e}__setProperties__(e){const t=u.b.get(this);t.inputProperties=e;const o=this._runBeforeProperties(e),r=this.getDecorator("registeredDiffProperty"),s=[],n=Object.keys(o);if(!1===this._initialProperties||0!==r.length){const e=[...n,...Object.keys(this._properties)],i=[],d={};let a=!1;for(let n=0;n{e.changed&&t.call(this,e.previousProperties,e.newProperties)}),this._properties=d,this._changedPropertyKeys=s}else{this._initialProperties=!1;for(let e=0;e0&&this.invalidate()}get children(){return this._children}__setChildren__(e){(this._children.length>0||e.length>0)&&(this._children=e,this.invalidate())}__render__(){u.b.get(this).dirty=!1;let e=this._runBeforeRenders()();return e=this.runAfterRenders(e),this._nodeHandler.clear(),e}invalidate(){const e=u.b.get(this);e.invalidate&&e.invalidate()}render(){return Object(i.g)("div",{},this.children)}addDecorator(e,t){if(t=Array.isArray(t)?t:[t],this.hasOwnProperty("constructor")){let o=h.get(this.constructor);o||(o=new r.b,h.set(this.constructor,o));let s=o.get(e);s||(s=[],o.set(e,s)),s.push(...t)}else{const o=this.getDecorator(e);this._decoratorCache.set(e,[...o,...t])}}_buildDecoratorList(e){const t=[];let o=this.constructor;for(;o;){const r=h.get(o);if(r){const o=r.get(e);o&&t.unshift(...o)}o=Object.getPrototypeOf(o)}return t}getDecorator(e){let t=this._decoratorCache.get(e);return void 0!==t?t:(t=this._buildDecoratorList(e),this._decoratorCache.set(e,t),t)}_mapDiffPropertyReactions(e,t){return this.getDecorator("diffReaction").reduce((o,{reaction:r,propertyName:s})=>{let n=o.get(r);return void 0===n&&(n={previousProperties:{},newProperties:{},changed:!1}),n.previousProperties[s]=this._properties[s],n.newProperties[s]=e[s],-1!==t.indexOf(s)&&(n.changed=!0),o.set(r,n),o},new r.b)}_bindFunctionProperty(e,t){if("function"==typeof e&&!e[m]&&!1===Object(l.d)(e)){void 0===this._bindFunctionPropertyMap&&(this._bindFunctionPropertyMap=new s.a);const o=this._bindFunctionPropertyMap.get(e)||{};let{boundFunc:r,scope:n}=o;return void 0!==r&&n===t||(r=e.bind(t),this._bindFunctionPropertyMap.set(e,{boundFunc:r,scope:t})),r}return e}get registry(){return void 0===this._registry&&(this._registry=new a.a,this.own(this._registry),this.own(this._registry.on("invalidate",this._boundInvalidate))),this._registry}_runBeforeProperties(e){const t=this.getDecorator("beforeProperties");return t.length>0?t.reduce((e,t)=>Object.assign({},e,t.call(this,e)),Object.assign({},e)):e}_runBeforeRenders(){const e=this.getDecorator("beforeRender");return e.length>0?e.reduce((e,t)=>{const o=t.call(this,e,this._properties,this._children);return o||(console.warn("Render function not returned from beforeRender, using previous render"),e)},this._boundRenderFunc):this._boundRenderFunc}runAfterRenders(e){const t=this.getDecorator("afterRender");return t.length>0?t.reduce((e,t)=>t.call(this,e),e):(void 0!==this._metaMap&&this._metaMap.forEach(e=>{e.afterRender()}),e)}_runAfterConstructors(){const e=this.getDecorator("afterConstructor");e.length>0&&e.forEach(e=>e.call(this))}own(e){this._handles.push(e)}destroy(){for(;this._handles.length>0;){const e=this._handles.pop();e&&e.destroy()}}}t.a=f,f._type=l.b},"./node_modules/@dojo/widget-core/animations/cssTransitions.mjs":function(e,t,o){"use strict";let r="",s="";function n(e){""===s&&function(e){if("WebkitTransition"in e.style)r="webkitTransitionEnd",s="webkitAnimationEnd";else{if(!("transition"in e.style||"MozTransition"in e.style))throw new Error("Your browser is not supported");r="transitionend",s="animationend"}}(e)}function i(e,t,o){n(e);let i=!1,d=function(){i||(i=!0,e.removeEventListener(r,d),e.removeEventListener(s,d),o())};t(),e.addEventListener(s,d),e.addEventListener(r,d)}t.a={enter:function(e,t,o){const r=t.enterAnimationActive||`${o}-active`;i(e,()=>{e.classList.add(o),requestAnimationFrame(function(){e.classList.add(r)})},()=>{e.classList.remove(o),e.classList.remove(r)})},exit:function(e,t,o,r){const s=t.exitAnimationActive||`${o}-active`;i(e,()=>{e.classList.add(o),requestAnimationFrame(function(){e.classList.add(s)})},()=>{r()})}}},"./node_modules/@dojo/widget-core/d.mjs":function(e,t,o){"use strict";t.f=d,t.e=a,t.d=function(e){return Boolean(e&&"string"!=typeof e&&e.type===i)},t.h=function(e,t,o=[]){return{children:o,widgetConstructor:e,properties:t,type:s}},t.g=function(e,t={},o){let r,s=t;Array.isArray(t)&&(o=t,s={});"function"==typeof s&&(r=s,s={});return{tag:e,deferredPropertiesCallback:r,children:o,properties:s,type:n}},t.c=function({node:e,attrs:t={},props:o={},on:r={},diffType:s="none"},n){return{tag:c(e)?e.tagName.toLowerCase():"",properties:o,attributes:t,events:r,children:n,type:i,domNode:e,text:c(e)?void 0:e.data,diffType:s}};var r=o("./node_modules/@dojo/shim/Symbol.mjs");const s=Object(r.a)("Identifier for a WNode.");t.b=s;const n=Object(r.a)("Identifier for a VNode.");t.a=n;const i=Object(r.a)("Identifier for a VNode created using existing dom.");function d(e){return Boolean(e&&"string"!=typeof e&&e.type===s)}function a(e){return Boolean(e&&"string"!=typeof e&&(e.type===n||e.type===i))}function c(e){return!!e.tagName}},"./node_modules/@dojo/widget-core/decorators/afterRender.mjs":function(e,t,o){"use strict";t.a=s;var r=o("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs");function s(e){return Object(r.a)((t,o)=>{t.addDecorator("afterRender",o?t[o]:e)})}},"./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs":function(e,t,o){"use strict";t.a=n;var r=o("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"),s=o("./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs");function n(){return Object(r.a)((e,t)=>{Object(s.a)(function(){this.invalidate()})(e)})}},"./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs":function(e,t,o){"use strict";t.a=s;var r=o("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs");function s(e){return Object(r.a)((t,o)=>{t.addDecorator("beforeProperties",o?t[o]:e)})}},"./node_modules/@dojo/widget-core/decorators/customElement.mjs":function(e,t,o){"use strict";t.a=n;var r=o("./node_modules/@dojo/widget-core/registerCustomElement.mjs"),s=o("./node_modules/@dojo/widget-core/Registry.mjs");function n({tag:e,properties:t=[],attributes:o=[],events:n=[],childType:i=r.CustomElementChildType.DOJO,registryFactory:d=(()=>new s.c)}){return function(r){r.prototype.__customElementDescriptor={tagName:e,attributes:o,properties:t,events:n,childType:i,registryFactory:d}}}},"./node_modules/@dojo/widget-core/decorators/diffProperty.mjs":function(e,t,o){"use strict";t.a=s;var r=o("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs");function s(e,t,o){return Object(r.a)((r,s)=>{r.addDecorator(`diffProperty:${e}`,t.bind(null)),r.addDecorator("registeredDiffProperty",e),(o||s)&&r.addDecorator("diffReaction",{propertyName:e,reaction:s?r[s]:o})})}},"./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs":function(e,t,o){"use strict";function r(e){return function(t,o,r){"function"==typeof t?e(t.prototype,void 0):e(t,o)}}t.a=r},"./node_modules/@dojo/widget-core/decorators/inject.mjs":function(e,t,o){"use strict";t.a=d;var r=o("./node_modules/@dojo/shim/WeakMap.mjs"),s=o("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"),n=o("./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs");const i=new r.a;function d({name:e,getProperties:t}){return Object(s.a)((o,r)=>{Object(n.a)(function(o){const r=this.registry.getInjector(e);if(r){const{injector:e,invalidator:s}=r,n=i.get(this)||[];return 0===n.length&&i.set(this,n),-1===n.indexOf(r)&&(this.own(s.on("invalidate",()=>{this.invalidate()})),n.push(r)),t(e(),o)}})(o)})}},"./node_modules/@dojo/widget-core/diff.mjs":function(e,t,o){"use strict";t.b=i,t.a=function(e,t){let o;o="function"==typeof t?t._type===r.b?n(e,t):function(e,t){return{changed:!1,value:t}}(0,t):s(t)?i(e,t):n(e,t);return o};var r=o("./node_modules/@dojo/widget-core/Registry.mjs");function s(e){return"[object Object]"===Object.prototype.toString.call(e)||Array.isArray(e)}function n(e,t){return{changed:e!==t,value:t}}function i(e,t){let o=!1;const r=e&&s(e),n=t&&s(t);if(!r||!n)return{changed:!0,value:t};const i=Object.keys(e),d=Object.keys(t);return{changed:o=i.length!==d.length||d.some(o=>t[o]!==e[o]),value:t}}},"./node_modules/@dojo/widget-core/mixins/Projector.mjs":function(e,t,o){"use strict";t.a=l;var r,s,n=o("./node_modules/tslib/tslib.es6.js"),i=o("./node_modules/@dojo/core/lang.mjs"),d=o("./node_modules/@dojo/widget-core/animations/cssTransitions.mjs"),a=o("./node_modules/@dojo/widget-core/decorators/afterRender.mjs"),c=o("./node_modules/@dojo/widget-core/d.mjs"),u=o("./node_modules/@dojo/widget-core/vdom.mjs");function l(e){class t extends e{constructor(...e){super(...e),this._root=document.body,this._async=!0,this._projectorProperties={},this._projectionOptions={transitions:d.a},this.root=document.body,this.projectorState=r.Detached}append(e){const t={type:s.Append,root:e};return this._attach(t)}merge(e){const t={type:s.Merge,root:e};return this._attach(t)}set root(e){if(this.projectorState===r.Attached)throw new Error("Projector already attached, cannot change root element");this._root=e}get root(){return this._root}get async(){return this._async}set async(e){if(this.projectorState===r.Attached)throw new Error("Projector already attached, cannot change async mode");this._async=e}sandbox(e=document){if(this.projectorState===r.Attached)throw new Error("Projector already attached, cannot create sandbox");this._async=!1;const t=this.root;this.own({destroy:()=>{this._root=t}}),this._attach({root:e.createDocumentFragment(),type:s.Append})}setChildren(e){this.__setChildren__(e)}setProperties(e){this.__setProperties__(e)}__setProperties__(e){this._projectorProperties&&this._projectorProperties.registry!==e.registry&&this._projectorProperties.registry&&this._projectorProperties.registry.destroy(),this._projectorProperties=Object(i.a)({},e),super.__setCoreProperties__({bind:this,baseRegistry:e.registry}),super.__setProperties__(e)}toHtml(){if(this.projectorState!==r.Attached||!this._projection)throw new Error("Projector is not attached, cannot return an HTML string of projection.");return this._projection.domNode.childNodes[0].outerHTML}afterRender(e){let t=e;return"string"!=typeof e&&null!==e&&void 0!==e||(t=Object(c.g)("span",{},[e])),t}destroy(){super.destroy()}_attach({type:e,root:t}){if(t&&(this.root=t),this._attachHandle)return this._attachHandle;this.projectorState=r.Attached;const o={destroy:()=>{this.projectorState===r.Attached&&(this._projection=void 0,this.projectorState=r.Detached)}};switch(this.own(o),this._attachHandle=o,this._projectionOptions=Object.assign({},this._projectionOptions,{sync:!this._async}),e){case s.Append:this._projection=u.a.append(this.root,this,this._projectionOptions);break;case s.Merge:this._projection=u.a.merge(this.root,this,this._projectionOptions)}return this._attachHandle}}return n.a([Object(a.a)(),n.b("design:type",Function),n.b("design:paramtypes",[Object]),n.b("design:returntype",void 0)],t.prototype,"afterRender",null),t}!function(e){e[e.Attached=1]="Attached",e[e.Detached=2]="Detached"}(r||(r={})),function(e){e[e.Append=1]="Append",e[e.Merge=2]="Merge"}(s||(s={}))},"./node_modules/@dojo/widget-core/mixins/Themed.mjs":function(e,t,o){"use strict";t.c=function(e){return Object(i.a)(t=>{t.addDecorator("baseThemeClasses",e)})},t.b=function(e,t){const o=new s.a(e);return t.defineInjector(u,e=>(o.setInvalidator(e),()=>o.get())),o},t.a=l;var r=o("./node_modules/tslib/tslib.es6.js"),s=o("./node_modules/@dojo/widget-core/Injector.mjs"),n=o("./node_modules/@dojo/widget-core/decorators/inject.mjs"),i=o("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"),d=o("./node_modules/@dojo/widget-core/decorators/diffProperty.mjs"),a=o("./node_modules/@dojo/widget-core/diff.mjs");const c=" _key",u=Symbol("theme");function l(e){let t=class extends e{constructor(){super(...arguments),this._registeredBaseThemeKeys=[],this._recalculateClasses=!0,this._theme={}}theme(e){return this._recalculateClasses&&this._recalculateThemeClasses(),Array.isArray(e)?e.map(e=>this._getThemeClass(e)):this._getThemeClass(e)}onPropertiesChanged(){this._recalculateClasses=!0}_getThemeClass(e){if(void 0===e||null===e)return e;const t=this.properties.extraClasses||{},o=this._baseThemeClassesReverseLookup[e];let r=[];return o?(t[o]&&r.push(t[o]),this._theme[o]?r.push(this._theme[o]):r.push(this._registeredBaseTheme[o]),r.join(" ")):(console.warn(`Class name: '${e}' not found in theme`),null)}_recalculateThemeClasses(){const{theme:e={}}=this.properties,t=this.getDecorator("baseThemeClasses");this._registeredBaseTheme||(this._registeredBaseTheme=t.reduce((e,t)=>{const o=c,s=t[o],n=r.c(t,["symbol"==typeof o?o:o+""]);return this._registeredBaseThemeKeys.push(s),Object.assign({},e,n)},{}),this._baseThemeClassesReverseLookup=t.reduce((e,t)=>(Object.keys(t).forEach(o=>{e[t[o]]=o}),e),{})),this._theme=this._registeredBaseThemeKeys.reduce((t,o)=>Object.assign({},t,e[o]),{}),this._recalculateClasses=!1}};return r.a([Object(d.a)("theme",a.b),Object(d.a)("extraClasses",a.b),r.b("design:type",Function),r.b("design:paramtypes",[]),r.b("design:returntype",void 0)],t.prototype,"onPropertiesChanged",null),t=r.a([Object(n.a)({name:u,getProperties:(e,t)=>t.theme?{}:{theme:e}})],t)}},"./node_modules/@dojo/widget-core/registerCustomElement.mjs":function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),o.d(t,"CustomElementChildType",function(){return r}),t.DomToWidgetWrapper=h,t.create=p,t.register=m;var r,s=o("./node_modules/tslib/tslib.es6.js"),n=o("./node_modules/@dojo/widget-core/WidgetBase.mjs"),i=o("./node_modules/@dojo/widget-core/mixins/Projector.mjs"),d=o("./node_modules/@dojo/shim/array.mjs"),a=o("./node_modules/@dojo/widget-core/d.mjs"),c=o("./node_modules/@dojo/shim/global.mjs"),u=o("./node_modules/@dojo/widget-core/mixins/Themed.mjs"),l=o("./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs");function h(e){let t=class extends n.a{render(){const t=Object.keys(this.properties).reduce((e,t)=>{const o=this.properties[t];return 0===t.indexOf("on")&&(t=`__${t}`),e[t]=o,e},{});return Object(a.c)({node:e,props:t,diffType:"dom"})}static get domNode(){return e}};return t=s.a([Object(l.a)()],t)}function p(e,t){const{attributes:o,childType:s,registryFactory:l}=e,p={};return o.forEach(e=>{const t=e.toLowerCase();p[t]=e}),class extends HTMLElement{constructor(){super(...arguments),this._properties={},this._children=[],this._eventProperties={},this._initialised=!1}connectedCallback(){if(this._initialised)return;const o={},{attributes:p,properties:m,events:f}=e;this._properties=Object.assign({},this._properties,this._attributesToProperties(p)),[...p,...m].forEach(e=>{const t=this[e],r=e.replace(/^on/,"__");void 0!==t&&(this._properties[e]=t),r!==e&&(o[r]={get:()=>this._getProperty(e),set:t=>this._setProperty(e,t)}),o[e]={get:()=>this._getProperty(e),set:t=>this._setProperty(e,t)}}),f.forEach(e=>{const t=e.replace(/^on/,"").toLowerCase(),r=e.replace(/^on/,"__on");o[r]={get:()=>this._getEventProperty(e),set:t=>this._setEventProperty(e,t)},this._eventProperties[e]=void 0,this._properties[e]=((...o)=>{const r=this._getEventProperty(e);"function"==typeof r&&r(...o),this.dispatchEvent(new CustomEvent(t,{bubbles:!1,detail:o}))})}),Object.defineProperties(this,o);const g=s===r.TEXT?this.childNodes:this.children;Object(d.a)(g).forEach(e=>{s===r.DOJO?(e.addEventListener("dojo-ce-render",()=>this._render()),e.addEventListener("dojo-ce-connected",()=>this._render()),this._children.push(h(e))):this._children.push(Object(a.c)({node:e,diffType:"dom"}))}),this.addEventListener("dojo-ce-connected",e=>this._childConnected(e));const j=this._properties,_=()=>this.__children__(),y=l(),b=Object(u.b)(this._getTheme(),y);c.a.addEventListener("dojo-theme-set",()=>b.set(this._getTheme()));const v=Object(i.a)(class extends n.a{render(){return Object(a.h)(t,j,_())}});this._projector=new v,this._projector.setProperties({registry:y}),this._projector.append(this),this._initialised=!0,this.dispatchEvent(new CustomEvent("dojo-ce-connected",{bubbles:!0,detail:this}))}_getTheme(){if(c.a&&c.a.dojoce&&c.a.dojoce.theme)return c.a.dojoce.themes[c.a.dojoce.theme]}_childConnected(e){const t=e.detail;if(t.parentNode===this){this._children.some(e=>e.domNode===t)||(t.addEventListener("dojo-ce-render",()=>this._render()),this._children.push(h(t)),this._render())}}_render(){this._projector&&(this._projector.invalidate(),this.dispatchEvent(new CustomEvent("dojo-ce-render",{bubbles:!1,detail:this})))}__properties__(){return Object.assign({},this._properties,this._eventProperties)}__children__(){return s===r.DOJO?this._children.filter(e=>e.domNode.isWidget).map(e=>{const{domNode:t}=e;return Object(a.h)(e,Object.assign({},t.__properties__()),[...t.__children__()])}):this._children}attributeChangedCallback(e,t,o){const r=p[e];this._setProperty(r,o)}_setEventProperty(e,t){this._eventProperties[e]=t}_getEventProperty(e){return this._eventProperties[e]}_setProperty(e,t){"function"==typeof t&&(t[n.b]=!0),this._properties[e]=t,this._render()}_getProperty(e){return this._properties[e]}_attributesToProperties(e){return e.reduce((e,t)=>{const o=t.toLowerCase(),r=this.getAttribute(o);return null!==r&&(e[t]=r),e},{})}static get observedAttributes(){return Object.keys(p)}get isWidget(){return!0}}}function m(e){const t=e.prototype&&e.prototype.__customElementDescriptor;if(!t)throw new Error("Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?");c.a.customElements.define(t.tagName,p(t,e))}!function(e){e.DOJO="DOJO",e.NODE="NODE",e.TEXT="TEXT"}(r||(r={})),t.default=m},"./node_modules/@dojo/widget-core/vdom.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/global.mjs"),s=o("./node_modules/@dojo/shim/array.mjs"),n=o("./node_modules/@dojo/widget-core/d.mjs"),i=o("./node_modules/@dojo/widget-core/Registry.mjs"),d=o("./node_modules/@dojo/shim/WeakMap.mjs");const a="http://www.w3.org/2000/svg",c="http://www.w3.org/1999/xlink",u=[],l=new d.a;t.b=l;const h=new d.a,p=new d.a;function m(e,t){return Object(n.e)(e)&&Object(n.e)(t)?(!Object(n.d)(e)&&!Object(n.d)(t)||e.domNode===t.domNode)&&(e.tag===t.tag&&e.properties.key===t.properties.key):!(!Object(n.f)(e)||!Object(n.f)(t))&&((void 0!==e.instance||"string"!=typeof t.widgetConstructor)&&(e.widgetConstructor===t.widgetConstructor&&e.properties.key===t.properties.key))}const f=function(){throw new Error("Provide a transitions object to the projectionOptions to do animations")};function g(e){if("string"!=typeof e)throw new Error("Style values must be strings")}function j(e,t,o,r,s,n){const i=p.get(r.projectorInstance),a=i.nodeMap.get(e)||new d.a;if(n){const o=a.get(n);e.removeEventListener(t,o)}let c=o.bind(s);"input"===t&&(c=function(e){o.call(this,e),e.target["oninput-value"]=e.target.value}.bind(s)),e.addEventListener(t,c),a.set(o,c),i.nodeMap.set(e,a)}function _(e,t){if(t){const o=t.split(" ");for(let t=0;t{o.focus()})}}function v(e,t,o,r,s=!1){const n=p.get(r.projectorInstance).nodeMap.get(e);n&&Object.keys(t).forEach(r=>{const i="on"===r.substr(0,2)||s,d=s?r:r.substr(2);if(i&&!o[r]){const o=n.get(t[r]);o&&e.removeEventListener(d,o)}})}function w(e,t,o,r){r.namespace===a&&"href"===t?e.setAttributeNS(c,t,o):"role"===t&&""===o||void 0===o?e.removeAttribute(t):e.setAttribute(t,o)}function O(e,t,o,r){const s=Object.keys(o),n=s.length;for(let i=0;i0)if(c&&0!==c.length){const r=[...o];for(let o=0;o0&&R(r.children,t));else{if(!r.coreProperties){const e=l.get(t);r.coreProperties={bind:t,baseRegistry:e.coreProperties.baseRegistry}}r.children&&r.children.length>0&&R(r.children,t)}o++}else e.splice(o,1)}return e}function k(e,t){if(Object(n.e)(e)&&e.properties){const o=e.properties.enterAnimation;o&&("function"==typeof o?o(e.domNode,e.properties):t.enter(e.domNode,e.properties,o))}}function N(e,t,o){if(Object(n.f)(e)){const r=e.rendered||u;if(e.instance){l.get(e.instance).onDetach(),h.delete(e.instance)}for(let e=0;e0)for(let r=0;r{let i=void 0,d=t[f];if(d){let e=f+1,o=[d];for(;o.length;){const r=o.shift();if(Object(n.f)(r))r.rendered&&o.push(...r.rendered);else if(r.domNode){i=r.domNode;break}0===o.length&&t[e]&&(o.push(t[e]),e++)}}D(u,e,i,s,r),k(u,a);const l=g;c.afterRenderCallbacks.push(()=>{A(o,l,r)})};if(!d||-1===l){p(),g++;continue}const _=()=>{const e=f;if(c.afterRenderCallbacks.push(()=>{A(t,e,r)}),Object(n.f)(d)){const e=h.get(d.instance);e&&(d=e.dnode)}N(d,a,s)};-1!==E(o,d,g+1)?(p(),_(),f++,g++):(_(),f++)}if(i>f)for(l=f;l{A(t,e,r)});let o=t[l];if(Object(n.f)(o)){const e=h.get(o.instance);e&&(o=e.dnode)}N(o,a,s)}return j}function T(e,t,o,r,i,d){if(void 0===t)return;const a=p.get(o.projectorInstance);a.merge&&void 0===d&&(d=Object(s.a)(e.domNode.childNodes));const c=o.transitions;o=Object.assign({},o,{depth:o.depth+1});for(let s=0;s0;)(e=d.shift())&&e.tagName===(u.tag.toUpperCase()||void 0)&&(u.domNode=e)}D(u,e,i,o,r)}else D(u,e,i,o,r,d);k(u,c)}}function x(e,t,o,r){if(T(t,t.children,r,o,void 0),"function"==typeof t.deferredPropertiesCallback&&void 0===t.inserted&&L(t,r),t.attributes&&t.events){O(e,{},t.attributes,r),P(e,{},t.properties,r,!1),v(e,{},t.events,r,!0);const o=t.events;Object.keys(o).forEach(s=>{j(e,s,o[s],r,t.properties.bind)})}else P(e,{},t.properties,r);if(null!==t.properties.key&&void 0!==t.properties.key){l.get(o).nodeHandler.add(e,`${t.properties.key}`)}t.inserted=!0}function D(e,t,o,r,s,d){let c;const u=p.get(r.projectorInstance);if(Object(n.f)(e)){let{widgetConstructor:n}=e;const a=l.get(s);if(!Object(i.d)(n)){const e=a.registry().get(n);if(null===e)return;n=e}const c=new n;e.instance=c;const p=l.get(c);p.invalidate=(()=>{p.dirty=!0,!1===p.rendering&&(u.renderQueue.push({instance:c,depth:r.depth}),F(r))}),p.rendering=!0,c.__setCoreProperties__(e.coreProperties),c.__setChildren__(e.children),c.__setProperties__(e.properties);const m=c.__render__();if(p.rendering=!1,m){const s=R(m,c);e.rendered=s,T(t,s,r,c,o,d)}h.set(c,{dnode:e,parentVNode:t}),p.nodeHandler.addRoot(),u.afterRenderCallbacks.push(()=>{p.onAttach()})}else{if(u.merge&&void 0!==u.mergeElement)return c=e.domNode=r.mergeElement,u.mergeElement=void 0,void x(c,e,s,r);const n=t.domNode.ownerDocument;if(e.tag||"string"!=typeof e.text)void 0===e.domNode?("svg"===e.tag&&(r=Object.assign({},r,{namespace:a})),c=void 0!==r.namespace?e.domNode=n.createElementNS(r.namespace,e.tag):e.domNode=e.domNode||n.createElement(e.tag)):c=e.domNode,x(c,e,s,r),void 0!==o?t.domNode.insertBefore(c,o):c.parentNode!==t.domNode&&t.domNode.appendChild(c);else if(void 0!==e.domNode&&t.domNode){const o=e.domNode.ownerDocument.createTextNode(e.text);t.domNode===e.domNode.parentNode?t.domNode.replaceChild(o,e.domNode):(t.domNode.appendChild(o),e.domNode.parentNode&&e.domNode.parentNode.removeChild(e.domNode)),e.domNode=o}else c=e.domNode=n.createTextNode(e.text),void 0!==o?t.domNode.insertBefore(c,o):t.domNode.appendChild(c)}}function S(e,t,o,r,s){if(Object(n.f)(t)){const{instance:r}=e,{parentVNode:s,dnode:n}=h.get(r),i=n?n.rendered:e.rendered,d=l.get(r);if(d.rendering=!0,r.__setCoreProperties__(t.coreProperties),r.__setChildren__(t.children),r.__setProperties__(t.properties),t.instance=r,!0===d.dirty){const e=r.__render__();d.rendering=!1,t.rendered=R(e,r),M(s,i,t.rendered,r,o)}else d.rendering=!1,t.rendered=i;h.set(r,{dnode:t,parentVNode:s}),d.nodeHandler.addRoot()}else{if(e===t)return!1;const r=t.domNode=e.domNode;let n=!1,i=!1;if(t.tag||"string"!=typeof t.text){if(t.tag&&0===t.tag.lastIndexOf("svg",0)&&(o=Object.assign({},o,{namespace:a})),e.children!==t.children){const r=R(t.children,s);t.children=r,i=M(t,e.children,r,s,o)||i}const n=function(e,t,o){const{diffType:r,properties:s,attributes:n}=o;if(!r||"vdom"===r)return{properties:t.properties,attributes:t.attributes,events:t.events};if("none"===r)return{properties:{},attributes:t.attributes?{}:void 0,events:t.events};let i={properties:{}};return n?(i.attributes={},i.events=t.events,Object.keys(s).forEach(t=>{i.properties[t]=e[t]}),Object.keys(n).forEach(t=>{i.attributes[t]=e.getAttribute(t)}),i):(i.properties=Object.keys(s).reduce((t,o)=>(t[o]=e.getAttribute(o)||e[o],t),{}),i)}(r,e,t);if(t.attributes&&t.events){O(r,n.attributes,t.attributes,o),i=P(r,n.properties,t.properties,o,!1)||i,v(r,n.events,t.events,o,!0);const e=t.events;Object.keys(e).forEach(s=>{j(r,s,e[s],o,t.properties.bind,n.events[s])})}else i=P(r,n.properties,t.properties,o)||i;if(null!==t.properties.key&&void 0!==t.properties.key){l.get(s).nodeHandler.add(r,`${t.properties.key}`)}}else if(t.text!==e.text){const e=r.ownerDocument.createTextNode(t.text);return r.parentNode.replaceChild(e,r),t.domNode=e,n=!0}i&&t.properties&&t.properties.updateAnimation&&t.properties.updateAnimation(r,t.properties,e.properties)}}function L(e,t){e.decoratedDeferredProperties=e.properties;const o=e.deferredPropertiesCallback(!!e.inserted),r=p.get(t.projectorInstance);e.properties=Object.assign({},o,e.decoratedDeferredProperties),r.deferredRenderCallbacks.push(()=>{const o=Object.assign({},e.deferredPropertiesCallback(!!e.inserted),e.decoratedDeferredProperties);P(e.domNode,e.properties,o,t),e.properties=o})}function I(e){const t=p.get(e.projectorInstance);if(t.deferredRenderCallbacks.length)if(e.sync)for(;t.deferredRenderCallbacks.length;){const e=t.deferredRenderCallbacks.shift();e&&e()}else r.a.requestAnimationFrame(()=>{for(;t.deferredRenderCallbacks.length;){const e=t.deferredRenderCallbacks.shift();e&&e()}})}function W(e){const t=p.get(e.projectorInstance);if(e.sync)for(;t.afterRenderCallbacks.length;){const e=t.afterRenderCallbacks.shift();e&&e()}else r.a.requestIdleCallback?r.a.requestIdleCallback(()=>{for(;t.afterRenderCallbacks.length;){const e=t.afterRenderCallbacks.shift();e&&e()}}):setTimeout(()=>{for(;t.afterRenderCallbacks.length;){const e=t.afterRenderCallbacks.shift();e&&e()}})}function F(e){const t=p.get(e.projectorInstance);e.sync?B(e):void 0===t.renderScheduled&&(t.renderScheduled=r.a.requestAnimationFrame(()=>{B(e)}))}function B(e){const t=p.get(e.projectorInstance);t.renderScheduled=void 0;const o=[...t.renderQueue];t.renderQueue=[],o.sort((e,t)=>e.depth-t.depth);const r=[];for(;o.length;){const{instance:t}=o.shift();if(h.has(t)&&-1===r.indexOf(t)){r.push(t);const{parentVNode:o,dnode:s}=h.get(t);S(s,C(t,l.get(t)),e,0,t)}}W(e),I(e)}const H={append:function(e,t,o={}){const r=l.get(t),s=function(e,t){const o={namespace:void 0,styleApplyer:function(e,t,o){e.style[t]=o},transitions:{enter:f,exit:f},depth:0,merge:!1,sync:!1,projectorInstance:t};return Object.assign({},o,e)}(o,t),i={afterRenderCallbacks:[],deferredRenderCallbacks:[],nodeMap:new d.a,renderScheduled:void 0,renderQueue:[],merge:o.merge||!1,mergeElement:o.mergeElement};p.set(t,i),s.rootNode=e;const a={tag:"",properties:{},children:void 0,domNode:s.rootNode,type:n.a};const c=C(t,r);return h.set(t,{dnode:c,parentVNode:a}),r.invalidate=(()=>{r.dirty=!0,!1===r.rendering&&(i.renderQueue.push({instance:t,depth:s.depth}),F(s))}),S(c,c,s,0,t),i.afterRenderCallbacks.push(()=>{r.onAttach()}),I(s),W(s),{domNode:s.rootNode}},create:function(e,t){return this.append(document.createElement("div"),e,t)},merge:function(e,t,o={}){o.merge=!0,o.mergeElement=e;const r=this.append(e.parentNode,t,o);return p.get(t).merge=!1,r}};t.a=H},"./node_modules/imports-loader/index.js?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js":function(e,t,o){var r=o("./src/menu/Menu.ts"),s=o("./node_modules/@dojo/widget-core/registerCustomElement.mjs").default,n=r.default;n&&s(n)},"./node_modules/process/browser.js":function(e,t){var o,r,s=e.exports={};function n(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function d(e){if(o===setTimeout)return setTimeout(e,0);if((o===n||!o)&&setTimeout)return o=setTimeout,setTimeout(e,0);try{return o(e,0)}catch(t){try{return o.call(null,e,0)}catch(t){return o.call(this,e,0)}}}!function(){try{o="function"==typeof setTimeout?setTimeout:n}catch(e){o=n}try{r="function"==typeof clearTimeout?clearTimeout:i}catch(e){r=i}}();var a,c=[],u=!1,l=-1;function h(){u&&a&&(u=!1,a.length?c=a.concat(c):l=-1,c.length&&p())}function p(){if(!u){var e=d(h);u=!0;for(var t=c.length;t;){for(a=c,c=[];++l1)for(var o=1;o=0;d--)(s=e[d])&&(i=(n<3?s(i):n>3?s(t,o,i):s(t,o))||i);return n>3&&i&&Object.defineProperty(t,o,i),i},t.b=function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}; +!function(e){var t={};function o(r){if(t[r])return t[r].exports;var s=t[r]={i:r,l:!1,exports:{}};return e[r].call(s.exports,s,s.exports,o),s.l=!0,s.exports}o.m=e,o.c=t,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}({"./node_modules/@dojo/framework/core/Destroyable.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/core/lang.mjs"),s=o("./node_modules/@dojo/framework/shim/Promise.mjs");function n(){return s.a.resolve(!1)}function i(){throw new Error("Call made to destroyed method")}class d{constructor(){this.handles=[]}own(e){const t=Array.isArray(e)?Object(r.b)(...e):e,{handles:o}=this;return o.push(t),{destroy(){o.splice(o.indexOf(t)),t.destroy()}}}destroy(){return new s.a(e=>{this.handles.forEach(e=>{e&&e.destroy&&e.destroy()}),this.destroy=n,this.own=i,e(!0)})}}t.a=d},"./node_modules/@dojo/framework/core/Evented.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/Map.mjs"),s=o("./node_modules/@dojo/framework/core/Destroyable.mjs");const n=new r.b;class i extends s.a{constructor(){super(...arguments),this.listenersMap=new r.b}emit(e){this.listenersMap.forEach((t,o)=>{(function(e,t){if("string"==typeof t&&"string"==typeof e&&-1!==e.indexOf("*")){let o;return n.has(e)?o=n.get(e):(o=new RegExp(`^${e.replace(/\*/g,".*")}$`),n.set(e,o)),o.test(t)}return e===t})(o,e.type)&&[...t].forEach(t=>{t.call(this,e)})})}on(e,t){if(Array.isArray(t)){const o=t.map(t=>this._addListener(e,t));return{destroy(){o.forEach(e=>e.destroy())}}}return this._addListener(e,t)}_addListener(e,t){const o=this.listenersMap.get(e)||[];return o.push(t),this.listenersMap.set(e,o),{destroy:()=>{const o=this.listenersMap.get(e)||[];o.splice(o.indexOf(t),1)}}}}t.a=i},"./node_modules/@dojo/framework/core/lang.mjs":function(e,t,o){"use strict";t.b=function(...e){return function(e){let t=!1;return{destroy:function(){t||(t=!0,e())}}}(function(){for(let t=0;t{r[e]=t,delete n[e]},()=>{delete n[e]})}function l(e){let t;const o=e.toLowerCase();if(o in a)t=a[o];else if(s[o])t=r[o]=s[o].call(null),delete s[o];else{if(!(o in r)){if(e in n)return!1;throw new TypeError(`Attempt to detect unregistered has feature "${e}"`)}t=r[o]}return t}c("debug",!0),c("host-browser","undefined"!=typeof document&&"undefined"!=typeof location),c("host-node",function(){if("object"==typeof o&&o.versions&&o.versions.node)return o.versions.node})}).call(t,o("./node_modules/webpack/buildin/global.js"),o("./node_modules/process/browser.js"))},"./node_modules/@dojo/framework/shim/Map.mjs":function(e,t,o){"use strict";o.d(t,"a",function(){return s});o("./node_modules/@dojo/framework/shim/iterator.mjs");var r=o("./node_modules/@dojo/framework/shim/global.mjs");o("./node_modules/@dojo/framework/shim/object.mjs"),o("./node_modules/@dojo/framework/shim/support/has.mjs"),o("./node_modules/@dojo/framework/shim/Symbol.mjs");let s=r.a.Map;t.b=s},"./node_modules/@dojo/framework/shim/Promise.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/global.mjs");o("./node_modules/@dojo/framework/shim/support/queue.mjs"),o("./node_modules/@dojo/framework/shim/Symbol.mjs"),o("./node_modules/@dojo/framework/shim/support/has.mjs");let s=r.a.Promise;t.a=s},"./node_modules/@dojo/framework/shim/Symbol.mjs":function(e,t,o){"use strict";o("./node_modules/@dojo/framework/shim/support/has.mjs");var r=o("./node_modules/@dojo/framework/shim/global.mjs"),s=o("./node_modules/@dojo/framework/shim/support/util.mjs");let n=r.a.Symbol;["hasInstance","isConcatSpreadable","iterator","species","replace","search","split","match","toPrimitive","toStringTag","unscopables","observable"].forEach(e=>{n[e]||Object.defineProperty(n,e,Object(s.a)(n.for(e),!1,!1))}),t.a=n},"./node_modules/@dojo/framework/shim/WeakMap.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/global.mjs");o("./node_modules/@dojo/framework/shim/iterator.mjs"),o("./node_modules/@dojo/framework/shim/support/has.mjs"),o("./node_modules/@dojo/framework/shim/Symbol.mjs");let s=r.a.WeakMap;t.a=s},"./node_modules/@dojo/framework/shim/array.mjs":function(e,t,o){"use strict";o.d(t,"a",function(){return n});var r=o("./node_modules/@dojo/framework/shim/global.mjs"),s=(o("./node_modules/@dojo/framework/shim/iterator.mjs"),o("./node_modules/@dojo/framework/shim/number.mjs"),o("./node_modules/@dojo/framework/shim/support/has.mjs"),o("./node_modules/@dojo/framework/shim/support/util.mjs"));let n,i,d,a,c,l,u;n=r.a.Array.from,i=r.a.Array.of,d=Object(s.b)(r.a.Array.prototype.copyWithin),a=Object(s.b)(r.a.Array.prototype.fill),c=Object(s.b)(r.a.Array.prototype.find),l=Object(s.b)(r.a.Array.prototype.findIndex),u=Object(s.b)(r.a.Array.prototype.includes)},"./node_modules/@dojo/framework/shim/global.mjs":function(e,t,o){"use strict";(function(e){const o=void 0!==e?e:"undefined"!=typeof window?window:"undefined"!=typeof self?self:void 0;t.a=o}).call(t,o("./node_modules/webpack/buildin/global.js"))},"./node_modules/@dojo/framework/shim/iterator.mjs":function(e,t,o){"use strict";o("./node_modules/@dojo/framework/shim/Symbol.mjs"),o("./node_modules/@dojo/framework/shim/string.mjs")},"./node_modules/@dojo/framework/shim/number.mjs":function(e,t,o){"use strict";o("./node_modules/@dojo/framework/shim/global.mjs");Math.pow(2,53)},"./node_modules/@dojo/framework/shim/object.mjs":function(e,t,o){"use strict";o.d(t,"a",function(){return s});var r=o("./node_modules/@dojo/framework/shim/global.mjs");o("./node_modules/@dojo/framework/shim/support/has.mjs"),o("./node_modules/@dojo/framework/shim/Symbol.mjs");let s,n,i,d,a,c,l,u,m;{const e=r.a.Object;s=e.assign,n=e.getOwnPropertyDescriptor,i=e.getOwnPropertyNames,d=e.getOwnPropertySymbols,a=e.is,c=e.keys}{const e=r.a.Object;l=e.getOwnPropertyDescriptors,u=e.entries,m=e.values}},"./node_modules/@dojo/framework/shim/string.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/global.mjs"),s=(o("./node_modules/@dojo/framework/shim/support/has.mjs"),o("./node_modules/@dojo/framework/shim/support/util.mjs"));t.b=55296;t.a=56319;let n,i,d,a,c,l,u,m,h,f;n=r.a.String.fromCodePoint,i=r.a.String.raw,d=Object(s.b)(r.a.String.prototype.codePointAt),a=Object(s.b)(r.a.String.prototype.endsWith),c=Object(s.b)(r.a.String.prototype.includes),l=Object(s.b)(r.a.String.prototype.normalize),u=Object(s.b)(r.a.String.prototype.repeat),m=Object(s.b)(r.a.String.prototype.startsWith),h=Object(s.b)(r.a.String.prototype.padEnd),f=Object(s.b)(r.a.String.prototype.padStart)},"./node_modules/@dojo/framework/shim/support/has.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/has/has.mjs"),s=o("./node_modules/@dojo/framework/shim/global.mjs");r.b;Object(r.a)("es6-array",()=>["from","of"].every(e=>e in s.a.Array)&&["findIndex","find","copyWithin"].every(e=>e in s.a.Array.prototype),!0),Object(r.a)("es6-array-fill",()=>"fill"in s.a.Array.prototype&&1===[1].fill(9,Number.POSITIVE_INFINITY)[0],!0),Object(r.a)("es7-array",()=>"includes"in s.a.Array.prototype,!0),Object(r.a)("es6-map",()=>{if("function"==typeof s.a.Map)try{const e=new s.a.Map([[0,1]]);return e.has(0)&&"function"==typeof e.keys&&"function"==typeof e.values&&"function"==typeof e.entries}catch(e){return!1}return!1},!0),Object(r.a)("es6-math",()=>["clz32","sign","log10","log2","log1p","expm1","cosh","sinh","tanh","acosh","asinh","atanh","trunc","fround","cbrt","hypot"].every(e=>"function"==typeof s.a.Math[e]),!0),Object(r.a)("es6-math-imul",()=>"imul"in s.a.Math&&-5===Math.imul(4294967295,5),!0),Object(r.a)("es6-object",()=>["assign","is","getOwnPropertySymbols","setPrototypeOf"].every(e=>"function"==typeof s.a.Object[e]),!0),Object(r.a)("es2017-object",()=>["values","entries","getOwnPropertyDescriptors"].every(e=>"function"==typeof s.a.Object[e]),!0),Object(r.a)("es-observable",()=>void 0!==s.a.Observable,!0),Object(r.a)("es6-promise",()=>void 0!==s.a.Promise&&!0,!0),Object(r.a)("es6-set",()=>{if("function"==typeof s.a.Set){const e=new s.a.Set([1]);return e.has(1)&&"keys"in e&&"function"==typeof e.keys&&!0}return!1},!0),Object(r.a)("es6-string",()=>["fromCodePoint"].every(e=>"function"==typeof s.a.String[e])&&["codePointAt","normalize","repeat","startsWith","endsWith","includes"].every(e=>"function"==typeof s.a.String.prototype[e]),!0),Object(r.a)("es6-string-raw",()=>{function e(e,...t){const o=[...e];return o.raw=e.raw,o}if("raw"in s.a.String){let t=e`a\n${1}`;return t.raw=["a\\n"],"a:\\n"===s.a.String.raw(t,42)}return!1},!0),Object(r.a)("es2017-string",()=>["padStart","padEnd"].every(e=>"function"==typeof s.a.String.prototype[e]),!0),Object(r.a)("es6-symbol",()=>void 0!==s.a.Symbol&&"symbol"==typeof Symbol(),!0),Object(r.a)("es6-weakmap",()=>{if(void 0!==s.a.WeakMap){const e={},t={},o=new s.a.WeakMap([[e,1]]);return Object.freeze(e),1===o.get(e)&&o.set(t,2)===o&&!0}return!1},!0),Object(r.a)("microtasks",()=>!0,!0),Object(r.a)("postmessage",()=>void 0!==s.a.window&&"function"==typeof s.a.postMessage,!0),Object(r.a)("raf",()=>"function"==typeof s.a.requestAnimationFrame,!0),Object(r.a)("setimmediate",()=>void 0!==s.a.setImmediate,!0),Object(r.a)("dom-mutationobserver",()=>{if(Boolean(s.a.MutationObserver||s.a.WebKitMutationObserver)){const e=document.createElement("div"),t=new(s.a.MutationObserver||s.a.WebKitMutationObserver)(function(){});return t.observe(e,{attributes:!0}),e.style.setProperty("display","block"),Boolean(t.takeRecords().length)}return!1},!0),Object(r.a)("dom-webanimation",()=>void 0!==s.a.Animation&&void 0!==s.a.KeyframeEffect,!0)},"./node_modules/@dojo/framework/shim/support/queue.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/global.mjs");o("./node_modules/@dojo/framework/shim/support/has.mjs");function s(e){e&&e.isActive&&e.callback&&e.callback()}function n(e,t){return{destroy:function(){this.destroy=function(){},e.isActive=!1,e.callback=null,t&&t()}}}!function(){let e,t;{const e=[];r.a.addEventListener("message",function(t){t.source===r.a&&"dojo-queue-message"===t.data&&(t.stopPropagation(),e.length&&s(e.shift()))}),t=function(t){e.push(t),r.a.postMessage("dojo-queue-message","*")}}function o(o){const r={isActive:!0,callback:o},s=t(r);return n(r,e&&function(){e(s)})}}();!function(){function e(e){const t={isActive:!0,callback:e},o=requestAnimationFrame(s.bind(null,t));return n(t,function(){cancelAnimationFrame(o)})}}();!function(){let e;e=function(e){r.a.Promise.resolve(e).then(s)}}()},"./node_modules/@dojo/framework/shim/support/util.mjs":function(e,t,o){"use strict";t.a=function(e,t=!1,o=!0,r=!0){return{value:e,enumerable:t,writable:o,configurable:r}},t.b=function(e){return function(t,...o){return e.apply(t,o)}}},"./node_modules/@dojo/framework/widget-core/Injector.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/core/Evented.mjs");class s extends r.a{constructor(e){super(),this._payload=e}setInvalidator(e){this._invalidator=e}get(){return this._payload}set(e){this._payload=e,this._invalidator&&this._invalidator()}}t.a=s},"./node_modules/@dojo/framework/widget-core/NodeHandler.mjs":function(e,t,o){"use strict";var r,s=o("./node_modules/@dojo/framework/core/Evented.mjs"),n=o("./node_modules/@dojo/framework/shim/Map.mjs");!function(e){e.Projector="Projector",e.Widget="Widget"}(r||(r={}));t.a=class extends s.a{constructor(){super(...arguments),this._nodeMap=new n.b}get(e){return this._nodeMap.get(e)}has(e){return this._nodeMap.has(e)}add(e,t){this._nodeMap.set(t,e),this.emit({type:t})}addRoot(){this.emit({type:r.Widget})}addProjector(){this.emit({type:r.Projector})}clear(){this._nodeMap.clear()}}},"./node_modules/@dojo/framework/widget-core/Registry.mjs":function(e,t,o){"use strict";t.d=a;var r=o("./node_modules/@dojo/framework/shim/Promise.mjs"),s=o("./node_modules/@dojo/framework/shim/Map.mjs"),n=o("./node_modules/@dojo/framework/shim/Symbol.mjs"),i=o("./node_modules/@dojo/framework/core/Evented.mjs");const d=Object(n.a)("Widget Base");function a(e){return Boolean(e&&e._type===d)}t.b=d;class c extends i.a{emitLoadedEvent(e,t){this.emit({type:e,action:"loaded",item:t})}define(e,t){if(void 0===this._widgetRegistry&&(this._widgetRegistry=new s.b),this._widgetRegistry.has(e))throw new Error(`widget has already been registered for '${e.toString()}'`);this._widgetRegistry.set(e,t),t instanceof r.a?t.then(t=>(this._widgetRegistry.set(e,t),this.emitLoadedEvent(e,t),t),e=>{throw e}):a(t)&&this.emitLoadedEvent(e,t)}defineInjector(e,t){if(void 0===this._injectorRegistry&&(this._injectorRegistry=new s.b),this._injectorRegistry.has(e))throw new Error(`injector has already been registered for '${e.toString()}'`);const o=new i.a,r={injector:t(()=>o.emit({type:"invalidate"})),invalidator:o};this._injectorRegistry.set(e,r),this.emitLoadedEvent(e,r)}get(e){if(!this._widgetRegistry||!this.has(e))return null;const t=this._widgetRegistry.get(e);if(a(t))return t;if(t instanceof r.a)return null;const o=t();return this._widgetRegistry.set(e,o),o.then(t=>((function(e){return Boolean(e&&e.hasOwnProperty("__esModule")&&e.hasOwnProperty("default")&&a(e.default))})(t)&&(t=t.default),this._widgetRegistry.set(e,t),this.emitLoadedEvent(e,t),t),e=>{throw e}),null}getInjector(e){return this._injectorRegistry&&this.hasInjector(e)?this._injectorRegistry.get(e):null}has(e){return Boolean(this._widgetRegistry&&this._widgetRegistry.has(e))}hasInjector(e){return Boolean(this._injectorRegistry&&this._injectorRegistry.has(e))}}t.a=c,t.c=c},"./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/Map.mjs"),s=o("./node_modules/@dojo/framework/core/Evented.mjs"),n=o("./node_modules/@dojo/framework/widget-core/Registry.mjs");t.a=class extends s.a{constructor(){super(),this._registry=new n.a,this._registryWidgetLabelMap=new r.a,this._registryInjectorLabelMap=new r.a,this.own(this._registry),this.own({destroy:()=>{this.baseRegistry&&(this._registryWidgetLabelMap.delete(this.baseRegistry),this._registryInjectorLabelMap.delete(this.baseRegistry),this.baseRegistry=void 0)}})}set base(e){this.baseRegistry&&(this._registryWidgetLabelMap.delete(this.baseRegistry),this._registryInjectorLabelMap.delete(this.baseRegistry)),this.baseRegistry=e}define(e,t){this._registry.define(e,t)}defineInjector(e,t){this._registry.defineInjector(e,t)}has(e){return this._registry.has(e)||Boolean(this.baseRegistry&&this.baseRegistry.has(e))}hasInjector(e){return this._registry.hasInjector(e)||Boolean(this.baseRegistry&&this.baseRegistry.hasInjector(e))}get(e,t=!1){return this._get(e,t,"get",this._registryWidgetLabelMap)}getInjector(e,t=!1){return this._get(e,t,"getInjector",this._registryInjectorLabelMap)}_get(e,t,o,r){const s=t?[this.baseRegistry,this._registry]:[this._registry,this.baseRegistry];for(let n=0;n{"loaded"===r.action&&this[o](e,t)===r.item&&this.emit({type:"invalidate"})});this.own(s),r.set(i,[...a,e])}}return null}}},"./node_modules/@dojo/framework/widget-core/WidgetBase.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/Map.mjs"),s=o("./node_modules/@dojo/framework/shim/WeakMap.mjs"),n=o("./node_modules/@dojo/framework/shim/Symbol.mjs"),i=o("./node_modules/@dojo/framework/widget-core/d.mjs"),d=o("./node_modules/@dojo/framework/widget-core/diff.mjs"),a=o("./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs"),c=o("./node_modules/@dojo/framework/widget-core/NodeHandler.mjs"),l=o("./node_modules/@dojo/framework/widget-core/vdom.mjs"),u=o("./node_modules/@dojo/framework/widget-core/Registry.mjs");const m=new r.b,h=d.a.bind(null),f=n.a.for("dojoNoBind");t.b=f;class p{constructor(){this._initialProperties=!0,this._changedPropertyKeys=[],this._nodeHandler=new c.a,this._handles=[],this._children=[],this._decoratorCache=new r.b,this._properties={},this._boundRenderFunc=this.render.bind(this),this._boundInvalidate=this.invalidate.bind(this),l.b.set(this,{dirty:!0,onAttach:()=>{this.onAttach()},onDetach:()=>{this.onDetach(),this.destroy()},nodeHandler:this._nodeHandler,registry:()=>this.registry,coreProperties:{},rendering:!1,inputProperties:{}}),this._runAfterConstructors()}meta(e){void 0===this._metaMap&&(this._metaMap=new r.b);let t=this._metaMap.get(e);return t||(t=new e({invalidate:this._boundInvalidate,nodeHandler:this._nodeHandler,bind:this}),this.own(t),this._metaMap.set(e,t)),t}onAttach(){}onDetach(){}get properties(){return this._properties}get changedPropertyKeys(){return[...this._changedPropertyKeys]}__setCoreProperties__(e){const{baseRegistry:t}=e,o=l.b.get(this);o.coreProperties.baseRegistry!==t&&(void 0===this._registry&&(this._registry=new a.a,this.own(this._registry),this.own(this._registry.on("invalidate",this._boundInvalidate))),this._registry.base=t,this.invalidate()),o.coreProperties=e}__setProperties__(e){const t=l.b.get(this);t.inputProperties=e;const o=this._runBeforeProperties(e),r=this.getDecorator("registeredDiffProperty"),s=[],n=Object.keys(o);if(!1===this._initialProperties||0!==r.length){const e=[...n,...Object.keys(this._properties)],i=[],d={};let a=!1;for(let n=0;n{const r=-1!==s.indexOf(o),n=-1!==e.indexOf(t);r&&!n&&(t.call(this,this._properties,d),e.push(t))})}this._properties=d,this._changedPropertyKeys=s}else{this._initialProperties=!1;for(let e=0;e0&&this.invalidate()}get children(){return this._children}__setChildren__(e){(this._children.length>0||e.length>0)&&(this._children=e,this.invalidate())}__render__(){l.b.get(this).dirty=!1;let e=this._runBeforeRenders()();return e=this.runAfterRenders(e),this._nodeHandler.clear(),e}invalidate(){const e=l.b.get(this);e.invalidate&&e.invalidate()}render(){return Object(i.g)("div",{},this.children)}addDecorator(e,t){if(t=Array.isArray(t)?t:[t],this.hasOwnProperty("constructor")){let o=m.get(this.constructor);o||(o=new r.b,m.set(this.constructor,o));let s=o.get(e);s||(s=[],o.set(e,s)),s.push(...t)}else{const o=this.getDecorator(e);this._decoratorCache.set(e,[...o,...t])}}_buildDecoratorList(e){const t=[];let o=this.constructor;for(;o;){const r=m.get(o);if(r){const o=r.get(e);o&&t.unshift(...o)}o=Object.getPrototypeOf(o)}return t}getDecorator(e){let t=this._decoratorCache.get(e);return void 0!==t?t:(t=this._buildDecoratorList(e),this._decoratorCache.set(e,t),t)}_bindFunctionProperty(e,t){if("function"==typeof e&&!e[f]&&!1===Object(u.d)(e)){void 0===this._bindFunctionPropertyMap&&(this._bindFunctionPropertyMap=new s.a);const o=this._bindFunctionPropertyMap.get(e)||{};let{boundFunc:r,scope:n}=o;return void 0!==r&&n===t||(r=e.bind(t),this._bindFunctionPropertyMap.set(e,{boundFunc:r,scope:t})),r}return e}get registry(){return void 0===this._registry&&(this._registry=new a.a,this.own(this._registry),this.own(this._registry.on("invalidate",this._boundInvalidate))),this._registry}_runBeforeProperties(e){const t=this.getDecorator("beforeProperties");return t.length>0?t.reduce((e,t)=>Object.assign({},e,t.call(this,e)),Object.assign({},e)):e}_runBeforeRenders(){const e=this.getDecorator("beforeRender");return e.length>0?e.reduce((e,t)=>{const o=t.call(this,e,this._properties,this._children);return o||(console.warn("Render function not returned from beforeRender, using previous render"),e)},this._boundRenderFunc):this._boundRenderFunc}runAfterRenders(e){const t=this.getDecorator("afterRender");return t.length>0&&(e=t.reduce((e,t)=>t.call(this,e),e)),void 0!==this._metaMap&&this._metaMap.forEach(e=>{e.afterRender()}),e}_runAfterConstructors(){const e=this.getDecorator("afterConstructor");e.length>0&&e.forEach(e=>e.call(this))}own(e){this._handles.push(e)}destroy(){for(;this._handles.length>0;){const e=this._handles.pop();e&&e.destroy()}}}t.a=p,p._type=u.b},"./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs":function(e,t,o){"use strict";let r="",s="";function n(e){""===s&&function(e){if("WebkitTransition"in e.style)r="webkitTransitionEnd",s="webkitAnimationEnd";else{if(!("transition"in e.style||"MozTransition"in e.style))throw new Error("Your browser is not supported");r="transitionend",s="animationend"}}(e)}function i(e,t,o){n(e);let i=!1,d=function(){i||(i=!0,e.removeEventListener(r,d),e.removeEventListener(s,d),o())};t(),e.addEventListener(s,d),e.addEventListener(r,d)}t.a={enter:function(e,t,o){const r=t.enterAnimationActive||`${o}-active`;i(e,()=>{e.classList.add(o),requestAnimationFrame(function(){e.classList.add(r)})},()=>{e.classList.remove(o),e.classList.remove(r)})},exit:function(e,t,o,r){const s=t.exitAnimationActive||`${o}-active`;i(e,()=>{e.classList.add(o),requestAnimationFrame(function(){e.classList.add(s)})},()=>{r()})}}},"./node_modules/@dojo/framework/widget-core/d.mjs":function(e,t,o){"use strict";t.f=d,t.e=a,t.d=function(e){return Boolean(e&&"string"!=typeof e&&e.type===i)},t.h=function(e,t,o=[]){return{children:o,widgetConstructor:e,properties:t,type:s}},t.g=function(e,t={},o){let r,s=t;Array.isArray(t)&&(o=t,s={});"function"==typeof s&&(r=s,s={});return{tag:e,deferredPropertiesCallback:r,children:o,properties:s,type:n}},t.c=function({node:e,attrs:t={},props:o={},on:r={},diffType:s="none"},n){return{tag:c(e)?e.tagName.toLowerCase():"",properties:o,attributes:t,events:r,children:n,type:i,domNode:e,text:c(e)?void 0:e.data,diffType:s}};var r=o("./node_modules/@dojo/framework/shim/Symbol.mjs");const s=Object(r.a)("Identifier for a WNode.");t.b=s;const n=Object(r.a)("Identifier for a VNode.");t.a=n;const i=Object(r.a)("Identifier for a VNode created using existing dom.");function d(e){return Boolean(e&&"string"!=typeof e&&e.type===s)}function a(e){return Boolean(e&&"string"!=typeof e&&(e.type===n||e.type===i))}function c(e){return!!e.tagName}},"./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs":function(e,t,o){"use strict";t.a=s;var r=o("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs");function s(e){return Object(r.a)((t,o)=>{t.addDecorator("afterRender",o?t[o]:e)})}},"./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs":function(e,t,o){"use strict";t.a=n;var r=o("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"),s=o("./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs");function n(){return Object(r.a)((e,t)=>{Object(s.a)(function(){this.invalidate()})(e)})}},"./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs":function(e,t,o){"use strict";t.a=s;var r=o("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs");function s(e){return Object(r.a)((t,o)=>{t.addDecorator("beforeProperties",o?t[o]:e)})}},"./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs":function(e,t,o){"use strict";t.a=n;var r=o("./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs"),s=o("./node_modules/@dojo/framework/widget-core/Registry.mjs");function n({tag:e,properties:t=[],attributes:o=[],events:n=[],childType:i=r.CustomElementChildType.DOJO,registryFactory:d=(()=>new s.c)}){return function(r){r.prototype.__customElementDescriptor={tagName:e,attributes:o,properties:t,events:n,childType:i,registryFactory:d}}}},"./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs":function(e,t,o){"use strict";t.a=n;var r=o("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"),s=o("./node_modules/@dojo/framework/widget-core/diff.mjs");function n(e,t=s.a,o){return Object(r.a)((r,s)=>{r.addDecorator(`diffProperty:${e}`,t.bind(null)),r.addDecorator("registeredDiffProperty",e),(o||s)&&r.addDecorator("diffReaction",{propertyName:e,reaction:s?r[s]:o})})}},"./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs":function(e,t,o){"use strict";function r(e){return function(t,o,r){"function"==typeof t?e(t.prototype,void 0):e(t,o)}}t.a=r},"./node_modules/@dojo/framework/widget-core/decorators/inject.mjs":function(e,t,o){"use strict";t.a=d;var r=o("./node_modules/@dojo/framework/shim/WeakMap.mjs"),s=o("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"),n=o("./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs");const i=new r.a;function d({name:e,getProperties:t}){return Object(s.a)((o,r)=>{Object(n.a)(function(o){const r=this.registry.getInjector(e);if(r){const{injector:e,invalidator:s}=r,n=i.get(this)||[];return 0===n.length&&i.set(this,n),-1===n.indexOf(r)&&(this.own(s.on("invalidate",()=>{this.invalidate()})),n.push(r)),t(e(),o)}})(o)})}},"./node_modules/@dojo/framework/widget-core/diff.mjs":function(e,t,o){"use strict";t.b=i,t.a=function(e,t){let o;o="function"==typeof t?t._type===r.b?n(e,t):function(e,t){return{changed:!1,value:t}}(0,t):s(t)?i(e,t):n(e,t);return o};var r=o("./node_modules/@dojo/framework/widget-core/Registry.mjs");function s(e){return"[object Object]"===Object.prototype.toString.call(e)||Array.isArray(e)}function n(e,t){return{changed:e!==t,value:t}}function i(e,t){let o=!1;const r=e&&s(e),n=t&&s(t);if(!r||!n)return{changed:!0,value:t};const i=Object.keys(e),d=Object.keys(t);return{changed:o=i.length!==d.length||d.some(o=>t[o]!==e[o]),value:t}}},"./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs":function(e,t,o){"use strict";t.a=u;var r,s,n=o("./node_modules/tslib/tslib.es6.js"),i=o("./node_modules/@dojo/framework/core/lang.mjs"),d=o("./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs"),a=o("./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs"),c=o("./node_modules/@dojo/framework/widget-core/d.mjs"),l=o("./node_modules/@dojo/framework/widget-core/vdom.mjs");function u(e){class t extends e{constructor(...e){super(...e),this._root=document.body,this._async=!0,this._projectorProperties={},this._projectionOptions={transitions:d.a},this.root=document.body,this.projectorState=r.Detached}append(e){const t={type:s.Append,root:e};return this._attach(t)}merge(e){const t={type:s.Merge,root:e};return this._attach(t)}set root(e){if(this.projectorState===r.Attached)throw new Error("Projector already attached, cannot change root element");this._root=e}get root(){return this._root}get async(){return this._async}set async(e){if(this.projectorState===r.Attached)throw new Error("Projector already attached, cannot change async mode");this._async=e}sandbox(e=document){if(this.projectorState===r.Attached)throw new Error("Projector already attached, cannot create sandbox");this._async=!1;const t=this.root;this.own({destroy:()=>{this._root=t}}),this._attach({root:e.createDocumentFragment(),type:s.Append})}setChildren(e){this.__setChildren__(e)}setProperties(e){this.__setProperties__(e)}__setProperties__(e){this._projectorProperties&&this._projectorProperties.registry!==e.registry&&this._projectorProperties.registry&&this._projectorProperties.registry.destroy(),this._projectorProperties=Object(i.a)({},e),super.__setCoreProperties__({bind:this,baseRegistry:e.registry}),super.__setProperties__(e)}toHtml(){if(this.projectorState!==r.Attached||!this._projection)throw new Error("Projector is not attached, cannot return an HTML string of projection.");return this._projection.domNode.childNodes[0].outerHTML}afterRender(e){let t=e;return"string"!=typeof e&&null!==e&&void 0!==e||(t=Object(c.g)("span",{},[e])),t}destroy(){super.destroy()}_attach({type:e,root:t}){if(t&&(this.root=t),this._attachHandle)return this._attachHandle;this.projectorState=r.Attached;const o={destroy:()=>{this.projectorState===r.Attached&&(this._projection=void 0,this.projectorState=r.Detached)}};switch(this.own(o),this._attachHandle=o,this._projectionOptions=Object.assign({},this._projectionOptions,{sync:!this._async}),e){case s.Append:this._projection=l.a.append(this.root,this,this._projectionOptions);break;case s.Merge:this._projection=l.a.merge(this.root,this,this._projectionOptions)}return this._attachHandle}}return n.a([Object(a.a)()],t.prototype,"afterRender",null),t}!function(e){e[e.Attached=1]="Attached",e[e.Detached=2]="Detached"}(r||(r={})),function(e){e[e.Append=1]="Append",e[e.Merge=2]="Merge"}(s||(s={}))},"./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs":function(e,t,o){"use strict";t.c=function(e){return Object(i.a)(t=>{t.addDecorator("baseThemeClasses",e)})},t.b=function(e,t){const o=new s.a(e);return t.defineInjector(l,e=>(o.setInvalidator(e),()=>o.get())),o},t.a=u;var r=o("./node_modules/tslib/tslib.es6.js"),s=o("./node_modules/@dojo/framework/widget-core/Injector.mjs"),n=o("./node_modules/@dojo/framework/widget-core/decorators/inject.mjs"),i=o("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"),d=o("./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs"),a=o("./node_modules/@dojo/framework/widget-core/diff.mjs");const c=" _key",l=Symbol("theme");function u(e){let t=class extends e{constructor(){super(...arguments),this._registeredBaseThemeKeys=[],this._recalculateClasses=!0,this._theme={}}theme(e){return this._recalculateClasses&&this._recalculateThemeClasses(),Array.isArray(e)?e.map(e=>this._getThemeClass(e)):this._getThemeClass(e)}onPropertiesChanged(){this._recalculateClasses=!0}_getThemeClass(e){if(void 0===e||null===e)return e;const t=this.properties.extraClasses||{},o=this._baseThemeClassesReverseLookup[e];let r=[];return o?(t[o]&&r.push(t[o]),this._theme[o]?r.push(this._theme[o]):r.push(this._registeredBaseTheme[o]),r.join(" ")):(console.warn(`Class name: '${e}' not found in theme`),null)}_recalculateThemeClasses(){const{theme:e={}}=this.properties,t=this.getDecorator("baseThemeClasses");this._registeredBaseTheme||(this._registeredBaseTheme=t.reduce((e,t)=>{const o=c,s=t[o],n=r.b(t,["symbol"==typeof o?o:o+""]);return this._registeredBaseThemeKeys.push(s),Object.assign({},e,n)},{}),this._baseThemeClassesReverseLookup=t.reduce((e,t)=>(Object.keys(t).forEach(o=>{e[t[o]]=o}),e),{})),this._theme=this._registeredBaseThemeKeys.reduce((t,o)=>Object.assign({},t,e[o]),{}),this._recalculateClasses=!1}};return r.a([Object(d.a)("theme",a.b),Object(d.a)("extraClasses",a.b)],t.prototype,"onPropertiesChanged",null),t=r.a([Object(n.a)({name:l,getProperties:(e,t)=>t.theme?{}:{theme:e}})],t)}},"./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs":function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),o.d(t,"CustomElementChildType",function(){return r}),t.DomToWidgetWrapper=m,t.create=h,t.register=f;var r,s=o("./node_modules/tslib/tslib.es6.js"),n=o("./node_modules/@dojo/framework/widget-core/WidgetBase.mjs"),i=o("./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs"),d=o("./node_modules/@dojo/framework/shim/array.mjs"),a=o("./node_modules/@dojo/framework/widget-core/d.mjs"),c=o("./node_modules/@dojo/framework/shim/global.mjs"),l=o("./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs"),u=o("./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs");function m(e){let t=class extends n.a{render(){const t=Object.keys(this.properties).reduce((e,t)=>{const o=this.properties[t];return 0===t.indexOf("on")&&(t=`__${t}`),e[t]=o,e},{});return Object(a.c)({node:e,props:t,diffType:"dom"})}static get domNode(){return e}};return t=s.a([Object(u.a)()],t)}function h(e,t){const{attributes:o,childType:s,registryFactory:u}=e,h={};return o.forEach(e=>{const t=e.toLowerCase();h[t]=e}),class extends HTMLElement{constructor(){super(...arguments),this._properties={},this._children=[],this._eventProperties={},this._initialised=!1}connectedCallback(){if(this._initialised)return;const o={},{attributes:h,properties:f,events:p}=e;this._properties=Object.assign({},this._properties,this._attributesToProperties(h)),[...h,...f].forEach(e=>{const t=this[e],r=e.replace(/^on/,"__");void 0!==t&&(this._properties[e]=t),r!==e&&(o[r]={get:()=>this._getProperty(e),set:t=>this._setProperty(e,t)}),o[e]={get:()=>this._getProperty(e),set:t=>this._setProperty(e,t)}}),p.forEach(e=>{const t=e.replace(/^on/,"").toLowerCase(),r=e.replace(/^on/,"__on");o[r]={get:()=>this._getEventProperty(e),set:t=>this._setEventProperty(e,t)},this._eventProperties[e]=void 0,this._properties[e]=((...o)=>{const r=this._getEventProperty(e);"function"==typeof r&&r(...o),this.dispatchEvent(new CustomEvent(t,{bubbles:!1,detail:o}))})}),Object.defineProperties(this,o);const g=s===r.TEXT?this.childNodes:this.children;Object(d.a)(g).forEach(e=>{s===r.DOJO?(e.addEventListener("dojo-ce-render",()=>this._render()),e.addEventListener("dojo-ce-connected",()=>this._render()),this._children.push(m(e))):this._children.push(Object(a.c)({node:e,diffType:"dom"}))}),this.addEventListener("dojo-ce-connected",e=>this._childConnected(e));const j=this._properties,_=()=>this.__children__(),y=u(),b=Object(l.b)(this._getTheme(),y);c.a.addEventListener("dojo-theme-set",()=>b.set(this._getTheme()));const w=Object(i.a)(class extends n.a{render(){return Object(a.h)(t,j,_())}});this._projector=new w,this._projector.setProperties({registry:y}),this._projector.append(this),this._initialised=!0,this.dispatchEvent(new CustomEvent("dojo-ce-connected",{bubbles:!0,detail:this}))}_getTheme(){if(c.a&&c.a.dojoce&&c.a.dojoce.theme)return c.a.dojoce.themes[c.a.dojoce.theme]}_childConnected(e){const t=e.detail;if(t.parentNode===this){this._children.some(e=>e.domNode===t)||(t.addEventListener("dojo-ce-render",()=>this._render()),this._children.push(m(t)),this._render())}}_render(){this._projector&&(this._projector.invalidate(),this.dispatchEvent(new CustomEvent("dojo-ce-render",{bubbles:!1,detail:this})))}__properties__(){return Object.assign({},this._properties,this._eventProperties)}__children__(){return s===r.DOJO?this._children.filter(e=>e.domNode.isWidget).map(e=>{const{domNode:t}=e;return Object(a.h)(e,Object.assign({},t.__properties__()),[...t.__children__()])}):this._children}attributeChangedCallback(e,t,o){const r=h[e];this._setProperty(r,o)}_setEventProperty(e,t){this._eventProperties[e]=t}_getEventProperty(e){return this._eventProperties[e]}_setProperty(e,t){"function"==typeof t&&(t[n.b]=!0),this._properties[e]=t,this._render()}_getProperty(e){return this._properties[e]}_attributesToProperties(e){return e.reduce((e,t)=>{const o=t.toLowerCase(),r=this.getAttribute(o);return null!==r&&(e[t]=r),e},{})}static get observedAttributes(){return Object.keys(h)}get isWidget(){return!0}}}function f(e){const t=e.prototype&&e.prototype.__customElementDescriptor;if(!t)throw new Error("Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?");c.a.customElements.define(t.tagName,h(t,e))}!function(e){e.DOJO="DOJO",e.NODE="NODE",e.TEXT="TEXT"}(r||(r={})),t.default=f},"./node_modules/@dojo/framework/widget-core/vdom.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/global.mjs"),s=o("./node_modules/@dojo/framework/shim/array.mjs"),n=o("./node_modules/@dojo/framework/widget-core/d.mjs"),i=o("./node_modules/@dojo/framework/widget-core/Registry.mjs"),d=o("./node_modules/@dojo/framework/shim/WeakMap.mjs");const a="http://www.w3.org/2000/svg",c="http://www.w3.org/1999/xlink",l=[],u=["focus","blur","scrollIntoView","click"],m=new d.a;t.b=m;const h=new d.a,f=new d.a,p=new d.a;function g(e,t){return Object(n.e)(e)&&Object(n.e)(t)?(!Object(n.d)(e)&&!Object(n.d)(t)||e.domNode===t.domNode)&&(e.tag===t.tag&&e.properties.key===t.properties.key):!(!Object(n.f)(e)||!Object(n.f)(t))&&((void 0!==e.instance||"string"!=typeof t.widgetConstructor)&&(e.widgetConstructor===t.widgetConstructor&&e.properties.key===t.properties.key))}const j=function(){throw new Error("Provide a transitions object to the projectionOptions to do animations")};function _(e){if("string"!=typeof e)throw new Error("Style values must be strings")}function y(e,t,o,r,s,n){const i=p.get(r.projectorInstance),a=i.nodeMap.get(e)||new d.a;if(n){const o=a.get(n);e.removeEventListener(t,o)}let c=o.bind(s);"input"===t&&(c=function(e){o.call(this,e),e.target["oninput-value"]=e.target.value}.bind(s)),e.addEventListener(t,c),a.set(o,c),i.nodeMap.set(e,a)}function b(e,t){if(t){const o=t.split(" ");for(let t=0;t{r[e]()})}}function k(e,t,o,r,s=!1){const n=p.get(r.projectorInstance).nodeMap.get(e);n&&Object.keys(t).forEach(r=>{const i="on"===r.substr(0,2)||s,d=s?r:r.substr(2);if(i&&!o[r]){const o=n.get(t[r]);o&&e.removeEventListener(d,o)}})}function O(e,t,o,r){r.namespace===a&&"href"===t?e.setAttributeNS(c,t,o):"role"===t&&""===o||void 0===o?e.removeAttribute(t):e.setAttribute(t,o)}function P(e,t,o,r){const s=Object.keys(o),n=s.length;for(let i=0;i0)if(c&&0!==c.length){const r=[...o];for(let o=0;o0&&R(r.children,t));else{if(!r.coreProperties){const e=m.get(t);r.coreProperties={bind:t,baseRegistry:e.coreProperties.baseRegistry}}r.children&&r.children.length>0&&R(r.children,t)}o++}else e.splice(o,1)}return e}function A(e,t){if(Object(n.e)(e)&&e.properties){const o=e.properties.enterAnimation;o&&("function"==typeof o?o(e.domNode,e.properties):t.enter(e.domNode,e.properties,o))}}function x(e,t,o){if(Object(n.f)(e)){const r=h.get(e.instance),s=(r?r.dnode.rendered:e.rendered)||l;if(e.instance){m.get(e.instance).onDetach(),h.delete(e.instance)}for(let e=0;e0)for(let r=0;r{let d=void 0,a=o,m=f+1,p=o[f];if(p||(p=t[0],m=1,a=t),p){let t=[p];for(;t.length;){const o=t.shift();if(Object(n.f)(o)){const e=h.get(o.instance);e&&e.dnode.rendered&&t.push(...e.dnode.rendered)}else if(o.domNode){if(o.domNode.parentElement!==e.domNode)break;d=o.domNode;break}0===t.length&&a[m]&&(t.push(a[m]),m++)}}I(l,e,r.slice(j+1),d,i,s),A(l,c);const g=j;u.afterRenderCallbacks.push(()=>{M(r,g,s)})};if(!a||-1===m){p(),j++;continue}const y=()=>{const e=f;if(u.afterRenderCallbacks.push(()=>{M(o,e,s)}),Object(n.f)(a)){const e=h.get(a.instance);e&&(a=e.dnode)}x(a,c,i)};-1!==C(r,a,j+1)?(p(),y(),f++,j++):(y(),f++)}if(d>f)for(m=f;m{M(o,e,s)});let t=o[m];if(Object(n.f)(t)){const e=h.get(t.instance);e&&(t=e.dnode)}x(t,c,i)}return _}function S(e,t,o,r,i,d){if(void 0===t)return;const a=p.get(o.projectorInstance);a.merge&&void 0===d&&(d=Object(s.a)(e.domNode.childNodes));const c=o.transitions;o=Object.assign({},o,{depth:o.depth+1});for(let s=0;s0;)(e=d.shift())&&e.tagName===(l.tag.toUpperCase()||void 0)&&(l.domNode=e)}I(l,e,u,i,o,r)}else I(l,e,u,i,o,r,d);A(l,c)}}function D(e,t,o,r){if(S(t,t.children,r,o,void 0),"function"==typeof t.deferredPropertiesCallback&&void 0===t.inserted&&W(t,r),t.attributes&&t.events){P(e,{},t.attributes,r),E(e,{},t.properties,r,!1),k(e,{},t.events,r,!0);const o=t.events;Object.keys(o).forEach(s=>{y(e,s,o[s],r,t.properties.bind)})}else E(e,{},t.properties,r);if(null!==t.properties.key&&void 0!==t.properties.key){m.get(o).nodeHandler.add(e,`${t.properties.key}`)}t.inserted=!0}function I(e,t,o,r,s,d,c){let l;const u=p.get(s.projectorInstance);if(Object(n.f)(e)){let{widgetConstructor:n}=e;const a=m.get(d);if(!Object(i.d)(n)){const e=a.registry().get(n);if(null===e)return;n=e}const l=new n;e.instance=l,f.set(l,o);const p=m.get(l);p.invalidate=(()=>{p.dirty=!0,!1===p.rendering&&(u.renderQueue.push({instance:l,depth:s.depth}),H(s))}),p.rendering=!0,l.__setCoreProperties__(e.coreProperties),l.__setChildren__(e.children),l.__setProperties__(e.properties);const g=l.__render__();if(p.rendering=!1,g){const o=R(g,l);e.rendered=o,S(t,o,s,l,r,c)}h.set(l,{dnode:e,parentVNode:t}),p.nodeHandler.addRoot(),u.afterRenderCallbacks.push(()=>{p.onAttach()})}else{if(u.merge&&void 0!==u.mergeElement)return l=e.domNode=s.mergeElement,u.mergeElement=void 0,void D(l,e,d,s);const o=t.domNode.ownerDocument;if(e.tag||"string"!=typeof e.text)void 0===e.domNode?("svg"===e.tag&&(s=Object.assign({},s,{namespace:a})),l=void 0!==s.namespace?e.domNode=o.createElementNS(s.namespace,e.tag):e.domNode=e.domNode||o.createElement(e.tag)):l=e.domNode,D(l,e,d,s),void 0!==r?t.domNode.insertBefore(l,r):l.parentNode!==t.domNode&&t.domNode.appendChild(l);else if(void 0!==e.domNode&&t.domNode){const o=e.domNode.ownerDocument.createTextNode(e.text);t.domNode===e.domNode.parentNode?t.domNode.replaceChild(o,e.domNode):(t.domNode.appendChild(o),e.domNode.parentNode&&e.domNode.parentNode.removeChild(e.domNode)),e.domNode=o}else l=e.domNode=o.createTextNode(e.text),void 0!==r?t.domNode.insertBefore(l,r):t.domNode.appendChild(l)}}function L(e,t,o,r,s,i,d){if(Object(n.f)(t)){const{instance:r}=e,{parentVNode:s,dnode:n}=h.get(r),a=n?n.rendered:e.rendered,c=m.get(r);if(c.rendering=!0,r.__setCoreProperties__(t.coreProperties),r.__setChildren__(t.children),r.__setProperties__(t.properties),f.set(r,d),t.instance=r,!0===c.dirty){const e=r.__render__();c.rendering=!1,t.rendered=R(e,r),T(s,i,a,t.rendered,r,o)}else c.rendering=!1,t.rendered=a;h.set(r,{dnode:t,parentVNode:s}),c.nodeHandler.addRoot()}else{if(e===t)return!1;const r=t.domNode=e.domNode;let n=!1,d=!1;if(t.tag||"string"!=typeof t.text){if(t.tag&&0===t.tag.lastIndexOf("svg",0)&&(o=Object.assign({},o,{namespace:a})),e.children!==t.children){const r=R(t.children,s);t.children=r,d=T(t,i,e.children,r,s,o)||d}const n=function(e,t,o){const{diffType:r,properties:s,attributes:n}=o;if(!r||"vdom"===r)return{properties:t.properties,attributes:t.attributes,events:t.events};if("none"===r)return{properties:{},attributes:t.attributes?{}:void 0,events:t.events};let i={properties:{}};return n?(i.attributes={},i.events=t.events,Object.keys(s).forEach(t=>{i.properties[t]=e[t]}),Object.keys(n).forEach(t=>{i.attributes[t]=e.getAttribute(t)}),i):(i.properties=Object.keys(s).reduce((t,o)=>(t[o]=e.getAttribute(o)||e[o],t),{}),i)}(r,e,t);if(t.attributes&&t.events){P(r,n.attributes,t.attributes,o),d=E(r,n.properties,t.properties,o,!1)||d,k(r,n.events,t.events,o,!0);const e=t.events;Object.keys(e).forEach(s=>{y(r,s,e[s],o,t.properties.bind,n.events[s])})}else d=E(r,n.properties,t.properties,o)||d;if(null!==t.properties.key&&void 0!==t.properties.key){m.get(s).nodeHandler.add(r,`${t.properties.key}`)}}else if(t.text!==e.text){const e=r.ownerDocument.createTextNode(t.text);return r.parentNode.replaceChild(e,r),t.domNode=e,n=!0}d&&t.properties&&t.properties.updateAnimation&&t.properties.updateAnimation(r,t.properties,e.properties)}}function W(e,t){e.decoratedDeferredProperties=e.properties;const o=e.deferredPropertiesCallback(!!e.inserted),r=p.get(t.projectorInstance);e.properties=Object.assign({},o,e.decoratedDeferredProperties),r.deferredRenderCallbacks.push(()=>{const o=Object.assign({},e.deferredPropertiesCallback(!!e.inserted),e.decoratedDeferredProperties);E(e.domNode,e.properties,o,t),e.properties=o})}function B(e){const t=p.get(e.projectorInstance);if(t.deferredRenderCallbacks.length)if(e.sync)for(;t.deferredRenderCallbacks.length;){const e=t.deferredRenderCallbacks.shift();e&&e()}else r.a.requestAnimationFrame(()=>{for(;t.deferredRenderCallbacks.length;){const e=t.deferredRenderCallbacks.shift();e&&e()}})}function F(e){const t=p.get(e.projectorInstance);if(e.sync)for(;t.afterRenderCallbacks.length;){const e=t.afterRenderCallbacks.shift();e&&e()}else r.a.requestIdleCallback?r.a.requestIdleCallback(()=>{for(;t.afterRenderCallbacks.length;){const e=t.afterRenderCallbacks.shift();e&&e()}}):setTimeout(()=>{for(;t.afterRenderCallbacks.length;){const e=t.afterRenderCallbacks.shift();e&&e()}})}function H(e){const t=p.get(e.projectorInstance);e.sync?$(e):void 0===t.renderScheduled&&(t.renderScheduled=r.a.requestAnimationFrame(()=>{$(e)}))}function $(e){const t=p.get(e.projectorInstance);t.renderScheduled=void 0;const o=[...t.renderQueue];t.renderQueue=[],o.sort((e,t)=>e.depth-t.depth);const r=[];for(;o.length;){const{instance:t}=o.shift();if(h.has(t)&&-1===r.indexOf(t)){r.push(t);const{parentVNode:o,dnode:s}=h.get(t),n=m.get(t),i=f.get(t);L(s,N(t,n),e,0,t,i,i)}}F(e),B(e)}const q={append:function(e,t,o={}){const r=m.get(t),s=function(e,t){const o={namespace:void 0,styleApplyer:function(e,t,o){e.style[t]=o},transitions:{enter:j,exit:j},depth:0,merge:!1,sync:!1,projectorInstance:t};return Object.assign({},o,e)}(o,t),i={afterRenderCallbacks:[],deferredRenderCallbacks:[],nodeMap:new d.a,renderScheduled:void 0,renderQueue:[],merge:o.merge||!1,mergeElement:o.mergeElement};p.set(t,i),s.rootNode=e;const a={tag:"",properties:{},children:void 0,domNode:s.rootNode,type:n.a};const c=N(t,r);return h.set(t,{dnode:c,parentVNode:a}),r.invalidate=(()=>{r.dirty=!0,!1===r.rendering&&(i.renderQueue.push({instance:t,depth:s.depth}),H(s))}),L(c,c,s,0,t,[],[]),i.afterRenderCallbacks.push(()=>{r.onAttach()}),B(s),F(s),{domNode:s.rootNode}},create:function(e,t){return this.append(document.createElement("div"),e,t)},merge:function(e,t,o={}){o.merge=!0,o.mergeElement=e;const r=this.append(e.parentNode,t,o);return p.get(t).merge=!1,r}};t.a=q},"./node_modules/imports-loader/index.js?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js":function(e,t,o){var r=o("./src/menu/Menu.ts"),s=o("./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs").default,n=r.default;n&&s(n)},"./node_modules/process/browser.js":function(e,t){var o,r,s=e.exports={};function n(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function d(e){if(o===setTimeout)return setTimeout(e,0);if((o===n||!o)&&setTimeout)return o=setTimeout,setTimeout(e,0);try{return o(e,0)}catch(t){try{return o.call(null,e,0)}catch(t){return o.call(this,e,0)}}}!function(){try{o="function"==typeof setTimeout?setTimeout:n}catch(e){o=n}try{r="function"==typeof clearTimeout?clearTimeout:i}catch(e){r=i}}();var a,c=[],l=!1,u=-1;function m(){l&&a&&(l=!1,a.length?c=a.concat(c):u=-1,c.length&&h())}function h(){if(!l){var e=d(m);l=!0;for(var t=c.length;t;){for(a=c,c=[];++u1)for(var o=1;o=0;d--)(s=e[d])&&(i=(n<3?s(i):n>3?s(t,o,i):s(t,o))||i);return n>3&&i&&Object.defineProperty(t,o,i),i}; /*! ***************************************************************************** Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use @@ -21,5 +21,5 @@ MERCHANTABLITY OR NON-INFRINGEMENT. See the Apache Version 2.0 License for specific language governing permissions and limitations under the License. ***************************************************************************** */ -Object.setPrototypeOf||Array;Object.assign},"./node_modules/webpack/buildin/global.js":function(e,t){var o;o=function(){return this}();try{o=o||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(o=window)}e.exports=o},"./src/menu/Menu.ts":function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),o.d(t,"Menu",function(){return c});var r=o("./node_modules/tslib/tslib.es6.js"),s=o("./node_modules/@dojo/widget-core/d.mjs"),n=o("./node_modules/@dojo/widget-core/decorators/customElement.mjs"),i=o("./node_modules/@dojo/widget-core/mixins/Themed.mjs"),d=o("./node_modules/@dojo/widget-core/WidgetBase.mjs"),a=o("./src/menu/menu.m.css");o.n(a);let c=class extends(Object(i.a)(d.a)){_onSelected(e,t){this._selectedId=e,this.properties.onSelected(t),this.invalidate()}render(){const e=this.children.map((e,t)=>{if(e){const o={onSelected:e=>{this._onSelected(t,e)}};void 0!==this._selectedId&&(o.selected=t===this._selectedId),e.properties=Object.assign({},e.properties,o)}return e});return Object(s.g)("nav",{classes:this.theme(a.root)},[Object(s.g)("ol",{classes:this.theme(a.menuContainer)},e)])}};c=r.a([Object(n.a)({tag:"demo-menu",events:["onSelected"]}),Object(i.c)(a)],c),t.default=c},"./src/menu/menu.m.css":function(e,t){e.exports={" _key":"test-app/menu",root:"_3bA6jdSn",menuContainer:"_1eoGfqku"}},0:function(e,t,o){e.exports=o("./node_modules/imports-loader/index.js?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js")}}); +Object.setPrototypeOf||Array;Object.assign},"./node_modules/webpack/buildin/global.js":function(e,t){var o;o=function(){return this}();try{o=o||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(o=window)}e.exports=o},"./src/menu/Menu.ts":function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),o.d(t,"Menu",function(){return c});var r=o("./node_modules/tslib/tslib.es6.js"),s=o("./node_modules/@dojo/framework/widget-core/d.mjs"),n=o("./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs"),i=o("./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs"),d=o("./node_modules/@dojo/framework/widget-core/WidgetBase.mjs"),a=o("./src/menu/menu.m.css");o.n(a);let c=class extends(Object(i.a)(d.a)){_onSelected(e,t){this._selectedId=e,this.properties.onSelected(t),this.invalidate()}render(){const e=this.children.map((e,t)=>{if(e){const o={onSelected:e=>{this._onSelected(t,e)}};void 0!==this._selectedId&&(o.selected=t===this._selectedId),e.properties=Object.assign({},e.properties,o)}return e});return Object(s.g)("nav",{classes:this.theme(a.root)},[Object(s.g)("ol",{classes:this.theme(a.menuContainer)},e)])}};c=r.a([Object(n.a)({tag:"demo-menu",events:["onSelected"]}),Object(i.c)(a)],c),t.default=c},"./src/menu/menu.m.css":function(e,t){e.exports={" _key":"test-app/menu",root:"_3bA6jdSn",menuContainer:"_1eoGfqku"}},0:function(e,t,o){e.exports=o("./node_modules/imports-loader/index.js?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js")}}); //# sourceMappingURL=menu-1.0.0.js.map \ No newline at end of file diff --git a/test-app/fixtures/unix/dist/menu/menu-1.0.0.js.map b/test-app/fixtures/unix/dist/menu/menu-1.0.0.js.map index dfb2156..ccd09e2 100644 --- a/test-app/fixtures/unix/dist/menu/menu-1.0.0.js.map +++ b/test-app/fixtures/unix/dist/menu/menu-1.0.0.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 90c6db1ff77aa21b0220","webpack:///./node_modules/@dojo/core/Destroyable.mjs","webpack:///./node_modules/@dojo/core/Evented.mjs","webpack:///./node_modules/@dojo/core/lang.mjs","webpack:///./node_modules/@dojo/has/has.mjs","webpack:///./node_modules/@dojo/shim/Map.mjs","webpack:///./node_modules/@dojo/shim/Promise.mjs","webpack:///./node_modules/@dojo/shim/Symbol.mjs","webpack:///./node_modules/@dojo/shim/WeakMap.mjs","webpack:///./node_modules/@dojo/shim/array.mjs","webpack:///./node_modules/@dojo/shim/global.mjs","webpack:///./node_modules/@dojo/shim/number.mjs","webpack:///./node_modules/@dojo/shim/object.mjs","webpack:///./node_modules/@dojo/shim/string.mjs","webpack:///./node_modules/@dojo/shim/support/has.mjs","webpack:///./node_modules/@dojo/shim/support/queue.mjs","webpack:///./node_modules/@dojo/shim/support/util.mjs","webpack:///./node_modules/@dojo/widget-core/Injector.mjs","webpack:///./node_modules/@dojo/widget-core/NodeHandler.mjs","webpack:///./node_modules/@dojo/widget-core/Registry.mjs","webpack:///./node_modules/@dojo/widget-core/RegistryHandler.mjs","webpack:///./node_modules/@dojo/widget-core/WidgetBase.mjs","webpack:///./node_modules/@dojo/widget-core/animations/cssTransitions.mjs","webpack:///./node_modules/@dojo/widget-core/d.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/afterRender.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/customElement.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/diffProperty.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/inject.mjs","webpack:///./node_modules/@dojo/widget-core/diff.mjs","webpack:///./node_modules/@dojo/widget-core/mixins/Projector.mjs","webpack:///./node_modules/@dojo/widget-core/mixins/Themed.mjs","webpack:///./node_modules/@dojo/widget-core/registerCustomElement.mjs","webpack:///./node_modules/@dojo/widget-core/vdom.mjs","webpack:///./node_modules/@dojo/cli-build-widget/template/custom-element.js","webpack:///./node_modules/process/browser.js","webpack:///./node_modules/tslib/tslib.es6.js","webpack:///(webpack)/buildin/global.js","webpack:///./src/menu/Menu.ts","webpack:///./src/menu/menu.m.css?ec11"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","noop","__WEBPACK_IMPORTED_MODULE_1__dojo_shim_Promise__","resolve","destroyed","Error","Destroyable","[object Object]","this","handles","handle","Array","isArray","__WEBPACK_IMPORTED_MODULE_0__lang__","_handles","push","splice","indexOf","destroy","forEach","own","__webpack_exports__","regexMap","__WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__","Evented","__WEBPACK_IMPORTED_MODULE_1__Destroyable__","super","arguments","listenersMap","event","methods","type","globString","targetString","regex","has","RegExp","replace","set","test","isGlobMatch","method","listener","map","_addListener","listeners","destructor","called","createHandle","length","slice","testCache","testFunctions","testThenables","globalScope","window","global","self","staticFeatures","DojoHasEnvironment","staticCache","apply","add","feature","value","overwrite","normalizedFeature","toLowerCase","Boolean","exists","TypeError","then","isFeatureTestThenable","resolvedValue","result","document","location","process","versions","node","Map","__WEBPACK_IMPORTED_MODULE_1__global__","ShimPromise","__WEBPACK_IMPORTED_MODULE_0__global__","Promise","Symbol","wellKnown","__WEBPACK_IMPORTED_MODULE_2__support_util__","for","WeakMap","from","of","copyWithin","fill","find","findIndex","includes","__WEBPACK_IMPORTED_MODULE_4__support_util__","globalObject","Math","pow","assign","getOwnPropertyDescriptor","getOwnPropertyNames","getOwnPropertySymbols","is","keys","getOwnPropertyDescriptors","entries","values","fromCodePoint","raw","codePointAt","endsWith","normalize","repeat","startsWith","padEnd","padStart","String","__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__","every","key","Number","POSITIVE_INFINITY","e","imul","Observable","Set","getCallSite","callSite","substitutions","key1","key2","freeze","postMessage","requestAnimationFrame","setImmediate","MutationObserver","WebKitMutationObserver","example","createElement","observer","observe","attributes","style","setProperty","takeRecords","undefined","Animation","KeyframeEffect","executeTask","item","isActive","callback","getQueueHandle","enqueue","queue","addEventListener","source","data","stopPropagation","shift","queueTask","id","queueAnimationTask","rafId","bind","cancelAnimationFrame","writable","nativeFunction","target","args","Injector","__WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__","payload","_payload","invalidator","_invalidator","NodeEventType","_nodeMap","__WEBPACK_IMPORTED_MODULE_1__dojo_shim_Map__","element","emit","Widget","Projector","clear","WIDGET_BASE_TYPE","__WEBPACK_IMPORTED_MODULE_2__dojo_shim_Symbol__","isWidgetBaseConstructor","_type","Registry","__WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__","widgetLabel","action","label","_widgetRegistry","toString","__WEBPACK_IMPORTED_MODULE_0__dojo_shim_Promise__","widgetCtor","emitLoadedEvent","error","injectorFactory","_injectorRegistry","injectorItem","injector","promise","default","isWidgetConstructorDefaultExport","hasInjector","__WEBPACK_IMPORTED_MODULE_1__dojo_core_Evented__","_registry","__WEBPACK_IMPORTED_MODULE_2__Registry__","_registryWidgetLabelMap","_registryInjectorLabelMap","baseRegistry","delete","base","widget","define","defineInjector","globalPrecedence","_get","getFunctionName","labelMap","registries","registry","registeredLabels","on","decoratorMap","boundAuto","__WEBPACK_IMPORTED_MODULE_4__diff__","noBind","WidgetBase","_initialProperties","_changedPropertyKeys","_nodeHandler","__WEBPACK_IMPORTED_MODULE_6__NodeHandler__","_children","_decoratorCache","_properties","_boundRenderFunc","render","_boundInvalidate","invalidate","__WEBPACK_IMPORTED_MODULE_7__vdom__","dirty","onAttach","onDetach","nodeHandler","coreProperties","rendering","inputProperties","_runAfterConstructors","MetaType","_metaMap","cached","properties","changedPropertyKeys","instanceData","__WEBPACK_IMPORTED_MODULE_5__RegistryHandler__","originalProperties","_runBeforeProperties","registeredDiffPropertyNames","getDecorator","propertyNames","allProperties","checkedProperties","diffPropertyResults","runReactions","propertyName","previousProperty","newProperty","_bindFunctionProperty","diffFunctions","changed","_mapDiffPropertyReactions","reaction","previousProperties","newProperties","children","dNode","_runBeforeRenders","runAfterRenders","__WEBPACK_IMPORTED_MODULE_3__d__","decoratorKey","decoratorList","constructor","specificDecoratorList","decorators","allDecorators","instanceMap","unshift","getPrototypeOf","_buildDecoratorList","reduce","reactionPropertyMap","reactionArguments","__WEBPACK_IMPORTED_MODULE_8__Registry__","_bindFunctionPropertyMap","__WEBPACK_IMPORTED_MODULE_1__dojo_shim_WeakMap__","bindInfo","boundFunc","scope","beforeProperties","beforePropertiesFunction","beforeRenders","beforeRenderFunction","updatedRender","console","warn","afterRenders","afterRenderFunction","meta","afterRender","afterConstructors","afterConstructor","pop","browserSpecificTransitionEndEventName","browserSpecificAnimationEndEventName","initialize","determineBrowserStyleNames","runAndCleanUp","startAnimation","finishAnimation","finished","transitionEnd","removeEventListener","enter","enterAnimation","activeClass","enterAnimationActive","classList","remove","exit","exitAnimation","removeNode","exitAnimationActive","child","DOMVNODE","widgetConstructor","WNODE","tag","propertiesOrChildren","deferredPropertiesCallback","VNODE","attrs","props","diffType","isElementNode","tagName","events","domNode","text","__WEBPACK_IMPORTED_MODULE_0__dojo_shim_Symbol__","isWNode","isVNode","__WEBPACK_IMPORTED_MODULE_0__handleDecorator__","propertyKey","addDecorator","alwaysRender","__WEBPACK_IMPORTED_MODULE_1__beforeProperties__","customElement","childType","__WEBPACK_IMPORTED_MODULE_0__registerCustomElement__","DOJO","registryFactory","__WEBPACK_IMPORTED_MODULE_1__Registry__","__customElementDescriptor","diffProperty","diffFunction","reactionFunction","handleDecorator","handler","descriptor","registeredInjectorsMap","__WEBPACK_IMPORTED_MODULE_0__dojo_shim_WeakMap__","inject","getProperties","__WEBPACK_IMPORTED_MODULE_1__handleDecorator__","__WEBPACK_IMPORTED_MODULE_2__beforeProperties__","getInjector","registeredInjectors","__WEBPACK_IMPORTED_MODULE_0__Registry__","reference","ignore","isObjectOrArray","shallow","validOldProperty","validNewProperty","previousKeys","newKeys","some","ProjectorAttachState","AttachType","ProjectorMixin","Base","_root","body","_async","_projectorProperties","_projectionOptions","transitions","__WEBPACK_IMPORTED_MODULE_2__animations_cssTransitions__","root","projectorState","Detached","options","Append","_attach","Merge","Attached","async","doc","previousRoot","createDocumentFragment","__setChildren__","__setProperties__","__WEBPACK_IMPORTED_MODULE_1__dojo_core_lang__","__setCoreProperties__","_projection","childNodes","outerHTML","__WEBPACK_IMPORTED_MODULE_4__d__","_attachHandle","sync","__WEBPACK_IMPORTED_MODULE_5__vdom__","append","merge","__WEBPACK_IMPORTED_MODULE_0_tslib__","__WEBPACK_IMPORTED_MODULE_3__decorators_afterRender__","Function","theme","__WEBPACK_IMPORTED_MODULE_3__decorators_handleDecorator__","themeRegistry","themeInjector","__WEBPACK_IMPORTED_MODULE_1__Injector__","INJECTED_THEME_KEY","setInvalidator","THEME_KEY","ThemedMixin","Themed","_registeredBaseThemeKeys","_recalculateClasses","_theme","classes","_recalculateThemeClasses","className","_getThemeClass","extraClasses","themeClassName","_baseThemeClassesReverseLookup","resultClassNames","_registeredBaseTheme","join","baseThemes","finalBaseTheme","baseTheme","_a","currentClassNames","baseClass","themeKey","__WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__","__WEBPACK_IMPORTED_MODULE_5__diff__","__WEBPACK_IMPORTED_MODULE_2__decorators_inject__","CustomElementChildType","DomToWidgetWrapper","__WEBPACK_IMPORTED_MODULE_1__WidgetBase__","__WEBPACK_IMPORTED_MODULE_7__decorators_alwaysRender__","create","WidgetConstructor","attributeMap","attributeName","HTMLElement","_eventProperties","_initialised","domProperties","_attributesToProperties","filteredPropertyName","_getProperty","_setProperty","eventName","_getEventProperty","_setEventProperty","eventCallback","dispatchEvent","CustomEvent","bubbles","detail","defineProperties","TEXT","__WEBPACK_IMPORTED_MODULE_3__dojo_shim_array__","childNode","_render","_childConnected","widgetProperties","renderChildren","__children__","themeContext","__WEBPACK_IMPORTED_MODULE_6__mixins_Themed__","_getTheme","__WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__","__WEBPACK_IMPORTED_MODULE_2__mixins_Projector__","_projector","setProperties","dojoce","themes","parentNode","filter","Child","isWidget","__properties__","oldValue","getAttribute","observedAttributes","register","customElements","NAMESPACE_SVG","NAMESPACE_W3","NAMESPACE_XLINK","emptyArray","widgetInstanceMap","__WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__","projectorStateMap","same","dnode1","dnode2","__WEBPACK_IMPORTED_MODULE_2__d__","instance","missingTransition","checkStyleValue","styleValue","updateEvent","currentValue","projectionOptions","previousValue","projectorInstance","eventMap","nodeMap","previousEvent","evt","addClasses","classNames","split","removeClasses","focusNode","propValue","deferredRenderCallbacks","focus","removeOrphanedEvents","onlyEvents","propName","isEvent","substr","updateAttribute","attrName","attrValue","namespace","setAttributeNS","removeAttribute","setAttribute","updateAttributes","previousAttributes","attrNames","attrCount","updateProperties","includesEventsAndAttributes","propertiesUpdated","propNames","propCount","previousClasses","currentClasses","newClasses","previousClassName","classIndex","styleNames","styleCount","j","styleName","newStyleValue","styleApplyer","domValue","lastIndexOf","findIndexOfChild","sameAs","start","toInternalWNode","rendered","filterAndDecorateChildren","nodeAdded","dnode","nodeToRemove","pointerEvents","removeDomNode","removeChild","checkDistinguishable","indexToCheck","parentInstance","nodeIdentifier","parentName","updateChildren","parentVNode","oldChildren","newChildren","oldChildrenLength","newChildrenLength","depth","oldIndex","newIndex","textUpdated","oldChild","newChild","inserted","addDeferredProperties","updateDom","findOldIndex","addChild","insertBeforeDomNode","nextIndex","insertBeforeChildren","insertBefore","createDom","afterRenderCallbacks","childToRemove","addChildren","__WEBPACK_IMPORTED_MODULE_1__dojo_shim_array__","domElement","toUpperCase","initPropertiesAndChildren","parentInstanceData","__WEBPACK_IMPORTED_MODULE_3__Registry__","renderQueue","scheduleRender","__render__","filteredRendered","addRoot","mergeElement","ownerDocument","createElementNS","appendChild","newDomNode","createTextNode","replaceChild","previous","previousRendered","updated","current","buildPreviousProperties","updateAnimation","vnode","decoratedDeferredProperties","runDeferredRenderCallbacks","__WEBPACK_IMPORTED_MODULE_0__dojo_shim_global__","runAfterRenderCallbacks","requestIdleCallback","setTimeout","renderScheduled","renders","sort","a","b","previouslyRendered","dom","finalProjectorOptions","projectorOptions","defaults","getProjectionOptions","rootNode","projection","widgetFactory","registerCustomElement","defaultExport","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","fun","clearTimeout","currentQueue","draining","queueIndex","cleanUpNextTick","concat","drainQueue","timeout","len","run","marker","runClearTimeout","Item","array","nextTick","title","browser","env","argv","version","addListener","once","off","removeListener","removeAllListeners","prependListener","prependOnceListener","binding","cwd","chdir","dir","umask","t","desc","r","Reflect","decorate","metadataKey","metadataValue","metadata","setPrototypeOf","g","eval","Menu","__WEBPACK_IMPORTED_MODULE_3__dojo_widget_core_mixins_Themed__","__WEBPACK_IMPORTED_MODULE_4__dojo_widget_core_WidgetBase__","_selectedId","onSelected","items","index","_onSelected","selected","__WEBPACK_IMPORTED_MODULE_1__dojo_widget_core_d__","__WEBPACK_IMPORTED_MODULE_5__menu_m_css__","__WEBPACK_IMPORTED_MODULE_2__dojo_widget_core_decorators_customElement__"," _key","menuContainer"],"mappings":"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","file":"menu-1.0.0.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 90c6db1ff77aa21b0220","import { createCompositeHandle } from './lang';\nimport Promise from '@dojo/shim/Promise';\n/**\n * No operation function to replace own once instance is destoryed\n */\nfunction noop() {\n return Promise.resolve(false);\n}\n/**\n * No op function used to replace own, once instance has been destoryed\n */\nfunction destroyed() {\n throw new Error('Call made to destroyed method');\n}\nexport class Destroyable {\n /**\n * @constructor\n */\n constructor() {\n this.handles = [];\n }\n /**\n * Register handles for the instance that will be destroyed when `this.destroy` is called\n *\n * @param {Handle} handle The handle to add for the instance\n * @returns {Handle} a handle for the handle, removes the handle for the instance and calls destroy\n */\n own(handles) {\n const handle = Array.isArray(handles) ? createCompositeHandle(...handles) : handles;\n const { handles: _handles } = this;\n _handles.push(handle);\n return {\n destroy() {\n _handles.splice(_handles.indexOf(handle));\n handle.destroy();\n }\n };\n }\n /**\n * Destrpys all handers registered for the instance\n *\n * @returns {Promise {\n this.handles.forEach((handle) => {\n handle && handle.destroy && handle.destroy();\n });\n this.destroy = noop;\n this.own = destroyed;\n resolve(true);\n });\n }\n}\nexport default Destroyable;\n//# sourceMappingURL=Destroyable.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/core/Destroyable.mjs\n// module id = ./node_modules/@dojo/core/Destroyable.mjs\n// module chunks = menu","import Map from '@dojo/shim/Map';\nimport { Destroyable } from './Destroyable';\n/**\n * Map of computed regular expressions, keyed by string\n */\nconst regexMap = new Map();\n/**\n * Determines is the event type glob has been matched\n *\n * @returns boolean that indicates if the glob is matched\n */\nexport function isGlobMatch(globString, targetString) {\n if (typeof targetString === 'string' && typeof globString === 'string' && globString.indexOf('*') !== -1) {\n let regex;\n if (regexMap.has(globString)) {\n regex = regexMap.get(globString);\n }\n else {\n regex = new RegExp(`^${globString.replace(/\\*/g, '.*')}$`);\n regexMap.set(globString, regex);\n }\n return regex.test(targetString);\n }\n else {\n return globString === targetString;\n }\n}\n/**\n * Event Class\n */\nexport class Evented extends Destroyable {\n constructor() {\n super(...arguments);\n /**\n * map of listeners keyed by event type\n */\n this.listenersMap = new Map();\n }\n emit(event) {\n this.listenersMap.forEach((methods, type) => {\n if (isGlobMatch(type, event.type)) {\n methods.forEach((method) => {\n method.call(this, event);\n });\n }\n });\n }\n on(type, listener) {\n if (Array.isArray(listener)) {\n const handles = listener.map((listener) => this._addListener(type, listener));\n return {\n destroy() {\n handles.forEach((handle) => handle.destroy());\n }\n };\n }\n return this._addListener(type, listener);\n }\n _addListener(type, listener) {\n const listeners = this.listenersMap.get(type) || [];\n listeners.push(listener);\n this.listenersMap.set(type, listeners);\n return {\n destroy: () => {\n const listeners = this.listenersMap.get(type) || [];\n listeners.splice(listeners.indexOf(listener), 1);\n }\n };\n }\n}\nexport default Evented;\n//# sourceMappingURL=Evented.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/core/Evented.mjs\n// module id = ./node_modules/@dojo/core/Evented.mjs\n// module chunks = menu","import { assign } from '@dojo/shim/object';\nexport { assign } from '@dojo/shim/object';\nconst slice = Array.prototype.slice;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Type guard that ensures that the value can be coerced to Object\n * to weed out host objects that do not derive from Object.\n * This function is used to check if we want to deep copy an object or not.\n * Note: In ES6 it is possible to modify an object's Symbol.toStringTag property, which will\n * change the value returned by `toString`. This is a rare edge case that is difficult to handle,\n * so it is not handled here.\n * @param value The value to check\n * @return If the value is coercible into an Object\n */\nfunction shouldDeepCopyObject(value) {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\nfunction copyArray(array, inherited) {\n return array.map(function (item) {\n if (Array.isArray(item)) {\n return copyArray(item, inherited);\n }\n return !shouldDeepCopyObject(item)\n ? item\n : _mixin({\n deep: true,\n inherited: inherited,\n sources: [item],\n target: {}\n });\n });\n}\nfunction _mixin(kwArgs) {\n const deep = kwArgs.deep;\n const inherited = kwArgs.inherited;\n const target = kwArgs.target;\n const copied = kwArgs.copied || [];\n const copiedClone = [...copied];\n for (let i = 0; i < kwArgs.sources.length; i++) {\n const source = kwArgs.sources[i];\n if (source === null || source === undefined) {\n continue;\n }\n for (let key in source) {\n if (inherited || hasOwnProperty.call(source, key)) {\n let value = source[key];\n if (copiedClone.indexOf(value) !== -1) {\n continue;\n }\n if (deep) {\n if (Array.isArray(value)) {\n value = copyArray(value, inherited);\n }\n else if (shouldDeepCopyObject(value)) {\n const targetValue = target[key] || {};\n copied.push(source);\n value = _mixin({\n deep: true,\n inherited: inherited,\n sources: [value],\n target: targetValue,\n copied\n });\n }\n }\n target[key] = value;\n }\n }\n }\n return target;\n}\nexport function create(prototype, ...mixins) {\n if (!mixins.length) {\n throw new RangeError('lang.create requires at least one mixin object.');\n }\n const args = mixins.slice();\n args.unshift(Object.create(prototype));\n return assign.apply(null, args);\n}\nexport function deepAssign(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: false,\n sources: sources,\n target: target\n });\n}\nexport function deepMixin(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Creates a new object using the provided source's prototype as the prototype for the new object, and then\n * deep copies the provided source's values into the new target.\n *\n * @param source The object to duplicate\n * @return The new object\n */\nexport function duplicate(source) {\n const target = Object.create(Object.getPrototypeOf(source));\n return deepMixin(target, source);\n}\n/**\n * Determines whether two values are the same value.\n *\n * @param a First value to compare\n * @param b Second value to compare\n * @return true if the values are the same; false otherwise\n */\nexport function isIdentical(a, b) {\n return (a === b ||\n /* both values are NaN */\n (a !== a && b !== b));\n}\n/**\n * Returns a function that binds a method to the specified object at runtime. This is similar to\n * `Function.prototype.bind`, but instead of a function it takes the name of a method on an object.\n * As a result, the function returned by `lateBind` will always call the function currently assigned to\n * the specified property on the object as of the moment the function it returns is called.\n *\n * @param instance The context object\n * @param method The name of the method on the context object to bind to itself\n * @param suppliedArgs An optional array of values to prepend to the `instance[method]` arguments list\n * @return The bound function\n */\nexport function lateBind(instance, method, ...suppliedArgs) {\n return suppliedArgs.length\n ? function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n // TS7017\n return instance[method].apply(instance, args);\n }\n : function () {\n // TS7017\n return instance[method].apply(instance, arguments);\n };\n}\nexport function mixin(target, ...sources) {\n return _mixin({\n deep: false,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Returns a function which invokes the given function with the given arguments prepended to its argument list.\n * Like `Function.prototype.bind`, but does not alter execution context.\n *\n * @param targetFunction The function that needs to be bound\n * @param suppliedArgs An optional array of arguments to prepend to the `targetFunction` arguments list\n * @return The bound function\n */\nexport function partial(targetFunction, ...suppliedArgs) {\n return function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n return targetFunction.apply(this, args);\n };\n}\n/**\n * Returns an object with a destroy method that, when called, calls the passed-in destructor.\n * This is intended to provide a unified interface for creating \"remove\" / \"destroy\" handlers for\n * event listeners, timers, etc.\n *\n * @param destructor A function that will be called when the handle's `destroy` method is invoked\n * @return The handle object\n */\nexport function createHandle(destructor) {\n let called = false;\n return {\n destroy: function () {\n if (!called) {\n called = true;\n destructor();\n }\n }\n };\n}\n/**\n * Returns a single handle that can be used to destroy multiple handles simultaneously.\n *\n * @param handles An array of handles with `destroy` methods\n * @return The handle object\n */\nexport function createCompositeHandle(...handles) {\n return createHandle(function () {\n for (let i = 0; i < handles.length; i++) {\n handles[i].destroy();\n }\n });\n}\n//# sourceMappingURL=lang.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/core/lang.mjs\n// module id = ./node_modules/@dojo/core/lang.mjs\n// module chunks = menu","function isFeatureTestThenable(value) {\n return value && value.then;\n}\n/**\n * A cache of results of feature tests\n */\nexport const testCache = {};\n/**\n * A cache of the un-resolved feature tests\n */\nexport const testFunctions = {};\n/**\n * A cache of unresolved thenables (probably promises)\n * @type {{}}\n */\nconst testThenables = {};\n/**\n * A reference to the global scope (`window` in a browser, `global` in NodeJS)\n */\nconst globalScope = (function () {\n /* istanbul ignore else */\n if (typeof window !== 'undefined') {\n // Browsers\n return window;\n }\n else if (typeof global !== 'undefined') {\n // Node\n return global;\n }\n else if (typeof self !== 'undefined') {\n // Web workers\n return self;\n }\n /* istanbul ignore next */\n return {};\n})();\n/* Grab the staticFeatures if there are available */\nconst { staticFeatures } = globalScope.DojoHasEnvironment || {};\n/* Cleaning up the DojoHasEnviornment */\nif ('DojoHasEnvironment' in globalScope) {\n delete globalScope.DojoHasEnvironment;\n}\n/**\n * Custom type guard to narrow the `staticFeatures` to either a map or a function that\n * returns a map.\n *\n * @param value The value to guard for\n */\nfunction isStaticFeatureFunction(value) {\n return typeof value === 'function';\n}\n/**\n * The cache of asserted features that were available in the global scope when the\n * module loaded\n */\nconst staticCache = staticFeatures\n ? isStaticFeatureFunction(staticFeatures) ? staticFeatures.apply(globalScope) : staticFeatures\n : {}; /* Providing an empty cache, if none was in the environment\n\n/**\n* AMD plugin function.\n*\n* Conditional loads modules based on a has feature test value.\n*\n* @param resourceId Gives the resolved module id to load.\n* @param require The loader require function with respect to the module that contained the plugin resource in its\n* dependency list.\n* @param load Callback to loader that consumes result of plugin demand.\n*/\nexport function load(resourceId, require, load, config) {\n resourceId ? require([resourceId], load) : load();\n}\n/**\n * AMD plugin function.\n *\n * Resolves resourceId into a module id based on possibly-nested tenary expression that branches on has feature test\n * value(s).\n *\n * @param resourceId The id of the module\n * @param normalize Resolves a relative module id into an absolute module id\n */\nexport function normalize(resourceId, normalize) {\n const tokens = resourceId.match(/[\\?:]|[^:\\?]*/g) || [];\n let i = 0;\n function get(skip) {\n const term = tokens[i++];\n if (term === ':') {\n // empty string module name, resolves to null\n return null;\n }\n else {\n // postfixed with a ? means it is a feature to branch on, the term is the name of the feature\n if (tokens[i++] === '?') {\n if (!skip && has(term)) {\n // matched the feature, get the first value from the options\n return get();\n }\n else {\n // did not match, get the second value, passing over the first\n get(true);\n return get(skip);\n }\n }\n // a module\n return term;\n }\n }\n const id = get();\n return id && normalize(id);\n}\n/**\n * Check if a feature has already been registered\n *\n * @param feature the name of the feature\n */\nexport function exists(feature) {\n const normalizedFeature = feature.toLowerCase();\n return Boolean(normalizedFeature in staticCache || normalizedFeature in testCache || testFunctions[normalizedFeature]);\n}\n/**\n * Register a new test for a named feature.\n *\n * @example\n * has.add('dom-addeventlistener', !!document.addEventListener);\n *\n * @example\n * has.add('touch-events', function () {\n * return 'ontouchstart' in document\n * });\n *\n * @param feature the name of the feature\n * @param value the value reported of the feature, or a function that will be executed once on first test\n * @param overwrite if an existing value should be overwritten. Defaults to false.\n */\nexport function add(feature, value, overwrite = false) {\n const normalizedFeature = feature.toLowerCase();\n if (exists(normalizedFeature) && !overwrite && !(normalizedFeature in staticCache)) {\n throw new TypeError(`Feature \"${feature}\" exists and overwrite not true.`);\n }\n if (typeof value === 'function') {\n testFunctions[normalizedFeature] = value;\n }\n else if (isFeatureTestThenable(value)) {\n testThenables[feature] = value.then((resolvedValue) => {\n testCache[feature] = resolvedValue;\n delete testThenables[feature];\n }, () => {\n delete testThenables[feature];\n });\n }\n else {\n testCache[normalizedFeature] = value;\n delete testFunctions[normalizedFeature];\n }\n}\n/**\n * Return the current value of a named feature.\n *\n * @param feature The name (if a string) or identifier (if an integer) of the feature to test.\n */\nexport default function has(feature) {\n let result;\n const normalizedFeature = feature.toLowerCase();\n if (normalizedFeature in staticCache) {\n result = staticCache[normalizedFeature];\n }\n else if (testFunctions[normalizedFeature]) {\n result = testCache[normalizedFeature] = testFunctions[normalizedFeature].call(null);\n delete testFunctions[normalizedFeature];\n }\n else if (normalizedFeature in testCache) {\n result = testCache[normalizedFeature];\n }\n else if (feature in testThenables) {\n return false;\n }\n else {\n throw new TypeError(`Attempt to detect unregistered has feature \"${feature}\"`);\n }\n return result;\n}\n/*\n * Out of the box feature tests\n */\n/* Environments */\n/* Used as a value to provide a debug only code path */\nadd('debug', true);\n/* Detects if the environment is \"browser like\" */\nadd('host-browser', typeof document !== 'undefined' && typeof location !== 'undefined');\n/* Detects if the environment appears to be NodeJS */\nadd('host-node', function () {\n if (typeof process === 'object' && process.versions && process.versions.node) {\n return process.versions.node;\n }\n});\n//# sourceMappingURL=has.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/has/has.mjs\n// module id = ./node_modules/@dojo/has/has.mjs\n// module chunks = menu","import { isArrayLike, ShimIterator } from './iterator';\nimport global from './global';\nimport { is as objectIs } from './object';\nimport has from './support/has';\nimport './Symbol';\nexport let Map = global.Map;\nif (!true) {\n Map = (_a = class Map {\n constructor(iterable) {\n this._keys = [];\n this._values = [];\n this[Symbol.toStringTag] = 'Map';\n if (iterable) {\n if (isArrayLike(iterable)) {\n for (let i = 0; i < iterable.length; i++) {\n const value = iterable[i];\n this.set(value[0], value[1]);\n }\n }\n else {\n for (const value of iterable) {\n this.set(value[0], value[1]);\n }\n }\n }\n }\n /**\n * An alternative to Array.prototype.indexOf using Object.is\n * to check for equality. See http://mzl.la/1zuKO2V\n */\n _indexOfKey(keys, key) {\n for (let i = 0, length = keys.length; i < length; i++) {\n if (objectIs(keys[i], key)) {\n return i;\n }\n }\n return -1;\n }\n get size() {\n return this._keys.length;\n }\n clear() {\n this._keys.length = this._values.length = 0;\n }\n delete(key) {\n const index = this._indexOfKey(this._keys, key);\n if (index < 0) {\n return false;\n }\n this._keys.splice(index, 1);\n this._values.splice(index, 1);\n return true;\n }\n entries() {\n const values = this._keys.map((key, i) => {\n return [key, this._values[i]];\n });\n return new ShimIterator(values);\n }\n forEach(callback, context) {\n const keys = this._keys;\n const values = this._values;\n for (let i = 0, length = keys.length; i < length; i++) {\n callback.call(context, values[i], keys[i], this);\n }\n }\n get(key) {\n const index = this._indexOfKey(this._keys, key);\n return index < 0 ? undefined : this._values[index];\n }\n has(key) {\n return this._indexOfKey(this._keys, key) > -1;\n }\n keys() {\n return new ShimIterator(this._keys);\n }\n set(key, value) {\n let index = this._indexOfKey(this._keys, key);\n index = index < 0 ? this._keys.length : index;\n this._keys[index] = key;\n this._values[index] = value;\n return this;\n }\n values() {\n return new ShimIterator(this._values);\n }\n [Symbol.iterator]() {\n return this.entries();\n }\n },\n _a[Symbol.species] = _a,\n _a);\n}\nexport default Map;\nvar _a;\n//# sourceMappingURL=Map.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/Map.mjs\n// module id = ./node_modules/@dojo/shim/Map.mjs\n// module chunks = menu","import global from './global';\nimport { queueMicroTask } from './support/queue';\nimport './Symbol';\nimport has from './support/has';\nexport let ShimPromise = global.Promise;\nexport const isThenable = function isThenable(value) {\n return value && typeof value.then === 'function';\n};\nif (!true) {\n global.Promise = ShimPromise = (_a = class Promise {\n /**\n * Creates a new Promise.\n *\n * @constructor\n *\n * @param executor\n * The executor function is called immediately when the Promise is instantiated. It is responsible for\n * starting the asynchronous operation when it is invoked.\n *\n * The executor must call either the passed `resolve` function when the asynchronous operation has completed\n * successfully, or the `reject` function when the operation fails.\n */\n constructor(executor) {\n /**\n * The current state of this promise.\n */\n this.state = 1 /* Pending */;\n this[Symbol.toStringTag] = 'Promise';\n /**\n * If true, the resolution of this promise is chained (\"locked in\") to another promise.\n */\n let isChained = false;\n /**\n * Whether or not this promise is in a resolved state.\n */\n const isResolved = () => {\n return this.state !== 1 /* Pending */ || isChained;\n };\n /**\n * Callbacks that should be invoked once the asynchronous operation has completed.\n */\n let callbacks = [];\n /**\n * Initially pushes callbacks onto a queue for execution once this promise settles. After the promise settles,\n * enqueues callbacks for execution on the next event loop turn.\n */\n let whenFinished = function (callback) {\n if (callbacks) {\n callbacks.push(callback);\n }\n };\n /**\n * Settles this promise.\n *\n * @param newState The resolved state for this promise.\n * @param {T|any} value The resolved value for this promise.\n */\n const settle = (newState, value) => {\n // A promise can only be settled once.\n if (this.state !== 1 /* Pending */) {\n return;\n }\n this.state = newState;\n this.resolvedValue = value;\n whenFinished = queueMicroTask;\n // Only enqueue a callback runner if there are callbacks so that initially fulfilled Promises don't have to\n // wait an extra turn.\n if (callbacks && callbacks.length > 0) {\n queueMicroTask(function () {\n if (callbacks) {\n let count = callbacks.length;\n for (let i = 0; i < count; ++i) {\n callbacks[i].call(null);\n }\n callbacks = null;\n }\n });\n }\n };\n /**\n * Resolves this promise.\n *\n * @param newState The resolved state for this promise.\n * @param {T|any} value The resolved value for this promise.\n */\n const resolve = (newState, value) => {\n if (isResolved()) {\n return;\n }\n if (isThenable(value)) {\n value.then(settle.bind(null, 0 /* Fulfilled */), settle.bind(null, 2 /* Rejected */));\n isChained = true;\n }\n else {\n settle(newState, value);\n }\n };\n this.then = (onFulfilled, onRejected) => {\n return new Promise((resolve, reject) => {\n // whenFinished initially queues up callbacks for execution after the promise has settled. Once the\n // promise has settled, whenFinished will schedule callbacks for execution on the next turn through the\n // event loop.\n whenFinished(() => {\n const callback = this.state === 2 /* Rejected */ ? onRejected : onFulfilled;\n if (typeof callback === 'function') {\n try {\n resolve(callback(this.resolvedValue));\n }\n catch (error) {\n reject(error);\n }\n }\n else if (this.state === 2 /* Rejected */) {\n reject(this.resolvedValue);\n }\n else {\n resolve(this.resolvedValue);\n }\n });\n });\n };\n try {\n executor(resolve.bind(null, 0 /* Fulfilled */), resolve.bind(null, 2 /* Rejected */));\n }\n catch (error) {\n settle(2 /* Rejected */, error);\n }\n }\n static all(iterable) {\n return new this(function (resolve, reject) {\n const values = [];\n let complete = 0;\n let total = 0;\n let populating = true;\n function fulfill(index, value) {\n values[index] = value;\n ++complete;\n finish();\n }\n function finish() {\n if (populating || complete < total) {\n return;\n }\n resolve(values);\n }\n function processItem(index, item) {\n ++total;\n if (isThenable(item)) {\n // If an item Promise rejects, this Promise is immediately rejected with the item\n // Promise's rejection error.\n item.then(fulfill.bind(null, index), reject);\n }\n else {\n Promise.resolve(item).then(fulfill.bind(null, index));\n }\n }\n let i = 0;\n for (const value of iterable) {\n processItem(i, value);\n i++;\n }\n populating = false;\n finish();\n });\n }\n static race(iterable) {\n return new this(function (resolve, reject) {\n for (const item of iterable) {\n if (item instanceof Promise) {\n // If a Promise item rejects, this Promise is immediately rejected with the item\n // Promise's rejection error.\n item.then(resolve, reject);\n }\n else {\n Promise.resolve(item).then(resolve);\n }\n }\n });\n }\n static reject(reason) {\n return new this(function (resolve, reject) {\n reject(reason);\n });\n }\n static resolve(value) {\n return new this(function (resolve) {\n resolve(value);\n });\n }\n catch(onRejected) {\n return this.then(undefined, onRejected);\n }\n },\n _a[Symbol.species] = ShimPromise,\n _a);\n}\nexport default ShimPromise;\nvar _a;\n//# sourceMappingURL=Promise.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/Promise.mjs\n// module id = ./node_modules/@dojo/shim/Promise.mjs\n// module chunks = menu","import has from './support/has';\nimport global from './global';\nimport { getValueDescriptor } from './support/util';\nexport let Symbol = global.Symbol;\nif (!true) {\n /**\n * Throws if the value is not a symbol, used internally within the Shim\n * @param {any} value The value to check\n * @return {symbol} Returns the symbol or throws\n */\n const validateSymbol = function validateSymbol(value) {\n if (!isSymbol(value)) {\n throw new TypeError(value + ' is not a symbol');\n }\n return value;\n };\n const defineProperties = Object.defineProperties;\n const defineProperty = Object.defineProperty;\n const create = Object.create;\n const objPrototype = Object.prototype;\n const globalSymbols = {};\n const getSymbolName = (function () {\n const created = create(null);\n return function (desc) {\n let postfix = 0;\n let name;\n while (created[String(desc) + (postfix || '')]) {\n ++postfix;\n }\n desc += String(postfix || '');\n created[desc] = true;\n name = '@@' + desc;\n // FIXME: Temporary guard until the duplicate execution when testing can be\n // pinned down.\n if (!Object.getOwnPropertyDescriptor(objPrototype, name)) {\n defineProperty(objPrototype, name, {\n set: function (value) {\n defineProperty(this, name, getValueDescriptor(value));\n }\n });\n }\n return name;\n };\n })();\n const InternalSymbol = function Symbol(description) {\n if (this instanceof InternalSymbol) {\n throw new TypeError('TypeError: Symbol is not a constructor');\n }\n return Symbol(description);\n };\n Symbol = global.Symbol = function Symbol(description) {\n if (this instanceof Symbol) {\n throw new TypeError('TypeError: Symbol is not a constructor');\n }\n const sym = Object.create(InternalSymbol.prototype);\n description = description === undefined ? '' : String(description);\n return defineProperties(sym, {\n __description__: getValueDescriptor(description),\n __name__: getValueDescriptor(getSymbolName(description))\n });\n };\n /* Decorate the Symbol function with the appropriate properties */\n defineProperty(Symbol, 'for', getValueDescriptor(function (key) {\n if (globalSymbols[key]) {\n return globalSymbols[key];\n }\n return (globalSymbols[key] = Symbol(String(key)));\n }));\n defineProperties(Symbol, {\n keyFor: getValueDescriptor(function (sym) {\n let key;\n validateSymbol(sym);\n for (key in globalSymbols) {\n if (globalSymbols[key] === sym) {\n return key;\n }\n }\n }),\n hasInstance: getValueDescriptor(Symbol.for('hasInstance'), false, false),\n isConcatSpreadable: getValueDescriptor(Symbol.for('isConcatSpreadable'), false, false),\n iterator: getValueDescriptor(Symbol.for('iterator'), false, false),\n match: getValueDescriptor(Symbol.for('match'), false, false),\n observable: getValueDescriptor(Symbol.for('observable'), false, false),\n replace: getValueDescriptor(Symbol.for('replace'), false, false),\n search: getValueDescriptor(Symbol.for('search'), false, false),\n species: getValueDescriptor(Symbol.for('species'), false, false),\n split: getValueDescriptor(Symbol.for('split'), false, false),\n toPrimitive: getValueDescriptor(Symbol.for('toPrimitive'), false, false),\n toStringTag: getValueDescriptor(Symbol.for('toStringTag'), false, false),\n unscopables: getValueDescriptor(Symbol.for('unscopables'), false, false)\n });\n /* Decorate the InternalSymbol object */\n defineProperties(InternalSymbol.prototype, {\n constructor: getValueDescriptor(Symbol),\n toString: getValueDescriptor(function () {\n return this.__name__;\n }, false, false)\n });\n /* Decorate the Symbol.prototype */\n defineProperties(Symbol.prototype, {\n toString: getValueDescriptor(function () {\n return 'Symbol (' + validateSymbol(this).__description__ + ')';\n }),\n valueOf: getValueDescriptor(function () {\n return validateSymbol(this);\n })\n });\n defineProperty(Symbol.prototype, Symbol.toPrimitive, getValueDescriptor(function () {\n return validateSymbol(this);\n }));\n defineProperty(Symbol.prototype, Symbol.toStringTag, getValueDescriptor('Symbol', false, false, true));\n defineProperty(InternalSymbol.prototype, Symbol.toPrimitive, getValueDescriptor(Symbol.prototype[Symbol.toPrimitive], false, false, true));\n defineProperty(InternalSymbol.prototype, Symbol.toStringTag, getValueDescriptor(Symbol.prototype[Symbol.toStringTag], false, false, true));\n}\n/**\n * A custom guard function that determines if an object is a symbol or not\n * @param {any} value The value to check to see if it is a symbol or not\n * @return {is symbol} Returns true if a symbol or not (and narrows the type guard)\n */\nexport function isSymbol(value) {\n return (value && (typeof value === 'symbol' || value['@@toStringTag'] === 'Symbol')) || false;\n}\n/**\n * Fill any missing well known symbols if the native Symbol is missing them\n */\n[\n 'hasInstance',\n 'isConcatSpreadable',\n 'iterator',\n 'species',\n 'replace',\n 'search',\n 'split',\n 'match',\n 'toPrimitive',\n 'toStringTag',\n 'unscopables',\n 'observable'\n].forEach((wellKnown) => {\n if (!Symbol[wellKnown]) {\n Object.defineProperty(Symbol, wellKnown, getValueDescriptor(Symbol.for(wellKnown), false, false));\n }\n});\nexport default Symbol;\n//# sourceMappingURL=Symbol.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/Symbol.mjs\n// module id = ./node_modules/@dojo/shim/Symbol.mjs\n// module chunks = menu","import global from './global';\nimport { isArrayLike } from './iterator';\nimport has from './support/has';\nimport './Symbol';\nexport let WeakMap = global.WeakMap;\nif (!true) {\n const DELETED = {};\n const getUID = function getUID() {\n return Math.floor(Math.random() * 100000000);\n };\n const generateName = (function () {\n let startId = Math.floor(Date.now() % 100000000);\n return function generateName() {\n return '__wm' + getUID() + (startId++ + '__');\n };\n })();\n WeakMap = class WeakMap {\n constructor(iterable) {\n this[Symbol.toStringTag] = 'WeakMap';\n this._name = generateName();\n this._frozenEntries = [];\n if (iterable) {\n if (isArrayLike(iterable)) {\n for (let i = 0; i < iterable.length; i++) {\n const item = iterable[i];\n this.set(item[0], item[1]);\n }\n }\n else {\n for (const [key, value] of iterable) {\n this.set(key, value);\n }\n }\n }\n }\n _getFrozenEntryIndex(key) {\n for (let i = 0; i < this._frozenEntries.length; i++) {\n if (this._frozenEntries[i].key === key) {\n return i;\n }\n }\n return -1;\n }\n delete(key) {\n if (key === undefined || key === null) {\n return false;\n }\n const entry = key[this._name];\n if (entry && entry.key === key && entry.value !== DELETED) {\n entry.value = DELETED;\n return true;\n }\n const frozenIndex = this._getFrozenEntryIndex(key);\n if (frozenIndex >= 0) {\n this._frozenEntries.splice(frozenIndex, 1);\n return true;\n }\n return false;\n }\n get(key) {\n if (key === undefined || key === null) {\n return undefined;\n }\n const entry = key[this._name];\n if (entry && entry.key === key && entry.value !== DELETED) {\n return entry.value;\n }\n const frozenIndex = this._getFrozenEntryIndex(key);\n if (frozenIndex >= 0) {\n return this._frozenEntries[frozenIndex].value;\n }\n }\n has(key) {\n if (key === undefined || key === null) {\n return false;\n }\n const entry = key[this._name];\n if (Boolean(entry && entry.key === key && entry.value !== DELETED)) {\n return true;\n }\n const frozenIndex = this._getFrozenEntryIndex(key);\n if (frozenIndex >= 0) {\n return true;\n }\n return false;\n }\n set(key, value) {\n if (!key || (typeof key !== 'object' && typeof key !== 'function')) {\n throw new TypeError('Invalid value used as weak map key');\n }\n let entry = key[this._name];\n if (!entry || entry.key !== key) {\n entry = Object.create(null, {\n key: { value: key }\n });\n if (Object.isFrozen(key)) {\n this._frozenEntries.push(entry);\n }\n else {\n Object.defineProperty(key, this._name, {\n value: entry\n });\n }\n }\n entry.value = value;\n return this;\n }\n };\n}\nexport default WeakMap;\n//# sourceMappingURL=WeakMap.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/WeakMap.mjs\n// module id = ./node_modules/@dojo/shim/WeakMap.mjs\n// module chunks = menu","import global from './global';\nimport { isArrayLike, isIterable } from './iterator';\nimport { MAX_SAFE_INTEGER } from './number';\nimport has from './support/has';\nimport { wrapNative } from './support/util';\nexport let from;\n/**\n * Creates a new array from the function parameters.\n *\n * @param arguments Any number of arguments for the array\n * @return An array from the given arguments\n */\nexport let of;\n/* ES6 Array instance methods */\n/**\n * Copies data internally within an array or array-like object.\n *\n * @param target The target array-like object\n * @param offset The index to start copying values to; if negative, it counts backwards from length\n * @param start The first (inclusive) index to copy; if negative, it counts backwards from length\n * @param end The last (exclusive) index to copy; if negative, it counts backwards from length\n * @return The target\n */\nexport let copyWithin;\n/**\n * Fills elements of an array-like object with the specified value.\n *\n * @param target The target to fill\n * @param value The value to fill each element of the target with\n * @param start The first index to fill\n * @param end The (exclusive) index at which to stop filling\n * @return The filled target\n */\nexport let fill;\n/**\n * Finds and returns the first instance matching the callback or undefined if one is not found.\n *\n * @param target An array-like object\n * @param callback A function returning if the current value matches a criteria\n * @param thisArg The execution context for the find function\n * @return The first element matching the callback, or undefined if one does not exist\n */\nexport let find;\n/**\n * Performs a linear search and returns the first index whose value satisfies the passed callback,\n * or -1 if no values satisfy it.\n *\n * @param target An array-like object\n * @param callback A function returning true if the current value satisfies its criteria\n * @param thisArg The execution context for the find function\n * @return The first index whose value satisfies the passed callback, or -1 if no values satisfy it\n */\nexport let findIndex;\n/* ES7 Array instance methods */\n/**\n * Determines whether an array includes a given value\n *\n * @param target the target array-like object\n * @param searchElement the item to search for\n * @param fromIndex the starting index to search from\n * @return `true` if the array includes the element, otherwise `false`\n */\nexport let includes;\nif (true && true) {\n from = global.Array.from;\n of = global.Array.of;\n copyWithin = wrapNative(global.Array.prototype.copyWithin);\n fill = wrapNative(global.Array.prototype.fill);\n find = wrapNative(global.Array.prototype.find);\n findIndex = wrapNative(global.Array.prototype.findIndex);\n}\nelse {\n // It is only older versions of Safari/iOS that have a bad fill implementation and so aren't in the wild\n // To make things easier, if there is a bad fill implementation, the whole set of functions will be filled\n /**\n * Ensures a non-negative, non-infinite, safe integer.\n *\n * @param length The number to validate\n * @return A proper length\n */\n const toLength = function toLength(length) {\n if (isNaN(length)) {\n return 0;\n }\n length = Number(length);\n if (isFinite(length)) {\n length = Math.floor(length);\n }\n // Ensure a non-negative, real, safe integer\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\n };\n /**\n * From ES6 7.1.4 ToInteger()\n *\n * @param value A value to convert\n * @return An integer\n */\n const toInteger = function toInteger(value) {\n value = Number(value);\n if (isNaN(value)) {\n return 0;\n }\n if (value === 0 || !isFinite(value)) {\n return value;\n }\n return (value > 0 ? 1 : -1) * Math.floor(Math.abs(value));\n };\n /**\n * Normalizes an offset against a given length, wrapping it if negative.\n *\n * @param value The original offset\n * @param length The total length to normalize against\n * @return If negative, provide a distance from the end (length); otherwise provide a distance from 0\n */\n const normalizeOffset = function normalizeOffset(value, length) {\n return value < 0 ? Math.max(length + value, 0) : Math.min(value, length);\n };\n from = function from(arrayLike, mapFunction, thisArg) {\n if (arrayLike == null) {\n throw new TypeError('from: requires an array-like object');\n }\n if (mapFunction && thisArg) {\n mapFunction = mapFunction.bind(thisArg);\n }\n /* tslint:disable-next-line:variable-name */\n const Constructor = this;\n const length = toLength(arrayLike.length);\n // Support extension\n const array = typeof Constructor === 'function' ? Object(new Constructor(length)) : new Array(length);\n if (!isArrayLike(arrayLike) && !isIterable(arrayLike)) {\n return array;\n }\n // if this is an array and the normalized length is 0, just return an empty array. this prevents a problem\n // with the iteration on IE when using a NaN array length.\n if (isArrayLike(arrayLike)) {\n if (length === 0) {\n return [];\n }\n for (let i = 0; i < arrayLike.length; i++) {\n array[i] = mapFunction ? mapFunction(arrayLike[i], i) : arrayLike[i];\n }\n }\n else {\n let i = 0;\n for (const value of arrayLike) {\n array[i] = mapFunction ? mapFunction(value, i) : value;\n i++;\n }\n }\n if (arrayLike.length !== undefined) {\n array.length = length;\n }\n return array;\n };\n of = function of(...items) {\n return Array.prototype.slice.call(items);\n };\n copyWithin = function copyWithin(target, offset, start, end) {\n if (target == null) {\n throw new TypeError('copyWithin: target must be an array-like object');\n }\n const length = toLength(target.length);\n offset = normalizeOffset(toInteger(offset), length);\n start = normalizeOffset(toInteger(start), length);\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\n let count = Math.min(end - start, length - offset);\n let direction = 1;\n if (offset > start && offset < start + count) {\n direction = -1;\n start += count - 1;\n offset += count - 1;\n }\n while (count > 0) {\n if (start in target) {\n target[offset] = target[start];\n }\n else {\n delete target[offset];\n }\n offset += direction;\n start += direction;\n count--;\n }\n return target;\n };\n fill = function fill(target, value, start, end) {\n const length = toLength(target.length);\n let i = normalizeOffset(toInteger(start), length);\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\n while (i < end) {\n target[i++] = value;\n }\n return target;\n };\n find = function find(target, callback, thisArg) {\n const index = findIndex(target, callback, thisArg);\n return index !== -1 ? target[index] : undefined;\n };\n findIndex = function findIndex(target, callback, thisArg) {\n const length = toLength(target.length);\n if (!callback) {\n throw new TypeError('find: second argument must be a function');\n }\n if (thisArg) {\n callback = callback.bind(thisArg);\n }\n for (let i = 0; i < length; i++) {\n if (callback(target[i], i, target)) {\n return i;\n }\n }\n return -1;\n };\n}\nif (true) {\n includes = wrapNative(global.Array.prototype.includes);\n}\nelse {\n /**\n * Ensures a non-negative, non-infinite, safe integer.\n *\n * @param length The number to validate\n * @return A proper length\n */\n const toLength = function toLength(length) {\n length = Number(length);\n if (isNaN(length)) {\n return 0;\n }\n if (isFinite(length)) {\n length = Math.floor(length);\n }\n // Ensure a non-negative, real, safe integer\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\n };\n includes = function includes(target, searchElement, fromIndex = 0) {\n let len = toLength(target.length);\n for (let i = fromIndex; i < len; ++i) {\n const currentElement = target[i];\n if (searchElement === currentElement ||\n (searchElement !== searchElement && currentElement !== currentElement)) {\n return true;\n }\n }\n return false;\n };\n}\n//# sourceMappingURL=array.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/array.mjs\n// module id = ./node_modules/@dojo/shim/array.mjs\n// module chunks = menu","const globalObject = (function () {\n if (typeof global !== 'undefined') {\n // global spec defines a reference to the global object called 'global'\n // https://github.com/tc39/proposal-global\n // `global` is also defined in NodeJS\n return global;\n }\n else if (typeof window !== 'undefined') {\n // window is defined in browsers\n return window;\n }\n else if (typeof self !== 'undefined') {\n // self is defined in WebWorkers\n return self;\n }\n})();\nexport default globalObject;\n//# sourceMappingURL=global.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/global.mjs\n// module id = ./node_modules/@dojo/shim/global.mjs\n// module chunks = menu","import global from './global';\n/**\n * The smallest interval between two representable numbers.\n */\nexport const EPSILON = 1;\n/**\n * The maximum safe integer in JavaScript\n */\nexport const MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n/**\n * The minimum safe integer in JavaScript\n */\nexport const MIN_SAFE_INTEGER = -MAX_SAFE_INTEGER;\n/**\n * Determines whether the passed value is NaN without coersion.\n *\n * @param value The value to test\n * @return true if the value is NaN, false if it is not\n */\nexport function isNaN(value) {\n return typeof value === 'number' && global.isNaN(value);\n}\n/**\n * Determines whether the passed value is a finite number without coersion.\n *\n * @param value The value to test\n * @return true if the value is finite, false if it is not\n */\nexport function isFinite(value) {\n return typeof value === 'number' && global.isFinite(value);\n}\n/**\n * Determines whether the passed value is an integer.\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isInteger(value) {\n return isFinite(value) && Math.floor(value) === value;\n}\n/**\n * Determines whether the passed value is an integer that is 'safe,' meaning:\n * 1. it can be expressed as an IEEE-754 double precision number\n * 2. it has a one-to-one mapping to a mathematical integer, meaning its\n * IEEE-754 representation cannot be the result of rounding any other\n * integer to fit the IEEE-754 representation\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isSafeInteger(value) {\n return isInteger(value) && Math.abs(value) <= MAX_SAFE_INTEGER;\n}\n//# sourceMappingURL=number.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/number.mjs\n// module id = ./node_modules/@dojo/shim/number.mjs\n// module chunks = menu","import global from './global';\nimport has from './support/has';\nimport { isSymbol } from './Symbol';\nexport let assign;\n/**\n * Gets the own property descriptor of the specified object.\n * An own property descriptor is one that is defined directly on the object and is not\n * inherited from the object's prototype.\n * @param o Object that contains the property.\n * @param p Name of the property.\n */\nexport let getOwnPropertyDescriptor;\n/**\n * Returns the names of the own properties of an object. The own properties of an object are those that are defined directly\n * on that object, and are not inherited from the object's prototype. The properties of an object include both fields (objects) and functions.\n * @param o Object that contains the own properties.\n */\nexport let getOwnPropertyNames;\n/**\n * Returns an array of all symbol properties found directly on object o.\n * @param o Object to retrieve the symbols from.\n */\nexport let getOwnPropertySymbols;\n/**\n * Returns true if the values are the same value, false otherwise.\n * @param value1 The first value.\n * @param value2 The second value.\n */\nexport let is;\n/**\n * Returns the names of the enumerable properties and methods of an object.\n * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.\n */\nexport let keys;\n/* ES7 Object static methods */\nexport let getOwnPropertyDescriptors;\nexport let entries;\nexport let values;\nif (true) {\n const globalObject = global.Object;\n assign = globalObject.assign;\n getOwnPropertyDescriptor = globalObject.getOwnPropertyDescriptor;\n getOwnPropertyNames = globalObject.getOwnPropertyNames;\n getOwnPropertySymbols = globalObject.getOwnPropertySymbols;\n is = globalObject.is;\n keys = globalObject.keys;\n}\nelse {\n keys = function symbolAwareKeys(o) {\n return Object.keys(o).filter((key) => !Boolean(key.match(/^@@.+/)));\n };\n assign = function assign(target, ...sources) {\n if (target == null) {\n // TypeError if undefined or null\n throw new TypeError('Cannot convert undefined or null to object');\n }\n const to = Object(target);\n sources.forEach((nextSource) => {\n if (nextSource) {\n // Skip over if undefined or null\n keys(nextSource).forEach((nextKey) => {\n to[nextKey] = nextSource[nextKey];\n });\n }\n });\n return to;\n };\n getOwnPropertyDescriptor = function getOwnPropertyDescriptor(o, prop) {\n if (isSymbol(prop)) {\n return Object.getOwnPropertyDescriptor(o, prop);\n }\n else {\n return Object.getOwnPropertyDescriptor(o, prop);\n }\n };\n getOwnPropertyNames = function getOwnPropertyNames(o) {\n return Object.getOwnPropertyNames(o).filter((key) => !Boolean(key.match(/^@@.+/)));\n };\n getOwnPropertySymbols = function getOwnPropertySymbols(o) {\n return Object.getOwnPropertyNames(o)\n .filter((key) => Boolean(key.match(/^@@.+/)))\n .map((key) => Symbol.for(key.substring(2)));\n };\n is = function is(value1, value2) {\n if (value1 === value2) {\n return value1 !== 0 || 1 / value1 === 1 / value2; // -0\n }\n return value1 !== value1 && value2 !== value2; // NaN\n };\n}\nif (true) {\n const globalObject = global.Object;\n getOwnPropertyDescriptors = globalObject.getOwnPropertyDescriptors;\n entries = globalObject.entries;\n values = globalObject.values;\n}\nelse {\n getOwnPropertyDescriptors = function getOwnPropertyDescriptors(o) {\n return getOwnPropertyNames(o).reduce((previous, key) => {\n previous[key] = getOwnPropertyDescriptor(o, key);\n return previous;\n }, {});\n };\n entries = function entries(o) {\n return keys(o).map((key) => [key, o[key]]);\n };\n values = function values(o) {\n return keys(o).map((key) => o[key]);\n };\n}\n//# sourceMappingURL=object.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/object.mjs\n// module id = ./node_modules/@dojo/shim/object.mjs\n// module chunks = menu","import global from './global';\nimport has from './support/has';\nimport { wrapNative } from './support/util';\n/**\n * The minimum location of high surrogates\n */\nexport const HIGH_SURROGATE_MIN = 0xd800;\n/**\n * The maximum location of high surrogates\n */\nexport const HIGH_SURROGATE_MAX = 0xdbff;\n/**\n * The minimum location of low surrogates\n */\nexport const LOW_SURROGATE_MIN = 0xdc00;\n/**\n * The maximum location of low surrogates\n */\nexport const LOW_SURROGATE_MAX = 0xdfff;\n/* ES6 static methods */\n/**\n * Return the String value whose elements are, in order, the elements in the List elements.\n * If length is 0, the empty string is returned.\n * @param codePoints The code points to generate the string\n */\nexport let fromCodePoint;\n/**\n * `raw` is intended for use as a tag function of a Tagged Template String. When called\n * as such the first argument will be a well formed template call site object and the rest\n * parameter will contain the substitution values.\n * @param template A well-formed template string call site representation.\n * @param substitutions A set of substitution values.\n */\nexport let raw;\n/* ES6 instance methods */\n/**\n * Returns a nonnegative integer Number less than 1114112 (0x110000) that is the code point\n * value of the UTF-16 encoded code point starting at the string element at position pos in\n * the String resulting from converting this object to a String.\n * If there is no element at that position, the result is undefined.\n * If a valid UTF-16 surrogate pair does not begin at pos, the result is the code unit at pos.\n */\nexport let codePointAt;\n/**\n * Returns true if the sequence of elements of searchString converted to a String is the\n * same as the corresponding elements of this object (converted to a String) starting at\n * endPosition – length(this). Otherwise returns false.\n */\nexport let endsWith;\n/**\n * Returns true if searchString appears as a substring of the result of converting this\n * object to a String, at one or more positions that are\n * greater than or equal to position; otherwise, returns false.\n * @param target The target string\n * @param searchString search string\n * @param position If position is undefined, 0 is assumed, so as to search all of the String.\n */\nexport let includes;\n/**\n * Returns the String value result of normalizing the string into the normalization form\n * named by form as specified in Unicode Standard Annex #15, Unicode Normalization Forms.\n * @param target The target string\n * @param form Applicable values: \"NFC\", \"NFD\", \"NFKC\", or \"NFKD\", If not specified default\n * is \"NFC\"\n */\nexport let normalize;\n/**\n * Returns a String value that is made from count copies appended together. If count is 0,\n * T is the empty String is returned.\n * @param count number of copies to append\n */\nexport let repeat;\n/**\n * Returns true if the sequence of elements of searchString converted to a String is the\n * same as the corresponding elements of this object (converted to a String) starting at\n * position. Otherwise returns false.\n */\nexport let startsWith;\n/* ES7 instance methods */\n/**\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\n * The padding is applied from the end (right) of the current string.\n *\n * @param target The target string\n * @param maxLength The length of the resulting string once the current string has been padded.\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\n *\n * @param fillString The string to pad the current string with.\n * If this string is too long, it will be truncated and the left-most part will be applied.\n * The default value for this parameter is \" \" (U+0020).\n */\nexport let padEnd;\n/**\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\n * The padding is applied from the start (left) of the current string.\n *\n * @param target The target string\n * @param maxLength The length of the resulting string once the current string has been padded.\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\n *\n * @param fillString The string to pad the current string with.\n * If this string is too long, it will be truncated and the left-most part will be applied.\n * The default value for this parameter is \" \" (U+0020).\n */\nexport let padStart;\nif (true && true) {\n fromCodePoint = global.String.fromCodePoint;\n raw = global.String.raw;\n codePointAt = wrapNative(global.String.prototype.codePointAt);\n endsWith = wrapNative(global.String.prototype.endsWith);\n includes = wrapNative(global.String.prototype.includes);\n normalize = wrapNative(global.String.prototype.normalize);\n repeat = wrapNative(global.String.prototype.repeat);\n startsWith = wrapNative(global.String.prototype.startsWith);\n}\nelse {\n /**\n * Validates that text is defined, and normalizes position (based on the given default if the input is NaN).\n * Used by startsWith, includes, and endsWith.\n *\n * @return Normalized position.\n */\n const normalizeSubstringArgs = function (name, text, search, position, isEnd = false) {\n if (text == null) {\n throw new TypeError('string.' + name + ' requires a valid string to search against.');\n }\n const length = text.length;\n position = position !== position ? (isEnd ? length : 0) : position;\n return [text, String(search), Math.min(Math.max(position, 0), length)];\n };\n fromCodePoint = function fromCodePoint(...codePoints) {\n // Adapted from https://github.com/mathiasbynens/String.fromCodePoint\n const length = arguments.length;\n if (!length) {\n return '';\n }\n const fromCharCode = String.fromCharCode;\n const MAX_SIZE = 0x4000;\n let codeUnits = [];\n let index = -1;\n let result = '';\n while (++index < length) {\n let codePoint = Number(arguments[index]);\n // Code points must be finite integers within the valid range\n let isValid = isFinite(codePoint) && Math.floor(codePoint) === codePoint && codePoint >= 0 && codePoint <= 0x10ffff;\n if (!isValid) {\n throw RangeError('string.fromCodePoint: Invalid code point ' + codePoint);\n }\n if (codePoint <= 0xffff) {\n // BMP code point\n codeUnits.push(codePoint);\n }\n else {\n // Astral code point; split in surrogate halves\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n codePoint -= 0x10000;\n let highSurrogate = (codePoint >> 10) + HIGH_SURROGATE_MIN;\n let lowSurrogate = codePoint % 0x400 + LOW_SURROGATE_MIN;\n codeUnits.push(highSurrogate, lowSurrogate);\n }\n if (index + 1 === length || codeUnits.length > MAX_SIZE) {\n result += fromCharCode.apply(null, codeUnits);\n codeUnits.length = 0;\n }\n }\n return result;\n };\n raw = function raw(callSite, ...substitutions) {\n let rawStrings = callSite.raw;\n let result = '';\n let numSubstitutions = substitutions.length;\n if (callSite == null || callSite.raw == null) {\n throw new TypeError('string.raw requires a valid callSite object with a raw value');\n }\n for (let i = 0, length = rawStrings.length; i < length; i++) {\n result += rawStrings[i] + (i < numSubstitutions && i < length - 1 ? substitutions[i] : '');\n }\n return result;\n };\n codePointAt = function codePointAt(text, position = 0) {\n // Adapted from https://github.com/mathiasbynens/String.prototype.codePointAt\n if (text == null) {\n throw new TypeError('string.codePointAt requries a valid string.');\n }\n const length = text.length;\n if (position !== position) {\n position = 0;\n }\n if (position < 0 || position >= length) {\n return undefined;\n }\n // Get the first code unit\n const first = text.charCodeAt(position);\n if (first >= HIGH_SURROGATE_MIN && first <= HIGH_SURROGATE_MAX && length > position + 1) {\n // Start of a surrogate pair (high surrogate and there is a next code unit); check for low surrogate\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n const second = text.charCodeAt(position + 1);\n if (second >= LOW_SURROGATE_MIN && second <= LOW_SURROGATE_MAX) {\n return (first - HIGH_SURROGATE_MIN) * 0x400 + second - LOW_SURROGATE_MIN + 0x10000;\n }\n }\n return first;\n };\n endsWith = function endsWith(text, search, endPosition) {\n if (endPosition == null) {\n endPosition = text.length;\n }\n [text, search, endPosition] = normalizeSubstringArgs('endsWith', text, search, endPosition, true);\n const start = endPosition - search.length;\n if (start < 0) {\n return false;\n }\n return text.slice(start, endPosition) === search;\n };\n includes = function includes(text, search, position = 0) {\n [text, search, position] = normalizeSubstringArgs('includes', text, search, position);\n return text.indexOf(search, position) !== -1;\n };\n repeat = function repeat(text, count = 0) {\n // Adapted from https://github.com/mathiasbynens/String.prototype.repeat\n if (text == null) {\n throw new TypeError('string.repeat requires a valid string.');\n }\n if (count !== count) {\n count = 0;\n }\n if (count < 0 || count === Infinity) {\n throw new RangeError('string.repeat requires a non-negative finite count.');\n }\n let result = '';\n while (count) {\n if (count % 2) {\n result += text;\n }\n if (count > 1) {\n text += text;\n }\n count >>= 1;\n }\n return result;\n };\n startsWith = function startsWith(text, search, position = 0) {\n search = String(search);\n [text, search, position] = normalizeSubstringArgs('startsWith', text, search, position);\n const end = position + search.length;\n if (end > text.length) {\n return false;\n }\n return text.slice(position, end) === search;\n };\n}\nif (true) {\n padEnd = wrapNative(global.String.prototype.padEnd);\n padStart = wrapNative(global.String.prototype.padStart);\n}\nelse {\n padEnd = function padEnd(text, maxLength, fillString = ' ') {\n if (text === null || text === undefined) {\n throw new TypeError('string.repeat requires a valid string.');\n }\n if (maxLength === Infinity) {\n throw new RangeError('string.padEnd requires a non-negative finite count.');\n }\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\n maxLength = 0;\n }\n let strText = String(text);\n const padding = maxLength - strText.length;\n if (padding > 0) {\n strText +=\n repeat(fillString, Math.floor(padding / fillString.length)) +\n fillString.slice(0, padding % fillString.length);\n }\n return strText;\n };\n padStart = function padStart(text, maxLength, fillString = ' ') {\n if (text === null || text === undefined) {\n throw new TypeError('string.repeat requires a valid string.');\n }\n if (maxLength === Infinity) {\n throw new RangeError('string.padStart requires a non-negative finite count.');\n }\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\n maxLength = 0;\n }\n let strText = String(text);\n const padding = maxLength - strText.length;\n if (padding > 0) {\n strText =\n repeat(fillString, Math.floor(padding / fillString.length)) +\n fillString.slice(0, padding % fillString.length) +\n strText;\n }\n return strText;\n };\n}\n//# sourceMappingURL=string.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/string.mjs\n// module id = ./node_modules/@dojo/shim/string.mjs\n// module chunks = menu","import has, { add } from '@dojo/has/has';\nimport global from '../global';\nexport default has;\nexport * from '@dojo/has/has';\n/* ECMAScript 6 and 7 Features */\n/* Array */\nadd('es6-array', () => {\n return (['from', 'of'].every((key) => key in global.Array) &&\n ['findIndex', 'find', 'copyWithin'].every((key) => key in global.Array.prototype));\n}, true);\nadd('es6-array-fill', () => {\n if ('fill' in global.Array.prototype) {\n /* Some versions of Safari do not properly implement this */\n return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1;\n }\n return false;\n}, true);\nadd('es7-array', () => 'includes' in global.Array.prototype, true);\n/* Map */\nadd('es6-map', () => {\n if (typeof global.Map === 'function') {\n /*\n IE11 and older versions of Safari are missing critical ES6 Map functionality\n We wrap this in a try/catch because sometimes the Map constructor exists, but does not\n take arguments (iOS 8.4)\n */\n try {\n const map = new global.Map([[0, 1]]);\n return map.has(0) &&\n typeof map.keys === 'function' &&\n true &&\n typeof map.values === 'function' &&\n typeof map.entries === 'function';\n }\n catch (e) {\n /* istanbul ignore next: not testing on iOS at the moment */\n return false;\n }\n }\n return false;\n}, true);\n/* Math */\nadd('es6-math', () => {\n return [\n 'clz32',\n 'sign',\n 'log10',\n 'log2',\n 'log1p',\n 'expm1',\n 'cosh',\n 'sinh',\n 'tanh',\n 'acosh',\n 'asinh',\n 'atanh',\n 'trunc',\n 'fround',\n 'cbrt',\n 'hypot'\n ].every((name) => typeof global.Math[name] === 'function');\n}, true);\nadd('es6-math-imul', () => {\n if ('imul' in global.Math) {\n /* Some versions of Safari on ios do not properly implement this */\n return Math.imul(0xffffffff, 5) === -5;\n }\n return false;\n}, true);\n/* Object */\nadd('es6-object', () => {\n return true &&\n ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof global.Object[name] === 'function');\n}, true);\nadd('es2017-object', () => {\n return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof global.Object[name] === 'function');\n}, true);\n/* Observable */\nadd('es-observable', () => typeof global.Observable !== 'undefined', true);\n/* Promise */\nadd('es6-promise', () => typeof global.Promise !== 'undefined' && true, true);\n/* Set */\nadd('es6-set', () => {\n if (typeof global.Set === 'function') {\n /* IE11 and older versions of Safari are missing critical ES6 Set functionality */\n const set = new global.Set([1]);\n return set.has(1) && 'keys' in set && typeof set.keys === 'function' && true;\n }\n return false;\n}, true);\n/* String */\nadd('es6-string', () => {\n return ([\n /* static methods */\n 'fromCodePoint'\n ].every((key) => typeof global.String[key] === 'function') &&\n [\n /* instance methods */\n 'codePointAt',\n 'normalize',\n 'repeat',\n 'startsWith',\n 'endsWith',\n 'includes'\n ].every((key) => typeof global.String.prototype[key] === 'function'));\n}, true);\nadd('es6-string-raw', () => {\n function getCallSite(callSite, ...substitutions) {\n const result = [...callSite];\n result.raw = callSite.raw;\n return result;\n }\n if ('raw' in global.String) {\n let b = 1;\n let callSite = getCallSite `a\\n${b}`;\n callSite.raw = ['a\\\\n'];\n const supportsTrunc = global.String.raw(callSite, 42) === 'a:\\\\n';\n return supportsTrunc;\n }\n return false;\n}, true);\nadd('es2017-string', () => {\n return ['padStart', 'padEnd'].every((key) => typeof global.String.prototype[key] === 'function');\n}, true);\n/* Symbol */\nadd('es6-symbol', () => typeof global.Symbol !== 'undefined' && typeof Symbol() === 'symbol', true);\n/* WeakMap */\nadd('es6-weakmap', () => {\n if (typeof global.WeakMap !== 'undefined') {\n /* IE11 and older versions of Safari are missing critical ES6 Map functionality */\n const key1 = {};\n const key2 = {};\n const map = new global.WeakMap([[key1, 1]]);\n Object.freeze(key1);\n return map.get(key1) === 1 && map.set(key2, 2) === map && true;\n }\n return false;\n}, true);\n/* Miscellaneous features */\nadd('microtasks', () => true || false || true, true);\nadd('postmessage', () => {\n // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have\n // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist.\n return typeof global.window !== 'undefined' && typeof global.postMessage === 'function';\n}, true);\nadd('raf', () => typeof global.requestAnimationFrame === 'function', true);\nadd('setimmediate', () => typeof global.setImmediate !== 'undefined', true);\n/* DOM Features */\nadd('dom-mutationobserver', () => {\n if (true && Boolean(global.MutationObserver || global.WebKitMutationObserver)) {\n // IE11 has an unreliable MutationObserver implementation where setProperty() does not\n // generate a mutation event, observers can crash, and the queue does not drain\n // reliably. The following feature test was adapted from\n // https://gist.github.com/t10ko/4aceb8c71681fdb275e33efe5e576b14\n const example = document.createElement('div');\n /* tslint:disable-next-line:variable-name */\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\n const observer = new HostMutationObserver(function () { });\n observer.observe(example, { attributes: true });\n example.style.setProperty('display', 'block');\n return Boolean(observer.takeRecords().length);\n }\n return false;\n}, true);\nadd('dom-webanimation', () => true && global.Animation !== undefined && global.KeyframeEffect !== undefined, true);\n//# sourceMappingURL=has.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/support/has.mjs\n// module id = ./node_modules/@dojo/shim/support/has.mjs\n// module chunks = menu","import global from '../global';\nimport has from './has';\nfunction executeTask(item) {\n if (item && item.isActive && item.callback) {\n item.callback();\n }\n}\nfunction getQueueHandle(item, destructor) {\n return {\n destroy: function () {\n this.destroy = function () { };\n item.isActive = false;\n item.callback = null;\n if (destructor) {\n destructor();\n }\n }\n };\n}\nlet checkMicroTaskQueue;\nlet microTasks;\n/**\n * Schedules a callback to the macrotask queue.\n *\n * @param callback the function to be queued and later executed.\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\n */\nexport const queueTask = (function () {\n let destructor;\n let enqueue;\n // Since the IE implementation of `setImmediate` is not flawless, we will test for `postMessage` first.\n if (true) {\n const queue = [];\n global.addEventListener('message', function (event) {\n // Confirm that the event was triggered by the current window and by this particular implementation.\n if (event.source === global && event.data === 'dojo-queue-message') {\n event.stopPropagation();\n if (queue.length) {\n executeTask(queue.shift());\n }\n }\n });\n enqueue = function (item) {\n queue.push(item);\n global.postMessage('dojo-queue-message', '*');\n };\n }\n else if (false) {\n destructor = global.clearImmediate;\n enqueue = function (item) {\n return setImmediate(executeTask.bind(null, item));\n };\n }\n else {\n destructor = global.clearTimeout;\n enqueue = function (item) {\n return setTimeout(executeTask.bind(null, item), 0);\n };\n }\n function queueTask(callback) {\n const item = {\n isActive: true,\n callback: callback\n };\n const id = enqueue(item);\n return getQueueHandle(item, destructor &&\n function () {\n destructor(id);\n });\n }\n // TODO: Use aspect.before when it is available.\n return true\n ? queueTask\n : function (callback) {\n checkMicroTaskQueue();\n return queueTask(callback);\n };\n})();\n// When no mechanism for registering microtasks is exposed by the environment, microtasks will\n// be queued and then executed in a single macrotask before the other macrotasks are executed.\nif (!true) {\n let isMicroTaskQueued = false;\n microTasks = [];\n checkMicroTaskQueue = function () {\n if (!isMicroTaskQueued) {\n isMicroTaskQueued = true;\n queueTask(function () {\n isMicroTaskQueued = false;\n if (microTasks.length) {\n let item;\n while ((item = microTasks.shift())) {\n executeTask(item);\n }\n }\n });\n }\n };\n}\n/**\n * Schedules an animation task with `window.requestAnimationFrame` if it exists, or with `queueTask` otherwise.\n *\n * Since requestAnimationFrame's behavior does not match that expected from `queueTask`, it is not used there.\n * However, at times it makes more sense to delegate to requestAnimationFrame; hence the following method.\n *\n * @param callback the function to be queued and later executed.\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\n */\nexport const queueAnimationTask = (function () {\n if (!true) {\n return queueTask;\n }\n function queueAnimationTask(callback) {\n const item = {\n isActive: true,\n callback: callback\n };\n const rafId = requestAnimationFrame(executeTask.bind(null, item));\n return getQueueHandle(item, function () {\n cancelAnimationFrame(rafId);\n });\n }\n // TODO: Use aspect.before when it is available.\n return true\n ? queueAnimationTask\n : function (callback) {\n checkMicroTaskQueue();\n return queueAnimationTask(callback);\n };\n})();\n/**\n * Schedules a callback to the microtask queue.\n *\n * Any callbacks registered with `queueMicroTask` will be executed before the next macrotask. If no native\n * mechanism for scheduling macrotasks is exposed, then any callbacks will be fired before any macrotask\n * registered with `queueTask` or `queueAnimationTask`.\n *\n * @param callback the function to be queued and later executed.\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\n */\nexport let queueMicroTask = (function () {\n let enqueue;\n if (false) {\n enqueue = function (item) {\n global.process.nextTick(executeTask.bind(null, item));\n };\n }\n else if (true) {\n enqueue = function (item) {\n global.Promise.resolve(item).then(executeTask);\n };\n }\n else if (true) {\n /* tslint:disable-next-line:variable-name */\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\n const node = document.createElement('div');\n const queue = [];\n const observer = new HostMutationObserver(function () {\n while (queue.length > 0) {\n const item = queue.shift();\n if (item && item.isActive && item.callback) {\n item.callback();\n }\n }\n });\n observer.observe(node, { attributes: true });\n enqueue = function (item) {\n queue.push(item);\n node.setAttribute('queueStatus', '1');\n };\n }\n else {\n enqueue = function (item) {\n checkMicroTaskQueue();\n microTasks.push(item);\n };\n }\n return function (callback) {\n const item = {\n isActive: true,\n callback: callback\n };\n enqueue(item);\n return getQueueHandle(item);\n };\n})();\n//# sourceMappingURL=queue.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/support/queue.mjs\n// module id = ./node_modules/@dojo/shim/support/queue.mjs\n// module chunks = menu","/**\n * Helper function to generate a value property descriptor\n *\n * @param value The value the property descriptor should be set to\n * @param enumerable If the property should be enumberable, defaults to false\n * @param writable If the property should be writable, defaults to true\n * @param configurable If the property should be configurable, defaults to true\n * @return The property descriptor object\n */\nexport function getValueDescriptor(value, enumerable = false, writable = true, configurable = true) {\n return {\n value: value,\n enumerable: enumerable,\n writable: writable,\n configurable: configurable\n };\n}\nexport function wrapNative(nativeFunction) {\n return function (target, ...args) {\n return nativeFunction.apply(target, args);\n };\n}\n//# sourceMappingURL=util.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/support/util.mjs\n// module id = ./node_modules/@dojo/shim/support/util.mjs\n// module chunks = menu","import { Evented } from '@dojo/core/Evented';\nexport class Injector extends Evented {\n constructor(payload) {\n super();\n this._payload = payload;\n }\n setInvalidator(invalidator) {\n this._invalidator = invalidator;\n }\n get() {\n return this._payload;\n }\n set(payload) {\n this._payload = payload;\n if (this._invalidator) {\n this._invalidator();\n }\n }\n}\nexport default Injector;\n//# sourceMappingURL=Injector.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/Injector.mjs\n// module id = ./node_modules/@dojo/widget-core/Injector.mjs\n// module chunks = menu","import { Evented } from '@dojo/core/Evented';\nimport Map from '@dojo/shim/Map';\n/**\n * Enum to identify the type of event.\n * Listening to 'Projector' will notify when projector is created or updated\n * Listening to 'Widget' will notify when widget root is created or updated\n */\nexport var NodeEventType;\n(function (NodeEventType) {\n NodeEventType[\"Projector\"] = \"Projector\";\n NodeEventType[\"Widget\"] = \"Widget\";\n})(NodeEventType || (NodeEventType = {}));\nexport class NodeHandler extends Evented {\n constructor() {\n super(...arguments);\n this._nodeMap = new Map();\n }\n get(key) {\n return this._nodeMap.get(key);\n }\n has(key) {\n return this._nodeMap.has(key);\n }\n add(element, key) {\n this._nodeMap.set(key, element);\n this.emit({ type: key });\n }\n addRoot() {\n this.emit({ type: NodeEventType.Widget });\n }\n addProjector() {\n this.emit({ type: NodeEventType.Projector });\n }\n clear() {\n this._nodeMap.clear();\n }\n}\nexport default NodeHandler;\n//# sourceMappingURL=NodeHandler.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/NodeHandler.mjs\n// module id = ./node_modules/@dojo/widget-core/NodeHandler.mjs\n// module chunks = menu","import Promise from '@dojo/shim/Promise';\nimport Map from '@dojo/shim/Map';\nimport Symbol from '@dojo/shim/Symbol';\nimport { Evented } from '@dojo/core/Evented';\n/**\n * Widget base symbol type\n */\nexport const WIDGET_BASE_TYPE = Symbol('Widget Base');\n/**\n * Checks is the item is a subclass of WidgetBase (or a WidgetBase)\n *\n * @param item the item to check\n * @returns true/false indicating if the item is a WidgetBaseConstructor\n */\nexport function isWidgetBaseConstructor(item) {\n return Boolean(item && item._type === WIDGET_BASE_TYPE);\n}\nexport function isWidgetConstructorDefaultExport(item) {\n return Boolean(item &&\n item.hasOwnProperty('__esModule') &&\n item.hasOwnProperty('default') &&\n isWidgetBaseConstructor(item.default));\n}\n/**\n * The Registry implementation\n */\nexport class Registry extends Evented {\n /**\n * Emit loaded event for registry label\n */\n emitLoadedEvent(widgetLabel, item) {\n this.emit({\n type: widgetLabel,\n action: 'loaded',\n item\n });\n }\n define(label, item) {\n if (this._widgetRegistry === undefined) {\n this._widgetRegistry = new Map();\n }\n if (this._widgetRegistry.has(label)) {\n throw new Error(`widget has already been registered for '${label.toString()}'`);\n }\n this._widgetRegistry.set(label, item);\n if (item instanceof Promise) {\n item.then((widgetCtor) => {\n this._widgetRegistry.set(label, widgetCtor);\n this.emitLoadedEvent(label, widgetCtor);\n return widgetCtor;\n }, (error) => {\n throw error;\n });\n }\n else if (isWidgetBaseConstructor(item)) {\n this.emitLoadedEvent(label, item);\n }\n }\n defineInjector(label, injectorFactory) {\n if (this._injectorRegistry === undefined) {\n this._injectorRegistry = new Map();\n }\n if (this._injectorRegistry.has(label)) {\n throw new Error(`injector has already been registered for '${label.toString()}'`);\n }\n const invalidator = new Evented();\n const injectorItem = {\n injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })),\n invalidator\n };\n this._injectorRegistry.set(label, injectorItem);\n this.emitLoadedEvent(label, injectorItem);\n }\n get(label) {\n if (!this._widgetRegistry || !this.has(label)) {\n return null;\n }\n const item = this._widgetRegistry.get(label);\n if (isWidgetBaseConstructor(item)) {\n return item;\n }\n if (item instanceof Promise) {\n return null;\n }\n const promise = item();\n this._widgetRegistry.set(label, promise);\n promise.then((widgetCtor) => {\n if (isWidgetConstructorDefaultExport(widgetCtor)) {\n widgetCtor = widgetCtor.default;\n }\n this._widgetRegistry.set(label, widgetCtor);\n this.emitLoadedEvent(label, widgetCtor);\n return widgetCtor;\n }, (error) => {\n throw error;\n });\n return null;\n }\n getInjector(label) {\n if (!this._injectorRegistry || !this.hasInjector(label)) {\n return null;\n }\n return this._injectorRegistry.get(label);\n }\n has(label) {\n return Boolean(this._widgetRegistry && this._widgetRegistry.has(label));\n }\n hasInjector(label) {\n return Boolean(this._injectorRegistry && this._injectorRegistry.has(label));\n }\n}\nexport default Registry;\n//# sourceMappingURL=Registry.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/Registry.mjs\n// module id = ./node_modules/@dojo/widget-core/Registry.mjs\n// module chunks = menu","import { Map } from '@dojo/shim/Map';\nimport { Evented } from '@dojo/core/Evented';\nimport { Registry } from './Registry';\nexport class RegistryHandler extends Evented {\n constructor() {\n super();\n this._registry = new Registry();\n this._registryWidgetLabelMap = new Map();\n this._registryInjectorLabelMap = new Map();\n this.own(this._registry);\n const destroy = () => {\n if (this.baseRegistry) {\n this._registryWidgetLabelMap.delete(this.baseRegistry);\n this._registryInjectorLabelMap.delete(this.baseRegistry);\n this.baseRegistry = undefined;\n }\n };\n this.own({ destroy });\n }\n set base(baseRegistry) {\n if (this.baseRegistry) {\n this._registryWidgetLabelMap.delete(this.baseRegistry);\n this._registryInjectorLabelMap.delete(this.baseRegistry);\n }\n this.baseRegistry = baseRegistry;\n }\n define(label, widget) {\n this._registry.define(label, widget);\n }\n defineInjector(label, injector) {\n this._registry.defineInjector(label, injector);\n }\n has(label) {\n return this._registry.has(label) || Boolean(this.baseRegistry && this.baseRegistry.has(label));\n }\n hasInjector(label) {\n return this._registry.hasInjector(label) || Boolean(this.baseRegistry && this.baseRegistry.hasInjector(label));\n }\n get(label, globalPrecedence = false) {\n return this._get(label, globalPrecedence, 'get', this._registryWidgetLabelMap);\n }\n getInjector(label, globalPrecedence = false) {\n return this._get(label, globalPrecedence, 'getInjector', this._registryInjectorLabelMap);\n }\n _get(label, globalPrecedence, getFunctionName, labelMap) {\n const registries = globalPrecedence ? [this.baseRegistry, this._registry] : [this._registry, this.baseRegistry];\n for (let i = 0; i < registries.length; i++) {\n const registry = registries[i];\n if (!registry) {\n continue;\n }\n const item = registry[getFunctionName](label);\n const registeredLabels = labelMap.get(registry) || [];\n if (item) {\n return item;\n }\n else if (registeredLabels.indexOf(label) === -1) {\n const handle = registry.on(label, (event) => {\n if (event.action === 'loaded' &&\n this[getFunctionName](label, globalPrecedence) === event.item) {\n this.emit({ type: 'invalidate' });\n }\n });\n this.own(handle);\n labelMap.set(registry, [...registeredLabels, label]);\n }\n }\n return null;\n }\n}\nexport default RegistryHandler;\n//# sourceMappingURL=RegistryHandler.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/RegistryHandler.mjs\n// module id = ./node_modules/@dojo/widget-core/RegistryHandler.mjs\n// module chunks = menu","import Map from '@dojo/shim/Map';\nimport WeakMap from '@dojo/shim/WeakMap';\nimport Symbol from '@dojo/shim/Symbol';\nimport { v } from './d';\nimport { auto } from './diff';\nimport RegistryHandler from './RegistryHandler';\nimport NodeHandler from './NodeHandler';\nimport { widgetInstanceMap } from './vdom';\nimport { isWidgetBaseConstructor, WIDGET_BASE_TYPE } from './Registry';\nconst decoratorMap = new Map();\nconst boundAuto = auto.bind(null);\nexport const noBind = Symbol.for('dojoNoBind');\n/**\n * Main widget base for all widgets to extend\n */\nexport class WidgetBase {\n /**\n * @constructor\n */\n constructor() {\n /**\n * Indicates if it is the initial set properties cycle\n */\n this._initialProperties = true;\n /**\n * Array of property keys considered changed from the previous set properties\n */\n this._changedPropertyKeys = [];\n this._nodeHandler = new NodeHandler();\n this._handles = [];\n this._children = [];\n this._decoratorCache = new Map();\n this._properties = {};\n this._boundRenderFunc = this.render.bind(this);\n this._boundInvalidate = this.invalidate.bind(this);\n widgetInstanceMap.set(this, {\n dirty: true,\n onAttach: () => {\n this.onAttach();\n },\n onDetach: () => {\n this.onDetach();\n this.destroy();\n },\n nodeHandler: this._nodeHandler,\n registry: () => {\n return this.registry;\n },\n coreProperties: {},\n rendering: false,\n inputProperties: {}\n });\n this._runAfterConstructors();\n }\n meta(MetaType) {\n if (this._metaMap === undefined) {\n this._metaMap = new Map();\n }\n let cached = this._metaMap.get(MetaType);\n if (!cached) {\n cached = new MetaType({\n invalidate: this._boundInvalidate,\n nodeHandler: this._nodeHandler,\n bind: this\n });\n this.own(cached);\n this._metaMap.set(MetaType, cached);\n }\n return cached;\n }\n onAttach() {\n // Do nothing by default.\n }\n onDetach() {\n // Do nothing by default.\n }\n get properties() {\n return this._properties;\n }\n get changedPropertyKeys() {\n return [...this._changedPropertyKeys];\n }\n __setCoreProperties__(coreProperties) {\n const { baseRegistry } = coreProperties;\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.coreProperties.baseRegistry !== baseRegistry) {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n this._registry.base = baseRegistry;\n this.invalidate();\n }\n instanceData.coreProperties = coreProperties;\n }\n __setProperties__(originalProperties) {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.inputProperties = originalProperties;\n const properties = this._runBeforeProperties(originalProperties);\n const registeredDiffPropertyNames = this.getDecorator('registeredDiffProperty');\n const changedPropertyKeys = [];\n const propertyNames = Object.keys(properties);\n if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) {\n const allProperties = [...propertyNames, ...Object.keys(this._properties)];\n const checkedProperties = [];\n const diffPropertyResults = {};\n let runReactions = false;\n for (let i = 0; i < allProperties.length; i++) {\n const propertyName = allProperties[i];\n if (checkedProperties.indexOf(propertyName) !== -1) {\n continue;\n }\n checkedProperties.push(propertyName);\n const previousProperty = this._properties[propertyName];\n const newProperty = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n if (registeredDiffPropertyNames.indexOf(propertyName) !== -1) {\n runReactions = true;\n const diffFunctions = this.getDecorator(`diffProperty:${propertyName}`);\n for (let i = 0; i < diffFunctions.length; i++) {\n const result = diffFunctions[i](previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n else {\n const result = boundAuto(previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n if (runReactions) {\n this._mapDiffPropertyReactions(properties, changedPropertyKeys).forEach((args, reaction) => {\n if (args.changed) {\n reaction.call(this, args.previousProperties, args.newProperties);\n }\n });\n }\n this._properties = diffPropertyResults;\n this._changedPropertyKeys = changedPropertyKeys;\n }\n else {\n this._initialProperties = false;\n for (let i = 0; i < propertyNames.length; i++) {\n const propertyName = propertyNames[i];\n if (typeof properties[propertyName] === 'function') {\n properties[propertyName] = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n }\n else {\n changedPropertyKeys.push(propertyName);\n }\n }\n this._changedPropertyKeys = changedPropertyKeys;\n this._properties = Object.assign({}, properties);\n }\n if (this._changedPropertyKeys.length > 0) {\n this.invalidate();\n }\n }\n get children() {\n return this._children;\n }\n __setChildren__(children) {\n if (this._children.length > 0 || children.length > 0) {\n this._children = children;\n this.invalidate();\n }\n }\n __render__() {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.dirty = false;\n const render = this._runBeforeRenders();\n let dNode = render();\n dNode = this.runAfterRenders(dNode);\n this._nodeHandler.clear();\n return dNode;\n }\n invalidate() {\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.invalidate) {\n instanceData.invalidate();\n }\n }\n render() {\n return v('div', {}, this.children);\n }\n /**\n * Function to add decorators to WidgetBase\n *\n * @param decoratorKey The key of the decorator\n * @param value The value of the decorator\n */\n addDecorator(decoratorKey, value) {\n value = Array.isArray(value) ? value : [value];\n if (this.hasOwnProperty('constructor')) {\n let decoratorList = decoratorMap.get(this.constructor);\n if (!decoratorList) {\n decoratorList = new Map();\n decoratorMap.set(this.constructor, decoratorList);\n }\n let specificDecoratorList = decoratorList.get(decoratorKey);\n if (!specificDecoratorList) {\n specificDecoratorList = [];\n decoratorList.set(decoratorKey, specificDecoratorList);\n }\n specificDecoratorList.push(...value);\n }\n else {\n const decorators = this.getDecorator(decoratorKey);\n this._decoratorCache.set(decoratorKey, [...decorators, ...value]);\n }\n }\n /**\n * Function to build the list of decorators from the global decorator map.\n *\n * @param decoratorKey The key of the decorator\n * @return An array of decorator values\n * @private\n */\n _buildDecoratorList(decoratorKey) {\n const allDecorators = [];\n let constructor = this.constructor;\n while (constructor) {\n const instanceMap = decoratorMap.get(constructor);\n if (instanceMap) {\n const decorators = instanceMap.get(decoratorKey);\n if (decorators) {\n allDecorators.unshift(...decorators);\n }\n }\n constructor = Object.getPrototypeOf(constructor);\n }\n return allDecorators;\n }\n /**\n * Function to retrieve decorator values\n *\n * @param decoratorKey The key of the decorator\n * @returns An array of decorator values\n */\n getDecorator(decoratorKey) {\n let allDecorators = this._decoratorCache.get(decoratorKey);\n if (allDecorators !== undefined) {\n return allDecorators;\n }\n allDecorators = this._buildDecoratorList(decoratorKey);\n this._decoratorCache.set(decoratorKey, allDecorators);\n return allDecorators;\n }\n _mapDiffPropertyReactions(newProperties, changedPropertyKeys) {\n const reactionFunctions = this.getDecorator('diffReaction');\n return reactionFunctions.reduce((reactionPropertyMap, { reaction, propertyName }) => {\n let reactionArguments = reactionPropertyMap.get(reaction);\n if (reactionArguments === undefined) {\n reactionArguments = {\n previousProperties: {},\n newProperties: {},\n changed: false\n };\n }\n reactionArguments.previousProperties[propertyName] = this._properties[propertyName];\n reactionArguments.newProperties[propertyName] = newProperties[propertyName];\n if (changedPropertyKeys.indexOf(propertyName) !== -1) {\n reactionArguments.changed = true;\n }\n reactionPropertyMap.set(reaction, reactionArguments);\n return reactionPropertyMap;\n }, new Map());\n }\n /**\n * Binds unbound property functions to the specified `bind` property\n *\n * @param properties properties to check for functions\n */\n _bindFunctionProperty(property, bind) {\n if (typeof property === 'function' && !property[noBind] && isWidgetBaseConstructor(property) === false) {\n if (this._bindFunctionPropertyMap === undefined) {\n this._bindFunctionPropertyMap = new WeakMap();\n }\n const bindInfo = this._bindFunctionPropertyMap.get(property) || {};\n let { boundFunc, scope } = bindInfo;\n if (boundFunc === undefined || scope !== bind) {\n boundFunc = property.bind(bind);\n this._bindFunctionPropertyMap.set(property, { boundFunc, scope: bind });\n }\n return boundFunc;\n }\n return property;\n }\n get registry() {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n return this._registry;\n }\n _runBeforeProperties(properties) {\n const beforeProperties = this.getDecorator('beforeProperties');\n if (beforeProperties.length > 0) {\n return beforeProperties.reduce((properties, beforePropertiesFunction) => {\n return Object.assign({}, properties, beforePropertiesFunction.call(this, properties));\n }, Object.assign({}, properties));\n }\n return properties;\n }\n /**\n * Run all registered before renders and return the updated render method\n */\n _runBeforeRenders() {\n const beforeRenders = this.getDecorator('beforeRender');\n if (beforeRenders.length > 0) {\n return beforeRenders.reduce((render, beforeRenderFunction) => {\n const updatedRender = beforeRenderFunction.call(this, render, this._properties, this._children);\n if (!updatedRender) {\n console.warn('Render function not returned from beforeRender, using previous render');\n return render;\n }\n return updatedRender;\n }, this._boundRenderFunc);\n }\n return this._boundRenderFunc;\n }\n /**\n * Run all registered after renders and return the decorated DNodes\n *\n * @param dNode The DNodes to run through the after renders\n */\n runAfterRenders(dNode) {\n const afterRenders = this.getDecorator('afterRender');\n if (afterRenders.length > 0) {\n return afterRenders.reduce((dNode, afterRenderFunction) => {\n return afterRenderFunction.call(this, dNode);\n }, dNode);\n }\n if (this._metaMap !== undefined) {\n this._metaMap.forEach((meta) => {\n meta.afterRender();\n });\n }\n return dNode;\n }\n _runAfterConstructors() {\n const afterConstructors = this.getDecorator('afterConstructor');\n if (afterConstructors.length > 0) {\n afterConstructors.forEach((afterConstructor) => afterConstructor.call(this));\n }\n }\n own(handle) {\n this._handles.push(handle);\n }\n destroy() {\n while (this._handles.length > 0) {\n const handle = this._handles.pop();\n if (handle) {\n handle.destroy();\n }\n }\n }\n}\n/**\n * static identifier\n */\nWidgetBase._type = WIDGET_BASE_TYPE;\nexport default WidgetBase;\n//# sourceMappingURL=WidgetBase.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/WidgetBase.mjs\n// module id = ./node_modules/@dojo/widget-core/WidgetBase.mjs\n// module chunks = menu","let browserSpecificTransitionEndEventName = '';\nlet browserSpecificAnimationEndEventName = '';\nfunction determineBrowserStyleNames(element) {\n if ('WebkitTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'webkitTransitionEnd';\n browserSpecificAnimationEndEventName = 'webkitAnimationEnd';\n }\n else if ('transition' in element.style || 'MozTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'transitionend';\n browserSpecificAnimationEndEventName = 'animationend';\n }\n else {\n throw new Error('Your browser is not supported');\n }\n}\nfunction initialize(element) {\n if (browserSpecificAnimationEndEventName === '') {\n determineBrowserStyleNames(element);\n }\n}\nfunction runAndCleanUp(element, startAnimation, finishAnimation) {\n initialize(element);\n let finished = false;\n let transitionEnd = function () {\n if (!finished) {\n finished = true;\n element.removeEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n element.removeEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n finishAnimation();\n }\n };\n startAnimation();\n element.addEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n element.addEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n}\nfunction exit(node, properties, exitAnimation, removeNode) {\n const activeClass = properties.exitAnimationActive || `${exitAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(exitAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n removeNode();\n });\n}\nfunction enter(node, properties, enterAnimation) {\n const activeClass = properties.enterAnimationActive || `${enterAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(enterAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n node.classList.remove(enterAnimation);\n node.classList.remove(activeClass);\n });\n}\nexport default {\n enter,\n exit\n};\n//# sourceMappingURL=cssTransitions.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/animations/cssTransitions.mjs\n// module id = ./node_modules/@dojo/widget-core/animations/cssTransitions.mjs\n// module chunks = menu","import Symbol from '@dojo/shim/Symbol';\n/**\n * The symbol identifier for a WNode type\n */\nexport const WNODE = Symbol('Identifier for a WNode.');\n/**\n * The symbol identifier for a VNode type\n */\nexport const VNODE = Symbol('Identifier for a VNode.');\n/**\n * The symbol identifier for a VNode type created using dom()\n */\nexport const DOMVNODE = Symbol('Identifier for a VNode created using existing dom.');\n/**\n * Helper function that returns true if the `DNode` is a `WNode` using the `type` property\n */\nexport function isWNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === WNODE);\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` using the `type` property\n */\nexport function isVNode(child) {\n return Boolean(child && typeof child !== 'string' && (child.type === VNODE || child.type === DOMVNODE));\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` created with `dom()` using the `type` property\n */\nexport function isDomVNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === DOMVNODE);\n}\nexport function isElementNode(value) {\n return !!value.tagName;\n}\nexport function decorate(dNodes, optionsOrModifier, predicate) {\n let shallow = false;\n let modifier;\n if (typeof optionsOrModifier === 'function') {\n modifier = optionsOrModifier;\n }\n else {\n modifier = optionsOrModifier.modifier;\n predicate = optionsOrModifier.predicate;\n shallow = optionsOrModifier.shallow || false;\n }\n let nodes = Array.isArray(dNodes) ? [...dNodes] : [dNodes];\n function breaker() {\n nodes = [];\n }\n while (nodes.length) {\n const node = nodes.shift();\n if (node) {\n if (!shallow && (isWNode(node) || isVNode(node)) && node.children) {\n nodes = [...nodes, ...node.children];\n }\n if (!predicate || predicate(node)) {\n modifier(node, breaker);\n }\n }\n }\n return dNodes;\n}\n/**\n * Wrapper function for calls to create a widget.\n */\nexport function w(widgetConstructor, properties, children = []) {\n return {\n children,\n widgetConstructor,\n properties,\n type: WNODE\n };\n}\nexport function v(tag, propertiesOrChildren = {}, children = undefined) {\n let properties = propertiesOrChildren;\n let deferredPropertiesCallback;\n if (Array.isArray(propertiesOrChildren)) {\n children = propertiesOrChildren;\n properties = {};\n }\n if (typeof properties === 'function') {\n deferredPropertiesCallback = properties;\n properties = {};\n }\n return {\n tag,\n deferredPropertiesCallback,\n children,\n properties,\n type: VNODE\n };\n}\n/**\n * Create a VNode for an existing DOM Node.\n */\nexport function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, children) {\n return {\n tag: isElementNode(node) ? node.tagName.toLowerCase() : '',\n properties: props,\n attributes: attrs,\n events: on,\n children,\n type: DOMVNODE,\n domNode: node,\n text: isElementNode(node) ? undefined : node.data,\n diffType\n };\n}\n//# sourceMappingURL=d.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/d.mjs\n// module id = ./node_modules/@dojo/widget-core/d.mjs\n// module chunks = menu","import { handleDecorator } from './handleDecorator';\nexport function afterRender(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('afterRender', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default afterRender;\n//# sourceMappingURL=afterRender.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/afterRender.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/afterRender.mjs\n// module chunks = menu","import { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\nexport function alwaysRender() {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function () {\n this.invalidate();\n })(target);\n });\n}\nexport default alwaysRender;\n//# sourceMappingURL=alwaysRender.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs\n// module chunks = menu","import { handleDecorator } from './handleDecorator';\nexport function beforeProperties(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('beforeProperties', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default beforeProperties;\n//# sourceMappingURL=beforeProperties.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs\n// module chunks = menu","import { CustomElementChildType } from '../registerCustomElement';\nimport Registry from '../Registry';\n/**\n * This Decorator is provided properties that define the behavior of a custom element, and\n * registers that custom element.\n */\nexport function customElement({ tag, properties = [], attributes = [], events = [], childType = CustomElementChildType.DOJO, registryFactory = () => new Registry() }) {\n return function (target) {\n target.prototype.__customElementDescriptor = {\n tagName: tag,\n attributes,\n properties,\n events,\n childType,\n registryFactory\n };\n };\n}\nexport default customElement;\n//# sourceMappingURL=customElement.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/customElement.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/customElement.mjs\n// module chunks = menu","import { handleDecorator } from './handleDecorator';\n/**\n * Decorator that can be used to register a function as a specific property diff\n *\n * @param propertyName The name of the property of which the diff function is applied\n * @param diffType The diff type, default is DiffType.AUTO.\n * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM\n */\nexport function diffProperty(propertyName, diffFunction, reactionFunction) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null));\n target.addDecorator('registeredDiffProperty', propertyName);\n if (reactionFunction || propertyKey) {\n target.addDecorator('diffReaction', {\n propertyName,\n reaction: propertyKey ? target[propertyKey] : reactionFunction\n });\n }\n });\n}\nexport default diffProperty;\n//# sourceMappingURL=diffProperty.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/diffProperty.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/diffProperty.mjs\n// module chunks = menu","/**\n * Generic decorator handler to take care of whether or not the decorator was called at the class level\n * or the method level.\n *\n * @param handler\n */\nexport function handleDecorator(handler) {\n return function (target, propertyKey, descriptor) {\n if (typeof target === 'function') {\n handler(target.prototype, undefined);\n }\n else {\n handler(target, propertyKey);\n }\n };\n}\nexport default handleDecorator;\n//# sourceMappingURL=handleDecorator.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs\n// module chunks = menu","import WeakMap from '@dojo/shim/WeakMap';\nimport { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\n/**\n * Map of instances against registered injectors.\n */\nconst registeredInjectorsMap = new WeakMap();\n/**\n * Decorator retrieves an injector from an available registry using the name and\n * calls the `getProperties` function with the payload from the injector\n * and current properties with the the injected properties returned.\n *\n * @param InjectConfig the inject configuration\n */\nexport function inject({ name, getProperties }) {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function (properties) {\n const injectorItem = this.registry.getInjector(name);\n if (injectorItem) {\n const { injector, invalidator } = injectorItem;\n const registeredInjectors = registeredInjectorsMap.get(this) || [];\n if (registeredInjectors.length === 0) {\n registeredInjectorsMap.set(this, registeredInjectors);\n }\n if (registeredInjectors.indexOf(injectorItem) === -1) {\n this.own(invalidator.on('invalidate', () => {\n this.invalidate();\n }));\n registeredInjectors.push(injectorItem);\n }\n return getProperties(injector(), properties);\n }\n })(target);\n });\n}\nexport default inject;\n//# sourceMappingURL=inject.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/inject.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/inject.mjs\n// module chunks = menu","import { WIDGET_BASE_TYPE } from './Registry';\nfunction isObjectOrArray(value) {\n return Object.prototype.toString.call(value) === '[object Object]' || Array.isArray(value);\n}\nexport function always(previousProperty, newProperty) {\n return {\n changed: true,\n value: newProperty\n };\n}\nexport function ignore(previousProperty, newProperty) {\n return {\n changed: false,\n value: newProperty\n };\n}\nexport function reference(previousProperty, newProperty) {\n return {\n changed: previousProperty !== newProperty,\n value: newProperty\n };\n}\nexport function shallow(previousProperty, newProperty) {\n let changed = false;\n const validOldProperty = previousProperty && isObjectOrArray(previousProperty);\n const validNewProperty = newProperty && isObjectOrArray(newProperty);\n if (!validOldProperty || !validNewProperty) {\n return {\n changed: true,\n value: newProperty\n };\n }\n const previousKeys = Object.keys(previousProperty);\n const newKeys = Object.keys(newProperty);\n if (previousKeys.length !== newKeys.length) {\n changed = true;\n }\n else {\n changed = newKeys.some((key) => {\n return newProperty[key] !== previousProperty[key];\n });\n }\n return {\n changed,\n value: newProperty\n };\n}\nexport function auto(previousProperty, newProperty) {\n let result;\n if (typeof newProperty === 'function') {\n if (newProperty._type === WIDGET_BASE_TYPE) {\n result = reference(previousProperty, newProperty);\n }\n else {\n result = ignore(previousProperty, newProperty);\n }\n }\n else if (isObjectOrArray(newProperty)) {\n result = shallow(previousProperty, newProperty);\n }\n else {\n result = reference(previousProperty, newProperty);\n }\n return result;\n}\n//# sourceMappingURL=diff.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/diff.mjs\n// module id = ./node_modules/@dojo/widget-core/diff.mjs\n// module chunks = menu","import * as tslib_1 from \"tslib\";\nimport { assign } from '@dojo/core/lang';\nimport cssTransitions from '../animations/cssTransitions';\nimport { afterRender } from './../decorators/afterRender';\nimport { v } from './../d';\nimport { dom } from './../vdom';\n/**\n * Represents the attach state of the projector\n */\nexport var ProjectorAttachState;\n(function (ProjectorAttachState) {\n ProjectorAttachState[ProjectorAttachState[\"Attached\"] = 1] = \"Attached\";\n ProjectorAttachState[ProjectorAttachState[\"Detached\"] = 2] = \"Detached\";\n})(ProjectorAttachState || (ProjectorAttachState = {}));\n/**\n * Attach type for the projector\n */\nexport var AttachType;\n(function (AttachType) {\n AttachType[AttachType[\"Append\"] = 1] = \"Append\";\n AttachType[AttachType[\"Merge\"] = 2] = \"Merge\";\n})(AttachType || (AttachType = {}));\nexport function ProjectorMixin(Base) {\n class Projector extends Base {\n constructor(...args) {\n super(...args);\n this._root = document.body;\n this._async = true;\n this._projectorProperties = {};\n this._projectionOptions = {\n transitions: cssTransitions\n };\n this.root = document.body;\n this.projectorState = ProjectorAttachState.Detached;\n }\n append(root) {\n const options = {\n type: AttachType.Append,\n root\n };\n return this._attach(options);\n }\n merge(root) {\n const options = {\n type: AttachType.Merge,\n root\n };\n return this._attach(options);\n }\n set root(root) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change root element');\n }\n this._root = root;\n }\n get root() {\n return this._root;\n }\n get async() {\n return this._async;\n }\n set async(async) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change async mode');\n }\n this._async = async;\n }\n sandbox(doc = document) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot create sandbox');\n }\n this._async = false;\n const previousRoot = this.root;\n /* free up the document fragment for GC */\n this.own({\n destroy: () => {\n this._root = previousRoot;\n }\n });\n this._attach({\n /* DocumentFragment is not assignable to Element, but provides everything needed to work */\n root: doc.createDocumentFragment(),\n type: AttachType.Append\n });\n }\n setChildren(children) {\n this.__setChildren__(children);\n }\n setProperties(properties) {\n this.__setProperties__(properties);\n }\n __setProperties__(properties) {\n if (this._projectorProperties && this._projectorProperties.registry !== properties.registry) {\n if (this._projectorProperties.registry) {\n this._projectorProperties.registry.destroy();\n }\n }\n this._projectorProperties = assign({}, properties);\n super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry });\n super.__setProperties__(properties);\n }\n toHtml() {\n if (this.projectorState !== ProjectorAttachState.Attached || !this._projection) {\n throw new Error('Projector is not attached, cannot return an HTML string of projection.');\n }\n return this._projection.domNode.childNodes[0].outerHTML;\n }\n afterRender(result) {\n let node = result;\n if (typeof result === 'string' || result === null || result === undefined) {\n node = v('span', {}, [result]);\n }\n return node;\n }\n destroy() {\n super.destroy();\n }\n _attach({ type, root }) {\n if (root) {\n this.root = root;\n }\n if (this._attachHandle) {\n return this._attachHandle;\n }\n this.projectorState = ProjectorAttachState.Attached;\n const handle = {\n destroy: () => {\n if (this.projectorState === ProjectorAttachState.Attached) {\n this._projection = undefined;\n this.projectorState = ProjectorAttachState.Detached;\n }\n }\n };\n this.own(handle);\n this._attachHandle = handle;\n this._projectionOptions = Object.assign({}, this._projectionOptions, { sync: !this._async });\n switch (type) {\n case AttachType.Append:\n this._projection = dom.append(this.root, this, this._projectionOptions);\n break;\n case AttachType.Merge:\n this._projection = dom.merge(this.root, this, this._projectionOptions);\n break;\n }\n return this._attachHandle;\n }\n }\n tslib_1.__decorate([\n afterRender(),\n tslib_1.__metadata(\"design:type\", Function),\n tslib_1.__metadata(\"design:paramtypes\", [Object]),\n tslib_1.__metadata(\"design:returntype\", void 0)\n ], Projector.prototype, \"afterRender\", null);\n return Projector;\n}\nexport default ProjectorMixin;\n//# sourceMappingURL=Projector.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/mixins/Projector.mjs\n// module id = ./node_modules/@dojo/widget-core/mixins/Projector.mjs\n// module chunks = menu","import * as tslib_1 from \"tslib\";\nimport { Injector } from './../Injector';\nimport { inject } from './../decorators/inject';\nimport { handleDecorator } from './../decorators/handleDecorator';\nimport { diffProperty } from './../decorators/diffProperty';\nimport { shallow } from './../diff';\nconst THEME_KEY = ' _key';\nexport const INJECTED_THEME_KEY = Symbol('theme');\n/**\n * Decorator for base css classes\n */\nexport function theme(theme) {\n return handleDecorator((target) => {\n target.addDecorator('baseThemeClasses', theme);\n });\n}\n/**\n * Creates a reverse lookup for the classes passed in via the `theme` function.\n *\n * @param classes The baseClasses object\n * @requires\n */\nfunction createThemeClassesLookup(classes) {\n return classes.reduce((currentClassNames, baseClass) => {\n Object.keys(baseClass).forEach((key) => {\n currentClassNames[baseClass[key]] = key;\n });\n return currentClassNames;\n }, {});\n}\n/**\n * Convenience function that is given a theme and an optional registry, the theme\n * injector is defined against the registry, returning the theme.\n *\n * @param theme the theme to set\n * @param themeRegistry registry to define the theme injector against. Defaults\n * to the global registry\n *\n * @returns the theme injector used to set the theme\n */\nexport function registerThemeInjector(theme, themeRegistry) {\n const themeInjector = new Injector(theme);\n themeRegistry.defineInjector(INJECTED_THEME_KEY, (invalidator) => {\n themeInjector.setInvalidator(invalidator);\n return () => themeInjector.get();\n });\n return themeInjector;\n}\n/**\n * Function that returns a class decorated with with Themed functionality\n */\nexport function ThemedMixin(Base) {\n let Themed = class Themed extends Base {\n constructor() {\n super(...arguments);\n /**\n * Registered base theme keys\n */\n this._registeredBaseThemeKeys = [];\n /**\n * Indicates if classes meta data need to be calculated.\n */\n this._recalculateClasses = true;\n /**\n * Loaded theme\n */\n this._theme = {};\n }\n theme(classes) {\n if (this._recalculateClasses) {\n this._recalculateThemeClasses();\n }\n if (Array.isArray(classes)) {\n return classes.map((className) => this._getThemeClass(className));\n }\n return this._getThemeClass(classes);\n }\n /**\n * Function fired when `theme` or `extraClasses` are changed.\n */\n onPropertiesChanged() {\n this._recalculateClasses = true;\n }\n _getThemeClass(className) {\n if (className === undefined || className === null) {\n return className;\n }\n const extraClasses = this.properties.extraClasses || {};\n const themeClassName = this._baseThemeClassesReverseLookup[className];\n let resultClassNames = [];\n if (!themeClassName) {\n console.warn(`Class name: '${className}' not found in theme`);\n return null;\n }\n if (extraClasses[themeClassName]) {\n resultClassNames.push(extraClasses[themeClassName]);\n }\n if (this._theme[themeClassName]) {\n resultClassNames.push(this._theme[themeClassName]);\n }\n else {\n resultClassNames.push(this._registeredBaseTheme[themeClassName]);\n }\n return resultClassNames.join(' ');\n }\n _recalculateThemeClasses() {\n const { theme = {} } = this.properties;\n const baseThemes = this.getDecorator('baseThemeClasses');\n if (!this._registeredBaseTheme) {\n this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => {\n const _a = THEME_KEY, key = baseTheme[_a], classes = tslib_1.__rest(baseTheme, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n this._registeredBaseThemeKeys.push(key);\n return Object.assign({}, finalBaseTheme, classes);\n }, {});\n this._baseThemeClassesReverseLookup = createThemeClassesLookup(baseThemes);\n }\n this._theme = this._registeredBaseThemeKeys.reduce((baseTheme, themeKey) => {\n return Object.assign({}, baseTheme, theme[themeKey]);\n }, {});\n this._recalculateClasses = false;\n }\n };\n tslib_1.__decorate([\n diffProperty('theme', shallow),\n diffProperty('extraClasses', shallow),\n tslib_1.__metadata(\"design:type\", Function),\n tslib_1.__metadata(\"design:paramtypes\", []),\n tslib_1.__metadata(\"design:returntype\", void 0)\n ], Themed.prototype, \"onPropertiesChanged\", null);\n Themed = tslib_1.__decorate([\n inject({\n name: INJECTED_THEME_KEY,\n getProperties: (theme, properties) => {\n if (!properties.theme) {\n return { theme };\n }\n return {};\n }\n })\n ], Themed);\n return Themed;\n}\nexport default ThemedMixin;\n//# sourceMappingURL=Themed.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/mixins/Themed.mjs\n// module id = ./node_modules/@dojo/widget-core/mixins/Themed.mjs\n// module chunks = menu","import * as tslib_1 from \"tslib\";\nimport { WidgetBase, noBind } from './WidgetBase';\nimport { ProjectorMixin } from './mixins/Projector';\nimport { from } from '@dojo/shim/array';\nimport { w, dom } from './d';\nimport global from '@dojo/shim/global';\nimport { registerThemeInjector } from './mixins/Themed';\nimport { alwaysRender } from './decorators/alwaysRender';\nexport var CustomElementChildType;\n(function (CustomElementChildType) {\n CustomElementChildType[\"DOJO\"] = \"DOJO\";\n CustomElementChildType[\"NODE\"] = \"NODE\";\n CustomElementChildType[\"TEXT\"] = \"TEXT\";\n})(CustomElementChildType || (CustomElementChildType = {}));\nexport function DomToWidgetWrapper(domNode) {\n let DomToWidgetWrapper = class DomToWidgetWrapper extends WidgetBase {\n render() {\n const properties = Object.keys(this.properties).reduce((props, key) => {\n const value = this.properties[key];\n if (key.indexOf('on') === 0) {\n key = `__${key}`;\n }\n props[key] = value;\n return props;\n }, {});\n return dom({ node: domNode, props: properties, diffType: 'dom' });\n }\n static get domNode() {\n return domNode;\n }\n };\n DomToWidgetWrapper = tslib_1.__decorate([\n alwaysRender()\n ], DomToWidgetWrapper);\n return DomToWidgetWrapper;\n}\nexport function create(descriptor, WidgetConstructor) {\n const { attributes, childType, registryFactory } = descriptor;\n const attributeMap = {};\n attributes.forEach((propertyName) => {\n const attributeName = propertyName.toLowerCase();\n attributeMap[attributeName] = propertyName;\n });\n return class extends HTMLElement {\n constructor() {\n super(...arguments);\n this._properties = {};\n this._children = [];\n this._eventProperties = {};\n this._initialised = false;\n }\n connectedCallback() {\n if (this._initialised) {\n return;\n }\n const domProperties = {};\n const { attributes, properties, events } = descriptor;\n this._properties = Object.assign({}, this._properties, this._attributesToProperties(attributes));\n [...attributes, ...properties].forEach((propertyName) => {\n const value = this[propertyName];\n const filteredPropertyName = propertyName.replace(/^on/, '__');\n if (value !== undefined) {\n this._properties[propertyName] = value;\n }\n if (filteredPropertyName !== propertyName) {\n domProperties[filteredPropertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n }\n domProperties[propertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n });\n events.forEach((propertyName) => {\n const eventName = propertyName.replace(/^on/, '').toLowerCase();\n const filteredPropertyName = propertyName.replace(/^on/, '__on');\n domProperties[filteredPropertyName] = {\n get: () => this._getEventProperty(propertyName),\n set: (value) => this._setEventProperty(propertyName, value)\n };\n this._eventProperties[propertyName] = undefined;\n this._properties[propertyName] = (...args) => {\n const eventCallback = this._getEventProperty(propertyName);\n if (typeof eventCallback === 'function') {\n eventCallback(...args);\n }\n this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: false,\n detail: args\n }));\n };\n });\n Object.defineProperties(this, domProperties);\n const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children;\n from(children).forEach((childNode) => {\n if (childType === CustomElementChildType.DOJO) {\n childNode.addEventListener('dojo-ce-render', () => this._render());\n childNode.addEventListener('dojo-ce-connected', () => this._render());\n this._children.push(DomToWidgetWrapper(childNode));\n }\n else {\n this._children.push(dom({ node: childNode, diffType: 'dom' }));\n }\n });\n this.addEventListener('dojo-ce-connected', (e) => this._childConnected(e));\n const widgetProperties = this._properties;\n const renderChildren = () => this.__children__();\n const Wrapper = class extends WidgetBase {\n render() {\n return w(WidgetConstructor, widgetProperties, renderChildren());\n }\n };\n const registry = registryFactory();\n const themeContext = registerThemeInjector(this._getTheme(), registry);\n global.addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme()));\n const Projector = ProjectorMixin(Wrapper);\n this._projector = new Projector();\n this._projector.setProperties({ registry });\n this._projector.append(this);\n this._initialised = true;\n this.dispatchEvent(new CustomEvent('dojo-ce-connected', {\n bubbles: true,\n detail: this\n }));\n }\n _getTheme() {\n if (global && global.dojoce && global.dojoce.theme) {\n return global.dojoce.themes[global.dojoce.theme];\n }\n }\n _childConnected(e) {\n const node = e.detail;\n if (node.parentNode === this) {\n const exists = this._children.some((child) => child.domNode === node);\n if (!exists) {\n node.addEventListener('dojo-ce-render', () => this._render());\n this._children.push(DomToWidgetWrapper(node));\n this._render();\n }\n }\n }\n _render() {\n if (this._projector) {\n this._projector.invalidate();\n this.dispatchEvent(new CustomEvent('dojo-ce-render', {\n bubbles: false,\n detail: this\n }));\n }\n }\n __properties__() {\n return Object.assign({}, this._properties, this._eventProperties);\n }\n __children__() {\n if (childType === CustomElementChildType.DOJO) {\n return this._children.filter((Child) => Child.domNode.isWidget).map((Child) => {\n const { domNode } = Child;\n return w(Child, Object.assign({}, domNode.__properties__()), [...domNode.__children__()]);\n });\n }\n else {\n return this._children;\n }\n }\n attributeChangedCallback(name, oldValue, value) {\n const propertyName = attributeMap[name];\n this._setProperty(propertyName, value);\n }\n _setEventProperty(propertyName, value) {\n this._eventProperties[propertyName] = value;\n }\n _getEventProperty(propertyName) {\n return this._eventProperties[propertyName];\n }\n _setProperty(propertyName, value) {\n if (typeof value === 'function') {\n value[noBind] = true;\n }\n this._properties[propertyName] = value;\n this._render();\n }\n _getProperty(propertyName) {\n return this._properties[propertyName];\n }\n _attributesToProperties(attributes) {\n return attributes.reduce((properties, propertyName) => {\n const attributeName = propertyName.toLowerCase();\n const value = this.getAttribute(attributeName);\n if (value !== null) {\n properties[propertyName] = value;\n }\n return properties;\n }, {});\n }\n static get observedAttributes() {\n return Object.keys(attributeMap);\n }\n get isWidget() {\n return true;\n }\n };\n}\nexport function register(WidgetConstructor) {\n const descriptor = WidgetConstructor.prototype && WidgetConstructor.prototype.__customElementDescriptor;\n if (!descriptor) {\n throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?');\n }\n global.customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor));\n}\nexport default register;\n//# sourceMappingURL=registerCustomElement.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/registerCustomElement.mjs\n// module id = ./node_modules/@dojo/widget-core/registerCustomElement.mjs\n// module chunks = menu","import global from '@dojo/shim/global';\nimport { from as arrayFrom } from '@dojo/shim/array';\nimport { isWNode, isVNode, isDomVNode, VNODE, WNODE } from './d';\nimport { isWidgetBaseConstructor } from './Registry';\nimport WeakMap from '@dojo/shim/WeakMap';\nconst NAMESPACE_W3 = 'http://www.w3.org/';\nconst NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg';\nconst NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink';\nconst emptyArray = [];\nexport const widgetInstanceMap = new WeakMap();\nconst instanceMap = new WeakMap();\nconst projectorStateMap = new WeakMap();\nfunction same(dnode1, dnode2) {\n if (isVNode(dnode1) && isVNode(dnode2)) {\n if (isDomVNode(dnode1) || isDomVNode(dnode2)) {\n if (dnode1.domNode !== dnode2.domNode) {\n return false;\n }\n }\n if (dnode1.tag !== dnode2.tag) {\n return false;\n }\n if (dnode1.properties.key !== dnode2.properties.key) {\n return false;\n }\n return true;\n }\n else if (isWNode(dnode1) && isWNode(dnode2)) {\n if (dnode1.instance === undefined && typeof dnode2.widgetConstructor === 'string') {\n return false;\n }\n if (dnode1.widgetConstructor !== dnode2.widgetConstructor) {\n return false;\n }\n if (dnode1.properties.key !== dnode2.properties.key) {\n return false;\n }\n return true;\n }\n return false;\n}\nconst missingTransition = function () {\n throw new Error('Provide a transitions object to the projectionOptions to do animations');\n};\nfunction getProjectionOptions(projectorOptions, projectorInstance) {\n const defaults = {\n namespace: undefined,\n styleApplyer: function (domNode, styleName, value) {\n domNode.style[styleName] = value;\n },\n transitions: {\n enter: missingTransition,\n exit: missingTransition\n },\n depth: 0,\n merge: false,\n sync: false,\n projectorInstance\n };\n return Object.assign({}, defaults, projectorOptions);\n}\nfunction checkStyleValue(styleValue) {\n if (typeof styleValue !== 'string') {\n throw new Error('Style values must be strings');\n }\n}\nfunction updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n const eventMap = projectorState.nodeMap.get(domNode) || new WeakMap();\n if (previousValue) {\n const previousEvent = eventMap.get(previousValue);\n domNode.removeEventListener(eventName, previousEvent);\n }\n let callback = currentValue.bind(bind);\n if (eventName === 'input') {\n callback = function (evt) {\n currentValue.call(this, evt);\n evt.target['oninput-value'] = evt.target.value;\n }.bind(bind);\n }\n domNode.addEventListener(eventName, callback);\n eventMap.set(currentValue, callback);\n projectorState.nodeMap.set(domNode, eventMap);\n}\nfunction addClasses(domNode, classes) {\n if (classes) {\n const classNames = classes.split(' ');\n for (let i = 0; i < classNames.length; i++) {\n domNode.classList.add(classNames[i]);\n }\n }\n}\nfunction removeClasses(domNode, classes) {\n if (classes) {\n const classNames = classes.split(' ');\n for (let i = 0; i < classNames.length; i++) {\n domNode.classList.remove(classNames[i]);\n }\n }\n}\nfunction buildPreviousProperties(domNode, previous, current) {\n const { diffType, properties, attributes } = current;\n if (!diffType || diffType === 'vdom') {\n return { properties: previous.properties, attributes: previous.attributes, events: previous.events };\n }\n else if (diffType === 'none') {\n return { properties: {}, attributes: previous.attributes ? {} : undefined, events: previous.events };\n }\n let newProperties = {\n properties: {}\n };\n if (attributes) {\n newProperties.attributes = {};\n newProperties.events = previous.events;\n Object.keys(properties).forEach((propName) => {\n newProperties.properties[propName] = domNode[propName];\n });\n Object.keys(attributes).forEach((attrName) => {\n newProperties.attributes[attrName] = domNode.getAttribute(attrName);\n });\n return newProperties;\n }\n newProperties.properties = Object.keys(properties).reduce((props, property) => {\n props[property] = domNode.getAttribute(property) || domNode[property];\n return props;\n }, {});\n return newProperties;\n}\nfunction focusNode(propValue, previousValue, domNode, projectionOptions) {\n let result;\n if (typeof propValue === 'function') {\n result = propValue();\n }\n else {\n result = propValue && !previousValue;\n }\n if (result === true) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectorState.deferredRenderCallbacks.push(() => {\n domNode.focus();\n });\n }\n}\nfunction removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions, onlyEvents = false) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n const eventMap = projectorState.nodeMap.get(domNode);\n if (eventMap) {\n Object.keys(previousProperties).forEach((propName) => {\n const isEvent = propName.substr(0, 2) === 'on' || onlyEvents;\n const eventName = onlyEvents ? propName : propName.substr(2);\n if (isEvent && !properties[propName]) {\n const eventCallback = eventMap.get(previousProperties[propName]);\n if (eventCallback) {\n domNode.removeEventListener(eventName, eventCallback);\n }\n }\n });\n }\n}\nfunction updateAttribute(domNode, attrName, attrValue, projectionOptions) {\n if (projectionOptions.namespace === NAMESPACE_SVG && attrName === 'href') {\n domNode.setAttributeNS(NAMESPACE_XLINK, attrName, attrValue);\n }\n else if ((attrName === 'role' && attrValue === '') || attrValue === undefined) {\n domNode.removeAttribute(attrName);\n }\n else {\n domNode.setAttribute(attrName, attrValue);\n }\n}\nfunction updateAttributes(domNode, previousAttributes, attributes, projectionOptions) {\n const attrNames = Object.keys(attributes);\n const attrCount = attrNames.length;\n for (let i = 0; i < attrCount; i++) {\n const attrName = attrNames[i];\n const attrValue = attributes[attrName];\n const previousAttrValue = previousAttributes[attrName];\n if (attrValue !== previousAttrValue) {\n updateAttribute(domNode, attrName, attrValue, projectionOptions);\n }\n }\n}\nfunction updateProperties(domNode, previousProperties, properties, projectionOptions, includesEventsAndAttributes = true) {\n let propertiesUpdated = false;\n const propNames = Object.keys(properties);\n const propCount = propNames.length;\n if (propNames.indexOf('classes') === -1 && previousProperties.classes) {\n if (Array.isArray(previousProperties.classes)) {\n for (let i = 0; i < previousProperties.classes.length; i++) {\n removeClasses(domNode, previousProperties.classes[i]);\n }\n }\n else {\n removeClasses(domNode, previousProperties.classes);\n }\n }\n includesEventsAndAttributes && removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions);\n for (let i = 0; i < propCount; i++) {\n const propName = propNames[i];\n let propValue = properties[propName];\n const previousValue = previousProperties[propName];\n if (propName === 'classes') {\n const previousClasses = Array.isArray(previousValue) ? previousValue : [previousValue];\n const currentClasses = Array.isArray(propValue) ? propValue : [propValue];\n if (previousClasses && previousClasses.length > 0) {\n if (!propValue || propValue.length === 0) {\n for (let i = 0; i < previousClasses.length; i++) {\n removeClasses(domNode, previousClasses[i]);\n }\n }\n else {\n const newClasses = [...currentClasses];\n for (let i = 0; i < previousClasses.length; i++) {\n const previousClassName = previousClasses[i];\n if (previousClassName) {\n const classIndex = newClasses.indexOf(previousClassName);\n if (classIndex === -1) {\n removeClasses(domNode, previousClassName);\n }\n else {\n newClasses.splice(classIndex, 1);\n }\n }\n }\n for (let i = 0; i < newClasses.length; i++) {\n addClasses(domNode, newClasses[i]);\n }\n }\n }\n else {\n for (let i = 0; i < currentClasses.length; i++) {\n addClasses(domNode, currentClasses[i]);\n }\n }\n }\n else if (propName === 'focus') {\n focusNode(propValue, previousValue, domNode, projectionOptions);\n }\n else if (propName === 'styles') {\n const styleNames = Object.keys(propValue);\n const styleCount = styleNames.length;\n for (let j = 0; j < styleCount; j++) {\n const styleName = styleNames[j];\n const newStyleValue = propValue[styleName];\n const oldStyleValue = previousValue && previousValue[styleName];\n if (newStyleValue === oldStyleValue) {\n continue;\n }\n propertiesUpdated = true;\n if (newStyleValue) {\n checkStyleValue(newStyleValue);\n projectionOptions.styleApplyer(domNode, styleName, newStyleValue);\n }\n else {\n projectionOptions.styleApplyer(domNode, styleName, '');\n }\n }\n }\n else {\n if (!propValue && typeof previousValue === 'string') {\n propValue = '';\n }\n if (propName === 'value') {\n const domValue = domNode[propName];\n if (domValue !== propValue &&\n (domNode['oninput-value']\n ? domValue === domNode['oninput-value']\n : propValue !== previousValue)) {\n domNode[propName] = propValue;\n domNode['oninput-value'] = undefined;\n }\n if (propValue !== previousValue) {\n propertiesUpdated = true;\n }\n }\n else if (propName !== 'key' && propValue !== previousValue) {\n const type = typeof propValue;\n if (type === 'function' && propName.lastIndexOf('on', 0) === 0 && includesEventsAndAttributes) {\n updateEvent(domNode, propName.substr(2), propValue, projectionOptions, properties.bind, previousValue);\n }\n else if (type === 'string' && propName !== 'innerHTML' && includesEventsAndAttributes) {\n updateAttribute(domNode, propName, propValue, projectionOptions);\n }\n else if (propName === 'scrollLeft' || propName === 'scrollTop') {\n if (domNode[propName] !== propValue) {\n domNode[propName] = propValue;\n }\n }\n else {\n domNode[propName] = propValue;\n }\n propertiesUpdated = true;\n }\n }\n }\n return propertiesUpdated;\n}\nfunction findIndexOfChild(children, sameAs, start) {\n for (let i = start; i < children.length; i++) {\n if (same(children[i], sameAs)) {\n return i;\n }\n }\n return -1;\n}\nexport function toParentVNode(domNode) {\n return {\n tag: '',\n properties: {},\n children: undefined,\n domNode,\n type: VNODE\n };\n}\nexport function toTextVNode(data) {\n return {\n tag: '',\n properties: {},\n children: undefined,\n text: `${data}`,\n domNode: undefined,\n type: VNODE\n };\n}\nfunction toInternalWNode(instance, instanceData) {\n return {\n instance,\n rendered: [],\n coreProperties: instanceData.coreProperties,\n children: instance.children,\n widgetConstructor: instance.constructor,\n properties: instanceData.inputProperties,\n type: WNODE\n };\n}\nexport function filterAndDecorateChildren(children, instance) {\n if (children === undefined) {\n return emptyArray;\n }\n children = Array.isArray(children) ? children : [children];\n for (let i = 0; i < children.length;) {\n const child = children[i];\n if (child === undefined || child === null) {\n children.splice(i, 1);\n continue;\n }\n else if (typeof child === 'string') {\n children[i] = toTextVNode(child);\n }\n else {\n if (isVNode(child)) {\n if (child.properties.bind === undefined) {\n child.properties.bind = instance;\n if (child.children && child.children.length > 0) {\n filterAndDecorateChildren(child.children, instance);\n }\n }\n }\n else {\n if (!child.coreProperties) {\n const instanceData = widgetInstanceMap.get(instance);\n child.coreProperties = {\n bind: instance,\n baseRegistry: instanceData.coreProperties.baseRegistry\n };\n }\n if (child.children && child.children.length > 0) {\n filterAndDecorateChildren(child.children, instance);\n }\n }\n }\n i++;\n }\n return children;\n}\nfunction nodeAdded(dnode, transitions) {\n if (isVNode(dnode) && dnode.properties) {\n const enterAnimation = dnode.properties.enterAnimation;\n if (enterAnimation) {\n if (typeof enterAnimation === 'function') {\n enterAnimation(dnode.domNode, dnode.properties);\n }\n else {\n transitions.enter(dnode.domNode, dnode.properties, enterAnimation);\n }\n }\n }\n}\nfunction nodeToRemove(dnode, transitions, projectionOptions) {\n if (isWNode(dnode)) {\n const rendered = dnode.rendered || emptyArray;\n if (dnode.instance) {\n const instanceData = widgetInstanceMap.get(dnode.instance);\n instanceData.onDetach();\n instanceMap.delete(dnode.instance);\n }\n for (let i = 0; i < rendered.length; i++) {\n nodeToRemove(rendered[i], transitions, projectionOptions);\n }\n }\n else {\n const domNode = dnode.domNode;\n const properties = dnode.properties;\n if (dnode.children && dnode.children.length > 0) {\n for (let i = 0; i < dnode.children.length; i++) {\n nodeToRemove(dnode.children[i], transitions, projectionOptions);\n }\n }\n const exitAnimation = properties.exitAnimation;\n if (properties && exitAnimation) {\n domNode.style.pointerEvents = 'none';\n const removeDomNode = function () {\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\n dnode.domNode = undefined;\n };\n if (typeof exitAnimation === 'function') {\n exitAnimation(domNode, removeDomNode, properties);\n return;\n }\n else {\n transitions.exit(dnode.domNode, properties, exitAnimation, removeDomNode);\n return;\n }\n }\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\n dnode.domNode = undefined;\n }\n}\nfunction checkDistinguishable(childNodes, indexToCheck, parentInstance) {\n const childNode = childNodes[indexToCheck];\n if (isVNode(childNode) && !childNode.tag) {\n return; // Text nodes need not be distinguishable\n }\n const { key } = childNode.properties;\n if (key === undefined || key === null) {\n for (let i = 0; i < childNodes.length; i++) {\n if (i !== indexToCheck) {\n const node = childNodes[i];\n if (same(node, childNode)) {\n let nodeIdentifier;\n const parentName = parentInstance.constructor.name || 'unknown';\n if (isWNode(childNode)) {\n nodeIdentifier = childNode.widgetConstructor.name || 'unknown';\n }\n else {\n nodeIdentifier = childNode.tag;\n }\n console.warn(`A widget (${parentName}) has had a child addded or removed, but they were not able to uniquely identified. It is recommended to provide a unique 'key' property when using the same widget or element (${nodeIdentifier}) multiple times as siblings`);\n break;\n }\n }\n }\n }\n}\nfunction updateChildren(parentVNode, oldChildren, newChildren, parentInstance, projectionOptions) {\n oldChildren = oldChildren || emptyArray;\n newChildren = newChildren;\n const oldChildrenLength = oldChildren.length;\n const newChildrenLength = newChildren.length;\n const transitions = projectionOptions.transitions;\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\n let oldIndex = 0;\n let newIndex = 0;\n let i;\n let textUpdated = false;\n while (newIndex < newChildrenLength) {\n let oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : undefined;\n const newChild = newChildren[newIndex];\n if (isVNode(newChild) && typeof newChild.deferredPropertiesCallback === 'function') {\n newChild.inserted = isVNode(oldChild) && oldChild.inserted;\n addDeferredProperties(newChild, projectionOptions);\n }\n if (oldChild !== undefined && same(oldChild, newChild)) {\n textUpdated = updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance) || textUpdated;\n oldIndex++;\n newIndex++;\n continue;\n }\n const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);\n const addChild = () => {\n let insertBeforeDomNode = undefined;\n let child = oldChildren[oldIndex];\n if (child) {\n let nextIndex = oldIndex + 1;\n let insertBeforeChildren = [child];\n while (insertBeforeChildren.length) {\n const insertBefore = insertBeforeChildren.shift();\n if (isWNode(insertBefore)) {\n if (insertBefore.rendered) {\n insertBeforeChildren.push(...insertBefore.rendered);\n }\n }\n else {\n if (insertBefore.domNode) {\n insertBeforeDomNode = insertBefore.domNode;\n break;\n }\n }\n if (insertBeforeChildren.length === 0 && oldChildren[nextIndex]) {\n insertBeforeChildren.push(oldChildren[nextIndex]);\n nextIndex++;\n }\n }\n }\n createDom(newChild, parentVNode, insertBeforeDomNode, projectionOptions, parentInstance);\n nodeAdded(newChild, transitions);\n const indexToCheck = newIndex;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(newChildren, indexToCheck, parentInstance);\n });\n };\n if (!oldChild || findOldIndex === -1) {\n addChild();\n newIndex++;\n continue;\n }\n const removeChild = () => {\n const indexToCheck = oldIndex;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\n });\n if (isWNode(oldChild)) {\n const item = instanceMap.get(oldChild.instance);\n if (item) {\n oldChild = item.dnode;\n }\n }\n nodeToRemove(oldChild, transitions, projectionOptions);\n };\n const findNewIndex = findIndexOfChild(newChildren, oldChild, newIndex + 1);\n if (findNewIndex === -1) {\n removeChild();\n oldIndex++;\n continue;\n }\n addChild();\n removeChild();\n oldIndex++;\n newIndex++;\n }\n if (oldChildrenLength > oldIndex) {\n // Remove child fragments\n for (i = oldIndex; i < oldChildrenLength; i++) {\n const indexToCheck = i;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\n });\n let childToRemove = oldChildren[i];\n if (isWNode(childToRemove)) {\n const item = instanceMap.get(childToRemove.instance);\n if (item) {\n childToRemove = item.dnode;\n }\n }\n nodeToRemove(childToRemove, transitions, projectionOptions);\n }\n }\n return textUpdated;\n}\nfunction addChildren(parentVNode, children, projectionOptions, parentInstance, insertBefore = undefined, childNodes) {\n if (children === undefined) {\n return;\n }\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectorState.merge && childNodes === undefined) {\n childNodes = arrayFrom(parentVNode.domNode.childNodes);\n }\n const transitions = projectionOptions.transitions;\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n if (isVNode(child)) {\n if (projectorState.merge && childNodes) {\n let domElement = undefined;\n while (child.domNode === undefined && childNodes.length > 0) {\n domElement = childNodes.shift();\n if (domElement && domElement.tagName === (child.tag.toUpperCase() || undefined)) {\n child.domNode = domElement;\n }\n }\n }\n createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance);\n }\n else {\n createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes);\n }\n nodeAdded(child, transitions);\n }\n}\nfunction initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions) {\n addChildren(dnode, dnode.children, projectionOptions, parentInstance, undefined);\n if (typeof dnode.deferredPropertiesCallback === 'function' && dnode.inserted === undefined) {\n addDeferredProperties(dnode, projectionOptions);\n }\n if (dnode.attributes && dnode.events) {\n updateAttributes(domNode, {}, dnode.attributes, projectionOptions);\n updateProperties(domNode, {}, dnode.properties, projectionOptions, false);\n removeOrphanedEvents(domNode, {}, dnode.events, projectionOptions, true);\n const events = dnode.events;\n Object.keys(events).forEach((event) => {\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind);\n });\n }\n else {\n updateProperties(domNode, {}, dnode.properties, projectionOptions);\n }\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\n const instanceData = widgetInstanceMap.get(parentInstance);\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\n }\n dnode.inserted = true;\n}\nfunction createDom(dnode, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes) {\n let domNode;\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (isWNode(dnode)) {\n let { widgetConstructor } = dnode;\n const parentInstanceData = widgetInstanceMap.get(parentInstance);\n if (!isWidgetBaseConstructor(widgetConstructor)) {\n const item = parentInstanceData.registry().get(widgetConstructor);\n if (item === null) {\n return;\n }\n widgetConstructor = item;\n }\n const instance = new widgetConstructor();\n dnode.instance = instance;\n const instanceData = widgetInstanceMap.get(instance);\n instanceData.invalidate = () => {\n instanceData.dirty = true;\n if (instanceData.rendering === false) {\n projectorState.renderQueue.push({ instance, depth: projectionOptions.depth });\n scheduleRender(projectionOptions);\n }\n };\n instanceData.rendering = true;\n instance.__setCoreProperties__(dnode.coreProperties);\n instance.__setChildren__(dnode.children);\n instance.__setProperties__(dnode.properties);\n const rendered = instance.__render__();\n instanceData.rendering = false;\n if (rendered) {\n const filteredRendered = filterAndDecorateChildren(rendered, instance);\n dnode.rendered = filteredRendered;\n addChildren(parentVNode, filteredRendered, projectionOptions, instance, insertBefore, childNodes);\n }\n instanceMap.set(instance, { dnode, parentVNode });\n instanceData.nodeHandler.addRoot();\n projectorState.afterRenderCallbacks.push(() => {\n instanceData.onAttach();\n });\n }\n else {\n if (projectorState.merge && projectorState.mergeElement !== undefined) {\n domNode = dnode.domNode = projectionOptions.mergeElement;\n projectorState.mergeElement = undefined;\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\n return;\n }\n const doc = parentVNode.domNode.ownerDocument;\n if (!dnode.tag && typeof dnode.text === 'string') {\n if (dnode.domNode !== undefined && parentVNode.domNode) {\n const newDomNode = dnode.domNode.ownerDocument.createTextNode(dnode.text);\n if (parentVNode.domNode === dnode.domNode.parentNode) {\n parentVNode.domNode.replaceChild(newDomNode, dnode.domNode);\n }\n else {\n parentVNode.domNode.appendChild(newDomNode);\n dnode.domNode.parentNode && dnode.domNode.parentNode.removeChild(dnode.domNode);\n }\n dnode.domNode = newDomNode;\n }\n else {\n domNode = dnode.domNode = doc.createTextNode(dnode.text);\n if (insertBefore !== undefined) {\n parentVNode.domNode.insertBefore(domNode, insertBefore);\n }\n else {\n parentVNode.domNode.appendChild(domNode);\n }\n }\n }\n else {\n if (dnode.domNode === undefined) {\n if (dnode.tag === 'svg') {\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\n }\n if (projectionOptions.namespace !== undefined) {\n domNode = dnode.domNode = doc.createElementNS(projectionOptions.namespace, dnode.tag);\n }\n else {\n domNode = dnode.domNode = dnode.domNode || doc.createElement(dnode.tag);\n }\n }\n else {\n domNode = dnode.domNode;\n }\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\n if (insertBefore !== undefined) {\n parentVNode.domNode.insertBefore(domNode, insertBefore);\n }\n else if (domNode.parentNode !== parentVNode.domNode) {\n parentVNode.domNode.appendChild(domNode);\n }\n }\n }\n}\nfunction updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance) {\n if (isWNode(dnode)) {\n const { instance } = previous;\n const { parentVNode, dnode: node } = instanceMap.get(instance);\n const previousRendered = node ? node.rendered : previous.rendered;\n const instanceData = widgetInstanceMap.get(instance);\n instanceData.rendering = true;\n instance.__setCoreProperties__(dnode.coreProperties);\n instance.__setChildren__(dnode.children);\n instance.__setProperties__(dnode.properties);\n dnode.instance = instance;\n if (instanceData.dirty === true) {\n const rendered = instance.__render__();\n instanceData.rendering = false;\n dnode.rendered = filterAndDecorateChildren(rendered, instance);\n updateChildren(parentVNode, previousRendered, dnode.rendered, instance, projectionOptions);\n }\n else {\n instanceData.rendering = false;\n dnode.rendered = previousRendered;\n }\n instanceMap.set(instance, { dnode, parentVNode });\n instanceData.nodeHandler.addRoot();\n }\n else {\n if (previous === dnode) {\n return false;\n }\n const domNode = (dnode.domNode = previous.domNode);\n let textUpdated = false;\n let updated = false;\n if (!dnode.tag && typeof dnode.text === 'string') {\n if (dnode.text !== previous.text) {\n const newDomNode = domNode.ownerDocument.createTextNode(dnode.text);\n domNode.parentNode.replaceChild(newDomNode, domNode);\n dnode.domNode = newDomNode;\n textUpdated = true;\n return textUpdated;\n }\n }\n else {\n if (dnode.tag && dnode.tag.lastIndexOf('svg', 0) === 0) {\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\n }\n if (previous.children !== dnode.children) {\n const children = filterAndDecorateChildren(dnode.children, parentInstance);\n dnode.children = children;\n updated =\n updateChildren(dnode, previous.children, children, parentInstance, projectionOptions) || updated;\n }\n const previousProperties = buildPreviousProperties(domNode, previous, dnode);\n if (dnode.attributes && dnode.events) {\n updateAttributes(domNode, previousProperties.attributes, dnode.attributes, projectionOptions);\n updated =\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions, false) || updated;\n removeOrphanedEvents(domNode, previousProperties.events, dnode.events, projectionOptions, true);\n const events = dnode.events;\n Object.keys(events).forEach((event) => {\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind, previousProperties.events[event]);\n });\n }\n else {\n updated =\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions) ||\n updated;\n }\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\n const instanceData = widgetInstanceMap.get(parentInstance);\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\n }\n }\n if (updated && dnode.properties && dnode.properties.updateAnimation) {\n dnode.properties.updateAnimation(domNode, dnode.properties, previous.properties);\n }\n }\n}\nfunction addDeferredProperties(vnode, projectionOptions) {\n // transfer any properties that have been passed - as these must be decorated properties\n vnode.decoratedDeferredProperties = vnode.properties;\n const properties = vnode.deferredPropertiesCallback(!!vnode.inserted);\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n vnode.properties = Object.assign({}, properties, vnode.decoratedDeferredProperties);\n projectorState.deferredRenderCallbacks.push(() => {\n const properties = Object.assign({}, vnode.deferredPropertiesCallback(!!vnode.inserted), vnode.decoratedDeferredProperties);\n updateProperties(vnode.domNode, vnode.properties, properties, projectionOptions);\n vnode.properties = properties;\n });\n}\nfunction runDeferredRenderCallbacks(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectorState.deferredRenderCallbacks.length) {\n if (projectionOptions.sync) {\n while (projectorState.deferredRenderCallbacks.length) {\n const callback = projectorState.deferredRenderCallbacks.shift();\n callback && callback();\n }\n }\n else {\n global.requestAnimationFrame(() => {\n while (projectorState.deferredRenderCallbacks.length) {\n const callback = projectorState.deferredRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n }\n}\nfunction runAfterRenderCallbacks(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectionOptions.sync) {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n }\n else {\n if (global.requestIdleCallback) {\n global.requestIdleCallback(() => {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n else {\n setTimeout(() => {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n }\n}\nfunction scheduleRender(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectionOptions.sync) {\n render(projectionOptions);\n }\n else if (projectorState.renderScheduled === undefined) {\n projectorState.renderScheduled = global.requestAnimationFrame(() => {\n render(projectionOptions);\n });\n }\n}\nfunction render(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectorState.renderScheduled = undefined;\n const renderQueue = projectorState.renderQueue;\n const renders = [...renderQueue];\n projectorState.renderQueue = [];\n renders.sort((a, b) => a.depth - b.depth);\n const previouslyRendered = [];\n while (renders.length) {\n const { instance } = renders.shift();\n if (instanceMap.has(instance) && previouslyRendered.indexOf(instance) === -1) {\n previouslyRendered.push(instance);\n const { parentVNode, dnode } = instanceMap.get(instance);\n const instanceData = widgetInstanceMap.get(instance);\n updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance);\n }\n }\n runAfterRenderCallbacks(projectionOptions);\n runDeferredRenderCallbacks(projectionOptions);\n}\nexport const dom = {\n append: function (parentNode, instance, projectionOptions = {}) {\n const instanceData = widgetInstanceMap.get(instance);\n const finalProjectorOptions = getProjectionOptions(projectionOptions, instance);\n const projectorState = {\n afterRenderCallbacks: [],\n deferredRenderCallbacks: [],\n nodeMap: new WeakMap(),\n renderScheduled: undefined,\n renderQueue: [],\n merge: projectionOptions.merge || false,\n mergeElement: projectionOptions.mergeElement\n };\n projectorStateMap.set(instance, projectorState);\n finalProjectorOptions.rootNode = parentNode;\n const parentVNode = toParentVNode(finalProjectorOptions.rootNode);\n const node = toInternalWNode(instance, instanceData);\n instanceMap.set(instance, { dnode: node, parentVNode });\n instanceData.invalidate = () => {\n instanceData.dirty = true;\n if (instanceData.rendering === false) {\n projectorState.renderQueue.push({ instance, depth: finalProjectorOptions.depth });\n scheduleRender(finalProjectorOptions);\n }\n };\n updateDom(node, node, finalProjectorOptions, parentVNode, instance);\n projectorState.afterRenderCallbacks.push(() => {\n instanceData.onAttach();\n });\n runDeferredRenderCallbacks(finalProjectorOptions);\n runAfterRenderCallbacks(finalProjectorOptions);\n return {\n domNode: finalProjectorOptions.rootNode\n };\n },\n create: function (instance, projectionOptions) {\n return this.append(document.createElement('div'), instance, projectionOptions);\n },\n merge: function (element, instance, projectionOptions = {}) {\n projectionOptions.merge = true;\n projectionOptions.mergeElement = element;\n const projection = this.append(element.parentNode, instance, projectionOptions);\n const projectorState = projectorStateMap.get(instance);\n projectorState.merge = false;\n return projection;\n }\n};\n//# sourceMappingURL=vdom.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/vdom.mjs\n// module id = ./node_modules/@dojo/widget-core/vdom.mjs\n// module chunks = menu","/*** IMPORTS FROM imports-loader ***/\nvar widgetFactory = require(\"src/menu/Menu\");\n\nvar registerCustomElement = require('@dojo/widget-core/registerCustomElement').default;\n\nvar defaultExport = widgetFactory.default;\ndefaultExport && registerCustomElement(defaultExport);\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/imports-loader?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js\n// module id = ./node_modules/imports-loader/index.js?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js\n// module chunks = menu","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/process/browser.js\n// module id = ./node_modules/process/browser.js\n// module chunks = menu","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)\r\n t[p[i]] = s[p[i]];\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = y[op[0] & 2 ? \"return\" : op[0] ? \"throw\" : \"next\"]) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [0, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { if (o[n]) i[n] = function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; }; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator];\r\n return m ? m.call(o) : typeof __values === \"function\" ? __values(o) : o[Symbol.iterator]();\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/tslib/tslib.es6.js\n// module id = ./node_modules/tslib/tslib.es6.js\n// module chunks = menu","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\n} catch(e) {\n\t// This works if the window reference is available\n\tif(typeof window === \"object\")\n\t\tg = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = ./node_modules/webpack/buildin/global.js\n// module chunks = menu","import { v } from '@dojo/widget-core/d';\nimport { customElement } from '@dojo/widget-core/decorators/customElement';\nimport { WidgetProperties, WNode } from '@dojo/widget-core/interfaces';\nimport { theme, ThemedMixin } from '@dojo/widget-core/mixins/Themed';\nimport { WidgetBase } from '@dojo/widget-core/WidgetBase';\nimport { MenuItem, MenuItemProperties } from '../menu-item/MenuItem';\n\nimport * as css from './menu.m.css';\n\ninterface MenuProperties extends WidgetProperties {\n\tonSelected: (data: any) => void;\n}\n\n@customElement({\n\ttag: 'demo-menu',\n\tevents: ['onSelected']\n})\n@theme(css)\nexport class Menu extends ThemedMixin(WidgetBase)> {\n\tprivate _selectedId: number;\n\n\tprivate _onSelected(id: number, data: any) {\n\t\tthis._selectedId = id;\n\t\tthis.properties.onSelected(data);\n\t\tthis.invalidate();\n\t}\n\n\tprotected render() {\n\t\tconst items = this.children.map((child, index) => {\n\t\t\tif (child) {\n\t\t\t\tconst properties: Partial = {\n\t\t\t\t\tonSelected: (data: any) => {\n\t\t\t\t\t\tthis._onSelected(index, data);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tif (this._selectedId !== undefined) {\n\t\t\t\t\tproperties.selected = index === this._selectedId;\n\t\t\t\t}\n\t\t\t\tchild.properties = { ...child.properties, ...properties };\n\t\t\t}\n\t\t\treturn child;\n\t\t});\n\n\t\treturn v('nav', { classes: this.theme(css.root) }, [\n\t\t\tv(\n\t\t\t\t'ol',\n\t\t\t\t{\n\t\t\t\t\tclasses: this.theme(css.menuContainer)\n\t\t\t\t},\n\t\t\t\titems\n\t\t\t)\n\t\t]);\n\t}\n}\n\nexport default Menu;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@dojo/webpack-contrib/css-module-dts-loader?type=ts&instanceName=0_menu!./src/menu/Menu.ts","// removed by extract-text-webpack-plugin\nmodule.exports = {\" _key\":\"test-app/menu\",\"root\":\"_3bA6jdSn\",\"menuContainer\":\"_1eoGfqku\"};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/menu/menu.m.css\n// module id = ./src/menu/menu.m.css\n// module chunks = menu"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 01c4fe13e2f1c25e9421","webpack:///./node_modules/@dojo/framework/core/Destroyable.mjs","webpack:///./node_modules/@dojo/framework/core/Evented.mjs","webpack:///./node_modules/@dojo/framework/core/lang.mjs","webpack:///./node_modules/@dojo/framework/has/has.mjs","webpack:///./node_modules/@dojo/framework/shim/Map.mjs","webpack:///./node_modules/@dojo/framework/shim/Promise.mjs","webpack:///./node_modules/@dojo/framework/shim/Symbol.mjs","webpack:///./node_modules/@dojo/framework/shim/WeakMap.mjs","webpack:///./node_modules/@dojo/framework/shim/array.mjs","webpack:///./node_modules/@dojo/framework/shim/global.mjs","webpack:///./node_modules/@dojo/framework/shim/number.mjs","webpack:///./node_modules/@dojo/framework/shim/object.mjs","webpack:///./node_modules/@dojo/framework/shim/string.mjs","webpack:///./node_modules/@dojo/framework/shim/support/has.mjs","webpack:///./node_modules/@dojo/framework/shim/support/queue.mjs","webpack:///./node_modules/@dojo/framework/shim/support/util.mjs","webpack:///./node_modules/@dojo/framework/widget-core/Injector.mjs","webpack:///./node_modules/@dojo/framework/widget-core/NodeHandler.mjs","webpack:///./node_modules/@dojo/framework/widget-core/Registry.mjs","webpack:///./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs","webpack:///./node_modules/@dojo/framework/widget-core/WidgetBase.mjs","webpack:///./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs","webpack:///./node_modules/@dojo/framework/widget-core/d.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/inject.mjs","webpack:///./node_modules/@dojo/framework/widget-core/diff.mjs","webpack:///./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs","webpack:///./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs","webpack:///./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs","webpack:///./node_modules/@dojo/framework/widget-core/vdom.mjs","webpack:///./node_modules/@dojo/cli-build-widget/template/custom-element.js","webpack:///./node_modules/process/browser.js","webpack:///./node_modules/tslib/tslib.es6.js","webpack:///(webpack)/buildin/global.js","webpack:///./src/menu/Menu.ts","webpack:///./src/menu/menu.m.css?ec11"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","noop","__WEBPACK_IMPORTED_MODULE_1__shim_Promise__","resolve","destroyed","Error","Destroyable","[object Object]","this","handles","handle","Array","isArray","__WEBPACK_IMPORTED_MODULE_0__lang__","_handles","push","splice","indexOf","destroy","forEach","own","__webpack_exports__","regexMap","__WEBPACK_IMPORTED_MODULE_0__shim_Map__","Evented","__WEBPACK_IMPORTED_MODULE_1__Destroyable__","super","arguments","listenersMap","event","methods","type","globString","targetString","regex","has","RegExp","replace","set","test","isGlobMatch","method","listener","map","_addListener","listeners","destructor","called","createHandle","length","slice","testCache","testFunctions","testThenables","globalScope","window","global","self","staticFeatures","DojoHasEnvironment","staticCache","apply","add","feature","value","overwrite","normalizedFeature","toLowerCase","Boolean","exists","TypeError","then","isFeatureTestThenable","resolvedValue","result","document","location","process","versions","node","Map","__WEBPACK_IMPORTED_MODULE_1__global__","ShimPromise","__WEBPACK_IMPORTED_MODULE_0__global__","Promise","Symbol","wellKnown","__WEBPACK_IMPORTED_MODULE_2__support_util__","for","WeakMap","from","of","copyWithin","fill","find","findIndex","includes","__WEBPACK_IMPORTED_MODULE_4__support_util__","globalObject","Math","pow","assign","getOwnPropertyDescriptor","getOwnPropertyNames","getOwnPropertySymbols","is","keys","getOwnPropertyDescriptors","entries","values","fromCodePoint","raw","codePointAt","endsWith","normalize","repeat","startsWith","padEnd","padStart","String","__WEBPACK_IMPORTED_MODULE_0__has_has__","every","key","Number","POSITIVE_INFINITY","e","imul","Observable","Set","getCallSite","callSite","substitutions","key1","key2","freeze","postMessage","requestAnimationFrame","setImmediate","MutationObserver","WebKitMutationObserver","example","createElement","observer","observe","attributes","style","setProperty","takeRecords","undefined","Animation","KeyframeEffect","executeTask","item","isActive","callback","getQueueHandle","enqueue","queue","addEventListener","source","data","stopPropagation","shift","queueTask","id","queueAnimationTask","rafId","bind","cancelAnimationFrame","writable","nativeFunction","target","args","Injector","__WEBPACK_IMPORTED_MODULE_0__core_Evented__","payload","_payload","invalidator","_invalidator","NodeEventType","_nodeMap","__WEBPACK_IMPORTED_MODULE_1__shim_Map__","element","emit","Widget","Projector","clear","WIDGET_BASE_TYPE","__WEBPACK_IMPORTED_MODULE_2__shim_Symbol__","isWidgetBaseConstructor","_type","Registry","__WEBPACK_IMPORTED_MODULE_3__core_Evented__","widgetLabel","action","label","_widgetRegistry","toString","__WEBPACK_IMPORTED_MODULE_0__shim_Promise__","widgetCtor","emitLoadedEvent","error","injectorFactory","_injectorRegistry","injectorItem","injector","promise","default","isWidgetConstructorDefaultExport","hasInjector","__WEBPACK_IMPORTED_MODULE_1__core_Evented__","_registry","__WEBPACK_IMPORTED_MODULE_2__Registry__","_registryWidgetLabelMap","_registryInjectorLabelMap","baseRegistry","delete","base","widget","define","defineInjector","globalPrecedence","_get","getFunctionName","labelMap","registries","registry","registeredLabels","on","decoratorMap","boundAuto","__WEBPACK_IMPORTED_MODULE_4__diff__","noBind","WidgetBase","_initialProperties","_changedPropertyKeys","_nodeHandler","__WEBPACK_IMPORTED_MODULE_6__NodeHandler__","_children","_decoratorCache","_properties","_boundRenderFunc","render","_boundInvalidate","invalidate","__WEBPACK_IMPORTED_MODULE_7__vdom__","dirty","onAttach","onDetach","nodeHandler","coreProperties","rendering","inputProperties","_runAfterConstructors","MetaType","_metaMap","cached","properties","changedPropertyKeys","instanceData","__WEBPACK_IMPORTED_MODULE_5__RegistryHandler__","originalProperties","_runBeforeProperties","registeredDiffPropertyNames","getDecorator","propertyNames","allProperties","checkedProperties","diffPropertyResults","runReactions","propertyName","previousProperty","newProperty","_bindFunctionProperty","diffFunctions","changed","executedReactions","reaction","propertyChanged","reactionRun","children","dNode","_runBeforeRenders","runAfterRenders","__WEBPACK_IMPORTED_MODULE_3__d__","decoratorKey","decoratorList","constructor","specificDecoratorList","decorators","allDecorators","instanceMap","unshift","getPrototypeOf","_buildDecoratorList","__WEBPACK_IMPORTED_MODULE_8__Registry__","_bindFunctionPropertyMap","__WEBPACK_IMPORTED_MODULE_1__shim_WeakMap__","bindInfo","boundFunc","scope","beforeProperties","reduce","beforePropertiesFunction","beforeRenders","beforeRenderFunction","updatedRender","console","warn","afterRenders","afterRenderFunction","meta","afterRender","afterConstructors","afterConstructor","pop","browserSpecificTransitionEndEventName","browserSpecificAnimationEndEventName","initialize","determineBrowserStyleNames","runAndCleanUp","startAnimation","finishAnimation","finished","transitionEnd","removeEventListener","enter","enterAnimation","activeClass","enterAnimationActive","classList","remove","exit","exitAnimation","removeNode","exitAnimationActive","child","DOMVNODE","widgetConstructor","WNODE","tag","propertiesOrChildren","deferredPropertiesCallback","VNODE","attrs","props","diffType","isElementNode","tagName","events","domNode","text","__WEBPACK_IMPORTED_MODULE_0__shim_Symbol__","isWNode","isVNode","__WEBPACK_IMPORTED_MODULE_0__handleDecorator__","propertyKey","addDecorator","alwaysRender","__WEBPACK_IMPORTED_MODULE_1__beforeProperties__","customElement","childType","__WEBPACK_IMPORTED_MODULE_0__registerCustomElement__","DOJO","registryFactory","__WEBPACK_IMPORTED_MODULE_1__Registry__","__customElementDescriptor","diffProperty","diffFunction","__WEBPACK_IMPORTED_MODULE_1__diff__","reactionFunction","handleDecorator","handler","descriptor","registeredInjectorsMap","__WEBPACK_IMPORTED_MODULE_0__shim_WeakMap__","inject","getProperties","__WEBPACK_IMPORTED_MODULE_1__handleDecorator__","__WEBPACK_IMPORTED_MODULE_2__beforeProperties__","getInjector","registeredInjectors","__WEBPACK_IMPORTED_MODULE_0__Registry__","reference","ignore","isObjectOrArray","shallow","validOldProperty","validNewProperty","previousKeys","newKeys","some","ProjectorAttachState","AttachType","ProjectorMixin","Base","_root","body","_async","_projectorProperties","_projectionOptions","transitions","__WEBPACK_IMPORTED_MODULE_2__animations_cssTransitions__","root","projectorState","Detached","options","Append","_attach","Merge","Attached","async","doc","previousRoot","createDocumentFragment","__setChildren__","__setProperties__","__WEBPACK_IMPORTED_MODULE_1__core_lang__","__setCoreProperties__","_projection","childNodes","outerHTML","__WEBPACK_IMPORTED_MODULE_4__d__","_attachHandle","sync","__WEBPACK_IMPORTED_MODULE_5__vdom__","append","merge","__WEBPACK_IMPORTED_MODULE_0_tslib__","__WEBPACK_IMPORTED_MODULE_3__decorators_afterRender__","theme","__WEBPACK_IMPORTED_MODULE_3__decorators_handleDecorator__","themeRegistry","themeInjector","__WEBPACK_IMPORTED_MODULE_1__Injector__","INJECTED_THEME_KEY","setInvalidator","THEME_KEY","ThemedMixin","Themed","_registeredBaseThemeKeys","_recalculateClasses","_theme","classes","_recalculateThemeClasses","className","_getThemeClass","extraClasses","themeClassName","_baseThemeClassesReverseLookup","resultClassNames","_registeredBaseTheme","join","baseThemes","finalBaseTheme","baseTheme","_a","currentClassNames","baseClass","themeKey","__WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__","__WEBPACK_IMPORTED_MODULE_5__diff__","__WEBPACK_IMPORTED_MODULE_2__decorators_inject__","CustomElementChildType","DomToWidgetWrapper","__WEBPACK_IMPORTED_MODULE_1__WidgetBase__","__WEBPACK_IMPORTED_MODULE_7__decorators_alwaysRender__","create","WidgetConstructor","attributeMap","attributeName","HTMLElement","_eventProperties","_initialised","domProperties","_attributesToProperties","filteredPropertyName","_getProperty","_setProperty","eventName","_getEventProperty","_setEventProperty","eventCallback","dispatchEvent","CustomEvent","bubbles","detail","defineProperties","TEXT","__WEBPACK_IMPORTED_MODULE_3__shim_array__","childNode","_render","_childConnected","widgetProperties","renderChildren","__children__","themeContext","__WEBPACK_IMPORTED_MODULE_6__mixins_Themed__","_getTheme","__WEBPACK_IMPORTED_MODULE_5__shim_global__","__WEBPACK_IMPORTED_MODULE_2__mixins_Projector__","_projector","setProperties","dojoce","themes","parentNode","filter","Child","isWidget","__properties__","oldValue","getAttribute","observedAttributes","register","customElements","NAMESPACE_SVG","NAMESPACE_W3","NAMESPACE_XLINK","emptyArray","nodeOperations","widgetInstanceMap","__WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__","nextSiblingMap","projectorStateMap","same","dnode1","dnode2","__WEBPACK_IMPORTED_MODULE_2__d__","instance","missingTransition","checkStyleValue","styleValue","updateEvent","currentValue","projectionOptions","previousValue","projectorInstance","eventMap","nodeMap","previousEvent","evt","addClasses","classNames","split","removeClasses","nodeOperation","propName","propValue","deferredRenderCallbacks","removeOrphanedEvents","previousProperties","onlyEvents","isEvent","substr","updateAttribute","attrName","attrValue","namespace","setAttributeNS","removeAttribute","setAttribute","updateAttributes","previousAttributes","attrNames","attrCount","updateProperties","includesEventsAndAttributes","propertiesUpdated","propNames","propCount","previousClasses","currentClasses","newClasses","previousClassName","classIndex","styleNames","styleCount","j","styleName","newStyleValue","styleApplyer","domValue","lastIndexOf","findIndexOfChild","sameAs","start","toInternalWNode","rendered","filterAndDecorateChildren","nodeAdded","dnode","nodeToRemove","pointerEvents","removeDomNode","removeChild","checkDistinguishable","indexToCheck","parentInstance","nodeIdentifier","parentName","updateChildren","parentVNode","siblings","oldChildren","newChildren","oldChildrenLength","newChildrenLength","depth","oldIndex","newIndex","textUpdated","oldChild","newChild","inserted","addDeferredProperties","updateDom","findOldIndex","addChild","insertBeforeDomNode","childrenArray","nextIndex","insertBeforeChildren","insertBefore","parentElement","createDom","afterRenderCallbacks","childToRemove","addChildren","__WEBPACK_IMPORTED_MODULE_1__shim_array__","nextSiblings","domElement","toUpperCase","initPropertiesAndChildren","parentInstanceData","__WEBPACK_IMPORTED_MODULE_3__Registry__","renderQueue","scheduleRender","__render__","filteredRendered","addRoot","mergeElement","ownerDocument","createElementNS","appendChild","newDomNode","createTextNode","replaceChild","previous","oldNextSiblings","previousRendered","updated","current","newProperties","buildPreviousProperties","updateAnimation","vnode","decoratedDeferredProperties","runDeferredRenderCallbacks","__WEBPACK_IMPORTED_MODULE_0__shim_global__","runAfterRenderCallbacks","requestIdleCallback","setTimeout","renderScheduled","renders","sort","a","b","previouslyRendered","dom","finalProjectorOptions","projectorOptions","defaults","getProjectionOptions","rootNode","projection","widgetFactory","registerCustomElement","defaultExport","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","fun","clearTimeout","currentQueue","draining","queueIndex","cleanUpNextTick","concat","drainQueue","timeout","len","run","marker","runClearTimeout","Item","array","nextTick","title","browser","env","argv","version","addListener","once","off","removeListener","removeAllListeners","prependListener","prependOnceListener","binding","cwd","chdir","dir","umask","t","desc","r","Reflect","decorate","setPrototypeOf","g","Function","eval","Menu","__WEBPACK_IMPORTED_MODULE_3__dojo_framework_widget_core_mixins_Themed__","__WEBPACK_IMPORTED_MODULE_4__dojo_framework_widget_core_WidgetBase__","_selectedId","onSelected","items","index","_onSelected","selected","__WEBPACK_IMPORTED_MODULE_1__dojo_framework_widget_core_d__","__WEBPACK_IMPORTED_MODULE_5__menu_m_css__","__WEBPACK_IMPORTED_MODULE_2__dojo_framework_widget_core_decorators_customElement__"," _key","menuContainer"],"mappings":"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","file":"menu-1.0.0.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 01c4fe13e2f1c25e9421","import { createCompositeHandle } from './lang';\nimport Promise from '../shim/Promise';\n/**\n * No operation function to replace own once instance is destoryed\n */\nfunction noop() {\n return Promise.resolve(false);\n}\n/**\n * No op function used to replace own, once instance has been destoryed\n */\nfunction destroyed() {\n throw new Error('Call made to destroyed method');\n}\nexport class Destroyable {\n /**\n * @constructor\n */\n constructor() {\n this.handles = [];\n }\n /**\n * Register handles for the instance that will be destroyed when `this.destroy` is called\n *\n * @param {Handle} handle The handle to add for the instance\n * @returns {Handle} a handle for the handle, removes the handle for the instance and calls destroy\n */\n own(handles) {\n const handle = Array.isArray(handles) ? createCompositeHandle(...handles) : handles;\n const { handles: _handles } = this;\n _handles.push(handle);\n return {\n destroy() {\n _handles.splice(_handles.indexOf(handle));\n handle.destroy();\n }\n };\n }\n /**\n * Destrpys all handers registered for the instance\n *\n * @returns {Promise {\n this.handles.forEach((handle) => {\n handle && handle.destroy && handle.destroy();\n });\n this.destroy = noop;\n this.own = destroyed;\n resolve(true);\n });\n }\n}\nexport default Destroyable;\n//# sourceMappingURL=Destroyable.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/core/Destroyable.mjs\n// module id = ./node_modules/@dojo/framework/core/Destroyable.mjs\n// module chunks = menu","import Map from '../shim/Map';\nimport { Destroyable } from './Destroyable';\n/**\n * Map of computed regular expressions, keyed by string\n */\nconst regexMap = new Map();\n/**\n * Determines is the event type glob has been matched\n *\n * @returns boolean that indicates if the glob is matched\n */\nexport function isGlobMatch(globString, targetString) {\n if (typeof targetString === 'string' && typeof globString === 'string' && globString.indexOf('*') !== -1) {\n let regex;\n if (regexMap.has(globString)) {\n regex = regexMap.get(globString);\n }\n else {\n regex = new RegExp(`^${globString.replace(/\\*/g, '.*')}$`);\n regexMap.set(globString, regex);\n }\n return regex.test(targetString);\n }\n else {\n return globString === targetString;\n }\n}\n/**\n * Event Class\n */\nexport class Evented extends Destroyable {\n constructor() {\n super(...arguments);\n /**\n * map of listeners keyed by event type\n */\n this.listenersMap = new Map();\n }\n emit(event) {\n this.listenersMap.forEach((methods, type) => {\n if (isGlobMatch(type, event.type)) {\n [...methods].forEach((method) => {\n method.call(this, event);\n });\n }\n });\n }\n on(type, listener) {\n if (Array.isArray(listener)) {\n const handles = listener.map((listener) => this._addListener(type, listener));\n return {\n destroy() {\n handles.forEach((handle) => handle.destroy());\n }\n };\n }\n return this._addListener(type, listener);\n }\n _addListener(type, listener) {\n const listeners = this.listenersMap.get(type) || [];\n listeners.push(listener);\n this.listenersMap.set(type, listeners);\n return {\n destroy: () => {\n const listeners = this.listenersMap.get(type) || [];\n listeners.splice(listeners.indexOf(listener), 1);\n }\n };\n }\n}\nexport default Evented;\n//# sourceMappingURL=Evented.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/core/Evented.mjs\n// module id = ./node_modules/@dojo/framework/core/Evented.mjs\n// module chunks = menu","import { assign } from '../shim/object';\nexport { assign } from '../shim/object';\nconst slice = Array.prototype.slice;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Type guard that ensures that the value can be coerced to Object\n * to weed out host objects that do not derive from Object.\n * This function is used to check if we want to deep copy an object or not.\n * Note: In ES6 it is possible to modify an object's Symbol.toStringTag property, which will\n * change the value returned by `toString`. This is a rare edge case that is difficult to handle,\n * so it is not handled here.\n * @param value The value to check\n * @return If the value is coercible into an Object\n */\nfunction shouldDeepCopyObject(value) {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\nfunction copyArray(array, inherited) {\n return array.map(function (item) {\n if (Array.isArray(item)) {\n return copyArray(item, inherited);\n }\n return !shouldDeepCopyObject(item)\n ? item\n : _mixin({\n deep: true,\n inherited: inherited,\n sources: [item],\n target: {}\n });\n });\n}\nfunction _mixin(kwArgs) {\n const deep = kwArgs.deep;\n const inherited = kwArgs.inherited;\n const target = kwArgs.target;\n const copied = kwArgs.copied || [];\n const copiedClone = [...copied];\n for (let i = 0; i < kwArgs.sources.length; i++) {\n const source = kwArgs.sources[i];\n if (source === null || source === undefined) {\n continue;\n }\n for (let key in source) {\n if (inherited || hasOwnProperty.call(source, key)) {\n let value = source[key];\n if (copiedClone.indexOf(value) !== -1) {\n continue;\n }\n if (deep) {\n if (Array.isArray(value)) {\n value = copyArray(value, inherited);\n }\n else if (shouldDeepCopyObject(value)) {\n const targetValue = target[key] || {};\n copied.push(source);\n value = _mixin({\n deep: true,\n inherited: inherited,\n sources: [value],\n target: targetValue,\n copied\n });\n }\n }\n target[key] = value;\n }\n }\n }\n return target;\n}\nexport function create(prototype, ...mixins) {\n if (!mixins.length) {\n throw new RangeError('lang.create requires at least one mixin object.');\n }\n const args = mixins.slice();\n args.unshift(Object.create(prototype));\n return assign.apply(null, args);\n}\nexport function deepAssign(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: false,\n sources: sources,\n target: target\n });\n}\nexport function deepMixin(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Creates a new object using the provided source's prototype as the prototype for the new object, and then\n * deep copies the provided source's values into the new target.\n *\n * @param source The object to duplicate\n * @return The new object\n */\nexport function duplicate(source) {\n const target = Object.create(Object.getPrototypeOf(source));\n return deepMixin(target, source);\n}\n/**\n * Determines whether two values are the same value.\n *\n * @param a First value to compare\n * @param b Second value to compare\n * @return true if the values are the same; false otherwise\n */\nexport function isIdentical(a, b) {\n return (a === b ||\n /* both values are NaN */\n (a !== a && b !== b));\n}\n/**\n * Returns a function that binds a method to the specified object at runtime. This is similar to\n * `Function.prototype.bind`, but instead of a function it takes the name of a method on an object.\n * As a result, the function returned by `lateBind` will always call the function currently assigned to\n * the specified property on the object as of the moment the function it returns is called.\n *\n * @param instance The context object\n * @param method The name of the method on the context object to bind to itself\n * @param suppliedArgs An optional array of values to prepend to the `instance[method]` arguments list\n * @return The bound function\n */\nexport function lateBind(instance, method, ...suppliedArgs) {\n return suppliedArgs.length\n ? function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n // TS7017\n return instance[method].apply(instance, args);\n }\n : function () {\n // TS7017\n return instance[method].apply(instance, arguments);\n };\n}\nexport function mixin(target, ...sources) {\n return _mixin({\n deep: false,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Returns a function which invokes the given function with the given arguments prepended to its argument list.\n * Like `Function.prototype.bind`, but does not alter execution context.\n *\n * @param targetFunction The function that needs to be bound\n * @param suppliedArgs An optional array of arguments to prepend to the `targetFunction` arguments list\n * @return The bound function\n */\nexport function partial(targetFunction, ...suppliedArgs) {\n return function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n return targetFunction.apply(this, args);\n };\n}\n/**\n * Returns an object with a destroy method that, when called, calls the passed-in destructor.\n * This is intended to provide a unified interface for creating \"remove\" / \"destroy\" handlers for\n * event listeners, timers, etc.\n *\n * @param destructor A function that will be called when the handle's `destroy` method is invoked\n * @return The handle object\n */\nexport function createHandle(destructor) {\n let called = false;\n return {\n destroy: function () {\n if (!called) {\n called = true;\n destructor();\n }\n }\n };\n}\n/**\n * Returns a single handle that can be used to destroy multiple handles simultaneously.\n *\n * @param handles An array of handles with `destroy` methods\n * @return The handle object\n */\nexport function createCompositeHandle(...handles) {\n return createHandle(function () {\n for (let i = 0; i < handles.length; i++) {\n handles[i].destroy();\n }\n });\n}\n//# sourceMappingURL=lang.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/core/lang.mjs\n// module id = ./node_modules/@dojo/framework/core/lang.mjs\n// module chunks = menu","function isFeatureTestThenable(value) {\n return value && value.then;\n}\n/**\n * A cache of results of feature tests\n */\nexport const testCache = {};\n/**\n * A cache of the un-resolved feature tests\n */\nexport const testFunctions = {};\n/**\n * A cache of unresolved thenables (probably promises)\n * @type {{}}\n */\nconst testThenables = {};\n/**\n * A reference to the global scope (`window` in a browser, `global` in NodeJS)\n */\nconst globalScope = (function () {\n /* istanbul ignore else */\n if (typeof window !== 'undefined') {\n // Browsers\n return window;\n }\n else if (typeof global !== 'undefined') {\n // Node\n return global;\n }\n else if (typeof self !== 'undefined') {\n // Web workers\n return self;\n }\n /* istanbul ignore next */\n return {};\n})();\n/* Grab the staticFeatures if there are available */\nconst { staticFeatures } = globalScope.DojoHasEnvironment || {};\n/* Cleaning up the DojoHasEnviornment */\nif ('DojoHasEnvironment' in globalScope) {\n delete globalScope.DojoHasEnvironment;\n}\n/**\n * Custom type guard to narrow the `staticFeatures` to either a map or a function that\n * returns a map.\n *\n * @param value The value to guard for\n */\nfunction isStaticFeatureFunction(value) {\n return typeof value === 'function';\n}\n/**\n * The cache of asserted features that were available in the global scope when the\n * module loaded\n */\nconst staticCache = staticFeatures\n ? isStaticFeatureFunction(staticFeatures) ? staticFeatures.apply(globalScope) : staticFeatures\n : {}; /* Providing an empty cache, if none was in the environment\n\n/**\n* AMD plugin function.\n*\n* Conditional loads modules based on a has feature test value.\n*\n* @param resourceId Gives the resolved module id to load.\n* @param require The loader require function with respect to the module that contained the plugin resource in its\n* dependency list.\n* @param load Callback to loader that consumes result of plugin demand.\n*/\nexport function load(resourceId, require, load, config) {\n resourceId ? require([resourceId], load) : load();\n}\n/**\n * AMD plugin function.\n *\n * Resolves resourceId into a module id based on possibly-nested tenary expression that branches on has feature test\n * value(s).\n *\n * @param resourceId The id of the module\n * @param normalize Resolves a relative module id into an absolute module id\n */\nexport function normalize(resourceId, normalize) {\n const tokens = resourceId.match(/[\\?:]|[^:\\?]*/g) || [];\n let i = 0;\n function get(skip) {\n const term = tokens[i++];\n if (term === ':') {\n // empty string module name, resolves to null\n return null;\n }\n else {\n // postfixed with a ? means it is a feature to branch on, the term is the name of the feature\n if (tokens[i++] === '?') {\n if (!skip && has(term)) {\n // matched the feature, get the first value from the options\n return get();\n }\n else {\n // did not match, get the second value, passing over the first\n get(true);\n return get(skip);\n }\n }\n // a module\n return term;\n }\n }\n const id = get();\n return id && normalize(id);\n}\n/**\n * Check if a feature has already been registered\n *\n * @param feature the name of the feature\n */\nexport function exists(feature) {\n const normalizedFeature = feature.toLowerCase();\n return Boolean(normalizedFeature in staticCache || normalizedFeature in testCache || testFunctions[normalizedFeature]);\n}\n/**\n * Register a new test for a named feature.\n *\n * @example\n * has.add('dom-addeventlistener', !!document.addEventListener);\n *\n * @example\n * has.add('touch-events', function () {\n * return 'ontouchstart' in document\n * });\n *\n * @param feature the name of the feature\n * @param value the value reported of the feature, or a function that will be executed once on first test\n * @param overwrite if an existing value should be overwritten. Defaults to false.\n */\nexport function add(feature, value, overwrite = false) {\n const normalizedFeature = feature.toLowerCase();\n if (exists(normalizedFeature) && !overwrite && !(normalizedFeature in staticCache)) {\n throw new TypeError(`Feature \"${feature}\" exists and overwrite not true.`);\n }\n if (typeof value === 'function') {\n testFunctions[normalizedFeature] = value;\n }\n else if (isFeatureTestThenable(value)) {\n testThenables[feature] = value.then((resolvedValue) => {\n testCache[feature] = resolvedValue;\n delete testThenables[feature];\n }, () => {\n delete testThenables[feature];\n });\n }\n else {\n testCache[normalizedFeature] = value;\n delete testFunctions[normalizedFeature];\n }\n}\n/**\n * Return the current value of a named feature.\n *\n * @param feature The name (if a string) or identifier (if an integer) of the feature to test.\n */\nexport default function has(feature) {\n let result;\n const normalizedFeature = feature.toLowerCase();\n if (normalizedFeature in staticCache) {\n result = staticCache[normalizedFeature];\n }\n else if (testFunctions[normalizedFeature]) {\n result = testCache[normalizedFeature] = testFunctions[normalizedFeature].call(null);\n delete testFunctions[normalizedFeature];\n }\n else if (normalizedFeature in testCache) {\n result = testCache[normalizedFeature];\n }\n else if (feature in testThenables) {\n return false;\n }\n else {\n throw new TypeError(`Attempt to detect unregistered has feature \"${feature}\"`);\n }\n return result;\n}\n/*\n * Out of the box feature tests\n */\n/* Environments */\n/* Used as a value to provide a debug only code path */\nadd('debug', true);\n/* Detects if the environment is \"browser like\" */\nadd('host-browser', typeof document !== 'undefined' && typeof location !== 'undefined');\n/* Detects if the environment appears to be NodeJS */\nadd('host-node', function () {\n if (typeof process === 'object' && process.versions && process.versions.node) {\n return process.versions.node;\n }\n});\n//# sourceMappingURL=has.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/has/has.mjs\n// module id = ./node_modules/@dojo/framework/has/has.mjs\n// module chunks = menu","import { isArrayLike, ShimIterator } from './iterator';\nimport global from './global';\nimport { is as objectIs } from './object';\nimport has from './support/has';\nimport './Symbol';\nexport let Map = global.Map;\nif (!true) {\n Map = (_a = class Map {\n constructor(iterable) {\n this._keys = [];\n this._values = [];\n this[Symbol.toStringTag] = 'Map';\n if (iterable) {\n if (isArrayLike(iterable)) {\n for (let i = 0; i < iterable.length; i++) {\n const value = iterable[i];\n this.set(value[0], value[1]);\n }\n }\n else {\n for (const value of iterable) {\n this.set(value[0], value[1]);\n }\n }\n }\n }\n /**\n * An alternative to Array.prototype.indexOf using Object.is\n * to check for equality. See http://mzl.la/1zuKO2V\n */\n _indexOfKey(keys, key) {\n for (let i = 0, length = keys.length; i < length; i++) {\n if (objectIs(keys[i], key)) {\n return i;\n }\n }\n return -1;\n }\n get size() {\n return this._keys.length;\n }\n clear() {\n this._keys.length = this._values.length = 0;\n }\n delete(key) {\n const index = this._indexOfKey(this._keys, key);\n if (index < 0) {\n return false;\n }\n this._keys.splice(index, 1);\n this._values.splice(index, 1);\n return true;\n }\n entries() {\n const values = this._keys.map((key, i) => {\n return [key, this._values[i]];\n });\n return new ShimIterator(values);\n }\n forEach(callback, context) {\n const keys = this._keys;\n const values = this._values;\n for (let i = 0, length = keys.length; i < length; i++) {\n callback.call(context, values[i], keys[i], this);\n }\n }\n get(key) {\n const index = this._indexOfKey(this._keys, key);\n return index < 0 ? undefined : this._values[index];\n }\n has(key) {\n return this._indexOfKey(this._keys, key) > -1;\n }\n keys() {\n return new ShimIterator(this._keys);\n }\n set(key, value) {\n let index = this._indexOfKey(this._keys, key);\n index = index < 0 ? this._keys.length : index;\n this._keys[index] = key;\n this._values[index] = value;\n return this;\n }\n values() {\n return new ShimIterator(this._values);\n }\n [Symbol.iterator]() {\n return this.entries();\n }\n },\n _a[Symbol.species] = _a,\n _a);\n}\nexport default Map;\nvar _a;\n//# sourceMappingURL=Map.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/Map.mjs\n// module id = ./node_modules/@dojo/framework/shim/Map.mjs\n// module chunks = menu","import global from './global';\nimport { queueMicroTask } from './support/queue';\nimport './Symbol';\nimport has from './support/has';\nexport let ShimPromise = global.Promise;\nexport const isThenable = function isThenable(value) {\n return value && typeof value.then === 'function';\n};\nif (!true) {\n global.Promise = ShimPromise = (_a = class Promise {\n /**\n * Creates a new Promise.\n *\n * @constructor\n *\n * @param executor\n * The executor function is called immediately when the Promise is instantiated. It is responsible for\n * starting the asynchronous operation when it is invoked.\n *\n * The executor must call either the passed `resolve` function when the asynchronous operation has completed\n * successfully, or the `reject` function when the operation fails.\n */\n constructor(executor) {\n /**\n * The current state of this promise.\n */\n this.state = 1 /* Pending */;\n this[Symbol.toStringTag] = 'Promise';\n /**\n * If true, the resolution of this promise is chained (\"locked in\") to another promise.\n */\n let isChained = false;\n /**\n * Whether or not this promise is in a resolved state.\n */\n const isResolved = () => {\n return this.state !== 1 /* Pending */ || isChained;\n };\n /**\n * Callbacks that should be invoked once the asynchronous operation has completed.\n */\n let callbacks = [];\n /**\n * Initially pushes callbacks onto a queue for execution once this promise settles. After the promise settles,\n * enqueues callbacks for execution on the next event loop turn.\n */\n let whenFinished = function (callback) {\n if (callbacks) {\n callbacks.push(callback);\n }\n };\n /**\n * Settles this promise.\n *\n * @param newState The resolved state for this promise.\n * @param {T|any} value The resolved value for this promise.\n */\n const settle = (newState, value) => {\n // A promise can only be settled once.\n if (this.state !== 1 /* Pending */) {\n return;\n }\n this.state = newState;\n this.resolvedValue = value;\n whenFinished = queueMicroTask;\n // Only enqueue a callback runner if there are callbacks so that initially fulfilled Promises don't have to\n // wait an extra turn.\n if (callbacks && callbacks.length > 0) {\n queueMicroTask(function () {\n if (callbacks) {\n let count = callbacks.length;\n for (let i = 0; i < count; ++i) {\n callbacks[i].call(null);\n }\n callbacks = null;\n }\n });\n }\n };\n /**\n * Resolves this promise.\n *\n * @param newState The resolved state for this promise.\n * @param {T|any} value The resolved value for this promise.\n */\n const resolve = (newState, value) => {\n if (isResolved()) {\n return;\n }\n if (isThenable(value)) {\n value.then(settle.bind(null, 0 /* Fulfilled */), settle.bind(null, 2 /* Rejected */));\n isChained = true;\n }\n else {\n settle(newState, value);\n }\n };\n this.then = (onFulfilled, onRejected) => {\n return new Promise((resolve, reject) => {\n // whenFinished initially queues up callbacks for execution after the promise has settled. Once the\n // promise has settled, whenFinished will schedule callbacks for execution on the next turn through the\n // event loop.\n whenFinished(() => {\n const callback = this.state === 2 /* Rejected */ ? onRejected : onFulfilled;\n if (typeof callback === 'function') {\n try {\n resolve(callback(this.resolvedValue));\n }\n catch (error) {\n reject(error);\n }\n }\n else if (this.state === 2 /* Rejected */) {\n reject(this.resolvedValue);\n }\n else {\n resolve(this.resolvedValue);\n }\n });\n });\n };\n try {\n executor(resolve.bind(null, 0 /* Fulfilled */), resolve.bind(null, 2 /* Rejected */));\n }\n catch (error) {\n settle(2 /* Rejected */, error);\n }\n }\n static all(iterable) {\n return new this(function (resolve, reject) {\n const values = [];\n let complete = 0;\n let total = 0;\n let populating = true;\n function fulfill(index, value) {\n values[index] = value;\n ++complete;\n finish();\n }\n function finish() {\n if (populating || complete < total) {\n return;\n }\n resolve(values);\n }\n function processItem(index, item) {\n ++total;\n if (isThenable(item)) {\n // If an item Promise rejects, this Promise is immediately rejected with the item\n // Promise's rejection error.\n item.then(fulfill.bind(null, index), reject);\n }\n else {\n Promise.resolve(item).then(fulfill.bind(null, index));\n }\n }\n let i = 0;\n for (const value of iterable) {\n processItem(i, value);\n i++;\n }\n populating = false;\n finish();\n });\n }\n static race(iterable) {\n return new this(function (resolve, reject) {\n for (const item of iterable) {\n if (item instanceof Promise) {\n // If a Promise item rejects, this Promise is immediately rejected with the item\n // Promise's rejection error.\n item.then(resolve, reject);\n }\n else {\n Promise.resolve(item).then(resolve);\n }\n }\n });\n }\n static reject(reason) {\n return new this(function (resolve, reject) {\n reject(reason);\n });\n }\n static resolve(value) {\n return new this(function (resolve) {\n resolve(value);\n });\n }\n catch(onRejected) {\n return this.then(undefined, onRejected);\n }\n },\n _a[Symbol.species] = ShimPromise,\n _a);\n}\nexport default ShimPromise;\nvar _a;\n//# sourceMappingURL=Promise.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/Promise.mjs\n// module id = ./node_modules/@dojo/framework/shim/Promise.mjs\n// module chunks = menu","import has from './support/has';\nimport global from './global';\nimport { getValueDescriptor } from './support/util';\nexport let Symbol = global.Symbol;\nif (!true) {\n /**\n * Throws if the value is not a symbol, used internally within the Shim\n * @param {any} value The value to check\n * @return {symbol} Returns the symbol or throws\n */\n const validateSymbol = function validateSymbol(value) {\n if (!isSymbol(value)) {\n throw new TypeError(value + ' is not a symbol');\n }\n return value;\n };\n const defineProperties = Object.defineProperties;\n const defineProperty = Object.defineProperty;\n const create = Object.create;\n const objPrototype = Object.prototype;\n const globalSymbols = {};\n const getSymbolName = (function () {\n const created = create(null);\n return function (desc) {\n let postfix = 0;\n let name;\n while (created[String(desc) + (postfix || '')]) {\n ++postfix;\n }\n desc += String(postfix || '');\n created[desc] = true;\n name = '@@' + desc;\n // FIXME: Temporary guard until the duplicate execution when testing can be\n // pinned down.\n if (!Object.getOwnPropertyDescriptor(objPrototype, name)) {\n defineProperty(objPrototype, name, {\n set: function (value) {\n defineProperty(this, name, getValueDescriptor(value));\n }\n });\n }\n return name;\n };\n })();\n const InternalSymbol = function Symbol(description) {\n if (this instanceof InternalSymbol) {\n throw new TypeError('TypeError: Symbol is not a constructor');\n }\n return Symbol(description);\n };\n Symbol = global.Symbol = function Symbol(description) {\n if (this instanceof Symbol) {\n throw new TypeError('TypeError: Symbol is not a constructor');\n }\n const sym = Object.create(InternalSymbol.prototype);\n description = description === undefined ? '' : String(description);\n return defineProperties(sym, {\n __description__: getValueDescriptor(description),\n __name__: getValueDescriptor(getSymbolName(description))\n });\n };\n /* Decorate the Symbol function with the appropriate properties */\n defineProperty(Symbol, 'for', getValueDescriptor(function (key) {\n if (globalSymbols[key]) {\n return globalSymbols[key];\n }\n return (globalSymbols[key] = Symbol(String(key)));\n }));\n defineProperties(Symbol, {\n keyFor: getValueDescriptor(function (sym) {\n let key;\n validateSymbol(sym);\n for (key in globalSymbols) {\n if (globalSymbols[key] === sym) {\n return key;\n }\n }\n }),\n hasInstance: getValueDescriptor(Symbol.for('hasInstance'), false, false),\n isConcatSpreadable: getValueDescriptor(Symbol.for('isConcatSpreadable'), false, false),\n iterator: getValueDescriptor(Symbol.for('iterator'), false, false),\n match: getValueDescriptor(Symbol.for('match'), false, false),\n observable: getValueDescriptor(Symbol.for('observable'), false, false),\n replace: getValueDescriptor(Symbol.for('replace'), false, false),\n search: getValueDescriptor(Symbol.for('search'), false, false),\n species: getValueDescriptor(Symbol.for('species'), false, false),\n split: getValueDescriptor(Symbol.for('split'), false, false),\n toPrimitive: getValueDescriptor(Symbol.for('toPrimitive'), false, false),\n toStringTag: getValueDescriptor(Symbol.for('toStringTag'), false, false),\n unscopables: getValueDescriptor(Symbol.for('unscopables'), false, false)\n });\n /* Decorate the InternalSymbol object */\n defineProperties(InternalSymbol.prototype, {\n constructor: getValueDescriptor(Symbol),\n toString: getValueDescriptor(function () {\n return this.__name__;\n }, false, false)\n });\n /* Decorate the Symbol.prototype */\n defineProperties(Symbol.prototype, {\n toString: getValueDescriptor(function () {\n return 'Symbol (' + validateSymbol(this).__description__ + ')';\n }),\n valueOf: getValueDescriptor(function () {\n return validateSymbol(this);\n })\n });\n defineProperty(Symbol.prototype, Symbol.toPrimitive, getValueDescriptor(function () {\n return validateSymbol(this);\n }));\n defineProperty(Symbol.prototype, Symbol.toStringTag, getValueDescriptor('Symbol', false, false, true));\n defineProperty(InternalSymbol.prototype, Symbol.toPrimitive, getValueDescriptor(Symbol.prototype[Symbol.toPrimitive], false, false, true));\n defineProperty(InternalSymbol.prototype, Symbol.toStringTag, getValueDescriptor(Symbol.prototype[Symbol.toStringTag], false, false, true));\n}\n/**\n * A custom guard function that determines if an object is a symbol or not\n * @param {any} value The value to check to see if it is a symbol or not\n * @return {is symbol} Returns true if a symbol or not (and narrows the type guard)\n */\nexport function isSymbol(value) {\n return (value && (typeof value === 'symbol' || value['@@toStringTag'] === 'Symbol')) || false;\n}\n/**\n * Fill any missing well known symbols if the native Symbol is missing them\n */\n[\n 'hasInstance',\n 'isConcatSpreadable',\n 'iterator',\n 'species',\n 'replace',\n 'search',\n 'split',\n 'match',\n 'toPrimitive',\n 'toStringTag',\n 'unscopables',\n 'observable'\n].forEach((wellKnown) => {\n if (!Symbol[wellKnown]) {\n Object.defineProperty(Symbol, wellKnown, getValueDescriptor(Symbol.for(wellKnown), false, false));\n }\n});\nexport default Symbol;\n//# sourceMappingURL=Symbol.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/Symbol.mjs\n// module id = ./node_modules/@dojo/framework/shim/Symbol.mjs\n// module chunks = menu","import global from './global';\nimport { isArrayLike } from './iterator';\nimport has from './support/has';\nimport './Symbol';\nexport let WeakMap = global.WeakMap;\nif (!true) {\n const DELETED = {};\n const getUID = function getUID() {\n return Math.floor(Math.random() * 100000000);\n };\n const generateName = (function () {\n let startId = Math.floor(Date.now() % 100000000);\n return function generateName() {\n return '__wm' + getUID() + (startId++ + '__');\n };\n })();\n WeakMap = class WeakMap {\n constructor(iterable) {\n this[Symbol.toStringTag] = 'WeakMap';\n this._name = generateName();\n this._frozenEntries = [];\n if (iterable) {\n if (isArrayLike(iterable)) {\n for (let i = 0; i < iterable.length; i++) {\n const item = iterable[i];\n this.set(item[0], item[1]);\n }\n }\n else {\n for (const [key, value] of iterable) {\n this.set(key, value);\n }\n }\n }\n }\n _getFrozenEntryIndex(key) {\n for (let i = 0; i < this._frozenEntries.length; i++) {\n if (this._frozenEntries[i].key === key) {\n return i;\n }\n }\n return -1;\n }\n delete(key) {\n if (key === undefined || key === null) {\n return false;\n }\n const entry = key[this._name];\n if (entry && entry.key === key && entry.value !== DELETED) {\n entry.value = DELETED;\n return true;\n }\n const frozenIndex = this._getFrozenEntryIndex(key);\n if (frozenIndex >= 0) {\n this._frozenEntries.splice(frozenIndex, 1);\n return true;\n }\n return false;\n }\n get(key) {\n if (key === undefined || key === null) {\n return undefined;\n }\n const entry = key[this._name];\n if (entry && entry.key === key && entry.value !== DELETED) {\n return entry.value;\n }\n const frozenIndex = this._getFrozenEntryIndex(key);\n if (frozenIndex >= 0) {\n return this._frozenEntries[frozenIndex].value;\n }\n }\n has(key) {\n if (key === undefined || key === null) {\n return false;\n }\n const entry = key[this._name];\n if (Boolean(entry && entry.key === key && entry.value !== DELETED)) {\n return true;\n }\n const frozenIndex = this._getFrozenEntryIndex(key);\n if (frozenIndex >= 0) {\n return true;\n }\n return false;\n }\n set(key, value) {\n if (!key || (typeof key !== 'object' && typeof key !== 'function')) {\n throw new TypeError('Invalid value used as weak map key');\n }\n let entry = key[this._name];\n if (!entry || entry.key !== key) {\n entry = Object.create(null, {\n key: { value: key }\n });\n if (Object.isFrozen(key)) {\n this._frozenEntries.push(entry);\n }\n else {\n Object.defineProperty(key, this._name, {\n value: entry\n });\n }\n }\n entry.value = value;\n return this;\n }\n };\n}\nexport default WeakMap;\n//# sourceMappingURL=WeakMap.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/WeakMap.mjs\n// module id = ./node_modules/@dojo/framework/shim/WeakMap.mjs\n// module chunks = menu","import global from './global';\nimport { isArrayLike, isIterable } from './iterator';\nimport { MAX_SAFE_INTEGER } from './number';\nimport has from './support/has';\nimport { wrapNative } from './support/util';\nexport let from;\n/**\n * Creates a new array from the function parameters.\n *\n * @param arguments Any number of arguments for the array\n * @return An array from the given arguments\n */\nexport let of;\n/* ES6 Array instance methods */\n/**\n * Copies data internally within an array or array-like object.\n *\n * @param target The target array-like object\n * @param offset The index to start copying values to; if negative, it counts backwards from length\n * @param start The first (inclusive) index to copy; if negative, it counts backwards from length\n * @param end The last (exclusive) index to copy; if negative, it counts backwards from length\n * @return The target\n */\nexport let copyWithin;\n/**\n * Fills elements of an array-like object with the specified value.\n *\n * @param target The target to fill\n * @param value The value to fill each element of the target with\n * @param start The first index to fill\n * @param end The (exclusive) index at which to stop filling\n * @return The filled target\n */\nexport let fill;\n/**\n * Finds and returns the first instance matching the callback or undefined if one is not found.\n *\n * @param target An array-like object\n * @param callback A function returning if the current value matches a criteria\n * @param thisArg The execution context for the find function\n * @return The first element matching the callback, or undefined if one does not exist\n */\nexport let find;\n/**\n * Performs a linear search and returns the first index whose value satisfies the passed callback,\n * or -1 if no values satisfy it.\n *\n * @param target An array-like object\n * @param callback A function returning true if the current value satisfies its criteria\n * @param thisArg The execution context for the find function\n * @return The first index whose value satisfies the passed callback, or -1 if no values satisfy it\n */\nexport let findIndex;\n/* ES7 Array instance methods */\n/**\n * Determines whether an array includes a given value\n *\n * @param target the target array-like object\n * @param searchElement the item to search for\n * @param fromIndex the starting index to search from\n * @return `true` if the array includes the element, otherwise `false`\n */\nexport let includes;\nif (true && true) {\n from = global.Array.from;\n of = global.Array.of;\n copyWithin = wrapNative(global.Array.prototype.copyWithin);\n fill = wrapNative(global.Array.prototype.fill);\n find = wrapNative(global.Array.prototype.find);\n findIndex = wrapNative(global.Array.prototype.findIndex);\n}\nelse {\n // It is only older versions of Safari/iOS that have a bad fill implementation and so aren't in the wild\n // To make things easier, if there is a bad fill implementation, the whole set of functions will be filled\n /**\n * Ensures a non-negative, non-infinite, safe integer.\n *\n * @param length The number to validate\n * @return A proper length\n */\n const toLength = function toLength(length) {\n if (isNaN(length)) {\n return 0;\n }\n length = Number(length);\n if (isFinite(length)) {\n length = Math.floor(length);\n }\n // Ensure a non-negative, real, safe integer\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\n };\n /**\n * From ES6 7.1.4 ToInteger()\n *\n * @param value A value to convert\n * @return An integer\n */\n const toInteger = function toInteger(value) {\n value = Number(value);\n if (isNaN(value)) {\n return 0;\n }\n if (value === 0 || !isFinite(value)) {\n return value;\n }\n return (value > 0 ? 1 : -1) * Math.floor(Math.abs(value));\n };\n /**\n * Normalizes an offset against a given length, wrapping it if negative.\n *\n * @param value The original offset\n * @param length The total length to normalize against\n * @return If negative, provide a distance from the end (length); otherwise provide a distance from 0\n */\n const normalizeOffset = function normalizeOffset(value, length) {\n return value < 0 ? Math.max(length + value, 0) : Math.min(value, length);\n };\n from = function from(arrayLike, mapFunction, thisArg) {\n if (arrayLike == null) {\n throw new TypeError('from: requires an array-like object');\n }\n if (mapFunction && thisArg) {\n mapFunction = mapFunction.bind(thisArg);\n }\n /* tslint:disable-next-line:variable-name */\n const Constructor = this;\n const length = toLength(arrayLike.length);\n // Support extension\n const array = typeof Constructor === 'function' ? Object(new Constructor(length)) : new Array(length);\n if (!isArrayLike(arrayLike) && !isIterable(arrayLike)) {\n return array;\n }\n // if this is an array and the normalized length is 0, just return an empty array. this prevents a problem\n // with the iteration on IE when using a NaN array length.\n if (isArrayLike(arrayLike)) {\n if (length === 0) {\n return [];\n }\n for (let i = 0; i < arrayLike.length; i++) {\n array[i] = mapFunction ? mapFunction(arrayLike[i], i) : arrayLike[i];\n }\n }\n else {\n let i = 0;\n for (const value of arrayLike) {\n array[i] = mapFunction ? mapFunction(value, i) : value;\n i++;\n }\n }\n if (arrayLike.length !== undefined) {\n array.length = length;\n }\n return array;\n };\n of = function of(...items) {\n return Array.prototype.slice.call(items);\n };\n copyWithin = function copyWithin(target, offset, start, end) {\n if (target == null) {\n throw new TypeError('copyWithin: target must be an array-like object');\n }\n const length = toLength(target.length);\n offset = normalizeOffset(toInteger(offset), length);\n start = normalizeOffset(toInteger(start), length);\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\n let count = Math.min(end - start, length - offset);\n let direction = 1;\n if (offset > start && offset < start + count) {\n direction = -1;\n start += count - 1;\n offset += count - 1;\n }\n while (count > 0) {\n if (start in target) {\n target[offset] = target[start];\n }\n else {\n delete target[offset];\n }\n offset += direction;\n start += direction;\n count--;\n }\n return target;\n };\n fill = function fill(target, value, start, end) {\n const length = toLength(target.length);\n let i = normalizeOffset(toInteger(start), length);\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\n while (i < end) {\n target[i++] = value;\n }\n return target;\n };\n find = function find(target, callback, thisArg) {\n const index = findIndex(target, callback, thisArg);\n return index !== -1 ? target[index] : undefined;\n };\n findIndex = function findIndex(target, callback, thisArg) {\n const length = toLength(target.length);\n if (!callback) {\n throw new TypeError('find: second argument must be a function');\n }\n if (thisArg) {\n callback = callback.bind(thisArg);\n }\n for (let i = 0; i < length; i++) {\n if (callback(target[i], i, target)) {\n return i;\n }\n }\n return -1;\n };\n}\nif (true) {\n includes = wrapNative(global.Array.prototype.includes);\n}\nelse {\n /**\n * Ensures a non-negative, non-infinite, safe integer.\n *\n * @param length The number to validate\n * @return A proper length\n */\n const toLength = function toLength(length) {\n length = Number(length);\n if (isNaN(length)) {\n return 0;\n }\n if (isFinite(length)) {\n length = Math.floor(length);\n }\n // Ensure a non-negative, real, safe integer\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\n };\n includes = function includes(target, searchElement, fromIndex = 0) {\n let len = toLength(target.length);\n for (let i = fromIndex; i < len; ++i) {\n const currentElement = target[i];\n if (searchElement === currentElement ||\n (searchElement !== searchElement && currentElement !== currentElement)) {\n return true;\n }\n }\n return false;\n };\n}\n//# sourceMappingURL=array.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/array.mjs\n// module id = ./node_modules/@dojo/framework/shim/array.mjs\n// module chunks = menu","const globalObject = (function () {\n if (typeof global !== 'undefined') {\n // global spec defines a reference to the global object called 'global'\n // https://github.com/tc39/proposal-global\n // `global` is also defined in NodeJS\n return global;\n }\n else if (typeof window !== 'undefined') {\n // window is defined in browsers\n return window;\n }\n else if (typeof self !== 'undefined') {\n // self is defined in WebWorkers\n return self;\n }\n})();\nexport default globalObject;\n//# sourceMappingURL=global.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/global.mjs\n// module id = ./node_modules/@dojo/framework/shim/global.mjs\n// module chunks = menu","import global from './global';\n/**\n * The smallest interval between two representable numbers.\n */\nexport const EPSILON = 1;\n/**\n * The maximum safe integer in JavaScript\n */\nexport const MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n/**\n * The minimum safe integer in JavaScript\n */\nexport const MIN_SAFE_INTEGER = -MAX_SAFE_INTEGER;\n/**\n * Determines whether the passed value is NaN without coersion.\n *\n * @param value The value to test\n * @return true if the value is NaN, false if it is not\n */\nexport function isNaN(value) {\n return typeof value === 'number' && global.isNaN(value);\n}\n/**\n * Determines whether the passed value is a finite number without coersion.\n *\n * @param value The value to test\n * @return true if the value is finite, false if it is not\n */\nexport function isFinite(value) {\n return typeof value === 'number' && global.isFinite(value);\n}\n/**\n * Determines whether the passed value is an integer.\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isInteger(value) {\n return isFinite(value) && Math.floor(value) === value;\n}\n/**\n * Determines whether the passed value is an integer that is 'safe,' meaning:\n * 1. it can be expressed as an IEEE-754 double precision number\n * 2. it has a one-to-one mapping to a mathematical integer, meaning its\n * IEEE-754 representation cannot be the result of rounding any other\n * integer to fit the IEEE-754 representation\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isSafeInteger(value) {\n return isInteger(value) && Math.abs(value) <= MAX_SAFE_INTEGER;\n}\n//# sourceMappingURL=number.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/number.mjs\n// module id = ./node_modules/@dojo/framework/shim/number.mjs\n// module chunks = menu","import global from './global';\nimport has from './support/has';\nimport { isSymbol } from './Symbol';\nexport let assign;\n/**\n * Gets the own property descriptor of the specified object.\n * An own property descriptor is one that is defined directly on the object and is not\n * inherited from the object's prototype.\n * @param o Object that contains the property.\n * @param p Name of the property.\n */\nexport let getOwnPropertyDescriptor;\n/**\n * Returns the names of the own properties of an object. The own properties of an object are those that are defined directly\n * on that object, and are not inherited from the object's prototype. The properties of an object include both fields (objects) and functions.\n * @param o Object that contains the own properties.\n */\nexport let getOwnPropertyNames;\n/**\n * Returns an array of all symbol properties found directly on object o.\n * @param o Object to retrieve the symbols from.\n */\nexport let getOwnPropertySymbols;\n/**\n * Returns true if the values are the same value, false otherwise.\n * @param value1 The first value.\n * @param value2 The second value.\n */\nexport let is;\n/**\n * Returns the names of the enumerable properties and methods of an object.\n * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.\n */\nexport let keys;\n/* ES7 Object static methods */\nexport let getOwnPropertyDescriptors;\nexport let entries;\nexport let values;\nif (true) {\n const globalObject = global.Object;\n assign = globalObject.assign;\n getOwnPropertyDescriptor = globalObject.getOwnPropertyDescriptor;\n getOwnPropertyNames = globalObject.getOwnPropertyNames;\n getOwnPropertySymbols = globalObject.getOwnPropertySymbols;\n is = globalObject.is;\n keys = globalObject.keys;\n}\nelse {\n keys = function symbolAwareKeys(o) {\n return Object.keys(o).filter((key) => !Boolean(key.match(/^@@.+/)));\n };\n assign = function assign(target, ...sources) {\n if (target == null) {\n // TypeError if undefined or null\n throw new TypeError('Cannot convert undefined or null to object');\n }\n const to = Object(target);\n sources.forEach((nextSource) => {\n if (nextSource) {\n // Skip over if undefined or null\n keys(nextSource).forEach((nextKey) => {\n to[nextKey] = nextSource[nextKey];\n });\n }\n });\n return to;\n };\n getOwnPropertyDescriptor = function getOwnPropertyDescriptor(o, prop) {\n if (isSymbol(prop)) {\n return Object.getOwnPropertyDescriptor(o, prop);\n }\n else {\n return Object.getOwnPropertyDescriptor(o, prop);\n }\n };\n getOwnPropertyNames = function getOwnPropertyNames(o) {\n return Object.getOwnPropertyNames(o).filter((key) => !Boolean(key.match(/^@@.+/)));\n };\n getOwnPropertySymbols = function getOwnPropertySymbols(o) {\n return Object.getOwnPropertyNames(o)\n .filter((key) => Boolean(key.match(/^@@.+/)))\n .map((key) => Symbol.for(key.substring(2)));\n };\n is = function is(value1, value2) {\n if (value1 === value2) {\n return value1 !== 0 || 1 / value1 === 1 / value2; // -0\n }\n return value1 !== value1 && value2 !== value2; // NaN\n };\n}\nif (true) {\n const globalObject = global.Object;\n getOwnPropertyDescriptors = globalObject.getOwnPropertyDescriptors;\n entries = globalObject.entries;\n values = globalObject.values;\n}\nelse {\n getOwnPropertyDescriptors = function getOwnPropertyDescriptors(o) {\n return getOwnPropertyNames(o).reduce((previous, key) => {\n previous[key] = getOwnPropertyDescriptor(o, key);\n return previous;\n }, {});\n };\n entries = function entries(o) {\n return keys(o).map((key) => [key, o[key]]);\n };\n values = function values(o) {\n return keys(o).map((key) => o[key]);\n };\n}\n//# sourceMappingURL=object.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/object.mjs\n// module id = ./node_modules/@dojo/framework/shim/object.mjs\n// module chunks = menu","import global from './global';\nimport has from './support/has';\nimport { wrapNative } from './support/util';\n/**\n * The minimum location of high surrogates\n */\nexport const HIGH_SURROGATE_MIN = 0xd800;\n/**\n * The maximum location of high surrogates\n */\nexport const HIGH_SURROGATE_MAX = 0xdbff;\n/**\n * The minimum location of low surrogates\n */\nexport const LOW_SURROGATE_MIN = 0xdc00;\n/**\n * The maximum location of low surrogates\n */\nexport const LOW_SURROGATE_MAX = 0xdfff;\n/* ES6 static methods */\n/**\n * Return the String value whose elements are, in order, the elements in the List elements.\n * If length is 0, the empty string is returned.\n * @param codePoints The code points to generate the string\n */\nexport let fromCodePoint;\n/**\n * `raw` is intended for use as a tag function of a Tagged Template String. When called\n * as such the first argument will be a well formed template call site object and the rest\n * parameter will contain the substitution values.\n * @param template A well-formed template string call site representation.\n * @param substitutions A set of substitution values.\n */\nexport let raw;\n/* ES6 instance methods */\n/**\n * Returns a nonnegative integer Number less than 1114112 (0x110000) that is the code point\n * value of the UTF-16 encoded code point starting at the string element at position pos in\n * the String resulting from converting this object to a String.\n * If there is no element at that position, the result is undefined.\n * If a valid UTF-16 surrogate pair does not begin at pos, the result is the code unit at pos.\n */\nexport let codePointAt;\n/**\n * Returns true if the sequence of elements of searchString converted to a String is the\n * same as the corresponding elements of this object (converted to a String) starting at\n * endPosition – length(this). Otherwise returns false.\n */\nexport let endsWith;\n/**\n * Returns true if searchString appears as a substring of the result of converting this\n * object to a String, at one or more positions that are\n * greater than or equal to position; otherwise, returns false.\n * @param target The target string\n * @param searchString search string\n * @param position If position is undefined, 0 is assumed, so as to search all of the String.\n */\nexport let includes;\n/**\n * Returns the String value result of normalizing the string into the normalization form\n * named by form as specified in Unicode Standard Annex #15, Unicode Normalization Forms.\n * @param target The target string\n * @param form Applicable values: \"NFC\", \"NFD\", \"NFKC\", or \"NFKD\", If not specified default\n * is \"NFC\"\n */\nexport let normalize;\n/**\n * Returns a String value that is made from count copies appended together. If count is 0,\n * T is the empty String is returned.\n * @param count number of copies to append\n */\nexport let repeat;\n/**\n * Returns true if the sequence of elements of searchString converted to a String is the\n * same as the corresponding elements of this object (converted to a String) starting at\n * position. Otherwise returns false.\n */\nexport let startsWith;\n/* ES7 instance methods */\n/**\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\n * The padding is applied from the end (right) of the current string.\n *\n * @param target The target string\n * @param maxLength The length of the resulting string once the current string has been padded.\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\n *\n * @param fillString The string to pad the current string with.\n * If this string is too long, it will be truncated and the left-most part will be applied.\n * The default value for this parameter is \" \" (U+0020).\n */\nexport let padEnd;\n/**\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\n * The padding is applied from the start (left) of the current string.\n *\n * @param target The target string\n * @param maxLength The length of the resulting string once the current string has been padded.\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\n *\n * @param fillString The string to pad the current string with.\n * If this string is too long, it will be truncated and the left-most part will be applied.\n * The default value for this parameter is \" \" (U+0020).\n */\nexport let padStart;\nif (true && true) {\n fromCodePoint = global.String.fromCodePoint;\n raw = global.String.raw;\n codePointAt = wrapNative(global.String.prototype.codePointAt);\n endsWith = wrapNative(global.String.prototype.endsWith);\n includes = wrapNative(global.String.prototype.includes);\n normalize = wrapNative(global.String.prototype.normalize);\n repeat = wrapNative(global.String.prototype.repeat);\n startsWith = wrapNative(global.String.prototype.startsWith);\n}\nelse {\n /**\n * Validates that text is defined, and normalizes position (based on the given default if the input is NaN).\n * Used by startsWith, includes, and endsWith.\n *\n * @return Normalized position.\n */\n const normalizeSubstringArgs = function (name, text, search, position, isEnd = false) {\n if (text == null) {\n throw new TypeError('string.' + name + ' requires a valid string to search against.');\n }\n const length = text.length;\n position = position !== position ? (isEnd ? length : 0) : position;\n return [text, String(search), Math.min(Math.max(position, 0), length)];\n };\n fromCodePoint = function fromCodePoint(...codePoints) {\n // Adapted from https://github.com/mathiasbynens/String.fromCodePoint\n const length = arguments.length;\n if (!length) {\n return '';\n }\n const fromCharCode = String.fromCharCode;\n const MAX_SIZE = 0x4000;\n let codeUnits = [];\n let index = -1;\n let result = '';\n while (++index < length) {\n let codePoint = Number(arguments[index]);\n // Code points must be finite integers within the valid range\n let isValid = isFinite(codePoint) && Math.floor(codePoint) === codePoint && codePoint >= 0 && codePoint <= 0x10ffff;\n if (!isValid) {\n throw RangeError('string.fromCodePoint: Invalid code point ' + codePoint);\n }\n if (codePoint <= 0xffff) {\n // BMP code point\n codeUnits.push(codePoint);\n }\n else {\n // Astral code point; split in surrogate halves\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n codePoint -= 0x10000;\n let highSurrogate = (codePoint >> 10) + HIGH_SURROGATE_MIN;\n let lowSurrogate = codePoint % 0x400 + LOW_SURROGATE_MIN;\n codeUnits.push(highSurrogate, lowSurrogate);\n }\n if (index + 1 === length || codeUnits.length > MAX_SIZE) {\n result += fromCharCode.apply(null, codeUnits);\n codeUnits.length = 0;\n }\n }\n return result;\n };\n raw = function raw(callSite, ...substitutions) {\n let rawStrings = callSite.raw;\n let result = '';\n let numSubstitutions = substitutions.length;\n if (callSite == null || callSite.raw == null) {\n throw new TypeError('string.raw requires a valid callSite object with a raw value');\n }\n for (let i = 0, length = rawStrings.length; i < length; i++) {\n result += rawStrings[i] + (i < numSubstitutions && i < length - 1 ? substitutions[i] : '');\n }\n return result;\n };\n codePointAt = function codePointAt(text, position = 0) {\n // Adapted from https://github.com/mathiasbynens/String.prototype.codePointAt\n if (text == null) {\n throw new TypeError('string.codePointAt requries a valid string.');\n }\n const length = text.length;\n if (position !== position) {\n position = 0;\n }\n if (position < 0 || position >= length) {\n return undefined;\n }\n // Get the first code unit\n const first = text.charCodeAt(position);\n if (first >= HIGH_SURROGATE_MIN && first <= HIGH_SURROGATE_MAX && length > position + 1) {\n // Start of a surrogate pair (high surrogate and there is a next code unit); check for low surrogate\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n const second = text.charCodeAt(position + 1);\n if (second >= LOW_SURROGATE_MIN && second <= LOW_SURROGATE_MAX) {\n return (first - HIGH_SURROGATE_MIN) * 0x400 + second - LOW_SURROGATE_MIN + 0x10000;\n }\n }\n return first;\n };\n endsWith = function endsWith(text, search, endPosition) {\n if (endPosition == null) {\n endPosition = text.length;\n }\n [text, search, endPosition] = normalizeSubstringArgs('endsWith', text, search, endPosition, true);\n const start = endPosition - search.length;\n if (start < 0) {\n return false;\n }\n return text.slice(start, endPosition) === search;\n };\n includes = function includes(text, search, position = 0) {\n [text, search, position] = normalizeSubstringArgs('includes', text, search, position);\n return text.indexOf(search, position) !== -1;\n };\n repeat = function repeat(text, count = 0) {\n // Adapted from https://github.com/mathiasbynens/String.prototype.repeat\n if (text == null) {\n throw new TypeError('string.repeat requires a valid string.');\n }\n if (count !== count) {\n count = 0;\n }\n if (count < 0 || count === Infinity) {\n throw new RangeError('string.repeat requires a non-negative finite count.');\n }\n let result = '';\n while (count) {\n if (count % 2) {\n result += text;\n }\n if (count > 1) {\n text += text;\n }\n count >>= 1;\n }\n return result;\n };\n startsWith = function startsWith(text, search, position = 0) {\n search = String(search);\n [text, search, position] = normalizeSubstringArgs('startsWith', text, search, position);\n const end = position + search.length;\n if (end > text.length) {\n return false;\n }\n return text.slice(position, end) === search;\n };\n}\nif (true) {\n padEnd = wrapNative(global.String.prototype.padEnd);\n padStart = wrapNative(global.String.prototype.padStart);\n}\nelse {\n padEnd = function padEnd(text, maxLength, fillString = ' ') {\n if (text === null || text === undefined) {\n throw new TypeError('string.repeat requires a valid string.');\n }\n if (maxLength === Infinity) {\n throw new RangeError('string.padEnd requires a non-negative finite count.');\n }\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\n maxLength = 0;\n }\n let strText = String(text);\n const padding = maxLength - strText.length;\n if (padding > 0) {\n strText +=\n repeat(fillString, Math.floor(padding / fillString.length)) +\n fillString.slice(0, padding % fillString.length);\n }\n return strText;\n };\n padStart = function padStart(text, maxLength, fillString = ' ') {\n if (text === null || text === undefined) {\n throw new TypeError('string.repeat requires a valid string.');\n }\n if (maxLength === Infinity) {\n throw new RangeError('string.padStart requires a non-negative finite count.');\n }\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\n maxLength = 0;\n }\n let strText = String(text);\n const padding = maxLength - strText.length;\n if (padding > 0) {\n strText =\n repeat(fillString, Math.floor(padding / fillString.length)) +\n fillString.slice(0, padding % fillString.length) +\n strText;\n }\n return strText;\n };\n}\n//# sourceMappingURL=string.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/string.mjs\n// module id = ./node_modules/@dojo/framework/shim/string.mjs\n// module chunks = menu","import has, { add } from '../../has/has';\nimport global from '../global';\nexport default has;\nexport * from '../../has/has';\n/* ECMAScript 6 and 7 Features */\n/* Array */\nadd('es6-array', () => {\n return (['from', 'of'].every((key) => key in global.Array) &&\n ['findIndex', 'find', 'copyWithin'].every((key) => key in global.Array.prototype));\n}, true);\nadd('es6-array-fill', () => {\n if ('fill' in global.Array.prototype) {\n /* Some versions of Safari do not properly implement this */\n return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1;\n }\n return false;\n}, true);\nadd('es7-array', () => 'includes' in global.Array.prototype, true);\n/* Map */\nadd('es6-map', () => {\n if (typeof global.Map === 'function') {\n /*\n IE11 and older versions of Safari are missing critical ES6 Map functionality\n We wrap this in a try/catch because sometimes the Map constructor exists, but does not\n take arguments (iOS 8.4)\n */\n try {\n const map = new global.Map([[0, 1]]);\n return map.has(0) &&\n typeof map.keys === 'function' &&\n true &&\n typeof map.values === 'function' &&\n typeof map.entries === 'function';\n }\n catch (e) {\n /* istanbul ignore next: not testing on iOS at the moment */\n return false;\n }\n }\n return false;\n}, true);\n/* Math */\nadd('es6-math', () => {\n return [\n 'clz32',\n 'sign',\n 'log10',\n 'log2',\n 'log1p',\n 'expm1',\n 'cosh',\n 'sinh',\n 'tanh',\n 'acosh',\n 'asinh',\n 'atanh',\n 'trunc',\n 'fround',\n 'cbrt',\n 'hypot'\n ].every((name) => typeof global.Math[name] === 'function');\n}, true);\nadd('es6-math-imul', () => {\n if ('imul' in global.Math) {\n /* Some versions of Safari on ios do not properly implement this */\n return Math.imul(0xffffffff, 5) === -5;\n }\n return false;\n}, true);\n/* Object */\nadd('es6-object', () => {\n return true &&\n ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof global.Object[name] === 'function');\n}, true);\nadd('es2017-object', () => {\n return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof global.Object[name] === 'function');\n}, true);\n/* Observable */\nadd('es-observable', () => typeof global.Observable !== 'undefined', true);\n/* Promise */\nadd('es6-promise', () => typeof global.Promise !== 'undefined' && true, true);\n/* Set */\nadd('es6-set', () => {\n if (typeof global.Set === 'function') {\n /* IE11 and older versions of Safari are missing critical ES6 Set functionality */\n const set = new global.Set([1]);\n return set.has(1) && 'keys' in set && typeof set.keys === 'function' && true;\n }\n return false;\n}, true);\n/* String */\nadd('es6-string', () => {\n return ([\n /* static methods */\n 'fromCodePoint'\n ].every((key) => typeof global.String[key] === 'function') &&\n [\n /* instance methods */\n 'codePointAt',\n 'normalize',\n 'repeat',\n 'startsWith',\n 'endsWith',\n 'includes'\n ].every((key) => typeof global.String.prototype[key] === 'function'));\n}, true);\nadd('es6-string-raw', () => {\n function getCallSite(callSite, ...substitutions) {\n const result = [...callSite];\n result.raw = callSite.raw;\n return result;\n }\n if ('raw' in global.String) {\n let b = 1;\n let callSite = getCallSite `a\\n${b}`;\n callSite.raw = ['a\\\\n'];\n const supportsTrunc = global.String.raw(callSite, 42) === 'a:\\\\n';\n return supportsTrunc;\n }\n return false;\n}, true);\nadd('es2017-string', () => {\n return ['padStart', 'padEnd'].every((key) => typeof global.String.prototype[key] === 'function');\n}, true);\n/* Symbol */\nadd('es6-symbol', () => typeof global.Symbol !== 'undefined' && typeof Symbol() === 'symbol', true);\n/* WeakMap */\nadd('es6-weakmap', () => {\n if (typeof global.WeakMap !== 'undefined') {\n /* IE11 and older versions of Safari are missing critical ES6 Map functionality */\n const key1 = {};\n const key2 = {};\n const map = new global.WeakMap([[key1, 1]]);\n Object.freeze(key1);\n return map.get(key1) === 1 && map.set(key2, 2) === map && true;\n }\n return false;\n}, true);\n/* Miscellaneous features */\nadd('microtasks', () => true || false || true, true);\nadd('postmessage', () => {\n // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have\n // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist.\n return typeof global.window !== 'undefined' && typeof global.postMessage === 'function';\n}, true);\nadd('raf', () => typeof global.requestAnimationFrame === 'function', true);\nadd('setimmediate', () => typeof global.setImmediate !== 'undefined', true);\n/* DOM Features */\nadd('dom-mutationobserver', () => {\n if (true && Boolean(global.MutationObserver || global.WebKitMutationObserver)) {\n // IE11 has an unreliable MutationObserver implementation where setProperty() does not\n // generate a mutation event, observers can crash, and the queue does not drain\n // reliably. The following feature test was adapted from\n // https://gist.github.com/t10ko/4aceb8c71681fdb275e33efe5e576b14\n const example = document.createElement('div');\n /* tslint:disable-next-line:variable-name */\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\n const observer = new HostMutationObserver(function () { });\n observer.observe(example, { attributes: true });\n example.style.setProperty('display', 'block');\n return Boolean(observer.takeRecords().length);\n }\n return false;\n}, true);\nadd('dom-webanimation', () => true && global.Animation !== undefined && global.KeyframeEffect !== undefined, true);\n//# sourceMappingURL=has.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/support/has.mjs\n// module id = ./node_modules/@dojo/framework/shim/support/has.mjs\n// module chunks = menu","import global from '../global';\nimport has from './has';\nfunction executeTask(item) {\n if (item && item.isActive && item.callback) {\n item.callback();\n }\n}\nfunction getQueueHandle(item, destructor) {\n return {\n destroy: function () {\n this.destroy = function () { };\n item.isActive = false;\n item.callback = null;\n if (destructor) {\n destructor();\n }\n }\n };\n}\nlet checkMicroTaskQueue;\nlet microTasks;\n/**\n * Schedules a callback to the macrotask queue.\n *\n * @param callback the function to be queued and later executed.\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\n */\nexport const queueTask = (function () {\n let destructor;\n let enqueue;\n // Since the IE implementation of `setImmediate` is not flawless, we will test for `postMessage` first.\n if (true) {\n const queue = [];\n global.addEventListener('message', function (event) {\n // Confirm that the event was triggered by the current window and by this particular implementation.\n if (event.source === global && event.data === 'dojo-queue-message') {\n event.stopPropagation();\n if (queue.length) {\n executeTask(queue.shift());\n }\n }\n });\n enqueue = function (item) {\n queue.push(item);\n global.postMessage('dojo-queue-message', '*');\n };\n }\n else if (false) {\n destructor = global.clearImmediate;\n enqueue = function (item) {\n return setImmediate(executeTask.bind(null, item));\n };\n }\n else {\n destructor = global.clearTimeout;\n enqueue = function (item) {\n return setTimeout(executeTask.bind(null, item), 0);\n };\n }\n function queueTask(callback) {\n const item = {\n isActive: true,\n callback: callback\n };\n const id = enqueue(item);\n return getQueueHandle(item, destructor &&\n function () {\n destructor(id);\n });\n }\n // TODO: Use aspect.before when it is available.\n return true\n ? queueTask\n : function (callback) {\n checkMicroTaskQueue();\n return queueTask(callback);\n };\n})();\n// When no mechanism for registering microtasks is exposed by the environment, microtasks will\n// be queued and then executed in a single macrotask before the other macrotasks are executed.\nif (!true) {\n let isMicroTaskQueued = false;\n microTasks = [];\n checkMicroTaskQueue = function () {\n if (!isMicroTaskQueued) {\n isMicroTaskQueued = true;\n queueTask(function () {\n isMicroTaskQueued = false;\n if (microTasks.length) {\n let item;\n while ((item = microTasks.shift())) {\n executeTask(item);\n }\n }\n });\n }\n };\n}\n/**\n * Schedules an animation task with `window.requestAnimationFrame` if it exists, or with `queueTask` otherwise.\n *\n * Since requestAnimationFrame's behavior does not match that expected from `queueTask`, it is not used there.\n * However, at times it makes more sense to delegate to requestAnimationFrame; hence the following method.\n *\n * @param callback the function to be queued and later executed.\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\n */\nexport const queueAnimationTask = (function () {\n if (!true) {\n return queueTask;\n }\n function queueAnimationTask(callback) {\n const item = {\n isActive: true,\n callback: callback\n };\n const rafId = requestAnimationFrame(executeTask.bind(null, item));\n return getQueueHandle(item, function () {\n cancelAnimationFrame(rafId);\n });\n }\n // TODO: Use aspect.before when it is available.\n return true\n ? queueAnimationTask\n : function (callback) {\n checkMicroTaskQueue();\n return queueAnimationTask(callback);\n };\n})();\n/**\n * Schedules a callback to the microtask queue.\n *\n * Any callbacks registered with `queueMicroTask` will be executed before the next macrotask. If no native\n * mechanism for scheduling macrotasks is exposed, then any callbacks will be fired before any macrotask\n * registered with `queueTask` or `queueAnimationTask`.\n *\n * @param callback the function to be queued and later executed.\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\n */\nexport let queueMicroTask = (function () {\n let enqueue;\n if (false) {\n enqueue = function (item) {\n global.process.nextTick(executeTask.bind(null, item));\n };\n }\n else if (true) {\n enqueue = function (item) {\n global.Promise.resolve(item).then(executeTask);\n };\n }\n else if (true) {\n /* tslint:disable-next-line:variable-name */\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\n const node = document.createElement('div');\n const queue = [];\n const observer = new HostMutationObserver(function () {\n while (queue.length > 0) {\n const item = queue.shift();\n if (item && item.isActive && item.callback) {\n item.callback();\n }\n }\n });\n observer.observe(node, { attributes: true });\n enqueue = function (item) {\n queue.push(item);\n node.setAttribute('queueStatus', '1');\n };\n }\n else {\n enqueue = function (item) {\n checkMicroTaskQueue();\n microTasks.push(item);\n };\n }\n return function (callback) {\n const item = {\n isActive: true,\n callback: callback\n };\n enqueue(item);\n return getQueueHandle(item);\n };\n})();\n//# sourceMappingURL=queue.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/support/queue.mjs\n// module id = ./node_modules/@dojo/framework/shim/support/queue.mjs\n// module chunks = menu","/**\n * Helper function to generate a value property descriptor\n *\n * @param value The value the property descriptor should be set to\n * @param enumerable If the property should be enumberable, defaults to false\n * @param writable If the property should be writable, defaults to true\n * @param configurable If the property should be configurable, defaults to true\n * @return The property descriptor object\n */\nexport function getValueDescriptor(value, enumerable = false, writable = true, configurable = true) {\n return {\n value: value,\n enumerable: enumerable,\n writable: writable,\n configurable: configurable\n };\n}\nexport function wrapNative(nativeFunction) {\n return function (target, ...args) {\n return nativeFunction.apply(target, args);\n };\n}\n//# sourceMappingURL=util.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/support/util.mjs\n// module id = ./node_modules/@dojo/framework/shim/support/util.mjs\n// module chunks = menu","import { Evented } from '../core/Evented';\nexport class Injector extends Evented {\n constructor(payload) {\n super();\n this._payload = payload;\n }\n setInvalidator(invalidator) {\n this._invalidator = invalidator;\n }\n get() {\n return this._payload;\n }\n set(payload) {\n this._payload = payload;\n if (this._invalidator) {\n this._invalidator();\n }\n }\n}\nexport default Injector;\n//# sourceMappingURL=Injector.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/Injector.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/Injector.mjs\n// module chunks = menu","import { Evented } from '../core/Evented';\nimport Map from '../shim/Map';\n/**\n * Enum to identify the type of event.\n * Listening to 'Projector' will notify when projector is created or updated\n * Listening to 'Widget' will notify when widget root is created or updated\n */\nexport var NodeEventType;\n(function (NodeEventType) {\n NodeEventType[\"Projector\"] = \"Projector\";\n NodeEventType[\"Widget\"] = \"Widget\";\n})(NodeEventType || (NodeEventType = {}));\nexport class NodeHandler extends Evented {\n constructor() {\n super(...arguments);\n this._nodeMap = new Map();\n }\n get(key) {\n return this._nodeMap.get(key);\n }\n has(key) {\n return this._nodeMap.has(key);\n }\n add(element, key) {\n this._nodeMap.set(key, element);\n this.emit({ type: key });\n }\n addRoot() {\n this.emit({ type: NodeEventType.Widget });\n }\n addProjector() {\n this.emit({ type: NodeEventType.Projector });\n }\n clear() {\n this._nodeMap.clear();\n }\n}\nexport default NodeHandler;\n//# sourceMappingURL=NodeHandler.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/NodeHandler.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/NodeHandler.mjs\n// module chunks = menu","import Promise from '../shim/Promise';\nimport Map from '../shim/Map';\nimport Symbol from '../shim/Symbol';\nimport { Evented } from '../core/Evented';\n/**\n * Widget base symbol type\n */\nexport const WIDGET_BASE_TYPE = Symbol('Widget Base');\n/**\n * Checks is the item is a subclass of WidgetBase (or a WidgetBase)\n *\n * @param item the item to check\n * @returns true/false indicating if the item is a WidgetBaseConstructor\n */\nexport function isWidgetBaseConstructor(item) {\n return Boolean(item && item._type === WIDGET_BASE_TYPE);\n}\nexport function isWidgetConstructorDefaultExport(item) {\n return Boolean(item &&\n item.hasOwnProperty('__esModule') &&\n item.hasOwnProperty('default') &&\n isWidgetBaseConstructor(item.default));\n}\n/**\n * The Registry implementation\n */\nexport class Registry extends Evented {\n /**\n * Emit loaded event for registry label\n */\n emitLoadedEvent(widgetLabel, item) {\n this.emit({\n type: widgetLabel,\n action: 'loaded',\n item\n });\n }\n define(label, item) {\n if (this._widgetRegistry === undefined) {\n this._widgetRegistry = new Map();\n }\n if (this._widgetRegistry.has(label)) {\n throw new Error(`widget has already been registered for '${label.toString()}'`);\n }\n this._widgetRegistry.set(label, item);\n if (item instanceof Promise) {\n item.then((widgetCtor) => {\n this._widgetRegistry.set(label, widgetCtor);\n this.emitLoadedEvent(label, widgetCtor);\n return widgetCtor;\n }, (error) => {\n throw error;\n });\n }\n else if (isWidgetBaseConstructor(item)) {\n this.emitLoadedEvent(label, item);\n }\n }\n defineInjector(label, injectorFactory) {\n if (this._injectorRegistry === undefined) {\n this._injectorRegistry = new Map();\n }\n if (this._injectorRegistry.has(label)) {\n throw new Error(`injector has already been registered for '${label.toString()}'`);\n }\n const invalidator = new Evented();\n const injectorItem = {\n injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })),\n invalidator\n };\n this._injectorRegistry.set(label, injectorItem);\n this.emitLoadedEvent(label, injectorItem);\n }\n get(label) {\n if (!this._widgetRegistry || !this.has(label)) {\n return null;\n }\n const item = this._widgetRegistry.get(label);\n if (isWidgetBaseConstructor(item)) {\n return item;\n }\n if (item instanceof Promise) {\n return null;\n }\n const promise = item();\n this._widgetRegistry.set(label, promise);\n promise.then((widgetCtor) => {\n if (isWidgetConstructorDefaultExport(widgetCtor)) {\n widgetCtor = widgetCtor.default;\n }\n this._widgetRegistry.set(label, widgetCtor);\n this.emitLoadedEvent(label, widgetCtor);\n return widgetCtor;\n }, (error) => {\n throw error;\n });\n return null;\n }\n getInjector(label) {\n if (!this._injectorRegistry || !this.hasInjector(label)) {\n return null;\n }\n return this._injectorRegistry.get(label);\n }\n has(label) {\n return Boolean(this._widgetRegistry && this._widgetRegistry.has(label));\n }\n hasInjector(label) {\n return Boolean(this._injectorRegistry && this._injectorRegistry.has(label));\n }\n}\nexport default Registry;\n//# sourceMappingURL=Registry.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/Registry.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/Registry.mjs\n// module chunks = menu","import { Map } from '../shim/Map';\nimport { Evented } from '../core/Evented';\nimport { Registry } from './Registry';\nexport class RegistryHandler extends Evented {\n constructor() {\n super();\n this._registry = new Registry();\n this._registryWidgetLabelMap = new Map();\n this._registryInjectorLabelMap = new Map();\n this.own(this._registry);\n const destroy = () => {\n if (this.baseRegistry) {\n this._registryWidgetLabelMap.delete(this.baseRegistry);\n this._registryInjectorLabelMap.delete(this.baseRegistry);\n this.baseRegistry = undefined;\n }\n };\n this.own({ destroy });\n }\n set base(baseRegistry) {\n if (this.baseRegistry) {\n this._registryWidgetLabelMap.delete(this.baseRegistry);\n this._registryInjectorLabelMap.delete(this.baseRegistry);\n }\n this.baseRegistry = baseRegistry;\n }\n define(label, widget) {\n this._registry.define(label, widget);\n }\n defineInjector(label, injector) {\n this._registry.defineInjector(label, injector);\n }\n has(label) {\n return this._registry.has(label) || Boolean(this.baseRegistry && this.baseRegistry.has(label));\n }\n hasInjector(label) {\n return this._registry.hasInjector(label) || Boolean(this.baseRegistry && this.baseRegistry.hasInjector(label));\n }\n get(label, globalPrecedence = false) {\n return this._get(label, globalPrecedence, 'get', this._registryWidgetLabelMap);\n }\n getInjector(label, globalPrecedence = false) {\n return this._get(label, globalPrecedence, 'getInjector', this._registryInjectorLabelMap);\n }\n _get(label, globalPrecedence, getFunctionName, labelMap) {\n const registries = globalPrecedence ? [this.baseRegistry, this._registry] : [this._registry, this.baseRegistry];\n for (let i = 0; i < registries.length; i++) {\n const registry = registries[i];\n if (!registry) {\n continue;\n }\n const item = registry[getFunctionName](label);\n const registeredLabels = labelMap.get(registry) || [];\n if (item) {\n return item;\n }\n else if (registeredLabels.indexOf(label) === -1) {\n const handle = registry.on(label, (event) => {\n if (event.action === 'loaded' &&\n this[getFunctionName](label, globalPrecedence) === event.item) {\n this.emit({ type: 'invalidate' });\n }\n });\n this.own(handle);\n labelMap.set(registry, [...registeredLabels, label]);\n }\n }\n return null;\n }\n}\nexport default RegistryHandler;\n//# sourceMappingURL=RegistryHandler.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs\n// module chunks = menu","import Map from '../shim/Map';\nimport WeakMap from '../shim/WeakMap';\nimport Symbol from '../shim/Symbol';\nimport { v } from './d';\nimport { auto } from './diff';\nimport RegistryHandler from './RegistryHandler';\nimport NodeHandler from './NodeHandler';\nimport { widgetInstanceMap } from './vdom';\nimport { isWidgetBaseConstructor, WIDGET_BASE_TYPE } from './Registry';\nconst decoratorMap = new Map();\nconst boundAuto = auto.bind(null);\nexport const noBind = Symbol.for('dojoNoBind');\n/**\n * Main widget base for all widgets to extend\n */\nexport class WidgetBase {\n /**\n * @constructor\n */\n constructor() {\n /**\n * Indicates if it is the initial set properties cycle\n */\n this._initialProperties = true;\n /**\n * Array of property keys considered changed from the previous set properties\n */\n this._changedPropertyKeys = [];\n this._nodeHandler = new NodeHandler();\n this._handles = [];\n this._children = [];\n this._decoratorCache = new Map();\n this._properties = {};\n this._boundRenderFunc = this.render.bind(this);\n this._boundInvalidate = this.invalidate.bind(this);\n widgetInstanceMap.set(this, {\n dirty: true,\n onAttach: () => {\n this.onAttach();\n },\n onDetach: () => {\n this.onDetach();\n this.destroy();\n },\n nodeHandler: this._nodeHandler,\n registry: () => {\n return this.registry;\n },\n coreProperties: {},\n rendering: false,\n inputProperties: {}\n });\n this._runAfterConstructors();\n }\n meta(MetaType) {\n if (this._metaMap === undefined) {\n this._metaMap = new Map();\n }\n let cached = this._metaMap.get(MetaType);\n if (!cached) {\n cached = new MetaType({\n invalidate: this._boundInvalidate,\n nodeHandler: this._nodeHandler,\n bind: this\n });\n this.own(cached);\n this._metaMap.set(MetaType, cached);\n }\n return cached;\n }\n onAttach() {\n // Do nothing by default.\n }\n onDetach() {\n // Do nothing by default.\n }\n get properties() {\n return this._properties;\n }\n get changedPropertyKeys() {\n return [...this._changedPropertyKeys];\n }\n __setCoreProperties__(coreProperties) {\n const { baseRegistry } = coreProperties;\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.coreProperties.baseRegistry !== baseRegistry) {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n this._registry.base = baseRegistry;\n this.invalidate();\n }\n instanceData.coreProperties = coreProperties;\n }\n __setProperties__(originalProperties) {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.inputProperties = originalProperties;\n const properties = this._runBeforeProperties(originalProperties);\n const registeredDiffPropertyNames = this.getDecorator('registeredDiffProperty');\n const changedPropertyKeys = [];\n const propertyNames = Object.keys(properties);\n if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) {\n const allProperties = [...propertyNames, ...Object.keys(this._properties)];\n const checkedProperties = [];\n const diffPropertyResults = {};\n let runReactions = false;\n for (let i = 0; i < allProperties.length; i++) {\n const propertyName = allProperties[i];\n if (checkedProperties.indexOf(propertyName) !== -1) {\n continue;\n }\n checkedProperties.push(propertyName);\n const previousProperty = this._properties[propertyName];\n const newProperty = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n if (registeredDiffPropertyNames.indexOf(propertyName) !== -1) {\n runReactions = true;\n const diffFunctions = this.getDecorator(`diffProperty:${propertyName}`);\n for (let i = 0; i < diffFunctions.length; i++) {\n const result = diffFunctions[i](previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n else {\n const result = boundAuto(previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n if (runReactions) {\n const reactionFunctions = this.getDecorator('diffReaction');\n const executedReactions = [];\n reactionFunctions.forEach(({ reaction, propertyName }) => {\n const propertyChanged = changedPropertyKeys.indexOf(propertyName) !== -1;\n const reactionRun = executedReactions.indexOf(reaction) !== -1;\n if (propertyChanged && !reactionRun) {\n reaction.call(this, this._properties, diffPropertyResults);\n executedReactions.push(reaction);\n }\n });\n }\n this._properties = diffPropertyResults;\n this._changedPropertyKeys = changedPropertyKeys;\n }\n else {\n this._initialProperties = false;\n for (let i = 0; i < propertyNames.length; i++) {\n const propertyName = propertyNames[i];\n if (typeof properties[propertyName] === 'function') {\n properties[propertyName] = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n }\n else {\n changedPropertyKeys.push(propertyName);\n }\n }\n this._changedPropertyKeys = changedPropertyKeys;\n this._properties = Object.assign({}, properties);\n }\n if (this._changedPropertyKeys.length > 0) {\n this.invalidate();\n }\n }\n get children() {\n return this._children;\n }\n __setChildren__(children) {\n if (this._children.length > 0 || children.length > 0) {\n this._children = children;\n this.invalidate();\n }\n }\n __render__() {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.dirty = false;\n const render = this._runBeforeRenders();\n let dNode = render();\n dNode = this.runAfterRenders(dNode);\n this._nodeHandler.clear();\n return dNode;\n }\n invalidate() {\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.invalidate) {\n instanceData.invalidate();\n }\n }\n render() {\n return v('div', {}, this.children);\n }\n /**\n * Function to add decorators to WidgetBase\n *\n * @param decoratorKey The key of the decorator\n * @param value The value of the decorator\n */\n addDecorator(decoratorKey, value) {\n value = Array.isArray(value) ? value : [value];\n if (this.hasOwnProperty('constructor')) {\n let decoratorList = decoratorMap.get(this.constructor);\n if (!decoratorList) {\n decoratorList = new Map();\n decoratorMap.set(this.constructor, decoratorList);\n }\n let specificDecoratorList = decoratorList.get(decoratorKey);\n if (!specificDecoratorList) {\n specificDecoratorList = [];\n decoratorList.set(decoratorKey, specificDecoratorList);\n }\n specificDecoratorList.push(...value);\n }\n else {\n const decorators = this.getDecorator(decoratorKey);\n this._decoratorCache.set(decoratorKey, [...decorators, ...value]);\n }\n }\n /**\n * Function to build the list of decorators from the global decorator map.\n *\n * @param decoratorKey The key of the decorator\n * @return An array of decorator values\n * @private\n */\n _buildDecoratorList(decoratorKey) {\n const allDecorators = [];\n let constructor = this.constructor;\n while (constructor) {\n const instanceMap = decoratorMap.get(constructor);\n if (instanceMap) {\n const decorators = instanceMap.get(decoratorKey);\n if (decorators) {\n allDecorators.unshift(...decorators);\n }\n }\n constructor = Object.getPrototypeOf(constructor);\n }\n return allDecorators;\n }\n /**\n * Function to retrieve decorator values\n *\n * @param decoratorKey The key of the decorator\n * @returns An array of decorator values\n */\n getDecorator(decoratorKey) {\n let allDecorators = this._decoratorCache.get(decoratorKey);\n if (allDecorators !== undefined) {\n return allDecorators;\n }\n allDecorators = this._buildDecoratorList(decoratorKey);\n this._decoratorCache.set(decoratorKey, allDecorators);\n return allDecorators;\n }\n /**\n * Binds unbound property functions to the specified `bind` property\n *\n * @param properties properties to check for functions\n */\n _bindFunctionProperty(property, bind) {\n if (typeof property === 'function' && !property[noBind] && isWidgetBaseConstructor(property) === false) {\n if (this._bindFunctionPropertyMap === undefined) {\n this._bindFunctionPropertyMap = new WeakMap();\n }\n const bindInfo = this._bindFunctionPropertyMap.get(property) || {};\n let { boundFunc, scope } = bindInfo;\n if (boundFunc === undefined || scope !== bind) {\n boundFunc = property.bind(bind);\n this._bindFunctionPropertyMap.set(property, { boundFunc, scope: bind });\n }\n return boundFunc;\n }\n return property;\n }\n get registry() {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n return this._registry;\n }\n _runBeforeProperties(properties) {\n const beforeProperties = this.getDecorator('beforeProperties');\n if (beforeProperties.length > 0) {\n return beforeProperties.reduce((properties, beforePropertiesFunction) => {\n return Object.assign({}, properties, beforePropertiesFunction.call(this, properties));\n }, Object.assign({}, properties));\n }\n return properties;\n }\n /**\n * Run all registered before renders and return the updated render method\n */\n _runBeforeRenders() {\n const beforeRenders = this.getDecorator('beforeRender');\n if (beforeRenders.length > 0) {\n return beforeRenders.reduce((render, beforeRenderFunction) => {\n const updatedRender = beforeRenderFunction.call(this, render, this._properties, this._children);\n if (!updatedRender) {\n console.warn('Render function not returned from beforeRender, using previous render');\n return render;\n }\n return updatedRender;\n }, this._boundRenderFunc);\n }\n return this._boundRenderFunc;\n }\n /**\n * Run all registered after renders and return the decorated DNodes\n *\n * @param dNode The DNodes to run through the after renders\n */\n runAfterRenders(dNode) {\n const afterRenders = this.getDecorator('afterRender');\n if (afterRenders.length > 0) {\n dNode = afterRenders.reduce((dNode, afterRenderFunction) => {\n return afterRenderFunction.call(this, dNode);\n }, dNode);\n }\n if (this._metaMap !== undefined) {\n this._metaMap.forEach((meta) => {\n meta.afterRender();\n });\n }\n return dNode;\n }\n _runAfterConstructors() {\n const afterConstructors = this.getDecorator('afterConstructor');\n if (afterConstructors.length > 0) {\n afterConstructors.forEach((afterConstructor) => afterConstructor.call(this));\n }\n }\n own(handle) {\n this._handles.push(handle);\n }\n destroy() {\n while (this._handles.length > 0) {\n const handle = this._handles.pop();\n if (handle) {\n handle.destroy();\n }\n }\n }\n}\n/**\n * static identifier\n */\nWidgetBase._type = WIDGET_BASE_TYPE;\nexport default WidgetBase;\n//# sourceMappingURL=WidgetBase.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/WidgetBase.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/WidgetBase.mjs\n// module chunks = menu","let browserSpecificTransitionEndEventName = '';\nlet browserSpecificAnimationEndEventName = '';\nfunction determineBrowserStyleNames(element) {\n if ('WebkitTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'webkitTransitionEnd';\n browserSpecificAnimationEndEventName = 'webkitAnimationEnd';\n }\n else if ('transition' in element.style || 'MozTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'transitionend';\n browserSpecificAnimationEndEventName = 'animationend';\n }\n else {\n throw new Error('Your browser is not supported');\n }\n}\nfunction initialize(element) {\n if (browserSpecificAnimationEndEventName === '') {\n determineBrowserStyleNames(element);\n }\n}\nfunction runAndCleanUp(element, startAnimation, finishAnimation) {\n initialize(element);\n let finished = false;\n let transitionEnd = function () {\n if (!finished) {\n finished = true;\n element.removeEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n element.removeEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n finishAnimation();\n }\n };\n startAnimation();\n element.addEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n element.addEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n}\nfunction exit(node, properties, exitAnimation, removeNode) {\n const activeClass = properties.exitAnimationActive || `${exitAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(exitAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n removeNode();\n });\n}\nfunction enter(node, properties, enterAnimation) {\n const activeClass = properties.enterAnimationActive || `${enterAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(enterAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n node.classList.remove(enterAnimation);\n node.classList.remove(activeClass);\n });\n}\nexport default {\n enter,\n exit\n};\n//# sourceMappingURL=cssTransitions.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs\n// module chunks = menu","import Symbol from '../shim/Symbol';\n/**\n * The symbol identifier for a WNode type\n */\nexport const WNODE = Symbol('Identifier for a WNode.');\n/**\n * The symbol identifier for a VNode type\n */\nexport const VNODE = Symbol('Identifier for a VNode.');\n/**\n * The symbol identifier for a VNode type created using dom()\n */\nexport const DOMVNODE = Symbol('Identifier for a VNode created using existing dom.');\n/**\n * Helper function that returns true if the `DNode` is a `WNode` using the `type` property\n */\nexport function isWNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === WNODE);\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` using the `type` property\n */\nexport function isVNode(child) {\n return Boolean(child && typeof child !== 'string' && (child.type === VNODE || child.type === DOMVNODE));\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` created with `dom()` using the `type` property\n */\nexport function isDomVNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === DOMVNODE);\n}\nexport function isElementNode(value) {\n return !!value.tagName;\n}\nexport function decorate(dNodes, optionsOrModifier, predicate) {\n let shallow = false;\n let modifier;\n if (typeof optionsOrModifier === 'function') {\n modifier = optionsOrModifier;\n }\n else {\n modifier = optionsOrModifier.modifier;\n predicate = optionsOrModifier.predicate;\n shallow = optionsOrModifier.shallow || false;\n }\n let nodes = Array.isArray(dNodes) ? [...dNodes] : [dNodes];\n function breaker() {\n nodes = [];\n }\n while (nodes.length) {\n const node = nodes.shift();\n if (node) {\n if (!shallow && (isWNode(node) || isVNode(node)) && node.children) {\n nodes = [...nodes, ...node.children];\n }\n if (!predicate || predicate(node)) {\n modifier(node, breaker);\n }\n }\n }\n return dNodes;\n}\n/**\n * Wrapper function for calls to create a widget.\n */\nexport function w(widgetConstructor, properties, children = []) {\n return {\n children,\n widgetConstructor,\n properties,\n type: WNODE\n };\n}\nexport function v(tag, propertiesOrChildren = {}, children = undefined) {\n let properties = propertiesOrChildren;\n let deferredPropertiesCallback;\n if (Array.isArray(propertiesOrChildren)) {\n children = propertiesOrChildren;\n properties = {};\n }\n if (typeof properties === 'function') {\n deferredPropertiesCallback = properties;\n properties = {};\n }\n return {\n tag,\n deferredPropertiesCallback,\n children,\n properties,\n type: VNODE\n };\n}\n/**\n * Create a VNode for an existing DOM Node.\n */\nexport function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, children) {\n return {\n tag: isElementNode(node) ? node.tagName.toLowerCase() : '',\n properties: props,\n attributes: attrs,\n events: on,\n children,\n type: DOMVNODE,\n domNode: node,\n text: isElementNode(node) ? undefined : node.data,\n diffType\n };\n}\n//# sourceMappingURL=d.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/d.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/d.mjs\n// module chunks = menu","import { handleDecorator } from './handleDecorator';\nexport function afterRender(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('afterRender', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default afterRender;\n//# sourceMappingURL=afterRender.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs\n// module chunks = menu","import { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\nexport function alwaysRender() {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function () {\n this.invalidate();\n })(target);\n });\n}\nexport default alwaysRender;\n//# sourceMappingURL=alwaysRender.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs\n// module chunks = menu","import { handleDecorator } from './handleDecorator';\nexport function beforeProperties(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('beforeProperties', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default beforeProperties;\n//# sourceMappingURL=beforeProperties.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs\n// module chunks = menu","import { CustomElementChildType } from '../registerCustomElement';\nimport Registry from '../Registry';\n/**\n * This Decorator is provided properties that define the behavior of a custom element, and\n * registers that custom element.\n */\nexport function customElement({ tag, properties = [], attributes = [], events = [], childType = CustomElementChildType.DOJO, registryFactory = () => new Registry() }) {\n return function (target) {\n target.prototype.__customElementDescriptor = {\n tagName: tag,\n attributes,\n properties,\n events,\n childType,\n registryFactory\n };\n };\n}\nexport default customElement;\n//# sourceMappingURL=customElement.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs\n// module chunks = menu","import { handleDecorator } from './handleDecorator';\nimport { auto } from './../diff';\n/**\n * Decorator that can be used to register a function as a specific property diff\n *\n * @param propertyName The name of the property of which the diff function is applied\n * @param diffType The diff type, default is DiffType.AUTO.\n * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM\n */\nexport function diffProperty(propertyName, diffFunction = auto, reactionFunction) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null));\n target.addDecorator('registeredDiffProperty', propertyName);\n if (reactionFunction || propertyKey) {\n target.addDecorator('diffReaction', {\n propertyName,\n reaction: propertyKey ? target[propertyKey] : reactionFunction\n });\n }\n });\n}\nexport default diffProperty;\n//# sourceMappingURL=diffProperty.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs\n// module chunks = menu","/**\n * Generic decorator handler to take care of whether or not the decorator was called at the class level\n * or the method level.\n *\n * @param handler\n */\nexport function handleDecorator(handler) {\n return function (target, propertyKey, descriptor) {\n if (typeof target === 'function') {\n handler(target.prototype, undefined);\n }\n else {\n handler(target, propertyKey);\n }\n };\n}\nexport default handleDecorator;\n//# sourceMappingURL=handleDecorator.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs\n// module chunks = menu","import WeakMap from '../../shim/WeakMap';\nimport { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\n/**\n * Map of instances against registered injectors.\n */\nconst registeredInjectorsMap = new WeakMap();\n/**\n * Decorator retrieves an injector from an available registry using the name and\n * calls the `getProperties` function with the payload from the injector\n * and current properties with the the injected properties returned.\n *\n * @param InjectConfig the inject configuration\n */\nexport function inject({ name, getProperties }) {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function (properties) {\n const injectorItem = this.registry.getInjector(name);\n if (injectorItem) {\n const { injector, invalidator } = injectorItem;\n const registeredInjectors = registeredInjectorsMap.get(this) || [];\n if (registeredInjectors.length === 0) {\n registeredInjectorsMap.set(this, registeredInjectors);\n }\n if (registeredInjectors.indexOf(injectorItem) === -1) {\n this.own(invalidator.on('invalidate', () => {\n this.invalidate();\n }));\n registeredInjectors.push(injectorItem);\n }\n return getProperties(injector(), properties);\n }\n })(target);\n });\n}\nexport default inject;\n//# sourceMappingURL=inject.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/inject.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/inject.mjs\n// module chunks = menu","import { WIDGET_BASE_TYPE } from './Registry';\nfunction isObjectOrArray(value) {\n return Object.prototype.toString.call(value) === '[object Object]' || Array.isArray(value);\n}\nexport function always(previousProperty, newProperty) {\n return {\n changed: true,\n value: newProperty\n };\n}\nexport function ignore(previousProperty, newProperty) {\n return {\n changed: false,\n value: newProperty\n };\n}\nexport function reference(previousProperty, newProperty) {\n return {\n changed: previousProperty !== newProperty,\n value: newProperty\n };\n}\nexport function shallow(previousProperty, newProperty) {\n let changed = false;\n const validOldProperty = previousProperty && isObjectOrArray(previousProperty);\n const validNewProperty = newProperty && isObjectOrArray(newProperty);\n if (!validOldProperty || !validNewProperty) {\n return {\n changed: true,\n value: newProperty\n };\n }\n const previousKeys = Object.keys(previousProperty);\n const newKeys = Object.keys(newProperty);\n if (previousKeys.length !== newKeys.length) {\n changed = true;\n }\n else {\n changed = newKeys.some((key) => {\n return newProperty[key] !== previousProperty[key];\n });\n }\n return {\n changed,\n value: newProperty\n };\n}\nexport function auto(previousProperty, newProperty) {\n let result;\n if (typeof newProperty === 'function') {\n if (newProperty._type === WIDGET_BASE_TYPE) {\n result = reference(previousProperty, newProperty);\n }\n else {\n result = ignore(previousProperty, newProperty);\n }\n }\n else if (isObjectOrArray(newProperty)) {\n result = shallow(previousProperty, newProperty);\n }\n else {\n result = reference(previousProperty, newProperty);\n }\n return result;\n}\n//# sourceMappingURL=diff.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/diff.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/diff.mjs\n// module chunks = menu","import * as tslib_1 from \"tslib\";\nimport { assign } from '../../core/lang';\nimport cssTransitions from '../animations/cssTransitions';\nimport { afterRender } from './../decorators/afterRender';\nimport { v } from './../d';\nimport { dom } from './../vdom';\n/**\n * Represents the attach state of the projector\n */\nexport var ProjectorAttachState;\n(function (ProjectorAttachState) {\n ProjectorAttachState[ProjectorAttachState[\"Attached\"] = 1] = \"Attached\";\n ProjectorAttachState[ProjectorAttachState[\"Detached\"] = 2] = \"Detached\";\n})(ProjectorAttachState || (ProjectorAttachState = {}));\n/**\n * Attach type for the projector\n */\nexport var AttachType;\n(function (AttachType) {\n AttachType[AttachType[\"Append\"] = 1] = \"Append\";\n AttachType[AttachType[\"Merge\"] = 2] = \"Merge\";\n})(AttachType || (AttachType = {}));\nexport function ProjectorMixin(Base) {\n class Projector extends Base {\n constructor(...args) {\n super(...args);\n this._root = document.body;\n this._async = true;\n this._projectorProperties = {};\n this._projectionOptions = {\n transitions: cssTransitions\n };\n this.root = document.body;\n this.projectorState = ProjectorAttachState.Detached;\n }\n append(root) {\n const options = {\n type: AttachType.Append,\n root\n };\n return this._attach(options);\n }\n merge(root) {\n const options = {\n type: AttachType.Merge,\n root\n };\n return this._attach(options);\n }\n set root(root) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change root element');\n }\n this._root = root;\n }\n get root() {\n return this._root;\n }\n get async() {\n return this._async;\n }\n set async(async) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change async mode');\n }\n this._async = async;\n }\n sandbox(doc = document) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot create sandbox');\n }\n this._async = false;\n const previousRoot = this.root;\n /* free up the document fragment for GC */\n this.own({\n destroy: () => {\n this._root = previousRoot;\n }\n });\n this._attach({\n /* DocumentFragment is not assignable to Element, but provides everything needed to work */\n root: doc.createDocumentFragment(),\n type: AttachType.Append\n });\n }\n setChildren(children) {\n this.__setChildren__(children);\n }\n setProperties(properties) {\n this.__setProperties__(properties);\n }\n __setProperties__(properties) {\n if (this._projectorProperties && this._projectorProperties.registry !== properties.registry) {\n if (this._projectorProperties.registry) {\n this._projectorProperties.registry.destroy();\n }\n }\n this._projectorProperties = assign({}, properties);\n super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry });\n super.__setProperties__(properties);\n }\n toHtml() {\n if (this.projectorState !== ProjectorAttachState.Attached || !this._projection) {\n throw new Error('Projector is not attached, cannot return an HTML string of projection.');\n }\n return this._projection.domNode.childNodes[0].outerHTML;\n }\n afterRender(result) {\n let node = result;\n if (typeof result === 'string' || result === null || result === undefined) {\n node = v('span', {}, [result]);\n }\n return node;\n }\n destroy() {\n super.destroy();\n }\n _attach({ type, root }) {\n if (root) {\n this.root = root;\n }\n if (this._attachHandle) {\n return this._attachHandle;\n }\n this.projectorState = ProjectorAttachState.Attached;\n const handle = {\n destroy: () => {\n if (this.projectorState === ProjectorAttachState.Attached) {\n this._projection = undefined;\n this.projectorState = ProjectorAttachState.Detached;\n }\n }\n };\n this.own(handle);\n this._attachHandle = handle;\n this._projectionOptions = Object.assign({}, this._projectionOptions, { sync: !this._async });\n switch (type) {\n case AttachType.Append:\n this._projection = dom.append(this.root, this, this._projectionOptions);\n break;\n case AttachType.Merge:\n this._projection = dom.merge(this.root, this, this._projectionOptions);\n break;\n }\n return this._attachHandle;\n }\n }\n tslib_1.__decorate([\n afterRender()\n ], Projector.prototype, \"afterRender\", null);\n return Projector;\n}\nexport default ProjectorMixin;\n//# sourceMappingURL=Projector.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs\n// module chunks = menu","import * as tslib_1 from \"tslib\";\nimport { Injector } from './../Injector';\nimport { inject } from './../decorators/inject';\nimport { handleDecorator } from './../decorators/handleDecorator';\nimport { diffProperty } from './../decorators/diffProperty';\nimport { shallow } from './../diff';\nconst THEME_KEY = ' _key';\nexport const INJECTED_THEME_KEY = Symbol('theme');\n/**\n * Decorator for base css classes\n */\nexport function theme(theme) {\n return handleDecorator((target) => {\n target.addDecorator('baseThemeClasses', theme);\n });\n}\n/**\n * Creates a reverse lookup for the classes passed in via the `theme` function.\n *\n * @param classes The baseClasses object\n * @requires\n */\nfunction createThemeClassesLookup(classes) {\n return classes.reduce((currentClassNames, baseClass) => {\n Object.keys(baseClass).forEach((key) => {\n currentClassNames[baseClass[key]] = key;\n });\n return currentClassNames;\n }, {});\n}\n/**\n * Convenience function that is given a theme and an optional registry, the theme\n * injector is defined against the registry, returning the theme.\n *\n * @param theme the theme to set\n * @param themeRegistry registry to define the theme injector against. Defaults\n * to the global registry\n *\n * @returns the theme injector used to set the theme\n */\nexport function registerThemeInjector(theme, themeRegistry) {\n const themeInjector = new Injector(theme);\n themeRegistry.defineInjector(INJECTED_THEME_KEY, (invalidator) => {\n themeInjector.setInvalidator(invalidator);\n return () => themeInjector.get();\n });\n return themeInjector;\n}\n/**\n * Function that returns a class decorated with with Themed functionality\n */\nexport function ThemedMixin(Base) {\n let Themed = class Themed extends Base {\n constructor() {\n super(...arguments);\n /**\n * Registered base theme keys\n */\n this._registeredBaseThemeKeys = [];\n /**\n * Indicates if classes meta data need to be calculated.\n */\n this._recalculateClasses = true;\n /**\n * Loaded theme\n */\n this._theme = {};\n }\n theme(classes) {\n if (this._recalculateClasses) {\n this._recalculateThemeClasses();\n }\n if (Array.isArray(classes)) {\n return classes.map((className) => this._getThemeClass(className));\n }\n return this._getThemeClass(classes);\n }\n /**\n * Function fired when `theme` or `extraClasses` are changed.\n */\n onPropertiesChanged() {\n this._recalculateClasses = true;\n }\n _getThemeClass(className) {\n if (className === undefined || className === null) {\n return className;\n }\n const extraClasses = this.properties.extraClasses || {};\n const themeClassName = this._baseThemeClassesReverseLookup[className];\n let resultClassNames = [];\n if (!themeClassName) {\n console.warn(`Class name: '${className}' not found in theme`);\n return null;\n }\n if (extraClasses[themeClassName]) {\n resultClassNames.push(extraClasses[themeClassName]);\n }\n if (this._theme[themeClassName]) {\n resultClassNames.push(this._theme[themeClassName]);\n }\n else {\n resultClassNames.push(this._registeredBaseTheme[themeClassName]);\n }\n return resultClassNames.join(' ');\n }\n _recalculateThemeClasses() {\n const { theme = {} } = this.properties;\n const baseThemes = this.getDecorator('baseThemeClasses');\n if (!this._registeredBaseTheme) {\n this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => {\n const _a = THEME_KEY, key = baseTheme[_a], classes = tslib_1.__rest(baseTheme, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n this._registeredBaseThemeKeys.push(key);\n return Object.assign({}, finalBaseTheme, classes);\n }, {});\n this._baseThemeClassesReverseLookup = createThemeClassesLookup(baseThemes);\n }\n this._theme = this._registeredBaseThemeKeys.reduce((baseTheme, themeKey) => {\n return Object.assign({}, baseTheme, theme[themeKey]);\n }, {});\n this._recalculateClasses = false;\n }\n };\n tslib_1.__decorate([\n diffProperty('theme', shallow),\n diffProperty('extraClasses', shallow)\n ], Themed.prototype, \"onPropertiesChanged\", null);\n Themed = tslib_1.__decorate([\n inject({\n name: INJECTED_THEME_KEY,\n getProperties: (theme, properties) => {\n if (!properties.theme) {\n return { theme };\n }\n return {};\n }\n })\n ], Themed);\n return Themed;\n}\nexport default ThemedMixin;\n//# sourceMappingURL=Themed.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs\n// module chunks = menu","import * as tslib_1 from \"tslib\";\nimport { WidgetBase, noBind } from './WidgetBase';\nimport { ProjectorMixin } from './mixins/Projector';\nimport { from } from '../shim/array';\nimport { w, dom } from './d';\nimport global from '../shim/global';\nimport { registerThemeInjector } from './mixins/Themed';\nimport { alwaysRender } from './decorators/alwaysRender';\nexport var CustomElementChildType;\n(function (CustomElementChildType) {\n CustomElementChildType[\"DOJO\"] = \"DOJO\";\n CustomElementChildType[\"NODE\"] = \"NODE\";\n CustomElementChildType[\"TEXT\"] = \"TEXT\";\n})(CustomElementChildType || (CustomElementChildType = {}));\nexport function DomToWidgetWrapper(domNode) {\n let DomToWidgetWrapper = class DomToWidgetWrapper extends WidgetBase {\n render() {\n const properties = Object.keys(this.properties).reduce((props, key) => {\n const value = this.properties[key];\n if (key.indexOf('on') === 0) {\n key = `__${key}`;\n }\n props[key] = value;\n return props;\n }, {});\n return dom({ node: domNode, props: properties, diffType: 'dom' });\n }\n static get domNode() {\n return domNode;\n }\n };\n DomToWidgetWrapper = tslib_1.__decorate([\n alwaysRender()\n ], DomToWidgetWrapper);\n return DomToWidgetWrapper;\n}\nexport function create(descriptor, WidgetConstructor) {\n const { attributes, childType, registryFactory } = descriptor;\n const attributeMap = {};\n attributes.forEach((propertyName) => {\n const attributeName = propertyName.toLowerCase();\n attributeMap[attributeName] = propertyName;\n });\n return class extends HTMLElement {\n constructor() {\n super(...arguments);\n this._properties = {};\n this._children = [];\n this._eventProperties = {};\n this._initialised = false;\n }\n connectedCallback() {\n if (this._initialised) {\n return;\n }\n const domProperties = {};\n const { attributes, properties, events } = descriptor;\n this._properties = Object.assign({}, this._properties, this._attributesToProperties(attributes));\n [...attributes, ...properties].forEach((propertyName) => {\n const value = this[propertyName];\n const filteredPropertyName = propertyName.replace(/^on/, '__');\n if (value !== undefined) {\n this._properties[propertyName] = value;\n }\n if (filteredPropertyName !== propertyName) {\n domProperties[filteredPropertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n }\n domProperties[propertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n });\n events.forEach((propertyName) => {\n const eventName = propertyName.replace(/^on/, '').toLowerCase();\n const filteredPropertyName = propertyName.replace(/^on/, '__on');\n domProperties[filteredPropertyName] = {\n get: () => this._getEventProperty(propertyName),\n set: (value) => this._setEventProperty(propertyName, value)\n };\n this._eventProperties[propertyName] = undefined;\n this._properties[propertyName] = (...args) => {\n const eventCallback = this._getEventProperty(propertyName);\n if (typeof eventCallback === 'function') {\n eventCallback(...args);\n }\n this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: false,\n detail: args\n }));\n };\n });\n Object.defineProperties(this, domProperties);\n const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children;\n from(children).forEach((childNode) => {\n if (childType === CustomElementChildType.DOJO) {\n childNode.addEventListener('dojo-ce-render', () => this._render());\n childNode.addEventListener('dojo-ce-connected', () => this._render());\n this._children.push(DomToWidgetWrapper(childNode));\n }\n else {\n this._children.push(dom({ node: childNode, diffType: 'dom' }));\n }\n });\n this.addEventListener('dojo-ce-connected', (e) => this._childConnected(e));\n const widgetProperties = this._properties;\n const renderChildren = () => this.__children__();\n const Wrapper = class extends WidgetBase {\n render() {\n return w(WidgetConstructor, widgetProperties, renderChildren());\n }\n };\n const registry = registryFactory();\n const themeContext = registerThemeInjector(this._getTheme(), registry);\n global.addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme()));\n const Projector = ProjectorMixin(Wrapper);\n this._projector = new Projector();\n this._projector.setProperties({ registry });\n this._projector.append(this);\n this._initialised = true;\n this.dispatchEvent(new CustomEvent('dojo-ce-connected', {\n bubbles: true,\n detail: this\n }));\n }\n _getTheme() {\n if (global && global.dojoce && global.dojoce.theme) {\n return global.dojoce.themes[global.dojoce.theme];\n }\n }\n _childConnected(e) {\n const node = e.detail;\n if (node.parentNode === this) {\n const exists = this._children.some((child) => child.domNode === node);\n if (!exists) {\n node.addEventListener('dojo-ce-render', () => this._render());\n this._children.push(DomToWidgetWrapper(node));\n this._render();\n }\n }\n }\n _render() {\n if (this._projector) {\n this._projector.invalidate();\n this.dispatchEvent(new CustomEvent('dojo-ce-render', {\n bubbles: false,\n detail: this\n }));\n }\n }\n __properties__() {\n return Object.assign({}, this._properties, this._eventProperties);\n }\n __children__() {\n if (childType === CustomElementChildType.DOJO) {\n return this._children.filter((Child) => Child.domNode.isWidget).map((Child) => {\n const { domNode } = Child;\n return w(Child, Object.assign({}, domNode.__properties__()), [...domNode.__children__()]);\n });\n }\n else {\n return this._children;\n }\n }\n attributeChangedCallback(name, oldValue, value) {\n const propertyName = attributeMap[name];\n this._setProperty(propertyName, value);\n }\n _setEventProperty(propertyName, value) {\n this._eventProperties[propertyName] = value;\n }\n _getEventProperty(propertyName) {\n return this._eventProperties[propertyName];\n }\n _setProperty(propertyName, value) {\n if (typeof value === 'function') {\n value[noBind] = true;\n }\n this._properties[propertyName] = value;\n this._render();\n }\n _getProperty(propertyName) {\n return this._properties[propertyName];\n }\n _attributesToProperties(attributes) {\n return attributes.reduce((properties, propertyName) => {\n const attributeName = propertyName.toLowerCase();\n const value = this.getAttribute(attributeName);\n if (value !== null) {\n properties[propertyName] = value;\n }\n return properties;\n }, {});\n }\n static get observedAttributes() {\n return Object.keys(attributeMap);\n }\n get isWidget() {\n return true;\n }\n };\n}\nexport function register(WidgetConstructor) {\n const descriptor = WidgetConstructor.prototype && WidgetConstructor.prototype.__customElementDescriptor;\n if (!descriptor) {\n throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?');\n }\n global.customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor));\n}\nexport default register;\n//# sourceMappingURL=registerCustomElement.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs\n// module chunks = menu","import global from '../shim/global';\nimport { from as arrayFrom } from '../shim/array';\nimport { isWNode, isVNode, isDomVNode, VNODE, WNODE } from './d';\nimport { isWidgetBaseConstructor } from './Registry';\nimport WeakMap from '../shim/WeakMap';\nconst NAMESPACE_W3 = 'http://www.w3.org/';\nconst NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg';\nconst NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink';\nconst emptyArray = [];\nconst nodeOperations = ['focus', 'blur', 'scrollIntoView', 'click'];\nexport const widgetInstanceMap = new WeakMap();\nconst instanceMap = new WeakMap();\nconst nextSiblingMap = new WeakMap();\nconst projectorStateMap = new WeakMap();\nfunction same(dnode1, dnode2) {\n if (isVNode(dnode1) && isVNode(dnode2)) {\n if (isDomVNode(dnode1) || isDomVNode(dnode2)) {\n if (dnode1.domNode !== dnode2.domNode) {\n return false;\n }\n }\n if (dnode1.tag !== dnode2.tag) {\n return false;\n }\n if (dnode1.properties.key !== dnode2.properties.key) {\n return false;\n }\n return true;\n }\n else if (isWNode(dnode1) && isWNode(dnode2)) {\n if (dnode1.instance === undefined && typeof dnode2.widgetConstructor === 'string') {\n return false;\n }\n if (dnode1.widgetConstructor !== dnode2.widgetConstructor) {\n return false;\n }\n if (dnode1.properties.key !== dnode2.properties.key) {\n return false;\n }\n return true;\n }\n return false;\n}\nconst missingTransition = function () {\n throw new Error('Provide a transitions object to the projectionOptions to do animations');\n};\nfunction getProjectionOptions(projectorOptions, projectorInstance) {\n const defaults = {\n namespace: undefined,\n styleApplyer: function (domNode, styleName, value) {\n domNode.style[styleName] = value;\n },\n transitions: {\n enter: missingTransition,\n exit: missingTransition\n },\n depth: 0,\n merge: false,\n sync: false,\n projectorInstance\n };\n return Object.assign({}, defaults, projectorOptions);\n}\nfunction checkStyleValue(styleValue) {\n if (typeof styleValue !== 'string') {\n throw new Error('Style values must be strings');\n }\n}\nfunction updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n const eventMap = projectorState.nodeMap.get(domNode) || new WeakMap();\n if (previousValue) {\n const previousEvent = eventMap.get(previousValue);\n domNode.removeEventListener(eventName, previousEvent);\n }\n let callback = currentValue.bind(bind);\n if (eventName === 'input') {\n callback = function (evt) {\n currentValue.call(this, evt);\n evt.target['oninput-value'] = evt.target.value;\n }.bind(bind);\n }\n domNode.addEventListener(eventName, callback);\n eventMap.set(currentValue, callback);\n projectorState.nodeMap.set(domNode, eventMap);\n}\nfunction addClasses(domNode, classes) {\n if (classes) {\n const classNames = classes.split(' ');\n for (let i = 0; i < classNames.length; i++) {\n domNode.classList.add(classNames[i]);\n }\n }\n}\nfunction removeClasses(domNode, classes) {\n if (classes) {\n const classNames = classes.split(' ');\n for (let i = 0; i < classNames.length; i++) {\n domNode.classList.remove(classNames[i]);\n }\n }\n}\nfunction buildPreviousProperties(domNode, previous, current) {\n const { diffType, properties, attributes } = current;\n if (!diffType || diffType === 'vdom') {\n return { properties: previous.properties, attributes: previous.attributes, events: previous.events };\n }\n else if (diffType === 'none') {\n return { properties: {}, attributes: previous.attributes ? {} : undefined, events: previous.events };\n }\n let newProperties = {\n properties: {}\n };\n if (attributes) {\n newProperties.attributes = {};\n newProperties.events = previous.events;\n Object.keys(properties).forEach((propName) => {\n newProperties.properties[propName] = domNode[propName];\n });\n Object.keys(attributes).forEach((attrName) => {\n newProperties.attributes[attrName] = domNode.getAttribute(attrName);\n });\n return newProperties;\n }\n newProperties.properties = Object.keys(properties).reduce((props, property) => {\n props[property] = domNode.getAttribute(property) || domNode[property];\n return props;\n }, {});\n return newProperties;\n}\nfunction nodeOperation(propName, propValue, previousValue, domNode, projectionOptions) {\n let result;\n if (typeof propValue === 'function') {\n result = propValue();\n }\n else {\n result = propValue && !previousValue;\n }\n if (result === true) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectorState.deferredRenderCallbacks.push(() => {\n domNode[propName]();\n });\n }\n}\nfunction removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions, onlyEvents = false) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n const eventMap = projectorState.nodeMap.get(domNode);\n if (eventMap) {\n Object.keys(previousProperties).forEach((propName) => {\n const isEvent = propName.substr(0, 2) === 'on' || onlyEvents;\n const eventName = onlyEvents ? propName : propName.substr(2);\n if (isEvent && !properties[propName]) {\n const eventCallback = eventMap.get(previousProperties[propName]);\n if (eventCallback) {\n domNode.removeEventListener(eventName, eventCallback);\n }\n }\n });\n }\n}\nfunction updateAttribute(domNode, attrName, attrValue, projectionOptions) {\n if (projectionOptions.namespace === NAMESPACE_SVG && attrName === 'href') {\n domNode.setAttributeNS(NAMESPACE_XLINK, attrName, attrValue);\n }\n else if ((attrName === 'role' && attrValue === '') || attrValue === undefined) {\n domNode.removeAttribute(attrName);\n }\n else {\n domNode.setAttribute(attrName, attrValue);\n }\n}\nfunction updateAttributes(domNode, previousAttributes, attributes, projectionOptions) {\n const attrNames = Object.keys(attributes);\n const attrCount = attrNames.length;\n for (let i = 0; i < attrCount; i++) {\n const attrName = attrNames[i];\n const attrValue = attributes[attrName];\n const previousAttrValue = previousAttributes[attrName];\n if (attrValue !== previousAttrValue) {\n updateAttribute(domNode, attrName, attrValue, projectionOptions);\n }\n }\n}\nfunction updateProperties(domNode, previousProperties, properties, projectionOptions, includesEventsAndAttributes = true) {\n let propertiesUpdated = false;\n const propNames = Object.keys(properties);\n const propCount = propNames.length;\n if (propNames.indexOf('classes') === -1 && previousProperties.classes) {\n if (Array.isArray(previousProperties.classes)) {\n for (let i = 0; i < previousProperties.classes.length; i++) {\n removeClasses(domNode, previousProperties.classes[i]);\n }\n }\n else {\n removeClasses(domNode, previousProperties.classes);\n }\n }\n includesEventsAndAttributes && removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions);\n for (let i = 0; i < propCount; i++) {\n const propName = propNames[i];\n let propValue = properties[propName];\n const previousValue = previousProperties[propName];\n if (propName === 'classes') {\n const previousClasses = Array.isArray(previousValue) ? previousValue : [previousValue];\n const currentClasses = Array.isArray(propValue) ? propValue : [propValue];\n if (previousClasses && previousClasses.length > 0) {\n if (!propValue || propValue.length === 0) {\n for (let i = 0; i < previousClasses.length; i++) {\n removeClasses(domNode, previousClasses[i]);\n }\n }\n else {\n const newClasses = [...currentClasses];\n for (let i = 0; i < previousClasses.length; i++) {\n const previousClassName = previousClasses[i];\n if (previousClassName) {\n const classIndex = newClasses.indexOf(previousClassName);\n if (classIndex === -1) {\n removeClasses(domNode, previousClassName);\n }\n else {\n newClasses.splice(classIndex, 1);\n }\n }\n }\n for (let i = 0; i < newClasses.length; i++) {\n addClasses(domNode, newClasses[i]);\n }\n }\n }\n else {\n for (let i = 0; i < currentClasses.length; i++) {\n addClasses(domNode, currentClasses[i]);\n }\n }\n }\n else if (nodeOperations.indexOf(propName) !== -1) {\n nodeOperation(propName, propValue, previousValue, domNode, projectionOptions);\n }\n else if (propName === 'styles') {\n const styleNames = Object.keys(propValue);\n const styleCount = styleNames.length;\n for (let j = 0; j < styleCount; j++) {\n const styleName = styleNames[j];\n const newStyleValue = propValue[styleName];\n const oldStyleValue = previousValue && previousValue[styleName];\n if (newStyleValue === oldStyleValue) {\n continue;\n }\n propertiesUpdated = true;\n if (newStyleValue) {\n checkStyleValue(newStyleValue);\n projectionOptions.styleApplyer(domNode, styleName, newStyleValue);\n }\n else {\n projectionOptions.styleApplyer(domNode, styleName, '');\n }\n }\n }\n else {\n if (!propValue && typeof previousValue === 'string') {\n propValue = '';\n }\n if (propName === 'value') {\n const domValue = domNode[propName];\n if (domValue !== propValue &&\n (domNode['oninput-value']\n ? domValue === domNode['oninput-value']\n : propValue !== previousValue)) {\n domNode[propName] = propValue;\n domNode['oninput-value'] = undefined;\n }\n if (propValue !== previousValue) {\n propertiesUpdated = true;\n }\n }\n else if (propName !== 'key' && propValue !== previousValue) {\n const type = typeof propValue;\n if (type === 'function' && propName.lastIndexOf('on', 0) === 0 && includesEventsAndAttributes) {\n updateEvent(domNode, propName.substr(2), propValue, projectionOptions, properties.bind, previousValue);\n }\n else if (type === 'string' && propName !== 'innerHTML' && includesEventsAndAttributes) {\n updateAttribute(domNode, propName, propValue, projectionOptions);\n }\n else if (propName === 'scrollLeft' || propName === 'scrollTop') {\n if (domNode[propName] !== propValue) {\n domNode[propName] = propValue;\n }\n }\n else {\n domNode[propName] = propValue;\n }\n propertiesUpdated = true;\n }\n }\n }\n return propertiesUpdated;\n}\nfunction findIndexOfChild(children, sameAs, start) {\n for (let i = start; i < children.length; i++) {\n if (same(children[i], sameAs)) {\n return i;\n }\n }\n return -1;\n}\nexport function toParentVNode(domNode) {\n return {\n tag: '',\n properties: {},\n children: undefined,\n domNode,\n type: VNODE\n };\n}\nexport function toTextVNode(data) {\n return {\n tag: '',\n properties: {},\n children: undefined,\n text: `${data}`,\n domNode: undefined,\n type: VNODE\n };\n}\nfunction toInternalWNode(instance, instanceData) {\n return {\n instance,\n rendered: [],\n coreProperties: instanceData.coreProperties,\n children: instance.children,\n widgetConstructor: instance.constructor,\n properties: instanceData.inputProperties,\n type: WNODE\n };\n}\nexport function filterAndDecorateChildren(children, instance) {\n if (children === undefined) {\n return emptyArray;\n }\n children = Array.isArray(children) ? children : [children];\n for (let i = 0; i < children.length;) {\n const child = children[i];\n if (child === undefined || child === null) {\n children.splice(i, 1);\n continue;\n }\n else if (typeof child === 'string') {\n children[i] = toTextVNode(child);\n }\n else {\n if (isVNode(child)) {\n if (child.properties.bind === undefined) {\n child.properties.bind = instance;\n if (child.children && child.children.length > 0) {\n filterAndDecorateChildren(child.children, instance);\n }\n }\n }\n else {\n if (!child.coreProperties) {\n const instanceData = widgetInstanceMap.get(instance);\n child.coreProperties = {\n bind: instance,\n baseRegistry: instanceData.coreProperties.baseRegistry\n };\n }\n if (child.children && child.children.length > 0) {\n filterAndDecorateChildren(child.children, instance);\n }\n }\n }\n i++;\n }\n return children;\n}\nfunction nodeAdded(dnode, transitions) {\n if (isVNode(dnode) && dnode.properties) {\n const enterAnimation = dnode.properties.enterAnimation;\n if (enterAnimation) {\n if (typeof enterAnimation === 'function') {\n enterAnimation(dnode.domNode, dnode.properties);\n }\n else {\n transitions.enter(dnode.domNode, dnode.properties, enterAnimation);\n }\n }\n }\n}\nfunction nodeToRemove(dnode, transitions, projectionOptions) {\n if (isWNode(dnode)) {\n const item = instanceMap.get(dnode.instance);\n const rendered = (item ? item.dnode.rendered : dnode.rendered) || emptyArray;\n if (dnode.instance) {\n const instanceData = widgetInstanceMap.get(dnode.instance);\n instanceData.onDetach();\n instanceMap.delete(dnode.instance);\n }\n for (let i = 0; i < rendered.length; i++) {\n nodeToRemove(rendered[i], transitions, projectionOptions);\n }\n }\n else {\n const domNode = dnode.domNode;\n const properties = dnode.properties;\n if (dnode.children && dnode.children.length > 0) {\n for (let i = 0; i < dnode.children.length; i++) {\n nodeToRemove(dnode.children[i], transitions, projectionOptions);\n }\n }\n const exitAnimation = properties.exitAnimation;\n if (properties && exitAnimation) {\n domNode.style.pointerEvents = 'none';\n const removeDomNode = function () {\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\n dnode.domNode = undefined;\n };\n if (typeof exitAnimation === 'function') {\n exitAnimation(domNode, removeDomNode, properties);\n return;\n }\n else {\n transitions.exit(dnode.domNode, properties, exitAnimation, removeDomNode);\n return;\n }\n }\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\n dnode.domNode = undefined;\n }\n}\nfunction checkDistinguishable(childNodes, indexToCheck, parentInstance) {\n const childNode = childNodes[indexToCheck];\n if (isVNode(childNode) && !childNode.tag) {\n return; // Text nodes need not be distinguishable\n }\n const { key } = childNode.properties;\n if (key === undefined || key === null) {\n for (let i = 0; i < childNodes.length; i++) {\n if (i !== indexToCheck) {\n const node = childNodes[i];\n if (same(node, childNode)) {\n let nodeIdentifier;\n const parentName = parentInstance.constructor.name || 'unknown';\n if (isWNode(childNode)) {\n nodeIdentifier = childNode.widgetConstructor.name || 'unknown';\n }\n else {\n nodeIdentifier = childNode.tag;\n }\n console.warn(`A widget (${parentName}) has had a child addded or removed, but they were not able to uniquely identified. It is recommended to provide a unique 'key' property when using the same widget or element (${nodeIdentifier}) multiple times as siblings`);\n break;\n }\n }\n }\n }\n}\nfunction updateChildren(parentVNode, siblings, oldChildren, newChildren, parentInstance, projectionOptions) {\n oldChildren = oldChildren || emptyArray;\n newChildren = newChildren;\n const oldChildrenLength = oldChildren.length;\n const newChildrenLength = newChildren.length;\n const transitions = projectionOptions.transitions;\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\n let oldIndex = 0;\n let newIndex = 0;\n let i;\n let textUpdated = false;\n while (newIndex < newChildrenLength) {\n let oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : undefined;\n const newChild = newChildren[newIndex];\n if (isVNode(newChild) && typeof newChild.deferredPropertiesCallback === 'function') {\n newChild.inserted = isVNode(oldChild) && oldChild.inserted;\n addDeferredProperties(newChild, projectionOptions);\n }\n if (oldChild !== undefined && same(oldChild, newChild)) {\n oldIndex++;\n newIndex++;\n textUpdated =\n updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance, oldChildren.slice(oldIndex), newChildren.slice(newIndex)) || textUpdated;\n continue;\n }\n const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);\n const addChild = () => {\n let insertBeforeDomNode = undefined;\n let childrenArray = oldChildren;\n let nextIndex = oldIndex + 1;\n let child = oldChildren[oldIndex];\n if (!child) {\n child = siblings[0];\n nextIndex = 1;\n childrenArray = siblings;\n }\n if (child) {\n let insertBeforeChildren = [child];\n while (insertBeforeChildren.length) {\n const insertBefore = insertBeforeChildren.shift();\n if (isWNode(insertBefore)) {\n const item = instanceMap.get(insertBefore.instance);\n if (item && item.dnode.rendered) {\n insertBeforeChildren.push(...item.dnode.rendered);\n }\n }\n else {\n if (insertBefore.domNode) {\n if (insertBefore.domNode.parentElement !== parentVNode.domNode) {\n break;\n }\n insertBeforeDomNode = insertBefore.domNode;\n break;\n }\n }\n if (insertBeforeChildren.length === 0 && childrenArray[nextIndex]) {\n insertBeforeChildren.push(childrenArray[nextIndex]);\n nextIndex++;\n }\n }\n }\n createDom(newChild, parentVNode, newChildren.slice(newIndex + 1), insertBeforeDomNode, projectionOptions, parentInstance);\n nodeAdded(newChild, transitions);\n const indexToCheck = newIndex;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(newChildren, indexToCheck, parentInstance);\n });\n };\n if (!oldChild || findOldIndex === -1) {\n addChild();\n newIndex++;\n continue;\n }\n const removeChild = () => {\n const indexToCheck = oldIndex;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\n });\n if (isWNode(oldChild)) {\n const item = instanceMap.get(oldChild.instance);\n if (item) {\n oldChild = item.dnode;\n }\n }\n nodeToRemove(oldChild, transitions, projectionOptions);\n };\n const findNewIndex = findIndexOfChild(newChildren, oldChild, newIndex + 1);\n if (findNewIndex === -1) {\n removeChild();\n oldIndex++;\n continue;\n }\n addChild();\n removeChild();\n oldIndex++;\n newIndex++;\n }\n if (oldChildrenLength > oldIndex) {\n // Remove child fragments\n for (i = oldIndex; i < oldChildrenLength; i++) {\n const indexToCheck = i;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\n });\n let childToRemove = oldChildren[i];\n if (isWNode(childToRemove)) {\n const item = instanceMap.get(childToRemove.instance);\n if (item) {\n childToRemove = item.dnode;\n }\n }\n nodeToRemove(childToRemove, transitions, projectionOptions);\n }\n }\n return textUpdated;\n}\nfunction addChildren(parentVNode, children, projectionOptions, parentInstance, insertBefore = undefined, childNodes) {\n if (children === undefined) {\n return;\n }\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectorState.merge && childNodes === undefined) {\n childNodes = arrayFrom(parentVNode.domNode.childNodes);\n }\n const transitions = projectionOptions.transitions;\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n const nextSiblings = children.slice(i + 1);\n if (isVNode(child)) {\n if (projectorState.merge && childNodes) {\n let domElement = undefined;\n while (child.domNode === undefined && childNodes.length > 0) {\n domElement = childNodes.shift();\n if (domElement && domElement.tagName === (child.tag.toUpperCase() || undefined)) {\n child.domNode = domElement;\n }\n }\n }\n createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance);\n }\n else {\n createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes);\n }\n nodeAdded(child, transitions);\n }\n}\nfunction initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions) {\n addChildren(dnode, dnode.children, projectionOptions, parentInstance, undefined);\n if (typeof dnode.deferredPropertiesCallback === 'function' && dnode.inserted === undefined) {\n addDeferredProperties(dnode, projectionOptions);\n }\n if (dnode.attributes && dnode.events) {\n updateAttributes(domNode, {}, dnode.attributes, projectionOptions);\n updateProperties(domNode, {}, dnode.properties, projectionOptions, false);\n removeOrphanedEvents(domNode, {}, dnode.events, projectionOptions, true);\n const events = dnode.events;\n Object.keys(events).forEach((event) => {\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind);\n });\n }\n else {\n updateProperties(domNode, {}, dnode.properties, projectionOptions);\n }\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\n const instanceData = widgetInstanceMap.get(parentInstance);\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\n }\n dnode.inserted = true;\n}\nfunction createDom(dnode, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes) {\n let domNode;\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (isWNode(dnode)) {\n let { widgetConstructor } = dnode;\n const parentInstanceData = widgetInstanceMap.get(parentInstance);\n if (!isWidgetBaseConstructor(widgetConstructor)) {\n const item = parentInstanceData.registry().get(widgetConstructor);\n if (item === null) {\n return;\n }\n widgetConstructor = item;\n }\n const instance = new widgetConstructor();\n dnode.instance = instance;\n nextSiblingMap.set(instance, nextSiblings);\n const instanceData = widgetInstanceMap.get(instance);\n instanceData.invalidate = () => {\n instanceData.dirty = true;\n if (instanceData.rendering === false) {\n projectorState.renderQueue.push({ instance, depth: projectionOptions.depth });\n scheduleRender(projectionOptions);\n }\n };\n instanceData.rendering = true;\n instance.__setCoreProperties__(dnode.coreProperties);\n instance.__setChildren__(dnode.children);\n instance.__setProperties__(dnode.properties);\n const rendered = instance.__render__();\n instanceData.rendering = false;\n if (rendered) {\n const filteredRendered = filterAndDecorateChildren(rendered, instance);\n dnode.rendered = filteredRendered;\n addChildren(parentVNode, filteredRendered, projectionOptions, instance, insertBefore, childNodes);\n }\n instanceMap.set(instance, { dnode, parentVNode });\n instanceData.nodeHandler.addRoot();\n projectorState.afterRenderCallbacks.push(() => {\n instanceData.onAttach();\n });\n }\n else {\n if (projectorState.merge && projectorState.mergeElement !== undefined) {\n domNode = dnode.domNode = projectionOptions.mergeElement;\n projectorState.mergeElement = undefined;\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\n return;\n }\n const doc = parentVNode.domNode.ownerDocument;\n if (!dnode.tag && typeof dnode.text === 'string') {\n if (dnode.domNode !== undefined && parentVNode.domNode) {\n const newDomNode = dnode.domNode.ownerDocument.createTextNode(dnode.text);\n if (parentVNode.domNode === dnode.domNode.parentNode) {\n parentVNode.domNode.replaceChild(newDomNode, dnode.domNode);\n }\n else {\n parentVNode.domNode.appendChild(newDomNode);\n dnode.domNode.parentNode && dnode.domNode.parentNode.removeChild(dnode.domNode);\n }\n dnode.domNode = newDomNode;\n }\n else {\n domNode = dnode.domNode = doc.createTextNode(dnode.text);\n if (insertBefore !== undefined) {\n parentVNode.domNode.insertBefore(domNode, insertBefore);\n }\n else {\n parentVNode.domNode.appendChild(domNode);\n }\n }\n }\n else {\n if (dnode.domNode === undefined) {\n if (dnode.tag === 'svg') {\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\n }\n if (projectionOptions.namespace !== undefined) {\n domNode = dnode.domNode = doc.createElementNS(projectionOptions.namespace, dnode.tag);\n }\n else {\n domNode = dnode.domNode = dnode.domNode || doc.createElement(dnode.tag);\n }\n }\n else {\n domNode = dnode.domNode;\n }\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\n if (insertBefore !== undefined) {\n parentVNode.domNode.insertBefore(domNode, insertBefore);\n }\n else if (domNode.parentNode !== parentVNode.domNode) {\n parentVNode.domNode.appendChild(domNode);\n }\n }\n }\n}\nfunction updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance, oldNextSiblings, nextSiblings) {\n if (isWNode(dnode)) {\n const { instance } = previous;\n const { parentVNode, dnode: node } = instanceMap.get(instance);\n const previousRendered = node ? node.rendered : previous.rendered;\n const instanceData = widgetInstanceMap.get(instance);\n instanceData.rendering = true;\n instance.__setCoreProperties__(dnode.coreProperties);\n instance.__setChildren__(dnode.children);\n instance.__setProperties__(dnode.properties);\n nextSiblingMap.set(instance, nextSiblings);\n dnode.instance = instance;\n if (instanceData.dirty === true) {\n const rendered = instance.__render__();\n instanceData.rendering = false;\n dnode.rendered = filterAndDecorateChildren(rendered, instance);\n updateChildren(parentVNode, oldNextSiblings, previousRendered, dnode.rendered, instance, projectionOptions);\n }\n else {\n instanceData.rendering = false;\n dnode.rendered = previousRendered;\n }\n instanceMap.set(instance, { dnode, parentVNode });\n instanceData.nodeHandler.addRoot();\n }\n else {\n if (previous === dnode) {\n return false;\n }\n const domNode = (dnode.domNode = previous.domNode);\n let textUpdated = false;\n let updated = false;\n if (!dnode.tag && typeof dnode.text === 'string') {\n if (dnode.text !== previous.text) {\n const newDomNode = domNode.ownerDocument.createTextNode(dnode.text);\n domNode.parentNode.replaceChild(newDomNode, domNode);\n dnode.domNode = newDomNode;\n textUpdated = true;\n return textUpdated;\n }\n }\n else {\n if (dnode.tag && dnode.tag.lastIndexOf('svg', 0) === 0) {\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\n }\n if (previous.children !== dnode.children) {\n const children = filterAndDecorateChildren(dnode.children, parentInstance);\n dnode.children = children;\n updated =\n updateChildren(dnode, oldNextSiblings, previous.children, children, parentInstance, projectionOptions) || updated;\n }\n const previousProperties = buildPreviousProperties(domNode, previous, dnode);\n if (dnode.attributes && dnode.events) {\n updateAttributes(domNode, previousProperties.attributes, dnode.attributes, projectionOptions);\n updated =\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions, false) || updated;\n removeOrphanedEvents(domNode, previousProperties.events, dnode.events, projectionOptions, true);\n const events = dnode.events;\n Object.keys(events).forEach((event) => {\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind, previousProperties.events[event]);\n });\n }\n else {\n updated =\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions) ||\n updated;\n }\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\n const instanceData = widgetInstanceMap.get(parentInstance);\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\n }\n }\n if (updated && dnode.properties && dnode.properties.updateAnimation) {\n dnode.properties.updateAnimation(domNode, dnode.properties, previous.properties);\n }\n }\n}\nfunction addDeferredProperties(vnode, projectionOptions) {\n // transfer any properties that have been passed - as these must be decorated properties\n vnode.decoratedDeferredProperties = vnode.properties;\n const properties = vnode.deferredPropertiesCallback(!!vnode.inserted);\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n vnode.properties = Object.assign({}, properties, vnode.decoratedDeferredProperties);\n projectorState.deferredRenderCallbacks.push(() => {\n const properties = Object.assign({}, vnode.deferredPropertiesCallback(!!vnode.inserted), vnode.decoratedDeferredProperties);\n updateProperties(vnode.domNode, vnode.properties, properties, projectionOptions);\n vnode.properties = properties;\n });\n}\nfunction runDeferredRenderCallbacks(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectorState.deferredRenderCallbacks.length) {\n if (projectionOptions.sync) {\n while (projectorState.deferredRenderCallbacks.length) {\n const callback = projectorState.deferredRenderCallbacks.shift();\n callback && callback();\n }\n }\n else {\n global.requestAnimationFrame(() => {\n while (projectorState.deferredRenderCallbacks.length) {\n const callback = projectorState.deferredRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n }\n}\nfunction runAfterRenderCallbacks(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectionOptions.sync) {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n }\n else {\n if (global.requestIdleCallback) {\n global.requestIdleCallback(() => {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n else {\n setTimeout(() => {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n }\n}\nfunction scheduleRender(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectionOptions.sync) {\n render(projectionOptions);\n }\n else if (projectorState.renderScheduled === undefined) {\n projectorState.renderScheduled = global.requestAnimationFrame(() => {\n render(projectionOptions);\n });\n }\n}\nfunction render(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectorState.renderScheduled = undefined;\n const renderQueue = projectorState.renderQueue;\n const renders = [...renderQueue];\n projectorState.renderQueue = [];\n renders.sort((a, b) => a.depth - b.depth);\n const previouslyRendered = [];\n while (renders.length) {\n const { instance } = renders.shift();\n if (instanceMap.has(instance) && previouslyRendered.indexOf(instance) === -1) {\n previouslyRendered.push(instance);\n const { parentVNode, dnode } = instanceMap.get(instance);\n const instanceData = widgetInstanceMap.get(instance);\n const nextSiblings = nextSiblingMap.get(instance);\n updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance, nextSiblings, nextSiblings);\n }\n }\n runAfterRenderCallbacks(projectionOptions);\n runDeferredRenderCallbacks(projectionOptions);\n}\nexport const dom = {\n append: function (parentNode, instance, projectionOptions = {}) {\n const instanceData = widgetInstanceMap.get(instance);\n const finalProjectorOptions = getProjectionOptions(projectionOptions, instance);\n const projectorState = {\n afterRenderCallbacks: [],\n deferredRenderCallbacks: [],\n nodeMap: new WeakMap(),\n renderScheduled: undefined,\n renderQueue: [],\n merge: projectionOptions.merge || false,\n mergeElement: projectionOptions.mergeElement\n };\n projectorStateMap.set(instance, projectorState);\n finalProjectorOptions.rootNode = parentNode;\n const parentVNode = toParentVNode(finalProjectorOptions.rootNode);\n const node = toInternalWNode(instance, instanceData);\n instanceMap.set(instance, { dnode: node, parentVNode });\n instanceData.invalidate = () => {\n instanceData.dirty = true;\n if (instanceData.rendering === false) {\n projectorState.renderQueue.push({ instance, depth: finalProjectorOptions.depth });\n scheduleRender(finalProjectorOptions);\n }\n };\n updateDom(node, node, finalProjectorOptions, parentVNode, instance, [], []);\n projectorState.afterRenderCallbacks.push(() => {\n instanceData.onAttach();\n });\n runDeferredRenderCallbacks(finalProjectorOptions);\n runAfterRenderCallbacks(finalProjectorOptions);\n return {\n domNode: finalProjectorOptions.rootNode\n };\n },\n create: function (instance, projectionOptions) {\n return this.append(document.createElement('div'), instance, projectionOptions);\n },\n merge: function (element, instance, projectionOptions = {}) {\n projectionOptions.merge = true;\n projectionOptions.mergeElement = element;\n const projection = this.append(element.parentNode, instance, projectionOptions);\n const projectorState = projectorStateMap.get(instance);\n projectorState.merge = false;\n return projection;\n }\n};\n//# sourceMappingURL=vdom.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/vdom.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/vdom.mjs\n// module chunks = menu","/*** IMPORTS FROM imports-loader ***/\nvar widgetFactory = require(\"src/menu/Menu\");\n\nvar registerCustomElement = require('@dojo/framework/widget-core/registerCustomElement').default;\n\nvar defaultExport = widgetFactory.default;\ndefaultExport && registerCustomElement(defaultExport);\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/imports-loader?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js\n// module id = ./node_modules/imports-loader/index.js?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js\n// module chunks = menu","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/process/browser.js\n// module id = ./node_modules/process/browser.js\n// module chunks = menu","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)\r\n t[p[i]] = s[p[i]];\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = y[op[0] & 2 ? \"return\" : op[0] ? \"throw\" : \"next\"]) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [0, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { if (o[n]) i[n] = function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; }; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator];\r\n return m ? m.call(o) : typeof __values === \"function\" ? __values(o) : o[Symbol.iterator]();\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/tslib/tslib.es6.js\n// module id = ./node_modules/tslib/tslib.es6.js\n// module chunks = menu","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\n} catch(e) {\n\t// This works if the window reference is available\n\tif(typeof window === \"object\")\n\t\tg = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = ./node_modules/webpack/buildin/global.js\n// module chunks = menu","import { v } from '@dojo/framework/widget-core/d';\nimport { customElement } from '@dojo/framework/widget-core/decorators/customElement';\nimport { WidgetProperties, WNode } from '@dojo/framework/widget-core/interfaces';\nimport { theme, ThemedMixin } from '@dojo/framework/widget-core/mixins/Themed';\nimport { WidgetBase } from '@dojo/framework/widget-core/WidgetBase';\nimport { MenuItem, MenuItemProperties } from '../menu-item/MenuItem';\n\nimport * as css from './menu.m.css';\n\ninterface MenuProperties extends WidgetProperties {\n\tonSelected: (data: any) => void;\n}\n\n@customElement({\n\ttag: 'demo-menu',\n\tevents: ['onSelected']\n})\n@theme(css)\nexport class Menu extends ThemedMixin(WidgetBase)> {\n\tprivate _selectedId: number;\n\n\tprivate _onSelected(id: number, data: any) {\n\t\tthis._selectedId = id;\n\t\tthis.properties.onSelected(data);\n\t\tthis.invalidate();\n\t}\n\n\tprotected render() {\n\t\tconst items = this.children.map((child, index) => {\n\t\t\tif (child) {\n\t\t\t\tconst properties: Partial = {\n\t\t\t\t\tonSelected: (data: any) => {\n\t\t\t\t\t\tthis._onSelected(index, data);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tif (this._selectedId !== undefined) {\n\t\t\t\t\tproperties.selected = index === this._selectedId;\n\t\t\t\t}\n\t\t\t\tchild.properties = { ...child.properties, ...properties };\n\t\t\t}\n\t\t\treturn child;\n\t\t});\n\n\t\treturn v('nav', { classes: this.theme(css.root) }, [\n\t\t\tv(\n\t\t\t\t'ol',\n\t\t\t\t{\n\t\t\t\t\tclasses: this.theme(css.menuContainer)\n\t\t\t\t},\n\t\t\t\titems\n\t\t\t)\n\t\t]);\n\t}\n}\n\nexport default Menu;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@dojo/webpack-contrib/css-module-dts-loader?type=ts&instanceName=0_menu!./src/menu/Menu.ts","// removed by extract-text-webpack-plugin\nmodule.exports = {\" _key\":\"test-app/menu\",\"root\":\"_3bA6jdSn\",\"menuContainer\":\"_1eoGfqku\"};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/menu/menu.m.css\n// module id = ./src/menu/menu.m.css\n// module chunks = menu"],"sourceRoot":""} \ No newline at end of file diff --git a/test-app/fixtures/unix/info/menu-item/report.html b/test-app/fixtures/unix/info/menu-item/report.html index 930890f..ad3b00d 100644 --- a/test-app/fixtures/unix/info/menu-item/report.html +++ b/test-app/fixtures/unix/info/menu-item/report.html @@ -4,7 +4,7 @@ Webpack Bundle Analyzer diff --git a/test-app/fixtures/unix/info/menu-item/stats.json b/test-app/fixtures/unix/info/menu-item/stats.json index f448cfe..4fdbf6b 100644 --- a/test-app/fixtures/unix/info/menu-item/stats.json +++ b/test-app/fixtures/unix/info/menu-item/stats.json @@ -2,8 +2,8 @@ "errors": [], "warnings": [], "version": "3.8.1", - "hash": "931d3d7713b7be398580", - "time": 8071, + "hash": "ea035e8f5bc7b3c31aa9", + "time": 4903, "publicPath": "", "assetsByChunkName": { "menu-item": [ @@ -16,7 +16,7 @@ "assets": [ { "name": "menu-item-1.0.0.js", - "size": 54046, + "size": 55222, "chunks": [ "menu-item" ], @@ -38,7 +38,7 @@ }, { "name": "menu-item-1.0.0.js.map", - "size": 267737, + "size": 269167, "chunks": [ "menu-item" ], @@ -80,7 +80,7 @@ "initial": true, "entry": true, "extraAsync": false, - "size": 191947, + "size": 192149, "names": [ "menu-item" ], @@ -90,16 +90,16 @@ "menu-item-1.0.0.js.map", "menu-item-1.0.0.css.map" ], - "hash": "841539ebdd3cbcdc7e40", + "hash": "b9286203e08d4aeb5c84", "parents": [], "modules": [ { - "id": "./node_modules/@dojo/core/Destroyable.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Destroyable.mjs", - "name": "./node_modules/@dojo/core/Destroyable.mjs", + "id": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Destroyable.mjs", + "name": "./node_modules/@dojo/framework/core/Destroyable.mjs", "index": 25, "index2": 17, - "size": 1668, + "size": 1665, "cacheable": true, "built": true, "optional": false, @@ -108,18 +108,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Evented.mjs", - "issuerId": "./node_modules/@dojo/core/Evented.mjs", - "issuerName": "./node_modules/@dojo/core/Evented.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Evented.mjs", + "issuerId": "./node_modules/@dojo/framework/core/Evented.mjs", + "issuerName": "./node_modules/@dojo/framework/core/Evented.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/core/Evented.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Evented.mjs", - "module": "./node_modules/@dojo/core/Evented.mjs", - "moduleName": "./node_modules/@dojo/core/Evented.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Evented.mjs", + "module": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Evented.mjs", "type": "harmony import", "userRequest": "./Destroyable", "loc": "2:0-44" @@ -134,15 +134,15 @@ ], "optimizationBailout": [], "depth": 6, - "source": "import { createCompositeHandle } from './lang';\nimport Promise from '@dojo/shim/Promise';\n/**\n * No operation function to replace own once instance is destoryed\n */\nfunction noop() {\n return Promise.resolve(false);\n}\n/**\n * No op function used to replace own, once instance has been destoryed\n */\nfunction destroyed() {\n throw new Error('Call made to destroyed method');\n}\nexport class Destroyable {\n /**\n * @constructor\n */\n constructor() {\n this.handles = [];\n }\n /**\n * Register handles for the instance that will be destroyed when `this.destroy` is called\n *\n * @param {Handle} handle The handle to add for the instance\n * @returns {Handle} a handle for the handle, removes the handle for the instance and calls destroy\n */\n own(handles) {\n const handle = Array.isArray(handles) ? createCompositeHandle(...handles) : handles;\n const { handles: _handles } = this;\n _handles.push(handle);\n return {\n destroy() {\n _handles.splice(_handles.indexOf(handle));\n handle.destroy();\n }\n };\n }\n /**\n * Destrpys all handers registered for the instance\n *\n * @returns {Promise {\n this.handles.forEach((handle) => {\n handle && handle.destroy && handle.destroy();\n });\n this.destroy = noop;\n this.own = destroyed;\n resolve(true);\n });\n }\n}\nexport default Destroyable;\n//# sourceMappingURL=Destroyable.mjs.map" + "source": "import { createCompositeHandle } from './lang';\nimport Promise from '../shim/Promise';\n/**\n * No operation function to replace own once instance is destoryed\n */\nfunction noop() {\n return Promise.resolve(false);\n}\n/**\n * No op function used to replace own, once instance has been destoryed\n */\nfunction destroyed() {\n throw new Error('Call made to destroyed method');\n}\nexport class Destroyable {\n /**\n * @constructor\n */\n constructor() {\n this.handles = [];\n }\n /**\n * Register handles for the instance that will be destroyed when `this.destroy` is called\n *\n * @param {Handle} handle The handle to add for the instance\n * @returns {Handle} a handle for the handle, removes the handle for the instance and calls destroy\n */\n own(handles) {\n const handle = Array.isArray(handles) ? createCompositeHandle(...handles) : handles;\n const { handles: _handles } = this;\n _handles.push(handle);\n return {\n destroy() {\n _handles.splice(_handles.indexOf(handle));\n handle.destroy();\n }\n };\n }\n /**\n * Destrpys all handers registered for the instance\n *\n * @returns {Promise {\n this.handles.forEach((handle) => {\n handle && handle.destroy && handle.destroy();\n });\n this.destroy = noop;\n this.own = destroyed;\n resolve(true);\n });\n }\n}\nexport default Destroyable;\n//# sourceMappingURL=Destroyable.mjs.map" }, { - "id": "./node_modules/@dojo/core/Evented.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Evented.mjs", - "name": "./node_modules/@dojo/core/Evented.mjs", + "id": "./node_modules/@dojo/framework/core/Evented.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Evented.mjs", + "name": "./node_modules/@dojo/framework/core/Evented.mjs", "index": 24, "index2": 18, - "size": 2149, + "size": 2151, "cacheable": true, "built": true, "optional": false, @@ -151,48 +151,48 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/RegistryHandler.mjs", - "issuerId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "issuerName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/RegistryHandler.mjs", - "module": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "2:0-45" + "userRequest": "../core/Evented", + "loc": "2:0-42" }, { - "moduleId": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/NodeHandler.mjs", - "module": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "1:0-45" + "userRequest": "../core/Evented", + "loc": "1:0-42" }, { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "4:0-45" + "userRequest": "../core/Evented", + "loc": "4:0-42" }, { - "moduleId": "./node_modules/@dojo/widget-core/Injector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Injector.mjs", - "module": "./node_modules/@dojo/widget-core/Injector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Injector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Injector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Injector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Injector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Injector.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "1:0-45" + "userRequest": "../core/Evented", + "loc": "1:0-42" } ], "usedExports": [ @@ -205,15 +205,15 @@ ], "optimizationBailout": [], "depth": 5, - "source": "import Map from '@dojo/shim/Map';\nimport { Destroyable } from './Destroyable';\n/**\n * Map of computed regular expressions, keyed by string\n */\nconst regexMap = new Map();\n/**\n * Determines is the event type glob has been matched\n *\n * @returns boolean that indicates if the glob is matched\n */\nexport function isGlobMatch(globString, targetString) {\n if (typeof targetString === 'string' && typeof globString === 'string' && globString.indexOf('*') !== -1) {\n let regex;\n if (regexMap.has(globString)) {\n regex = regexMap.get(globString);\n }\n else {\n regex = new RegExp(`^${globString.replace(/\\*/g, '.*')}$`);\n regexMap.set(globString, regex);\n }\n return regex.test(targetString);\n }\n else {\n return globString === targetString;\n }\n}\n/**\n * Event Class\n */\nexport class Evented extends Destroyable {\n constructor() {\n super(...arguments);\n /**\n * map of listeners keyed by event type\n */\n this.listenersMap = new Map();\n }\n emit(event) {\n this.listenersMap.forEach((methods, type) => {\n if (isGlobMatch(type, event.type)) {\n methods.forEach((method) => {\n method.call(this, event);\n });\n }\n });\n }\n on(type, listener) {\n if (Array.isArray(listener)) {\n const handles = listener.map((listener) => this._addListener(type, listener));\n return {\n destroy() {\n handles.forEach((handle) => handle.destroy());\n }\n };\n }\n return this._addListener(type, listener);\n }\n _addListener(type, listener) {\n const listeners = this.listenersMap.get(type) || [];\n listeners.push(listener);\n this.listenersMap.set(type, listeners);\n return {\n destroy: () => {\n const listeners = this.listenersMap.get(type) || [];\n listeners.splice(listeners.indexOf(listener), 1);\n }\n };\n }\n}\nexport default Evented;\n//# sourceMappingURL=Evented.mjs.map" + "source": "import Map from '../shim/Map';\nimport { Destroyable } from './Destroyable';\n/**\n * Map of computed regular expressions, keyed by string\n */\nconst regexMap = new Map();\n/**\n * Determines is the event type glob has been matched\n *\n * @returns boolean that indicates if the glob is matched\n */\nexport function isGlobMatch(globString, targetString) {\n if (typeof targetString === 'string' && typeof globString === 'string' && globString.indexOf('*') !== -1) {\n let regex;\n if (regexMap.has(globString)) {\n regex = regexMap.get(globString);\n }\n else {\n regex = new RegExp(`^${globString.replace(/\\*/g, '.*')}$`);\n regexMap.set(globString, regex);\n }\n return regex.test(targetString);\n }\n else {\n return globString === targetString;\n }\n}\n/**\n * Event Class\n */\nexport class Evented extends Destroyable {\n constructor() {\n super(...arguments);\n /**\n * map of listeners keyed by event type\n */\n this.listenersMap = new Map();\n }\n emit(event) {\n this.listenersMap.forEach((methods, type) => {\n if (isGlobMatch(type, event.type)) {\n [...methods].forEach((method) => {\n method.call(this, event);\n });\n }\n });\n }\n on(type, listener) {\n if (Array.isArray(listener)) {\n const handles = listener.map((listener) => this._addListener(type, listener));\n return {\n destroy() {\n handles.forEach((handle) => handle.destroy());\n }\n };\n }\n return this._addListener(type, listener);\n }\n _addListener(type, listener) {\n const listeners = this.listenersMap.get(type) || [];\n listeners.push(listener);\n this.listenersMap.set(type, listeners);\n return {\n destroy: () => {\n const listeners = this.listenersMap.get(type) || [];\n listeners.splice(listeners.indexOf(listener), 1);\n }\n };\n }\n}\nexport default Evented;\n//# sourceMappingURL=Evented.mjs.map" }, { - "id": "./node_modules/@dojo/core/lang.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/lang.mjs", - "name": "./node_modules/@dojo/core/lang.mjs", + "id": "./node_modules/@dojo/framework/core/lang.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/lang.mjs", + "name": "./node_modules/@dojo/framework/core/lang.mjs", "index": 26, "index2": 16, - "size": 6843, + "size": 6837, "cacheable": true, "built": true, "optional": false, @@ -222,27 +222,27 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", - "userRequest": "@dojo/core/lang", + "userRequest": "../../core/lang", "loc": "2:0-41" }, { - "moduleId": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Destroyable.mjs", - "module": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleName": "./node_modules/@dojo/core/Destroyable.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Destroyable.mjs", + "module": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Destroyable.mjs", "type": "harmony import", "userRequest": "./lang", "loc": "1:0-47" @@ -267,12 +267,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { assign } from '@dojo/shim/object';\nexport { assign } from '@dojo/shim/object';\nconst slice = Array.prototype.slice;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Type guard that ensures that the value can be coerced to Object\n * to weed out host objects that do not derive from Object.\n * This function is used to check if we want to deep copy an object or not.\n * Note: In ES6 it is possible to modify an object's Symbol.toStringTag property, which will\n * change the value returned by `toString`. This is a rare edge case that is difficult to handle,\n * so it is not handled here.\n * @param value The value to check\n * @return If the value is coercible into an Object\n */\nfunction shouldDeepCopyObject(value) {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\nfunction copyArray(array, inherited) {\n return array.map(function (item) {\n if (Array.isArray(item)) {\n return copyArray(item, inherited);\n }\n return !shouldDeepCopyObject(item)\n ? item\n : _mixin({\n deep: true,\n inherited: inherited,\n sources: [item],\n target: {}\n });\n });\n}\nfunction _mixin(kwArgs) {\n const deep = kwArgs.deep;\n const inherited = kwArgs.inherited;\n const target = kwArgs.target;\n const copied = kwArgs.copied || [];\n const copiedClone = [...copied];\n for (let i = 0; i < kwArgs.sources.length; i++) {\n const source = kwArgs.sources[i];\n if (source === null || source === undefined) {\n continue;\n }\n for (let key in source) {\n if (inherited || hasOwnProperty.call(source, key)) {\n let value = source[key];\n if (copiedClone.indexOf(value) !== -1) {\n continue;\n }\n if (deep) {\n if (Array.isArray(value)) {\n value = copyArray(value, inherited);\n }\n else if (shouldDeepCopyObject(value)) {\n const targetValue = target[key] || {};\n copied.push(source);\n value = _mixin({\n deep: true,\n inherited: inherited,\n sources: [value],\n target: targetValue,\n copied\n });\n }\n }\n target[key] = value;\n }\n }\n }\n return target;\n}\nexport function create(prototype, ...mixins) {\n if (!mixins.length) {\n throw new RangeError('lang.create requires at least one mixin object.');\n }\n const args = mixins.slice();\n args.unshift(Object.create(prototype));\n return assign.apply(null, args);\n}\nexport function deepAssign(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: false,\n sources: sources,\n target: target\n });\n}\nexport function deepMixin(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Creates a new object using the provided source's prototype as the prototype for the new object, and then\n * deep copies the provided source's values into the new target.\n *\n * @param source The object to duplicate\n * @return The new object\n */\nexport function duplicate(source) {\n const target = Object.create(Object.getPrototypeOf(source));\n return deepMixin(target, source);\n}\n/**\n * Determines whether two values are the same value.\n *\n * @param a First value to compare\n * @param b Second value to compare\n * @return true if the values are the same; false otherwise\n */\nexport function isIdentical(a, b) {\n return (a === b ||\n /* both values are NaN */\n (a !== a && b !== b));\n}\n/**\n * Returns a function that binds a method to the specified object at runtime. This is similar to\n * `Function.prototype.bind`, but instead of a function it takes the name of a method on an object.\n * As a result, the function returned by `lateBind` will always call the function currently assigned to\n * the specified property on the object as of the moment the function it returns is called.\n *\n * @param instance The context object\n * @param method The name of the method on the context object to bind to itself\n * @param suppliedArgs An optional array of values to prepend to the `instance[method]` arguments list\n * @return The bound function\n */\nexport function lateBind(instance, method, ...suppliedArgs) {\n return suppliedArgs.length\n ? function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n // TS7017\n return instance[method].apply(instance, args);\n }\n : function () {\n // TS7017\n return instance[method].apply(instance, arguments);\n };\n}\nexport function mixin(target, ...sources) {\n return _mixin({\n deep: false,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Returns a function which invokes the given function with the given arguments prepended to its argument list.\n * Like `Function.prototype.bind`, but does not alter execution context.\n *\n * @param targetFunction The function that needs to be bound\n * @param suppliedArgs An optional array of arguments to prepend to the `targetFunction` arguments list\n * @return The bound function\n */\nexport function partial(targetFunction, ...suppliedArgs) {\n return function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n return targetFunction.apply(this, args);\n };\n}\n/**\n * Returns an object with a destroy method that, when called, calls the passed-in destructor.\n * This is intended to provide a unified interface for creating \"remove\" / \"destroy\" handlers for\n * event listeners, timers, etc.\n *\n * @param destructor A function that will be called when the handle's `destroy` method is invoked\n * @return The handle object\n */\nexport function createHandle(destructor) {\n let called = false;\n return {\n destroy: function () {\n if (!called) {\n called = true;\n destructor();\n }\n }\n };\n}\n/**\n * Returns a single handle that can be used to destroy multiple handles simultaneously.\n *\n * @param handles An array of handles with `destroy` methods\n * @return The handle object\n */\nexport function createCompositeHandle(...handles) {\n return createHandle(function () {\n for (let i = 0; i < handles.length; i++) {\n handles[i].destroy();\n }\n });\n}\n//# sourceMappingURL=lang.mjs.map" + "source": "import { assign } from '../shim/object';\nexport { assign } from '../shim/object';\nconst slice = Array.prototype.slice;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Type guard that ensures that the value can be coerced to Object\n * to weed out host objects that do not derive from Object.\n * This function is used to check if we want to deep copy an object or not.\n * Note: In ES6 it is possible to modify an object's Symbol.toStringTag property, which will\n * change the value returned by `toString`. This is a rare edge case that is difficult to handle,\n * so it is not handled here.\n * @param value The value to check\n * @return If the value is coercible into an Object\n */\nfunction shouldDeepCopyObject(value) {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\nfunction copyArray(array, inherited) {\n return array.map(function (item) {\n if (Array.isArray(item)) {\n return copyArray(item, inherited);\n }\n return !shouldDeepCopyObject(item)\n ? item\n : _mixin({\n deep: true,\n inherited: inherited,\n sources: [item],\n target: {}\n });\n });\n}\nfunction _mixin(kwArgs) {\n const deep = kwArgs.deep;\n const inherited = kwArgs.inherited;\n const target = kwArgs.target;\n const copied = kwArgs.copied || [];\n const copiedClone = [...copied];\n for (let i = 0; i < kwArgs.sources.length; i++) {\n const source = kwArgs.sources[i];\n if (source === null || source === undefined) {\n continue;\n }\n for (let key in source) {\n if (inherited || hasOwnProperty.call(source, key)) {\n let value = source[key];\n if (copiedClone.indexOf(value) !== -1) {\n continue;\n }\n if (deep) {\n if (Array.isArray(value)) {\n value = copyArray(value, inherited);\n }\n else if (shouldDeepCopyObject(value)) {\n const targetValue = target[key] || {};\n copied.push(source);\n value = _mixin({\n deep: true,\n inherited: inherited,\n sources: [value],\n target: targetValue,\n copied\n });\n }\n }\n target[key] = value;\n }\n }\n }\n return target;\n}\nexport function create(prototype, ...mixins) {\n if (!mixins.length) {\n throw new RangeError('lang.create requires at least one mixin object.');\n }\n const args = mixins.slice();\n args.unshift(Object.create(prototype));\n return assign.apply(null, args);\n}\nexport function deepAssign(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: false,\n sources: sources,\n target: target\n });\n}\nexport function deepMixin(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Creates a new object using the provided source's prototype as the prototype for the new object, and then\n * deep copies the provided source's values into the new target.\n *\n * @param source The object to duplicate\n * @return The new object\n */\nexport function duplicate(source) {\n const target = Object.create(Object.getPrototypeOf(source));\n return deepMixin(target, source);\n}\n/**\n * Determines whether two values are the same value.\n *\n * @param a First value to compare\n * @param b Second value to compare\n * @return true if the values are the same; false otherwise\n */\nexport function isIdentical(a, b) {\n return (a === b ||\n /* both values are NaN */\n (a !== a && b !== b));\n}\n/**\n * Returns a function that binds a method to the specified object at runtime. This is similar to\n * `Function.prototype.bind`, but instead of a function it takes the name of a method on an object.\n * As a result, the function returned by `lateBind` will always call the function currently assigned to\n * the specified property on the object as of the moment the function it returns is called.\n *\n * @param instance The context object\n * @param method The name of the method on the context object to bind to itself\n * @param suppliedArgs An optional array of values to prepend to the `instance[method]` arguments list\n * @return The bound function\n */\nexport function lateBind(instance, method, ...suppliedArgs) {\n return suppliedArgs.length\n ? function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n // TS7017\n return instance[method].apply(instance, args);\n }\n : function () {\n // TS7017\n return instance[method].apply(instance, arguments);\n };\n}\nexport function mixin(target, ...sources) {\n return _mixin({\n deep: false,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Returns a function which invokes the given function with the given arguments prepended to its argument list.\n * Like `Function.prototype.bind`, but does not alter execution context.\n *\n * @param targetFunction The function that needs to be bound\n * @param suppliedArgs An optional array of arguments to prepend to the `targetFunction` arguments list\n * @return The bound function\n */\nexport function partial(targetFunction, ...suppliedArgs) {\n return function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n return targetFunction.apply(this, args);\n };\n}\n/**\n * Returns an object with a destroy method that, when called, calls the passed-in destructor.\n * This is intended to provide a unified interface for creating \"remove\" / \"destroy\" handlers for\n * event listeners, timers, etc.\n *\n * @param destructor A function that will be called when the handle's `destroy` method is invoked\n * @return The handle object\n */\nexport function createHandle(destructor) {\n let called = false;\n return {\n destroy: function () {\n if (!called) {\n called = true;\n destructor();\n }\n }\n };\n}\n/**\n * Returns a single handle that can be used to destroy multiple handles simultaneously.\n *\n * @param handles An array of handles with `destroy` methods\n * @return The handle object\n */\nexport function createCompositeHandle(...handles) {\n return createHandle(function () {\n for (let i = 0; i < handles.length; i++) {\n handles[i].destroy();\n }\n });\n}\n//# sourceMappingURL=lang.mjs.map" }, { - "id": "./node_modules/@dojo/has/has.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/has/has.mjs", - "name": "./node_modules/@dojo/has/has.mjs", + "id": "./node_modules/@dojo/framework/has/has.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/has/has.mjs", + "name": "./node_modules/@dojo/framework/has/has.mjs", "index": 7, "index2": 3, "size": 6305, @@ -284,29 +284,29 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/has.mjs", - "issuerId": "./node_modules/@dojo/shim/support/has.mjs", - "issuerName": "./node_modules/@dojo/shim/support/has.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/has.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/support/has.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/support/has.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/has.mjs", - "module": "./node_modules/@dojo/shim/support/has.mjs", - "moduleName": "./node_modules/@dojo/shim/support/has.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/has.mjs", + "module": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/has.mjs", "type": "harmony import", - "userRequest": "@dojo/has/has", + "userRequest": "../../has/has", "loc": "1:0-41" }, { - "moduleId": "./node_modules/@dojo/shim/support/has.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/has.mjs", - "module": "./node_modules/@dojo/shim/support/has.mjs", - "moduleName": "./node_modules/@dojo/shim/support/has.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/has.mjs", + "module": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/has.mjs", "type": "harmony import", - "userRequest": "@dojo/has/has", + "userRequest": "../../has/has", "loc": "4:0-30" } ], @@ -328,9 +328,9 @@ "source": "function isFeatureTestThenable(value) {\n return value && value.then;\n}\n/**\n * A cache of results of feature tests\n */\nexport const testCache = {};\n/**\n * A cache of the un-resolved feature tests\n */\nexport const testFunctions = {};\n/**\n * A cache of unresolved thenables (probably promises)\n * @type {{}}\n */\nconst testThenables = {};\n/**\n * A reference to the global scope (`window` in a browser, `global` in NodeJS)\n */\nconst globalScope = (function () {\n /* istanbul ignore else */\n if (typeof window !== 'undefined') {\n // Browsers\n return window;\n }\n else if (typeof global !== 'undefined') {\n // Node\n return global;\n }\n else if (typeof self !== 'undefined') {\n // Web workers\n return self;\n }\n /* istanbul ignore next */\n return {};\n})();\n/* Grab the staticFeatures if there are available */\nconst { staticFeatures } = globalScope.DojoHasEnvironment || {};\n/* Cleaning up the DojoHasEnviornment */\nif ('DojoHasEnvironment' in globalScope) {\n delete globalScope.DojoHasEnvironment;\n}\n/**\n * Custom type guard to narrow the `staticFeatures` to either a map or a function that\n * returns a map.\n *\n * @param value The value to guard for\n */\nfunction isStaticFeatureFunction(value) {\n return typeof value === 'function';\n}\n/**\n * The cache of asserted features that were available in the global scope when the\n * module loaded\n */\nconst staticCache = staticFeatures\n ? isStaticFeatureFunction(staticFeatures) ? staticFeatures.apply(globalScope) : staticFeatures\n : {}; /* Providing an empty cache, if none was in the environment\n\n/**\n* AMD plugin function.\n*\n* Conditional loads modules based on a has feature test value.\n*\n* @param resourceId Gives the resolved module id to load.\n* @param require The loader require function with respect to the module that contained the plugin resource in its\n* dependency list.\n* @param load Callback to loader that consumes result of plugin demand.\n*/\nexport function load(resourceId, require, load, config) {\n resourceId ? require([resourceId], load) : load();\n}\n/**\n * AMD plugin function.\n *\n * Resolves resourceId into a module id based on possibly-nested tenary expression that branches on has feature test\n * value(s).\n *\n * @param resourceId The id of the module\n * @param normalize Resolves a relative module id into an absolute module id\n */\nexport function normalize(resourceId, normalize) {\n const tokens = resourceId.match(/[\\?:]|[^:\\?]*/g) || [];\n let i = 0;\n function get(skip) {\n const term = tokens[i++];\n if (term === ':') {\n // empty string module name, resolves to null\n return null;\n }\n else {\n // postfixed with a ? means it is a feature to branch on, the term is the name of the feature\n if (tokens[i++] === '?') {\n if (!skip && has(term)) {\n // matched the feature, get the first value from the options\n return get();\n }\n else {\n // did not match, get the second value, passing over the first\n get(true);\n return get(skip);\n }\n }\n // a module\n return term;\n }\n }\n const id = get();\n return id && normalize(id);\n}\n/**\n * Check if a feature has already been registered\n *\n * @param feature the name of the feature\n */\nexport function exists(feature) {\n const normalizedFeature = feature.toLowerCase();\n return Boolean(normalizedFeature in staticCache || normalizedFeature in testCache || testFunctions[normalizedFeature]);\n}\n/**\n * Register a new test for a named feature.\n *\n * @example\n * has.add('dom-addeventlistener', !!document.addEventListener);\n *\n * @example\n * has.add('touch-events', function () {\n * return 'ontouchstart' in document\n * });\n *\n * @param feature the name of the feature\n * @param value the value reported of the feature, or a function that will be executed once on first test\n * @param overwrite if an existing value should be overwritten. Defaults to false.\n */\nexport function add(feature, value, overwrite = false) {\n const normalizedFeature = feature.toLowerCase();\n if (exists(normalizedFeature) && !overwrite && !(normalizedFeature in staticCache)) {\n throw new TypeError(`Feature \"${feature}\" exists and overwrite not true.`);\n }\n if (typeof value === 'function') {\n testFunctions[normalizedFeature] = value;\n }\n else if (isFeatureTestThenable(value)) {\n testThenables[feature] = value.then((resolvedValue) => {\n testCache[feature] = resolvedValue;\n delete testThenables[feature];\n }, () => {\n delete testThenables[feature];\n });\n }\n else {\n testCache[normalizedFeature] = value;\n delete testFunctions[normalizedFeature];\n }\n}\n/**\n * Return the current value of a named feature.\n *\n * @param feature The name (if a string) or identifier (if an integer) of the feature to test.\n */\nexport default function has(feature) {\n let result;\n const normalizedFeature = feature.toLowerCase();\n if (normalizedFeature in staticCache) {\n result = staticCache[normalizedFeature];\n }\n else if (testFunctions[normalizedFeature]) {\n result = testCache[normalizedFeature] = testFunctions[normalizedFeature].call(null);\n delete testFunctions[normalizedFeature];\n }\n else if (normalizedFeature in testCache) {\n result = testCache[normalizedFeature];\n }\n else if (feature in testThenables) {\n return false;\n }\n else {\n throw new TypeError(`Attempt to detect unregistered has feature \"${feature}\"`);\n }\n return result;\n}\n/*\n * Out of the box feature tests\n */\n/* Environments */\n/* Used as a value to provide a debug only code path */\nadd('debug', true);\n/* Detects if the environment is \"browser like\" */\nadd('host-browser', typeof document !== 'undefined' && typeof location !== 'undefined');\n/* Detects if the environment appears to be NodeJS */\nadd('host-node', function () {\n if (typeof process === 'object' && process.versions && process.versions.node) {\n return process.versions.node;\n }\n});\n//# sourceMappingURL=has.mjs.map" }, { - "id": "./node_modules/@dojo/shim/Map.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "name": "./node_modules/@dojo/shim/Map.mjs", + "id": "./node_modules/@dojo/framework/shim/Map.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "name": "./node_modules/@dojo/framework/shim/Map.mjs", "index": 15, "index2": 12, "size": 3331, @@ -342,57 +342,57 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "1:0-33" + "userRequest": "../shim/Map", + "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/RegistryHandler.mjs", - "module": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "1:0-37" + "userRequest": "../shim/Map", + "loc": "1:0-34" }, { - "moduleId": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/NodeHandler.mjs", - "module": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "2:0-33" + "userRequest": "../shim/Map", + "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "2:0-33" + "userRequest": "../shim/Map", + "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/core/Evented.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Evented.mjs", - "module": "./node_modules/@dojo/core/Evented.mjs", - "moduleName": "./node_modules/@dojo/core/Evented.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Evented.mjs", + "module": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Evented.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "1:0-33" + "userRequest": "../shim/Map", + "loc": "1:0-30" } ], "usedExports": [ @@ -408,9 +408,9 @@ "source": "import { isArrayLike, ShimIterator } from './iterator';\nimport global from './global';\nimport { is as objectIs } from './object';\nimport has from './support/has';\nimport './Symbol';\nexport let Map = global.Map;\nif (!true) {\n Map = (_a = class Map {\n constructor(iterable) {\n this._keys = [];\n this._values = [];\n this[Symbol.toStringTag] = 'Map';\n if (iterable) {\n if (isArrayLike(iterable)) {\n for (let i = 0; i < iterable.length; i++) {\n const value = iterable[i];\n this.set(value[0], value[1]);\n }\n }\n else {\n for (const value of iterable) {\n this.set(value[0], value[1]);\n }\n }\n }\n }\n /**\n * An alternative to Array.prototype.indexOf using Object.is\n * to check for equality. See http://mzl.la/1zuKO2V\n */\n _indexOfKey(keys, key) {\n for (let i = 0, length = keys.length; i < length; i++) {\n if (objectIs(keys[i], key)) {\n return i;\n }\n }\n return -1;\n }\n get size() {\n return this._keys.length;\n }\n clear() {\n this._keys.length = this._values.length = 0;\n }\n delete(key) {\n const index = this._indexOfKey(this._keys, key);\n if (index < 0) {\n return false;\n }\n this._keys.splice(index, 1);\n this._values.splice(index, 1);\n return true;\n }\n entries() {\n const values = this._keys.map((key, i) => {\n return [key, this._values[i]];\n });\n return new ShimIterator(values);\n }\n forEach(callback, context) {\n const keys = this._keys;\n const values = this._values;\n for (let i = 0, length = keys.length; i < length; i++) {\n callback.call(context, values[i], keys[i], this);\n }\n }\n get(key) {\n const index = this._indexOfKey(this._keys, key);\n return index < 0 ? undefined : this._values[index];\n }\n has(key) {\n return this._indexOfKey(this._keys, key) > -1;\n }\n keys() {\n return new ShimIterator(this._keys);\n }\n set(key, value) {\n let index = this._indexOfKey(this._keys, key);\n index = index < 0 ? this._keys.length : index;\n this._keys[index] = key;\n this._values[index] = value;\n return this;\n }\n values() {\n return new ShimIterator(this._values);\n }\n [Symbol.iterator]() {\n return this.entries();\n }\n },\n _a[Symbol.species] = _a,\n _a);\n}\nexport default Map;\nvar _a;\n//# sourceMappingURL=Map.mjs.map" }, { - "id": "./node_modules/@dojo/shim/Promise.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Promise.mjs", - "name": "./node_modules/@dojo/shim/Promise.mjs", + "id": "./node_modules/@dojo/framework/shim/Promise.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Promise.mjs", + "name": "./node_modules/@dojo/framework/shim/Promise.mjs", "index": 22, "index2": 15, "size": 8519, @@ -422,30 +422,30 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Registry.mjs", - "issuerId": "./node_modules/@dojo/widget-core/Registry.mjs", - "issuerName": "./node_modules/@dojo/widget-core/Registry.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Registry.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Promise", - "loc": "1:0-41" + "userRequest": "../shim/Promise", + "loc": "1:0-38" }, { - "moduleId": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Destroyable.mjs", - "module": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleName": "./node_modules/@dojo/core/Destroyable.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Destroyable.mjs", + "module": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Destroyable.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Promise", - "loc": "2:0-41" + "userRequest": "../shim/Promise", + "loc": "2:0-38" } ], "usedExports": [ @@ -461,9 +461,9 @@ "source": "import global from './global';\nimport { queueMicroTask } from './support/queue';\nimport './Symbol';\nimport has from './support/has';\nexport let ShimPromise = global.Promise;\nexport const isThenable = function isThenable(value) {\n return value && typeof value.then === 'function';\n};\nif (!true) {\n global.Promise = ShimPromise = (_a = class Promise {\n /**\n * Creates a new Promise.\n *\n * @constructor\n *\n * @param executor\n * The executor function is called immediately when the Promise is instantiated. It is responsible for\n * starting the asynchronous operation when it is invoked.\n *\n * The executor must call either the passed `resolve` function when the asynchronous operation has completed\n * successfully, or the `reject` function when the operation fails.\n */\n constructor(executor) {\n /**\n * The current state of this promise.\n */\n this.state = 1 /* Pending */;\n this[Symbol.toStringTag] = 'Promise';\n /**\n * If true, the resolution of this promise is chained (\"locked in\") to another promise.\n */\n let isChained = false;\n /**\n * Whether or not this promise is in a resolved state.\n */\n const isResolved = () => {\n return this.state !== 1 /* Pending */ || isChained;\n };\n /**\n * Callbacks that should be invoked once the asynchronous operation has completed.\n */\n let callbacks = [];\n /**\n * Initially pushes callbacks onto a queue for execution once this promise settles. After the promise settles,\n * enqueues callbacks for execution on the next event loop turn.\n */\n let whenFinished = function (callback) {\n if (callbacks) {\n callbacks.push(callback);\n }\n };\n /**\n * Settles this promise.\n *\n * @param newState The resolved state for this promise.\n * @param {T|any} value The resolved value for this promise.\n */\n const settle = (newState, value) => {\n // A promise can only be settled once.\n if (this.state !== 1 /* Pending */) {\n return;\n }\n this.state = newState;\n this.resolvedValue = value;\n whenFinished = queueMicroTask;\n // Only enqueue a callback runner if there are callbacks so that initially fulfilled Promises don't have to\n // wait an extra turn.\n if (callbacks && callbacks.length > 0) {\n queueMicroTask(function () {\n if (callbacks) {\n let count = callbacks.length;\n for (let i = 0; i < count; ++i) {\n callbacks[i].call(null);\n }\n callbacks = null;\n }\n });\n }\n };\n /**\n * Resolves this promise.\n *\n * @param newState The resolved state for this promise.\n * @param {T|any} value The resolved value for this promise.\n */\n const resolve = (newState, value) => {\n if (isResolved()) {\n return;\n }\n if (isThenable(value)) {\n value.then(settle.bind(null, 0 /* Fulfilled */), settle.bind(null, 2 /* Rejected */));\n isChained = true;\n }\n else {\n settle(newState, value);\n }\n };\n this.then = (onFulfilled, onRejected) => {\n return new Promise((resolve, reject) => {\n // whenFinished initially queues up callbacks for execution after the promise has settled. Once the\n // promise has settled, whenFinished will schedule callbacks for execution on the next turn through the\n // event loop.\n whenFinished(() => {\n const callback = this.state === 2 /* Rejected */ ? onRejected : onFulfilled;\n if (typeof callback === 'function') {\n try {\n resolve(callback(this.resolvedValue));\n }\n catch (error) {\n reject(error);\n }\n }\n else if (this.state === 2 /* Rejected */) {\n reject(this.resolvedValue);\n }\n else {\n resolve(this.resolvedValue);\n }\n });\n });\n };\n try {\n executor(resolve.bind(null, 0 /* Fulfilled */), resolve.bind(null, 2 /* Rejected */));\n }\n catch (error) {\n settle(2 /* Rejected */, error);\n }\n }\n static all(iterable) {\n return new this(function (resolve, reject) {\n const values = [];\n let complete = 0;\n let total = 0;\n let populating = true;\n function fulfill(index, value) {\n values[index] = value;\n ++complete;\n finish();\n }\n function finish() {\n if (populating || complete < total) {\n return;\n }\n resolve(values);\n }\n function processItem(index, item) {\n ++total;\n if (isThenable(item)) {\n // If an item Promise rejects, this Promise is immediately rejected with the item\n // Promise's rejection error.\n item.then(fulfill.bind(null, index), reject);\n }\n else {\n Promise.resolve(item).then(fulfill.bind(null, index));\n }\n }\n let i = 0;\n for (const value of iterable) {\n processItem(i, value);\n i++;\n }\n populating = false;\n finish();\n });\n }\n static race(iterable) {\n return new this(function (resolve, reject) {\n for (const item of iterable) {\n if (item instanceof Promise) {\n // If a Promise item rejects, this Promise is immediately rejected with the item\n // Promise's rejection error.\n item.then(resolve, reject);\n }\n else {\n Promise.resolve(item).then(resolve);\n }\n }\n });\n }\n static reject(reason) {\n return new this(function (resolve, reject) {\n reject(reason);\n });\n }\n static resolve(value) {\n return new this(function (resolve) {\n resolve(value);\n });\n }\n catch(onRejected) {\n return this.then(undefined, onRejected);\n }\n },\n _a[Symbol.species] = ShimPromise,\n _a);\n}\nexport default ShimPromise;\nvar _a;\n//# sourceMappingURL=Promise.mjs.map" }, { - "id": "./node_modules/@dojo/shim/Symbol.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Symbol.mjs", - "name": "./node_modules/@dojo/shim/Symbol.mjs", + "id": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Symbol.mjs", + "name": "./node_modules/@dojo/framework/shim/Symbol.mjs", "index": 5, "index2": 7, "size": 5929, @@ -475,81 +475,81 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "type": "harmony import", - "userRequest": "@dojo/shim/Symbol", - "loc": "3:0-39" - }, - { - "moduleId": "./node_modules/@dojo/widget-core/d.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/d.mjs", - "module": "./node_modules/@dojo/widget-core/d.mjs", - "moduleName": "./node_modules/@dojo/widget-core/d.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Symbol", - "loc": "1:0-39" + "userRequest": "../shim/Symbol", + "loc": "3:0-36" }, { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/d.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/d.mjs", + "module": "./node_modules/@dojo/framework/widget-core/d.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/d.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Symbol", - "loc": "3:0-39" + "userRequest": "../shim/Symbol", + "loc": "1:0-36" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "5:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "4:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/iterator.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/iterator.mjs", - "module": "./node_modules/@dojo/shim/iterator.mjs", - "moduleName": "./node_modules/@dojo/shim/iterator.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "type": "harmony import", + "userRequest": "../shim/Symbol", + "loc": "3:0-36" + }, + { + "moduleId": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/iterator.mjs", + "module": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/iterator.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "1:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/object.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/object.mjs", - "module": "./node_modules/@dojo/shim/object.mjs", - "moduleName": "./node_modules/@dojo/shim/object.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/object.mjs", + "module": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/object.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "3:0-36" }, { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "3:0-18" @@ -568,9 +568,9 @@ "source": "import has from './support/has';\nimport global from './global';\nimport { getValueDescriptor } from './support/util';\nexport let Symbol = global.Symbol;\nif (!true) {\n /**\n * Throws if the value is not a symbol, used internally within the Shim\n * @param {any} value The value to check\n * @return {symbol} Returns the symbol or throws\n */\n const validateSymbol = function validateSymbol(value) {\n if (!isSymbol(value)) {\n throw new TypeError(value + ' is not a symbol');\n }\n return value;\n };\n const defineProperties = Object.defineProperties;\n const defineProperty = Object.defineProperty;\n const create = Object.create;\n const objPrototype = Object.prototype;\n const globalSymbols = {};\n const getSymbolName = (function () {\n const created = create(null);\n return function (desc) {\n let postfix = 0;\n let name;\n while (created[String(desc) + (postfix || '')]) {\n ++postfix;\n }\n desc += String(postfix || '');\n created[desc] = true;\n name = '@@' + desc;\n // FIXME: Temporary guard until the duplicate execution when testing can be\n // pinned down.\n if (!Object.getOwnPropertyDescriptor(objPrototype, name)) {\n defineProperty(objPrototype, name, {\n set: function (value) {\n defineProperty(this, name, getValueDescriptor(value));\n }\n });\n }\n return name;\n };\n })();\n const InternalSymbol = function Symbol(description) {\n if (this instanceof InternalSymbol) {\n throw new TypeError('TypeError: Symbol is not a constructor');\n }\n return Symbol(description);\n };\n Symbol = global.Symbol = function Symbol(description) {\n if (this instanceof Symbol) {\n throw new TypeError('TypeError: Symbol is not a constructor');\n }\n const sym = Object.create(InternalSymbol.prototype);\n description = description === undefined ? '' : String(description);\n return defineProperties(sym, {\n __description__: getValueDescriptor(description),\n __name__: getValueDescriptor(getSymbolName(description))\n });\n };\n /* Decorate the Symbol function with the appropriate properties */\n defineProperty(Symbol, 'for', getValueDescriptor(function (key) {\n if (globalSymbols[key]) {\n return globalSymbols[key];\n }\n return (globalSymbols[key] = Symbol(String(key)));\n }));\n defineProperties(Symbol, {\n keyFor: getValueDescriptor(function (sym) {\n let key;\n validateSymbol(sym);\n for (key in globalSymbols) {\n if (globalSymbols[key] === sym) {\n return key;\n }\n }\n }),\n hasInstance: getValueDescriptor(Symbol.for('hasInstance'), false, false),\n isConcatSpreadable: getValueDescriptor(Symbol.for('isConcatSpreadable'), false, false),\n iterator: getValueDescriptor(Symbol.for('iterator'), false, false),\n match: getValueDescriptor(Symbol.for('match'), false, false),\n observable: getValueDescriptor(Symbol.for('observable'), false, false),\n replace: getValueDescriptor(Symbol.for('replace'), false, false),\n search: getValueDescriptor(Symbol.for('search'), false, false),\n species: getValueDescriptor(Symbol.for('species'), false, false),\n split: getValueDescriptor(Symbol.for('split'), false, false),\n toPrimitive: getValueDescriptor(Symbol.for('toPrimitive'), false, false),\n toStringTag: getValueDescriptor(Symbol.for('toStringTag'), false, false),\n unscopables: getValueDescriptor(Symbol.for('unscopables'), false, false)\n });\n /* Decorate the InternalSymbol object */\n defineProperties(InternalSymbol.prototype, {\n constructor: getValueDescriptor(Symbol),\n toString: getValueDescriptor(function () {\n return this.__name__;\n }, false, false)\n });\n /* Decorate the Symbol.prototype */\n defineProperties(Symbol.prototype, {\n toString: getValueDescriptor(function () {\n return 'Symbol (' + validateSymbol(this).__description__ + ')';\n }),\n valueOf: getValueDescriptor(function () {\n return validateSymbol(this);\n })\n });\n defineProperty(Symbol.prototype, Symbol.toPrimitive, getValueDescriptor(function () {\n return validateSymbol(this);\n }));\n defineProperty(Symbol.prototype, Symbol.toStringTag, getValueDescriptor('Symbol', false, false, true));\n defineProperty(InternalSymbol.prototype, Symbol.toPrimitive, getValueDescriptor(Symbol.prototype[Symbol.toPrimitive], false, false, true));\n defineProperty(InternalSymbol.prototype, Symbol.toStringTag, getValueDescriptor(Symbol.prototype[Symbol.toStringTag], false, false, true));\n}\n/**\n * A custom guard function that determines if an object is a symbol or not\n * @param {any} value The value to check to see if it is a symbol or not\n * @return {is symbol} Returns true if a symbol or not (and narrows the type guard)\n */\nexport function isSymbol(value) {\n return (value && (typeof value === 'symbol' || value['@@toStringTag'] === 'Symbol')) || false;\n}\n/**\n * Fill any missing well known symbols if the native Symbol is missing them\n */\n[\n 'hasInstance',\n 'isConcatSpreadable',\n 'iterator',\n 'species',\n 'replace',\n 'search',\n 'split',\n 'match',\n 'toPrimitive',\n 'toStringTag',\n 'unscopables',\n 'observable'\n].forEach((wellKnown) => {\n if (!Symbol[wellKnown]) {\n Object.defineProperty(Symbol, wellKnown, getValueDescriptor(Symbol.for(wellKnown), false, false));\n }\n});\nexport default Symbol;\n//# sourceMappingURL=Symbol.mjs.map" }, { - "id": "./node_modules/@dojo/shim/WeakMap.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/WeakMap.mjs", - "name": "./node_modules/@dojo/shim/WeakMap.mjs", + "id": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/WeakMap.mjs", + "name": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "index": 19, "index2": 13, "size": 3748, @@ -582,38 +582,38 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/WeakMap", - "loc": "2:0-41" + "userRequest": "../shim/WeakMap", + "loc": "2:0-38" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/WeakMap", - "loc": "5:0-41" + "userRequest": "../shim/WeakMap", + "loc": "5:0-38" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/inject.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/WeakMap", + "userRequest": "../../shim/WeakMap", "loc": "1:0-41" } ], @@ -629,9 +629,9 @@ "source": "import global from './global';\nimport { isArrayLike } from './iterator';\nimport has from './support/has';\nimport './Symbol';\nexport let WeakMap = global.WeakMap;\nif (!true) {\n const DELETED = {};\n const getUID = function getUID() {\n return Math.floor(Math.random() * 100000000);\n };\n const generateName = (function () {\n let startId = Math.floor(Date.now() % 100000000);\n return function generateName() {\n return '__wm' + getUID() + (startId++ + '__');\n };\n })();\n WeakMap = class WeakMap {\n constructor(iterable) {\n this[Symbol.toStringTag] = 'WeakMap';\n this._name = generateName();\n this._frozenEntries = [];\n if (iterable) {\n if (isArrayLike(iterable)) {\n for (let i = 0; i < iterable.length; i++) {\n const item = iterable[i];\n this.set(item[0], item[1]);\n }\n }\n else {\n for (const [key, value] of iterable) {\n this.set(key, value);\n }\n }\n }\n }\n _getFrozenEntryIndex(key) {\n for (let i = 0; i < this._frozenEntries.length; i++) {\n if (this._frozenEntries[i].key === key) {\n return i;\n }\n }\n return -1;\n }\n delete(key) {\n if (key === undefined || key === null) {\n return false;\n }\n const entry = key[this._name];\n if (entry && entry.key === key && entry.value !== DELETED) {\n entry.value = DELETED;\n return true;\n }\n const frozenIndex = this._getFrozenEntryIndex(key);\n if (frozenIndex >= 0) {\n this._frozenEntries.splice(frozenIndex, 1);\n return true;\n }\n return false;\n }\n get(key) {\n if (key === undefined || key === null) {\n return undefined;\n }\n const entry = key[this._name];\n if (entry && entry.key === key && entry.value !== DELETED) {\n return entry.value;\n }\n const frozenIndex = this._getFrozenEntryIndex(key);\n if (frozenIndex >= 0) {\n return this._frozenEntries[frozenIndex].value;\n }\n }\n has(key) {\n if (key === undefined || key === null) {\n return false;\n }\n const entry = key[this._name];\n if (Boolean(entry && entry.key === key && entry.value !== DELETED)) {\n return true;\n }\n const frozenIndex = this._getFrozenEntryIndex(key);\n if (frozenIndex >= 0) {\n return true;\n }\n return false;\n }\n set(key, value) {\n if (!key || (typeof key !== 'object' && typeof key !== 'function')) {\n throw new TypeError('Invalid value used as weak map key');\n }\n let entry = key[this._name];\n if (!entry || entry.key !== key) {\n entry = Object.create(null, {\n key: { value: key }\n });\n if (Object.isFrozen(key)) {\n this._frozenEntries.push(entry);\n }\n else {\n Object.defineProperty(key, this._name, {\n value: entry\n });\n }\n }\n entry.value = value;\n return this;\n }\n };\n}\nexport default WeakMap;\n//# sourceMappingURL=WeakMap.mjs.map" }, { - "id": "./node_modules/@dojo/shim/array.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "name": "./node_modules/@dojo/shim/array.mjs", + "id": "./node_modules/@dojo/framework/shim/array.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "name": "./node_modules/@dojo/framework/shim/array.mjs", "index": 30, "index2": 24, "size": 8928, @@ -643,30 +643,30 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/array", - "loc": "4:0-40" + "userRequest": "../shim/array", + "loc": "4:0-37" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/array", - "loc": "2:0-53" + "userRequest": "../shim/array", + "loc": "2:0-50" } ], "usedExports": [ @@ -686,9 +686,9 @@ "source": "import global from './global';\nimport { isArrayLike, isIterable } from './iterator';\nimport { MAX_SAFE_INTEGER } from './number';\nimport has from './support/has';\nimport { wrapNative } from './support/util';\nexport let from;\n/**\n * Creates a new array from the function parameters.\n *\n * @param arguments Any number of arguments for the array\n * @return An array from the given arguments\n */\nexport let of;\n/* ES6 Array instance methods */\n/**\n * Copies data internally within an array or array-like object.\n *\n * @param target The target array-like object\n * @param offset The index to start copying values to; if negative, it counts backwards from length\n * @param start The first (inclusive) index to copy; if negative, it counts backwards from length\n * @param end The last (exclusive) index to copy; if negative, it counts backwards from length\n * @return The target\n */\nexport let copyWithin;\n/**\n * Fills elements of an array-like object with the specified value.\n *\n * @param target The target to fill\n * @param value The value to fill each element of the target with\n * @param start The first index to fill\n * @param end The (exclusive) index at which to stop filling\n * @return The filled target\n */\nexport let fill;\n/**\n * Finds and returns the first instance matching the callback or undefined if one is not found.\n *\n * @param target An array-like object\n * @param callback A function returning if the current value matches a criteria\n * @param thisArg The execution context for the find function\n * @return The first element matching the callback, or undefined if one does not exist\n */\nexport let find;\n/**\n * Performs a linear search and returns the first index whose value satisfies the passed callback,\n * or -1 if no values satisfy it.\n *\n * @param target An array-like object\n * @param callback A function returning true if the current value satisfies its criteria\n * @param thisArg The execution context for the find function\n * @return The first index whose value satisfies the passed callback, or -1 if no values satisfy it\n */\nexport let findIndex;\n/* ES7 Array instance methods */\n/**\n * Determines whether an array includes a given value\n *\n * @param target the target array-like object\n * @param searchElement the item to search for\n * @param fromIndex the starting index to search from\n * @return `true` if the array includes the element, otherwise `false`\n */\nexport let includes;\nif (true && true) {\n from = global.Array.from;\n of = global.Array.of;\n copyWithin = wrapNative(global.Array.prototype.copyWithin);\n fill = wrapNative(global.Array.prototype.fill);\n find = wrapNative(global.Array.prototype.find);\n findIndex = wrapNative(global.Array.prototype.findIndex);\n}\nelse {\n // It is only older versions of Safari/iOS that have a bad fill implementation and so aren't in the wild\n // To make things easier, if there is a bad fill implementation, the whole set of functions will be filled\n /**\n * Ensures a non-negative, non-infinite, safe integer.\n *\n * @param length The number to validate\n * @return A proper length\n */\n const toLength = function toLength(length) {\n if (isNaN(length)) {\n return 0;\n }\n length = Number(length);\n if (isFinite(length)) {\n length = Math.floor(length);\n }\n // Ensure a non-negative, real, safe integer\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\n };\n /**\n * From ES6 7.1.4 ToInteger()\n *\n * @param value A value to convert\n * @return An integer\n */\n const toInteger = function toInteger(value) {\n value = Number(value);\n if (isNaN(value)) {\n return 0;\n }\n if (value === 0 || !isFinite(value)) {\n return value;\n }\n return (value > 0 ? 1 : -1) * Math.floor(Math.abs(value));\n };\n /**\n * Normalizes an offset against a given length, wrapping it if negative.\n *\n * @param value The original offset\n * @param length The total length to normalize against\n * @return If negative, provide a distance from the end (length); otherwise provide a distance from 0\n */\n const normalizeOffset = function normalizeOffset(value, length) {\n return value < 0 ? Math.max(length + value, 0) : Math.min(value, length);\n };\n from = function from(arrayLike, mapFunction, thisArg) {\n if (arrayLike == null) {\n throw new TypeError('from: requires an array-like object');\n }\n if (mapFunction && thisArg) {\n mapFunction = mapFunction.bind(thisArg);\n }\n /* tslint:disable-next-line:variable-name */\n const Constructor = this;\n const length = toLength(arrayLike.length);\n // Support extension\n const array = typeof Constructor === 'function' ? Object(new Constructor(length)) : new Array(length);\n if (!isArrayLike(arrayLike) && !isIterable(arrayLike)) {\n return array;\n }\n // if this is an array and the normalized length is 0, just return an empty array. this prevents a problem\n // with the iteration on IE when using a NaN array length.\n if (isArrayLike(arrayLike)) {\n if (length === 0) {\n return [];\n }\n for (let i = 0; i < arrayLike.length; i++) {\n array[i] = mapFunction ? mapFunction(arrayLike[i], i) : arrayLike[i];\n }\n }\n else {\n let i = 0;\n for (const value of arrayLike) {\n array[i] = mapFunction ? mapFunction(value, i) : value;\n i++;\n }\n }\n if (arrayLike.length !== undefined) {\n array.length = length;\n }\n return array;\n };\n of = function of(...items) {\n return Array.prototype.slice.call(items);\n };\n copyWithin = function copyWithin(target, offset, start, end) {\n if (target == null) {\n throw new TypeError('copyWithin: target must be an array-like object');\n }\n const length = toLength(target.length);\n offset = normalizeOffset(toInteger(offset), length);\n start = normalizeOffset(toInteger(start), length);\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\n let count = Math.min(end - start, length - offset);\n let direction = 1;\n if (offset > start && offset < start + count) {\n direction = -1;\n start += count - 1;\n offset += count - 1;\n }\n while (count > 0) {\n if (start in target) {\n target[offset] = target[start];\n }\n else {\n delete target[offset];\n }\n offset += direction;\n start += direction;\n count--;\n }\n return target;\n };\n fill = function fill(target, value, start, end) {\n const length = toLength(target.length);\n let i = normalizeOffset(toInteger(start), length);\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\n while (i < end) {\n target[i++] = value;\n }\n return target;\n };\n find = function find(target, callback, thisArg) {\n const index = findIndex(target, callback, thisArg);\n return index !== -1 ? target[index] : undefined;\n };\n findIndex = function findIndex(target, callback, thisArg) {\n const length = toLength(target.length);\n if (!callback) {\n throw new TypeError('find: second argument must be a function');\n }\n if (thisArg) {\n callback = callback.bind(thisArg);\n }\n for (let i = 0; i < length; i++) {\n if (callback(target[i], i, target)) {\n return i;\n }\n }\n return -1;\n };\n}\nif (true) {\n includes = wrapNative(global.Array.prototype.includes);\n}\nelse {\n /**\n * Ensures a non-negative, non-infinite, safe integer.\n *\n * @param length The number to validate\n * @return A proper length\n */\n const toLength = function toLength(length) {\n length = Number(length);\n if (isNaN(length)) {\n return 0;\n }\n if (isFinite(length)) {\n length = Math.floor(length);\n }\n // Ensure a non-negative, real, safe integer\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\n };\n includes = function includes(target, searchElement, fromIndex = 0) {\n let len = toLength(target.length);\n for (let i = fromIndex; i < len; ++i) {\n const currentElement = target[i];\n if (searchElement === currentElement ||\n (searchElement !== searchElement && currentElement !== currentElement)) {\n return true;\n }\n }\n return false;\n };\n}\n//# sourceMappingURL=array.mjs.map" }, { - "id": "./node_modules/@dojo/shim/global.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/global.mjs", - "name": "./node_modules/@dojo/shim/global.mjs", + "id": "./node_modules/@dojo/framework/shim/global.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/global.mjs", + "name": "./node_modules/@dojo/framework/shim/global.mjs", "index": 10, "index2": 4, "size": 581, @@ -700,117 +700,117 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/global", - "loc": "6:0-39" + "userRequest": "../shim/global", + "loc": "6:0-36" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/global", - "loc": "1:0-39" + "userRequest": "./global", + "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./global", - "loc": "1:0-30" + "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./global", - "loc": "2:0-30" + "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Symbol.mjs", - "module": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleName": "./node_modules/@dojo/shim/Symbol.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Symbol.mjs", + "module": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Symbol.mjs", "type": "harmony import", "userRequest": "./global", "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", - "userRequest": "./global", - "loc": "1:0-30" + "userRequest": "../shim/global", + "loc": "1:0-36" }, { - "moduleId": "./node_modules/@dojo/shim/number.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/number.mjs", - "module": "./node_modules/@dojo/shim/number.mjs", - "moduleName": "./node_modules/@dojo/shim/number.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/number.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/number.mjs", + "module": "./node_modules/@dojo/framework/shim/number.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/number.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/support/has.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/has.mjs", - "module": "./node_modules/@dojo/shim/support/has.mjs", - "moduleName": "./node_modules/@dojo/shim/support/has.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/has.mjs", + "module": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/has.mjs", "type": "harmony import", "userRequest": "../global", "loc": "2:0-31" }, { - "moduleId": "./node_modules/@dojo/shim/object.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/object.mjs", - "module": "./node_modules/@dojo/shim/object.mjs", - "moduleName": "./node_modules/@dojo/shim/object.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/object.mjs", + "module": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/object.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/string.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/string.mjs", - "module": "./node_modules/@dojo/shim/string.mjs", - "moduleName": "./node_modules/@dojo/shim/string.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/string.mjs", + "module": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/string.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/queue.mjs", - "module": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleName": "./node_modules/@dojo/shim/support/queue.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/queue.mjs", + "module": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/queue.mjs", "type": "harmony import", "userRequest": "../global", "loc": "1:0-31" @@ -827,9 +827,9 @@ "source": "const globalObject = (function () {\n if (typeof global !== 'undefined') {\n // global spec defines a reference to the global object called 'global'\n // https://github.com/tc39/proposal-global\n // `global` is also defined in NodeJS\n return global;\n }\n else if (typeof window !== 'undefined') {\n // window is defined in browsers\n return window;\n }\n else if (typeof self !== 'undefined') {\n // self is defined in WebWorkers\n return self;\n }\n})();\nexport default globalObject;\n//# sourceMappingURL=global.mjs.map" }, { - "id": "./node_modules/@dojo/shim/iterator.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/iterator.mjs", - "name": "./node_modules/@dojo/shim/iterator.mjs", + "id": "./node_modules/@dojo/framework/shim/iterator.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/iterator.mjs", + "name": "./node_modules/@dojo/framework/shim/iterator.mjs", "index": 16, "index2": 10, "size": 3158, @@ -841,36 +841,36 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./iterator", "loc": "2:0-53" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./iterator", "loc": "1:0-55" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./iterator", "loc": "2:0-41" @@ -889,9 +889,9 @@ "source": "import './Symbol';\nimport { HIGH_SURROGATE_MAX, HIGH_SURROGATE_MIN } from './string';\nconst staticDone = { done: true, value: undefined };\n/**\n * A class that _shims_ an iterator interface on array like objects.\n */\nexport class ShimIterator {\n constructor(list) {\n this._nextIndex = -1;\n if (isIterable(list)) {\n this._nativeIterator = list[Symbol.iterator]();\n }\n else {\n this._list = list;\n }\n }\n /**\n * Return the next iteration result for the Iterator\n */\n next() {\n if (this._nativeIterator) {\n return this._nativeIterator.next();\n }\n if (!this._list) {\n return staticDone;\n }\n if (++this._nextIndex < this._list.length) {\n return {\n done: false,\n value: this._list[this._nextIndex]\n };\n }\n return staticDone;\n }\n [Symbol.iterator]() {\n return this;\n }\n}\n/**\n * A type guard for checking if something has an Iterable interface\n *\n * @param value The value to type guard against\n */\nexport function isIterable(value) {\n return value && typeof value[Symbol.iterator] === 'function';\n}\n/**\n * A type guard for checking if something is ArrayLike\n *\n * @param value The value to type guard against\n */\nexport function isArrayLike(value) {\n return value && typeof value.length === 'number';\n}\n/**\n * Returns the iterator for an object\n *\n * @param iterable The iterable object to return the iterator for\n */\nexport function get(iterable) {\n if (isIterable(iterable)) {\n return iterable[Symbol.iterator]();\n }\n else if (isArrayLike(iterable)) {\n return new ShimIterator(iterable);\n }\n}\n/**\n * Shims the functionality of `for ... of` blocks\n *\n * @param iterable The object the provides an interator interface\n * @param callback The callback which will be called for each item of the iterable\n * @param thisArg Optional scope to pass the callback\n */\nexport function forOf(iterable, callback, thisArg) {\n let broken = false;\n function doBreak() {\n broken = true;\n }\n /* We need to handle iteration of double byte strings properly */\n if (isArrayLike(iterable) && typeof iterable === 'string') {\n const l = iterable.length;\n for (let i = 0; i < l; ++i) {\n let char = iterable[i];\n if (i + 1 < l) {\n const code = char.charCodeAt(0);\n if (code >= HIGH_SURROGATE_MIN && code <= HIGH_SURROGATE_MAX) {\n char += iterable[++i];\n }\n }\n callback.call(thisArg, char, iterable, doBreak);\n if (broken) {\n return;\n }\n }\n }\n else {\n const iterator = get(iterable);\n if (iterator) {\n let result = iterator.next();\n while (!result.done) {\n callback.call(thisArg, result.value, iterable, doBreak);\n if (broken) {\n return;\n }\n result = iterator.next();\n }\n }\n }\n}\n//# sourceMappingURL=iterator.mjs.map" }, { - "id": "./node_modules/@dojo/shim/number.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/number.mjs", - "name": "./node_modules/@dojo/shim/number.mjs", + "id": "./node_modules/@dojo/framework/shim/number.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/number.mjs", + "name": "./node_modules/@dojo/framework/shim/number.mjs", "index": 31, "index2": 23, "size": 1724, @@ -903,18 +903,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./number", "loc": "3:0-44" @@ -935,9 +935,9 @@ "source": "import global from './global';\n/**\n * The smallest interval between two representable numbers.\n */\nexport const EPSILON = 1;\n/**\n * The maximum safe integer in JavaScript\n */\nexport const MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n/**\n * The minimum safe integer in JavaScript\n */\nexport const MIN_SAFE_INTEGER = -MAX_SAFE_INTEGER;\n/**\n * Determines whether the passed value is NaN without coersion.\n *\n * @param value The value to test\n * @return true if the value is NaN, false if it is not\n */\nexport function isNaN(value) {\n return typeof value === 'number' && global.isNaN(value);\n}\n/**\n * Determines whether the passed value is a finite number without coersion.\n *\n * @param value The value to test\n * @return true if the value is finite, false if it is not\n */\nexport function isFinite(value) {\n return typeof value === 'number' && global.isFinite(value);\n}\n/**\n * Determines whether the passed value is an integer.\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isInteger(value) {\n return isFinite(value) && Math.floor(value) === value;\n}\n/**\n * Determines whether the passed value is an integer that is 'safe,' meaning:\n * 1. it can be expressed as an IEEE-754 double precision number\n * 2. it has a one-to-one mapping to a mathematical integer, meaning its\n * IEEE-754 representation cannot be the result of rounding any other\n * integer to fit the IEEE-754 representation\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isSafeInteger(value) {\n return isInteger(value) && Math.abs(value) <= MAX_SAFE_INTEGER;\n}\n//# sourceMappingURL=number.mjs.map" }, { - "id": "./node_modules/@dojo/shim/object.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/object.mjs", - "name": "./node_modules/@dojo/shim/object.mjs", + "id": "./node_modules/@dojo/framework/shim/object.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/object.mjs", + "name": "./node_modules/@dojo/framework/shim/object.mjs", "index": 18, "index2": 11, "size": 4061, @@ -949,39 +949,39 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "issuerId": "./node_modules/@dojo/shim/Map.mjs", - "issuerName": "./node_modules/@dojo/shim/Map.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/Map.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/Map.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./object", "loc": "3:0-42" }, { - "moduleId": "./node_modules/@dojo/core/lang.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/lang.mjs", - "module": "./node_modules/@dojo/core/lang.mjs", - "moduleName": "./node_modules/@dojo/core/lang.mjs", + "moduleId": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/lang.mjs", + "module": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleName": "./node_modules/@dojo/framework/core/lang.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/object", - "loc": "1:0-43" + "userRequest": "../shim/object", + "loc": "1:0-40" }, { - "moduleId": "./node_modules/@dojo/core/lang.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/lang.mjs", - "module": "./node_modules/@dojo/core/lang.mjs", - "moduleName": "./node_modules/@dojo/core/lang.mjs", + "moduleId": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/lang.mjs", + "module": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleName": "./node_modules/@dojo/framework/core/lang.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/object", - "loc": "2:0-43" + "userRequest": "../shim/object", + "loc": "2:0-40" } ], "usedExports": [ @@ -1003,9 +1003,9 @@ "source": "import global from './global';\nimport has from './support/has';\nimport { isSymbol } from './Symbol';\nexport let assign;\n/**\n * Gets the own property descriptor of the specified object.\n * An own property descriptor is one that is defined directly on the object and is not\n * inherited from the object's prototype.\n * @param o Object that contains the property.\n * @param p Name of the property.\n */\nexport let getOwnPropertyDescriptor;\n/**\n * Returns the names of the own properties of an object. The own properties of an object are those that are defined directly\n * on that object, and are not inherited from the object's prototype. The properties of an object include both fields (objects) and functions.\n * @param o Object that contains the own properties.\n */\nexport let getOwnPropertyNames;\n/**\n * Returns an array of all symbol properties found directly on object o.\n * @param o Object to retrieve the symbols from.\n */\nexport let getOwnPropertySymbols;\n/**\n * Returns true if the values are the same value, false otherwise.\n * @param value1 The first value.\n * @param value2 The second value.\n */\nexport let is;\n/**\n * Returns the names of the enumerable properties and methods of an object.\n * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.\n */\nexport let keys;\n/* ES7 Object static methods */\nexport let getOwnPropertyDescriptors;\nexport let entries;\nexport let values;\nif (true) {\n const globalObject = global.Object;\n assign = globalObject.assign;\n getOwnPropertyDescriptor = globalObject.getOwnPropertyDescriptor;\n getOwnPropertyNames = globalObject.getOwnPropertyNames;\n getOwnPropertySymbols = globalObject.getOwnPropertySymbols;\n is = globalObject.is;\n keys = globalObject.keys;\n}\nelse {\n keys = function symbolAwareKeys(o) {\n return Object.keys(o).filter((key) => !Boolean(key.match(/^@@.+/)));\n };\n assign = function assign(target, ...sources) {\n if (target == null) {\n // TypeError if undefined or null\n throw new TypeError('Cannot convert undefined or null to object');\n }\n const to = Object(target);\n sources.forEach((nextSource) => {\n if (nextSource) {\n // Skip over if undefined or null\n keys(nextSource).forEach((nextKey) => {\n to[nextKey] = nextSource[nextKey];\n });\n }\n });\n return to;\n };\n getOwnPropertyDescriptor = function getOwnPropertyDescriptor(o, prop) {\n if (isSymbol(prop)) {\n return Object.getOwnPropertyDescriptor(o, prop);\n }\n else {\n return Object.getOwnPropertyDescriptor(o, prop);\n }\n };\n getOwnPropertyNames = function getOwnPropertyNames(o) {\n return Object.getOwnPropertyNames(o).filter((key) => !Boolean(key.match(/^@@.+/)));\n };\n getOwnPropertySymbols = function getOwnPropertySymbols(o) {\n return Object.getOwnPropertyNames(o)\n .filter((key) => Boolean(key.match(/^@@.+/)))\n .map((key) => Symbol.for(key.substring(2)));\n };\n is = function is(value1, value2) {\n if (value1 === value2) {\n return value1 !== 0 || 1 / value1 === 1 / value2; // -0\n }\n return value1 !== value1 && value2 !== value2; // NaN\n };\n}\nif (true) {\n const globalObject = global.Object;\n getOwnPropertyDescriptors = globalObject.getOwnPropertyDescriptors;\n entries = globalObject.entries;\n values = globalObject.values;\n}\nelse {\n getOwnPropertyDescriptors = function getOwnPropertyDescriptors(o) {\n return getOwnPropertyNames(o).reduce((previous, key) => {\n previous[key] = getOwnPropertyDescriptor(o, key);\n return previous;\n }, {});\n };\n entries = function entries(o) {\n return keys(o).map((key) => [key, o[key]]);\n };\n values = function values(o) {\n return keys(o).map((key) => o[key]);\n };\n}\n//# sourceMappingURL=object.mjs.map" }, { - "id": "./node_modules/@dojo/shim/string.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/string.mjs", - "name": "./node_modules/@dojo/shim/string.mjs", + "id": "./node_modules/@dojo/framework/shim/string.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/string.mjs", + "name": "./node_modules/@dojo/framework/shim/string.mjs", "index": 17, "index2": 9, "size": 12418, @@ -1017,18 +1017,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/iterator.mjs", - "issuerId": "./node_modules/@dojo/shim/iterator.mjs", - "issuerName": "./node_modules/@dojo/shim/iterator.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/iterator.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/iterator.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/iterator.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/iterator.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/iterator.mjs", - "module": "./node_modules/@dojo/shim/iterator.mjs", - "moduleName": "./node_modules/@dojo/shim/iterator.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/iterator.mjs", + "module": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/iterator.mjs", "type": "harmony import", "userRequest": "./string", "loc": "2:0-66" @@ -1059,9 +1059,9 @@ "source": "import global from './global';\nimport has from './support/has';\nimport { wrapNative } from './support/util';\n/**\n * The minimum location of high surrogates\n */\nexport const HIGH_SURROGATE_MIN = 0xd800;\n/**\n * The maximum location of high surrogates\n */\nexport const HIGH_SURROGATE_MAX = 0xdbff;\n/**\n * The minimum location of low surrogates\n */\nexport const LOW_SURROGATE_MIN = 0xdc00;\n/**\n * The maximum location of low surrogates\n */\nexport const LOW_SURROGATE_MAX = 0xdfff;\n/* ES6 static methods */\n/**\n * Return the String value whose elements are, in order, the elements in the List elements.\n * If length is 0, the empty string is returned.\n * @param codePoints The code points to generate the string\n */\nexport let fromCodePoint;\n/**\n * `raw` is intended for use as a tag function of a Tagged Template String. When called\n * as such the first argument will be a well formed template call site object and the rest\n * parameter will contain the substitution values.\n * @param template A well-formed template string call site representation.\n * @param substitutions A set of substitution values.\n */\nexport let raw;\n/* ES6 instance methods */\n/**\n * Returns a nonnegative integer Number less than 1114112 (0x110000) that is the code point\n * value of the UTF-16 encoded code point starting at the string element at position pos in\n * the String resulting from converting this object to a String.\n * If there is no element at that position, the result is undefined.\n * If a valid UTF-16 surrogate pair does not begin at pos, the result is the code unit at pos.\n */\nexport let codePointAt;\n/**\n * Returns true if the sequence of elements of searchString converted to a String is the\n * same as the corresponding elements of this object (converted to a String) starting at\n * endPosition – length(this). Otherwise returns false.\n */\nexport let endsWith;\n/**\n * Returns true if searchString appears as a substring of the result of converting this\n * object to a String, at one or more positions that are\n * greater than or equal to position; otherwise, returns false.\n * @param target The target string\n * @param searchString search string\n * @param position If position is undefined, 0 is assumed, so as to search all of the String.\n */\nexport let includes;\n/**\n * Returns the String value result of normalizing the string into the normalization form\n * named by form as specified in Unicode Standard Annex #15, Unicode Normalization Forms.\n * @param target The target string\n * @param form Applicable values: \"NFC\", \"NFD\", \"NFKC\", or \"NFKD\", If not specified default\n * is \"NFC\"\n */\nexport let normalize;\n/**\n * Returns a String value that is made from count copies appended together. If count is 0,\n * T is the empty String is returned.\n * @param count number of copies to append\n */\nexport let repeat;\n/**\n * Returns true if the sequence of elements of searchString converted to a String is the\n * same as the corresponding elements of this object (converted to a String) starting at\n * position. Otherwise returns false.\n */\nexport let startsWith;\n/* ES7 instance methods */\n/**\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\n * The padding is applied from the end (right) of the current string.\n *\n * @param target The target string\n * @param maxLength The length of the resulting string once the current string has been padded.\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\n *\n * @param fillString The string to pad the current string with.\n * If this string is too long, it will be truncated and the left-most part will be applied.\n * The default value for this parameter is \" \" (U+0020).\n */\nexport let padEnd;\n/**\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\n * The padding is applied from the start (left) of the current string.\n *\n * @param target The target string\n * @param maxLength The length of the resulting string once the current string has been padded.\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\n *\n * @param fillString The string to pad the current string with.\n * If this string is too long, it will be truncated and the left-most part will be applied.\n * The default value for this parameter is \" \" (U+0020).\n */\nexport let padStart;\nif (true && true) {\n fromCodePoint = global.String.fromCodePoint;\n raw = global.String.raw;\n codePointAt = wrapNative(global.String.prototype.codePointAt);\n endsWith = wrapNative(global.String.prototype.endsWith);\n includes = wrapNative(global.String.prototype.includes);\n normalize = wrapNative(global.String.prototype.normalize);\n repeat = wrapNative(global.String.prototype.repeat);\n startsWith = wrapNative(global.String.prototype.startsWith);\n}\nelse {\n /**\n * Validates that text is defined, and normalizes position (based on the given default if the input is NaN).\n * Used by startsWith, includes, and endsWith.\n *\n * @return Normalized position.\n */\n const normalizeSubstringArgs = function (name, text, search, position, isEnd = false) {\n if (text == null) {\n throw new TypeError('string.' + name + ' requires a valid string to search against.');\n }\n const length = text.length;\n position = position !== position ? (isEnd ? length : 0) : position;\n return [text, String(search), Math.min(Math.max(position, 0), length)];\n };\n fromCodePoint = function fromCodePoint(...codePoints) {\n // Adapted from https://github.com/mathiasbynens/String.fromCodePoint\n const length = arguments.length;\n if (!length) {\n return '';\n }\n const fromCharCode = String.fromCharCode;\n const MAX_SIZE = 0x4000;\n let codeUnits = [];\n let index = -1;\n let result = '';\n while (++index < length) {\n let codePoint = Number(arguments[index]);\n // Code points must be finite integers within the valid range\n let isValid = isFinite(codePoint) && Math.floor(codePoint) === codePoint && codePoint >= 0 && codePoint <= 0x10ffff;\n if (!isValid) {\n throw RangeError('string.fromCodePoint: Invalid code point ' + codePoint);\n }\n if (codePoint <= 0xffff) {\n // BMP code point\n codeUnits.push(codePoint);\n }\n else {\n // Astral code point; split in surrogate halves\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n codePoint -= 0x10000;\n let highSurrogate = (codePoint >> 10) + HIGH_SURROGATE_MIN;\n let lowSurrogate = codePoint % 0x400 + LOW_SURROGATE_MIN;\n codeUnits.push(highSurrogate, lowSurrogate);\n }\n if (index + 1 === length || codeUnits.length > MAX_SIZE) {\n result += fromCharCode.apply(null, codeUnits);\n codeUnits.length = 0;\n }\n }\n return result;\n };\n raw = function raw(callSite, ...substitutions) {\n let rawStrings = callSite.raw;\n let result = '';\n let numSubstitutions = substitutions.length;\n if (callSite == null || callSite.raw == null) {\n throw new TypeError('string.raw requires a valid callSite object with a raw value');\n }\n for (let i = 0, length = rawStrings.length; i < length; i++) {\n result += rawStrings[i] + (i < numSubstitutions && i < length - 1 ? substitutions[i] : '');\n }\n return result;\n };\n codePointAt = function codePointAt(text, position = 0) {\n // Adapted from https://github.com/mathiasbynens/String.prototype.codePointAt\n if (text == null) {\n throw new TypeError('string.codePointAt requries a valid string.');\n }\n const length = text.length;\n if (position !== position) {\n position = 0;\n }\n if (position < 0 || position >= length) {\n return undefined;\n }\n // Get the first code unit\n const first = text.charCodeAt(position);\n if (first >= HIGH_SURROGATE_MIN && first <= HIGH_SURROGATE_MAX && length > position + 1) {\n // Start of a surrogate pair (high surrogate and there is a next code unit); check for low surrogate\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n const second = text.charCodeAt(position + 1);\n if (second >= LOW_SURROGATE_MIN && second <= LOW_SURROGATE_MAX) {\n return (first - HIGH_SURROGATE_MIN) * 0x400 + second - LOW_SURROGATE_MIN + 0x10000;\n }\n }\n return first;\n };\n endsWith = function endsWith(text, search, endPosition) {\n if (endPosition == null) {\n endPosition = text.length;\n }\n [text, search, endPosition] = normalizeSubstringArgs('endsWith', text, search, endPosition, true);\n const start = endPosition - search.length;\n if (start < 0) {\n return false;\n }\n return text.slice(start, endPosition) === search;\n };\n includes = function includes(text, search, position = 0) {\n [text, search, position] = normalizeSubstringArgs('includes', text, search, position);\n return text.indexOf(search, position) !== -1;\n };\n repeat = function repeat(text, count = 0) {\n // Adapted from https://github.com/mathiasbynens/String.prototype.repeat\n if (text == null) {\n throw new TypeError('string.repeat requires a valid string.');\n }\n if (count !== count) {\n count = 0;\n }\n if (count < 0 || count === Infinity) {\n throw new RangeError('string.repeat requires a non-negative finite count.');\n }\n let result = '';\n while (count) {\n if (count % 2) {\n result += text;\n }\n if (count > 1) {\n text += text;\n }\n count >>= 1;\n }\n return result;\n };\n startsWith = function startsWith(text, search, position = 0) {\n search = String(search);\n [text, search, position] = normalizeSubstringArgs('startsWith', text, search, position);\n const end = position + search.length;\n if (end > text.length) {\n return false;\n }\n return text.slice(position, end) === search;\n };\n}\nif (true) {\n padEnd = wrapNative(global.String.prototype.padEnd);\n padStart = wrapNative(global.String.prototype.padStart);\n}\nelse {\n padEnd = function padEnd(text, maxLength, fillString = ' ') {\n if (text === null || text === undefined) {\n throw new TypeError('string.repeat requires a valid string.');\n }\n if (maxLength === Infinity) {\n throw new RangeError('string.padEnd requires a non-negative finite count.');\n }\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\n maxLength = 0;\n }\n let strText = String(text);\n const padding = maxLength - strText.length;\n if (padding > 0) {\n strText +=\n repeat(fillString, Math.floor(padding / fillString.length)) +\n fillString.slice(0, padding % fillString.length);\n }\n return strText;\n };\n padStart = function padStart(text, maxLength, fillString = ' ') {\n if (text === null || text === undefined) {\n throw new TypeError('string.repeat requires a valid string.');\n }\n if (maxLength === Infinity) {\n throw new RangeError('string.padStart requires a non-negative finite count.');\n }\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\n maxLength = 0;\n }\n let strText = String(text);\n const padding = maxLength - strText.length;\n if (padding > 0) {\n strText =\n repeat(fillString, Math.floor(padding / fillString.length)) +\n fillString.slice(0, padding % fillString.length) +\n strText;\n }\n return strText;\n };\n}\n//# sourceMappingURL=string.mjs.map" }, { - "id": "./node_modules/@dojo/shim/support/has.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/has.mjs", - "name": "./node_modules/@dojo/shim/support/has.mjs", + "id": "./node_modules/@dojo/framework/shim/support/has.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/has.mjs", + "name": "./node_modules/@dojo/framework/shim/support/has.mjs", "index": 6, "index2": 5, "size": 6151, @@ -1073,81 +1073,81 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "4:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "4:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Symbol.mjs", - "module": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleName": "./node_modules/@dojo/shim/Symbol.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./support/has", - "loc": "1:0-32" + "loc": "3:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Symbol.mjs", + "module": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Symbol.mjs", "type": "harmony import", "userRequest": "./support/has", - "loc": "3:0-32" + "loc": "1:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/object.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/object.mjs", - "module": "./node_modules/@dojo/shim/object.mjs", - "moduleName": "./node_modules/@dojo/shim/object.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/object.mjs", + "module": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/object.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "2:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "4:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/string.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/string.mjs", - "module": "./node_modules/@dojo/shim/string.mjs", - "moduleName": "./node_modules/@dojo/shim/string.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/string.mjs", + "module": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/string.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "2:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/queue.mjs", - "module": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleName": "./node_modules/@dojo/shim/support/queue.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/queue.mjs", + "module": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/queue.mjs", "type": "harmony import", "userRequest": "./has", "loc": "2:0-24" @@ -1165,12 +1165,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import has, { add } from '@dojo/has/has';\nimport global from '../global';\nexport default has;\nexport * from '@dojo/has/has';\n/* ECMAScript 6 and 7 Features */\n/* Array */\nadd('es6-array', () => {\n return (['from', 'of'].every((key) => key in global.Array) &&\n ['findIndex', 'find', 'copyWithin'].every((key) => key in global.Array.prototype));\n}, true);\nadd('es6-array-fill', () => {\n if ('fill' in global.Array.prototype) {\n /* Some versions of Safari do not properly implement this */\n return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1;\n }\n return false;\n}, true);\nadd('es7-array', () => 'includes' in global.Array.prototype, true);\n/* Map */\nadd('es6-map', () => {\n if (typeof global.Map === 'function') {\n /*\n IE11 and older versions of Safari are missing critical ES6 Map functionality\n We wrap this in a try/catch because sometimes the Map constructor exists, but does not\n take arguments (iOS 8.4)\n */\n try {\n const map = new global.Map([[0, 1]]);\n return map.has(0) &&\n typeof map.keys === 'function' &&\n true &&\n typeof map.values === 'function' &&\n typeof map.entries === 'function';\n }\n catch (e) {\n /* istanbul ignore next: not testing on iOS at the moment */\n return false;\n }\n }\n return false;\n}, true);\n/* Math */\nadd('es6-math', () => {\n return [\n 'clz32',\n 'sign',\n 'log10',\n 'log2',\n 'log1p',\n 'expm1',\n 'cosh',\n 'sinh',\n 'tanh',\n 'acosh',\n 'asinh',\n 'atanh',\n 'trunc',\n 'fround',\n 'cbrt',\n 'hypot'\n ].every((name) => typeof global.Math[name] === 'function');\n}, true);\nadd('es6-math-imul', () => {\n if ('imul' in global.Math) {\n /* Some versions of Safari on ios do not properly implement this */\n return Math.imul(0xffffffff, 5) === -5;\n }\n return false;\n}, true);\n/* Object */\nadd('es6-object', () => {\n return true &&\n ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof global.Object[name] === 'function');\n}, true);\nadd('es2017-object', () => {\n return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof global.Object[name] === 'function');\n}, true);\n/* Observable */\nadd('es-observable', () => typeof global.Observable !== 'undefined', true);\n/* Promise */\nadd('es6-promise', () => typeof global.Promise !== 'undefined' && true, true);\n/* Set */\nadd('es6-set', () => {\n if (typeof global.Set === 'function') {\n /* IE11 and older versions of Safari are missing critical ES6 Set functionality */\n const set = new global.Set([1]);\n return set.has(1) && 'keys' in set && typeof set.keys === 'function' && true;\n }\n return false;\n}, true);\n/* String */\nadd('es6-string', () => {\n return ([\n /* static methods */\n 'fromCodePoint'\n ].every((key) => typeof global.String[key] === 'function') &&\n [\n /* instance methods */\n 'codePointAt',\n 'normalize',\n 'repeat',\n 'startsWith',\n 'endsWith',\n 'includes'\n ].every((key) => typeof global.String.prototype[key] === 'function'));\n}, true);\nadd('es6-string-raw', () => {\n function getCallSite(callSite, ...substitutions) {\n const result = [...callSite];\n result.raw = callSite.raw;\n return result;\n }\n if ('raw' in global.String) {\n let b = 1;\n let callSite = getCallSite `a\\n${b}`;\n callSite.raw = ['a\\\\n'];\n const supportsTrunc = global.String.raw(callSite, 42) === 'a:\\\\n';\n return supportsTrunc;\n }\n return false;\n}, true);\nadd('es2017-string', () => {\n return ['padStart', 'padEnd'].every((key) => typeof global.String.prototype[key] === 'function');\n}, true);\n/* Symbol */\nadd('es6-symbol', () => typeof global.Symbol !== 'undefined' && typeof Symbol() === 'symbol', true);\n/* WeakMap */\nadd('es6-weakmap', () => {\n if (typeof global.WeakMap !== 'undefined') {\n /* IE11 and older versions of Safari are missing critical ES6 Map functionality */\n const key1 = {};\n const key2 = {};\n const map = new global.WeakMap([[key1, 1]]);\n Object.freeze(key1);\n return map.get(key1) === 1 && map.set(key2, 2) === map && true;\n }\n return false;\n}, true);\n/* Miscellaneous features */\nadd('microtasks', () => true || false || true, true);\nadd('postmessage', () => {\n // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have\n // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist.\n return typeof global.window !== 'undefined' && typeof global.postMessage === 'function';\n}, true);\nadd('raf', () => typeof global.requestAnimationFrame === 'function', true);\nadd('setimmediate', () => typeof global.setImmediate !== 'undefined', true);\n/* DOM Features */\nadd('dom-mutationobserver', () => {\n if (true && Boolean(global.MutationObserver || global.WebKitMutationObserver)) {\n // IE11 has an unreliable MutationObserver implementation where setProperty() does not\n // generate a mutation event, observers can crash, and the queue does not drain\n // reliably. The following feature test was adapted from\n // https://gist.github.com/t10ko/4aceb8c71681fdb275e33efe5e576b14\n const example = document.createElement('div');\n /* tslint:disable-next-line:variable-name */\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\n const observer = new HostMutationObserver(function () { });\n observer.observe(example, { attributes: true });\n example.style.setProperty('display', 'block');\n return Boolean(observer.takeRecords().length);\n }\n return false;\n}, true);\nadd('dom-webanimation', () => true && global.Animation !== undefined && global.KeyframeEffect !== undefined, true);\n//# sourceMappingURL=has.mjs.map" + "source": "import has, { add } from '../../has/has';\nimport global from '../global';\nexport default has;\nexport * from '../../has/has';\n/* ECMAScript 6 and 7 Features */\n/* Array */\nadd('es6-array', () => {\n return (['from', 'of'].every((key) => key in global.Array) &&\n ['findIndex', 'find', 'copyWithin'].every((key) => key in global.Array.prototype));\n}, true);\nadd('es6-array-fill', () => {\n if ('fill' in global.Array.prototype) {\n /* Some versions of Safari do not properly implement this */\n return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1;\n }\n return false;\n}, true);\nadd('es7-array', () => 'includes' in global.Array.prototype, true);\n/* Map */\nadd('es6-map', () => {\n if (typeof global.Map === 'function') {\n /*\n IE11 and older versions of Safari are missing critical ES6 Map functionality\n We wrap this in a try/catch because sometimes the Map constructor exists, but does not\n take arguments (iOS 8.4)\n */\n try {\n const map = new global.Map([[0, 1]]);\n return map.has(0) &&\n typeof map.keys === 'function' &&\n true &&\n typeof map.values === 'function' &&\n typeof map.entries === 'function';\n }\n catch (e) {\n /* istanbul ignore next: not testing on iOS at the moment */\n return false;\n }\n }\n return false;\n}, true);\n/* Math */\nadd('es6-math', () => {\n return [\n 'clz32',\n 'sign',\n 'log10',\n 'log2',\n 'log1p',\n 'expm1',\n 'cosh',\n 'sinh',\n 'tanh',\n 'acosh',\n 'asinh',\n 'atanh',\n 'trunc',\n 'fround',\n 'cbrt',\n 'hypot'\n ].every((name) => typeof global.Math[name] === 'function');\n}, true);\nadd('es6-math-imul', () => {\n if ('imul' in global.Math) {\n /* Some versions of Safari on ios do not properly implement this */\n return Math.imul(0xffffffff, 5) === -5;\n }\n return false;\n}, true);\n/* Object */\nadd('es6-object', () => {\n return true &&\n ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof global.Object[name] === 'function');\n}, true);\nadd('es2017-object', () => {\n return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof global.Object[name] === 'function');\n}, true);\n/* Observable */\nadd('es-observable', () => typeof global.Observable !== 'undefined', true);\n/* Promise */\nadd('es6-promise', () => typeof global.Promise !== 'undefined' && true, true);\n/* Set */\nadd('es6-set', () => {\n if (typeof global.Set === 'function') {\n /* IE11 and older versions of Safari are missing critical ES6 Set functionality */\n const set = new global.Set([1]);\n return set.has(1) && 'keys' in set && typeof set.keys === 'function' && true;\n }\n return false;\n}, true);\n/* String */\nadd('es6-string', () => {\n return ([\n /* static methods */\n 'fromCodePoint'\n ].every((key) => typeof global.String[key] === 'function') &&\n [\n /* instance methods */\n 'codePointAt',\n 'normalize',\n 'repeat',\n 'startsWith',\n 'endsWith',\n 'includes'\n ].every((key) => typeof global.String.prototype[key] === 'function'));\n}, true);\nadd('es6-string-raw', () => {\n function getCallSite(callSite, ...substitutions) {\n const result = [...callSite];\n result.raw = callSite.raw;\n return result;\n }\n if ('raw' in global.String) {\n let b = 1;\n let callSite = getCallSite `a\\n${b}`;\n callSite.raw = ['a\\\\n'];\n const supportsTrunc = global.String.raw(callSite, 42) === 'a:\\\\n';\n return supportsTrunc;\n }\n return false;\n}, true);\nadd('es2017-string', () => {\n return ['padStart', 'padEnd'].every((key) => typeof global.String.prototype[key] === 'function');\n}, true);\n/* Symbol */\nadd('es6-symbol', () => typeof global.Symbol !== 'undefined' && typeof Symbol() === 'symbol', true);\n/* WeakMap */\nadd('es6-weakmap', () => {\n if (typeof global.WeakMap !== 'undefined') {\n /* IE11 and older versions of Safari are missing critical ES6 Map functionality */\n const key1 = {};\n const key2 = {};\n const map = new global.WeakMap([[key1, 1]]);\n Object.freeze(key1);\n return map.get(key1) === 1 && map.set(key2, 2) === map && true;\n }\n return false;\n}, true);\n/* Miscellaneous features */\nadd('microtasks', () => true || false || true, true);\nadd('postmessage', () => {\n // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have\n // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist.\n return typeof global.window !== 'undefined' && typeof global.postMessage === 'function';\n}, true);\nadd('raf', () => typeof global.requestAnimationFrame === 'function', true);\nadd('setimmediate', () => typeof global.setImmediate !== 'undefined', true);\n/* DOM Features */\nadd('dom-mutationobserver', () => {\n if (true && Boolean(global.MutationObserver || global.WebKitMutationObserver)) {\n // IE11 has an unreliable MutationObserver implementation where setProperty() does not\n // generate a mutation event, observers can crash, and the queue does not drain\n // reliably. The following feature test was adapted from\n // https://gist.github.com/t10ko/4aceb8c71681fdb275e33efe5e576b14\n const example = document.createElement('div');\n /* tslint:disable-next-line:variable-name */\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\n const observer = new HostMutationObserver(function () { });\n observer.observe(example, { attributes: true });\n example.style.setProperty('display', 'block');\n return Boolean(observer.takeRecords().length);\n }\n return false;\n}, true);\nadd('dom-webanimation', () => true && global.Animation !== undefined && global.KeyframeEffect !== undefined, true);\n//# sourceMappingURL=has.mjs.map" }, { - "id": "./node_modules/@dojo/shim/support/queue.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/queue.mjs", - "name": "./node_modules/@dojo/shim/support/queue.mjs", + "id": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/queue.mjs", + "name": "./node_modules/@dojo/framework/shim/support/queue.mjs", "index": 23, "index2": 14, "size": 6196, @@ -1182,18 +1182,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Promise.mjs", - "issuerId": "./node_modules/@dojo/shim/Promise.mjs", - "issuerName": "./node_modules/@dojo/shim/Promise.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Promise.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/Promise.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./support/queue", "loc": "2:0-49" @@ -1210,9 +1210,9 @@ "source": "import global from '../global';\nimport has from './has';\nfunction executeTask(item) {\n if (item && item.isActive && item.callback) {\n item.callback();\n }\n}\nfunction getQueueHandle(item, destructor) {\n return {\n destroy: function () {\n this.destroy = function () { };\n item.isActive = false;\n item.callback = null;\n if (destructor) {\n destructor();\n }\n }\n };\n}\nlet checkMicroTaskQueue;\nlet microTasks;\n/**\n * Schedules a callback to the macrotask queue.\n *\n * @param callback the function to be queued and later executed.\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\n */\nexport const queueTask = (function () {\n let destructor;\n let enqueue;\n // Since the IE implementation of `setImmediate` is not flawless, we will test for `postMessage` first.\n if (true) {\n const queue = [];\n global.addEventListener('message', function (event) {\n // Confirm that the event was triggered by the current window and by this particular implementation.\n if (event.source === global && event.data === 'dojo-queue-message') {\n event.stopPropagation();\n if (queue.length) {\n executeTask(queue.shift());\n }\n }\n });\n enqueue = function (item) {\n queue.push(item);\n global.postMessage('dojo-queue-message', '*');\n };\n }\n else if (false) {\n destructor = global.clearImmediate;\n enqueue = function (item) {\n return setImmediate(executeTask.bind(null, item));\n };\n }\n else {\n destructor = global.clearTimeout;\n enqueue = function (item) {\n return setTimeout(executeTask.bind(null, item), 0);\n };\n }\n function queueTask(callback) {\n const item = {\n isActive: true,\n callback: callback\n };\n const id = enqueue(item);\n return getQueueHandle(item, destructor &&\n function () {\n destructor(id);\n });\n }\n // TODO: Use aspect.before when it is available.\n return true\n ? queueTask\n : function (callback) {\n checkMicroTaskQueue();\n return queueTask(callback);\n };\n})();\n// When no mechanism for registering microtasks is exposed by the environment, microtasks will\n// be queued and then executed in a single macrotask before the other macrotasks are executed.\nif (!true) {\n let isMicroTaskQueued = false;\n microTasks = [];\n checkMicroTaskQueue = function () {\n if (!isMicroTaskQueued) {\n isMicroTaskQueued = true;\n queueTask(function () {\n isMicroTaskQueued = false;\n if (microTasks.length) {\n let item;\n while ((item = microTasks.shift())) {\n executeTask(item);\n }\n }\n });\n }\n };\n}\n/**\n * Schedules an animation task with `window.requestAnimationFrame` if it exists, or with `queueTask` otherwise.\n *\n * Since requestAnimationFrame's behavior does not match that expected from `queueTask`, it is not used there.\n * However, at times it makes more sense to delegate to requestAnimationFrame; hence the following method.\n *\n * @param callback the function to be queued and later executed.\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\n */\nexport const queueAnimationTask = (function () {\n if (!true) {\n return queueTask;\n }\n function queueAnimationTask(callback) {\n const item = {\n isActive: true,\n callback: callback\n };\n const rafId = requestAnimationFrame(executeTask.bind(null, item));\n return getQueueHandle(item, function () {\n cancelAnimationFrame(rafId);\n });\n }\n // TODO: Use aspect.before when it is available.\n return true\n ? queueAnimationTask\n : function (callback) {\n checkMicroTaskQueue();\n return queueAnimationTask(callback);\n };\n})();\n/**\n * Schedules a callback to the microtask queue.\n *\n * Any callbacks registered with `queueMicroTask` will be executed before the next macrotask. If no native\n * mechanism for scheduling macrotasks is exposed, then any callbacks will be fired before any macrotask\n * registered with `queueTask` or `queueAnimationTask`.\n *\n * @param callback the function to be queued and later executed.\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\n */\nexport let queueMicroTask = (function () {\n let enqueue;\n if (false) {\n enqueue = function (item) {\n global.process.nextTick(executeTask.bind(null, item));\n };\n }\n else if (true) {\n enqueue = function (item) {\n global.Promise.resolve(item).then(executeTask);\n };\n }\n else if (true) {\n /* tslint:disable-next-line:variable-name */\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\n const node = document.createElement('div');\n const queue = [];\n const observer = new HostMutationObserver(function () {\n while (queue.length > 0) {\n const item = queue.shift();\n if (item && item.isActive && item.callback) {\n item.callback();\n }\n }\n });\n observer.observe(node, { attributes: true });\n enqueue = function (item) {\n queue.push(item);\n node.setAttribute('queueStatus', '1');\n };\n }\n else {\n enqueue = function (item) {\n checkMicroTaskQueue();\n microTasks.push(item);\n };\n }\n return function (callback) {\n const item = {\n isActive: true,\n callback: callback\n };\n enqueue(item);\n return getQueueHandle(item);\n };\n})();\n//# sourceMappingURL=queue.mjs.map" }, { - "id": "./node_modules/@dojo/shim/support/util.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/util.mjs", - "name": "./node_modules/@dojo/shim/support/util.mjs", + "id": "./node_modules/@dojo/framework/shim/support/util.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/util.mjs", + "name": "./node_modules/@dojo/framework/shim/support/util.mjs", "index": 11, "index2": 6, "size": 853, @@ -1224,36 +1224,36 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./support/util", "loc": "5:0-44" }, { - "moduleId": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Symbol.mjs", - "module": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleName": "./node_modules/@dojo/shim/Symbol.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Symbol.mjs", + "module": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Symbol.mjs", "type": "harmony import", "userRequest": "./support/util", "loc": "3:0-52" }, { - "moduleId": "./node_modules/@dojo/shim/string.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/string.mjs", - "module": "./node_modules/@dojo/shim/string.mjs", - "moduleName": "./node_modules/@dojo/shim/string.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/string.mjs", + "module": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/string.mjs", "type": "harmony import", "userRequest": "./support/util", "loc": "3:0-44" @@ -1272,12 +1272,12 @@ "source": "/**\n * Helper function to generate a value property descriptor\n *\n * @param value The value the property descriptor should be set to\n * @param enumerable If the property should be enumberable, defaults to false\n * @param writable If the property should be writable, defaults to true\n * @param configurable If the property should be configurable, defaults to true\n * @return The property descriptor object\n */\nexport function getValueDescriptor(value, enumerable = false, writable = true, configurable = true) {\n return {\n value: value,\n enumerable: enumerable,\n writable: writable,\n configurable: configurable\n };\n}\nexport function wrapNative(nativeFunction) {\n return function (target, ...args) {\n return nativeFunction.apply(target, args);\n };\n}\n//# sourceMappingURL=util.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/Injector.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Injector.mjs", - "name": "./node_modules/@dojo/widget-core/Injector.mjs", + "id": "./node_modules/@dojo/framework/widget-core/Injector.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Injector.mjs", + "name": "./node_modules/@dojo/framework/widget-core/Injector.mjs", "index": 37, "index2": 31, - "size": 496, + "size": 493, "cacheable": true, "built": true, "optional": false, @@ -1286,18 +1286,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../Injector", "loc": "2:0-41" @@ -1312,15 +1312,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { Evented } from '@dojo/core/Evented';\nexport class Injector extends Evented {\n constructor(payload) {\n super();\n this._payload = payload;\n }\n setInvalidator(invalidator) {\n this._invalidator = invalidator;\n }\n get() {\n return this._payload;\n }\n set(payload) {\n this._payload = payload;\n if (this._invalidator) {\n this._invalidator();\n }\n }\n}\nexport default Injector;\n//# sourceMappingURL=Injector.mjs.map" + "source": "import { Evented } from '../core/Evented';\nexport class Injector extends Evented {\n constructor(payload) {\n super();\n this._payload = payload;\n }\n setInvalidator(invalidator) {\n this._invalidator = invalidator;\n }\n get() {\n return this._payload;\n }\n set(payload) {\n this._payload = payload;\n if (this._invalidator) {\n this._invalidator();\n }\n }\n}\nexport default Injector;\n//# sourceMappingURL=Injector.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/NodeHandler.mjs", - "name": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "id": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "name": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", "index": 28, "index2": 22, - "size": 1096, + "size": 1090, "cacheable": true, "built": true, "optional": false, @@ -1329,18 +1329,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./NodeHandler", "loc": "7:0-40" @@ -1356,15 +1356,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { Evented } from '@dojo/core/Evented';\nimport Map from '@dojo/shim/Map';\n/**\n * Enum to identify the type of event.\n * Listening to 'Projector' will notify when projector is created or updated\n * Listening to 'Widget' will notify when widget root is created or updated\n */\nexport var NodeEventType;\n(function (NodeEventType) {\n NodeEventType[\"Projector\"] = \"Projector\";\n NodeEventType[\"Widget\"] = \"Widget\";\n})(NodeEventType || (NodeEventType = {}));\nexport class NodeHandler extends Evented {\n constructor() {\n super(...arguments);\n this._nodeMap = new Map();\n }\n get(key) {\n return this._nodeMap.get(key);\n }\n has(key) {\n return this._nodeMap.has(key);\n }\n add(element, key) {\n this._nodeMap.set(key, element);\n this.emit({ type: key });\n }\n addRoot() {\n this.emit({ type: NodeEventType.Widget });\n }\n addProjector() {\n this.emit({ type: NodeEventType.Projector });\n }\n clear() {\n this._nodeMap.clear();\n }\n}\nexport default NodeHandler;\n//# sourceMappingURL=NodeHandler.mjs.map" + "source": "import { Evented } from '../core/Evented';\nimport Map from '../shim/Map';\n/**\n * Enum to identify the type of event.\n * Listening to 'Projector' will notify when projector is created or updated\n * Listening to 'Widget' will notify when widget root is created or updated\n */\nexport var NodeEventType;\n(function (NodeEventType) {\n NodeEventType[\"Projector\"] = \"Projector\";\n NodeEventType[\"Widget\"] = \"Widget\";\n})(NodeEventType || (NodeEventType = {}));\nexport class NodeHandler extends Evented {\n constructor() {\n super(...arguments);\n this._nodeMap = new Map();\n }\n get(key) {\n return this._nodeMap.get(key);\n }\n has(key) {\n return this._nodeMap.has(key);\n }\n add(element, key) {\n this._nodeMap.set(key, element);\n this.emit({ type: key });\n }\n addRoot() {\n this.emit({ type: NodeEventType.Widget });\n }\n addProjector() {\n this.emit({ type: NodeEventType.Projector });\n }\n clear() {\n this._nodeMap.clear();\n }\n}\nexport default NodeHandler;\n//# sourceMappingURL=NodeHandler.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/Registry.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Registry.mjs", - "name": "./node_modules/@dojo/widget-core/Registry.mjs", + "id": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Registry.mjs", + "name": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "index": 21, "index2": 19, - "size": 3702, + "size": 3690, "cacheable": true, "built": true, "optional": false, @@ -1373,54 +1373,54 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./Registry", "loc": "9:0-71" }, { - "moduleId": "./node_modules/@dojo/widget-core/diff.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/diff.mjs", - "module": "./node_modules/@dojo/widget-core/diff.mjs", - "moduleName": "./node_modules/@dojo/widget-core/diff.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/diff.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/diff.mjs", + "module": "./node_modules/@dojo/framework/widget-core/diff.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/diff.mjs", "type": "harmony import", "userRequest": "./Registry", "loc": "1:0-46" }, { - "moduleId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/RegistryHandler.mjs", - "module": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "type": "harmony import", "userRequest": "./Registry", "loc": "3:0-38" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", "userRequest": "./Registry", "loc": "4:0-53" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/customElement.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", "type": "harmony import", "userRequest": "../Registry", "loc": "2:0-35" @@ -1441,15 +1441,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import Promise from '@dojo/shim/Promise';\nimport Map from '@dojo/shim/Map';\nimport Symbol from '@dojo/shim/Symbol';\nimport { Evented } from '@dojo/core/Evented';\n/**\n * Widget base symbol type\n */\nexport const WIDGET_BASE_TYPE = Symbol('Widget Base');\n/**\n * Checks is the item is a subclass of WidgetBase (or a WidgetBase)\n *\n * @param item the item to check\n * @returns true/false indicating if the item is a WidgetBaseConstructor\n */\nexport function isWidgetBaseConstructor(item) {\n return Boolean(item && item._type === WIDGET_BASE_TYPE);\n}\nexport function isWidgetConstructorDefaultExport(item) {\n return Boolean(item &&\n item.hasOwnProperty('__esModule') &&\n item.hasOwnProperty('default') &&\n isWidgetBaseConstructor(item.default));\n}\n/**\n * The Registry implementation\n */\nexport class Registry extends Evented {\n /**\n * Emit loaded event for registry label\n */\n emitLoadedEvent(widgetLabel, item) {\n this.emit({\n type: widgetLabel,\n action: 'loaded',\n item\n });\n }\n define(label, item) {\n if (this._widgetRegistry === undefined) {\n this._widgetRegistry = new Map();\n }\n if (this._widgetRegistry.has(label)) {\n throw new Error(`widget has already been registered for '${label.toString()}'`);\n }\n this._widgetRegistry.set(label, item);\n if (item instanceof Promise) {\n item.then((widgetCtor) => {\n this._widgetRegistry.set(label, widgetCtor);\n this.emitLoadedEvent(label, widgetCtor);\n return widgetCtor;\n }, (error) => {\n throw error;\n });\n }\n else if (isWidgetBaseConstructor(item)) {\n this.emitLoadedEvent(label, item);\n }\n }\n defineInjector(label, injectorFactory) {\n if (this._injectorRegistry === undefined) {\n this._injectorRegistry = new Map();\n }\n if (this._injectorRegistry.has(label)) {\n throw new Error(`injector has already been registered for '${label.toString()}'`);\n }\n const invalidator = new Evented();\n const injectorItem = {\n injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })),\n invalidator\n };\n this._injectorRegistry.set(label, injectorItem);\n this.emitLoadedEvent(label, injectorItem);\n }\n get(label) {\n if (!this._widgetRegistry || !this.has(label)) {\n return null;\n }\n const item = this._widgetRegistry.get(label);\n if (isWidgetBaseConstructor(item)) {\n return item;\n }\n if (item instanceof Promise) {\n return null;\n }\n const promise = item();\n this._widgetRegistry.set(label, promise);\n promise.then((widgetCtor) => {\n if (isWidgetConstructorDefaultExport(widgetCtor)) {\n widgetCtor = widgetCtor.default;\n }\n this._widgetRegistry.set(label, widgetCtor);\n this.emitLoadedEvent(label, widgetCtor);\n return widgetCtor;\n }, (error) => {\n throw error;\n });\n return null;\n }\n getInjector(label) {\n if (!this._injectorRegistry || !this.hasInjector(label)) {\n return null;\n }\n return this._injectorRegistry.get(label);\n }\n has(label) {\n return Boolean(this._widgetRegistry && this._widgetRegistry.has(label));\n }\n hasInjector(label) {\n return Boolean(this._injectorRegistry && this._injectorRegistry.has(label));\n }\n}\nexport default Registry;\n//# sourceMappingURL=Registry.mjs.map" + "source": "import Promise from '../shim/Promise';\nimport Map from '../shim/Map';\nimport Symbol from '../shim/Symbol';\nimport { Evented } from '../core/Evented';\n/**\n * Widget base symbol type\n */\nexport const WIDGET_BASE_TYPE = Symbol('Widget Base');\n/**\n * Checks is the item is a subclass of WidgetBase (or a WidgetBase)\n *\n * @param item the item to check\n * @returns true/false indicating if the item is a WidgetBaseConstructor\n */\nexport function isWidgetBaseConstructor(item) {\n return Boolean(item && item._type === WIDGET_BASE_TYPE);\n}\nexport function isWidgetConstructorDefaultExport(item) {\n return Boolean(item &&\n item.hasOwnProperty('__esModule') &&\n item.hasOwnProperty('default') &&\n isWidgetBaseConstructor(item.default));\n}\n/**\n * The Registry implementation\n */\nexport class Registry extends Evented {\n /**\n * Emit loaded event for registry label\n */\n emitLoadedEvent(widgetLabel, item) {\n this.emit({\n type: widgetLabel,\n action: 'loaded',\n item\n });\n }\n define(label, item) {\n if (this._widgetRegistry === undefined) {\n this._widgetRegistry = new Map();\n }\n if (this._widgetRegistry.has(label)) {\n throw new Error(`widget has already been registered for '${label.toString()}'`);\n }\n this._widgetRegistry.set(label, item);\n if (item instanceof Promise) {\n item.then((widgetCtor) => {\n this._widgetRegistry.set(label, widgetCtor);\n this.emitLoadedEvent(label, widgetCtor);\n return widgetCtor;\n }, (error) => {\n throw error;\n });\n }\n else if (isWidgetBaseConstructor(item)) {\n this.emitLoadedEvent(label, item);\n }\n }\n defineInjector(label, injectorFactory) {\n if (this._injectorRegistry === undefined) {\n this._injectorRegistry = new Map();\n }\n if (this._injectorRegistry.has(label)) {\n throw new Error(`injector has already been registered for '${label.toString()}'`);\n }\n const invalidator = new Evented();\n const injectorItem = {\n injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })),\n invalidator\n };\n this._injectorRegistry.set(label, injectorItem);\n this.emitLoadedEvent(label, injectorItem);\n }\n get(label) {\n if (!this._widgetRegistry || !this.has(label)) {\n return null;\n }\n const item = this._widgetRegistry.get(label);\n if (isWidgetBaseConstructor(item)) {\n return item;\n }\n if (item instanceof Promise) {\n return null;\n }\n const promise = item();\n this._widgetRegistry.set(label, promise);\n promise.then((widgetCtor) => {\n if (isWidgetConstructorDefaultExport(widgetCtor)) {\n widgetCtor = widgetCtor.default;\n }\n this._widgetRegistry.set(label, widgetCtor);\n this.emitLoadedEvent(label, widgetCtor);\n return widgetCtor;\n }, (error) => {\n throw error;\n });\n return null;\n }\n getInjector(label) {\n if (!this._injectorRegistry || !this.hasInjector(label)) {\n return null;\n }\n return this._injectorRegistry.get(label);\n }\n has(label) {\n return Boolean(this._widgetRegistry && this._widgetRegistry.has(label));\n }\n hasInjector(label) {\n return Boolean(this._injectorRegistry && this._injectorRegistry.has(label));\n }\n}\nexport default Registry;\n//# sourceMappingURL=Registry.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/RegistryHandler.mjs", - "name": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "id": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "name": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "index": 27, "index2": 21, - "size": 2862, + "size": 2856, "cacheable": true, "built": true, "optional": false, @@ -1458,18 +1458,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./RegistryHandler", "loc": "6:0-48" @@ -1484,15 +1484,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { Map } from '@dojo/shim/Map';\nimport { Evented } from '@dojo/core/Evented';\nimport { Registry } from './Registry';\nexport class RegistryHandler extends Evented {\n constructor() {\n super();\n this._registry = new Registry();\n this._registryWidgetLabelMap = new Map();\n this._registryInjectorLabelMap = new Map();\n this.own(this._registry);\n const destroy = () => {\n if (this.baseRegistry) {\n this._registryWidgetLabelMap.delete(this.baseRegistry);\n this._registryInjectorLabelMap.delete(this.baseRegistry);\n this.baseRegistry = undefined;\n }\n };\n this.own({ destroy });\n }\n set base(baseRegistry) {\n if (this.baseRegistry) {\n this._registryWidgetLabelMap.delete(this.baseRegistry);\n this._registryInjectorLabelMap.delete(this.baseRegistry);\n }\n this.baseRegistry = baseRegistry;\n }\n define(label, widget) {\n this._registry.define(label, widget);\n }\n defineInjector(label, injector) {\n this._registry.defineInjector(label, injector);\n }\n has(label) {\n return this._registry.has(label) || Boolean(this.baseRegistry && this.baseRegistry.has(label));\n }\n hasInjector(label) {\n return this._registry.hasInjector(label) || Boolean(this.baseRegistry && this.baseRegistry.hasInjector(label));\n }\n get(label, globalPrecedence = false) {\n return this._get(label, globalPrecedence, 'get', this._registryWidgetLabelMap);\n }\n getInjector(label, globalPrecedence = false) {\n return this._get(label, globalPrecedence, 'getInjector', this._registryInjectorLabelMap);\n }\n _get(label, globalPrecedence, getFunctionName, labelMap) {\n const registries = globalPrecedence ? [this.baseRegistry, this._registry] : [this._registry, this.baseRegistry];\n for (let i = 0; i < registries.length; i++) {\n const registry = registries[i];\n if (!registry) {\n continue;\n }\n const item = registry[getFunctionName](label);\n const registeredLabels = labelMap.get(registry) || [];\n if (item) {\n return item;\n }\n else if (registeredLabels.indexOf(label) === -1) {\n const handle = registry.on(label, (event) => {\n if (event.action === 'loaded' &&\n this[getFunctionName](label, globalPrecedence) === event.item) {\n this.emit({ type: 'invalidate' });\n }\n });\n this.own(handle);\n labelMap.set(registry, [...registeredLabels, label]);\n }\n }\n return null;\n }\n}\nexport default RegistryHandler;\n//# sourceMappingURL=RegistryHandler.mjs.map" + "source": "import { Map } from '../shim/Map';\nimport { Evented } from '../core/Evented';\nimport { Registry } from './Registry';\nexport class RegistryHandler extends Evented {\n constructor() {\n super();\n this._registry = new Registry();\n this._registryWidgetLabelMap = new Map();\n this._registryInjectorLabelMap = new Map();\n this.own(this._registry);\n const destroy = () => {\n if (this.baseRegistry) {\n this._registryWidgetLabelMap.delete(this.baseRegistry);\n this._registryInjectorLabelMap.delete(this.baseRegistry);\n this.baseRegistry = undefined;\n }\n };\n this.own({ destroy });\n }\n set base(baseRegistry) {\n if (this.baseRegistry) {\n this._registryWidgetLabelMap.delete(this.baseRegistry);\n this._registryInjectorLabelMap.delete(this.baseRegistry);\n }\n this.baseRegistry = baseRegistry;\n }\n define(label, widget) {\n this._registry.define(label, widget);\n }\n defineInjector(label, injector) {\n this._registry.defineInjector(label, injector);\n }\n has(label) {\n return this._registry.has(label) || Boolean(this.baseRegistry && this.baseRegistry.has(label));\n }\n hasInjector(label) {\n return this._registry.hasInjector(label) || Boolean(this.baseRegistry && this.baseRegistry.hasInjector(label));\n }\n get(label, globalPrecedence = false) {\n return this._get(label, globalPrecedence, 'get', this._registryWidgetLabelMap);\n }\n getInjector(label, globalPrecedence = false) {\n return this._get(label, globalPrecedence, 'getInjector', this._registryInjectorLabelMap);\n }\n _get(label, globalPrecedence, getFunctionName, labelMap) {\n const registries = globalPrecedence ? [this.baseRegistry, this._registry] : [this._registry, this.baseRegistry];\n for (let i = 0; i < registries.length; i++) {\n const registry = registries[i];\n if (!registry) {\n continue;\n }\n const item = registry[getFunctionName](label);\n const registeredLabels = labelMap.get(registry) || [];\n if (item) {\n return item;\n }\n else if (registeredLabels.indexOf(label) === -1) {\n const handle = registry.on(label, (event) => {\n if (event.action === 'loaded' &&\n this[getFunctionName](label, globalPrecedence) === event.item) {\n this.emit({ type: 'invalidate' });\n }\n });\n this.own(handle);\n labelMap.set(registry, [...registeredLabels, label]);\n }\n }\n return null;\n }\n}\nexport default RegistryHandler;\n//# sourceMappingURL=RegistryHandler.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "name": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "id": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "name": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "index": 14, "index2": 26, - "size": 14386, + "size": 13720, "cacheable": true, "built": true, "optional": false, @@ -1501,18 +1501,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./WidgetBase", "loc": "2:0-50" @@ -1523,8 +1523,8 @@ "module": "./src/menu-item/MenuItem.ts", "moduleName": "./src/menu-item/MenuItem.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/WidgetBase", - "loc": "5:0-58" + "userRequest": "@dojo/framework/widget-core/WidgetBase", + "loc": "5:0-68" } ], "usedExports": [ @@ -1538,12 +1538,12 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import Map from '@dojo/shim/Map';\nimport WeakMap from '@dojo/shim/WeakMap';\nimport Symbol from '@dojo/shim/Symbol';\nimport { v } from './d';\nimport { auto } from './diff';\nimport RegistryHandler from './RegistryHandler';\nimport NodeHandler from './NodeHandler';\nimport { widgetInstanceMap } from './vdom';\nimport { isWidgetBaseConstructor, WIDGET_BASE_TYPE } from './Registry';\nconst decoratorMap = new Map();\nconst boundAuto = auto.bind(null);\nexport const noBind = Symbol.for('dojoNoBind');\n/**\n * Main widget base for all widgets to extend\n */\nexport class WidgetBase {\n /**\n * @constructor\n */\n constructor() {\n /**\n * Indicates if it is the initial set properties cycle\n */\n this._initialProperties = true;\n /**\n * Array of property keys considered changed from the previous set properties\n */\n this._changedPropertyKeys = [];\n this._nodeHandler = new NodeHandler();\n this._handles = [];\n this._children = [];\n this._decoratorCache = new Map();\n this._properties = {};\n this._boundRenderFunc = this.render.bind(this);\n this._boundInvalidate = this.invalidate.bind(this);\n widgetInstanceMap.set(this, {\n dirty: true,\n onAttach: () => {\n this.onAttach();\n },\n onDetach: () => {\n this.onDetach();\n this.destroy();\n },\n nodeHandler: this._nodeHandler,\n registry: () => {\n return this.registry;\n },\n coreProperties: {},\n rendering: false,\n inputProperties: {}\n });\n this._runAfterConstructors();\n }\n meta(MetaType) {\n if (this._metaMap === undefined) {\n this._metaMap = new Map();\n }\n let cached = this._metaMap.get(MetaType);\n if (!cached) {\n cached = new MetaType({\n invalidate: this._boundInvalidate,\n nodeHandler: this._nodeHandler,\n bind: this\n });\n this.own(cached);\n this._metaMap.set(MetaType, cached);\n }\n return cached;\n }\n onAttach() {\n // Do nothing by default.\n }\n onDetach() {\n // Do nothing by default.\n }\n get properties() {\n return this._properties;\n }\n get changedPropertyKeys() {\n return [...this._changedPropertyKeys];\n }\n __setCoreProperties__(coreProperties) {\n const { baseRegistry } = coreProperties;\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.coreProperties.baseRegistry !== baseRegistry) {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n this._registry.base = baseRegistry;\n this.invalidate();\n }\n instanceData.coreProperties = coreProperties;\n }\n __setProperties__(originalProperties) {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.inputProperties = originalProperties;\n const properties = this._runBeforeProperties(originalProperties);\n const registeredDiffPropertyNames = this.getDecorator('registeredDiffProperty');\n const changedPropertyKeys = [];\n const propertyNames = Object.keys(properties);\n if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) {\n const allProperties = [...propertyNames, ...Object.keys(this._properties)];\n const checkedProperties = [];\n const diffPropertyResults = {};\n let runReactions = false;\n for (let i = 0; i < allProperties.length; i++) {\n const propertyName = allProperties[i];\n if (checkedProperties.indexOf(propertyName) !== -1) {\n continue;\n }\n checkedProperties.push(propertyName);\n const previousProperty = this._properties[propertyName];\n const newProperty = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n if (registeredDiffPropertyNames.indexOf(propertyName) !== -1) {\n runReactions = true;\n const diffFunctions = this.getDecorator(`diffProperty:${propertyName}`);\n for (let i = 0; i < diffFunctions.length; i++) {\n const result = diffFunctions[i](previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n else {\n const result = boundAuto(previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n if (runReactions) {\n this._mapDiffPropertyReactions(properties, changedPropertyKeys).forEach((args, reaction) => {\n if (args.changed) {\n reaction.call(this, args.previousProperties, args.newProperties);\n }\n });\n }\n this._properties = diffPropertyResults;\n this._changedPropertyKeys = changedPropertyKeys;\n }\n else {\n this._initialProperties = false;\n for (let i = 0; i < propertyNames.length; i++) {\n const propertyName = propertyNames[i];\n if (typeof properties[propertyName] === 'function') {\n properties[propertyName] = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n }\n else {\n changedPropertyKeys.push(propertyName);\n }\n }\n this._changedPropertyKeys = changedPropertyKeys;\n this._properties = Object.assign({}, properties);\n }\n if (this._changedPropertyKeys.length > 0) {\n this.invalidate();\n }\n }\n get children() {\n return this._children;\n }\n __setChildren__(children) {\n if (this._children.length > 0 || children.length > 0) {\n this._children = children;\n this.invalidate();\n }\n }\n __render__() {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.dirty = false;\n const render = this._runBeforeRenders();\n let dNode = render();\n dNode = this.runAfterRenders(dNode);\n this._nodeHandler.clear();\n return dNode;\n }\n invalidate() {\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.invalidate) {\n instanceData.invalidate();\n }\n }\n render() {\n return v('div', {}, this.children);\n }\n /**\n * Function to add decorators to WidgetBase\n *\n * @param decoratorKey The key of the decorator\n * @param value The value of the decorator\n */\n addDecorator(decoratorKey, value) {\n value = Array.isArray(value) ? value : [value];\n if (this.hasOwnProperty('constructor')) {\n let decoratorList = decoratorMap.get(this.constructor);\n if (!decoratorList) {\n decoratorList = new Map();\n decoratorMap.set(this.constructor, decoratorList);\n }\n let specificDecoratorList = decoratorList.get(decoratorKey);\n if (!specificDecoratorList) {\n specificDecoratorList = [];\n decoratorList.set(decoratorKey, specificDecoratorList);\n }\n specificDecoratorList.push(...value);\n }\n else {\n const decorators = this.getDecorator(decoratorKey);\n this._decoratorCache.set(decoratorKey, [...decorators, ...value]);\n }\n }\n /**\n * Function to build the list of decorators from the global decorator map.\n *\n * @param decoratorKey The key of the decorator\n * @return An array of decorator values\n * @private\n */\n _buildDecoratorList(decoratorKey) {\n const allDecorators = [];\n let constructor = this.constructor;\n while (constructor) {\n const instanceMap = decoratorMap.get(constructor);\n if (instanceMap) {\n const decorators = instanceMap.get(decoratorKey);\n if (decorators) {\n allDecorators.unshift(...decorators);\n }\n }\n constructor = Object.getPrototypeOf(constructor);\n }\n return allDecorators;\n }\n /**\n * Function to retrieve decorator values\n *\n * @param decoratorKey The key of the decorator\n * @returns An array of decorator values\n */\n getDecorator(decoratorKey) {\n let allDecorators = this._decoratorCache.get(decoratorKey);\n if (allDecorators !== undefined) {\n return allDecorators;\n }\n allDecorators = this._buildDecoratorList(decoratorKey);\n this._decoratorCache.set(decoratorKey, allDecorators);\n return allDecorators;\n }\n _mapDiffPropertyReactions(newProperties, changedPropertyKeys) {\n const reactionFunctions = this.getDecorator('diffReaction');\n return reactionFunctions.reduce((reactionPropertyMap, { reaction, propertyName }) => {\n let reactionArguments = reactionPropertyMap.get(reaction);\n if (reactionArguments === undefined) {\n reactionArguments = {\n previousProperties: {},\n newProperties: {},\n changed: false\n };\n }\n reactionArguments.previousProperties[propertyName] = this._properties[propertyName];\n reactionArguments.newProperties[propertyName] = newProperties[propertyName];\n if (changedPropertyKeys.indexOf(propertyName) !== -1) {\n reactionArguments.changed = true;\n }\n reactionPropertyMap.set(reaction, reactionArguments);\n return reactionPropertyMap;\n }, new Map());\n }\n /**\n * Binds unbound property functions to the specified `bind` property\n *\n * @param properties properties to check for functions\n */\n _bindFunctionProperty(property, bind) {\n if (typeof property === 'function' && !property[noBind] && isWidgetBaseConstructor(property) === false) {\n if (this._bindFunctionPropertyMap === undefined) {\n this._bindFunctionPropertyMap = new WeakMap();\n }\n const bindInfo = this._bindFunctionPropertyMap.get(property) || {};\n let { boundFunc, scope } = bindInfo;\n if (boundFunc === undefined || scope !== bind) {\n boundFunc = property.bind(bind);\n this._bindFunctionPropertyMap.set(property, { boundFunc, scope: bind });\n }\n return boundFunc;\n }\n return property;\n }\n get registry() {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n return this._registry;\n }\n _runBeforeProperties(properties) {\n const beforeProperties = this.getDecorator('beforeProperties');\n if (beforeProperties.length > 0) {\n return beforeProperties.reduce((properties, beforePropertiesFunction) => {\n return Object.assign({}, properties, beforePropertiesFunction.call(this, properties));\n }, Object.assign({}, properties));\n }\n return properties;\n }\n /**\n * Run all registered before renders and return the updated render method\n */\n _runBeforeRenders() {\n const beforeRenders = this.getDecorator('beforeRender');\n if (beforeRenders.length > 0) {\n return beforeRenders.reduce((render, beforeRenderFunction) => {\n const updatedRender = beforeRenderFunction.call(this, render, this._properties, this._children);\n if (!updatedRender) {\n console.warn('Render function not returned from beforeRender, using previous render');\n return render;\n }\n return updatedRender;\n }, this._boundRenderFunc);\n }\n return this._boundRenderFunc;\n }\n /**\n * Run all registered after renders and return the decorated DNodes\n *\n * @param dNode The DNodes to run through the after renders\n */\n runAfterRenders(dNode) {\n const afterRenders = this.getDecorator('afterRender');\n if (afterRenders.length > 0) {\n return afterRenders.reduce((dNode, afterRenderFunction) => {\n return afterRenderFunction.call(this, dNode);\n }, dNode);\n }\n if (this._metaMap !== undefined) {\n this._metaMap.forEach((meta) => {\n meta.afterRender();\n });\n }\n return dNode;\n }\n _runAfterConstructors() {\n const afterConstructors = this.getDecorator('afterConstructor');\n if (afterConstructors.length > 0) {\n afterConstructors.forEach((afterConstructor) => afterConstructor.call(this));\n }\n }\n own(handle) {\n this._handles.push(handle);\n }\n destroy() {\n while (this._handles.length > 0) {\n const handle = this._handles.pop();\n if (handle) {\n handle.destroy();\n }\n }\n }\n}\n/**\n * static identifier\n */\nWidgetBase._type = WIDGET_BASE_TYPE;\nexport default WidgetBase;\n//# sourceMappingURL=WidgetBase.mjs.map" + "source": "import Map from '../shim/Map';\nimport WeakMap from '../shim/WeakMap';\nimport Symbol from '../shim/Symbol';\nimport { v } from './d';\nimport { auto } from './diff';\nimport RegistryHandler from './RegistryHandler';\nimport NodeHandler from './NodeHandler';\nimport { widgetInstanceMap } from './vdom';\nimport { isWidgetBaseConstructor, WIDGET_BASE_TYPE } from './Registry';\nconst decoratorMap = new Map();\nconst boundAuto = auto.bind(null);\nexport const noBind = Symbol.for('dojoNoBind');\n/**\n * Main widget base for all widgets to extend\n */\nexport class WidgetBase {\n /**\n * @constructor\n */\n constructor() {\n /**\n * Indicates if it is the initial set properties cycle\n */\n this._initialProperties = true;\n /**\n * Array of property keys considered changed from the previous set properties\n */\n this._changedPropertyKeys = [];\n this._nodeHandler = new NodeHandler();\n this._handles = [];\n this._children = [];\n this._decoratorCache = new Map();\n this._properties = {};\n this._boundRenderFunc = this.render.bind(this);\n this._boundInvalidate = this.invalidate.bind(this);\n widgetInstanceMap.set(this, {\n dirty: true,\n onAttach: () => {\n this.onAttach();\n },\n onDetach: () => {\n this.onDetach();\n this.destroy();\n },\n nodeHandler: this._nodeHandler,\n registry: () => {\n return this.registry;\n },\n coreProperties: {},\n rendering: false,\n inputProperties: {}\n });\n this._runAfterConstructors();\n }\n meta(MetaType) {\n if (this._metaMap === undefined) {\n this._metaMap = new Map();\n }\n let cached = this._metaMap.get(MetaType);\n if (!cached) {\n cached = new MetaType({\n invalidate: this._boundInvalidate,\n nodeHandler: this._nodeHandler,\n bind: this\n });\n this.own(cached);\n this._metaMap.set(MetaType, cached);\n }\n return cached;\n }\n onAttach() {\n // Do nothing by default.\n }\n onDetach() {\n // Do nothing by default.\n }\n get properties() {\n return this._properties;\n }\n get changedPropertyKeys() {\n return [...this._changedPropertyKeys];\n }\n __setCoreProperties__(coreProperties) {\n const { baseRegistry } = coreProperties;\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.coreProperties.baseRegistry !== baseRegistry) {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n this._registry.base = baseRegistry;\n this.invalidate();\n }\n instanceData.coreProperties = coreProperties;\n }\n __setProperties__(originalProperties) {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.inputProperties = originalProperties;\n const properties = this._runBeforeProperties(originalProperties);\n const registeredDiffPropertyNames = this.getDecorator('registeredDiffProperty');\n const changedPropertyKeys = [];\n const propertyNames = Object.keys(properties);\n if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) {\n const allProperties = [...propertyNames, ...Object.keys(this._properties)];\n const checkedProperties = [];\n const diffPropertyResults = {};\n let runReactions = false;\n for (let i = 0; i < allProperties.length; i++) {\n const propertyName = allProperties[i];\n if (checkedProperties.indexOf(propertyName) !== -1) {\n continue;\n }\n checkedProperties.push(propertyName);\n const previousProperty = this._properties[propertyName];\n const newProperty = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n if (registeredDiffPropertyNames.indexOf(propertyName) !== -1) {\n runReactions = true;\n const diffFunctions = this.getDecorator(`diffProperty:${propertyName}`);\n for (let i = 0; i < diffFunctions.length; i++) {\n const result = diffFunctions[i](previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n else {\n const result = boundAuto(previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n if (runReactions) {\n const reactionFunctions = this.getDecorator('diffReaction');\n const executedReactions = [];\n reactionFunctions.forEach(({ reaction, propertyName }) => {\n const propertyChanged = changedPropertyKeys.indexOf(propertyName) !== -1;\n const reactionRun = executedReactions.indexOf(reaction) !== -1;\n if (propertyChanged && !reactionRun) {\n reaction.call(this, this._properties, diffPropertyResults);\n executedReactions.push(reaction);\n }\n });\n }\n this._properties = diffPropertyResults;\n this._changedPropertyKeys = changedPropertyKeys;\n }\n else {\n this._initialProperties = false;\n for (let i = 0; i < propertyNames.length; i++) {\n const propertyName = propertyNames[i];\n if (typeof properties[propertyName] === 'function') {\n properties[propertyName] = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n }\n else {\n changedPropertyKeys.push(propertyName);\n }\n }\n this._changedPropertyKeys = changedPropertyKeys;\n this._properties = Object.assign({}, properties);\n }\n if (this._changedPropertyKeys.length > 0) {\n this.invalidate();\n }\n }\n get children() {\n return this._children;\n }\n __setChildren__(children) {\n if (this._children.length > 0 || children.length > 0) {\n this._children = children;\n this.invalidate();\n }\n }\n __render__() {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.dirty = false;\n const render = this._runBeforeRenders();\n let dNode = render();\n dNode = this.runAfterRenders(dNode);\n this._nodeHandler.clear();\n return dNode;\n }\n invalidate() {\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.invalidate) {\n instanceData.invalidate();\n }\n }\n render() {\n return v('div', {}, this.children);\n }\n /**\n * Function to add decorators to WidgetBase\n *\n * @param decoratorKey The key of the decorator\n * @param value The value of the decorator\n */\n addDecorator(decoratorKey, value) {\n value = Array.isArray(value) ? value : [value];\n if (this.hasOwnProperty('constructor')) {\n let decoratorList = decoratorMap.get(this.constructor);\n if (!decoratorList) {\n decoratorList = new Map();\n decoratorMap.set(this.constructor, decoratorList);\n }\n let specificDecoratorList = decoratorList.get(decoratorKey);\n if (!specificDecoratorList) {\n specificDecoratorList = [];\n decoratorList.set(decoratorKey, specificDecoratorList);\n }\n specificDecoratorList.push(...value);\n }\n else {\n const decorators = this.getDecorator(decoratorKey);\n this._decoratorCache.set(decoratorKey, [...decorators, ...value]);\n }\n }\n /**\n * Function to build the list of decorators from the global decorator map.\n *\n * @param decoratorKey The key of the decorator\n * @return An array of decorator values\n * @private\n */\n _buildDecoratorList(decoratorKey) {\n const allDecorators = [];\n let constructor = this.constructor;\n while (constructor) {\n const instanceMap = decoratorMap.get(constructor);\n if (instanceMap) {\n const decorators = instanceMap.get(decoratorKey);\n if (decorators) {\n allDecorators.unshift(...decorators);\n }\n }\n constructor = Object.getPrototypeOf(constructor);\n }\n return allDecorators;\n }\n /**\n * Function to retrieve decorator values\n *\n * @param decoratorKey The key of the decorator\n * @returns An array of decorator values\n */\n getDecorator(decoratorKey) {\n let allDecorators = this._decoratorCache.get(decoratorKey);\n if (allDecorators !== undefined) {\n return allDecorators;\n }\n allDecorators = this._buildDecoratorList(decoratorKey);\n this._decoratorCache.set(decoratorKey, allDecorators);\n return allDecorators;\n }\n /**\n * Binds unbound property functions to the specified `bind` property\n *\n * @param properties properties to check for functions\n */\n _bindFunctionProperty(property, bind) {\n if (typeof property === 'function' && !property[noBind] && isWidgetBaseConstructor(property) === false) {\n if (this._bindFunctionPropertyMap === undefined) {\n this._bindFunctionPropertyMap = new WeakMap();\n }\n const bindInfo = this._bindFunctionPropertyMap.get(property) || {};\n let { boundFunc, scope } = bindInfo;\n if (boundFunc === undefined || scope !== bind) {\n boundFunc = property.bind(bind);\n this._bindFunctionPropertyMap.set(property, { boundFunc, scope: bind });\n }\n return boundFunc;\n }\n return property;\n }\n get registry() {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n return this._registry;\n }\n _runBeforeProperties(properties) {\n const beforeProperties = this.getDecorator('beforeProperties');\n if (beforeProperties.length > 0) {\n return beforeProperties.reduce((properties, beforePropertiesFunction) => {\n return Object.assign({}, properties, beforePropertiesFunction.call(this, properties));\n }, Object.assign({}, properties));\n }\n return properties;\n }\n /**\n * Run all registered before renders and return the updated render method\n */\n _runBeforeRenders() {\n const beforeRenders = this.getDecorator('beforeRender');\n if (beforeRenders.length > 0) {\n return beforeRenders.reduce((render, beforeRenderFunction) => {\n const updatedRender = beforeRenderFunction.call(this, render, this._properties, this._children);\n if (!updatedRender) {\n console.warn('Render function not returned from beforeRender, using previous render');\n return render;\n }\n return updatedRender;\n }, this._boundRenderFunc);\n }\n return this._boundRenderFunc;\n }\n /**\n * Run all registered after renders and return the decorated DNodes\n *\n * @param dNode The DNodes to run through the after renders\n */\n runAfterRenders(dNode) {\n const afterRenders = this.getDecorator('afterRender');\n if (afterRenders.length > 0) {\n dNode = afterRenders.reduce((dNode, afterRenderFunction) => {\n return afterRenderFunction.call(this, dNode);\n }, dNode);\n }\n if (this._metaMap !== undefined) {\n this._metaMap.forEach((meta) => {\n meta.afterRender();\n });\n }\n return dNode;\n }\n _runAfterConstructors() {\n const afterConstructors = this.getDecorator('afterConstructor');\n if (afterConstructors.length > 0) {\n afterConstructors.forEach((afterConstructor) => afterConstructor.call(this));\n }\n }\n own(handle) {\n this._handles.push(handle);\n }\n destroy() {\n while (this._handles.length > 0) {\n const handle = this._handles.pop();\n if (handle) {\n handle.destroy();\n }\n }\n }\n}\n/**\n * static identifier\n */\nWidgetBase._type = WIDGET_BASE_TYPE;\nexport default WidgetBase;\n//# sourceMappingURL=WidgetBase.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/animations/cssTransitions.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/animations/cssTransitions.mjs", - "name": "./node_modules/@dojo/widget-core/animations/cssTransitions.mjs", + "id": "./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs", + "name": "./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs", "index": 33, "index2": 27, "size": 2288, @@ -1555,18 +1555,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "../animations/cssTransitions", "loc": "3:0-58" @@ -1583,12 +1583,12 @@ "source": "let browserSpecificTransitionEndEventName = '';\nlet browserSpecificAnimationEndEventName = '';\nfunction determineBrowserStyleNames(element) {\n if ('WebkitTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'webkitTransitionEnd';\n browserSpecificAnimationEndEventName = 'webkitAnimationEnd';\n }\n else if ('transition' in element.style || 'MozTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'transitionend';\n browserSpecificAnimationEndEventName = 'animationend';\n }\n else {\n throw new Error('Your browser is not supported');\n }\n}\nfunction initialize(element) {\n if (browserSpecificAnimationEndEventName === '') {\n determineBrowserStyleNames(element);\n }\n}\nfunction runAndCleanUp(element, startAnimation, finishAnimation) {\n initialize(element);\n let finished = false;\n let transitionEnd = function () {\n if (!finished) {\n finished = true;\n element.removeEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n element.removeEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n finishAnimation();\n }\n };\n startAnimation();\n element.addEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n element.addEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n}\nfunction exit(node, properties, exitAnimation, removeNode) {\n const activeClass = properties.exitAnimationActive || `${exitAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(exitAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n removeNode();\n });\n}\nfunction enter(node, properties, enterAnimation) {\n const activeClass = properties.enterAnimationActive || `${enterAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(enterAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n node.classList.remove(enterAnimation);\n node.classList.remove(activeClass);\n });\n}\nexport default {\n enter,\n exit\n};\n//# sourceMappingURL=cssTransitions.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/d.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/d.mjs", - "name": "./node_modules/@dojo/widget-core/d.mjs", + "id": "./node_modules/@dojo/framework/widget-core/d.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/d.mjs", + "name": "./node_modules/@dojo/framework/widget-core/d.mjs", "index": 4, "index2": 8, - "size": 3270, + "size": 3267, "cacheable": true, "built": true, "optional": false, @@ -1597,54 +1597,54 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./d", "loc": "5:0-29" }, { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./src/menu-item/MenuItem.ts", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--3-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/umd-compat-loader/index.js??ref--3-1!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/ts-loader/index.js??ref--3-2!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/css-module-dts-loader/index.js?type=ts&instanceName=0_menu-item!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu-item/MenuItem.ts", + "module": "./src/menu-item/MenuItem.ts", + "moduleName": "./src/menu-item/MenuItem.ts", + "type": "harmony import", + "userRequest": "@dojo/framework/widget-core/d", + "loc": "2:0-50" + }, + { + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./d", "loc": "4:0-24" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "./../d", "loc": "5:0-27" }, { - "moduleId": "./src/menu-item/MenuItem.ts", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--3-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/umd-compat-loader/index.js??ref--3-1!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/ts-loader/index.js??ref--3-2!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/css-module-dts-loader/index.js?type=ts&instanceName=0_menu-item!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu-item/MenuItem.ts", - "module": "./src/menu-item/MenuItem.ts", - "moduleName": "./src/menu-item/MenuItem.ts", - "type": "harmony import", - "userRequest": "@dojo/widget-core/d", - "loc": "2:0-40" - }, - { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", "userRequest": "./d", "loc": "3:0-65" @@ -1675,12 +1675,12 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import Symbol from '@dojo/shim/Symbol';\n/**\n * The symbol identifier for a WNode type\n */\nexport const WNODE = Symbol('Identifier for a WNode.');\n/**\n * The symbol identifier for a VNode type\n */\nexport const VNODE = Symbol('Identifier for a VNode.');\n/**\n * The symbol identifier for a VNode type created using dom()\n */\nexport const DOMVNODE = Symbol('Identifier for a VNode created using existing dom.');\n/**\n * Helper function that returns true if the `DNode` is a `WNode` using the `type` property\n */\nexport function isWNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === WNODE);\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` using the `type` property\n */\nexport function isVNode(child) {\n return Boolean(child && typeof child !== 'string' && (child.type === VNODE || child.type === DOMVNODE));\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` created with `dom()` using the `type` property\n */\nexport function isDomVNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === DOMVNODE);\n}\nexport function isElementNode(value) {\n return !!value.tagName;\n}\nexport function decorate(dNodes, optionsOrModifier, predicate) {\n let shallow = false;\n let modifier;\n if (typeof optionsOrModifier === 'function') {\n modifier = optionsOrModifier;\n }\n else {\n modifier = optionsOrModifier.modifier;\n predicate = optionsOrModifier.predicate;\n shallow = optionsOrModifier.shallow || false;\n }\n let nodes = Array.isArray(dNodes) ? [...dNodes] : [dNodes];\n function breaker() {\n nodes = [];\n }\n while (nodes.length) {\n const node = nodes.shift();\n if (node) {\n if (!shallow && (isWNode(node) || isVNode(node)) && node.children) {\n nodes = [...nodes, ...node.children];\n }\n if (!predicate || predicate(node)) {\n modifier(node, breaker);\n }\n }\n }\n return dNodes;\n}\n/**\n * Wrapper function for calls to create a widget.\n */\nexport function w(widgetConstructor, properties, children = []) {\n return {\n children,\n widgetConstructor,\n properties,\n type: WNODE\n };\n}\nexport function v(tag, propertiesOrChildren = {}, children = undefined) {\n let properties = propertiesOrChildren;\n let deferredPropertiesCallback;\n if (Array.isArray(propertiesOrChildren)) {\n children = propertiesOrChildren;\n properties = {};\n }\n if (typeof properties === 'function') {\n deferredPropertiesCallback = properties;\n properties = {};\n }\n return {\n tag,\n deferredPropertiesCallback,\n children,\n properties,\n type: VNODE\n };\n}\n/**\n * Create a VNode for an existing DOM Node.\n */\nexport function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, children) {\n return {\n tag: isElementNode(node) ? node.tagName.toLowerCase() : '',\n properties: props,\n attributes: attrs,\n events: on,\n children,\n type: DOMVNODE,\n domNode: node,\n text: isElementNode(node) ? undefined : node.data,\n diffType\n };\n}\n//# sourceMappingURL=d.mjs.map" + "source": "import Symbol from '../shim/Symbol';\n/**\n * The symbol identifier for a WNode type\n */\nexport const WNODE = Symbol('Identifier for a WNode.');\n/**\n * The symbol identifier for a VNode type\n */\nexport const VNODE = Symbol('Identifier for a VNode.');\n/**\n * The symbol identifier for a VNode type created using dom()\n */\nexport const DOMVNODE = Symbol('Identifier for a VNode created using existing dom.');\n/**\n * Helper function that returns true if the `DNode` is a `WNode` using the `type` property\n */\nexport function isWNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === WNODE);\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` using the `type` property\n */\nexport function isVNode(child) {\n return Boolean(child && typeof child !== 'string' && (child.type === VNODE || child.type === DOMVNODE));\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` created with `dom()` using the `type` property\n */\nexport function isDomVNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === DOMVNODE);\n}\nexport function isElementNode(value) {\n return !!value.tagName;\n}\nexport function decorate(dNodes, optionsOrModifier, predicate) {\n let shallow = false;\n let modifier;\n if (typeof optionsOrModifier === 'function') {\n modifier = optionsOrModifier;\n }\n else {\n modifier = optionsOrModifier.modifier;\n predicate = optionsOrModifier.predicate;\n shallow = optionsOrModifier.shallow || false;\n }\n let nodes = Array.isArray(dNodes) ? [...dNodes] : [dNodes];\n function breaker() {\n nodes = [];\n }\n while (nodes.length) {\n const node = nodes.shift();\n if (node) {\n if (!shallow && (isWNode(node) || isVNode(node)) && node.children) {\n nodes = [...nodes, ...node.children];\n }\n if (!predicate || predicate(node)) {\n modifier(node, breaker);\n }\n }\n }\n return dNodes;\n}\n/**\n * Wrapper function for calls to create a widget.\n */\nexport function w(widgetConstructor, properties, children = []) {\n return {\n children,\n widgetConstructor,\n properties,\n type: WNODE\n };\n}\nexport function v(tag, propertiesOrChildren = {}, children = undefined) {\n let properties = propertiesOrChildren;\n let deferredPropertiesCallback;\n if (Array.isArray(propertiesOrChildren)) {\n children = propertiesOrChildren;\n properties = {};\n }\n if (typeof properties === 'function') {\n deferredPropertiesCallback = properties;\n properties = {};\n }\n return {\n tag,\n deferredPropertiesCallback,\n children,\n properties,\n type: VNODE\n };\n}\n/**\n * Create a VNode for an existing DOM Node.\n */\nexport function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, children) {\n return {\n tag: isElementNode(node) ? node.tagName.toLowerCase() : '',\n properties: props,\n attributes: attrs,\n events: on,\n children,\n type: DOMVNODE,\n domNode: node,\n text: isElementNode(node) ? undefined : node.data,\n diffType\n };\n}\n//# sourceMappingURL=d.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", "index": 34, "index2": 29, "size": 311, @@ -1692,18 +1692,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "./../decorators/afterRender", "loc": "4:0-58" @@ -1721,9 +1721,9 @@ "source": "import { handleDecorator } from './handleDecorator';\nexport function afterRender(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('afterRender', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default afterRender;\n//# sourceMappingURL=afterRender.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "index": 41, "index2": 36, "size": 365, @@ -1735,18 +1735,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./decorators/alwaysRender", "loc": "8:0-57" @@ -1764,9 +1764,9 @@ "source": "import { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\nexport function alwaysRender() {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function () {\n this.invalidate();\n })(target);\n });\n}\nexport default alwaysRender;\n//# sourceMappingURL=alwaysRender.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", "index": 39, "index2": 32, "size": 331, @@ -1778,27 +1778,27 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "issuerId": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "issuerName": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "type": "harmony import", "userRequest": "./beforeProperties", "loc": "2:0-54" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/inject.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "type": "harmony import", "userRequest": "./beforeProperties", "loc": "3:0-54" @@ -1816,9 +1816,9 @@ "source": "import { handleDecorator } from './handleDecorator';\nexport function beforeProperties(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('beforeProperties', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default beforeProperties;\n//# sourceMappingURL=beforeProperties.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/customElement.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", "index": 12, "index2": 38, "size": 728, @@ -1843,8 +1843,8 @@ "module": "./src/menu-item/MenuItem.ts", "moduleName": "./src/menu-item/MenuItem.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/decorators/customElement", - "loc": "3:0-75" + "userRequest": "@dojo/framework/widget-core/decorators/customElement", + "loc": "3:0-85" } ], "usedExports": [ @@ -1886,12 +1886,12 @@ "depth": 0 }, { - "id": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", "index": 40, "index2": 34, - "size": 973, + "size": 1014, "cacheable": true, "built": true, "optional": false, @@ -1900,18 +1900,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../decorators/diffProperty", "loc": "5:0-60" @@ -1926,12 +1926,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { handleDecorator } from './handleDecorator';\n/**\n * Decorator that can be used to register a function as a specific property diff\n *\n * @param propertyName The name of the property of which the diff function is applied\n * @param diffType The diff type, default is DiffType.AUTO.\n * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM\n */\nexport function diffProperty(propertyName, diffFunction, reactionFunction) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null));\n target.addDecorator('registeredDiffProperty', propertyName);\n if (reactionFunction || propertyKey) {\n target.addDecorator('diffReaction', {\n propertyName,\n reaction: propertyKey ? target[propertyKey] : reactionFunction\n });\n }\n });\n}\nexport default diffProperty;\n//# sourceMappingURL=diffProperty.mjs.map" + "source": "import { handleDecorator } from './handleDecorator';\nimport { auto } from './../diff';\n/**\n * Decorator that can be used to register a function as a specific property diff\n *\n * @param propertyName The name of the property of which the diff function is applied\n * @param diffType The diff type, default is DiffType.AUTO.\n * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM\n */\nexport function diffProperty(propertyName, diffFunction = auto, reactionFunction) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null));\n target.addDecorator('registeredDiffProperty', propertyName);\n if (reactionFunction || propertyKey) {\n target.addDecorator('diffReaction', {\n propertyName,\n reaction: propertyKey ? target[propertyKey] : reactionFunction\n });\n }\n });\n}\nexport default diffProperty;\n//# sourceMappingURL=diffProperty.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/handleDecorator.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs", "index": 35, "index2": 28, "size": 512, @@ -1943,63 +1943,63 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../decorators/handleDecorator", "loc": "4:0-66" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "type": "harmony import", "userRequest": "./handleDecorator", - "loc": "1:0-52" + "loc": "2:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/inject.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", "type": "harmony import", "userRequest": "./handleDecorator", - "loc": "2:0-52" + "loc": "1:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" @@ -2017,9 +2017,9 @@ "source": "/**\n * Generic decorator handler to take care of whether or not the decorator was called at the class level\n * or the method level.\n *\n * @param handler\n */\nexport function handleDecorator(handler) {\n return function (target, propertyKey, descriptor) {\n if (typeof target === 'function') {\n handler(target.prototype, undefined);\n }\n else {\n handler(target, propertyKey);\n }\n };\n}\nexport default handleDecorator;\n//# sourceMappingURL=handleDecorator.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/inject.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "index": 38, "index2": 33, "size": 1532, @@ -2031,18 +2031,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../decorators/inject", "loc": "3:0-48" @@ -2057,12 +2057,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import WeakMap from '@dojo/shim/WeakMap';\nimport { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\n/**\n * Map of instances against registered injectors.\n */\nconst registeredInjectorsMap = new WeakMap();\n/**\n * Decorator retrieves an injector from an available registry using the name and\n * calls the `getProperties` function with the payload from the injector\n * and current properties with the the injected properties returned.\n *\n * @param InjectConfig the inject configuration\n */\nexport function inject({ name, getProperties }) {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function (properties) {\n const injectorItem = this.registry.getInjector(name);\n if (injectorItem) {\n const { injector, invalidator } = injectorItem;\n const registeredInjectors = registeredInjectorsMap.get(this) || [];\n if (registeredInjectors.length === 0) {\n registeredInjectorsMap.set(this, registeredInjectors);\n }\n if (registeredInjectors.indexOf(injectorItem) === -1) {\n this.own(invalidator.on('invalidate', () => {\n this.invalidate();\n }));\n registeredInjectors.push(injectorItem);\n }\n return getProperties(injector(), properties);\n }\n })(target);\n });\n}\nexport default inject;\n//# sourceMappingURL=inject.mjs.map" + "source": "import WeakMap from '../../shim/WeakMap';\nimport { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\n/**\n * Map of instances against registered injectors.\n */\nconst registeredInjectorsMap = new WeakMap();\n/**\n * Decorator retrieves an injector from an available registry using the name and\n * calls the `getProperties` function with the payload from the injector\n * and current properties with the the injected properties returned.\n *\n * @param InjectConfig the inject configuration\n */\nexport function inject({ name, getProperties }) {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function (properties) {\n const injectorItem = this.registry.getInjector(name);\n if (injectorItem) {\n const { injector, invalidator } = injectorItem;\n const registeredInjectors = registeredInjectorsMap.get(this) || [];\n if (registeredInjectors.length === 0) {\n registeredInjectorsMap.set(this, registeredInjectors);\n }\n if (registeredInjectors.indexOf(injectorItem) === -1) {\n this.own(invalidator.on('invalidate', () => {\n this.invalidate();\n }));\n registeredInjectors.push(injectorItem);\n }\n return getProperties(injector(), properties);\n }\n })(target);\n });\n}\nexport default inject;\n//# sourceMappingURL=inject.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/diff.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/diff.mjs", - "name": "./node_modules/@dojo/widget-core/diff.mjs", + "id": "./node_modules/@dojo/framework/widget-core/diff.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/diff.mjs", + "name": "./node_modules/@dojo/framework/widget-core/diff.mjs", "index": 20, "index2": 20, "size": 1930, @@ -2074,30 +2074,39 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./diff", "loc": "5:0-30" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../diff", "loc": "6:0-36" + }, + { + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "type": "harmony import", + "userRequest": "./../diff", + "loc": "2:0-33" } ], "usedExports": [ @@ -2116,12 +2125,12 @@ "source": "import { WIDGET_BASE_TYPE } from './Registry';\nfunction isObjectOrArray(value) {\n return Object.prototype.toString.call(value) === '[object Object]' || Array.isArray(value);\n}\nexport function always(previousProperty, newProperty) {\n return {\n changed: true,\n value: newProperty\n };\n}\nexport function ignore(previousProperty, newProperty) {\n return {\n changed: false,\n value: newProperty\n };\n}\nexport function reference(previousProperty, newProperty) {\n return {\n changed: previousProperty !== newProperty,\n value: newProperty\n };\n}\nexport function shallow(previousProperty, newProperty) {\n let changed = false;\n const validOldProperty = previousProperty && isObjectOrArray(previousProperty);\n const validNewProperty = newProperty && isObjectOrArray(newProperty);\n if (!validOldProperty || !validNewProperty) {\n return {\n changed: true,\n value: newProperty\n };\n }\n const previousKeys = Object.keys(previousProperty);\n const newKeys = Object.keys(newProperty);\n if (previousKeys.length !== newKeys.length) {\n changed = true;\n }\n else {\n changed = newKeys.some((key) => {\n return newProperty[key] !== previousProperty[key];\n });\n }\n return {\n changed,\n value: newProperty\n };\n}\nexport function auto(previousProperty, newProperty) {\n let result;\n if (typeof newProperty === 'function') {\n if (newProperty._type === WIDGET_BASE_TYPE) {\n result = reference(previousProperty, newProperty);\n }\n else {\n result = ignore(previousProperty, newProperty);\n }\n }\n else if (isObjectOrArray(newProperty)) {\n result = shallow(previousProperty, newProperty);\n }\n else {\n result = reference(previousProperty, newProperty);\n }\n return result;\n}\n//# sourceMappingURL=diff.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "name": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "id": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "name": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "index": 32, "index2": 30, - "size": 5852, + "size": 5683, "cacheable": true, "built": true, "optional": false, @@ -2130,18 +2139,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./mixins/Projector", "loc": "3:0-52" @@ -2158,15 +2167,15 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import * as tslib_1 from \"tslib\";\nimport { assign } from '@dojo/core/lang';\nimport cssTransitions from '../animations/cssTransitions';\nimport { afterRender } from './../decorators/afterRender';\nimport { v } from './../d';\nimport { dom } from './../vdom';\n/**\n * Represents the attach state of the projector\n */\nexport var ProjectorAttachState;\n(function (ProjectorAttachState) {\n ProjectorAttachState[ProjectorAttachState[\"Attached\"] = 1] = \"Attached\";\n ProjectorAttachState[ProjectorAttachState[\"Detached\"] = 2] = \"Detached\";\n})(ProjectorAttachState || (ProjectorAttachState = {}));\n/**\n * Attach type for the projector\n */\nexport var AttachType;\n(function (AttachType) {\n AttachType[AttachType[\"Append\"] = 1] = \"Append\";\n AttachType[AttachType[\"Merge\"] = 2] = \"Merge\";\n})(AttachType || (AttachType = {}));\nexport function ProjectorMixin(Base) {\n class Projector extends Base {\n constructor(...args) {\n super(...args);\n this._root = document.body;\n this._async = true;\n this._projectorProperties = {};\n this._projectionOptions = {\n transitions: cssTransitions\n };\n this.root = document.body;\n this.projectorState = ProjectorAttachState.Detached;\n }\n append(root) {\n const options = {\n type: AttachType.Append,\n root\n };\n return this._attach(options);\n }\n merge(root) {\n const options = {\n type: AttachType.Merge,\n root\n };\n return this._attach(options);\n }\n set root(root) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change root element');\n }\n this._root = root;\n }\n get root() {\n return this._root;\n }\n get async() {\n return this._async;\n }\n set async(async) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change async mode');\n }\n this._async = async;\n }\n sandbox(doc = document) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot create sandbox');\n }\n this._async = false;\n const previousRoot = this.root;\n /* free up the document fragment for GC */\n this.own({\n destroy: () => {\n this._root = previousRoot;\n }\n });\n this._attach({\n /* DocumentFragment is not assignable to Element, but provides everything needed to work */\n root: doc.createDocumentFragment(),\n type: AttachType.Append\n });\n }\n setChildren(children) {\n this.__setChildren__(children);\n }\n setProperties(properties) {\n this.__setProperties__(properties);\n }\n __setProperties__(properties) {\n if (this._projectorProperties && this._projectorProperties.registry !== properties.registry) {\n if (this._projectorProperties.registry) {\n this._projectorProperties.registry.destroy();\n }\n }\n this._projectorProperties = assign({}, properties);\n super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry });\n super.__setProperties__(properties);\n }\n toHtml() {\n if (this.projectorState !== ProjectorAttachState.Attached || !this._projection) {\n throw new Error('Projector is not attached, cannot return an HTML string of projection.');\n }\n return this._projection.domNode.childNodes[0].outerHTML;\n }\n afterRender(result) {\n let node = result;\n if (typeof result === 'string' || result === null || result === undefined) {\n node = v('span', {}, [result]);\n }\n return node;\n }\n destroy() {\n super.destroy();\n }\n _attach({ type, root }) {\n if (root) {\n this.root = root;\n }\n if (this._attachHandle) {\n return this._attachHandle;\n }\n this.projectorState = ProjectorAttachState.Attached;\n const handle = {\n destroy: () => {\n if (this.projectorState === ProjectorAttachState.Attached) {\n this._projection = undefined;\n this.projectorState = ProjectorAttachState.Detached;\n }\n }\n };\n this.own(handle);\n this._attachHandle = handle;\n this._projectionOptions = Object.assign({}, this._projectionOptions, { sync: !this._async });\n switch (type) {\n case AttachType.Append:\n this._projection = dom.append(this.root, this, this._projectionOptions);\n break;\n case AttachType.Merge:\n this._projection = dom.merge(this.root, this, this._projectionOptions);\n break;\n }\n return this._attachHandle;\n }\n }\n tslib_1.__decorate([\n afterRender(),\n tslib_1.__metadata(\"design:type\", Function),\n tslib_1.__metadata(\"design:paramtypes\", [Object]),\n tslib_1.__metadata(\"design:returntype\", void 0)\n ], Projector.prototype, \"afterRender\", null);\n return Projector;\n}\nexport default ProjectorMixin;\n//# sourceMappingURL=Projector.mjs.map" + "source": "import * as tslib_1 from \"tslib\";\nimport { assign } from '../../core/lang';\nimport cssTransitions from '../animations/cssTransitions';\nimport { afterRender } from './../decorators/afterRender';\nimport { v } from './../d';\nimport { dom } from './../vdom';\n/**\n * Represents the attach state of the projector\n */\nexport var ProjectorAttachState;\n(function (ProjectorAttachState) {\n ProjectorAttachState[ProjectorAttachState[\"Attached\"] = 1] = \"Attached\";\n ProjectorAttachState[ProjectorAttachState[\"Detached\"] = 2] = \"Detached\";\n})(ProjectorAttachState || (ProjectorAttachState = {}));\n/**\n * Attach type for the projector\n */\nexport var AttachType;\n(function (AttachType) {\n AttachType[AttachType[\"Append\"] = 1] = \"Append\";\n AttachType[AttachType[\"Merge\"] = 2] = \"Merge\";\n})(AttachType || (AttachType = {}));\nexport function ProjectorMixin(Base) {\n class Projector extends Base {\n constructor(...args) {\n super(...args);\n this._root = document.body;\n this._async = true;\n this._projectorProperties = {};\n this._projectionOptions = {\n transitions: cssTransitions\n };\n this.root = document.body;\n this.projectorState = ProjectorAttachState.Detached;\n }\n append(root) {\n const options = {\n type: AttachType.Append,\n root\n };\n return this._attach(options);\n }\n merge(root) {\n const options = {\n type: AttachType.Merge,\n root\n };\n return this._attach(options);\n }\n set root(root) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change root element');\n }\n this._root = root;\n }\n get root() {\n return this._root;\n }\n get async() {\n return this._async;\n }\n set async(async) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change async mode');\n }\n this._async = async;\n }\n sandbox(doc = document) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot create sandbox');\n }\n this._async = false;\n const previousRoot = this.root;\n /* free up the document fragment for GC */\n this.own({\n destroy: () => {\n this._root = previousRoot;\n }\n });\n this._attach({\n /* DocumentFragment is not assignable to Element, but provides everything needed to work */\n root: doc.createDocumentFragment(),\n type: AttachType.Append\n });\n }\n setChildren(children) {\n this.__setChildren__(children);\n }\n setProperties(properties) {\n this.__setProperties__(properties);\n }\n __setProperties__(properties) {\n if (this._projectorProperties && this._projectorProperties.registry !== properties.registry) {\n if (this._projectorProperties.registry) {\n this._projectorProperties.registry.destroy();\n }\n }\n this._projectorProperties = assign({}, properties);\n super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry });\n super.__setProperties__(properties);\n }\n toHtml() {\n if (this.projectorState !== ProjectorAttachState.Attached || !this._projection) {\n throw new Error('Projector is not attached, cannot return an HTML string of projection.');\n }\n return this._projection.domNode.childNodes[0].outerHTML;\n }\n afterRender(result) {\n let node = result;\n if (typeof result === 'string' || result === null || result === undefined) {\n node = v('span', {}, [result]);\n }\n return node;\n }\n destroy() {\n super.destroy();\n }\n _attach({ type, root }) {\n if (root) {\n this.root = root;\n }\n if (this._attachHandle) {\n return this._attachHandle;\n }\n this.projectorState = ProjectorAttachState.Attached;\n const handle = {\n destroy: () => {\n if (this.projectorState === ProjectorAttachState.Attached) {\n this._projection = undefined;\n this.projectorState = ProjectorAttachState.Detached;\n }\n }\n };\n this.own(handle);\n this._attachHandle = handle;\n this._projectionOptions = Object.assign({}, this._projectionOptions, { sync: !this._async });\n switch (type) {\n case AttachType.Append:\n this._projection = dom.append(this.root, this, this._projectionOptions);\n break;\n case AttachType.Merge:\n this._projection = dom.merge(this.root, this, this._projectionOptions);\n break;\n }\n return this._attachHandle;\n }\n }\n tslib_1.__decorate([\n afterRender()\n ], Projector.prototype, \"afterRender\", null);\n return Projector;\n}\nexport default ProjectorMixin;\n//# sourceMappingURL=Projector.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "name": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "id": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "name": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "index": 36, "index2": 35, - "size": 5320, + "size": 5157, "cacheable": true, "built": true, "optional": false, @@ -2175,18 +2184,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./mixins/Themed", "loc": "7:0-56" @@ -2197,8 +2206,8 @@ "module": "./src/menu-item/MenuItem.ts", "moduleName": "./src/menu-item/MenuItem.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/mixins/Themed", - "loc": "4:0-69" + "userRequest": "@dojo/framework/widget-core/mixins/Themed", + "loc": "4:0-79" } ], "usedExports": [ @@ -2215,15 +2224,15 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import * as tslib_1 from \"tslib\";\nimport { Injector } from './../Injector';\nimport { inject } from './../decorators/inject';\nimport { handleDecorator } from './../decorators/handleDecorator';\nimport { diffProperty } from './../decorators/diffProperty';\nimport { shallow } from './../diff';\nconst THEME_KEY = ' _key';\nexport const INJECTED_THEME_KEY = Symbol('theme');\n/**\n * Decorator for base css classes\n */\nexport function theme(theme) {\n return handleDecorator((target) => {\n target.addDecorator('baseThemeClasses', theme);\n });\n}\n/**\n * Creates a reverse lookup for the classes passed in via the `theme` function.\n *\n * @param classes The baseClasses object\n * @requires\n */\nfunction createThemeClassesLookup(classes) {\n return classes.reduce((currentClassNames, baseClass) => {\n Object.keys(baseClass).forEach((key) => {\n currentClassNames[baseClass[key]] = key;\n });\n return currentClassNames;\n }, {});\n}\n/**\n * Convenience function that is given a theme and an optional registry, the theme\n * injector is defined against the registry, returning the theme.\n *\n * @param theme the theme to set\n * @param themeRegistry registry to define the theme injector against. Defaults\n * to the global registry\n *\n * @returns the theme injector used to set the theme\n */\nexport function registerThemeInjector(theme, themeRegistry) {\n const themeInjector = new Injector(theme);\n themeRegistry.defineInjector(INJECTED_THEME_KEY, (invalidator) => {\n themeInjector.setInvalidator(invalidator);\n return () => themeInjector.get();\n });\n return themeInjector;\n}\n/**\n * Function that returns a class decorated with with Themed functionality\n */\nexport function ThemedMixin(Base) {\n let Themed = class Themed extends Base {\n constructor() {\n super(...arguments);\n /**\n * Registered base theme keys\n */\n this._registeredBaseThemeKeys = [];\n /**\n * Indicates if classes meta data need to be calculated.\n */\n this._recalculateClasses = true;\n /**\n * Loaded theme\n */\n this._theme = {};\n }\n theme(classes) {\n if (this._recalculateClasses) {\n this._recalculateThemeClasses();\n }\n if (Array.isArray(classes)) {\n return classes.map((className) => this._getThemeClass(className));\n }\n return this._getThemeClass(classes);\n }\n /**\n * Function fired when `theme` or `extraClasses` are changed.\n */\n onPropertiesChanged() {\n this._recalculateClasses = true;\n }\n _getThemeClass(className) {\n if (className === undefined || className === null) {\n return className;\n }\n const extraClasses = this.properties.extraClasses || {};\n const themeClassName = this._baseThemeClassesReverseLookup[className];\n let resultClassNames = [];\n if (!themeClassName) {\n console.warn(`Class name: '${className}' not found in theme`);\n return null;\n }\n if (extraClasses[themeClassName]) {\n resultClassNames.push(extraClasses[themeClassName]);\n }\n if (this._theme[themeClassName]) {\n resultClassNames.push(this._theme[themeClassName]);\n }\n else {\n resultClassNames.push(this._registeredBaseTheme[themeClassName]);\n }\n return resultClassNames.join(' ');\n }\n _recalculateThemeClasses() {\n const { theme = {} } = this.properties;\n const baseThemes = this.getDecorator('baseThemeClasses');\n if (!this._registeredBaseTheme) {\n this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => {\n const _a = THEME_KEY, key = baseTheme[_a], classes = tslib_1.__rest(baseTheme, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n this._registeredBaseThemeKeys.push(key);\n return Object.assign({}, finalBaseTheme, classes);\n }, {});\n this._baseThemeClassesReverseLookup = createThemeClassesLookup(baseThemes);\n }\n this._theme = this._registeredBaseThemeKeys.reduce((baseTheme, themeKey) => {\n return Object.assign({}, baseTheme, theme[themeKey]);\n }, {});\n this._recalculateClasses = false;\n }\n };\n tslib_1.__decorate([\n diffProperty('theme', shallow),\n diffProperty('extraClasses', shallow),\n tslib_1.__metadata(\"design:type\", Function),\n tslib_1.__metadata(\"design:paramtypes\", []),\n tslib_1.__metadata(\"design:returntype\", void 0)\n ], Themed.prototype, \"onPropertiesChanged\", null);\n Themed = tslib_1.__decorate([\n inject({\n name: INJECTED_THEME_KEY,\n getProperties: (theme, properties) => {\n if (!properties.theme) {\n return { theme };\n }\n return {};\n }\n })\n ], Themed);\n return Themed;\n}\nexport default ThemedMixin;\n//# sourceMappingURL=Themed.mjs.map" + "source": "import * as tslib_1 from \"tslib\";\nimport { Injector } from './../Injector';\nimport { inject } from './../decorators/inject';\nimport { handleDecorator } from './../decorators/handleDecorator';\nimport { diffProperty } from './../decorators/diffProperty';\nimport { shallow } from './../diff';\nconst THEME_KEY = ' _key';\nexport const INJECTED_THEME_KEY = Symbol('theme');\n/**\n * Decorator for base css classes\n */\nexport function theme(theme) {\n return handleDecorator((target) => {\n target.addDecorator('baseThemeClasses', theme);\n });\n}\n/**\n * Creates a reverse lookup for the classes passed in via the `theme` function.\n *\n * @param classes The baseClasses object\n * @requires\n */\nfunction createThemeClassesLookup(classes) {\n return classes.reduce((currentClassNames, baseClass) => {\n Object.keys(baseClass).forEach((key) => {\n currentClassNames[baseClass[key]] = key;\n });\n return currentClassNames;\n }, {});\n}\n/**\n * Convenience function that is given a theme and an optional registry, the theme\n * injector is defined against the registry, returning the theme.\n *\n * @param theme the theme to set\n * @param themeRegistry registry to define the theme injector against. Defaults\n * to the global registry\n *\n * @returns the theme injector used to set the theme\n */\nexport function registerThemeInjector(theme, themeRegistry) {\n const themeInjector = new Injector(theme);\n themeRegistry.defineInjector(INJECTED_THEME_KEY, (invalidator) => {\n themeInjector.setInvalidator(invalidator);\n return () => themeInjector.get();\n });\n return themeInjector;\n}\n/**\n * Function that returns a class decorated with with Themed functionality\n */\nexport function ThemedMixin(Base) {\n let Themed = class Themed extends Base {\n constructor() {\n super(...arguments);\n /**\n * Registered base theme keys\n */\n this._registeredBaseThemeKeys = [];\n /**\n * Indicates if classes meta data need to be calculated.\n */\n this._recalculateClasses = true;\n /**\n * Loaded theme\n */\n this._theme = {};\n }\n theme(classes) {\n if (this._recalculateClasses) {\n this._recalculateThemeClasses();\n }\n if (Array.isArray(classes)) {\n return classes.map((className) => this._getThemeClass(className));\n }\n return this._getThemeClass(classes);\n }\n /**\n * Function fired when `theme` or `extraClasses` are changed.\n */\n onPropertiesChanged() {\n this._recalculateClasses = true;\n }\n _getThemeClass(className) {\n if (className === undefined || className === null) {\n return className;\n }\n const extraClasses = this.properties.extraClasses || {};\n const themeClassName = this._baseThemeClassesReverseLookup[className];\n let resultClassNames = [];\n if (!themeClassName) {\n console.warn(`Class name: '${className}' not found in theme`);\n return null;\n }\n if (extraClasses[themeClassName]) {\n resultClassNames.push(extraClasses[themeClassName]);\n }\n if (this._theme[themeClassName]) {\n resultClassNames.push(this._theme[themeClassName]);\n }\n else {\n resultClassNames.push(this._registeredBaseTheme[themeClassName]);\n }\n return resultClassNames.join(' ');\n }\n _recalculateThemeClasses() {\n const { theme = {} } = this.properties;\n const baseThemes = this.getDecorator('baseThemeClasses');\n if (!this._registeredBaseTheme) {\n this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => {\n const _a = THEME_KEY, key = baseTheme[_a], classes = tslib_1.__rest(baseTheme, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n this._registeredBaseThemeKeys.push(key);\n return Object.assign({}, finalBaseTheme, classes);\n }, {});\n this._baseThemeClassesReverseLookup = createThemeClassesLookup(baseThemes);\n }\n this._theme = this._registeredBaseThemeKeys.reduce((baseTheme, themeKey) => {\n return Object.assign({}, baseTheme, theme[themeKey]);\n }, {});\n this._recalculateClasses = false;\n }\n };\n tslib_1.__decorate([\n diffProperty('theme', shallow),\n diffProperty('extraClasses', shallow)\n ], Themed.prototype, \"onPropertiesChanged\", null);\n Themed = tslib_1.__decorate([\n inject({\n name: INJECTED_THEME_KEY,\n getProperties: (theme, properties) => {\n if (!properties.theme) {\n return { theme };\n }\n return {};\n }\n })\n ], Themed);\n return Themed;\n}\nexport default ThemedMixin;\n//# sourceMappingURL=Themed.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "name": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "id": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "name": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "index": 13, "index2": 37, - "size": 9124, + "size": 9118, "cacheable": true, "built": true, "optional": false, @@ -2245,14 +2254,14 @@ "module": "./node_modules/imports-loader?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js", "moduleName": "./node_modules/imports-loader?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js", "type": "cjs require", - "userRequest": "@dojo/widget-core/registerCustomElement", - "loc": "4:28-78" + "userRequest": "@dojo/framework/widget-core/registerCustomElement", + "loc": "4:28-88" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/customElement.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", "type": "harmony import", "userRequest": "../registerCustomElement", "loc": "1:0-66" @@ -2268,15 +2277,15 @@ ], "optimizationBailout": [], "depth": 2, - "source": "import * as tslib_1 from \"tslib\";\nimport { WidgetBase, noBind } from './WidgetBase';\nimport { ProjectorMixin } from './mixins/Projector';\nimport { from } from '@dojo/shim/array';\nimport { w, dom } from './d';\nimport global from '@dojo/shim/global';\nimport { registerThemeInjector } from './mixins/Themed';\nimport { alwaysRender } from './decorators/alwaysRender';\nexport var CustomElementChildType;\n(function (CustomElementChildType) {\n CustomElementChildType[\"DOJO\"] = \"DOJO\";\n CustomElementChildType[\"NODE\"] = \"NODE\";\n CustomElementChildType[\"TEXT\"] = \"TEXT\";\n})(CustomElementChildType || (CustomElementChildType = {}));\nexport function DomToWidgetWrapper(domNode) {\n let DomToWidgetWrapper = class DomToWidgetWrapper extends WidgetBase {\n render() {\n const properties = Object.keys(this.properties).reduce((props, key) => {\n const value = this.properties[key];\n if (key.indexOf('on') === 0) {\n key = `__${key}`;\n }\n props[key] = value;\n return props;\n }, {});\n return dom({ node: domNode, props: properties, diffType: 'dom' });\n }\n static get domNode() {\n return domNode;\n }\n };\n DomToWidgetWrapper = tslib_1.__decorate([\n alwaysRender()\n ], DomToWidgetWrapper);\n return DomToWidgetWrapper;\n}\nexport function create(descriptor, WidgetConstructor) {\n const { attributes, childType, registryFactory } = descriptor;\n const attributeMap = {};\n attributes.forEach((propertyName) => {\n const attributeName = propertyName.toLowerCase();\n attributeMap[attributeName] = propertyName;\n });\n return class extends HTMLElement {\n constructor() {\n super(...arguments);\n this._properties = {};\n this._children = [];\n this._eventProperties = {};\n this._initialised = false;\n }\n connectedCallback() {\n if (this._initialised) {\n return;\n }\n const domProperties = {};\n const { attributes, properties, events } = descriptor;\n this._properties = Object.assign({}, this._properties, this._attributesToProperties(attributes));\n [...attributes, ...properties].forEach((propertyName) => {\n const value = this[propertyName];\n const filteredPropertyName = propertyName.replace(/^on/, '__');\n if (value !== undefined) {\n this._properties[propertyName] = value;\n }\n if (filteredPropertyName !== propertyName) {\n domProperties[filteredPropertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n }\n domProperties[propertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n });\n events.forEach((propertyName) => {\n const eventName = propertyName.replace(/^on/, '').toLowerCase();\n const filteredPropertyName = propertyName.replace(/^on/, '__on');\n domProperties[filteredPropertyName] = {\n get: () => this._getEventProperty(propertyName),\n set: (value) => this._setEventProperty(propertyName, value)\n };\n this._eventProperties[propertyName] = undefined;\n this._properties[propertyName] = (...args) => {\n const eventCallback = this._getEventProperty(propertyName);\n if (typeof eventCallback === 'function') {\n eventCallback(...args);\n }\n this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: false,\n detail: args\n }));\n };\n });\n Object.defineProperties(this, domProperties);\n const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children;\n from(children).forEach((childNode) => {\n if (childType === CustomElementChildType.DOJO) {\n childNode.addEventListener('dojo-ce-render', () => this._render());\n childNode.addEventListener('dojo-ce-connected', () => this._render());\n this._children.push(DomToWidgetWrapper(childNode));\n }\n else {\n this._children.push(dom({ node: childNode, diffType: 'dom' }));\n }\n });\n this.addEventListener('dojo-ce-connected', (e) => this._childConnected(e));\n const widgetProperties = this._properties;\n const renderChildren = () => this.__children__();\n const Wrapper = class extends WidgetBase {\n render() {\n return w(WidgetConstructor, widgetProperties, renderChildren());\n }\n };\n const registry = registryFactory();\n const themeContext = registerThemeInjector(this._getTheme(), registry);\n global.addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme()));\n const Projector = ProjectorMixin(Wrapper);\n this._projector = new Projector();\n this._projector.setProperties({ registry });\n this._projector.append(this);\n this._initialised = true;\n this.dispatchEvent(new CustomEvent('dojo-ce-connected', {\n bubbles: true,\n detail: this\n }));\n }\n _getTheme() {\n if (global && global.dojoce && global.dojoce.theme) {\n return global.dojoce.themes[global.dojoce.theme];\n }\n }\n _childConnected(e) {\n const node = e.detail;\n if (node.parentNode === this) {\n const exists = this._children.some((child) => child.domNode === node);\n if (!exists) {\n node.addEventListener('dojo-ce-render', () => this._render());\n this._children.push(DomToWidgetWrapper(node));\n this._render();\n }\n }\n }\n _render() {\n if (this._projector) {\n this._projector.invalidate();\n this.dispatchEvent(new CustomEvent('dojo-ce-render', {\n bubbles: false,\n detail: this\n }));\n }\n }\n __properties__() {\n return Object.assign({}, this._properties, this._eventProperties);\n }\n __children__() {\n if (childType === CustomElementChildType.DOJO) {\n return this._children.filter((Child) => Child.domNode.isWidget).map((Child) => {\n const { domNode } = Child;\n return w(Child, Object.assign({}, domNode.__properties__()), [...domNode.__children__()]);\n });\n }\n else {\n return this._children;\n }\n }\n attributeChangedCallback(name, oldValue, value) {\n const propertyName = attributeMap[name];\n this._setProperty(propertyName, value);\n }\n _setEventProperty(propertyName, value) {\n this._eventProperties[propertyName] = value;\n }\n _getEventProperty(propertyName) {\n return this._eventProperties[propertyName];\n }\n _setProperty(propertyName, value) {\n if (typeof value === 'function') {\n value[noBind] = true;\n }\n this._properties[propertyName] = value;\n this._render();\n }\n _getProperty(propertyName) {\n return this._properties[propertyName];\n }\n _attributesToProperties(attributes) {\n return attributes.reduce((properties, propertyName) => {\n const attributeName = propertyName.toLowerCase();\n const value = this.getAttribute(attributeName);\n if (value !== null) {\n properties[propertyName] = value;\n }\n return properties;\n }, {});\n }\n static get observedAttributes() {\n return Object.keys(attributeMap);\n }\n get isWidget() {\n return true;\n }\n };\n}\nexport function register(WidgetConstructor) {\n const descriptor = WidgetConstructor.prototype && WidgetConstructor.prototype.__customElementDescriptor;\n if (!descriptor) {\n throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?');\n }\n global.customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor));\n}\nexport default register;\n//# sourceMappingURL=registerCustomElement.mjs.map" + "source": "import * as tslib_1 from \"tslib\";\nimport { WidgetBase, noBind } from './WidgetBase';\nimport { ProjectorMixin } from './mixins/Projector';\nimport { from } from '../shim/array';\nimport { w, dom } from './d';\nimport global from '../shim/global';\nimport { registerThemeInjector } from './mixins/Themed';\nimport { alwaysRender } from './decorators/alwaysRender';\nexport var CustomElementChildType;\n(function (CustomElementChildType) {\n CustomElementChildType[\"DOJO\"] = \"DOJO\";\n CustomElementChildType[\"NODE\"] = \"NODE\";\n CustomElementChildType[\"TEXT\"] = \"TEXT\";\n})(CustomElementChildType || (CustomElementChildType = {}));\nexport function DomToWidgetWrapper(domNode) {\n let DomToWidgetWrapper = class DomToWidgetWrapper extends WidgetBase {\n render() {\n const properties = Object.keys(this.properties).reduce((props, key) => {\n const value = this.properties[key];\n if (key.indexOf('on') === 0) {\n key = `__${key}`;\n }\n props[key] = value;\n return props;\n }, {});\n return dom({ node: domNode, props: properties, diffType: 'dom' });\n }\n static get domNode() {\n return domNode;\n }\n };\n DomToWidgetWrapper = tslib_1.__decorate([\n alwaysRender()\n ], DomToWidgetWrapper);\n return DomToWidgetWrapper;\n}\nexport function create(descriptor, WidgetConstructor) {\n const { attributes, childType, registryFactory } = descriptor;\n const attributeMap = {};\n attributes.forEach((propertyName) => {\n const attributeName = propertyName.toLowerCase();\n attributeMap[attributeName] = propertyName;\n });\n return class extends HTMLElement {\n constructor() {\n super(...arguments);\n this._properties = {};\n this._children = [];\n this._eventProperties = {};\n this._initialised = false;\n }\n connectedCallback() {\n if (this._initialised) {\n return;\n }\n const domProperties = {};\n const { attributes, properties, events } = descriptor;\n this._properties = Object.assign({}, this._properties, this._attributesToProperties(attributes));\n [...attributes, ...properties].forEach((propertyName) => {\n const value = this[propertyName];\n const filteredPropertyName = propertyName.replace(/^on/, '__');\n if (value !== undefined) {\n this._properties[propertyName] = value;\n }\n if (filteredPropertyName !== propertyName) {\n domProperties[filteredPropertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n }\n domProperties[propertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n });\n events.forEach((propertyName) => {\n const eventName = propertyName.replace(/^on/, '').toLowerCase();\n const filteredPropertyName = propertyName.replace(/^on/, '__on');\n domProperties[filteredPropertyName] = {\n get: () => this._getEventProperty(propertyName),\n set: (value) => this._setEventProperty(propertyName, value)\n };\n this._eventProperties[propertyName] = undefined;\n this._properties[propertyName] = (...args) => {\n const eventCallback = this._getEventProperty(propertyName);\n if (typeof eventCallback === 'function') {\n eventCallback(...args);\n }\n this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: false,\n detail: args\n }));\n };\n });\n Object.defineProperties(this, domProperties);\n const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children;\n from(children).forEach((childNode) => {\n if (childType === CustomElementChildType.DOJO) {\n childNode.addEventListener('dojo-ce-render', () => this._render());\n childNode.addEventListener('dojo-ce-connected', () => this._render());\n this._children.push(DomToWidgetWrapper(childNode));\n }\n else {\n this._children.push(dom({ node: childNode, diffType: 'dom' }));\n }\n });\n this.addEventListener('dojo-ce-connected', (e) => this._childConnected(e));\n const widgetProperties = this._properties;\n const renderChildren = () => this.__children__();\n const Wrapper = class extends WidgetBase {\n render() {\n return w(WidgetConstructor, widgetProperties, renderChildren());\n }\n };\n const registry = registryFactory();\n const themeContext = registerThemeInjector(this._getTheme(), registry);\n global.addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme()));\n const Projector = ProjectorMixin(Wrapper);\n this._projector = new Projector();\n this._projector.setProperties({ registry });\n this._projector.append(this);\n this._initialised = true;\n this.dispatchEvent(new CustomEvent('dojo-ce-connected', {\n bubbles: true,\n detail: this\n }));\n }\n _getTheme() {\n if (global && global.dojoce && global.dojoce.theme) {\n return global.dojoce.themes[global.dojoce.theme];\n }\n }\n _childConnected(e) {\n const node = e.detail;\n if (node.parentNode === this) {\n const exists = this._children.some((child) => child.domNode === node);\n if (!exists) {\n node.addEventListener('dojo-ce-render', () => this._render());\n this._children.push(DomToWidgetWrapper(node));\n this._render();\n }\n }\n }\n _render() {\n if (this._projector) {\n this._projector.invalidate();\n this.dispatchEvent(new CustomEvent('dojo-ce-render', {\n bubbles: false,\n detail: this\n }));\n }\n }\n __properties__() {\n return Object.assign({}, this._properties, this._eventProperties);\n }\n __children__() {\n if (childType === CustomElementChildType.DOJO) {\n return this._children.filter((Child) => Child.domNode.isWidget).map((Child) => {\n const { domNode } = Child;\n return w(Child, Object.assign({}, domNode.__properties__()), [...domNode.__children__()]);\n });\n }\n else {\n return this._children;\n }\n }\n attributeChangedCallback(name, oldValue, value) {\n const propertyName = attributeMap[name];\n this._setProperty(propertyName, value);\n }\n _setEventProperty(propertyName, value) {\n this._eventProperties[propertyName] = value;\n }\n _getEventProperty(propertyName) {\n return this._eventProperties[propertyName];\n }\n _setProperty(propertyName, value) {\n if (typeof value === 'function') {\n value[noBind] = true;\n }\n this._properties[propertyName] = value;\n this._render();\n }\n _getProperty(propertyName) {\n return this._properties[propertyName];\n }\n _attributesToProperties(attributes) {\n return attributes.reduce((properties, propertyName) => {\n const attributeName = propertyName.toLowerCase();\n const value = this.getAttribute(attributeName);\n if (value !== null) {\n properties[propertyName] = value;\n }\n return properties;\n }, {});\n }\n static get observedAttributes() {\n return Object.keys(attributeMap);\n }\n get isWidget() {\n return true;\n }\n };\n}\nexport function register(WidgetConstructor) {\n const descriptor = WidgetConstructor.prototype && WidgetConstructor.prototype.__customElementDescriptor;\n if (!descriptor) {\n throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?');\n }\n global.customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor));\n}\nexport default register;\n//# sourceMappingURL=registerCustomElement.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/vdom.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/vdom.mjs", - "name": "./node_modules/@dojo/widget-core/vdom.mjs", + "id": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/vdom.mjs", + "name": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "index": 29, "index2": 25, - "size": 38814, + "size": 39966, "cacheable": true, "built": true, "optional": false, @@ -2285,27 +2294,27 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./vdom", "loc": "8:0-43" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "./../vdom", "loc": "6:0-32" @@ -2324,7 +2333,7 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import global from '@dojo/shim/global';\nimport { from as arrayFrom } from '@dojo/shim/array';\nimport { isWNode, isVNode, isDomVNode, VNODE, WNODE } from './d';\nimport { isWidgetBaseConstructor } from './Registry';\nimport WeakMap from '@dojo/shim/WeakMap';\nconst NAMESPACE_W3 = 'http://www.w3.org/';\nconst NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg';\nconst NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink';\nconst emptyArray = [];\nexport const widgetInstanceMap = new WeakMap();\nconst instanceMap = new WeakMap();\nconst projectorStateMap = new WeakMap();\nfunction same(dnode1, dnode2) {\n if (isVNode(dnode1) && isVNode(dnode2)) {\n if (isDomVNode(dnode1) || isDomVNode(dnode2)) {\n if (dnode1.domNode !== dnode2.domNode) {\n return false;\n }\n }\n if (dnode1.tag !== dnode2.tag) {\n return false;\n }\n if (dnode1.properties.key !== dnode2.properties.key) {\n return false;\n }\n return true;\n }\n else if (isWNode(dnode1) && isWNode(dnode2)) {\n if (dnode1.instance === undefined && typeof dnode2.widgetConstructor === 'string') {\n return false;\n }\n if (dnode1.widgetConstructor !== dnode2.widgetConstructor) {\n return false;\n }\n if (dnode1.properties.key !== dnode2.properties.key) {\n return false;\n }\n return true;\n }\n return false;\n}\nconst missingTransition = function () {\n throw new Error('Provide a transitions object to the projectionOptions to do animations');\n};\nfunction getProjectionOptions(projectorOptions, projectorInstance) {\n const defaults = {\n namespace: undefined,\n styleApplyer: function (domNode, styleName, value) {\n domNode.style[styleName] = value;\n },\n transitions: {\n enter: missingTransition,\n exit: missingTransition\n },\n depth: 0,\n merge: false,\n sync: false,\n projectorInstance\n };\n return Object.assign({}, defaults, projectorOptions);\n}\nfunction checkStyleValue(styleValue) {\n if (typeof styleValue !== 'string') {\n throw new Error('Style values must be strings');\n }\n}\nfunction updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n const eventMap = projectorState.nodeMap.get(domNode) || new WeakMap();\n if (previousValue) {\n const previousEvent = eventMap.get(previousValue);\n domNode.removeEventListener(eventName, previousEvent);\n }\n let callback = currentValue.bind(bind);\n if (eventName === 'input') {\n callback = function (evt) {\n currentValue.call(this, evt);\n evt.target['oninput-value'] = evt.target.value;\n }.bind(bind);\n }\n domNode.addEventListener(eventName, callback);\n eventMap.set(currentValue, callback);\n projectorState.nodeMap.set(domNode, eventMap);\n}\nfunction addClasses(domNode, classes) {\n if (classes) {\n const classNames = classes.split(' ');\n for (let i = 0; i < classNames.length; i++) {\n domNode.classList.add(classNames[i]);\n }\n }\n}\nfunction removeClasses(domNode, classes) {\n if (classes) {\n const classNames = classes.split(' ');\n for (let i = 0; i < classNames.length; i++) {\n domNode.classList.remove(classNames[i]);\n }\n }\n}\nfunction buildPreviousProperties(domNode, previous, current) {\n const { diffType, properties, attributes } = current;\n if (!diffType || diffType === 'vdom') {\n return { properties: previous.properties, attributes: previous.attributes, events: previous.events };\n }\n else if (diffType === 'none') {\n return { properties: {}, attributes: previous.attributes ? {} : undefined, events: previous.events };\n }\n let newProperties = {\n properties: {}\n };\n if (attributes) {\n newProperties.attributes = {};\n newProperties.events = previous.events;\n Object.keys(properties).forEach((propName) => {\n newProperties.properties[propName] = domNode[propName];\n });\n Object.keys(attributes).forEach((attrName) => {\n newProperties.attributes[attrName] = domNode.getAttribute(attrName);\n });\n return newProperties;\n }\n newProperties.properties = Object.keys(properties).reduce((props, property) => {\n props[property] = domNode.getAttribute(property) || domNode[property];\n return props;\n }, {});\n return newProperties;\n}\nfunction focusNode(propValue, previousValue, domNode, projectionOptions) {\n let result;\n if (typeof propValue === 'function') {\n result = propValue();\n }\n else {\n result = propValue && !previousValue;\n }\n if (result === true) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectorState.deferredRenderCallbacks.push(() => {\n domNode.focus();\n });\n }\n}\nfunction removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions, onlyEvents = false) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n const eventMap = projectorState.nodeMap.get(domNode);\n if (eventMap) {\n Object.keys(previousProperties).forEach((propName) => {\n const isEvent = propName.substr(0, 2) === 'on' || onlyEvents;\n const eventName = onlyEvents ? propName : propName.substr(2);\n if (isEvent && !properties[propName]) {\n const eventCallback = eventMap.get(previousProperties[propName]);\n if (eventCallback) {\n domNode.removeEventListener(eventName, eventCallback);\n }\n }\n });\n }\n}\nfunction updateAttribute(domNode, attrName, attrValue, projectionOptions) {\n if (projectionOptions.namespace === NAMESPACE_SVG && attrName === 'href') {\n domNode.setAttributeNS(NAMESPACE_XLINK, attrName, attrValue);\n }\n else if ((attrName === 'role' && attrValue === '') || attrValue === undefined) {\n domNode.removeAttribute(attrName);\n }\n else {\n domNode.setAttribute(attrName, attrValue);\n }\n}\nfunction updateAttributes(domNode, previousAttributes, attributes, projectionOptions) {\n const attrNames = Object.keys(attributes);\n const attrCount = attrNames.length;\n for (let i = 0; i < attrCount; i++) {\n const attrName = attrNames[i];\n const attrValue = attributes[attrName];\n const previousAttrValue = previousAttributes[attrName];\n if (attrValue !== previousAttrValue) {\n updateAttribute(domNode, attrName, attrValue, projectionOptions);\n }\n }\n}\nfunction updateProperties(domNode, previousProperties, properties, projectionOptions, includesEventsAndAttributes = true) {\n let propertiesUpdated = false;\n const propNames = Object.keys(properties);\n const propCount = propNames.length;\n if (propNames.indexOf('classes') === -1 && previousProperties.classes) {\n if (Array.isArray(previousProperties.classes)) {\n for (let i = 0; i < previousProperties.classes.length; i++) {\n removeClasses(domNode, previousProperties.classes[i]);\n }\n }\n else {\n removeClasses(domNode, previousProperties.classes);\n }\n }\n includesEventsAndAttributes && removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions);\n for (let i = 0; i < propCount; i++) {\n const propName = propNames[i];\n let propValue = properties[propName];\n const previousValue = previousProperties[propName];\n if (propName === 'classes') {\n const previousClasses = Array.isArray(previousValue) ? previousValue : [previousValue];\n const currentClasses = Array.isArray(propValue) ? propValue : [propValue];\n if (previousClasses && previousClasses.length > 0) {\n if (!propValue || propValue.length === 0) {\n for (let i = 0; i < previousClasses.length; i++) {\n removeClasses(domNode, previousClasses[i]);\n }\n }\n else {\n const newClasses = [...currentClasses];\n for (let i = 0; i < previousClasses.length; i++) {\n const previousClassName = previousClasses[i];\n if (previousClassName) {\n const classIndex = newClasses.indexOf(previousClassName);\n if (classIndex === -1) {\n removeClasses(domNode, previousClassName);\n }\n else {\n newClasses.splice(classIndex, 1);\n }\n }\n }\n for (let i = 0; i < newClasses.length; i++) {\n addClasses(domNode, newClasses[i]);\n }\n }\n }\n else {\n for (let i = 0; i < currentClasses.length; i++) {\n addClasses(domNode, currentClasses[i]);\n }\n }\n }\n else if (propName === 'focus') {\n focusNode(propValue, previousValue, domNode, projectionOptions);\n }\n else if (propName === 'styles') {\n const styleNames = Object.keys(propValue);\n const styleCount = styleNames.length;\n for (let j = 0; j < styleCount; j++) {\n const styleName = styleNames[j];\n const newStyleValue = propValue[styleName];\n const oldStyleValue = previousValue && previousValue[styleName];\n if (newStyleValue === oldStyleValue) {\n continue;\n }\n propertiesUpdated = true;\n if (newStyleValue) {\n checkStyleValue(newStyleValue);\n projectionOptions.styleApplyer(domNode, styleName, newStyleValue);\n }\n else {\n projectionOptions.styleApplyer(domNode, styleName, '');\n }\n }\n }\n else {\n if (!propValue && typeof previousValue === 'string') {\n propValue = '';\n }\n if (propName === 'value') {\n const domValue = domNode[propName];\n if (domValue !== propValue &&\n (domNode['oninput-value']\n ? domValue === domNode['oninput-value']\n : propValue !== previousValue)) {\n domNode[propName] = propValue;\n domNode['oninput-value'] = undefined;\n }\n if (propValue !== previousValue) {\n propertiesUpdated = true;\n }\n }\n else if (propName !== 'key' && propValue !== previousValue) {\n const type = typeof propValue;\n if (type === 'function' && propName.lastIndexOf('on', 0) === 0 && includesEventsAndAttributes) {\n updateEvent(domNode, propName.substr(2), propValue, projectionOptions, properties.bind, previousValue);\n }\n else if (type === 'string' && propName !== 'innerHTML' && includesEventsAndAttributes) {\n updateAttribute(domNode, propName, propValue, projectionOptions);\n }\n else if (propName === 'scrollLeft' || propName === 'scrollTop') {\n if (domNode[propName] !== propValue) {\n domNode[propName] = propValue;\n }\n }\n else {\n domNode[propName] = propValue;\n }\n propertiesUpdated = true;\n }\n }\n }\n return propertiesUpdated;\n}\nfunction findIndexOfChild(children, sameAs, start) {\n for (let i = start; i < children.length; i++) {\n if (same(children[i], sameAs)) {\n return i;\n }\n }\n return -1;\n}\nexport function toParentVNode(domNode) {\n return {\n tag: '',\n properties: {},\n children: undefined,\n domNode,\n type: VNODE\n };\n}\nexport function toTextVNode(data) {\n return {\n tag: '',\n properties: {},\n children: undefined,\n text: `${data}`,\n domNode: undefined,\n type: VNODE\n };\n}\nfunction toInternalWNode(instance, instanceData) {\n return {\n instance,\n rendered: [],\n coreProperties: instanceData.coreProperties,\n children: instance.children,\n widgetConstructor: instance.constructor,\n properties: instanceData.inputProperties,\n type: WNODE\n };\n}\nexport function filterAndDecorateChildren(children, instance) {\n if (children === undefined) {\n return emptyArray;\n }\n children = Array.isArray(children) ? children : [children];\n for (let i = 0; i < children.length;) {\n const child = children[i];\n if (child === undefined || child === null) {\n children.splice(i, 1);\n continue;\n }\n else if (typeof child === 'string') {\n children[i] = toTextVNode(child);\n }\n else {\n if (isVNode(child)) {\n if (child.properties.bind === undefined) {\n child.properties.bind = instance;\n if (child.children && child.children.length > 0) {\n filterAndDecorateChildren(child.children, instance);\n }\n }\n }\n else {\n if (!child.coreProperties) {\n const instanceData = widgetInstanceMap.get(instance);\n child.coreProperties = {\n bind: instance,\n baseRegistry: instanceData.coreProperties.baseRegistry\n };\n }\n if (child.children && child.children.length > 0) {\n filterAndDecorateChildren(child.children, instance);\n }\n }\n }\n i++;\n }\n return children;\n}\nfunction nodeAdded(dnode, transitions) {\n if (isVNode(dnode) && dnode.properties) {\n const enterAnimation = dnode.properties.enterAnimation;\n if (enterAnimation) {\n if (typeof enterAnimation === 'function') {\n enterAnimation(dnode.domNode, dnode.properties);\n }\n else {\n transitions.enter(dnode.domNode, dnode.properties, enterAnimation);\n }\n }\n }\n}\nfunction nodeToRemove(dnode, transitions, projectionOptions) {\n if (isWNode(dnode)) {\n const rendered = dnode.rendered || emptyArray;\n if (dnode.instance) {\n const instanceData = widgetInstanceMap.get(dnode.instance);\n instanceData.onDetach();\n instanceMap.delete(dnode.instance);\n }\n for (let i = 0; i < rendered.length; i++) {\n nodeToRemove(rendered[i], transitions, projectionOptions);\n }\n }\n else {\n const domNode = dnode.domNode;\n const properties = dnode.properties;\n if (dnode.children && dnode.children.length > 0) {\n for (let i = 0; i < dnode.children.length; i++) {\n nodeToRemove(dnode.children[i], transitions, projectionOptions);\n }\n }\n const exitAnimation = properties.exitAnimation;\n if (properties && exitAnimation) {\n domNode.style.pointerEvents = 'none';\n const removeDomNode = function () {\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\n dnode.domNode = undefined;\n };\n if (typeof exitAnimation === 'function') {\n exitAnimation(domNode, removeDomNode, properties);\n return;\n }\n else {\n transitions.exit(dnode.domNode, properties, exitAnimation, removeDomNode);\n return;\n }\n }\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\n dnode.domNode = undefined;\n }\n}\nfunction checkDistinguishable(childNodes, indexToCheck, parentInstance) {\n const childNode = childNodes[indexToCheck];\n if (isVNode(childNode) && !childNode.tag) {\n return; // Text nodes need not be distinguishable\n }\n const { key } = childNode.properties;\n if (key === undefined || key === null) {\n for (let i = 0; i < childNodes.length; i++) {\n if (i !== indexToCheck) {\n const node = childNodes[i];\n if (same(node, childNode)) {\n let nodeIdentifier;\n const parentName = parentInstance.constructor.name || 'unknown';\n if (isWNode(childNode)) {\n nodeIdentifier = childNode.widgetConstructor.name || 'unknown';\n }\n else {\n nodeIdentifier = childNode.tag;\n }\n console.warn(`A widget (${parentName}) has had a child addded or removed, but they were not able to uniquely identified. It is recommended to provide a unique 'key' property when using the same widget or element (${nodeIdentifier}) multiple times as siblings`);\n break;\n }\n }\n }\n }\n}\nfunction updateChildren(parentVNode, oldChildren, newChildren, parentInstance, projectionOptions) {\n oldChildren = oldChildren || emptyArray;\n newChildren = newChildren;\n const oldChildrenLength = oldChildren.length;\n const newChildrenLength = newChildren.length;\n const transitions = projectionOptions.transitions;\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\n let oldIndex = 0;\n let newIndex = 0;\n let i;\n let textUpdated = false;\n while (newIndex < newChildrenLength) {\n let oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : undefined;\n const newChild = newChildren[newIndex];\n if (isVNode(newChild) && typeof newChild.deferredPropertiesCallback === 'function') {\n newChild.inserted = isVNode(oldChild) && oldChild.inserted;\n addDeferredProperties(newChild, projectionOptions);\n }\n if (oldChild !== undefined && same(oldChild, newChild)) {\n textUpdated = updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance) || textUpdated;\n oldIndex++;\n newIndex++;\n continue;\n }\n const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);\n const addChild = () => {\n let insertBeforeDomNode = undefined;\n let child = oldChildren[oldIndex];\n if (child) {\n let nextIndex = oldIndex + 1;\n let insertBeforeChildren = [child];\n while (insertBeforeChildren.length) {\n const insertBefore = insertBeforeChildren.shift();\n if (isWNode(insertBefore)) {\n if (insertBefore.rendered) {\n insertBeforeChildren.push(...insertBefore.rendered);\n }\n }\n else {\n if (insertBefore.domNode) {\n insertBeforeDomNode = insertBefore.domNode;\n break;\n }\n }\n if (insertBeforeChildren.length === 0 && oldChildren[nextIndex]) {\n insertBeforeChildren.push(oldChildren[nextIndex]);\n nextIndex++;\n }\n }\n }\n createDom(newChild, parentVNode, insertBeforeDomNode, projectionOptions, parentInstance);\n nodeAdded(newChild, transitions);\n const indexToCheck = newIndex;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(newChildren, indexToCheck, parentInstance);\n });\n };\n if (!oldChild || findOldIndex === -1) {\n addChild();\n newIndex++;\n continue;\n }\n const removeChild = () => {\n const indexToCheck = oldIndex;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\n });\n if (isWNode(oldChild)) {\n const item = instanceMap.get(oldChild.instance);\n if (item) {\n oldChild = item.dnode;\n }\n }\n nodeToRemove(oldChild, transitions, projectionOptions);\n };\n const findNewIndex = findIndexOfChild(newChildren, oldChild, newIndex + 1);\n if (findNewIndex === -1) {\n removeChild();\n oldIndex++;\n continue;\n }\n addChild();\n removeChild();\n oldIndex++;\n newIndex++;\n }\n if (oldChildrenLength > oldIndex) {\n // Remove child fragments\n for (i = oldIndex; i < oldChildrenLength; i++) {\n const indexToCheck = i;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\n });\n let childToRemove = oldChildren[i];\n if (isWNode(childToRemove)) {\n const item = instanceMap.get(childToRemove.instance);\n if (item) {\n childToRemove = item.dnode;\n }\n }\n nodeToRemove(childToRemove, transitions, projectionOptions);\n }\n }\n return textUpdated;\n}\nfunction addChildren(parentVNode, children, projectionOptions, parentInstance, insertBefore = undefined, childNodes) {\n if (children === undefined) {\n return;\n }\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectorState.merge && childNodes === undefined) {\n childNodes = arrayFrom(parentVNode.domNode.childNodes);\n }\n const transitions = projectionOptions.transitions;\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n if (isVNode(child)) {\n if (projectorState.merge && childNodes) {\n let domElement = undefined;\n while (child.domNode === undefined && childNodes.length > 0) {\n domElement = childNodes.shift();\n if (domElement && domElement.tagName === (child.tag.toUpperCase() || undefined)) {\n child.domNode = domElement;\n }\n }\n }\n createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance);\n }\n else {\n createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes);\n }\n nodeAdded(child, transitions);\n }\n}\nfunction initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions) {\n addChildren(dnode, dnode.children, projectionOptions, parentInstance, undefined);\n if (typeof dnode.deferredPropertiesCallback === 'function' && dnode.inserted === undefined) {\n addDeferredProperties(dnode, projectionOptions);\n }\n if (dnode.attributes && dnode.events) {\n updateAttributes(domNode, {}, dnode.attributes, projectionOptions);\n updateProperties(domNode, {}, dnode.properties, projectionOptions, false);\n removeOrphanedEvents(domNode, {}, dnode.events, projectionOptions, true);\n const events = dnode.events;\n Object.keys(events).forEach((event) => {\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind);\n });\n }\n else {\n updateProperties(domNode, {}, dnode.properties, projectionOptions);\n }\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\n const instanceData = widgetInstanceMap.get(parentInstance);\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\n }\n dnode.inserted = true;\n}\nfunction createDom(dnode, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes) {\n let domNode;\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (isWNode(dnode)) {\n let { widgetConstructor } = dnode;\n const parentInstanceData = widgetInstanceMap.get(parentInstance);\n if (!isWidgetBaseConstructor(widgetConstructor)) {\n const item = parentInstanceData.registry().get(widgetConstructor);\n if (item === null) {\n return;\n }\n widgetConstructor = item;\n }\n const instance = new widgetConstructor();\n dnode.instance = instance;\n const instanceData = widgetInstanceMap.get(instance);\n instanceData.invalidate = () => {\n instanceData.dirty = true;\n if (instanceData.rendering === false) {\n projectorState.renderQueue.push({ instance, depth: projectionOptions.depth });\n scheduleRender(projectionOptions);\n }\n };\n instanceData.rendering = true;\n instance.__setCoreProperties__(dnode.coreProperties);\n instance.__setChildren__(dnode.children);\n instance.__setProperties__(dnode.properties);\n const rendered = instance.__render__();\n instanceData.rendering = false;\n if (rendered) {\n const filteredRendered = filterAndDecorateChildren(rendered, instance);\n dnode.rendered = filteredRendered;\n addChildren(parentVNode, filteredRendered, projectionOptions, instance, insertBefore, childNodes);\n }\n instanceMap.set(instance, { dnode, parentVNode });\n instanceData.nodeHandler.addRoot();\n projectorState.afterRenderCallbacks.push(() => {\n instanceData.onAttach();\n });\n }\n else {\n if (projectorState.merge && projectorState.mergeElement !== undefined) {\n domNode = dnode.domNode = projectionOptions.mergeElement;\n projectorState.mergeElement = undefined;\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\n return;\n }\n const doc = parentVNode.domNode.ownerDocument;\n if (!dnode.tag && typeof dnode.text === 'string') {\n if (dnode.domNode !== undefined && parentVNode.domNode) {\n const newDomNode = dnode.domNode.ownerDocument.createTextNode(dnode.text);\n if (parentVNode.domNode === dnode.domNode.parentNode) {\n parentVNode.domNode.replaceChild(newDomNode, dnode.domNode);\n }\n else {\n parentVNode.domNode.appendChild(newDomNode);\n dnode.domNode.parentNode && dnode.domNode.parentNode.removeChild(dnode.domNode);\n }\n dnode.domNode = newDomNode;\n }\n else {\n domNode = dnode.domNode = doc.createTextNode(dnode.text);\n if (insertBefore !== undefined) {\n parentVNode.domNode.insertBefore(domNode, insertBefore);\n }\n else {\n parentVNode.domNode.appendChild(domNode);\n }\n }\n }\n else {\n if (dnode.domNode === undefined) {\n if (dnode.tag === 'svg') {\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\n }\n if (projectionOptions.namespace !== undefined) {\n domNode = dnode.domNode = doc.createElementNS(projectionOptions.namespace, dnode.tag);\n }\n else {\n domNode = dnode.domNode = dnode.domNode || doc.createElement(dnode.tag);\n }\n }\n else {\n domNode = dnode.domNode;\n }\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\n if (insertBefore !== undefined) {\n parentVNode.domNode.insertBefore(domNode, insertBefore);\n }\n else if (domNode.parentNode !== parentVNode.domNode) {\n parentVNode.domNode.appendChild(domNode);\n }\n }\n }\n}\nfunction updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance) {\n if (isWNode(dnode)) {\n const { instance } = previous;\n const { parentVNode, dnode: node } = instanceMap.get(instance);\n const previousRendered = node ? node.rendered : previous.rendered;\n const instanceData = widgetInstanceMap.get(instance);\n instanceData.rendering = true;\n instance.__setCoreProperties__(dnode.coreProperties);\n instance.__setChildren__(dnode.children);\n instance.__setProperties__(dnode.properties);\n dnode.instance = instance;\n if (instanceData.dirty === true) {\n const rendered = instance.__render__();\n instanceData.rendering = false;\n dnode.rendered = filterAndDecorateChildren(rendered, instance);\n updateChildren(parentVNode, previousRendered, dnode.rendered, instance, projectionOptions);\n }\n else {\n instanceData.rendering = false;\n dnode.rendered = previousRendered;\n }\n instanceMap.set(instance, { dnode, parentVNode });\n instanceData.nodeHandler.addRoot();\n }\n else {\n if (previous === dnode) {\n return false;\n }\n const domNode = (dnode.domNode = previous.domNode);\n let textUpdated = false;\n let updated = false;\n if (!dnode.tag && typeof dnode.text === 'string') {\n if (dnode.text !== previous.text) {\n const newDomNode = domNode.ownerDocument.createTextNode(dnode.text);\n domNode.parentNode.replaceChild(newDomNode, domNode);\n dnode.domNode = newDomNode;\n textUpdated = true;\n return textUpdated;\n }\n }\n else {\n if (dnode.tag && dnode.tag.lastIndexOf('svg', 0) === 0) {\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\n }\n if (previous.children !== dnode.children) {\n const children = filterAndDecorateChildren(dnode.children, parentInstance);\n dnode.children = children;\n updated =\n updateChildren(dnode, previous.children, children, parentInstance, projectionOptions) || updated;\n }\n const previousProperties = buildPreviousProperties(domNode, previous, dnode);\n if (dnode.attributes && dnode.events) {\n updateAttributes(domNode, previousProperties.attributes, dnode.attributes, projectionOptions);\n updated =\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions, false) || updated;\n removeOrphanedEvents(domNode, previousProperties.events, dnode.events, projectionOptions, true);\n const events = dnode.events;\n Object.keys(events).forEach((event) => {\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind, previousProperties.events[event]);\n });\n }\n else {\n updated =\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions) ||\n updated;\n }\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\n const instanceData = widgetInstanceMap.get(parentInstance);\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\n }\n }\n if (updated && dnode.properties && dnode.properties.updateAnimation) {\n dnode.properties.updateAnimation(domNode, dnode.properties, previous.properties);\n }\n }\n}\nfunction addDeferredProperties(vnode, projectionOptions) {\n // transfer any properties that have been passed - as these must be decorated properties\n vnode.decoratedDeferredProperties = vnode.properties;\n const properties = vnode.deferredPropertiesCallback(!!vnode.inserted);\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n vnode.properties = Object.assign({}, properties, vnode.decoratedDeferredProperties);\n projectorState.deferredRenderCallbacks.push(() => {\n const properties = Object.assign({}, vnode.deferredPropertiesCallback(!!vnode.inserted), vnode.decoratedDeferredProperties);\n updateProperties(vnode.domNode, vnode.properties, properties, projectionOptions);\n vnode.properties = properties;\n });\n}\nfunction runDeferredRenderCallbacks(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectorState.deferredRenderCallbacks.length) {\n if (projectionOptions.sync) {\n while (projectorState.deferredRenderCallbacks.length) {\n const callback = projectorState.deferredRenderCallbacks.shift();\n callback && callback();\n }\n }\n else {\n global.requestAnimationFrame(() => {\n while (projectorState.deferredRenderCallbacks.length) {\n const callback = projectorState.deferredRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n }\n}\nfunction runAfterRenderCallbacks(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectionOptions.sync) {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n }\n else {\n if (global.requestIdleCallback) {\n global.requestIdleCallback(() => {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n else {\n setTimeout(() => {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n }\n}\nfunction scheduleRender(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectionOptions.sync) {\n render(projectionOptions);\n }\n else if (projectorState.renderScheduled === undefined) {\n projectorState.renderScheduled = global.requestAnimationFrame(() => {\n render(projectionOptions);\n });\n }\n}\nfunction render(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectorState.renderScheduled = undefined;\n const renderQueue = projectorState.renderQueue;\n const renders = [...renderQueue];\n projectorState.renderQueue = [];\n renders.sort((a, b) => a.depth - b.depth);\n const previouslyRendered = [];\n while (renders.length) {\n const { instance } = renders.shift();\n if (instanceMap.has(instance) && previouslyRendered.indexOf(instance) === -1) {\n previouslyRendered.push(instance);\n const { parentVNode, dnode } = instanceMap.get(instance);\n const instanceData = widgetInstanceMap.get(instance);\n updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance);\n }\n }\n runAfterRenderCallbacks(projectionOptions);\n runDeferredRenderCallbacks(projectionOptions);\n}\nexport const dom = {\n append: function (parentNode, instance, projectionOptions = {}) {\n const instanceData = widgetInstanceMap.get(instance);\n const finalProjectorOptions = getProjectionOptions(projectionOptions, instance);\n const projectorState = {\n afterRenderCallbacks: [],\n deferredRenderCallbacks: [],\n nodeMap: new WeakMap(),\n renderScheduled: undefined,\n renderQueue: [],\n merge: projectionOptions.merge || false,\n mergeElement: projectionOptions.mergeElement\n };\n projectorStateMap.set(instance, projectorState);\n finalProjectorOptions.rootNode = parentNode;\n const parentVNode = toParentVNode(finalProjectorOptions.rootNode);\n const node = toInternalWNode(instance, instanceData);\n instanceMap.set(instance, { dnode: node, parentVNode });\n instanceData.invalidate = () => {\n instanceData.dirty = true;\n if (instanceData.rendering === false) {\n projectorState.renderQueue.push({ instance, depth: finalProjectorOptions.depth });\n scheduleRender(finalProjectorOptions);\n }\n };\n updateDom(node, node, finalProjectorOptions, parentVNode, instance);\n projectorState.afterRenderCallbacks.push(() => {\n instanceData.onAttach();\n });\n runDeferredRenderCallbacks(finalProjectorOptions);\n runAfterRenderCallbacks(finalProjectorOptions);\n return {\n domNode: finalProjectorOptions.rootNode\n };\n },\n create: function (instance, projectionOptions) {\n return this.append(document.createElement('div'), instance, projectionOptions);\n },\n merge: function (element, instance, projectionOptions = {}) {\n projectionOptions.merge = true;\n projectionOptions.mergeElement = element;\n const projection = this.append(element.parentNode, instance, projectionOptions);\n const projectorState = projectorStateMap.get(instance);\n projectorState.merge = false;\n return projection;\n }\n};\n//# sourceMappingURL=vdom.mjs.map" + "source": "import global from '../shim/global';\nimport { from as arrayFrom } from '../shim/array';\nimport { isWNode, isVNode, isDomVNode, VNODE, WNODE } from './d';\nimport { isWidgetBaseConstructor } from './Registry';\nimport WeakMap from '../shim/WeakMap';\nconst NAMESPACE_W3 = 'http://www.w3.org/';\nconst NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg';\nconst NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink';\nconst emptyArray = [];\nconst nodeOperations = ['focus', 'blur', 'scrollIntoView', 'click'];\nexport const widgetInstanceMap = new WeakMap();\nconst instanceMap = new WeakMap();\nconst nextSiblingMap = new WeakMap();\nconst projectorStateMap = new WeakMap();\nfunction same(dnode1, dnode2) {\n if (isVNode(dnode1) && isVNode(dnode2)) {\n if (isDomVNode(dnode1) || isDomVNode(dnode2)) {\n if (dnode1.domNode !== dnode2.domNode) {\n return false;\n }\n }\n if (dnode1.tag !== dnode2.tag) {\n return false;\n }\n if (dnode1.properties.key !== dnode2.properties.key) {\n return false;\n }\n return true;\n }\n else if (isWNode(dnode1) && isWNode(dnode2)) {\n if (dnode1.instance === undefined && typeof dnode2.widgetConstructor === 'string') {\n return false;\n }\n if (dnode1.widgetConstructor !== dnode2.widgetConstructor) {\n return false;\n }\n if (dnode1.properties.key !== dnode2.properties.key) {\n return false;\n }\n return true;\n }\n return false;\n}\nconst missingTransition = function () {\n throw new Error('Provide a transitions object to the projectionOptions to do animations');\n};\nfunction getProjectionOptions(projectorOptions, projectorInstance) {\n const defaults = {\n namespace: undefined,\n styleApplyer: function (domNode, styleName, value) {\n domNode.style[styleName] = value;\n },\n transitions: {\n enter: missingTransition,\n exit: missingTransition\n },\n depth: 0,\n merge: false,\n sync: false,\n projectorInstance\n };\n return Object.assign({}, defaults, projectorOptions);\n}\nfunction checkStyleValue(styleValue) {\n if (typeof styleValue !== 'string') {\n throw new Error('Style values must be strings');\n }\n}\nfunction updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n const eventMap = projectorState.nodeMap.get(domNode) || new WeakMap();\n if (previousValue) {\n const previousEvent = eventMap.get(previousValue);\n domNode.removeEventListener(eventName, previousEvent);\n }\n let callback = currentValue.bind(bind);\n if (eventName === 'input') {\n callback = function (evt) {\n currentValue.call(this, evt);\n evt.target['oninput-value'] = evt.target.value;\n }.bind(bind);\n }\n domNode.addEventListener(eventName, callback);\n eventMap.set(currentValue, callback);\n projectorState.nodeMap.set(domNode, eventMap);\n}\nfunction addClasses(domNode, classes) {\n if (classes) {\n const classNames = classes.split(' ');\n for (let i = 0; i < classNames.length; i++) {\n domNode.classList.add(classNames[i]);\n }\n }\n}\nfunction removeClasses(domNode, classes) {\n if (classes) {\n const classNames = classes.split(' ');\n for (let i = 0; i < classNames.length; i++) {\n domNode.classList.remove(classNames[i]);\n }\n }\n}\nfunction buildPreviousProperties(domNode, previous, current) {\n const { diffType, properties, attributes } = current;\n if (!diffType || diffType === 'vdom') {\n return { properties: previous.properties, attributes: previous.attributes, events: previous.events };\n }\n else if (diffType === 'none') {\n return { properties: {}, attributes: previous.attributes ? {} : undefined, events: previous.events };\n }\n let newProperties = {\n properties: {}\n };\n if (attributes) {\n newProperties.attributes = {};\n newProperties.events = previous.events;\n Object.keys(properties).forEach((propName) => {\n newProperties.properties[propName] = domNode[propName];\n });\n Object.keys(attributes).forEach((attrName) => {\n newProperties.attributes[attrName] = domNode.getAttribute(attrName);\n });\n return newProperties;\n }\n newProperties.properties = Object.keys(properties).reduce((props, property) => {\n props[property] = domNode.getAttribute(property) || domNode[property];\n return props;\n }, {});\n return newProperties;\n}\nfunction nodeOperation(propName, propValue, previousValue, domNode, projectionOptions) {\n let result;\n if (typeof propValue === 'function') {\n result = propValue();\n }\n else {\n result = propValue && !previousValue;\n }\n if (result === true) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectorState.deferredRenderCallbacks.push(() => {\n domNode[propName]();\n });\n }\n}\nfunction removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions, onlyEvents = false) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n const eventMap = projectorState.nodeMap.get(domNode);\n if (eventMap) {\n Object.keys(previousProperties).forEach((propName) => {\n const isEvent = propName.substr(0, 2) === 'on' || onlyEvents;\n const eventName = onlyEvents ? propName : propName.substr(2);\n if (isEvent && !properties[propName]) {\n const eventCallback = eventMap.get(previousProperties[propName]);\n if (eventCallback) {\n domNode.removeEventListener(eventName, eventCallback);\n }\n }\n });\n }\n}\nfunction updateAttribute(domNode, attrName, attrValue, projectionOptions) {\n if (projectionOptions.namespace === NAMESPACE_SVG && attrName === 'href') {\n domNode.setAttributeNS(NAMESPACE_XLINK, attrName, attrValue);\n }\n else if ((attrName === 'role' && attrValue === '') || attrValue === undefined) {\n domNode.removeAttribute(attrName);\n }\n else {\n domNode.setAttribute(attrName, attrValue);\n }\n}\nfunction updateAttributes(domNode, previousAttributes, attributes, projectionOptions) {\n const attrNames = Object.keys(attributes);\n const attrCount = attrNames.length;\n for (let i = 0; i < attrCount; i++) {\n const attrName = attrNames[i];\n const attrValue = attributes[attrName];\n const previousAttrValue = previousAttributes[attrName];\n if (attrValue !== previousAttrValue) {\n updateAttribute(domNode, attrName, attrValue, projectionOptions);\n }\n }\n}\nfunction updateProperties(domNode, previousProperties, properties, projectionOptions, includesEventsAndAttributes = true) {\n let propertiesUpdated = false;\n const propNames = Object.keys(properties);\n const propCount = propNames.length;\n if (propNames.indexOf('classes') === -1 && previousProperties.classes) {\n if (Array.isArray(previousProperties.classes)) {\n for (let i = 0; i < previousProperties.classes.length; i++) {\n removeClasses(domNode, previousProperties.classes[i]);\n }\n }\n else {\n removeClasses(domNode, previousProperties.classes);\n }\n }\n includesEventsAndAttributes && removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions);\n for (let i = 0; i < propCount; i++) {\n const propName = propNames[i];\n let propValue = properties[propName];\n const previousValue = previousProperties[propName];\n if (propName === 'classes') {\n const previousClasses = Array.isArray(previousValue) ? previousValue : [previousValue];\n const currentClasses = Array.isArray(propValue) ? propValue : [propValue];\n if (previousClasses && previousClasses.length > 0) {\n if (!propValue || propValue.length === 0) {\n for (let i = 0; i < previousClasses.length; i++) {\n removeClasses(domNode, previousClasses[i]);\n }\n }\n else {\n const newClasses = [...currentClasses];\n for (let i = 0; i < previousClasses.length; i++) {\n const previousClassName = previousClasses[i];\n if (previousClassName) {\n const classIndex = newClasses.indexOf(previousClassName);\n if (classIndex === -1) {\n removeClasses(domNode, previousClassName);\n }\n else {\n newClasses.splice(classIndex, 1);\n }\n }\n }\n for (let i = 0; i < newClasses.length; i++) {\n addClasses(domNode, newClasses[i]);\n }\n }\n }\n else {\n for (let i = 0; i < currentClasses.length; i++) {\n addClasses(domNode, currentClasses[i]);\n }\n }\n }\n else if (nodeOperations.indexOf(propName) !== -1) {\n nodeOperation(propName, propValue, previousValue, domNode, projectionOptions);\n }\n else if (propName === 'styles') {\n const styleNames = Object.keys(propValue);\n const styleCount = styleNames.length;\n for (let j = 0; j < styleCount; j++) {\n const styleName = styleNames[j];\n const newStyleValue = propValue[styleName];\n const oldStyleValue = previousValue && previousValue[styleName];\n if (newStyleValue === oldStyleValue) {\n continue;\n }\n propertiesUpdated = true;\n if (newStyleValue) {\n checkStyleValue(newStyleValue);\n projectionOptions.styleApplyer(domNode, styleName, newStyleValue);\n }\n else {\n projectionOptions.styleApplyer(domNode, styleName, '');\n }\n }\n }\n else {\n if (!propValue && typeof previousValue === 'string') {\n propValue = '';\n }\n if (propName === 'value') {\n const domValue = domNode[propName];\n if (domValue !== propValue &&\n (domNode['oninput-value']\n ? domValue === domNode['oninput-value']\n : propValue !== previousValue)) {\n domNode[propName] = propValue;\n domNode['oninput-value'] = undefined;\n }\n if (propValue !== previousValue) {\n propertiesUpdated = true;\n }\n }\n else if (propName !== 'key' && propValue !== previousValue) {\n const type = typeof propValue;\n if (type === 'function' && propName.lastIndexOf('on', 0) === 0 && includesEventsAndAttributes) {\n updateEvent(domNode, propName.substr(2), propValue, projectionOptions, properties.bind, previousValue);\n }\n else if (type === 'string' && propName !== 'innerHTML' && includesEventsAndAttributes) {\n updateAttribute(domNode, propName, propValue, projectionOptions);\n }\n else if (propName === 'scrollLeft' || propName === 'scrollTop') {\n if (domNode[propName] !== propValue) {\n domNode[propName] = propValue;\n }\n }\n else {\n domNode[propName] = propValue;\n }\n propertiesUpdated = true;\n }\n }\n }\n return propertiesUpdated;\n}\nfunction findIndexOfChild(children, sameAs, start) {\n for (let i = start; i < children.length; i++) {\n if (same(children[i], sameAs)) {\n return i;\n }\n }\n return -1;\n}\nexport function toParentVNode(domNode) {\n return {\n tag: '',\n properties: {},\n children: undefined,\n domNode,\n type: VNODE\n };\n}\nexport function toTextVNode(data) {\n return {\n tag: '',\n properties: {},\n children: undefined,\n text: `${data}`,\n domNode: undefined,\n type: VNODE\n };\n}\nfunction toInternalWNode(instance, instanceData) {\n return {\n instance,\n rendered: [],\n coreProperties: instanceData.coreProperties,\n children: instance.children,\n widgetConstructor: instance.constructor,\n properties: instanceData.inputProperties,\n type: WNODE\n };\n}\nexport function filterAndDecorateChildren(children, instance) {\n if (children === undefined) {\n return emptyArray;\n }\n children = Array.isArray(children) ? children : [children];\n for (let i = 0; i < children.length;) {\n const child = children[i];\n if (child === undefined || child === null) {\n children.splice(i, 1);\n continue;\n }\n else if (typeof child === 'string') {\n children[i] = toTextVNode(child);\n }\n else {\n if (isVNode(child)) {\n if (child.properties.bind === undefined) {\n child.properties.bind = instance;\n if (child.children && child.children.length > 0) {\n filterAndDecorateChildren(child.children, instance);\n }\n }\n }\n else {\n if (!child.coreProperties) {\n const instanceData = widgetInstanceMap.get(instance);\n child.coreProperties = {\n bind: instance,\n baseRegistry: instanceData.coreProperties.baseRegistry\n };\n }\n if (child.children && child.children.length > 0) {\n filterAndDecorateChildren(child.children, instance);\n }\n }\n }\n i++;\n }\n return children;\n}\nfunction nodeAdded(dnode, transitions) {\n if (isVNode(dnode) && dnode.properties) {\n const enterAnimation = dnode.properties.enterAnimation;\n if (enterAnimation) {\n if (typeof enterAnimation === 'function') {\n enterAnimation(dnode.domNode, dnode.properties);\n }\n else {\n transitions.enter(dnode.domNode, dnode.properties, enterAnimation);\n }\n }\n }\n}\nfunction nodeToRemove(dnode, transitions, projectionOptions) {\n if (isWNode(dnode)) {\n const item = instanceMap.get(dnode.instance);\n const rendered = (item ? item.dnode.rendered : dnode.rendered) || emptyArray;\n if (dnode.instance) {\n const instanceData = widgetInstanceMap.get(dnode.instance);\n instanceData.onDetach();\n instanceMap.delete(dnode.instance);\n }\n for (let i = 0; i < rendered.length; i++) {\n nodeToRemove(rendered[i], transitions, projectionOptions);\n }\n }\n else {\n const domNode = dnode.domNode;\n const properties = dnode.properties;\n if (dnode.children && dnode.children.length > 0) {\n for (let i = 0; i < dnode.children.length; i++) {\n nodeToRemove(dnode.children[i], transitions, projectionOptions);\n }\n }\n const exitAnimation = properties.exitAnimation;\n if (properties && exitAnimation) {\n domNode.style.pointerEvents = 'none';\n const removeDomNode = function () {\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\n dnode.domNode = undefined;\n };\n if (typeof exitAnimation === 'function') {\n exitAnimation(domNode, removeDomNode, properties);\n return;\n }\n else {\n transitions.exit(dnode.domNode, properties, exitAnimation, removeDomNode);\n return;\n }\n }\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\n dnode.domNode = undefined;\n }\n}\nfunction checkDistinguishable(childNodes, indexToCheck, parentInstance) {\n const childNode = childNodes[indexToCheck];\n if (isVNode(childNode) && !childNode.tag) {\n return; // Text nodes need not be distinguishable\n }\n const { key } = childNode.properties;\n if (key === undefined || key === null) {\n for (let i = 0; i < childNodes.length; i++) {\n if (i !== indexToCheck) {\n const node = childNodes[i];\n if (same(node, childNode)) {\n let nodeIdentifier;\n const parentName = parentInstance.constructor.name || 'unknown';\n if (isWNode(childNode)) {\n nodeIdentifier = childNode.widgetConstructor.name || 'unknown';\n }\n else {\n nodeIdentifier = childNode.tag;\n }\n console.warn(`A widget (${parentName}) has had a child addded or removed, but they were not able to uniquely identified. It is recommended to provide a unique 'key' property when using the same widget or element (${nodeIdentifier}) multiple times as siblings`);\n break;\n }\n }\n }\n }\n}\nfunction updateChildren(parentVNode, siblings, oldChildren, newChildren, parentInstance, projectionOptions) {\n oldChildren = oldChildren || emptyArray;\n newChildren = newChildren;\n const oldChildrenLength = oldChildren.length;\n const newChildrenLength = newChildren.length;\n const transitions = projectionOptions.transitions;\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\n let oldIndex = 0;\n let newIndex = 0;\n let i;\n let textUpdated = false;\n while (newIndex < newChildrenLength) {\n let oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : undefined;\n const newChild = newChildren[newIndex];\n if (isVNode(newChild) && typeof newChild.deferredPropertiesCallback === 'function') {\n newChild.inserted = isVNode(oldChild) && oldChild.inserted;\n addDeferredProperties(newChild, projectionOptions);\n }\n if (oldChild !== undefined && same(oldChild, newChild)) {\n oldIndex++;\n newIndex++;\n textUpdated =\n updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance, oldChildren.slice(oldIndex), newChildren.slice(newIndex)) || textUpdated;\n continue;\n }\n const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);\n const addChild = () => {\n let insertBeforeDomNode = undefined;\n let childrenArray = oldChildren;\n let nextIndex = oldIndex + 1;\n let child = oldChildren[oldIndex];\n if (!child) {\n child = siblings[0];\n nextIndex = 1;\n childrenArray = siblings;\n }\n if (child) {\n let insertBeforeChildren = [child];\n while (insertBeforeChildren.length) {\n const insertBefore = insertBeforeChildren.shift();\n if (isWNode(insertBefore)) {\n const item = instanceMap.get(insertBefore.instance);\n if (item && item.dnode.rendered) {\n insertBeforeChildren.push(...item.dnode.rendered);\n }\n }\n else {\n if (insertBefore.domNode) {\n if (insertBefore.domNode.parentElement !== parentVNode.domNode) {\n break;\n }\n insertBeforeDomNode = insertBefore.domNode;\n break;\n }\n }\n if (insertBeforeChildren.length === 0 && childrenArray[nextIndex]) {\n insertBeforeChildren.push(childrenArray[nextIndex]);\n nextIndex++;\n }\n }\n }\n createDom(newChild, parentVNode, newChildren.slice(newIndex + 1), insertBeforeDomNode, projectionOptions, parentInstance);\n nodeAdded(newChild, transitions);\n const indexToCheck = newIndex;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(newChildren, indexToCheck, parentInstance);\n });\n };\n if (!oldChild || findOldIndex === -1) {\n addChild();\n newIndex++;\n continue;\n }\n const removeChild = () => {\n const indexToCheck = oldIndex;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\n });\n if (isWNode(oldChild)) {\n const item = instanceMap.get(oldChild.instance);\n if (item) {\n oldChild = item.dnode;\n }\n }\n nodeToRemove(oldChild, transitions, projectionOptions);\n };\n const findNewIndex = findIndexOfChild(newChildren, oldChild, newIndex + 1);\n if (findNewIndex === -1) {\n removeChild();\n oldIndex++;\n continue;\n }\n addChild();\n removeChild();\n oldIndex++;\n newIndex++;\n }\n if (oldChildrenLength > oldIndex) {\n // Remove child fragments\n for (i = oldIndex; i < oldChildrenLength; i++) {\n const indexToCheck = i;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\n });\n let childToRemove = oldChildren[i];\n if (isWNode(childToRemove)) {\n const item = instanceMap.get(childToRemove.instance);\n if (item) {\n childToRemove = item.dnode;\n }\n }\n nodeToRemove(childToRemove, transitions, projectionOptions);\n }\n }\n return textUpdated;\n}\nfunction addChildren(parentVNode, children, projectionOptions, parentInstance, insertBefore = undefined, childNodes) {\n if (children === undefined) {\n return;\n }\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectorState.merge && childNodes === undefined) {\n childNodes = arrayFrom(parentVNode.domNode.childNodes);\n }\n const transitions = projectionOptions.transitions;\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n const nextSiblings = children.slice(i + 1);\n if (isVNode(child)) {\n if (projectorState.merge && childNodes) {\n let domElement = undefined;\n while (child.domNode === undefined && childNodes.length > 0) {\n domElement = childNodes.shift();\n if (domElement && domElement.tagName === (child.tag.toUpperCase() || undefined)) {\n child.domNode = domElement;\n }\n }\n }\n createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance);\n }\n else {\n createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes);\n }\n nodeAdded(child, transitions);\n }\n}\nfunction initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions) {\n addChildren(dnode, dnode.children, projectionOptions, parentInstance, undefined);\n if (typeof dnode.deferredPropertiesCallback === 'function' && dnode.inserted === undefined) {\n addDeferredProperties(dnode, projectionOptions);\n }\n if (dnode.attributes && dnode.events) {\n updateAttributes(domNode, {}, dnode.attributes, projectionOptions);\n updateProperties(domNode, {}, dnode.properties, projectionOptions, false);\n removeOrphanedEvents(domNode, {}, dnode.events, projectionOptions, true);\n const events = dnode.events;\n Object.keys(events).forEach((event) => {\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind);\n });\n }\n else {\n updateProperties(domNode, {}, dnode.properties, projectionOptions);\n }\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\n const instanceData = widgetInstanceMap.get(parentInstance);\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\n }\n dnode.inserted = true;\n}\nfunction createDom(dnode, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes) {\n let domNode;\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (isWNode(dnode)) {\n let { widgetConstructor } = dnode;\n const parentInstanceData = widgetInstanceMap.get(parentInstance);\n if (!isWidgetBaseConstructor(widgetConstructor)) {\n const item = parentInstanceData.registry().get(widgetConstructor);\n if (item === null) {\n return;\n }\n widgetConstructor = item;\n }\n const instance = new widgetConstructor();\n dnode.instance = instance;\n nextSiblingMap.set(instance, nextSiblings);\n const instanceData = widgetInstanceMap.get(instance);\n instanceData.invalidate = () => {\n instanceData.dirty = true;\n if (instanceData.rendering === false) {\n projectorState.renderQueue.push({ instance, depth: projectionOptions.depth });\n scheduleRender(projectionOptions);\n }\n };\n instanceData.rendering = true;\n instance.__setCoreProperties__(dnode.coreProperties);\n instance.__setChildren__(dnode.children);\n instance.__setProperties__(dnode.properties);\n const rendered = instance.__render__();\n instanceData.rendering = false;\n if (rendered) {\n const filteredRendered = filterAndDecorateChildren(rendered, instance);\n dnode.rendered = filteredRendered;\n addChildren(parentVNode, filteredRendered, projectionOptions, instance, insertBefore, childNodes);\n }\n instanceMap.set(instance, { dnode, parentVNode });\n instanceData.nodeHandler.addRoot();\n projectorState.afterRenderCallbacks.push(() => {\n instanceData.onAttach();\n });\n }\n else {\n if (projectorState.merge && projectorState.mergeElement !== undefined) {\n domNode = dnode.domNode = projectionOptions.mergeElement;\n projectorState.mergeElement = undefined;\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\n return;\n }\n const doc = parentVNode.domNode.ownerDocument;\n if (!dnode.tag && typeof dnode.text === 'string') {\n if (dnode.domNode !== undefined && parentVNode.domNode) {\n const newDomNode = dnode.domNode.ownerDocument.createTextNode(dnode.text);\n if (parentVNode.domNode === dnode.domNode.parentNode) {\n parentVNode.domNode.replaceChild(newDomNode, dnode.domNode);\n }\n else {\n parentVNode.domNode.appendChild(newDomNode);\n dnode.domNode.parentNode && dnode.domNode.parentNode.removeChild(dnode.domNode);\n }\n dnode.domNode = newDomNode;\n }\n else {\n domNode = dnode.domNode = doc.createTextNode(dnode.text);\n if (insertBefore !== undefined) {\n parentVNode.domNode.insertBefore(domNode, insertBefore);\n }\n else {\n parentVNode.domNode.appendChild(domNode);\n }\n }\n }\n else {\n if (dnode.domNode === undefined) {\n if (dnode.tag === 'svg') {\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\n }\n if (projectionOptions.namespace !== undefined) {\n domNode = dnode.domNode = doc.createElementNS(projectionOptions.namespace, dnode.tag);\n }\n else {\n domNode = dnode.domNode = dnode.domNode || doc.createElement(dnode.tag);\n }\n }\n else {\n domNode = dnode.domNode;\n }\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\n if (insertBefore !== undefined) {\n parentVNode.domNode.insertBefore(domNode, insertBefore);\n }\n else if (domNode.parentNode !== parentVNode.domNode) {\n parentVNode.domNode.appendChild(domNode);\n }\n }\n }\n}\nfunction updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance, oldNextSiblings, nextSiblings) {\n if (isWNode(dnode)) {\n const { instance } = previous;\n const { parentVNode, dnode: node } = instanceMap.get(instance);\n const previousRendered = node ? node.rendered : previous.rendered;\n const instanceData = widgetInstanceMap.get(instance);\n instanceData.rendering = true;\n instance.__setCoreProperties__(dnode.coreProperties);\n instance.__setChildren__(dnode.children);\n instance.__setProperties__(dnode.properties);\n nextSiblingMap.set(instance, nextSiblings);\n dnode.instance = instance;\n if (instanceData.dirty === true) {\n const rendered = instance.__render__();\n instanceData.rendering = false;\n dnode.rendered = filterAndDecorateChildren(rendered, instance);\n updateChildren(parentVNode, oldNextSiblings, previousRendered, dnode.rendered, instance, projectionOptions);\n }\n else {\n instanceData.rendering = false;\n dnode.rendered = previousRendered;\n }\n instanceMap.set(instance, { dnode, parentVNode });\n instanceData.nodeHandler.addRoot();\n }\n else {\n if (previous === dnode) {\n return false;\n }\n const domNode = (dnode.domNode = previous.domNode);\n let textUpdated = false;\n let updated = false;\n if (!dnode.tag && typeof dnode.text === 'string') {\n if (dnode.text !== previous.text) {\n const newDomNode = domNode.ownerDocument.createTextNode(dnode.text);\n domNode.parentNode.replaceChild(newDomNode, domNode);\n dnode.domNode = newDomNode;\n textUpdated = true;\n return textUpdated;\n }\n }\n else {\n if (dnode.tag && dnode.tag.lastIndexOf('svg', 0) === 0) {\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\n }\n if (previous.children !== dnode.children) {\n const children = filterAndDecorateChildren(dnode.children, parentInstance);\n dnode.children = children;\n updated =\n updateChildren(dnode, oldNextSiblings, previous.children, children, parentInstance, projectionOptions) || updated;\n }\n const previousProperties = buildPreviousProperties(domNode, previous, dnode);\n if (dnode.attributes && dnode.events) {\n updateAttributes(domNode, previousProperties.attributes, dnode.attributes, projectionOptions);\n updated =\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions, false) || updated;\n removeOrphanedEvents(domNode, previousProperties.events, dnode.events, projectionOptions, true);\n const events = dnode.events;\n Object.keys(events).forEach((event) => {\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind, previousProperties.events[event]);\n });\n }\n else {\n updated =\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions) ||\n updated;\n }\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\n const instanceData = widgetInstanceMap.get(parentInstance);\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\n }\n }\n if (updated && dnode.properties && dnode.properties.updateAnimation) {\n dnode.properties.updateAnimation(domNode, dnode.properties, previous.properties);\n }\n }\n}\nfunction addDeferredProperties(vnode, projectionOptions) {\n // transfer any properties that have been passed - as these must be decorated properties\n vnode.decoratedDeferredProperties = vnode.properties;\n const properties = vnode.deferredPropertiesCallback(!!vnode.inserted);\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n vnode.properties = Object.assign({}, properties, vnode.decoratedDeferredProperties);\n projectorState.deferredRenderCallbacks.push(() => {\n const properties = Object.assign({}, vnode.deferredPropertiesCallback(!!vnode.inserted), vnode.decoratedDeferredProperties);\n updateProperties(vnode.domNode, vnode.properties, properties, projectionOptions);\n vnode.properties = properties;\n });\n}\nfunction runDeferredRenderCallbacks(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectorState.deferredRenderCallbacks.length) {\n if (projectionOptions.sync) {\n while (projectorState.deferredRenderCallbacks.length) {\n const callback = projectorState.deferredRenderCallbacks.shift();\n callback && callback();\n }\n }\n else {\n global.requestAnimationFrame(() => {\n while (projectorState.deferredRenderCallbacks.length) {\n const callback = projectorState.deferredRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n }\n}\nfunction runAfterRenderCallbacks(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectionOptions.sync) {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n }\n else {\n if (global.requestIdleCallback) {\n global.requestIdleCallback(() => {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n else {\n setTimeout(() => {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n }\n}\nfunction scheduleRender(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectionOptions.sync) {\n render(projectionOptions);\n }\n else if (projectorState.renderScheduled === undefined) {\n projectorState.renderScheduled = global.requestAnimationFrame(() => {\n render(projectionOptions);\n });\n }\n}\nfunction render(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectorState.renderScheduled = undefined;\n const renderQueue = projectorState.renderQueue;\n const renders = [...renderQueue];\n projectorState.renderQueue = [];\n renders.sort((a, b) => a.depth - b.depth);\n const previouslyRendered = [];\n while (renders.length) {\n const { instance } = renders.shift();\n if (instanceMap.has(instance) && previouslyRendered.indexOf(instance) === -1) {\n previouslyRendered.push(instance);\n const { parentVNode, dnode } = instanceMap.get(instance);\n const instanceData = widgetInstanceMap.get(instance);\n const nextSiblings = nextSiblingMap.get(instance);\n updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance, nextSiblings, nextSiblings);\n }\n }\n runAfterRenderCallbacks(projectionOptions);\n runDeferredRenderCallbacks(projectionOptions);\n}\nexport const dom = {\n append: function (parentNode, instance, projectionOptions = {}) {\n const instanceData = widgetInstanceMap.get(instance);\n const finalProjectorOptions = getProjectionOptions(projectionOptions, instance);\n const projectorState = {\n afterRenderCallbacks: [],\n deferredRenderCallbacks: [],\n nodeMap: new WeakMap(),\n renderScheduled: undefined,\n renderQueue: [],\n merge: projectionOptions.merge || false,\n mergeElement: projectionOptions.mergeElement\n };\n projectorStateMap.set(instance, projectorState);\n finalProjectorOptions.rootNode = parentNode;\n const parentVNode = toParentVNode(finalProjectorOptions.rootNode);\n const node = toInternalWNode(instance, instanceData);\n instanceMap.set(instance, { dnode: node, parentVNode });\n instanceData.invalidate = () => {\n instanceData.dirty = true;\n if (instanceData.rendering === false) {\n projectorState.renderQueue.push({ instance, depth: finalProjectorOptions.depth });\n scheduleRender(finalProjectorOptions);\n }\n };\n updateDom(node, node, finalProjectorOptions, parentVNode, instance, [], []);\n projectorState.afterRenderCallbacks.push(() => {\n instanceData.onAttach();\n });\n runDeferredRenderCallbacks(finalProjectorOptions);\n runAfterRenderCallbacks(finalProjectorOptions);\n return {\n domNode: finalProjectorOptions.rootNode\n };\n },\n create: function (instance, projectionOptions) {\n return this.append(document.createElement('div'), instance, projectionOptions);\n },\n merge: function (element, instance, projectionOptions = {}) {\n projectionOptions.merge = true;\n projectionOptions.mergeElement = element;\n const projection = this.append(element.parentNode, instance, projectionOptions);\n const projectorState = projectorStateMap.get(instance);\n projectorState.merge = false;\n return projection;\n }\n};\n//# sourceMappingURL=vdom.mjs.map" }, { "id": "./node_modules/imports-loader/index.js?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js", @@ -2332,7 +2341,7 @@ "name": "./node_modules/imports-loader?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js", "index": 1, "index2": 41, - "size": 282, + "size": 292, "cacheable": true, "built": true, "optional": false, @@ -2362,7 +2371,7 @@ "providedExports": null, "optimizationBailout": [], "depth": 1, - "source": "/*** IMPORTS FROM imports-loader ***/\nvar widgetFactory = require(\"src/menu-item/MenuItem\");\n\nvar registerCustomElement = require('@dojo/widget-core/registerCustomElement').default;\n\nvar defaultExport = widgetFactory.default;\ndefaultExport && registerCustomElement(defaultExport);\n\n" + "source": "/*** IMPORTS FROM imports-loader ***/\nvar widgetFactory = require(\"src/menu-item/MenuItem\");\n\nvar registerCustomElement = require('@dojo/framework/widget-core/registerCustomElement').default;\n\nvar defaultExport = widgetFactory.default;\ndefaultExport && registerCustomElement(defaultExport);\n\n" }, { "id": "./node_modules/process/browser.js", @@ -2379,21 +2388,21 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/has/has.mjs", - "issuerId": "./node_modules/@dojo/has/has.mjs", - "issuerName": "./node_modules/@dojo/has/has.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/has/has.mjs", + "issuerId": "./node_modules/@dojo/framework/has/has.mjs", + "issuerName": "./node_modules/@dojo/framework/has/has.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/has/has.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/has/has.mjs", - "module": "./node_modules/@dojo/has/has.mjs", - "moduleName": "./node_modules/@dojo/has/has.mjs", + "moduleId": "./node_modules/@dojo/framework/has/has.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/has/has.mjs", + "module": "./node_modules/@dojo/framework/has/has.mjs", + "moduleName": "./node_modules/@dojo/framework/has/has.mjs", "type": "cjs require", "userRequest": "process", - "loc": "1:0-37" + "loc": "1:0-40" } ], "usedExports": true, @@ -2417,18 +2426,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "tslib", "loc": "1:0-33" @@ -2443,19 +2452,19 @@ "loc": "1:0-33" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "tslib", "loc": "1:0-33" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "tslib", "loc": "1:0-33" @@ -2463,7 +2472,6 @@ ], "usedExports": [ "__decorate", - "__metadata", "__rest" ], "providedExports": [ @@ -2504,30 +2512,30 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/global.mjs", - "issuerId": "./node_modules/@dojo/shim/global.mjs", - "issuerName": "./node_modules/@dojo/shim/global.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/global.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/global.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/global.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/global.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/global.mjs", - "module": "./node_modules/@dojo/shim/global.mjs", - "moduleName": "./node_modules/@dojo/shim/global.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/global.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/global.mjs", + "module": "./node_modules/@dojo/framework/shim/global.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/global.mjs", "type": "cjs require", "userRequest": "global", - "loc": "1:0-44" + "loc": "1:0-47" }, { - "moduleId": "./node_modules/@dojo/has/has.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/has/has.mjs", - "module": "./node_modules/@dojo/has/has.mjs", - "moduleName": "./node_modules/@dojo/has/has.mjs", + "moduleId": "./node_modules/@dojo/framework/has/has.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/has/has.mjs", + "module": "./node_modules/@dojo/framework/has/has.mjs", + "moduleName": "./node_modules/@dojo/framework/has/has.mjs", "type": "cjs require", "userRequest": "global", - "loc": "1:0-44" + "loc": "1:0-47" } ], "usedExports": true, @@ -2542,7 +2550,7 @@ "name": "./src/menu-item/MenuItem.ts", "index": 2, "index2": 40, - "size": 1095, + "size": 1135, "cacheable": true, "built": true, "optional": false, @@ -2575,7 +2583,7 @@ ], "optimizationBailout": [], "depth": 2, - "source": "import * as tslib_1 from \"tslib\";\nimport { v } from '@dojo/widget-core/d';\nimport { customElement } from '@dojo/widget-core/decorators/customElement';\nimport { theme, ThemedMixin } from '@dojo/widget-core/mixins/Themed';\nimport { WidgetBase } from '@dojo/widget-core/WidgetBase';\nimport * as css from './menuItem.m.css';\nlet MenuItem = class MenuItem extends ThemedMixin(WidgetBase) {\n _onClick() {\n this.properties.onSelected && this.properties.onSelected(this.properties.data);\n }\n render() {\n const { title, selected } = this.properties;\n return v('li', { classes: this.theme(css.root) }, [\n v('span', {\n classes: this.theme([css.item, selected ? css.selected : null]),\n onclick: this._onClick\n }, [title])\n ]);\n }\n};\nMenuItem = tslib_1.__decorate([\n customElement({\n tag: 'demo-menu-item',\n attributes: ['title', 'selected'],\n events: ['onSelected'],\n properties: ['data', 'selected']\n }),\n theme(css)\n], MenuItem);\nexport { MenuItem };\nexport default MenuItem;\n" + "source": "import * as tslib_1 from \"tslib\";\nimport { v } from '@dojo/framework/widget-core/d';\nimport { customElement } from '@dojo/framework/widget-core/decorators/customElement';\nimport { theme, ThemedMixin } from '@dojo/framework/widget-core/mixins/Themed';\nimport { WidgetBase } from '@dojo/framework/widget-core/WidgetBase';\nimport * as css from './menuItem.m.css';\nlet MenuItem = class MenuItem extends ThemedMixin(WidgetBase) {\n _onClick() {\n this.properties.onSelected && this.properties.onSelected(this.properties.data);\n }\n render() {\n const { title, selected } = this.properties;\n return v('li', { classes: this.theme(css.root) }, [\n v('span', {\n classes: this.theme([css.item, selected ? css.selected : null]),\n onclick: this._onClick\n }, [title])\n ]);\n }\n};\nMenuItem = tslib_1.__decorate([\n customElement({\n tag: 'demo-menu-item',\n attributes: ['title', 'selected'],\n events: ['onSelected'],\n properties: ['data', 'selected']\n }),\n theme(css)\n], MenuItem);\nexport { MenuItem };\nexport default MenuItem;\n" }, { "id": "./src/menu-item/menuItem.m.css", @@ -2632,12 +2640,12 @@ ], "modules": [ { - "id": "./node_modules/@dojo/core/Destroyable.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Destroyable.mjs", - "name": "./node_modules/@dojo/core/Destroyable.mjs", + "id": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Destroyable.mjs", + "name": "./node_modules/@dojo/framework/core/Destroyable.mjs", "index": 25, "index2": 17, - "size": 1668, + "size": 1665, "cacheable": true, "built": true, "optional": false, @@ -2646,18 +2654,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Evented.mjs", - "issuerId": "./node_modules/@dojo/core/Evented.mjs", - "issuerName": "./node_modules/@dojo/core/Evented.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Evented.mjs", + "issuerId": "./node_modules/@dojo/framework/core/Evented.mjs", + "issuerName": "./node_modules/@dojo/framework/core/Evented.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/core/Evented.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Evented.mjs", - "module": "./node_modules/@dojo/core/Evented.mjs", - "moduleName": "./node_modules/@dojo/core/Evented.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Evented.mjs", + "module": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Evented.mjs", "type": "harmony import", "userRequest": "./Destroyable", "loc": "2:0-44" @@ -2672,15 +2680,15 @@ ], "optimizationBailout": [], "depth": 6, - "source": "import { createCompositeHandle } from './lang';\nimport Promise from '@dojo/shim/Promise';\n/**\n * No operation function to replace own once instance is destoryed\n */\nfunction noop() {\n return Promise.resolve(false);\n}\n/**\n * No op function used to replace own, once instance has been destoryed\n */\nfunction destroyed() {\n throw new Error('Call made to destroyed method');\n}\nexport class Destroyable {\n /**\n * @constructor\n */\n constructor() {\n this.handles = [];\n }\n /**\n * Register handles for the instance that will be destroyed when `this.destroy` is called\n *\n * @param {Handle} handle The handle to add for the instance\n * @returns {Handle} a handle for the handle, removes the handle for the instance and calls destroy\n */\n own(handles) {\n const handle = Array.isArray(handles) ? createCompositeHandle(...handles) : handles;\n const { handles: _handles } = this;\n _handles.push(handle);\n return {\n destroy() {\n _handles.splice(_handles.indexOf(handle));\n handle.destroy();\n }\n };\n }\n /**\n * Destrpys all handers registered for the instance\n *\n * @returns {Promise {\n this.handles.forEach((handle) => {\n handle && handle.destroy && handle.destroy();\n });\n this.destroy = noop;\n this.own = destroyed;\n resolve(true);\n });\n }\n}\nexport default Destroyable;\n//# sourceMappingURL=Destroyable.mjs.map" + "source": "import { createCompositeHandle } from './lang';\nimport Promise from '../shim/Promise';\n/**\n * No operation function to replace own once instance is destoryed\n */\nfunction noop() {\n return Promise.resolve(false);\n}\n/**\n * No op function used to replace own, once instance has been destoryed\n */\nfunction destroyed() {\n throw new Error('Call made to destroyed method');\n}\nexport class Destroyable {\n /**\n * @constructor\n */\n constructor() {\n this.handles = [];\n }\n /**\n * Register handles for the instance that will be destroyed when `this.destroy` is called\n *\n * @param {Handle} handle The handle to add for the instance\n * @returns {Handle} a handle for the handle, removes the handle for the instance and calls destroy\n */\n own(handles) {\n const handle = Array.isArray(handles) ? createCompositeHandle(...handles) : handles;\n const { handles: _handles } = this;\n _handles.push(handle);\n return {\n destroy() {\n _handles.splice(_handles.indexOf(handle));\n handle.destroy();\n }\n };\n }\n /**\n * Destrpys all handers registered for the instance\n *\n * @returns {Promise {\n this.handles.forEach((handle) => {\n handle && handle.destroy && handle.destroy();\n });\n this.destroy = noop;\n this.own = destroyed;\n resolve(true);\n });\n }\n}\nexport default Destroyable;\n//# sourceMappingURL=Destroyable.mjs.map" }, { - "id": "./node_modules/@dojo/core/Evented.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Evented.mjs", - "name": "./node_modules/@dojo/core/Evented.mjs", + "id": "./node_modules/@dojo/framework/core/Evented.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Evented.mjs", + "name": "./node_modules/@dojo/framework/core/Evented.mjs", "index": 24, "index2": 18, - "size": 2149, + "size": 2151, "cacheable": true, "built": true, "optional": false, @@ -2689,48 +2697,48 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/RegistryHandler.mjs", - "issuerId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "issuerName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/RegistryHandler.mjs", - "module": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "2:0-45" + "userRequest": "../core/Evented", + "loc": "2:0-42" }, { - "moduleId": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/NodeHandler.mjs", - "module": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "1:0-45" + "userRequest": "../core/Evented", + "loc": "1:0-42" }, { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "4:0-45" + "userRequest": "../core/Evented", + "loc": "4:0-42" }, { - "moduleId": "./node_modules/@dojo/widget-core/Injector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Injector.mjs", - "module": "./node_modules/@dojo/widget-core/Injector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Injector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Injector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Injector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Injector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Injector.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "1:0-45" + "userRequest": "../core/Evented", + "loc": "1:0-42" } ], "usedExports": [ @@ -2743,15 +2751,15 @@ ], "optimizationBailout": [], "depth": 5, - "source": "import Map from '@dojo/shim/Map';\nimport { Destroyable } from './Destroyable';\n/**\n * Map of computed regular expressions, keyed by string\n */\nconst regexMap = new Map();\n/**\n * Determines is the event type glob has been matched\n *\n * @returns boolean that indicates if the glob is matched\n */\nexport function isGlobMatch(globString, targetString) {\n if (typeof targetString === 'string' && typeof globString === 'string' && globString.indexOf('*') !== -1) {\n let regex;\n if (regexMap.has(globString)) {\n regex = regexMap.get(globString);\n }\n else {\n regex = new RegExp(`^${globString.replace(/\\*/g, '.*')}$`);\n regexMap.set(globString, regex);\n }\n return regex.test(targetString);\n }\n else {\n return globString === targetString;\n }\n}\n/**\n * Event Class\n */\nexport class Evented extends Destroyable {\n constructor() {\n super(...arguments);\n /**\n * map of listeners keyed by event type\n */\n this.listenersMap = new Map();\n }\n emit(event) {\n this.listenersMap.forEach((methods, type) => {\n if (isGlobMatch(type, event.type)) {\n methods.forEach((method) => {\n method.call(this, event);\n });\n }\n });\n }\n on(type, listener) {\n if (Array.isArray(listener)) {\n const handles = listener.map((listener) => this._addListener(type, listener));\n return {\n destroy() {\n handles.forEach((handle) => handle.destroy());\n }\n };\n }\n return this._addListener(type, listener);\n }\n _addListener(type, listener) {\n const listeners = this.listenersMap.get(type) || [];\n listeners.push(listener);\n this.listenersMap.set(type, listeners);\n return {\n destroy: () => {\n const listeners = this.listenersMap.get(type) || [];\n listeners.splice(listeners.indexOf(listener), 1);\n }\n };\n }\n}\nexport default Evented;\n//# sourceMappingURL=Evented.mjs.map" + "source": "import Map from '../shim/Map';\nimport { Destroyable } from './Destroyable';\n/**\n * Map of computed regular expressions, keyed by string\n */\nconst regexMap = new Map();\n/**\n * Determines is the event type glob has been matched\n *\n * @returns boolean that indicates if the glob is matched\n */\nexport function isGlobMatch(globString, targetString) {\n if (typeof targetString === 'string' && typeof globString === 'string' && globString.indexOf('*') !== -1) {\n let regex;\n if (regexMap.has(globString)) {\n regex = regexMap.get(globString);\n }\n else {\n regex = new RegExp(`^${globString.replace(/\\*/g, '.*')}$`);\n regexMap.set(globString, regex);\n }\n return regex.test(targetString);\n }\n else {\n return globString === targetString;\n }\n}\n/**\n * Event Class\n */\nexport class Evented extends Destroyable {\n constructor() {\n super(...arguments);\n /**\n * map of listeners keyed by event type\n */\n this.listenersMap = new Map();\n }\n emit(event) {\n this.listenersMap.forEach((methods, type) => {\n if (isGlobMatch(type, event.type)) {\n [...methods].forEach((method) => {\n method.call(this, event);\n });\n }\n });\n }\n on(type, listener) {\n if (Array.isArray(listener)) {\n const handles = listener.map((listener) => this._addListener(type, listener));\n return {\n destroy() {\n handles.forEach((handle) => handle.destroy());\n }\n };\n }\n return this._addListener(type, listener);\n }\n _addListener(type, listener) {\n const listeners = this.listenersMap.get(type) || [];\n listeners.push(listener);\n this.listenersMap.set(type, listeners);\n return {\n destroy: () => {\n const listeners = this.listenersMap.get(type) || [];\n listeners.splice(listeners.indexOf(listener), 1);\n }\n };\n }\n}\nexport default Evented;\n//# sourceMappingURL=Evented.mjs.map" }, { - "id": "./node_modules/@dojo/core/lang.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/lang.mjs", - "name": "./node_modules/@dojo/core/lang.mjs", + "id": "./node_modules/@dojo/framework/core/lang.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/lang.mjs", + "name": "./node_modules/@dojo/framework/core/lang.mjs", "index": 26, "index2": 16, - "size": 6843, + "size": 6837, "cacheable": true, "built": true, "optional": false, @@ -2760,27 +2768,27 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", - "userRequest": "@dojo/core/lang", + "userRequest": "../../core/lang", "loc": "2:0-41" }, { - "moduleId": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Destroyable.mjs", - "module": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleName": "./node_modules/@dojo/core/Destroyable.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Destroyable.mjs", + "module": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Destroyable.mjs", "type": "harmony import", "userRequest": "./lang", "loc": "1:0-47" @@ -2805,12 +2813,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { assign } from '@dojo/shim/object';\nexport { assign } from '@dojo/shim/object';\nconst slice = Array.prototype.slice;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Type guard that ensures that the value can be coerced to Object\n * to weed out host objects that do not derive from Object.\n * This function is used to check if we want to deep copy an object or not.\n * Note: In ES6 it is possible to modify an object's Symbol.toStringTag property, which will\n * change the value returned by `toString`. This is a rare edge case that is difficult to handle,\n * so it is not handled here.\n * @param value The value to check\n * @return If the value is coercible into an Object\n */\nfunction shouldDeepCopyObject(value) {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\nfunction copyArray(array, inherited) {\n return array.map(function (item) {\n if (Array.isArray(item)) {\n return copyArray(item, inherited);\n }\n return !shouldDeepCopyObject(item)\n ? item\n : _mixin({\n deep: true,\n inherited: inherited,\n sources: [item],\n target: {}\n });\n });\n}\nfunction _mixin(kwArgs) {\n const deep = kwArgs.deep;\n const inherited = kwArgs.inherited;\n const target = kwArgs.target;\n const copied = kwArgs.copied || [];\n const copiedClone = [...copied];\n for (let i = 0; i < kwArgs.sources.length; i++) {\n const source = kwArgs.sources[i];\n if (source === null || source === undefined) {\n continue;\n }\n for (let key in source) {\n if (inherited || hasOwnProperty.call(source, key)) {\n let value = source[key];\n if (copiedClone.indexOf(value) !== -1) {\n continue;\n }\n if (deep) {\n if (Array.isArray(value)) {\n value = copyArray(value, inherited);\n }\n else if (shouldDeepCopyObject(value)) {\n const targetValue = target[key] || {};\n copied.push(source);\n value = _mixin({\n deep: true,\n inherited: inherited,\n sources: [value],\n target: targetValue,\n copied\n });\n }\n }\n target[key] = value;\n }\n }\n }\n return target;\n}\nexport function create(prototype, ...mixins) {\n if (!mixins.length) {\n throw new RangeError('lang.create requires at least one mixin object.');\n }\n const args = mixins.slice();\n args.unshift(Object.create(prototype));\n return assign.apply(null, args);\n}\nexport function deepAssign(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: false,\n sources: sources,\n target: target\n });\n}\nexport function deepMixin(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Creates a new object using the provided source's prototype as the prototype for the new object, and then\n * deep copies the provided source's values into the new target.\n *\n * @param source The object to duplicate\n * @return The new object\n */\nexport function duplicate(source) {\n const target = Object.create(Object.getPrototypeOf(source));\n return deepMixin(target, source);\n}\n/**\n * Determines whether two values are the same value.\n *\n * @param a First value to compare\n * @param b Second value to compare\n * @return true if the values are the same; false otherwise\n */\nexport function isIdentical(a, b) {\n return (a === b ||\n /* both values are NaN */\n (a !== a && b !== b));\n}\n/**\n * Returns a function that binds a method to the specified object at runtime. This is similar to\n * `Function.prototype.bind`, but instead of a function it takes the name of a method on an object.\n * As a result, the function returned by `lateBind` will always call the function currently assigned to\n * the specified property on the object as of the moment the function it returns is called.\n *\n * @param instance The context object\n * @param method The name of the method on the context object to bind to itself\n * @param suppliedArgs An optional array of values to prepend to the `instance[method]` arguments list\n * @return The bound function\n */\nexport function lateBind(instance, method, ...suppliedArgs) {\n return suppliedArgs.length\n ? function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n // TS7017\n return instance[method].apply(instance, args);\n }\n : function () {\n // TS7017\n return instance[method].apply(instance, arguments);\n };\n}\nexport function mixin(target, ...sources) {\n return _mixin({\n deep: false,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Returns a function which invokes the given function with the given arguments prepended to its argument list.\n * Like `Function.prototype.bind`, but does not alter execution context.\n *\n * @param targetFunction The function that needs to be bound\n * @param suppliedArgs An optional array of arguments to prepend to the `targetFunction` arguments list\n * @return The bound function\n */\nexport function partial(targetFunction, ...suppliedArgs) {\n return function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n return targetFunction.apply(this, args);\n };\n}\n/**\n * Returns an object with a destroy method that, when called, calls the passed-in destructor.\n * This is intended to provide a unified interface for creating \"remove\" / \"destroy\" handlers for\n * event listeners, timers, etc.\n *\n * @param destructor A function that will be called when the handle's `destroy` method is invoked\n * @return The handle object\n */\nexport function createHandle(destructor) {\n let called = false;\n return {\n destroy: function () {\n if (!called) {\n called = true;\n destructor();\n }\n }\n };\n}\n/**\n * Returns a single handle that can be used to destroy multiple handles simultaneously.\n *\n * @param handles An array of handles with `destroy` methods\n * @return The handle object\n */\nexport function createCompositeHandle(...handles) {\n return createHandle(function () {\n for (let i = 0; i < handles.length; i++) {\n handles[i].destroy();\n }\n });\n}\n//# sourceMappingURL=lang.mjs.map" + "source": "import { assign } from '../shim/object';\nexport { assign } from '../shim/object';\nconst slice = Array.prototype.slice;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Type guard that ensures that the value can be coerced to Object\n * to weed out host objects that do not derive from Object.\n * This function is used to check if we want to deep copy an object or not.\n * Note: In ES6 it is possible to modify an object's Symbol.toStringTag property, which will\n * change the value returned by `toString`. This is a rare edge case that is difficult to handle,\n * so it is not handled here.\n * @param value The value to check\n * @return If the value is coercible into an Object\n */\nfunction shouldDeepCopyObject(value) {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\nfunction copyArray(array, inherited) {\n return array.map(function (item) {\n if (Array.isArray(item)) {\n return copyArray(item, inherited);\n }\n return !shouldDeepCopyObject(item)\n ? item\n : _mixin({\n deep: true,\n inherited: inherited,\n sources: [item],\n target: {}\n });\n });\n}\nfunction _mixin(kwArgs) {\n const deep = kwArgs.deep;\n const inherited = kwArgs.inherited;\n const target = kwArgs.target;\n const copied = kwArgs.copied || [];\n const copiedClone = [...copied];\n for (let i = 0; i < kwArgs.sources.length; i++) {\n const source = kwArgs.sources[i];\n if (source === null || source === undefined) {\n continue;\n }\n for (let key in source) {\n if (inherited || hasOwnProperty.call(source, key)) {\n let value = source[key];\n if (copiedClone.indexOf(value) !== -1) {\n continue;\n }\n if (deep) {\n if (Array.isArray(value)) {\n value = copyArray(value, inherited);\n }\n else if (shouldDeepCopyObject(value)) {\n const targetValue = target[key] || {};\n copied.push(source);\n value = _mixin({\n deep: true,\n inherited: inherited,\n sources: [value],\n target: targetValue,\n copied\n });\n }\n }\n target[key] = value;\n }\n }\n }\n return target;\n}\nexport function create(prototype, ...mixins) {\n if (!mixins.length) {\n throw new RangeError('lang.create requires at least one mixin object.');\n }\n const args = mixins.slice();\n args.unshift(Object.create(prototype));\n return assign.apply(null, args);\n}\nexport function deepAssign(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: false,\n sources: sources,\n target: target\n });\n}\nexport function deepMixin(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Creates a new object using the provided source's prototype as the prototype for the new object, and then\n * deep copies the provided source's values into the new target.\n *\n * @param source The object to duplicate\n * @return The new object\n */\nexport function duplicate(source) {\n const target = Object.create(Object.getPrototypeOf(source));\n return deepMixin(target, source);\n}\n/**\n * Determines whether two values are the same value.\n *\n * @param a First value to compare\n * @param b Second value to compare\n * @return true if the values are the same; false otherwise\n */\nexport function isIdentical(a, b) {\n return (a === b ||\n /* both values are NaN */\n (a !== a && b !== b));\n}\n/**\n * Returns a function that binds a method to the specified object at runtime. This is similar to\n * `Function.prototype.bind`, but instead of a function it takes the name of a method on an object.\n * As a result, the function returned by `lateBind` will always call the function currently assigned to\n * the specified property on the object as of the moment the function it returns is called.\n *\n * @param instance The context object\n * @param method The name of the method on the context object to bind to itself\n * @param suppliedArgs An optional array of values to prepend to the `instance[method]` arguments list\n * @return The bound function\n */\nexport function lateBind(instance, method, ...suppliedArgs) {\n return suppliedArgs.length\n ? function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n // TS7017\n return instance[method].apply(instance, args);\n }\n : function () {\n // TS7017\n return instance[method].apply(instance, arguments);\n };\n}\nexport function mixin(target, ...sources) {\n return _mixin({\n deep: false,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Returns a function which invokes the given function with the given arguments prepended to its argument list.\n * Like `Function.prototype.bind`, but does not alter execution context.\n *\n * @param targetFunction The function that needs to be bound\n * @param suppliedArgs An optional array of arguments to prepend to the `targetFunction` arguments list\n * @return The bound function\n */\nexport function partial(targetFunction, ...suppliedArgs) {\n return function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n return targetFunction.apply(this, args);\n };\n}\n/**\n * Returns an object with a destroy method that, when called, calls the passed-in destructor.\n * This is intended to provide a unified interface for creating \"remove\" / \"destroy\" handlers for\n * event listeners, timers, etc.\n *\n * @param destructor A function that will be called when the handle's `destroy` method is invoked\n * @return The handle object\n */\nexport function createHandle(destructor) {\n let called = false;\n return {\n destroy: function () {\n if (!called) {\n called = true;\n destructor();\n }\n }\n };\n}\n/**\n * Returns a single handle that can be used to destroy multiple handles simultaneously.\n *\n * @param handles An array of handles with `destroy` methods\n * @return The handle object\n */\nexport function createCompositeHandle(...handles) {\n return createHandle(function () {\n for (let i = 0; i < handles.length; i++) {\n handles[i].destroy();\n }\n });\n}\n//# sourceMappingURL=lang.mjs.map" }, { - "id": "./node_modules/@dojo/has/has.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/has/has.mjs", - "name": "./node_modules/@dojo/has/has.mjs", + "id": "./node_modules/@dojo/framework/has/has.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/has/has.mjs", + "name": "./node_modules/@dojo/framework/has/has.mjs", "index": 7, "index2": 3, "size": 6305, @@ -2822,29 +2830,29 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/has.mjs", - "issuerId": "./node_modules/@dojo/shim/support/has.mjs", - "issuerName": "./node_modules/@dojo/shim/support/has.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/has.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/support/has.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/support/has.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/has.mjs", - "module": "./node_modules/@dojo/shim/support/has.mjs", - "moduleName": "./node_modules/@dojo/shim/support/has.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/has.mjs", + "module": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/has.mjs", "type": "harmony import", - "userRequest": "@dojo/has/has", + "userRequest": "../../has/has", "loc": "1:0-41" }, { - "moduleId": "./node_modules/@dojo/shim/support/has.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/has.mjs", - "module": "./node_modules/@dojo/shim/support/has.mjs", - "moduleName": "./node_modules/@dojo/shim/support/has.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/has.mjs", + "module": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/has.mjs", "type": "harmony import", - "userRequest": "@dojo/has/has", + "userRequest": "../../has/has", "loc": "4:0-30" } ], @@ -2866,9 +2874,9 @@ "source": "function isFeatureTestThenable(value) {\n return value && value.then;\n}\n/**\n * A cache of results of feature tests\n */\nexport const testCache = {};\n/**\n * A cache of the un-resolved feature tests\n */\nexport const testFunctions = {};\n/**\n * A cache of unresolved thenables (probably promises)\n * @type {{}}\n */\nconst testThenables = {};\n/**\n * A reference to the global scope (`window` in a browser, `global` in NodeJS)\n */\nconst globalScope = (function () {\n /* istanbul ignore else */\n if (typeof window !== 'undefined') {\n // Browsers\n return window;\n }\n else if (typeof global !== 'undefined') {\n // Node\n return global;\n }\n else if (typeof self !== 'undefined') {\n // Web workers\n return self;\n }\n /* istanbul ignore next */\n return {};\n})();\n/* Grab the staticFeatures if there are available */\nconst { staticFeatures } = globalScope.DojoHasEnvironment || {};\n/* Cleaning up the DojoHasEnviornment */\nif ('DojoHasEnvironment' in globalScope) {\n delete globalScope.DojoHasEnvironment;\n}\n/**\n * Custom type guard to narrow the `staticFeatures` to either a map or a function that\n * returns a map.\n *\n * @param value The value to guard for\n */\nfunction isStaticFeatureFunction(value) {\n return typeof value === 'function';\n}\n/**\n * The cache of asserted features that were available in the global scope when the\n * module loaded\n */\nconst staticCache = staticFeatures\n ? isStaticFeatureFunction(staticFeatures) ? staticFeatures.apply(globalScope) : staticFeatures\n : {}; /* Providing an empty cache, if none was in the environment\n\n/**\n* AMD plugin function.\n*\n* Conditional loads modules based on a has feature test value.\n*\n* @param resourceId Gives the resolved module id to load.\n* @param require The loader require function with respect to the module that contained the plugin resource in its\n* dependency list.\n* @param load Callback to loader that consumes result of plugin demand.\n*/\nexport function load(resourceId, require, load, config) {\n resourceId ? require([resourceId], load) : load();\n}\n/**\n * AMD plugin function.\n *\n * Resolves resourceId into a module id based on possibly-nested tenary expression that branches on has feature test\n * value(s).\n *\n * @param resourceId The id of the module\n * @param normalize Resolves a relative module id into an absolute module id\n */\nexport function normalize(resourceId, normalize) {\n const tokens = resourceId.match(/[\\?:]|[^:\\?]*/g) || [];\n let i = 0;\n function get(skip) {\n const term = tokens[i++];\n if (term === ':') {\n // empty string module name, resolves to null\n return null;\n }\n else {\n // postfixed with a ? means it is a feature to branch on, the term is the name of the feature\n if (tokens[i++] === '?') {\n if (!skip && has(term)) {\n // matched the feature, get the first value from the options\n return get();\n }\n else {\n // did not match, get the second value, passing over the first\n get(true);\n return get(skip);\n }\n }\n // a module\n return term;\n }\n }\n const id = get();\n return id && normalize(id);\n}\n/**\n * Check if a feature has already been registered\n *\n * @param feature the name of the feature\n */\nexport function exists(feature) {\n const normalizedFeature = feature.toLowerCase();\n return Boolean(normalizedFeature in staticCache || normalizedFeature in testCache || testFunctions[normalizedFeature]);\n}\n/**\n * Register a new test for a named feature.\n *\n * @example\n * has.add('dom-addeventlistener', !!document.addEventListener);\n *\n * @example\n * has.add('touch-events', function () {\n * return 'ontouchstart' in document\n * });\n *\n * @param feature the name of the feature\n * @param value the value reported of the feature, or a function that will be executed once on first test\n * @param overwrite if an existing value should be overwritten. Defaults to false.\n */\nexport function add(feature, value, overwrite = false) {\n const normalizedFeature = feature.toLowerCase();\n if (exists(normalizedFeature) && !overwrite && !(normalizedFeature in staticCache)) {\n throw new TypeError(`Feature \"${feature}\" exists and overwrite not true.`);\n }\n if (typeof value === 'function') {\n testFunctions[normalizedFeature] = value;\n }\n else if (isFeatureTestThenable(value)) {\n testThenables[feature] = value.then((resolvedValue) => {\n testCache[feature] = resolvedValue;\n delete testThenables[feature];\n }, () => {\n delete testThenables[feature];\n });\n }\n else {\n testCache[normalizedFeature] = value;\n delete testFunctions[normalizedFeature];\n }\n}\n/**\n * Return the current value of a named feature.\n *\n * @param feature The name (if a string) or identifier (if an integer) of the feature to test.\n */\nexport default function has(feature) {\n let result;\n const normalizedFeature = feature.toLowerCase();\n if (normalizedFeature in staticCache) {\n result = staticCache[normalizedFeature];\n }\n else if (testFunctions[normalizedFeature]) {\n result = testCache[normalizedFeature] = testFunctions[normalizedFeature].call(null);\n delete testFunctions[normalizedFeature];\n }\n else if (normalizedFeature in testCache) {\n result = testCache[normalizedFeature];\n }\n else if (feature in testThenables) {\n return false;\n }\n else {\n throw new TypeError(`Attempt to detect unregistered has feature \"${feature}\"`);\n }\n return result;\n}\n/*\n * Out of the box feature tests\n */\n/* Environments */\n/* Used as a value to provide a debug only code path */\nadd('debug', true);\n/* Detects if the environment is \"browser like\" */\nadd('host-browser', typeof document !== 'undefined' && typeof location !== 'undefined');\n/* Detects if the environment appears to be NodeJS */\nadd('host-node', function () {\n if (typeof process === 'object' && process.versions && process.versions.node) {\n return process.versions.node;\n }\n});\n//# sourceMappingURL=has.mjs.map" }, { - "id": "./node_modules/@dojo/shim/Map.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "name": "./node_modules/@dojo/shim/Map.mjs", + "id": "./node_modules/@dojo/framework/shim/Map.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "name": "./node_modules/@dojo/framework/shim/Map.mjs", "index": 15, "index2": 12, "size": 3331, @@ -2880,57 +2888,57 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "1:0-33" + "userRequest": "../shim/Map", + "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/RegistryHandler.mjs", - "module": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "1:0-37" + "userRequest": "../shim/Map", + "loc": "1:0-34" }, { - "moduleId": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/NodeHandler.mjs", - "module": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "2:0-33" + "userRequest": "../shim/Map", + "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "2:0-33" + "userRequest": "../shim/Map", + "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/core/Evented.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Evented.mjs", - "module": "./node_modules/@dojo/core/Evented.mjs", - "moduleName": "./node_modules/@dojo/core/Evented.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Evented.mjs", + "module": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Evented.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "1:0-33" + "userRequest": "../shim/Map", + "loc": "1:0-30" } ], "usedExports": [ @@ -2946,9 +2954,9 @@ "source": "import { isArrayLike, ShimIterator } from './iterator';\nimport global from './global';\nimport { is as objectIs } from './object';\nimport has from './support/has';\nimport './Symbol';\nexport let Map = global.Map;\nif (!true) {\n Map = (_a = class Map {\n constructor(iterable) {\n this._keys = [];\n this._values = [];\n this[Symbol.toStringTag] = 'Map';\n if (iterable) {\n if (isArrayLike(iterable)) {\n for (let i = 0; i < iterable.length; i++) {\n const value = iterable[i];\n this.set(value[0], value[1]);\n }\n }\n else {\n for (const value of iterable) {\n this.set(value[0], value[1]);\n }\n }\n }\n }\n /**\n * An alternative to Array.prototype.indexOf using Object.is\n * to check for equality. See http://mzl.la/1zuKO2V\n */\n _indexOfKey(keys, key) {\n for (let i = 0, length = keys.length; i < length; i++) {\n if (objectIs(keys[i], key)) {\n return i;\n }\n }\n return -1;\n }\n get size() {\n return this._keys.length;\n }\n clear() {\n this._keys.length = this._values.length = 0;\n }\n delete(key) {\n const index = this._indexOfKey(this._keys, key);\n if (index < 0) {\n return false;\n }\n this._keys.splice(index, 1);\n this._values.splice(index, 1);\n return true;\n }\n entries() {\n const values = this._keys.map((key, i) => {\n return [key, this._values[i]];\n });\n return new ShimIterator(values);\n }\n forEach(callback, context) {\n const keys = this._keys;\n const values = this._values;\n for (let i = 0, length = keys.length; i < length; i++) {\n callback.call(context, values[i], keys[i], this);\n }\n }\n get(key) {\n const index = this._indexOfKey(this._keys, key);\n return index < 0 ? undefined : this._values[index];\n }\n has(key) {\n return this._indexOfKey(this._keys, key) > -1;\n }\n keys() {\n return new ShimIterator(this._keys);\n }\n set(key, value) {\n let index = this._indexOfKey(this._keys, key);\n index = index < 0 ? this._keys.length : index;\n this._keys[index] = key;\n this._values[index] = value;\n return this;\n }\n values() {\n return new ShimIterator(this._values);\n }\n [Symbol.iterator]() {\n return this.entries();\n }\n },\n _a[Symbol.species] = _a,\n _a);\n}\nexport default Map;\nvar _a;\n//# sourceMappingURL=Map.mjs.map" }, { - "id": "./node_modules/@dojo/shim/Promise.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Promise.mjs", - "name": "./node_modules/@dojo/shim/Promise.mjs", + "id": "./node_modules/@dojo/framework/shim/Promise.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Promise.mjs", + "name": "./node_modules/@dojo/framework/shim/Promise.mjs", "index": 22, "index2": 15, "size": 8519, @@ -2960,30 +2968,30 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Registry.mjs", - "issuerId": "./node_modules/@dojo/widget-core/Registry.mjs", - "issuerName": "./node_modules/@dojo/widget-core/Registry.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Registry.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Promise", - "loc": "1:0-41" + "userRequest": "../shim/Promise", + "loc": "1:0-38" }, { - "moduleId": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Destroyable.mjs", - "module": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleName": "./node_modules/@dojo/core/Destroyable.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Destroyable.mjs", + "module": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Destroyable.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Promise", - "loc": "2:0-41" + "userRequest": "../shim/Promise", + "loc": "2:0-38" } ], "usedExports": [ @@ -2999,9 +3007,9 @@ "source": "import global from './global';\nimport { queueMicroTask } from './support/queue';\nimport './Symbol';\nimport has from './support/has';\nexport let ShimPromise = global.Promise;\nexport const isThenable = function isThenable(value) {\n return value && typeof value.then === 'function';\n};\nif (!true) {\n global.Promise = ShimPromise = (_a = class Promise {\n /**\n * Creates a new Promise.\n *\n * @constructor\n *\n * @param executor\n * The executor function is called immediately when the Promise is instantiated. It is responsible for\n * starting the asynchronous operation when it is invoked.\n *\n * The executor must call either the passed `resolve` function when the asynchronous operation has completed\n * successfully, or the `reject` function when the operation fails.\n */\n constructor(executor) {\n /**\n * The current state of this promise.\n */\n this.state = 1 /* Pending */;\n this[Symbol.toStringTag] = 'Promise';\n /**\n * If true, the resolution of this promise is chained (\"locked in\") to another promise.\n */\n let isChained = false;\n /**\n * Whether or not this promise is in a resolved state.\n */\n const isResolved = () => {\n return this.state !== 1 /* Pending */ || isChained;\n };\n /**\n * Callbacks that should be invoked once the asynchronous operation has completed.\n */\n let callbacks = [];\n /**\n * Initially pushes callbacks onto a queue for execution once this promise settles. After the promise settles,\n * enqueues callbacks for execution on the next event loop turn.\n */\n let whenFinished = function (callback) {\n if (callbacks) {\n callbacks.push(callback);\n }\n };\n /**\n * Settles this promise.\n *\n * @param newState The resolved state for this promise.\n * @param {T|any} value The resolved value for this promise.\n */\n const settle = (newState, value) => {\n // A promise can only be settled once.\n if (this.state !== 1 /* Pending */) {\n return;\n }\n this.state = newState;\n this.resolvedValue = value;\n whenFinished = queueMicroTask;\n // Only enqueue a callback runner if there are callbacks so that initially fulfilled Promises don't have to\n // wait an extra turn.\n if (callbacks && callbacks.length > 0) {\n queueMicroTask(function () {\n if (callbacks) {\n let count = callbacks.length;\n for (let i = 0; i < count; ++i) {\n callbacks[i].call(null);\n }\n callbacks = null;\n }\n });\n }\n };\n /**\n * Resolves this promise.\n *\n * @param newState The resolved state for this promise.\n * @param {T|any} value The resolved value for this promise.\n */\n const resolve = (newState, value) => {\n if (isResolved()) {\n return;\n }\n if (isThenable(value)) {\n value.then(settle.bind(null, 0 /* Fulfilled */), settle.bind(null, 2 /* Rejected */));\n isChained = true;\n }\n else {\n settle(newState, value);\n }\n };\n this.then = (onFulfilled, onRejected) => {\n return new Promise((resolve, reject) => {\n // whenFinished initially queues up callbacks for execution after the promise has settled. Once the\n // promise has settled, whenFinished will schedule callbacks for execution on the next turn through the\n // event loop.\n whenFinished(() => {\n const callback = this.state === 2 /* Rejected */ ? onRejected : onFulfilled;\n if (typeof callback === 'function') {\n try {\n resolve(callback(this.resolvedValue));\n }\n catch (error) {\n reject(error);\n }\n }\n else if (this.state === 2 /* Rejected */) {\n reject(this.resolvedValue);\n }\n else {\n resolve(this.resolvedValue);\n }\n });\n });\n };\n try {\n executor(resolve.bind(null, 0 /* Fulfilled */), resolve.bind(null, 2 /* Rejected */));\n }\n catch (error) {\n settle(2 /* Rejected */, error);\n }\n }\n static all(iterable) {\n return new this(function (resolve, reject) {\n const values = [];\n let complete = 0;\n let total = 0;\n let populating = true;\n function fulfill(index, value) {\n values[index] = value;\n ++complete;\n finish();\n }\n function finish() {\n if (populating || complete < total) {\n return;\n }\n resolve(values);\n }\n function processItem(index, item) {\n ++total;\n if (isThenable(item)) {\n // If an item Promise rejects, this Promise is immediately rejected with the item\n // Promise's rejection error.\n item.then(fulfill.bind(null, index), reject);\n }\n else {\n Promise.resolve(item).then(fulfill.bind(null, index));\n }\n }\n let i = 0;\n for (const value of iterable) {\n processItem(i, value);\n i++;\n }\n populating = false;\n finish();\n });\n }\n static race(iterable) {\n return new this(function (resolve, reject) {\n for (const item of iterable) {\n if (item instanceof Promise) {\n // If a Promise item rejects, this Promise is immediately rejected with the item\n // Promise's rejection error.\n item.then(resolve, reject);\n }\n else {\n Promise.resolve(item).then(resolve);\n }\n }\n });\n }\n static reject(reason) {\n return new this(function (resolve, reject) {\n reject(reason);\n });\n }\n static resolve(value) {\n return new this(function (resolve) {\n resolve(value);\n });\n }\n catch(onRejected) {\n return this.then(undefined, onRejected);\n }\n },\n _a[Symbol.species] = ShimPromise,\n _a);\n}\nexport default ShimPromise;\nvar _a;\n//# sourceMappingURL=Promise.mjs.map" }, { - "id": "./node_modules/@dojo/shim/Symbol.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Symbol.mjs", - "name": "./node_modules/@dojo/shim/Symbol.mjs", + "id": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Symbol.mjs", + "name": "./node_modules/@dojo/framework/shim/Symbol.mjs", "index": 5, "index2": 7, "size": 5929, @@ -3013,81 +3021,81 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "type": "harmony import", - "userRequest": "@dojo/shim/Symbol", - "loc": "3:0-39" - }, - { - "moduleId": "./node_modules/@dojo/widget-core/d.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/d.mjs", - "module": "./node_modules/@dojo/widget-core/d.mjs", - "moduleName": "./node_modules/@dojo/widget-core/d.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Symbol", - "loc": "1:0-39" + "userRequest": "../shim/Symbol", + "loc": "3:0-36" }, { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/d.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/d.mjs", + "module": "./node_modules/@dojo/framework/widget-core/d.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/d.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Symbol", - "loc": "3:0-39" + "userRequest": "../shim/Symbol", + "loc": "1:0-36" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "5:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "4:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/iterator.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/iterator.mjs", - "module": "./node_modules/@dojo/shim/iterator.mjs", - "moduleName": "./node_modules/@dojo/shim/iterator.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "type": "harmony import", + "userRequest": "../shim/Symbol", + "loc": "3:0-36" + }, + { + "moduleId": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/iterator.mjs", + "module": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/iterator.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "1:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/object.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/object.mjs", - "module": "./node_modules/@dojo/shim/object.mjs", - "moduleName": "./node_modules/@dojo/shim/object.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/object.mjs", + "module": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/object.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "3:0-36" }, { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "3:0-18" @@ -3106,9 +3114,9 @@ "source": "import has from './support/has';\nimport global from './global';\nimport { getValueDescriptor } from './support/util';\nexport let Symbol = global.Symbol;\nif (!true) {\n /**\n * Throws if the value is not a symbol, used internally within the Shim\n * @param {any} value The value to check\n * @return {symbol} Returns the symbol or throws\n */\n const validateSymbol = function validateSymbol(value) {\n if (!isSymbol(value)) {\n throw new TypeError(value + ' is not a symbol');\n }\n return value;\n };\n const defineProperties = Object.defineProperties;\n const defineProperty = Object.defineProperty;\n const create = Object.create;\n const objPrototype = Object.prototype;\n const globalSymbols = {};\n const getSymbolName = (function () {\n const created = create(null);\n return function (desc) {\n let postfix = 0;\n let name;\n while (created[String(desc) + (postfix || '')]) {\n ++postfix;\n }\n desc += String(postfix || '');\n created[desc] = true;\n name = '@@' + desc;\n // FIXME: Temporary guard until the duplicate execution when testing can be\n // pinned down.\n if (!Object.getOwnPropertyDescriptor(objPrototype, name)) {\n defineProperty(objPrototype, name, {\n set: function (value) {\n defineProperty(this, name, getValueDescriptor(value));\n }\n });\n }\n return name;\n };\n })();\n const InternalSymbol = function Symbol(description) {\n if (this instanceof InternalSymbol) {\n throw new TypeError('TypeError: Symbol is not a constructor');\n }\n return Symbol(description);\n };\n Symbol = global.Symbol = function Symbol(description) {\n if (this instanceof Symbol) {\n throw new TypeError('TypeError: Symbol is not a constructor');\n }\n const sym = Object.create(InternalSymbol.prototype);\n description = description === undefined ? '' : String(description);\n return defineProperties(sym, {\n __description__: getValueDescriptor(description),\n __name__: getValueDescriptor(getSymbolName(description))\n });\n };\n /* Decorate the Symbol function with the appropriate properties */\n defineProperty(Symbol, 'for', getValueDescriptor(function (key) {\n if (globalSymbols[key]) {\n return globalSymbols[key];\n }\n return (globalSymbols[key] = Symbol(String(key)));\n }));\n defineProperties(Symbol, {\n keyFor: getValueDescriptor(function (sym) {\n let key;\n validateSymbol(sym);\n for (key in globalSymbols) {\n if (globalSymbols[key] === sym) {\n return key;\n }\n }\n }),\n hasInstance: getValueDescriptor(Symbol.for('hasInstance'), false, false),\n isConcatSpreadable: getValueDescriptor(Symbol.for('isConcatSpreadable'), false, false),\n iterator: getValueDescriptor(Symbol.for('iterator'), false, false),\n match: getValueDescriptor(Symbol.for('match'), false, false),\n observable: getValueDescriptor(Symbol.for('observable'), false, false),\n replace: getValueDescriptor(Symbol.for('replace'), false, false),\n search: getValueDescriptor(Symbol.for('search'), false, false),\n species: getValueDescriptor(Symbol.for('species'), false, false),\n split: getValueDescriptor(Symbol.for('split'), false, false),\n toPrimitive: getValueDescriptor(Symbol.for('toPrimitive'), false, false),\n toStringTag: getValueDescriptor(Symbol.for('toStringTag'), false, false),\n unscopables: getValueDescriptor(Symbol.for('unscopables'), false, false)\n });\n /* Decorate the InternalSymbol object */\n defineProperties(InternalSymbol.prototype, {\n constructor: getValueDescriptor(Symbol),\n toString: getValueDescriptor(function () {\n return this.__name__;\n }, false, false)\n });\n /* Decorate the Symbol.prototype */\n defineProperties(Symbol.prototype, {\n toString: getValueDescriptor(function () {\n return 'Symbol (' + validateSymbol(this).__description__ + ')';\n }),\n valueOf: getValueDescriptor(function () {\n return validateSymbol(this);\n })\n });\n defineProperty(Symbol.prototype, Symbol.toPrimitive, getValueDescriptor(function () {\n return validateSymbol(this);\n }));\n defineProperty(Symbol.prototype, Symbol.toStringTag, getValueDescriptor('Symbol', false, false, true));\n defineProperty(InternalSymbol.prototype, Symbol.toPrimitive, getValueDescriptor(Symbol.prototype[Symbol.toPrimitive], false, false, true));\n defineProperty(InternalSymbol.prototype, Symbol.toStringTag, getValueDescriptor(Symbol.prototype[Symbol.toStringTag], false, false, true));\n}\n/**\n * A custom guard function that determines if an object is a symbol or not\n * @param {any} value The value to check to see if it is a symbol or not\n * @return {is symbol} Returns true if a symbol or not (and narrows the type guard)\n */\nexport function isSymbol(value) {\n return (value && (typeof value === 'symbol' || value['@@toStringTag'] === 'Symbol')) || false;\n}\n/**\n * Fill any missing well known symbols if the native Symbol is missing them\n */\n[\n 'hasInstance',\n 'isConcatSpreadable',\n 'iterator',\n 'species',\n 'replace',\n 'search',\n 'split',\n 'match',\n 'toPrimitive',\n 'toStringTag',\n 'unscopables',\n 'observable'\n].forEach((wellKnown) => {\n if (!Symbol[wellKnown]) {\n Object.defineProperty(Symbol, wellKnown, getValueDescriptor(Symbol.for(wellKnown), false, false));\n }\n});\nexport default Symbol;\n//# sourceMappingURL=Symbol.mjs.map" }, { - "id": "./node_modules/@dojo/shim/WeakMap.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/WeakMap.mjs", - "name": "./node_modules/@dojo/shim/WeakMap.mjs", + "id": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/WeakMap.mjs", + "name": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "index": 19, "index2": 13, "size": 3748, @@ -3120,38 +3128,38 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/WeakMap", - "loc": "2:0-41" + "userRequest": "../shim/WeakMap", + "loc": "2:0-38" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/WeakMap", - "loc": "5:0-41" + "userRequest": "../shim/WeakMap", + "loc": "5:0-38" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/inject.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/WeakMap", + "userRequest": "../../shim/WeakMap", "loc": "1:0-41" } ], @@ -3167,9 +3175,9 @@ "source": "import global from './global';\nimport { isArrayLike } from './iterator';\nimport has from './support/has';\nimport './Symbol';\nexport let WeakMap = global.WeakMap;\nif (!true) {\n const DELETED = {};\n const getUID = function getUID() {\n return Math.floor(Math.random() * 100000000);\n };\n const generateName = (function () {\n let startId = Math.floor(Date.now() % 100000000);\n return function generateName() {\n return '__wm' + getUID() + (startId++ + '__');\n };\n })();\n WeakMap = class WeakMap {\n constructor(iterable) {\n this[Symbol.toStringTag] = 'WeakMap';\n this._name = generateName();\n this._frozenEntries = [];\n if (iterable) {\n if (isArrayLike(iterable)) {\n for (let i = 0; i < iterable.length; i++) {\n const item = iterable[i];\n this.set(item[0], item[1]);\n }\n }\n else {\n for (const [key, value] of iterable) {\n this.set(key, value);\n }\n }\n }\n }\n _getFrozenEntryIndex(key) {\n for (let i = 0; i < this._frozenEntries.length; i++) {\n if (this._frozenEntries[i].key === key) {\n return i;\n }\n }\n return -1;\n }\n delete(key) {\n if (key === undefined || key === null) {\n return false;\n }\n const entry = key[this._name];\n if (entry && entry.key === key && entry.value !== DELETED) {\n entry.value = DELETED;\n return true;\n }\n const frozenIndex = this._getFrozenEntryIndex(key);\n if (frozenIndex >= 0) {\n this._frozenEntries.splice(frozenIndex, 1);\n return true;\n }\n return false;\n }\n get(key) {\n if (key === undefined || key === null) {\n return undefined;\n }\n const entry = key[this._name];\n if (entry && entry.key === key && entry.value !== DELETED) {\n return entry.value;\n }\n const frozenIndex = this._getFrozenEntryIndex(key);\n if (frozenIndex >= 0) {\n return this._frozenEntries[frozenIndex].value;\n }\n }\n has(key) {\n if (key === undefined || key === null) {\n return false;\n }\n const entry = key[this._name];\n if (Boolean(entry && entry.key === key && entry.value !== DELETED)) {\n return true;\n }\n const frozenIndex = this._getFrozenEntryIndex(key);\n if (frozenIndex >= 0) {\n return true;\n }\n return false;\n }\n set(key, value) {\n if (!key || (typeof key !== 'object' && typeof key !== 'function')) {\n throw new TypeError('Invalid value used as weak map key');\n }\n let entry = key[this._name];\n if (!entry || entry.key !== key) {\n entry = Object.create(null, {\n key: { value: key }\n });\n if (Object.isFrozen(key)) {\n this._frozenEntries.push(entry);\n }\n else {\n Object.defineProperty(key, this._name, {\n value: entry\n });\n }\n }\n entry.value = value;\n return this;\n }\n };\n}\nexport default WeakMap;\n//# sourceMappingURL=WeakMap.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", "index": 34, "index2": 29, "size": 311, @@ -3181,18 +3189,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "./../decorators/afterRender", "loc": "4:0-58" @@ -3237,9 +3245,9 @@ "depth": 0 }, { - "id": "./node_modules/@dojo/shim/array.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "name": "./node_modules/@dojo/shim/array.mjs", + "id": "./node_modules/@dojo/framework/shim/array.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "name": "./node_modules/@dojo/framework/shim/array.mjs", "index": 30, "index2": 24, "size": 8928, @@ -3251,30 +3259,30 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/array", - "loc": "4:0-40" + "userRequest": "../shim/array", + "loc": "4:0-37" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/array", - "loc": "2:0-53" + "userRequest": "../shim/array", + "loc": "2:0-50" } ], "usedExports": [ @@ -3294,9 +3302,9 @@ "source": "import global from './global';\nimport { isArrayLike, isIterable } from './iterator';\nimport { MAX_SAFE_INTEGER } from './number';\nimport has from './support/has';\nimport { wrapNative } from './support/util';\nexport let from;\n/**\n * Creates a new array from the function parameters.\n *\n * @param arguments Any number of arguments for the array\n * @return An array from the given arguments\n */\nexport let of;\n/* ES6 Array instance methods */\n/**\n * Copies data internally within an array or array-like object.\n *\n * @param target The target array-like object\n * @param offset The index to start copying values to; if negative, it counts backwards from length\n * @param start The first (inclusive) index to copy; if negative, it counts backwards from length\n * @param end The last (exclusive) index to copy; if negative, it counts backwards from length\n * @return The target\n */\nexport let copyWithin;\n/**\n * Fills elements of an array-like object with the specified value.\n *\n * @param target The target to fill\n * @param value The value to fill each element of the target with\n * @param start The first index to fill\n * @param end The (exclusive) index at which to stop filling\n * @return The filled target\n */\nexport let fill;\n/**\n * Finds and returns the first instance matching the callback or undefined if one is not found.\n *\n * @param target An array-like object\n * @param callback A function returning if the current value matches a criteria\n * @param thisArg The execution context for the find function\n * @return The first element matching the callback, or undefined if one does not exist\n */\nexport let find;\n/**\n * Performs a linear search and returns the first index whose value satisfies the passed callback,\n * or -1 if no values satisfy it.\n *\n * @param target An array-like object\n * @param callback A function returning true if the current value satisfies its criteria\n * @param thisArg The execution context for the find function\n * @return The first index whose value satisfies the passed callback, or -1 if no values satisfy it\n */\nexport let findIndex;\n/* ES7 Array instance methods */\n/**\n * Determines whether an array includes a given value\n *\n * @param target the target array-like object\n * @param searchElement the item to search for\n * @param fromIndex the starting index to search from\n * @return `true` if the array includes the element, otherwise `false`\n */\nexport let includes;\nif (true && true) {\n from = global.Array.from;\n of = global.Array.of;\n copyWithin = wrapNative(global.Array.prototype.copyWithin);\n fill = wrapNative(global.Array.prototype.fill);\n find = wrapNative(global.Array.prototype.find);\n findIndex = wrapNative(global.Array.prototype.findIndex);\n}\nelse {\n // It is only older versions of Safari/iOS that have a bad fill implementation and so aren't in the wild\n // To make things easier, if there is a bad fill implementation, the whole set of functions will be filled\n /**\n * Ensures a non-negative, non-infinite, safe integer.\n *\n * @param length The number to validate\n * @return A proper length\n */\n const toLength = function toLength(length) {\n if (isNaN(length)) {\n return 0;\n }\n length = Number(length);\n if (isFinite(length)) {\n length = Math.floor(length);\n }\n // Ensure a non-negative, real, safe integer\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\n };\n /**\n * From ES6 7.1.4 ToInteger()\n *\n * @param value A value to convert\n * @return An integer\n */\n const toInteger = function toInteger(value) {\n value = Number(value);\n if (isNaN(value)) {\n return 0;\n }\n if (value === 0 || !isFinite(value)) {\n return value;\n }\n return (value > 0 ? 1 : -1) * Math.floor(Math.abs(value));\n };\n /**\n * Normalizes an offset against a given length, wrapping it if negative.\n *\n * @param value The original offset\n * @param length The total length to normalize against\n * @return If negative, provide a distance from the end (length); otherwise provide a distance from 0\n */\n const normalizeOffset = function normalizeOffset(value, length) {\n return value < 0 ? Math.max(length + value, 0) : Math.min(value, length);\n };\n from = function from(arrayLike, mapFunction, thisArg) {\n if (arrayLike == null) {\n throw new TypeError('from: requires an array-like object');\n }\n if (mapFunction && thisArg) {\n mapFunction = mapFunction.bind(thisArg);\n }\n /* tslint:disable-next-line:variable-name */\n const Constructor = this;\n const length = toLength(arrayLike.length);\n // Support extension\n const array = typeof Constructor === 'function' ? Object(new Constructor(length)) : new Array(length);\n if (!isArrayLike(arrayLike) && !isIterable(arrayLike)) {\n return array;\n }\n // if this is an array and the normalized length is 0, just return an empty array. this prevents a problem\n // with the iteration on IE when using a NaN array length.\n if (isArrayLike(arrayLike)) {\n if (length === 0) {\n return [];\n }\n for (let i = 0; i < arrayLike.length; i++) {\n array[i] = mapFunction ? mapFunction(arrayLike[i], i) : arrayLike[i];\n }\n }\n else {\n let i = 0;\n for (const value of arrayLike) {\n array[i] = mapFunction ? mapFunction(value, i) : value;\n i++;\n }\n }\n if (arrayLike.length !== undefined) {\n array.length = length;\n }\n return array;\n };\n of = function of(...items) {\n return Array.prototype.slice.call(items);\n };\n copyWithin = function copyWithin(target, offset, start, end) {\n if (target == null) {\n throw new TypeError('copyWithin: target must be an array-like object');\n }\n const length = toLength(target.length);\n offset = normalizeOffset(toInteger(offset), length);\n start = normalizeOffset(toInteger(start), length);\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\n let count = Math.min(end - start, length - offset);\n let direction = 1;\n if (offset > start && offset < start + count) {\n direction = -1;\n start += count - 1;\n offset += count - 1;\n }\n while (count > 0) {\n if (start in target) {\n target[offset] = target[start];\n }\n else {\n delete target[offset];\n }\n offset += direction;\n start += direction;\n count--;\n }\n return target;\n };\n fill = function fill(target, value, start, end) {\n const length = toLength(target.length);\n let i = normalizeOffset(toInteger(start), length);\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\n while (i < end) {\n target[i++] = value;\n }\n return target;\n };\n find = function find(target, callback, thisArg) {\n const index = findIndex(target, callback, thisArg);\n return index !== -1 ? target[index] : undefined;\n };\n findIndex = function findIndex(target, callback, thisArg) {\n const length = toLength(target.length);\n if (!callback) {\n throw new TypeError('find: second argument must be a function');\n }\n if (thisArg) {\n callback = callback.bind(thisArg);\n }\n for (let i = 0; i < length; i++) {\n if (callback(target[i], i, target)) {\n return i;\n }\n }\n return -1;\n };\n}\nif (true) {\n includes = wrapNative(global.Array.prototype.includes);\n}\nelse {\n /**\n * Ensures a non-negative, non-infinite, safe integer.\n *\n * @param length The number to validate\n * @return A proper length\n */\n const toLength = function toLength(length) {\n length = Number(length);\n if (isNaN(length)) {\n return 0;\n }\n if (isFinite(length)) {\n length = Math.floor(length);\n }\n // Ensure a non-negative, real, safe integer\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\n };\n includes = function includes(target, searchElement, fromIndex = 0) {\n let len = toLength(target.length);\n for (let i = fromIndex; i < len; ++i) {\n const currentElement = target[i];\n if (searchElement === currentElement ||\n (searchElement !== searchElement && currentElement !== currentElement)) {\n return true;\n }\n }\n return false;\n };\n}\n//# sourceMappingURL=array.mjs.map" }, { - "id": "./node_modules/@dojo/shim/global.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/global.mjs", - "name": "./node_modules/@dojo/shim/global.mjs", + "id": "./node_modules/@dojo/framework/shim/global.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/global.mjs", + "name": "./node_modules/@dojo/framework/shim/global.mjs", "index": 10, "index2": 4, "size": 581, @@ -3308,117 +3316,117 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/global", - "loc": "6:0-39" + "userRequest": "../shim/global", + "loc": "6:0-36" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/global", - "loc": "1:0-39" + "userRequest": "./global", + "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./global", - "loc": "1:0-30" + "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./global", - "loc": "2:0-30" + "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Symbol.mjs", - "module": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleName": "./node_modules/@dojo/shim/Symbol.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Symbol.mjs", + "module": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Symbol.mjs", "type": "harmony import", "userRequest": "./global", "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", - "userRequest": "./global", - "loc": "1:0-30" + "userRequest": "../shim/global", + "loc": "1:0-36" }, { - "moduleId": "./node_modules/@dojo/shim/number.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/number.mjs", - "module": "./node_modules/@dojo/shim/number.mjs", - "moduleName": "./node_modules/@dojo/shim/number.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/number.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/number.mjs", + "module": "./node_modules/@dojo/framework/shim/number.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/number.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/support/has.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/has.mjs", - "module": "./node_modules/@dojo/shim/support/has.mjs", - "moduleName": "./node_modules/@dojo/shim/support/has.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/has.mjs", + "module": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/has.mjs", "type": "harmony import", "userRequest": "../global", "loc": "2:0-31" }, { - "moduleId": "./node_modules/@dojo/shim/object.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/object.mjs", - "module": "./node_modules/@dojo/shim/object.mjs", - "moduleName": "./node_modules/@dojo/shim/object.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/object.mjs", + "module": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/object.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/string.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/string.mjs", - "module": "./node_modules/@dojo/shim/string.mjs", - "moduleName": "./node_modules/@dojo/shim/string.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/string.mjs", + "module": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/string.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/queue.mjs", - "module": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleName": "./node_modules/@dojo/shim/support/queue.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/queue.mjs", + "module": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/queue.mjs", "type": "harmony import", "userRequest": "../global", "loc": "1:0-31" @@ -3435,9 +3443,9 @@ "source": "const globalObject = (function () {\n if (typeof global !== 'undefined') {\n // global spec defines a reference to the global object called 'global'\n // https://github.com/tc39/proposal-global\n // `global` is also defined in NodeJS\n return global;\n }\n else if (typeof window !== 'undefined') {\n // window is defined in browsers\n return window;\n }\n else if (typeof self !== 'undefined') {\n // self is defined in WebWorkers\n return self;\n }\n})();\nexport default globalObject;\n//# sourceMappingURL=global.mjs.map" }, { - "id": "./node_modules/@dojo/shim/iterator.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/iterator.mjs", - "name": "./node_modules/@dojo/shim/iterator.mjs", + "id": "./node_modules/@dojo/framework/shim/iterator.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/iterator.mjs", + "name": "./node_modules/@dojo/framework/shim/iterator.mjs", "index": 16, "index2": 10, "size": 3158, @@ -3449,36 +3457,36 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./iterator", "loc": "2:0-53" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./iterator", "loc": "1:0-55" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./iterator", "loc": "2:0-41" @@ -3497,9 +3505,9 @@ "source": "import './Symbol';\nimport { HIGH_SURROGATE_MAX, HIGH_SURROGATE_MIN } from './string';\nconst staticDone = { done: true, value: undefined };\n/**\n * A class that _shims_ an iterator interface on array like objects.\n */\nexport class ShimIterator {\n constructor(list) {\n this._nextIndex = -1;\n if (isIterable(list)) {\n this._nativeIterator = list[Symbol.iterator]();\n }\n else {\n this._list = list;\n }\n }\n /**\n * Return the next iteration result for the Iterator\n */\n next() {\n if (this._nativeIterator) {\n return this._nativeIterator.next();\n }\n if (!this._list) {\n return staticDone;\n }\n if (++this._nextIndex < this._list.length) {\n return {\n done: false,\n value: this._list[this._nextIndex]\n };\n }\n return staticDone;\n }\n [Symbol.iterator]() {\n return this;\n }\n}\n/**\n * A type guard for checking if something has an Iterable interface\n *\n * @param value The value to type guard against\n */\nexport function isIterable(value) {\n return value && typeof value[Symbol.iterator] === 'function';\n}\n/**\n * A type guard for checking if something is ArrayLike\n *\n * @param value The value to type guard against\n */\nexport function isArrayLike(value) {\n return value && typeof value.length === 'number';\n}\n/**\n * Returns the iterator for an object\n *\n * @param iterable The iterable object to return the iterator for\n */\nexport function get(iterable) {\n if (isIterable(iterable)) {\n return iterable[Symbol.iterator]();\n }\n else if (isArrayLike(iterable)) {\n return new ShimIterator(iterable);\n }\n}\n/**\n * Shims the functionality of `for ... of` blocks\n *\n * @param iterable The object the provides an interator interface\n * @param callback The callback which will be called for each item of the iterable\n * @param thisArg Optional scope to pass the callback\n */\nexport function forOf(iterable, callback, thisArg) {\n let broken = false;\n function doBreak() {\n broken = true;\n }\n /* We need to handle iteration of double byte strings properly */\n if (isArrayLike(iterable) && typeof iterable === 'string') {\n const l = iterable.length;\n for (let i = 0; i < l; ++i) {\n let char = iterable[i];\n if (i + 1 < l) {\n const code = char.charCodeAt(0);\n if (code >= HIGH_SURROGATE_MIN && code <= HIGH_SURROGATE_MAX) {\n char += iterable[++i];\n }\n }\n callback.call(thisArg, char, iterable, doBreak);\n if (broken) {\n return;\n }\n }\n }\n else {\n const iterator = get(iterable);\n if (iterator) {\n let result = iterator.next();\n while (!result.done) {\n callback.call(thisArg, result.value, iterable, doBreak);\n if (broken) {\n return;\n }\n result = iterator.next();\n }\n }\n }\n}\n//# sourceMappingURL=iterator.mjs.map" }, { - "id": "./node_modules/@dojo/shim/number.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/number.mjs", - "name": "./node_modules/@dojo/shim/number.mjs", + "id": "./node_modules/@dojo/framework/shim/number.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/number.mjs", + "name": "./node_modules/@dojo/framework/shim/number.mjs", "index": 31, "index2": 23, "size": 1724, @@ -3511,18 +3519,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./number", "loc": "3:0-44" @@ -3543,9 +3551,9 @@ "source": "import global from './global';\n/**\n * The smallest interval between two representable numbers.\n */\nexport const EPSILON = 1;\n/**\n * The maximum safe integer in JavaScript\n */\nexport const MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n/**\n * The minimum safe integer in JavaScript\n */\nexport const MIN_SAFE_INTEGER = -MAX_SAFE_INTEGER;\n/**\n * Determines whether the passed value is NaN without coersion.\n *\n * @param value The value to test\n * @return true if the value is NaN, false if it is not\n */\nexport function isNaN(value) {\n return typeof value === 'number' && global.isNaN(value);\n}\n/**\n * Determines whether the passed value is a finite number without coersion.\n *\n * @param value The value to test\n * @return true if the value is finite, false if it is not\n */\nexport function isFinite(value) {\n return typeof value === 'number' && global.isFinite(value);\n}\n/**\n * Determines whether the passed value is an integer.\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isInteger(value) {\n return isFinite(value) && Math.floor(value) === value;\n}\n/**\n * Determines whether the passed value is an integer that is 'safe,' meaning:\n * 1. it can be expressed as an IEEE-754 double precision number\n * 2. it has a one-to-one mapping to a mathematical integer, meaning its\n * IEEE-754 representation cannot be the result of rounding any other\n * integer to fit the IEEE-754 representation\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isSafeInteger(value) {\n return isInteger(value) && Math.abs(value) <= MAX_SAFE_INTEGER;\n}\n//# sourceMappingURL=number.mjs.map" }, { - "id": "./node_modules/@dojo/shim/object.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/object.mjs", - "name": "./node_modules/@dojo/shim/object.mjs", + "id": "./node_modules/@dojo/framework/shim/object.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/object.mjs", + "name": "./node_modules/@dojo/framework/shim/object.mjs", "index": 18, "index2": 11, "size": 4061, @@ -3557,39 +3565,39 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "issuerId": "./node_modules/@dojo/shim/Map.mjs", - "issuerName": "./node_modules/@dojo/shim/Map.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/Map.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/Map.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./object", "loc": "3:0-42" }, { - "moduleId": "./node_modules/@dojo/core/lang.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/lang.mjs", - "module": "./node_modules/@dojo/core/lang.mjs", - "moduleName": "./node_modules/@dojo/core/lang.mjs", + "moduleId": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/lang.mjs", + "module": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleName": "./node_modules/@dojo/framework/core/lang.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/object", - "loc": "1:0-43" + "userRequest": "../shim/object", + "loc": "1:0-40" }, { - "moduleId": "./node_modules/@dojo/core/lang.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/lang.mjs", - "module": "./node_modules/@dojo/core/lang.mjs", - "moduleName": "./node_modules/@dojo/core/lang.mjs", + "moduleId": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/lang.mjs", + "module": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleName": "./node_modules/@dojo/framework/core/lang.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/object", - "loc": "2:0-43" + "userRequest": "../shim/object", + "loc": "2:0-40" } ], "usedExports": [ @@ -3611,9 +3619,9 @@ "source": "import global from './global';\nimport has from './support/has';\nimport { isSymbol } from './Symbol';\nexport let assign;\n/**\n * Gets the own property descriptor of the specified object.\n * An own property descriptor is one that is defined directly on the object and is not\n * inherited from the object's prototype.\n * @param o Object that contains the property.\n * @param p Name of the property.\n */\nexport let getOwnPropertyDescriptor;\n/**\n * Returns the names of the own properties of an object. The own properties of an object are those that are defined directly\n * on that object, and are not inherited from the object's prototype. The properties of an object include both fields (objects) and functions.\n * @param o Object that contains the own properties.\n */\nexport let getOwnPropertyNames;\n/**\n * Returns an array of all symbol properties found directly on object o.\n * @param o Object to retrieve the symbols from.\n */\nexport let getOwnPropertySymbols;\n/**\n * Returns true if the values are the same value, false otherwise.\n * @param value1 The first value.\n * @param value2 The second value.\n */\nexport let is;\n/**\n * Returns the names of the enumerable properties and methods of an object.\n * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.\n */\nexport let keys;\n/* ES7 Object static methods */\nexport let getOwnPropertyDescriptors;\nexport let entries;\nexport let values;\nif (true) {\n const globalObject = global.Object;\n assign = globalObject.assign;\n getOwnPropertyDescriptor = globalObject.getOwnPropertyDescriptor;\n getOwnPropertyNames = globalObject.getOwnPropertyNames;\n getOwnPropertySymbols = globalObject.getOwnPropertySymbols;\n is = globalObject.is;\n keys = globalObject.keys;\n}\nelse {\n keys = function symbolAwareKeys(o) {\n return Object.keys(o).filter((key) => !Boolean(key.match(/^@@.+/)));\n };\n assign = function assign(target, ...sources) {\n if (target == null) {\n // TypeError if undefined or null\n throw new TypeError('Cannot convert undefined or null to object');\n }\n const to = Object(target);\n sources.forEach((nextSource) => {\n if (nextSource) {\n // Skip over if undefined or null\n keys(nextSource).forEach((nextKey) => {\n to[nextKey] = nextSource[nextKey];\n });\n }\n });\n return to;\n };\n getOwnPropertyDescriptor = function getOwnPropertyDescriptor(o, prop) {\n if (isSymbol(prop)) {\n return Object.getOwnPropertyDescriptor(o, prop);\n }\n else {\n return Object.getOwnPropertyDescriptor(o, prop);\n }\n };\n getOwnPropertyNames = function getOwnPropertyNames(o) {\n return Object.getOwnPropertyNames(o).filter((key) => !Boolean(key.match(/^@@.+/)));\n };\n getOwnPropertySymbols = function getOwnPropertySymbols(o) {\n return Object.getOwnPropertyNames(o)\n .filter((key) => Boolean(key.match(/^@@.+/)))\n .map((key) => Symbol.for(key.substring(2)));\n };\n is = function is(value1, value2) {\n if (value1 === value2) {\n return value1 !== 0 || 1 / value1 === 1 / value2; // -0\n }\n return value1 !== value1 && value2 !== value2; // NaN\n };\n}\nif (true) {\n const globalObject = global.Object;\n getOwnPropertyDescriptors = globalObject.getOwnPropertyDescriptors;\n entries = globalObject.entries;\n values = globalObject.values;\n}\nelse {\n getOwnPropertyDescriptors = function getOwnPropertyDescriptors(o) {\n return getOwnPropertyNames(o).reduce((previous, key) => {\n previous[key] = getOwnPropertyDescriptor(o, key);\n return previous;\n }, {});\n };\n entries = function entries(o) {\n return keys(o).map((key) => [key, o[key]]);\n };\n values = function values(o) {\n return keys(o).map((key) => o[key]);\n };\n}\n//# sourceMappingURL=object.mjs.map" }, { - "id": "./node_modules/@dojo/shim/string.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/string.mjs", - "name": "./node_modules/@dojo/shim/string.mjs", + "id": "./node_modules/@dojo/framework/shim/string.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/string.mjs", + "name": "./node_modules/@dojo/framework/shim/string.mjs", "index": 17, "index2": 9, "size": 12418, @@ -3625,18 +3633,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/iterator.mjs", - "issuerId": "./node_modules/@dojo/shim/iterator.mjs", - "issuerName": "./node_modules/@dojo/shim/iterator.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/iterator.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/iterator.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/iterator.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/iterator.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/iterator.mjs", - "module": "./node_modules/@dojo/shim/iterator.mjs", - "moduleName": "./node_modules/@dojo/shim/iterator.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/iterator.mjs", + "module": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/iterator.mjs", "type": "harmony import", "userRequest": "./string", "loc": "2:0-66" @@ -3667,9 +3675,9 @@ "source": "import global from './global';\nimport has from './support/has';\nimport { wrapNative } from './support/util';\n/**\n * The minimum location of high surrogates\n */\nexport const HIGH_SURROGATE_MIN = 0xd800;\n/**\n * The maximum location of high surrogates\n */\nexport const HIGH_SURROGATE_MAX = 0xdbff;\n/**\n * The minimum location of low surrogates\n */\nexport const LOW_SURROGATE_MIN = 0xdc00;\n/**\n * The maximum location of low surrogates\n */\nexport const LOW_SURROGATE_MAX = 0xdfff;\n/* ES6 static methods */\n/**\n * Return the String value whose elements are, in order, the elements in the List elements.\n * If length is 0, the empty string is returned.\n * @param codePoints The code points to generate the string\n */\nexport let fromCodePoint;\n/**\n * `raw` is intended for use as a tag function of a Tagged Template String. When called\n * as such the first argument will be a well formed template call site object and the rest\n * parameter will contain the substitution values.\n * @param template A well-formed template string call site representation.\n * @param substitutions A set of substitution values.\n */\nexport let raw;\n/* ES6 instance methods */\n/**\n * Returns a nonnegative integer Number less than 1114112 (0x110000) that is the code point\n * value of the UTF-16 encoded code point starting at the string element at position pos in\n * the String resulting from converting this object to a String.\n * If there is no element at that position, the result is undefined.\n * If a valid UTF-16 surrogate pair does not begin at pos, the result is the code unit at pos.\n */\nexport let codePointAt;\n/**\n * Returns true if the sequence of elements of searchString converted to a String is the\n * same as the corresponding elements of this object (converted to a String) starting at\n * endPosition – length(this). Otherwise returns false.\n */\nexport let endsWith;\n/**\n * Returns true if searchString appears as a substring of the result of converting this\n * object to a String, at one or more positions that are\n * greater than or equal to position; otherwise, returns false.\n * @param target The target string\n * @param searchString search string\n * @param position If position is undefined, 0 is assumed, so as to search all of the String.\n */\nexport let includes;\n/**\n * Returns the String value result of normalizing the string into the normalization form\n * named by form as specified in Unicode Standard Annex #15, Unicode Normalization Forms.\n * @param target The target string\n * @param form Applicable values: \"NFC\", \"NFD\", \"NFKC\", or \"NFKD\", If not specified default\n * is \"NFC\"\n */\nexport let normalize;\n/**\n * Returns a String value that is made from count copies appended together. If count is 0,\n * T is the empty String is returned.\n * @param count number of copies to append\n */\nexport let repeat;\n/**\n * Returns true if the sequence of elements of searchString converted to a String is the\n * same as the corresponding elements of this object (converted to a String) starting at\n * position. Otherwise returns false.\n */\nexport let startsWith;\n/* ES7 instance methods */\n/**\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\n * The padding is applied from the end (right) of the current string.\n *\n * @param target The target string\n * @param maxLength The length of the resulting string once the current string has been padded.\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\n *\n * @param fillString The string to pad the current string with.\n * If this string is too long, it will be truncated and the left-most part will be applied.\n * The default value for this parameter is \" \" (U+0020).\n */\nexport let padEnd;\n/**\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\n * The padding is applied from the start (left) of the current string.\n *\n * @param target The target string\n * @param maxLength The length of the resulting string once the current string has been padded.\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\n *\n * @param fillString The string to pad the current string with.\n * If this string is too long, it will be truncated and the left-most part will be applied.\n * The default value for this parameter is \" \" (U+0020).\n */\nexport let padStart;\nif (true && true) {\n fromCodePoint = global.String.fromCodePoint;\n raw = global.String.raw;\n codePointAt = wrapNative(global.String.prototype.codePointAt);\n endsWith = wrapNative(global.String.prototype.endsWith);\n includes = wrapNative(global.String.prototype.includes);\n normalize = wrapNative(global.String.prototype.normalize);\n repeat = wrapNative(global.String.prototype.repeat);\n startsWith = wrapNative(global.String.prototype.startsWith);\n}\nelse {\n /**\n * Validates that text is defined, and normalizes position (based on the given default if the input is NaN).\n * Used by startsWith, includes, and endsWith.\n *\n * @return Normalized position.\n */\n const normalizeSubstringArgs = function (name, text, search, position, isEnd = false) {\n if (text == null) {\n throw new TypeError('string.' + name + ' requires a valid string to search against.');\n }\n const length = text.length;\n position = position !== position ? (isEnd ? length : 0) : position;\n return [text, String(search), Math.min(Math.max(position, 0), length)];\n };\n fromCodePoint = function fromCodePoint(...codePoints) {\n // Adapted from https://github.com/mathiasbynens/String.fromCodePoint\n const length = arguments.length;\n if (!length) {\n return '';\n }\n const fromCharCode = String.fromCharCode;\n const MAX_SIZE = 0x4000;\n let codeUnits = [];\n let index = -1;\n let result = '';\n while (++index < length) {\n let codePoint = Number(arguments[index]);\n // Code points must be finite integers within the valid range\n let isValid = isFinite(codePoint) && Math.floor(codePoint) === codePoint && codePoint >= 0 && codePoint <= 0x10ffff;\n if (!isValid) {\n throw RangeError('string.fromCodePoint: Invalid code point ' + codePoint);\n }\n if (codePoint <= 0xffff) {\n // BMP code point\n codeUnits.push(codePoint);\n }\n else {\n // Astral code point; split in surrogate halves\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n codePoint -= 0x10000;\n let highSurrogate = (codePoint >> 10) + HIGH_SURROGATE_MIN;\n let lowSurrogate = codePoint % 0x400 + LOW_SURROGATE_MIN;\n codeUnits.push(highSurrogate, lowSurrogate);\n }\n if (index + 1 === length || codeUnits.length > MAX_SIZE) {\n result += fromCharCode.apply(null, codeUnits);\n codeUnits.length = 0;\n }\n }\n return result;\n };\n raw = function raw(callSite, ...substitutions) {\n let rawStrings = callSite.raw;\n let result = '';\n let numSubstitutions = substitutions.length;\n if (callSite == null || callSite.raw == null) {\n throw new TypeError('string.raw requires a valid callSite object with a raw value');\n }\n for (let i = 0, length = rawStrings.length; i < length; i++) {\n result += rawStrings[i] + (i < numSubstitutions && i < length - 1 ? substitutions[i] : '');\n }\n return result;\n };\n codePointAt = function codePointAt(text, position = 0) {\n // Adapted from https://github.com/mathiasbynens/String.prototype.codePointAt\n if (text == null) {\n throw new TypeError('string.codePointAt requries a valid string.');\n }\n const length = text.length;\n if (position !== position) {\n position = 0;\n }\n if (position < 0 || position >= length) {\n return undefined;\n }\n // Get the first code unit\n const first = text.charCodeAt(position);\n if (first >= HIGH_SURROGATE_MIN && first <= HIGH_SURROGATE_MAX && length > position + 1) {\n // Start of a surrogate pair (high surrogate and there is a next code unit); check for low surrogate\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n const second = text.charCodeAt(position + 1);\n if (second >= LOW_SURROGATE_MIN && second <= LOW_SURROGATE_MAX) {\n return (first - HIGH_SURROGATE_MIN) * 0x400 + second - LOW_SURROGATE_MIN + 0x10000;\n }\n }\n return first;\n };\n endsWith = function endsWith(text, search, endPosition) {\n if (endPosition == null) {\n endPosition = text.length;\n }\n [text, search, endPosition] = normalizeSubstringArgs('endsWith', text, search, endPosition, true);\n const start = endPosition - search.length;\n if (start < 0) {\n return false;\n }\n return text.slice(start, endPosition) === search;\n };\n includes = function includes(text, search, position = 0) {\n [text, search, position] = normalizeSubstringArgs('includes', text, search, position);\n return text.indexOf(search, position) !== -1;\n };\n repeat = function repeat(text, count = 0) {\n // Adapted from https://github.com/mathiasbynens/String.prototype.repeat\n if (text == null) {\n throw new TypeError('string.repeat requires a valid string.');\n }\n if (count !== count) {\n count = 0;\n }\n if (count < 0 || count === Infinity) {\n throw new RangeError('string.repeat requires a non-negative finite count.');\n }\n let result = '';\n while (count) {\n if (count % 2) {\n result += text;\n }\n if (count > 1) {\n text += text;\n }\n count >>= 1;\n }\n return result;\n };\n startsWith = function startsWith(text, search, position = 0) {\n search = String(search);\n [text, search, position] = normalizeSubstringArgs('startsWith', text, search, position);\n const end = position + search.length;\n if (end > text.length) {\n return false;\n }\n return text.slice(position, end) === search;\n };\n}\nif (true) {\n padEnd = wrapNative(global.String.prototype.padEnd);\n padStart = wrapNative(global.String.prototype.padStart);\n}\nelse {\n padEnd = function padEnd(text, maxLength, fillString = ' ') {\n if (text === null || text === undefined) {\n throw new TypeError('string.repeat requires a valid string.');\n }\n if (maxLength === Infinity) {\n throw new RangeError('string.padEnd requires a non-negative finite count.');\n }\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\n maxLength = 0;\n }\n let strText = String(text);\n const padding = maxLength - strText.length;\n if (padding > 0) {\n strText +=\n repeat(fillString, Math.floor(padding / fillString.length)) +\n fillString.slice(0, padding % fillString.length);\n }\n return strText;\n };\n padStart = function padStart(text, maxLength, fillString = ' ') {\n if (text === null || text === undefined) {\n throw new TypeError('string.repeat requires a valid string.');\n }\n if (maxLength === Infinity) {\n throw new RangeError('string.padStart requires a non-negative finite count.');\n }\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\n maxLength = 0;\n }\n let strText = String(text);\n const padding = maxLength - strText.length;\n if (padding > 0) {\n strText =\n repeat(fillString, Math.floor(padding / fillString.length)) +\n fillString.slice(0, padding % fillString.length) +\n strText;\n }\n return strText;\n };\n}\n//# sourceMappingURL=string.mjs.map" }, { - "id": "./node_modules/@dojo/shim/support/has.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/has.mjs", - "name": "./node_modules/@dojo/shim/support/has.mjs", + "id": "./node_modules/@dojo/framework/shim/support/has.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/has.mjs", + "name": "./node_modules/@dojo/framework/shim/support/has.mjs", "index": 6, "index2": 5, "size": 6151, @@ -3681,81 +3689,81 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "4:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "4:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Symbol.mjs", - "module": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleName": "./node_modules/@dojo/shim/Symbol.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./support/has", - "loc": "1:0-32" + "loc": "3:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Symbol.mjs", + "module": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Symbol.mjs", "type": "harmony import", "userRequest": "./support/has", - "loc": "3:0-32" + "loc": "1:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/object.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/object.mjs", - "module": "./node_modules/@dojo/shim/object.mjs", - "moduleName": "./node_modules/@dojo/shim/object.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/object.mjs", + "module": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/object.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "2:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "4:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/string.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/string.mjs", - "module": "./node_modules/@dojo/shim/string.mjs", - "moduleName": "./node_modules/@dojo/shim/string.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/string.mjs", + "module": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/string.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "2:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/queue.mjs", - "module": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleName": "./node_modules/@dojo/shim/support/queue.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/queue.mjs", + "module": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/queue.mjs", "type": "harmony import", "userRequest": "./has", "loc": "2:0-24" @@ -3773,12 +3781,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import has, { add } from '@dojo/has/has';\nimport global from '../global';\nexport default has;\nexport * from '@dojo/has/has';\n/* ECMAScript 6 and 7 Features */\n/* Array */\nadd('es6-array', () => {\n return (['from', 'of'].every((key) => key in global.Array) &&\n ['findIndex', 'find', 'copyWithin'].every((key) => key in global.Array.prototype));\n}, true);\nadd('es6-array-fill', () => {\n if ('fill' in global.Array.prototype) {\n /* Some versions of Safari do not properly implement this */\n return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1;\n }\n return false;\n}, true);\nadd('es7-array', () => 'includes' in global.Array.prototype, true);\n/* Map */\nadd('es6-map', () => {\n if (typeof global.Map === 'function') {\n /*\n IE11 and older versions of Safari are missing critical ES6 Map functionality\n We wrap this in a try/catch because sometimes the Map constructor exists, but does not\n take arguments (iOS 8.4)\n */\n try {\n const map = new global.Map([[0, 1]]);\n return map.has(0) &&\n typeof map.keys === 'function' &&\n true &&\n typeof map.values === 'function' &&\n typeof map.entries === 'function';\n }\n catch (e) {\n /* istanbul ignore next: not testing on iOS at the moment */\n return false;\n }\n }\n return false;\n}, true);\n/* Math */\nadd('es6-math', () => {\n return [\n 'clz32',\n 'sign',\n 'log10',\n 'log2',\n 'log1p',\n 'expm1',\n 'cosh',\n 'sinh',\n 'tanh',\n 'acosh',\n 'asinh',\n 'atanh',\n 'trunc',\n 'fround',\n 'cbrt',\n 'hypot'\n ].every((name) => typeof global.Math[name] === 'function');\n}, true);\nadd('es6-math-imul', () => {\n if ('imul' in global.Math) {\n /* Some versions of Safari on ios do not properly implement this */\n return Math.imul(0xffffffff, 5) === -5;\n }\n return false;\n}, true);\n/* Object */\nadd('es6-object', () => {\n return true &&\n ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof global.Object[name] === 'function');\n}, true);\nadd('es2017-object', () => {\n return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof global.Object[name] === 'function');\n}, true);\n/* Observable */\nadd('es-observable', () => typeof global.Observable !== 'undefined', true);\n/* Promise */\nadd('es6-promise', () => typeof global.Promise !== 'undefined' && true, true);\n/* Set */\nadd('es6-set', () => {\n if (typeof global.Set === 'function') {\n /* IE11 and older versions of Safari are missing critical ES6 Set functionality */\n const set = new global.Set([1]);\n return set.has(1) && 'keys' in set && typeof set.keys === 'function' && true;\n }\n return false;\n}, true);\n/* String */\nadd('es6-string', () => {\n return ([\n /* static methods */\n 'fromCodePoint'\n ].every((key) => typeof global.String[key] === 'function') &&\n [\n /* instance methods */\n 'codePointAt',\n 'normalize',\n 'repeat',\n 'startsWith',\n 'endsWith',\n 'includes'\n ].every((key) => typeof global.String.prototype[key] === 'function'));\n}, true);\nadd('es6-string-raw', () => {\n function getCallSite(callSite, ...substitutions) {\n const result = [...callSite];\n result.raw = callSite.raw;\n return result;\n }\n if ('raw' in global.String) {\n let b = 1;\n let callSite = getCallSite `a\\n${b}`;\n callSite.raw = ['a\\\\n'];\n const supportsTrunc = global.String.raw(callSite, 42) === 'a:\\\\n';\n return supportsTrunc;\n }\n return false;\n}, true);\nadd('es2017-string', () => {\n return ['padStart', 'padEnd'].every((key) => typeof global.String.prototype[key] === 'function');\n}, true);\n/* Symbol */\nadd('es6-symbol', () => typeof global.Symbol !== 'undefined' && typeof Symbol() === 'symbol', true);\n/* WeakMap */\nadd('es6-weakmap', () => {\n if (typeof global.WeakMap !== 'undefined') {\n /* IE11 and older versions of Safari are missing critical ES6 Map functionality */\n const key1 = {};\n const key2 = {};\n const map = new global.WeakMap([[key1, 1]]);\n Object.freeze(key1);\n return map.get(key1) === 1 && map.set(key2, 2) === map && true;\n }\n return false;\n}, true);\n/* Miscellaneous features */\nadd('microtasks', () => true || false || true, true);\nadd('postmessage', () => {\n // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have\n // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist.\n return typeof global.window !== 'undefined' && typeof global.postMessage === 'function';\n}, true);\nadd('raf', () => typeof global.requestAnimationFrame === 'function', true);\nadd('setimmediate', () => typeof global.setImmediate !== 'undefined', true);\n/* DOM Features */\nadd('dom-mutationobserver', () => {\n if (true && Boolean(global.MutationObserver || global.WebKitMutationObserver)) {\n // IE11 has an unreliable MutationObserver implementation where setProperty() does not\n // generate a mutation event, observers can crash, and the queue does not drain\n // reliably. The following feature test was adapted from\n // https://gist.github.com/t10ko/4aceb8c71681fdb275e33efe5e576b14\n const example = document.createElement('div');\n /* tslint:disable-next-line:variable-name */\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\n const observer = new HostMutationObserver(function () { });\n observer.observe(example, { attributes: true });\n example.style.setProperty('display', 'block');\n return Boolean(observer.takeRecords().length);\n }\n return false;\n}, true);\nadd('dom-webanimation', () => true && global.Animation !== undefined && global.KeyframeEffect !== undefined, true);\n//# sourceMappingURL=has.mjs.map" + "source": "import has, { add } from '../../has/has';\nimport global from '../global';\nexport default has;\nexport * from '../../has/has';\n/* ECMAScript 6 and 7 Features */\n/* Array */\nadd('es6-array', () => {\n return (['from', 'of'].every((key) => key in global.Array) &&\n ['findIndex', 'find', 'copyWithin'].every((key) => key in global.Array.prototype));\n}, true);\nadd('es6-array-fill', () => {\n if ('fill' in global.Array.prototype) {\n /* Some versions of Safari do not properly implement this */\n return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1;\n }\n return false;\n}, true);\nadd('es7-array', () => 'includes' in global.Array.prototype, true);\n/* Map */\nadd('es6-map', () => {\n if (typeof global.Map === 'function') {\n /*\n IE11 and older versions of Safari are missing critical ES6 Map functionality\n We wrap this in a try/catch because sometimes the Map constructor exists, but does not\n take arguments (iOS 8.4)\n */\n try {\n const map = new global.Map([[0, 1]]);\n return map.has(0) &&\n typeof map.keys === 'function' &&\n true &&\n typeof map.values === 'function' &&\n typeof map.entries === 'function';\n }\n catch (e) {\n /* istanbul ignore next: not testing on iOS at the moment */\n return false;\n }\n }\n return false;\n}, true);\n/* Math */\nadd('es6-math', () => {\n return [\n 'clz32',\n 'sign',\n 'log10',\n 'log2',\n 'log1p',\n 'expm1',\n 'cosh',\n 'sinh',\n 'tanh',\n 'acosh',\n 'asinh',\n 'atanh',\n 'trunc',\n 'fround',\n 'cbrt',\n 'hypot'\n ].every((name) => typeof global.Math[name] === 'function');\n}, true);\nadd('es6-math-imul', () => {\n if ('imul' in global.Math) {\n /* Some versions of Safari on ios do not properly implement this */\n return Math.imul(0xffffffff, 5) === -5;\n }\n return false;\n}, true);\n/* Object */\nadd('es6-object', () => {\n return true &&\n ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof global.Object[name] === 'function');\n}, true);\nadd('es2017-object', () => {\n return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof global.Object[name] === 'function');\n}, true);\n/* Observable */\nadd('es-observable', () => typeof global.Observable !== 'undefined', true);\n/* Promise */\nadd('es6-promise', () => typeof global.Promise !== 'undefined' && true, true);\n/* Set */\nadd('es6-set', () => {\n if (typeof global.Set === 'function') {\n /* IE11 and older versions of Safari are missing critical ES6 Set functionality */\n const set = new global.Set([1]);\n return set.has(1) && 'keys' in set && typeof set.keys === 'function' && true;\n }\n return false;\n}, true);\n/* String */\nadd('es6-string', () => {\n return ([\n /* static methods */\n 'fromCodePoint'\n ].every((key) => typeof global.String[key] === 'function') &&\n [\n /* instance methods */\n 'codePointAt',\n 'normalize',\n 'repeat',\n 'startsWith',\n 'endsWith',\n 'includes'\n ].every((key) => typeof global.String.prototype[key] === 'function'));\n}, true);\nadd('es6-string-raw', () => {\n function getCallSite(callSite, ...substitutions) {\n const result = [...callSite];\n result.raw = callSite.raw;\n return result;\n }\n if ('raw' in global.String) {\n let b = 1;\n let callSite = getCallSite `a\\n${b}`;\n callSite.raw = ['a\\\\n'];\n const supportsTrunc = global.String.raw(callSite, 42) === 'a:\\\\n';\n return supportsTrunc;\n }\n return false;\n}, true);\nadd('es2017-string', () => {\n return ['padStart', 'padEnd'].every((key) => typeof global.String.prototype[key] === 'function');\n}, true);\n/* Symbol */\nadd('es6-symbol', () => typeof global.Symbol !== 'undefined' && typeof Symbol() === 'symbol', true);\n/* WeakMap */\nadd('es6-weakmap', () => {\n if (typeof global.WeakMap !== 'undefined') {\n /* IE11 and older versions of Safari are missing critical ES6 Map functionality */\n const key1 = {};\n const key2 = {};\n const map = new global.WeakMap([[key1, 1]]);\n Object.freeze(key1);\n return map.get(key1) === 1 && map.set(key2, 2) === map && true;\n }\n return false;\n}, true);\n/* Miscellaneous features */\nadd('microtasks', () => true || false || true, true);\nadd('postmessage', () => {\n // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have\n // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist.\n return typeof global.window !== 'undefined' && typeof global.postMessage === 'function';\n}, true);\nadd('raf', () => typeof global.requestAnimationFrame === 'function', true);\nadd('setimmediate', () => typeof global.setImmediate !== 'undefined', true);\n/* DOM Features */\nadd('dom-mutationobserver', () => {\n if (true && Boolean(global.MutationObserver || global.WebKitMutationObserver)) {\n // IE11 has an unreliable MutationObserver implementation where setProperty() does not\n // generate a mutation event, observers can crash, and the queue does not drain\n // reliably. The following feature test was adapted from\n // https://gist.github.com/t10ko/4aceb8c71681fdb275e33efe5e576b14\n const example = document.createElement('div');\n /* tslint:disable-next-line:variable-name */\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\n const observer = new HostMutationObserver(function () { });\n observer.observe(example, { attributes: true });\n example.style.setProperty('display', 'block');\n return Boolean(observer.takeRecords().length);\n }\n return false;\n}, true);\nadd('dom-webanimation', () => true && global.Animation !== undefined && global.KeyframeEffect !== undefined, true);\n//# sourceMappingURL=has.mjs.map" }, { - "id": "./node_modules/@dojo/shim/support/queue.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/queue.mjs", - "name": "./node_modules/@dojo/shim/support/queue.mjs", + "id": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/queue.mjs", + "name": "./node_modules/@dojo/framework/shim/support/queue.mjs", "index": 23, "index2": 14, "size": 6196, @@ -3790,18 +3798,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Promise.mjs", - "issuerId": "./node_modules/@dojo/shim/Promise.mjs", - "issuerName": "./node_modules/@dojo/shim/Promise.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Promise.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/Promise.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./support/queue", "loc": "2:0-49" @@ -3818,9 +3826,9 @@ "source": "import global from '../global';\nimport has from './has';\nfunction executeTask(item) {\n if (item && item.isActive && item.callback) {\n item.callback();\n }\n}\nfunction getQueueHandle(item, destructor) {\n return {\n destroy: function () {\n this.destroy = function () { };\n item.isActive = false;\n item.callback = null;\n if (destructor) {\n destructor();\n }\n }\n };\n}\nlet checkMicroTaskQueue;\nlet microTasks;\n/**\n * Schedules a callback to the macrotask queue.\n *\n * @param callback the function to be queued and later executed.\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\n */\nexport const queueTask = (function () {\n let destructor;\n let enqueue;\n // Since the IE implementation of `setImmediate` is not flawless, we will test for `postMessage` first.\n if (true) {\n const queue = [];\n global.addEventListener('message', function (event) {\n // Confirm that the event was triggered by the current window and by this particular implementation.\n if (event.source === global && event.data === 'dojo-queue-message') {\n event.stopPropagation();\n if (queue.length) {\n executeTask(queue.shift());\n }\n }\n });\n enqueue = function (item) {\n queue.push(item);\n global.postMessage('dojo-queue-message', '*');\n };\n }\n else if (false) {\n destructor = global.clearImmediate;\n enqueue = function (item) {\n return setImmediate(executeTask.bind(null, item));\n };\n }\n else {\n destructor = global.clearTimeout;\n enqueue = function (item) {\n return setTimeout(executeTask.bind(null, item), 0);\n };\n }\n function queueTask(callback) {\n const item = {\n isActive: true,\n callback: callback\n };\n const id = enqueue(item);\n return getQueueHandle(item, destructor &&\n function () {\n destructor(id);\n });\n }\n // TODO: Use aspect.before when it is available.\n return true\n ? queueTask\n : function (callback) {\n checkMicroTaskQueue();\n return queueTask(callback);\n };\n})();\n// When no mechanism for registering microtasks is exposed by the environment, microtasks will\n// be queued and then executed in a single macrotask before the other macrotasks are executed.\nif (!true) {\n let isMicroTaskQueued = false;\n microTasks = [];\n checkMicroTaskQueue = function () {\n if (!isMicroTaskQueued) {\n isMicroTaskQueued = true;\n queueTask(function () {\n isMicroTaskQueued = false;\n if (microTasks.length) {\n let item;\n while ((item = microTasks.shift())) {\n executeTask(item);\n }\n }\n });\n }\n };\n}\n/**\n * Schedules an animation task with `window.requestAnimationFrame` if it exists, or with `queueTask` otherwise.\n *\n * Since requestAnimationFrame's behavior does not match that expected from `queueTask`, it is not used there.\n * However, at times it makes more sense to delegate to requestAnimationFrame; hence the following method.\n *\n * @param callback the function to be queued and later executed.\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\n */\nexport const queueAnimationTask = (function () {\n if (!true) {\n return queueTask;\n }\n function queueAnimationTask(callback) {\n const item = {\n isActive: true,\n callback: callback\n };\n const rafId = requestAnimationFrame(executeTask.bind(null, item));\n return getQueueHandle(item, function () {\n cancelAnimationFrame(rafId);\n });\n }\n // TODO: Use aspect.before when it is available.\n return true\n ? queueAnimationTask\n : function (callback) {\n checkMicroTaskQueue();\n return queueAnimationTask(callback);\n };\n})();\n/**\n * Schedules a callback to the microtask queue.\n *\n * Any callbacks registered with `queueMicroTask` will be executed before the next macrotask. If no native\n * mechanism for scheduling macrotasks is exposed, then any callbacks will be fired before any macrotask\n * registered with `queueTask` or `queueAnimationTask`.\n *\n * @param callback the function to be queued and later executed.\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\n */\nexport let queueMicroTask = (function () {\n let enqueue;\n if (false) {\n enqueue = function (item) {\n global.process.nextTick(executeTask.bind(null, item));\n };\n }\n else if (true) {\n enqueue = function (item) {\n global.Promise.resolve(item).then(executeTask);\n };\n }\n else if (true) {\n /* tslint:disable-next-line:variable-name */\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\n const node = document.createElement('div');\n const queue = [];\n const observer = new HostMutationObserver(function () {\n while (queue.length > 0) {\n const item = queue.shift();\n if (item && item.isActive && item.callback) {\n item.callback();\n }\n }\n });\n observer.observe(node, { attributes: true });\n enqueue = function (item) {\n queue.push(item);\n node.setAttribute('queueStatus', '1');\n };\n }\n else {\n enqueue = function (item) {\n checkMicroTaskQueue();\n microTasks.push(item);\n };\n }\n return function (callback) {\n const item = {\n isActive: true,\n callback: callback\n };\n enqueue(item);\n return getQueueHandle(item);\n };\n})();\n//# sourceMappingURL=queue.mjs.map" }, { - "id": "./node_modules/@dojo/shim/support/util.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/util.mjs", - "name": "./node_modules/@dojo/shim/support/util.mjs", + "id": "./node_modules/@dojo/framework/shim/support/util.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/util.mjs", + "name": "./node_modules/@dojo/framework/shim/support/util.mjs", "index": 11, "index2": 6, "size": 853, @@ -3832,36 +3840,36 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./support/util", "loc": "5:0-44" }, { - "moduleId": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Symbol.mjs", - "module": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleName": "./node_modules/@dojo/shim/Symbol.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Symbol.mjs", + "module": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Symbol.mjs", "type": "harmony import", "userRequest": "./support/util", "loc": "3:0-52" }, { - "moduleId": "./node_modules/@dojo/shim/string.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/string.mjs", - "module": "./node_modules/@dojo/shim/string.mjs", - "moduleName": "./node_modules/@dojo/shim/string.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/string.mjs", + "module": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/string.mjs", "type": "harmony import", "userRequest": "./support/util", "loc": "3:0-44" @@ -3880,12 +3888,12 @@ "source": "/**\n * Helper function to generate a value property descriptor\n *\n * @param value The value the property descriptor should be set to\n * @param enumerable If the property should be enumberable, defaults to false\n * @param writable If the property should be writable, defaults to true\n * @param configurable If the property should be configurable, defaults to true\n * @return The property descriptor object\n */\nexport function getValueDescriptor(value, enumerable = false, writable = true, configurable = true) {\n return {\n value: value,\n enumerable: enumerable,\n writable: writable,\n configurable: configurable\n };\n}\nexport function wrapNative(nativeFunction) {\n return function (target, ...args) {\n return nativeFunction.apply(target, args);\n };\n}\n//# sourceMappingURL=util.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/Injector.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Injector.mjs", - "name": "./node_modules/@dojo/widget-core/Injector.mjs", + "id": "./node_modules/@dojo/framework/widget-core/Injector.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Injector.mjs", + "name": "./node_modules/@dojo/framework/widget-core/Injector.mjs", "index": 37, "index2": 31, - "size": 496, + "size": 493, "cacheable": true, "built": true, "optional": false, @@ -3894,18 +3902,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../Injector", "loc": "2:0-41" @@ -3920,15 +3928,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { Evented } from '@dojo/core/Evented';\nexport class Injector extends Evented {\n constructor(payload) {\n super();\n this._payload = payload;\n }\n setInvalidator(invalidator) {\n this._invalidator = invalidator;\n }\n get() {\n return this._payload;\n }\n set(payload) {\n this._payload = payload;\n if (this._invalidator) {\n this._invalidator();\n }\n }\n}\nexport default Injector;\n//# sourceMappingURL=Injector.mjs.map" + "source": "import { Evented } from '../core/Evented';\nexport class Injector extends Evented {\n constructor(payload) {\n super();\n this._payload = payload;\n }\n setInvalidator(invalidator) {\n this._invalidator = invalidator;\n }\n get() {\n return this._payload;\n }\n set(payload) {\n this._payload = payload;\n if (this._invalidator) {\n this._invalidator();\n }\n }\n}\nexport default Injector;\n//# sourceMappingURL=Injector.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/NodeHandler.mjs", - "name": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "id": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "name": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", "index": 28, "index2": 22, - "size": 1096, + "size": 1090, "cacheable": true, "built": true, "optional": false, @@ -3937,18 +3945,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./NodeHandler", "loc": "7:0-40" @@ -3964,15 +3972,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { Evented } from '@dojo/core/Evented';\nimport Map from '@dojo/shim/Map';\n/**\n * Enum to identify the type of event.\n * Listening to 'Projector' will notify when projector is created or updated\n * Listening to 'Widget' will notify when widget root is created or updated\n */\nexport var NodeEventType;\n(function (NodeEventType) {\n NodeEventType[\"Projector\"] = \"Projector\";\n NodeEventType[\"Widget\"] = \"Widget\";\n})(NodeEventType || (NodeEventType = {}));\nexport class NodeHandler extends Evented {\n constructor() {\n super(...arguments);\n this._nodeMap = new Map();\n }\n get(key) {\n return this._nodeMap.get(key);\n }\n has(key) {\n return this._nodeMap.has(key);\n }\n add(element, key) {\n this._nodeMap.set(key, element);\n this.emit({ type: key });\n }\n addRoot() {\n this.emit({ type: NodeEventType.Widget });\n }\n addProjector() {\n this.emit({ type: NodeEventType.Projector });\n }\n clear() {\n this._nodeMap.clear();\n }\n}\nexport default NodeHandler;\n//# sourceMappingURL=NodeHandler.mjs.map" + "source": "import { Evented } from '../core/Evented';\nimport Map from '../shim/Map';\n/**\n * Enum to identify the type of event.\n * Listening to 'Projector' will notify when projector is created or updated\n * Listening to 'Widget' will notify when widget root is created or updated\n */\nexport var NodeEventType;\n(function (NodeEventType) {\n NodeEventType[\"Projector\"] = \"Projector\";\n NodeEventType[\"Widget\"] = \"Widget\";\n})(NodeEventType || (NodeEventType = {}));\nexport class NodeHandler extends Evented {\n constructor() {\n super(...arguments);\n this._nodeMap = new Map();\n }\n get(key) {\n return this._nodeMap.get(key);\n }\n has(key) {\n return this._nodeMap.has(key);\n }\n add(element, key) {\n this._nodeMap.set(key, element);\n this.emit({ type: key });\n }\n addRoot() {\n this.emit({ type: NodeEventType.Widget });\n }\n addProjector() {\n this.emit({ type: NodeEventType.Projector });\n }\n clear() {\n this._nodeMap.clear();\n }\n}\nexport default NodeHandler;\n//# sourceMappingURL=NodeHandler.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/Registry.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Registry.mjs", - "name": "./node_modules/@dojo/widget-core/Registry.mjs", + "id": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Registry.mjs", + "name": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "index": 21, "index2": 19, - "size": 3702, + "size": 3690, "cacheable": true, "built": true, "optional": false, @@ -3981,54 +3989,54 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./Registry", "loc": "9:0-71" }, { - "moduleId": "./node_modules/@dojo/widget-core/diff.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/diff.mjs", - "module": "./node_modules/@dojo/widget-core/diff.mjs", - "moduleName": "./node_modules/@dojo/widget-core/diff.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/diff.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/diff.mjs", + "module": "./node_modules/@dojo/framework/widget-core/diff.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/diff.mjs", "type": "harmony import", "userRequest": "./Registry", "loc": "1:0-46" }, { - "moduleId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/RegistryHandler.mjs", - "module": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "type": "harmony import", "userRequest": "./Registry", "loc": "3:0-38" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", "userRequest": "./Registry", "loc": "4:0-53" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/customElement.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", "type": "harmony import", "userRequest": "../Registry", "loc": "2:0-35" @@ -4049,15 +4057,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import Promise from '@dojo/shim/Promise';\nimport Map from '@dojo/shim/Map';\nimport Symbol from '@dojo/shim/Symbol';\nimport { Evented } from '@dojo/core/Evented';\n/**\n * Widget base symbol type\n */\nexport const WIDGET_BASE_TYPE = Symbol('Widget Base');\n/**\n * Checks is the item is a subclass of WidgetBase (or a WidgetBase)\n *\n * @param item the item to check\n * @returns true/false indicating if the item is a WidgetBaseConstructor\n */\nexport function isWidgetBaseConstructor(item) {\n return Boolean(item && item._type === WIDGET_BASE_TYPE);\n}\nexport function isWidgetConstructorDefaultExport(item) {\n return Boolean(item &&\n item.hasOwnProperty('__esModule') &&\n item.hasOwnProperty('default') &&\n isWidgetBaseConstructor(item.default));\n}\n/**\n * The Registry implementation\n */\nexport class Registry extends Evented {\n /**\n * Emit loaded event for registry label\n */\n emitLoadedEvent(widgetLabel, item) {\n this.emit({\n type: widgetLabel,\n action: 'loaded',\n item\n });\n }\n define(label, item) {\n if (this._widgetRegistry === undefined) {\n this._widgetRegistry = new Map();\n }\n if (this._widgetRegistry.has(label)) {\n throw new Error(`widget has already been registered for '${label.toString()}'`);\n }\n this._widgetRegistry.set(label, item);\n if (item instanceof Promise) {\n item.then((widgetCtor) => {\n this._widgetRegistry.set(label, widgetCtor);\n this.emitLoadedEvent(label, widgetCtor);\n return widgetCtor;\n }, (error) => {\n throw error;\n });\n }\n else if (isWidgetBaseConstructor(item)) {\n this.emitLoadedEvent(label, item);\n }\n }\n defineInjector(label, injectorFactory) {\n if (this._injectorRegistry === undefined) {\n this._injectorRegistry = new Map();\n }\n if (this._injectorRegistry.has(label)) {\n throw new Error(`injector has already been registered for '${label.toString()}'`);\n }\n const invalidator = new Evented();\n const injectorItem = {\n injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })),\n invalidator\n };\n this._injectorRegistry.set(label, injectorItem);\n this.emitLoadedEvent(label, injectorItem);\n }\n get(label) {\n if (!this._widgetRegistry || !this.has(label)) {\n return null;\n }\n const item = this._widgetRegistry.get(label);\n if (isWidgetBaseConstructor(item)) {\n return item;\n }\n if (item instanceof Promise) {\n return null;\n }\n const promise = item();\n this._widgetRegistry.set(label, promise);\n promise.then((widgetCtor) => {\n if (isWidgetConstructorDefaultExport(widgetCtor)) {\n widgetCtor = widgetCtor.default;\n }\n this._widgetRegistry.set(label, widgetCtor);\n this.emitLoadedEvent(label, widgetCtor);\n return widgetCtor;\n }, (error) => {\n throw error;\n });\n return null;\n }\n getInjector(label) {\n if (!this._injectorRegistry || !this.hasInjector(label)) {\n return null;\n }\n return this._injectorRegistry.get(label);\n }\n has(label) {\n return Boolean(this._widgetRegistry && this._widgetRegistry.has(label));\n }\n hasInjector(label) {\n return Boolean(this._injectorRegistry && this._injectorRegistry.has(label));\n }\n}\nexport default Registry;\n//# sourceMappingURL=Registry.mjs.map" + "source": "import Promise from '../shim/Promise';\nimport Map from '../shim/Map';\nimport Symbol from '../shim/Symbol';\nimport { Evented } from '../core/Evented';\n/**\n * Widget base symbol type\n */\nexport const WIDGET_BASE_TYPE = Symbol('Widget Base');\n/**\n * Checks is the item is a subclass of WidgetBase (or a WidgetBase)\n *\n * @param item the item to check\n * @returns true/false indicating if the item is a WidgetBaseConstructor\n */\nexport function isWidgetBaseConstructor(item) {\n return Boolean(item && item._type === WIDGET_BASE_TYPE);\n}\nexport function isWidgetConstructorDefaultExport(item) {\n return Boolean(item &&\n item.hasOwnProperty('__esModule') &&\n item.hasOwnProperty('default') &&\n isWidgetBaseConstructor(item.default));\n}\n/**\n * The Registry implementation\n */\nexport class Registry extends Evented {\n /**\n * Emit loaded event for registry label\n */\n emitLoadedEvent(widgetLabel, item) {\n this.emit({\n type: widgetLabel,\n action: 'loaded',\n item\n });\n }\n define(label, item) {\n if (this._widgetRegistry === undefined) {\n this._widgetRegistry = new Map();\n }\n if (this._widgetRegistry.has(label)) {\n throw new Error(`widget has already been registered for '${label.toString()}'`);\n }\n this._widgetRegistry.set(label, item);\n if (item instanceof Promise) {\n item.then((widgetCtor) => {\n this._widgetRegistry.set(label, widgetCtor);\n this.emitLoadedEvent(label, widgetCtor);\n return widgetCtor;\n }, (error) => {\n throw error;\n });\n }\n else if (isWidgetBaseConstructor(item)) {\n this.emitLoadedEvent(label, item);\n }\n }\n defineInjector(label, injectorFactory) {\n if (this._injectorRegistry === undefined) {\n this._injectorRegistry = new Map();\n }\n if (this._injectorRegistry.has(label)) {\n throw new Error(`injector has already been registered for '${label.toString()}'`);\n }\n const invalidator = new Evented();\n const injectorItem = {\n injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })),\n invalidator\n };\n this._injectorRegistry.set(label, injectorItem);\n this.emitLoadedEvent(label, injectorItem);\n }\n get(label) {\n if (!this._widgetRegistry || !this.has(label)) {\n return null;\n }\n const item = this._widgetRegistry.get(label);\n if (isWidgetBaseConstructor(item)) {\n return item;\n }\n if (item instanceof Promise) {\n return null;\n }\n const promise = item();\n this._widgetRegistry.set(label, promise);\n promise.then((widgetCtor) => {\n if (isWidgetConstructorDefaultExport(widgetCtor)) {\n widgetCtor = widgetCtor.default;\n }\n this._widgetRegistry.set(label, widgetCtor);\n this.emitLoadedEvent(label, widgetCtor);\n return widgetCtor;\n }, (error) => {\n throw error;\n });\n return null;\n }\n getInjector(label) {\n if (!this._injectorRegistry || !this.hasInjector(label)) {\n return null;\n }\n return this._injectorRegistry.get(label);\n }\n has(label) {\n return Boolean(this._widgetRegistry && this._widgetRegistry.has(label));\n }\n hasInjector(label) {\n return Boolean(this._injectorRegistry && this._injectorRegistry.has(label));\n }\n}\nexport default Registry;\n//# sourceMappingURL=Registry.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/RegistryHandler.mjs", - "name": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "id": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "name": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "index": 27, "index2": 21, - "size": 2862, + "size": 2856, "cacheable": true, "built": true, "optional": false, @@ -4066,18 +4074,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./RegistryHandler", "loc": "6:0-48" @@ -4092,15 +4100,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { Map } from '@dojo/shim/Map';\nimport { Evented } from '@dojo/core/Evented';\nimport { Registry } from './Registry';\nexport class RegistryHandler extends Evented {\n constructor() {\n super();\n this._registry = new Registry();\n this._registryWidgetLabelMap = new Map();\n this._registryInjectorLabelMap = new Map();\n this.own(this._registry);\n const destroy = () => {\n if (this.baseRegistry) {\n this._registryWidgetLabelMap.delete(this.baseRegistry);\n this._registryInjectorLabelMap.delete(this.baseRegistry);\n this.baseRegistry = undefined;\n }\n };\n this.own({ destroy });\n }\n set base(baseRegistry) {\n if (this.baseRegistry) {\n this._registryWidgetLabelMap.delete(this.baseRegistry);\n this._registryInjectorLabelMap.delete(this.baseRegistry);\n }\n this.baseRegistry = baseRegistry;\n }\n define(label, widget) {\n this._registry.define(label, widget);\n }\n defineInjector(label, injector) {\n this._registry.defineInjector(label, injector);\n }\n has(label) {\n return this._registry.has(label) || Boolean(this.baseRegistry && this.baseRegistry.has(label));\n }\n hasInjector(label) {\n return this._registry.hasInjector(label) || Boolean(this.baseRegistry && this.baseRegistry.hasInjector(label));\n }\n get(label, globalPrecedence = false) {\n return this._get(label, globalPrecedence, 'get', this._registryWidgetLabelMap);\n }\n getInjector(label, globalPrecedence = false) {\n return this._get(label, globalPrecedence, 'getInjector', this._registryInjectorLabelMap);\n }\n _get(label, globalPrecedence, getFunctionName, labelMap) {\n const registries = globalPrecedence ? [this.baseRegistry, this._registry] : [this._registry, this.baseRegistry];\n for (let i = 0; i < registries.length; i++) {\n const registry = registries[i];\n if (!registry) {\n continue;\n }\n const item = registry[getFunctionName](label);\n const registeredLabels = labelMap.get(registry) || [];\n if (item) {\n return item;\n }\n else if (registeredLabels.indexOf(label) === -1) {\n const handle = registry.on(label, (event) => {\n if (event.action === 'loaded' &&\n this[getFunctionName](label, globalPrecedence) === event.item) {\n this.emit({ type: 'invalidate' });\n }\n });\n this.own(handle);\n labelMap.set(registry, [...registeredLabels, label]);\n }\n }\n return null;\n }\n}\nexport default RegistryHandler;\n//# sourceMappingURL=RegistryHandler.mjs.map" + "source": "import { Map } from '../shim/Map';\nimport { Evented } from '../core/Evented';\nimport { Registry } from './Registry';\nexport class RegistryHandler extends Evented {\n constructor() {\n super();\n this._registry = new Registry();\n this._registryWidgetLabelMap = new Map();\n this._registryInjectorLabelMap = new Map();\n this.own(this._registry);\n const destroy = () => {\n if (this.baseRegistry) {\n this._registryWidgetLabelMap.delete(this.baseRegistry);\n this._registryInjectorLabelMap.delete(this.baseRegistry);\n this.baseRegistry = undefined;\n }\n };\n this.own({ destroy });\n }\n set base(baseRegistry) {\n if (this.baseRegistry) {\n this._registryWidgetLabelMap.delete(this.baseRegistry);\n this._registryInjectorLabelMap.delete(this.baseRegistry);\n }\n this.baseRegistry = baseRegistry;\n }\n define(label, widget) {\n this._registry.define(label, widget);\n }\n defineInjector(label, injector) {\n this._registry.defineInjector(label, injector);\n }\n has(label) {\n return this._registry.has(label) || Boolean(this.baseRegistry && this.baseRegistry.has(label));\n }\n hasInjector(label) {\n return this._registry.hasInjector(label) || Boolean(this.baseRegistry && this.baseRegistry.hasInjector(label));\n }\n get(label, globalPrecedence = false) {\n return this._get(label, globalPrecedence, 'get', this._registryWidgetLabelMap);\n }\n getInjector(label, globalPrecedence = false) {\n return this._get(label, globalPrecedence, 'getInjector', this._registryInjectorLabelMap);\n }\n _get(label, globalPrecedence, getFunctionName, labelMap) {\n const registries = globalPrecedence ? [this.baseRegistry, this._registry] : [this._registry, this.baseRegistry];\n for (let i = 0; i < registries.length; i++) {\n const registry = registries[i];\n if (!registry) {\n continue;\n }\n const item = registry[getFunctionName](label);\n const registeredLabels = labelMap.get(registry) || [];\n if (item) {\n return item;\n }\n else if (registeredLabels.indexOf(label) === -1) {\n const handle = registry.on(label, (event) => {\n if (event.action === 'loaded' &&\n this[getFunctionName](label, globalPrecedence) === event.item) {\n this.emit({ type: 'invalidate' });\n }\n });\n this.own(handle);\n labelMap.set(registry, [...registeredLabels, label]);\n }\n }\n return null;\n }\n}\nexport default RegistryHandler;\n//# sourceMappingURL=RegistryHandler.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "name": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "id": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "name": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "index": 14, "index2": 26, - "size": 14386, + "size": 13720, "cacheable": true, "built": true, "optional": false, @@ -4109,18 +4117,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./WidgetBase", "loc": "2:0-50" @@ -4131,8 +4139,8 @@ "module": "./src/menu-item/MenuItem.ts", "moduleName": "./src/menu-item/MenuItem.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/WidgetBase", - "loc": "5:0-58" + "userRequest": "@dojo/framework/widget-core/WidgetBase", + "loc": "5:0-68" } ], "usedExports": [ @@ -4146,12 +4154,12 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import Map from '@dojo/shim/Map';\nimport WeakMap from '@dojo/shim/WeakMap';\nimport Symbol from '@dojo/shim/Symbol';\nimport { v } from './d';\nimport { auto } from './diff';\nimport RegistryHandler from './RegistryHandler';\nimport NodeHandler from './NodeHandler';\nimport { widgetInstanceMap } from './vdom';\nimport { isWidgetBaseConstructor, WIDGET_BASE_TYPE } from './Registry';\nconst decoratorMap = new Map();\nconst boundAuto = auto.bind(null);\nexport const noBind = Symbol.for('dojoNoBind');\n/**\n * Main widget base for all widgets to extend\n */\nexport class WidgetBase {\n /**\n * @constructor\n */\n constructor() {\n /**\n * Indicates if it is the initial set properties cycle\n */\n this._initialProperties = true;\n /**\n * Array of property keys considered changed from the previous set properties\n */\n this._changedPropertyKeys = [];\n this._nodeHandler = new NodeHandler();\n this._handles = [];\n this._children = [];\n this._decoratorCache = new Map();\n this._properties = {};\n this._boundRenderFunc = this.render.bind(this);\n this._boundInvalidate = this.invalidate.bind(this);\n widgetInstanceMap.set(this, {\n dirty: true,\n onAttach: () => {\n this.onAttach();\n },\n onDetach: () => {\n this.onDetach();\n this.destroy();\n },\n nodeHandler: this._nodeHandler,\n registry: () => {\n return this.registry;\n },\n coreProperties: {},\n rendering: false,\n inputProperties: {}\n });\n this._runAfterConstructors();\n }\n meta(MetaType) {\n if (this._metaMap === undefined) {\n this._metaMap = new Map();\n }\n let cached = this._metaMap.get(MetaType);\n if (!cached) {\n cached = new MetaType({\n invalidate: this._boundInvalidate,\n nodeHandler: this._nodeHandler,\n bind: this\n });\n this.own(cached);\n this._metaMap.set(MetaType, cached);\n }\n return cached;\n }\n onAttach() {\n // Do nothing by default.\n }\n onDetach() {\n // Do nothing by default.\n }\n get properties() {\n return this._properties;\n }\n get changedPropertyKeys() {\n return [...this._changedPropertyKeys];\n }\n __setCoreProperties__(coreProperties) {\n const { baseRegistry } = coreProperties;\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.coreProperties.baseRegistry !== baseRegistry) {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n this._registry.base = baseRegistry;\n this.invalidate();\n }\n instanceData.coreProperties = coreProperties;\n }\n __setProperties__(originalProperties) {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.inputProperties = originalProperties;\n const properties = this._runBeforeProperties(originalProperties);\n const registeredDiffPropertyNames = this.getDecorator('registeredDiffProperty');\n const changedPropertyKeys = [];\n const propertyNames = Object.keys(properties);\n if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) {\n const allProperties = [...propertyNames, ...Object.keys(this._properties)];\n const checkedProperties = [];\n const diffPropertyResults = {};\n let runReactions = false;\n for (let i = 0; i < allProperties.length; i++) {\n const propertyName = allProperties[i];\n if (checkedProperties.indexOf(propertyName) !== -1) {\n continue;\n }\n checkedProperties.push(propertyName);\n const previousProperty = this._properties[propertyName];\n const newProperty = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n if (registeredDiffPropertyNames.indexOf(propertyName) !== -1) {\n runReactions = true;\n const diffFunctions = this.getDecorator(`diffProperty:${propertyName}`);\n for (let i = 0; i < diffFunctions.length; i++) {\n const result = diffFunctions[i](previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n else {\n const result = boundAuto(previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n if (runReactions) {\n this._mapDiffPropertyReactions(properties, changedPropertyKeys).forEach((args, reaction) => {\n if (args.changed) {\n reaction.call(this, args.previousProperties, args.newProperties);\n }\n });\n }\n this._properties = diffPropertyResults;\n this._changedPropertyKeys = changedPropertyKeys;\n }\n else {\n this._initialProperties = false;\n for (let i = 0; i < propertyNames.length; i++) {\n const propertyName = propertyNames[i];\n if (typeof properties[propertyName] === 'function') {\n properties[propertyName] = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n }\n else {\n changedPropertyKeys.push(propertyName);\n }\n }\n this._changedPropertyKeys = changedPropertyKeys;\n this._properties = Object.assign({}, properties);\n }\n if (this._changedPropertyKeys.length > 0) {\n this.invalidate();\n }\n }\n get children() {\n return this._children;\n }\n __setChildren__(children) {\n if (this._children.length > 0 || children.length > 0) {\n this._children = children;\n this.invalidate();\n }\n }\n __render__() {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.dirty = false;\n const render = this._runBeforeRenders();\n let dNode = render();\n dNode = this.runAfterRenders(dNode);\n this._nodeHandler.clear();\n return dNode;\n }\n invalidate() {\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.invalidate) {\n instanceData.invalidate();\n }\n }\n render() {\n return v('div', {}, this.children);\n }\n /**\n * Function to add decorators to WidgetBase\n *\n * @param decoratorKey The key of the decorator\n * @param value The value of the decorator\n */\n addDecorator(decoratorKey, value) {\n value = Array.isArray(value) ? value : [value];\n if (this.hasOwnProperty('constructor')) {\n let decoratorList = decoratorMap.get(this.constructor);\n if (!decoratorList) {\n decoratorList = new Map();\n decoratorMap.set(this.constructor, decoratorList);\n }\n let specificDecoratorList = decoratorList.get(decoratorKey);\n if (!specificDecoratorList) {\n specificDecoratorList = [];\n decoratorList.set(decoratorKey, specificDecoratorList);\n }\n specificDecoratorList.push(...value);\n }\n else {\n const decorators = this.getDecorator(decoratorKey);\n this._decoratorCache.set(decoratorKey, [...decorators, ...value]);\n }\n }\n /**\n * Function to build the list of decorators from the global decorator map.\n *\n * @param decoratorKey The key of the decorator\n * @return An array of decorator values\n * @private\n */\n _buildDecoratorList(decoratorKey) {\n const allDecorators = [];\n let constructor = this.constructor;\n while (constructor) {\n const instanceMap = decoratorMap.get(constructor);\n if (instanceMap) {\n const decorators = instanceMap.get(decoratorKey);\n if (decorators) {\n allDecorators.unshift(...decorators);\n }\n }\n constructor = Object.getPrototypeOf(constructor);\n }\n return allDecorators;\n }\n /**\n * Function to retrieve decorator values\n *\n * @param decoratorKey The key of the decorator\n * @returns An array of decorator values\n */\n getDecorator(decoratorKey) {\n let allDecorators = this._decoratorCache.get(decoratorKey);\n if (allDecorators !== undefined) {\n return allDecorators;\n }\n allDecorators = this._buildDecoratorList(decoratorKey);\n this._decoratorCache.set(decoratorKey, allDecorators);\n return allDecorators;\n }\n _mapDiffPropertyReactions(newProperties, changedPropertyKeys) {\n const reactionFunctions = this.getDecorator('diffReaction');\n return reactionFunctions.reduce((reactionPropertyMap, { reaction, propertyName }) => {\n let reactionArguments = reactionPropertyMap.get(reaction);\n if (reactionArguments === undefined) {\n reactionArguments = {\n previousProperties: {},\n newProperties: {},\n changed: false\n };\n }\n reactionArguments.previousProperties[propertyName] = this._properties[propertyName];\n reactionArguments.newProperties[propertyName] = newProperties[propertyName];\n if (changedPropertyKeys.indexOf(propertyName) !== -1) {\n reactionArguments.changed = true;\n }\n reactionPropertyMap.set(reaction, reactionArguments);\n return reactionPropertyMap;\n }, new Map());\n }\n /**\n * Binds unbound property functions to the specified `bind` property\n *\n * @param properties properties to check for functions\n */\n _bindFunctionProperty(property, bind) {\n if (typeof property === 'function' && !property[noBind] && isWidgetBaseConstructor(property) === false) {\n if (this._bindFunctionPropertyMap === undefined) {\n this._bindFunctionPropertyMap = new WeakMap();\n }\n const bindInfo = this._bindFunctionPropertyMap.get(property) || {};\n let { boundFunc, scope } = bindInfo;\n if (boundFunc === undefined || scope !== bind) {\n boundFunc = property.bind(bind);\n this._bindFunctionPropertyMap.set(property, { boundFunc, scope: bind });\n }\n return boundFunc;\n }\n return property;\n }\n get registry() {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n return this._registry;\n }\n _runBeforeProperties(properties) {\n const beforeProperties = this.getDecorator('beforeProperties');\n if (beforeProperties.length > 0) {\n return beforeProperties.reduce((properties, beforePropertiesFunction) => {\n return Object.assign({}, properties, beforePropertiesFunction.call(this, properties));\n }, Object.assign({}, properties));\n }\n return properties;\n }\n /**\n * Run all registered before renders and return the updated render method\n */\n _runBeforeRenders() {\n const beforeRenders = this.getDecorator('beforeRender');\n if (beforeRenders.length > 0) {\n return beforeRenders.reduce((render, beforeRenderFunction) => {\n const updatedRender = beforeRenderFunction.call(this, render, this._properties, this._children);\n if (!updatedRender) {\n console.warn('Render function not returned from beforeRender, using previous render');\n return render;\n }\n return updatedRender;\n }, this._boundRenderFunc);\n }\n return this._boundRenderFunc;\n }\n /**\n * Run all registered after renders and return the decorated DNodes\n *\n * @param dNode The DNodes to run through the after renders\n */\n runAfterRenders(dNode) {\n const afterRenders = this.getDecorator('afterRender');\n if (afterRenders.length > 0) {\n return afterRenders.reduce((dNode, afterRenderFunction) => {\n return afterRenderFunction.call(this, dNode);\n }, dNode);\n }\n if (this._metaMap !== undefined) {\n this._metaMap.forEach((meta) => {\n meta.afterRender();\n });\n }\n return dNode;\n }\n _runAfterConstructors() {\n const afterConstructors = this.getDecorator('afterConstructor');\n if (afterConstructors.length > 0) {\n afterConstructors.forEach((afterConstructor) => afterConstructor.call(this));\n }\n }\n own(handle) {\n this._handles.push(handle);\n }\n destroy() {\n while (this._handles.length > 0) {\n const handle = this._handles.pop();\n if (handle) {\n handle.destroy();\n }\n }\n }\n}\n/**\n * static identifier\n */\nWidgetBase._type = WIDGET_BASE_TYPE;\nexport default WidgetBase;\n//# sourceMappingURL=WidgetBase.mjs.map" + "source": "import Map from '../shim/Map';\nimport WeakMap from '../shim/WeakMap';\nimport Symbol from '../shim/Symbol';\nimport { v } from './d';\nimport { auto } from './diff';\nimport RegistryHandler from './RegistryHandler';\nimport NodeHandler from './NodeHandler';\nimport { widgetInstanceMap } from './vdom';\nimport { isWidgetBaseConstructor, WIDGET_BASE_TYPE } from './Registry';\nconst decoratorMap = new Map();\nconst boundAuto = auto.bind(null);\nexport const noBind = Symbol.for('dojoNoBind');\n/**\n * Main widget base for all widgets to extend\n */\nexport class WidgetBase {\n /**\n * @constructor\n */\n constructor() {\n /**\n * Indicates if it is the initial set properties cycle\n */\n this._initialProperties = true;\n /**\n * Array of property keys considered changed from the previous set properties\n */\n this._changedPropertyKeys = [];\n this._nodeHandler = new NodeHandler();\n this._handles = [];\n this._children = [];\n this._decoratorCache = new Map();\n this._properties = {};\n this._boundRenderFunc = this.render.bind(this);\n this._boundInvalidate = this.invalidate.bind(this);\n widgetInstanceMap.set(this, {\n dirty: true,\n onAttach: () => {\n this.onAttach();\n },\n onDetach: () => {\n this.onDetach();\n this.destroy();\n },\n nodeHandler: this._nodeHandler,\n registry: () => {\n return this.registry;\n },\n coreProperties: {},\n rendering: false,\n inputProperties: {}\n });\n this._runAfterConstructors();\n }\n meta(MetaType) {\n if (this._metaMap === undefined) {\n this._metaMap = new Map();\n }\n let cached = this._metaMap.get(MetaType);\n if (!cached) {\n cached = new MetaType({\n invalidate: this._boundInvalidate,\n nodeHandler: this._nodeHandler,\n bind: this\n });\n this.own(cached);\n this._metaMap.set(MetaType, cached);\n }\n return cached;\n }\n onAttach() {\n // Do nothing by default.\n }\n onDetach() {\n // Do nothing by default.\n }\n get properties() {\n return this._properties;\n }\n get changedPropertyKeys() {\n return [...this._changedPropertyKeys];\n }\n __setCoreProperties__(coreProperties) {\n const { baseRegistry } = coreProperties;\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.coreProperties.baseRegistry !== baseRegistry) {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n this._registry.base = baseRegistry;\n this.invalidate();\n }\n instanceData.coreProperties = coreProperties;\n }\n __setProperties__(originalProperties) {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.inputProperties = originalProperties;\n const properties = this._runBeforeProperties(originalProperties);\n const registeredDiffPropertyNames = this.getDecorator('registeredDiffProperty');\n const changedPropertyKeys = [];\n const propertyNames = Object.keys(properties);\n if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) {\n const allProperties = [...propertyNames, ...Object.keys(this._properties)];\n const checkedProperties = [];\n const diffPropertyResults = {};\n let runReactions = false;\n for (let i = 0; i < allProperties.length; i++) {\n const propertyName = allProperties[i];\n if (checkedProperties.indexOf(propertyName) !== -1) {\n continue;\n }\n checkedProperties.push(propertyName);\n const previousProperty = this._properties[propertyName];\n const newProperty = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n if (registeredDiffPropertyNames.indexOf(propertyName) !== -1) {\n runReactions = true;\n const diffFunctions = this.getDecorator(`diffProperty:${propertyName}`);\n for (let i = 0; i < diffFunctions.length; i++) {\n const result = diffFunctions[i](previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n else {\n const result = boundAuto(previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n if (runReactions) {\n const reactionFunctions = this.getDecorator('diffReaction');\n const executedReactions = [];\n reactionFunctions.forEach(({ reaction, propertyName }) => {\n const propertyChanged = changedPropertyKeys.indexOf(propertyName) !== -1;\n const reactionRun = executedReactions.indexOf(reaction) !== -1;\n if (propertyChanged && !reactionRun) {\n reaction.call(this, this._properties, diffPropertyResults);\n executedReactions.push(reaction);\n }\n });\n }\n this._properties = diffPropertyResults;\n this._changedPropertyKeys = changedPropertyKeys;\n }\n else {\n this._initialProperties = false;\n for (let i = 0; i < propertyNames.length; i++) {\n const propertyName = propertyNames[i];\n if (typeof properties[propertyName] === 'function') {\n properties[propertyName] = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n }\n else {\n changedPropertyKeys.push(propertyName);\n }\n }\n this._changedPropertyKeys = changedPropertyKeys;\n this._properties = Object.assign({}, properties);\n }\n if (this._changedPropertyKeys.length > 0) {\n this.invalidate();\n }\n }\n get children() {\n return this._children;\n }\n __setChildren__(children) {\n if (this._children.length > 0 || children.length > 0) {\n this._children = children;\n this.invalidate();\n }\n }\n __render__() {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.dirty = false;\n const render = this._runBeforeRenders();\n let dNode = render();\n dNode = this.runAfterRenders(dNode);\n this._nodeHandler.clear();\n return dNode;\n }\n invalidate() {\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.invalidate) {\n instanceData.invalidate();\n }\n }\n render() {\n return v('div', {}, this.children);\n }\n /**\n * Function to add decorators to WidgetBase\n *\n * @param decoratorKey The key of the decorator\n * @param value The value of the decorator\n */\n addDecorator(decoratorKey, value) {\n value = Array.isArray(value) ? value : [value];\n if (this.hasOwnProperty('constructor')) {\n let decoratorList = decoratorMap.get(this.constructor);\n if (!decoratorList) {\n decoratorList = new Map();\n decoratorMap.set(this.constructor, decoratorList);\n }\n let specificDecoratorList = decoratorList.get(decoratorKey);\n if (!specificDecoratorList) {\n specificDecoratorList = [];\n decoratorList.set(decoratorKey, specificDecoratorList);\n }\n specificDecoratorList.push(...value);\n }\n else {\n const decorators = this.getDecorator(decoratorKey);\n this._decoratorCache.set(decoratorKey, [...decorators, ...value]);\n }\n }\n /**\n * Function to build the list of decorators from the global decorator map.\n *\n * @param decoratorKey The key of the decorator\n * @return An array of decorator values\n * @private\n */\n _buildDecoratorList(decoratorKey) {\n const allDecorators = [];\n let constructor = this.constructor;\n while (constructor) {\n const instanceMap = decoratorMap.get(constructor);\n if (instanceMap) {\n const decorators = instanceMap.get(decoratorKey);\n if (decorators) {\n allDecorators.unshift(...decorators);\n }\n }\n constructor = Object.getPrototypeOf(constructor);\n }\n return allDecorators;\n }\n /**\n * Function to retrieve decorator values\n *\n * @param decoratorKey The key of the decorator\n * @returns An array of decorator values\n */\n getDecorator(decoratorKey) {\n let allDecorators = this._decoratorCache.get(decoratorKey);\n if (allDecorators !== undefined) {\n return allDecorators;\n }\n allDecorators = this._buildDecoratorList(decoratorKey);\n this._decoratorCache.set(decoratorKey, allDecorators);\n return allDecorators;\n }\n /**\n * Binds unbound property functions to the specified `bind` property\n *\n * @param properties properties to check for functions\n */\n _bindFunctionProperty(property, bind) {\n if (typeof property === 'function' && !property[noBind] && isWidgetBaseConstructor(property) === false) {\n if (this._bindFunctionPropertyMap === undefined) {\n this._bindFunctionPropertyMap = new WeakMap();\n }\n const bindInfo = this._bindFunctionPropertyMap.get(property) || {};\n let { boundFunc, scope } = bindInfo;\n if (boundFunc === undefined || scope !== bind) {\n boundFunc = property.bind(bind);\n this._bindFunctionPropertyMap.set(property, { boundFunc, scope: bind });\n }\n return boundFunc;\n }\n return property;\n }\n get registry() {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n return this._registry;\n }\n _runBeforeProperties(properties) {\n const beforeProperties = this.getDecorator('beforeProperties');\n if (beforeProperties.length > 0) {\n return beforeProperties.reduce((properties, beforePropertiesFunction) => {\n return Object.assign({}, properties, beforePropertiesFunction.call(this, properties));\n }, Object.assign({}, properties));\n }\n return properties;\n }\n /**\n * Run all registered before renders and return the updated render method\n */\n _runBeforeRenders() {\n const beforeRenders = this.getDecorator('beforeRender');\n if (beforeRenders.length > 0) {\n return beforeRenders.reduce((render, beforeRenderFunction) => {\n const updatedRender = beforeRenderFunction.call(this, render, this._properties, this._children);\n if (!updatedRender) {\n console.warn('Render function not returned from beforeRender, using previous render');\n return render;\n }\n return updatedRender;\n }, this._boundRenderFunc);\n }\n return this._boundRenderFunc;\n }\n /**\n * Run all registered after renders and return the decorated DNodes\n *\n * @param dNode The DNodes to run through the after renders\n */\n runAfterRenders(dNode) {\n const afterRenders = this.getDecorator('afterRender');\n if (afterRenders.length > 0) {\n dNode = afterRenders.reduce((dNode, afterRenderFunction) => {\n return afterRenderFunction.call(this, dNode);\n }, dNode);\n }\n if (this._metaMap !== undefined) {\n this._metaMap.forEach((meta) => {\n meta.afterRender();\n });\n }\n return dNode;\n }\n _runAfterConstructors() {\n const afterConstructors = this.getDecorator('afterConstructor');\n if (afterConstructors.length > 0) {\n afterConstructors.forEach((afterConstructor) => afterConstructor.call(this));\n }\n }\n own(handle) {\n this._handles.push(handle);\n }\n destroy() {\n while (this._handles.length > 0) {\n const handle = this._handles.pop();\n if (handle) {\n handle.destroy();\n }\n }\n }\n}\n/**\n * static identifier\n */\nWidgetBase._type = WIDGET_BASE_TYPE;\nexport default WidgetBase;\n//# sourceMappingURL=WidgetBase.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/animations/cssTransitions.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/animations/cssTransitions.mjs", - "name": "./node_modules/@dojo/widget-core/animations/cssTransitions.mjs", + "id": "./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs", + "name": "./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs", "index": 33, "index2": 27, "size": 2288, @@ -4163,18 +4171,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "../animations/cssTransitions", "loc": "3:0-58" @@ -4191,12 +4199,12 @@ "source": "let browserSpecificTransitionEndEventName = '';\nlet browserSpecificAnimationEndEventName = '';\nfunction determineBrowserStyleNames(element) {\n if ('WebkitTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'webkitTransitionEnd';\n browserSpecificAnimationEndEventName = 'webkitAnimationEnd';\n }\n else if ('transition' in element.style || 'MozTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'transitionend';\n browserSpecificAnimationEndEventName = 'animationend';\n }\n else {\n throw new Error('Your browser is not supported');\n }\n}\nfunction initialize(element) {\n if (browserSpecificAnimationEndEventName === '') {\n determineBrowserStyleNames(element);\n }\n}\nfunction runAndCleanUp(element, startAnimation, finishAnimation) {\n initialize(element);\n let finished = false;\n let transitionEnd = function () {\n if (!finished) {\n finished = true;\n element.removeEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n element.removeEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n finishAnimation();\n }\n };\n startAnimation();\n element.addEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n element.addEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n}\nfunction exit(node, properties, exitAnimation, removeNode) {\n const activeClass = properties.exitAnimationActive || `${exitAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(exitAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n removeNode();\n });\n}\nfunction enter(node, properties, enterAnimation) {\n const activeClass = properties.enterAnimationActive || `${enterAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(enterAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n node.classList.remove(enterAnimation);\n node.classList.remove(activeClass);\n });\n}\nexport default {\n enter,\n exit\n};\n//# sourceMappingURL=cssTransitions.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/d.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/d.mjs", - "name": "./node_modules/@dojo/widget-core/d.mjs", + "id": "./node_modules/@dojo/framework/widget-core/d.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/d.mjs", + "name": "./node_modules/@dojo/framework/widget-core/d.mjs", "index": 4, "index2": 8, - "size": 3270, + "size": 3267, "cacheable": true, "built": true, "optional": false, @@ -4205,54 +4213,54 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./d", "loc": "5:0-29" }, { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./src/menu-item/MenuItem.ts", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--3-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/umd-compat-loader/index.js??ref--3-1!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/ts-loader/index.js??ref--3-2!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/css-module-dts-loader/index.js?type=ts&instanceName=0_menu-item!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu-item/MenuItem.ts", + "module": "./src/menu-item/MenuItem.ts", + "moduleName": "./src/menu-item/MenuItem.ts", + "type": "harmony import", + "userRequest": "@dojo/framework/widget-core/d", + "loc": "2:0-50" + }, + { + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./d", "loc": "4:0-24" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "./../d", "loc": "5:0-27" }, { - "moduleId": "./src/menu-item/MenuItem.ts", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--3-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/umd-compat-loader/index.js??ref--3-1!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/ts-loader/index.js??ref--3-2!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/css-module-dts-loader/index.js?type=ts&instanceName=0_menu-item!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu-item/MenuItem.ts", - "module": "./src/menu-item/MenuItem.ts", - "moduleName": "./src/menu-item/MenuItem.ts", - "type": "harmony import", - "userRequest": "@dojo/widget-core/d", - "loc": "2:0-40" - }, - { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", "userRequest": "./d", "loc": "3:0-65" @@ -4283,12 +4291,12 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import Symbol from '@dojo/shim/Symbol';\n/**\n * The symbol identifier for a WNode type\n */\nexport const WNODE = Symbol('Identifier for a WNode.');\n/**\n * The symbol identifier for a VNode type\n */\nexport const VNODE = Symbol('Identifier for a VNode.');\n/**\n * The symbol identifier for a VNode type created using dom()\n */\nexport const DOMVNODE = Symbol('Identifier for a VNode created using existing dom.');\n/**\n * Helper function that returns true if the `DNode` is a `WNode` using the `type` property\n */\nexport function isWNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === WNODE);\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` using the `type` property\n */\nexport function isVNode(child) {\n return Boolean(child && typeof child !== 'string' && (child.type === VNODE || child.type === DOMVNODE));\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` created with `dom()` using the `type` property\n */\nexport function isDomVNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === DOMVNODE);\n}\nexport function isElementNode(value) {\n return !!value.tagName;\n}\nexport function decorate(dNodes, optionsOrModifier, predicate) {\n let shallow = false;\n let modifier;\n if (typeof optionsOrModifier === 'function') {\n modifier = optionsOrModifier;\n }\n else {\n modifier = optionsOrModifier.modifier;\n predicate = optionsOrModifier.predicate;\n shallow = optionsOrModifier.shallow || false;\n }\n let nodes = Array.isArray(dNodes) ? [...dNodes] : [dNodes];\n function breaker() {\n nodes = [];\n }\n while (nodes.length) {\n const node = nodes.shift();\n if (node) {\n if (!shallow && (isWNode(node) || isVNode(node)) && node.children) {\n nodes = [...nodes, ...node.children];\n }\n if (!predicate || predicate(node)) {\n modifier(node, breaker);\n }\n }\n }\n return dNodes;\n}\n/**\n * Wrapper function for calls to create a widget.\n */\nexport function w(widgetConstructor, properties, children = []) {\n return {\n children,\n widgetConstructor,\n properties,\n type: WNODE\n };\n}\nexport function v(tag, propertiesOrChildren = {}, children = undefined) {\n let properties = propertiesOrChildren;\n let deferredPropertiesCallback;\n if (Array.isArray(propertiesOrChildren)) {\n children = propertiesOrChildren;\n properties = {};\n }\n if (typeof properties === 'function') {\n deferredPropertiesCallback = properties;\n properties = {};\n }\n return {\n tag,\n deferredPropertiesCallback,\n children,\n properties,\n type: VNODE\n };\n}\n/**\n * Create a VNode for an existing DOM Node.\n */\nexport function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, children) {\n return {\n tag: isElementNode(node) ? node.tagName.toLowerCase() : '',\n properties: props,\n attributes: attrs,\n events: on,\n children,\n type: DOMVNODE,\n domNode: node,\n text: isElementNode(node) ? undefined : node.data,\n diffType\n };\n}\n//# sourceMappingURL=d.mjs.map" + "source": "import Symbol from '../shim/Symbol';\n/**\n * The symbol identifier for a WNode type\n */\nexport const WNODE = Symbol('Identifier for a WNode.');\n/**\n * The symbol identifier for a VNode type\n */\nexport const VNODE = Symbol('Identifier for a VNode.');\n/**\n * The symbol identifier for a VNode type created using dom()\n */\nexport const DOMVNODE = Symbol('Identifier for a VNode created using existing dom.');\n/**\n * Helper function that returns true if the `DNode` is a `WNode` using the `type` property\n */\nexport function isWNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === WNODE);\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` using the `type` property\n */\nexport function isVNode(child) {\n return Boolean(child && typeof child !== 'string' && (child.type === VNODE || child.type === DOMVNODE));\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` created with `dom()` using the `type` property\n */\nexport function isDomVNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === DOMVNODE);\n}\nexport function isElementNode(value) {\n return !!value.tagName;\n}\nexport function decorate(dNodes, optionsOrModifier, predicate) {\n let shallow = false;\n let modifier;\n if (typeof optionsOrModifier === 'function') {\n modifier = optionsOrModifier;\n }\n else {\n modifier = optionsOrModifier.modifier;\n predicate = optionsOrModifier.predicate;\n shallow = optionsOrModifier.shallow || false;\n }\n let nodes = Array.isArray(dNodes) ? [...dNodes] : [dNodes];\n function breaker() {\n nodes = [];\n }\n while (nodes.length) {\n const node = nodes.shift();\n if (node) {\n if (!shallow && (isWNode(node) || isVNode(node)) && node.children) {\n nodes = [...nodes, ...node.children];\n }\n if (!predicate || predicate(node)) {\n modifier(node, breaker);\n }\n }\n }\n return dNodes;\n}\n/**\n * Wrapper function for calls to create a widget.\n */\nexport function w(widgetConstructor, properties, children = []) {\n return {\n children,\n widgetConstructor,\n properties,\n type: WNODE\n };\n}\nexport function v(tag, propertiesOrChildren = {}, children = undefined) {\n let properties = propertiesOrChildren;\n let deferredPropertiesCallback;\n if (Array.isArray(propertiesOrChildren)) {\n children = propertiesOrChildren;\n properties = {};\n }\n if (typeof properties === 'function') {\n deferredPropertiesCallback = properties;\n properties = {};\n }\n return {\n tag,\n deferredPropertiesCallback,\n children,\n properties,\n type: VNODE\n };\n}\n/**\n * Create a VNode for an existing DOM Node.\n */\nexport function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, children) {\n return {\n tag: isElementNode(node) ? node.tagName.toLowerCase() : '',\n properties: props,\n attributes: attrs,\n events: on,\n children,\n type: DOMVNODE,\n domNode: node,\n text: isElementNode(node) ? undefined : node.data,\n diffType\n };\n}\n//# sourceMappingURL=d.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "index": 41, "index2": 36, "size": 365, @@ -4300,18 +4308,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./decorators/alwaysRender", "loc": "8:0-57" @@ -4329,9 +4337,9 @@ "source": "import { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\nexport function alwaysRender() {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function () {\n this.invalidate();\n })(target);\n });\n}\nexport default alwaysRender;\n//# sourceMappingURL=alwaysRender.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", "index": 39, "index2": 32, "size": 331, @@ -4343,27 +4351,27 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "issuerId": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "issuerName": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "type": "harmony import", "userRequest": "./beforeProperties", "loc": "2:0-54" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/inject.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "type": "harmony import", "userRequest": "./beforeProperties", "loc": "3:0-54" @@ -4381,9 +4389,9 @@ "source": "import { handleDecorator } from './handleDecorator';\nexport function beforeProperties(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('beforeProperties', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default beforeProperties;\n//# sourceMappingURL=beforeProperties.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/customElement.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", "index": 12, "index2": 38, "size": 728, @@ -4408,8 +4416,8 @@ "module": "./src/menu-item/MenuItem.ts", "moduleName": "./src/menu-item/MenuItem.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/decorators/customElement", - "loc": "3:0-75" + "userRequest": "@dojo/framework/widget-core/decorators/customElement", + "loc": "3:0-85" } ], "usedExports": [ @@ -4424,12 +4432,12 @@ "source": "import { CustomElementChildType } from '../registerCustomElement';\nimport Registry from '../Registry';\n/**\n * This Decorator is provided properties that define the behavior of a custom element, and\n * registers that custom element.\n */\nexport function customElement({ tag, properties = [], attributes = [], events = [], childType = CustomElementChildType.DOJO, registryFactory = () => new Registry() }) {\n return function (target) {\n target.prototype.__customElementDescriptor = {\n tagName: tag,\n attributes,\n properties,\n events,\n childType,\n registryFactory\n };\n };\n}\nexport default customElement;\n//# sourceMappingURL=customElement.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", "index": 40, "index2": 34, - "size": 973, + "size": 1014, "cacheable": true, "built": true, "optional": false, @@ -4438,18 +4446,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../decorators/diffProperty", "loc": "5:0-60" @@ -4464,12 +4472,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { handleDecorator } from './handleDecorator';\n/**\n * Decorator that can be used to register a function as a specific property diff\n *\n * @param propertyName The name of the property of which the diff function is applied\n * @param diffType The diff type, default is DiffType.AUTO.\n * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM\n */\nexport function diffProperty(propertyName, diffFunction, reactionFunction) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null));\n target.addDecorator('registeredDiffProperty', propertyName);\n if (reactionFunction || propertyKey) {\n target.addDecorator('diffReaction', {\n propertyName,\n reaction: propertyKey ? target[propertyKey] : reactionFunction\n });\n }\n });\n}\nexport default diffProperty;\n//# sourceMappingURL=diffProperty.mjs.map" + "source": "import { handleDecorator } from './handleDecorator';\nimport { auto } from './../diff';\n/**\n * Decorator that can be used to register a function as a specific property diff\n *\n * @param propertyName The name of the property of which the diff function is applied\n * @param diffType The diff type, default is DiffType.AUTO.\n * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM\n */\nexport function diffProperty(propertyName, diffFunction = auto, reactionFunction) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null));\n target.addDecorator('registeredDiffProperty', propertyName);\n if (reactionFunction || propertyKey) {\n target.addDecorator('diffReaction', {\n propertyName,\n reaction: propertyKey ? target[propertyKey] : reactionFunction\n });\n }\n });\n}\nexport default diffProperty;\n//# sourceMappingURL=diffProperty.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/handleDecorator.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs", "index": 35, "index2": 28, "size": 512, @@ -4481,63 +4489,63 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../decorators/handleDecorator", "loc": "4:0-66" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "type": "harmony import", "userRequest": "./handleDecorator", - "loc": "1:0-52" + "loc": "2:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/inject.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", "type": "harmony import", "userRequest": "./handleDecorator", - "loc": "2:0-52" + "loc": "1:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" @@ -4555,9 +4563,9 @@ "source": "/**\n * Generic decorator handler to take care of whether or not the decorator was called at the class level\n * or the method level.\n *\n * @param handler\n */\nexport function handleDecorator(handler) {\n return function (target, propertyKey, descriptor) {\n if (typeof target === 'function') {\n handler(target.prototype, undefined);\n }\n else {\n handler(target, propertyKey);\n }\n };\n}\nexport default handleDecorator;\n//# sourceMappingURL=handleDecorator.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/inject.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "index": 38, "index2": 33, "size": 1532, @@ -4569,18 +4577,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../decorators/inject", "loc": "3:0-48" @@ -4595,12 +4603,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import WeakMap from '@dojo/shim/WeakMap';\nimport { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\n/**\n * Map of instances against registered injectors.\n */\nconst registeredInjectorsMap = new WeakMap();\n/**\n * Decorator retrieves an injector from an available registry using the name and\n * calls the `getProperties` function with the payload from the injector\n * and current properties with the the injected properties returned.\n *\n * @param InjectConfig the inject configuration\n */\nexport function inject({ name, getProperties }) {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function (properties) {\n const injectorItem = this.registry.getInjector(name);\n if (injectorItem) {\n const { injector, invalidator } = injectorItem;\n const registeredInjectors = registeredInjectorsMap.get(this) || [];\n if (registeredInjectors.length === 0) {\n registeredInjectorsMap.set(this, registeredInjectors);\n }\n if (registeredInjectors.indexOf(injectorItem) === -1) {\n this.own(invalidator.on('invalidate', () => {\n this.invalidate();\n }));\n registeredInjectors.push(injectorItem);\n }\n return getProperties(injector(), properties);\n }\n })(target);\n });\n}\nexport default inject;\n//# sourceMappingURL=inject.mjs.map" + "source": "import WeakMap from '../../shim/WeakMap';\nimport { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\n/**\n * Map of instances against registered injectors.\n */\nconst registeredInjectorsMap = new WeakMap();\n/**\n * Decorator retrieves an injector from an available registry using the name and\n * calls the `getProperties` function with the payload from the injector\n * and current properties with the the injected properties returned.\n *\n * @param InjectConfig the inject configuration\n */\nexport function inject({ name, getProperties }) {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function (properties) {\n const injectorItem = this.registry.getInjector(name);\n if (injectorItem) {\n const { injector, invalidator } = injectorItem;\n const registeredInjectors = registeredInjectorsMap.get(this) || [];\n if (registeredInjectors.length === 0) {\n registeredInjectorsMap.set(this, registeredInjectors);\n }\n if (registeredInjectors.indexOf(injectorItem) === -1) {\n this.own(invalidator.on('invalidate', () => {\n this.invalidate();\n }));\n registeredInjectors.push(injectorItem);\n }\n return getProperties(injector(), properties);\n }\n })(target);\n });\n}\nexport default inject;\n//# sourceMappingURL=inject.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/diff.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/diff.mjs", - "name": "./node_modules/@dojo/widget-core/diff.mjs", + "id": "./node_modules/@dojo/framework/widget-core/diff.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/diff.mjs", + "name": "./node_modules/@dojo/framework/widget-core/diff.mjs", "index": 20, "index2": 20, "size": 1930, @@ -4612,30 +4620,39 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./diff", "loc": "5:0-30" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../diff", "loc": "6:0-36" + }, + { + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "type": "harmony import", + "userRequest": "./../diff", + "loc": "2:0-33" } ], "usedExports": [ @@ -4654,12 +4671,12 @@ "source": "import { WIDGET_BASE_TYPE } from './Registry';\nfunction isObjectOrArray(value) {\n return Object.prototype.toString.call(value) === '[object Object]' || Array.isArray(value);\n}\nexport function always(previousProperty, newProperty) {\n return {\n changed: true,\n value: newProperty\n };\n}\nexport function ignore(previousProperty, newProperty) {\n return {\n changed: false,\n value: newProperty\n };\n}\nexport function reference(previousProperty, newProperty) {\n return {\n changed: previousProperty !== newProperty,\n value: newProperty\n };\n}\nexport function shallow(previousProperty, newProperty) {\n let changed = false;\n const validOldProperty = previousProperty && isObjectOrArray(previousProperty);\n const validNewProperty = newProperty && isObjectOrArray(newProperty);\n if (!validOldProperty || !validNewProperty) {\n return {\n changed: true,\n value: newProperty\n };\n }\n const previousKeys = Object.keys(previousProperty);\n const newKeys = Object.keys(newProperty);\n if (previousKeys.length !== newKeys.length) {\n changed = true;\n }\n else {\n changed = newKeys.some((key) => {\n return newProperty[key] !== previousProperty[key];\n });\n }\n return {\n changed,\n value: newProperty\n };\n}\nexport function auto(previousProperty, newProperty) {\n let result;\n if (typeof newProperty === 'function') {\n if (newProperty._type === WIDGET_BASE_TYPE) {\n result = reference(previousProperty, newProperty);\n }\n else {\n result = ignore(previousProperty, newProperty);\n }\n }\n else if (isObjectOrArray(newProperty)) {\n result = shallow(previousProperty, newProperty);\n }\n else {\n result = reference(previousProperty, newProperty);\n }\n return result;\n}\n//# sourceMappingURL=diff.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "name": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "id": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "name": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "index": 32, "index2": 30, - "size": 5852, + "size": 5683, "cacheable": true, "built": true, "optional": false, @@ -4668,18 +4685,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./mixins/Projector", "loc": "3:0-52" @@ -4696,15 +4713,15 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import * as tslib_1 from \"tslib\";\nimport { assign } from '@dojo/core/lang';\nimport cssTransitions from '../animations/cssTransitions';\nimport { afterRender } from './../decorators/afterRender';\nimport { v } from './../d';\nimport { dom } from './../vdom';\n/**\n * Represents the attach state of the projector\n */\nexport var ProjectorAttachState;\n(function (ProjectorAttachState) {\n ProjectorAttachState[ProjectorAttachState[\"Attached\"] = 1] = \"Attached\";\n ProjectorAttachState[ProjectorAttachState[\"Detached\"] = 2] = \"Detached\";\n})(ProjectorAttachState || (ProjectorAttachState = {}));\n/**\n * Attach type for the projector\n */\nexport var AttachType;\n(function (AttachType) {\n AttachType[AttachType[\"Append\"] = 1] = \"Append\";\n AttachType[AttachType[\"Merge\"] = 2] = \"Merge\";\n})(AttachType || (AttachType = {}));\nexport function ProjectorMixin(Base) {\n class Projector extends Base {\n constructor(...args) {\n super(...args);\n this._root = document.body;\n this._async = true;\n this._projectorProperties = {};\n this._projectionOptions = {\n transitions: cssTransitions\n };\n this.root = document.body;\n this.projectorState = ProjectorAttachState.Detached;\n }\n append(root) {\n const options = {\n type: AttachType.Append,\n root\n };\n return this._attach(options);\n }\n merge(root) {\n const options = {\n type: AttachType.Merge,\n root\n };\n return this._attach(options);\n }\n set root(root) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change root element');\n }\n this._root = root;\n }\n get root() {\n return this._root;\n }\n get async() {\n return this._async;\n }\n set async(async) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change async mode');\n }\n this._async = async;\n }\n sandbox(doc = document) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot create sandbox');\n }\n this._async = false;\n const previousRoot = this.root;\n /* free up the document fragment for GC */\n this.own({\n destroy: () => {\n this._root = previousRoot;\n }\n });\n this._attach({\n /* DocumentFragment is not assignable to Element, but provides everything needed to work */\n root: doc.createDocumentFragment(),\n type: AttachType.Append\n });\n }\n setChildren(children) {\n this.__setChildren__(children);\n }\n setProperties(properties) {\n this.__setProperties__(properties);\n }\n __setProperties__(properties) {\n if (this._projectorProperties && this._projectorProperties.registry !== properties.registry) {\n if (this._projectorProperties.registry) {\n this._projectorProperties.registry.destroy();\n }\n }\n this._projectorProperties = assign({}, properties);\n super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry });\n super.__setProperties__(properties);\n }\n toHtml() {\n if (this.projectorState !== ProjectorAttachState.Attached || !this._projection) {\n throw new Error('Projector is not attached, cannot return an HTML string of projection.');\n }\n return this._projection.domNode.childNodes[0].outerHTML;\n }\n afterRender(result) {\n let node = result;\n if (typeof result === 'string' || result === null || result === undefined) {\n node = v('span', {}, [result]);\n }\n return node;\n }\n destroy() {\n super.destroy();\n }\n _attach({ type, root }) {\n if (root) {\n this.root = root;\n }\n if (this._attachHandle) {\n return this._attachHandle;\n }\n this.projectorState = ProjectorAttachState.Attached;\n const handle = {\n destroy: () => {\n if (this.projectorState === ProjectorAttachState.Attached) {\n this._projection = undefined;\n this.projectorState = ProjectorAttachState.Detached;\n }\n }\n };\n this.own(handle);\n this._attachHandle = handle;\n this._projectionOptions = Object.assign({}, this._projectionOptions, { sync: !this._async });\n switch (type) {\n case AttachType.Append:\n this._projection = dom.append(this.root, this, this._projectionOptions);\n break;\n case AttachType.Merge:\n this._projection = dom.merge(this.root, this, this._projectionOptions);\n break;\n }\n return this._attachHandle;\n }\n }\n tslib_1.__decorate([\n afterRender(),\n tslib_1.__metadata(\"design:type\", Function),\n tslib_1.__metadata(\"design:paramtypes\", [Object]),\n tslib_1.__metadata(\"design:returntype\", void 0)\n ], Projector.prototype, \"afterRender\", null);\n return Projector;\n}\nexport default ProjectorMixin;\n//# sourceMappingURL=Projector.mjs.map" + "source": "import * as tslib_1 from \"tslib\";\nimport { assign } from '../../core/lang';\nimport cssTransitions from '../animations/cssTransitions';\nimport { afterRender } from './../decorators/afterRender';\nimport { v } from './../d';\nimport { dom } from './../vdom';\n/**\n * Represents the attach state of the projector\n */\nexport var ProjectorAttachState;\n(function (ProjectorAttachState) {\n ProjectorAttachState[ProjectorAttachState[\"Attached\"] = 1] = \"Attached\";\n ProjectorAttachState[ProjectorAttachState[\"Detached\"] = 2] = \"Detached\";\n})(ProjectorAttachState || (ProjectorAttachState = {}));\n/**\n * Attach type for the projector\n */\nexport var AttachType;\n(function (AttachType) {\n AttachType[AttachType[\"Append\"] = 1] = \"Append\";\n AttachType[AttachType[\"Merge\"] = 2] = \"Merge\";\n})(AttachType || (AttachType = {}));\nexport function ProjectorMixin(Base) {\n class Projector extends Base {\n constructor(...args) {\n super(...args);\n this._root = document.body;\n this._async = true;\n this._projectorProperties = {};\n this._projectionOptions = {\n transitions: cssTransitions\n };\n this.root = document.body;\n this.projectorState = ProjectorAttachState.Detached;\n }\n append(root) {\n const options = {\n type: AttachType.Append,\n root\n };\n return this._attach(options);\n }\n merge(root) {\n const options = {\n type: AttachType.Merge,\n root\n };\n return this._attach(options);\n }\n set root(root) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change root element');\n }\n this._root = root;\n }\n get root() {\n return this._root;\n }\n get async() {\n return this._async;\n }\n set async(async) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change async mode');\n }\n this._async = async;\n }\n sandbox(doc = document) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot create sandbox');\n }\n this._async = false;\n const previousRoot = this.root;\n /* free up the document fragment for GC */\n this.own({\n destroy: () => {\n this._root = previousRoot;\n }\n });\n this._attach({\n /* DocumentFragment is not assignable to Element, but provides everything needed to work */\n root: doc.createDocumentFragment(),\n type: AttachType.Append\n });\n }\n setChildren(children) {\n this.__setChildren__(children);\n }\n setProperties(properties) {\n this.__setProperties__(properties);\n }\n __setProperties__(properties) {\n if (this._projectorProperties && this._projectorProperties.registry !== properties.registry) {\n if (this._projectorProperties.registry) {\n this._projectorProperties.registry.destroy();\n }\n }\n this._projectorProperties = assign({}, properties);\n super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry });\n super.__setProperties__(properties);\n }\n toHtml() {\n if (this.projectorState !== ProjectorAttachState.Attached || !this._projection) {\n throw new Error('Projector is not attached, cannot return an HTML string of projection.');\n }\n return this._projection.domNode.childNodes[0].outerHTML;\n }\n afterRender(result) {\n let node = result;\n if (typeof result === 'string' || result === null || result === undefined) {\n node = v('span', {}, [result]);\n }\n return node;\n }\n destroy() {\n super.destroy();\n }\n _attach({ type, root }) {\n if (root) {\n this.root = root;\n }\n if (this._attachHandle) {\n return this._attachHandle;\n }\n this.projectorState = ProjectorAttachState.Attached;\n const handle = {\n destroy: () => {\n if (this.projectorState === ProjectorAttachState.Attached) {\n this._projection = undefined;\n this.projectorState = ProjectorAttachState.Detached;\n }\n }\n };\n this.own(handle);\n this._attachHandle = handle;\n this._projectionOptions = Object.assign({}, this._projectionOptions, { sync: !this._async });\n switch (type) {\n case AttachType.Append:\n this._projection = dom.append(this.root, this, this._projectionOptions);\n break;\n case AttachType.Merge:\n this._projection = dom.merge(this.root, this, this._projectionOptions);\n break;\n }\n return this._attachHandle;\n }\n }\n tslib_1.__decorate([\n afterRender()\n ], Projector.prototype, \"afterRender\", null);\n return Projector;\n}\nexport default ProjectorMixin;\n//# sourceMappingURL=Projector.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "name": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "id": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "name": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "index": 36, "index2": 35, - "size": 5320, + "size": 5157, "cacheable": true, "built": true, "optional": false, @@ -4713,18 +4730,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./mixins/Themed", "loc": "7:0-56" @@ -4735,8 +4752,8 @@ "module": "./src/menu-item/MenuItem.ts", "moduleName": "./src/menu-item/MenuItem.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/mixins/Themed", - "loc": "4:0-69" + "userRequest": "@dojo/framework/widget-core/mixins/Themed", + "loc": "4:0-79" } ], "usedExports": [ @@ -4753,15 +4770,15 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import * as tslib_1 from \"tslib\";\nimport { Injector } from './../Injector';\nimport { inject } from './../decorators/inject';\nimport { handleDecorator } from './../decorators/handleDecorator';\nimport { diffProperty } from './../decorators/diffProperty';\nimport { shallow } from './../diff';\nconst THEME_KEY = ' _key';\nexport const INJECTED_THEME_KEY = Symbol('theme');\n/**\n * Decorator for base css classes\n */\nexport function theme(theme) {\n return handleDecorator((target) => {\n target.addDecorator('baseThemeClasses', theme);\n });\n}\n/**\n * Creates a reverse lookup for the classes passed in via the `theme` function.\n *\n * @param classes The baseClasses object\n * @requires\n */\nfunction createThemeClassesLookup(classes) {\n return classes.reduce((currentClassNames, baseClass) => {\n Object.keys(baseClass).forEach((key) => {\n currentClassNames[baseClass[key]] = key;\n });\n return currentClassNames;\n }, {});\n}\n/**\n * Convenience function that is given a theme and an optional registry, the theme\n * injector is defined against the registry, returning the theme.\n *\n * @param theme the theme to set\n * @param themeRegistry registry to define the theme injector against. Defaults\n * to the global registry\n *\n * @returns the theme injector used to set the theme\n */\nexport function registerThemeInjector(theme, themeRegistry) {\n const themeInjector = new Injector(theme);\n themeRegistry.defineInjector(INJECTED_THEME_KEY, (invalidator) => {\n themeInjector.setInvalidator(invalidator);\n return () => themeInjector.get();\n });\n return themeInjector;\n}\n/**\n * Function that returns a class decorated with with Themed functionality\n */\nexport function ThemedMixin(Base) {\n let Themed = class Themed extends Base {\n constructor() {\n super(...arguments);\n /**\n * Registered base theme keys\n */\n this._registeredBaseThemeKeys = [];\n /**\n * Indicates if classes meta data need to be calculated.\n */\n this._recalculateClasses = true;\n /**\n * Loaded theme\n */\n this._theme = {};\n }\n theme(classes) {\n if (this._recalculateClasses) {\n this._recalculateThemeClasses();\n }\n if (Array.isArray(classes)) {\n return classes.map((className) => this._getThemeClass(className));\n }\n return this._getThemeClass(classes);\n }\n /**\n * Function fired when `theme` or `extraClasses` are changed.\n */\n onPropertiesChanged() {\n this._recalculateClasses = true;\n }\n _getThemeClass(className) {\n if (className === undefined || className === null) {\n return className;\n }\n const extraClasses = this.properties.extraClasses || {};\n const themeClassName = this._baseThemeClassesReverseLookup[className];\n let resultClassNames = [];\n if (!themeClassName) {\n console.warn(`Class name: '${className}' not found in theme`);\n return null;\n }\n if (extraClasses[themeClassName]) {\n resultClassNames.push(extraClasses[themeClassName]);\n }\n if (this._theme[themeClassName]) {\n resultClassNames.push(this._theme[themeClassName]);\n }\n else {\n resultClassNames.push(this._registeredBaseTheme[themeClassName]);\n }\n return resultClassNames.join(' ');\n }\n _recalculateThemeClasses() {\n const { theme = {} } = this.properties;\n const baseThemes = this.getDecorator('baseThemeClasses');\n if (!this._registeredBaseTheme) {\n this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => {\n const _a = THEME_KEY, key = baseTheme[_a], classes = tslib_1.__rest(baseTheme, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n this._registeredBaseThemeKeys.push(key);\n return Object.assign({}, finalBaseTheme, classes);\n }, {});\n this._baseThemeClassesReverseLookup = createThemeClassesLookup(baseThemes);\n }\n this._theme = this._registeredBaseThemeKeys.reduce((baseTheme, themeKey) => {\n return Object.assign({}, baseTheme, theme[themeKey]);\n }, {});\n this._recalculateClasses = false;\n }\n };\n tslib_1.__decorate([\n diffProperty('theme', shallow),\n diffProperty('extraClasses', shallow),\n tslib_1.__metadata(\"design:type\", Function),\n tslib_1.__metadata(\"design:paramtypes\", []),\n tslib_1.__metadata(\"design:returntype\", void 0)\n ], Themed.prototype, \"onPropertiesChanged\", null);\n Themed = tslib_1.__decorate([\n inject({\n name: INJECTED_THEME_KEY,\n getProperties: (theme, properties) => {\n if (!properties.theme) {\n return { theme };\n }\n return {};\n }\n })\n ], Themed);\n return Themed;\n}\nexport default ThemedMixin;\n//# sourceMappingURL=Themed.mjs.map" + "source": "import * as tslib_1 from \"tslib\";\nimport { Injector } from './../Injector';\nimport { inject } from './../decorators/inject';\nimport { handleDecorator } from './../decorators/handleDecorator';\nimport { diffProperty } from './../decorators/diffProperty';\nimport { shallow } from './../diff';\nconst THEME_KEY = ' _key';\nexport const INJECTED_THEME_KEY = Symbol('theme');\n/**\n * Decorator for base css classes\n */\nexport function theme(theme) {\n return handleDecorator((target) => {\n target.addDecorator('baseThemeClasses', theme);\n });\n}\n/**\n * Creates a reverse lookup for the classes passed in via the `theme` function.\n *\n * @param classes The baseClasses object\n * @requires\n */\nfunction createThemeClassesLookup(classes) {\n return classes.reduce((currentClassNames, baseClass) => {\n Object.keys(baseClass).forEach((key) => {\n currentClassNames[baseClass[key]] = key;\n });\n return currentClassNames;\n }, {});\n}\n/**\n * Convenience function that is given a theme and an optional registry, the theme\n * injector is defined against the registry, returning the theme.\n *\n * @param theme the theme to set\n * @param themeRegistry registry to define the theme injector against. Defaults\n * to the global registry\n *\n * @returns the theme injector used to set the theme\n */\nexport function registerThemeInjector(theme, themeRegistry) {\n const themeInjector = new Injector(theme);\n themeRegistry.defineInjector(INJECTED_THEME_KEY, (invalidator) => {\n themeInjector.setInvalidator(invalidator);\n return () => themeInjector.get();\n });\n return themeInjector;\n}\n/**\n * Function that returns a class decorated with with Themed functionality\n */\nexport function ThemedMixin(Base) {\n let Themed = class Themed extends Base {\n constructor() {\n super(...arguments);\n /**\n * Registered base theme keys\n */\n this._registeredBaseThemeKeys = [];\n /**\n * Indicates if classes meta data need to be calculated.\n */\n this._recalculateClasses = true;\n /**\n * Loaded theme\n */\n this._theme = {};\n }\n theme(classes) {\n if (this._recalculateClasses) {\n this._recalculateThemeClasses();\n }\n if (Array.isArray(classes)) {\n return classes.map((className) => this._getThemeClass(className));\n }\n return this._getThemeClass(classes);\n }\n /**\n * Function fired when `theme` or `extraClasses` are changed.\n */\n onPropertiesChanged() {\n this._recalculateClasses = true;\n }\n _getThemeClass(className) {\n if (className === undefined || className === null) {\n return className;\n }\n const extraClasses = this.properties.extraClasses || {};\n const themeClassName = this._baseThemeClassesReverseLookup[className];\n let resultClassNames = [];\n if (!themeClassName) {\n console.warn(`Class name: '${className}' not found in theme`);\n return null;\n }\n if (extraClasses[themeClassName]) {\n resultClassNames.push(extraClasses[themeClassName]);\n }\n if (this._theme[themeClassName]) {\n resultClassNames.push(this._theme[themeClassName]);\n }\n else {\n resultClassNames.push(this._registeredBaseTheme[themeClassName]);\n }\n return resultClassNames.join(' ');\n }\n _recalculateThemeClasses() {\n const { theme = {} } = this.properties;\n const baseThemes = this.getDecorator('baseThemeClasses');\n if (!this._registeredBaseTheme) {\n this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => {\n const _a = THEME_KEY, key = baseTheme[_a], classes = tslib_1.__rest(baseTheme, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n this._registeredBaseThemeKeys.push(key);\n return Object.assign({}, finalBaseTheme, classes);\n }, {});\n this._baseThemeClassesReverseLookup = createThemeClassesLookup(baseThemes);\n }\n this._theme = this._registeredBaseThemeKeys.reduce((baseTheme, themeKey) => {\n return Object.assign({}, baseTheme, theme[themeKey]);\n }, {});\n this._recalculateClasses = false;\n }\n };\n tslib_1.__decorate([\n diffProperty('theme', shallow),\n diffProperty('extraClasses', shallow)\n ], Themed.prototype, \"onPropertiesChanged\", null);\n Themed = tslib_1.__decorate([\n inject({\n name: INJECTED_THEME_KEY,\n getProperties: (theme, properties) => {\n if (!properties.theme) {\n return { theme };\n }\n return {};\n }\n })\n ], Themed);\n return Themed;\n}\nexport default ThemedMixin;\n//# sourceMappingURL=Themed.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "name": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "id": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "name": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "index": 13, "index2": 37, - "size": 9124, + "size": 9118, "cacheable": true, "built": true, "optional": false, @@ -4783,14 +4800,14 @@ "module": "./node_modules/imports-loader?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js", "moduleName": "./node_modules/imports-loader?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js", "type": "cjs require", - "userRequest": "@dojo/widget-core/registerCustomElement", - "loc": "4:28-78" + "userRequest": "@dojo/framework/widget-core/registerCustomElement", + "loc": "4:28-88" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/customElement.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", "type": "harmony import", "userRequest": "../registerCustomElement", "loc": "1:0-66" @@ -4806,15 +4823,15 @@ ], "optimizationBailout": [], "depth": 2, - "source": "import * as tslib_1 from \"tslib\";\nimport { WidgetBase, noBind } from './WidgetBase';\nimport { ProjectorMixin } from './mixins/Projector';\nimport { from } from '@dojo/shim/array';\nimport { w, dom } from './d';\nimport global from '@dojo/shim/global';\nimport { registerThemeInjector } from './mixins/Themed';\nimport { alwaysRender } from './decorators/alwaysRender';\nexport var CustomElementChildType;\n(function (CustomElementChildType) {\n CustomElementChildType[\"DOJO\"] = \"DOJO\";\n CustomElementChildType[\"NODE\"] = \"NODE\";\n CustomElementChildType[\"TEXT\"] = \"TEXT\";\n})(CustomElementChildType || (CustomElementChildType = {}));\nexport function DomToWidgetWrapper(domNode) {\n let DomToWidgetWrapper = class DomToWidgetWrapper extends WidgetBase {\n render() {\n const properties = Object.keys(this.properties).reduce((props, key) => {\n const value = this.properties[key];\n if (key.indexOf('on') === 0) {\n key = `__${key}`;\n }\n props[key] = value;\n return props;\n }, {});\n return dom({ node: domNode, props: properties, diffType: 'dom' });\n }\n static get domNode() {\n return domNode;\n }\n };\n DomToWidgetWrapper = tslib_1.__decorate([\n alwaysRender()\n ], DomToWidgetWrapper);\n return DomToWidgetWrapper;\n}\nexport function create(descriptor, WidgetConstructor) {\n const { attributes, childType, registryFactory } = descriptor;\n const attributeMap = {};\n attributes.forEach((propertyName) => {\n const attributeName = propertyName.toLowerCase();\n attributeMap[attributeName] = propertyName;\n });\n return class extends HTMLElement {\n constructor() {\n super(...arguments);\n this._properties = {};\n this._children = [];\n this._eventProperties = {};\n this._initialised = false;\n }\n connectedCallback() {\n if (this._initialised) {\n return;\n }\n const domProperties = {};\n const { attributes, properties, events } = descriptor;\n this._properties = Object.assign({}, this._properties, this._attributesToProperties(attributes));\n [...attributes, ...properties].forEach((propertyName) => {\n const value = this[propertyName];\n const filteredPropertyName = propertyName.replace(/^on/, '__');\n if (value !== undefined) {\n this._properties[propertyName] = value;\n }\n if (filteredPropertyName !== propertyName) {\n domProperties[filteredPropertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n }\n domProperties[propertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n });\n events.forEach((propertyName) => {\n const eventName = propertyName.replace(/^on/, '').toLowerCase();\n const filteredPropertyName = propertyName.replace(/^on/, '__on');\n domProperties[filteredPropertyName] = {\n get: () => this._getEventProperty(propertyName),\n set: (value) => this._setEventProperty(propertyName, value)\n };\n this._eventProperties[propertyName] = undefined;\n this._properties[propertyName] = (...args) => {\n const eventCallback = this._getEventProperty(propertyName);\n if (typeof eventCallback === 'function') {\n eventCallback(...args);\n }\n this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: false,\n detail: args\n }));\n };\n });\n Object.defineProperties(this, domProperties);\n const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children;\n from(children).forEach((childNode) => {\n if (childType === CustomElementChildType.DOJO) {\n childNode.addEventListener('dojo-ce-render', () => this._render());\n childNode.addEventListener('dojo-ce-connected', () => this._render());\n this._children.push(DomToWidgetWrapper(childNode));\n }\n else {\n this._children.push(dom({ node: childNode, diffType: 'dom' }));\n }\n });\n this.addEventListener('dojo-ce-connected', (e) => this._childConnected(e));\n const widgetProperties = this._properties;\n const renderChildren = () => this.__children__();\n const Wrapper = class extends WidgetBase {\n render() {\n return w(WidgetConstructor, widgetProperties, renderChildren());\n }\n };\n const registry = registryFactory();\n const themeContext = registerThemeInjector(this._getTheme(), registry);\n global.addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme()));\n const Projector = ProjectorMixin(Wrapper);\n this._projector = new Projector();\n this._projector.setProperties({ registry });\n this._projector.append(this);\n this._initialised = true;\n this.dispatchEvent(new CustomEvent('dojo-ce-connected', {\n bubbles: true,\n detail: this\n }));\n }\n _getTheme() {\n if (global && global.dojoce && global.dojoce.theme) {\n return global.dojoce.themes[global.dojoce.theme];\n }\n }\n _childConnected(e) {\n const node = e.detail;\n if (node.parentNode === this) {\n const exists = this._children.some((child) => child.domNode === node);\n if (!exists) {\n node.addEventListener('dojo-ce-render', () => this._render());\n this._children.push(DomToWidgetWrapper(node));\n this._render();\n }\n }\n }\n _render() {\n if (this._projector) {\n this._projector.invalidate();\n this.dispatchEvent(new CustomEvent('dojo-ce-render', {\n bubbles: false,\n detail: this\n }));\n }\n }\n __properties__() {\n return Object.assign({}, this._properties, this._eventProperties);\n }\n __children__() {\n if (childType === CustomElementChildType.DOJO) {\n return this._children.filter((Child) => Child.domNode.isWidget).map((Child) => {\n const { domNode } = Child;\n return w(Child, Object.assign({}, domNode.__properties__()), [...domNode.__children__()]);\n });\n }\n else {\n return this._children;\n }\n }\n attributeChangedCallback(name, oldValue, value) {\n const propertyName = attributeMap[name];\n this._setProperty(propertyName, value);\n }\n _setEventProperty(propertyName, value) {\n this._eventProperties[propertyName] = value;\n }\n _getEventProperty(propertyName) {\n return this._eventProperties[propertyName];\n }\n _setProperty(propertyName, value) {\n if (typeof value === 'function') {\n value[noBind] = true;\n }\n this._properties[propertyName] = value;\n this._render();\n }\n _getProperty(propertyName) {\n return this._properties[propertyName];\n }\n _attributesToProperties(attributes) {\n return attributes.reduce((properties, propertyName) => {\n const attributeName = propertyName.toLowerCase();\n const value = this.getAttribute(attributeName);\n if (value !== null) {\n properties[propertyName] = value;\n }\n return properties;\n }, {});\n }\n static get observedAttributes() {\n return Object.keys(attributeMap);\n }\n get isWidget() {\n return true;\n }\n };\n}\nexport function register(WidgetConstructor) {\n const descriptor = WidgetConstructor.prototype && WidgetConstructor.prototype.__customElementDescriptor;\n if (!descriptor) {\n throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?');\n }\n global.customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor));\n}\nexport default register;\n//# sourceMappingURL=registerCustomElement.mjs.map" + "source": "import * as tslib_1 from \"tslib\";\nimport { WidgetBase, noBind } from './WidgetBase';\nimport { ProjectorMixin } from './mixins/Projector';\nimport { from } from '../shim/array';\nimport { w, dom } from './d';\nimport global from '../shim/global';\nimport { registerThemeInjector } from './mixins/Themed';\nimport { alwaysRender } from './decorators/alwaysRender';\nexport var CustomElementChildType;\n(function (CustomElementChildType) {\n CustomElementChildType[\"DOJO\"] = \"DOJO\";\n CustomElementChildType[\"NODE\"] = \"NODE\";\n CustomElementChildType[\"TEXT\"] = \"TEXT\";\n})(CustomElementChildType || (CustomElementChildType = {}));\nexport function DomToWidgetWrapper(domNode) {\n let DomToWidgetWrapper = class DomToWidgetWrapper extends WidgetBase {\n render() {\n const properties = Object.keys(this.properties).reduce((props, key) => {\n const value = this.properties[key];\n if (key.indexOf('on') === 0) {\n key = `__${key}`;\n }\n props[key] = value;\n return props;\n }, {});\n return dom({ node: domNode, props: properties, diffType: 'dom' });\n }\n static get domNode() {\n return domNode;\n }\n };\n DomToWidgetWrapper = tslib_1.__decorate([\n alwaysRender()\n ], DomToWidgetWrapper);\n return DomToWidgetWrapper;\n}\nexport function create(descriptor, WidgetConstructor) {\n const { attributes, childType, registryFactory } = descriptor;\n const attributeMap = {};\n attributes.forEach((propertyName) => {\n const attributeName = propertyName.toLowerCase();\n attributeMap[attributeName] = propertyName;\n });\n return class extends HTMLElement {\n constructor() {\n super(...arguments);\n this._properties = {};\n this._children = [];\n this._eventProperties = {};\n this._initialised = false;\n }\n connectedCallback() {\n if (this._initialised) {\n return;\n }\n const domProperties = {};\n const { attributes, properties, events } = descriptor;\n this._properties = Object.assign({}, this._properties, this._attributesToProperties(attributes));\n [...attributes, ...properties].forEach((propertyName) => {\n const value = this[propertyName];\n const filteredPropertyName = propertyName.replace(/^on/, '__');\n if (value !== undefined) {\n this._properties[propertyName] = value;\n }\n if (filteredPropertyName !== propertyName) {\n domProperties[filteredPropertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n }\n domProperties[propertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n });\n events.forEach((propertyName) => {\n const eventName = propertyName.replace(/^on/, '').toLowerCase();\n const filteredPropertyName = propertyName.replace(/^on/, '__on');\n domProperties[filteredPropertyName] = {\n get: () => this._getEventProperty(propertyName),\n set: (value) => this._setEventProperty(propertyName, value)\n };\n this._eventProperties[propertyName] = undefined;\n this._properties[propertyName] = (...args) => {\n const eventCallback = this._getEventProperty(propertyName);\n if (typeof eventCallback === 'function') {\n eventCallback(...args);\n }\n this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: false,\n detail: args\n }));\n };\n });\n Object.defineProperties(this, domProperties);\n const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children;\n from(children).forEach((childNode) => {\n if (childType === CustomElementChildType.DOJO) {\n childNode.addEventListener('dojo-ce-render', () => this._render());\n childNode.addEventListener('dojo-ce-connected', () => this._render());\n this._children.push(DomToWidgetWrapper(childNode));\n }\n else {\n this._children.push(dom({ node: childNode, diffType: 'dom' }));\n }\n });\n this.addEventListener('dojo-ce-connected', (e) => this._childConnected(e));\n const widgetProperties = this._properties;\n const renderChildren = () => this.__children__();\n const Wrapper = class extends WidgetBase {\n render() {\n return w(WidgetConstructor, widgetProperties, renderChildren());\n }\n };\n const registry = registryFactory();\n const themeContext = registerThemeInjector(this._getTheme(), registry);\n global.addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme()));\n const Projector = ProjectorMixin(Wrapper);\n this._projector = new Projector();\n this._projector.setProperties({ registry });\n this._projector.append(this);\n this._initialised = true;\n this.dispatchEvent(new CustomEvent('dojo-ce-connected', {\n bubbles: true,\n detail: this\n }));\n }\n _getTheme() {\n if (global && global.dojoce && global.dojoce.theme) {\n return global.dojoce.themes[global.dojoce.theme];\n }\n }\n _childConnected(e) {\n const node = e.detail;\n if (node.parentNode === this) {\n const exists = this._children.some((child) => child.domNode === node);\n if (!exists) {\n node.addEventListener('dojo-ce-render', () => this._render());\n this._children.push(DomToWidgetWrapper(node));\n this._render();\n }\n }\n }\n _render() {\n if (this._projector) {\n this._projector.invalidate();\n this.dispatchEvent(new CustomEvent('dojo-ce-render', {\n bubbles: false,\n detail: this\n }));\n }\n }\n __properties__() {\n return Object.assign({}, this._properties, this._eventProperties);\n }\n __children__() {\n if (childType === CustomElementChildType.DOJO) {\n return this._children.filter((Child) => Child.domNode.isWidget).map((Child) => {\n const { domNode } = Child;\n return w(Child, Object.assign({}, domNode.__properties__()), [...domNode.__children__()]);\n });\n }\n else {\n return this._children;\n }\n }\n attributeChangedCallback(name, oldValue, value) {\n const propertyName = attributeMap[name];\n this._setProperty(propertyName, value);\n }\n _setEventProperty(propertyName, value) {\n this._eventProperties[propertyName] = value;\n }\n _getEventProperty(propertyName) {\n return this._eventProperties[propertyName];\n }\n _setProperty(propertyName, value) {\n if (typeof value === 'function') {\n value[noBind] = true;\n }\n this._properties[propertyName] = value;\n this._render();\n }\n _getProperty(propertyName) {\n return this._properties[propertyName];\n }\n _attributesToProperties(attributes) {\n return attributes.reduce((properties, propertyName) => {\n const attributeName = propertyName.toLowerCase();\n const value = this.getAttribute(attributeName);\n if (value !== null) {\n properties[propertyName] = value;\n }\n return properties;\n }, {});\n }\n static get observedAttributes() {\n return Object.keys(attributeMap);\n }\n get isWidget() {\n return true;\n }\n };\n}\nexport function register(WidgetConstructor) {\n const descriptor = WidgetConstructor.prototype && WidgetConstructor.prototype.__customElementDescriptor;\n if (!descriptor) {\n throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?');\n }\n global.customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor));\n}\nexport default register;\n//# sourceMappingURL=registerCustomElement.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/vdom.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/vdom.mjs", - "name": "./node_modules/@dojo/widget-core/vdom.mjs", + "id": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/vdom.mjs", + "name": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "index": 29, "index2": 25, - "size": 38814, + "size": 39966, "cacheable": true, "built": true, "optional": false, @@ -4823,27 +4840,27 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./vdom", "loc": "8:0-43" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "./../vdom", "loc": "6:0-32" @@ -4862,7 +4879,7 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import global from '@dojo/shim/global';\nimport { from as arrayFrom } from '@dojo/shim/array';\nimport { isWNode, isVNode, isDomVNode, VNODE, WNODE } from './d';\nimport { isWidgetBaseConstructor } from './Registry';\nimport WeakMap from '@dojo/shim/WeakMap';\nconst NAMESPACE_W3 = 'http://www.w3.org/';\nconst NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg';\nconst NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink';\nconst emptyArray = [];\nexport const widgetInstanceMap = new WeakMap();\nconst instanceMap = new WeakMap();\nconst projectorStateMap = new WeakMap();\nfunction same(dnode1, dnode2) {\n if (isVNode(dnode1) && isVNode(dnode2)) {\n if (isDomVNode(dnode1) || isDomVNode(dnode2)) {\n if (dnode1.domNode !== dnode2.domNode) {\n return false;\n }\n }\n if (dnode1.tag !== dnode2.tag) {\n return false;\n }\n if (dnode1.properties.key !== dnode2.properties.key) {\n return false;\n }\n return true;\n }\n else if (isWNode(dnode1) && isWNode(dnode2)) {\n if (dnode1.instance === undefined && typeof dnode2.widgetConstructor === 'string') {\n return false;\n }\n if (dnode1.widgetConstructor !== dnode2.widgetConstructor) {\n return false;\n }\n if (dnode1.properties.key !== dnode2.properties.key) {\n return false;\n }\n return true;\n }\n return false;\n}\nconst missingTransition = function () {\n throw new Error('Provide a transitions object to the projectionOptions to do animations');\n};\nfunction getProjectionOptions(projectorOptions, projectorInstance) {\n const defaults = {\n namespace: undefined,\n styleApplyer: function (domNode, styleName, value) {\n domNode.style[styleName] = value;\n },\n transitions: {\n enter: missingTransition,\n exit: missingTransition\n },\n depth: 0,\n merge: false,\n sync: false,\n projectorInstance\n };\n return Object.assign({}, defaults, projectorOptions);\n}\nfunction checkStyleValue(styleValue) {\n if (typeof styleValue !== 'string') {\n throw new Error('Style values must be strings');\n }\n}\nfunction updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n const eventMap = projectorState.nodeMap.get(domNode) || new WeakMap();\n if (previousValue) {\n const previousEvent = eventMap.get(previousValue);\n domNode.removeEventListener(eventName, previousEvent);\n }\n let callback = currentValue.bind(bind);\n if (eventName === 'input') {\n callback = function (evt) {\n currentValue.call(this, evt);\n evt.target['oninput-value'] = evt.target.value;\n }.bind(bind);\n }\n domNode.addEventListener(eventName, callback);\n eventMap.set(currentValue, callback);\n projectorState.nodeMap.set(domNode, eventMap);\n}\nfunction addClasses(domNode, classes) {\n if (classes) {\n const classNames = classes.split(' ');\n for (let i = 0; i < classNames.length; i++) {\n domNode.classList.add(classNames[i]);\n }\n }\n}\nfunction removeClasses(domNode, classes) {\n if (classes) {\n const classNames = classes.split(' ');\n for (let i = 0; i < classNames.length; i++) {\n domNode.classList.remove(classNames[i]);\n }\n }\n}\nfunction buildPreviousProperties(domNode, previous, current) {\n const { diffType, properties, attributes } = current;\n if (!diffType || diffType === 'vdom') {\n return { properties: previous.properties, attributes: previous.attributes, events: previous.events };\n }\n else if (diffType === 'none') {\n return { properties: {}, attributes: previous.attributes ? {} : undefined, events: previous.events };\n }\n let newProperties = {\n properties: {}\n };\n if (attributes) {\n newProperties.attributes = {};\n newProperties.events = previous.events;\n Object.keys(properties).forEach((propName) => {\n newProperties.properties[propName] = domNode[propName];\n });\n Object.keys(attributes).forEach((attrName) => {\n newProperties.attributes[attrName] = domNode.getAttribute(attrName);\n });\n return newProperties;\n }\n newProperties.properties = Object.keys(properties).reduce((props, property) => {\n props[property] = domNode.getAttribute(property) || domNode[property];\n return props;\n }, {});\n return newProperties;\n}\nfunction focusNode(propValue, previousValue, domNode, projectionOptions) {\n let result;\n if (typeof propValue === 'function') {\n result = propValue();\n }\n else {\n result = propValue && !previousValue;\n }\n if (result === true) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectorState.deferredRenderCallbacks.push(() => {\n domNode.focus();\n });\n }\n}\nfunction removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions, onlyEvents = false) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n const eventMap = projectorState.nodeMap.get(domNode);\n if (eventMap) {\n Object.keys(previousProperties).forEach((propName) => {\n const isEvent = propName.substr(0, 2) === 'on' || onlyEvents;\n const eventName = onlyEvents ? propName : propName.substr(2);\n if (isEvent && !properties[propName]) {\n const eventCallback = eventMap.get(previousProperties[propName]);\n if (eventCallback) {\n domNode.removeEventListener(eventName, eventCallback);\n }\n }\n });\n }\n}\nfunction updateAttribute(domNode, attrName, attrValue, projectionOptions) {\n if (projectionOptions.namespace === NAMESPACE_SVG && attrName === 'href') {\n domNode.setAttributeNS(NAMESPACE_XLINK, attrName, attrValue);\n }\n else if ((attrName === 'role' && attrValue === '') || attrValue === undefined) {\n domNode.removeAttribute(attrName);\n }\n else {\n domNode.setAttribute(attrName, attrValue);\n }\n}\nfunction updateAttributes(domNode, previousAttributes, attributes, projectionOptions) {\n const attrNames = Object.keys(attributes);\n const attrCount = attrNames.length;\n for (let i = 0; i < attrCount; i++) {\n const attrName = attrNames[i];\n const attrValue = attributes[attrName];\n const previousAttrValue = previousAttributes[attrName];\n if (attrValue !== previousAttrValue) {\n updateAttribute(domNode, attrName, attrValue, projectionOptions);\n }\n }\n}\nfunction updateProperties(domNode, previousProperties, properties, projectionOptions, includesEventsAndAttributes = true) {\n let propertiesUpdated = false;\n const propNames = Object.keys(properties);\n const propCount = propNames.length;\n if (propNames.indexOf('classes') === -1 && previousProperties.classes) {\n if (Array.isArray(previousProperties.classes)) {\n for (let i = 0; i < previousProperties.classes.length; i++) {\n removeClasses(domNode, previousProperties.classes[i]);\n }\n }\n else {\n removeClasses(domNode, previousProperties.classes);\n }\n }\n includesEventsAndAttributes && removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions);\n for (let i = 0; i < propCount; i++) {\n const propName = propNames[i];\n let propValue = properties[propName];\n const previousValue = previousProperties[propName];\n if (propName === 'classes') {\n const previousClasses = Array.isArray(previousValue) ? previousValue : [previousValue];\n const currentClasses = Array.isArray(propValue) ? propValue : [propValue];\n if (previousClasses && previousClasses.length > 0) {\n if (!propValue || propValue.length === 0) {\n for (let i = 0; i < previousClasses.length; i++) {\n removeClasses(domNode, previousClasses[i]);\n }\n }\n else {\n const newClasses = [...currentClasses];\n for (let i = 0; i < previousClasses.length; i++) {\n const previousClassName = previousClasses[i];\n if (previousClassName) {\n const classIndex = newClasses.indexOf(previousClassName);\n if (classIndex === -1) {\n removeClasses(domNode, previousClassName);\n }\n else {\n newClasses.splice(classIndex, 1);\n }\n }\n }\n for (let i = 0; i < newClasses.length; i++) {\n addClasses(domNode, newClasses[i]);\n }\n }\n }\n else {\n for (let i = 0; i < currentClasses.length; i++) {\n addClasses(domNode, currentClasses[i]);\n }\n }\n }\n else if (propName === 'focus') {\n focusNode(propValue, previousValue, domNode, projectionOptions);\n }\n else if (propName === 'styles') {\n const styleNames = Object.keys(propValue);\n const styleCount = styleNames.length;\n for (let j = 0; j < styleCount; j++) {\n const styleName = styleNames[j];\n const newStyleValue = propValue[styleName];\n const oldStyleValue = previousValue && previousValue[styleName];\n if (newStyleValue === oldStyleValue) {\n continue;\n }\n propertiesUpdated = true;\n if (newStyleValue) {\n checkStyleValue(newStyleValue);\n projectionOptions.styleApplyer(domNode, styleName, newStyleValue);\n }\n else {\n projectionOptions.styleApplyer(domNode, styleName, '');\n }\n }\n }\n else {\n if (!propValue && typeof previousValue === 'string') {\n propValue = '';\n }\n if (propName === 'value') {\n const domValue = domNode[propName];\n if (domValue !== propValue &&\n (domNode['oninput-value']\n ? domValue === domNode['oninput-value']\n : propValue !== previousValue)) {\n domNode[propName] = propValue;\n domNode['oninput-value'] = undefined;\n }\n if (propValue !== previousValue) {\n propertiesUpdated = true;\n }\n }\n else if (propName !== 'key' && propValue !== previousValue) {\n const type = typeof propValue;\n if (type === 'function' && propName.lastIndexOf('on', 0) === 0 && includesEventsAndAttributes) {\n updateEvent(domNode, propName.substr(2), propValue, projectionOptions, properties.bind, previousValue);\n }\n else if (type === 'string' && propName !== 'innerHTML' && includesEventsAndAttributes) {\n updateAttribute(domNode, propName, propValue, projectionOptions);\n }\n else if (propName === 'scrollLeft' || propName === 'scrollTop') {\n if (domNode[propName] !== propValue) {\n domNode[propName] = propValue;\n }\n }\n else {\n domNode[propName] = propValue;\n }\n propertiesUpdated = true;\n }\n }\n }\n return propertiesUpdated;\n}\nfunction findIndexOfChild(children, sameAs, start) {\n for (let i = start; i < children.length; i++) {\n if (same(children[i], sameAs)) {\n return i;\n }\n }\n return -1;\n}\nexport function toParentVNode(domNode) {\n return {\n tag: '',\n properties: {},\n children: undefined,\n domNode,\n type: VNODE\n };\n}\nexport function toTextVNode(data) {\n return {\n tag: '',\n properties: {},\n children: undefined,\n text: `${data}`,\n domNode: undefined,\n type: VNODE\n };\n}\nfunction toInternalWNode(instance, instanceData) {\n return {\n instance,\n rendered: [],\n coreProperties: instanceData.coreProperties,\n children: instance.children,\n widgetConstructor: instance.constructor,\n properties: instanceData.inputProperties,\n type: WNODE\n };\n}\nexport function filterAndDecorateChildren(children, instance) {\n if (children === undefined) {\n return emptyArray;\n }\n children = Array.isArray(children) ? children : [children];\n for (let i = 0; i < children.length;) {\n const child = children[i];\n if (child === undefined || child === null) {\n children.splice(i, 1);\n continue;\n }\n else if (typeof child === 'string') {\n children[i] = toTextVNode(child);\n }\n else {\n if (isVNode(child)) {\n if (child.properties.bind === undefined) {\n child.properties.bind = instance;\n if (child.children && child.children.length > 0) {\n filterAndDecorateChildren(child.children, instance);\n }\n }\n }\n else {\n if (!child.coreProperties) {\n const instanceData = widgetInstanceMap.get(instance);\n child.coreProperties = {\n bind: instance,\n baseRegistry: instanceData.coreProperties.baseRegistry\n };\n }\n if (child.children && child.children.length > 0) {\n filterAndDecorateChildren(child.children, instance);\n }\n }\n }\n i++;\n }\n return children;\n}\nfunction nodeAdded(dnode, transitions) {\n if (isVNode(dnode) && dnode.properties) {\n const enterAnimation = dnode.properties.enterAnimation;\n if (enterAnimation) {\n if (typeof enterAnimation === 'function') {\n enterAnimation(dnode.domNode, dnode.properties);\n }\n else {\n transitions.enter(dnode.domNode, dnode.properties, enterAnimation);\n }\n }\n }\n}\nfunction nodeToRemove(dnode, transitions, projectionOptions) {\n if (isWNode(dnode)) {\n const rendered = dnode.rendered || emptyArray;\n if (dnode.instance) {\n const instanceData = widgetInstanceMap.get(dnode.instance);\n instanceData.onDetach();\n instanceMap.delete(dnode.instance);\n }\n for (let i = 0; i < rendered.length; i++) {\n nodeToRemove(rendered[i], transitions, projectionOptions);\n }\n }\n else {\n const domNode = dnode.domNode;\n const properties = dnode.properties;\n if (dnode.children && dnode.children.length > 0) {\n for (let i = 0; i < dnode.children.length; i++) {\n nodeToRemove(dnode.children[i], transitions, projectionOptions);\n }\n }\n const exitAnimation = properties.exitAnimation;\n if (properties && exitAnimation) {\n domNode.style.pointerEvents = 'none';\n const removeDomNode = function () {\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\n dnode.domNode = undefined;\n };\n if (typeof exitAnimation === 'function') {\n exitAnimation(domNode, removeDomNode, properties);\n return;\n }\n else {\n transitions.exit(dnode.domNode, properties, exitAnimation, removeDomNode);\n return;\n }\n }\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\n dnode.domNode = undefined;\n }\n}\nfunction checkDistinguishable(childNodes, indexToCheck, parentInstance) {\n const childNode = childNodes[indexToCheck];\n if (isVNode(childNode) && !childNode.tag) {\n return; // Text nodes need not be distinguishable\n }\n const { key } = childNode.properties;\n if (key === undefined || key === null) {\n for (let i = 0; i < childNodes.length; i++) {\n if (i !== indexToCheck) {\n const node = childNodes[i];\n if (same(node, childNode)) {\n let nodeIdentifier;\n const parentName = parentInstance.constructor.name || 'unknown';\n if (isWNode(childNode)) {\n nodeIdentifier = childNode.widgetConstructor.name || 'unknown';\n }\n else {\n nodeIdentifier = childNode.tag;\n }\n console.warn(`A widget (${parentName}) has had a child addded or removed, but they were not able to uniquely identified. It is recommended to provide a unique 'key' property when using the same widget or element (${nodeIdentifier}) multiple times as siblings`);\n break;\n }\n }\n }\n }\n}\nfunction updateChildren(parentVNode, oldChildren, newChildren, parentInstance, projectionOptions) {\n oldChildren = oldChildren || emptyArray;\n newChildren = newChildren;\n const oldChildrenLength = oldChildren.length;\n const newChildrenLength = newChildren.length;\n const transitions = projectionOptions.transitions;\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\n let oldIndex = 0;\n let newIndex = 0;\n let i;\n let textUpdated = false;\n while (newIndex < newChildrenLength) {\n let oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : undefined;\n const newChild = newChildren[newIndex];\n if (isVNode(newChild) && typeof newChild.deferredPropertiesCallback === 'function') {\n newChild.inserted = isVNode(oldChild) && oldChild.inserted;\n addDeferredProperties(newChild, projectionOptions);\n }\n if (oldChild !== undefined && same(oldChild, newChild)) {\n textUpdated = updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance) || textUpdated;\n oldIndex++;\n newIndex++;\n continue;\n }\n const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);\n const addChild = () => {\n let insertBeforeDomNode = undefined;\n let child = oldChildren[oldIndex];\n if (child) {\n let nextIndex = oldIndex + 1;\n let insertBeforeChildren = [child];\n while (insertBeforeChildren.length) {\n const insertBefore = insertBeforeChildren.shift();\n if (isWNode(insertBefore)) {\n if (insertBefore.rendered) {\n insertBeforeChildren.push(...insertBefore.rendered);\n }\n }\n else {\n if (insertBefore.domNode) {\n insertBeforeDomNode = insertBefore.domNode;\n break;\n }\n }\n if (insertBeforeChildren.length === 0 && oldChildren[nextIndex]) {\n insertBeforeChildren.push(oldChildren[nextIndex]);\n nextIndex++;\n }\n }\n }\n createDom(newChild, parentVNode, insertBeforeDomNode, projectionOptions, parentInstance);\n nodeAdded(newChild, transitions);\n const indexToCheck = newIndex;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(newChildren, indexToCheck, parentInstance);\n });\n };\n if (!oldChild || findOldIndex === -1) {\n addChild();\n newIndex++;\n continue;\n }\n const removeChild = () => {\n const indexToCheck = oldIndex;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\n });\n if (isWNode(oldChild)) {\n const item = instanceMap.get(oldChild.instance);\n if (item) {\n oldChild = item.dnode;\n }\n }\n nodeToRemove(oldChild, transitions, projectionOptions);\n };\n const findNewIndex = findIndexOfChild(newChildren, oldChild, newIndex + 1);\n if (findNewIndex === -1) {\n removeChild();\n oldIndex++;\n continue;\n }\n addChild();\n removeChild();\n oldIndex++;\n newIndex++;\n }\n if (oldChildrenLength > oldIndex) {\n // Remove child fragments\n for (i = oldIndex; i < oldChildrenLength; i++) {\n const indexToCheck = i;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\n });\n let childToRemove = oldChildren[i];\n if (isWNode(childToRemove)) {\n const item = instanceMap.get(childToRemove.instance);\n if (item) {\n childToRemove = item.dnode;\n }\n }\n nodeToRemove(childToRemove, transitions, projectionOptions);\n }\n }\n return textUpdated;\n}\nfunction addChildren(parentVNode, children, projectionOptions, parentInstance, insertBefore = undefined, childNodes) {\n if (children === undefined) {\n return;\n }\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectorState.merge && childNodes === undefined) {\n childNodes = arrayFrom(parentVNode.domNode.childNodes);\n }\n const transitions = projectionOptions.transitions;\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n if (isVNode(child)) {\n if (projectorState.merge && childNodes) {\n let domElement = undefined;\n while (child.domNode === undefined && childNodes.length > 0) {\n domElement = childNodes.shift();\n if (domElement && domElement.tagName === (child.tag.toUpperCase() || undefined)) {\n child.domNode = domElement;\n }\n }\n }\n createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance);\n }\n else {\n createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes);\n }\n nodeAdded(child, transitions);\n }\n}\nfunction initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions) {\n addChildren(dnode, dnode.children, projectionOptions, parentInstance, undefined);\n if (typeof dnode.deferredPropertiesCallback === 'function' && dnode.inserted === undefined) {\n addDeferredProperties(dnode, projectionOptions);\n }\n if (dnode.attributes && dnode.events) {\n updateAttributes(domNode, {}, dnode.attributes, projectionOptions);\n updateProperties(domNode, {}, dnode.properties, projectionOptions, false);\n removeOrphanedEvents(domNode, {}, dnode.events, projectionOptions, true);\n const events = dnode.events;\n Object.keys(events).forEach((event) => {\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind);\n });\n }\n else {\n updateProperties(domNode, {}, dnode.properties, projectionOptions);\n }\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\n const instanceData = widgetInstanceMap.get(parentInstance);\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\n }\n dnode.inserted = true;\n}\nfunction createDom(dnode, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes) {\n let domNode;\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (isWNode(dnode)) {\n let { widgetConstructor } = dnode;\n const parentInstanceData = widgetInstanceMap.get(parentInstance);\n if (!isWidgetBaseConstructor(widgetConstructor)) {\n const item = parentInstanceData.registry().get(widgetConstructor);\n if (item === null) {\n return;\n }\n widgetConstructor = item;\n }\n const instance = new widgetConstructor();\n dnode.instance = instance;\n const instanceData = widgetInstanceMap.get(instance);\n instanceData.invalidate = () => {\n instanceData.dirty = true;\n if (instanceData.rendering === false) {\n projectorState.renderQueue.push({ instance, depth: projectionOptions.depth });\n scheduleRender(projectionOptions);\n }\n };\n instanceData.rendering = true;\n instance.__setCoreProperties__(dnode.coreProperties);\n instance.__setChildren__(dnode.children);\n instance.__setProperties__(dnode.properties);\n const rendered = instance.__render__();\n instanceData.rendering = false;\n if (rendered) {\n const filteredRendered = filterAndDecorateChildren(rendered, instance);\n dnode.rendered = filteredRendered;\n addChildren(parentVNode, filteredRendered, projectionOptions, instance, insertBefore, childNodes);\n }\n instanceMap.set(instance, { dnode, parentVNode });\n instanceData.nodeHandler.addRoot();\n projectorState.afterRenderCallbacks.push(() => {\n instanceData.onAttach();\n });\n }\n else {\n if (projectorState.merge && projectorState.mergeElement !== undefined) {\n domNode = dnode.domNode = projectionOptions.mergeElement;\n projectorState.mergeElement = undefined;\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\n return;\n }\n const doc = parentVNode.domNode.ownerDocument;\n if (!dnode.tag && typeof dnode.text === 'string') {\n if (dnode.domNode !== undefined && parentVNode.domNode) {\n const newDomNode = dnode.domNode.ownerDocument.createTextNode(dnode.text);\n if (parentVNode.domNode === dnode.domNode.parentNode) {\n parentVNode.domNode.replaceChild(newDomNode, dnode.domNode);\n }\n else {\n parentVNode.domNode.appendChild(newDomNode);\n dnode.domNode.parentNode && dnode.domNode.parentNode.removeChild(dnode.domNode);\n }\n dnode.domNode = newDomNode;\n }\n else {\n domNode = dnode.domNode = doc.createTextNode(dnode.text);\n if (insertBefore !== undefined) {\n parentVNode.domNode.insertBefore(domNode, insertBefore);\n }\n else {\n parentVNode.domNode.appendChild(domNode);\n }\n }\n }\n else {\n if (dnode.domNode === undefined) {\n if (dnode.tag === 'svg') {\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\n }\n if (projectionOptions.namespace !== undefined) {\n domNode = dnode.domNode = doc.createElementNS(projectionOptions.namespace, dnode.tag);\n }\n else {\n domNode = dnode.domNode = dnode.domNode || doc.createElement(dnode.tag);\n }\n }\n else {\n domNode = dnode.domNode;\n }\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\n if (insertBefore !== undefined) {\n parentVNode.domNode.insertBefore(domNode, insertBefore);\n }\n else if (domNode.parentNode !== parentVNode.domNode) {\n parentVNode.domNode.appendChild(domNode);\n }\n }\n }\n}\nfunction updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance) {\n if (isWNode(dnode)) {\n const { instance } = previous;\n const { parentVNode, dnode: node } = instanceMap.get(instance);\n const previousRendered = node ? node.rendered : previous.rendered;\n const instanceData = widgetInstanceMap.get(instance);\n instanceData.rendering = true;\n instance.__setCoreProperties__(dnode.coreProperties);\n instance.__setChildren__(dnode.children);\n instance.__setProperties__(dnode.properties);\n dnode.instance = instance;\n if (instanceData.dirty === true) {\n const rendered = instance.__render__();\n instanceData.rendering = false;\n dnode.rendered = filterAndDecorateChildren(rendered, instance);\n updateChildren(parentVNode, previousRendered, dnode.rendered, instance, projectionOptions);\n }\n else {\n instanceData.rendering = false;\n dnode.rendered = previousRendered;\n }\n instanceMap.set(instance, { dnode, parentVNode });\n instanceData.nodeHandler.addRoot();\n }\n else {\n if (previous === dnode) {\n return false;\n }\n const domNode = (dnode.domNode = previous.domNode);\n let textUpdated = false;\n let updated = false;\n if (!dnode.tag && typeof dnode.text === 'string') {\n if (dnode.text !== previous.text) {\n const newDomNode = domNode.ownerDocument.createTextNode(dnode.text);\n domNode.parentNode.replaceChild(newDomNode, domNode);\n dnode.domNode = newDomNode;\n textUpdated = true;\n return textUpdated;\n }\n }\n else {\n if (dnode.tag && dnode.tag.lastIndexOf('svg', 0) === 0) {\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\n }\n if (previous.children !== dnode.children) {\n const children = filterAndDecorateChildren(dnode.children, parentInstance);\n dnode.children = children;\n updated =\n updateChildren(dnode, previous.children, children, parentInstance, projectionOptions) || updated;\n }\n const previousProperties = buildPreviousProperties(domNode, previous, dnode);\n if (dnode.attributes && dnode.events) {\n updateAttributes(domNode, previousProperties.attributes, dnode.attributes, projectionOptions);\n updated =\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions, false) || updated;\n removeOrphanedEvents(domNode, previousProperties.events, dnode.events, projectionOptions, true);\n const events = dnode.events;\n Object.keys(events).forEach((event) => {\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind, previousProperties.events[event]);\n });\n }\n else {\n updated =\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions) ||\n updated;\n }\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\n const instanceData = widgetInstanceMap.get(parentInstance);\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\n }\n }\n if (updated && dnode.properties && dnode.properties.updateAnimation) {\n dnode.properties.updateAnimation(domNode, dnode.properties, previous.properties);\n }\n }\n}\nfunction addDeferredProperties(vnode, projectionOptions) {\n // transfer any properties that have been passed - as these must be decorated properties\n vnode.decoratedDeferredProperties = vnode.properties;\n const properties = vnode.deferredPropertiesCallback(!!vnode.inserted);\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n vnode.properties = Object.assign({}, properties, vnode.decoratedDeferredProperties);\n projectorState.deferredRenderCallbacks.push(() => {\n const properties = Object.assign({}, vnode.deferredPropertiesCallback(!!vnode.inserted), vnode.decoratedDeferredProperties);\n updateProperties(vnode.domNode, vnode.properties, properties, projectionOptions);\n vnode.properties = properties;\n });\n}\nfunction runDeferredRenderCallbacks(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectorState.deferredRenderCallbacks.length) {\n if (projectionOptions.sync) {\n while (projectorState.deferredRenderCallbacks.length) {\n const callback = projectorState.deferredRenderCallbacks.shift();\n callback && callback();\n }\n }\n else {\n global.requestAnimationFrame(() => {\n while (projectorState.deferredRenderCallbacks.length) {\n const callback = projectorState.deferredRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n }\n}\nfunction runAfterRenderCallbacks(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectionOptions.sync) {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n }\n else {\n if (global.requestIdleCallback) {\n global.requestIdleCallback(() => {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n else {\n setTimeout(() => {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n }\n}\nfunction scheduleRender(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectionOptions.sync) {\n render(projectionOptions);\n }\n else if (projectorState.renderScheduled === undefined) {\n projectorState.renderScheduled = global.requestAnimationFrame(() => {\n render(projectionOptions);\n });\n }\n}\nfunction render(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectorState.renderScheduled = undefined;\n const renderQueue = projectorState.renderQueue;\n const renders = [...renderQueue];\n projectorState.renderQueue = [];\n renders.sort((a, b) => a.depth - b.depth);\n const previouslyRendered = [];\n while (renders.length) {\n const { instance } = renders.shift();\n if (instanceMap.has(instance) && previouslyRendered.indexOf(instance) === -1) {\n previouslyRendered.push(instance);\n const { parentVNode, dnode } = instanceMap.get(instance);\n const instanceData = widgetInstanceMap.get(instance);\n updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance);\n }\n }\n runAfterRenderCallbacks(projectionOptions);\n runDeferredRenderCallbacks(projectionOptions);\n}\nexport const dom = {\n append: function (parentNode, instance, projectionOptions = {}) {\n const instanceData = widgetInstanceMap.get(instance);\n const finalProjectorOptions = getProjectionOptions(projectionOptions, instance);\n const projectorState = {\n afterRenderCallbacks: [],\n deferredRenderCallbacks: [],\n nodeMap: new WeakMap(),\n renderScheduled: undefined,\n renderQueue: [],\n merge: projectionOptions.merge || false,\n mergeElement: projectionOptions.mergeElement\n };\n projectorStateMap.set(instance, projectorState);\n finalProjectorOptions.rootNode = parentNode;\n const parentVNode = toParentVNode(finalProjectorOptions.rootNode);\n const node = toInternalWNode(instance, instanceData);\n instanceMap.set(instance, { dnode: node, parentVNode });\n instanceData.invalidate = () => {\n instanceData.dirty = true;\n if (instanceData.rendering === false) {\n projectorState.renderQueue.push({ instance, depth: finalProjectorOptions.depth });\n scheduleRender(finalProjectorOptions);\n }\n };\n updateDom(node, node, finalProjectorOptions, parentVNode, instance);\n projectorState.afterRenderCallbacks.push(() => {\n instanceData.onAttach();\n });\n runDeferredRenderCallbacks(finalProjectorOptions);\n runAfterRenderCallbacks(finalProjectorOptions);\n return {\n domNode: finalProjectorOptions.rootNode\n };\n },\n create: function (instance, projectionOptions) {\n return this.append(document.createElement('div'), instance, projectionOptions);\n },\n merge: function (element, instance, projectionOptions = {}) {\n projectionOptions.merge = true;\n projectionOptions.mergeElement = element;\n const projection = this.append(element.parentNode, instance, projectionOptions);\n const projectorState = projectorStateMap.get(instance);\n projectorState.merge = false;\n return projection;\n }\n};\n//# sourceMappingURL=vdom.mjs.map" + "source": "import global from '../shim/global';\nimport { from as arrayFrom } from '../shim/array';\nimport { isWNode, isVNode, isDomVNode, VNODE, WNODE } from './d';\nimport { isWidgetBaseConstructor } from './Registry';\nimport WeakMap from '../shim/WeakMap';\nconst NAMESPACE_W3 = 'http://www.w3.org/';\nconst NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg';\nconst NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink';\nconst emptyArray = [];\nconst nodeOperations = ['focus', 'blur', 'scrollIntoView', 'click'];\nexport const widgetInstanceMap = new WeakMap();\nconst instanceMap = new WeakMap();\nconst nextSiblingMap = new WeakMap();\nconst projectorStateMap = new WeakMap();\nfunction same(dnode1, dnode2) {\n if (isVNode(dnode1) && isVNode(dnode2)) {\n if (isDomVNode(dnode1) || isDomVNode(dnode2)) {\n if (dnode1.domNode !== dnode2.domNode) {\n return false;\n }\n }\n if (dnode1.tag !== dnode2.tag) {\n return false;\n }\n if (dnode1.properties.key !== dnode2.properties.key) {\n return false;\n }\n return true;\n }\n else if (isWNode(dnode1) && isWNode(dnode2)) {\n if (dnode1.instance === undefined && typeof dnode2.widgetConstructor === 'string') {\n return false;\n }\n if (dnode1.widgetConstructor !== dnode2.widgetConstructor) {\n return false;\n }\n if (dnode1.properties.key !== dnode2.properties.key) {\n return false;\n }\n return true;\n }\n return false;\n}\nconst missingTransition = function () {\n throw new Error('Provide a transitions object to the projectionOptions to do animations');\n};\nfunction getProjectionOptions(projectorOptions, projectorInstance) {\n const defaults = {\n namespace: undefined,\n styleApplyer: function (domNode, styleName, value) {\n domNode.style[styleName] = value;\n },\n transitions: {\n enter: missingTransition,\n exit: missingTransition\n },\n depth: 0,\n merge: false,\n sync: false,\n projectorInstance\n };\n return Object.assign({}, defaults, projectorOptions);\n}\nfunction checkStyleValue(styleValue) {\n if (typeof styleValue !== 'string') {\n throw new Error('Style values must be strings');\n }\n}\nfunction updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n const eventMap = projectorState.nodeMap.get(domNode) || new WeakMap();\n if (previousValue) {\n const previousEvent = eventMap.get(previousValue);\n domNode.removeEventListener(eventName, previousEvent);\n }\n let callback = currentValue.bind(bind);\n if (eventName === 'input') {\n callback = function (evt) {\n currentValue.call(this, evt);\n evt.target['oninput-value'] = evt.target.value;\n }.bind(bind);\n }\n domNode.addEventListener(eventName, callback);\n eventMap.set(currentValue, callback);\n projectorState.nodeMap.set(domNode, eventMap);\n}\nfunction addClasses(domNode, classes) {\n if (classes) {\n const classNames = classes.split(' ');\n for (let i = 0; i < classNames.length; i++) {\n domNode.classList.add(classNames[i]);\n }\n }\n}\nfunction removeClasses(domNode, classes) {\n if (classes) {\n const classNames = classes.split(' ');\n for (let i = 0; i < classNames.length; i++) {\n domNode.classList.remove(classNames[i]);\n }\n }\n}\nfunction buildPreviousProperties(domNode, previous, current) {\n const { diffType, properties, attributes } = current;\n if (!diffType || diffType === 'vdom') {\n return { properties: previous.properties, attributes: previous.attributes, events: previous.events };\n }\n else if (diffType === 'none') {\n return { properties: {}, attributes: previous.attributes ? {} : undefined, events: previous.events };\n }\n let newProperties = {\n properties: {}\n };\n if (attributes) {\n newProperties.attributes = {};\n newProperties.events = previous.events;\n Object.keys(properties).forEach((propName) => {\n newProperties.properties[propName] = domNode[propName];\n });\n Object.keys(attributes).forEach((attrName) => {\n newProperties.attributes[attrName] = domNode.getAttribute(attrName);\n });\n return newProperties;\n }\n newProperties.properties = Object.keys(properties).reduce((props, property) => {\n props[property] = domNode.getAttribute(property) || domNode[property];\n return props;\n }, {});\n return newProperties;\n}\nfunction nodeOperation(propName, propValue, previousValue, domNode, projectionOptions) {\n let result;\n if (typeof propValue === 'function') {\n result = propValue();\n }\n else {\n result = propValue && !previousValue;\n }\n if (result === true) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectorState.deferredRenderCallbacks.push(() => {\n domNode[propName]();\n });\n }\n}\nfunction removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions, onlyEvents = false) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n const eventMap = projectorState.nodeMap.get(domNode);\n if (eventMap) {\n Object.keys(previousProperties).forEach((propName) => {\n const isEvent = propName.substr(0, 2) === 'on' || onlyEvents;\n const eventName = onlyEvents ? propName : propName.substr(2);\n if (isEvent && !properties[propName]) {\n const eventCallback = eventMap.get(previousProperties[propName]);\n if (eventCallback) {\n domNode.removeEventListener(eventName, eventCallback);\n }\n }\n });\n }\n}\nfunction updateAttribute(domNode, attrName, attrValue, projectionOptions) {\n if (projectionOptions.namespace === NAMESPACE_SVG && attrName === 'href') {\n domNode.setAttributeNS(NAMESPACE_XLINK, attrName, attrValue);\n }\n else if ((attrName === 'role' && attrValue === '') || attrValue === undefined) {\n domNode.removeAttribute(attrName);\n }\n else {\n domNode.setAttribute(attrName, attrValue);\n }\n}\nfunction updateAttributes(domNode, previousAttributes, attributes, projectionOptions) {\n const attrNames = Object.keys(attributes);\n const attrCount = attrNames.length;\n for (let i = 0; i < attrCount; i++) {\n const attrName = attrNames[i];\n const attrValue = attributes[attrName];\n const previousAttrValue = previousAttributes[attrName];\n if (attrValue !== previousAttrValue) {\n updateAttribute(domNode, attrName, attrValue, projectionOptions);\n }\n }\n}\nfunction updateProperties(domNode, previousProperties, properties, projectionOptions, includesEventsAndAttributes = true) {\n let propertiesUpdated = false;\n const propNames = Object.keys(properties);\n const propCount = propNames.length;\n if (propNames.indexOf('classes') === -1 && previousProperties.classes) {\n if (Array.isArray(previousProperties.classes)) {\n for (let i = 0; i < previousProperties.classes.length; i++) {\n removeClasses(domNode, previousProperties.classes[i]);\n }\n }\n else {\n removeClasses(domNode, previousProperties.classes);\n }\n }\n includesEventsAndAttributes && removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions);\n for (let i = 0; i < propCount; i++) {\n const propName = propNames[i];\n let propValue = properties[propName];\n const previousValue = previousProperties[propName];\n if (propName === 'classes') {\n const previousClasses = Array.isArray(previousValue) ? previousValue : [previousValue];\n const currentClasses = Array.isArray(propValue) ? propValue : [propValue];\n if (previousClasses && previousClasses.length > 0) {\n if (!propValue || propValue.length === 0) {\n for (let i = 0; i < previousClasses.length; i++) {\n removeClasses(domNode, previousClasses[i]);\n }\n }\n else {\n const newClasses = [...currentClasses];\n for (let i = 0; i < previousClasses.length; i++) {\n const previousClassName = previousClasses[i];\n if (previousClassName) {\n const classIndex = newClasses.indexOf(previousClassName);\n if (classIndex === -1) {\n removeClasses(domNode, previousClassName);\n }\n else {\n newClasses.splice(classIndex, 1);\n }\n }\n }\n for (let i = 0; i < newClasses.length; i++) {\n addClasses(domNode, newClasses[i]);\n }\n }\n }\n else {\n for (let i = 0; i < currentClasses.length; i++) {\n addClasses(domNode, currentClasses[i]);\n }\n }\n }\n else if (nodeOperations.indexOf(propName) !== -1) {\n nodeOperation(propName, propValue, previousValue, domNode, projectionOptions);\n }\n else if (propName === 'styles') {\n const styleNames = Object.keys(propValue);\n const styleCount = styleNames.length;\n for (let j = 0; j < styleCount; j++) {\n const styleName = styleNames[j];\n const newStyleValue = propValue[styleName];\n const oldStyleValue = previousValue && previousValue[styleName];\n if (newStyleValue === oldStyleValue) {\n continue;\n }\n propertiesUpdated = true;\n if (newStyleValue) {\n checkStyleValue(newStyleValue);\n projectionOptions.styleApplyer(domNode, styleName, newStyleValue);\n }\n else {\n projectionOptions.styleApplyer(domNode, styleName, '');\n }\n }\n }\n else {\n if (!propValue && typeof previousValue === 'string') {\n propValue = '';\n }\n if (propName === 'value') {\n const domValue = domNode[propName];\n if (domValue !== propValue &&\n (domNode['oninput-value']\n ? domValue === domNode['oninput-value']\n : propValue !== previousValue)) {\n domNode[propName] = propValue;\n domNode['oninput-value'] = undefined;\n }\n if (propValue !== previousValue) {\n propertiesUpdated = true;\n }\n }\n else if (propName !== 'key' && propValue !== previousValue) {\n const type = typeof propValue;\n if (type === 'function' && propName.lastIndexOf('on', 0) === 0 && includesEventsAndAttributes) {\n updateEvent(domNode, propName.substr(2), propValue, projectionOptions, properties.bind, previousValue);\n }\n else if (type === 'string' && propName !== 'innerHTML' && includesEventsAndAttributes) {\n updateAttribute(domNode, propName, propValue, projectionOptions);\n }\n else if (propName === 'scrollLeft' || propName === 'scrollTop') {\n if (domNode[propName] !== propValue) {\n domNode[propName] = propValue;\n }\n }\n else {\n domNode[propName] = propValue;\n }\n propertiesUpdated = true;\n }\n }\n }\n return propertiesUpdated;\n}\nfunction findIndexOfChild(children, sameAs, start) {\n for (let i = start; i < children.length; i++) {\n if (same(children[i], sameAs)) {\n return i;\n }\n }\n return -1;\n}\nexport function toParentVNode(domNode) {\n return {\n tag: '',\n properties: {},\n children: undefined,\n domNode,\n type: VNODE\n };\n}\nexport function toTextVNode(data) {\n return {\n tag: '',\n properties: {},\n children: undefined,\n text: `${data}`,\n domNode: undefined,\n type: VNODE\n };\n}\nfunction toInternalWNode(instance, instanceData) {\n return {\n instance,\n rendered: [],\n coreProperties: instanceData.coreProperties,\n children: instance.children,\n widgetConstructor: instance.constructor,\n properties: instanceData.inputProperties,\n type: WNODE\n };\n}\nexport function filterAndDecorateChildren(children, instance) {\n if (children === undefined) {\n return emptyArray;\n }\n children = Array.isArray(children) ? children : [children];\n for (let i = 0; i < children.length;) {\n const child = children[i];\n if (child === undefined || child === null) {\n children.splice(i, 1);\n continue;\n }\n else if (typeof child === 'string') {\n children[i] = toTextVNode(child);\n }\n else {\n if (isVNode(child)) {\n if (child.properties.bind === undefined) {\n child.properties.bind = instance;\n if (child.children && child.children.length > 0) {\n filterAndDecorateChildren(child.children, instance);\n }\n }\n }\n else {\n if (!child.coreProperties) {\n const instanceData = widgetInstanceMap.get(instance);\n child.coreProperties = {\n bind: instance,\n baseRegistry: instanceData.coreProperties.baseRegistry\n };\n }\n if (child.children && child.children.length > 0) {\n filterAndDecorateChildren(child.children, instance);\n }\n }\n }\n i++;\n }\n return children;\n}\nfunction nodeAdded(dnode, transitions) {\n if (isVNode(dnode) && dnode.properties) {\n const enterAnimation = dnode.properties.enterAnimation;\n if (enterAnimation) {\n if (typeof enterAnimation === 'function') {\n enterAnimation(dnode.domNode, dnode.properties);\n }\n else {\n transitions.enter(dnode.domNode, dnode.properties, enterAnimation);\n }\n }\n }\n}\nfunction nodeToRemove(dnode, transitions, projectionOptions) {\n if (isWNode(dnode)) {\n const item = instanceMap.get(dnode.instance);\n const rendered = (item ? item.dnode.rendered : dnode.rendered) || emptyArray;\n if (dnode.instance) {\n const instanceData = widgetInstanceMap.get(dnode.instance);\n instanceData.onDetach();\n instanceMap.delete(dnode.instance);\n }\n for (let i = 0; i < rendered.length; i++) {\n nodeToRemove(rendered[i], transitions, projectionOptions);\n }\n }\n else {\n const domNode = dnode.domNode;\n const properties = dnode.properties;\n if (dnode.children && dnode.children.length > 0) {\n for (let i = 0; i < dnode.children.length; i++) {\n nodeToRemove(dnode.children[i], transitions, projectionOptions);\n }\n }\n const exitAnimation = properties.exitAnimation;\n if (properties && exitAnimation) {\n domNode.style.pointerEvents = 'none';\n const removeDomNode = function () {\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\n dnode.domNode = undefined;\n };\n if (typeof exitAnimation === 'function') {\n exitAnimation(domNode, removeDomNode, properties);\n return;\n }\n else {\n transitions.exit(dnode.domNode, properties, exitAnimation, removeDomNode);\n return;\n }\n }\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\n dnode.domNode = undefined;\n }\n}\nfunction checkDistinguishable(childNodes, indexToCheck, parentInstance) {\n const childNode = childNodes[indexToCheck];\n if (isVNode(childNode) && !childNode.tag) {\n return; // Text nodes need not be distinguishable\n }\n const { key } = childNode.properties;\n if (key === undefined || key === null) {\n for (let i = 0; i < childNodes.length; i++) {\n if (i !== indexToCheck) {\n const node = childNodes[i];\n if (same(node, childNode)) {\n let nodeIdentifier;\n const parentName = parentInstance.constructor.name || 'unknown';\n if (isWNode(childNode)) {\n nodeIdentifier = childNode.widgetConstructor.name || 'unknown';\n }\n else {\n nodeIdentifier = childNode.tag;\n }\n console.warn(`A widget (${parentName}) has had a child addded or removed, but they were not able to uniquely identified. It is recommended to provide a unique 'key' property when using the same widget or element (${nodeIdentifier}) multiple times as siblings`);\n break;\n }\n }\n }\n }\n}\nfunction updateChildren(parentVNode, siblings, oldChildren, newChildren, parentInstance, projectionOptions) {\n oldChildren = oldChildren || emptyArray;\n newChildren = newChildren;\n const oldChildrenLength = oldChildren.length;\n const newChildrenLength = newChildren.length;\n const transitions = projectionOptions.transitions;\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\n let oldIndex = 0;\n let newIndex = 0;\n let i;\n let textUpdated = false;\n while (newIndex < newChildrenLength) {\n let oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : undefined;\n const newChild = newChildren[newIndex];\n if (isVNode(newChild) && typeof newChild.deferredPropertiesCallback === 'function') {\n newChild.inserted = isVNode(oldChild) && oldChild.inserted;\n addDeferredProperties(newChild, projectionOptions);\n }\n if (oldChild !== undefined && same(oldChild, newChild)) {\n oldIndex++;\n newIndex++;\n textUpdated =\n updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance, oldChildren.slice(oldIndex), newChildren.slice(newIndex)) || textUpdated;\n continue;\n }\n const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);\n const addChild = () => {\n let insertBeforeDomNode = undefined;\n let childrenArray = oldChildren;\n let nextIndex = oldIndex + 1;\n let child = oldChildren[oldIndex];\n if (!child) {\n child = siblings[0];\n nextIndex = 1;\n childrenArray = siblings;\n }\n if (child) {\n let insertBeforeChildren = [child];\n while (insertBeforeChildren.length) {\n const insertBefore = insertBeforeChildren.shift();\n if (isWNode(insertBefore)) {\n const item = instanceMap.get(insertBefore.instance);\n if (item && item.dnode.rendered) {\n insertBeforeChildren.push(...item.dnode.rendered);\n }\n }\n else {\n if (insertBefore.domNode) {\n if (insertBefore.domNode.parentElement !== parentVNode.domNode) {\n break;\n }\n insertBeforeDomNode = insertBefore.domNode;\n break;\n }\n }\n if (insertBeforeChildren.length === 0 && childrenArray[nextIndex]) {\n insertBeforeChildren.push(childrenArray[nextIndex]);\n nextIndex++;\n }\n }\n }\n createDom(newChild, parentVNode, newChildren.slice(newIndex + 1), insertBeforeDomNode, projectionOptions, parentInstance);\n nodeAdded(newChild, transitions);\n const indexToCheck = newIndex;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(newChildren, indexToCheck, parentInstance);\n });\n };\n if (!oldChild || findOldIndex === -1) {\n addChild();\n newIndex++;\n continue;\n }\n const removeChild = () => {\n const indexToCheck = oldIndex;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\n });\n if (isWNode(oldChild)) {\n const item = instanceMap.get(oldChild.instance);\n if (item) {\n oldChild = item.dnode;\n }\n }\n nodeToRemove(oldChild, transitions, projectionOptions);\n };\n const findNewIndex = findIndexOfChild(newChildren, oldChild, newIndex + 1);\n if (findNewIndex === -1) {\n removeChild();\n oldIndex++;\n continue;\n }\n addChild();\n removeChild();\n oldIndex++;\n newIndex++;\n }\n if (oldChildrenLength > oldIndex) {\n // Remove child fragments\n for (i = oldIndex; i < oldChildrenLength; i++) {\n const indexToCheck = i;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\n });\n let childToRemove = oldChildren[i];\n if (isWNode(childToRemove)) {\n const item = instanceMap.get(childToRemove.instance);\n if (item) {\n childToRemove = item.dnode;\n }\n }\n nodeToRemove(childToRemove, transitions, projectionOptions);\n }\n }\n return textUpdated;\n}\nfunction addChildren(parentVNode, children, projectionOptions, parentInstance, insertBefore = undefined, childNodes) {\n if (children === undefined) {\n return;\n }\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectorState.merge && childNodes === undefined) {\n childNodes = arrayFrom(parentVNode.domNode.childNodes);\n }\n const transitions = projectionOptions.transitions;\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n const nextSiblings = children.slice(i + 1);\n if (isVNode(child)) {\n if (projectorState.merge && childNodes) {\n let domElement = undefined;\n while (child.domNode === undefined && childNodes.length > 0) {\n domElement = childNodes.shift();\n if (domElement && domElement.tagName === (child.tag.toUpperCase() || undefined)) {\n child.domNode = domElement;\n }\n }\n }\n createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance);\n }\n else {\n createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes);\n }\n nodeAdded(child, transitions);\n }\n}\nfunction initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions) {\n addChildren(dnode, dnode.children, projectionOptions, parentInstance, undefined);\n if (typeof dnode.deferredPropertiesCallback === 'function' && dnode.inserted === undefined) {\n addDeferredProperties(dnode, projectionOptions);\n }\n if (dnode.attributes && dnode.events) {\n updateAttributes(domNode, {}, dnode.attributes, projectionOptions);\n updateProperties(domNode, {}, dnode.properties, projectionOptions, false);\n removeOrphanedEvents(domNode, {}, dnode.events, projectionOptions, true);\n const events = dnode.events;\n Object.keys(events).forEach((event) => {\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind);\n });\n }\n else {\n updateProperties(domNode, {}, dnode.properties, projectionOptions);\n }\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\n const instanceData = widgetInstanceMap.get(parentInstance);\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\n }\n dnode.inserted = true;\n}\nfunction createDom(dnode, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes) {\n let domNode;\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (isWNode(dnode)) {\n let { widgetConstructor } = dnode;\n const parentInstanceData = widgetInstanceMap.get(parentInstance);\n if (!isWidgetBaseConstructor(widgetConstructor)) {\n const item = parentInstanceData.registry().get(widgetConstructor);\n if (item === null) {\n return;\n }\n widgetConstructor = item;\n }\n const instance = new widgetConstructor();\n dnode.instance = instance;\n nextSiblingMap.set(instance, nextSiblings);\n const instanceData = widgetInstanceMap.get(instance);\n instanceData.invalidate = () => {\n instanceData.dirty = true;\n if (instanceData.rendering === false) {\n projectorState.renderQueue.push({ instance, depth: projectionOptions.depth });\n scheduleRender(projectionOptions);\n }\n };\n instanceData.rendering = true;\n instance.__setCoreProperties__(dnode.coreProperties);\n instance.__setChildren__(dnode.children);\n instance.__setProperties__(dnode.properties);\n const rendered = instance.__render__();\n instanceData.rendering = false;\n if (rendered) {\n const filteredRendered = filterAndDecorateChildren(rendered, instance);\n dnode.rendered = filteredRendered;\n addChildren(parentVNode, filteredRendered, projectionOptions, instance, insertBefore, childNodes);\n }\n instanceMap.set(instance, { dnode, parentVNode });\n instanceData.nodeHandler.addRoot();\n projectorState.afterRenderCallbacks.push(() => {\n instanceData.onAttach();\n });\n }\n else {\n if (projectorState.merge && projectorState.mergeElement !== undefined) {\n domNode = dnode.domNode = projectionOptions.mergeElement;\n projectorState.mergeElement = undefined;\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\n return;\n }\n const doc = parentVNode.domNode.ownerDocument;\n if (!dnode.tag && typeof dnode.text === 'string') {\n if (dnode.domNode !== undefined && parentVNode.domNode) {\n const newDomNode = dnode.domNode.ownerDocument.createTextNode(dnode.text);\n if (parentVNode.domNode === dnode.domNode.parentNode) {\n parentVNode.domNode.replaceChild(newDomNode, dnode.domNode);\n }\n else {\n parentVNode.domNode.appendChild(newDomNode);\n dnode.domNode.parentNode && dnode.domNode.parentNode.removeChild(dnode.domNode);\n }\n dnode.domNode = newDomNode;\n }\n else {\n domNode = dnode.domNode = doc.createTextNode(dnode.text);\n if (insertBefore !== undefined) {\n parentVNode.domNode.insertBefore(domNode, insertBefore);\n }\n else {\n parentVNode.domNode.appendChild(domNode);\n }\n }\n }\n else {\n if (dnode.domNode === undefined) {\n if (dnode.tag === 'svg') {\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\n }\n if (projectionOptions.namespace !== undefined) {\n domNode = dnode.domNode = doc.createElementNS(projectionOptions.namespace, dnode.tag);\n }\n else {\n domNode = dnode.domNode = dnode.domNode || doc.createElement(dnode.tag);\n }\n }\n else {\n domNode = dnode.domNode;\n }\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\n if (insertBefore !== undefined) {\n parentVNode.domNode.insertBefore(domNode, insertBefore);\n }\n else if (domNode.parentNode !== parentVNode.domNode) {\n parentVNode.domNode.appendChild(domNode);\n }\n }\n }\n}\nfunction updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance, oldNextSiblings, nextSiblings) {\n if (isWNode(dnode)) {\n const { instance } = previous;\n const { parentVNode, dnode: node } = instanceMap.get(instance);\n const previousRendered = node ? node.rendered : previous.rendered;\n const instanceData = widgetInstanceMap.get(instance);\n instanceData.rendering = true;\n instance.__setCoreProperties__(dnode.coreProperties);\n instance.__setChildren__(dnode.children);\n instance.__setProperties__(dnode.properties);\n nextSiblingMap.set(instance, nextSiblings);\n dnode.instance = instance;\n if (instanceData.dirty === true) {\n const rendered = instance.__render__();\n instanceData.rendering = false;\n dnode.rendered = filterAndDecorateChildren(rendered, instance);\n updateChildren(parentVNode, oldNextSiblings, previousRendered, dnode.rendered, instance, projectionOptions);\n }\n else {\n instanceData.rendering = false;\n dnode.rendered = previousRendered;\n }\n instanceMap.set(instance, { dnode, parentVNode });\n instanceData.nodeHandler.addRoot();\n }\n else {\n if (previous === dnode) {\n return false;\n }\n const domNode = (dnode.domNode = previous.domNode);\n let textUpdated = false;\n let updated = false;\n if (!dnode.tag && typeof dnode.text === 'string') {\n if (dnode.text !== previous.text) {\n const newDomNode = domNode.ownerDocument.createTextNode(dnode.text);\n domNode.parentNode.replaceChild(newDomNode, domNode);\n dnode.domNode = newDomNode;\n textUpdated = true;\n return textUpdated;\n }\n }\n else {\n if (dnode.tag && dnode.tag.lastIndexOf('svg', 0) === 0) {\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\n }\n if (previous.children !== dnode.children) {\n const children = filterAndDecorateChildren(dnode.children, parentInstance);\n dnode.children = children;\n updated =\n updateChildren(dnode, oldNextSiblings, previous.children, children, parentInstance, projectionOptions) || updated;\n }\n const previousProperties = buildPreviousProperties(domNode, previous, dnode);\n if (dnode.attributes && dnode.events) {\n updateAttributes(domNode, previousProperties.attributes, dnode.attributes, projectionOptions);\n updated =\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions, false) || updated;\n removeOrphanedEvents(domNode, previousProperties.events, dnode.events, projectionOptions, true);\n const events = dnode.events;\n Object.keys(events).forEach((event) => {\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind, previousProperties.events[event]);\n });\n }\n else {\n updated =\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions) ||\n updated;\n }\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\n const instanceData = widgetInstanceMap.get(parentInstance);\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\n }\n }\n if (updated && dnode.properties && dnode.properties.updateAnimation) {\n dnode.properties.updateAnimation(domNode, dnode.properties, previous.properties);\n }\n }\n}\nfunction addDeferredProperties(vnode, projectionOptions) {\n // transfer any properties that have been passed - as these must be decorated properties\n vnode.decoratedDeferredProperties = vnode.properties;\n const properties = vnode.deferredPropertiesCallback(!!vnode.inserted);\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n vnode.properties = Object.assign({}, properties, vnode.decoratedDeferredProperties);\n projectorState.deferredRenderCallbacks.push(() => {\n const properties = Object.assign({}, vnode.deferredPropertiesCallback(!!vnode.inserted), vnode.decoratedDeferredProperties);\n updateProperties(vnode.domNode, vnode.properties, properties, projectionOptions);\n vnode.properties = properties;\n });\n}\nfunction runDeferredRenderCallbacks(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectorState.deferredRenderCallbacks.length) {\n if (projectionOptions.sync) {\n while (projectorState.deferredRenderCallbacks.length) {\n const callback = projectorState.deferredRenderCallbacks.shift();\n callback && callback();\n }\n }\n else {\n global.requestAnimationFrame(() => {\n while (projectorState.deferredRenderCallbacks.length) {\n const callback = projectorState.deferredRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n }\n}\nfunction runAfterRenderCallbacks(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectionOptions.sync) {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n }\n else {\n if (global.requestIdleCallback) {\n global.requestIdleCallback(() => {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n else {\n setTimeout(() => {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n }\n}\nfunction scheduleRender(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectionOptions.sync) {\n render(projectionOptions);\n }\n else if (projectorState.renderScheduled === undefined) {\n projectorState.renderScheduled = global.requestAnimationFrame(() => {\n render(projectionOptions);\n });\n }\n}\nfunction render(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectorState.renderScheduled = undefined;\n const renderQueue = projectorState.renderQueue;\n const renders = [...renderQueue];\n projectorState.renderQueue = [];\n renders.sort((a, b) => a.depth - b.depth);\n const previouslyRendered = [];\n while (renders.length) {\n const { instance } = renders.shift();\n if (instanceMap.has(instance) && previouslyRendered.indexOf(instance) === -1) {\n previouslyRendered.push(instance);\n const { parentVNode, dnode } = instanceMap.get(instance);\n const instanceData = widgetInstanceMap.get(instance);\n const nextSiblings = nextSiblingMap.get(instance);\n updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance, nextSiblings, nextSiblings);\n }\n }\n runAfterRenderCallbacks(projectionOptions);\n runDeferredRenderCallbacks(projectionOptions);\n}\nexport const dom = {\n append: function (parentNode, instance, projectionOptions = {}) {\n const instanceData = widgetInstanceMap.get(instance);\n const finalProjectorOptions = getProjectionOptions(projectionOptions, instance);\n const projectorState = {\n afterRenderCallbacks: [],\n deferredRenderCallbacks: [],\n nodeMap: new WeakMap(),\n renderScheduled: undefined,\n renderQueue: [],\n merge: projectionOptions.merge || false,\n mergeElement: projectionOptions.mergeElement\n };\n projectorStateMap.set(instance, projectorState);\n finalProjectorOptions.rootNode = parentNode;\n const parentVNode = toParentVNode(finalProjectorOptions.rootNode);\n const node = toInternalWNode(instance, instanceData);\n instanceMap.set(instance, { dnode: node, parentVNode });\n instanceData.invalidate = () => {\n instanceData.dirty = true;\n if (instanceData.rendering === false) {\n projectorState.renderQueue.push({ instance, depth: finalProjectorOptions.depth });\n scheduleRender(finalProjectorOptions);\n }\n };\n updateDom(node, node, finalProjectorOptions, parentVNode, instance, [], []);\n projectorState.afterRenderCallbacks.push(() => {\n instanceData.onAttach();\n });\n runDeferredRenderCallbacks(finalProjectorOptions);\n runAfterRenderCallbacks(finalProjectorOptions);\n return {\n domNode: finalProjectorOptions.rootNode\n };\n },\n create: function (instance, projectionOptions) {\n return this.append(document.createElement('div'), instance, projectionOptions);\n },\n merge: function (element, instance, projectionOptions = {}) {\n projectionOptions.merge = true;\n projectionOptions.mergeElement = element;\n const projection = this.append(element.parentNode, instance, projectionOptions);\n const projectorState = projectorStateMap.get(instance);\n projectorState.merge = false;\n return projection;\n }\n};\n//# sourceMappingURL=vdom.mjs.map" }, { "id": "./node_modules/imports-loader/index.js?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js", @@ -4870,7 +4887,7 @@ "name": "./node_modules/imports-loader?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js", "index": 1, "index2": 41, - "size": 282, + "size": 292, "cacheable": true, "built": true, "optional": false, @@ -4900,7 +4917,7 @@ "providedExports": null, "optimizationBailout": [], "depth": 1, - "source": "/*** IMPORTS FROM imports-loader ***/\nvar widgetFactory = require(\"src/menu-item/MenuItem\");\n\nvar registerCustomElement = require('@dojo/widget-core/registerCustomElement').default;\n\nvar defaultExport = widgetFactory.default;\ndefaultExport && registerCustomElement(defaultExport);\n\n" + "source": "/*** IMPORTS FROM imports-loader ***/\nvar widgetFactory = require(\"src/menu-item/MenuItem\");\n\nvar registerCustomElement = require('@dojo/framework/widget-core/registerCustomElement').default;\n\nvar defaultExport = widgetFactory.default;\ndefaultExport && registerCustomElement(defaultExport);\n\n" }, { "id": "./node_modules/process/browser.js", @@ -4917,21 +4934,21 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/has/has.mjs", - "issuerId": "./node_modules/@dojo/has/has.mjs", - "issuerName": "./node_modules/@dojo/has/has.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/has/has.mjs", + "issuerId": "./node_modules/@dojo/framework/has/has.mjs", + "issuerName": "./node_modules/@dojo/framework/has/has.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/has/has.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/has/has.mjs", - "module": "./node_modules/@dojo/has/has.mjs", - "moduleName": "./node_modules/@dojo/has/has.mjs", + "moduleId": "./node_modules/@dojo/framework/has/has.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/has/has.mjs", + "module": "./node_modules/@dojo/framework/has/has.mjs", + "moduleName": "./node_modules/@dojo/framework/has/has.mjs", "type": "cjs require", "userRequest": "process", - "loc": "1:0-37" + "loc": "1:0-40" } ], "usedExports": true, @@ -4955,18 +4972,18 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "tslib", "loc": "1:0-33" @@ -4981,19 +4998,19 @@ "loc": "1:0-33" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "tslib", "loc": "1:0-33" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "tslib", "loc": "1:0-33" @@ -5001,7 +5018,6 @@ ], "usedExports": [ "__decorate", - "__metadata", "__rest" ], "providedExports": [ @@ -5042,30 +5058,30 @@ "menu-item" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/global.mjs", - "issuerId": "./node_modules/@dojo/shim/global.mjs", - "issuerName": "./node_modules/@dojo/shim/global.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/global.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/global.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/global.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/global.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/global.mjs", - "module": "./node_modules/@dojo/shim/global.mjs", - "moduleName": "./node_modules/@dojo/shim/global.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/global.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/global.mjs", + "module": "./node_modules/@dojo/framework/shim/global.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/global.mjs", "type": "cjs require", "userRequest": "global", - "loc": "1:0-44" + "loc": "1:0-47" }, { - "moduleId": "./node_modules/@dojo/has/has.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/has/has.mjs", - "module": "./node_modules/@dojo/has/has.mjs", - "moduleName": "./node_modules/@dojo/has/has.mjs", + "moduleId": "./node_modules/@dojo/framework/has/has.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/has/has.mjs", + "module": "./node_modules/@dojo/framework/has/has.mjs", + "moduleName": "./node_modules/@dojo/framework/has/has.mjs", "type": "cjs require", "userRequest": "global", - "loc": "1:0-44" + "loc": "1:0-47" } ], "usedExports": true, @@ -5080,7 +5096,7 @@ "name": "./src/menu-item/MenuItem.ts", "index": 2, "index2": 40, - "size": 1095, + "size": 1135, "cacheable": true, "built": true, "optional": false, @@ -5113,7 +5129,7 @@ ], "optimizationBailout": [], "depth": 2, - "source": "import * as tslib_1 from \"tslib\";\nimport { v } from '@dojo/widget-core/d';\nimport { customElement } from '@dojo/widget-core/decorators/customElement';\nimport { theme, ThemedMixin } from '@dojo/widget-core/mixins/Themed';\nimport { WidgetBase } from '@dojo/widget-core/WidgetBase';\nimport * as css from './menuItem.m.css';\nlet MenuItem = class MenuItem extends ThemedMixin(WidgetBase) {\n _onClick() {\n this.properties.onSelected && this.properties.onSelected(this.properties.data);\n }\n render() {\n const { title, selected } = this.properties;\n return v('li', { classes: this.theme(css.root) }, [\n v('span', {\n classes: this.theme([css.item, selected ? css.selected : null]),\n onclick: this._onClick\n }, [title])\n ]);\n }\n};\nMenuItem = tslib_1.__decorate([\n customElement({\n tag: 'demo-menu-item',\n attributes: ['title', 'selected'],\n events: ['onSelected'],\n properties: ['data', 'selected']\n }),\n theme(css)\n], MenuItem);\nexport { MenuItem };\nexport default MenuItem;\n" + "source": "import * as tslib_1 from \"tslib\";\nimport { v } from '@dojo/framework/widget-core/d';\nimport { customElement } from '@dojo/framework/widget-core/decorators/customElement';\nimport { theme, ThemedMixin } from '@dojo/framework/widget-core/mixins/Themed';\nimport { WidgetBase } from '@dojo/framework/widget-core/WidgetBase';\nimport * as css from './menuItem.m.css';\nlet MenuItem = class MenuItem extends ThemedMixin(WidgetBase) {\n _onClick() {\n this.properties.onSelected && this.properties.onSelected(this.properties.data);\n }\n render() {\n const { title, selected } = this.properties;\n return v('li', { classes: this.theme(css.root) }, [\n v('span', {\n classes: this.theme([css.item, selected ? css.selected : null]),\n onclick: this._onClick\n }, [title])\n ]);\n }\n};\nMenuItem = tslib_1.__decorate([\n customElement({\n tag: 'demo-menu-item',\n attributes: ['title', 'selected'],\n events: ['onSelected'],\n properties: ['data', 'selected']\n }),\n theme(css)\n], MenuItem);\nexport { MenuItem };\nexport default MenuItem;\n" }, { "id": "./src/menu-item/menuItem.m.css", diff --git a/test-app/fixtures/unix/info/menu/report.html b/test-app/fixtures/unix/info/menu/report.html index af32108..40b3788 100644 --- a/test-app/fixtures/unix/info/menu/report.html +++ b/test-app/fixtures/unix/info/menu/report.html @@ -4,7 +4,7 @@ Webpack Bundle Analyzer diff --git a/test-app/fixtures/unix/info/menu/stats.json b/test-app/fixtures/unix/info/menu/stats.json index c93fcda..4b5fe1a 100644 --- a/test-app/fixtures/unix/info/menu/stats.json +++ b/test-app/fixtures/unix/info/menu/stats.json @@ -2,8 +2,8 @@ "errors": [], "warnings": [], "version": "3.8.1", - "hash": "90c6db1ff77aa21b0220", - "time": 7931, + "hash": "01c4fe13e2f1c25e9421", + "time": 4828, "publicPath": "", "assetsByChunkName": { "menu": [ @@ -16,7 +16,7 @@ "assets": [ { "name": "menu-1.0.0.js", - "size": 54024, + "size": 55200, "chunks": [ "menu" ], @@ -38,7 +38,7 @@ }, { "name": "menu-1.0.0.js.map", - "size": 267936, + "size": 269366, "chunks": [ "menu" ], @@ -80,7 +80,7 @@ "initial": true, "entry": true, "extraAsync": false, - "size": 192245, + "size": 192447, "names": [ "menu" ], @@ -90,16 +90,16 @@ "menu-1.0.0.js.map", "menu-1.0.0.css.map" ], - "hash": "2e07bb677691d23bdd61", + "hash": "9eda2e227ab609e28ae5", "parents": [], "modules": [ { - "id": "./node_modules/@dojo/core/Destroyable.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Destroyable.mjs", - "name": "./node_modules/@dojo/core/Destroyable.mjs", + "id": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Destroyable.mjs", + "name": "./node_modules/@dojo/framework/core/Destroyable.mjs", "index": 25, "index2": 17, - "size": 1668, + "size": 1665, "cacheable": true, "built": true, "optional": false, @@ -108,18 +108,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Evented.mjs", - "issuerId": "./node_modules/@dojo/core/Evented.mjs", - "issuerName": "./node_modules/@dojo/core/Evented.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Evented.mjs", + "issuerId": "./node_modules/@dojo/framework/core/Evented.mjs", + "issuerName": "./node_modules/@dojo/framework/core/Evented.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/core/Evented.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Evented.mjs", - "module": "./node_modules/@dojo/core/Evented.mjs", - "moduleName": "./node_modules/@dojo/core/Evented.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Evented.mjs", + "module": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Evented.mjs", "type": "harmony import", "userRequest": "./Destroyable", "loc": "2:0-44" @@ -134,15 +134,15 @@ ], "optimizationBailout": [], "depth": 6, - "source": "import { createCompositeHandle } from './lang';\nimport Promise from '@dojo/shim/Promise';\n/**\n * No operation function to replace own once instance is destoryed\n */\nfunction noop() {\n return Promise.resolve(false);\n}\n/**\n * No op function used to replace own, once instance has been destoryed\n */\nfunction destroyed() {\n throw new Error('Call made to destroyed method');\n}\nexport class Destroyable {\n /**\n * @constructor\n */\n constructor() {\n this.handles = [];\n }\n /**\n * Register handles for the instance that will be destroyed when `this.destroy` is called\n *\n * @param {Handle} handle The handle to add for the instance\n * @returns {Handle} a handle for the handle, removes the handle for the instance and calls destroy\n */\n own(handles) {\n const handle = Array.isArray(handles) ? createCompositeHandle(...handles) : handles;\n const { handles: _handles } = this;\n _handles.push(handle);\n return {\n destroy() {\n _handles.splice(_handles.indexOf(handle));\n handle.destroy();\n }\n };\n }\n /**\n * Destrpys all handers registered for the instance\n *\n * @returns {Promise {\n this.handles.forEach((handle) => {\n handle && handle.destroy && handle.destroy();\n });\n this.destroy = noop;\n this.own = destroyed;\n resolve(true);\n });\n }\n}\nexport default Destroyable;\n//# sourceMappingURL=Destroyable.mjs.map" + "source": "import { createCompositeHandle } from './lang';\nimport Promise from '../shim/Promise';\n/**\n * No operation function to replace own once instance is destoryed\n */\nfunction noop() {\n return Promise.resolve(false);\n}\n/**\n * No op function used to replace own, once instance has been destoryed\n */\nfunction destroyed() {\n throw new Error('Call made to destroyed method');\n}\nexport class Destroyable {\n /**\n * @constructor\n */\n constructor() {\n this.handles = [];\n }\n /**\n * Register handles for the instance that will be destroyed when `this.destroy` is called\n *\n * @param {Handle} handle The handle to add for the instance\n * @returns {Handle} a handle for the handle, removes the handle for the instance and calls destroy\n */\n own(handles) {\n const handle = Array.isArray(handles) ? createCompositeHandle(...handles) : handles;\n const { handles: _handles } = this;\n _handles.push(handle);\n return {\n destroy() {\n _handles.splice(_handles.indexOf(handle));\n handle.destroy();\n }\n };\n }\n /**\n * Destrpys all handers registered for the instance\n *\n * @returns {Promise {\n this.handles.forEach((handle) => {\n handle && handle.destroy && handle.destroy();\n });\n this.destroy = noop;\n this.own = destroyed;\n resolve(true);\n });\n }\n}\nexport default Destroyable;\n//# sourceMappingURL=Destroyable.mjs.map" }, { - "id": "./node_modules/@dojo/core/Evented.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Evented.mjs", - "name": "./node_modules/@dojo/core/Evented.mjs", + "id": "./node_modules/@dojo/framework/core/Evented.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Evented.mjs", + "name": "./node_modules/@dojo/framework/core/Evented.mjs", "index": 24, "index2": 18, - "size": 2149, + "size": 2151, "cacheable": true, "built": true, "optional": false, @@ -151,48 +151,48 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/NodeHandler.mjs", - "issuerId": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "issuerName": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/NodeHandler.mjs", - "module": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "1:0-45" + "userRequest": "../core/Evented", + "loc": "2:0-42" }, { - "moduleId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/RegistryHandler.mjs", - "module": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "2:0-45" + "userRequest": "../core/Evented", + "loc": "1:0-42" }, { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "4:0-45" + "userRequest": "../core/Evented", + "loc": "4:0-42" }, { - "moduleId": "./node_modules/@dojo/widget-core/Injector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Injector.mjs", - "module": "./node_modules/@dojo/widget-core/Injector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Injector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Injector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Injector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Injector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Injector.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "1:0-45" + "userRequest": "../core/Evented", + "loc": "1:0-42" } ], "usedExports": [ @@ -205,15 +205,15 @@ ], "optimizationBailout": [], "depth": 5, - "source": "import Map from '@dojo/shim/Map';\nimport { Destroyable } from './Destroyable';\n/**\n * Map of computed regular expressions, keyed by string\n */\nconst regexMap = new Map();\n/**\n * Determines is the event type glob has been matched\n *\n * @returns boolean that indicates if the glob is matched\n */\nexport function isGlobMatch(globString, targetString) {\n if (typeof targetString === 'string' && typeof globString === 'string' && globString.indexOf('*') !== -1) {\n let regex;\n if (regexMap.has(globString)) {\n regex = regexMap.get(globString);\n }\n else {\n regex = new RegExp(`^${globString.replace(/\\*/g, '.*')}$`);\n regexMap.set(globString, regex);\n }\n return regex.test(targetString);\n }\n else {\n return globString === targetString;\n }\n}\n/**\n * Event Class\n */\nexport class Evented extends Destroyable {\n constructor() {\n super(...arguments);\n /**\n * map of listeners keyed by event type\n */\n this.listenersMap = new Map();\n }\n emit(event) {\n this.listenersMap.forEach((methods, type) => {\n if (isGlobMatch(type, event.type)) {\n methods.forEach((method) => {\n method.call(this, event);\n });\n }\n });\n }\n on(type, listener) {\n if (Array.isArray(listener)) {\n const handles = listener.map((listener) => this._addListener(type, listener));\n return {\n destroy() {\n handles.forEach((handle) => handle.destroy());\n }\n };\n }\n return this._addListener(type, listener);\n }\n _addListener(type, listener) {\n const listeners = this.listenersMap.get(type) || [];\n listeners.push(listener);\n this.listenersMap.set(type, listeners);\n return {\n destroy: () => {\n const listeners = this.listenersMap.get(type) || [];\n listeners.splice(listeners.indexOf(listener), 1);\n }\n };\n }\n}\nexport default Evented;\n//# sourceMappingURL=Evented.mjs.map" + "source": "import Map from '../shim/Map';\nimport { Destroyable } from './Destroyable';\n/**\n * Map of computed regular expressions, keyed by string\n */\nconst regexMap = new Map();\n/**\n * Determines is the event type glob has been matched\n *\n * @returns boolean that indicates if the glob is matched\n */\nexport function isGlobMatch(globString, targetString) {\n if (typeof targetString === 'string' && typeof globString === 'string' && globString.indexOf('*') !== -1) {\n let regex;\n if (regexMap.has(globString)) {\n regex = regexMap.get(globString);\n }\n else {\n regex = new RegExp(`^${globString.replace(/\\*/g, '.*')}$`);\n regexMap.set(globString, regex);\n }\n return regex.test(targetString);\n }\n else {\n return globString === targetString;\n }\n}\n/**\n * Event Class\n */\nexport class Evented extends Destroyable {\n constructor() {\n super(...arguments);\n /**\n * map of listeners keyed by event type\n */\n this.listenersMap = new Map();\n }\n emit(event) {\n this.listenersMap.forEach((methods, type) => {\n if (isGlobMatch(type, event.type)) {\n [...methods].forEach((method) => {\n method.call(this, event);\n });\n }\n });\n }\n on(type, listener) {\n if (Array.isArray(listener)) {\n const handles = listener.map((listener) => this._addListener(type, listener));\n return {\n destroy() {\n handles.forEach((handle) => handle.destroy());\n }\n };\n }\n return this._addListener(type, listener);\n }\n _addListener(type, listener) {\n const listeners = this.listenersMap.get(type) || [];\n listeners.push(listener);\n this.listenersMap.set(type, listeners);\n return {\n destroy: () => {\n const listeners = this.listenersMap.get(type) || [];\n listeners.splice(listeners.indexOf(listener), 1);\n }\n };\n }\n}\nexport default Evented;\n//# sourceMappingURL=Evented.mjs.map" }, { - "id": "./node_modules/@dojo/core/lang.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/lang.mjs", - "name": "./node_modules/@dojo/core/lang.mjs", + "id": "./node_modules/@dojo/framework/core/lang.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/lang.mjs", + "name": "./node_modules/@dojo/framework/core/lang.mjs", "index": 26, "index2": 16, - "size": 6843, + "size": 6837, "cacheable": true, "built": true, "optional": false, @@ -222,27 +222,27 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", - "userRequest": "@dojo/core/lang", + "userRequest": "../../core/lang", "loc": "2:0-41" }, { - "moduleId": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Destroyable.mjs", - "module": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleName": "./node_modules/@dojo/core/Destroyable.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Destroyable.mjs", + "module": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Destroyable.mjs", "type": "harmony import", "userRequest": "./lang", "loc": "1:0-47" @@ -267,12 +267,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { assign } from '@dojo/shim/object';\nexport { assign } from '@dojo/shim/object';\nconst slice = Array.prototype.slice;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Type guard that ensures that the value can be coerced to Object\n * to weed out host objects that do not derive from Object.\n * This function is used to check if we want to deep copy an object or not.\n * Note: In ES6 it is possible to modify an object's Symbol.toStringTag property, which will\n * change the value returned by `toString`. This is a rare edge case that is difficult to handle,\n * so it is not handled here.\n * @param value The value to check\n * @return If the value is coercible into an Object\n */\nfunction shouldDeepCopyObject(value) {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\nfunction copyArray(array, inherited) {\n return array.map(function (item) {\n if (Array.isArray(item)) {\n return copyArray(item, inherited);\n }\n return !shouldDeepCopyObject(item)\n ? item\n : _mixin({\n deep: true,\n inherited: inherited,\n sources: [item],\n target: {}\n });\n });\n}\nfunction _mixin(kwArgs) {\n const deep = kwArgs.deep;\n const inherited = kwArgs.inherited;\n const target = kwArgs.target;\n const copied = kwArgs.copied || [];\n const copiedClone = [...copied];\n for (let i = 0; i < kwArgs.sources.length; i++) {\n const source = kwArgs.sources[i];\n if (source === null || source === undefined) {\n continue;\n }\n for (let key in source) {\n if (inherited || hasOwnProperty.call(source, key)) {\n let value = source[key];\n if (copiedClone.indexOf(value) !== -1) {\n continue;\n }\n if (deep) {\n if (Array.isArray(value)) {\n value = copyArray(value, inherited);\n }\n else if (shouldDeepCopyObject(value)) {\n const targetValue = target[key] || {};\n copied.push(source);\n value = _mixin({\n deep: true,\n inherited: inherited,\n sources: [value],\n target: targetValue,\n copied\n });\n }\n }\n target[key] = value;\n }\n }\n }\n return target;\n}\nexport function create(prototype, ...mixins) {\n if (!mixins.length) {\n throw new RangeError('lang.create requires at least one mixin object.');\n }\n const args = mixins.slice();\n args.unshift(Object.create(prototype));\n return assign.apply(null, args);\n}\nexport function deepAssign(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: false,\n sources: sources,\n target: target\n });\n}\nexport function deepMixin(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Creates a new object using the provided source's prototype as the prototype for the new object, and then\n * deep copies the provided source's values into the new target.\n *\n * @param source The object to duplicate\n * @return The new object\n */\nexport function duplicate(source) {\n const target = Object.create(Object.getPrototypeOf(source));\n return deepMixin(target, source);\n}\n/**\n * Determines whether two values are the same value.\n *\n * @param a First value to compare\n * @param b Second value to compare\n * @return true if the values are the same; false otherwise\n */\nexport function isIdentical(a, b) {\n return (a === b ||\n /* both values are NaN */\n (a !== a && b !== b));\n}\n/**\n * Returns a function that binds a method to the specified object at runtime. This is similar to\n * `Function.prototype.bind`, but instead of a function it takes the name of a method on an object.\n * As a result, the function returned by `lateBind` will always call the function currently assigned to\n * the specified property on the object as of the moment the function it returns is called.\n *\n * @param instance The context object\n * @param method The name of the method on the context object to bind to itself\n * @param suppliedArgs An optional array of values to prepend to the `instance[method]` arguments list\n * @return The bound function\n */\nexport function lateBind(instance, method, ...suppliedArgs) {\n return suppliedArgs.length\n ? function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n // TS7017\n return instance[method].apply(instance, args);\n }\n : function () {\n // TS7017\n return instance[method].apply(instance, arguments);\n };\n}\nexport function mixin(target, ...sources) {\n return _mixin({\n deep: false,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Returns a function which invokes the given function with the given arguments prepended to its argument list.\n * Like `Function.prototype.bind`, but does not alter execution context.\n *\n * @param targetFunction The function that needs to be bound\n * @param suppliedArgs An optional array of arguments to prepend to the `targetFunction` arguments list\n * @return The bound function\n */\nexport function partial(targetFunction, ...suppliedArgs) {\n return function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n return targetFunction.apply(this, args);\n };\n}\n/**\n * Returns an object with a destroy method that, when called, calls the passed-in destructor.\n * This is intended to provide a unified interface for creating \"remove\" / \"destroy\" handlers for\n * event listeners, timers, etc.\n *\n * @param destructor A function that will be called when the handle's `destroy` method is invoked\n * @return The handle object\n */\nexport function createHandle(destructor) {\n let called = false;\n return {\n destroy: function () {\n if (!called) {\n called = true;\n destructor();\n }\n }\n };\n}\n/**\n * Returns a single handle that can be used to destroy multiple handles simultaneously.\n *\n * @param handles An array of handles with `destroy` methods\n * @return The handle object\n */\nexport function createCompositeHandle(...handles) {\n return createHandle(function () {\n for (let i = 0; i < handles.length; i++) {\n handles[i].destroy();\n }\n });\n}\n//# sourceMappingURL=lang.mjs.map" + "source": "import { assign } from '../shim/object';\nexport { assign } from '../shim/object';\nconst slice = Array.prototype.slice;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Type guard that ensures that the value can be coerced to Object\n * to weed out host objects that do not derive from Object.\n * This function is used to check if we want to deep copy an object or not.\n * Note: In ES6 it is possible to modify an object's Symbol.toStringTag property, which will\n * change the value returned by `toString`. This is a rare edge case that is difficult to handle,\n * so it is not handled here.\n * @param value The value to check\n * @return If the value is coercible into an Object\n */\nfunction shouldDeepCopyObject(value) {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\nfunction copyArray(array, inherited) {\n return array.map(function (item) {\n if (Array.isArray(item)) {\n return copyArray(item, inherited);\n }\n return !shouldDeepCopyObject(item)\n ? item\n : _mixin({\n deep: true,\n inherited: inherited,\n sources: [item],\n target: {}\n });\n });\n}\nfunction _mixin(kwArgs) {\n const deep = kwArgs.deep;\n const inherited = kwArgs.inherited;\n const target = kwArgs.target;\n const copied = kwArgs.copied || [];\n const copiedClone = [...copied];\n for (let i = 0; i < kwArgs.sources.length; i++) {\n const source = kwArgs.sources[i];\n if (source === null || source === undefined) {\n continue;\n }\n for (let key in source) {\n if (inherited || hasOwnProperty.call(source, key)) {\n let value = source[key];\n if (copiedClone.indexOf(value) !== -1) {\n continue;\n }\n if (deep) {\n if (Array.isArray(value)) {\n value = copyArray(value, inherited);\n }\n else if (shouldDeepCopyObject(value)) {\n const targetValue = target[key] || {};\n copied.push(source);\n value = _mixin({\n deep: true,\n inherited: inherited,\n sources: [value],\n target: targetValue,\n copied\n });\n }\n }\n target[key] = value;\n }\n }\n }\n return target;\n}\nexport function create(prototype, ...mixins) {\n if (!mixins.length) {\n throw new RangeError('lang.create requires at least one mixin object.');\n }\n const args = mixins.slice();\n args.unshift(Object.create(prototype));\n return assign.apply(null, args);\n}\nexport function deepAssign(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: false,\n sources: sources,\n target: target\n });\n}\nexport function deepMixin(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Creates a new object using the provided source's prototype as the prototype for the new object, and then\n * deep copies the provided source's values into the new target.\n *\n * @param source The object to duplicate\n * @return The new object\n */\nexport function duplicate(source) {\n const target = Object.create(Object.getPrototypeOf(source));\n return deepMixin(target, source);\n}\n/**\n * Determines whether two values are the same value.\n *\n * @param a First value to compare\n * @param b Second value to compare\n * @return true if the values are the same; false otherwise\n */\nexport function isIdentical(a, b) {\n return (a === b ||\n /* both values are NaN */\n (a !== a && b !== b));\n}\n/**\n * Returns a function that binds a method to the specified object at runtime. This is similar to\n * `Function.prototype.bind`, but instead of a function it takes the name of a method on an object.\n * As a result, the function returned by `lateBind` will always call the function currently assigned to\n * the specified property on the object as of the moment the function it returns is called.\n *\n * @param instance The context object\n * @param method The name of the method on the context object to bind to itself\n * @param suppliedArgs An optional array of values to prepend to the `instance[method]` arguments list\n * @return The bound function\n */\nexport function lateBind(instance, method, ...suppliedArgs) {\n return suppliedArgs.length\n ? function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n // TS7017\n return instance[method].apply(instance, args);\n }\n : function () {\n // TS7017\n return instance[method].apply(instance, arguments);\n };\n}\nexport function mixin(target, ...sources) {\n return _mixin({\n deep: false,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Returns a function which invokes the given function with the given arguments prepended to its argument list.\n * Like `Function.prototype.bind`, but does not alter execution context.\n *\n * @param targetFunction The function that needs to be bound\n * @param suppliedArgs An optional array of arguments to prepend to the `targetFunction` arguments list\n * @return The bound function\n */\nexport function partial(targetFunction, ...suppliedArgs) {\n return function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n return targetFunction.apply(this, args);\n };\n}\n/**\n * Returns an object with a destroy method that, when called, calls the passed-in destructor.\n * This is intended to provide a unified interface for creating \"remove\" / \"destroy\" handlers for\n * event listeners, timers, etc.\n *\n * @param destructor A function that will be called when the handle's `destroy` method is invoked\n * @return The handle object\n */\nexport function createHandle(destructor) {\n let called = false;\n return {\n destroy: function () {\n if (!called) {\n called = true;\n destructor();\n }\n }\n };\n}\n/**\n * Returns a single handle that can be used to destroy multiple handles simultaneously.\n *\n * @param handles An array of handles with `destroy` methods\n * @return The handle object\n */\nexport function createCompositeHandle(...handles) {\n return createHandle(function () {\n for (let i = 0; i < handles.length; i++) {\n handles[i].destroy();\n }\n });\n}\n//# sourceMappingURL=lang.mjs.map" }, { - "id": "./node_modules/@dojo/has/has.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/has/has.mjs", - "name": "./node_modules/@dojo/has/has.mjs", + "id": "./node_modules/@dojo/framework/has/has.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/has/has.mjs", + "name": "./node_modules/@dojo/framework/has/has.mjs", "index": 7, "index2": 3, "size": 6305, @@ -284,29 +284,29 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/has.mjs", - "issuerId": "./node_modules/@dojo/shim/support/has.mjs", - "issuerName": "./node_modules/@dojo/shim/support/has.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/has.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/support/has.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/support/has.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/has.mjs", - "module": "./node_modules/@dojo/shim/support/has.mjs", - "moduleName": "./node_modules/@dojo/shim/support/has.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/has.mjs", + "module": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/has.mjs", "type": "harmony import", - "userRequest": "@dojo/has/has", + "userRequest": "../../has/has", "loc": "1:0-41" }, { - "moduleId": "./node_modules/@dojo/shim/support/has.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/has.mjs", - "module": "./node_modules/@dojo/shim/support/has.mjs", - "moduleName": "./node_modules/@dojo/shim/support/has.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/has.mjs", + "module": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/has.mjs", "type": "harmony import", - "userRequest": "@dojo/has/has", + "userRequest": "../../has/has", "loc": "4:0-30" } ], @@ -328,9 +328,9 @@ "source": "function isFeatureTestThenable(value) {\n return value && value.then;\n}\n/**\n * A cache of results of feature tests\n */\nexport const testCache = {};\n/**\n * A cache of the un-resolved feature tests\n */\nexport const testFunctions = {};\n/**\n * A cache of unresolved thenables (probably promises)\n * @type {{}}\n */\nconst testThenables = {};\n/**\n * A reference to the global scope (`window` in a browser, `global` in NodeJS)\n */\nconst globalScope = (function () {\n /* istanbul ignore else */\n if (typeof window !== 'undefined') {\n // Browsers\n return window;\n }\n else if (typeof global !== 'undefined') {\n // Node\n return global;\n }\n else if (typeof self !== 'undefined') {\n // Web workers\n return self;\n }\n /* istanbul ignore next */\n return {};\n})();\n/* Grab the staticFeatures if there are available */\nconst { staticFeatures } = globalScope.DojoHasEnvironment || {};\n/* Cleaning up the DojoHasEnviornment */\nif ('DojoHasEnvironment' in globalScope) {\n delete globalScope.DojoHasEnvironment;\n}\n/**\n * Custom type guard to narrow the `staticFeatures` to either a map or a function that\n * returns a map.\n *\n * @param value The value to guard for\n */\nfunction isStaticFeatureFunction(value) {\n return typeof value === 'function';\n}\n/**\n * The cache of asserted features that were available in the global scope when the\n * module loaded\n */\nconst staticCache = staticFeatures\n ? isStaticFeatureFunction(staticFeatures) ? staticFeatures.apply(globalScope) : staticFeatures\n : {}; /* Providing an empty cache, if none was in the environment\n\n/**\n* AMD plugin function.\n*\n* Conditional loads modules based on a has feature test value.\n*\n* @param resourceId Gives the resolved module id to load.\n* @param require The loader require function with respect to the module that contained the plugin resource in its\n* dependency list.\n* @param load Callback to loader that consumes result of plugin demand.\n*/\nexport function load(resourceId, require, load, config) {\n resourceId ? require([resourceId], load) : load();\n}\n/**\n * AMD plugin function.\n *\n * Resolves resourceId into a module id based on possibly-nested tenary expression that branches on has feature test\n * value(s).\n *\n * @param resourceId The id of the module\n * @param normalize Resolves a relative module id into an absolute module id\n */\nexport function normalize(resourceId, normalize) {\n const tokens = resourceId.match(/[\\?:]|[^:\\?]*/g) || [];\n let i = 0;\n function get(skip) {\n const term = tokens[i++];\n if (term === ':') {\n // empty string module name, resolves to null\n return null;\n }\n else {\n // postfixed with a ? means it is a feature to branch on, the term is the name of the feature\n if (tokens[i++] === '?') {\n if (!skip && has(term)) {\n // matched the feature, get the first value from the options\n return get();\n }\n else {\n // did not match, get the second value, passing over the first\n get(true);\n return get(skip);\n }\n }\n // a module\n return term;\n }\n }\n const id = get();\n return id && normalize(id);\n}\n/**\n * Check if a feature has already been registered\n *\n * @param feature the name of the feature\n */\nexport function exists(feature) {\n const normalizedFeature = feature.toLowerCase();\n return Boolean(normalizedFeature in staticCache || normalizedFeature in testCache || testFunctions[normalizedFeature]);\n}\n/**\n * Register a new test for a named feature.\n *\n * @example\n * has.add('dom-addeventlistener', !!document.addEventListener);\n *\n * @example\n * has.add('touch-events', function () {\n * return 'ontouchstart' in document\n * });\n *\n * @param feature the name of the feature\n * @param value the value reported of the feature, or a function that will be executed once on first test\n * @param overwrite if an existing value should be overwritten. Defaults to false.\n */\nexport function add(feature, value, overwrite = false) {\n const normalizedFeature = feature.toLowerCase();\n if (exists(normalizedFeature) && !overwrite && !(normalizedFeature in staticCache)) {\n throw new TypeError(`Feature \"${feature}\" exists and overwrite not true.`);\n }\n if (typeof value === 'function') {\n testFunctions[normalizedFeature] = value;\n }\n else if (isFeatureTestThenable(value)) {\n testThenables[feature] = value.then((resolvedValue) => {\n testCache[feature] = resolvedValue;\n delete testThenables[feature];\n }, () => {\n delete testThenables[feature];\n });\n }\n else {\n testCache[normalizedFeature] = value;\n delete testFunctions[normalizedFeature];\n }\n}\n/**\n * Return the current value of a named feature.\n *\n * @param feature The name (if a string) or identifier (if an integer) of the feature to test.\n */\nexport default function has(feature) {\n let result;\n const normalizedFeature = feature.toLowerCase();\n if (normalizedFeature in staticCache) {\n result = staticCache[normalizedFeature];\n }\n else if (testFunctions[normalizedFeature]) {\n result = testCache[normalizedFeature] = testFunctions[normalizedFeature].call(null);\n delete testFunctions[normalizedFeature];\n }\n else if (normalizedFeature in testCache) {\n result = testCache[normalizedFeature];\n }\n else if (feature in testThenables) {\n return false;\n }\n else {\n throw new TypeError(`Attempt to detect unregistered has feature \"${feature}\"`);\n }\n return result;\n}\n/*\n * Out of the box feature tests\n */\n/* Environments */\n/* Used as a value to provide a debug only code path */\nadd('debug', true);\n/* Detects if the environment is \"browser like\" */\nadd('host-browser', typeof document !== 'undefined' && typeof location !== 'undefined');\n/* Detects if the environment appears to be NodeJS */\nadd('host-node', function () {\n if (typeof process === 'object' && process.versions && process.versions.node) {\n return process.versions.node;\n }\n});\n//# sourceMappingURL=has.mjs.map" }, { - "id": "./node_modules/@dojo/shim/Map.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "name": "./node_modules/@dojo/shim/Map.mjs", + "id": "./node_modules/@dojo/framework/shim/Map.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "name": "./node_modules/@dojo/framework/shim/Map.mjs", "index": 15, "index2": 12, "size": 3331, @@ -342,57 +342,57 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "1:0-33" + "userRequest": "../shim/Map", + "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/NodeHandler.mjs", - "module": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "2:0-33" + "userRequest": "../shim/Map", + "loc": "1:0-34" }, { - "moduleId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/RegistryHandler.mjs", - "module": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "1:0-37" + "userRequest": "../shim/Map", + "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "2:0-33" + "userRequest": "../shim/Map", + "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/core/Evented.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Evented.mjs", - "module": "./node_modules/@dojo/core/Evented.mjs", - "moduleName": "./node_modules/@dojo/core/Evented.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Evented.mjs", + "module": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Evented.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "1:0-33" + "userRequest": "../shim/Map", + "loc": "1:0-30" } ], "usedExports": [ @@ -408,9 +408,9 @@ "source": "import { isArrayLike, ShimIterator } from './iterator';\nimport global from './global';\nimport { is as objectIs } from './object';\nimport has from './support/has';\nimport './Symbol';\nexport let Map = global.Map;\nif (!true) {\n Map = (_a = class Map {\n constructor(iterable) {\n this._keys = [];\n this._values = [];\n this[Symbol.toStringTag] = 'Map';\n if (iterable) {\n if (isArrayLike(iterable)) {\n for (let i = 0; i < iterable.length; i++) {\n const value = iterable[i];\n this.set(value[0], value[1]);\n }\n }\n else {\n for (const value of iterable) {\n this.set(value[0], value[1]);\n }\n }\n }\n }\n /**\n * An alternative to Array.prototype.indexOf using Object.is\n * to check for equality. See http://mzl.la/1zuKO2V\n */\n _indexOfKey(keys, key) {\n for (let i = 0, length = keys.length; i < length; i++) {\n if (objectIs(keys[i], key)) {\n return i;\n }\n }\n return -1;\n }\n get size() {\n return this._keys.length;\n }\n clear() {\n this._keys.length = this._values.length = 0;\n }\n delete(key) {\n const index = this._indexOfKey(this._keys, key);\n if (index < 0) {\n return false;\n }\n this._keys.splice(index, 1);\n this._values.splice(index, 1);\n return true;\n }\n entries() {\n const values = this._keys.map((key, i) => {\n return [key, this._values[i]];\n });\n return new ShimIterator(values);\n }\n forEach(callback, context) {\n const keys = this._keys;\n const values = this._values;\n for (let i = 0, length = keys.length; i < length; i++) {\n callback.call(context, values[i], keys[i], this);\n }\n }\n get(key) {\n const index = this._indexOfKey(this._keys, key);\n return index < 0 ? undefined : this._values[index];\n }\n has(key) {\n return this._indexOfKey(this._keys, key) > -1;\n }\n keys() {\n return new ShimIterator(this._keys);\n }\n set(key, value) {\n let index = this._indexOfKey(this._keys, key);\n index = index < 0 ? this._keys.length : index;\n this._keys[index] = key;\n this._values[index] = value;\n return this;\n }\n values() {\n return new ShimIterator(this._values);\n }\n [Symbol.iterator]() {\n return this.entries();\n }\n },\n _a[Symbol.species] = _a,\n _a);\n}\nexport default Map;\nvar _a;\n//# sourceMappingURL=Map.mjs.map" }, { - "id": "./node_modules/@dojo/shim/Promise.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Promise.mjs", - "name": "./node_modules/@dojo/shim/Promise.mjs", + "id": "./node_modules/@dojo/framework/shim/Promise.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Promise.mjs", + "name": "./node_modules/@dojo/framework/shim/Promise.mjs", "index": 22, "index2": 15, "size": 8519, @@ -422,30 +422,30 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Registry.mjs", - "issuerId": "./node_modules/@dojo/widget-core/Registry.mjs", - "issuerName": "./node_modules/@dojo/widget-core/Registry.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Registry.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Promise", - "loc": "1:0-41" + "userRequest": "../shim/Promise", + "loc": "1:0-38" }, { - "moduleId": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Destroyable.mjs", - "module": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleName": "./node_modules/@dojo/core/Destroyable.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Destroyable.mjs", + "module": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Destroyable.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Promise", - "loc": "2:0-41" + "userRequest": "../shim/Promise", + "loc": "2:0-38" } ], "usedExports": [ @@ -461,9 +461,9 @@ "source": "import global from './global';\nimport { queueMicroTask } from './support/queue';\nimport './Symbol';\nimport has from './support/has';\nexport let ShimPromise = global.Promise;\nexport const isThenable = function isThenable(value) {\n return value && typeof value.then === 'function';\n};\nif (!true) {\n global.Promise = ShimPromise = (_a = class Promise {\n /**\n * Creates a new Promise.\n *\n * @constructor\n *\n * @param executor\n * The executor function is called immediately when the Promise is instantiated. It is responsible for\n * starting the asynchronous operation when it is invoked.\n *\n * The executor must call either the passed `resolve` function when the asynchronous operation has completed\n * successfully, or the `reject` function when the operation fails.\n */\n constructor(executor) {\n /**\n * The current state of this promise.\n */\n this.state = 1 /* Pending */;\n this[Symbol.toStringTag] = 'Promise';\n /**\n * If true, the resolution of this promise is chained (\"locked in\") to another promise.\n */\n let isChained = false;\n /**\n * Whether or not this promise is in a resolved state.\n */\n const isResolved = () => {\n return this.state !== 1 /* Pending */ || isChained;\n };\n /**\n * Callbacks that should be invoked once the asynchronous operation has completed.\n */\n let callbacks = [];\n /**\n * Initially pushes callbacks onto a queue for execution once this promise settles. After the promise settles,\n * enqueues callbacks for execution on the next event loop turn.\n */\n let whenFinished = function (callback) {\n if (callbacks) {\n callbacks.push(callback);\n }\n };\n /**\n * Settles this promise.\n *\n * @param newState The resolved state for this promise.\n * @param {T|any} value The resolved value for this promise.\n */\n const settle = (newState, value) => {\n // A promise can only be settled once.\n if (this.state !== 1 /* Pending */) {\n return;\n }\n this.state = newState;\n this.resolvedValue = value;\n whenFinished = queueMicroTask;\n // Only enqueue a callback runner if there are callbacks so that initially fulfilled Promises don't have to\n // wait an extra turn.\n if (callbacks && callbacks.length > 0) {\n queueMicroTask(function () {\n if (callbacks) {\n let count = callbacks.length;\n for (let i = 0; i < count; ++i) {\n callbacks[i].call(null);\n }\n callbacks = null;\n }\n });\n }\n };\n /**\n * Resolves this promise.\n *\n * @param newState The resolved state for this promise.\n * @param {T|any} value The resolved value for this promise.\n */\n const resolve = (newState, value) => {\n if (isResolved()) {\n return;\n }\n if (isThenable(value)) {\n value.then(settle.bind(null, 0 /* Fulfilled */), settle.bind(null, 2 /* Rejected */));\n isChained = true;\n }\n else {\n settle(newState, value);\n }\n };\n this.then = (onFulfilled, onRejected) => {\n return new Promise((resolve, reject) => {\n // whenFinished initially queues up callbacks for execution after the promise has settled. Once the\n // promise has settled, whenFinished will schedule callbacks for execution on the next turn through the\n // event loop.\n whenFinished(() => {\n const callback = this.state === 2 /* Rejected */ ? onRejected : onFulfilled;\n if (typeof callback === 'function') {\n try {\n resolve(callback(this.resolvedValue));\n }\n catch (error) {\n reject(error);\n }\n }\n else if (this.state === 2 /* Rejected */) {\n reject(this.resolvedValue);\n }\n else {\n resolve(this.resolvedValue);\n }\n });\n });\n };\n try {\n executor(resolve.bind(null, 0 /* Fulfilled */), resolve.bind(null, 2 /* Rejected */));\n }\n catch (error) {\n settle(2 /* Rejected */, error);\n }\n }\n static all(iterable) {\n return new this(function (resolve, reject) {\n const values = [];\n let complete = 0;\n let total = 0;\n let populating = true;\n function fulfill(index, value) {\n values[index] = value;\n ++complete;\n finish();\n }\n function finish() {\n if (populating || complete < total) {\n return;\n }\n resolve(values);\n }\n function processItem(index, item) {\n ++total;\n if (isThenable(item)) {\n // If an item Promise rejects, this Promise is immediately rejected with the item\n // Promise's rejection error.\n item.then(fulfill.bind(null, index), reject);\n }\n else {\n Promise.resolve(item).then(fulfill.bind(null, index));\n }\n }\n let i = 0;\n for (const value of iterable) {\n processItem(i, value);\n i++;\n }\n populating = false;\n finish();\n });\n }\n static race(iterable) {\n return new this(function (resolve, reject) {\n for (const item of iterable) {\n if (item instanceof Promise) {\n // If a Promise item rejects, this Promise is immediately rejected with the item\n // Promise's rejection error.\n item.then(resolve, reject);\n }\n else {\n Promise.resolve(item).then(resolve);\n }\n }\n });\n }\n static reject(reason) {\n return new this(function (resolve, reject) {\n reject(reason);\n });\n }\n static resolve(value) {\n return new this(function (resolve) {\n resolve(value);\n });\n }\n catch(onRejected) {\n return this.then(undefined, onRejected);\n }\n },\n _a[Symbol.species] = ShimPromise,\n _a);\n}\nexport default ShimPromise;\nvar _a;\n//# sourceMappingURL=Promise.mjs.map" }, { - "id": "./node_modules/@dojo/shim/Symbol.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Symbol.mjs", - "name": "./node_modules/@dojo/shim/Symbol.mjs", + "id": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Symbol.mjs", + "name": "./node_modules/@dojo/framework/shim/Symbol.mjs", "index": 5, "index2": 7, "size": 5929, @@ -475,81 +475,81 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "type": "harmony import", - "userRequest": "@dojo/shim/Symbol", - "loc": "3:0-39" - }, - { - "moduleId": "./node_modules/@dojo/widget-core/d.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/d.mjs", - "module": "./node_modules/@dojo/widget-core/d.mjs", - "moduleName": "./node_modules/@dojo/widget-core/d.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Symbol", - "loc": "1:0-39" + "userRequest": "../shim/Symbol", + "loc": "3:0-36" }, { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/d.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/d.mjs", + "module": "./node_modules/@dojo/framework/widget-core/d.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/d.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Symbol", - "loc": "3:0-39" + "userRequest": "../shim/Symbol", + "loc": "1:0-36" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "5:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "4:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/iterator.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/iterator.mjs", - "module": "./node_modules/@dojo/shim/iterator.mjs", - "moduleName": "./node_modules/@dojo/shim/iterator.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "type": "harmony import", + "userRequest": "../shim/Symbol", + "loc": "3:0-36" + }, + { + "moduleId": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/iterator.mjs", + "module": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/iterator.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "1:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/object.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/object.mjs", - "module": "./node_modules/@dojo/shim/object.mjs", - "moduleName": "./node_modules/@dojo/shim/object.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/object.mjs", + "module": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/object.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "3:0-36" }, { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "3:0-18" @@ -568,9 +568,9 @@ "source": "import has from './support/has';\nimport global from './global';\nimport { getValueDescriptor } from './support/util';\nexport let Symbol = global.Symbol;\nif (!true) {\n /**\n * Throws if the value is not a symbol, used internally within the Shim\n * @param {any} value The value to check\n * @return {symbol} Returns the symbol or throws\n */\n const validateSymbol = function validateSymbol(value) {\n if (!isSymbol(value)) {\n throw new TypeError(value + ' is not a symbol');\n }\n return value;\n };\n const defineProperties = Object.defineProperties;\n const defineProperty = Object.defineProperty;\n const create = Object.create;\n const objPrototype = Object.prototype;\n const globalSymbols = {};\n const getSymbolName = (function () {\n const created = create(null);\n return function (desc) {\n let postfix = 0;\n let name;\n while (created[String(desc) + (postfix || '')]) {\n ++postfix;\n }\n desc += String(postfix || '');\n created[desc] = true;\n name = '@@' + desc;\n // FIXME: Temporary guard until the duplicate execution when testing can be\n // pinned down.\n if (!Object.getOwnPropertyDescriptor(objPrototype, name)) {\n defineProperty(objPrototype, name, {\n set: function (value) {\n defineProperty(this, name, getValueDescriptor(value));\n }\n });\n }\n return name;\n };\n })();\n const InternalSymbol = function Symbol(description) {\n if (this instanceof InternalSymbol) {\n throw new TypeError('TypeError: Symbol is not a constructor');\n }\n return Symbol(description);\n };\n Symbol = global.Symbol = function Symbol(description) {\n if (this instanceof Symbol) {\n throw new TypeError('TypeError: Symbol is not a constructor');\n }\n const sym = Object.create(InternalSymbol.prototype);\n description = description === undefined ? '' : String(description);\n return defineProperties(sym, {\n __description__: getValueDescriptor(description),\n __name__: getValueDescriptor(getSymbolName(description))\n });\n };\n /* Decorate the Symbol function with the appropriate properties */\n defineProperty(Symbol, 'for', getValueDescriptor(function (key) {\n if (globalSymbols[key]) {\n return globalSymbols[key];\n }\n return (globalSymbols[key] = Symbol(String(key)));\n }));\n defineProperties(Symbol, {\n keyFor: getValueDescriptor(function (sym) {\n let key;\n validateSymbol(sym);\n for (key in globalSymbols) {\n if (globalSymbols[key] === sym) {\n return key;\n }\n }\n }),\n hasInstance: getValueDescriptor(Symbol.for('hasInstance'), false, false),\n isConcatSpreadable: getValueDescriptor(Symbol.for('isConcatSpreadable'), false, false),\n iterator: getValueDescriptor(Symbol.for('iterator'), false, false),\n match: getValueDescriptor(Symbol.for('match'), false, false),\n observable: getValueDescriptor(Symbol.for('observable'), false, false),\n replace: getValueDescriptor(Symbol.for('replace'), false, false),\n search: getValueDescriptor(Symbol.for('search'), false, false),\n species: getValueDescriptor(Symbol.for('species'), false, false),\n split: getValueDescriptor(Symbol.for('split'), false, false),\n toPrimitive: getValueDescriptor(Symbol.for('toPrimitive'), false, false),\n toStringTag: getValueDescriptor(Symbol.for('toStringTag'), false, false),\n unscopables: getValueDescriptor(Symbol.for('unscopables'), false, false)\n });\n /* Decorate the InternalSymbol object */\n defineProperties(InternalSymbol.prototype, {\n constructor: getValueDescriptor(Symbol),\n toString: getValueDescriptor(function () {\n return this.__name__;\n }, false, false)\n });\n /* Decorate the Symbol.prototype */\n defineProperties(Symbol.prototype, {\n toString: getValueDescriptor(function () {\n return 'Symbol (' + validateSymbol(this).__description__ + ')';\n }),\n valueOf: getValueDescriptor(function () {\n return validateSymbol(this);\n })\n });\n defineProperty(Symbol.prototype, Symbol.toPrimitive, getValueDescriptor(function () {\n return validateSymbol(this);\n }));\n defineProperty(Symbol.prototype, Symbol.toStringTag, getValueDescriptor('Symbol', false, false, true));\n defineProperty(InternalSymbol.prototype, Symbol.toPrimitive, getValueDescriptor(Symbol.prototype[Symbol.toPrimitive], false, false, true));\n defineProperty(InternalSymbol.prototype, Symbol.toStringTag, getValueDescriptor(Symbol.prototype[Symbol.toStringTag], false, false, true));\n}\n/**\n * A custom guard function that determines if an object is a symbol or not\n * @param {any} value The value to check to see if it is a symbol or not\n * @return {is symbol} Returns true if a symbol or not (and narrows the type guard)\n */\nexport function isSymbol(value) {\n return (value && (typeof value === 'symbol' || value['@@toStringTag'] === 'Symbol')) || false;\n}\n/**\n * Fill any missing well known symbols if the native Symbol is missing them\n */\n[\n 'hasInstance',\n 'isConcatSpreadable',\n 'iterator',\n 'species',\n 'replace',\n 'search',\n 'split',\n 'match',\n 'toPrimitive',\n 'toStringTag',\n 'unscopables',\n 'observable'\n].forEach((wellKnown) => {\n if (!Symbol[wellKnown]) {\n Object.defineProperty(Symbol, wellKnown, getValueDescriptor(Symbol.for(wellKnown), false, false));\n }\n});\nexport default Symbol;\n//# sourceMappingURL=Symbol.mjs.map" }, { - "id": "./node_modules/@dojo/shim/WeakMap.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/WeakMap.mjs", - "name": "./node_modules/@dojo/shim/WeakMap.mjs", + "id": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/WeakMap.mjs", + "name": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "index": 19, "index2": 13, "size": 3748, @@ -582,38 +582,38 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/WeakMap", - "loc": "2:0-41" + "userRequest": "../shim/WeakMap", + "loc": "2:0-38" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/WeakMap", - "loc": "5:0-41" + "userRequest": "../shim/WeakMap", + "loc": "5:0-38" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/inject.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/WeakMap", + "userRequest": "../../shim/WeakMap", "loc": "1:0-41" } ], @@ -629,9 +629,9 @@ "source": "import global from './global';\nimport { isArrayLike } from './iterator';\nimport has from './support/has';\nimport './Symbol';\nexport let WeakMap = global.WeakMap;\nif (!true) {\n const DELETED = {};\n const getUID = function getUID() {\n return Math.floor(Math.random() * 100000000);\n };\n const generateName = (function () {\n let startId = Math.floor(Date.now() % 100000000);\n return function generateName() {\n return '__wm' + getUID() + (startId++ + '__');\n };\n })();\n WeakMap = class WeakMap {\n constructor(iterable) {\n this[Symbol.toStringTag] = 'WeakMap';\n this._name = generateName();\n this._frozenEntries = [];\n if (iterable) {\n if (isArrayLike(iterable)) {\n for (let i = 0; i < iterable.length; i++) {\n const item = iterable[i];\n this.set(item[0], item[1]);\n }\n }\n else {\n for (const [key, value] of iterable) {\n this.set(key, value);\n }\n }\n }\n }\n _getFrozenEntryIndex(key) {\n for (let i = 0; i < this._frozenEntries.length; i++) {\n if (this._frozenEntries[i].key === key) {\n return i;\n }\n }\n return -1;\n }\n delete(key) {\n if (key === undefined || key === null) {\n return false;\n }\n const entry = key[this._name];\n if (entry && entry.key === key && entry.value !== DELETED) {\n entry.value = DELETED;\n return true;\n }\n const frozenIndex = this._getFrozenEntryIndex(key);\n if (frozenIndex >= 0) {\n this._frozenEntries.splice(frozenIndex, 1);\n return true;\n }\n return false;\n }\n get(key) {\n if (key === undefined || key === null) {\n return undefined;\n }\n const entry = key[this._name];\n if (entry && entry.key === key && entry.value !== DELETED) {\n return entry.value;\n }\n const frozenIndex = this._getFrozenEntryIndex(key);\n if (frozenIndex >= 0) {\n return this._frozenEntries[frozenIndex].value;\n }\n }\n has(key) {\n if (key === undefined || key === null) {\n return false;\n }\n const entry = key[this._name];\n if (Boolean(entry && entry.key === key && entry.value !== DELETED)) {\n return true;\n }\n const frozenIndex = this._getFrozenEntryIndex(key);\n if (frozenIndex >= 0) {\n return true;\n }\n return false;\n }\n set(key, value) {\n if (!key || (typeof key !== 'object' && typeof key !== 'function')) {\n throw new TypeError('Invalid value used as weak map key');\n }\n let entry = key[this._name];\n if (!entry || entry.key !== key) {\n entry = Object.create(null, {\n key: { value: key }\n });\n if (Object.isFrozen(key)) {\n this._frozenEntries.push(entry);\n }\n else {\n Object.defineProperty(key, this._name, {\n value: entry\n });\n }\n }\n entry.value = value;\n return this;\n }\n };\n}\nexport default WeakMap;\n//# sourceMappingURL=WeakMap.mjs.map" }, { - "id": "./node_modules/@dojo/shim/array.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "name": "./node_modules/@dojo/shim/array.mjs", + "id": "./node_modules/@dojo/framework/shim/array.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "name": "./node_modules/@dojo/framework/shim/array.mjs", "index": 30, "index2": 24, "size": 8928, @@ -643,30 +643,30 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/array", - "loc": "4:0-40" + "userRequest": "../shim/array", + "loc": "4:0-37" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/array", - "loc": "2:0-53" + "userRequest": "../shim/array", + "loc": "2:0-50" } ], "usedExports": [ @@ -686,9 +686,9 @@ "source": "import global from './global';\nimport { isArrayLike, isIterable } from './iterator';\nimport { MAX_SAFE_INTEGER } from './number';\nimport has from './support/has';\nimport { wrapNative } from './support/util';\nexport let from;\n/**\n * Creates a new array from the function parameters.\n *\n * @param arguments Any number of arguments for the array\n * @return An array from the given arguments\n */\nexport let of;\n/* ES6 Array instance methods */\n/**\n * Copies data internally within an array or array-like object.\n *\n * @param target The target array-like object\n * @param offset The index to start copying values to; if negative, it counts backwards from length\n * @param start The first (inclusive) index to copy; if negative, it counts backwards from length\n * @param end The last (exclusive) index to copy; if negative, it counts backwards from length\n * @return The target\n */\nexport let copyWithin;\n/**\n * Fills elements of an array-like object with the specified value.\n *\n * @param target The target to fill\n * @param value The value to fill each element of the target with\n * @param start The first index to fill\n * @param end The (exclusive) index at which to stop filling\n * @return The filled target\n */\nexport let fill;\n/**\n * Finds and returns the first instance matching the callback or undefined if one is not found.\n *\n * @param target An array-like object\n * @param callback A function returning if the current value matches a criteria\n * @param thisArg The execution context for the find function\n * @return The first element matching the callback, or undefined if one does not exist\n */\nexport let find;\n/**\n * Performs a linear search and returns the first index whose value satisfies the passed callback,\n * or -1 if no values satisfy it.\n *\n * @param target An array-like object\n * @param callback A function returning true if the current value satisfies its criteria\n * @param thisArg The execution context for the find function\n * @return The first index whose value satisfies the passed callback, or -1 if no values satisfy it\n */\nexport let findIndex;\n/* ES7 Array instance methods */\n/**\n * Determines whether an array includes a given value\n *\n * @param target the target array-like object\n * @param searchElement the item to search for\n * @param fromIndex the starting index to search from\n * @return `true` if the array includes the element, otherwise `false`\n */\nexport let includes;\nif (true && true) {\n from = global.Array.from;\n of = global.Array.of;\n copyWithin = wrapNative(global.Array.prototype.copyWithin);\n fill = wrapNative(global.Array.prototype.fill);\n find = wrapNative(global.Array.prototype.find);\n findIndex = wrapNative(global.Array.prototype.findIndex);\n}\nelse {\n // It is only older versions of Safari/iOS that have a bad fill implementation and so aren't in the wild\n // To make things easier, if there is a bad fill implementation, the whole set of functions will be filled\n /**\n * Ensures a non-negative, non-infinite, safe integer.\n *\n * @param length The number to validate\n * @return A proper length\n */\n const toLength = function toLength(length) {\n if (isNaN(length)) {\n return 0;\n }\n length = Number(length);\n if (isFinite(length)) {\n length = Math.floor(length);\n }\n // Ensure a non-negative, real, safe integer\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\n };\n /**\n * From ES6 7.1.4 ToInteger()\n *\n * @param value A value to convert\n * @return An integer\n */\n const toInteger = function toInteger(value) {\n value = Number(value);\n if (isNaN(value)) {\n return 0;\n }\n if (value === 0 || !isFinite(value)) {\n return value;\n }\n return (value > 0 ? 1 : -1) * Math.floor(Math.abs(value));\n };\n /**\n * Normalizes an offset against a given length, wrapping it if negative.\n *\n * @param value The original offset\n * @param length The total length to normalize against\n * @return If negative, provide a distance from the end (length); otherwise provide a distance from 0\n */\n const normalizeOffset = function normalizeOffset(value, length) {\n return value < 0 ? Math.max(length + value, 0) : Math.min(value, length);\n };\n from = function from(arrayLike, mapFunction, thisArg) {\n if (arrayLike == null) {\n throw new TypeError('from: requires an array-like object');\n }\n if (mapFunction && thisArg) {\n mapFunction = mapFunction.bind(thisArg);\n }\n /* tslint:disable-next-line:variable-name */\n const Constructor = this;\n const length = toLength(arrayLike.length);\n // Support extension\n const array = typeof Constructor === 'function' ? Object(new Constructor(length)) : new Array(length);\n if (!isArrayLike(arrayLike) && !isIterable(arrayLike)) {\n return array;\n }\n // if this is an array and the normalized length is 0, just return an empty array. this prevents a problem\n // with the iteration on IE when using a NaN array length.\n if (isArrayLike(arrayLike)) {\n if (length === 0) {\n return [];\n }\n for (let i = 0; i < arrayLike.length; i++) {\n array[i] = mapFunction ? mapFunction(arrayLike[i], i) : arrayLike[i];\n }\n }\n else {\n let i = 0;\n for (const value of arrayLike) {\n array[i] = mapFunction ? mapFunction(value, i) : value;\n i++;\n }\n }\n if (arrayLike.length !== undefined) {\n array.length = length;\n }\n return array;\n };\n of = function of(...items) {\n return Array.prototype.slice.call(items);\n };\n copyWithin = function copyWithin(target, offset, start, end) {\n if (target == null) {\n throw new TypeError('copyWithin: target must be an array-like object');\n }\n const length = toLength(target.length);\n offset = normalizeOffset(toInteger(offset), length);\n start = normalizeOffset(toInteger(start), length);\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\n let count = Math.min(end - start, length - offset);\n let direction = 1;\n if (offset > start && offset < start + count) {\n direction = -1;\n start += count - 1;\n offset += count - 1;\n }\n while (count > 0) {\n if (start in target) {\n target[offset] = target[start];\n }\n else {\n delete target[offset];\n }\n offset += direction;\n start += direction;\n count--;\n }\n return target;\n };\n fill = function fill(target, value, start, end) {\n const length = toLength(target.length);\n let i = normalizeOffset(toInteger(start), length);\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\n while (i < end) {\n target[i++] = value;\n }\n return target;\n };\n find = function find(target, callback, thisArg) {\n const index = findIndex(target, callback, thisArg);\n return index !== -1 ? target[index] : undefined;\n };\n findIndex = function findIndex(target, callback, thisArg) {\n const length = toLength(target.length);\n if (!callback) {\n throw new TypeError('find: second argument must be a function');\n }\n if (thisArg) {\n callback = callback.bind(thisArg);\n }\n for (let i = 0; i < length; i++) {\n if (callback(target[i], i, target)) {\n return i;\n }\n }\n return -1;\n };\n}\nif (true) {\n includes = wrapNative(global.Array.prototype.includes);\n}\nelse {\n /**\n * Ensures a non-negative, non-infinite, safe integer.\n *\n * @param length The number to validate\n * @return A proper length\n */\n const toLength = function toLength(length) {\n length = Number(length);\n if (isNaN(length)) {\n return 0;\n }\n if (isFinite(length)) {\n length = Math.floor(length);\n }\n // Ensure a non-negative, real, safe integer\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\n };\n includes = function includes(target, searchElement, fromIndex = 0) {\n let len = toLength(target.length);\n for (let i = fromIndex; i < len; ++i) {\n const currentElement = target[i];\n if (searchElement === currentElement ||\n (searchElement !== searchElement && currentElement !== currentElement)) {\n return true;\n }\n }\n return false;\n };\n}\n//# sourceMappingURL=array.mjs.map" }, { - "id": "./node_modules/@dojo/shim/global.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/global.mjs", - "name": "./node_modules/@dojo/shim/global.mjs", + "id": "./node_modules/@dojo/framework/shim/global.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/global.mjs", + "name": "./node_modules/@dojo/framework/shim/global.mjs", "index": 10, "index2": 4, "size": 581, @@ -700,117 +700,117 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "type": "harmony import", - "userRequest": "@dojo/shim/global", - "loc": "6:0-39" - }, - { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/global", - "loc": "1:0-39" + "userRequest": "../shim/global", + "loc": "6:0-36" }, { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./global", "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Symbol.mjs", - "module": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleName": "./node_modules/@dojo/shim/Symbol.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Symbol.mjs", + "module": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Symbol.mjs", "type": "harmony import", "userRequest": "./global", "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/number.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/number.mjs", - "module": "./node_modules/@dojo/shim/number.mjs", - "moduleName": "./node_modules/@dojo/shim/number.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "type": "harmony import", + "userRequest": "../shim/global", + "loc": "1:0-36" + }, + { + "moduleId": "./node_modules/@dojo/framework/shim/number.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/number.mjs", + "module": "./node_modules/@dojo/framework/shim/number.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/number.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/support/has.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/has.mjs", - "module": "./node_modules/@dojo/shim/support/has.mjs", - "moduleName": "./node_modules/@dojo/shim/support/has.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/has.mjs", + "module": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/has.mjs", "type": "harmony import", "userRequest": "../global", "loc": "2:0-31" }, { - "moduleId": "./node_modules/@dojo/shim/object.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/object.mjs", - "module": "./node_modules/@dojo/shim/object.mjs", - "moduleName": "./node_modules/@dojo/shim/object.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/object.mjs", + "module": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/object.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/string.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/string.mjs", - "module": "./node_modules/@dojo/shim/string.mjs", - "moduleName": "./node_modules/@dojo/shim/string.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/string.mjs", + "module": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/string.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/queue.mjs", - "module": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleName": "./node_modules/@dojo/shim/support/queue.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/queue.mjs", + "module": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/queue.mjs", "type": "harmony import", "userRequest": "../global", "loc": "1:0-31" @@ -827,9 +827,9 @@ "source": "const globalObject = (function () {\n if (typeof global !== 'undefined') {\n // global spec defines a reference to the global object called 'global'\n // https://github.com/tc39/proposal-global\n // `global` is also defined in NodeJS\n return global;\n }\n else if (typeof window !== 'undefined') {\n // window is defined in browsers\n return window;\n }\n else if (typeof self !== 'undefined') {\n // self is defined in WebWorkers\n return self;\n }\n})();\nexport default globalObject;\n//# sourceMappingURL=global.mjs.map" }, { - "id": "./node_modules/@dojo/shim/iterator.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/iterator.mjs", - "name": "./node_modules/@dojo/shim/iterator.mjs", + "id": "./node_modules/@dojo/framework/shim/iterator.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/iterator.mjs", + "name": "./node_modules/@dojo/framework/shim/iterator.mjs", "index": 16, "index2": 10, "size": 3158, @@ -841,36 +841,36 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./iterator", "loc": "2:0-53" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./iterator", "loc": "1:0-55" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./iterator", "loc": "2:0-41" @@ -889,9 +889,9 @@ "source": "import './Symbol';\nimport { HIGH_SURROGATE_MAX, HIGH_SURROGATE_MIN } from './string';\nconst staticDone = { done: true, value: undefined };\n/**\n * A class that _shims_ an iterator interface on array like objects.\n */\nexport class ShimIterator {\n constructor(list) {\n this._nextIndex = -1;\n if (isIterable(list)) {\n this._nativeIterator = list[Symbol.iterator]();\n }\n else {\n this._list = list;\n }\n }\n /**\n * Return the next iteration result for the Iterator\n */\n next() {\n if (this._nativeIterator) {\n return this._nativeIterator.next();\n }\n if (!this._list) {\n return staticDone;\n }\n if (++this._nextIndex < this._list.length) {\n return {\n done: false,\n value: this._list[this._nextIndex]\n };\n }\n return staticDone;\n }\n [Symbol.iterator]() {\n return this;\n }\n}\n/**\n * A type guard for checking if something has an Iterable interface\n *\n * @param value The value to type guard against\n */\nexport function isIterable(value) {\n return value && typeof value[Symbol.iterator] === 'function';\n}\n/**\n * A type guard for checking if something is ArrayLike\n *\n * @param value The value to type guard against\n */\nexport function isArrayLike(value) {\n return value && typeof value.length === 'number';\n}\n/**\n * Returns the iterator for an object\n *\n * @param iterable The iterable object to return the iterator for\n */\nexport function get(iterable) {\n if (isIterable(iterable)) {\n return iterable[Symbol.iterator]();\n }\n else if (isArrayLike(iterable)) {\n return new ShimIterator(iterable);\n }\n}\n/**\n * Shims the functionality of `for ... of` blocks\n *\n * @param iterable The object the provides an interator interface\n * @param callback The callback which will be called for each item of the iterable\n * @param thisArg Optional scope to pass the callback\n */\nexport function forOf(iterable, callback, thisArg) {\n let broken = false;\n function doBreak() {\n broken = true;\n }\n /* We need to handle iteration of double byte strings properly */\n if (isArrayLike(iterable) && typeof iterable === 'string') {\n const l = iterable.length;\n for (let i = 0; i < l; ++i) {\n let char = iterable[i];\n if (i + 1 < l) {\n const code = char.charCodeAt(0);\n if (code >= HIGH_SURROGATE_MIN && code <= HIGH_SURROGATE_MAX) {\n char += iterable[++i];\n }\n }\n callback.call(thisArg, char, iterable, doBreak);\n if (broken) {\n return;\n }\n }\n }\n else {\n const iterator = get(iterable);\n if (iterator) {\n let result = iterator.next();\n while (!result.done) {\n callback.call(thisArg, result.value, iterable, doBreak);\n if (broken) {\n return;\n }\n result = iterator.next();\n }\n }\n }\n}\n//# sourceMappingURL=iterator.mjs.map" }, { - "id": "./node_modules/@dojo/shim/number.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/number.mjs", - "name": "./node_modules/@dojo/shim/number.mjs", + "id": "./node_modules/@dojo/framework/shim/number.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/number.mjs", + "name": "./node_modules/@dojo/framework/shim/number.mjs", "index": 31, "index2": 23, "size": 1724, @@ -903,18 +903,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./number", "loc": "3:0-44" @@ -935,9 +935,9 @@ "source": "import global from './global';\n/**\n * The smallest interval between two representable numbers.\n */\nexport const EPSILON = 1;\n/**\n * The maximum safe integer in JavaScript\n */\nexport const MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n/**\n * The minimum safe integer in JavaScript\n */\nexport const MIN_SAFE_INTEGER = -MAX_SAFE_INTEGER;\n/**\n * Determines whether the passed value is NaN without coersion.\n *\n * @param value The value to test\n * @return true if the value is NaN, false if it is not\n */\nexport function isNaN(value) {\n return typeof value === 'number' && global.isNaN(value);\n}\n/**\n * Determines whether the passed value is a finite number without coersion.\n *\n * @param value The value to test\n * @return true if the value is finite, false if it is not\n */\nexport function isFinite(value) {\n return typeof value === 'number' && global.isFinite(value);\n}\n/**\n * Determines whether the passed value is an integer.\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isInteger(value) {\n return isFinite(value) && Math.floor(value) === value;\n}\n/**\n * Determines whether the passed value is an integer that is 'safe,' meaning:\n * 1. it can be expressed as an IEEE-754 double precision number\n * 2. it has a one-to-one mapping to a mathematical integer, meaning its\n * IEEE-754 representation cannot be the result of rounding any other\n * integer to fit the IEEE-754 representation\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isSafeInteger(value) {\n return isInteger(value) && Math.abs(value) <= MAX_SAFE_INTEGER;\n}\n//# sourceMappingURL=number.mjs.map" }, { - "id": "./node_modules/@dojo/shim/object.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/object.mjs", - "name": "./node_modules/@dojo/shim/object.mjs", + "id": "./node_modules/@dojo/framework/shim/object.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/object.mjs", + "name": "./node_modules/@dojo/framework/shim/object.mjs", "index": 18, "index2": 11, "size": 4061, @@ -949,39 +949,39 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "issuerId": "./node_modules/@dojo/shim/Map.mjs", - "issuerName": "./node_modules/@dojo/shim/Map.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/Map.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/Map.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./object", "loc": "3:0-42" }, { - "moduleId": "./node_modules/@dojo/core/lang.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/lang.mjs", - "module": "./node_modules/@dojo/core/lang.mjs", - "moduleName": "./node_modules/@dojo/core/lang.mjs", + "moduleId": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/lang.mjs", + "module": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleName": "./node_modules/@dojo/framework/core/lang.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/object", - "loc": "1:0-43" + "userRequest": "../shim/object", + "loc": "1:0-40" }, { - "moduleId": "./node_modules/@dojo/core/lang.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/lang.mjs", - "module": "./node_modules/@dojo/core/lang.mjs", - "moduleName": "./node_modules/@dojo/core/lang.mjs", + "moduleId": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/lang.mjs", + "module": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleName": "./node_modules/@dojo/framework/core/lang.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/object", - "loc": "2:0-43" + "userRequest": "../shim/object", + "loc": "2:0-40" } ], "usedExports": [ @@ -1003,9 +1003,9 @@ "source": "import global from './global';\nimport has from './support/has';\nimport { isSymbol } from './Symbol';\nexport let assign;\n/**\n * Gets the own property descriptor of the specified object.\n * An own property descriptor is one that is defined directly on the object and is not\n * inherited from the object's prototype.\n * @param o Object that contains the property.\n * @param p Name of the property.\n */\nexport let getOwnPropertyDescriptor;\n/**\n * Returns the names of the own properties of an object. The own properties of an object are those that are defined directly\n * on that object, and are not inherited from the object's prototype. The properties of an object include both fields (objects) and functions.\n * @param o Object that contains the own properties.\n */\nexport let getOwnPropertyNames;\n/**\n * Returns an array of all symbol properties found directly on object o.\n * @param o Object to retrieve the symbols from.\n */\nexport let getOwnPropertySymbols;\n/**\n * Returns true if the values are the same value, false otherwise.\n * @param value1 The first value.\n * @param value2 The second value.\n */\nexport let is;\n/**\n * Returns the names of the enumerable properties and methods of an object.\n * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.\n */\nexport let keys;\n/* ES7 Object static methods */\nexport let getOwnPropertyDescriptors;\nexport let entries;\nexport let values;\nif (true) {\n const globalObject = global.Object;\n assign = globalObject.assign;\n getOwnPropertyDescriptor = globalObject.getOwnPropertyDescriptor;\n getOwnPropertyNames = globalObject.getOwnPropertyNames;\n getOwnPropertySymbols = globalObject.getOwnPropertySymbols;\n is = globalObject.is;\n keys = globalObject.keys;\n}\nelse {\n keys = function symbolAwareKeys(o) {\n return Object.keys(o).filter((key) => !Boolean(key.match(/^@@.+/)));\n };\n assign = function assign(target, ...sources) {\n if (target == null) {\n // TypeError if undefined or null\n throw new TypeError('Cannot convert undefined or null to object');\n }\n const to = Object(target);\n sources.forEach((nextSource) => {\n if (nextSource) {\n // Skip over if undefined or null\n keys(nextSource).forEach((nextKey) => {\n to[nextKey] = nextSource[nextKey];\n });\n }\n });\n return to;\n };\n getOwnPropertyDescriptor = function getOwnPropertyDescriptor(o, prop) {\n if (isSymbol(prop)) {\n return Object.getOwnPropertyDescriptor(o, prop);\n }\n else {\n return Object.getOwnPropertyDescriptor(o, prop);\n }\n };\n getOwnPropertyNames = function getOwnPropertyNames(o) {\n return Object.getOwnPropertyNames(o).filter((key) => !Boolean(key.match(/^@@.+/)));\n };\n getOwnPropertySymbols = function getOwnPropertySymbols(o) {\n return Object.getOwnPropertyNames(o)\n .filter((key) => Boolean(key.match(/^@@.+/)))\n .map((key) => Symbol.for(key.substring(2)));\n };\n is = function is(value1, value2) {\n if (value1 === value2) {\n return value1 !== 0 || 1 / value1 === 1 / value2; // -0\n }\n return value1 !== value1 && value2 !== value2; // NaN\n };\n}\nif (true) {\n const globalObject = global.Object;\n getOwnPropertyDescriptors = globalObject.getOwnPropertyDescriptors;\n entries = globalObject.entries;\n values = globalObject.values;\n}\nelse {\n getOwnPropertyDescriptors = function getOwnPropertyDescriptors(o) {\n return getOwnPropertyNames(o).reduce((previous, key) => {\n previous[key] = getOwnPropertyDescriptor(o, key);\n return previous;\n }, {});\n };\n entries = function entries(o) {\n return keys(o).map((key) => [key, o[key]]);\n };\n values = function values(o) {\n return keys(o).map((key) => o[key]);\n };\n}\n//# sourceMappingURL=object.mjs.map" }, { - "id": "./node_modules/@dojo/shim/string.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/string.mjs", - "name": "./node_modules/@dojo/shim/string.mjs", + "id": "./node_modules/@dojo/framework/shim/string.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/string.mjs", + "name": "./node_modules/@dojo/framework/shim/string.mjs", "index": 17, "index2": 9, "size": 12418, @@ -1017,18 +1017,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/iterator.mjs", - "issuerId": "./node_modules/@dojo/shim/iterator.mjs", - "issuerName": "./node_modules/@dojo/shim/iterator.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/iterator.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/iterator.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/iterator.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/iterator.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/iterator.mjs", - "module": "./node_modules/@dojo/shim/iterator.mjs", - "moduleName": "./node_modules/@dojo/shim/iterator.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/iterator.mjs", + "module": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/iterator.mjs", "type": "harmony import", "userRequest": "./string", "loc": "2:0-66" @@ -1059,9 +1059,9 @@ "source": "import global from './global';\nimport has from './support/has';\nimport { wrapNative } from './support/util';\n/**\n * The minimum location of high surrogates\n */\nexport const HIGH_SURROGATE_MIN = 0xd800;\n/**\n * The maximum location of high surrogates\n */\nexport const HIGH_SURROGATE_MAX = 0xdbff;\n/**\n * The minimum location of low surrogates\n */\nexport const LOW_SURROGATE_MIN = 0xdc00;\n/**\n * The maximum location of low surrogates\n */\nexport const LOW_SURROGATE_MAX = 0xdfff;\n/* ES6 static methods */\n/**\n * Return the String value whose elements are, in order, the elements in the List elements.\n * If length is 0, the empty string is returned.\n * @param codePoints The code points to generate the string\n */\nexport let fromCodePoint;\n/**\n * `raw` is intended for use as a tag function of a Tagged Template String. When called\n * as such the first argument will be a well formed template call site object and the rest\n * parameter will contain the substitution values.\n * @param template A well-formed template string call site representation.\n * @param substitutions A set of substitution values.\n */\nexport let raw;\n/* ES6 instance methods */\n/**\n * Returns a nonnegative integer Number less than 1114112 (0x110000) that is the code point\n * value of the UTF-16 encoded code point starting at the string element at position pos in\n * the String resulting from converting this object to a String.\n * If there is no element at that position, the result is undefined.\n * If a valid UTF-16 surrogate pair does not begin at pos, the result is the code unit at pos.\n */\nexport let codePointAt;\n/**\n * Returns true if the sequence of elements of searchString converted to a String is the\n * same as the corresponding elements of this object (converted to a String) starting at\n * endPosition – length(this). Otherwise returns false.\n */\nexport let endsWith;\n/**\n * Returns true if searchString appears as a substring of the result of converting this\n * object to a String, at one or more positions that are\n * greater than or equal to position; otherwise, returns false.\n * @param target The target string\n * @param searchString search string\n * @param position If position is undefined, 0 is assumed, so as to search all of the String.\n */\nexport let includes;\n/**\n * Returns the String value result of normalizing the string into the normalization form\n * named by form as specified in Unicode Standard Annex #15, Unicode Normalization Forms.\n * @param target The target string\n * @param form Applicable values: \"NFC\", \"NFD\", \"NFKC\", or \"NFKD\", If not specified default\n * is \"NFC\"\n */\nexport let normalize;\n/**\n * Returns a String value that is made from count copies appended together. If count is 0,\n * T is the empty String is returned.\n * @param count number of copies to append\n */\nexport let repeat;\n/**\n * Returns true if the sequence of elements of searchString converted to a String is the\n * same as the corresponding elements of this object (converted to a String) starting at\n * position. Otherwise returns false.\n */\nexport let startsWith;\n/* ES7 instance methods */\n/**\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\n * The padding is applied from the end (right) of the current string.\n *\n * @param target The target string\n * @param maxLength The length of the resulting string once the current string has been padded.\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\n *\n * @param fillString The string to pad the current string with.\n * If this string is too long, it will be truncated and the left-most part will be applied.\n * The default value for this parameter is \" \" (U+0020).\n */\nexport let padEnd;\n/**\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\n * The padding is applied from the start (left) of the current string.\n *\n * @param target The target string\n * @param maxLength The length of the resulting string once the current string has been padded.\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\n *\n * @param fillString The string to pad the current string with.\n * If this string is too long, it will be truncated and the left-most part will be applied.\n * The default value for this parameter is \" \" (U+0020).\n */\nexport let padStart;\nif (true && true) {\n fromCodePoint = global.String.fromCodePoint;\n raw = global.String.raw;\n codePointAt = wrapNative(global.String.prototype.codePointAt);\n endsWith = wrapNative(global.String.prototype.endsWith);\n includes = wrapNative(global.String.prototype.includes);\n normalize = wrapNative(global.String.prototype.normalize);\n repeat = wrapNative(global.String.prototype.repeat);\n startsWith = wrapNative(global.String.prototype.startsWith);\n}\nelse {\n /**\n * Validates that text is defined, and normalizes position (based on the given default if the input is NaN).\n * Used by startsWith, includes, and endsWith.\n *\n * @return Normalized position.\n */\n const normalizeSubstringArgs = function (name, text, search, position, isEnd = false) {\n if (text == null) {\n throw new TypeError('string.' + name + ' requires a valid string to search against.');\n }\n const length = text.length;\n position = position !== position ? (isEnd ? length : 0) : position;\n return [text, String(search), Math.min(Math.max(position, 0), length)];\n };\n fromCodePoint = function fromCodePoint(...codePoints) {\n // Adapted from https://github.com/mathiasbynens/String.fromCodePoint\n const length = arguments.length;\n if (!length) {\n return '';\n }\n const fromCharCode = String.fromCharCode;\n const MAX_SIZE = 0x4000;\n let codeUnits = [];\n let index = -1;\n let result = '';\n while (++index < length) {\n let codePoint = Number(arguments[index]);\n // Code points must be finite integers within the valid range\n let isValid = isFinite(codePoint) && Math.floor(codePoint) === codePoint && codePoint >= 0 && codePoint <= 0x10ffff;\n if (!isValid) {\n throw RangeError('string.fromCodePoint: Invalid code point ' + codePoint);\n }\n if (codePoint <= 0xffff) {\n // BMP code point\n codeUnits.push(codePoint);\n }\n else {\n // Astral code point; split in surrogate halves\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n codePoint -= 0x10000;\n let highSurrogate = (codePoint >> 10) + HIGH_SURROGATE_MIN;\n let lowSurrogate = codePoint % 0x400 + LOW_SURROGATE_MIN;\n codeUnits.push(highSurrogate, lowSurrogate);\n }\n if (index + 1 === length || codeUnits.length > MAX_SIZE) {\n result += fromCharCode.apply(null, codeUnits);\n codeUnits.length = 0;\n }\n }\n return result;\n };\n raw = function raw(callSite, ...substitutions) {\n let rawStrings = callSite.raw;\n let result = '';\n let numSubstitutions = substitutions.length;\n if (callSite == null || callSite.raw == null) {\n throw new TypeError('string.raw requires a valid callSite object with a raw value');\n }\n for (let i = 0, length = rawStrings.length; i < length; i++) {\n result += rawStrings[i] + (i < numSubstitutions && i < length - 1 ? substitutions[i] : '');\n }\n return result;\n };\n codePointAt = function codePointAt(text, position = 0) {\n // Adapted from https://github.com/mathiasbynens/String.prototype.codePointAt\n if (text == null) {\n throw new TypeError('string.codePointAt requries a valid string.');\n }\n const length = text.length;\n if (position !== position) {\n position = 0;\n }\n if (position < 0 || position >= length) {\n return undefined;\n }\n // Get the first code unit\n const first = text.charCodeAt(position);\n if (first >= HIGH_SURROGATE_MIN && first <= HIGH_SURROGATE_MAX && length > position + 1) {\n // Start of a surrogate pair (high surrogate and there is a next code unit); check for low surrogate\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n const second = text.charCodeAt(position + 1);\n if (second >= LOW_SURROGATE_MIN && second <= LOW_SURROGATE_MAX) {\n return (first - HIGH_SURROGATE_MIN) * 0x400 + second - LOW_SURROGATE_MIN + 0x10000;\n }\n }\n return first;\n };\n endsWith = function endsWith(text, search, endPosition) {\n if (endPosition == null) {\n endPosition = text.length;\n }\n [text, search, endPosition] = normalizeSubstringArgs('endsWith', text, search, endPosition, true);\n const start = endPosition - search.length;\n if (start < 0) {\n return false;\n }\n return text.slice(start, endPosition) === search;\n };\n includes = function includes(text, search, position = 0) {\n [text, search, position] = normalizeSubstringArgs('includes', text, search, position);\n return text.indexOf(search, position) !== -1;\n };\n repeat = function repeat(text, count = 0) {\n // Adapted from https://github.com/mathiasbynens/String.prototype.repeat\n if (text == null) {\n throw new TypeError('string.repeat requires a valid string.');\n }\n if (count !== count) {\n count = 0;\n }\n if (count < 0 || count === Infinity) {\n throw new RangeError('string.repeat requires a non-negative finite count.');\n }\n let result = '';\n while (count) {\n if (count % 2) {\n result += text;\n }\n if (count > 1) {\n text += text;\n }\n count >>= 1;\n }\n return result;\n };\n startsWith = function startsWith(text, search, position = 0) {\n search = String(search);\n [text, search, position] = normalizeSubstringArgs('startsWith', text, search, position);\n const end = position + search.length;\n if (end > text.length) {\n return false;\n }\n return text.slice(position, end) === search;\n };\n}\nif (true) {\n padEnd = wrapNative(global.String.prototype.padEnd);\n padStart = wrapNative(global.String.prototype.padStart);\n}\nelse {\n padEnd = function padEnd(text, maxLength, fillString = ' ') {\n if (text === null || text === undefined) {\n throw new TypeError('string.repeat requires a valid string.');\n }\n if (maxLength === Infinity) {\n throw new RangeError('string.padEnd requires a non-negative finite count.');\n }\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\n maxLength = 0;\n }\n let strText = String(text);\n const padding = maxLength - strText.length;\n if (padding > 0) {\n strText +=\n repeat(fillString, Math.floor(padding / fillString.length)) +\n fillString.slice(0, padding % fillString.length);\n }\n return strText;\n };\n padStart = function padStart(text, maxLength, fillString = ' ') {\n if (text === null || text === undefined) {\n throw new TypeError('string.repeat requires a valid string.');\n }\n if (maxLength === Infinity) {\n throw new RangeError('string.padStart requires a non-negative finite count.');\n }\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\n maxLength = 0;\n }\n let strText = String(text);\n const padding = maxLength - strText.length;\n if (padding > 0) {\n strText =\n repeat(fillString, Math.floor(padding / fillString.length)) +\n fillString.slice(0, padding % fillString.length) +\n strText;\n }\n return strText;\n };\n}\n//# sourceMappingURL=string.mjs.map" }, { - "id": "./node_modules/@dojo/shim/support/has.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/has.mjs", - "name": "./node_modules/@dojo/shim/support/has.mjs", + "id": "./node_modules/@dojo/framework/shim/support/has.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/has.mjs", + "name": "./node_modules/@dojo/framework/shim/support/has.mjs", "index": 6, "index2": 5, "size": 6151, @@ -1073,81 +1073,81 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "4:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "4:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "3:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Symbol.mjs", - "module": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleName": "./node_modules/@dojo/shim/Symbol.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Symbol.mjs", + "module": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Symbol.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "1:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/object.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/object.mjs", - "module": "./node_modules/@dojo/shim/object.mjs", - "moduleName": "./node_modules/@dojo/shim/object.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/object.mjs", + "module": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/object.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "2:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "4:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/string.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/string.mjs", - "module": "./node_modules/@dojo/shim/string.mjs", - "moduleName": "./node_modules/@dojo/shim/string.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/string.mjs", + "module": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/string.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "2:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/queue.mjs", - "module": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleName": "./node_modules/@dojo/shim/support/queue.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/queue.mjs", + "module": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/queue.mjs", "type": "harmony import", "userRequest": "./has", "loc": "2:0-24" @@ -1165,12 +1165,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import has, { add } from '@dojo/has/has';\nimport global from '../global';\nexport default has;\nexport * from '@dojo/has/has';\n/* ECMAScript 6 and 7 Features */\n/* Array */\nadd('es6-array', () => {\n return (['from', 'of'].every((key) => key in global.Array) &&\n ['findIndex', 'find', 'copyWithin'].every((key) => key in global.Array.prototype));\n}, true);\nadd('es6-array-fill', () => {\n if ('fill' in global.Array.prototype) {\n /* Some versions of Safari do not properly implement this */\n return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1;\n }\n return false;\n}, true);\nadd('es7-array', () => 'includes' in global.Array.prototype, true);\n/* Map */\nadd('es6-map', () => {\n if (typeof global.Map === 'function') {\n /*\n IE11 and older versions of Safari are missing critical ES6 Map functionality\n We wrap this in a try/catch because sometimes the Map constructor exists, but does not\n take arguments (iOS 8.4)\n */\n try {\n const map = new global.Map([[0, 1]]);\n return map.has(0) &&\n typeof map.keys === 'function' &&\n true &&\n typeof map.values === 'function' &&\n typeof map.entries === 'function';\n }\n catch (e) {\n /* istanbul ignore next: not testing on iOS at the moment */\n return false;\n }\n }\n return false;\n}, true);\n/* Math */\nadd('es6-math', () => {\n return [\n 'clz32',\n 'sign',\n 'log10',\n 'log2',\n 'log1p',\n 'expm1',\n 'cosh',\n 'sinh',\n 'tanh',\n 'acosh',\n 'asinh',\n 'atanh',\n 'trunc',\n 'fround',\n 'cbrt',\n 'hypot'\n ].every((name) => typeof global.Math[name] === 'function');\n}, true);\nadd('es6-math-imul', () => {\n if ('imul' in global.Math) {\n /* Some versions of Safari on ios do not properly implement this */\n return Math.imul(0xffffffff, 5) === -5;\n }\n return false;\n}, true);\n/* Object */\nadd('es6-object', () => {\n return true &&\n ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof global.Object[name] === 'function');\n}, true);\nadd('es2017-object', () => {\n return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof global.Object[name] === 'function');\n}, true);\n/* Observable */\nadd('es-observable', () => typeof global.Observable !== 'undefined', true);\n/* Promise */\nadd('es6-promise', () => typeof global.Promise !== 'undefined' && true, true);\n/* Set */\nadd('es6-set', () => {\n if (typeof global.Set === 'function') {\n /* IE11 and older versions of Safari are missing critical ES6 Set functionality */\n const set = new global.Set([1]);\n return set.has(1) && 'keys' in set && typeof set.keys === 'function' && true;\n }\n return false;\n}, true);\n/* String */\nadd('es6-string', () => {\n return ([\n /* static methods */\n 'fromCodePoint'\n ].every((key) => typeof global.String[key] === 'function') &&\n [\n /* instance methods */\n 'codePointAt',\n 'normalize',\n 'repeat',\n 'startsWith',\n 'endsWith',\n 'includes'\n ].every((key) => typeof global.String.prototype[key] === 'function'));\n}, true);\nadd('es6-string-raw', () => {\n function getCallSite(callSite, ...substitutions) {\n const result = [...callSite];\n result.raw = callSite.raw;\n return result;\n }\n if ('raw' in global.String) {\n let b = 1;\n let callSite = getCallSite `a\\n${b}`;\n callSite.raw = ['a\\\\n'];\n const supportsTrunc = global.String.raw(callSite, 42) === 'a:\\\\n';\n return supportsTrunc;\n }\n return false;\n}, true);\nadd('es2017-string', () => {\n return ['padStart', 'padEnd'].every((key) => typeof global.String.prototype[key] === 'function');\n}, true);\n/* Symbol */\nadd('es6-symbol', () => typeof global.Symbol !== 'undefined' && typeof Symbol() === 'symbol', true);\n/* WeakMap */\nadd('es6-weakmap', () => {\n if (typeof global.WeakMap !== 'undefined') {\n /* IE11 and older versions of Safari are missing critical ES6 Map functionality */\n const key1 = {};\n const key2 = {};\n const map = new global.WeakMap([[key1, 1]]);\n Object.freeze(key1);\n return map.get(key1) === 1 && map.set(key2, 2) === map && true;\n }\n return false;\n}, true);\n/* Miscellaneous features */\nadd('microtasks', () => true || false || true, true);\nadd('postmessage', () => {\n // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have\n // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist.\n return typeof global.window !== 'undefined' && typeof global.postMessage === 'function';\n}, true);\nadd('raf', () => typeof global.requestAnimationFrame === 'function', true);\nadd('setimmediate', () => typeof global.setImmediate !== 'undefined', true);\n/* DOM Features */\nadd('dom-mutationobserver', () => {\n if (true && Boolean(global.MutationObserver || global.WebKitMutationObserver)) {\n // IE11 has an unreliable MutationObserver implementation where setProperty() does not\n // generate a mutation event, observers can crash, and the queue does not drain\n // reliably. The following feature test was adapted from\n // https://gist.github.com/t10ko/4aceb8c71681fdb275e33efe5e576b14\n const example = document.createElement('div');\n /* tslint:disable-next-line:variable-name */\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\n const observer = new HostMutationObserver(function () { });\n observer.observe(example, { attributes: true });\n example.style.setProperty('display', 'block');\n return Boolean(observer.takeRecords().length);\n }\n return false;\n}, true);\nadd('dom-webanimation', () => true && global.Animation !== undefined && global.KeyframeEffect !== undefined, true);\n//# sourceMappingURL=has.mjs.map" + "source": "import has, { add } from '../../has/has';\nimport global from '../global';\nexport default has;\nexport * from '../../has/has';\n/* ECMAScript 6 and 7 Features */\n/* Array */\nadd('es6-array', () => {\n return (['from', 'of'].every((key) => key in global.Array) &&\n ['findIndex', 'find', 'copyWithin'].every((key) => key in global.Array.prototype));\n}, true);\nadd('es6-array-fill', () => {\n if ('fill' in global.Array.prototype) {\n /* Some versions of Safari do not properly implement this */\n return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1;\n }\n return false;\n}, true);\nadd('es7-array', () => 'includes' in global.Array.prototype, true);\n/* Map */\nadd('es6-map', () => {\n if (typeof global.Map === 'function') {\n /*\n IE11 and older versions of Safari are missing critical ES6 Map functionality\n We wrap this in a try/catch because sometimes the Map constructor exists, but does not\n take arguments (iOS 8.4)\n */\n try {\n const map = new global.Map([[0, 1]]);\n return map.has(0) &&\n typeof map.keys === 'function' &&\n true &&\n typeof map.values === 'function' &&\n typeof map.entries === 'function';\n }\n catch (e) {\n /* istanbul ignore next: not testing on iOS at the moment */\n return false;\n }\n }\n return false;\n}, true);\n/* Math */\nadd('es6-math', () => {\n return [\n 'clz32',\n 'sign',\n 'log10',\n 'log2',\n 'log1p',\n 'expm1',\n 'cosh',\n 'sinh',\n 'tanh',\n 'acosh',\n 'asinh',\n 'atanh',\n 'trunc',\n 'fround',\n 'cbrt',\n 'hypot'\n ].every((name) => typeof global.Math[name] === 'function');\n}, true);\nadd('es6-math-imul', () => {\n if ('imul' in global.Math) {\n /* Some versions of Safari on ios do not properly implement this */\n return Math.imul(0xffffffff, 5) === -5;\n }\n return false;\n}, true);\n/* Object */\nadd('es6-object', () => {\n return true &&\n ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof global.Object[name] === 'function');\n}, true);\nadd('es2017-object', () => {\n return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof global.Object[name] === 'function');\n}, true);\n/* Observable */\nadd('es-observable', () => typeof global.Observable !== 'undefined', true);\n/* Promise */\nadd('es6-promise', () => typeof global.Promise !== 'undefined' && true, true);\n/* Set */\nadd('es6-set', () => {\n if (typeof global.Set === 'function') {\n /* IE11 and older versions of Safari are missing critical ES6 Set functionality */\n const set = new global.Set([1]);\n return set.has(1) && 'keys' in set && typeof set.keys === 'function' && true;\n }\n return false;\n}, true);\n/* String */\nadd('es6-string', () => {\n return ([\n /* static methods */\n 'fromCodePoint'\n ].every((key) => typeof global.String[key] === 'function') &&\n [\n /* instance methods */\n 'codePointAt',\n 'normalize',\n 'repeat',\n 'startsWith',\n 'endsWith',\n 'includes'\n ].every((key) => typeof global.String.prototype[key] === 'function'));\n}, true);\nadd('es6-string-raw', () => {\n function getCallSite(callSite, ...substitutions) {\n const result = [...callSite];\n result.raw = callSite.raw;\n return result;\n }\n if ('raw' in global.String) {\n let b = 1;\n let callSite = getCallSite `a\\n${b}`;\n callSite.raw = ['a\\\\n'];\n const supportsTrunc = global.String.raw(callSite, 42) === 'a:\\\\n';\n return supportsTrunc;\n }\n return false;\n}, true);\nadd('es2017-string', () => {\n return ['padStart', 'padEnd'].every((key) => typeof global.String.prototype[key] === 'function');\n}, true);\n/* Symbol */\nadd('es6-symbol', () => typeof global.Symbol !== 'undefined' && typeof Symbol() === 'symbol', true);\n/* WeakMap */\nadd('es6-weakmap', () => {\n if (typeof global.WeakMap !== 'undefined') {\n /* IE11 and older versions of Safari are missing critical ES6 Map functionality */\n const key1 = {};\n const key2 = {};\n const map = new global.WeakMap([[key1, 1]]);\n Object.freeze(key1);\n return map.get(key1) === 1 && map.set(key2, 2) === map && true;\n }\n return false;\n}, true);\n/* Miscellaneous features */\nadd('microtasks', () => true || false || true, true);\nadd('postmessage', () => {\n // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have\n // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist.\n return typeof global.window !== 'undefined' && typeof global.postMessage === 'function';\n}, true);\nadd('raf', () => typeof global.requestAnimationFrame === 'function', true);\nadd('setimmediate', () => typeof global.setImmediate !== 'undefined', true);\n/* DOM Features */\nadd('dom-mutationobserver', () => {\n if (true && Boolean(global.MutationObserver || global.WebKitMutationObserver)) {\n // IE11 has an unreliable MutationObserver implementation where setProperty() does not\n // generate a mutation event, observers can crash, and the queue does not drain\n // reliably. The following feature test was adapted from\n // https://gist.github.com/t10ko/4aceb8c71681fdb275e33efe5e576b14\n const example = document.createElement('div');\n /* tslint:disable-next-line:variable-name */\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\n const observer = new HostMutationObserver(function () { });\n observer.observe(example, { attributes: true });\n example.style.setProperty('display', 'block');\n return Boolean(observer.takeRecords().length);\n }\n return false;\n}, true);\nadd('dom-webanimation', () => true && global.Animation !== undefined && global.KeyframeEffect !== undefined, true);\n//# sourceMappingURL=has.mjs.map" }, { - "id": "./node_modules/@dojo/shim/support/queue.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/queue.mjs", - "name": "./node_modules/@dojo/shim/support/queue.mjs", + "id": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/queue.mjs", + "name": "./node_modules/@dojo/framework/shim/support/queue.mjs", "index": 23, "index2": 14, "size": 6196, @@ -1182,18 +1182,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Promise.mjs", - "issuerId": "./node_modules/@dojo/shim/Promise.mjs", - "issuerName": "./node_modules/@dojo/shim/Promise.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Promise.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/Promise.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./support/queue", "loc": "2:0-49" @@ -1210,9 +1210,9 @@ "source": "import global from '../global';\nimport has from './has';\nfunction executeTask(item) {\n if (item && item.isActive && item.callback) {\n item.callback();\n }\n}\nfunction getQueueHandle(item, destructor) {\n return {\n destroy: function () {\n this.destroy = function () { };\n item.isActive = false;\n item.callback = null;\n if (destructor) {\n destructor();\n }\n }\n };\n}\nlet checkMicroTaskQueue;\nlet microTasks;\n/**\n * Schedules a callback to the macrotask queue.\n *\n * @param callback the function to be queued and later executed.\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\n */\nexport const queueTask = (function () {\n let destructor;\n let enqueue;\n // Since the IE implementation of `setImmediate` is not flawless, we will test for `postMessage` first.\n if (true) {\n const queue = [];\n global.addEventListener('message', function (event) {\n // Confirm that the event was triggered by the current window and by this particular implementation.\n if (event.source === global && event.data === 'dojo-queue-message') {\n event.stopPropagation();\n if (queue.length) {\n executeTask(queue.shift());\n }\n }\n });\n enqueue = function (item) {\n queue.push(item);\n global.postMessage('dojo-queue-message', '*');\n };\n }\n else if (false) {\n destructor = global.clearImmediate;\n enqueue = function (item) {\n return setImmediate(executeTask.bind(null, item));\n };\n }\n else {\n destructor = global.clearTimeout;\n enqueue = function (item) {\n return setTimeout(executeTask.bind(null, item), 0);\n };\n }\n function queueTask(callback) {\n const item = {\n isActive: true,\n callback: callback\n };\n const id = enqueue(item);\n return getQueueHandle(item, destructor &&\n function () {\n destructor(id);\n });\n }\n // TODO: Use aspect.before when it is available.\n return true\n ? queueTask\n : function (callback) {\n checkMicroTaskQueue();\n return queueTask(callback);\n };\n})();\n// When no mechanism for registering microtasks is exposed by the environment, microtasks will\n// be queued and then executed in a single macrotask before the other macrotasks are executed.\nif (!true) {\n let isMicroTaskQueued = false;\n microTasks = [];\n checkMicroTaskQueue = function () {\n if (!isMicroTaskQueued) {\n isMicroTaskQueued = true;\n queueTask(function () {\n isMicroTaskQueued = false;\n if (microTasks.length) {\n let item;\n while ((item = microTasks.shift())) {\n executeTask(item);\n }\n }\n });\n }\n };\n}\n/**\n * Schedules an animation task with `window.requestAnimationFrame` if it exists, or with `queueTask` otherwise.\n *\n * Since requestAnimationFrame's behavior does not match that expected from `queueTask`, it is not used there.\n * However, at times it makes more sense to delegate to requestAnimationFrame; hence the following method.\n *\n * @param callback the function to be queued and later executed.\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\n */\nexport const queueAnimationTask = (function () {\n if (!true) {\n return queueTask;\n }\n function queueAnimationTask(callback) {\n const item = {\n isActive: true,\n callback: callback\n };\n const rafId = requestAnimationFrame(executeTask.bind(null, item));\n return getQueueHandle(item, function () {\n cancelAnimationFrame(rafId);\n });\n }\n // TODO: Use aspect.before when it is available.\n return true\n ? queueAnimationTask\n : function (callback) {\n checkMicroTaskQueue();\n return queueAnimationTask(callback);\n };\n})();\n/**\n * Schedules a callback to the microtask queue.\n *\n * Any callbacks registered with `queueMicroTask` will be executed before the next macrotask. If no native\n * mechanism for scheduling macrotasks is exposed, then any callbacks will be fired before any macrotask\n * registered with `queueTask` or `queueAnimationTask`.\n *\n * @param callback the function to be queued and later executed.\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\n */\nexport let queueMicroTask = (function () {\n let enqueue;\n if (false) {\n enqueue = function (item) {\n global.process.nextTick(executeTask.bind(null, item));\n };\n }\n else if (true) {\n enqueue = function (item) {\n global.Promise.resolve(item).then(executeTask);\n };\n }\n else if (true) {\n /* tslint:disable-next-line:variable-name */\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\n const node = document.createElement('div');\n const queue = [];\n const observer = new HostMutationObserver(function () {\n while (queue.length > 0) {\n const item = queue.shift();\n if (item && item.isActive && item.callback) {\n item.callback();\n }\n }\n });\n observer.observe(node, { attributes: true });\n enqueue = function (item) {\n queue.push(item);\n node.setAttribute('queueStatus', '1');\n };\n }\n else {\n enqueue = function (item) {\n checkMicroTaskQueue();\n microTasks.push(item);\n };\n }\n return function (callback) {\n const item = {\n isActive: true,\n callback: callback\n };\n enqueue(item);\n return getQueueHandle(item);\n };\n})();\n//# sourceMappingURL=queue.mjs.map" }, { - "id": "./node_modules/@dojo/shim/support/util.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/util.mjs", - "name": "./node_modules/@dojo/shim/support/util.mjs", + "id": "./node_modules/@dojo/framework/shim/support/util.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/util.mjs", + "name": "./node_modules/@dojo/framework/shim/support/util.mjs", "index": 11, "index2": 6, "size": 853, @@ -1224,36 +1224,36 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./support/util", "loc": "5:0-44" }, { - "moduleId": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Symbol.mjs", - "module": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleName": "./node_modules/@dojo/shim/Symbol.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Symbol.mjs", + "module": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Symbol.mjs", "type": "harmony import", "userRequest": "./support/util", "loc": "3:0-52" }, { - "moduleId": "./node_modules/@dojo/shim/string.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/string.mjs", - "module": "./node_modules/@dojo/shim/string.mjs", - "moduleName": "./node_modules/@dojo/shim/string.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/string.mjs", + "module": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/string.mjs", "type": "harmony import", "userRequest": "./support/util", "loc": "3:0-44" @@ -1272,12 +1272,12 @@ "source": "/**\n * Helper function to generate a value property descriptor\n *\n * @param value The value the property descriptor should be set to\n * @param enumerable If the property should be enumberable, defaults to false\n * @param writable If the property should be writable, defaults to true\n * @param configurable If the property should be configurable, defaults to true\n * @return The property descriptor object\n */\nexport function getValueDescriptor(value, enumerable = false, writable = true, configurable = true) {\n return {\n value: value,\n enumerable: enumerable,\n writable: writable,\n configurable: configurable\n };\n}\nexport function wrapNative(nativeFunction) {\n return function (target, ...args) {\n return nativeFunction.apply(target, args);\n };\n}\n//# sourceMappingURL=util.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/Injector.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Injector.mjs", - "name": "./node_modules/@dojo/widget-core/Injector.mjs", + "id": "./node_modules/@dojo/framework/widget-core/Injector.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Injector.mjs", + "name": "./node_modules/@dojo/framework/widget-core/Injector.mjs", "index": 37, "index2": 31, - "size": 496, + "size": 493, "cacheable": true, "built": true, "optional": false, @@ -1286,18 +1286,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../Injector", "loc": "2:0-41" @@ -1312,15 +1312,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { Evented } from '@dojo/core/Evented';\nexport class Injector extends Evented {\n constructor(payload) {\n super();\n this._payload = payload;\n }\n setInvalidator(invalidator) {\n this._invalidator = invalidator;\n }\n get() {\n return this._payload;\n }\n set(payload) {\n this._payload = payload;\n if (this._invalidator) {\n this._invalidator();\n }\n }\n}\nexport default Injector;\n//# sourceMappingURL=Injector.mjs.map" + "source": "import { Evented } from '../core/Evented';\nexport class Injector extends Evented {\n constructor(payload) {\n super();\n this._payload = payload;\n }\n setInvalidator(invalidator) {\n this._invalidator = invalidator;\n }\n get() {\n return this._payload;\n }\n set(payload) {\n this._payload = payload;\n if (this._invalidator) {\n this._invalidator();\n }\n }\n}\nexport default Injector;\n//# sourceMappingURL=Injector.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/NodeHandler.mjs", - "name": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "id": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "name": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", "index": 28, "index2": 22, - "size": 1096, + "size": 1090, "cacheable": true, "built": true, "optional": false, @@ -1329,18 +1329,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./NodeHandler", "loc": "7:0-40" @@ -1356,15 +1356,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { Evented } from '@dojo/core/Evented';\nimport Map from '@dojo/shim/Map';\n/**\n * Enum to identify the type of event.\n * Listening to 'Projector' will notify when projector is created or updated\n * Listening to 'Widget' will notify when widget root is created or updated\n */\nexport var NodeEventType;\n(function (NodeEventType) {\n NodeEventType[\"Projector\"] = \"Projector\";\n NodeEventType[\"Widget\"] = \"Widget\";\n})(NodeEventType || (NodeEventType = {}));\nexport class NodeHandler extends Evented {\n constructor() {\n super(...arguments);\n this._nodeMap = new Map();\n }\n get(key) {\n return this._nodeMap.get(key);\n }\n has(key) {\n return this._nodeMap.has(key);\n }\n add(element, key) {\n this._nodeMap.set(key, element);\n this.emit({ type: key });\n }\n addRoot() {\n this.emit({ type: NodeEventType.Widget });\n }\n addProjector() {\n this.emit({ type: NodeEventType.Projector });\n }\n clear() {\n this._nodeMap.clear();\n }\n}\nexport default NodeHandler;\n//# sourceMappingURL=NodeHandler.mjs.map" + "source": "import { Evented } from '../core/Evented';\nimport Map from '../shim/Map';\n/**\n * Enum to identify the type of event.\n * Listening to 'Projector' will notify when projector is created or updated\n * Listening to 'Widget' will notify when widget root is created or updated\n */\nexport var NodeEventType;\n(function (NodeEventType) {\n NodeEventType[\"Projector\"] = \"Projector\";\n NodeEventType[\"Widget\"] = \"Widget\";\n})(NodeEventType || (NodeEventType = {}));\nexport class NodeHandler extends Evented {\n constructor() {\n super(...arguments);\n this._nodeMap = new Map();\n }\n get(key) {\n return this._nodeMap.get(key);\n }\n has(key) {\n return this._nodeMap.has(key);\n }\n add(element, key) {\n this._nodeMap.set(key, element);\n this.emit({ type: key });\n }\n addRoot() {\n this.emit({ type: NodeEventType.Widget });\n }\n addProjector() {\n this.emit({ type: NodeEventType.Projector });\n }\n clear() {\n this._nodeMap.clear();\n }\n}\nexport default NodeHandler;\n//# sourceMappingURL=NodeHandler.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/Registry.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Registry.mjs", - "name": "./node_modules/@dojo/widget-core/Registry.mjs", + "id": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Registry.mjs", + "name": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "index": 21, "index2": 19, - "size": 3702, + "size": 3690, "cacheable": true, "built": true, "optional": false, @@ -1373,54 +1373,54 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./Registry", "loc": "9:0-71" }, { - "moduleId": "./node_modules/@dojo/widget-core/diff.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/diff.mjs", - "module": "./node_modules/@dojo/widget-core/diff.mjs", - "moduleName": "./node_modules/@dojo/widget-core/diff.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/diff.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/diff.mjs", + "module": "./node_modules/@dojo/framework/widget-core/diff.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/diff.mjs", "type": "harmony import", "userRequest": "./Registry", "loc": "1:0-46" }, { - "moduleId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/RegistryHandler.mjs", - "module": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "type": "harmony import", "userRequest": "./Registry", "loc": "3:0-38" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", "userRequest": "./Registry", "loc": "4:0-53" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/customElement.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", "type": "harmony import", "userRequest": "../Registry", "loc": "2:0-35" @@ -1441,15 +1441,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import Promise from '@dojo/shim/Promise';\nimport Map from '@dojo/shim/Map';\nimport Symbol from '@dojo/shim/Symbol';\nimport { Evented } from '@dojo/core/Evented';\n/**\n * Widget base symbol type\n */\nexport const WIDGET_BASE_TYPE = Symbol('Widget Base');\n/**\n * Checks is the item is a subclass of WidgetBase (or a WidgetBase)\n *\n * @param item the item to check\n * @returns true/false indicating if the item is a WidgetBaseConstructor\n */\nexport function isWidgetBaseConstructor(item) {\n return Boolean(item && item._type === WIDGET_BASE_TYPE);\n}\nexport function isWidgetConstructorDefaultExport(item) {\n return Boolean(item &&\n item.hasOwnProperty('__esModule') &&\n item.hasOwnProperty('default') &&\n isWidgetBaseConstructor(item.default));\n}\n/**\n * The Registry implementation\n */\nexport class Registry extends Evented {\n /**\n * Emit loaded event for registry label\n */\n emitLoadedEvent(widgetLabel, item) {\n this.emit({\n type: widgetLabel,\n action: 'loaded',\n item\n });\n }\n define(label, item) {\n if (this._widgetRegistry === undefined) {\n this._widgetRegistry = new Map();\n }\n if (this._widgetRegistry.has(label)) {\n throw new Error(`widget has already been registered for '${label.toString()}'`);\n }\n this._widgetRegistry.set(label, item);\n if (item instanceof Promise) {\n item.then((widgetCtor) => {\n this._widgetRegistry.set(label, widgetCtor);\n this.emitLoadedEvent(label, widgetCtor);\n return widgetCtor;\n }, (error) => {\n throw error;\n });\n }\n else if (isWidgetBaseConstructor(item)) {\n this.emitLoadedEvent(label, item);\n }\n }\n defineInjector(label, injectorFactory) {\n if (this._injectorRegistry === undefined) {\n this._injectorRegistry = new Map();\n }\n if (this._injectorRegistry.has(label)) {\n throw new Error(`injector has already been registered for '${label.toString()}'`);\n }\n const invalidator = new Evented();\n const injectorItem = {\n injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })),\n invalidator\n };\n this._injectorRegistry.set(label, injectorItem);\n this.emitLoadedEvent(label, injectorItem);\n }\n get(label) {\n if (!this._widgetRegistry || !this.has(label)) {\n return null;\n }\n const item = this._widgetRegistry.get(label);\n if (isWidgetBaseConstructor(item)) {\n return item;\n }\n if (item instanceof Promise) {\n return null;\n }\n const promise = item();\n this._widgetRegistry.set(label, promise);\n promise.then((widgetCtor) => {\n if (isWidgetConstructorDefaultExport(widgetCtor)) {\n widgetCtor = widgetCtor.default;\n }\n this._widgetRegistry.set(label, widgetCtor);\n this.emitLoadedEvent(label, widgetCtor);\n return widgetCtor;\n }, (error) => {\n throw error;\n });\n return null;\n }\n getInjector(label) {\n if (!this._injectorRegistry || !this.hasInjector(label)) {\n return null;\n }\n return this._injectorRegistry.get(label);\n }\n has(label) {\n return Boolean(this._widgetRegistry && this._widgetRegistry.has(label));\n }\n hasInjector(label) {\n return Boolean(this._injectorRegistry && this._injectorRegistry.has(label));\n }\n}\nexport default Registry;\n//# sourceMappingURL=Registry.mjs.map" + "source": "import Promise from '../shim/Promise';\nimport Map from '../shim/Map';\nimport Symbol from '../shim/Symbol';\nimport { Evented } from '../core/Evented';\n/**\n * Widget base symbol type\n */\nexport const WIDGET_BASE_TYPE = Symbol('Widget Base');\n/**\n * Checks is the item is a subclass of WidgetBase (or a WidgetBase)\n *\n * @param item the item to check\n * @returns true/false indicating if the item is a WidgetBaseConstructor\n */\nexport function isWidgetBaseConstructor(item) {\n return Boolean(item && item._type === WIDGET_BASE_TYPE);\n}\nexport function isWidgetConstructorDefaultExport(item) {\n return Boolean(item &&\n item.hasOwnProperty('__esModule') &&\n item.hasOwnProperty('default') &&\n isWidgetBaseConstructor(item.default));\n}\n/**\n * The Registry implementation\n */\nexport class Registry extends Evented {\n /**\n * Emit loaded event for registry label\n */\n emitLoadedEvent(widgetLabel, item) {\n this.emit({\n type: widgetLabel,\n action: 'loaded',\n item\n });\n }\n define(label, item) {\n if (this._widgetRegistry === undefined) {\n this._widgetRegistry = new Map();\n }\n if (this._widgetRegistry.has(label)) {\n throw new Error(`widget has already been registered for '${label.toString()}'`);\n }\n this._widgetRegistry.set(label, item);\n if (item instanceof Promise) {\n item.then((widgetCtor) => {\n this._widgetRegistry.set(label, widgetCtor);\n this.emitLoadedEvent(label, widgetCtor);\n return widgetCtor;\n }, (error) => {\n throw error;\n });\n }\n else if (isWidgetBaseConstructor(item)) {\n this.emitLoadedEvent(label, item);\n }\n }\n defineInjector(label, injectorFactory) {\n if (this._injectorRegistry === undefined) {\n this._injectorRegistry = new Map();\n }\n if (this._injectorRegistry.has(label)) {\n throw new Error(`injector has already been registered for '${label.toString()}'`);\n }\n const invalidator = new Evented();\n const injectorItem = {\n injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })),\n invalidator\n };\n this._injectorRegistry.set(label, injectorItem);\n this.emitLoadedEvent(label, injectorItem);\n }\n get(label) {\n if (!this._widgetRegistry || !this.has(label)) {\n return null;\n }\n const item = this._widgetRegistry.get(label);\n if (isWidgetBaseConstructor(item)) {\n return item;\n }\n if (item instanceof Promise) {\n return null;\n }\n const promise = item();\n this._widgetRegistry.set(label, promise);\n promise.then((widgetCtor) => {\n if (isWidgetConstructorDefaultExport(widgetCtor)) {\n widgetCtor = widgetCtor.default;\n }\n this._widgetRegistry.set(label, widgetCtor);\n this.emitLoadedEvent(label, widgetCtor);\n return widgetCtor;\n }, (error) => {\n throw error;\n });\n return null;\n }\n getInjector(label) {\n if (!this._injectorRegistry || !this.hasInjector(label)) {\n return null;\n }\n return this._injectorRegistry.get(label);\n }\n has(label) {\n return Boolean(this._widgetRegistry && this._widgetRegistry.has(label));\n }\n hasInjector(label) {\n return Boolean(this._injectorRegistry && this._injectorRegistry.has(label));\n }\n}\nexport default Registry;\n//# sourceMappingURL=Registry.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/RegistryHandler.mjs", - "name": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "id": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "name": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "index": 27, "index2": 21, - "size": 2862, + "size": 2856, "cacheable": true, "built": true, "optional": false, @@ -1458,18 +1458,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./RegistryHandler", "loc": "6:0-48" @@ -1484,15 +1484,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { Map } from '@dojo/shim/Map';\nimport { Evented } from '@dojo/core/Evented';\nimport { Registry } from './Registry';\nexport class RegistryHandler extends Evented {\n constructor() {\n super();\n this._registry = new Registry();\n this._registryWidgetLabelMap = new Map();\n this._registryInjectorLabelMap = new Map();\n this.own(this._registry);\n const destroy = () => {\n if (this.baseRegistry) {\n this._registryWidgetLabelMap.delete(this.baseRegistry);\n this._registryInjectorLabelMap.delete(this.baseRegistry);\n this.baseRegistry = undefined;\n }\n };\n this.own({ destroy });\n }\n set base(baseRegistry) {\n if (this.baseRegistry) {\n this._registryWidgetLabelMap.delete(this.baseRegistry);\n this._registryInjectorLabelMap.delete(this.baseRegistry);\n }\n this.baseRegistry = baseRegistry;\n }\n define(label, widget) {\n this._registry.define(label, widget);\n }\n defineInjector(label, injector) {\n this._registry.defineInjector(label, injector);\n }\n has(label) {\n return this._registry.has(label) || Boolean(this.baseRegistry && this.baseRegistry.has(label));\n }\n hasInjector(label) {\n return this._registry.hasInjector(label) || Boolean(this.baseRegistry && this.baseRegistry.hasInjector(label));\n }\n get(label, globalPrecedence = false) {\n return this._get(label, globalPrecedence, 'get', this._registryWidgetLabelMap);\n }\n getInjector(label, globalPrecedence = false) {\n return this._get(label, globalPrecedence, 'getInjector', this._registryInjectorLabelMap);\n }\n _get(label, globalPrecedence, getFunctionName, labelMap) {\n const registries = globalPrecedence ? [this.baseRegistry, this._registry] : [this._registry, this.baseRegistry];\n for (let i = 0; i < registries.length; i++) {\n const registry = registries[i];\n if (!registry) {\n continue;\n }\n const item = registry[getFunctionName](label);\n const registeredLabels = labelMap.get(registry) || [];\n if (item) {\n return item;\n }\n else if (registeredLabels.indexOf(label) === -1) {\n const handle = registry.on(label, (event) => {\n if (event.action === 'loaded' &&\n this[getFunctionName](label, globalPrecedence) === event.item) {\n this.emit({ type: 'invalidate' });\n }\n });\n this.own(handle);\n labelMap.set(registry, [...registeredLabels, label]);\n }\n }\n return null;\n }\n}\nexport default RegistryHandler;\n//# sourceMappingURL=RegistryHandler.mjs.map" + "source": "import { Map } from '../shim/Map';\nimport { Evented } from '../core/Evented';\nimport { Registry } from './Registry';\nexport class RegistryHandler extends Evented {\n constructor() {\n super();\n this._registry = new Registry();\n this._registryWidgetLabelMap = new Map();\n this._registryInjectorLabelMap = new Map();\n this.own(this._registry);\n const destroy = () => {\n if (this.baseRegistry) {\n this._registryWidgetLabelMap.delete(this.baseRegistry);\n this._registryInjectorLabelMap.delete(this.baseRegistry);\n this.baseRegistry = undefined;\n }\n };\n this.own({ destroy });\n }\n set base(baseRegistry) {\n if (this.baseRegistry) {\n this._registryWidgetLabelMap.delete(this.baseRegistry);\n this._registryInjectorLabelMap.delete(this.baseRegistry);\n }\n this.baseRegistry = baseRegistry;\n }\n define(label, widget) {\n this._registry.define(label, widget);\n }\n defineInjector(label, injector) {\n this._registry.defineInjector(label, injector);\n }\n has(label) {\n return this._registry.has(label) || Boolean(this.baseRegistry && this.baseRegistry.has(label));\n }\n hasInjector(label) {\n return this._registry.hasInjector(label) || Boolean(this.baseRegistry && this.baseRegistry.hasInjector(label));\n }\n get(label, globalPrecedence = false) {\n return this._get(label, globalPrecedence, 'get', this._registryWidgetLabelMap);\n }\n getInjector(label, globalPrecedence = false) {\n return this._get(label, globalPrecedence, 'getInjector', this._registryInjectorLabelMap);\n }\n _get(label, globalPrecedence, getFunctionName, labelMap) {\n const registries = globalPrecedence ? [this.baseRegistry, this._registry] : [this._registry, this.baseRegistry];\n for (let i = 0; i < registries.length; i++) {\n const registry = registries[i];\n if (!registry) {\n continue;\n }\n const item = registry[getFunctionName](label);\n const registeredLabels = labelMap.get(registry) || [];\n if (item) {\n return item;\n }\n else if (registeredLabels.indexOf(label) === -1) {\n const handle = registry.on(label, (event) => {\n if (event.action === 'loaded' &&\n this[getFunctionName](label, globalPrecedence) === event.item) {\n this.emit({ type: 'invalidate' });\n }\n });\n this.own(handle);\n labelMap.set(registry, [...registeredLabels, label]);\n }\n }\n return null;\n }\n}\nexport default RegistryHandler;\n//# sourceMappingURL=RegistryHandler.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "name": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "id": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "name": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "index": 14, "index2": 26, - "size": 14386, + "size": 13720, "cacheable": true, "built": true, "optional": false, @@ -1501,18 +1501,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./WidgetBase", "loc": "2:0-50" @@ -1523,8 +1523,8 @@ "module": "./src/menu/Menu.ts", "moduleName": "./src/menu/Menu.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/WidgetBase", - "loc": "5:0-58" + "userRequest": "@dojo/framework/widget-core/WidgetBase", + "loc": "5:0-68" } ], "usedExports": [ @@ -1538,12 +1538,12 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import Map from '@dojo/shim/Map';\nimport WeakMap from '@dojo/shim/WeakMap';\nimport Symbol from '@dojo/shim/Symbol';\nimport { v } from './d';\nimport { auto } from './diff';\nimport RegistryHandler from './RegistryHandler';\nimport NodeHandler from './NodeHandler';\nimport { widgetInstanceMap } from './vdom';\nimport { isWidgetBaseConstructor, WIDGET_BASE_TYPE } from './Registry';\nconst decoratorMap = new Map();\nconst boundAuto = auto.bind(null);\nexport const noBind = Symbol.for('dojoNoBind');\n/**\n * Main widget base for all widgets to extend\n */\nexport class WidgetBase {\n /**\n * @constructor\n */\n constructor() {\n /**\n * Indicates if it is the initial set properties cycle\n */\n this._initialProperties = true;\n /**\n * Array of property keys considered changed from the previous set properties\n */\n this._changedPropertyKeys = [];\n this._nodeHandler = new NodeHandler();\n this._handles = [];\n this._children = [];\n this._decoratorCache = new Map();\n this._properties = {};\n this._boundRenderFunc = this.render.bind(this);\n this._boundInvalidate = this.invalidate.bind(this);\n widgetInstanceMap.set(this, {\n dirty: true,\n onAttach: () => {\n this.onAttach();\n },\n onDetach: () => {\n this.onDetach();\n this.destroy();\n },\n nodeHandler: this._nodeHandler,\n registry: () => {\n return this.registry;\n },\n coreProperties: {},\n rendering: false,\n inputProperties: {}\n });\n this._runAfterConstructors();\n }\n meta(MetaType) {\n if (this._metaMap === undefined) {\n this._metaMap = new Map();\n }\n let cached = this._metaMap.get(MetaType);\n if (!cached) {\n cached = new MetaType({\n invalidate: this._boundInvalidate,\n nodeHandler: this._nodeHandler,\n bind: this\n });\n this.own(cached);\n this._metaMap.set(MetaType, cached);\n }\n return cached;\n }\n onAttach() {\n // Do nothing by default.\n }\n onDetach() {\n // Do nothing by default.\n }\n get properties() {\n return this._properties;\n }\n get changedPropertyKeys() {\n return [...this._changedPropertyKeys];\n }\n __setCoreProperties__(coreProperties) {\n const { baseRegistry } = coreProperties;\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.coreProperties.baseRegistry !== baseRegistry) {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n this._registry.base = baseRegistry;\n this.invalidate();\n }\n instanceData.coreProperties = coreProperties;\n }\n __setProperties__(originalProperties) {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.inputProperties = originalProperties;\n const properties = this._runBeforeProperties(originalProperties);\n const registeredDiffPropertyNames = this.getDecorator('registeredDiffProperty');\n const changedPropertyKeys = [];\n const propertyNames = Object.keys(properties);\n if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) {\n const allProperties = [...propertyNames, ...Object.keys(this._properties)];\n const checkedProperties = [];\n const diffPropertyResults = {};\n let runReactions = false;\n for (let i = 0; i < allProperties.length; i++) {\n const propertyName = allProperties[i];\n if (checkedProperties.indexOf(propertyName) !== -1) {\n continue;\n }\n checkedProperties.push(propertyName);\n const previousProperty = this._properties[propertyName];\n const newProperty = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n if (registeredDiffPropertyNames.indexOf(propertyName) !== -1) {\n runReactions = true;\n const diffFunctions = this.getDecorator(`diffProperty:${propertyName}`);\n for (let i = 0; i < diffFunctions.length; i++) {\n const result = diffFunctions[i](previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n else {\n const result = boundAuto(previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n if (runReactions) {\n this._mapDiffPropertyReactions(properties, changedPropertyKeys).forEach((args, reaction) => {\n if (args.changed) {\n reaction.call(this, args.previousProperties, args.newProperties);\n }\n });\n }\n this._properties = diffPropertyResults;\n this._changedPropertyKeys = changedPropertyKeys;\n }\n else {\n this._initialProperties = false;\n for (let i = 0; i < propertyNames.length; i++) {\n const propertyName = propertyNames[i];\n if (typeof properties[propertyName] === 'function') {\n properties[propertyName] = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n }\n else {\n changedPropertyKeys.push(propertyName);\n }\n }\n this._changedPropertyKeys = changedPropertyKeys;\n this._properties = Object.assign({}, properties);\n }\n if (this._changedPropertyKeys.length > 0) {\n this.invalidate();\n }\n }\n get children() {\n return this._children;\n }\n __setChildren__(children) {\n if (this._children.length > 0 || children.length > 0) {\n this._children = children;\n this.invalidate();\n }\n }\n __render__() {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.dirty = false;\n const render = this._runBeforeRenders();\n let dNode = render();\n dNode = this.runAfterRenders(dNode);\n this._nodeHandler.clear();\n return dNode;\n }\n invalidate() {\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.invalidate) {\n instanceData.invalidate();\n }\n }\n render() {\n return v('div', {}, this.children);\n }\n /**\n * Function to add decorators to WidgetBase\n *\n * @param decoratorKey The key of the decorator\n * @param value The value of the decorator\n */\n addDecorator(decoratorKey, value) {\n value = Array.isArray(value) ? value : [value];\n if (this.hasOwnProperty('constructor')) {\n let decoratorList = decoratorMap.get(this.constructor);\n if (!decoratorList) {\n decoratorList = new Map();\n decoratorMap.set(this.constructor, decoratorList);\n }\n let specificDecoratorList = decoratorList.get(decoratorKey);\n if (!specificDecoratorList) {\n specificDecoratorList = [];\n decoratorList.set(decoratorKey, specificDecoratorList);\n }\n specificDecoratorList.push(...value);\n }\n else {\n const decorators = this.getDecorator(decoratorKey);\n this._decoratorCache.set(decoratorKey, [...decorators, ...value]);\n }\n }\n /**\n * Function to build the list of decorators from the global decorator map.\n *\n * @param decoratorKey The key of the decorator\n * @return An array of decorator values\n * @private\n */\n _buildDecoratorList(decoratorKey) {\n const allDecorators = [];\n let constructor = this.constructor;\n while (constructor) {\n const instanceMap = decoratorMap.get(constructor);\n if (instanceMap) {\n const decorators = instanceMap.get(decoratorKey);\n if (decorators) {\n allDecorators.unshift(...decorators);\n }\n }\n constructor = Object.getPrototypeOf(constructor);\n }\n return allDecorators;\n }\n /**\n * Function to retrieve decorator values\n *\n * @param decoratorKey The key of the decorator\n * @returns An array of decorator values\n */\n getDecorator(decoratorKey) {\n let allDecorators = this._decoratorCache.get(decoratorKey);\n if (allDecorators !== undefined) {\n return allDecorators;\n }\n allDecorators = this._buildDecoratorList(decoratorKey);\n this._decoratorCache.set(decoratorKey, allDecorators);\n return allDecorators;\n }\n _mapDiffPropertyReactions(newProperties, changedPropertyKeys) {\n const reactionFunctions = this.getDecorator('diffReaction');\n return reactionFunctions.reduce((reactionPropertyMap, { reaction, propertyName }) => {\n let reactionArguments = reactionPropertyMap.get(reaction);\n if (reactionArguments === undefined) {\n reactionArguments = {\n previousProperties: {},\n newProperties: {},\n changed: false\n };\n }\n reactionArguments.previousProperties[propertyName] = this._properties[propertyName];\n reactionArguments.newProperties[propertyName] = newProperties[propertyName];\n if (changedPropertyKeys.indexOf(propertyName) !== -1) {\n reactionArguments.changed = true;\n }\n reactionPropertyMap.set(reaction, reactionArguments);\n return reactionPropertyMap;\n }, new Map());\n }\n /**\n * Binds unbound property functions to the specified `bind` property\n *\n * @param properties properties to check for functions\n */\n _bindFunctionProperty(property, bind) {\n if (typeof property === 'function' && !property[noBind] && isWidgetBaseConstructor(property) === false) {\n if (this._bindFunctionPropertyMap === undefined) {\n this._bindFunctionPropertyMap = new WeakMap();\n }\n const bindInfo = this._bindFunctionPropertyMap.get(property) || {};\n let { boundFunc, scope } = bindInfo;\n if (boundFunc === undefined || scope !== bind) {\n boundFunc = property.bind(bind);\n this._bindFunctionPropertyMap.set(property, { boundFunc, scope: bind });\n }\n return boundFunc;\n }\n return property;\n }\n get registry() {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n return this._registry;\n }\n _runBeforeProperties(properties) {\n const beforeProperties = this.getDecorator('beforeProperties');\n if (beforeProperties.length > 0) {\n return beforeProperties.reduce((properties, beforePropertiesFunction) => {\n return Object.assign({}, properties, beforePropertiesFunction.call(this, properties));\n }, Object.assign({}, properties));\n }\n return properties;\n }\n /**\n * Run all registered before renders and return the updated render method\n */\n _runBeforeRenders() {\n const beforeRenders = this.getDecorator('beforeRender');\n if (beforeRenders.length > 0) {\n return beforeRenders.reduce((render, beforeRenderFunction) => {\n const updatedRender = beforeRenderFunction.call(this, render, this._properties, this._children);\n if (!updatedRender) {\n console.warn('Render function not returned from beforeRender, using previous render');\n return render;\n }\n return updatedRender;\n }, this._boundRenderFunc);\n }\n return this._boundRenderFunc;\n }\n /**\n * Run all registered after renders and return the decorated DNodes\n *\n * @param dNode The DNodes to run through the after renders\n */\n runAfterRenders(dNode) {\n const afterRenders = this.getDecorator('afterRender');\n if (afterRenders.length > 0) {\n return afterRenders.reduce((dNode, afterRenderFunction) => {\n return afterRenderFunction.call(this, dNode);\n }, dNode);\n }\n if (this._metaMap !== undefined) {\n this._metaMap.forEach((meta) => {\n meta.afterRender();\n });\n }\n return dNode;\n }\n _runAfterConstructors() {\n const afterConstructors = this.getDecorator('afterConstructor');\n if (afterConstructors.length > 0) {\n afterConstructors.forEach((afterConstructor) => afterConstructor.call(this));\n }\n }\n own(handle) {\n this._handles.push(handle);\n }\n destroy() {\n while (this._handles.length > 0) {\n const handle = this._handles.pop();\n if (handle) {\n handle.destroy();\n }\n }\n }\n}\n/**\n * static identifier\n */\nWidgetBase._type = WIDGET_BASE_TYPE;\nexport default WidgetBase;\n//# sourceMappingURL=WidgetBase.mjs.map" + "source": "import Map from '../shim/Map';\nimport WeakMap from '../shim/WeakMap';\nimport Symbol from '../shim/Symbol';\nimport { v } from './d';\nimport { auto } from './diff';\nimport RegistryHandler from './RegistryHandler';\nimport NodeHandler from './NodeHandler';\nimport { widgetInstanceMap } from './vdom';\nimport { isWidgetBaseConstructor, WIDGET_BASE_TYPE } from './Registry';\nconst decoratorMap = new Map();\nconst boundAuto = auto.bind(null);\nexport const noBind = Symbol.for('dojoNoBind');\n/**\n * Main widget base for all widgets to extend\n */\nexport class WidgetBase {\n /**\n * @constructor\n */\n constructor() {\n /**\n * Indicates if it is the initial set properties cycle\n */\n this._initialProperties = true;\n /**\n * Array of property keys considered changed from the previous set properties\n */\n this._changedPropertyKeys = [];\n this._nodeHandler = new NodeHandler();\n this._handles = [];\n this._children = [];\n this._decoratorCache = new Map();\n this._properties = {};\n this._boundRenderFunc = this.render.bind(this);\n this._boundInvalidate = this.invalidate.bind(this);\n widgetInstanceMap.set(this, {\n dirty: true,\n onAttach: () => {\n this.onAttach();\n },\n onDetach: () => {\n this.onDetach();\n this.destroy();\n },\n nodeHandler: this._nodeHandler,\n registry: () => {\n return this.registry;\n },\n coreProperties: {},\n rendering: false,\n inputProperties: {}\n });\n this._runAfterConstructors();\n }\n meta(MetaType) {\n if (this._metaMap === undefined) {\n this._metaMap = new Map();\n }\n let cached = this._metaMap.get(MetaType);\n if (!cached) {\n cached = new MetaType({\n invalidate: this._boundInvalidate,\n nodeHandler: this._nodeHandler,\n bind: this\n });\n this.own(cached);\n this._metaMap.set(MetaType, cached);\n }\n return cached;\n }\n onAttach() {\n // Do nothing by default.\n }\n onDetach() {\n // Do nothing by default.\n }\n get properties() {\n return this._properties;\n }\n get changedPropertyKeys() {\n return [...this._changedPropertyKeys];\n }\n __setCoreProperties__(coreProperties) {\n const { baseRegistry } = coreProperties;\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.coreProperties.baseRegistry !== baseRegistry) {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n this._registry.base = baseRegistry;\n this.invalidate();\n }\n instanceData.coreProperties = coreProperties;\n }\n __setProperties__(originalProperties) {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.inputProperties = originalProperties;\n const properties = this._runBeforeProperties(originalProperties);\n const registeredDiffPropertyNames = this.getDecorator('registeredDiffProperty');\n const changedPropertyKeys = [];\n const propertyNames = Object.keys(properties);\n if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) {\n const allProperties = [...propertyNames, ...Object.keys(this._properties)];\n const checkedProperties = [];\n const diffPropertyResults = {};\n let runReactions = false;\n for (let i = 0; i < allProperties.length; i++) {\n const propertyName = allProperties[i];\n if (checkedProperties.indexOf(propertyName) !== -1) {\n continue;\n }\n checkedProperties.push(propertyName);\n const previousProperty = this._properties[propertyName];\n const newProperty = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n if (registeredDiffPropertyNames.indexOf(propertyName) !== -1) {\n runReactions = true;\n const diffFunctions = this.getDecorator(`diffProperty:${propertyName}`);\n for (let i = 0; i < diffFunctions.length; i++) {\n const result = diffFunctions[i](previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n else {\n const result = boundAuto(previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n if (runReactions) {\n const reactionFunctions = this.getDecorator('diffReaction');\n const executedReactions = [];\n reactionFunctions.forEach(({ reaction, propertyName }) => {\n const propertyChanged = changedPropertyKeys.indexOf(propertyName) !== -1;\n const reactionRun = executedReactions.indexOf(reaction) !== -1;\n if (propertyChanged && !reactionRun) {\n reaction.call(this, this._properties, diffPropertyResults);\n executedReactions.push(reaction);\n }\n });\n }\n this._properties = diffPropertyResults;\n this._changedPropertyKeys = changedPropertyKeys;\n }\n else {\n this._initialProperties = false;\n for (let i = 0; i < propertyNames.length; i++) {\n const propertyName = propertyNames[i];\n if (typeof properties[propertyName] === 'function') {\n properties[propertyName] = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n }\n else {\n changedPropertyKeys.push(propertyName);\n }\n }\n this._changedPropertyKeys = changedPropertyKeys;\n this._properties = Object.assign({}, properties);\n }\n if (this._changedPropertyKeys.length > 0) {\n this.invalidate();\n }\n }\n get children() {\n return this._children;\n }\n __setChildren__(children) {\n if (this._children.length > 0 || children.length > 0) {\n this._children = children;\n this.invalidate();\n }\n }\n __render__() {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.dirty = false;\n const render = this._runBeforeRenders();\n let dNode = render();\n dNode = this.runAfterRenders(dNode);\n this._nodeHandler.clear();\n return dNode;\n }\n invalidate() {\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.invalidate) {\n instanceData.invalidate();\n }\n }\n render() {\n return v('div', {}, this.children);\n }\n /**\n * Function to add decorators to WidgetBase\n *\n * @param decoratorKey The key of the decorator\n * @param value The value of the decorator\n */\n addDecorator(decoratorKey, value) {\n value = Array.isArray(value) ? value : [value];\n if (this.hasOwnProperty('constructor')) {\n let decoratorList = decoratorMap.get(this.constructor);\n if (!decoratorList) {\n decoratorList = new Map();\n decoratorMap.set(this.constructor, decoratorList);\n }\n let specificDecoratorList = decoratorList.get(decoratorKey);\n if (!specificDecoratorList) {\n specificDecoratorList = [];\n decoratorList.set(decoratorKey, specificDecoratorList);\n }\n specificDecoratorList.push(...value);\n }\n else {\n const decorators = this.getDecorator(decoratorKey);\n this._decoratorCache.set(decoratorKey, [...decorators, ...value]);\n }\n }\n /**\n * Function to build the list of decorators from the global decorator map.\n *\n * @param decoratorKey The key of the decorator\n * @return An array of decorator values\n * @private\n */\n _buildDecoratorList(decoratorKey) {\n const allDecorators = [];\n let constructor = this.constructor;\n while (constructor) {\n const instanceMap = decoratorMap.get(constructor);\n if (instanceMap) {\n const decorators = instanceMap.get(decoratorKey);\n if (decorators) {\n allDecorators.unshift(...decorators);\n }\n }\n constructor = Object.getPrototypeOf(constructor);\n }\n return allDecorators;\n }\n /**\n * Function to retrieve decorator values\n *\n * @param decoratorKey The key of the decorator\n * @returns An array of decorator values\n */\n getDecorator(decoratorKey) {\n let allDecorators = this._decoratorCache.get(decoratorKey);\n if (allDecorators !== undefined) {\n return allDecorators;\n }\n allDecorators = this._buildDecoratorList(decoratorKey);\n this._decoratorCache.set(decoratorKey, allDecorators);\n return allDecorators;\n }\n /**\n * Binds unbound property functions to the specified `bind` property\n *\n * @param properties properties to check for functions\n */\n _bindFunctionProperty(property, bind) {\n if (typeof property === 'function' && !property[noBind] && isWidgetBaseConstructor(property) === false) {\n if (this._bindFunctionPropertyMap === undefined) {\n this._bindFunctionPropertyMap = new WeakMap();\n }\n const bindInfo = this._bindFunctionPropertyMap.get(property) || {};\n let { boundFunc, scope } = bindInfo;\n if (boundFunc === undefined || scope !== bind) {\n boundFunc = property.bind(bind);\n this._bindFunctionPropertyMap.set(property, { boundFunc, scope: bind });\n }\n return boundFunc;\n }\n return property;\n }\n get registry() {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n return this._registry;\n }\n _runBeforeProperties(properties) {\n const beforeProperties = this.getDecorator('beforeProperties');\n if (beforeProperties.length > 0) {\n return beforeProperties.reduce((properties, beforePropertiesFunction) => {\n return Object.assign({}, properties, beforePropertiesFunction.call(this, properties));\n }, Object.assign({}, properties));\n }\n return properties;\n }\n /**\n * Run all registered before renders and return the updated render method\n */\n _runBeforeRenders() {\n const beforeRenders = this.getDecorator('beforeRender');\n if (beforeRenders.length > 0) {\n return beforeRenders.reduce((render, beforeRenderFunction) => {\n const updatedRender = beforeRenderFunction.call(this, render, this._properties, this._children);\n if (!updatedRender) {\n console.warn('Render function not returned from beforeRender, using previous render');\n return render;\n }\n return updatedRender;\n }, this._boundRenderFunc);\n }\n return this._boundRenderFunc;\n }\n /**\n * Run all registered after renders and return the decorated DNodes\n *\n * @param dNode The DNodes to run through the after renders\n */\n runAfterRenders(dNode) {\n const afterRenders = this.getDecorator('afterRender');\n if (afterRenders.length > 0) {\n dNode = afterRenders.reduce((dNode, afterRenderFunction) => {\n return afterRenderFunction.call(this, dNode);\n }, dNode);\n }\n if (this._metaMap !== undefined) {\n this._metaMap.forEach((meta) => {\n meta.afterRender();\n });\n }\n return dNode;\n }\n _runAfterConstructors() {\n const afterConstructors = this.getDecorator('afterConstructor');\n if (afterConstructors.length > 0) {\n afterConstructors.forEach((afterConstructor) => afterConstructor.call(this));\n }\n }\n own(handle) {\n this._handles.push(handle);\n }\n destroy() {\n while (this._handles.length > 0) {\n const handle = this._handles.pop();\n if (handle) {\n handle.destroy();\n }\n }\n }\n}\n/**\n * static identifier\n */\nWidgetBase._type = WIDGET_BASE_TYPE;\nexport default WidgetBase;\n//# sourceMappingURL=WidgetBase.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/animations/cssTransitions.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/animations/cssTransitions.mjs", - "name": "./node_modules/@dojo/widget-core/animations/cssTransitions.mjs", + "id": "./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs", + "name": "./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs", "index": 33, "index2": 27, "size": 2288, @@ -1555,18 +1555,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "../animations/cssTransitions", "loc": "3:0-58" @@ -1583,12 +1583,12 @@ "source": "let browserSpecificTransitionEndEventName = '';\nlet browserSpecificAnimationEndEventName = '';\nfunction determineBrowserStyleNames(element) {\n if ('WebkitTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'webkitTransitionEnd';\n browserSpecificAnimationEndEventName = 'webkitAnimationEnd';\n }\n else if ('transition' in element.style || 'MozTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'transitionend';\n browserSpecificAnimationEndEventName = 'animationend';\n }\n else {\n throw new Error('Your browser is not supported');\n }\n}\nfunction initialize(element) {\n if (browserSpecificAnimationEndEventName === '') {\n determineBrowserStyleNames(element);\n }\n}\nfunction runAndCleanUp(element, startAnimation, finishAnimation) {\n initialize(element);\n let finished = false;\n let transitionEnd = function () {\n if (!finished) {\n finished = true;\n element.removeEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n element.removeEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n finishAnimation();\n }\n };\n startAnimation();\n element.addEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n element.addEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n}\nfunction exit(node, properties, exitAnimation, removeNode) {\n const activeClass = properties.exitAnimationActive || `${exitAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(exitAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n removeNode();\n });\n}\nfunction enter(node, properties, enterAnimation) {\n const activeClass = properties.enterAnimationActive || `${enterAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(enterAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n node.classList.remove(enterAnimation);\n node.classList.remove(activeClass);\n });\n}\nexport default {\n enter,\n exit\n};\n//# sourceMappingURL=cssTransitions.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/d.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/d.mjs", - "name": "./node_modules/@dojo/widget-core/d.mjs", + "id": "./node_modules/@dojo/framework/widget-core/d.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/d.mjs", + "name": "./node_modules/@dojo/framework/widget-core/d.mjs", "index": 4, "index2": 8, - "size": 3270, + "size": 3267, "cacheable": true, "built": true, "optional": false, @@ -1597,54 +1597,54 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./d", "loc": "5:0-29" }, { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./d", "loc": "4:0-24" }, - { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "type": "harmony import", - "userRequest": "./../d", - "loc": "5:0-27" - }, { "moduleId": "./src/menu/Menu.ts", "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--3-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/umd-compat-loader/index.js??ref--3-1!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/ts-loader/index.js??ref--3-2!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/css-module-dts-loader/index.js?type=ts&instanceName=0_menu!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu/Menu.ts", "module": "./src/menu/Menu.ts", "moduleName": "./src/menu/Menu.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/d", - "loc": "2:0-40" + "userRequest": "@dojo/framework/widget-core/d", + "loc": "2:0-50" + }, + { + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "type": "harmony import", + "userRequest": "./../d", + "loc": "5:0-27" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", "userRequest": "./d", "loc": "3:0-65" @@ -1675,12 +1675,12 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import Symbol from '@dojo/shim/Symbol';\n/**\n * The symbol identifier for a WNode type\n */\nexport const WNODE = Symbol('Identifier for a WNode.');\n/**\n * The symbol identifier for a VNode type\n */\nexport const VNODE = Symbol('Identifier for a VNode.');\n/**\n * The symbol identifier for a VNode type created using dom()\n */\nexport const DOMVNODE = Symbol('Identifier for a VNode created using existing dom.');\n/**\n * Helper function that returns true if the `DNode` is a `WNode` using the `type` property\n */\nexport function isWNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === WNODE);\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` using the `type` property\n */\nexport function isVNode(child) {\n return Boolean(child && typeof child !== 'string' && (child.type === VNODE || child.type === DOMVNODE));\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` created with `dom()` using the `type` property\n */\nexport function isDomVNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === DOMVNODE);\n}\nexport function isElementNode(value) {\n return !!value.tagName;\n}\nexport function decorate(dNodes, optionsOrModifier, predicate) {\n let shallow = false;\n let modifier;\n if (typeof optionsOrModifier === 'function') {\n modifier = optionsOrModifier;\n }\n else {\n modifier = optionsOrModifier.modifier;\n predicate = optionsOrModifier.predicate;\n shallow = optionsOrModifier.shallow || false;\n }\n let nodes = Array.isArray(dNodes) ? [...dNodes] : [dNodes];\n function breaker() {\n nodes = [];\n }\n while (nodes.length) {\n const node = nodes.shift();\n if (node) {\n if (!shallow && (isWNode(node) || isVNode(node)) && node.children) {\n nodes = [...nodes, ...node.children];\n }\n if (!predicate || predicate(node)) {\n modifier(node, breaker);\n }\n }\n }\n return dNodes;\n}\n/**\n * Wrapper function for calls to create a widget.\n */\nexport function w(widgetConstructor, properties, children = []) {\n return {\n children,\n widgetConstructor,\n properties,\n type: WNODE\n };\n}\nexport function v(tag, propertiesOrChildren = {}, children = undefined) {\n let properties = propertiesOrChildren;\n let deferredPropertiesCallback;\n if (Array.isArray(propertiesOrChildren)) {\n children = propertiesOrChildren;\n properties = {};\n }\n if (typeof properties === 'function') {\n deferredPropertiesCallback = properties;\n properties = {};\n }\n return {\n tag,\n deferredPropertiesCallback,\n children,\n properties,\n type: VNODE\n };\n}\n/**\n * Create a VNode for an existing DOM Node.\n */\nexport function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, children) {\n return {\n tag: isElementNode(node) ? node.tagName.toLowerCase() : '',\n properties: props,\n attributes: attrs,\n events: on,\n children,\n type: DOMVNODE,\n domNode: node,\n text: isElementNode(node) ? undefined : node.data,\n diffType\n };\n}\n//# sourceMappingURL=d.mjs.map" + "source": "import Symbol from '../shim/Symbol';\n/**\n * The symbol identifier for a WNode type\n */\nexport const WNODE = Symbol('Identifier for a WNode.');\n/**\n * The symbol identifier for a VNode type\n */\nexport const VNODE = Symbol('Identifier for a VNode.');\n/**\n * The symbol identifier for a VNode type created using dom()\n */\nexport const DOMVNODE = Symbol('Identifier for a VNode created using existing dom.');\n/**\n * Helper function that returns true if the `DNode` is a `WNode` using the `type` property\n */\nexport function isWNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === WNODE);\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` using the `type` property\n */\nexport function isVNode(child) {\n return Boolean(child && typeof child !== 'string' && (child.type === VNODE || child.type === DOMVNODE));\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` created with `dom()` using the `type` property\n */\nexport function isDomVNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === DOMVNODE);\n}\nexport function isElementNode(value) {\n return !!value.tagName;\n}\nexport function decorate(dNodes, optionsOrModifier, predicate) {\n let shallow = false;\n let modifier;\n if (typeof optionsOrModifier === 'function') {\n modifier = optionsOrModifier;\n }\n else {\n modifier = optionsOrModifier.modifier;\n predicate = optionsOrModifier.predicate;\n shallow = optionsOrModifier.shallow || false;\n }\n let nodes = Array.isArray(dNodes) ? [...dNodes] : [dNodes];\n function breaker() {\n nodes = [];\n }\n while (nodes.length) {\n const node = nodes.shift();\n if (node) {\n if (!shallow && (isWNode(node) || isVNode(node)) && node.children) {\n nodes = [...nodes, ...node.children];\n }\n if (!predicate || predicate(node)) {\n modifier(node, breaker);\n }\n }\n }\n return dNodes;\n}\n/**\n * Wrapper function for calls to create a widget.\n */\nexport function w(widgetConstructor, properties, children = []) {\n return {\n children,\n widgetConstructor,\n properties,\n type: WNODE\n };\n}\nexport function v(tag, propertiesOrChildren = {}, children = undefined) {\n let properties = propertiesOrChildren;\n let deferredPropertiesCallback;\n if (Array.isArray(propertiesOrChildren)) {\n children = propertiesOrChildren;\n properties = {};\n }\n if (typeof properties === 'function') {\n deferredPropertiesCallback = properties;\n properties = {};\n }\n return {\n tag,\n deferredPropertiesCallback,\n children,\n properties,\n type: VNODE\n };\n}\n/**\n * Create a VNode for an existing DOM Node.\n */\nexport function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, children) {\n return {\n tag: isElementNode(node) ? node.tagName.toLowerCase() : '',\n properties: props,\n attributes: attrs,\n events: on,\n children,\n type: DOMVNODE,\n domNode: node,\n text: isElementNode(node) ? undefined : node.data,\n diffType\n };\n}\n//# sourceMappingURL=d.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", "index": 34, "index2": 29, "size": 311, @@ -1692,18 +1692,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "./../decorators/afterRender", "loc": "4:0-58" @@ -1721,9 +1721,9 @@ "source": "import { handleDecorator } from './handleDecorator';\nexport function afterRender(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('afterRender', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default afterRender;\n//# sourceMappingURL=afterRender.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "index": 41, "index2": 36, "size": 365, @@ -1735,18 +1735,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./decorators/alwaysRender", "loc": "8:0-57" @@ -1764,9 +1764,9 @@ "source": "import { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\nexport function alwaysRender() {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function () {\n this.invalidate();\n })(target);\n });\n}\nexport default alwaysRender;\n//# sourceMappingURL=alwaysRender.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", "index": 39, "index2": 32, "size": 331, @@ -1778,27 +1778,27 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "issuerId": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "issuerName": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "type": "harmony import", "userRequest": "./beforeProperties", "loc": "2:0-54" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/inject.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "type": "harmony import", "userRequest": "./beforeProperties", "loc": "3:0-54" @@ -1816,9 +1816,9 @@ "source": "import { handleDecorator } from './handleDecorator';\nexport function beforeProperties(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('beforeProperties', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default beforeProperties;\n//# sourceMappingURL=beforeProperties.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/customElement.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", "index": 12, "index2": 38, "size": 728, @@ -1843,8 +1843,8 @@ "module": "./src/menu/Menu.ts", "moduleName": "./src/menu/Menu.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/decorators/customElement", - "loc": "3:0-75" + "userRequest": "@dojo/framework/widget-core/decorators/customElement", + "loc": "3:0-85" } ], "usedExports": [ @@ -1886,12 +1886,12 @@ "depth": 0 }, { - "id": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", "index": 40, "index2": 34, - "size": 973, + "size": 1014, "cacheable": true, "built": true, "optional": false, @@ -1900,18 +1900,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../decorators/diffProperty", "loc": "5:0-60" @@ -1926,12 +1926,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { handleDecorator } from './handleDecorator';\n/**\n * Decorator that can be used to register a function as a specific property diff\n *\n * @param propertyName The name of the property of which the diff function is applied\n * @param diffType The diff type, default is DiffType.AUTO.\n * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM\n */\nexport function diffProperty(propertyName, diffFunction, reactionFunction) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null));\n target.addDecorator('registeredDiffProperty', propertyName);\n if (reactionFunction || propertyKey) {\n target.addDecorator('diffReaction', {\n propertyName,\n reaction: propertyKey ? target[propertyKey] : reactionFunction\n });\n }\n });\n}\nexport default diffProperty;\n//# sourceMappingURL=diffProperty.mjs.map" + "source": "import { handleDecorator } from './handleDecorator';\nimport { auto } from './../diff';\n/**\n * Decorator that can be used to register a function as a specific property diff\n *\n * @param propertyName The name of the property of which the diff function is applied\n * @param diffType The diff type, default is DiffType.AUTO.\n * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM\n */\nexport function diffProperty(propertyName, diffFunction = auto, reactionFunction) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null));\n target.addDecorator('registeredDiffProperty', propertyName);\n if (reactionFunction || propertyKey) {\n target.addDecorator('diffReaction', {\n propertyName,\n reaction: propertyKey ? target[propertyKey] : reactionFunction\n });\n }\n });\n}\nexport default diffProperty;\n//# sourceMappingURL=diffProperty.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/handleDecorator.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs", "index": 35, "index2": 28, "size": 512, @@ -1943,63 +1943,63 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../decorators/handleDecorator", "loc": "4:0-66" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/inject.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "2:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" @@ -2017,9 +2017,9 @@ "source": "/**\n * Generic decorator handler to take care of whether or not the decorator was called at the class level\n * or the method level.\n *\n * @param handler\n */\nexport function handleDecorator(handler) {\n return function (target, propertyKey, descriptor) {\n if (typeof target === 'function') {\n handler(target.prototype, undefined);\n }\n else {\n handler(target, propertyKey);\n }\n };\n}\nexport default handleDecorator;\n//# sourceMappingURL=handleDecorator.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/inject.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "index": 38, "index2": 33, "size": 1532, @@ -2031,18 +2031,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../decorators/inject", "loc": "3:0-48" @@ -2057,12 +2057,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import WeakMap from '@dojo/shim/WeakMap';\nimport { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\n/**\n * Map of instances against registered injectors.\n */\nconst registeredInjectorsMap = new WeakMap();\n/**\n * Decorator retrieves an injector from an available registry using the name and\n * calls the `getProperties` function with the payload from the injector\n * and current properties with the the injected properties returned.\n *\n * @param InjectConfig the inject configuration\n */\nexport function inject({ name, getProperties }) {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function (properties) {\n const injectorItem = this.registry.getInjector(name);\n if (injectorItem) {\n const { injector, invalidator } = injectorItem;\n const registeredInjectors = registeredInjectorsMap.get(this) || [];\n if (registeredInjectors.length === 0) {\n registeredInjectorsMap.set(this, registeredInjectors);\n }\n if (registeredInjectors.indexOf(injectorItem) === -1) {\n this.own(invalidator.on('invalidate', () => {\n this.invalidate();\n }));\n registeredInjectors.push(injectorItem);\n }\n return getProperties(injector(), properties);\n }\n })(target);\n });\n}\nexport default inject;\n//# sourceMappingURL=inject.mjs.map" + "source": "import WeakMap from '../../shim/WeakMap';\nimport { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\n/**\n * Map of instances against registered injectors.\n */\nconst registeredInjectorsMap = new WeakMap();\n/**\n * Decorator retrieves an injector from an available registry using the name and\n * calls the `getProperties` function with the payload from the injector\n * and current properties with the the injected properties returned.\n *\n * @param InjectConfig the inject configuration\n */\nexport function inject({ name, getProperties }) {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function (properties) {\n const injectorItem = this.registry.getInjector(name);\n if (injectorItem) {\n const { injector, invalidator } = injectorItem;\n const registeredInjectors = registeredInjectorsMap.get(this) || [];\n if (registeredInjectors.length === 0) {\n registeredInjectorsMap.set(this, registeredInjectors);\n }\n if (registeredInjectors.indexOf(injectorItem) === -1) {\n this.own(invalidator.on('invalidate', () => {\n this.invalidate();\n }));\n registeredInjectors.push(injectorItem);\n }\n return getProperties(injector(), properties);\n }\n })(target);\n });\n}\nexport default inject;\n//# sourceMappingURL=inject.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/diff.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/diff.mjs", - "name": "./node_modules/@dojo/widget-core/diff.mjs", + "id": "./node_modules/@dojo/framework/widget-core/diff.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/diff.mjs", + "name": "./node_modules/@dojo/framework/widget-core/diff.mjs", "index": 20, "index2": 20, "size": 1930, @@ -2074,30 +2074,39 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./diff", "loc": "5:0-30" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../diff", "loc": "6:0-36" + }, + { + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "type": "harmony import", + "userRequest": "./../diff", + "loc": "2:0-33" } ], "usedExports": [ @@ -2116,12 +2125,12 @@ "source": "import { WIDGET_BASE_TYPE } from './Registry';\nfunction isObjectOrArray(value) {\n return Object.prototype.toString.call(value) === '[object Object]' || Array.isArray(value);\n}\nexport function always(previousProperty, newProperty) {\n return {\n changed: true,\n value: newProperty\n };\n}\nexport function ignore(previousProperty, newProperty) {\n return {\n changed: false,\n value: newProperty\n };\n}\nexport function reference(previousProperty, newProperty) {\n return {\n changed: previousProperty !== newProperty,\n value: newProperty\n };\n}\nexport function shallow(previousProperty, newProperty) {\n let changed = false;\n const validOldProperty = previousProperty && isObjectOrArray(previousProperty);\n const validNewProperty = newProperty && isObjectOrArray(newProperty);\n if (!validOldProperty || !validNewProperty) {\n return {\n changed: true,\n value: newProperty\n };\n }\n const previousKeys = Object.keys(previousProperty);\n const newKeys = Object.keys(newProperty);\n if (previousKeys.length !== newKeys.length) {\n changed = true;\n }\n else {\n changed = newKeys.some((key) => {\n return newProperty[key] !== previousProperty[key];\n });\n }\n return {\n changed,\n value: newProperty\n };\n}\nexport function auto(previousProperty, newProperty) {\n let result;\n if (typeof newProperty === 'function') {\n if (newProperty._type === WIDGET_BASE_TYPE) {\n result = reference(previousProperty, newProperty);\n }\n else {\n result = ignore(previousProperty, newProperty);\n }\n }\n else if (isObjectOrArray(newProperty)) {\n result = shallow(previousProperty, newProperty);\n }\n else {\n result = reference(previousProperty, newProperty);\n }\n return result;\n}\n//# sourceMappingURL=diff.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "name": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "id": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "name": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "index": 32, "index2": 30, - "size": 5852, + "size": 5683, "cacheable": true, "built": true, "optional": false, @@ -2130,18 +2139,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./mixins/Projector", "loc": "3:0-52" @@ -2158,15 +2167,15 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import * as tslib_1 from \"tslib\";\nimport { assign } from '@dojo/core/lang';\nimport cssTransitions from '../animations/cssTransitions';\nimport { afterRender } from './../decorators/afterRender';\nimport { v } from './../d';\nimport { dom } from './../vdom';\n/**\n * Represents the attach state of the projector\n */\nexport var ProjectorAttachState;\n(function (ProjectorAttachState) {\n ProjectorAttachState[ProjectorAttachState[\"Attached\"] = 1] = \"Attached\";\n ProjectorAttachState[ProjectorAttachState[\"Detached\"] = 2] = \"Detached\";\n})(ProjectorAttachState || (ProjectorAttachState = {}));\n/**\n * Attach type for the projector\n */\nexport var AttachType;\n(function (AttachType) {\n AttachType[AttachType[\"Append\"] = 1] = \"Append\";\n AttachType[AttachType[\"Merge\"] = 2] = \"Merge\";\n})(AttachType || (AttachType = {}));\nexport function ProjectorMixin(Base) {\n class Projector extends Base {\n constructor(...args) {\n super(...args);\n this._root = document.body;\n this._async = true;\n this._projectorProperties = {};\n this._projectionOptions = {\n transitions: cssTransitions\n };\n this.root = document.body;\n this.projectorState = ProjectorAttachState.Detached;\n }\n append(root) {\n const options = {\n type: AttachType.Append,\n root\n };\n return this._attach(options);\n }\n merge(root) {\n const options = {\n type: AttachType.Merge,\n root\n };\n return this._attach(options);\n }\n set root(root) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change root element');\n }\n this._root = root;\n }\n get root() {\n return this._root;\n }\n get async() {\n return this._async;\n }\n set async(async) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change async mode');\n }\n this._async = async;\n }\n sandbox(doc = document) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot create sandbox');\n }\n this._async = false;\n const previousRoot = this.root;\n /* free up the document fragment for GC */\n this.own({\n destroy: () => {\n this._root = previousRoot;\n }\n });\n this._attach({\n /* DocumentFragment is not assignable to Element, but provides everything needed to work */\n root: doc.createDocumentFragment(),\n type: AttachType.Append\n });\n }\n setChildren(children) {\n this.__setChildren__(children);\n }\n setProperties(properties) {\n this.__setProperties__(properties);\n }\n __setProperties__(properties) {\n if (this._projectorProperties && this._projectorProperties.registry !== properties.registry) {\n if (this._projectorProperties.registry) {\n this._projectorProperties.registry.destroy();\n }\n }\n this._projectorProperties = assign({}, properties);\n super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry });\n super.__setProperties__(properties);\n }\n toHtml() {\n if (this.projectorState !== ProjectorAttachState.Attached || !this._projection) {\n throw new Error('Projector is not attached, cannot return an HTML string of projection.');\n }\n return this._projection.domNode.childNodes[0].outerHTML;\n }\n afterRender(result) {\n let node = result;\n if (typeof result === 'string' || result === null || result === undefined) {\n node = v('span', {}, [result]);\n }\n return node;\n }\n destroy() {\n super.destroy();\n }\n _attach({ type, root }) {\n if (root) {\n this.root = root;\n }\n if (this._attachHandle) {\n return this._attachHandle;\n }\n this.projectorState = ProjectorAttachState.Attached;\n const handle = {\n destroy: () => {\n if (this.projectorState === ProjectorAttachState.Attached) {\n this._projection = undefined;\n this.projectorState = ProjectorAttachState.Detached;\n }\n }\n };\n this.own(handle);\n this._attachHandle = handle;\n this._projectionOptions = Object.assign({}, this._projectionOptions, { sync: !this._async });\n switch (type) {\n case AttachType.Append:\n this._projection = dom.append(this.root, this, this._projectionOptions);\n break;\n case AttachType.Merge:\n this._projection = dom.merge(this.root, this, this._projectionOptions);\n break;\n }\n return this._attachHandle;\n }\n }\n tslib_1.__decorate([\n afterRender(),\n tslib_1.__metadata(\"design:type\", Function),\n tslib_1.__metadata(\"design:paramtypes\", [Object]),\n tslib_1.__metadata(\"design:returntype\", void 0)\n ], Projector.prototype, \"afterRender\", null);\n return Projector;\n}\nexport default ProjectorMixin;\n//# sourceMappingURL=Projector.mjs.map" + "source": "import * as tslib_1 from \"tslib\";\nimport { assign } from '../../core/lang';\nimport cssTransitions from '../animations/cssTransitions';\nimport { afterRender } from './../decorators/afterRender';\nimport { v } from './../d';\nimport { dom } from './../vdom';\n/**\n * Represents the attach state of the projector\n */\nexport var ProjectorAttachState;\n(function (ProjectorAttachState) {\n ProjectorAttachState[ProjectorAttachState[\"Attached\"] = 1] = \"Attached\";\n ProjectorAttachState[ProjectorAttachState[\"Detached\"] = 2] = \"Detached\";\n})(ProjectorAttachState || (ProjectorAttachState = {}));\n/**\n * Attach type for the projector\n */\nexport var AttachType;\n(function (AttachType) {\n AttachType[AttachType[\"Append\"] = 1] = \"Append\";\n AttachType[AttachType[\"Merge\"] = 2] = \"Merge\";\n})(AttachType || (AttachType = {}));\nexport function ProjectorMixin(Base) {\n class Projector extends Base {\n constructor(...args) {\n super(...args);\n this._root = document.body;\n this._async = true;\n this._projectorProperties = {};\n this._projectionOptions = {\n transitions: cssTransitions\n };\n this.root = document.body;\n this.projectorState = ProjectorAttachState.Detached;\n }\n append(root) {\n const options = {\n type: AttachType.Append,\n root\n };\n return this._attach(options);\n }\n merge(root) {\n const options = {\n type: AttachType.Merge,\n root\n };\n return this._attach(options);\n }\n set root(root) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change root element');\n }\n this._root = root;\n }\n get root() {\n return this._root;\n }\n get async() {\n return this._async;\n }\n set async(async) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change async mode');\n }\n this._async = async;\n }\n sandbox(doc = document) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot create sandbox');\n }\n this._async = false;\n const previousRoot = this.root;\n /* free up the document fragment for GC */\n this.own({\n destroy: () => {\n this._root = previousRoot;\n }\n });\n this._attach({\n /* DocumentFragment is not assignable to Element, but provides everything needed to work */\n root: doc.createDocumentFragment(),\n type: AttachType.Append\n });\n }\n setChildren(children) {\n this.__setChildren__(children);\n }\n setProperties(properties) {\n this.__setProperties__(properties);\n }\n __setProperties__(properties) {\n if (this._projectorProperties && this._projectorProperties.registry !== properties.registry) {\n if (this._projectorProperties.registry) {\n this._projectorProperties.registry.destroy();\n }\n }\n this._projectorProperties = assign({}, properties);\n super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry });\n super.__setProperties__(properties);\n }\n toHtml() {\n if (this.projectorState !== ProjectorAttachState.Attached || !this._projection) {\n throw new Error('Projector is not attached, cannot return an HTML string of projection.');\n }\n return this._projection.domNode.childNodes[0].outerHTML;\n }\n afterRender(result) {\n let node = result;\n if (typeof result === 'string' || result === null || result === undefined) {\n node = v('span', {}, [result]);\n }\n return node;\n }\n destroy() {\n super.destroy();\n }\n _attach({ type, root }) {\n if (root) {\n this.root = root;\n }\n if (this._attachHandle) {\n return this._attachHandle;\n }\n this.projectorState = ProjectorAttachState.Attached;\n const handle = {\n destroy: () => {\n if (this.projectorState === ProjectorAttachState.Attached) {\n this._projection = undefined;\n this.projectorState = ProjectorAttachState.Detached;\n }\n }\n };\n this.own(handle);\n this._attachHandle = handle;\n this._projectionOptions = Object.assign({}, this._projectionOptions, { sync: !this._async });\n switch (type) {\n case AttachType.Append:\n this._projection = dom.append(this.root, this, this._projectionOptions);\n break;\n case AttachType.Merge:\n this._projection = dom.merge(this.root, this, this._projectionOptions);\n break;\n }\n return this._attachHandle;\n }\n }\n tslib_1.__decorate([\n afterRender()\n ], Projector.prototype, \"afterRender\", null);\n return Projector;\n}\nexport default ProjectorMixin;\n//# sourceMappingURL=Projector.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "name": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "id": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "name": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "index": 36, "index2": 35, - "size": 5320, + "size": 5157, "cacheable": true, "built": true, "optional": false, @@ -2175,18 +2184,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./mixins/Themed", "loc": "7:0-56" @@ -2197,8 +2206,8 @@ "module": "./src/menu/Menu.ts", "moduleName": "./src/menu/Menu.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/mixins/Themed", - "loc": "4:0-69" + "userRequest": "@dojo/framework/widget-core/mixins/Themed", + "loc": "4:0-79" } ], "usedExports": [ @@ -2215,15 +2224,15 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import * as tslib_1 from \"tslib\";\nimport { Injector } from './../Injector';\nimport { inject } from './../decorators/inject';\nimport { handleDecorator } from './../decorators/handleDecorator';\nimport { diffProperty } from './../decorators/diffProperty';\nimport { shallow } from './../diff';\nconst THEME_KEY = ' _key';\nexport const INJECTED_THEME_KEY = Symbol('theme');\n/**\n * Decorator for base css classes\n */\nexport function theme(theme) {\n return handleDecorator((target) => {\n target.addDecorator('baseThemeClasses', theme);\n });\n}\n/**\n * Creates a reverse lookup for the classes passed in via the `theme` function.\n *\n * @param classes The baseClasses object\n * @requires\n */\nfunction createThemeClassesLookup(classes) {\n return classes.reduce((currentClassNames, baseClass) => {\n Object.keys(baseClass).forEach((key) => {\n currentClassNames[baseClass[key]] = key;\n });\n return currentClassNames;\n }, {});\n}\n/**\n * Convenience function that is given a theme and an optional registry, the theme\n * injector is defined against the registry, returning the theme.\n *\n * @param theme the theme to set\n * @param themeRegistry registry to define the theme injector against. Defaults\n * to the global registry\n *\n * @returns the theme injector used to set the theme\n */\nexport function registerThemeInjector(theme, themeRegistry) {\n const themeInjector = new Injector(theme);\n themeRegistry.defineInjector(INJECTED_THEME_KEY, (invalidator) => {\n themeInjector.setInvalidator(invalidator);\n return () => themeInjector.get();\n });\n return themeInjector;\n}\n/**\n * Function that returns a class decorated with with Themed functionality\n */\nexport function ThemedMixin(Base) {\n let Themed = class Themed extends Base {\n constructor() {\n super(...arguments);\n /**\n * Registered base theme keys\n */\n this._registeredBaseThemeKeys = [];\n /**\n * Indicates if classes meta data need to be calculated.\n */\n this._recalculateClasses = true;\n /**\n * Loaded theme\n */\n this._theme = {};\n }\n theme(classes) {\n if (this._recalculateClasses) {\n this._recalculateThemeClasses();\n }\n if (Array.isArray(classes)) {\n return classes.map((className) => this._getThemeClass(className));\n }\n return this._getThemeClass(classes);\n }\n /**\n * Function fired when `theme` or `extraClasses` are changed.\n */\n onPropertiesChanged() {\n this._recalculateClasses = true;\n }\n _getThemeClass(className) {\n if (className === undefined || className === null) {\n return className;\n }\n const extraClasses = this.properties.extraClasses || {};\n const themeClassName = this._baseThemeClassesReverseLookup[className];\n let resultClassNames = [];\n if (!themeClassName) {\n console.warn(`Class name: '${className}' not found in theme`);\n return null;\n }\n if (extraClasses[themeClassName]) {\n resultClassNames.push(extraClasses[themeClassName]);\n }\n if (this._theme[themeClassName]) {\n resultClassNames.push(this._theme[themeClassName]);\n }\n else {\n resultClassNames.push(this._registeredBaseTheme[themeClassName]);\n }\n return resultClassNames.join(' ');\n }\n _recalculateThemeClasses() {\n const { theme = {} } = this.properties;\n const baseThemes = this.getDecorator('baseThemeClasses');\n if (!this._registeredBaseTheme) {\n this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => {\n const _a = THEME_KEY, key = baseTheme[_a], classes = tslib_1.__rest(baseTheme, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n this._registeredBaseThemeKeys.push(key);\n return Object.assign({}, finalBaseTheme, classes);\n }, {});\n this._baseThemeClassesReverseLookup = createThemeClassesLookup(baseThemes);\n }\n this._theme = this._registeredBaseThemeKeys.reduce((baseTheme, themeKey) => {\n return Object.assign({}, baseTheme, theme[themeKey]);\n }, {});\n this._recalculateClasses = false;\n }\n };\n tslib_1.__decorate([\n diffProperty('theme', shallow),\n diffProperty('extraClasses', shallow),\n tslib_1.__metadata(\"design:type\", Function),\n tslib_1.__metadata(\"design:paramtypes\", []),\n tslib_1.__metadata(\"design:returntype\", void 0)\n ], Themed.prototype, \"onPropertiesChanged\", null);\n Themed = tslib_1.__decorate([\n inject({\n name: INJECTED_THEME_KEY,\n getProperties: (theme, properties) => {\n if (!properties.theme) {\n return { theme };\n }\n return {};\n }\n })\n ], Themed);\n return Themed;\n}\nexport default ThemedMixin;\n//# sourceMappingURL=Themed.mjs.map" + "source": "import * as tslib_1 from \"tslib\";\nimport { Injector } from './../Injector';\nimport { inject } from './../decorators/inject';\nimport { handleDecorator } from './../decorators/handleDecorator';\nimport { diffProperty } from './../decorators/diffProperty';\nimport { shallow } from './../diff';\nconst THEME_KEY = ' _key';\nexport const INJECTED_THEME_KEY = Symbol('theme');\n/**\n * Decorator for base css classes\n */\nexport function theme(theme) {\n return handleDecorator((target) => {\n target.addDecorator('baseThemeClasses', theme);\n });\n}\n/**\n * Creates a reverse lookup for the classes passed in via the `theme` function.\n *\n * @param classes The baseClasses object\n * @requires\n */\nfunction createThemeClassesLookup(classes) {\n return classes.reduce((currentClassNames, baseClass) => {\n Object.keys(baseClass).forEach((key) => {\n currentClassNames[baseClass[key]] = key;\n });\n return currentClassNames;\n }, {});\n}\n/**\n * Convenience function that is given a theme and an optional registry, the theme\n * injector is defined against the registry, returning the theme.\n *\n * @param theme the theme to set\n * @param themeRegistry registry to define the theme injector against. Defaults\n * to the global registry\n *\n * @returns the theme injector used to set the theme\n */\nexport function registerThemeInjector(theme, themeRegistry) {\n const themeInjector = new Injector(theme);\n themeRegistry.defineInjector(INJECTED_THEME_KEY, (invalidator) => {\n themeInjector.setInvalidator(invalidator);\n return () => themeInjector.get();\n });\n return themeInjector;\n}\n/**\n * Function that returns a class decorated with with Themed functionality\n */\nexport function ThemedMixin(Base) {\n let Themed = class Themed extends Base {\n constructor() {\n super(...arguments);\n /**\n * Registered base theme keys\n */\n this._registeredBaseThemeKeys = [];\n /**\n * Indicates if classes meta data need to be calculated.\n */\n this._recalculateClasses = true;\n /**\n * Loaded theme\n */\n this._theme = {};\n }\n theme(classes) {\n if (this._recalculateClasses) {\n this._recalculateThemeClasses();\n }\n if (Array.isArray(classes)) {\n return classes.map((className) => this._getThemeClass(className));\n }\n return this._getThemeClass(classes);\n }\n /**\n * Function fired when `theme` or `extraClasses` are changed.\n */\n onPropertiesChanged() {\n this._recalculateClasses = true;\n }\n _getThemeClass(className) {\n if (className === undefined || className === null) {\n return className;\n }\n const extraClasses = this.properties.extraClasses || {};\n const themeClassName = this._baseThemeClassesReverseLookup[className];\n let resultClassNames = [];\n if (!themeClassName) {\n console.warn(`Class name: '${className}' not found in theme`);\n return null;\n }\n if (extraClasses[themeClassName]) {\n resultClassNames.push(extraClasses[themeClassName]);\n }\n if (this._theme[themeClassName]) {\n resultClassNames.push(this._theme[themeClassName]);\n }\n else {\n resultClassNames.push(this._registeredBaseTheme[themeClassName]);\n }\n return resultClassNames.join(' ');\n }\n _recalculateThemeClasses() {\n const { theme = {} } = this.properties;\n const baseThemes = this.getDecorator('baseThemeClasses');\n if (!this._registeredBaseTheme) {\n this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => {\n const _a = THEME_KEY, key = baseTheme[_a], classes = tslib_1.__rest(baseTheme, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n this._registeredBaseThemeKeys.push(key);\n return Object.assign({}, finalBaseTheme, classes);\n }, {});\n this._baseThemeClassesReverseLookup = createThemeClassesLookup(baseThemes);\n }\n this._theme = this._registeredBaseThemeKeys.reduce((baseTheme, themeKey) => {\n return Object.assign({}, baseTheme, theme[themeKey]);\n }, {});\n this._recalculateClasses = false;\n }\n };\n tslib_1.__decorate([\n diffProperty('theme', shallow),\n diffProperty('extraClasses', shallow)\n ], Themed.prototype, \"onPropertiesChanged\", null);\n Themed = tslib_1.__decorate([\n inject({\n name: INJECTED_THEME_KEY,\n getProperties: (theme, properties) => {\n if (!properties.theme) {\n return { theme };\n }\n return {};\n }\n })\n ], Themed);\n return Themed;\n}\nexport default ThemedMixin;\n//# sourceMappingURL=Themed.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "name": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "id": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "name": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "index": 13, "index2": 37, - "size": 9124, + "size": 9118, "cacheable": true, "built": true, "optional": false, @@ -2245,14 +2254,14 @@ "module": "./node_modules/imports-loader?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js", "moduleName": "./node_modules/imports-loader?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js", "type": "cjs require", - "userRequest": "@dojo/widget-core/registerCustomElement", - "loc": "4:28-78" + "userRequest": "@dojo/framework/widget-core/registerCustomElement", + "loc": "4:28-88" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/customElement.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", "type": "harmony import", "userRequest": "../registerCustomElement", "loc": "1:0-66" @@ -2268,15 +2277,15 @@ ], "optimizationBailout": [], "depth": 2, - "source": "import * as tslib_1 from \"tslib\";\nimport { WidgetBase, noBind } from './WidgetBase';\nimport { ProjectorMixin } from './mixins/Projector';\nimport { from } from '@dojo/shim/array';\nimport { w, dom } from './d';\nimport global from '@dojo/shim/global';\nimport { registerThemeInjector } from './mixins/Themed';\nimport { alwaysRender } from './decorators/alwaysRender';\nexport var CustomElementChildType;\n(function (CustomElementChildType) {\n CustomElementChildType[\"DOJO\"] = \"DOJO\";\n CustomElementChildType[\"NODE\"] = \"NODE\";\n CustomElementChildType[\"TEXT\"] = \"TEXT\";\n})(CustomElementChildType || (CustomElementChildType = {}));\nexport function DomToWidgetWrapper(domNode) {\n let DomToWidgetWrapper = class DomToWidgetWrapper extends WidgetBase {\n render() {\n const properties = Object.keys(this.properties).reduce((props, key) => {\n const value = this.properties[key];\n if (key.indexOf('on') === 0) {\n key = `__${key}`;\n }\n props[key] = value;\n return props;\n }, {});\n return dom({ node: domNode, props: properties, diffType: 'dom' });\n }\n static get domNode() {\n return domNode;\n }\n };\n DomToWidgetWrapper = tslib_1.__decorate([\n alwaysRender()\n ], DomToWidgetWrapper);\n return DomToWidgetWrapper;\n}\nexport function create(descriptor, WidgetConstructor) {\n const { attributes, childType, registryFactory } = descriptor;\n const attributeMap = {};\n attributes.forEach((propertyName) => {\n const attributeName = propertyName.toLowerCase();\n attributeMap[attributeName] = propertyName;\n });\n return class extends HTMLElement {\n constructor() {\n super(...arguments);\n this._properties = {};\n this._children = [];\n this._eventProperties = {};\n this._initialised = false;\n }\n connectedCallback() {\n if (this._initialised) {\n return;\n }\n const domProperties = {};\n const { attributes, properties, events } = descriptor;\n this._properties = Object.assign({}, this._properties, this._attributesToProperties(attributes));\n [...attributes, ...properties].forEach((propertyName) => {\n const value = this[propertyName];\n const filteredPropertyName = propertyName.replace(/^on/, '__');\n if (value !== undefined) {\n this._properties[propertyName] = value;\n }\n if (filteredPropertyName !== propertyName) {\n domProperties[filteredPropertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n }\n domProperties[propertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n });\n events.forEach((propertyName) => {\n const eventName = propertyName.replace(/^on/, '').toLowerCase();\n const filteredPropertyName = propertyName.replace(/^on/, '__on');\n domProperties[filteredPropertyName] = {\n get: () => this._getEventProperty(propertyName),\n set: (value) => this._setEventProperty(propertyName, value)\n };\n this._eventProperties[propertyName] = undefined;\n this._properties[propertyName] = (...args) => {\n const eventCallback = this._getEventProperty(propertyName);\n if (typeof eventCallback === 'function') {\n eventCallback(...args);\n }\n this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: false,\n detail: args\n }));\n };\n });\n Object.defineProperties(this, domProperties);\n const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children;\n from(children).forEach((childNode) => {\n if (childType === CustomElementChildType.DOJO) {\n childNode.addEventListener('dojo-ce-render', () => this._render());\n childNode.addEventListener('dojo-ce-connected', () => this._render());\n this._children.push(DomToWidgetWrapper(childNode));\n }\n else {\n this._children.push(dom({ node: childNode, diffType: 'dom' }));\n }\n });\n this.addEventListener('dojo-ce-connected', (e) => this._childConnected(e));\n const widgetProperties = this._properties;\n const renderChildren = () => this.__children__();\n const Wrapper = class extends WidgetBase {\n render() {\n return w(WidgetConstructor, widgetProperties, renderChildren());\n }\n };\n const registry = registryFactory();\n const themeContext = registerThemeInjector(this._getTheme(), registry);\n global.addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme()));\n const Projector = ProjectorMixin(Wrapper);\n this._projector = new Projector();\n this._projector.setProperties({ registry });\n this._projector.append(this);\n this._initialised = true;\n this.dispatchEvent(new CustomEvent('dojo-ce-connected', {\n bubbles: true,\n detail: this\n }));\n }\n _getTheme() {\n if (global && global.dojoce && global.dojoce.theme) {\n return global.dojoce.themes[global.dojoce.theme];\n }\n }\n _childConnected(e) {\n const node = e.detail;\n if (node.parentNode === this) {\n const exists = this._children.some((child) => child.domNode === node);\n if (!exists) {\n node.addEventListener('dojo-ce-render', () => this._render());\n this._children.push(DomToWidgetWrapper(node));\n this._render();\n }\n }\n }\n _render() {\n if (this._projector) {\n this._projector.invalidate();\n this.dispatchEvent(new CustomEvent('dojo-ce-render', {\n bubbles: false,\n detail: this\n }));\n }\n }\n __properties__() {\n return Object.assign({}, this._properties, this._eventProperties);\n }\n __children__() {\n if (childType === CustomElementChildType.DOJO) {\n return this._children.filter((Child) => Child.domNode.isWidget).map((Child) => {\n const { domNode } = Child;\n return w(Child, Object.assign({}, domNode.__properties__()), [...domNode.__children__()]);\n });\n }\n else {\n return this._children;\n }\n }\n attributeChangedCallback(name, oldValue, value) {\n const propertyName = attributeMap[name];\n this._setProperty(propertyName, value);\n }\n _setEventProperty(propertyName, value) {\n this._eventProperties[propertyName] = value;\n }\n _getEventProperty(propertyName) {\n return this._eventProperties[propertyName];\n }\n _setProperty(propertyName, value) {\n if (typeof value === 'function') {\n value[noBind] = true;\n }\n this._properties[propertyName] = value;\n this._render();\n }\n _getProperty(propertyName) {\n return this._properties[propertyName];\n }\n _attributesToProperties(attributes) {\n return attributes.reduce((properties, propertyName) => {\n const attributeName = propertyName.toLowerCase();\n const value = this.getAttribute(attributeName);\n if (value !== null) {\n properties[propertyName] = value;\n }\n return properties;\n }, {});\n }\n static get observedAttributes() {\n return Object.keys(attributeMap);\n }\n get isWidget() {\n return true;\n }\n };\n}\nexport function register(WidgetConstructor) {\n const descriptor = WidgetConstructor.prototype && WidgetConstructor.prototype.__customElementDescriptor;\n if (!descriptor) {\n throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?');\n }\n global.customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor));\n}\nexport default register;\n//# sourceMappingURL=registerCustomElement.mjs.map" + "source": "import * as tslib_1 from \"tslib\";\nimport { WidgetBase, noBind } from './WidgetBase';\nimport { ProjectorMixin } from './mixins/Projector';\nimport { from } from '../shim/array';\nimport { w, dom } from './d';\nimport global from '../shim/global';\nimport { registerThemeInjector } from './mixins/Themed';\nimport { alwaysRender } from './decorators/alwaysRender';\nexport var CustomElementChildType;\n(function (CustomElementChildType) {\n CustomElementChildType[\"DOJO\"] = \"DOJO\";\n CustomElementChildType[\"NODE\"] = \"NODE\";\n CustomElementChildType[\"TEXT\"] = \"TEXT\";\n})(CustomElementChildType || (CustomElementChildType = {}));\nexport function DomToWidgetWrapper(domNode) {\n let DomToWidgetWrapper = class DomToWidgetWrapper extends WidgetBase {\n render() {\n const properties = Object.keys(this.properties).reduce((props, key) => {\n const value = this.properties[key];\n if (key.indexOf('on') === 0) {\n key = `__${key}`;\n }\n props[key] = value;\n return props;\n }, {});\n return dom({ node: domNode, props: properties, diffType: 'dom' });\n }\n static get domNode() {\n return domNode;\n }\n };\n DomToWidgetWrapper = tslib_1.__decorate([\n alwaysRender()\n ], DomToWidgetWrapper);\n return DomToWidgetWrapper;\n}\nexport function create(descriptor, WidgetConstructor) {\n const { attributes, childType, registryFactory } = descriptor;\n const attributeMap = {};\n attributes.forEach((propertyName) => {\n const attributeName = propertyName.toLowerCase();\n attributeMap[attributeName] = propertyName;\n });\n return class extends HTMLElement {\n constructor() {\n super(...arguments);\n this._properties = {};\n this._children = [];\n this._eventProperties = {};\n this._initialised = false;\n }\n connectedCallback() {\n if (this._initialised) {\n return;\n }\n const domProperties = {};\n const { attributes, properties, events } = descriptor;\n this._properties = Object.assign({}, this._properties, this._attributesToProperties(attributes));\n [...attributes, ...properties].forEach((propertyName) => {\n const value = this[propertyName];\n const filteredPropertyName = propertyName.replace(/^on/, '__');\n if (value !== undefined) {\n this._properties[propertyName] = value;\n }\n if (filteredPropertyName !== propertyName) {\n domProperties[filteredPropertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n }\n domProperties[propertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n });\n events.forEach((propertyName) => {\n const eventName = propertyName.replace(/^on/, '').toLowerCase();\n const filteredPropertyName = propertyName.replace(/^on/, '__on');\n domProperties[filteredPropertyName] = {\n get: () => this._getEventProperty(propertyName),\n set: (value) => this._setEventProperty(propertyName, value)\n };\n this._eventProperties[propertyName] = undefined;\n this._properties[propertyName] = (...args) => {\n const eventCallback = this._getEventProperty(propertyName);\n if (typeof eventCallback === 'function') {\n eventCallback(...args);\n }\n this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: false,\n detail: args\n }));\n };\n });\n Object.defineProperties(this, domProperties);\n const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children;\n from(children).forEach((childNode) => {\n if (childType === CustomElementChildType.DOJO) {\n childNode.addEventListener('dojo-ce-render', () => this._render());\n childNode.addEventListener('dojo-ce-connected', () => this._render());\n this._children.push(DomToWidgetWrapper(childNode));\n }\n else {\n this._children.push(dom({ node: childNode, diffType: 'dom' }));\n }\n });\n this.addEventListener('dojo-ce-connected', (e) => this._childConnected(e));\n const widgetProperties = this._properties;\n const renderChildren = () => this.__children__();\n const Wrapper = class extends WidgetBase {\n render() {\n return w(WidgetConstructor, widgetProperties, renderChildren());\n }\n };\n const registry = registryFactory();\n const themeContext = registerThemeInjector(this._getTheme(), registry);\n global.addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme()));\n const Projector = ProjectorMixin(Wrapper);\n this._projector = new Projector();\n this._projector.setProperties({ registry });\n this._projector.append(this);\n this._initialised = true;\n this.dispatchEvent(new CustomEvent('dojo-ce-connected', {\n bubbles: true,\n detail: this\n }));\n }\n _getTheme() {\n if (global && global.dojoce && global.dojoce.theme) {\n return global.dojoce.themes[global.dojoce.theme];\n }\n }\n _childConnected(e) {\n const node = e.detail;\n if (node.parentNode === this) {\n const exists = this._children.some((child) => child.domNode === node);\n if (!exists) {\n node.addEventListener('dojo-ce-render', () => this._render());\n this._children.push(DomToWidgetWrapper(node));\n this._render();\n }\n }\n }\n _render() {\n if (this._projector) {\n this._projector.invalidate();\n this.dispatchEvent(new CustomEvent('dojo-ce-render', {\n bubbles: false,\n detail: this\n }));\n }\n }\n __properties__() {\n return Object.assign({}, this._properties, this._eventProperties);\n }\n __children__() {\n if (childType === CustomElementChildType.DOJO) {\n return this._children.filter((Child) => Child.domNode.isWidget).map((Child) => {\n const { domNode } = Child;\n return w(Child, Object.assign({}, domNode.__properties__()), [...domNode.__children__()]);\n });\n }\n else {\n return this._children;\n }\n }\n attributeChangedCallback(name, oldValue, value) {\n const propertyName = attributeMap[name];\n this._setProperty(propertyName, value);\n }\n _setEventProperty(propertyName, value) {\n this._eventProperties[propertyName] = value;\n }\n _getEventProperty(propertyName) {\n return this._eventProperties[propertyName];\n }\n _setProperty(propertyName, value) {\n if (typeof value === 'function') {\n value[noBind] = true;\n }\n this._properties[propertyName] = value;\n this._render();\n }\n _getProperty(propertyName) {\n return this._properties[propertyName];\n }\n _attributesToProperties(attributes) {\n return attributes.reduce((properties, propertyName) => {\n const attributeName = propertyName.toLowerCase();\n const value = this.getAttribute(attributeName);\n if (value !== null) {\n properties[propertyName] = value;\n }\n return properties;\n }, {});\n }\n static get observedAttributes() {\n return Object.keys(attributeMap);\n }\n get isWidget() {\n return true;\n }\n };\n}\nexport function register(WidgetConstructor) {\n const descriptor = WidgetConstructor.prototype && WidgetConstructor.prototype.__customElementDescriptor;\n if (!descriptor) {\n throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?');\n }\n global.customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor));\n}\nexport default register;\n//# sourceMappingURL=registerCustomElement.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/vdom.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/vdom.mjs", - "name": "./node_modules/@dojo/widget-core/vdom.mjs", + "id": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/vdom.mjs", + "name": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "index": 29, "index2": 25, - "size": 38814, + "size": 39966, "cacheable": true, "built": true, "optional": false, @@ -2285,27 +2294,27 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./vdom", "loc": "8:0-43" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "./../vdom", "loc": "6:0-32" @@ -2324,7 +2333,7 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import global from '@dojo/shim/global';\nimport { from as arrayFrom } from '@dojo/shim/array';\nimport { isWNode, isVNode, isDomVNode, VNODE, WNODE } from './d';\nimport { isWidgetBaseConstructor } from './Registry';\nimport WeakMap from '@dojo/shim/WeakMap';\nconst NAMESPACE_W3 = 'http://www.w3.org/';\nconst NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg';\nconst NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink';\nconst emptyArray = [];\nexport const widgetInstanceMap = new WeakMap();\nconst instanceMap = new WeakMap();\nconst projectorStateMap = new WeakMap();\nfunction same(dnode1, dnode2) {\n if (isVNode(dnode1) && isVNode(dnode2)) {\n if (isDomVNode(dnode1) || isDomVNode(dnode2)) {\n if (dnode1.domNode !== dnode2.domNode) {\n return false;\n }\n }\n if (dnode1.tag !== dnode2.tag) {\n return false;\n }\n if (dnode1.properties.key !== dnode2.properties.key) {\n return false;\n }\n return true;\n }\n else if (isWNode(dnode1) && isWNode(dnode2)) {\n if (dnode1.instance === undefined && typeof dnode2.widgetConstructor === 'string') {\n return false;\n }\n if (dnode1.widgetConstructor !== dnode2.widgetConstructor) {\n return false;\n }\n if (dnode1.properties.key !== dnode2.properties.key) {\n return false;\n }\n return true;\n }\n return false;\n}\nconst missingTransition = function () {\n throw new Error('Provide a transitions object to the projectionOptions to do animations');\n};\nfunction getProjectionOptions(projectorOptions, projectorInstance) {\n const defaults = {\n namespace: undefined,\n styleApplyer: function (domNode, styleName, value) {\n domNode.style[styleName] = value;\n },\n transitions: {\n enter: missingTransition,\n exit: missingTransition\n },\n depth: 0,\n merge: false,\n sync: false,\n projectorInstance\n };\n return Object.assign({}, defaults, projectorOptions);\n}\nfunction checkStyleValue(styleValue) {\n if (typeof styleValue !== 'string') {\n throw new Error('Style values must be strings');\n }\n}\nfunction updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n const eventMap = projectorState.nodeMap.get(domNode) || new WeakMap();\n if (previousValue) {\n const previousEvent = eventMap.get(previousValue);\n domNode.removeEventListener(eventName, previousEvent);\n }\n let callback = currentValue.bind(bind);\n if (eventName === 'input') {\n callback = function (evt) {\n currentValue.call(this, evt);\n evt.target['oninput-value'] = evt.target.value;\n }.bind(bind);\n }\n domNode.addEventListener(eventName, callback);\n eventMap.set(currentValue, callback);\n projectorState.nodeMap.set(domNode, eventMap);\n}\nfunction addClasses(domNode, classes) {\n if (classes) {\n const classNames = classes.split(' ');\n for (let i = 0; i < classNames.length; i++) {\n domNode.classList.add(classNames[i]);\n }\n }\n}\nfunction removeClasses(domNode, classes) {\n if (classes) {\n const classNames = classes.split(' ');\n for (let i = 0; i < classNames.length; i++) {\n domNode.classList.remove(classNames[i]);\n }\n }\n}\nfunction buildPreviousProperties(domNode, previous, current) {\n const { diffType, properties, attributes } = current;\n if (!diffType || diffType === 'vdom') {\n return { properties: previous.properties, attributes: previous.attributes, events: previous.events };\n }\n else if (diffType === 'none') {\n return { properties: {}, attributes: previous.attributes ? {} : undefined, events: previous.events };\n }\n let newProperties = {\n properties: {}\n };\n if (attributes) {\n newProperties.attributes = {};\n newProperties.events = previous.events;\n Object.keys(properties).forEach((propName) => {\n newProperties.properties[propName] = domNode[propName];\n });\n Object.keys(attributes).forEach((attrName) => {\n newProperties.attributes[attrName] = domNode.getAttribute(attrName);\n });\n return newProperties;\n }\n newProperties.properties = Object.keys(properties).reduce((props, property) => {\n props[property] = domNode.getAttribute(property) || domNode[property];\n return props;\n }, {});\n return newProperties;\n}\nfunction focusNode(propValue, previousValue, domNode, projectionOptions) {\n let result;\n if (typeof propValue === 'function') {\n result = propValue();\n }\n else {\n result = propValue && !previousValue;\n }\n if (result === true) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectorState.deferredRenderCallbacks.push(() => {\n domNode.focus();\n });\n }\n}\nfunction removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions, onlyEvents = false) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n const eventMap = projectorState.nodeMap.get(domNode);\n if (eventMap) {\n Object.keys(previousProperties).forEach((propName) => {\n const isEvent = propName.substr(0, 2) === 'on' || onlyEvents;\n const eventName = onlyEvents ? propName : propName.substr(2);\n if (isEvent && !properties[propName]) {\n const eventCallback = eventMap.get(previousProperties[propName]);\n if (eventCallback) {\n domNode.removeEventListener(eventName, eventCallback);\n }\n }\n });\n }\n}\nfunction updateAttribute(domNode, attrName, attrValue, projectionOptions) {\n if (projectionOptions.namespace === NAMESPACE_SVG && attrName === 'href') {\n domNode.setAttributeNS(NAMESPACE_XLINK, attrName, attrValue);\n }\n else if ((attrName === 'role' && attrValue === '') || attrValue === undefined) {\n domNode.removeAttribute(attrName);\n }\n else {\n domNode.setAttribute(attrName, attrValue);\n }\n}\nfunction updateAttributes(domNode, previousAttributes, attributes, projectionOptions) {\n const attrNames = Object.keys(attributes);\n const attrCount = attrNames.length;\n for (let i = 0; i < attrCount; i++) {\n const attrName = attrNames[i];\n const attrValue = attributes[attrName];\n const previousAttrValue = previousAttributes[attrName];\n if (attrValue !== previousAttrValue) {\n updateAttribute(domNode, attrName, attrValue, projectionOptions);\n }\n }\n}\nfunction updateProperties(domNode, previousProperties, properties, projectionOptions, includesEventsAndAttributes = true) {\n let propertiesUpdated = false;\n const propNames = Object.keys(properties);\n const propCount = propNames.length;\n if (propNames.indexOf('classes') === -1 && previousProperties.classes) {\n if (Array.isArray(previousProperties.classes)) {\n for (let i = 0; i < previousProperties.classes.length; i++) {\n removeClasses(domNode, previousProperties.classes[i]);\n }\n }\n else {\n removeClasses(domNode, previousProperties.classes);\n }\n }\n includesEventsAndAttributes && removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions);\n for (let i = 0; i < propCount; i++) {\n const propName = propNames[i];\n let propValue = properties[propName];\n const previousValue = previousProperties[propName];\n if (propName === 'classes') {\n const previousClasses = Array.isArray(previousValue) ? previousValue : [previousValue];\n const currentClasses = Array.isArray(propValue) ? propValue : [propValue];\n if (previousClasses && previousClasses.length > 0) {\n if (!propValue || propValue.length === 0) {\n for (let i = 0; i < previousClasses.length; i++) {\n removeClasses(domNode, previousClasses[i]);\n }\n }\n else {\n const newClasses = [...currentClasses];\n for (let i = 0; i < previousClasses.length; i++) {\n const previousClassName = previousClasses[i];\n if (previousClassName) {\n const classIndex = newClasses.indexOf(previousClassName);\n if (classIndex === -1) {\n removeClasses(domNode, previousClassName);\n }\n else {\n newClasses.splice(classIndex, 1);\n }\n }\n }\n for (let i = 0; i < newClasses.length; i++) {\n addClasses(domNode, newClasses[i]);\n }\n }\n }\n else {\n for (let i = 0; i < currentClasses.length; i++) {\n addClasses(domNode, currentClasses[i]);\n }\n }\n }\n else if (propName === 'focus') {\n focusNode(propValue, previousValue, domNode, projectionOptions);\n }\n else if (propName === 'styles') {\n const styleNames = Object.keys(propValue);\n const styleCount = styleNames.length;\n for (let j = 0; j < styleCount; j++) {\n const styleName = styleNames[j];\n const newStyleValue = propValue[styleName];\n const oldStyleValue = previousValue && previousValue[styleName];\n if (newStyleValue === oldStyleValue) {\n continue;\n }\n propertiesUpdated = true;\n if (newStyleValue) {\n checkStyleValue(newStyleValue);\n projectionOptions.styleApplyer(domNode, styleName, newStyleValue);\n }\n else {\n projectionOptions.styleApplyer(domNode, styleName, '');\n }\n }\n }\n else {\n if (!propValue && typeof previousValue === 'string') {\n propValue = '';\n }\n if (propName === 'value') {\n const domValue = domNode[propName];\n if (domValue !== propValue &&\n (domNode['oninput-value']\n ? domValue === domNode['oninput-value']\n : propValue !== previousValue)) {\n domNode[propName] = propValue;\n domNode['oninput-value'] = undefined;\n }\n if (propValue !== previousValue) {\n propertiesUpdated = true;\n }\n }\n else if (propName !== 'key' && propValue !== previousValue) {\n const type = typeof propValue;\n if (type === 'function' && propName.lastIndexOf('on', 0) === 0 && includesEventsAndAttributes) {\n updateEvent(domNode, propName.substr(2), propValue, projectionOptions, properties.bind, previousValue);\n }\n else if (type === 'string' && propName !== 'innerHTML' && includesEventsAndAttributes) {\n updateAttribute(domNode, propName, propValue, projectionOptions);\n }\n else if (propName === 'scrollLeft' || propName === 'scrollTop') {\n if (domNode[propName] !== propValue) {\n domNode[propName] = propValue;\n }\n }\n else {\n domNode[propName] = propValue;\n }\n propertiesUpdated = true;\n }\n }\n }\n return propertiesUpdated;\n}\nfunction findIndexOfChild(children, sameAs, start) {\n for (let i = start; i < children.length; i++) {\n if (same(children[i], sameAs)) {\n return i;\n }\n }\n return -1;\n}\nexport function toParentVNode(domNode) {\n return {\n tag: '',\n properties: {},\n children: undefined,\n domNode,\n type: VNODE\n };\n}\nexport function toTextVNode(data) {\n return {\n tag: '',\n properties: {},\n children: undefined,\n text: `${data}`,\n domNode: undefined,\n type: VNODE\n };\n}\nfunction toInternalWNode(instance, instanceData) {\n return {\n instance,\n rendered: [],\n coreProperties: instanceData.coreProperties,\n children: instance.children,\n widgetConstructor: instance.constructor,\n properties: instanceData.inputProperties,\n type: WNODE\n };\n}\nexport function filterAndDecorateChildren(children, instance) {\n if (children === undefined) {\n return emptyArray;\n }\n children = Array.isArray(children) ? children : [children];\n for (let i = 0; i < children.length;) {\n const child = children[i];\n if (child === undefined || child === null) {\n children.splice(i, 1);\n continue;\n }\n else if (typeof child === 'string') {\n children[i] = toTextVNode(child);\n }\n else {\n if (isVNode(child)) {\n if (child.properties.bind === undefined) {\n child.properties.bind = instance;\n if (child.children && child.children.length > 0) {\n filterAndDecorateChildren(child.children, instance);\n }\n }\n }\n else {\n if (!child.coreProperties) {\n const instanceData = widgetInstanceMap.get(instance);\n child.coreProperties = {\n bind: instance,\n baseRegistry: instanceData.coreProperties.baseRegistry\n };\n }\n if (child.children && child.children.length > 0) {\n filterAndDecorateChildren(child.children, instance);\n }\n }\n }\n i++;\n }\n return children;\n}\nfunction nodeAdded(dnode, transitions) {\n if (isVNode(dnode) && dnode.properties) {\n const enterAnimation = dnode.properties.enterAnimation;\n if (enterAnimation) {\n if (typeof enterAnimation === 'function') {\n enterAnimation(dnode.domNode, dnode.properties);\n }\n else {\n transitions.enter(dnode.domNode, dnode.properties, enterAnimation);\n }\n }\n }\n}\nfunction nodeToRemove(dnode, transitions, projectionOptions) {\n if (isWNode(dnode)) {\n const rendered = dnode.rendered || emptyArray;\n if (dnode.instance) {\n const instanceData = widgetInstanceMap.get(dnode.instance);\n instanceData.onDetach();\n instanceMap.delete(dnode.instance);\n }\n for (let i = 0; i < rendered.length; i++) {\n nodeToRemove(rendered[i], transitions, projectionOptions);\n }\n }\n else {\n const domNode = dnode.domNode;\n const properties = dnode.properties;\n if (dnode.children && dnode.children.length > 0) {\n for (let i = 0; i < dnode.children.length; i++) {\n nodeToRemove(dnode.children[i], transitions, projectionOptions);\n }\n }\n const exitAnimation = properties.exitAnimation;\n if (properties && exitAnimation) {\n domNode.style.pointerEvents = 'none';\n const removeDomNode = function () {\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\n dnode.domNode = undefined;\n };\n if (typeof exitAnimation === 'function') {\n exitAnimation(domNode, removeDomNode, properties);\n return;\n }\n else {\n transitions.exit(dnode.domNode, properties, exitAnimation, removeDomNode);\n return;\n }\n }\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\n dnode.domNode = undefined;\n }\n}\nfunction checkDistinguishable(childNodes, indexToCheck, parentInstance) {\n const childNode = childNodes[indexToCheck];\n if (isVNode(childNode) && !childNode.tag) {\n return; // Text nodes need not be distinguishable\n }\n const { key } = childNode.properties;\n if (key === undefined || key === null) {\n for (let i = 0; i < childNodes.length; i++) {\n if (i !== indexToCheck) {\n const node = childNodes[i];\n if (same(node, childNode)) {\n let nodeIdentifier;\n const parentName = parentInstance.constructor.name || 'unknown';\n if (isWNode(childNode)) {\n nodeIdentifier = childNode.widgetConstructor.name || 'unknown';\n }\n else {\n nodeIdentifier = childNode.tag;\n }\n console.warn(`A widget (${parentName}) has had a child addded or removed, but they were not able to uniquely identified. It is recommended to provide a unique 'key' property when using the same widget or element (${nodeIdentifier}) multiple times as siblings`);\n break;\n }\n }\n }\n }\n}\nfunction updateChildren(parentVNode, oldChildren, newChildren, parentInstance, projectionOptions) {\n oldChildren = oldChildren || emptyArray;\n newChildren = newChildren;\n const oldChildrenLength = oldChildren.length;\n const newChildrenLength = newChildren.length;\n const transitions = projectionOptions.transitions;\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\n let oldIndex = 0;\n let newIndex = 0;\n let i;\n let textUpdated = false;\n while (newIndex < newChildrenLength) {\n let oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : undefined;\n const newChild = newChildren[newIndex];\n if (isVNode(newChild) && typeof newChild.deferredPropertiesCallback === 'function') {\n newChild.inserted = isVNode(oldChild) && oldChild.inserted;\n addDeferredProperties(newChild, projectionOptions);\n }\n if (oldChild !== undefined && same(oldChild, newChild)) {\n textUpdated = updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance) || textUpdated;\n oldIndex++;\n newIndex++;\n continue;\n }\n const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);\n const addChild = () => {\n let insertBeforeDomNode = undefined;\n let child = oldChildren[oldIndex];\n if (child) {\n let nextIndex = oldIndex + 1;\n let insertBeforeChildren = [child];\n while (insertBeforeChildren.length) {\n const insertBefore = insertBeforeChildren.shift();\n if (isWNode(insertBefore)) {\n if (insertBefore.rendered) {\n insertBeforeChildren.push(...insertBefore.rendered);\n }\n }\n else {\n if (insertBefore.domNode) {\n insertBeforeDomNode = insertBefore.domNode;\n break;\n }\n }\n if (insertBeforeChildren.length === 0 && oldChildren[nextIndex]) {\n insertBeforeChildren.push(oldChildren[nextIndex]);\n nextIndex++;\n }\n }\n }\n createDom(newChild, parentVNode, insertBeforeDomNode, projectionOptions, parentInstance);\n nodeAdded(newChild, transitions);\n const indexToCheck = newIndex;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(newChildren, indexToCheck, parentInstance);\n });\n };\n if (!oldChild || findOldIndex === -1) {\n addChild();\n newIndex++;\n continue;\n }\n const removeChild = () => {\n const indexToCheck = oldIndex;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\n });\n if (isWNode(oldChild)) {\n const item = instanceMap.get(oldChild.instance);\n if (item) {\n oldChild = item.dnode;\n }\n }\n nodeToRemove(oldChild, transitions, projectionOptions);\n };\n const findNewIndex = findIndexOfChild(newChildren, oldChild, newIndex + 1);\n if (findNewIndex === -1) {\n removeChild();\n oldIndex++;\n continue;\n }\n addChild();\n removeChild();\n oldIndex++;\n newIndex++;\n }\n if (oldChildrenLength > oldIndex) {\n // Remove child fragments\n for (i = oldIndex; i < oldChildrenLength; i++) {\n const indexToCheck = i;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\n });\n let childToRemove = oldChildren[i];\n if (isWNode(childToRemove)) {\n const item = instanceMap.get(childToRemove.instance);\n if (item) {\n childToRemove = item.dnode;\n }\n }\n nodeToRemove(childToRemove, transitions, projectionOptions);\n }\n }\n return textUpdated;\n}\nfunction addChildren(parentVNode, children, projectionOptions, parentInstance, insertBefore = undefined, childNodes) {\n if (children === undefined) {\n return;\n }\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectorState.merge && childNodes === undefined) {\n childNodes = arrayFrom(parentVNode.domNode.childNodes);\n }\n const transitions = projectionOptions.transitions;\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n if (isVNode(child)) {\n if (projectorState.merge && childNodes) {\n let domElement = undefined;\n while (child.domNode === undefined && childNodes.length > 0) {\n domElement = childNodes.shift();\n if (domElement && domElement.tagName === (child.tag.toUpperCase() || undefined)) {\n child.domNode = domElement;\n }\n }\n }\n createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance);\n }\n else {\n createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes);\n }\n nodeAdded(child, transitions);\n }\n}\nfunction initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions) {\n addChildren(dnode, dnode.children, projectionOptions, parentInstance, undefined);\n if (typeof dnode.deferredPropertiesCallback === 'function' && dnode.inserted === undefined) {\n addDeferredProperties(dnode, projectionOptions);\n }\n if (dnode.attributes && dnode.events) {\n updateAttributes(domNode, {}, dnode.attributes, projectionOptions);\n updateProperties(domNode, {}, dnode.properties, projectionOptions, false);\n removeOrphanedEvents(domNode, {}, dnode.events, projectionOptions, true);\n const events = dnode.events;\n Object.keys(events).forEach((event) => {\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind);\n });\n }\n else {\n updateProperties(domNode, {}, dnode.properties, projectionOptions);\n }\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\n const instanceData = widgetInstanceMap.get(parentInstance);\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\n }\n dnode.inserted = true;\n}\nfunction createDom(dnode, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes) {\n let domNode;\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (isWNode(dnode)) {\n let { widgetConstructor } = dnode;\n const parentInstanceData = widgetInstanceMap.get(parentInstance);\n if (!isWidgetBaseConstructor(widgetConstructor)) {\n const item = parentInstanceData.registry().get(widgetConstructor);\n if (item === null) {\n return;\n }\n widgetConstructor = item;\n }\n const instance = new widgetConstructor();\n dnode.instance = instance;\n const instanceData = widgetInstanceMap.get(instance);\n instanceData.invalidate = () => {\n instanceData.dirty = true;\n if (instanceData.rendering === false) {\n projectorState.renderQueue.push({ instance, depth: projectionOptions.depth });\n scheduleRender(projectionOptions);\n }\n };\n instanceData.rendering = true;\n instance.__setCoreProperties__(dnode.coreProperties);\n instance.__setChildren__(dnode.children);\n instance.__setProperties__(dnode.properties);\n const rendered = instance.__render__();\n instanceData.rendering = false;\n if (rendered) {\n const filteredRendered = filterAndDecorateChildren(rendered, instance);\n dnode.rendered = filteredRendered;\n addChildren(parentVNode, filteredRendered, projectionOptions, instance, insertBefore, childNodes);\n }\n instanceMap.set(instance, { dnode, parentVNode });\n instanceData.nodeHandler.addRoot();\n projectorState.afterRenderCallbacks.push(() => {\n instanceData.onAttach();\n });\n }\n else {\n if (projectorState.merge && projectorState.mergeElement !== undefined) {\n domNode = dnode.domNode = projectionOptions.mergeElement;\n projectorState.mergeElement = undefined;\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\n return;\n }\n const doc = parentVNode.domNode.ownerDocument;\n if (!dnode.tag && typeof dnode.text === 'string') {\n if (dnode.domNode !== undefined && parentVNode.domNode) {\n const newDomNode = dnode.domNode.ownerDocument.createTextNode(dnode.text);\n if (parentVNode.domNode === dnode.domNode.parentNode) {\n parentVNode.domNode.replaceChild(newDomNode, dnode.domNode);\n }\n else {\n parentVNode.domNode.appendChild(newDomNode);\n dnode.domNode.parentNode && dnode.domNode.parentNode.removeChild(dnode.domNode);\n }\n dnode.domNode = newDomNode;\n }\n else {\n domNode = dnode.domNode = doc.createTextNode(dnode.text);\n if (insertBefore !== undefined) {\n parentVNode.domNode.insertBefore(domNode, insertBefore);\n }\n else {\n parentVNode.domNode.appendChild(domNode);\n }\n }\n }\n else {\n if (dnode.domNode === undefined) {\n if (dnode.tag === 'svg') {\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\n }\n if (projectionOptions.namespace !== undefined) {\n domNode = dnode.domNode = doc.createElementNS(projectionOptions.namespace, dnode.tag);\n }\n else {\n domNode = dnode.domNode = dnode.domNode || doc.createElement(dnode.tag);\n }\n }\n else {\n domNode = dnode.domNode;\n }\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\n if (insertBefore !== undefined) {\n parentVNode.domNode.insertBefore(domNode, insertBefore);\n }\n else if (domNode.parentNode !== parentVNode.domNode) {\n parentVNode.domNode.appendChild(domNode);\n }\n }\n }\n}\nfunction updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance) {\n if (isWNode(dnode)) {\n const { instance } = previous;\n const { parentVNode, dnode: node } = instanceMap.get(instance);\n const previousRendered = node ? node.rendered : previous.rendered;\n const instanceData = widgetInstanceMap.get(instance);\n instanceData.rendering = true;\n instance.__setCoreProperties__(dnode.coreProperties);\n instance.__setChildren__(dnode.children);\n instance.__setProperties__(dnode.properties);\n dnode.instance = instance;\n if (instanceData.dirty === true) {\n const rendered = instance.__render__();\n instanceData.rendering = false;\n dnode.rendered = filterAndDecorateChildren(rendered, instance);\n updateChildren(parentVNode, previousRendered, dnode.rendered, instance, projectionOptions);\n }\n else {\n instanceData.rendering = false;\n dnode.rendered = previousRendered;\n }\n instanceMap.set(instance, { dnode, parentVNode });\n instanceData.nodeHandler.addRoot();\n }\n else {\n if (previous === dnode) {\n return false;\n }\n const domNode = (dnode.domNode = previous.domNode);\n let textUpdated = false;\n let updated = false;\n if (!dnode.tag && typeof dnode.text === 'string') {\n if (dnode.text !== previous.text) {\n const newDomNode = domNode.ownerDocument.createTextNode(dnode.text);\n domNode.parentNode.replaceChild(newDomNode, domNode);\n dnode.domNode = newDomNode;\n textUpdated = true;\n return textUpdated;\n }\n }\n else {\n if (dnode.tag && dnode.tag.lastIndexOf('svg', 0) === 0) {\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\n }\n if (previous.children !== dnode.children) {\n const children = filterAndDecorateChildren(dnode.children, parentInstance);\n dnode.children = children;\n updated =\n updateChildren(dnode, previous.children, children, parentInstance, projectionOptions) || updated;\n }\n const previousProperties = buildPreviousProperties(domNode, previous, dnode);\n if (dnode.attributes && dnode.events) {\n updateAttributes(domNode, previousProperties.attributes, dnode.attributes, projectionOptions);\n updated =\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions, false) || updated;\n removeOrphanedEvents(domNode, previousProperties.events, dnode.events, projectionOptions, true);\n const events = dnode.events;\n Object.keys(events).forEach((event) => {\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind, previousProperties.events[event]);\n });\n }\n else {\n updated =\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions) ||\n updated;\n }\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\n const instanceData = widgetInstanceMap.get(parentInstance);\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\n }\n }\n if (updated && dnode.properties && dnode.properties.updateAnimation) {\n dnode.properties.updateAnimation(domNode, dnode.properties, previous.properties);\n }\n }\n}\nfunction addDeferredProperties(vnode, projectionOptions) {\n // transfer any properties that have been passed - as these must be decorated properties\n vnode.decoratedDeferredProperties = vnode.properties;\n const properties = vnode.deferredPropertiesCallback(!!vnode.inserted);\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n vnode.properties = Object.assign({}, properties, vnode.decoratedDeferredProperties);\n projectorState.deferredRenderCallbacks.push(() => {\n const properties = Object.assign({}, vnode.deferredPropertiesCallback(!!vnode.inserted), vnode.decoratedDeferredProperties);\n updateProperties(vnode.domNode, vnode.properties, properties, projectionOptions);\n vnode.properties = properties;\n });\n}\nfunction runDeferredRenderCallbacks(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectorState.deferredRenderCallbacks.length) {\n if (projectionOptions.sync) {\n while (projectorState.deferredRenderCallbacks.length) {\n const callback = projectorState.deferredRenderCallbacks.shift();\n callback && callback();\n }\n }\n else {\n global.requestAnimationFrame(() => {\n while (projectorState.deferredRenderCallbacks.length) {\n const callback = projectorState.deferredRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n }\n}\nfunction runAfterRenderCallbacks(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectionOptions.sync) {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n }\n else {\n if (global.requestIdleCallback) {\n global.requestIdleCallback(() => {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n else {\n setTimeout(() => {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n }\n}\nfunction scheduleRender(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectionOptions.sync) {\n render(projectionOptions);\n }\n else if (projectorState.renderScheduled === undefined) {\n projectorState.renderScheduled = global.requestAnimationFrame(() => {\n render(projectionOptions);\n });\n }\n}\nfunction render(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectorState.renderScheduled = undefined;\n const renderQueue = projectorState.renderQueue;\n const renders = [...renderQueue];\n projectorState.renderQueue = [];\n renders.sort((a, b) => a.depth - b.depth);\n const previouslyRendered = [];\n while (renders.length) {\n const { instance } = renders.shift();\n if (instanceMap.has(instance) && previouslyRendered.indexOf(instance) === -1) {\n previouslyRendered.push(instance);\n const { parentVNode, dnode } = instanceMap.get(instance);\n const instanceData = widgetInstanceMap.get(instance);\n updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance);\n }\n }\n runAfterRenderCallbacks(projectionOptions);\n runDeferredRenderCallbacks(projectionOptions);\n}\nexport const dom = {\n append: function (parentNode, instance, projectionOptions = {}) {\n const instanceData = widgetInstanceMap.get(instance);\n const finalProjectorOptions = getProjectionOptions(projectionOptions, instance);\n const projectorState = {\n afterRenderCallbacks: [],\n deferredRenderCallbacks: [],\n nodeMap: new WeakMap(),\n renderScheduled: undefined,\n renderQueue: [],\n merge: projectionOptions.merge || false,\n mergeElement: projectionOptions.mergeElement\n };\n projectorStateMap.set(instance, projectorState);\n finalProjectorOptions.rootNode = parentNode;\n const parentVNode = toParentVNode(finalProjectorOptions.rootNode);\n const node = toInternalWNode(instance, instanceData);\n instanceMap.set(instance, { dnode: node, parentVNode });\n instanceData.invalidate = () => {\n instanceData.dirty = true;\n if (instanceData.rendering === false) {\n projectorState.renderQueue.push({ instance, depth: finalProjectorOptions.depth });\n scheduleRender(finalProjectorOptions);\n }\n };\n updateDom(node, node, finalProjectorOptions, parentVNode, instance);\n projectorState.afterRenderCallbacks.push(() => {\n instanceData.onAttach();\n });\n runDeferredRenderCallbacks(finalProjectorOptions);\n runAfterRenderCallbacks(finalProjectorOptions);\n return {\n domNode: finalProjectorOptions.rootNode\n };\n },\n create: function (instance, projectionOptions) {\n return this.append(document.createElement('div'), instance, projectionOptions);\n },\n merge: function (element, instance, projectionOptions = {}) {\n projectionOptions.merge = true;\n projectionOptions.mergeElement = element;\n const projection = this.append(element.parentNode, instance, projectionOptions);\n const projectorState = projectorStateMap.get(instance);\n projectorState.merge = false;\n return projection;\n }\n};\n//# sourceMappingURL=vdom.mjs.map" + "source": "import global from '../shim/global';\nimport { from as arrayFrom } from '../shim/array';\nimport { isWNode, isVNode, isDomVNode, VNODE, WNODE } from './d';\nimport { isWidgetBaseConstructor } from './Registry';\nimport WeakMap from '../shim/WeakMap';\nconst NAMESPACE_W3 = 'http://www.w3.org/';\nconst NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg';\nconst NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink';\nconst emptyArray = [];\nconst nodeOperations = ['focus', 'blur', 'scrollIntoView', 'click'];\nexport const widgetInstanceMap = new WeakMap();\nconst instanceMap = new WeakMap();\nconst nextSiblingMap = new WeakMap();\nconst projectorStateMap = new WeakMap();\nfunction same(dnode1, dnode2) {\n if (isVNode(dnode1) && isVNode(dnode2)) {\n if (isDomVNode(dnode1) || isDomVNode(dnode2)) {\n if (dnode1.domNode !== dnode2.domNode) {\n return false;\n }\n }\n if (dnode1.tag !== dnode2.tag) {\n return false;\n }\n if (dnode1.properties.key !== dnode2.properties.key) {\n return false;\n }\n return true;\n }\n else if (isWNode(dnode1) && isWNode(dnode2)) {\n if (dnode1.instance === undefined && typeof dnode2.widgetConstructor === 'string') {\n return false;\n }\n if (dnode1.widgetConstructor !== dnode2.widgetConstructor) {\n return false;\n }\n if (dnode1.properties.key !== dnode2.properties.key) {\n return false;\n }\n return true;\n }\n return false;\n}\nconst missingTransition = function () {\n throw new Error('Provide a transitions object to the projectionOptions to do animations');\n};\nfunction getProjectionOptions(projectorOptions, projectorInstance) {\n const defaults = {\n namespace: undefined,\n styleApplyer: function (domNode, styleName, value) {\n domNode.style[styleName] = value;\n },\n transitions: {\n enter: missingTransition,\n exit: missingTransition\n },\n depth: 0,\n merge: false,\n sync: false,\n projectorInstance\n };\n return Object.assign({}, defaults, projectorOptions);\n}\nfunction checkStyleValue(styleValue) {\n if (typeof styleValue !== 'string') {\n throw new Error('Style values must be strings');\n }\n}\nfunction updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n const eventMap = projectorState.nodeMap.get(domNode) || new WeakMap();\n if (previousValue) {\n const previousEvent = eventMap.get(previousValue);\n domNode.removeEventListener(eventName, previousEvent);\n }\n let callback = currentValue.bind(bind);\n if (eventName === 'input') {\n callback = function (evt) {\n currentValue.call(this, evt);\n evt.target['oninput-value'] = evt.target.value;\n }.bind(bind);\n }\n domNode.addEventListener(eventName, callback);\n eventMap.set(currentValue, callback);\n projectorState.nodeMap.set(domNode, eventMap);\n}\nfunction addClasses(domNode, classes) {\n if (classes) {\n const classNames = classes.split(' ');\n for (let i = 0; i < classNames.length; i++) {\n domNode.classList.add(classNames[i]);\n }\n }\n}\nfunction removeClasses(domNode, classes) {\n if (classes) {\n const classNames = classes.split(' ');\n for (let i = 0; i < classNames.length; i++) {\n domNode.classList.remove(classNames[i]);\n }\n }\n}\nfunction buildPreviousProperties(domNode, previous, current) {\n const { diffType, properties, attributes } = current;\n if (!diffType || diffType === 'vdom') {\n return { properties: previous.properties, attributes: previous.attributes, events: previous.events };\n }\n else if (diffType === 'none') {\n return { properties: {}, attributes: previous.attributes ? {} : undefined, events: previous.events };\n }\n let newProperties = {\n properties: {}\n };\n if (attributes) {\n newProperties.attributes = {};\n newProperties.events = previous.events;\n Object.keys(properties).forEach((propName) => {\n newProperties.properties[propName] = domNode[propName];\n });\n Object.keys(attributes).forEach((attrName) => {\n newProperties.attributes[attrName] = domNode.getAttribute(attrName);\n });\n return newProperties;\n }\n newProperties.properties = Object.keys(properties).reduce((props, property) => {\n props[property] = domNode.getAttribute(property) || domNode[property];\n return props;\n }, {});\n return newProperties;\n}\nfunction nodeOperation(propName, propValue, previousValue, domNode, projectionOptions) {\n let result;\n if (typeof propValue === 'function') {\n result = propValue();\n }\n else {\n result = propValue && !previousValue;\n }\n if (result === true) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectorState.deferredRenderCallbacks.push(() => {\n domNode[propName]();\n });\n }\n}\nfunction removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions, onlyEvents = false) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n const eventMap = projectorState.nodeMap.get(domNode);\n if (eventMap) {\n Object.keys(previousProperties).forEach((propName) => {\n const isEvent = propName.substr(0, 2) === 'on' || onlyEvents;\n const eventName = onlyEvents ? propName : propName.substr(2);\n if (isEvent && !properties[propName]) {\n const eventCallback = eventMap.get(previousProperties[propName]);\n if (eventCallback) {\n domNode.removeEventListener(eventName, eventCallback);\n }\n }\n });\n }\n}\nfunction updateAttribute(domNode, attrName, attrValue, projectionOptions) {\n if (projectionOptions.namespace === NAMESPACE_SVG && attrName === 'href') {\n domNode.setAttributeNS(NAMESPACE_XLINK, attrName, attrValue);\n }\n else if ((attrName === 'role' && attrValue === '') || attrValue === undefined) {\n domNode.removeAttribute(attrName);\n }\n else {\n domNode.setAttribute(attrName, attrValue);\n }\n}\nfunction updateAttributes(domNode, previousAttributes, attributes, projectionOptions) {\n const attrNames = Object.keys(attributes);\n const attrCount = attrNames.length;\n for (let i = 0; i < attrCount; i++) {\n const attrName = attrNames[i];\n const attrValue = attributes[attrName];\n const previousAttrValue = previousAttributes[attrName];\n if (attrValue !== previousAttrValue) {\n updateAttribute(domNode, attrName, attrValue, projectionOptions);\n }\n }\n}\nfunction updateProperties(domNode, previousProperties, properties, projectionOptions, includesEventsAndAttributes = true) {\n let propertiesUpdated = false;\n const propNames = Object.keys(properties);\n const propCount = propNames.length;\n if (propNames.indexOf('classes') === -1 && previousProperties.classes) {\n if (Array.isArray(previousProperties.classes)) {\n for (let i = 0; i < previousProperties.classes.length; i++) {\n removeClasses(domNode, previousProperties.classes[i]);\n }\n }\n else {\n removeClasses(domNode, previousProperties.classes);\n }\n }\n includesEventsAndAttributes && removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions);\n for (let i = 0; i < propCount; i++) {\n const propName = propNames[i];\n let propValue = properties[propName];\n const previousValue = previousProperties[propName];\n if (propName === 'classes') {\n const previousClasses = Array.isArray(previousValue) ? previousValue : [previousValue];\n const currentClasses = Array.isArray(propValue) ? propValue : [propValue];\n if (previousClasses && previousClasses.length > 0) {\n if (!propValue || propValue.length === 0) {\n for (let i = 0; i < previousClasses.length; i++) {\n removeClasses(domNode, previousClasses[i]);\n }\n }\n else {\n const newClasses = [...currentClasses];\n for (let i = 0; i < previousClasses.length; i++) {\n const previousClassName = previousClasses[i];\n if (previousClassName) {\n const classIndex = newClasses.indexOf(previousClassName);\n if (classIndex === -1) {\n removeClasses(domNode, previousClassName);\n }\n else {\n newClasses.splice(classIndex, 1);\n }\n }\n }\n for (let i = 0; i < newClasses.length; i++) {\n addClasses(domNode, newClasses[i]);\n }\n }\n }\n else {\n for (let i = 0; i < currentClasses.length; i++) {\n addClasses(domNode, currentClasses[i]);\n }\n }\n }\n else if (nodeOperations.indexOf(propName) !== -1) {\n nodeOperation(propName, propValue, previousValue, domNode, projectionOptions);\n }\n else if (propName === 'styles') {\n const styleNames = Object.keys(propValue);\n const styleCount = styleNames.length;\n for (let j = 0; j < styleCount; j++) {\n const styleName = styleNames[j];\n const newStyleValue = propValue[styleName];\n const oldStyleValue = previousValue && previousValue[styleName];\n if (newStyleValue === oldStyleValue) {\n continue;\n }\n propertiesUpdated = true;\n if (newStyleValue) {\n checkStyleValue(newStyleValue);\n projectionOptions.styleApplyer(domNode, styleName, newStyleValue);\n }\n else {\n projectionOptions.styleApplyer(domNode, styleName, '');\n }\n }\n }\n else {\n if (!propValue && typeof previousValue === 'string') {\n propValue = '';\n }\n if (propName === 'value') {\n const domValue = domNode[propName];\n if (domValue !== propValue &&\n (domNode['oninput-value']\n ? domValue === domNode['oninput-value']\n : propValue !== previousValue)) {\n domNode[propName] = propValue;\n domNode['oninput-value'] = undefined;\n }\n if (propValue !== previousValue) {\n propertiesUpdated = true;\n }\n }\n else if (propName !== 'key' && propValue !== previousValue) {\n const type = typeof propValue;\n if (type === 'function' && propName.lastIndexOf('on', 0) === 0 && includesEventsAndAttributes) {\n updateEvent(domNode, propName.substr(2), propValue, projectionOptions, properties.bind, previousValue);\n }\n else if (type === 'string' && propName !== 'innerHTML' && includesEventsAndAttributes) {\n updateAttribute(domNode, propName, propValue, projectionOptions);\n }\n else if (propName === 'scrollLeft' || propName === 'scrollTop') {\n if (domNode[propName] !== propValue) {\n domNode[propName] = propValue;\n }\n }\n else {\n domNode[propName] = propValue;\n }\n propertiesUpdated = true;\n }\n }\n }\n return propertiesUpdated;\n}\nfunction findIndexOfChild(children, sameAs, start) {\n for (let i = start; i < children.length; i++) {\n if (same(children[i], sameAs)) {\n return i;\n }\n }\n return -1;\n}\nexport function toParentVNode(domNode) {\n return {\n tag: '',\n properties: {},\n children: undefined,\n domNode,\n type: VNODE\n };\n}\nexport function toTextVNode(data) {\n return {\n tag: '',\n properties: {},\n children: undefined,\n text: `${data}`,\n domNode: undefined,\n type: VNODE\n };\n}\nfunction toInternalWNode(instance, instanceData) {\n return {\n instance,\n rendered: [],\n coreProperties: instanceData.coreProperties,\n children: instance.children,\n widgetConstructor: instance.constructor,\n properties: instanceData.inputProperties,\n type: WNODE\n };\n}\nexport function filterAndDecorateChildren(children, instance) {\n if (children === undefined) {\n return emptyArray;\n }\n children = Array.isArray(children) ? children : [children];\n for (let i = 0; i < children.length;) {\n const child = children[i];\n if (child === undefined || child === null) {\n children.splice(i, 1);\n continue;\n }\n else if (typeof child === 'string') {\n children[i] = toTextVNode(child);\n }\n else {\n if (isVNode(child)) {\n if (child.properties.bind === undefined) {\n child.properties.bind = instance;\n if (child.children && child.children.length > 0) {\n filterAndDecorateChildren(child.children, instance);\n }\n }\n }\n else {\n if (!child.coreProperties) {\n const instanceData = widgetInstanceMap.get(instance);\n child.coreProperties = {\n bind: instance,\n baseRegistry: instanceData.coreProperties.baseRegistry\n };\n }\n if (child.children && child.children.length > 0) {\n filterAndDecorateChildren(child.children, instance);\n }\n }\n }\n i++;\n }\n return children;\n}\nfunction nodeAdded(dnode, transitions) {\n if (isVNode(dnode) && dnode.properties) {\n const enterAnimation = dnode.properties.enterAnimation;\n if (enterAnimation) {\n if (typeof enterAnimation === 'function') {\n enterAnimation(dnode.domNode, dnode.properties);\n }\n else {\n transitions.enter(dnode.domNode, dnode.properties, enterAnimation);\n }\n }\n }\n}\nfunction nodeToRemove(dnode, transitions, projectionOptions) {\n if (isWNode(dnode)) {\n const item = instanceMap.get(dnode.instance);\n const rendered = (item ? item.dnode.rendered : dnode.rendered) || emptyArray;\n if (dnode.instance) {\n const instanceData = widgetInstanceMap.get(dnode.instance);\n instanceData.onDetach();\n instanceMap.delete(dnode.instance);\n }\n for (let i = 0; i < rendered.length; i++) {\n nodeToRemove(rendered[i], transitions, projectionOptions);\n }\n }\n else {\n const domNode = dnode.domNode;\n const properties = dnode.properties;\n if (dnode.children && dnode.children.length > 0) {\n for (let i = 0; i < dnode.children.length; i++) {\n nodeToRemove(dnode.children[i], transitions, projectionOptions);\n }\n }\n const exitAnimation = properties.exitAnimation;\n if (properties && exitAnimation) {\n domNode.style.pointerEvents = 'none';\n const removeDomNode = function () {\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\n dnode.domNode = undefined;\n };\n if (typeof exitAnimation === 'function') {\n exitAnimation(domNode, removeDomNode, properties);\n return;\n }\n else {\n transitions.exit(dnode.domNode, properties, exitAnimation, removeDomNode);\n return;\n }\n }\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\n dnode.domNode = undefined;\n }\n}\nfunction checkDistinguishable(childNodes, indexToCheck, parentInstance) {\n const childNode = childNodes[indexToCheck];\n if (isVNode(childNode) && !childNode.tag) {\n return; // Text nodes need not be distinguishable\n }\n const { key } = childNode.properties;\n if (key === undefined || key === null) {\n for (let i = 0; i < childNodes.length; i++) {\n if (i !== indexToCheck) {\n const node = childNodes[i];\n if (same(node, childNode)) {\n let nodeIdentifier;\n const parentName = parentInstance.constructor.name || 'unknown';\n if (isWNode(childNode)) {\n nodeIdentifier = childNode.widgetConstructor.name || 'unknown';\n }\n else {\n nodeIdentifier = childNode.tag;\n }\n console.warn(`A widget (${parentName}) has had a child addded or removed, but they were not able to uniquely identified. It is recommended to provide a unique 'key' property when using the same widget or element (${nodeIdentifier}) multiple times as siblings`);\n break;\n }\n }\n }\n }\n}\nfunction updateChildren(parentVNode, siblings, oldChildren, newChildren, parentInstance, projectionOptions) {\n oldChildren = oldChildren || emptyArray;\n newChildren = newChildren;\n const oldChildrenLength = oldChildren.length;\n const newChildrenLength = newChildren.length;\n const transitions = projectionOptions.transitions;\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\n let oldIndex = 0;\n let newIndex = 0;\n let i;\n let textUpdated = false;\n while (newIndex < newChildrenLength) {\n let oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : undefined;\n const newChild = newChildren[newIndex];\n if (isVNode(newChild) && typeof newChild.deferredPropertiesCallback === 'function') {\n newChild.inserted = isVNode(oldChild) && oldChild.inserted;\n addDeferredProperties(newChild, projectionOptions);\n }\n if (oldChild !== undefined && same(oldChild, newChild)) {\n oldIndex++;\n newIndex++;\n textUpdated =\n updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance, oldChildren.slice(oldIndex), newChildren.slice(newIndex)) || textUpdated;\n continue;\n }\n const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);\n const addChild = () => {\n let insertBeforeDomNode = undefined;\n let childrenArray = oldChildren;\n let nextIndex = oldIndex + 1;\n let child = oldChildren[oldIndex];\n if (!child) {\n child = siblings[0];\n nextIndex = 1;\n childrenArray = siblings;\n }\n if (child) {\n let insertBeforeChildren = [child];\n while (insertBeforeChildren.length) {\n const insertBefore = insertBeforeChildren.shift();\n if (isWNode(insertBefore)) {\n const item = instanceMap.get(insertBefore.instance);\n if (item && item.dnode.rendered) {\n insertBeforeChildren.push(...item.dnode.rendered);\n }\n }\n else {\n if (insertBefore.domNode) {\n if (insertBefore.domNode.parentElement !== parentVNode.domNode) {\n break;\n }\n insertBeforeDomNode = insertBefore.domNode;\n break;\n }\n }\n if (insertBeforeChildren.length === 0 && childrenArray[nextIndex]) {\n insertBeforeChildren.push(childrenArray[nextIndex]);\n nextIndex++;\n }\n }\n }\n createDom(newChild, parentVNode, newChildren.slice(newIndex + 1), insertBeforeDomNode, projectionOptions, parentInstance);\n nodeAdded(newChild, transitions);\n const indexToCheck = newIndex;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(newChildren, indexToCheck, parentInstance);\n });\n };\n if (!oldChild || findOldIndex === -1) {\n addChild();\n newIndex++;\n continue;\n }\n const removeChild = () => {\n const indexToCheck = oldIndex;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\n });\n if (isWNode(oldChild)) {\n const item = instanceMap.get(oldChild.instance);\n if (item) {\n oldChild = item.dnode;\n }\n }\n nodeToRemove(oldChild, transitions, projectionOptions);\n };\n const findNewIndex = findIndexOfChild(newChildren, oldChild, newIndex + 1);\n if (findNewIndex === -1) {\n removeChild();\n oldIndex++;\n continue;\n }\n addChild();\n removeChild();\n oldIndex++;\n newIndex++;\n }\n if (oldChildrenLength > oldIndex) {\n // Remove child fragments\n for (i = oldIndex; i < oldChildrenLength; i++) {\n const indexToCheck = i;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\n });\n let childToRemove = oldChildren[i];\n if (isWNode(childToRemove)) {\n const item = instanceMap.get(childToRemove.instance);\n if (item) {\n childToRemove = item.dnode;\n }\n }\n nodeToRemove(childToRemove, transitions, projectionOptions);\n }\n }\n return textUpdated;\n}\nfunction addChildren(parentVNode, children, projectionOptions, parentInstance, insertBefore = undefined, childNodes) {\n if (children === undefined) {\n return;\n }\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectorState.merge && childNodes === undefined) {\n childNodes = arrayFrom(parentVNode.domNode.childNodes);\n }\n const transitions = projectionOptions.transitions;\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n const nextSiblings = children.slice(i + 1);\n if (isVNode(child)) {\n if (projectorState.merge && childNodes) {\n let domElement = undefined;\n while (child.domNode === undefined && childNodes.length > 0) {\n domElement = childNodes.shift();\n if (domElement && domElement.tagName === (child.tag.toUpperCase() || undefined)) {\n child.domNode = domElement;\n }\n }\n }\n createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance);\n }\n else {\n createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes);\n }\n nodeAdded(child, transitions);\n }\n}\nfunction initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions) {\n addChildren(dnode, dnode.children, projectionOptions, parentInstance, undefined);\n if (typeof dnode.deferredPropertiesCallback === 'function' && dnode.inserted === undefined) {\n addDeferredProperties(dnode, projectionOptions);\n }\n if (dnode.attributes && dnode.events) {\n updateAttributes(domNode, {}, dnode.attributes, projectionOptions);\n updateProperties(domNode, {}, dnode.properties, projectionOptions, false);\n removeOrphanedEvents(domNode, {}, dnode.events, projectionOptions, true);\n const events = dnode.events;\n Object.keys(events).forEach((event) => {\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind);\n });\n }\n else {\n updateProperties(domNode, {}, dnode.properties, projectionOptions);\n }\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\n const instanceData = widgetInstanceMap.get(parentInstance);\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\n }\n dnode.inserted = true;\n}\nfunction createDom(dnode, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes) {\n let domNode;\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (isWNode(dnode)) {\n let { widgetConstructor } = dnode;\n const parentInstanceData = widgetInstanceMap.get(parentInstance);\n if (!isWidgetBaseConstructor(widgetConstructor)) {\n const item = parentInstanceData.registry().get(widgetConstructor);\n if (item === null) {\n return;\n }\n widgetConstructor = item;\n }\n const instance = new widgetConstructor();\n dnode.instance = instance;\n nextSiblingMap.set(instance, nextSiblings);\n const instanceData = widgetInstanceMap.get(instance);\n instanceData.invalidate = () => {\n instanceData.dirty = true;\n if (instanceData.rendering === false) {\n projectorState.renderQueue.push({ instance, depth: projectionOptions.depth });\n scheduleRender(projectionOptions);\n }\n };\n instanceData.rendering = true;\n instance.__setCoreProperties__(dnode.coreProperties);\n instance.__setChildren__(dnode.children);\n instance.__setProperties__(dnode.properties);\n const rendered = instance.__render__();\n instanceData.rendering = false;\n if (rendered) {\n const filteredRendered = filterAndDecorateChildren(rendered, instance);\n dnode.rendered = filteredRendered;\n addChildren(parentVNode, filteredRendered, projectionOptions, instance, insertBefore, childNodes);\n }\n instanceMap.set(instance, { dnode, parentVNode });\n instanceData.nodeHandler.addRoot();\n projectorState.afterRenderCallbacks.push(() => {\n instanceData.onAttach();\n });\n }\n else {\n if (projectorState.merge && projectorState.mergeElement !== undefined) {\n domNode = dnode.domNode = projectionOptions.mergeElement;\n projectorState.mergeElement = undefined;\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\n return;\n }\n const doc = parentVNode.domNode.ownerDocument;\n if (!dnode.tag && typeof dnode.text === 'string') {\n if (dnode.domNode !== undefined && parentVNode.domNode) {\n const newDomNode = dnode.domNode.ownerDocument.createTextNode(dnode.text);\n if (parentVNode.domNode === dnode.domNode.parentNode) {\n parentVNode.domNode.replaceChild(newDomNode, dnode.domNode);\n }\n else {\n parentVNode.domNode.appendChild(newDomNode);\n dnode.domNode.parentNode && dnode.domNode.parentNode.removeChild(dnode.domNode);\n }\n dnode.domNode = newDomNode;\n }\n else {\n domNode = dnode.domNode = doc.createTextNode(dnode.text);\n if (insertBefore !== undefined) {\n parentVNode.domNode.insertBefore(domNode, insertBefore);\n }\n else {\n parentVNode.domNode.appendChild(domNode);\n }\n }\n }\n else {\n if (dnode.domNode === undefined) {\n if (dnode.tag === 'svg') {\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\n }\n if (projectionOptions.namespace !== undefined) {\n domNode = dnode.domNode = doc.createElementNS(projectionOptions.namespace, dnode.tag);\n }\n else {\n domNode = dnode.domNode = dnode.domNode || doc.createElement(dnode.tag);\n }\n }\n else {\n domNode = dnode.domNode;\n }\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\n if (insertBefore !== undefined) {\n parentVNode.domNode.insertBefore(domNode, insertBefore);\n }\n else if (domNode.parentNode !== parentVNode.domNode) {\n parentVNode.domNode.appendChild(domNode);\n }\n }\n }\n}\nfunction updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance, oldNextSiblings, nextSiblings) {\n if (isWNode(dnode)) {\n const { instance } = previous;\n const { parentVNode, dnode: node } = instanceMap.get(instance);\n const previousRendered = node ? node.rendered : previous.rendered;\n const instanceData = widgetInstanceMap.get(instance);\n instanceData.rendering = true;\n instance.__setCoreProperties__(dnode.coreProperties);\n instance.__setChildren__(dnode.children);\n instance.__setProperties__(dnode.properties);\n nextSiblingMap.set(instance, nextSiblings);\n dnode.instance = instance;\n if (instanceData.dirty === true) {\n const rendered = instance.__render__();\n instanceData.rendering = false;\n dnode.rendered = filterAndDecorateChildren(rendered, instance);\n updateChildren(parentVNode, oldNextSiblings, previousRendered, dnode.rendered, instance, projectionOptions);\n }\n else {\n instanceData.rendering = false;\n dnode.rendered = previousRendered;\n }\n instanceMap.set(instance, { dnode, parentVNode });\n instanceData.nodeHandler.addRoot();\n }\n else {\n if (previous === dnode) {\n return false;\n }\n const domNode = (dnode.domNode = previous.domNode);\n let textUpdated = false;\n let updated = false;\n if (!dnode.tag && typeof dnode.text === 'string') {\n if (dnode.text !== previous.text) {\n const newDomNode = domNode.ownerDocument.createTextNode(dnode.text);\n domNode.parentNode.replaceChild(newDomNode, domNode);\n dnode.domNode = newDomNode;\n textUpdated = true;\n return textUpdated;\n }\n }\n else {\n if (dnode.tag && dnode.tag.lastIndexOf('svg', 0) === 0) {\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\n }\n if (previous.children !== dnode.children) {\n const children = filterAndDecorateChildren(dnode.children, parentInstance);\n dnode.children = children;\n updated =\n updateChildren(dnode, oldNextSiblings, previous.children, children, parentInstance, projectionOptions) || updated;\n }\n const previousProperties = buildPreviousProperties(domNode, previous, dnode);\n if (dnode.attributes && dnode.events) {\n updateAttributes(domNode, previousProperties.attributes, dnode.attributes, projectionOptions);\n updated =\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions, false) || updated;\n removeOrphanedEvents(domNode, previousProperties.events, dnode.events, projectionOptions, true);\n const events = dnode.events;\n Object.keys(events).forEach((event) => {\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind, previousProperties.events[event]);\n });\n }\n else {\n updated =\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions) ||\n updated;\n }\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\n const instanceData = widgetInstanceMap.get(parentInstance);\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\n }\n }\n if (updated && dnode.properties && dnode.properties.updateAnimation) {\n dnode.properties.updateAnimation(domNode, dnode.properties, previous.properties);\n }\n }\n}\nfunction addDeferredProperties(vnode, projectionOptions) {\n // transfer any properties that have been passed - as these must be decorated properties\n vnode.decoratedDeferredProperties = vnode.properties;\n const properties = vnode.deferredPropertiesCallback(!!vnode.inserted);\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n vnode.properties = Object.assign({}, properties, vnode.decoratedDeferredProperties);\n projectorState.deferredRenderCallbacks.push(() => {\n const properties = Object.assign({}, vnode.deferredPropertiesCallback(!!vnode.inserted), vnode.decoratedDeferredProperties);\n updateProperties(vnode.domNode, vnode.properties, properties, projectionOptions);\n vnode.properties = properties;\n });\n}\nfunction runDeferredRenderCallbacks(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectorState.deferredRenderCallbacks.length) {\n if (projectionOptions.sync) {\n while (projectorState.deferredRenderCallbacks.length) {\n const callback = projectorState.deferredRenderCallbacks.shift();\n callback && callback();\n }\n }\n else {\n global.requestAnimationFrame(() => {\n while (projectorState.deferredRenderCallbacks.length) {\n const callback = projectorState.deferredRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n }\n}\nfunction runAfterRenderCallbacks(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectionOptions.sync) {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n }\n else {\n if (global.requestIdleCallback) {\n global.requestIdleCallback(() => {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n else {\n setTimeout(() => {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n }\n}\nfunction scheduleRender(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectionOptions.sync) {\n render(projectionOptions);\n }\n else if (projectorState.renderScheduled === undefined) {\n projectorState.renderScheduled = global.requestAnimationFrame(() => {\n render(projectionOptions);\n });\n }\n}\nfunction render(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectorState.renderScheduled = undefined;\n const renderQueue = projectorState.renderQueue;\n const renders = [...renderQueue];\n projectorState.renderQueue = [];\n renders.sort((a, b) => a.depth - b.depth);\n const previouslyRendered = [];\n while (renders.length) {\n const { instance } = renders.shift();\n if (instanceMap.has(instance) && previouslyRendered.indexOf(instance) === -1) {\n previouslyRendered.push(instance);\n const { parentVNode, dnode } = instanceMap.get(instance);\n const instanceData = widgetInstanceMap.get(instance);\n const nextSiblings = nextSiblingMap.get(instance);\n updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance, nextSiblings, nextSiblings);\n }\n }\n runAfterRenderCallbacks(projectionOptions);\n runDeferredRenderCallbacks(projectionOptions);\n}\nexport const dom = {\n append: function (parentNode, instance, projectionOptions = {}) {\n const instanceData = widgetInstanceMap.get(instance);\n const finalProjectorOptions = getProjectionOptions(projectionOptions, instance);\n const projectorState = {\n afterRenderCallbacks: [],\n deferredRenderCallbacks: [],\n nodeMap: new WeakMap(),\n renderScheduled: undefined,\n renderQueue: [],\n merge: projectionOptions.merge || false,\n mergeElement: projectionOptions.mergeElement\n };\n projectorStateMap.set(instance, projectorState);\n finalProjectorOptions.rootNode = parentNode;\n const parentVNode = toParentVNode(finalProjectorOptions.rootNode);\n const node = toInternalWNode(instance, instanceData);\n instanceMap.set(instance, { dnode: node, parentVNode });\n instanceData.invalidate = () => {\n instanceData.dirty = true;\n if (instanceData.rendering === false) {\n projectorState.renderQueue.push({ instance, depth: finalProjectorOptions.depth });\n scheduleRender(finalProjectorOptions);\n }\n };\n updateDom(node, node, finalProjectorOptions, parentVNode, instance, [], []);\n projectorState.afterRenderCallbacks.push(() => {\n instanceData.onAttach();\n });\n runDeferredRenderCallbacks(finalProjectorOptions);\n runAfterRenderCallbacks(finalProjectorOptions);\n return {\n domNode: finalProjectorOptions.rootNode\n };\n },\n create: function (instance, projectionOptions) {\n return this.append(document.createElement('div'), instance, projectionOptions);\n },\n merge: function (element, instance, projectionOptions = {}) {\n projectionOptions.merge = true;\n projectionOptions.mergeElement = element;\n const projection = this.append(element.parentNode, instance, projectionOptions);\n const projectorState = projectorStateMap.get(instance);\n projectorState.merge = false;\n return projection;\n }\n};\n//# sourceMappingURL=vdom.mjs.map" }, { "id": "./node_modules/imports-loader/index.js?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js", @@ -2332,7 +2341,7 @@ "name": "./node_modules/imports-loader?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js", "index": 1, "index2": 41, - "size": 273, + "size": 283, "cacheable": true, "built": true, "optional": false, @@ -2362,7 +2371,7 @@ "providedExports": null, "optimizationBailout": [], "depth": 1, - "source": "/*** IMPORTS FROM imports-loader ***/\nvar widgetFactory = require(\"src/menu/Menu\");\n\nvar registerCustomElement = require('@dojo/widget-core/registerCustomElement').default;\n\nvar defaultExport = widgetFactory.default;\ndefaultExport && registerCustomElement(defaultExport);\n\n" + "source": "/*** IMPORTS FROM imports-loader ***/\nvar widgetFactory = require(\"src/menu/Menu\");\n\nvar registerCustomElement = require('@dojo/framework/widget-core/registerCustomElement').default;\n\nvar defaultExport = widgetFactory.default;\ndefaultExport && registerCustomElement(defaultExport);\n\n" }, { "id": "./node_modules/process/browser.js", @@ -2379,21 +2388,21 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/has/has.mjs", - "issuerId": "./node_modules/@dojo/has/has.mjs", - "issuerName": "./node_modules/@dojo/has/has.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/has/has.mjs", + "issuerId": "./node_modules/@dojo/framework/has/has.mjs", + "issuerName": "./node_modules/@dojo/framework/has/has.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/has/has.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/has/has.mjs", - "module": "./node_modules/@dojo/has/has.mjs", - "moduleName": "./node_modules/@dojo/has/has.mjs", + "moduleId": "./node_modules/@dojo/framework/has/has.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/has/has.mjs", + "module": "./node_modules/@dojo/framework/has/has.mjs", + "moduleName": "./node_modules/@dojo/framework/has/has.mjs", "type": "cjs require", "userRequest": "process", - "loc": "1:0-37" + "loc": "1:0-40" } ], "usedExports": true, @@ -2417,18 +2426,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "tslib", "loc": "1:0-33" @@ -2443,19 +2452,19 @@ "loc": "1:0-33" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "tslib", "loc": "1:0-33" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "tslib", "loc": "1:0-33" @@ -2463,7 +2472,6 @@ ], "usedExports": [ "__decorate", - "__metadata", "__rest" ], "providedExports": [ @@ -2504,30 +2512,30 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/global.mjs", - "issuerId": "./node_modules/@dojo/shim/global.mjs", - "issuerName": "./node_modules/@dojo/shim/global.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/global.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/global.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/global.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/global.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/global.mjs", - "module": "./node_modules/@dojo/shim/global.mjs", - "moduleName": "./node_modules/@dojo/shim/global.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/global.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/global.mjs", + "module": "./node_modules/@dojo/framework/shim/global.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/global.mjs", "type": "cjs require", "userRequest": "global", - "loc": "1:0-44" + "loc": "1:0-47" }, { - "moduleId": "./node_modules/@dojo/has/has.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/has/has.mjs", - "module": "./node_modules/@dojo/has/has.mjs", - "moduleName": "./node_modules/@dojo/has/has.mjs", + "moduleId": "./node_modules/@dojo/framework/has/has.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/has/has.mjs", + "module": "./node_modules/@dojo/framework/has/has.mjs", + "moduleName": "./node_modules/@dojo/framework/has/has.mjs", "type": "cjs require", "userRequest": "global", - "loc": "1:0-44" + "loc": "1:0-47" } ], "usedExports": true, @@ -2542,7 +2550,7 @@ "name": "./src/menu/Menu.ts", "index": 2, "index2": 40, - "size": 1419, + "size": 1459, "cacheable": true, "built": true, "optional": false, @@ -2575,7 +2583,7 @@ ], "optimizationBailout": [], "depth": 2, - "source": "import * as tslib_1 from \"tslib\";\nimport { v } from '@dojo/widget-core/d';\nimport { customElement } from '@dojo/widget-core/decorators/customElement';\nimport { theme, ThemedMixin } from '@dojo/widget-core/mixins/Themed';\nimport { WidgetBase } from '@dojo/widget-core/WidgetBase';\nimport * as css from './menu.m.css';\nlet Menu = class Menu extends ThemedMixin(WidgetBase) {\n _onSelected(id, data) {\n this._selectedId = id;\n this.properties.onSelected(data);\n this.invalidate();\n }\n render() {\n const items = this.children.map((child, index) => {\n if (child) {\n const properties = {\n onSelected: (data) => {\n this._onSelected(index, data);\n }\n };\n if (this._selectedId !== undefined) {\n properties.selected = index === this._selectedId;\n }\n child.properties = Object.assign({}, child.properties, properties);\n }\n return child;\n });\n return v('nav', { classes: this.theme(css.root) }, [\n v('ol', {\n classes: this.theme(css.menuContainer)\n }, items)\n ]);\n }\n};\nMenu = tslib_1.__decorate([\n customElement({\n tag: 'demo-menu',\n events: ['onSelected']\n }),\n theme(css)\n], Menu);\nexport { Menu };\nexport default Menu;\n" + "source": "import * as tslib_1 from \"tslib\";\nimport { v } from '@dojo/framework/widget-core/d';\nimport { customElement } from '@dojo/framework/widget-core/decorators/customElement';\nimport { theme, ThemedMixin } from '@dojo/framework/widget-core/mixins/Themed';\nimport { WidgetBase } from '@dojo/framework/widget-core/WidgetBase';\nimport * as css from './menu.m.css';\nlet Menu = class Menu extends ThemedMixin(WidgetBase) {\n _onSelected(id, data) {\n this._selectedId = id;\n this.properties.onSelected(data);\n this.invalidate();\n }\n render() {\n const items = this.children.map((child, index) => {\n if (child) {\n const properties = {\n onSelected: (data) => {\n this._onSelected(index, data);\n }\n };\n if (this._selectedId !== undefined) {\n properties.selected = index === this._selectedId;\n }\n child.properties = Object.assign({}, child.properties, properties);\n }\n return child;\n });\n return v('nav', { classes: this.theme(css.root) }, [\n v('ol', {\n classes: this.theme(css.menuContainer)\n }, items)\n ]);\n }\n};\nMenu = tslib_1.__decorate([\n customElement({\n tag: 'demo-menu',\n events: ['onSelected']\n }),\n theme(css)\n], Menu);\nexport { Menu };\nexport default Menu;\n" }, { "id": "./src/menu/menu.m.css", @@ -2632,12 +2640,12 @@ ], "modules": [ { - "id": "./node_modules/@dojo/core/Destroyable.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Destroyable.mjs", - "name": "./node_modules/@dojo/core/Destroyable.mjs", + "id": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Destroyable.mjs", + "name": "./node_modules/@dojo/framework/core/Destroyable.mjs", "index": 25, "index2": 17, - "size": 1668, + "size": 1665, "cacheable": true, "built": true, "optional": false, @@ -2646,18 +2654,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Evented.mjs", - "issuerId": "./node_modules/@dojo/core/Evented.mjs", - "issuerName": "./node_modules/@dojo/core/Evented.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Evented.mjs", + "issuerId": "./node_modules/@dojo/framework/core/Evented.mjs", + "issuerName": "./node_modules/@dojo/framework/core/Evented.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/core/Evented.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Evented.mjs", - "module": "./node_modules/@dojo/core/Evented.mjs", - "moduleName": "./node_modules/@dojo/core/Evented.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Evented.mjs", + "module": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Evented.mjs", "type": "harmony import", "userRequest": "./Destroyable", "loc": "2:0-44" @@ -2672,15 +2680,15 @@ ], "optimizationBailout": [], "depth": 6, - "source": "import { createCompositeHandle } from './lang';\nimport Promise from '@dojo/shim/Promise';\n/**\n * No operation function to replace own once instance is destoryed\n */\nfunction noop() {\n return Promise.resolve(false);\n}\n/**\n * No op function used to replace own, once instance has been destoryed\n */\nfunction destroyed() {\n throw new Error('Call made to destroyed method');\n}\nexport class Destroyable {\n /**\n * @constructor\n */\n constructor() {\n this.handles = [];\n }\n /**\n * Register handles for the instance that will be destroyed when `this.destroy` is called\n *\n * @param {Handle} handle The handle to add for the instance\n * @returns {Handle} a handle for the handle, removes the handle for the instance and calls destroy\n */\n own(handles) {\n const handle = Array.isArray(handles) ? createCompositeHandle(...handles) : handles;\n const { handles: _handles } = this;\n _handles.push(handle);\n return {\n destroy() {\n _handles.splice(_handles.indexOf(handle));\n handle.destroy();\n }\n };\n }\n /**\n * Destrpys all handers registered for the instance\n *\n * @returns {Promise {\n this.handles.forEach((handle) => {\n handle && handle.destroy && handle.destroy();\n });\n this.destroy = noop;\n this.own = destroyed;\n resolve(true);\n });\n }\n}\nexport default Destroyable;\n//# sourceMappingURL=Destroyable.mjs.map" + "source": "import { createCompositeHandle } from './lang';\nimport Promise from '../shim/Promise';\n/**\n * No operation function to replace own once instance is destoryed\n */\nfunction noop() {\n return Promise.resolve(false);\n}\n/**\n * No op function used to replace own, once instance has been destoryed\n */\nfunction destroyed() {\n throw new Error('Call made to destroyed method');\n}\nexport class Destroyable {\n /**\n * @constructor\n */\n constructor() {\n this.handles = [];\n }\n /**\n * Register handles for the instance that will be destroyed when `this.destroy` is called\n *\n * @param {Handle} handle The handle to add for the instance\n * @returns {Handle} a handle for the handle, removes the handle for the instance and calls destroy\n */\n own(handles) {\n const handle = Array.isArray(handles) ? createCompositeHandle(...handles) : handles;\n const { handles: _handles } = this;\n _handles.push(handle);\n return {\n destroy() {\n _handles.splice(_handles.indexOf(handle));\n handle.destroy();\n }\n };\n }\n /**\n * Destrpys all handers registered for the instance\n *\n * @returns {Promise {\n this.handles.forEach((handle) => {\n handle && handle.destroy && handle.destroy();\n });\n this.destroy = noop;\n this.own = destroyed;\n resolve(true);\n });\n }\n}\nexport default Destroyable;\n//# sourceMappingURL=Destroyable.mjs.map" }, { - "id": "./node_modules/@dojo/core/Evented.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Evented.mjs", - "name": "./node_modules/@dojo/core/Evented.mjs", + "id": "./node_modules/@dojo/framework/core/Evented.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Evented.mjs", + "name": "./node_modules/@dojo/framework/core/Evented.mjs", "index": 24, "index2": 18, - "size": 2149, + "size": 2151, "cacheable": true, "built": true, "optional": false, @@ -2689,48 +2697,48 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/NodeHandler.mjs", - "issuerId": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "issuerName": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/NodeHandler.mjs", - "module": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "1:0-45" + "userRequest": "../core/Evented", + "loc": "2:0-42" }, { - "moduleId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/RegistryHandler.mjs", - "module": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "2:0-45" + "userRequest": "../core/Evented", + "loc": "1:0-42" }, { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "4:0-45" + "userRequest": "../core/Evented", + "loc": "4:0-42" }, { - "moduleId": "./node_modules/@dojo/widget-core/Injector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Injector.mjs", - "module": "./node_modules/@dojo/widget-core/Injector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Injector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Injector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Injector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Injector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Injector.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "1:0-45" + "userRequest": "../core/Evented", + "loc": "1:0-42" } ], "usedExports": [ @@ -2743,15 +2751,15 @@ ], "optimizationBailout": [], "depth": 5, - "source": "import Map from '@dojo/shim/Map';\nimport { Destroyable } from './Destroyable';\n/**\n * Map of computed regular expressions, keyed by string\n */\nconst regexMap = new Map();\n/**\n * Determines is the event type glob has been matched\n *\n * @returns boolean that indicates if the glob is matched\n */\nexport function isGlobMatch(globString, targetString) {\n if (typeof targetString === 'string' && typeof globString === 'string' && globString.indexOf('*') !== -1) {\n let regex;\n if (regexMap.has(globString)) {\n regex = regexMap.get(globString);\n }\n else {\n regex = new RegExp(`^${globString.replace(/\\*/g, '.*')}$`);\n regexMap.set(globString, regex);\n }\n return regex.test(targetString);\n }\n else {\n return globString === targetString;\n }\n}\n/**\n * Event Class\n */\nexport class Evented extends Destroyable {\n constructor() {\n super(...arguments);\n /**\n * map of listeners keyed by event type\n */\n this.listenersMap = new Map();\n }\n emit(event) {\n this.listenersMap.forEach((methods, type) => {\n if (isGlobMatch(type, event.type)) {\n methods.forEach((method) => {\n method.call(this, event);\n });\n }\n });\n }\n on(type, listener) {\n if (Array.isArray(listener)) {\n const handles = listener.map((listener) => this._addListener(type, listener));\n return {\n destroy() {\n handles.forEach((handle) => handle.destroy());\n }\n };\n }\n return this._addListener(type, listener);\n }\n _addListener(type, listener) {\n const listeners = this.listenersMap.get(type) || [];\n listeners.push(listener);\n this.listenersMap.set(type, listeners);\n return {\n destroy: () => {\n const listeners = this.listenersMap.get(type) || [];\n listeners.splice(listeners.indexOf(listener), 1);\n }\n };\n }\n}\nexport default Evented;\n//# sourceMappingURL=Evented.mjs.map" + "source": "import Map from '../shim/Map';\nimport { Destroyable } from './Destroyable';\n/**\n * Map of computed regular expressions, keyed by string\n */\nconst regexMap = new Map();\n/**\n * Determines is the event type glob has been matched\n *\n * @returns boolean that indicates if the glob is matched\n */\nexport function isGlobMatch(globString, targetString) {\n if (typeof targetString === 'string' && typeof globString === 'string' && globString.indexOf('*') !== -1) {\n let regex;\n if (regexMap.has(globString)) {\n regex = regexMap.get(globString);\n }\n else {\n regex = new RegExp(`^${globString.replace(/\\*/g, '.*')}$`);\n regexMap.set(globString, regex);\n }\n return regex.test(targetString);\n }\n else {\n return globString === targetString;\n }\n}\n/**\n * Event Class\n */\nexport class Evented extends Destroyable {\n constructor() {\n super(...arguments);\n /**\n * map of listeners keyed by event type\n */\n this.listenersMap = new Map();\n }\n emit(event) {\n this.listenersMap.forEach((methods, type) => {\n if (isGlobMatch(type, event.type)) {\n [...methods].forEach((method) => {\n method.call(this, event);\n });\n }\n });\n }\n on(type, listener) {\n if (Array.isArray(listener)) {\n const handles = listener.map((listener) => this._addListener(type, listener));\n return {\n destroy() {\n handles.forEach((handle) => handle.destroy());\n }\n };\n }\n return this._addListener(type, listener);\n }\n _addListener(type, listener) {\n const listeners = this.listenersMap.get(type) || [];\n listeners.push(listener);\n this.listenersMap.set(type, listeners);\n return {\n destroy: () => {\n const listeners = this.listenersMap.get(type) || [];\n listeners.splice(listeners.indexOf(listener), 1);\n }\n };\n }\n}\nexport default Evented;\n//# sourceMappingURL=Evented.mjs.map" }, { - "id": "./node_modules/@dojo/core/lang.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/lang.mjs", - "name": "./node_modules/@dojo/core/lang.mjs", + "id": "./node_modules/@dojo/framework/core/lang.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/lang.mjs", + "name": "./node_modules/@dojo/framework/core/lang.mjs", "index": 26, "index2": 16, - "size": 6843, + "size": 6837, "cacheable": true, "built": true, "optional": false, @@ -2760,27 +2768,27 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", - "userRequest": "@dojo/core/lang", + "userRequest": "../../core/lang", "loc": "2:0-41" }, { - "moduleId": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Destroyable.mjs", - "module": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleName": "./node_modules/@dojo/core/Destroyable.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Destroyable.mjs", + "module": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Destroyable.mjs", "type": "harmony import", "userRequest": "./lang", "loc": "1:0-47" @@ -2805,12 +2813,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { assign } from '@dojo/shim/object';\nexport { assign } from '@dojo/shim/object';\nconst slice = Array.prototype.slice;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Type guard that ensures that the value can be coerced to Object\n * to weed out host objects that do not derive from Object.\n * This function is used to check if we want to deep copy an object or not.\n * Note: In ES6 it is possible to modify an object's Symbol.toStringTag property, which will\n * change the value returned by `toString`. This is a rare edge case that is difficult to handle,\n * so it is not handled here.\n * @param value The value to check\n * @return If the value is coercible into an Object\n */\nfunction shouldDeepCopyObject(value) {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\nfunction copyArray(array, inherited) {\n return array.map(function (item) {\n if (Array.isArray(item)) {\n return copyArray(item, inherited);\n }\n return !shouldDeepCopyObject(item)\n ? item\n : _mixin({\n deep: true,\n inherited: inherited,\n sources: [item],\n target: {}\n });\n });\n}\nfunction _mixin(kwArgs) {\n const deep = kwArgs.deep;\n const inherited = kwArgs.inherited;\n const target = kwArgs.target;\n const copied = kwArgs.copied || [];\n const copiedClone = [...copied];\n for (let i = 0; i < kwArgs.sources.length; i++) {\n const source = kwArgs.sources[i];\n if (source === null || source === undefined) {\n continue;\n }\n for (let key in source) {\n if (inherited || hasOwnProperty.call(source, key)) {\n let value = source[key];\n if (copiedClone.indexOf(value) !== -1) {\n continue;\n }\n if (deep) {\n if (Array.isArray(value)) {\n value = copyArray(value, inherited);\n }\n else if (shouldDeepCopyObject(value)) {\n const targetValue = target[key] || {};\n copied.push(source);\n value = _mixin({\n deep: true,\n inherited: inherited,\n sources: [value],\n target: targetValue,\n copied\n });\n }\n }\n target[key] = value;\n }\n }\n }\n return target;\n}\nexport function create(prototype, ...mixins) {\n if (!mixins.length) {\n throw new RangeError('lang.create requires at least one mixin object.');\n }\n const args = mixins.slice();\n args.unshift(Object.create(prototype));\n return assign.apply(null, args);\n}\nexport function deepAssign(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: false,\n sources: sources,\n target: target\n });\n}\nexport function deepMixin(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Creates a new object using the provided source's prototype as the prototype for the new object, and then\n * deep copies the provided source's values into the new target.\n *\n * @param source The object to duplicate\n * @return The new object\n */\nexport function duplicate(source) {\n const target = Object.create(Object.getPrototypeOf(source));\n return deepMixin(target, source);\n}\n/**\n * Determines whether two values are the same value.\n *\n * @param a First value to compare\n * @param b Second value to compare\n * @return true if the values are the same; false otherwise\n */\nexport function isIdentical(a, b) {\n return (a === b ||\n /* both values are NaN */\n (a !== a && b !== b));\n}\n/**\n * Returns a function that binds a method to the specified object at runtime. This is similar to\n * `Function.prototype.bind`, but instead of a function it takes the name of a method on an object.\n * As a result, the function returned by `lateBind` will always call the function currently assigned to\n * the specified property on the object as of the moment the function it returns is called.\n *\n * @param instance The context object\n * @param method The name of the method on the context object to bind to itself\n * @param suppliedArgs An optional array of values to prepend to the `instance[method]` arguments list\n * @return The bound function\n */\nexport function lateBind(instance, method, ...suppliedArgs) {\n return suppliedArgs.length\n ? function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n // TS7017\n return instance[method].apply(instance, args);\n }\n : function () {\n // TS7017\n return instance[method].apply(instance, arguments);\n };\n}\nexport function mixin(target, ...sources) {\n return _mixin({\n deep: false,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Returns a function which invokes the given function with the given arguments prepended to its argument list.\n * Like `Function.prototype.bind`, but does not alter execution context.\n *\n * @param targetFunction The function that needs to be bound\n * @param suppliedArgs An optional array of arguments to prepend to the `targetFunction` arguments list\n * @return The bound function\n */\nexport function partial(targetFunction, ...suppliedArgs) {\n return function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n return targetFunction.apply(this, args);\n };\n}\n/**\n * Returns an object with a destroy method that, when called, calls the passed-in destructor.\n * This is intended to provide a unified interface for creating \"remove\" / \"destroy\" handlers for\n * event listeners, timers, etc.\n *\n * @param destructor A function that will be called when the handle's `destroy` method is invoked\n * @return The handle object\n */\nexport function createHandle(destructor) {\n let called = false;\n return {\n destroy: function () {\n if (!called) {\n called = true;\n destructor();\n }\n }\n };\n}\n/**\n * Returns a single handle that can be used to destroy multiple handles simultaneously.\n *\n * @param handles An array of handles with `destroy` methods\n * @return The handle object\n */\nexport function createCompositeHandle(...handles) {\n return createHandle(function () {\n for (let i = 0; i < handles.length; i++) {\n handles[i].destroy();\n }\n });\n}\n//# sourceMappingURL=lang.mjs.map" + "source": "import { assign } from '../shim/object';\nexport { assign } from '../shim/object';\nconst slice = Array.prototype.slice;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Type guard that ensures that the value can be coerced to Object\n * to weed out host objects that do not derive from Object.\n * This function is used to check if we want to deep copy an object or not.\n * Note: In ES6 it is possible to modify an object's Symbol.toStringTag property, which will\n * change the value returned by `toString`. This is a rare edge case that is difficult to handle,\n * so it is not handled here.\n * @param value The value to check\n * @return If the value is coercible into an Object\n */\nfunction shouldDeepCopyObject(value) {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\nfunction copyArray(array, inherited) {\n return array.map(function (item) {\n if (Array.isArray(item)) {\n return copyArray(item, inherited);\n }\n return !shouldDeepCopyObject(item)\n ? item\n : _mixin({\n deep: true,\n inherited: inherited,\n sources: [item],\n target: {}\n });\n });\n}\nfunction _mixin(kwArgs) {\n const deep = kwArgs.deep;\n const inherited = kwArgs.inherited;\n const target = kwArgs.target;\n const copied = kwArgs.copied || [];\n const copiedClone = [...copied];\n for (let i = 0; i < kwArgs.sources.length; i++) {\n const source = kwArgs.sources[i];\n if (source === null || source === undefined) {\n continue;\n }\n for (let key in source) {\n if (inherited || hasOwnProperty.call(source, key)) {\n let value = source[key];\n if (copiedClone.indexOf(value) !== -1) {\n continue;\n }\n if (deep) {\n if (Array.isArray(value)) {\n value = copyArray(value, inherited);\n }\n else if (shouldDeepCopyObject(value)) {\n const targetValue = target[key] || {};\n copied.push(source);\n value = _mixin({\n deep: true,\n inherited: inherited,\n sources: [value],\n target: targetValue,\n copied\n });\n }\n }\n target[key] = value;\n }\n }\n }\n return target;\n}\nexport function create(prototype, ...mixins) {\n if (!mixins.length) {\n throw new RangeError('lang.create requires at least one mixin object.');\n }\n const args = mixins.slice();\n args.unshift(Object.create(prototype));\n return assign.apply(null, args);\n}\nexport function deepAssign(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: false,\n sources: sources,\n target: target\n });\n}\nexport function deepMixin(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Creates a new object using the provided source's prototype as the prototype for the new object, and then\n * deep copies the provided source's values into the new target.\n *\n * @param source The object to duplicate\n * @return The new object\n */\nexport function duplicate(source) {\n const target = Object.create(Object.getPrototypeOf(source));\n return deepMixin(target, source);\n}\n/**\n * Determines whether two values are the same value.\n *\n * @param a First value to compare\n * @param b Second value to compare\n * @return true if the values are the same; false otherwise\n */\nexport function isIdentical(a, b) {\n return (a === b ||\n /* both values are NaN */\n (a !== a && b !== b));\n}\n/**\n * Returns a function that binds a method to the specified object at runtime. This is similar to\n * `Function.prototype.bind`, but instead of a function it takes the name of a method on an object.\n * As a result, the function returned by `lateBind` will always call the function currently assigned to\n * the specified property on the object as of the moment the function it returns is called.\n *\n * @param instance The context object\n * @param method The name of the method on the context object to bind to itself\n * @param suppliedArgs An optional array of values to prepend to the `instance[method]` arguments list\n * @return The bound function\n */\nexport function lateBind(instance, method, ...suppliedArgs) {\n return suppliedArgs.length\n ? function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n // TS7017\n return instance[method].apply(instance, args);\n }\n : function () {\n // TS7017\n return instance[method].apply(instance, arguments);\n };\n}\nexport function mixin(target, ...sources) {\n return _mixin({\n deep: false,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Returns a function which invokes the given function with the given arguments prepended to its argument list.\n * Like `Function.prototype.bind`, but does not alter execution context.\n *\n * @param targetFunction The function that needs to be bound\n * @param suppliedArgs An optional array of arguments to prepend to the `targetFunction` arguments list\n * @return The bound function\n */\nexport function partial(targetFunction, ...suppliedArgs) {\n return function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n return targetFunction.apply(this, args);\n };\n}\n/**\n * Returns an object with a destroy method that, when called, calls the passed-in destructor.\n * This is intended to provide a unified interface for creating \"remove\" / \"destroy\" handlers for\n * event listeners, timers, etc.\n *\n * @param destructor A function that will be called when the handle's `destroy` method is invoked\n * @return The handle object\n */\nexport function createHandle(destructor) {\n let called = false;\n return {\n destroy: function () {\n if (!called) {\n called = true;\n destructor();\n }\n }\n };\n}\n/**\n * Returns a single handle that can be used to destroy multiple handles simultaneously.\n *\n * @param handles An array of handles with `destroy` methods\n * @return The handle object\n */\nexport function createCompositeHandle(...handles) {\n return createHandle(function () {\n for (let i = 0; i < handles.length; i++) {\n handles[i].destroy();\n }\n });\n}\n//# sourceMappingURL=lang.mjs.map" }, { - "id": "./node_modules/@dojo/has/has.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/has/has.mjs", - "name": "./node_modules/@dojo/has/has.mjs", + "id": "./node_modules/@dojo/framework/has/has.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/has/has.mjs", + "name": "./node_modules/@dojo/framework/has/has.mjs", "index": 7, "index2": 3, "size": 6305, @@ -2822,29 +2830,29 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/has.mjs", - "issuerId": "./node_modules/@dojo/shim/support/has.mjs", - "issuerName": "./node_modules/@dojo/shim/support/has.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/has.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/support/has.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/support/has.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/has.mjs", - "module": "./node_modules/@dojo/shim/support/has.mjs", - "moduleName": "./node_modules/@dojo/shim/support/has.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/has.mjs", + "module": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/has.mjs", "type": "harmony import", - "userRequest": "@dojo/has/has", + "userRequest": "../../has/has", "loc": "1:0-41" }, { - "moduleId": "./node_modules/@dojo/shim/support/has.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/has.mjs", - "module": "./node_modules/@dojo/shim/support/has.mjs", - "moduleName": "./node_modules/@dojo/shim/support/has.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/has.mjs", + "module": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/has.mjs", "type": "harmony import", - "userRequest": "@dojo/has/has", + "userRequest": "../../has/has", "loc": "4:0-30" } ], @@ -2866,9 +2874,9 @@ "source": "function isFeatureTestThenable(value) {\n return value && value.then;\n}\n/**\n * A cache of results of feature tests\n */\nexport const testCache = {};\n/**\n * A cache of the un-resolved feature tests\n */\nexport const testFunctions = {};\n/**\n * A cache of unresolved thenables (probably promises)\n * @type {{}}\n */\nconst testThenables = {};\n/**\n * A reference to the global scope (`window` in a browser, `global` in NodeJS)\n */\nconst globalScope = (function () {\n /* istanbul ignore else */\n if (typeof window !== 'undefined') {\n // Browsers\n return window;\n }\n else if (typeof global !== 'undefined') {\n // Node\n return global;\n }\n else if (typeof self !== 'undefined') {\n // Web workers\n return self;\n }\n /* istanbul ignore next */\n return {};\n})();\n/* Grab the staticFeatures if there are available */\nconst { staticFeatures } = globalScope.DojoHasEnvironment || {};\n/* Cleaning up the DojoHasEnviornment */\nif ('DojoHasEnvironment' in globalScope) {\n delete globalScope.DojoHasEnvironment;\n}\n/**\n * Custom type guard to narrow the `staticFeatures` to either a map or a function that\n * returns a map.\n *\n * @param value The value to guard for\n */\nfunction isStaticFeatureFunction(value) {\n return typeof value === 'function';\n}\n/**\n * The cache of asserted features that were available in the global scope when the\n * module loaded\n */\nconst staticCache = staticFeatures\n ? isStaticFeatureFunction(staticFeatures) ? staticFeatures.apply(globalScope) : staticFeatures\n : {}; /* Providing an empty cache, if none was in the environment\n\n/**\n* AMD plugin function.\n*\n* Conditional loads modules based on a has feature test value.\n*\n* @param resourceId Gives the resolved module id to load.\n* @param require The loader require function with respect to the module that contained the plugin resource in its\n* dependency list.\n* @param load Callback to loader that consumes result of plugin demand.\n*/\nexport function load(resourceId, require, load, config) {\n resourceId ? require([resourceId], load) : load();\n}\n/**\n * AMD plugin function.\n *\n * Resolves resourceId into a module id based on possibly-nested tenary expression that branches on has feature test\n * value(s).\n *\n * @param resourceId The id of the module\n * @param normalize Resolves a relative module id into an absolute module id\n */\nexport function normalize(resourceId, normalize) {\n const tokens = resourceId.match(/[\\?:]|[^:\\?]*/g) || [];\n let i = 0;\n function get(skip) {\n const term = tokens[i++];\n if (term === ':') {\n // empty string module name, resolves to null\n return null;\n }\n else {\n // postfixed with a ? means it is a feature to branch on, the term is the name of the feature\n if (tokens[i++] === '?') {\n if (!skip && has(term)) {\n // matched the feature, get the first value from the options\n return get();\n }\n else {\n // did not match, get the second value, passing over the first\n get(true);\n return get(skip);\n }\n }\n // a module\n return term;\n }\n }\n const id = get();\n return id && normalize(id);\n}\n/**\n * Check if a feature has already been registered\n *\n * @param feature the name of the feature\n */\nexport function exists(feature) {\n const normalizedFeature = feature.toLowerCase();\n return Boolean(normalizedFeature in staticCache || normalizedFeature in testCache || testFunctions[normalizedFeature]);\n}\n/**\n * Register a new test for a named feature.\n *\n * @example\n * has.add('dom-addeventlistener', !!document.addEventListener);\n *\n * @example\n * has.add('touch-events', function () {\n * return 'ontouchstart' in document\n * });\n *\n * @param feature the name of the feature\n * @param value the value reported of the feature, or a function that will be executed once on first test\n * @param overwrite if an existing value should be overwritten. Defaults to false.\n */\nexport function add(feature, value, overwrite = false) {\n const normalizedFeature = feature.toLowerCase();\n if (exists(normalizedFeature) && !overwrite && !(normalizedFeature in staticCache)) {\n throw new TypeError(`Feature \"${feature}\" exists and overwrite not true.`);\n }\n if (typeof value === 'function') {\n testFunctions[normalizedFeature] = value;\n }\n else if (isFeatureTestThenable(value)) {\n testThenables[feature] = value.then((resolvedValue) => {\n testCache[feature] = resolvedValue;\n delete testThenables[feature];\n }, () => {\n delete testThenables[feature];\n });\n }\n else {\n testCache[normalizedFeature] = value;\n delete testFunctions[normalizedFeature];\n }\n}\n/**\n * Return the current value of a named feature.\n *\n * @param feature The name (if a string) or identifier (if an integer) of the feature to test.\n */\nexport default function has(feature) {\n let result;\n const normalizedFeature = feature.toLowerCase();\n if (normalizedFeature in staticCache) {\n result = staticCache[normalizedFeature];\n }\n else if (testFunctions[normalizedFeature]) {\n result = testCache[normalizedFeature] = testFunctions[normalizedFeature].call(null);\n delete testFunctions[normalizedFeature];\n }\n else if (normalizedFeature in testCache) {\n result = testCache[normalizedFeature];\n }\n else if (feature in testThenables) {\n return false;\n }\n else {\n throw new TypeError(`Attempt to detect unregistered has feature \"${feature}\"`);\n }\n return result;\n}\n/*\n * Out of the box feature tests\n */\n/* Environments */\n/* Used as a value to provide a debug only code path */\nadd('debug', true);\n/* Detects if the environment is \"browser like\" */\nadd('host-browser', typeof document !== 'undefined' && typeof location !== 'undefined');\n/* Detects if the environment appears to be NodeJS */\nadd('host-node', function () {\n if (typeof process === 'object' && process.versions && process.versions.node) {\n return process.versions.node;\n }\n});\n//# sourceMappingURL=has.mjs.map" }, { - "id": "./node_modules/@dojo/shim/Map.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "name": "./node_modules/@dojo/shim/Map.mjs", + "id": "./node_modules/@dojo/framework/shim/Map.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "name": "./node_modules/@dojo/framework/shim/Map.mjs", "index": 15, "index2": 12, "size": 3331, @@ -2880,57 +2888,57 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "1:0-33" + "userRequest": "../shim/Map", + "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/NodeHandler.mjs", - "module": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "2:0-33" + "userRequest": "../shim/Map", + "loc": "1:0-34" }, { - "moduleId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/RegistryHandler.mjs", - "module": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "1:0-37" + "userRequest": "../shim/Map", + "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "2:0-33" + "userRequest": "../shim/Map", + "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/core/Evented.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Evented.mjs", - "module": "./node_modules/@dojo/core/Evented.mjs", - "moduleName": "./node_modules/@dojo/core/Evented.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Evented.mjs", + "module": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Evented.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "1:0-33" + "userRequest": "../shim/Map", + "loc": "1:0-30" } ], "usedExports": [ @@ -2946,9 +2954,9 @@ "source": "import { isArrayLike, ShimIterator } from './iterator';\nimport global from './global';\nimport { is as objectIs } from './object';\nimport has from './support/has';\nimport './Symbol';\nexport let Map = global.Map;\nif (!true) {\n Map = (_a = class Map {\n constructor(iterable) {\n this._keys = [];\n this._values = [];\n this[Symbol.toStringTag] = 'Map';\n if (iterable) {\n if (isArrayLike(iterable)) {\n for (let i = 0; i < iterable.length; i++) {\n const value = iterable[i];\n this.set(value[0], value[1]);\n }\n }\n else {\n for (const value of iterable) {\n this.set(value[0], value[1]);\n }\n }\n }\n }\n /**\n * An alternative to Array.prototype.indexOf using Object.is\n * to check for equality. See http://mzl.la/1zuKO2V\n */\n _indexOfKey(keys, key) {\n for (let i = 0, length = keys.length; i < length; i++) {\n if (objectIs(keys[i], key)) {\n return i;\n }\n }\n return -1;\n }\n get size() {\n return this._keys.length;\n }\n clear() {\n this._keys.length = this._values.length = 0;\n }\n delete(key) {\n const index = this._indexOfKey(this._keys, key);\n if (index < 0) {\n return false;\n }\n this._keys.splice(index, 1);\n this._values.splice(index, 1);\n return true;\n }\n entries() {\n const values = this._keys.map((key, i) => {\n return [key, this._values[i]];\n });\n return new ShimIterator(values);\n }\n forEach(callback, context) {\n const keys = this._keys;\n const values = this._values;\n for (let i = 0, length = keys.length; i < length; i++) {\n callback.call(context, values[i], keys[i], this);\n }\n }\n get(key) {\n const index = this._indexOfKey(this._keys, key);\n return index < 0 ? undefined : this._values[index];\n }\n has(key) {\n return this._indexOfKey(this._keys, key) > -1;\n }\n keys() {\n return new ShimIterator(this._keys);\n }\n set(key, value) {\n let index = this._indexOfKey(this._keys, key);\n index = index < 0 ? this._keys.length : index;\n this._keys[index] = key;\n this._values[index] = value;\n return this;\n }\n values() {\n return new ShimIterator(this._values);\n }\n [Symbol.iterator]() {\n return this.entries();\n }\n },\n _a[Symbol.species] = _a,\n _a);\n}\nexport default Map;\nvar _a;\n//# sourceMappingURL=Map.mjs.map" }, { - "id": "./node_modules/@dojo/shim/Promise.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Promise.mjs", - "name": "./node_modules/@dojo/shim/Promise.mjs", + "id": "./node_modules/@dojo/framework/shim/Promise.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Promise.mjs", + "name": "./node_modules/@dojo/framework/shim/Promise.mjs", "index": 22, "index2": 15, "size": 8519, @@ -2960,30 +2968,30 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Registry.mjs", - "issuerId": "./node_modules/@dojo/widget-core/Registry.mjs", - "issuerName": "./node_modules/@dojo/widget-core/Registry.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Registry.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Promise", - "loc": "1:0-41" + "userRequest": "../shim/Promise", + "loc": "1:0-38" }, { - "moduleId": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/Destroyable.mjs", - "module": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleName": "./node_modules/@dojo/core/Destroyable.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/Destroyable.mjs", + "module": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Destroyable.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Promise", - "loc": "2:0-41" + "userRequest": "../shim/Promise", + "loc": "2:0-38" } ], "usedExports": [ @@ -2999,9 +3007,9 @@ "source": "import global from './global';\nimport { queueMicroTask } from './support/queue';\nimport './Symbol';\nimport has from './support/has';\nexport let ShimPromise = global.Promise;\nexport const isThenable = function isThenable(value) {\n return value && typeof value.then === 'function';\n};\nif (!true) {\n global.Promise = ShimPromise = (_a = class Promise {\n /**\n * Creates a new Promise.\n *\n * @constructor\n *\n * @param executor\n * The executor function is called immediately when the Promise is instantiated. It is responsible for\n * starting the asynchronous operation when it is invoked.\n *\n * The executor must call either the passed `resolve` function when the asynchronous operation has completed\n * successfully, or the `reject` function when the operation fails.\n */\n constructor(executor) {\n /**\n * The current state of this promise.\n */\n this.state = 1 /* Pending */;\n this[Symbol.toStringTag] = 'Promise';\n /**\n * If true, the resolution of this promise is chained (\"locked in\") to another promise.\n */\n let isChained = false;\n /**\n * Whether or not this promise is in a resolved state.\n */\n const isResolved = () => {\n return this.state !== 1 /* Pending */ || isChained;\n };\n /**\n * Callbacks that should be invoked once the asynchronous operation has completed.\n */\n let callbacks = [];\n /**\n * Initially pushes callbacks onto a queue for execution once this promise settles. After the promise settles,\n * enqueues callbacks for execution on the next event loop turn.\n */\n let whenFinished = function (callback) {\n if (callbacks) {\n callbacks.push(callback);\n }\n };\n /**\n * Settles this promise.\n *\n * @param newState The resolved state for this promise.\n * @param {T|any} value The resolved value for this promise.\n */\n const settle = (newState, value) => {\n // A promise can only be settled once.\n if (this.state !== 1 /* Pending */) {\n return;\n }\n this.state = newState;\n this.resolvedValue = value;\n whenFinished = queueMicroTask;\n // Only enqueue a callback runner if there are callbacks so that initially fulfilled Promises don't have to\n // wait an extra turn.\n if (callbacks && callbacks.length > 0) {\n queueMicroTask(function () {\n if (callbacks) {\n let count = callbacks.length;\n for (let i = 0; i < count; ++i) {\n callbacks[i].call(null);\n }\n callbacks = null;\n }\n });\n }\n };\n /**\n * Resolves this promise.\n *\n * @param newState The resolved state for this promise.\n * @param {T|any} value The resolved value for this promise.\n */\n const resolve = (newState, value) => {\n if (isResolved()) {\n return;\n }\n if (isThenable(value)) {\n value.then(settle.bind(null, 0 /* Fulfilled */), settle.bind(null, 2 /* Rejected */));\n isChained = true;\n }\n else {\n settle(newState, value);\n }\n };\n this.then = (onFulfilled, onRejected) => {\n return new Promise((resolve, reject) => {\n // whenFinished initially queues up callbacks for execution after the promise has settled. Once the\n // promise has settled, whenFinished will schedule callbacks for execution on the next turn through the\n // event loop.\n whenFinished(() => {\n const callback = this.state === 2 /* Rejected */ ? onRejected : onFulfilled;\n if (typeof callback === 'function') {\n try {\n resolve(callback(this.resolvedValue));\n }\n catch (error) {\n reject(error);\n }\n }\n else if (this.state === 2 /* Rejected */) {\n reject(this.resolvedValue);\n }\n else {\n resolve(this.resolvedValue);\n }\n });\n });\n };\n try {\n executor(resolve.bind(null, 0 /* Fulfilled */), resolve.bind(null, 2 /* Rejected */));\n }\n catch (error) {\n settle(2 /* Rejected */, error);\n }\n }\n static all(iterable) {\n return new this(function (resolve, reject) {\n const values = [];\n let complete = 0;\n let total = 0;\n let populating = true;\n function fulfill(index, value) {\n values[index] = value;\n ++complete;\n finish();\n }\n function finish() {\n if (populating || complete < total) {\n return;\n }\n resolve(values);\n }\n function processItem(index, item) {\n ++total;\n if (isThenable(item)) {\n // If an item Promise rejects, this Promise is immediately rejected with the item\n // Promise's rejection error.\n item.then(fulfill.bind(null, index), reject);\n }\n else {\n Promise.resolve(item).then(fulfill.bind(null, index));\n }\n }\n let i = 0;\n for (const value of iterable) {\n processItem(i, value);\n i++;\n }\n populating = false;\n finish();\n });\n }\n static race(iterable) {\n return new this(function (resolve, reject) {\n for (const item of iterable) {\n if (item instanceof Promise) {\n // If a Promise item rejects, this Promise is immediately rejected with the item\n // Promise's rejection error.\n item.then(resolve, reject);\n }\n else {\n Promise.resolve(item).then(resolve);\n }\n }\n });\n }\n static reject(reason) {\n return new this(function (resolve, reject) {\n reject(reason);\n });\n }\n static resolve(value) {\n return new this(function (resolve) {\n resolve(value);\n });\n }\n catch(onRejected) {\n return this.then(undefined, onRejected);\n }\n },\n _a[Symbol.species] = ShimPromise,\n _a);\n}\nexport default ShimPromise;\nvar _a;\n//# sourceMappingURL=Promise.mjs.map" }, { - "id": "./node_modules/@dojo/shim/Symbol.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Symbol.mjs", - "name": "./node_modules/@dojo/shim/Symbol.mjs", + "id": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Symbol.mjs", + "name": "./node_modules/@dojo/framework/shim/Symbol.mjs", "index": 5, "index2": 7, "size": 5929, @@ -3013,81 +3021,81 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "type": "harmony import", - "userRequest": "@dojo/shim/Symbol", - "loc": "3:0-39" - }, - { - "moduleId": "./node_modules/@dojo/widget-core/d.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/d.mjs", - "module": "./node_modules/@dojo/widget-core/d.mjs", - "moduleName": "./node_modules/@dojo/widget-core/d.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Symbol", - "loc": "1:0-39" + "userRequest": "../shim/Symbol", + "loc": "3:0-36" }, { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/d.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/d.mjs", + "module": "./node_modules/@dojo/framework/widget-core/d.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/d.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Symbol", - "loc": "3:0-39" + "userRequest": "../shim/Symbol", + "loc": "1:0-36" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "5:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "4:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/iterator.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/iterator.mjs", - "module": "./node_modules/@dojo/shim/iterator.mjs", - "moduleName": "./node_modules/@dojo/shim/iterator.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "type": "harmony import", + "userRequest": "../shim/Symbol", + "loc": "3:0-36" + }, + { + "moduleId": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/iterator.mjs", + "module": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/iterator.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "1:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/object.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/object.mjs", - "module": "./node_modules/@dojo/shim/object.mjs", - "moduleName": "./node_modules/@dojo/shim/object.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/object.mjs", + "module": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/object.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "3:0-36" }, { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "3:0-18" @@ -3106,9 +3114,9 @@ "source": "import has from './support/has';\nimport global from './global';\nimport { getValueDescriptor } from './support/util';\nexport let Symbol = global.Symbol;\nif (!true) {\n /**\n * Throws if the value is not a symbol, used internally within the Shim\n * @param {any} value The value to check\n * @return {symbol} Returns the symbol or throws\n */\n const validateSymbol = function validateSymbol(value) {\n if (!isSymbol(value)) {\n throw new TypeError(value + ' is not a symbol');\n }\n return value;\n };\n const defineProperties = Object.defineProperties;\n const defineProperty = Object.defineProperty;\n const create = Object.create;\n const objPrototype = Object.prototype;\n const globalSymbols = {};\n const getSymbolName = (function () {\n const created = create(null);\n return function (desc) {\n let postfix = 0;\n let name;\n while (created[String(desc) + (postfix || '')]) {\n ++postfix;\n }\n desc += String(postfix || '');\n created[desc] = true;\n name = '@@' + desc;\n // FIXME: Temporary guard until the duplicate execution when testing can be\n // pinned down.\n if (!Object.getOwnPropertyDescriptor(objPrototype, name)) {\n defineProperty(objPrototype, name, {\n set: function (value) {\n defineProperty(this, name, getValueDescriptor(value));\n }\n });\n }\n return name;\n };\n })();\n const InternalSymbol = function Symbol(description) {\n if (this instanceof InternalSymbol) {\n throw new TypeError('TypeError: Symbol is not a constructor');\n }\n return Symbol(description);\n };\n Symbol = global.Symbol = function Symbol(description) {\n if (this instanceof Symbol) {\n throw new TypeError('TypeError: Symbol is not a constructor');\n }\n const sym = Object.create(InternalSymbol.prototype);\n description = description === undefined ? '' : String(description);\n return defineProperties(sym, {\n __description__: getValueDescriptor(description),\n __name__: getValueDescriptor(getSymbolName(description))\n });\n };\n /* Decorate the Symbol function with the appropriate properties */\n defineProperty(Symbol, 'for', getValueDescriptor(function (key) {\n if (globalSymbols[key]) {\n return globalSymbols[key];\n }\n return (globalSymbols[key] = Symbol(String(key)));\n }));\n defineProperties(Symbol, {\n keyFor: getValueDescriptor(function (sym) {\n let key;\n validateSymbol(sym);\n for (key in globalSymbols) {\n if (globalSymbols[key] === sym) {\n return key;\n }\n }\n }),\n hasInstance: getValueDescriptor(Symbol.for('hasInstance'), false, false),\n isConcatSpreadable: getValueDescriptor(Symbol.for('isConcatSpreadable'), false, false),\n iterator: getValueDescriptor(Symbol.for('iterator'), false, false),\n match: getValueDescriptor(Symbol.for('match'), false, false),\n observable: getValueDescriptor(Symbol.for('observable'), false, false),\n replace: getValueDescriptor(Symbol.for('replace'), false, false),\n search: getValueDescriptor(Symbol.for('search'), false, false),\n species: getValueDescriptor(Symbol.for('species'), false, false),\n split: getValueDescriptor(Symbol.for('split'), false, false),\n toPrimitive: getValueDescriptor(Symbol.for('toPrimitive'), false, false),\n toStringTag: getValueDescriptor(Symbol.for('toStringTag'), false, false),\n unscopables: getValueDescriptor(Symbol.for('unscopables'), false, false)\n });\n /* Decorate the InternalSymbol object */\n defineProperties(InternalSymbol.prototype, {\n constructor: getValueDescriptor(Symbol),\n toString: getValueDescriptor(function () {\n return this.__name__;\n }, false, false)\n });\n /* Decorate the Symbol.prototype */\n defineProperties(Symbol.prototype, {\n toString: getValueDescriptor(function () {\n return 'Symbol (' + validateSymbol(this).__description__ + ')';\n }),\n valueOf: getValueDescriptor(function () {\n return validateSymbol(this);\n })\n });\n defineProperty(Symbol.prototype, Symbol.toPrimitive, getValueDescriptor(function () {\n return validateSymbol(this);\n }));\n defineProperty(Symbol.prototype, Symbol.toStringTag, getValueDescriptor('Symbol', false, false, true));\n defineProperty(InternalSymbol.prototype, Symbol.toPrimitive, getValueDescriptor(Symbol.prototype[Symbol.toPrimitive], false, false, true));\n defineProperty(InternalSymbol.prototype, Symbol.toStringTag, getValueDescriptor(Symbol.prototype[Symbol.toStringTag], false, false, true));\n}\n/**\n * A custom guard function that determines if an object is a symbol or not\n * @param {any} value The value to check to see if it is a symbol or not\n * @return {is symbol} Returns true if a symbol or not (and narrows the type guard)\n */\nexport function isSymbol(value) {\n return (value && (typeof value === 'symbol' || value['@@toStringTag'] === 'Symbol')) || false;\n}\n/**\n * Fill any missing well known symbols if the native Symbol is missing them\n */\n[\n 'hasInstance',\n 'isConcatSpreadable',\n 'iterator',\n 'species',\n 'replace',\n 'search',\n 'split',\n 'match',\n 'toPrimitive',\n 'toStringTag',\n 'unscopables',\n 'observable'\n].forEach((wellKnown) => {\n if (!Symbol[wellKnown]) {\n Object.defineProperty(Symbol, wellKnown, getValueDescriptor(Symbol.for(wellKnown), false, false));\n }\n});\nexport default Symbol;\n//# sourceMappingURL=Symbol.mjs.map" }, { - "id": "./node_modules/@dojo/shim/WeakMap.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/WeakMap.mjs", - "name": "./node_modules/@dojo/shim/WeakMap.mjs", + "id": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/WeakMap.mjs", + "name": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "index": 19, "index2": 13, "size": 3748, @@ -3120,38 +3128,38 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/WeakMap", - "loc": "2:0-41" + "userRequest": "../shim/WeakMap", + "loc": "2:0-38" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/WeakMap", - "loc": "5:0-41" + "userRequest": "../shim/WeakMap", + "loc": "5:0-38" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/inject.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/WeakMap", + "userRequest": "../../shim/WeakMap", "loc": "1:0-41" } ], @@ -3167,9 +3175,9 @@ "source": "import global from './global';\nimport { isArrayLike } from './iterator';\nimport has from './support/has';\nimport './Symbol';\nexport let WeakMap = global.WeakMap;\nif (!true) {\n const DELETED = {};\n const getUID = function getUID() {\n return Math.floor(Math.random() * 100000000);\n };\n const generateName = (function () {\n let startId = Math.floor(Date.now() % 100000000);\n return function generateName() {\n return '__wm' + getUID() + (startId++ + '__');\n };\n })();\n WeakMap = class WeakMap {\n constructor(iterable) {\n this[Symbol.toStringTag] = 'WeakMap';\n this._name = generateName();\n this._frozenEntries = [];\n if (iterable) {\n if (isArrayLike(iterable)) {\n for (let i = 0; i < iterable.length; i++) {\n const item = iterable[i];\n this.set(item[0], item[1]);\n }\n }\n else {\n for (const [key, value] of iterable) {\n this.set(key, value);\n }\n }\n }\n }\n _getFrozenEntryIndex(key) {\n for (let i = 0; i < this._frozenEntries.length; i++) {\n if (this._frozenEntries[i].key === key) {\n return i;\n }\n }\n return -1;\n }\n delete(key) {\n if (key === undefined || key === null) {\n return false;\n }\n const entry = key[this._name];\n if (entry && entry.key === key && entry.value !== DELETED) {\n entry.value = DELETED;\n return true;\n }\n const frozenIndex = this._getFrozenEntryIndex(key);\n if (frozenIndex >= 0) {\n this._frozenEntries.splice(frozenIndex, 1);\n return true;\n }\n return false;\n }\n get(key) {\n if (key === undefined || key === null) {\n return undefined;\n }\n const entry = key[this._name];\n if (entry && entry.key === key && entry.value !== DELETED) {\n return entry.value;\n }\n const frozenIndex = this._getFrozenEntryIndex(key);\n if (frozenIndex >= 0) {\n return this._frozenEntries[frozenIndex].value;\n }\n }\n has(key) {\n if (key === undefined || key === null) {\n return false;\n }\n const entry = key[this._name];\n if (Boolean(entry && entry.key === key && entry.value !== DELETED)) {\n return true;\n }\n const frozenIndex = this._getFrozenEntryIndex(key);\n if (frozenIndex >= 0) {\n return true;\n }\n return false;\n }\n set(key, value) {\n if (!key || (typeof key !== 'object' && typeof key !== 'function')) {\n throw new TypeError('Invalid value used as weak map key');\n }\n let entry = key[this._name];\n if (!entry || entry.key !== key) {\n entry = Object.create(null, {\n key: { value: key }\n });\n if (Object.isFrozen(key)) {\n this._frozenEntries.push(entry);\n }\n else {\n Object.defineProperty(key, this._name, {\n value: entry\n });\n }\n }\n entry.value = value;\n return this;\n }\n };\n}\nexport default WeakMap;\n//# sourceMappingURL=WeakMap.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", "index": 34, "index2": 29, "size": 311, @@ -3181,18 +3189,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "./../decorators/afterRender", "loc": "4:0-58" @@ -3237,9 +3245,9 @@ "depth": 0 }, { - "id": "./node_modules/@dojo/shim/array.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "name": "./node_modules/@dojo/shim/array.mjs", + "id": "./node_modules/@dojo/framework/shim/array.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "name": "./node_modules/@dojo/framework/shim/array.mjs", "index": 30, "index2": 24, "size": 8928, @@ -3251,30 +3259,30 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/array", - "loc": "4:0-40" + "userRequest": "../shim/array", + "loc": "4:0-37" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/array", - "loc": "2:0-53" + "userRequest": "../shim/array", + "loc": "2:0-50" } ], "usedExports": [ @@ -3294,9 +3302,9 @@ "source": "import global from './global';\nimport { isArrayLike, isIterable } from './iterator';\nimport { MAX_SAFE_INTEGER } from './number';\nimport has from './support/has';\nimport { wrapNative } from './support/util';\nexport let from;\n/**\n * Creates a new array from the function parameters.\n *\n * @param arguments Any number of arguments for the array\n * @return An array from the given arguments\n */\nexport let of;\n/* ES6 Array instance methods */\n/**\n * Copies data internally within an array or array-like object.\n *\n * @param target The target array-like object\n * @param offset The index to start copying values to; if negative, it counts backwards from length\n * @param start The first (inclusive) index to copy; if negative, it counts backwards from length\n * @param end The last (exclusive) index to copy; if negative, it counts backwards from length\n * @return The target\n */\nexport let copyWithin;\n/**\n * Fills elements of an array-like object with the specified value.\n *\n * @param target The target to fill\n * @param value The value to fill each element of the target with\n * @param start The first index to fill\n * @param end The (exclusive) index at which to stop filling\n * @return The filled target\n */\nexport let fill;\n/**\n * Finds and returns the first instance matching the callback or undefined if one is not found.\n *\n * @param target An array-like object\n * @param callback A function returning if the current value matches a criteria\n * @param thisArg The execution context for the find function\n * @return The first element matching the callback, or undefined if one does not exist\n */\nexport let find;\n/**\n * Performs a linear search and returns the first index whose value satisfies the passed callback,\n * or -1 if no values satisfy it.\n *\n * @param target An array-like object\n * @param callback A function returning true if the current value satisfies its criteria\n * @param thisArg The execution context for the find function\n * @return The first index whose value satisfies the passed callback, or -1 if no values satisfy it\n */\nexport let findIndex;\n/* ES7 Array instance methods */\n/**\n * Determines whether an array includes a given value\n *\n * @param target the target array-like object\n * @param searchElement the item to search for\n * @param fromIndex the starting index to search from\n * @return `true` if the array includes the element, otherwise `false`\n */\nexport let includes;\nif (true && true) {\n from = global.Array.from;\n of = global.Array.of;\n copyWithin = wrapNative(global.Array.prototype.copyWithin);\n fill = wrapNative(global.Array.prototype.fill);\n find = wrapNative(global.Array.prototype.find);\n findIndex = wrapNative(global.Array.prototype.findIndex);\n}\nelse {\n // It is only older versions of Safari/iOS that have a bad fill implementation and so aren't in the wild\n // To make things easier, if there is a bad fill implementation, the whole set of functions will be filled\n /**\n * Ensures a non-negative, non-infinite, safe integer.\n *\n * @param length The number to validate\n * @return A proper length\n */\n const toLength = function toLength(length) {\n if (isNaN(length)) {\n return 0;\n }\n length = Number(length);\n if (isFinite(length)) {\n length = Math.floor(length);\n }\n // Ensure a non-negative, real, safe integer\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\n };\n /**\n * From ES6 7.1.4 ToInteger()\n *\n * @param value A value to convert\n * @return An integer\n */\n const toInteger = function toInteger(value) {\n value = Number(value);\n if (isNaN(value)) {\n return 0;\n }\n if (value === 0 || !isFinite(value)) {\n return value;\n }\n return (value > 0 ? 1 : -1) * Math.floor(Math.abs(value));\n };\n /**\n * Normalizes an offset against a given length, wrapping it if negative.\n *\n * @param value The original offset\n * @param length The total length to normalize against\n * @return If negative, provide a distance from the end (length); otherwise provide a distance from 0\n */\n const normalizeOffset = function normalizeOffset(value, length) {\n return value < 0 ? Math.max(length + value, 0) : Math.min(value, length);\n };\n from = function from(arrayLike, mapFunction, thisArg) {\n if (arrayLike == null) {\n throw new TypeError('from: requires an array-like object');\n }\n if (mapFunction && thisArg) {\n mapFunction = mapFunction.bind(thisArg);\n }\n /* tslint:disable-next-line:variable-name */\n const Constructor = this;\n const length = toLength(arrayLike.length);\n // Support extension\n const array = typeof Constructor === 'function' ? Object(new Constructor(length)) : new Array(length);\n if (!isArrayLike(arrayLike) && !isIterable(arrayLike)) {\n return array;\n }\n // if this is an array and the normalized length is 0, just return an empty array. this prevents a problem\n // with the iteration on IE when using a NaN array length.\n if (isArrayLike(arrayLike)) {\n if (length === 0) {\n return [];\n }\n for (let i = 0; i < arrayLike.length; i++) {\n array[i] = mapFunction ? mapFunction(arrayLike[i], i) : arrayLike[i];\n }\n }\n else {\n let i = 0;\n for (const value of arrayLike) {\n array[i] = mapFunction ? mapFunction(value, i) : value;\n i++;\n }\n }\n if (arrayLike.length !== undefined) {\n array.length = length;\n }\n return array;\n };\n of = function of(...items) {\n return Array.prototype.slice.call(items);\n };\n copyWithin = function copyWithin(target, offset, start, end) {\n if (target == null) {\n throw new TypeError('copyWithin: target must be an array-like object');\n }\n const length = toLength(target.length);\n offset = normalizeOffset(toInteger(offset), length);\n start = normalizeOffset(toInteger(start), length);\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\n let count = Math.min(end - start, length - offset);\n let direction = 1;\n if (offset > start && offset < start + count) {\n direction = -1;\n start += count - 1;\n offset += count - 1;\n }\n while (count > 0) {\n if (start in target) {\n target[offset] = target[start];\n }\n else {\n delete target[offset];\n }\n offset += direction;\n start += direction;\n count--;\n }\n return target;\n };\n fill = function fill(target, value, start, end) {\n const length = toLength(target.length);\n let i = normalizeOffset(toInteger(start), length);\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\n while (i < end) {\n target[i++] = value;\n }\n return target;\n };\n find = function find(target, callback, thisArg) {\n const index = findIndex(target, callback, thisArg);\n return index !== -1 ? target[index] : undefined;\n };\n findIndex = function findIndex(target, callback, thisArg) {\n const length = toLength(target.length);\n if (!callback) {\n throw new TypeError('find: second argument must be a function');\n }\n if (thisArg) {\n callback = callback.bind(thisArg);\n }\n for (let i = 0; i < length; i++) {\n if (callback(target[i], i, target)) {\n return i;\n }\n }\n return -1;\n };\n}\nif (true) {\n includes = wrapNative(global.Array.prototype.includes);\n}\nelse {\n /**\n * Ensures a non-negative, non-infinite, safe integer.\n *\n * @param length The number to validate\n * @return A proper length\n */\n const toLength = function toLength(length) {\n length = Number(length);\n if (isNaN(length)) {\n return 0;\n }\n if (isFinite(length)) {\n length = Math.floor(length);\n }\n // Ensure a non-negative, real, safe integer\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\n };\n includes = function includes(target, searchElement, fromIndex = 0) {\n let len = toLength(target.length);\n for (let i = fromIndex; i < len; ++i) {\n const currentElement = target[i];\n if (searchElement === currentElement ||\n (searchElement !== searchElement && currentElement !== currentElement)) {\n return true;\n }\n }\n return false;\n };\n}\n//# sourceMappingURL=array.mjs.map" }, { - "id": "./node_modules/@dojo/shim/global.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/global.mjs", - "name": "./node_modules/@dojo/shim/global.mjs", + "id": "./node_modules/@dojo/framework/shim/global.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/global.mjs", + "name": "./node_modules/@dojo/framework/shim/global.mjs", "index": 10, "index2": 4, "size": 581, @@ -3308,117 +3316,117 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "type": "harmony import", - "userRequest": "@dojo/shim/global", - "loc": "6:0-39" - }, - { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/global", - "loc": "1:0-39" + "userRequest": "../shim/global", + "loc": "6:0-36" }, { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./global", "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Symbol.mjs", - "module": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleName": "./node_modules/@dojo/shim/Symbol.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Symbol.mjs", + "module": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Symbol.mjs", "type": "harmony import", "userRequest": "./global", "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/number.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/number.mjs", - "module": "./node_modules/@dojo/shim/number.mjs", - "moduleName": "./node_modules/@dojo/shim/number.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "type": "harmony import", + "userRequest": "../shim/global", + "loc": "1:0-36" + }, + { + "moduleId": "./node_modules/@dojo/framework/shim/number.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/number.mjs", + "module": "./node_modules/@dojo/framework/shim/number.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/number.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/support/has.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/has.mjs", - "module": "./node_modules/@dojo/shim/support/has.mjs", - "moduleName": "./node_modules/@dojo/shim/support/has.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/has.mjs", + "module": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/has.mjs", "type": "harmony import", "userRequest": "../global", "loc": "2:0-31" }, { - "moduleId": "./node_modules/@dojo/shim/object.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/object.mjs", - "module": "./node_modules/@dojo/shim/object.mjs", - "moduleName": "./node_modules/@dojo/shim/object.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/object.mjs", + "module": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/object.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/string.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/string.mjs", - "module": "./node_modules/@dojo/shim/string.mjs", - "moduleName": "./node_modules/@dojo/shim/string.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/string.mjs", + "module": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/string.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/queue.mjs", - "module": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleName": "./node_modules/@dojo/shim/support/queue.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/queue.mjs", + "module": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/queue.mjs", "type": "harmony import", "userRequest": "../global", "loc": "1:0-31" @@ -3435,9 +3443,9 @@ "source": "const globalObject = (function () {\n if (typeof global !== 'undefined') {\n // global spec defines a reference to the global object called 'global'\n // https://github.com/tc39/proposal-global\n // `global` is also defined in NodeJS\n return global;\n }\n else if (typeof window !== 'undefined') {\n // window is defined in browsers\n return window;\n }\n else if (typeof self !== 'undefined') {\n // self is defined in WebWorkers\n return self;\n }\n})();\nexport default globalObject;\n//# sourceMappingURL=global.mjs.map" }, { - "id": "./node_modules/@dojo/shim/iterator.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/iterator.mjs", - "name": "./node_modules/@dojo/shim/iterator.mjs", + "id": "./node_modules/@dojo/framework/shim/iterator.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/iterator.mjs", + "name": "./node_modules/@dojo/framework/shim/iterator.mjs", "index": 16, "index2": 10, "size": 3158, @@ -3449,36 +3457,36 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./iterator", "loc": "2:0-53" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./iterator", "loc": "1:0-55" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./iterator", "loc": "2:0-41" @@ -3497,9 +3505,9 @@ "source": "import './Symbol';\nimport { HIGH_SURROGATE_MAX, HIGH_SURROGATE_MIN } from './string';\nconst staticDone = { done: true, value: undefined };\n/**\n * A class that _shims_ an iterator interface on array like objects.\n */\nexport class ShimIterator {\n constructor(list) {\n this._nextIndex = -1;\n if (isIterable(list)) {\n this._nativeIterator = list[Symbol.iterator]();\n }\n else {\n this._list = list;\n }\n }\n /**\n * Return the next iteration result for the Iterator\n */\n next() {\n if (this._nativeIterator) {\n return this._nativeIterator.next();\n }\n if (!this._list) {\n return staticDone;\n }\n if (++this._nextIndex < this._list.length) {\n return {\n done: false,\n value: this._list[this._nextIndex]\n };\n }\n return staticDone;\n }\n [Symbol.iterator]() {\n return this;\n }\n}\n/**\n * A type guard for checking if something has an Iterable interface\n *\n * @param value The value to type guard against\n */\nexport function isIterable(value) {\n return value && typeof value[Symbol.iterator] === 'function';\n}\n/**\n * A type guard for checking if something is ArrayLike\n *\n * @param value The value to type guard against\n */\nexport function isArrayLike(value) {\n return value && typeof value.length === 'number';\n}\n/**\n * Returns the iterator for an object\n *\n * @param iterable The iterable object to return the iterator for\n */\nexport function get(iterable) {\n if (isIterable(iterable)) {\n return iterable[Symbol.iterator]();\n }\n else if (isArrayLike(iterable)) {\n return new ShimIterator(iterable);\n }\n}\n/**\n * Shims the functionality of `for ... of` blocks\n *\n * @param iterable The object the provides an interator interface\n * @param callback The callback which will be called for each item of the iterable\n * @param thisArg Optional scope to pass the callback\n */\nexport function forOf(iterable, callback, thisArg) {\n let broken = false;\n function doBreak() {\n broken = true;\n }\n /* We need to handle iteration of double byte strings properly */\n if (isArrayLike(iterable) && typeof iterable === 'string') {\n const l = iterable.length;\n for (let i = 0; i < l; ++i) {\n let char = iterable[i];\n if (i + 1 < l) {\n const code = char.charCodeAt(0);\n if (code >= HIGH_SURROGATE_MIN && code <= HIGH_SURROGATE_MAX) {\n char += iterable[++i];\n }\n }\n callback.call(thisArg, char, iterable, doBreak);\n if (broken) {\n return;\n }\n }\n }\n else {\n const iterator = get(iterable);\n if (iterator) {\n let result = iterator.next();\n while (!result.done) {\n callback.call(thisArg, result.value, iterable, doBreak);\n if (broken) {\n return;\n }\n result = iterator.next();\n }\n }\n }\n}\n//# sourceMappingURL=iterator.mjs.map" }, { - "id": "./node_modules/@dojo/shim/number.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/number.mjs", - "name": "./node_modules/@dojo/shim/number.mjs", + "id": "./node_modules/@dojo/framework/shim/number.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/number.mjs", + "name": "./node_modules/@dojo/framework/shim/number.mjs", "index": 31, "index2": 23, "size": 1724, @@ -3511,18 +3519,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./number", "loc": "3:0-44" @@ -3543,9 +3551,9 @@ "source": "import global from './global';\n/**\n * The smallest interval between two representable numbers.\n */\nexport const EPSILON = 1;\n/**\n * The maximum safe integer in JavaScript\n */\nexport const MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n/**\n * The minimum safe integer in JavaScript\n */\nexport const MIN_SAFE_INTEGER = -MAX_SAFE_INTEGER;\n/**\n * Determines whether the passed value is NaN without coersion.\n *\n * @param value The value to test\n * @return true if the value is NaN, false if it is not\n */\nexport function isNaN(value) {\n return typeof value === 'number' && global.isNaN(value);\n}\n/**\n * Determines whether the passed value is a finite number without coersion.\n *\n * @param value The value to test\n * @return true if the value is finite, false if it is not\n */\nexport function isFinite(value) {\n return typeof value === 'number' && global.isFinite(value);\n}\n/**\n * Determines whether the passed value is an integer.\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isInteger(value) {\n return isFinite(value) && Math.floor(value) === value;\n}\n/**\n * Determines whether the passed value is an integer that is 'safe,' meaning:\n * 1. it can be expressed as an IEEE-754 double precision number\n * 2. it has a one-to-one mapping to a mathematical integer, meaning its\n * IEEE-754 representation cannot be the result of rounding any other\n * integer to fit the IEEE-754 representation\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isSafeInteger(value) {\n return isInteger(value) && Math.abs(value) <= MAX_SAFE_INTEGER;\n}\n//# sourceMappingURL=number.mjs.map" }, { - "id": "./node_modules/@dojo/shim/object.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/object.mjs", - "name": "./node_modules/@dojo/shim/object.mjs", + "id": "./node_modules/@dojo/framework/shim/object.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/object.mjs", + "name": "./node_modules/@dojo/framework/shim/object.mjs", "index": 18, "index2": 11, "size": 4061, @@ -3557,39 +3565,39 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "issuerId": "./node_modules/@dojo/shim/Map.mjs", - "issuerName": "./node_modules/@dojo/shim/Map.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/Map.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/Map.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./object", "loc": "3:0-42" }, { - "moduleId": "./node_modules/@dojo/core/lang.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/lang.mjs", - "module": "./node_modules/@dojo/core/lang.mjs", - "moduleName": "./node_modules/@dojo/core/lang.mjs", + "moduleId": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/lang.mjs", + "module": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleName": "./node_modules/@dojo/framework/core/lang.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/object", - "loc": "1:0-43" + "userRequest": "../shim/object", + "loc": "1:0-40" }, { - "moduleId": "./node_modules/@dojo/core/lang.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/core/lang.mjs", - "module": "./node_modules/@dojo/core/lang.mjs", - "moduleName": "./node_modules/@dojo/core/lang.mjs", + "moduleId": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/core/lang.mjs", + "module": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleName": "./node_modules/@dojo/framework/core/lang.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/object", - "loc": "2:0-43" + "userRequest": "../shim/object", + "loc": "2:0-40" } ], "usedExports": [ @@ -3611,9 +3619,9 @@ "source": "import global from './global';\nimport has from './support/has';\nimport { isSymbol } from './Symbol';\nexport let assign;\n/**\n * Gets the own property descriptor of the specified object.\n * An own property descriptor is one that is defined directly on the object and is not\n * inherited from the object's prototype.\n * @param o Object that contains the property.\n * @param p Name of the property.\n */\nexport let getOwnPropertyDescriptor;\n/**\n * Returns the names of the own properties of an object. The own properties of an object are those that are defined directly\n * on that object, and are not inherited from the object's prototype. The properties of an object include both fields (objects) and functions.\n * @param o Object that contains the own properties.\n */\nexport let getOwnPropertyNames;\n/**\n * Returns an array of all symbol properties found directly on object o.\n * @param o Object to retrieve the symbols from.\n */\nexport let getOwnPropertySymbols;\n/**\n * Returns true if the values are the same value, false otherwise.\n * @param value1 The first value.\n * @param value2 The second value.\n */\nexport let is;\n/**\n * Returns the names of the enumerable properties and methods of an object.\n * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.\n */\nexport let keys;\n/* ES7 Object static methods */\nexport let getOwnPropertyDescriptors;\nexport let entries;\nexport let values;\nif (true) {\n const globalObject = global.Object;\n assign = globalObject.assign;\n getOwnPropertyDescriptor = globalObject.getOwnPropertyDescriptor;\n getOwnPropertyNames = globalObject.getOwnPropertyNames;\n getOwnPropertySymbols = globalObject.getOwnPropertySymbols;\n is = globalObject.is;\n keys = globalObject.keys;\n}\nelse {\n keys = function symbolAwareKeys(o) {\n return Object.keys(o).filter((key) => !Boolean(key.match(/^@@.+/)));\n };\n assign = function assign(target, ...sources) {\n if (target == null) {\n // TypeError if undefined or null\n throw new TypeError('Cannot convert undefined or null to object');\n }\n const to = Object(target);\n sources.forEach((nextSource) => {\n if (nextSource) {\n // Skip over if undefined or null\n keys(nextSource).forEach((nextKey) => {\n to[nextKey] = nextSource[nextKey];\n });\n }\n });\n return to;\n };\n getOwnPropertyDescriptor = function getOwnPropertyDescriptor(o, prop) {\n if (isSymbol(prop)) {\n return Object.getOwnPropertyDescriptor(o, prop);\n }\n else {\n return Object.getOwnPropertyDescriptor(o, prop);\n }\n };\n getOwnPropertyNames = function getOwnPropertyNames(o) {\n return Object.getOwnPropertyNames(o).filter((key) => !Boolean(key.match(/^@@.+/)));\n };\n getOwnPropertySymbols = function getOwnPropertySymbols(o) {\n return Object.getOwnPropertyNames(o)\n .filter((key) => Boolean(key.match(/^@@.+/)))\n .map((key) => Symbol.for(key.substring(2)));\n };\n is = function is(value1, value2) {\n if (value1 === value2) {\n return value1 !== 0 || 1 / value1 === 1 / value2; // -0\n }\n return value1 !== value1 && value2 !== value2; // NaN\n };\n}\nif (true) {\n const globalObject = global.Object;\n getOwnPropertyDescriptors = globalObject.getOwnPropertyDescriptors;\n entries = globalObject.entries;\n values = globalObject.values;\n}\nelse {\n getOwnPropertyDescriptors = function getOwnPropertyDescriptors(o) {\n return getOwnPropertyNames(o).reduce((previous, key) => {\n previous[key] = getOwnPropertyDescriptor(o, key);\n return previous;\n }, {});\n };\n entries = function entries(o) {\n return keys(o).map((key) => [key, o[key]]);\n };\n values = function values(o) {\n return keys(o).map((key) => o[key]);\n };\n}\n//# sourceMappingURL=object.mjs.map" }, { - "id": "./node_modules/@dojo/shim/string.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/string.mjs", - "name": "./node_modules/@dojo/shim/string.mjs", + "id": "./node_modules/@dojo/framework/shim/string.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/string.mjs", + "name": "./node_modules/@dojo/framework/shim/string.mjs", "index": 17, "index2": 9, "size": 12418, @@ -3625,18 +3633,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/iterator.mjs", - "issuerId": "./node_modules/@dojo/shim/iterator.mjs", - "issuerName": "./node_modules/@dojo/shim/iterator.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/iterator.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/iterator.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/iterator.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/iterator.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/iterator.mjs", - "module": "./node_modules/@dojo/shim/iterator.mjs", - "moduleName": "./node_modules/@dojo/shim/iterator.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/iterator.mjs", + "module": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/iterator.mjs", "type": "harmony import", "userRequest": "./string", "loc": "2:0-66" @@ -3667,9 +3675,9 @@ "source": "import global from './global';\nimport has from './support/has';\nimport { wrapNative } from './support/util';\n/**\n * The minimum location of high surrogates\n */\nexport const HIGH_SURROGATE_MIN = 0xd800;\n/**\n * The maximum location of high surrogates\n */\nexport const HIGH_SURROGATE_MAX = 0xdbff;\n/**\n * The minimum location of low surrogates\n */\nexport const LOW_SURROGATE_MIN = 0xdc00;\n/**\n * The maximum location of low surrogates\n */\nexport const LOW_SURROGATE_MAX = 0xdfff;\n/* ES6 static methods */\n/**\n * Return the String value whose elements are, in order, the elements in the List elements.\n * If length is 0, the empty string is returned.\n * @param codePoints The code points to generate the string\n */\nexport let fromCodePoint;\n/**\n * `raw` is intended for use as a tag function of a Tagged Template String. When called\n * as such the first argument will be a well formed template call site object and the rest\n * parameter will contain the substitution values.\n * @param template A well-formed template string call site representation.\n * @param substitutions A set of substitution values.\n */\nexport let raw;\n/* ES6 instance methods */\n/**\n * Returns a nonnegative integer Number less than 1114112 (0x110000) that is the code point\n * value of the UTF-16 encoded code point starting at the string element at position pos in\n * the String resulting from converting this object to a String.\n * If there is no element at that position, the result is undefined.\n * If a valid UTF-16 surrogate pair does not begin at pos, the result is the code unit at pos.\n */\nexport let codePointAt;\n/**\n * Returns true if the sequence of elements of searchString converted to a String is the\n * same as the corresponding elements of this object (converted to a String) starting at\n * endPosition – length(this). Otherwise returns false.\n */\nexport let endsWith;\n/**\n * Returns true if searchString appears as a substring of the result of converting this\n * object to a String, at one or more positions that are\n * greater than or equal to position; otherwise, returns false.\n * @param target The target string\n * @param searchString search string\n * @param position If position is undefined, 0 is assumed, so as to search all of the String.\n */\nexport let includes;\n/**\n * Returns the String value result of normalizing the string into the normalization form\n * named by form as specified in Unicode Standard Annex #15, Unicode Normalization Forms.\n * @param target The target string\n * @param form Applicable values: \"NFC\", \"NFD\", \"NFKC\", or \"NFKD\", If not specified default\n * is \"NFC\"\n */\nexport let normalize;\n/**\n * Returns a String value that is made from count copies appended together. If count is 0,\n * T is the empty String is returned.\n * @param count number of copies to append\n */\nexport let repeat;\n/**\n * Returns true if the sequence of elements of searchString converted to a String is the\n * same as the corresponding elements of this object (converted to a String) starting at\n * position. Otherwise returns false.\n */\nexport let startsWith;\n/* ES7 instance methods */\n/**\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\n * The padding is applied from the end (right) of the current string.\n *\n * @param target The target string\n * @param maxLength The length of the resulting string once the current string has been padded.\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\n *\n * @param fillString The string to pad the current string with.\n * If this string is too long, it will be truncated and the left-most part will be applied.\n * The default value for this parameter is \" \" (U+0020).\n */\nexport let padEnd;\n/**\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\n * The padding is applied from the start (left) of the current string.\n *\n * @param target The target string\n * @param maxLength The length of the resulting string once the current string has been padded.\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\n *\n * @param fillString The string to pad the current string with.\n * If this string is too long, it will be truncated and the left-most part will be applied.\n * The default value for this parameter is \" \" (U+0020).\n */\nexport let padStart;\nif (true && true) {\n fromCodePoint = global.String.fromCodePoint;\n raw = global.String.raw;\n codePointAt = wrapNative(global.String.prototype.codePointAt);\n endsWith = wrapNative(global.String.prototype.endsWith);\n includes = wrapNative(global.String.prototype.includes);\n normalize = wrapNative(global.String.prototype.normalize);\n repeat = wrapNative(global.String.prototype.repeat);\n startsWith = wrapNative(global.String.prototype.startsWith);\n}\nelse {\n /**\n * Validates that text is defined, and normalizes position (based on the given default if the input is NaN).\n * Used by startsWith, includes, and endsWith.\n *\n * @return Normalized position.\n */\n const normalizeSubstringArgs = function (name, text, search, position, isEnd = false) {\n if (text == null) {\n throw new TypeError('string.' + name + ' requires a valid string to search against.');\n }\n const length = text.length;\n position = position !== position ? (isEnd ? length : 0) : position;\n return [text, String(search), Math.min(Math.max(position, 0), length)];\n };\n fromCodePoint = function fromCodePoint(...codePoints) {\n // Adapted from https://github.com/mathiasbynens/String.fromCodePoint\n const length = arguments.length;\n if (!length) {\n return '';\n }\n const fromCharCode = String.fromCharCode;\n const MAX_SIZE = 0x4000;\n let codeUnits = [];\n let index = -1;\n let result = '';\n while (++index < length) {\n let codePoint = Number(arguments[index]);\n // Code points must be finite integers within the valid range\n let isValid = isFinite(codePoint) && Math.floor(codePoint) === codePoint && codePoint >= 0 && codePoint <= 0x10ffff;\n if (!isValid) {\n throw RangeError('string.fromCodePoint: Invalid code point ' + codePoint);\n }\n if (codePoint <= 0xffff) {\n // BMP code point\n codeUnits.push(codePoint);\n }\n else {\n // Astral code point; split in surrogate halves\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n codePoint -= 0x10000;\n let highSurrogate = (codePoint >> 10) + HIGH_SURROGATE_MIN;\n let lowSurrogate = codePoint % 0x400 + LOW_SURROGATE_MIN;\n codeUnits.push(highSurrogate, lowSurrogate);\n }\n if (index + 1 === length || codeUnits.length > MAX_SIZE) {\n result += fromCharCode.apply(null, codeUnits);\n codeUnits.length = 0;\n }\n }\n return result;\n };\n raw = function raw(callSite, ...substitutions) {\n let rawStrings = callSite.raw;\n let result = '';\n let numSubstitutions = substitutions.length;\n if (callSite == null || callSite.raw == null) {\n throw new TypeError('string.raw requires a valid callSite object with a raw value');\n }\n for (let i = 0, length = rawStrings.length; i < length; i++) {\n result += rawStrings[i] + (i < numSubstitutions && i < length - 1 ? substitutions[i] : '');\n }\n return result;\n };\n codePointAt = function codePointAt(text, position = 0) {\n // Adapted from https://github.com/mathiasbynens/String.prototype.codePointAt\n if (text == null) {\n throw new TypeError('string.codePointAt requries a valid string.');\n }\n const length = text.length;\n if (position !== position) {\n position = 0;\n }\n if (position < 0 || position >= length) {\n return undefined;\n }\n // Get the first code unit\n const first = text.charCodeAt(position);\n if (first >= HIGH_SURROGATE_MIN && first <= HIGH_SURROGATE_MAX && length > position + 1) {\n // Start of a surrogate pair (high surrogate and there is a next code unit); check for low surrogate\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n const second = text.charCodeAt(position + 1);\n if (second >= LOW_SURROGATE_MIN && second <= LOW_SURROGATE_MAX) {\n return (first - HIGH_SURROGATE_MIN) * 0x400 + second - LOW_SURROGATE_MIN + 0x10000;\n }\n }\n return first;\n };\n endsWith = function endsWith(text, search, endPosition) {\n if (endPosition == null) {\n endPosition = text.length;\n }\n [text, search, endPosition] = normalizeSubstringArgs('endsWith', text, search, endPosition, true);\n const start = endPosition - search.length;\n if (start < 0) {\n return false;\n }\n return text.slice(start, endPosition) === search;\n };\n includes = function includes(text, search, position = 0) {\n [text, search, position] = normalizeSubstringArgs('includes', text, search, position);\n return text.indexOf(search, position) !== -1;\n };\n repeat = function repeat(text, count = 0) {\n // Adapted from https://github.com/mathiasbynens/String.prototype.repeat\n if (text == null) {\n throw new TypeError('string.repeat requires a valid string.');\n }\n if (count !== count) {\n count = 0;\n }\n if (count < 0 || count === Infinity) {\n throw new RangeError('string.repeat requires a non-negative finite count.');\n }\n let result = '';\n while (count) {\n if (count % 2) {\n result += text;\n }\n if (count > 1) {\n text += text;\n }\n count >>= 1;\n }\n return result;\n };\n startsWith = function startsWith(text, search, position = 0) {\n search = String(search);\n [text, search, position] = normalizeSubstringArgs('startsWith', text, search, position);\n const end = position + search.length;\n if (end > text.length) {\n return false;\n }\n return text.slice(position, end) === search;\n };\n}\nif (true) {\n padEnd = wrapNative(global.String.prototype.padEnd);\n padStart = wrapNative(global.String.prototype.padStart);\n}\nelse {\n padEnd = function padEnd(text, maxLength, fillString = ' ') {\n if (text === null || text === undefined) {\n throw new TypeError('string.repeat requires a valid string.');\n }\n if (maxLength === Infinity) {\n throw new RangeError('string.padEnd requires a non-negative finite count.');\n }\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\n maxLength = 0;\n }\n let strText = String(text);\n const padding = maxLength - strText.length;\n if (padding > 0) {\n strText +=\n repeat(fillString, Math.floor(padding / fillString.length)) +\n fillString.slice(0, padding % fillString.length);\n }\n return strText;\n };\n padStart = function padStart(text, maxLength, fillString = ' ') {\n if (text === null || text === undefined) {\n throw new TypeError('string.repeat requires a valid string.');\n }\n if (maxLength === Infinity) {\n throw new RangeError('string.padStart requires a non-negative finite count.');\n }\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\n maxLength = 0;\n }\n let strText = String(text);\n const padding = maxLength - strText.length;\n if (padding > 0) {\n strText =\n repeat(fillString, Math.floor(padding / fillString.length)) +\n fillString.slice(0, padding % fillString.length) +\n strText;\n }\n return strText;\n };\n}\n//# sourceMappingURL=string.mjs.map" }, { - "id": "./node_modules/@dojo/shim/support/has.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/has.mjs", - "name": "./node_modules/@dojo/shim/support/has.mjs", + "id": "./node_modules/@dojo/framework/shim/support/has.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/has.mjs", + "name": "./node_modules/@dojo/framework/shim/support/has.mjs", "index": 6, "index2": 5, "size": 6151, @@ -3681,81 +3689,81 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "4:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "4:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "3:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Symbol.mjs", - "module": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleName": "./node_modules/@dojo/shim/Symbol.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Symbol.mjs", + "module": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Symbol.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "1:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/object.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/object.mjs", - "module": "./node_modules/@dojo/shim/object.mjs", - "moduleName": "./node_modules/@dojo/shim/object.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/object.mjs", + "module": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/object.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "2:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "4:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/string.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/string.mjs", - "module": "./node_modules/@dojo/shim/string.mjs", - "moduleName": "./node_modules/@dojo/shim/string.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/string.mjs", + "module": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/string.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "2:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/queue.mjs", - "module": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleName": "./node_modules/@dojo/shim/support/queue.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/queue.mjs", + "module": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/queue.mjs", "type": "harmony import", "userRequest": "./has", "loc": "2:0-24" @@ -3773,12 +3781,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import has, { add } from '@dojo/has/has';\nimport global from '../global';\nexport default has;\nexport * from '@dojo/has/has';\n/* ECMAScript 6 and 7 Features */\n/* Array */\nadd('es6-array', () => {\n return (['from', 'of'].every((key) => key in global.Array) &&\n ['findIndex', 'find', 'copyWithin'].every((key) => key in global.Array.prototype));\n}, true);\nadd('es6-array-fill', () => {\n if ('fill' in global.Array.prototype) {\n /* Some versions of Safari do not properly implement this */\n return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1;\n }\n return false;\n}, true);\nadd('es7-array', () => 'includes' in global.Array.prototype, true);\n/* Map */\nadd('es6-map', () => {\n if (typeof global.Map === 'function') {\n /*\n IE11 and older versions of Safari are missing critical ES6 Map functionality\n We wrap this in a try/catch because sometimes the Map constructor exists, but does not\n take arguments (iOS 8.4)\n */\n try {\n const map = new global.Map([[0, 1]]);\n return map.has(0) &&\n typeof map.keys === 'function' &&\n true &&\n typeof map.values === 'function' &&\n typeof map.entries === 'function';\n }\n catch (e) {\n /* istanbul ignore next: not testing on iOS at the moment */\n return false;\n }\n }\n return false;\n}, true);\n/* Math */\nadd('es6-math', () => {\n return [\n 'clz32',\n 'sign',\n 'log10',\n 'log2',\n 'log1p',\n 'expm1',\n 'cosh',\n 'sinh',\n 'tanh',\n 'acosh',\n 'asinh',\n 'atanh',\n 'trunc',\n 'fround',\n 'cbrt',\n 'hypot'\n ].every((name) => typeof global.Math[name] === 'function');\n}, true);\nadd('es6-math-imul', () => {\n if ('imul' in global.Math) {\n /* Some versions of Safari on ios do not properly implement this */\n return Math.imul(0xffffffff, 5) === -5;\n }\n return false;\n}, true);\n/* Object */\nadd('es6-object', () => {\n return true &&\n ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof global.Object[name] === 'function');\n}, true);\nadd('es2017-object', () => {\n return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof global.Object[name] === 'function');\n}, true);\n/* Observable */\nadd('es-observable', () => typeof global.Observable !== 'undefined', true);\n/* Promise */\nadd('es6-promise', () => typeof global.Promise !== 'undefined' && true, true);\n/* Set */\nadd('es6-set', () => {\n if (typeof global.Set === 'function') {\n /* IE11 and older versions of Safari are missing critical ES6 Set functionality */\n const set = new global.Set([1]);\n return set.has(1) && 'keys' in set && typeof set.keys === 'function' && true;\n }\n return false;\n}, true);\n/* String */\nadd('es6-string', () => {\n return ([\n /* static methods */\n 'fromCodePoint'\n ].every((key) => typeof global.String[key] === 'function') &&\n [\n /* instance methods */\n 'codePointAt',\n 'normalize',\n 'repeat',\n 'startsWith',\n 'endsWith',\n 'includes'\n ].every((key) => typeof global.String.prototype[key] === 'function'));\n}, true);\nadd('es6-string-raw', () => {\n function getCallSite(callSite, ...substitutions) {\n const result = [...callSite];\n result.raw = callSite.raw;\n return result;\n }\n if ('raw' in global.String) {\n let b = 1;\n let callSite = getCallSite `a\\n${b}`;\n callSite.raw = ['a\\\\n'];\n const supportsTrunc = global.String.raw(callSite, 42) === 'a:\\\\n';\n return supportsTrunc;\n }\n return false;\n}, true);\nadd('es2017-string', () => {\n return ['padStart', 'padEnd'].every((key) => typeof global.String.prototype[key] === 'function');\n}, true);\n/* Symbol */\nadd('es6-symbol', () => typeof global.Symbol !== 'undefined' && typeof Symbol() === 'symbol', true);\n/* WeakMap */\nadd('es6-weakmap', () => {\n if (typeof global.WeakMap !== 'undefined') {\n /* IE11 and older versions of Safari are missing critical ES6 Map functionality */\n const key1 = {};\n const key2 = {};\n const map = new global.WeakMap([[key1, 1]]);\n Object.freeze(key1);\n return map.get(key1) === 1 && map.set(key2, 2) === map && true;\n }\n return false;\n}, true);\n/* Miscellaneous features */\nadd('microtasks', () => true || false || true, true);\nadd('postmessage', () => {\n // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have\n // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist.\n return typeof global.window !== 'undefined' && typeof global.postMessage === 'function';\n}, true);\nadd('raf', () => typeof global.requestAnimationFrame === 'function', true);\nadd('setimmediate', () => typeof global.setImmediate !== 'undefined', true);\n/* DOM Features */\nadd('dom-mutationobserver', () => {\n if (true && Boolean(global.MutationObserver || global.WebKitMutationObserver)) {\n // IE11 has an unreliable MutationObserver implementation where setProperty() does not\n // generate a mutation event, observers can crash, and the queue does not drain\n // reliably. The following feature test was adapted from\n // https://gist.github.com/t10ko/4aceb8c71681fdb275e33efe5e576b14\n const example = document.createElement('div');\n /* tslint:disable-next-line:variable-name */\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\n const observer = new HostMutationObserver(function () { });\n observer.observe(example, { attributes: true });\n example.style.setProperty('display', 'block');\n return Boolean(observer.takeRecords().length);\n }\n return false;\n}, true);\nadd('dom-webanimation', () => true && global.Animation !== undefined && global.KeyframeEffect !== undefined, true);\n//# sourceMappingURL=has.mjs.map" + "source": "import has, { add } from '../../has/has';\nimport global from '../global';\nexport default has;\nexport * from '../../has/has';\n/* ECMAScript 6 and 7 Features */\n/* Array */\nadd('es6-array', () => {\n return (['from', 'of'].every((key) => key in global.Array) &&\n ['findIndex', 'find', 'copyWithin'].every((key) => key in global.Array.prototype));\n}, true);\nadd('es6-array-fill', () => {\n if ('fill' in global.Array.prototype) {\n /* Some versions of Safari do not properly implement this */\n return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1;\n }\n return false;\n}, true);\nadd('es7-array', () => 'includes' in global.Array.prototype, true);\n/* Map */\nadd('es6-map', () => {\n if (typeof global.Map === 'function') {\n /*\n IE11 and older versions of Safari are missing critical ES6 Map functionality\n We wrap this in a try/catch because sometimes the Map constructor exists, but does not\n take arguments (iOS 8.4)\n */\n try {\n const map = new global.Map([[0, 1]]);\n return map.has(0) &&\n typeof map.keys === 'function' &&\n true &&\n typeof map.values === 'function' &&\n typeof map.entries === 'function';\n }\n catch (e) {\n /* istanbul ignore next: not testing on iOS at the moment */\n return false;\n }\n }\n return false;\n}, true);\n/* Math */\nadd('es6-math', () => {\n return [\n 'clz32',\n 'sign',\n 'log10',\n 'log2',\n 'log1p',\n 'expm1',\n 'cosh',\n 'sinh',\n 'tanh',\n 'acosh',\n 'asinh',\n 'atanh',\n 'trunc',\n 'fround',\n 'cbrt',\n 'hypot'\n ].every((name) => typeof global.Math[name] === 'function');\n}, true);\nadd('es6-math-imul', () => {\n if ('imul' in global.Math) {\n /* Some versions of Safari on ios do not properly implement this */\n return Math.imul(0xffffffff, 5) === -5;\n }\n return false;\n}, true);\n/* Object */\nadd('es6-object', () => {\n return true &&\n ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof global.Object[name] === 'function');\n}, true);\nadd('es2017-object', () => {\n return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof global.Object[name] === 'function');\n}, true);\n/* Observable */\nadd('es-observable', () => typeof global.Observable !== 'undefined', true);\n/* Promise */\nadd('es6-promise', () => typeof global.Promise !== 'undefined' && true, true);\n/* Set */\nadd('es6-set', () => {\n if (typeof global.Set === 'function') {\n /* IE11 and older versions of Safari are missing critical ES6 Set functionality */\n const set = new global.Set([1]);\n return set.has(1) && 'keys' in set && typeof set.keys === 'function' && true;\n }\n return false;\n}, true);\n/* String */\nadd('es6-string', () => {\n return ([\n /* static methods */\n 'fromCodePoint'\n ].every((key) => typeof global.String[key] === 'function') &&\n [\n /* instance methods */\n 'codePointAt',\n 'normalize',\n 'repeat',\n 'startsWith',\n 'endsWith',\n 'includes'\n ].every((key) => typeof global.String.prototype[key] === 'function'));\n}, true);\nadd('es6-string-raw', () => {\n function getCallSite(callSite, ...substitutions) {\n const result = [...callSite];\n result.raw = callSite.raw;\n return result;\n }\n if ('raw' in global.String) {\n let b = 1;\n let callSite = getCallSite `a\\n${b}`;\n callSite.raw = ['a\\\\n'];\n const supportsTrunc = global.String.raw(callSite, 42) === 'a:\\\\n';\n return supportsTrunc;\n }\n return false;\n}, true);\nadd('es2017-string', () => {\n return ['padStart', 'padEnd'].every((key) => typeof global.String.prototype[key] === 'function');\n}, true);\n/* Symbol */\nadd('es6-symbol', () => typeof global.Symbol !== 'undefined' && typeof Symbol() === 'symbol', true);\n/* WeakMap */\nadd('es6-weakmap', () => {\n if (typeof global.WeakMap !== 'undefined') {\n /* IE11 and older versions of Safari are missing critical ES6 Map functionality */\n const key1 = {};\n const key2 = {};\n const map = new global.WeakMap([[key1, 1]]);\n Object.freeze(key1);\n return map.get(key1) === 1 && map.set(key2, 2) === map && true;\n }\n return false;\n}, true);\n/* Miscellaneous features */\nadd('microtasks', () => true || false || true, true);\nadd('postmessage', () => {\n // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have\n // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist.\n return typeof global.window !== 'undefined' && typeof global.postMessage === 'function';\n}, true);\nadd('raf', () => typeof global.requestAnimationFrame === 'function', true);\nadd('setimmediate', () => typeof global.setImmediate !== 'undefined', true);\n/* DOM Features */\nadd('dom-mutationobserver', () => {\n if (true && Boolean(global.MutationObserver || global.WebKitMutationObserver)) {\n // IE11 has an unreliable MutationObserver implementation where setProperty() does not\n // generate a mutation event, observers can crash, and the queue does not drain\n // reliably. The following feature test was adapted from\n // https://gist.github.com/t10ko/4aceb8c71681fdb275e33efe5e576b14\n const example = document.createElement('div');\n /* tslint:disable-next-line:variable-name */\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\n const observer = new HostMutationObserver(function () { });\n observer.observe(example, { attributes: true });\n example.style.setProperty('display', 'block');\n return Boolean(observer.takeRecords().length);\n }\n return false;\n}, true);\nadd('dom-webanimation', () => true && global.Animation !== undefined && global.KeyframeEffect !== undefined, true);\n//# sourceMappingURL=has.mjs.map" }, { - "id": "./node_modules/@dojo/shim/support/queue.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/queue.mjs", - "name": "./node_modules/@dojo/shim/support/queue.mjs", + "id": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/queue.mjs", + "name": "./node_modules/@dojo/framework/shim/support/queue.mjs", "index": 23, "index2": 14, "size": 6196, @@ -3790,18 +3798,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Promise.mjs", - "issuerId": "./node_modules/@dojo/shim/Promise.mjs", - "issuerName": "./node_modules/@dojo/shim/Promise.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Promise.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/Promise.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./support/queue", "loc": "2:0-49" @@ -3818,9 +3826,9 @@ "source": "import global from '../global';\nimport has from './has';\nfunction executeTask(item) {\n if (item && item.isActive && item.callback) {\n item.callback();\n }\n}\nfunction getQueueHandle(item, destructor) {\n return {\n destroy: function () {\n this.destroy = function () { };\n item.isActive = false;\n item.callback = null;\n if (destructor) {\n destructor();\n }\n }\n };\n}\nlet checkMicroTaskQueue;\nlet microTasks;\n/**\n * Schedules a callback to the macrotask queue.\n *\n * @param callback the function to be queued and later executed.\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\n */\nexport const queueTask = (function () {\n let destructor;\n let enqueue;\n // Since the IE implementation of `setImmediate` is not flawless, we will test for `postMessage` first.\n if (true) {\n const queue = [];\n global.addEventListener('message', function (event) {\n // Confirm that the event was triggered by the current window and by this particular implementation.\n if (event.source === global && event.data === 'dojo-queue-message') {\n event.stopPropagation();\n if (queue.length) {\n executeTask(queue.shift());\n }\n }\n });\n enqueue = function (item) {\n queue.push(item);\n global.postMessage('dojo-queue-message', '*');\n };\n }\n else if (false) {\n destructor = global.clearImmediate;\n enqueue = function (item) {\n return setImmediate(executeTask.bind(null, item));\n };\n }\n else {\n destructor = global.clearTimeout;\n enqueue = function (item) {\n return setTimeout(executeTask.bind(null, item), 0);\n };\n }\n function queueTask(callback) {\n const item = {\n isActive: true,\n callback: callback\n };\n const id = enqueue(item);\n return getQueueHandle(item, destructor &&\n function () {\n destructor(id);\n });\n }\n // TODO: Use aspect.before when it is available.\n return true\n ? queueTask\n : function (callback) {\n checkMicroTaskQueue();\n return queueTask(callback);\n };\n})();\n// When no mechanism for registering microtasks is exposed by the environment, microtasks will\n// be queued and then executed in a single macrotask before the other macrotasks are executed.\nif (!true) {\n let isMicroTaskQueued = false;\n microTasks = [];\n checkMicroTaskQueue = function () {\n if (!isMicroTaskQueued) {\n isMicroTaskQueued = true;\n queueTask(function () {\n isMicroTaskQueued = false;\n if (microTasks.length) {\n let item;\n while ((item = microTasks.shift())) {\n executeTask(item);\n }\n }\n });\n }\n };\n}\n/**\n * Schedules an animation task with `window.requestAnimationFrame` if it exists, or with `queueTask` otherwise.\n *\n * Since requestAnimationFrame's behavior does not match that expected from `queueTask`, it is not used there.\n * However, at times it makes more sense to delegate to requestAnimationFrame; hence the following method.\n *\n * @param callback the function to be queued and later executed.\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\n */\nexport const queueAnimationTask = (function () {\n if (!true) {\n return queueTask;\n }\n function queueAnimationTask(callback) {\n const item = {\n isActive: true,\n callback: callback\n };\n const rafId = requestAnimationFrame(executeTask.bind(null, item));\n return getQueueHandle(item, function () {\n cancelAnimationFrame(rafId);\n });\n }\n // TODO: Use aspect.before when it is available.\n return true\n ? queueAnimationTask\n : function (callback) {\n checkMicroTaskQueue();\n return queueAnimationTask(callback);\n };\n})();\n/**\n * Schedules a callback to the microtask queue.\n *\n * Any callbacks registered with `queueMicroTask` will be executed before the next macrotask. If no native\n * mechanism for scheduling macrotasks is exposed, then any callbacks will be fired before any macrotask\n * registered with `queueTask` or `queueAnimationTask`.\n *\n * @param callback the function to be queued and later executed.\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\n */\nexport let queueMicroTask = (function () {\n let enqueue;\n if (false) {\n enqueue = function (item) {\n global.process.nextTick(executeTask.bind(null, item));\n };\n }\n else if (true) {\n enqueue = function (item) {\n global.Promise.resolve(item).then(executeTask);\n };\n }\n else if (true) {\n /* tslint:disable-next-line:variable-name */\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\n const node = document.createElement('div');\n const queue = [];\n const observer = new HostMutationObserver(function () {\n while (queue.length > 0) {\n const item = queue.shift();\n if (item && item.isActive && item.callback) {\n item.callback();\n }\n }\n });\n observer.observe(node, { attributes: true });\n enqueue = function (item) {\n queue.push(item);\n node.setAttribute('queueStatus', '1');\n };\n }\n else {\n enqueue = function (item) {\n checkMicroTaskQueue();\n microTasks.push(item);\n };\n }\n return function (callback) {\n const item = {\n isActive: true,\n callback: callback\n };\n enqueue(item);\n return getQueueHandle(item);\n };\n})();\n//# sourceMappingURL=queue.mjs.map" }, { - "id": "./node_modules/@dojo/shim/support/util.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/support/util.mjs", - "name": "./node_modules/@dojo/shim/support/util.mjs", + "id": "./node_modules/@dojo/framework/shim/support/util.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/support/util.mjs", + "name": "./node_modules/@dojo/framework/shim/support/util.mjs", "index": 11, "index2": 6, "size": 853, @@ -3832,36 +3840,36 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./support/util", "loc": "5:0-44" }, { - "moduleId": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/Symbol.mjs", - "module": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleName": "./node_modules/@dojo/shim/Symbol.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/Symbol.mjs", + "module": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Symbol.mjs", "type": "harmony import", "userRequest": "./support/util", "loc": "3:0-52" }, { - "moduleId": "./node_modules/@dojo/shim/string.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/string.mjs", - "module": "./node_modules/@dojo/shim/string.mjs", - "moduleName": "./node_modules/@dojo/shim/string.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/string.mjs", + "module": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/string.mjs", "type": "harmony import", "userRequest": "./support/util", "loc": "3:0-44" @@ -3880,12 +3888,12 @@ "source": "/**\n * Helper function to generate a value property descriptor\n *\n * @param value The value the property descriptor should be set to\n * @param enumerable If the property should be enumberable, defaults to false\n * @param writable If the property should be writable, defaults to true\n * @param configurable If the property should be configurable, defaults to true\n * @return The property descriptor object\n */\nexport function getValueDescriptor(value, enumerable = false, writable = true, configurable = true) {\n return {\n value: value,\n enumerable: enumerable,\n writable: writable,\n configurable: configurable\n };\n}\nexport function wrapNative(nativeFunction) {\n return function (target, ...args) {\n return nativeFunction.apply(target, args);\n };\n}\n//# sourceMappingURL=util.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/Injector.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Injector.mjs", - "name": "./node_modules/@dojo/widget-core/Injector.mjs", + "id": "./node_modules/@dojo/framework/widget-core/Injector.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Injector.mjs", + "name": "./node_modules/@dojo/framework/widget-core/Injector.mjs", "index": 37, "index2": 31, - "size": 496, + "size": 493, "cacheable": true, "built": true, "optional": false, @@ -3894,18 +3902,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../Injector", "loc": "2:0-41" @@ -3920,15 +3928,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { Evented } from '@dojo/core/Evented';\nexport class Injector extends Evented {\n constructor(payload) {\n super();\n this._payload = payload;\n }\n setInvalidator(invalidator) {\n this._invalidator = invalidator;\n }\n get() {\n return this._payload;\n }\n set(payload) {\n this._payload = payload;\n if (this._invalidator) {\n this._invalidator();\n }\n }\n}\nexport default Injector;\n//# sourceMappingURL=Injector.mjs.map" + "source": "import { Evented } from '../core/Evented';\nexport class Injector extends Evented {\n constructor(payload) {\n super();\n this._payload = payload;\n }\n setInvalidator(invalidator) {\n this._invalidator = invalidator;\n }\n get() {\n return this._payload;\n }\n set(payload) {\n this._payload = payload;\n if (this._invalidator) {\n this._invalidator();\n }\n }\n}\nexport default Injector;\n//# sourceMappingURL=Injector.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/NodeHandler.mjs", - "name": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "id": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "name": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", "index": 28, "index2": 22, - "size": 1096, + "size": 1090, "cacheable": true, "built": true, "optional": false, @@ -3937,18 +3945,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./NodeHandler", "loc": "7:0-40" @@ -3964,15 +3972,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { Evented } from '@dojo/core/Evented';\nimport Map from '@dojo/shim/Map';\n/**\n * Enum to identify the type of event.\n * Listening to 'Projector' will notify when projector is created or updated\n * Listening to 'Widget' will notify when widget root is created or updated\n */\nexport var NodeEventType;\n(function (NodeEventType) {\n NodeEventType[\"Projector\"] = \"Projector\";\n NodeEventType[\"Widget\"] = \"Widget\";\n})(NodeEventType || (NodeEventType = {}));\nexport class NodeHandler extends Evented {\n constructor() {\n super(...arguments);\n this._nodeMap = new Map();\n }\n get(key) {\n return this._nodeMap.get(key);\n }\n has(key) {\n return this._nodeMap.has(key);\n }\n add(element, key) {\n this._nodeMap.set(key, element);\n this.emit({ type: key });\n }\n addRoot() {\n this.emit({ type: NodeEventType.Widget });\n }\n addProjector() {\n this.emit({ type: NodeEventType.Projector });\n }\n clear() {\n this._nodeMap.clear();\n }\n}\nexport default NodeHandler;\n//# sourceMappingURL=NodeHandler.mjs.map" + "source": "import { Evented } from '../core/Evented';\nimport Map from '../shim/Map';\n/**\n * Enum to identify the type of event.\n * Listening to 'Projector' will notify when projector is created or updated\n * Listening to 'Widget' will notify when widget root is created or updated\n */\nexport var NodeEventType;\n(function (NodeEventType) {\n NodeEventType[\"Projector\"] = \"Projector\";\n NodeEventType[\"Widget\"] = \"Widget\";\n})(NodeEventType || (NodeEventType = {}));\nexport class NodeHandler extends Evented {\n constructor() {\n super(...arguments);\n this._nodeMap = new Map();\n }\n get(key) {\n return this._nodeMap.get(key);\n }\n has(key) {\n return this._nodeMap.has(key);\n }\n add(element, key) {\n this._nodeMap.set(key, element);\n this.emit({ type: key });\n }\n addRoot() {\n this.emit({ type: NodeEventType.Widget });\n }\n addProjector() {\n this.emit({ type: NodeEventType.Projector });\n }\n clear() {\n this._nodeMap.clear();\n }\n}\nexport default NodeHandler;\n//# sourceMappingURL=NodeHandler.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/Registry.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/Registry.mjs", - "name": "./node_modules/@dojo/widget-core/Registry.mjs", + "id": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/Registry.mjs", + "name": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "index": 21, "index2": 19, - "size": 3702, + "size": 3690, "cacheable": true, "built": true, "optional": false, @@ -3981,54 +3989,54 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./Registry", "loc": "9:0-71" }, { - "moduleId": "./node_modules/@dojo/widget-core/diff.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/diff.mjs", - "module": "./node_modules/@dojo/widget-core/diff.mjs", - "moduleName": "./node_modules/@dojo/widget-core/diff.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/diff.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/diff.mjs", + "module": "./node_modules/@dojo/framework/widget-core/diff.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/diff.mjs", "type": "harmony import", "userRequest": "./Registry", "loc": "1:0-46" }, { - "moduleId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/RegistryHandler.mjs", - "module": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "type": "harmony import", "userRequest": "./Registry", "loc": "3:0-38" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", "userRequest": "./Registry", "loc": "4:0-53" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/customElement.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", "type": "harmony import", "userRequest": "../Registry", "loc": "2:0-35" @@ -4049,15 +4057,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import Promise from '@dojo/shim/Promise';\nimport Map from '@dojo/shim/Map';\nimport Symbol from '@dojo/shim/Symbol';\nimport { Evented } from '@dojo/core/Evented';\n/**\n * Widget base symbol type\n */\nexport const WIDGET_BASE_TYPE = Symbol('Widget Base');\n/**\n * Checks is the item is a subclass of WidgetBase (or a WidgetBase)\n *\n * @param item the item to check\n * @returns true/false indicating if the item is a WidgetBaseConstructor\n */\nexport function isWidgetBaseConstructor(item) {\n return Boolean(item && item._type === WIDGET_BASE_TYPE);\n}\nexport function isWidgetConstructorDefaultExport(item) {\n return Boolean(item &&\n item.hasOwnProperty('__esModule') &&\n item.hasOwnProperty('default') &&\n isWidgetBaseConstructor(item.default));\n}\n/**\n * The Registry implementation\n */\nexport class Registry extends Evented {\n /**\n * Emit loaded event for registry label\n */\n emitLoadedEvent(widgetLabel, item) {\n this.emit({\n type: widgetLabel,\n action: 'loaded',\n item\n });\n }\n define(label, item) {\n if (this._widgetRegistry === undefined) {\n this._widgetRegistry = new Map();\n }\n if (this._widgetRegistry.has(label)) {\n throw new Error(`widget has already been registered for '${label.toString()}'`);\n }\n this._widgetRegistry.set(label, item);\n if (item instanceof Promise) {\n item.then((widgetCtor) => {\n this._widgetRegistry.set(label, widgetCtor);\n this.emitLoadedEvent(label, widgetCtor);\n return widgetCtor;\n }, (error) => {\n throw error;\n });\n }\n else if (isWidgetBaseConstructor(item)) {\n this.emitLoadedEvent(label, item);\n }\n }\n defineInjector(label, injectorFactory) {\n if (this._injectorRegistry === undefined) {\n this._injectorRegistry = new Map();\n }\n if (this._injectorRegistry.has(label)) {\n throw new Error(`injector has already been registered for '${label.toString()}'`);\n }\n const invalidator = new Evented();\n const injectorItem = {\n injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })),\n invalidator\n };\n this._injectorRegistry.set(label, injectorItem);\n this.emitLoadedEvent(label, injectorItem);\n }\n get(label) {\n if (!this._widgetRegistry || !this.has(label)) {\n return null;\n }\n const item = this._widgetRegistry.get(label);\n if (isWidgetBaseConstructor(item)) {\n return item;\n }\n if (item instanceof Promise) {\n return null;\n }\n const promise = item();\n this._widgetRegistry.set(label, promise);\n promise.then((widgetCtor) => {\n if (isWidgetConstructorDefaultExport(widgetCtor)) {\n widgetCtor = widgetCtor.default;\n }\n this._widgetRegistry.set(label, widgetCtor);\n this.emitLoadedEvent(label, widgetCtor);\n return widgetCtor;\n }, (error) => {\n throw error;\n });\n return null;\n }\n getInjector(label) {\n if (!this._injectorRegistry || !this.hasInjector(label)) {\n return null;\n }\n return this._injectorRegistry.get(label);\n }\n has(label) {\n return Boolean(this._widgetRegistry && this._widgetRegistry.has(label));\n }\n hasInjector(label) {\n return Boolean(this._injectorRegistry && this._injectorRegistry.has(label));\n }\n}\nexport default Registry;\n//# sourceMappingURL=Registry.mjs.map" + "source": "import Promise from '../shim/Promise';\nimport Map from '../shim/Map';\nimport Symbol from '../shim/Symbol';\nimport { Evented } from '../core/Evented';\n/**\n * Widget base symbol type\n */\nexport const WIDGET_BASE_TYPE = Symbol('Widget Base');\n/**\n * Checks is the item is a subclass of WidgetBase (or a WidgetBase)\n *\n * @param item the item to check\n * @returns true/false indicating if the item is a WidgetBaseConstructor\n */\nexport function isWidgetBaseConstructor(item) {\n return Boolean(item && item._type === WIDGET_BASE_TYPE);\n}\nexport function isWidgetConstructorDefaultExport(item) {\n return Boolean(item &&\n item.hasOwnProperty('__esModule') &&\n item.hasOwnProperty('default') &&\n isWidgetBaseConstructor(item.default));\n}\n/**\n * The Registry implementation\n */\nexport class Registry extends Evented {\n /**\n * Emit loaded event for registry label\n */\n emitLoadedEvent(widgetLabel, item) {\n this.emit({\n type: widgetLabel,\n action: 'loaded',\n item\n });\n }\n define(label, item) {\n if (this._widgetRegistry === undefined) {\n this._widgetRegistry = new Map();\n }\n if (this._widgetRegistry.has(label)) {\n throw new Error(`widget has already been registered for '${label.toString()}'`);\n }\n this._widgetRegistry.set(label, item);\n if (item instanceof Promise) {\n item.then((widgetCtor) => {\n this._widgetRegistry.set(label, widgetCtor);\n this.emitLoadedEvent(label, widgetCtor);\n return widgetCtor;\n }, (error) => {\n throw error;\n });\n }\n else if (isWidgetBaseConstructor(item)) {\n this.emitLoadedEvent(label, item);\n }\n }\n defineInjector(label, injectorFactory) {\n if (this._injectorRegistry === undefined) {\n this._injectorRegistry = new Map();\n }\n if (this._injectorRegistry.has(label)) {\n throw new Error(`injector has already been registered for '${label.toString()}'`);\n }\n const invalidator = new Evented();\n const injectorItem = {\n injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })),\n invalidator\n };\n this._injectorRegistry.set(label, injectorItem);\n this.emitLoadedEvent(label, injectorItem);\n }\n get(label) {\n if (!this._widgetRegistry || !this.has(label)) {\n return null;\n }\n const item = this._widgetRegistry.get(label);\n if (isWidgetBaseConstructor(item)) {\n return item;\n }\n if (item instanceof Promise) {\n return null;\n }\n const promise = item();\n this._widgetRegistry.set(label, promise);\n promise.then((widgetCtor) => {\n if (isWidgetConstructorDefaultExport(widgetCtor)) {\n widgetCtor = widgetCtor.default;\n }\n this._widgetRegistry.set(label, widgetCtor);\n this.emitLoadedEvent(label, widgetCtor);\n return widgetCtor;\n }, (error) => {\n throw error;\n });\n return null;\n }\n getInjector(label) {\n if (!this._injectorRegistry || !this.hasInjector(label)) {\n return null;\n }\n return this._injectorRegistry.get(label);\n }\n has(label) {\n return Boolean(this._widgetRegistry && this._widgetRegistry.has(label));\n }\n hasInjector(label) {\n return Boolean(this._injectorRegistry && this._injectorRegistry.has(label));\n }\n}\nexport default Registry;\n//# sourceMappingURL=Registry.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/RegistryHandler.mjs", - "name": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "id": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "name": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "index": 27, "index2": 21, - "size": 2862, + "size": 2856, "cacheable": true, "built": true, "optional": false, @@ -4066,18 +4074,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./RegistryHandler", "loc": "6:0-48" @@ -4092,15 +4100,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { Map } from '@dojo/shim/Map';\nimport { Evented } from '@dojo/core/Evented';\nimport { Registry } from './Registry';\nexport class RegistryHandler extends Evented {\n constructor() {\n super();\n this._registry = new Registry();\n this._registryWidgetLabelMap = new Map();\n this._registryInjectorLabelMap = new Map();\n this.own(this._registry);\n const destroy = () => {\n if (this.baseRegistry) {\n this._registryWidgetLabelMap.delete(this.baseRegistry);\n this._registryInjectorLabelMap.delete(this.baseRegistry);\n this.baseRegistry = undefined;\n }\n };\n this.own({ destroy });\n }\n set base(baseRegistry) {\n if (this.baseRegistry) {\n this._registryWidgetLabelMap.delete(this.baseRegistry);\n this._registryInjectorLabelMap.delete(this.baseRegistry);\n }\n this.baseRegistry = baseRegistry;\n }\n define(label, widget) {\n this._registry.define(label, widget);\n }\n defineInjector(label, injector) {\n this._registry.defineInjector(label, injector);\n }\n has(label) {\n return this._registry.has(label) || Boolean(this.baseRegistry && this.baseRegistry.has(label));\n }\n hasInjector(label) {\n return this._registry.hasInjector(label) || Boolean(this.baseRegistry && this.baseRegistry.hasInjector(label));\n }\n get(label, globalPrecedence = false) {\n return this._get(label, globalPrecedence, 'get', this._registryWidgetLabelMap);\n }\n getInjector(label, globalPrecedence = false) {\n return this._get(label, globalPrecedence, 'getInjector', this._registryInjectorLabelMap);\n }\n _get(label, globalPrecedence, getFunctionName, labelMap) {\n const registries = globalPrecedence ? [this.baseRegistry, this._registry] : [this._registry, this.baseRegistry];\n for (let i = 0; i < registries.length; i++) {\n const registry = registries[i];\n if (!registry) {\n continue;\n }\n const item = registry[getFunctionName](label);\n const registeredLabels = labelMap.get(registry) || [];\n if (item) {\n return item;\n }\n else if (registeredLabels.indexOf(label) === -1) {\n const handle = registry.on(label, (event) => {\n if (event.action === 'loaded' &&\n this[getFunctionName](label, globalPrecedence) === event.item) {\n this.emit({ type: 'invalidate' });\n }\n });\n this.own(handle);\n labelMap.set(registry, [...registeredLabels, label]);\n }\n }\n return null;\n }\n}\nexport default RegistryHandler;\n//# sourceMappingURL=RegistryHandler.mjs.map" + "source": "import { Map } from '../shim/Map';\nimport { Evented } from '../core/Evented';\nimport { Registry } from './Registry';\nexport class RegistryHandler extends Evented {\n constructor() {\n super();\n this._registry = new Registry();\n this._registryWidgetLabelMap = new Map();\n this._registryInjectorLabelMap = new Map();\n this.own(this._registry);\n const destroy = () => {\n if (this.baseRegistry) {\n this._registryWidgetLabelMap.delete(this.baseRegistry);\n this._registryInjectorLabelMap.delete(this.baseRegistry);\n this.baseRegistry = undefined;\n }\n };\n this.own({ destroy });\n }\n set base(baseRegistry) {\n if (this.baseRegistry) {\n this._registryWidgetLabelMap.delete(this.baseRegistry);\n this._registryInjectorLabelMap.delete(this.baseRegistry);\n }\n this.baseRegistry = baseRegistry;\n }\n define(label, widget) {\n this._registry.define(label, widget);\n }\n defineInjector(label, injector) {\n this._registry.defineInjector(label, injector);\n }\n has(label) {\n return this._registry.has(label) || Boolean(this.baseRegistry && this.baseRegistry.has(label));\n }\n hasInjector(label) {\n return this._registry.hasInjector(label) || Boolean(this.baseRegistry && this.baseRegistry.hasInjector(label));\n }\n get(label, globalPrecedence = false) {\n return this._get(label, globalPrecedence, 'get', this._registryWidgetLabelMap);\n }\n getInjector(label, globalPrecedence = false) {\n return this._get(label, globalPrecedence, 'getInjector', this._registryInjectorLabelMap);\n }\n _get(label, globalPrecedence, getFunctionName, labelMap) {\n const registries = globalPrecedence ? [this.baseRegistry, this._registry] : [this._registry, this.baseRegistry];\n for (let i = 0; i < registries.length; i++) {\n const registry = registries[i];\n if (!registry) {\n continue;\n }\n const item = registry[getFunctionName](label);\n const registeredLabels = labelMap.get(registry) || [];\n if (item) {\n return item;\n }\n else if (registeredLabels.indexOf(label) === -1) {\n const handle = registry.on(label, (event) => {\n if (event.action === 'loaded' &&\n this[getFunctionName](label, globalPrecedence) === event.item) {\n this.emit({ type: 'invalidate' });\n }\n });\n this.own(handle);\n labelMap.set(registry, [...registeredLabels, label]);\n }\n }\n return null;\n }\n}\nexport default RegistryHandler;\n//# sourceMappingURL=RegistryHandler.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "name": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "id": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "name": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "index": 14, "index2": 26, - "size": 14386, + "size": 13720, "cacheable": true, "built": true, "optional": false, @@ -4109,18 +4117,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./WidgetBase", "loc": "2:0-50" @@ -4131,8 +4139,8 @@ "module": "./src/menu/Menu.ts", "moduleName": "./src/menu/Menu.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/WidgetBase", - "loc": "5:0-58" + "userRequest": "@dojo/framework/widget-core/WidgetBase", + "loc": "5:0-68" } ], "usedExports": [ @@ -4146,12 +4154,12 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import Map from '@dojo/shim/Map';\nimport WeakMap from '@dojo/shim/WeakMap';\nimport Symbol from '@dojo/shim/Symbol';\nimport { v } from './d';\nimport { auto } from './diff';\nimport RegistryHandler from './RegistryHandler';\nimport NodeHandler from './NodeHandler';\nimport { widgetInstanceMap } from './vdom';\nimport { isWidgetBaseConstructor, WIDGET_BASE_TYPE } from './Registry';\nconst decoratorMap = new Map();\nconst boundAuto = auto.bind(null);\nexport const noBind = Symbol.for('dojoNoBind');\n/**\n * Main widget base for all widgets to extend\n */\nexport class WidgetBase {\n /**\n * @constructor\n */\n constructor() {\n /**\n * Indicates if it is the initial set properties cycle\n */\n this._initialProperties = true;\n /**\n * Array of property keys considered changed from the previous set properties\n */\n this._changedPropertyKeys = [];\n this._nodeHandler = new NodeHandler();\n this._handles = [];\n this._children = [];\n this._decoratorCache = new Map();\n this._properties = {};\n this._boundRenderFunc = this.render.bind(this);\n this._boundInvalidate = this.invalidate.bind(this);\n widgetInstanceMap.set(this, {\n dirty: true,\n onAttach: () => {\n this.onAttach();\n },\n onDetach: () => {\n this.onDetach();\n this.destroy();\n },\n nodeHandler: this._nodeHandler,\n registry: () => {\n return this.registry;\n },\n coreProperties: {},\n rendering: false,\n inputProperties: {}\n });\n this._runAfterConstructors();\n }\n meta(MetaType) {\n if (this._metaMap === undefined) {\n this._metaMap = new Map();\n }\n let cached = this._metaMap.get(MetaType);\n if (!cached) {\n cached = new MetaType({\n invalidate: this._boundInvalidate,\n nodeHandler: this._nodeHandler,\n bind: this\n });\n this.own(cached);\n this._metaMap.set(MetaType, cached);\n }\n return cached;\n }\n onAttach() {\n // Do nothing by default.\n }\n onDetach() {\n // Do nothing by default.\n }\n get properties() {\n return this._properties;\n }\n get changedPropertyKeys() {\n return [...this._changedPropertyKeys];\n }\n __setCoreProperties__(coreProperties) {\n const { baseRegistry } = coreProperties;\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.coreProperties.baseRegistry !== baseRegistry) {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n this._registry.base = baseRegistry;\n this.invalidate();\n }\n instanceData.coreProperties = coreProperties;\n }\n __setProperties__(originalProperties) {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.inputProperties = originalProperties;\n const properties = this._runBeforeProperties(originalProperties);\n const registeredDiffPropertyNames = this.getDecorator('registeredDiffProperty');\n const changedPropertyKeys = [];\n const propertyNames = Object.keys(properties);\n if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) {\n const allProperties = [...propertyNames, ...Object.keys(this._properties)];\n const checkedProperties = [];\n const diffPropertyResults = {};\n let runReactions = false;\n for (let i = 0; i < allProperties.length; i++) {\n const propertyName = allProperties[i];\n if (checkedProperties.indexOf(propertyName) !== -1) {\n continue;\n }\n checkedProperties.push(propertyName);\n const previousProperty = this._properties[propertyName];\n const newProperty = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n if (registeredDiffPropertyNames.indexOf(propertyName) !== -1) {\n runReactions = true;\n const diffFunctions = this.getDecorator(`diffProperty:${propertyName}`);\n for (let i = 0; i < diffFunctions.length; i++) {\n const result = diffFunctions[i](previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n else {\n const result = boundAuto(previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n if (runReactions) {\n this._mapDiffPropertyReactions(properties, changedPropertyKeys).forEach((args, reaction) => {\n if (args.changed) {\n reaction.call(this, args.previousProperties, args.newProperties);\n }\n });\n }\n this._properties = diffPropertyResults;\n this._changedPropertyKeys = changedPropertyKeys;\n }\n else {\n this._initialProperties = false;\n for (let i = 0; i < propertyNames.length; i++) {\n const propertyName = propertyNames[i];\n if (typeof properties[propertyName] === 'function') {\n properties[propertyName] = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n }\n else {\n changedPropertyKeys.push(propertyName);\n }\n }\n this._changedPropertyKeys = changedPropertyKeys;\n this._properties = Object.assign({}, properties);\n }\n if (this._changedPropertyKeys.length > 0) {\n this.invalidate();\n }\n }\n get children() {\n return this._children;\n }\n __setChildren__(children) {\n if (this._children.length > 0 || children.length > 0) {\n this._children = children;\n this.invalidate();\n }\n }\n __render__() {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.dirty = false;\n const render = this._runBeforeRenders();\n let dNode = render();\n dNode = this.runAfterRenders(dNode);\n this._nodeHandler.clear();\n return dNode;\n }\n invalidate() {\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.invalidate) {\n instanceData.invalidate();\n }\n }\n render() {\n return v('div', {}, this.children);\n }\n /**\n * Function to add decorators to WidgetBase\n *\n * @param decoratorKey The key of the decorator\n * @param value The value of the decorator\n */\n addDecorator(decoratorKey, value) {\n value = Array.isArray(value) ? value : [value];\n if (this.hasOwnProperty('constructor')) {\n let decoratorList = decoratorMap.get(this.constructor);\n if (!decoratorList) {\n decoratorList = new Map();\n decoratorMap.set(this.constructor, decoratorList);\n }\n let specificDecoratorList = decoratorList.get(decoratorKey);\n if (!specificDecoratorList) {\n specificDecoratorList = [];\n decoratorList.set(decoratorKey, specificDecoratorList);\n }\n specificDecoratorList.push(...value);\n }\n else {\n const decorators = this.getDecorator(decoratorKey);\n this._decoratorCache.set(decoratorKey, [...decorators, ...value]);\n }\n }\n /**\n * Function to build the list of decorators from the global decorator map.\n *\n * @param decoratorKey The key of the decorator\n * @return An array of decorator values\n * @private\n */\n _buildDecoratorList(decoratorKey) {\n const allDecorators = [];\n let constructor = this.constructor;\n while (constructor) {\n const instanceMap = decoratorMap.get(constructor);\n if (instanceMap) {\n const decorators = instanceMap.get(decoratorKey);\n if (decorators) {\n allDecorators.unshift(...decorators);\n }\n }\n constructor = Object.getPrototypeOf(constructor);\n }\n return allDecorators;\n }\n /**\n * Function to retrieve decorator values\n *\n * @param decoratorKey The key of the decorator\n * @returns An array of decorator values\n */\n getDecorator(decoratorKey) {\n let allDecorators = this._decoratorCache.get(decoratorKey);\n if (allDecorators !== undefined) {\n return allDecorators;\n }\n allDecorators = this._buildDecoratorList(decoratorKey);\n this._decoratorCache.set(decoratorKey, allDecorators);\n return allDecorators;\n }\n _mapDiffPropertyReactions(newProperties, changedPropertyKeys) {\n const reactionFunctions = this.getDecorator('diffReaction');\n return reactionFunctions.reduce((reactionPropertyMap, { reaction, propertyName }) => {\n let reactionArguments = reactionPropertyMap.get(reaction);\n if (reactionArguments === undefined) {\n reactionArguments = {\n previousProperties: {},\n newProperties: {},\n changed: false\n };\n }\n reactionArguments.previousProperties[propertyName] = this._properties[propertyName];\n reactionArguments.newProperties[propertyName] = newProperties[propertyName];\n if (changedPropertyKeys.indexOf(propertyName) !== -1) {\n reactionArguments.changed = true;\n }\n reactionPropertyMap.set(reaction, reactionArguments);\n return reactionPropertyMap;\n }, new Map());\n }\n /**\n * Binds unbound property functions to the specified `bind` property\n *\n * @param properties properties to check for functions\n */\n _bindFunctionProperty(property, bind) {\n if (typeof property === 'function' && !property[noBind] && isWidgetBaseConstructor(property) === false) {\n if (this._bindFunctionPropertyMap === undefined) {\n this._bindFunctionPropertyMap = new WeakMap();\n }\n const bindInfo = this._bindFunctionPropertyMap.get(property) || {};\n let { boundFunc, scope } = bindInfo;\n if (boundFunc === undefined || scope !== bind) {\n boundFunc = property.bind(bind);\n this._bindFunctionPropertyMap.set(property, { boundFunc, scope: bind });\n }\n return boundFunc;\n }\n return property;\n }\n get registry() {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n return this._registry;\n }\n _runBeforeProperties(properties) {\n const beforeProperties = this.getDecorator('beforeProperties');\n if (beforeProperties.length > 0) {\n return beforeProperties.reduce((properties, beforePropertiesFunction) => {\n return Object.assign({}, properties, beforePropertiesFunction.call(this, properties));\n }, Object.assign({}, properties));\n }\n return properties;\n }\n /**\n * Run all registered before renders and return the updated render method\n */\n _runBeforeRenders() {\n const beforeRenders = this.getDecorator('beforeRender');\n if (beforeRenders.length > 0) {\n return beforeRenders.reduce((render, beforeRenderFunction) => {\n const updatedRender = beforeRenderFunction.call(this, render, this._properties, this._children);\n if (!updatedRender) {\n console.warn('Render function not returned from beforeRender, using previous render');\n return render;\n }\n return updatedRender;\n }, this._boundRenderFunc);\n }\n return this._boundRenderFunc;\n }\n /**\n * Run all registered after renders and return the decorated DNodes\n *\n * @param dNode The DNodes to run through the after renders\n */\n runAfterRenders(dNode) {\n const afterRenders = this.getDecorator('afterRender');\n if (afterRenders.length > 0) {\n return afterRenders.reduce((dNode, afterRenderFunction) => {\n return afterRenderFunction.call(this, dNode);\n }, dNode);\n }\n if (this._metaMap !== undefined) {\n this._metaMap.forEach((meta) => {\n meta.afterRender();\n });\n }\n return dNode;\n }\n _runAfterConstructors() {\n const afterConstructors = this.getDecorator('afterConstructor');\n if (afterConstructors.length > 0) {\n afterConstructors.forEach((afterConstructor) => afterConstructor.call(this));\n }\n }\n own(handle) {\n this._handles.push(handle);\n }\n destroy() {\n while (this._handles.length > 0) {\n const handle = this._handles.pop();\n if (handle) {\n handle.destroy();\n }\n }\n }\n}\n/**\n * static identifier\n */\nWidgetBase._type = WIDGET_BASE_TYPE;\nexport default WidgetBase;\n//# sourceMappingURL=WidgetBase.mjs.map" + "source": "import Map from '../shim/Map';\nimport WeakMap from '../shim/WeakMap';\nimport Symbol from '../shim/Symbol';\nimport { v } from './d';\nimport { auto } from './diff';\nimport RegistryHandler from './RegistryHandler';\nimport NodeHandler from './NodeHandler';\nimport { widgetInstanceMap } from './vdom';\nimport { isWidgetBaseConstructor, WIDGET_BASE_TYPE } from './Registry';\nconst decoratorMap = new Map();\nconst boundAuto = auto.bind(null);\nexport const noBind = Symbol.for('dojoNoBind');\n/**\n * Main widget base for all widgets to extend\n */\nexport class WidgetBase {\n /**\n * @constructor\n */\n constructor() {\n /**\n * Indicates if it is the initial set properties cycle\n */\n this._initialProperties = true;\n /**\n * Array of property keys considered changed from the previous set properties\n */\n this._changedPropertyKeys = [];\n this._nodeHandler = new NodeHandler();\n this._handles = [];\n this._children = [];\n this._decoratorCache = new Map();\n this._properties = {};\n this._boundRenderFunc = this.render.bind(this);\n this._boundInvalidate = this.invalidate.bind(this);\n widgetInstanceMap.set(this, {\n dirty: true,\n onAttach: () => {\n this.onAttach();\n },\n onDetach: () => {\n this.onDetach();\n this.destroy();\n },\n nodeHandler: this._nodeHandler,\n registry: () => {\n return this.registry;\n },\n coreProperties: {},\n rendering: false,\n inputProperties: {}\n });\n this._runAfterConstructors();\n }\n meta(MetaType) {\n if (this._metaMap === undefined) {\n this._metaMap = new Map();\n }\n let cached = this._metaMap.get(MetaType);\n if (!cached) {\n cached = new MetaType({\n invalidate: this._boundInvalidate,\n nodeHandler: this._nodeHandler,\n bind: this\n });\n this.own(cached);\n this._metaMap.set(MetaType, cached);\n }\n return cached;\n }\n onAttach() {\n // Do nothing by default.\n }\n onDetach() {\n // Do nothing by default.\n }\n get properties() {\n return this._properties;\n }\n get changedPropertyKeys() {\n return [...this._changedPropertyKeys];\n }\n __setCoreProperties__(coreProperties) {\n const { baseRegistry } = coreProperties;\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.coreProperties.baseRegistry !== baseRegistry) {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n this._registry.base = baseRegistry;\n this.invalidate();\n }\n instanceData.coreProperties = coreProperties;\n }\n __setProperties__(originalProperties) {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.inputProperties = originalProperties;\n const properties = this._runBeforeProperties(originalProperties);\n const registeredDiffPropertyNames = this.getDecorator('registeredDiffProperty');\n const changedPropertyKeys = [];\n const propertyNames = Object.keys(properties);\n if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) {\n const allProperties = [...propertyNames, ...Object.keys(this._properties)];\n const checkedProperties = [];\n const diffPropertyResults = {};\n let runReactions = false;\n for (let i = 0; i < allProperties.length; i++) {\n const propertyName = allProperties[i];\n if (checkedProperties.indexOf(propertyName) !== -1) {\n continue;\n }\n checkedProperties.push(propertyName);\n const previousProperty = this._properties[propertyName];\n const newProperty = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n if (registeredDiffPropertyNames.indexOf(propertyName) !== -1) {\n runReactions = true;\n const diffFunctions = this.getDecorator(`diffProperty:${propertyName}`);\n for (let i = 0; i < diffFunctions.length; i++) {\n const result = diffFunctions[i](previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n else {\n const result = boundAuto(previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n if (runReactions) {\n const reactionFunctions = this.getDecorator('diffReaction');\n const executedReactions = [];\n reactionFunctions.forEach(({ reaction, propertyName }) => {\n const propertyChanged = changedPropertyKeys.indexOf(propertyName) !== -1;\n const reactionRun = executedReactions.indexOf(reaction) !== -1;\n if (propertyChanged && !reactionRun) {\n reaction.call(this, this._properties, diffPropertyResults);\n executedReactions.push(reaction);\n }\n });\n }\n this._properties = diffPropertyResults;\n this._changedPropertyKeys = changedPropertyKeys;\n }\n else {\n this._initialProperties = false;\n for (let i = 0; i < propertyNames.length; i++) {\n const propertyName = propertyNames[i];\n if (typeof properties[propertyName] === 'function') {\n properties[propertyName] = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n }\n else {\n changedPropertyKeys.push(propertyName);\n }\n }\n this._changedPropertyKeys = changedPropertyKeys;\n this._properties = Object.assign({}, properties);\n }\n if (this._changedPropertyKeys.length > 0) {\n this.invalidate();\n }\n }\n get children() {\n return this._children;\n }\n __setChildren__(children) {\n if (this._children.length > 0 || children.length > 0) {\n this._children = children;\n this.invalidate();\n }\n }\n __render__() {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.dirty = false;\n const render = this._runBeforeRenders();\n let dNode = render();\n dNode = this.runAfterRenders(dNode);\n this._nodeHandler.clear();\n return dNode;\n }\n invalidate() {\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.invalidate) {\n instanceData.invalidate();\n }\n }\n render() {\n return v('div', {}, this.children);\n }\n /**\n * Function to add decorators to WidgetBase\n *\n * @param decoratorKey The key of the decorator\n * @param value The value of the decorator\n */\n addDecorator(decoratorKey, value) {\n value = Array.isArray(value) ? value : [value];\n if (this.hasOwnProperty('constructor')) {\n let decoratorList = decoratorMap.get(this.constructor);\n if (!decoratorList) {\n decoratorList = new Map();\n decoratorMap.set(this.constructor, decoratorList);\n }\n let specificDecoratorList = decoratorList.get(decoratorKey);\n if (!specificDecoratorList) {\n specificDecoratorList = [];\n decoratorList.set(decoratorKey, specificDecoratorList);\n }\n specificDecoratorList.push(...value);\n }\n else {\n const decorators = this.getDecorator(decoratorKey);\n this._decoratorCache.set(decoratorKey, [...decorators, ...value]);\n }\n }\n /**\n * Function to build the list of decorators from the global decorator map.\n *\n * @param decoratorKey The key of the decorator\n * @return An array of decorator values\n * @private\n */\n _buildDecoratorList(decoratorKey) {\n const allDecorators = [];\n let constructor = this.constructor;\n while (constructor) {\n const instanceMap = decoratorMap.get(constructor);\n if (instanceMap) {\n const decorators = instanceMap.get(decoratorKey);\n if (decorators) {\n allDecorators.unshift(...decorators);\n }\n }\n constructor = Object.getPrototypeOf(constructor);\n }\n return allDecorators;\n }\n /**\n * Function to retrieve decorator values\n *\n * @param decoratorKey The key of the decorator\n * @returns An array of decorator values\n */\n getDecorator(decoratorKey) {\n let allDecorators = this._decoratorCache.get(decoratorKey);\n if (allDecorators !== undefined) {\n return allDecorators;\n }\n allDecorators = this._buildDecoratorList(decoratorKey);\n this._decoratorCache.set(decoratorKey, allDecorators);\n return allDecorators;\n }\n /**\n * Binds unbound property functions to the specified `bind` property\n *\n * @param properties properties to check for functions\n */\n _bindFunctionProperty(property, bind) {\n if (typeof property === 'function' && !property[noBind] && isWidgetBaseConstructor(property) === false) {\n if (this._bindFunctionPropertyMap === undefined) {\n this._bindFunctionPropertyMap = new WeakMap();\n }\n const bindInfo = this._bindFunctionPropertyMap.get(property) || {};\n let { boundFunc, scope } = bindInfo;\n if (boundFunc === undefined || scope !== bind) {\n boundFunc = property.bind(bind);\n this._bindFunctionPropertyMap.set(property, { boundFunc, scope: bind });\n }\n return boundFunc;\n }\n return property;\n }\n get registry() {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n return this._registry;\n }\n _runBeforeProperties(properties) {\n const beforeProperties = this.getDecorator('beforeProperties');\n if (beforeProperties.length > 0) {\n return beforeProperties.reduce((properties, beforePropertiesFunction) => {\n return Object.assign({}, properties, beforePropertiesFunction.call(this, properties));\n }, Object.assign({}, properties));\n }\n return properties;\n }\n /**\n * Run all registered before renders and return the updated render method\n */\n _runBeforeRenders() {\n const beforeRenders = this.getDecorator('beforeRender');\n if (beforeRenders.length > 0) {\n return beforeRenders.reduce((render, beforeRenderFunction) => {\n const updatedRender = beforeRenderFunction.call(this, render, this._properties, this._children);\n if (!updatedRender) {\n console.warn('Render function not returned from beforeRender, using previous render');\n return render;\n }\n return updatedRender;\n }, this._boundRenderFunc);\n }\n return this._boundRenderFunc;\n }\n /**\n * Run all registered after renders and return the decorated DNodes\n *\n * @param dNode The DNodes to run through the after renders\n */\n runAfterRenders(dNode) {\n const afterRenders = this.getDecorator('afterRender');\n if (afterRenders.length > 0) {\n dNode = afterRenders.reduce((dNode, afterRenderFunction) => {\n return afterRenderFunction.call(this, dNode);\n }, dNode);\n }\n if (this._metaMap !== undefined) {\n this._metaMap.forEach((meta) => {\n meta.afterRender();\n });\n }\n return dNode;\n }\n _runAfterConstructors() {\n const afterConstructors = this.getDecorator('afterConstructor');\n if (afterConstructors.length > 0) {\n afterConstructors.forEach((afterConstructor) => afterConstructor.call(this));\n }\n }\n own(handle) {\n this._handles.push(handle);\n }\n destroy() {\n while (this._handles.length > 0) {\n const handle = this._handles.pop();\n if (handle) {\n handle.destroy();\n }\n }\n }\n}\n/**\n * static identifier\n */\nWidgetBase._type = WIDGET_BASE_TYPE;\nexport default WidgetBase;\n//# sourceMappingURL=WidgetBase.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/animations/cssTransitions.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/animations/cssTransitions.mjs", - "name": "./node_modules/@dojo/widget-core/animations/cssTransitions.mjs", + "id": "./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs", + "name": "./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs", "index": 33, "index2": 27, "size": 2288, @@ -4163,18 +4171,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "../animations/cssTransitions", "loc": "3:0-58" @@ -4191,12 +4199,12 @@ "source": "let browserSpecificTransitionEndEventName = '';\nlet browserSpecificAnimationEndEventName = '';\nfunction determineBrowserStyleNames(element) {\n if ('WebkitTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'webkitTransitionEnd';\n browserSpecificAnimationEndEventName = 'webkitAnimationEnd';\n }\n else if ('transition' in element.style || 'MozTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'transitionend';\n browserSpecificAnimationEndEventName = 'animationend';\n }\n else {\n throw new Error('Your browser is not supported');\n }\n}\nfunction initialize(element) {\n if (browserSpecificAnimationEndEventName === '') {\n determineBrowserStyleNames(element);\n }\n}\nfunction runAndCleanUp(element, startAnimation, finishAnimation) {\n initialize(element);\n let finished = false;\n let transitionEnd = function () {\n if (!finished) {\n finished = true;\n element.removeEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n element.removeEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n finishAnimation();\n }\n };\n startAnimation();\n element.addEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n element.addEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n}\nfunction exit(node, properties, exitAnimation, removeNode) {\n const activeClass = properties.exitAnimationActive || `${exitAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(exitAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n removeNode();\n });\n}\nfunction enter(node, properties, enterAnimation) {\n const activeClass = properties.enterAnimationActive || `${enterAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(enterAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n node.classList.remove(enterAnimation);\n node.classList.remove(activeClass);\n });\n}\nexport default {\n enter,\n exit\n};\n//# sourceMappingURL=cssTransitions.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/d.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/d.mjs", - "name": "./node_modules/@dojo/widget-core/d.mjs", + "id": "./node_modules/@dojo/framework/widget-core/d.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/d.mjs", + "name": "./node_modules/@dojo/framework/widget-core/d.mjs", "index": 4, "index2": 8, - "size": 3270, + "size": 3267, "cacheable": true, "built": true, "optional": false, @@ -4205,54 +4213,54 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./d", "loc": "5:0-29" }, { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./d", "loc": "4:0-24" }, - { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "type": "harmony import", - "userRequest": "./../d", - "loc": "5:0-27" - }, { "moduleId": "./src/menu/Menu.ts", "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--3-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/umd-compat-loader/index.js??ref--3-1!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/ts-loader/index.js??ref--3-2!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/css-module-dts-loader/index.js?type=ts&instanceName=0_menu!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu/Menu.ts", "module": "./src/menu/Menu.ts", "moduleName": "./src/menu/Menu.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/d", - "loc": "2:0-40" + "userRequest": "@dojo/framework/widget-core/d", + "loc": "2:0-50" + }, + { + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "type": "harmony import", + "userRequest": "./../d", + "loc": "5:0-27" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", "userRequest": "./d", "loc": "3:0-65" @@ -4283,12 +4291,12 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import Symbol from '@dojo/shim/Symbol';\n/**\n * The symbol identifier for a WNode type\n */\nexport const WNODE = Symbol('Identifier for a WNode.');\n/**\n * The symbol identifier for a VNode type\n */\nexport const VNODE = Symbol('Identifier for a VNode.');\n/**\n * The symbol identifier for a VNode type created using dom()\n */\nexport const DOMVNODE = Symbol('Identifier for a VNode created using existing dom.');\n/**\n * Helper function that returns true if the `DNode` is a `WNode` using the `type` property\n */\nexport function isWNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === WNODE);\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` using the `type` property\n */\nexport function isVNode(child) {\n return Boolean(child && typeof child !== 'string' && (child.type === VNODE || child.type === DOMVNODE));\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` created with `dom()` using the `type` property\n */\nexport function isDomVNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === DOMVNODE);\n}\nexport function isElementNode(value) {\n return !!value.tagName;\n}\nexport function decorate(dNodes, optionsOrModifier, predicate) {\n let shallow = false;\n let modifier;\n if (typeof optionsOrModifier === 'function') {\n modifier = optionsOrModifier;\n }\n else {\n modifier = optionsOrModifier.modifier;\n predicate = optionsOrModifier.predicate;\n shallow = optionsOrModifier.shallow || false;\n }\n let nodes = Array.isArray(dNodes) ? [...dNodes] : [dNodes];\n function breaker() {\n nodes = [];\n }\n while (nodes.length) {\n const node = nodes.shift();\n if (node) {\n if (!shallow && (isWNode(node) || isVNode(node)) && node.children) {\n nodes = [...nodes, ...node.children];\n }\n if (!predicate || predicate(node)) {\n modifier(node, breaker);\n }\n }\n }\n return dNodes;\n}\n/**\n * Wrapper function for calls to create a widget.\n */\nexport function w(widgetConstructor, properties, children = []) {\n return {\n children,\n widgetConstructor,\n properties,\n type: WNODE\n };\n}\nexport function v(tag, propertiesOrChildren = {}, children = undefined) {\n let properties = propertiesOrChildren;\n let deferredPropertiesCallback;\n if (Array.isArray(propertiesOrChildren)) {\n children = propertiesOrChildren;\n properties = {};\n }\n if (typeof properties === 'function') {\n deferredPropertiesCallback = properties;\n properties = {};\n }\n return {\n tag,\n deferredPropertiesCallback,\n children,\n properties,\n type: VNODE\n };\n}\n/**\n * Create a VNode for an existing DOM Node.\n */\nexport function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, children) {\n return {\n tag: isElementNode(node) ? node.tagName.toLowerCase() : '',\n properties: props,\n attributes: attrs,\n events: on,\n children,\n type: DOMVNODE,\n domNode: node,\n text: isElementNode(node) ? undefined : node.data,\n diffType\n };\n}\n//# sourceMappingURL=d.mjs.map" + "source": "import Symbol from '../shim/Symbol';\n/**\n * The symbol identifier for a WNode type\n */\nexport const WNODE = Symbol('Identifier for a WNode.');\n/**\n * The symbol identifier for a VNode type\n */\nexport const VNODE = Symbol('Identifier for a VNode.');\n/**\n * The symbol identifier for a VNode type created using dom()\n */\nexport const DOMVNODE = Symbol('Identifier for a VNode created using existing dom.');\n/**\n * Helper function that returns true if the `DNode` is a `WNode` using the `type` property\n */\nexport function isWNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === WNODE);\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` using the `type` property\n */\nexport function isVNode(child) {\n return Boolean(child && typeof child !== 'string' && (child.type === VNODE || child.type === DOMVNODE));\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` created with `dom()` using the `type` property\n */\nexport function isDomVNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === DOMVNODE);\n}\nexport function isElementNode(value) {\n return !!value.tagName;\n}\nexport function decorate(dNodes, optionsOrModifier, predicate) {\n let shallow = false;\n let modifier;\n if (typeof optionsOrModifier === 'function') {\n modifier = optionsOrModifier;\n }\n else {\n modifier = optionsOrModifier.modifier;\n predicate = optionsOrModifier.predicate;\n shallow = optionsOrModifier.shallow || false;\n }\n let nodes = Array.isArray(dNodes) ? [...dNodes] : [dNodes];\n function breaker() {\n nodes = [];\n }\n while (nodes.length) {\n const node = nodes.shift();\n if (node) {\n if (!shallow && (isWNode(node) || isVNode(node)) && node.children) {\n nodes = [...nodes, ...node.children];\n }\n if (!predicate || predicate(node)) {\n modifier(node, breaker);\n }\n }\n }\n return dNodes;\n}\n/**\n * Wrapper function for calls to create a widget.\n */\nexport function w(widgetConstructor, properties, children = []) {\n return {\n children,\n widgetConstructor,\n properties,\n type: WNODE\n };\n}\nexport function v(tag, propertiesOrChildren = {}, children = undefined) {\n let properties = propertiesOrChildren;\n let deferredPropertiesCallback;\n if (Array.isArray(propertiesOrChildren)) {\n children = propertiesOrChildren;\n properties = {};\n }\n if (typeof properties === 'function') {\n deferredPropertiesCallback = properties;\n properties = {};\n }\n return {\n tag,\n deferredPropertiesCallback,\n children,\n properties,\n type: VNODE\n };\n}\n/**\n * Create a VNode for an existing DOM Node.\n */\nexport function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, children) {\n return {\n tag: isElementNode(node) ? node.tagName.toLowerCase() : '',\n properties: props,\n attributes: attrs,\n events: on,\n children,\n type: DOMVNODE,\n domNode: node,\n text: isElementNode(node) ? undefined : node.data,\n diffType\n };\n}\n//# sourceMappingURL=d.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "index": 41, "index2": 36, "size": 365, @@ -4300,18 +4308,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./decorators/alwaysRender", "loc": "8:0-57" @@ -4329,9 +4337,9 @@ "source": "import { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\nexport function alwaysRender() {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function () {\n this.invalidate();\n })(target);\n });\n}\nexport default alwaysRender;\n//# sourceMappingURL=alwaysRender.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", "index": 39, "index2": 32, "size": 331, @@ -4343,27 +4351,27 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "issuerId": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "issuerName": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "type": "harmony import", "userRequest": "./beforeProperties", "loc": "2:0-54" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/inject.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "type": "harmony import", "userRequest": "./beforeProperties", "loc": "3:0-54" @@ -4381,9 +4389,9 @@ "source": "import { handleDecorator } from './handleDecorator';\nexport function beforeProperties(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('beforeProperties', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default beforeProperties;\n//# sourceMappingURL=beforeProperties.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/customElement.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", "index": 12, "index2": 38, "size": 728, @@ -4408,8 +4416,8 @@ "module": "./src/menu/Menu.ts", "moduleName": "./src/menu/Menu.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/decorators/customElement", - "loc": "3:0-75" + "userRequest": "@dojo/framework/widget-core/decorators/customElement", + "loc": "3:0-85" } ], "usedExports": [ @@ -4424,12 +4432,12 @@ "source": "import { CustomElementChildType } from '../registerCustomElement';\nimport Registry from '../Registry';\n/**\n * This Decorator is provided properties that define the behavior of a custom element, and\n * registers that custom element.\n */\nexport function customElement({ tag, properties = [], attributes = [], events = [], childType = CustomElementChildType.DOJO, registryFactory = () => new Registry() }) {\n return function (target) {\n target.prototype.__customElementDescriptor = {\n tagName: tag,\n attributes,\n properties,\n events,\n childType,\n registryFactory\n };\n };\n}\nexport default customElement;\n//# sourceMappingURL=customElement.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", "index": 40, "index2": 34, - "size": 973, + "size": 1014, "cacheable": true, "built": true, "optional": false, @@ -4438,18 +4446,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../decorators/diffProperty", "loc": "5:0-60" @@ -4464,12 +4472,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { handleDecorator } from './handleDecorator';\n/**\n * Decorator that can be used to register a function as a specific property diff\n *\n * @param propertyName The name of the property of which the diff function is applied\n * @param diffType The diff type, default is DiffType.AUTO.\n * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM\n */\nexport function diffProperty(propertyName, diffFunction, reactionFunction) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null));\n target.addDecorator('registeredDiffProperty', propertyName);\n if (reactionFunction || propertyKey) {\n target.addDecorator('diffReaction', {\n propertyName,\n reaction: propertyKey ? target[propertyKey] : reactionFunction\n });\n }\n });\n}\nexport default diffProperty;\n//# sourceMappingURL=diffProperty.mjs.map" + "source": "import { handleDecorator } from './handleDecorator';\nimport { auto } from './../diff';\n/**\n * Decorator that can be used to register a function as a specific property diff\n *\n * @param propertyName The name of the property of which the diff function is applied\n * @param diffType The diff type, default is DiffType.AUTO.\n * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM\n */\nexport function diffProperty(propertyName, diffFunction = auto, reactionFunction) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null));\n target.addDecorator('registeredDiffProperty', propertyName);\n if (reactionFunction || propertyKey) {\n target.addDecorator('diffReaction', {\n propertyName,\n reaction: propertyKey ? target[propertyKey] : reactionFunction\n });\n }\n });\n}\nexport default diffProperty;\n//# sourceMappingURL=diffProperty.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/handleDecorator.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs", "index": 35, "index2": 28, "size": 512, @@ -4481,63 +4489,63 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../decorators/handleDecorator", "loc": "4:0-66" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/inject.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "2:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" @@ -4555,9 +4563,9 @@ "source": "/**\n * Generic decorator handler to take care of whether or not the decorator was called at the class level\n * or the method level.\n *\n * @param handler\n */\nexport function handleDecorator(handler) {\n return function (target, propertyKey, descriptor) {\n if (typeof target === 'function') {\n handler(target.prototype, undefined);\n }\n else {\n handler(target, propertyKey);\n }\n };\n}\nexport default handleDecorator;\n//# sourceMappingURL=handleDecorator.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/inject.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "index": 38, "index2": 33, "size": 1532, @@ -4569,18 +4577,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../decorators/inject", "loc": "3:0-48" @@ -4595,12 +4603,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import WeakMap from '@dojo/shim/WeakMap';\nimport { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\n/**\n * Map of instances against registered injectors.\n */\nconst registeredInjectorsMap = new WeakMap();\n/**\n * Decorator retrieves an injector from an available registry using the name and\n * calls the `getProperties` function with the payload from the injector\n * and current properties with the the injected properties returned.\n *\n * @param InjectConfig the inject configuration\n */\nexport function inject({ name, getProperties }) {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function (properties) {\n const injectorItem = this.registry.getInjector(name);\n if (injectorItem) {\n const { injector, invalidator } = injectorItem;\n const registeredInjectors = registeredInjectorsMap.get(this) || [];\n if (registeredInjectors.length === 0) {\n registeredInjectorsMap.set(this, registeredInjectors);\n }\n if (registeredInjectors.indexOf(injectorItem) === -1) {\n this.own(invalidator.on('invalidate', () => {\n this.invalidate();\n }));\n registeredInjectors.push(injectorItem);\n }\n return getProperties(injector(), properties);\n }\n })(target);\n });\n}\nexport default inject;\n//# sourceMappingURL=inject.mjs.map" + "source": "import WeakMap from '../../shim/WeakMap';\nimport { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\n/**\n * Map of instances against registered injectors.\n */\nconst registeredInjectorsMap = new WeakMap();\n/**\n * Decorator retrieves an injector from an available registry using the name and\n * calls the `getProperties` function with the payload from the injector\n * and current properties with the the injected properties returned.\n *\n * @param InjectConfig the inject configuration\n */\nexport function inject({ name, getProperties }) {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function (properties) {\n const injectorItem = this.registry.getInjector(name);\n if (injectorItem) {\n const { injector, invalidator } = injectorItem;\n const registeredInjectors = registeredInjectorsMap.get(this) || [];\n if (registeredInjectors.length === 0) {\n registeredInjectorsMap.set(this, registeredInjectors);\n }\n if (registeredInjectors.indexOf(injectorItem) === -1) {\n this.own(invalidator.on('invalidate', () => {\n this.invalidate();\n }));\n registeredInjectors.push(injectorItem);\n }\n return getProperties(injector(), properties);\n }\n })(target);\n });\n}\nexport default inject;\n//# sourceMappingURL=inject.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/diff.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/diff.mjs", - "name": "./node_modules/@dojo/widget-core/diff.mjs", + "id": "./node_modules/@dojo/framework/widget-core/diff.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/diff.mjs", + "name": "./node_modules/@dojo/framework/widget-core/diff.mjs", "index": 20, "index2": 20, "size": 1930, @@ -4612,30 +4620,39 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./diff", "loc": "5:0-30" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../diff", "loc": "6:0-36" + }, + { + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "type": "harmony import", + "userRequest": "./../diff", + "loc": "2:0-33" } ], "usedExports": [ @@ -4654,12 +4671,12 @@ "source": "import { WIDGET_BASE_TYPE } from './Registry';\nfunction isObjectOrArray(value) {\n return Object.prototype.toString.call(value) === '[object Object]' || Array.isArray(value);\n}\nexport function always(previousProperty, newProperty) {\n return {\n changed: true,\n value: newProperty\n };\n}\nexport function ignore(previousProperty, newProperty) {\n return {\n changed: false,\n value: newProperty\n };\n}\nexport function reference(previousProperty, newProperty) {\n return {\n changed: previousProperty !== newProperty,\n value: newProperty\n };\n}\nexport function shallow(previousProperty, newProperty) {\n let changed = false;\n const validOldProperty = previousProperty && isObjectOrArray(previousProperty);\n const validNewProperty = newProperty && isObjectOrArray(newProperty);\n if (!validOldProperty || !validNewProperty) {\n return {\n changed: true,\n value: newProperty\n };\n }\n const previousKeys = Object.keys(previousProperty);\n const newKeys = Object.keys(newProperty);\n if (previousKeys.length !== newKeys.length) {\n changed = true;\n }\n else {\n changed = newKeys.some((key) => {\n return newProperty[key] !== previousProperty[key];\n });\n }\n return {\n changed,\n value: newProperty\n };\n}\nexport function auto(previousProperty, newProperty) {\n let result;\n if (typeof newProperty === 'function') {\n if (newProperty._type === WIDGET_BASE_TYPE) {\n result = reference(previousProperty, newProperty);\n }\n else {\n result = ignore(previousProperty, newProperty);\n }\n }\n else if (isObjectOrArray(newProperty)) {\n result = shallow(previousProperty, newProperty);\n }\n else {\n result = reference(previousProperty, newProperty);\n }\n return result;\n}\n//# sourceMappingURL=diff.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "name": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "id": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "name": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "index": 32, "index2": 30, - "size": 5852, + "size": 5683, "cacheable": true, "built": true, "optional": false, @@ -4668,18 +4685,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./mixins/Projector", "loc": "3:0-52" @@ -4696,15 +4713,15 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import * as tslib_1 from \"tslib\";\nimport { assign } from '@dojo/core/lang';\nimport cssTransitions from '../animations/cssTransitions';\nimport { afterRender } from './../decorators/afterRender';\nimport { v } from './../d';\nimport { dom } from './../vdom';\n/**\n * Represents the attach state of the projector\n */\nexport var ProjectorAttachState;\n(function (ProjectorAttachState) {\n ProjectorAttachState[ProjectorAttachState[\"Attached\"] = 1] = \"Attached\";\n ProjectorAttachState[ProjectorAttachState[\"Detached\"] = 2] = \"Detached\";\n})(ProjectorAttachState || (ProjectorAttachState = {}));\n/**\n * Attach type for the projector\n */\nexport var AttachType;\n(function (AttachType) {\n AttachType[AttachType[\"Append\"] = 1] = \"Append\";\n AttachType[AttachType[\"Merge\"] = 2] = \"Merge\";\n})(AttachType || (AttachType = {}));\nexport function ProjectorMixin(Base) {\n class Projector extends Base {\n constructor(...args) {\n super(...args);\n this._root = document.body;\n this._async = true;\n this._projectorProperties = {};\n this._projectionOptions = {\n transitions: cssTransitions\n };\n this.root = document.body;\n this.projectorState = ProjectorAttachState.Detached;\n }\n append(root) {\n const options = {\n type: AttachType.Append,\n root\n };\n return this._attach(options);\n }\n merge(root) {\n const options = {\n type: AttachType.Merge,\n root\n };\n return this._attach(options);\n }\n set root(root) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change root element');\n }\n this._root = root;\n }\n get root() {\n return this._root;\n }\n get async() {\n return this._async;\n }\n set async(async) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change async mode');\n }\n this._async = async;\n }\n sandbox(doc = document) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot create sandbox');\n }\n this._async = false;\n const previousRoot = this.root;\n /* free up the document fragment for GC */\n this.own({\n destroy: () => {\n this._root = previousRoot;\n }\n });\n this._attach({\n /* DocumentFragment is not assignable to Element, but provides everything needed to work */\n root: doc.createDocumentFragment(),\n type: AttachType.Append\n });\n }\n setChildren(children) {\n this.__setChildren__(children);\n }\n setProperties(properties) {\n this.__setProperties__(properties);\n }\n __setProperties__(properties) {\n if (this._projectorProperties && this._projectorProperties.registry !== properties.registry) {\n if (this._projectorProperties.registry) {\n this._projectorProperties.registry.destroy();\n }\n }\n this._projectorProperties = assign({}, properties);\n super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry });\n super.__setProperties__(properties);\n }\n toHtml() {\n if (this.projectorState !== ProjectorAttachState.Attached || !this._projection) {\n throw new Error('Projector is not attached, cannot return an HTML string of projection.');\n }\n return this._projection.domNode.childNodes[0].outerHTML;\n }\n afterRender(result) {\n let node = result;\n if (typeof result === 'string' || result === null || result === undefined) {\n node = v('span', {}, [result]);\n }\n return node;\n }\n destroy() {\n super.destroy();\n }\n _attach({ type, root }) {\n if (root) {\n this.root = root;\n }\n if (this._attachHandle) {\n return this._attachHandle;\n }\n this.projectorState = ProjectorAttachState.Attached;\n const handle = {\n destroy: () => {\n if (this.projectorState === ProjectorAttachState.Attached) {\n this._projection = undefined;\n this.projectorState = ProjectorAttachState.Detached;\n }\n }\n };\n this.own(handle);\n this._attachHandle = handle;\n this._projectionOptions = Object.assign({}, this._projectionOptions, { sync: !this._async });\n switch (type) {\n case AttachType.Append:\n this._projection = dom.append(this.root, this, this._projectionOptions);\n break;\n case AttachType.Merge:\n this._projection = dom.merge(this.root, this, this._projectionOptions);\n break;\n }\n return this._attachHandle;\n }\n }\n tslib_1.__decorate([\n afterRender(),\n tslib_1.__metadata(\"design:type\", Function),\n tslib_1.__metadata(\"design:paramtypes\", [Object]),\n tslib_1.__metadata(\"design:returntype\", void 0)\n ], Projector.prototype, \"afterRender\", null);\n return Projector;\n}\nexport default ProjectorMixin;\n//# sourceMappingURL=Projector.mjs.map" + "source": "import * as tslib_1 from \"tslib\";\nimport { assign } from '../../core/lang';\nimport cssTransitions from '../animations/cssTransitions';\nimport { afterRender } from './../decorators/afterRender';\nimport { v } from './../d';\nimport { dom } from './../vdom';\n/**\n * Represents the attach state of the projector\n */\nexport var ProjectorAttachState;\n(function (ProjectorAttachState) {\n ProjectorAttachState[ProjectorAttachState[\"Attached\"] = 1] = \"Attached\";\n ProjectorAttachState[ProjectorAttachState[\"Detached\"] = 2] = \"Detached\";\n})(ProjectorAttachState || (ProjectorAttachState = {}));\n/**\n * Attach type for the projector\n */\nexport var AttachType;\n(function (AttachType) {\n AttachType[AttachType[\"Append\"] = 1] = \"Append\";\n AttachType[AttachType[\"Merge\"] = 2] = \"Merge\";\n})(AttachType || (AttachType = {}));\nexport function ProjectorMixin(Base) {\n class Projector extends Base {\n constructor(...args) {\n super(...args);\n this._root = document.body;\n this._async = true;\n this._projectorProperties = {};\n this._projectionOptions = {\n transitions: cssTransitions\n };\n this.root = document.body;\n this.projectorState = ProjectorAttachState.Detached;\n }\n append(root) {\n const options = {\n type: AttachType.Append,\n root\n };\n return this._attach(options);\n }\n merge(root) {\n const options = {\n type: AttachType.Merge,\n root\n };\n return this._attach(options);\n }\n set root(root) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change root element');\n }\n this._root = root;\n }\n get root() {\n return this._root;\n }\n get async() {\n return this._async;\n }\n set async(async) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change async mode');\n }\n this._async = async;\n }\n sandbox(doc = document) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot create sandbox');\n }\n this._async = false;\n const previousRoot = this.root;\n /* free up the document fragment for GC */\n this.own({\n destroy: () => {\n this._root = previousRoot;\n }\n });\n this._attach({\n /* DocumentFragment is not assignable to Element, but provides everything needed to work */\n root: doc.createDocumentFragment(),\n type: AttachType.Append\n });\n }\n setChildren(children) {\n this.__setChildren__(children);\n }\n setProperties(properties) {\n this.__setProperties__(properties);\n }\n __setProperties__(properties) {\n if (this._projectorProperties && this._projectorProperties.registry !== properties.registry) {\n if (this._projectorProperties.registry) {\n this._projectorProperties.registry.destroy();\n }\n }\n this._projectorProperties = assign({}, properties);\n super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry });\n super.__setProperties__(properties);\n }\n toHtml() {\n if (this.projectorState !== ProjectorAttachState.Attached || !this._projection) {\n throw new Error('Projector is not attached, cannot return an HTML string of projection.');\n }\n return this._projection.domNode.childNodes[0].outerHTML;\n }\n afterRender(result) {\n let node = result;\n if (typeof result === 'string' || result === null || result === undefined) {\n node = v('span', {}, [result]);\n }\n return node;\n }\n destroy() {\n super.destroy();\n }\n _attach({ type, root }) {\n if (root) {\n this.root = root;\n }\n if (this._attachHandle) {\n return this._attachHandle;\n }\n this.projectorState = ProjectorAttachState.Attached;\n const handle = {\n destroy: () => {\n if (this.projectorState === ProjectorAttachState.Attached) {\n this._projection = undefined;\n this.projectorState = ProjectorAttachState.Detached;\n }\n }\n };\n this.own(handle);\n this._attachHandle = handle;\n this._projectionOptions = Object.assign({}, this._projectionOptions, { sync: !this._async });\n switch (type) {\n case AttachType.Append:\n this._projection = dom.append(this.root, this, this._projectionOptions);\n break;\n case AttachType.Merge:\n this._projection = dom.merge(this.root, this, this._projectionOptions);\n break;\n }\n return this._attachHandle;\n }\n }\n tslib_1.__decorate([\n afterRender()\n ], Projector.prototype, \"afterRender\", null);\n return Projector;\n}\nexport default ProjectorMixin;\n//# sourceMappingURL=Projector.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "name": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "id": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "name": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "index": 36, "index2": 35, - "size": 5320, + "size": 5157, "cacheable": true, "built": true, "optional": false, @@ -4713,18 +4730,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./mixins/Themed", "loc": "7:0-56" @@ -4735,8 +4752,8 @@ "module": "./src/menu/Menu.ts", "moduleName": "./src/menu/Menu.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/mixins/Themed", - "loc": "4:0-69" + "userRequest": "@dojo/framework/widget-core/mixins/Themed", + "loc": "4:0-79" } ], "usedExports": [ @@ -4753,15 +4770,15 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import * as tslib_1 from \"tslib\";\nimport { Injector } from './../Injector';\nimport { inject } from './../decorators/inject';\nimport { handleDecorator } from './../decorators/handleDecorator';\nimport { diffProperty } from './../decorators/diffProperty';\nimport { shallow } from './../diff';\nconst THEME_KEY = ' _key';\nexport const INJECTED_THEME_KEY = Symbol('theme');\n/**\n * Decorator for base css classes\n */\nexport function theme(theme) {\n return handleDecorator((target) => {\n target.addDecorator('baseThemeClasses', theme);\n });\n}\n/**\n * Creates a reverse lookup for the classes passed in via the `theme` function.\n *\n * @param classes The baseClasses object\n * @requires\n */\nfunction createThemeClassesLookup(classes) {\n return classes.reduce((currentClassNames, baseClass) => {\n Object.keys(baseClass).forEach((key) => {\n currentClassNames[baseClass[key]] = key;\n });\n return currentClassNames;\n }, {});\n}\n/**\n * Convenience function that is given a theme and an optional registry, the theme\n * injector is defined against the registry, returning the theme.\n *\n * @param theme the theme to set\n * @param themeRegistry registry to define the theme injector against. Defaults\n * to the global registry\n *\n * @returns the theme injector used to set the theme\n */\nexport function registerThemeInjector(theme, themeRegistry) {\n const themeInjector = new Injector(theme);\n themeRegistry.defineInjector(INJECTED_THEME_KEY, (invalidator) => {\n themeInjector.setInvalidator(invalidator);\n return () => themeInjector.get();\n });\n return themeInjector;\n}\n/**\n * Function that returns a class decorated with with Themed functionality\n */\nexport function ThemedMixin(Base) {\n let Themed = class Themed extends Base {\n constructor() {\n super(...arguments);\n /**\n * Registered base theme keys\n */\n this._registeredBaseThemeKeys = [];\n /**\n * Indicates if classes meta data need to be calculated.\n */\n this._recalculateClasses = true;\n /**\n * Loaded theme\n */\n this._theme = {};\n }\n theme(classes) {\n if (this._recalculateClasses) {\n this._recalculateThemeClasses();\n }\n if (Array.isArray(classes)) {\n return classes.map((className) => this._getThemeClass(className));\n }\n return this._getThemeClass(classes);\n }\n /**\n * Function fired when `theme` or `extraClasses` are changed.\n */\n onPropertiesChanged() {\n this._recalculateClasses = true;\n }\n _getThemeClass(className) {\n if (className === undefined || className === null) {\n return className;\n }\n const extraClasses = this.properties.extraClasses || {};\n const themeClassName = this._baseThemeClassesReverseLookup[className];\n let resultClassNames = [];\n if (!themeClassName) {\n console.warn(`Class name: '${className}' not found in theme`);\n return null;\n }\n if (extraClasses[themeClassName]) {\n resultClassNames.push(extraClasses[themeClassName]);\n }\n if (this._theme[themeClassName]) {\n resultClassNames.push(this._theme[themeClassName]);\n }\n else {\n resultClassNames.push(this._registeredBaseTheme[themeClassName]);\n }\n return resultClassNames.join(' ');\n }\n _recalculateThemeClasses() {\n const { theme = {} } = this.properties;\n const baseThemes = this.getDecorator('baseThemeClasses');\n if (!this._registeredBaseTheme) {\n this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => {\n const _a = THEME_KEY, key = baseTheme[_a], classes = tslib_1.__rest(baseTheme, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n this._registeredBaseThemeKeys.push(key);\n return Object.assign({}, finalBaseTheme, classes);\n }, {});\n this._baseThemeClassesReverseLookup = createThemeClassesLookup(baseThemes);\n }\n this._theme = this._registeredBaseThemeKeys.reduce((baseTheme, themeKey) => {\n return Object.assign({}, baseTheme, theme[themeKey]);\n }, {});\n this._recalculateClasses = false;\n }\n };\n tslib_1.__decorate([\n diffProperty('theme', shallow),\n diffProperty('extraClasses', shallow),\n tslib_1.__metadata(\"design:type\", Function),\n tslib_1.__metadata(\"design:paramtypes\", []),\n tslib_1.__metadata(\"design:returntype\", void 0)\n ], Themed.prototype, \"onPropertiesChanged\", null);\n Themed = tslib_1.__decorate([\n inject({\n name: INJECTED_THEME_KEY,\n getProperties: (theme, properties) => {\n if (!properties.theme) {\n return { theme };\n }\n return {};\n }\n })\n ], Themed);\n return Themed;\n}\nexport default ThemedMixin;\n//# sourceMappingURL=Themed.mjs.map" + "source": "import * as tslib_1 from \"tslib\";\nimport { Injector } from './../Injector';\nimport { inject } from './../decorators/inject';\nimport { handleDecorator } from './../decorators/handleDecorator';\nimport { diffProperty } from './../decorators/diffProperty';\nimport { shallow } from './../diff';\nconst THEME_KEY = ' _key';\nexport const INJECTED_THEME_KEY = Symbol('theme');\n/**\n * Decorator for base css classes\n */\nexport function theme(theme) {\n return handleDecorator((target) => {\n target.addDecorator('baseThemeClasses', theme);\n });\n}\n/**\n * Creates a reverse lookup for the classes passed in via the `theme` function.\n *\n * @param classes The baseClasses object\n * @requires\n */\nfunction createThemeClassesLookup(classes) {\n return classes.reduce((currentClassNames, baseClass) => {\n Object.keys(baseClass).forEach((key) => {\n currentClassNames[baseClass[key]] = key;\n });\n return currentClassNames;\n }, {});\n}\n/**\n * Convenience function that is given a theme and an optional registry, the theme\n * injector is defined against the registry, returning the theme.\n *\n * @param theme the theme to set\n * @param themeRegistry registry to define the theme injector against. Defaults\n * to the global registry\n *\n * @returns the theme injector used to set the theme\n */\nexport function registerThemeInjector(theme, themeRegistry) {\n const themeInjector = new Injector(theme);\n themeRegistry.defineInjector(INJECTED_THEME_KEY, (invalidator) => {\n themeInjector.setInvalidator(invalidator);\n return () => themeInjector.get();\n });\n return themeInjector;\n}\n/**\n * Function that returns a class decorated with with Themed functionality\n */\nexport function ThemedMixin(Base) {\n let Themed = class Themed extends Base {\n constructor() {\n super(...arguments);\n /**\n * Registered base theme keys\n */\n this._registeredBaseThemeKeys = [];\n /**\n * Indicates if classes meta data need to be calculated.\n */\n this._recalculateClasses = true;\n /**\n * Loaded theme\n */\n this._theme = {};\n }\n theme(classes) {\n if (this._recalculateClasses) {\n this._recalculateThemeClasses();\n }\n if (Array.isArray(classes)) {\n return classes.map((className) => this._getThemeClass(className));\n }\n return this._getThemeClass(classes);\n }\n /**\n * Function fired when `theme` or `extraClasses` are changed.\n */\n onPropertiesChanged() {\n this._recalculateClasses = true;\n }\n _getThemeClass(className) {\n if (className === undefined || className === null) {\n return className;\n }\n const extraClasses = this.properties.extraClasses || {};\n const themeClassName = this._baseThemeClassesReverseLookup[className];\n let resultClassNames = [];\n if (!themeClassName) {\n console.warn(`Class name: '${className}' not found in theme`);\n return null;\n }\n if (extraClasses[themeClassName]) {\n resultClassNames.push(extraClasses[themeClassName]);\n }\n if (this._theme[themeClassName]) {\n resultClassNames.push(this._theme[themeClassName]);\n }\n else {\n resultClassNames.push(this._registeredBaseTheme[themeClassName]);\n }\n return resultClassNames.join(' ');\n }\n _recalculateThemeClasses() {\n const { theme = {} } = this.properties;\n const baseThemes = this.getDecorator('baseThemeClasses');\n if (!this._registeredBaseTheme) {\n this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => {\n const _a = THEME_KEY, key = baseTheme[_a], classes = tslib_1.__rest(baseTheme, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n this._registeredBaseThemeKeys.push(key);\n return Object.assign({}, finalBaseTheme, classes);\n }, {});\n this._baseThemeClassesReverseLookup = createThemeClassesLookup(baseThemes);\n }\n this._theme = this._registeredBaseThemeKeys.reduce((baseTheme, themeKey) => {\n return Object.assign({}, baseTheme, theme[themeKey]);\n }, {});\n this._recalculateClasses = false;\n }\n };\n tslib_1.__decorate([\n diffProperty('theme', shallow),\n diffProperty('extraClasses', shallow)\n ], Themed.prototype, \"onPropertiesChanged\", null);\n Themed = tslib_1.__decorate([\n inject({\n name: INJECTED_THEME_KEY,\n getProperties: (theme, properties) => {\n if (!properties.theme) {\n return { theme };\n }\n return {};\n }\n })\n ], Themed);\n return Themed;\n}\nexport default ThemedMixin;\n//# sourceMappingURL=Themed.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "name": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "id": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "name": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "index": 13, "index2": 37, - "size": 9124, + "size": 9118, "cacheable": true, "built": true, "optional": false, @@ -4783,14 +4800,14 @@ "module": "./node_modules/imports-loader?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js", "moduleName": "./node_modules/imports-loader?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js", "type": "cjs require", - "userRequest": "@dojo/widget-core/registerCustomElement", - "loc": "4:28-78" + "userRequest": "@dojo/framework/widget-core/registerCustomElement", + "loc": "4:28-88" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/decorators/customElement.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", "type": "harmony import", "userRequest": "../registerCustomElement", "loc": "1:0-66" @@ -4806,15 +4823,15 @@ ], "optimizationBailout": [], "depth": 2, - "source": "import * as tslib_1 from \"tslib\";\nimport { WidgetBase, noBind } from './WidgetBase';\nimport { ProjectorMixin } from './mixins/Projector';\nimport { from } from '@dojo/shim/array';\nimport { w, dom } from './d';\nimport global from '@dojo/shim/global';\nimport { registerThemeInjector } from './mixins/Themed';\nimport { alwaysRender } from './decorators/alwaysRender';\nexport var CustomElementChildType;\n(function (CustomElementChildType) {\n CustomElementChildType[\"DOJO\"] = \"DOJO\";\n CustomElementChildType[\"NODE\"] = \"NODE\";\n CustomElementChildType[\"TEXT\"] = \"TEXT\";\n})(CustomElementChildType || (CustomElementChildType = {}));\nexport function DomToWidgetWrapper(domNode) {\n let DomToWidgetWrapper = class DomToWidgetWrapper extends WidgetBase {\n render() {\n const properties = Object.keys(this.properties).reduce((props, key) => {\n const value = this.properties[key];\n if (key.indexOf('on') === 0) {\n key = `__${key}`;\n }\n props[key] = value;\n return props;\n }, {});\n return dom({ node: domNode, props: properties, diffType: 'dom' });\n }\n static get domNode() {\n return domNode;\n }\n };\n DomToWidgetWrapper = tslib_1.__decorate([\n alwaysRender()\n ], DomToWidgetWrapper);\n return DomToWidgetWrapper;\n}\nexport function create(descriptor, WidgetConstructor) {\n const { attributes, childType, registryFactory } = descriptor;\n const attributeMap = {};\n attributes.forEach((propertyName) => {\n const attributeName = propertyName.toLowerCase();\n attributeMap[attributeName] = propertyName;\n });\n return class extends HTMLElement {\n constructor() {\n super(...arguments);\n this._properties = {};\n this._children = [];\n this._eventProperties = {};\n this._initialised = false;\n }\n connectedCallback() {\n if (this._initialised) {\n return;\n }\n const domProperties = {};\n const { attributes, properties, events } = descriptor;\n this._properties = Object.assign({}, this._properties, this._attributesToProperties(attributes));\n [...attributes, ...properties].forEach((propertyName) => {\n const value = this[propertyName];\n const filteredPropertyName = propertyName.replace(/^on/, '__');\n if (value !== undefined) {\n this._properties[propertyName] = value;\n }\n if (filteredPropertyName !== propertyName) {\n domProperties[filteredPropertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n }\n domProperties[propertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n });\n events.forEach((propertyName) => {\n const eventName = propertyName.replace(/^on/, '').toLowerCase();\n const filteredPropertyName = propertyName.replace(/^on/, '__on');\n domProperties[filteredPropertyName] = {\n get: () => this._getEventProperty(propertyName),\n set: (value) => this._setEventProperty(propertyName, value)\n };\n this._eventProperties[propertyName] = undefined;\n this._properties[propertyName] = (...args) => {\n const eventCallback = this._getEventProperty(propertyName);\n if (typeof eventCallback === 'function') {\n eventCallback(...args);\n }\n this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: false,\n detail: args\n }));\n };\n });\n Object.defineProperties(this, domProperties);\n const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children;\n from(children).forEach((childNode) => {\n if (childType === CustomElementChildType.DOJO) {\n childNode.addEventListener('dojo-ce-render', () => this._render());\n childNode.addEventListener('dojo-ce-connected', () => this._render());\n this._children.push(DomToWidgetWrapper(childNode));\n }\n else {\n this._children.push(dom({ node: childNode, diffType: 'dom' }));\n }\n });\n this.addEventListener('dojo-ce-connected', (e) => this._childConnected(e));\n const widgetProperties = this._properties;\n const renderChildren = () => this.__children__();\n const Wrapper = class extends WidgetBase {\n render() {\n return w(WidgetConstructor, widgetProperties, renderChildren());\n }\n };\n const registry = registryFactory();\n const themeContext = registerThemeInjector(this._getTheme(), registry);\n global.addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme()));\n const Projector = ProjectorMixin(Wrapper);\n this._projector = new Projector();\n this._projector.setProperties({ registry });\n this._projector.append(this);\n this._initialised = true;\n this.dispatchEvent(new CustomEvent('dojo-ce-connected', {\n bubbles: true,\n detail: this\n }));\n }\n _getTheme() {\n if (global && global.dojoce && global.dojoce.theme) {\n return global.dojoce.themes[global.dojoce.theme];\n }\n }\n _childConnected(e) {\n const node = e.detail;\n if (node.parentNode === this) {\n const exists = this._children.some((child) => child.domNode === node);\n if (!exists) {\n node.addEventListener('dojo-ce-render', () => this._render());\n this._children.push(DomToWidgetWrapper(node));\n this._render();\n }\n }\n }\n _render() {\n if (this._projector) {\n this._projector.invalidate();\n this.dispatchEvent(new CustomEvent('dojo-ce-render', {\n bubbles: false,\n detail: this\n }));\n }\n }\n __properties__() {\n return Object.assign({}, this._properties, this._eventProperties);\n }\n __children__() {\n if (childType === CustomElementChildType.DOJO) {\n return this._children.filter((Child) => Child.domNode.isWidget).map((Child) => {\n const { domNode } = Child;\n return w(Child, Object.assign({}, domNode.__properties__()), [...domNode.__children__()]);\n });\n }\n else {\n return this._children;\n }\n }\n attributeChangedCallback(name, oldValue, value) {\n const propertyName = attributeMap[name];\n this._setProperty(propertyName, value);\n }\n _setEventProperty(propertyName, value) {\n this._eventProperties[propertyName] = value;\n }\n _getEventProperty(propertyName) {\n return this._eventProperties[propertyName];\n }\n _setProperty(propertyName, value) {\n if (typeof value === 'function') {\n value[noBind] = true;\n }\n this._properties[propertyName] = value;\n this._render();\n }\n _getProperty(propertyName) {\n return this._properties[propertyName];\n }\n _attributesToProperties(attributes) {\n return attributes.reduce((properties, propertyName) => {\n const attributeName = propertyName.toLowerCase();\n const value = this.getAttribute(attributeName);\n if (value !== null) {\n properties[propertyName] = value;\n }\n return properties;\n }, {});\n }\n static get observedAttributes() {\n return Object.keys(attributeMap);\n }\n get isWidget() {\n return true;\n }\n };\n}\nexport function register(WidgetConstructor) {\n const descriptor = WidgetConstructor.prototype && WidgetConstructor.prototype.__customElementDescriptor;\n if (!descriptor) {\n throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?');\n }\n global.customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor));\n}\nexport default register;\n//# sourceMappingURL=registerCustomElement.mjs.map" + "source": "import * as tslib_1 from \"tslib\";\nimport { WidgetBase, noBind } from './WidgetBase';\nimport { ProjectorMixin } from './mixins/Projector';\nimport { from } from '../shim/array';\nimport { w, dom } from './d';\nimport global from '../shim/global';\nimport { registerThemeInjector } from './mixins/Themed';\nimport { alwaysRender } from './decorators/alwaysRender';\nexport var CustomElementChildType;\n(function (CustomElementChildType) {\n CustomElementChildType[\"DOJO\"] = \"DOJO\";\n CustomElementChildType[\"NODE\"] = \"NODE\";\n CustomElementChildType[\"TEXT\"] = \"TEXT\";\n})(CustomElementChildType || (CustomElementChildType = {}));\nexport function DomToWidgetWrapper(domNode) {\n let DomToWidgetWrapper = class DomToWidgetWrapper extends WidgetBase {\n render() {\n const properties = Object.keys(this.properties).reduce((props, key) => {\n const value = this.properties[key];\n if (key.indexOf('on') === 0) {\n key = `__${key}`;\n }\n props[key] = value;\n return props;\n }, {});\n return dom({ node: domNode, props: properties, diffType: 'dom' });\n }\n static get domNode() {\n return domNode;\n }\n };\n DomToWidgetWrapper = tslib_1.__decorate([\n alwaysRender()\n ], DomToWidgetWrapper);\n return DomToWidgetWrapper;\n}\nexport function create(descriptor, WidgetConstructor) {\n const { attributes, childType, registryFactory } = descriptor;\n const attributeMap = {};\n attributes.forEach((propertyName) => {\n const attributeName = propertyName.toLowerCase();\n attributeMap[attributeName] = propertyName;\n });\n return class extends HTMLElement {\n constructor() {\n super(...arguments);\n this._properties = {};\n this._children = [];\n this._eventProperties = {};\n this._initialised = false;\n }\n connectedCallback() {\n if (this._initialised) {\n return;\n }\n const domProperties = {};\n const { attributes, properties, events } = descriptor;\n this._properties = Object.assign({}, this._properties, this._attributesToProperties(attributes));\n [...attributes, ...properties].forEach((propertyName) => {\n const value = this[propertyName];\n const filteredPropertyName = propertyName.replace(/^on/, '__');\n if (value !== undefined) {\n this._properties[propertyName] = value;\n }\n if (filteredPropertyName !== propertyName) {\n domProperties[filteredPropertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n }\n domProperties[propertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n });\n events.forEach((propertyName) => {\n const eventName = propertyName.replace(/^on/, '').toLowerCase();\n const filteredPropertyName = propertyName.replace(/^on/, '__on');\n domProperties[filteredPropertyName] = {\n get: () => this._getEventProperty(propertyName),\n set: (value) => this._setEventProperty(propertyName, value)\n };\n this._eventProperties[propertyName] = undefined;\n this._properties[propertyName] = (...args) => {\n const eventCallback = this._getEventProperty(propertyName);\n if (typeof eventCallback === 'function') {\n eventCallback(...args);\n }\n this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: false,\n detail: args\n }));\n };\n });\n Object.defineProperties(this, domProperties);\n const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children;\n from(children).forEach((childNode) => {\n if (childType === CustomElementChildType.DOJO) {\n childNode.addEventListener('dojo-ce-render', () => this._render());\n childNode.addEventListener('dojo-ce-connected', () => this._render());\n this._children.push(DomToWidgetWrapper(childNode));\n }\n else {\n this._children.push(dom({ node: childNode, diffType: 'dom' }));\n }\n });\n this.addEventListener('dojo-ce-connected', (e) => this._childConnected(e));\n const widgetProperties = this._properties;\n const renderChildren = () => this.__children__();\n const Wrapper = class extends WidgetBase {\n render() {\n return w(WidgetConstructor, widgetProperties, renderChildren());\n }\n };\n const registry = registryFactory();\n const themeContext = registerThemeInjector(this._getTheme(), registry);\n global.addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme()));\n const Projector = ProjectorMixin(Wrapper);\n this._projector = new Projector();\n this._projector.setProperties({ registry });\n this._projector.append(this);\n this._initialised = true;\n this.dispatchEvent(new CustomEvent('dojo-ce-connected', {\n bubbles: true,\n detail: this\n }));\n }\n _getTheme() {\n if (global && global.dojoce && global.dojoce.theme) {\n return global.dojoce.themes[global.dojoce.theme];\n }\n }\n _childConnected(e) {\n const node = e.detail;\n if (node.parentNode === this) {\n const exists = this._children.some((child) => child.domNode === node);\n if (!exists) {\n node.addEventListener('dojo-ce-render', () => this._render());\n this._children.push(DomToWidgetWrapper(node));\n this._render();\n }\n }\n }\n _render() {\n if (this._projector) {\n this._projector.invalidate();\n this.dispatchEvent(new CustomEvent('dojo-ce-render', {\n bubbles: false,\n detail: this\n }));\n }\n }\n __properties__() {\n return Object.assign({}, this._properties, this._eventProperties);\n }\n __children__() {\n if (childType === CustomElementChildType.DOJO) {\n return this._children.filter((Child) => Child.domNode.isWidget).map((Child) => {\n const { domNode } = Child;\n return w(Child, Object.assign({}, domNode.__properties__()), [...domNode.__children__()]);\n });\n }\n else {\n return this._children;\n }\n }\n attributeChangedCallback(name, oldValue, value) {\n const propertyName = attributeMap[name];\n this._setProperty(propertyName, value);\n }\n _setEventProperty(propertyName, value) {\n this._eventProperties[propertyName] = value;\n }\n _getEventProperty(propertyName) {\n return this._eventProperties[propertyName];\n }\n _setProperty(propertyName, value) {\n if (typeof value === 'function') {\n value[noBind] = true;\n }\n this._properties[propertyName] = value;\n this._render();\n }\n _getProperty(propertyName) {\n return this._properties[propertyName];\n }\n _attributesToProperties(attributes) {\n return attributes.reduce((properties, propertyName) => {\n const attributeName = propertyName.toLowerCase();\n const value = this.getAttribute(attributeName);\n if (value !== null) {\n properties[propertyName] = value;\n }\n return properties;\n }, {});\n }\n static get observedAttributes() {\n return Object.keys(attributeMap);\n }\n get isWidget() {\n return true;\n }\n };\n}\nexport function register(WidgetConstructor) {\n const descriptor = WidgetConstructor.prototype && WidgetConstructor.prototype.__customElementDescriptor;\n if (!descriptor) {\n throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?');\n }\n global.customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor));\n}\nexport default register;\n//# sourceMappingURL=registerCustomElement.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/vdom.mjs", - "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/vdom.mjs", - "name": "./node_modules/@dojo/widget-core/vdom.mjs", + "id": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "identifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/vdom.mjs", + "name": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "index": 29, "index2": 25, - "size": 38814, + "size": 39966, "cacheable": true, "built": true, "optional": false, @@ -4823,27 +4840,27 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./vdom", "loc": "8:0-43" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "./../vdom", "loc": "6:0-32" @@ -4862,7 +4879,7 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import global from '@dojo/shim/global';\nimport { from as arrayFrom } from '@dojo/shim/array';\nimport { isWNode, isVNode, isDomVNode, VNODE, WNODE } from './d';\nimport { isWidgetBaseConstructor } from './Registry';\nimport WeakMap from '@dojo/shim/WeakMap';\nconst NAMESPACE_W3 = 'http://www.w3.org/';\nconst NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg';\nconst NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink';\nconst emptyArray = [];\nexport const widgetInstanceMap = new WeakMap();\nconst instanceMap = new WeakMap();\nconst projectorStateMap = new WeakMap();\nfunction same(dnode1, dnode2) {\n if (isVNode(dnode1) && isVNode(dnode2)) {\n if (isDomVNode(dnode1) || isDomVNode(dnode2)) {\n if (dnode1.domNode !== dnode2.domNode) {\n return false;\n }\n }\n if (dnode1.tag !== dnode2.tag) {\n return false;\n }\n if (dnode1.properties.key !== dnode2.properties.key) {\n return false;\n }\n return true;\n }\n else if (isWNode(dnode1) && isWNode(dnode2)) {\n if (dnode1.instance === undefined && typeof dnode2.widgetConstructor === 'string') {\n return false;\n }\n if (dnode1.widgetConstructor !== dnode2.widgetConstructor) {\n return false;\n }\n if (dnode1.properties.key !== dnode2.properties.key) {\n return false;\n }\n return true;\n }\n return false;\n}\nconst missingTransition = function () {\n throw new Error('Provide a transitions object to the projectionOptions to do animations');\n};\nfunction getProjectionOptions(projectorOptions, projectorInstance) {\n const defaults = {\n namespace: undefined,\n styleApplyer: function (domNode, styleName, value) {\n domNode.style[styleName] = value;\n },\n transitions: {\n enter: missingTransition,\n exit: missingTransition\n },\n depth: 0,\n merge: false,\n sync: false,\n projectorInstance\n };\n return Object.assign({}, defaults, projectorOptions);\n}\nfunction checkStyleValue(styleValue) {\n if (typeof styleValue !== 'string') {\n throw new Error('Style values must be strings');\n }\n}\nfunction updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n const eventMap = projectorState.nodeMap.get(domNode) || new WeakMap();\n if (previousValue) {\n const previousEvent = eventMap.get(previousValue);\n domNode.removeEventListener(eventName, previousEvent);\n }\n let callback = currentValue.bind(bind);\n if (eventName === 'input') {\n callback = function (evt) {\n currentValue.call(this, evt);\n evt.target['oninput-value'] = evt.target.value;\n }.bind(bind);\n }\n domNode.addEventListener(eventName, callback);\n eventMap.set(currentValue, callback);\n projectorState.nodeMap.set(domNode, eventMap);\n}\nfunction addClasses(domNode, classes) {\n if (classes) {\n const classNames = classes.split(' ');\n for (let i = 0; i < classNames.length; i++) {\n domNode.classList.add(classNames[i]);\n }\n }\n}\nfunction removeClasses(domNode, classes) {\n if (classes) {\n const classNames = classes.split(' ');\n for (let i = 0; i < classNames.length; i++) {\n domNode.classList.remove(classNames[i]);\n }\n }\n}\nfunction buildPreviousProperties(domNode, previous, current) {\n const { diffType, properties, attributes } = current;\n if (!diffType || diffType === 'vdom') {\n return { properties: previous.properties, attributes: previous.attributes, events: previous.events };\n }\n else if (diffType === 'none') {\n return { properties: {}, attributes: previous.attributes ? {} : undefined, events: previous.events };\n }\n let newProperties = {\n properties: {}\n };\n if (attributes) {\n newProperties.attributes = {};\n newProperties.events = previous.events;\n Object.keys(properties).forEach((propName) => {\n newProperties.properties[propName] = domNode[propName];\n });\n Object.keys(attributes).forEach((attrName) => {\n newProperties.attributes[attrName] = domNode.getAttribute(attrName);\n });\n return newProperties;\n }\n newProperties.properties = Object.keys(properties).reduce((props, property) => {\n props[property] = domNode.getAttribute(property) || domNode[property];\n return props;\n }, {});\n return newProperties;\n}\nfunction focusNode(propValue, previousValue, domNode, projectionOptions) {\n let result;\n if (typeof propValue === 'function') {\n result = propValue();\n }\n else {\n result = propValue && !previousValue;\n }\n if (result === true) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectorState.deferredRenderCallbacks.push(() => {\n domNode.focus();\n });\n }\n}\nfunction removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions, onlyEvents = false) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n const eventMap = projectorState.nodeMap.get(domNode);\n if (eventMap) {\n Object.keys(previousProperties).forEach((propName) => {\n const isEvent = propName.substr(0, 2) === 'on' || onlyEvents;\n const eventName = onlyEvents ? propName : propName.substr(2);\n if (isEvent && !properties[propName]) {\n const eventCallback = eventMap.get(previousProperties[propName]);\n if (eventCallback) {\n domNode.removeEventListener(eventName, eventCallback);\n }\n }\n });\n }\n}\nfunction updateAttribute(domNode, attrName, attrValue, projectionOptions) {\n if (projectionOptions.namespace === NAMESPACE_SVG && attrName === 'href') {\n domNode.setAttributeNS(NAMESPACE_XLINK, attrName, attrValue);\n }\n else if ((attrName === 'role' && attrValue === '') || attrValue === undefined) {\n domNode.removeAttribute(attrName);\n }\n else {\n domNode.setAttribute(attrName, attrValue);\n }\n}\nfunction updateAttributes(domNode, previousAttributes, attributes, projectionOptions) {\n const attrNames = Object.keys(attributes);\n const attrCount = attrNames.length;\n for (let i = 0; i < attrCount; i++) {\n const attrName = attrNames[i];\n const attrValue = attributes[attrName];\n const previousAttrValue = previousAttributes[attrName];\n if (attrValue !== previousAttrValue) {\n updateAttribute(domNode, attrName, attrValue, projectionOptions);\n }\n }\n}\nfunction updateProperties(domNode, previousProperties, properties, projectionOptions, includesEventsAndAttributes = true) {\n let propertiesUpdated = false;\n const propNames = Object.keys(properties);\n const propCount = propNames.length;\n if (propNames.indexOf('classes') === -1 && previousProperties.classes) {\n if (Array.isArray(previousProperties.classes)) {\n for (let i = 0; i < previousProperties.classes.length; i++) {\n removeClasses(domNode, previousProperties.classes[i]);\n }\n }\n else {\n removeClasses(domNode, previousProperties.classes);\n }\n }\n includesEventsAndAttributes && removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions);\n for (let i = 0; i < propCount; i++) {\n const propName = propNames[i];\n let propValue = properties[propName];\n const previousValue = previousProperties[propName];\n if (propName === 'classes') {\n const previousClasses = Array.isArray(previousValue) ? previousValue : [previousValue];\n const currentClasses = Array.isArray(propValue) ? propValue : [propValue];\n if (previousClasses && previousClasses.length > 0) {\n if (!propValue || propValue.length === 0) {\n for (let i = 0; i < previousClasses.length; i++) {\n removeClasses(domNode, previousClasses[i]);\n }\n }\n else {\n const newClasses = [...currentClasses];\n for (let i = 0; i < previousClasses.length; i++) {\n const previousClassName = previousClasses[i];\n if (previousClassName) {\n const classIndex = newClasses.indexOf(previousClassName);\n if (classIndex === -1) {\n removeClasses(domNode, previousClassName);\n }\n else {\n newClasses.splice(classIndex, 1);\n }\n }\n }\n for (let i = 0; i < newClasses.length; i++) {\n addClasses(domNode, newClasses[i]);\n }\n }\n }\n else {\n for (let i = 0; i < currentClasses.length; i++) {\n addClasses(domNode, currentClasses[i]);\n }\n }\n }\n else if (propName === 'focus') {\n focusNode(propValue, previousValue, domNode, projectionOptions);\n }\n else if (propName === 'styles') {\n const styleNames = Object.keys(propValue);\n const styleCount = styleNames.length;\n for (let j = 0; j < styleCount; j++) {\n const styleName = styleNames[j];\n const newStyleValue = propValue[styleName];\n const oldStyleValue = previousValue && previousValue[styleName];\n if (newStyleValue === oldStyleValue) {\n continue;\n }\n propertiesUpdated = true;\n if (newStyleValue) {\n checkStyleValue(newStyleValue);\n projectionOptions.styleApplyer(domNode, styleName, newStyleValue);\n }\n else {\n projectionOptions.styleApplyer(domNode, styleName, '');\n }\n }\n }\n else {\n if (!propValue && typeof previousValue === 'string') {\n propValue = '';\n }\n if (propName === 'value') {\n const domValue = domNode[propName];\n if (domValue !== propValue &&\n (domNode['oninput-value']\n ? domValue === domNode['oninput-value']\n : propValue !== previousValue)) {\n domNode[propName] = propValue;\n domNode['oninput-value'] = undefined;\n }\n if (propValue !== previousValue) {\n propertiesUpdated = true;\n }\n }\n else if (propName !== 'key' && propValue !== previousValue) {\n const type = typeof propValue;\n if (type === 'function' && propName.lastIndexOf('on', 0) === 0 && includesEventsAndAttributes) {\n updateEvent(domNode, propName.substr(2), propValue, projectionOptions, properties.bind, previousValue);\n }\n else if (type === 'string' && propName !== 'innerHTML' && includesEventsAndAttributes) {\n updateAttribute(domNode, propName, propValue, projectionOptions);\n }\n else if (propName === 'scrollLeft' || propName === 'scrollTop') {\n if (domNode[propName] !== propValue) {\n domNode[propName] = propValue;\n }\n }\n else {\n domNode[propName] = propValue;\n }\n propertiesUpdated = true;\n }\n }\n }\n return propertiesUpdated;\n}\nfunction findIndexOfChild(children, sameAs, start) {\n for (let i = start; i < children.length; i++) {\n if (same(children[i], sameAs)) {\n return i;\n }\n }\n return -1;\n}\nexport function toParentVNode(domNode) {\n return {\n tag: '',\n properties: {},\n children: undefined,\n domNode,\n type: VNODE\n };\n}\nexport function toTextVNode(data) {\n return {\n tag: '',\n properties: {},\n children: undefined,\n text: `${data}`,\n domNode: undefined,\n type: VNODE\n };\n}\nfunction toInternalWNode(instance, instanceData) {\n return {\n instance,\n rendered: [],\n coreProperties: instanceData.coreProperties,\n children: instance.children,\n widgetConstructor: instance.constructor,\n properties: instanceData.inputProperties,\n type: WNODE\n };\n}\nexport function filterAndDecorateChildren(children, instance) {\n if (children === undefined) {\n return emptyArray;\n }\n children = Array.isArray(children) ? children : [children];\n for (let i = 0; i < children.length;) {\n const child = children[i];\n if (child === undefined || child === null) {\n children.splice(i, 1);\n continue;\n }\n else if (typeof child === 'string') {\n children[i] = toTextVNode(child);\n }\n else {\n if (isVNode(child)) {\n if (child.properties.bind === undefined) {\n child.properties.bind = instance;\n if (child.children && child.children.length > 0) {\n filterAndDecorateChildren(child.children, instance);\n }\n }\n }\n else {\n if (!child.coreProperties) {\n const instanceData = widgetInstanceMap.get(instance);\n child.coreProperties = {\n bind: instance,\n baseRegistry: instanceData.coreProperties.baseRegistry\n };\n }\n if (child.children && child.children.length > 0) {\n filterAndDecorateChildren(child.children, instance);\n }\n }\n }\n i++;\n }\n return children;\n}\nfunction nodeAdded(dnode, transitions) {\n if (isVNode(dnode) && dnode.properties) {\n const enterAnimation = dnode.properties.enterAnimation;\n if (enterAnimation) {\n if (typeof enterAnimation === 'function') {\n enterAnimation(dnode.domNode, dnode.properties);\n }\n else {\n transitions.enter(dnode.domNode, dnode.properties, enterAnimation);\n }\n }\n }\n}\nfunction nodeToRemove(dnode, transitions, projectionOptions) {\n if (isWNode(dnode)) {\n const rendered = dnode.rendered || emptyArray;\n if (dnode.instance) {\n const instanceData = widgetInstanceMap.get(dnode.instance);\n instanceData.onDetach();\n instanceMap.delete(dnode.instance);\n }\n for (let i = 0; i < rendered.length; i++) {\n nodeToRemove(rendered[i], transitions, projectionOptions);\n }\n }\n else {\n const domNode = dnode.domNode;\n const properties = dnode.properties;\n if (dnode.children && dnode.children.length > 0) {\n for (let i = 0; i < dnode.children.length; i++) {\n nodeToRemove(dnode.children[i], transitions, projectionOptions);\n }\n }\n const exitAnimation = properties.exitAnimation;\n if (properties && exitAnimation) {\n domNode.style.pointerEvents = 'none';\n const removeDomNode = function () {\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\n dnode.domNode = undefined;\n };\n if (typeof exitAnimation === 'function') {\n exitAnimation(domNode, removeDomNode, properties);\n return;\n }\n else {\n transitions.exit(dnode.domNode, properties, exitAnimation, removeDomNode);\n return;\n }\n }\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\n dnode.domNode = undefined;\n }\n}\nfunction checkDistinguishable(childNodes, indexToCheck, parentInstance) {\n const childNode = childNodes[indexToCheck];\n if (isVNode(childNode) && !childNode.tag) {\n return; // Text nodes need not be distinguishable\n }\n const { key } = childNode.properties;\n if (key === undefined || key === null) {\n for (let i = 0; i < childNodes.length; i++) {\n if (i !== indexToCheck) {\n const node = childNodes[i];\n if (same(node, childNode)) {\n let nodeIdentifier;\n const parentName = parentInstance.constructor.name || 'unknown';\n if (isWNode(childNode)) {\n nodeIdentifier = childNode.widgetConstructor.name || 'unknown';\n }\n else {\n nodeIdentifier = childNode.tag;\n }\n console.warn(`A widget (${parentName}) has had a child addded or removed, but they were not able to uniquely identified. It is recommended to provide a unique 'key' property when using the same widget or element (${nodeIdentifier}) multiple times as siblings`);\n break;\n }\n }\n }\n }\n}\nfunction updateChildren(parentVNode, oldChildren, newChildren, parentInstance, projectionOptions) {\n oldChildren = oldChildren || emptyArray;\n newChildren = newChildren;\n const oldChildrenLength = oldChildren.length;\n const newChildrenLength = newChildren.length;\n const transitions = projectionOptions.transitions;\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\n let oldIndex = 0;\n let newIndex = 0;\n let i;\n let textUpdated = false;\n while (newIndex < newChildrenLength) {\n let oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : undefined;\n const newChild = newChildren[newIndex];\n if (isVNode(newChild) && typeof newChild.deferredPropertiesCallback === 'function') {\n newChild.inserted = isVNode(oldChild) && oldChild.inserted;\n addDeferredProperties(newChild, projectionOptions);\n }\n if (oldChild !== undefined && same(oldChild, newChild)) {\n textUpdated = updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance) || textUpdated;\n oldIndex++;\n newIndex++;\n continue;\n }\n const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);\n const addChild = () => {\n let insertBeforeDomNode = undefined;\n let child = oldChildren[oldIndex];\n if (child) {\n let nextIndex = oldIndex + 1;\n let insertBeforeChildren = [child];\n while (insertBeforeChildren.length) {\n const insertBefore = insertBeforeChildren.shift();\n if (isWNode(insertBefore)) {\n if (insertBefore.rendered) {\n insertBeforeChildren.push(...insertBefore.rendered);\n }\n }\n else {\n if (insertBefore.domNode) {\n insertBeforeDomNode = insertBefore.domNode;\n break;\n }\n }\n if (insertBeforeChildren.length === 0 && oldChildren[nextIndex]) {\n insertBeforeChildren.push(oldChildren[nextIndex]);\n nextIndex++;\n }\n }\n }\n createDom(newChild, parentVNode, insertBeforeDomNode, projectionOptions, parentInstance);\n nodeAdded(newChild, transitions);\n const indexToCheck = newIndex;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(newChildren, indexToCheck, parentInstance);\n });\n };\n if (!oldChild || findOldIndex === -1) {\n addChild();\n newIndex++;\n continue;\n }\n const removeChild = () => {\n const indexToCheck = oldIndex;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\n });\n if (isWNode(oldChild)) {\n const item = instanceMap.get(oldChild.instance);\n if (item) {\n oldChild = item.dnode;\n }\n }\n nodeToRemove(oldChild, transitions, projectionOptions);\n };\n const findNewIndex = findIndexOfChild(newChildren, oldChild, newIndex + 1);\n if (findNewIndex === -1) {\n removeChild();\n oldIndex++;\n continue;\n }\n addChild();\n removeChild();\n oldIndex++;\n newIndex++;\n }\n if (oldChildrenLength > oldIndex) {\n // Remove child fragments\n for (i = oldIndex; i < oldChildrenLength; i++) {\n const indexToCheck = i;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\n });\n let childToRemove = oldChildren[i];\n if (isWNode(childToRemove)) {\n const item = instanceMap.get(childToRemove.instance);\n if (item) {\n childToRemove = item.dnode;\n }\n }\n nodeToRemove(childToRemove, transitions, projectionOptions);\n }\n }\n return textUpdated;\n}\nfunction addChildren(parentVNode, children, projectionOptions, parentInstance, insertBefore = undefined, childNodes) {\n if (children === undefined) {\n return;\n }\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectorState.merge && childNodes === undefined) {\n childNodes = arrayFrom(parentVNode.domNode.childNodes);\n }\n const transitions = projectionOptions.transitions;\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n if (isVNode(child)) {\n if (projectorState.merge && childNodes) {\n let domElement = undefined;\n while (child.domNode === undefined && childNodes.length > 0) {\n domElement = childNodes.shift();\n if (domElement && domElement.tagName === (child.tag.toUpperCase() || undefined)) {\n child.domNode = domElement;\n }\n }\n }\n createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance);\n }\n else {\n createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes);\n }\n nodeAdded(child, transitions);\n }\n}\nfunction initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions) {\n addChildren(dnode, dnode.children, projectionOptions, parentInstance, undefined);\n if (typeof dnode.deferredPropertiesCallback === 'function' && dnode.inserted === undefined) {\n addDeferredProperties(dnode, projectionOptions);\n }\n if (dnode.attributes && dnode.events) {\n updateAttributes(domNode, {}, dnode.attributes, projectionOptions);\n updateProperties(domNode, {}, dnode.properties, projectionOptions, false);\n removeOrphanedEvents(domNode, {}, dnode.events, projectionOptions, true);\n const events = dnode.events;\n Object.keys(events).forEach((event) => {\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind);\n });\n }\n else {\n updateProperties(domNode, {}, dnode.properties, projectionOptions);\n }\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\n const instanceData = widgetInstanceMap.get(parentInstance);\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\n }\n dnode.inserted = true;\n}\nfunction createDom(dnode, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes) {\n let domNode;\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (isWNode(dnode)) {\n let { widgetConstructor } = dnode;\n const parentInstanceData = widgetInstanceMap.get(parentInstance);\n if (!isWidgetBaseConstructor(widgetConstructor)) {\n const item = parentInstanceData.registry().get(widgetConstructor);\n if (item === null) {\n return;\n }\n widgetConstructor = item;\n }\n const instance = new widgetConstructor();\n dnode.instance = instance;\n const instanceData = widgetInstanceMap.get(instance);\n instanceData.invalidate = () => {\n instanceData.dirty = true;\n if (instanceData.rendering === false) {\n projectorState.renderQueue.push({ instance, depth: projectionOptions.depth });\n scheduleRender(projectionOptions);\n }\n };\n instanceData.rendering = true;\n instance.__setCoreProperties__(dnode.coreProperties);\n instance.__setChildren__(dnode.children);\n instance.__setProperties__(dnode.properties);\n const rendered = instance.__render__();\n instanceData.rendering = false;\n if (rendered) {\n const filteredRendered = filterAndDecorateChildren(rendered, instance);\n dnode.rendered = filteredRendered;\n addChildren(parentVNode, filteredRendered, projectionOptions, instance, insertBefore, childNodes);\n }\n instanceMap.set(instance, { dnode, parentVNode });\n instanceData.nodeHandler.addRoot();\n projectorState.afterRenderCallbacks.push(() => {\n instanceData.onAttach();\n });\n }\n else {\n if (projectorState.merge && projectorState.mergeElement !== undefined) {\n domNode = dnode.domNode = projectionOptions.mergeElement;\n projectorState.mergeElement = undefined;\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\n return;\n }\n const doc = parentVNode.domNode.ownerDocument;\n if (!dnode.tag && typeof dnode.text === 'string') {\n if (dnode.domNode !== undefined && parentVNode.domNode) {\n const newDomNode = dnode.domNode.ownerDocument.createTextNode(dnode.text);\n if (parentVNode.domNode === dnode.domNode.parentNode) {\n parentVNode.domNode.replaceChild(newDomNode, dnode.domNode);\n }\n else {\n parentVNode.domNode.appendChild(newDomNode);\n dnode.domNode.parentNode && dnode.domNode.parentNode.removeChild(dnode.domNode);\n }\n dnode.domNode = newDomNode;\n }\n else {\n domNode = dnode.domNode = doc.createTextNode(dnode.text);\n if (insertBefore !== undefined) {\n parentVNode.domNode.insertBefore(domNode, insertBefore);\n }\n else {\n parentVNode.domNode.appendChild(domNode);\n }\n }\n }\n else {\n if (dnode.domNode === undefined) {\n if (dnode.tag === 'svg') {\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\n }\n if (projectionOptions.namespace !== undefined) {\n domNode = dnode.domNode = doc.createElementNS(projectionOptions.namespace, dnode.tag);\n }\n else {\n domNode = dnode.domNode = dnode.domNode || doc.createElement(dnode.tag);\n }\n }\n else {\n domNode = dnode.domNode;\n }\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\n if (insertBefore !== undefined) {\n parentVNode.domNode.insertBefore(domNode, insertBefore);\n }\n else if (domNode.parentNode !== parentVNode.domNode) {\n parentVNode.domNode.appendChild(domNode);\n }\n }\n }\n}\nfunction updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance) {\n if (isWNode(dnode)) {\n const { instance } = previous;\n const { parentVNode, dnode: node } = instanceMap.get(instance);\n const previousRendered = node ? node.rendered : previous.rendered;\n const instanceData = widgetInstanceMap.get(instance);\n instanceData.rendering = true;\n instance.__setCoreProperties__(dnode.coreProperties);\n instance.__setChildren__(dnode.children);\n instance.__setProperties__(dnode.properties);\n dnode.instance = instance;\n if (instanceData.dirty === true) {\n const rendered = instance.__render__();\n instanceData.rendering = false;\n dnode.rendered = filterAndDecorateChildren(rendered, instance);\n updateChildren(parentVNode, previousRendered, dnode.rendered, instance, projectionOptions);\n }\n else {\n instanceData.rendering = false;\n dnode.rendered = previousRendered;\n }\n instanceMap.set(instance, { dnode, parentVNode });\n instanceData.nodeHandler.addRoot();\n }\n else {\n if (previous === dnode) {\n return false;\n }\n const domNode = (dnode.domNode = previous.domNode);\n let textUpdated = false;\n let updated = false;\n if (!dnode.tag && typeof dnode.text === 'string') {\n if (dnode.text !== previous.text) {\n const newDomNode = domNode.ownerDocument.createTextNode(dnode.text);\n domNode.parentNode.replaceChild(newDomNode, domNode);\n dnode.domNode = newDomNode;\n textUpdated = true;\n return textUpdated;\n }\n }\n else {\n if (dnode.tag && dnode.tag.lastIndexOf('svg', 0) === 0) {\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\n }\n if (previous.children !== dnode.children) {\n const children = filterAndDecorateChildren(dnode.children, parentInstance);\n dnode.children = children;\n updated =\n updateChildren(dnode, previous.children, children, parentInstance, projectionOptions) || updated;\n }\n const previousProperties = buildPreviousProperties(domNode, previous, dnode);\n if (dnode.attributes && dnode.events) {\n updateAttributes(domNode, previousProperties.attributes, dnode.attributes, projectionOptions);\n updated =\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions, false) || updated;\n removeOrphanedEvents(domNode, previousProperties.events, dnode.events, projectionOptions, true);\n const events = dnode.events;\n Object.keys(events).forEach((event) => {\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind, previousProperties.events[event]);\n });\n }\n else {\n updated =\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions) ||\n updated;\n }\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\n const instanceData = widgetInstanceMap.get(parentInstance);\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\n }\n }\n if (updated && dnode.properties && dnode.properties.updateAnimation) {\n dnode.properties.updateAnimation(domNode, dnode.properties, previous.properties);\n }\n }\n}\nfunction addDeferredProperties(vnode, projectionOptions) {\n // transfer any properties that have been passed - as these must be decorated properties\n vnode.decoratedDeferredProperties = vnode.properties;\n const properties = vnode.deferredPropertiesCallback(!!vnode.inserted);\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n vnode.properties = Object.assign({}, properties, vnode.decoratedDeferredProperties);\n projectorState.deferredRenderCallbacks.push(() => {\n const properties = Object.assign({}, vnode.deferredPropertiesCallback(!!vnode.inserted), vnode.decoratedDeferredProperties);\n updateProperties(vnode.domNode, vnode.properties, properties, projectionOptions);\n vnode.properties = properties;\n });\n}\nfunction runDeferredRenderCallbacks(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectorState.deferredRenderCallbacks.length) {\n if (projectionOptions.sync) {\n while (projectorState.deferredRenderCallbacks.length) {\n const callback = projectorState.deferredRenderCallbacks.shift();\n callback && callback();\n }\n }\n else {\n global.requestAnimationFrame(() => {\n while (projectorState.deferredRenderCallbacks.length) {\n const callback = projectorState.deferredRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n }\n}\nfunction runAfterRenderCallbacks(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectionOptions.sync) {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n }\n else {\n if (global.requestIdleCallback) {\n global.requestIdleCallback(() => {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n else {\n setTimeout(() => {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n }\n}\nfunction scheduleRender(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectionOptions.sync) {\n render(projectionOptions);\n }\n else if (projectorState.renderScheduled === undefined) {\n projectorState.renderScheduled = global.requestAnimationFrame(() => {\n render(projectionOptions);\n });\n }\n}\nfunction render(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectorState.renderScheduled = undefined;\n const renderQueue = projectorState.renderQueue;\n const renders = [...renderQueue];\n projectorState.renderQueue = [];\n renders.sort((a, b) => a.depth - b.depth);\n const previouslyRendered = [];\n while (renders.length) {\n const { instance } = renders.shift();\n if (instanceMap.has(instance) && previouslyRendered.indexOf(instance) === -1) {\n previouslyRendered.push(instance);\n const { parentVNode, dnode } = instanceMap.get(instance);\n const instanceData = widgetInstanceMap.get(instance);\n updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance);\n }\n }\n runAfterRenderCallbacks(projectionOptions);\n runDeferredRenderCallbacks(projectionOptions);\n}\nexport const dom = {\n append: function (parentNode, instance, projectionOptions = {}) {\n const instanceData = widgetInstanceMap.get(instance);\n const finalProjectorOptions = getProjectionOptions(projectionOptions, instance);\n const projectorState = {\n afterRenderCallbacks: [],\n deferredRenderCallbacks: [],\n nodeMap: new WeakMap(),\n renderScheduled: undefined,\n renderQueue: [],\n merge: projectionOptions.merge || false,\n mergeElement: projectionOptions.mergeElement\n };\n projectorStateMap.set(instance, projectorState);\n finalProjectorOptions.rootNode = parentNode;\n const parentVNode = toParentVNode(finalProjectorOptions.rootNode);\n const node = toInternalWNode(instance, instanceData);\n instanceMap.set(instance, { dnode: node, parentVNode });\n instanceData.invalidate = () => {\n instanceData.dirty = true;\n if (instanceData.rendering === false) {\n projectorState.renderQueue.push({ instance, depth: finalProjectorOptions.depth });\n scheduleRender(finalProjectorOptions);\n }\n };\n updateDom(node, node, finalProjectorOptions, parentVNode, instance);\n projectorState.afterRenderCallbacks.push(() => {\n instanceData.onAttach();\n });\n runDeferredRenderCallbacks(finalProjectorOptions);\n runAfterRenderCallbacks(finalProjectorOptions);\n return {\n domNode: finalProjectorOptions.rootNode\n };\n },\n create: function (instance, projectionOptions) {\n return this.append(document.createElement('div'), instance, projectionOptions);\n },\n merge: function (element, instance, projectionOptions = {}) {\n projectionOptions.merge = true;\n projectionOptions.mergeElement = element;\n const projection = this.append(element.parentNode, instance, projectionOptions);\n const projectorState = projectorStateMap.get(instance);\n projectorState.merge = false;\n return projection;\n }\n};\n//# sourceMappingURL=vdom.mjs.map" + "source": "import global from '../shim/global';\nimport { from as arrayFrom } from '../shim/array';\nimport { isWNode, isVNode, isDomVNode, VNODE, WNODE } from './d';\nimport { isWidgetBaseConstructor } from './Registry';\nimport WeakMap from '../shim/WeakMap';\nconst NAMESPACE_W3 = 'http://www.w3.org/';\nconst NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg';\nconst NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink';\nconst emptyArray = [];\nconst nodeOperations = ['focus', 'blur', 'scrollIntoView', 'click'];\nexport const widgetInstanceMap = new WeakMap();\nconst instanceMap = new WeakMap();\nconst nextSiblingMap = new WeakMap();\nconst projectorStateMap = new WeakMap();\nfunction same(dnode1, dnode2) {\n if (isVNode(dnode1) && isVNode(dnode2)) {\n if (isDomVNode(dnode1) || isDomVNode(dnode2)) {\n if (dnode1.domNode !== dnode2.domNode) {\n return false;\n }\n }\n if (dnode1.tag !== dnode2.tag) {\n return false;\n }\n if (dnode1.properties.key !== dnode2.properties.key) {\n return false;\n }\n return true;\n }\n else if (isWNode(dnode1) && isWNode(dnode2)) {\n if (dnode1.instance === undefined && typeof dnode2.widgetConstructor === 'string') {\n return false;\n }\n if (dnode1.widgetConstructor !== dnode2.widgetConstructor) {\n return false;\n }\n if (dnode1.properties.key !== dnode2.properties.key) {\n return false;\n }\n return true;\n }\n return false;\n}\nconst missingTransition = function () {\n throw new Error('Provide a transitions object to the projectionOptions to do animations');\n};\nfunction getProjectionOptions(projectorOptions, projectorInstance) {\n const defaults = {\n namespace: undefined,\n styleApplyer: function (domNode, styleName, value) {\n domNode.style[styleName] = value;\n },\n transitions: {\n enter: missingTransition,\n exit: missingTransition\n },\n depth: 0,\n merge: false,\n sync: false,\n projectorInstance\n };\n return Object.assign({}, defaults, projectorOptions);\n}\nfunction checkStyleValue(styleValue) {\n if (typeof styleValue !== 'string') {\n throw new Error('Style values must be strings');\n }\n}\nfunction updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n const eventMap = projectorState.nodeMap.get(domNode) || new WeakMap();\n if (previousValue) {\n const previousEvent = eventMap.get(previousValue);\n domNode.removeEventListener(eventName, previousEvent);\n }\n let callback = currentValue.bind(bind);\n if (eventName === 'input') {\n callback = function (evt) {\n currentValue.call(this, evt);\n evt.target['oninput-value'] = evt.target.value;\n }.bind(bind);\n }\n domNode.addEventListener(eventName, callback);\n eventMap.set(currentValue, callback);\n projectorState.nodeMap.set(domNode, eventMap);\n}\nfunction addClasses(domNode, classes) {\n if (classes) {\n const classNames = classes.split(' ');\n for (let i = 0; i < classNames.length; i++) {\n domNode.classList.add(classNames[i]);\n }\n }\n}\nfunction removeClasses(domNode, classes) {\n if (classes) {\n const classNames = classes.split(' ');\n for (let i = 0; i < classNames.length; i++) {\n domNode.classList.remove(classNames[i]);\n }\n }\n}\nfunction buildPreviousProperties(domNode, previous, current) {\n const { diffType, properties, attributes } = current;\n if (!diffType || diffType === 'vdom') {\n return { properties: previous.properties, attributes: previous.attributes, events: previous.events };\n }\n else if (diffType === 'none') {\n return { properties: {}, attributes: previous.attributes ? {} : undefined, events: previous.events };\n }\n let newProperties = {\n properties: {}\n };\n if (attributes) {\n newProperties.attributes = {};\n newProperties.events = previous.events;\n Object.keys(properties).forEach((propName) => {\n newProperties.properties[propName] = domNode[propName];\n });\n Object.keys(attributes).forEach((attrName) => {\n newProperties.attributes[attrName] = domNode.getAttribute(attrName);\n });\n return newProperties;\n }\n newProperties.properties = Object.keys(properties).reduce((props, property) => {\n props[property] = domNode.getAttribute(property) || domNode[property];\n return props;\n }, {});\n return newProperties;\n}\nfunction nodeOperation(propName, propValue, previousValue, domNode, projectionOptions) {\n let result;\n if (typeof propValue === 'function') {\n result = propValue();\n }\n else {\n result = propValue && !previousValue;\n }\n if (result === true) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectorState.deferredRenderCallbacks.push(() => {\n domNode[propName]();\n });\n }\n}\nfunction removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions, onlyEvents = false) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n const eventMap = projectorState.nodeMap.get(domNode);\n if (eventMap) {\n Object.keys(previousProperties).forEach((propName) => {\n const isEvent = propName.substr(0, 2) === 'on' || onlyEvents;\n const eventName = onlyEvents ? propName : propName.substr(2);\n if (isEvent && !properties[propName]) {\n const eventCallback = eventMap.get(previousProperties[propName]);\n if (eventCallback) {\n domNode.removeEventListener(eventName, eventCallback);\n }\n }\n });\n }\n}\nfunction updateAttribute(domNode, attrName, attrValue, projectionOptions) {\n if (projectionOptions.namespace === NAMESPACE_SVG && attrName === 'href') {\n domNode.setAttributeNS(NAMESPACE_XLINK, attrName, attrValue);\n }\n else if ((attrName === 'role' && attrValue === '') || attrValue === undefined) {\n domNode.removeAttribute(attrName);\n }\n else {\n domNode.setAttribute(attrName, attrValue);\n }\n}\nfunction updateAttributes(domNode, previousAttributes, attributes, projectionOptions) {\n const attrNames = Object.keys(attributes);\n const attrCount = attrNames.length;\n for (let i = 0; i < attrCount; i++) {\n const attrName = attrNames[i];\n const attrValue = attributes[attrName];\n const previousAttrValue = previousAttributes[attrName];\n if (attrValue !== previousAttrValue) {\n updateAttribute(domNode, attrName, attrValue, projectionOptions);\n }\n }\n}\nfunction updateProperties(domNode, previousProperties, properties, projectionOptions, includesEventsAndAttributes = true) {\n let propertiesUpdated = false;\n const propNames = Object.keys(properties);\n const propCount = propNames.length;\n if (propNames.indexOf('classes') === -1 && previousProperties.classes) {\n if (Array.isArray(previousProperties.classes)) {\n for (let i = 0; i < previousProperties.classes.length; i++) {\n removeClasses(domNode, previousProperties.classes[i]);\n }\n }\n else {\n removeClasses(domNode, previousProperties.classes);\n }\n }\n includesEventsAndAttributes && removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions);\n for (let i = 0; i < propCount; i++) {\n const propName = propNames[i];\n let propValue = properties[propName];\n const previousValue = previousProperties[propName];\n if (propName === 'classes') {\n const previousClasses = Array.isArray(previousValue) ? previousValue : [previousValue];\n const currentClasses = Array.isArray(propValue) ? propValue : [propValue];\n if (previousClasses && previousClasses.length > 0) {\n if (!propValue || propValue.length === 0) {\n for (let i = 0; i < previousClasses.length; i++) {\n removeClasses(domNode, previousClasses[i]);\n }\n }\n else {\n const newClasses = [...currentClasses];\n for (let i = 0; i < previousClasses.length; i++) {\n const previousClassName = previousClasses[i];\n if (previousClassName) {\n const classIndex = newClasses.indexOf(previousClassName);\n if (classIndex === -1) {\n removeClasses(domNode, previousClassName);\n }\n else {\n newClasses.splice(classIndex, 1);\n }\n }\n }\n for (let i = 0; i < newClasses.length; i++) {\n addClasses(domNode, newClasses[i]);\n }\n }\n }\n else {\n for (let i = 0; i < currentClasses.length; i++) {\n addClasses(domNode, currentClasses[i]);\n }\n }\n }\n else if (nodeOperations.indexOf(propName) !== -1) {\n nodeOperation(propName, propValue, previousValue, domNode, projectionOptions);\n }\n else if (propName === 'styles') {\n const styleNames = Object.keys(propValue);\n const styleCount = styleNames.length;\n for (let j = 0; j < styleCount; j++) {\n const styleName = styleNames[j];\n const newStyleValue = propValue[styleName];\n const oldStyleValue = previousValue && previousValue[styleName];\n if (newStyleValue === oldStyleValue) {\n continue;\n }\n propertiesUpdated = true;\n if (newStyleValue) {\n checkStyleValue(newStyleValue);\n projectionOptions.styleApplyer(domNode, styleName, newStyleValue);\n }\n else {\n projectionOptions.styleApplyer(domNode, styleName, '');\n }\n }\n }\n else {\n if (!propValue && typeof previousValue === 'string') {\n propValue = '';\n }\n if (propName === 'value') {\n const domValue = domNode[propName];\n if (domValue !== propValue &&\n (domNode['oninput-value']\n ? domValue === domNode['oninput-value']\n : propValue !== previousValue)) {\n domNode[propName] = propValue;\n domNode['oninput-value'] = undefined;\n }\n if (propValue !== previousValue) {\n propertiesUpdated = true;\n }\n }\n else if (propName !== 'key' && propValue !== previousValue) {\n const type = typeof propValue;\n if (type === 'function' && propName.lastIndexOf('on', 0) === 0 && includesEventsAndAttributes) {\n updateEvent(domNode, propName.substr(2), propValue, projectionOptions, properties.bind, previousValue);\n }\n else if (type === 'string' && propName !== 'innerHTML' && includesEventsAndAttributes) {\n updateAttribute(domNode, propName, propValue, projectionOptions);\n }\n else if (propName === 'scrollLeft' || propName === 'scrollTop') {\n if (domNode[propName] !== propValue) {\n domNode[propName] = propValue;\n }\n }\n else {\n domNode[propName] = propValue;\n }\n propertiesUpdated = true;\n }\n }\n }\n return propertiesUpdated;\n}\nfunction findIndexOfChild(children, sameAs, start) {\n for (let i = start; i < children.length; i++) {\n if (same(children[i], sameAs)) {\n return i;\n }\n }\n return -1;\n}\nexport function toParentVNode(domNode) {\n return {\n tag: '',\n properties: {},\n children: undefined,\n domNode,\n type: VNODE\n };\n}\nexport function toTextVNode(data) {\n return {\n tag: '',\n properties: {},\n children: undefined,\n text: `${data}`,\n domNode: undefined,\n type: VNODE\n };\n}\nfunction toInternalWNode(instance, instanceData) {\n return {\n instance,\n rendered: [],\n coreProperties: instanceData.coreProperties,\n children: instance.children,\n widgetConstructor: instance.constructor,\n properties: instanceData.inputProperties,\n type: WNODE\n };\n}\nexport function filterAndDecorateChildren(children, instance) {\n if (children === undefined) {\n return emptyArray;\n }\n children = Array.isArray(children) ? children : [children];\n for (let i = 0; i < children.length;) {\n const child = children[i];\n if (child === undefined || child === null) {\n children.splice(i, 1);\n continue;\n }\n else if (typeof child === 'string') {\n children[i] = toTextVNode(child);\n }\n else {\n if (isVNode(child)) {\n if (child.properties.bind === undefined) {\n child.properties.bind = instance;\n if (child.children && child.children.length > 0) {\n filterAndDecorateChildren(child.children, instance);\n }\n }\n }\n else {\n if (!child.coreProperties) {\n const instanceData = widgetInstanceMap.get(instance);\n child.coreProperties = {\n bind: instance,\n baseRegistry: instanceData.coreProperties.baseRegistry\n };\n }\n if (child.children && child.children.length > 0) {\n filterAndDecorateChildren(child.children, instance);\n }\n }\n }\n i++;\n }\n return children;\n}\nfunction nodeAdded(dnode, transitions) {\n if (isVNode(dnode) && dnode.properties) {\n const enterAnimation = dnode.properties.enterAnimation;\n if (enterAnimation) {\n if (typeof enterAnimation === 'function') {\n enterAnimation(dnode.domNode, dnode.properties);\n }\n else {\n transitions.enter(dnode.domNode, dnode.properties, enterAnimation);\n }\n }\n }\n}\nfunction nodeToRemove(dnode, transitions, projectionOptions) {\n if (isWNode(dnode)) {\n const item = instanceMap.get(dnode.instance);\n const rendered = (item ? item.dnode.rendered : dnode.rendered) || emptyArray;\n if (dnode.instance) {\n const instanceData = widgetInstanceMap.get(dnode.instance);\n instanceData.onDetach();\n instanceMap.delete(dnode.instance);\n }\n for (let i = 0; i < rendered.length; i++) {\n nodeToRemove(rendered[i], transitions, projectionOptions);\n }\n }\n else {\n const domNode = dnode.domNode;\n const properties = dnode.properties;\n if (dnode.children && dnode.children.length > 0) {\n for (let i = 0; i < dnode.children.length; i++) {\n nodeToRemove(dnode.children[i], transitions, projectionOptions);\n }\n }\n const exitAnimation = properties.exitAnimation;\n if (properties && exitAnimation) {\n domNode.style.pointerEvents = 'none';\n const removeDomNode = function () {\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\n dnode.domNode = undefined;\n };\n if (typeof exitAnimation === 'function') {\n exitAnimation(domNode, removeDomNode, properties);\n return;\n }\n else {\n transitions.exit(dnode.domNode, properties, exitAnimation, removeDomNode);\n return;\n }\n }\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\n dnode.domNode = undefined;\n }\n}\nfunction checkDistinguishable(childNodes, indexToCheck, parentInstance) {\n const childNode = childNodes[indexToCheck];\n if (isVNode(childNode) && !childNode.tag) {\n return; // Text nodes need not be distinguishable\n }\n const { key } = childNode.properties;\n if (key === undefined || key === null) {\n for (let i = 0; i < childNodes.length; i++) {\n if (i !== indexToCheck) {\n const node = childNodes[i];\n if (same(node, childNode)) {\n let nodeIdentifier;\n const parentName = parentInstance.constructor.name || 'unknown';\n if (isWNode(childNode)) {\n nodeIdentifier = childNode.widgetConstructor.name || 'unknown';\n }\n else {\n nodeIdentifier = childNode.tag;\n }\n console.warn(`A widget (${parentName}) has had a child addded or removed, but they were not able to uniquely identified. It is recommended to provide a unique 'key' property when using the same widget or element (${nodeIdentifier}) multiple times as siblings`);\n break;\n }\n }\n }\n }\n}\nfunction updateChildren(parentVNode, siblings, oldChildren, newChildren, parentInstance, projectionOptions) {\n oldChildren = oldChildren || emptyArray;\n newChildren = newChildren;\n const oldChildrenLength = oldChildren.length;\n const newChildrenLength = newChildren.length;\n const transitions = projectionOptions.transitions;\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\n let oldIndex = 0;\n let newIndex = 0;\n let i;\n let textUpdated = false;\n while (newIndex < newChildrenLength) {\n let oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : undefined;\n const newChild = newChildren[newIndex];\n if (isVNode(newChild) && typeof newChild.deferredPropertiesCallback === 'function') {\n newChild.inserted = isVNode(oldChild) && oldChild.inserted;\n addDeferredProperties(newChild, projectionOptions);\n }\n if (oldChild !== undefined && same(oldChild, newChild)) {\n oldIndex++;\n newIndex++;\n textUpdated =\n updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance, oldChildren.slice(oldIndex), newChildren.slice(newIndex)) || textUpdated;\n continue;\n }\n const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);\n const addChild = () => {\n let insertBeforeDomNode = undefined;\n let childrenArray = oldChildren;\n let nextIndex = oldIndex + 1;\n let child = oldChildren[oldIndex];\n if (!child) {\n child = siblings[0];\n nextIndex = 1;\n childrenArray = siblings;\n }\n if (child) {\n let insertBeforeChildren = [child];\n while (insertBeforeChildren.length) {\n const insertBefore = insertBeforeChildren.shift();\n if (isWNode(insertBefore)) {\n const item = instanceMap.get(insertBefore.instance);\n if (item && item.dnode.rendered) {\n insertBeforeChildren.push(...item.dnode.rendered);\n }\n }\n else {\n if (insertBefore.domNode) {\n if (insertBefore.domNode.parentElement !== parentVNode.domNode) {\n break;\n }\n insertBeforeDomNode = insertBefore.domNode;\n break;\n }\n }\n if (insertBeforeChildren.length === 0 && childrenArray[nextIndex]) {\n insertBeforeChildren.push(childrenArray[nextIndex]);\n nextIndex++;\n }\n }\n }\n createDom(newChild, parentVNode, newChildren.slice(newIndex + 1), insertBeforeDomNode, projectionOptions, parentInstance);\n nodeAdded(newChild, transitions);\n const indexToCheck = newIndex;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(newChildren, indexToCheck, parentInstance);\n });\n };\n if (!oldChild || findOldIndex === -1) {\n addChild();\n newIndex++;\n continue;\n }\n const removeChild = () => {\n const indexToCheck = oldIndex;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\n });\n if (isWNode(oldChild)) {\n const item = instanceMap.get(oldChild.instance);\n if (item) {\n oldChild = item.dnode;\n }\n }\n nodeToRemove(oldChild, transitions, projectionOptions);\n };\n const findNewIndex = findIndexOfChild(newChildren, oldChild, newIndex + 1);\n if (findNewIndex === -1) {\n removeChild();\n oldIndex++;\n continue;\n }\n addChild();\n removeChild();\n oldIndex++;\n newIndex++;\n }\n if (oldChildrenLength > oldIndex) {\n // Remove child fragments\n for (i = oldIndex; i < oldChildrenLength; i++) {\n const indexToCheck = i;\n projectorState.afterRenderCallbacks.push(() => {\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\n });\n let childToRemove = oldChildren[i];\n if (isWNode(childToRemove)) {\n const item = instanceMap.get(childToRemove.instance);\n if (item) {\n childToRemove = item.dnode;\n }\n }\n nodeToRemove(childToRemove, transitions, projectionOptions);\n }\n }\n return textUpdated;\n}\nfunction addChildren(parentVNode, children, projectionOptions, parentInstance, insertBefore = undefined, childNodes) {\n if (children === undefined) {\n return;\n }\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectorState.merge && childNodes === undefined) {\n childNodes = arrayFrom(parentVNode.domNode.childNodes);\n }\n const transitions = projectionOptions.transitions;\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n const nextSiblings = children.slice(i + 1);\n if (isVNode(child)) {\n if (projectorState.merge && childNodes) {\n let domElement = undefined;\n while (child.domNode === undefined && childNodes.length > 0) {\n domElement = childNodes.shift();\n if (domElement && domElement.tagName === (child.tag.toUpperCase() || undefined)) {\n child.domNode = domElement;\n }\n }\n }\n createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance);\n }\n else {\n createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes);\n }\n nodeAdded(child, transitions);\n }\n}\nfunction initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions) {\n addChildren(dnode, dnode.children, projectionOptions, parentInstance, undefined);\n if (typeof dnode.deferredPropertiesCallback === 'function' && dnode.inserted === undefined) {\n addDeferredProperties(dnode, projectionOptions);\n }\n if (dnode.attributes && dnode.events) {\n updateAttributes(domNode, {}, dnode.attributes, projectionOptions);\n updateProperties(domNode, {}, dnode.properties, projectionOptions, false);\n removeOrphanedEvents(domNode, {}, dnode.events, projectionOptions, true);\n const events = dnode.events;\n Object.keys(events).forEach((event) => {\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind);\n });\n }\n else {\n updateProperties(domNode, {}, dnode.properties, projectionOptions);\n }\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\n const instanceData = widgetInstanceMap.get(parentInstance);\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\n }\n dnode.inserted = true;\n}\nfunction createDom(dnode, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes) {\n let domNode;\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (isWNode(dnode)) {\n let { widgetConstructor } = dnode;\n const parentInstanceData = widgetInstanceMap.get(parentInstance);\n if (!isWidgetBaseConstructor(widgetConstructor)) {\n const item = parentInstanceData.registry().get(widgetConstructor);\n if (item === null) {\n return;\n }\n widgetConstructor = item;\n }\n const instance = new widgetConstructor();\n dnode.instance = instance;\n nextSiblingMap.set(instance, nextSiblings);\n const instanceData = widgetInstanceMap.get(instance);\n instanceData.invalidate = () => {\n instanceData.dirty = true;\n if (instanceData.rendering === false) {\n projectorState.renderQueue.push({ instance, depth: projectionOptions.depth });\n scheduleRender(projectionOptions);\n }\n };\n instanceData.rendering = true;\n instance.__setCoreProperties__(dnode.coreProperties);\n instance.__setChildren__(dnode.children);\n instance.__setProperties__(dnode.properties);\n const rendered = instance.__render__();\n instanceData.rendering = false;\n if (rendered) {\n const filteredRendered = filterAndDecorateChildren(rendered, instance);\n dnode.rendered = filteredRendered;\n addChildren(parentVNode, filteredRendered, projectionOptions, instance, insertBefore, childNodes);\n }\n instanceMap.set(instance, { dnode, parentVNode });\n instanceData.nodeHandler.addRoot();\n projectorState.afterRenderCallbacks.push(() => {\n instanceData.onAttach();\n });\n }\n else {\n if (projectorState.merge && projectorState.mergeElement !== undefined) {\n domNode = dnode.domNode = projectionOptions.mergeElement;\n projectorState.mergeElement = undefined;\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\n return;\n }\n const doc = parentVNode.domNode.ownerDocument;\n if (!dnode.tag && typeof dnode.text === 'string') {\n if (dnode.domNode !== undefined && parentVNode.domNode) {\n const newDomNode = dnode.domNode.ownerDocument.createTextNode(dnode.text);\n if (parentVNode.domNode === dnode.domNode.parentNode) {\n parentVNode.domNode.replaceChild(newDomNode, dnode.domNode);\n }\n else {\n parentVNode.domNode.appendChild(newDomNode);\n dnode.domNode.parentNode && dnode.domNode.parentNode.removeChild(dnode.domNode);\n }\n dnode.domNode = newDomNode;\n }\n else {\n domNode = dnode.domNode = doc.createTextNode(dnode.text);\n if (insertBefore !== undefined) {\n parentVNode.domNode.insertBefore(domNode, insertBefore);\n }\n else {\n parentVNode.domNode.appendChild(domNode);\n }\n }\n }\n else {\n if (dnode.domNode === undefined) {\n if (dnode.tag === 'svg') {\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\n }\n if (projectionOptions.namespace !== undefined) {\n domNode = dnode.domNode = doc.createElementNS(projectionOptions.namespace, dnode.tag);\n }\n else {\n domNode = dnode.domNode = dnode.domNode || doc.createElement(dnode.tag);\n }\n }\n else {\n domNode = dnode.domNode;\n }\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\n if (insertBefore !== undefined) {\n parentVNode.domNode.insertBefore(domNode, insertBefore);\n }\n else if (domNode.parentNode !== parentVNode.domNode) {\n parentVNode.domNode.appendChild(domNode);\n }\n }\n }\n}\nfunction updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance, oldNextSiblings, nextSiblings) {\n if (isWNode(dnode)) {\n const { instance } = previous;\n const { parentVNode, dnode: node } = instanceMap.get(instance);\n const previousRendered = node ? node.rendered : previous.rendered;\n const instanceData = widgetInstanceMap.get(instance);\n instanceData.rendering = true;\n instance.__setCoreProperties__(dnode.coreProperties);\n instance.__setChildren__(dnode.children);\n instance.__setProperties__(dnode.properties);\n nextSiblingMap.set(instance, nextSiblings);\n dnode.instance = instance;\n if (instanceData.dirty === true) {\n const rendered = instance.__render__();\n instanceData.rendering = false;\n dnode.rendered = filterAndDecorateChildren(rendered, instance);\n updateChildren(parentVNode, oldNextSiblings, previousRendered, dnode.rendered, instance, projectionOptions);\n }\n else {\n instanceData.rendering = false;\n dnode.rendered = previousRendered;\n }\n instanceMap.set(instance, { dnode, parentVNode });\n instanceData.nodeHandler.addRoot();\n }\n else {\n if (previous === dnode) {\n return false;\n }\n const domNode = (dnode.domNode = previous.domNode);\n let textUpdated = false;\n let updated = false;\n if (!dnode.tag && typeof dnode.text === 'string') {\n if (dnode.text !== previous.text) {\n const newDomNode = domNode.ownerDocument.createTextNode(dnode.text);\n domNode.parentNode.replaceChild(newDomNode, domNode);\n dnode.domNode = newDomNode;\n textUpdated = true;\n return textUpdated;\n }\n }\n else {\n if (dnode.tag && dnode.tag.lastIndexOf('svg', 0) === 0) {\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\n }\n if (previous.children !== dnode.children) {\n const children = filterAndDecorateChildren(dnode.children, parentInstance);\n dnode.children = children;\n updated =\n updateChildren(dnode, oldNextSiblings, previous.children, children, parentInstance, projectionOptions) || updated;\n }\n const previousProperties = buildPreviousProperties(domNode, previous, dnode);\n if (dnode.attributes && dnode.events) {\n updateAttributes(domNode, previousProperties.attributes, dnode.attributes, projectionOptions);\n updated =\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions, false) || updated;\n removeOrphanedEvents(domNode, previousProperties.events, dnode.events, projectionOptions, true);\n const events = dnode.events;\n Object.keys(events).forEach((event) => {\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind, previousProperties.events[event]);\n });\n }\n else {\n updated =\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions) ||\n updated;\n }\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\n const instanceData = widgetInstanceMap.get(parentInstance);\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\n }\n }\n if (updated && dnode.properties && dnode.properties.updateAnimation) {\n dnode.properties.updateAnimation(domNode, dnode.properties, previous.properties);\n }\n }\n}\nfunction addDeferredProperties(vnode, projectionOptions) {\n // transfer any properties that have been passed - as these must be decorated properties\n vnode.decoratedDeferredProperties = vnode.properties;\n const properties = vnode.deferredPropertiesCallback(!!vnode.inserted);\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n vnode.properties = Object.assign({}, properties, vnode.decoratedDeferredProperties);\n projectorState.deferredRenderCallbacks.push(() => {\n const properties = Object.assign({}, vnode.deferredPropertiesCallback(!!vnode.inserted), vnode.decoratedDeferredProperties);\n updateProperties(vnode.domNode, vnode.properties, properties, projectionOptions);\n vnode.properties = properties;\n });\n}\nfunction runDeferredRenderCallbacks(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectorState.deferredRenderCallbacks.length) {\n if (projectionOptions.sync) {\n while (projectorState.deferredRenderCallbacks.length) {\n const callback = projectorState.deferredRenderCallbacks.shift();\n callback && callback();\n }\n }\n else {\n global.requestAnimationFrame(() => {\n while (projectorState.deferredRenderCallbacks.length) {\n const callback = projectorState.deferredRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n }\n}\nfunction runAfterRenderCallbacks(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectionOptions.sync) {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n }\n else {\n if (global.requestIdleCallback) {\n global.requestIdleCallback(() => {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n else {\n setTimeout(() => {\n while (projectorState.afterRenderCallbacks.length) {\n const callback = projectorState.afterRenderCallbacks.shift();\n callback && callback();\n }\n });\n }\n }\n}\nfunction scheduleRender(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n if (projectionOptions.sync) {\n render(projectionOptions);\n }\n else if (projectorState.renderScheduled === undefined) {\n projectorState.renderScheduled = global.requestAnimationFrame(() => {\n render(projectionOptions);\n });\n }\n}\nfunction render(projectionOptions) {\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\n projectorState.renderScheduled = undefined;\n const renderQueue = projectorState.renderQueue;\n const renders = [...renderQueue];\n projectorState.renderQueue = [];\n renders.sort((a, b) => a.depth - b.depth);\n const previouslyRendered = [];\n while (renders.length) {\n const { instance } = renders.shift();\n if (instanceMap.has(instance) && previouslyRendered.indexOf(instance) === -1) {\n previouslyRendered.push(instance);\n const { parentVNode, dnode } = instanceMap.get(instance);\n const instanceData = widgetInstanceMap.get(instance);\n const nextSiblings = nextSiblingMap.get(instance);\n updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance, nextSiblings, nextSiblings);\n }\n }\n runAfterRenderCallbacks(projectionOptions);\n runDeferredRenderCallbacks(projectionOptions);\n}\nexport const dom = {\n append: function (parentNode, instance, projectionOptions = {}) {\n const instanceData = widgetInstanceMap.get(instance);\n const finalProjectorOptions = getProjectionOptions(projectionOptions, instance);\n const projectorState = {\n afterRenderCallbacks: [],\n deferredRenderCallbacks: [],\n nodeMap: new WeakMap(),\n renderScheduled: undefined,\n renderQueue: [],\n merge: projectionOptions.merge || false,\n mergeElement: projectionOptions.mergeElement\n };\n projectorStateMap.set(instance, projectorState);\n finalProjectorOptions.rootNode = parentNode;\n const parentVNode = toParentVNode(finalProjectorOptions.rootNode);\n const node = toInternalWNode(instance, instanceData);\n instanceMap.set(instance, { dnode: node, parentVNode });\n instanceData.invalidate = () => {\n instanceData.dirty = true;\n if (instanceData.rendering === false) {\n projectorState.renderQueue.push({ instance, depth: finalProjectorOptions.depth });\n scheduleRender(finalProjectorOptions);\n }\n };\n updateDom(node, node, finalProjectorOptions, parentVNode, instance, [], []);\n projectorState.afterRenderCallbacks.push(() => {\n instanceData.onAttach();\n });\n runDeferredRenderCallbacks(finalProjectorOptions);\n runAfterRenderCallbacks(finalProjectorOptions);\n return {\n domNode: finalProjectorOptions.rootNode\n };\n },\n create: function (instance, projectionOptions) {\n return this.append(document.createElement('div'), instance, projectionOptions);\n },\n merge: function (element, instance, projectionOptions = {}) {\n projectionOptions.merge = true;\n projectionOptions.mergeElement = element;\n const projection = this.append(element.parentNode, instance, projectionOptions);\n const projectorState = projectorStateMap.get(instance);\n projectorState.merge = false;\n return projection;\n }\n};\n//# sourceMappingURL=vdom.mjs.map" }, { "id": "./node_modules/imports-loader/index.js?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js", @@ -4870,7 +4887,7 @@ "name": "./node_modules/imports-loader?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js", "index": 1, "index2": 41, - "size": 273, + "size": 283, "cacheable": true, "built": true, "optional": false, @@ -4900,7 +4917,7 @@ "providedExports": null, "optimizationBailout": [], "depth": 1, - "source": "/*** IMPORTS FROM imports-loader ***/\nvar widgetFactory = require(\"src/menu/Menu\");\n\nvar registerCustomElement = require('@dojo/widget-core/registerCustomElement').default;\n\nvar defaultExport = widgetFactory.default;\ndefaultExport && registerCustomElement(defaultExport);\n\n" + "source": "/*** IMPORTS FROM imports-loader ***/\nvar widgetFactory = require(\"src/menu/Menu\");\n\nvar registerCustomElement = require('@dojo/framework/widget-core/registerCustomElement').default;\n\nvar defaultExport = widgetFactory.default;\ndefaultExport && registerCustomElement(defaultExport);\n\n" }, { "id": "./node_modules/process/browser.js", @@ -4917,21 +4934,21 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/has/has.mjs", - "issuerId": "./node_modules/@dojo/has/has.mjs", - "issuerName": "./node_modules/@dojo/has/has.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/has/has.mjs", + "issuerId": "./node_modules/@dojo/framework/has/has.mjs", + "issuerName": "./node_modules/@dojo/framework/has/has.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/has/has.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/has/has.mjs", - "module": "./node_modules/@dojo/has/has.mjs", - "moduleName": "./node_modules/@dojo/has/has.mjs", + "moduleId": "./node_modules/@dojo/framework/has/has.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/has/has.mjs", + "module": "./node_modules/@dojo/framework/has/has.mjs", + "moduleName": "./node_modules/@dojo/framework/has/has.mjs", "type": "cjs require", "userRequest": "process", - "loc": "1:0-37" + "loc": "1:0-40" } ], "usedExports": true, @@ -4955,18 +4972,18 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "tslib", "loc": "1:0-33" @@ -4981,19 +4998,19 @@ "loc": "1:0-33" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "tslib", "loc": "1:0-33" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/widget-core/mixins/Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "tslib", "loc": "1:0-33" @@ -5001,7 +5018,6 @@ ], "usedExports": [ "__decorate", - "__metadata", "__rest" ], "providedExports": [ @@ -5042,30 +5058,30 @@ "menu" ], "assets": [], - "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/global.mjs", - "issuerId": "./node_modules/@dojo/shim/global.mjs", - "issuerName": "./node_modules/@dojo/shim/global.mjs", + "issuer": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/global.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/global.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/global.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/global.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/shim/global.mjs", - "module": "./node_modules/@dojo/shim/global.mjs", - "moduleName": "./node_modules/@dojo/shim/global.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/global.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/shim/global.mjs", + "module": "./node_modules/@dojo/framework/shim/global.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/global.mjs", "type": "cjs require", "userRequest": "global", - "loc": "1:0-44" + "loc": "1:0-47" }, { - "moduleId": "./node_modules/@dojo/has/has.mjs", - "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/has/has.mjs", - "module": "./node_modules/@dojo/has/has.mjs", - "moduleName": "./node_modules/@dojo/has/has.mjs", + "moduleId": "./node_modules/@dojo/framework/has/has.mjs", + "moduleIdentifier": "/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/webpack-contrib/static-build-loader/index.js??ref--4-0!/Users/bryan/Projects/dojo2/cli-build-widget/test-app/node_modules/@dojo/framework/has/has.mjs", + "module": "./node_modules/@dojo/framework/has/has.mjs", + "moduleName": "./node_modules/@dojo/framework/has/has.mjs", "type": "cjs require", "userRequest": "global", - "loc": "1:0-44" + "loc": "1:0-47" } ], "usedExports": true, @@ -5080,7 +5096,7 @@ "name": "./src/menu/Menu.ts", "index": 2, "index2": 40, - "size": 1419, + "size": 1459, "cacheable": true, "built": true, "optional": false, @@ -5113,7 +5129,7 @@ ], "optimizationBailout": [], "depth": 2, - "source": "import * as tslib_1 from \"tslib\";\nimport { v } from '@dojo/widget-core/d';\nimport { customElement } from '@dojo/widget-core/decorators/customElement';\nimport { theme, ThemedMixin } from '@dojo/widget-core/mixins/Themed';\nimport { WidgetBase } from '@dojo/widget-core/WidgetBase';\nimport * as css from './menu.m.css';\nlet Menu = class Menu extends ThemedMixin(WidgetBase) {\n _onSelected(id, data) {\n this._selectedId = id;\n this.properties.onSelected(data);\n this.invalidate();\n }\n render() {\n const items = this.children.map((child, index) => {\n if (child) {\n const properties = {\n onSelected: (data) => {\n this._onSelected(index, data);\n }\n };\n if (this._selectedId !== undefined) {\n properties.selected = index === this._selectedId;\n }\n child.properties = Object.assign({}, child.properties, properties);\n }\n return child;\n });\n return v('nav', { classes: this.theme(css.root) }, [\n v('ol', {\n classes: this.theme(css.menuContainer)\n }, items)\n ]);\n }\n};\nMenu = tslib_1.__decorate([\n customElement({\n tag: 'demo-menu',\n events: ['onSelected']\n }),\n theme(css)\n], Menu);\nexport { Menu };\nexport default Menu;\n" + "source": "import * as tslib_1 from \"tslib\";\nimport { v } from '@dojo/framework/widget-core/d';\nimport { customElement } from '@dojo/framework/widget-core/decorators/customElement';\nimport { theme, ThemedMixin } from '@dojo/framework/widget-core/mixins/Themed';\nimport { WidgetBase } from '@dojo/framework/widget-core/WidgetBase';\nimport * as css from './menu.m.css';\nlet Menu = class Menu extends ThemedMixin(WidgetBase) {\n _onSelected(id, data) {\n this._selectedId = id;\n this.properties.onSelected(data);\n this.invalidate();\n }\n render() {\n const items = this.children.map((child, index) => {\n if (child) {\n const properties = {\n onSelected: (data) => {\n this._onSelected(index, data);\n }\n };\n if (this._selectedId !== undefined) {\n properties.selected = index === this._selectedId;\n }\n child.properties = Object.assign({}, child.properties, properties);\n }\n return child;\n });\n return v('nav', { classes: this.theme(css.root) }, [\n v('ol', {\n classes: this.theme(css.menuContainer)\n }, items)\n ]);\n }\n};\nMenu = tslib_1.__decorate([\n customElement({\n tag: 'demo-menu',\n events: ['onSelected']\n }),\n theme(css)\n], Menu);\nexport { Menu };\nexport default Menu;\n" }, { "id": "./src/menu/menu.m.css", diff --git a/test-app/fixtures/unix/test/functional.js b/test-app/fixtures/unix/test/functional.js index 03f5e21..b45b291 100644 --- a/test-app/fixtures/unix/test/functional.js +++ b/test-app/fixtures/unix/test/functional.js @@ -103,4 +103,4 @@ module.exports = __webpack_require__("./tests/functional/main.ts"); /***/ }) /******/ }));; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgMGJhYmY2MDU5YmUzOTNmMmEzZGYiLCJ3ZWJwYWNrOi8vLy4vdGVzdHMvZnVuY3Rpb25hbC9hbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7O0FDN0RBIiwiZmlsZSI6ImZ1bmN0aW9uYWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCAwYmFiZjYwNTliZTM5M2YyYTNkZiIsImltcG9ydCAnLi9tYWluJztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kdHMtbG9hZGVyP3R5cGU9dHMmaW5zdGFuY2VOYW1lPTBfY3VzdG9tLWVsZW1lbnRzIS4vdGVzdHMvZnVuY3Rpb25hbC9hbGwudHMiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgZWYzNTAzNjRjNjU4OTg4ZTRiMzMiLCJ3ZWJwYWNrOi8vLy4vdGVzdHMvZnVuY3Rpb25hbC9hbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7O0FDN0RBIiwiZmlsZSI6ImZ1bmN0aW9uYWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCBlZjM1MDM2NGM2NTg5ODhlNGIzMyIsImltcG9ydCAnLi9tYWluJztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kdHMtbG9hZGVyP3R5cGU9dHMmaW5zdGFuY2VOYW1lPTBfY3VzdG9tLWVsZW1lbnRzIS4vdGVzdHMvZnVuY3Rpb25hbC9hbGwudHMiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/test-app/fixtures/unix/test/unit.js b/test-app/fixtures/unix/test/unit.js index d4685f4..2b91409 100644 --- a/test-app/fixtures/unix/test/unit.js +++ b/test-app/fixtures/unix/test/unit.js @@ -73,15 +73,15 @@ /************************************************************************/ /******/ ({ -/***/ "./node_modules/@dojo/core/Destroyable.js": +/***/ "./node_modules/@dojo/framework/core/Destroyable.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var lang_1 = __webpack_require__("./node_modules/@dojo/core/lang.js"); -var Promise_1 = __webpack_require__("./node_modules/@dojo/shim/Promise.js"); +var lang_1 = __webpack_require__("./node_modules/@dojo/framework/core/lang.js"); +var Promise_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Promise.js"); /** * No operation function to replace own once instance is destoryed */ @@ -142,15 +142,15 @@ exports.default = Destroyable; /***/ }), -/***/ "./node_modules/@dojo/core/Evented.js": +/***/ "./node_modules/@dojo/framework/core/Evented.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var Map_1 = __webpack_require__("./node_modules/@dojo/shim/Map.js"); -var Destroyable_1 = __webpack_require__("./node_modules/@dojo/core/Destroyable.js"); +var Map_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Map.js"); +var Destroyable_1 = __webpack_require__("./node_modules/@dojo/framework/core/Destroyable.js"); /** * Map of computed regular expressions, keyed by string */ @@ -194,7 +194,7 @@ var Evented = /** @class */ (function (_super) { var _this = this; this.listenersMap.forEach(function (methods, type) { if (isGlobMatch(type, event.type)) { - methods.forEach(function (method) { + tslib_1.__spread(methods).forEach(function (method) { method.call(_this, event); }); } @@ -232,15 +232,15 @@ exports.default = Evented; /***/ }), -/***/ "./node_modules/@dojo/core/lang.js": +/***/ "./node_modules/@dojo/framework/core/lang.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var object_1 = __webpack_require__("./node_modules/@dojo/shim/object.js"); -var object_2 = __webpack_require__("./node_modules/@dojo/shim/object.js"); +var object_1 = __webpack_require__("./node_modules/@dojo/framework/shim/object.js"); +var object_2 = __webpack_require__("./node_modules/@dojo/framework/shim/object.js"); exports.assign = object_2.assign; var slice = Array.prototype.slice; var hasOwnProperty = Object.prototype.hasOwnProperty; @@ -477,7 +477,7 @@ exports.createCompositeHandle = createCompositeHandle; /***/ }), -/***/ "./node_modules/@dojo/has/has.js": +/***/ "./node_modules/@dojo/framework/has/has.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -689,18 +689,18 @@ add('host-node', function () { /***/ }), -/***/ "./node_modules/@dojo/shim/Map.js": +/***/ "./node_modules/@dojo/framework/shim/Map.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var iterator_1 = __webpack_require__("./node_modules/@dojo/shim/iterator.js"); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); -var object_1 = __webpack_require__("./node_modules/@dojo/shim/object.js"); -var has_1 = __webpack_require__("./node_modules/@dojo/shim/support/has.js"); -__webpack_require__("./node_modules/@dojo/shim/Symbol.js"); +var iterator_1 = __webpack_require__("./node_modules/@dojo/framework/shim/iterator.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); +var object_1 = __webpack_require__("./node_modules/@dojo/framework/shim/object.js"); +var has_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.js"); +__webpack_require__("./node_modules/@dojo/framework/shim/Symbol.js"); exports.Map = global_1.default.Map; if (!has_1.default('es6-map')) { exports.Map = (_a = /** @class */ (function () { @@ -812,17 +812,17 @@ var _a; /***/ }), -/***/ "./node_modules/@dojo/shim/Promise.js": +/***/ "./node_modules/@dojo/framework/shim/Promise.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); -var queue_1 = __webpack_require__("./node_modules/@dojo/shim/support/queue.js"); -__webpack_require__("./node_modules/@dojo/shim/Symbol.js"); -var has_1 = __webpack_require__("./node_modules/@dojo/shim/support/has.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); +var queue_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/queue.js"); +__webpack_require__("./node_modules/@dojo/framework/shim/Symbol.js"); +var has_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.js"); exports.ShimPromise = global_1.default.Promise; exports.isThenable = function isThenable(value) { return value && typeof value.then === 'function'; @@ -1045,17 +1045,17 @@ var _a; /***/ }), -/***/ "./node_modules/@dojo/shim/Set.js": +/***/ "./node_modules/@dojo/framework/shim/Set.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); -var iterator_1 = __webpack_require__("./node_modules/@dojo/shim/iterator.js"); -var has_1 = __webpack_require__("./node_modules/@dojo/shim/support/has.js"); -__webpack_require__("./node_modules/@dojo/shim/Symbol.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); +var iterator_1 = __webpack_require__("./node_modules/@dojo/framework/shim/iterator.js"); +var has_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.js"); +__webpack_require__("./node_modules/@dojo/framework/shim/Symbol.js"); exports.Set = global_1.default.Set; if (!has_1.default('es6-set')) { exports.Set = (_a = /** @class */ (function () { @@ -1145,15 +1145,15 @@ var _a; /***/ }), -/***/ "./node_modules/@dojo/shim/Symbol.js": +/***/ "./node_modules/@dojo/framework/shim/Symbol.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var has_1 = __webpack_require__("./node_modules/@dojo/shim/support/has.js"); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); -var util_1 = __webpack_require__("./node_modules/@dojo/shim/support/util.js"); +var has_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); +var util_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/util.js"); exports.Symbol = global_1.default.Symbol; if (!has_1.default('es6-symbol')) { /** @@ -1300,17 +1300,17 @@ exports.default = exports.Symbol; /***/ }), -/***/ "./node_modules/@dojo/shim/WeakMap.js": +/***/ "./node_modules/@dojo/framework/shim/WeakMap.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); -var iterator_1 = __webpack_require__("./node_modules/@dojo/shim/iterator.js"); -var has_1 = __webpack_require__("./node_modules/@dojo/shim/support/has.js"); -__webpack_require__("./node_modules/@dojo/shim/Symbol.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); +var iterator_1 = __webpack_require__("./node_modules/@dojo/framework/shim/iterator.js"); +var has_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.js"); +__webpack_require__("./node_modules/@dojo/framework/shim/Symbol.js"); exports.WeakMap = global_1.default.WeakMap; if (!has_1.default('es6-weakmap')) { var DELETED_1 = {}; @@ -1433,18 +1433,18 @@ exports.default = exports.WeakMap; /***/ }), -/***/ "./node_modules/@dojo/shim/array.js": +/***/ "./node_modules/@dojo/framework/shim/array.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); -var iterator_1 = __webpack_require__("./node_modules/@dojo/shim/iterator.js"); -var number_1 = __webpack_require__("./node_modules/@dojo/shim/number.js"); -var has_1 = __webpack_require__("./node_modules/@dojo/shim/support/has.js"); -var util_1 = __webpack_require__("./node_modules/@dojo/shim/support/util.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); +var iterator_1 = __webpack_require__("./node_modules/@dojo/framework/shim/iterator.js"); +var number_1 = __webpack_require__("./node_modules/@dojo/framework/shim/number.js"); +var has_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.js"); +var util_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/util.js"); if (has_1.default('es6-array') && has_1.default('es6-array-fill')) { exports.from = global_1.default.Array.from; exports.of = global_1.default.Array.of; @@ -1649,7 +1649,7 @@ else { /***/ }), -/***/ "./node_modules/@dojo/shim/global.js": +/***/ "./node_modules/@dojo/framework/shim/global.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1677,14 +1677,14 @@ exports.default = globalObject; /***/ }), -/***/ "./node_modules/@dojo/shim/iterator.js": +/***/ "./node_modules/@dojo/framework/shim/iterator.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -__webpack_require__("./node_modules/@dojo/shim/Symbol.js"); -var string_1 = __webpack_require__("./node_modules/@dojo/shim/string.js"); +__webpack_require__("./node_modules/@dojo/framework/shim/Symbol.js"); +var string_1 = __webpack_require__("./node_modules/@dojo/framework/shim/string.js"); var staticDone = { done: true, value: undefined }; /** * A class that _shims_ an iterator interface on array like objects. @@ -1803,13 +1803,13 @@ exports.forOf = forOf; /***/ }), -/***/ "./node_modules/@dojo/shim/number.js": +/***/ "./node_modules/@dojo/framework/shim/number.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); /** * The smallest interval between two representable numbers. */ @@ -1870,15 +1870,15 @@ exports.isSafeInteger = isSafeInteger; /***/ }), -/***/ "./node_modules/@dojo/shim/object.js": +/***/ "./node_modules/@dojo/framework/shim/object.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); -var has_1 = __webpack_require__("./node_modules/@dojo/shim/support/has.js"); -var Symbol_1 = __webpack_require__("./node_modules/@dojo/shim/Symbol.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); +var has_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.js"); +var Symbol_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.js"); if (has_1.default('es6-object')) { var globalObject = global_1.default.Object; exports.assign = globalObject.assign; @@ -1959,16 +1959,16 @@ else { /***/ }), -/***/ "./node_modules/@dojo/shim/string.js": +/***/ "./node_modules/@dojo/framework/shim/string.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); -var has_1 = __webpack_require__("./node_modules/@dojo/shim/support/has.js"); -var util_1 = __webpack_require__("./node_modules/@dojo/shim/support/util.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); +var has_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.js"); +var util_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/util.js"); /** * The minimum location of high surrogates */ @@ -2198,17 +2198,17 @@ else { /***/ }), -/***/ "./node_modules/@dojo/shim/support/has.js": +/***/ "./node_modules/@dojo/framework/shim/support/has.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var has_1 = __webpack_require__("./node_modules/@dojo/has/has.js"); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); +var has_1 = __webpack_require__("./node_modules/@dojo/framework/has/has.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); exports.default = has_1.default; -tslib_1.__exportStar(__webpack_require__("./node_modules/@dojo/has/has.js"), exports); +tslib_1.__exportStar(__webpack_require__("./node_modules/@dojo/framework/has/has.js"), exports); /* ECMAScript 6 and 7 Features */ /* Array */ has_1.add('es6-array', function () { @@ -2379,14 +2379,14 @@ var templateObject_1; /***/ }), -/***/ "./node_modules/@dojo/shim/support/queue.js": +/***/ "./node_modules/@dojo/framework/shim/support/queue.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(setImmediate) { Object.defineProperty(exports, "__esModule", { value: true }); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); -var has_1 = __webpack_require__("./node_modules/@dojo/shim/support/has.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); +var has_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.js"); function executeTask(item) { if (item && item.isActive && item.callback) { item.callback(); @@ -2575,7 +2575,7 @@ exports.queueMicroTask = (function () { /***/ }), -/***/ "./node_modules/@dojo/shim/support/util.js": +/***/ "./node_modules/@dojo/framework/shim/support/util.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2616,16 +2616,16 @@ exports.wrapNative = wrapNative; /***/ }), -/***/ "./node_modules/@dojo/test-extras/harness.js": +/***/ "./node_modules/@dojo/framework/testing/harness.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var assertRender_1 = __webpack_require__("./node_modules/@dojo/test-extras/support/assertRender.js"); -var selector_1 = __webpack_require__("./node_modules/@dojo/test-extras/support/selector.js"); -var d_1 = __webpack_require__("./node_modules/@dojo/widget-core/d.js"); +var assertRender_1 = __webpack_require__("./node_modules/@dojo/framework/testing/support/assertRender.js"); +var selector_1 = __webpack_require__("./node_modules/@dojo/framework/testing/support/selector.js"); +var d_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.js"); function decorateNodes(dNode) { var hasDeferredProperties = false; function addParent(parent) { @@ -2762,18 +2762,18 @@ exports.default = harness; /***/ }), -/***/ "./node_modules/@dojo/test-extras/support/assertRender.js": +/***/ "./node_modules/@dojo/framework/testing/support/assertRender.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var d_1 = __webpack_require__("./node_modules/@dojo/widget-core/d.js"); +var d_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.js"); var diff = __webpack_require__("./node_modules/diff/dist/diff.js"); -var WeakMap_1 = __webpack_require__("./node_modules/@dojo/shim/WeakMap.js"); -var Set_1 = __webpack_require__("./node_modules/@dojo/shim/Set.js"); -var Map_1 = __webpack_require__("./node_modules/@dojo/shim/Map.js"); -var array_1 = __webpack_require__("./node_modules/@dojo/shim/array.js"); +var WeakMap_1 = __webpack_require__("./node_modules/@dojo/framework/shim/WeakMap.js"); +var Set_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Set.js"); +var Map_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Map.js"); +var array_1 = __webpack_require__("./node_modules/@dojo/framework/shim/array.js"); var widgetClassCounter = 0; var widgetMap = new WeakMap_1.default(); function replacer(key, value) { @@ -2883,14 +2883,14 @@ exports.default = assertRender; /***/ }), -/***/ "./node_modules/@dojo/test-extras/support/selector.js": +/***/ "./node_modules/@dojo/framework/testing/support/selector.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var d_1 = __webpack_require__("./node_modules/@dojo/widget-core/d.js"); +var d_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.js"); var cssSelect = __webpack_require__("./node_modules/css-select-umd/dist/index.js"); exports.parseSelector = function (selector) { var selectors = selector.split(' '); @@ -3000,51 +3000,14 @@ exports.default = select; /***/ }), -/***/ "./node_modules/@dojo/webpack-contrib/css-module-decorator-loader/index.js!./node_modules/css-loader/index.js?{\"modules\":true,\"sourceMap\":true,\"importLoaders\":1,\"localIdentName\":\"[hash:base64:8]\"}!./node_modules/postcss-loader/lib/index.js?{\"ident\":\"postcss\",\"plugins\":[null,{\"version\":\"6.0.23\",\"plugins\":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],\"postcssPlugin\":\"postcss-cssnext\",\"postcssVersion\":\"6.0.23\"}]}!./node_modules/@dojo/webpack-contrib/css-module-dts-loader/index.js?type=css!./src/menu-item/menuItem.m.css": -/***/ (function(module, exports, __webpack_require__) { - -exports = module.exports = __webpack_require__("./node_modules/css-loader/lib/css-base.js")(true); -// imports - - -// module -exports.push([module.i, ".sUmUi4Sh {\n\theight: 100%;\n\tdisplay: inline-block;\n}\n\n._2Mk6Rdqa {\n\tcolor: #fff;\n\ttext-decoration: none;\n\tmargin: 0 6.4px;\n\tposition: relative;\n\tdisplay: -webkit-box;\n\tdisplay: -ms-flexbox;\n\tdisplay: flex;\n\t-webkit-box-orient: vertical;\n\t-webkit-box-direction: normal;\n\t -ms-flex-direction: column;\n\t flex-direction: column;\n\t-webkit-box-pack: center;\n\t -ms-flex-pack: center;\n\t justify-content: center;\n\theight: 48px;\n\tcursor: pointer;\n}\n\n._2Mk6Rdqa::after {\n\tdisplay: block;\n\tcontent: \"\";\n\tbackground: #fff;\n\theight: 2px;\n\tposition: absolute;\n\twidth: 100%;\n\tbottom: 0;\n\t-webkit-transition: -webkit-transform .3s ease-out;\n\ttransition: -webkit-transform .3s ease-out;\n\ttransition: transform .3s ease-out;\n\ttransition: transform .3s ease-out, -webkit-transform .3s ease-out;\n\t-webkit-transform: translateY(3px);\n\t transform: translateY(3px);\n}\n\n._1-f3ItOh::after {\n\t-webkit-transform: translateY(0);\n\t transform: translateY(0);\n}\n", "", {"version":3,"sources":["/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu-item/menuItem.m.css"],"names":[],"mappings":"AAAA;CACC,aAAa;CACb,sBAAsB;CACtB;;AAED;CACC,YAAY;CACZ,sBAAsB;CACtB,gBAAgB;CAChB,mBAAmB;CACnB,qBAAqB;CACrB,qBAAqB;CACrB,cAAc;CACd,6BAA6B;CAC7B,8BAA8B;KAC1B,2BAA2B;SACvB,uBAAuB;CAC/B,yBAAyB;KACrB,sBAAsB;SAClB,wBAAwB;CAChC,aAAa;CACb,gBAAgB;CAChB;;AAED;CACC,eAAe;CACf,YAAY;CACZ,iBAAiB;CACjB,YAAY;CACZ,mBAAmB;CACnB,YAAY;CACZ,UAAU;CACV,mDAAmD;CACnD,2CAA2C;CAC3C,mCAAmC;CACnC,mEAAmE;CACnE,mCAAmC;SAC3B,2BAA2B;CACnC;;AAED;CACC,iCAAiC;SACzB,yBAAyB;CACjC","file":"menuItem.m.css","sourcesContent":[".root {\n\theight: 100%;\n\tdisplay: inline-block;\n}\n\n.item {\n\tcolor: #fff;\n\ttext-decoration: none;\n\tmargin: 0 6.4px;\n\tposition: relative;\n\tdisplay: -webkit-box;\n\tdisplay: -ms-flexbox;\n\tdisplay: flex;\n\t-webkit-box-orient: vertical;\n\t-webkit-box-direction: normal;\n\t -ms-flex-direction: column;\n\t flex-direction: column;\n\t-webkit-box-pack: center;\n\t -ms-flex-pack: center;\n\t justify-content: center;\n\theight: 48px;\n\tcursor: pointer;\n}\n\n.item::after {\n\tdisplay: block;\n\tcontent: \"\";\n\tbackground: #fff;\n\theight: 2px;\n\tposition: absolute;\n\twidth: 100%;\n\tbottom: 0;\n\t-webkit-transition: -webkit-transform .3s ease-out;\n\ttransition: -webkit-transform .3s ease-out;\n\ttransition: transform .3s ease-out;\n\ttransition: transform .3s ease-out, -webkit-transform .3s ease-out;\n\t-webkit-transform: translateY(3px);\n\t transform: translateY(3px);\n}\n\n.selected::after {\n\t-webkit-transform: translateY(0);\n\t transform: translateY(0);\n}\n"],"sourceRoot":""}]); - -// exports -exports.locals = {" _key": "test-app/menuItem", - "root": "sUmUi4Sh", - "item": "_2Mk6Rdqa", - "selected": "_1-f3ItOh" -}; - -/***/ }), - -/***/ "./node_modules/@dojo/webpack-contrib/css-module-decorator-loader/index.js!./node_modules/css-loader/index.js?{\"modules\":true,\"sourceMap\":true,\"importLoaders\":1,\"localIdentName\":\"[hash:base64:8]\"}!./node_modules/postcss-loader/lib/index.js?{\"ident\":\"postcss\",\"plugins\":[null,{\"version\":\"6.0.23\",\"plugins\":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],\"postcssPlugin\":\"postcss-cssnext\",\"postcssVersion\":\"6.0.23\"}]}!./node_modules/@dojo/webpack-contrib/css-module-dts-loader/index.js?type=css!./src/menu/menu.m.css": -/***/ (function(module, exports, __webpack_require__) { - -exports = module.exports = __webpack_require__("./node_modules/css-loader/lib/css-base.js")(true); -// imports - - -// module -exports.push([module.i, "._3bA6jdSn {\n\twidth: 100%;\n\ttop: 0;\n\theight: 48px;\n\tz-index: 100;\n\tbackground-color: #1d1f20;\n}\n\n._1eoGfqku {\n\theight: 100%;\n\tmargin: 0 auto;\n}\n", "", {"version":3,"sources":["/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu/menu.m.css"],"names":[],"mappings":"AAAA;CACC,YAAY;CACZ,OAAO;CACP,aAAa;CACb,aAAa;CACb,0BAA0B;CAC1B;;AAED;CACC,aAAa;CACb,eAAe;CACf","file":"menu.m.css","sourcesContent":[".root {\n\twidth: 100%;\n\ttop: 0;\n\theight: 48px;\n\tz-index: 100;\n\tbackground-color: #1d1f20;\n}\n\n.menuContainer {\n\theight: 100%;\n\tmargin: 0 auto;\n}\n"],"sourceRoot":""}]); - -// exports -exports.locals = {" _key": "test-app/menu", - "root": "_3bA6jdSn", - "menuContainer": "_1eoGfqku" -}; - -/***/ }), - -/***/ "./node_modules/@dojo/widget-core/Injector.js": +/***/ "./node_modules/@dojo/framework/widget-core/Injector.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var Evented_1 = __webpack_require__("./node_modules/@dojo/core/Evented.js"); +var Evented_1 = __webpack_require__("./node_modules/@dojo/framework/core/Evented.js"); var Injector = /** @class */ (function (_super) { tslib_1.__extends(Injector, _super); function Injector(payload) { @@ -3072,15 +3035,15 @@ exports.default = Injector; /***/ }), -/***/ "./node_modules/@dojo/widget-core/NodeHandler.js": +/***/ "./node_modules/@dojo/framework/widget-core/NodeHandler.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var Evented_1 = __webpack_require__("./node_modules/@dojo/core/Evented.js"); -var Map_1 = __webpack_require__("./node_modules/@dojo/shim/Map.js"); +var Evented_1 = __webpack_require__("./node_modules/@dojo/framework/core/Evented.js"); +var Map_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Map.js"); /** * Enum to identify the type of event. * Listening to 'Projector' will notify when projector is created or updated @@ -3125,17 +3088,17 @@ exports.default = NodeHandler; /***/ }), -/***/ "./node_modules/@dojo/widget-core/Registry.js": +/***/ "./node_modules/@dojo/framework/widget-core/Registry.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var Promise_1 = __webpack_require__("./node_modules/@dojo/shim/Promise.js"); -var Map_1 = __webpack_require__("./node_modules/@dojo/shim/Map.js"); -var Symbol_1 = __webpack_require__("./node_modules/@dojo/shim/Symbol.js"); -var Evented_1 = __webpack_require__("./node_modules/@dojo/core/Evented.js"); +var Promise_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Promise.js"); +var Map_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Map.js"); +var Symbol_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.js"); +var Evented_1 = __webpack_require__("./node_modules/@dojo/framework/core/Evented.js"); /** * Widget base symbol type */ @@ -3258,16 +3221,16 @@ exports.default = Registry; /***/ }), -/***/ "./node_modules/@dojo/widget-core/RegistryHandler.js": +/***/ "./node_modules/@dojo/framework/widget-core/RegistryHandler.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var Map_1 = __webpack_require__("./node_modules/@dojo/shim/Map.js"); -var Evented_1 = __webpack_require__("./node_modules/@dojo/core/Evented.js"); -var Registry_1 = __webpack_require__("./node_modules/@dojo/widget-core/Registry.js"); +var Map_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Map.js"); +var Evented_1 = __webpack_require__("./node_modules/@dojo/framework/core/Evented.js"); +var Registry_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.js"); var RegistryHandler = /** @class */ (function (_super) { tslib_1.__extends(RegistryHandler, _super); function RegistryHandler() { @@ -3351,22 +3314,22 @@ exports.default = RegistryHandler; /***/ }), -/***/ "./node_modules/@dojo/widget-core/WidgetBase.js": +/***/ "./node_modules/@dojo/framework/widget-core/WidgetBase.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var Map_1 = __webpack_require__("./node_modules/@dojo/shim/Map.js"); -var WeakMap_1 = __webpack_require__("./node_modules/@dojo/shim/WeakMap.js"); -var Symbol_1 = __webpack_require__("./node_modules/@dojo/shim/Symbol.js"); -var d_1 = __webpack_require__("./node_modules/@dojo/widget-core/d.js"); -var diff_1 = __webpack_require__("./node_modules/@dojo/widget-core/diff.js"); -var RegistryHandler_1 = __webpack_require__("./node_modules/@dojo/widget-core/RegistryHandler.js"); -var NodeHandler_1 = __webpack_require__("./node_modules/@dojo/widget-core/NodeHandler.js"); -var vdom_1 = __webpack_require__("./node_modules/@dojo/widget-core/vdom.js"); -var Registry_1 = __webpack_require__("./node_modules/@dojo/widget-core/Registry.js"); +var Map_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Map.js"); +var WeakMap_1 = __webpack_require__("./node_modules/@dojo/framework/shim/WeakMap.js"); +var Symbol_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.js"); +var d_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.js"); +var diff_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/diff.js"); +var RegistryHandler_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/RegistryHandler.js"); +var NodeHandler_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/NodeHandler.js"); +var vdom_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/vdom.js"); +var Registry_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.js"); var decoratorMap = new Map_1.default(); var boundAuto = diff_1.auto.bind(null); exports.noBind = Symbol_1.default.for('dojoNoBind'); @@ -3474,7 +3437,7 @@ var WidgetBase = /** @class */ (function () { if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) { var allProperties = tslib_1.__spread(propertyNames, Object.keys(this._properties)); var checkedProperties = []; - var diffPropertyResults = {}; + var diffPropertyResults_1 = {}; var runReactions = false; for (var i = 0; i < allProperties.length; i++) { var propertyName = allProperties[i]; @@ -3493,7 +3456,7 @@ var WidgetBase = /** @class */ (function () { changedPropertyKeys.push(propertyName); } if (propertyName in properties) { - diffPropertyResults[propertyName] = result.value; + diffPropertyResults_1[propertyName] = result.value; } } } @@ -3503,18 +3466,24 @@ var WidgetBase = /** @class */ (function () { changedPropertyKeys.push(propertyName); } if (propertyName in properties) { - diffPropertyResults[propertyName] = result.value; + diffPropertyResults_1[propertyName] = result.value; } } } if (runReactions) { - this._mapDiffPropertyReactions(properties, changedPropertyKeys).forEach(function (args, reaction) { - if (args.changed) { - reaction.call(_this, args.previousProperties, args.newProperties); + var reactionFunctions = this.getDecorator('diffReaction'); + var executedReactions_1 = []; + reactionFunctions.forEach(function (_a) { + var reaction = _a.reaction, propertyName = _a.propertyName; + var propertyChanged = changedPropertyKeys.indexOf(propertyName) !== -1; + var reactionRun = executedReactions_1.indexOf(reaction) !== -1; + if (propertyChanged && !reactionRun) { + reaction.call(_this, _this._properties, diffPropertyResults_1); + executedReactions_1.push(reaction); } }); } - this._properties = diffPropertyResults; + this._properties = diffPropertyResults_1; this._changedPropertyKeys = changedPropertyKeys; } else { @@ -3629,28 +3598,6 @@ var WidgetBase = /** @class */ (function () { this._decoratorCache.set(decoratorKey, allDecorators); return allDecorators; }; - WidgetBase.prototype._mapDiffPropertyReactions = function (newProperties, changedPropertyKeys) { - var _this = this; - var reactionFunctions = this.getDecorator('diffReaction'); - return reactionFunctions.reduce(function (reactionPropertyMap, _a) { - var reaction = _a.reaction, propertyName = _a.propertyName; - var reactionArguments = reactionPropertyMap.get(reaction); - if (reactionArguments === undefined) { - reactionArguments = { - previousProperties: {}, - newProperties: {}, - changed: false - }; - } - reactionArguments.previousProperties[propertyName] = _this._properties[propertyName]; - reactionArguments.newProperties[propertyName] = newProperties[propertyName]; - if (changedPropertyKeys.indexOf(propertyName) !== -1) { - reactionArguments.changed = true; - } - reactionPropertyMap.set(reaction, reactionArguments); - return reactionPropertyMap; - }, new Map_1.default()); - }; /** * Binds unbound property functions to the specified `bind` property * @@ -3720,7 +3667,7 @@ var WidgetBase = /** @class */ (function () { var _this = this; var afterRenders = this.getDecorator('afterRender'); if (afterRenders.length > 0) { - return afterRenders.reduce(function (dNode, afterRenderFunction) { + dNode = afterRenders.reduce(function (dNode, afterRenderFunction) { return afterRenderFunction.call(_this, dNode); }, dNode); } @@ -3761,7 +3708,7 @@ exports.default = WidgetBase; /***/ }), -/***/ "./node_modules/@dojo/widget-core/animations/cssTransitions.js": +/***/ "./node_modules/@dojo/framework/widget-core/animations/cssTransitions.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3833,14 +3780,14 @@ exports.default = { /***/ }), -/***/ "./node_modules/@dojo/widget-core/d.js": +/***/ "./node_modules/@dojo/framework/widget-core/d.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var Symbol_1 = __webpack_require__("./node_modules/@dojo/shim/Symbol.js"); +var Symbol_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.js"); /** * The symbol identifier for a WNode type */ @@ -3964,13 +3911,13 @@ exports.dom = dom; /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/afterRender.js": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/afterRender.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.js"); +var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.js"); function afterRender(method) { return handleDecorator_1.handleDecorator(function (target, propertyKey) { target.addDecorator('afterRender', propertyKey ? target[propertyKey] : method); @@ -3982,14 +3929,14 @@ exports.default = afterRender; /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/alwaysRender.js": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.js"); -var beforeProperties_1 = __webpack_require__("./node_modules/@dojo/widget-core/decorators/beforeProperties.js"); +var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.js"); +var beforeProperties_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.js"); function alwaysRender() { return handleDecorator_1.handleDecorator(function (target, propertyKey) { beforeProperties_1.beforeProperties(function () { @@ -4003,13 +3950,13 @@ exports.default = alwaysRender; /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/beforeProperties.js": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.js"); +var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.js"); function beforeProperties(method) { return handleDecorator_1.handleDecorator(function (target, propertyKey) { target.addDecorator('beforeProperties', propertyKey ? target[propertyKey] : method); @@ -4021,14 +3968,14 @@ exports.default = beforeProperties; /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/customElement.js": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/customElement.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var registerCustomElement_1 = __webpack_require__("./node_modules/@dojo/widget-core/registerCustomElement.js"); -var Registry_1 = __webpack_require__("./node_modules/@dojo/widget-core/Registry.js"); +var registerCustomElement_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/registerCustomElement.js"); +var Registry_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.js"); /** * This Decorator is provided properties that define the behavior of a custom element, and * registers that custom element. @@ -4052,13 +3999,14 @@ exports.default = customElement; /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/diffProperty.js": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.js"); +var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.js"); +var diff_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/diff.js"); /** * Decorator that can be used to register a function as a specific property diff * @@ -4067,6 +4015,7 @@ var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/widget-core/de * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM */ function diffProperty(propertyName, diffFunction, reactionFunction) { + if (diffFunction === void 0) { diffFunction = diff_1.auto; } return handleDecorator_1.handleDecorator(function (target, propertyKey) { target.addDecorator("diffProperty:" + propertyName, diffFunction.bind(null)); target.addDecorator('registeredDiffProperty', propertyName); @@ -4084,7 +4033,7 @@ exports.default = diffProperty; /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/handleDecorator.js": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4112,15 +4061,15 @@ exports.default = handleDecorator; /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/inject.js": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/inject.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var WeakMap_1 = __webpack_require__("./node_modules/@dojo/shim/WeakMap.js"); -var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.js"); -var beforeProperties_1 = __webpack_require__("./node_modules/@dojo/widget-core/decorators/beforeProperties.js"); +var WeakMap_1 = __webpack_require__("./node_modules/@dojo/framework/shim/WeakMap.js"); +var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.js"); +var beforeProperties_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.js"); /** * Map of instances against registered injectors. */ @@ -4161,13 +4110,13 @@ exports.default = inject; /***/ }), -/***/ "./node_modules/@dojo/widget-core/diff.js": +/***/ "./node_modules/@dojo/framework/widget-core/diff.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var Registry_1 = __webpack_require__("./node_modules/@dojo/widget-core/Registry.js"); +var Registry_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.js"); function isObjectOrArray(value) { return Object.prototype.toString.call(value) === '[object Object]' || Array.isArray(value); } @@ -4241,18 +4190,18 @@ exports.auto = auto; /***/ }), -/***/ "./node_modules/@dojo/widget-core/mixins/Projector.js": +/***/ "./node_modules/@dojo/framework/widget-core/mixins/Projector.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var lang_1 = __webpack_require__("./node_modules/@dojo/core/lang.js"); -var cssTransitions_1 = __webpack_require__("./node_modules/@dojo/widget-core/animations/cssTransitions.js"); -var afterRender_1 = __webpack_require__("./node_modules/@dojo/widget-core/decorators/afterRender.js"); -var d_1 = __webpack_require__("./node_modules/@dojo/widget-core/d.js"); -var vdom_1 = __webpack_require__("./node_modules/@dojo/widget-core/vdom.js"); +var lang_1 = __webpack_require__("./node_modules/@dojo/framework/core/lang.js"); +var cssTransitions_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/animations/cssTransitions.js"); +var afterRender_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/afterRender.js"); +var d_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.js"); +var vdom_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/vdom.js"); /** * Represents the attach state of the projector */ @@ -4412,10 +4361,7 @@ function ProjectorMixin(Base) { return this._attachHandle; }; tslib_1.__decorate([ - afterRender_1.afterRender(), - tslib_1.__metadata("design:type", Function), - tslib_1.__metadata("design:paramtypes", [Object]), - tslib_1.__metadata("design:returntype", void 0) + afterRender_1.afterRender() ], Projector.prototype, "afterRender", null); return Projector; }(Base)); @@ -4427,18 +4373,18 @@ exports.default = ProjectorMixin; /***/ }), -/***/ "./node_modules/@dojo/widget-core/mixins/Themed.js": +/***/ "./node_modules/@dojo/framework/widget-core/mixins/Themed.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var Injector_1 = __webpack_require__("./node_modules/@dojo/widget-core/Injector.js"); -var inject_1 = __webpack_require__("./node_modules/@dojo/widget-core/decorators/inject.js"); -var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.js"); -var diffProperty_1 = __webpack_require__("./node_modules/@dojo/widget-core/decorators/diffProperty.js"); -var diff_1 = __webpack_require__("./node_modules/@dojo/widget-core/diff.js"); +var Injector_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/Injector.js"); +var inject_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/inject.js"); +var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.js"); +var diffProperty_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/diffProperty.js"); +var diff_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/diff.js"); var THEME_KEY = ' _key'; exports.INJECTED_THEME_KEY = Symbol('theme'); /** @@ -4562,10 +4508,7 @@ function ThemedMixin(Base) { }; tslib_1.__decorate([ diffProperty_1.diffProperty('theme', diff_1.shallow), - diffProperty_1.diffProperty('extraClasses', diff_1.shallow), - tslib_1.__metadata("design:type", Function), - tslib_1.__metadata("design:paramtypes", []), - tslib_1.__metadata("design:returntype", void 0) + diffProperty_1.diffProperty('extraClasses', diff_1.shallow) ], Themed.prototype, "onPropertiesChanged", null); Themed = tslib_1.__decorate([ inject_1.inject({ @@ -4588,20 +4531,20 @@ exports.default = ThemedMixin; /***/ }), -/***/ "./node_modules/@dojo/widget-core/registerCustomElement.js": +/***/ "./node_modules/@dojo/framework/widget-core/registerCustomElement.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var WidgetBase_1 = __webpack_require__("./node_modules/@dojo/widget-core/WidgetBase.js"); -var Projector_1 = __webpack_require__("./node_modules/@dojo/widget-core/mixins/Projector.js"); -var array_1 = __webpack_require__("./node_modules/@dojo/shim/array.js"); -var d_1 = __webpack_require__("./node_modules/@dojo/widget-core/d.js"); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); -var Themed_1 = __webpack_require__("./node_modules/@dojo/widget-core/mixins/Themed.js"); -var alwaysRender_1 = __webpack_require__("./node_modules/@dojo/widget-core/decorators/alwaysRender.js"); +var WidgetBase_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/WidgetBase.js"); +var Projector_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/mixins/Projector.js"); +var array_1 = __webpack_require__("./node_modules/@dojo/framework/shim/array.js"); +var d_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); +var Themed_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/mixins/Themed.js"); +var alwaysRender_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.js"); var CustomElementChildType; (function (CustomElementChildType) { CustomElementChildType["DOJO"] = "DOJO"; @@ -4846,24 +4789,26 @@ exports.default = register; /***/ }), -/***/ "./node_modules/@dojo/widget-core/vdom.js": +/***/ "./node_modules/@dojo/framework/widget-core/vdom.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); -var array_1 = __webpack_require__("./node_modules/@dojo/shim/array.js"); -var d_1 = __webpack_require__("./node_modules/@dojo/widget-core/d.js"); -var Registry_1 = __webpack_require__("./node_modules/@dojo/widget-core/Registry.js"); -var WeakMap_1 = __webpack_require__("./node_modules/@dojo/shim/WeakMap.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); +var array_1 = __webpack_require__("./node_modules/@dojo/framework/shim/array.js"); +var d_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.js"); +var Registry_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.js"); +var WeakMap_1 = __webpack_require__("./node_modules/@dojo/framework/shim/WeakMap.js"); var NAMESPACE_W3 = 'http://www.w3.org/'; var NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg'; var NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink'; var emptyArray = []; +var nodeOperations = ['focus', 'blur', 'scrollIntoView', 'click']; exports.widgetInstanceMap = new WeakMap_1.default(); var instanceMap = new WeakMap_1.default(); +var nextSiblingMap = new WeakMap_1.default(); var projectorStateMap = new WeakMap_1.default(); function same(dnode1, dnode2) { if (d_1.isVNode(dnode1) && d_1.isVNode(dnode2)) { @@ -4981,7 +4926,7 @@ function buildPreviousProperties(domNode, previous, current) { }, {}); return newProperties; } -function focusNode(propValue, previousValue, domNode, projectionOptions) { +function nodeOperation(propName, propValue, previousValue, domNode, projectionOptions) { var result; if (typeof propValue === 'function') { result = propValue(); @@ -4992,7 +4937,7 @@ function focusNode(propValue, previousValue, domNode, projectionOptions) { if (result === true) { var projectorState = projectorStateMap.get(projectionOptions.projectorInstance); projectorState.deferredRenderCallbacks.push(function () { - domNode.focus(); + domNode[propName](); }); } } @@ -5090,8 +5035,8 @@ function updateProperties(domNode, previousProperties, properties, projectionOpt } } } - else if (propName === 'focus') { - focusNode(propValue, previousValue, domNode, projectionOptions); + else if (nodeOperations.indexOf(propName) !== -1) { + nodeOperation(propName, propValue, previousValue, domNode, projectionOptions); } else if (propName === 'styles') { var styleNames = Object.keys(propValue); @@ -5248,7 +5193,8 @@ function nodeAdded(dnode, transitions) { } function nodeToRemove(dnode, transitions, projectionOptions) { if (d_1.isWNode(dnode)) { - var rendered = dnode.rendered || emptyArray; + var item = instanceMap.get(dnode.instance); + var rendered = (item ? item.dnode.rendered : dnode.rendered) || emptyArray; if (dnode.instance) { var instanceData = exports.widgetInstanceMap.get(dnode.instance); instanceData.onDetach(); @@ -5312,7 +5258,7 @@ function checkDistinguishable(childNodes, indexToCheck, parentInstance) { } } } -function updateChildren(parentVNode, oldChildren, newChildren, parentInstance, projectionOptions) { +function updateChildren(parentVNode, siblings, oldChildren, newChildren, parentInstance, projectionOptions) { oldChildren = oldChildren || emptyArray; newChildren = newChildren; var oldChildrenLength = oldChildren.length; @@ -5332,38 +5278,49 @@ function updateChildren(parentVNode, oldChildren, newChildren, parentInstance, p addDeferredProperties(newChild, projectionOptions); } if (oldChild !== undefined && same(oldChild, newChild)) { - textUpdated = updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance) || textUpdated; oldIndex++; newIndex++; + textUpdated = + updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance, oldChildren.slice(oldIndex), newChildren.slice(newIndex)) || textUpdated; return "continue"; } var findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1); var addChild = function () { var insertBeforeDomNode = undefined; + var childrenArray = oldChildren; + var nextIndex = oldIndex + 1; var child = oldChildren[oldIndex]; + if (!child) { + child = siblings[0]; + nextIndex = 1; + childrenArray = siblings; + } if (child) { - var nextIndex = oldIndex + 1; var insertBeforeChildren = [child]; while (insertBeforeChildren.length) { var insertBefore = insertBeforeChildren.shift(); if (d_1.isWNode(insertBefore)) { - if (insertBefore.rendered) { - insertBeforeChildren.push.apply(insertBeforeChildren, tslib_1.__spread(insertBefore.rendered)); + var item = instanceMap.get(insertBefore.instance); + if (item && item.dnode.rendered) { + insertBeforeChildren.push.apply(insertBeforeChildren, tslib_1.__spread(item.dnode.rendered)); } } else { if (insertBefore.domNode) { + if (insertBefore.domNode.parentElement !== parentVNode.domNode) { + break; + } insertBeforeDomNode = insertBefore.domNode; break; } } - if (insertBeforeChildren.length === 0 && oldChildren[nextIndex]) { - insertBeforeChildren.push(oldChildren[nextIndex]); + if (insertBeforeChildren.length === 0 && childrenArray[nextIndex]) { + insertBeforeChildren.push(childrenArray[nextIndex]); nextIndex++; } } } - createDom(newChild, parentVNode, insertBeforeDomNode, projectionOptions, parentInstance); + createDom(newChild, parentVNode, newChildren.slice(newIndex + 1), insertBeforeDomNode, projectionOptions, parentInstance); nodeAdded(newChild, transitions); var indexToCheck = newIndex; projectorState.afterRenderCallbacks.push(function () { @@ -5437,6 +5394,7 @@ function addChildren(parentVNode, children, projectionOptions, parentInstance, i projectionOptions = tslib_1.__assign({}, projectionOptions, { depth: projectionOptions.depth + 1 }); for (var i = 0; i < children.length; i++) { var child = children[i]; + var nextSiblings = children.slice(i + 1); if (d_1.isVNode(child)) { if (projectorState.merge && childNodes) { var domElement = undefined; @@ -5447,10 +5405,10 @@ function addChildren(parentVNode, children, projectionOptions, parentInstance, i } } } - createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance); + createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance); } else { - createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes); + createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes); } nodeAdded(child, transitions); } @@ -5478,7 +5436,7 @@ function initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOpt } dnode.inserted = true; } -function createDom(dnode, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes) { +function createDom(dnode, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes) { var domNode; var projectorState = projectorStateMap.get(projectionOptions.projectorInstance); if (d_1.isWNode(dnode)) { @@ -5493,6 +5451,7 @@ function createDom(dnode, parentVNode, insertBefore, projectionOptions, parentIn } var instance_1 = new widgetConstructor(); dnode.instance = instance_1; + nextSiblingMap.set(instance_1, nextSiblings); var instanceData_1 = exports.widgetInstanceMap.get(instance_1); instanceData_1.invalidate = function () { instanceData_1.dirty = true; @@ -5573,7 +5532,7 @@ function createDom(dnode, parentVNode, insertBefore, projectionOptions, parentIn } } } -function updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance) { +function updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance, oldNextSiblings, nextSiblings) { if (d_1.isWNode(dnode)) { var instance = previous.instance; var _a = instanceMap.get(instance), parentVNode_1 = _a.parentVNode, node = _a.dnode; @@ -5583,12 +5542,13 @@ function updateDom(previous, dnode, projectionOptions, parentVNode, parentInstan instance.__setCoreProperties__(dnode.coreProperties); instance.__setChildren__(dnode.children); instance.__setProperties__(dnode.properties); + nextSiblingMap.set(instance, nextSiblings); dnode.instance = instance; if (instanceData.dirty === true) { var rendered = instance.__render__(); instanceData.rendering = false; dnode.rendered = filterAndDecorateChildren(rendered, instance); - updateChildren(parentVNode_1, previousRendered, dnode.rendered, instance, projectionOptions); + updateChildren(parentVNode_1, oldNextSiblings, previousRendered, dnode.rendered, instance, projectionOptions); } else { instanceData.rendering = false; @@ -5621,7 +5581,7 @@ function updateDom(previous, dnode, projectionOptions, parentVNode, parentInstan var children = filterAndDecorateChildren(dnode.children, parentInstance); dnode.children = children; updated = - updateChildren(dnode, previous.children, children, parentInstance, projectionOptions) || updated; + updateChildren(dnode, oldNextSiblings, previous.children, children, parentInstance, projectionOptions) || updated; } var previousProperties_1 = buildPreviousProperties(domNode_2, previous, dnode); if (dnode.attributes && dnode.events) { @@ -5732,7 +5692,8 @@ function render(projectionOptions) { previouslyRendered.push(instance); var _a = instanceMap.get(instance), parentVNode = _a.parentVNode, dnode = _a.dnode; var instanceData = exports.widgetInstanceMap.get(instance); - updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance); + var nextSiblings = nextSiblingMap.get(instance); + updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance, nextSiblings, nextSiblings); } } runAfterRenderCallbacks(projectionOptions); @@ -5764,7 +5725,7 @@ exports.dom = { scheduleRender(finalProjectorOptions); } }; - updateDom(node, node, finalProjectorOptions, parentVNode, instance); + updateDom(node, node, finalProjectorOptions, parentVNode, instance, [], []); projectorState.afterRenderCallbacks.push(function () { instanceData.onAttach(); }); @@ -5789,6 +5750,43 @@ exports.dom = { }; +/***/ }), + +/***/ "./node_modules/@dojo/webpack-contrib/css-module-decorator-loader/index.js!./node_modules/css-loader/index.js?{\"modules\":true,\"sourceMap\":true,\"importLoaders\":1,\"localIdentName\":\"[hash:base64:8]\"}!./node_modules/postcss-loader/lib/index.js?{\"ident\":\"postcss\",\"plugins\":[null,{\"version\":\"6.0.23\",\"plugins\":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],\"postcssPlugin\":\"postcss-cssnext\",\"postcssVersion\":\"6.0.23\"}]}!./node_modules/@dojo/webpack-contrib/css-module-dts-loader/index.js?type=css!./src/menu-item/menuItem.m.css": +/***/ (function(module, exports, __webpack_require__) { + +exports = module.exports = __webpack_require__("./node_modules/css-loader/lib/css-base.js")(true); +// imports + + +// module +exports.push([module.i, ".sUmUi4Sh {\n\theight: 100%;\n\tdisplay: inline-block;\n}\n\n._2Mk6Rdqa {\n\tcolor: #fff;\n\ttext-decoration: none;\n\tmargin: 0 6.4px;\n\tposition: relative;\n\tdisplay: -webkit-box;\n\tdisplay: -ms-flexbox;\n\tdisplay: flex;\n\t-webkit-box-orient: vertical;\n\t-webkit-box-direction: normal;\n\t -ms-flex-direction: column;\n\t flex-direction: column;\n\t-webkit-box-pack: center;\n\t -ms-flex-pack: center;\n\t justify-content: center;\n\theight: 48px;\n\tcursor: pointer;\n}\n\n._2Mk6Rdqa::after {\n\tdisplay: block;\n\tcontent: \"\";\n\tbackground: #fff;\n\theight: 2px;\n\tposition: absolute;\n\twidth: 100%;\n\tbottom: 0;\n\t-webkit-transition: -webkit-transform .3s ease-out;\n\ttransition: -webkit-transform .3s ease-out;\n\ttransition: transform .3s ease-out;\n\ttransition: transform .3s ease-out, -webkit-transform .3s ease-out;\n\t-webkit-transform: translateY(3px);\n\t transform: translateY(3px);\n}\n\n._1-f3ItOh::after {\n\t-webkit-transform: translateY(0);\n\t transform: translateY(0);\n}\n", "", {"version":3,"sources":["/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu-item/menuItem.m.css"],"names":[],"mappings":"AAAA;CACC,aAAa;CACb,sBAAsB;CACtB;;AAED;CACC,YAAY;CACZ,sBAAsB;CACtB,gBAAgB;CAChB,mBAAmB;CACnB,qBAAqB;CACrB,qBAAqB;CACrB,cAAc;CACd,6BAA6B;CAC7B,8BAA8B;KAC1B,2BAA2B;SACvB,uBAAuB;CAC/B,yBAAyB;KACrB,sBAAsB;SAClB,wBAAwB;CAChC,aAAa;CACb,gBAAgB;CAChB;;AAED;CACC,eAAe;CACf,YAAY;CACZ,iBAAiB;CACjB,YAAY;CACZ,mBAAmB;CACnB,YAAY;CACZ,UAAU;CACV,mDAAmD;CACnD,2CAA2C;CAC3C,mCAAmC;CACnC,mEAAmE;CACnE,mCAAmC;SAC3B,2BAA2B;CACnC;;AAED;CACC,iCAAiC;SACzB,yBAAyB;CACjC","file":"menuItem.m.css","sourcesContent":[".root {\n\theight: 100%;\n\tdisplay: inline-block;\n}\n\n.item {\n\tcolor: #fff;\n\ttext-decoration: none;\n\tmargin: 0 6.4px;\n\tposition: relative;\n\tdisplay: -webkit-box;\n\tdisplay: -ms-flexbox;\n\tdisplay: flex;\n\t-webkit-box-orient: vertical;\n\t-webkit-box-direction: normal;\n\t -ms-flex-direction: column;\n\t flex-direction: column;\n\t-webkit-box-pack: center;\n\t -ms-flex-pack: center;\n\t justify-content: center;\n\theight: 48px;\n\tcursor: pointer;\n}\n\n.item::after {\n\tdisplay: block;\n\tcontent: \"\";\n\tbackground: #fff;\n\theight: 2px;\n\tposition: absolute;\n\twidth: 100%;\n\tbottom: 0;\n\t-webkit-transition: -webkit-transform .3s ease-out;\n\ttransition: -webkit-transform .3s ease-out;\n\ttransition: transform .3s ease-out;\n\ttransition: transform .3s ease-out, -webkit-transform .3s ease-out;\n\t-webkit-transform: translateY(3px);\n\t transform: translateY(3px);\n}\n\n.selected::after {\n\t-webkit-transform: translateY(0);\n\t transform: translateY(0);\n}\n"],"sourceRoot":""}]); + +// exports +exports.locals = {" _key": "test-app/menuItem", + "root": "sUmUi4Sh", + "item": "_2Mk6Rdqa", + "selected": "_1-f3ItOh" +}; + +/***/ }), + +/***/ "./node_modules/@dojo/webpack-contrib/css-module-decorator-loader/index.js!./node_modules/css-loader/index.js?{\"modules\":true,\"sourceMap\":true,\"importLoaders\":1,\"localIdentName\":\"[hash:base64:8]\"}!./node_modules/postcss-loader/lib/index.js?{\"ident\":\"postcss\",\"plugins\":[null,{\"version\":\"6.0.23\",\"plugins\":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],\"postcssPlugin\":\"postcss-cssnext\",\"postcssVersion\":\"6.0.23\"}]}!./node_modules/@dojo/webpack-contrib/css-module-dts-loader/index.js?type=css!./src/menu/menu.m.css": +/***/ (function(module, exports, __webpack_require__) { + +exports = module.exports = __webpack_require__("./node_modules/css-loader/lib/css-base.js")(true); +// imports + + +// module +exports.push([module.i, "._3bA6jdSn {\n\twidth: 100%;\n\ttop: 0;\n\theight: 48px;\n\tz-index: 100;\n\tbackground-color: #1d1f20;\n}\n\n._1eoGfqku {\n\theight: 100%;\n\tmargin: 0 auto;\n}\n", "", {"version":3,"sources":["/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu/menu.m.css"],"names":[],"mappings":"AAAA;CACC,YAAY;CACZ,OAAO;CACP,aAAa;CACb,aAAa;CACb,0BAA0B;CAC1B;;AAED;CACC,aAAa;CACb,eAAe;CACf","file":"menu.m.css","sourcesContent":[".root {\n\twidth: 100%;\n\ttop: 0;\n\theight: 48px;\n\tz-index: 100;\n\tbackground-color: #1d1f20;\n}\n\n.menuContainer {\n\theight: 100%;\n\tmargin: 0 auto;\n}\n"],"sourceRoot":""}]); + +// exports +exports.locals = {" _key": "test-app/menu", + "root": "_3bA6jdSn", + "menuContainer": "_1eoGfqku" +}; + /***/ }), /***/ "./node_modules/css-loader/lib/css-base.js": @@ -13260,7 +13258,7 @@ module.exports = g; /***/ (function(module, exports, __webpack_require__) { "use strict"; -var cov_6vl6bll1n=function(){var path="/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu-item/MenuItem.ts",hash="dffc074c416ffe5aed89b57b2d8a809a71253a52",global=new Function('return this')(),gcv="__coverage__",coverageData={path:"/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu-item/MenuItem.ts",statementMap:{"0":{start:{line:2,column:0},end:{line:2,column:62}},"1":{start:{line:3,column:14},end:{line:3,column:30}},"2":{start:{line:4,column:10},end:{line:4,column:40}},"3":{start:{line:5,column:22},end:{line:5,column:75}},"4":{start:{line:6,column:15},end:{line:6,column:57}},"5":{start:{line:7,column:19},end:{line:7,column:58}},"6":{start:{line:8,column:10},end:{line:8,column:37}},"7":{start:{line:9,column:30},end:{line:36,column:48}},"8":{start:{line:10,column:4},end:{line:10,column:40}},"9":{start:{line:12,column:8},end:{line:12,column:72}},"10":{start:{line:14,column:4},end:{line:16,column:6}},"11":{start:{line:15,column:8},end:{line:15,column:87}},"12":{start:{line:17,column:4},end:{line:25,column:6}},"13":{start:{line:18,column:17},end:{line:18,column:32}},"14":{start:{line:18,column:42},end:{line:18,column:50}},"15":{start:{line:18,column:63},end:{line:18,column:74}},"16":{start:{line:19,column:8},end:{line:24,column:11}},"17":{start:{line:26,column:4},end:{line:34,column:17}},"18":{start:{line:35,column:4},end:{line:35,column:20}},"19":{start:{line:37,column:0},end:{line:37,column:28}},"20":{start:{line:38,column:0},end:{line:38,column:27}}},fnMap:{"0":{name:"(anonymous_0)",decl:{start:{line:9,column:30},end:{line:9,column:31}},loc:{start:{line:9,column:48},end:{line:36,column:1}},line:9},"1":{name:"MenuItem",decl:{start:{line:11,column:13},end:{line:11,column:21}},loc:{start:{line:11,column:24},end:{line:13,column:5}},line:11},"2":{name:"(anonymous_2)",decl:{start:{line:14,column:34},end:{line:14,column:35}},loc:{start:{line:14,column:46},end:{line:16,column:5}},line:14},"3":{name:"(anonymous_3)",decl:{start:{line:17,column:32},end:{line:17,column:33}},loc:{start:{line:17,column:44},end:{line:25,column:5}},line:17}},branchMap:{"0":{loc:{start:{line:12,column:15},end:{line:12,column:71}},type:"binary-expr",locations:[{start:{line:12,column:15},end:{line:12,column:30}},{start:{line:12,column:34},end:{line:12,column:63}},{start:{line:12,column:67},end:{line:12,column:71}}],line:12},"1":{loc:{start:{line:15,column:8},end:{line:15,column:86}},type:"binary-expr",locations:[{start:{line:15,column:8},end:{line:15,column:34}},{start:{line:15,column:38},end:{line:15,column:86}}],line:15},"2":{loc:{start:{line:21,column:47},end:{line:21,column:77}},type:"cond-expr",locations:[{start:{line:21,column:58},end:{line:21,column:70}},{start:{line:21,column:73},end:{line:21,column:77}}],line:21}},s:{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0},f:{"0":0,"1":0,"2":0,"3":0},b:{"0":[0,0,0],"1":[0,0],"2":[0,0]},inputSourceMap:{version:3,sources:["/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu-item/MenuItem.ts"],names:[],mappings:";;;AAAA,CAAA,CAAA,EAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAEA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAEA,CAAA,CAAA,EAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CA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",file:"/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu-item/MenuItem.ts",sourcesContent:["import { v } from '@dojo/widget-core/d';\nimport { customElement } from '@dojo/widget-core/decorators/customElement';\nimport { WidgetProperties } from '@dojo/widget-core/interfaces';\nimport { theme, ThemedMixin } from '@dojo/widget-core/mixins/Themed';\nimport { WidgetBase } from '@dojo/widget-core/WidgetBase';\n\nimport * as css from './menuItem.m.css';\n\nexport interface MenuItemProperties extends WidgetProperties {\n\ttitle: string;\n\tselected?: boolean;\n\tdata?: any;\n\tonSelected?: (data: any) => void;\n}\n\n@customElement({\n\ttag: 'demo-menu-item',\n\tattributes: ['title', 'selected'],\n\tevents: ['onSelected'],\n\tproperties: ['data', 'selected']\n})\n@theme(css)\nexport class MenuItem extends ThemedMixin(WidgetBase) {\n\tprivate _onClick() {\n\t\tthis.properties.onSelected && this.properties.onSelected(this.properties.data);\n\t}\n\n\tprotected render() {\n\t\tconst { title, selected } = this.properties;\n\n\t\treturn v('li', { classes: this.theme(css.root) }, [\n\t\t\tv(\n\t\t\t\t'span',\n\t\t\t\t{\n\t\t\t\t\tclasses: this.theme([css.item, selected ? css.selected : null]),\n\t\t\t\t\tonclick: this._onClick\n\t\t\t\t},\n\t\t\t\t[title]\n\t\t\t)\n\t\t]);\n\t}\n}\n\nexport default MenuItem;\n"]},_coverageSchema:"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c"},coverage=global[gcv]||(global[gcv]={});if(coverage[path]&&coverage[path].hash===hash){return coverage[path];}coverageData.hash=hash;return coverage[path]=coverageData;}();cov_6vl6bll1n.s[0]++;Object.defineProperty(exports,"__esModule",{value:true});var tslib_1=(cov_6vl6bll1n.s[1]++,__webpack_require__("./node_modules/tslib/tslib.es6.js"));var d_1=(cov_6vl6bll1n.s[2]++,__webpack_require__("./node_modules/@dojo/widget-core/d.js"));var customElement_1=(cov_6vl6bll1n.s[3]++,__webpack_require__("./node_modules/@dojo/widget-core/decorators/customElement.js"));var Themed_1=(cov_6vl6bll1n.s[4]++,__webpack_require__("./node_modules/@dojo/widget-core/mixins/Themed.js"));var WidgetBase_1=(cov_6vl6bll1n.s[5]++,__webpack_require__("./node_modules/@dojo/widget-core/WidgetBase.js"));var css=(cov_6vl6bll1n.s[6]++,__webpack_require__("./src/menu-item/menuItem.m.css"));var MenuItem=(/** @class */cov_6vl6bll1n.s[7]++,function(_super){cov_6vl6bll1n.f[0]++;cov_6vl6bll1n.s[8]++;tslib_1.__extends(MenuItem,_super);function MenuItem(){cov_6vl6bll1n.f[1]++;cov_6vl6bll1n.s[9]++;return(cov_6vl6bll1n.b[0][0]++,_super!==null)&&(cov_6vl6bll1n.b[0][1]++,_super.apply(this,arguments))||(cov_6vl6bll1n.b[0][2]++,this);}cov_6vl6bll1n.s[10]++;MenuItem.prototype._onClick=function(){cov_6vl6bll1n.f[2]++;cov_6vl6bll1n.s[11]++;(cov_6vl6bll1n.b[1][0]++,this.properties.onSelected)&&(cov_6vl6bll1n.b[1][1]++,this.properties.onSelected(this.properties.data));};cov_6vl6bll1n.s[12]++;MenuItem.prototype.render=function(){cov_6vl6bll1n.f[3]++;var _a=(cov_6vl6bll1n.s[13]++,this.properties),title=(cov_6vl6bll1n.s[14]++,_a.title),selected=(cov_6vl6bll1n.s[15]++,_a.selected);cov_6vl6bll1n.s[16]++;return d_1.v('li',{classes:this.theme(css.root)},[d_1.v('span',{classes:this.theme([css.item,selected?(cov_6vl6bll1n.b[2][0]++,css.selected):(cov_6vl6bll1n.b[2][1]++,null)]),onclick:this._onClick},[title])]);};cov_6vl6bll1n.s[17]++;MenuItem=tslib_1.__decorate([customElement_1.customElement({tag:'demo-menu-item',attributes:['title','selected'],events:['onSelected'],properties:['data','selected']}),Themed_1.theme(css)],MenuItem);cov_6vl6bll1n.s[18]++;return MenuItem;}(Themed_1.ThemedMixin(WidgetBase_1.WidgetBase)));cov_6vl6bll1n.s[19]++;exports.MenuItem=MenuItem;cov_6vl6bll1n.s[20]++;exports.default=MenuItem; +var cov_6vl6bll1n=function(){var path="/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu-item/MenuItem.ts",hash="e9ec7644ac047507cdafe7ee7be18d6c43a1bc9e",Function=function(){}.constructor,global=new Function('return this')(),gcv="__coverage__",coverageData={path:"/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu-item/MenuItem.ts",statementMap:{"0":{start:{line:2,column:0},end:{line:2,column:62}},"1":{start:{line:3,column:14},end:{line:3,column:30}},"2":{start:{line:4,column:10},end:{line:4,column:50}},"3":{start:{line:5,column:22},end:{line:5,column:85}},"4":{start:{line:6,column:15},end:{line:6,column:67}},"5":{start:{line:7,column:19},end:{line:7,column:68}},"6":{start:{line:8,column:10},end:{line:8,column:37}},"7":{start:{line:9,column:30},end:{line:36,column:48}},"8":{start:{line:10,column:4},end:{line:10,column:40}},"9":{start:{line:12,column:8},end:{line:12,column:72}},"10":{start:{line:14,column:4},end:{line:16,column:6}},"11":{start:{line:15,column:8},end:{line:15,column:87}},"12":{start:{line:17,column:4},end:{line:25,column:6}},"13":{start:{line:18,column:17},end:{line:18,column:32}},"14":{start:{line:18,column:42},end:{line:18,column:50}},"15":{start:{line:18,column:63},end:{line:18,column:74}},"16":{start:{line:19,column:8},end:{line:24,column:11}},"17":{start:{line:26,column:4},end:{line:34,column:17}},"18":{start:{line:35,column:4},end:{line:35,column:20}},"19":{start:{line:37,column:0},end:{line:37,column:28}},"20":{start:{line:38,column:0},end:{line:38,column:27}}},fnMap:{"0":{name:"(anonymous_0)",decl:{start:{line:9,column:30},end:{line:9,column:31}},loc:{start:{line:9,column:48},end:{line:36,column:1}},line:9},"1":{name:"MenuItem",decl:{start:{line:11,column:13},end:{line:11,column:21}},loc:{start:{line:11,column:24},end:{line:13,column:5}},line:11},"2":{name:"(anonymous_2)",decl:{start:{line:14,column:34},end:{line:14,column:35}},loc:{start:{line:14,column:46},end:{line:16,column:5}},line:14},"3":{name:"(anonymous_3)",decl:{start:{line:17,column:32},end:{line:17,column:33}},loc:{start:{line:17,column:44},end:{line:25,column:5}},line:17}},branchMap:{"0":{loc:{start:{line:12,column:15},end:{line:12,column:71}},type:"binary-expr",locations:[{start:{line:12,column:15},end:{line:12,column:30}},{start:{line:12,column:34},end:{line:12,column:63}},{start:{line:12,column:67},end:{line:12,column:71}}],line:12},"1":{loc:{start:{line:15,column:8},end:{line:15,column:86}},type:"binary-expr",locations:[{start:{line:15,column:8},end:{line:15,column:34}},{start:{line:15,column:38},end:{line:15,column:86}}],line:15},"2":{loc:{start:{line:21,column:47},end:{line:21,column:77}},type:"cond-expr",locations:[{start:{line:21,column:58},end:{line:21,column:70}},{start:{line:21,column:73},end:{line:21,column:77}}],line:21}},s:{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0},f:{"0":0,"1":0,"2":0,"3":0},b:{"0":[0,0,0],"1":[0,0],"2":[0,0]},inputSourceMap:{version:3,sources:["/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu-item/MenuItem.ts"],names:[],mappings:";;;AAAA,CAAA,CAAA,EAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAEA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CA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",file:"/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu-item/MenuItem.ts",sourcesContent:["import { v } from '@dojo/framework/widget-core/d';\nimport { customElement } from '@dojo/framework/widget-core/decorators/customElement';\nimport { WidgetProperties } from '@dojo/framework/widget-core/interfaces';\nimport { theme, ThemedMixin } from '@dojo/framework/widget-core/mixins/Themed';\nimport { WidgetBase } from '@dojo/framework/widget-core/WidgetBase';\n\nimport * as css from './menuItem.m.css';\n\nexport interface MenuItemProperties extends WidgetProperties {\n\ttitle: string;\n\tselected?: boolean;\n\tdata?: any;\n\tonSelected?: (data: any) => void;\n}\n\n@customElement({\n\ttag: 'demo-menu-item',\n\tattributes: ['title', 'selected'],\n\tevents: ['onSelected'],\n\tproperties: ['data', 'selected']\n})\n@theme(css)\nexport class MenuItem extends ThemedMixin(WidgetBase) {\n\tprivate _onClick() {\n\t\tthis.properties.onSelected && this.properties.onSelected(this.properties.data);\n\t}\n\n\tprotected render() {\n\t\tconst { title, selected } = this.properties;\n\n\t\treturn v('li', { classes: this.theme(css.root) }, [\n\t\t\tv(\n\t\t\t\t'span',\n\t\t\t\t{\n\t\t\t\t\tclasses: this.theme([css.item, selected ? css.selected : null]),\n\t\t\t\t\tonclick: this._onClick\n\t\t\t\t},\n\t\t\t\t[title]\n\t\t\t)\n\t\t]);\n\t}\n}\n\nexport default MenuItem;\n"]},_coverageSchema:"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c"},coverage=global[gcv]||(global[gcv]={});if(coverage[path]&&coverage[path].hash===hash){return coverage[path];}coverageData.hash=hash;return coverage[path]=coverageData;}();cov_6vl6bll1n.s[0]++;Object.defineProperty(exports,"__esModule",{value:true});var tslib_1=(cov_6vl6bll1n.s[1]++,__webpack_require__("./node_modules/tslib/tslib.es6.js"));var d_1=(cov_6vl6bll1n.s[2]++,__webpack_require__("./node_modules/@dojo/framework/widget-core/d.js"));var customElement_1=(cov_6vl6bll1n.s[3]++,__webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/customElement.js"));var Themed_1=(cov_6vl6bll1n.s[4]++,__webpack_require__("./node_modules/@dojo/framework/widget-core/mixins/Themed.js"));var WidgetBase_1=(cov_6vl6bll1n.s[5]++,__webpack_require__("./node_modules/@dojo/framework/widget-core/WidgetBase.js"));var css=(cov_6vl6bll1n.s[6]++,__webpack_require__("./src/menu-item/menuItem.m.css"));var MenuItem=(cov_6vl6bll1n.s[7]++,function(_super){cov_6vl6bll1n.f[0]++;cov_6vl6bll1n.s[8]++;tslib_1.__extends(MenuItem,_super);function MenuItem(){cov_6vl6bll1n.f[1]++;cov_6vl6bll1n.s[9]++;return(cov_6vl6bll1n.b[0][0]++,_super!==null)&&(cov_6vl6bll1n.b[0][1]++,_super.apply(this,arguments))||(cov_6vl6bll1n.b[0][2]++,this);}cov_6vl6bll1n.s[10]++;MenuItem.prototype._onClick=function(){cov_6vl6bll1n.f[2]++;cov_6vl6bll1n.s[11]++;(cov_6vl6bll1n.b[1][0]++,this.properties.onSelected)&&(cov_6vl6bll1n.b[1][1]++,this.properties.onSelected(this.properties.data));};cov_6vl6bll1n.s[12]++;MenuItem.prototype.render=function(){cov_6vl6bll1n.f[3]++;var _a=(cov_6vl6bll1n.s[13]++,this.properties),title=(cov_6vl6bll1n.s[14]++,_a.title),selected=(cov_6vl6bll1n.s[15]++,_a.selected);cov_6vl6bll1n.s[16]++;return d_1.v('li',{classes:this.theme(css.root)},[d_1.v('span',{classes:this.theme([css.item,selected?(cov_6vl6bll1n.b[2][0]++,css.selected):(cov_6vl6bll1n.b[2][1]++,null)]),onclick:this._onClick},[title])]);};cov_6vl6bll1n.s[17]++;MenuItem=tslib_1.__decorate([customElement_1.customElement({tag:'demo-menu-item',attributes:['title','selected'],events:['onSelected'],properties:['data','selected']}),Themed_1.theme(css)],MenuItem);cov_6vl6bll1n.s[18]++;return MenuItem;}(Themed_1.ThemedMixin(WidgetBase_1.WidgetBase)));cov_6vl6bll1n.s[19]++;exports.MenuItem=MenuItem;cov_6vl6bll1n.s[20]++;exports.default=MenuItem; /***/ }), @@ -13300,7 +13298,7 @@ if(false) { /***/ (function(module, exports, __webpack_require__) { "use strict"; -var cov_276i61pj3t=function(){var path="/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu/Menu.ts",hash="ec7fbc29b6cd52a39d18e8f3d152fc79e0454afa",global=new Function('return this')(),gcv="__coverage__",coverageData={path:"/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu/Menu.ts",statementMap:{"0":{start:{line:2,column:0},end:{line:2,column:62}},"1":{start:{line:3,column:14},end:{line:3,column:30}},"2":{start:{line:4,column:10},end:{line:4,column:40}},"3":{start:{line:5,column:22},end:{line:5,column:75}},"4":{start:{line:6,column:15},end:{line:6,column:57}},"5":{start:{line:7,column:19},end:{line:7,column:58}},"6":{start:{line:8,column:10},end:{line:8,column:33}},"7":{start:{line:9,column:26},end:{line:49,column:48}},"8":{start:{line:10,column:4},end:{line:10,column:36}},"9":{start:{line:12,column:8},end:{line:12,column:72}},"10":{start:{line:14,column:4},end:{line:18,column:6}},"11":{start:{line:15,column:8},end:{line:15,column:30}},"12":{start:{line:16,column:8},end:{line:16,column:41}},"13":{start:{line:17,column:8},end:{line:17,column:26}},"14":{start:{line:19,column:4},end:{line:40,column:6}},"15":{start:{line:20,column:20},end:{line:20,column:24}},"16":{start:{line:21,column:20},end:{line:34,column:10}},"17":{start:{line:22,column:12},end:{line:32,column:13}},"18":{start:{line:23,column:33},end:{line:27,column:17}},"19":{start:{line:25,column:24},end:{line:25,column:55}},"20":{start:{line:28,column:16},end:{line:30,column:17}},"21":{start:{line:29,column:20},end:{line:29,column:70}},"22":{start:{line:31,column:16},end:{line:31,column:86}},"23":{start:{line:33,column:12},end:{line:33,column:25}},"24":{start:{line:35,column:8},end:{line:39,column:11}},"25":{start:{line:41,column:4},end:{line:47,column:13}},"26":{start:{line:48,column:4},end:{line:48,column:16}},"27":{start:{line:50,column:0},end:{line:50,column:20}},"28":{start:{line:51,column:0},end:{line:51,column:23}}},fnMap:{"0":{name:"(anonymous_0)",decl:{start:{line:9,column:26},end:{line:9,column:27}},loc:{start:{line:9,column:44},end:{line:49,column:1}},line:9},"1":{name:"Menu",decl:{start:{line:11,column:13},end:{line:11,column:17}},loc:{start:{line:11,column:20},end:{line:13,column:5}},line:11},"2":{name:"(anonymous_2)",decl:{start:{line:14,column:33},end:{line:14,column:34}},loc:{start:{line:14,column:53},end:{line:18,column:5}},line:14},"3":{name:"(anonymous_3)",decl:{start:{line:19,column:28},end:{line:19,column:29}},loc:{start:{line:19,column:40},end:{line:40,column:5}},line:19},"4":{name:"(anonymous_4)",decl:{start:{line:21,column:38},end:{line:21,column:39}},loc:{start:{line:21,column:62},end:{line:34,column:9}},line:21},"5":{name:"(anonymous_5)",decl:{start:{line:24,column:32},end:{line:24,column:33}},loc:{start:{line:24,column:48},end:{line:26,column:21}},line:24}},branchMap:{"0":{loc:{start:{line:12,column:15},end:{line:12,column:71}},type:"binary-expr",locations:[{start:{line:12,column:15},end:{line:12,column:30}},{start:{line:12,column:34},end:{line:12,column:63}},{start:{line:12,column:67},end:{line:12,column:71}}],line:12},"1":{loc:{start:{line:22,column:12},end:{line:32,column:13}},type:"if",locations:[{start:{line:22,column:12},end:{line:32,column:13}},{start:{line:22,column:12},end:{line:32,column:13}}],line:22},"2":{loc:{start:{line:28,column:16},end:{line:30,column:17}},type:"if",locations:[{start:{line:28,column:16},end:{line:30,column:17}},{start:{line:28,column:16},end:{line:30,column:17}}],line:28}},s:{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0},f:{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0},b:{"0":[0,0,0],"1":[0,0],"2":[0,0]},inputSourceMap:{version:3,sources:["/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu/Menu.ts"],names:[],mappings:";;;AAAA,CAAA,CAAA,EAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAEA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAGA,CAAA,CAAA,EAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CA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",file:"/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu/Menu.ts",sourcesContent:["import { v } from '@dojo/widget-core/d';\nimport { customElement } from '@dojo/widget-core/decorators/customElement';\nimport { WidgetProperties, WNode } from '@dojo/widget-core/interfaces';\nimport { theme, ThemedMixin } from '@dojo/widget-core/mixins/Themed';\nimport { WidgetBase } from '@dojo/widget-core/WidgetBase';\nimport { MenuItem, MenuItemProperties } from '../menu-item/MenuItem';\n\nimport * as css from './menu.m.css';\n\ninterface MenuProperties extends WidgetProperties {\n\tonSelected: (data: any) => void;\n}\n\n@customElement({\n\ttag: 'demo-menu',\n\tevents: ['onSelected']\n})\n@theme(css)\nexport class Menu extends ThemedMixin(WidgetBase)> {\n\tprivate _selectedId: number;\n\n\tprivate _onSelected(id: number, data: any) {\n\t\tthis._selectedId = id;\n\t\tthis.properties.onSelected(data);\n\t\tthis.invalidate();\n\t}\n\n\tprotected render() {\n\t\tconst items = this.children.map((child, index) => {\n\t\t\tif (child) {\n\t\t\t\tconst properties: Partial = {\n\t\t\t\t\tonSelected: (data: any) => {\n\t\t\t\t\t\tthis._onSelected(index, data);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tif (this._selectedId !== undefined) {\n\t\t\t\t\tproperties.selected = index === this._selectedId;\n\t\t\t\t}\n\t\t\t\tchild.properties = { ...child.properties, ...properties };\n\t\t\t}\n\t\t\treturn child;\n\t\t});\n\n\t\treturn v('nav', { classes: this.theme(css.root) }, [\n\t\t\tv(\n\t\t\t\t'ol',\n\t\t\t\t{\n\t\t\t\t\tclasses: this.theme(css.menuContainer)\n\t\t\t\t},\n\t\t\t\titems\n\t\t\t)\n\t\t]);\n\t}\n}\n\nexport default Menu;\n"]},_coverageSchema:"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c"},coverage=global[gcv]||(global[gcv]={});if(coverage[path]&&coverage[path].hash===hash){return coverage[path];}coverageData.hash=hash;return coverage[path]=coverageData;}();cov_276i61pj3t.s[0]++;Object.defineProperty(exports,"__esModule",{value:true});var tslib_1=(cov_276i61pj3t.s[1]++,__webpack_require__("./node_modules/tslib/tslib.es6.js"));var d_1=(cov_276i61pj3t.s[2]++,__webpack_require__("./node_modules/@dojo/widget-core/d.js"));var customElement_1=(cov_276i61pj3t.s[3]++,__webpack_require__("./node_modules/@dojo/widget-core/decorators/customElement.js"));var Themed_1=(cov_276i61pj3t.s[4]++,__webpack_require__("./node_modules/@dojo/widget-core/mixins/Themed.js"));var WidgetBase_1=(cov_276i61pj3t.s[5]++,__webpack_require__("./node_modules/@dojo/widget-core/WidgetBase.js"));var css=(cov_276i61pj3t.s[6]++,__webpack_require__("./src/menu/menu.m.css"));var Menu=(/** @class */cov_276i61pj3t.s[7]++,function(_super){cov_276i61pj3t.f[0]++;cov_276i61pj3t.s[8]++;tslib_1.__extends(Menu,_super);function Menu(){cov_276i61pj3t.f[1]++;cov_276i61pj3t.s[9]++;return(cov_276i61pj3t.b[0][0]++,_super!==null)&&(cov_276i61pj3t.b[0][1]++,_super.apply(this,arguments))||(cov_276i61pj3t.b[0][2]++,this);}cov_276i61pj3t.s[10]++;Menu.prototype._onSelected=function(id,data){cov_276i61pj3t.f[2]++;cov_276i61pj3t.s[11]++;this._selectedId=id;cov_276i61pj3t.s[12]++;this.properties.onSelected(data);cov_276i61pj3t.s[13]++;this.invalidate();};cov_276i61pj3t.s[14]++;Menu.prototype.render=function(){cov_276i61pj3t.f[3]++;var _this=(cov_276i61pj3t.s[15]++,this);var items=(cov_276i61pj3t.s[16]++,this.children.map(function(child,index){cov_276i61pj3t.f[4]++;cov_276i61pj3t.s[17]++;if(child){cov_276i61pj3t.b[1][0]++;var properties=(cov_276i61pj3t.s[18]++,{onSelected:function(data){cov_276i61pj3t.f[5]++;cov_276i61pj3t.s[19]++;_this._onSelected(index,data);}});cov_276i61pj3t.s[20]++;if(_this._selectedId!==undefined){cov_276i61pj3t.b[2][0]++;cov_276i61pj3t.s[21]++;properties.selected=index===_this._selectedId;}else{cov_276i61pj3t.b[2][1]++;}cov_276i61pj3t.s[22]++;child.properties=tslib_1.__assign({},child.properties,properties);}else{cov_276i61pj3t.b[1][1]++;}cov_276i61pj3t.s[23]++;return child;}));cov_276i61pj3t.s[24]++;return d_1.v('nav',{classes:this.theme(css.root)},[d_1.v('ol',{classes:this.theme(css.menuContainer)},items)]);};cov_276i61pj3t.s[25]++;Menu=tslib_1.__decorate([customElement_1.customElement({tag:'demo-menu',events:['onSelected']}),Themed_1.theme(css)],Menu);cov_276i61pj3t.s[26]++;return Menu;}(Themed_1.ThemedMixin(WidgetBase_1.WidgetBase)));cov_276i61pj3t.s[27]++;exports.Menu=Menu;cov_276i61pj3t.s[28]++;exports.default=Menu; +var cov_276i61pj3t=function(){var path="/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu/Menu.ts",hash="4853a42605855c0557dc2d97f88858fd013f2edf",Function=function(){}.constructor,global=new Function('return this')(),gcv="__coverage__",coverageData={path:"/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu/Menu.ts",statementMap:{"0":{start:{line:2,column:0},end:{line:2,column:62}},"1":{start:{line:3,column:14},end:{line:3,column:30}},"2":{start:{line:4,column:10},end:{line:4,column:50}},"3":{start:{line:5,column:22},end:{line:5,column:85}},"4":{start:{line:6,column:15},end:{line:6,column:67}},"5":{start:{line:7,column:19},end:{line:7,column:68}},"6":{start:{line:8,column:10},end:{line:8,column:33}},"7":{start:{line:9,column:26},end:{line:49,column:48}},"8":{start:{line:10,column:4},end:{line:10,column:36}},"9":{start:{line:12,column:8},end:{line:12,column:72}},"10":{start:{line:14,column:4},end:{line:18,column:6}},"11":{start:{line:15,column:8},end:{line:15,column:30}},"12":{start:{line:16,column:8},end:{line:16,column:41}},"13":{start:{line:17,column:8},end:{line:17,column:26}},"14":{start:{line:19,column:4},end:{line:40,column:6}},"15":{start:{line:20,column:20},end:{line:20,column:24}},"16":{start:{line:21,column:20},end:{line:34,column:10}},"17":{start:{line:22,column:12},end:{line:32,column:13}},"18":{start:{line:23,column:33},end:{line:27,column:17}},"19":{start:{line:25,column:24},end:{line:25,column:55}},"20":{start:{line:28,column:16},end:{line:30,column:17}},"21":{start:{line:29,column:20},end:{line:29,column:70}},"22":{start:{line:31,column:16},end:{line:31,column:86}},"23":{start:{line:33,column:12},end:{line:33,column:25}},"24":{start:{line:35,column:8},end:{line:39,column:11}},"25":{start:{line:41,column:4},end:{line:47,column:13}},"26":{start:{line:48,column:4},end:{line:48,column:16}},"27":{start:{line:50,column:0},end:{line:50,column:20}},"28":{start:{line:51,column:0},end:{line:51,column:23}}},fnMap:{"0":{name:"(anonymous_0)",decl:{start:{line:9,column:26},end:{line:9,column:27}},loc:{start:{line:9,column:44},end:{line:49,column:1}},line:9},"1":{name:"Menu",decl:{start:{line:11,column:13},end:{line:11,column:17}},loc:{start:{line:11,column:20},end:{line:13,column:5}},line:11},"2":{name:"(anonymous_2)",decl:{start:{line:14,column:33},end:{line:14,column:34}},loc:{start:{line:14,column:53},end:{line:18,column:5}},line:14},"3":{name:"(anonymous_3)",decl:{start:{line:19,column:28},end:{line:19,column:29}},loc:{start:{line:19,column:40},end:{line:40,column:5}},line:19},"4":{name:"(anonymous_4)",decl:{start:{line:21,column:38},end:{line:21,column:39}},loc:{start:{line:21,column:62},end:{line:34,column:9}},line:21},"5":{name:"(anonymous_5)",decl:{start:{line:24,column:32},end:{line:24,column:33}},loc:{start:{line:24,column:48},end:{line:26,column:21}},line:24}},branchMap:{"0":{loc:{start:{line:12,column:15},end:{line:12,column:71}},type:"binary-expr",locations:[{start:{line:12,column:15},end:{line:12,column:30}},{start:{line:12,column:34},end:{line:12,column:63}},{start:{line:12,column:67},end:{line:12,column:71}}],line:12},"1":{loc:{start:{line:22,column:12},end:{line:32,column:13}},type:"if",locations:[{start:{line:22,column:12},end:{line:32,column:13}},{start:{line:22,column:12},end:{line:32,column:13}}],line:22},"2":{loc:{start:{line:28,column:16},end:{line:30,column:17}},type:"if",locations:[{start:{line:28,column:16},end:{line:30,column:17}},{start:{line:28,column:16},end:{line:30,column:17}}],line:28}},s:{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0},f:{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0},b:{"0":[0,0,0],"1":[0,0],"2":[0,0]},inputSourceMap:{version:3,sources:["/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu/Menu.ts"],names:[],mappings:";;;AAAA,CAAA,CAAA,EAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAEA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CA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",file:"/Users/bryan/Projects/dojo2/cli-build-widget/test-app/src/menu/Menu.ts",sourcesContent:["import { v } from '@dojo/framework/widget-core/d';\nimport { customElement } from '@dojo/framework/widget-core/decorators/customElement';\nimport { WidgetProperties, WNode } from '@dojo/framework/widget-core/interfaces';\nimport { theme, ThemedMixin } from '@dojo/framework/widget-core/mixins/Themed';\nimport { WidgetBase } from '@dojo/framework/widget-core/WidgetBase';\nimport { MenuItem, MenuItemProperties } from '../menu-item/MenuItem';\n\nimport * as css from './menu.m.css';\n\ninterface MenuProperties extends WidgetProperties {\n\tonSelected: (data: any) => void;\n}\n\n@customElement({\n\ttag: 'demo-menu',\n\tevents: ['onSelected']\n})\n@theme(css)\nexport class Menu extends ThemedMixin(WidgetBase)> {\n\tprivate _selectedId: number;\n\n\tprivate _onSelected(id: number, data: any) {\n\t\tthis._selectedId = id;\n\t\tthis.properties.onSelected(data);\n\t\tthis.invalidate();\n\t}\n\n\tprotected render() {\n\t\tconst items = this.children.map((child, index) => {\n\t\t\tif (child) {\n\t\t\t\tconst properties: Partial = {\n\t\t\t\t\tonSelected: (data: any) => {\n\t\t\t\t\t\tthis._onSelected(index, data);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tif (this._selectedId !== undefined) {\n\t\t\t\t\tproperties.selected = index === this._selectedId;\n\t\t\t\t}\n\t\t\t\tchild.properties = { ...child.properties, ...properties };\n\t\t\t}\n\t\t\treturn child;\n\t\t});\n\n\t\treturn v('nav', { classes: this.theme(css.root) }, [\n\t\t\tv(\n\t\t\t\t'ol',\n\t\t\t\t{\n\t\t\t\t\tclasses: this.theme(css.menuContainer)\n\t\t\t\t},\n\t\t\t\titems\n\t\t\t)\n\t\t]);\n\t}\n}\n\nexport default Menu;\n"]},_coverageSchema:"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c"},coverage=global[gcv]||(global[gcv]={});if(coverage[path]&&coverage[path].hash===hash){return coverage[path];}coverageData.hash=hash;return coverage[path]=coverageData;}();cov_276i61pj3t.s[0]++;Object.defineProperty(exports,"__esModule",{value:true});var tslib_1=(cov_276i61pj3t.s[1]++,__webpack_require__("./node_modules/tslib/tslib.es6.js"));var d_1=(cov_276i61pj3t.s[2]++,__webpack_require__("./node_modules/@dojo/framework/widget-core/d.js"));var customElement_1=(cov_276i61pj3t.s[3]++,__webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/customElement.js"));var Themed_1=(cov_276i61pj3t.s[4]++,__webpack_require__("./node_modules/@dojo/framework/widget-core/mixins/Themed.js"));var WidgetBase_1=(cov_276i61pj3t.s[5]++,__webpack_require__("./node_modules/@dojo/framework/widget-core/WidgetBase.js"));var css=(cov_276i61pj3t.s[6]++,__webpack_require__("./src/menu/menu.m.css"));var Menu=(cov_276i61pj3t.s[7]++,function(_super){cov_276i61pj3t.f[0]++;cov_276i61pj3t.s[8]++;tslib_1.__extends(Menu,_super);function Menu(){cov_276i61pj3t.f[1]++;cov_276i61pj3t.s[9]++;return(cov_276i61pj3t.b[0][0]++,_super!==null)&&(cov_276i61pj3t.b[0][1]++,_super.apply(this,arguments))||(cov_276i61pj3t.b[0][2]++,this);}cov_276i61pj3t.s[10]++;Menu.prototype._onSelected=function(id,data){cov_276i61pj3t.f[2]++;cov_276i61pj3t.s[11]++;this._selectedId=id;cov_276i61pj3t.s[12]++;this.properties.onSelected(data);cov_276i61pj3t.s[13]++;this.invalidate();};cov_276i61pj3t.s[14]++;Menu.prototype.render=function(){cov_276i61pj3t.f[3]++;var _this=(cov_276i61pj3t.s[15]++,this);var items=(cov_276i61pj3t.s[16]++,this.children.map(function(child,index){cov_276i61pj3t.f[4]++;cov_276i61pj3t.s[17]++;if(child){cov_276i61pj3t.b[1][0]++;var properties=(cov_276i61pj3t.s[18]++,{onSelected:function(data){cov_276i61pj3t.f[5]++;cov_276i61pj3t.s[19]++;_this._onSelected(index,data);}});cov_276i61pj3t.s[20]++;if(_this._selectedId!==undefined){cov_276i61pj3t.b[2][0]++;cov_276i61pj3t.s[21]++;properties.selected=index===_this._selectedId;}else{cov_276i61pj3t.b[2][1]++;}cov_276i61pj3t.s[22]++;child.properties=tslib_1.__assign({},child.properties,properties);}else{cov_276i61pj3t.b[1][1]++;}cov_276i61pj3t.s[23]++;return child;}));cov_276i61pj3t.s[24]++;return d_1.v('nav',{classes:this.theme(css.root)},[d_1.v('ol',{classes:this.theme(css.menuContainer)},items)]);};cov_276i61pj3t.s[25]++;Menu=tslib_1.__decorate([customElement_1.customElement({tag:'demo-menu',events:['onSelected']}),Themed_1.theme(css)],Menu);cov_276i61pj3t.s[26]++;return Menu;}(Themed_1.ThemedMixin(WidgetBase_1.WidgetBase)));cov_276i61pj3t.s[27]++;exports.Menu=Menu;cov_276i61pj3t.s[28]++;exports.default=Menu; /***/ }), @@ -13355,8 +13353,8 @@ __webpack_require__("./tests/unit/menu/Menu.ts"); Object.defineProperty(exports, "__esModule", { value: true }); var _a = intern.getInterface('bdd'), describe = _a.describe, it = _a.it; -var harness_1 = __webpack_require__("./node_modules/@dojo/test-extras/harness.js"); -var d_1 = __webpack_require__("./node_modules/@dojo/widget-core/d.js"); +var harness_1 = __webpack_require__("./node_modules/@dojo/framework/testing/harness.js"); +var d_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.js"); var MenuItem_1 = __webpack_require__("./src/menu-item/MenuItem.ts"); var css = __webpack_require__("./src/menu-item/menuItem.m.css"); describe('MenuItem', function () { @@ -13384,8 +13382,8 @@ describe('MenuItem', function () { Object.defineProperty(exports, "__esModule", { value: true }); var _a = intern.getInterface('bdd'), describe = _a.describe, it = _a.it; -var harness_1 = __webpack_require__("./node_modules/@dojo/test-extras/harness.js"); -var d_1 = __webpack_require__("./node_modules/@dojo/widget-core/d.js"); +var harness_1 = __webpack_require__("./node_modules/@dojo/framework/testing/harness.js"); +var d_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.js"); var Menu_1 = __webpack_require__("./src/menu/Menu.ts"); var css = __webpack_require__("./src/menu/menu.m.css"); describe('Menu', function () { @@ -13409,4 +13407,4 @@ module.exports = __webpack_require__("./tests/unit/menu/Menu.ts"); /***/ }) /******/ }));; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgMGJhYmY2MDU5YmUzOTNmMmEzZGYiLCJ3ZWJwYWNrOi8vL0Rlc3Ryb3lhYmxlLnRzIiwid2VicGFjazovLy9FdmVudGVkLnRzIiwid2VicGFjazovLy9sYW5nLnRzIiwid2VicGFjazovLy9oYXMudHMiLCJ3ZWJwYWNrOi8vL01hcC50cyIsIndlYnBhY2s6Ly8vUHJvbWlzZS50cyIsIndlYnBhY2s6Ly8vU2V0LnRzIiwid2VicGFjazovLy9TeW1ib2wudHMiLCJ3ZWJwYWNrOi8vL1dlYWtNYXAudHMiLCJ3ZWJwYWNrOi8vL2FycmF5LnRzIiwid2VicGFjazovLy9nbG9iYWwudHMiLCJ3ZWJwYWNrOi8vL2l0ZXJhdG9yLnRzIiwid2VicGFjazovLy9udW1iZXIudHMiLCJ3ZWJwYWNrOi8vL29iamVjdC50cyIsIndlYnBhY2s6Ly8vc3RyaW5nLnRzIiwid2VicGFjazovLy9xdWV1ZS50cyIsIndlYnBhY2s6Ly8vdXRpbC50cyIsIndlYnBhY2s6Ly8vaGFybmVzcy50cyIsIndlYnBhY2s6Ly8vYXNzZXJ0UmVuZGVyLnRzIiwid2VicGFjazovLy9zZWxlY3Rvci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbWVudS1pdGVtL21lbnVJdGVtLm0uY3NzPzJlNTYiLCJ3ZWJwYWNrOi8vLy4vc3JjL21lbnUvbWVudS5tLmNzcz80MWNiIiwid2VicGFjazovLy9JbmplY3Rvci50cyIsIndlYnBhY2s6Ly8vTm9kZUhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vL1JlZ2lzdHJ5LnRzIiwid2VicGFjazovLy9SZWdpc3RyeUhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vL1dpZGdldEJhc2UudHMiLCJ3ZWJwYWNrOi8vL2Nzc1RyYW5zaXRpb25zLnRzIiwid2VicGFjazovLy9kLnRzIiwid2VicGFjazovLy9hZnRlclJlbmRlci50cyIsIndlYnBhY2s6Ly8vYWx3YXlzUmVuZGVyLnRzIiwid2VicGFjazovLy9iZWZvcmVQcm9wZXJ0aWVzLnRzIiwid2VicGFjazovLy9jdXN0b21FbGVtZW50LnRzIiwid2VicGFjazovLy9kaWZmUHJvcGVydHkudHMiLCJ3ZWJwYWNrOi8vL2hhbmRsZURlY29yYXRvci50cyIsIndlYnBhY2s6Ly8vaW5qZWN0LnRzIiwid2VicGFjazovLy9kaWZmLnRzIiwid2VicGFjazovLy9Qcm9qZWN0b3IudHMiLCJ3ZWJwYWNrOi8vL1RoZW1lZC50cyIsIndlYnBhY2s6Ly8vcmVnaXN0ZXJDdXN0b21FbGVtZW50LnRzIiwid2VicGFjazovLy92ZG9tLnRzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY3NzLXNlbGVjdC11bWQvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGlmZi9kaXN0L2RpZmYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2V0aW1tZWRpYXRlL3NldEltbWVkaWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2xpYi9hZGRTdHlsZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9saWIvdXJscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdGltZXJzLWJyb3dzZXJpZnkvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL21lbnUtaXRlbS9NZW51SXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbWVudS1pdGVtL21lbnVJdGVtLm0uY3NzIiwid2VicGFjazovLy8uL3NyYy9tZW51L01lbnUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL21lbnUvbWVudS5tLmNzcyIsIndlYnBhY2s6Ly8vLi90ZXN0cy91bml0L2FsbC50cyIsIndlYnBhY2s6Ly8vLi90ZXN0cy91bml0L21lbnUtaXRlbS9NZW51SXRlbS50cyIsIndlYnBhY2s6Ly8vLi90ZXN0cy91bml0L21lbnUvTWVudS50cyJdLCJuYW1lcyI6WyJkXzEiLCJyZXF1aXJlIiwiY3VzdG9tRWxlbWVudF8xIiwiVGhlbWVkXzEiLCJXaWRnZXRCYXNlXzEiLCJjc3MiLCJNZW51SXRlbSIsIl9zdXBlciIsInRzbGliXzEiLCJfX2V4dGVuZHMiLCJwcm90b3R5cGUiLCJfb25DbGljayIsInByb3BlcnRpZXMiLCJvblNlbGVjdGVkIiwiZGF0YSIsInJlbmRlciIsIl9hIiwidGl0bGUiLCJzZWxlY3RlZCIsInYiLCJjbGFzc2VzIiwidGhlbWUiLCJyb290IiwiaXRlbSIsIm9uY2xpY2siLCJfX2RlY29yYXRlIiwiY3VzdG9tRWxlbWVudCIsInRhZyIsImF0dHJpYnV0ZXMiLCJldmVudHMiLCJUaGVtZWRNaXhpbiIsIldpZGdldEJhc2UiLCJleHBvcnRzIiwiZGVmYXVsdCIsIk1lbnUiLCJfb25TZWxlY3RlZCIsImlkIiwiX3NlbGVjdGVkSWQiLCJpbnZhbGlkYXRlIiwiX3RoaXMiLCJpdGVtcyIsImNoaWxkcmVuIiwibWFwIiwiY2hpbGQiLCJpbmRleCIsInVuZGVmaW5lZCIsIl9fYXNzaWduIiwibWVudUNvbnRhaW5lciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFB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QUNBO0FBQ0E7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsaUNBQWlDO0FBQ2pDLFlBQVk7QUFDWixJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0osR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBLGtCQUFrQjs7QUFFbEIsT0FBTztBQUNQO0FBQ0E7O0FBRUEsa0JBQWtCLHMvVkFBcy9WLGdJQUFnSSx1cVNBQXVxUyxnSUFBZ0ksbzREQUFvNEQ7O0FBRW56c0IsT0FBTztBQUNQO0FBQ0E7O0FBRUEsa0JBQWtCOztBQUVsQixPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQSxJQUFJO0FBQ0osMkRBQTJEO0FBQzNEOztBQUVBO0FBQ0EsMERBQTBEOztBQUUxRDtBQUNBO0FBQ0EsMERBQTBEOztBQUUxRDtBQUNBLEVBQUU7QUFDRjs7QUFFQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0Esc0JBQXNCOztBQUV0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUNBQW1DLFNBQVM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGLENBQUM7OztBQUdELE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxnQkFBZ0IsZ0JBQWdCO0FBQ2hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1DQUFtQzs7QUFFbkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQSxFQUFFLElBQUk7QUFDTjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsK0RBQStEO0FBQy9EOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSx3Q0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHNCQUFzQixpQkFBaUI7QUFDdkM7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQSxHQUFHO0FBQ0gsZ0JBQWdCO0FBQ2hCO0FBQ0E7O0FBRUEsbUVBQW1FLFFBQVE7QUFDM0U7O0FBRUE7QUFDQSwwQkFBMEIsWUFBWTtBQUN0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87QUFDUDtBQUNBOztBQUVBLGtCQUFrQjs7QUFFbEIsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQSxrQkFBa0I7O0FBRWxCLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaUNBQWlDLE9BQU87QUFDeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsaUNBQWlDLE9BQU87QUFDeEM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaUNBQWlDLGdCQUFnQjtBQUNqRDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsaUNBQWlDLE9BQU87QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQ0FBaUMsT0FBTztBQUN4QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsdUNBQXVDO0FBQ2hFLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSCx5QkFBeUIsMENBQTBDO0FBQ25FO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSx5QkFBeUIsd0JBQXdCO0FBQ2pELEdBQUc7QUFDSCx5QkFBeUIsMkJBQTJCO0FBQ3BEO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSx5QkFBeUIsd0NBQXdDO0FBQ2pFLEdBQUc7QUFDSCx5QkFBeUIsMkNBQTJDO0FBQ3BFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0JBQXdCLG9EQUFvRDtBQUM1RSxFQUFFO0FBQ0Ysd0JBQXdCLHVEQUF1RDtBQUMvRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLEtBQUs7QUFDbkIsY0FBYyxLQUFLO0FBQ25CO0FBQ0EsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxNQUFNO0FBQ3BCO0FBQ0EsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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OztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRCxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLGNBQWMsYUFBYSxHQUFHLGVBQWU7QUFDN0M7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsWUFBWSxZQUFZO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjs7QUFFbEI7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFD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QTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0YsQ0FBQztBQUNEOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsb0NBQW9DLEVBQUU7QUFDaEY7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FB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O0FBQ1IsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxjQUFjOzs7QUFHMUQsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsb0JBQW9CO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNENBQTRDLGNBQWM7OztBQUcxRCxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLGNBQWM7OztBQUcxRCxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUEsNERBQTRELDBCQUEwQiwwQ0FBMEMsZ0JBQWdCLE9BQU8sa0JBQWtCLEVBQUUsYUFBYSxFQUFFLE9BQU8sd0JBQXdCLEVBQUU7O0FBRTNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpREFBaUQscUJBQXFCO0FBQ3RFLHVEQUF1RDs7QUFFdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsaURBQWlEO0FBQ2hFLGdCQUFnQjs7QUFFaEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FB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QUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHNCQUFzQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDOztBQUVyQztBQUNBO0FBQ0E7O0FB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O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUEsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7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RUEsUUFBUSxDQUFDLE1BQU0sRUFBRTtJQUNoQixFQUFFLENBQUMsc0JBQXNCLEVBQUU7UUFDMUIsSUFBTSxTQUFRLEVBQUcsaUJBQU8sQ0FBQyxXQUFJLENBQUM7UUFDOUIsUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxLQUFJLENBQUUsRUFBRSxDQUFDLEtBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLGNBQWEsQ0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xHLENBQUMsQ0FBQztBQUNILENBQUMsQ0FBQyIsImZpbGUiOiJ1bml0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgMGJhYmY2MDU5YmUzOTNmMmEzZGYiLCJpbXBvcnQgeyBIYW5kbGUgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgY3JlYXRlQ29tcG9zaXRlSGFuZGxlIH0gZnJvbSAnLi9sYW5nJztcbmltcG9ydCBQcm9taXNlIGZyb20gJ0Bkb2pvL3NoaW0vUHJvbWlzZSc7XG5cbi8qKlxuICogTm8gb3BlcmF0aW9uIGZ1bmN0aW9uIHRvIHJlcGxhY2Ugb3duIG9uY2UgaW5zdGFuY2UgaXMgZGVzdG9yeWVkXG4gKi9cbmZ1bmN0aW9uIG5vb3AoKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xufVxuXG4vKipcbiAqIE5vIG9wIGZ1bmN0aW9uIHVzZWQgdG8gcmVwbGFjZSBvd24sIG9uY2UgaW5zdGFuY2UgaGFzIGJlZW4gZGVzdG9yeWVkXG4gKi9cbmZ1bmN0aW9uIGRlc3Ryb3llZCgpOiBuZXZlciB7XG5cdHRocm93IG5ldyBFcnJvcignQ2FsbCBtYWRlIHRvIGRlc3Ryb3llZCBtZXRob2QnKTtcbn1cblxuZXhwb3J0IGNsYXNzIERlc3Ryb3lhYmxlIHtcblx0LyoqXG5cdCAqIHJlZ2lzdGVyIGhhbmRsZXMgZm9yIHRoZSBpbnN0YW5jZVxuXHQgKi9cblx0cHJpdmF0ZSBoYW5kbGVzOiBIYW5kbGVbXTtcblxuXHQvKipcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHR0aGlzLmhhbmRsZXMgPSBbXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWdpc3RlciBoYW5kbGVzIGZvciB0aGUgaW5zdGFuY2UgdGhhdCB3aWxsIGJlIGRlc3Ryb3llZCB3aGVuIGB0aGlzLmRlc3Ryb3lgIGlzIGNhbGxlZFxuXHQgKlxuXHQgKiBAcGFyYW0ge0hhbmRsZX0gaGFuZGxlIFRoZSBoYW5kbGUgdG8gYWRkIGZvciB0aGUgaW5zdGFuY2Vcblx0ICogQHJldHVybnMge0hhbmRsZX0gYSBoYW5kbGUgZm9yIHRoZSBoYW5kbGUsIHJlbW92ZXMgdGhlIGhhbmRsZSBmb3IgdGhlIGluc3RhbmNlIGFuZCBjYWxscyBkZXN0cm95XG5cdCAqL1xuXHRvd24oaGFuZGxlczogSGFuZGxlIHwgSGFuZGxlW10pOiBIYW5kbGUge1xuXHRcdGNvbnN0IGhhbmRsZSA9IEFycmF5LmlzQXJyYXkoaGFuZGxlcykgPyBjcmVhdGVDb21wb3NpdGVIYW5kbGUoLi4uaGFuZGxlcykgOiBoYW5kbGVzO1xuXHRcdGNvbnN0IHsgaGFuZGxlczogX2hhbmRsZXMgfSA9IHRoaXM7XG5cdFx0X2hhbmRsZXMucHVzaChoYW5kbGUpO1xuXHRcdHJldHVybiB7XG5cdFx0XHRkZXN0cm95KCkge1xuXHRcdFx0XHRfaGFuZGxlcy5zcGxpY2UoX2hhbmRsZXMuaW5kZXhPZihoYW5kbGUpKTtcblx0XHRcdFx0aGFuZGxlLmRlc3Ryb3koKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIERlc3RycHlzIGFsbCBoYW5kZXJzIHJlZ2lzdGVyZWQgZm9yIHRoZSBpbnN0YW5jZVxuXHQgKlxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnl9IGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIG9uY2UgYWxsIGhhbmRsZXMgaGF2ZSBiZWVuIGRlc3Ryb3llZFxuXHQgKi9cblx0ZGVzdHJveSgpOiBQcm9taXNlPGFueT4ge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdFx0dGhpcy5oYW5kbGVzLmZvckVhY2goKGhhbmRsZSkgPT4ge1xuXHRcdFx0XHRoYW5kbGUgJiYgaGFuZGxlLmRlc3Ryb3kgJiYgaGFuZGxlLmRlc3Ryb3koKTtcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5kZXN0cm95ID0gbm9vcDtcblx0XHRcdHRoaXMub3duID0gZGVzdHJveWVkO1xuXHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHR9KTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBEZXN0cm95YWJsZTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBEZXN0cm95YWJsZS50cyIsImltcG9ydCBNYXAgZnJvbSAnQGRvam8vc2hpbS9NYXAnO1xuaW1wb3J0IHsgSGFuZGxlLCBFdmVudFR5cGUsIEV2ZW50T2JqZWN0IH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IERlc3Ryb3lhYmxlIH0gZnJvbSAnLi9EZXN0cm95YWJsZSc7XG5cbi8qKlxuICogTWFwIG9mIGNvbXB1dGVkIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIGtleWVkIGJ5IHN0cmluZ1xuICovXG5jb25zdCByZWdleE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBSZWdFeHA+KCk7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpcyB0aGUgZXZlbnQgdHlwZSBnbG9iIGhhcyBiZWVuIG1hdGNoZWRcbiAqXG4gKiBAcmV0dXJucyBib29sZWFuIHRoYXQgaW5kaWNhdGVzIGlmIHRoZSBnbG9iIGlzIG1hdGNoZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzR2xvYk1hdGNoKGdsb2JTdHJpbmc6IHN0cmluZyB8IHN5bWJvbCwgdGFyZ2V0U3RyaW5nOiBzdHJpbmcgfCBzeW1ib2wpOiBib29sZWFuIHtcblx0aWYgKHR5cGVvZiB0YXJnZXRTdHJpbmcgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBnbG9iU3RyaW5nID09PSAnc3RyaW5nJyAmJiBnbG9iU3RyaW5nLmluZGV4T2YoJyonKSAhPT0gLTEpIHtcblx0XHRsZXQgcmVnZXg6IFJlZ0V4cDtcblx0XHRpZiAocmVnZXhNYXAuaGFzKGdsb2JTdHJpbmcpKSB7XG5cdFx0XHRyZWdleCA9IHJlZ2V4TWFwLmdldChnbG9iU3RyaW5nKSE7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlZ2V4ID0gbmV3IFJlZ0V4cChgXiR7Z2xvYlN0cmluZy5yZXBsYWNlKC9cXCovZywgJy4qJyl9JGApO1xuXHRcdFx0cmVnZXhNYXAuc2V0KGdsb2JTdHJpbmcsIHJlZ2V4KTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlZ2V4LnRlc3QodGFyZ2V0U3RyaW5nKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZ2xvYlN0cmluZyA9PT0gdGFyZ2V0U3RyaW5nO1xuXHR9XG59XG5cbmV4cG9ydCB0eXBlIEV2ZW50ZWRDYWxsYmFjazxUID0gRXZlbnRUeXBlLCBFIGV4dGVuZHMgRXZlbnRPYmplY3Q8VD4gPSBFdmVudE9iamVjdDxUPj4gPSB7XG5cdC8qKlxuXHQgKiBBIGNhbGxiYWNrIHRoYXQgdGFrZXMgYW4gYGV2ZW50YCBhcmd1bWVudFxuXHQgKlxuXHQgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IG9iamVjdFxuXHQgKi9cblxuXHQoZXZlbnQ6IEUpOiBib29sZWFuIHwgdm9pZDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tRXZlbnRUeXBlczxUIGV4dGVuZHMgRXZlbnRPYmplY3Q8YW55PiA9IEV2ZW50T2JqZWN0PGFueT4+IHtcblx0W2luZGV4OiBzdHJpbmddOiBUO1xufVxuXG4vKipcbiAqIEEgdHlwZSB3aGljaCBpcyBlaXRoZXIgYSB0YXJnZXRlZCBldmVudCBsaXN0ZW5lciBvciBhbiBhcnJheSBvZiBsaXN0ZW5lcnNcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0eXBlIG9mIHRhcmdldCBmb3IgdGhlIGV2ZW50c1xuICogQHRlbXBsYXRlIEUgVGhlIGV2ZW50IHR5cGUgZm9yIHRoZSBldmVudHNcbiAqL1xuZXhwb3J0IHR5cGUgRXZlbnRlZENhbGxiYWNrT3JBcnJheTxUID0gRXZlbnRUeXBlLCBFIGV4dGVuZHMgRXZlbnRPYmplY3Q8VD4gPSBFdmVudE9iamVjdDxUPj4gPVxuXHR8IEV2ZW50ZWRDYWxsYmFjazxULCBFPlxuXHR8IEV2ZW50ZWRDYWxsYmFjazxULCBFPltdO1xuXG4vKipcbiAqIEV2ZW50IENsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudGVkPFxuXHRNIGV4dGVuZHMgQ3VzdG9tRXZlbnRUeXBlcyA9IHt9LFxuXHRUID0gRXZlbnRUeXBlLFxuXHRPIGV4dGVuZHMgRXZlbnRPYmplY3Q8VD4gPSBFdmVudE9iamVjdDxUPlxuPiBleHRlbmRzIERlc3Ryb3lhYmxlIHtcblx0Ly8gVGhlIGZvbGxvd2luZyBtZW1iZXIgaXMgcHVyZWx5IHNvIFR5cGVTY3JpcHQgcmVtZW1iZXJzIHRoZSB0eXBlIG9mIGBNYCB3aGVuIGV4dGVuZGluZyBzb1xuXHQvLyB0aGF0IHRoZSB1dGlsaXRpZXMgaW4gYG9uLnRzYCB3aWxsIHdvcmsgaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8yMDM0OFxuXHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcblx0cHJvdGVjdGVkIF9fdHlwZU1hcF9fPzogTTtcblx0LyoqXG5cdCAqIG1hcCBvZiBsaXN0ZW5lcnMga2V5ZWQgYnkgZXZlbnQgdHlwZVxuXHQgKi9cblx0cHJvdGVjdGVkIGxpc3RlbmVyc01hcDogTWFwPFQgfCBrZXlvZiBNLCBFdmVudGVkQ2FsbGJhY2s8VCwgTz5bXT4gPSBuZXcgTWFwKCk7XG5cblx0LyoqXG5cdCAqIEVtaXRzIHRoZSBldmVudCBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZVxuXHQgKlxuXHQgKiBAcGFyYW0gZXZlbnQgdGhlIGV2ZW50IHRvIGVtaXRcblx0ICovXG5cdGVtaXQ8SyBleHRlbmRzIGtleW9mIE0+KGV2ZW50OiBNW0tdKTogdm9pZDtcblx0ZW1pdChldmVudDogTyk6IHZvaWQ7XG5cdGVtaXQoZXZlbnQ6IGFueSk6IHZvaWQge1xuXHRcdHRoaXMubGlzdGVuZXJzTWFwLmZvckVhY2goKG1ldGhvZHMsIHR5cGUpID0+IHtcblx0XHRcdGlmIChpc0dsb2JNYXRjaCh0eXBlIGFzIGFueSwgZXZlbnQudHlwZSkpIHtcblx0XHRcdFx0bWV0aG9kcy5mb3JFYWNoKChtZXRob2QpID0+IHtcblx0XHRcdFx0XHRtZXRob2QuY2FsbCh0aGlzLCBldmVudCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENhdGNoIGFsbCBoYW5kbGVyIGZvciB2YXJpb3VzIGNhbGwgc2lnbmF0dXJlcy4gVGhlIHNpZ25hdHVyZXMgYXJlIGRlZmluZWQgaW5cblx0ICogYEJhc2VFdmVudGVkRXZlbnRzYC4gIFlvdSBjYW4gYWRkIHlvdXIgb3duIGV2ZW50IHR5cGUgLT4gaGFuZGxlciB0eXBlcyBieSBleHRlbmRpbmdcblx0ICogYEJhc2VFdmVudGVkRXZlbnRzYC4gIFNlZSBleGFtcGxlIGZvciBkZXRhaWxzLlxuXHQgKlxuXHQgKiBAcGFyYW0gYXJnc1xuXHQgKlxuXHQgKiBAZXhhbXBsZVxuXHQgKlxuXHQgKiBpbnRlcmZhY2UgV2lkZ2V0QmFzZUV2ZW50cyBleHRlbmRzIEJhc2VFdmVudGVkRXZlbnRzIHtcblx0ICogICAgICh0eXBlOiAncHJvcGVydGllczpjaGFuZ2VkJywgaGFuZGxlcjogUHJvcGVydGllc0NoYW5nZWRIYW5kbGVyKTogSGFuZGxlO1xuXHQgKiB9XG5cdCAqIGNsYXNzIFdpZGdldEJhc2UgZXh0ZW5kcyBFdmVudGVkIHtcblx0ICogICAgb246IFdpZGdldEJhc2VFdmVudHM7XG5cdCAqIH1cblx0ICpcblx0ICogQHJldHVybiB7YW55fVxuXHQgKi9cblx0b248SyBleHRlbmRzIGtleW9mIE0+KHR5cGU6IEssIGxpc3RlbmVyOiBFdmVudGVkQ2FsbGJhY2tPckFycmF5PEssIE1bS10+KTogSGFuZGxlO1xuXHRvbih0eXBlOiBULCBsaXN0ZW5lcjogRXZlbnRlZENhbGxiYWNrT3JBcnJheTxULCBPPik6IEhhbmRsZTtcblx0b24odHlwZTogYW55LCBsaXN0ZW5lcjogRXZlbnRlZENhbGxiYWNrT3JBcnJheTxhbnksIGFueT4pOiBIYW5kbGUge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KGxpc3RlbmVyKSkge1xuXHRcdFx0Y29uc3QgaGFuZGxlcyA9IGxpc3RlbmVyLm1hcCgobGlzdGVuZXIpID0+IHRoaXMuX2FkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkZXN0cm95KCkge1xuXHRcdFx0XHRcdGhhbmRsZXMuZm9yRWFjaCgoaGFuZGxlKSA9PiBoYW5kbGUuZGVzdHJveSgpKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuX2FkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKTtcblx0fVxuXG5cdHByaXZhdGUgX2FkZExpc3RlbmVyKHR5cGU6IFQgfCBrZXlvZiBNLCBsaXN0ZW5lcjogRXZlbnRlZENhbGxiYWNrPFQsIE8+KSB7XG5cdFx0Y29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnNNYXAuZ2V0KHR5cGUpIHx8IFtdO1xuXHRcdGxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcblx0XHR0aGlzLmxpc3RlbmVyc01hcC5zZXQodHlwZSwgbGlzdGVuZXJzKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0ZGVzdHJveTogKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyc01hcC5nZXQodHlwZSkgfHwgW107XG5cdFx0XHRcdGxpc3RlbmVycy5zcGxpY2UobGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpLCAxKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEV2ZW50ZWQ7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gRXZlbnRlZC50cyIsImltcG9ydCB7IEhhbmRsZSB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBhc3NpZ24gfSBmcm9tICdAZG9qby9zaGltL29iamVjdCc7XG5cbmV4cG9ydCB7IGFzc2lnbiB9IGZyb20gJ0Bkb2pvL3NoaW0vb2JqZWN0JztcblxuY29uc3Qgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5jb25zdCBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVHlwZSBndWFyZCB0aGF0IGVuc3VyZXMgdGhhdCB0aGUgdmFsdWUgY2FuIGJlIGNvZXJjZWQgdG8gT2JqZWN0XG4gKiB0byB3ZWVkIG91dCBob3N0IG9iamVjdHMgdGhhdCBkbyBub3QgZGVyaXZlIGZyb20gT2JqZWN0LlxuICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNoZWNrIGlmIHdlIHdhbnQgdG8gZGVlcCBjb3B5IGFuIG9iamVjdCBvciBub3QuXG4gKiBOb3RlOiBJbiBFUzYgaXQgaXMgcG9zc2libGUgdG8gbW9kaWZ5IGFuIG9iamVjdCdzIFN5bWJvbC50b1N0cmluZ1RhZyBwcm9wZXJ0eSwgd2hpY2ggd2lsbFxuICogY2hhbmdlIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBgdG9TdHJpbmdgLiBUaGlzIGlzIGEgcmFyZSBlZGdlIGNhc2UgdGhhdCBpcyBkaWZmaWN1bHQgdG8gaGFuZGxlLFxuICogc28gaXQgaXMgbm90IGhhbmRsZWQgaGVyZS5cbiAqIEBwYXJhbSAgdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJuICAgICAgIElmIHRoZSB2YWx1ZSBpcyBjb2VyY2libGUgaW50byBhbiBPYmplY3RcbiAqL1xuZnVuY3Rpb24gc2hvdWxkRGVlcENvcHlPYmplY3QodmFsdWU6IGFueSk6IHZhbHVlIGlzIE9iamVjdCB7XG5cdHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJztcbn1cblxuZnVuY3Rpb24gY29weUFycmF5PFQ+KGFycmF5OiBUW10sIGluaGVyaXRlZDogYm9vbGVhbik6IFRbXSB7XG5cdHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24oaXRlbTogVCk6IFQge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG5cdFx0XHRyZXR1cm4gPGFueT5jb3B5QXJyYXkoPGFueT5pdGVtLCBpbmhlcml0ZWQpO1xuXHRcdH1cblxuXHRcdHJldHVybiAhc2hvdWxkRGVlcENvcHlPYmplY3QoaXRlbSlcblx0XHRcdD8gaXRlbVxuXHRcdFx0OiBfbWl4aW4oe1xuXHRcdFx0XHRcdGRlZXA6IHRydWUsXG5cdFx0XHRcdFx0aW5oZXJpdGVkOiBpbmhlcml0ZWQsXG5cdFx0XHRcdFx0c291cmNlczogPEFycmF5PFQ+PltpdGVtXSxcblx0XHRcdFx0XHR0YXJnZXQ6IDxUPnt9XG5cdFx0XHRcdH0pO1xuXHR9KTtcbn1cblxuaW50ZXJmYWNlIE1peGluQXJnczxUIGV4dGVuZHMge30sIFUgZXh0ZW5kcyB7fT4ge1xuXHRkZWVwOiBib29sZWFuO1xuXHRpbmhlcml0ZWQ6IGJvb2xlYW47XG5cdHNvdXJjZXM6IChVIHwgbnVsbCB8IHVuZGVmaW5lZClbXTtcblx0dGFyZ2V0OiBUO1xuXHRjb3BpZWQ/OiBhbnlbXTtcbn1cblxuZnVuY3Rpb24gX21peGluPFQgZXh0ZW5kcyB7fSwgVSBleHRlbmRzIHt9Pihrd0FyZ3M6IE1peGluQXJnczxULCBVPik6IFQgJiBVIHtcblx0Y29uc3QgZGVlcCA9IGt3QXJncy5kZWVwO1xuXHRjb25zdCBpbmhlcml0ZWQgPSBrd0FyZ3MuaW5oZXJpdGVkO1xuXHRjb25zdCB0YXJnZXQ6IGFueSA9IGt3QXJncy50YXJnZXQ7XG5cdGNvbnN0IGNvcGllZCA9IGt3QXJncy5jb3BpZWQgfHwgW107XG5cdGNvbnN0IGNvcGllZENsb25lID0gWy4uLmNvcGllZF07XG5cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBrd0FyZ3Muc291cmNlcy5sZW5ndGg7IGkrKykge1xuXHRcdGNvbnN0IHNvdXJjZSA9IGt3QXJncy5zb3VyY2VzW2ldO1xuXG5cdFx0aWYgKHNvdXJjZSA9PT0gbnVsbCB8fCBzb3VyY2UgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdGZvciAobGV0IGtleSBpbiBzb3VyY2UpIHtcblx0XHRcdGlmIChpbmhlcml0ZWQgfHwgaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcblx0XHRcdFx0bGV0IHZhbHVlOiBhbnkgPSBzb3VyY2Vba2V5XTtcblxuXHRcdFx0XHRpZiAoY29waWVkQ2xvbmUuaW5kZXhPZih2YWx1ZSkgIT09IC0xKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZGVlcCkge1xuXHRcdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0XHRcdFx0dmFsdWUgPSBjb3B5QXJyYXkodmFsdWUsIGluaGVyaXRlZCk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChzaG91bGREZWVwQ29weU9iamVjdCh2YWx1ZSkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHRhcmdldFZhbHVlOiBhbnkgPSB0YXJnZXRba2V5XSB8fCB7fTtcblx0XHRcdFx0XHRcdGNvcGllZC5wdXNoKHNvdXJjZSk7XG5cdFx0XHRcdFx0XHR2YWx1ZSA9IF9taXhpbih7XG5cdFx0XHRcdFx0XHRcdGRlZXA6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGluaGVyaXRlZDogaW5oZXJpdGVkLFxuXHRcdFx0XHRcdFx0XHRzb3VyY2VzOiBbdmFsdWVdLFxuXHRcdFx0XHRcdFx0XHR0YXJnZXQ6IHRhcmdldFZhbHVlLFxuXHRcdFx0XHRcdFx0XHRjb3BpZWRcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR0YXJnZXRba2V5XSA9IHZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiA8VCAmIFU+dGFyZ2V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IGZyb20gdGhlIGdpdmVuIHByb3RvdHlwZSwgYW5kIGNvcGllcyBhbGwgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBvZiBvbmUgb3IgbW9yZVxuICogc291cmNlIG9iamVjdHMgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gcHJvdG90eXBlIFRoZSBwcm90b3R5cGUgdG8gY3JlYXRlIGEgbmV3IG9iamVjdCBmcm9tXG4gKiBAcGFyYW0gbWl4aW5zIEFueSBudW1iZXIgb2Ygb2JqZWN0cyB3aG9zZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIHdpbGwgYmUgY29waWVkIHRvIHRoZSBjcmVhdGVkIG9iamVjdFxuICogQHJldHVybiBUaGUgbmV3IG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlPFxuXHRUIGV4dGVuZHMge30sXG5cdFUgZXh0ZW5kcyB7fSxcblx0ViBleHRlbmRzIHt9LFxuXHRXIGV4dGVuZHMge30sXG5cdFggZXh0ZW5kcyB7fSxcblx0WSBleHRlbmRzIHt9LFxuXHRaIGV4dGVuZHMge31cbj4ocHJvdG90eXBlOiBULCBtaXhpbjE6IFUsIG1peGluMjogViwgbWl4aW4zOiBXLCBtaXhpbjQ6IFgsIG1peGluNTogWSwgbWl4aW42OiBaKTogVCAmIFUgJiBWICYgVyAmIFggJiBZICYgWjtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGU8VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30sIFYgZXh0ZW5kcyB7fSwgVyBleHRlbmRzIHt9LCBYIGV4dGVuZHMge30sIFkgZXh0ZW5kcyB7fT4oXG5cdHByb3RvdHlwZTogVCxcblx0bWl4aW4xOiBVLFxuXHRtaXhpbjI6IFYsXG5cdG1peGluMzogVyxcblx0bWl4aW40OiBYLFxuXHRtaXhpbjU6IFlcbik6IFQgJiBVICYgViAmIFcgJiBYICYgWTtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGU8VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30sIFYgZXh0ZW5kcyB7fSwgVyBleHRlbmRzIHt9LCBYIGV4dGVuZHMge30+KFxuXHRwcm90b3R5cGU6IFQsXG5cdG1peGluMTogVSxcblx0bWl4aW4yOiBWLFxuXHRtaXhpbjM6IFcsXG5cdG1peGluNDogWFxuKTogVCAmIFUgJiBWICYgVyAmIFg7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlPFQgZXh0ZW5kcyB7fSwgVSBleHRlbmRzIHt9LCBWIGV4dGVuZHMge30sIFcgZXh0ZW5kcyB7fT4oXG5cdHByb3RvdHlwZTogVCxcblx0bWl4aW4xOiBVLFxuXHRtaXhpbjI6IFYsXG5cdG1peGluMzogV1xuKTogVCAmIFUgJiBWICYgVztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGU8VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30sIFYgZXh0ZW5kcyB7fT4ocHJvdG90eXBlOiBULCBtaXhpbjE6IFUsIG1peGluMjogVik6IFQgJiBVICYgVjtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGU8VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30+KHByb3RvdHlwZTogVCwgbWl4aW46IFUpOiBUICYgVTtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGU8VCBleHRlbmRzIHt9Pihwcm90b3R5cGU6IFQpOiBUO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZShwcm90b3R5cGU6IGFueSwgLi4ubWl4aW5zOiBhbnlbXSk6IGFueSB7XG5cdGlmICghbWl4aW5zLmxlbmd0aCkge1xuXHRcdHRocm93IG5ldyBSYW5nZUVycm9yKCdsYW5nLmNyZWF0ZSByZXF1aXJlcyBhdCBsZWFzdCBvbmUgbWl4aW4gb2JqZWN0LicpO1xuXHR9XG5cblx0Y29uc3QgYXJncyA9IG1peGlucy5zbGljZSgpO1xuXHRhcmdzLnVuc2hpZnQoT2JqZWN0LmNyZWF0ZShwcm90b3R5cGUpKTtcblxuXHRyZXR1cm4gYXNzaWduLmFwcGx5KG51bGwsIGFyZ3MpO1xufVxuXG4vKipcbiAqIENvcGllcyB0aGUgdmFsdWVzIG9mIGFsbCBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIG9mIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIHRoZSB0YXJnZXQgb2JqZWN0LFxuICogcmVjdXJzaXZlbHkgY29weWluZyBhbGwgbmVzdGVkIG9iamVjdHMgYW5kIGFycmF5cyBhcyB3ZWxsLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gcmVjZWl2ZSB2YWx1ZXMgZnJvbSBzb3VyY2Ugb2JqZWN0c1xuICogQHBhcmFtIHNvdXJjZXMgQW55IG51bWJlciBvZiBvYmplY3RzIHdob3NlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIHRhcmdldCBvYmplY3RcbiAqIEByZXR1cm4gVGhlIG1vZGlmaWVkIHRhcmdldCBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBBc3NpZ248XG5cdFQgZXh0ZW5kcyB7fSxcblx0VSBleHRlbmRzIHt9LFxuXHRWIGV4dGVuZHMge30sXG5cdFcgZXh0ZW5kcyB7fSxcblx0WCBleHRlbmRzIHt9LFxuXHRZIGV4dGVuZHMge30sXG5cdFogZXh0ZW5kcyB7fVxuPih0YXJnZXQ6IFQsIHNvdXJjZTE6IFUsIHNvdXJjZTI6IFYsIHNvdXJjZTM6IFcsIHNvdXJjZTQ6IFgsIHNvdXJjZTU6IFksIHNvdXJjZTY6IFopOiBUICYgVSAmIFYgJiBXICYgWCAmIFkgJiBaO1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBBc3NpZ248VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30sIFYgZXh0ZW5kcyB7fSwgVyBleHRlbmRzIHt9LCBYIGV4dGVuZHMge30sIFkgZXh0ZW5kcyB7fT4oXG5cdHRhcmdldDogVCxcblx0c291cmNlMTogVSxcblx0c291cmNlMjogVixcblx0c291cmNlMzogVyxcblx0c291cmNlNDogWCxcblx0c291cmNlNTogWVxuKTogVCAmIFUgJiBWICYgVyAmIFggJiBZO1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBBc3NpZ248VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30sIFYgZXh0ZW5kcyB7fSwgVyBleHRlbmRzIHt9LCBYIGV4dGVuZHMge30+KFxuXHR0YXJnZXQ6IFQsXG5cdHNvdXJjZTE6IFUsXG5cdHNvdXJjZTI6IFYsXG5cdHNvdXJjZTM6IFcsXG5cdHNvdXJjZTQ6IFhcbik6IFQgJiBVICYgViAmIFcgJiBYO1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBBc3NpZ248VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30sIFYgZXh0ZW5kcyB7fSwgVyBleHRlbmRzIHt9Pihcblx0dGFyZ2V0OiBULFxuXHRzb3VyY2UxOiBVLFxuXHRzb3VyY2UyOiBWLFxuXHRzb3VyY2UzOiBXXG4pOiBUICYgVSAmIFYgJiBXO1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBBc3NpZ248VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30sIFYgZXh0ZW5kcyB7fT4odGFyZ2V0OiBULCBzb3VyY2UxOiBVLCBzb3VyY2UyOiBWKTogVCAmIFUgJiBWO1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBBc3NpZ248VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30+KHRhcmdldDogVCwgc291cmNlOiBVKTogVCAmIFU7XG5leHBvcnQgZnVuY3Rpb24gZGVlcEFzc2lnbih0YXJnZXQ6IGFueSwgLi4uc291cmNlczogYW55W10pOiBhbnkge1xuXHRyZXR1cm4gX21peGluKHtcblx0XHRkZWVwOiB0cnVlLFxuXHRcdGluaGVyaXRlZDogZmFsc2UsXG5cdFx0c291cmNlczogc291cmNlcyxcblx0XHR0YXJnZXQ6IHRhcmdldFxuXHR9KTtcbn1cblxuLyoqXG4gKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBhbGwgZW51bWVyYWJsZSAob3duIG9yIGluaGVyaXRlZCkgcHJvcGVydGllcyBvZiBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byB0aGVcbiAqIHRhcmdldCBvYmplY3QsIHJlY3Vyc2l2ZWx5IGNvcHlpbmcgYWxsIG5lc3RlZCBvYmplY3RzIGFuZCBhcnJheXMgYXMgd2VsbC5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IHRvIHJlY2VpdmUgdmFsdWVzIGZyb20gc291cmNlIG9iamVjdHNcbiAqIEBwYXJhbSBzb3VyY2VzIEFueSBudW1iZXIgb2Ygb2JqZWN0cyB3aG9zZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIHRhcmdldCBvYmplY3RcbiAqIEByZXR1cm4gVGhlIG1vZGlmaWVkIHRhcmdldCBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBNaXhpbjxcblx0VCBleHRlbmRzIHt9LFxuXHRVIGV4dGVuZHMge30sXG5cdFYgZXh0ZW5kcyB7fSxcblx0VyBleHRlbmRzIHt9LFxuXHRYIGV4dGVuZHMge30sXG5cdFkgZXh0ZW5kcyB7fSxcblx0WiBleHRlbmRzIHt9XG4+KHRhcmdldDogVCwgc291cmNlMTogVSwgc291cmNlMjogViwgc291cmNlMzogVywgc291cmNlNDogWCwgc291cmNlNTogWSwgc291cmNlNjogWik6IFQgJiBVICYgViAmIFcgJiBYICYgWSAmIFo7XG5leHBvcnQgZnVuY3Rpb24gZGVlcE1peGluPFQgZXh0ZW5kcyB7fSwgVSBleHRlbmRzIHt9LCBWIGV4dGVuZHMge30sIFcgZXh0ZW5kcyB7fSwgWCBleHRlbmRzIHt9LCBZIGV4dGVuZHMge30+KFxuXHR0YXJnZXQ6IFQsXG5cdHNvdXJjZTE6IFUsXG5cdHNvdXJjZTI6IFYsXG5cdHNvdXJjZTM6IFcsXG5cdHNvdXJjZTQ6IFgsXG5cdHNvdXJjZTU6IFlcbik6IFQgJiBVICYgViAmIFcgJiBYICYgWTtcbmV4cG9ydCBmdW5jdGlvbiBkZWVwTWl4aW48VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30sIFYgZXh0ZW5kcyB7fSwgVyBleHRlbmRzIHt9LCBYIGV4dGVuZHMge30+KFxuXHR0YXJnZXQ6IFQsXG5cdHNvdXJjZTE6IFUsXG5cdHNvdXJjZTI6IFYsXG5cdHNvdXJjZTM6IFcsXG5cdHNvdXJjZTQ6IFhcbik6IFQgJiBVICYgViAmIFcgJiBYO1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBNaXhpbjxUIGV4dGVuZHMge30sIFUgZXh0ZW5kcyB7fSwgViBleHRlbmRzIHt9LCBXIGV4dGVuZHMge30+KFxuXHR0YXJnZXQ6IFQsXG5cdHNvdXJjZTE6IFUsXG5cdHNvdXJjZTI6IFYsXG5cdHNvdXJjZTM6IFdcbik6IFQgJiBVICYgViAmIFc7XG5leHBvcnQgZnVuY3Rpb24gZGVlcE1peGluPFQgZXh0ZW5kcyB7fSwgVSBleHRlbmRzIHt9LCBWIGV4dGVuZHMge30+KHRhcmdldDogVCwgc291cmNlMTogVSwgc291cmNlMjogVik6IFQgJiBVICYgVjtcbmV4cG9ydCBmdW5jdGlvbiBkZWVwTWl4aW48VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30+KHRhcmdldDogVCwgc291cmNlOiBVKTogVCAmIFU7XG5leHBvcnQgZnVuY3Rpb24gZGVlcE1peGluKHRhcmdldDogYW55LCAuLi5zb3VyY2VzOiBhbnlbXSk6IGFueSB7XG5cdHJldHVybiBfbWl4aW4oe1xuXHRcdGRlZXA6IHRydWUsXG5cdFx0aW5oZXJpdGVkOiB0cnVlLFxuXHRcdHNvdXJjZXM6IHNvdXJjZXMsXG5cdFx0dGFyZ2V0OiB0YXJnZXRcblx0fSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3QgdXNpbmcgdGhlIHByb3ZpZGVkIHNvdXJjZSdzIHByb3RvdHlwZSBhcyB0aGUgcHJvdG90eXBlIGZvciB0aGUgbmV3IG9iamVjdCwgYW5kIHRoZW5cbiAqIGRlZXAgY29waWVzIHRoZSBwcm92aWRlZCBzb3VyY2UncyB2YWx1ZXMgaW50byB0aGUgbmV3IHRhcmdldC5cbiAqXG4gKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3QgdG8gZHVwbGljYXRlXG4gKiBAcmV0dXJuIFRoZSBuZXcgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkdXBsaWNhdGU8VCBleHRlbmRzIHt9Pihzb3VyY2U6IFQpOiBUIHtcblx0Y29uc3QgdGFyZ2V0ID0gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2Yoc291cmNlKSk7XG5cblx0cmV0dXJuIGRlZXBNaXhpbih0YXJnZXQsIHNvdXJjZSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHR3byB2YWx1ZXMgYXJlIHRoZSBzYW1lIHZhbHVlLlxuICpcbiAqIEBwYXJhbSBhIEZpcnN0IHZhbHVlIHRvIGNvbXBhcmVcbiAqIEBwYXJhbSBiIFNlY29uZCB2YWx1ZSB0byBjb21wYXJlXG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlcyBhcmUgdGhlIHNhbWU7IGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJZGVudGljYWwoYTogYW55LCBiOiBhbnkpOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHRhID09PSBiIHx8XG5cdFx0LyogYm90aCB2YWx1ZXMgYXJlIE5hTiAqL1xuXHRcdChhICE9PSBhICYmIGIgIT09IGIpXG5cdCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgYmluZHMgYSBtZXRob2QgdG8gdGhlIHNwZWNpZmllZCBvYmplY3QgYXQgcnVudGltZS4gVGhpcyBpcyBzaW1pbGFyIHRvXG4gKiBgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRgLCBidXQgaW5zdGVhZCBvZiBhIGZ1bmN0aW9uIGl0IHRha2VzIHRoZSBuYW1lIG9mIGEgbWV0aG9kIG9uIGFuIG9iamVjdC5cbiAqIEFzIGEgcmVzdWx0LCB0aGUgZnVuY3Rpb24gcmV0dXJuZWQgYnkgYGxhdGVCaW5kYCB3aWxsIGFsd2F5cyBjYWxsIHRoZSBmdW5jdGlvbiBjdXJyZW50bHkgYXNzaWduZWQgdG9cbiAqIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgb24gdGhlIG9iamVjdCBhcyBvZiB0aGUgbW9tZW50IHRoZSBmdW5jdGlvbiBpdCByZXR1cm5zIGlzIGNhbGxlZC5cbiAqXG4gKiBAcGFyYW0gaW5zdGFuY2UgVGhlIGNvbnRleHQgb2JqZWN0XG4gKiBAcGFyYW0gbWV0aG9kIFRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgb24gdGhlIGNvbnRleHQgb2JqZWN0IHRvIGJpbmQgdG8gaXRzZWxmXG4gKiBAcGFyYW0gc3VwcGxpZWRBcmdzIEFuIG9wdGlvbmFsIGFycmF5IG9mIHZhbHVlcyB0byBwcmVwZW5kIHRvIHRoZSBgaW5zdGFuY2VbbWV0aG9kXWAgYXJndW1lbnRzIGxpc3RcbiAqIEByZXR1cm4gVGhlIGJvdW5kIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXRlQmluZChpbnN0YW5jZToge30sIG1ldGhvZDogc3RyaW5nLCAuLi5zdXBwbGllZEFyZ3M6IGFueVtdKTogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkge1xuXHRyZXR1cm4gc3VwcGxpZWRBcmdzLmxlbmd0aFxuXHRcdD8gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGNvbnN0IGFyZ3M6IGFueVtdID0gYXJndW1lbnRzLmxlbmd0aCA/IHN1cHBsaWVkQXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKSA6IHN1cHBsaWVkQXJncztcblxuXHRcdFx0XHQvLyBUUzcwMTdcblx0XHRcdFx0cmV0dXJuICg8YW55Pmluc3RhbmNlKVttZXRob2RdLmFwcGx5KGluc3RhbmNlLCBhcmdzKTtcblx0XHRcdH1cblx0XHQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHQvLyBUUzcwMTdcblx0XHRcdFx0cmV0dXJuICg8YW55Pmluc3RhbmNlKVttZXRob2RdLmFwcGx5KGluc3RhbmNlLCBhcmd1bWVudHMpO1xuXHRcdFx0fTtcbn1cblxuLyoqXG4gKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBhbGwgZW51bWVyYWJsZSAob3duIG9yIGluaGVyaXRlZCkgcHJvcGVydGllcyBvZiBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byB0aGVcbiAqIHRhcmdldCBvYmplY3QuXG4gKlxuICogQHJldHVybiBUaGUgbW9kaWZpZWQgdGFyZ2V0IG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWl4aW48VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30sIFYgZXh0ZW5kcyB7fSwgVyBleHRlbmRzIHt9LCBYIGV4dGVuZHMge30sIFkgZXh0ZW5kcyB7fSwgWiBleHRlbmRzIHt9Pihcblx0dGFyZ2V0OiBULFxuXHRzb3VyY2UxOiBVLFxuXHRzb3VyY2UyOiBWLFxuXHRzb3VyY2UzOiBXLFxuXHRzb3VyY2U0OiBYLFxuXHRzb3VyY2U1OiBZLFxuXHRzb3VyY2U2OiBaXG4pOiBUICYgVSAmIFYgJiBXICYgWCAmIFkgJiBaO1xuZXhwb3J0IGZ1bmN0aW9uIG1peGluPFQgZXh0ZW5kcyB7fSwgVSBleHRlbmRzIHt9LCBWIGV4dGVuZHMge30sIFcgZXh0ZW5kcyB7fSwgWCBleHRlbmRzIHt9LCBZIGV4dGVuZHMge30+KFxuXHR0YXJnZXQ6IFQsXG5cdHNvdXJjZTE6IFUsXG5cdHNvdXJjZTI6IFYsXG5cdHNvdXJjZTM6IFcsXG5cdHNvdXJjZTQ6IFgsXG5cdHNvdXJjZTU6IFlcbik6IFQgJiBVICYgViAmIFcgJiBYICYgWTtcbmV4cG9ydCBmdW5jdGlvbiBtaXhpbjxUIGV4dGVuZHMge30sIFUgZXh0ZW5kcyB7fSwgViBleHRlbmRzIHt9LCBXIGV4dGVuZHMge30sIFggZXh0ZW5kcyB7fT4oXG5cdHRhcmdldDogVCxcblx0c291cmNlMTogVSxcblx0c291cmNlMjogVixcblx0c291cmNlMzogVyxcblx0c291cmNlNDogWFxuKTogVCAmIFUgJiBWICYgVyAmIFg7XG5leHBvcnQgZnVuY3Rpb24gbWl4aW48VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30sIFYgZXh0ZW5kcyB7fSwgVyBleHRlbmRzIHt9Pihcblx0dGFyZ2V0OiBULFxuXHRzb3VyY2UxOiBVLFxuXHRzb3VyY2UyOiBWLFxuXHRzb3VyY2UzOiBXXG4pOiBUICYgVSAmIFYgJiBXO1xuZXhwb3J0IGZ1bmN0aW9uIG1peGluPFQgZXh0ZW5kcyB7fSwgVSBleHRlbmRzIHt9LCBWIGV4dGVuZHMge30+KHRhcmdldDogVCwgc291cmNlMTogVSwgc291cmNlMjogVik6IFQgJiBVICYgVjtcbmV4cG9ydCBmdW5jdGlvbiBtaXhpbjxUIGV4dGVuZHMge30sIFUgZXh0ZW5kcyB7fT4odGFyZ2V0OiBULCBzb3VyY2U6IFUpOiBUICYgVTtcbmV4cG9ydCBmdW5jdGlvbiBtaXhpbih0YXJnZXQ6IGFueSwgLi4uc291cmNlczogYW55W10pOiBhbnkge1xuXHRyZXR1cm4gX21peGluKHtcblx0XHRkZWVwOiBmYWxzZSxcblx0XHRpbmhlcml0ZWQ6IHRydWUsXG5cdFx0c291cmNlczogc291cmNlcyxcblx0XHR0YXJnZXQ6IHRhcmdldFxuXHR9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gd2hpY2ggaW52b2tlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzIHByZXBlbmRlZCB0byBpdHMgYXJndW1lbnQgbGlzdC5cbiAqIExpa2UgYEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kYCwgYnV0IGRvZXMgbm90IGFsdGVyIGV4ZWN1dGlvbiBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSB0YXJnZXRGdW5jdGlvbiBUaGUgZnVuY3Rpb24gdGhhdCBuZWVkcyB0byBiZSBib3VuZFxuICogQHBhcmFtIHN1cHBsaWVkQXJncyBBbiBvcHRpb25hbCBhcnJheSBvZiBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aGUgYHRhcmdldEZ1bmN0aW9uYCBhcmd1bWVudHMgbGlzdFxuICogQHJldHVybiBUaGUgYm91bmQgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnRpYWwodGFyZ2V0RnVuY3Rpb246ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCAuLi5zdXBwbGllZEFyZ3M6IGFueVtdKTogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkge1xuXHRyZXR1cm4gZnVuY3Rpb24odGhpczogYW55KSB7XG5cdFx0Y29uc3QgYXJnczogYW55W10gPSBhcmd1bWVudHMubGVuZ3RoID8gc3VwcGxpZWRBcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpIDogc3VwcGxpZWRBcmdzO1xuXG5cdFx0cmV0dXJuIHRhcmdldEZ1bmN0aW9uLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBkZXN0cm95IG1ldGhvZCB0aGF0LCB3aGVuIGNhbGxlZCwgY2FsbHMgdGhlIHBhc3NlZC1pbiBkZXN0cnVjdG9yLlxuICogVGhpcyBpcyBpbnRlbmRlZCB0byBwcm92aWRlIGEgdW5pZmllZCBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIFwicmVtb3ZlXCIgLyBcImRlc3Ryb3lcIiBoYW5kbGVycyBmb3JcbiAqIGV2ZW50IGxpc3RlbmVycywgdGltZXJzLCBldGMuXG4gKlxuICogQHBhcmFtIGRlc3RydWN0b3IgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGhhbmRsZSdzIGBkZXN0cm95YCBtZXRob2QgaXMgaW52b2tlZFxuICogQHJldHVybiBUaGUgaGFuZGxlIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSGFuZGxlKGRlc3RydWN0b3I6ICgpID0+IHZvaWQpOiBIYW5kbGUge1xuXHRsZXQgY2FsbGVkID0gZmFsc2U7XG5cdHJldHVybiB7XG5cdFx0ZGVzdHJveTogZnVuY3Rpb24odGhpczogSGFuZGxlKSB7XG5cdFx0XHRpZiAoIWNhbGxlZCkge1xuXHRcdFx0XHRjYWxsZWQgPSB0cnVlO1xuXHRcdFx0XHRkZXN0cnVjdG9yKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBzaW5nbGUgaGFuZGxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVzdHJveSBtdWx0aXBsZSBoYW5kbGVzIHNpbXVsdGFuZW91c2x5LlxuICpcbiAqIEBwYXJhbSBoYW5kbGVzIEFuIGFycmF5IG9mIGhhbmRsZXMgd2l0aCBgZGVzdHJveWAgbWV0aG9kc1xuICogQHJldHVybiBUaGUgaGFuZGxlIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29tcG9zaXRlSGFuZGxlKC4uLmhhbmRsZXM6IEhhbmRsZVtdKTogSGFuZGxlIHtcblx0cmV0dXJuIGNyZWF0ZUhhbmRsZShmdW5jdGlvbigpIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGhhbmRsZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGhhbmRsZXNbaV0uZGVzdHJveSgpO1xuXHRcdH1cblx0fSk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gbGFuZy50cyIsImltcG9ydCBoYXMsIHsgYWRkIH0gZnJvbSAnQGRvam8vaGFzL2hhcyc7XG5pbXBvcnQgZ2xvYmFsIGZyb20gJy4uL2dsb2JhbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGhhcztcbmV4cG9ydCAqIGZyb20gJ0Bkb2pvL2hhcy9oYXMnO1xuXG4vKiBFQ01BU2NyaXB0IDYgYW5kIDcgRmVhdHVyZXMgKi9cblxuLyogQXJyYXkgKi9cbmFkZChcblx0J2VzNi1hcnJheScsXG5cdCgpID0+IHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0Wydmcm9tJywgJ29mJ10uZXZlcnkoKGtleSkgPT4ga2V5IGluIGdsb2JhbC5BcnJheSkgJiZcblx0XHRcdFsnZmluZEluZGV4JywgJ2ZpbmQnLCAnY29weVdpdGhpbiddLmV2ZXJ5KChrZXkpID0+IGtleSBpbiBnbG9iYWwuQXJyYXkucHJvdG90eXBlKVxuXHRcdCk7XG5cdH0sXG5cdHRydWVcbik7XG5cbmFkZChcblx0J2VzNi1hcnJheS1maWxsJyxcblx0KCkgPT4ge1xuXHRcdGlmICgnZmlsbCcgaW4gZ2xvYmFsLkFycmF5LnByb3RvdHlwZSkge1xuXHRcdFx0LyogU29tZSB2ZXJzaW9ucyBvZiBTYWZhcmkgZG8gbm90IHByb3Blcmx5IGltcGxlbWVudCB0aGlzICovXG5cdFx0XHRyZXR1cm4gKDxhbnk+WzFdKS5maWxsKDksIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSlbMF0gPT09IDE7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblx0dHJ1ZVxuKTtcblxuYWRkKCdlczctYXJyYXknLCAoKSA9PiAnaW5jbHVkZXMnIGluIGdsb2JhbC5BcnJheS5wcm90b3R5cGUsIHRydWUpO1xuXG4vKiBNYXAgKi9cbmFkZChcblx0J2VzNi1tYXAnLFxuXHQoKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBnbG9iYWwuTWFwID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHQvKlxuXHRcdElFMTEgYW5kIG9sZGVyIHZlcnNpb25zIG9mIFNhZmFyaSBhcmUgbWlzc2luZyBjcml0aWNhbCBFUzYgTWFwIGZ1bmN0aW9uYWxpdHlcblx0XHRXZSB3cmFwIHRoaXMgaW4gYSB0cnkvY2F0Y2ggYmVjYXVzZSBzb21ldGltZXMgdGhlIE1hcCBjb25zdHJ1Y3RvciBleGlzdHMsIGJ1dCBkb2VzIG5vdFxuXHRcdHRha2UgYXJndW1lbnRzIChpT1MgOC40KVxuXHRcdCAqL1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgbWFwID0gbmV3IGdsb2JhbC5NYXAoW1swLCAxXV0pO1xuXG5cdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0bWFwLmhhcygwKSAmJlxuXHRcdFx0XHRcdHR5cGVvZiBtYXAua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdFx0XHRcdGhhcygnZXM2LXN5bWJvbCcpICYmXG5cdFx0XHRcdFx0dHlwZW9mIG1hcC52YWx1ZXMgPT09ICdmdW5jdGlvbicgJiZcblx0XHRcdFx0XHR0eXBlb2YgbWFwLmVudHJpZXMgPT09ICdmdW5jdGlvbidcblx0XHRcdFx0KTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0LyogaXN0YW5idWwgaWdub3JlIG5leHQ6IG5vdCB0ZXN0aW5nIG9uIGlPUyBhdCB0aGUgbW9tZW50ICovXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXHR0cnVlXG4pO1xuXG4vKiBNYXRoICovXG5hZGQoXG5cdCdlczYtbWF0aCcsXG5cdCgpID0+IHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0J2NsejMyJyxcblx0XHRcdCdzaWduJyxcblx0XHRcdCdsb2cxMCcsXG5cdFx0XHQnbG9nMicsXG5cdFx0XHQnbG9nMXAnLFxuXHRcdFx0J2V4cG0xJyxcblx0XHRcdCdjb3NoJyxcblx0XHRcdCdzaW5oJyxcblx0XHRcdCd0YW5oJyxcblx0XHRcdCdhY29zaCcsXG5cdFx0XHQnYXNpbmgnLFxuXHRcdFx0J2F0YW5oJyxcblx0XHRcdCd0cnVuYycsXG5cdFx0XHQnZnJvdW5kJyxcblx0XHRcdCdjYnJ0Jyxcblx0XHRcdCdoeXBvdCdcblx0XHRdLmV2ZXJ5KChuYW1lKSA9PiB0eXBlb2YgZ2xvYmFsLk1hdGhbbmFtZV0gPT09ICdmdW5jdGlvbicpO1xuXHR9LFxuXHR0cnVlXG4pO1xuXG5hZGQoXG5cdCdlczYtbWF0aC1pbXVsJyxcblx0KCkgPT4ge1xuXHRcdGlmICgnaW11bCcgaW4gZ2xvYmFsLk1hdGgpIHtcblx0XHRcdC8qIFNvbWUgdmVyc2lvbnMgb2YgU2FmYXJpIG9uIGlvcyBkbyBub3QgcHJvcGVybHkgaW1wbGVtZW50IHRoaXMgKi9cblx0XHRcdHJldHVybiAoPGFueT5NYXRoKS5pbXVsKDB4ZmZmZmZmZmYsIDUpID09PSAtNTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXHR0cnVlXG4pO1xuXG4vKiBPYmplY3QgKi9cbmFkZChcblx0J2VzNi1vYmplY3QnLFxuXHQoKSA9PiB7XG5cdFx0cmV0dXJuIChcblx0XHRcdGhhcygnZXM2LXN5bWJvbCcpICYmXG5cdFx0XHRbJ2Fzc2lnbicsICdpcycsICdnZXRPd25Qcm9wZXJ0eVN5bWJvbHMnLCAnc2V0UHJvdG90eXBlT2YnXS5ldmVyeShcblx0XHRcdFx0KG5hbWUpID0+IHR5cGVvZiBnbG9iYWwuT2JqZWN0W25hbWVdID09PSAnZnVuY3Rpb24nXG5cdFx0XHQpXG5cdFx0KTtcblx0fSxcblx0dHJ1ZVxuKTtcblxuYWRkKFxuXHQnZXMyMDE3LW9iamVjdCcsXG5cdCgpID0+IHtcblx0XHRyZXR1cm4gWyd2YWx1ZXMnLCAnZW50cmllcycsICdnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzJ10uZXZlcnkoXG5cdFx0XHQobmFtZSkgPT4gdHlwZW9mIGdsb2JhbC5PYmplY3RbbmFtZV0gPT09ICdmdW5jdGlvbidcblx0XHQpO1xuXHR9LFxuXHR0cnVlXG4pO1xuXG4vKiBPYnNlcnZhYmxlICovXG5hZGQoJ2VzLW9ic2VydmFibGUnLCAoKSA9PiB0eXBlb2YgZ2xvYmFsLk9ic2VydmFibGUgIT09ICd1bmRlZmluZWQnLCB0cnVlKTtcblxuLyogUHJvbWlzZSAqL1xuYWRkKCdlczYtcHJvbWlzZScsICgpID0+IHR5cGVvZiBnbG9iYWwuUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgaGFzKCdlczYtc3ltYm9sJyksIHRydWUpO1xuXG4vKiBTZXQgKi9cbmFkZChcblx0J2VzNi1zZXQnLFxuXHQoKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBnbG9iYWwuU2V0ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHQvKiBJRTExIGFuZCBvbGRlciB2ZXJzaW9ucyBvZiBTYWZhcmkgYXJlIG1pc3NpbmcgY3JpdGljYWwgRVM2IFNldCBmdW5jdGlvbmFsaXR5ICovXG5cdFx0XHRjb25zdCBzZXQgPSBuZXcgZ2xvYmFsLlNldChbMV0pO1xuXHRcdFx0cmV0dXJuIHNldC5oYXMoMSkgJiYgJ2tleXMnIGluIHNldCAmJiB0eXBlb2Ygc2V0LmtleXMgPT09ICdmdW5jdGlvbicgJiYgaGFzKCdlczYtc3ltYm9sJyk7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblx0dHJ1ZVxuKTtcblxuLyogU3RyaW5nICovXG5hZGQoXG5cdCdlczYtc3RyaW5nJyxcblx0KCkgPT4ge1xuXHRcdHJldHVybiAoXG5cdFx0XHRbXG5cdFx0XHRcdC8qIHN0YXRpYyBtZXRob2RzICovXG5cdFx0XHRcdCdmcm9tQ29kZVBvaW50J1xuXHRcdFx0XS5ldmVyeSgoa2V5KSA9PiB0eXBlb2YgZ2xvYmFsLlN0cmluZ1trZXldID09PSAnZnVuY3Rpb24nKSAmJlxuXHRcdFx0W1xuXHRcdFx0XHQvKiBpbnN0YW5jZSBtZXRob2RzICovXG5cdFx0XHRcdCdjb2RlUG9pbnRBdCcsXG5cdFx0XHRcdCdub3JtYWxpemUnLFxuXHRcdFx0XHQncmVwZWF0Jyxcblx0XHRcdFx0J3N0YXJ0c1dpdGgnLFxuXHRcdFx0XHQnZW5kc1dpdGgnLFxuXHRcdFx0XHQnaW5jbHVkZXMnXG5cdFx0XHRdLmV2ZXJ5KChrZXkpID0+IHR5cGVvZiBnbG9iYWwuU3RyaW5nLnByb3RvdHlwZVtrZXldID09PSAnZnVuY3Rpb24nKVxuXHRcdCk7XG5cdH0sXG5cdHRydWVcbik7XG5cbmFkZChcblx0J2VzNi1zdHJpbmctcmF3Jyxcblx0KCkgPT4ge1xuXHRcdGZ1bmN0aW9uIGdldENhbGxTaXRlKGNhbGxTaXRlOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSwgLi4uc3Vic3RpdHV0aW9uczogYW55W10pIHtcblx0XHRcdGNvbnN0IHJlc3VsdCA9IFsuLi5jYWxsU2l0ZV07XG5cdFx0XHQocmVzdWx0IGFzIGFueSkucmF3ID0gY2FsbFNpdGUucmF3O1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRpZiAoJ3JhdycgaW4gZ2xvYmFsLlN0cmluZykge1xuXHRcdFx0bGV0IGIgPSAxO1xuXHRcdFx0bGV0IGNhbGxTaXRlID0gZ2V0Q2FsbFNpdGVgYVxcbiR7Yn1gO1xuXG5cdFx0XHQoY2FsbFNpdGUgYXMgYW55KS5yYXcgPSBbJ2FcXFxcbiddO1xuXHRcdFx0Y29uc3Qgc3VwcG9ydHNUcnVuYyA9IGdsb2JhbC5TdHJpbmcucmF3KGNhbGxTaXRlLCA0MikgPT09ICdhOlxcXFxuJztcblxuXHRcdFx0cmV0dXJuIHN1cHBvcnRzVHJ1bmM7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXHR0cnVlXG4pO1xuXG5hZGQoXG5cdCdlczIwMTctc3RyaW5nJyxcblx0KCkgPT4ge1xuXHRcdHJldHVybiBbJ3BhZFN0YXJ0JywgJ3BhZEVuZCddLmV2ZXJ5KChrZXkpID0+IHR5cGVvZiBnbG9iYWwuU3RyaW5nLnByb3RvdHlwZVtrZXldID09PSAnZnVuY3Rpb24nKTtcblx0fSxcblx0dHJ1ZVxuKTtcblxuLyogU3ltYm9sICovXG5hZGQoJ2VzNi1zeW1ib2wnLCAoKSA9PiB0eXBlb2YgZ2xvYmFsLlN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIFN5bWJvbCgpID09PSAnc3ltYm9sJywgdHJ1ZSk7XG5cbi8qIFdlYWtNYXAgKi9cbmFkZChcblx0J2VzNi13ZWFrbWFwJyxcblx0KCkgPT4ge1xuXHRcdGlmICh0eXBlb2YgZ2xvYmFsLldlYWtNYXAgIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHQvKiBJRTExIGFuZCBvbGRlciB2ZXJzaW9ucyBvZiBTYWZhcmkgYXJlIG1pc3NpbmcgY3JpdGljYWwgRVM2IE1hcCBmdW5jdGlvbmFsaXR5ICovXG5cdFx0XHRjb25zdCBrZXkxID0ge307XG5cdFx0XHRjb25zdCBrZXkyID0ge307XG5cdFx0XHRjb25zdCBtYXAgPSBuZXcgZ2xvYmFsLldlYWtNYXAoW1trZXkxLCAxXV0pO1xuXHRcdFx0T2JqZWN0LmZyZWV6ZShrZXkxKTtcblx0XHRcdHJldHVybiBtYXAuZ2V0KGtleTEpID09PSAxICYmIG1hcC5zZXQoa2V5MiwgMikgPT09IG1hcCAmJiBoYXMoJ2VzNi1zeW1ib2wnKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXHR0cnVlXG4pO1xuXG4vKiBNaXNjZWxsYW5lb3VzIGZlYXR1cmVzICovXG5hZGQoJ21pY3JvdGFza3MnLCAoKSA9PiBoYXMoJ2VzNi1wcm9taXNlJykgfHwgaGFzKCdob3N0LW5vZGUnKSB8fCBoYXMoJ2RvbS1tdXRhdGlvbm9ic2VydmVyJyksIHRydWUpO1xuYWRkKFxuXHQncG9zdG1lc3NhZ2UnLFxuXHQoKSA9PiB7XG5cdFx0Ly8gSWYgd2luZG93IGlzIHVuZGVmaW5lZCwgYW5kIHdlIGhhdmUgcG9zdE1lc3NhZ2UsIGl0IHByb2JhYmx5IG1lYW5zIHdlJ3JlIGluIGEgd2ViIHdvcmtlci4gV2ViIHdvcmtlcnMgaGF2ZVxuXHRcdC8vIHBvc3QgbWVzc2FnZSBidXQgaXQgZG9lc24ndCB3b3JrIGhvdyB3ZSBleHBlY3QgaXQgdG8sIHNvIGl0J3MgYmVzdCBqdXN0IHRvIHByZXRlbmQgaXQgZG9lc24ndCBleGlzdC5cblx0XHRyZXR1cm4gdHlwZW9mIGdsb2JhbC53aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBnbG9iYWwucG9zdE1lc3NhZ2UgPT09ICdmdW5jdGlvbic7XG5cdH0sXG5cdHRydWVcbik7XG5hZGQoJ3JhZicsICgpID0+IHR5cGVvZiBnbG9iYWwucmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nLCB0cnVlKTtcbmFkZCgnc2V0aW1tZWRpYXRlJywgKCkgPT4gdHlwZW9mIGdsb2JhbC5zZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnLCB0cnVlKTtcblxuLyogRE9NIEZlYXR1cmVzICovXG5cbmFkZChcblx0J2RvbS1tdXRhdGlvbm9ic2VydmVyJyxcblx0KCkgPT4ge1xuXHRcdGlmIChoYXMoJ2hvc3QtYnJvd3NlcicpICYmIEJvb2xlYW4oZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXIpKSB7XG5cdFx0XHQvLyBJRTExIGhhcyBhbiB1bnJlbGlhYmxlIE11dGF0aW9uT2JzZXJ2ZXIgaW1wbGVtZW50YXRpb24gd2hlcmUgc2V0UHJvcGVydHkoKSBkb2VzIG5vdFxuXHRcdFx0Ly8gZ2VuZXJhdGUgYSBtdXRhdGlvbiBldmVudCwgb2JzZXJ2ZXJzIGNhbiBjcmFzaCwgYW5kIHRoZSBxdWV1ZSBkb2VzIG5vdCBkcmFpblxuXHRcdFx0Ly8gcmVsaWFibHkuIFRoZSBmb2xsb3dpbmcgZmVhdHVyZSB0ZXN0IHdhcyBhZGFwdGVkIGZyb21cblx0XHRcdC8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3QxMGtvLzRhY2ViOGM3MTY4MWZkYjI3NWUzM2VmZTVlNTc2YjE0XG5cdFx0XHRjb25zdCBleGFtcGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0XHQvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZSAqL1xuXHRcdFx0Y29uc3QgSG9zdE11dGF0aW9uT2JzZXJ2ZXIgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcblx0XHRcdGNvbnN0IG9ic2VydmVyID0gbmV3IEhvc3RNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKCkge30pO1xuXHRcdFx0b2JzZXJ2ZXIub2JzZXJ2ZShleGFtcGxlLCB7IGF0dHJpYnV0ZXM6IHRydWUgfSk7XG5cblx0XHRcdGV4YW1wbGUuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCAnYmxvY2snKTtcblxuXHRcdFx0cmV0dXJuIEJvb2xlYW4ob2JzZXJ2ZXIudGFrZVJlY29yZHMoKS5sZW5ndGgpO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cdHRydWVcbik7XG5cbmFkZChcblx0J2RvbS13ZWJhbmltYXRpb24nLFxuXHQoKSA9PiBoYXMoJ2hvc3QtYnJvd3NlcicpICYmIGdsb2JhbC5BbmltYXRpb24gIT09IHVuZGVmaW5lZCAmJiBnbG9iYWwuS2V5ZnJhbWVFZmZlY3QgIT09IHVuZGVmaW5lZCxcblx0dHJ1ZVxuKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBoYXMudHMiLCJpbXBvcnQgeyBpc0FycmF5TGlrZSwgSXRlcmFibGUsIEl0ZXJhYmxlSXRlcmF0b3IsIFNoaW1JdGVyYXRvciB9IGZyb20gJy4vaXRlcmF0b3InO1xuaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XG5pbXBvcnQgeyBpcyBhcyBvYmplY3RJcyB9IGZyb20gJy4vb2JqZWN0JztcbmltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XG5pbXBvcnQgJy4vU3ltYm9sJztcblxuZXhwb3J0IGludGVyZmFjZSBNYXA8SywgVj4ge1xuXHQvKipcblx0ICogRGVsZXRlcyBhbGwga2V5cyBhbmQgdGhlaXIgYXNzb2NpYXRlZCB2YWx1ZXMuXG5cdCAqL1xuXHRjbGVhcigpOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBEZWxldGVzIGEgZ2l2ZW4ga2V5IGFuZCBpdHMgYXNzb2NpYXRlZCB2YWx1ZS5cblx0ICpcblx0ICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGRlbGV0ZVxuXHQgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGtleSBleGlzdHMsIGZhbHNlIGlmIGl0IGRvZXMgbm90XG5cdCAqL1xuXHRkZWxldGUoa2V5OiBLKTogYm9vbGVhbjtcblxuXHQvKipcblx0ICogUmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IHlpZWxkcyBlYWNoIGtleS92YWx1ZSBwYWlyIGFzIGFuIGFycmF5LlxuXHQgKlxuXHQgKiBAcmV0dXJuIEFuIGl0ZXJhdG9yIGZvciBlYWNoIGtleS92YWx1ZSBwYWlyIGluIHRoZSBpbnN0YW5jZS5cblx0ICovXG5cdGVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbSywgVl0+O1xuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBhIGdpdmVuIGZ1bmN0aW9uIGZvciBlYWNoIG1hcCBlbnRyeS4gVGhlIGZ1bmN0aW9uXG5cdCAqIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6IHRoZSBlbGVtZW50IHZhbHVlLCB0aGVcblx0ICogZWxlbWVudCBrZXksIGFuZCB0aGUgYXNzb2NpYXRlZCBNYXAgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBjYWxsYmFja2ZuIFRoZSBmdW5jdGlvbiB0byBleGVjdXRlIGZvciBlYWNoIG1hcCBlbnRyeSxcblx0ICogQHBhcmFtIHRoaXNBcmcgVGhlIHZhbHVlIHRvIHVzZSBmb3IgYHRoaXNgIGZvciBlYWNoIGV4ZWN1dGlvbiBvZiB0aGUgY2FsYmFja1xuXHQgKi9cblx0Zm9yRWFjaChjYWxsYmFja2ZuOiAodmFsdWU6IFYsIGtleTogSywgbWFwOiBNYXA8SywgVj4pID0+IHZvaWQsIHRoaXNBcmc/OiBhbnkpOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBrZXkuXG5cdCAqXG5cdCAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byBsb29rIHVwXG5cdCAqIEByZXR1cm4gVGhlIHZhbHVlIGlmIG9uZSBleGlzdHMgb3IgdW5kZWZpbmVkXG5cdCAqL1xuXHRnZXQoa2V5OiBLKTogViB8IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogUmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IHlpZWxkcyBlYWNoIGtleSBpbiB0aGUgbWFwLlxuXHQgKlxuXHQgKiBAcmV0dXJuIEFuIGl0ZXJhdG9yIGNvbnRhaW5pbmcgdGhlIGluc3RhbmNlJ3Mga2V5cy5cblx0ICovXG5cdGtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxLPjtcblxuXHQvKipcblx0ICogQ2hlY2tzIGZvciB0aGUgcHJlc2VuY2Ugb2YgYSBnaXZlbiBrZXkuXG5cdCAqXG5cdCAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byBjaGVjayBmb3Jcblx0ICogQHJldHVybiB0cnVlIGlmIHRoZSBrZXkgZXhpc3RzLCBmYWxzZSBpZiBpdCBkb2VzIG5vdFxuXHQgKi9cblx0aGFzKGtleTogSyk6IGJvb2xlYW47XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGtleS5cblx0ICpcblx0ICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGRlZmluZSBhIHZhbHVlIHRvXG5cdCAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduXG5cdCAqIEByZXR1cm4gVGhlIE1hcCBpbnN0YW5jZVxuXHQgKi9cblx0c2V0KGtleTogSywgdmFsdWU6IFYpOiB0aGlzO1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5IC8gdmFsdWUgcGFpcnMgaW4gdGhlIE1hcC5cblx0ICovXG5cdHJlYWRvbmx5IHNpemU6IG51bWJlcjtcblxuXHQvKipcblx0ICogUmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IHlpZWxkcyBlYWNoIHZhbHVlIGluIHRoZSBtYXAuXG5cdCAqXG5cdCAqIEByZXR1cm4gQW4gaXRlcmF0b3IgY29udGFpbmluZyB0aGUgaW5zdGFuY2UncyB2YWx1ZXMuXG5cdCAqL1xuXHR2YWx1ZXMoKTogSXRlcmFibGVJdGVyYXRvcjxWPjtcblxuXHQvKiogUmV0dXJucyBhbiBpdGVyYWJsZSBvZiBlbnRyaWVzIGluIHRoZSBtYXAuICovXG5cdFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0ssIFZdPjtcblxuXHRyZWFkb25seSBbU3ltYm9sLnRvU3RyaW5nVGFnXTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hcENvbnN0cnVjdG9yIHtcblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgTWFwXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0bmV3ICgpOiBNYXA8YW55LCBhbnk+O1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IE1hcFxuXHQgKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICpcblx0ICogQHBhcmFtIGl0ZXJhdG9yXG5cdCAqIEFycmF5IG9yIGl0ZXJhdG9yIGNvbnRhaW5pbmcgdHdvLWl0ZW0gdHVwbGVzIHVzZWQgdG8gaW5pdGlhbGx5IHBvcHVsYXRlIHRoZSBtYXAuXG5cdCAqIFRoZSBmaXJzdCBpdGVtIGluIGVhY2ggdHVwbGUgY29ycmVzcG9uZHMgdG8gdGhlIGtleSBvZiB0aGUgbWFwIGVudHJ5LlxuXHQgKiBUaGUgc2Vjb25kIGl0ZW0gY29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIG9mIHRoZSBtYXAgZW50cnkuXG5cdCAqL1xuXHRuZXcgPEssIFY+KGl0ZXJhdG9yPzogW0ssIFZdW10pOiBNYXA8SywgVj47XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgTWFwXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKlxuXHQgKiBAcGFyYW0gaXRlcmF0b3Jcblx0ICogQXJyYXkgb3IgaXRlcmF0b3IgY29udGFpbmluZyB0d28taXRlbSB0dXBsZXMgdXNlZCB0byBpbml0aWFsbHkgcG9wdWxhdGUgdGhlIG1hcC5cblx0ICogVGhlIGZpcnN0IGl0ZW0gaW4gZWFjaCB0dXBsZSBjb3JyZXNwb25kcyB0byB0aGUga2V5IG9mIHRoZSBtYXAgZW50cnkuXG5cdCAqIFRoZSBzZWNvbmQgaXRlbSBjb3JyZXNwb25kcyB0byB0aGUgdmFsdWUgb2YgdGhlIG1hcCBlbnRyeS5cblx0ICovXG5cdG5ldyA8SywgVj4oaXRlcmF0b3I6IEl0ZXJhYmxlPFtLLCBWXT4pOiBNYXA8SywgVj47XG5cblx0cmVhZG9ubHkgcHJvdG90eXBlOiBNYXA8YW55LCBhbnk+O1xuXG5cdHJlYWRvbmx5IFtTeW1ib2wuc3BlY2llc106IE1hcENvbnN0cnVjdG9yO1xufVxuXG5leHBvcnQgbGV0IE1hcDogTWFwQ29uc3RydWN0b3IgPSBnbG9iYWwuTWFwO1xuXG5pZiAoIWhhcygnZXM2LW1hcCcpKSB7XG5cdE1hcCA9IGNsYXNzIE1hcDxLLCBWPiB7XG5cdFx0cHJvdGVjdGVkIHJlYWRvbmx5IF9rZXlzOiBLW10gPSBbXTtcblx0XHRwcm90ZWN0ZWQgcmVhZG9ubHkgX3ZhbHVlczogVltdID0gW107XG5cblx0XHQvKipcblx0XHQgKiBBbiBhbHRlcm5hdGl2ZSB0byBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiB1c2luZyBPYmplY3QuaXNcblx0XHQgKiB0byBjaGVjayBmb3IgZXF1YWxpdHkuIFNlZSBodHRwOi8vbXpsLmxhLzF6dUtPMlZcblx0XHQgKi9cblx0XHRwcm90ZWN0ZWQgX2luZGV4T2ZLZXkoa2V5czogS1tdLCBrZXk6IEspOiBudW1iZXIge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKG9iamVjdElzKGtleXNbaV0sIGtleSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIC0xO1xuXHRcdH1cblxuXHRcdHN0YXRpYyBbU3ltYm9sLnNwZWNpZXNdID0gTWFwO1xuXG5cdFx0Y29uc3RydWN0b3IoaXRlcmFibGU/OiBBcnJheUxpa2U8W0ssIFZdPiB8IEl0ZXJhYmxlPFtLLCBWXT4pIHtcblx0XHRcdGlmIChpdGVyYWJsZSkge1xuXHRcdFx0XHRpZiAoaXNBcnJheUxpa2UoaXRlcmFibGUpKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBpdGVyYWJsZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0Y29uc3QgdmFsdWUgPSBpdGVyYWJsZVtpXTtcblx0XHRcdFx0XHRcdHRoaXMuc2V0KHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZvciAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcblx0XHRcdFx0XHRcdHRoaXMuc2V0KHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Z2V0IHNpemUoKTogbnVtYmVyIHtcblx0XHRcdHJldHVybiB0aGlzLl9rZXlzLmxlbmd0aDtcblx0XHR9XG5cblx0XHRjbGVhcigpOiB2b2lkIHtcblx0XHRcdHRoaXMuX2tleXMubGVuZ3RoID0gdGhpcy5fdmFsdWVzLmxlbmd0aCA9IDA7XG5cdFx0fVxuXG5cdFx0ZGVsZXRlKGtleTogSyk6IGJvb2xlYW4ge1xuXHRcdFx0Y29uc3QgaW5kZXggPSB0aGlzLl9pbmRleE9mS2V5KHRoaXMuX2tleXMsIGtleSk7XG5cdFx0XHRpZiAoaW5kZXggPCAwKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX2tleXMuc3BsaWNlKGluZGV4LCAxKTtcblx0XHRcdHRoaXMuX3ZhbHVlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0ZW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtLLCBWXT4ge1xuXHRcdFx0Y29uc3QgdmFsdWVzID0gdGhpcy5fa2V5cy5tYXAoKGtleTogSywgaTogbnVtYmVyKTogW0ssIFZdID0+IHtcblx0XHRcdFx0cmV0dXJuIFtrZXksIHRoaXMuX3ZhbHVlc1tpXV07XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIG5ldyBTaGltSXRlcmF0b3IodmFsdWVzKTtcblx0XHR9XG5cblx0XHRmb3JFYWNoKGNhbGxiYWNrOiAodmFsdWU6IFYsIGtleTogSywgbWFwSW5zdGFuY2U6IE1hcDxLLCBWPikgPT4gYW55LCBjb250ZXh0Pzoge30pIHtcblx0XHRcdGNvbnN0IGtleXMgPSB0aGlzLl9rZXlzO1xuXHRcdFx0Y29uc3QgdmFsdWVzID0gdGhpcy5fdmFsdWVzO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0Y2FsbGJhY2suY2FsbChjb250ZXh0LCB2YWx1ZXNbaV0sIGtleXNbaV0sIHRoaXMpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGdldChrZXk6IEspOiBWIHwgdW5kZWZpbmVkIHtcblx0XHRcdGNvbnN0IGluZGV4ID0gdGhpcy5faW5kZXhPZktleSh0aGlzLl9rZXlzLCBrZXkpO1xuXHRcdFx0cmV0dXJuIGluZGV4IDwgMCA/IHVuZGVmaW5lZCA6IHRoaXMuX3ZhbHVlc1tpbmRleF07XG5cdFx0fVxuXG5cdFx0aGFzKGtleTogSyk6IGJvb2xlYW4ge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2luZGV4T2ZLZXkodGhpcy5fa2V5cywga2V5KSA+IC0xO1xuXHRcdH1cblxuXHRcdGtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxLPiB7XG5cdFx0XHRyZXR1cm4gbmV3IFNoaW1JdGVyYXRvcih0aGlzLl9rZXlzKTtcblx0XHR9XG5cblx0XHRzZXQoa2V5OiBLLCB2YWx1ZTogVik6IE1hcDxLLCBWPiB7XG5cdFx0XHRsZXQgaW5kZXggPSB0aGlzLl9pbmRleE9mS2V5KHRoaXMuX2tleXMsIGtleSk7XG5cdFx0XHRpbmRleCA9IGluZGV4IDwgMCA/IHRoaXMuX2tleXMubGVuZ3RoIDogaW5kZXg7XG5cdFx0XHR0aGlzLl9rZXlzW2luZGV4XSA9IGtleTtcblx0XHRcdHRoaXMuX3ZhbHVlc1tpbmRleF0gPSB2YWx1ZTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdHZhbHVlcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFY+IHtcblx0XHRcdHJldHVybiBuZXcgU2hpbUl0ZXJhdG9yKHRoaXMuX3ZhbHVlcyk7XG5cdFx0fVxuXG5cdFx0W1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmFibGVJdGVyYXRvcjxbSywgVl0+IHtcblx0XHRcdHJldHVybiB0aGlzLmVudHJpZXMoKTtcblx0XHR9XG5cblx0XHRbU3ltYm9sLnRvU3RyaW5nVGFnXTogJ01hcCcgPSAnTWFwJztcblx0fTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgTWFwO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIE1hcC50cyIsImltcG9ydCB7IFRoZW5hYmxlIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xuaW1wb3J0IHsgcXVldWVNaWNyb1Rhc2sgfSBmcm9tICcuL3N1cHBvcnQvcXVldWUnO1xuaW1wb3J0IHsgSXRlcmFibGUgfSBmcm9tICcuL2l0ZXJhdG9yJztcbmltcG9ydCAnLi9TeW1ib2wnO1xuaW1wb3J0IGhhcyBmcm9tICcuL3N1cHBvcnQvaGFzJztcblxuLyoqXG4gKiBFeGVjdXRvciBpcyB0aGUgaW50ZXJmYWNlIGZvciBmdW5jdGlvbnMgdXNlZCB0byBpbml0aWFsaXplIGEgUHJvbWlzZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRvcjxUPiB7XG5cdC8qKlxuXHQgKiBUaGUgZXhlY3V0b3IgZm9yIHRoZSBwcm9taXNlXG5cdCAqXG5cdCAqIEBwYXJhbSByZXNvbHZlIFRoZSByZXNvbHZlciBjYWxsYmFjayBvZiB0aGUgcHJvbWlzZVxuXHQgKiBAcGFyYW0gcmVqZWN0IFRoZSByZWplY3RvciBjYWxsYmFjayBvZiB0aGUgcHJvbWlzZVxuXHQgKi9cblx0KHJlc29sdmU6ICh2YWx1ZT86IFQgfCBQcm9taXNlTGlrZTxUPikgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkKTogdm9pZDtcbn1cblxuZXhwb3J0IGxldCBTaGltUHJvbWlzZTogdHlwZW9mIFByb21pc2UgPSBnbG9iYWwuUHJvbWlzZTtcblxuZXhwb3J0IGNvbnN0IGlzVGhlbmFibGUgPSBmdW5jdGlvbiBpc1RoZW5hYmxlPFQ+KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBQcm9taXNlTGlrZTxUPiB7XG5cdHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn07XG5cbmlmICghaGFzKCdlczYtcHJvbWlzZScpKSB7XG5cdGNvbnN0IGVudW0gU3RhdGUge1xuXHRcdEZ1bGZpbGxlZCxcblx0XHRQZW5kaW5nLFxuXHRcdFJlamVjdGVkXG5cdH1cblxuXHRnbG9iYWwuUHJvbWlzZSA9IFNoaW1Qcm9taXNlID0gY2xhc3MgUHJvbWlzZTxUPiBpbXBsZW1lbnRzIFRoZW5hYmxlPFQ+IHtcblx0XHRzdGF0aWMgYWxsKGl0ZXJhYmxlOiBJdGVyYWJsZTxhbnkgfCBQcm9taXNlTGlrZTxhbnk+PiB8IChhbnkgfCBQcm9taXNlTGlrZTxhbnk+KVtdKTogUHJvbWlzZTxhbnk+IHtcblx0XHRcdHJldHVybiBuZXcgdGhpcyhmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdFx0Y29uc3QgdmFsdWVzOiBhbnlbXSA9IFtdO1xuXHRcdFx0XHRsZXQgY29tcGxldGUgPSAwO1xuXHRcdFx0XHRsZXQgdG90YWwgPSAwO1xuXHRcdFx0XHRsZXQgcG9wdWxhdGluZyA9IHRydWU7XG5cblx0XHRcdFx0ZnVuY3Rpb24gZnVsZmlsbChpbmRleDogbnVtYmVyLCB2YWx1ZTogYW55KTogdm9pZCB7XG5cdFx0XHRcdFx0dmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuXHRcdFx0XHRcdCsrY29tcGxldGU7XG5cdFx0XHRcdFx0ZmluaXNoKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmdW5jdGlvbiBmaW5pc2goKTogdm9pZCB7XG5cdFx0XHRcdFx0aWYgKHBvcHVsYXRpbmcgfHwgY29tcGxldGUgPCB0b3RhbCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXNvbHZlKHZhbHVlcyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmdW5jdGlvbiBwcm9jZXNzSXRlbShpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpOiB2b2lkIHtcblx0XHRcdFx0XHQrK3RvdGFsO1xuXHRcdFx0XHRcdGlmIChpc1RoZW5hYmxlKGl0ZW0pKSB7XG5cdFx0XHRcdFx0XHQvLyBJZiBhbiBpdGVtIFByb21pc2UgcmVqZWN0cywgdGhpcyBQcm9taXNlIGlzIGltbWVkaWF0ZWx5IHJlamVjdGVkIHdpdGggdGhlIGl0ZW1cblx0XHRcdFx0XHRcdC8vIFByb21pc2UncyByZWplY3Rpb24gZXJyb3IuXG5cdFx0XHRcdFx0XHRpdGVtLnRoZW4oZnVsZmlsbC5iaW5kKG51bGwsIGluZGV4KSwgcmVqZWN0KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0UHJvbWlzZS5yZXNvbHZlKGl0ZW0pLnRoZW4oZnVsZmlsbC5iaW5kKG51bGwsIGluZGV4KSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IGkgPSAwO1xuXHRcdFx0XHRmb3IgKGNvbnN0IHZhbHVlIG9mIGl0ZXJhYmxlKSB7XG5cdFx0XHRcdFx0cHJvY2Vzc0l0ZW0oaSwgdmFsdWUpO1xuXHRcdFx0XHRcdGkrKztcblx0XHRcdFx0fVxuXHRcdFx0XHRwb3B1bGF0aW5nID0gZmFsc2U7XG5cblx0XHRcdFx0ZmluaXNoKCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRzdGF0aWMgcmFjZTxUPihpdGVyYWJsZTogSXRlcmFibGU8VCB8IFByb21pc2VMaWtlPFQ+PiB8IChUIHwgUHJvbWlzZUxpa2U8VD4pW10pOiBQcm9taXNlPFRbXT4ge1xuXHRcdFx0cmV0dXJuIG5ldyB0aGlzKGZ1bmN0aW9uKHJlc29sdmU6ICh2YWx1ZT86IGFueSkgPT4gdm9pZCwgcmVqZWN0KSB7XG5cdFx0XHRcdGZvciAoY29uc3QgaXRlbSBvZiBpdGVyYWJsZSkge1xuXHRcdFx0XHRcdGlmIChpdGVtIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgYSBQcm9taXNlIGl0ZW0gcmVqZWN0cywgdGhpcyBQcm9taXNlIGlzIGltbWVkaWF0ZWx5IHJlamVjdGVkIHdpdGggdGhlIGl0ZW1cblx0XHRcdFx0XHRcdC8vIFByb21pc2UncyByZWplY3Rpb24gZXJyb3IuXG5cdFx0XHRcdFx0XHRpdGVtLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0UHJvbWlzZS5yZXNvbHZlKGl0ZW0pLnRoZW4ocmVzb2x2ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRzdGF0aWMgcmVqZWN0KHJlYXNvbj86IGFueSk6IFByb21pc2U8bmV2ZXI+IHtcblx0XHRcdHJldHVybiBuZXcgdGhpcyhmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdFx0cmVqZWN0KHJlYXNvbik7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRzdGF0aWMgcmVzb2x2ZSgpOiBQcm9taXNlPHZvaWQ+O1xuXHRcdHN0YXRpYyByZXNvbHZlPFQ+KHZhbHVlOiBUIHwgUHJvbWlzZUxpa2U8VD4pOiBQcm9taXNlPFQ+O1xuXHRcdHN0YXRpYyByZXNvbHZlPFQ+KHZhbHVlPzogYW55KTogUHJvbWlzZTxUPiB7XG5cdFx0XHRyZXR1cm4gbmV3IHRoaXMoZnVuY3Rpb24ocmVzb2x2ZSkge1xuXHRcdFx0XHRyZXNvbHZlKDxUPnZhbHVlKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHN0YXRpYyBbU3ltYm9sLnNwZWNpZXNdOiBQcm9taXNlQ29uc3RydWN0b3IgPSBTaGltUHJvbWlzZSBhcyBQcm9taXNlQ29uc3RydWN0b3I7XG5cblx0XHQvKipcblx0XHQgKiBDcmVhdGVzIGEgbmV3IFByb21pc2UuXG5cdFx0ICpcblx0XHQgKiBAY29uc3RydWN0b3Jcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSBleGVjdXRvclxuXHRcdCAqIFRoZSBleGVjdXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgaW1tZWRpYXRlbHkgd2hlbiB0aGUgUHJvbWlzZSBpcyBpbnN0YW50aWF0ZWQuIEl0IGlzIHJlc3BvbnNpYmxlIGZvclxuXHRcdCAqIHN0YXJ0aW5nIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoZW4gaXQgaXMgaW52b2tlZC5cblx0XHQgKlxuXHRcdCAqIFRoZSBleGVjdXRvciBtdXN0IGNhbGwgZWl0aGVyIHRoZSBwYXNzZWQgYHJlc29sdmVgIGZ1bmN0aW9uIHdoZW4gdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZFxuXHRcdCAqIHN1Y2Nlc3NmdWxseSwgb3IgdGhlIGByZWplY3RgIGZ1bmN0aW9uIHdoZW4gdGhlIG9wZXJhdGlvbiBmYWlscy5cblx0XHQgKi9cblx0XHRjb25zdHJ1Y3RvcihleGVjdXRvcjogRXhlY3V0b3I8VD4pIHtcblx0XHRcdC8qKlxuXHRcdFx0ICogSWYgdHJ1ZSwgdGhlIHJlc29sdXRpb24gb2YgdGhpcyBwcm9taXNlIGlzIGNoYWluZWQgKFwibG9ja2VkIGluXCIpIHRvIGFub3RoZXIgcHJvbWlzZS5cblx0XHRcdCAqL1xuXHRcdFx0bGV0IGlzQ2hhaW5lZCA9IGZhbHNlO1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIFdoZXRoZXIgb3Igbm90IHRoaXMgcHJvbWlzZSBpcyBpbiBhIHJlc29sdmVkIHN0YXRlLlxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBpc1Jlc29sdmVkID0gKCk6IGJvb2xlYW4gPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5zdGF0ZSAhPT0gU3RhdGUuUGVuZGluZyB8fCBpc0NoYWluZWQ7XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIENhbGxiYWNrcyB0aGF0IHNob3VsZCBiZSBpbnZva2VkIG9uY2UgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC5cblx0XHRcdCAqL1xuXHRcdFx0bGV0IGNhbGxiYWNrczogbnVsbCB8IChBcnJheTwoKSA9PiB2b2lkPikgPSBbXTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBJbml0aWFsbHkgcHVzaGVzIGNhbGxiYWNrcyBvbnRvIGEgcXVldWUgZm9yIGV4ZWN1dGlvbiBvbmNlIHRoaXMgcHJvbWlzZSBzZXR0bGVzLiBBZnRlciB0aGUgcHJvbWlzZSBzZXR0bGVzLFxuXHRcdFx0ICogZW5xdWV1ZXMgY2FsbGJhY2tzIGZvciBleGVjdXRpb24gb24gdGhlIG5leHQgZXZlbnQgbG9vcCB0dXJuLlxuXHRcdFx0ICovXG5cdFx0XHRsZXQgd2hlbkZpbmlzaGVkID0gZnVuY3Rpb24oY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcblx0XHRcdFx0aWYgKGNhbGxiYWNrcykge1xuXHRcdFx0XHRcdGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBTZXR0bGVzIHRoaXMgcHJvbWlzZS5cblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0gbmV3U3RhdGUgVGhlIHJlc29sdmVkIHN0YXRlIGZvciB0aGlzIHByb21pc2UuXG5cdFx0XHQgKiBAcGFyYW0ge1R8YW55fSB2YWx1ZSBUaGUgcmVzb2x2ZWQgdmFsdWUgZm9yIHRoaXMgcHJvbWlzZS5cblx0XHRcdCAqL1xuXHRcdFx0Y29uc3Qgc2V0dGxlID0gKG5ld1N0YXRlOiBTdGF0ZSwgdmFsdWU6IGFueSk6IHZvaWQgPT4ge1xuXHRcdFx0XHQvLyBBIHByb21pc2UgY2FuIG9ubHkgYmUgc2V0dGxlZCBvbmNlLlxuXHRcdFx0XHRpZiAodGhpcy5zdGF0ZSAhPT0gU3RhdGUuUGVuZGluZykge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuc3RhdGUgPSBuZXdTdGF0ZTtcblx0XHRcdFx0dGhpcy5yZXNvbHZlZFZhbHVlID0gdmFsdWU7XG5cdFx0XHRcdHdoZW5GaW5pc2hlZCA9IHF1ZXVlTWljcm9UYXNrO1xuXG5cdFx0XHRcdC8vIE9ubHkgZW5xdWV1ZSBhIGNhbGxiYWNrIHJ1bm5lciBpZiB0aGVyZSBhcmUgY2FsbGJhY2tzIHNvIHRoYXQgaW5pdGlhbGx5IGZ1bGZpbGxlZCBQcm9taXNlcyBkb24ndCBoYXZlIHRvXG5cdFx0XHRcdC8vIHdhaXQgYW4gZXh0cmEgdHVybi5cblx0XHRcdFx0aWYgKGNhbGxiYWNrcyAmJiBjYWxsYmFja3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdHF1ZXVlTWljcm9UYXNrKGZ1bmN0aW9uKCk6IHZvaWQge1xuXHRcdFx0XHRcdFx0aWYgKGNhbGxiYWNrcykge1xuXHRcdFx0XHRcdFx0XHRsZXQgY291bnQgPSBjYWxsYmFja3MubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcblx0XHRcdFx0XHRcdFx0XHRjYWxsYmFja3NbaV0uY2FsbChudWxsKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRjYWxsYmFja3MgPSBudWxsO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIFJlc29sdmVzIHRoaXMgcHJvbWlzZS5cblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0gbmV3U3RhdGUgVGhlIHJlc29sdmVkIHN0YXRlIGZvciB0aGlzIHByb21pc2UuXG5cdFx0XHQgKiBAcGFyYW0ge1R8YW55fSB2YWx1ZSBUaGUgcmVzb2x2ZWQgdmFsdWUgZm9yIHRoaXMgcHJvbWlzZS5cblx0XHRcdCAqL1xuXHRcdFx0Y29uc3QgcmVzb2x2ZSA9IChuZXdTdGF0ZTogU3RhdGUsIHZhbHVlOiBhbnkpOiB2b2lkID0+IHtcblx0XHRcdFx0aWYgKGlzUmVzb2x2ZWQoKSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChpc1RoZW5hYmxlKHZhbHVlKSkge1xuXHRcdFx0XHRcdHZhbHVlLnRoZW4oc2V0dGxlLmJpbmQobnVsbCwgU3RhdGUuRnVsZmlsbGVkKSwgc2V0dGxlLmJpbmQobnVsbCwgU3RhdGUuUmVqZWN0ZWQpKTtcblx0XHRcdFx0XHRpc0NoYWluZWQgPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNldHRsZShuZXdTdGF0ZSwgdmFsdWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHR0aGlzLnRoZW4gPSA8VFJlc3VsdDEgPSBULCBUUmVzdWx0MiA9IG5ldmVyPihcblx0XHRcdFx0b25GdWxmaWxsZWQ/OiAoKHZhbHVlOiBUKSA9PiBUUmVzdWx0MSB8IFByb21pc2VMaWtlPFRSZXN1bHQxPikgfCB1bmRlZmluZWQgfCBudWxsLFxuXHRcdFx0XHRvblJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgdW5kZWZpbmVkIHwgbnVsbFxuXHRcdFx0KTogUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiA9PiB7XG5cdFx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdFx0Ly8gd2hlbkZpbmlzaGVkIGluaXRpYWxseSBxdWV1ZXMgdXAgY2FsbGJhY2tzIGZvciBleGVjdXRpb24gYWZ0ZXIgdGhlIHByb21pc2UgaGFzIHNldHRsZWQuIE9uY2UgdGhlXG5cdFx0XHRcdFx0Ly8gcHJvbWlzZSBoYXMgc2V0dGxlZCwgd2hlbkZpbmlzaGVkIHdpbGwgc2NoZWR1bGUgY2FsbGJhY2tzIGZvciBleGVjdXRpb24gb24gdGhlIG5leHQgdHVybiB0aHJvdWdoIHRoZVxuXHRcdFx0XHRcdC8vIGV2ZW50IGxvb3AuXG5cdFx0XHRcdFx0d2hlbkZpbmlzaGVkKCgpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGNhbGxiYWNrOiAoKHZhbHVlPzogYW55KSA9PiBhbnkpIHwgdW5kZWZpbmVkIHwgbnVsbCA9XG5cdFx0XHRcdFx0XHRcdHRoaXMuc3RhdGUgPT09IFN0YXRlLlJlamVjdGVkID8gb25SZWplY3RlZCA6IG9uRnVsZmlsbGVkO1xuXG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZShjYWxsYmFjayh0aGlzLnJlc29sdmVkVmFsdWUpKTtcblx0XHRcdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09IFN0YXRlLlJlamVjdGVkKSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdCh0aGlzLnJlc29sdmVkVmFsdWUpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZSh0aGlzLnJlc29sdmVkVmFsdWUpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH07XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGV4ZWN1dG9yKHJlc29sdmUuYmluZChudWxsLCBTdGF0ZS5GdWxmaWxsZWQpLCByZXNvbHZlLmJpbmQobnVsbCwgU3RhdGUuUmVqZWN0ZWQpKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdHNldHRsZShTdGF0ZS5SZWplY3RlZCwgZXJyb3IpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNhdGNoPFRSZXN1bHQgPSBuZXZlcj4oXG5cdFx0XHRvblJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdCB8IFByb21pc2VMaWtlPFRSZXN1bHQ+KSB8IHVuZGVmaW5lZCB8IG51bGxcblx0XHQpOiBQcm9taXNlPFQgfCBUUmVzdWx0PiB7XG5cdFx0XHRyZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhpcyBwcm9taXNlLlxuXHRcdCAqL1xuXHRcdHByaXZhdGUgc3RhdGUgPSBTdGF0ZS5QZW5kaW5nO1xuXG5cdFx0LyoqXG5cdFx0ICogVGhlIHJlc29sdmVkIHZhbHVlIGZvciB0aGlzIHByb21pc2UuXG5cdFx0ICpcblx0XHQgKiBAdHlwZSB7VHxhbnl9XG5cdFx0ICovXG5cdFx0cHJpdmF0ZSByZXNvbHZlZFZhbHVlOiBhbnk7XG5cblx0XHR0aGVuOiA8VFJlc3VsdDEgPSBULCBUUmVzdWx0MiA9IG5ldmVyPihcblx0XHRcdG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogVCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgdW5kZWZpbmVkIHwgbnVsbCxcblx0XHRcdG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCB1bmRlZmluZWQgfCBudWxsXG5cdFx0KSA9PiBQcm9taXNlPFRSZXN1bHQxIHwgVFJlc3VsdDI+O1xuXG5cdFx0W1N5bWJvbC50b1N0cmluZ1RhZ106ICdQcm9taXNlJyA9ICdQcm9taXNlJztcblx0fTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgU2hpbVByb21pc2U7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gUHJvbWlzZS50cyIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xuaW1wb3J0IHsgaXNBcnJheUxpa2UsIEl0ZXJhYmxlLCBJdGVyYWJsZUl0ZXJhdG9yLCBTaGltSXRlcmF0b3IgfSBmcm9tICcuL2l0ZXJhdG9yJztcbmltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XG5pbXBvcnQgJy4vU3ltYm9sJztcblxuZXhwb3J0IGludGVyZmFjZSBTZXQ8VD4ge1xuXHQvKipcblx0ICogQWRkcyBhIGB2YWx1ZWAgdG8gdGhlIGBTZXRgXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gYWRkIHRvIHRoZSBzZXRcblx0ICogQHJldHVybnMgVGhlIGluc3RhbmNlIG9mIHRoZSBgU2V0YFxuXHQgKi9cblx0YWRkKHZhbHVlOiBUKTogdGhpcztcblxuXHQvKipcblx0ICogUmVtb3ZlcyBhbGwgdGhlIHZhbHVlcyBmcm9tIHRoZSBgU2V0YC5cblx0ICovXG5cdGNsZWFyKCk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYSBgdmFsdWVgIGZyb20gdGhlIHNldFxuXHQgKlxuXHQgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHJlbW92ZWRcblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZSB3YXMgcmVtb3ZlZFxuXHQgKi9cblx0ZGVsZXRlKHZhbHVlOiBUKTogYm9vbGVhbjtcblxuXHQvKipcblx0ICogUmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IHlpZWxkcyBlYWNoIGVudHJ5LlxuXHQgKlxuXHQgKiBAcmV0dXJuIEFuIGl0ZXJhdG9yIGZvciBlYWNoIGtleS92YWx1ZSBwYWlyIGluIHRoZSBpbnN0YW5jZS5cblx0ICovXG5cdGVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbVCwgVF0+O1xuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBhIGdpdmVuIGZ1bmN0aW9uIGZvciBlYWNoIHNldCBlbnRyeS4gVGhlIGZ1bmN0aW9uXG5cdCAqIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6IHRoZSBlbGVtZW50IHZhbHVlLCB0aGVcblx0ICogZWxlbWVudCBrZXksIGFuZCB0aGUgYXNzb2NpYXRlZCBgU2V0YCBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIGNhbGxiYWNrZm4gVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgZm9yIGVhY2ggbWFwIGVudHJ5LFxuXHQgKiBAcGFyYW0gdGhpc0FyZyBUaGUgdmFsdWUgdG8gdXNlIGZvciBgdGhpc2AgZm9yIGVhY2ggZXhlY3V0aW9uIG9mIHRoZSBjYWxiYWNrXG5cdCAqL1xuXHRmb3JFYWNoKGNhbGxiYWNrZm46ICh2YWx1ZTogVCwgdmFsdWUyOiBULCBzZXQ6IFNldDxUPikgPT4gdm9pZCwgdGhpc0FyZz86IGFueSk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIElkZW50aWZpZXMgaWYgYSB2YWx1ZSBpcyBwYXJ0IG9mIHRoZSBzZXQuXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2tcblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZSBpcyBwYXJ0IG9mIHRoZSBzZXQgb3RoZXJ3aXNlIGBmYWxzZWBcblx0ICovXG5cdGhhcyh2YWx1ZTogVCk6IGJvb2xlYW47XG5cblx0LyoqXG5cdCAqIERlc3BpdGUgaXRzIG5hbWUsIHJldHVybnMgYW4gaXRlcmFibGUgb2YgdGhlIHZhbHVlcyBpbiB0aGUgc2V0LFxuXHQgKi9cblx0a2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+O1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdmFsdWVzIGluIHRoZSBgU2V0YC5cblx0ICovXG5cdHJlYWRvbmx5IHNpemU6IG51bWJlcjtcblxuXHQvKipcblx0ICogUmV0dXJucyBhbiBpdGVyYWJsZSBvZiB2YWx1ZXMgaW4gdGhlIHNldC5cblx0ICovXG5cdHZhbHVlcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+O1xuXG5cdC8qKiBJdGVyYXRlcyBvdmVyIHZhbHVlcyBpbiB0aGUgc2V0LiAqL1xuXHRbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+O1xuXG5cdHJlYWRvbmx5IFtTeW1ib2wudG9TdHJpbmdUYWddOiAnU2V0Jztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXRDb25zdHJ1Y3RvciB7XG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IFNldFxuXHQgKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdG5ldyAoKTogU2V0PGFueT47XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgU2V0XG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKlxuXHQgKiBAcGFyYW0gaXRlcmF0b3IgVGhlIGl0ZXJhYmxlIHN0cnVjdHVyZSB0byBpbml0aWFsaXplIHRoZSBzZXQgd2l0aFxuXHQgKi9cblx0bmV3IDxUPihpdGVyYXRvcj86IFRbXSk6IFNldDxUPjtcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBTZXRcblx0ICpcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqXG5cdCAqIEBwYXJhbSBpdGVyYXRvciBUaGUgaXRlcmFibGUgc3RydWN0dXJlIHRvIGluaXRpYWxpemUgdGhlIHNldCB3aXRoXG5cdCAqL1xuXHRuZXcgPFQ+KGl0ZXJhdG9yOiBJdGVyYWJsZTxUPik6IFNldDxUPjtcblxuXHRyZWFkb25seSBwcm90b3R5cGU6IFNldDxhbnk+O1xufVxuXG5leHBvcnQgbGV0IFNldDogU2V0Q29uc3RydWN0b3IgPSBnbG9iYWwuU2V0O1xuXG5pZiAoIWhhcygnZXM2LXNldCcpKSB7XG5cdFNldCA9IGNsYXNzIFNldDxUPiB7XG5cdFx0cHJpdmF0ZSByZWFkb25seSBfc2V0RGF0YTogVFtdID0gW107XG5cblx0XHRzdGF0aWMgW1N5bWJvbC5zcGVjaWVzXSA9IFNldDtcblxuXHRcdGNvbnN0cnVjdG9yKGl0ZXJhYmxlPzogQXJyYXlMaWtlPFQ+IHwgSXRlcmFibGU8VD4pIHtcblx0XHRcdGlmIChpdGVyYWJsZSkge1xuXHRcdFx0XHRpZiAoaXNBcnJheUxpa2UoaXRlcmFibGUpKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBpdGVyYWJsZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0dGhpcy5hZGQoaXRlcmFibGVbaV0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHZhbHVlIG9mIGl0ZXJhYmxlKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmFkZCh2YWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0YWRkKHZhbHVlOiBUKTogdGhpcyB7XG5cdFx0XHRpZiAodGhpcy5oYXModmFsdWUpKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fc2V0RGF0YS5wdXNoKHZhbHVlKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGNsZWFyKCk6IHZvaWQge1xuXHRcdFx0dGhpcy5fc2V0RGF0YS5sZW5ndGggPSAwO1xuXHRcdH1cblxuXHRcdGRlbGV0ZSh2YWx1ZTogVCk6IGJvb2xlYW4ge1xuXHRcdFx0Y29uc3QgaWR4ID0gdGhpcy5fc2V0RGF0YS5pbmRleE9mKHZhbHVlKTtcblx0XHRcdGlmIChpZHggPT09IC0xKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX3NldERhdGEuc3BsaWNlKGlkeCwgMSk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRlbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W1QsIFRdPiB7XG5cdFx0XHRyZXR1cm4gbmV3IFNoaW1JdGVyYXRvcjxbYW55LCBhbnldPih0aGlzLl9zZXREYXRhLm1hcDxbYW55LCBhbnldPigodmFsdWUpID0+IFt2YWx1ZSwgdmFsdWVdKSk7XG5cdFx0fVxuXG5cdFx0Zm9yRWFjaChjYWxsYmFja2ZuOiAodmFsdWU6IFQsIGluZGV4OiBULCBzZXQ6IFNldDxUPikgPT4gdm9pZCwgdGhpc0FyZz86IGFueSk6IHZvaWQge1xuXHRcdFx0Y29uc3QgaXRlcmF0b3IgPSB0aGlzLnZhbHVlcygpO1xuXHRcdFx0bGV0IHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcblx0XHRcdHdoaWxlICghcmVzdWx0LmRvbmUpIHtcblx0XHRcdFx0Y2FsbGJhY2tmbi5jYWxsKHRoaXNBcmcsIHJlc3VsdC52YWx1ZSwgcmVzdWx0LnZhbHVlLCB0aGlzKTtcblx0XHRcdFx0cmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGhhcyh2YWx1ZTogVCk6IGJvb2xlYW4ge1xuXHRcdFx0cmV0dXJuIHRoaXMuX3NldERhdGEuaW5kZXhPZih2YWx1ZSkgPiAtMTtcblx0XHR9XG5cblx0XHRrZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8VD4ge1xuXHRcdFx0cmV0dXJuIG5ldyBTaGltSXRlcmF0b3IodGhpcy5fc2V0RGF0YSk7XG5cdFx0fVxuXG5cdFx0Z2V0IHNpemUoKTogbnVtYmVyIHtcblx0XHRcdHJldHVybiB0aGlzLl9zZXREYXRhLmxlbmd0aDtcblx0XHR9XG5cblx0XHR2YWx1ZXMoKTogSXRlcmFibGVJdGVyYXRvcjxUPiB7XG5cdFx0XHRyZXR1cm4gbmV3IFNoaW1JdGVyYXRvcih0aGlzLl9zZXREYXRhKTtcblx0XHR9XG5cblx0XHRbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcblx0XHRcdHJldHVybiBuZXcgU2hpbUl0ZXJhdG9yKHRoaXMuX3NldERhdGEpO1xuXHRcdH1cblxuXHRcdFtTeW1ib2wudG9TdHJpbmdUYWddOiAnU2V0JyA9ICdTZXQnO1xuXHR9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBTZXQ7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gU2V0LnRzIiwiaW1wb3J0IGhhcyBmcm9tICcuL3N1cHBvcnQvaGFzJztcbmltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xuaW1wb3J0IHsgZ2V0VmFsdWVEZXNjcmlwdG9yIH0gZnJvbSAnLi9zdXBwb3J0L3V0aWwnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG5cdGludGVyZmFjZSBTeW1ib2xDb25zdHJ1Y3RvciB7XG5cdFx0b2JzZXJ2YWJsZTogc3ltYm9sO1xuXHR9XG59XG5cbmV4cG9ydCBsZXQgU3ltYm9sOiBTeW1ib2xDb25zdHJ1Y3RvciA9IGdsb2JhbC5TeW1ib2w7XG5cbmlmICghaGFzKCdlczYtc3ltYm9sJykpIHtcblx0LyoqXG5cdCAqIFRocm93cyBpZiB0aGUgdmFsdWUgaXMgbm90IGEgc3ltYm9sLCB1c2VkIGludGVybmFsbHkgd2l0aGluIHRoZSBTaGltXG5cdCAqIEBwYXJhbSAge2FueX0gICAgdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrXG5cdCAqIEByZXR1cm4ge3N5bWJvbH0gICAgICAgUmV0dXJucyB0aGUgc3ltYm9sIG9yIHRocm93c1xuXHQgKi9cblx0Y29uc3QgdmFsaWRhdGVTeW1ib2wgPSBmdW5jdGlvbiB2YWxpZGF0ZVN5bWJvbCh2YWx1ZTogYW55KTogc3ltYm9sIHtcblx0XHRpZiAoIWlzU3ltYm9sKHZhbHVlKSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcih2YWx1ZSArICcgaXMgbm90IGEgc3ltYm9sJyk7XG5cdFx0fVxuXHRcdHJldHVybiB2YWx1ZTtcblx0fTtcblxuXHRjb25zdCBkZWZpbmVQcm9wZXJ0aWVzID0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXM7XG5cdGNvbnN0IGRlZmluZVByb3BlcnR5OiAoXG5cdFx0bzogYW55LFxuXHRcdHA6IHN0cmluZyB8IHN5bWJvbCxcblx0XHRhdHRyaWJ1dGVzOiBQcm9wZXJ0eURlc2NyaXB0b3IgJiBUaGlzVHlwZTxhbnk+XG5cdCkgPT4gYW55ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5IGFzIGFueTtcblx0Y29uc3QgY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcblxuXHRjb25zdCBvYmpQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuXG5cdGNvbnN0IGdsb2JhbFN5bWJvbHM6IHsgW2tleTogc3RyaW5nXTogc3ltYm9sIH0gPSB7fTtcblxuXHRjb25zdCBnZXRTeW1ib2xOYW1lID0gKGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGNyZWF0ZWQgPSBjcmVhdGUobnVsbCk7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uKGRlc2M6IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB7XG5cdFx0XHRsZXQgcG9zdGZpeCA9IDA7XG5cdFx0XHRsZXQgbmFtZTogc3RyaW5nO1xuXHRcdFx0d2hpbGUgKGNyZWF0ZWRbU3RyaW5nKGRlc2MpICsgKHBvc3RmaXggfHwgJycpXSkge1xuXHRcdFx0XHQrK3Bvc3RmaXg7XG5cdFx0XHR9XG5cdFx0XHRkZXNjICs9IFN0cmluZyhwb3N0Zml4IHx8ICcnKTtcblx0XHRcdGNyZWF0ZWRbZGVzY10gPSB0cnVlO1xuXHRcdFx0bmFtZSA9ICdAQCcgKyBkZXNjO1xuXG5cdFx0XHQvLyBGSVhNRTogVGVtcG9yYXJ5IGd1YXJkIHVudGlsIHRoZSBkdXBsaWNhdGUgZXhlY3V0aW9uIHdoZW4gdGVzdGluZyBjYW4gYmVcblx0XHRcdC8vIHBpbm5lZCBkb3duLlxuXHRcdFx0aWYgKCFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9ialByb3RvdHlwZSwgbmFtZSkpIHtcblx0XHRcdFx0ZGVmaW5lUHJvcGVydHkob2JqUHJvdG90eXBlLCBuYW1lLCB7XG5cdFx0XHRcdFx0c2V0OiBmdW5jdGlvbih0aGlzOiBTeW1ib2wsIHZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRcdGRlZmluZVByb3BlcnR5KHRoaXMsIG5hbWUsIGdldFZhbHVlRGVzY3JpcHRvcih2YWx1ZSkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBuYW1lO1xuXHRcdH07XG5cdH0pKCk7XG5cblx0Y29uc3QgSW50ZXJuYWxTeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2wodGhpczogYW55LCBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bWJlcik6IHN5bWJvbCB7XG5cdFx0aWYgKHRoaXMgaW5zdGFuY2VvZiBJbnRlcm5hbFN5bWJvbCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignVHlwZUVycm9yOiBTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3InKTtcblx0XHR9XG5cdFx0cmV0dXJuIFN5bWJvbChkZXNjcmlwdGlvbik7XG5cdH07XG5cblx0U3ltYm9sID0gZ2xvYmFsLlN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbCh0aGlzOiBTeW1ib2wsIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVtYmVyKTogc3ltYm9sIHtcblx0XHRpZiAodGhpcyBpbnN0YW5jZW9mIFN5bWJvbCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignVHlwZUVycm9yOiBTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3InKTtcblx0XHR9XG5cdFx0Y29uc3Qgc3ltID0gT2JqZWN0LmNyZWF0ZShJbnRlcm5hbFN5bWJvbC5wcm90b3R5cGUpO1xuXHRcdGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCA/ICcnIDogU3RyaW5nKGRlc2NyaXB0aW9uKTtcblx0XHRyZXR1cm4gZGVmaW5lUHJvcGVydGllcyhzeW0sIHtcblx0XHRcdF9fZGVzY3JpcHRpb25fXzogZ2V0VmFsdWVEZXNjcmlwdG9yKGRlc2NyaXB0aW9uKSxcblx0XHRcdF9fbmFtZV9fOiBnZXRWYWx1ZURlc2NyaXB0b3IoZ2V0U3ltYm9sTmFtZShkZXNjcmlwdGlvbikpXG5cdFx0fSk7XG5cdH0gYXMgU3ltYm9sQ29uc3RydWN0b3I7XG5cblx0LyogRGVjb3JhdGUgdGhlIFN5bWJvbCBmdW5jdGlvbiB3aXRoIHRoZSBhcHByb3ByaWF0ZSBwcm9wZXJ0aWVzICovXG5cdGRlZmluZVByb3BlcnR5KFxuXHRcdFN5bWJvbCxcblx0XHQnZm9yJyxcblx0XHRnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24oa2V5OiBzdHJpbmcpOiBzeW1ib2wge1xuXHRcdFx0aWYgKGdsb2JhbFN5bWJvbHNba2V5XSkge1xuXHRcdFx0XHRyZXR1cm4gZ2xvYmFsU3ltYm9sc1trZXldO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIChnbG9iYWxTeW1ib2xzW2tleV0gPSBTeW1ib2woU3RyaW5nKGtleSkpKTtcblx0XHR9KVxuXHQpO1xuXHRkZWZpbmVQcm9wZXJ0aWVzKFN5bWJvbCwge1xuXHRcdGtleUZvcjogZ2V0VmFsdWVEZXNjcmlwdG9yKGZ1bmN0aW9uKHN5bTogc3ltYm9sKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRcdGxldCBrZXk6IHN0cmluZztcblx0XHRcdHZhbGlkYXRlU3ltYm9sKHN5bSk7XG5cdFx0XHRmb3IgKGtleSBpbiBnbG9iYWxTeW1ib2xzKSB7XG5cdFx0XHRcdGlmIChnbG9iYWxTeW1ib2xzW2tleV0gPT09IHN5bSkge1xuXHRcdFx0XHRcdHJldHVybiBrZXk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KSxcblx0XHRoYXNJbnN0YW5jZTogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ2hhc0luc3RhbmNlJyksIGZhbHNlLCBmYWxzZSksXG5cdFx0aXNDb25jYXRTcHJlYWRhYmxlOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignaXNDb25jYXRTcHJlYWRhYmxlJyksIGZhbHNlLCBmYWxzZSksXG5cdFx0aXRlcmF0b3I6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdpdGVyYXRvcicpLCBmYWxzZSwgZmFsc2UpLFxuXHRcdG1hdGNoOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignbWF0Y2gnKSwgZmFsc2UsIGZhbHNlKSxcblx0XHRvYnNlcnZhYmxlOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignb2JzZXJ2YWJsZScpLCBmYWxzZSwgZmFsc2UpLFxuXHRcdHJlcGxhY2U6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdyZXBsYWNlJyksIGZhbHNlLCBmYWxzZSksXG5cdFx0c2VhcmNoOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignc2VhcmNoJyksIGZhbHNlLCBmYWxzZSksXG5cdFx0c3BlY2llczogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3NwZWNpZXMnKSwgZmFsc2UsIGZhbHNlKSxcblx0XHRzcGxpdDogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3NwbGl0JyksIGZhbHNlLCBmYWxzZSksXG5cdFx0dG9QcmltaXRpdmU6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCd0b1ByaW1pdGl2ZScpLCBmYWxzZSwgZmFsc2UpLFxuXHRcdHRvU3RyaW5nVGFnOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcigndG9TdHJpbmdUYWcnKSwgZmFsc2UsIGZhbHNlKSxcblx0XHR1bnNjb3BhYmxlczogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3Vuc2NvcGFibGVzJyksIGZhbHNlLCBmYWxzZSlcblx0fSk7XG5cblx0LyogRGVjb3JhdGUgdGhlIEludGVybmFsU3ltYm9sIG9iamVjdCAqL1xuXHRkZWZpbmVQcm9wZXJ0aWVzKEludGVybmFsU3ltYm9sLnByb3RvdHlwZSwge1xuXHRcdGNvbnN0cnVjdG9yOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sKSxcblx0XHR0b1N0cmluZzogZ2V0VmFsdWVEZXNjcmlwdG9yKFxuXHRcdFx0ZnVuY3Rpb24odGhpczogeyBfX25hbWVfXzogc3RyaW5nIH0pIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX19uYW1lX187XG5cdFx0XHR9LFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHRmYWxzZVxuXHRcdClcblx0fSk7XG5cblx0LyogRGVjb3JhdGUgdGhlIFN5bWJvbC5wcm90b3R5cGUgKi9cblx0ZGVmaW5lUHJvcGVydGllcyhTeW1ib2wucHJvdG90eXBlLCB7XG5cdFx0dG9TdHJpbmc6IGdldFZhbHVlRGVzY3JpcHRvcihmdW5jdGlvbih0aGlzOiBTeW1ib2wpIHtcblx0XHRcdHJldHVybiAnU3ltYm9sICgnICsgKDxhbnk+dmFsaWRhdGVTeW1ib2wodGhpcykpLl9fZGVzY3JpcHRpb25fXyArICcpJztcblx0XHR9KSxcblx0XHR2YWx1ZU9mOiBnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24odGhpczogU3ltYm9sKSB7XG5cdFx0XHRyZXR1cm4gdmFsaWRhdGVTeW1ib2wodGhpcyk7XG5cdFx0fSlcblx0fSk7XG5cblx0ZGVmaW5lUHJvcGVydHkoXG5cdFx0U3ltYm9sLnByb3RvdHlwZSxcblx0XHRTeW1ib2wudG9QcmltaXRpdmUsXG5cdFx0Z2V0VmFsdWVEZXNjcmlwdG9yKGZ1bmN0aW9uKHRoaXM6IFN5bWJvbCkge1xuXHRcdFx0cmV0dXJuIHZhbGlkYXRlU3ltYm9sKHRoaXMpO1xuXHRcdH0pXG5cdCk7XG5cdGRlZmluZVByb3BlcnR5KFN5bWJvbC5wcm90b3R5cGUsIFN5bWJvbC50b1N0cmluZ1RhZywgZ2V0VmFsdWVEZXNjcmlwdG9yKCdTeW1ib2wnLCBmYWxzZSwgZmFsc2UsIHRydWUpKTtcblxuXHRkZWZpbmVQcm9wZXJ0eShcblx0XHRJbnRlcm5hbFN5bWJvbC5wcm90b3R5cGUsXG5cdFx0U3ltYm9sLnRvUHJpbWl0aXZlLFxuXHRcdGdldFZhbHVlRGVzY3JpcHRvcigoPGFueT5TeW1ib2wpLnByb3RvdHlwZVtTeW1ib2wudG9QcmltaXRpdmVdLCBmYWxzZSwgZmFsc2UsIHRydWUpXG5cdCk7XG5cdGRlZmluZVByb3BlcnR5KFxuXHRcdEludGVybmFsU3ltYm9sLnByb3RvdHlwZSxcblx0XHRTeW1ib2wudG9TdHJpbmdUYWcsXG5cdFx0Z2V0VmFsdWVEZXNjcmlwdG9yKCg8YW55PlN5bWJvbCkucHJvdG90eXBlW1N5bWJvbC50b1N0cmluZ1RhZ10sIGZhbHNlLCBmYWxzZSwgdHJ1ZSlcblx0KTtcbn1cblxuLyoqXG4gKiBBIGN1c3RvbSBndWFyZCBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgaWYgYW4gb2JqZWN0IGlzIGEgc3ltYm9sIG9yIG5vdFxuICogQHBhcmFtICB7YW55fSAgICAgICB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2sgdG8gc2VlIGlmIGl0IGlzIGEgc3ltYm9sIG9yIG5vdFxuICogQHJldHVybiB7aXMgc3ltYm9sfSAgICAgICBSZXR1cm5zIHRydWUgaWYgYSBzeW1ib2wgb3Igbm90IChhbmQgbmFycm93cyB0aGUgdHlwZSBndWFyZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBzeW1ib2wge1xuXHRyZXR1cm4gKHZhbHVlICYmICh0eXBlb2YgdmFsdWUgPT09ICdzeW1ib2wnIHx8IHZhbHVlWydAQHRvU3RyaW5nVGFnJ10gPT09ICdTeW1ib2wnKSkgfHwgZmFsc2U7XG59XG5cbi8qKlxuICogRmlsbCBhbnkgbWlzc2luZyB3ZWxsIGtub3duIHN5bWJvbHMgaWYgdGhlIG5hdGl2ZSBTeW1ib2wgaXMgbWlzc2luZyB0aGVtXG4gKi9cbltcblx0J2hhc0luc3RhbmNlJyxcblx0J2lzQ29uY2F0U3ByZWFkYWJsZScsXG5cdCdpdGVyYXRvcicsXG5cdCdzcGVjaWVzJyxcblx0J3JlcGxhY2UnLFxuXHQnc2VhcmNoJyxcblx0J3NwbGl0Jyxcblx0J21hdGNoJyxcblx0J3RvUHJpbWl0aXZlJyxcblx0J3RvU3RyaW5nVGFnJyxcblx0J3Vuc2NvcGFibGVzJyxcblx0J29ic2VydmFibGUnXG5dLmZvckVhY2goKHdlbGxLbm93bikgPT4ge1xuXHRpZiAoIShTeW1ib2wgYXMgYW55KVt3ZWxsS25vd25dKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KFN5bWJvbCwgd2VsbEtub3duLCBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcih3ZWxsS25vd24pLCBmYWxzZSwgZmFsc2UpKTtcblx0fVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IFN5bWJvbDtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBTeW1ib2wudHMiLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4vZ2xvYmFsJztcbmltcG9ydCB7IGlzQXJyYXlMaWtlLCBJdGVyYWJsZSB9IGZyb20gJy4vaXRlcmF0b3InO1xuaW1wb3J0IGhhcyBmcm9tICcuL3N1cHBvcnQvaGFzJztcbmltcG9ydCAnLi9TeW1ib2wnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdlYWtNYXA8SyBleHRlbmRzIG9iamVjdCwgVj4ge1xuXHQvKipcblx0ICogUmVtb3ZlIGEgYGtleWAgZnJvbSB0aGUgbWFwXG5cdCAqXG5cdCAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byByZW1vdmVcblx0ICogQHJldHVybiBgdHJ1ZWAgaWYgdGhlIHZhbHVlIHdhcyByZW1vdmVkLCBvdGhlcndpc2UgYGZhbHNlYFxuXHQgKi9cblx0ZGVsZXRlKGtleTogSyk6IGJvb2xlYW47XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIHRoZSB2YWx1ZSwgYmFzZWQgb24gdGhlIHN1cHBsaWVkIGBrZXlgXG5cdCAqXG5cdCAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byByZXRyaWV2ZSB0aGUgYHZhbHVlYCBmb3Jcblx0ICogQHJldHVybiB0aGUgYHZhbHVlYCBiYXNlZCBvbiB0aGUgYGtleWAgaWYgZm91bmQsIG90aGVyd2lzZSBgZmFsc2VgXG5cdCAqL1xuXHRnZXQoa2V5OiBLKTogViB8IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogRGV0ZXJtaW5lcyBpZiBhIGBrZXlgIGlzIHByZXNlbnQgaW4gdGhlIG1hcFxuXHQgKlxuXHQgKiBAcGFyYW0ga2V5IFRoZSBga2V5YCB0byBjaGVja1xuXHQgKiBAcmV0dXJuIGB0cnVlYCBpZiB0aGUga2V5IGlzIHBhcnQgb2YgdGhlIG1hcCwgb3RoZXJ3aXNlIGBmYWxzZWAuXG5cdCAqL1xuXHRoYXMoa2V5OiBLKTogYm9vbGVhbjtcblxuXHQvKipcblx0ICogU2V0IGEgYHZhbHVlYCBmb3IgYSBwYXJ0aWN1bGFyIGBrZXlgLlxuXHQgKlxuXHQgKiBAcGFyYW0ga2V5IFRoZSBga2V5YCB0byBzZXQgdGhlIGB2YWx1ZWAgZm9yXG5cdCAqIEBwYXJhbSB2YWx1ZSBUaGUgYHZhbHVlYCB0byBzZXRcblx0ICogQHJldHVybiB0aGUgaW5zdGFuY2VzXG5cdCAqL1xuXHRzZXQoa2V5OiBLLCB2YWx1ZTogVik6IHRoaXM7XG5cblx0cmVhZG9ubHkgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdXZWFrTWFwJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWFrTWFwQ29uc3RydWN0b3Ige1xuXHQvKipcblx0ICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgYFdlYWtNYXBgXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0bmV3ICgpOiBXZWFrTWFwPG9iamVjdCwgYW55PjtcblxuXHQvKipcblx0ICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgYFdlYWtNYXBgXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKlxuXHQgKiBAcGFyYW0gaXRlcmFibGUgQW4gaXRlcmFibGUgdGhhdCBjb250YWlucyB5aWVsZHMgdXAga2V5L3ZhbHVlIHBhaXIgZW50cmllc1xuXHQgKi9cblx0bmV3IDxLIGV4dGVuZHMgb2JqZWN0LCBWPihpdGVyYWJsZT86IFtLLCBWXVtdKTogV2Vha01hcDxLLCBWPjtcblxuXHQvKipcblx0ICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgYFdlYWtNYXBgXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKlxuXHQgKiBAcGFyYW0gaXRlcmFibGUgQW4gaXRlcmFibGUgdGhhdCBjb250YWlucyB5aWVsZHMgdXAga2V5L3ZhbHVlIHBhaXIgZW50cmllc1xuXHQgKi9cblx0bmV3IDxLIGV4dGVuZHMgb2JqZWN0LCBWPihpdGVyYWJsZTogSXRlcmFibGU8W0ssIFZdPik6IFdlYWtNYXA8SywgVj47XG5cblx0cmVhZG9ubHkgcHJvdG90eXBlOiBXZWFrTWFwPG9iamVjdCwgYW55Pjtcbn1cblxuZXhwb3J0IGxldCBXZWFrTWFwOiBXZWFrTWFwQ29uc3RydWN0b3IgPSBnbG9iYWwuV2Vha01hcDtcblxuaW50ZXJmYWNlIEVudHJ5PEssIFY+IHtcblx0a2V5OiBLO1xuXHR2YWx1ZTogVjtcbn1cblxuaWYgKCFoYXMoJ2VzNi13ZWFrbWFwJykpIHtcblx0Y29uc3QgREVMRVRFRDogYW55ID0ge307XG5cblx0Y29uc3QgZ2V0VUlEID0gZnVuY3Rpb24gZ2V0VUlEKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDAwMCk7XG5cdH07XG5cblx0Y29uc3QgZ2VuZXJhdGVOYW1lID0gKGZ1bmN0aW9uKCkge1xuXHRcdGxldCBzdGFydElkID0gTWF0aC5mbG9vcihEYXRlLm5vdygpICUgMTAwMDAwMDAwKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZW5lcmF0ZU5hbWUoKTogc3RyaW5nIHtcblx0XHRcdHJldHVybiAnX193bScgKyBnZXRVSUQoKSArIChzdGFydElkKysgKyAnX18nKTtcblx0XHR9O1xuXHR9KSgpO1xuXG5cdFdlYWtNYXAgPSBjbGFzcyBXZWFrTWFwPEssIFY+IHtcblx0XHRwcml2YXRlIHJlYWRvbmx5IF9uYW1lOiBzdHJpbmc7XG5cdFx0cHJpdmF0ZSByZWFkb25seSBfZnJvemVuRW50cmllczogRW50cnk8SywgVj5bXTtcblxuXHRcdGNvbnN0cnVjdG9yKGl0ZXJhYmxlPzogQXJyYXlMaWtlPFtLLCBWXT4gfCBJdGVyYWJsZTxbSywgVl0+KSB7XG5cdFx0XHR0aGlzLl9uYW1lID0gZ2VuZXJhdGVOYW1lKCk7XG5cblx0XHRcdHRoaXMuX2Zyb3plbkVudHJpZXMgPSBbXTtcblxuXHRcdFx0aWYgKGl0ZXJhYmxlKSB7XG5cdFx0XHRcdGlmIChpc0FycmF5TGlrZShpdGVyYWJsZSkpIHtcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGl0ZXJhYmxlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBpdGVtID0gaXRlcmFibGVbaV07XG5cdFx0XHRcdFx0XHR0aGlzLnNldChpdGVtWzBdLCBpdGVtWzFdKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaXRlcmFibGUpIHtcblx0XHRcdFx0XHRcdHRoaXMuc2V0KGtleSwgdmFsdWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHByaXZhdGUgX2dldEZyb3plbkVudHJ5SW5kZXgoa2V5OiBhbnkpOiBudW1iZXIge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9mcm96ZW5FbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmICh0aGlzLl9mcm96ZW5FbnRyaWVzW2ldLmtleSA9PT0ga2V5KSB7XG5cdFx0XHRcdFx0cmV0dXJuIGk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIC0xO1xuXHRcdH1cblxuXHRcdGRlbGV0ZShrZXk6IGFueSk6IGJvb2xlYW4ge1xuXHRcdFx0aWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGVudHJ5OiBFbnRyeTxLLCBWPiA9IGtleVt0aGlzLl9uYW1lXTtcblx0XHRcdGlmIChlbnRyeSAmJiBlbnRyeS5rZXkgPT09IGtleSAmJiBlbnRyeS52YWx1ZSAhPT0gREVMRVRFRCkge1xuXHRcdFx0XHRlbnRyeS52YWx1ZSA9IERFTEVURUQ7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBmcm96ZW5JbmRleCA9IHRoaXMuX2dldEZyb3plbkVudHJ5SW5kZXgoa2V5KTtcblx0XHRcdGlmIChmcm96ZW5JbmRleCA+PSAwKSB7XG5cdFx0XHRcdHRoaXMuX2Zyb3plbkVudHJpZXMuc3BsaWNlKGZyb3plbkluZGV4LCAxKTtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRnZXQoa2V5OiBhbnkpOiBWIHwgdW5kZWZpbmVkIHtcblx0XHRcdGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09IG51bGwpIHtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZW50cnk6IEVudHJ5PEssIFY+ID0ga2V5W3RoaXMuX25hbWVdO1xuXHRcdFx0aWYgKGVudHJ5ICYmIGVudHJ5LmtleSA9PT0ga2V5ICYmIGVudHJ5LnZhbHVlICE9PSBERUxFVEVEKSB7XG5cdFx0XHRcdHJldHVybiBlbnRyeS52YWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZnJvemVuSW5kZXggPSB0aGlzLl9nZXRGcm96ZW5FbnRyeUluZGV4KGtleSk7XG5cdFx0XHRpZiAoZnJvemVuSW5kZXggPj0gMCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fZnJvemVuRW50cmllc1tmcm96ZW5JbmRleF0udmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aGFzKGtleTogYW55KTogYm9vbGVhbiB7XG5cdFx0XHRpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwga2V5ID09PSBudWxsKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZW50cnk6IEVudHJ5PEssIFY+ID0ga2V5W3RoaXMuX25hbWVdO1xuXHRcdFx0aWYgKEJvb2xlYW4oZW50cnkgJiYgZW50cnkua2V5ID09PSBrZXkgJiYgZW50cnkudmFsdWUgIT09IERFTEVURUQpKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBmcm96ZW5JbmRleCA9IHRoaXMuX2dldEZyb3plbkVudHJ5SW5kZXgoa2V5KTtcblx0XHRcdGlmIChmcm96ZW5JbmRleCA+PSAwKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0c2V0KGtleTogYW55LCB2YWx1ZT86IGFueSk6IHRoaXMge1xuXHRcdFx0aWYgKCFrZXkgfHwgKHR5cGVvZiBrZXkgIT09ICdvYmplY3QnICYmIHR5cGVvZiBrZXkgIT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgdmFsdWUgdXNlZCBhcyB3ZWFrIG1hcCBrZXknKTtcblx0XHRcdH1cblx0XHRcdGxldCBlbnRyeTogRW50cnk8SywgVj4gPSBrZXlbdGhpcy5fbmFtZV07XG5cdFx0XHRpZiAoIWVudHJ5IHx8IGVudHJ5LmtleSAhPT0ga2V5KSB7XG5cdFx0XHRcdGVudHJ5ID0gT2JqZWN0LmNyZWF0ZShudWxsLCB7XG5cdFx0XHRcdFx0a2V5OiB7IHZhbHVlOiBrZXkgfVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZiAoT2JqZWN0LmlzRnJvemVuKGtleSkpIHtcblx0XHRcdFx0XHR0aGlzLl9mcm96ZW5FbnRyaWVzLnB1c2goZW50cnkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShrZXksIHRoaXMuX25hbWUsIHtcblx0XHRcdFx0XHRcdHZhbHVlOiBlbnRyeVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRlbnRyeS52YWx1ZSA9IHZhbHVlO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0W1N5bWJvbC50b1N0cmluZ1RhZ106ICdXZWFrTWFwJyA9ICdXZWFrTWFwJztcblx0fTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgV2Vha01hcDtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBXZWFrTWFwLnRzIiwiaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XG5pbXBvcnQgeyBpc0FycmF5TGlrZSwgaXNJdGVyYWJsZSwgSXRlcmFibGUgfSBmcm9tICcuL2l0ZXJhdG9yJztcbmltcG9ydCB7IE1BWF9TQUZFX0lOVEVHRVIgfSBmcm9tICcuL251bWJlcic7XG5pbXBvcnQgaGFzIGZyb20gJy4vc3VwcG9ydC9oYXMnO1xuaW1wb3J0IHsgd3JhcE5hdGl2ZSB9IGZyb20gJy4vc3VwcG9ydC91dGlsJztcblxuZXhwb3J0IGludGVyZmFjZSBNYXBDYWxsYmFjazxULCBVPiB7XG5cdC8qKlxuXHQgKiBBIGNhbGxiYWNrIGZ1bmN0aW9uIHdoZW4gbWFwcGluZ1xuXHQgKlxuXHQgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyBtYXBwZWRcblx0ICogQHBhcmFtIGluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBlbGVtZW50XG5cdCAqL1xuXHQoZWxlbWVudDogVCwgaW5kZXg6IG51bWJlcik6IFU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmluZENhbGxiYWNrPFQ+IHtcblx0LyoqXG5cdCAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gd2hlbiB1c2luZyBmaW5kXG5cdCAqXG5cdCAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRoYXQgaXMgY3VycmVudHkgYmVpbmcgYW5hbHlzZWRcblx0ICogQHBhcmFtIGluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBlbGVtZW50IHRoYXQgaXMgYmVpbmcgYW5hbHlzZWRcblx0ICogQHBhcmFtIGFycmF5IFRoZSBzb3VyY2UgYXJyYXlcblx0ICovXG5cdChlbGVtZW50OiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogQXJyYXlMaWtlPFQ+KTogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFdyaXRhYmxlQXJyYXlMaWtlPFQ+IHtcblx0cmVhZG9ubHkgbGVuZ3RoOiBudW1iZXI7XG5cdFtuOiBudW1iZXJdOiBUO1xufVxuXG4vKiBFUzYgQXJyYXkgc3RhdGljIG1ldGhvZHMgKi9cblxuZXhwb3J0IGludGVyZmFjZSBGcm9tIHtcblx0LyoqXG5cdCAqIFRoZSBBcnJheS5mcm9tKCkgbWV0aG9kIGNyZWF0ZXMgYSBuZXcgQXJyYXkgaW5zdGFuY2UgZnJvbSBhbiBhcnJheS1saWtlIG9yIGl0ZXJhYmxlIG9iamVjdC5cblx0ICpcblx0ICogQHBhcmFtIHNvdXJjZSBBbiBhcnJheS1saWtlIG9yIGl0ZXJhYmxlIG9iamVjdCB0byBjb252ZXJ0IHRvIGFuIGFycmF5XG5cdCAqIEBwYXJhbSBtYXBGdW5jdGlvbiBBIG1hcCBmdW5jdGlvbiB0byBjYWxsIG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXlcblx0ICogQHBhcmFtIHRoaXNBcmcgVGhlIGV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgbWFwIGZ1bmN0aW9uXG5cdCAqIEByZXR1cm4gVGhlIG5ldyBBcnJheVxuXHQgKi9cblx0PFQsIFU+KHNvdXJjZTogQXJyYXlMaWtlPFQ+IHwgSXRlcmFibGU8VD4sIG1hcEZ1bmN0aW9uOiBNYXBDYWxsYmFjazxULCBVPiwgdGhpc0FyZz86IGFueSk6IEFycmF5PFU+O1xuXG5cdC8qKlxuXHQgKiBUaGUgQXJyYXkuZnJvbSgpIG1ldGhvZCBjcmVhdGVzIGEgbmV3IEFycmF5IGluc3RhbmNlIGZyb20gYW4gYXJyYXktbGlrZSBvciBpdGVyYWJsZSBvYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBzb3VyY2UgQW4gYXJyYXktbGlrZSBvciBpdGVyYWJsZSBvYmplY3QgdG8gY29udmVydCB0byBhbiBhcnJheVxuXHQgKiBAcmV0dXJuIFRoZSBuZXcgQXJyYXlcblx0ICovXG5cdDxUPihzb3VyY2U6IEFycmF5TGlrZTxUPiB8IEl0ZXJhYmxlPFQ+KTogQXJyYXk8VD47XG59XG5cbmV4cG9ydCBsZXQgZnJvbTogRnJvbTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGFycmF5IGZyb20gdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIGFyZ3VtZW50cyBBbnkgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgdGhlIGFycmF5XG4gKiBAcmV0dXJuIEFuIGFycmF5IGZyb20gdGhlIGdpdmVuIGFyZ3VtZW50c1xuICovXG5leHBvcnQgbGV0IG9mOiA8VD4oLi4uaXRlbXM6IFRbXSkgPT4gQXJyYXk8VD47XG5cbi8qIEVTNiBBcnJheSBpbnN0YW5jZSBtZXRob2RzICovXG5cbi8qKlxuICogQ29waWVzIGRhdGEgaW50ZXJuYWxseSB3aXRoaW4gYW4gYXJyYXkgb3IgYXJyYXktbGlrZSBvYmplY3QuXG4gKlxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IGFycmF5LWxpa2Ugb2JqZWN0XG4gKiBAcGFyYW0gb2Zmc2V0IFRoZSBpbmRleCB0byBzdGFydCBjb3B5aW5nIHZhbHVlcyB0bzsgaWYgbmVnYXRpdmUsIGl0IGNvdW50cyBiYWNrd2FyZHMgZnJvbSBsZW5ndGhcbiAqIEBwYXJhbSBzdGFydCBUaGUgZmlyc3QgKGluY2x1c2l2ZSkgaW5kZXggdG8gY29weTsgaWYgbmVnYXRpdmUsIGl0IGNvdW50cyBiYWNrd2FyZHMgZnJvbSBsZW5ndGhcbiAqIEBwYXJhbSBlbmQgVGhlIGxhc3QgKGV4Y2x1c2l2ZSkgaW5kZXggdG8gY29weTsgaWYgbmVnYXRpdmUsIGl0IGNvdW50cyBiYWNrd2FyZHMgZnJvbSBsZW5ndGhcbiAqIEByZXR1cm4gVGhlIHRhcmdldFxuICovXG5leHBvcnQgbGV0IGNvcHlXaXRoaW46IDxUPih0YXJnZXQ6IEFycmF5TGlrZTxUPiwgb2Zmc2V0OiBudW1iZXIsIHN0YXJ0OiBudW1iZXIsIGVuZD86IG51bWJlcikgPT4gQXJyYXlMaWtlPFQ+O1xuXG4vKipcbiAqIEZpbGxzIGVsZW1lbnRzIG9mIGFuIGFycmF5LWxpa2Ugb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgdG8gZmlsbFxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBmaWxsIGVhY2ggZWxlbWVudCBvZiB0aGUgdGFyZ2V0IHdpdGhcbiAqIEBwYXJhbSBzdGFydCBUaGUgZmlyc3QgaW5kZXggdG8gZmlsbFxuICogQHBhcmFtIGVuZCBUaGUgKGV4Y2x1c2l2ZSkgaW5kZXggYXQgd2hpY2ggdG8gc3RvcCBmaWxsaW5nXG4gKiBAcmV0dXJuIFRoZSBmaWxsZWQgdGFyZ2V0XG4gKi9cbmV4cG9ydCBsZXQgZmlsbDogPFQ+KHRhcmdldDogQXJyYXlMaWtlPFQ+LCB2YWx1ZTogVCwgc3RhcnQ/OiBudW1iZXIsIGVuZD86IG51bWJlcikgPT4gQXJyYXlMaWtlPFQ+O1xuXG4vKipcbiAqIEZpbmRzIGFuZCByZXR1cm5zIHRoZSBmaXJzdCBpbnN0YW5jZSBtYXRjaGluZyB0aGUgY2FsbGJhY2sgb3IgdW5kZWZpbmVkIGlmIG9uZSBpcyBub3QgZm91bmQuXG4gKlxuICogQHBhcmFtIHRhcmdldCBBbiBhcnJheS1saWtlIG9iamVjdFxuICogQHBhcmFtIGNhbGxiYWNrIEEgZnVuY3Rpb24gcmV0dXJuaW5nIGlmIHRoZSBjdXJyZW50IHZhbHVlIG1hdGNoZXMgYSBjcml0ZXJpYVxuICogQHBhcmFtIHRoaXNBcmcgVGhlIGV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgZmluZCBmdW5jdGlvblxuICogQHJldHVybiBUaGUgZmlyc3QgZWxlbWVudCBtYXRjaGluZyB0aGUgY2FsbGJhY2ssIG9yIHVuZGVmaW5lZCBpZiBvbmUgZG9lcyBub3QgZXhpc3RcbiAqL1xuZXhwb3J0IGxldCBmaW5kOiA8VD4odGFyZ2V0OiBBcnJheUxpa2U8VD4sIGNhbGxiYWNrOiBGaW5kQ2FsbGJhY2s8VD4sIHRoaXNBcmc/OiB7fSkgPT4gVCB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIGxpbmVhciBzZWFyY2ggYW5kIHJldHVybnMgdGhlIGZpcnN0IGluZGV4IHdob3NlIHZhbHVlIHNhdGlzZmllcyB0aGUgcGFzc2VkIGNhbGxiYWNrLFxuICogb3IgLTEgaWYgbm8gdmFsdWVzIHNhdGlzZnkgaXQuXG4gKlxuICogQHBhcmFtIHRhcmdldCBBbiBhcnJheS1saWtlIG9iamVjdFxuICogQHBhcmFtIGNhbGxiYWNrIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRydWUgaWYgdGhlIGN1cnJlbnQgdmFsdWUgc2F0aXNmaWVzIGl0cyBjcml0ZXJpYVxuICogQHBhcmFtIHRoaXNBcmcgVGhlIGV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgZmluZCBmdW5jdGlvblxuICogQHJldHVybiBUaGUgZmlyc3QgaW5kZXggd2hvc2UgdmFsdWUgc2F0aXNmaWVzIHRoZSBwYXNzZWQgY2FsbGJhY2ssIG9yIC0xIGlmIG5vIHZhbHVlcyBzYXRpc2Z5IGl0XG4gKi9cbmV4cG9ydCBsZXQgZmluZEluZGV4OiA8VD4odGFyZ2V0OiBBcnJheUxpa2U8VD4sIGNhbGxiYWNrOiBGaW5kQ2FsbGJhY2s8VD4sIHRoaXNBcmc/OiB7fSkgPT4gbnVtYmVyO1xuXG4vKiBFUzcgQXJyYXkgaW5zdGFuY2UgbWV0aG9kcyAqL1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhbiBhcnJheSBpbmNsdWRlcyBhIGdpdmVuIHZhbHVlXG4gKlxuICogQHBhcmFtIHRhcmdldCB0aGUgdGFyZ2V0IGFycmF5LWxpa2Ugb2JqZWN0XG4gKiBAcGFyYW0gc2VhcmNoRWxlbWVudCB0aGUgaXRlbSB0byBzZWFyY2ggZm9yXG4gKiBAcGFyYW0gZnJvbUluZGV4IHRoZSBzdGFydGluZyBpbmRleCB0byBzZWFyY2ggZnJvbVxuICogQHJldHVybiBgdHJ1ZWAgaWYgdGhlIGFycmF5IGluY2x1ZGVzIHRoZSBlbGVtZW50LCBvdGhlcndpc2UgYGZhbHNlYFxuICovXG5leHBvcnQgbGV0IGluY2x1ZGVzOiA8VD4odGFyZ2V0OiBBcnJheUxpa2U8VD4sIHNlYXJjaEVsZW1lbnQ6IFQsIGZyb21JbmRleD86IG51bWJlcikgPT4gYm9vbGVhbjtcblxuaWYgKGhhcygnZXM2LWFycmF5JykgJiYgaGFzKCdlczYtYXJyYXktZmlsbCcpKSB7XG5cdGZyb20gPSBnbG9iYWwuQXJyYXkuZnJvbTtcblx0b2YgPSBnbG9iYWwuQXJyYXkub2Y7XG5cdGNvcHlXaXRoaW4gPSB3cmFwTmF0aXZlKGdsb2JhbC5BcnJheS5wcm90b3R5cGUuY29weVdpdGhpbik7XG5cdGZpbGwgPSB3cmFwTmF0aXZlKGdsb2JhbC5BcnJheS5wcm90b3R5cGUuZmlsbCk7XG5cdGZpbmQgPSB3cmFwTmF0aXZlKGdsb2JhbC5BcnJheS5wcm90b3R5cGUuZmluZCk7XG5cdGZpbmRJbmRleCA9IHdyYXBOYXRpdmUoZ2xvYmFsLkFycmF5LnByb3RvdHlwZS5maW5kSW5kZXgpO1xufSBlbHNlIHtcblx0Ly8gSXQgaXMgb25seSBvbGRlciB2ZXJzaW9ucyBvZiBTYWZhcmkvaU9TIHRoYXQgaGF2ZSBhIGJhZCBmaWxsIGltcGxlbWVudGF0aW9uIGFuZCBzbyBhcmVuJ3QgaW4gdGhlIHdpbGRcblx0Ly8gVG8gbWFrZSB0aGluZ3MgZWFzaWVyLCBpZiB0aGVyZSBpcyBhIGJhZCBmaWxsIGltcGxlbWVudGF0aW9uLCB0aGUgd2hvbGUgc2V0IG9mIGZ1bmN0aW9ucyB3aWxsIGJlIGZpbGxlZFxuXG5cdC8qKlxuXHQgKiBFbnN1cmVzIGEgbm9uLW5lZ2F0aXZlLCBub24taW5maW5pdGUsIHNhZmUgaW50ZWdlci5cblx0ICpcblx0ICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIHRvIHZhbGlkYXRlXG5cdCAqIEByZXR1cm4gQSBwcm9wZXIgbGVuZ3RoXG5cdCAqL1xuXHRjb25zdCB0b0xlbmd0aCA9IGZ1bmN0aW9uIHRvTGVuZ3RoKGxlbmd0aDogbnVtYmVyKTogbnVtYmVyIHtcblx0XHRpZiAoaXNOYU4obGVuZ3RoKSkge1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0bGVuZ3RoID0gTnVtYmVyKGxlbmd0aCk7XG5cdFx0aWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcblx0XHRcdGxlbmd0aCA9IE1hdGguZmxvb3IobGVuZ3RoKTtcblx0XHR9XG5cdFx0Ly8gRW5zdXJlIGEgbm9uLW5lZ2F0aXZlLCByZWFsLCBzYWZlIGludGVnZXJcblx0XHRyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobGVuZ3RoLCAwKSwgTUFYX1NBRkVfSU5URUdFUik7XG5cdH07XG5cblx0LyoqXG5cdCAqIEZyb20gRVM2IDcuMS40IFRvSW50ZWdlcigpXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWx1ZSBBIHZhbHVlIHRvIGNvbnZlcnRcblx0ICogQHJldHVybiBBbiBpbnRlZ2VyXG5cdCAqL1xuXHRjb25zdCB0b0ludGVnZXIgPSBmdW5jdGlvbiB0b0ludGVnZXIodmFsdWU6IGFueSk6IG51bWJlciB7XG5cdFx0dmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuXHRcdGlmIChpc05hTih2YWx1ZSkpIHtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblx0XHRpZiAodmFsdWUgPT09IDAgfHwgIWlzRmluaXRlKHZhbHVlKSkge1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblxuXHRcdHJldHVybiAodmFsdWUgPiAwID8gMSA6IC0xKSAqIE1hdGguZmxvb3IoTWF0aC5hYnModmFsdWUpKTtcblx0fTtcblxuXHQvKipcblx0ICogTm9ybWFsaXplcyBhbiBvZmZzZXQgYWdhaW5zdCBhIGdpdmVuIGxlbmd0aCwgd3JhcHBpbmcgaXQgaWYgbmVnYXRpdmUuXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWx1ZSBUaGUgb3JpZ2luYWwgb2Zmc2V0XG5cdCAqIEBwYXJhbSBsZW5ndGggVGhlIHRvdGFsIGxlbmd0aCB0byBub3JtYWxpemUgYWdhaW5zdFxuXHQgKiBAcmV0dXJuIElmIG5lZ2F0aXZlLCBwcm92aWRlIGEgZGlzdGFuY2UgZnJvbSB0aGUgZW5kIChsZW5ndGgpOyBvdGhlcndpc2UgcHJvdmlkZSBhIGRpc3RhbmNlIGZyb20gMFxuXHQgKi9cblx0Y29uc3Qgbm9ybWFsaXplT2Zmc2V0ID0gZnVuY3Rpb24gbm9ybWFsaXplT2Zmc2V0KHZhbHVlOiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdmFsdWUgPCAwID8gTWF0aC5tYXgobGVuZ3RoICsgdmFsdWUsIDApIDogTWF0aC5taW4odmFsdWUsIGxlbmd0aCk7XG5cdH07XG5cblx0ZnJvbSA9IGZ1bmN0aW9uIGZyb20oXG5cdFx0dGhpczogQXJyYXlDb25zdHJ1Y3Rvcixcblx0XHRhcnJheUxpa2U6IEl0ZXJhYmxlPGFueT4gfCBBcnJheUxpa2U8YW55Pixcblx0XHRtYXBGdW5jdGlvbj86IE1hcENhbGxiYWNrPGFueSwgYW55Pixcblx0XHR0aGlzQXJnPzogYW55XG5cdCk6IEFycmF5PGFueT4ge1xuXHRcdGlmIChhcnJheUxpa2UgPT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignZnJvbTogcmVxdWlyZXMgYW4gYXJyYXktbGlrZSBvYmplY3QnKTtcblx0XHR9XG5cblx0XHRpZiAobWFwRnVuY3Rpb24gJiYgdGhpc0FyZykge1xuXHRcdFx0bWFwRnVuY3Rpb24gPSBtYXBGdW5jdGlvbi5iaW5kKHRoaXNBcmcpO1xuXHRcdH1cblxuXHRcdC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lICovXG5cdFx0Y29uc3QgQ29uc3RydWN0b3IgPSB0aGlzO1xuXHRcdGNvbnN0IGxlbmd0aDogbnVtYmVyID0gdG9MZW5ndGgoKDxhbnk+YXJyYXlMaWtlKS5sZW5ndGgpO1xuXG5cdFx0Ly8gU3VwcG9ydCBleHRlbnNpb25cblx0XHRjb25zdCBhcnJheTogYW55W10gPVxuXHRcdFx0dHlwZW9mIENvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nID8gPGFueVtdPk9iamVjdChuZXcgQ29uc3RydWN0b3IobGVuZ3RoKSkgOiBuZXcgQXJyYXkobGVuZ3RoKTtcblxuXHRcdGlmICghaXNBcnJheUxpa2UoYXJyYXlMaWtlKSAmJiAhaXNJdGVyYWJsZShhcnJheUxpa2UpKSB7XG5cdFx0XHRyZXR1cm4gYXJyYXk7XG5cdFx0fVxuXG5cdFx0Ly8gaWYgdGhpcyBpcyBhbiBhcnJheSBhbmQgdGhlIG5vcm1hbGl6ZWQgbGVuZ3RoIGlzIDAsIGp1c3QgcmV0dXJuIGFuIGVtcHR5IGFycmF5LiB0aGlzIHByZXZlbnRzIGEgcHJvYmxlbVxuXHRcdC8vIHdpdGggdGhlIGl0ZXJhdGlvbiBvbiBJRSB3aGVuIHVzaW5nIGEgTmFOIGFycmF5IGxlbmd0aC5cblx0XHRpZiAoaXNBcnJheUxpa2UoYXJyYXlMaWtlKSkge1xuXHRcdFx0aWYgKGxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRyZXR1cm4gW107XG5cdFx0XHR9XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXlMaWtlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGFycmF5W2ldID0gbWFwRnVuY3Rpb24gPyBtYXBGdW5jdGlvbihhcnJheUxpa2VbaV0sIGkpIDogYXJyYXlMaWtlW2ldO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZXQgaSA9IDA7XG5cdFx0XHRmb3IgKGNvbnN0IHZhbHVlIG9mIGFycmF5TGlrZSkge1xuXHRcdFx0XHRhcnJheVtpXSA9IG1hcEZ1bmN0aW9uID8gbWFwRnVuY3Rpb24odmFsdWUsIGkpIDogdmFsdWU7XG5cdFx0XHRcdGkrKztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoKDxhbnk+YXJyYXlMaWtlKS5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0YXJyYXkubGVuZ3RoID0gbGVuZ3RoO1xuXHRcdH1cblxuXHRcdHJldHVybiBhcnJheTtcblx0fTtcblxuXHRvZiA9IGZ1bmN0aW9uIG9mPFQ+KC4uLml0ZW1zOiBUW10pOiBBcnJheTxUPiB7XG5cdFx0cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGl0ZW1zKTtcblx0fTtcblxuXHRjb3B5V2l0aGluID0gZnVuY3Rpb24gY29weVdpdGhpbjxUPihcblx0XHR0YXJnZXQ6IEFycmF5TGlrZTxUPixcblx0XHRvZmZzZXQ6IG51bWJlcixcblx0XHRzdGFydDogbnVtYmVyLFxuXHRcdGVuZD86IG51bWJlclxuXHQpOiBBcnJheUxpa2U8VD4ge1xuXHRcdGlmICh0YXJnZXQgPT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignY29weVdpdGhpbjogdGFyZ2V0IG11c3QgYmUgYW4gYXJyYXktbGlrZSBvYmplY3QnKTtcblx0XHR9XG5cblx0XHRjb25zdCBsZW5ndGggPSB0b0xlbmd0aCh0YXJnZXQubGVuZ3RoKTtcblx0XHRvZmZzZXQgPSBub3JtYWxpemVPZmZzZXQodG9JbnRlZ2VyKG9mZnNldCksIGxlbmd0aCk7XG5cdFx0c3RhcnQgPSBub3JtYWxpemVPZmZzZXQodG9JbnRlZ2VyKHN0YXJ0KSwgbGVuZ3RoKTtcblx0XHRlbmQgPSBub3JtYWxpemVPZmZzZXQoZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0ludGVnZXIoZW5kKSwgbGVuZ3RoKTtcblx0XHRsZXQgY291bnQgPSBNYXRoLm1pbihlbmQgLSBzdGFydCwgbGVuZ3RoIC0gb2Zmc2V0KTtcblxuXHRcdGxldCBkaXJlY3Rpb24gPSAxO1xuXHRcdGlmIChvZmZzZXQgPiBzdGFydCAmJiBvZmZzZXQgPCBzdGFydCArIGNvdW50KSB7XG5cdFx0XHRkaXJlY3Rpb24gPSAtMTtcblx0XHRcdHN0YXJ0ICs9IGNvdW50IC0gMTtcblx0XHRcdG9mZnNldCArPSBjb3VudCAtIDE7XG5cdFx0fVxuXG5cdFx0d2hpbGUgKGNvdW50ID4gMCkge1xuXHRcdFx0aWYgKHN0YXJ0IGluIHRhcmdldCkge1xuXHRcdFx0XHQodGFyZ2V0IGFzIFdyaXRhYmxlQXJyYXlMaWtlPFQ+KVtvZmZzZXRdID0gdGFyZ2V0W3N0YXJ0XTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlbGV0ZSAodGFyZ2V0IGFzIFdyaXRhYmxlQXJyYXlMaWtlPFQ+KVtvZmZzZXRdO1xuXHRcdFx0fVxuXG5cdFx0XHRvZmZzZXQgKz0gZGlyZWN0aW9uO1xuXHRcdFx0c3RhcnQgKz0gZGlyZWN0aW9uO1xuXHRcdFx0Y291bnQtLTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0O1xuXHR9O1xuXG5cdGZpbGwgPSBmdW5jdGlvbiBmaWxsPFQ+KHRhcmdldDogQXJyYXlMaWtlPFQ+LCB2YWx1ZTogYW55LCBzdGFydD86IG51bWJlciwgZW5kPzogbnVtYmVyKTogQXJyYXlMaWtlPFQ+IHtcblx0XHRjb25zdCBsZW5ndGggPSB0b0xlbmd0aCh0YXJnZXQubGVuZ3RoKTtcblx0XHRsZXQgaSA9IG5vcm1hbGl6ZU9mZnNldCh0b0ludGVnZXIoc3RhcnQpLCBsZW5ndGgpO1xuXHRcdGVuZCA9IG5vcm1hbGl6ZU9mZnNldChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvSW50ZWdlcihlbmQpLCBsZW5ndGgpO1xuXG5cdFx0d2hpbGUgKGkgPCBlbmQpIHtcblx0XHRcdCh0YXJnZXQgYXMgV3JpdGFibGVBcnJheUxpa2U8VD4pW2krK10gPSB2YWx1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0O1xuXHR9O1xuXG5cdGZpbmQgPSBmdW5jdGlvbiBmaW5kPFQ+KHRhcmdldDogQXJyYXlMaWtlPFQ+LCBjYWxsYmFjazogRmluZENhbGxiYWNrPFQ+LCB0aGlzQXJnPzoge30pOiBUIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBpbmRleCA9IGZpbmRJbmRleDxUPih0YXJnZXQsIGNhbGxiYWNrLCB0aGlzQXJnKTtcblx0XHRyZXR1cm4gaW5kZXggIT09IC0xID8gdGFyZ2V0W2luZGV4XSA6IHVuZGVmaW5lZDtcblx0fTtcblxuXHRmaW5kSW5kZXggPSBmdW5jdGlvbiBmaW5kSW5kZXg8VD4odGFyZ2V0OiBBcnJheUxpa2U8VD4sIGNhbGxiYWNrOiBGaW5kQ2FsbGJhY2s8VD4sIHRoaXNBcmc/OiB7fSk6IG51bWJlciB7XG5cdFx0Y29uc3QgbGVuZ3RoID0gdG9MZW5ndGgodGFyZ2V0Lmxlbmd0aCk7XG5cblx0XHRpZiAoIWNhbGxiYWNrKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdmaW5kOiBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXNBcmcpIHtcblx0XHRcdGNhbGxiYWNrID0gY2FsbGJhY2suYmluZCh0aGlzQXJnKTtcblx0XHR9XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoY2FsbGJhY2sodGFyZ2V0W2ldLCBpLCB0YXJnZXQpKSB7XG5cdFx0XHRcdHJldHVybiBpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAtMTtcblx0fTtcbn1cblxuaWYgKGhhcygnZXM3LWFycmF5JykpIHtcblx0aW5jbHVkZXMgPSB3cmFwTmF0aXZlKGdsb2JhbC5BcnJheS5wcm90b3R5cGUuaW5jbHVkZXMpO1xufSBlbHNlIHtcblx0LyoqXG5cdCAqIEVuc3VyZXMgYSBub24tbmVnYXRpdmUsIG5vbi1pbmZpbml0ZSwgc2FmZSBpbnRlZ2VyLlxuXHQgKlxuXHQgKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgdG8gdmFsaWRhdGVcblx0ICogQHJldHVybiBBIHByb3BlciBsZW5ndGhcblx0ICovXG5cdGNvbnN0IHRvTGVuZ3RoID0gZnVuY3Rpb24gdG9MZW5ndGgobGVuZ3RoOiBudW1iZXIpOiBudW1iZXIge1xuXHRcdGxlbmd0aCA9IE51bWJlcihsZW5ndGgpO1xuXHRcdGlmIChpc05hTihsZW5ndGgpKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cdFx0aWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcblx0XHRcdGxlbmd0aCA9IE1hdGguZmxvb3IobGVuZ3RoKTtcblx0XHR9XG5cdFx0Ly8gRW5zdXJlIGEgbm9uLW5lZ2F0aXZlLCByZWFsLCBzYWZlIGludGVnZXJcblx0XHRyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobGVuZ3RoLCAwKSwgTUFYX1NBRkVfSU5URUdFUik7XG5cdH07XG5cblx0aW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlczxUPih0YXJnZXQ6IEFycmF5TGlrZTxUPiwgc2VhcmNoRWxlbWVudDogVCwgZnJvbUluZGV4OiBudW1iZXIgPSAwKTogYm9vbGVhbiB7XG5cdFx0bGV0IGxlbiA9IHRvTGVuZ3RoKHRhcmdldC5sZW5ndGgpO1xuXG5cdFx0Zm9yIChsZXQgaSA9IGZyb21JbmRleDsgaSA8IGxlbjsgKytpKSB7XG5cdFx0XHRjb25zdCBjdXJyZW50RWxlbWVudCA9IHRhcmdldFtpXTtcblx0XHRcdGlmIChcblx0XHRcdFx0c2VhcmNoRWxlbWVudCA9PT0gY3VycmVudEVsZW1lbnQgfHxcblx0XHRcdFx0KHNlYXJjaEVsZW1lbnQgIT09IHNlYXJjaEVsZW1lbnQgJiYgY3VycmVudEVsZW1lbnQgIT09IGN1cnJlbnRFbGVtZW50KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBhcnJheS50cyIsImNvbnN0IGdsb2JhbE9iamVjdDogYW55ID0gKGZ1bmN0aW9uKCk6IGFueSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuXHRcdC8vIGdsb2JhbCBzcGVjIGRlZmluZXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QgY2FsbGVkICdnbG9iYWwnXG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZ2xvYmFsXG5cdFx0Ly8gYGdsb2JhbGAgaXMgYWxzbyBkZWZpbmVkIGluIE5vZGVKU1xuXHRcdHJldHVybiBnbG9iYWw7XG5cdH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHQvLyB3aW5kb3cgaXMgZGVmaW5lZCBpbiBicm93c2Vyc1xuXHRcdHJldHVybiB3aW5kb3c7XG5cdH0gZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0Ly8gc2VsZiBpcyBkZWZpbmVkIGluIFdlYldvcmtlcnNcblx0XHRyZXR1cm4gc2VsZjtcblx0fVxufSkoKTtcblxuZXhwb3J0IGRlZmF1bHQgZ2xvYmFsT2JqZWN0O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGdsb2JhbC50cyIsImltcG9ydCAnLi9TeW1ib2wnO1xuaW1wb3J0IHsgSElHSF9TVVJST0dBVEVfTUFYLCBISUdIX1NVUlJPR0FURV9NSU4gfSBmcm9tICcuL3N0cmluZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSXRlcmF0b3JSZXN1bHQ8VD4ge1xuXHRyZWFkb25seSBkb25lOiBib29sZWFuO1xuXHRyZWFkb25seSB2YWx1ZTogVDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJdGVyYXRvcjxUPiB7XG5cdG5leHQodmFsdWU/OiBhbnkpOiBJdGVyYXRvclJlc3VsdDxUPjtcblxuXHRyZXR1cm4/KHZhbHVlPzogYW55KTogSXRlcmF0b3JSZXN1bHQ8VD47XG5cblx0dGhyb3c/KGU/OiBhbnkpOiBJdGVyYXRvclJlc3VsdDxUPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJdGVyYWJsZTxUPiB7XG5cdFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhdG9yPFQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEl0ZXJhYmxlSXRlcmF0b3I8VD4gZXh0ZW5kcyBJdGVyYXRvcjxUPiB7XG5cdFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8VD47XG59XG5cbmNvbnN0IHN0YXRpY0RvbmU6IEl0ZXJhdG9yUmVzdWx0PGFueT4gPSB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgX3NoaW1zXyBhbiBpdGVyYXRvciBpbnRlcmZhY2Ugb24gYXJyYXkgbGlrZSBvYmplY3RzLlxuICovXG5leHBvcnQgY2xhc3MgU2hpbUl0ZXJhdG9yPFQ+IHtcblx0cHJpdmF0ZSBfbGlzdDogQXJyYXlMaWtlPFQ+IHwgdW5kZWZpbmVkO1xuXHRwcml2YXRlIF9uZXh0SW5kZXggPSAtMTtcblx0cHJpdmF0ZSBfbmF0aXZlSXRlcmF0b3I6IEl0ZXJhdG9yPFQ+IHwgdW5kZWZpbmVkO1xuXG5cdGNvbnN0cnVjdG9yKGxpc3Q6IEFycmF5TGlrZTxUPiB8IEl0ZXJhYmxlPFQ+KSB7XG5cdFx0aWYgKGlzSXRlcmFibGUobGlzdCkpIHtcblx0XHRcdHRoaXMuX25hdGl2ZUl0ZXJhdG9yID0gbGlzdFtTeW1ib2wuaXRlcmF0b3JdKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX2xpc3QgPSBsaXN0O1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm4gdGhlIG5leHQgaXRlcmF0aW9uIHJlc3VsdCBmb3IgdGhlIEl0ZXJhdG9yXG5cdCAqL1xuXHRuZXh0KCk6IEl0ZXJhdG9yUmVzdWx0PFQ+IHtcblx0XHRpZiAodGhpcy5fbmF0aXZlSXRlcmF0b3IpIHtcblx0XHRcdHJldHVybiB0aGlzLl9uYXRpdmVJdGVyYXRvci5uZXh0KCk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5fbGlzdCkge1xuXHRcdFx0cmV0dXJuIHN0YXRpY0RvbmU7XG5cdFx0fVxuXHRcdGlmICgrK3RoaXMuX25leHRJbmRleCA8IHRoaXMuX2xpc3QubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkb25lOiBmYWxzZSxcblx0XHRcdFx0dmFsdWU6IHRoaXMuX2xpc3RbdGhpcy5fbmV4dEluZGV4XVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIHN0YXRpY0RvbmU7XG5cdH1cblxuXHRbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG4vKipcbiAqIEEgdHlwZSBndWFyZCBmb3IgY2hlY2tpbmcgaWYgc29tZXRoaW5nIGhhcyBhbiBJdGVyYWJsZSBpbnRlcmZhY2VcbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHR5cGUgZ3VhcmQgYWdhaW5zdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJdGVyYWJsZSh2YWx1ZTogYW55KTogdmFsdWUgaXMgSXRlcmFibGU8YW55PiB7XG5cdHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWVbU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBBIHR5cGUgZ3VhcmQgZm9yIGNoZWNraW5nIGlmIHNvbWV0aGluZyBpcyBBcnJheUxpa2VcbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHR5cGUgZ3VhcmQgYWdhaW5zdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWU6IGFueSk6IHZhbHVlIGlzIEFycmF5TGlrZTxhbnk+IHtcblx0cmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5sZW5ndGggPT09ICdudW1iZXInO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGl0ZXJhdG9yIGZvciBhbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0gaXRlcmFibGUgVGhlIGl0ZXJhYmxlIG9iamVjdCB0byByZXR1cm4gdGhlIGl0ZXJhdG9yIGZvclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0PFQ+KGl0ZXJhYmxlOiBJdGVyYWJsZTxUPiB8IEFycmF5TGlrZTxUPik6IEl0ZXJhdG9yPFQ+IHwgdW5kZWZpbmVkIHtcblx0aWYgKGlzSXRlcmFibGUoaXRlcmFibGUpKSB7XG5cdFx0cmV0dXJuIGl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcblx0fSBlbHNlIGlmIChpc0FycmF5TGlrZShpdGVyYWJsZSkpIHtcblx0XHRyZXR1cm4gbmV3IFNoaW1JdGVyYXRvcihpdGVyYWJsZSk7XG5cdH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JPZkNhbGxiYWNrPFQ+IHtcblx0LyoqXG5cdCAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGEgZm9yT2YoKSBpdGVyYXRpb25cblx0ICpcblx0ICogQHBhcmFtIHZhbHVlIFRoZSBjdXJyZW50IHZhbHVlXG5cdCAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCBiZWluZyBpdGVyYXRlZCBvdmVyXG5cdCAqIEBwYXJhbSBkb0JyZWFrIEEgZnVuY3Rpb24sIGlmIGNhbGxlZCwgd2lsbCBzdG9wIHRoZSBpdGVyYXRpb25cblx0ICovXG5cdCh2YWx1ZTogVCwgb2JqZWN0OiBJdGVyYWJsZTxUPiB8IEFycmF5TGlrZTxUPiB8IHN0cmluZywgZG9CcmVhazogKCkgPT4gdm9pZCk6IHZvaWQ7XG59XG5cbi8qKlxuICogU2hpbXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYGZvciAuLi4gb2ZgIGJsb2Nrc1xuICpcbiAqIEBwYXJhbSBpdGVyYWJsZSBUaGUgb2JqZWN0IHRoZSBwcm92aWRlcyBhbiBpbnRlcmF0b3IgaW50ZXJmYWNlXG4gKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIGl0ZW0gb2YgdGhlIGl0ZXJhYmxlXG4gKiBAcGFyYW0gdGhpc0FyZyBPcHRpb25hbCBzY29wZSB0byBwYXNzIHRoZSBjYWxsYmFja1xuICovXG5leHBvcnQgZnVuY3Rpb24gZm9yT2Y8VD4oXG5cdGl0ZXJhYmxlOiBJdGVyYWJsZTxUPiB8IEFycmF5TGlrZTxUPiB8IHN0cmluZyxcblx0Y2FsbGJhY2s6IEZvck9mQ2FsbGJhY2s8VD4sXG5cdHRoaXNBcmc/OiBhbnlcbik6IHZvaWQge1xuXHRsZXQgYnJva2VuID0gZmFsc2U7XG5cblx0ZnVuY3Rpb24gZG9CcmVhaygpIHtcblx0XHRicm9rZW4gPSB0cnVlO1xuXHR9XG5cblx0LyogV2UgbmVlZCB0byBoYW5kbGUgaXRlcmF0aW9uIG9mIGRvdWJsZSBieXRlIHN0cmluZ3MgcHJvcGVybHkgKi9cblx0aWYgKGlzQXJyYXlMaWtlKGl0ZXJhYmxlKSAmJiB0eXBlb2YgaXRlcmFibGUgPT09ICdzdHJpbmcnKSB7XG5cdFx0Y29uc3QgbCA9IGl0ZXJhYmxlLmxlbmd0aDtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGw7ICsraSkge1xuXHRcdFx0bGV0IGNoYXIgPSBpdGVyYWJsZVtpXTtcblx0XHRcdGlmIChpICsgMSA8IGwpIHtcblx0XHRcdFx0Y29uc3QgY29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcblx0XHRcdFx0aWYgKGNvZGUgPj0gSElHSF9TVVJST0dBVEVfTUlOICYmIGNvZGUgPD0gSElHSF9TVVJST0dBVEVfTUFYKSB7XG5cdFx0XHRcdFx0Y2hhciArPSBpdGVyYWJsZVsrK2ldO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjYWxsYmFjay5jYWxsKHRoaXNBcmcsIGNoYXIsIGl0ZXJhYmxlLCBkb0JyZWFrKTtcblx0XHRcdGlmIChicm9rZW4pIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRjb25zdCBpdGVyYXRvciA9IGdldChpdGVyYWJsZSk7XG5cdFx0aWYgKGl0ZXJhdG9yKSB7XG5cdFx0XHRsZXQgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuXG5cdFx0XHR3aGlsZSAoIXJlc3VsdC5kb25lKSB7XG5cdFx0XHRcdGNhbGxiYWNrLmNhbGwodGhpc0FyZywgcmVzdWx0LnZhbHVlLCBpdGVyYWJsZSwgZG9CcmVhayk7XG5cdFx0XHRcdGlmIChicm9rZW4pIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0cmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGl0ZXJhdG9yLnRzIiwiaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XG5cbi8qKlxuICogVGhlIHNtYWxsZXN0IGludGVydmFsIGJldHdlZW4gdHdvIHJlcHJlc2VudGFibGUgbnVtYmVycy5cbiAqL1xuZXhwb3J0IGNvbnN0IEVQU0lMT04gPSAxO1xuXG4vKipcbiAqIFRoZSBtYXhpbXVtIHNhZmUgaW50ZWdlciBpbiBKYXZhU2NyaXB0XG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfU0FGRV9JTlRFR0VSID0gTWF0aC5wb3coMiwgNTMpIC0gMTtcblxuLyoqXG4gKiBUaGUgbWluaW11bSBzYWZlIGludGVnZXIgaW4gSmF2YVNjcmlwdFxuICovXG5leHBvcnQgY29uc3QgTUlOX1NBRkVfSU5URUdFUiA9IC1NQVhfU0FGRV9JTlRFR0VSO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGFzc2VkIHZhbHVlIGlzIE5hTiB3aXRob3V0IGNvZXJzaW9uLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBOYU4sIGZhbHNlIGlmIGl0IGlzIG5vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOYU4odmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBnbG9iYWwuaXNOYU4odmFsdWUpO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGFzc2VkIHZhbHVlIGlzIGEgZmluaXRlIG51bWJlciB3aXRob3V0IGNvZXJzaW9uLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBmaW5pdGUsIGZhbHNlIGlmIGl0IGlzIG5vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNGaW5pdGUodmFsdWU6IGFueSk6IHZhbHVlIGlzIG51bWJlciB7XG5cdHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGdsb2JhbC5pc0Zpbml0ZSh2YWx1ZSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXNzZWQgdmFsdWUgaXMgYW4gaW50ZWdlci5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlciwgZmFsc2UgaWYgaXQgaXMgbm90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0ludGVnZXIodmFsdWU6IGFueSk6IHZhbHVlIGlzIG51bWJlciB7XG5cdHJldHVybiBpc0Zpbml0ZSh2YWx1ZSkgJiYgTWF0aC5mbG9vcih2YWx1ZSkgPT09IHZhbHVlO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGFzc2VkIHZhbHVlIGlzIGFuIGludGVnZXIgdGhhdCBpcyAnc2FmZSwnIG1lYW5pbmc6XG4gKiAgIDEuIGl0IGNhbiBiZSBleHByZXNzZWQgYXMgYW4gSUVFRS03NTQgZG91YmxlIHByZWNpc2lvbiBudW1iZXJcbiAqICAgMi4gaXQgaGFzIGEgb25lLXRvLW9uZSBtYXBwaW5nIHRvIGEgbWF0aGVtYXRpY2FsIGludGVnZXIsIG1lYW5pbmcgaXRzXG4gKiAgICAgIElFRUUtNzU0IHJlcHJlc2VudGF0aW9uIGNhbm5vdCBiZSB0aGUgcmVzdWx0IG9mIHJvdW5kaW5nIGFueSBvdGhlclxuICogICAgICBpbnRlZ2VyIHRvIGZpdCB0aGUgSUVFRS03NTQgcmVwcmVzZW50YXRpb25cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlciwgZmFsc2UgaWYgaXQgaXMgbm90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBudW1iZXIge1xuXHRyZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSAmJiBNYXRoLmFicyh2YWx1ZSkgPD0gTUFYX1NBRkVfSU5URUdFUjtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBudW1iZXIudHMiLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4vZ2xvYmFsJztcbmltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XG5pbXBvcnQgeyBpc1N5bWJvbCB9IGZyb20gJy4vU3ltYm9sJztcblxuZXhwb3J0IGludGVyZmFjZSBPYmplY3RBc3NpZ24ge1xuXHQvKipcblx0ICogQ29weSB0aGUgdmFsdWVzIG9mIGFsbCBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBmcm9tIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIGFcblx0ICogdGFyZ2V0IG9iamVjdC4gUmV0dXJucyB0aGUgdGFyZ2V0IG9iamVjdC5cblx0ICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCB0byBjb3B5IHRvLlxuXHQgKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IGZyb20gd2hpY2ggdG8gY29weSBwcm9wZXJ0aWVzLlxuXHQgKi9cblx0PFQsIFU+KHRhcmdldDogVCwgc291cmNlOiBVKTogVCAmIFU7XG5cblx0LyoqXG5cdCAqIENvcHkgdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhXG5cdCAqIHRhcmdldCBvYmplY3QuIFJldHVybnMgdGhlIHRhcmdldCBvYmplY3QuXG5cdCAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gY29weSB0by5cblx0ICogQHBhcmFtIHNvdXJjZTEgVGhlIGZpcnN0IHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG5cdCAqIEBwYXJhbSBzb3VyY2UyIFRoZSBzZWNvbmQgc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllcy5cblx0ICovXG5cdDxULCBVLCBWPih0YXJnZXQ6IFQsIHNvdXJjZTE6IFUsIHNvdXJjZTI6IFYpOiBUICYgVSAmIFY7XG5cblx0LyoqXG5cdCAqIENvcHkgdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhXG5cdCAqIHRhcmdldCBvYmplY3QuIFJldHVybnMgdGhlIHRhcmdldCBvYmplY3QuXG5cdCAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gY29weSB0by5cblx0ICogQHBhcmFtIHNvdXJjZTEgVGhlIGZpcnN0IHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG5cdCAqIEBwYXJhbSBzb3VyY2UyIFRoZSBzZWNvbmQgc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllcy5cblx0ICogQHBhcmFtIHNvdXJjZTMgVGhlIHRoaXJkIHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG5cdCAqL1xuXHQ8VCwgVSwgViwgVz4odGFyZ2V0OiBULCBzb3VyY2UxOiBVLCBzb3VyY2UyOiBWLCBzb3VyY2UzOiBXKTogVCAmIFUgJiBWICYgVztcblxuXHQvKipcblx0ICogQ29weSB0aGUgdmFsdWVzIG9mIGFsbCBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBmcm9tIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIGFcblx0ICogdGFyZ2V0IG9iamVjdC4gUmV0dXJucyB0aGUgdGFyZ2V0IG9iamVjdC5cblx0ICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCB0byBjb3B5IHRvLlxuXHQgKiBAcGFyYW0gc291cmNlcyBPbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllc1xuXHQgKi9cblx0KHRhcmdldDogb2JqZWN0LCAuLi5zb3VyY2VzOiBhbnlbXSk6IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPYmplY3RFbnRlcmllcyB7XG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGtleS92YWx1ZXMgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBhbiBvYmplY3Rcblx0ICogQHBhcmFtIG8gT2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMuIFRoaXMgY2FuIGJlIGFuIG9iamVjdCB0aGF0IHlvdSBjcmVhdGVkIG9yIGFuIGV4aXN0aW5nIERvY3VtZW50IE9iamVjdCBNb2RlbCAoRE9NKSBvYmplY3QuXG5cdCAqL1xuXHQ8VCBleHRlbmRzIHsgW2tleTogc3RyaW5nXTogYW55IH0sIEsgZXh0ZW5kcyBrZXlvZiBUPihvOiBUKTogW2tleW9mIFQsIFRbS11dW107XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYW4gYXJyYXkgb2Yga2V5L3ZhbHVlcyBvZiB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdFxuXHQgKiBAcGFyYW0gbyBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgcHJvcGVydGllcyBhbmQgbWV0aG9kcy4gVGhpcyBjYW4gYmUgYW4gb2JqZWN0IHRoYXQgeW91IGNyZWF0ZWQgb3IgYW4gZXhpc3RpbmcgRG9jdW1lbnQgT2JqZWN0IE1vZGVsIChET00pIG9iamVjdC5cblx0ICovXG5cdChvOiBvYmplY3QpOiBbc3RyaW5nLCBhbnldW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyB7XG5cdDxUPihvOiBUKTogeyBbSyBpbiBrZXlvZiBUXTogUHJvcGVydHlEZXNjcmlwdG9yIH07XG5cdChvOiBhbnkpOiB7IFtrZXk6IHN0cmluZ106IFByb3BlcnR5RGVzY3JpcHRvciB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9iamVjdFZhbHVlcyB7XG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHZhbHVlcyBvZiB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdFxuXHQgKiBAcGFyYW0gbyBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgcHJvcGVydGllcyBhbmQgbWV0aG9kcy4gVGhpcyBjYW4gYmUgYW4gb2JqZWN0IHRoYXQgeW91IGNyZWF0ZWQgb3IgYW4gZXhpc3RpbmcgRG9jdW1lbnQgT2JqZWN0IE1vZGVsIChET00pIG9iamVjdC5cblx0ICovXG5cdDxUPihvOiB7IFtzOiBzdHJpbmddOiBUIH0pOiBUW107XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYW4gYXJyYXkgb2YgdmFsdWVzIG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0XG5cdCAqIEBwYXJhbSBvIE9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzLiBUaGlzIGNhbiBiZSBhbiBvYmplY3QgdGhhdCB5b3UgY3JlYXRlZCBvciBhbiBleGlzdGluZyBEb2N1bWVudCBPYmplY3QgTW9kZWwgKERPTSkgb2JqZWN0LlxuXHQgKi9cblx0KG86IG9iamVjdCk6IGFueVtdO1xufVxuXG5leHBvcnQgbGV0IGFzc2lnbjogT2JqZWN0QXNzaWduO1xuXG4vKipcbiAqIEdldHMgdGhlIG93biBwcm9wZXJ0eSBkZXNjcmlwdG9yIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LlxuICogQW4gb3duIHByb3BlcnR5IGRlc2NyaXB0b3IgaXMgb25lIHRoYXQgaXMgZGVmaW5lZCBkaXJlY3RseSBvbiB0aGUgb2JqZWN0IGFuZCBpcyBub3RcbiAqIGluaGVyaXRlZCBmcm9tIHRoZSBvYmplY3QncyBwcm90b3R5cGUuXG4gKiBAcGFyYW0gbyBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgcHJvcGVydHkuXG4gKiBAcGFyYW0gcCBOYW1lIG9mIHRoZSBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGxldCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IDxULCBLIGV4dGVuZHMga2V5b2YgVD4obzogVCwgcHJvcGVydHlLZXk6IEspID0+IFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgb3duIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0LiBUaGUgb3duIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IGFyZSB0aG9zZSB0aGF0IGFyZSBkZWZpbmVkIGRpcmVjdGx5XG4gKiBvbiB0aGF0IG9iamVjdCwgYW5kIGFyZSBub3QgaW5oZXJpdGVkIGZyb20gdGhlIG9iamVjdCdzIHByb3RvdHlwZS4gVGhlIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IGluY2x1ZGUgYm90aCBmaWVsZHMgKG9iamVjdHMpIGFuZCBmdW5jdGlvbnMuXG4gKiBAcGFyYW0gbyBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgb3duIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBsZXQgZ2V0T3duUHJvcGVydHlOYW1lczogKG86IGFueSkgPT4gc3RyaW5nW107XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgc3ltYm9sIHByb3BlcnRpZXMgZm91bmQgZGlyZWN0bHkgb24gb2JqZWN0IG8uXG4gKiBAcGFyYW0gbyBPYmplY3QgdG8gcmV0cmlldmUgdGhlIHN5bWJvbHMgZnJvbS5cbiAqL1xuZXhwb3J0IGxldCBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6IChvOiBhbnkpID0+IHN5bWJvbFtdO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWVzIGFyZSB0aGUgc2FtZSB2YWx1ZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICogQHBhcmFtIHZhbHVlMSBUaGUgZmlyc3QgdmFsdWUuXG4gKiBAcGFyYW0gdmFsdWUyIFRoZSBzZWNvbmQgdmFsdWUuXG4gKi9cbmV4cG9ydCBsZXQgaXM6ICh2YWx1ZTE6IGFueSwgdmFsdWUyOiBhbnkpID0+IGJvb2xlYW47XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydGllcyBhbmQgbWV0aG9kcyBvZiBhbiBvYmplY3QuXG4gKiBAcGFyYW0gbyBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgcHJvcGVydGllcyBhbmQgbWV0aG9kcy4gVGhpcyBjYW4gYmUgYW4gb2JqZWN0IHRoYXQgeW91IGNyZWF0ZWQgb3IgYW4gZXhpc3RpbmcgRG9jdW1lbnQgT2JqZWN0IE1vZGVsIChET00pIG9iamVjdC5cbiAqL1xuZXhwb3J0IGxldCBrZXlzOiAobzogb2JqZWN0KSA9PiBzdHJpbmdbXTtcblxuLyogRVM3IE9iamVjdCBzdGF0aWMgbWV0aG9kcyAqL1xuXG5leHBvcnQgbGV0IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnM6IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7XG5cbmV4cG9ydCBsZXQgZW50cmllczogT2JqZWN0RW50ZXJpZXM7XG5cbmV4cG9ydCBsZXQgdmFsdWVzOiBPYmplY3RWYWx1ZXM7XG5cbmlmIChoYXMoJ2VzNi1vYmplY3QnKSkge1xuXHRjb25zdCBnbG9iYWxPYmplY3QgPSBnbG9iYWwuT2JqZWN0O1xuXHRhc3NpZ24gPSBnbG9iYWxPYmplY3QuYXNzaWduO1xuXHRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBnbG9iYWxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXHRnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZ2xvYmFsT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7XG5cdGdldE93blByb3BlcnR5U3ltYm9scyA9IGdsb2JhbE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cdGlzID0gZ2xvYmFsT2JqZWN0LmlzO1xuXHRrZXlzID0gZ2xvYmFsT2JqZWN0LmtleXM7XG59IGVsc2Uge1xuXHRrZXlzID0gZnVuY3Rpb24gc3ltYm9sQXdhcmVLZXlzKG86IG9iamVjdCk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gT2JqZWN0LmtleXMobykuZmlsdGVyKChrZXkpID0+ICFCb29sZWFuKGtleS5tYXRjaCgvXkBALisvKSkpO1xuXHR9O1xuXG5cdGFzc2lnbiA9IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQ6IGFueSwgLi4uc291cmNlczogYW55W10pIHtcblx0XHRpZiAodGFyZ2V0ID09IG51bGwpIHtcblx0XHRcdC8vIFR5cGVFcnJvciBpZiB1bmRlZmluZWQgb3IgbnVsbFxuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdG8gPSBPYmplY3QodGFyZ2V0KTtcblx0XHRzb3VyY2VzLmZvckVhY2goKG5leHRTb3VyY2UpID0+IHtcblx0XHRcdGlmIChuZXh0U291cmNlKSB7XG5cdFx0XHRcdC8vIFNraXAgb3ZlciBpZiB1bmRlZmluZWQgb3IgbnVsbFxuXHRcdFx0XHRrZXlzKG5leHRTb3VyY2UpLmZvckVhY2goKG5leHRLZXkpID0+IHtcblx0XHRcdFx0XHR0b1tuZXh0S2V5XSA9IG5leHRTb3VyY2VbbmV4dEtleV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHRvO1xuXHR9O1xuXG5cdGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihcblx0XHRvOiBhbnksXG5cdFx0cHJvcDogc3RyaW5nIHwgc3ltYm9sXG5cdCk6IFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKGlzU3ltYm9sKHByb3ApKSB7XG5cdFx0XHRyZXR1cm4gKDxhbnk+T2JqZWN0KS5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobywgcHJvcCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8sIHByb3ApO1xuXHRcdH1cblx0fTtcblxuXHRnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhvOiBhbnkpOiBzdHJpbmdbXSB7XG5cdFx0cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG8pLmZpbHRlcigoa2V5KSA9PiAhQm9vbGVhbihrZXkubWF0Y2goL15AQC4rLykpKTtcblx0fTtcblxuXHRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMobzogYW55KTogc3ltYm9sW10ge1xuXHRcdHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvKVxuXHRcdFx0LmZpbHRlcigoa2V5KSA9PiBCb29sZWFuKGtleS5tYXRjaCgvXkBALisvKSkpXG5cdFx0XHQubWFwKChrZXkpID0+IFN5bWJvbC5mb3Ioa2V5LnN1YnN0cmluZygyKSkpO1xuXHR9O1xuXG5cdGlzID0gZnVuY3Rpb24gaXModmFsdWUxOiBhbnksIHZhbHVlMjogYW55KTogYm9vbGVhbiB7XG5cdFx0aWYgKHZhbHVlMSA9PT0gdmFsdWUyKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWUxICE9PSAwIHx8IDEgLyB2YWx1ZTEgPT09IDEgLyB2YWx1ZTI7IC8vIC0wXG5cdFx0fVxuXHRcdHJldHVybiB2YWx1ZTEgIT09IHZhbHVlMSAmJiB2YWx1ZTIgIT09IHZhbHVlMjsgLy8gTmFOXG5cdH07XG59XG5cbmlmIChoYXMoJ2VzMjAxNy1vYmplY3QnKSkge1xuXHRjb25zdCBnbG9iYWxPYmplY3QgPSBnbG9iYWwuT2JqZWN0O1xuXHRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID0gZ2xvYmFsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7XG5cdGVudHJpZXMgPSBnbG9iYWxPYmplY3QuZW50cmllcztcblx0dmFsdWVzID0gZ2xvYmFsT2JqZWN0LnZhbHVlcztcbn0gZWxzZSB7XG5cdGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG86IGFueSkge1xuXHRcdHJldHVybiBnZXRPd25Qcm9wZXJ0eU5hbWVzKG8pLnJlZHVjZShcblx0XHRcdChwcmV2aW91cywga2V5KSA9PiB7XG5cdFx0XHRcdHByZXZpb3VzW2tleV0gPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobywga2V5KSE7XG5cdFx0XHRcdHJldHVybiBwcmV2aW91cztcblx0XHRcdH0sXG5cdFx0XHR7fSBhcyB7IFtrZXk6IHN0cmluZ106IFByb3BlcnR5RGVzY3JpcHRvciB9XG5cdFx0KTtcblx0fTtcblxuXHRlbnRyaWVzID0gZnVuY3Rpb24gZW50cmllcyhvOiBhbnkpOiBbc3RyaW5nLCBhbnldW10ge1xuXHRcdHJldHVybiBrZXlzKG8pLm1hcCgoa2V5KSA9PiBba2V5LCBvW2tleV1dIGFzIFtzdHJpbmcsIGFueV0pO1xuXHR9O1xuXG5cdHZhbHVlcyA9IGZ1bmN0aW9uIHZhbHVlcyhvOiBhbnkpOiBhbnlbXSB7XG5cdFx0cmV0dXJuIGtleXMobykubWFwKChrZXkpID0+IG9ba2V5XSk7XG5cdH07XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gb2JqZWN0LnRzIiwiaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XG5pbXBvcnQgaGFzIGZyb20gJy4vc3VwcG9ydC9oYXMnO1xuaW1wb3J0IHsgd3JhcE5hdGl2ZSB9IGZyb20gJy4vc3VwcG9ydC91dGlsJztcblxuZXhwb3J0IGludGVyZmFjZSBTdHJpbmdOb3JtYWxpemUge1xuXHQvKipcblx0ICogUmV0dXJucyB0aGUgU3RyaW5nIHZhbHVlIHJlc3VsdCBvZiBub3JtYWxpemluZyB0aGUgc3RyaW5nIGludG8gdGhlIG5vcm1hbGl6YXRpb24gZm9ybVxuXHQgKiBuYW1lZCBieSBmb3JtIGFzIHNwZWNpZmllZCBpbiBVbmljb2RlIFN0YW5kYXJkIEFubmV4ICMxNSwgVW5pY29kZSBOb3JtYWxpemF0aW9uIEZvcm1zLlxuXHQgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgc3RyaW5nXG5cdCAqIEBwYXJhbSBmb3JtIEFwcGxpY2FibGUgdmFsdWVzOiBcIk5GQ1wiLCBcIk5GRFwiLCBcIk5GS0NcIiwgb3IgXCJORktEXCIsIElmIG5vdCBzcGVjaWZpZWQgZGVmYXVsdFxuXHQgKiBpcyBcIk5GQ1wiXG5cdCAqL1xuXHQodGFyZ2V0OiBzdHJpbmcsIGZvcm06ICdORkMnIHwgJ05GRCcgfCAnTkZLQycgfCAnTkZLRCcpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIFN0cmluZyB2YWx1ZSByZXN1bHQgb2Ygbm9ybWFsaXppbmcgdGhlIHN0cmluZyBpbnRvIHRoZSBub3JtYWxpemF0aW9uIGZvcm1cblx0ICogbmFtZWQgYnkgZm9ybSBhcyBzcGVjaWZpZWQgaW4gVW5pY29kZSBTdGFuZGFyZCBBbm5leCAjMTUsIFVuaWNvZGUgTm9ybWFsaXphdGlvbiBGb3Jtcy5cblx0ICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHN0cmluZ1xuXHQgKiBAcGFyYW0gZm9ybSBBcHBsaWNhYmxlIHZhbHVlczogXCJORkNcIiwgXCJORkRcIiwgXCJORktDXCIsIG9yIFwiTkZLRFwiLCBJZiBub3Qgc3BlY2lmaWVkIGRlZmF1bHRcblx0ICogaXMgXCJORkNcIlxuXHQgKi9cblx0KHRhcmdldDogc3RyaW5nLCBmb3JtPzogc3RyaW5nKTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBtaW5pbXVtIGxvY2F0aW9uIG9mIGhpZ2ggc3Vycm9nYXRlc1xuICovXG5leHBvcnQgY29uc3QgSElHSF9TVVJST0dBVEVfTUlOID0gMHhkODAwO1xuXG4vKipcbiAqIFRoZSBtYXhpbXVtIGxvY2F0aW9uIG9mIGhpZ2ggc3Vycm9nYXRlc1xuICovXG5leHBvcnQgY29uc3QgSElHSF9TVVJST0dBVEVfTUFYID0gMHhkYmZmO1xuXG4vKipcbiAqIFRoZSBtaW5pbXVtIGxvY2F0aW9uIG9mIGxvdyBzdXJyb2dhdGVzXG4gKi9cbmV4cG9ydCBjb25zdCBMT1dfU1VSUk9HQVRFX01JTiA9IDB4ZGMwMDtcblxuLyoqXG4gKiBUaGUgbWF4aW11bSBsb2NhdGlvbiBvZiBsb3cgc3Vycm9nYXRlc1xuICovXG5leHBvcnQgY29uc3QgTE9XX1NVUlJPR0FURV9NQVggPSAweGRmZmY7XG5cbi8qIEVTNiBzdGF0aWMgbWV0aG9kcyAqL1xuXG4vKipcbiAqIFJldHVybiB0aGUgU3RyaW5nIHZhbHVlIHdob3NlIGVsZW1lbnRzIGFyZSwgaW4gb3JkZXIsIHRoZSBlbGVtZW50cyBpbiB0aGUgTGlzdCBlbGVtZW50cy5cbiAqIElmIGxlbmd0aCBpcyAwLCB0aGUgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLlxuICogQHBhcmFtIGNvZGVQb2ludHMgVGhlIGNvZGUgcG9pbnRzIHRvIGdlbmVyYXRlIHRoZSBzdHJpbmdcbiAqL1xuZXhwb3J0IGxldCBmcm9tQ29kZVBvaW50OiAoLi4uY29kZVBvaW50czogbnVtYmVyW10pID0+IHN0cmluZztcblxuLyoqXG4gKiBgcmF3YCBpcyBpbnRlbmRlZCBmb3IgdXNlIGFzIGEgdGFnIGZ1bmN0aW9uIG9mIGEgVGFnZ2VkIFRlbXBsYXRlIFN0cmluZy4gV2hlbiBjYWxsZWRcbiAqIGFzIHN1Y2ggdGhlIGZpcnN0IGFyZ3VtZW50IHdpbGwgYmUgYSB3ZWxsIGZvcm1lZCB0ZW1wbGF0ZSBjYWxsIHNpdGUgb2JqZWN0IGFuZCB0aGUgcmVzdFxuICogcGFyYW1ldGVyIHdpbGwgY29udGFpbiB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcy5cbiAqIEBwYXJhbSB0ZW1wbGF0ZSBBIHdlbGwtZm9ybWVkIHRlbXBsYXRlIHN0cmluZyBjYWxsIHNpdGUgcmVwcmVzZW50YXRpb24uXG4gKiBAcGFyYW0gc3Vic3RpdHV0aW9ucyBBIHNldCBvZiBzdWJzdGl0dXRpb24gdmFsdWVzLlxuICovXG5leHBvcnQgbGV0IHJhdzogKHRlbXBsYXRlOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSwgLi4uc3Vic3RpdHV0aW9uczogYW55W10pID0+IHN0cmluZztcblxuLyogRVM2IGluc3RhbmNlIG1ldGhvZHMgKi9cblxuLyoqXG4gKiBSZXR1cm5zIGEgbm9ubmVnYXRpdmUgaW50ZWdlciBOdW1iZXIgbGVzcyB0aGFuIDExMTQxMTIgKDB4MTEwMDAwKSB0aGF0IGlzIHRoZSBjb2RlIHBvaW50XG4gKiB2YWx1ZSBvZiB0aGUgVVRGLTE2IGVuY29kZWQgY29kZSBwb2ludCBzdGFydGluZyBhdCB0aGUgc3RyaW5nIGVsZW1lbnQgYXQgcG9zaXRpb24gcG9zIGluXG4gKiB0aGUgU3RyaW5nIHJlc3VsdGluZyBmcm9tIGNvbnZlcnRpbmcgdGhpcyBvYmplY3QgdG8gYSBTdHJpbmcuXG4gKiBJZiB0aGVyZSBpcyBubyBlbGVtZW50IGF0IHRoYXQgcG9zaXRpb24sIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLlxuICogSWYgYSB2YWxpZCBVVEYtMTYgc3Vycm9nYXRlIHBhaXIgZG9lcyBub3QgYmVnaW4gYXQgcG9zLCB0aGUgcmVzdWx0IGlzIHRoZSBjb2RlIHVuaXQgYXQgcG9zLlxuICovXG5leHBvcnQgbGV0IGNvZGVQb2ludEF0OiAodGFyZ2V0OiBzdHJpbmcsIHBvcz86IG51bWJlcikgPT4gbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VxdWVuY2Ugb2YgZWxlbWVudHMgb2Ygc2VhcmNoU3RyaW5nIGNvbnZlcnRlZCB0byBhIFN0cmluZyBpcyB0aGVcbiAqIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgdGhpcyBvYmplY3QgKGNvbnZlcnRlZCB0byBhIFN0cmluZykgc3RhcnRpbmcgYXRcbiAqIGVuZFBvc2l0aW9uIOKAkyBsZW5ndGgodGhpcykuIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlLlxuICovXG5leHBvcnQgbGV0IGVuZHNXaXRoOiAodGFyZ2V0OiBzdHJpbmcsIHNlYXJjaFN0cmluZzogc3RyaW5nLCBlbmRQb3NpdGlvbj86IG51bWJlcikgPT4gYm9vbGVhbjtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgc2VhcmNoU3RyaW5nIGFwcGVhcnMgYXMgYSBzdWJzdHJpbmcgb2YgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoaXNcbiAqIG9iamVjdCB0byBhIFN0cmluZywgYXQgb25lIG9yIG1vcmUgcG9zaXRpb25zIHRoYXQgYXJlXG4gKiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gcG9zaXRpb247IG90aGVyd2lzZSwgcmV0dXJucyBmYWxzZS5cbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBzdHJpbmdcbiAqIEBwYXJhbSBzZWFyY2hTdHJpbmcgc2VhcmNoIHN0cmluZ1xuICogQHBhcmFtIHBvc2l0aW9uIElmIHBvc2l0aW9uIGlzIHVuZGVmaW5lZCwgMCBpcyBhc3N1bWVkLCBzbyBhcyB0byBzZWFyY2ggYWxsIG9mIHRoZSBTdHJpbmcuXG4gKi9cbmV4cG9ydCBsZXQgaW5jbHVkZXM6ICh0YXJnZXQ6IHN0cmluZywgc2VhcmNoU3RyaW5nOiBzdHJpbmcsIHBvc2l0aW9uPzogbnVtYmVyKSA9PiBib29sZWFuO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIFN0cmluZyB2YWx1ZSByZXN1bHQgb2Ygbm9ybWFsaXppbmcgdGhlIHN0cmluZyBpbnRvIHRoZSBub3JtYWxpemF0aW9uIGZvcm1cbiAqIG5hbWVkIGJ5IGZvcm0gYXMgc3BlY2lmaWVkIGluIFVuaWNvZGUgU3RhbmRhcmQgQW5uZXggIzE1LCBVbmljb2RlIE5vcm1hbGl6YXRpb24gRm9ybXMuXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgc3RyaW5nXG4gKiBAcGFyYW0gZm9ybSBBcHBsaWNhYmxlIHZhbHVlczogXCJORkNcIiwgXCJORkRcIiwgXCJORktDXCIsIG9yIFwiTkZLRFwiLCBJZiBub3Qgc3BlY2lmaWVkIGRlZmF1bHRcbiAqIGlzIFwiTkZDXCJcbiAqL1xuZXhwb3J0IGxldCBub3JtYWxpemU6IFN0cmluZ05vcm1hbGl6ZTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgU3RyaW5nIHZhbHVlIHRoYXQgaXMgbWFkZSBmcm9tIGNvdW50IGNvcGllcyBhcHBlbmRlZCB0b2dldGhlci4gSWYgY291bnQgaXMgMCxcbiAqIFQgaXMgdGhlIGVtcHR5IFN0cmluZyBpcyByZXR1cm5lZC5cbiAqIEBwYXJhbSBjb3VudCBudW1iZXIgb2YgY29waWVzIHRvIGFwcGVuZFxuICovXG5leHBvcnQgbGV0IHJlcGVhdDogKHRhcmdldDogc3RyaW5nLCBjb3VudD86IG51bWJlcikgPT4gc3RyaW5nO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VxdWVuY2Ugb2YgZWxlbWVudHMgb2Ygc2VhcmNoU3RyaW5nIGNvbnZlcnRlZCB0byBhIFN0cmluZyBpcyB0aGVcbiAqIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgdGhpcyBvYmplY3QgKGNvbnZlcnRlZCB0byBhIFN0cmluZykgc3RhcnRpbmcgYXRcbiAqIHBvc2l0aW9uLiBPdGhlcndpc2UgcmV0dXJucyBmYWxzZS5cbiAqL1xuZXhwb3J0IGxldCBzdGFydHNXaXRoOiAodGFyZ2V0OiBzdHJpbmcsIHNlYXJjaFN0cmluZzogc3RyaW5nLCBwb3NpdGlvbj86IG51bWJlcikgPT4gYm9vbGVhbjtcblxuLyogRVM3IGluc3RhbmNlIG1ldGhvZHMgKi9cblxuLyoqXG4gKiBQYWRzIHRoZSBjdXJyZW50IHN0cmluZyB3aXRoIGEgZ2l2ZW4gc3RyaW5nIChwb3NzaWJseSByZXBlYXRlZCkgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHN0cmluZyByZWFjaGVzIGEgZ2l2ZW4gbGVuZ3RoLlxuICogVGhlIHBhZGRpbmcgaXMgYXBwbGllZCBmcm9tIHRoZSBlbmQgKHJpZ2h0KSBvZiB0aGUgY3VycmVudCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHN0cmluZ1xuICogQHBhcmFtIG1heExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nIG9uY2UgdGhlIGN1cnJlbnQgc3RyaW5nIGhhcyBiZWVuIHBhZGRlZC5cbiAqICAgICAgICBJZiB0aGlzIHBhcmFtZXRlciBpcyBzbWFsbGVyIHRoYW4gdGhlIGN1cnJlbnQgc3RyaW5nJ3MgbGVuZ3RoLCB0aGUgY3VycmVudCBzdHJpbmcgd2lsbCBiZSByZXR1cm5lZCBhcyBpdCBpcy5cbiAqXG4gKiBAcGFyYW0gZmlsbFN0cmluZyBUaGUgc3RyaW5nIHRvIHBhZCB0aGUgY3VycmVudCBzdHJpbmcgd2l0aC5cbiAqICAgICAgICBJZiB0aGlzIHN0cmluZyBpcyB0b28gbG9uZywgaXQgd2lsbCBiZSB0cnVuY2F0ZWQgYW5kIHRoZSBsZWZ0LW1vc3QgcGFydCB3aWxsIGJlIGFwcGxpZWQuXG4gKiAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlzIFwiIFwiIChVKzAwMjApLlxuICovXG5leHBvcnQgbGV0IHBhZEVuZDogKHRhcmdldDogc3RyaW5nLCBtYXhMZW5ndGg6IG51bWJlciwgZmlsbFN0cmluZz86IHN0cmluZykgPT4gc3RyaW5nO1xuXG4vKipcbiAqIFBhZHMgdGhlIGN1cnJlbnQgc3RyaW5nIHdpdGggYSBnaXZlbiBzdHJpbmcgKHBvc3NpYmx5IHJlcGVhdGVkKSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgc3RyaW5nIHJlYWNoZXMgYSBnaXZlbiBsZW5ndGguXG4gKiBUaGUgcGFkZGluZyBpcyBhcHBsaWVkIGZyb20gdGhlIHN0YXJ0IChsZWZ0KSBvZiB0aGUgY3VycmVudCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHN0cmluZ1xuICogQHBhcmFtIG1heExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nIG9uY2UgdGhlIGN1cnJlbnQgc3RyaW5nIGhhcyBiZWVuIHBhZGRlZC5cbiAqICAgICAgICBJZiB0aGlzIHBhcmFtZXRlciBpcyBzbWFsbGVyIHRoYW4gdGhlIGN1cnJlbnQgc3RyaW5nJ3MgbGVuZ3RoLCB0aGUgY3VycmVudCBzdHJpbmcgd2lsbCBiZSByZXR1cm5lZCBhcyBpdCBpcy5cbiAqXG4gKiBAcGFyYW0gZmlsbFN0cmluZyBUaGUgc3RyaW5nIHRvIHBhZCB0aGUgY3VycmVudCBzdHJpbmcgd2l0aC5cbiAqICAgICAgICBJZiB0aGlzIHN0cmluZyBpcyB0b28gbG9uZywgaXQgd2lsbCBiZSB0cnVuY2F0ZWQgYW5kIHRoZSBsZWZ0LW1vc3QgcGFydCB3aWxsIGJlIGFwcGxpZWQuXG4gKiAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlzIFwiIFwiIChVKzAwMjApLlxuICovXG5leHBvcnQgbGV0IHBhZFN0YXJ0OiAodGFyZ2V0OiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyLCBmaWxsU3RyaW5nPzogc3RyaW5nKSA9PiBzdHJpbmc7XG5cbmlmIChoYXMoJ2VzNi1zdHJpbmcnKSAmJiBoYXMoJ2VzNi1zdHJpbmctcmF3JykpIHtcblx0ZnJvbUNvZGVQb2ludCA9IGdsb2JhbC5TdHJpbmcuZnJvbUNvZGVQb2ludDtcblx0cmF3ID0gZ2xvYmFsLlN0cmluZy5yYXc7XG5cblx0Y29kZVBvaW50QXQgPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0KTtcblx0ZW5kc1dpdGggPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoKTtcblx0aW5jbHVkZXMgPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzKTtcblx0bm9ybWFsaXplID0gd3JhcE5hdGl2ZShnbG9iYWwuU3RyaW5nLnByb3RvdHlwZS5ub3JtYWxpemUpO1xuXHRyZXBlYXQgPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLnJlcGVhdCk7XG5cdHN0YXJ0c1dpdGggPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGgpO1xufSBlbHNlIHtcblx0LyoqXG5cdCAqIFZhbGlkYXRlcyB0aGF0IHRleHQgaXMgZGVmaW5lZCwgYW5kIG5vcm1hbGl6ZXMgcG9zaXRpb24gKGJhc2VkIG9uIHRoZSBnaXZlbiBkZWZhdWx0IGlmIHRoZSBpbnB1dCBpcyBOYU4pLlxuXHQgKiBVc2VkIGJ5IHN0YXJ0c1dpdGgsIGluY2x1ZGVzLCBhbmQgZW5kc1dpdGguXG5cdCAqXG5cdCAqIEByZXR1cm4gTm9ybWFsaXplZCBwb3NpdGlvbi5cblx0ICovXG5cdGNvbnN0IG5vcm1hbGl6ZVN1YnN0cmluZ0FyZ3MgPSBmdW5jdGlvbihcblx0XHRuYW1lOiBzdHJpbmcsXG5cdFx0dGV4dDogc3RyaW5nLFxuXHRcdHNlYXJjaDogc3RyaW5nLFxuXHRcdHBvc2l0aW9uOiBudW1iZXIsXG5cdFx0aXNFbmQ6IGJvb2xlYW4gPSBmYWxzZVxuXHQpOiBbc3RyaW5nLCBzdHJpbmcsIG51bWJlcl0ge1xuXHRcdGlmICh0ZXh0ID09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmluZy4nICsgbmFtZSArICcgcmVxdWlyZXMgYSB2YWxpZCBzdHJpbmcgdG8gc2VhcmNoIGFnYWluc3QuJyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbGVuZ3RoID0gdGV4dC5sZW5ndGg7XG5cdFx0cG9zaXRpb24gPSBwb3NpdGlvbiAhPT0gcG9zaXRpb24gPyAoaXNFbmQgPyBsZW5ndGggOiAwKSA6IHBvc2l0aW9uO1xuXHRcdHJldHVybiBbdGV4dCwgU3RyaW5nKHNlYXJjaCksIE1hdGgubWluKE1hdGgubWF4KHBvc2l0aW9uLCAwKSwgbGVuZ3RoKV07XG5cdH07XG5cblx0ZnJvbUNvZGVQb2ludCA9IGZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoLi4uY29kZVBvaW50czogbnVtYmVyW10pOiBzdHJpbmcge1xuXHRcdC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcuZnJvbUNvZGVQb2ludFxuXHRcdGNvbnN0IGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cdFx0aWYgKCFsZW5ndGgpIHtcblx0XHRcdHJldHVybiAnJztcblx0XHR9XG5cblx0XHRjb25zdCBmcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xuXHRcdGNvbnN0IE1BWF9TSVpFID0gMHg0MDAwO1xuXHRcdGxldCBjb2RlVW5pdHM6IG51bWJlcltdID0gW107XG5cdFx0bGV0IGluZGV4ID0gLTE7XG5cdFx0bGV0IHJlc3VsdCA9ICcnO1xuXG5cdFx0d2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcblx0XHRcdGxldCBjb2RlUG9pbnQgPSBOdW1iZXIoYXJndW1lbnRzW2luZGV4XSk7XG5cblx0XHRcdC8vIENvZGUgcG9pbnRzIG11c3QgYmUgZmluaXRlIGludGVnZXJzIHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2Vcblx0XHRcdGxldCBpc1ZhbGlkID1cblx0XHRcdFx0aXNGaW5pdGUoY29kZVBvaW50KSAmJiBNYXRoLmZsb29yKGNvZGVQb2ludCkgPT09IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPj0gMCAmJiBjb2RlUG9pbnQgPD0gMHgxMGZmZmY7XG5cdFx0XHRpZiAoIWlzVmFsaWQpIHtcblx0XHRcdFx0dGhyb3cgUmFuZ2VFcnJvcignc3RyaW5nLmZyb21Db2RlUG9pbnQ6IEludmFsaWQgY29kZSBwb2ludCAnICsgY29kZVBvaW50KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNvZGVQb2ludCA8PSAweGZmZmYpIHtcblx0XHRcdFx0Ly8gQk1QIGNvZGUgcG9pbnRcblx0XHRcdFx0Y29kZVVuaXRzLnB1c2goY29kZVBvaW50KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEFzdHJhbCBjb2RlIHBvaW50OyBzcGxpdCBpbiBzdXJyb2dhdGUgaGFsdmVzXG5cdFx0XHRcdC8vIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nI3N1cnJvZ2F0ZS1mb3JtdWxhZVxuXHRcdFx0XHRjb2RlUG9pbnQgLT0gMHgxMDAwMDtcblx0XHRcdFx0bGV0IGhpZ2hTdXJyb2dhdGUgPSAoY29kZVBvaW50ID4+IDEwKSArIEhJR0hfU1VSUk9HQVRFX01JTjtcblx0XHRcdFx0bGV0IGxvd1N1cnJvZ2F0ZSA9IGNvZGVQb2ludCAlIDB4NDAwICsgTE9XX1NVUlJPR0FURV9NSU47XG5cdFx0XHRcdGNvZGVVbml0cy5wdXNoKGhpZ2hTdXJyb2dhdGUsIGxvd1N1cnJvZ2F0ZSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpbmRleCArIDEgPT09IGxlbmd0aCB8fCBjb2RlVW5pdHMubGVuZ3RoID4gTUFYX1NJWkUpIHtcblx0XHRcdFx0cmVzdWx0ICs9IGZyb21DaGFyQ29kZS5hcHBseShudWxsLCBjb2RlVW5pdHMpO1xuXHRcdFx0XHRjb2RlVW5pdHMubGVuZ3RoID0gMDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fTtcblxuXHRyYXcgPSBmdW5jdGlvbiByYXcoY2FsbFNpdGU6IFRlbXBsYXRlU3RyaW5nc0FycmF5LCAuLi5zdWJzdGl0dXRpb25zOiBhbnlbXSk6IHN0cmluZyB7XG5cdFx0bGV0IHJhd1N0cmluZ3MgPSBjYWxsU2l0ZS5yYXc7XG5cdFx0bGV0IHJlc3VsdCA9ICcnO1xuXHRcdGxldCBudW1TdWJzdGl0dXRpb25zID0gc3Vic3RpdHV0aW9ucy5sZW5ndGg7XG5cblx0XHRpZiAoY2FsbFNpdGUgPT0gbnVsbCB8fCBjYWxsU2l0ZS5yYXcgPT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignc3RyaW5nLnJhdyByZXF1aXJlcyBhIHZhbGlkIGNhbGxTaXRlIG9iamVjdCB3aXRoIGEgcmF3IHZhbHVlJyk7XG5cdFx0fVxuXG5cdFx0Zm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IHJhd1N0cmluZ3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0XHRcdHJlc3VsdCArPSByYXdTdHJpbmdzW2ldICsgKGkgPCBudW1TdWJzdGl0dXRpb25zICYmIGkgPCBsZW5ndGggLSAxID8gc3Vic3RpdHV0aW9uc1tpXSA6ICcnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9O1xuXG5cdGNvZGVQb2ludEF0ID0gZnVuY3Rpb24gY29kZVBvaW50QXQodGV4dDogc3RyaW5nLCBwb3NpdGlvbjogbnVtYmVyID0gMCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG5cdFx0Ly8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXRcblx0XHRpZiAodGV4dCA9PSBudWxsKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJpbmcuY29kZVBvaW50QXQgcmVxdXJpZXMgYSB2YWxpZCBzdHJpbmcuJyk7XG5cdFx0fVxuXHRcdGNvbnN0IGxlbmd0aCA9IHRleHQubGVuZ3RoO1xuXG5cdFx0aWYgKHBvc2l0aW9uICE9PSBwb3NpdGlvbikge1xuXHRcdFx0cG9zaXRpb24gPSAwO1xuXHRcdH1cblx0XHRpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID49IGxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBHZXQgdGhlIGZpcnN0IGNvZGUgdW5pdFxuXHRcdGNvbnN0IGZpcnN0ID0gdGV4dC5jaGFyQ29kZUF0KHBvc2l0aW9uKTtcblx0XHRpZiAoZmlyc3QgPj0gSElHSF9TVVJST0dBVEVfTUlOICYmIGZpcnN0IDw9IEhJR0hfU1VSUk9HQVRFX01BWCAmJiBsZW5ndGggPiBwb3NpdGlvbiArIDEpIHtcblx0XHRcdC8vIFN0YXJ0IG9mIGEgc3Vycm9nYXRlIHBhaXIgKGhpZ2ggc3Vycm9nYXRlIGFuZCB0aGVyZSBpcyBhIG5leHQgY29kZSB1bml0KTsgY2hlY2sgZm9yIGxvdyBzdXJyb2dhdGVcblx0XHRcdC8vIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nI3N1cnJvZ2F0ZS1mb3JtdWxhZVxuXHRcdFx0Y29uc3Qgc2Vjb25kID0gdGV4dC5jaGFyQ29kZUF0KHBvc2l0aW9uICsgMSk7XG5cdFx0XHRpZiAoc2Vjb25kID49IExPV19TVVJST0dBVEVfTUlOICYmIHNlY29uZCA8PSBMT1dfU1VSUk9HQVRFX01BWCkge1xuXHRcdFx0XHRyZXR1cm4gKGZpcnN0IC0gSElHSF9TVVJST0dBVEVfTUlOKSAqIDB4NDAwICsgc2Vjb25kIC0gTE9XX1NVUlJPR0FURV9NSU4gKyAweDEwMDAwO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmlyc3Q7XG5cdH07XG5cblx0ZW5kc1dpdGggPSBmdW5jdGlvbiBlbmRzV2l0aCh0ZXh0OiBzdHJpbmcsIHNlYXJjaDogc3RyaW5nLCBlbmRQb3NpdGlvbj86IG51bWJlcik6IGJvb2xlYW4ge1xuXHRcdGlmIChlbmRQb3NpdGlvbiA9PSBudWxsKSB7XG5cdFx0XHRlbmRQb3NpdGlvbiA9IHRleHQubGVuZ3RoO1xuXHRcdH1cblxuXHRcdFt0ZXh0LCBzZWFyY2gsIGVuZFBvc2l0aW9uXSA9IG5vcm1hbGl6ZVN1YnN0cmluZ0FyZ3MoJ2VuZHNXaXRoJywgdGV4dCwgc2VhcmNoLCBlbmRQb3NpdGlvbiwgdHJ1ZSk7XG5cblx0XHRjb25zdCBzdGFydCA9IGVuZFBvc2l0aW9uIC0gc2VhcmNoLmxlbmd0aDtcblx0XHRpZiAoc3RhcnQgPCAwKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRleHQuc2xpY2Uoc3RhcnQsIGVuZFBvc2l0aW9uKSA9PT0gc2VhcmNoO1xuXHR9O1xuXG5cdGluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXModGV4dDogc3RyaW5nLCBzZWFyY2g6IHN0cmluZywgcG9zaXRpb246IG51bWJlciA9IDApOiBib29sZWFuIHtcblx0XHRbdGV4dCwgc2VhcmNoLCBwb3NpdGlvbl0gPSBub3JtYWxpemVTdWJzdHJpbmdBcmdzKCdpbmNsdWRlcycsIHRleHQsIHNlYXJjaCwgcG9zaXRpb24pO1xuXHRcdHJldHVybiB0ZXh0LmluZGV4T2Yoc2VhcmNoLCBwb3NpdGlvbikgIT09IC0xO1xuXHR9O1xuXG5cdHJlcGVhdCA9IGZ1bmN0aW9uIHJlcGVhdCh0ZXh0OiBzdHJpbmcsIGNvdW50OiBudW1iZXIgPSAwKTogc3RyaW5nIHtcblx0XHQvLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL21hdGhpYXNieW5lbnMvU3RyaW5nLnByb3RvdHlwZS5yZXBlYXRcblx0XHRpZiAodGV4dCA9PSBudWxsKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJpbmcucmVwZWF0IHJlcXVpcmVzIGEgdmFsaWQgc3RyaW5nLicpO1xuXHRcdH1cblx0XHRpZiAoY291bnQgIT09IGNvdW50KSB7XG5cdFx0XHRjb3VudCA9IDA7XG5cdFx0fVxuXHRcdGlmIChjb3VudCA8IDAgfHwgY291bnQgPT09IEluZmluaXR5KSB7XG5cdFx0XHR0aHJvdyBuZXcgUmFuZ2VFcnJvcignc3RyaW5nLnJlcGVhdCByZXF1aXJlcyBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgY291bnQuJyk7XG5cdFx0fVxuXG5cdFx0bGV0IHJlc3VsdCA9ICcnO1xuXHRcdHdoaWxlIChjb3VudCkge1xuXHRcdFx0aWYgKGNvdW50ICUgMikge1xuXHRcdFx0XHRyZXN1bHQgKz0gdGV4dDtcblx0XHRcdH1cblx0XHRcdGlmIChjb3VudCA+IDEpIHtcblx0XHRcdFx0dGV4dCArPSB0ZXh0O1xuXHRcdFx0fVxuXHRcdFx0Y291bnQgPj49IDE7XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cblx0c3RhcnRzV2l0aCA9IGZ1bmN0aW9uIHN0YXJ0c1dpdGgodGV4dDogc3RyaW5nLCBzZWFyY2g6IHN0cmluZywgcG9zaXRpb246IG51bWJlciA9IDApOiBib29sZWFuIHtcblx0XHRzZWFyY2ggPSBTdHJpbmcoc2VhcmNoKTtcblx0XHRbdGV4dCwgc2VhcmNoLCBwb3NpdGlvbl0gPSBub3JtYWxpemVTdWJzdHJpbmdBcmdzKCdzdGFydHNXaXRoJywgdGV4dCwgc2VhcmNoLCBwb3NpdGlvbik7XG5cblx0XHRjb25zdCBlbmQgPSBwb3NpdGlvbiArIHNlYXJjaC5sZW5ndGg7XG5cdFx0aWYgKGVuZCA+IHRleHQubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRleHQuc2xpY2UocG9zaXRpb24sIGVuZCkgPT09IHNlYXJjaDtcblx0fTtcbn1cblxuaWYgKGhhcygnZXMyMDE3LXN0cmluZycpKSB7XG5cdHBhZEVuZCA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUucGFkRW5kKTtcblx0cGFkU3RhcnQgPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLnBhZFN0YXJ0KTtcbn0gZWxzZSB7XG5cdHBhZEVuZCA9IGZ1bmN0aW9uIHBhZEVuZCh0ZXh0OiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyLCBmaWxsU3RyaW5nOiBzdHJpbmcgPSAnICcpOiBzdHJpbmcge1xuXHRcdGlmICh0ZXh0ID09PSBudWxsIHx8IHRleHQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignc3RyaW5nLnJlcGVhdCByZXF1aXJlcyBhIHZhbGlkIHN0cmluZy4nKTtcblx0XHR9XG5cblx0XHRpZiAobWF4TGVuZ3RoID09PSBJbmZpbml0eSkge1xuXHRcdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3N0cmluZy5wYWRFbmQgcmVxdWlyZXMgYSBub24tbmVnYXRpdmUgZmluaXRlIGNvdW50LicpO1xuXHRcdH1cblxuXHRcdGlmIChtYXhMZW5ndGggPT09IG51bGwgfHwgbWF4TGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbWF4TGVuZ3RoIDwgMCkge1xuXHRcdFx0bWF4TGVuZ3RoID0gMDtcblx0XHR9XG5cblx0XHRsZXQgc3RyVGV4dCA9IFN0cmluZyh0ZXh0KTtcblx0XHRjb25zdCBwYWRkaW5nID0gbWF4TGVuZ3RoIC0gc3RyVGV4dC5sZW5ndGg7XG5cblx0XHRpZiAocGFkZGluZyA+IDApIHtcblx0XHRcdHN0clRleHQgKz1cblx0XHRcdFx0cmVwZWF0KGZpbGxTdHJpbmcsIE1hdGguZmxvb3IocGFkZGluZyAvIGZpbGxTdHJpbmcubGVuZ3RoKSkgK1xuXHRcdFx0XHRmaWxsU3RyaW5nLnNsaWNlKDAsIHBhZGRpbmcgJSBmaWxsU3RyaW5nLmxlbmd0aCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHN0clRleHQ7XG5cdH07XG5cblx0cGFkU3RhcnQgPSBmdW5jdGlvbiBwYWRTdGFydCh0ZXh0OiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyLCBmaWxsU3RyaW5nOiBzdHJpbmcgPSAnICcpOiBzdHJpbmcge1xuXHRcdGlmICh0ZXh0ID09PSBudWxsIHx8IHRleHQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignc3RyaW5nLnJlcGVhdCByZXF1aXJlcyBhIHZhbGlkIHN0cmluZy4nKTtcblx0XHR9XG5cblx0XHRpZiAobWF4TGVuZ3RoID09PSBJbmZpbml0eSkge1xuXHRcdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3N0cmluZy5wYWRTdGFydCByZXF1aXJlcyBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgY291bnQuJyk7XG5cdFx0fVxuXG5cdFx0aWYgKG1heExlbmd0aCA9PT0gbnVsbCB8fCBtYXhMZW5ndGggPT09IHVuZGVmaW5lZCB8fCBtYXhMZW5ndGggPCAwKSB7XG5cdFx0XHRtYXhMZW5ndGggPSAwO1xuXHRcdH1cblxuXHRcdGxldCBzdHJUZXh0ID0gU3RyaW5nKHRleHQpO1xuXHRcdGNvbnN0IHBhZGRpbmcgPSBtYXhMZW5ndGggLSBzdHJUZXh0Lmxlbmd0aDtcblxuXHRcdGlmIChwYWRkaW5nID4gMCkge1xuXHRcdFx0c3RyVGV4dCA9XG5cdFx0XHRcdHJlcGVhdChmaWxsU3RyaW5nLCBNYXRoLmZsb29yKHBhZGRpbmcgLyBmaWxsU3RyaW5nLmxlbmd0aCkpICtcblx0XHRcdFx0ZmlsbFN0cmluZy5zbGljZSgwLCBwYWRkaW5nICUgZmlsbFN0cmluZy5sZW5ndGgpICtcblx0XHRcdFx0c3RyVGV4dDtcblx0XHR9XG5cblx0XHRyZXR1cm4gc3RyVGV4dDtcblx0fTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBzdHJpbmcudHMiLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4uL2dsb2JhbCc7XG5pbXBvcnQgaGFzIGZyb20gJy4vaGFzJztcbmltcG9ydCB7IEhhbmRsZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuXG5mdW5jdGlvbiBleGVjdXRlVGFzayhpdGVtOiBRdWV1ZUl0ZW0gfCB1bmRlZmluZWQpOiB2b2lkIHtcblx0aWYgKGl0ZW0gJiYgaXRlbS5pc0FjdGl2ZSAmJiBpdGVtLmNhbGxiYWNrKSB7XG5cdFx0aXRlbS5jYWxsYmFjaygpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldFF1ZXVlSGFuZGxlKGl0ZW06IFF1ZXVlSXRlbSwgZGVzdHJ1Y3Rvcj86ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55KTogSGFuZGxlIHtcblx0cmV0dXJuIHtcblx0XHRkZXN0cm95OiBmdW5jdGlvbih0aGlzOiBIYW5kbGUpIHtcblx0XHRcdHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uKCkge307XG5cdFx0XHRpdGVtLmlzQWN0aXZlID0gZmFsc2U7XG5cdFx0XHRpdGVtLmNhbGxiYWNrID0gbnVsbDtcblxuXHRcdFx0aWYgKGRlc3RydWN0b3IpIHtcblx0XHRcdFx0ZGVzdHJ1Y3RvcigpO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuaW50ZXJmYWNlIFBvc3RNZXNzYWdlRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG5cdHNvdXJjZTogYW55O1xuXHRkYXRhOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVldWVJdGVtIHtcblx0aXNBY3RpdmU6IGJvb2xlYW47XG5cdGNhbGxiYWNrOiBudWxsIHwgKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KTtcbn1cblxubGV0IGNoZWNrTWljcm9UYXNrUXVldWU6ICgpID0+IHZvaWQ7XG5sZXQgbWljcm9UYXNrczogUXVldWVJdGVtW107XG5cbi8qKlxuICogU2NoZWR1bGVzIGEgY2FsbGJhY2sgdG8gdGhlIG1hY3JvdGFzayBxdWV1ZS5cbiAqXG4gKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGJlIHF1ZXVlZCBhbmQgbGF0ZXIgZXhlY3V0ZWQuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBhIGBkZXN0cm95YCBtZXRob2QgdGhhdCwgd2hlbiBjYWxsZWQsIHByZXZlbnRzIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZyb20gZXhlY3V0aW5nLlxuICovXG5leHBvcnQgY29uc3QgcXVldWVUYXNrID0gKGZ1bmN0aW9uKCkge1xuXHRsZXQgZGVzdHJ1Y3RvcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk7XG5cdGxldCBlbnF1ZXVlOiAoaXRlbTogUXVldWVJdGVtKSA9PiB2b2lkO1xuXG5cdC8vIFNpbmNlIHRoZSBJRSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0SW1tZWRpYXRlYCBpcyBub3QgZmxhd2xlc3MsIHdlIHdpbGwgdGVzdCBmb3IgYHBvc3RNZXNzYWdlYCBmaXJzdC5cblx0aWYgKGhhcygncG9zdG1lc3NhZ2UnKSkge1xuXHRcdGNvbnN0IHF1ZXVlOiBRdWV1ZUl0ZW1bXSA9IFtdO1xuXG5cdFx0Z2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbihldmVudDogUG9zdE1lc3NhZ2VFdmVudCk6IHZvaWQge1xuXHRcdFx0Ly8gQ29uZmlybSB0aGF0IHRoZSBldmVudCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSBjdXJyZW50IHdpbmRvdyBhbmQgYnkgdGhpcyBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uLlxuXHRcdFx0aWYgKGV2ZW50LnNvdXJjZSA9PT0gZ2xvYmFsICYmIGV2ZW50LmRhdGEgPT09ICdkb2pvLXF1ZXVlLW1lc3NhZ2UnKSB7XG5cdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0XHRcdGlmIChxdWV1ZS5sZW5ndGgpIHtcblx0XHRcdFx0XHRleGVjdXRlVGFzayhxdWV1ZS5zaGlmdCgpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0ZW5xdWV1ZSA9IGZ1bmN0aW9uKGl0ZW06IFF1ZXVlSXRlbSk6IHZvaWQge1xuXHRcdFx0cXVldWUucHVzaChpdGVtKTtcblx0XHRcdGdsb2JhbC5wb3N0TWVzc2FnZSgnZG9qby1xdWV1ZS1tZXNzYWdlJywgJyonKTtcblx0XHR9O1xuXHR9IGVsc2UgaWYgKGhhcygnc2V0aW1tZWRpYXRlJykpIHtcblx0XHRkZXN0cnVjdG9yID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlO1xuXHRcdGVucXVldWUgPSBmdW5jdGlvbihpdGVtOiBRdWV1ZUl0ZW0pOiBhbnkge1xuXHRcdFx0cmV0dXJuIHNldEltbWVkaWF0ZShleGVjdXRlVGFzay5iaW5kKG51bGwsIGl0ZW0pKTtcblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdGRlc3RydWN0b3IgPSBnbG9iYWwuY2xlYXJUaW1lb3V0O1xuXHRcdGVucXVldWUgPSBmdW5jdGlvbihpdGVtOiBRdWV1ZUl0ZW0pOiBhbnkge1xuXHRcdFx0cmV0dXJuIHNldFRpbWVvdXQoZXhlY3V0ZVRhc2suYmluZChudWxsLCBpdGVtKSwgMCk7XG5cdFx0fTtcblx0fVxuXG5cdGZ1bmN0aW9uIHF1ZXVlVGFzayhjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpOiBIYW5kbGUge1xuXHRcdGNvbnN0IGl0ZW06IFF1ZXVlSXRlbSA9IHtcblx0XHRcdGlzQWN0aXZlOiB0cnVlLFxuXHRcdFx0Y2FsbGJhY2s6IGNhbGxiYWNrXG5cdFx0fTtcblx0XHRjb25zdCBpZDogYW55ID0gZW5xdWV1ZShpdGVtKTtcblxuXHRcdHJldHVybiBnZXRRdWV1ZUhhbmRsZShcblx0XHRcdGl0ZW0sXG5cdFx0XHRkZXN0cnVjdG9yICYmXG5cdFx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGRlc3RydWN0b3IoaWQpO1xuXHRcdFx0XHR9XG5cdFx0KTtcblx0fVxuXG5cdC8vIFRPRE86IFVzZSBhc3BlY3QuYmVmb3JlIHdoZW4gaXQgaXMgYXZhaWxhYmxlLlxuXHRyZXR1cm4gaGFzKCdtaWNyb3Rhc2tzJylcblx0XHQ/IHF1ZXVlVGFza1xuXHRcdDogZnVuY3Rpb24oY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55KTogSGFuZGxlIHtcblx0XHRcdFx0Y2hlY2tNaWNyb1Rhc2tRdWV1ZSgpO1xuXHRcdFx0XHRyZXR1cm4gcXVldWVUYXNrKGNhbGxiYWNrKTtcblx0XHRcdH07XG59KSgpO1xuXG4vLyBXaGVuIG5vIG1lY2hhbmlzbSBmb3IgcmVnaXN0ZXJpbmcgbWljcm90YXNrcyBpcyBleHBvc2VkIGJ5IHRoZSBlbnZpcm9ubWVudCwgbWljcm90YXNrcyB3aWxsXG4vLyBiZSBxdWV1ZWQgYW5kIHRoZW4gZXhlY3V0ZWQgaW4gYSBzaW5nbGUgbWFjcm90YXNrIGJlZm9yZSB0aGUgb3RoZXIgbWFjcm90YXNrcyBhcmUgZXhlY3V0ZWQuXG5pZiAoIWhhcygnbWljcm90YXNrcycpKSB7XG5cdGxldCBpc01pY3JvVGFza1F1ZXVlZCA9IGZhbHNlO1xuXG5cdG1pY3JvVGFza3MgPSBbXTtcblx0Y2hlY2tNaWNyb1Rhc2tRdWV1ZSA9IGZ1bmN0aW9uKCk6IHZvaWQge1xuXHRcdGlmICghaXNNaWNyb1Rhc2tRdWV1ZWQpIHtcblx0XHRcdGlzTWljcm9UYXNrUXVldWVkID0gdHJ1ZTtcblx0XHRcdHF1ZXVlVGFzayhmdW5jdGlvbigpIHtcblx0XHRcdFx0aXNNaWNyb1Rhc2tRdWV1ZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRpZiAobWljcm9UYXNrcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRsZXQgaXRlbTogUXVldWVJdGVtIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRcdHdoaWxlICgoaXRlbSA9IG1pY3JvVGFza3Muc2hpZnQoKSkpIHtcblx0XHRcdFx0XHRcdGV4ZWN1dGVUYXNrKGl0ZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9O1xufVxuXG4vKipcbiAqIFNjaGVkdWxlcyBhbiBhbmltYXRpb24gdGFzayB3aXRoIGB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lYCBpZiBpdCBleGlzdHMsIG9yIHdpdGggYHF1ZXVlVGFza2Agb3RoZXJ3aXNlLlxuICpcbiAqIFNpbmNlIHJlcXVlc3RBbmltYXRpb25GcmFtZSdzIGJlaGF2aW9yIGRvZXMgbm90IG1hdGNoIHRoYXQgZXhwZWN0ZWQgZnJvbSBgcXVldWVUYXNrYCwgaXQgaXMgbm90IHVzZWQgdGhlcmUuXG4gKiBIb3dldmVyLCBhdCB0aW1lcyBpdCBtYWtlcyBtb3JlIHNlbnNlIHRvIGRlbGVnYXRlIHRvIHJlcXVlc3RBbmltYXRpb25GcmFtZTsgaGVuY2UgdGhlIGZvbGxvd2luZyBtZXRob2QuXG4gKlxuICogQHBhcmFtIGNhbGxiYWNrIHRoZSBmdW5jdGlvbiB0byBiZSBxdWV1ZWQgYW5kIGxhdGVyIGV4ZWN1dGVkLlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggYSBgZGVzdHJveWAgbWV0aG9kIHRoYXQsIHdoZW4gY2FsbGVkLCBwcmV2ZW50cyB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmcm9tIGV4ZWN1dGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IHF1ZXVlQW5pbWF0aW9uVGFzayA9IChmdW5jdGlvbigpIHtcblx0aWYgKCFoYXMoJ3JhZicpKSB7XG5cdFx0cmV0dXJuIHF1ZXVlVGFzaztcblx0fVxuXG5cdGZ1bmN0aW9uIHF1ZXVlQW5pbWF0aW9uVGFzayhjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpOiBIYW5kbGUge1xuXHRcdGNvbnN0IGl0ZW06IFF1ZXVlSXRlbSA9IHtcblx0XHRcdGlzQWN0aXZlOiB0cnVlLFxuXHRcdFx0Y2FsbGJhY2s6IGNhbGxiYWNrXG5cdFx0fTtcblx0XHRjb25zdCByYWZJZDogbnVtYmVyID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGV4ZWN1dGVUYXNrLmJpbmQobnVsbCwgaXRlbSkpO1xuXG5cdFx0cmV0dXJuIGdldFF1ZXVlSGFuZGxlKGl0ZW0sIGZ1bmN0aW9uKCkge1xuXHRcdFx0Y2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpO1xuXHRcdH0pO1xuXHR9XG5cblx0Ly8gVE9ETzogVXNlIGFzcGVjdC5iZWZvcmUgd2hlbiBpdCBpcyBhdmFpbGFibGUuXG5cdHJldHVybiBoYXMoJ21pY3JvdGFza3MnKVxuXHRcdD8gcXVldWVBbmltYXRpb25UYXNrXG5cdFx0OiBmdW5jdGlvbihjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpOiBIYW5kbGUge1xuXHRcdFx0XHRjaGVja01pY3JvVGFza1F1ZXVlKCk7XG5cdFx0XHRcdHJldHVybiBxdWV1ZUFuaW1hdGlvblRhc2soY2FsbGJhY2spO1xuXHRcdFx0fTtcbn0pKCk7XG5cbi8qKlxuICogU2NoZWR1bGVzIGEgY2FsbGJhY2sgdG8gdGhlIG1pY3JvdGFzayBxdWV1ZS5cbiAqXG4gKiBBbnkgY2FsbGJhY2tzIHJlZ2lzdGVyZWQgd2l0aCBgcXVldWVNaWNyb1Rhc2tgIHdpbGwgYmUgZXhlY3V0ZWQgYmVmb3JlIHRoZSBuZXh0IG1hY3JvdGFzay4gSWYgbm8gbmF0aXZlXG4gKiBtZWNoYW5pc20gZm9yIHNjaGVkdWxpbmcgbWFjcm90YXNrcyBpcyBleHBvc2VkLCB0aGVuIGFueSBjYWxsYmFja3Mgd2lsbCBiZSBmaXJlZCBiZWZvcmUgYW55IG1hY3JvdGFza1xuICogcmVnaXN0ZXJlZCB3aXRoIGBxdWV1ZVRhc2tgIG9yIGBxdWV1ZUFuaW1hdGlvblRhc2tgLlxuICpcbiAqIEBwYXJhbSBjYWxsYmFjayB0aGUgZnVuY3Rpb24gdG8gYmUgcXVldWVkIGFuZCBsYXRlciBleGVjdXRlZC5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIGEgYGRlc3Ryb3lgIG1ldGhvZCB0aGF0LCB3aGVuIGNhbGxlZCwgcHJldmVudHMgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnJvbSBleGVjdXRpbmcuXG4gKi9cbmV4cG9ydCBsZXQgcXVldWVNaWNyb1Rhc2sgPSAoZnVuY3Rpb24oKSB7XG5cdGxldCBlbnF1ZXVlOiAoaXRlbTogUXVldWVJdGVtKSA9PiB2b2lkO1xuXG5cdGlmIChoYXMoJ2hvc3Qtbm9kZScpKSB7XG5cdFx0ZW5xdWV1ZSA9IGZ1bmN0aW9uKGl0ZW06IFF1ZXVlSXRlbSk6IHZvaWQge1xuXHRcdFx0Z2xvYmFsLnByb2Nlc3MubmV4dFRpY2soZXhlY3V0ZVRhc2suYmluZChudWxsLCBpdGVtKSk7XG5cdFx0fTtcblx0fSBlbHNlIGlmIChoYXMoJ2VzNi1wcm9taXNlJykpIHtcblx0XHRlbnF1ZXVlID0gZnVuY3Rpb24oaXRlbTogUXVldWVJdGVtKTogdm9pZCB7XG5cdFx0XHRnbG9iYWwuUHJvbWlzZS5yZXNvbHZlKGl0ZW0pLnRoZW4oZXhlY3V0ZVRhc2spO1xuXHRcdH07XG5cdH0gZWxzZSBpZiAoaGFzKCdkb20tbXV0YXRpb25vYnNlcnZlcicpKSB7XG5cdFx0LyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWUgKi9cblx0XHRjb25zdCBIb3N0TXV0YXRpb25PYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xuXHRcdGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRjb25zdCBxdWV1ZTogUXVldWVJdGVtW10gPSBbXTtcblx0XHRjb25zdCBvYnNlcnZlciA9IG5ldyBIb3N0TXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbigpOiB2b2lkIHtcblx0XHRcdHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNvbnN0IGl0ZW0gPSBxdWV1ZS5zaGlmdCgpO1xuXHRcdFx0XHRpZiAoaXRlbSAmJiBpdGVtLmlzQWN0aXZlICYmIGl0ZW0uY2FsbGJhY2spIHtcblx0XHRcdFx0XHRpdGVtLmNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdG9ic2VydmVyLm9ic2VydmUobm9kZSwgeyBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuXG5cdFx0ZW5xdWV1ZSA9IGZ1bmN0aW9uKGl0ZW06IFF1ZXVlSXRlbSk6IHZvaWQge1xuXHRcdFx0cXVldWUucHVzaChpdGVtKTtcblx0XHRcdG5vZGUuc2V0QXR0cmlidXRlKCdxdWV1ZVN0YXR1cycsICcxJyk7XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRlbnF1ZXVlID0gZnVuY3Rpb24oaXRlbTogUXVldWVJdGVtKTogdm9pZCB7XG5cdFx0XHRjaGVja01pY3JvVGFza1F1ZXVlKCk7XG5cdFx0XHRtaWNyb1Rhc2tzLnB1c2goaXRlbSk7XG5cdFx0fTtcblx0fVxuXG5cdHJldHVybiBmdW5jdGlvbihjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpOiBIYW5kbGUge1xuXHRcdGNvbnN0IGl0ZW06IFF1ZXVlSXRlbSA9IHtcblx0XHRcdGlzQWN0aXZlOiB0cnVlLFxuXHRcdFx0Y2FsbGJhY2s6IGNhbGxiYWNrXG5cdFx0fTtcblxuXHRcdGVucXVldWUoaXRlbSk7XG5cblx0XHRyZXR1cm4gZ2V0UXVldWVIYW5kbGUoaXRlbSk7XG5cdH07XG59KSgpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHF1ZXVlLnRzIiwiLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgYSB2YWx1ZSBwcm9wZXJ0eSBkZXNjcmlwdG9yXG4gKlxuICogQHBhcmFtIHZhbHVlICAgICAgICBUaGUgdmFsdWUgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3Igc2hvdWxkIGJlIHNldCB0b1xuICogQHBhcmFtIGVudW1lcmFibGUgICBJZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGVudW1iZXJhYmxlLCBkZWZhdWx0cyB0byBmYWxzZVxuICogQHBhcmFtIHdyaXRhYmxlICAgICBJZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIHdyaXRhYmxlLCBkZWZhdWx0cyB0byB0cnVlXG4gKiBAcGFyYW0gY29uZmlndXJhYmxlIElmIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uZmlndXJhYmxlLCBkZWZhdWx0cyB0byB0cnVlXG4gKiBAcmV0dXJuICAgICAgICAgICAgIFRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVEZXNjcmlwdG9yPFQ+KFxuXHR2YWx1ZTogVCxcblx0ZW51bWVyYWJsZTogYm9vbGVhbiA9IGZhbHNlLFxuXHR3cml0YWJsZTogYm9vbGVhbiA9IHRydWUsXG5cdGNvbmZpZ3VyYWJsZTogYm9vbGVhbiA9IHRydWVcbik6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPFQ+IHtcblx0cmV0dXJuIHtcblx0XHR2YWx1ZTogdmFsdWUsXG5cdFx0ZW51bWVyYWJsZTogZW51bWVyYWJsZSxcblx0XHR3cml0YWJsZTogd3JpdGFibGUsXG5cdFx0Y29uZmlndXJhYmxlOiBjb25maWd1cmFibGVcblx0fTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciBmdW5jdGlvbiB3aGljaCB3cmFwcyBhIGZ1bmN0aW9uIHdoZXJlIHRoZSBmaXJzdCBhcmd1bWVudCBiZWNvbWVzIHRoZSBzY29wZVxuICogb2YgdGhlIGNhbGxcbiAqXG4gKiBAcGFyYW0gbmF0aXZlRnVuY3Rpb24gVGhlIHNvdXJjZSBmdW5jdGlvbiB0byBiZSB3cmFwcGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwTmF0aXZlPFQsIFUsIFI+KG5hdGl2ZUZ1bmN0aW9uOiAoYXJnMTogVSkgPT4gUik6ICh0YXJnZXQ6IFQsIGFyZzE6IFUpID0+IFI7XG5leHBvcnQgZnVuY3Rpb24gd3JhcE5hdGl2ZTxULCBVLCBWLCBSPihuYXRpdmVGdW5jdGlvbjogKGFyZzE6IFUsIGFyZzI6IFYpID0+IFIpOiAodGFyZ2V0OiBULCBhcmcxOiBVLCBhcmcyOiBWKSA9PiBSO1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBOYXRpdmU8VCwgVSwgViwgVywgUj4oXG5cdG5hdGl2ZUZ1bmN0aW9uOiAoYXJnMTogVSwgYXJnMjogViwgYXJnMzogVykgPT4gUlxuKTogKHRhcmdldDogVCwgYXJnMTogVSwgYXJnMjogViwgYXJnMzogVykgPT4gUjtcbmV4cG9ydCBmdW5jdGlvbiB3cmFwTmF0aXZlPFQsIFUsIFYsIFcsIFgsIFI+KFxuXHRuYXRpdmVGdW5jdGlvbjogKGFyZzE6IFUsIGFyZzI6IFYsIGFyZzM6IFcpID0+IFJcbik6ICh0YXJnZXQ6IFQsIGFyZzE6IFUsIGFyZzI6IFYsIGFyZzM6IFcpID0+IFI7XG5leHBvcnQgZnVuY3Rpb24gd3JhcE5hdGl2ZTxULCBVLCBWLCBXLCBYLCBZLCBSPihcblx0bmF0aXZlRnVuY3Rpb246IChhcmcxOiBVLCBhcmcyOiBWLCBhcmczOiBXLCBhcmc0OiBZKSA9PiBSXG4pOiAodGFyZ2V0OiBULCBhcmcxOiBVLCBhcmcyOiBWLCBhcmczOiBXLCBhcmc0OiBZKSA9PiBSO1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBOYXRpdmUobmF0aXZlRnVuY3Rpb246ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55KTogKHRhcmdldDogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gYW55IHtcblx0cmV0dXJuIGZ1bmN0aW9uKHRhcmdldDogYW55LCAuLi5hcmdzOiBhbnlbXSk6IGFueSB7XG5cdFx0cmV0dXJuIG5hdGl2ZUZ1bmN0aW9uLmFwcGx5KHRhcmdldCwgYXJncyk7XG5cdH07XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gdXRpbC50cyIsImltcG9ydCBhc3NlcnRSZW5kZXIgZnJvbSAnLi9zdXBwb3J0L2Fzc2VydFJlbmRlcic7XG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICcuL3N1cHBvcnQvc2VsZWN0b3InO1xuaW1wb3J0IHsgV05vZGUsIEROb2RlLCBXaWRnZXRCYXNlSW50ZXJmYWNlLCBDb25zdHJ1Y3RvciwgVk5vZGUgfSBmcm9tICdAZG9qby93aWRnZXQtY29yZS9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFdpZGdldEJhc2UgfSBmcm9tICdAZG9qby93aWRnZXQtY29yZS9XaWRnZXRCYXNlJztcbmltcG9ydCB7IGRlY29yYXRlLCBpc1ZOb2RlLCBpc1dOb2RlIH0gZnJvbSAnQGRvam8vd2lkZ2V0LWNvcmUvZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tQ29tcGFyYXRvciB7XG5cdHNlbGVjdG9yOiBzdHJpbmc7XG5cdHByb3BlcnR5OiBzdHJpbmc7XG5cdGNvbXBhcmF0b3I6ICh2YWx1ZTogYW55KSA9PiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uYWxTZWxlY3RvciB7XG5cdChub2RlOiBWTm9kZSB8IFdOb2RlKTogdW5kZWZpbmVkIHwgRnVuY3Rpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVjb3JhdG9yUmVzdWx0PFQ+IHtcblx0aGFzRGVmZXJyZWRQcm9wZXJ0aWVzOiBib29sZWFuO1xuXHRub2RlczogVDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBlY3RlZFJlbmRlciB7XG5cdCgpOiBETm9kZSB8IEROb2RlW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwZWN0IHtcblx0KGV4cGVjdGVkUmVuZGVyRnVuYzogRXhwZWN0ZWRSZW5kZXIpOiB2b2lkO1xuXHQoZXhwZWN0ZWRSZW5kZXJGdW5jOiBFeHBlY3RlZFJlbmRlciwgYWN0dWFsUmVuZGVyRnVuYz86IEV4cGVjdGVkUmVuZGVyKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBlY3RQYXJ0aWFsIHtcblx0KHNlbGVjdG9yOiBzdHJpbmcsIGV4cGVjdGVkUmVuZGVyRnVuYzogRXhwZWN0ZWRSZW5kZXIpOiB2b2lkO1xuXHQoc2VsZWN0b3I6IHN0cmluZywgZXhwZWN0ZWRSZW5kZXJGdW5jOiBFeHBlY3RlZFJlbmRlciwgYWN0dWFsUmVuZGVyRnVuYz86IEV4cGVjdGVkUmVuZGVyKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmlnZ2VyIHtcblx0KHNlbGVjdG9yOiBzdHJpbmcsIGZ1bmN0aW9uU2VsZWN0b3I6IEZ1bmN0aW9uYWxTZWxlY3RvciwgLi4uYXJnczogYW55W10pOiBhbnk7XG5cdChzZWxlY3Rvcjogc3RyaW5nLCBmdW5jdGlvblNlbGVjdG9yOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldFJlbmRlciB7XG5cdChpbmRleD86IG51bWJlcik6IEROb2RlIHwgRE5vZGVbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIYXJuZXNzQVBJIHtcblx0ZXhwZWN0OiBFeHBlY3Q7XG5cdGV4cGVjdFBhcnRpYWw6IEV4cGVjdFBhcnRpYWw7XG5cdHRyaWdnZXI6IFRyaWdnZXI7XG5cdGdldFJlbmRlcjogR2V0UmVuZGVyO1xufVxuXG5mdW5jdGlvbiBkZWNvcmF0ZU5vZGVzKGROb2RlOiBETm9kZVtdKTogRGVjb3JhdG9yUmVzdWx0PEROb2RlW10+O1xuZnVuY3Rpb24gZGVjb3JhdGVOb2RlcyhkTm9kZTogRE5vZGUpOiBEZWNvcmF0b3JSZXN1bHQ8RE5vZGU+O1xuZnVuY3Rpb24gZGVjb3JhdGVOb2RlcyhkTm9kZTogRE5vZGUgfCBETm9kZVtdKTogRGVjb3JhdG9yUmVzdWx0PEROb2RlIHwgRE5vZGVbXT47XG5mdW5jdGlvbiBkZWNvcmF0ZU5vZGVzKGROb2RlOiBhbnkpOiBEZWNvcmF0b3JSZXN1bHQ8RE5vZGUgfCBETm9kZVtdPiB7XG5cdGxldCBoYXNEZWZlcnJlZFByb3BlcnRpZXMgPSBmYWxzZTtcblx0ZnVuY3Rpb24gYWRkUGFyZW50KHBhcmVudDogV05vZGUgfCBWTm9kZSk6IHZvaWQge1xuXHRcdChwYXJlbnQuY2hpbGRyZW4gfHwgW10pLmZvckVhY2goKGNoaWxkKSA9PiB7XG5cdFx0XHRpZiAoaXNWTm9kZShjaGlsZCkgfHwgaXNXTm9kZShjaGlsZCkpIHtcblx0XHRcdFx0KGNoaWxkIGFzIGFueSkucGFyZW50ID0gcGFyZW50O1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGlmIChpc1ZOb2RlKHBhcmVudCkgJiYgdHlwZW9mIHBhcmVudC5kZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0aGFzRGVmZXJyZWRQcm9wZXJ0aWVzID0gdHJ1ZTtcblx0XHRcdHBhcmVudC5wcm9wZXJ0aWVzID0geyAuLi5wYXJlbnQucHJvcGVydGllcywgLi4ucGFyZW50LmRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrKGZhbHNlKSB9O1xuXHRcdH1cblx0fVxuXHRjb25zdCBub2RlcyA9IGRlY29yYXRlKGROb2RlLCBhZGRQYXJlbnQsIChub2RlOiBETm9kZSk6IG5vZGUgaXMgV05vZGUgfCBWTm9kZSA9PiBpc1dOb2RlKG5vZGUpIHx8IGlzVk5vZGUobm9kZSkpO1xuXHRyZXR1cm4geyBoYXNEZWZlcnJlZFByb3BlcnRpZXMsIG5vZGVzIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXJuZXNzKFxuXHRyZW5kZXJGdW5jOiAoKSA9PiBXTm9kZTxXaWRnZXRCYXNlSW50ZXJmYWNlPixcblx0Y3VzdG9tQ29tcGFyYXRvcjogQ3VzdG9tQ29tcGFyYXRvcltdID0gW11cbik6IEhhcm5lc3NBUEkge1xuXHRsZXQgaW52YWxpZGF0ZWQgPSB0cnVlO1xuXHRsZXQgd05vZGUgPSByZW5kZXJGdW5jKCk7XG5cdGxldCB3aWRnZXQ6IFdpZGdldEJhc2U7XG5cdGNvbnN0IHJlbmRlclN0YWNrOiAoRE5vZGUgfCBETm9kZVtdKVtdID0gW107XG5cdGNvbnN0IHsgcHJvcGVydGllcywgY2hpbGRyZW4gfSA9IHdOb2RlO1xuXHRjb25zdCB3aWRnZXRDb25zdHJ1Y3RvciA9IHdOb2RlLndpZGdldENvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPFdpZGdldEJhc2U+O1xuXHRpZiAodHlwZW9mIHdpZGdldENvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0d2lkZ2V0ID0gbmV3IGNsYXNzIGV4dGVuZHMgd2lkZ2V0Q29uc3RydWN0b3Ige1xuXHRcdFx0aW52YWxpZGF0ZSgpIHtcblx0XHRcdFx0aW52YWxpZGF0ZWQgPSB0cnVlO1xuXHRcdFx0XHRzdXBlci5pbnZhbGlkYXRlKCk7XG5cdFx0XHR9XG5cdFx0fSgpO1xuXHRcdHdpZGdldC5fX3NldFByb3BlcnRpZXNfXyhwcm9wZXJ0aWVzKTtcblx0XHR3aWRnZXQuX19zZXRDaGlsZHJlbl9fKGNoaWxkcmVuKTtcblx0XHRfdHJ5UmVuZGVyKCk7XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdIYXJuZXNzIGRvZXMgbm90IHN1cHBvcnQgcmVnaXN0cnkgaXRlbXMnKTtcblx0fVxuXG5cdGZ1bmN0aW9uIF9nZXRSZW5kZXIoY291bnQ/OiBudW1iZXIpOiBETm9kZSB8IEROb2RlW10ge1xuXHRcdHJldHVybiBjb3VudCA/IHJlbmRlclN0YWNrW2NvdW50XSA6IHJlbmRlclN0YWNrW3JlbmRlclN0YWNrLmxlbmd0aCAtIDFdO1xuXHR9XG5cblx0ZnVuY3Rpb24gX3J1bkNvbXBhcmVzKG5vZGVzOiBETm9kZSB8IEROb2RlW10sIGlzRXhwZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuXHRcdGN1c3RvbUNvbXBhcmF0b3IuZm9yRWFjaCgoeyBzZWxlY3RvciwgcHJvcGVydHksIGNvbXBhcmF0b3IgfSkgPT4ge1xuXHRcdFx0Y29uc3QgaXRlbXMgPSBzZWxlY3Qoc2VsZWN0b3IsIG5vZGVzKTtcblx0XHRcdGl0ZW1zLmZvckVhY2goKGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuXHRcdFx0XHRjb25zdCBjb21wYXJhdG9yTmFtZSA9IGBjb21wYXJhdG9yKHNlbGVjdG9yPSR7c2VsZWN0b3J9LCAke3Byb3BlcnR5fSlgO1xuXHRcdFx0XHRpZiAoaXRlbSAmJiBpdGVtLnByb3BlcnRpZXMgJiYgaXRlbS5wcm9wZXJ0aWVzW3Byb3BlcnR5XSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Y29uc3QgY29tcGFyYXRvclJlc3VsdCA9IGNvbXBhcmF0b3IoaXRlbS5wcm9wZXJ0aWVzW3Byb3BlcnR5XSlcblx0XHRcdFx0XHRcdD8gY29tcGFyYXRvck5hbWVcblx0XHRcdFx0XHRcdDogYCR7Y29tcGFyYXRvck5hbWV9IEZBSUxFRGA7XG5cdFx0XHRcdFx0aXRlbS5wcm9wZXJ0aWVzW3Byb3BlcnR5XSA9IGlzRXhwZWN0ZWQgPyBjb21wYXJhdG9yTmFtZSA6IGNvbXBhcmF0b3JSZXN1bHQ7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gX3RyeVJlbmRlcigpIHtcblx0XHRjb25zdCB7IHByb3BlcnRpZXMsIGNoaWxkcmVuIH0gPSByZW5kZXJGdW5jKCk7XG5cdFx0d2lkZ2V0Ll9fc2V0UHJvcGVydGllc19fKHByb3BlcnRpZXMpO1xuXHRcdHdpZGdldC5fX3NldENoaWxkcmVuX18oY2hpbGRyZW4pO1xuXHRcdGlmIChpbnZhbGlkYXRlZCkge1xuXHRcdFx0Y29uc3QgcmVuZGVyID0gd2lkZ2V0Ll9fcmVuZGVyX18oKTtcblx0XHRcdGNvbnN0IHsgaGFzRGVmZXJyZWRQcm9wZXJ0aWVzLCBub2RlcyB9ID0gZGVjb3JhdGVOb2RlcyhyZW5kZXIpO1xuXHRcdFx0X3J1bkNvbXBhcmVzKG5vZGVzKTtcblx0XHRcdHJlbmRlclN0YWNrLnB1c2gobm9kZXMpO1xuXHRcdFx0aWYgKGhhc0RlZmVycmVkUHJvcGVydGllcykge1xuXHRcdFx0XHRjb25zdCB7IG5vZGVzOiBhZnRlckRlZmVycmVkUHJvcGVydGllc05vZGVzIH0gPSBkZWNvcmF0ZU5vZGVzKHJlbmRlcik7XG5cdFx0XHRcdF9ydW5Db21wYXJlcyhhZnRlckRlZmVycmVkUHJvcGVydGllc05vZGVzKTtcblx0XHRcdFx0cmVuZGVyU3RhY2sucHVzaChhZnRlckRlZmVycmVkUHJvcGVydGllc05vZGVzKTtcblx0XHRcdH1cblx0XHRcdGludmFsaWRhdGVkID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gX2V4cGVjdChleHBlY3RlZFJlbmRlckZ1bmM6IEV4cGVjdGVkUmVuZGVyLCBhY3R1YWxSZW5kZXJGdW5jPzogRXhwZWN0ZWRSZW5kZXIsIHNlbGVjdG9yPzogc3RyaW5nKSB7XG5cdFx0bGV0IHJlbmRlclJlc3VsdDogRE5vZGUgfCBETm9kZVtdO1xuXHRcdGlmIChhY3R1YWxSZW5kZXJGdW5jID09PSB1bmRlZmluZWQpIHtcblx0XHRcdF90cnlSZW5kZXIoKTtcblx0XHRcdHJlbmRlclJlc3VsdCA9IF9nZXRSZW5kZXIoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVuZGVyUmVzdWx0ID0gYWN0dWFsUmVuZGVyRnVuYygpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHsgbm9kZXM6IGV4cGVjdGVkUmVuZGVyUmVzdWx0IH0gPSBkZWNvcmF0ZU5vZGVzKGV4cGVjdGVkUmVuZGVyRnVuYygpKTtcblx0XHRfcnVuQ29tcGFyZXMoZXhwZWN0ZWRSZW5kZXJSZXN1bHQsIHRydWUpO1xuXHRcdGlmIChzZWxlY3Rvcikge1xuXHRcdFx0Y29uc3QgW2ZpcnN0SXRlbV0gPSBzZWxlY3Qoc2VsZWN0b3IsIHJlbmRlclJlc3VsdCk7XG5cdFx0XHRhc3NlcnRSZW5kZXIoZmlyc3RJdGVtLCBleHBlY3RlZFJlbmRlclJlc3VsdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFzc2VydFJlbmRlcihyZW5kZXJSZXN1bHQsIGV4cGVjdGVkUmVuZGVyUmVzdWx0KTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGV4cGVjdChleHBlY3RlZFJlbmRlckZ1bmM6IEV4cGVjdGVkUmVuZGVyLCBhY3R1YWxSZW5kZXJGdW5jPzogRXhwZWN0ZWRSZW5kZXIpIHtcblx0XHRcdHJldHVybiBfZXhwZWN0KGV4cGVjdGVkUmVuZGVyRnVuYywgYWN0dWFsUmVuZGVyRnVuYyk7XG5cdFx0fSxcblx0XHRleHBlY3RQYXJ0aWFsKHNlbGVjdG9yOiBzdHJpbmcsIGV4cGVjdGVkUmVuZGVyRnVuYzogRXhwZWN0ZWRSZW5kZXIsIGFjdHVhbFJlbmRlckZ1bmM/OiBFeHBlY3RlZFJlbmRlcikge1xuXHRcdFx0cmV0dXJuIF9leHBlY3QoZXhwZWN0ZWRSZW5kZXJGdW5jLCBhY3R1YWxSZW5kZXJGdW5jLCBzZWxlY3Rvcik7XG5cdFx0fSxcblx0XHR0cmlnZ2VyKHNlbGVjdG9yOiBzdHJpbmcsIGZ1bmN0aW9uU2VsZWN0b3I6IHN0cmluZyB8IEZ1bmN0aW9uYWxTZWxlY3RvciwgLi4uYXJnczogYW55W10pOiBhbnkge1xuXHRcdFx0X3RyeVJlbmRlcigpO1xuXHRcdFx0Y29uc3QgW2ZpcnN0SXRlbV0gPSBzZWxlY3Qoc2VsZWN0b3IsIF9nZXRSZW5kZXIoKSk7XG5cdFx0XHRpZiAoZmlyc3RJdGVtKSB7XG5cdFx0XHRcdGxldCB0cmlnZ2VyRnVuY3Rpb246IEZ1bmN0aW9uIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAodHlwZW9mIGZ1bmN0aW9uU2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdFx0dHJpZ2dlckZ1bmN0aW9uID0gKGZpcnN0SXRlbS5wcm9wZXJ0aWVzIGFzIGFueSlbZnVuY3Rpb25TZWxlY3Rvcl07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dHJpZ2dlckZ1bmN0aW9uID0gZnVuY3Rpb25TZWxlY3RvcihmaXJzdEl0ZW0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0cmlnZ2VyRnVuY3Rpb24pIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJpZ2dlckZ1bmN0aW9uLmFwcGx5KHdpZGdldCwgYXJncyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdGdldFJlbmRlcihpbmRleD86IG51bWJlcik6IEROb2RlIHwgRE5vZGVbXSB7XG5cdFx0XHRyZXR1cm4gX2dldFJlbmRlcihpbmRleCk7XG5cdFx0fVxuXHR9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBoYXJuZXNzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGhhcm5lc3MudHMiLCJpbXBvcnQgeyBETm9kZSwgV05vZGUsIFZOb2RlLCBEZWZhdWx0V2lkZ2V0QmFzZUludGVyZmFjZSwgQ29uc3RydWN0b3IgfSBmcm9tICdAZG9qby93aWRnZXQtY29yZS9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGlzV05vZGUgfSBmcm9tICdAZG9qby93aWRnZXQtY29yZS9kJztcbmltcG9ydCAqIGFzIGRpZmYgZnJvbSAnZGlmZic7XG5pbXBvcnQgV2Vha01hcCBmcm9tICdAZG9qby9zaGltL1dlYWtNYXAnO1xuaW1wb3J0IFNldCBmcm9tICdAZG9qby9zaGltL1NldCc7XG5pbXBvcnQgTWFwIGZyb20gJ0Bkb2pvL3NoaW0vTWFwJztcbmltcG9ydCB7IGZyb20gYXMgYXJyYXlGcm9tIH0gZnJvbSAnQGRvam8vc2hpbS9hcnJheSc7XG5cbmxldCB3aWRnZXRDbGFzc0NvdW50ZXIgPSAwO1xuY29uc3Qgd2lkZ2V0TWFwID0gbmV3IFdlYWtNYXA8Q29uc3RydWN0b3I8RGVmYXVsdFdpZGdldEJhc2VJbnRlcmZhY2U+LCBudW1iZXI+KCk7XG5cbmZ1bmN0aW9uIHJlcGxhY2VyKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogYW55IHtcblx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdHJldHVybiAnZnVuY3Rpb24nO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRyZXR1cm4gJ3VuZGVmaW5lZCc7XG5cdH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZXQgfHwgdmFsdWUgaW5zdGFuY2VvZiBNYXApIHtcblx0XHRyZXR1cm4gYXJyYXlGcm9tKHZhbHVlKTtcblx0fVxuXHRyZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRETm9kZXMobm9kZXM6IEROb2RlIHwgRE5vZGVbXSwgZGVwdGg6IG51bWJlciA9IDApOiBzdHJpbmcge1xuXHRjb25zdCBpc0FycmF5RnJhZ21lbnQgPSBBcnJheS5pc0FycmF5KG5vZGVzKSAmJiBkZXB0aCA9PT0gMDtcblx0bGV0IGluaXRpYWwgPSBpc0FycmF5RnJhZ21lbnQgPyAnW1xcbicgOiAnJztcblx0bGV0IHRhYnMgPSAnJztcblx0ZGVwdGggPSBpc0FycmF5RnJhZ21lbnQgPyAxIDogZGVwdGg7XG5cdG5vZGVzID0gQXJyYXkuaXNBcnJheShub2RlcykgPyBub2RlcyA6IFtub2Rlc107XG5cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBkZXB0aDsgaSsrKSB7XG5cdFx0dGFicyA9IGAke3RhYnN9XFx0YDtcblx0fVxuXHRsZXQgZm9ybWF0dGVkTm9kZSA9IG5vZGVzLnJlZHVjZSgocmVzdWx0OiBzdHJpbmcsIG5vZGUsIGluZGV4KSA9PiB7XG5cdFx0aWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblx0XHRpZiAoaW5kZXggPiAwKSB7XG5cdFx0XHRyZXN1bHQgPSBgJHtyZXN1bHR9XFxuYDtcblx0XHR9XG5cdFx0cmVzdWx0ID0gYCR7cmVzdWx0fSR7dGFic31gO1xuXG5cdFx0aWYgKHR5cGVvZiBub2RlID09PSAnc3RyaW5nJykge1xuXHRcdFx0cmV0dXJuIGAke3Jlc3VsdH1cIiR7bm9kZX1cImA7XG5cdFx0fVxuXG5cdFx0cmVzdWx0ID0gYCR7cmVzdWx0fSR7Zm9ybWF0Tm9kZShub2RlLCB0YWJzKX1gO1xuXHRcdGlmIChub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0cmVzdWx0ID0gYCR7cmVzdWx0fSwgW1xcbiR7Zm9ybWF0RE5vZGVzKG5vZGUuY2hpbGRyZW4sIGRlcHRoICsgMSl9XFxuJHt0YWJzfV1gO1xuXHRcdH1cblx0XHRyZXR1cm4gYCR7cmVzdWx0fSlgO1xuXHR9LCBpbml0aWFsKTtcblxuXHRyZXR1cm4gaXNBcnJheUZyYWdtZW50ID8gKGZvcm1hdHRlZE5vZGUgPSBgJHtmb3JtYXR0ZWROb2RlfVxcbl1gKSA6IGZvcm1hdHRlZE5vZGU7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFByb3BlcnRpZXMocHJvcGVydGllczogYW55LCB0YWJzOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRwcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMocHJvcGVydGllcylcblx0XHQuc29ydCgpXG5cdFx0LnJlZHVjZSgocHJvcHM6IGFueSwga2V5KSA9PiB7XG5cdFx0XHRwcm9wc1trZXldID0gcHJvcGVydGllc1trZXldO1xuXHRcdFx0cmV0dXJuIHByb3BzO1xuXHRcdH0sIHt9KTtcblx0cHJvcGVydGllcyA9IEpTT04uc3RyaW5naWZ5KHByb3BlcnRpZXMsIHJlcGxhY2VyLCBgJHt0YWJzfVxcdGApLnNsaWNlKDAsIC0xKTtcblx0cmV0dXJuIGAke3Byb3BlcnRpZXN9JHt0YWJzfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRXaWRnZXROYW1lKHdpZGdldENvbnN0cnVjdG9yOiBhbnkpOiBzdHJpbmcge1xuXHRsZXQgbmFtZTogc3RyaW5nO1xuXHRpZiAodHlwZW9mIHdpZGdldENvbnN0cnVjdG9yID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygd2lkZ2V0Q29uc3RydWN0b3IgPT09ICdzeW1ib2wnKSB7XG5cdFx0bmFtZSA9IHdpZGdldENvbnN0cnVjdG9yLnRvU3RyaW5nKCk7XG5cdH0gZWxzZSB7XG5cdFx0bmFtZSA9IHdpZGdldENvbnN0cnVjdG9yLm5hbWU7XG5cdFx0aWYgKG5hbWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0bGV0IGlkID0gd2lkZ2V0TWFwLmdldCh3aWRnZXRDb25zdHJ1Y3Rvcik7XG5cdFx0XHRpZiAoaWQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpZCA9ICsrd2lkZ2V0Q2xhc3NDb3VudGVyO1xuXHRcdFx0XHR3aWRnZXRNYXAuc2V0KHdpZGdldENvbnN0cnVjdG9yLCBpZCk7XG5cdFx0XHR9XG5cdFx0XHRuYW1lID0gYFdpZGdldC0ke2lkfWA7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBuYW1lO1xufVxuXG5mdW5jdGlvbiBmb3JtYXROb2RlKG5vZGU6IFdOb2RlIHwgVk5vZGUsIHRhYnM6IGFueSk6IHN0cmluZyB7XG5cdGNvbnN0IHByb3BlcnR5S2V5Q291bnQgPSBPYmplY3Qua2V5cyhub2RlLnByb3BlcnRpZXMpLmxlbmd0aDtcblx0bGV0IHByb3BlcnRpZXMgPSBwcm9wZXJ0eUtleUNvdW50ID4gMCA/IGZvcm1hdFByb3BlcnRpZXMobm9kZS5wcm9wZXJ0aWVzLCB0YWJzKSA6ICd7fSc7XG5cdGlmIChpc1dOb2RlKG5vZGUpKSB7XG5cdFx0cmV0dXJuIGB3KCR7Z2V0V2lkZ2V0TmFtZShub2RlLndpZGdldENvbnN0cnVjdG9yKX0sICR7cHJvcGVydGllc31gO1xuXHR9XG5cdHJldHVybiBgdihcIiR7bm9kZS50YWd9XCIsICR7cHJvcGVydGllc31gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UmVuZGVyKGFjdHVhbDogRE5vZGUgfCBETm9kZVtdLCBleHBlY3RlZDogRE5vZGUgfCBETm9kZVtdLCBtZXNzYWdlPzogc3RyaW5nKTogdm9pZCB7XG5cdGNvbnN0IHBhcnNlZEFjdHVhbCA9IGZvcm1hdEROb2RlcyhhY3R1YWwpO1xuXHRjb25zdCBwYXJzZWRFeHBlY3RlZCA9IGZvcm1hdEROb2RlcyhleHBlY3RlZCk7XG5cdGNvbnN0IGRpZmZSZXN1bHQgPSBkaWZmLmRpZmZMaW5lcyhwYXJzZWRBY3R1YWwsIHBhcnNlZEV4cGVjdGVkKTtcblx0bGV0IGRpZmZGb3VuZCA9IGZhbHNlO1xuXHRjb25zdCBwYXJzZWREaWZmID0gZGlmZlJlc3VsdC5yZWR1Y2UoKHJlc3VsdDogc3RyaW5nLCBwYXJ0LCBpbmRleCkgPT4ge1xuXHRcdGlmIChwYXJ0LmFkZGVkKSB7XG5cdFx0XHRkaWZmRm91bmQgPSB0cnVlO1xuXHRcdFx0cmVzdWx0ID0gYCR7cmVzdWx0fShFKSR7cGFydC52YWx1ZS5yZXBsYWNlKC9cXG5cXHQvZywgJ1xcbihFKVxcdCcpfWA7XG5cdFx0fSBlbHNlIGlmIChwYXJ0LnJlbW92ZWQpIHtcblx0XHRcdGRpZmZGb3VuZCA9IHRydWU7XG5cdFx0XHRyZXN1bHQgPSBgJHtyZXN1bHR9KEEpJHtwYXJ0LnZhbHVlLnJlcGxhY2UoL1xcblxcdC9nLCAnXFxuKEEpXFx0Jyl9YDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0ID0gYCR7cmVzdWx0fSR7cGFydC52YWx1ZX1gO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LCAnXFxuJyk7XG5cblx0aWYgKGRpZmZGb3VuZCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihwYXJzZWREaWZmKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBhc3NlcnRSZW5kZXI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gYXNzZXJ0UmVuZGVyLnRzIiwiaW1wb3J0IHsgRE5vZGUsIERlZmF1bHRXaWRnZXRCYXNlSW50ZXJmYWNlLCBXTm9kZSwgVk5vZGUgfSBmcm9tICdAZG9qby93aWRnZXQtY29yZS9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGlzVk5vZGUsIGlzV05vZGUgfSBmcm9tICdAZG9qby93aWRnZXQtY29yZS9kJztcbmltcG9ydCAqIGFzIGNzc1NlbGVjdCBmcm9tICdjc3Mtc2VsZWN0LXVtZCc7XG5cbmV4cG9ydCB0eXBlIFRlc3RGdW5jdGlvbiA9IChlbGVtOiBETm9kZTxEZWZhdWx0V2lkZ2V0QmFzZUludGVyZmFjZT4pID0+IGJvb2xlYW47XG5cbmV4cG9ydCBjb25zdCBwYXJzZVNlbGVjdG9yID0gKHNlbGVjdG9yOiBzdHJpbmcpID0+IHtcblx0Y29uc3Qgc2VsZWN0b3JzID0gc2VsZWN0b3Iuc3BsaXQoJyAnKTtcblx0cmV0dXJuIHNlbGVjdG9yc1xuXHRcdC5tYXAoKHNlbGVjdG9yKSA9PiB7XG5cdFx0XHRjb25zdCBrZXlTaWdpbEluZGV4ID0gc2VsZWN0b3IuaW5kZXhPZignQCcpO1xuXHRcdFx0aWYgKGtleVNpZ2lsSW5kZXggPT09IDApIHtcblx0XHRcdFx0cmV0dXJuIGBba2V5PVwiJHtzZWxlY3Rvci5zdWJzdHIoMSl9XCJdYDtcblx0XHRcdH0gZWxzZSBpZiAoa2V5U2lnaWxJbmRleCA+IDApIHtcblx0XHRcdFx0Y29uc3Qga2V5ID0gc2VsZWN0b3Iuc3Vic3RyaW5nKGtleVNpZ2lsSW5kZXggKyAxKTtcblx0XHRcdFx0cmV0dXJuIGAke3NlbGVjdG9yLnNsaWNlKDAsIGtleVNpZ2lsSW5kZXgpfVtrZXk9XCIke2tleX1cIl1gO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHNlbGVjdG9yO1xuXHRcdH0pXG5cdFx0LmpvaW4oJyAnKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGFwdGVyOiBhbnkgPSB7XG5cdGlzVGFnKGVsZW06IEROb2RlKSB7XG5cdFx0cmV0dXJuIGlzVk5vZGUoZWxlbSk7XG5cdH0sXG5cdGdldFRleHQoZWxlbTogRE5vZGVbXSkge1xuXHRcdHJldHVybiAnJztcblx0fSxcblx0cmVtb3ZlU3Vic2V0cyhlbGVtZW50czogRE5vZGVbXSkge1xuXHRcdHJldHVybiBlbGVtZW50cztcblx0fSxcblx0Z2V0Q2hpbGRyZW4oZWxlbTogRE5vZGUpIHtcblx0XHRyZXR1cm4gaXNWTm9kZShlbGVtKSB8fCBpc1dOb2RlKGVsZW0pID8gZWxlbS5jaGlsZHJlbiA6IFtdO1xuXHR9LFxuXHRnZXRBdHRyaWJ1dGVWYWx1ZShlbGVtOiBETm9kZSwgbmFtZTogc3RyaW5nKSB7XG5cdFx0aWYgKGlzVk5vZGUoZWxlbSkgfHwgaXNXTm9kZShlbGVtKSkge1xuXHRcdFx0aWYgKG5hbWUgPT09ICdjbGFzcycpIHtcblx0XHRcdFx0Y29uc3QgY2xhc3NlcyA9IChlbGVtLnByb3BlcnRpZXMgYXMgYW55KS5jbGFzc2VzO1xuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShjbGFzc2VzKSkge1xuXHRcdFx0XHRcdHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gY2xhc3Nlcztcblx0XHRcdH1cblx0XHRcdHJldHVybiAoZWxlbS5wcm9wZXJ0aWVzIGFzIGFueSlbbmFtZV07XG5cdFx0fVxuXHR9LFxuXHRoYXNBdHRyaWIoZWxlbTogRE5vZGUsIG5hbWU6IHN0cmluZykge1xuXHRcdGlmIChpc1ZOb2RlKGVsZW0pIHx8IGlzV05vZGUoZWxlbSkpIHtcblx0XHRcdHJldHVybiBuYW1lIGluIGVsZW0ucHJvcGVydGllcztcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXHRleGlzdHNPbmUodGVzdDogVGVzdEZ1bmN0aW9uLCBlbGVtZW50czogRE5vZGVbXSkge1xuXHRcdHJldHVybiBlbGVtZW50cy5zb21lKChlbGVtOiBETm9kZSkgPT4gdGVzdChlbGVtKSk7XG5cdH0sXG5cdGdldE5hbWUoZWxlbTogRE5vZGUpIHtcblx0XHRpZiAoaXNWTm9kZShlbGVtKSkge1xuXHRcdFx0cmV0dXJuIGVsZW0udGFnO1xuXHRcdH1cblx0fSxcblx0Z2V0UGFyZW50KGVsZW06IEROb2RlKSB7XG5cdFx0aWYgKGlzVk5vZGUoZWxlbSkgfHwgaXNXTm9kZShlbGVtKSkge1xuXHRcdFx0cmV0dXJuIChlbGVtIGFzIGFueSkucGFyZW50O1xuXHRcdH1cblx0fSxcblx0Z2V0U2libGluZ3MoZWxlbTogRE5vZGUpIHtcblx0XHRpZiAoaXNWTm9kZShlbGVtKSB8fCBpc1dOb2RlKGVsZW0pKSB7XG5cdFx0XHRpZiAoKGVsZW0gYXMgYW55KS5wYXJlbnQpIHtcblx0XHRcdFx0cmV0dXJuIChlbGVtIGFzIGFueSkucGFyZW50LmNoaWxkcmVuO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFtlbGVtXTtcblx0XHR9XG5cdH0sXG5cdGZpbmRPbmUodGVzdDogVGVzdEZ1bmN0aW9uLCBhcnI6IEROb2RlW10pOiBETm9kZSB7XG5cdFx0bGV0IGVsZW0gPSBudWxsO1xuXHRcdGZvciAobGV0IGkgPSAwLCBsID0gYXJyLmxlbmd0aDsgaSA8IGwgJiYgIWVsZW07IGkrKykge1xuXHRcdFx0aWYgKHRlc3QoYXJyW2ldKSkge1xuXHRcdFx0XHRlbGVtID0gYXJyW2ldO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgY2hpbGRyZW4gPSBhZGFwdGVyLmdldENoaWxkcmVuKGFycltpXSk7XG5cdFx0XHRcdGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGFkYXB0ZXIuZmluZE9uZSh0ZXN0LCBjaGlsZHJlbik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGVsZW07XG5cdH0sXG5cdGZpbmRBbGwodGVzdDogVGVzdEZ1bmN0aW9uLCBlbGVtZW50czogRE5vZGVbXSk6IEROb2RlW10ge1xuXHRcdGxldCByZXN1bHQ6IEROb2RlW10gPSBbXTtcblx0XHRmb3IgKGxldCBpID0gMCwgaiA9IGVsZW1lbnRzLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuXHRcdFx0aWYgKHRlc3QoZWxlbWVudHNbaV0pKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKGVsZW1lbnRzW2ldKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGNoaWxkcmVuID0gYWRhcHRlci5nZXRDaGlsZHJlbihlbGVtZW50c1tpXSk7XG5cdFx0XHRpZiAoY2hpbGRyZW4pIHtcblx0XHRcdFx0cmVzdWx0ID0gWy4uLnJlc3VsdCwgLi4uYWRhcHRlci5maW5kQWxsKHRlc3QsIGNoaWxkcmVuKV07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3Qoc2VsZWN0b3I6IHN0cmluZywgbm9kZXM6IEROb2RlIHwgRE5vZGVbXSk6IChXTm9kZSB8IFZOb2RlKVtdIHtcblx0bm9kZXMgPSBBcnJheS5pc0FycmF5KG5vZGVzKSA/IG5vZGVzIDogW25vZGVzXTtcblx0c2VsZWN0b3IgPSBwYXJzZVNlbGVjdG9yKHNlbGVjdG9yKTtcblx0cmV0dXJuIGNzc1NlbGVjdChzZWxlY3Rvciwgbm9kZXMsIHsgYWRhcHRlciB9KSBhcyAoV05vZGUgfCBWTm9kZSlbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2VsZWN0O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHNlbGVjdG9yLnRzIiwiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKSh0cnVlKTtcbi8vIGltcG9ydHNcblxuXG4vLyBtb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIi5zVW1VaTRTaCB7XFxuXFx0aGVpZ2h0OiAxMDAlO1xcblxcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuXFxuLl8yTWs2UmRxYSB7XFxuXFx0Y29sb3I6ICNmZmY7XFxuXFx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xcblxcdG1hcmdpbjogMCA2LjRweDtcXG5cXHRwb3NpdGlvbjogcmVsYXRpdmU7XFxuXFx0ZGlzcGxheTogLXdlYmtpdC1ib3g7XFxuXFx0ZGlzcGxheTogLW1zLWZsZXhib3g7XFxuXFx0ZGlzcGxheTogZmxleDtcXG5cXHQtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xcblxcdC13ZWJraXQtYm94LWRpcmVjdGlvbjogbm9ybWFsO1xcblxcdCAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG5cXHQgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuXFx0LXdlYmtpdC1ib3gtcGFjazogY2VudGVyO1xcblxcdCAgICAtbXMtZmxleC1wYWNrOiBjZW50ZXI7XFxuXFx0ICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG5cXHRoZWlnaHQ6IDQ4cHg7XFxuXFx0Y3Vyc29yOiBwb2ludGVyO1xcbn1cXG5cXG4uXzJNazZSZHFhOjphZnRlciB7XFxuXFx0ZGlzcGxheTogYmxvY2s7XFxuXFx0Y29udGVudDogXFxcIlxcXCI7XFxuXFx0YmFja2dyb3VuZDogI2ZmZjtcXG5cXHRoZWlnaHQ6IDJweDtcXG5cXHRwb3NpdGlvbjogYWJzb2x1dGU7XFxuXFx0d2lkdGg6IDEwMCU7XFxuXFx0Ym90dG9tOiAwO1xcblxcdC13ZWJraXQtdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gLjNzIGVhc2Utb3V0O1xcblxcdHRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIC4zcyBlYXNlLW91dDtcXG5cXHR0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gLjNzIGVhc2Utb3V0O1xcblxcdHRyYW5zaXRpb246IHRyYW5zZm9ybSAuM3MgZWFzZS1vdXQsIC13ZWJraXQtdHJhbnNmb3JtIC4zcyBlYXNlLW91dDtcXG5cXHQtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgzcHgpO1xcblxcdCAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDNweCk7XFxufVxcblxcbi5fMS1mM0l0T2g6OmFmdGVyIHtcXG5cXHQtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcXG5cXHQgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcXG59XFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi9Vc2Vycy9icnlhbi9Qcm9qZWN0cy9kb2pvMi9jbGktYnVpbGQtd2lkZ2V0L3Rlc3QtYXBwL3NyYy9tZW51LWl0ZW0vbWVudUl0ZW0ubS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7Q0FDQyxhQUFhO0NBQ2Isc0JBQXNCO0NBQ3RCOztBQUVEO0NBQ0MsWUFBWTtDQUNaLHNCQUFzQjtDQUN0QixnQkFBZ0I7Q0FDaEIsbUJBQW1CO0NBQ25CLHFCQUFxQjtDQUNyQixxQkFBcUI7Q0FDckIsY0FBYztDQUNkLDZCQUE2QjtDQUM3Qiw4QkFBOEI7S0FDMUIsMkJBQTJCO1NBQ3ZCLHVCQUF1QjtDQUMvQix5QkFBeUI7S0FDckIsc0JBQXNCO1NBQ2xCLHdCQUF3QjtDQUNoQyxhQUFhO0NBQ2IsZ0JBQWdCO0NBQ2hCOztBQUVEO0NBQ0MsZUFBZTtDQUNmLFlBQVk7Q0FDWixpQkFBaUI7Q0FDakIsWUFBWTtDQUNaLG1CQUFtQjtDQUNuQixZQUFZO0NBQ1osVUFBVTtDQUNWLG1EQUFtRDtDQUNuRCwyQ0FBMkM7Q0FDM0MsbUNBQW1DO0NBQ25DLG1FQUFtRTtDQUNuRSxtQ0FBbUM7U0FDM0IsMkJBQTJCO0NBQ25DOztBQUVEO0NBQ0MsaUNBQWlDO1NBQ3pCLHlCQUF5QjtDQUNqQ1wiLFwiZmlsZVwiOlwibWVudUl0ZW0ubS5jc3NcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLnJvb3Qge1xcblxcdGhlaWdodDogMTAwJTtcXG5cXHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcblxcbi5pdGVtIHtcXG5cXHRjb2xvcjogI2ZmZjtcXG5cXHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxuXFx0bWFyZ2luOiAwIDYuNHB4O1xcblxcdHBvc2l0aW9uOiByZWxhdGl2ZTtcXG5cXHRkaXNwbGF5OiAtd2Via2l0LWJveDtcXG5cXHRkaXNwbGF5OiAtbXMtZmxleGJveDtcXG5cXHRkaXNwbGF5OiBmbGV4O1xcblxcdC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7XFxuXFx0LXdlYmtpdC1ib3gtZGlyZWN0aW9uOiBub3JtYWw7XFxuXFx0ICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcblxcdCAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG5cXHQtd2Via2l0LWJveC1wYWNrOiBjZW50ZXI7XFxuXFx0ICAgIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjtcXG5cXHQgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcblxcdGhlaWdodDogNDhweDtcXG5cXHRjdXJzb3I6IHBvaW50ZXI7XFxufVxcblxcbi5pdGVtOjphZnRlciB7XFxuXFx0ZGlzcGxheTogYmxvY2s7XFxuXFx0Y29udGVudDogXFxcIlxcXCI7XFxuXFx0YmFja2dyb3VuZDogI2ZmZjtcXG5cXHRoZWlnaHQ6IDJweDtcXG5cXHRwb3NpdGlvbjogYWJzb2x1dGU7XFxuXFx0d2lkdGg6IDEwMCU7XFxuXFx0Ym90dG9tOiAwO1xcblxcdC13ZWJraXQtdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gLjNzIGVhc2Utb3V0O1xcblxcdHRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIC4zcyBlYXNlLW91dDtcXG5cXHR0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gLjNzIGVhc2Utb3V0O1xcblxcdHRyYW5zaXRpb246IHRyYW5zZm9ybSAuM3MgZWFzZS1vdXQsIC13ZWJraXQtdHJhbnNmb3JtIC4zcyBlYXNlLW91dDtcXG5cXHQtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgzcHgpO1xcblxcdCAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDNweCk7XFxufVxcblxcbi5zZWxlY3RlZDo6YWZ0ZXIge1xcblxcdC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xcblxcdCAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xcbn1cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcblxuLy8gZXhwb3J0c1xuZXhwb3J0cy5sb2NhbHMgPSB7XCIgX2tleVwiOiBcInRlc3QtYXBwL21lbnVJdGVtXCIsXG5cdFwicm9vdFwiOiBcInNVbVVpNFNoXCIsXG5cdFwiaXRlbVwiOiBcIl8yTWs2UmRxYVwiLFxuXHRcInNlbGVjdGVkXCI6IFwiXzEtZjNJdE9oXCJcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZGVjb3JhdG9yLWxvYWRlciEuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyP3tcIm1vZHVsZXNcIjp0cnVlLFwic291cmNlTWFwXCI6dHJ1ZSxcImltcG9ydExvYWRlcnNcIjoxLFwibG9jYWxJZGVudE5hbWVcIjpcIltoYXNoOmJhc2U2NDo4XVwifSEuL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9saWI/e1wiaWRlbnRcIjpcInBvc3Rjc3NcIixcInBsdWdpbnNcIjpbbnVsbCx7XCJ2ZXJzaW9uXCI6XCI2LjAuMjNcIixcInBsdWdpbnNcIjpbbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbF0sXCJwb3N0Y3NzUGx1Z2luXCI6XCJwb3N0Y3NzLWNzc25leHRcIixcInBvc3Rjc3NWZXJzaW9uXCI6XCI2LjAuMjNcIn1dfSEuL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kdHMtbG9hZGVyP3R5cGU9Y3NzIS4vc3JjL21lbnUtaXRlbS9tZW51SXRlbS5tLmNzc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZGVjb3JhdG9yLWxvYWRlci9pbmRleC5qcyEuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3tcIm1vZHVsZXNcIjp0cnVlLFwic291cmNlTWFwXCI6dHJ1ZSxcImltcG9ydExvYWRlcnNcIjoxLFwibG9jYWxJZGVudE5hbWVcIjpcIltoYXNoOmJhc2U2NDo4XVwifSEuL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9saWIvaW5kZXguanM/e1wiaWRlbnRcIjpcInBvc3Rjc3NcIixcInBsdWdpbnNcIjpbbnVsbCx7XCJ2ZXJzaW9uXCI6XCI2LjAuMjNcIixcInBsdWdpbnNcIjpbbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbF0sXCJwb3N0Y3NzUGx1Z2luXCI6XCJwb3N0Y3NzLWNzc25leHRcIixcInBvc3Rjc3NWZXJzaW9uXCI6XCI2LjAuMjNcIn1dfSEuL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kdHMtbG9hZGVyL2luZGV4LmpzP3R5cGU9Y3NzIS4vc3JjL21lbnUtaXRlbS9tZW51SXRlbS5tLmNzc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKHRydWUpO1xuLy8gaW1wb3J0c1xuXG5cbi8vIG1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiLl8zYkE2amRTbiB7XFxuXFx0d2lkdGg6IDEwMCU7XFxuXFx0dG9wOiAwO1xcblxcdGhlaWdodDogNDhweDtcXG5cXHR6LWluZGV4OiAxMDA7XFxuXFx0YmFja2dyb3VuZC1jb2xvcjogIzFkMWYyMDtcXG59XFxuXFxuLl8xZW9HZnFrdSB7XFxuXFx0aGVpZ2h0OiAxMDAlO1xcblxcdG1hcmdpbjogMCBhdXRvO1xcbn1cXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiL1VzZXJzL2JyeWFuL1Byb2plY3RzL2Rvam8yL2NsaS1idWlsZC13aWRnZXQvdGVzdC1hcHAvc3JjL21lbnUvbWVudS5tLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtDQUNDLFlBQVk7Q0FDWixPQUFPO0NBQ1AsYUFBYTtDQUNiLGFBQWE7Q0FDYiwwQkFBMEI7Q0FDMUI7O0FBRUQ7Q0FDQyxhQUFhO0NBQ2IsZUFBZTtDQUNmXCIsXCJmaWxlXCI6XCJtZW51Lm0uY3NzXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5yb290IHtcXG5cXHR3aWR0aDogMTAwJTtcXG5cXHR0b3A6IDA7XFxuXFx0aGVpZ2h0OiA0OHB4O1xcblxcdHotaW5kZXg6IDEwMDtcXG5cXHRiYWNrZ3JvdW5kLWNvbG9yOiAjMWQxZjIwO1xcbn1cXG5cXG4ubWVudUNvbnRhaW5lciB7XFxuXFx0aGVpZ2h0OiAxMDAlO1xcblxcdG1hcmdpbjogMCBhdXRvO1xcbn1cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcblxuLy8gZXhwb3J0c1xuZXhwb3J0cy5sb2NhbHMgPSB7XCIgX2tleVwiOiBcInRlc3QtYXBwL21lbnVcIixcblx0XCJyb290XCI6IFwiXzNiQTZqZFNuXCIsXG5cdFwibWVudUNvbnRhaW5lclwiOiBcIl8xZW9HZnFrdVwiXG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWRlY29yYXRvci1sb2FkZXIhLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlcj97XCJtb2R1bGVzXCI6dHJ1ZSxcInNvdXJjZU1hcFwiOnRydWUsXCJpbXBvcnRMb2FkZXJzXCI6MSxcImxvY2FsSWRlbnROYW1lXCI6XCJbaGFzaDpiYXNlNjQ6OF1cIn0hLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvbGliP3tcImlkZW50XCI6XCJwb3N0Y3NzXCIsXCJwbHVnaW5zXCI6W251bGwse1widmVyc2lvblwiOlwiNi4wLjIzXCIsXCJwbHVnaW5zXCI6W251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLFwicG9zdGNzc1BsdWdpblwiOlwicG9zdGNzcy1jc3NuZXh0XCIsXCJwb3N0Y3NzVmVyc2lvblwiOlwiNi4wLjIzXCJ9XX0hLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZHRzLWxvYWRlcj90eXBlPWNzcyEuL3NyYy9tZW51L21lbnUubS5jc3Ncbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWRlY29yYXRvci1sb2FkZXIvaW5kZXguanMhLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz97XCJtb2R1bGVzXCI6dHJ1ZSxcInNvdXJjZU1hcFwiOnRydWUsXCJpbXBvcnRMb2FkZXJzXCI6MSxcImxvY2FsSWRlbnROYW1lXCI6XCJbaGFzaDpiYXNlNjQ6OF1cIn0hLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvbGliL2luZGV4LmpzP3tcImlkZW50XCI6XCJwb3N0Y3NzXCIsXCJwbHVnaW5zXCI6W251bGwse1widmVyc2lvblwiOlwiNi4wLjIzXCIsXCJwbHVnaW5zXCI6W251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLFwicG9zdGNzc1BsdWdpblwiOlwicG9zdGNzcy1jc3NuZXh0XCIsXCJwb3N0Y3NzVmVyc2lvblwiOlwiNi4wLjIzXCJ9XX0hLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZHRzLWxvYWRlci9pbmRleC5qcz90eXBlPWNzcyEuL3NyYy9tZW51L21lbnUubS5jc3Ncbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiaW1wb3J0IHsgRXZlbnRlZCB9IGZyb20gJ0Bkb2pvL2NvcmUvRXZlbnRlZCc7XG5pbXBvcnQgeyBFdmVudE9iamVjdCB9IGZyb20gJ0Bkb2pvL2NvcmUvaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCB0eXBlIEluamVjdG9yRXZlbnRNYXAgPSB7XG5cdGludmFsaWRhdGU6IEV2ZW50T2JqZWN0PCdpbnZhbGlkYXRlJz47XG59O1xuXG5leHBvcnQgY2xhc3MgSW5qZWN0b3I8VCA9IGFueT4gZXh0ZW5kcyBFdmVudGVkPEluamVjdG9yRXZlbnRNYXA+IHtcblx0cHJpdmF0ZSBfcGF5bG9hZDogVDtcblx0cHJpdmF0ZSBfaW52YWxpZGF0b3I6IHVuZGVmaW5lZCB8ICgoKSA9PiB2b2lkKTtcblxuXHRjb25zdHJ1Y3RvcihwYXlsb2FkOiBUKSB7XG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLl9wYXlsb2FkID0gcGF5bG9hZDtcblx0fVxuXG5cdHB1YmxpYyBzZXRJbnZhbGlkYXRvcihpbnZhbGlkYXRvcjogKCkgPT4gdm9pZCkge1xuXHRcdHRoaXMuX2ludmFsaWRhdG9yID0gaW52YWxpZGF0b3I7XG5cdH1cblxuXHRwdWJsaWMgZ2V0KCk6IFQge1xuXHRcdHJldHVybiB0aGlzLl9wYXlsb2FkO1xuXHR9XG5cblx0cHVibGljIHNldChwYXlsb2FkOiBUKTogdm9pZCB7XG5cdFx0dGhpcy5fcGF5bG9hZCA9IHBheWxvYWQ7XG5cdFx0aWYgKHRoaXMuX2ludmFsaWRhdG9yKSB7XG5cdFx0XHR0aGlzLl9pbnZhbGlkYXRvcigpO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbmplY3RvcjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBJbmplY3Rvci50cyIsImltcG9ydCB7IEV2ZW50ZWQgfSBmcm9tICdAZG9qby9jb3JlL0V2ZW50ZWQnO1xuaW1wb3J0IHsgRXZlbnRPYmplY3QgfSBmcm9tICdAZG9qby9jb3JlL2ludGVyZmFjZXMnO1xuaW1wb3J0IE1hcCBmcm9tICdAZG9qby9zaGltL01hcCc7XG5pbXBvcnQgeyBOb2RlSGFuZGxlckludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5cbi8qKlxuICogRW51bSB0byBpZGVudGlmeSB0aGUgdHlwZSBvZiBldmVudC5cbiAqIExpc3RlbmluZyB0byAnUHJvamVjdG9yJyB3aWxsIG5vdGlmeSB3aGVuIHByb2plY3RvciBpcyBjcmVhdGVkIG9yIHVwZGF0ZWRcbiAqIExpc3RlbmluZyB0byAnV2lkZ2V0JyB3aWxsIG5vdGlmeSB3aGVuIHdpZGdldCByb290IGlzIGNyZWF0ZWQgb3IgdXBkYXRlZFxuICovXG5leHBvcnQgZW51bSBOb2RlRXZlbnRUeXBlIHtcblx0UHJvamVjdG9yID0gJ1Byb2plY3RvcicsXG5cdFdpZGdldCA9ICdXaWRnZXQnXG59XG5cbmV4cG9ydCB0eXBlIE5vZGVIYW5kbGVyRXZlbnRNYXAgPSB7XG5cdFByb2plY3RvcjogRXZlbnRPYmplY3Q8Tm9kZUV2ZW50VHlwZS5Qcm9qZWN0b3I+O1xuXHRXaWRnZXQ6IEV2ZW50T2JqZWN0PE5vZGVFdmVudFR5cGUuV2lkZ2V0Pjtcbn07XG5cbmV4cG9ydCBjbGFzcyBOb2RlSGFuZGxlciBleHRlbmRzIEV2ZW50ZWQ8Tm9kZUhhbmRsZXJFdmVudE1hcD4gaW1wbGVtZW50cyBOb2RlSGFuZGxlckludGVyZmFjZSB7XG5cdHByaXZhdGUgX25vZGVNYXAgPSBuZXcgTWFwPHN0cmluZywgRWxlbWVudD4oKTtcblxuXHRwdWJsaWMgZ2V0KGtleTogc3RyaW5nKTogRWxlbWVudCB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuX25vZGVNYXAuZ2V0KGtleSk7XG5cdH1cblxuXHRwdWJsaWMgaGFzKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX25vZGVNYXAuaGFzKGtleSk7XG5cdH1cblxuXHRwdWJsaWMgYWRkKGVsZW1lbnQ6IEVsZW1lbnQsIGtleTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5fbm9kZU1hcC5zZXQoa2V5LCBlbGVtZW50KTtcblx0XHR0aGlzLmVtaXQoeyB0eXBlOiBrZXkgfSk7XG5cdH1cblxuXHRwdWJsaWMgYWRkUm9vdCgpOiB2b2lkIHtcblx0XHR0aGlzLmVtaXQoeyB0eXBlOiBOb2RlRXZlbnRUeXBlLldpZGdldCB9KTtcblx0fVxuXG5cdHB1YmxpYyBhZGRQcm9qZWN0b3IoKTogdm9pZCB7XG5cdFx0dGhpcy5lbWl0KHsgdHlwZTogTm9kZUV2ZW50VHlwZS5Qcm9qZWN0b3IgfSk7XG5cdH1cblxuXHRwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG5cdFx0dGhpcy5fbm9kZU1hcC5jbGVhcigpO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE5vZGVIYW5kbGVyO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIE5vZGVIYW5kbGVyLnRzIiwiaW1wb3J0IFByb21pc2UgZnJvbSAnQGRvam8vc2hpbS9Qcm9taXNlJztcbmltcG9ydCBNYXAgZnJvbSAnQGRvam8vc2hpbS9NYXAnO1xuaW1wb3J0IFN5bWJvbCBmcm9tICdAZG9qby9zaGltL1N5bWJvbCc7XG5pbXBvcnQgeyBFdmVudE9iamVjdCB9IGZyb20gJ0Bkb2pvL2NvcmUvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBFdmVudGVkIH0gZnJvbSAnQGRvam8vY29yZS9FdmVudGVkJztcbmltcG9ydCB7XG5cdENvbnN0cnVjdG9yLFxuXHRJbmplY3RvckZhY3RvcnksXG5cdEluamVjdG9ySXRlbSxcblx0UmVnaXN0cnlMYWJlbCxcblx0V2lkZ2V0QmFzZUNvbnN0cnVjdG9yLFxuXHRXaWRnZXRCYXNlSW50ZXJmYWNlXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCB0eXBlIFdpZGdldEJhc2VDb25zdHJ1Y3RvckZ1bmN0aW9uID0gKCkgPT4gUHJvbWlzZTxXaWRnZXRCYXNlQ29uc3RydWN0b3I+O1xuXG5leHBvcnQgdHlwZSBFU01EZWZhdWx0V2lkZ2V0QmFzZUZ1bmN0aW9uID0gKCkgPT4gUHJvbWlzZTxFU01EZWZhdWx0V2lkZ2V0QmFzZTxXaWRnZXRCYXNlSW50ZXJmYWNlPj47XG5cbmV4cG9ydCB0eXBlIFJlZ2lzdHJ5SXRlbSA9XG5cdHwgV2lkZ2V0QmFzZUNvbnN0cnVjdG9yXG5cdHwgUHJvbWlzZTxXaWRnZXRCYXNlQ29uc3RydWN0b3I+XG5cdHwgV2lkZ2V0QmFzZUNvbnN0cnVjdG9yRnVuY3Rpb25cblx0fCBFU01EZWZhdWx0V2lkZ2V0QmFzZUZ1bmN0aW9uO1xuXG4vKipcbiAqIFdpZGdldCBiYXNlIHN5bWJvbCB0eXBlXG4gKi9cbmV4cG9ydCBjb25zdCBXSURHRVRfQkFTRV9UWVBFID0gU3ltYm9sKCdXaWRnZXQgQmFzZScpO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdHJ5RXZlbnRPYmplY3QgZXh0ZW5kcyBFdmVudE9iamVjdDxSZWdpc3RyeUxhYmVsPiB7XG5cdGFjdGlvbjogc3RyaW5nO1xuXHRpdGVtOiBXaWRnZXRCYXNlQ29uc3RydWN0b3IgfCBJbmplY3RvckZhY3Rvcnk7XG59XG4vKipcbiAqIFdpZGdldCBSZWdpc3RyeSBJbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RyeUludGVyZmFjZSB7XG5cdC8qKlxuXHQgKiBEZWZpbmUgYSBXaWRnZXRSZWdpc3RyeUl0ZW0gYWdhaW5zdCBhIGxhYmVsXG5cdCAqXG5cdCAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgb2YgdGhlIHdpZGdldCB0byByZWdpc3RlclxuXHQgKiBAcGFyYW0gcmVnaXN0cnlJdGVtIFRoZSByZWdpc3RyeSBpdGVtIHRvIGRlZmluZVxuXHQgKi9cblx0ZGVmaW5lKGxhYmVsOiBSZWdpc3RyeUxhYmVsLCByZWdpc3RyeUl0ZW06IFJlZ2lzdHJ5SXRlbSk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIFJldHVybiBhIFJlZ2lzdHJ5SXRlbSBmb3IgdGhlIGdpdmVuIGxhYmVsLCBudWxsIGlmIGFuIGVudHJ5IGRvZXNuJ3QgZXhpc3Rcblx0ICpcblx0ICogQHBhcmFtIHdpZGdldExhYmVsIFRoZSBsYWJlbCBvZiB0aGUgd2lkZ2V0IHRvIHJldHVyblxuXHQgKiBAcmV0dXJucyBUaGUgUmVnaXN0cnlJdGVtIGZvciB0aGUgd2lkZ2V0TGFiZWwsIGBudWxsYCBpZiBubyBlbnRyeSBleGlzdHNcblx0ICovXG5cdGdldDxUIGV4dGVuZHMgV2lkZ2V0QmFzZUludGVyZmFjZSA9IFdpZGdldEJhc2VJbnRlcmZhY2U+KGxhYmVsOiBSZWdpc3RyeUxhYmVsKTogQ29uc3RydWN0b3I8VD4gfCBudWxsO1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgYm9vbGVhbiBpZiBhbiBlbnRyeSBmb3IgdGhlIGxhYmVsIGV4aXN0c1xuXHQgKlxuXHQgKiBAcGFyYW0gd2lkZ2V0TGFiZWwgVGhlIGxhYmVsIHRvIHNlYXJjaCBmb3Jcblx0ICogQHJldHVybnMgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGEgd2lkZ2V0IHJlZ2lzdHJ5IGl0ZW0gZXhpc3RzXG5cdCAqL1xuXHRoYXMobGFiZWw6IFJlZ2lzdHJ5TGFiZWwpOiBib29sZWFuO1xuXG5cdC8qKlxuXHQgKiBEZWZpbmUgYW4gSW5qZWN0b3IgYWdhaW5zdCBhIGxhYmVsXG5cdCAqXG5cdCAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgb2YgdGhlIGluamVjdG9yIHRvIHJlZ2lzdGVyXG5cdCAqIEBwYXJhbSByZWdpc3RyeUl0ZW0gVGhlIGluamVjdG9yIGZhY3Rvcnlcblx0ICovXG5cdGRlZmluZUluamVjdG9yKGxhYmVsOiBSZWdpc3RyeUxhYmVsLCBpbmplY3RvckZhY3Rvcnk6IEluamVjdG9yRmFjdG9yeSk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIFJldHVybiBhbiBJbmplY3RvciByZWdpc3RyeSBpdGVtIGZvciB0aGUgZ2l2ZW4gbGFiZWwsIG51bGwgaWYgYW4gZW50cnkgZG9lc24ndCBleGlzdFxuXHQgKlxuXHQgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIG9mIHRoZSBpbmplY3RvciB0byByZXR1cm5cblx0ICogQHJldHVybnMgVGhlIFJlZ2lzdHJ5SXRlbSBmb3IgdGhlIHdpZGdldExhYmVsLCBgbnVsbGAgaWYgbm8gZW50cnkgZXhpc3RzXG5cdCAqL1xuXHRnZXRJbmplY3RvcjxUPihsYWJlbDogUmVnaXN0cnlMYWJlbCk6IEluamVjdG9ySXRlbTxUPiB8IG51bGw7XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBib29sZWFuIGlmIGFuIGluamVjdG9yIGZvciB0aGUgbGFiZWwgZXhpc3RzXG5cdCAqXG5cdCAqIEBwYXJhbSB3aWRnZXRMYWJlbCBUaGUgbGFiZWwgdG8gc2VhcmNoIGZvclxuXHQgKiBAcmV0dXJucyBib29sZWFuIGluZGljYXRpbmcgaWYgYSBpbmplY3RvciByZWdpc3RyeSBpdGVtIGV4aXN0c1xuXHQgKi9cblx0aGFzSW5qZWN0b3IobGFiZWw6IFJlZ2lzdHJ5TGFiZWwpOiBib29sZWFuO1xufVxuXG4vKipcbiAqIENoZWNrcyBpcyB0aGUgaXRlbSBpcyBhIHN1YmNsYXNzIG9mIFdpZGdldEJhc2UgKG9yIGEgV2lkZ2V0QmFzZSlcbiAqXG4gKiBAcGFyYW0gaXRlbSB0aGUgaXRlbSB0byBjaGVja1xuICogQHJldHVybnMgdHJ1ZS9mYWxzZSBpbmRpY2F0aW5nIGlmIHRoZSBpdGVtIGlzIGEgV2lkZ2V0QmFzZUNvbnN0cnVjdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1dpZGdldEJhc2VDb25zdHJ1Y3RvcjxUIGV4dGVuZHMgV2lkZ2V0QmFzZUludGVyZmFjZT4oaXRlbTogYW55KTogaXRlbSBpcyBDb25zdHJ1Y3RvcjxUPiB7XG5cdHJldHVybiBCb29sZWFuKGl0ZW0gJiYgaXRlbS5fdHlwZSA9PT0gV0lER0VUX0JBU0VfVFlQRSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRVNNRGVmYXVsdFdpZGdldEJhc2U8VD4ge1xuXHRkZWZhdWx0OiBDb25zdHJ1Y3RvcjxUPjtcblx0X19lc01vZHVsZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1dpZGdldENvbnN0cnVjdG9yRGVmYXVsdEV4cG9ydDxUPihpdGVtOiBhbnkpOiBpdGVtIGlzIEVTTURlZmF1bHRXaWRnZXRCYXNlPFQ+IHtcblx0cmV0dXJuIEJvb2xlYW4oXG5cdFx0aXRlbSAmJlxuXHRcdFx0aXRlbS5oYXNPd25Qcm9wZXJ0eSgnX19lc01vZHVsZScpICYmXG5cdFx0XHRpdGVtLmhhc093blByb3BlcnR5KCdkZWZhdWx0JykgJiZcblx0XHRcdGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yKGl0ZW0uZGVmYXVsdClcblx0KTtcbn1cblxuLyoqXG4gKiBUaGUgUmVnaXN0cnkgaW1wbGVtZW50YXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lzdHJ5IGV4dGVuZHMgRXZlbnRlZDx7fSwgUmVnaXN0cnlMYWJlbCwgUmVnaXN0cnlFdmVudE9iamVjdD4gaW1wbGVtZW50cyBSZWdpc3RyeUludGVyZmFjZSB7XG5cdC8qKlxuXHQgKiBpbnRlcm5hbCBtYXAgb2YgbGFiZWxzIGFuZCBSZWdpc3RyeUl0ZW1cblx0ICovXG5cdHByaXZhdGUgX3dpZGdldFJlZ2lzdHJ5OiBNYXA8UmVnaXN0cnlMYWJlbCwgUmVnaXN0cnlJdGVtPiB8IHVuZGVmaW5lZDtcblxuXHRwcml2YXRlIF9pbmplY3RvclJlZ2lzdHJ5OiBNYXA8UmVnaXN0cnlMYWJlbCwgSW5qZWN0b3JJdGVtPiB8IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogRW1pdCBsb2FkZWQgZXZlbnQgZm9yIHJlZ2lzdHJ5IGxhYmVsXG5cdCAqL1xuXHRwcml2YXRlIGVtaXRMb2FkZWRFdmVudCh3aWRnZXRMYWJlbDogUmVnaXN0cnlMYWJlbCwgaXRlbTogV2lkZ2V0QmFzZUNvbnN0cnVjdG9yIHwgSW5qZWN0b3JJdGVtKTogdm9pZCB7XG5cdFx0dGhpcy5lbWl0KHtcblx0XHRcdHR5cGU6IHdpZGdldExhYmVsLFxuXHRcdFx0YWN0aW9uOiAnbG9hZGVkJyxcblx0XHRcdGl0ZW1cblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBkZWZpbmUobGFiZWw6IFJlZ2lzdHJ5TGFiZWwsIGl0ZW06IFJlZ2lzdHJ5SXRlbSk6IHZvaWQge1xuXHRcdGlmICh0aGlzLl93aWRnZXRSZWdpc3RyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLl93aWRnZXRSZWdpc3RyeSA9IG5ldyBNYXAoKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5fd2lkZ2V0UmVnaXN0cnkuaGFzKGxhYmVsKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGB3aWRnZXQgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIGZvciAnJHtsYWJlbC50b1N0cmluZygpfSdgKTtcblx0XHR9XG5cblx0XHR0aGlzLl93aWRnZXRSZWdpc3RyeS5zZXQobGFiZWwsIGl0ZW0pO1xuXG5cdFx0aWYgKGl0ZW0gaW5zdGFuY2VvZiBQcm9taXNlKSB7XG5cdFx0XHRpdGVtLnRoZW4oXG5cdFx0XHRcdCh3aWRnZXRDdG9yKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fd2lkZ2V0UmVnaXN0cnkhLnNldChsYWJlbCwgd2lkZ2V0Q3Rvcik7XG5cdFx0XHRcdFx0dGhpcy5lbWl0TG9hZGVkRXZlbnQobGFiZWwsIHdpZGdldEN0b3IpO1xuXHRcdFx0XHRcdHJldHVybiB3aWRnZXRDdG9yO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQoZXJyb3IpID0+IHtcblx0XHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yKGl0ZW0pKSB7XG5cdFx0XHR0aGlzLmVtaXRMb2FkZWRFdmVudChsYWJlbCwgaXRlbSk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGRlZmluZUluamVjdG9yKGxhYmVsOiBSZWdpc3RyeUxhYmVsLCBpbmplY3RvckZhY3Rvcnk6IEluamVjdG9yRmFjdG9yeSk6IHZvaWQge1xuXHRcdGlmICh0aGlzLl9pbmplY3RvclJlZ2lzdHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuX2luamVjdG9yUmVnaXN0cnkgPSBuZXcgTWFwKCk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX2luamVjdG9yUmVnaXN0cnkuaGFzKGxhYmVsKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBpbmplY3RvciBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgZm9yICcke2xhYmVsLnRvU3RyaW5nKCl9J2ApO1xuXHRcdH1cblxuXHRcdGNvbnN0IGludmFsaWRhdG9yID0gbmV3IEV2ZW50ZWQoKTtcblxuXHRcdGNvbnN0IGluamVjdG9ySXRlbTogSW5qZWN0b3JJdGVtID0ge1xuXHRcdFx0aW5qZWN0b3I6IGluamVjdG9yRmFjdG9yeSgoKSA9PiBpbnZhbGlkYXRvci5lbWl0KHsgdHlwZTogJ2ludmFsaWRhdGUnIH0pKSxcblx0XHRcdGludmFsaWRhdG9yXG5cdFx0fTtcblxuXHRcdHRoaXMuX2luamVjdG9yUmVnaXN0cnkuc2V0KGxhYmVsLCBpbmplY3Rvckl0ZW0pO1xuXHRcdHRoaXMuZW1pdExvYWRlZEV2ZW50KGxhYmVsLCBpbmplY3Rvckl0ZW0pO1xuXHR9XG5cblx0cHVibGljIGdldDxUIGV4dGVuZHMgV2lkZ2V0QmFzZUludGVyZmFjZSA9IFdpZGdldEJhc2VJbnRlcmZhY2U+KGxhYmVsOiBSZWdpc3RyeUxhYmVsKTogQ29uc3RydWN0b3I8VD4gfCBudWxsIHtcblx0XHRpZiAoIXRoaXMuX3dpZGdldFJlZ2lzdHJ5IHx8ICF0aGlzLmhhcyhsYWJlbCkpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGNvbnN0IGl0ZW0gPSB0aGlzLl93aWRnZXRSZWdpc3RyeS5nZXQobGFiZWwpO1xuXG5cdFx0aWYgKGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yPFQ+KGl0ZW0pKSB7XG5cdFx0XHRyZXR1cm4gaXRlbTtcblx0XHR9XG5cblx0XHRpZiAoaXRlbSBpbnN0YW5jZW9mIFByb21pc2UpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGNvbnN0IHByb21pc2UgPSAoPFdpZGdldEJhc2VDb25zdHJ1Y3RvckZ1bmN0aW9uPml0ZW0pKCk7XG5cdFx0dGhpcy5fd2lkZ2V0UmVnaXN0cnkuc2V0KGxhYmVsLCBwcm9taXNlKTtcblxuXHRcdHByb21pc2UudGhlbihcblx0XHRcdCh3aWRnZXRDdG9yKSA9PiB7XG5cdFx0XHRcdGlmIChpc1dpZGdldENvbnN0cnVjdG9yRGVmYXVsdEV4cG9ydDxUPih3aWRnZXRDdG9yKSkge1xuXHRcdFx0XHRcdHdpZGdldEN0b3IgPSB3aWRnZXRDdG9yLmRlZmF1bHQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLl93aWRnZXRSZWdpc3RyeSEuc2V0KGxhYmVsLCB3aWRnZXRDdG9yKTtcblx0XHRcdFx0dGhpcy5lbWl0TG9hZGVkRXZlbnQobGFiZWwsIHdpZGdldEN0b3IpO1xuXHRcdFx0XHRyZXR1cm4gd2lkZ2V0Q3Rvcjtcblx0XHRcdH0sXG5cdFx0XHQoZXJyb3IpID0+IHtcblx0XHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0XHR9XG5cdFx0KTtcblxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0cHVibGljIGdldEluamVjdG9yPFQ+KGxhYmVsOiBSZWdpc3RyeUxhYmVsKTogSW5qZWN0b3JJdGVtPFQ+IHwgbnVsbCB7XG5cdFx0aWYgKCF0aGlzLl9pbmplY3RvclJlZ2lzdHJ5IHx8ICF0aGlzLmhhc0luamVjdG9yKGxhYmVsKSkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX2luamVjdG9yUmVnaXN0cnkuZ2V0KGxhYmVsKSE7XG5cdH1cblxuXHRwdWJsaWMgaGFzKGxhYmVsOiBSZWdpc3RyeUxhYmVsKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIEJvb2xlYW4odGhpcy5fd2lkZ2V0UmVnaXN0cnkgJiYgdGhpcy5fd2lkZ2V0UmVnaXN0cnkuaGFzKGxhYmVsKSk7XG5cdH1cblxuXHRwdWJsaWMgaGFzSW5qZWN0b3IobGFiZWw6IFJlZ2lzdHJ5TGFiZWwpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gQm9vbGVhbih0aGlzLl9pbmplY3RvclJlZ2lzdHJ5ICYmIHRoaXMuX2luamVjdG9yUmVnaXN0cnkuaGFzKGxhYmVsKSk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVnaXN0cnk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gUmVnaXN0cnkudHMiLCJpbXBvcnQgeyBNYXAgfSBmcm9tICdAZG9qby9zaGltL01hcCc7XG5pbXBvcnQgeyBFdmVudGVkIH0gZnJvbSAnQGRvam8vY29yZS9FdmVudGVkJztcbmltcG9ydCB7IEV2ZW50T2JqZWN0IH0gZnJvbSAnQGRvam8vY29yZS9pbnRlcmZhY2VzJztcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBJbmplY3RvckZhY3RvcnksIEluamVjdG9ySXRlbSwgUmVnaXN0cnlMYWJlbCwgV2lkZ2V0QmFzZUludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBSZWdpc3RyeSwgUmVnaXN0cnlFdmVudE9iamVjdCwgUmVnaXN0cnlJdGVtIH0gZnJvbSAnLi9SZWdpc3RyeSc7XG5cbmV4cG9ydCB0eXBlIFJlZ2lzdHJ5SGFuZGxlckV2ZW50TWFwID0ge1xuXHRpbnZhbGlkYXRlOiBFdmVudE9iamVjdDwnaW52YWxpZGF0ZSc+O1xufTtcblxuZXhwb3J0IGNsYXNzIFJlZ2lzdHJ5SGFuZGxlciBleHRlbmRzIEV2ZW50ZWQ8UmVnaXN0cnlIYW5kbGVyRXZlbnRNYXA+IHtcblx0cHJpdmF0ZSBfcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnkoKTtcblx0cHJpdmF0ZSBfcmVnaXN0cnlXaWRnZXRMYWJlbE1hcDogTWFwPFJlZ2lzdHJ5LCBSZWdpc3RyeUxhYmVsW10+ID0gbmV3IE1hcCgpO1xuXHRwcml2YXRlIF9yZWdpc3RyeUluamVjdG9yTGFiZWxNYXA6IE1hcDxSZWdpc3RyeSwgUmVnaXN0cnlMYWJlbFtdPiA9IG5ldyBNYXAoKTtcblx0cHJvdGVjdGVkIGJhc2VSZWdpc3RyeT86IFJlZ2lzdHJ5O1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpcy5vd24odGhpcy5fcmVnaXN0cnkpO1xuXHRcdGNvbnN0IGRlc3Ryb3kgPSAoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5iYXNlUmVnaXN0cnkpIHtcblx0XHRcdFx0dGhpcy5fcmVnaXN0cnlXaWRnZXRMYWJlbE1hcC5kZWxldGUodGhpcy5iYXNlUmVnaXN0cnkpO1xuXHRcdFx0XHR0aGlzLl9yZWdpc3RyeUluamVjdG9yTGFiZWxNYXAuZGVsZXRlKHRoaXMuYmFzZVJlZ2lzdHJ5KTtcblx0XHRcdFx0dGhpcy5iYXNlUmVnaXN0cnkgPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHR0aGlzLm93bih7IGRlc3Ryb3kgfSk7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGJhc2UoYmFzZVJlZ2lzdHJ5OiBSZWdpc3RyeSkge1xuXHRcdGlmICh0aGlzLmJhc2VSZWdpc3RyeSkge1xuXHRcdFx0dGhpcy5fcmVnaXN0cnlXaWRnZXRMYWJlbE1hcC5kZWxldGUodGhpcy5iYXNlUmVnaXN0cnkpO1xuXHRcdFx0dGhpcy5fcmVnaXN0cnlJbmplY3RvckxhYmVsTWFwLmRlbGV0ZSh0aGlzLmJhc2VSZWdpc3RyeSk7XG5cdFx0fVxuXHRcdHRoaXMuYmFzZVJlZ2lzdHJ5ID0gYmFzZVJlZ2lzdHJ5O1xuXHR9XG5cblx0cHVibGljIGRlZmluZShsYWJlbDogUmVnaXN0cnlMYWJlbCwgd2lkZ2V0OiBSZWdpc3RyeUl0ZW0pOiB2b2lkIHtcblx0XHR0aGlzLl9yZWdpc3RyeS5kZWZpbmUobGFiZWwsIHdpZGdldCk7XG5cdH1cblxuXHRwdWJsaWMgZGVmaW5lSW5qZWN0b3IobGFiZWw6IFJlZ2lzdHJ5TGFiZWwsIGluamVjdG9yOiBJbmplY3RvckZhY3RvcnkpOiB2b2lkIHtcblx0XHR0aGlzLl9yZWdpc3RyeS5kZWZpbmVJbmplY3RvcihsYWJlbCwgaW5qZWN0b3IpO1xuXHR9XG5cblx0cHVibGljIGhhcyhsYWJlbDogUmVnaXN0cnlMYWJlbCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9yZWdpc3RyeS5oYXMobGFiZWwpIHx8IEJvb2xlYW4odGhpcy5iYXNlUmVnaXN0cnkgJiYgdGhpcy5iYXNlUmVnaXN0cnkuaGFzKGxhYmVsKSk7XG5cdH1cblxuXHRwdWJsaWMgaGFzSW5qZWN0b3IobGFiZWw6IFJlZ2lzdHJ5TGFiZWwpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5fcmVnaXN0cnkuaGFzSW5qZWN0b3IobGFiZWwpIHx8IEJvb2xlYW4odGhpcy5iYXNlUmVnaXN0cnkgJiYgdGhpcy5iYXNlUmVnaXN0cnkuaGFzSW5qZWN0b3IobGFiZWwpKTtcblx0fVxuXG5cdHB1YmxpYyBnZXQ8VCBleHRlbmRzIFdpZGdldEJhc2VJbnRlcmZhY2UgPSBXaWRnZXRCYXNlSW50ZXJmYWNlPihcblx0XHRsYWJlbDogUmVnaXN0cnlMYWJlbCxcblx0XHRnbG9iYWxQcmVjZWRlbmNlOiBib29sZWFuID0gZmFsc2Vcblx0KTogQ29uc3RydWN0b3I8VD4gfCBudWxsIHtcblx0XHRyZXR1cm4gdGhpcy5fZ2V0KGxhYmVsLCBnbG9iYWxQcmVjZWRlbmNlLCAnZ2V0JywgdGhpcy5fcmVnaXN0cnlXaWRnZXRMYWJlbE1hcCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0SW5qZWN0b3I8VD4obGFiZWw6IFJlZ2lzdHJ5TGFiZWwsIGdsb2JhbFByZWNlZGVuY2U6IGJvb2xlYW4gPSBmYWxzZSk6IEluamVjdG9ySXRlbTxUPiB8IG51bGwge1xuXHRcdHJldHVybiB0aGlzLl9nZXQobGFiZWwsIGdsb2JhbFByZWNlZGVuY2UsICdnZXRJbmplY3RvcicsIHRoaXMuX3JlZ2lzdHJ5SW5qZWN0b3JMYWJlbE1hcCk7XG5cdH1cblxuXHRwcml2YXRlIF9nZXQoXG5cdFx0bGFiZWw6IFJlZ2lzdHJ5TGFiZWwsXG5cdFx0Z2xvYmFsUHJlY2VkZW5jZTogYm9vbGVhbixcblx0XHRnZXRGdW5jdGlvbk5hbWU6ICdnZXRJbmplY3RvcicgfCAnZ2V0Jyxcblx0XHRsYWJlbE1hcDogTWFwPFJlZ2lzdHJ5LCBSZWdpc3RyeUxhYmVsW10+XG5cdCk6IGFueSB7XG5cdFx0Y29uc3QgcmVnaXN0cmllcyA9IGdsb2JhbFByZWNlZGVuY2UgPyBbdGhpcy5iYXNlUmVnaXN0cnksIHRoaXMuX3JlZ2lzdHJ5XSA6IFt0aGlzLl9yZWdpc3RyeSwgdGhpcy5iYXNlUmVnaXN0cnldO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcmVnaXN0cmllcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgcmVnaXN0cnk6IGFueSA9IHJlZ2lzdHJpZXNbaV07XG5cdFx0XHRpZiAoIXJlZ2lzdHJ5KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaXRlbSA9IHJlZ2lzdHJ5W2dldEZ1bmN0aW9uTmFtZV0obGFiZWwpO1xuXHRcdFx0Y29uc3QgcmVnaXN0ZXJlZExhYmVscyA9IGxhYmVsTWFwLmdldChyZWdpc3RyeSkgfHwgW107XG5cdFx0XHRpZiAoaXRlbSkge1xuXHRcdFx0XHRyZXR1cm4gaXRlbTtcblx0XHRcdH0gZWxzZSBpZiAocmVnaXN0ZXJlZExhYmVscy5pbmRleE9mKGxhYmVsKSA9PT0gLTEpIHtcblx0XHRcdFx0Y29uc3QgaGFuZGxlID0gcmVnaXN0cnkub24obGFiZWwsIChldmVudDogUmVnaXN0cnlFdmVudE9iamVjdCkgPT4ge1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdGV2ZW50LmFjdGlvbiA9PT0gJ2xvYWRlZCcgJiZcblx0XHRcdFx0XHRcdCh0aGlzIGFzIGFueSlbZ2V0RnVuY3Rpb25OYW1lXShsYWJlbCwgZ2xvYmFsUHJlY2VkZW5jZSkgPT09IGV2ZW50Lml0ZW1cblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdHRoaXMuZW1pdCh7IHR5cGU6ICdpbnZhbGlkYXRlJyB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR0aGlzLm93bihoYW5kbGUpO1xuXHRcdFx0XHRsYWJlbE1hcC5zZXQocmVnaXN0cnksIFsuLi5yZWdpc3RlcmVkTGFiZWxzLCBsYWJlbF0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBSZWdpc3RyeUhhbmRsZXI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gUmVnaXN0cnlIYW5kbGVyLnRzIiwiaW1wb3J0IE1hcCBmcm9tICdAZG9qby9zaGltL01hcCc7XG5pbXBvcnQgV2Vha01hcCBmcm9tICdAZG9qby9zaGltL1dlYWtNYXAnO1xuaW1wb3J0IFN5bWJvbCBmcm9tICdAZG9qby9zaGltL1N5bWJvbCc7XG5pbXBvcnQgeyBIYW5kbGUgfSBmcm9tICdAZG9qby9jb3JlL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgdiB9IGZyb20gJy4vZCc7XG5pbXBvcnQgeyBhdXRvIH0gZnJvbSAnLi9kaWZmJztcbmltcG9ydCB7XG5cdEFmdGVyUmVuZGVyLFxuXHRCZWZvcmVQcm9wZXJ0aWVzLFxuXHRCZWZvcmVSZW5kZXIsXG5cdENvcmVQcm9wZXJ0aWVzLFxuXHREaWZmUHJvcGVydHlSZWFjdGlvbixcblx0RE5vZGUsXG5cdFJlbmRlcixcblx0V2lkZ2V0TWV0YUJhc2UsXG5cdFdpZGdldE1ldGFDb25zdHJ1Y3Rvcixcblx0V2lkZ2V0QmFzZUludGVyZmFjZSxcblx0V2lkZ2V0UHJvcGVydGllc1xufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IFJlZ2lzdHJ5SGFuZGxlciBmcm9tICcuL1JlZ2lzdHJ5SGFuZGxlcic7XG5pbXBvcnQgTm9kZUhhbmRsZXIgZnJvbSAnLi9Ob2RlSGFuZGxlcic7XG5pbXBvcnQgeyB3aWRnZXRJbnN0YW5jZU1hcCB9IGZyb20gJy4vdmRvbSc7XG5pbXBvcnQgeyBpc1dpZGdldEJhc2VDb25zdHJ1Y3RvciwgV0lER0VUX0JBU0VfVFlQRSB9IGZyb20gJy4vUmVnaXN0cnknO1xuXG5pbnRlcmZhY2UgUmVhY3Rpb25GdW5jdGlvbkFyZ3VtZW50cyB7XG5cdHByZXZpb3VzUHJvcGVydGllczogYW55O1xuXHRuZXdQcm9wZXJ0aWVzOiBhbnk7XG5cdGNoYW5nZWQ6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBSZWFjdGlvbkZ1bmN0aW9uQ29uZmlnIHtcblx0cHJvcGVydHlOYW1lOiBzdHJpbmc7XG5cdHJlYWN0aW9uOiBEaWZmUHJvcGVydHlSZWFjdGlvbjtcbn1cblxuZXhwb3J0IHR5cGUgQm91bmRGdW5jdGlvbkRhdGEgPSB7IGJvdW5kRnVuYzogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk7IHNjb3BlOiBhbnkgfTtcblxuY29uc3QgZGVjb3JhdG9yTWFwID0gbmV3IE1hcDxGdW5jdGlvbiwgTWFwPHN0cmluZywgYW55W10+PigpO1xuY29uc3QgYm91bmRBdXRvID0gYXV0by5iaW5kKG51bGwpO1xuXG5leHBvcnQgY29uc3Qgbm9CaW5kID0gU3ltYm9sLmZvcignZG9qb05vQmluZCcpO1xuXG4vKipcbiAqIE1haW4gd2lkZ2V0IGJhc2UgZm9yIGFsbCB3aWRnZXRzIHRvIGV4dGVuZFxuICovXG5leHBvcnQgY2xhc3MgV2lkZ2V0QmFzZTxQID0gV2lkZ2V0UHJvcGVydGllcywgQyBleHRlbmRzIEROb2RlID0gRE5vZGU+IGltcGxlbWVudHMgV2lkZ2V0QmFzZUludGVyZmFjZTxQLCBDPiB7XG5cdC8qKlxuXHQgKiBzdGF0aWMgaWRlbnRpZmllclxuXHQgKi9cblx0c3RhdGljIF90eXBlOiBzeW1ib2wgPSBXSURHRVRfQkFTRV9UWVBFO1xuXG5cdC8qKlxuXHQgKiBjaGlsZHJlbiBhcnJheVxuXHQgKi9cblx0cHJpdmF0ZSBfY2hpbGRyZW46IChDIHwgbnVsbClbXTtcblxuXHQvKipcblx0ICogSW5kaWNhdGVzIGlmIGl0IGlzIHRoZSBpbml0aWFsIHNldCBwcm9wZXJ0aWVzIGN5Y2xlXG5cdCAqL1xuXHRwcml2YXRlIF9pbml0aWFsUHJvcGVydGllcyA9IHRydWU7XG5cblx0LyoqXG5cdCAqIGludGVybmFsIHdpZGdldCBwcm9wZXJ0aWVzXG5cdCAqL1xuXHRwcml2YXRlIF9wcm9wZXJ0aWVzOiBQICYgV2lkZ2V0UHJvcGVydGllcyAmIHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfTtcblxuXHQvKipcblx0ICogQXJyYXkgb2YgcHJvcGVydHkga2V5cyBjb25zaWRlcmVkIGNoYW5nZWQgZnJvbSB0aGUgcHJldmlvdXMgc2V0IHByb3BlcnRpZXNcblx0ICovXG5cdHByaXZhdGUgX2NoYW5nZWRQcm9wZXJ0eUtleXM6IHN0cmluZ1tdID0gW107XG5cblx0LyoqXG5cdCAqIG1hcCBvZiBkZWNvcmF0b3JzIHRoYXQgYXJlIGFwcGxpZWQgdG8gdGhpcyB3aWRnZXRcblx0ICovXG5cdHByaXZhdGUgX2RlY29yYXRvckNhY2hlOiBNYXA8c3RyaW5nLCBhbnlbXT47XG5cblx0cHJpdmF0ZSBfcmVnaXN0cnk6IFJlZ2lzdHJ5SGFuZGxlciB8IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogTWFwIG9mIGZ1bmN0aW9ucyBwcm9wZXJ0aWVzIGZvciB0aGUgYm91bmQgZnVuY3Rpb25cblx0ICovXG5cdHByaXZhdGUgX2JpbmRGdW5jdGlvblByb3BlcnR5TWFwOiBXZWFrTWFwPCguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBCb3VuZEZ1bmN0aW9uRGF0YT4gfCB1bmRlZmluZWQ7XG5cblx0cHJpdmF0ZSBfbWV0YU1hcDogTWFwPFdpZGdldE1ldGFDb25zdHJ1Y3Rvcjxhbnk+LCBXaWRnZXRNZXRhQmFzZT4gfCB1bmRlZmluZWQ7XG5cblx0cHJpdmF0ZSBfYm91bmRSZW5kZXJGdW5jOiBSZW5kZXI7XG5cblx0cHJpdmF0ZSBfYm91bmRJbnZhbGlkYXRlOiAoKSA9PiB2b2lkO1xuXG5cdHByaXZhdGUgX25vZGVIYW5kbGVyOiBOb2RlSGFuZGxlciA9IG5ldyBOb2RlSGFuZGxlcigpO1xuXG5cdHByaXZhdGUgX2hhbmRsZXM6IEhhbmRsZVtdID0gW107XG5cblx0LyoqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy5fY2hpbGRyZW4gPSBbXTtcblx0XHR0aGlzLl9kZWNvcmF0b3JDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBhbnlbXT4oKTtcblx0XHR0aGlzLl9wcm9wZXJ0aWVzID0gPFA+e307XG5cdFx0dGhpcy5fYm91bmRSZW5kZXJGdW5jID0gdGhpcy5yZW5kZXIuYmluZCh0aGlzKTtcblx0XHR0aGlzLl9ib3VuZEludmFsaWRhdGUgPSB0aGlzLmludmFsaWRhdGUuYmluZCh0aGlzKTtcblxuXHRcdHdpZGdldEluc3RhbmNlTWFwLnNldCh0aGlzLCB7XG5cdFx0XHRkaXJ0eTogdHJ1ZSxcblx0XHRcdG9uQXR0YWNoOiAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdHRoaXMub25BdHRhY2goKTtcblx0XHRcdH0sXG5cdFx0XHRvbkRldGFjaDogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHR0aGlzLm9uRGV0YWNoKCk7XG5cdFx0XHRcdHRoaXMuZGVzdHJveSgpO1xuXHRcdFx0fSxcblx0XHRcdG5vZGVIYW5kbGVyOiB0aGlzLl9ub2RlSGFuZGxlcixcblx0XHRcdHJlZ2lzdHJ5OiAoKSA9PiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnJlZ2lzdHJ5O1xuXHRcdFx0fSxcblx0XHRcdGNvcmVQcm9wZXJ0aWVzOiB7fSBhcyBDb3JlUHJvcGVydGllcyxcblx0XHRcdHJlbmRlcmluZzogZmFsc2UsXG5cdFx0XHRpbnB1dFByb3BlcnRpZXM6IHt9XG5cdFx0fSk7XG5cblx0XHR0aGlzLl9ydW5BZnRlckNvbnN0cnVjdG9ycygpO1xuXHR9XG5cblx0cHJvdGVjdGVkIG1ldGE8VCBleHRlbmRzIFdpZGdldE1ldGFCYXNlPihNZXRhVHlwZTogV2lkZ2V0TWV0YUNvbnN0cnVjdG9yPFQ+KTogVCB7XG5cdFx0aWYgKHRoaXMuX21ldGFNYXAgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5fbWV0YU1hcCA9IG5ldyBNYXA8V2lkZ2V0TWV0YUNvbnN0cnVjdG9yPGFueT4sIFdpZGdldE1ldGFCYXNlPigpO1xuXHRcdH1cblx0XHRsZXQgY2FjaGVkID0gdGhpcy5fbWV0YU1hcC5nZXQoTWV0YVR5cGUpO1xuXHRcdGlmICghY2FjaGVkKSB7XG5cdFx0XHRjYWNoZWQgPSBuZXcgTWV0YVR5cGUoe1xuXHRcdFx0XHRpbnZhbGlkYXRlOiB0aGlzLl9ib3VuZEludmFsaWRhdGUsXG5cdFx0XHRcdG5vZGVIYW5kbGVyOiB0aGlzLl9ub2RlSGFuZGxlcixcblx0XHRcdFx0YmluZDogdGhpc1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLm93bihjYWNoZWQpO1xuXHRcdFx0dGhpcy5fbWV0YU1hcC5zZXQoTWV0YVR5cGUsIGNhY2hlZCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNhY2hlZCBhcyBUO1xuXHR9XG5cblx0cHJvdGVjdGVkIG9uQXR0YWNoKCk6IHZvaWQge1xuXHRcdC8vIERvIG5vdGhpbmcgYnkgZGVmYXVsdC5cblx0fVxuXG5cdHByb3RlY3RlZCBvbkRldGFjaCgpOiB2b2lkIHtcblx0XHQvLyBEbyBub3RoaW5nIGJ5IGRlZmF1bHQuXG5cdH1cblxuXHRwdWJsaWMgZ2V0IHByb3BlcnRpZXMoKTogUmVhZG9ubHk8UD4gJiBSZWFkb25seTxXaWRnZXRQcm9wZXJ0aWVzPiB7XG5cdFx0cmV0dXJuIHRoaXMuX3Byb3BlcnRpZXM7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGNoYW5nZWRQcm9wZXJ0eUtleXMoKTogc3RyaW5nW10ge1xuXHRcdHJldHVybiBbLi4udGhpcy5fY2hhbmdlZFByb3BlcnR5S2V5c107XG5cdH1cblxuXHRwdWJsaWMgX19zZXRDb3JlUHJvcGVydGllc19fKGNvcmVQcm9wZXJ0aWVzOiBDb3JlUHJvcGVydGllcyk6IHZvaWQge1xuXHRcdGNvbnN0IHsgYmFzZVJlZ2lzdHJ5IH0gPSBjb3JlUHJvcGVydGllcztcblx0XHRjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQodGhpcykhO1xuXG5cdFx0aWYgKGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcy5iYXNlUmVnaXN0cnkgIT09IGJhc2VSZWdpc3RyeSkge1xuXHRcdFx0aWYgKHRoaXMuX3JlZ2lzdHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhpcy5fcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnlIYW5kbGVyKCk7XG5cdFx0XHRcdHRoaXMub3duKHRoaXMuX3JlZ2lzdHJ5KTtcblx0XHRcdFx0dGhpcy5vd24odGhpcy5fcmVnaXN0cnkub24oJ2ludmFsaWRhdGUnLCB0aGlzLl9ib3VuZEludmFsaWRhdGUpKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX3JlZ2lzdHJ5LmJhc2UgPSBiYXNlUmVnaXN0cnk7XG5cdFx0XHR0aGlzLmludmFsaWRhdGUoKTtcblx0XHR9XG5cdFx0aW5zdGFuY2VEYXRhLmNvcmVQcm9wZXJ0aWVzID0gY29yZVByb3BlcnRpZXM7XG5cdH1cblxuXHRwdWJsaWMgX19zZXRQcm9wZXJ0aWVzX18ob3JpZ2luYWxQcm9wZXJ0aWVzOiB0aGlzWydwcm9wZXJ0aWVzJ10pOiB2b2lkIHtcblx0XHRjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQodGhpcykhO1xuXHRcdGluc3RhbmNlRGF0YS5pbnB1dFByb3BlcnRpZXMgPSBvcmlnaW5hbFByb3BlcnRpZXM7XG5cdFx0Y29uc3QgcHJvcGVydGllcyA9IHRoaXMuX3J1bkJlZm9yZVByb3BlcnRpZXMob3JpZ2luYWxQcm9wZXJ0aWVzKTtcblx0XHRjb25zdCByZWdpc3RlcmVkRGlmZlByb3BlcnR5TmFtZXMgPSB0aGlzLmdldERlY29yYXRvcigncmVnaXN0ZXJlZERpZmZQcm9wZXJ0eScpO1xuXHRcdGNvbnN0IGNoYW5nZWRQcm9wZXJ0eUtleXM6IHN0cmluZ1tdID0gW107XG5cdFx0Y29uc3QgcHJvcGVydHlOYW1lcyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpO1xuXG5cdFx0aWYgKHRoaXMuX2luaXRpYWxQcm9wZXJ0aWVzID09PSBmYWxzZSB8fCByZWdpc3RlcmVkRGlmZlByb3BlcnR5TmFtZXMubGVuZ3RoICE9PSAwKSB7XG5cdFx0XHRjb25zdCBhbGxQcm9wZXJ0aWVzID0gWy4uLnByb3BlcnR5TmFtZXMsIC4uLk9iamVjdC5rZXlzKHRoaXMuX3Byb3BlcnRpZXMpXTtcblx0XHRcdGNvbnN0IGNoZWNrZWRQcm9wZXJ0aWVzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW107XG5cdFx0XHRjb25zdCBkaWZmUHJvcGVydHlSZXN1bHRzOiBhbnkgPSB7fTtcblx0XHRcdGxldCBydW5SZWFjdGlvbnMgPSBmYWxzZTtcblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhbGxQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IGFsbFByb3BlcnRpZXNbaV07XG5cdFx0XHRcdGlmIChjaGVja2VkUHJvcGVydGllcy5pbmRleE9mKHByb3BlcnR5TmFtZSkgIT09IC0xKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2hlY2tlZFByb3BlcnRpZXMucHVzaChwcm9wZXJ0eU5hbWUpO1xuXHRcdFx0XHRjb25zdCBwcmV2aW91c1Byb3BlcnR5ID0gdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuXHRcdFx0XHRjb25zdCBuZXdQcm9wZXJ0eSA9IHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5KFxuXHRcdFx0XHRcdHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSxcblx0XHRcdFx0XHRpbnN0YW5jZURhdGEuY29yZVByb3BlcnRpZXMuYmluZFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAocmVnaXN0ZXJlZERpZmZQcm9wZXJ0eU5hbWVzLmluZGV4T2YocHJvcGVydHlOYW1lKSAhPT0gLTEpIHtcblx0XHRcdFx0XHRydW5SZWFjdGlvbnMgPSB0cnVlO1xuXHRcdFx0XHRcdGNvbnN0IGRpZmZGdW5jdGlvbnMgPSB0aGlzLmdldERlY29yYXRvcihgZGlmZlByb3BlcnR5OiR7cHJvcGVydHlOYW1lfWApO1xuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZkZ1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gZGlmZkZ1bmN0aW9uc1tpXShwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSk7XG5cdFx0XHRcdFx0XHRpZiAocmVzdWx0LmNoYW5nZWQgJiYgY2hhbmdlZFByb3BlcnR5S2V5cy5pbmRleE9mKHByb3BlcnR5TmFtZSkgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdGNoYW5nZWRQcm9wZXJ0eUtleXMucHVzaChwcm9wZXJ0eU5hbWUpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKHByb3BlcnR5TmFtZSBpbiBwcm9wZXJ0aWVzKSB7XG5cdFx0XHRcdFx0XHRcdGRpZmZQcm9wZXJ0eVJlc3VsdHNbcHJvcGVydHlOYW1lXSA9IHJlc3VsdC52YWx1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gYm91bmRBdXRvKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcblx0XHRcdFx0XHRpZiAocmVzdWx0LmNoYW5nZWQgJiYgY2hhbmdlZFByb3BlcnR5S2V5cy5pbmRleE9mKHByb3BlcnR5TmFtZSkgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHRjaGFuZ2VkUHJvcGVydHlLZXlzLnB1c2gocHJvcGVydHlOYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHByb3BlcnR5TmFtZSBpbiBwcm9wZXJ0aWVzKSB7XG5cdFx0XHRcdFx0XHRkaWZmUHJvcGVydHlSZXN1bHRzW3Byb3BlcnR5TmFtZV0gPSByZXN1bHQudmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChydW5SZWFjdGlvbnMpIHtcblx0XHRcdFx0dGhpcy5fbWFwRGlmZlByb3BlcnR5UmVhY3Rpb25zKHByb3BlcnRpZXMsIGNoYW5nZWRQcm9wZXJ0eUtleXMpLmZvckVhY2goKGFyZ3MsIHJlYWN0aW9uKSA9PiB7XG5cdFx0XHRcdFx0aWYgKGFyZ3MuY2hhbmdlZCkge1xuXHRcdFx0XHRcdFx0cmVhY3Rpb24uY2FsbCh0aGlzLCBhcmdzLnByZXZpb3VzUHJvcGVydGllcywgYXJncy5uZXdQcm9wZXJ0aWVzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fcHJvcGVydGllcyA9IGRpZmZQcm9wZXJ0eVJlc3VsdHM7XG5cdFx0XHR0aGlzLl9jaGFuZ2VkUHJvcGVydHlLZXlzID0gY2hhbmdlZFByb3BlcnR5S2V5cztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5faW5pdGlhbFByb3BlcnRpZXMgPSBmYWxzZTtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWVzW2ldO1xuXHRcdFx0XHRpZiAodHlwZW9mIHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5KFxuXHRcdFx0XHRcdFx0cHJvcGVydGllc1twcm9wZXJ0eU5hbWVdLFxuXHRcdFx0XHRcdFx0aW5zdGFuY2VEYXRhLmNvcmVQcm9wZXJ0aWVzLmJpbmRcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNoYW5nZWRQcm9wZXJ0eUtleXMucHVzaChwcm9wZXJ0eU5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9jaGFuZ2VkUHJvcGVydHlLZXlzID0gY2hhbmdlZFByb3BlcnR5S2V5cztcblx0XHRcdHRoaXMuX3Byb3BlcnRpZXMgPSB7IC4uLnByb3BlcnRpZXMgfTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5fY2hhbmdlZFByb3BlcnR5S2V5cy5sZW5ndGggPiAwKSB7XG5cdFx0XHR0aGlzLmludmFsaWRhdGUoKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGNoaWxkcmVuKCk6IChDIHwgbnVsbClbXSB7XG5cdFx0cmV0dXJuIHRoaXMuX2NoaWxkcmVuO1xuXHR9XG5cblx0cHVibGljIF9fc2V0Q2hpbGRyZW5fXyhjaGlsZHJlbjogKEMgfCBudWxsKVtdKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuX2NoaWxkcmVuLmxlbmd0aCA+IDAgfHwgY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0dGhpcy5fY2hpbGRyZW4gPSBjaGlsZHJlbjtcblx0XHRcdHRoaXMuaW52YWxpZGF0ZSgpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBfX3JlbmRlcl9fKCk6IEROb2RlIHwgRE5vZGVbXSB7XG5cdFx0Y29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHRoaXMpITtcblx0XHRpbnN0YW5jZURhdGEuZGlydHkgPSBmYWxzZTtcblx0XHRjb25zdCByZW5kZXIgPSB0aGlzLl9ydW5CZWZvcmVSZW5kZXJzKCk7XG5cdFx0bGV0IGROb2RlID0gcmVuZGVyKCk7XG5cdFx0ZE5vZGUgPSB0aGlzLnJ1bkFmdGVyUmVuZGVycyhkTm9kZSk7XG5cdFx0dGhpcy5fbm9kZUhhbmRsZXIuY2xlYXIoKTtcblx0XHRyZXR1cm4gZE5vZGU7XG5cdH1cblxuXHRwdWJsaWMgaW52YWxpZGF0ZSgpOiB2b2lkIHtcblx0XHRjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQodGhpcykhO1xuXHRcdGlmIChpbnN0YW5jZURhdGEuaW52YWxpZGF0ZSkge1xuXHRcdFx0aW5zdGFuY2VEYXRhLmludmFsaWRhdGUoKTtcblx0XHR9XG5cdH1cblxuXHRwcm90ZWN0ZWQgcmVuZGVyKCk6IEROb2RlIHwgRE5vZGVbXSB7XG5cdFx0cmV0dXJuIHYoJ2RpdicsIHt9LCB0aGlzLmNoaWxkcmVuKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byBhZGQgZGVjb3JhdG9ycyB0byBXaWRnZXRCYXNlXG5cdCAqXG5cdCAqIEBwYXJhbSBkZWNvcmF0b3JLZXkgVGhlIGtleSBvZiB0aGUgZGVjb3JhdG9yXG5cdCAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGRlY29yYXRvclxuXHQgKi9cblx0cHJvdGVjdGVkIGFkZERlY29yYXRvcihkZWNvcmF0b3JLZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuXHRcdHZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG5cdFx0aWYgKHRoaXMuaGFzT3duUHJvcGVydHkoJ2NvbnN0cnVjdG9yJykpIHtcblx0XHRcdGxldCBkZWNvcmF0b3JMaXN0ID0gZGVjb3JhdG9yTWFwLmdldCh0aGlzLmNvbnN0cnVjdG9yKTtcblx0XHRcdGlmICghZGVjb3JhdG9yTGlzdCkge1xuXHRcdFx0XHRkZWNvcmF0b3JMaXN0ID0gbmV3IE1hcDxzdHJpbmcsIGFueVtdPigpO1xuXHRcdFx0XHRkZWNvcmF0b3JNYXAuc2V0KHRoaXMuY29uc3RydWN0b3IsIGRlY29yYXRvckxpc3QpO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgc3BlY2lmaWNEZWNvcmF0b3JMaXN0ID0gZGVjb3JhdG9yTGlzdC5nZXQoZGVjb3JhdG9yS2V5KTtcblx0XHRcdGlmICghc3BlY2lmaWNEZWNvcmF0b3JMaXN0KSB7XG5cdFx0XHRcdHNwZWNpZmljRGVjb3JhdG9yTGlzdCA9IFtdO1xuXHRcdFx0XHRkZWNvcmF0b3JMaXN0LnNldChkZWNvcmF0b3JLZXksIHNwZWNpZmljRGVjb3JhdG9yTGlzdCk7XG5cdFx0XHR9XG5cdFx0XHRzcGVjaWZpY0RlY29yYXRvckxpc3QucHVzaCguLi52YWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGRlY29yYXRvcnMgPSB0aGlzLmdldERlY29yYXRvcihkZWNvcmF0b3JLZXkpO1xuXHRcdFx0dGhpcy5fZGVjb3JhdG9yQ2FjaGUuc2V0KGRlY29yYXRvcktleSwgWy4uLmRlY29yYXRvcnMsIC4uLnZhbHVlXSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRvIGJ1aWxkIHRoZSBsaXN0IG9mIGRlY29yYXRvcnMgZnJvbSB0aGUgZ2xvYmFsIGRlY29yYXRvciBtYXAuXG5cdCAqXG5cdCAqIEBwYXJhbSBkZWNvcmF0b3JLZXkgIFRoZSBrZXkgb2YgdGhlIGRlY29yYXRvclxuXHQgKiBAcmV0dXJuIEFuIGFycmF5IG9mIGRlY29yYXRvciB2YWx1ZXNcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHByaXZhdGUgX2J1aWxkRGVjb3JhdG9yTGlzdChkZWNvcmF0b3JLZXk6IHN0cmluZyk6IGFueVtdIHtcblx0XHRjb25zdCBhbGxEZWNvcmF0b3JzID0gW107XG5cblx0XHRsZXQgY29uc3RydWN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yO1xuXG5cdFx0d2hpbGUgKGNvbnN0cnVjdG9yKSB7XG5cdFx0XHRjb25zdCBpbnN0YW5jZU1hcCA9IGRlY29yYXRvck1hcC5nZXQoY29uc3RydWN0b3IpO1xuXHRcdFx0aWYgKGluc3RhbmNlTWFwKSB7XG5cdFx0XHRcdGNvbnN0IGRlY29yYXRvcnMgPSBpbnN0YW5jZU1hcC5nZXQoZGVjb3JhdG9yS2V5KTtcblxuXHRcdFx0XHRpZiAoZGVjb3JhdG9ycykge1xuXHRcdFx0XHRcdGFsbERlY29yYXRvcnMudW5zaGlmdCguLi5kZWNvcmF0b3JzKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdHJ1Y3RvciA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjb25zdHJ1Y3Rvcik7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFsbERlY29yYXRvcnM7XG5cdH1cblxuXHQvKipcblx0ICogRnVuY3Rpb24gdG8gcmV0cmlldmUgZGVjb3JhdG9yIHZhbHVlc1xuXHQgKlxuXHQgKiBAcGFyYW0gZGVjb3JhdG9yS2V5IFRoZSBrZXkgb2YgdGhlIGRlY29yYXRvclxuXHQgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBkZWNvcmF0b3IgdmFsdWVzXG5cdCAqL1xuXHRwcm90ZWN0ZWQgZ2V0RGVjb3JhdG9yKGRlY29yYXRvcktleTogc3RyaW5nKTogYW55W10ge1xuXHRcdGxldCBhbGxEZWNvcmF0b3JzID0gdGhpcy5fZGVjb3JhdG9yQ2FjaGUuZ2V0KGRlY29yYXRvcktleSk7XG5cblx0XHRpZiAoYWxsRGVjb3JhdG9ycyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gYWxsRGVjb3JhdG9ycztcblx0XHR9XG5cblx0XHRhbGxEZWNvcmF0b3JzID0gdGhpcy5fYnVpbGREZWNvcmF0b3JMaXN0KGRlY29yYXRvcktleSk7XG5cblx0XHR0aGlzLl9kZWNvcmF0b3JDYWNoZS5zZXQoZGVjb3JhdG9yS2V5LCBhbGxEZWNvcmF0b3JzKTtcblx0XHRyZXR1cm4gYWxsRGVjb3JhdG9ycztcblx0fVxuXG5cdHByaXZhdGUgX21hcERpZmZQcm9wZXJ0eVJlYWN0aW9ucyhcblx0XHRuZXdQcm9wZXJ0aWVzOiBhbnksXG5cdFx0Y2hhbmdlZFByb3BlcnR5S2V5czogc3RyaW5nW11cblx0KTogTWFwPEZ1bmN0aW9uLCBSZWFjdGlvbkZ1bmN0aW9uQXJndW1lbnRzPiB7XG5cdFx0Y29uc3QgcmVhY3Rpb25GdW5jdGlvbnM6IFJlYWN0aW9uRnVuY3Rpb25Db25maWdbXSA9IHRoaXMuZ2V0RGVjb3JhdG9yKCdkaWZmUmVhY3Rpb24nKTtcblxuXHRcdHJldHVybiByZWFjdGlvbkZ1bmN0aW9ucy5yZWR1Y2UoKHJlYWN0aW9uUHJvcGVydHlNYXAsIHsgcmVhY3Rpb24sIHByb3BlcnR5TmFtZSB9KSA9PiB7XG5cdFx0XHRsZXQgcmVhY3Rpb25Bcmd1bWVudHMgPSByZWFjdGlvblByb3BlcnR5TWFwLmdldChyZWFjdGlvbik7XG5cdFx0XHRpZiAocmVhY3Rpb25Bcmd1bWVudHMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZWFjdGlvbkFyZ3VtZW50cyA9IHtcblx0XHRcdFx0XHRwcmV2aW91c1Byb3BlcnRpZXM6IHt9LFxuXHRcdFx0XHRcdG5ld1Byb3BlcnRpZXM6IHt9LFxuXHRcdFx0XHRcdGNoYW5nZWQ6IGZhbHNlXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHRyZWFjdGlvbkFyZ3VtZW50cy5wcmV2aW91c1Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHRoaXMuX3Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcblx0XHRcdHJlYWN0aW9uQXJndW1lbnRzLm5ld1Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IG5ld1Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcblx0XHRcdGlmIChjaGFuZ2VkUHJvcGVydHlLZXlzLmluZGV4T2YocHJvcGVydHlOYW1lKSAhPT0gLTEpIHtcblx0XHRcdFx0cmVhY3Rpb25Bcmd1bWVudHMuY2hhbmdlZCA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZWFjdGlvblByb3BlcnR5TWFwLnNldChyZWFjdGlvbiwgcmVhY3Rpb25Bcmd1bWVudHMpO1xuXHRcdFx0cmV0dXJuIHJlYWN0aW9uUHJvcGVydHlNYXA7XG5cdFx0fSwgbmV3IE1hcDxGdW5jdGlvbiwgUmVhY3Rpb25GdW5jdGlvbkFyZ3VtZW50cz4oKSk7XG5cdH1cblxuXHQvKipcblx0ICogQmluZHMgdW5ib3VuZCBwcm9wZXJ0eSBmdW5jdGlvbnMgdG8gdGhlIHNwZWNpZmllZCBgYmluZGAgcHJvcGVydHlcblx0ICpcblx0ICogQHBhcmFtIHByb3BlcnRpZXMgcHJvcGVydGllcyB0byBjaGVjayBmb3IgZnVuY3Rpb25zXG5cdCAqL1xuXHRwcml2YXRlIF9iaW5kRnVuY3Rpb25Qcm9wZXJ0eShwcm9wZXJ0eTogYW55LCBiaW5kOiBhbnkpOiBhbnkge1xuXHRcdGlmICh0eXBlb2YgcHJvcGVydHkgPT09ICdmdW5jdGlvbicgJiYgIXByb3BlcnR5W25vQmluZF0gJiYgaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IocHJvcGVydHkpID09PSBmYWxzZSkge1xuXHRcdFx0aWYgKHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5TWFwID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhpcy5fYmluZEZ1bmN0aW9uUHJvcGVydHlNYXAgPSBuZXcgV2Vha01hcDxcblx0XHRcdFx0XHQoLi4uYXJnczogYW55W10pID0+IGFueSxcblx0XHRcdFx0XHR7IGJvdW5kRnVuYzogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk7IHNjb3BlOiBhbnkgfVxuXHRcdFx0XHQ+KCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBiaW5kSW5mbzogUGFydGlhbDxCb3VuZEZ1bmN0aW9uRGF0YT4gPSB0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eU1hcC5nZXQocHJvcGVydHkpIHx8IHt9O1xuXHRcdFx0bGV0IHsgYm91bmRGdW5jLCBzY29wZSB9ID0gYmluZEluZm87XG5cblx0XHRcdGlmIChib3VuZEZ1bmMgPT09IHVuZGVmaW5lZCB8fCBzY29wZSAhPT0gYmluZCkge1xuXHRcdFx0XHRib3VuZEZ1bmMgPSBwcm9wZXJ0eS5iaW5kKGJpbmQpIGFzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuXHRcdFx0XHR0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eU1hcC5zZXQocHJvcGVydHksIHsgYm91bmRGdW5jLCBzY29wZTogYmluZCB9KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBib3VuZEZ1bmM7XG5cdFx0fVxuXHRcdHJldHVybiBwcm9wZXJ0eTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgcmVnaXN0cnkoKTogUmVnaXN0cnlIYW5kbGVyIHtcblx0XHRpZiAodGhpcy5fcmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5fcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnlIYW5kbGVyKCk7XG5cdFx0XHR0aGlzLm93bih0aGlzLl9yZWdpc3RyeSk7XG5cdFx0XHR0aGlzLm93bih0aGlzLl9yZWdpc3RyeS5vbignaW52YWxpZGF0ZScsIHRoaXMuX2JvdW5kSW52YWxpZGF0ZSkpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5fcmVnaXN0cnk7XG5cdH1cblxuXHRwcml2YXRlIF9ydW5CZWZvcmVQcm9wZXJ0aWVzKHByb3BlcnRpZXM6IGFueSkge1xuXHRcdGNvbnN0IGJlZm9yZVByb3BlcnRpZXM6IEJlZm9yZVByb3BlcnRpZXNbXSA9IHRoaXMuZ2V0RGVjb3JhdG9yKCdiZWZvcmVQcm9wZXJ0aWVzJyk7XG5cdFx0aWYgKGJlZm9yZVByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0cmV0dXJuIGJlZm9yZVByb3BlcnRpZXMucmVkdWNlKFxuXHRcdFx0XHQocHJvcGVydGllcywgYmVmb3JlUHJvcGVydGllc0Z1bmN0aW9uKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHsgLi4ucHJvcGVydGllcywgLi4uYmVmb3JlUHJvcGVydGllc0Z1bmN0aW9uLmNhbGwodGhpcywgcHJvcGVydGllcykgfTtcblx0XHRcdFx0fSxcblx0XHRcdFx0eyAuLi5wcm9wZXJ0aWVzIH1cblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiBwcm9wZXJ0aWVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJ1biBhbGwgcmVnaXN0ZXJlZCBiZWZvcmUgcmVuZGVycyBhbmQgcmV0dXJuIHRoZSB1cGRhdGVkIHJlbmRlciBtZXRob2Rcblx0ICovXG5cdHByaXZhdGUgX3J1bkJlZm9yZVJlbmRlcnMoKTogUmVuZGVyIHtcblx0XHRjb25zdCBiZWZvcmVSZW5kZXJzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2JlZm9yZVJlbmRlcicpO1xuXG5cdFx0aWYgKGJlZm9yZVJlbmRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0cmV0dXJuIGJlZm9yZVJlbmRlcnMucmVkdWNlKChyZW5kZXI6IFJlbmRlciwgYmVmb3JlUmVuZGVyRnVuY3Rpb246IEJlZm9yZVJlbmRlcikgPT4ge1xuXHRcdFx0XHRjb25zdCB1cGRhdGVkUmVuZGVyID0gYmVmb3JlUmVuZGVyRnVuY3Rpb24uY2FsbCh0aGlzLCByZW5kZXIsIHRoaXMuX3Byb3BlcnRpZXMsIHRoaXMuX2NoaWxkcmVuKTtcblx0XHRcdFx0aWYgKCF1cGRhdGVkUmVuZGVyKSB7XG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCdSZW5kZXIgZnVuY3Rpb24gbm90IHJldHVybmVkIGZyb20gYmVmb3JlUmVuZGVyLCB1c2luZyBwcmV2aW91cyByZW5kZXInKTtcblx0XHRcdFx0XHRyZXR1cm4gcmVuZGVyO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB1cGRhdGVkUmVuZGVyO1xuXHRcdFx0fSwgdGhpcy5fYm91bmRSZW5kZXJGdW5jKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuX2JvdW5kUmVuZGVyRnVuYztcblx0fVxuXG5cdC8qKlxuXHQgKiBSdW4gYWxsIHJlZ2lzdGVyZWQgYWZ0ZXIgcmVuZGVycyBhbmQgcmV0dXJuIHRoZSBkZWNvcmF0ZWQgRE5vZGVzXG5cdCAqXG5cdCAqIEBwYXJhbSBkTm9kZSBUaGUgRE5vZGVzIHRvIHJ1biB0aHJvdWdoIHRoZSBhZnRlciByZW5kZXJzXG5cdCAqL1xuXHRwcm90ZWN0ZWQgcnVuQWZ0ZXJSZW5kZXJzKGROb2RlOiBETm9kZSB8IEROb2RlW10pOiBETm9kZSB8IEROb2RlW10ge1xuXHRcdGNvbnN0IGFmdGVyUmVuZGVycyA9IHRoaXMuZ2V0RGVjb3JhdG9yKCdhZnRlclJlbmRlcicpO1xuXG5cdFx0aWYgKGFmdGVyUmVuZGVycy5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZXR1cm4gYWZ0ZXJSZW5kZXJzLnJlZHVjZSgoZE5vZGU6IEROb2RlIHwgRE5vZGVbXSwgYWZ0ZXJSZW5kZXJGdW5jdGlvbjogQWZ0ZXJSZW5kZXIpID0+IHtcblx0XHRcdFx0cmV0dXJuIGFmdGVyUmVuZGVyRnVuY3Rpb24uY2FsbCh0aGlzLCBkTm9kZSk7XG5cdFx0XHR9LCBkTm9kZSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX21ldGFNYXAgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5fbWV0YU1hcC5mb3JFYWNoKChtZXRhKSA9PiB7XG5cdFx0XHRcdG1ldGEuYWZ0ZXJSZW5kZXIoKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiBkTm9kZTtcblx0fVxuXG5cdHByaXZhdGUgX3J1bkFmdGVyQ29uc3RydWN0b3JzKCk6IHZvaWQge1xuXHRcdGNvbnN0IGFmdGVyQ29uc3RydWN0b3JzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2FmdGVyQ29uc3RydWN0b3InKTtcblxuXHRcdGlmIChhZnRlckNvbnN0cnVjdG9ycy5sZW5ndGggPiAwKSB7XG5cdFx0XHRhZnRlckNvbnN0cnVjdG9ycy5mb3JFYWNoKChhZnRlckNvbnN0cnVjdG9yKSA9PiBhZnRlckNvbnN0cnVjdG9yLmNhbGwodGhpcykpO1xuXHRcdH1cblx0fVxuXG5cdHByb3RlY3RlZCBvd24oaGFuZGxlOiBIYW5kbGUpOiB2b2lkIHtcblx0XHR0aGlzLl9oYW5kbGVzLnB1c2goaGFuZGxlKTtcblx0fVxuXG5cdHByb3RlY3RlZCBkZXN0cm95KCkge1xuXHRcdHdoaWxlICh0aGlzLl9oYW5kbGVzLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IGhhbmRsZSA9IHRoaXMuX2hhbmRsZXMucG9wKCk7XG5cdFx0XHRpZiAoaGFuZGxlKSB7XG5cdFx0XHRcdGhhbmRsZS5kZXN0cm95KCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFdpZGdldEJhc2U7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gV2lkZ2V0QmFzZS50cyIsImltcG9ydCB7IFZOb2RlUHJvcGVydGllcyB9IGZyb20gJy4vLi4vaW50ZXJmYWNlcyc7XG5cbmxldCBicm93c2VyU3BlY2lmaWNUcmFuc2l0aW9uRW5kRXZlbnROYW1lID0gJyc7XG5sZXQgYnJvd3NlclNwZWNpZmljQW5pbWF0aW9uRW5kRXZlbnROYW1lID0gJyc7XG5cbmZ1bmN0aW9uIGRldGVybWluZUJyb3dzZXJTdHlsZU5hbWVzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG5cdGlmICgnV2Via2l0VHJhbnNpdGlvbicgaW4gZWxlbWVudC5zdHlsZSkge1xuXHRcdGJyb3dzZXJTcGVjaWZpY1RyYW5zaXRpb25FbmRFdmVudE5hbWUgPSAnd2Via2l0VHJhbnNpdGlvbkVuZCc7XG5cdFx0YnJvd3NlclNwZWNpZmljQW5pbWF0aW9uRW5kRXZlbnROYW1lID0gJ3dlYmtpdEFuaW1hdGlvbkVuZCc7XG5cdH0gZWxzZSBpZiAoJ3RyYW5zaXRpb24nIGluIGVsZW1lbnQuc3R5bGUgfHwgJ01velRyYW5zaXRpb24nIGluIGVsZW1lbnQuc3R5bGUpIHtcblx0XHRicm93c2VyU3BlY2lmaWNUcmFuc2l0aW9uRW5kRXZlbnROYW1lID0gJ3RyYW5zaXRpb25lbmQnO1xuXHRcdGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSA9ICdhbmltYXRpb25lbmQnO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcignWW91ciBicm93c2VyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcblx0fVxufVxuXG5mdW5jdGlvbiBpbml0aWFsaXplKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG5cdGlmIChicm93c2VyU3BlY2lmaWNBbmltYXRpb25FbmRFdmVudE5hbWUgPT09ICcnKSB7XG5cdFx0ZGV0ZXJtaW5lQnJvd3NlclN0eWxlTmFtZXMoZWxlbWVudCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gcnVuQW5kQ2xlYW5VcChlbGVtZW50OiBIVE1MRWxlbWVudCwgc3RhcnRBbmltYXRpb246ICgpID0+IHZvaWQsIGZpbmlzaEFuaW1hdGlvbjogKCkgPT4gdm9pZCkge1xuXHRpbml0aWFsaXplKGVsZW1lbnQpO1xuXG5cdGxldCBmaW5pc2hlZCA9IGZhbHNlO1xuXG5cdGxldCB0cmFuc2l0aW9uRW5kID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCFmaW5pc2hlZCkge1xuXHRcdFx0ZmluaXNoZWQgPSB0cnVlO1xuXHRcdFx0ZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGJyb3dzZXJTcGVjaWZpY1RyYW5zaXRpb25FbmRFdmVudE5hbWUsIHRyYW5zaXRpb25FbmQpO1xuXHRcdFx0ZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSwgdHJhbnNpdGlvbkVuZCk7XG5cblx0XHRcdGZpbmlzaEFuaW1hdGlvbigpO1xuXHRcdH1cblx0fTtcblxuXHRzdGFydEFuaW1hdGlvbigpO1xuXG5cdGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihicm93c2VyU3BlY2lmaWNBbmltYXRpb25FbmRFdmVudE5hbWUsIHRyYW5zaXRpb25FbmQpO1xuXHRlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoYnJvd3NlclNwZWNpZmljVHJhbnNpdGlvbkVuZEV2ZW50TmFtZSwgdHJhbnNpdGlvbkVuZCk7XG59XG5cbmZ1bmN0aW9uIGV4aXQobm9kZTogSFRNTEVsZW1lbnQsIHByb3BlcnRpZXM6IFZOb2RlUHJvcGVydGllcywgZXhpdEFuaW1hdGlvbjogc3RyaW5nLCByZW1vdmVOb2RlOiAoKSA9PiB2b2lkKSB7XG5cdGNvbnN0IGFjdGl2ZUNsYXNzID0gcHJvcGVydGllcy5leGl0QW5pbWF0aW9uQWN0aXZlIHx8IGAke2V4aXRBbmltYXRpb259LWFjdGl2ZWA7XG5cblx0cnVuQW5kQ2xlYW5VcChcblx0XHRub2RlLFxuXHRcdCgpID0+IHtcblx0XHRcdG5vZGUuY2xhc3NMaXN0LmFkZChleGl0QW5pbWF0aW9uKTtcblxuXHRcdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRub2RlLmNsYXNzTGlzdC5hZGQoYWN0aXZlQ2xhc3MpO1xuXHRcdFx0fSk7XG5cdFx0fSxcblx0XHQoKSA9PiB7XG5cdFx0XHRyZW1vdmVOb2RlKCk7XG5cdFx0fVxuXHQpO1xufVxuXG5mdW5jdGlvbiBlbnRlcihub2RlOiBIVE1MRWxlbWVudCwgcHJvcGVydGllczogVk5vZGVQcm9wZXJ0aWVzLCBlbnRlckFuaW1hdGlvbjogc3RyaW5nKSB7XG5cdGNvbnN0IGFjdGl2ZUNsYXNzID0gcHJvcGVydGllcy5lbnRlckFuaW1hdGlvbkFjdGl2ZSB8fCBgJHtlbnRlckFuaW1hdGlvbn0tYWN0aXZlYDtcblxuXHRydW5BbmRDbGVhblVwKFxuXHRcdG5vZGUsXG5cdFx0KCkgPT4ge1xuXHRcdFx0bm9kZS5jbGFzc0xpc3QuYWRkKGVudGVyQW5pbWF0aW9uKTtcblxuXHRcdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRub2RlLmNsYXNzTGlzdC5hZGQoYWN0aXZlQ2xhc3MpO1xuXHRcdFx0fSk7XG5cdFx0fSxcblx0XHQoKSA9PiB7XG5cdFx0XHRub2RlLmNsYXNzTGlzdC5yZW1vdmUoZW50ZXJBbmltYXRpb24pO1xuXHRcdFx0bm9kZS5jbGFzc0xpc3QucmVtb3ZlKGFjdGl2ZUNsYXNzKTtcblx0XHR9XG5cdCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcblx0ZW50ZXIsXG5cdGV4aXRcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gY3NzVHJhbnNpdGlvbnMudHMiLCJpbXBvcnQgU3ltYm9sIGZyb20gJ0Bkb2pvL3NoaW0vU3ltYm9sJztcbmltcG9ydCB7XG5cdENvbnN0cnVjdG9yLFxuXHREZWZhdWx0V2lkZ2V0QmFzZUludGVyZmFjZSxcblx0RGVmZXJyZWRWaXJ0dWFsUHJvcGVydGllcyxcblx0RE5vZGUsXG5cdFZOb2RlLFxuXHRSZWdpc3RyeUxhYmVsLFxuXHRWTm9kZVByb3BlcnRpZXMsXG5cdFdpZGdldEJhc2VJbnRlcmZhY2UsXG5cdFdOb2RlLFxuXHREb21PcHRpb25zXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFZOb2RlLCBSZW5kZXJSZXN1bHQgfSBmcm9tICcuL3Zkb20nO1xuXG4vKipcbiAqIFRoZSBzeW1ib2wgaWRlbnRpZmllciBmb3IgYSBXTm9kZSB0eXBlXG4gKi9cbmV4cG9ydCBjb25zdCBXTk9ERSA9IFN5bWJvbCgnSWRlbnRpZmllciBmb3IgYSBXTm9kZS4nKTtcblxuLyoqXG4gKiBUaGUgc3ltYm9sIGlkZW50aWZpZXIgZm9yIGEgVk5vZGUgdHlwZVxuICovXG5leHBvcnQgY29uc3QgVk5PREUgPSBTeW1ib2woJ0lkZW50aWZpZXIgZm9yIGEgVk5vZGUuJyk7XG5cbi8qKlxuICogVGhlIHN5bWJvbCBpZGVudGlmaWVyIGZvciBhIFZOb2RlIHR5cGUgY3JlYXRlZCB1c2luZyBkb20oKVxuICovXG5leHBvcnQgY29uc3QgRE9NVk5PREUgPSBTeW1ib2woJ0lkZW50aWZpZXIgZm9yIGEgVk5vZGUgY3JlYXRlZCB1c2luZyBleGlzdGluZyBkb20uJyk7XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBgRE5vZGVgIGlzIGEgYFdOb2RlYCB1c2luZyB0aGUgYHR5cGVgIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1dOb2RlPFcgZXh0ZW5kcyBXaWRnZXRCYXNlSW50ZXJmYWNlID0gRGVmYXVsdFdpZGdldEJhc2VJbnRlcmZhY2U+KFxuXHRjaGlsZDogRE5vZGU8Vz5cbik6IGNoaWxkIGlzIFdOb2RlPFc+IHtcblx0cmV0dXJuIEJvb2xlYW4oY2hpbGQgJiYgdHlwZW9mIGNoaWxkICE9PSAnc3RyaW5nJyAmJiBjaGlsZC50eXBlID09PSBXTk9ERSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBgRE5vZGVgIGlzIGEgYFZOb2RlYCB1c2luZyB0aGUgYHR5cGVgIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZOb2RlKGNoaWxkOiBETm9kZSk6IGNoaWxkIGlzIFZOb2RlIHtcblx0cmV0dXJuIEJvb2xlYW4oY2hpbGQgJiYgdHlwZW9mIGNoaWxkICE9PSAnc3RyaW5nJyAmJiAoY2hpbGQudHlwZSA9PT0gVk5PREUgfHwgY2hpbGQudHlwZSA9PT0gRE9NVk5PREUpKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIGBETm9kZWAgaXMgYSBgVk5vZGVgIGNyZWF0ZWQgd2l0aCBgZG9tKClgIHVzaW5nIHRoZSBgdHlwZWAgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRG9tVk5vZGUoY2hpbGQ6IEROb2RlKTogY2hpbGQgaXMgVk5vZGUge1xuXHRyZXR1cm4gQm9vbGVhbihjaGlsZCAmJiB0eXBlb2YgY2hpbGQgIT09ICdzdHJpbmcnICYmIGNoaWxkLnR5cGUgPT09IERPTVZOT0RFKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRWxlbWVudE5vZGUodmFsdWU6IGFueSk6IHZhbHVlIGlzIEVsZW1lbnQge1xuXHRyZXR1cm4gISF2YWx1ZS50YWdOYW1lO1xufVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgdGhlIGRlY29yYXRlIG1vZGlmaWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kaWZpZXI8VCBleHRlbmRzIEROb2RlPiB7XG5cdChkTm9kZTogVCwgYnJlYWtlcjogKCkgPT4gdm9pZCk6IHZvaWQ7XG59XG5cbi8qKlxuICogVGhlIHByZWRpY2F0ZSBmdW5jdGlvbiBmb3IgZGVjb3JhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVkaWNhdGU8VCBleHRlbmRzIEROb2RlPiB7XG5cdChkTm9kZTogRE5vZGUpOiBkTm9kZSBpcyBUO1xufVxuXG4vKipcbiAqIERlY29yYXRvciBvcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVjb3JhdGVPcHRpb25zPFQgZXh0ZW5kcyBETm9kZT4ge1xuXHRtb2RpZmllcjogTW9kaWZpZXI8VD47XG5cdHByZWRpY2F0ZT86IFByZWRpY2F0ZTxUPjtcblx0c2hhbGxvdz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogR2VuZXJpYyBkZWNvcmF0ZSBmdW5jdGlvbiBmb3IgRE5vZGVzLiBUaGUgbm9kZXMgYXJlIG1vZGlmaWVkIGluIHBsYWNlIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwcmVkaWNhdGVcbiAqIGFuZCBtb2RpZmllciBmdW5jdGlvbnMuXG4gKlxuICogVGhlIGNoaWxkcmVuIG9mIGVhY2ggbm9kZSBhcmUgZmxhdHRlbmVkIGFuZCBhZGRlZCB0byB0aGUgYXJyYXkgZm9yIGRlY29yYXRpb24uXG4gKlxuICogSWYgbm8gcHJlZGljYXRlIGlzIHN1cHBsaWVkIHRoZW4gdGhlIG1vZGlmaWVyIHdpbGwgYmUgZXhlY3V0ZWQgb24gYWxsIG5vZGVzLiBBIGBicmVha2VyYCBmdW5jdGlvbiBpcyBwYXNzZWQgdG8gdGhlXG4gKiBtb2RpZmllciB3aGljaCB3aWxsIGRyYWluIHRoZSBub2RlcyBhcnJheSBhbmQgZXhpdCB0aGUgZGVjb3JhdGlvbi5cbiAqXG4gKiBXaGVuIHRoZSBgc2hhbGxvd2Agb3B0aW9ucyBpcyBzZXQgdG8gYHRydWVgIHRoZSBvbmx5IHRoZSB0b3Agbm9kZSBvciBub2RlcyB3aWxsIGJlIGRlY29yYXRlZCAob25seSBzdXBwb3J0ZWQgdXNpbmdcbiAqIGBEZWNvcmF0ZU9wdGlvbnNgKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29yYXRlPFQgZXh0ZW5kcyBETm9kZT4oZE5vZGVzOiBETm9kZSwgb3B0aW9uczogRGVjb3JhdGVPcHRpb25zPFQ+KTogRE5vZGU7XG5leHBvcnQgZnVuY3Rpb24gZGVjb3JhdGU8VCBleHRlbmRzIEROb2RlPihkTm9kZXM6IEROb2RlW10sIG9wdGlvbnM6IERlY29yYXRlT3B0aW9uczxUPik6IEROb2RlW107XG5leHBvcnQgZnVuY3Rpb24gZGVjb3JhdGU8VCBleHRlbmRzIEROb2RlPihkTm9kZXM6IEROb2RlIHwgRE5vZGVbXSwgb3B0aW9uczogRGVjb3JhdGVPcHRpb25zPFQ+KTogRE5vZGUgfCBETm9kZVtdO1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29yYXRlPFQgZXh0ZW5kcyBETm9kZT4oZE5vZGVzOiBETm9kZSwgbW9kaWZpZXI6IE1vZGlmaWVyPFQ+LCBwcmVkaWNhdGU6IFByZWRpY2F0ZTxUPik6IEROb2RlO1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29yYXRlPFQgZXh0ZW5kcyBETm9kZT4oZE5vZGVzOiBETm9kZVtdLCBtb2RpZmllcjogTW9kaWZpZXI8VD4sIHByZWRpY2F0ZTogUHJlZGljYXRlPFQ+KTogRE5vZGVbXTtcbmV4cG9ydCBmdW5jdGlvbiBkZWNvcmF0ZTxUIGV4dGVuZHMgRE5vZGU+KFxuXHRkTm9kZXM6IFJlbmRlclJlc3VsdCxcblx0bW9kaWZpZXI6IE1vZGlmaWVyPFQ+LFxuXHRwcmVkaWNhdGU6IFByZWRpY2F0ZTxUPlxuKTogUmVuZGVyUmVzdWx0O1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29yYXRlKGROb2RlczogRE5vZGUsIG1vZGlmaWVyOiBNb2RpZmllcjxETm9kZT4pOiBETm9kZTtcbmV4cG9ydCBmdW5jdGlvbiBkZWNvcmF0ZShkTm9kZXM6IEROb2RlW10sIG1vZGlmaWVyOiBNb2RpZmllcjxETm9kZT4pOiBETm9kZVtdO1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29yYXRlKGROb2RlczogUmVuZGVyUmVzdWx0LCBtb2RpZmllcjogTW9kaWZpZXI8RE5vZGU+KTogUmVuZGVyUmVzdWx0O1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29yYXRlKFxuXHRkTm9kZXM6IEROb2RlIHwgRE5vZGVbXSxcblx0b3B0aW9uc09yTW9kaWZpZXI6IE1vZGlmaWVyPEROb2RlPiB8IERlY29yYXRlT3B0aW9uczxETm9kZT4sXG5cdHByZWRpY2F0ZT86IFByZWRpY2F0ZTxETm9kZT5cbik6IEROb2RlIHwgRE5vZGVbXSB7XG5cdGxldCBzaGFsbG93ID0gZmFsc2U7XG5cdGxldCBtb2RpZmllcjtcblx0aWYgKHR5cGVvZiBvcHRpb25zT3JNb2RpZmllciA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdG1vZGlmaWVyID0gb3B0aW9uc09yTW9kaWZpZXI7XG5cdH0gZWxzZSB7XG5cdFx0bW9kaWZpZXIgPSBvcHRpb25zT3JNb2RpZmllci5tb2RpZmllcjtcblx0XHRwcmVkaWNhdGUgPSBvcHRpb25zT3JNb2RpZmllci5wcmVkaWNhdGU7XG5cdFx0c2hhbGxvdyA9IG9wdGlvbnNPck1vZGlmaWVyLnNoYWxsb3cgfHwgZmFsc2U7XG5cdH1cblxuXHRsZXQgbm9kZXMgPSBBcnJheS5pc0FycmF5KGROb2RlcykgPyBbLi4uZE5vZGVzXSA6IFtkTm9kZXNdO1xuXHRmdW5jdGlvbiBicmVha2VyKCkge1xuXHRcdG5vZGVzID0gW107XG5cdH1cblx0d2hpbGUgKG5vZGVzLmxlbmd0aCkge1xuXHRcdGNvbnN0IG5vZGUgPSBub2Rlcy5zaGlmdCgpO1xuXHRcdGlmIChub2RlKSB7XG5cdFx0XHRpZiAoIXNoYWxsb3cgJiYgKGlzV05vZGUobm9kZSkgfHwgaXNWTm9kZShub2RlKSkgJiYgbm9kZS5jaGlsZHJlbikge1xuXHRcdFx0XHRub2RlcyA9IFsuLi5ub2RlcywgLi4ubm9kZS5jaGlsZHJlbl07XG5cdFx0XHR9XG5cdFx0XHRpZiAoIXByZWRpY2F0ZSB8fCBwcmVkaWNhdGUobm9kZSkpIHtcblx0XHRcdFx0bW9kaWZpZXIobm9kZSwgYnJlYWtlcik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBkTm9kZXM7XG59XG5cbi8qKlxuICogV3JhcHBlciBmdW5jdGlvbiBmb3IgY2FsbHMgdG8gY3JlYXRlIGEgd2lkZ2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdzxXIGV4dGVuZHMgV2lkZ2V0QmFzZUludGVyZmFjZT4oXG5cdHdpZGdldENvbnN0cnVjdG9yOiBDb25zdHJ1Y3RvcjxXPiB8IFJlZ2lzdHJ5TGFiZWwsXG5cdHByb3BlcnRpZXM6IFdbJ3Byb3BlcnRpZXMnXSxcblx0Y2hpbGRyZW46IFdbJ2NoaWxkcmVuJ10gPSBbXVxuKTogV05vZGU8Vz4ge1xuXHRyZXR1cm4ge1xuXHRcdGNoaWxkcmVuLFxuXHRcdHdpZGdldENvbnN0cnVjdG9yLFxuXHRcdHByb3BlcnRpZXMsXG5cdFx0dHlwZTogV05PREVcblx0fTtcbn1cblxuLyoqXG4gKiBXcmFwcGVyIGZ1bmN0aW9uIGZvciBjYWxscyB0byBjcmVhdGUgVk5vZGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdih0YWc6IHN0cmluZywgY2hpbGRyZW46IHVuZGVmaW5lZCB8IEROb2RlW10pOiBWTm9kZTtcbmV4cG9ydCBmdW5jdGlvbiB2KHRhZzogc3RyaW5nLCBwcm9wZXJ0aWVzOiBEZWZlcnJlZFZpcnR1YWxQcm9wZXJ0aWVzIHwgVk5vZGVQcm9wZXJ0aWVzLCBjaGlsZHJlbj86IEROb2RlW10pOiBWTm9kZTtcbmV4cG9ydCBmdW5jdGlvbiB2KHRhZzogc3RyaW5nKTogVk5vZGU7XG5leHBvcnQgZnVuY3Rpb24gdihcblx0dGFnOiBzdHJpbmcsXG5cdHByb3BlcnRpZXNPckNoaWxkcmVuOiBWTm9kZVByb3BlcnRpZXMgfCBEZWZlcnJlZFZpcnR1YWxQcm9wZXJ0aWVzIHwgRE5vZGVbXSA9IHt9LFxuXHRjaGlsZHJlbjogdW5kZWZpbmVkIHwgRE5vZGVbXSA9IHVuZGVmaW5lZFxuKTogVk5vZGUge1xuXHRsZXQgcHJvcGVydGllczogVk5vZGVQcm9wZXJ0aWVzIHwgRGVmZXJyZWRWaXJ0dWFsUHJvcGVydGllcyA9IHByb3BlcnRpZXNPckNoaWxkcmVuO1xuXHRsZXQgZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2s7XG5cblx0aWYgKEFycmF5LmlzQXJyYXkocHJvcGVydGllc09yQ2hpbGRyZW4pKSB7XG5cdFx0Y2hpbGRyZW4gPSBwcm9wZXJ0aWVzT3JDaGlsZHJlbjtcblx0XHRwcm9wZXJ0aWVzID0ge307XG5cdH1cblxuXHRpZiAodHlwZW9mIHByb3BlcnRpZXMgPT09ICdmdW5jdGlvbicpIHtcblx0XHRkZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayA9IHByb3BlcnRpZXM7XG5cdFx0cHJvcGVydGllcyA9IHt9O1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHR0YWcsXG5cdFx0ZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2ssXG5cdFx0Y2hpbGRyZW4sXG5cdFx0cHJvcGVydGllcyxcblx0XHR0eXBlOiBWTk9ERVxuXHR9O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIFZOb2RlIGZvciBhbiBleGlzdGluZyBET00gTm9kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvbShcblx0eyBub2RlLCBhdHRycyA9IHt9LCBwcm9wcyA9IHt9LCBvbiA9IHt9LCBkaWZmVHlwZSA9ICdub25lJyB9OiBEb21PcHRpb25zLFxuXHRjaGlsZHJlbj86IEROb2RlW11cbik6IFZOb2RlIHtcblx0cmV0dXJuIHtcblx0XHR0YWc6IGlzRWxlbWVudE5vZGUobm9kZSkgPyBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA6ICcnLFxuXHRcdHByb3BlcnRpZXM6IHByb3BzLFxuXHRcdGF0dHJpYnV0ZXM6IGF0dHJzLFxuXHRcdGV2ZW50czogb24sXG5cdFx0Y2hpbGRyZW4sXG5cdFx0dHlwZTogRE9NVk5PREUsXG5cdFx0ZG9tTm9kZTogbm9kZSxcblx0XHR0ZXh0OiBpc0VsZW1lbnROb2RlKG5vZGUpID8gdW5kZWZpbmVkIDogbm9kZS5kYXRhLFxuXHRcdGRpZmZUeXBlXG5cdH0gYXMgSW50ZXJuYWxWTm9kZTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBkLnRzIiwiaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi9oYW5kbGVEZWNvcmF0b3InO1xuXG4vKipcbiAqIERlY29yYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gcnVuIGFzIGFuIGFzcGVjdCB0byBgcmVuZGVyYFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWZ0ZXJSZW5kZXIobWV0aG9kOiBGdW5jdGlvbik6ICh0YXJnZXQ6IGFueSkgPT4gdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiBhZnRlclJlbmRlcigpOiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gYWZ0ZXJSZW5kZXIobWV0aG9kPzogRnVuY3Rpb24pIHtcblx0cmV0dXJuIGhhbmRsZURlY29yYXRvcigodGFyZ2V0LCBwcm9wZXJ0eUtleSkgPT4ge1xuXHRcdHRhcmdldC5hZGREZWNvcmF0b3IoJ2FmdGVyUmVuZGVyJywgcHJvcGVydHlLZXkgPyB0YXJnZXRbcHJvcGVydHlLZXldIDogbWV0aG9kKTtcblx0fSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFmdGVyUmVuZGVyO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGFmdGVyUmVuZGVyLnRzIiwiaW1wb3J0IHsgV2lkZ2V0QmFzZSB9IGZyb20gJy4vLi4vV2lkZ2V0QmFzZSc7XG5pbXBvcnQgeyBoYW5kbGVEZWNvcmF0b3IgfSBmcm9tICcuL2hhbmRsZURlY29yYXRvcic7XG5pbXBvcnQgeyBiZWZvcmVQcm9wZXJ0aWVzIH0gZnJvbSAnLi9iZWZvcmVQcm9wZXJ0aWVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFsd2F5c1JlbmRlcigpIHtcblx0cmV0dXJuIGhhbmRsZURlY29yYXRvcigodGFyZ2V0LCBwcm9wZXJ0eUtleSkgPT4ge1xuXHRcdGJlZm9yZVByb3BlcnRpZXMoZnVuY3Rpb24odGhpczogV2lkZ2V0QmFzZSkge1xuXHRcdFx0dGhpcy5pbnZhbGlkYXRlKCk7XG5cdFx0fSkodGFyZ2V0KTtcblx0fSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFsd2F5c1JlbmRlcjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBhbHdheXNSZW5kZXIudHMiLCJpbXBvcnQgeyBoYW5kbGVEZWNvcmF0b3IgfSBmcm9tICcuL2hhbmRsZURlY29yYXRvcic7XG5pbXBvcnQgeyBCZWZvcmVQcm9wZXJ0aWVzIH0gZnJvbSAnLi8uLi9pbnRlcmZhY2VzJztcblxuLyoqXG4gKiBEZWNvcmF0b3IgdGhhdCBhZGRzIHRoZSBmdW5jdGlvbiBwYXNzZWQgb2YgdGFyZ2V0IG1ldGhvZCB0byBiZSBydW5cbiAqIGluIHRoZSBgYmVmb3JlUHJvcGVydGllc2AgbGlmZWN5Y2xlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmVmb3JlUHJvcGVydGllcyhtZXRob2Q6IEJlZm9yZVByb3BlcnRpZXMpOiAodGFyZ2V0OiBhbnkpID0+IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gYmVmb3JlUHJvcGVydGllcygpOiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gYmVmb3JlUHJvcGVydGllcyhtZXRob2Q/OiBCZWZvcmVQcm9wZXJ0aWVzKSB7XG5cdHJldHVybiBoYW5kbGVEZWNvcmF0b3IoKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcblx0XHR0YXJnZXQuYWRkRGVjb3JhdG9yKCdiZWZvcmVQcm9wZXJ0aWVzJywgcHJvcGVydHlLZXkgPyB0YXJnZXRbcHJvcGVydHlLZXldIDogbWV0aG9kKTtcblx0fSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJlZm9yZVByb3BlcnRpZXM7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gYmVmb3JlUHJvcGVydGllcy50cyIsImltcG9ydCB7IENvbnN0cnVjdG9yLCBXaWRnZXRQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDdXN0b21FbGVtZW50Q2hpbGRUeXBlIH0gZnJvbSAnLi4vcmVnaXN0ZXJDdXN0b21FbGVtZW50JztcbmltcG9ydCBSZWdpc3RyeSBmcm9tICcuLi9SZWdpc3RyeSc7XG5cbmV4cG9ydCB0eXBlIEN1c3RvbUVsZW1lbnRQcm9wZXJ0eU5hbWVzPFAgZXh0ZW5kcyBvYmplY3Q+ID0gKChrZXlvZiBQKSB8IChrZXlvZiBXaWRnZXRQcm9wZXJ0aWVzKSlbXTtcblxuLyoqXG4gKiBEZWZpbmVzIHRoZSBjdXN0b20gZWxlbWVudCBjb25maWd1cmF0aW9uIHVzZWQgYnkgdGhlIGN1c3RvbUVsZW1lbnQgZGVjb3JhdG9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tRWxlbWVudENvbmZpZzxQIGV4dGVuZHMgb2JqZWN0ID0geyBbaW5kZXg6IHN0cmluZ106IGFueSB9PiB7XG5cdC8qKlxuXHQgKiBUaGUgdGFnIG9mIHRoZSBjdXN0b20gZWxlbWVudFxuXHQgKi9cblx0dGFnOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIExpc3Qgb2Ygd2lkZ2V0IHByb3BlcnRpZXMgdG8gZXhwb3NlIGFzIHByb3BlcnRpZXMgb24gdGhlIGN1c3RvbSBlbGVtZW50XG5cdCAqL1xuXHRwcm9wZXJ0aWVzPzogQ3VzdG9tRWxlbWVudFByb3BlcnR5TmFtZXM8UD47XG5cblx0LyoqXG5cdCAqIExpc3Qgb2YgYXR0cmlidXRlcyBvbiB0aGUgY3VzdG9tIGVsZW1lbnQgdG8gbWFwIHRvIHdpZGdldCBwcm9wZXJ0aWVzXG5cdCAqL1xuXHRhdHRyaWJ1dGVzPzogQ3VzdG9tRWxlbWVudFByb3BlcnR5TmFtZXM8UD47XG5cblx0LyoqXG5cdCAqIExpc3Qgb2YgZXZlbnRzIHRvIGV4cG9zZVxuXHQgKi9cblx0ZXZlbnRzPzogQ3VzdG9tRWxlbWVudFByb3BlcnR5TmFtZXM8UD47XG5cblx0Y2hpbGRUeXBlPzogQ3VzdG9tRWxlbWVudENoaWxkVHlwZTtcblxuXHRyZWdpc3RyeUZhY3Rvcnk/OiAoKSA9PiBSZWdpc3RyeTtcbn1cblxuLyoqXG4gKiBUaGlzIERlY29yYXRvciBpcyBwcm92aWRlZCBwcm9wZXJ0aWVzIHRoYXQgZGVmaW5lIHRoZSBiZWhhdmlvciBvZiBhIGN1c3RvbSBlbGVtZW50LCBhbmRcbiAqIHJlZ2lzdGVycyB0aGF0IGN1c3RvbSBlbGVtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3VzdG9tRWxlbWVudDxQIGV4dGVuZHMgb2JqZWN0ID0geyBbaW5kZXg6IHN0cmluZ106IGFueSB9Pih7XG5cdHRhZyxcblx0cHJvcGVydGllcyA9IFtdLFxuXHRhdHRyaWJ1dGVzID0gW10sXG5cdGV2ZW50cyA9IFtdLFxuXHRjaGlsZFR5cGUgPSBDdXN0b21FbGVtZW50Q2hpbGRUeXBlLkRPSk8sXG5cdHJlZ2lzdHJ5RmFjdG9yeSA9ICgpID0+IG5ldyBSZWdpc3RyeSgpXG59OiBDdXN0b21FbGVtZW50Q29uZmlnPFA+KSB7XG5cdHJldHVybiBmdW5jdGlvbjxUIGV4dGVuZHMgQ29uc3RydWN0b3I8YW55Pj4odGFyZ2V0OiBUKSB7XG5cdFx0dGFyZ2V0LnByb3RvdHlwZS5fX2N1c3RvbUVsZW1lbnREZXNjcmlwdG9yID0ge1xuXHRcdFx0dGFnTmFtZTogdGFnLFxuXHRcdFx0YXR0cmlidXRlcyxcblx0XHRcdHByb3BlcnRpZXMsXG5cdFx0XHRldmVudHMsXG5cdFx0XHRjaGlsZFR5cGUsXG5cdFx0XHRyZWdpc3RyeUZhY3Rvcnlcblx0XHR9O1xuXHR9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjdXN0b21FbGVtZW50O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGN1c3RvbUVsZW1lbnQudHMiLCJpbXBvcnQgeyBoYW5kbGVEZWNvcmF0b3IgfSBmcm9tICcuL2hhbmRsZURlY29yYXRvcic7XG5pbXBvcnQgeyBEaWZmUHJvcGVydHlGdW5jdGlvbiB9IGZyb20gJy4vLi4vaW50ZXJmYWNlcyc7XG5cbi8qKlxuICogRGVjb3JhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVnaXN0ZXIgYSBmdW5jdGlvbiBhcyBhIHNwZWNpZmljIHByb3BlcnR5IGRpZmZcbiAqXG4gKiBAcGFyYW0gcHJvcGVydHlOYW1lICBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb2Ygd2hpY2ggdGhlIGRpZmYgZnVuY3Rpb24gaXMgYXBwbGllZFxuICogQHBhcmFtIGRpZmZUeXBlICAgICAgVGhlIGRpZmYgdHlwZSwgZGVmYXVsdCBpcyBEaWZmVHlwZS5BVVRPLlxuICogQHBhcmFtIGRpZmZGdW5jdGlvbiAgQSBkaWZmIGZ1bmN0aW9uIHRvIHJ1biBpZiBkaWZmVHlwZSBpZiBEaWZmVHlwZS5DVVNUT01cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmZQcm9wZXJ0eShwcm9wZXJ0eU5hbWU6IHN0cmluZywgZGlmZkZ1bmN0aW9uOiBEaWZmUHJvcGVydHlGdW5jdGlvbiwgcmVhY3Rpb25GdW5jdGlvbj86IEZ1bmN0aW9uKSB7XG5cdHJldHVybiBoYW5kbGVEZWNvcmF0b3IoKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcblx0XHR0YXJnZXQuYWRkRGVjb3JhdG9yKGBkaWZmUHJvcGVydHk6JHtwcm9wZXJ0eU5hbWV9YCwgZGlmZkZ1bmN0aW9uLmJpbmQobnVsbCkpO1xuXHRcdHRhcmdldC5hZGREZWNvcmF0b3IoJ3JlZ2lzdGVyZWREaWZmUHJvcGVydHknLCBwcm9wZXJ0eU5hbWUpO1xuXHRcdGlmIChyZWFjdGlvbkZ1bmN0aW9uIHx8IHByb3BlcnR5S2V5KSB7XG5cdFx0XHR0YXJnZXQuYWRkRGVjb3JhdG9yKCdkaWZmUmVhY3Rpb24nLCB7XG5cdFx0XHRcdHByb3BlcnR5TmFtZSxcblx0XHRcdFx0cmVhY3Rpb246IHByb3BlcnR5S2V5ID8gdGFyZ2V0W3Byb3BlcnR5S2V5XSA6IHJlYWN0aW9uRnVuY3Rpb25cblx0XHRcdH0pO1xuXHRcdH1cblx0fSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGRpZmZQcm9wZXJ0eTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBkaWZmUHJvcGVydHkudHMiLCJleHBvcnQgdHlwZSBEZWNvcmF0b3JIYW5kbGVyID0gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleT86IHN0cmluZykgPT4gdm9pZDtcblxuLyoqXG4gKiBHZW5lcmljIGRlY29yYXRvciBoYW5kbGVyIHRvIHRha2UgY2FyZSBvZiB3aGV0aGVyIG9yIG5vdCB0aGUgZGVjb3JhdG9yIHdhcyBjYWxsZWQgYXQgdGhlIGNsYXNzIGxldmVsXG4gKiBvciB0aGUgbWV0aG9kIGxldmVsLlxuICpcbiAqIEBwYXJhbSBoYW5kbGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVEZWNvcmF0b3IoaGFuZGxlcjogRGVjb3JhdG9ySGFuZGxlcikge1xuXHRyZXR1cm4gZnVuY3Rpb24odGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5Pzogc3RyaW5nLCBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yKSB7XG5cdFx0aWYgKHR5cGVvZiB0YXJnZXQgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGhhbmRsZXIodGFyZ2V0LnByb3RvdHlwZSwgdW5kZWZpbmVkKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aGFuZGxlcih0YXJnZXQsIHByb3BlcnR5S2V5KTtcblx0XHR9XG5cdH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGhhbmRsZURlY29yYXRvcjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBoYW5kbGVEZWNvcmF0b3IudHMiLCJpbXBvcnQgV2Vha01hcCBmcm9tICdAZG9qby9zaGltL1dlYWtNYXAnO1xuaW1wb3J0IHsgV2lkZ2V0QmFzZSB9IGZyb20gJy4vLi4vV2lkZ2V0QmFzZSc7XG5pbXBvcnQgeyBoYW5kbGVEZWNvcmF0b3IgfSBmcm9tICcuL2hhbmRsZURlY29yYXRvcic7XG5pbXBvcnQgeyBiZWZvcmVQcm9wZXJ0aWVzIH0gZnJvbSAnLi9iZWZvcmVQcm9wZXJ0aWVzJztcbmltcG9ydCB7IEluamVjdG9ySXRlbSwgUmVnaXN0cnlMYWJlbCB9IGZyb20gJy4vLi4vaW50ZXJmYWNlcyc7XG5cbi8qKlxuICogTWFwIG9mIGluc3RhbmNlcyBhZ2FpbnN0IHJlZ2lzdGVyZWQgaW5qZWN0b3JzLlxuICovXG5jb25zdCByZWdpc3RlcmVkSW5qZWN0b3JzTWFwOiBXZWFrTWFwPFdpZGdldEJhc2UsIEluamVjdG9ySXRlbVtdPiA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgY29udHJhY3QgcmVxdWlyZXMgZm9yIHRoZSBnZXQgcHJvcGVydGllcyBmdW5jdGlvblxuICogdXNlZCB0byBtYXAgdGhlIGluamVjdGVkIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UHJvcGVydGllczxUID0gYW55PiB7XG5cdChwYXlsb2FkOiBhbnksIHByb3BlcnRpZXM6IFQpOiBUO1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIGluamVjdCBjb25maWd1cmF0aW9uIHJlcXVpcmVkIGZvciB1c2Ugb2YgdGhlIGBpbmplY3RgIGRlY29yYXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluamVjdENvbmZpZyB7XG5cdC8qKlxuXHQgKiBUaGUgbGFiZWwgb2YgdGhlIHJlZ2lzdHJ5IGluamVjdG9yXG5cdCAqL1xuXHRuYW1lOiBSZWdpc3RyeUxhYmVsO1xuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0aGF0IHJldHVybnMgcHJvcGVydHVlcyB0byBpbmplY3QgdXNpbmcgdGhlIHBhc3NlZCBwcm9wZXJ0aWVzXG5cdCAqIGFuZCB0aGUgaW5qZWN0ZWQgcGF5bG9hZC5cblx0ICovXG5cdGdldFByb3BlcnRpZXM6IEdldFByb3BlcnRpZXM7XG59XG5cbi8qKlxuICogRGVjb3JhdG9yIHJldHJpZXZlcyBhbiBpbmplY3RvciBmcm9tIGFuIGF2YWlsYWJsZSByZWdpc3RyeSB1c2luZyB0aGUgbmFtZSBhbmRcbiAqIGNhbGxzIHRoZSBgZ2V0UHJvcGVydGllc2AgZnVuY3Rpb24gd2l0aCB0aGUgcGF5bG9hZCBmcm9tIHRoZSBpbmplY3RvclxuICogYW5kIGN1cnJlbnQgcHJvcGVydGllcyB3aXRoIHRoZSB0aGUgaW5qZWN0ZWQgcHJvcGVydGllcyByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gSW5qZWN0Q29uZmlnIHRoZSBpbmplY3QgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KHsgbmFtZSwgZ2V0UHJvcGVydGllcyB9OiBJbmplY3RDb25maWcpIHtcblx0cmV0dXJuIGhhbmRsZURlY29yYXRvcigodGFyZ2V0LCBwcm9wZXJ0eUtleSkgPT4ge1xuXHRcdGJlZm9yZVByb3BlcnRpZXMoZnVuY3Rpb24odGhpczogV2lkZ2V0QmFzZSAmIHsgb3duOiBGdW5jdGlvbiB9LCBwcm9wZXJ0aWVzOiBhbnkpIHtcblx0XHRcdGNvbnN0IGluamVjdG9ySXRlbSA9IHRoaXMucmVnaXN0cnkuZ2V0SW5qZWN0b3IobmFtZSk7XG5cdFx0XHRpZiAoaW5qZWN0b3JJdGVtKSB7XG5cdFx0XHRcdGNvbnN0IHsgaW5qZWN0b3IsIGludmFsaWRhdG9yIH0gPSBpbmplY3Rvckl0ZW07XG5cdFx0XHRcdGNvbnN0IHJlZ2lzdGVyZWRJbmplY3RvcnMgPSByZWdpc3RlcmVkSW5qZWN0b3JzTWFwLmdldCh0aGlzKSB8fCBbXTtcblx0XHRcdFx0aWYgKHJlZ2lzdGVyZWRJbmplY3RvcnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0cmVnaXN0ZXJlZEluamVjdG9yc01hcC5zZXQodGhpcywgcmVnaXN0ZXJlZEluamVjdG9ycyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHJlZ2lzdGVyZWRJbmplY3RvcnMuaW5kZXhPZihpbmplY3Rvckl0ZW0pID09PSAtMSkge1xuXHRcdFx0XHRcdHRoaXMub3duKFxuXHRcdFx0XHRcdFx0aW52YWxpZGF0b3Iub24oJ2ludmFsaWRhdGUnLCAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaW52YWxpZGF0ZSgpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHJlZ2lzdGVyZWRJbmplY3RvcnMucHVzaChpbmplY3Rvckl0ZW0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBnZXRQcm9wZXJ0aWVzKGluamVjdG9yKCksIHByb3BlcnRpZXMpO1xuXHRcdFx0fVxuXHRcdH0pKHRhcmdldCk7XG5cdH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpbmplY3Q7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gaW5qZWN0LnRzIiwiaW1wb3J0IHsgUHJvcGVydHlDaGFuZ2VSZWNvcmQgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgV0lER0VUX0JBU0VfVFlQRSB9IGZyb20gJy4vUmVnaXN0cnknO1xuXG5mdW5jdGlvbiBpc09iamVjdE9yQXJyYXkodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbHdheXMocHJldmlvdXNQcm9wZXJ0eTogYW55LCBuZXdQcm9wZXJ0eTogYW55KTogUHJvcGVydHlDaGFuZ2VSZWNvcmQge1xuXHRyZXR1cm4ge1xuXHRcdGNoYW5nZWQ6IHRydWUsXG5cdFx0dmFsdWU6IG5ld1Byb3BlcnR5XG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmUocHJldmlvdXNQcm9wZXJ0eTogYW55LCBuZXdQcm9wZXJ0eTogYW55KTogUHJvcGVydHlDaGFuZ2VSZWNvcmQge1xuXHRyZXR1cm4ge1xuXHRcdGNoYW5nZWQ6IGZhbHNlLFxuXHRcdHZhbHVlOiBuZXdQcm9wZXJ0eVxuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVmZXJlbmNlKHByZXZpb3VzUHJvcGVydHk6IGFueSwgbmV3UHJvcGVydHk6IGFueSk6IFByb3BlcnR5Q2hhbmdlUmVjb3JkIHtcblx0cmV0dXJuIHtcblx0XHRjaGFuZ2VkOiBwcmV2aW91c1Byb3BlcnR5ICE9PSBuZXdQcm9wZXJ0eSxcblx0XHR2YWx1ZTogbmV3UHJvcGVydHlcblx0fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoYWxsb3cocHJldmlvdXNQcm9wZXJ0eTogYW55LCBuZXdQcm9wZXJ0eTogYW55KTogUHJvcGVydHlDaGFuZ2VSZWNvcmQge1xuXHRsZXQgY2hhbmdlZCA9IGZhbHNlO1xuXG5cdGNvbnN0IHZhbGlkT2xkUHJvcGVydHkgPSBwcmV2aW91c1Byb3BlcnR5ICYmIGlzT2JqZWN0T3JBcnJheShwcmV2aW91c1Byb3BlcnR5KTtcblx0Y29uc3QgdmFsaWROZXdQcm9wZXJ0eSA9IG5ld1Byb3BlcnR5ICYmIGlzT2JqZWN0T3JBcnJheShuZXdQcm9wZXJ0eSk7XG5cblx0aWYgKCF2YWxpZE9sZFByb3BlcnR5IHx8ICF2YWxpZE5ld1Byb3BlcnR5KSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGNoYW5nZWQ6IHRydWUsXG5cdFx0XHR2YWx1ZTogbmV3UHJvcGVydHlcblx0XHR9O1xuXHR9XG5cblx0Y29uc3QgcHJldmlvdXNLZXlzID0gT2JqZWN0LmtleXMocHJldmlvdXNQcm9wZXJ0eSk7XG5cdGNvbnN0IG5ld0tleXMgPSBPYmplY3Qua2V5cyhuZXdQcm9wZXJ0eSk7XG5cblx0aWYgKHByZXZpb3VzS2V5cy5sZW5ndGggIT09IG5ld0tleXMubGVuZ3RoKSB7XG5cdFx0Y2hhbmdlZCA9IHRydWU7XG5cdH0gZWxzZSB7XG5cdFx0Y2hhbmdlZCA9IG5ld0tleXMuc29tZSgoa2V5KSA9PiB7XG5cdFx0XHRyZXR1cm4gbmV3UHJvcGVydHlba2V5XSAhPT0gcHJldmlvdXNQcm9wZXJ0eVtrZXldO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0Y2hhbmdlZCxcblx0XHR2YWx1ZTogbmV3UHJvcGVydHlcblx0fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF1dG8ocHJldmlvdXNQcm9wZXJ0eTogYW55LCBuZXdQcm9wZXJ0eTogYW55KTogUHJvcGVydHlDaGFuZ2VSZWNvcmQge1xuXHRsZXQgcmVzdWx0O1xuXHRpZiAodHlwZW9mIG5ld1Byb3BlcnR5ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0aWYgKG5ld1Byb3BlcnR5Ll90eXBlID09PSBXSURHRVRfQkFTRV9UWVBFKSB7XG5cdFx0XHRyZXN1bHQgPSByZWZlcmVuY2UocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXN1bHQgPSBpZ25vcmUocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpO1xuXHRcdH1cblx0fSBlbHNlIGlmIChpc09iamVjdE9yQXJyYXkobmV3UHJvcGVydHkpKSB7XG5cdFx0cmVzdWx0ID0gc2hhbGxvdyhwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSk7XG5cdH0gZWxzZSB7XG5cdFx0cmVzdWx0ID0gcmVmZXJlbmNlKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGRpZmYudHMiLCJpbXBvcnQgeyBhc3NpZ24gfSBmcm9tICdAZG9qby9jb3JlL2xhbmcnO1xuaW1wb3J0IHsgSGFuZGxlIH0gZnJvbSAnQGRvam8vY29yZS9pbnRlcmZhY2VzJztcbmltcG9ydCBjc3NUcmFuc2l0aW9ucyBmcm9tICcuLi9hbmltYXRpb25zL2Nzc1RyYW5zaXRpb25zJztcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBETm9kZSwgUHJvamVjdGlvbiwgUHJvamVjdGlvbk9wdGlvbnMgfSBmcm9tICcuLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgV2lkZ2V0QmFzZSB9IGZyb20gJy4vLi4vV2lkZ2V0QmFzZSc7XG5pbXBvcnQgeyBhZnRlclJlbmRlciB9IGZyb20gJy4vLi4vZGVjb3JhdG9ycy9hZnRlclJlbmRlcic7XG5pbXBvcnQgeyB2IH0gZnJvbSAnLi8uLi9kJztcbmltcG9ydCB7IFJlZ2lzdHJ5IH0gZnJvbSAnLi8uLi9SZWdpc3RyeSc7XG5pbXBvcnQgeyBkb20gfSBmcm9tICcuLy4uL3Zkb20nO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGF0dGFjaCBzdGF0ZSBvZiB0aGUgcHJvamVjdG9yXG4gKi9cbmV4cG9ydCBlbnVtIFByb2plY3RvckF0dGFjaFN0YXRlIHtcblx0QXR0YWNoZWQgPSAxLFxuXHREZXRhY2hlZFxufVxuXG4vKipcbiAqIEF0dGFjaCB0eXBlIGZvciB0aGUgcHJvamVjdG9yXG4gKi9cbmV4cG9ydCBlbnVtIEF0dGFjaFR5cGUge1xuXHRBcHBlbmQgPSAxLFxuXHRNZXJnZSA9IDJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdHRhY2hPcHRpb25zIHtcblx0LyoqXG5cdCAqIElmIGAnYXBwZW5kJ2AgaXQgd2lsbCBhcHBlbmRlZCB0byB0aGUgcm9vdC4gSWYgYCdtZXJnZSdgIGl0IHdpbGwgbWVyZ2VkIHdpdGggdGhlIHJvb3QuIElmIGAncmVwbGFjZSdgIGl0IHdpbGxcblx0ICogcmVwbGFjZSB0aGUgcm9vdC5cblx0ICovXG5cdHR5cGU6IEF0dGFjaFR5cGU7XG5cblx0LyoqXG5cdCAqIEVsZW1lbnQgdG8gYXR0YWNoIHRoZSBwcm9qZWN0b3IuXG5cdCAqL1xuXHRyb290PzogRWxlbWVudDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0b3JQcm9wZXJ0aWVzIHtcblx0cmVnaXN0cnk/OiBSZWdpc3RyeTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0b3JNaXhpbjxQPiB7XG5cdHJlYWRvbmx5IHByb3BlcnRpZXM6IFJlYWRvbmx5PFA+ICYgUmVhZG9ubHk8UHJvamVjdG9yUHJvcGVydGllcz47XG5cblx0LyoqXG5cdCAqIEFwcGVuZCB0aGUgcHJvamVjdG9yIHRvIHRoZSByb290LlxuXHQgKi9cblx0YXBwZW5kKHJvb3Q/OiBFbGVtZW50KTogSGFuZGxlO1xuXG5cdC8qKlxuXHQgKiBNZXJnZSB0aGUgcHJvamVjdG9yIG9udG8gdGhlIHJvb3QuXG5cdCAqXG5cdCAqIFRoZSBgcm9vdGAgYW5kIGFueSBvZiBpdHMgYGNoaWxkcmVuYCB3aWxsIGJlIHJlLXVzZWQuICBBbnkgZXhjZXNzIERPTSBub2RlcyB3aWxsIGJlIGlnbm9yZWQgYW5kIGFueSBtaXNzaW5nIERPTSBub2Rlc1xuXHQgKiB3aWxsIGJlIGNyZWF0ZWQuXG5cdCAqIEBwYXJhbSByb290IFRoZSByb290IGVsZW1lbnQgdGhhdCB0aGUgcm9vdCB2aXJ0dWFsIERPTSBub2RlIHdpbGwgYmUgbWVyZ2VkIHdpdGguICBEZWZhdWx0cyB0byBgZG9jdW1lbnQuYm9keWAuXG5cdCAqL1xuXHRtZXJnZShyb290PzogRWxlbWVudCk6IEhhbmRsZTtcblxuXHQvKipcblx0ICogQXR0YWNoIHRoZSBwcm9qZWN0IHRvIGEgX3NhbmRib3hlZF8gZG9jdW1lbnQgZnJhZ21lbnQgdGhhdCBpcyBub3QgcGFydCBvZiB0aGUgRE9NLlxuXHQgKlxuXHQgKiBXaGVuIHNhbmRib3hlZCwgdGhlIGBQcm9qZWN0b3JgIHdpbGwgcnVuIGluIGEgc3luYyBtYW5uZXIsIHdoZXJlIHJlbmRlcnMgYXJlIGNvbXBsZXRlZCB3aXRoaW4gdGhlIHNhbWUgdHVybi5cblx0ICogVGhlIGBQcm9qZWN0b3JgIGNyZWF0ZXMgYSBgRG9jdW1lbnRGcmFnbWVudGAgd2hpY2ggcmVwbGFjZXMgYW55IG90aGVyIGByb290YCB0aGF0IGhhcyBiZWVuIHNldC5cblx0ICogQHBhcmFtIGRvYyBUaGUgYERvY3VtZW50YCB0byB1c2UsIHdoaWNoIGRlZmF1bHRzIHRvIHRoZSBnbG9iYWwgYGRvY3VtZW50YC5cblx0ICovXG5cdHNhbmRib3goZG9jPzogRG9jdW1lbnQpOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgd2lkZ2V0LiBSZXNwb25zaWJsZSBmb3IgY2FsbGluZyB0aGUgZGlmZmluZyBmdW5jdGlvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzIGFnYWluc3QgdGhlXG5cdCAqIHByZXZpb3VzIHByb3BlcnRpZXMuIFJ1bnMgdGhvdWdoIGFueSByZWdpc3RlcmVkIHNwZWNpZmljIHByb3BlcnR5IGRpZmYgZnVuY3Rpb25zIGNvbGxlY3RpbmcgdGhlIHJlc3VsdHMgYW5kIHRoZW5cblx0ICogcnVucyB0aGUgcmVtYWluZGVyIHRocm91Z2ggdGhlIGNhdGNoIGFsbCBkaWZmIGZ1bmN0aW9uLiBUaGUgYWdncmVnYXRlIG9mIHRoZSB0d28gc2V0cyBvZiB0aGUgcmVzdWx0cyBpcyB0aGVuXG5cdCAqIHNldCBhcyB0aGUgd2lkZ2V0J3MgcHJvcGVydGllc1xuXHQgKlxuXHQgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgbmV3IHdpZGdldCBwcm9wZXJ0aWVzXG5cdCAqL1xuXHRzZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXM6IHRoaXNbJ3Byb3BlcnRpZXMnXSk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIHdpZGdldCdzIGNoaWxkcmVuXG5cdCAqL1xuXHRzZXRDaGlsZHJlbihjaGlsZHJlbjogRE5vZGVbXSk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIFJldHVybiBhIGBzdHJpbmdgIHRoYXQgcmVwcmVzZW50cyB0aGUgSFRNTCBvZiB0aGUgY3VycmVudCBwcm9qZWN0aW9uLiAgVGhlIHByb2plY3RvciBuZWVkcyB0byBiZSBhdHRhY2hlZC5cblx0ICovXG5cdHRvSHRtbCgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyBpZiB0aGUgcHJvamVjdG9ycyBpcyBpbiBhc3luYyBtb2RlLCBjb25maWd1cmVkIHRvIGB0cnVlYCBieSBkZWZhdWx0cy5cblx0ICovXG5cdGFzeW5jOiBib29sZWFuO1xuXG5cdC8qKlxuXHQgKiBSb290IGVsZW1lbnQgdG8gYXR0YWNoIHRoZSBwcm9qZWN0b3Jcblx0ICovXG5cdHJvb3Q6IEVsZW1lbnQ7XG5cblx0LyoqXG5cdCAqIFRoZSBzdGF0dXMgb2YgdGhlIHByb2plY3RvclxuXHQgKi9cblx0cmVhZG9ubHkgcHJvamVjdG9yU3RhdGU6IFByb2plY3RvckF0dGFjaFN0YXRlO1xuXG5cdC8qKlxuXHQgKiBSdW5zIHJlZ2lzdGVyZWQgZGVzdHJveSBoYW5kbGVzXG5cdCAqL1xuXHRkZXN0cm95KCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBQcm9qZWN0b3JNaXhpbjxQLCBUIGV4dGVuZHMgQ29uc3RydWN0b3I8V2lkZ2V0QmFzZTxQPj4+KEJhc2U6IFQpOiBUICYgQ29uc3RydWN0b3I8UHJvamVjdG9yTWl4aW48UD4+IHtcblx0YWJzdHJhY3QgY2xhc3MgUHJvamVjdG9yIGV4dGVuZHMgQmFzZSB7XG5cdFx0cHVibGljIHByb2plY3RvclN0YXRlOiBQcm9qZWN0b3JBdHRhY2hTdGF0ZTtcblxuXHRcdHByaXZhdGUgX3Jvb3Q6IEVsZW1lbnQgPSBkb2N1bWVudC5ib2R5O1xuXHRcdHByaXZhdGUgX2FzeW5jID0gdHJ1ZTtcblx0XHRwcml2YXRlIF9hdHRhY2hIYW5kbGU6IEhhbmRsZSB8IHVuZGVmaW5lZDtcblx0XHRwcml2YXRlIF9wcm9qZWN0aW9uT3B0aW9uczogUGFydGlhbDxQcm9qZWN0aW9uT3B0aW9ucz47XG5cdFx0cHJpdmF0ZSBfcHJvamVjdGlvbjogUHJvamVjdGlvbiB8IHVuZGVmaW5lZDtcblx0XHRwcml2YXRlIF9wcm9qZWN0b3JQcm9wZXJ0aWVzOiB0aGlzWydwcm9wZXJ0aWVzJ10gPSB7fSBhcyB0aGlzWydwcm9wZXJ0aWVzJ107XG5cdFx0cHVibGljIGFic3RyYWN0IHByb3BlcnRpZXM6IFJlYWRvbmx5PFA+ICYgUmVhZG9ubHk8UHJvamVjdG9yUHJvcGVydGllcz47XG5cblx0XHRjb25zdHJ1Y3RvciguLi5hcmdzOiBhbnlbXSkge1xuXHRcdFx0c3VwZXIoLi4uYXJncyk7XG5cblx0XHRcdHRoaXMuX3Byb2plY3Rpb25PcHRpb25zID0ge1xuXHRcdFx0XHR0cmFuc2l0aW9uczogY3NzVHJhbnNpdGlvbnNcblx0XHRcdH07XG5cblx0XHRcdHRoaXMucm9vdCA9IGRvY3VtZW50LmJvZHk7XG5cdFx0XHR0aGlzLnByb2plY3RvclN0YXRlID0gUHJvamVjdG9yQXR0YWNoU3RhdGUuRGV0YWNoZWQ7XG5cdFx0fVxuXG5cdFx0cHVibGljIGFwcGVuZChyb290PzogRWxlbWVudCk6IEhhbmRsZSB7XG5cdFx0XHRjb25zdCBvcHRpb25zID0ge1xuXHRcdFx0XHR0eXBlOiBBdHRhY2hUeXBlLkFwcGVuZCxcblx0XHRcdFx0cm9vdFxuXHRcdFx0fTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX2F0dGFjaChvcHRpb25zKTtcblx0XHR9XG5cblx0XHRwdWJsaWMgbWVyZ2Uocm9vdD86IEVsZW1lbnQpOiBIYW5kbGUge1xuXHRcdFx0Y29uc3Qgb3B0aW9ucyA9IHtcblx0XHRcdFx0dHlwZTogQXR0YWNoVHlwZS5NZXJnZSxcblx0XHRcdFx0cm9vdFxuXHRcdFx0fTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX2F0dGFjaChvcHRpb25zKTtcblx0XHR9XG5cblx0XHRwdWJsaWMgc2V0IHJvb3Qocm9vdDogRWxlbWVudCkge1xuXHRcdFx0aWYgKHRoaXMucHJvamVjdG9yU3RhdGUgPT09IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignUHJvamVjdG9yIGFscmVhZHkgYXR0YWNoZWQsIGNhbm5vdCBjaGFuZ2Ugcm9vdCBlbGVtZW50Jyk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9yb290ID0gcm9vdDtcblx0XHR9XG5cblx0XHRwdWJsaWMgZ2V0IHJvb3QoKTogRWxlbWVudCB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fcm9vdDtcblx0XHR9XG5cblx0XHRwdWJsaWMgZ2V0IGFzeW5jKCk6IGJvb2xlYW4ge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2FzeW5jO1xuXHRcdH1cblxuXHRcdHB1YmxpYyBzZXQgYXN5bmMoYXN5bmM6IGJvb2xlYW4pIHtcblx0XHRcdGlmICh0aGlzLnByb2plY3RvclN0YXRlID09PSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5BdHRhY2hlZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1Byb2plY3RvciBhbHJlYWR5IGF0dGFjaGVkLCBjYW5ub3QgY2hhbmdlIGFzeW5jIG1vZGUnKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX2FzeW5jID0gYXN5bmM7XG5cdFx0fVxuXG5cdFx0cHVibGljIHNhbmRib3goZG9jOiBEb2N1bWVudCA9IGRvY3VtZW50KTogdm9pZCB7XG5cdFx0XHRpZiAodGhpcy5wcm9qZWN0b3JTdGF0ZSA9PT0gUHJvamVjdG9yQXR0YWNoU3RhdGUuQXR0YWNoZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdQcm9qZWN0b3IgYWxyZWFkeSBhdHRhY2hlZCwgY2Fubm90IGNyZWF0ZSBzYW5kYm94Jyk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9hc3luYyA9IGZhbHNlO1xuXHRcdFx0Y29uc3QgcHJldmlvdXNSb290ID0gdGhpcy5yb290O1xuXG5cdFx0XHQvKiBmcmVlIHVwIHRoZSBkb2N1bWVudCBmcmFnbWVudCBmb3IgR0MgKi9cblx0XHRcdHRoaXMub3duKHtcblx0XHRcdFx0ZGVzdHJveTogKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX3Jvb3QgPSBwcmV2aW91c1Jvb3Q7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLl9hdHRhY2goe1xuXHRcdFx0XHQvKiBEb2N1bWVudEZyYWdtZW50IGlzIG5vdCBhc3NpZ25hYmxlIHRvIEVsZW1lbnQsIGJ1dCBwcm92aWRlcyBldmVyeXRoaW5nIG5lZWRlZCB0byB3b3JrICovXG5cdFx0XHRcdHJvb3Q6IGRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkgYXMgYW55LFxuXHRcdFx0XHR0eXBlOiBBdHRhY2hUeXBlLkFwcGVuZFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cHVibGljIHNldENoaWxkcmVuKGNoaWxkcmVuOiBETm9kZVtdKTogdm9pZCB7XG5cdFx0XHR0aGlzLl9fc2V0Q2hpbGRyZW5fXyhjaGlsZHJlbik7XG5cdFx0fVxuXG5cdFx0cHVibGljIHNldFByb3BlcnRpZXMocHJvcGVydGllczogdGhpc1sncHJvcGVydGllcyddKTogdm9pZCB7XG5cdFx0XHR0aGlzLl9fc2V0UHJvcGVydGllc19fKHByb3BlcnRpZXMpO1xuXHRcdH1cblxuXHRcdHB1YmxpYyBfX3NldFByb3BlcnRpZXNfXyhwcm9wZXJ0aWVzOiB0aGlzWydwcm9wZXJ0aWVzJ10pOiB2b2lkIHtcblx0XHRcdGlmICh0aGlzLl9wcm9qZWN0b3JQcm9wZXJ0aWVzICYmIHRoaXMuX3Byb2plY3RvclByb3BlcnRpZXMucmVnaXN0cnkgIT09IHByb3BlcnRpZXMucmVnaXN0cnkpIHtcblx0XHRcdFx0aWYgKHRoaXMuX3Byb2plY3RvclByb3BlcnRpZXMucmVnaXN0cnkpIHtcblx0XHRcdFx0XHR0aGlzLl9wcm9qZWN0b3JQcm9wZXJ0aWVzLnJlZ2lzdHJ5LmRlc3Ryb3koKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5fcHJvamVjdG9yUHJvcGVydGllcyA9IGFzc2lnbih7fSwgcHJvcGVydGllcyk7XG5cdFx0XHRzdXBlci5fX3NldENvcmVQcm9wZXJ0aWVzX18oeyBiaW5kOiB0aGlzLCBiYXNlUmVnaXN0cnk6IHByb3BlcnRpZXMucmVnaXN0cnkgfSk7XG5cdFx0XHRzdXBlci5fX3NldFByb3BlcnRpZXNfXyhwcm9wZXJ0aWVzKTtcblx0XHR9XG5cblx0XHRwdWJsaWMgdG9IdG1sKCk6IHN0cmluZyB7XG5cdFx0XHRpZiAodGhpcy5wcm9qZWN0b3JTdGF0ZSAhPT0gUHJvamVjdG9yQXR0YWNoU3RhdGUuQXR0YWNoZWQgfHwgIXRoaXMuX3Byb2plY3Rpb24pIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdQcm9qZWN0b3IgaXMgbm90IGF0dGFjaGVkLCBjYW5ub3QgcmV0dXJuIGFuIEhUTUwgc3RyaW5nIG9mIHByb2plY3Rpb24uJyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gKHRoaXMuX3Byb2plY3Rpb24uZG9tTm9kZS5jaGlsZE5vZGVzWzBdIGFzIEVsZW1lbnQpLm91dGVySFRNTDtcblx0XHR9XG5cblx0XHRAYWZ0ZXJSZW5kZXIoKVxuXHRcdHB1YmxpYyBhZnRlclJlbmRlcihyZXN1bHQ6IEROb2RlKSB7XG5cdFx0XHRsZXQgbm9kZSA9IHJlc3VsdDtcblx0XHRcdGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyB8fCByZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0bm9kZSA9IHYoJ3NwYW4nLCB7fSwgW3Jlc3VsdF0pO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbm9kZTtcblx0XHR9XG5cblx0XHRwdWJsaWMgZGVzdHJveSgpIHtcblx0XHRcdHN1cGVyLmRlc3Ryb3koKTtcblx0XHR9XG5cblx0XHRwcml2YXRlIF9hdHRhY2goeyB0eXBlLCByb290IH06IEF0dGFjaE9wdGlvbnMpOiBIYW5kbGUge1xuXHRcdFx0aWYgKHJvb3QpIHtcblx0XHRcdFx0dGhpcy5yb290ID0gcm9vdDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX2F0dGFjaEhhbmRsZSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fYXR0YWNoSGFuZGxlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnByb2plY3RvclN0YXRlID0gUHJvamVjdG9yQXR0YWNoU3RhdGUuQXR0YWNoZWQ7XG5cblx0XHRcdGNvbnN0IGhhbmRsZSA9IHtcblx0XHRcdFx0ZGVzdHJveTogKCkgPT4ge1xuXHRcdFx0XHRcdGlmICh0aGlzLnByb2plY3RvclN0YXRlID09PSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5BdHRhY2hlZCkge1xuXHRcdFx0XHRcdFx0dGhpcy5fcHJvamVjdGlvbiA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdHRoaXMucHJvamVjdG9yU3RhdGUgPSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5EZXRhY2hlZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdHRoaXMub3duKGhhbmRsZSk7XG5cdFx0XHR0aGlzLl9hdHRhY2hIYW5kbGUgPSBoYW5kbGU7XG5cblx0XHRcdHRoaXMuX3Byb2plY3Rpb25PcHRpb25zID0geyAuLi50aGlzLl9wcm9qZWN0aW9uT3B0aW9ucywgLi4ueyBzeW5jOiAhdGhpcy5fYXN5bmMgfSB9O1xuXG5cdFx0XHRzd2l0Y2ggKHR5cGUpIHtcblx0XHRcdFx0Y2FzZSBBdHRhY2hUeXBlLkFwcGVuZDpcblx0XHRcdFx0XHR0aGlzLl9wcm9qZWN0aW9uID0gZG9tLmFwcGVuZCh0aGlzLnJvb3QsIHRoaXMsIHRoaXMuX3Byb2plY3Rpb25PcHRpb25zKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBBdHRhY2hUeXBlLk1lcmdlOlxuXHRcdFx0XHRcdHRoaXMuX3Byb2plY3Rpb24gPSBkb20ubWVyZ2UodGhpcy5yb290LCB0aGlzLCB0aGlzLl9wcm9qZWN0aW9uT3B0aW9ucyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLl9hdHRhY2hIYW5kbGU7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIFByb2plY3Rvcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgUHJvamVjdG9yTWl4aW47XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gUHJvamVjdG9yLnRzIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IsIFdpZGdldFByb3BlcnRpZXMsIFN1cHBvcnRlZENsYXNzTmFtZSB9IGZyb20gJy4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBSZWdpc3RyeSB9IGZyb20gJy4vLi4vUmVnaXN0cnknO1xuaW1wb3J0IHsgSW5qZWN0b3IgfSBmcm9tICcuLy4uL0luamVjdG9yJztcbmltcG9ydCB7IGluamVjdCB9IGZyb20gJy4vLi4vZGVjb3JhdG9ycy9pbmplY3QnO1xuaW1wb3J0IHsgV2lkZ2V0QmFzZSB9IGZyb20gJy4vLi4vV2lkZ2V0QmFzZSc7XG5pbXBvcnQgeyBoYW5kbGVEZWNvcmF0b3IgfSBmcm9tICcuLy4uL2RlY29yYXRvcnMvaGFuZGxlRGVjb3JhdG9yJztcbmltcG9ydCB7IGRpZmZQcm9wZXJ0eSB9IGZyb20gJy4vLi4vZGVjb3JhdG9ycy9kaWZmUHJvcGVydHknO1xuaW1wb3J0IHsgc2hhbGxvdyB9IGZyb20gJy4vLi4vZGlmZic7XG5cbi8qKlxuICogQSBsb29rdXAgb2JqZWN0IGZvciBhdmFpbGFibGUgY2xhc3MgbmFtZXNcbiAqL1xuZXhwb3J0IHR5cGUgQ2xhc3NOYW1lcyA9IHtcblx0W2tleTogc3RyaW5nXTogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBBIGxvb2t1cCBvYmplY3QgZm9yIGF2YWlsYWJsZSB3aWRnZXQgY2xhc3NlcyBuYW1lc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRoZW1lIHtcblx0W2tleTogc3RyaW5nXTogb2JqZWN0O1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgcmVxdWlyZWQgZm9yIHRoZSBUaGVtZWQgbWl4aW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaGVtZWRQcm9wZXJ0aWVzPFQgPSBDbGFzc05hbWVzPiBleHRlbmRzIFdpZGdldFByb3BlcnRpZXMge1xuXHRpbmplY3RlZFRoZW1lPzogYW55O1xuXHR0aGVtZT86IFRoZW1lO1xuXHRleHRyYUNsYXNzZXM/OiB7IFtQIGluIGtleW9mIFRdPzogc3RyaW5nIH07XG59XG5cbmNvbnN0IFRIRU1FX0tFWSA9ICcgX2tleSc7XG5cbmV4cG9ydCBjb25zdCBJTkpFQ1RFRF9USEVNRV9LRVkgPSBTeW1ib2woJ3RoZW1lJyk7XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciB0aGUgVGhlbWVkTWl4aW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaGVtZWRNaXhpbjxUID0gQ2xhc3NOYW1lcz4ge1xuXHR0aGVtZShjbGFzc2VzOiBTdXBwb3J0ZWRDbGFzc05hbWUpOiBTdXBwb3J0ZWRDbGFzc05hbWU7XG5cdHRoZW1lKGNsYXNzZXM6IFN1cHBvcnRlZENsYXNzTmFtZVtdKTogU3VwcG9ydGVkQ2xhc3NOYW1lW107XG5cdHByb3BlcnRpZXM6IFRoZW1lZFByb3BlcnRpZXM8VD47XG59XG5cbi8qKlxuICogRGVjb3JhdG9yIGZvciBiYXNlIGNzcyBjbGFzc2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aGVtZSh0aGVtZToge30pIHtcblx0cmV0dXJuIGhhbmRsZURlY29yYXRvcigodGFyZ2V0KSA9PiB7XG5cdFx0dGFyZ2V0LmFkZERlY29yYXRvcignYmFzZVRoZW1lQ2xhc3NlcycsIHRoZW1lKTtcblx0fSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJldmVyc2UgbG9va3VwIGZvciB0aGUgY2xhc3NlcyBwYXNzZWQgaW4gdmlhIHRoZSBgdGhlbWVgIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBjbGFzc2VzIFRoZSBiYXNlQ2xhc3NlcyBvYmplY3RcbiAqIEByZXF1aXJlc1xuICovXG5mdW5jdGlvbiBjcmVhdGVUaGVtZUNsYXNzZXNMb29rdXAoY2xhc3NlczogQ2xhc3NOYW1lc1tdKTogQ2xhc3NOYW1lcyB7XG5cdHJldHVybiBjbGFzc2VzLnJlZHVjZShcblx0XHQoY3VycmVudENsYXNzTmFtZXMsIGJhc2VDbGFzcykgPT4ge1xuXHRcdFx0T2JqZWN0LmtleXMoYmFzZUNsYXNzKS5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRjdXJyZW50Q2xhc3NOYW1lc1tiYXNlQ2xhc3Nba2V5XV0gPSBrZXk7XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBjdXJyZW50Q2xhc3NOYW1lcztcblx0XHR9LFxuXHRcdDxDbGFzc05hbWVzPnt9XG5cdCk7XG59XG5cbi8qKlxuICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBpcyBnaXZlbiBhIHRoZW1lIGFuZCBhbiBvcHRpb25hbCByZWdpc3RyeSwgdGhlIHRoZW1lXG4gKiBpbmplY3RvciBpcyBkZWZpbmVkIGFnYWluc3QgdGhlIHJlZ2lzdHJ5LCByZXR1cm5pbmcgdGhlIHRoZW1lLlxuICpcbiAqIEBwYXJhbSB0aGVtZSB0aGUgdGhlbWUgdG8gc2V0XG4gKiBAcGFyYW0gdGhlbWVSZWdpc3RyeSByZWdpc3RyeSB0byBkZWZpbmUgdGhlIHRoZW1lIGluamVjdG9yIGFnYWluc3QuIERlZmF1bHRzXG4gKiB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5XG4gKlxuICogQHJldHVybnMgdGhlIHRoZW1lIGluamVjdG9yIHVzZWQgdG8gc2V0IHRoZSB0aGVtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJUaGVtZUluamVjdG9yKHRoZW1lOiBhbnksIHRoZW1lUmVnaXN0cnk6IFJlZ2lzdHJ5KTogSW5qZWN0b3Ige1xuXHRjb25zdCB0aGVtZUluamVjdG9yID0gbmV3IEluamVjdG9yKHRoZW1lKTtcblx0dGhlbWVSZWdpc3RyeS5kZWZpbmVJbmplY3RvcihJTkpFQ1RFRF9USEVNRV9LRVksIChpbnZhbGlkYXRvcikgPT4ge1xuXHRcdHRoZW1lSW5qZWN0b3Iuc2V0SW52YWxpZGF0b3IoaW52YWxpZGF0b3IpO1xuXHRcdHJldHVybiAoKSA9PiB0aGVtZUluamVjdG9yLmdldCgpO1xuXHR9KTtcblx0cmV0dXJuIHRoZW1lSW5qZWN0b3I7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgY2xhc3MgZGVjb3JhdGVkIHdpdGggd2l0aCBUaGVtZWQgZnVuY3Rpb25hbGl0eVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBUaGVtZWRNaXhpbjxFLCBUIGV4dGVuZHMgQ29uc3RydWN0b3I8V2lkZ2V0QmFzZTxUaGVtZWRQcm9wZXJ0aWVzPEU+Pj4+KFxuXHRCYXNlOiBUXG4pOiBDb25zdHJ1Y3RvcjxUaGVtZWRNaXhpbjxFPj4gJiBUIHtcblx0QGluamVjdCh7XG5cdFx0bmFtZTogSU5KRUNURURfVEhFTUVfS0VZLFxuXHRcdGdldFByb3BlcnRpZXM6ICh0aGVtZTogVGhlbWUsIHByb3BlcnRpZXM6IFRoZW1lZFByb3BlcnRpZXMpOiBUaGVtZWRQcm9wZXJ0aWVzID0+IHtcblx0XHRcdGlmICghcHJvcGVydGllcy50aGVtZSkge1xuXHRcdFx0XHRyZXR1cm4geyB0aGVtZSB9O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHt9O1xuXHRcdH1cblx0fSlcblx0YWJzdHJhY3QgY2xhc3MgVGhlbWVkIGV4dGVuZHMgQmFzZSB7XG5cdFx0cHVibGljIGFic3RyYWN0IHByb3BlcnRpZXM6IFRoZW1lZFByb3BlcnRpZXM8RT47XG5cblx0XHQvKipcblx0XHQgKiBUaGUgVGhlbWVkIGJhc2VDbGFzc2VzXG5cdFx0ICovXG5cdFx0cHJpdmF0ZSBfcmVnaXN0ZXJlZEJhc2VUaGVtZTogQ2xhc3NOYW1lcyB8IHVuZGVmaW5lZDtcblxuXHRcdC8qKlxuXHRcdCAqIFJlZ2lzdGVyZWQgYmFzZSB0aGVtZSBrZXlzXG5cdFx0ICovXG5cdFx0cHJpdmF0ZSBfcmVnaXN0ZXJlZEJhc2VUaGVtZUtleXM6IHN0cmluZ1tdID0gW107XG5cblx0XHQvKipcblx0XHQgKiBSZXZlcnNlIGxvb2t1cCBvZiB0aGUgdGhlbWUgY2xhc3Nlc1xuXHRcdCAqL1xuXHRcdHByaXZhdGUgX2Jhc2VUaGVtZUNsYXNzZXNSZXZlcnNlTG9va3VwOiBDbGFzc05hbWVzIHwgdW5kZWZpbmVkO1xuXG5cdFx0LyoqXG5cdFx0ICogSW5kaWNhdGVzIGlmIGNsYXNzZXMgbWV0YSBkYXRhIG5lZWQgdG8gYmUgY2FsY3VsYXRlZC5cblx0XHQgKi9cblx0XHRwcml2YXRlIF9yZWNhbGN1bGF0ZUNsYXNzZXMgPSB0cnVlO1xuXG5cdFx0LyoqXG5cdFx0ICogTG9hZGVkIHRoZW1lXG5cdFx0ICovXG5cdFx0cHJpdmF0ZSBfdGhlbWU6IENsYXNzTmFtZXMgPSB7fTtcblxuXHRcdHB1YmxpYyB0aGVtZShjbGFzc2VzOiBTdXBwb3J0ZWRDbGFzc05hbWUpOiBTdXBwb3J0ZWRDbGFzc05hbWU7XG5cdFx0cHVibGljIHRoZW1lKGNsYXNzZXM6IFN1cHBvcnRlZENsYXNzTmFtZVtdKTogU3VwcG9ydGVkQ2xhc3NOYW1lW107XG5cdFx0cHVibGljIHRoZW1lKGNsYXNzZXM6IFN1cHBvcnRlZENsYXNzTmFtZSB8IFN1cHBvcnRlZENsYXNzTmFtZVtdKTogU3VwcG9ydGVkQ2xhc3NOYW1lIHwgU3VwcG9ydGVkQ2xhc3NOYW1lW10ge1xuXHRcdFx0aWYgKHRoaXMuX3JlY2FsY3VsYXRlQ2xhc3Nlcykge1xuXHRcdFx0XHR0aGlzLl9yZWNhbGN1bGF0ZVRoZW1lQ2xhc3NlcygpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkoY2xhc3NlcykpIHtcblx0XHRcdFx0cmV0dXJuIGNsYXNzZXMubWFwKChjbGFzc05hbWUpID0+IHRoaXMuX2dldFRoZW1lQ2xhc3MoY2xhc3NOYW1lKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5fZ2V0VGhlbWVDbGFzcyhjbGFzc2VzKTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBGdW5jdGlvbiBmaXJlZCB3aGVuIGB0aGVtZWAgb3IgYGV4dHJhQ2xhc3Nlc2AgYXJlIGNoYW5nZWQuXG5cdFx0ICovXG5cdFx0QGRpZmZQcm9wZXJ0eSgndGhlbWUnLCBzaGFsbG93KVxuXHRcdEBkaWZmUHJvcGVydHkoJ2V4dHJhQ2xhc3NlcycsIHNoYWxsb3cpXG5cdFx0cHJvdGVjdGVkIG9uUHJvcGVydGllc0NoYW5nZWQoKSB7XG5cdFx0XHR0aGlzLl9yZWNhbGN1bGF0ZUNsYXNzZXMgPSB0cnVlO1xuXHRcdH1cblxuXHRcdHByaXZhdGUgX2dldFRoZW1lQ2xhc3MoY2xhc3NOYW1lOiBTdXBwb3J0ZWRDbGFzc05hbWUpOiBTdXBwb3J0ZWRDbGFzc05hbWUge1xuXHRcdFx0aWYgKGNsYXNzTmFtZSA9PT0gdW5kZWZpbmVkIHx8IGNsYXNzTmFtZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm4gY2xhc3NOYW1lO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBleHRyYUNsYXNzZXMgPSB0aGlzLnByb3BlcnRpZXMuZXh0cmFDbGFzc2VzIHx8ICh7fSBhcyBhbnkpO1xuXHRcdFx0Y29uc3QgdGhlbWVDbGFzc05hbWUgPSB0aGlzLl9iYXNlVGhlbWVDbGFzc2VzUmV2ZXJzZUxvb2t1cCFbY2xhc3NOYW1lXTtcblx0XHRcdGxldCByZXN1bHRDbGFzc05hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0aWYgKCF0aGVtZUNsYXNzTmFtZSkge1xuXHRcdFx0XHRjb25zb2xlLndhcm4oYENsYXNzIG5hbWU6ICcke2NsYXNzTmFtZX0nIG5vdCBmb3VuZCBpbiB0aGVtZWApO1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGV4dHJhQ2xhc3Nlc1t0aGVtZUNsYXNzTmFtZV0pIHtcblx0XHRcdFx0cmVzdWx0Q2xhc3NOYW1lcy5wdXNoKGV4dHJhQ2xhc3Nlc1t0aGVtZUNsYXNzTmFtZV0pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5fdGhlbWVbdGhlbWVDbGFzc05hbWVdKSB7XG5cdFx0XHRcdHJlc3VsdENsYXNzTmFtZXMucHVzaCh0aGlzLl90aGVtZVt0aGVtZUNsYXNzTmFtZV0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVzdWx0Q2xhc3NOYW1lcy5wdXNoKHRoaXMuX3JlZ2lzdGVyZWRCYXNlVGhlbWUhW3RoZW1lQ2xhc3NOYW1lXSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0Q2xhc3NOYW1lcy5qb2luKCcgJyk7XG5cdFx0fVxuXG5cdFx0cHJpdmF0ZSBfcmVjYWxjdWxhdGVUaGVtZUNsYXNzZXMoKSB7XG5cdFx0XHRjb25zdCB7IHRoZW1lID0ge30gfSA9IHRoaXMucHJvcGVydGllcztcblx0XHRcdGNvbnN0IGJhc2VUaGVtZXMgPSB0aGlzLmdldERlY29yYXRvcignYmFzZVRoZW1lQ2xhc3NlcycpO1xuXHRcdFx0aWYgKCF0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lKSB7XG5cdFx0XHRcdHRoaXMuX3JlZ2lzdGVyZWRCYXNlVGhlbWUgPSBiYXNlVGhlbWVzLnJlZHVjZSgoZmluYWxCYXNlVGhlbWUsIGJhc2VUaGVtZSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHsgW1RIRU1FX0tFWV06IGtleSwgLi4uY2xhc3NlcyB9ID0gYmFzZVRoZW1lO1xuXHRcdFx0XHRcdHRoaXMuX3JlZ2lzdGVyZWRCYXNlVGhlbWVLZXlzLnB1c2goa2V5KTtcblx0XHRcdFx0XHRyZXR1cm4geyAuLi5maW5hbEJhc2VUaGVtZSwgLi4uY2xhc3NlcyB9O1xuXHRcdFx0XHR9LCB7fSk7XG5cdFx0XHRcdHRoaXMuX2Jhc2VUaGVtZUNsYXNzZXNSZXZlcnNlTG9va3VwID0gY3JlYXRlVGhlbWVDbGFzc2VzTG9va3VwKGJhc2VUaGVtZXMpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl90aGVtZSA9IHRoaXMuX3JlZ2lzdGVyZWRCYXNlVGhlbWVLZXlzLnJlZHVjZSgoYmFzZVRoZW1lLCB0aGVtZUtleSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4geyAuLi5iYXNlVGhlbWUsIC4uLnRoZW1lW3RoZW1lS2V5XSB9O1xuXHRcdFx0fSwge30pO1xuXG5cdFx0XHR0aGlzLl9yZWNhbGN1bGF0ZUNsYXNzZXMgPSBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gVGhlbWVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBUaGVtZWRNaXhpbjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBUaGVtZWQudHMiLCJpbXBvcnQgeyBXaWRnZXRCYXNlLCBub0JpbmQgfSBmcm9tICcuL1dpZGdldEJhc2UnO1xuaW1wb3J0IHsgUHJvamVjdG9yTWl4aW4gfSBmcm9tICcuL21peGlucy9Qcm9qZWN0b3InO1xuaW1wb3J0IHsgZnJvbSB9IGZyb20gJ0Bkb2pvL3NoaW0vYXJyYXknO1xuaW1wb3J0IHsgdywgZG9tIH0gZnJvbSAnLi9kJztcbmltcG9ydCBnbG9iYWwgZnJvbSAnQGRvam8vc2hpbS9nbG9iYWwnO1xuaW1wb3J0IHsgcmVnaXN0ZXJUaGVtZUluamVjdG9yIH0gZnJvbSAnLi9taXhpbnMvVGhlbWVkJztcbmltcG9ydCB7IGFsd2F5c1JlbmRlciB9IGZyb20gJy4vZGVjb3JhdG9ycy9hbHdheXNSZW5kZXInO1xuXG5leHBvcnQgZW51bSBDdXN0b21FbGVtZW50Q2hpbGRUeXBlIHtcblx0RE9KTyA9ICdET0pPJyxcblx0Tk9ERSA9ICdOT0RFJyxcblx0VEVYVCA9ICdURVhUJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRG9tVG9XaWRnZXRXcmFwcGVyKGRvbU5vZGU6IEhUTUxFbGVtZW50KTogYW55IHtcblx0QGFsd2F5c1JlbmRlcigpXG5cdGNsYXNzIERvbVRvV2lkZ2V0V3JhcHBlciBleHRlbmRzIFdpZGdldEJhc2U8YW55PiB7XG5cdFx0cHJvdGVjdGVkIHJlbmRlcigpIHtcblx0XHRcdGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyh0aGlzLnByb3BlcnRpZXMpLnJlZHVjZShcblx0XHRcdFx0KHByb3BzLCBrZXk6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHZhbHVlID0gdGhpcy5wcm9wZXJ0aWVzW2tleV07XG5cdFx0XHRcdFx0aWYgKGtleS5pbmRleE9mKCdvbicpID09PSAwKSB7XG5cdFx0XHRcdFx0XHRrZXkgPSBgX18ke2tleX1gO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwcm9wc1trZXldID0gdmFsdWU7XG5cdFx0XHRcdFx0cmV0dXJuIHByb3BzO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR7fSBhcyBhbnlcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm4gZG9tKHsgbm9kZTogZG9tTm9kZSwgcHJvcHM6IHByb3BlcnRpZXMsIGRpZmZUeXBlOiAnZG9tJyB9KTtcblx0XHR9XG5cblx0XHRzdGF0aWMgZ2V0IGRvbU5vZGUoKSB7XG5cdFx0XHRyZXR1cm4gZG9tTm9kZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gRG9tVG9XaWRnZXRXcmFwcGVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKGRlc2NyaXB0b3I6IGFueSwgV2lkZ2V0Q29uc3RydWN0b3I6IGFueSk6IGFueSB7XG5cdGNvbnN0IHsgYXR0cmlidXRlcywgY2hpbGRUeXBlLCByZWdpc3RyeUZhY3RvcnkgfSA9IGRlc2NyaXB0b3I7XG5cdGNvbnN0IGF0dHJpYnV0ZU1hcDogYW55ID0ge307XG5cblx0YXR0cmlidXRlcy5mb3JFYWNoKChwcm9wZXJ0eU5hbWU6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRhdHRyaWJ1dGVNYXBbYXR0cmlidXRlTmFtZV0gPSBwcm9wZXJ0eU5hbWU7XG5cdH0pO1xuXG5cdHJldHVybiBjbGFzcyBleHRlbmRzIEhUTUxFbGVtZW50IHtcblx0XHRwcml2YXRlIF9wcm9qZWN0b3I6IGFueTtcblx0XHRwcml2YXRlIF9wcm9wZXJ0aWVzOiBhbnkgPSB7fTtcblx0XHRwcml2YXRlIF9jaGlsZHJlbjogYW55W10gPSBbXTtcblx0XHRwcml2YXRlIF9ldmVudFByb3BlcnRpZXM6IGFueSA9IHt9O1xuXHRcdHByaXZhdGUgX2luaXRpYWxpc2VkID0gZmFsc2U7XG5cblx0XHRwdWJsaWMgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG5cdFx0XHRpZiAodGhpcy5faW5pdGlhbGlzZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBkb21Qcm9wZXJ0aWVzOiBhbnkgPSB7fTtcblx0XHRcdGNvbnN0IHsgYXR0cmlidXRlcywgcHJvcGVydGllcywgZXZlbnRzIH0gPSBkZXNjcmlwdG9yO1xuXG5cdFx0XHR0aGlzLl9wcm9wZXJ0aWVzID0geyAuLi50aGlzLl9wcm9wZXJ0aWVzLCAuLi50aGlzLl9hdHRyaWJ1dGVzVG9Qcm9wZXJ0aWVzKGF0dHJpYnV0ZXMpIH07XG5cblx0XHRcdFsuLi5hdHRyaWJ1dGVzLCAuLi5wcm9wZXJ0aWVzXS5mb3JFYWNoKChwcm9wZXJ0eU5hbWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRjb25zdCB2YWx1ZSA9ICh0aGlzIGFzIGFueSlbcHJvcGVydHlOYW1lXTtcblx0XHRcdFx0Y29uc3QgZmlsdGVyZWRQcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUucmVwbGFjZSgvXm9uLywgJ19fJyk7XG5cdFx0XHRcdGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZmlsdGVyZWRQcm9wZXJ0eU5hbWUgIT09IHByb3BlcnR5TmFtZSkge1xuXHRcdFx0XHRcdGRvbVByb3BlcnRpZXNbZmlsdGVyZWRQcm9wZXJ0eU5hbWVdID0ge1xuXHRcdFx0XHRcdFx0Z2V0OiAoKSA9PiB0aGlzLl9nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpLFxuXHRcdFx0XHRcdFx0c2V0OiAodmFsdWU6IGFueSkgPT4gdGhpcy5fc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSlcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZG9tUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0ge1xuXHRcdFx0XHRcdGdldDogKCkgPT4gdGhpcy5fZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSxcblx0XHRcdFx0XHRzZXQ6ICh2YWx1ZTogYW55KSA9PiB0aGlzLl9zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKVxuXHRcdFx0XHR9O1xuXHRcdFx0fSk7XG5cblx0XHRcdGV2ZW50cy5mb3JFYWNoKChwcm9wZXJ0eU5hbWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRjb25zdCBldmVudE5hbWUgPSBwcm9wZXJ0eU5hbWUucmVwbGFjZSgvXm9uLywgJycpLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdGNvbnN0IGZpbHRlcmVkUHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lLnJlcGxhY2UoL15vbi8sICdfX29uJyk7XG5cblx0XHRcdFx0ZG9tUHJvcGVydGllc1tmaWx0ZXJlZFByb3BlcnR5TmFtZV0gPSB7XG5cdFx0XHRcdFx0Z2V0OiAoKSA9PiB0aGlzLl9nZXRFdmVudFByb3BlcnR5KHByb3BlcnR5TmFtZSksXG5cdFx0XHRcdFx0c2V0OiAodmFsdWU6IGFueSkgPT4gdGhpcy5fc2V0RXZlbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdHRoaXMuX2V2ZW50UHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR0aGlzLl9wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSAoLi4uYXJnczogYW55W10pID0+IHtcblx0XHRcdFx0XHRjb25zdCBldmVudENhbGxiYWNrID0gdGhpcy5fZ2V0RXZlbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpO1xuXHRcdFx0XHRcdGlmICh0eXBlb2YgZXZlbnRDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdFx0ZXZlbnRDYWxsYmFjayguLi5hcmdzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5kaXNwYXRjaEV2ZW50KFxuXHRcdFx0XHRcdFx0bmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwge1xuXHRcdFx0XHRcdFx0XHRidWJibGVzOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0ZGV0YWlsOiBhcmdzXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblxuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywgZG9tUHJvcGVydGllcyk7XG5cblx0XHRcdGNvbnN0IGNoaWxkcmVuID0gY2hpbGRUeXBlID09PSBDdXN0b21FbGVtZW50Q2hpbGRUeXBlLlRFWFQgPyB0aGlzLmNoaWxkTm9kZXMgOiB0aGlzLmNoaWxkcmVuO1xuXG5cdFx0XHRmcm9tKGNoaWxkcmVuKS5mb3JFYWNoKChjaGlsZE5vZGU6IE5vZGUpID0+IHtcblx0XHRcdFx0aWYgKGNoaWxkVHlwZSA9PT0gQ3VzdG9tRWxlbWVudENoaWxkVHlwZS5ET0pPKSB7XG5cdFx0XHRcdFx0Y2hpbGROb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2Rvam8tY2UtcmVuZGVyJywgKCkgPT4gdGhpcy5fcmVuZGVyKCkpO1xuXHRcdFx0XHRcdGNoaWxkTm9kZS5hZGRFdmVudExpc3RlbmVyKCdkb2pvLWNlLWNvbm5lY3RlZCcsICgpID0+IHRoaXMuX3JlbmRlcigpKTtcblx0XHRcdFx0XHR0aGlzLl9jaGlsZHJlbi5wdXNoKERvbVRvV2lkZ2V0V3JhcHBlcihjaGlsZE5vZGUgYXMgSFRNTEVsZW1lbnQpKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLl9jaGlsZHJlbi5wdXNoKGRvbSh7IG5vZGU6IGNoaWxkTm9kZSBhcyBIVE1MRWxlbWVudCwgZGlmZlR5cGU6ICdkb20nIH0pKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZG9qby1jZS1jb25uZWN0ZWQnLCAoZTogYW55KSA9PiB0aGlzLl9jaGlsZENvbm5lY3RlZChlKSk7XG5cblx0XHRcdGNvbnN0IHdpZGdldFByb3BlcnRpZXMgPSB0aGlzLl9wcm9wZXJ0aWVzO1xuXHRcdFx0Y29uc3QgcmVuZGVyQ2hpbGRyZW4gPSAoKSA9PiB0aGlzLl9fY2hpbGRyZW5fXygpO1xuXHRcdFx0Y29uc3QgV3JhcHBlciA9IGNsYXNzIGV4dGVuZHMgV2lkZ2V0QmFzZSB7XG5cdFx0XHRcdHJlbmRlcigpIHtcblx0XHRcdFx0XHRyZXR1cm4gdyhXaWRnZXRDb25zdHJ1Y3Rvciwgd2lkZ2V0UHJvcGVydGllcywgcmVuZGVyQ2hpbGRyZW4oKSk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRjb25zdCByZWdpc3RyeSA9IHJlZ2lzdHJ5RmFjdG9yeSgpO1xuXHRcdFx0Y29uc3QgdGhlbWVDb250ZXh0ID0gcmVnaXN0ZXJUaGVtZUluamVjdG9yKHRoaXMuX2dldFRoZW1lKCksIHJlZ2lzdHJ5KTtcblx0XHRcdGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdkb2pvLXRoZW1lLXNldCcsICgpID0+IHRoZW1lQ29udGV4dC5zZXQodGhpcy5fZ2V0VGhlbWUoKSkpO1xuXHRcdFx0Y29uc3QgUHJvamVjdG9yID0gUHJvamVjdG9yTWl4aW4oV3JhcHBlcik7XG5cdFx0XHR0aGlzLl9wcm9qZWN0b3IgPSBuZXcgUHJvamVjdG9yKCk7XG5cdFx0XHR0aGlzLl9wcm9qZWN0b3Iuc2V0UHJvcGVydGllcyh7IHJlZ2lzdHJ5IH0pO1xuXHRcdFx0dGhpcy5fcHJvamVjdG9yLmFwcGVuZCh0aGlzKTtcblxuXHRcdFx0dGhpcy5faW5pdGlhbGlzZWQgPSB0cnVlO1xuXHRcdFx0dGhpcy5kaXNwYXRjaEV2ZW50KFxuXHRcdFx0XHRuZXcgQ3VzdG9tRXZlbnQoJ2Rvam8tY2UtY29ubmVjdGVkJywge1xuXHRcdFx0XHRcdGJ1YmJsZXM6IHRydWUsXG5cdFx0XHRcdFx0ZGV0YWlsOiB0aGlzXG5cdFx0XHRcdH0pXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHByaXZhdGUgX2dldFRoZW1lKCkge1xuXHRcdFx0aWYgKGdsb2JhbCAmJiBnbG9iYWwuZG9qb2NlICYmIGdsb2JhbC5kb2pvY2UudGhlbWUpIHtcblx0XHRcdFx0cmV0dXJuIGdsb2JhbC5kb2pvY2UudGhlbWVzW2dsb2JhbC5kb2pvY2UudGhlbWVdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHByaXZhdGUgX2NoaWxkQ29ubmVjdGVkKGU6IGFueSkge1xuXHRcdFx0Y29uc3Qgbm9kZSA9IGUuZGV0YWlsO1xuXHRcdFx0aWYgKG5vZGUucGFyZW50Tm9kZSA9PT0gdGhpcykge1xuXHRcdFx0XHRjb25zdCBleGlzdHMgPSB0aGlzLl9jaGlsZHJlbi5zb21lKChjaGlsZCkgPT4gY2hpbGQuZG9tTm9kZSA9PT0gbm9kZSk7XG5cdFx0XHRcdGlmICghZXhpc3RzKSB7XG5cdFx0XHRcdFx0bm9kZS5hZGRFdmVudExpc3RlbmVyKCdkb2pvLWNlLXJlbmRlcicsICgpID0+IHRoaXMuX3JlbmRlcigpKTtcblx0XHRcdFx0XHR0aGlzLl9jaGlsZHJlbi5wdXNoKERvbVRvV2lkZ2V0V3JhcHBlcihub2RlKSk7XG5cdFx0XHRcdFx0dGhpcy5fcmVuZGVyKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRwcml2YXRlIF9yZW5kZXIoKSB7XG5cdFx0XHRpZiAodGhpcy5fcHJvamVjdG9yKSB7XG5cdFx0XHRcdHRoaXMuX3Byb2plY3Rvci5pbnZhbGlkYXRlKCk7XG5cdFx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudChcblx0XHRcdFx0XHRuZXcgQ3VzdG9tRXZlbnQoJ2Rvam8tY2UtcmVuZGVyJywge1xuXHRcdFx0XHRcdFx0YnViYmxlczogZmFsc2UsXG5cdFx0XHRcdFx0XHRkZXRhaWw6IHRoaXNcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHB1YmxpYyBfX3Byb3BlcnRpZXNfXygpIHtcblx0XHRcdHJldHVybiB7IC4uLnRoaXMuX3Byb3BlcnRpZXMsIC4uLnRoaXMuX2V2ZW50UHJvcGVydGllcyB9O1xuXHRcdH1cblxuXHRcdHB1YmxpYyBfX2NoaWxkcmVuX18oKSB7XG5cdFx0XHRpZiAoY2hpbGRUeXBlID09PSBDdXN0b21FbGVtZW50Q2hpbGRUeXBlLkRPSk8pIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2NoaWxkcmVuLmZpbHRlcigoQ2hpbGQpID0+IENoaWxkLmRvbU5vZGUuaXNXaWRnZXQpLm1hcCgoQ2hpbGQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHsgZG9tTm9kZSB9ID0gQ2hpbGQ7XG5cdFx0XHRcdFx0cmV0dXJuIHcoQ2hpbGQsIHsgLi4uZG9tTm9kZS5fX3Byb3BlcnRpZXNfXygpIH0sIFsuLi5kb21Ob2RlLl9fY2hpbGRyZW5fXygpXSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2NoaWxkcmVuO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHB1YmxpYyBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZTogc3RyaW5nLCBvbGRWYWx1ZTogc3RyaW5nIHwgbnVsbCwgdmFsdWU6IHN0cmluZyB8IG51bGwpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IGF0dHJpYnV0ZU1hcFtuYW1lXTtcblx0XHRcdHRoaXMuX3NldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUpO1xuXHRcdH1cblxuXHRcdHByaXZhdGUgX3NldEV2ZW50UHJvcGVydHkocHJvcGVydHlOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcblx0XHRcdHRoaXMuX2V2ZW50UHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG5cdFx0fVxuXG5cdFx0cHJpdmF0ZSBfZ2V0RXZlbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2V2ZW50UHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuXHRcdH1cblxuXHRcdHByaXZhdGUgX3NldFByb3BlcnR5KHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG5cdFx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdHZhbHVlW25vQmluZF0gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG5cdFx0XHR0aGlzLl9yZW5kZXIoKTtcblx0XHR9XG5cblx0XHRwcml2YXRlIF9nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuXHRcdFx0cmV0dXJuIHRoaXMuX3Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcblx0XHR9XG5cblx0XHRwcml2YXRlIF9hdHRyaWJ1dGVzVG9Qcm9wZXJ0aWVzKGF0dHJpYnV0ZXM6IHN0cmluZ1tdKSB7XG5cdFx0XHRyZXR1cm4gYXR0cmlidXRlcy5yZWR1Y2UoKHByb3BlcnRpZXM6IGFueSwgcHJvcGVydHlOYW1lOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0Y29uc3QgYXR0cmlidXRlTmFtZSA9IHByb3BlcnR5TmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuXHRcdFx0XHRpZiAodmFsdWUgIT09IG51bGwpIHtcblx0XHRcdFx0XHRwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcHJvcGVydGllcztcblx0XHRcdH0sIHt9KTtcblx0XHR9XG5cblx0XHRzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcblx0XHRcdHJldHVybiBPYmplY3Qua2V5cyhhdHRyaWJ1dGVNYXApO1xuXHRcdH1cblxuXHRcdHB1YmxpYyBnZXQgaXNXaWRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlcihXaWRnZXRDb25zdHJ1Y3RvcjogYW55KTogdm9pZCB7XG5cdGNvbnN0IGRlc2NyaXB0b3IgPSBXaWRnZXRDb25zdHJ1Y3Rvci5wcm90b3R5cGUgJiYgV2lkZ2V0Q29uc3RydWN0b3IucHJvdG90eXBlLl9fY3VzdG9tRWxlbWVudERlc2NyaXB0b3I7XG5cblx0aWYgKCFkZXNjcmlwdG9yKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0J0Nhbm5vdCBnZXQgZGVzY3JpcHRvciBmb3IgQ3VzdG9tIEVsZW1lbnQsIGhhdmUgeW91IGFkZGVkIHRoZSBAY3VzdG9tRWxlbWVudCBkZWNvcmF0b3IgdG8geW91ciBXaWRnZXQ/J1xuXHRcdCk7XG5cdH1cblxuXHRnbG9iYWwuY3VzdG9tRWxlbWVudHMuZGVmaW5lKGRlc2NyaXB0b3IudGFnTmFtZSwgY3JlYXRlKGRlc2NyaXB0b3IsIFdpZGdldENvbnN0cnVjdG9yKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHJlZ2lzdGVyQ3VzdG9tRWxlbWVudC50cyIsImltcG9ydCBnbG9iYWwgZnJvbSAnQGRvam8vc2hpbS9nbG9iYWwnO1xuaW1wb3J0IHtcblx0Q29yZVByb3BlcnRpZXMsXG5cdERlZmF1bHRXaWRnZXRCYXNlSW50ZXJmYWNlLFxuXHRETm9kZSxcblx0Vk5vZGUsXG5cdFdOb2RlLFxuXHRQcm9qZWN0aW9uT3B0aW9ucyxcblx0UHJvamVjdGlvbixcblx0U3VwcG9ydGVkQ2xhc3NOYW1lLFxuXHRUcmFuc2l0aW9uU3RyYXRlZ3ksXG5cdFZOb2RlUHJvcGVydGllc1xufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgZnJvbSBhcyBhcnJheUZyb20gfSBmcm9tICdAZG9qby9zaGltL2FycmF5JztcbmltcG9ydCB7IGlzV05vZGUsIGlzVk5vZGUsIGlzRG9tVk5vZGUsIFZOT0RFLCBXTk9ERSB9IGZyb20gJy4vZCc7XG5pbXBvcnQgeyBpc1dpZGdldEJhc2VDb25zdHJ1Y3RvciB9IGZyb20gJy4vUmVnaXN0cnknO1xuaW1wb3J0IFdlYWtNYXAgZnJvbSAnQGRvam8vc2hpbS9XZWFrTWFwJztcbmltcG9ydCBOb2RlSGFuZGxlciBmcm9tICcuL05vZGVIYW5kbGVyJztcbmltcG9ydCBSZWdpc3RyeUhhbmRsZXIgZnJvbSAnLi9SZWdpc3RyeUhhbmRsZXInO1xuXG5jb25zdCBOQU1FU1BBQ0VfVzMgPSAnaHR0cDovL3d3dy53My5vcmcvJztcbmNvbnN0IE5BTUVTUEFDRV9TVkcgPSBOQU1FU1BBQ0VfVzMgKyAnMjAwMC9zdmcnO1xuY29uc3QgTkFNRVNQQUNFX1hMSU5LID0gTkFNRVNQQUNFX1czICsgJzE5OTkveGxpbmsnO1xuXG5jb25zdCBlbXB0eUFycmF5OiAoSW50ZXJuYWxXTm9kZSB8IEludGVybmFsVk5vZGUpW10gPSBbXTtcblxuZXhwb3J0IHR5cGUgUmVuZGVyUmVzdWx0ID0gRE5vZGU8YW55PiB8IEROb2RlPGFueT5bXTtcblxuaW50ZXJmYWNlIEluc3RhbmNlTWFwRGF0YSB7XG5cdHBhcmVudFZOb2RlOiBJbnRlcm5hbFZOb2RlO1xuXHRkbm9kZTogSW50ZXJuYWxXTm9kZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnRlcm5hbFdOb2RlIGV4dGVuZHMgV05vZGU8RGVmYXVsdFdpZGdldEJhc2VJbnRlcmZhY2U+IHtcblx0LyoqXG5cdCAqIFRoZSBpbnN0YW5jZSBvZiB0aGUgd2lkZ2V0XG5cdCAqL1xuXHRpbnN0YW5jZTogRGVmYXVsdFdpZGdldEJhc2VJbnRlcmZhY2U7XG5cblx0LyoqXG5cdCAqIFRoZSByZW5kZXJlZCBETm9kZXMgZnJvbSB0aGUgaW5zdGFuY2Vcblx0ICovXG5cdHJlbmRlcmVkOiBJbnRlcm5hbEROb2RlW107XG5cblx0LyoqXG5cdCAqIENvcmUgcHJvcGVydGllcyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSB3aWRnZXQgY29yZSBzeXN0ZW1cblx0ICovXG5cdGNvcmVQcm9wZXJ0aWVzOiBDb3JlUHJvcGVydGllcztcblxuXHQvKipcblx0ICogQ2hpbGRyZW4gZm9yIHRoZSBXTm9kZVxuXHQgKi9cblx0Y2hpbGRyZW46IEludGVybmFsRE5vZGVbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnRlcm5hbFZOb2RlIGV4dGVuZHMgVk5vZGUge1xuXHQvKipcblx0ICogQ2hpbGRyZW4gZm9yIHRoZSBWTm9kZVxuXHQgKi9cblx0Y2hpbGRyZW4/OiBJbnRlcm5hbEROb2RlW107XG5cblx0aW5zZXJ0ZWQ/OiBib29sZWFuO1xuXG5cdC8qKlxuXHQgKiBCYWcgdXNlZCB0byBzdGlsbCBkZWNvcmF0ZSBwcm9wZXJ0aWVzIG9uIGEgZGVmZXJyZWQgcHJvcGVydGllcyBjYWxsYmFja1xuXHQgKi9cblx0ZGVjb3JhdGVkRGVmZXJyZWRQcm9wZXJ0aWVzPzogVk5vZGVQcm9wZXJ0aWVzO1xuXG5cdC8qKlxuXHQgKiBET00gZWxlbWVudFxuXHQgKi9cblx0ZG9tTm9kZT86IEVsZW1lbnQgfCBUZXh0O1xufVxuXG5leHBvcnQgdHlwZSBJbnRlcm5hbEROb2RlID0gSW50ZXJuYWxWTm9kZSB8IEludGVybmFsV05vZGU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyUXVldWUge1xuXHRpbnN0YW5jZTogRGVmYXVsdFdpZGdldEJhc2VJbnRlcmZhY2U7XG5cdGRlcHRoOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2lkZ2V0RGF0YSB7XG5cdG9uRGV0YWNoOiAoKSA9PiB2b2lkO1xuXHRvbkF0dGFjaDogKCkgPT4gdm9pZDtcblx0ZGlydHk6IGJvb2xlYW47XG5cdHJlZ2lzdHJ5OiAoKSA9PiBSZWdpc3RyeUhhbmRsZXI7XG5cdG5vZGVIYW5kbGVyOiBOb2RlSGFuZGxlcjtcblx0Y29yZVByb3BlcnRpZXM6IENvcmVQcm9wZXJ0aWVzO1xuXHRpbnZhbGlkYXRlPzogRnVuY3Rpb247XG5cdHJlbmRlcmluZzogYm9vbGVhbjtcblx0aW5wdXRQcm9wZXJ0aWVzOiBhbnk7XG59XG5cbmludGVyZmFjZSBQcm9qZWN0b3JTdGF0ZSB7XG5cdGRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzOiBGdW5jdGlvbltdO1xuXHRhZnRlclJlbmRlckNhbGxiYWNrczogRnVuY3Rpb25bXTtcblx0bm9kZU1hcDogV2Vha01hcDxOb2RlLCBXZWFrTWFwPEZ1bmN0aW9uLCBFdmVudExpc3RlbmVyPj47XG5cdHJlbmRlclNjaGVkdWxlZD86IG51bWJlcjtcblx0cmVuZGVyUXVldWU6IFJlbmRlclF1ZXVlW107XG5cdG1lcmdlOiBib29sZWFuO1xuXHRtZXJnZUVsZW1lbnQ/OiBOb2RlO1xufVxuXG5leHBvcnQgY29uc3Qgd2lkZ2V0SW5zdGFuY2VNYXAgPSBuZXcgV2Vha01hcDxhbnksIFdpZGdldERhdGE+KCk7XG5cbmNvbnN0IGluc3RhbmNlTWFwID0gbmV3IFdlYWtNYXA8RGVmYXVsdFdpZGdldEJhc2VJbnRlcmZhY2UsIEluc3RhbmNlTWFwRGF0YT4oKTtcbmNvbnN0IHByb2plY3RvclN0YXRlTWFwID0gbmV3IFdlYWtNYXA8RGVmYXVsdFdpZGdldEJhc2VJbnRlcmZhY2UsIFByb2plY3RvclN0YXRlPigpO1xuXG5mdW5jdGlvbiBzYW1lKGRub2RlMTogSW50ZXJuYWxETm9kZSwgZG5vZGUyOiBJbnRlcm5hbEROb2RlKSB7XG5cdGlmIChpc1ZOb2RlKGRub2RlMSkgJiYgaXNWTm9kZShkbm9kZTIpKSB7XG5cdFx0aWYgKGlzRG9tVk5vZGUoZG5vZGUxKSB8fCBpc0RvbVZOb2RlKGRub2RlMikpIHtcblx0XHRcdGlmIChkbm9kZTEuZG9tTm9kZSAhPT0gZG5vZGUyLmRvbU5vZGUpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoZG5vZGUxLnRhZyAhPT0gZG5vZGUyLnRhZykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoZG5vZGUxLnByb3BlcnRpZXMua2V5ICE9PSBkbm9kZTIucHJvcGVydGllcy5rZXkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gZWxzZSBpZiAoaXNXTm9kZShkbm9kZTEpICYmIGlzV05vZGUoZG5vZGUyKSkge1xuXHRcdGlmIChkbm9kZTEuaW5zdGFuY2UgPT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZG5vZGUyLndpZGdldENvbnN0cnVjdG9yID09PSAnc3RyaW5nJykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoZG5vZGUxLndpZGdldENvbnN0cnVjdG9yICE9PSBkbm9kZTIud2lkZ2V0Q29uc3RydWN0b3IpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKGRub2RlMS5wcm9wZXJ0aWVzLmtleSAhPT0gZG5vZGUyLnByb3BlcnRpZXMua2V5KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn1cblxuY29uc3QgbWlzc2luZ1RyYW5zaXRpb24gPSBmdW5jdGlvbigpIHtcblx0dGhyb3cgbmV3IEVycm9yKCdQcm92aWRlIGEgdHJhbnNpdGlvbnMgb2JqZWN0IHRvIHRoZSBwcm9qZWN0aW9uT3B0aW9ucyB0byBkbyBhbmltYXRpb25zJyk7XG59O1xuXG5mdW5jdGlvbiBnZXRQcm9qZWN0aW9uT3B0aW9ucyhcblx0cHJvamVjdG9yT3B0aW9uczogUGFydGlhbDxQcm9qZWN0aW9uT3B0aW9ucz4sXG5cdHByb2plY3Rvckluc3RhbmNlOiBEZWZhdWx0V2lkZ2V0QmFzZUludGVyZmFjZVxuKTogUHJvamVjdGlvbk9wdGlvbnMge1xuXHRjb25zdCBkZWZhdWx0czogUGFydGlhbDxQcm9qZWN0aW9uT3B0aW9ucz4gPSB7XG5cdFx0bmFtZXNwYWNlOiB1bmRlZmluZWQsXG5cdFx0c3R5bGVBcHBseWVyOiBmdW5jdGlvbihkb21Ob2RlOiBIVE1MRWxlbWVudCwgc3R5bGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcblx0XHRcdChkb21Ob2RlLnN0eWxlIGFzIGFueSlbc3R5bGVOYW1lXSA9IHZhbHVlO1xuXHRcdH0sXG5cdFx0dHJhbnNpdGlvbnM6IHtcblx0XHRcdGVudGVyOiBtaXNzaW5nVHJhbnNpdGlvbixcblx0XHRcdGV4aXQ6IG1pc3NpbmdUcmFuc2l0aW9uXG5cdFx0fSxcblx0XHRkZXB0aDogMCxcblx0XHRtZXJnZTogZmFsc2UsXG5cdFx0c3luYzogZmFsc2UsXG5cdFx0cHJvamVjdG9ySW5zdGFuY2Vcblx0fTtcblx0cmV0dXJuIHsgLi4uZGVmYXVsdHMsIC4uLnByb2plY3Rvck9wdGlvbnMgfSBhcyBQcm9qZWN0aW9uT3B0aW9ucztcbn1cblxuZnVuY3Rpb24gY2hlY2tTdHlsZVZhbHVlKHN0eWxlVmFsdWU6IE9iamVjdCkge1xuXHRpZiAodHlwZW9mIHN0eWxlVmFsdWUgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdTdHlsZSB2YWx1ZXMgbXVzdCBiZSBzdHJpbmdzJyk7XG5cdH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRXZlbnQoXG5cdGRvbU5vZGU6IE5vZGUsXG5cdGV2ZW50TmFtZTogc3RyaW5nLFxuXHRjdXJyZW50VmFsdWU6IEZ1bmN0aW9uLFxuXHRwcm9qZWN0aW9uT3B0aW9uczogUHJvamVjdGlvbk9wdGlvbnMsXG5cdGJpbmQ6IGFueSxcblx0cHJldmlvdXNWYWx1ZT86IEZ1bmN0aW9uXG4pIHtcblx0Y29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpITtcblx0Y29uc3QgZXZlbnRNYXAgPSBwcm9qZWN0b3JTdGF0ZS5ub2RlTWFwLmdldChkb21Ob2RlKSB8fCBuZXcgV2Vha01hcCgpO1xuXG5cdGlmIChwcmV2aW91c1ZhbHVlKSB7XG5cdFx0Y29uc3QgcHJldmlvdXNFdmVudCA9IGV2ZW50TWFwLmdldChwcmV2aW91c1ZhbHVlKTtcblx0XHRkb21Ob2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBwcmV2aW91c0V2ZW50KTtcblx0fVxuXG5cdGxldCBjYWxsYmFjayA9IGN1cnJlbnRWYWx1ZS5iaW5kKGJpbmQpO1xuXG5cdGlmIChldmVudE5hbWUgPT09ICdpbnB1dCcpIHtcblx0XHRjYWxsYmFjayA9IGZ1bmN0aW9uKHRoaXM6IGFueSwgZXZ0OiBFdmVudCkge1xuXHRcdFx0Y3VycmVudFZhbHVlLmNhbGwodGhpcywgZXZ0KTtcblx0XHRcdChldnQudGFyZ2V0IGFzIGFueSlbJ29uaW5wdXQtdmFsdWUnXSA9IChldnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuXHRcdH0uYmluZChiaW5kKTtcblx0fVxuXG5cdGRvbU5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrKTtcblx0ZXZlbnRNYXAuc2V0KGN1cnJlbnRWYWx1ZSwgY2FsbGJhY2spO1xuXHRwcm9qZWN0b3JTdGF0ZS5ub2RlTWFwLnNldChkb21Ob2RlLCBldmVudE1hcCk7XG59XG5cbmZ1bmN0aW9uIGFkZENsYXNzZXMoZG9tTm9kZTogRWxlbWVudCwgY2xhc3NlczogU3VwcG9ydGVkQ2xhc3NOYW1lKSB7XG5cdGlmIChjbGFzc2VzKSB7XG5cdFx0Y29uc3QgY2xhc3NOYW1lcyA9IGNsYXNzZXMuc3BsaXQoJyAnKTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGNsYXNzTmFtZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGRvbU5vZGUuY2xhc3NMaXN0LmFkZChjbGFzc05hbWVzW2ldKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ2xhc3Nlcyhkb21Ob2RlOiBFbGVtZW50LCBjbGFzc2VzOiBTdXBwb3J0ZWRDbGFzc05hbWUpIHtcblx0aWYgKGNsYXNzZXMpIHtcblx0XHRjb25zdCBjbGFzc05hbWVzID0gY2xhc3Nlcy5zcGxpdCgnICcpO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0ZG9tTm9kZS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZXNbaV0pO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBidWlsZFByZXZpb3VzUHJvcGVydGllcyhkb21Ob2RlOiBhbnksIHByZXZpb3VzOiBJbnRlcm5hbFZOb2RlLCBjdXJyZW50OiBJbnRlcm5hbFZOb2RlKSB7XG5cdGNvbnN0IHsgZGlmZlR5cGUsIHByb3BlcnRpZXMsIGF0dHJpYnV0ZXMgfSA9IGN1cnJlbnQ7XG5cdGlmICghZGlmZlR5cGUgfHwgZGlmZlR5cGUgPT09ICd2ZG9tJykge1xuXHRcdHJldHVybiB7IHByb3BlcnRpZXM6IHByZXZpb3VzLnByb3BlcnRpZXMsIGF0dHJpYnV0ZXM6IHByZXZpb3VzLmF0dHJpYnV0ZXMsIGV2ZW50czogcHJldmlvdXMuZXZlbnRzIH07XG5cdH0gZWxzZSBpZiAoZGlmZlR5cGUgPT09ICdub25lJykge1xuXHRcdHJldHVybiB7IHByb3BlcnRpZXM6IHt9LCBhdHRyaWJ1dGVzOiBwcmV2aW91cy5hdHRyaWJ1dGVzID8ge30gOiB1bmRlZmluZWQsIGV2ZW50czogcHJldmlvdXMuZXZlbnRzIH07XG5cdH1cblx0bGV0IG5ld1Byb3BlcnRpZXM6IGFueSA9IHtcblx0XHRwcm9wZXJ0aWVzOiB7fVxuXHR9O1xuXHRpZiAoYXR0cmlidXRlcykge1xuXHRcdG5ld1Byb3BlcnRpZXMuYXR0cmlidXRlcyA9IHt9O1xuXHRcdG5ld1Byb3BlcnRpZXMuZXZlbnRzID0gcHJldmlvdXMuZXZlbnRzO1xuXHRcdE9iamVjdC5rZXlzKHByb3BlcnRpZXMpLmZvckVhY2goKHByb3BOYW1lKSA9PiB7XG5cdFx0XHRuZXdQcm9wZXJ0aWVzLnByb3BlcnRpZXNbcHJvcE5hbWVdID0gZG9tTm9kZVtwcm9wTmFtZV07XG5cdFx0fSk7XG5cdFx0T2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaCgoYXR0ck5hbWUpID0+IHtcblx0XHRcdG5ld1Byb3BlcnRpZXMuYXR0cmlidXRlc1thdHRyTmFtZV0gPSBkb21Ob2RlLmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIG5ld1Byb3BlcnRpZXM7XG5cdH1cblx0bmV3UHJvcGVydGllcy5wcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMocHJvcGVydGllcykucmVkdWNlKFxuXHRcdChwcm9wcywgcHJvcGVydHkpID0+IHtcblx0XHRcdHByb3BzW3Byb3BlcnR5XSA9IGRvbU5vZGUuZ2V0QXR0cmlidXRlKHByb3BlcnR5KSB8fCBkb21Ob2RlW3Byb3BlcnR5XTtcblx0XHRcdHJldHVybiBwcm9wcztcblx0XHR9LFxuXHRcdHt9IGFzIGFueVxuXHQpO1xuXHRyZXR1cm4gbmV3UHJvcGVydGllcztcbn1cblxuZnVuY3Rpb24gZm9jdXNOb2RlKHByb3BWYWx1ZTogYW55LCBwcmV2aW91c1ZhbHVlOiBhbnksIGRvbU5vZGU6IEVsZW1lbnQsIHByb2plY3Rpb25PcHRpb25zOiBQcm9qZWN0aW9uT3B0aW9ucyk6IHZvaWQge1xuXHRsZXQgcmVzdWx0O1xuXHRpZiAodHlwZW9mIHByb3BWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdHJlc3VsdCA9IHByb3BWYWx1ZSgpO1xuXHR9IGVsc2Uge1xuXHRcdHJlc3VsdCA9IHByb3BWYWx1ZSAmJiAhcHJldmlvdXNWYWx1ZTtcblx0fVxuXHRpZiAocmVzdWx0ID09PSB0cnVlKSB7XG5cdFx0Y29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpITtcblx0XHRwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcblx0XHRcdChkb21Ob2RlIGFzIEhUTUxFbGVtZW50KS5mb2N1cygpO1xuXHRcdH0pO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU9ycGhhbmVkRXZlbnRzKFxuXHRkb21Ob2RlOiBFbGVtZW50LFxuXHRwcmV2aW91c1Byb3BlcnRpZXM6IFZOb2RlUHJvcGVydGllcyxcblx0cHJvcGVydGllczogVk5vZGVQcm9wZXJ0aWVzLFxuXHRwcm9qZWN0aW9uT3B0aW9uczogUHJvamVjdGlvbk9wdGlvbnMsXG5cdG9ubHlFdmVudHM6IGJvb2xlYW4gPSBmYWxzZVxuKSB7XG5cdGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKSE7XG5cdGNvbnN0IGV2ZW50TWFwID0gcHJvamVjdG9yU3RhdGUubm9kZU1hcC5nZXQoZG9tTm9kZSk7XG5cdGlmIChldmVudE1hcCkge1xuXHRcdE9iamVjdC5rZXlzKHByZXZpb3VzUHJvcGVydGllcykuZm9yRWFjaCgocHJvcE5hbWUpID0+IHtcblx0XHRcdGNvbnN0IGlzRXZlbnQgPSBwcm9wTmFtZS5zdWJzdHIoMCwgMikgPT09ICdvbicgfHwgb25seUV2ZW50cztcblx0XHRcdGNvbnN0IGV2ZW50TmFtZSA9IG9ubHlFdmVudHMgPyBwcm9wTmFtZSA6IHByb3BOYW1lLnN1YnN0cigyKTtcblx0XHRcdGlmIChpc0V2ZW50ICYmICFwcm9wZXJ0aWVzW3Byb3BOYW1lXSkge1xuXHRcdFx0XHRjb25zdCBldmVudENhbGxiYWNrID0gZXZlbnRNYXAuZ2V0KHByZXZpb3VzUHJvcGVydGllc1twcm9wTmFtZV0pO1xuXHRcdFx0XHRpZiAoZXZlbnRDYWxsYmFjaykge1xuXHRcdFx0XHRcdGRvbU5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGV2ZW50Q2FsbGJhY2spO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlQXR0cmlidXRlKGRvbU5vZGU6IEVsZW1lbnQsIGF0dHJOYW1lOiBzdHJpbmcsIGF0dHJWYWx1ZTogc3RyaW5nLCBwcm9qZWN0aW9uT3B0aW9uczogUHJvamVjdGlvbk9wdGlvbnMpIHtcblx0aWYgKHByb2plY3Rpb25PcHRpb25zLm5hbWVzcGFjZSA9PT0gTkFNRVNQQUNFX1NWRyAmJiBhdHRyTmFtZSA9PT0gJ2hyZWYnKSB7XG5cdFx0ZG9tTm9kZS5zZXRBdHRyaWJ1dGVOUyhOQU1FU1BBQ0VfWExJTkssIGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuXHR9IGVsc2UgaWYgKChhdHRyTmFtZSA9PT0gJ3JvbGUnICYmIGF0dHJWYWx1ZSA9PT0gJycpIHx8IGF0dHJWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0ZG9tTm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuXHR9IGVsc2Uge1xuXHRcdGRvbU5vZGUuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUF0dHJpYnV0ZXMoXG5cdGRvbU5vZGU6IEVsZW1lbnQsXG5cdHByZXZpb3VzQXR0cmlidXRlczogeyBbaW5kZXg6IHN0cmluZ106IHN0cmluZyB9LFxuXHRhdHRyaWJ1dGVzOiB7IFtpbmRleDogc3RyaW5nXTogc3RyaW5nIH0sXG5cdHByb2plY3Rpb25PcHRpb25zOiBQcm9qZWN0aW9uT3B0aW9uc1xuKSB7XG5cdGNvbnN0IGF0dHJOYW1lcyA9IE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpO1xuXHRjb25zdCBhdHRyQ291bnQgPSBhdHRyTmFtZXMubGVuZ3RoO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJDb3VudDsgaSsrKSB7XG5cdFx0Y29uc3QgYXR0ck5hbWUgPSBhdHRyTmFtZXNbaV07XG5cdFx0Y29uc3QgYXR0clZhbHVlID0gYXR0cmlidXRlc1thdHRyTmFtZV07XG5cdFx0Y29uc3QgcHJldmlvdXNBdHRyVmFsdWUgPSBwcmV2aW91c0F0dHJpYnV0ZXNbYXR0ck5hbWVdO1xuXHRcdGlmIChhdHRyVmFsdWUgIT09IHByZXZpb3VzQXR0clZhbHVlKSB7XG5cdFx0XHR1cGRhdGVBdHRyaWJ1dGUoZG9tTm9kZSwgYXR0ck5hbWUsIGF0dHJWYWx1ZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiB1cGRhdGVQcm9wZXJ0aWVzKFxuXHRkb21Ob2RlOiBFbGVtZW50LFxuXHRwcmV2aW91c1Byb3BlcnRpZXM6IFZOb2RlUHJvcGVydGllcyxcblx0cHJvcGVydGllczogVk5vZGVQcm9wZXJ0aWVzLFxuXHRwcm9qZWN0aW9uT3B0aW9uczogUHJvamVjdGlvbk9wdGlvbnMsXG5cdGluY2x1ZGVzRXZlbnRzQW5kQXR0cmlidXRlcyA9IHRydWVcbikge1xuXHRsZXQgcHJvcGVydGllc1VwZGF0ZWQgPSBmYWxzZTtcblx0Y29uc3QgcHJvcE5hbWVzID0gT2JqZWN0LmtleXMocHJvcGVydGllcyk7XG5cdGNvbnN0IHByb3BDb3VudCA9IHByb3BOYW1lcy5sZW5ndGg7XG5cdGlmIChwcm9wTmFtZXMuaW5kZXhPZignY2xhc3NlcycpID09PSAtMSAmJiBwcmV2aW91c1Byb3BlcnRpZXMuY2xhc3Nlcykge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHByZXZpb3VzUHJvcGVydGllcy5jbGFzc2VzKSkge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2aW91c1Byb3BlcnRpZXMuY2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRyZW1vdmVDbGFzc2VzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcy5jbGFzc2VzW2ldKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVtb3ZlQ2xhc3Nlcyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMuY2xhc3Nlcyk7XG5cdFx0fVxuXHR9XG5cblx0aW5jbHVkZXNFdmVudHNBbmRBdHRyaWJ1dGVzICYmIHJlbW92ZU9ycGhhbmVkRXZlbnRzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcywgcHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMpO1xuXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcENvdW50OyBpKyspIHtcblx0XHRjb25zdCBwcm9wTmFtZSA9IHByb3BOYW1lc1tpXTtcblx0XHRsZXQgcHJvcFZhbHVlID0gcHJvcGVydGllc1twcm9wTmFtZV07XG5cdFx0Y29uc3QgcHJldmlvdXNWYWx1ZSA9IHByZXZpb3VzUHJvcGVydGllcyFbcHJvcE5hbWVdO1xuXHRcdGlmIChwcm9wTmFtZSA9PT0gJ2NsYXNzZXMnKSB7XG5cdFx0XHRjb25zdCBwcmV2aW91c0NsYXNzZXMgPSBBcnJheS5pc0FycmF5KHByZXZpb3VzVmFsdWUpID8gcHJldmlvdXNWYWx1ZSA6IFtwcmV2aW91c1ZhbHVlXTtcblx0XHRcdGNvbnN0IGN1cnJlbnRDbGFzc2VzID0gQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpID8gcHJvcFZhbHVlIDogW3Byb3BWYWx1ZV07XG5cdFx0XHRpZiAocHJldmlvdXNDbGFzc2VzICYmIHByZXZpb3VzQ2xhc3Nlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGlmICghcHJvcFZhbHVlIHx8IHByb3BWYWx1ZS5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHByZXZpb3VzQ2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0cmVtb3ZlQ2xhc3Nlcyhkb21Ob2RlLCBwcmV2aW91c0NsYXNzZXNbaV0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCBuZXdDbGFzc2VzOiAobnVsbCB8IHVuZGVmaW5lZCB8IHN0cmluZylbXSA9IFsuLi5jdXJyZW50Q2xhc3Nlc107XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2aW91c0NsYXNzZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdGNvbnN0IHByZXZpb3VzQ2xhc3NOYW1lID0gcHJldmlvdXNDbGFzc2VzW2ldO1xuXHRcdFx0XHRcdFx0aWYgKHByZXZpb3VzQ2xhc3NOYW1lKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNsYXNzSW5kZXggPSBuZXdDbGFzc2VzLmluZGV4T2YocHJldmlvdXNDbGFzc05hbWUpO1xuXHRcdFx0XHRcdFx0XHRpZiAoY2xhc3NJbmRleCA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdFx0XHRyZW1vdmVDbGFzc2VzKGRvbU5vZGUsIHByZXZpb3VzQ2xhc3NOYW1lKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRuZXdDbGFzc2VzLnNwbGljZShjbGFzc0luZGV4LCAxKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG5ld0NsYXNzZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdGFkZENsYXNzZXMoZG9tTm9kZSwgbmV3Q2xhc3Nlc1tpXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGN1cnJlbnRDbGFzc2VzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0YWRkQ2xhc3Nlcyhkb21Ob2RlLCBjdXJyZW50Q2xhc3Nlc1tpXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHByb3BOYW1lID09PSAnZm9jdXMnKSB7XG5cdFx0XHRmb2N1c05vZGUocHJvcFZhbHVlLCBwcmV2aW91c1ZhbHVlLCBkb21Ob2RlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG5cdFx0fSBlbHNlIGlmIChwcm9wTmFtZSA9PT0gJ3N0eWxlcycpIHtcblx0XHRcdGNvbnN0IHN0eWxlTmFtZXMgPSBPYmplY3Qua2V5cyhwcm9wVmFsdWUpO1xuXHRcdFx0Y29uc3Qgc3R5bGVDb3VudCA9IHN0eWxlTmFtZXMubGVuZ3RoO1xuXHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBzdHlsZUNvdW50OyBqKyspIHtcblx0XHRcdFx0Y29uc3Qgc3R5bGVOYW1lID0gc3R5bGVOYW1lc1tqXTtcblx0XHRcdFx0Y29uc3QgbmV3U3R5bGVWYWx1ZSA9IHByb3BWYWx1ZVtzdHlsZU5hbWVdO1xuXHRcdFx0XHRjb25zdCBvbGRTdHlsZVZhbHVlID0gcHJldmlvdXNWYWx1ZSAmJiBwcmV2aW91c1ZhbHVlW3N0eWxlTmFtZV07XG5cdFx0XHRcdGlmIChuZXdTdHlsZVZhbHVlID09PSBvbGRTdHlsZVZhbHVlKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0cHJvcGVydGllc1VwZGF0ZWQgPSB0cnVlO1xuXHRcdFx0XHRpZiAobmV3U3R5bGVWYWx1ZSkge1xuXHRcdFx0XHRcdGNoZWNrU3R5bGVWYWx1ZShuZXdTdHlsZVZhbHVlKTtcblx0XHRcdFx0XHRwcm9qZWN0aW9uT3B0aW9ucy5zdHlsZUFwcGx5ZXIhKGRvbU5vZGUgYXMgSFRNTEVsZW1lbnQsIHN0eWxlTmFtZSwgbmV3U3R5bGVWYWx1ZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cHJvamVjdGlvbk9wdGlvbnMuc3R5bGVBcHBseWVyIShkb21Ob2RlIGFzIEhUTUxFbGVtZW50LCBzdHlsZU5hbWUsICcnKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIXByb3BWYWx1ZSAmJiB0eXBlb2YgcHJldmlvdXNWYWx1ZSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0cHJvcFZhbHVlID0gJyc7XG5cdFx0XHR9XG5cdFx0XHRpZiAocHJvcE5hbWUgPT09ICd2YWx1ZScpIHtcblx0XHRcdFx0Y29uc3QgZG9tVmFsdWUgPSAoZG9tTm9kZSBhcyBhbnkpW3Byb3BOYW1lXTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdGRvbVZhbHVlICE9PSBwcm9wVmFsdWUgJiZcblx0XHRcdFx0XHQoKGRvbU5vZGUgYXMgYW55KVsnb25pbnB1dC12YWx1ZSddXG5cdFx0XHRcdFx0XHQ/IGRvbVZhbHVlID09PSAoZG9tTm9kZSBhcyBhbnkpWydvbmlucHV0LXZhbHVlJ11cblx0XHRcdFx0XHRcdDogcHJvcFZhbHVlICE9PSBwcmV2aW91c1ZhbHVlKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHQoZG9tTm9kZSBhcyBhbnkpW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcblx0XHRcdFx0XHQoZG9tTm9kZSBhcyBhbnkpWydvbmlucHV0LXZhbHVlJ10gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHByb3BWYWx1ZSAhPT0gcHJldmlvdXNWYWx1ZSkge1xuXHRcdFx0XHRcdHByb3BlcnRpZXNVcGRhdGVkID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChwcm9wTmFtZSAhPT0gJ2tleScgJiYgcHJvcFZhbHVlICE9PSBwcmV2aW91c1ZhbHVlKSB7XG5cdFx0XHRcdGNvbnN0IHR5cGUgPSB0eXBlb2YgcHJvcFZhbHVlO1xuXHRcdFx0XHRpZiAodHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiBwcm9wTmFtZS5sYXN0SW5kZXhPZignb24nLCAwKSA9PT0gMCAmJiBpbmNsdWRlc0V2ZW50c0FuZEF0dHJpYnV0ZXMpIHtcblx0XHRcdFx0XHR1cGRhdGVFdmVudChcblx0XHRcdFx0XHRcdGRvbU5vZGUsXG5cdFx0XHRcdFx0XHRwcm9wTmFtZS5zdWJzdHIoMiksXG5cdFx0XHRcdFx0XHRwcm9wVmFsdWUsXG5cdFx0XHRcdFx0XHRwcm9qZWN0aW9uT3B0aW9ucyxcblx0XHRcdFx0XHRcdHByb3BlcnRpZXMuYmluZCxcblx0XHRcdFx0XHRcdHByZXZpb3VzVmFsdWVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHByb3BOYW1lICE9PSAnaW5uZXJIVE1MJyAmJiBpbmNsdWRlc0V2ZW50c0FuZEF0dHJpYnV0ZXMpIHtcblx0XHRcdFx0XHR1cGRhdGVBdHRyaWJ1dGUoZG9tTm9kZSwgcHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHByb3BOYW1lID09PSAnc2Nyb2xsTGVmdCcgfHwgcHJvcE5hbWUgPT09ICdzY3JvbGxUb3AnKSB7XG5cdFx0XHRcdFx0aWYgKChkb21Ob2RlIGFzIGFueSlbcHJvcE5hbWVdICE9PSBwcm9wVmFsdWUpIHtcblx0XHRcdFx0XHRcdChkb21Ob2RlIGFzIGFueSlbcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQoZG9tTm9kZSBhcyBhbnkpW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRwcm9wZXJ0aWVzVXBkYXRlZCA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBwcm9wZXJ0aWVzVXBkYXRlZDtcbn1cblxuZnVuY3Rpb24gZmluZEluZGV4T2ZDaGlsZChjaGlsZHJlbjogSW50ZXJuYWxETm9kZVtdLCBzYW1lQXM6IEludGVybmFsRE5vZGUsIHN0YXJ0OiBudW1iZXIpIHtcblx0Zm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcblx0XHRpZiAoc2FtZShjaGlsZHJlbltpXSwgc2FtZUFzKSkge1xuXHRcdFx0cmV0dXJuIGk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiAtMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvUGFyZW50Vk5vZGUoZG9tTm9kZTogRWxlbWVudCk6IEludGVybmFsVk5vZGUge1xuXHRyZXR1cm4ge1xuXHRcdHRhZzogJycsXG5cdFx0cHJvcGVydGllczoge30sXG5cdFx0Y2hpbGRyZW46IHVuZGVmaW5lZCxcblx0XHRkb21Ob2RlLFxuXHRcdHR5cGU6IFZOT0RFXG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1RleHRWTm9kZShkYXRhOiBhbnkpOiBJbnRlcm5hbFZOb2RlIHtcblx0cmV0dXJuIHtcblx0XHR0YWc6ICcnLFxuXHRcdHByb3BlcnRpZXM6IHt9LFxuXHRcdGNoaWxkcmVuOiB1bmRlZmluZWQsXG5cdFx0dGV4dDogYCR7ZGF0YX1gLFxuXHRcdGRvbU5vZGU6IHVuZGVmaW5lZCxcblx0XHR0eXBlOiBWTk9ERVxuXHR9O1xufVxuXG5mdW5jdGlvbiB0b0ludGVybmFsV05vZGUoaW5zdGFuY2U6IERlZmF1bHRXaWRnZXRCYXNlSW50ZXJmYWNlLCBpbnN0YW5jZURhdGE6IFdpZGdldERhdGEpOiBJbnRlcm5hbFdOb2RlIHtcblx0cmV0dXJuIHtcblx0XHRpbnN0YW5jZSxcblx0XHRyZW5kZXJlZDogW10sXG5cdFx0Y29yZVByb3BlcnRpZXM6IGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcyxcblx0XHRjaGlsZHJlbjogaW5zdGFuY2UuY2hpbGRyZW4gYXMgYW55LFxuXHRcdHdpZGdldENvbnN0cnVjdG9yOiBpbnN0YW5jZS5jb25zdHJ1Y3RvciBhcyBhbnksXG5cdFx0cHJvcGVydGllczogaW5zdGFuY2VEYXRhLmlucHV0UHJvcGVydGllcyxcblx0XHR0eXBlOiBXTk9ERVxuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihcblx0Y2hpbGRyZW46IHVuZGVmaW5lZCB8IEROb2RlIHwgRE5vZGVbXSxcblx0aW5zdGFuY2U6IERlZmF1bHRXaWRnZXRCYXNlSW50ZXJmYWNlXG4pOiBJbnRlcm5hbEROb2RlW10ge1xuXHRpZiAoY2hpbGRyZW4gPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBlbXB0eUFycmF5O1xuXHR9XG5cdGNoaWxkcmVuID0gQXJyYXkuaXNBcnJheShjaGlsZHJlbikgPyBjaGlsZHJlbiA6IFtjaGlsZHJlbl07XG5cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICkge1xuXHRcdGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV0gYXMgSW50ZXJuYWxETm9kZTtcblx0XHRpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCB8fCBjaGlsZCA9PT0gbnVsbCkge1xuXHRcdFx0Y2hpbGRyZW4uc3BsaWNlKGksIDEpO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRjaGlsZHJlbltpXSA9IHRvVGV4dFZOb2RlKGNoaWxkKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKGlzVk5vZGUoY2hpbGQpKSB7XG5cdFx0XHRcdGlmIChjaGlsZC5wcm9wZXJ0aWVzLmJpbmQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdChjaGlsZC5wcm9wZXJ0aWVzIGFzIGFueSkuYmluZCA9IGluc3RhbmNlO1xuXHRcdFx0XHRcdGlmIChjaGlsZC5jaGlsZHJlbiAmJiBjaGlsZC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRmaWx0ZXJBbmREZWNvcmF0ZUNoaWxkcmVuKGNoaWxkLmNoaWxkcmVuLCBpbnN0YW5jZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoIWNoaWxkLmNvcmVQcm9wZXJ0aWVzKSB7XG5cdFx0XHRcdFx0Y29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKSE7XG5cdFx0XHRcdFx0Y2hpbGQuY29yZVByb3BlcnRpZXMgPSB7XG5cdFx0XHRcdFx0XHRiaW5kOiBpbnN0YW5jZSxcblx0XHRcdFx0XHRcdGJhc2VSZWdpc3RyeTogaW5zdGFuY2VEYXRhLmNvcmVQcm9wZXJ0aWVzLmJhc2VSZWdpc3RyeVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGNoaWxkLmNoaWxkcmVuICYmIGNoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRmaWx0ZXJBbmREZWNvcmF0ZUNoaWxkcmVuKGNoaWxkLmNoaWxkcmVuLCBpbnN0YW5jZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0aSsrO1xuXHR9XG5cdHJldHVybiBjaGlsZHJlbiBhcyBJbnRlcm5hbEROb2RlW107XG59XG5cbmZ1bmN0aW9uIG5vZGVBZGRlZChkbm9kZTogSW50ZXJuYWxETm9kZSwgdHJhbnNpdGlvbnM6IFRyYW5zaXRpb25TdHJhdGVneSkge1xuXHRpZiAoaXNWTm9kZShkbm9kZSkgJiYgZG5vZGUucHJvcGVydGllcykge1xuXHRcdGNvbnN0IGVudGVyQW5pbWF0aW9uID0gZG5vZGUucHJvcGVydGllcy5lbnRlckFuaW1hdGlvbjtcblx0XHRpZiAoZW50ZXJBbmltYXRpb24pIHtcblx0XHRcdGlmICh0eXBlb2YgZW50ZXJBbmltYXRpb24gPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0ZW50ZXJBbmltYXRpb24oZG5vZGUuZG9tTm9kZSBhcyBFbGVtZW50LCBkbm9kZS5wcm9wZXJ0aWVzKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRyYW5zaXRpb25zLmVudGVyKGRub2RlLmRvbU5vZGUgYXMgRWxlbWVudCwgZG5vZGUucHJvcGVydGllcywgZW50ZXJBbmltYXRpb24gYXMgc3RyaW5nKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gbm9kZVRvUmVtb3ZlKGRub2RlOiBJbnRlcm5hbEROb2RlLCB0cmFuc2l0aW9uczogVHJhbnNpdGlvblN0cmF0ZWd5LCBwcm9qZWN0aW9uT3B0aW9uczogUHJvamVjdGlvbk9wdGlvbnMpIHtcblx0aWYgKGlzV05vZGUoZG5vZGUpKSB7XG5cdFx0Y29uc3QgcmVuZGVyZWQgPSBkbm9kZS5yZW5kZXJlZCB8fCBlbXB0eUFycmF5O1xuXHRcdGlmIChkbm9kZS5pbnN0YW5jZSkge1xuXHRcdFx0Y29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGRub2RlLmluc3RhbmNlKSE7XG5cdFx0XHRpbnN0YW5jZURhdGEub25EZXRhY2goKTtcblx0XHRcdGluc3RhbmNlTWFwLmRlbGV0ZShkbm9kZS5pbnN0YW5jZSk7XG5cdFx0fVxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcmVuZGVyZWQubGVuZ3RoOyBpKyspIHtcblx0XHRcdG5vZGVUb1JlbW92ZShyZW5kZXJlZFtpXSwgdHJhbnNpdGlvbnMsIHByb2plY3Rpb25PcHRpb25zKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Y29uc3QgZG9tTm9kZSA9IGRub2RlLmRvbU5vZGU7XG5cdFx0Y29uc3QgcHJvcGVydGllcyA9IGRub2RlLnByb3BlcnRpZXM7XG5cdFx0aWYgKGRub2RlLmNoaWxkcmVuICYmIGRub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0bm9kZVRvUmVtb3ZlKGRub2RlLmNoaWxkcmVuW2ldLCB0cmFuc2l0aW9ucywgcHJvamVjdGlvbk9wdGlvbnMpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRjb25zdCBleGl0QW5pbWF0aW9uID0gcHJvcGVydGllcy5leGl0QW5pbWF0aW9uO1xuXHRcdGlmIChwcm9wZXJ0aWVzICYmIGV4aXRBbmltYXRpb24pIHtcblx0XHRcdChkb21Ob2RlIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuXHRcdFx0Y29uc3QgcmVtb3ZlRG9tTm9kZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkb21Ob2RlICYmIGRvbU5vZGUucGFyZW50Tm9kZSAmJiBkb21Ob2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZG9tTm9kZSk7XG5cdFx0XHRcdGRub2RlLmRvbU5vZGUgPSB1bmRlZmluZWQ7XG5cdFx0XHR9O1xuXHRcdFx0aWYgKHR5cGVvZiBleGl0QW5pbWF0aW9uID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdGV4aXRBbmltYXRpb24oZG9tTm9kZSBhcyBFbGVtZW50LCByZW1vdmVEb21Ob2RlLCBwcm9wZXJ0aWVzKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dHJhbnNpdGlvbnMuZXhpdChkbm9kZS5kb21Ob2RlIGFzIEVsZW1lbnQsIHByb3BlcnRpZXMsIGV4aXRBbmltYXRpb24gYXMgc3RyaW5nLCByZW1vdmVEb21Ob2RlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRkb21Ob2RlICYmIGRvbU5vZGUucGFyZW50Tm9kZSAmJiBkb21Ob2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZG9tTm9kZSk7XG5cdFx0ZG5vZGUuZG9tTm9kZSA9IHVuZGVmaW5lZDtcblx0fVxufVxuXG5mdW5jdGlvbiBjaGVja0Rpc3Rpbmd1aXNoYWJsZShcblx0Y2hpbGROb2RlczogSW50ZXJuYWxETm9kZVtdLFxuXHRpbmRleFRvQ2hlY2s6IG51bWJlcixcblx0cGFyZW50SW5zdGFuY2U6IERlZmF1bHRXaWRnZXRCYXNlSW50ZXJmYWNlXG4pIHtcblx0Y29uc3QgY2hpbGROb2RlID0gY2hpbGROb2Rlc1tpbmRleFRvQ2hlY2tdO1xuXHRpZiAoaXNWTm9kZShjaGlsZE5vZGUpICYmICFjaGlsZE5vZGUudGFnKSB7XG5cdFx0cmV0dXJuOyAvLyBUZXh0IG5vZGVzIG5lZWQgbm90IGJlIGRpc3Rpbmd1aXNoYWJsZVxuXHR9XG5cdGNvbnN0IHsga2V5IH0gPSBjaGlsZE5vZGUucHJvcGVydGllcztcblxuXHRpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwga2V5ID09PSBudWxsKSB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoaSAhPT0gaW5kZXhUb0NoZWNrKSB7XG5cdFx0XHRcdGNvbnN0IG5vZGUgPSBjaGlsZE5vZGVzW2ldO1xuXHRcdFx0XHRpZiAoc2FtZShub2RlLCBjaGlsZE5vZGUpKSB7XG5cdFx0XHRcdFx0bGV0IG5vZGVJZGVudGlmaWVyOiBzdHJpbmc7XG5cdFx0XHRcdFx0Y29uc3QgcGFyZW50TmFtZSA9IChwYXJlbnRJbnN0YW5jZSBhcyBhbnkpLmNvbnN0cnVjdG9yLm5hbWUgfHwgJ3Vua25vd24nO1xuXHRcdFx0XHRcdGlmIChpc1dOb2RlKGNoaWxkTm9kZSkpIHtcblx0XHRcdFx0XHRcdG5vZGVJZGVudGlmaWVyID0gKGNoaWxkTm9kZS53aWRnZXRDb25zdHJ1Y3RvciBhcyBhbnkpLm5hbWUgfHwgJ3Vua25vd24nO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRub2RlSWRlbnRpZmllciA9IGNoaWxkTm9kZS50YWc7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKFxuXHRcdFx0XHRcdFx0YEEgd2lkZ2V0ICgke3BhcmVudE5hbWV9KSBoYXMgaGFkIGEgY2hpbGQgYWRkZGVkIG9yIHJlbW92ZWQsIGJ1dCB0aGV5IHdlcmUgbm90IGFibGUgdG8gdW5pcXVlbHkgaWRlbnRpZmllZC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gcHJvdmlkZSBhIHVuaXF1ZSAna2V5JyBwcm9wZXJ0eSB3aGVuIHVzaW5nIHRoZSBzYW1lIHdpZGdldCBvciBlbGVtZW50ICgke25vZGVJZGVudGlmaWVyfSkgbXVsdGlwbGUgdGltZXMgYXMgc2libGluZ3NgXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiB1cGRhdGVDaGlsZHJlbihcblx0cGFyZW50Vk5vZGU6IEludGVybmFsVk5vZGUsXG5cdG9sZENoaWxkcmVuOiBJbnRlcm5hbEROb2RlW10sXG5cdG5ld0NoaWxkcmVuOiBJbnRlcm5hbEROb2RlW10sXG5cdHBhcmVudEluc3RhbmNlOiBEZWZhdWx0V2lkZ2V0QmFzZUludGVyZmFjZSxcblx0cHJvamVjdGlvbk9wdGlvbnM6IFByb2plY3Rpb25PcHRpb25zXG4pIHtcblx0b2xkQ2hpbGRyZW4gPSBvbGRDaGlsZHJlbiB8fCBlbXB0eUFycmF5O1xuXHRuZXdDaGlsZHJlbiA9IG5ld0NoaWxkcmVuO1xuXHRjb25zdCBvbGRDaGlsZHJlbkxlbmd0aCA9IG9sZENoaWxkcmVuLmxlbmd0aDtcblx0Y29uc3QgbmV3Q2hpbGRyZW5MZW5ndGggPSBuZXdDaGlsZHJlbi5sZW5ndGg7XG5cdGNvbnN0IHRyYW5zaXRpb25zID0gcHJvamVjdGlvbk9wdGlvbnMudHJhbnNpdGlvbnMhO1xuXHRjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSkhO1xuXHRwcm9qZWN0aW9uT3B0aW9ucyA9IHsgLi4ucHJvamVjdGlvbk9wdGlvbnMsIGRlcHRoOiBwcm9qZWN0aW9uT3B0aW9ucy5kZXB0aCArIDEgfTtcblx0bGV0IG9sZEluZGV4ID0gMDtcblx0bGV0IG5ld0luZGV4ID0gMDtcblx0bGV0IGk6IG51bWJlcjtcblx0bGV0IHRleHRVcGRhdGVkID0gZmFsc2U7XG5cdHdoaWxlIChuZXdJbmRleCA8IG5ld0NoaWxkcmVuTGVuZ3RoKSB7XG5cdFx0bGV0IG9sZENoaWxkID0gb2xkSW5kZXggPCBvbGRDaGlsZHJlbkxlbmd0aCA/IG9sZENoaWxkcmVuW29sZEluZGV4XSA6IHVuZGVmaW5lZDtcblx0XHRjb25zdCBuZXdDaGlsZCA9IG5ld0NoaWxkcmVuW25ld0luZGV4XTtcblx0XHRpZiAoaXNWTm9kZShuZXdDaGlsZCkgJiYgdHlwZW9mIG5ld0NoaWxkLmRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRuZXdDaGlsZC5pbnNlcnRlZCA9IGlzVk5vZGUob2xkQ2hpbGQpICYmIG9sZENoaWxkLmluc2VydGVkO1xuXHRcdFx0YWRkRGVmZXJyZWRQcm9wZXJ0aWVzKG5ld0NoaWxkLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG5cdFx0fVxuXHRcdGlmIChvbGRDaGlsZCAhPT0gdW5kZWZpbmVkICYmIHNhbWUob2xkQ2hpbGQsIG5ld0NoaWxkKSkge1xuXHRcdFx0dGV4dFVwZGF0ZWQgPSB1cGRhdGVEb20ob2xkQ2hpbGQsIG5ld0NoaWxkLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50Vk5vZGUsIHBhcmVudEluc3RhbmNlKSB8fCB0ZXh0VXBkYXRlZDtcblx0XHRcdG9sZEluZGV4Kys7XG5cdFx0XHRuZXdJbmRleCsrO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZmluZE9sZEluZGV4ID0gZmluZEluZGV4T2ZDaGlsZChvbGRDaGlsZHJlbiwgbmV3Q2hpbGQsIG9sZEluZGV4ICsgMSk7XG5cdFx0Y29uc3QgYWRkQ2hpbGQgPSAoKSA9PiB7XG5cdFx0XHRsZXQgaW5zZXJ0QmVmb3JlRG9tTm9kZTogRWxlbWVudCB8IFRleHQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cdFx0XHRsZXQgY2hpbGQ6IEludGVybmFsRE5vZGUgPSBvbGRDaGlsZHJlbltvbGRJbmRleF07XG5cdFx0XHRpZiAoY2hpbGQpIHtcblx0XHRcdFx0bGV0IG5leHRJbmRleCA9IG9sZEluZGV4ICsgMTtcblx0XHRcdFx0bGV0IGluc2VydEJlZm9yZUNoaWxkcmVuID0gW2NoaWxkXTtcblx0XHRcdFx0d2hpbGUgKGluc2VydEJlZm9yZUNoaWxkcmVuLmxlbmd0aCkge1xuXHRcdFx0XHRcdGNvbnN0IGluc2VydEJlZm9yZSA9IGluc2VydEJlZm9yZUNoaWxkcmVuLnNoaWZ0KCkhO1xuXHRcdFx0XHRcdGlmIChpc1dOb2RlKGluc2VydEJlZm9yZSkpIHtcblx0XHRcdFx0XHRcdGlmIChpbnNlcnRCZWZvcmUucmVuZGVyZWQpIHtcblx0XHRcdFx0XHRcdFx0aW5zZXJ0QmVmb3JlQ2hpbGRyZW4ucHVzaCguLi5pbnNlcnRCZWZvcmUucmVuZGVyZWQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAoaW5zZXJ0QmVmb3JlLmRvbU5vZGUpIHtcblx0XHRcdFx0XHRcdFx0aW5zZXJ0QmVmb3JlRG9tTm9kZSA9IGluc2VydEJlZm9yZS5kb21Ob2RlO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGluc2VydEJlZm9yZUNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiBvbGRDaGlsZHJlbltuZXh0SW5kZXhdKSB7XG5cdFx0XHRcdFx0XHRpbnNlcnRCZWZvcmVDaGlsZHJlbi5wdXNoKG9sZENoaWxkcmVuW25leHRJbmRleF0pO1xuXHRcdFx0XHRcdFx0bmV4dEluZGV4Kys7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNyZWF0ZURvbShuZXdDaGlsZCwgcGFyZW50Vk5vZGUsIGluc2VydEJlZm9yZURvbU5vZGUsIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRJbnN0YW5jZSk7XG5cdFx0XHRub2RlQWRkZWQobmV3Q2hpbGQsIHRyYW5zaXRpb25zKTtcblx0XHRcdGNvbnN0IGluZGV4VG9DaGVjayA9IG5ld0luZGV4O1xuXHRcdFx0cHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MucHVzaCgoKSA9PiB7XG5cdFx0XHRcdGNoZWNrRGlzdGluZ3Vpc2hhYmxlKG5ld0NoaWxkcmVuLCBpbmRleFRvQ2hlY2ssIHBhcmVudEluc3RhbmNlKTtcblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHRpZiAoIW9sZENoaWxkIHx8IGZpbmRPbGRJbmRleCA9PT0gLTEpIHtcblx0XHRcdGFkZENoaWxkKCk7XG5cdFx0XHRuZXdJbmRleCsrO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVtb3ZlQ2hpbGQgPSAoKSA9PiB7XG5cdFx0XHRjb25zdCBpbmRleFRvQ2hlY2sgPSBvbGRJbmRleDtcblx0XHRcdHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xuXHRcdFx0XHRjaGVja0Rpc3Rpbmd1aXNoYWJsZShvbGRDaGlsZHJlbiwgaW5kZXhUb0NoZWNrLCBwYXJlbnRJbnN0YW5jZSk7XG5cdFx0XHR9KTtcblx0XHRcdGlmIChpc1dOb2RlKG9sZENoaWxkKSkge1xuXHRcdFx0XHRjb25zdCBpdGVtID0gaW5zdGFuY2VNYXAuZ2V0KG9sZENoaWxkLmluc3RhbmNlKTtcblx0XHRcdFx0aWYgKGl0ZW0pIHtcblx0XHRcdFx0XHRvbGRDaGlsZCA9IGl0ZW0uZG5vZGU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdG5vZGVUb1JlbW92ZShvbGRDaGlsZCEsIHRyYW5zaXRpb25zLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG5cdFx0fTtcblx0XHRjb25zdCBmaW5kTmV3SW5kZXggPSBmaW5kSW5kZXhPZkNoaWxkKG5ld0NoaWxkcmVuLCBvbGRDaGlsZCwgbmV3SW5kZXggKyAxKTtcblxuXHRcdGlmIChmaW5kTmV3SW5kZXggPT09IC0xKSB7XG5cdFx0XHRyZW1vdmVDaGlsZCgpO1xuXHRcdFx0b2xkSW5kZXgrKztcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGFkZENoaWxkKCk7XG5cdFx0cmVtb3ZlQ2hpbGQoKTtcblx0XHRvbGRJbmRleCsrO1xuXHRcdG5ld0luZGV4Kys7XG5cdH1cblx0aWYgKG9sZENoaWxkcmVuTGVuZ3RoID4gb2xkSW5kZXgpIHtcblx0XHQvLyBSZW1vdmUgY2hpbGQgZnJhZ21lbnRzXG5cdFx0Zm9yIChpID0gb2xkSW5kZXg7IGkgPCBvbGRDaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBpbmRleFRvQ2hlY2sgPSBpO1xuXHRcdFx0cHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MucHVzaCgoKSA9PiB7XG5cdFx0XHRcdGNoZWNrRGlzdGluZ3Vpc2hhYmxlKG9sZENoaWxkcmVuLCBpbmRleFRvQ2hlY2ssIHBhcmVudEluc3RhbmNlKTtcblx0XHRcdH0pO1xuXHRcdFx0bGV0IGNoaWxkVG9SZW1vdmUgPSBvbGRDaGlsZHJlbltpXTtcblx0XHRcdGlmIChpc1dOb2RlKGNoaWxkVG9SZW1vdmUpKSB7XG5cdFx0XHRcdGNvbnN0IGl0ZW0gPSBpbnN0YW5jZU1hcC5nZXQoY2hpbGRUb1JlbW92ZS5pbnN0YW5jZSk7XG5cdFx0XHRcdGlmIChpdGVtKSB7XG5cdFx0XHRcdFx0Y2hpbGRUb1JlbW92ZSA9IGl0ZW0uZG5vZGU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdG5vZGVUb1JlbW92ZShjaGlsZFRvUmVtb3ZlLCB0cmFuc2l0aW9ucywgcHJvamVjdGlvbk9wdGlvbnMpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gdGV4dFVwZGF0ZWQ7XG59XG5cbmZ1bmN0aW9uIGFkZENoaWxkcmVuKFxuXHRwYXJlbnRWTm9kZTogSW50ZXJuYWxWTm9kZSxcblx0Y2hpbGRyZW46IEludGVybmFsRE5vZGVbXSB8IHVuZGVmaW5lZCxcblx0cHJvamVjdGlvbk9wdGlvbnM6IFByb2plY3Rpb25PcHRpb25zLFxuXHRwYXJlbnRJbnN0YW5jZTogRGVmYXVsdFdpZGdldEJhc2VJbnRlcmZhY2UsXG5cdGluc2VydEJlZm9yZTogRWxlbWVudCB8IFRleHQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG5cdGNoaWxkTm9kZXM/OiAoRWxlbWVudCB8IFRleHQpW11cbikge1xuXHRpZiAoY2hpbGRyZW4gPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKSE7XG5cdGlmIChwcm9qZWN0b3JTdGF0ZS5tZXJnZSAmJiBjaGlsZE5vZGVzID09PSB1bmRlZmluZWQpIHtcblx0XHRjaGlsZE5vZGVzID0gYXJyYXlGcm9tKHBhcmVudFZOb2RlLmRvbU5vZGUhLmNoaWxkTm9kZXMpIGFzIChFbGVtZW50IHwgVGV4dClbXTtcblx0fVxuXHRjb25zdCB0cmFuc2l0aW9ucyA9IHByb2plY3Rpb25PcHRpb25zLnRyYW5zaXRpb25zITtcblx0cHJvamVjdGlvbk9wdGlvbnMgPSB7IC4uLnByb2plY3Rpb25PcHRpb25zLCBkZXB0aDogcHJvamVjdGlvbk9wdGlvbnMuZGVwdGggKyAxIH07XG5cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuXHRcdGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG5cblx0XHRpZiAoaXNWTm9kZShjaGlsZCkpIHtcblx0XHRcdGlmIChwcm9qZWN0b3JTdGF0ZS5tZXJnZSAmJiBjaGlsZE5vZGVzKSB7XG5cdFx0XHRcdGxldCBkb21FbGVtZW50OiBFbGVtZW50IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR3aGlsZSAoY2hpbGQuZG9tTm9kZSA9PT0gdW5kZWZpbmVkICYmIGNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGRvbUVsZW1lbnQgPSBjaGlsZE5vZGVzLnNoaWZ0KCkgYXMgRWxlbWVudDtcblx0XHRcdFx0XHRpZiAoZG9tRWxlbWVudCAmJiBkb21FbGVtZW50LnRhZ05hbWUgPT09IChjaGlsZC50YWcudG9VcHBlckNhc2UoKSB8fCB1bmRlZmluZWQpKSB7XG5cdFx0XHRcdFx0XHRjaGlsZC5kb21Ob2RlID0gZG9tRWxlbWVudDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNyZWF0ZURvbShjaGlsZCwgcGFyZW50Vk5vZGUsIGluc2VydEJlZm9yZSwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudEluc3RhbmNlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3JlYXRlRG9tKGNoaWxkLCBwYXJlbnRWTm9kZSwgaW5zZXJ0QmVmb3JlLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UsIGNoaWxkTm9kZXMpO1xuXHRcdH1cblx0XHRub2RlQWRkZWQoY2hpbGQsIHRyYW5zaXRpb25zKTtcblx0fVxufVxuXG5mdW5jdGlvbiBpbml0UHJvcGVydGllc0FuZENoaWxkcmVuKFxuXHRkb21Ob2RlOiBFbGVtZW50LFxuXHRkbm9kZTogSW50ZXJuYWxWTm9kZSxcblx0cGFyZW50SW5zdGFuY2U6IERlZmF1bHRXaWRnZXRCYXNlSW50ZXJmYWNlLFxuXHRwcm9qZWN0aW9uT3B0aW9uczogUHJvamVjdGlvbk9wdGlvbnNcbikge1xuXHRhZGRDaGlsZHJlbihkbm9kZSwgZG5vZGUuY2hpbGRyZW4sIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRJbnN0YW5jZSwgdW5kZWZpbmVkKTtcblx0aWYgKHR5cGVvZiBkbm9kZS5kZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyAmJiBkbm9kZS5pbnNlcnRlZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0YWRkRGVmZXJyZWRQcm9wZXJ0aWVzKGRub2RlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG5cdH1cblxuXHRpZiAoZG5vZGUuYXR0cmlidXRlcyAmJiBkbm9kZS5ldmVudHMpIHtcblx0XHR1cGRhdGVBdHRyaWJ1dGVzKGRvbU5vZGUsIHt9LCBkbm9kZS5hdHRyaWJ1dGVzLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG5cdFx0dXBkYXRlUHJvcGVydGllcyhkb21Ob2RlLCB7fSwgZG5vZGUucHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMsIGZhbHNlKTtcblx0XHRyZW1vdmVPcnBoYW5lZEV2ZW50cyhkb21Ob2RlLCB7fSwgZG5vZGUuZXZlbnRzLCBwcm9qZWN0aW9uT3B0aW9ucywgdHJ1ZSk7XG5cdFx0Y29uc3QgZXZlbnRzID0gZG5vZGUuZXZlbnRzO1xuXHRcdE9iamVjdC5rZXlzKGV2ZW50cykuZm9yRWFjaCgoZXZlbnQpID0+IHtcblx0XHRcdHVwZGF0ZUV2ZW50KGRvbU5vZGUsIGV2ZW50LCBldmVudHNbZXZlbnRdLCBwcm9qZWN0aW9uT3B0aW9ucywgZG5vZGUucHJvcGVydGllcy5iaW5kKTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHR1cGRhdGVQcm9wZXJ0aWVzKGRvbU5vZGUsIHt9LCBkbm9kZS5wcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG5cdH1cblx0aWYgKGRub2RlLnByb3BlcnRpZXMua2V5ICE9PSBudWxsICYmIGRub2RlLnByb3BlcnRpZXMua2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQocGFyZW50SW5zdGFuY2UpITtcblx0XHRpbnN0YW5jZURhdGEubm9kZUhhbmRsZXIuYWRkKGRvbU5vZGUgYXMgSFRNTEVsZW1lbnQsIGAke2Rub2RlLnByb3BlcnRpZXMua2V5fWApO1xuXHR9XG5cdGRub2RlLmluc2VydGVkID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRG9tKFxuXHRkbm9kZTogSW50ZXJuYWxETm9kZSxcblx0cGFyZW50Vk5vZGU6IEludGVybmFsVk5vZGUsXG5cdGluc2VydEJlZm9yZTogRWxlbWVudCB8IFRleHQgfCB1bmRlZmluZWQsXG5cdHByb2plY3Rpb25PcHRpb25zOiBQcm9qZWN0aW9uT3B0aW9ucyxcblx0cGFyZW50SW5zdGFuY2U6IERlZmF1bHRXaWRnZXRCYXNlSW50ZXJmYWNlLFxuXHRjaGlsZE5vZGVzPzogKEVsZW1lbnQgfCBUZXh0KVtdXG4pIHtcblx0bGV0IGRvbU5vZGU6IEVsZW1lbnQgfCBUZXh0IHwgdW5kZWZpbmVkO1xuXHRjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSkhO1xuXHRpZiAoaXNXTm9kZShkbm9kZSkpIHtcblx0XHRsZXQgeyB3aWRnZXRDb25zdHJ1Y3RvciB9ID0gZG5vZGU7XG5cdFx0Y29uc3QgcGFyZW50SW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHBhcmVudEluc3RhbmNlKSE7XG5cdFx0aWYgKCFpc1dpZGdldEJhc2VDb25zdHJ1Y3RvcjxEZWZhdWx0V2lkZ2V0QmFzZUludGVyZmFjZT4od2lkZ2V0Q29uc3RydWN0b3IpKSB7XG5cdFx0XHRjb25zdCBpdGVtID0gcGFyZW50SW5zdGFuY2VEYXRhLnJlZ2lzdHJ5KCkuZ2V0PERlZmF1bHRXaWRnZXRCYXNlSW50ZXJmYWNlPih3aWRnZXRDb25zdHJ1Y3Rvcik7XG5cdFx0XHRpZiAoaXRlbSA9PT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR3aWRnZXRDb25zdHJ1Y3RvciA9IGl0ZW07XG5cdFx0fVxuXHRcdGNvbnN0IGluc3RhbmNlID0gbmV3IHdpZGdldENvbnN0cnVjdG9yKCk7XG5cdFx0ZG5vZGUuaW5zdGFuY2UgPSBpbnN0YW5jZTtcblx0XHRjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpITtcblx0XHRpbnN0YW5jZURhdGEuaW52YWxpZGF0ZSA9ICgpID0+IHtcblx0XHRcdGluc3RhbmNlRGF0YS5kaXJ0eSA9IHRydWU7XG5cdFx0XHRpZiAoaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9PT0gZmFsc2UpIHtcblx0XHRcdFx0cHJvamVjdG9yU3RhdGUucmVuZGVyUXVldWUucHVzaCh7IGluc3RhbmNlLCBkZXB0aDogcHJvamVjdGlvbk9wdGlvbnMuZGVwdGggfSk7XG5cdFx0XHRcdHNjaGVkdWxlUmVuZGVyKHByb2plY3Rpb25PcHRpb25zKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPSB0cnVlO1xuXHRcdGluc3RhbmNlLl9fc2V0Q29yZVByb3BlcnRpZXNfXyhkbm9kZS5jb3JlUHJvcGVydGllcyk7XG5cdFx0aW5zdGFuY2UuX19zZXRDaGlsZHJlbl9fKGRub2RlLmNoaWxkcmVuKTtcblx0XHRpbnN0YW5jZS5fX3NldFByb3BlcnRpZXNfXyhkbm9kZS5wcm9wZXJ0aWVzKTtcblx0XHRjb25zdCByZW5kZXJlZCA9IGluc3RhbmNlLl9fcmVuZGVyX18oKTtcblx0XHRpbnN0YW5jZURhdGEucmVuZGVyaW5nID0gZmFsc2U7XG5cdFx0aWYgKHJlbmRlcmVkKSB7XG5cdFx0XHRjb25zdCBmaWx0ZXJlZFJlbmRlcmVkID0gZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihyZW5kZXJlZCwgaW5zdGFuY2UpO1xuXHRcdFx0ZG5vZGUucmVuZGVyZWQgPSBmaWx0ZXJlZFJlbmRlcmVkO1xuXHRcdFx0YWRkQ2hpbGRyZW4ocGFyZW50Vk5vZGUsIGZpbHRlcmVkUmVuZGVyZWQsIHByb2plY3Rpb25PcHRpb25zLCBpbnN0YW5jZSwgaW5zZXJ0QmVmb3JlLCBjaGlsZE5vZGVzKTtcblx0XHR9XG5cdFx0aW5zdGFuY2VNYXAuc2V0KGluc3RhbmNlLCB7IGRub2RlLCBwYXJlbnRWTm9kZSB9KTtcblx0XHRpbnN0YW5jZURhdGEubm9kZUhhbmRsZXIuYWRkUm9vdCgpO1xuXHRcdHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xuXHRcdFx0aW5zdGFuY2VEYXRhLm9uQXR0YWNoKCk7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0aWYgKHByb2plY3RvclN0YXRlLm1lcmdlICYmIHByb2plY3RvclN0YXRlLm1lcmdlRWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRkb21Ob2RlID0gZG5vZGUuZG9tTm9kZSA9IHByb2plY3Rpb25PcHRpb25zLm1lcmdlRWxlbWVudDtcblx0XHRcdHByb2plY3RvclN0YXRlLm1lcmdlRWxlbWVudCA9IHVuZGVmaW5lZDtcblx0XHRcdGluaXRQcm9wZXJ0aWVzQW5kQ2hpbGRyZW4oZG9tTm9kZSEsIGRub2RlLCBwYXJlbnRJbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBkb2MgPSBwYXJlbnRWTm9kZS5kb21Ob2RlIS5vd25lckRvY3VtZW50O1xuXHRcdGlmICghZG5vZGUudGFnICYmIHR5cGVvZiBkbm9kZS50ZXh0ID09PSAnc3RyaW5nJykge1xuXHRcdFx0aWYgKGRub2RlLmRvbU5vZGUgIT09IHVuZGVmaW5lZCAmJiBwYXJlbnRWTm9kZS5kb21Ob2RlKSB7XG5cdFx0XHRcdGNvbnN0IG5ld0RvbU5vZGUgPSBkbm9kZS5kb21Ob2RlLm93bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZG5vZGUudGV4dCEpO1xuXHRcdFx0XHRpZiAocGFyZW50Vk5vZGUuZG9tTm9kZSA9PT0gZG5vZGUuZG9tTm9kZS5wYXJlbnROb2RlKSB7XG5cdFx0XHRcdFx0cGFyZW50Vk5vZGUuZG9tTm9kZS5yZXBsYWNlQ2hpbGQobmV3RG9tTm9kZSwgZG5vZGUuZG9tTm9kZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cGFyZW50Vk5vZGUuZG9tTm9kZS5hcHBlbmRDaGlsZChuZXdEb21Ob2RlKTtcblx0XHRcdFx0XHRkbm9kZS5kb21Ob2RlLnBhcmVudE5vZGUgJiYgZG5vZGUuZG9tTm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRub2RlLmRvbU5vZGUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRub2RlLmRvbU5vZGUgPSBuZXdEb21Ob2RlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZG9tTm9kZSA9IGRub2RlLmRvbU5vZGUgPSBkb2MuY3JlYXRlVGV4dE5vZGUoZG5vZGUudGV4dCEpO1xuXHRcdFx0XHRpZiAoaW5zZXJ0QmVmb3JlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRwYXJlbnRWTm9kZS5kb21Ob2RlIS5pbnNlcnRCZWZvcmUoZG9tTm9kZSwgaW5zZXJ0QmVmb3JlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRwYXJlbnRWTm9kZS5kb21Ob2RlIS5hcHBlbmRDaGlsZChkb21Ob2RlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoZG5vZGUuZG9tTm9kZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGlmIChkbm9kZS50YWcgPT09ICdzdmcnKSB7XG5cdFx0XHRcdFx0cHJvamVjdGlvbk9wdGlvbnMgPSB7IC4uLnByb2plY3Rpb25PcHRpb25zLCAuLi57IG5hbWVzcGFjZTogTkFNRVNQQUNFX1NWRyB9IH07XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHByb2plY3Rpb25PcHRpb25zLm5hbWVzcGFjZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0ZG9tTm9kZSA9IGRub2RlLmRvbU5vZGUgPSBkb2MuY3JlYXRlRWxlbWVudE5TKHByb2plY3Rpb25PcHRpb25zLm5hbWVzcGFjZSwgZG5vZGUudGFnKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkb21Ob2RlID0gZG5vZGUuZG9tTm9kZSA9IGRub2RlLmRvbU5vZGUgfHwgZG9jLmNyZWF0ZUVsZW1lbnQoZG5vZGUudGFnKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZG9tTm9kZSA9IGRub2RlLmRvbU5vZGU7XG5cdFx0XHR9XG5cdFx0XHRpbml0UHJvcGVydGllc0FuZENoaWxkcmVuKGRvbU5vZGUhIGFzIEVsZW1lbnQsIGRub2RlLCBwYXJlbnRJbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xuXHRcdFx0aWYgKGluc2VydEJlZm9yZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHBhcmVudFZOb2RlLmRvbU5vZGUhLmluc2VydEJlZm9yZShkb21Ob2RlLCBpbnNlcnRCZWZvcmUpO1xuXHRcdFx0fSBlbHNlIGlmIChkb21Ob2RlIS5wYXJlbnROb2RlICE9PSBwYXJlbnRWTm9kZS5kb21Ob2RlISkge1xuXHRcdFx0XHRwYXJlbnRWTm9kZS5kb21Ob2RlIS5hcHBlbmRDaGlsZChkb21Ob2RlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRG9tKFxuXHRwcmV2aW91czogYW55LFxuXHRkbm9kZTogSW50ZXJuYWxETm9kZSxcblx0cHJvamVjdGlvbk9wdGlvbnM6IFByb2plY3Rpb25PcHRpb25zLFxuXHRwYXJlbnRWTm9kZTogSW50ZXJuYWxWTm9kZSxcblx0cGFyZW50SW5zdGFuY2U6IERlZmF1bHRXaWRnZXRCYXNlSW50ZXJmYWNlXG4pIHtcblx0aWYgKGlzV05vZGUoZG5vZGUpKSB7XG5cdFx0Y29uc3QgeyBpbnN0YW5jZSB9ID0gcHJldmlvdXM7XG5cdFx0Y29uc3QgeyBwYXJlbnRWTm9kZSwgZG5vZGU6IG5vZGUgfSA9IGluc3RhbmNlTWFwLmdldChpbnN0YW5jZSkhO1xuXHRcdGNvbnN0IHByZXZpb3VzUmVuZGVyZWQgPSBub2RlID8gbm9kZS5yZW5kZXJlZCA6IHByZXZpb3VzLnJlbmRlcmVkO1xuXHRcdGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldChpbnN0YW5jZSkhO1xuXHRcdGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPSB0cnVlO1xuXHRcdGluc3RhbmNlLl9fc2V0Q29yZVByb3BlcnRpZXNfXyhkbm9kZS5jb3JlUHJvcGVydGllcyk7XG5cdFx0aW5zdGFuY2UuX19zZXRDaGlsZHJlbl9fKGRub2RlLmNoaWxkcmVuKTtcblx0XHRpbnN0YW5jZS5fX3NldFByb3BlcnRpZXNfXyhkbm9kZS5wcm9wZXJ0aWVzKTtcblx0XHRkbm9kZS5pbnN0YW5jZSA9IGluc3RhbmNlO1xuXHRcdGlmIChpbnN0YW5jZURhdGEuZGlydHkgPT09IHRydWUpIHtcblx0XHRcdGNvbnN0IHJlbmRlcmVkID0gaW5zdGFuY2UuX19yZW5kZXJfXygpO1xuXHRcdFx0aW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9IGZhbHNlO1xuXHRcdFx0ZG5vZGUucmVuZGVyZWQgPSBmaWx0ZXJBbmREZWNvcmF0ZUNoaWxkcmVuKHJlbmRlcmVkLCBpbnN0YW5jZSk7XG5cdFx0XHR1cGRhdGVDaGlsZHJlbihwYXJlbnRWTm9kZSwgcHJldmlvdXNSZW5kZXJlZCwgZG5vZGUucmVuZGVyZWQsIGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPSBmYWxzZTtcblx0XHRcdGRub2RlLnJlbmRlcmVkID0gcHJldmlvdXNSZW5kZXJlZDtcblx0XHR9XG5cdFx0aW5zdGFuY2VNYXAuc2V0KGluc3RhbmNlLCB7IGRub2RlLCBwYXJlbnRWTm9kZSB9KTtcblx0XHRpbnN0YW5jZURhdGEubm9kZUhhbmRsZXIuYWRkUm9vdCgpO1xuXHR9IGVsc2Uge1xuXHRcdGlmIChwcmV2aW91cyA9PT0gZG5vZGUpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Y29uc3QgZG9tTm9kZSA9IChkbm9kZS5kb21Ob2RlID0gcHJldmlvdXMuZG9tTm9kZSk7XG5cdFx0bGV0IHRleHRVcGRhdGVkID0gZmFsc2U7XG5cdFx0bGV0IHVwZGF0ZWQgPSBmYWxzZTtcblx0XHRpZiAoIWRub2RlLnRhZyAmJiB0eXBlb2YgZG5vZGUudGV4dCA9PT0gJ3N0cmluZycpIHtcblx0XHRcdGlmIChkbm9kZS50ZXh0ICE9PSBwcmV2aW91cy50ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IG5ld0RvbU5vZGUgPSBkb21Ob2RlLm93bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZG5vZGUudGV4dCEpO1xuXHRcdFx0XHRkb21Ob2RlLnBhcmVudE5vZGUhLnJlcGxhY2VDaGlsZChuZXdEb21Ob2RlLCBkb21Ob2RlKTtcblx0XHRcdFx0ZG5vZGUuZG9tTm9kZSA9IG5ld0RvbU5vZGU7XG5cdFx0XHRcdHRleHRVcGRhdGVkID0gdHJ1ZTtcblx0XHRcdFx0cmV0dXJuIHRleHRVcGRhdGVkO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoZG5vZGUudGFnICYmIGRub2RlLnRhZy5sYXN0SW5kZXhPZignc3ZnJywgMCkgPT09IDApIHtcblx0XHRcdFx0cHJvamVjdGlvbk9wdGlvbnMgPSB7IC4uLnByb2plY3Rpb25PcHRpb25zLCAuLi57IG5hbWVzcGFjZTogTkFNRVNQQUNFX1NWRyB9IH07XG5cdFx0XHR9XG5cdFx0XHRpZiAocHJldmlvdXMuY2hpbGRyZW4gIT09IGRub2RlLmNoaWxkcmVuKSB7XG5cdFx0XHRcdGNvbnN0IGNoaWxkcmVuID0gZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihkbm9kZS5jaGlsZHJlbiwgcGFyZW50SW5zdGFuY2UpO1xuXHRcdFx0XHRkbm9kZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuXHRcdFx0XHR1cGRhdGVkID1cblx0XHRcdFx0XHR1cGRhdGVDaGlsZHJlbihkbm9kZSwgcHJldmlvdXMuY2hpbGRyZW4sIGNoaWxkcmVuLCBwYXJlbnRJbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpIHx8IHVwZGF0ZWQ7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHByZXZpb3VzUHJvcGVydGllcyA9IGJ1aWxkUHJldmlvdXNQcm9wZXJ0aWVzKGRvbU5vZGUsIHByZXZpb3VzLCBkbm9kZSk7XG5cdFx0XHRpZiAoZG5vZGUuYXR0cmlidXRlcyAmJiBkbm9kZS5ldmVudHMpIHtcblx0XHRcdFx0dXBkYXRlQXR0cmlidXRlcyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMuYXR0cmlidXRlcywgZG5vZGUuYXR0cmlidXRlcywgcHJvamVjdGlvbk9wdGlvbnMpO1xuXHRcdFx0XHR1cGRhdGVkID1cblx0XHRcdFx0XHR1cGRhdGVQcm9wZXJ0aWVzKFxuXHRcdFx0XHRcdFx0ZG9tTm9kZSxcblx0XHRcdFx0XHRcdHByZXZpb3VzUHJvcGVydGllcy5wcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0ZG5vZGUucHJvcGVydGllcyxcblx0XHRcdFx0XHRcdHByb2plY3Rpb25PcHRpb25zLFxuXHRcdFx0XHRcdFx0ZmFsc2Vcblx0XHRcdFx0XHQpIHx8IHVwZGF0ZWQ7XG5cdFx0XHRcdHJlbW92ZU9ycGhhbmVkRXZlbnRzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcy5ldmVudHMsIGRub2RlLmV2ZW50cywgcHJvamVjdGlvbk9wdGlvbnMsIHRydWUpO1xuXHRcdFx0XHRjb25zdCBldmVudHMgPSBkbm9kZS5ldmVudHM7XG5cdFx0XHRcdE9iamVjdC5rZXlzKGV2ZW50cykuZm9yRWFjaCgoZXZlbnQpID0+IHtcblx0XHRcdFx0XHR1cGRhdGVFdmVudChcblx0XHRcdFx0XHRcdGRvbU5vZGUsXG5cdFx0XHRcdFx0XHRldmVudCxcblx0XHRcdFx0XHRcdGV2ZW50c1tldmVudF0sXG5cdFx0XHRcdFx0XHRwcm9qZWN0aW9uT3B0aW9ucyxcblx0XHRcdFx0XHRcdGRub2RlLnByb3BlcnRpZXMuYmluZCxcblx0XHRcdFx0XHRcdHByZXZpb3VzUHJvcGVydGllcy5ldmVudHNbZXZlbnRdXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR1cGRhdGVkID1cblx0XHRcdFx0XHR1cGRhdGVQcm9wZXJ0aWVzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcy5wcm9wZXJ0aWVzLCBkbm9kZS5wcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucykgfHxcblx0XHRcdFx0XHR1cGRhdGVkO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZG5vZGUucHJvcGVydGllcy5rZXkgIT09IG51bGwgJiYgZG5vZGUucHJvcGVydGllcy5rZXkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQocGFyZW50SW5zdGFuY2UpITtcblx0XHRcdFx0aW5zdGFuY2VEYXRhLm5vZGVIYW5kbGVyLmFkZChkb21Ob2RlLCBgJHtkbm9kZS5wcm9wZXJ0aWVzLmtleX1gKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHVwZGF0ZWQgJiYgZG5vZGUucHJvcGVydGllcyAmJiBkbm9kZS5wcm9wZXJ0aWVzLnVwZGF0ZUFuaW1hdGlvbikge1xuXHRcdFx0ZG5vZGUucHJvcGVydGllcy51cGRhdGVBbmltYXRpb24oZG9tTm9kZSBhcyBFbGVtZW50LCBkbm9kZS5wcm9wZXJ0aWVzLCBwcmV2aW91cy5wcm9wZXJ0aWVzKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gYWRkRGVmZXJyZWRQcm9wZXJ0aWVzKHZub2RlOiBJbnRlcm5hbFZOb2RlLCBwcm9qZWN0aW9uT3B0aW9uczogUHJvamVjdGlvbk9wdGlvbnMpIHtcblx0Ly8gdHJhbnNmZXIgYW55IHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gcGFzc2VkIC0gYXMgdGhlc2UgbXVzdCBiZSBkZWNvcmF0ZWQgcHJvcGVydGllc1xuXHR2bm9kZS5kZWNvcmF0ZWREZWZlcnJlZFByb3BlcnRpZXMgPSB2bm9kZS5wcm9wZXJ0aWVzO1xuXHRjb25zdCBwcm9wZXJ0aWVzID0gdm5vZGUuZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2shKCEhdm5vZGUuaW5zZXJ0ZWQpO1xuXHRjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSkhO1xuXHR2bm9kZS5wcm9wZXJ0aWVzID0geyAuLi5wcm9wZXJ0aWVzLCAuLi52bm9kZS5kZWNvcmF0ZWREZWZlcnJlZFByb3BlcnRpZXMgfTtcblx0cHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3MucHVzaCgoKSA9PiB7XG5cdFx0Y29uc3QgcHJvcGVydGllcyA9IHtcblx0XHRcdC4uLnZub2RlLmRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrISghIXZub2RlLmluc2VydGVkKSxcblx0XHRcdC4uLnZub2RlLmRlY29yYXRlZERlZmVycmVkUHJvcGVydGllc1xuXHRcdH07XG5cdFx0dXBkYXRlUHJvcGVydGllcyh2bm9kZS5kb21Ob2RlISBhcyBFbGVtZW50LCB2bm9kZS5wcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG5cdFx0dm5vZGUucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBydW5EZWZlcnJlZFJlbmRlckNhbGxiYWNrcyhwcm9qZWN0aW9uT3B0aW9uczogUHJvamVjdGlvbk9wdGlvbnMpIHtcblx0Y29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpITtcblx0aWYgKHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLmxlbmd0aCkge1xuXHRcdGlmIChwcm9qZWN0aW9uT3B0aW9ucy5zeW5jKSB7XG5cdFx0XHR3aGlsZSAocHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3MubGVuZ3RoKSB7XG5cdFx0XHRcdGNvbnN0IGNhbGxiYWNrID0gcHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3Muc2hpZnQoKTtcblx0XHRcdFx0Y2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Z2xvYmFsLnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG5cdFx0XHRcdHdoaWxlIChwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRjb25zdCBjYWxsYmFjayA9IHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLnNoaWZ0KCk7XG5cdFx0XHRcdFx0Y2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHJ1bkFmdGVyUmVuZGVyQ2FsbGJhY2tzKHByb2plY3Rpb25PcHRpb25zOiBQcm9qZWN0aW9uT3B0aW9ucykge1xuXHRjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSkhO1xuXHRpZiAocHJvamVjdGlvbk9wdGlvbnMuc3luYykge1xuXHRcdHdoaWxlIChwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGNhbGxiYWNrID0gcHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3Muc2hpZnQoKTtcblx0XHRcdGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGlmIChnbG9iYWwucmVxdWVzdElkbGVDYWxsYmFjaykge1xuXHRcdFx0Z2xvYmFsLnJlcXVlc3RJZGxlQ2FsbGJhY2soKCkgPT4ge1xuXHRcdFx0XHR3aGlsZSAocHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MubGVuZ3RoKSB7XG5cdFx0XHRcdFx0Y29uc3QgY2FsbGJhY2sgPSBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5zaGlmdCgpO1xuXHRcdFx0XHRcdGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0d2hpbGUgKHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLmxlbmd0aCkge1xuXHRcdFx0XHRcdGNvbnN0IGNhbGxiYWNrID0gcHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3Muc2hpZnQoKTtcblx0XHRcdFx0XHRjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVSZW5kZXIocHJvamVjdGlvbk9wdGlvbnM6IFByb2plY3Rpb25PcHRpb25zKSB7XG5cdGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKSE7XG5cdGlmIChwcm9qZWN0aW9uT3B0aW9ucy5zeW5jKSB7XG5cdFx0cmVuZGVyKHByb2plY3Rpb25PcHRpb25zKTtcblx0fSBlbHNlIGlmIChwcm9qZWN0b3JTdGF0ZS5yZW5kZXJTY2hlZHVsZWQgPT09IHVuZGVmaW5lZCkge1xuXHRcdHByb2plY3RvclN0YXRlLnJlbmRlclNjaGVkdWxlZCA9IGdsb2JhbC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuXHRcdFx0cmVuZGVyKHByb2plY3Rpb25PcHRpb25zKTtcblx0XHR9KTtcblx0fVxufVxuXG5mdW5jdGlvbiByZW5kZXIocHJvamVjdGlvbk9wdGlvbnM6IFByb2plY3Rpb25PcHRpb25zKSB7XG5cdGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKSE7XG5cdHByb2plY3RvclN0YXRlLnJlbmRlclNjaGVkdWxlZCA9IHVuZGVmaW5lZDtcblx0Y29uc3QgcmVuZGVyUXVldWUgPSBwcm9qZWN0b3JTdGF0ZS5yZW5kZXJRdWV1ZTtcblx0Y29uc3QgcmVuZGVycyA9IFsuLi5yZW5kZXJRdWV1ZV07XG5cdHByb2plY3RvclN0YXRlLnJlbmRlclF1ZXVlID0gW107XG5cdHJlbmRlcnMuc29ydCgoYSwgYikgPT4gYS5kZXB0aCAtIGIuZGVwdGgpO1xuXHRjb25zdCBwcmV2aW91c2x5UmVuZGVyZWQgPSBbXTtcblx0d2hpbGUgKHJlbmRlcnMubGVuZ3RoKSB7XG5cdFx0Y29uc3QgeyBpbnN0YW5jZSB9ID0gcmVuZGVycy5zaGlmdCgpITtcblx0XHRpZiAoaW5zdGFuY2VNYXAuaGFzKGluc3RhbmNlKSAmJiBwcmV2aW91c2x5UmVuZGVyZWQuaW5kZXhPZihpbnN0YW5jZSkgPT09IC0xKSB7XG5cdFx0XHRwcmV2aW91c2x5UmVuZGVyZWQucHVzaChpbnN0YW5jZSk7XG5cdFx0XHRjb25zdCB7IHBhcmVudFZOb2RlLCBkbm9kZSB9ID0gaW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKSE7XG5cdFx0XHRjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpITtcblx0XHRcdHVwZGF0ZURvbShkbm9kZSwgdG9JbnRlcm5hbFdOb2RlKGluc3RhbmNlLCBpbnN0YW5jZURhdGEpLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50Vk5vZGUsIGluc3RhbmNlKTtcblx0XHR9XG5cdH1cblx0cnVuQWZ0ZXJSZW5kZXJDYWxsYmFja3MocHJvamVjdGlvbk9wdGlvbnMpO1xuXHRydW5EZWZlcnJlZFJlbmRlckNhbGxiYWNrcyhwcm9qZWN0aW9uT3B0aW9ucyk7XG59XG5cbmV4cG9ydCBjb25zdCBkb20gPSB7XG5cdGFwcGVuZDogZnVuY3Rpb24oXG5cdFx0cGFyZW50Tm9kZTogRWxlbWVudCxcblx0XHRpbnN0YW5jZTogRGVmYXVsdFdpZGdldEJhc2VJbnRlcmZhY2UsXG5cdFx0cHJvamVjdGlvbk9wdGlvbnM6IFBhcnRpYWw8UHJvamVjdGlvbk9wdGlvbnM+ID0ge31cblx0KTogUHJvamVjdGlvbiB7XG5cdFx0Y29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKSE7XG5cdFx0Y29uc3QgZmluYWxQcm9qZWN0b3JPcHRpb25zID0gZ2V0UHJvamVjdGlvbk9wdGlvbnMocHJvamVjdGlvbk9wdGlvbnMsIGluc3RhbmNlKTtcblx0XHRjb25zdCBwcm9qZWN0b3JTdGF0ZTogUHJvamVjdG9yU3RhdGUgPSB7XG5cdFx0XHRhZnRlclJlbmRlckNhbGxiYWNrczogW10sXG5cdFx0XHRkZWZlcnJlZFJlbmRlckNhbGxiYWNrczogW10sXG5cdFx0XHRub2RlTWFwOiBuZXcgV2Vha01hcCgpLFxuXHRcdFx0cmVuZGVyU2NoZWR1bGVkOiB1bmRlZmluZWQsXG5cdFx0XHRyZW5kZXJRdWV1ZTogW10sXG5cdFx0XHRtZXJnZTogcHJvamVjdGlvbk9wdGlvbnMubWVyZ2UgfHwgZmFsc2UsXG5cdFx0XHRtZXJnZUVsZW1lbnQ6IHByb2plY3Rpb25PcHRpb25zLm1lcmdlRWxlbWVudFxuXHRcdH07XG5cdFx0cHJvamVjdG9yU3RhdGVNYXAuc2V0KGluc3RhbmNlLCBwcm9qZWN0b3JTdGF0ZSk7XG5cblx0XHRmaW5hbFByb2plY3Rvck9wdGlvbnMucm9vdE5vZGUgPSBwYXJlbnROb2RlO1xuXHRcdGNvbnN0IHBhcmVudFZOb2RlID0gdG9QYXJlbnRWTm9kZShmaW5hbFByb2plY3Rvck9wdGlvbnMucm9vdE5vZGUpO1xuXHRcdGNvbnN0IG5vZGUgPSB0b0ludGVybmFsV05vZGUoaW5zdGFuY2UsIGluc3RhbmNlRGF0YSk7XG5cdFx0aW5zdGFuY2VNYXAuc2V0KGluc3RhbmNlLCB7IGRub2RlOiBub2RlLCBwYXJlbnRWTm9kZSB9KTtcblx0XHRpbnN0YW5jZURhdGEuaW52YWxpZGF0ZSA9ICgpID0+IHtcblx0XHRcdGluc3RhbmNlRGF0YS5kaXJ0eSA9IHRydWU7XG5cdFx0XHRpZiAoaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9PT0gZmFsc2UpIHtcblx0XHRcdFx0cHJvamVjdG9yU3RhdGUucmVuZGVyUXVldWUucHVzaCh7IGluc3RhbmNlLCBkZXB0aDogZmluYWxQcm9qZWN0b3JPcHRpb25zLmRlcHRoIH0pO1xuXHRcdFx0XHRzY2hlZHVsZVJlbmRlcihmaW5hbFByb2plY3Rvck9wdGlvbnMpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0dXBkYXRlRG9tKG5vZGUsIG5vZGUsIGZpbmFsUHJvamVjdG9yT3B0aW9ucywgcGFyZW50Vk5vZGUsIGluc3RhbmNlKTtcblx0XHRwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcblx0XHRcdGluc3RhbmNlRGF0YS5vbkF0dGFjaCgpO1xuXHRcdH0pO1xuXHRcdHJ1bkRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzKGZpbmFsUHJvamVjdG9yT3B0aW9ucyk7XG5cdFx0cnVuQWZ0ZXJSZW5kZXJDYWxsYmFja3MoZmluYWxQcm9qZWN0b3JPcHRpb25zKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0ZG9tTm9kZTogZmluYWxQcm9qZWN0b3JPcHRpb25zLnJvb3ROb2RlXG5cdFx0fTtcblx0fSxcblx0Y3JlYXRlOiBmdW5jdGlvbihpbnN0YW5jZTogRGVmYXVsdFdpZGdldEJhc2VJbnRlcmZhY2UsIHByb2plY3Rpb25PcHRpb25zPzogUGFydGlhbDxQcm9qZWN0aW9uT3B0aW9ucz4pOiBQcm9qZWN0aW9uIHtcblx0XHRyZXR1cm4gdGhpcy5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksIGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG5cdH0sXG5cdG1lcmdlOiBmdW5jdGlvbihcblx0XHRlbGVtZW50OiBFbGVtZW50LFxuXHRcdGluc3RhbmNlOiBEZWZhdWx0V2lkZ2V0QmFzZUludGVyZmFjZSxcblx0XHRwcm9qZWN0aW9uT3B0aW9uczogUGFydGlhbDxQcm9qZWN0aW9uT3B0aW9ucz4gPSB7fVxuXHQpOiBQcm9qZWN0aW9uIHtcblx0XHRwcm9qZWN0aW9uT3B0aW9ucy5tZXJnZSA9IHRydWU7XG5cdFx0cHJvamVjdGlvbk9wdGlvbnMubWVyZ2VFbGVtZW50ID0gZWxlbWVudDtcblx0XHRjb25zdCBwcm9qZWN0aW9uID0gdGhpcy5hcHBlbmQoZWxlbWVudC5wYXJlbnROb2RlIGFzIEVsZW1lbnQsIGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG5cdFx0Y29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQoaW5zdGFuY2UpITtcblx0XHRwcm9qZWN0b3JTdGF0ZS5tZXJnZSA9IGZhbHNlO1xuXHRcdHJldHVybiBwcm9qZWN0aW9uO1xuXHR9XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHZkb20udHMiLCIvKlxuXHRNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuXHRBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xuLy8gY3NzIGJhc2UgY29kZSwgaW5qZWN0ZWQgYnkgdGhlIGNzcy1sb2FkZXJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odXNlU291cmNlTWFwKSB7XG5cdHZhciBsaXN0ID0gW107XG5cblx0Ly8gcmV0dXJuIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXMgY3NzIHN0cmluZ1xuXHRsaXN0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG5cdFx0cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG5cdFx0XHR2YXIgY29udGVudCA9IGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcoaXRlbSwgdXNlU291cmNlTWFwKTtcblx0XHRcdGlmKGl0ZW1bMl0pIHtcblx0XHRcdFx0cmV0dXJuIFwiQG1lZGlhIFwiICsgaXRlbVsyXSArIFwie1wiICsgY29udGVudCArIFwifVwiO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRlbnQ7XG5cdFx0XHR9XG5cdFx0fSkuam9pbihcIlwiKTtcblx0fTtcblxuXHQvLyBpbXBvcnQgYSBsaXN0IG9mIG1vZHVsZXMgaW50byB0aGUgbGlzdFxuXHRsaXN0LmkgPSBmdW5jdGlvbihtb2R1bGVzLCBtZWRpYVF1ZXJ5KSB7XG5cdFx0aWYodHlwZW9mIG1vZHVsZXMgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCBcIlwiXV07XG5cdFx0dmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcblx0XHRmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGlkID0gdGhpc1tpXVswXTtcblx0XHRcdGlmKHR5cGVvZiBpZCA9PT0gXCJudW1iZXJcIilcblx0XHRcdFx0YWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xuXHRcdH1cblx0XHRmb3IoaSA9IDA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgaXRlbSA9IG1vZHVsZXNbaV07XG5cdFx0XHQvLyBza2lwIGFscmVhZHkgaW1wb3J0ZWQgbW9kdWxlXG5cdFx0XHQvLyB0aGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCAxMDAlIHBlcmZlY3QgZm9yIHdlaXJkIG1lZGlhIHF1ZXJ5IGNvbWJpbmF0aW9uc1xuXHRcdFx0Ly8gIHdoZW4gYSBtb2R1bGUgaXMgaW1wb3J0ZWQgbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgbWVkaWEgcXVlcmllcy5cblx0XHRcdC8vICBJIGhvcGUgdGhpcyB3aWxsIG5ldmVyIG9jY3VyIChIZXkgdGhpcyB3YXkgd2UgaGF2ZSBzbWFsbGVyIGJ1bmRsZXMpXG5cdFx0XHRpZih0eXBlb2YgaXRlbVswXSAhPT0gXCJudW1iZXJcIiB8fCAhYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpdGVtWzBdXSkge1xuXHRcdFx0XHRpZihtZWRpYVF1ZXJ5ICYmICFpdGVtWzJdKSB7XG5cdFx0XHRcdFx0aXRlbVsyXSA9IG1lZGlhUXVlcnk7XG5cdFx0XHRcdH0gZWxzZSBpZihtZWRpYVF1ZXJ5KSB7XG5cdFx0XHRcdFx0aXRlbVsyXSA9IFwiKFwiICsgaXRlbVsyXSArIFwiKSBhbmQgKFwiICsgbWVkaWFRdWVyeSArIFwiKVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGxpc3QucHVzaChpdGVtKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdHJldHVybiBsaXN0O1xufTtcblxuZnVuY3Rpb24gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtLCB1c2VTb3VyY2VNYXApIHtcblx0dmFyIGNvbnRlbnQgPSBpdGVtWzFdIHx8ICcnO1xuXHR2YXIgY3NzTWFwcGluZyA9IGl0ZW1bM107XG5cdGlmICghY3NzTWFwcGluZykge1xuXHRcdHJldHVybiBjb250ZW50O1xuXHR9XG5cblx0aWYgKHVzZVNvdXJjZU1hcCAmJiB0eXBlb2YgYnRvYSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdHZhciBzb3VyY2VNYXBwaW5nID0gdG9Db21tZW50KGNzc01hcHBpbmcpO1xuXHRcdHZhciBzb3VyY2VVUkxzID0gY3NzTWFwcGluZy5zb3VyY2VzLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG5cdFx0XHRyZXR1cm4gJy8qIyBzb3VyY2VVUkw9JyArIGNzc01hcHBpbmcuc291cmNlUm9vdCArIHNvdXJjZSArICcgKi8nXG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gW2NvbnRlbnRdLmNvbmNhdChzb3VyY2VVUkxzKS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKCdcXG4nKTtcblx0fVxuXG5cdHJldHVybiBbY29udGVudF0uam9pbignXFxuJyk7XG59XG5cbi8vIEFkYXB0ZWQgZnJvbSBjb252ZXJ0LXNvdXJjZS1tYXAgKE1JVClcbmZ1bmN0aW9uIHRvQ29tbWVudChzb3VyY2VNYXApIHtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG5cdHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpO1xuXHR2YXIgZGF0YSA9ICdzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCwnICsgYmFzZTY0O1xuXG5cdHJldHVybiAnLyojICcgKyBkYXRhICsgJyAqLyc7XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiY3NzU2VsZWN0XCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcImNzc1NlbGVjdFwiXSA9IGZhY3RvcnkoKTtcbn0pKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMjQpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgaXNWYWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdGlmICghaXNWYWx1ZSh2YWx1ZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlIG51bGwgb3IgdW5kZWZpbmVkXCIpO1xuXHRyZXR1cm4gdmFsdWU7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbikge1xuXHRpZiAodHlwZW9mIGZuICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoZm4gKyBcIiBpcyBub3QgYSBmdW5jdGlvblwiKTtcblx0cmV0dXJuIGZuO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY2KSgpID8gU3ltYm9sIDogX193ZWJwYWNrX3JlcXVpcmVfXyg2Nyk7XG5cblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBhc3NpZ24gICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMClcbiAgLCBub3JtYWxpemVPcHRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMSlcbiAgLCBpc0NhbGxhYmxlICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MilcbiAgLCBjb250YWlucyAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSlcblxuICAsIGQ7XG5cbmQgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChkc2NyLCB2YWx1ZS8qLCBvcHRpb25zKi8pIHtcblx0dmFyIGMsIGUsIHcsIG9wdGlvbnMsIGRlc2M7XG5cdGlmICgoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHx8ICh0eXBlb2YgZHNjciAhPT0gJ3N0cmluZycpKSB7XG5cdFx0b3B0aW9ucyA9IHZhbHVlO1xuXHRcdHZhbHVlID0gZHNjcjtcblx0XHRkc2NyID0gbnVsbDtcblx0fSBlbHNlIHtcblx0XHRvcHRpb25zID0gYXJndW1lbnRzWzJdO1xuXHR9XG5cdGlmIChkc2NyID09IG51bGwpIHtcblx0XHRjID0gdyA9IHRydWU7XG5cdFx0ZSA9IGZhbHNlO1xuXHR9IGVsc2Uge1xuXHRcdGMgPSBjb250YWlucy5jYWxsKGRzY3IsICdjJyk7XG5cdFx0ZSA9IGNvbnRhaW5zLmNhbGwoZHNjciwgJ2UnKTtcblx0XHR3ID0gY29udGFpbnMuY2FsbChkc2NyLCAndycpO1xuXHR9XG5cblx0ZGVzYyA9IHsgdmFsdWU6IHZhbHVlLCBjb25maWd1cmFibGU6IGMsIGVudW1lcmFibGU6IGUsIHdyaXRhYmxlOiB3IH07XG5cdHJldHVybiAhb3B0aW9ucyA/IGRlc2MgOiBhc3NpZ24obm9ybWFsaXplT3B0cyhvcHRpb25zKSwgZGVzYyk7XG59O1xuXG5kLmdzID0gZnVuY3Rpb24gKGRzY3IsIGdldCwgc2V0LyosIG9wdGlvbnMqLykge1xuXHR2YXIgYywgZSwgb3B0aW9ucywgZGVzYztcblx0aWYgKHR5cGVvZiBkc2NyICE9PSAnc3RyaW5nJykge1xuXHRcdG9wdGlvbnMgPSBzZXQ7XG5cdFx0c2V0ID0gZ2V0O1xuXHRcdGdldCA9IGRzY3I7XG5cdFx0ZHNjciA9IG51bGw7XG5cdH0gZWxzZSB7XG5cdFx0b3B0aW9ucyA9IGFyZ3VtZW50c1szXTtcblx0fVxuXHRpZiAoZ2V0ID09IG51bGwpIHtcblx0XHRnZXQgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoIWlzQ2FsbGFibGUoZ2V0KSkge1xuXHRcdG9wdGlvbnMgPSBnZXQ7XG5cdFx0Z2V0ID0gc2V0ID0gdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKHNldCA9PSBudWxsKSB7XG5cdFx0c2V0ID0gdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKCFpc0NhbGxhYmxlKHNldCkpIHtcblx0XHRvcHRpb25zID0gc2V0O1xuXHRcdHNldCA9IHVuZGVmaW5lZDtcblx0fVxuXHRpZiAoZHNjciA9PSBudWxsKSB7XG5cdFx0YyA9IHRydWU7XG5cdFx0ZSA9IGZhbHNlO1xuXHR9IGVsc2Uge1xuXHRcdGMgPSBjb250YWlucy5jYWxsKGRzY3IsICdjJyk7XG5cdFx0ZSA9IGNvbnRhaW5zLmNhbGwoZHNjciwgJ2UnKTtcblx0fVxuXG5cdGRlc2MgPSB7IGdldDogZ2V0LCBzZXQ6IHNldCwgY29uZmlndXJhYmxlOiBjLCBlbnVtZXJhYmxlOiBlIH07XG5cdHJldHVybiAhb3B0aW9ucyA/IGRlc2MgOiBhc3NpZ24obm9ybWFsaXplT3B0cyhvcHRpb25zKSwgZGVzYyk7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgX3VuZGVmaW5lZCA9IF9fd2VicGFja19yZXF1aXJlX18oMTcpKCk7IC8vIFN1cHBvcnQgRVMzIGVuZ2luZXNcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsKSB7XG4gcmV0dXJuICh2YWwgIT09IF91bmRlZmluZWQpICYmICh2YWwgIT09IG51bGwpO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdHRydWVGdW5jOiBmdW5jdGlvbiB0cnVlRnVuYygpe1xuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXHRmYWxzZUZ1bmM6IGZ1bmN0aW9uIGZhbHNlRnVuYygpe1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuLyoqKi8gfSksXG4vKiA2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSkoKVxuXHQ/IE9iamVjdC5zZXRQcm90b3R5cGVPZlxuXHQ6IF9fd2VicGFja19yZXF1aXJlX18oMjApO1xuXG5cbi8qKiovIH0pLFxuLyogNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgb2JqVG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nXG4gICwgaWQgPSBvYmpUb1N0cmluZy5jYWxsKFxuXHQoZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiBhcmd1bWVudHM7XG5cdH0pKClcbik7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdHJldHVybiBvYmpUb1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gaWQ7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogOCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgb2JqVG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLCBpZCA9IG9ialRvU3RyaW5nLmNhbGwoXCJcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdHJldHVybiAoXG5cdFx0dHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8XG5cdFx0KHZhbHVlICYmXG5cdFx0XHR0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcblx0XHRcdCh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyB8fCBvYmpUb1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gaWQpKSB8fFxuXHRcdGZhbHNlXG5cdCk7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG4vL1R5cGVzIG9mIGVsZW1lbnRzIGZvdW5kIGluIHRoZSBET01cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRUZXh0OiBcInRleHRcIiwgLy9UZXh0XG5cdERpcmVjdGl2ZTogXCJkaXJlY3RpdmVcIiwgLy88PyAuLi4gPz5cblx0Q29tbWVudDogXCJjb21tZW50XCIsIC8vPCEtLSAuLi4gLS0+XG5cdFNjcmlwdDogXCJzY3JpcHRcIiwgLy88c2NyaXB0PiB0YWdzXG5cdFN0eWxlOiBcInN0eWxlXCIsIC8vPHN0eWxlPiB0YWdzXG5cdFRhZzogXCJ0YWdcIiwgLy9BbnkgdGFnXG5cdENEQVRBOiBcImNkYXRhXCIsIC8vPCFbQ0RBVEFbIC4uLiBdXT5cblx0RG9jdHlwZTogXCJkb2N0eXBlXCIsXG5cblx0aXNUYWc6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdHJldHVybiBlbGVtLnR5cGUgPT09IFwidGFnXCIgfHwgZWxlbS50eXBlID09PSBcInNjcmlwdFwiIHx8IGVsZW0udHlwZSA9PT0gXCJzdHlsZVwiO1xuXHR9XG59O1xuXG5cbi8qKiovIH0pLFxuLyogMTAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU3KSgpXG5cdD8gT2JqZWN0LmFzc2lnblxuXHQ6IF9fd2VicGFja19yZXF1aXJlX18oNTgpO1xuXG5cbi8qKiovIH0pLFxuLyogMTEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYzKSgpXG5cdD8gU3RyaW5nLnByb3RvdHlwZS5jb250YWluc1xuXHQ6IF9fd2VicGFja19yZXF1aXJlX18oNjQpO1xuXG5cbi8qKiovIH0pLFxuLyogMTIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGNsZWFyICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNilcbiAgLCBhc3NpZ24gICA9IF9fd2VicGFja19yZXF1aXJlX18oMTApXG4gICwgY2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpXG4gICwgdmFsdWUgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApXG4gICwgZCAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpXG4gICwgYXV0b0JpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc0KVxuICAsIFN5bWJvbCAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5LCBkZWZpbmVQcm9wZXJ0aWVzID0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMsIEl0ZXJhdG9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEl0ZXJhdG9yID0gZnVuY3Rpb24gKGxpc3QsIGNvbnRleHQpIHtcblx0aWYgKCEodGhpcyBpbnN0YW5jZW9mIEl0ZXJhdG9yKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNvbnN0cnVjdG9yIHJlcXVpcmVzICduZXcnXCIpO1xuXHRkZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcblx0XHRfX2xpc3RfXzogZChcIndcIiwgdmFsdWUobGlzdCkpLFxuXHRcdF9fY29udGV4dF9fOiBkKFwid1wiLCBjb250ZXh0KSxcblx0XHRfX25leHRJbmRleF9fOiBkKFwid1wiLCAwKVxuXHR9KTtcblx0aWYgKCFjb250ZXh0KSByZXR1cm47XG5cdGNhbGxhYmxlKGNvbnRleHQub24pO1xuXHRjb250ZXh0Lm9uKFwiX2FkZFwiLCB0aGlzLl9vbkFkZCk7XG5cdGNvbnRleHQub24oXCJfZGVsZXRlXCIsIHRoaXMuX29uRGVsZXRlKTtcblx0Y29udGV4dC5vbihcIl9jbGVhclwiLCB0aGlzLl9vbkNsZWFyKTtcbn07XG5cbi8vIEludGVybmFsICVJdGVyYXRvclByb3RvdHlwZSUgZG9lc24ndCBleHBvc2UgaXRzIGNvbnN0cnVjdG9yXG5kZWxldGUgSXRlcmF0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yO1xuXG5kZWZpbmVQcm9wZXJ0aWVzKFxuXHRJdGVyYXRvci5wcm90b3R5cGUsXG5cdGFzc2lnbihcblx0XHR7XG5cdFx0XHRfbmV4dDogZChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHZhciBpO1xuXHRcdFx0XHRpZiAoIXRoaXMuX19saXN0X18pIHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmICh0aGlzLl9fcmVkb19fKSB7XG5cdFx0XHRcdFx0aSA9IHRoaXMuX19yZWRvX18uc2hpZnQoKTtcblx0XHRcdFx0XHRpZiAoaSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gaTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodGhpcy5fX25leHRJbmRleF9fIDwgdGhpcy5fX2xpc3RfXy5sZW5ndGgpIHJldHVybiB0aGlzLl9fbmV4dEluZGV4X18rKztcblx0XHRcdFx0dGhpcy5fdW5CaW5kKCk7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9KSxcblx0XHRcdG5leHQ6IGQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fY3JlYXRlUmVzdWx0KHRoaXMuX25leHQoKSk7XG5cdFx0XHR9KSxcblx0XHRcdF9jcmVhdGVSZXN1bHQ6IGQoZnVuY3Rpb24gKGkpIHtcblx0XHRcdFx0aWYgKGkgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuXHRcdFx0XHRyZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IHRoaXMuX3Jlc29sdmUoaSkgfTtcblx0XHRcdH0pLFxuXHRcdFx0X3Jlc29sdmU6IGQoZnVuY3Rpb24gKGkpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX19saXN0X19baV07XG5cdFx0XHR9KSxcblx0XHRcdF91bkJpbmQ6IGQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR0aGlzLl9fbGlzdF9fID0gbnVsbDtcblx0XHRcdFx0ZGVsZXRlIHRoaXMuX19yZWRvX187XG5cdFx0XHRcdGlmICghdGhpcy5fX2NvbnRleHRfXykgcmV0dXJuO1xuXHRcdFx0XHR0aGlzLl9fY29udGV4dF9fLm9mZihcIl9hZGRcIiwgdGhpcy5fb25BZGQpO1xuXHRcdFx0XHR0aGlzLl9fY29udGV4dF9fLm9mZihcIl9kZWxldGVcIiwgdGhpcy5fb25EZWxldGUpO1xuXHRcdFx0XHR0aGlzLl9fY29udGV4dF9fLm9mZihcIl9jbGVhclwiLCB0aGlzLl9vbkNsZWFyKTtcblx0XHRcdFx0dGhpcy5fX2NvbnRleHRfXyA9IG51bGw7XG5cdFx0XHR9KSxcblx0XHRcdHRvU3RyaW5nOiBkKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIFwiW29iamVjdCBcIiArICh0aGlzW1N5bWJvbC50b1N0cmluZ1RhZ10gfHwgXCJPYmplY3RcIikgKyBcIl1cIjtcblx0XHRcdH0pXG5cdFx0fSxcblx0XHRhdXRvQmluZCh7XG5cdFx0XHRfb25BZGQ6IGQoZnVuY3Rpb24gKGluZGV4KSB7XG5cdFx0XHRcdGlmIChpbmRleCA+PSB0aGlzLl9fbmV4dEluZGV4X18pIHJldHVybjtcblx0XHRcdFx0Kyt0aGlzLl9fbmV4dEluZGV4X187XG5cdFx0XHRcdGlmICghdGhpcy5fX3JlZG9fXykge1xuXHRcdFx0XHRcdGRlZmluZVByb3BlcnR5KHRoaXMsIFwiX19yZWRvX19cIiwgZChcImNcIiwgW2luZGV4XSkpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9fcmVkb19fLmZvckVhY2goZnVuY3Rpb24gKHJlZG8sIGkpIHtcblx0XHRcdFx0XHRpZiAocmVkbyA+PSBpbmRleCkgdGhpcy5fX3JlZG9fX1tpXSA9ICsrcmVkbztcblx0XHRcdFx0fSwgdGhpcyk7XG5cdFx0XHRcdHRoaXMuX19yZWRvX18ucHVzaChpbmRleCk7XG5cdFx0XHR9KSxcblx0XHRcdF9vbkRlbGV0ZTogZChmdW5jdGlvbiAoaW5kZXgpIHtcblx0XHRcdFx0dmFyIGk7XG5cdFx0XHRcdGlmIChpbmRleCA+PSB0aGlzLl9fbmV4dEluZGV4X18pIHJldHVybjtcblx0XHRcdFx0LS10aGlzLl9fbmV4dEluZGV4X187XG5cdFx0XHRcdGlmICghdGhpcy5fX3JlZG9fXykgcmV0dXJuO1xuXHRcdFx0XHRpID0gdGhpcy5fX3JlZG9fXy5pbmRleE9mKGluZGV4KTtcblx0XHRcdFx0aWYgKGkgIT09IC0xKSB0aGlzLl9fcmVkb19fLnNwbGljZShpLCAxKTtcblx0XHRcdFx0dGhpcy5fX3JlZG9fXy5mb3JFYWNoKGZ1bmN0aW9uIChyZWRvLCBqKSB7XG5cdFx0XHRcdFx0aWYgKHJlZG8gPiBpbmRleCkgdGhpcy5fX3JlZG9fX1tqXSA9IC0tcmVkbztcblx0XHRcdFx0fSwgdGhpcyk7XG5cdFx0XHR9KSxcblx0XHRcdF9vbkNsZWFyOiBkKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKHRoaXMuX19yZWRvX18pIGNsZWFyLmNhbGwodGhpcy5fX3JlZG9fXyk7XG5cdFx0XHRcdHRoaXMuX19uZXh0SW5kZXhfXyA9IDA7XG5cdFx0XHR9KVxuXHRcdH0pXG5cdClcbik7XG5cbmRlZmluZVByb3BlcnR5KFxuXHRJdGVyYXRvci5wcm90b3R5cGUsXG5cdFN5bWJvbC5pdGVyYXRvcixcblx0ZChmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0pXG4pO1xuXG5cbi8qKiovIH0pLFxuLyogMTMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSB7XCJhbXBcIjpcIiZcIixcImFwb3NcIjpcIidcIixcImd0XCI6XCI+XCIsXCJsdFwiOlwiPFwiLFwicXVvdFwiOlwiXFxcIlwifVxuXG4vKioqLyB9KSxcbi8qIDE0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0ge1wiQWFjdXRlXCI6XCLDgVwiLFwiYWFjdXRlXCI6XCLDoVwiLFwiQWJyZXZlXCI6XCLEglwiLFwiYWJyZXZlXCI6XCLEg1wiLFwiYWNcIjpcIuKIvlwiLFwiYWNkXCI6XCLiiL9cIixcImFjRVwiOlwi4oi+zLNcIixcIkFjaXJjXCI6XCLDglwiLFwiYWNpcmNcIjpcIsOiXCIsXCJhY3V0ZVwiOlwiwrRcIixcIkFjeVwiOlwi0JBcIixcImFjeVwiOlwi0LBcIixcIkFFbGlnXCI6XCLDhlwiLFwiYWVsaWdcIjpcIsOmXCIsXCJhZlwiOlwi4oGhXCIsXCJBZnJcIjpcIvCdlIRcIixcImFmclwiOlwi8J2UnlwiLFwiQWdyYXZlXCI6XCLDgFwiLFwiYWdyYXZlXCI6XCLDoFwiLFwiYWxlZnN5bVwiOlwi4oS1XCIsXCJhbGVwaFwiOlwi4oS1XCIsXCJBbHBoYVwiOlwizpFcIixcImFscGhhXCI6XCLOsVwiLFwiQW1hY3JcIjpcIsSAXCIsXCJhbWFjclwiOlwixIFcIixcImFtYWxnXCI6XCLiqL9cIixcImFtcFwiOlwiJlwiLFwiQU1QXCI6XCImXCIsXCJhbmRhbmRcIjpcIuKplVwiLFwiQW5kXCI6XCLiqZNcIixcImFuZFwiOlwi4oinXCIsXCJhbmRkXCI6XCLiqZxcIixcImFuZHNsb3BlXCI6XCLiqZhcIixcImFuZHZcIjpcIuKpmlwiLFwiYW5nXCI6XCLiiKBcIixcImFuZ2VcIjpcIuKmpFwiLFwiYW5nbGVcIjpcIuKIoFwiLFwiYW5nbXNkYWFcIjpcIuKmqFwiLFwiYW5nbXNkYWJcIjpcIuKmqVwiLFwiYW5nbXNkYWNcIjpcIuKmqlwiLFwiYW5nbXNkYWRcIjpcIuKmq1wiLFwiYW5nbXNkYWVcIjpcIuKmrFwiLFwiYW5nbXNkYWZcIjpcIuKmrVwiLFwiYW5nbXNkYWdcIjpcIuKmrlwiLFwiYW5nbXNkYWhcIjpcIuKmr1wiLFwiYW5nbXNkXCI6XCLiiKFcIixcImFuZ3J0XCI6XCLiiJ9cIixcImFuZ3J0dmJcIjpcIuKKvlwiLFwiYW5ncnR2YmRcIjpcIuKmnVwiLFwiYW5nc3BoXCI6XCLiiKJcIixcImFuZ3N0XCI6XCLDhVwiLFwiYW5nemFyclwiOlwi4o28XCIsXCJBb2dvblwiOlwixIRcIixcImFvZ29uXCI6XCLEhVwiLFwiQW9wZlwiOlwi8J2UuFwiLFwiYW9wZlwiOlwi8J2VklwiLFwiYXBhY2lyXCI6XCLiqa9cIixcImFwXCI6XCLiiYhcIixcImFwRVwiOlwi4qmwXCIsXCJhcGVcIjpcIuKJilwiLFwiYXBpZFwiOlwi4omLXCIsXCJhcG9zXCI6XCInXCIsXCJBcHBseUZ1bmN0aW9uXCI6XCLigaFcIixcImFwcHJveFwiOlwi4omIXCIsXCJhcHByb3hlcVwiOlwi4omKXCIsXCJBcmluZ1wiOlwiw4VcIixcImFyaW5nXCI6XCLDpVwiLFwiQXNjclwiOlwi8J2SnFwiLFwiYXNjclwiOlwi8J2StlwiLFwiQXNzaWduXCI6XCLiiZRcIixcImFzdFwiOlwiKlwiLFwiYXN5bXBcIjpcIuKJiFwiLFwiYXN5bXBlcVwiOlwi4omNXCIsXCJBdGlsZGVcIjpcIsODXCIsXCJhdGlsZGVcIjpcIsOjXCIsXCJBdW1sXCI6XCLDhFwiLFwiYXVtbFwiOlwiw6RcIixcImF3Y29uaW50XCI6XCLiiLNcIixcImF3aW50XCI6XCLiqJFcIixcImJhY2tjb25nXCI6XCLiiYxcIixcImJhY2tlcHNpbG9uXCI6XCLPtlwiLFwiYmFja3ByaW1lXCI6XCLigLVcIixcImJhY2tzaW1cIjpcIuKIvVwiLFwiYmFja3NpbWVxXCI6XCLii41cIixcIkJhY2tzbGFzaFwiOlwi4oiWXCIsXCJCYXJ2XCI6XCLiq6dcIixcImJhcnZlZVwiOlwi4oq9XCIsXCJiYXJ3ZWRcIjpcIuKMhVwiLFwiQmFyd2VkXCI6XCLijIZcIixcImJhcndlZGdlXCI6XCLijIVcIixcImJicmtcIjpcIuKOtVwiLFwiYmJya3RicmtcIjpcIuKOtlwiLFwiYmNvbmdcIjpcIuKJjFwiLFwiQmN5XCI6XCLQkVwiLFwiYmN5XCI6XCLQsVwiLFwiYmRxdW9cIjpcIuKAnlwiLFwiYmVjYXVzXCI6XCLiiLVcIixcImJlY2F1c2VcIjpcIuKItVwiLFwiQmVjYXVzZVwiOlwi4oi1XCIsXCJiZW1wdHl2XCI6XCLiprBcIixcImJlcHNpXCI6XCLPtlwiLFwiYmVybm91XCI6XCLihKxcIixcIkJlcm5vdWxsaXNcIjpcIuKErFwiLFwiQmV0YVwiOlwizpJcIixcImJldGFcIjpcIs6yXCIsXCJiZXRoXCI6XCLihLZcIixcImJldHdlZW5cIjpcIuKJrFwiLFwiQmZyXCI6XCLwnZSFXCIsXCJiZnJcIjpcIvCdlJ9cIixcImJpZ2NhcFwiOlwi4ouCXCIsXCJiaWdjaXJjXCI6XCLil69cIixcImJpZ2N1cFwiOlwi4ouDXCIsXCJiaWdvZG90XCI6XCLiqIBcIixcImJpZ29wbHVzXCI6XCLiqIFcIixcImJpZ290aW1lc1wiOlwi4qiCXCIsXCJiaWdzcWN1cFwiOlwi4qiGXCIsXCJiaWdzdGFyXCI6XCLimIVcIixcImJpZ3RyaWFuZ2xlZG93blwiOlwi4pa9XCIsXCJiaWd0cmlhbmdsZXVwXCI6XCLilrNcIixcImJpZ3VwbHVzXCI6XCLiqIRcIixcImJpZ3ZlZVwiOlwi4ouBXCIsXCJiaWd3ZWRnZVwiOlwi4ouAXCIsXCJia2Fyb3dcIjpcIuKkjVwiLFwiYmxhY2tsb3plbmdlXCI6XCLip6tcIixcImJsYWNrc3F1YXJlXCI6XCLilqpcIixcImJsYWNrdHJpYW5nbGVcIjpcIuKWtFwiLFwiYmxhY2t0cmlhbmdsZWRvd25cIjpcIuKWvlwiLFwiYmxhY2t0cmlhbmdsZWxlZnRcIjpcIuKXglwiLFwiYmxhY2t0cmlhbmdsZXJpZ2h0XCI6XCLilrhcIixcImJsYW5rXCI6XCLikKNcIixcImJsazEyXCI6XCLilpJcIixcImJsazE0XCI6XCLilpFcIixcImJsazM0XCI6XCLilpNcIixcImJsb2NrXCI6XCLilohcIixcImJuZVwiOlwiPeKDpVwiLFwiYm5lcXVpdlwiOlwi4omh4oOlXCIsXCJiTm90XCI6XCLiq61cIixcImJub3RcIjpcIuKMkFwiLFwiQm9wZlwiOlwi8J2UuVwiLFwiYm9wZlwiOlwi8J2Vk1wiLFwiYm90XCI6XCLiiqVcIixcImJvdHRvbVwiOlwi4oqlXCIsXCJib3d0aWVcIjpcIuKLiFwiLFwiYm94Ym94XCI6XCLip4lcIixcImJveGRsXCI6XCLilJBcIixcImJveGRMXCI6XCLilZVcIixcImJveERsXCI6XCLilZZcIixcImJveERMXCI6XCLilZdcIixcImJveGRyXCI6XCLilIxcIixcImJveGRSXCI6XCLilZJcIixcImJveERyXCI6XCLilZNcIixcImJveERSXCI6XCLilZRcIixcImJveGhcIjpcIuKUgFwiLFwiYm94SFwiOlwi4pWQXCIsXCJib3hoZFwiOlwi4pSsXCIsXCJib3hIZFwiOlwi4pWkXCIsXCJib3hoRFwiOlwi4pWlXCIsXCJib3hIRFwiOlwi4pWmXCIsXCJib3hodVwiOlwi4pS0XCIsXCJib3hIdVwiOlwi4pWnXCIsXCJib3hoVVwiOlwi4pWoXCIsXCJib3hIVVwiOlwi4pWpXCIsXCJib3htaW51c1wiOlwi4oqfXCIsXCJib3hwbHVzXCI6XCLiip5cIixcImJveHRpbWVzXCI6XCLiiqBcIixcImJveHVsXCI6XCLilJhcIixcImJveHVMXCI6XCLilZtcIixcImJveFVsXCI6XCLilZxcIixcImJveFVMXCI6XCLilZ1cIixcImJveHVyXCI6XCLilJRcIixcImJveHVSXCI6XCLilZhcIixcImJveFVyXCI6XCLilZlcIixcImJveFVSXCI6XCLilZpcIixcImJveHZcIjpcIuKUglwiLFwiYm94VlwiOlwi4pWRXCIsXCJib3h2aFwiOlwi4pS8XCIsXCJib3h2SFwiOlwi4pWqXCIsXCJib3hWaFwiOlwi4pWrXCIsXCJib3hWSFwiOlwi4pWsXCIsXCJib3h2bFwiOlwi4pSkXCIsXCJib3h2TFwiOlwi4pWhXCIsXCJib3hWbFwiOlwi4pWiXCIsXCJib3hWTFwiOlwi4pWjXCIsXCJib3h2clwiOlwi4pScXCIsXCJib3h2UlwiOlwi4pWeXCIsXCJib3hWclwiOlwi4pWfXCIsXCJib3hWUlwiOlwi4pWgXCIsXCJicHJpbWVcIjpcIuKAtVwiLFwiYnJldmVcIjpcIsuYXCIsXCJCcmV2ZVwiOlwiy5hcIixcImJydmJhclwiOlwiwqZcIixcImJzY3JcIjpcIvCdkrdcIixcIkJzY3JcIjpcIuKErFwiLFwiYnNlbWlcIjpcIuKBj1wiLFwiYnNpbVwiOlwi4oi9XCIsXCJic2ltZVwiOlwi4ouNXCIsXCJic29sYlwiOlwi4qeFXCIsXCJic29sXCI6XCJcXFxcXCIsXCJic29saHN1YlwiOlwi4p+IXCIsXCJidWxsXCI6XCLigKJcIixcImJ1bGxldFwiOlwi4oCiXCIsXCJidW1wXCI6XCLiiY5cIixcImJ1bXBFXCI6XCLiqq5cIixcImJ1bXBlXCI6XCLiiY9cIixcIkJ1bXBlcVwiOlwi4omOXCIsXCJidW1wZXFcIjpcIuKJj1wiLFwiQ2FjdXRlXCI6XCLEhlwiLFwiY2FjdXRlXCI6XCLEh1wiLFwiY2FwYW5kXCI6XCLiqYRcIixcImNhcGJyY3VwXCI6XCLiqYlcIixcImNhcGNhcFwiOlwi4qmLXCIsXCJjYXBcIjpcIuKIqVwiLFwiQ2FwXCI6XCLii5JcIixcImNhcGN1cFwiOlwi4qmHXCIsXCJjYXBkb3RcIjpcIuKpgFwiLFwiQ2FwaXRhbERpZmZlcmVudGlhbERcIjpcIuKFhVwiLFwiY2Fwc1wiOlwi4oip77iAXCIsXCJjYXJldFwiOlwi4oGBXCIsXCJjYXJvblwiOlwiy4dcIixcIkNheWxleXNcIjpcIuKErVwiLFwiY2NhcHNcIjpcIuKpjVwiLFwiQ2Nhcm9uXCI6XCLEjFwiLFwiY2Nhcm9uXCI6XCLEjVwiLFwiQ2NlZGlsXCI6XCLDh1wiLFwiY2NlZGlsXCI6XCLDp1wiLFwiQ2NpcmNcIjpcIsSIXCIsXCJjY2lyY1wiOlwixIlcIixcIkNjb25pbnRcIjpcIuKIsFwiLFwiY2N1cHNcIjpcIuKpjFwiLFwiY2N1cHNzbVwiOlwi4qmQXCIsXCJDZG90XCI6XCLEilwiLFwiY2RvdFwiOlwixItcIixcImNlZGlsXCI6XCLCuFwiLFwiQ2VkaWxsYVwiOlwiwrhcIixcImNlbXB0eXZcIjpcIuKmslwiLFwiY2VudFwiOlwiwqJcIixcImNlbnRlcmRvdFwiOlwiwrdcIixcIkNlbnRlckRvdFwiOlwiwrdcIixcImNmclwiOlwi8J2UoFwiLFwiQ2ZyXCI6XCLihK1cIixcIkNIY3lcIjpcItCnXCIsXCJjaGN5XCI6XCLRh1wiLFwiY2hlY2tcIjpcIuKck1wiLFwiY2hlY2ttYXJrXCI6XCLinJNcIixcIkNoaVwiOlwizqdcIixcImNoaVwiOlwiz4dcIixcImNpcmNcIjpcIsuGXCIsXCJjaXJjZXFcIjpcIuKJl1wiLFwiY2lyY2xlYXJyb3dsZWZ0XCI6XCLihrpcIixcImNpcmNsZWFycm93cmlnaHRcIjpcIuKGu1wiLFwiY2lyY2xlZGFzdFwiOlwi4oqbXCIsXCJjaXJjbGVkY2lyY1wiOlwi4oqaXCIsXCJjaXJjbGVkZGFzaFwiOlwi4oqdXCIsXCJDaXJjbGVEb3RcIjpcIuKKmVwiLFwiY2lyY2xlZFJcIjpcIsKuXCIsXCJjaXJjbGVkU1wiOlwi4pOIXCIsXCJDaXJjbGVNaW51c1wiOlwi4oqWXCIsXCJDaXJjbGVQbHVzXCI6XCLiipVcIixcIkNpcmNsZVRpbWVzXCI6XCLiipdcIixcImNpclwiOlwi4peLXCIsXCJjaXJFXCI6XCLip4NcIixcImNpcmVcIjpcIuKJl1wiLFwiY2lyZm5pbnRcIjpcIuKokFwiLFwiY2lybWlkXCI6XCLiq69cIixcImNpcnNjaXJcIjpcIuKnglwiLFwiQ2xvY2t3aXNlQ29udG91ckludGVncmFsXCI6XCLiiLJcIixcIkNsb3NlQ3VybHlEb3VibGVRdW90ZVwiOlwi4oCdXCIsXCJDbG9zZUN1cmx5UXVvdGVcIjpcIuKAmVwiLFwiY2x1YnNcIjpcIuKZo1wiLFwiY2x1YnN1aXRcIjpcIuKZo1wiLFwiY29sb25cIjpcIjpcIixcIkNvbG9uXCI6XCLiiLdcIixcIkNvbG9uZVwiOlwi4qm0XCIsXCJjb2xvbmVcIjpcIuKJlFwiLFwiY29sb25lcVwiOlwi4omUXCIsXCJjb21tYVwiOlwiLFwiLFwiY29tbWF0XCI6XCJAXCIsXCJjb21wXCI6XCLiiIFcIixcImNvbXBmblwiOlwi4oiYXCIsXCJjb21wbGVtZW50XCI6XCLiiIFcIixcImNvbXBsZXhlc1wiOlwi4oSCXCIsXCJjb25nXCI6XCLiiYVcIixcImNvbmdkb3RcIjpcIuKprVwiLFwiQ29uZ3J1ZW50XCI6XCLiiaFcIixcImNvbmludFwiOlwi4oiuXCIsXCJDb25pbnRcIjpcIuKIr1wiLFwiQ29udG91ckludGVncmFsXCI6XCLiiK5cIixcImNvcGZcIjpcIvCdlZRcIixcIkNvcGZcIjpcIuKEglwiLFwiY29wcm9kXCI6XCLiiJBcIixcIkNvcHJvZHVjdFwiOlwi4oiQXCIsXCJjb3B5XCI6XCLCqVwiLFwiQ09QWVwiOlwiwqlcIixcImNvcHlzclwiOlwi4oSXXCIsXCJDb3VudGVyQ2xvY2t3aXNlQ29udG91ckludGVncmFsXCI6XCLiiLNcIixcImNyYXJyXCI6XCLihrVcIixcImNyb3NzXCI6XCLinJdcIixcIkNyb3NzXCI6XCLiqK9cIixcIkNzY3JcIjpcIvCdkp5cIixcImNzY3JcIjpcIvCdkrhcIixcImNzdWJcIjpcIuKrj1wiLFwiY3N1YmVcIjpcIuKrkVwiLFwiY3N1cFwiOlwi4quQXCIsXCJjc3VwZVwiOlwi4quSXCIsXCJjdGRvdFwiOlwi4ouvXCIsXCJjdWRhcnJsXCI6XCLipLhcIixcImN1ZGFycnJcIjpcIuKktVwiLFwiY3VlcHJcIjpcIuKLnlwiLFwiY3Vlc2NcIjpcIuKLn1wiLFwiY3VsYXJyXCI6XCLihrZcIixcImN1bGFycnBcIjpcIuKkvVwiLFwiY3VwYnJjYXBcIjpcIuKpiFwiLFwiY3VwY2FwXCI6XCLiqYZcIixcIkN1cENhcFwiOlwi4omNXCIsXCJjdXBcIjpcIuKIqlwiLFwiQ3VwXCI6XCLii5NcIixcImN1cGN1cFwiOlwi4qmKXCIsXCJjdXBkb3RcIjpcIuKKjVwiLFwiY3Vwb3JcIjpcIuKphVwiLFwiY3Vwc1wiOlwi4oiq77iAXCIsXCJjdXJhcnJcIjpcIuKGt1wiLFwiY3VyYXJybVwiOlwi4qS8XCIsXCJjdXJseWVxcHJlY1wiOlwi4oueXCIsXCJjdXJseWVxc3VjY1wiOlwi4oufXCIsXCJjdXJseXZlZVwiOlwi4ouOXCIsXCJjdXJseXdlZGdlXCI6XCLii49cIixcImN1cnJlblwiOlwiwqRcIixcImN1cnZlYXJyb3dsZWZ0XCI6XCLihrZcIixcImN1cnZlYXJyb3dyaWdodFwiOlwi4oa3XCIsXCJjdXZlZVwiOlwi4ouOXCIsXCJjdXdlZFwiOlwi4ouPXCIsXCJjd2NvbmludFwiOlwi4oiyXCIsXCJjd2ludFwiOlwi4oixXCIsXCJjeWxjdHlcIjpcIuKMrVwiLFwiZGFnZ2VyXCI6XCLigKBcIixcIkRhZ2dlclwiOlwi4oChXCIsXCJkYWxldGhcIjpcIuKEuFwiLFwiZGFyclwiOlwi4oaTXCIsXCJEYXJyXCI6XCLihqFcIixcImRBcnJcIjpcIuKHk1wiLFwiZGFzaFwiOlwi4oCQXCIsXCJEYXNodlwiOlwi4qukXCIsXCJkYXNodlwiOlwi4oqjXCIsXCJkYmthcm93XCI6XCLipI9cIixcImRibGFjXCI6XCLLnVwiLFwiRGNhcm9uXCI6XCLEjlwiLFwiZGNhcm9uXCI6XCLEj1wiLFwiRGN5XCI6XCLQlFwiLFwiZGN5XCI6XCLQtFwiLFwiZGRhZ2dlclwiOlwi4oChXCIsXCJkZGFyclwiOlwi4oeKXCIsXCJERFwiOlwi4oWFXCIsXCJkZFwiOlwi4oWGXCIsXCJERG90cmFoZFwiOlwi4qSRXCIsXCJkZG90c2VxXCI6XCLiqbdcIixcImRlZ1wiOlwiwrBcIixcIkRlbFwiOlwi4oiHXCIsXCJEZWx0YVwiOlwizpRcIixcImRlbHRhXCI6XCLOtFwiLFwiZGVtcHR5dlwiOlwi4qaxXCIsXCJkZmlzaHRcIjpcIuKlv1wiLFwiRGZyXCI6XCLwnZSHXCIsXCJkZnJcIjpcIvCdlKFcIixcImRIYXJcIjpcIuKlpVwiLFwiZGhhcmxcIjpcIuKHg1wiLFwiZGhhcnJcIjpcIuKHglwiLFwiRGlhY3JpdGljYWxBY3V0ZVwiOlwiwrRcIixcIkRpYWNyaXRpY2FsRG90XCI6XCLLmVwiLFwiRGlhY3JpdGljYWxEb3VibGVBY3V0ZVwiOlwiy51cIixcIkRpYWNyaXRpY2FsR3JhdmVcIjpcImBcIixcIkRpYWNyaXRpY2FsVGlsZGVcIjpcIsucXCIsXCJkaWFtXCI6XCLii4RcIixcImRpYW1vbmRcIjpcIuKLhFwiLFwiRGlhbW9uZFwiOlwi4ouEXCIsXCJkaWFtb25kc3VpdFwiOlwi4pmmXCIsXCJkaWFtc1wiOlwi4pmmXCIsXCJkaWVcIjpcIsKoXCIsXCJEaWZmZXJlbnRpYWxEXCI6XCLihYZcIixcImRpZ2FtbWFcIjpcIs+dXCIsXCJkaXNpblwiOlwi4ouyXCIsXCJkaXZcIjpcIsO3XCIsXCJkaXZpZGVcIjpcIsO3XCIsXCJkaXZpZGVvbnRpbWVzXCI6XCLii4dcIixcImRpdm9ueFwiOlwi4ouHXCIsXCJESmN5XCI6XCLQglwiLFwiZGpjeVwiOlwi0ZJcIixcImRsY29yblwiOlwi4oyeXCIsXCJkbGNyb3BcIjpcIuKMjVwiLFwiZG9sbGFyXCI6XCIkXCIsXCJEb3BmXCI6XCLwnZS7XCIsXCJkb3BmXCI6XCLwnZWVXCIsXCJEb3RcIjpcIsKoXCIsXCJkb3RcIjpcIsuZXCIsXCJEb3REb3RcIjpcIuKDnFwiLFwiZG90ZXFcIjpcIuKJkFwiLFwiZG90ZXFkb3RcIjpcIuKJkVwiLFwiRG90RXF1YWxcIjpcIuKJkFwiLFwiZG90bWludXNcIjpcIuKIuFwiLFwiZG90cGx1c1wiOlwi4oiUXCIsXCJkb3RzcXVhcmVcIjpcIuKKoVwiLFwiZG91YmxlYmFyd2VkZ2VcIjpcIuKMhlwiLFwiRG91YmxlQ29udG91ckludGVncmFsXCI6XCLiiK9cIixcIkRvdWJsZURvdFwiOlwiwqhcIixcIkRvdWJsZURvd25BcnJvd1wiOlwi4oeTXCIsXCJEb3VibGVMZWZ0QXJyb3dcIjpcIuKHkFwiLFwiRG91YmxlTGVmdFJpZ2h0QXJyb3dcIjpcIuKHlFwiLFwiRG91YmxlTGVmdFRlZVwiOlwi4qukXCIsXCJEb3VibGVMb25nTGVmdEFycm93XCI6XCLin7hcIixcIkRvdWJsZUxvbmdMZWZ0UmlnaHRBcnJvd1wiOlwi4p+6XCIsXCJEb3VibGVMb25nUmlnaHRBcnJvd1wiOlwi4p+5XCIsXCJEb3VibGVSaWdodEFycm93XCI6XCLih5JcIixcIkRvdWJsZVJpZ2h0VGVlXCI6XCLiiqhcIixcIkRvdWJsZVVwQXJyb3dcIjpcIuKHkVwiLFwiRG91YmxlVXBEb3duQXJyb3dcIjpcIuKHlVwiLFwiRG91YmxlVmVydGljYWxCYXJcIjpcIuKIpVwiLFwiRG93bkFycm93QmFyXCI6XCLipJNcIixcImRvd25hcnJvd1wiOlwi4oaTXCIsXCJEb3duQXJyb3dcIjpcIuKGk1wiLFwiRG93bmFycm93XCI6XCLih5NcIixcIkRvd25BcnJvd1VwQXJyb3dcIjpcIuKHtVwiLFwiRG93bkJyZXZlXCI6XCLMkVwiLFwiZG93bmRvd25hcnJvd3NcIjpcIuKHilwiLFwiZG93bmhhcnBvb25sZWZ0XCI6XCLih4NcIixcImRvd25oYXJwb29ucmlnaHRcIjpcIuKHglwiLFwiRG93bkxlZnRSaWdodFZlY3RvclwiOlwi4qWQXCIsXCJEb3duTGVmdFRlZVZlY3RvclwiOlwi4qWeXCIsXCJEb3duTGVmdFZlY3RvckJhclwiOlwi4qWWXCIsXCJEb3duTGVmdFZlY3RvclwiOlwi4oa9XCIsXCJEb3duUmlnaHRUZWVWZWN0b3JcIjpcIuKln1wiLFwiRG93blJpZ2h0VmVjdG9yQmFyXCI6XCLipZdcIixcIkRvd25SaWdodFZlY3RvclwiOlwi4oeBXCIsXCJEb3duVGVlQXJyb3dcIjpcIuKGp1wiLFwiRG93blRlZVwiOlwi4oqkXCIsXCJkcmJrYXJvd1wiOlwi4qSQXCIsXCJkcmNvcm5cIjpcIuKMn1wiLFwiZHJjcm9wXCI6XCLijIxcIixcIkRzY3JcIjpcIvCdkp9cIixcImRzY3JcIjpcIvCdkrlcIixcIkRTY3lcIjpcItCFXCIsXCJkc2N5XCI6XCLRlVwiLFwiZHNvbFwiOlwi4qe2XCIsXCJEc3Ryb2tcIjpcIsSQXCIsXCJkc3Ryb2tcIjpcIsSRXCIsXCJkdGRvdFwiOlwi4ouxXCIsXCJkdHJpXCI6XCLilr9cIixcImR0cmlmXCI6XCLilr5cIixcImR1YXJyXCI6XCLih7VcIixcImR1aGFyXCI6XCLipa9cIixcImR3YW5nbGVcIjpcIuKmplwiLFwiRFpjeVwiOlwi0I9cIixcImR6Y3lcIjpcItGfXCIsXCJkemlncmFyclwiOlwi4p+/XCIsXCJFYWN1dGVcIjpcIsOJXCIsXCJlYWN1dGVcIjpcIsOpXCIsXCJlYXN0ZXJcIjpcIuKprlwiLFwiRWNhcm9uXCI6XCLEmlwiLFwiZWNhcm9uXCI6XCLEm1wiLFwiRWNpcmNcIjpcIsOKXCIsXCJlY2lyY1wiOlwiw6pcIixcImVjaXJcIjpcIuKJllwiLFwiZWNvbG9uXCI6XCLiiZVcIixcIkVjeVwiOlwi0K1cIixcImVjeVwiOlwi0Y1cIixcImVERG90XCI6XCLiqbdcIixcIkVkb3RcIjpcIsSWXCIsXCJlZG90XCI6XCLEl1wiLFwiZURvdFwiOlwi4omRXCIsXCJlZVwiOlwi4oWHXCIsXCJlZkRvdFwiOlwi4omSXCIsXCJFZnJcIjpcIvCdlIhcIixcImVmclwiOlwi8J2UolwiLFwiZWdcIjpcIuKqmlwiLFwiRWdyYXZlXCI6XCLDiFwiLFwiZWdyYXZlXCI6XCLDqFwiLFwiZWdzXCI6XCLiqpZcIixcImVnc2RvdFwiOlwi4qqYXCIsXCJlbFwiOlwi4qqZXCIsXCJFbGVtZW50XCI6XCLiiIhcIixcImVsaW50ZXJzXCI6XCLij6dcIixcImVsbFwiOlwi4oSTXCIsXCJlbHNcIjpcIuKqlVwiLFwiZWxzZG90XCI6XCLiqpdcIixcIkVtYWNyXCI6XCLEklwiLFwiZW1hY3JcIjpcIsSTXCIsXCJlbXB0eVwiOlwi4oiFXCIsXCJlbXB0eXNldFwiOlwi4oiFXCIsXCJFbXB0eVNtYWxsU3F1YXJlXCI6XCLil7tcIixcImVtcHR5dlwiOlwi4oiFXCIsXCJFbXB0eVZlcnlTbWFsbFNxdWFyZVwiOlwi4parXCIsXCJlbXNwMTNcIjpcIuKAhFwiLFwiZW1zcDE0XCI6XCLigIVcIixcImVtc3BcIjpcIuKAg1wiLFwiRU5HXCI6XCLFilwiLFwiZW5nXCI6XCLFi1wiLFwiZW5zcFwiOlwi4oCCXCIsXCJFb2dvblwiOlwixJhcIixcImVvZ29uXCI6XCLEmVwiLFwiRW9wZlwiOlwi8J2UvFwiLFwiZW9wZlwiOlwi8J2VllwiLFwiZXBhclwiOlwi4ouVXCIsXCJlcGFyc2xcIjpcIuKno1wiLFwiZXBsdXNcIjpcIuKpsVwiLFwiZXBzaVwiOlwizrVcIixcIkVwc2lsb25cIjpcIs6VXCIsXCJlcHNpbG9uXCI6XCLOtVwiLFwiZXBzaXZcIjpcIs+1XCIsXCJlcWNpcmNcIjpcIuKJllwiLFwiZXFjb2xvblwiOlwi4omVXCIsXCJlcXNpbVwiOlwi4omCXCIsXCJlcXNsYW50Z3RyXCI6XCLiqpZcIixcImVxc2xhbnRsZXNzXCI6XCLiqpVcIixcIkVxdWFsXCI6XCLiqbVcIixcImVxdWFsc1wiOlwiPVwiLFwiRXF1YWxUaWxkZVwiOlwi4omCXCIsXCJlcXVlc3RcIjpcIuKJn1wiLFwiRXF1aWxpYnJpdW1cIjpcIuKHjFwiLFwiZXF1aXZcIjpcIuKJoVwiLFwiZXF1aXZERFwiOlwi4qm4XCIsXCJlcXZwYXJzbFwiOlwi4qelXCIsXCJlcmFyclwiOlwi4qWxXCIsXCJlckRvdFwiOlwi4omTXCIsXCJlc2NyXCI6XCLihK9cIixcIkVzY3JcIjpcIuKEsFwiLFwiZXNkb3RcIjpcIuKJkFwiLFwiRXNpbVwiOlwi4qmzXCIsXCJlc2ltXCI6XCLiiYJcIixcIkV0YVwiOlwizpdcIixcImV0YVwiOlwizrdcIixcIkVUSFwiOlwiw5BcIixcImV0aFwiOlwiw7BcIixcIkV1bWxcIjpcIsOLXCIsXCJldW1sXCI6XCLDq1wiLFwiZXVyb1wiOlwi4oKsXCIsXCJleGNsXCI6XCIhXCIsXCJleGlzdFwiOlwi4oiDXCIsXCJFeGlzdHNcIjpcIuKIg1wiLFwiZXhwZWN0YXRpb25cIjpcIuKEsFwiLFwiZXhwb25lbnRpYWxlXCI6XCLihYdcIixcIkV4cG9uZW50aWFsRVwiOlwi4oWHXCIsXCJmYWxsaW5nZG90c2VxXCI6XCLiiZJcIixcIkZjeVwiOlwi0KRcIixcImZjeVwiOlwi0YRcIixcImZlbWFsZVwiOlwi4pmAXCIsXCJmZmlsaWdcIjpcIu+sg1wiLFwiZmZsaWdcIjpcIu+sgFwiLFwiZmZsbGlnXCI6XCLvrIRcIixcIkZmclwiOlwi8J2UiVwiLFwiZmZyXCI6XCLwnZSjXCIsXCJmaWxpZ1wiOlwi76yBXCIsXCJGaWxsZWRTbWFsbFNxdWFyZVwiOlwi4pe8XCIsXCJGaWxsZWRWZXJ5U21hbGxTcXVhcmVcIjpcIuKWqlwiLFwiZmpsaWdcIjpcImZqXCIsXCJmbGF0XCI6XCLima1cIixcImZsbGlnXCI6XCLvrIJcIixcImZsdG5zXCI6XCLilrFcIixcImZub2ZcIjpcIsaSXCIsXCJGb3BmXCI6XCLwnZS9XCIsXCJmb3BmXCI6XCLwnZWXXCIsXCJmb3JhbGxcIjpcIuKIgFwiLFwiRm9yQWxsXCI6XCLiiIBcIixcImZvcmtcIjpcIuKLlFwiLFwiZm9ya3ZcIjpcIuKrmVwiLFwiRm91cmllcnRyZlwiOlwi4oSxXCIsXCJmcGFydGludFwiOlwi4qiNXCIsXCJmcmFjMTJcIjpcIsK9XCIsXCJmcmFjMTNcIjpcIuKFk1wiLFwiZnJhYzE0XCI6XCLCvFwiLFwiZnJhYzE1XCI6XCLihZVcIixcImZyYWMxNlwiOlwi4oWZXCIsXCJmcmFjMThcIjpcIuKFm1wiLFwiZnJhYzIzXCI6XCLihZRcIixcImZyYWMyNVwiOlwi4oWWXCIsXCJmcmFjMzRcIjpcIsK+XCIsXCJmcmFjMzVcIjpcIuKFl1wiLFwiZnJhYzM4XCI6XCLihZxcIixcImZyYWM0NVwiOlwi4oWYXCIsXCJmcmFjNTZcIjpcIuKFmlwiLFwiZnJhYzU4XCI6XCLihZ1cIixcImZyYWM3OFwiOlwi4oWeXCIsXCJmcmFzbFwiOlwi4oGEXCIsXCJmcm93blwiOlwi4oyiXCIsXCJmc2NyXCI6XCLwnZK7XCIsXCJGc2NyXCI6XCLihLFcIixcImdhY3V0ZVwiOlwix7VcIixcIkdhbW1hXCI6XCLOk1wiLFwiZ2FtbWFcIjpcIs6zXCIsXCJHYW1tYWRcIjpcIs+cXCIsXCJnYW1tYWRcIjpcIs+dXCIsXCJnYXBcIjpcIuKqhlwiLFwiR2JyZXZlXCI6XCLEnlwiLFwiZ2JyZXZlXCI6XCLEn1wiLFwiR2NlZGlsXCI6XCLEolwiLFwiR2NpcmNcIjpcIsScXCIsXCJnY2lyY1wiOlwixJ1cIixcIkdjeVwiOlwi0JNcIixcImdjeVwiOlwi0LNcIixcIkdkb3RcIjpcIsSgXCIsXCJnZG90XCI6XCLEoVwiLFwiZ2VcIjpcIuKJpVwiLFwiZ0VcIjpcIuKJp1wiLFwiZ0VsXCI6XCLiqoxcIixcImdlbFwiOlwi4oubXCIsXCJnZXFcIjpcIuKJpVwiLFwiZ2VxcVwiOlwi4omnXCIsXCJnZXFzbGFudFwiOlwi4qm+XCIsXCJnZXNjY1wiOlwi4qqpXCIsXCJnZXNcIjpcIuKpvlwiLFwiZ2VzZG90XCI6XCLiqoBcIixcImdlc2RvdG9cIjpcIuKqglwiLFwiZ2VzZG90b2xcIjpcIuKqhFwiLFwiZ2VzbFwiOlwi4oub77iAXCIsXCJnZXNsZXNcIjpcIuKqlFwiLFwiR2ZyXCI6XCLwnZSKXCIsXCJnZnJcIjpcIvCdlKRcIixcImdnXCI6XCLiiatcIixcIkdnXCI6XCLii5lcIixcImdnZ1wiOlwi4ouZXCIsXCJnaW1lbFwiOlwi4oS3XCIsXCJHSmN5XCI6XCLQg1wiLFwiZ2pjeVwiOlwi0ZNcIixcImdsYVwiOlwi4qqlXCIsXCJnbFwiOlwi4om3XCIsXCJnbEVcIjpcIuKqklwiLFwiZ2xqXCI6XCLiqqRcIixcImduYXBcIjpcIuKqilwiLFwiZ25hcHByb3hcIjpcIuKqilwiLFwiZ25lXCI6XCLiqohcIixcImduRVwiOlwi4ompXCIsXCJnbmVxXCI6XCLiqohcIixcImduZXFxXCI6XCLiialcIixcImduc2ltXCI6XCLii6dcIixcIkdvcGZcIjpcIvCdlL5cIixcImdvcGZcIjpcIvCdlZhcIixcImdyYXZlXCI6XCJgXCIsXCJHcmVhdGVyRXF1YWxcIjpcIuKJpVwiLFwiR3JlYXRlckVxdWFsTGVzc1wiOlwi4oubXCIsXCJHcmVhdGVyRnVsbEVxdWFsXCI6XCLiiadcIixcIkdyZWF0ZXJHcmVhdGVyXCI6XCLiqqJcIixcIkdyZWF0ZXJMZXNzXCI6XCLiibdcIixcIkdyZWF0ZXJTbGFudEVxdWFsXCI6XCLiqb5cIixcIkdyZWF0ZXJUaWxkZVwiOlwi4omzXCIsXCJHc2NyXCI6XCLwnZKiXCIsXCJnc2NyXCI6XCLihIpcIixcImdzaW1cIjpcIuKJs1wiLFwiZ3NpbWVcIjpcIuKqjlwiLFwiZ3NpbWxcIjpcIuKqkFwiLFwiZ3RjY1wiOlwi4qqnXCIsXCJndGNpclwiOlwi4qm6XCIsXCJndFwiOlwiPlwiLFwiR1RcIjpcIj5cIixcIkd0XCI6XCLiiatcIixcImd0ZG90XCI6XCLii5dcIixcImd0bFBhclwiOlwi4qaVXCIsXCJndHF1ZXN0XCI6XCLiqbxcIixcImd0cmFwcHJveFwiOlwi4qqGXCIsXCJndHJhcnJcIjpcIuKluFwiLFwiZ3RyZG90XCI6XCLii5dcIixcImd0cmVxbGVzc1wiOlwi4oubXCIsXCJndHJlcXFsZXNzXCI6XCLiqoxcIixcImd0cmxlc3NcIjpcIuKJt1wiLFwiZ3Ryc2ltXCI6XCLiibNcIixcImd2ZXJ0bmVxcVwiOlwi4omp77iAXCIsXCJndm5FXCI6XCLiianvuIBcIixcIkhhY2VrXCI6XCLLh1wiLFwiaGFpcnNwXCI6XCLigIpcIixcImhhbGZcIjpcIsK9XCIsXCJoYW1pbHRcIjpcIuKEi1wiLFwiSEFSRGN5XCI6XCLQqlwiLFwiaGFyZGN5XCI6XCLRilwiLFwiaGFycmNpclwiOlwi4qWIXCIsXCJoYXJyXCI6XCLihpRcIixcImhBcnJcIjpcIuKHlFwiLFwiaGFycndcIjpcIuKGrVwiLFwiSGF0XCI6XCJeXCIsXCJoYmFyXCI6XCLihI9cIixcIkhjaXJjXCI6XCLEpFwiLFwiaGNpcmNcIjpcIsSlXCIsXCJoZWFydHNcIjpcIuKZpVwiLFwiaGVhcnRzdWl0XCI6XCLimaVcIixcImhlbGxpcFwiOlwi4oCmXCIsXCJoZXJjb25cIjpcIuKKuVwiLFwiaGZyXCI6XCLwnZSlXCIsXCJIZnJcIjpcIuKEjFwiLFwiSGlsYmVydFNwYWNlXCI6XCLihItcIixcImhrc2Vhcm93XCI6XCLipKVcIixcImhrc3dhcm93XCI6XCLipKZcIixcImhvYXJyXCI6XCLih79cIixcImhvbXRodFwiOlwi4oi7XCIsXCJob29rbGVmdGFycm93XCI6XCLihqlcIixcImhvb2tyaWdodGFycm93XCI6XCLihqpcIixcImhvcGZcIjpcIvCdlZlcIixcIkhvcGZcIjpcIuKEjVwiLFwiaG9yYmFyXCI6XCLigJVcIixcIkhvcml6b250YWxMaW5lXCI6XCLilIBcIixcImhzY3JcIjpcIvCdkr1cIixcIkhzY3JcIjpcIuKEi1wiLFwiaHNsYXNoXCI6XCLihI9cIixcIkhzdHJva1wiOlwixKZcIixcImhzdHJva1wiOlwixKdcIixcIkh1bXBEb3duSHVtcFwiOlwi4omOXCIsXCJIdW1wRXF1YWxcIjpcIuKJj1wiLFwiaHlidWxsXCI6XCLigYNcIixcImh5cGhlblwiOlwi4oCQXCIsXCJJYWN1dGVcIjpcIsONXCIsXCJpYWN1dGVcIjpcIsOtXCIsXCJpY1wiOlwi4oGjXCIsXCJJY2lyY1wiOlwiw45cIixcImljaXJjXCI6XCLDrlwiLFwiSWN5XCI6XCLQmFwiLFwiaWN5XCI6XCLQuFwiLFwiSWRvdFwiOlwixLBcIixcIklFY3lcIjpcItCVXCIsXCJpZWN5XCI6XCLQtVwiLFwiaWV4Y2xcIjpcIsKhXCIsXCJpZmZcIjpcIuKHlFwiLFwiaWZyXCI6XCLwnZSmXCIsXCJJZnJcIjpcIuKEkVwiLFwiSWdyYXZlXCI6XCLDjFwiLFwiaWdyYXZlXCI6XCLDrFwiLFwiaWlcIjpcIuKFiFwiLFwiaWlpaW50XCI6XCLiqIxcIixcImlpaW50XCI6XCLiiK1cIixcImlpbmZpblwiOlwi4qecXCIsXCJpaW90YVwiOlwi4oSpXCIsXCJJSmxpZ1wiOlwixLJcIixcImlqbGlnXCI6XCLEs1wiLFwiSW1hY3JcIjpcIsSqXCIsXCJpbWFjclwiOlwixKtcIixcImltYWdlXCI6XCLihJFcIixcIkltYWdpbmFyeUlcIjpcIuKFiFwiLFwiaW1hZ2xpbmVcIjpcIuKEkFwiLFwiaW1hZ3BhcnRcIjpcIuKEkVwiLFwiaW1hdGhcIjpcIsSxXCIsXCJJbVwiOlwi4oSRXCIsXCJpbW9mXCI6XCLiirdcIixcImltcGVkXCI6XCLGtVwiLFwiSW1wbGllc1wiOlwi4oeSXCIsXCJpbmNhcmVcIjpcIuKEhVwiLFwiaW5cIjpcIuKIiFwiLFwiaW5maW5cIjpcIuKInlwiLFwiaW5maW50aWVcIjpcIuKnnVwiLFwiaW5vZG90XCI6XCLEsVwiLFwiaW50Y2FsXCI6XCLiirpcIixcImludFwiOlwi4oirXCIsXCJJbnRcIjpcIuKIrFwiLFwiaW50ZWdlcnNcIjpcIuKEpFwiLFwiSW50ZWdyYWxcIjpcIuKIq1wiLFwiaW50ZXJjYWxcIjpcIuKKulwiLFwiSW50ZXJzZWN0aW9uXCI6XCLii4JcIixcImludGxhcmhrXCI6XCLiqJdcIixcImludHByb2RcIjpcIuKovFwiLFwiSW52aXNpYmxlQ29tbWFcIjpcIuKBo1wiLFwiSW52aXNpYmxlVGltZXNcIjpcIuKBolwiLFwiSU9jeVwiOlwi0IFcIixcImlvY3lcIjpcItGRXCIsXCJJb2dvblwiOlwixK5cIixcImlvZ29uXCI6XCLEr1wiLFwiSW9wZlwiOlwi8J2VgFwiLFwiaW9wZlwiOlwi8J2VmlwiLFwiSW90YVwiOlwizplcIixcImlvdGFcIjpcIs65XCIsXCJpcHJvZFwiOlwi4qi8XCIsXCJpcXVlc3RcIjpcIsK/XCIsXCJpc2NyXCI6XCLwnZK+XCIsXCJJc2NyXCI6XCLihJBcIixcImlzaW5cIjpcIuKIiFwiLFwiaXNpbmRvdFwiOlwi4ou1XCIsXCJpc2luRVwiOlwi4ou5XCIsXCJpc2luc1wiOlwi4ou0XCIsXCJpc2luc3ZcIjpcIuKLs1wiLFwiaXNpbnZcIjpcIuKIiFwiLFwiaXRcIjpcIuKBolwiLFwiSXRpbGRlXCI6XCLEqFwiLFwiaXRpbGRlXCI6XCLEqVwiLFwiSXVrY3lcIjpcItCGXCIsXCJpdWtjeVwiOlwi0ZZcIixcIkl1bWxcIjpcIsOPXCIsXCJpdW1sXCI6XCLDr1wiLFwiSmNpcmNcIjpcIsS0XCIsXCJqY2lyY1wiOlwixLVcIixcIkpjeVwiOlwi0JlcIixcImpjeVwiOlwi0LlcIixcIkpmclwiOlwi8J2UjVwiLFwiamZyXCI6XCLwnZSnXCIsXCJqbWF0aFwiOlwiyLdcIixcIkpvcGZcIjpcIvCdlYFcIixcImpvcGZcIjpcIvCdlZtcIixcIkpzY3JcIjpcIvCdkqVcIixcImpzY3JcIjpcIvCdkr9cIixcIkpzZXJjeVwiOlwi0IhcIixcImpzZXJjeVwiOlwi0ZhcIixcIkp1a2N5XCI6XCLQhFwiLFwianVrY3lcIjpcItGUXCIsXCJLYXBwYVwiOlwizppcIixcImthcHBhXCI6XCLOulwiLFwia2FwcGF2XCI6XCLPsFwiLFwiS2NlZGlsXCI6XCLEtlwiLFwia2NlZGlsXCI6XCLEt1wiLFwiS2N5XCI6XCLQmlwiLFwia2N5XCI6XCLQulwiLFwiS2ZyXCI6XCLwnZSOXCIsXCJrZnJcIjpcIvCdlKhcIixcImtncmVlblwiOlwixLhcIixcIktIY3lcIjpcItClXCIsXCJraGN5XCI6XCLRhVwiLFwiS0pjeVwiOlwi0IxcIixcImtqY3lcIjpcItGcXCIsXCJLb3BmXCI6XCLwnZWCXCIsXCJrb3BmXCI6XCLwnZWcXCIsXCJLc2NyXCI6XCLwnZKmXCIsXCJrc2NyXCI6XCLwnZOAXCIsXCJsQWFyclwiOlwi4oeaXCIsXCJMYWN1dGVcIjpcIsS5XCIsXCJsYWN1dGVcIjpcIsS6XCIsXCJsYWVtcHR5dlwiOlwi4qa0XCIsXCJsYWdyYW5cIjpcIuKEklwiLFwiTGFtYmRhXCI6XCLOm1wiLFwibGFtYmRhXCI6XCLOu1wiLFwibGFuZ1wiOlwi4p+oXCIsXCJMYW5nXCI6XCLin6pcIixcImxhbmdkXCI6XCLippFcIixcImxhbmdsZVwiOlwi4p+oXCIsXCJsYXBcIjpcIuKqhVwiLFwiTGFwbGFjZXRyZlwiOlwi4oSSXCIsXCJsYXF1b1wiOlwiwqtcIixcImxhcnJiXCI6XCLih6RcIixcImxhcnJiZnNcIjpcIuKkn1wiLFwibGFyclwiOlwi4oaQXCIsXCJMYXJyXCI6XCLihp5cIixcImxBcnJcIjpcIuKHkFwiLFwibGFycmZzXCI6XCLipJ1cIixcImxhcnJoa1wiOlwi4oapXCIsXCJsYXJybHBcIjpcIuKGq1wiLFwibGFycnBsXCI6XCLipLlcIixcImxhcnJzaW1cIjpcIuKls1wiLFwibGFycnRsXCI6XCLihqJcIixcImxhdGFpbFwiOlwi4qSZXCIsXCJsQXRhaWxcIjpcIuKkm1wiLFwibGF0XCI6XCLiqqtcIixcImxhdGVcIjpcIuKqrVwiLFwibGF0ZXNcIjpcIuKqre+4gFwiLFwibGJhcnJcIjpcIuKkjFwiLFwibEJhcnJcIjpcIuKkjlwiLFwibGJicmtcIjpcIuKdslwiLFwibGJyYWNlXCI6XCJ7XCIsXCJsYnJhY2tcIjpcIltcIixcImxicmtlXCI6XCLipotcIixcImxicmtzbGRcIjpcIuKmj1wiLFwibGJya3NsdVwiOlwi4qaNXCIsXCJMY2Fyb25cIjpcIsS9XCIsXCJsY2Fyb25cIjpcIsS+XCIsXCJMY2VkaWxcIjpcIsS7XCIsXCJsY2VkaWxcIjpcIsS8XCIsXCJsY2VpbFwiOlwi4oyIXCIsXCJsY3ViXCI6XCJ7XCIsXCJMY3lcIjpcItCbXCIsXCJsY3lcIjpcItC7XCIsXCJsZGNhXCI6XCLipLZcIixcImxkcXVvXCI6XCLigJxcIixcImxkcXVvclwiOlwi4oCeXCIsXCJsZHJkaGFyXCI6XCLipadcIixcImxkcnVzaGFyXCI6XCLipYtcIixcImxkc2hcIjpcIuKGslwiLFwibGVcIjpcIuKJpFwiLFwibEVcIjpcIuKJplwiLFwiTGVmdEFuZ2xlQnJhY2tldFwiOlwi4p+oXCIsXCJMZWZ0QXJyb3dCYXJcIjpcIuKHpFwiLFwibGVmdGFycm93XCI6XCLihpBcIixcIkxlZnRBcnJvd1wiOlwi4oaQXCIsXCJMZWZ0YXJyb3dcIjpcIuKHkFwiLFwiTGVmdEFycm93UmlnaHRBcnJvd1wiOlwi4oeGXCIsXCJsZWZ0YXJyb3d0YWlsXCI6XCLihqJcIixcIkxlZnRDZWlsaW5nXCI6XCLijIhcIixcIkxlZnREb3VibGVCcmFja2V0XCI6XCLin6ZcIixcIkxlZnREb3duVGVlVmVjdG9yXCI6XCLipaFcIixcIkxlZnREb3duVmVjdG9yQmFyXCI6XCLipZlcIixcIkxlZnREb3duVmVjdG9yXCI6XCLih4NcIixcIkxlZnRGbG9vclwiOlwi4oyKXCIsXCJsZWZ0aGFycG9vbmRvd25cIjpcIuKGvVwiLFwibGVmdGhhcnBvb251cFwiOlwi4oa8XCIsXCJsZWZ0bGVmdGFycm93c1wiOlwi4oeHXCIsXCJsZWZ0cmlnaHRhcnJvd1wiOlwi4oaUXCIsXCJMZWZ0UmlnaHRBcnJvd1wiOlwi4oaUXCIsXCJMZWZ0cmlnaHRhcnJvd1wiOlwi4oeUXCIsXCJsZWZ0cmlnaHRhcnJvd3NcIjpcIuKHhlwiLFwibGVmdHJpZ2h0aGFycG9vbnNcIjpcIuKHi1wiLFwibGVmdHJpZ2h0c3F1aWdhcnJvd1wiOlwi4oatXCIsXCJMZWZ0UmlnaHRWZWN0b3JcIjpcIuKljlwiLFwiTGVmdFRlZUFycm93XCI6XCLihqRcIixcIkxlZnRUZWVcIjpcIuKKo1wiLFwiTGVmdFRlZVZlY3RvclwiOlwi4qWaXCIsXCJsZWZ0dGhyZWV0aW1lc1wiOlwi4ouLXCIsXCJMZWZ0VHJpYW5nbGVCYXJcIjpcIuKnj1wiLFwiTGVmdFRyaWFuZ2xlXCI6XCLiirJcIixcIkxlZnRUcmlhbmdsZUVxdWFsXCI6XCLiirRcIixcIkxlZnRVcERvd25WZWN0b3JcIjpcIuKlkVwiLFwiTGVmdFVwVGVlVmVjdG9yXCI6XCLipaBcIixcIkxlZnRVcFZlY3RvckJhclwiOlwi4qWYXCIsXCJMZWZ0VXBWZWN0b3JcIjpcIuKGv1wiLFwiTGVmdFZlY3RvckJhclwiOlwi4qWSXCIsXCJMZWZ0VmVjdG9yXCI6XCLihrxcIixcImxFZ1wiOlwi4qqLXCIsXCJsZWdcIjpcIuKLmlwiLFwibGVxXCI6XCLiiaRcIixcImxlcXFcIjpcIuKJplwiLFwibGVxc2xhbnRcIjpcIuKpvVwiLFwibGVzY2NcIjpcIuKqqFwiLFwibGVzXCI6XCLiqb1cIixcImxlc2RvdFwiOlwi4qm/XCIsXCJsZXNkb3RvXCI6XCLiqoFcIixcImxlc2RvdG9yXCI6XCLiqoNcIixcImxlc2dcIjpcIuKLmu+4gFwiLFwibGVzZ2VzXCI6XCLiqpNcIixcImxlc3NhcHByb3hcIjpcIuKqhVwiLFwibGVzc2RvdFwiOlwi4ouWXCIsXCJsZXNzZXFndHJcIjpcIuKLmlwiLFwibGVzc2VxcWd0clwiOlwi4qqLXCIsXCJMZXNzRXF1YWxHcmVhdGVyXCI6XCLii5pcIixcIkxlc3NGdWxsRXF1YWxcIjpcIuKJplwiLFwiTGVzc0dyZWF0ZXJcIjpcIuKJtlwiLFwibGVzc2d0clwiOlwi4om2XCIsXCJMZXNzTGVzc1wiOlwi4qqhXCIsXCJsZXNzc2ltXCI6XCLiibJcIixcIkxlc3NTbGFudEVxdWFsXCI6XCLiqb1cIixcIkxlc3NUaWxkZVwiOlwi4omyXCIsXCJsZmlzaHRcIjpcIuKlvFwiLFwibGZsb29yXCI6XCLijIpcIixcIkxmclwiOlwi8J2Uj1wiLFwibGZyXCI6XCLwnZSpXCIsXCJsZ1wiOlwi4om2XCIsXCJsZ0VcIjpcIuKqkVwiLFwibEhhclwiOlwi4qWiXCIsXCJsaGFyZFwiOlwi4oa9XCIsXCJsaGFydVwiOlwi4oa8XCIsXCJsaGFydWxcIjpcIuKlqlwiLFwibGhibGtcIjpcIuKWhFwiLFwiTEpjeVwiOlwi0IlcIixcImxqY3lcIjpcItGZXCIsXCJsbGFyclwiOlwi4oeHXCIsXCJsbFwiOlwi4omqXCIsXCJMbFwiOlwi4ouYXCIsXCJsbGNvcm5lclwiOlwi4oyeXCIsXCJMbGVmdGFycm93XCI6XCLih5pcIixcImxsaGFyZFwiOlwi4qWrXCIsXCJsbHRyaVwiOlwi4pe6XCIsXCJMbWlkb3RcIjpcIsS/XCIsXCJsbWlkb3RcIjpcIsWAXCIsXCJsbW91c3RhY2hlXCI6XCLijrBcIixcImxtb3VzdFwiOlwi4o6wXCIsXCJsbmFwXCI6XCLiqolcIixcImxuYXBwcm94XCI6XCLiqolcIixcImxuZVwiOlwi4qqHXCIsXCJsbkVcIjpcIuKJqFwiLFwibG5lcVwiOlwi4qqHXCIsXCJsbmVxcVwiOlwi4omoXCIsXCJsbnNpbVwiOlwi4oumXCIsXCJsb2FuZ1wiOlwi4p+sXCIsXCJsb2FyclwiOlwi4oe9XCIsXCJsb2Jya1wiOlwi4p+mXCIsXCJsb25nbGVmdGFycm93XCI6XCLin7VcIixcIkxvbmdMZWZ0QXJyb3dcIjpcIuKftVwiLFwiTG9uZ2xlZnRhcnJvd1wiOlwi4p+4XCIsXCJsb25nbGVmdHJpZ2h0YXJyb3dcIjpcIuKft1wiLFwiTG9uZ0xlZnRSaWdodEFycm93XCI6XCLin7dcIixcIkxvbmdsZWZ0cmlnaHRhcnJvd1wiOlwi4p+6XCIsXCJsb25nbWFwc3RvXCI6XCLin7xcIixcImxvbmdyaWdodGFycm93XCI6XCLin7ZcIixcIkxvbmdSaWdodEFycm93XCI6XCLin7ZcIixcIkxvbmdyaWdodGFycm93XCI6XCLin7lcIixcImxvb3BhcnJvd2xlZnRcIjpcIuKGq1wiLFwibG9vcGFycm93cmlnaHRcIjpcIuKGrFwiLFwibG9wYXJcIjpcIuKmhVwiLFwiTG9wZlwiOlwi8J2Vg1wiLFwibG9wZlwiOlwi8J2VnVwiLFwibG9wbHVzXCI6XCLiqK1cIixcImxvdGltZXNcIjpcIuKotFwiLFwibG93YXN0XCI6XCLiiJdcIixcImxvd2JhclwiOlwiX1wiLFwiTG93ZXJMZWZ0QXJyb3dcIjpcIuKGmVwiLFwiTG93ZXJSaWdodEFycm93XCI6XCLihphcIixcImxvelwiOlwi4peKXCIsXCJsb3plbmdlXCI6XCLil4pcIixcImxvemZcIjpcIuKnq1wiLFwibHBhclwiOlwiKFwiLFwibHBhcmx0XCI6XCLippNcIixcImxyYXJyXCI6XCLih4ZcIixcImxyY29ybmVyXCI6XCLijJ9cIixcImxyaGFyXCI6XCLih4tcIixcImxyaGFyZFwiOlwi4qWtXCIsXCJscm1cIjpcIuKAjlwiLFwibHJ0cmlcIjpcIuKKv1wiLFwibHNhcXVvXCI6XCLigLlcIixcImxzY3JcIjpcIvCdk4FcIixcIkxzY3JcIjpcIuKEklwiLFwibHNoXCI6XCLihrBcIixcIkxzaFwiOlwi4oawXCIsXCJsc2ltXCI6XCLiibJcIixcImxzaW1lXCI6XCLiqo1cIixcImxzaW1nXCI6XCLiqo9cIixcImxzcWJcIjpcIltcIixcImxzcXVvXCI6XCLigJhcIixcImxzcXVvclwiOlwi4oCaXCIsXCJMc3Ryb2tcIjpcIsWBXCIsXCJsc3Ryb2tcIjpcIsWCXCIsXCJsdGNjXCI6XCLiqqZcIixcImx0Y2lyXCI6XCLiqblcIixcImx0XCI6XCI8XCIsXCJMVFwiOlwiPFwiLFwiTHRcIjpcIuKJqlwiLFwibHRkb3RcIjpcIuKLllwiLFwibHRocmVlXCI6XCLii4tcIixcImx0aW1lc1wiOlwi4ouJXCIsXCJsdGxhcnJcIjpcIuKltlwiLFwibHRxdWVzdFwiOlwi4qm7XCIsXCJsdHJpXCI6XCLil4NcIixcImx0cmllXCI6XCLiirRcIixcImx0cmlmXCI6XCLil4JcIixcImx0clBhclwiOlwi4qaWXCIsXCJsdXJkc2hhclwiOlwi4qWKXCIsXCJsdXJ1aGFyXCI6XCLipaZcIixcImx2ZXJ0bmVxcVwiOlwi4omo77iAXCIsXCJsdm5FXCI6XCLiiajvuIBcIixcIm1hY3JcIjpcIsKvXCIsXCJtYWxlXCI6XCLimYJcIixcIm1hbHRcIjpcIuKcoFwiLFwibWFsdGVzZVwiOlwi4pygXCIsXCJNYXBcIjpcIuKkhVwiLFwibWFwXCI6XCLihqZcIixcIm1hcHN0b1wiOlwi4oamXCIsXCJtYXBzdG9kb3duXCI6XCLihqdcIixcIm1hcHN0b2xlZnRcIjpcIuKGpFwiLFwibWFwc3RvdXBcIjpcIuKGpVwiLFwibWFya2VyXCI6XCLilq5cIixcIm1jb21tYVwiOlwi4qipXCIsXCJNY3lcIjpcItCcXCIsXCJtY3lcIjpcItC8XCIsXCJtZGFzaFwiOlwi4oCUXCIsXCJtRERvdFwiOlwi4oi6XCIsXCJtZWFzdXJlZGFuZ2xlXCI6XCLiiKFcIixcIk1lZGl1bVNwYWNlXCI6XCLigZ9cIixcIk1lbGxpbnRyZlwiOlwi4oSzXCIsXCJNZnJcIjpcIvCdlJBcIixcIm1mclwiOlwi8J2UqlwiLFwibWhvXCI6XCLihKdcIixcIm1pY3JvXCI6XCLCtVwiLFwibWlkYXN0XCI6XCIqXCIsXCJtaWRjaXJcIjpcIuKrsFwiLFwibWlkXCI6XCLiiKNcIixcIm1pZGRvdFwiOlwiwrdcIixcIm1pbnVzYlwiOlwi4oqfXCIsXCJtaW51c1wiOlwi4oiSXCIsXCJtaW51c2RcIjpcIuKIuFwiLFwibWludXNkdVwiOlwi4qiqXCIsXCJNaW51c1BsdXNcIjpcIuKIk1wiLFwibWxjcFwiOlwi4qubXCIsXCJtbGRyXCI6XCLigKZcIixcIm1ucGx1c1wiOlwi4oiTXCIsXCJtb2RlbHNcIjpcIuKKp1wiLFwiTW9wZlwiOlwi8J2VhFwiLFwibW9wZlwiOlwi8J2VnlwiLFwibXBcIjpcIuKIk1wiLFwibXNjclwiOlwi8J2TglwiLFwiTXNjclwiOlwi4oSzXCIsXCJtc3Rwb3NcIjpcIuKIvlwiLFwiTXVcIjpcIs6cXCIsXCJtdVwiOlwizrxcIixcIm11bHRpbWFwXCI6XCLiirhcIixcIm11bWFwXCI6XCLiirhcIixcIm5hYmxhXCI6XCLiiIdcIixcIk5hY3V0ZVwiOlwixYNcIixcIm5hY3V0ZVwiOlwixYRcIixcIm5hbmdcIjpcIuKIoOKDklwiLFwibmFwXCI6XCLiiYlcIixcIm5hcEVcIjpcIuKpsMy4XCIsXCJuYXBpZFwiOlwi4omLzLhcIixcIm5hcG9zXCI6XCLFiVwiLFwibmFwcHJveFwiOlwi4omJXCIsXCJuYXR1cmFsXCI6XCLima5cIixcIm5hdHVyYWxzXCI6XCLihJVcIixcIm5hdHVyXCI6XCLima5cIixcIm5ic3BcIjpcIsKgXCIsXCJuYnVtcFwiOlwi4omOzLhcIixcIm5idW1wZVwiOlwi4omPzLhcIixcIm5jYXBcIjpcIuKpg1wiLFwiTmNhcm9uXCI6XCLFh1wiLFwibmNhcm9uXCI6XCLFiFwiLFwiTmNlZGlsXCI6XCLFhVwiLFwibmNlZGlsXCI6XCLFhlwiLFwibmNvbmdcIjpcIuKJh1wiLFwibmNvbmdkb3RcIjpcIuKprcy4XCIsXCJuY3VwXCI6XCLiqYJcIixcIk5jeVwiOlwi0J1cIixcIm5jeVwiOlwi0L1cIixcIm5kYXNoXCI6XCLigJNcIixcIm5lYXJoa1wiOlwi4qSkXCIsXCJuZWFyclwiOlwi4oaXXCIsXCJuZUFyclwiOlwi4oeXXCIsXCJuZWFycm93XCI6XCLihpdcIixcIm5lXCI6XCLiiaBcIixcIm5lZG90XCI6XCLiiZDMuFwiLFwiTmVnYXRpdmVNZWRpdW1TcGFjZVwiOlwi4oCLXCIsXCJOZWdhdGl2ZVRoaWNrU3BhY2VcIjpcIuKAi1wiLFwiTmVnYXRpdmVUaGluU3BhY2VcIjpcIuKAi1wiLFwiTmVnYXRpdmVWZXJ5VGhpblNwYWNlXCI6XCLigItcIixcIm5lcXVpdlwiOlwi4omiXCIsXCJuZXNlYXJcIjpcIuKkqFwiLFwibmVzaW1cIjpcIuKJgsy4XCIsXCJOZXN0ZWRHcmVhdGVyR3JlYXRlclwiOlwi4omrXCIsXCJOZXN0ZWRMZXNzTGVzc1wiOlwi4omqXCIsXCJOZXdMaW5lXCI6XCJcXG5cIixcIm5leGlzdFwiOlwi4oiEXCIsXCJuZXhpc3RzXCI6XCLiiIRcIixcIk5mclwiOlwi8J2UkVwiLFwibmZyXCI6XCLwnZSrXCIsXCJuZ0VcIjpcIuKJp8y4XCIsXCJuZ2VcIjpcIuKJsVwiLFwibmdlcVwiOlwi4omxXCIsXCJuZ2VxcVwiOlwi4omnzLhcIixcIm5nZXFzbGFudFwiOlwi4qm+zLhcIixcIm5nZXNcIjpcIuKpvsy4XCIsXCJuR2dcIjpcIuKLmcy4XCIsXCJuZ3NpbVwiOlwi4om1XCIsXCJuR3RcIjpcIuKJq+KDklwiLFwibmd0XCI6XCLiia9cIixcIm5ndHJcIjpcIuKJr1wiLFwibkd0dlwiOlwi4omrzLhcIixcIm5oYXJyXCI6XCLihq5cIixcIm5oQXJyXCI6XCLih45cIixcIm5ocGFyXCI6XCLiq7JcIixcIm5pXCI6XCLiiItcIixcIm5pc1wiOlwi4ou8XCIsXCJuaXNkXCI6XCLii7pcIixcIm5pdlwiOlwi4oiLXCIsXCJOSmN5XCI6XCLQilwiLFwibmpjeVwiOlwi0ZpcIixcIm5sYXJyXCI6XCLihppcIixcIm5sQXJyXCI6XCLih41cIixcIm5sZHJcIjpcIuKApVwiLFwibmxFXCI6XCLiiabMuFwiLFwibmxlXCI6XCLiibBcIixcIm5sZWZ0YXJyb3dcIjpcIuKGmlwiLFwibkxlZnRhcnJvd1wiOlwi4oeNXCIsXCJubGVmdHJpZ2h0YXJyb3dcIjpcIuKGrlwiLFwibkxlZnRyaWdodGFycm93XCI6XCLih45cIixcIm5sZXFcIjpcIuKJsFwiLFwibmxlcXFcIjpcIuKJpsy4XCIsXCJubGVxc2xhbnRcIjpcIuKpvcy4XCIsXCJubGVzXCI6XCLiqb3MuFwiLFwibmxlc3NcIjpcIuKJrlwiLFwibkxsXCI6XCLii5jMuFwiLFwibmxzaW1cIjpcIuKJtFwiLFwibkx0XCI6XCLiiarig5JcIixcIm5sdFwiOlwi4omuXCIsXCJubHRyaVwiOlwi4ouqXCIsXCJubHRyaWVcIjpcIuKLrFwiLFwibkx0dlwiOlwi4omqzLhcIixcIm5taWRcIjpcIuKIpFwiLFwiTm9CcmVha1wiOlwi4oGgXCIsXCJOb25CcmVha2luZ1NwYWNlXCI6XCLCoFwiLFwibm9wZlwiOlwi8J2Vn1wiLFwiTm9wZlwiOlwi4oSVXCIsXCJOb3RcIjpcIuKrrFwiLFwibm90XCI6XCLCrFwiLFwiTm90Q29uZ3J1ZW50XCI6XCLiiaJcIixcIk5vdEN1cENhcFwiOlwi4omtXCIsXCJOb3REb3VibGVWZXJ0aWNhbEJhclwiOlwi4oimXCIsXCJOb3RFbGVtZW50XCI6XCLiiIlcIixcIk5vdEVxdWFsXCI6XCLiiaBcIixcIk5vdEVxdWFsVGlsZGVcIjpcIuKJgsy4XCIsXCJOb3RFeGlzdHNcIjpcIuKIhFwiLFwiTm90R3JlYXRlclwiOlwi4omvXCIsXCJOb3RHcmVhdGVyRXF1YWxcIjpcIuKJsVwiLFwiTm90R3JlYXRlckZ1bGxFcXVhbFwiOlwi4omnzLhcIixcIk5vdEdyZWF0ZXJHcmVhdGVyXCI6XCLiiavMuFwiLFwiTm90R3JlYXRlckxlc3NcIjpcIuKJuVwiLFwiTm90R3JlYXRlclNsYW50RXF1YWxcIjpcIuKpvsy4XCIsXCJOb3RHcmVhdGVyVGlsZGVcIjpcIuKJtVwiLFwiTm90SHVtcERvd25IdW1wXCI6XCLiiY7MuFwiLFwiTm90SHVtcEVxdWFsXCI6XCLiiY/MuFwiLFwibm90aW5cIjpcIuKIiVwiLFwibm90aW5kb3RcIjpcIuKLtcy4XCIsXCJub3RpbkVcIjpcIuKLucy4XCIsXCJub3RpbnZhXCI6XCLiiIlcIixcIm5vdGludmJcIjpcIuKLt1wiLFwibm90aW52Y1wiOlwi4ou2XCIsXCJOb3RMZWZ0VHJpYW5nbGVCYXJcIjpcIuKnj8y4XCIsXCJOb3RMZWZ0VHJpYW5nbGVcIjpcIuKLqlwiLFwiTm90TGVmdFRyaWFuZ2xlRXF1YWxcIjpcIuKLrFwiLFwiTm90TGVzc1wiOlwi4omuXCIsXCJOb3RMZXNzRXF1YWxcIjpcIuKJsFwiLFwiTm90TGVzc0dyZWF0ZXJcIjpcIuKJuFwiLFwiTm90TGVzc0xlc3NcIjpcIuKJqsy4XCIsXCJOb3RMZXNzU2xhbnRFcXVhbFwiOlwi4qm9zLhcIixcIk5vdExlc3NUaWxkZVwiOlwi4om0XCIsXCJOb3ROZXN0ZWRHcmVhdGVyR3JlYXRlclwiOlwi4qqizLhcIixcIk5vdE5lc3RlZExlc3NMZXNzXCI6XCLiqqHMuFwiLFwibm90bmlcIjpcIuKIjFwiLFwibm90bml2YVwiOlwi4oiMXCIsXCJub3RuaXZiXCI6XCLii75cIixcIm5vdG5pdmNcIjpcIuKLvVwiLFwiTm90UHJlY2VkZXNcIjpcIuKKgFwiLFwiTm90UHJlY2VkZXNFcXVhbFwiOlwi4qqvzLhcIixcIk5vdFByZWNlZGVzU2xhbnRFcXVhbFwiOlwi4ougXCIsXCJOb3RSZXZlcnNlRWxlbWVudFwiOlwi4oiMXCIsXCJOb3RSaWdodFRyaWFuZ2xlQmFyXCI6XCLip5DMuFwiLFwiTm90UmlnaHRUcmlhbmdsZVwiOlwi4ourXCIsXCJOb3RSaWdodFRyaWFuZ2xlRXF1YWxcIjpcIuKLrVwiLFwiTm90U3F1YXJlU3Vic2V0XCI6XCLiio/MuFwiLFwiTm90U3F1YXJlU3Vic2V0RXF1YWxcIjpcIuKLolwiLFwiTm90U3F1YXJlU3VwZXJzZXRcIjpcIuKKkMy4XCIsXCJOb3RTcXVhcmVTdXBlcnNldEVxdWFsXCI6XCLii6NcIixcIk5vdFN1YnNldFwiOlwi4oqC4oOSXCIsXCJOb3RTdWJzZXRFcXVhbFwiOlwi4oqIXCIsXCJOb3RTdWNjZWVkc1wiOlwi4oqBXCIsXCJOb3RTdWNjZWVkc0VxdWFsXCI6XCLiqrDMuFwiLFwiTm90U3VjY2VlZHNTbGFudEVxdWFsXCI6XCLii6FcIixcIk5vdFN1Y2NlZWRzVGlsZGVcIjpcIuKJv8y4XCIsXCJOb3RTdXBlcnNldFwiOlwi4oqD4oOSXCIsXCJOb3RTdXBlcnNldEVxdWFsXCI6XCLiiolcIixcIk5vdFRpbGRlXCI6XCLiiYFcIixcIk5vdFRpbGRlRXF1YWxcIjpcIuKJhFwiLFwiTm90VGlsZGVGdWxsRXF1YWxcIjpcIuKJh1wiLFwiTm90VGlsZGVUaWxkZVwiOlwi4omJXCIsXCJOb3RWZXJ0aWNhbEJhclwiOlwi4oikXCIsXCJucGFyYWxsZWxcIjpcIuKIplwiLFwibnBhclwiOlwi4oimXCIsXCJucGFyc2xcIjpcIuKrveKDpVwiLFwibnBhcnRcIjpcIuKIgsy4XCIsXCJucG9saW50XCI6XCLiqJRcIixcIm5wclwiOlwi4oqAXCIsXCJucHJjdWVcIjpcIuKLoFwiLFwibnByZWNcIjpcIuKKgFwiLFwibnByZWNlcVwiOlwi4qqvzLhcIixcIm5wcmVcIjpcIuKqr8y4XCIsXCJucmFycmNcIjpcIuKks8y4XCIsXCJucmFyclwiOlwi4oabXCIsXCJuckFyclwiOlwi4oePXCIsXCJucmFycndcIjpcIuKGncy4XCIsXCJucmlnaHRhcnJvd1wiOlwi4oabXCIsXCJuUmlnaHRhcnJvd1wiOlwi4oePXCIsXCJucnRyaVwiOlwi4ourXCIsXCJucnRyaWVcIjpcIuKLrVwiLFwibnNjXCI6XCLiioFcIixcIm5zY2N1ZVwiOlwi4ouhXCIsXCJuc2NlXCI6XCLiqrDMuFwiLFwiTnNjclwiOlwi8J2SqVwiLFwibnNjclwiOlwi8J2Tg1wiLFwibnNob3J0bWlkXCI6XCLiiKRcIixcIm5zaG9ydHBhcmFsbGVsXCI6XCLiiKZcIixcIm5zaW1cIjpcIuKJgVwiLFwibnNpbWVcIjpcIuKJhFwiLFwibnNpbWVxXCI6XCLiiYRcIixcIm5zbWlkXCI6XCLiiKRcIixcIm5zcGFyXCI6XCLiiKZcIixcIm5zcXN1YmVcIjpcIuKLolwiLFwibnNxc3VwZVwiOlwi4oujXCIsXCJuc3ViXCI6XCLiioRcIixcIm5zdWJFXCI6XCLiq4XMuFwiLFwibnN1YmVcIjpcIuKKiFwiLFwibnN1YnNldFwiOlwi4oqC4oOSXCIsXCJuc3Vic2V0ZXFcIjpcIuKKiFwiLFwibnN1YnNldGVxcVwiOlwi4quFzLhcIixcIm5zdWNjXCI6XCLiioFcIixcIm5zdWNjZXFcIjpcIuKqsMy4XCIsXCJuc3VwXCI6XCLiioVcIixcIm5zdXBFXCI6XCLiq4bMuFwiLFwibnN1cGVcIjpcIuKKiVwiLFwibnN1cHNldFwiOlwi4oqD4oOSXCIsXCJuc3Vwc2V0ZXFcIjpcIuKKiVwiLFwibnN1cHNldGVxcVwiOlwi4quGzLhcIixcIm50Z2xcIjpcIuKJuVwiLFwiTnRpbGRlXCI6XCLDkVwiLFwibnRpbGRlXCI6XCLDsVwiLFwibnRsZ1wiOlwi4om4XCIsXCJudHJpYW5nbGVsZWZ0XCI6XCLii6pcIixcIm50cmlhbmdsZWxlZnRlcVwiOlwi4ousXCIsXCJudHJpYW5nbGVyaWdodFwiOlwi4ourXCIsXCJudHJpYW5nbGVyaWdodGVxXCI6XCLii61cIixcIk51XCI6XCLOnVwiLFwibnVcIjpcIs69XCIsXCJudW1cIjpcIiNcIixcIm51bWVyb1wiOlwi4oSWXCIsXCJudW1zcFwiOlwi4oCHXCIsXCJudmFwXCI6XCLiiY3ig5JcIixcIm52ZGFzaFwiOlwi4oqsXCIsXCJudkRhc2hcIjpcIuKKrVwiLFwiblZkYXNoXCI6XCLiiq5cIixcIm5WRGFzaFwiOlwi4oqvXCIsXCJudmdlXCI6XCLiiaXig5JcIixcIm52Z3RcIjpcIj7ig5JcIixcIm52SGFyclwiOlwi4qSEXCIsXCJudmluZmluXCI6XCLip55cIixcIm52bEFyclwiOlwi4qSCXCIsXCJudmxlXCI6XCLiiaTig5JcIixcIm52bHRcIjpcIjzig5JcIixcIm52bHRyaWVcIjpcIuKKtOKDklwiLFwibnZyQXJyXCI6XCLipINcIixcIm52cnRyaWVcIjpcIuKKteKDklwiLFwibnZzaW1cIjpcIuKIvOKDklwiLFwibndhcmhrXCI6XCLipKNcIixcIm53YXJyXCI6XCLihpZcIixcIm53QXJyXCI6XCLih5ZcIixcIm53YXJyb3dcIjpcIuKGllwiLFwibnduZWFyXCI6XCLipKdcIixcIk9hY3V0ZVwiOlwiw5NcIixcIm9hY3V0ZVwiOlwiw7NcIixcIm9hc3RcIjpcIuKKm1wiLFwiT2NpcmNcIjpcIsOUXCIsXCJvY2lyY1wiOlwiw7RcIixcIm9jaXJcIjpcIuKKmlwiLFwiT2N5XCI6XCLQnlwiLFwib2N5XCI6XCLQvlwiLFwib2Rhc2hcIjpcIuKKnVwiLFwiT2RibGFjXCI6XCLFkFwiLFwib2RibGFjXCI6XCLFkVwiLFwib2RpdlwiOlwi4qi4XCIsXCJvZG90XCI6XCLiiplcIixcIm9kc29sZFwiOlwi4qa8XCIsXCJPRWxpZ1wiOlwixZJcIixcIm9lbGlnXCI6XCLFk1wiLFwib2ZjaXJcIjpcIuKmv1wiLFwiT2ZyXCI6XCLwnZSSXCIsXCJvZnJcIjpcIvCdlKxcIixcIm9nb25cIjpcIsubXCIsXCJPZ3JhdmVcIjpcIsOSXCIsXCJvZ3JhdmVcIjpcIsOyXCIsXCJvZ3RcIjpcIuKngVwiLFwib2hiYXJcIjpcIuKmtVwiLFwib2htXCI6XCLOqVwiLFwib2ludFwiOlwi4oiuXCIsXCJvbGFyclwiOlwi4oa6XCIsXCJvbGNpclwiOlwi4qa+XCIsXCJvbGNyb3NzXCI6XCLiprtcIixcIm9saW5lXCI6XCLigL5cIixcIm9sdFwiOlwi4qeAXCIsXCJPbWFjclwiOlwixYxcIixcIm9tYWNyXCI6XCLFjVwiLFwiT21lZ2FcIjpcIs6pXCIsXCJvbWVnYVwiOlwiz4lcIixcIk9taWNyb25cIjpcIs6fXCIsXCJvbWljcm9uXCI6XCLOv1wiLFwib21pZFwiOlwi4qa2XCIsXCJvbWludXNcIjpcIuKKllwiLFwiT29wZlwiOlwi8J2VhlwiLFwib29wZlwiOlwi8J2VoFwiLFwib3BhclwiOlwi4qa3XCIsXCJPcGVuQ3VybHlEb3VibGVRdW90ZVwiOlwi4oCcXCIsXCJPcGVuQ3VybHlRdW90ZVwiOlwi4oCYXCIsXCJvcGVycFwiOlwi4qa5XCIsXCJvcGx1c1wiOlwi4oqVXCIsXCJvcmFyclwiOlwi4oa7XCIsXCJPclwiOlwi4qmUXCIsXCJvclwiOlwi4oioXCIsXCJvcmRcIjpcIuKpnVwiLFwib3JkZXJcIjpcIuKEtFwiLFwib3JkZXJvZlwiOlwi4oS0XCIsXCJvcmRmXCI6XCLCqlwiLFwib3JkbVwiOlwiwrpcIixcIm9yaWdvZlwiOlwi4oq2XCIsXCJvcm9yXCI6XCLiqZZcIixcIm9yc2xvcGVcIjpcIuKpl1wiLFwib3J2XCI6XCLiqZtcIixcIm9TXCI6XCLik4hcIixcIk9zY3JcIjpcIvCdkqpcIixcIm9zY3JcIjpcIuKEtFwiLFwiT3NsYXNoXCI6XCLDmFwiLFwib3NsYXNoXCI6XCLDuFwiLFwib3NvbFwiOlwi4oqYXCIsXCJPdGlsZGVcIjpcIsOVXCIsXCJvdGlsZGVcIjpcIsO1XCIsXCJvdGltZXNhc1wiOlwi4qi2XCIsXCJPdGltZXNcIjpcIuKot1wiLFwib3RpbWVzXCI6XCLiipdcIixcIk91bWxcIjpcIsOWXCIsXCJvdW1sXCI6XCLDtlwiLFwib3ZiYXJcIjpcIuKMvVwiLFwiT3ZlckJhclwiOlwi4oC+XCIsXCJPdmVyQnJhY2VcIjpcIuKPnlwiLFwiT3ZlckJyYWNrZXRcIjpcIuKOtFwiLFwiT3ZlclBhcmVudGhlc2lzXCI6XCLij5xcIixcInBhcmFcIjpcIsK2XCIsXCJwYXJhbGxlbFwiOlwi4oilXCIsXCJwYXJcIjpcIuKIpVwiLFwicGFyc2ltXCI6XCLiq7NcIixcInBhcnNsXCI6XCLiq71cIixcInBhcnRcIjpcIuKIglwiLFwiUGFydGlhbERcIjpcIuKIglwiLFwiUGN5XCI6XCLQn1wiLFwicGN5XCI6XCLQv1wiLFwicGVyY250XCI6XCIlXCIsXCJwZXJpb2RcIjpcIi5cIixcInBlcm1pbFwiOlwi4oCwXCIsXCJwZXJwXCI6XCLiiqVcIixcInBlcnRlbmtcIjpcIuKAsVwiLFwiUGZyXCI6XCLwnZSTXCIsXCJwZnJcIjpcIvCdlK1cIixcIlBoaVwiOlwizqZcIixcInBoaVwiOlwiz4ZcIixcInBoaXZcIjpcIs+VXCIsXCJwaG1tYXRcIjpcIuKEs1wiLFwicGhvbmVcIjpcIuKYjlwiLFwiUGlcIjpcIs6gXCIsXCJwaVwiOlwiz4BcIixcInBpdGNoZm9ya1wiOlwi4ouUXCIsXCJwaXZcIjpcIs+WXCIsXCJwbGFuY2tcIjpcIuKEj1wiLFwicGxhbmNraFwiOlwi4oSOXCIsXCJwbGFua3ZcIjpcIuKEj1wiLFwicGx1c2FjaXJcIjpcIuKoo1wiLFwicGx1c2JcIjpcIuKKnlwiLFwicGx1c2NpclwiOlwi4qiiXCIsXCJwbHVzXCI6XCIrXCIsXCJwbHVzZG9cIjpcIuKIlFwiLFwicGx1c2R1XCI6XCLiqKVcIixcInBsdXNlXCI6XCLiqbJcIixcIlBsdXNNaW51c1wiOlwiwrFcIixcInBsdXNtblwiOlwiwrFcIixcInBsdXNzaW1cIjpcIuKoplwiLFwicGx1c3R3b1wiOlwi4qinXCIsXCJwbVwiOlwiwrFcIixcIlBvaW5jYXJlcGxhbmVcIjpcIuKEjFwiLFwicG9pbnRpbnRcIjpcIuKolVwiLFwicG9wZlwiOlwi8J2VoVwiLFwiUG9wZlwiOlwi4oSZXCIsXCJwb3VuZFwiOlwiwqNcIixcInByYXBcIjpcIuKqt1wiLFwiUHJcIjpcIuKqu1wiLFwicHJcIjpcIuKJulwiLFwicHJjdWVcIjpcIuKJvFwiLFwicHJlY2FwcHJveFwiOlwi4qq3XCIsXCJwcmVjXCI6XCLiibpcIixcInByZWNjdXJseWVxXCI6XCLiibxcIixcIlByZWNlZGVzXCI6XCLiibpcIixcIlByZWNlZGVzRXF1YWxcIjpcIuKqr1wiLFwiUHJlY2VkZXNTbGFudEVxdWFsXCI6XCLiibxcIixcIlByZWNlZGVzVGlsZGVcIjpcIuKJvlwiLFwicHJlY2VxXCI6XCLiqq9cIixcInByZWNuYXBwcm94XCI6XCLiqrlcIixcInByZWNuZXFxXCI6XCLiqrVcIixcInByZWNuc2ltXCI6XCLii6hcIixcInByZVwiOlwi4qqvXCIsXCJwckVcIjpcIuKqs1wiLFwicHJlY3NpbVwiOlwi4om+XCIsXCJwcmltZVwiOlwi4oCyXCIsXCJQcmltZVwiOlwi4oCzXCIsXCJwcmltZXNcIjpcIuKEmVwiLFwicHJuYXBcIjpcIuKquVwiLFwicHJuRVwiOlwi4qq1XCIsXCJwcm5zaW1cIjpcIuKLqFwiLFwicHJvZFwiOlwi4oiPXCIsXCJQcm9kdWN0XCI6XCLiiI9cIixcInByb2ZhbGFyXCI6XCLijK5cIixcInByb2ZsaW5lXCI6XCLijJJcIixcInByb2ZzdXJmXCI6XCLijJNcIixcInByb3BcIjpcIuKInVwiLFwiUHJvcG9ydGlvbmFsXCI6XCLiiJ1cIixcIlByb3BvcnRpb25cIjpcIuKIt1wiLFwicHJvcHRvXCI6XCLiiJ1cIixcInByc2ltXCI6XCLiib5cIixcInBydXJlbFwiOlwi4oqwXCIsXCJQc2NyXCI6XCLwnZKrXCIsXCJwc2NyXCI6XCLwnZOFXCIsXCJQc2lcIjpcIs6oXCIsXCJwc2lcIjpcIs+IXCIsXCJwdW5jc3BcIjpcIuKAiFwiLFwiUWZyXCI6XCLwnZSUXCIsXCJxZnJcIjpcIvCdlK5cIixcInFpbnRcIjpcIuKojFwiLFwicW9wZlwiOlwi8J2VolwiLFwiUW9wZlwiOlwi4oSaXCIsXCJxcHJpbWVcIjpcIuKBl1wiLFwiUXNjclwiOlwi8J2SrFwiLFwicXNjclwiOlwi8J2ThlwiLFwicXVhdGVybmlvbnNcIjpcIuKEjVwiLFwicXVhdGludFwiOlwi4qiWXCIsXCJxdWVzdFwiOlwiP1wiLFwicXVlc3RlcVwiOlwi4omfXCIsXCJxdW90XCI6XCJcXFwiXCIsXCJRVU9UXCI6XCJcXFwiXCIsXCJyQWFyclwiOlwi4oebXCIsXCJyYWNlXCI6XCLiiL3MsVwiLFwiUmFjdXRlXCI6XCLFlFwiLFwicmFjdXRlXCI6XCLFlVwiLFwicmFkaWNcIjpcIuKImlwiLFwicmFlbXB0eXZcIjpcIuKms1wiLFwicmFuZ1wiOlwi4p+pXCIsXCJSYW5nXCI6XCLin6tcIixcInJhbmdkXCI6XCLippJcIixcInJhbmdlXCI6XCLipqVcIixcInJhbmdsZVwiOlwi4p+pXCIsXCJyYXF1b1wiOlwiwrtcIixcInJhcnJhcFwiOlwi4qW1XCIsXCJyYXJyYlwiOlwi4oelXCIsXCJyYXJyYmZzXCI6XCLipKBcIixcInJhcnJjXCI6XCLipLNcIixcInJhcnJcIjpcIuKGklwiLFwiUmFyclwiOlwi4oagXCIsXCJyQXJyXCI6XCLih5JcIixcInJhcnJmc1wiOlwi4qSeXCIsXCJyYXJyaGtcIjpcIuKGqlwiLFwicmFycmxwXCI6XCLihqxcIixcInJhcnJwbFwiOlwi4qWFXCIsXCJyYXJyc2ltXCI6XCLipbRcIixcIlJhcnJ0bFwiOlwi4qSWXCIsXCJyYXJydGxcIjpcIuKGo1wiLFwicmFycndcIjpcIuKGnVwiLFwicmF0YWlsXCI6XCLipJpcIixcInJBdGFpbFwiOlwi4qScXCIsXCJyYXRpb1wiOlwi4oi2XCIsXCJyYXRpb25hbHNcIjpcIuKEmlwiLFwicmJhcnJcIjpcIuKkjVwiLFwickJhcnJcIjpcIuKkj1wiLFwiUkJhcnJcIjpcIuKkkFwiLFwicmJicmtcIjpcIuKds1wiLFwicmJyYWNlXCI6XCJ9XCIsXCJyYnJhY2tcIjpcIl1cIixcInJicmtlXCI6XCLipoxcIixcInJicmtzbGRcIjpcIuKmjlwiLFwicmJya3NsdVwiOlwi4qaQXCIsXCJSY2Fyb25cIjpcIsWYXCIsXCJyY2Fyb25cIjpcIsWZXCIsXCJSY2VkaWxcIjpcIsWWXCIsXCJyY2VkaWxcIjpcIsWXXCIsXCJyY2VpbFwiOlwi4oyJXCIsXCJyY3ViXCI6XCJ9XCIsXCJSY3lcIjpcItCgXCIsXCJyY3lcIjpcItGAXCIsXCJyZGNhXCI6XCLipLdcIixcInJkbGRoYXJcIjpcIuKlqVwiLFwicmRxdW9cIjpcIuKAnVwiLFwicmRxdW9yXCI6XCLigJ1cIixcInJkc2hcIjpcIuKGs1wiLFwicmVhbFwiOlwi4oScXCIsXCJyZWFsaW5lXCI6XCLihJtcIixcInJlYWxwYXJ0XCI6XCLihJxcIixcInJlYWxzXCI6XCLihJ1cIixcIlJlXCI6XCLihJxcIixcInJlY3RcIjpcIuKWrVwiLFwicmVnXCI6XCLCrlwiLFwiUkVHXCI6XCLCrlwiLFwiUmV2ZXJzZUVsZW1lbnRcIjpcIuKIi1wiLFwiUmV2ZXJzZUVxdWlsaWJyaXVtXCI6XCLih4tcIixcIlJldmVyc2VVcEVxdWlsaWJyaXVtXCI6XCLipa9cIixcInJmaXNodFwiOlwi4qW9XCIsXCJyZmxvb3JcIjpcIuKMi1wiLFwicmZyXCI6XCLwnZSvXCIsXCJSZnJcIjpcIuKEnFwiLFwickhhclwiOlwi4qWkXCIsXCJyaGFyZFwiOlwi4oeBXCIsXCJyaGFydVwiOlwi4oeAXCIsXCJyaGFydWxcIjpcIuKlrFwiLFwiUmhvXCI6XCLOoVwiLFwicmhvXCI6XCLPgVwiLFwicmhvdlwiOlwiz7FcIixcIlJpZ2h0QW5nbGVCcmFja2V0XCI6XCLin6lcIixcIlJpZ2h0QXJyb3dCYXJcIjpcIuKHpVwiLFwicmlnaHRhcnJvd1wiOlwi4oaSXCIsXCJSaWdodEFycm93XCI6XCLihpJcIixcIlJpZ2h0YXJyb3dcIjpcIuKHklwiLFwiUmlnaHRBcnJvd0xlZnRBcnJvd1wiOlwi4oeEXCIsXCJyaWdodGFycm93dGFpbFwiOlwi4oajXCIsXCJSaWdodENlaWxpbmdcIjpcIuKMiVwiLFwiUmlnaHREb3VibGVCcmFja2V0XCI6XCLin6dcIixcIlJpZ2h0RG93blRlZVZlY3RvclwiOlwi4qWdXCIsXCJSaWdodERvd25WZWN0b3JCYXJcIjpcIuKllVwiLFwiUmlnaHREb3duVmVjdG9yXCI6XCLih4JcIixcIlJpZ2h0Rmxvb3JcIjpcIuKMi1wiLFwicmlnaHRoYXJwb29uZG93blwiOlwi4oeBXCIsXCJyaWdodGhhcnBvb251cFwiOlwi4oeAXCIsXCJyaWdodGxlZnRhcnJvd3NcIjpcIuKHhFwiLFwicmlnaHRsZWZ0aGFycG9vbnNcIjpcIuKHjFwiLFwicmlnaHRyaWdodGFycm93c1wiOlwi4oeJXCIsXCJyaWdodHNxdWlnYXJyb3dcIjpcIuKGnVwiLFwiUmlnaHRUZWVBcnJvd1wiOlwi4oamXCIsXCJSaWdodFRlZVwiOlwi4oqiXCIsXCJSaWdodFRlZVZlY3RvclwiOlwi4qWbXCIsXCJyaWdodHRocmVldGltZXNcIjpcIuKLjFwiLFwiUmlnaHRUcmlhbmdsZUJhclwiOlwi4qeQXCIsXCJSaWdodFRyaWFuZ2xlXCI6XCLiirNcIixcIlJpZ2h0VHJpYW5nbGVFcXVhbFwiOlwi4oq1XCIsXCJSaWdodFVwRG93blZlY3RvclwiOlwi4qWPXCIsXCJSaWdodFVwVGVlVmVjdG9yXCI6XCLipZxcIixcIlJpZ2h0VXBWZWN0b3JCYXJcIjpcIuKllFwiLFwiUmlnaHRVcFZlY3RvclwiOlwi4oa+XCIsXCJSaWdodFZlY3RvckJhclwiOlwi4qWTXCIsXCJSaWdodFZlY3RvclwiOlwi4oeAXCIsXCJyaW5nXCI6XCLLmlwiLFwicmlzaW5nZG90c2VxXCI6XCLiiZNcIixcInJsYXJyXCI6XCLih4RcIixcInJsaGFyXCI6XCLih4xcIixcInJsbVwiOlwi4oCPXCIsXCJybW91c3RhY2hlXCI6XCLijrFcIixcInJtb3VzdFwiOlwi4o6xXCIsXCJybm1pZFwiOlwi4quuXCIsXCJyb2FuZ1wiOlwi4p+tXCIsXCJyb2FyclwiOlwi4oe+XCIsXCJyb2Jya1wiOlwi4p+nXCIsXCJyb3BhclwiOlwi4qaGXCIsXCJyb3BmXCI6XCLwnZWjXCIsXCJSb3BmXCI6XCLihJ1cIixcInJvcGx1c1wiOlwi4qiuXCIsXCJyb3RpbWVzXCI6XCLiqLVcIixcIlJvdW5kSW1wbGllc1wiOlwi4qWwXCIsXCJycGFyXCI6XCIpXCIsXCJycGFyZ3RcIjpcIuKmlFwiLFwicnBwb2xpbnRcIjpcIuKoklwiLFwicnJhcnJcIjpcIuKHiVwiLFwiUnJpZ2h0YXJyb3dcIjpcIuKHm1wiLFwicnNhcXVvXCI6XCLigLpcIixcInJzY3JcIjpcIvCdk4dcIixcIlJzY3JcIjpcIuKEm1wiLFwicnNoXCI6XCLihrFcIixcIlJzaFwiOlwi4oaxXCIsXCJyc3FiXCI6XCJdXCIsXCJyc3F1b1wiOlwi4oCZXCIsXCJyc3F1b3JcIjpcIuKAmVwiLFwicnRocmVlXCI6XCLii4xcIixcInJ0aW1lc1wiOlwi4ouKXCIsXCJydHJpXCI6XCLilrlcIixcInJ0cmllXCI6XCLiirVcIixcInJ0cmlmXCI6XCLilrhcIixcInJ0cmlsdHJpXCI6XCLip45cIixcIlJ1bGVEZWxheWVkXCI6XCLip7RcIixcInJ1bHVoYXJcIjpcIuKlqFwiLFwicnhcIjpcIuKEnlwiLFwiU2FjdXRlXCI6XCLFmlwiLFwic2FjdXRlXCI6XCLFm1wiLFwic2JxdW9cIjpcIuKAmlwiLFwic2NhcFwiOlwi4qq4XCIsXCJTY2Fyb25cIjpcIsWgXCIsXCJzY2Fyb25cIjpcIsWhXCIsXCJTY1wiOlwi4qq8XCIsXCJzY1wiOlwi4om7XCIsXCJzY2N1ZVwiOlwi4om9XCIsXCJzY2VcIjpcIuKqsFwiLFwic2NFXCI6XCLiqrRcIixcIlNjZWRpbFwiOlwixZ5cIixcInNjZWRpbFwiOlwixZ9cIixcIlNjaXJjXCI6XCLFnFwiLFwic2NpcmNcIjpcIsWdXCIsXCJzY25hcFwiOlwi4qq6XCIsXCJzY25FXCI6XCLiqrZcIixcInNjbnNpbVwiOlwi4oupXCIsXCJzY3BvbGludFwiOlwi4qiTXCIsXCJzY3NpbVwiOlwi4om/XCIsXCJTY3lcIjpcItChXCIsXCJzY3lcIjpcItGBXCIsXCJzZG90YlwiOlwi4oqhXCIsXCJzZG90XCI6XCLii4VcIixcInNkb3RlXCI6XCLiqaZcIixcInNlYXJoa1wiOlwi4qSlXCIsXCJzZWFyclwiOlwi4oaYXCIsXCJzZUFyclwiOlwi4oeYXCIsXCJzZWFycm93XCI6XCLihphcIixcInNlY3RcIjpcIsKnXCIsXCJzZW1pXCI6XCI7XCIsXCJzZXN3YXJcIjpcIuKkqVwiLFwic2V0bWludXNcIjpcIuKIllwiLFwic2V0bW5cIjpcIuKIllwiLFwic2V4dFwiOlwi4py2XCIsXCJTZnJcIjpcIvCdlJZcIixcInNmclwiOlwi8J2UsFwiLFwic2Zyb3duXCI6XCLijKJcIixcInNoYXJwXCI6XCLima9cIixcIlNIQ0hjeVwiOlwi0KlcIixcInNoY2hjeVwiOlwi0YlcIixcIlNIY3lcIjpcItCoXCIsXCJzaGN5XCI6XCLRiFwiLFwiU2hvcnREb3duQXJyb3dcIjpcIuKGk1wiLFwiU2hvcnRMZWZ0QXJyb3dcIjpcIuKGkFwiLFwic2hvcnRtaWRcIjpcIuKIo1wiLFwic2hvcnRwYXJhbGxlbFwiOlwi4oilXCIsXCJTaG9ydFJpZ2h0QXJyb3dcIjpcIuKGklwiLFwiU2hvcnRVcEFycm93XCI6XCLihpFcIixcInNoeVwiOlwiwq1cIixcIlNpZ21hXCI6XCLOo1wiLFwic2lnbWFcIjpcIs+DXCIsXCJzaWdtYWZcIjpcIs+CXCIsXCJzaWdtYXZcIjpcIs+CXCIsXCJzaW1cIjpcIuKIvFwiLFwic2ltZG90XCI6XCLiqapcIixcInNpbWVcIjpcIuKJg1wiLFwic2ltZXFcIjpcIuKJg1wiLFwic2ltZ1wiOlwi4qqeXCIsXCJzaW1nRVwiOlwi4qqgXCIsXCJzaW1sXCI6XCLiqp1cIixcInNpbWxFXCI6XCLiqp9cIixcInNpbW5lXCI6XCLiiYZcIixcInNpbXBsdXNcIjpcIuKopFwiLFwic2ltcmFyclwiOlwi4qWyXCIsXCJzbGFyclwiOlwi4oaQXCIsXCJTbWFsbENpcmNsZVwiOlwi4oiYXCIsXCJzbWFsbHNldG1pbnVzXCI6XCLiiJZcIixcInNtYXNocFwiOlwi4qizXCIsXCJzbWVwYXJzbFwiOlwi4qekXCIsXCJzbWlkXCI6XCLiiKNcIixcInNtaWxlXCI6XCLijKNcIixcInNtdFwiOlwi4qqqXCIsXCJzbXRlXCI6XCLiqqxcIixcInNtdGVzXCI6XCLiqqzvuIBcIixcIlNPRlRjeVwiOlwi0KxcIixcInNvZnRjeVwiOlwi0YxcIixcInNvbGJhclwiOlwi4oy/XCIsXCJzb2xiXCI6XCLip4RcIixcInNvbFwiOlwiL1wiLFwiU29wZlwiOlwi8J2VilwiLFwic29wZlwiOlwi8J2VpFwiLFwic3BhZGVzXCI6XCLimaBcIixcInNwYWRlc3VpdFwiOlwi4pmgXCIsXCJzcGFyXCI6XCLiiKVcIixcInNxY2FwXCI6XCLiipNcIixcInNxY2Fwc1wiOlwi4oqT77iAXCIsXCJzcWN1cFwiOlwi4oqUXCIsXCJzcWN1cHNcIjpcIuKKlO+4gFwiLFwiU3FydFwiOlwi4oiaXCIsXCJzcXN1YlwiOlwi4oqPXCIsXCJzcXN1YmVcIjpcIuKKkVwiLFwic3FzdWJzZXRcIjpcIuKKj1wiLFwic3FzdWJzZXRlcVwiOlwi4oqRXCIsXCJzcXN1cFwiOlwi4oqQXCIsXCJzcXN1cGVcIjpcIuKKklwiLFwic3FzdXBzZXRcIjpcIuKKkFwiLFwic3FzdXBzZXRlcVwiOlwi4oqSXCIsXCJzcXVhcmVcIjpcIuKWoVwiLFwiU3F1YXJlXCI6XCLilqFcIixcIlNxdWFyZUludGVyc2VjdGlvblwiOlwi4oqTXCIsXCJTcXVhcmVTdWJzZXRcIjpcIuKKj1wiLFwiU3F1YXJlU3Vic2V0RXF1YWxcIjpcIuKKkVwiLFwiU3F1YXJlU3VwZXJzZXRcIjpcIuKKkFwiLFwiU3F1YXJlU3VwZXJzZXRFcXVhbFwiOlwi4oqSXCIsXCJTcXVhcmVVbmlvblwiOlwi4oqUXCIsXCJzcXVhcmZcIjpcIuKWqlwiLFwic3F1XCI6XCLilqFcIixcInNxdWZcIjpcIuKWqlwiLFwic3JhcnJcIjpcIuKGklwiLFwiU3NjclwiOlwi8J2SrlwiLFwic3NjclwiOlwi8J2TiFwiLFwic3NldG1uXCI6XCLiiJZcIixcInNzbWlsZVwiOlwi4oyjXCIsXCJzc3RhcmZcIjpcIuKLhlwiLFwiU3RhclwiOlwi4ouGXCIsXCJzdGFyXCI6XCLimIZcIixcInN0YXJmXCI6XCLimIVcIixcInN0cmFpZ2h0ZXBzaWxvblwiOlwiz7VcIixcInN0cmFpZ2h0cGhpXCI6XCLPlVwiLFwic3RybnNcIjpcIsKvXCIsXCJzdWJcIjpcIuKKglwiLFwiU3ViXCI6XCLii5BcIixcInN1YmRvdFwiOlwi4qq9XCIsXCJzdWJFXCI6XCLiq4VcIixcInN1YmVcIjpcIuKKhlwiLFwic3ViZWRvdFwiOlwi4quDXCIsXCJzdWJtdWx0XCI6XCLiq4FcIixcInN1Ym5FXCI6XCLiq4tcIixcInN1Ym5lXCI6XCLiiopcIixcInN1YnBsdXNcIjpcIuKqv1wiLFwic3VicmFyclwiOlwi4qW5XCIsXCJzdWJzZXRcIjpcIuKKglwiLFwiU3Vic2V0XCI6XCLii5BcIixcInN1YnNldGVxXCI6XCLiioZcIixcInN1YnNldGVxcVwiOlwi4quFXCIsXCJTdWJzZXRFcXVhbFwiOlwi4oqGXCIsXCJzdWJzZXRuZXFcIjpcIuKKilwiLFwic3Vic2V0bmVxcVwiOlwi4quLXCIsXCJzdWJzaW1cIjpcIuKrh1wiLFwic3Vic3ViXCI6XCLiq5VcIixcInN1YnN1cFwiOlwi4quTXCIsXCJzdWNjYXBwcm94XCI6XCLiqrhcIixcInN1Y2NcIjpcIuKJu1wiLFwic3VjY2N1cmx5ZXFcIjpcIuKJvVwiLFwiU3VjY2VlZHNcIjpcIuKJu1wiLFwiU3VjY2VlZHNFcXVhbFwiOlwi4qqwXCIsXCJTdWNjZWVkc1NsYW50RXF1YWxcIjpcIuKJvVwiLFwiU3VjY2VlZHNUaWxkZVwiOlwi4om/XCIsXCJzdWNjZXFcIjpcIuKqsFwiLFwic3VjY25hcHByb3hcIjpcIuKqulwiLFwic3VjY25lcXFcIjpcIuKqtlwiLFwic3VjY25zaW1cIjpcIuKLqVwiLFwic3VjY3NpbVwiOlwi4om/XCIsXCJTdWNoVGhhdFwiOlwi4oiLXCIsXCJzdW1cIjpcIuKIkVwiLFwiU3VtXCI6XCLiiJFcIixcInN1bmdcIjpcIuKZqlwiLFwic3VwMVwiOlwiwrlcIixcInN1cDJcIjpcIsKyXCIsXCJzdXAzXCI6XCLCs1wiLFwic3VwXCI6XCLiioNcIixcIlN1cFwiOlwi4ouRXCIsXCJzdXBkb3RcIjpcIuKqvlwiLFwic3VwZHN1YlwiOlwi4quYXCIsXCJzdXBFXCI6XCLiq4ZcIixcInN1cGVcIjpcIuKKh1wiLFwic3VwZWRvdFwiOlwi4quEXCIsXCJTdXBlcnNldFwiOlwi4oqDXCIsXCJTdXBlcnNldEVxdWFsXCI6XCLiiodcIixcInN1cGhzb2xcIjpcIuKfiVwiLFwic3VwaHN1YlwiOlwi4quXXCIsXCJzdXBsYXJyXCI6XCLipbtcIixcInN1cG11bHRcIjpcIuKrglwiLFwic3VwbkVcIjpcIuKrjFwiLFwic3VwbmVcIjpcIuKKi1wiLFwic3VwcGx1c1wiOlwi4quAXCIsXCJzdXBzZXRcIjpcIuKKg1wiLFwiU3Vwc2V0XCI6XCLii5FcIixcInN1cHNldGVxXCI6XCLiiodcIixcInN1cHNldGVxcVwiOlwi4quGXCIsXCJzdXBzZXRuZXFcIjpcIuKKi1wiLFwic3Vwc2V0bmVxcVwiOlwi4quMXCIsXCJzdXBzaW1cIjpcIuKriFwiLFwic3Vwc3ViXCI6XCLiq5RcIixcInN1cHN1cFwiOlwi4quWXCIsXCJzd2FyaGtcIjpcIuKkplwiLFwic3dhcnJcIjpcIuKGmVwiLFwic3dBcnJcIjpcIuKHmVwiLFwic3dhcnJvd1wiOlwi4oaZXCIsXCJzd253YXJcIjpcIuKkqlwiLFwic3psaWdcIjpcIsOfXCIsXCJUYWJcIjpcIlxcdFwiLFwidGFyZ2V0XCI6XCLijJZcIixcIlRhdVwiOlwizqRcIixcInRhdVwiOlwiz4RcIixcInRicmtcIjpcIuKOtFwiLFwiVGNhcm9uXCI6XCLFpFwiLFwidGNhcm9uXCI6XCLFpVwiLFwiVGNlZGlsXCI6XCLFolwiLFwidGNlZGlsXCI6XCLFo1wiLFwiVGN5XCI6XCLQolwiLFwidGN5XCI6XCLRglwiLFwidGRvdFwiOlwi4oObXCIsXCJ0ZWxyZWNcIjpcIuKMlVwiLFwiVGZyXCI6XCLwnZSXXCIsXCJ0ZnJcIjpcIvCdlLFcIixcInRoZXJlNFwiOlwi4oi0XCIsXCJ0aGVyZWZvcmVcIjpcIuKItFwiLFwiVGhlcmVmb3JlXCI6XCLiiLRcIixcIlRoZXRhXCI6XCLOmFwiLFwidGhldGFcIjpcIs64XCIsXCJ0aGV0YXN5bVwiOlwiz5FcIixcInRoZXRhdlwiOlwiz5FcIixcInRoaWNrYXBwcm94XCI6XCLiiYhcIixcInRoaWNrc2ltXCI6XCLiiLxcIixcIlRoaWNrU3BhY2VcIjpcIuKBn+KAilwiLFwiVGhpblNwYWNlXCI6XCLigIlcIixcInRoaW5zcFwiOlwi4oCJXCIsXCJ0aGthcFwiOlwi4omIXCIsXCJ0aGtzaW1cIjpcIuKIvFwiLFwiVEhPUk5cIjpcIsOeXCIsXCJ0aG9yblwiOlwiw75cIixcInRpbGRlXCI6XCLLnFwiLFwiVGlsZGVcIjpcIuKIvFwiLFwiVGlsZGVFcXVhbFwiOlwi4omDXCIsXCJUaWxkZUZ1bGxFcXVhbFwiOlwi4omFXCIsXCJUaWxkZVRpbGRlXCI6XCLiiYhcIixcInRpbWVzYmFyXCI6XCLiqLFcIixcInRpbWVzYlwiOlwi4oqgXCIsXCJ0aW1lc1wiOlwiw5dcIixcInRpbWVzZFwiOlwi4qiwXCIsXCJ0aW50XCI6XCLiiK1cIixcInRvZWFcIjpcIuKkqFwiLFwidG9wYm90XCI6XCLijLZcIixcInRvcGNpclwiOlwi4quxXCIsXCJ0b3BcIjpcIuKKpFwiLFwiVG9wZlwiOlwi8J2Vi1wiLFwidG9wZlwiOlwi8J2VpVwiLFwidG9wZm9ya1wiOlwi4quaXCIsXCJ0b3NhXCI6XCLipKlcIixcInRwcmltZVwiOlwi4oC0XCIsXCJ0cmFkZVwiOlwi4oSiXCIsXCJUUkFERVwiOlwi4oSiXCIsXCJ0cmlhbmdsZVwiOlwi4pa1XCIsXCJ0cmlhbmdsZWRvd25cIjpcIuKWv1wiLFwidHJpYW5nbGVsZWZ0XCI6XCLil4NcIixcInRyaWFuZ2xlbGVmdGVxXCI6XCLiirRcIixcInRyaWFuZ2xlcVwiOlwi4omcXCIsXCJ0cmlhbmdsZXJpZ2h0XCI6XCLilrlcIixcInRyaWFuZ2xlcmlnaHRlcVwiOlwi4oq1XCIsXCJ0cmlkb3RcIjpcIuKXrFwiLFwidHJpZVwiOlwi4omcXCIsXCJ0cmltaW51c1wiOlwi4qi6XCIsXCJUcmlwbGVEb3RcIjpcIuKDm1wiLFwidHJpcGx1c1wiOlwi4qi5XCIsXCJ0cmlzYlwiOlwi4qeNXCIsXCJ0cml0aW1lXCI6XCLiqLtcIixcInRycGV6aXVtXCI6XCLij6JcIixcIlRzY3JcIjpcIvCdkq9cIixcInRzY3JcIjpcIvCdk4lcIixcIlRTY3lcIjpcItCmXCIsXCJ0c2N5XCI6XCLRhlwiLFwiVFNIY3lcIjpcItCLXCIsXCJ0c2hjeVwiOlwi0ZtcIixcIlRzdHJva1wiOlwixaZcIixcInRzdHJva1wiOlwixadcIixcInR3aXh0XCI6XCLiiaxcIixcInR3b2hlYWRsZWZ0YXJyb3dcIjpcIuKGnlwiLFwidHdvaGVhZHJpZ2h0YXJyb3dcIjpcIuKGoFwiLFwiVWFjdXRlXCI6XCLDmlwiLFwidWFjdXRlXCI6XCLDulwiLFwidWFyclwiOlwi4oaRXCIsXCJVYXJyXCI6XCLihp9cIixcInVBcnJcIjpcIuKHkVwiLFwiVWFycm9jaXJcIjpcIuKliVwiLFwiVWJyY3lcIjpcItCOXCIsXCJ1YnJjeVwiOlwi0Z5cIixcIlVicmV2ZVwiOlwixaxcIixcInVicmV2ZVwiOlwixa1cIixcIlVjaXJjXCI6XCLDm1wiLFwidWNpcmNcIjpcIsO7XCIsXCJVY3lcIjpcItCjXCIsXCJ1Y3lcIjpcItGDXCIsXCJ1ZGFyclwiOlwi4oeFXCIsXCJVZGJsYWNcIjpcIsWwXCIsXCJ1ZGJsYWNcIjpcIsWxXCIsXCJ1ZGhhclwiOlwi4qWuXCIsXCJ1ZmlzaHRcIjpcIuKlvlwiLFwiVWZyXCI6XCLwnZSYXCIsXCJ1ZnJcIjpcIvCdlLJcIixcIlVncmF2ZVwiOlwiw5lcIixcInVncmF2ZVwiOlwiw7lcIixcInVIYXJcIjpcIuKlo1wiLFwidWhhcmxcIjpcIuKGv1wiLFwidWhhcnJcIjpcIuKGvlwiLFwidWhibGtcIjpcIuKWgFwiLFwidWxjb3JuXCI6XCLijJxcIixcInVsY29ybmVyXCI6XCLijJxcIixcInVsY3JvcFwiOlwi4oyPXCIsXCJ1bHRyaVwiOlwi4pe4XCIsXCJVbWFjclwiOlwixapcIixcInVtYWNyXCI6XCLFq1wiLFwidW1sXCI6XCLCqFwiLFwiVW5kZXJCYXJcIjpcIl9cIixcIlVuZGVyQnJhY2VcIjpcIuKPn1wiLFwiVW5kZXJCcmFja2V0XCI6XCLijrVcIixcIlVuZGVyUGFyZW50aGVzaXNcIjpcIuKPnVwiLFwiVW5pb25cIjpcIuKLg1wiLFwiVW5pb25QbHVzXCI6XCLiio5cIixcIlVvZ29uXCI6XCLFslwiLFwidW9nb25cIjpcIsWzXCIsXCJVb3BmXCI6XCLwnZWMXCIsXCJ1b3BmXCI6XCLwnZWmXCIsXCJVcEFycm93QmFyXCI6XCLipJJcIixcInVwYXJyb3dcIjpcIuKGkVwiLFwiVXBBcnJvd1wiOlwi4oaRXCIsXCJVcGFycm93XCI6XCLih5FcIixcIlVwQXJyb3dEb3duQXJyb3dcIjpcIuKHhVwiLFwidXBkb3duYXJyb3dcIjpcIuKGlVwiLFwiVXBEb3duQXJyb3dcIjpcIuKGlVwiLFwiVXBkb3duYXJyb3dcIjpcIuKHlVwiLFwiVXBFcXVpbGlicml1bVwiOlwi4qWuXCIsXCJ1cGhhcnBvb25sZWZ0XCI6XCLihr9cIixcInVwaGFycG9vbnJpZ2h0XCI6XCLihr5cIixcInVwbHVzXCI6XCLiio5cIixcIlVwcGVyTGVmdEFycm93XCI6XCLihpZcIixcIlVwcGVyUmlnaHRBcnJvd1wiOlwi4oaXXCIsXCJ1cHNpXCI6XCLPhVwiLFwiVXBzaVwiOlwiz5JcIixcInVwc2loXCI6XCLPklwiLFwiVXBzaWxvblwiOlwizqVcIixcInVwc2lsb25cIjpcIs+FXCIsXCJVcFRlZUFycm93XCI6XCLihqVcIixcIlVwVGVlXCI6XCLiiqVcIixcInVwdXBhcnJvd3NcIjpcIuKHiFwiLFwidXJjb3JuXCI6XCLijJ1cIixcInVyY29ybmVyXCI6XCLijJ1cIixcInVyY3JvcFwiOlwi4oyOXCIsXCJVcmluZ1wiOlwixa5cIixcInVyaW5nXCI6XCLFr1wiLFwidXJ0cmlcIjpcIuKXuVwiLFwiVXNjclwiOlwi8J2SsFwiLFwidXNjclwiOlwi8J2TilwiLFwidXRkb3RcIjpcIuKLsFwiLFwiVXRpbGRlXCI6XCLFqFwiLFwidXRpbGRlXCI6XCLFqVwiLFwidXRyaVwiOlwi4pa1XCIsXCJ1dHJpZlwiOlwi4pa0XCIsXCJ1dWFyclwiOlwi4oeIXCIsXCJVdW1sXCI6XCLDnFwiLFwidXVtbFwiOlwiw7xcIixcInV3YW5nbGVcIjpcIuKmp1wiLFwidmFuZ3J0XCI6XCLippxcIixcInZhcmVwc2lsb25cIjpcIs+1XCIsXCJ2YXJrYXBwYVwiOlwiz7BcIixcInZhcm5vdGhpbmdcIjpcIuKIhVwiLFwidmFycGhpXCI6XCLPlVwiLFwidmFycGlcIjpcIs+WXCIsXCJ2YXJwcm9wdG9cIjpcIuKInVwiLFwidmFyclwiOlwi4oaVXCIsXCJ2QXJyXCI6XCLih5VcIixcInZhcnJob1wiOlwiz7FcIixcInZhcnNpZ21hXCI6XCLPglwiLFwidmFyc3Vic2V0bmVxXCI6XCLiiorvuIBcIixcInZhcnN1YnNldG5lcXFcIjpcIuKri++4gFwiLFwidmFyc3Vwc2V0bmVxXCI6XCLiiovvuIBcIixcInZhcnN1cHNldG5lcXFcIjpcIuKrjO+4gFwiLFwidmFydGhldGFcIjpcIs+RXCIsXCJ2YXJ0cmlhbmdsZWxlZnRcIjpcIuKKslwiLFwidmFydHJpYW5nbGVyaWdodFwiOlwi4oqzXCIsXCJ2QmFyXCI6XCLiq6hcIixcIlZiYXJcIjpcIuKrq1wiLFwidkJhcnZcIjpcIuKrqVwiLFwiVmN5XCI6XCLQklwiLFwidmN5XCI6XCLQslwiLFwidmRhc2hcIjpcIuKKolwiLFwidkRhc2hcIjpcIuKKqFwiLFwiVmRhc2hcIjpcIuKKqVwiLFwiVkRhc2hcIjpcIuKKq1wiLFwiVmRhc2hsXCI6XCLiq6ZcIixcInZlZWJhclwiOlwi4oq7XCIsXCJ2ZWVcIjpcIuKIqFwiLFwiVmVlXCI6XCLii4FcIixcInZlZWVxXCI6XCLiiZpcIixcInZlbGxpcFwiOlwi4ouuXCIsXCJ2ZXJiYXJcIjpcInxcIixcIlZlcmJhclwiOlwi4oCWXCIsXCJ2ZXJ0XCI6XCJ8XCIsXCJWZXJ0XCI6XCLigJZcIixcIlZlcnRpY2FsQmFyXCI6XCLiiKNcIixcIlZlcnRpY2FsTGluZVwiOlwifFwiLFwiVmVydGljYWxTZXBhcmF0b3JcIjpcIuKdmFwiLFwiVmVydGljYWxUaWxkZVwiOlwi4omAXCIsXCJWZXJ5VGhpblNwYWNlXCI6XCLigIpcIixcIlZmclwiOlwi8J2UmVwiLFwidmZyXCI6XCLwnZSzXCIsXCJ2bHRyaVwiOlwi4oqyXCIsXCJ2bnN1YlwiOlwi4oqC4oOSXCIsXCJ2bnN1cFwiOlwi4oqD4oOSXCIsXCJWb3BmXCI6XCLwnZWNXCIsXCJ2b3BmXCI6XCLwnZWnXCIsXCJ2cHJvcFwiOlwi4oidXCIsXCJ2cnRyaVwiOlwi4oqzXCIsXCJWc2NyXCI6XCLwnZKxXCIsXCJ2c2NyXCI6XCLwnZOLXCIsXCJ2c3VibkVcIjpcIuKri++4gFwiLFwidnN1Ym5lXCI6XCLiiorvuIBcIixcInZzdXBuRVwiOlwi4quM77iAXCIsXCJ2c3VwbmVcIjpcIuKKi++4gFwiLFwiVnZkYXNoXCI6XCLiiqpcIixcInZ6aWd6YWdcIjpcIuKmmlwiLFwiV2NpcmNcIjpcIsW0XCIsXCJ3Y2lyY1wiOlwixbVcIixcIndlZGJhclwiOlwi4qmfXCIsXCJ3ZWRnZVwiOlwi4oinXCIsXCJXZWRnZVwiOlwi4ouAXCIsXCJ3ZWRnZXFcIjpcIuKJmVwiLFwid2VpZXJwXCI6XCLihJhcIixcIldmclwiOlwi8J2UmlwiLFwid2ZyXCI6XCLwnZS0XCIsXCJXb3BmXCI6XCLwnZWOXCIsXCJ3b3BmXCI6XCLwnZWoXCIsXCJ3cFwiOlwi4oSYXCIsXCJ3clwiOlwi4omAXCIsXCJ3cmVhdGhcIjpcIuKJgFwiLFwiV3NjclwiOlwi8J2SslwiLFwid3NjclwiOlwi8J2TjFwiLFwieGNhcFwiOlwi4ouCXCIsXCJ4Y2lyY1wiOlwi4pevXCIsXCJ4Y3VwXCI6XCLii4NcIixcInhkdHJpXCI6XCLilr1cIixcIlhmclwiOlwi8J2Um1wiLFwieGZyXCI6XCLwnZS1XCIsXCJ4aGFyclwiOlwi4p+3XCIsXCJ4aEFyclwiOlwi4p+6XCIsXCJYaVwiOlwizp5cIixcInhpXCI6XCLOvlwiLFwieGxhcnJcIjpcIuKftVwiLFwieGxBcnJcIjpcIuKfuFwiLFwieG1hcFwiOlwi4p+8XCIsXCJ4bmlzXCI6XCLii7tcIixcInhvZG90XCI6XCLiqIBcIixcIlhvcGZcIjpcIvCdlY9cIixcInhvcGZcIjpcIvCdlalcIixcInhvcGx1c1wiOlwi4qiBXCIsXCJ4b3RpbWVcIjpcIuKoglwiLFwieHJhcnJcIjpcIuKftlwiLFwieHJBcnJcIjpcIuKfuVwiLFwiWHNjclwiOlwi8J2Ss1wiLFwieHNjclwiOlwi8J2TjVwiLFwieHNxY3VwXCI6XCLiqIZcIixcInh1cGx1c1wiOlwi4qiEXCIsXCJ4dXRyaVwiOlwi4pazXCIsXCJ4dmVlXCI6XCLii4FcIixcInh3ZWRnZVwiOlwi4ouAXCIsXCJZYWN1dGVcIjpcIsOdXCIsXCJ5YWN1dGVcIjpcIsO9XCIsXCJZQWN5XCI6XCLQr1wiLFwieWFjeVwiOlwi0Y9cIixcIlljaXJjXCI6XCLFtlwiLFwieWNpcmNcIjpcIsW3XCIsXCJZY3lcIjpcItCrXCIsXCJ5Y3lcIjpcItGLXCIsXCJ5ZW5cIjpcIsKlXCIsXCJZZnJcIjpcIvCdlJxcIixcInlmclwiOlwi8J2UtlwiLFwiWUljeVwiOlwi0IdcIixcInlpY3lcIjpcItGXXCIsXCJZb3BmXCI6XCLwnZWQXCIsXCJ5b3BmXCI6XCLwnZWqXCIsXCJZc2NyXCI6XCLwnZK0XCIsXCJ5c2NyXCI6XCLwnZOOXCIsXCJZVWN5XCI6XCLQrlwiLFwieXVjeVwiOlwi0Y5cIixcInl1bWxcIjpcIsO/XCIsXCJZdW1sXCI6XCLFuFwiLFwiWmFjdXRlXCI6XCLFuVwiLFwiemFjdXRlXCI6XCLFulwiLFwiWmNhcm9uXCI6XCLFvVwiLFwiemNhcm9uXCI6XCLFvlwiLFwiWmN5XCI6XCLQl1wiLFwiemN5XCI6XCLQt1wiLFwiWmRvdFwiOlwixbtcIixcInpkb3RcIjpcIsW8XCIsXCJ6ZWV0cmZcIjpcIuKEqFwiLFwiWmVyb1dpZHRoU3BhY2VcIjpcIuKAi1wiLFwiWmV0YVwiOlwizpZcIixcInpldGFcIjpcIs62XCIsXCJ6ZnJcIjpcIvCdlLdcIixcIlpmclwiOlwi4oSoXCIsXCJaSGN5XCI6XCLQllwiLFwiemhjeVwiOlwi0LZcIixcInppZ3JhcnJcIjpcIuKHnVwiLFwiem9wZlwiOlwi8J2Vq1wiLFwiWm9wZlwiOlwi4oSkXCIsXCJac2NyXCI6XCLwnZK1XCIsXCJ6c2NyXCI6XCLwnZOPXCIsXCJ6d2pcIjpcIuKAjVwiLFwiendualwiOlwi4oCMXCJ9XG5cbi8qKiovIH0pLFxuLyogMTUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSB7XCJ1bml2ZXJzYWxcIjo1MCxcInRhZ1wiOjMwLFwiYXR0cmlidXRlXCI6MSxcInBzZXVkb1wiOjAsXCJkZXNjZW5kYW50XCI6LTEsXCJjaGlsZFwiOi0xLFwicGFyZW50XCI6LTEsXCJzaWJsaW5nXCI6LTEsXCJhZGphY2VudFwiOi0xfVxuXG4vKioqLyB9KSxcbi8qIDE2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLy8gSW5zcGlyZWQgYnkgR29vZ2xlIENsb3N1cmU6XG4vLyBodHRwOi8vY2xvc3VyZS1saWJyYXJ5Lmdvb2dsZWNvZGUuY29tL3N2bi9kb2NzL1xuLy8gY2xvc3VyZV9nb29nX2FycmF5X2FycmF5LmpzLmh0bWwjZ29vZy5hcnJheS5jbGVhclxuXG5cblxudmFyIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG5cdHZhbHVlKHRoaXMpLmxlbmd0aCA9IDA7XG5cdHJldHVybiB0aGlzO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDE3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eS1mdW5jdGlvblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7fTtcblxuXG4vKioqLyB9KSxcbi8qIDE4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciB0b0ludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUxKVxuXG4gICwgbWF4ID0gTWF0aC5tYXg7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gcmV0dXJuIG1heCgwLCB0b0ludGVnZXIodmFsdWUpKTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiAxOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgY3JlYXRlID0gT2JqZWN0LmNyZWF0ZSwgZ2V0UHJvdG90eXBlT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YsIHBsYWluT2JqZWN0ID0ge307XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKC8qIEN1c3RvbUNyZWF0ZSovKSB7XG5cdHZhciBzZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiwgY3VzdG9tQ3JlYXRlID0gYXJndW1lbnRzWzBdIHx8IGNyZWF0ZTtcblx0aWYgKHR5cGVvZiBzZXRQcm90b3R5cGVPZiAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiBnZXRQcm90b3R5cGVPZihzZXRQcm90b3R5cGVPZihjdXN0b21DcmVhdGUobnVsbCksIHBsYWluT2JqZWN0KSkgPT09IHBsYWluT2JqZWN0O1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDIwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogZXNsaW50IG5vLXByb3RvOiBcIm9mZlwiICovXG5cbi8vIEJpZyB0aGFua3MgdG8gQFdlYlJlZmxlY3Rpb24gZm9yIHNvcnRpbmcgdGhpcyBvdXRcbi8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL1dlYlJlZmxlY3Rpb24vNTU5MzU1NFxuXG5cblxudmFyIGlzT2JqZWN0ICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNTUpXG4gICwgdmFsdWUgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKVxuICAsIG9iaklzUHJvdG90eXBlT2YgPSBPYmplY3QucHJvdG90eXBlLmlzUHJvdG90eXBlT2ZcbiAgLCBkZWZpbmVQcm9wZXJ0eSAgPSBPYmplY3QuZGVmaW5lUHJvcGVydHlcbiAgLCBudWxsRGVzYyAgICAgICAgPSB7XG5cdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdHdyaXRhYmxlOiB0cnVlLFxuXHR2YWx1ZTogdW5kZWZpbmVkXG59XG4gICwgdmFsaWRhdGU7XG5cbnZhbGlkYXRlID0gZnVuY3Rpb24gKG9iaiwgcHJvdG90eXBlKSB7XG5cdHZhbHVlKG9iaik7XG5cdGlmIChwcm90b3R5cGUgPT09IG51bGwgfHwgaXNPYmplY3QocHJvdG90eXBlKSkgcmV0dXJuIG9iajtcblx0dGhyb3cgbmV3IFR5cGVFcnJvcihcIlByb3RvdHlwZSBtdXN0IGJlIG51bGwgb3IgYW4gb2JqZWN0XCIpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKHN0YXR1cykge1xuXHR2YXIgZm4sIHNldDtcblx0aWYgKCFzdGF0dXMpIHJldHVybiBudWxsO1xuXHRpZiAoc3RhdHVzLmxldmVsID09PSAyKSB7XG5cdFx0aWYgKHN0YXR1cy5zZXQpIHtcblx0XHRcdHNldCA9IHN0YXR1cy5zZXQ7XG5cdFx0XHRmbiA9IGZ1bmN0aW9uIChvYmosIHByb3RvdHlwZSkge1xuXHRcdFx0XHRzZXQuY2FsbCh2YWxpZGF0ZShvYmosIHByb3RvdHlwZSksIHByb3RvdHlwZSk7XG5cdFx0XHRcdHJldHVybiBvYmo7XG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRmbiA9IGZ1bmN0aW9uIChvYmosIHByb3RvdHlwZSkge1xuXHRcdFx0XHR2YWxpZGF0ZShvYmosIHByb3RvdHlwZSkuX19wcm90b19fID0gcHJvdG90eXBlO1xuXHRcdFx0XHRyZXR1cm4gb2JqO1xuXHRcdFx0fTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Zm4gPSBmdW5jdGlvbiBzZWxmKG9iaiwgcHJvdG90eXBlKSB7XG5cdFx0XHR2YXIgaXNOdWxsQmFzZTtcblx0XHRcdHZhbGlkYXRlKG9iaiwgcHJvdG90eXBlKTtcblx0XHRcdGlzTnVsbEJhc2UgPSBvYmpJc1Byb3RvdHlwZU9mLmNhbGwoc2VsZi5udWxsUG9seWZpbGwsIG9iaik7XG5cdFx0XHRpZiAoaXNOdWxsQmFzZSkgZGVsZXRlIHNlbGYubnVsbFBvbHlmaWxsLl9fcHJvdG9fXztcblx0XHRcdGlmIChwcm90b3R5cGUgPT09IG51bGwpIHByb3RvdHlwZSA9IHNlbGYubnVsbFBvbHlmaWxsO1xuXHRcdFx0b2JqLl9fcHJvdG9fXyA9IHByb3RvdHlwZTtcblx0XHRcdGlmIChpc051bGxCYXNlKSBkZWZpbmVQcm9wZXJ0eShzZWxmLm51bGxQb2x5ZmlsbCwgXCJfX3Byb3RvX19cIiwgbnVsbERlc2MpO1xuXHRcdFx0cmV0dXJuIG9iajtcblx0XHR9O1xuXHR9XG5cdHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sIFwibGV2ZWxcIiwge1xuXHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG5cdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0d3JpdGFibGU6IGZhbHNlLFxuXHRcdHZhbHVlOiBzdGF0dXMubGV2ZWxcblx0fSk7XG59KFxuXHQoZnVuY3Rpb24gKCkge1xuXHRcdHZhciB0bXBPYmoxID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuXHRcdCAgLCB0bXBPYmoyID0ge31cblx0XHQgICwgc2V0XG5cdFx0ICAsIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5wcm90b3R5cGUsIFwiX19wcm90b19fXCIpO1xuXG5cdFx0aWYgKGRlc2MpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHNldCA9IGRlc2Muc2V0OyAvLyBPcGVyYSBjcmFzaGVzIGF0IHRoaXMgcG9pbnRcblx0XHRcdFx0c2V0LmNhbGwodG1wT2JqMSwgdG1wT2JqMik7XG5cdFx0XHR9IGNhdGNoIChpZ25vcmUpIHt9XG5cdFx0XHRpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRtcE9iajEpID09PSB0bXBPYmoyKSByZXR1cm4geyBzZXQ6IHNldCwgbGV2ZWw6IDIgfTtcblx0XHR9XG5cblx0XHR0bXBPYmoxLl9fcHJvdG9fXyA9IHRtcE9iajI7XG5cdFx0aWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZih0bXBPYmoxKSA9PT0gdG1wT2JqMikgcmV0dXJuIHsgbGV2ZWw6IDIgfTtcblxuXHRcdHRtcE9iajEgPSB7fTtcblx0XHR0bXBPYmoxLl9fcHJvdG9fXyA9IHRtcE9iajI7XG5cdFx0aWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZih0bXBPYmoxKSA9PT0gdG1wT2JqMikgcmV0dXJuIHsgbGV2ZWw6IDEgfTtcblxuXHRcdHJldHVybiBmYWxzZTtcblx0fSkoKVxuKSk7XG5cbl9fd2VicGFja19yZXF1aXJlX18oNTYpO1xuXG5cbi8qKiovIH0pLFxuLyogMjEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGlzVmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXG52YXIgZm9yRWFjaCA9IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLCBjcmVhdGUgPSBPYmplY3QuY3JlYXRlO1xuXG52YXIgcHJvY2VzcyA9IGZ1bmN0aW9uIChzcmMsIG9iaikge1xuXHR2YXIga2V5O1xuXHRmb3IgKGtleSBpbiBzcmMpIG9ialtrZXldID0gc3JjW2tleV07XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9wdHMxIC8qLCDigKZvcHRpb25zKi8pIHtcblx0dmFyIHJlc3VsdCA9IGNyZWF0ZShudWxsKTtcblx0Zm9yRWFjaC5jYWxsKGFyZ3VtZW50cywgZnVuY3Rpb24gKG9wdGlvbnMpIHtcblx0XHRpZiAoIWlzVmFsdWUob3B0aW9ucykpIHJldHVybjtcblx0XHRwcm9jZXNzKE9iamVjdChvcHRpb25zKSwgcmVzdWx0KTtcblx0fSk7XG5cdHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogMjIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGlzSXRlcmFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcwKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0aWYgKCFpc0l0ZXJhYmxlKHZhbHVlKSkgdGhyb3cgbmV3IFR5cGVFcnJvcih2YWx1ZSArIFwiIGlzIG5vdCBpdGVyYWJsZVwiKTtcblx0cmV0dXJuIHZhbHVlO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDIzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBmYWxzZUZ1bmMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpLmZhbHNlRnVuYztcblxuLy9odHRwczovL2dpdGh1Yi5jb20vc2xldml0aGFuL1hSZWdFeHAvYmxvYi9tYXN0ZXIvc3JjL3hyZWdleHAuanMjTDQ2OVxudmFyIHJlQ2hhcnMgPSAvWy1bXFxde30oKSorPy4sXFxcXF4kfCNcXHNdL2c7XG5cbmZ1bmN0aW9uIGZhY3RvcnkoYWRhcHRlcil7XG5cdC8qXG5cdFx0YXR0cmlidXRlIHNlbGVjdG9yc1xuXHQqL1xuXHR2YXIgYXR0cmlidXRlUnVsZXMgPSB7XG5cdFx0X19wcm90b19fOiBudWxsLFxuXHRcdGVxdWFsczogZnVuY3Rpb24obmV4dCwgZGF0YSl7XG5cdFx0XHR2YXIgbmFtZSAgPSBkYXRhLm5hbWUsXG5cdFx0XHRcdHZhbHVlID0gZGF0YS52YWx1ZTtcblxuXHRcdFx0aWYoZGF0YS5pZ25vcmVDYXNlKXtcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiBlcXVhbHNJQyhlbGVtKXtcblx0XHRcdFx0XHR2YXIgYXR0ciA9IGFkYXB0ZXIuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbSwgbmFtZSk7XG5cdFx0XHRcdFx0cmV0dXJuIGF0dHIgIT0gbnVsbCAmJiBhdHRyLnRvTG93ZXJDYXNlKCkgPT09IHZhbHVlICYmIG5leHQoZWxlbSk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmdW5jdGlvbiBlcXVhbHMoZWxlbSl7XG5cdFx0XHRcdHJldHVybiBhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIG5hbWUpID09PSB2YWx1ZSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGh5cGhlbjogZnVuY3Rpb24obmV4dCwgZGF0YSl7XG5cdFx0XHR2YXIgbmFtZSAgPSBkYXRhLm5hbWUsXG5cdFx0XHRcdHZhbHVlID0gZGF0YS52YWx1ZSxcblx0XHRcdFx0bGVuID0gdmFsdWUubGVuZ3RoO1xuXG5cdFx0XHRpZihkYXRhLmlnbm9yZUNhc2Upe1xuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGh5cGhlbklDKGVsZW0pe1xuXHRcdFx0XHRcdHZhciBhdHRyID0gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBuYW1lKTtcblx0XHRcdFx0XHRyZXR1cm4gYXR0ciAhPSBudWxsICYmXG5cdFx0XHRcdFx0XHRcdChhdHRyLmxlbmd0aCA9PT0gbGVuIHx8IGF0dHIuY2hhckF0KGxlbikgPT09IFwiLVwiKSAmJlxuXHRcdFx0XHRcdFx0XHRhdHRyLnN1YnN0cigwLCBsZW4pLnRvTG93ZXJDYXNlKCkgPT09IHZhbHVlICYmXG5cdFx0XHRcdFx0XHRcdG5leHQoZWxlbSk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmdW5jdGlvbiBoeXBoZW4oZWxlbSl7XG5cdFx0XHRcdHZhciBhdHRyID0gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBuYW1lKTtcblx0XHRcdFx0cmV0dXJuIGF0dHIgIT0gbnVsbCAmJlxuXHRcdFx0XHRcdFx0YXR0ci5zdWJzdHIoMCwgbGVuKSA9PT0gdmFsdWUgJiZcblx0XHRcdFx0XHRcdChhdHRyLmxlbmd0aCA9PT0gbGVuIHx8IGF0dHIuY2hhckF0KGxlbikgPT09IFwiLVwiKSAmJlxuXHRcdFx0XHRcdFx0bmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRlbGVtZW50OiBmdW5jdGlvbihuZXh0LCBkYXRhKXtcblx0XHRcdHZhciBuYW1lID0gZGF0YS5uYW1lLFxuXHRcdFx0XHR2YWx1ZSA9IGRhdGEudmFsdWU7XG5cblx0XHRcdGlmKC9cXHMvLnRlc3QodmFsdWUpKXtcblx0XHRcdFx0cmV0dXJuIGZhbHNlRnVuYztcblx0XHRcdH1cblxuXHRcdFx0dmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlQ2hhcnMsIFwiXFxcXCQmXCIpO1xuXG5cdFx0XHR2YXIgcGF0dGVybiA9IFwiKD86XnxcXFxccylcIiArIHZhbHVlICsgXCIoPzokfFxcXFxzKVwiLFxuXHRcdFx0XHRmbGFncyA9IGRhdGEuaWdub3JlQ2FzZSA/IFwiaVwiIDogXCJcIixcblx0XHRcdFx0cmVnZXggPSBuZXcgUmVnRXhwKHBhdHRlcm4sIGZsYWdzKTtcblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGVsZW1lbnQoZWxlbSl7XG5cdFx0XHRcdHZhciBhdHRyID0gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBuYW1lKTtcblx0XHRcdFx0cmV0dXJuIGF0dHIgIT0gbnVsbCAmJiByZWdleC50ZXN0KGF0dHIpICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0ZXhpc3RzOiBmdW5jdGlvbihuZXh0LCBkYXRhKXtcblx0XHRcdHZhciBuYW1lID0gZGF0YS5uYW1lO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGV4aXN0cyhlbGVtKXtcblx0XHRcdFx0cmV0dXJuIGFkYXB0ZXIuaGFzQXR0cmliKGVsZW0sIG5hbWUpICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0c3RhcnQ6IGZ1bmN0aW9uKG5leHQsIGRhdGEpe1xuXHRcdFx0dmFyIG5hbWUgID0gZGF0YS5uYW1lLFxuXHRcdFx0XHR2YWx1ZSA9IGRhdGEudmFsdWUsXG5cdFx0XHRcdGxlbiA9IHZhbHVlLmxlbmd0aDtcblxuXHRcdFx0aWYobGVuID09PSAwKXtcblx0XHRcdFx0cmV0dXJuIGZhbHNlRnVuYztcblx0XHRcdH1cblxuXHRcdFx0aWYoZGF0YS5pZ25vcmVDYXNlKXtcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiBzdGFydElDKGVsZW0pe1xuXHRcdFx0XHRcdHZhciBhdHRyID0gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBuYW1lKTtcblx0XHRcdFx0XHRyZXR1cm4gYXR0ciAhPSBudWxsICYmIGF0dHIuc3Vic3RyKDAsIGxlbikudG9Mb3dlckNhc2UoKSA9PT0gdmFsdWUgJiYgbmV4dChlbGVtKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIHN0YXJ0KGVsZW0pe1xuXHRcdFx0XHR2YXIgYXR0ciA9IGFkYXB0ZXIuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbSwgbmFtZSk7XG5cdFx0XHRcdHJldHVybiBhdHRyICE9IG51bGwgJiYgYXR0ci5zdWJzdHIoMCwgbGVuKSA9PT0gdmFsdWUgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRlbmQ6IGZ1bmN0aW9uKG5leHQsIGRhdGEpe1xuXHRcdFx0dmFyIG5hbWUgID0gZGF0YS5uYW1lLFxuXHRcdFx0XHR2YWx1ZSA9IGRhdGEudmFsdWUsXG5cdFx0XHRcdGxlbiAgID0gLXZhbHVlLmxlbmd0aDtcblxuXHRcdFx0aWYobGVuID09PSAwKXtcblx0XHRcdFx0cmV0dXJuIGZhbHNlRnVuYztcblx0XHRcdH1cblxuXHRcdFx0aWYoZGF0YS5pZ25vcmVDYXNlKXtcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiBlbmRJQyhlbGVtKXtcblx0XHRcdFx0XHR2YXIgYXR0ciA9IGFkYXB0ZXIuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbSwgbmFtZSk7XG5cdFx0XHRcdFx0cmV0dXJuIGF0dHIgIT0gbnVsbCAmJiBhdHRyLnN1YnN0cihsZW4pLnRvTG93ZXJDYXNlKCkgPT09IHZhbHVlICYmIG5leHQoZWxlbSk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmdW5jdGlvbiBlbmQoZWxlbSl7XG5cdFx0XHRcdHZhciBhdHRyID0gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBuYW1lKTtcblx0XHRcdFx0cmV0dXJuIGF0dHIgIT0gbnVsbCAmJiBhdHRyLnN1YnN0cihsZW4pID09PSB2YWx1ZSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGFueTogZnVuY3Rpb24obmV4dCwgZGF0YSl7XG5cdFx0XHR2YXIgbmFtZSAgPSBkYXRhLm5hbWUsXG5cdFx0XHRcdHZhbHVlID0gZGF0YS52YWx1ZTtcblxuXHRcdFx0aWYodmFsdWUgPT09IFwiXCIpe1xuXHRcdFx0XHRyZXR1cm4gZmFsc2VGdW5jO1xuXHRcdFx0fVxuXG5cdFx0XHRpZihkYXRhLmlnbm9yZUNhc2Upe1xuXHRcdFx0XHR2YXIgcmVnZXggPSBuZXcgUmVnRXhwKHZhbHVlLnJlcGxhY2UocmVDaGFycywgXCJcXFxcJCZcIiksIFwiaVwiKTtcblxuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gYW55SUMoZWxlbSl7XG5cdFx0XHRcdFx0dmFyIGF0dHIgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIG5hbWUpO1xuXHRcdFx0XHRcdHJldHVybiBhdHRyICE9IG51bGwgJiYgcmVnZXgudGVzdChhdHRyKSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gYW55KGVsZW0pe1xuXHRcdFx0XHR2YXIgYXR0ciA9IGFkYXB0ZXIuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbSwgbmFtZSk7XG5cdFx0XHRcdHJldHVybiBhdHRyICE9IG51bGwgJiYgYXR0ci5pbmRleE9mKHZhbHVlKSA+PSAwICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0bm90OiBmdW5jdGlvbihuZXh0LCBkYXRhKXtcblx0XHRcdHZhciBuYW1lICA9IGRhdGEubmFtZSxcblx0XHRcdFx0dmFsdWUgPSBkYXRhLnZhbHVlO1xuXG5cdFx0XHRpZih2YWx1ZSA9PT0gXCJcIil7XG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiBub3RFbXB0eShlbGVtKXtcblx0XHRcdFx0XHRyZXR1cm4gISFhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIG5hbWUpICYmIG5leHQoZWxlbSk7XG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2UgaWYoZGF0YS5pZ25vcmVDYXNlKXtcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiBub3RJQyhlbGVtKXtcblx0XHRcdFx0XHR2YXIgYXR0ciA9IGFkYXB0ZXIuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbSwgbmFtZSk7XG5cdFx0XHRcdFx0cmV0dXJuIGF0dHIgIT0gbnVsbCAmJiBhdHRyLnRvTG93ZXJDYXNlKCkgIT09IHZhbHVlICYmIG5leHQoZWxlbSk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmdW5jdGlvbiBub3QoZWxlbSl7XG5cdFx0XHRcdHJldHVybiBhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIG5hbWUpICE9PSB2YWx1ZSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0fTtcblx0XHR9XG5cdH07XG5cblx0cmV0dXJuIHtcblx0XHRjb21waWxlOiBmdW5jdGlvbihuZXh0LCBkYXRhLCBvcHRpb25zKXtcblx0XHRcdGlmKG9wdGlvbnMgJiYgb3B0aW9ucy5zdHJpY3QgJiYgKFxuXHRcdFx0XHRkYXRhLmlnbm9yZUNhc2UgfHwgZGF0YS5hY3Rpb24gPT09IFwibm90XCJcblx0XHRcdCkpIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGF0dHJpYnV0ZSBzZWxlY3RvclwiKTtcblx0XHRcdHJldHVybiBhdHRyaWJ1dGVSdWxlc1tkYXRhLmFjdGlvbl0obmV4dCwgZGF0YSk7XG5cdFx0fSxcblx0XHRydWxlczogYXR0cmlidXRlUnVsZXNcblx0fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5O1xuXG5cbi8qKiovIH0pLFxuLyogMjQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBDU1NzZWxlY3Q7XG5cbnZhciBEb21VdGlscyAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjUpLFxuXHRmYWxzZUZ1bmMgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNSkuZmFsc2VGdW5jLFxuXHRjb21waWxlRmFjdG9yeSA9IF9fd2VicGFja19yZXF1aXJlX18oNDApLFxuXHRkZWZhdWx0Q29tcGlsZSA9IGNvbXBpbGVGYWN0b3J5KERvbVV0aWxzKTtcblxuZnVuY3Rpb24gYWRhcHRlckNvbXBpbGUoYWRhcHRlcil7XG5cdHJldHVybiBhZGFwdGVyID09PSBEb21VdGlscyA/IGRlZmF1bHRDb21waWxlIDogY29tcGlsZUZhY3RvcnkoYWRhcHRlcik7XG59XG5cbmZ1bmN0aW9uIGdldFNlbGVjdG9yRnVuYyhzZWFyY2hGdW5jKXtcblx0cmV0dXJuIGZ1bmN0aW9uIHNlbGVjdChxdWVyeSwgZWxlbXMsIG9wdGlvbnMpe1xuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG5cdFx0b3B0aW9ucy5hZGFwdGVyID0gb3B0aW9ucy5hZGFwdGVyIHx8IERvbVV0aWxzO1xuXHRcdHZhciBjb21waWxlID0gYWRhcHRlckNvbXBpbGUob3B0aW9ucy5hZGFwdGVyKTtcblxuXHRcdGlmKHR5cGVvZiBxdWVyeSAhPT0gXCJmdW5jdGlvblwiKSBxdWVyeSA9IGNvbXBpbGUuY29tcGlsZVVuc2FmZShxdWVyeSwgb3B0aW9ucywgZWxlbXMpO1xuXHRcdGlmKHF1ZXJ5LnNob3VsZFRlc3ROZXh0U2libGluZ3MpIGVsZW1zID0gYXBwZW5kTmV4dFNpYmxpbmdzKChvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dCkgfHwgZWxlbXMsIG9wdGlvbnMuYWRhcHRlcik7XG5cdFx0aWYoIUFycmF5LmlzQXJyYXkoZWxlbXMpKSBlbGVtcyA9IG9wdGlvbnMuYWRhcHRlci5nZXRDaGlsZHJlbihlbGVtcyk7XG5cdFx0ZWxzZSBlbGVtcyA9IG9wdGlvbnMuYWRhcHRlci5yZW1vdmVTdWJzZXRzKGVsZW1zKTtcblx0XHRyZXR1cm4gc2VhcmNoRnVuYyhxdWVyeSwgZWxlbXMsIG9wdGlvbnMpO1xuXHR9O1xufVxuXG5mdW5jdGlvbiBnZXROZXh0U2libGluZ3MoZWxlbSwgYWRhcHRlcil7XG5cdHZhciBzaWJsaW5ncyA9IGFkYXB0ZXIuZ2V0U2libGluZ3MoZWxlbSk7XG5cdGlmKCFBcnJheS5pc0FycmF5KHNpYmxpbmdzKSkgcmV0dXJuIFtdO1xuXHRzaWJsaW5ncyA9IHNpYmxpbmdzLnNsaWNlKDApO1xuXHR3aGlsZShzaWJsaW5ncy5zaGlmdCgpICE9PSBlbGVtKTtcblx0cmV0dXJuIHNpYmxpbmdzO1xufVxuXG5mdW5jdGlvbiBhcHBlbmROZXh0U2libGluZ3MoZWxlbXMsIGFkYXB0ZXIpe1xuXHQvLyBPcmRlciBtYXR0ZXJzIGJlY2F1c2UgalF1ZXJ5IHNlZW1zIHRvIGNoZWNrIHRoZSBjaGlsZHJlbiBiZWZvcmUgdGhlIHNpYmxpbmdzXG5cdGlmKCFBcnJheS5pc0FycmF5KGVsZW1zKSkgZWxlbXMgPSBbZWxlbXNdO1xuXHR2YXIgbmV3RWxlbXMgPSBlbGVtcy5zbGljZSgwKTtcblxuXHRmb3IodmFyIGkgPSAwLCBsZW4gPSBlbGVtcy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7XG5cdFx0dmFyIG5leHRTaWJsaW5ncyA9IGdldE5leHRTaWJsaW5ncyhuZXdFbGVtc1tpXSwgYWRhcHRlcik7XG5cdFx0bmV3RWxlbXMucHVzaC5hcHBseShuZXdFbGVtcywgbmV4dFNpYmxpbmdzKTtcblx0fVxuXHRyZXR1cm4gbmV3RWxlbXM7XG59XG5cbnZhciBzZWxlY3RBbGwgPSBnZXRTZWxlY3RvckZ1bmMoZnVuY3Rpb24gc2VsZWN0QWxsKHF1ZXJ5LCBlbGVtcywgb3B0aW9ucyl7XG5cdHJldHVybiAocXVlcnkgPT09IGZhbHNlRnVuYyB8fCAhZWxlbXMgfHwgZWxlbXMubGVuZ3RoID09PSAwKSA/IFtdIDogb3B0aW9ucy5hZGFwdGVyLmZpbmRBbGwocXVlcnksIGVsZW1zKTtcbn0pO1xuXG52YXIgc2VsZWN0T25lID0gZ2V0U2VsZWN0b3JGdW5jKGZ1bmN0aW9uIHNlbGVjdE9uZShxdWVyeSwgZWxlbXMsIG9wdGlvbnMpe1xuXHRyZXR1cm4gKHF1ZXJ5ID09PSBmYWxzZUZ1bmMgfHwgIWVsZW1zIHx8IGVsZW1zLmxlbmd0aCA9PT0gMCkgPyBudWxsIDogb3B0aW9ucy5hZGFwdGVyLmZpbmRPbmUocXVlcnksIGVsZW1zKTtcbn0pO1xuXG5mdW5jdGlvbiBpcyhlbGVtLCBxdWVyeSwgb3B0aW9ucyl7XG5cdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG5cdG9wdGlvbnMuYWRhcHRlciA9IG9wdGlvbnMuYWRhcHRlciB8fCBEb21VdGlscztcblx0dmFyIGNvbXBpbGUgPSBhZGFwdGVyQ29tcGlsZShvcHRpb25zLmFkYXB0ZXIpO1xuXHRyZXR1cm4gKHR5cGVvZiBxdWVyeSA9PT0gXCJmdW5jdGlvblwiID8gcXVlcnkgOiBjb21waWxlKHF1ZXJ5LCBvcHRpb25zKSkoZWxlbSk7XG59XG5cbi8qXG5cdHRoZSBleHBvcnRlZCBpbnRlcmZhY2VcbiovXG5mdW5jdGlvbiBDU1NzZWxlY3QocXVlcnksIGVsZW1zLCBvcHRpb25zKXtcblx0cmV0dXJuIHNlbGVjdEFsbChxdWVyeSwgZWxlbXMsIG9wdGlvbnMpO1xufVxuXG5DU1NzZWxlY3QuY29tcGlsZSA9IGRlZmF1bHRDb21waWxlO1xuQ1NTc2VsZWN0LmZpbHRlcnMgPSBkZWZhdWx0Q29tcGlsZS5Qc2V1ZG9zLmZpbHRlcnM7XG5DU1NzZWxlY3QucHNldWRvcyA9IGRlZmF1bHRDb21waWxlLlBzZXVkb3MucHNldWRvcztcblxuQ1NTc2VsZWN0LnNlbGVjdEFsbCA9IHNlbGVjdEFsbDtcbkNTU3NlbGVjdC5zZWxlY3RPbmUgPSBzZWxlY3RPbmU7XG5cbkNTU3NlbGVjdC5pcyA9IGlzO1xuXG4vL2xlZ2FjeSBtZXRob2RzIChtaWdodCBiZSByZW1vdmVkKVxuQ1NTc2VsZWN0LnBhcnNlID0gZGVmYXVsdENvbXBpbGU7XG5DU1NzZWxlY3QuaXRlcmF0ZSA9IHNlbGVjdEFsbDtcblxuLy9ob29rc1xuQ1NTc2VsZWN0Ll9jb21waWxlVW5zYWZlID0gZGVmYXVsdENvbXBpbGUuY29tcGlsZVVuc2FmZTtcbkNTU3NlbGVjdC5fY29tcGlsZVRva2VuID0gZGVmYXVsdENvbXBpbGUuY29tcGlsZVRva2VuO1xuXG5cbi8qKiovIH0pLFxuLyogMjUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIERvbVV0aWxzID0gbW9kdWxlLmV4cG9ydHM7XG5cbltcblx0X193ZWJwYWNrX3JlcXVpcmVfXygyNiksXG5cdF9fd2VicGFja19yZXF1aXJlX18oMzUpLFxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDM2KSxcblx0X193ZWJwYWNrX3JlcXVpcmVfXygzNyksXG5cdF9fd2VicGFja19yZXF1aXJlX18oMzgpLFxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDM5KVxuXS5mb3JFYWNoKGZ1bmN0aW9uKGV4dCl7XG5cdE9iamVjdC5rZXlzKGV4dCkuZm9yRWFjaChmdW5jdGlvbihrZXkpe1xuXHRcdERvbVV0aWxzW2tleV0gPSBleHRba2V5XS5iaW5kKERvbVV0aWxzKTtcblx0fSk7XG59KTtcblxuXG4vKioqLyB9KSxcbi8qIDI2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBFbGVtZW50VHlwZSA9IF9fd2VicGFja19yZXF1aXJlX18oOSksXG4gICAgZ2V0T3V0ZXJIVE1MID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNyksXG4gICAgaXNUYWcgPSBFbGVtZW50VHlwZS5pc1RhZztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdGdldElubmVySFRNTDogZ2V0SW5uZXJIVE1MLFxuXHRnZXRPdXRlckhUTUw6IGdldE91dGVySFRNTCxcblx0Z2V0VGV4dDogZ2V0VGV4dFxufTtcblxuZnVuY3Rpb24gZ2V0SW5uZXJIVE1MKGVsZW0sIG9wdHMpe1xuXHRyZXR1cm4gZWxlbS5jaGlsZHJlbiA/IGVsZW0uY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKGVsZW0pe1xuXHRcdHJldHVybiBnZXRPdXRlckhUTUwoZWxlbSwgb3B0cyk7XG5cdH0pLmpvaW4oXCJcIikgOiBcIlwiO1xufVxuXG5mdW5jdGlvbiBnZXRUZXh0KGVsZW0pe1xuXHRpZihBcnJheS5pc0FycmF5KGVsZW0pKSByZXR1cm4gZWxlbS5tYXAoZ2V0VGV4dCkuam9pbihcIlwiKTtcblx0aWYoaXNUYWcoZWxlbSkgfHwgZWxlbS50eXBlID09PSBFbGVtZW50VHlwZS5DREFUQSkgcmV0dXJuIGdldFRleHQoZWxlbS5jaGlsZHJlbik7XG5cdGlmKGVsZW0udHlwZSA9PT0gRWxlbWVudFR5cGUuVGV4dCkgcmV0dXJuIGVsZW0uZGF0YTtcblx0cmV0dXJuIFwiXCI7XG59XG5cblxuLyoqKi8gfSksXG4vKiAyNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG4vKlxuICBNb2R1bGUgZGVwZW5kZW5jaWVzXG4qL1xudmFyIEVsZW1lbnRUeXBlID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOCk7XG52YXIgZW50aXRpZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KTtcblxuLypcbiAgQm9vbGVhbiBBdHRyaWJ1dGVzXG4qL1xudmFyIGJvb2xlYW5BdHRyaWJ1dGVzID0ge1xuICBfX3Byb3RvX186IG51bGwsXG4gIGFsbG93ZnVsbHNjcmVlbjogdHJ1ZSxcbiAgYXN5bmM6IHRydWUsXG4gIGF1dG9mb2N1czogdHJ1ZSxcbiAgYXV0b3BsYXk6IHRydWUsXG4gIGNoZWNrZWQ6IHRydWUsXG4gIGNvbnRyb2xzOiB0cnVlLFxuICBkZWZhdWx0OiB0cnVlLFxuICBkZWZlcjogdHJ1ZSxcbiAgZGlzYWJsZWQ6IHRydWUsXG4gIGhpZGRlbjogdHJ1ZSxcbiAgaXNtYXA6IHRydWUsXG4gIGxvb3A6IHRydWUsXG4gIG11bHRpcGxlOiB0cnVlLFxuICBtdXRlZDogdHJ1ZSxcbiAgb3BlbjogdHJ1ZSxcbiAgcmVhZG9ubHk6IHRydWUsXG4gIHJlcXVpcmVkOiB0cnVlLFxuICByZXZlcnNlZDogdHJ1ZSxcbiAgc2NvcGVkOiB0cnVlLFxuICBzZWFtbGVzczogdHJ1ZSxcbiAgc2VsZWN0ZWQ6IHRydWUsXG4gIHR5cGVtdXN0bWF0Y2g6IHRydWVcbn07XG5cbnZhciB1bmVuY29kZWRFbGVtZW50cyA9IHtcbiAgX19wcm90b19fOiBudWxsLFxuICBzdHlsZTogdHJ1ZSxcbiAgc2NyaXB0OiB0cnVlLFxuICB4bXA6IHRydWUsXG4gIGlmcmFtZTogdHJ1ZSxcbiAgbm9lbWJlZDogdHJ1ZSxcbiAgbm9mcmFtZXM6IHRydWUsXG4gIHBsYWludGV4dDogdHJ1ZSxcbiAgbm9zY3JpcHQ6IHRydWVcbn07XG5cbi8qXG4gIEZvcm1hdCBhdHRyaWJ1dGVzXG4qL1xuZnVuY3Rpb24gZm9ybWF0QXR0cnMoYXR0cmlidXRlcywgb3B0cykge1xuICBpZiAoIWF0dHJpYnV0ZXMpIHJldHVybjtcblxuICB2YXIgb3V0cHV0ID0gJycsXG4gICAgICB2YWx1ZTtcblxuICAvLyBMb29wIHRocm91Z2ggdGhlIGF0dHJpYnV0ZXNcbiAgZm9yICh2YXIga2V5IGluIGF0dHJpYnV0ZXMpIHtcbiAgICB2YWx1ZSA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICBpZiAob3V0cHV0KSB7XG4gICAgICBvdXRwdXQgKz0gJyAnO1xuICAgIH1cblxuICAgIGlmICghdmFsdWUgJiYgYm9vbGVhbkF0dHJpYnV0ZXNba2V5XSkge1xuICAgICAgb3V0cHV0ICs9IGtleTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0ICs9IGtleSArICc9XCInICsgKG9wdHMuZGVjb2RlRW50aXRpZXMgPyBlbnRpdGllcy5lbmNvZGVYTUwodmFsdWUpIDogdmFsdWUpICsgJ1wiJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufVxuXG4vKlxuICBTZWxmLWVuY2xvc2luZyB0YWdzIChzdG9sZW4gZnJvbSBub2RlLWh0bWxwYXJzZXIpXG4qL1xudmFyIHNpbmdsZVRhZyA9IHtcbiAgX19wcm90b19fOiBudWxsLFxuICBhcmVhOiB0cnVlLFxuICBiYXNlOiB0cnVlLFxuICBiYXNlZm9udDogdHJ1ZSxcbiAgYnI6IHRydWUsXG4gIGNvbDogdHJ1ZSxcbiAgY29tbWFuZDogdHJ1ZSxcbiAgZW1iZWQ6IHRydWUsXG4gIGZyYW1lOiB0cnVlLFxuICBocjogdHJ1ZSxcbiAgaW1nOiB0cnVlLFxuICBpbnB1dDogdHJ1ZSxcbiAgaXNpbmRleDogdHJ1ZSxcbiAga2V5Z2VuOiB0cnVlLFxuICBsaW5rOiB0cnVlLFxuICBtZXRhOiB0cnVlLFxuICBwYXJhbTogdHJ1ZSxcbiAgc291cmNlOiB0cnVlLFxuICB0cmFjazogdHJ1ZSxcbiAgd2JyOiB0cnVlLFxufTtcblxuXG52YXIgcmVuZGVyID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihkb20sIG9wdHMpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGRvbSkgJiYgIWRvbS5jaGVlcmlvKSBkb20gPSBbZG9tXTtcbiAgb3B0cyA9IG9wdHMgfHwge307XG5cbiAgdmFyIG91dHB1dCA9ICcnO1xuXG4gIGZvcih2YXIgaSA9IDA7IGkgPCBkb20ubGVuZ3RoOyBpKyspe1xuICAgIHZhciBlbGVtID0gZG9tW2ldO1xuXG4gICAgaWYgKGVsZW0udHlwZSA9PT0gJ3Jvb3QnKVxuICAgICAgb3V0cHV0ICs9IHJlbmRlcihlbGVtLmNoaWxkcmVuLCBvcHRzKTtcbiAgICBlbHNlIGlmIChFbGVtZW50VHlwZS5pc1RhZyhlbGVtKSlcbiAgICAgIG91dHB1dCArPSByZW5kZXJUYWcoZWxlbSwgb3B0cyk7XG4gICAgZWxzZSBpZiAoZWxlbS50eXBlID09PSBFbGVtZW50VHlwZS5EaXJlY3RpdmUpXG4gICAgICBvdXRwdXQgKz0gcmVuZGVyRGlyZWN0aXZlKGVsZW0pO1xuICAgIGVsc2UgaWYgKGVsZW0udHlwZSA9PT0gRWxlbWVudFR5cGUuQ29tbWVudClcbiAgICAgIG91dHB1dCArPSByZW5kZXJDb21tZW50KGVsZW0pO1xuICAgIGVsc2UgaWYgKGVsZW0udHlwZSA9PT0gRWxlbWVudFR5cGUuQ0RBVEEpXG4gICAgICBvdXRwdXQgKz0gcmVuZGVyQ2RhdGEoZWxlbSk7XG4gICAgZWxzZVxuICAgICAgb3V0cHV0ICs9IHJlbmRlclRleHQoZWxlbSwgb3B0cyk7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufTtcblxuZnVuY3Rpb24gcmVuZGVyVGFnKGVsZW0sIG9wdHMpIHtcbiAgLy8gSGFuZGxlIFNWR1xuICBpZiAoZWxlbS5uYW1lID09PSBcInN2Z1wiKSBvcHRzID0ge2RlY29kZUVudGl0aWVzOiBvcHRzLmRlY29kZUVudGl0aWVzLCB4bWxNb2RlOiB0cnVlfTtcblxuICB2YXIgdGFnID0gJzwnICsgZWxlbS5uYW1lLFxuICAgICAgYXR0cmlicyA9IGZvcm1hdEF0dHJzKGVsZW0uYXR0cmlicywgb3B0cyk7XG5cbiAgaWYgKGF0dHJpYnMpIHtcbiAgICB0YWcgKz0gJyAnICsgYXR0cmlicztcbiAgfVxuXG4gIGlmIChcbiAgICBvcHRzLnhtbE1vZGVcbiAgICAmJiAoIWVsZW0uY2hpbGRyZW4gfHwgZWxlbS5jaGlsZHJlbi5sZW5ndGggPT09IDApXG4gICkge1xuICAgIHRhZyArPSAnLz4nO1xuICB9IGVsc2Uge1xuICAgIHRhZyArPSAnPic7XG4gICAgaWYgKGVsZW0uY2hpbGRyZW4pIHtcbiAgICAgIHRhZyArPSByZW5kZXIoZWxlbS5jaGlsZHJlbiwgb3B0cyk7XG4gICAgfVxuXG4gICAgaWYgKCFzaW5nbGVUYWdbZWxlbS5uYW1lXSB8fCBvcHRzLnhtbE1vZGUpIHtcbiAgICAgIHRhZyArPSAnPC8nICsgZWxlbS5uYW1lICsgJz4nO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YWc7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckRpcmVjdGl2ZShlbGVtKSB7XG4gIHJldHVybiAnPCcgKyBlbGVtLmRhdGEgKyAnPic7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclRleHQoZWxlbSwgb3B0cykge1xuICB2YXIgZGF0YSA9IGVsZW0uZGF0YSB8fCAnJztcblxuICAvLyBpZiBlbnRpdGllcyB3ZXJlbid0IGRlY29kZWQsIG5vIG5lZWQgdG8gZW5jb2RlIHRoZW0gYmFja1xuICBpZiAob3B0cy5kZWNvZGVFbnRpdGllcyAmJiAhKGVsZW0ucGFyZW50ICYmIGVsZW0ucGFyZW50Lm5hbWUgaW4gdW5lbmNvZGVkRWxlbWVudHMpKSB7XG4gICAgZGF0YSA9IGVudGl0aWVzLmVuY29kZVhNTChkYXRhKTtcbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiByZW5kZXJDZGF0YShlbGVtKSB7XG4gIHJldHVybiAnPCFbQ0RBVEFbJyArIGVsZW0uY2hpbGRyZW5bMF0uZGF0YSArICddXT4nO1xufVxuXG5mdW5jdGlvbiByZW5kZXJDb21tZW50KGVsZW0pIHtcbiAgcmV0dXJuICc8IS0tJyArIGVsZW0uZGF0YSArICctLT4nO1xufVxuXG5cbi8qKiovIH0pLFxuLyogMjggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuLy9UeXBlcyBvZiBlbGVtZW50cyBmb3VuZCBpbiB0aGUgRE9NXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0VGV4dDogXCJ0ZXh0XCIsIC8vVGV4dFxuXHREaXJlY3RpdmU6IFwiZGlyZWN0aXZlXCIsIC8vPD8gLi4uID8+XG5cdENvbW1lbnQ6IFwiY29tbWVudFwiLCAvLzwhLS0gLi4uIC0tPlxuXHRTY3JpcHQ6IFwic2NyaXB0XCIsIC8vPHNjcmlwdD4gdGFnc1xuXHRTdHlsZTogXCJzdHlsZVwiLCAvLzxzdHlsZT4gdGFnc1xuXHRUYWc6IFwidGFnXCIsIC8vQW55IHRhZ1xuXHRDREFUQTogXCJjZGF0YVwiLCAvLzwhW0NEQVRBWyAuLi4gXV0+XG5cblx0aXNUYWc6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdHJldHVybiBlbGVtLnR5cGUgPT09IFwidGFnXCIgfHwgZWxlbS50eXBlID09PSBcInNjcmlwdFwiIHx8IGVsZW0udHlwZSA9PT0gXCJzdHlsZVwiO1xuXHR9XG59O1xuXG4vKioqLyB9KSxcbi8qIDI5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBlbmNvZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKSxcbiAgICBkZWNvZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMxKTtcblxuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbihkYXRhLCBsZXZlbCl7XG5cdHJldHVybiAoIWxldmVsIHx8IGxldmVsIDw9IDAgPyBkZWNvZGUuWE1MIDogZGVjb2RlLkhUTUwpKGRhdGEpO1xufTtcblxuZXhwb3J0cy5kZWNvZGVTdHJpY3QgPSBmdW5jdGlvbihkYXRhLCBsZXZlbCl7XG5cdHJldHVybiAoIWxldmVsIHx8IGxldmVsIDw9IDAgPyBkZWNvZGUuWE1MIDogZGVjb2RlLkhUTUxTdHJpY3QpKGRhdGEpO1xufTtcblxuZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbihkYXRhLCBsZXZlbCl7XG5cdHJldHVybiAoIWxldmVsIHx8IGxldmVsIDw9IDAgPyBlbmNvZGUuWE1MIDogZW5jb2RlLkhUTUwpKGRhdGEpO1xufTtcblxuZXhwb3J0cy5lbmNvZGVYTUwgPSBlbmNvZGUuWE1MO1xuXG5leHBvcnRzLmVuY29kZUhUTUw0ID1cbmV4cG9ydHMuZW5jb2RlSFRNTDUgPVxuZXhwb3J0cy5lbmNvZGVIVE1MICA9IGVuY29kZS5IVE1MO1xuXG5leHBvcnRzLmRlY29kZVhNTCA9XG5leHBvcnRzLmRlY29kZVhNTFN0cmljdCA9IGRlY29kZS5YTUw7XG5cbmV4cG9ydHMuZGVjb2RlSFRNTDQgPVxuZXhwb3J0cy5kZWNvZGVIVE1MNSA9XG5leHBvcnRzLmRlY29kZUhUTUwgPSBkZWNvZGUuSFRNTDtcblxuZXhwb3J0cy5kZWNvZGVIVE1MNFN0cmljdCA9XG5leHBvcnRzLmRlY29kZUhUTUw1U3RyaWN0ID1cbmV4cG9ydHMuZGVjb2RlSFRNTFN0cmljdCA9IGRlY29kZS5IVE1MU3RyaWN0O1xuXG5leHBvcnRzLmVzY2FwZSA9IGVuY29kZS5lc2NhcGU7XG5cblxuLyoqKi8gfSksXG4vKiAzMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgaW52ZXJzZVhNTCA9IGdldEludmVyc2VPYmooX193ZWJwYWNrX3JlcXVpcmVfXygxMykpLFxuICAgIHhtbFJlcGxhY2VyID0gZ2V0SW52ZXJzZVJlcGxhY2VyKGludmVyc2VYTUwpO1xuXG5leHBvcnRzLlhNTCA9IGdldEludmVyc2UoaW52ZXJzZVhNTCwgeG1sUmVwbGFjZXIpO1xuXG52YXIgaW52ZXJzZUhUTUwgPSBnZXRJbnZlcnNlT2JqKF9fd2VicGFja19yZXF1aXJlX18oMTQpKSxcbiAgICBodG1sUmVwbGFjZXIgPSBnZXRJbnZlcnNlUmVwbGFjZXIoaW52ZXJzZUhUTUwpO1xuXG5leHBvcnRzLkhUTUwgPSBnZXRJbnZlcnNlKGludmVyc2VIVE1MLCBodG1sUmVwbGFjZXIpO1xuXG5mdW5jdGlvbiBnZXRJbnZlcnNlT2JqKG9iail7XG5cdHJldHVybiBPYmplY3Qua2V5cyhvYmopLnNvcnQoKS5yZWR1Y2UoZnVuY3Rpb24oaW52ZXJzZSwgbmFtZSl7XG5cdFx0aW52ZXJzZVtvYmpbbmFtZV1dID0gXCImXCIgKyBuYW1lICsgXCI7XCI7XG5cdFx0cmV0dXJuIGludmVyc2U7XG5cdH0sIHt9KTtcbn1cblxuZnVuY3Rpb24gZ2V0SW52ZXJzZVJlcGxhY2VyKGludmVyc2Upe1xuXHR2YXIgc2luZ2xlID0gW10sXG5cdCAgICBtdWx0aXBsZSA9IFtdO1xuXG5cdE9iamVjdC5rZXlzKGludmVyc2UpLmZvckVhY2goZnVuY3Rpb24oayl7XG5cdFx0aWYoay5sZW5ndGggPT09IDEpe1xuXHRcdFx0c2luZ2xlLnB1c2goXCJcXFxcXCIgKyBrKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bXVsdGlwbGUucHVzaChrKTtcblx0XHR9XG5cdH0pO1xuXG5cdC8vVE9ETyBhZGQgcmFuZ2VzXG5cdG11bHRpcGxlLnVuc2hpZnQoXCJbXCIgKyBzaW5nbGUuam9pbihcIlwiKSArIFwiXVwiKTtcblxuXHRyZXR1cm4gbmV3IFJlZ0V4cChtdWx0aXBsZS5qb2luKFwifFwiKSwgXCJnXCIpO1xufVxuXG52YXIgcmVfbm9uQVNDSUkgPSAvW15cXDAtXFx4N0ZdL2csXG4gICAgcmVfYXN0cmFsU3ltYm9scyA9IC9bXFx1RDgwMC1cXHVEQkZGXVtcXHVEQzAwLVxcdURGRkZdL2c7XG5cbmZ1bmN0aW9uIHNpbmdsZUNoYXJSZXBsYWNlcihjKXtcblx0cmV0dXJuIFwiJiN4XCIgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkgKyBcIjtcIjtcbn1cblxuZnVuY3Rpb24gYXN0cmFsUmVwbGFjZXIoYyl7XG5cdC8vIGh0dHA6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmcjc3Vycm9nYXRlLWZvcm11bGFlXG5cdHZhciBoaWdoID0gYy5jaGFyQ29kZUF0KDApO1xuXHR2YXIgbG93ICA9IGMuY2hhckNvZGVBdCgxKTtcblx0dmFyIGNvZGVQb2ludCA9IChoaWdoIC0gMHhEODAwKSAqIDB4NDAwICsgbG93IC0gMHhEQzAwICsgMHgxMDAwMDtcblx0cmV0dXJuIFwiJiN4XCIgKyBjb2RlUG9pbnQudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkgKyBcIjtcIjtcbn1cblxuZnVuY3Rpb24gZ2V0SW52ZXJzZShpbnZlcnNlLCByZSl7XG5cdGZ1bmN0aW9uIGZ1bmMobmFtZSl7XG5cdFx0cmV0dXJuIGludmVyc2VbbmFtZV07XG5cdH1cblxuXHRyZXR1cm4gZnVuY3Rpb24oZGF0YSl7XG5cdFx0cmV0dXJuIGRhdGFcblx0XHRcdFx0LnJlcGxhY2UocmUsIGZ1bmMpXG5cdFx0XHRcdC5yZXBsYWNlKHJlX2FzdHJhbFN5bWJvbHMsIGFzdHJhbFJlcGxhY2VyKVxuXHRcdFx0XHQucmVwbGFjZShyZV9ub25BU0NJSSwgc2luZ2xlQ2hhclJlcGxhY2VyKTtcblx0fTtcbn1cblxudmFyIHJlX3htbENoYXJzID0gZ2V0SW52ZXJzZVJlcGxhY2VyKGludmVyc2VYTUwpO1xuXG5mdW5jdGlvbiBlc2NhcGVYTUwoZGF0YSl7XG5cdHJldHVybiBkYXRhXG5cdFx0XHQucmVwbGFjZShyZV94bWxDaGFycywgc2luZ2xlQ2hhclJlcGxhY2VyKVxuXHRcdFx0LnJlcGxhY2UocmVfYXN0cmFsU3ltYm9scywgYXN0cmFsUmVwbGFjZXIpXG5cdFx0XHQucmVwbGFjZShyZV9ub25BU0NJSSwgc2luZ2xlQ2hhclJlcGxhY2VyKTtcbn1cblxuZXhwb3J0cy5lc2NhcGUgPSBlc2NhcGVYTUw7XG5cblxuLyoqKi8gfSksXG4vKiAzMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgZW50aXR5TWFwID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCksXG4gICAgbGVnYWN5TWFwID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMiksXG4gICAgeG1sTWFwICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMyksXG4gICAgZGVjb2RlQ29kZVBvaW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMyk7XG5cbnZhciBkZWNvZGVYTUxTdHJpY3QgID0gZ2V0U3RyaWN0RGVjb2Rlcih4bWxNYXApLFxuICAgIGRlY29kZUhUTUxTdHJpY3QgPSBnZXRTdHJpY3REZWNvZGVyKGVudGl0eU1hcCk7XG5cbmZ1bmN0aW9uIGdldFN0cmljdERlY29kZXIobWFwKXtcblx0dmFyIGtleXMgPSBPYmplY3Qua2V5cyhtYXApLmpvaW4oXCJ8XCIpLFxuXHQgICAgcmVwbGFjZSA9IGdldFJlcGxhY2VyKG1hcCk7XG5cblx0a2V5cyArPSBcInwjW3hYXVtcXFxcZGEtZkEtRl0rfCNcXFxcZCtcIjtcblxuXHR2YXIgcmUgPSBuZXcgUmVnRXhwKFwiJig/OlwiICsga2V5cyArIFwiKTtcIiwgXCJnXCIpO1xuXG5cdHJldHVybiBmdW5jdGlvbihzdHIpe1xuXHRcdHJldHVybiBTdHJpbmcoc3RyKS5yZXBsYWNlKHJlLCByZXBsYWNlKTtcblx0fTtcbn1cblxudmFyIGRlY29kZUhUTUwgPSAoZnVuY3Rpb24oKXtcblx0dmFyIGxlZ2FjeSA9IE9iamVjdC5rZXlzKGxlZ2FjeU1hcClcblx0XHQuc29ydChzb3J0ZXIpO1xuXG5cdHZhciBrZXlzID0gT2JqZWN0LmtleXMoZW50aXR5TWFwKVxuXHRcdC5zb3J0KHNvcnRlcik7XG5cblx0Zm9yKHZhciBpID0gMCwgaiA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKXtcblx0XHRpZihsZWdhY3lbal0gPT09IGtleXNbaV0pe1xuXHRcdFx0a2V5c1tpXSArPSBcIjs/XCI7XG5cdFx0XHRqKys7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGtleXNbaV0gKz0gXCI7XCI7XG5cdFx0fVxuXHR9XG5cblx0dmFyIHJlID0gbmV3IFJlZ0V4cChcIiYoPzpcIiArIGtleXMuam9pbihcInxcIikgKyBcInwjW3hYXVtcXFxcZGEtZkEtRl0rOz98I1xcXFxkKzs/KVwiLCBcImdcIiksXG5cdCAgICByZXBsYWNlID0gZ2V0UmVwbGFjZXIoZW50aXR5TWFwKTtcblxuXHRmdW5jdGlvbiByZXBsYWNlcihzdHIpe1xuXHRcdGlmKHN0ci5zdWJzdHIoLTEpICE9PSBcIjtcIikgc3RyICs9IFwiO1wiO1xuXHRcdHJldHVybiByZXBsYWNlKHN0cik7XG5cdH1cblxuXHQvL1RPRE8gY29uc2lkZXIgY3JlYXRpbmcgYSBtZXJnZWQgbWFwXG5cdHJldHVybiBmdW5jdGlvbihzdHIpe1xuXHRcdHJldHVybiBTdHJpbmcoc3RyKS5yZXBsYWNlKHJlLCByZXBsYWNlcik7XG5cdH07XG59KCkpO1xuXG5mdW5jdGlvbiBzb3J0ZXIoYSwgYil7XG5cdHJldHVybiBhIDwgYiA/IDEgOiAtMTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVwbGFjZXIobWFwKXtcblx0cmV0dXJuIGZ1bmN0aW9uIHJlcGxhY2Uoc3RyKXtcblx0XHRpZihzdHIuY2hhckF0KDEpID09PSBcIiNcIil7XG5cdFx0XHRpZihzdHIuY2hhckF0KDIpID09PSBcIlhcIiB8fCBzdHIuY2hhckF0KDIpID09PSBcInhcIil7XG5cdFx0XHRcdHJldHVybiBkZWNvZGVDb2RlUG9pbnQocGFyc2VJbnQoc3RyLnN1YnN0cigzKSwgMTYpKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBkZWNvZGVDb2RlUG9pbnQocGFyc2VJbnQoc3RyLnN1YnN0cigyKSwgMTApKTtcblx0XHR9XG5cdFx0cmV0dXJuIG1hcFtzdHIuc2xpY2UoMSwgLTEpXTtcblx0fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdFhNTDogZGVjb2RlWE1MU3RyaWN0LFxuXHRIVE1MOiBkZWNvZGVIVE1MLFxuXHRIVE1MU3RyaWN0OiBkZWNvZGVIVE1MU3RyaWN0XG59O1xuXG4vKioqLyB9KSxcbi8qIDMyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0ge1wiQWFjdXRlXCI6XCLDgVwiLFwiYWFjdXRlXCI6XCLDoVwiLFwiQWNpcmNcIjpcIsOCXCIsXCJhY2lyY1wiOlwiw6JcIixcImFjdXRlXCI6XCLCtFwiLFwiQUVsaWdcIjpcIsOGXCIsXCJhZWxpZ1wiOlwiw6ZcIixcIkFncmF2ZVwiOlwiw4BcIixcImFncmF2ZVwiOlwiw6BcIixcImFtcFwiOlwiJlwiLFwiQU1QXCI6XCImXCIsXCJBcmluZ1wiOlwiw4VcIixcImFyaW5nXCI6XCLDpVwiLFwiQXRpbGRlXCI6XCLDg1wiLFwiYXRpbGRlXCI6XCLDo1wiLFwiQXVtbFwiOlwiw4RcIixcImF1bWxcIjpcIsOkXCIsXCJicnZiYXJcIjpcIsKmXCIsXCJDY2VkaWxcIjpcIsOHXCIsXCJjY2VkaWxcIjpcIsOnXCIsXCJjZWRpbFwiOlwiwrhcIixcImNlbnRcIjpcIsKiXCIsXCJjb3B5XCI6XCLCqVwiLFwiQ09QWVwiOlwiwqlcIixcImN1cnJlblwiOlwiwqRcIixcImRlZ1wiOlwiwrBcIixcImRpdmlkZVwiOlwiw7dcIixcIkVhY3V0ZVwiOlwiw4lcIixcImVhY3V0ZVwiOlwiw6lcIixcIkVjaXJjXCI6XCLDilwiLFwiZWNpcmNcIjpcIsOqXCIsXCJFZ3JhdmVcIjpcIsOIXCIsXCJlZ3JhdmVcIjpcIsOoXCIsXCJFVEhcIjpcIsOQXCIsXCJldGhcIjpcIsOwXCIsXCJFdW1sXCI6XCLDi1wiLFwiZXVtbFwiOlwiw6tcIixcImZyYWMxMlwiOlwiwr1cIixcImZyYWMxNFwiOlwiwrxcIixcImZyYWMzNFwiOlwiwr5cIixcImd0XCI6XCI+XCIsXCJHVFwiOlwiPlwiLFwiSWFjdXRlXCI6XCLDjVwiLFwiaWFjdXRlXCI6XCLDrVwiLFwiSWNpcmNcIjpcIsOOXCIsXCJpY2lyY1wiOlwiw65cIixcImlleGNsXCI6XCLCoVwiLFwiSWdyYXZlXCI6XCLDjFwiLFwiaWdyYXZlXCI6XCLDrFwiLFwiaXF1ZXN0XCI6XCLCv1wiLFwiSXVtbFwiOlwiw49cIixcIml1bWxcIjpcIsOvXCIsXCJsYXF1b1wiOlwiwqtcIixcImx0XCI6XCI8XCIsXCJMVFwiOlwiPFwiLFwibWFjclwiOlwiwq9cIixcIm1pY3JvXCI6XCLCtVwiLFwibWlkZG90XCI6XCLCt1wiLFwibmJzcFwiOlwiwqBcIixcIm5vdFwiOlwiwqxcIixcIk50aWxkZVwiOlwiw5FcIixcIm50aWxkZVwiOlwiw7FcIixcIk9hY3V0ZVwiOlwiw5NcIixcIm9hY3V0ZVwiOlwiw7NcIixcIk9jaXJjXCI6XCLDlFwiLFwib2NpcmNcIjpcIsO0XCIsXCJPZ3JhdmVcIjpcIsOSXCIsXCJvZ3JhdmVcIjpcIsOyXCIsXCJvcmRmXCI6XCLCqlwiLFwib3JkbVwiOlwiwrpcIixcIk9zbGFzaFwiOlwiw5hcIixcIm9zbGFzaFwiOlwiw7hcIixcIk90aWxkZVwiOlwiw5VcIixcIm90aWxkZVwiOlwiw7VcIixcIk91bWxcIjpcIsOWXCIsXCJvdW1sXCI6XCLDtlwiLFwicGFyYVwiOlwiwrZcIixcInBsdXNtblwiOlwiwrFcIixcInBvdW5kXCI6XCLCo1wiLFwicXVvdFwiOlwiXFxcIlwiLFwiUVVPVFwiOlwiXFxcIlwiLFwicmFxdW9cIjpcIsK7XCIsXCJyZWdcIjpcIsKuXCIsXCJSRUdcIjpcIsKuXCIsXCJzZWN0XCI6XCLCp1wiLFwic2h5XCI6XCLCrVwiLFwic3VwMVwiOlwiwrlcIixcInN1cDJcIjpcIsKyXCIsXCJzdXAzXCI6XCLCs1wiLFwic3psaWdcIjpcIsOfXCIsXCJUSE9STlwiOlwiw55cIixcInRob3JuXCI6XCLDvlwiLFwidGltZXNcIjpcIsOXXCIsXCJVYWN1dGVcIjpcIsOaXCIsXCJ1YWN1dGVcIjpcIsO6XCIsXCJVY2lyY1wiOlwiw5tcIixcInVjaXJjXCI6XCLDu1wiLFwiVWdyYXZlXCI6XCLDmVwiLFwidWdyYXZlXCI6XCLDuVwiLFwidW1sXCI6XCLCqFwiLFwiVXVtbFwiOlwiw5xcIixcInV1bWxcIjpcIsO8XCIsXCJZYWN1dGVcIjpcIsOdXCIsXCJ5YWN1dGVcIjpcIsO9XCIsXCJ5ZW5cIjpcIsKlXCIsXCJ5dW1sXCI6XCLDv1wifVxuXG4vKioqLyB9KSxcbi8qIDMzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBkZWNvZGVNYXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBkZWNvZGVDb2RlUG9pbnQ7XG5cbi8vIG1vZGlmaWVkIHZlcnNpb24gb2YgaHR0cHM6Ly9naXRodWIuY29tL21hdGhpYXNieW5lbnMvaGUvYmxvYi9tYXN0ZXIvc3JjL2hlLmpzI0w5NC1MMTE5XG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnQoY29kZVBvaW50KXtcblxuXHRpZigoY29kZVBvaW50ID49IDB4RDgwMCAmJiBjb2RlUG9pbnQgPD0gMHhERkZGKSB8fCBjb2RlUG9pbnQgPiAweDEwRkZGRil7XG5cdFx0cmV0dXJuIFwiXFx1RkZGRFwiO1xuXHR9XG5cblx0aWYoY29kZVBvaW50IGluIGRlY29kZU1hcCl7XG5cdFx0Y29kZVBvaW50ID0gZGVjb2RlTWFwW2NvZGVQb2ludF07XG5cdH1cblxuXHR2YXIgb3V0cHV0ID0gXCJcIjtcblxuXHRpZihjb2RlUG9pbnQgPiAweEZGRkYpe1xuXHRcdGNvZGVQb2ludCAtPSAweDEwMDAwO1xuXHRcdG91dHB1dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMCk7XG5cdFx0Y29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkY7XG5cdH1cblxuXHRvdXRwdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlUG9pbnQpO1xuXHRyZXR1cm4gb3V0cHV0O1xufVxuXG5cbi8qKiovIH0pLFxuLyogMzQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSB7XCIwXCI6NjU1MzMsXCIxMjhcIjo4MzY0LFwiMTMwXCI6ODIxOCxcIjEzMVwiOjQwMixcIjEzMlwiOjgyMjIsXCIxMzNcIjo4MjMwLFwiMTM0XCI6ODIyNCxcIjEzNVwiOjgyMjUsXCIxMzZcIjo3MTAsXCIxMzdcIjo4MjQwLFwiMTM4XCI6MzUyLFwiMTM5XCI6ODI0OSxcIjE0MFwiOjMzOCxcIjE0MlwiOjM4MSxcIjE0NVwiOjgyMTYsXCIxNDZcIjo4MjE3LFwiMTQ3XCI6ODIyMCxcIjE0OFwiOjgyMjEsXCIxNDlcIjo4MjI2LFwiMTUwXCI6ODIxMSxcIjE1MVwiOjgyMTIsXCIxNTJcIjo3MzIsXCIxNTNcIjo4NDgyLFwiMTU0XCI6MzUzLFwiMTU1XCI6ODI1MCxcIjE1NlwiOjMzOSxcIjE1OFwiOjM4MixcIjE1OVwiOjM3Nn1cblxuLyoqKi8gfSksXG4vKiAzNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG52YXIgZ2V0Q2hpbGRyZW4gPSBleHBvcnRzLmdldENoaWxkcmVuID0gZnVuY3Rpb24oZWxlbSl7XG5cdHJldHVybiBlbGVtLmNoaWxkcmVuO1xufTtcblxudmFyIGdldFBhcmVudCA9IGV4cG9ydHMuZ2V0UGFyZW50ID0gZnVuY3Rpb24oZWxlbSl7XG5cdHJldHVybiBlbGVtLnBhcmVudDtcbn07XG5cbmV4cG9ydHMuZ2V0U2libGluZ3MgPSBmdW5jdGlvbihlbGVtKXtcblx0dmFyIHBhcmVudCA9IGdldFBhcmVudChlbGVtKTtcblx0cmV0dXJuIHBhcmVudCA/IGdldENoaWxkcmVuKHBhcmVudCkgOiBbZWxlbV07XG59O1xuXG5leHBvcnRzLmdldEF0dHJpYnV0ZVZhbHVlID0gZnVuY3Rpb24oZWxlbSwgbmFtZSl7XG5cdHJldHVybiBlbGVtLmF0dHJpYnMgJiYgZWxlbS5hdHRyaWJzW25hbWVdO1xufTtcblxuZXhwb3J0cy5oYXNBdHRyaWIgPSBmdW5jdGlvbihlbGVtLCBuYW1lKXtcblx0cmV0dXJuICEhZWxlbS5hdHRyaWJzICYmIGhhc093blByb3BlcnR5LmNhbGwoZWxlbS5hdHRyaWJzLCBuYW1lKTtcbn07XG5cbmV4cG9ydHMuZ2V0TmFtZSA9IGZ1bmN0aW9uKGVsZW0pe1xuXHRyZXR1cm4gZWxlbS5uYW1lO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDM2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbmV4cG9ydHMucmVtb3ZlRWxlbWVudCA9IGZ1bmN0aW9uKGVsZW0pe1xuXHRpZihlbGVtLnByZXYpIGVsZW0ucHJldi5uZXh0ID0gZWxlbS5uZXh0O1xuXHRpZihlbGVtLm5leHQpIGVsZW0ubmV4dC5wcmV2ID0gZWxlbS5wcmV2O1xuXG5cdGlmKGVsZW0ucGFyZW50KXtcblx0XHR2YXIgY2hpbGRzID0gZWxlbS5wYXJlbnQuY2hpbGRyZW47XG5cdFx0Y2hpbGRzLnNwbGljZShjaGlsZHMubGFzdEluZGV4T2YoZWxlbSksIDEpO1xuXHR9XG59O1xuXG5leHBvcnRzLnJlcGxhY2VFbGVtZW50ID0gZnVuY3Rpb24oZWxlbSwgcmVwbGFjZW1lbnQpe1xuXHR2YXIgcHJldiA9IHJlcGxhY2VtZW50LnByZXYgPSBlbGVtLnByZXY7XG5cdGlmKHByZXYpe1xuXHRcdHByZXYubmV4dCA9IHJlcGxhY2VtZW50O1xuXHR9XG5cblx0dmFyIG5leHQgPSByZXBsYWNlbWVudC5uZXh0ID0gZWxlbS5uZXh0O1xuXHRpZihuZXh0KXtcblx0XHRuZXh0LnByZXYgPSByZXBsYWNlbWVudDtcblx0fVxuXG5cdHZhciBwYXJlbnQgPSByZXBsYWNlbWVudC5wYXJlbnQgPSBlbGVtLnBhcmVudDtcblx0aWYocGFyZW50KXtcblx0XHR2YXIgY2hpbGRzID0gcGFyZW50LmNoaWxkcmVuO1xuXHRcdGNoaWxkc1tjaGlsZHMubGFzdEluZGV4T2YoZWxlbSldID0gcmVwbGFjZW1lbnQ7XG5cdH1cbn07XG5cbmV4cG9ydHMuYXBwZW5kQ2hpbGQgPSBmdW5jdGlvbihlbGVtLCBjaGlsZCl7XG5cdGNoaWxkLnBhcmVudCA9IGVsZW07XG5cblx0aWYoZWxlbS5jaGlsZHJlbi5wdXNoKGNoaWxkKSAhPT0gMSl7XG5cdFx0dmFyIHNpYmxpbmcgPSBlbGVtLmNoaWxkcmVuW2VsZW0uY2hpbGRyZW4ubGVuZ3RoIC0gMl07XG5cdFx0c2libGluZy5uZXh0ID0gY2hpbGQ7XG5cdFx0Y2hpbGQucHJldiA9IHNpYmxpbmc7XG5cdFx0Y2hpbGQubmV4dCA9IG51bGw7XG5cdH1cbn07XG5cbmV4cG9ydHMuYXBwZW5kID0gZnVuY3Rpb24oZWxlbSwgbmV4dCl7XG5cdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudCxcblx0XHRjdXJyTmV4dCA9IGVsZW0ubmV4dDtcblxuXHRuZXh0Lm5leHQgPSBjdXJyTmV4dDtcblx0bmV4dC5wcmV2ID0gZWxlbTtcblx0ZWxlbS5uZXh0ID0gbmV4dDtcblx0bmV4dC5wYXJlbnQgPSBwYXJlbnQ7XG5cblx0aWYoY3Vyck5leHQpe1xuXHRcdGN1cnJOZXh0LnByZXYgPSBuZXh0O1xuXHRcdGlmKHBhcmVudCl7XG5cdFx0XHR2YXIgY2hpbGRzID0gcGFyZW50LmNoaWxkcmVuO1xuXHRcdFx0Y2hpbGRzLnNwbGljZShjaGlsZHMubGFzdEluZGV4T2YoY3Vyck5leHQpLCAwLCBuZXh0KTtcblx0XHR9XG5cdH0gZWxzZSBpZihwYXJlbnQpe1xuXHRcdHBhcmVudC5jaGlsZHJlbi5wdXNoKG5leHQpO1xuXHR9XG59O1xuXG5leHBvcnRzLnByZXBlbmQgPSBmdW5jdGlvbihlbGVtLCBwcmV2KXtcblx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50O1xuXHRpZihwYXJlbnQpe1xuXHRcdHZhciBjaGlsZHMgPSBwYXJlbnQuY2hpbGRyZW47XG5cdFx0Y2hpbGRzLnNwbGljZShjaGlsZHMubGFzdEluZGV4T2YoZWxlbSksIDAsIHByZXYpO1xuXHR9XG5cblx0aWYoZWxlbS5wcmV2KXtcblx0XHRlbGVtLnByZXYubmV4dCA9IHByZXY7XG5cdH1cblx0XG5cdHByZXYucGFyZW50ID0gcGFyZW50O1xuXHRwcmV2LnByZXYgPSBlbGVtLnByZXY7XG5cdHByZXYubmV4dCA9IGVsZW07XG5cdGVsZW0ucHJldiA9IHByZXY7XG59O1xuXG5cblxuXG4vKioqLyB9KSxcbi8qIDM3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBpc1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oOSkuaXNUYWc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRmaWx0ZXI6IGZpbHRlcixcblx0ZmluZDogZmluZCxcblx0ZmluZE9uZUNoaWxkOiBmaW5kT25lQ2hpbGQsXG5cdGZpbmRPbmU6IGZpbmRPbmUsXG5cdGV4aXN0c09uZTogZXhpc3RzT25lLFxuXHRmaW5kQWxsOiBmaW5kQWxsXG59O1xuXG5mdW5jdGlvbiBmaWx0ZXIodGVzdCwgZWxlbWVudCwgcmVjdXJzZSwgbGltaXQpe1xuXHRpZighQXJyYXkuaXNBcnJheShlbGVtZW50KSkgZWxlbWVudCA9IFtlbGVtZW50XTtcblxuXHRpZih0eXBlb2YgbGltaXQgIT09IFwibnVtYmVyXCIgfHwgIWlzRmluaXRlKGxpbWl0KSl7XG5cdFx0bGltaXQgPSBJbmZpbml0eTtcblx0fVxuXHRyZXR1cm4gZmluZCh0ZXN0LCBlbGVtZW50LCByZWN1cnNlICE9PSBmYWxzZSwgbGltaXQpO1xufVxuXG5mdW5jdGlvbiBmaW5kKHRlc3QsIGVsZW1zLCByZWN1cnNlLCBsaW1pdCl7XG5cdHZhciByZXN1bHQgPSBbXSwgY2hpbGRzO1xuXG5cdGZvcih2YXIgaSA9IDAsIGogPSBlbGVtcy5sZW5ndGg7IGkgPCBqOyBpKyspe1xuXHRcdGlmKHRlc3QoZWxlbXNbaV0pKXtcblx0XHRcdHJlc3VsdC5wdXNoKGVsZW1zW2ldKTtcblx0XHRcdGlmKC0tbGltaXQgPD0gMCkgYnJlYWs7XG5cdFx0fVxuXG5cdFx0Y2hpbGRzID0gZWxlbXNbaV0uY2hpbGRyZW47XG5cdFx0aWYocmVjdXJzZSAmJiBjaGlsZHMgJiYgY2hpbGRzLmxlbmd0aCA+IDApe1xuXHRcdFx0Y2hpbGRzID0gZmluZCh0ZXN0LCBjaGlsZHMsIHJlY3Vyc2UsIGxpbWl0KTtcblx0XHRcdHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoY2hpbGRzKTtcblx0XHRcdGxpbWl0IC09IGNoaWxkcy5sZW5ndGg7XG5cdFx0XHRpZihsaW1pdCA8PSAwKSBicmVhaztcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBmaW5kT25lQ2hpbGQodGVzdCwgZWxlbXMpe1xuXHRmb3IodmFyIGkgPSAwLCBsID0gZWxlbXMubGVuZ3RoOyBpIDwgbDsgaSsrKXtcblx0XHRpZih0ZXN0KGVsZW1zW2ldKSkgcmV0dXJuIGVsZW1zW2ldO1xuXHR9XG5cblx0cmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpbmRPbmUodGVzdCwgZWxlbXMpe1xuXHR2YXIgZWxlbSA9IG51bGw7XG5cblx0Zm9yKHZhciBpID0gMCwgbCA9IGVsZW1zLmxlbmd0aDsgaSA8IGwgJiYgIWVsZW07IGkrKyl7XG5cdFx0aWYoIWlzVGFnKGVsZW1zW2ldKSl7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9IGVsc2UgaWYodGVzdChlbGVtc1tpXSkpe1xuXHRcdFx0ZWxlbSA9IGVsZW1zW2ldO1xuXHRcdH0gZWxzZSBpZihlbGVtc1tpXS5jaGlsZHJlbi5sZW5ndGggPiAwKXtcblx0XHRcdGVsZW0gPSBmaW5kT25lKHRlc3QsIGVsZW1zW2ldLmNoaWxkcmVuKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxuZnVuY3Rpb24gZXhpc3RzT25lKHRlc3QsIGVsZW1zKXtcblx0Zm9yKHZhciBpID0gMCwgbCA9IGVsZW1zLmxlbmd0aDsgaSA8IGw7IGkrKyl7XG5cdFx0aWYoXG5cdFx0XHRpc1RhZyhlbGVtc1tpXSkgJiYgKFxuXHRcdFx0XHR0ZXN0KGVsZW1zW2ldKSB8fCAoXG5cdFx0XHRcdFx0ZWxlbXNbaV0uY2hpbGRyZW4ubGVuZ3RoID4gMCAmJlxuXHRcdFx0XHRcdGV4aXN0c09uZSh0ZXN0LCBlbGVtc1tpXS5jaGlsZHJlbilcblx0XHRcdFx0KVxuXHRcdFx0KVxuXHRcdCl7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGZpbmRBbGwodGVzdCwgZWxlbXMpe1xuXHR2YXIgcmVzdWx0ID0gW107XG5cdGZvcih2YXIgaSA9IDAsIGogPSBlbGVtcy5sZW5ndGg7IGkgPCBqOyBpKyspe1xuXHRcdGlmKCFpc1RhZyhlbGVtc1tpXSkpIGNvbnRpbnVlO1xuXHRcdGlmKHRlc3QoZWxlbXNbaV0pKSByZXN1bHQucHVzaChlbGVtc1tpXSk7XG5cblx0XHRpZihlbGVtc1tpXS5jaGlsZHJlbi5sZW5ndGggPiAwKXtcblx0XHRcdHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoZmluZEFsbCh0ZXN0LCBlbGVtc1tpXS5jaGlsZHJlbikpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5cbi8qKiovIH0pLFxuLyogMzggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIEVsZW1lbnRUeXBlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcbnZhciBpc1RhZyA9IGV4cG9ydHMuaXNUYWcgPSBFbGVtZW50VHlwZS5pc1RhZztcblxuZXhwb3J0cy50ZXN0RWxlbWVudCA9IGZ1bmN0aW9uKG9wdGlvbnMsIGVsZW1lbnQpe1xuXHRmb3IodmFyIGtleSBpbiBvcHRpb25zKXtcblx0XHRpZighb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShrZXkpKTtcblx0XHRlbHNlIGlmKGtleSA9PT0gXCJ0YWdfbmFtZVwiKXtcblx0XHRcdGlmKCFpc1RhZyhlbGVtZW50KSB8fCAhb3B0aW9ucy50YWdfbmFtZShlbGVtZW50Lm5hbWUpKXtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZihrZXkgPT09IFwidGFnX3R5cGVcIil7XG5cdFx0XHRpZighb3B0aW9ucy50YWdfdHlwZShlbGVtZW50LnR5cGUpKSByZXR1cm4gZmFsc2U7XG5cdFx0fSBlbHNlIGlmKGtleSA9PT0gXCJ0YWdfY29udGFpbnNcIil7XG5cdFx0XHRpZihpc1RhZyhlbGVtZW50KSB8fCAhb3B0aW9ucy50YWdfY29udGFpbnMoZWxlbWVudC5kYXRhKSl7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYoIWVsZW1lbnQuYXR0cmlicyB8fCAhb3B0aW9uc1trZXldKGVsZW1lbnQuYXR0cmlic1trZXldKSl7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB0cnVlO1xufTtcblxudmFyIENoZWNrcyA9IHtcblx0dGFnX25hbWU6IGZ1bmN0aW9uKG5hbWUpe1xuXHRcdGlmKHR5cGVvZiBuYW1lID09PSBcImZ1bmN0aW9uXCIpe1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0peyByZXR1cm4gaXNUYWcoZWxlbSkgJiYgbmFtZShlbGVtLm5hbWUpOyB9O1xuXHRcdH0gZWxzZSBpZihuYW1lID09PSBcIipcIil7XG5cdFx0XHRyZXR1cm4gaXNUYWc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbihlbGVtKXsgcmV0dXJuIGlzVGFnKGVsZW0pICYmIGVsZW0ubmFtZSA9PT0gbmFtZTsgfTtcblx0XHR9XG5cdH0sXG5cdHRhZ190eXBlOiBmdW5jdGlvbih0eXBlKXtcblx0XHRpZih0eXBlb2YgdHlwZSA9PT0gXCJmdW5jdGlvblwiKXtcblx0XHRcdHJldHVybiBmdW5jdGlvbihlbGVtKXsgcmV0dXJuIHR5cGUoZWxlbS50eXBlKTsgfTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0peyByZXR1cm4gZWxlbS50eXBlID09PSB0eXBlOyB9O1xuXHRcdH1cblx0fSxcblx0dGFnX2NvbnRhaW5zOiBmdW5jdGlvbihkYXRhKXtcblx0XHRpZih0eXBlb2YgZGF0YSA9PT0gXCJmdW5jdGlvblwiKXtcblx0XHRcdHJldHVybiBmdW5jdGlvbihlbGVtKXsgcmV0dXJuICFpc1RhZyhlbGVtKSAmJiBkYXRhKGVsZW0uZGF0YSk7IH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbihlbGVtKXsgcmV0dXJuICFpc1RhZyhlbGVtKSAmJiBlbGVtLmRhdGEgPT09IGRhdGE7IH07XG5cdFx0fVxuXHR9XG59O1xuXG5mdW5jdGlvbiBnZXRBdHRyaWJDaGVjayhhdHRyaWIsIHZhbHVlKXtcblx0aWYodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpe1xuXHRcdHJldHVybiBmdW5jdGlvbihlbGVtKXsgcmV0dXJuIGVsZW0uYXR0cmlicyAmJiB2YWx1ZShlbGVtLmF0dHJpYnNbYXR0cmliXSk7IH07XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0peyByZXR1cm4gZWxlbS5hdHRyaWJzICYmIGVsZW0uYXR0cmlic1thdHRyaWJdID09PSB2YWx1ZTsgfTtcblx0fVxufVxuXG5mdW5jdGlvbiBjb21iaW5lRnVuY3MoYSwgYil7XG5cdHJldHVybiBmdW5jdGlvbihlbGVtKXtcblx0XHRyZXR1cm4gYShlbGVtKSB8fCBiKGVsZW0pO1xuXHR9O1xufVxuXG5leHBvcnRzLmdldEVsZW1lbnRzID0gZnVuY3Rpb24ob3B0aW9ucywgZWxlbWVudCwgcmVjdXJzZSwgbGltaXQpe1xuXHR2YXIgZnVuY3MgPSBPYmplY3Qua2V5cyhvcHRpb25zKS5tYXAoZnVuY3Rpb24oa2V5KXtcblx0XHR2YXIgdmFsdWUgPSBvcHRpb25zW2tleV07XG5cdFx0cmV0dXJuIGtleSBpbiBDaGVja3MgPyBDaGVja3Nba2V5XSh2YWx1ZSkgOiBnZXRBdHRyaWJDaGVjayhrZXksIHZhbHVlKTtcblx0fSk7XG5cblx0cmV0dXJuIGZ1bmNzLmxlbmd0aCA9PT0gMCA/IFtdIDogdGhpcy5maWx0ZXIoXG5cdFx0ZnVuY3MucmVkdWNlKGNvbWJpbmVGdW5jcyksXG5cdFx0ZWxlbWVudCwgcmVjdXJzZSwgbGltaXRcblx0KTtcbn07XG5cbmV4cG9ydHMuZ2V0RWxlbWVudEJ5SWQgPSBmdW5jdGlvbihpZCwgZWxlbWVudCwgcmVjdXJzZSl7XG5cdGlmKCFBcnJheS5pc0FycmF5KGVsZW1lbnQpKSBlbGVtZW50ID0gW2VsZW1lbnRdO1xuXHRyZXR1cm4gdGhpcy5maW5kT25lKGdldEF0dHJpYkNoZWNrKFwiaWRcIiwgaWQpLCBlbGVtZW50LCByZWN1cnNlICE9PSBmYWxzZSk7XG59O1xuXG5leHBvcnRzLmdldEVsZW1lbnRzQnlUYWdOYW1lID0gZnVuY3Rpb24obmFtZSwgZWxlbWVudCwgcmVjdXJzZSwgbGltaXQpe1xuXHRyZXR1cm4gdGhpcy5maWx0ZXIoQ2hlY2tzLnRhZ19uYW1lKG5hbWUpLCBlbGVtZW50LCByZWN1cnNlLCBsaW1pdCk7XG59O1xuXG5leHBvcnRzLmdldEVsZW1lbnRzQnlUYWdUeXBlID0gZnVuY3Rpb24odHlwZSwgZWxlbWVudCwgcmVjdXJzZSwgbGltaXQpe1xuXHRyZXR1cm4gdGhpcy5maWx0ZXIoQ2hlY2tzLnRhZ190eXBlKHR5cGUpLCBlbGVtZW50LCByZWN1cnNlLCBsaW1pdCk7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogMzkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuLy8gcmVtb3ZlU3Vic2V0c1xuLy8gR2l2ZW4gYW4gYXJyYXkgb2Ygbm9kZXMsIHJlbW92ZSBhbnkgbWVtYmVyIHRoYXQgaXMgY29udGFpbmVkIGJ5IGFub3RoZXIuXG5leHBvcnRzLnJlbW92ZVN1YnNldHMgPSBmdW5jdGlvbihub2Rlcykge1xuXHR2YXIgaWR4ID0gbm9kZXMubGVuZ3RoLCBub2RlLCBhbmNlc3RvciwgcmVwbGFjZTtcblxuXHQvLyBDaGVjayBpZiBlYWNoIG5vZGUgKG9yIG9uZSBvZiBpdHMgYW5jZXN0b3JzKSBpcyBhbHJlYWR5IGNvbnRhaW5lZCBpbiB0aGVcblx0Ly8gYXJyYXkuXG5cdHdoaWxlICgtLWlkeCA+IC0xKSB7XG5cdFx0bm9kZSA9IGFuY2VzdG9yID0gbm9kZXNbaWR4XTtcblxuXHRcdC8vIFRlbXBvcmFyaWx5IHJlbW92ZSB0aGUgbm9kZSB1bmRlciBjb25zaWRlcmF0aW9uXG5cdFx0bm9kZXNbaWR4XSA9IG51bGw7XG5cdFx0cmVwbGFjZSA9IHRydWU7XG5cblx0XHR3aGlsZSAoYW5jZXN0b3IpIHtcblx0XHRcdGlmIChub2Rlcy5pbmRleE9mKGFuY2VzdG9yKSA+IC0xKSB7XG5cdFx0XHRcdHJlcGxhY2UgPSBmYWxzZTtcblx0XHRcdFx0bm9kZXMuc3BsaWNlKGlkeCwgMSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0YW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnQ7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlIG5vZGUgaGFzIGJlZW4gZm91bmQgdG8gYmUgdW5pcXVlLCByZS1pbnNlcnQgaXQuXG5cdFx0aWYgKHJlcGxhY2UpIHtcblx0XHRcdG5vZGVzW2lkeF0gPSBub2RlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBub2Rlcztcbn07XG5cbi8vIFNvdXJjZTogaHR0cDovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ub2RlLWNvbXBhcmVkb2N1bWVudHBvc2l0aW9uXG52YXIgUE9TSVRJT04gPSB7XG5cdERJU0NPTk5FQ1RFRDogMSxcblx0UFJFQ0VESU5HOiAyLFxuXHRGT0xMT1dJTkc6IDQsXG5cdENPTlRBSU5TOiA4LFxuXHRDT05UQUlORURfQlk6IDE2XG59O1xuXG4vLyBDb21wYXJlIHRoZSBwb3NpdGlvbiBvZiBvbmUgbm9kZSBhZ2FpbnN0IGFub3RoZXIgbm9kZSBpbiBhbnkgb3RoZXIgZG9jdW1lbnQuXG4vLyBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgYml0bWFzayB3aXRoIHRoZSBmb2xsb3dpbmcgdmFsdWVzOlxuLy9cbi8vIGRvY3VtZW50IG9yZGVyOlxuLy8gPiBUaGVyZSBpcyBhbiBvcmRlcmluZywgZG9jdW1lbnQgb3JkZXIsIGRlZmluZWQgb24gYWxsIHRoZSBub2RlcyBpbiB0aGVcbi8vID4gZG9jdW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGVcbi8vID4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIGVhY2ggbm9kZSBvY2N1cnMgaW4gdGhlIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGVcbi8vID4gZG9jdW1lbnQgYWZ0ZXIgZXhwYW5zaW9uIG9mIGdlbmVyYWwgZW50aXRpZXMuIFRodXMsIHRoZSBkb2N1bWVudCBlbGVtZW50XG4vLyA+IG5vZGUgd2lsbCBiZSB0aGUgZmlyc3Qgbm9kZS4gRWxlbWVudCBub2RlcyBvY2N1ciBiZWZvcmUgdGhlaXIgY2hpbGRyZW4uXG4vLyA+IFRodXMsIGRvY3VtZW50IG9yZGVyIG9yZGVycyBlbGVtZW50IG5vZGVzIGluIG9yZGVyIG9mIHRoZSBvY2N1cnJlbmNlIG9mXG4vLyA+IHRoZWlyIHN0YXJ0LXRhZyBpbiB0aGUgWE1MIChhZnRlciBleHBhbnNpb24gb2YgZW50aXRpZXMpLiBUaGUgYXR0cmlidXRlXG4vLyA+IG5vZGVzIG9mIGFuIGVsZW1lbnQgb2NjdXIgYWZ0ZXIgdGhlIGVsZW1lbnQgYW5kIGJlZm9yZSBpdHMgY2hpbGRyZW4uIFRoZVxuLy8gPiByZWxhdGl2ZSBvcmRlciBvZiBhdHRyaWJ1dGUgbm9kZXMgaXMgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50Li9cbi8vIFNvdXJjZTpcbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUNvcmUvZ2xvc3NhcnkuaHRtbCNkdC1kb2N1bWVudC1vcmRlclxuLy9cbi8vIEBhcmd1bWVudCB7Tm9kZX0gbm9kYUEgVGhlIGZpcnN0IG5vZGUgdG8gdXNlIGluIHRoZSBjb21wYXJpc29uXG4vLyBAYXJndW1lbnQge05vZGV9IG5vZGVCIFRoZSBzZWNvbmQgbm9kZSB0byB1c2UgaW4gdGhlIGNvbXBhcmlzb25cbi8vXG4vLyBAcmV0dXJuIHtOdW1iZXJ9IEEgYml0bWFzayBkZXNjcmliaW5nIHRoZSBpbnB1dCBub2RlcycgcmVsYXRpdmUgcG9zaXRpb24uXG4vLyAgICAgICAgIFNlZSBodHRwOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLW5vZGUtY29tcGFyZWRvY3VtZW50cG9zaXRpb24gZm9yXG4vLyAgICAgICAgIGEgZGVzY3JpcHRpb24gb2YgdGhlc2UgdmFsdWVzLlxudmFyIGNvbXBhcmVQb3MgPSBleHBvcnRzLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uID0gZnVuY3Rpb24obm9kZUEsIG5vZGVCKSB7XG5cdHZhciBhUGFyZW50cyA9IFtdO1xuXHR2YXIgYlBhcmVudHMgPSBbXTtcblx0dmFyIGN1cnJlbnQsIHNoYXJlZFBhcmVudCwgc2libGluZ3MsIGFTaWJsaW5nLCBiU2libGluZywgaWR4O1xuXG5cdGlmIChub2RlQSA9PT0gbm9kZUIpIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdGN1cnJlbnQgPSBub2RlQTtcblx0d2hpbGUgKGN1cnJlbnQpIHtcblx0XHRhUGFyZW50cy51bnNoaWZ0KGN1cnJlbnQpO1xuXHRcdGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcblx0fVxuXHRjdXJyZW50ID0gbm9kZUI7XG5cdHdoaWxlIChjdXJyZW50KSB7XG5cdFx0YlBhcmVudHMudW5zaGlmdChjdXJyZW50KTtcblx0XHRjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG5cdH1cblxuXHRpZHggPSAwO1xuXHR3aGlsZSAoYVBhcmVudHNbaWR4XSA9PT0gYlBhcmVudHNbaWR4XSkge1xuXHRcdGlkeCsrO1xuXHR9XG5cblx0aWYgKGlkeCA9PT0gMCkge1xuXHRcdHJldHVybiBQT1NJVElPTi5ESVNDT05ORUNURUQ7XG5cdH1cblxuXHRzaGFyZWRQYXJlbnQgPSBhUGFyZW50c1tpZHggLSAxXTtcblx0c2libGluZ3MgPSBzaGFyZWRQYXJlbnQuY2hpbGRyZW47XG5cdGFTaWJsaW5nID0gYVBhcmVudHNbaWR4XTtcblx0YlNpYmxpbmcgPSBiUGFyZW50c1tpZHhdO1xuXG5cdGlmIChzaWJsaW5ncy5pbmRleE9mKGFTaWJsaW5nKSA+IHNpYmxpbmdzLmluZGV4T2YoYlNpYmxpbmcpKSB7XG5cdFx0aWYgKHNoYXJlZFBhcmVudCA9PT0gbm9kZUIpIHtcblx0XHRcdHJldHVybiBQT1NJVElPTi5GT0xMT1dJTkcgfCBQT1NJVElPTi5DT05UQUlORURfQlk7XG5cdFx0fVxuXHRcdHJldHVybiBQT1NJVElPTi5GT0xMT1dJTkc7XG5cdH0gZWxzZSB7XG5cdFx0aWYgKHNoYXJlZFBhcmVudCA9PT0gbm9kZUEpIHtcblx0XHRcdHJldHVybiBQT1NJVElPTi5QUkVDRURJTkcgfCBQT1NJVElPTi5DT05UQUlOUztcblx0XHR9XG5cdFx0cmV0dXJuIFBPU0lUSU9OLlBSRUNFRElORztcblx0fVxufTtcblxuLy8gU29ydCBhbiBhcnJheSBvZiBub2RlcyBiYXNlZCBvbiB0aGVpciByZWxhdGl2ZSBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQgYW5kXG4vLyByZW1vdmUgYW55IGR1cGxpY2F0ZSBub2Rlcy4gSWYgdGhlIGFycmF5IGNvbnRhaW5zIG5vZGVzIHRoYXQgZG8gbm90IGJlbG9uZ1xuLy8gdG8gdGhlIHNhbWUgZG9jdW1lbnQsIHNvcnQgb3JkZXIgaXMgdW5zcGVjaWZpZWQuXG4vL1xuLy8gQGFyZ3VtZW50IHtBcnJheX0gbm9kZXMgQXJyYXkgb2YgRE9NIG5vZGVzXG4vL1xuLy8gQHJldHVybnMge0FycmF5fSBjb2xsZWN0aW9uIG9mIHVuaXF1ZSBub2Rlcywgc29ydGVkIGluIGRvY3VtZW50IG9yZGVyXG5leHBvcnRzLnVuaXF1ZVNvcnQgPSBmdW5jdGlvbihub2Rlcykge1xuXHR2YXIgaWR4ID0gbm9kZXMubGVuZ3RoLCBub2RlLCBwb3NpdGlvbjtcblxuXHRub2RlcyA9IG5vZGVzLnNsaWNlKCk7XG5cblx0d2hpbGUgKC0taWR4ID4gLTEpIHtcblx0XHRub2RlID0gbm9kZXNbaWR4XTtcblx0XHRwb3NpdGlvbiA9IG5vZGVzLmluZGV4T2Yobm9kZSk7XG5cdFx0aWYgKHBvc2l0aW9uID4gLTEgJiYgcG9zaXRpb24gPCBpZHgpIHtcblx0XHRcdG5vZGVzLnNwbGljZShpZHgsIDEpO1xuXHRcdH1cblx0fVxuXHRub2Rlcy5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcblx0XHR2YXIgcmVsYXRpdmUgPSBjb21wYXJlUG9zKGEsIGIpO1xuXHRcdGlmIChyZWxhdGl2ZSAmIFBPU0lUSU9OLlBSRUNFRElORykge1xuXHRcdFx0cmV0dXJuIC0xO1xuXHRcdH0gZWxzZSBpZiAocmVsYXRpdmUgJiBQT1NJVElPTi5GT0xMT1dJTkcpIHtcblx0XHRcdHJldHVybiAxO1xuXHRcdH1cblx0XHRyZXR1cm4gMDtcblx0fSk7XG5cblx0cmV0dXJuIG5vZGVzO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDQwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbi8qXG5cdGNvbXBpbGVzIGEgc2VsZWN0b3IgdG8gYW4gZXhlY3V0YWJsZSBmdW5jdGlvblxuKi9cblxubW9kdWxlLmV4cG9ydHMgPSBjb21waWxlRmFjdG9yeTtcblxudmFyIHBhcnNlICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MSksXG5cdEJhc2VGdW5jcyAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KSxcblx0c29ydFJ1bGVzICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQyKSxcblx0cHJvY2VkdXJlICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KSxcblx0cnVsZXNGYWN0b3J5ICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQzKSxcblx0cHNldWRvc0ZhY3RvcnkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg2KSxcblx0dHJ1ZUZ1bmMgICAgICAgPSBCYXNlRnVuY3MudHJ1ZUZ1bmMsXG5cdGZhbHNlRnVuYyAgICAgID0gQmFzZUZ1bmNzLmZhbHNlRnVuYztcblxuZnVuY3Rpb24gY29tcGlsZUZhY3RvcnkoYWRhcHRlcil7XG5cdHZhciBQc2V1ZG9zICAgICA9IHBzZXVkb3NGYWN0b3J5KGFkYXB0ZXIpLFxuXHRcdGZpbHRlcnMgICAgID0gUHNldWRvcy5maWx0ZXJzLFxuXHRcdFJ1bGVzIFx0XHRcdD0gcnVsZXNGYWN0b3J5KGFkYXB0ZXIsIFBzZXVkb3MpO1xuXG5cdGZ1bmN0aW9uIGNvbXBpbGUoc2VsZWN0b3IsIG9wdGlvbnMsIGNvbnRleHQpe1xuXHRcdHZhciBuZXh0ID0gY29tcGlsZVVuc2FmZShzZWxlY3Rvciwgb3B0aW9ucywgY29udGV4dCk7XG5cdFx0cmV0dXJuIHdyYXAobmV4dCk7XG5cdH1cblxuXHRmdW5jdGlvbiB3cmFwKG5leHQpe1xuXHRcdHJldHVybiBmdW5jdGlvbiBiYXNlKGVsZW0pe1xuXHRcdFx0cmV0dXJuIGFkYXB0ZXIuaXNUYWcoZWxlbSkgJiYgbmV4dChlbGVtKTtcblx0XHR9O1xuXHR9XG5cblx0ZnVuY3Rpb24gY29tcGlsZVVuc2FmZShzZWxlY3Rvciwgb3B0aW9ucywgY29udGV4dCl7XG5cdFx0dmFyIHRva2VuID0gcGFyc2Uoc2VsZWN0b3IsIG9wdGlvbnMpO1xuXHRcdHJldHVybiBjb21waWxlVG9rZW4odG9rZW4sIG9wdGlvbnMsIGNvbnRleHQpO1xuXHR9XG5cblx0ZnVuY3Rpb24gaW5jbHVkZXNTY29wZVBzZXVkbyh0KXtcblx0XHRyZXR1cm4gdC50eXBlID09PSBcInBzZXVkb1wiICYmIChcblx0XHRcdHQubmFtZSA9PT0gXCJzY29wZVwiIHx8IChcblx0XHRcdFx0QXJyYXkuaXNBcnJheSh0LmRhdGEpICYmXG5cdFx0XHRcdHQuZGF0YS5zb21lKGZ1bmN0aW9uKGRhdGEpe1xuXHRcdFx0XHRcdHJldHVybiBkYXRhLnNvbWUoaW5jbHVkZXNTY29wZVBzZXVkbyk7XG5cdFx0XHRcdH0pXG5cdFx0XHQpXG5cdFx0KTtcblx0fVxuXG5cdHZhciBERVNDRU5EQU5UX1RPS0VOID0ge3R5cGU6IFwiZGVzY2VuZGFudFwifSxcblx0XHRGTEVYSUJMRV9ERVNDRU5EQU5UX1RPS0VOID0ge3R5cGU6IFwiX2ZsZXhpYmxlRGVzY2VuZGFudFwifSxcblx0XHRTQ09QRV9UT0tFTiA9IHt0eXBlOiBcInBzZXVkb1wiLCBuYW1lOiBcInNjb3BlXCJ9LFxuXHRcdFBMQUNFSE9MREVSX0VMRU1FTlQgPSB7fTtcblxuXHQvL0NTUyA0IFNwZWMgKERyYWZ0KTogMy4zLjEuIEFic29sdXRpemluZyBhIFNjb3BlLXJlbGF0aXZlIFNlbGVjdG9yXG5cdC8vaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzNC8jYWJzb2x1dGl6aW5nXG5cdGZ1bmN0aW9uIGFic29sdXRpemUodG9rZW4sIGNvbnRleHQpe1xuXHRcdC8vVE9ETyBiZXR0ZXIgY2hlY2sgaWYgY29udGV4dCBpcyBkb2N1bWVudFxuXHRcdHZhciBoYXNDb250ZXh0ID0gISFjb250ZXh0ICYmICEhY29udGV4dC5sZW5ndGggJiYgY29udGV4dC5ldmVyeShmdW5jdGlvbihlKXtcblx0XHRcdHJldHVybiBlID09PSBQTEFDRUhPTERFUl9FTEVNRU5UIHx8ICEhYWRhcHRlci5nZXRQYXJlbnQoZSk7XG5cdFx0fSk7XG5cblxuXHRcdHRva2VuLmZvckVhY2goZnVuY3Rpb24odCl7XG5cdFx0XHRpZih0Lmxlbmd0aCA+IDAgJiYgaXNUcmF2ZXJzYWwodFswXSkgJiYgdFswXS50eXBlICE9PSBcImRlc2NlbmRhbnRcIil7XG5cdFx0XHRcdC8vZG9uJ3QgcmV0dXJuIGluIGVsc2UgYnJhbmNoXG5cdFx0XHR9IGVsc2UgaWYoaGFzQ29udGV4dCAmJiAhaW5jbHVkZXNTY29wZVBzZXVkbyh0KSl7XG5cdFx0XHRcdHQudW5zaGlmdChERVNDRU5EQU5UX1RPS0VOKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dC51bnNoaWZ0KFNDT1BFX1RPS0VOKTtcblx0XHR9KTtcblx0fVxuXG5cdGZ1bmN0aW9uIGNvbXBpbGVUb2tlbih0b2tlbiwgb3B0aW9ucywgY29udGV4dCl7XG5cdFx0dG9rZW4gPSB0b2tlbi5maWx0ZXIoZnVuY3Rpb24odCl7IHJldHVybiB0Lmxlbmd0aCA+IDA7IH0pO1xuXG5cdFx0dG9rZW4uZm9yRWFjaChzb3J0UnVsZXMpO1xuXG5cdFx0dmFyIGlzQXJyYXlDb250ZXh0ID0gQXJyYXkuaXNBcnJheShjb250ZXh0KTtcblxuXHRcdGNvbnRleHQgPSAob3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQpIHx8IGNvbnRleHQ7XG5cblx0XHRpZihjb250ZXh0ICYmICFpc0FycmF5Q29udGV4dCkgY29udGV4dCA9IFtjb250ZXh0XTtcblxuXHRcdGFic29sdXRpemUodG9rZW4sIGNvbnRleHQpO1xuXG5cdFx0dmFyIHNob3VsZFRlc3ROZXh0U2libGluZ3MgPSBmYWxzZTtcblxuXHRcdHZhciBxdWVyeSA9IHRva2VuXG5cdFx0XHQubWFwKGZ1bmN0aW9uKHJ1bGVzKXtcblx0XHRcdFx0aWYocnVsZXNbMF0gJiYgcnVsZXNbMV0gJiYgcnVsZXNbMF0ubmFtZSA9PT0gXCJzY29wZVwiKXtcblx0XHRcdFx0XHR2YXIgcnVsZVR5cGUgPSBydWxlc1sxXS50eXBlO1xuXHRcdFx0XHRcdGlmKGlzQXJyYXlDb250ZXh0ICYmIHJ1bGVUeXBlID09PSBcImRlc2NlbmRhbnRcIikgcnVsZXNbMV0gPSBGTEVYSUJMRV9ERVNDRU5EQU5UX1RPS0VOO1xuXHRcdFx0XHRcdGVsc2UgaWYocnVsZVR5cGUgPT09IFwiYWRqYWNlbnRcIiB8fCBydWxlVHlwZSA9PT0gXCJzaWJsaW5nXCIpIHNob3VsZFRlc3ROZXh0U2libGluZ3MgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBjb21waWxlUnVsZXMocnVsZXMsIG9wdGlvbnMsIGNvbnRleHQpO1xuXHRcdFx0fSlcblx0XHRcdC5yZWR1Y2UocmVkdWNlUnVsZXMsIGZhbHNlRnVuYyk7XG5cblx0XHRxdWVyeS5zaG91bGRUZXN0TmV4dFNpYmxpbmdzID0gc2hvdWxkVGVzdE5leHRTaWJsaW5ncztcblxuXHRcdHJldHVybiBxdWVyeTtcblx0fVxuXG5cdGZ1bmN0aW9uIGlzVHJhdmVyc2FsKHQpe1xuXHRcdHJldHVybiBwcm9jZWR1cmVbdC50eXBlXSA8IDA7XG5cdH1cblxuXHRmdW5jdGlvbiBjb21waWxlUnVsZXMocnVsZXMsIG9wdGlvbnMsIGNvbnRleHQpe1xuXHRcdHJldHVybiBydWxlcy5yZWR1Y2UoZnVuY3Rpb24oZnVuYywgcnVsZSl7XG5cdFx0XHRpZihmdW5jID09PSBmYWxzZUZ1bmMpIHJldHVybiBmdW5jO1xuXHRcdFx0cmV0dXJuIFJ1bGVzW3J1bGUudHlwZV0oZnVuYywgcnVsZSwgb3B0aW9ucywgY29udGV4dCk7XG5cdFx0fSwgb3B0aW9ucyAmJiBvcHRpb25zLnJvb3RGdW5jIHx8IHRydWVGdW5jKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHJlZHVjZVJ1bGVzKGEsIGIpe1xuXHRcdGlmKGIgPT09IGZhbHNlRnVuYyB8fCBhID09PSB0cnVlRnVuYyl7XG5cdFx0XHRyZXR1cm4gYTtcblx0XHR9XG5cdFx0aWYoYSA9PT0gZmFsc2VGdW5jIHx8IGIgPT09IHRydWVGdW5jKXtcblx0XHRcdHJldHVybiBiO1xuXHRcdH1cblxuXHRcdHJldHVybiBmdW5jdGlvbiBjb21iaW5lKGVsZW0pe1xuXHRcdFx0cmV0dXJuIGEoZWxlbSkgfHwgYihlbGVtKTtcblx0XHR9O1xuXHR9XG5cblx0ZnVuY3Rpb24gY29udGFpbnNUcmF2ZXJzYWwodCl7XG5cdFx0cmV0dXJuIHQuc29tZShpc1RyYXZlcnNhbCk7XG5cdH1cblxuXHQvLzpub3QsIDpoYXMgYW5kIDptYXRjaGVzIGhhdmUgdG8gY29tcGlsZSBzZWxlY3RvcnNcblx0Ly9kb2luZyB0aGlzIGluIGxpYi9wc2V1ZG9zLmpzIHdvdWxkIGxlYWQgdG8gY2lyY3VsYXIgZGVwZW5kZW5jaWVzLFxuXHQvL3NvIHdlIGFkZCB0aGVtIGhlcmVcblx0ZmlsdGVycy5ub3QgPSBmdW5jdGlvbihuZXh0LCB0b2tlbiwgb3B0aW9ucywgY29udGV4dCl7XG5cdFx0dmFyIG9wdHMgPSB7XG5cdFx0XHR4bWxNb2RlOiAhIShvcHRpb25zICYmIG9wdGlvbnMueG1sTW9kZSksXG5cdFx0XHRzdHJpY3Q6ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5zdHJpY3QpXG5cdFx0fTtcblxuXHRcdGlmKG9wdHMuc3RyaWN0KXtcblx0XHRcdGlmKHRva2VuLmxlbmd0aCA+IDEgfHwgdG9rZW4uc29tZShjb250YWluc1RyYXZlcnNhbCkpe1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJjb21wbGV4IHNlbGVjdG9ycyBpbiA6bm90IGFyZW4ndCBhbGxvd2VkIGluIHN0cmljdCBtb2RlXCIpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHZhciBmdW5jID0gY29tcGlsZVRva2VuKHRva2VuLCBvcHRzLCBjb250ZXh0KTtcblxuXHRcdGlmKGZ1bmMgPT09IGZhbHNlRnVuYykgcmV0dXJuIG5leHQ7XG5cdFx0aWYoZnVuYyA9PT0gdHJ1ZUZ1bmMpICByZXR1cm4gZmFsc2VGdW5jO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0cmV0dXJuICFmdW5jKGVsZW0pICYmIG5leHQoZWxlbSk7XG5cdFx0fTtcblx0fTtcblxuXHRmaWx0ZXJzLmhhcyA9IGZ1bmN0aW9uKG5leHQsIHRva2VuLCBvcHRpb25zKXtcblx0XHR2YXIgb3B0cyA9IHtcblx0XHRcdHhtbE1vZGU6ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy54bWxNb2RlKSxcblx0XHRcdHN0cmljdDogISEob3B0aW9ucyAmJiBvcHRpb25zLnN0cmljdClcblx0XHR9O1xuXG5cdFx0Ly9GSVhNRTogVXNlcyBhbiBhcnJheSBhcyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZWxlbWVudCAoc2lkZSBlZmZlY3RzKVxuXHRcdHZhciBjb250ZXh0ID0gdG9rZW4uc29tZShjb250YWluc1RyYXZlcnNhbCkgPyBbUExBQ0VIT0xERVJfRUxFTUVOVF0gOiBudWxsO1xuXG5cdFx0dmFyIGZ1bmMgPSBjb21waWxlVG9rZW4odG9rZW4sIG9wdHMsIGNvbnRleHQpO1xuXG5cdFx0aWYoZnVuYyA9PT0gZmFsc2VGdW5jKSByZXR1cm4gZmFsc2VGdW5jO1xuXHRcdGlmKGZ1bmMgPT09IHRydWVGdW5jKXtcblx0XHRcdHJldHVybiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdFx0cmV0dXJuIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oZWxlbSkuc29tZShhZGFwdGVyLmlzVGFnKSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRmdW5jID0gd3JhcChmdW5jKTtcblxuXHRcdGlmKGNvbnRleHQpe1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGhhcyhlbGVtKXtcblx0XHRcdFx0cmV0dXJuIG5leHQoZWxlbSkgJiYgKFxuXHRcdFx0XHRcdChjb250ZXh0WzBdID0gZWxlbSksIGFkYXB0ZXIuZXhpc3RzT25lKGZ1bmMsIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oZWxlbSkpXG5cdFx0XHRcdCk7XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdHJldHVybiBmdW5jdGlvbiBoYXMoZWxlbSl7XG5cdFx0XHRyZXR1cm4gbmV4dChlbGVtKSAmJiBhZGFwdGVyLmV4aXN0c09uZShmdW5jLCBhZGFwdGVyLmdldENoaWxkcmVuKGVsZW0pKTtcblx0XHR9O1xuXHR9O1xuXG5cdGZpbHRlcnMubWF0Y2hlcyA9IGZ1bmN0aW9uKG5leHQsIHRva2VuLCBvcHRpb25zLCBjb250ZXh0KXtcblx0XHR2YXIgb3B0cyA9IHtcblx0XHRcdHhtbE1vZGU6ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy54bWxNb2RlKSxcblx0XHRcdHN0cmljdDogISEob3B0aW9ucyAmJiBvcHRpb25zLnN0cmljdCksXG5cdFx0XHRyb290RnVuYzogbmV4dFxuXHRcdH07XG5cblx0XHRyZXR1cm4gY29tcGlsZVRva2VuKHRva2VuLCBvcHRzLCBjb250ZXh0KTtcblx0fTtcblxuXHRjb21waWxlLmNvbXBpbGVUb2tlbiA9IGNvbXBpbGVUb2tlbjtcblx0Y29tcGlsZS5jb21waWxlVW5zYWZlID0gY29tcGlsZVVuc2FmZTtcblx0Y29tcGlsZS5Qc2V1ZG9zID0gUHNldWRvcztcblxuXHRyZXR1cm4gY29tcGlsZTtcbn1cblxuXG4vKioqLyB9KSxcbi8qIDQxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gcGFyc2U7XG5cbnZhciByZV9uYW1lID0gL14oPzpcXFxcLnxbXFx3XFwtXFx1MDBjMC1cXHVGRkZGXSkrLyxcbiAgICByZV9lc2NhcGUgPSAvXFxcXChbXFxkYS1mXXsxLDZ9XFxzP3woXFxzKXwuKS9pZyxcbiAgICAvL21vZGlmaWVkIHZlcnNpb24gb2YgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9zaXp6bGUvYmxvYi9tYXN0ZXIvc3JjL3NpenpsZS5qcyNMODdcbiAgICByZV9hdHRyID0gL15cXHMqKCg/OlxcXFwufFtcXHdcXHUwMGMwLVxcdUZGRkZcXC1dKSspXFxzKig/OihcXFM/KT1cXHMqKD86KFsnXCJdKSguKj8pXFwzfCgjPyg/OlxcXFwufFtcXHdcXHUwMGMwLVxcdUZGRkZcXC1dKSopfCl8KVxccyooaSk/XFxdLztcblxudmFyIGFjdGlvblR5cGVzID0ge1xuXHRfX3Byb3RvX186IG51bGwsXG5cdFwidW5kZWZpbmVkXCI6IFwiZXhpc3RzXCIsXG5cdFwiXCI6ICBcImVxdWFsc1wiLFxuXHRcIn5cIjogXCJlbGVtZW50XCIsXG5cdFwiXlwiOiBcInN0YXJ0XCIsXG5cdFwiJFwiOiBcImVuZFwiLFxuXHRcIipcIjogXCJhbnlcIixcblx0XCIhXCI6IFwibm90XCIsXG5cdFwifFwiOiBcImh5cGhlblwiXG59O1xuXG52YXIgc2ltcGxlU2VsZWN0b3JzID0ge1xuXHRfX3Byb3RvX186IG51bGwsXG5cdFwiPlwiOiBcImNoaWxkXCIsXG5cdFwiPFwiOiBcInBhcmVudFwiLFxuXHRcIn5cIjogXCJzaWJsaW5nXCIsXG5cdFwiK1wiOiBcImFkamFjZW50XCJcbn07XG5cbnZhciBhdHRyaWJTZWxlY3RvcnMgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0XCIjXCI6IFtcImlkXCIsIFwiZXF1YWxzXCJdLFxuXHRcIi5cIjogW1wiY2xhc3NcIiwgXCJlbGVtZW50XCJdXG59O1xuXG4vL3BzZXVkb3MsIHdob3NlIGRhdGEtcHJvcGVydHkgaXMgcGFyc2VkIGFzIHdlbGxcbnZhciB1bnBhY2tQc2V1ZG9zID0ge1xuXHRfX3Byb3RvX186IG51bGwsXG5cdFwiaGFzXCI6IHRydWUsXG5cdFwibm90XCI6IHRydWUsXG5cdFwibWF0Y2hlc1wiOiB0cnVlXG59O1xuXG52YXIgc3RyaXBRdW90ZXNGcm9tUHNldWRvcyA9IHtcblx0X19wcm90b19fOiBudWxsLFxuXHRcImNvbnRhaW5zXCI6IHRydWUsXG5cdFwiaWNvbnRhaW5zXCI6IHRydWVcbn07XG5cbnZhciBxdW90ZXMgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0XCJcXFwiXCI6IHRydWUsXG5cdFwiJ1wiOiB0cnVlXG59O1xuXG4vL3VuZXNjYXBlIGZ1bmN0aW9uIHRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9zaXp6bGUvYmxvYi9tYXN0ZXIvc3JjL3NpenpsZS5qcyNMMTM5XG5mdW5jdGlvbiBmdW5lc2NhcGUoIF8sIGVzY2FwZWQsIGVzY2FwZWRXaGl0ZXNwYWNlICkge1xuXHR2YXIgaGlnaCA9IFwiMHhcIiArIGVzY2FwZWQgLSAweDEwMDAwO1xuXHQvLyBOYU4gbWVhbnMgbm9uLWNvZGVwb2ludFxuXHQvLyBTdXBwb3J0OiBGaXJlZm94XG5cdC8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgK1wiMHhcIlxuXHRyZXR1cm4gaGlnaCAhPT0gaGlnaCB8fCBlc2NhcGVkV2hpdGVzcGFjZSA/XG5cdFx0ZXNjYXBlZCA6XG5cdFx0Ly8gQk1QIGNvZGVwb2ludFxuXHRcdGhpZ2ggPCAwID9cblx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggKyAweDEwMDAwICkgOlxuXHRcdFx0Ly8gU3VwcGxlbWVudGFsIFBsYW5lIGNvZGVwb2ludCAoc3Vycm9nYXRlIHBhaXIpXG5cdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoID4+IDEwIHwgMHhEODAwLCBoaWdoICYgMHgzRkYgfCAweERDMDAgKTtcbn1cblxuZnVuY3Rpb24gdW5lc2NhcGVDU1Moc3RyKXtcblx0cmV0dXJuIHN0ci5yZXBsYWNlKHJlX2VzY2FwZSwgZnVuZXNjYXBlKTtcbn1cblxuZnVuY3Rpb24gaXNXaGl0ZXNwYWNlKGMpe1xuXHRyZXR1cm4gYyA9PT0gXCIgXCIgfHwgYyA9PT0gXCJcXG5cIiB8fCBjID09PSBcIlxcdFwiIHx8IGMgPT09IFwiXFxmXCIgfHwgYyA9PT0gXCJcXHJcIjtcbn1cblxuZnVuY3Rpb24gcGFyc2Uoc2VsZWN0b3IsIG9wdGlvbnMpe1xuXHR2YXIgc3Vic2VsZWN0cyA9IFtdO1xuXG5cdHNlbGVjdG9yID0gcGFyc2VTZWxlY3RvcihzdWJzZWxlY3RzLCBzZWxlY3RvciArIFwiXCIsIG9wdGlvbnMpO1xuXG5cdGlmKHNlbGVjdG9yICE9PSBcIlwiKXtcblx0XHR0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJVbm1hdGNoZWQgc2VsZWN0b3I6IFwiICsgc2VsZWN0b3IpO1xuXHR9XG5cblx0cmV0dXJuIHN1YnNlbGVjdHM7XG59XG5cbmZ1bmN0aW9uIHBhcnNlU2VsZWN0b3Ioc3Vic2VsZWN0cywgc2VsZWN0b3IsIG9wdGlvbnMpe1xuXHR2YXIgdG9rZW5zID0gW10sXG5cdFx0c2F3V1MgPSBmYWxzZSxcblx0XHRkYXRhLCBmaXJzdENoYXIsIG5hbWUsIHF1b3Q7XG5cblx0ZnVuY3Rpb24gZ2V0TmFtZSgpe1xuXHRcdHZhciBzdWIgPSBzZWxlY3Rvci5tYXRjaChyZV9uYW1lKVswXTtcblx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cihzdWIubGVuZ3RoKTtcblx0XHRyZXR1cm4gdW5lc2NhcGVDU1Moc3ViKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHN0cmlwV2hpdGVzcGFjZShzdGFydCl7XG5cdFx0d2hpbGUoaXNXaGl0ZXNwYWNlKHNlbGVjdG9yLmNoYXJBdChzdGFydCkpKSBzdGFydCsrO1xuXHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKHN0YXJ0KTtcblx0fVxuXG5cdHN0cmlwV2hpdGVzcGFjZSgwKTtcblxuXHR3aGlsZShzZWxlY3RvciAhPT0gXCJcIil7XG5cdFx0Zmlyc3RDaGFyID0gc2VsZWN0b3IuY2hhckF0KDApO1xuXG5cdFx0aWYoaXNXaGl0ZXNwYWNlKGZpcnN0Q2hhcikpe1xuXHRcdFx0c2F3V1MgPSB0cnVlO1xuXHRcdFx0c3RyaXBXaGl0ZXNwYWNlKDEpO1xuXHRcdH0gZWxzZSBpZihmaXJzdENoYXIgaW4gc2ltcGxlU2VsZWN0b3JzKXtcblx0XHRcdHRva2Vucy5wdXNoKHt0eXBlOiBzaW1wbGVTZWxlY3RvcnNbZmlyc3RDaGFyXX0pO1xuXHRcdFx0c2F3V1MgPSBmYWxzZTtcblxuXHRcdFx0c3RyaXBXaGl0ZXNwYWNlKDEpO1xuXHRcdH0gZWxzZSBpZihmaXJzdENoYXIgPT09IFwiLFwiKXtcblx0XHRcdGlmKHRva2Vucy5sZW5ndGggPT09IDApe1xuXHRcdFx0XHR0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJlbXB0eSBzdWItc2VsZWN0b3JcIik7XG5cdFx0XHR9XG5cdFx0XHRzdWJzZWxlY3RzLnB1c2godG9rZW5zKTtcblx0XHRcdHRva2VucyA9IFtdO1xuXHRcdFx0c2F3V1MgPSBmYWxzZTtcblx0XHRcdHN0cmlwV2hpdGVzcGFjZSgxKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYoc2F3V1Mpe1xuXHRcdFx0XHRpZih0b2tlbnMubGVuZ3RoID4gMCl7XG5cdFx0XHRcdFx0dG9rZW5zLnB1c2goe3R5cGU6IFwiZGVzY2VuZGFudFwifSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c2F3V1MgPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0aWYoZmlyc3RDaGFyID09PSBcIipcIil7XG5cdFx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKDEpO1xuXHRcdFx0XHR0b2tlbnMucHVzaCh7dHlwZTogXCJ1bml2ZXJzYWxcIn0pO1xuXHRcdFx0fSBlbHNlIGlmKGZpcnN0Q2hhciBpbiBhdHRyaWJTZWxlY3RvcnMpe1xuXHRcdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cigxKTtcblx0XHRcdFx0dG9rZW5zLnB1c2goe1xuXHRcdFx0XHRcdHR5cGU6IFwiYXR0cmlidXRlXCIsXG5cdFx0XHRcdFx0bmFtZTogYXR0cmliU2VsZWN0b3JzW2ZpcnN0Q2hhcl1bMF0sXG5cdFx0XHRcdFx0YWN0aW9uOiBhdHRyaWJTZWxlY3RvcnNbZmlyc3RDaGFyXVsxXSxcblx0XHRcdFx0XHR2YWx1ZTogZ2V0TmFtZSgpLFxuXHRcdFx0XHRcdGlnbm9yZUNhc2U6IGZhbHNlXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGlmKGZpcnN0Q2hhciA9PT0gXCJbXCIpe1xuXHRcdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cigxKTtcblx0XHRcdFx0ZGF0YSA9IHNlbGVjdG9yLm1hdGNoKHJlX2F0dHIpO1xuXHRcdFx0XHRpZighZGF0YSl7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IFN5bnRheEVycm9yKFwiTWFsZm9ybWVkIGF0dHJpYnV0ZSBzZWxlY3RvcjogXCIgKyBzZWxlY3Rvcik7XG5cdFx0XHRcdH1cblx0XHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHIoZGF0YVswXS5sZW5ndGgpO1xuXHRcdFx0XHRuYW1lID0gdW5lc2NhcGVDU1MoZGF0YVsxXSk7XG5cblx0XHRcdFx0aWYoXG5cdFx0XHRcdFx0IW9wdGlvbnMgfHwgKFxuXHRcdFx0XHRcdFx0XCJsb3dlckNhc2VBdHRyaWJ1dGVOYW1lc1wiIGluIG9wdGlvbnMgP1xuXHRcdFx0XHRcdFx0XHRvcHRpb25zLmxvd2VyQ2FzZUF0dHJpYnV0ZU5hbWVzIDpcblx0XHRcdFx0XHRcdFx0IW9wdGlvbnMueG1sTW9kZVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KXtcblx0XHRcdFx0XHRuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dG9rZW5zLnB1c2goe1xuXHRcdFx0XHRcdHR5cGU6IFwiYXR0cmlidXRlXCIsXG5cdFx0XHRcdFx0bmFtZTogbmFtZSxcblx0XHRcdFx0XHRhY3Rpb246IGFjdGlvblR5cGVzW2RhdGFbMl1dLFxuXHRcdFx0XHRcdHZhbHVlOiB1bmVzY2FwZUNTUyhkYXRhWzRdIHx8IGRhdGFbNV0gfHwgXCJcIiksXG5cdFx0XHRcdFx0aWdub3JlQ2FzZTogISFkYXRhWzZdXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHR9IGVsc2UgaWYoZmlyc3RDaGFyID09PSBcIjpcIil7XG5cdFx0XHRcdGlmKHNlbGVjdG9yLmNoYXJBdCgxKSA9PT0gXCI6XCIpe1xuXHRcdFx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKDIpO1xuXHRcdFx0XHRcdHRva2Vucy5wdXNoKHt0eXBlOiBcInBzZXVkby1lbGVtZW50XCIsIG5hbWU6IGdldE5hbWUoKS50b0xvd2VyQ2FzZSgpfSk7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cigxKTtcblxuXHRcdFx0XHRuYW1lID0gZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdGRhdGEgPSBudWxsO1xuXG5cdFx0XHRcdGlmKHNlbGVjdG9yLmNoYXJBdCgwKSA9PT0gXCIoXCIpe1xuXHRcdFx0XHRcdGlmKG5hbWUgaW4gdW5wYWNrUHNldWRvcyl7XG5cdFx0XHRcdFx0XHRxdW90ID0gc2VsZWN0b3IuY2hhckF0KDEpO1xuXHRcdFx0XHRcdFx0dmFyIHF1b3RlZCA9IHF1b3QgaW4gcXVvdGVzO1xuXG5cdFx0XHRcdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cihxdW90ZWQgKyAxKTtcblxuXHRcdFx0XHRcdFx0ZGF0YSA9IFtdO1xuXHRcdFx0XHRcdFx0c2VsZWN0b3IgPSBwYXJzZVNlbGVjdG9yKGRhdGEsIHNlbGVjdG9yLCBvcHRpb25zKTtcblxuXHRcdFx0XHRcdFx0aWYocXVvdGVkKXtcblx0XHRcdFx0XHRcdFx0aWYoc2VsZWN0b3IuY2hhckF0KDApICE9PSBxdW90KXtcblx0XHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJ1bm1hdGNoZWQgcXVvdGVzIGluIDpcIiArIG5hbWUpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKDEpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmKHNlbGVjdG9yLmNoYXJBdCgwKSAhPT0gXCIpXCIpe1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJtaXNzaW5nIGNsb3NpbmcgcGFyZW50aGVzaXMgaW4gOlwiICsgbmFtZSArIFwiIFwiICsgc2VsZWN0b3IpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cigxKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dmFyIHBvcyA9IDEsIGNvdW50ZXIgPSAxO1xuXG5cdFx0XHRcdFx0XHRmb3IoOyBjb3VudGVyID4gMCAmJiBwb3MgPCBzZWxlY3Rvci5sZW5ndGg7IHBvcysrKXtcblx0XHRcdFx0XHRcdFx0aWYoc2VsZWN0b3IuY2hhckF0KHBvcykgPT09IFwiKFwiKSBjb3VudGVyKys7XG5cdFx0XHRcdFx0XHRcdGVsc2UgaWYoc2VsZWN0b3IuY2hhckF0KHBvcykgPT09IFwiKVwiKSBjb3VudGVyLS07XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmKGNvdW50ZXIpe1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJwYXJlbnRoZXNpcyBub3QgbWF0Y2hlZFwiKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0ZGF0YSA9IHNlbGVjdG9yLnN1YnN0cigxLCBwb3MgLSAyKTtcblx0XHRcdFx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKHBvcyk7XG5cblx0XHRcdFx0XHRcdGlmKG5hbWUgaW4gc3RyaXBRdW90ZXNGcm9tUHNldWRvcyl7XG5cdFx0XHRcdFx0XHRcdHF1b3QgPSBkYXRhLmNoYXJBdCgwKTtcblxuXHRcdFx0XHRcdFx0XHRpZihxdW90ID09PSBkYXRhLnNsaWNlKC0xKSAmJiBxdW90IGluIHF1b3Rlcyl7XG5cdFx0XHRcdFx0XHRcdFx0ZGF0YSA9IGRhdGEuc2xpY2UoMSwgLTEpO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0ZGF0YSA9IHVuZXNjYXBlQ1NTKGRhdGEpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRva2Vucy5wdXNoKHt0eXBlOiBcInBzZXVkb1wiLCBuYW1lOiBuYW1lLCBkYXRhOiBkYXRhfSk7XG5cdFx0XHR9IGVsc2UgaWYocmVfbmFtZS50ZXN0KHNlbGVjdG9yKSl7XG5cdFx0XHRcdG5hbWUgPSBnZXROYW1lKCk7XG5cblx0XHRcdFx0aWYoIW9wdGlvbnMgfHwgKFwibG93ZXJDYXNlVGFnc1wiIGluIG9wdGlvbnMgPyBvcHRpb25zLmxvd2VyQ2FzZVRhZ3MgOiAhb3B0aW9ucy54bWxNb2RlKSl7XG5cdFx0XHRcdFx0bmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRva2Vucy5wdXNoKHt0eXBlOiBcInRhZ1wiLCBuYW1lOiBuYW1lfSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZih0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV0udHlwZSA9PT0gXCJkZXNjZW5kYW50XCIpe1xuXHRcdFx0XHRcdHRva2Vucy5wb3AoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhZGRUb2tlbihzdWJzZWxlY3RzLCB0b2tlbnMpO1xuXHRcdFx0XHRyZXR1cm4gc2VsZWN0b3I7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0YWRkVG9rZW4oc3Vic2VsZWN0cywgdG9rZW5zKTtcblxuXHRyZXR1cm4gc2VsZWN0b3I7XG59XG5cbmZ1bmN0aW9uIGFkZFRva2VuKHN1YnNlbGVjdHMsIHRva2Vucyl7XG5cdGlmKHN1YnNlbGVjdHMubGVuZ3RoID4gMCAmJiB0b2tlbnMubGVuZ3RoID09PSAwKXtcblx0XHR0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJlbXB0eSBzdWItc2VsZWN0b3JcIik7XG5cdH1cblxuXHRzdWJzZWxlY3RzLnB1c2godG9rZW5zKTtcbn1cblxuXG4vKioqLyB9KSxcbi8qIDQyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gc29ydEJ5UHJvY2VkdXJlO1xuXG4vKlxuXHRzb3J0IHRoZSBwYXJ0cyBvZiB0aGUgcGFzc2VkIHNlbGVjdG9yLFxuXHRhcyB0aGVyZSBpcyBwb3RlbnRpYWwgZm9yIG9wdGltaXphdGlvblxuXHQoc29tZSB0eXBlcyBvZiBzZWxlY3RvcnMgYXJlIGZhc3RlciB0aGFuIG90aGVycylcbiovXG5cbnZhciBwcm9jZWR1cmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KTtcblxudmFyIGF0dHJpYnV0ZXMgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0ZXhpc3RzOiAxMCxcblx0ZXF1YWxzOiA4LFxuXHRub3Q6IDcsXG5cdHN0YXJ0OiA2LFxuXHRlbmQ6IDYsXG5cdGFueTogNSxcblx0aHlwaGVuOiA0LFxuXHRlbGVtZW50OiA0XG59O1xuXG5mdW5jdGlvbiBzb3J0QnlQcm9jZWR1cmUoYXJyKXtcblx0dmFyIHByb2NzID0gYXJyLm1hcChnZXRQcm9jZWR1cmUpO1xuXHRmb3IodmFyIGkgPSAxOyBpIDwgYXJyLmxlbmd0aDsgaSsrKXtcblx0XHR2YXIgcHJvY05ldyA9IHByb2NzW2ldO1xuXG5cdFx0aWYocHJvY05ldyA8IDApIGNvbnRpbnVlO1xuXG5cdFx0Zm9yKHZhciBqID0gaSAtIDE7IGogPj0gMCAmJiBwcm9jTmV3IDwgcHJvY3Nbal07IGotLSl7XG5cdFx0XHR2YXIgdG9rZW4gPSBhcnJbaiArIDFdO1xuXHRcdFx0YXJyW2ogKyAxXSA9IGFycltqXTtcblx0XHRcdGFycltqXSA9IHRva2VuO1xuXHRcdFx0cHJvY3NbaiArIDFdID0gcHJvY3Nbal07XG5cdFx0XHRwcm9jc1tqXSA9IHByb2NOZXc7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGdldFByb2NlZHVyZSh0b2tlbil7XG5cdHZhciBwcm9jID0gcHJvY2VkdXJlW3Rva2VuLnR5cGVdO1xuXG5cdGlmKHByb2MgPT09IHByb2NlZHVyZS5hdHRyaWJ1dGUpe1xuXHRcdHByb2MgPSBhdHRyaWJ1dGVzW3Rva2VuLmFjdGlvbl07XG5cblx0XHRpZihwcm9jID09PSBhdHRyaWJ1dGVzLmVxdWFscyAmJiB0b2tlbi5uYW1lID09PSBcImlkXCIpe1xuXHRcdFx0Ly9wcmVmZXIgSUQgc2VsZWN0b3JzIChlZy4gI0lEKVxuXHRcdFx0cHJvYyA9IDk7XG5cdFx0fVxuXG5cdFx0aWYodG9rZW4uaWdub3JlQ2FzZSl7XG5cdFx0XHQvL2lnbm9yZUNhc2UgYWRkcyBzb21lIG92ZXJoZWFkLCBwcmVmZXIgXCJub3JtYWxcIiB0b2tlblxuXHRcdFx0Ly90aGlzIGlzIGEgYmluYXJ5IG9wZXJhdGlvbiwgdG8gZW5zdXJlIGl0J3Mgc3RpbGwgYW4gaW50XG5cdFx0XHRwcm9jID4+PSAxO1xuXHRcdH1cblx0fSBlbHNlIGlmKHByb2MgPT09IHByb2NlZHVyZS5wc2V1ZG8pe1xuXHRcdGlmKCF0b2tlbi5kYXRhKXtcblx0XHRcdHByb2MgPSAzO1xuXHRcdH0gZWxzZSBpZih0b2tlbi5uYW1lID09PSBcImhhc1wiIHx8IHRva2VuLm5hbWUgPT09IFwiY29udGFpbnNcIil7XG5cdFx0XHRwcm9jID0gMDsgLy9leHBlbnNpdmUgaW4gYW55IGNhc2Vcblx0XHR9IGVsc2UgaWYodG9rZW4ubmFtZSA9PT0gXCJtYXRjaGVzXCIgfHwgdG9rZW4ubmFtZSA9PT0gXCJub3RcIil7XG5cdFx0XHRwcm9jID0gMDtcblx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCB0b2tlbi5kYXRhLmxlbmd0aDsgaSsrKXtcblx0XHRcdFx0Ly9UT0RPIGJldHRlciBoYW5kbGluZyBvZiBjb21wbGV4IHNlbGVjdG9yc1xuXHRcdFx0XHRpZih0b2tlbi5kYXRhW2ldLmxlbmd0aCAhPT0gMSkgY29udGludWU7XG5cdFx0XHRcdHZhciBjdXIgPSBnZXRQcm9jZWR1cmUodG9rZW4uZGF0YVtpXVswXSk7XG5cdFx0XHRcdC8vYXZvaWQgZXhlY3V0aW5nIDpoYXMgb3IgOmNvbnRhaW5zXG5cdFx0XHRcdGlmKGN1ciA9PT0gMCl7XG5cdFx0XHRcdFx0cHJvYyA9IDA7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYoY3VyID4gcHJvYykgcHJvYyA9IGN1cjtcblx0XHRcdH1cblx0XHRcdGlmKHRva2VuLmRhdGEubGVuZ3RoID4gMSAmJiBwcm9jID4gMCkgcHJvYyAtPSAxO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9jID0gMTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHByb2M7XG59XG5cblxuLyoqKi8gfSksXG4vKiA0MyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgU2V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NCk7XG52YXIgYXR0cmlidXRlRmFjdG9yeSA9IF9fd2VicGFja19yZXF1aXJlX18oMjMpO1xuXG5mdW5jdGlvbiBnZW5lcmFsRmFjdG9yeShhZGFwdGVyLCBQc2V1ZG9zKXtcblx0Lypcblx0XHRhbGwgYXZhaWxhYmxlIHJ1bGVzXG5cdCovXG5cdHJldHVybiB7XG5cdFx0X19wcm90b19fOiBudWxsLFxuXG5cdFx0YXR0cmlidXRlOiBhdHRyaWJ1dGVGYWN0b3J5KGFkYXB0ZXIpLmNvbXBpbGUsXG5cdFx0cHNldWRvOiBQc2V1ZG9zLmNvbXBpbGUsXG5cblx0XHQvL3RhZ3Ncblx0XHR0YWc6IGZ1bmN0aW9uKG5leHQsIGRhdGEpe1xuXHRcdFx0dmFyIG5hbWUgPSBkYXRhLm5hbWU7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gdGFnKGVsZW0pe1xuXHRcdFx0XHRyZXR1cm4gYWRhcHRlci5nZXROYW1lKGVsZW0pID09PSBuYW1lICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHQvL3RyYXZlcnNhbFxuXHRcdGRlc2NlbmRhbnQ6IGZ1bmN0aW9uKG5leHQpe1xuXHRcdFx0dmFyIGlzRmFsc2VDYWNoZSA9IG5ldyBTZXQoKTtcblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGRlc2NlbmRhbnQoZWxlbSl7XG5cdFx0XHRcdHZhciBmb3VuZCA9IGZhbHNlO1xuXG5cdFx0XHRcdHdoaWxlKCFmb3VuZCAmJiAoZWxlbSA9IGFkYXB0ZXIuZ2V0UGFyZW50KGVsZW0pKSl7XG5cdFx0XHRcdFx0aWYoIWlzRmFsc2VDYWNoZS5oYXMoZWxlbSkpe1xuXHRcdFx0XHRcdFx0Zm91bmQgPSBuZXh0KGVsZW0pO1xuXHRcdFx0XHRcdFx0aWYoIWZvdW5kKXtcblx0XHRcdFx0XHRcdFx0aXNGYWxzZUNhY2hlLmFkZChlbGVtKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZm91bmQ7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0X2ZsZXhpYmxlRGVzY2VuZGFudDogZnVuY3Rpb24obmV4dCl7XG5cdFx0XHQvLyBJbmNsdWRlIGVsZW1lbnQgaXRzZWxmLCBvbmx5IHVzZWQgd2hpbGUgcXVlcnlpbmcgYW4gYXJyYXlcblx0XHRcdHJldHVybiBmdW5jdGlvbiBkZXNjZW5kYW50KGVsZW0pe1xuXG5cdFx0XHRcdHZhciBmb3VuZCA9IG5leHQoZWxlbSk7XG5cblx0XHRcdFx0d2hpbGUoIWZvdW5kICYmIChlbGVtID0gYWRhcHRlci5nZXRQYXJlbnQoZWxlbSkpKXtcblx0XHRcdFx0XHRmb3VuZCA9IG5leHQoZWxlbSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZm91bmQ7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0cGFyZW50OiBmdW5jdGlvbihuZXh0LCBkYXRhLCBvcHRpb25zKXtcblx0XHRcdGlmKG9wdGlvbnMgJiYgb3B0aW9ucy5zdHJpY3QpIHRocm93IG5ldyBFcnJvcihcIlBhcmVudCBzZWxlY3RvciBpc24ndCBwYXJ0IG9mIENTUzNcIik7XG5cblx0XHRcdHJldHVybiBmdW5jdGlvbiBwYXJlbnQoZWxlbSl7XG5cdFx0XHRcdHJldHVybiBhZGFwdGVyLmdldENoaWxkcmVuKGVsZW0pLnNvbWUodGVzdCk7XG5cdFx0XHR9O1xuXG5cdFx0XHRmdW5jdGlvbiB0ZXN0KGVsZW0pe1xuXHRcdFx0XHRyZXR1cm4gYWRhcHRlci5pc1RhZyhlbGVtKSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Y2hpbGQ6IGZ1bmN0aW9uKG5leHQpe1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGNoaWxkKGVsZW0pe1xuXHRcdFx0XHR2YXIgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoZWxlbSk7XG5cdFx0XHRcdHJldHVybiAhIXBhcmVudCAmJiBuZXh0KHBhcmVudCk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0c2libGluZzogZnVuY3Rpb24obmV4dCl7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gc2libGluZyhlbGVtKXtcblx0XHRcdFx0dmFyIHNpYmxpbmdzID0gYWRhcHRlci5nZXRTaWJsaW5ncyhlbGVtKTtcblxuXHRcdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgc2libGluZ3MubGVuZ3RoOyBpKyspe1xuXHRcdFx0XHRcdGlmKGFkYXB0ZXIuaXNUYWcoc2libGluZ3NbaV0pKXtcblx0XHRcdFx0XHRcdGlmKHNpYmxpbmdzW2ldID09PSBlbGVtKSBicmVhaztcblx0XHRcdFx0XHRcdGlmKG5leHQoc2libGluZ3NbaV0pKSByZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YWRqYWNlbnQ6IGZ1bmN0aW9uKG5leHQpe1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGFkamFjZW50KGVsZW0pe1xuXHRcdFx0XHR2YXIgc2libGluZ3MgPSBhZGFwdGVyLmdldFNpYmxpbmdzKGVsZW0pLFxuXHRcdFx0XHRcdGxhc3RFbGVtZW50O1xuXG5cdFx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzaWJsaW5ncy5sZW5ndGg7IGkrKyl7XG5cdFx0XHRcdFx0aWYoYWRhcHRlci5pc1RhZyhzaWJsaW5nc1tpXSkpe1xuXHRcdFx0XHRcdFx0aWYoc2libGluZ3NbaV0gPT09IGVsZW0pIGJyZWFrO1xuXHRcdFx0XHRcdFx0bGFzdEVsZW1lbnQgPSBzaWJsaW5nc1tpXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gISFsYXN0RWxlbWVudCAmJiBuZXh0KGxhc3RFbGVtZW50KTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHR1bml2ZXJzYWw6IGZ1bmN0aW9uKG5leHQpe1xuXHRcdFx0cmV0dXJuIG5leHQ7XG5cdFx0fVxuXHR9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdlbmVyYWxGYWN0b3J5O1xuXG5cbi8qKiovIH0pLFxuLyogNDQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1KSgpID8gU2V0IDogX193ZWJwYWNrX3JlcXVpcmVfXyg0Nik7XG5cblxuLyoqKi8gfSksXG4vKiA0NSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHNldCwgaXRlcmF0b3IsIHJlc3VsdDtcblx0aWYgKHR5cGVvZiBTZXQgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcblx0c2V0ID0gbmV3IFNldChbJ3JheicsICdkd2EnLCAndHJ6eSddKTtcblx0aWYgKFN0cmluZyhzZXQpICE9PSAnW29iamVjdCBTZXRdJykgcmV0dXJuIGZhbHNlO1xuXHRpZiAoc2V0LnNpemUgIT09IDMpIHJldHVybiBmYWxzZTtcblx0aWYgKHR5cGVvZiBzZXQuYWRkICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG5cdGlmICh0eXBlb2Ygc2V0LmNsZWFyICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG5cdGlmICh0eXBlb2Ygc2V0LmRlbGV0ZSAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuXHRpZiAodHlwZW9mIHNldC5lbnRyaWVzICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG5cdGlmICh0eXBlb2Ygc2V0LmZvckVhY2ggIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcblx0aWYgKHR5cGVvZiBzZXQuaGFzICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG5cdGlmICh0eXBlb2Ygc2V0LmtleXMgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcblx0aWYgKHR5cGVvZiBzZXQudmFsdWVzICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG5cblx0aXRlcmF0b3IgPSBzZXQudmFsdWVzKCk7XG5cdHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcblx0aWYgKHJlc3VsdC5kb25lICE9PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAocmVzdWx0LnZhbHVlICE9PSAncmF6JykgcmV0dXJuIGZhbHNlO1xuXG5cdHJldHVybiB0cnVlO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDQ2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBjbGVhciAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTYpXG4gICwgZUluZGV4T2YgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3KVxuICAsIHNldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KVxuICAsIGNhbGxhYmxlICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVxuICAsIGQgICAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKVxuICAsIGVlICAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSlcbiAgLCBTeW1ib2wgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMilcbiAgLCBpdGVyYXRvciAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjIpXG4gICwgZm9yT2YgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcxKVxuICAsIEl0ZXJhdG9yICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NClcbiAgLCBpc05hdGl2ZSAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oODUpXG5cbiAgLCBjYWxsID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGxcbiAgLCBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSwgZ2V0UHJvdG90eXBlT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2ZcbiAgLCBTZXRQb2x5LCBnZXRWYWx1ZXMsIE5hdGl2ZVNldDtcblxuaWYgKGlzTmF0aXZlKSBOYXRpdmVTZXQgPSBTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gU2V0UG9seSA9IGZ1bmN0aW9uIFNldCgvKml0ZXJhYmxlKi8pIHtcblx0dmFyIGl0ZXJhYmxlID0gYXJndW1lbnRzWzBdLCBzZWxmO1xuXHRpZiAoISh0aGlzIGluc3RhbmNlb2YgU2V0UG9seSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NvbnN0cnVjdG9yIHJlcXVpcmVzIFxcJ25ld1xcJycpO1xuXHRpZiAoaXNOYXRpdmUgJiYgc2V0UHJvdG90eXBlT2YpIHNlbGYgPSBzZXRQcm90b3R5cGVPZihuZXcgTmF0aXZlU2V0KCksIGdldFByb3RvdHlwZU9mKHRoaXMpKTtcblx0ZWxzZSBzZWxmID0gdGhpcztcblx0aWYgKGl0ZXJhYmxlICE9IG51bGwpIGl0ZXJhdG9yKGl0ZXJhYmxlKTtcblx0ZGVmaW5lUHJvcGVydHkoc2VsZiwgJ19fc2V0RGF0YV9fJywgZCgnYycsIFtdKSk7XG5cdGlmICghaXRlcmFibGUpIHJldHVybiBzZWxmO1xuXHRmb3JPZihpdGVyYWJsZSwgZnVuY3Rpb24gKHZhbHVlKSB7XG5cdFx0aWYgKGVJbmRleE9mLmNhbGwodGhpcywgdmFsdWUpICE9PSAtMSkgcmV0dXJuO1xuXHRcdHRoaXMucHVzaCh2YWx1ZSk7XG5cdH0sIHNlbGYuX19zZXREYXRhX18pO1xuXHRyZXR1cm4gc2VsZjtcbn07XG5cbmlmIChpc05hdGl2ZSkge1xuXHRpZiAoc2V0UHJvdG90eXBlT2YpIHNldFByb3RvdHlwZU9mKFNldFBvbHksIE5hdGl2ZVNldCk7XG5cdFNldFBvbHkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShOYXRpdmVTZXQucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiBkKFNldFBvbHkpIH0pO1xufVxuXG5lZShPYmplY3QuZGVmaW5lUHJvcGVydGllcyhTZXRQb2x5LnByb3RvdHlwZSwge1xuXHRhZGQ6IGQoZnVuY3Rpb24gKHZhbHVlKSB7XG5cdFx0aWYgKHRoaXMuaGFzKHZhbHVlKSkgcmV0dXJuIHRoaXM7XG5cdFx0dGhpcy5lbWl0KCdfYWRkJywgdGhpcy5fX3NldERhdGFfXy5wdXNoKHZhbHVlKSAtIDEsIHZhbHVlKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSksXG5cdGNsZWFyOiBkKGZ1bmN0aW9uICgpIHtcblx0XHRpZiAoIXRoaXMuX19zZXREYXRhX18ubGVuZ3RoKSByZXR1cm47XG5cdFx0Y2xlYXIuY2FsbCh0aGlzLl9fc2V0RGF0YV9fKTtcblx0XHR0aGlzLmVtaXQoJ19jbGVhcicpO1xuXHR9KSxcblx0ZGVsZXRlOiBkKGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRcdHZhciBpbmRleCA9IGVJbmRleE9mLmNhbGwodGhpcy5fX3NldERhdGFfXywgdmFsdWUpO1xuXHRcdGlmIChpbmRleCA9PT0gLTEpIHJldHVybiBmYWxzZTtcblx0XHR0aGlzLl9fc2V0RGF0YV9fLnNwbGljZShpbmRleCwgMSk7XG5cdFx0dGhpcy5lbWl0KCdfZGVsZXRlJywgaW5kZXgsIHZhbHVlKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSksXG5cdGVudHJpZXM6IGQoZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsICdrZXkrdmFsdWUnKTsgfSksXG5cdGZvckVhY2g6IGQoZnVuY3Rpb24gKGNiLyosIHRoaXNBcmcqLykge1xuXHRcdHZhciB0aGlzQXJnID0gYXJndW1lbnRzWzFdLCBpdGVyYXRvciwgcmVzdWx0LCB2YWx1ZTtcblx0XHRjYWxsYWJsZShjYik7XG5cdFx0aXRlcmF0b3IgPSB0aGlzLnZhbHVlcygpO1xuXHRcdHJlc3VsdCA9IGl0ZXJhdG9yLl9uZXh0KCk7XG5cdFx0d2hpbGUgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR2YWx1ZSA9IGl0ZXJhdG9yLl9yZXNvbHZlKHJlc3VsdCk7XG5cdFx0XHRjYWxsLmNhbGwoY2IsIHRoaXNBcmcsIHZhbHVlLCB2YWx1ZSwgdGhpcyk7XG5cdFx0XHRyZXN1bHQgPSBpdGVyYXRvci5fbmV4dCgpO1xuXHRcdH1cblx0fSksXG5cdGhhczogZChmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRyZXR1cm4gKGVJbmRleE9mLmNhbGwodGhpcy5fX3NldERhdGFfXywgdmFsdWUpICE9PSAtMSk7XG5cdH0pLFxuXHRrZXlzOiBkKGdldFZhbHVlcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMudmFsdWVzKCk7IH0pLFxuXHRzaXplOiBkLmdzKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX19zZXREYXRhX18ubGVuZ3RoOyB9KSxcblx0dmFsdWVzOiBkKGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzKTsgfSksXG5cdHRvU3RyaW5nOiBkKGZ1bmN0aW9uICgpIHsgcmV0dXJuICdbb2JqZWN0IFNldF0nOyB9KVxufSkpO1xuZGVmaW5lUHJvcGVydHkoU2V0UG9seS5wcm90b3R5cGUsIFN5bWJvbC5pdGVyYXRvciwgZChnZXRWYWx1ZXMpKTtcbmRlZmluZVByb3BlcnR5KFNldFBvbHkucHJvdG90eXBlLCBTeW1ib2wudG9TdHJpbmdUYWcsIGQoJ2MnLCAnU2V0JykpO1xuXG5cbi8qKiovIH0pLFxuLyogNDcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIG51bWJlcklzTmFOICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OClcbiAgLCB0b1Bvc0ludCAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTgpXG4gICwgdmFsdWUgICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApXG4gICwgaW5kZXhPZiAgICAgICAgICAgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZlxuICAsIG9iakhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eVxuICAsIGFicyAgICAgICAgICAgICAgID0gTWF0aC5hYnNcbiAgLCBmbG9vciAgICAgICAgICAgICA9IE1hdGguZmxvb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNlYXJjaEVsZW1lbnQgLyosIGZyb21JbmRleCovKSB7XG5cdHZhciBpLCBsZW5ndGgsIGZyb21JbmRleCwgdmFsO1xuXHRpZiAoIW51bWJlcklzTmFOKHNlYXJjaEVsZW1lbnQpKSByZXR1cm4gaW5kZXhPZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG5cdGxlbmd0aCA9IHRvUG9zSW50KHZhbHVlKHRoaXMpLmxlbmd0aCk7XG5cdGZyb21JbmRleCA9IGFyZ3VtZW50c1sxXTtcblx0aWYgKGlzTmFOKGZyb21JbmRleCkpIGZyb21JbmRleCA9IDA7XG5cdGVsc2UgaWYgKGZyb21JbmRleCA+PSAwKSBmcm9tSW5kZXggPSBmbG9vcihmcm9tSW5kZXgpO1xuXHRlbHNlIGZyb21JbmRleCA9IHRvUG9zSW50KHRoaXMubGVuZ3RoKSAtIGZsb29yKGFicyhmcm9tSW5kZXgpKTtcblxuXHRmb3IgKGkgPSBmcm9tSW5kZXg7IGkgPCBsZW5ndGg7ICsraSkge1xuXHRcdGlmIChvYmpIYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsIGkpKSB7XG5cdFx0XHR2YWwgPSB0aGlzW2ldO1xuXHRcdFx0aWYgKG51bWJlcklzTmFOKHZhbCkpIHJldHVybiBpOyAvLyBKc2xpbnQ6IGlnbm9yZVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gLTE7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNDggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5KSgpXG5cdD8gTnVtYmVyLmlzTmFOXG5cdDogX193ZWJwYWNrX3JlcXVpcmVfXyg1MCk7XG5cblxuLyoqKi8gfSksXG4vKiA0OSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIG51bWJlcklzTmFOID0gTnVtYmVyLmlzTmFOO1xuXHRpZiAodHlwZW9mIG51bWJlcklzTmFOICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuICFudW1iZXJJc05hTih7fSkgJiYgbnVtYmVySXNOYU4oTmFOKSAmJiAhbnVtYmVySXNOYU4oMzQpO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDUwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcblx0cmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA1MSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgc2lnbiA9IF9fd2VicGFja19yZXF1aXJlX18oNTIpXG5cbiAgLCBhYnMgPSBNYXRoLmFicywgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRpZiAoaXNOYU4odmFsdWUpKSByZXR1cm4gMDtcblx0dmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuXHRpZiAoKHZhbHVlID09PSAwKSB8fCAhaXNGaW5pdGUodmFsdWUpKSByZXR1cm4gdmFsdWU7XG5cdHJldHVybiBzaWduKHZhbHVlKSAqIGZsb29yKGFicyh2YWx1ZSkpO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDUyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MykoKVxuXHQ/IE1hdGguc2lnblxuXHQ6IF9fd2VicGFja19yZXF1aXJlX18oNTQpO1xuXG5cbi8qKiovIH0pLFxuLyogNTMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBzaWduID0gTWF0aC5zaWduO1xuXHRpZiAodHlwZW9mIHNpZ24gIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gKHNpZ24oMTApID09PSAxKSAmJiAoc2lnbigtMjApID09PSAtMSk7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNTQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0dmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuXHRpZiAoaXNOYU4odmFsdWUpIHx8ICh2YWx1ZSA9PT0gMCkpIHJldHVybiB2YWx1ZTtcblx0cmV0dXJuIHZhbHVlID4gMCA/IDEgOiAtMTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA1NSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgaXNWYWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5cbnZhciBtYXAgPSB7IGZ1bmN0aW9uOiB0cnVlLCBvYmplY3Q6IHRydWUgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0cmV0dXJuIChpc1ZhbHVlKHZhbHVlKSAmJiBtYXBbdHlwZW9mIHZhbHVlXSkgfHwgZmFsc2U7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNTYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vLyBXb3JrYXJvdW5kIGZvciBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0yODA0XG5cblxuXG52YXIgY3JlYXRlID0gT2JqZWN0LmNyZWF0ZSwgc2hpbTtcblxuaWYgKCFfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KSgpKSB7XG5cdHNoaW0gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKCkge1xuXHR2YXIgbnVsbE9iamVjdCwgcG9seVByb3BzLCBkZXNjO1xuXHRpZiAoIXNoaW0pIHJldHVybiBjcmVhdGU7XG5cdGlmIChzaGltLmxldmVsICE9PSAxKSByZXR1cm4gY3JlYXRlO1xuXG5cdG51bGxPYmplY3QgPSB7fTtcblx0cG9seVByb3BzID0ge307XG5cdGRlc2MgPSB7XG5cdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcblx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR3cml0YWJsZTogdHJ1ZSxcblx0XHR2YWx1ZTogdW5kZWZpbmVkXG5cdH07XG5cdE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE9iamVjdC5wcm90b3R5cGUpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcblx0XHRpZiAobmFtZSA9PT0gXCJfX3Byb3RvX19cIikge1xuXHRcdFx0cG9seVByb3BzW25hbWVdID0ge1xuXHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdFx0XHR3cml0YWJsZTogdHJ1ZSxcblx0XHRcdFx0dmFsdWU6IHVuZGVmaW5lZFxuXHRcdFx0fTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0cG9seVByb3BzW25hbWVdID0gZGVzYztcblx0fSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG51bGxPYmplY3QsIHBvbHlQcm9wcyk7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHNoaW0sIFwibnVsbFBvbHlmaWxsXCIsIHtcblx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuXHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdHdyaXRhYmxlOiBmYWxzZSxcblx0XHR2YWx1ZTogbnVsbE9iamVjdFxuXHR9KTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gKHByb3RvdHlwZSwgcHJvcHMpIHtcblx0XHRyZXR1cm4gY3JlYXRlKHByb3RvdHlwZSA9PT0gbnVsbCA/IG51bGxPYmplY3QgOiBwcm90b3R5cGUsIHByb3BzKTtcblx0fTtcbn0oKSk7XG5cblxuLyoqKi8gfSksXG4vKiA1NyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGFzc2lnbiA9IE9iamVjdC5hc3NpZ24sIG9iajtcblx0aWYgKHR5cGVvZiBhc3NpZ24gIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGZhbHNlO1xuXHRvYmogPSB7IGZvbzogXCJyYXpcIiB9O1xuXHRhc3NpZ24ob2JqLCB7IGJhcjogXCJkd2FcIiB9LCB7IHRyenk6IFwidHJ6eVwiIH0pO1xuXHRyZXR1cm4gKG9iai5mb28gKyBvYmouYmFyICsgb2JqLnRyenkpID09PSBcInJhemR3YXRyenlcIjtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA1OCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIga2V5cyAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU5KVxuICAsIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKVxuICAsIG1heCAgID0gTWF0aC5tYXg7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGRlc3QsIHNyYyAvKiwg4oCmc3JjbiovKSB7XG5cdHZhciBlcnJvciwgaSwgbGVuZ3RoID0gbWF4KGFyZ3VtZW50cy5sZW5ndGgsIDIpLCBhc3NpZ247XG5cdGRlc3QgPSBPYmplY3QodmFsdWUoZGVzdCkpO1xuXHRhc3NpZ24gPSBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0dHJ5IHtcblx0XHRcdGRlc3Rba2V5XSA9IHNyY1trZXldO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGlmICghZXJyb3IpIGVycm9yID0gZTtcblx0XHR9XG5cdH07XG5cdGZvciAoaSA9IDE7IGkgPCBsZW5ndGg7ICsraSkge1xuXHRcdHNyYyA9IGFyZ3VtZW50c1tpXTtcblx0XHRrZXlzKHNyYykuZm9yRWFjaChhc3NpZ24pO1xuXHR9XG5cdGlmIChlcnJvciAhPT0gdW5kZWZpbmVkKSB0aHJvdyBlcnJvcjtcblx0cmV0dXJuIGRlc3Q7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNTkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYwKSgpXG5cdD8gT2JqZWN0LmtleXNcblx0OiBfX3dlYnBhY2tfcmVxdWlyZV9fKDYxKTtcblxuXG4vKioqLyB9KSxcbi8qIDYwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuXHR0cnkge1xuXHRcdE9iamVjdC5rZXlzKFwicHJpbWl0aXZlXCIpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlKSB7XG4gcmV0dXJuIGZhbHNlO1xufVxufTtcblxuXG4vKioqLyB9KSxcbi8qIDYxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBpc1ZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblxudmFyIGtleXMgPSBPYmplY3Qua2V5cztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG5cdHJldHVybiBrZXlzKGlzVmFsdWUob2JqZWN0KSA/IE9iamVjdChvYmplY3QpIDogb2JqZWN0KTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA2MiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8vIERlcHJlY2F0ZWRcblxuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuIHJldHVybiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCI7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNjMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIHN0ciA9IFwicmF6ZHdhdHJ6eVwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblx0aWYgKHR5cGVvZiBzdHIuY29udGFpbnMgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gKHN0ci5jb250YWlucyhcImR3YVwiKSA9PT0gdHJ1ZSkgJiYgKHN0ci5jb250YWlucyhcImZvb1wiKSA9PT0gZmFsc2UpO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDY0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBpbmRleE9mID0gU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzZWFyY2hTdHJpbmcvKiwgcG9zaXRpb24qLykge1xuXHRyZXR1cm4gaW5kZXhPZi5jYWxsKHRoaXMsIHNlYXJjaFN0cmluZywgYXJndW1lbnRzWzFdKSA+IC0xO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDY1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBkICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMylcbiAgLCBjYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSlcblxuICAsIGFwcGx5ID0gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LCBjYWxsID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGxcbiAgLCBjcmVhdGUgPSBPYmplY3QuY3JlYXRlLCBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eVxuICAsIGRlZmluZVByb3BlcnRpZXMgPSBPYmplY3QuZGVmaW5lUHJvcGVydGllc1xuICAsIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eVxuICAsIGRlc2NyaXB0b3IgPSB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlIH1cblxuICAsIG9uLCBvbmNlLCBvZmYsIGVtaXQsIG1ldGhvZHMsIGRlc2NyaXB0b3JzLCBiYXNlO1xuXG5vbiA9IGZ1bmN0aW9uICh0eXBlLCBsaXN0ZW5lcikge1xuXHR2YXIgZGF0YTtcblxuXHRjYWxsYWJsZShsaXN0ZW5lcik7XG5cblx0aWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsICdfX2VlX18nKSkge1xuXHRcdGRhdGEgPSBkZXNjcmlwdG9yLnZhbHVlID0gY3JlYXRlKG51bGwpO1xuXHRcdGRlZmluZVByb3BlcnR5KHRoaXMsICdfX2VlX18nLCBkZXNjcmlwdG9yKTtcblx0XHRkZXNjcmlwdG9yLnZhbHVlID0gbnVsbDtcblx0fSBlbHNlIHtcblx0XHRkYXRhID0gdGhpcy5fX2VlX187XG5cdH1cblx0aWYgKCFkYXRhW3R5cGVdKSBkYXRhW3R5cGVdID0gbGlzdGVuZXI7XG5cdGVsc2UgaWYgKHR5cGVvZiBkYXRhW3R5cGVdID09PSAnb2JqZWN0JykgZGF0YVt0eXBlXS5wdXNoKGxpc3RlbmVyKTtcblx0ZWxzZSBkYXRhW3R5cGVdID0gW2RhdGFbdHlwZV0sIGxpc3RlbmVyXTtcblxuXHRyZXR1cm4gdGhpcztcbn07XG5cbm9uY2UgPSBmdW5jdGlvbiAodHlwZSwgbGlzdGVuZXIpIHtcblx0dmFyIG9uY2UsIHNlbGY7XG5cblx0Y2FsbGFibGUobGlzdGVuZXIpO1xuXHRzZWxmID0gdGhpcztcblx0b24uY2FsbCh0aGlzLCB0eXBlLCBvbmNlID0gZnVuY3Rpb24gKCkge1xuXHRcdG9mZi5jYWxsKHNlbGYsIHR5cGUsIG9uY2UpO1xuXHRcdGFwcGx5LmNhbGwobGlzdGVuZXIsIHRoaXMsIGFyZ3VtZW50cyk7XG5cdH0pO1xuXG5cdG9uY2UuX19lZU9uY2VMaXN0ZW5lcl9fID0gbGlzdGVuZXI7XG5cdHJldHVybiB0aGlzO1xufTtcblxub2ZmID0gZnVuY3Rpb24gKHR5cGUsIGxpc3RlbmVyKSB7XG5cdHZhciBkYXRhLCBsaXN0ZW5lcnMsIGNhbmRpZGF0ZSwgaTtcblxuXHRjYWxsYWJsZShsaXN0ZW5lcik7XG5cblx0aWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsICdfX2VlX18nKSkgcmV0dXJuIHRoaXM7XG5cdGRhdGEgPSB0aGlzLl9fZWVfXztcblx0aWYgKCFkYXRhW3R5cGVdKSByZXR1cm4gdGhpcztcblx0bGlzdGVuZXJzID0gZGF0YVt0eXBlXTtcblxuXHRpZiAodHlwZW9mIGxpc3RlbmVycyA9PT0gJ29iamVjdCcpIHtcblx0XHRmb3IgKGkgPSAwOyAoY2FuZGlkYXRlID0gbGlzdGVuZXJzW2ldKTsgKytpKSB7XG5cdFx0XHRpZiAoKGNhbmRpZGF0ZSA9PT0gbGlzdGVuZXIpIHx8XG5cdFx0XHRcdFx0KGNhbmRpZGF0ZS5fX2VlT25jZUxpc3RlbmVyX18gPT09IGxpc3RlbmVyKSkge1xuXHRcdFx0XHRpZiAobGlzdGVuZXJzLmxlbmd0aCA9PT0gMikgZGF0YVt0eXBlXSA9IGxpc3RlbmVyc1tpID8gMCA6IDFdO1xuXHRcdFx0XHRlbHNlIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGlmICgobGlzdGVuZXJzID09PSBsaXN0ZW5lcikgfHxcblx0XHRcdFx0KGxpc3RlbmVycy5fX2VlT25jZUxpc3RlbmVyX18gPT09IGxpc3RlbmVyKSkge1xuXHRcdFx0ZGVsZXRlIGRhdGFbdHlwZV07XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5lbWl0ID0gZnVuY3Rpb24gKHR5cGUpIHtcblx0dmFyIGksIGwsIGxpc3RlbmVyLCBsaXN0ZW5lcnMsIGFyZ3M7XG5cblx0aWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsICdfX2VlX18nKSkgcmV0dXJuO1xuXHRsaXN0ZW5lcnMgPSB0aGlzLl9fZWVfX1t0eXBlXTtcblx0aWYgKCFsaXN0ZW5lcnMpIHJldHVybjtcblxuXHRpZiAodHlwZW9mIGxpc3RlbmVycyA9PT0gJ29iamVjdCcpIHtcblx0XHRsID0gYXJndW1lbnRzLmxlbmd0aDtcblx0XHRhcmdzID0gbmV3IEFycmF5KGwgLSAxKTtcblx0XHRmb3IgKGkgPSAxOyBpIDwgbDsgKytpKSBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcblxuXHRcdGxpc3RlbmVycyA9IGxpc3RlbmVycy5zbGljZSgpO1xuXHRcdGZvciAoaSA9IDA7IChsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXSk7ICsraSkge1xuXHRcdFx0YXBwbHkuY2FsbChsaXN0ZW5lciwgdGhpcywgYXJncyk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdGNhc2UgMTpcblx0XHRcdGNhbGwuY2FsbChsaXN0ZW5lcnMsIHRoaXMpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAyOlxuXHRcdFx0Y2FsbC5jYWxsKGxpc3RlbmVycywgdGhpcywgYXJndW1lbnRzWzFdKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgMzpcblx0XHRcdGNhbGwuY2FsbChsaXN0ZW5lcnMsIHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRsID0gYXJndW1lbnRzLmxlbmd0aDtcblx0XHRcdGFyZ3MgPSBuZXcgQXJyYXkobCAtIDEpO1xuXHRcdFx0Zm9yIChpID0gMTsgaSA8IGw7ICsraSkge1xuXHRcdFx0XHRhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcblx0XHRcdH1cblx0XHRcdGFwcGx5LmNhbGwobGlzdGVuZXJzLCB0aGlzLCBhcmdzKTtcblx0XHR9XG5cdH1cbn07XG5cbm1ldGhvZHMgPSB7XG5cdG9uOiBvbixcblx0b25jZTogb25jZSxcblx0b2ZmOiBvZmYsXG5cdGVtaXQ6IGVtaXRcbn07XG5cbmRlc2NyaXB0b3JzID0ge1xuXHRvbjogZChvbiksXG5cdG9uY2U6IGQob25jZSksXG5cdG9mZjogZChvZmYpLFxuXHRlbWl0OiBkKGVtaXQpXG59O1xuXG5iYXNlID0gZGVmaW5lUHJvcGVydGllcyh7fSwgZGVzY3JpcHRvcnMpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmdW5jdGlvbiAobykge1xuXHRyZXR1cm4gKG8gPT0gbnVsbCkgPyBjcmVhdGUoYmFzZSkgOiBkZWZpbmVQcm9wZXJ0aWVzKE9iamVjdChvKSwgZGVzY3JpcHRvcnMpO1xufTtcbmV4cG9ydHMubWV0aG9kcyA9IG1ldGhvZHM7XG5cblxuLyoqKi8gfSksXG4vKiA2NiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgdmFsaWRUeXBlcyA9IHsgb2JqZWN0OiB0cnVlLCBzeW1ib2w6IHRydWUgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBzeW1ib2w7XG5cdGlmICh0eXBlb2YgU3ltYm9sICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG5cdHN5bWJvbCA9IFN5bWJvbCgndGVzdCBzeW1ib2wnKTtcblx0dHJ5IHsgU3RyaW5nKHN5bWJvbCk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0Ly8gUmV0dXJuICd0cnVlJyBhbHNvIGZvciBwb2x5ZmlsbHNcblx0aWYgKCF2YWxpZFR5cGVzW3R5cGVvZiBTeW1ib2wuaXRlcmF0b3JdKSByZXR1cm4gZmFsc2U7XG5cdGlmICghdmFsaWRUeXBlc1t0eXBlb2YgU3ltYm9sLnRvUHJpbWl0aXZlXSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIXZhbGlkVHlwZXNbdHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZ10pIHJldHVybiBmYWxzZTtcblxuXHRyZXR1cm4gdHJ1ZTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA2NyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8vIEVTMjAxNSBTeW1ib2wgcG9seWZpbGwgZm9yIGVudmlyb25tZW50cyB0aGF0IGRvIG5vdCAob3IgcGFydGlhbGx5KSBzdXBwb3J0IGl0XG5cblxuXG52YXIgZCAgICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpXG4gICwgdmFsaWRhdGVTeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY4KVxuXG4gICwgY3JlYXRlID0gT2JqZWN0LmNyZWF0ZSwgZGVmaW5lUHJvcGVydGllcyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzXG4gICwgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHksIG9ialByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGVcbiAgLCBOYXRpdmVTeW1ib2wsIFN5bWJvbFBvbHlmaWxsLCBIaWRkZW5TeW1ib2wsIGdsb2JhbFN5bWJvbHMgPSBjcmVhdGUobnVsbClcbiAgLCBpc05hdGl2ZVNhZmU7XG5cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XG5cdE5hdGl2ZVN5bWJvbCA9IFN5bWJvbDtcblx0dHJ5IHtcblx0XHRTdHJpbmcoTmF0aXZlU3ltYm9sKCkpO1xuXHRcdGlzTmF0aXZlU2FmZSA9IHRydWU7XG5cdH0gY2F0Y2ggKGlnbm9yZSkge31cbn1cblxudmFyIGdlbmVyYXRlTmFtZSA9IChmdW5jdGlvbiAoKSB7XG5cdHZhciBjcmVhdGVkID0gY3JlYXRlKG51bGwpO1xuXHRyZXR1cm4gZnVuY3Rpb24gKGRlc2MpIHtcblx0XHR2YXIgcG9zdGZpeCA9IDAsIG5hbWUsIGllMTFCdWdXb3JrYXJvdW5kO1xuXHRcdHdoaWxlIChjcmVhdGVkW2Rlc2MgKyAocG9zdGZpeCB8fCAnJyldKSArK3Bvc3RmaXg7XG5cdFx0ZGVzYyArPSAocG9zdGZpeCB8fCAnJyk7XG5cdFx0Y3JlYXRlZFtkZXNjXSA9IHRydWU7XG5cdFx0bmFtZSA9ICdAQCcgKyBkZXNjO1xuXHRcdGRlZmluZVByb3BlcnR5KG9ialByb3RvdHlwZSwgbmFtZSwgZC5ncyhudWxsLCBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRcdC8vIEZvciBJRTExIGlzc3VlIHNlZTpcblx0XHRcdC8vIGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrZGV0YWlsL3ZpZXcvMTkyODUwOC9cblx0XHRcdC8vICAgIGllMTEtYnJva2VuLWdldHRlcnMtb24tZG9tLW9iamVjdHNcblx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tZWRpa29vL2VzNi1zeW1ib2wvaXNzdWVzLzEyXG5cdFx0XHRpZiAoaWUxMUJ1Z1dvcmthcm91bmQpIHJldHVybjtcblx0XHRcdGllMTFCdWdXb3JrYXJvdW5kID0gdHJ1ZTtcblx0XHRcdGRlZmluZVByb3BlcnR5KHRoaXMsIG5hbWUsIGQodmFsdWUpKTtcblx0XHRcdGllMTFCdWdXb3JrYXJvdW5kID0gZmFsc2U7XG5cdFx0fSkpO1xuXHRcdHJldHVybiBuYW1lO1xuXHR9O1xufSgpKTtcblxuLy8gSW50ZXJuYWwgY29uc3RydWN0b3IgKG5vdCBvbmUgZXhwb3NlZCkgZm9yIGNyZWF0aW5nIFN5bWJvbCBpbnN0YW5jZXMuXG4vLyBUaGlzIG9uZSBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IGBzb21lU3ltYm9sIGluc3RhbmNlb2YgU3ltYm9sYCBhbHdheXMgcmV0dXJuIGZhbHNlXG5IaWRkZW5TeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woZGVzY3JpcHRpb24pIHtcblx0aWYgKHRoaXMgaW5zdGFuY2VvZiBIaWRkZW5TeW1ib2wpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1N5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvcicpO1xuXHRyZXR1cm4gU3ltYm9sUG9seWZpbGwoZGVzY3JpcHRpb24pO1xufTtcblxuLy8gRXhwb3NlZCBgU3ltYm9sYCBjb25zdHJ1Y3RvclxuLy8gKHJldHVybnMgaW5zdGFuY2VzIG9mIEhpZGRlblN5bWJvbClcbm1vZHVsZS5leHBvcnRzID0gU3ltYm9sUG9seWZpbGwgPSBmdW5jdGlvbiBTeW1ib2woZGVzY3JpcHRpb24pIHtcblx0dmFyIHN5bWJvbDtcblx0aWYgKHRoaXMgaW5zdGFuY2VvZiBTeW1ib2wpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1N5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvcicpO1xuXHRpZiAoaXNOYXRpdmVTYWZlKSByZXR1cm4gTmF0aXZlU3ltYm9sKGRlc2NyaXB0aW9uKTtcblx0c3ltYm9sID0gY3JlYXRlKEhpZGRlblN5bWJvbC5wcm90b3R5cGUpO1xuXHRkZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkID8gJycgOiBTdHJpbmcoZGVzY3JpcHRpb24pKTtcblx0cmV0dXJuIGRlZmluZVByb3BlcnRpZXMoc3ltYm9sLCB7XG5cdFx0X19kZXNjcmlwdGlvbl9fOiBkKCcnLCBkZXNjcmlwdGlvbiksXG5cdFx0X19uYW1lX186IGQoJycsIGdlbmVyYXRlTmFtZShkZXNjcmlwdGlvbikpXG5cdH0pO1xufTtcbmRlZmluZVByb3BlcnRpZXMoU3ltYm9sUG9seWZpbGwsIHtcblx0Zm9yOiBkKGZ1bmN0aW9uIChrZXkpIHtcblx0XHRpZiAoZ2xvYmFsU3ltYm9sc1trZXldKSByZXR1cm4gZ2xvYmFsU3ltYm9sc1trZXldO1xuXHRcdHJldHVybiAoZ2xvYmFsU3ltYm9sc1trZXldID0gU3ltYm9sUG9seWZpbGwoU3RyaW5nKGtleSkpKTtcblx0fSksXG5cdGtleUZvcjogZChmdW5jdGlvbiAocykge1xuXHRcdHZhciBrZXk7XG5cdFx0dmFsaWRhdGVTeW1ib2wocyk7XG5cdFx0Zm9yIChrZXkgaW4gZ2xvYmFsU3ltYm9scykgaWYgKGdsb2JhbFN5bWJvbHNba2V5XSA9PT0gcykgcmV0dXJuIGtleTtcblx0fSksXG5cblx0Ly8gVG8gZW5zdXJlIHByb3BlciBpbnRlcm9wZXJhYmlsaXR5IHdpdGggb3RoZXIgbmF0aXZlIGZ1bmN0aW9ucyAoZS5nLiBBcnJheS5mcm9tKVxuXHQvLyBmYWxsYmFjayB0byBldmVudHVhbCBuYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgZ2l2ZW4gc3ltYm9sXG5cdGhhc0luc3RhbmNlOiBkKCcnLCAoTmF0aXZlU3ltYm9sICYmIE5hdGl2ZVN5bWJvbC5oYXNJbnN0YW5jZSkgfHwgU3ltYm9sUG9seWZpbGwoJ2hhc0luc3RhbmNlJykpLFxuXHRpc0NvbmNhdFNwcmVhZGFibGU6IGQoJycsIChOYXRpdmVTeW1ib2wgJiYgTmF0aXZlU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZSkgfHxcblx0XHRTeW1ib2xQb2x5ZmlsbCgnaXNDb25jYXRTcHJlYWRhYmxlJykpLFxuXHRpdGVyYXRvcjogZCgnJywgKE5hdGl2ZVN5bWJvbCAmJiBOYXRpdmVTeW1ib2wuaXRlcmF0b3IpIHx8IFN5bWJvbFBvbHlmaWxsKCdpdGVyYXRvcicpKSxcblx0bWF0Y2g6IGQoJycsIChOYXRpdmVTeW1ib2wgJiYgTmF0aXZlU3ltYm9sLm1hdGNoKSB8fCBTeW1ib2xQb2x5ZmlsbCgnbWF0Y2gnKSksXG5cdHJlcGxhY2U6IGQoJycsIChOYXRpdmVTeW1ib2wgJiYgTmF0aXZlU3ltYm9sLnJlcGxhY2UpIHx8IFN5bWJvbFBvbHlmaWxsKCdyZXBsYWNlJykpLFxuXHRzZWFyY2g6IGQoJycsIChOYXRpdmVTeW1ib2wgJiYgTmF0aXZlU3ltYm9sLnNlYXJjaCkgfHwgU3ltYm9sUG9seWZpbGwoJ3NlYXJjaCcpKSxcblx0c3BlY2llczogZCgnJywgKE5hdGl2ZVN5bWJvbCAmJiBOYXRpdmVTeW1ib2wuc3BlY2llcykgfHwgU3ltYm9sUG9seWZpbGwoJ3NwZWNpZXMnKSksXG5cdHNwbGl0OiBkKCcnLCAoTmF0aXZlU3ltYm9sICYmIE5hdGl2ZVN5bWJvbC5zcGxpdCkgfHwgU3ltYm9sUG9seWZpbGwoJ3NwbGl0JykpLFxuXHR0b1ByaW1pdGl2ZTogZCgnJywgKE5hdGl2ZVN5bWJvbCAmJiBOYXRpdmVTeW1ib2wudG9QcmltaXRpdmUpIHx8IFN5bWJvbFBvbHlmaWxsKCd0b1ByaW1pdGl2ZScpKSxcblx0dG9TdHJpbmdUYWc6IGQoJycsIChOYXRpdmVTeW1ib2wgJiYgTmF0aXZlU3ltYm9sLnRvU3RyaW5nVGFnKSB8fCBTeW1ib2xQb2x5ZmlsbCgndG9TdHJpbmdUYWcnKSksXG5cdHVuc2NvcGFibGVzOiBkKCcnLCAoTmF0aXZlU3ltYm9sICYmIE5hdGl2ZVN5bWJvbC51bnNjb3BhYmxlcykgfHwgU3ltYm9sUG9seWZpbGwoJ3Vuc2NvcGFibGVzJykpXG59KTtcblxuLy8gSW50ZXJuYWwgdHdlYWtzIGZvciByZWFsIHN5bWJvbCBwcm9kdWNlclxuZGVmaW5lUHJvcGVydGllcyhIaWRkZW5TeW1ib2wucHJvdG90eXBlLCB7XG5cdGNvbnN0cnVjdG9yOiBkKFN5bWJvbFBvbHlmaWxsKSxcblx0dG9TdHJpbmc6IGQoJycsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX19uYW1lX187IH0pXG59KTtcblxuLy8gUHJvcGVyIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgZXhwb3NlZCBvbiBTeW1ib2wucHJvdG90eXBlXG4vLyBUaGV5IHdvbid0IGJlIGFjY2Vzc2libGUgb24gcHJvZHVjZWQgc3ltYm9sIGluc3RhbmNlcyBhcyB0aGV5IGRlcml2ZSBmcm9tIEhpZGRlblN5bWJvbC5wcm90b3R5cGVcbmRlZmluZVByb3BlcnRpZXMoU3ltYm9sUG9seWZpbGwucHJvdG90eXBlLCB7XG5cdHRvU3RyaW5nOiBkKGZ1bmN0aW9uICgpIHsgcmV0dXJuICdTeW1ib2wgKCcgKyB2YWxpZGF0ZVN5bWJvbCh0aGlzKS5fX2Rlc2NyaXB0aW9uX18gKyAnKSc7IH0pLFxuXHR2YWx1ZU9mOiBkKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhbGlkYXRlU3ltYm9sKHRoaXMpOyB9KVxufSk7XG5kZWZpbmVQcm9wZXJ0eShTeW1ib2xQb2x5ZmlsbC5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvUHJpbWl0aXZlLCBkKCcnLCBmdW5jdGlvbiAoKSB7XG5cdHZhciBzeW1ib2wgPSB2YWxpZGF0ZVN5bWJvbCh0aGlzKTtcblx0aWYgKHR5cGVvZiBzeW1ib2wgPT09ICdzeW1ib2wnKSByZXR1cm4gc3ltYm9sO1xuXHRyZXR1cm4gc3ltYm9sLnRvU3RyaW5nKCk7XG59KSk7XG5kZWZpbmVQcm9wZXJ0eShTeW1ib2xQb2x5ZmlsbC5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnLCBkKCdjJywgJ1N5bWJvbCcpKTtcblxuLy8gUHJvcGVyIGltcGxlbWVudGF0b24gb2YgdG9QcmltaXRpdmUgYW5kIHRvU3RyaW5nVGFnIGZvciByZXR1cm5lZCBzeW1ib2wgaW5zdGFuY2VzXG5kZWZpbmVQcm9wZXJ0eShIaWRkZW5TeW1ib2wucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZyxcblx0ZCgnYycsIFN5bWJvbFBvbHlmaWxsLnByb3RvdHlwZVtTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZ10pKTtcblxuLy8gTm90ZTogSXQncyBpbXBvcnRhbnQgdG8gZGVmaW5lIGB0b1ByaW1pdGl2ZWAgYXMgbGFzdCBvbmUsIGFzIHNvbWUgaW1wbGVtZW50YXRpb25zXG4vLyBpbXBsZW1lbnQgYHRvUHJpbWl0aXZlYCBuYXRpdmVseSB3aXRob3V0IGltcGxlbWVudGluZyBgdG9TdHJpbmdUYWdgIChvciBvdGhlciBzcGVjaWZpZWQgc3ltYm9scylcbi8vIEFuZCB0aGF0IG1heSBpbnZva2UgZXJyb3IgaW4gZGVmaW5pdGlvbiBmbG93OlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vbWVkaWtvby9lczYtc3ltYm9sL2lzc3Vlcy8xMyNpc3N1ZWNvbW1lbnQtMTY0MTQ2MTQ5XG5kZWZpbmVQcm9wZXJ0eShIaWRkZW5TeW1ib2wucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1ByaW1pdGl2ZSxcblx0ZCgnYycsIFN5bWJvbFBvbHlmaWxsLnByb3RvdHlwZVtTeW1ib2xQb2x5ZmlsbC50b1ByaW1pdGl2ZV0pKTtcblxuXG4vKioqLyB9KSxcbi8qIDY4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBpc1N5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oNjkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRpZiAoIWlzU3ltYm9sKHZhbHVlKSkgdGhyb3cgbmV3IFR5cGVFcnJvcih2YWx1ZSArIFwiIGlzIG5vdCBhIHN5bWJvbFwiKTtcblx0cmV0dXJuIHZhbHVlO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDY5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHgpIHtcblx0aWYgKCF4KSByZXR1cm4gZmFsc2U7XG5cdGlmICh0eXBlb2YgeCA9PT0gJ3N5bWJvbCcpIHJldHVybiB0cnVlO1xuXHRpZiAoIXguY29uc3RydWN0b3IpIHJldHVybiBmYWxzZTtcblx0aWYgKHguY29uc3RydWN0b3IubmFtZSAhPT0gJ1N5bWJvbCcpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuICh4W3guY29uc3RydWN0b3IudG9TdHJpbmdUYWddID09PSAnU3ltYm9sJyk7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNzAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGlzQXJndW1lbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KVxuICAsIGlzVmFsdWUgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KVxuICAsIGlzU3RyaW5nICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcblxudmFyIGl0ZXJhdG9yU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKS5pdGVyYXRvclxuICAsIGlzQXJyYXkgICAgICAgID0gQXJyYXkuaXNBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0aWYgKCFpc1ZhbHVlKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoaXNBcnJheSh2YWx1ZSkpIHJldHVybiB0cnVlO1xuXHRpZiAoaXNTdHJpbmcodmFsdWUpKSByZXR1cm4gdHJ1ZTtcblx0aWYgKGlzQXJndW1lbnRzKHZhbHVlKSkgcmV0dXJuIHRydWU7XG5cdHJldHVybiB0eXBlb2YgdmFsdWVbaXRlcmF0b3JTeW1ib2xdID09PSBcImZ1bmN0aW9uXCI7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNzEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGlzQXJndW1lbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KVxuICAsIGNhbGxhYmxlICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVxuICAsIGlzU3RyaW5nICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KVxuICAsIGdldCAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3Mik7XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSwgY2FsbCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsLCBzb21lID0gQXJyYXkucHJvdG90eXBlLnNvbWU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCBjYiAvKiwgdGhpc0FyZyovKSB7XG5cdHZhciBtb2RlLCB0aGlzQXJnID0gYXJndW1lbnRzWzJdLCByZXN1bHQsIGRvQnJlYWssIGJyb2tlbiwgaSwgbGVuZ3RoLCBjaGFyLCBjb2RlO1xuXHRpZiAoaXNBcnJheShpdGVyYWJsZSkgfHwgaXNBcmd1bWVudHMoaXRlcmFibGUpKSBtb2RlID0gXCJhcnJheVwiO1xuXHRlbHNlIGlmIChpc1N0cmluZyhpdGVyYWJsZSkpIG1vZGUgPSBcInN0cmluZ1wiO1xuXHRlbHNlIGl0ZXJhYmxlID0gZ2V0KGl0ZXJhYmxlKTtcblxuXHRjYWxsYWJsZShjYik7XG5cdGRvQnJlYWsgPSBmdW5jdGlvbiAoKSB7XG5cdFx0YnJva2VuID0gdHJ1ZTtcblx0fTtcblx0aWYgKG1vZGUgPT09IFwiYXJyYXlcIikge1xuXHRcdHNvbWUuY2FsbChpdGVyYWJsZSwgZnVuY3Rpb24gKHZhbHVlKSB7XG5cdFx0XHRjYWxsLmNhbGwoY2IsIHRoaXNBcmcsIHZhbHVlLCBkb0JyZWFrKTtcblx0XHRcdHJldHVybiBicm9rZW47XG5cdFx0fSk7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGlmIChtb2RlID09PSBcInN0cmluZ1wiKSB7XG5cdFx0bGVuZ3RoID0gaXRlcmFibGUubGVuZ3RoO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuXHRcdFx0Y2hhciA9IGl0ZXJhYmxlW2ldO1xuXHRcdFx0aWYgKGkgKyAxIDwgbGVuZ3RoKSB7XG5cdFx0XHRcdGNvZGUgPSBjaGFyLmNoYXJDb2RlQXQoMCk7XG5cdFx0XHRcdGlmIChjb2RlID49IDB4ZDgwMCAmJiBjb2RlIDw9IDB4ZGJmZikgY2hhciArPSBpdGVyYWJsZVsrK2ldO1xuXHRcdFx0fVxuXHRcdFx0Y2FsbC5jYWxsKGNiLCB0aGlzQXJnLCBjaGFyLCBkb0JyZWFrKTtcblx0XHRcdGlmIChicm9rZW4pIGJyZWFrO1xuXHRcdH1cblx0XHRyZXR1cm47XG5cdH1cblx0cmVzdWx0ID0gaXRlcmFibGUubmV4dCgpO1xuXG5cdHdoaWxlICghcmVzdWx0LmRvbmUpIHtcblx0XHRjYWxsLmNhbGwoY2IsIHRoaXNBcmcsIHJlc3VsdC52YWx1ZSwgZG9CcmVhayk7XG5cdFx0aWYgKGJyb2tlbikgcmV0dXJuO1xuXHRcdHJlc3VsdCA9IGl0ZXJhYmxlLm5leHQoKTtcblx0fVxufTtcblxuXG4vKioqLyB9KSxcbi8qIDcyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBpc0FyZ3VtZW50cyAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNylcbiAgLCBpc1N0cmluZyAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oOClcbiAgLCBBcnJheUl0ZXJhdG9yICA9IF9fd2VicGFja19yZXF1aXJlX18oNzMpXG4gICwgU3RyaW5nSXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgzKVxuICAsIGl0ZXJhYmxlICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMilcbiAgLCBpdGVyYXRvclN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oMikuaXRlcmF0b3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuXHRpZiAodHlwZW9mIGl0ZXJhYmxlKG9iailbaXRlcmF0b3JTeW1ib2xdID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBvYmpbaXRlcmF0b3JTeW1ib2xdKCk7XG5cdGlmIChpc0FyZ3VtZW50cyhvYmopKSByZXR1cm4gbmV3IEFycmF5SXRlcmF0b3Iob2JqKTtcblx0aWYgKGlzU3RyaW5nKG9iaikpIHJldHVybiBuZXcgU3RyaW5nSXRlcmF0b3Iob2JqKTtcblx0cmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yKG9iaik7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNzMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIHNldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KVxuICAsIGNvbnRhaW5zICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSlcbiAgLCBkICAgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMylcbiAgLCBTeW1ib2wgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMilcbiAgLCBJdGVyYXRvciAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpO1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHksIEFycmF5SXRlcmF0b3I7XG5cbkFycmF5SXRlcmF0b3IgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcnIsIGtpbmQpIHtcblx0aWYgKCEodGhpcyBpbnN0YW5jZW9mIEFycmF5SXRlcmF0b3IpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ29uc3RydWN0b3IgcmVxdWlyZXMgJ25ldydcIik7XG5cdEl0ZXJhdG9yLmNhbGwodGhpcywgYXJyKTtcblx0aWYgKCFraW5kKSBraW5kID0gXCJ2YWx1ZVwiO1xuXHRlbHNlIGlmIChjb250YWlucy5jYWxsKGtpbmQsIFwia2V5K3ZhbHVlXCIpKSBraW5kID0gXCJrZXkrdmFsdWVcIjtcblx0ZWxzZSBpZiAoY29udGFpbnMuY2FsbChraW5kLCBcImtleVwiKSkga2luZCA9IFwia2V5XCI7XG5cdGVsc2Uga2luZCA9IFwidmFsdWVcIjtcblx0ZGVmaW5lUHJvcGVydHkodGhpcywgXCJfX2tpbmRfX1wiLCBkKFwiXCIsIGtpbmQpKTtcbn07XG5pZiAoc2V0UHJvdG90eXBlT2YpIHNldFByb3RvdHlwZU9mKEFycmF5SXRlcmF0b3IsIEl0ZXJhdG9yKTtcblxuLy8gSW50ZXJuYWwgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlIGRvZXNuJ3QgZXhwb3NlIGl0cyBjb25zdHJ1Y3RvclxuZGVsZXRlIEFycmF5SXRlcmF0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yO1xuXG5BcnJheUl0ZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3IucHJvdG90eXBlLCB7XG5cdF9yZXNvbHZlOiBkKGZ1bmN0aW9uIChpKSB7XG5cdFx0aWYgKHRoaXMuX19raW5kX18gPT09IFwidmFsdWVcIikgcmV0dXJuIHRoaXMuX19saXN0X19baV07XG5cdFx0aWYgKHRoaXMuX19raW5kX18gPT09IFwia2V5K3ZhbHVlXCIpIHJldHVybiBbaSwgdGhpcy5fX2xpc3RfX1tpXV07XG5cdFx0cmV0dXJuIGk7XG5cdH0pXG59KTtcbmRlZmluZVByb3BlcnR5KEFycmF5SXRlcmF0b3IucHJvdG90eXBlLCBTeW1ib2wudG9TdHJpbmdUYWcsIGQoXCJjXCIsIFwiQXJyYXkgSXRlcmF0b3JcIikpO1xuXG5cbi8qKiovIH0pLFxuLyogNzQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGNvcHkgICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc1KVxuICAsIG5vcm1hbGl6ZU9wdGlvbnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKVxuICAsIGVuc3VyZUNhbGxhYmxlICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpXG4gICwgbWFwICAgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oODApXG4gICwgY2FsbGFibGUgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMSlcbiAgLCB2YWxpZFZhbHVlICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKVxuXG4gICwgYmluZCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLCBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eVxuICAsIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eVxuICAsIGRlZmluZTtcblxuZGVmaW5lID0gZnVuY3Rpb24gKG5hbWUsIGRlc2MsIG9wdGlvbnMpIHtcblx0dmFyIHZhbHVlID0gdmFsaWRWYWx1ZShkZXNjKSAmJiBjYWxsYWJsZShkZXNjLnZhbHVlKSwgZGdzO1xuXHRkZ3MgPSBjb3B5KGRlc2MpO1xuXHRkZWxldGUgZGdzLndyaXRhYmxlO1xuXHRkZWxldGUgZGdzLnZhbHVlO1xuXHRkZ3MuZ2V0ID0gZnVuY3Rpb24gKCkge1xuXHRcdGlmICghb3B0aW9ucy5vdmVyd3JpdGVEZWZpbml0aW9uICYmIGhhc093blByb3BlcnR5LmNhbGwodGhpcywgbmFtZSkpIHJldHVybiB2YWx1ZTtcblx0XHRkZXNjLnZhbHVlID0gYmluZC5jYWxsKHZhbHVlLCBvcHRpb25zLnJlc29sdmVDb250ZXh0ID8gb3B0aW9ucy5yZXNvbHZlQ29udGV4dCh0aGlzKSA6IHRoaXMpO1xuXHRcdGRlZmluZVByb3BlcnR5KHRoaXMsIG5hbWUsIGRlc2MpO1xuXHRcdHJldHVybiB0aGlzW25hbWVdO1xuXHR9O1xuXHRyZXR1cm4gZGdzO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocHJvcHMvKiwgb3B0aW9ucyovKSB7XG5cdHZhciBvcHRpb25zID0gbm9ybWFsaXplT3B0aW9ucyhhcmd1bWVudHNbMV0pO1xuXHRpZiAob3B0aW9ucy5yZXNvbHZlQ29udGV4dCAhPSBudWxsKSBlbnN1cmVDYWxsYWJsZShvcHRpb25zLnJlc29sdmVDb250ZXh0KTtcblx0cmV0dXJuIG1hcChwcm9wcywgZnVuY3Rpb24gKGRlc2MsIG5hbWUpIHsgcmV0dXJuIGRlZmluZShuYW1lLCBkZXNjLCBvcHRpb25zKTsgfSk7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNzUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGFGcm9tICA9IF9fd2VicGFja19yZXF1aXJlX18oNzYpXG4gICwgYXNzaWduID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMClcbiAgLCB2YWx1ZSAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmovKiwgcHJvcGVydHlOYW1lcywgb3B0aW9ucyovKSB7XG5cdHZhciBjb3B5ID0gT2JqZWN0KHZhbHVlKG9iaikpLCBwcm9wZXJ0eU5hbWVzID0gYXJndW1lbnRzWzFdLCBvcHRpb25zID0gT2JqZWN0KGFyZ3VtZW50c1syXSk7XG5cdGlmIChjb3B5ICE9PSBvYmogJiYgIXByb3BlcnR5TmFtZXMpIHJldHVybiBjb3B5O1xuXHR2YXIgcmVzdWx0ID0ge307XG5cdGlmIChwcm9wZXJ0eU5hbWVzKSB7XG5cdFx0YUZyb20ocHJvcGVydHlOYW1lcywgZnVuY3Rpb24gKHByb3BlcnR5TmFtZSkge1xuXHRcdFx0aWYgKG9wdGlvbnMuZW5zdXJlIHx8IHByb3BlcnR5TmFtZSBpbiBvYmopIHJlc3VsdFtwcm9wZXJ0eU5hbWVdID0gb2JqW3Byb3BlcnR5TmFtZV07XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0YXNzaWduKHJlc3VsdCwgb2JqKTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDc2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NykoKVxuXHQ/IEFycmF5LmZyb21cblx0OiBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KTtcblxuXG4vKioqLyB9KSxcbi8qIDc3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgZnJvbSA9IEFycmF5LmZyb20sIGFyciwgcmVzdWx0O1xuXHRpZiAodHlwZW9mIGZyb20gIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGZhbHNlO1xuXHRhcnIgPSBbXCJyYXpcIiwgXCJkd2FcIl07XG5cdHJlc3VsdCA9IGZyb20oYXJyKTtcblx0cmV0dXJuIEJvb2xlYW4ocmVzdWx0ICYmIChyZXN1bHQgIT09IGFycikgJiYgKHJlc3VsdFsxXSA9PT0gXCJkd2FcIikpO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDc4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBpdGVyYXRvclN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oMikuaXRlcmF0b3JcbiAgLCBpc0FyZ3VtZW50cyAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNylcbiAgLCBpc0Z1bmN0aW9uICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpXG4gICwgdG9Qb3NJbnQgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4KVxuICAsIGNhbGxhYmxlICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVxuICAsIHZhbGlkVmFsdWUgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKVxuICAsIGlzVmFsdWUgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KVxuICAsIGlzU3RyaW5nICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KVxuICAsIGlzQXJyYXkgICAgICAgID0gQXJyYXkuaXNBcnJheVxuICAsIGNhbGwgICAgICAgICAgID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGxcbiAgLCBkZXNjICAgICAgICAgICA9IHsgY29uZmlndXJhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IG51bGwgfVxuICAsIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJyYXlMaWtlIC8qLCBtYXBGbiwgdGhpc0FyZyovKSB7XG5cdHZhciBtYXBGbiA9IGFyZ3VtZW50c1sxXVxuXHQgICwgdGhpc0FyZyA9IGFyZ3VtZW50c1syXVxuXHQgICwgQ29udGV4dFxuXHQgICwgaVxuXHQgICwgalxuXHQgICwgYXJyXG5cdCAgLCBsZW5ndGhcblx0ICAsIGNvZGVcblx0ICAsIGl0ZXJhdG9yXG5cdCAgLCByZXN1bHRcblx0ICAsIGdldEl0ZXJhdG9yXG5cdCAgLCB2YWx1ZTtcblxuXHRhcnJheUxpa2UgPSBPYmplY3QodmFsaWRWYWx1ZShhcnJheUxpa2UpKTtcblxuXHRpZiAoaXNWYWx1ZShtYXBGbikpIGNhbGxhYmxlKG1hcEZuKTtcblx0aWYgKCF0aGlzIHx8IHRoaXMgPT09IEFycmF5IHx8ICFpc0Z1bmN0aW9uKHRoaXMpKSB7XG5cdFx0Ly8gUmVzdWx0OiBQbGFpbiBhcnJheVxuXHRcdGlmICghbWFwRm4pIHtcblx0XHRcdGlmIChpc0FyZ3VtZW50cyhhcnJheUxpa2UpKSB7XG5cdFx0XHRcdC8vIFNvdXJjZTogQXJndW1lbnRzXG5cdFx0XHRcdGxlbmd0aCA9IGFycmF5TGlrZS5sZW5ndGg7XG5cdFx0XHRcdGlmIChsZW5ndGggIT09IDEpIHJldHVybiBBcnJheS5hcHBseShudWxsLCBhcnJheUxpa2UpO1xuXHRcdFx0XHRhcnIgPSBuZXcgQXJyYXkoMSk7XG5cdFx0XHRcdGFyclswXSA9IGFycmF5TGlrZVswXTtcblx0XHRcdFx0cmV0dXJuIGFycjtcblx0XHRcdH1cblx0XHRcdGlmIChpc0FycmF5KGFycmF5TGlrZSkpIHtcblx0XHRcdFx0Ly8gU291cmNlOiBBcnJheVxuXHRcdFx0XHRhcnIgPSBuZXcgQXJyYXkobGVuZ3RoID0gYXJyYXlMaWtlLmxlbmd0aCk7XG5cdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgYXJyW2ldID0gYXJyYXlMaWtlW2ldO1xuXHRcdFx0XHRyZXR1cm4gYXJyO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRhcnIgPSBbXTtcblx0fSBlbHNlIHtcblx0XHQvLyBSZXN1bHQ6IE5vbiBwbGFpbiBhcnJheVxuXHRcdENvbnRleHQgPSB0aGlzO1xuXHR9XG5cblx0aWYgKCFpc0FycmF5KGFycmF5TGlrZSkpIHtcblx0XHRpZiAoKGdldEl0ZXJhdG9yID0gYXJyYXlMaWtlW2l0ZXJhdG9yU3ltYm9sXSkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gU291cmNlOiBJdGVyYXRvclxuXHRcdFx0aXRlcmF0b3IgPSBjYWxsYWJsZShnZXRJdGVyYXRvcikuY2FsbChhcnJheUxpa2UpO1xuXHRcdFx0aWYgKENvbnRleHQpIGFyciA9IG5ldyBDb250ZXh0KCk7XG5cdFx0XHRyZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG5cdFx0XHRpID0gMDtcblx0XHRcdHdoaWxlICghcmVzdWx0LmRvbmUpIHtcblx0XHRcdFx0dmFsdWUgPSBtYXBGbiA/IGNhbGwuY2FsbChtYXBGbiwgdGhpc0FyZywgcmVzdWx0LnZhbHVlLCBpKSA6IHJlc3VsdC52YWx1ZTtcblx0XHRcdFx0aWYgKENvbnRleHQpIHtcblx0XHRcdFx0XHRkZXNjLnZhbHVlID0gdmFsdWU7XG5cdFx0XHRcdFx0ZGVmaW5lUHJvcGVydHkoYXJyLCBpLCBkZXNjKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhcnJbaV0gPSB2YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG5cdFx0XHRcdCsraTtcblx0XHRcdH1cblx0XHRcdGxlbmd0aCA9IGk7XG5cdFx0fSBlbHNlIGlmIChpc1N0cmluZyhhcnJheUxpa2UpKSB7XG5cdFx0XHQvLyBTb3VyY2U6IFN0cmluZ1xuXHRcdFx0bGVuZ3RoID0gYXJyYXlMaWtlLmxlbmd0aDtcblx0XHRcdGlmIChDb250ZXh0KSBhcnIgPSBuZXcgQ29udGV4dCgpO1xuXHRcdFx0Zm9yIChpID0gMCwgaiA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuXHRcdFx0XHR2YWx1ZSA9IGFycmF5TGlrZVtpXTtcblx0XHRcdFx0aWYgKGkgKyAxIDwgbGVuZ3RoKSB7XG5cdFx0XHRcdFx0Y29kZSA9IHZhbHVlLmNoYXJDb2RlQXQoMCk7XG5cdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1kZXB0aFxuXHRcdFx0XHRcdGlmIChjb2RlID49IDB4ZDgwMCAmJiBjb2RlIDw9IDB4ZGJmZikgdmFsdWUgKz0gYXJyYXlMaWtlWysraV07XG5cdFx0XHRcdH1cblx0XHRcdFx0dmFsdWUgPSBtYXBGbiA/IGNhbGwuY2FsbChtYXBGbiwgdGhpc0FyZywgdmFsdWUsIGopIDogdmFsdWU7XG5cdFx0XHRcdGlmIChDb250ZXh0KSB7XG5cdFx0XHRcdFx0ZGVzYy52YWx1ZSA9IHZhbHVlO1xuXHRcdFx0XHRcdGRlZmluZVByb3BlcnR5KGFyciwgaiwgZGVzYyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YXJyW2pdID0gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0KytqO1xuXHRcdFx0fVxuXHRcdFx0bGVuZ3RoID0gajtcblx0XHR9XG5cdH1cblx0aWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly8gU291cmNlOiBhcnJheSBvciBhcnJheS1saWtlXG5cdFx0bGVuZ3RoID0gdG9Qb3NJbnQoYXJyYXlMaWtlLmxlbmd0aCk7XG5cdFx0aWYgKENvbnRleHQpIGFyciA9IG5ldyBDb250ZXh0KGxlbmd0aCk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG5cdFx0XHR2YWx1ZSA9IG1hcEZuID8gY2FsbC5jYWxsKG1hcEZuLCB0aGlzQXJnLCBhcnJheUxpa2VbaV0sIGkpIDogYXJyYXlMaWtlW2ldO1xuXHRcdFx0aWYgKENvbnRleHQpIHtcblx0XHRcdFx0ZGVzYy52YWx1ZSA9IHZhbHVlO1xuXHRcdFx0XHRkZWZpbmVQcm9wZXJ0eShhcnIsIGksIGRlc2MpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YXJyW2ldID0gdmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGlmIChDb250ZXh0KSB7XG5cdFx0ZGVzYy52YWx1ZSA9IG51bGw7XG5cdFx0YXJyLmxlbmd0aCA9IGxlbmd0aDtcblx0fVxuXHRyZXR1cm4gYXJyO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDc5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBvYmpUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsIGlkID0gb2JqVG9TdHJpbmcuY2FsbChfX3dlYnBhY2tfcmVxdWlyZV9fKDE3KSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmpUb1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gaWQ7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogODAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVxuICAsIGZvckVhY2ggID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MSlcbiAgLCBjYWxsICAgICA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmosIGNiIC8qLCB0aGlzQXJnKi8pIHtcblx0dmFyIHJlc3VsdCA9IHt9LCB0aGlzQXJnID0gYXJndW1lbnRzWzJdO1xuXHRjYWxsYWJsZShjYik7XG5cdGZvckVhY2gob2JqLCBmdW5jdGlvbiAodmFsdWUsIGtleSwgdGFyZ2V0T2JqLCBpbmRleCkge1xuXHRcdHJlc3VsdFtrZXldID0gY2FsbC5jYWxsKGNiLCB0aGlzQXJnLCB2YWx1ZSwga2V5LCB0YXJnZXRPYmosIGluZGV4KTtcblx0fSk7XG5cdHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogODEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgyKShcImZvckVhY2hcIik7XG5cblxuLyoqKi8gfSksXG4vKiA4MiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8vIEludGVybmFsIG1ldGhvZCwgdXNlZCBieSBpdGVyYXRpb24gZnVuY3Rpb25zLlxuLy8gQ2FsbHMgYSBmdW5jdGlvbiBmb3IgZWFjaCBrZXktdmFsdWUgcGFpciBmb3VuZCBpbiBvYmplY3Rcbi8vIE9wdGlvbmFsbHkgdGFrZXMgY29tcGFyZUZuIHRvIGl0ZXJhdGUgb2JqZWN0IGluIHNwZWNpZmljIG9yZGVyXG5cblxuXG52YXIgY2FsbGFibGUgICAgICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpXG4gICwgdmFsdWUgICAgICAgICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApXG4gICwgYmluZCAgICAgICAgICAgICAgICAgICAgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZFxuICAsIGNhbGwgICAgICAgICAgICAgICAgICAgID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGxcbiAgLCBrZXlzICAgICAgICAgICAgICAgICAgICA9IE9iamVjdC5rZXlzXG4gICwgb2JqUHJvcGVydHlJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChtZXRob2QsIGRlZlZhbCkge1xuXHRyZXR1cm4gZnVuY3Rpb24gKG9iaiwgY2IgLyosIHRoaXNBcmcsIGNvbXBhcmVGbiovKSB7XG5cdFx0dmFyIGxpc3QsIHRoaXNBcmcgPSBhcmd1bWVudHNbMl0sIGNvbXBhcmVGbiA9IGFyZ3VtZW50c1szXTtcblx0XHRvYmogPSBPYmplY3QodmFsdWUob2JqKSk7XG5cdFx0Y2FsbGFibGUoY2IpO1xuXG5cdFx0bGlzdCA9IGtleXMob2JqKTtcblx0XHRpZiAoY29tcGFyZUZuKSB7XG5cdFx0XHRsaXN0LnNvcnQodHlwZW9mIGNvbXBhcmVGbiA9PT0gXCJmdW5jdGlvblwiID8gYmluZC5jYWxsKGNvbXBhcmVGbiwgb2JqKSA6IHVuZGVmaW5lZCk7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgbWV0aG9kICE9PSBcImZ1bmN0aW9uXCIpIG1ldGhvZCA9IGxpc3RbbWV0aG9kXTtcblx0XHRyZXR1cm4gY2FsbC5jYWxsKG1ldGhvZCwgbGlzdCwgZnVuY3Rpb24gKGtleSwgaW5kZXgpIHtcblx0XHRcdGlmICghb2JqUHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmosIGtleSkpIHJldHVybiBkZWZWYWw7XG5cdFx0XHRyZXR1cm4gY2FsbC5jYWxsKGNiLCB0aGlzQXJnLCBvYmpba2V5XSwga2V5LCBvYmosIGluZGV4KTtcblx0XHR9KTtcblx0fTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA4MyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8vIFRoYW5rcyBAbWF0aGlhc2J5bmVuc1xuLy8gaHR0cDovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC11bmljb2RlI2l0ZXJhdGluZy1vdmVyLXN5bWJvbHNcblxuXG5cbnZhciBzZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oNilcbiAgLCBkICAgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMylcbiAgLCBTeW1ib2wgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMilcbiAgLCBJdGVyYXRvciAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpO1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHksIFN0cmluZ0l0ZXJhdG9yO1xuXG5TdHJpbmdJdGVyYXRvciA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN0cikge1xuXHRpZiAoISh0aGlzIGluc3RhbmNlb2YgU3RyaW5nSXRlcmF0b3IpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ29uc3RydWN0b3IgcmVxdWlyZXMgJ25ldydcIik7XG5cdHN0ciA9IFN0cmluZyhzdHIpO1xuXHRJdGVyYXRvci5jYWxsKHRoaXMsIHN0cik7XG5cdGRlZmluZVByb3BlcnR5KHRoaXMsIFwiX19sZW5ndGhfX1wiLCBkKFwiXCIsIHN0ci5sZW5ndGgpKTtcbn07XG5pZiAoc2V0UHJvdG90eXBlT2YpIHNldFByb3RvdHlwZU9mKFN0cmluZ0l0ZXJhdG9yLCBJdGVyYXRvcik7XG5cbi8vIEludGVybmFsICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJSBkb2Vzbid0IGV4cG9zZSBpdHMgY29uc3RydWN0b3JcbmRlbGV0ZSBTdHJpbmdJdGVyYXRvci5wcm90b3R5cGUuY29uc3RydWN0b3I7XG5cblN0cmluZ0l0ZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3IucHJvdG90eXBlLCB7XG5cdF9uZXh0OiBkKGZ1bmN0aW9uICgpIHtcblx0XHRpZiAoIXRoaXMuX19saXN0X18pIHJldHVybiB1bmRlZmluZWQ7XG5cdFx0aWYgKHRoaXMuX19uZXh0SW5kZXhfXyA8IHRoaXMuX19sZW5ndGhfXykgcmV0dXJuIHRoaXMuX19uZXh0SW5kZXhfXysrO1xuXHRcdHRoaXMuX3VuQmluZCgpO1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH0pLFxuXHRfcmVzb2x2ZTogZChmdW5jdGlvbiAoaSkge1xuXHRcdHZhciBjaGFyID0gdGhpcy5fX2xpc3RfX1tpXSwgY29kZTtcblx0XHRpZiAodGhpcy5fX25leHRJbmRleF9fID09PSB0aGlzLl9fbGVuZ3RoX18pIHJldHVybiBjaGFyO1xuXHRcdGNvZGUgPSBjaGFyLmNoYXJDb2RlQXQoMCk7XG5cdFx0aWYgKGNvZGUgPj0gMHhkODAwICYmIGNvZGUgPD0gMHhkYmZmKSByZXR1cm4gY2hhciArIHRoaXMuX19saXN0X19bdGhpcy5fX25leHRJbmRleF9fKytdO1xuXHRcdHJldHVybiBjaGFyO1xuXHR9KVxufSk7XG5kZWZpbmVQcm9wZXJ0eShTdHJpbmdJdGVyYXRvci5wcm90b3R5cGUsIFN5bWJvbC50b1N0cmluZ1RhZywgZChcImNcIiwgXCJTdHJpbmcgSXRlcmF0b3JcIikpO1xuXG5cbi8qKiovIH0pLFxuLyogODQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIHNldFByb3RvdHlwZU9mICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KVxuICAsIGNvbnRhaW5zICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSlcbiAgLCBkICAgICAgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMylcbiAgLCBJdGVyYXRvciAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpXG4gICwgdG9TdHJpbmdUYWdTeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpLnRvU3RyaW5nVGFnXG5cbiAgLCBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eVxuICAsIFNldEl0ZXJhdG9yO1xuXG5TZXRJdGVyYXRvciA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNldCwga2luZCkge1xuXHRpZiAoISh0aGlzIGluc3RhbmNlb2YgU2V0SXRlcmF0b3IpKSByZXR1cm4gbmV3IFNldEl0ZXJhdG9yKHNldCwga2luZCk7XG5cdEl0ZXJhdG9yLmNhbGwodGhpcywgc2V0Ll9fc2V0RGF0YV9fLCBzZXQpO1xuXHRpZiAoIWtpbmQpIGtpbmQgPSAndmFsdWUnO1xuXHRlbHNlIGlmIChjb250YWlucy5jYWxsKGtpbmQsICdrZXkrdmFsdWUnKSkga2luZCA9ICdrZXkrdmFsdWUnO1xuXHRlbHNlIGtpbmQgPSAndmFsdWUnO1xuXHRkZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX19raW5kX18nLCBkKCcnLCBraW5kKSk7XG59O1xuaWYgKHNldFByb3RvdHlwZU9mKSBzZXRQcm90b3R5cGVPZihTZXRJdGVyYXRvciwgSXRlcmF0b3IpO1xuXG5TZXRJdGVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yLnByb3RvdHlwZSwge1xuXHRjb25zdHJ1Y3RvcjogZChTZXRJdGVyYXRvciksXG5cdF9yZXNvbHZlOiBkKGZ1bmN0aW9uIChpKSB7XG5cdFx0aWYgKHRoaXMuX19raW5kX18gPT09ICd2YWx1ZScpIHJldHVybiB0aGlzLl9fbGlzdF9fW2ldO1xuXHRcdHJldHVybiBbdGhpcy5fX2xpc3RfX1tpXSwgdGhpcy5fX2xpc3RfX1tpXV07XG5cdH0pLFxuXHR0b1N0cmluZzogZChmdW5jdGlvbiAoKSB7IHJldHVybiAnW29iamVjdCBTZXQgSXRlcmF0b3JdJzsgfSlcbn0pO1xuZGVmaW5lUHJvcGVydHkoU2V0SXRlcmF0b3IucHJvdG90eXBlLCB0b1N0cmluZ1RhZ1N5bWJvbCwgZCgnYycsICdTZXQgSXRlcmF0b3InKSk7XG5cblxuLyoqKi8gfSksXG4vKiA4NSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8vIEV4cG9ydHMgdHJ1ZSBpZiBlbnZpcm9ubWVudCBwcm92aWRlcyBuYXRpdmUgYFNldGAgaW1wbGVtZW50YXRpb24sXG4vLyB3aGF0ZXZlciB0aGF0IGlzLlxuXG5cblxubW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKCkge1xuXHRpZiAodHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoU2V0LnByb3RvdHlwZSkgPT09ICdbb2JqZWN0IFNldF0nKTtcbn0oKSk7XG5cblxuLyoqKi8gfSksXG4vKiA4NiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG4vKlxuXHRwc2V1ZG8gc2VsZWN0b3JzXG5cblx0LS0tXG5cblx0dGhleSBhcmUgYXZhaWxhYmxlIGluIHR3byBmb3Jtczpcblx0KiBmaWx0ZXJzIGNhbGxlZCB3aGVuIHRoZSBzZWxlY3RvclxuXHQgIGlzIGNvbXBpbGVkIGFuZCByZXR1cm4gYSBmdW5jdGlvblxuXHQgIHRoYXQgbmVlZHMgdG8gcmV0dXJuIG5leHQoKVxuXHQqIHBzZXVkb3MgZ2V0IGNhbGxlZCBvbiBleGVjdXRpb25cblx0ICB0aGV5IG5lZWQgdG8gcmV0dXJuIGEgYm9vbGVhblxuKi9cblxudmFyIGdldE5DaGVjayAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NyksXG5cdEJhc2VGdW5jcyAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KSxcblx0YXR0cmlidXRlc0ZhY3RvcnkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIzKSxcblx0dHJ1ZUZ1bmMgICAgICAgICAgPSBCYXNlRnVuY3MudHJ1ZUZ1bmMsXG5cdGZhbHNlRnVuYyAgICAgICAgID0gQmFzZUZ1bmNzLmZhbHNlRnVuYztcblxuZnVuY3Rpb24gZmlsdGVyc0ZhY3RvcnkoYWRhcHRlcil7XG5cdHZhciBhdHRyaWJ1dGVzICA9IGF0dHJpYnV0ZXNGYWN0b3J5KGFkYXB0ZXIpLFxuXHRcdGNoZWNrQXR0cmliID0gYXR0cmlidXRlcy5ydWxlcy5lcXVhbHM7XG5cblx0Ly9oZWxwZXIgbWV0aG9kc1xuXHRmdW5jdGlvbiBlcXVhbHMoYSwgYil7XG5cdFx0aWYodHlwZW9mIGFkYXB0ZXIuZXF1YWxzID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBhZGFwdGVyLmVxdWFscyhhLCBiKTtcblxuXHRcdHJldHVybiBhID09PSBiO1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0QXR0cmliRnVuYyhuYW1lLCB2YWx1ZSl7XG5cdFx0dmFyIGRhdGEgPSB7bmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlfTtcblx0XHRyZXR1cm4gZnVuY3Rpb24gYXR0cmliRnVuYyhuZXh0KXtcblx0XHRcdHJldHVybiBjaGVja0F0dHJpYihuZXh0LCBkYXRhKTtcblx0XHR9O1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0Q2hpbGRGdW5jKG5leHQpe1xuXHRcdHJldHVybiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHJldHVybiAhIWFkYXB0ZXIuZ2V0UGFyZW50KGVsZW0pICYmIG5leHQoZWxlbSk7XG5cdFx0fTtcblx0fVxuXG5cdHZhciBmaWx0ZXJzID0ge1xuXHRcdGNvbnRhaW5zOiBmdW5jdGlvbihuZXh0LCB0ZXh0KXtcblx0XHRcdHJldHVybiBmdW5jdGlvbiBjb250YWlucyhlbGVtKXtcblx0XHRcdFx0cmV0dXJuIG5leHQoZWxlbSkgJiYgYWRhcHRlci5nZXRUZXh0KGVsZW0pLmluZGV4T2YodGV4dCkgPj0gMDtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRpY29udGFpbnM6IGZ1bmN0aW9uKG5leHQsIHRleHQpe1xuXHRcdFx0dmFyIGl0ZXh0ID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGljb250YWlucyhlbGVtKXtcblx0XHRcdFx0cmV0dXJuIG5leHQoZWxlbSkgJiZcblx0XHRcdFx0XHRhZGFwdGVyLmdldFRleHQoZWxlbSkudG9Mb3dlckNhc2UoKS5pbmRleE9mKGl0ZXh0KSA+PSAwO1xuXHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0Ly9sb2NhdGlvbiBzcGVjaWZpYyBtZXRob2RzXG5cdFx0XCJudGgtY2hpbGRcIjogZnVuY3Rpb24obmV4dCwgcnVsZSl7XG5cdFx0XHR2YXIgZnVuYyA9IGdldE5DaGVjayhydWxlKTtcblxuXHRcdFx0aWYoZnVuYyA9PT0gZmFsc2VGdW5jKSByZXR1cm4gZnVuYztcblx0XHRcdGlmKGZ1bmMgPT09IHRydWVGdW5jKSAgcmV0dXJuIGdldENoaWxkRnVuYyhuZXh0KTtcblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIG50aENoaWxkKGVsZW0pe1xuXHRcdFx0XHR2YXIgc2libGluZ3MgPSBhZGFwdGVyLmdldFNpYmxpbmdzKGVsZW0pO1xuXG5cdFx0XHRcdGZvcih2YXIgaSA9IDAsIHBvcyA9IDA7IGkgPCBzaWJsaW5ncy5sZW5ndGg7IGkrKyl7XG5cdFx0XHRcdFx0aWYoYWRhcHRlci5pc1RhZyhzaWJsaW5nc1tpXSkpe1xuXHRcdFx0XHRcdFx0aWYoc2libGluZ3NbaV0gPT09IGVsZW0pIGJyZWFrO1xuXHRcdFx0XHRcdFx0ZWxzZSBwb3MrKztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZnVuYyhwb3MpICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0XCJudGgtbGFzdC1jaGlsZFwiOiBmdW5jdGlvbihuZXh0LCBydWxlKXtcblx0XHRcdHZhciBmdW5jID0gZ2V0TkNoZWNrKHJ1bGUpO1xuXG5cdFx0XHRpZihmdW5jID09PSBmYWxzZUZ1bmMpIHJldHVybiBmdW5jO1xuXHRcdFx0aWYoZnVuYyA9PT0gdHJ1ZUZ1bmMpICByZXR1cm4gZ2V0Q2hpbGRGdW5jKG5leHQpO1xuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gbnRoTGFzdENoaWxkKGVsZW0pe1xuXHRcdFx0XHR2YXIgc2libGluZ3MgPSBhZGFwdGVyLmdldFNpYmxpbmdzKGVsZW0pO1xuXG5cdFx0XHRcdGZvcih2YXIgcG9zID0gMCwgaSA9IHNpYmxpbmdzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXtcblx0XHRcdFx0XHRpZihhZGFwdGVyLmlzVGFnKHNpYmxpbmdzW2ldKSl7XG5cdFx0XHRcdFx0XHRpZihzaWJsaW5nc1tpXSA9PT0gZWxlbSkgYnJlYWs7XG5cdFx0XHRcdFx0XHRlbHNlIHBvcysrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBmdW5jKHBvcykgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRcIm50aC1vZi10eXBlXCI6IGZ1bmN0aW9uKG5leHQsIHJ1bGUpe1xuXHRcdFx0dmFyIGZ1bmMgPSBnZXROQ2hlY2socnVsZSk7XG5cblx0XHRcdGlmKGZ1bmMgPT09IGZhbHNlRnVuYykgcmV0dXJuIGZ1bmM7XG5cdFx0XHRpZihmdW5jID09PSB0cnVlRnVuYykgIHJldHVybiBnZXRDaGlsZEZ1bmMobmV4dCk7XG5cblx0XHRcdHJldHVybiBmdW5jdGlvbiBudGhPZlR5cGUoZWxlbSl7XG5cdFx0XHRcdHZhciBzaWJsaW5ncyA9IGFkYXB0ZXIuZ2V0U2libGluZ3MoZWxlbSk7XG5cblx0XHRcdFx0Zm9yKHZhciBwb3MgPSAwLCBpID0gMDsgaSA8IHNpYmxpbmdzLmxlbmd0aDsgaSsrKXtcblx0XHRcdFx0XHRpZihhZGFwdGVyLmlzVGFnKHNpYmxpbmdzW2ldKSl7XG5cdFx0XHRcdFx0XHRpZihzaWJsaW5nc1tpXSA9PT0gZWxlbSkgYnJlYWs7XG5cdFx0XHRcdFx0XHRpZihhZGFwdGVyLmdldE5hbWUoc2libGluZ3NbaV0pID09PSBhZGFwdGVyLmdldE5hbWUoZWxlbSkpIHBvcysrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBmdW5jKHBvcykgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRcIm50aC1sYXN0LW9mLXR5cGVcIjogZnVuY3Rpb24obmV4dCwgcnVsZSl7XG5cdFx0XHR2YXIgZnVuYyA9IGdldE5DaGVjayhydWxlKTtcblxuXHRcdFx0aWYoZnVuYyA9PT0gZmFsc2VGdW5jKSByZXR1cm4gZnVuYztcblx0XHRcdGlmKGZ1bmMgPT09IHRydWVGdW5jKSAgcmV0dXJuIGdldENoaWxkRnVuYyhuZXh0KTtcblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIG50aExhc3RPZlR5cGUoZWxlbSl7XG5cdFx0XHRcdHZhciBzaWJsaW5ncyA9IGFkYXB0ZXIuZ2V0U2libGluZ3MoZWxlbSk7XG5cblx0XHRcdFx0Zm9yKHZhciBwb3MgPSAwLCBpID0gc2libGluZ3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pe1xuXHRcdFx0XHRcdGlmKGFkYXB0ZXIuaXNUYWcoc2libGluZ3NbaV0pKXtcblx0XHRcdFx0XHRcdGlmKHNpYmxpbmdzW2ldID09PSBlbGVtKSBicmVhaztcblx0XHRcdFx0XHRcdGlmKGFkYXB0ZXIuZ2V0TmFtZShzaWJsaW5nc1tpXSkgPT09IGFkYXB0ZXIuZ2V0TmFtZShlbGVtKSkgcG9zKys7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGZ1bmMocG9zKSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0Ly9UT0RPIGRldGVybWluZSB0aGUgYWN0dWFsIHJvb3QgZWxlbWVudFxuXHRcdHJvb3Q6IGZ1bmN0aW9uKG5leHQpe1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0XHRyZXR1cm4gIWFkYXB0ZXIuZ2V0UGFyZW50KGVsZW0pICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRzY29wZTogZnVuY3Rpb24obmV4dCwgcnVsZSwgb3B0aW9ucywgY29udGV4dCl7XG5cdFx0XHRpZighY29udGV4dCB8fCBjb250ZXh0Lmxlbmd0aCA9PT0gMCl7XG5cdFx0XHRcdC8vZXF1aXZhbGVudCB0byA6cm9vdFxuXHRcdFx0XHRyZXR1cm4gZmlsdGVycy5yb290KG5leHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZihjb250ZXh0Lmxlbmd0aCA9PT0gMSl7XG5cdFx0XHRcdC8vTk9URTogY2FuJ3QgYmUgdW5wYWNrZWQsIGFzIDpoYXMgdXNlcyB0aGlzIGZvciBzaWRlLWVmZmVjdHNcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0XHRcdHJldHVybiBlcXVhbHMoY29udGV4dFswXSwgZWxlbSkgJiYgbmV4dChlbGVtKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dC5pbmRleE9mKGVsZW0pID49IDAgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdC8valF1ZXJ5IGV4dGVuc2lvbnMgKG90aGVycyBmb2xsb3cgYXMgcHNldWRvcylcblx0XHRjaGVja2JveDogZ2V0QXR0cmliRnVuYyhcInR5cGVcIiwgXCJjaGVja2JveFwiKSxcblx0XHRmaWxlOiBnZXRBdHRyaWJGdW5jKFwidHlwZVwiLCBcImZpbGVcIiksXG5cdFx0cGFzc3dvcmQ6IGdldEF0dHJpYkZ1bmMoXCJ0eXBlXCIsIFwicGFzc3dvcmRcIiksXG5cdFx0cmFkaW86IGdldEF0dHJpYkZ1bmMoXCJ0eXBlXCIsIFwicmFkaW9cIiksXG5cdFx0cmVzZXQ6IGdldEF0dHJpYkZ1bmMoXCJ0eXBlXCIsIFwicmVzZXRcIiksXG5cdFx0aW1hZ2U6IGdldEF0dHJpYkZ1bmMoXCJ0eXBlXCIsIFwiaW1hZ2VcIiksXG5cdFx0c3VibWl0OiBnZXRBdHRyaWJGdW5jKFwidHlwZVwiLCBcInN1Ym1pdFwiKVxuXHR9O1xuXHRyZXR1cm4gZmlsdGVycztcbn1cblxuZnVuY3Rpb24gcHNldWRvc0ZhY3RvcnkoYWRhcHRlcil7XG5cdC8vaGVscGVyIG1ldGhvZHNcblx0ZnVuY3Rpb24gZ2V0Rmlyc3RFbGVtZW50KGVsZW1zKXtcblx0XHRmb3IodmFyIGkgPSAwOyBlbGVtcyAmJiBpIDwgZWxlbXMubGVuZ3RoOyBpKyspe1xuXHRcdFx0aWYoYWRhcHRlci5pc1RhZyhlbGVtc1tpXSkpIHJldHVybiBlbGVtc1tpXTtcblx0XHR9XG5cdH1cblxuXHQvL3doaWxlIGZpbHRlcnMgYXJlIHByZWNvbXBpbGVkLCBwc2V1ZG9zIGdldCBjYWxsZWQgd2hlbiB0aGV5IGFyZSBuZWVkZWRcblx0dmFyIHBzZXVkb3MgPSB7XG5cdFx0ZW1wdHk6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0cmV0dXJuICFhZGFwdGVyLmdldENoaWxkcmVuKGVsZW0pLnNvbWUoZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRcdHJldHVybiBhZGFwdGVyLmlzVGFnKGVsZW0pIHx8IGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCI7XG5cdFx0XHR9KTtcblx0XHR9LFxuXG5cdFx0XCJmaXJzdC1jaGlsZFwiOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHJldHVybiBnZXRGaXJzdEVsZW1lbnQoYWRhcHRlci5nZXRTaWJsaW5ncyhlbGVtKSkgPT09IGVsZW07XG5cdFx0fSxcblx0XHRcImxhc3QtY2hpbGRcIjogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHR2YXIgc2libGluZ3MgPSBhZGFwdGVyLmdldFNpYmxpbmdzKGVsZW0pO1xuXG5cdFx0XHRmb3IodmFyIGkgPSBzaWJsaW5ncy5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7XG5cdFx0XHRcdGlmKHNpYmxpbmdzW2ldID09PSBlbGVtKSByZXR1cm4gdHJ1ZTtcblx0XHRcdFx0aWYoYWRhcHRlci5pc1RhZyhzaWJsaW5nc1tpXSkpIGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblx0XHRcImZpcnN0LW9mLXR5cGVcIjogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHR2YXIgc2libGluZ3MgPSBhZGFwdGVyLmdldFNpYmxpbmdzKGVsZW0pO1xuXG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgc2libGluZ3MubGVuZ3RoOyBpKyspe1xuXHRcdFx0XHRpZihhZGFwdGVyLmlzVGFnKHNpYmxpbmdzW2ldKSl7XG5cdFx0XHRcdFx0aWYoc2libGluZ3NbaV0gPT09IGVsZW0pIHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdGlmKGFkYXB0ZXIuZ2V0TmFtZShzaWJsaW5nc1tpXSkgPT09IGFkYXB0ZXIuZ2V0TmFtZShlbGVtKSkgYnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0sXG5cdFx0XCJsYXN0LW9mLXR5cGVcIjogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHR2YXIgc2libGluZ3MgPSBhZGFwdGVyLmdldFNpYmxpbmdzKGVsZW0pO1xuXG5cdFx0XHRmb3IodmFyIGkgPSBzaWJsaW5ncy5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7XG5cdFx0XHRcdGlmKGFkYXB0ZXIuaXNUYWcoc2libGluZ3NbaV0pKXtcblx0XHRcdFx0XHRpZihzaWJsaW5nc1tpXSA9PT0gZWxlbSkgcmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0aWYoYWRhcHRlci5nZXROYW1lKHNpYmxpbmdzW2ldKSA9PT0gYWRhcHRlci5nZXROYW1lKGVsZW0pKSBicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblx0XHRcIm9ubHktb2YtdHlwZVwiOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHZhciBzaWJsaW5ncyA9IGFkYXB0ZXIuZ2V0U2libGluZ3MoZWxlbSk7XG5cblx0XHRcdGZvcih2YXIgaSA9IDAsIGogPSBzaWJsaW5ncy5sZW5ndGg7IGkgPCBqOyBpKyspe1xuXHRcdFx0XHRpZihhZGFwdGVyLmlzVGFnKHNpYmxpbmdzW2ldKSl7XG5cdFx0XHRcdFx0aWYoc2libGluZ3NbaV0gPT09IGVsZW0pIGNvbnRpbnVlO1xuXHRcdFx0XHRcdGlmKGFkYXB0ZXIuZ2V0TmFtZShzaWJsaW5nc1tpXSkgPT09IGFkYXB0ZXIuZ2V0TmFtZShlbGVtKSkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cdFx0XCJvbmx5LWNoaWxkXCI6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0dmFyIHNpYmxpbmdzID0gYWRhcHRlci5nZXRTaWJsaW5ncyhlbGVtKTtcblxuXHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IHNpYmxpbmdzLmxlbmd0aDsgaSsrKXtcblx0XHRcdFx0aWYoYWRhcHRlci5pc1RhZyhzaWJsaW5nc1tpXSkgJiYgc2libGluZ3NbaV0gIT09IGVsZW0pIHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblxuXHRcdC8vOm1hdGNoZXMoYSwgYXJlYSwgbGluaylbaHJlZl1cblx0XHRsaW5rOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHJldHVybiBhZGFwdGVyLmhhc0F0dHJpYihlbGVtLCBcImhyZWZcIik7XG5cdFx0fSxcblx0XHR2aXNpdGVkOiBmYWxzZUZ1bmMsIC8vc2VlbXMgdG8gYmUgYSB2YWxpZCBpbXBsZW1lbnRhdGlvblxuXHRcdC8vVE9ETzogOmFueS1saW5rIG9uY2UgdGhlIG5hbWUgaXMgZmluYWxpemVkIChhcyBhbiBhbGlhcyBvZiA6bGluaylcblxuXHRcdC8vZm9ybXNcblx0XHQvL3RvIGNvbnNpZGVyOiA6dGFyZ2V0XG5cblx0XHQvLzptYXRjaGVzKFtzZWxlY3RlZF0sIHNlbGVjdDpub3QoW211bHRpcGxlXSk6bm90KD4gb3B0aW9uW3NlbGVjdGVkXSkgPiBvcHRpb246Zmlyc3Qtb2YtdHlwZSlcblx0XHRzZWxlY3RlZDogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRpZihhZGFwdGVyLmhhc0F0dHJpYihlbGVtLCBcInNlbGVjdGVkXCIpKSByZXR1cm4gdHJ1ZTtcblx0XHRcdGVsc2UgaWYoYWRhcHRlci5nZXROYW1lKGVsZW0pICE9PSBcIm9wdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cblx0XHRcdC8vdGhlIGZpcnN0IDxvcHRpb24+IGluIGEgPHNlbGVjdD4gaXMgYWxzbyBzZWxlY3RlZFxuXHRcdFx0dmFyIHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGVsZW0pO1xuXG5cdFx0XHRpZihcblx0XHRcdFx0IXBhcmVudCB8fFxuXHRcdFx0XHRhZGFwdGVyLmdldE5hbWUocGFyZW50KSAhPT0gXCJzZWxlY3RcIiB8fFxuXHRcdFx0XHRhZGFwdGVyLmhhc0F0dHJpYihwYXJlbnQsIFwibXVsdGlwbGVcIilcblx0XHRcdCkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0XHR2YXIgc2libGluZ3MgPSBhZGFwdGVyLmdldENoaWxkcmVuKHBhcmVudCksXG5cdFx0XHRcdHNhd0VsZW0gID0gZmFsc2U7XG5cblx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzaWJsaW5ncy5sZW5ndGg7IGkrKyl7XG5cdFx0XHRcdGlmKGFkYXB0ZXIuaXNUYWcoc2libGluZ3NbaV0pKXtcblx0XHRcdFx0XHRpZihzaWJsaW5nc1tpXSA9PT0gZWxlbSl7XG5cdFx0XHRcdFx0XHRzYXdFbGVtID0gdHJ1ZTtcblx0XHRcdFx0XHR9IGVsc2UgaWYoIXNhd0VsZW0pe1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH0gZWxzZSBpZihhZGFwdGVyLmhhc0F0dHJpYihzaWJsaW5nc1tpXSwgXCJzZWxlY3RlZFwiKSl7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzYXdFbGVtO1xuXHRcdH0sXG5cdFx0Ly9odHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNkaXNhYmxlZC1lbGVtZW50c1xuXHRcdC8vOm1hdGNoZXMoXG5cdFx0Ly8gIDptYXRjaGVzKGJ1dHRvbiwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIG1lbnVpdGVtLCBvcHRncm91cCwgb3B0aW9uKVtkaXNhYmxlZF0sXG5cdFx0Ly8gIG9wdGdyb3VwW2Rpc2FibGVkXSA+IG9wdGlvbiksXG5cdFx0Ly8gZmllbGRzZXRbZGlzYWJsZWRdICogLy9UT0RPIG5vdCBjaGlsZCBvZiBmaXJzdCA8bGVnZW5kPlxuXHRcdC8vKVxuXHRcdGRpc2FibGVkOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHJldHVybiBhZGFwdGVyLmhhc0F0dHJpYihlbGVtLCBcImRpc2FibGVkXCIpO1xuXHRcdH0sXG5cdFx0ZW5hYmxlZDogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRyZXR1cm4gIWFkYXB0ZXIuaGFzQXR0cmliKGVsZW0sIFwiZGlzYWJsZWRcIik7XG5cdFx0fSxcblx0XHQvLzptYXRjaGVzKDptYXRjaGVzKDpyYWRpbywgOmNoZWNrYm94KVtjaGVja2VkXSwgOnNlbGVjdGVkKSAoVE9ETyBtZW51aXRlbSlcblx0XHRjaGVja2VkOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHJldHVybiBhZGFwdGVyLmhhc0F0dHJpYihlbGVtLCBcImNoZWNrZWRcIikgfHwgcHNldWRvcy5zZWxlY3RlZChlbGVtKTtcblx0XHR9LFxuXHRcdC8vOm1hdGNoZXMoaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEpW3JlcXVpcmVkXVxuXHRcdHJlcXVpcmVkOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHJldHVybiBhZGFwdGVyLmhhc0F0dHJpYihlbGVtLCBcInJlcXVpcmVkXCIpO1xuXHRcdH0sXG5cdFx0Ly86bWF0Y2hlcyhpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSk6bm90KFtyZXF1aXJlZF0pXG5cdFx0b3B0aW9uYWw6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0cmV0dXJuICFhZGFwdGVyLmhhc0F0dHJpYihlbGVtLCBcInJlcXVpcmVkXCIpO1xuXHRcdH0sXG5cblx0XHQvL2pRdWVyeSBleHRlbnNpb25zXG5cblx0XHQvLzpub3QoOmVtcHR5KVxuXHRcdHBhcmVudDogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRyZXR1cm4gIXBzZXVkb3MuZW1wdHkoZWxlbSk7XG5cdFx0fSxcblx0XHQvLzptYXRjaGVzKGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYpXG5cdFx0aGVhZGVyOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHZhciBuYW1lID0gYWRhcHRlci5nZXROYW1lKGVsZW0pO1xuXHRcdFx0cmV0dXJuIG5hbWUgPT09IFwiaDFcIiB8fFxuXHRcdFx0XHRcdG5hbWUgPT09IFwiaDJcIiB8fFxuXHRcdFx0XHRcdG5hbWUgPT09IFwiaDNcIiB8fFxuXHRcdFx0XHRcdG5hbWUgPT09IFwiaDRcIiB8fFxuXHRcdFx0XHRcdG5hbWUgPT09IFwiaDVcIiB8fFxuXHRcdFx0XHRcdG5hbWUgPT09IFwiaDZcIjtcblx0XHR9LFxuXG5cdFx0Ly86bWF0Y2hlcyhidXR0b24sIGlucHV0W3R5cGU9YnV0dG9uXSlcblx0XHRidXR0b246IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0dmFyIG5hbWUgPSBhZGFwdGVyLmdldE5hbWUoZWxlbSk7XG5cdFx0XHRyZXR1cm4gbmFtZSA9PT0gXCJidXR0b25cIiB8fFxuXHRcdFx0XHRcdG5hbWUgPT09IFwiaW5wdXRcIiAmJlxuXHRcdFx0XHRcdGFkYXB0ZXIuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbSwgXCJ0eXBlXCIpID09PSBcImJ1dHRvblwiO1xuXHRcdH0sXG5cdFx0Ly86bWF0Y2hlcyhpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCwgYnV0dG9uKVxuXHRcdGlucHV0OiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHZhciBuYW1lID0gYWRhcHRlci5nZXROYW1lKGVsZW0pO1xuXHRcdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiB8fFxuXHRcdFx0XHRcdG5hbWUgPT09IFwidGV4dGFyZWFcIiB8fFxuXHRcdFx0XHRcdG5hbWUgPT09IFwic2VsZWN0XCIgfHxcblx0XHRcdFx0XHRuYW1lID09PSBcImJ1dHRvblwiO1xuXHRcdH0sXG5cdFx0Ly9pbnB1dDptYXRjaGVzKDpub3QoW3R5cGUhPScnXSksIFt0eXBlPSd0ZXh0JyBpXSlcblx0XHR0ZXh0OiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHZhciBhdHRyO1xuXHRcdFx0cmV0dXJuIGFkYXB0ZXIuZ2V0TmFtZShlbGVtKSA9PT0gXCJpbnB1dFwiICYmIChcblx0XHRcdFx0IShhdHRyID0gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBcInR5cGVcIikpIHx8XG5cdFx0XHRcdGF0dHIudG9Mb3dlckNhc2UoKSA9PT0gXCJ0ZXh0XCJcblx0XHRcdCk7XG5cdFx0fVxuXHR9O1xuXG5cdHJldHVybiBwc2V1ZG9zO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlBcmdzKGZ1bmMsIG5hbWUsIHN1YnNlbGVjdCl7XG5cdGlmKHN1YnNlbGVjdCA9PT0gbnVsbCl7XG5cdFx0aWYoZnVuYy5sZW5ndGggPiAxICYmIG5hbWUgIT09IFwic2NvcGVcIil7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJwc2V1ZG8tc2VsZWN0b3IgOlwiICsgbmFtZSArIFwiIHJlcXVpcmVzIGFuIGFyZ3VtZW50XCIpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRpZihmdW5jLmxlbmd0aCA9PT0gMSl7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJwc2V1ZG8tc2VsZWN0b3IgOlwiICsgbmFtZSArIFwiIGRvZXNuJ3QgaGF2ZSBhbnkgYXJndW1lbnRzXCIpO1xuXHRcdH1cblx0fVxufVxuXG4vL0ZJWE1FIHRoaXMgZmVlbHMgaGFja3lcbnZhciByZV9DU1MzID0gL14oPzooPzpudGh8bGFzdHxmaXJzdHxvbmx5KS0oPzpjaGlsZHxvZi10eXBlKXxyb290fGVtcHR5fCg/OmVufGRpcylhYmxlZHxjaGVja2VkfG5vdCkkLztcblxuZnVuY3Rpb24gZmFjdG9yeShhZGFwdGVyKXtcblx0dmFyIHBzZXVkb3MgPSBwc2V1ZG9zRmFjdG9yeShhZGFwdGVyKTtcblx0dmFyIGZpbHRlcnMgPSBmaWx0ZXJzRmFjdG9yeShhZGFwdGVyKTtcblxuXHRyZXR1cm4ge1xuXHRcdGNvbXBpbGU6IGZ1bmN0aW9uKG5leHQsIGRhdGEsIG9wdGlvbnMsIGNvbnRleHQpe1xuXHRcdFx0dmFyIG5hbWUgPSBkYXRhLm5hbWUsXG5cdFx0XHRcdHN1YnNlbGVjdCA9IGRhdGEuZGF0YTtcblxuXHRcdFx0aWYob3B0aW9ucyAmJiBvcHRpb25zLnN0cmljdCAmJiAhcmVfQ1NTMy50ZXN0KG5hbWUpKXtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiOlwiICsgbmFtZSArIFwiIGlzbid0IHBhcnQgb2YgQ1NTM1wiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYodHlwZW9mIGZpbHRlcnNbbmFtZV0gPT09IFwiZnVuY3Rpb25cIil7XG5cdFx0XHRcdHZlcmlmeUFyZ3MoZmlsdGVyc1tuYW1lXSwgbmFtZSwgIHN1YnNlbGVjdCk7XG5cdFx0XHRcdHJldHVybiBmaWx0ZXJzW25hbWVdKG5leHQsIHN1YnNlbGVjdCwgb3B0aW9ucywgY29udGV4dCk7XG5cdFx0XHR9IGVsc2UgaWYodHlwZW9mIHBzZXVkb3NbbmFtZV0gPT09IFwiZnVuY3Rpb25cIil7XG5cdFx0XHRcdHZhciBmdW5jID0gcHNldWRvc1tuYW1lXTtcblx0XHRcdFx0dmVyaWZ5QXJncyhmdW5jLCBuYW1lLCBzdWJzZWxlY3QpO1xuXG5cdFx0XHRcdGlmKG5leHQgPT09IHRydWVGdW5jKSByZXR1cm4gZnVuYztcblxuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gcHNldWRvQXJncyhlbGVtKXtcblx0XHRcdFx0XHRyZXR1cm4gZnVuYyhlbGVtLCBzdWJzZWxlY3QpICYmIG5leHQoZWxlbSk7XG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ1bm1hdGNoZWQgcHNldWRvLWNsYXNzIDpcIiArIG5hbWUpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0ZmlsdGVyczogZmlsdGVycyxcblx0XHRwc2V1ZG9zOiBwc2V1ZG9zXG5cdH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmFjdG9yeTtcblxuXG4vKioqLyB9KSxcbi8qIDg3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBwYXJzZSA9IF9fd2VicGFja19yZXF1aXJlX18oODgpLFxuICAgIGNvbXBpbGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg5KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBudGhDaGVjayhmb3JtdWxhKXtcblx0cmV0dXJuIGNvbXBpbGUocGFyc2UoZm9ybXVsYSkpO1xufTtcblxubW9kdWxlLmV4cG9ydHMucGFyc2UgPSBwYXJzZTtcbm1vZHVsZS5leHBvcnRzLmNvbXBpbGUgPSBjb21waWxlO1xuXG4vKioqLyB9KSxcbi8qIDg4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyc2U7XG5cbi8vZm9sbG93aW5nIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyNudGgtY2hpbGQtcHNldWRvXG5cbi8vWyBbJy0nfCcrJ10/IElOVEVHRVI/IHtOfSBbIFMqIFsnLSd8JysnXSBTKiBJTlRFR0VSIF0/XG52YXIgcmVfbnRoRWxlbWVudCA9IC9eKFsrXFwtXT9cXGQqbik/XFxzKig/OihbK1xcLV0/KVxccyooXFxkKykpPyQvO1xuXG4vKlxuXHRwYXJzZXMgYSBudGgtY2hlY2sgZm9ybXVsYSwgcmV0dXJucyBhbiBhcnJheSBvZiB0d28gbnVtYmVyc1xuKi9cbmZ1bmN0aW9uIHBhcnNlKGZvcm11bGEpe1xuXHRmb3JtdWxhID0gZm9ybXVsYS50cmltKCkudG9Mb3dlckNhc2UoKTtcblxuXHRpZihmb3JtdWxhID09PSBcImV2ZW5cIil7XG5cdFx0cmV0dXJuIFsyLCAwXTtcblx0fSBlbHNlIGlmKGZvcm11bGEgPT09IFwib2RkXCIpe1xuXHRcdHJldHVybiBbMiwgMV07XG5cdH0gZWxzZSB7XG5cdFx0dmFyIHBhcnNlZCA9IGZvcm11bGEubWF0Y2gocmVfbnRoRWxlbWVudCk7XG5cblx0XHRpZighcGFyc2VkKXtcblx0XHRcdHRocm93IG5ldyBTeW50YXhFcnJvcihcIm4tdGggcnVsZSBjb3VsZG4ndCBiZSBwYXJzZWQgKCdcIiArIGZvcm11bGEgKyBcIicpXCIpO1xuXHRcdH1cblxuXHRcdHZhciBhO1xuXG5cdFx0aWYocGFyc2VkWzFdKXtcblx0XHRcdGEgPSBwYXJzZUludChwYXJzZWRbMV0sIDEwKTtcblx0XHRcdGlmKGlzTmFOKGEpKXtcblx0XHRcdFx0aWYocGFyc2VkWzFdLmNoYXJBdCgwKSA9PT0gXCItXCIpIGEgPSAtMTtcblx0XHRcdFx0ZWxzZSBhID0gMTtcblx0XHRcdH1cblx0XHR9IGVsc2UgYSA9IDA7XG5cblx0XHRyZXR1cm4gW1xuXHRcdFx0YSxcblx0XHRcdHBhcnNlZFszXSA/IHBhcnNlSW50KChwYXJzZWRbMl0gfHwgXCJcIikgKyBwYXJzZWRbM10sIDEwKSA6IDBcblx0XHRdO1xuXHR9XG59XG5cblxuLyoqKi8gfSksXG4vKiA4OSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBpbGU7XG5cbnZhciBCYXNlRnVuY3MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpLFxuICAgIHRydWVGdW5jICA9IEJhc2VGdW5jcy50cnVlRnVuYyxcbiAgICBmYWxzZUZ1bmMgPSBCYXNlRnVuY3MuZmFsc2VGdW5jO1xuXG4vKlxuXHRyZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgYW4gZWxlbWVudHMgaW5kZXggbWF0Y2hlcyB0aGUgZ2l2ZW4gcnVsZVxuXHRoaWdobHkgb3B0aW1pemVkIHRvIHJldHVybiB0aGUgZmFzdGVzdCBzb2x1dGlvblxuKi9cbmZ1bmN0aW9uIGNvbXBpbGUocGFyc2VkKXtcblx0dmFyIGEgPSBwYXJzZWRbMF0sXG5cdCAgICBiID0gcGFyc2VkWzFdIC0gMTtcblxuXHQvL3doZW4gYiA8PSAwLCBhKm4gd29uJ3QgYmUgcG9zc2libGUgZm9yIGFueSBtYXRjaGVzIHdoZW4gYSA8IDBcblx0Ly9iZXNpZGVzLCB0aGUgc3BlY2lmaWNhdGlvbiBzYXlzIHRoYXQgbm8gZWxlbWVudCBpcyBtYXRjaGVkIHdoZW4gYSBhbmQgYiBhcmUgMFxuXHRpZihiIDwgMCAmJiBhIDw9IDApIHJldHVybiBmYWxzZUZ1bmM7XG5cblx0Ly93aGVuIGEgaXMgaW4gdGhlIHJhbmdlIC0xLi4xLCBpdCBtYXRjaGVzIGFueSBlbGVtZW50IChzbyBvbmx5IGIgaXMgY2hlY2tlZClcblx0aWYoYSA9PT0tMSkgcmV0dXJuIGZ1bmN0aW9uKHBvcyl7IHJldHVybiBwb3MgPD0gYjsgfTtcblx0aWYoYSA9PT0gMCkgcmV0dXJuIGZ1bmN0aW9uKHBvcyl7IHJldHVybiBwb3MgPT09IGI7IH07XG5cdC8vd2hlbiBiIDw9IDAgYW5kIGEgPT09IDEsIHRoZXkgbWF0Y2ggYW55IGVsZW1lbnRcblx0aWYoYSA9PT0gMSkgcmV0dXJuIGIgPCAwID8gdHJ1ZUZ1bmMgOiBmdW5jdGlvbihwb3MpeyByZXR1cm4gcG9zID49IGI7IH07XG5cblx0Ly93aGVuIGEgPiAwLCBtb2R1bG8gY2FuIGJlIHVzZWQgdG8gY2hlY2sgaWYgdGhlcmUgaXMgYSBtYXRjaFxuXHR2YXIgYk1vZCA9IGIgJSBhO1xuXHRpZihiTW9kIDwgMCkgYk1vZCArPSBhO1xuXG5cdGlmKGEgPiAxKXtcblx0XHRyZXR1cm4gZnVuY3Rpb24ocG9zKXtcblx0XHRcdHJldHVybiBwb3MgPj0gYiAmJiBwb3MgJSBhID09PSBiTW9kO1xuXHRcdH07XG5cdH1cblxuXHRhICo9IC0xOyAvL21ha2UgYGFgIHBvc2l0aXZlXG5cblx0cmV0dXJuIGZ1bmN0aW9uKHBvcyl7XG5cdFx0cmV0dXJuIHBvcyA8PSBiICYmIHBvcyAlIGEgPT09IGJNb2Q7XG5cdH07XG59XG5cbi8qKiovIH0pXG4vKioqKioqLyBdKTtcbn0pO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2Nzcy1zZWxlY3QtdW1kL2Rpc3QvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL2Nzcy1zZWxlY3QtdW1kL2Rpc3QvaW5kZXguanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiLyohXG5cbiBkaWZmIHYzLjQuMFxuXG5Tb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpXG5cbkNvcHlyaWdodCAoYykgMjAwOS0yMDE1LCBLZXZpbiBEZWNrZXIgPGtwZGVja2VyQGdtYWlsLmNvbT5cblxuQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLFxuYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmVcbiAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZVxuICBmb2xsb3dpbmcgZGlzY2xhaW1lci5cblxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlXG4gIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGVcbiAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyXG4gIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cbiogTmVpdGhlciB0aGUgbmFtZSBvZiBLZXZpbiBEZWNrZXIgbm9yIHRoZSBuYW1lcyBvZiBpdHNcbiAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0c1xuICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yXG4gIHdyaXR0ZW4gcGVybWlzc2lvbi5cblxuVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SXG5JTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkRcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SXG5DT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG5EQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsXG5EQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUlxuSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVFxuT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuQGxpY2Vuc2VcbiovXG4oZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJKc0RpZmZcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiSnNEaWZmXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge30sXG4vKioqKioqLyBcdFx0XHRpZDogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsb2FkZWQ6IGZhbHNlXG4vKioqKioqLyBcdFx0fTtcblxuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cblxuXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovJ3VzZSBzdHJpY3QnO1xuXG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHMuY2Fub25pY2FsaXplID0gZXhwb3J0cy5jb252ZXJ0Q2hhbmdlc1RvWE1MID0gZXhwb3J0cy5jb252ZXJ0Q2hhbmdlc1RvRE1QID0gZXhwb3J0cy5tZXJnZSA9IGV4cG9ydHMucGFyc2VQYXRjaCA9IGV4cG9ydHMuYXBwbHlQYXRjaGVzID0gZXhwb3J0cy5hcHBseVBhdGNoID0gZXhwb3J0cy5jcmVhdGVQYXRjaCA9IGV4cG9ydHMuY3JlYXRlVHdvRmlsZXNQYXRjaCA9IGV4cG9ydHMuc3RydWN0dXJlZFBhdGNoID0gZXhwb3J0cy5kaWZmQXJyYXlzID0gZXhwb3J0cy5kaWZmSnNvbiA9IGV4cG9ydHMuZGlmZkNzcyA9IGV4cG9ydHMuZGlmZlNlbnRlbmNlcyA9IGV4cG9ydHMuZGlmZlRyaW1tZWRMaW5lcyA9IGV4cG9ydHMuZGlmZkxpbmVzID0gZXhwb3J0cy5kaWZmV29yZHNXaXRoU3BhY2UgPSBleHBvcnRzLmRpZmZXb3JkcyA9IGV4cG9ydHMuZGlmZkNoYXJzID0gZXhwb3J0cy5EaWZmID0gdW5kZWZpbmVkO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIGVuZCovdmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fYmFzZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciBfYmFzZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9iYXNlKTtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3ZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2NoYXJhY3RlciA9IF9fd2VicGFja19yZXF1aXJlX18oMikgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fd29yZCA9IF9fd2VicGFja19yZXF1aXJlX18oMykgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fbGluZSA9IF9fd2VicGFja19yZXF1aXJlX18oNSkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fc2VudGVuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2NzcyA9IF9fd2VicGFja19yZXF1aXJlX18oNykgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fanNvbiA9IF9fd2VicGFja19yZXF1aXJlX18oOCkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fYXJyYXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2FwcGx5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMCkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fcGFyc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19tZXJnZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2NyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2RtcCA9IF9fd2VicGFja19yZXF1aXJlX18oMTYpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX3htbCA9IF9fd2VicGFja19yZXF1aXJlX18oMTcpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cblx0LyogU2VlIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMgb2YgdXNlICovXG5cblx0Lypcblx0ICogVGV4dCBkaWZmIGltcGxlbWVudGF0aW9uLlxuXHQgKlxuXHQgKiBUaGlzIGxpYnJhcnkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBBUElTOlxuXHQgKiBKc0RpZmYuZGlmZkNoYXJzOiBDaGFyYWN0ZXIgYnkgY2hhcmFjdGVyIGRpZmZcblx0ICogSnNEaWZmLmRpZmZXb3JkczogV29yZCAoYXMgZGVmaW5lZCBieSBcXGIgcmVnZXgpIGRpZmYgd2hpY2ggaWdub3JlcyB3aGl0ZXNwYWNlXG5cdCAqIEpzRGlmZi5kaWZmTGluZXM6IExpbmUgYmFzZWQgZGlmZlxuXHQgKlxuXHQgKiBKc0RpZmYuZGlmZkNzczogRGlmZiB0YXJnZXRlZCBhdCBDU1MgY29udGVudFxuXHQgKlxuXHQgKiBUaGVzZSBtZXRob2RzIGFyZSBiYXNlZCBvbiB0aGUgaW1wbGVtZW50YXRpb24gcHJvcG9zZWQgaW5cblx0ICogXCJBbiBPKE5EKSBEaWZmZXJlbmNlIEFsZ29yaXRobSBhbmQgaXRzIFZhcmlhdGlvbnNcIiAoTXllcnMsIDE5ODYpLlxuXHQgKiBodHRwOi8vY2l0ZXNlZXJ4LmlzdC5wc3UuZWR1L3ZpZXdkb2Mvc3VtbWFyeT9kb2k9MTAuMS4xLjQuNjkyN1xuXHQgKi9cblx0ZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9EaWZmID0gX2Jhc2UyWydkZWZhdWx0J107XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2RpZmZDaGFycyA9IF9jaGFyYWN0ZXIuZGlmZkNoYXJzO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9kaWZmV29yZHMgPSBfd29yZC5kaWZmV29yZHM7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2RpZmZXb3Jkc1dpdGhTcGFjZSA9IF93b3JkLmRpZmZXb3Jkc1dpdGhTcGFjZTtcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZkxpbmVzID0gX2xpbmUuZGlmZkxpbmVzO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9kaWZmVHJpbW1lZExpbmVzID0gX2xpbmUuZGlmZlRyaW1tZWRMaW5lcztcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZlNlbnRlbmNlcyA9IF9zZW50ZW5jZS5kaWZmU2VudGVuY2VzO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9kaWZmQ3NzID0gX2Nzcy5kaWZmQ3NzO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9kaWZmSnNvbiA9IF9qc29uLmRpZmZKc29uO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9kaWZmQXJyYXlzID0gX2FycmF5LmRpZmZBcnJheXM7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3N0cnVjdHVyZWRQYXRjaCA9IF9jcmVhdGUuc3RydWN0dXJlZFBhdGNoO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jcmVhdGVUd29GaWxlc1BhdGNoID0gX2NyZWF0ZS5jcmVhdGVUd29GaWxlc1BhdGNoO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jcmVhdGVQYXRjaCA9IF9jcmVhdGUuY3JlYXRlUGF0Y2g7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2FwcGx5UGF0Y2ggPSBfYXBwbHkuYXBwbHlQYXRjaDtcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovYXBwbHlQYXRjaGVzID0gX2FwcGx5LmFwcGx5UGF0Y2hlcztcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovcGFyc2VQYXRjaCA9IF9wYXJzZS5wYXJzZVBhdGNoO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9tZXJnZSA9IF9tZXJnZS5tZXJnZTtcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovY29udmVydENoYW5nZXNUb0RNUCA9IF9kbXAuY29udmVydENoYW5nZXNUb0RNUDtcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovY29udmVydENoYW5nZXNUb1hNTCA9IF94bWwuY29udmVydENoYW5nZXNUb1hNTDtcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovY2Fub25pY2FsaXplID0gX2pzb24uY2Fub25pY2FsaXplO1xuXHQvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1TDNOeVl5OXBibVJsZUM1cWN5SmRMQ0p1WVcxbGN5STZXeUpFYVdabUlpd2laR2xtWmtOb1lYSnpJaXdpWkdsbVpsZHZjbVJ6SWl3aVpHbG1abGR2Y21SelYybDBhRk53WVdObElpd2laR2xtWmt4cGJtVnpJaXdpWkdsbVpsUnlhVzF0WldSTWFXNWxjeUlzSW1ScFptWlRaVzUwWlc1alpYTWlMQ0prYVdabVEzTnpJaXdpWkdsbVprcHpiMjRpTENKa2FXWm1RWEp5WVhseklpd2ljM1J5ZFdOMGRYSmxaRkJoZEdOb0lpd2lZM0psWVhSbFZIZHZSbWxzWlhOUVlYUmphQ0lzSW1OeVpXRjBaVkJoZEdOb0lpd2lZWEJ3YkhsUVlYUmphQ0lzSW1Gd2NHeDVVR0YwWTJobGN5SXNJbkJoY25ObFVHRjBZMmdpTENKdFpYSm5aU0lzSW1OdmJuWmxjblJEYUdGdVoyVnpWRzlFVFZBaUxDSmpiMjUyWlhKMFEyaGhibWRsYzFSdldFMU1JaXdpWTJGdWIyNXBZMkZzYVhwbElsMHNJbTFoY0hCcGJtZHpJam9pT3pzN096dDFRa0ZuUWtFN096czdkVUpCUTBFN08wRkJRMEU3TzBGQlEwRTdPMEZCUTBFN08wRkJSVUU3TzBGQlEwRTdPMEZCUlVFN08wRkJSVUU3TzBGQlEwRTdPMEZCUTBFN08wRkJRMEU3TzBGQlJVRTdPMEZCUTBFN096czdRVUZxUTBFN08wRkJSVUU3T3pzN096czdPenM3T3pzN08yZERRV3REUlVFc1NUdDVSRUZGUVVNc1V6dDVSRUZEUVVNc1V6dDVSRUZEUVVNc2EwSTdlVVJCUTBGRExGTTdlVVJCUTBGRExHZENPM2xFUVVOQlF5eGhPM2xFUVVWQlF5eFBPM2xFUVVOQlF5eFJPM2xFUVVWQlF5eFZPM2xFUVVWQlF5eGxPM2xFUVVOQlF5eHRRanQ1UkVGRFFVTXNWenQ1UkVGRFFVTXNWVHQ1UkVGRFFVTXNXVHQ1UkVGRFFVTXNWVHQ1UkVGRFFVTXNTenQ1UkVGRFFVTXNiVUk3ZVVSQlEwRkRMRzFDTzNsRVFVTkJReXhaSWl3aVptbHNaU0k2SW1sdVpHVjRMbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaUx5b2dVMlZsSUV4SlEwVk9VMFVnWm1sc1pTQm1iM0lnZEdWeWJYTWdiMllnZFhObElDb3ZYRzVjYmk4cVhHNGdLaUJVWlhoMElHUnBabVlnYVcxd2JHVnRaVzUwWVhScGIyNHVYRzRnS2x4dUlDb2dWR2hwY3lCc2FXSnlZWEo1SUhOMWNIQnZjblJ6SUhSb1pTQm1iMnhzYjNkcGJtY2dRVkJKVXpwY2JpQXFJRXB6UkdsbVppNWthV1ptUTJoaGNuTTZJRU5vWVhKaFkzUmxjaUJpZVNCamFHRnlZV04wWlhJZ1pHbG1abHh1SUNvZ1NuTkVhV1ptTG1ScFptWlhiM0prY3pvZ1YyOXlaQ0FvWVhNZ1pHVm1hVzVsWkNCaWVTQmNYR0lnY21WblpYZ3BJR1JwWm1ZZ2QyaHBZMmdnYVdkdWIzSmxjeUIzYUdsMFpYTndZV05sWEc0Z0tpQktjMFJwWm1ZdVpHbG1aa3hwYm1Wek9pQk1hVzVsSUdKaGMyVmtJR1JwWm1aY2JpQXFYRzRnS2lCS2MwUnBabVl1WkdsbVprTnpjem9nUkdsbVppQjBZWEpuWlhSbFpDQmhkQ0JEVTFNZ1kyOXVkR1Z1ZEZ4dUlDcGNiaUFxSUZSb1pYTmxJRzFsZEdodlpITWdZWEpsSUdKaGMyVmtJRzl1SUhSb1pTQnBiWEJzWlcxbGJuUmhkR2x2YmlCd2NtOXdiM05sWkNCcGJseHVJQ29nWENKQmJpQlBLRTVFS1NCRWFXWm1aWEpsYm1ObElFRnNaMjl5YVhSb2JTQmhibVFnYVhSeklGWmhjbWxoZEdsdmJuTmNJaUFvVFhsbGNuTXNJREU1T0RZcExseHVJQ29nYUhSMGNEb3ZMMk5wZEdWelpXVnllQzVwYzNRdWNITjFMbVZrZFM5MmFXVjNaRzlqTDNOMWJXMWhjbmsvWkc5cFBURXdMakV1TVM0MExqWTVNamRjYmlBcUwxeHVhVzF3YjNKMElFUnBabVlnWm5KdmJTQW5MaTlrYVdabUwySmhjMlVuTzF4dWFXMXdiM0owSUh0a2FXWm1RMmhoY25OOUlHWnliMjBnSnk0dlpHbG1aaTlqYUdGeVlXTjBaWEluTzF4dWFXMXdiM0owSUh0a2FXWm1WMjl5WkhNc0lHUnBabVpYYjNKa2MxZHBkR2hUY0dGalpYMGdabkp2YlNBbkxpOWthV1ptTDNkdmNtUW5PMXh1YVcxd2IzSjBJSHRrYVdabVRHbHVaWE1zSUdScFptWlVjbWx0YldWa1RHbHVaWE45SUdaeWIyMGdKeTR2WkdsbVppOXNhVzVsSnp0Y2JtbHRjRzl5ZENCN1pHbG1abE5sYm5SbGJtTmxjMzBnWm5KdmJTQW5MaTlrYVdabUwzTmxiblJsYm1ObEp6dGNibHh1YVcxd2IzSjBJSHRrYVdabVEzTnpmU0JtY205dElDY3VMMlJwWm1ZdlkzTnpKenRjYm1sdGNHOXlkQ0I3WkdsbVprcHpiMjRzSUdOaGJtOXVhV05oYkdsNlpYMGdabkp2YlNBbkxpOWthV1ptTDJwemIyNG5PMXh1WEc1cGJYQnZjblFnZTJScFptWkJjbkpoZVhOOUlHWnliMjBnSnk0dlpHbG1aaTloY25KaGVTYzdYRzVjYm1sdGNHOXlkQ0I3WVhCd2JIbFFZWFJqYUN3Z1lYQndiSGxRWVhSamFHVnpmU0JtY205dElDY3VMM0JoZEdOb0wyRndjR3g1Snp0Y2JtbHRjRzl5ZENCN2NHRnljMlZRWVhSamFIMGdabkp2YlNBbkxpOXdZWFJqYUM5d1lYSnpaU2M3WEc1cGJYQnZjblFnZTIxbGNtZGxmU0JtY205dElDY3VMM0JoZEdOb0wyMWxjbWRsSnp0Y2JtbHRjRzl5ZENCN2MzUnlkV04wZFhKbFpGQmhkR05vTENCamNtVmhkR1ZVZDI5R2FXeGxjMUJoZEdOb0xDQmpjbVZoZEdWUVlYUmphSDBnWm5KdmJTQW5MaTl3WVhSamFDOWpjbVZoZEdVbk8xeHVYRzVwYlhCdmNuUWdlMk52Ym5abGNuUkRhR0Z1WjJWelZHOUVUVkI5SUdaeWIyMGdKeTR2WTI5dWRtVnlkQzlrYlhBbk8xeHVhVzF3YjNKMElIdGpiMjUyWlhKMFEyaGhibWRsYzFSdldFMU1mU0JtY205dElDY3VMMk52Ym5abGNuUXZlRzFzSnp0Y2JseHVaWGh3YjNKMElIdGNiaUFnUkdsbVppeGNibHh1SUNCa2FXWm1RMmhoY25Nc1hHNGdJR1JwWm1aWGIzSmtjeXhjYmlBZ1pHbG1abGR2Y21SelYybDBhRk53WVdObExGeHVJQ0JrYVdabVRHbHVaWE1zWEc0Z0lHUnBabVpVY21sdGJXVmtUR2x1WlhNc1hHNGdJR1JwWm1aVFpXNTBaVzVqWlhNc1hHNWNiaUFnWkdsbVprTnpjeXhjYmlBZ1pHbG1aa3B6YjI0c1hHNWNiaUFnWkdsbVprRnljbUY1Y3l4Y2JseHVJQ0J6ZEhKMVkzUjFjbVZrVUdGMFkyZ3NYRzRnSUdOeVpXRjBaVlIzYjBacGJHVnpVR0YwWTJnc1hHNGdJR055WldGMFpWQmhkR05vTEZ4dUlDQmhjSEJzZVZCaGRHTm9MRnh1SUNCaGNIQnNlVkJoZEdOb1pYTXNYRzRnSUhCaGNuTmxVR0YwWTJnc1hHNGdJRzFsY21kbExGeHVJQ0JqYjI1MlpYSjBRMmhoYm1kbGMxUnZSRTFRTEZ4dUlDQmpiMjUyWlhKMFEyaGhibWRsYzFSdldFMU1MRnh1SUNCallXNXZibWxqWVd4cGVtVmNibjA3WEc0aVhYMD1cblxuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovJ3VzZSBzdHJpY3QnO1xuXG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHNbJ2RlZmF1bHQnXSA9IC8qaXN0YW5idWwgaWdub3JlIGVuZCovRGlmZjtcblx0ZnVuY3Rpb24gRGlmZigpIHt9XG5cblx0RGlmZi5wcm90b3R5cGUgPSB7XG5cdCAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2RpZmY6IGZ1bmN0aW9uIGRpZmYob2xkU3RyaW5nLCBuZXdTdHJpbmcpIHtcblx0ICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9vcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuXHQgICAgdmFyIGNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjaztcblx0ICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG5cdCAgICAgIG9wdGlvbnMgPSB7fTtcblx0ICAgIH1cblx0ICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cblx0ICAgIHZhciBzZWxmID0gdGhpcztcblxuXHQgICAgZnVuY3Rpb24gZG9uZSh2YWx1ZSkge1xuXHQgICAgICBpZiAoY2FsbGJhY2spIHtcblx0ICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIGNhbGxiYWNrKHVuZGVmaW5lZCwgdmFsdWUpO1xuXHQgICAgICAgIH0sIDApO1xuXHQgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHJldHVybiB2YWx1ZTtcblx0ICAgICAgfVxuXHQgICAgfVxuXG5cdCAgICAvLyBBbGxvdyBzdWJjbGFzc2VzIHRvIG1hc3NhZ2UgdGhlIGlucHV0IHByaW9yIHRvIHJ1bm5pbmdcblx0ICAgIG9sZFN0cmluZyA9IHRoaXMuY2FzdElucHV0KG9sZFN0cmluZyk7XG5cdCAgICBuZXdTdHJpbmcgPSB0aGlzLmNhc3RJbnB1dChuZXdTdHJpbmcpO1xuXG5cdCAgICBvbGRTdHJpbmcgPSB0aGlzLnJlbW92ZUVtcHR5KHRoaXMudG9rZW5pemUob2xkU3RyaW5nKSk7XG5cdCAgICBuZXdTdHJpbmcgPSB0aGlzLnJlbW92ZUVtcHR5KHRoaXMudG9rZW5pemUobmV3U3RyaW5nKSk7XG5cblx0ICAgIHZhciBuZXdMZW4gPSBuZXdTdHJpbmcubGVuZ3RoLFxuXHQgICAgICAgIG9sZExlbiA9IG9sZFN0cmluZy5sZW5ndGg7XG5cdCAgICB2YXIgZWRpdExlbmd0aCA9IDE7XG5cdCAgICB2YXIgbWF4RWRpdExlbmd0aCA9IG5ld0xlbiArIG9sZExlbjtcblx0ICAgIHZhciBiZXN0UGF0aCA9IFt7IG5ld1BvczogLTEsIGNvbXBvbmVudHM6IFtdIH1dO1xuXG5cdCAgICAvLyBTZWVkIGVkaXRMZW5ndGggPSAwLCBpLmUuIHRoZSBjb250ZW50IHN0YXJ0cyB3aXRoIHRoZSBzYW1lIHZhbHVlc1xuXHQgICAgdmFyIG9sZFBvcyA9IHRoaXMuZXh0cmFjdENvbW1vbihiZXN0UGF0aFswXSwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIDApO1xuXHQgICAgaWYgKGJlc3RQYXRoWzBdLm5ld1BvcyArIDEgPj0gbmV3TGVuICYmIG9sZFBvcyArIDEgPj0gb2xkTGVuKSB7XG5cdCAgICAgIC8vIElkZW50aXR5IHBlciB0aGUgZXF1YWxpdHkgYW5kIHRva2VuaXplclxuXHQgICAgICByZXR1cm4gZG9uZShbeyB2YWx1ZTogdGhpcy5qb2luKG5ld1N0cmluZyksIGNvdW50OiBuZXdTdHJpbmcubGVuZ3RoIH1dKTtcblx0ICAgIH1cblxuXHQgICAgLy8gTWFpbiB3b3JrZXIgbWV0aG9kLiBjaGVja3MgYWxsIHBlcm11dGF0aW9ucyBvZiBhIGdpdmVuIGVkaXQgbGVuZ3RoIGZvciBhY2NlcHRhbmNlLlxuXHQgICAgZnVuY3Rpb24gZXhlY0VkaXRMZW5ndGgoKSB7XG5cdCAgICAgIGZvciAodmFyIGRpYWdvbmFsUGF0aCA9IC0xICogZWRpdExlbmd0aDsgZGlhZ29uYWxQYXRoIDw9IGVkaXRMZW5ndGg7IGRpYWdvbmFsUGF0aCArPSAyKSB7XG5cdCAgICAgICAgdmFyIGJhc2VQYXRoID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZvaWQgMCAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblx0ICAgICAgICB2YXIgYWRkUGF0aCA9IGJlc3RQYXRoW2RpYWdvbmFsUGF0aCAtIDFdLFxuXHQgICAgICAgICAgICByZW1vdmVQYXRoID0gYmVzdFBhdGhbZGlhZ29uYWxQYXRoICsgMV0sXG5cdCAgICAgICAgICAgIF9vbGRQb3MgPSAocmVtb3ZlUGF0aCA/IHJlbW92ZVBhdGgubmV3UG9zIDogMCkgLSBkaWFnb25hbFBhdGg7XG5cdCAgICAgICAgaWYgKGFkZFBhdGgpIHtcblx0ICAgICAgICAgIC8vIE5vIG9uZSBlbHNlIGlzIGdvaW5nIHRvIGF0dGVtcHQgdG8gdXNlIHRoaXMgdmFsdWUsIGNsZWFyIGl0XG5cdCAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGggLSAxXSA9IHVuZGVmaW5lZDtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICB2YXIgY2FuQWRkID0gYWRkUGF0aCAmJiBhZGRQYXRoLm5ld1BvcyArIDEgPCBuZXdMZW4sXG5cdCAgICAgICAgICAgIGNhblJlbW92ZSA9IHJlbW92ZVBhdGggJiYgMCA8PSBfb2xkUG9zICYmIF9vbGRQb3MgPCBvbGRMZW47XG5cdCAgICAgICAgaWYgKCFjYW5BZGQgJiYgIWNhblJlbW92ZSkge1xuXHQgICAgICAgICAgLy8gSWYgdGhpcyBwYXRoIGlzIGEgdGVybWluYWwgdGhlbiBwcnVuZVxuXHQgICAgICAgICAgYmVzdFBhdGhbZGlhZ29uYWxQYXRoXSA9IHVuZGVmaW5lZDtcblx0ICAgICAgICAgIGNvbnRpbnVlO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIC8vIFNlbGVjdCB0aGUgZGlhZ29uYWwgdGhhdCB3ZSB3YW50IHRvIGJyYW5jaCBmcm9tLiBXZSBzZWxlY3QgdGhlIHByaW9yXG5cdCAgICAgICAgLy8gcGF0aCB3aG9zZSBwb3NpdGlvbiBpbiB0aGUgbmV3IHN0cmluZyBpcyB0aGUgZmFydGhlc3QgZnJvbSB0aGUgb3JpZ2luXG5cdCAgICAgICAgLy8gYW5kIGRvZXMgbm90IHBhc3MgdGhlIGJvdW5kcyBvZiB0aGUgZGlmZiBncmFwaFxuXHQgICAgICAgIGlmICghY2FuQWRkIHx8IGNhblJlbW92ZSAmJiBhZGRQYXRoLm5ld1BvcyA8IHJlbW92ZVBhdGgubmV3UG9zKSB7XG5cdCAgICAgICAgICBiYXNlUGF0aCA9IGNsb25lUGF0aChyZW1vdmVQYXRoKTtcblx0ICAgICAgICAgIHNlbGYucHVzaENvbXBvbmVudChiYXNlUGF0aC5jb21wb25lbnRzLCB1bmRlZmluZWQsIHRydWUpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBiYXNlUGF0aCA9IGFkZFBhdGg7IC8vIE5vIG5lZWQgdG8gY2xvbmUsIHdlJ3ZlIHB1bGxlZCBpdCBmcm9tIHRoZSBsaXN0XG5cdCAgICAgICAgICBiYXNlUGF0aC5uZXdQb3MrKztcblx0ICAgICAgICAgIHNlbGYucHVzaENvbXBvbmVudChiYXNlUGF0aC5jb21wb25lbnRzLCB0cnVlLCB1bmRlZmluZWQpO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIF9vbGRQb3MgPSBzZWxmLmV4dHJhY3RDb21tb24oYmFzZVBhdGgsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBkaWFnb25hbFBhdGgpO1xuXG5cdCAgICAgICAgLy8gSWYgd2UgaGF2ZSBoaXQgdGhlIGVuZCBvZiBib3RoIHN0cmluZ3MsIHRoZW4gd2UgYXJlIGRvbmVcblx0ICAgICAgICBpZiAoYmFzZVBhdGgubmV3UG9zICsgMSA+PSBuZXdMZW4gJiYgX29sZFBvcyArIDEgPj0gb2xkTGVuKSB7XG5cdCAgICAgICAgICByZXR1cm4gZG9uZShidWlsZFZhbHVlcyhzZWxmLCBiYXNlUGF0aC5jb21wb25lbnRzLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgc2VsZi51c2VMb25nZXN0VG9rZW4pKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgLy8gT3RoZXJ3aXNlIHRyYWNrIHRoaXMgcGF0aCBhcyBhIHBvdGVudGlhbCBjYW5kaWRhdGUgYW5kIGNvbnRpbnVlLlxuXHQgICAgICAgICAgYmVzdFBhdGhbZGlhZ29uYWxQYXRoXSA9IGJhc2VQYXRoO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXG5cdCAgICAgIGVkaXRMZW5ndGgrKztcblx0ICAgIH1cblxuXHQgICAgLy8gUGVyZm9ybXMgdGhlIGxlbmd0aCBvZiBlZGl0IGl0ZXJhdGlvbi4gSXMgYSBiaXQgZnVnbHkgYXMgdGhpcyBoYXMgdG8gc3VwcG9ydCB0aGVcblx0ICAgIC8vIHN5bmMgYW5kIGFzeW5jIG1vZGUgd2hpY2ggaXMgbmV2ZXIgZnVuLiBMb29wcyBvdmVyIGV4ZWNFZGl0TGVuZ3RoIHVudGlsIGEgdmFsdWVcblx0ICAgIC8vIGlzIHByb2R1Y2VkLlxuXHQgICAgaWYgKGNhbGxiYWNrKSB7XG5cdCAgICAgIChmdW5jdGlvbiBleGVjKCkge1xuXHQgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IHdlIHdhbnQgdG8gYmUgc2FmZS5cblx0ICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cdCAgICAgICAgICBpZiAoZWRpdExlbmd0aCA+IG1heEVkaXRMZW5ndGgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG5cdCAgICAgICAgICB9XG5cblx0ICAgICAgICAgIGlmICghZXhlY0VkaXRMZW5ndGgoKSkge1xuXHQgICAgICAgICAgICBleGVjKCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSwgMCk7XG5cdCAgICAgIH0pKCk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB3aGlsZSAoZWRpdExlbmd0aCA8PSBtYXhFZGl0TGVuZ3RoKSB7XG5cdCAgICAgICAgdmFyIHJldCA9IGV4ZWNFZGl0TGVuZ3RoKCk7XG5cdCAgICAgICAgaWYgKHJldCkge1xuXHQgICAgICAgICAgcmV0dXJuIHJldDtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9wdXNoQ29tcG9uZW50OiBmdW5jdGlvbiBwdXNoQ29tcG9uZW50KGNvbXBvbmVudHMsIGFkZGVkLCByZW1vdmVkKSB7XG5cdCAgICB2YXIgbGFzdCA9IGNvbXBvbmVudHNbY29tcG9uZW50cy5sZW5ndGggLSAxXTtcblx0ICAgIGlmIChsYXN0ICYmIGxhc3QuYWRkZWQgPT09IGFkZGVkICYmIGxhc3QucmVtb3ZlZCA9PT0gcmVtb3ZlZCkge1xuXHQgICAgICAvLyBXZSBuZWVkIHRvIGNsb25lIGhlcmUgYXMgdGhlIGNvbXBvbmVudCBjbG9uZSBvcGVyYXRpb24gaXMganVzdFxuXHQgICAgICAvLyBhcyBzaGFsbG93IGFycmF5IGNsb25lXG5cdCAgICAgIGNvbXBvbmVudHNbY29tcG9uZW50cy5sZW5ndGggLSAxXSA9IHsgY291bnQ6IGxhc3QuY291bnQgKyAxLCBhZGRlZDogYWRkZWQsIHJlbW92ZWQ6IHJlbW92ZWQgfTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGNvbXBvbmVudHMucHVzaCh7IGNvdW50OiAxLCBhZGRlZDogYWRkZWQsIHJlbW92ZWQ6IHJlbW92ZWQgfSk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZXh0cmFjdENvbW1vbjogZnVuY3Rpb24gZXh0cmFjdENvbW1vbihiYXNlUGF0aCwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIGRpYWdvbmFsUGF0aCkge1xuXHQgICAgdmFyIG5ld0xlbiA9IG5ld1N0cmluZy5sZW5ndGgsXG5cdCAgICAgICAgb2xkTGVuID0gb2xkU3RyaW5nLmxlbmd0aCxcblx0ICAgICAgICBuZXdQb3MgPSBiYXNlUGF0aC5uZXdQb3MsXG5cdCAgICAgICAgb2xkUG9zID0gbmV3UG9zIC0gZGlhZ29uYWxQYXRoLFxuXHQgICAgICAgIGNvbW1vbkNvdW50ID0gMDtcblx0ICAgIHdoaWxlIChuZXdQb3MgKyAxIDwgbmV3TGVuICYmIG9sZFBvcyArIDEgPCBvbGRMZW4gJiYgdGhpcy5lcXVhbHMobmV3U3RyaW5nW25ld1BvcyArIDFdLCBvbGRTdHJpbmdbb2xkUG9zICsgMV0pKSB7XG5cdCAgICAgIG5ld1BvcysrO1xuXHQgICAgICBvbGRQb3MrKztcblx0ICAgICAgY29tbW9uQ291bnQrKztcblx0ICAgIH1cblxuXHQgICAgaWYgKGNvbW1vbkNvdW50KSB7XG5cdCAgICAgIGJhc2VQYXRoLmNvbXBvbmVudHMucHVzaCh7IGNvdW50OiBjb21tb25Db3VudCB9KTtcblx0ICAgIH1cblxuXHQgICAgYmFzZVBhdGgubmV3UG9zID0gbmV3UG9zO1xuXHQgICAgcmV0dXJuIG9sZFBvcztcblx0ICB9LFxuXHQgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9lcXVhbHM6IGZ1bmN0aW9uIGVxdWFscyhsZWZ0LCByaWdodCkge1xuXHQgICAgaWYgKHRoaXMub3B0aW9ucy5jb21wYXJhdG9yKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuY29tcGFyYXRvcihsZWZ0LCByaWdodCk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICByZXR1cm4gbGVmdCA9PT0gcmlnaHQgfHwgdGhpcy5vcHRpb25zLmlnbm9yZUNhc2UgJiYgbGVmdC50b0xvd2VyQ2FzZSgpID09PSByaWdodC50b0xvd2VyQ2FzZSgpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3JlbW92ZUVtcHR5OiBmdW5jdGlvbiByZW1vdmVFbXB0eShhcnJheSkge1xuXHQgICAgdmFyIHJldCA9IFtdO1xuXHQgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuXHQgICAgICBpZiAoYXJyYXlbaV0pIHtcblx0ICAgICAgICByZXQucHVzaChhcnJheVtpXSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHJldHVybiByZXQ7XG5cdCAgfSxcblx0ICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovIC8qaXN0YW5idWwgaWdub3JlIGVuZCovY2FzdElucHV0OiBmdW5jdGlvbiBjYXN0SW5wdXQodmFsdWUpIHtcblx0ICAgIHJldHVybiB2YWx1ZTtcblx0ICB9LFxuXHQgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi90b2tlbml6ZTogZnVuY3Rpb24gdG9rZW5pemUodmFsdWUpIHtcblx0ICAgIHJldHVybiB2YWx1ZS5zcGxpdCgnJyk7XG5cdCAgfSxcblx0ICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovIC8qaXN0YW5idWwgaWdub3JlIGVuZCovam9pbjogZnVuY3Rpb24gam9pbihjaGFycykge1xuXHQgICAgcmV0dXJuIGNoYXJzLmpvaW4oJycpO1xuXHQgIH1cblx0fTtcblxuXHRmdW5jdGlvbiBidWlsZFZhbHVlcyhkaWZmLCBjb21wb25lbnRzLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgdXNlTG9uZ2VzdFRva2VuKSB7XG5cdCAgdmFyIGNvbXBvbmVudFBvcyA9IDAsXG5cdCAgICAgIGNvbXBvbmVudExlbiA9IGNvbXBvbmVudHMubGVuZ3RoLFxuXHQgICAgICBuZXdQb3MgPSAwLFxuXHQgICAgICBvbGRQb3MgPSAwO1xuXG5cdCAgZm9yICg7IGNvbXBvbmVudFBvcyA8IGNvbXBvbmVudExlbjsgY29tcG9uZW50UG9zKyspIHtcblx0ICAgIHZhciBjb21wb25lbnQgPSBjb21wb25lbnRzW2NvbXBvbmVudFBvc107XG5cdCAgICBpZiAoIWNvbXBvbmVudC5yZW1vdmVkKSB7XG5cdCAgICAgIGlmICghY29tcG9uZW50LmFkZGVkICYmIHVzZUxvbmdlc3RUb2tlbikge1xuXHQgICAgICAgIHZhciB2YWx1ZSA9IG5ld1N0cmluZy5zbGljZShuZXdQb3MsIG5ld1BvcyArIGNvbXBvbmVudC5jb3VudCk7XG5cdCAgICAgICAgdmFsdWUgPSB2YWx1ZS5tYXAoZnVuY3Rpb24gKHZhbHVlLCBpKSB7XG5cdCAgICAgICAgICB2YXIgb2xkVmFsdWUgPSBvbGRTdHJpbmdbb2xkUG9zICsgaV07XG5cdCAgICAgICAgICByZXR1cm4gb2xkVmFsdWUubGVuZ3RoID4gdmFsdWUubGVuZ3RoID8gb2xkVmFsdWUgOiB2YWx1ZTtcblx0ICAgICAgICB9KTtcblxuXHQgICAgICAgIGNvbXBvbmVudC52YWx1ZSA9IGRpZmYuam9pbih2YWx1ZSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgY29tcG9uZW50LnZhbHVlID0gZGlmZi5qb2luKG5ld1N0cmluZy5zbGljZShuZXdQb3MsIG5ld1BvcyArIGNvbXBvbmVudC5jb3VudCkpO1xuXHQgICAgICB9XG5cdCAgICAgIG5ld1BvcyArPSBjb21wb25lbnQuY291bnQ7XG5cblx0ICAgICAgLy8gQ29tbW9uIGNhc2Vcblx0ICAgICAgaWYgKCFjb21wb25lbnQuYWRkZWQpIHtcblx0ICAgICAgICBvbGRQb3MgKz0gY29tcG9uZW50LmNvdW50O1xuXHQgICAgICB9XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBjb21wb25lbnQudmFsdWUgPSBkaWZmLmpvaW4ob2xkU3RyaW5nLnNsaWNlKG9sZFBvcywgb2xkUG9zICsgY29tcG9uZW50LmNvdW50KSk7XG5cdCAgICAgIG9sZFBvcyArPSBjb21wb25lbnQuY291bnQ7XG5cblx0ICAgICAgLy8gUmV2ZXJzZSBhZGQgYW5kIHJlbW92ZSBzbyByZW1vdmVzIGFyZSBvdXRwdXQgZmlyc3QgdG8gbWF0Y2ggY29tbW9uIGNvbnZlbnRpb25cblx0ICAgICAgLy8gVGhlIGRpZmZpbmcgYWxnb3JpdGhtIGlzIHRpZWQgdG8gYWRkIHRoZW4gcmVtb3ZlIG91dHB1dCBhbmQgdGhpcyBpcyB0aGUgc2ltcGxlc3Rcblx0ICAgICAgLy8gcm91dGUgdG8gZ2V0IHRoZSBkZXNpcmVkIG91dHB1dCB3aXRoIG1pbmltYWwgb3ZlcmhlYWQuXG5cdCAgICAgIGlmIChjb21wb25lbnRQb3MgJiYgY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXS5hZGRlZCkge1xuXHQgICAgICAgIHZhciB0bXAgPSBjb21wb25lbnRzW2NvbXBvbmVudFBvcyAtIDFdO1xuXHQgICAgICAgIGNvbXBvbmVudHNbY29tcG9uZW50UG9zIC0gMV0gPSBjb21wb25lbnRzW2NvbXBvbmVudFBvc107XG5cdCAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnRQb3NdID0gdG1wO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgLy8gU3BlY2lhbCBjYXNlIGhhbmRsZSBmb3Igd2hlbiBvbmUgdGVybWluYWwgaXMgaWdub3JlZCAoaS5lLiB3aGl0ZXNwYWNlKS5cblx0ICAvLyBGb3IgdGhpcyBjYXNlIHdlIG1lcmdlIHRoZSB0ZXJtaW5hbCBpbnRvIHRoZSBwcmlvciBzdHJpbmcgYW5kIGRyb3AgdGhlIGNoYW5nZS5cblx0ICAvLyBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBzdHJpbmcgbW9kZS5cblx0ICB2YXIgbGFzdENvbXBvbmVudCA9IGNvbXBvbmVudHNbY29tcG9uZW50TGVuIC0gMV07XG5cdCAgaWYgKGNvbXBvbmVudExlbiA+IDEgJiYgdHlwZW9mIGxhc3RDb21wb25lbnQudmFsdWUgPT09ICdzdHJpbmcnICYmIChsYXN0Q29tcG9uZW50LmFkZGVkIHx8IGxhc3RDb21wb25lbnQucmVtb3ZlZCkgJiYgZGlmZi5lcXVhbHMoJycsIGxhc3RDb21wb25lbnQudmFsdWUpKSB7XG5cdCAgICBjb21wb25lbnRzW2NvbXBvbmVudExlbiAtIDJdLnZhbHVlICs9IGxhc3RDb21wb25lbnQudmFsdWU7XG5cdCAgICBjb21wb25lbnRzLnBvcCgpO1xuXHQgIH1cblxuXHQgIHJldHVybiBjb21wb25lbnRzO1xuXHR9XG5cblx0ZnVuY3Rpb24gY2xvbmVQYXRoKHBhdGgpIHtcblx0ICByZXR1cm4geyBuZXdQb3M6IHBhdGgubmV3UG9zLCBjb21wb25lbnRzOiBwYXRoLmNvbXBvbmVudHMuc2xpY2UoMCkgfTtcblx0fVxuXHQvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTlrYVdabUwySmhjMlV1YW5NaVhTd2libUZ0WlhNaU9sc2lSR2xtWmlJc0luQnliM1J2ZEhsd1pTSXNJbVJwWm1ZaUxDSnZiR1JUZEhKcGJtY2lMQ0p1WlhkVGRISnBibWNpTENKdmNIUnBiMjV6SWl3aVkyRnNiR0poWTJzaUxDSnpaV3htSWl3aVpHOXVaU0lzSW5aaGJIVmxJaXdpYzJWMFZHbHRaVzkxZENJc0luVnVaR1ZtYVc1bFpDSXNJbU5oYzNSSmJuQjFkQ0lzSW5KbGJXOTJaVVZ0Y0hSNUlpd2lkRzlyWlc1cGVtVWlMQ0p1WlhkTVpXNGlMQ0pzWlc1bmRHZ2lMQ0p2YkdSTVpXNGlMQ0psWkdsMFRHVnVaM1JvSWl3aWJXRjRSV1JwZEV4bGJtZDBhQ0lzSW1KbGMzUlFZWFJvSWl3aWJtVjNVRzl6SWl3aVkyOXRjRzl1Wlc1MGN5SXNJbTlzWkZCdmN5SXNJbVY0ZEhKaFkzUkRiMjF0YjI0aUxDSnFiMmx1SWl3aVkyOTFiblFpTENKbGVHVmpSV1JwZEV4bGJtZDBhQ0lzSW1ScFlXZHZibUZzVUdGMGFDSXNJbUpoYzJWUVlYUm9JaXdpWVdSa1VHRjBhQ0lzSW5KbGJXOTJaVkJoZEdnaUxDSmpZVzVCWkdRaUxDSmpZVzVTWlcxdmRtVWlMQ0pqYkc5dVpWQmhkR2dpTENKd2RYTm9RMjl0Y0c5dVpXNTBJaXdpWW5WcGJHUldZV3gxWlhNaUxDSjFjMlZNYjI1blpYTjBWRzlyWlc0aUxDSmxlR1ZqSWl3aWNtVjBJaXdpWVdSa1pXUWlMQ0p5WlcxdmRtVmtJaXdpYkdGemRDSXNJbkIxYzJnaUxDSmpiMjF0YjI1RGIzVnVkQ0lzSW1WeGRXRnNjeUlzSW14bFpuUWlMQ0p5YVdkb2RDSXNJbU52YlhCaGNtRjBiM0lpTENKcFoyNXZjbVZEWVhObElpd2lkRzlNYjNkbGNrTmhjMlVpTENKaGNuSmhlU0lzSW1raUxDSnpjR3hwZENJc0ltTm9ZWEp6SWl3aVkyOXRjRzl1Wlc1MFVHOXpJaXdpWTI5dGNHOXVaVzUwVEdWdUlpd2lZMjl0Y0c5dVpXNTBJaXdpYzJ4cFkyVWlMQ0p0WVhBaUxDSnZiR1JXWVd4MVpTSXNJblJ0Y0NJc0lteGhjM1JEYjIxd2IyNWxiblFpTENKd2IzQWlMQ0p3WVhSb0lsMHNJbTFoY0hCcGJtZHpJam9pT3pzN05FTkJRWGRDUVN4Sk8wRkJRVlFzVTBGQlUwRXNTVUZCVkN4SFFVRm5RaXhEUVVGRk96dEJRVVZxUTBFc1MwRkJTME1zVTBGQlRDeEhRVUZwUWp0QlFVRkJMRzFFUVVObVF5eEpRVVJsTEdkQ1FVTldReXhUUVVSVkxFVkJRME5ETEZOQlJFUXNSVUZETUVJN1FVRkJRU3gzUkVGQlpFTXNUMEZCWXl4MVJVRkJTaXhGUVVGSk96dEJRVU4yUXl4UlFVRkpReXhYUVVGWFJDeFJRVUZSUXl4UlFVRjJRanRCUVVOQkxGRkJRVWtzVDBGQlQwUXNUMEZCVUN4TFFVRnRRaXhWUVVGMlFpeEZRVUZ0UXp0QlFVTnFRME1zYVVKQlFWZEVMRTlCUVZnN1FVRkRRVUVzWjBKQlFWVXNSVUZCVmp0QlFVTkVPMEZCUTBRc1UwRkJTMEVzVDBGQlRDeEhRVUZsUVN4UFFVRm1PenRCUVVWQkxGRkJRVWxGTEU5QlFVOHNTVUZCV0RzN1FVRkZRU3hoUVVGVFF5eEpRVUZVTEVOQlFXTkRMRXRCUVdRc1JVRkJjVUk3UVVGRGJrSXNWVUZCU1Vnc1VVRkJTaXhGUVVGak8wRkJRMXBKTEcxQ1FVRlhMRmxCUVZjN1FVRkJSVW9zYlVKQlFWTkxMRk5CUVZRc1JVRkJiMEpHTEV0QlFYQkNPMEZCUVRaQ0xGTkJRWEpFTEVWQlFYVkVMRU5CUVhaRU8wRkJRMEVzWlVGQlR5eEpRVUZRTzBGQlEwUXNUMEZJUkN4TlFVZFBPMEZCUTB3c1pVRkJUMEVzUzBGQlVEdEJRVU5FTzBGQlEwWTdPMEZCUlVRN1FVRkRRVTRzWjBKQlFWa3NTMEZCUzFNc1UwRkJUQ3hEUVVGbFZDeFRRVUZtTEVOQlFWbzdRVUZEUVVNc1owSkJRVmtzUzBGQlMxRXNVMEZCVEN4RFFVRmxVaXhUUVVGbUxFTkJRVm83TzBGQlJVRkVMR2RDUVVGWkxFdEJRVXRWTEZkQlFVd3NRMEZCYVVJc1MwRkJTME1zVVVGQlRDeERRVUZqV0N4VFFVRmtMRU5CUVdwQ0xFTkJRVm83UVVGRFFVTXNaMEpCUVZrc1MwRkJTMU1zVjBGQlRDeERRVUZwUWl4TFFVRkxReXhSUVVGTUxFTkJRV05XTEZOQlFXUXNRMEZCYWtJc1EwRkJXanM3UVVGRlFTeFJRVUZKVnl4VFFVRlRXQ3hWUVVGVldTeE5RVUYyUWp0QlFVRkJMRkZCUVN0Q1F5eFRRVUZUWkN4VlFVRlZZU3hOUVVGc1JEdEJRVU5CTEZGQlFVbEZMR0ZCUVdFc1EwRkJha0k3UVVGRFFTeFJRVUZKUXl4blFrRkJaMEpLTEZOQlFWTkZMRTFCUVRkQ08wRkJRMEVzVVVGQlNVY3NWMEZCVnl4RFFVRkRMRVZCUVVWRExGRkJRVkVzUTBGQlF5eERRVUZZTEVWQlFXTkRMRmxCUVZrc1JVRkJNVUlzUlVGQlJDeERRVUZtT3p0QlFVVkJPMEZCUTBFc1VVRkJTVU1zVTBGQlV5eExRVUZMUXl4aFFVRk1MRU5CUVcxQ1NpeFRRVUZUTEVOQlFWUXNRMEZCYmtJc1JVRkJaME5vUWl4VFFVRm9ReXhGUVVFeVEwUXNVMEZCTTBNc1JVRkJjMFFzUTBGQmRFUXNRMEZCWWp0QlFVTkJMRkZCUVVscFFpeFRRVUZUTEVOQlFWUXNSVUZCV1VNc1RVRkJXaXhIUVVGeFFpeERRVUZ5UWl4SlFVRXdRazRzVFVGQk1VSXNTVUZCYjBOUkxGTkJRVk1zUTBGQlZDeEpRVUZqVGl4TlFVRjBSQ3hGUVVFNFJEdEJRVU0xUkR0QlFVTkJMR0ZCUVU5VUxFdEJRVXNzUTBGQlF5eEZRVUZEUXl4UFFVRlBMRXRCUVV0blFpeEpRVUZNTEVOQlFWVnlRaXhUUVVGV0xFTkJRVklzUlVGQk9FSnpRaXhQUVVGUGRFSXNWVUZCVlZrc1RVRkJMME1zUlVGQlJDeERRVUZNTEVOQlFWQTdRVUZEUkRzN1FVRkZSRHRCUVVOQkxHRkJRVk5YTEdOQlFWUXNSMEZCTUVJN1FVRkRlRUlzVjBGQlN5eEpRVUZKUXl4bFFVRmxMRU5CUVVNc1EwRkJSQ3hIUVVGTFZpeFZRVUUzUWl4RlFVRjVRMVVzWjBKQlFXZENWaXhWUVVGNlJDeEZRVUZ4UlZVc1owSkJRV2RDTEVOQlFYSkdMRVZCUVhkR08wRkJRM1JHTEZsQlFVbERMREJEUVVGS08wRkJRMEVzV1VGQlNVTXNWVUZCVlZZc1UwRkJVMUVzWlVGQlpTeERRVUY0UWl4RFFVRmtPMEZCUVVFc1dVRkRTVWNzWVVGQllWZ3NVMEZCVTFFc1pVRkJaU3hEUVVGNFFpeERRVVJxUWp0QlFVRkJMRmxCUlVsTUxGVkJRVk1zUTBGQlExRXNZVUZCWVVFc1YwRkJWMVlzVFVGQmVFSXNSMEZCYVVNc1EwRkJiRU1zU1VGQmRVTlBMRmxCUm5CRU8wRkJSMEVzV1VGQlNVVXNUMEZCU2l4RlFVRmhPMEZCUTFnN1FVRkRRVllzYlVKQlFWTlJMR1ZCUVdVc1EwRkJlRUlzU1VGQk5rSnFRaXhUUVVFM1FqdEJRVU5FT3p0QlFVVkVMRmxCUVVseFFpeFRRVUZUUml4WFFVRlhRU3hSUVVGUlZDeE5RVUZTTEVkQlFXbENMRU5CUVdwQ0xFZEJRWEZDVGl4TlFVRTNRenRCUVVGQkxGbEJRMGxyUWl4WlFVRlpSaXhqUVVGakxFdEJRVXRTTEU5QlFXNUNMRWxCUVRaQ1FTeFZRVUZUVGl4TlFVUjBSRHRCUVVWQkxGbEJRVWtzUTBGQlEyVXNUVUZCUkN4SlFVRlhMRU5CUVVORExGTkJRV2hDTEVWQlFUSkNPMEZCUTNwQ08wRkJRMEZpTEcxQ1FVRlRVU3haUVVGVUxFbEJRWGxDYWtJc1UwRkJla0k3UVVGRFFUdEJRVU5FT3p0QlFVVkVPMEZCUTBFN1FVRkRRVHRCUVVOQkxGbEJRVWtzUTBGQlEzRkNMRTFCUVVRc1NVRkJXVU1zWVVGQllVZ3NVVUZCVVZRc1RVRkJVaXhIUVVGcFFsVXNWMEZCVjFZc1RVRkJla1FzUlVGQmEwVTdRVUZEYUVWUkxIRkNRVUZYU3l4VlFVRlZTQ3hWUVVGV0xFTkJRVmc3UVVGRFFYaENMR1ZCUVVzMFFpeGhRVUZNTEVOQlFXMUNUaXhUUVVGVFVDeFZRVUUxUWl4RlFVRjNRMWdzVTBGQmVFTXNSVUZCYlVRc1NVRkJia1E3UVVGRFJDeFRRVWhFTEUxQlIwODdRVUZEVEd0Q0xIRkNRVUZYUXl4UFFVRllMRU5CUkVzc1EwRkRhVUk3UVVGRGRFSkVMRzFDUVVGVFVpeE5RVUZVTzBGQlEwRmtMR1ZCUVVzMFFpeGhRVUZNTEVOQlFXMUNUaXhUUVVGVFVDeFZRVUUxUWl4RlFVRjNReXhKUVVGNFF5eEZRVUU0UTFnc1UwRkJPVU03UVVGRFJEczdRVUZGUkZrc2EwSkJRVk5vUWl4TFFVRkxhVUlzWVVGQlRDeERRVUZ0UWtzc1VVRkJia0lzUlVGQk5rSjZRaXhUUVVFM1FpeEZRVUYzUTBRc1UwRkJlRU1zUlVGQmJVUjVRaXhaUVVGdVJDeERRVUZVT3p0QlFVVkJPMEZCUTBFc1dVRkJTVU1zVTBGQlUxSXNUVUZCVkN4SFFVRnJRaXhEUVVGc1FpeEpRVUYxUWs0c1RVRkJka0lzU1VGQmFVTlJMRlZCUVZNc1EwRkJWQ3hKUVVGalRpeE5RVUZ1UkN4RlFVRXlSRHRCUVVONlJDeHBRa0ZCVDFRc1MwRkJTelJDTEZsQlFWazNRaXhKUVVGYUxFVkJRV3RDYzBJc1UwRkJVMUFzVlVGQk0wSXNSVUZCZFVOc1FpeFRRVUYyUXl4RlFVRnJSRVFzVTBGQmJFUXNSVUZCTmtSSkxFdEJRVXM0UWl4bFFVRnNSU3hEUVVGTUxFTkJRVkE3UVVGRFJDeFRRVVpFTEUxQlJVODdRVUZEVER0QlFVTkJha0lzYlVKQlFWTlJMRmxCUVZRc1NVRkJlVUpETEZGQlFYcENPMEZCUTBRN1FVRkRSanM3UVVGRlJGZzdRVUZEUkRzN1FVRkZSRHRCUVVOQk8wRkJRMEU3UVVGRFFTeFJRVUZKV2l4UlFVRktMRVZCUVdNN1FVRkRXQ3huUWtGQlUyZERMRWxCUVZRc1IwRkJaMEk3UVVGRFpqVkNMRzFDUVVGWExGbEJRVmM3UVVGRGNFSTdRVUZEUVR0QlFVTkJMR05CUVVsUkxHRkJRV0ZETEdGQlFXcENMRVZCUVdkRE8wRkJRemxDTEcxQ1FVRlBZaXhWUVVGUU8wRkJRMFE3TzBGQlJVUXNZMEZCU1N4RFFVRkRjVUlzWjBKQlFVd3NSVUZCZFVJN1FVRkRja0pYTzBGQlEwUTdRVUZEUml4VFFWWkVMRVZCVlVjc1EwRldTRHRCUVZkRUxFOUJXa0VzUjBGQlJEdEJRV0ZFTEV0QlpFUXNUVUZqVHp0QlFVTk1MR0ZCUVU5d1FpeGpRVUZqUXl4aFFVRnlRaXhGUVVGdlF6dEJRVU5zUXl4WlFVRkpiMElzVFVGQlRWb3NaMEpCUVZZN1FVRkRRU3haUVVGSldTeEhRVUZLTEVWQlFWTTdRVUZEVUN4cFFrRkJUMEVzUjBGQlVEdEJRVU5FTzBGQlEwWTdRVUZEUmp0QlFVTkdMRWRCT1Vkak8wRkJRVUVzYlVSQlowaG1TaXhoUVdoSVpTeDVRa0ZuU0VSaUxGVkJhRWhETEVWQlowaFhhMElzUzBGb1NGZ3NSVUZuU0d0Q1F5eFBRV2hJYkVJc1JVRm5TREpDTzBGQlEzaERMRkZCUVVsRExFOUJRVTl3UWl4WFFVRlhRU3hYUVVGWFRpeE5RVUZZTEVkQlFXOUNMRU5CUVM5Q0xFTkJRVmc3UVVGRFFTeFJRVUZKTUVJc1VVRkJVVUVzUzBGQlMwWXNTMEZCVEN4TFFVRmxRU3hMUVVGMlFpeEpRVUZuUTBVc1MwRkJTMFFzVDBGQlRDeExRVUZwUWtFc1QwRkJja1FzUlVGQk9FUTdRVUZETlVRN1FVRkRRVHRCUVVOQmJrSXNhVUpCUVZkQkxGZEJRVmRPTEUxQlFWZ3NSMEZCYjBJc1EwRkJMMElzU1VGQmIwTXNSVUZCUTFVc1QwRkJUMmRDTEV0QlFVdG9RaXhMUVVGTUxFZEJRV0VzUTBGQmNrSXNSVUZCZDBKakxFOUJRVTlCTEV0QlFTOUNMRVZCUVhORFF5eFRRVUZUUVN4UFFVRXZReXhGUVVGd1F6dEJRVU5FTEV0QlNrUXNUVUZKVHp0QlFVTk1ia0lzYVVKQlFWZHhRaXhKUVVGWUxFTkJRV2RDTEVWQlFVTnFRaXhQUVVGUExFTkJRVklzUlVGQlYyTXNUMEZCVDBFc1MwRkJiRUlzUlVGQmVVSkRMRk5CUVZOQkxFOUJRV3hETEVWQlFXaENPMEZCUTBRN1FVRkRSaXhIUVhwSVl6dEJRVUZCTEcxRVFUQklabXBDTEdGQk1VaGxMSGxDUVRCSVJFc3NVVUV4U0VNc1JVRXdTRk42UWl4VFFURklWQ3hGUVRCSWIwSkVMRk5CTVVod1FpeEZRVEJJSzBKNVFpeFpRVEZJTDBJc1JVRXdTRFpETzBGQlF6RkVMRkZCUVVsaUxGTkJRVk5ZTEZWQlFWVlpMRTFCUVhaQ08wRkJRVUVzVVVGRFNVTXNVMEZCVTJRc1ZVRkJWV0VzVFVGRWRrSTdRVUZCUVN4UlFVVkpTeXhUUVVGVFVTeFRRVUZUVWl4TlFVWjBRanRCUVVGQkxGRkJSMGxGTEZOQlFWTkdMRk5CUVZOUExGbEJTSFJDTzBGQlFVRXNVVUZMU1dkQ0xHTkJRV01zUTBGTWJFSTdRVUZOUVN4WFFVRlBka0lzVTBGQlV5eERRVUZVTEVkQlFXRk9MRTFCUVdJc1NVRkJkVUpSTEZOQlFWTXNRMEZCVkN4SFFVRmhUaXhOUVVGd1F5eEpRVUU0UXl4TFFVRkxORUlzVFVGQlRDeERRVUZaZWtNc1ZVRkJWV2xDTEZOQlFWTXNRMEZCYmtJc1EwRkJXaXhGUVVGdFEyeENMRlZCUVZWdlFpeFRRVUZUTEVOQlFXNUNMRU5CUVc1RExFTkJRWEpFTEVWQlFXZElPMEZCUXpsSFJqdEJRVU5CUlR0QlFVTkJjVUk3UVVGRFJEczdRVUZGUkN4UlFVRkpRU3hYUVVGS0xFVkJRV2xDTzBGQlEyWm1MR1ZCUVZOUUxGVkJRVlFzUTBGQmIwSnhRaXhKUVVGd1FpeERRVUY1UWl4RlFVRkRha0lzVDBGQlQydENMRmRCUVZJc1JVRkJla0k3UVVGRFJEczdRVUZGUkdZc1lVRkJVMUlzVFVGQlZDeEhRVUZyUWtFc1RVRkJiRUk3UVVGRFFTeFhRVUZQUlN4TlFVRlFPMEZCUTBRc1IwRTNTV003UVVGQlFTeHRSRUVyU1daelFpeE5RUzlKWlN4clFrRXJTVkpETEVsQkwwbFJMRVZCSzBsR1F5eExRUzlKUlN4RlFTdEpTenRCUVVOc1FpeFJRVUZKTEV0QlFVc3hReXhQUVVGTUxFTkJRV0V5UXl4VlFVRnFRaXhGUVVFMlFqdEJRVU16UWl4aFFVRlBMRXRCUVVzelF5eFBRVUZNTEVOQlFXRXlReXhWUVVGaUxFTkJRWGRDUml4SlFVRjRRaXhGUVVFNFFrTXNTMEZCT1VJc1EwRkJVRHRCUVVORUxFdEJSa1FzVFVGRlR6dEJRVU5NTEdGQlFVOUVMRk5CUVZORExFdEJRVlFzU1VGRFJDeExRVUZMTVVNc1QwRkJUQ3hEUVVGaE5FTXNWVUZCWWl4SlFVRXlRa2dzUzBGQlMwa3NWMEZCVEN4UFFVRjFRa2dzVFVGQlRVY3NWMEZCVGl4RlFVUjRSRHRCUVVWRU8wRkJRMFlzUjBGMFNtTTdRVUZCUVN4dFJFRjFTbVp5UXl4WFFYWktaU3gxUWtGMVNraHpReXhMUVhaS1J5eEZRWFZLU1R0QlFVTnFRaXhSUVVGSldpeE5RVUZOTEVWQlFWWTdRVUZEUVN4VFFVRkxMRWxCUVVsaExFbEJRVWtzUTBGQllpeEZRVUZuUWtFc1NVRkJTVVFzVFVGQlRXNURMRTFCUVRGQ0xFVkJRV3REYjBNc1IwRkJiRU1zUlVGQmRVTTdRVUZEY2tNc1ZVRkJTVVFzVFVGQlRVTXNRMEZCVGl4RFFVRktMRVZCUVdNN1FVRkRXbUlzV1VGQlNVa3NTVUZCU2l4RFFVRlRVU3hOUVVGTlF5eERRVUZPTEVOQlFWUTdRVUZEUkR0QlFVTkdPMEZCUTBRc1YwRkJUMklzUjBGQlVEdEJRVU5FTEVkQkwwcGpPMEZCUVVFc2JVUkJaMHRtTTBJc1UwRm9TMlVzY1VKQlowdE1TQ3hMUVdoTFN5eEZRV2RMUlR0QlFVTm1MRmRCUVU5QkxFdEJRVkE3UVVGRFJDeEhRV3hMWXp0QlFVRkJMRzFFUVcxTFprc3NVVUZ1UzJVc2IwSkJiVXRPVEN4TFFXNUxUU3hGUVcxTFF6dEJRVU5rTEZkQlFVOUJMRTFCUVUwMFF5eExRVUZPTEVOQlFWa3NSVUZCV2l4RFFVRlFPMEZCUTBRc1IwRnlTMk03UVVGQlFTeHRSRUZ6UzJZMVFpeEpRWFJMWlN4blFrRnpTMVkyUWl4TFFYUkxWU3hGUVhOTFNEdEJRVU5XTEZkQlFVOUJMRTFCUVUwM1FpeEpRVUZPTEVOQlFWY3NSVUZCV0N4RFFVRlFPMEZCUTBRN1FVRjRTMk1zUTBGQmFrSTdPMEZCTWt0QkxGTkJRVk5YTEZkQlFWUXNRMEZCY1VKc1F5eEpRVUZ5UWl4RlFVRXlRbTlDTEZWQlFUTkNMRVZCUVhWRGJFSXNVMEZCZGtNc1JVRkJhMFJFTEZOQlFXeEVMRVZCUVRaRWEwTXNaVUZCTjBRc1JVRkJPRVU3UVVGRE5VVXNUVUZCU1d0Q0xHVkJRV1VzUTBGQmJrSTdRVUZCUVN4TlFVTkpReXhsUVVGbGJFTXNWMEZCVjA0c1RVRkVPVUk3UVVGQlFTeE5RVVZKU3l4VFFVRlRMRU5CUm1JN1FVRkJRU3hOUVVkSlJTeFRRVUZUTEVOQlNHSTdPMEZCUzBFc1UwRkJUMmRETEdWQlFXVkRMRmxCUVhSQ0xFVkJRVzlEUkN4alFVRndReXhGUVVGdlJEdEJRVU5zUkN4UlFVRkpSU3haUVVGWmJrTXNWMEZCVjJsRExGbEJRVmdzUTBGQmFFSTdRVUZEUVN4UlFVRkpMRU5CUVVORkxGVkJRVlZvUWl4UFFVRm1MRVZCUVhkQ08wRkJRM1JDTEZWQlFVa3NRMEZCUTJkQ0xGVkJRVlZxUWl4TFFVRllMRWxCUVc5Q1NDeGxRVUY0UWl4RlFVRjVRenRCUVVOMlF5eFpRVUZKTlVJc1VVRkJVVXdzVlVGQlZYTkVMRXRCUVZZc1EwRkJaMEp5UXl4TlFVRm9RaXhGUVVGM1FrRXNVMEZCVTI5RExGVkJRVlV2UWl4TFFVRXpReXhEUVVGYU8wRkJRMEZxUWl4blFrRkJVVUVzVFVGQlRXdEVMRWRCUVU0c1EwRkJWU3hWUVVGVGJFUXNTMEZCVkN4RlFVRm5RakpETEVOQlFXaENMRVZCUVcxQ08wRkJRMjVETEdOQlFVbFJMRmRCUVZkNlJDeFZRVUZWYjBJc1UwRkJVelpDTEVOQlFXNUNMRU5CUVdZN1FVRkRRU3hwUWtGQlQxRXNVMEZCVXpWRExFMUJRVlFzUjBGQmEwSlFMRTFCUVUxUExFMUJRWGhDTEVkQlFXbERORU1zVVVGQmFrTXNSMEZCTkVOdVJDeExRVUZ1UkR0QlFVTkVMRk5CU0U4c1EwRkJVanM3UVVGTFFXZEVMR3RDUVVGVmFFUXNTMEZCVml4SFFVRnJRbEFzUzBGQlMzVkNMRWxCUVV3c1EwRkJWV2hDTEV0QlFWWXNRMEZCYkVJN1FVRkRSQ3hQUVZKRUxFMUJVVTg3UVVGRFRHZEVMR3RDUVVGVmFFUXNTMEZCVml4SFFVRnJRbEFzUzBGQlMzVkNMRWxCUVV3c1EwRkJWWEpDTEZWQlFWVnpSQ3hMUVVGV0xFTkJRV2RDY2tNc1RVRkJhRUlzUlVGQmQwSkJMRk5CUVZOdlF5eFZRVUZWTDBJc1MwRkJNME1zUTBGQlZpeERRVUZzUWp0QlFVTkVPMEZCUTBSTUxHZENRVUZWYjBNc1ZVRkJWUzlDTEV0QlFYQkNPenRCUVVWQk8wRkJRMEVzVlVGQlNTeERRVUZESzBJc1ZVRkJWV3BDTEV0QlFXWXNSVUZCYzBJN1FVRkRjRUpxUWl4clFrRkJWV3RETEZWQlFWVXZRaXhMUVVGd1FqdEJRVU5FTzBGQlEwWXNTMEZzUWtRc1RVRnJRazg3UVVGRFRDdENMR2RDUVVGVmFFUXNTMEZCVml4SFFVRnJRbEFzUzBGQlMzVkNMRWxCUVV3c1EwRkJWWFJDTEZWQlFWVjFSQ3hMUVVGV0xFTkJRV2RDYmtNc1RVRkJhRUlzUlVGQmQwSkJMRk5CUVZOclF5eFZRVUZWTDBJc1MwRkJNME1zUTBGQlZpeERRVUZzUWp0QlFVTkJTQ3huUWtGQlZXdERMRlZCUVZVdlFpeExRVUZ3UWpzN1FVRkZRVHRCUVVOQk8wRkJRMEU3UVVGRFFTeFZRVUZKTmtJc1owSkJRV2RDYWtNc1YwRkJWMmxETEdWQlFXVXNRMEZCTVVJc1JVRkJOa0ptTEV0QlFXcEVMRVZCUVhkRU8wRkJRM1JFTEZsQlFVbHhRaXhOUVVGTmRrTXNWMEZCVjJsRExHVkJRV1VzUTBGQk1VSXNRMEZCVmp0QlFVTkJha01zYlVKQlFWZHBReXhsUVVGbExFTkJRVEZDTEVsQlFTdENha01zVjBGQlYybERMRmxCUVZnc1EwRkJMMEk3UVVGRFFXcERMRzFDUVVGWGFVTXNXVUZCV0N4SlFVRXlRazBzUjBGQk0wSTdRVUZEUkR0QlFVTkdPMEZCUTBZN08wRkJSVVE3UVVGRFFUdEJRVU5CTzBGQlEwRXNUVUZCU1VNc1owSkJRV2RDZUVNc1YwRkJWMnRETEdWQlFXVXNRMEZCTVVJc1EwRkJjRUk3UVVGRFFTeE5RVUZKUVN4bFFVRmxMRU5CUVdZc1NVRkRSeXhQUVVGUFRTeGpRVUZqY2tRc1MwRkJja0lzUzBGQkswSXNVVUZFYkVNc1MwRkZTWEZFTEdOQlFXTjBRaXhMUVVGa0xFbEJRWFZDYzBJc1kwRkJZM0pDTEU5QlJucERMRXRCUjBkMlF5eExRVUZMTWtNc1RVRkJUQ3hEUVVGWkxFVkJRVm9zUlVGQlowSnBRaXhqUVVGamNrUXNTMEZCT1VJc1EwRklVQ3hGUVVjMlF6dEJRVU16UTJFc1pVRkJWMnRETEdWQlFXVXNRMEZCTVVJc1JVRkJOa0l2UXl4TFFVRTNRaXhKUVVGelEzRkVMR05CUVdOeVJDeExRVUZ3UkR0QlFVTkJZU3hsUVVGWGVVTXNSMEZCV0R0QlFVTkVPenRCUVVWRUxGTkJRVTk2UXl4VlFVRlFPMEZCUTBRN08wRkJSVVFzVTBGQlUxa3NVMEZCVkN4RFFVRnRRamhDTEVsQlFXNUNMRVZCUVhsQ08wRkJRM1pDTEZOQlFVOHNSVUZCUlRORExGRkJRVkV5UXl4TFFVRkxNME1zVFVGQlppeEZRVUYxUWtNc1dVRkJXVEJETEV0QlFVc3hReXhWUVVGTUxFTkJRV2RDYjBNc1MwRkJhRUlzUTBGQmMwSXNRMEZCZEVJc1EwRkJia01zUlVGQlVEdEJRVU5FSWl3aVptbHNaU0k2SW1KaGMyVXVhbk1pTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKbGVIQnZjblFnWkdWbVlYVnNkQ0JtZFc1amRHbHZiaUJFYVdabUtDa2dlMzFjYmx4dVJHbG1aaTV3Y205MGIzUjVjR1VnUFNCN1hHNGdJR1JwWm1Zb2IyeGtVM1J5YVc1bkxDQnVaWGRUZEhKcGJtY3NJRzl3ZEdsdmJuTWdQU0I3ZlNrZ2UxeHVJQ0FnSUd4bGRDQmpZV3hzWW1GamF5QTlJRzl3ZEdsdmJuTXVZMkZzYkdKaFkyczdYRzRnSUNBZ2FXWWdLSFI1Y0dWdlppQnZjSFJwYjI1eklEMDlQU0FuWm5WdVkzUnBiMjRuS1NCN1hHNGdJQ0FnSUNCallXeHNZbUZqYXlBOUlHOXdkR2x2Ym5NN1hHNGdJQ0FnSUNCdmNIUnBiMjV6SUQwZ2UzMDdYRzRnSUNBZ2ZWeHVJQ0FnSUhSb2FYTXViM0IwYVc5dWN5QTlJRzl3ZEdsdmJuTTdYRzVjYmlBZ0lDQnNaWFFnYzJWc1ppQTlJSFJvYVhNN1hHNWNiaUFnSUNCbWRXNWpkR2x2YmlCa2IyNWxLSFpoYkhWbEtTQjdYRzRnSUNBZ0lDQnBaaUFvWTJGc2JHSmhZMnNwSUh0Y2JpQWdJQ0FnSUNBZ2MyVjBWR2x0Wlc5MWRDaG1kVzVqZEdsdmJpZ3BJSHNnWTJGc2JHSmhZMnNvZFc1a1pXWnBibVZrTENCMllXeDFaU2s3SUgwc0lEQXBPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdkSEoxWlR0Y2JpQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUIyWVd4MVpUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNWNiaUFnSUNBdkx5QkJiR3h2ZHlCemRXSmpiR0Z6YzJWeklIUnZJRzFoYzNOaFoyVWdkR2hsSUdsdWNIVjBJSEJ5YVc5eUlIUnZJSEoxYm01cGJtZGNiaUFnSUNCdmJHUlRkSEpwYm1jZ1BTQjBhR2x6TG1OaGMzUkpibkIxZENodmJHUlRkSEpwYm1jcE8xeHVJQ0FnSUc1bGQxTjBjbWx1WnlBOUlIUm9hWE11WTJGemRFbHVjSFYwS0c1bGQxTjBjbWx1WnlrN1hHNWNiaUFnSUNCdmJHUlRkSEpwYm1jZ1BTQjBhR2x6TG5KbGJXOTJaVVZ0Y0hSNUtIUm9hWE11ZEc5clpXNXBlbVVvYjJ4a1UzUnlhVzVuS1NrN1hHNGdJQ0FnYm1WM1UzUnlhVzVuSUQwZ2RHaHBjeTV5WlcxdmRtVkZiWEIwZVNoMGFHbHpMblJ2YTJWdWFYcGxLRzVsZDFOMGNtbHVaeWtwTzF4dVhHNGdJQ0FnYkdWMElHNWxkMHhsYmlBOUlHNWxkMU4wY21sdVp5NXNaVzVuZEdnc0lHOXNaRXhsYmlBOUlHOXNaRk4wY21sdVp5NXNaVzVuZEdnN1hHNGdJQ0FnYkdWMElHVmthWFJNWlc1bmRHZ2dQU0F4TzF4dUlDQWdJR3hsZENCdFlYaEZaR2wwVEdWdVozUm9JRDBnYm1WM1RHVnVJQ3NnYjJ4a1RHVnVPMXh1SUNBZ0lHeGxkQ0JpWlhOMFVHRjBhQ0E5SUZ0N0lHNWxkMUJ2Y3pvZ0xURXNJR052YlhCdmJtVnVkSE02SUZ0ZElIMWRPMXh1WEc0Z0lDQWdMeThnVTJWbFpDQmxaR2wwVEdWdVozUm9JRDBnTUN3Z2FTNWxMaUIwYUdVZ1kyOXVkR1Z1ZENCemRHRnlkSE1nZDJsMGFDQjBhR1VnYzJGdFpTQjJZV3gxWlhOY2JpQWdJQ0JzWlhRZ2IyeGtVRzl6SUQwZ2RHaHBjeTVsZUhSeVlXTjBRMjl0Ylc5dUtHSmxjM1JRWVhSb1d6QmRMQ0J1WlhkVGRISnBibWNzSUc5c1pGTjBjbWx1Wnl3Z01DazdYRzRnSUNBZ2FXWWdLR0psYzNSUVlYUm9XekJkTG01bGQxQnZjeUFySURFZ1BqMGdibVYzVEdWdUlDWW1JRzlzWkZCdmN5QXJJREVnUGowZ2IyeGtUR1Z1S1NCN1hHNGdJQ0FnSUNBdkx5QkpaR1Z1ZEdsMGVTQndaWElnZEdobElHVnhkV0ZzYVhSNUlHRnVaQ0IwYjJ0bGJtbDZaWEpjYmlBZ0lDQWdJSEpsZEhWeWJpQmtiMjVsS0Z0N2RtRnNkV1U2SUhSb2FYTXVhbTlwYmlodVpYZFRkSEpwYm1jcExDQmpiM1Z1ZERvZ2JtVjNVM1J5YVc1bkxteGxibWQwYUgxZEtUdGNiaUFnSUNCOVhHNWNiaUFnSUNBdkx5Qk5ZV2x1SUhkdmNtdGxjaUJ0WlhSb2IyUXVJR05vWldOcmN5QmhiR3dnY0dWeWJYVjBZWFJwYjI1eklHOW1JR0VnWjJsMlpXNGdaV1JwZENCc1pXNW5kR2dnWm05eUlHRmpZMlZ3ZEdGdVkyVXVYRzRnSUNBZ1puVnVZM1JwYjI0Z1pYaGxZMFZrYVhSTVpXNW5kR2dvS1NCN1hHNGdJQ0FnSUNCbWIzSWdLR3hsZENCa2FXRm5iMjVoYkZCaGRHZ2dQU0F0TVNBcUlHVmthWFJNWlc1bmRHZzdJR1JwWVdkdmJtRnNVR0YwYUNBOFBTQmxaR2wwVEdWdVozUm9PeUJrYVdGbmIyNWhiRkJoZEdnZ0t6MGdNaWtnZTF4dUlDQWdJQ0FnSUNCc1pYUWdZbUZ6WlZCaGRHZzdYRzRnSUNBZ0lDQWdJR3hsZENCaFpHUlFZWFJvSUQwZ1ltVnpkRkJoZEdoYlpHbGhaMjl1WVd4UVlYUm9JQzBnTVYwc1hHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlcxdmRtVlFZWFJvSUQwZ1ltVnpkRkJoZEdoYlpHbGhaMjl1WVd4UVlYUm9JQ3NnTVYwc1hHNGdJQ0FnSUNBZ0lDQWdJQ0J2YkdSUWIzTWdQU0FvY21WdGIzWmxVR0YwYUNBL0lISmxiVzkyWlZCaGRHZ3VibVYzVUc5eklEb2dNQ2tnTFNCa2FXRm5iMjVoYkZCaGRHZzdYRzRnSUNBZ0lDQWdJR2xtSUNoaFpHUlFZWFJvS1NCN1hHNGdJQ0FnSUNBZ0lDQWdMeThnVG04Z2IyNWxJR1ZzYzJVZ2FYTWdaMjlwYm1jZ2RHOGdZWFIwWlcxd2RDQjBieUIxYzJVZ2RHaHBjeUIyWVd4MVpTd2dZMnhsWVhJZ2FYUmNiaUFnSUNBZ0lDQWdJQ0JpWlhOMFVHRjBhRnRrYVdGbmIyNWhiRkJoZEdnZ0xTQXhYU0E5SUhWdVpHVm1hVzVsWkR0Y2JpQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJR3hsZENCallXNUJaR1FnUFNCaFpHUlFZWFJvSUNZbUlHRmtaRkJoZEdndWJtVjNVRzl6SUNzZ01TQThJRzVsZDB4bGJpeGNiaUFnSUNBZ0lDQWdJQ0FnSUdOaGJsSmxiVzkyWlNBOUlISmxiVzkyWlZCaGRHZ2dKaVlnTUNBOFBTQnZiR1JRYjNNZ0ppWWdiMnhrVUc5eklEd2diMnhrVEdWdU8xeHVJQ0FnSUNBZ0lDQnBaaUFvSVdOaGJrRmtaQ0FtSmlBaFkyRnVVbVZ0YjNabEtTQjdYRzRnSUNBZ0lDQWdJQ0FnTHk4Z1NXWWdkR2hwY3lCd1lYUm9JR2x6SUdFZ2RHVnliV2x1WVd3Z2RHaGxiaUJ3Y25WdVpWeHVJQ0FnSUNBZ0lDQWdJR0psYzNSUVlYUm9XMlJwWVdkdmJtRnNVR0YwYUYwZ1BTQjFibVJsWm1sdVpXUTdYRzRnSUNBZ0lDQWdJQ0FnWTI5dWRHbHVkV1U3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQXZMeUJUWld4bFkzUWdkR2hsSUdScFlXZHZibUZzSUhSb1lYUWdkMlVnZDJGdWRDQjBieUJpY21GdVkyZ2dabkp2YlM0Z1YyVWdjMlZzWldOMElIUm9aU0J3Y21sdmNseHVJQ0FnSUNBZ0lDQXZMeUJ3WVhSb0lIZG9iM05sSUhCdmMybDBhVzl1SUdsdUlIUm9aU0J1WlhjZ2MzUnlhVzVuSUdseklIUm9aU0JtWVhKMGFHVnpkQ0JtY205dElIUm9aU0J2Y21sbmFXNWNiaUFnSUNBZ0lDQWdMeThnWVc1a0lHUnZaWE1nYm05MElIQmhjM01nZEdobElHSnZkVzVrY3lCdlppQjBhR1VnWkdsbVppQm5jbUZ3YUZ4dUlDQWdJQ0FnSUNCcFppQW9JV05oYmtGa1pDQjhmQ0FvWTJGdVVtVnRiM1psSUNZbUlHRmtaRkJoZEdndWJtVjNVRzl6SUR3Z2NtVnRiM1psVUdGMGFDNXVaWGRRYjNNcEtTQjdYRzRnSUNBZ0lDQWdJQ0FnWW1GelpWQmhkR2dnUFNCamJHOXVaVkJoZEdnb2NtVnRiM1psVUdGMGFDazdYRzRnSUNBZ0lDQWdJQ0FnYzJWc1ppNXdkWE5vUTI5dGNHOXVaVzUwS0dKaGMyVlFZWFJvTG1OdmJYQnZibVZ1ZEhNc0lIVnVaR1ZtYVc1bFpDd2dkSEoxWlNrN1hHNGdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdZbUZ6WlZCaGRHZ2dQU0JoWkdSUVlYUm9PeUFnSUM4dklFNXZJRzVsWldRZ2RHOGdZMnh2Ym1Vc0lIZGxKM1psSUhCMWJHeGxaQ0JwZENCbWNtOXRJSFJvWlNCc2FYTjBYRzRnSUNBZ0lDQWdJQ0FnWW1GelpWQmhkR2d1Ym1WM1VHOXpLeXM3WEc0Z0lDQWdJQ0FnSUNBZ2MyVnNaaTV3ZFhOb1EyOXRjRzl1Wlc1MEtHSmhjMlZRWVhSb0xtTnZiWEJ2Ym1WdWRITXNJSFJ5ZFdVc0lIVnVaR1ZtYVc1bFpDazdYRzRnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNCdmJHUlFiM01nUFNCelpXeG1MbVY0ZEhKaFkzUkRiMjF0YjI0b1ltRnpaVkJoZEdnc0lHNWxkMU4wY21sdVp5d2diMnhrVTNSeWFXNW5MQ0JrYVdGbmIyNWhiRkJoZEdncE8xeHVYRzRnSUNBZ0lDQWdJQzh2SUVsbUlIZGxJR2hoZG1VZ2FHbDBJSFJvWlNCbGJtUWdiMllnWW05MGFDQnpkSEpwYm1kekxDQjBhR1Z1SUhkbElHRnlaU0JrYjI1bFhHNGdJQ0FnSUNBZ0lHbG1JQ2hpWVhObFVHRjBhQzV1WlhkUWIzTWdLeUF4SUQ0OUlHNWxkMHhsYmlBbUppQnZiR1JRYjNNZ0t5QXhJRDQ5SUc5c1pFeGxiaWtnZTF4dUlDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCa2IyNWxLR0oxYVd4a1ZtRnNkV1Z6S0hObGJHWXNJR0poYzJWUVlYUm9MbU52YlhCdmJtVnVkSE1zSUc1bGQxTjBjbWx1Wnl3Z2IyeGtVM1J5YVc1bkxDQnpaV3htTG5WelpVeHZibWRsYzNSVWIydGxiaWtwTzF4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lDOHZJRTkwYUdWeWQybHpaU0IwY21GamF5QjBhR2x6SUhCaGRHZ2dZWE1nWVNCd2IzUmxiblJwWVd3Z1kyRnVaR2xrWVhSbElHRnVaQ0JqYjI1MGFXNTFaUzVjYmlBZ0lDQWdJQ0FnSUNCaVpYTjBVR0YwYUZ0a2FXRm5iMjVoYkZCaGRHaGRJRDBnWW1GelpWQmhkR2c3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ1pXUnBkRXhsYm1kMGFDc3JPMXh1SUNBZ0lIMWNibHh1SUNBZ0lDOHZJRkJsY21admNtMXpJSFJvWlNCc1pXNW5kR2dnYjJZZ1pXUnBkQ0JwZEdWeVlYUnBiMjR1SUVseklHRWdZbWwwSUdaMVoyeDVJR0Z6SUhSb2FYTWdhR0Z6SUhSdklITjFjSEJ2Y25RZ2RHaGxYRzRnSUNBZ0x5OGdjM2x1WXlCaGJtUWdZWE41Ym1NZ2JXOWtaU0IzYUdsamFDQnBjeUJ1WlhabGNpQm1kVzR1SUV4dmIzQnpJRzkyWlhJZ1pYaGxZMFZrYVhSTVpXNW5kR2dnZFc1MGFXd2dZU0IyWVd4MVpWeHVJQ0FnSUM4dklHbHpJSEJ5YjJSMVkyVmtMbHh1SUNBZ0lHbG1JQ2hqWVd4c1ltRmpheWtnZTF4dUlDQWdJQ0FnS0daMWJtTjBhVzl1SUdWNFpXTW9LU0I3WEc0Z0lDQWdJQ0FnSUhObGRGUnBiV1Z2ZFhRb1puVnVZM1JwYjI0b0tTQjdYRzRnSUNBZ0lDQWdJQ0FnTHk4Z1ZHaHBjeUJ6YUc5MWJHUWdibTkwSUdoaGNIQmxiaXdnWW5WMElIZGxJSGRoYm5RZ2RHOGdZbVVnYzJGbVpTNWNiaUFnSUNBZ0lDQWdJQ0F2S2lCcGMzUmhibUoxYkNCcFoyNXZjbVVnYm1WNGRDQXFMMXh1SUNBZ0lDQWdJQ0FnSUdsbUlDaGxaR2wwVEdWdVozUm9JRDRnYldGNFJXUnBkRXhsYm1kMGFDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUdOaGJHeGlZV05yS0NrN1hHNGdJQ0FnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUNBZ2FXWWdLQ0ZsZUdWalJXUnBkRXhsYm1kMGFDZ3BLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmxlR1ZqS0NrN1hHNGdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0I5TENBd0tUdGNiaUFnSUNBZ0lIMG9LU2s3WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lIZG9hV3hsSUNobFpHbDBUR1Z1WjNSb0lEdzlJRzFoZUVWa2FYUk1aVzVuZEdncElIdGNiaUFnSUNBZ0lDQWdiR1YwSUhKbGRDQTlJR1Y0WldORlpHbDBUR1Z1WjNSb0tDazdYRzRnSUNBZ0lDQWdJR2xtSUNoeVpYUXBJSHRjYmlBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnY21WME8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVJQ0I5TEZ4dVhHNGdJSEIxYzJoRGIyMXdiMjVsYm5Rb1kyOXRjRzl1Wlc1MGN5d2dZV1JrWldRc0lISmxiVzkyWldRcElIdGNiaUFnSUNCc1pYUWdiR0Z6ZENBOUlHTnZiWEJ2Ym1WdWRITmJZMjl0Y0c5dVpXNTBjeTVzWlc1bmRHZ2dMU0F4WFR0Y2JpQWdJQ0JwWmlBb2JHRnpkQ0FtSmlCc1lYTjBMbUZrWkdWa0lEMDlQU0JoWkdSbFpDQW1KaUJzWVhOMExuSmxiVzkyWldRZ1BUMDlJSEpsYlc5MlpXUXBJSHRjYmlBZ0lDQWdJQzh2SUZkbElHNWxaV1FnZEc4Z1kyeHZibVVnYUdWeVpTQmhjeUIwYUdVZ1kyOXRjRzl1Wlc1MElHTnNiMjVsSUc5d1pYSmhkR2x2YmlCcGN5QnFkWE4wWEc0Z0lDQWdJQ0F2THlCaGN5QnphR0ZzYkc5M0lHRnljbUY1SUdOc2IyNWxYRzRnSUNBZ0lDQmpiMjF3YjI1bGJuUnpXMk52YlhCdmJtVnVkSE11YkdWdVozUm9JQzBnTVYwZ1BTQjdZMjkxYm5RNklHeGhjM1F1WTI5MWJuUWdLeUF4TENCaFpHUmxaRG9nWVdSa1pXUXNJSEpsYlc5MlpXUTZJSEpsYlc5MlpXUWdmVHRjYmlBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ1kyOXRjRzl1Wlc1MGN5NXdkWE5vS0h0amIzVnVkRG9nTVN3Z1lXUmtaV1E2SUdGa1pHVmtMQ0J5WlcxdmRtVmtPaUJ5WlcxdmRtVmtJSDBwTzF4dUlDQWdJSDFjYmlBZ2ZTeGNiaUFnWlhoMGNtRmpkRU52YlcxdmJpaGlZWE5sVUdGMGFDd2dibVYzVTNSeWFXNW5MQ0J2YkdSVGRISnBibWNzSUdScFlXZHZibUZzVUdGMGFDa2dlMXh1SUNBZ0lHeGxkQ0J1WlhkTVpXNGdQU0J1WlhkVGRISnBibWN1YkdWdVozUm9MRnh1SUNBZ0lDQWdJQ0J2YkdSTVpXNGdQU0J2YkdSVGRISnBibWN1YkdWdVozUm9MRnh1SUNBZ0lDQWdJQ0J1WlhkUWIzTWdQU0JpWVhObFVHRjBhQzV1WlhkUWIzTXNYRzRnSUNBZ0lDQWdJRzlzWkZCdmN5QTlJRzVsZDFCdmN5QXRJR1JwWVdkdmJtRnNVR0YwYUN4Y2JseHVJQ0FnSUNBZ0lDQmpiMjF0YjI1RGIzVnVkQ0E5SURBN1hHNGdJQ0FnZDJocGJHVWdLRzVsZDFCdmN5QXJJREVnUENCdVpYZE1aVzRnSmlZZ2IyeGtVRzl6SUNzZ01TQThJRzlzWkV4bGJpQW1KaUIwYUdsekxtVnhkV0ZzY3lodVpYZFRkSEpwYm1kYmJtVjNVRzl6SUNzZ01WMHNJRzlzWkZOMGNtbHVaMXR2YkdSUWIzTWdLeUF4WFNrcElIdGNiaUFnSUNBZ0lHNWxkMUJ2Y3lzck8xeHVJQ0FnSUNBZ2IyeGtVRzl6S3lzN1hHNGdJQ0FnSUNCamIyMXRiMjVEYjNWdWRDc3JPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHbG1JQ2hqYjIxdGIyNURiM1Z1ZENrZ2UxeHVJQ0FnSUNBZ1ltRnpaVkJoZEdndVkyOXRjRzl1Wlc1MGN5NXdkWE5vS0h0amIzVnVkRG9nWTI5dGJXOXVRMjkxYm5SOUtUdGNiaUFnSUNCOVhHNWNiaUFnSUNCaVlYTmxVR0YwYUM1dVpYZFFiM01nUFNCdVpYZFFiM003WEc0Z0lDQWdjbVYwZFhKdUlHOXNaRkJ2Y3p0Y2JpQWdmU3hjYmx4dUlDQmxjWFZoYkhNb2JHVm1kQ3dnY21sbmFIUXBJSHRjYmlBZ0lDQnBaaUFvZEdocGN5NXZjSFJwYjI1ekxtTnZiWEJoY21GMGIzSXBJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TG05d2RHbHZibk11WTI5dGNHRnlZWFJ2Y2loc1pXWjBMQ0J5YVdkb2RDazdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUJzWldaMElEMDlQU0J5YVdkb2RGeHVJQ0FnSUNBZ0lDQjhmQ0FvZEdocGN5NXZjSFJwYjI1ekxtbG5ibTl5WlVOaGMyVWdKaVlnYkdWbWRDNTBiMHh2ZDJWeVEyRnpaU2dwSUQwOVBTQnlhV2RvZEM1MGIweHZkMlZ5UTJGelpTZ3BLVHRjYmlBZ0lDQjlYRzRnSUgwc1hHNGdJSEpsYlc5MlpVVnRjSFI1S0dGeWNtRjVLU0I3WEc0Z0lDQWdiR1YwSUhKbGRDQTlJRnRkTzF4dUlDQWdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnWVhKeVlYa3ViR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0FnSUdsbUlDaGhjbkpoZVZ0cFhTa2dlMXh1SUNBZ0lDQWdJQ0J5WlhRdWNIVnphQ2hoY25KaGVWdHBYU2s3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCeVpYUTdYRzRnSUgwc1hHNGdJR05oYzNSSmJuQjFkQ2gyWVd4MVpTa2dlMXh1SUNBZ0lISmxkSFZ5YmlCMllXeDFaVHRjYmlBZ2ZTeGNiaUFnZEc5clpXNXBlbVVvZG1Gc2RXVXBJSHRjYmlBZ0lDQnlaWFIxY200Z2RtRnNkV1V1YzNCc2FYUW9KeWNwTzF4dUlDQjlMRnh1SUNCcWIybHVLR05vWVhKektTQjdYRzRnSUNBZ2NtVjBkWEp1SUdOb1lYSnpMbXB2YVc0b0p5Y3BPMXh1SUNCOVhHNTlPMXh1WEc1bWRXNWpkR2x2YmlCaWRXbHNaRlpoYkhWbGN5aGthV1ptTENCamIyMXdiMjVsYm5SekxDQnVaWGRUZEhKcGJtY3NJRzlzWkZOMGNtbHVaeXdnZFhObFRHOXVaMlZ6ZEZSdmEyVnVLU0I3WEc0Z0lHeGxkQ0JqYjIxd2IyNWxiblJRYjNNZ1BTQXdMRnh1SUNBZ0lDQWdZMjl0Y0c5dVpXNTBUR1Z1SUQwZ1kyOXRjRzl1Wlc1MGN5NXNaVzVuZEdnc1hHNGdJQ0FnSUNCdVpYZFFiM01nUFNBd0xGeHVJQ0FnSUNBZ2IyeGtVRzl6SUQwZ01EdGNibHh1SUNCbWIzSWdLRHNnWTI5dGNHOXVaVzUwVUc5eklEd2dZMjl0Y0c5dVpXNTBUR1Z1T3lCamIyMXdiMjVsYm5SUWIzTXJLeWtnZTF4dUlDQWdJR3hsZENCamIyMXdiMjVsYm5RZ1BTQmpiMjF3YjI1bGJuUnpXMk52YlhCdmJtVnVkRkJ2YzEwN1hHNGdJQ0FnYVdZZ0tDRmpiMjF3YjI1bGJuUXVjbVZ0YjNabFpDa2dlMXh1SUNBZ0lDQWdhV1lnS0NGamIyMXdiMjVsYm5RdVlXUmtaV1FnSmlZZ2RYTmxURzl1WjJWemRGUnZhMlZ1S1NCN1hHNGdJQ0FnSUNBZ0lHeGxkQ0IyWVd4MVpTQTlJRzVsZDFOMGNtbHVaeTV6YkdsalpTaHVaWGRRYjNNc0lHNWxkMUJ2Y3lBcklHTnZiWEJ2Ym1WdWRDNWpiM1Z1ZENrN1hHNGdJQ0FnSUNBZ0lIWmhiSFZsSUQwZ2RtRnNkV1V1YldGd0tHWjFibU4wYVc5dUtIWmhiSFZsTENCcEtTQjdYRzRnSUNBZ0lDQWdJQ0FnYkdWMElHOXNaRlpoYkhWbElEMGdiMnhrVTNSeWFXNW5XMjlzWkZCdmN5QXJJR2xkTzF4dUlDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCdmJHUldZV3gxWlM1c1pXNW5kR2dnUGlCMllXeDFaUzVzWlc1bmRHZ2dQeUJ2YkdSV1lXeDFaU0E2SUhaaGJIVmxPMXh1SUNBZ0lDQWdJQ0I5S1R0Y2JseHVJQ0FnSUNBZ0lDQmpiMjF3YjI1bGJuUXVkbUZzZFdVZ1BTQmthV1ptTG1wdmFXNG9kbUZzZFdVcE8xeHVJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ1kyOXRjRzl1Wlc1MExuWmhiSFZsSUQwZ1pHbG1aaTVxYjJsdUtHNWxkMU4wY21sdVp5NXpiR2xqWlNodVpYZFFiM01zSUc1bGQxQnZjeUFySUdOdmJYQnZibVZ1ZEM1amIzVnVkQ2twTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJQ0FnYm1WM1VHOXpJQ3M5SUdOdmJYQnZibVZ1ZEM1amIzVnVkRHRjYmx4dUlDQWdJQ0FnTHk4Z1EyOXRiVzl1SUdOaGMyVmNiaUFnSUNBZ0lHbG1JQ2doWTI5dGNHOXVaVzUwTG1Ga1pHVmtLU0I3WEc0Z0lDQWdJQ0FnSUc5c1pGQnZjeUFyUFNCamIyMXdiMjVsYm5RdVkyOTFiblE3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lHTnZiWEJ2Ym1WdWRDNTJZV3gxWlNBOUlHUnBabVl1YW05cGJpaHZiR1JUZEhKcGJtY3VjMnhwWTJVb2IyeGtVRzl6TENCdmJHUlFiM01nS3lCamIyMXdiMjVsYm5RdVkyOTFiblFwS1R0Y2JpQWdJQ0FnSUc5c1pGQnZjeUFyUFNCamIyMXdiMjVsYm5RdVkyOTFiblE3WEc1Y2JpQWdJQ0FnSUM4dklGSmxkbVZ5YzJVZ1lXUmtJR0Z1WkNCeVpXMXZkbVVnYzI4Z2NtVnRiM1psY3lCaGNtVWdiM1YwY0hWMElHWnBjbk4wSUhSdklHMWhkR05vSUdOdmJXMXZiaUJqYjI1MlpXNTBhVzl1WEc0Z0lDQWdJQ0F2THlCVWFHVWdaR2xtWm1sdVp5QmhiR2R2Y21sMGFHMGdhWE1nZEdsbFpDQjBieUJoWkdRZ2RHaGxiaUJ5WlcxdmRtVWdiM1YwY0hWMElHRnVaQ0IwYUdseklHbHpJSFJvWlNCemFXMXdiR1Z6ZEZ4dUlDQWdJQ0FnTHk4Z2NtOTFkR1VnZEc4Z1oyVjBJSFJvWlNCa1pYTnBjbVZrSUc5MWRIQjFkQ0IzYVhSb0lHMXBibWx0WVd3Z2IzWmxjbWhsWVdRdVhHNGdJQ0FnSUNCcFppQW9ZMjl0Y0c5dVpXNTBVRzl6SUNZbUlHTnZiWEJ2Ym1WdWRITmJZMjl0Y0c5dVpXNTBVRzl6SUMwZ01WMHVZV1JrWldRcElIdGNiaUFnSUNBZ0lDQWdiR1YwSUhSdGNDQTlJR052YlhCdmJtVnVkSE5iWTI5dGNHOXVaVzUwVUc5eklDMGdNVjA3WEc0Z0lDQWdJQ0FnSUdOdmJYQnZibVZ1ZEhOYlkyOXRjRzl1Wlc1MFVHOXpJQzBnTVYwZ1BTQmpiMjF3YjI1bGJuUnpXMk52YlhCdmJtVnVkRkJ2YzEwN1hHNGdJQ0FnSUNBZ0lHTnZiWEJ2Ym1WdWRITmJZMjl0Y0c5dVpXNTBVRzl6WFNBOUlIUnRjRHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0F2THlCVGNHVmphV0ZzSUdOaGMyVWdhR0Z1Wkd4bElHWnZjaUIzYUdWdUlHOXVaU0IwWlhKdGFXNWhiQ0JwY3lCcFoyNXZjbVZrSUNocExtVXVJSGRvYVhSbGMzQmhZMlVwTGx4dUlDQXZMeUJHYjNJZ2RHaHBjeUJqWVhObElIZGxJRzFsY21kbElIUm9aU0IwWlhKdGFXNWhiQ0JwYm5SdklIUm9aU0J3Y21sdmNpQnpkSEpwYm1jZ1lXNWtJR1J5YjNBZ2RHaGxJR05vWVc1blpTNWNiaUFnTHk4Z1ZHaHBjeUJwY3lCdmJteDVJR0YyWVdsc1lXSnNaU0JtYjNJZ2MzUnlhVzVuSUcxdlpHVXVYRzRnSUd4bGRDQnNZWE4wUTI5dGNHOXVaVzUwSUQwZ1kyOXRjRzl1Wlc1MGMxdGpiMjF3YjI1bGJuUk1aVzRnTFNBeFhUdGNiaUFnYVdZZ0tHTnZiWEJ2Ym1WdWRFeGxiaUErSURGY2JpQWdJQ0FnSUNZbUlIUjVjR1Z2WmlCc1lYTjBRMjl0Y0c5dVpXNTBMblpoYkhWbElEMDlQU0FuYzNSeWFXNW5KMXh1SUNBZ0lDQWdKaVlnS0d4aGMzUkRiMjF3YjI1bGJuUXVZV1JrWldRZ2ZId2diR0Z6ZEVOdmJYQnZibVZ1ZEM1eVpXMXZkbVZrS1Z4dUlDQWdJQ0FnSmlZZ1pHbG1aaTVsY1hWaGJITW9KeWNzSUd4aGMzUkRiMjF3YjI1bGJuUXVkbUZzZFdVcEtTQjdYRzRnSUNBZ1kyOXRjRzl1Wlc1MGMxdGpiMjF3YjI1bGJuUk1aVzRnTFNBeVhTNTJZV3gxWlNBclBTQnNZWE4wUTI5dGNHOXVaVzUwTG5aaGJIVmxPMXh1SUNBZ0lHTnZiWEJ2Ym1WdWRITXVjRzl3S0NrN1hHNGdJSDFjYmx4dUlDQnlaWFIxY200Z1kyOXRjRzl1Wlc1MGN6dGNibjFjYmx4dVpuVnVZM1JwYjI0Z1kyeHZibVZRWVhSb0tIQmhkR2dwSUh0Y2JpQWdjbVYwZFhKdUlIc2dibVYzVUc5ek9pQndZWFJvTG01bGQxQnZjeXdnWTI5dGNHOXVaVzUwY3pvZ2NHRjBhQzVqYjIxd2IyNWxiblJ6TG5Oc2FXTmxLREFwSUgwN1hHNTlYRzRpWFgwPVxuXG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8ndXNlIHN0cmljdCc7XG5cblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0cy5jaGFyYWN0ZXJEaWZmID0gdW5kZWZpbmVkO1xuXHRleHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2RpZmZDaGFycyA9IGRpZmZDaGFycztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19iYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9iYXNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Jhc2UpO1xuXG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3ZhciBjaGFyYWN0ZXJEaWZmID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovY2hhcmFjdGVyRGlmZiA9IG5ldyAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2Jhc2UyWydkZWZhdWx0J10gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8oKTtcblx0ZnVuY3Rpb24gZGlmZkNoYXJzKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKSB7XG5cdCAgcmV0dXJuIGNoYXJhY3RlckRpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG5cdH1cblx0Ly8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5a2FXWm1MMk5vWVhKaFkzUmxjaTVxY3lKZExDSnVZVzFsY3lJNld5SmthV1ptUTJoaGNuTWlMQ0pqYUdGeVlXTjBaWEpFYVdabUlpd2liMnhrVTNSeUlpd2libVYzVTNSeUlpd2liM0IwYVc5dWN5SXNJbVJwWm1ZaVhTd2liV0Z3Y0dsdVozTWlPaUk3T3pzN1owTkJSMmRDUVN4VExFZEJRVUZCTEZNN08wRkJTR2hDT3pzN096czdkVUpCUlU4c1NVRkJUVU1zZVVaQlFXZENMSGRGUVVGMFFqdEJRVU5CTEZOQlFWTkVMRk5CUVZRc1EwRkJiVUpGTEUxQlFXNUNMRVZCUVRKQ1F5eE5RVUV6UWl4RlFVRnRRME1zVDBGQmJrTXNSVUZCTkVNN1FVRkJSU3hUUVVGUFNDeGpRVUZqU1N4SlFVRmtMRU5CUVcxQ1NDeE5RVUZ1UWl4RlFVRXlRa01zVFVGQk0wSXNSVUZCYlVORExFOUJRVzVETEVOQlFWQTdRVUZCY1VRaUxDSm1hV3hsSWpvaVkyaGhjbUZqZEdWeUxtcHpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpYVcxd2IzSjBJRVJwWm1ZZ1puSnZiU0FuTGk5aVlYTmxKenRjYmx4dVpYaHdiM0owSUdOdmJuTjBJR05vWVhKaFkzUmxja1JwWm1ZZ1BTQnVaWGNnUkdsbVppZ3BPMXh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR1JwWm1aRGFHRnljeWh2YkdSVGRISXNJRzVsZDFOMGNpd2diM0IwYVc5dWN5a2dleUJ5WlhSMWNtNGdZMmhoY21GamRHVnlSR2xtWmk1a2FXWm1LRzlzWkZOMGNpd2dibVYzVTNSeUxDQnZjSFJwYjI1ektUc2dmVnh1SWwxOVxuXG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8ndXNlIHN0cmljdCc7XG5cblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0cy53b3JkRGlmZiA9IHVuZGVmaW5lZDtcblx0ZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9kaWZmV29yZHMgPSBkaWZmV29yZHM7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2RpZmZXb3Jkc1dpdGhTcGFjZSA9IGRpZmZXb3Jkc1dpdGhTcGFjZTtcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19iYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9iYXNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Jhc2UpO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIGVuZCovdmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fcGFyYW1zID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5cdC8qaXN0YW5idWwgaWdub3JlIGVuZCovIC8vIEJhc2VkIG9uIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xhdGluX3NjcmlwdF9pbl9Vbmljb2RlXG5cdC8vXG5cdC8vIFJhbmdlcyBhbmQgZXhjZXB0aW9uczpcblx0Ly8gTGF0aW4tMSBTdXBwbGVtZW50LCAwMDgw4oCTMDBGRlxuXHQvLyAgLSBVKzAwRDcgIMOXIE11bHRpcGxpY2F0aW9uIHNpZ25cblx0Ly8gIC0gVSswMEY3ICDDtyBEaXZpc2lvbiBzaWduXG5cdC8vIExhdGluIEV4dGVuZGVkLUEsIDAxMDDigJMwMTdGXG5cdC8vIExhdGluIEV4dGVuZGVkLUIsIDAxODDigJMwMjRGXG5cdC8vIElQQSBFeHRlbnNpb25zLCAwMjUw4oCTMDJBRlxuXHQvLyBTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMsIDAyQjDigJMwMkZGXG5cdC8vICAtIFUrMDJDNyAgy4cgJiM3MTE7ICBDYXJvblxuXHQvLyAgLSBVKzAyRDggIMuYICYjNzI4OyAgQnJldmVcblx0Ly8gIC0gVSswMkQ5ICDLmSAmIzcyOTsgIERvdCBBYm92ZVxuXHQvLyAgLSBVKzAyREEgIMuaICYjNzMwOyAgUmluZyBBYm92ZVxuXHQvLyAgLSBVKzAyREIgIMubICYjNzMxOyAgT2dvbmVrXG5cdC8vICAtIFUrMDJEQyAgy5wgJiM3MzI7ICBTbWFsbCBUaWxkZVxuXHQvLyAgLSBVKzAyREQgIMudICYjNzMzOyAgRG91YmxlIEFjdXRlIEFjY2VudFxuXHQvLyBMYXRpbiBFeHRlbmRlZCBBZGRpdGlvbmFsLCAxRTAw4oCTMUVGRlxuXHR2YXIgZXh0ZW5kZWRXb3JkQ2hhcnMgPSAvXltBLVphLXpcXHhDMC1cXHUwMkM2XFx1MDJDOC1cXHUwMkQ3XFx1MDJERS1cXHUwMkZGXFx1MUUwMC1cXHUxRUZGXSskLztcblxuXHR2YXIgcmVXaGl0ZXNwYWNlID0gL1xcUy87XG5cblx0dmFyIHdvcmREaWZmID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovd29yZERpZmYgPSBuZXcgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19iYXNlMlsnZGVmYXVsdCddIC8qaXN0YW5idWwgaWdub3JlIGVuZCovKCk7XG5cdHdvcmREaWZmLmVxdWFscyA9IGZ1bmN0aW9uIChsZWZ0LCByaWdodCkge1xuXHQgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlQ2FzZSkge1xuXHQgICAgbGVmdCA9IGxlZnQudG9Mb3dlckNhc2UoKTtcblx0ICAgIHJpZ2h0ID0gcmlnaHQudG9Mb3dlckNhc2UoKTtcblx0ICB9XG5cdCAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0IHx8IHRoaXMub3B0aW9ucy5pZ25vcmVXaGl0ZXNwYWNlICYmICFyZVdoaXRlc3BhY2UudGVzdChsZWZ0KSAmJiAhcmVXaGl0ZXNwYWNlLnRlc3QocmlnaHQpO1xuXHR9O1xuXHR3b3JkRGlmZi50b2tlbml6ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgIHZhciB0b2tlbnMgPSB2YWx1ZS5zcGxpdCgvKFxccyt8XFxiKS8pO1xuXG5cdCAgLy8gSm9pbiB0aGUgYm91bmRhcnkgc3BsaXRzIHRoYXQgd2UgZG8gbm90IGNvbnNpZGVyIHRvIGJlIGJvdW5kYXJpZXMuIFRoaXMgaXMgcHJpbWFyaWx5IHRoZSBleHRlbmRlZCBMYXRpbiBjaGFyYWN0ZXIgc2V0LlxuXHQgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aCAtIDE7IGkrKykge1xuXHQgICAgLy8gSWYgd2UgaGF2ZSBhbiBlbXB0eSBzdHJpbmcgaW4gdGhlIG5leHQgZmllbGQgYW5kIHdlIGhhdmUgb25seSB3b3JkIGNoYXJzIGJlZm9yZSBhbmQgYWZ0ZXIsIG1lcmdlXG5cdCAgICBpZiAoIXRva2Vuc1tpICsgMV0gJiYgdG9rZW5zW2kgKyAyXSAmJiBleHRlbmRlZFdvcmRDaGFycy50ZXN0KHRva2Vuc1tpXSkgJiYgZXh0ZW5kZWRXb3JkQ2hhcnMudGVzdCh0b2tlbnNbaSArIDJdKSkge1xuXHQgICAgICB0b2tlbnNbaV0gKz0gdG9rZW5zW2kgKyAyXTtcblx0ICAgICAgdG9rZW5zLnNwbGljZShpICsgMSwgMik7XG5cdCAgICAgIGktLTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICByZXR1cm4gdG9rZW5zO1xuXHR9O1xuXG5cdGZ1bmN0aW9uIGRpZmZXb3JkcyhvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykge1xuXHQgIG9wdGlvbnMgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKDAsIF9wYXJhbXMuZ2VuZXJhdGVPcHRpb25zKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyhvcHRpb25zLCB7IGlnbm9yZVdoaXRlc3BhY2U6IHRydWUgfSk7XG5cdCAgcmV0dXJuIHdvcmREaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpO1xuXHR9XG5cblx0ZnVuY3Rpb24gZGlmZldvcmRzV2l0aFNwYWNlKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKSB7XG5cdCAgcmV0dXJuIHdvcmREaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpO1xuXHR9XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OWthV1ptTDNkdmNtUXVhbk1pWFN3aWJtRnRaWE1pT2xzaVpHbG1abGR2Y21Seklpd2laR2xtWmxkdmNtUnpWMmwwYUZOd1lXTmxJaXdpWlhoMFpXNWtaV1JYYjNKa1EyaGhjbk1pTENKeVpWZG9hWFJsYzNCaFkyVWlMQ0ozYjNKa1JHbG1aaUlzSW1WeGRXRnNjeUlzSW14bFpuUWlMQ0p5YVdkb2RDSXNJbTl3ZEdsdmJuTWlMQ0pwWjI1dmNtVkRZWE5sSWl3aWRHOU1iM2RsY2tOaGMyVWlMQ0pwWjI1dmNtVlhhR2wwWlhOd1lXTmxJaXdpZEdWemRDSXNJblJ2YTJWdWFYcGxJaXdpZG1Gc2RXVWlMQ0owYjJ0bGJuTWlMQ0p6Y0d4cGRDSXNJbWtpTENKc1pXNW5kR2dpTENKemNHeHBZMlVpTENKdmJHUlRkSElpTENKdVpYZFRkSElpTENKa2FXWm1JbDBzSW0xaGNIQnBibWR6SWpvaU96czdPMmREUVcxRVowSkJMRk1zUjBGQlFVRXNVenQ1UkVGTFFVTXNhMElzUjBGQlFVRXNhMEk3TzBGQmVFUm9RanM3T3p0MVFrRkRRVHM3T3p0M1FrRkZRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRU3hKUVVGTlF5eHZRa0ZCYjBJc0swUkJRVEZDT3p0QlFVVkJMRWxCUVUxRExHVkJRV1VzU1VGQmNrSTdPMEZCUlU4c1NVRkJUVU1zSzBWQlFWY3NkMFZCUVdwQ08wRkJRMUJCTEZOQlFWTkRMRTFCUVZRc1IwRkJhMElzVlVGQlUwTXNTVUZCVkN4RlFVRmxReXhMUVVGbUxFVkJRWE5DTzBGQlEzUkRMRTFCUVVrc1MwRkJTME1zVDBGQlRDeERRVUZoUXl4VlFVRnFRaXhGUVVFMlFqdEJRVU16UWtnc1YwRkJUMEVzUzBGQlMwa3NWMEZCVEN4RlFVRlFPMEZCUTBGSUxGbEJRVkZCTEUxQlFVMUhMRmRCUVU0c1JVRkJVanRCUVVORU8wRkJRMFFzVTBGQlQwb3NVMEZCVTBNc1MwRkJWQ3hKUVVGdFFpeExRVUZMUXl4UFFVRk1MRU5CUVdGSExHZENRVUZpTEVsQlFXbERMRU5CUVVOU0xHRkJRV0ZUTEVsQlFXSXNRMEZCYTBKT0xFbEJRV3hDTEVOQlFXeERMRWxCUVRaRUxFTkJRVU5JTEdGQlFXRlRMRWxCUVdJc1EwRkJhMEpNTEV0QlFXeENMRU5CUVhoR08wRkJRMFFzUTBGT1JEdEJRVTlCU0N4VFFVRlRVeXhSUVVGVUxFZEJRVzlDTEZWQlFWTkRMRXRCUVZRc1JVRkJaMEk3UVVGRGJFTXNUVUZCU1VNc1UwRkJVMFFzVFVGQlRVVXNTMEZCVGl4RFFVRlpMRlZCUVZvc1EwRkJZanM3UVVGRlFUdEJRVU5CTEU5QlFVc3NTVUZCU1VNc1NVRkJTU3hEUVVGaUxFVkJRV2RDUVN4SlFVRkpSaXhQUVVGUFJ5eE5RVUZRTEVkQlFXZENMRU5CUVhCRExFVkJRWFZEUkN4SFFVRjJReXhGUVVFMFF6dEJRVU14UXp0QlFVTkJMRkZCUVVrc1EwRkJRMFlzVDBGQlQwVXNTVUZCU1N4RFFVRllMRU5CUVVRc1NVRkJhMEpHTEU5QlFVOUZMRWxCUVVrc1EwRkJXQ3hEUVVGc1FpeEpRVU5MWml4clFrRkJhMEpWTEVsQlFXeENMRU5CUVhWQ1J5eFBRVUZQUlN4RFFVRlFMRU5CUVhaQ0xFTkJSRXdzU1VGRlMyWXNhMEpCUVd0Q1ZTeEpRVUZzUWl4RFFVRjFRa2NzVDBGQlQwVXNTVUZCU1N4RFFVRllMRU5CUVhaQ0xFTkJSbFFzUlVGRlowUTdRVUZET1VOR0xHRkJRVTlGTEVOQlFWQXNTMEZCWVVZc1QwRkJUMFVzU1VGQlNTeERRVUZZTEVOQlFXSTdRVUZEUVVZc1lVRkJUMGtzVFVGQlVDeERRVUZqUml4SlFVRkpMRU5CUVd4Q0xFVkJRWEZDTEVOQlFYSkNPMEZCUTBGQk8wRkJRMFE3UVVGRFJqczdRVUZGUkN4VFFVRlBSaXhOUVVGUU8wRkJRMFFzUTBGb1FrUTdPMEZCYTBKUExGTkJRVk5tTEZOQlFWUXNRMEZCYlVKdlFpeE5RVUZ1UWl4RlFVRXlRa01zVFVGQk0wSXNSVUZCYlVOaUxFOUJRVzVETEVWQlFUUkRPMEZCUTJwRVFTeFpRVUZWTERoRlFVRm5Ra0VzVDBGQmFFSXNSVUZCZVVJc1JVRkJRMGNzYTBKQlFXdENMRWxCUVc1Q0xFVkJRWHBDTEVOQlFWWTdRVUZEUVN4VFFVRlBVQ3hUUVVGVGEwSXNTVUZCVkN4RFFVRmpSaXhOUVVGa0xFVkJRWE5DUXl4TlFVRjBRaXhGUVVFNFFtSXNUMEZCT1VJc1EwRkJVRHRCUVVORU96dEJRVVZOTEZOQlFWTlFMR3RDUVVGVUxFTkJRVFJDYlVJc1RVRkJOVUlzUlVGQmIwTkRMRTFCUVhCRExFVkJRVFJEWWl4UFFVRTFReXhGUVVGeFJEdEJRVU14UkN4VFFVRlBTaXhUUVVGVGEwSXNTVUZCVkN4RFFVRmpSaXhOUVVGa0xFVkJRWE5DUXl4TlFVRjBRaXhGUVVFNFFtSXNUMEZCT1VJc1EwRkJVRHRCUVVORUlpd2labWxzWlNJNkluZHZjbVF1YW5NaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SnBiWEJ2Y25RZ1JHbG1aaUJtY205dElDY3VMMkpoYzJVbk8xeHVhVzF3YjNKMElIdG5aVzVsY21GMFpVOXdkR2x2Ym5OOUlHWnliMjBnSnk0dUwzVjBhV3d2Y0dGeVlXMXpKenRjYmx4dUx5OGdRbUZ6WldRZ2IyNGdhSFIwY0hNNkx5OWxiaTUzYVd0cGNHVmthV0V1YjNKbkwzZHBhMmt2VEdGMGFXNWZjMk55YVhCMFgybHVYMVZ1YVdOdlpHVmNiaTh2WEc0dkx5QlNZVzVuWlhNZ1lXNWtJR1Y0WTJWd2RHbHZibk02WEc0dkx5Qk1ZWFJwYmkweElGTjFjSEJzWlcxbGJuUXNJREF3T0REaWdKTXdNRVpHWEc0dkx5QWdMU0JWS3pBd1JEY2dJTU9YSUUxMWJIUnBjR3hwWTJGMGFXOXVJSE5wWjI1Y2JpOHZJQ0F0SUZVck1EQkdOeUFndzdjZ1JHbDJhWE5wYjI0Z2MybG5ibHh1THk4Z1RHRjBhVzRnUlhoMFpXNWtaV1F0UVN3Z01ERXdNT0tBa3pBeE4wWmNiaTh2SUV4aGRHbHVJRVY0ZEdWdVpHVmtMVUlzSURBeE9ERGlnSk13TWpSR1hHNHZMeUJKVUVFZ1JYaDBaVzV6YVc5dWN5d2dNREkxTU9LQWt6QXlRVVpjYmk4dklGTndZV05wYm1jZ1RXOWthV1pwWlhJZ1RHVjBkR1Z5Y3l3Z01ESkNNT0tBa3pBeVJrWmNiaTh2SUNBdElGVXJNREpETnlBZ3k0Y2dKaU0zTVRFN0lDQkRZWEp2Ymx4dUx5OGdJQzBnVlNzd01rUTRJQ0RMbUNBbUl6Y3lPRHNnSUVKeVpYWmxYRzR2THlBZ0xTQlZLekF5UkRrZ0lNdVpJQ1lqTnpJNU95QWdSRzkwSUVGaWIzWmxYRzR2THlBZ0xTQlZLekF5UkVFZ0lNdWFJQ1lqTnpNd095QWdVbWx1WnlCQlltOTJaVnh1THk4Z0lDMGdWU3N3TWtSQ0lDRExteUFtSXpjek1Uc2dJRTluYjI1bGExeHVMeThnSUMwZ1ZTc3dNa1JESUNETG5DQW1JemN6TWpzZ0lGTnRZV3hzSUZScGJHUmxYRzR2THlBZ0xTQlZLekF5UkVRZ0lNdWRJQ1lqTnpNek95QWdSRzkxWW14bElFRmpkWFJsSUVGalkyVnVkRnh1THk4Z1RHRjBhVzRnUlhoMFpXNWtaV1FnUVdSa2FYUnBiMjVoYkN3Z01VVXdNT0tBa3pGRlJrWmNibU52Ym5OMElHVjRkR1Z1WkdWa1YyOXlaRU5vWVhKeklEMGdMMTViWVMxNlFTMWFYRngxZTBNd2ZTMWNYSFY3UmtaOVhGeDFlMFE0ZlMxY1hIVjdSalo5WEZ4MWUwWTRmUzFjWEhWN01rTTJmVnhjZFhzeVF6aDlMVnhjZFhzeVJEZDlYRngxZXpKRVJYMHRYRngxZXpKR1JuMWNYSFY3TVVVd01IMHRYRngxZXpGRlJrWjlYU3NrTDNVN1hHNWNibU52Ym5OMElISmxWMmhwZEdWemNHRmpaU0E5SUM5Y1hGTXZPMXh1WEc1bGVIQnZjblFnWTI5dWMzUWdkMjl5WkVScFptWWdQU0J1WlhjZ1JHbG1aaWdwTzF4dWQyOXlaRVJwWm1ZdVpYRjFZV3h6SUQwZ1puVnVZM1JwYjI0b2JHVm1kQ3dnY21sbmFIUXBJSHRjYmlBZ2FXWWdLSFJvYVhNdWIzQjBhVzl1Y3k1cFoyNXZjbVZEWVhObEtTQjdYRzRnSUNBZ2JHVm1kQ0E5SUd4bFpuUXVkRzlNYjNkbGNrTmhjMlVvS1R0Y2JpQWdJQ0J5YVdkb2RDQTlJSEpwWjJoMExuUnZURzkzWlhKRFlYTmxLQ2s3WEc0Z0lIMWNiaUFnY21WMGRYSnVJR3hsWm5RZ1BUMDlJSEpwWjJoMElIeDhJQ2gwYUdsekxtOXdkR2x2Ym5NdWFXZHViM0psVjJocGRHVnpjR0ZqWlNBbUppQWhjbVZYYUdsMFpYTndZV05sTG5SbGMzUW9iR1ZtZENrZ0ppWWdJWEpsVjJocGRHVnpjR0ZqWlM1MFpYTjBLSEpwWjJoMEtTazdYRzU5TzF4dWQyOXlaRVJwWm1ZdWRHOXJaVzVwZW1VZ1BTQm1kVzVqZEdsdmJpaDJZV3gxWlNrZ2UxeHVJQ0JzWlhRZ2RHOXJaVzV6SUQwZ2RtRnNkV1V1YzNCc2FYUW9MeWhjWEhNcmZGeGNZaWt2S1R0Y2JseHVJQ0F2THlCS2IybHVJSFJvWlNCaWIzVnVaR0Z5ZVNCemNHeHBkSE1nZEdoaGRDQjNaU0JrYnlCdWIzUWdZMjl1YzJsa1pYSWdkRzhnWW1VZ1ltOTFibVJoY21sbGN5NGdWR2hwY3lCcGN5QndjbWx0WVhKcGJIa2dkR2hsSUdWNGRHVnVaR1ZrSUV4aGRHbHVJR05vWVhKaFkzUmxjaUJ6WlhRdVhHNGdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnZEc5clpXNXpMbXhsYm1kMGFDQXRJREU3SUdrckt5a2dlMXh1SUNBZ0lDOHZJRWxtSUhkbElHaGhkbVVnWVc0Z1pXMXdkSGtnYzNSeWFXNW5JR2x1SUhSb1pTQnVaWGgwSUdacFpXeGtJR0Z1WkNCM1pTQm9ZWFpsSUc5dWJIa2dkMjl5WkNCamFHRnljeUJpWldadmNtVWdZVzVrSUdGbWRHVnlMQ0J0WlhKblpWeHVJQ0FnSUdsbUlDZ2hkRzlyWlc1elcya2dLeUF4WFNBbUppQjBiMnRsYm5OYmFTQXJJREpkWEc0Z0lDQWdJQ0FnSUNBZ0ppWWdaWGgwWlc1a1pXUlhiM0prUTJoaGNuTXVkR1Z6ZENoMGIydGxibk5iYVYwcFhHNGdJQ0FnSUNBZ0lDQWdKaVlnWlhoMFpXNWtaV1JYYjNKa1EyaGhjbk11ZEdWemRDaDBiMnRsYm5OYmFTQXJJREpkS1NrZ2UxeHVJQ0FnSUNBZ2RHOXJaVzV6VzJsZElDczlJSFJ2YTJWdWMxdHBJQ3NnTWwwN1hHNGdJQ0FnSUNCMGIydGxibk11YzNCc2FXTmxLR2tnS3lBeExDQXlLVHRjYmlBZ0lDQWdJR2t0TFR0Y2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNCeVpYUjFjbTRnZEc5clpXNXpPMXh1ZlR0Y2JseHVaWGh3YjNKMElHWjFibU4wYVc5dUlHUnBabVpYYjNKa2N5aHZiR1JUZEhJc0lHNWxkMU4wY2l3Z2IzQjBhVzl1Y3lrZ2UxeHVJQ0J2Y0hScGIyNXpJRDBnWjJWdVpYSmhkR1ZQY0hScGIyNXpLRzl3ZEdsdmJuTXNJSHRwWjI1dmNtVlhhR2wwWlhOd1lXTmxPaUIwY25WbGZTazdYRzRnSUhKbGRIVnliaUIzYjNKa1JHbG1aaTVrYVdabUtHOXNaRk4wY2l3Z2JtVjNVM1J5TENCdmNIUnBiMjV6S1R0Y2JuMWNibHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR1JwWm1aWGIzSmtjMWRwZEdoVGNHRmpaU2h2YkdSVGRISXNJRzVsZDFOMGNpd2diM0IwYVc5dWN5a2dlMXh1SUNCeVpYUjFjbTRnZDI5eVpFUnBabVl1WkdsbVppaHZiR1JUZEhJc0lHNWxkMU4wY2l3Z2IzQjBhVzl1Y3lrN1hHNTlYRzRpWFgwPVxuXG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8ndXNlIHN0cmljdCc7XG5cblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9nZW5lcmF0ZU9wdGlvbnMgPSBnZW5lcmF0ZU9wdGlvbnM7XG5cdGZ1bmN0aW9uIGdlbmVyYXRlT3B0aW9ucyhvcHRpb25zLCBkZWZhdWx0cykge1xuXHQgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgZGVmYXVsdHMuY2FsbGJhY2sgPSBvcHRpb25zO1xuXHQgIH0gZWxzZSBpZiAob3B0aW9ucykge1xuXHQgICAgZm9yICh2YXIgbmFtZSBpbiBvcHRpb25zKSB7XG5cdCAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cdCAgICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG5cdCAgICAgICAgZGVmYXVsdHNbbmFtZV0gPSBvcHRpb25zW25hbWVdO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfVxuXHQgIHJldHVybiBkZWZhdWx0cztcblx0fVxuXHQvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTkxZEdsc0wzQmhjbUZ0Y3k1cWN5SmRMQ0p1WVcxbGN5STZXeUpuWlc1bGNtRjBaVTl3ZEdsdmJuTWlMQ0p2Y0hScGIyNXpJaXdpWkdWbVlYVnNkSE1pTENKallXeHNZbUZqYXlJc0ltNWhiV1VpTENKb1lYTlBkMjVRY205d1pYSjBlU0pkTENKdFlYQndhVzVuY3lJNklqczdPMmREUVVGblFrRXNaU3hIUVVGQlFTeGxPMEZCUVZRc1UwRkJVMEVzWlVGQlZDeERRVUY1UWtNc1QwRkJla0lzUlVGQmEwTkRMRkZCUVd4RExFVkJRVFJETzBGQlEycEVMRTFCUVVrc1QwRkJUMFFzVDBGQlVDeExRVUZ0UWl4VlFVRjJRaXhGUVVGdFF6dEJRVU5xUTBNc1lVRkJVME1zVVVGQlZDeEhRVUZ2UWtZc1QwRkJjRUk3UVVGRFJDeEhRVVpFTEUxQlJVOHNTVUZCU1VFc1QwRkJTaXhGUVVGaE8wRkJRMnhDTEZOQlFVc3NTVUZCU1Vjc1NVRkJWQ3hKUVVGcFFrZ3NUMEZCYWtJc1JVRkJNRUk3UVVGRGVFSTdRVUZEUVN4VlFVRkpRU3hSUVVGUlNTeGpRVUZTTEVOQlFYVkNSQ3hKUVVGMlFpeERRVUZLTEVWQlFXdERPMEZCUTJoRFJpeHBRa0ZCVTBVc1NVRkJWQ3hKUVVGcFFrZ3NVVUZCVVVjc1NVRkJVaXhEUVVGcVFqdEJRVU5FTzBGQlEwWTdRVUZEUmp0QlFVTkVMRk5CUVU5R0xGRkJRVkE3UVVGRFJDSXNJbVpwYkdVaU9pSndZWEpoYlhNdWFuTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUpsZUhCdmNuUWdablZ1WTNScGIyNGdaMlZ1WlhKaGRHVlBjSFJwYjI1ektHOXdkR2x2Ym5Nc0lHUmxabUYxYkhSektTQjdYRzRnSUdsbUlDaDBlWEJsYjJZZ2IzQjBhVzl1Y3lBOVBUMGdKMloxYm1OMGFXOXVKeWtnZTF4dUlDQWdJR1JsWm1GMWJIUnpMbU5oYkd4aVlXTnJJRDBnYjNCMGFXOXVjenRjYmlBZ2ZTQmxiSE5sSUdsbUlDaHZjSFJwYjI1ektTQjdYRzRnSUNBZ1ptOXlJQ2hzWlhRZ2JtRnRaU0JwYmlCdmNIUnBiMjV6S1NCN1hHNGdJQ0FnSUNBdktpQnBjM1JoYm1KMWJDQnBaMjV2Y21VZ1pXeHpaU0FxTDF4dUlDQWdJQ0FnYVdZZ0tHOXdkR2x2Ym5NdWFHRnpUM2R1VUhKdmNHVnlkSGtvYm1GdFpTa3BJSHRjYmlBZ0lDQWdJQ0FnWkdWbVlYVnNkSE5iYm1GdFpWMGdQU0J2Y0hScGIyNXpXMjVoYldWZE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdmVnh1SUNCeVpYUjFjbTRnWkdWbVlYVnNkSE03WEc1OVhHNGlYWDA9XG5cblxuLyoqKi8gfSksXG4vKiA1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyd1c2Ugc3RyaWN0JztcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLmxpbmVEaWZmID0gdW5kZWZpbmVkO1xuXHRleHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2RpZmZMaW5lcyA9IGRpZmZMaW5lcztcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZlRyaW1tZWRMaW5lcyA9IGRpZmZUcmltbWVkTGluZXM7XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fYmFzZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciBfYmFzZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9iYXNlKTtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3ZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX3BhcmFtcyA9IF9fd2VicGFja19yZXF1aXJlX18oNCkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3ZhciBsaW5lRGlmZiA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2xpbmVEaWZmID0gbmV3IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fYmFzZTJbJ2RlZmF1bHQnXSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLygpO1xuXHRsaW5lRGlmZi50b2tlbml6ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgIHZhciByZXRMaW5lcyA9IFtdLFxuXHQgICAgICBsaW5lc0FuZE5ld2xpbmVzID0gdmFsdWUuc3BsaXQoLyhcXG58XFxyXFxuKS8pO1xuXG5cdCAgLy8gSWdub3JlIHRoZSBmaW5hbCBlbXB0eSB0b2tlbiB0aGF0IG9jY3VycyBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCBhIG5ldyBsaW5lXG5cdCAgaWYgKCFsaW5lc0FuZE5ld2xpbmVzW2xpbmVzQW5kTmV3bGluZXMubGVuZ3RoIC0gMV0pIHtcblx0ICAgIGxpbmVzQW5kTmV3bGluZXMucG9wKCk7XG5cdCAgfVxuXG5cdCAgLy8gTWVyZ2UgdGhlIGNvbnRlbnQgYW5kIGxpbmUgc2VwYXJhdG9ycyBpbnRvIHNpbmdsZSB0b2tlbnNcblx0ICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzQW5kTmV3bGluZXMubGVuZ3RoOyBpKyspIHtcblx0ICAgIHZhciBsaW5lID0gbGluZXNBbmROZXdsaW5lc1tpXTtcblxuXHQgICAgaWYgKGkgJSAyICYmICF0aGlzLm9wdGlvbnMubmV3bGluZUlzVG9rZW4pIHtcblx0ICAgICAgcmV0TGluZXNbcmV0TGluZXMubGVuZ3RoIC0gMV0gKz0gbGluZTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlV2hpdGVzcGFjZSkge1xuXHQgICAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKTtcblx0ICAgICAgfVxuXHQgICAgICByZXRMaW5lcy5wdXNoKGxpbmUpO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHJldHVybiByZXRMaW5lcztcblx0fTtcblxuXHRmdW5jdGlvbiBkaWZmTGluZXMob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKSB7XG5cdCAgcmV0dXJuIGxpbmVEaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKTtcblx0fVxuXHRmdW5jdGlvbiBkaWZmVHJpbW1lZExpbmVzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykge1xuXHQgIHZhciBvcHRpb25zID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLygwLCBfcGFyYW1zLmdlbmVyYXRlT3B0aW9ucykgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8oY2FsbGJhY2ssIHsgaWdub3JlV2hpdGVzcGFjZTogdHJ1ZSB9KTtcblx0ICByZXR1cm4gbGluZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG5cdH1cblx0Ly8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5a2FXWm1MMnhwYm1VdWFuTWlYU3dpYm1GdFpYTWlPbHNpWkdsbVpreHBibVZ6SWl3aVpHbG1abFJ5YVcxdFpXUk1hVzVsY3lJc0lteHBibVZFYVdabUlpd2lkRzlyWlc1cGVtVWlMQ0oyWVd4MVpTSXNJbkpsZEV4cGJtVnpJaXdpYkdsdVpYTkJibVJPWlhkc2FXNWxjeUlzSW5Od2JHbDBJaXdpYkdWdVozUm9JaXdpY0c5d0lpd2lhU0lzSW14cGJtVWlMQ0p2Y0hScGIyNXpJaXdpYm1WM2JHbHVaVWx6Vkc5clpXNGlMQ0pwWjI1dmNtVlhhR2wwWlhOd1lXTmxJaXdpZEhKcGJTSXNJbkIxYzJnaUxDSnZiR1JUZEhJaUxDSnVaWGRUZEhJaUxDSmpZV3hzWW1GamF5SXNJbVJwWm1ZaVhTd2liV0Z3Y0dsdVozTWlPaUk3T3pzN1owTkJPRUpuUWtFc1V5eEhRVUZCUVN4VE8zbEVRVU5CUXl4blFpeEhRVUZCUVN4blFqczdRVUV2UW1oQ096czdPM1ZDUVVOQk96czdPM1ZDUVVWUExFbEJRVTFETEN0RlFVRlhMSGRGUVVGcVFqdEJRVU5RUVN4VFFVRlRReXhSUVVGVUxFZEJRVzlDTEZWQlFWTkRMRXRCUVZRc1JVRkJaMEk3UVVGRGJFTXNUVUZCU1VNc1YwRkJWeXhGUVVGbU8wRkJRVUVzVFVGRFNVTXNiVUpCUVcxQ1JpeE5RVUZOUnl4TFFVRk9MRU5CUVZrc1YwRkJXaXhEUVVSMlFqczdRVUZIUVR0QlFVTkJMRTFCUVVrc1EwRkJRMFFzYVVKQlFXbENRU3hwUWtGQmFVSkZMRTFCUVdwQ0xFZEJRVEJDTEVOQlFUTkRMRU5CUVV3c1JVRkJiMFE3UVVGRGJFUkdMSEZDUVVGcFFrY3NSMEZCYWtJN1FVRkRSRHM3UVVGRlJEdEJRVU5CTEU5QlFVc3NTVUZCU1VNc1NVRkJTU3hEUVVGaUxFVkJRV2RDUVN4SlFVRkpTaXhwUWtGQmFVSkZMRTFCUVhKRExFVkJRVFpEUlN4SFFVRTNReXhGUVVGclJEdEJRVU5vUkN4UlFVRkpReXhQUVVGUFRDeHBRa0ZCYVVKSkxFTkJRV3BDTEVOQlFWZzdPMEZCUlVFc1VVRkJTVUVzU1VGQlNTeERRVUZLTEVsQlFWTXNRMEZCUXl4TFFVRkxSU3hQUVVGTUxFTkJRV0ZETEdOQlFUTkNMRVZCUVRKRE8wRkJRM3BEVWl4bFFVRlRRU3hUUVVGVFJ5eE5RVUZVTEVkQlFXdENMRU5CUVROQ0xFdEJRV2xEUnl4SlFVRnFRenRCUVVORUxFdEJSa1FzVFVGRlR6dEJRVU5NTEZWQlFVa3NTMEZCUzBNc1QwRkJUQ3hEUVVGaFJTeG5Ra0ZCYWtJc1JVRkJiVU03UVVGRGFrTklMR1ZCUVU5QkxFdEJRVXRKTEVsQlFVd3NSVUZCVUR0QlFVTkVPMEZCUTBSV0xHVkJRVk5YTEVsQlFWUXNRMEZCWTB3c1NVRkJaRHRCUVVORU8wRkJRMFk3TzBGQlJVUXNVMEZCVDA0c1VVRkJVRHRCUVVORUxFTkJlRUpFT3p0QlFUQkNUeXhUUVVGVFRDeFRRVUZVTEVOQlFXMUNhVUlzVFVGQmJrSXNSVUZCTWtKRExFMUJRVE5DTEVWQlFXMURReXhSUVVGdVF5eEZRVUUyUXp0QlFVRkZMRk5CUVU5cVFpeFRRVUZUYTBJc1NVRkJWQ3hEUVVGalNDeE5RVUZrTEVWQlFYTkNReXhOUVVGMFFpeEZRVUU0UWtNc1VVRkJPVUlzUTBGQlVEdEJRVUZwUkR0QlFVTm9SeXhUUVVGVGJFSXNaMEpCUVZRc1EwRkJNRUpuUWl4TlFVRXhRaXhGUVVGclEwTXNUVUZCYkVNc1JVRkJNRU5ETEZGQlFURkRMRVZCUVc5RU8wRkJRM3BFTEUxQlFVbFFMRlZCUVZVc09FVkJRV2RDVHl4UlFVRm9RaXhGUVVFd1FpeEZRVUZEVEN4clFrRkJhMElzU1VGQmJrSXNSVUZCTVVJc1EwRkJaRHRCUVVOQkxGTkJRVTlhTEZOQlFWTnJRaXhKUVVGVUxFTkJRV05JTEUxQlFXUXNSVUZCYzBKRExFMUJRWFJDTEVWQlFUaENUaXhQUVVFNVFpeERRVUZRTzBGQlEwUWlMQ0ptYVd4bElqb2liR2x1WlM1cWN5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbWx0Y0c5eWRDQkVhV1ptSUdaeWIyMGdKeTR2WW1GelpTYzdYRzVwYlhCdmNuUWdlMmRsYm1WeVlYUmxUM0IwYVc5dWMzMGdabkp2YlNBbkxpNHZkWFJwYkM5d1lYSmhiWE1uTzF4dVhHNWxlSEJ2Y25RZ1kyOXVjM1FnYkdsdVpVUnBabVlnUFNCdVpYY2dSR2xtWmlncE8xeHViR2x1WlVScFptWXVkRzlyWlc1cGVtVWdQU0JtZFc1amRHbHZiaWgyWVd4MVpTa2dlMXh1SUNCc1pYUWdjbVYwVEdsdVpYTWdQU0JiWFN4Y2JpQWdJQ0FnSUd4cGJtVnpRVzVrVG1WM2JHbHVaWE1nUFNCMllXeDFaUzV6Y0d4cGRDZ3ZLRnhjYm54Y1hISmNYRzRwTHlrN1hHNWNiaUFnTHk4Z1NXZHViM0psSUhSb1pTQm1hVzVoYkNCbGJYQjBlU0IwYjJ0bGJpQjBhR0YwSUc5alkzVnljeUJwWmlCMGFHVWdjM1J5YVc1bklHVnVaSE1nZDJsMGFDQmhJRzVsZHlCc2FXNWxYRzRnSUdsbUlDZ2hiR2x1WlhOQmJtUk9aWGRzYVc1bGMxdHNhVzVsYzBGdVpFNWxkMnhwYm1WekxteGxibWQwYUNBdElERmRLU0I3WEc0Z0lDQWdiR2x1WlhOQmJtUk9aWGRzYVc1bGN5NXdiM0FvS1R0Y2JpQWdmVnh1WEc0Z0lDOHZJRTFsY21kbElIUm9aU0JqYjI1MFpXNTBJR0Z1WkNCc2FXNWxJSE5sY0dGeVlYUnZjbk1nYVc1MGJ5QnphVzVuYkdVZ2RHOXJaVzV6WEc0Z0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2diR2x1WlhOQmJtUk9aWGRzYVc1bGN5NXNaVzVuZEdnN0lHa3JLeWtnZTF4dUlDQWdJR3hsZENCc2FXNWxJRDBnYkdsdVpYTkJibVJPWlhkc2FXNWxjMXRwWFR0Y2JseHVJQ0FnSUdsbUlDaHBJQ1VnTWlBbUppQWhkR2hwY3k1dmNIUnBiMjV6TG01bGQyeHBibVZKYzFSdmEyVnVLU0I3WEc0Z0lDQWdJQ0J5WlhSTWFXNWxjMXR5WlhSTWFXNWxjeTVzWlc1bmRHZ2dMU0F4WFNBclBTQnNhVzVsTzF4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQnBaaUFvZEdocGN5NXZjSFJwYjI1ekxtbG5ibTl5WlZkb2FYUmxjM0JoWTJVcElIdGNiaUFnSUNBZ0lDQWdiR2x1WlNBOUlHeHBibVV1ZEhKcGJTZ3BPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdjbVYwVEdsdVpYTXVjSFZ6YUNoc2FXNWxLVHRjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0J5WlhSMWNtNGdjbVYwVEdsdVpYTTdYRzU5TzF4dVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1pHbG1aa3hwYm1WektHOXNaRk4wY2l3Z2JtVjNVM1J5TENCallXeHNZbUZqYXlrZ2V5QnlaWFIxY200Z2JHbHVaVVJwWm1ZdVpHbG1aaWh2YkdSVGRISXNJRzVsZDFOMGNpd2dZMkZzYkdKaFkyc3BPeUI5WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWkdsbVpsUnlhVzF0WldSTWFXNWxjeWh2YkdSVGRISXNJRzVsZDFOMGNpd2dZMkZzYkdKaFkyc3BJSHRjYmlBZ2JHVjBJRzl3ZEdsdmJuTWdQU0JuWlc1bGNtRjBaVTl3ZEdsdmJuTW9ZMkZzYkdKaFkyc3NJSHRwWjI1dmNtVlhhR2wwWlhOd1lXTmxPaUIwY25WbGZTazdYRzRnSUhKbGRIVnliaUJzYVc1bFJHbG1aaTVrYVdabUtHOXNaRk4wY2l3Z2JtVjNVM1J5TENCdmNIUnBiMjV6S1R0Y2JuMWNiaUpkZlE9PVxuXG5cbi8qKiovIH0pLFxuLyogNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8ndXNlIHN0cmljdCc7XG5cblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0cy5zZW50ZW5jZURpZmYgPSB1bmRlZmluZWQ7XG5cdGV4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZlNlbnRlbmNlcyA9IGRpZmZTZW50ZW5jZXM7XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fYmFzZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciBfYmFzZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9iYXNlKTtcblxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgZW5kKi92YXIgc2VudGVuY2VEaWZmID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovc2VudGVuY2VEaWZmID0gbmV3IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fYmFzZTJbJ2RlZmF1bHQnXSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLygpO1xuXHRzZW50ZW5jZURpZmYudG9rZW5pemUgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICByZXR1cm4gdmFsdWUuc3BsaXQoLyhcXFMuKz9bLiE/XSkoPz1cXHMrfCQpLyk7XG5cdH07XG5cblx0ZnVuY3Rpb24gZGlmZlNlbnRlbmNlcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHtcblx0ICByZXR1cm4gc2VudGVuY2VEaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKTtcblx0fVxuXHQvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTlrYVdabUwzTmxiblJsYm1ObExtcHpJbDBzSW01aGJXVnpJanBiSW1ScFptWlRaVzUwWlc1alpYTWlMQ0p6Wlc1MFpXNWpaVVJwWm1ZaUxDSjBiMnRsYm1sNlpTSXNJblpoYkhWbElpd2ljM0JzYVhRaUxDSnZiR1JUZEhJaUxDSnVaWGRUZEhJaUxDSmpZV3hzWW1GamF5SXNJbVJwWm1ZaVhTd2liV0Z3Y0dsdVozTWlPaUk3T3pzN1owTkJVV2RDUVN4aExFZEJRVUZCTEdFN08wRkJVbWhDT3pzN096czdkVUpCUjA4c1NVRkJUVU1zZFVaQlFXVXNkMFZCUVhKQ08wRkJRMUJCTEdGQlFXRkRMRkZCUVdJc1IwRkJkMElzVlVGQlUwTXNTMEZCVkN4RlFVRm5RanRCUVVOMFF5eFRRVUZQUVN4TlFVRk5ReXhMUVVGT0xFTkJRVmtzZFVKQlFWb3NRMEZCVUR0QlFVTkVMRU5CUmtRN08wRkJTVThzVTBGQlUwb3NZVUZCVkN4RFFVRjFRa3NzVFVGQmRrSXNSVUZCSzBKRExFMUJRUzlDTEVWQlFYVkRReXhSUVVGMlF5eEZRVUZwUkR0QlFVRkZMRk5CUVU5T0xHRkJRV0ZQTEVsQlFXSXNRMEZCYTBKSUxFMUJRV3hDTEVWQlFUQkNReXhOUVVFeFFpeEZRVUZyUTBNc1VVRkJiRU1zUTBGQlVEdEJRVUZ4UkNJc0ltWnBiR1VpT2lKelpXNTBaVzVqWlM1cWN5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbWx0Y0c5eWRDQkVhV1ptSUdaeWIyMGdKeTR2WW1GelpTYzdYRzVjYmx4dVpYaHdiM0owSUdOdmJuTjBJSE5sYm5SbGJtTmxSR2xtWmlBOUlHNWxkeUJFYVdabUtDazdYRzV6Wlc1MFpXNWpaVVJwWm1ZdWRHOXJaVzVwZW1VZ1BTQm1kVzVqZEdsdmJpaDJZV3gxWlNrZ2UxeHVJQ0J5WlhSMWNtNGdkbUZzZFdVdWMzQnNhWFFvTHloY1hGTXVLejliTGlFL1hTa29QejFjWEhNcmZDUXBMeWs3WEc1OU8xeHVYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdaR2xtWmxObGJuUmxibU5sY3lodmJHUlRkSElzSUc1bGQxTjBjaXdnWTJGc2JHSmhZMnNwSUhzZ2NtVjBkWEp1SUhObGJuUmxibU5sUkdsbVppNWthV1ptS0c5c1pGTjBjaXdnYm1WM1UzUnlMQ0JqWVd4c1ltRmpheWs3SUgxY2JpSmRmUT09XG5cblxuLyoqKi8gfSksXG4vKiA3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyd1c2Ugc3RyaWN0JztcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLmNzc0RpZmYgPSB1bmRlZmluZWQ7XG5cdGV4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZkNzcyA9IGRpZmZDc3M7XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fYmFzZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciBfYmFzZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9iYXNlKTtcblxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgZW5kKi92YXIgY3NzRGlmZiA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2Nzc0RpZmYgPSBuZXcgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19iYXNlMlsnZGVmYXVsdCddIC8qaXN0YW5idWwgaWdub3JlIGVuZCovKCk7XG5cdGNzc0RpZmYudG9rZW5pemUgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICByZXR1cm4gdmFsdWUuc3BsaXQoLyhbe306OyxdfFxccyspLyk7XG5cdH07XG5cblx0ZnVuY3Rpb24gZGlmZkNzcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHtcblx0ICByZXR1cm4gY3NzRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjayk7XG5cdH1cblx0Ly8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5a2FXWm1MMk56Y3k1cWN5SmRMQ0p1WVcxbGN5STZXeUprYVdabVEzTnpJaXdpWTNOelJHbG1aaUlzSW5SdmEyVnVhWHBsSWl3aWRtRnNkV1VpTENKemNHeHBkQ0lzSW05c1pGTjBjaUlzSW01bGQxTjBjaUlzSW1OaGJHeGlZV05ySWl3aVpHbG1aaUpkTENKdFlYQndhVzVuY3lJNklqczdPenRuUTBGUFowSkJMRThzUjBGQlFVRXNUenM3UVVGUWFFSTdPenM3T3p0MVFrRkZUeXhKUVVGTlF5dzJSVUZCVlN4M1JVRkJhRUk3UVVGRFVFRXNVVUZCVVVNc1VVRkJVaXhIUVVGdFFpeFZRVUZUUXl4TFFVRlVMRVZCUVdkQ08wRkJRMnBETEZOQlFVOUJMRTFCUVUxRExFdEJRVTRzUTBGQldTeGxRVUZhTEVOQlFWQTdRVUZEUkN4RFFVWkVPenRCUVVsUExGTkJRVk5LTEU5QlFWUXNRMEZCYVVKTExFMUJRV3BDTEVWQlFYbENReXhOUVVGNlFpeEZRVUZwUTBNc1VVRkJha01zUlVGQk1rTTdRVUZCUlN4VFFVRlBUaXhSUVVGUlR5eEpRVUZTTEVOQlFXRklMRTFCUVdJc1JVRkJjVUpETEUxQlFYSkNMRVZCUVRaQ1F5eFJRVUUzUWl4RFFVRlFPMEZCUVdkRUlpd2labWxzWlNJNkltTnpjeTVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCRWFXWm1JR1p5YjIwZ0p5NHZZbUZ6WlNjN1hHNWNibVY0Y0c5eWRDQmpiMjV6ZENCamMzTkVhV1ptSUQwZ2JtVjNJRVJwWm1Zb0tUdGNibU56YzBScFptWXVkRzlyWlc1cGVtVWdQU0JtZFc1amRHbHZiaWgyWVd4MVpTa2dlMXh1SUNCeVpYUjFjbTRnZG1Gc2RXVXVjM0JzYVhRb0x5aGJlMzA2T3l4ZGZGeGNjeXNwTHlrN1hHNTlPMXh1WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWkdsbVprTnpjeWh2YkdSVGRISXNJRzVsZDFOMGNpd2dZMkZzYkdKaFkyc3BJSHNnY21WMGRYSnVJR056YzBScFptWXVaR2xtWmlodmJHUlRkSElzSUc1bGQxTjBjaXdnWTJGc2JHSmhZMnNwT3lCOVhHNGlYWDA9XG5cblxuLyoqKi8gfSksXG4vKiA4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyd1c2Ugc3RyaWN0JztcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLmpzb25EaWZmID0gdW5kZWZpbmVkO1xuXG5cdHZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuXHRleHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2RpZmZKc29uID0gZGlmZkpzb247XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2Nhbm9uaWNhbGl6ZSA9IGNhbm9uaWNhbGl6ZTtcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19iYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9iYXNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Jhc2UpO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIGVuZCovdmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fbGluZSA9IF9fd2VicGFja19yZXF1aXJlX18oNSkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3ZhciBvYmplY3RQcm90b3R5cGVUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cblx0dmFyIGpzb25EaWZmID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovanNvbkRpZmYgPSBuZXcgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19iYXNlMlsnZGVmYXVsdCddIC8qaXN0YW5idWwgaWdub3JlIGVuZCovKCk7XG5cdC8vIERpc2NyaW1pbmF0ZSBiZXR3ZWVuIHR3byBsaW5lcyBvZiBwcmV0dHktcHJpbnRlZCwgc2VyaWFsaXplZCBKU09OIHdoZXJlIG9uZSBvZiB0aGVtIGhhcyBhXG5cdC8vIGRhbmdsaW5nIGNvbW1hIGFuZCB0aGUgb3RoZXIgZG9lc24ndC4gVHVybnMgb3V0IGluY2x1ZGluZyB0aGUgZGFuZ2xpbmcgY29tbWEgeWllbGRzIHRoZSBuaWNlc3Qgb3V0cHV0OlxuXHRqc29uRGlmZi51c2VMb25nZXN0VG9rZW4gPSB0cnVlO1xuXG5cdGpzb25EaWZmLnRva2VuaXplID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19saW5lLmxpbmVEaWZmIC8qaXN0YW5idWwgaWdub3JlIGVuZCovLnRva2VuaXplO1xuXHRqc29uRGlmZi5jYXN0SW5wdXQgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIC8qaXN0YW5idWwgaWdub3JlIGVuZCovdW5kZWZpbmVkUmVwbGFjZW1lbnQgPSB0aGlzLm9wdGlvbnMudW5kZWZpbmVkUmVwbGFjZW1lbnQ7XG5cblxuXHQgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBKU09OLnN0cmluZ2lmeShjYW5vbmljYWxpemUodmFsdWUpLCBmdW5jdGlvbiAoaywgdikge1xuXHQgICAgaWYgKHR5cGVvZiB2ID09PSAndW5kZWZpbmVkJykge1xuXHQgICAgICByZXR1cm4gdW5kZWZpbmVkUmVwbGFjZW1lbnQ7XG5cdCAgICB9XG5cblx0ICAgIHJldHVybiB2O1xuXHQgIH0sICcgICcpO1xuXHR9O1xuXHRqc29uRGlmZi5lcXVhbHMgPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHtcblx0ICByZXR1cm4gKC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fYmFzZTJbJ2RlZmF1bHQnXSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLy5wcm90b3R5cGUuZXF1YWxzLmNhbGwoanNvbkRpZmYsIGxlZnQucmVwbGFjZSgvLChbXFxyXFxuXSkvZywgJyQxJyksIHJpZ2h0LnJlcGxhY2UoLywoW1xcclxcbl0pL2csICckMScpKVxuXHQgICk7XG5cdH07XG5cblx0ZnVuY3Rpb24gZGlmZkpzb24ob2xkT2JqLCBuZXdPYmosIG9wdGlvbnMpIHtcblx0ICByZXR1cm4ganNvbkRpZmYuZGlmZihvbGRPYmosIG5ld09iaiwgb3B0aW9ucyk7XG5cdH1cblxuXHQvLyBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIHByZXNlbmNlIG9mIGNpcmN1bGFyIHJlZmVyZW5jZXMgYnkgYmFpbGluZyBvdXQgd2hlbiBlbmNvdW50ZXJpbmcgYW5cblx0Ly8gb2JqZWN0IHRoYXQgaXMgYWxyZWFkeSBvbiB0aGUgXCJzdGFja1wiIG9mIGl0ZW1zIGJlaW5nIHByb2Nlc3NlZC5cblx0ZnVuY3Rpb24gY2Fub25pY2FsaXplKG9iaiwgc3RhY2ssIHJlcGxhY2VtZW50U3RhY2spIHtcblx0ICBzdGFjayA9IHN0YWNrIHx8IFtdO1xuXHQgIHJlcGxhY2VtZW50U3RhY2sgPSByZXBsYWNlbWVudFN0YWNrIHx8IFtdO1xuXG5cdCAgdmFyIGkgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdm9pZCAwIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdCAgZm9yIChpID0gMDsgaSA8IHN0YWNrLmxlbmd0aDsgaSArPSAxKSB7XG5cdCAgICBpZiAoc3RhY2tbaV0gPT09IG9iaikge1xuXHQgICAgICByZXR1cm4gcmVwbGFjZW1lbnRTdGFja1tpXTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICB2YXIgY2Fub25pY2FsaXplZE9iaiA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92b2lkIDAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0ICBpZiAoJ1tvYmplY3QgQXJyYXldJyA9PT0gb2JqZWN0UHJvdG90eXBlVG9TdHJpbmcuY2FsbChvYmopKSB7XG5cdCAgICBzdGFjay5wdXNoKG9iaik7XG5cdCAgICBjYW5vbmljYWxpemVkT2JqID0gbmV3IEFycmF5KG9iai5sZW5ndGgpO1xuXHQgICAgcmVwbGFjZW1lbnRTdGFjay5wdXNoKGNhbm9uaWNhbGl6ZWRPYmopO1xuXHQgICAgZm9yIChpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkgKz0gMSkge1xuXHQgICAgICBjYW5vbmljYWxpemVkT2JqW2ldID0gY2Fub25pY2FsaXplKG9ialtpXSwgc3RhY2ssIHJlcGxhY2VtZW50U3RhY2spO1xuXHQgICAgfVxuXHQgICAgc3RhY2sucG9wKCk7XG5cdCAgICByZXBsYWNlbWVudFN0YWNrLnBvcCgpO1xuXHQgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZWRPYmo7XG5cdCAgfVxuXG5cdCAgaWYgKG9iaiAmJiBvYmoudG9KU09OKSB7XG5cdCAgICBvYmogPSBvYmoudG9KU09OKCk7XG5cdCAgfVxuXG5cdCAgaWYgKCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKHR5cGVvZiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL29iaiA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yob2JqKSkgPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCkge1xuXHQgICAgc3RhY2sucHVzaChvYmopO1xuXHQgICAgY2Fub25pY2FsaXplZE9iaiA9IHt9O1xuXHQgICAgcmVwbGFjZW1lbnRTdGFjay5wdXNoKGNhbm9uaWNhbGl6ZWRPYmopO1xuXHQgICAgdmFyIHNvcnRlZEtleXMgPSBbXSxcblx0ICAgICAgICBrZXkgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdm9pZCAwIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXHQgICAgZm9yIChrZXkgaW4gb2JqKSB7XG5cdCAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cdCAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHQgICAgICAgIHNvcnRlZEtleXMucHVzaChrZXkpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBzb3J0ZWRLZXlzLnNvcnQoKTtcblx0ICAgIGZvciAoaSA9IDA7IGkgPCBzb3J0ZWRLZXlzLmxlbmd0aDsgaSArPSAxKSB7XG5cdCAgICAgIGtleSA9IHNvcnRlZEtleXNbaV07XG5cdCAgICAgIGNhbm9uaWNhbGl6ZWRPYmpba2V5XSA9IGNhbm9uaWNhbGl6ZShvYmpba2V5XSwgc3RhY2ssIHJlcGxhY2VtZW50U3RhY2spO1xuXHQgICAgfVxuXHQgICAgc3RhY2sucG9wKCk7XG5cdCAgICByZXBsYWNlbWVudFN0YWNrLnBvcCgpO1xuXHQgIH0gZWxzZSB7XG5cdCAgICBjYW5vbmljYWxpemVkT2JqID0gb2JqO1xuXHQgIH1cblx0ICByZXR1cm4gY2Fub25pY2FsaXplZE9iajtcblx0fVxuXHQvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTlrYVdabUwycHpiMjR1YW5NaVhTd2libUZ0WlhNaU9sc2laR2xtWmtwemIyNGlMQ0pqWVc1dmJtbGpZV3hwZW1VaUxDSnZZbXBsWTNSUWNtOTBiM1I1Y0dWVWIxTjBjbWx1WnlJc0lrOWlhbVZqZENJc0luQnliM1J2ZEhsd1pTSXNJblJ2VTNSeWFXNW5JaXdpYW5OdmJrUnBabVlpTENKMWMyVk1iMjVuWlhOMFZHOXJaVzRpTENKMGIydGxibWw2WlNJc0ltTmhjM1JKYm5CMWRDSXNJblpoYkhWbElpd2lkVzVrWldacGJtVmtVbVZ3YkdGalpXMWxiblFpTENKdmNIUnBiMjV6SWl3aVNsTlBUaUlzSW5OMGNtbHVaMmxtZVNJc0ltc2lMQ0oySWl3aVpYRjFZV3h6SWl3aWJHVm1kQ0lzSW5KcFoyaDBJaXdpWTJGc2JDSXNJbkpsY0d4aFkyVWlMQ0p2YkdSUFltb2lMQ0p1WlhkUFltb2lMQ0prYVdabUlpd2liMkpxSWl3aWMzUmhZMnNpTENKeVpYQnNZV05sYldWdWRGTjBZV05ySWl3aWFTSXNJbXhsYm1kMGFDSXNJbU5oYm05dWFXTmhiR2w2WldSUFltb2lMQ0p3ZFhOb0lpd2lRWEp5WVhraUxDSndiM0FpTENKMGIwcFRUMDRpTENKemIzSjBaV1JMWlhseklpd2lhMlY1SWl3aWFHRnpUM2R1VUhKdmNHVnlkSGtpTENKemIzSjBJbDBzSW0xaGNIQnBibWR6SWpvaU96czdPenM3TzJkRFFUSkNaMEpCTEZFc1IwRkJRVUVzVVR0NVJFRkpRVU1zV1N4SFFVRkJRU3haT3p0QlFTOUNhRUk3T3pzN2RVSkJRMEU3T3pzN2RVSkJSVUVzU1VGQlRVTXNNRUpCUVRCQ1F5eFBRVUZQUXl4VFFVRlFMRU5CUVdsQ1F5eFJRVUZxUkRzN1FVRkhUeXhKUVVGTlF5d3JSVUZCVnl4M1JVRkJha0k3UVVGRFVEdEJRVU5CTzBGQlEwRkJMRk5CUVZORExHVkJRVlFzUjBGQk1rSXNTVUZCTTBJN08wRkJSVUZFTEZOQlFWTkZMRkZCUVZRc1IwRkJiMElzWjBWQlFWTkJMRkZCUVRkQ08wRkJRMEZHTEZOQlFWTkhMRk5CUVZRc1IwRkJjVUlzVlVGQlUwTXNTMEZCVkN4RlFVRm5RanRCUVVGQkxITkVRVU0xUWtNc2IwSkJSRFJDTEVkQlEwb3NTMEZCUzBNc1QwRkVSQ3hEUVVNMVFrUXNiMEpCUkRSQ096czdRVUZIYmtNc1UwRkJUeXhQUVVGUFJDeExRVUZRTEV0QlFXbENMRkZCUVdwQ0xFZEJRVFJDUVN4TFFVRTFRaXhIUVVGdlEwY3NTMEZCUzBNc1UwRkJUQ3hEUVVGbFlpeGhRVUZoVXl4TFFVRmlMRU5CUVdZc1JVRkJiME1zVlVGQlUwc3NRMEZCVkN4RlFVRlpReXhEUVVGYUxFVkJRV1U3UVVGRE5VWXNVVUZCU1N4UFFVRlBRU3hEUVVGUUxFdEJRV0VzVjBGQmFrSXNSVUZCT0VJN1FVRkROVUlzWVVGQlQwd3NiMEpCUVZBN1FVRkRSRHM3UVVGRlJDeFhRVUZQU3l4RFFVRlFPMEZCUTBRc1IwRk9NRU1zUlVGTmVFTXNTVUZPZDBNc1EwRkJNME03UVVGUFJDeERRVlpFTzBGQlYwRldMRk5CUVZOWExFMUJRVlFzUjBGQmEwSXNWVUZCVTBNc1NVRkJWQ3hGUVVGbFF5eExRVUZtTEVWQlFYTkNPMEZCUTNSRExGTkJRVThzYjBWQlFVdG1MRk5CUVV3c1EwRkJaV0VzVFVGQlppeERRVUZ6UWtjc1NVRkJkRUlzUTBGQk1rSmtMRkZCUVROQ0xFVkJRWEZEV1N4TFFVRkxSeXhQUVVGTUxFTkJRV0VzV1VGQllpeEZRVUV5UWl4SlFVRXpRaXhEUVVGeVF5eEZRVUYxUlVZc1RVRkJUVVVzVDBGQlRpeERRVUZqTEZsQlFXUXNSVUZCTkVJc1NVRkJOVUlzUTBGQmRrVTdRVUZCVUR0QlFVTkVMRU5CUmtRN08wRkJTVThzVTBGQlUzSkNMRkZCUVZRc1EwRkJhMEp6UWl4TlFVRnNRaXhGUVVFd1FrTXNUVUZCTVVJc1JVRkJhME5ZTEU5QlFXeERMRVZCUVRKRE8wRkJRVVVzVTBGQlQwNHNVMEZCVTJ0Q0xFbEJRVlFzUTBGQlkwWXNUVUZCWkN4RlFVRnpRa01zVFVGQmRFSXNSVUZCT0VKWUxFOUJRVGxDTEVOQlFWQTdRVUZCWjBRN08wRkJSWEJITzBGQlEwRTdRVUZEVHl4VFFVRlRXQ3haUVVGVUxFTkJRWE5DZDBJc1IwRkJkRUlzUlVGQk1rSkRMRXRCUVROQ0xFVkJRV3REUXl4blFrRkJiRU1zUlVGQmIwUTdRVUZEZWtSRUxGVkJRVkZCTEZOQlFWTXNSVUZCYWtJN1FVRkRRVU1zY1VKQlFXMUNRU3h2UWtGQmIwSXNSVUZCZGtNN08wRkJSVUVzVFVGQlNVTXNiVU5CUVVvN08wRkJSVUVzVDBGQlMwRXNTVUZCU1N4RFFVRlVMRVZCUVZsQkxFbEJRVWxHTEUxQlFVMUhMRTFCUVhSQ0xFVkJRVGhDUkN4TFFVRkxMRU5CUVc1RExFVkJRWE5ETzBGQlEzQkRMRkZCUVVsR0xFMUJRVTFGTEVOQlFVNHNUVUZCWVVnc1IwRkJha0lzUlVGQmMwSTdRVUZEY0VJc1lVRkJUMFVzYVVKQlFXbENReXhEUVVGcVFpeERRVUZRTzBGQlEwUTdRVUZEUmpzN1FVRkZSQ3hOUVVGSlJTeHJSRUZCU2pzN1FVRkZRU3hOUVVGSkxIRkNRVUZ4UWpWQ0xIZENRVUYzUW10Q0xFbEJRWGhDTEVOQlFUWkNTeXhIUVVFM1FpeERRVUY2UWl4RlFVRTBSRHRCUVVNeFJFTXNWVUZCVFVzc1NVRkJUaXhEUVVGWFRpeEhRVUZZTzBGQlEwRkxMSFZDUVVGdFFpeEpRVUZKUlN4TFFVRktMRU5CUVZWUUxFbEJRVWxKTEUxQlFXUXNRMEZCYmtJN1FVRkRRVVlzY1VKQlFXbENTU3hKUVVGcVFpeERRVUZ6UWtRc1owSkJRWFJDTzBGQlEwRXNVMEZCUzBZc1NVRkJTU3hEUVVGVUxFVkJRVmxCTEVsQlFVbElMRWxCUVVsSkxFMUJRWEJDTEVWQlFUUkNSQ3hMUVVGTExFTkJRV3BETEVWQlFXOURPMEZCUTJ4RFJTeDFRa0ZCYVVKR0xFTkJRV3BDTEVsQlFYTkNNMElzWVVGQllYZENMRWxCUVVsSExFTkJRVW9zUTBGQllpeEZRVUZ4UWtZc1MwRkJja0lzUlVGQk5FSkRMR2RDUVVFMVFpeERRVUYwUWp0QlFVTkVPMEZCUTBSRUxGVkJRVTFQTEVkQlFVNDdRVUZEUVU0c2NVSkJRV2xDVFN4SFFVRnFRanRCUVVOQkxGZEJRVTlJTEdkQ1FVRlFPMEZCUTBRN08wRkJSVVFzVFVGQlNVd3NUMEZCVDBFc1NVRkJTVk1zVFVGQlppeEZRVUYxUWp0QlFVTnlRbFFzVlVGQlRVRXNTVUZCU1ZNc1RVRkJTaXhGUVVGT08wRkJRMFE3TzBGQlJVUXNUVUZCU1N4NVJFRkJUMVFzUjBGQlVDeDVRMEZCVDBFc1IwRkJVQ3hQUVVGbExGRkJRV1lzU1VGQk1rSkJMRkZCUVZFc1NVRkJka01zUlVGQk5rTTdRVUZETTBORExGVkJRVTFMTEVsQlFVNHNRMEZCVjA0c1IwRkJXRHRCUVVOQlN5eDFRa0ZCYlVJc1JVRkJia0k3UVVGRFFVZ3NjVUpCUVdsQ1NTeEpRVUZxUWl4RFFVRnpRa1FzWjBKQlFYUkNPMEZCUTBFc1VVRkJTVXNzWVVGQllTeEZRVUZxUWp0QlFVRkJMRkZCUTBsRExIRkRRVVJLTzBGQlJVRXNVMEZCUzBFc1IwRkJUQ3hKUVVGWldDeEhRVUZhTEVWQlFXbENPMEZCUTJZN1FVRkRRU3hWUVVGSlFTeEpRVUZKV1N4alFVRktMRU5CUVcxQ1JDeEhRVUZ1UWl4RFFVRktMRVZCUVRaQ08wRkJRek5DUkN4dFFrRkJWMG9zU1VGQldDeERRVUZuUWtzc1IwRkJhRUk3UVVGRFJEdEJRVU5HTzBGQlEwUkVMR1ZCUVZkSExFbEJRVmc3UVVGRFFTeFRRVUZMVml4SlFVRkpMRU5CUVZRc1JVRkJXVUVzU1VGQlNVOHNWMEZCVjA0c1RVRkJNMElzUlVGQmJVTkVMRXRCUVVzc1EwRkJlRU1zUlVGQk1rTTdRVUZEZWtOUkxGbEJRVTFFTEZkQlFWZFFMRU5CUVZnc1EwRkJUanRCUVVOQlJTeDFRa0ZCYVVKTkxFZEJRV3BDTEVsQlFYZENia01zWVVGQllYZENMRWxCUVVsWExFZEJRVW9zUTBGQllpeEZRVUYxUWxZc1MwRkJka0lzUlVGQk9FSkRMR2RDUVVFNVFpeERRVUY0UWp0QlFVTkVPMEZCUTBSRUxGVkJRVTFQTEVkQlFVNDdRVUZEUVU0c2NVSkJRV2xDVFN4SFFVRnFRanRCUVVORUxFZEJia0pFTEUxQmJVSlBPMEZCUTB4SUxIVkNRVUZ0UWt3c1IwRkJia0k3UVVGRFJEdEJRVU5FTEZOQlFVOUxMR2RDUVVGUU8wRkJRMFFpTENKbWFXeGxJam9pYW5OdmJpNXFjeUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSW1sdGNHOXlkQ0JFYVdabUlHWnliMjBnSnk0dlltRnpaU2M3WEc1cGJYQnZjblFnZTJ4cGJtVkVhV1ptZlNCbWNtOXRJQ2N1TDJ4cGJtVW5PMXh1WEc1amIyNXpkQ0J2WW1wbFkzUlFjbTkwYjNSNWNHVlViMU4wY21sdVp5QTlJRTlpYW1WamRDNXdjbTkwYjNSNWNHVXVkRzlUZEhKcGJtYzdYRzVjYmx4dVpYaHdiM0owSUdOdmJuTjBJR3B6YjI1RWFXWm1JRDBnYm1WM0lFUnBabVlvS1R0Y2JpOHZJRVJwYzJOeWFXMXBibUYwWlNCaVpYUjNaV1Z1SUhSM2J5QnNhVzVsY3lCdlppQndjbVYwZEhrdGNISnBiblJsWkN3Z2MyVnlhV0ZzYVhwbFpDQktVMDlPSUhkb1pYSmxJRzl1WlNCdlppQjBhR1Z0SUdoaGN5QmhYRzR2THlCa1lXNW5iR2x1WnlCamIyMXRZU0JoYm1RZ2RHaGxJRzkwYUdWeUlHUnZaWE51SjNRdUlGUjFjbTV6SUc5MWRDQnBibU5zZFdScGJtY2dkR2hsSUdSaGJtZHNhVzVuSUdOdmJXMWhJSGxwWld4a2N5QjBhR1VnYm1salpYTjBJRzkxZEhCMWREcGNibXB6YjI1RWFXWm1MblZ6WlV4dmJtZGxjM1JVYjJ0bGJpQTlJSFJ5ZFdVN1hHNWNibXB6YjI1RWFXWm1MblJ2YTJWdWFYcGxJRDBnYkdsdVpVUnBabVl1ZEc5clpXNXBlbVU3WEc1cWMyOXVSR2xtWmk1allYTjBTVzV3ZFhRZ1BTQm1kVzVqZEdsdmJpaDJZV3gxWlNrZ2UxeHVJQ0JqYjI1emRDQjdkVzVrWldacGJtVmtVbVZ3YkdGalpXMWxiblI5SUQwZ2RHaHBjeTV2Y0hScGIyNXpPMXh1WEc0Z0lISmxkSFZ5YmlCMGVYQmxiMllnZG1Gc2RXVWdQVDA5SUNkemRISnBibWNuSUQ4Z2RtRnNkV1VnT2lCS1UwOU9Mbk4wY21sdVoybG1lU2hqWVc1dmJtbGpZV3hwZW1Vb2RtRnNkV1VwTENCbWRXNWpkR2x2YmlockxDQjJLU0I3WEc0Z0lDQWdhV1lnS0hSNWNHVnZaaUIySUQwOVBTQW5kVzVrWldacGJtVmtKeWtnZTF4dUlDQWdJQ0FnY21WMGRYSnVJSFZ1WkdWbWFXNWxaRkpsY0d4aFkyVnRaVzUwTzF4dUlDQWdJSDFjYmx4dUlDQWdJSEpsZEhWeWJpQjJPMXh1SUNCOUxDQW5JQ0FuS1R0Y2JuMDdYRzVxYzI5dVJHbG1aaTVsY1hWaGJITWdQU0JtZFc1amRHbHZiaWhzWldaMExDQnlhV2RvZENrZ2UxeHVJQ0J5WlhSMWNtNGdSR2xtWmk1d2NtOTBiM1I1Y0dVdVpYRjFZV3h6TG1OaGJHd29hbk52YmtScFptWXNJR3hsWm5RdWNtVndiR0ZqWlNndkxDaGJYRnh5WEZ4dVhTa3ZaeXdnSnlReEp5a3NJSEpwWjJoMExuSmxjR3hoWTJVb0x5d29XMXhjY2x4Y2JsMHBMMmNzSUNja01TY3BLVHRjYm4wN1hHNWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQmthV1ptU25OdmJpaHZiR1JQWW1vc0lHNWxkMDlpYWl3Z2IzQjBhVzl1Y3lrZ2V5QnlaWFIxY200Z2FuTnZia1JwWm1ZdVpHbG1aaWh2YkdSUFltb3NJRzVsZDA5aWFpd2diM0IwYVc5dWN5azdJSDFjYmx4dUx5OGdWR2hwY3lCbWRXNWpkR2x2YmlCb1lXNWtiR1Z6SUhSb1pTQndjbVZ6Wlc1alpTQnZaaUJqYVhKamRXeGhjaUJ5WldabGNtVnVZMlZ6SUdKNUlHSmhhV3hwYm1jZ2IzVjBJSGRvWlc0Z1pXNWpiM1Z1ZEdWeWFXNW5JR0Z1WEc0dkx5QnZZbXBsWTNRZ2RHaGhkQ0JwY3lCaGJISmxZV1I1SUc5dUlIUm9aU0JjSW5OMFlXTnJYQ0lnYjJZZ2FYUmxiWE1nWW1WcGJtY2djSEp2WTJWemMyVmtMbHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR05oYm05dWFXTmhiR2w2WlNodlltb3NJSE4wWVdOckxDQnlaWEJzWVdObGJXVnVkRk4wWVdOcktTQjdYRzRnSUhOMFlXTnJJRDBnYzNSaFkyc2dmSHdnVzEwN1hHNGdJSEpsY0d4aFkyVnRaVzUwVTNSaFkyc2dQU0J5WlhCc1lXTmxiV1Z1ZEZOMFlXTnJJSHg4SUZ0ZE8xeHVYRzRnSUd4bGRDQnBPMXh1WEc0Z0lHWnZjaUFvYVNBOUlEQTdJR2tnUENCemRHRmpheTVzWlc1bmRHZzdJR2tnS3owZ01Ta2dlMXh1SUNBZ0lHbG1JQ2h6ZEdGamExdHBYU0E5UFQwZ2IySnFLU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdjbVZ3YkdGalpXMWxiblJUZEdGamExdHBYVHRjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0JzWlhRZ1kyRnViMjVwWTJGc2FYcGxaRTlpYWp0Y2JseHVJQ0JwWmlBb0oxdHZZbXBsWTNRZ1FYSnlZWGxkSnlBOVBUMGdiMkpxWldOMFVISnZkRzkwZVhCbFZHOVRkSEpwYm1jdVkyRnNiQ2h2WW1vcEtTQjdYRzRnSUNBZ2MzUmhZMnN1Y0hWemFDaHZZbW9wTzF4dUlDQWdJR05oYm05dWFXTmhiR2w2WldSUFltb2dQU0J1WlhjZ1FYSnlZWGtvYjJKcUxteGxibWQwYUNrN1hHNGdJQ0FnY21Wd2JHRmpaVzFsYm5SVGRHRmpheTV3ZFhOb0tHTmhibTl1YVdOaGJHbDZaV1JQWW1vcE8xeHVJQ0FnSUdadmNpQW9hU0E5SURBN0lHa2dQQ0J2WW1vdWJHVnVaM1JvT3lCcElDczlJREVwSUh0Y2JpQWdJQ0FnSUdOaGJtOXVhV05oYkdsNlpXUlBZbXBiYVYwZ1BTQmpZVzV2Ym1sallXeHBlbVVvYjJKcVcybGRMQ0J6ZEdGamF5d2djbVZ3YkdGalpXMWxiblJUZEdGamF5azdYRzRnSUNBZ2ZWeHVJQ0FnSUhOMFlXTnJMbkJ2Y0NncE8xeHVJQ0FnSUhKbGNHeGhZMlZ0Wlc1MFUzUmhZMnN1Y0c5d0tDazdYRzRnSUNBZ2NtVjBkWEp1SUdOaGJtOXVhV05oYkdsNlpXUlBZbW83WEc0Z0lIMWNibHh1SUNCcFppQW9iMkpxSUNZbUlHOWlhaTUwYjBwVFQwNHBJSHRjYmlBZ0lDQnZZbW9nUFNCdlltb3VkRzlLVTA5T0tDazdYRzRnSUgxY2JseHVJQ0JwWmlBb2RIbHdaVzltSUc5aWFpQTlQVDBnSjI5aWFtVmpkQ2NnSmlZZ2IySnFJQ0U5UFNCdWRXeHNLU0I3WEc0Z0lDQWdjM1JoWTJzdWNIVnphQ2h2WW1vcE8xeHVJQ0FnSUdOaGJtOXVhV05oYkdsNlpXUlBZbW9nUFNCN2ZUdGNiaUFnSUNCeVpYQnNZV05sYldWdWRGTjBZV05yTG5CMWMyZ29ZMkZ1YjI1cFkyRnNhWHBsWkU5aWFpazdYRzRnSUNBZ2JHVjBJSE52Y25SbFpFdGxlWE1nUFNCYlhTeGNiaUFnSUNBZ0lDQWdhMlY1TzF4dUlDQWdJR1p2Y2lBb2EyVjVJR2x1SUc5aWFpa2dlMXh1SUNBZ0lDQWdMeW9nYVhOMFlXNWlkV3dnYVdkdWIzSmxJR1ZzYzJVZ0tpOWNiaUFnSUNBZ0lHbG1JQ2h2WW1vdWFHRnpUM2R1VUhKdmNHVnlkSGtvYTJWNUtTa2dlMXh1SUNBZ0lDQWdJQ0J6YjNKMFpXUkxaWGx6TG5CMWMyZ29hMlY1S1R0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc0Z0lDQWdjMjl5ZEdWa1MyVjVjeTV6YjNKMEtDazdYRzRnSUNBZ1ptOXlJQ2hwSUQwZ01Ec2dhU0E4SUhOdmNuUmxaRXRsZVhNdWJHVnVaM1JvT3lCcElDczlJREVwSUh0Y2JpQWdJQ0FnSUd0bGVTQTlJSE52Y25SbFpFdGxlWE5iYVYwN1hHNGdJQ0FnSUNCallXNXZibWxqWVd4cGVtVmtUMkpxVzJ0bGVWMGdQU0JqWVc1dmJtbGpZV3hwZW1Vb2IySnFXMnRsZVYwc0lITjBZV05yTENCeVpYQnNZV05sYldWdWRGTjBZV05yS1R0Y2JpQWdJQ0I5WEc0Z0lDQWdjM1JoWTJzdWNHOXdLQ2s3WEc0Z0lDQWdjbVZ3YkdGalpXMWxiblJUZEdGamF5NXdiM0FvS1R0Y2JpQWdmU0JsYkhObElIdGNiaUFnSUNCallXNXZibWxqWVd4cGVtVmtUMkpxSUQwZ2IySnFPMXh1SUNCOVhHNGdJSEpsZEhWeWJpQmpZVzV2Ym1sallXeHBlbVZrVDJKcU8xeHVmVnh1SWwxOVxuXG5cbi8qKiovIH0pLFxuLyogOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8ndXNlIHN0cmljdCc7XG5cblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0cy5hcnJheURpZmYgPSB1bmRlZmluZWQ7XG5cdGV4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZkFycmF5cyA9IGRpZmZBcnJheXM7XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fYmFzZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciBfYmFzZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9iYXNlKTtcblxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgZW5kKi92YXIgYXJyYXlEaWZmID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovYXJyYXlEaWZmID0gbmV3IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fYmFzZTJbJ2RlZmF1bHQnXSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLygpO1xuXHRhcnJheURpZmYudG9rZW5pemUgPSBhcnJheURpZmYuam9pbiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgIHJldHVybiB2YWx1ZS5zbGljZSgpO1xuXHR9O1xuXHRhcnJheURpZmYucmVtb3ZlRW1wdHkgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICByZXR1cm4gdmFsdWU7XG5cdH07XG5cblx0ZnVuY3Rpb24gZGlmZkFycmF5cyhvbGRBcnIsIG5ld0FyciwgY2FsbGJhY2spIHtcblx0ICByZXR1cm4gYXJyYXlEaWZmLmRpZmYob2xkQXJyLCBuZXdBcnIsIGNhbGxiYWNrKTtcblx0fVxuXHQvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTlrYVdabUwyRnljbUY1TG1weklsMHNJbTVoYldWeklqcGJJbVJwWm1aQmNuSmhlWE1pTENKaGNuSmhlVVJwWm1ZaUxDSjBiMnRsYm1sNlpTSXNJbXB2YVc0aUxDSjJZV3gxWlNJc0luTnNhV05sSWl3aWNtVnRiM1psUlcxd2RIa2lMQ0p2YkdSQmNuSWlMQ0p1WlhkQmNuSWlMQ0pqWVd4c1ltRmpheUlzSW1ScFptWWlYU3dpYldGd2NHbHVaM01pT2lJN096czdaME5CVldkQ1FTeFZMRWRCUVVGQkxGVTdPMEZCVm1oQ096czdPenM3ZFVKQlJVOHNTVUZCVFVNc2FVWkJRVmtzZDBWQlFXeENPMEZCUTFCQkxGVkJRVlZETEZGQlFWWXNSMEZCY1VKRUxGVkJRVlZGTEVsQlFWWXNSMEZCYVVJc1ZVRkJVME1zUzBGQlZDeEZRVUZuUWp0QlFVTndSQ3hUUVVGUFFTeE5RVUZOUXl4TFFVRk9MRVZCUVZBN1FVRkRSQ3hEUVVaRU8wRkJSMEZLTEZWQlFWVkxMRmRCUVZZc1IwRkJkMElzVlVGQlUwWXNTMEZCVkN4RlFVRm5RanRCUVVOMFF5eFRRVUZQUVN4TFFVRlFPMEZCUTBRc1EwRkdSRHM3UVVGSlR5eFRRVUZUU2l4VlFVRlVMRU5CUVc5Q1R5eE5RVUZ3UWl4RlFVRTBRa01zVFVGQk5VSXNSVUZCYjBORExGRkJRWEJETEVWQlFUaERPMEZCUVVVc1UwRkJUMUlzVlVGQlZWTXNTVUZCVml4RFFVRmxTQ3hOUVVGbUxFVkJRWFZDUXl4TlFVRjJRaXhGUVVFclFrTXNVVUZCTDBJc1EwRkJVRHRCUVVGclJDSXNJbVpwYkdVaU9pSmhjbkpoZVM1cWN5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbWx0Y0c5eWRDQkVhV1ptSUdaeWIyMGdKeTR2WW1GelpTYzdYRzVjYm1WNGNHOXlkQ0JqYjI1emRDQmhjbkpoZVVScFptWWdQU0J1WlhjZ1JHbG1aaWdwTzF4dVlYSnlZWGxFYVdabUxuUnZhMlZ1YVhwbElEMGdZWEp5WVhsRWFXWm1MbXB2YVc0Z1BTQm1kVzVqZEdsdmJpaDJZV3gxWlNrZ2UxeHVJQ0J5WlhSMWNtNGdkbUZzZFdVdWMyeHBZMlVvS1R0Y2JuMDdYRzVoY25KaGVVUnBabVl1Y21WdGIzWmxSVzF3ZEhrZ1BTQm1kVzVqZEdsdmJpaDJZV3gxWlNrZ2UxeHVJQ0J5WlhSMWNtNGdkbUZzZFdVN1hHNTlPMXh1WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWkdsbVprRnljbUY1Y3lodmJHUkJjbklzSUc1bGQwRnljaXdnWTJGc2JHSmhZMnNwSUhzZ2NtVjBkWEp1SUdGeWNtRjVSR2xtWmk1a2FXWm1LRzlzWkVGeWNpd2dibVYzUVhKeUxDQmpZV3hzWW1GamF5azdJSDFjYmlKZGZRPT1cblxuXG4vKioqLyB9KSxcbi8qIDEwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyd1c2Ugc3RyaWN0JztcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2FwcGx5UGF0Y2ggPSBhcHBseVBhdGNoO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9hcHBseVBhdGNoZXMgPSBhcHBseVBhdGNoZXM7XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fcGFyc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19kaXN0YW5jZUl0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMikgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciBfZGlzdGFuY2VJdGVyYXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kaXN0YW5jZUl0ZXJhdG9yKTtcblxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9mdW5jdGlvbiBhcHBseVBhdGNoKHNvdXJjZSwgdW5pRGlmZikge1xuXHQgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9vcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuXHQgIGlmICh0eXBlb2YgdW5pRGlmZiA9PT0gJ3N0cmluZycpIHtcblx0ICAgIHVuaURpZmYgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKDAsIF9wYXJzZS5wYXJzZVBhdGNoKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyh1bmlEaWZmKTtcblx0ICB9XG5cblx0ICBpZiAoQXJyYXkuaXNBcnJheSh1bmlEaWZmKSkge1xuXHQgICAgaWYgKHVuaURpZmYubGVuZ3RoID4gMSkge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FwcGx5UGF0Y2ggb25seSB3b3JrcyB3aXRoIGEgc2luZ2xlIGlucHV0LicpO1xuXHQgICAgfVxuXG5cdCAgICB1bmlEaWZmID0gdW5pRGlmZlswXTtcblx0ICB9XG5cblx0ICAvLyBBcHBseSB0aGUgZGlmZiB0byB0aGUgaW5wdXRcblx0ICB2YXIgbGluZXMgPSBzb3VyY2Uuc3BsaXQoL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdLyksXG5cdCAgICAgIGRlbGltaXRlcnMgPSBzb3VyY2UubWF0Y2goL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdL2cpIHx8IFtdLFxuXHQgICAgICBodW5rcyA9IHVuaURpZmYuaHVua3MsXG5cdCAgICAgIGNvbXBhcmVMaW5lID0gb3B0aW9ucy5jb21wYXJlTGluZSB8fCBmdW5jdGlvbiAobGluZU51bWJlciwgbGluZSwgb3BlcmF0aW9uLCBwYXRjaENvbnRlbnQpIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki97XG5cdCAgICByZXR1cm4gKC8qaXN0YW5idWwgaWdub3JlIGVuZCovbGluZSA9PT0gcGF0Y2hDb250ZW50XG5cdCAgICApO1xuXHQgIH0sXG5cdCAgICAgIGVycm9yQ291bnQgPSAwLFxuXHQgICAgICBmdXp6RmFjdG9yID0gb3B0aW9ucy5mdXp6RmFjdG9yIHx8IDAsXG5cdCAgICAgIG1pbkxpbmUgPSAwLFxuXHQgICAgICBvZmZzZXQgPSAwLFxuXHQgICAgICByZW1vdmVFT0ZOTCA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92b2lkIDAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8sXG5cdCAgICAgIGFkZEVPRk5MID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZvaWQgMCAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQgIC8qKlxuXHQgICAqIENoZWNrcyBpZiB0aGUgaHVuayBleGFjdGx5IGZpdHMgb24gdGhlIHByb3ZpZGVkIGxvY2F0aW9uXG5cdCAgICovXG5cdCAgZnVuY3Rpb24gaHVua0ZpdHMoaHVuaywgdG9Qb3MpIHtcblx0ICAgIGZvciAodmFyIGogPSAwOyBqIDwgaHVuay5saW5lcy5sZW5ndGg7IGorKykge1xuXHQgICAgICB2YXIgbGluZSA9IGh1bmsubGluZXNbal0sXG5cdCAgICAgICAgICBvcGVyYXRpb24gPSBsaW5lWzBdLFxuXHQgICAgICAgICAgY29udGVudCA9IGxpbmUuc3Vic3RyKDEpO1xuXG5cdCAgICAgIGlmIChvcGVyYXRpb24gPT09ICcgJyB8fCBvcGVyYXRpb24gPT09ICctJykge1xuXHQgICAgICAgIC8vIENvbnRleHQgc2FuaXR5IGNoZWNrXG5cdCAgICAgICAgaWYgKCFjb21wYXJlTGluZSh0b1BvcyArIDEsIGxpbmVzW3RvUG9zXSwgb3BlcmF0aW9uLCBjb250ZW50KSkge1xuXHQgICAgICAgICAgZXJyb3JDb3VudCsrO1xuXG5cdCAgICAgICAgICBpZiAoZXJyb3JDb3VudCA+IGZ1enpGYWN0b3IpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB0b1BvcysrO1xuXHQgICAgICB9XG5cdCAgICB9XG5cblx0ICAgIHJldHVybiB0cnVlO1xuXHQgIH1cblxuXHQgIC8vIFNlYXJjaCBiZXN0IGZpdCBvZmZzZXRzIGZvciBlYWNoIGh1bmsgYmFzZWQgb24gdGhlIHByZXZpb3VzIG9uZXNcblx0ICBmb3IgKHZhciBpID0gMDsgaSA8IGh1bmtzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICB2YXIgaHVuayA9IGh1bmtzW2ldLFxuXHQgICAgICAgIG1heExpbmUgPSBsaW5lcy5sZW5ndGggLSBodW5rLm9sZExpbmVzLFxuXHQgICAgICAgIGxvY2FsT2Zmc2V0ID0gMCxcblx0ICAgICAgICB0b1BvcyA9IG9mZnNldCArIGh1bmsub2xkU3RhcnQgLSAxO1xuXG5cdCAgICB2YXIgaXRlcmF0b3IgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKDAsIF9kaXN0YW5jZUl0ZXJhdG9yMlsnZGVmYXVsdCddKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyh0b1BvcywgbWluTGluZSwgbWF4TGluZSk7XG5cblx0ICAgIGZvciAoOyBsb2NhbE9mZnNldCAhPT0gdW5kZWZpbmVkOyBsb2NhbE9mZnNldCA9IGl0ZXJhdG9yKCkpIHtcblx0ICAgICAgaWYgKGh1bmtGaXRzKGh1bmssIHRvUG9zICsgbG9jYWxPZmZzZXQpKSB7XG5cdCAgICAgICAgaHVuay5vZmZzZXQgPSBvZmZzZXQgKz0gbG9jYWxPZmZzZXQ7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIH1cblx0ICAgIH1cblxuXHQgICAgaWYgKGxvY2FsT2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfVxuXG5cdCAgICAvLyBTZXQgbG93ZXIgdGV4dCBsaW1pdCB0byBlbmQgb2YgdGhlIGN1cnJlbnQgaHVuaywgc28gbmV4dCBvbmVzIGRvbid0IHRyeVxuXHQgICAgLy8gdG8gZml0IG92ZXIgYWxyZWFkeSBwYXRjaGVkIHRleHRcblx0ICAgIG1pbkxpbmUgPSBodW5rLm9mZnNldCArIGh1bmsub2xkU3RhcnQgKyBodW5rLm9sZExpbmVzO1xuXHQgIH1cblxuXHQgIC8vIEFwcGx5IHBhdGNoIGh1bmtzXG5cdCAgdmFyIGRpZmZPZmZzZXQgPSAwO1xuXHQgIGZvciAodmFyIF9pID0gMDsgX2kgPCBodW5rcy5sZW5ndGg7IF9pKyspIHtcblx0ICAgIHZhciBfaHVuayA9IGh1bmtzW19pXSxcblx0ICAgICAgICBfdG9Qb3MgPSBfaHVuay5vbGRTdGFydCArIF9odW5rLm9mZnNldCArIGRpZmZPZmZzZXQgLSAxO1xuXHQgICAgZGlmZk9mZnNldCArPSBfaHVuay5uZXdMaW5lcyAtIF9odW5rLm9sZExpbmVzO1xuXG5cdCAgICBpZiAoX3RvUG9zIDwgMCkge1xuXHQgICAgICAvLyBDcmVhdGluZyBhIG5ldyBmaWxlXG5cdCAgICAgIF90b1BvcyA9IDA7XG5cdCAgICB9XG5cblx0ICAgIGZvciAodmFyIGogPSAwOyBqIDwgX2h1bmsubGluZXMubGVuZ3RoOyBqKyspIHtcblx0ICAgICAgdmFyIGxpbmUgPSBfaHVuay5saW5lc1tqXSxcblx0ICAgICAgICAgIG9wZXJhdGlvbiA9IGxpbmVbMF0sXG5cdCAgICAgICAgICBjb250ZW50ID0gbGluZS5zdWJzdHIoMSksXG5cdCAgICAgICAgICBkZWxpbWl0ZXIgPSBfaHVuay5saW5lZGVsaW1pdGVyc1tqXTtcblxuXHQgICAgICBpZiAob3BlcmF0aW9uID09PSAnICcpIHtcblx0ICAgICAgICBfdG9Qb3MrKztcblx0ICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICctJykge1xuXHQgICAgICAgIGxpbmVzLnNwbGljZShfdG9Qb3MsIDEpO1xuXHQgICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKF90b1BvcywgMSk7XG5cdCAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0ICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICcrJykge1xuXHQgICAgICAgIGxpbmVzLnNwbGljZShfdG9Qb3MsIDAsIGNvbnRlbnQpO1xuXHQgICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKF90b1BvcywgMCwgZGVsaW1pdGVyKTtcblx0ICAgICAgICBfdG9Qb3MrKztcblx0ICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICdcXFxcJykge1xuXHQgICAgICAgIHZhciBwcmV2aW91c09wZXJhdGlvbiA9IF9odW5rLmxpbmVzW2ogLSAxXSA/IF9odW5rLmxpbmVzW2ogLSAxXVswXSA6IG51bGw7XG5cdCAgICAgICAgaWYgKHByZXZpb3VzT3BlcmF0aW9uID09PSAnKycpIHtcblx0ICAgICAgICAgIHJlbW92ZUVPRk5MID0gdHJ1ZTtcblx0ICAgICAgICB9IGVsc2UgaWYgKHByZXZpb3VzT3BlcmF0aW9uID09PSAnLScpIHtcblx0ICAgICAgICAgIGFkZEVPRk5MID0gdHJ1ZTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9XG5cblx0ICAvLyBIYW5kbGUgRU9GTkwgaW5zZXJ0aW9uL3JlbW92YWxcblx0ICBpZiAocmVtb3ZlRU9GTkwpIHtcblx0ICAgIHdoaWxlICghbGluZXNbbGluZXMubGVuZ3RoIC0gMV0pIHtcblx0ICAgICAgbGluZXMucG9wKCk7XG5cdCAgICAgIGRlbGltaXRlcnMucG9wKCk7XG5cdCAgICB9XG5cdCAgfSBlbHNlIGlmIChhZGRFT0ZOTCkge1xuXHQgICAgbGluZXMucHVzaCgnJyk7XG5cdCAgICBkZWxpbWl0ZXJzLnB1c2goJ1xcbicpO1xuXHQgIH1cblx0ICBmb3IgKHZhciBfayA9IDA7IF9rIDwgbGluZXMubGVuZ3RoIC0gMTsgX2srKykge1xuXHQgICAgbGluZXNbX2tdID0gbGluZXNbX2tdICsgZGVsaW1pdGVyc1tfa107XG5cdCAgfVxuXHQgIHJldHVybiBsaW5lcy5qb2luKCcnKTtcblx0fVxuXG5cdC8vIFdyYXBwZXIgdGhhdCBzdXBwb3J0cyBtdWx0aXBsZSBmaWxlIHBhdGNoZXMgdmlhIGNhbGxiYWNrcy5cblx0ZnVuY3Rpb24gYXBwbHlQYXRjaGVzKHVuaURpZmYsIG9wdGlvbnMpIHtcblx0ICBpZiAodHlwZW9mIHVuaURpZmYgPT09ICdzdHJpbmcnKSB7XG5cdCAgICB1bmlEaWZmID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLygwLCBfcGFyc2UucGFyc2VQYXRjaCkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8odW5pRGlmZik7XG5cdCAgfVxuXG5cdCAgdmFyIGN1cnJlbnRJbmRleCA9IDA7XG5cdCAgZnVuY3Rpb24gcHJvY2Vzc0luZGV4KCkge1xuXHQgICAgdmFyIGluZGV4ID0gdW5pRGlmZltjdXJyZW50SW5kZXgrK107XG5cdCAgICBpZiAoIWluZGV4KSB7XG5cdCAgICAgIHJldHVybiBvcHRpb25zLmNvbXBsZXRlKCk7XG5cdCAgICB9XG5cblx0ICAgIG9wdGlvbnMubG9hZEZpbGUoaW5kZXgsIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcblx0ICAgICAgaWYgKGVycikge1xuXHQgICAgICAgIHJldHVybiBvcHRpb25zLmNvbXBsZXRlKGVycik7XG5cdCAgICAgIH1cblxuXHQgICAgICB2YXIgdXBkYXRlZENvbnRlbnQgPSBhcHBseVBhdGNoKGRhdGEsIGluZGV4LCBvcHRpb25zKTtcblx0ICAgICAgb3B0aW9ucy5wYXRjaGVkKGluZGV4LCB1cGRhdGVkQ29udGVudCwgZnVuY3Rpb24gKGVycikge1xuXHQgICAgICAgIGlmIChlcnIpIHtcblx0ICAgICAgICAgIHJldHVybiBvcHRpb25zLmNvbXBsZXRlKGVycik7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgcHJvY2Vzc0luZGV4KCk7XG5cdCAgICAgIH0pO1xuXHQgICAgfSk7XG5cdCAgfVxuXHQgIHByb2Nlc3NJbmRleCgpO1xuXHR9XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OXdZWFJqYUM5aGNIQnNlUzVxY3lKZExDSnVZVzFsY3lJNld5SmhjSEJzZVZCaGRHTm9JaXdpWVhCd2JIbFFZWFJqYUdWeklpd2ljMjkxY21ObElpd2lkVzVwUkdsbVppSXNJbTl3ZEdsdmJuTWlMQ0pCY25KaGVTSXNJbWx6UVhKeVlYa2lMQ0pzWlc1bmRHZ2lMQ0pGY25KdmNpSXNJbXhwYm1Weklpd2ljM0JzYVhRaUxDSmtaV3hwYldsMFpYSnpJaXdpYldGMFkyZ2lMQ0pvZFc1cmN5SXNJbU52YlhCaGNtVk1hVzVsSWl3aWJHbHVaVTUxYldKbGNpSXNJbXhwYm1VaUxDSnZjR1Z5WVhScGIyNGlMQ0p3WVhSamFFTnZiblJsYm5RaUxDSmxjbkp2Y2tOdmRXNTBJaXdpWm5WNmVrWmhZM1J2Y2lJc0ltMXBia3hwYm1VaUxDSnZabVp6WlhRaUxDSnlaVzF2ZG1WRlQwWk9UQ0lzSW1Ga1pFVlBSazVNSWl3aWFIVnVhMFpwZEhNaUxDSm9kVzVySWl3aWRHOVFiM01pTENKcUlpd2lZMjl1ZEdWdWRDSXNJbk4xWW5OMGNpSXNJbWtpTENKdFlYaE1hVzVsSWl3aWIyeGtUR2x1WlhNaUxDSnNiMk5oYkU5bVpuTmxkQ0lzSW05c1pGTjBZWEowSWl3aWFYUmxjbUYwYjNJaUxDSjFibVJsWm1sdVpXUWlMQ0prYVdabVQyWm1jMlYwSWl3aWJtVjNUR2x1WlhNaUxDSmtaV3hwYldsMFpYSWlMQ0pzYVc1bFpHVnNhVzFwZEdWeWN5SXNJbk53YkdsalpTSXNJbkJ5WlhacGIzVnpUM0JsY21GMGFXOXVJaXdpY0c5d0lpd2ljSFZ6YUNJc0lsOXJJaXdpYW05cGJpSXNJbU4xY25KbGJuUkpibVJsZUNJc0luQnliMk5sYzNOSmJtUmxlQ0lzSW1sdVpHVjRJaXdpWTI5dGNHeGxkR1VpTENKc2IyRmtSbWxzWlNJc0ltVnljaUlzSW1SaGRHRWlMQ0oxY0dSaGRHVmtRMjl1ZEdWdWRDSXNJbkJoZEdOb1pXUWlYU3dpYldGd2NHbHVaM01pT2lJN096dG5RMEZIWjBKQkxGVXNSMEZCUVVFc1ZUdDVSRUZ2U1VGRExGa3NSMEZCUVVFc1dUczdRVUYyU1doQ096dEJRVU5CT3pzN096czdkVUpCUlU4c1UwRkJVMFFzVlVGQlZDeERRVUZ2UWtVc1RVRkJjRUlzUlVGQk5FSkRMRTlCUVRWQ0xFVkJRVzFFTzBGQlFVRXNjMFJCUVdSRExFOUJRV01zZFVWQlFVb3NSVUZCU1RzN1FVRkRlRVFzVFVGQlNTeFBRVUZQUkN4UFFVRlFMRXRCUVcxQ0xGRkJRWFpDTEVWQlFXbERPMEZCUXk5Q1FTeGpRVUZWTEhkRlFVRlhRU3hQUVVGWUxFTkJRVlk3UVVGRFJEczdRVUZGUkN4TlFVRkpSU3hOUVVGTlF5eFBRVUZPTEVOQlFXTklMRTlCUVdRc1EwRkJTaXhGUVVFMFFqdEJRVU14UWl4UlFVRkpRU3hSUVVGUlNTeE5RVUZTTEVkQlFXbENMRU5CUVhKQ0xFVkJRWGRDTzBGQlEzUkNMRmxCUVUwc1NVRkJTVU1zUzBGQlNpeERRVUZWTERSRFFVRldMRU5CUVU0N1FVRkRSRHM3UVVGRlJFd3NZMEZCVlVFc1VVRkJVU3hEUVVGU0xFTkJRVlk3UVVGRFJEczdRVUZGUkR0QlFVTkJMRTFCUVVsTkxGRkJRVkZRTEU5QlFVOVJMRXRCUVZBc1EwRkJZU3h4UWtGQllpeERRVUZhTzBGQlFVRXNUVUZEU1VNc1lVRkJZVlFzVDBGQlQxVXNTMEZCVUN4RFFVRmhMSE5DUVVGaUxFdEJRWGRETEVWQlJIcEVPMEZCUVVFc1RVRkZTVU1zVVVGQlVWWXNVVUZCVVZVc1MwRkdjRUk3UVVGQlFTeE5RVWxKUXl4alFVRmpWaXhSUVVGUlZTeFhRVUZTTEVsQlFYZENMRlZCUVVORExGVkJRVVFzUlVGQllVTXNTVUZCWWl4RlFVRnRRa01zVTBGQmJrSXNSVUZCT0VKRExGbEJRVGxDTzBGQlFVRXNiVU5CUVN0RFJpeFRRVUZUUlR0QlFVRjRSRHRCUVVGQkxFZEJTakZETzBGQlFVRXNUVUZMU1VNc1lVRkJZU3hEUVV4cVFqdEJRVUZCTEUxQlRVbERMR0ZCUVdGb1FpeFJRVUZSWjBJc1ZVRkJVaXhKUVVGelFpeERRVTUyUXp0QlFVRkJMRTFCVDBsRExGVkJRVlVzUTBGUVpEdEJRVUZCTEUxQlVVbERMRk5CUVZNc1EwRlNZanRCUVVGQkxFMUJWVWxETERaRFFWWktPMEZCUVVFc1RVRlhTVU1zTUVOQldFbzdPMEZCWVVFN096dEJRVWRCTEZkQlFWTkRMRkZCUVZRc1EwRkJhMEpETEVsQlFXeENMRVZCUVhkQ1F5eExRVUY0UWl4RlFVRXJRanRCUVVNM1FpeFRRVUZMTEVsQlFVbERMRWxCUVVrc1EwRkJZaXhGUVVGblFrRXNTVUZCU1VZc1MwRkJTMnBDTEV0QlFVd3NRMEZCVjBZc1RVRkJMMElzUlVGQmRVTnhRaXhIUVVGMlF5eEZRVUUwUXp0QlFVTXhReXhWUVVGSldpeFBRVUZQVlN4TFFVRkxha0lzUzBGQlRDeERRVUZYYlVJc1EwRkJXQ3hEUVVGWU8wRkJRVUVzVlVGRFNWZ3NXVUZCV1VRc1MwRkJTeXhEUVVGTUxFTkJSR2hDTzBGQlFVRXNWVUZGU1dFc1ZVRkJWV0lzUzBGQlMyTXNUVUZCVEN4RFFVRlpMRU5CUVZvc1EwRkdaRHM3UVVGSlFTeFZRVUZKWWl4alFVRmpMRWRCUVdRc1NVRkJjVUpCTEdOQlFXTXNSMEZCZGtNc1JVRkJORU03UVVGRE1VTTdRVUZEUVN4WlFVRkpMRU5CUVVOSUxGbEJRVmxoTEZGQlFWRXNRMEZCY0VJc1JVRkJkVUpzUWl4TlFVRk5hMElzUzBGQlRpeERRVUYyUWl4RlFVRnhRMVlzVTBGQmNrTXNSVUZCWjBSWkxFOUJRV2hFTEVOQlFVd3NSVUZCSzBRN1FVRkROMFJXT3p0QlFVVkJMR05CUVVsQkxHRkJRV0ZETEZWQlFXcENMRVZCUVRaQ08wRkJRek5DTEcxQ1FVRlBMRXRCUVZBN1FVRkRSRHRCUVVOR08wRkJRMFJQTzBGQlEwUTdRVUZEUmpzN1FVRkZSQ3hYUVVGUExFbEJRVkE3UVVGRFJEczdRVUZGUkR0QlFVTkJMRTlCUVVzc1NVRkJTVWtzU1VGQlNTeERRVUZpTEVWQlFXZENRU3hKUVVGSmJFSXNUVUZCVFU0c1RVRkJNVUlzUlVGQmEwTjNRaXhIUVVGc1F5eEZRVUYxUXp0QlFVTnlReXhSUVVGSlRDeFBRVUZQWWl4TlFVRk5hMElzUTBGQlRpeERRVUZZTzBGQlFVRXNVVUZEU1VNc1ZVRkJWWFpDTEUxQlFVMUdMRTFCUVU0c1IwRkJaVzFDTEV0QlFVdFBMRkZCUkd4RE8wRkJRVUVzVVVGRlNVTXNZMEZCWXl4RFFVWnNRanRCUVVGQkxGRkJSMGxRTEZGQlFWRk1MRk5CUVZOSkxFdEJRVXRUTEZGQlFXUXNSMEZCZVVJc1EwRklja003TzBGQlMwRXNVVUZCU1VNc1YwRkJWeXh2UmtGQmFVSlVMRXRCUVdwQ0xFVkJRWGRDVGl4UFFVRjRRaXhGUVVGcFExY3NUMEZCYWtNc1EwRkJaanM3UVVGRlFTeFhRVUZQUlN4blFrRkJaMEpITEZOQlFYWkNMRVZCUVd0RFNDeGpRVUZqUlN4VlFVRm9SQ3hGUVVFMFJEdEJRVU14UkN4VlFVRkpXQ3hUUVVGVFF5eEpRVUZVTEVWQlFXVkRMRkZCUVZGUExGZEJRWFpDTEVOQlFVb3NSVUZCZVVNN1FVRkRka05TTEdGQlFVdEtMRTFCUVV3c1IwRkJZMEVzVlVGQlZWa3NWMEZCZUVJN1FVRkRRVHRCUVVORU8wRkJRMFk3TzBGQlJVUXNVVUZCU1VFc1owSkJRV2RDUnl4VFFVRndRaXhGUVVFclFqdEJRVU0zUWl4aFFVRlBMRXRCUVZBN1FVRkRSRHM3UVVGRlJEdEJRVU5CTzBGQlEwRm9RaXhqUVVGVlN5eExRVUZMU2l4TlFVRk1MRWRCUVdOSkxFdEJRVXRUTEZGQlFXNUNMRWRCUVRoQ1ZDeExRVUZMVHl4UlFVRTNRenRCUVVORU96dEJRVVZFTzBGQlEwRXNUVUZCU1Vzc1lVRkJZU3hEUVVGcVFqdEJRVU5CTEU5QlFVc3NTVUZCU1ZBc1MwRkJTU3hEUVVGaUxFVkJRV2RDUVN4TFFVRkpiRUlzVFVGQlRVNHNUVUZCTVVJc1JVRkJhME4zUWl4SlFVRnNReXhGUVVGMVF6dEJRVU55UXl4UlFVRkpUQ3hSUVVGUFlpeE5RVUZOYTBJc1JVRkJUaXhEUVVGWU8wRkJRVUVzVVVGRFNVb3NVMEZCVVVRc1RVRkJTMU1zVVVGQlRDeEhRVUZuUWxRc1RVRkJTMG9zVFVGQmNrSXNSMEZCT0VKblFpeFZRVUU1UWl4SFFVRXlReXhEUVVSMlJEdEJRVVZCUVN4clFrRkJZMW9zVFVGQlMyRXNVVUZCVEN4SFFVRm5RbUlzVFVGQlMwOHNVVUZCYmtNN08wRkJSVUVzVVVGQlNVNHNVMEZCVVN4RFFVRmFMRVZCUVdVN1FVRkJSVHRCUVVObVFTeGxRVUZSTEVOQlFWSTdRVUZEUkRzN1FVRkZSQ3hUUVVGTExFbEJRVWxETEVsQlFVa3NRMEZCWWl4RlFVRm5Ra0VzU1VGQlNVWXNUVUZCUzJwQ0xFdEJRVXdzUTBGQlYwWXNUVUZCTDBJc1JVRkJkVU54UWl4SFFVRjJReXhGUVVFMFF6dEJRVU14UXl4VlFVRkpXaXhQUVVGUFZTeE5RVUZMYWtJc1MwRkJUQ3hEUVVGWGJVSXNRMEZCV0N4RFFVRllPMEZCUVVFc1ZVRkRTVmdzV1VGQldVUXNTMEZCU3l4RFFVRk1MRU5CUkdoQ08wRkJRVUVzVlVGRlNXRXNWVUZCVldJc1MwRkJTMk1zVFVGQlRDeERRVUZaTEVOQlFWb3NRMEZHWkR0QlFVRkJMRlZCUjBsVkxGbEJRVmxrTEUxQlFVdGxMR05CUVV3c1EwRkJiMEppTEVOQlFYQkNMRU5CU0doQ096dEJRVXRCTEZWQlFVbFlMR05CUVdNc1IwRkJiRUlzUlVGQmRVSTdRVUZEY2tKVk8wRkJRMFFzVDBGR1JDeE5RVVZQTEVsQlFVbFdMR05CUVdNc1IwRkJiRUlzUlVGQmRVSTdRVUZETlVKU0xHTkJRVTFwUXl4TlFVRk9MRU5CUVdGbUxFMUJRV0lzUlVGQmIwSXNRMEZCY0VJN1FVRkRRV2hDTEcxQ1FVRlhLMElzVFVGQldDeERRVUZyUW1Zc1RVRkJiRUlzUlVGQmVVSXNRMEZCZWtJN1FVRkRSanRCUVVORExFOUJTazBzVFVGSlFTeEpRVUZKVml4alFVRmpMRWRCUVd4Q0xFVkJRWFZDTzBGQlF6VkNVaXhqUVVGTmFVTXNUVUZCVGl4RFFVRmhaaXhOUVVGaUxFVkJRVzlDTEVOQlFYQkNMRVZCUVhWQ1JTeFBRVUYyUWp0QlFVTkJiRUlzYlVKQlFWY3JRaXhOUVVGWUxFTkJRV3RDWml4TlFVRnNRaXhGUVVGNVFpeERRVUY2UWl4RlFVRTBRbUVzVTBGQk5VSTdRVUZEUVdJN1FVRkRSQ3hQUVVwTkxFMUJTVUVzU1VGQlNWWXNZMEZCWXl4SlFVRnNRaXhGUVVGM1FqdEJRVU0zUWl4WlFVRkpNRUlzYjBKQlFXOUNha0lzVFVGQlMycENMRXRCUVV3c1EwRkJWMjFDTEVsQlFVa3NRMEZCWml4SlFVRnZRa1lzVFVGQlMycENMRXRCUVV3c1EwRkJWMjFDTEVsQlFVa3NRMEZCWml4RlFVRnJRaXhEUVVGc1FpeERRVUZ3UWl4SFFVRXlReXhKUVVGdVJUdEJRVU5CTEZsQlFVbGxMSE5DUVVGelFpeEhRVUV4UWl4RlFVRXJRanRCUVVNM1FuQkNMSGRDUVVGakxFbEJRV1E3UVVGRFJDeFRRVVpFTEUxQlJVOHNTVUZCU1c5Q0xITkNRVUZ6UWl4SFFVRXhRaXhGUVVFclFqdEJRVU53UTI1Q0xIRkNRVUZYTEVsQlFWZzdRVUZEUkR0QlFVTkdPMEZCUTBZN1FVRkRSanM3UVVGRlJEdEJRVU5CTEUxQlFVbEVMRmRCUVVvc1JVRkJhVUk3UVVGRFppeFhRVUZQTEVOQlFVTmtMRTFCUVUxQkxFMUJRVTFHTEUxQlFVNHNSMEZCWlN4RFFVRnlRaXhEUVVGU0xFVkJRV2xETzBGQlF5OUNSU3haUVVGTmJVTXNSMEZCVGp0QlFVTkJha01zYVVKQlFWZHBReXhIUVVGWU8wRkJRMFE3UVVGRFJpeEhRVXhFTEUxQlMwOHNTVUZCU1hCQ0xGRkJRVW9zUlVGQll6dEJRVU51UW1Zc1ZVRkJUVzlETEVsQlFVNHNRMEZCVnl4RlFVRllPMEZCUTBGc1F5eGxRVUZYYTBNc1NVRkJXQ3hEUVVGblFpeEpRVUZvUWp0QlFVTkVPMEZCUTBRc1QwRkJTeXhKUVVGSlF5eExRVUZMTEVOQlFXUXNSVUZCYVVKQkxFdEJRVXR5UXl4TlFVRk5SaXhOUVVGT0xFZEJRV1VzUTBGQmNrTXNSVUZCZDBOMVF5eEpRVUY0UXl4RlFVRTRRenRCUVVNMVEzSkRMRlZCUVUxeFF5eEZRVUZPTEVsQlFWbHlReXhOUVVGTmNVTXNSVUZCVGl4SlFVRlpia01zVjBGQlYyMURMRVZCUVZnc1EwRkJlRUk3UVVGRFJEdEJRVU5FTEZOQlFVOXlReXhOUVVGTmMwTXNTVUZCVGl4RFFVRlhMRVZCUVZnc1EwRkJVRHRCUVVORU96dEJRVVZFTzBGQlEwOHNVMEZCVXpsRExGbEJRVlFzUTBGQmMwSkZMRTlCUVhSQ0xFVkJRU3RDUXl4UFFVRXZRaXhGUVVGM1F6dEJRVU0zUXl4TlFVRkpMRTlCUVU5RUxFOUJRVkFzUzBGQmJVSXNVVUZCZGtJc1JVRkJhVU03UVVGREwwSkJMR05CUVZVc2QwVkJRVmRCTEU5QlFWZ3NRMEZCVmp0QlFVTkVPenRCUVVWRUxFMUJRVWsyUXl4bFFVRmxMRU5CUVc1Q08wRkJRMEVzVjBGQlUwTXNXVUZCVkN4SFFVRjNRanRCUVVOMFFpeFJRVUZKUXl4UlFVRlJMME1zVVVGQlVUWkRMR05CUVZJc1EwRkJXanRCUVVOQkxGRkJRVWtzUTBGQlEwVXNTMEZCVEN4RlFVRlpPMEZCUTFZc1lVRkJUemxETEZGQlFWRXJReXhSUVVGU0xFVkJRVkE3UVVGRFJEczdRVUZGUkM5RExGbEJRVkZuUkN4UlFVRlNMRU5CUVdsQ1JpeExRVUZxUWl4RlFVRjNRaXhWUVVGVFJ5eEhRVUZVTEVWQlFXTkRMRWxCUVdRc1JVRkJiMEk3UVVGRE1VTXNWVUZCU1VRc1IwRkJTaXhGUVVGVE8wRkJRMUFzWlVGQlQycEVMRkZCUVZFclF5eFJRVUZTTEVOQlFXbENSU3hIUVVGcVFpeERRVUZRTzBGQlEwUTdPMEZCUlVRc1ZVRkJTVVVzYVVKQlFXbENka1FzVjBGQlYzTkVMRWxCUVZnc1JVRkJhVUpLTEV0QlFXcENMRVZCUVhkQ09VTXNUMEZCZUVJc1EwRkJja0k3UVVGRFFVRXNZMEZCVVc5RUxFOUJRVklzUTBGQlowSk9MRXRCUVdoQ0xFVkJRWFZDU3l4alFVRjJRaXhGUVVGMVF5eFZRVUZUUml4SFFVRlVMRVZCUVdNN1FVRkRia1FzV1VGQlNVRXNSMEZCU2l4RlFVRlRPMEZCUTFBc2FVSkJRVTlxUkN4UlFVRlJLME1zVVVGQlVpeERRVUZwUWtVc1IwRkJha0lzUTBGQlVEdEJRVU5FT3p0QlFVVkVTanRCUVVORUxFOUJUa1E3UVVGUFJDeExRV0pFTzBGQlkwUTdRVUZEUkVFN1FVRkRSQ0lzSW1acGJHVWlPaUpoY0hCc2VTNXFjeUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSW1sdGNHOXlkQ0I3Y0dGeWMyVlFZWFJqYUgwZ1puSnZiU0FuTGk5d1lYSnpaU2M3WEc1cGJYQnZjblFnWkdsemRHRnVZMlZKZEdWeVlYUnZjaUJtY205dElDY3VMaTkxZEdsc0wyUnBjM1JoYm1ObExXbDBaWEpoZEc5eUp6dGNibHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR0Z3Y0d4NVVHRjBZMmdvYzI5MWNtTmxMQ0IxYm1sRWFXWm1MQ0J2Y0hScGIyNXpJRDBnZTMwcElIdGNiaUFnYVdZZ0tIUjVjR1Z2WmlCMWJtbEVhV1ptSUQwOVBTQW5jM1J5YVc1bkp5a2dlMXh1SUNBZ0lIVnVhVVJwWm1ZZ1BTQndZWEp6WlZCaGRHTm9LSFZ1YVVScFptWXBPMXh1SUNCOVhHNWNiaUFnYVdZZ0tFRnljbUY1TG1selFYSnlZWGtvZFc1cFJHbG1aaWtwSUh0Y2JpQWdJQ0JwWmlBb2RXNXBSR2xtWmk1c1pXNW5kR2dnUGlBeEtTQjdYRzRnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSWEp5YjNJb0oyRndjR3g1VUdGMFkyZ2diMjVzZVNCM2IzSnJjeUIzYVhSb0lHRWdjMmx1WjJ4bElHbHVjSFYwTGljcE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUhWdWFVUnBabVlnUFNCMWJtbEVhV1ptV3pCZE8xeHVJQ0I5WEc1Y2JpQWdMeThnUVhCd2JIa2dkR2hsSUdScFptWWdkRzhnZEdobElHbHVjSFYwWEc0Z0lHeGxkQ0JzYVc1bGN5QTlJSE52ZFhKalpTNXpjR3hwZENndlhGeHlYRnh1ZkZ0Y1hHNWNYSFpjWEdaY1hISmNYSGc0TlYwdktTeGNiaUFnSUNBZ0lHUmxiR2x0YVhSbGNuTWdQU0J6YjNWeVkyVXViV0YwWTJnb0wxeGNjbHhjYm54YlhGeHVYRngyWEZ4bVhGeHlYRng0T0RWZEwyY3BJSHg4SUZ0ZExGeHVJQ0FnSUNBZ2FIVnVhM01nUFNCMWJtbEVhV1ptTG1oMWJtdHpMRnh1WEc0Z0lDQWdJQ0JqYjIxd1lYSmxUR2x1WlNBOUlHOXdkR2x2Ym5NdVkyOXRjR0Z5WlV4cGJtVWdmSHdnS0Noc2FXNWxUblZ0WW1WeUxDQnNhVzVsTENCdmNHVnlZWFJwYjI0c0lIQmhkR05vUTI5dWRHVnVkQ2tnUFQ0Z2JHbHVaU0E5UFQwZ2NHRjBZMmhEYjI1MFpXNTBLU3hjYmlBZ0lDQWdJR1Z5Y205eVEyOTFiblFnUFNBd0xGeHVJQ0FnSUNBZ1puVjZla1poWTNSdmNpQTlJRzl3ZEdsdmJuTXVablY2ZWtaaFkzUnZjaUI4ZkNBd0xGeHVJQ0FnSUNBZ2JXbHVUR2x1WlNBOUlEQXNYRzRnSUNBZ0lDQnZabVp6WlhRZ1BTQXdMRnh1WEc0Z0lDQWdJQ0J5WlcxdmRtVkZUMFpPVEN4Y2JpQWdJQ0FnSUdGa1pFVlBSazVNTzF4dVhHNGdJQzhxS2x4dUlDQWdLaUJEYUdWamEzTWdhV1lnZEdobElHaDFibXNnWlhoaFkzUnNlU0JtYVhSeklHOXVJSFJvWlNCd2NtOTJhV1JsWkNCc2IyTmhkR2x2Ymx4dUlDQWdLaTljYmlBZ1puVnVZM1JwYjI0Z2FIVnVhMFpwZEhNb2FIVnVheXdnZEc5UWIzTXBJSHRjYmlBZ0lDQm1iM0lnS0d4bGRDQnFJRDBnTURzZ2FpQThJR2gxYm1zdWJHbHVaWE11YkdWdVozUm9PeUJxS3lzcElIdGNiaUFnSUNBZ0lHeGxkQ0JzYVc1bElEMGdhSFZ1YXk1c2FXNWxjMXRxWFN4Y2JpQWdJQ0FnSUNBZ0lDQnZjR1Z5WVhScGIyNGdQU0JzYVc1bFd6QmRMRnh1SUNBZ0lDQWdJQ0FnSUdOdmJuUmxiblFnUFNCc2FXNWxMbk4xWW5OMGNpZ3hLVHRjYmx4dUlDQWdJQ0FnYVdZZ0tHOXdaWEpoZEdsdmJpQTlQVDBnSnlBbklIeDhJRzl3WlhKaGRHbHZiaUE5UFQwZ0p5MG5LU0I3WEc0Z0lDQWdJQ0FnSUM4dklFTnZiblJsZUhRZ2MyRnVhWFI1SUdOb1pXTnJYRzRnSUNBZ0lDQWdJR2xtSUNnaFkyOXRjR0Z5WlV4cGJtVW9kRzlRYjNNZ0t5QXhMQ0JzYVc1bGMxdDBiMUJ2YzEwc0lHOXdaWEpoZEdsdmJpd2dZMjl1ZEdWdWRDa3BJSHRjYmlBZ0lDQWdJQ0FnSUNCbGNuSnZja052ZFc1MEt5czdYRzVjYmlBZ0lDQWdJQ0FnSUNCcFppQW9aWEp5YjNKRGIzVnVkQ0ErSUdaMWVucEdZV04wYjNJcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJtWVd4elpUdGNiaUFnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ2RHOVFiM01yS3p0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0J5WlhSMWNtNGdkSEoxWlR0Y2JpQWdmVnh1WEc0Z0lDOHZJRk5sWVhKamFDQmlaWE4wSUdacGRDQnZabVp6WlhSeklHWnZjaUJsWVdOb0lHaDFibXNnWW1GelpXUWdiMjRnZEdobElIQnlaWFpwYjNWeklHOXVaWE5jYmlBZ1ptOXlJQ2hzWlhRZ2FTQTlJREE3SUdrZ1BDQm9kVzVyY3k1c1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lHeGxkQ0JvZFc1cklEMGdhSFZ1YTNOYmFWMHNYRzRnSUNBZ0lDQWdJRzFoZUV4cGJtVWdQU0JzYVc1bGN5NXNaVzVuZEdnZ0xTQm9kVzVyTG05c1pFeHBibVZ6TEZ4dUlDQWdJQ0FnSUNCc2IyTmhiRTltWm5ObGRDQTlJREFzWEc0Z0lDQWdJQ0FnSUhSdlVHOXpJRDBnYjJabWMyVjBJQ3NnYUhWdWF5NXZiR1JUZEdGeWRDQXRJREU3WEc1Y2JpQWdJQ0JzWlhRZ2FYUmxjbUYwYjNJZ1BTQmthWE4wWVc1alpVbDBaWEpoZEc5eUtIUnZVRzl6TENCdGFXNU1hVzVsTENCdFlYaE1hVzVsS1R0Y2JseHVJQ0FnSUdadmNpQW9PeUJzYjJOaGJFOW1abk5sZENBaFBUMGdkVzVrWldacGJtVmtPeUJzYjJOaGJFOW1abk5sZENBOUlHbDBaWEpoZEc5eUtDa3BJSHRjYmlBZ0lDQWdJR2xtSUNob2RXNXJSbWwwY3lob2RXNXJMQ0IwYjFCdmN5QXJJR3h2WTJGc1QyWm1jMlYwS1NrZ2UxeHVJQ0FnSUNBZ0lDQm9kVzVyTG05bVpuTmxkQ0E5SUc5bVpuTmxkQ0FyUFNCc2IyTmhiRTltWm5ObGREdGNiaUFnSUNBZ0lDQWdZbkpsWVdzN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dVhHNGdJQ0FnYVdZZ0tHeHZZMkZzVDJabWMyVjBJRDA5UFNCMWJtUmxabWx1WldRcElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCbVlXeHpaVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQXZMeUJUWlhRZ2JHOTNaWElnZEdWNGRDQnNhVzFwZENCMGJ5QmxibVFnYjJZZ2RHaGxJR04xY25KbGJuUWdhSFZ1YXl3Z2MyOGdibVY0ZENCdmJtVnpJR1J2YmlkMElIUnllVnh1SUNBZ0lDOHZJSFJ2SUdacGRDQnZkbVZ5SUdGc2NtVmhaSGtnY0dGMFkyaGxaQ0IwWlhoMFhHNGdJQ0FnYldsdVRHbHVaU0E5SUdoMWJtc3ViMlptYzJWMElDc2dhSFZ1YXk1dmJHUlRkR0Z5ZENBcklHaDFibXN1YjJ4a1RHbHVaWE03WEc0Z0lIMWNibHh1SUNBdkx5QkJjSEJzZVNCd1lYUmphQ0JvZFc1cmMxeHVJQ0JzWlhRZ1pHbG1aazltWm5ObGRDQTlJREE3WEc0Z0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dhSFZ1YTNNdWJHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQnNaWFFnYUhWdWF5QTlJR2gxYm10elcybGRMRnh1SUNBZ0lDQWdJQ0IwYjFCdmN5QTlJR2gxYm1zdWIyeGtVM1JoY25RZ0t5Qm9kVzVyTG05bVpuTmxkQ0FySUdScFptWlBabVp6WlhRZ0xTQXhPMXh1SUNBZ0lHUnBabVpQWm1aelpYUWdLejBnYUhWdWF5NXVaWGRNYVc1bGN5QXRJR2gxYm1zdWIyeGtUR2x1WlhNN1hHNWNiaUFnSUNCcFppQW9kRzlRYjNNZ1BDQXdLU0I3SUM4dklFTnlaV0YwYVc1bklHRWdibVYzSUdacGJHVmNiaUFnSUNBZ0lIUnZVRzl6SUQwZ01EdGNiaUFnSUNCOVhHNWNiaUFnSUNCbWIzSWdLR3hsZENCcUlEMGdNRHNnYWlBOElHaDFibXN1YkdsdVpYTXViR1Z1WjNSb095QnFLeXNwSUh0Y2JpQWdJQ0FnSUd4bGRDQnNhVzVsSUQwZ2FIVnVheTVzYVc1bGMxdHFYU3hjYmlBZ0lDQWdJQ0FnSUNCdmNHVnlZWFJwYjI0Z1BTQnNhVzVsV3pCZExGeHVJQ0FnSUNBZ0lDQWdJR052Ym5SbGJuUWdQU0JzYVc1bExuTjFZbk4wY2lneEtTeGNiaUFnSUNBZ0lDQWdJQ0JrWld4cGJXbDBaWElnUFNCb2RXNXJMbXhwYm1Wa1pXeHBiV2wwWlhKelcycGRPMXh1WEc0Z0lDQWdJQ0JwWmlBb2IzQmxjbUYwYVc5dUlEMDlQU0FuSUNjcElIdGNiaUFnSUNBZ0lDQWdkRzlRYjNNckt6dGNiaUFnSUNBZ0lIMGdaV3h6WlNCcFppQW9iM0JsY21GMGFXOXVJRDA5UFNBbkxTY3BJSHRjYmlBZ0lDQWdJQ0FnYkdsdVpYTXVjM0JzYVdObEtIUnZVRzl6TENBeEtUdGNiaUFnSUNBZ0lDQWdaR1ZzYVcxcGRHVnljeTV6Y0d4cFkyVW9kRzlRYjNNc0lERXBPMXh1SUNBZ0lDQWdMeW9nYVhOMFlXNWlkV3dnYVdkdWIzSmxJR1ZzYzJVZ0tpOWNiaUFnSUNBZ0lIMGdaV3h6WlNCcFppQW9iM0JsY21GMGFXOXVJRDA5UFNBbkt5Y3BJSHRjYmlBZ0lDQWdJQ0FnYkdsdVpYTXVjM0JzYVdObEtIUnZVRzl6TENBd0xDQmpiMjUwWlc1MEtUdGNiaUFnSUNBZ0lDQWdaR1ZzYVcxcGRHVnljeTV6Y0d4cFkyVW9kRzlRYjNNc0lEQXNJR1JsYkdsdGFYUmxjaWs3WEc0Z0lDQWdJQ0FnSUhSdlVHOXpLeXM3WEc0Z0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0c5d1pYSmhkR2x2YmlBOVBUMGdKMXhjWEZ3bktTQjdYRzRnSUNBZ0lDQWdJR3hsZENCd2NtVjJhVzkxYzA5d1pYSmhkR2x2YmlBOUlHaDFibXN1YkdsdVpYTmJhaUF0SURGZElEOGdhSFZ1YXk1c2FXNWxjMXRxSUMwZ01WMWJNRjBnT2lCdWRXeHNPMXh1SUNBZ0lDQWdJQ0JwWmlBb2NISmxkbWx2ZFhOUGNHVnlZWFJwYjI0Z1BUMDlJQ2NySnlrZ2UxeHVJQ0FnSUNBZ0lDQWdJSEpsYlc5MlpVVlBSazVNSUQwZ2RISjFaVHRjYmlBZ0lDQWdJQ0FnZlNCbGJITmxJR2xtSUNod2NtVjJhVzkxYzA5d1pYSmhkR2x2YmlBOVBUMGdKeTBuS1NCN1hHNGdJQ0FnSUNBZ0lDQWdZV1JrUlU5R1Rrd2dQU0IwY25WbE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdMeThnU0dGdVpHeGxJRVZQUms1TUlHbHVjMlZ5ZEdsdmJpOXlaVzF2ZG1Gc1hHNGdJR2xtSUNoeVpXMXZkbVZGVDBaT1RDa2dlMXh1SUNBZ0lIZG9hV3hsSUNnaGJHbHVaWE5iYkdsdVpYTXViR1Z1WjNSb0lDMGdNVjBwSUh0Y2JpQWdJQ0FnSUd4cGJtVnpMbkJ2Y0NncE8xeHVJQ0FnSUNBZ1pHVnNhVzFwZEdWeWN5NXdiM0FvS1R0Y2JpQWdJQ0I5WEc0Z0lIMGdaV3h6WlNCcFppQW9ZV1JrUlU5R1Rrd3BJSHRjYmlBZ0lDQnNhVzVsY3k1d2RYTm9LQ2NuS1R0Y2JpQWdJQ0JrWld4cGJXbDBaWEp6TG5CMWMyZ29KMXhjYmljcE8xeHVJQ0I5WEc0Z0lHWnZjaUFvYkdWMElGOXJJRDBnTURzZ1gyc2dQQ0JzYVc1bGN5NXNaVzVuZEdnZ0xTQXhPeUJmYXlzcktTQjdYRzRnSUNBZ2JHbHVaWE5iWDJ0ZElEMGdiR2x1WlhOYlgydGRJQ3NnWkdWc2FXMXBkR1Z5YzF0ZmExMDdYRzRnSUgxY2JpQWdjbVYwZFhKdUlHeHBibVZ6TG1wdmFXNG9KeWNwTzF4dWZWeHVYRzR2THlCWGNtRndjR1Z5SUhSb1lYUWdjM1Z3Y0c5eWRITWdiWFZzZEdsd2JHVWdabWxzWlNCd1lYUmphR1Z6SUhacFlTQmpZV3hzWW1GamEzTXVYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdZWEJ3YkhsUVlYUmphR1Z6S0hWdWFVUnBabVlzSUc5d2RHbHZibk1wSUh0Y2JpQWdhV1lnS0hSNWNHVnZaaUIxYm1sRWFXWm1JRDA5UFNBbmMzUnlhVzVuSnlrZ2UxeHVJQ0FnSUhWdWFVUnBabVlnUFNCd1lYSnpaVkJoZEdOb0tIVnVhVVJwWm1ZcE8xeHVJQ0I5WEc1Y2JpQWdiR1YwSUdOMWNuSmxiblJKYm1SbGVDQTlJREE3WEc0Z0lHWjFibU4wYVc5dUlIQnliMk5sYzNOSmJtUmxlQ2dwSUh0Y2JpQWdJQ0JzWlhRZ2FXNWtaWGdnUFNCMWJtbEVhV1ptVzJOMWNuSmxiblJKYm1SbGVDc3JYVHRjYmlBZ0lDQnBaaUFvSVdsdVpHVjRLU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdiM0IwYVc5dWN5NWpiMjF3YkdWMFpTZ3BPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHOXdkR2x2Ym5NdWJHOWhaRVpwYkdVb2FXNWtaWGdzSUdaMWJtTjBhVzl1S0dWeWNpd2daR0YwWVNrZ2UxeHVJQ0FnSUNBZ2FXWWdLR1Z5Y2lrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2IzQjBhVzl1Y3k1amIyMXdiR1YwWlNobGNuSXBPMXh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0JzWlhRZ2RYQmtZWFJsWkVOdmJuUmxiblFnUFNCaGNIQnNlVkJoZEdOb0tHUmhkR0VzSUdsdVpHVjRMQ0J2Y0hScGIyNXpLVHRjYmlBZ0lDQWdJRzl3ZEdsdmJuTXVjR0YwWTJobFpDaHBibVJsZUN3Z2RYQmtZWFJsWkVOdmJuUmxiblFzSUdaMWJtTjBhVzl1S0dWeWNpa2dlMXh1SUNBZ0lDQWdJQ0JwWmlBb1pYSnlLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUc5d2RHbHZibk11WTI5dGNHeGxkR1VvWlhKeUtUdGNiaUFnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUhCeWIyTmxjM05KYm1SbGVDZ3BPMXh1SUNBZ0lDQWdmU2s3WEc0Z0lDQWdmU2s3WEc0Z0lIMWNiaUFnY0hKdlkyVnpjMGx1WkdWNEtDazdYRzU5WEc0aVhYMD1cblxuXG4vKioqLyB9KSxcbi8qIDExICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyd1c2Ugc3RyaWN0JztcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3BhcnNlUGF0Y2ggPSBwYXJzZVBhdGNoO1xuXHRmdW5jdGlvbiBwYXJzZVBhdGNoKHVuaURpZmYpIHtcblx0ICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIC8qaXN0YW5idWwgaWdub3JlIGVuZCovb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cblx0ICB2YXIgZGlmZnN0ciA9IHVuaURpZmYuc3BsaXQoL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdLyksXG5cdCAgICAgIGRlbGltaXRlcnMgPSB1bmlEaWZmLm1hdGNoKC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS9nKSB8fCBbXSxcblx0ICAgICAgbGlzdCA9IFtdLFxuXHQgICAgICBpID0gMDtcblxuXHQgIGZ1bmN0aW9uIHBhcnNlSW5kZXgoKSB7XG5cdCAgICB2YXIgaW5kZXggPSB7fTtcblx0ICAgIGxpc3QucHVzaChpbmRleCk7XG5cblx0ICAgIC8vIFBhcnNlIGRpZmYgbWV0YWRhdGFcblx0ICAgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcblx0ICAgICAgdmFyIGxpbmUgPSBkaWZmc3RyW2ldO1xuXG5cdCAgICAgIC8vIEZpbGUgaGVhZGVyIGZvdW5kLCBlbmQgcGFyc2luZyBkaWZmIG1ldGFkYXRhXG5cdCAgICAgIGlmICgvXihcXC1cXC1cXC18XFwrXFwrXFwrfEBAKVxccy8udGVzdChsaW5lKSkge1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICB9XG5cblx0ICAgICAgLy8gRGlmZiBpbmRleFxuXHQgICAgICB2YXIgaGVhZGVyID0gL14oPzpJbmRleDp8ZGlmZig/OiAtciBcXHcrKSspXFxzKyguKz8pXFxzKiQvLmV4ZWMobGluZSk7XG5cdCAgICAgIGlmIChoZWFkZXIpIHtcblx0ICAgICAgICBpbmRleC5pbmRleCA9IGhlYWRlclsxXTtcblx0ICAgICAgfVxuXG5cdCAgICAgIGkrKztcblx0ICAgIH1cblxuXHQgICAgLy8gUGFyc2UgZmlsZSBoZWFkZXJzIGlmIHRoZXkgYXJlIGRlZmluZWQuIFVuaWZpZWQgZGlmZiByZXF1aXJlcyB0aGVtLCBidXRcblx0ICAgIC8vIHRoZXJlJ3Mgbm8gdGVjaG5pY2FsIGlzc3VlcyB0byBoYXZlIGFuIGlzb2xhdGVkIGh1bmsgd2l0aG91dCBmaWxlIGhlYWRlclxuXHQgICAgcGFyc2VGaWxlSGVhZGVyKGluZGV4KTtcblx0ICAgIHBhcnNlRmlsZUhlYWRlcihpbmRleCk7XG5cblx0ICAgIC8vIFBhcnNlIGh1bmtzXG5cdCAgICBpbmRleC5odW5rcyA9IFtdO1xuXG5cdCAgICB3aGlsZSAoaSA8IGRpZmZzdHIubGVuZ3RoKSB7XG5cdCAgICAgIHZhciBfbGluZSA9IGRpZmZzdHJbaV07XG5cblx0ICAgICAgaWYgKC9eKEluZGV4OnxkaWZmfFxcLVxcLVxcLXxcXCtcXCtcXCspXFxzLy50ZXN0KF9saW5lKSkge1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICB9IGVsc2UgaWYgKC9eQEAvLnRlc3QoX2xpbmUpKSB7XG5cdCAgICAgICAgaW5kZXguaHVua3MucHVzaChwYXJzZUh1bmsoKSk7XG5cdCAgICAgIH0gZWxzZSBpZiAoX2xpbmUgJiYgb3B0aW9ucy5zdHJpY3QpIHtcblx0ICAgICAgICAvLyBJZ25vcmUgdW5leHBlY3RlZCBjb250ZW50IHVubGVzcyBpbiBzdHJpY3QgbW9kZVxuXHQgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBsaW5lICcgKyAoaSArIDEpICsgJyAnICsgSlNPTi5zdHJpbmdpZnkoX2xpbmUpKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBpKys7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9XG5cblx0ICAvLyBQYXJzZXMgdGhlIC0tLSBhbmQgKysrIGhlYWRlcnMsIGlmIG5vbmUgYXJlIGZvdW5kLCBubyBsaW5lc1xuXHQgIC8vIGFyZSBjb25zdW1lZC5cblx0ICBmdW5jdGlvbiBwYXJzZUZpbGVIZWFkZXIoaW5kZXgpIHtcblx0ICAgIHZhciBoZWFkZXJQYXR0ZXJuID0gL14oLS0tfFxcK1xcK1xcKylcXHMrKFtcXFMgXSopKD86XFx0KC4qPylcXHMqKT8kLztcblx0ICAgIHZhciBmaWxlSGVhZGVyID0gaGVhZGVyUGF0dGVybi5leGVjKGRpZmZzdHJbaV0pO1xuXHQgICAgaWYgKGZpbGVIZWFkZXIpIHtcblx0ICAgICAgdmFyIGtleVByZWZpeCA9IGZpbGVIZWFkZXJbMV0gPT09ICctLS0nID8gJ29sZCcgOiAnbmV3Jztcblx0ICAgICAgdmFyIGZpbGVOYW1lID0gZmlsZUhlYWRlclsyXS5yZXBsYWNlKC9cXFxcXFxcXC9nLCAnXFxcXCcpO1xuXHQgICAgICBpZiAoL15cIi4qXCIkLy50ZXN0KGZpbGVOYW1lKSkge1xuXHQgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyKDEsIGZpbGVOYW1lLmxlbmd0aCAtIDIpO1xuXHQgICAgICB9XG5cdCAgICAgIGluZGV4W2tleVByZWZpeCArICdGaWxlTmFtZSddID0gZmlsZU5hbWU7XG5cdCAgICAgIGluZGV4W2tleVByZWZpeCArICdIZWFkZXInXSA9IGZpbGVIZWFkZXJbM107XG5cblx0ICAgICAgaSsrO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIC8vIFBhcnNlcyBhIGh1bmtcblx0ICAvLyBUaGlzIGFzc3VtZXMgdGhhdCB3ZSBhcmUgYXQgdGhlIHN0YXJ0IG9mIGEgaHVuay5cblx0ICBmdW5jdGlvbiBwYXJzZUh1bmsoKSB7XG5cdCAgICB2YXIgY2h1bmtIZWFkZXJJbmRleCA9IGksXG5cdCAgICAgICAgY2h1bmtIZWFkZXJMaW5lID0gZGlmZnN0cltpKytdLFxuXHQgICAgICAgIGNodW5rSGVhZGVyID0gY2h1bmtIZWFkZXJMaW5lLnNwbGl0KC9AQCAtKFxcZCspKD86LChcXGQrKSk/IFxcKyhcXGQrKSg/OiwoXFxkKykpPyBAQC8pO1xuXG5cdCAgICB2YXIgaHVuayA9IHtcblx0ICAgICAgb2xkU3RhcnQ6ICtjaHVua0hlYWRlclsxXSxcblx0ICAgICAgb2xkTGluZXM6ICtjaHVua0hlYWRlclsyXSB8fCAxLFxuXHQgICAgICBuZXdTdGFydDogK2NodW5rSGVhZGVyWzNdLFxuXHQgICAgICBuZXdMaW5lczogK2NodW5rSGVhZGVyWzRdIHx8IDEsXG5cdCAgICAgIGxpbmVzOiBbXSxcblx0ICAgICAgbGluZWRlbGltaXRlcnM6IFtdXG5cdCAgICB9O1xuXG5cdCAgICB2YXIgYWRkQ291bnQgPSAwLFxuXHQgICAgICAgIHJlbW92ZUNvdW50ID0gMDtcblx0ICAgIGZvciAoOyBpIDwgZGlmZnN0ci5sZW5ndGg7IGkrKykge1xuXHQgICAgICAvLyBMaW5lcyBzdGFydGluZyB3aXRoICctLS0nIGNvdWxkIGJlIG1pc3Rha2VuIGZvciB0aGUgXCJyZW1vdmUgbGluZVwiIG9wZXJhdGlvblxuXHQgICAgICAvLyBCdXQgdGhleSBjb3VsZCBiZSB0aGUgaGVhZGVyIGZvciB0aGUgbmV4dCBmaWxlLiBUaGVyZWZvcmUgcHJ1bmUgc3VjaCBjYXNlcyBvdXQuXG5cdCAgICAgIGlmIChkaWZmc3RyW2ldLmluZGV4T2YoJy0tLSAnKSA9PT0gMCAmJiBpICsgMiA8IGRpZmZzdHIubGVuZ3RoICYmIGRpZmZzdHJbaSArIDFdLmluZGV4T2YoJysrKyAnKSA9PT0gMCAmJiBkaWZmc3RyW2kgKyAyXS5pbmRleE9mKCdAQCcpID09PSAwKSB7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIG9wZXJhdGlvbiA9IGRpZmZzdHJbaV1bMF07XG5cblx0ICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJysnIHx8IG9wZXJhdGlvbiA9PT0gJy0nIHx8IG9wZXJhdGlvbiA9PT0gJyAnIHx8IG9wZXJhdGlvbiA9PT0gJ1xcXFwnKSB7XG5cdCAgICAgICAgaHVuay5saW5lcy5wdXNoKGRpZmZzdHJbaV0pO1xuXHQgICAgICAgIGh1bmsubGluZWRlbGltaXRlcnMucHVzaChkZWxpbWl0ZXJzW2ldIHx8ICdcXG4nKTtcblxuXHQgICAgICAgIGlmIChvcGVyYXRpb24gPT09ICcrJykge1xuXHQgICAgICAgICAgYWRkQ291bnQrKztcblx0ICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJy0nKSB7XG5cdCAgICAgICAgICByZW1vdmVDb3VudCsrO1xuXHQgICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSAnICcpIHtcblx0ICAgICAgICAgIGFkZENvdW50Kys7XG5cdCAgICAgICAgICByZW1vdmVDb3VudCsrO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgfVxuXHQgICAgfVxuXG5cdCAgICAvLyBIYW5kbGUgdGhlIGVtcHR5IGJsb2NrIGNvdW50IGNhc2Vcblx0ICAgIGlmICghYWRkQ291bnQgJiYgaHVuay5uZXdMaW5lcyA9PT0gMSkge1xuXHQgICAgICBodW5rLm5ld0xpbmVzID0gMDtcblx0ICAgIH1cblx0ICAgIGlmICghcmVtb3ZlQ291bnQgJiYgaHVuay5vbGRMaW5lcyA9PT0gMSkge1xuXHQgICAgICBodW5rLm9sZExpbmVzID0gMDtcblx0ICAgIH1cblxuXHQgICAgLy8gUGVyZm9ybSBvcHRpb25hbCBzYW5pdHkgY2hlY2tpbmdcblx0ICAgIGlmIChvcHRpb25zLnN0cmljdCkge1xuXHQgICAgICBpZiAoYWRkQ291bnQgIT09IGh1bmsubmV3TGluZXMpIHtcblx0ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FkZGVkIGxpbmUgY291bnQgZGlkIG5vdCBtYXRjaCBmb3IgaHVuayBhdCBsaW5lICcgKyAoY2h1bmtIZWFkZXJJbmRleCArIDEpKTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAocmVtb3ZlQ291bnQgIT09IGh1bmsub2xkTGluZXMpIHtcblx0ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbW92ZWQgbGluZSBjb3VudCBkaWQgbm90IG1hdGNoIGZvciBodW5rIGF0IGxpbmUgJyArIChjaHVua0hlYWRlckluZGV4ICsgMSkpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cblx0ICAgIHJldHVybiBodW5rO1xuXHQgIH1cblxuXHQgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcblx0ICAgIHBhcnNlSW5kZXgoKTtcblx0ICB9XG5cblx0ICByZXR1cm4gbGlzdDtcblx0fVxuXHQvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTl3WVhSamFDOXdZWEp6WlM1cWN5SmRMQ0p1WVcxbGN5STZXeUp3WVhKelpWQmhkR05vSWl3aWRXNXBSR2xtWmlJc0ltOXdkR2x2Ym5NaUxDSmthV1ptYzNSeUlpd2ljM0JzYVhRaUxDSmtaV3hwYldsMFpYSnpJaXdpYldGMFkyZ2lMQ0pzYVhOMElpd2lhU0lzSW5CaGNuTmxTVzVrWlhnaUxDSnBibVJsZUNJc0luQjFjMmdpTENKc1pXNW5kR2dpTENKc2FXNWxJaXdpZEdWemRDSXNJbWhsWVdSbGNpSXNJbVY0WldNaUxDSndZWEp6WlVacGJHVklaV0ZrWlhJaUxDSm9kVzVyY3lJc0luQmhjbk5sU0hWdWF5SXNJbk4wY21samRDSXNJa1Z5Y205eUlpd2lTbE5QVGlJc0luTjBjbWx1WjJsbWVTSXNJbWhsWVdSbGNsQmhkSFJsY200aUxDSm1hV3hsU0dWaFpHVnlJaXdpYTJWNVVISmxabWw0SWl3aVptbHNaVTVoYldVaUxDSnlaWEJzWVdObElpd2ljM1ZpYzNSeUlpd2lZMmgxYm10SVpXRmtaWEpKYm1SbGVDSXNJbU5vZFc1clNHVmhaR1Z5VEdsdVpTSXNJbU5vZFc1clNHVmhaR1Z5SWl3aWFIVnVheUlzSW05c1pGTjBZWEowSWl3aWIyeGtUR2x1WlhNaUxDSnVaWGRUZEdGeWRDSXNJbTVsZDB4cGJtVnpJaXdpYkdsdVpYTWlMQ0pzYVc1bFpHVnNhVzFwZEdWeWN5SXNJbUZrWkVOdmRXNTBJaXdpY21WdGIzWmxRMjkxYm5RaUxDSnBibVJsZUU5bUlpd2liM0JsY21GMGFXOXVJbDBzSW0xaGNIQnBibWR6SWpvaU96czdaME5CUVdkQ1FTeFZMRWRCUVVGQkxGVTdRVUZCVkN4VFFVRlRRU3hWUVVGVUxFTkJRVzlDUXl4UFFVRndRaXhGUVVFeVF6dEJRVUZCTEhORVFVRmtReXhQUVVGakxIVkZRVUZLTEVWQlFVazdPMEZCUTJoRUxFMUJRVWxETEZWQlFWVkdMRkZCUVZGSExFdEJRVklzUTBGQll5eHhRa0ZCWkN4RFFVRmtPMEZCUVVFc1RVRkRTVU1zWVVGQllVb3NVVUZCVVVzc1MwRkJVaXhEUVVGakxITkNRVUZrTEV0QlFYbERMRVZCUkRGRU8wRkJRVUVzVFVGRlNVTXNUMEZCVHl4RlFVWllPMEZCUVVFc1RVRkhTVU1zU1VGQlNTeERRVWhTT3p0QlFVdEJMRmRCUVZORExGVkJRVlFzUjBGQmMwSTdRVUZEY0VJc1VVRkJTVU1zVVVGQlVTeEZRVUZhTzBGQlEwRklMRk5CUVV0SkxFbEJRVXdzUTBGQlZVUXNTMEZCVmpzN1FVRkZRVHRCUVVOQkxGZEJRVTlHTEVsQlFVbE1MRkZCUVZGVExFMUJRVzVDTEVWQlFUSkNPMEZCUTNwQ0xGVkJRVWxETEU5QlFVOVdMRkZCUVZGTExFTkJRVklzUTBGQldEczdRVUZGUVR0QlFVTkJMRlZCUVVrc2QwSkJRWGRDVFN4SlFVRjRRaXhEUVVFMlFrUXNTVUZCTjBJc1EwRkJTaXhGUVVGM1F6dEJRVU4wUXp0QlFVTkVPenRCUVVWRU8wRkJRMEVzVlVGQlNVVXNVMEZCVlN3d1EwRkJSQ3hEUVVFMlEwTXNTVUZCTjBNc1EwRkJhMFJJTEVsQlFXeEVMRU5CUVdJN1FVRkRRU3hWUVVGSlJTeE5RVUZLTEVWQlFWazdRVUZEVmt3c1kwRkJUVUVzUzBGQlRpeEhRVUZqU3l4UFFVRlBMRU5CUVZBc1EwRkJaRHRCUVVORU96dEJRVVZFVUR0QlFVTkVPenRCUVVWRU8wRkJRMEU3UVVGRFFWTXNiMEpCUVdkQ1VDeExRVUZvUWp0QlFVTkJUeXh2UWtGQlowSlFMRXRCUVdoQ096dEJRVVZCTzBGQlEwRkJMRlZCUVUxUkxFdEJRVTRzUjBGQll5eEZRVUZrT3p0QlFVVkJMRmRCUVU5V0xFbEJRVWxNTEZGQlFWRlRMRTFCUVc1Q0xFVkJRVEpDTzBGQlEzcENMRlZCUVVsRExGRkJRVTlXTEZGQlFWRkxMRU5CUVZJc1EwRkJXRHM3UVVGRlFTeFZRVUZKTEdsRFFVRnBRMDBzU1VGQmFrTXNRMEZCYzBORUxFdEJRWFJETEVOQlFVb3NSVUZCYVVRN1FVRkRMME03UVVGRFJDeFBRVVpFTEUxQlJVOHNTVUZCU1N4TlFVRk5ReXhKUVVGT0xFTkJRVmRFTEV0QlFWZ3NRMEZCU2l4RlFVRnpRanRCUVVNelFrZ3NZMEZCVFZFc1MwRkJUaXhEUVVGWlVDeEpRVUZhTEVOQlFXbENVU3hYUVVGcVFqdEJRVU5FTEU5QlJrMHNUVUZGUVN4SlFVRkpUaXhUUVVGUldDeFJRVUZSYTBJc1RVRkJjRUlzUlVGQk5FSTdRVUZEYWtNN1FVRkRRU3hqUVVGTkxFbEJRVWxETEV0QlFVb3NRMEZCVlN4dFFrRkJiVUppTEVsQlFVa3NRMEZCZGtJc1NVRkJORUlzUjBGQk5VSXNSMEZCYTBOakxFdEJRVXRETEZOQlFVd3NRMEZCWlZZc1MwRkJaaXhEUVVFMVF5eERRVUZPTzBGQlEwUXNUMEZJVFN4TlFVZEJPMEZCUTB4TU8wRkJRMFE3UVVGRFJqdEJRVU5HT3p0QlFVVkVPMEZCUTBFN1FVRkRRU3hYUVVGVFV5eGxRVUZVTEVOQlFYbENVQ3hMUVVGNlFpeEZRVUZuUXp0QlFVTTVRaXhSUVVGTll5eG5Ra0ZCWjBJc01FTkJRWFJDTzBGQlEwRXNVVUZCVFVNc1lVRkJZVVFzWTBGQlkxSXNTVUZCWkN4RFFVRnRRbUlzVVVGQlVVc3NRMEZCVWl4RFFVRnVRaXhEUVVGdVFqdEJRVU5CTEZGQlFVbHBRaXhWUVVGS0xFVkJRV2RDTzBGQlEyUXNWVUZCU1VNc1dVRkJXVVFzVjBGQlZ5eERRVUZZTEUxQlFXdENMRXRCUVd4Q0xFZEJRVEJDTEV0QlFURkNMRWRCUVd0RExFdEJRV3hFTzBGQlEwRXNWVUZCU1VVc1YwRkJWMFlzVjBGQlZ5eERRVUZZTEVWQlFXTkhMRTlCUVdRc1EwRkJjMElzVDBGQmRFSXNSVUZCSzBJc1NVRkJMMElzUTBGQlpqdEJRVU5CTEZWQlFVa3NVMEZCVTJRc1NVRkJWQ3hEUVVGallTeFJRVUZrTEVOQlFVb3NSVUZCTmtJN1FVRkRNMEpCTEcxQ1FVRlhRU3hUUVVGVFJTeE5RVUZVTEVOQlFXZENMRU5CUVdoQ0xFVkJRVzFDUml4VFFVRlRaaXhOUVVGVUxFZEJRV3RDTEVOQlFYSkRMRU5CUVZnN1FVRkRSRHRCUVVORVJpeFpRVUZOWjBJc1dVRkJXU3hWUVVGc1FpeEpRVUZuUTBNc1VVRkJhRU03UVVGRFFXcENMRmxCUVUxblFpeFpRVUZaTEZGQlFXeENMRWxCUVRoQ1JDeFhRVUZYTEVOQlFWZ3NRMEZCT1VJN08wRkJSVUZxUWp0QlFVTkVPMEZCUTBZN08wRkJSVVE3UVVGRFFUdEJRVU5CTEZkQlFWTlhMRk5CUVZRc1IwRkJjVUk3UVVGRGJrSXNVVUZCU1Zjc2JVSkJRVzFDZEVJc1EwRkJka0k3UVVGQlFTeFJRVU5KZFVJc2EwSkJRV3RDTlVJc1VVRkJVVXNzUjBGQlVpeERRVVIwUWp0QlFVRkJMRkZCUlVsM1FpeGpRVUZqUkN4blFrRkJaMEl6UWl4TFFVRm9RaXhEUVVGelFpdzBRMEZCZEVJc1EwRkdiRUk3TzBGQlNVRXNVVUZCU1RaQ0xFOUJRVTg3UVVGRFZFTXNaMEpCUVZVc1EwRkJRMFlzV1VGQldTeERRVUZhTEVOQlJFWTdRVUZGVkVjc1owSkJRVlVzUTBGQlEwZ3NXVUZCV1N4RFFVRmFMRU5CUVVRc1NVRkJiVUlzUTBGR2NFSTdRVUZIVkVrc1owSkJRVlVzUTBGQlEwb3NXVUZCV1N4RFFVRmFMRU5CU0VZN1FVRkpWRXNzWjBKQlFWVXNRMEZCUTB3c1dVRkJXU3hEUVVGYUxFTkJRVVFzU1VGQmJVSXNRMEZLY0VJN1FVRkxWRTBzWVVGQlR5eEZRVXhGTzBGQlRWUkRMSE5DUVVGblFqdEJRVTVRTEV0QlFWZzdPMEZCVTBFc1VVRkJTVU1zVjBGQlZ5eERRVUZtTzBGQlFVRXNVVUZEU1VNc1kwRkJZeXhEUVVSc1FqdEJRVVZCTEZkQlFVOXFReXhKUVVGSlRDeFJRVUZSVXl4TlFVRnVRaXhGUVVFeVFrb3NSMEZCTTBJc1JVRkJaME03UVVGRE9VSTdRVUZEUVR0QlFVTkJMRlZCUVVsTUxGRkJRVkZMTEVOQlFWSXNSVUZCVjJ0RExFOUJRVmdzUTBGQmJVSXNUVUZCYmtJc1RVRkJLMElzUTBGQkwwSXNTVUZEVFd4RExFbEJRVWtzUTBGQlNpeEhRVUZSVEN4UlFVRlJVeXhOUVVSMFFpeEpRVVZMVkN4UlFVRlJTeXhKUVVGSkxFTkJRVm9zUlVGQlpXdERMRTlCUVdZc1EwRkJkVUlzVFVGQmRrSXNUVUZCYlVNc1EwRkdlRU1zU1VGSFMzWkRMRkZCUVZGTExFbEJRVWtzUTBGQldpeEZRVUZsYTBNc1QwRkJaaXhEUVVGMVFpeEpRVUYyUWl4TlFVRnBReXhEUVVneFF5eEZRVWMyUXp0QlFVTjZRenRCUVVOSU8wRkJRMFFzVlVGQlNVTXNXVUZCV1hoRExGRkJRVkZMTEVOQlFWSXNSVUZCVnl4RFFVRllMRU5CUVdoQ096dEJRVVZCTEZWQlFVbHRReXhqUVVGakxFZEJRV1FzU1VGQmNVSkJMR05CUVdNc1IwRkJia01zU1VGQk1FTkJMR05CUVdNc1IwRkJlRVFzU1VGQkswUkJMR05CUVdNc1NVRkJha1lzUlVGQmRVWTdRVUZEY2taV0xHRkJRVXRMTEV0QlFVd3NRMEZCVnpOQ0xFbEJRVmdzUTBGQlowSlNMRkZCUVZGTExFTkJRVklzUTBGQmFFSTdRVUZEUVhsQ0xHRkJRVXROTEdOQlFVd3NRMEZCYjBJMVFpeEpRVUZ3UWl4RFFVRjVRazRzVjBGQlYwY3NRMEZCV0N4TFFVRnBRaXhKUVVFeFF6czdRVUZGUVN4WlFVRkpiVU1zWTBGQll5eEhRVUZzUWl4RlFVRjFRanRCUVVOeVFrZzdRVUZEUkN4VFFVWkVMRTFCUlU4c1NVRkJTVWNzWTBGQll5eEhRVUZzUWl4RlFVRjFRanRCUVVNMVFrWTdRVUZEUkN4VFFVWk5MRTFCUlVFc1NVRkJTVVVzWTBGQll5eEhRVUZzUWl4RlFVRjFRanRCUVVNMVFrZzdRVUZEUVVNN1FVRkRSRHRCUVVOR0xFOUJXa1FzVFVGWlR6dEJRVU5NTzBGQlEwUTdRVUZEUmpzN1FVRkZSRHRCUVVOQkxGRkJRVWtzUTBGQlEwUXNVVUZCUkN4SlFVRmhVQ3hMUVVGTFNTeFJRVUZNTEV0QlFXdENMRU5CUVc1RExFVkJRWE5ETzBGQlEzQkRTaXhYUVVGTFNTeFJRVUZNTEVkQlFXZENMRU5CUVdoQ08wRkJRMFE3UVVGRFJDeFJRVUZKTEVOQlFVTkpMRmRCUVVRc1NVRkJaMEpTTEV0QlFVdEZMRkZCUVV3c1MwRkJhMElzUTBGQmRFTXNSVUZCZVVNN1FVRkRka05HTEZkQlFVdEZMRkZCUVV3c1IwRkJaMElzUTBGQmFFSTdRVUZEUkRzN1FVRkZSRHRCUVVOQkxGRkJRVWxxUXl4UlFVRlJhMElzVFVGQldpeEZRVUZ2UWp0QlFVTnNRaXhWUVVGSmIwSXNZVUZCWVZBc1MwRkJTMGtzVVVGQmRFSXNSVUZCWjBNN1FVRkRPVUlzWTBGQlRTeEpRVUZKYUVJc1MwRkJTaXhEUVVGVkxITkVRVUZ6UkZNc2JVSkJRVzFDTEVOQlFYcEZMRU5CUVZZc1EwRkJUanRCUVVORU8wRkJRMFFzVlVGQlNWY3NaMEpCUVdkQ1VpeExRVUZMUlN4UlFVRjZRaXhGUVVGdFF6dEJRVU5xUXl4alFVRk5MRWxCUVVsa0xFdEJRVW9zUTBGQlZTeDNSRUZCZDBSVExHMUNRVUZ0UWl4RFFVRXpSU3hEUVVGV0xFTkJRVTQ3UVVGRFJEdEJRVU5HT3p0QlFVVkVMRmRCUVU5SExFbEJRVkE3UVVGRFJEczdRVUZGUkN4VFFVRlBla0lzU1VGQlNVd3NVVUZCVVZNc1RVRkJia0lzUlVGQk1rSTdRVUZEZWtKSU8wRkJRMFE3TzBGQlJVUXNVMEZCVDBZc1NVRkJVRHRCUVVORUlpd2labWxzWlNJNkluQmhjbk5sTG1weklpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2laWGh3YjNKMElHWjFibU4wYVc5dUlIQmhjbk5sVUdGMFkyZ29kVzVwUkdsbVppd2diM0IwYVc5dWN5QTlJSHQ5S1NCN1hHNGdJR3hsZENCa2FXWm1jM1J5SUQwZ2RXNXBSR2xtWmk1emNHeHBkQ2d2WEZ4eVhGeHVmRnRjWEc1Y1hIWmNYR1pjWEhKY1hIZzROVjB2S1N4Y2JpQWdJQ0FnSUdSbGJHbHRhWFJsY25NZ1BTQjFibWxFYVdabUxtMWhkR05vS0M5Y1hISmNYRzU4VzF4Y2JseGNkbHhjWmx4Y2NseGNlRGcxWFM5bktTQjhmQ0JiWFN4Y2JpQWdJQ0FnSUd4cGMzUWdQU0JiWFN4Y2JpQWdJQ0FnSUdrZ1BTQXdPMXh1WEc0Z0lHWjFibU4wYVc5dUlIQmhjbk5sU1c1a1pYZ29LU0I3WEc0Z0lDQWdiR1YwSUdsdVpHVjRJRDBnZTMwN1hHNGdJQ0FnYkdsemRDNXdkWE5vS0dsdVpHVjRLVHRjYmx4dUlDQWdJQzh2SUZCaGNuTmxJR1JwWm1ZZ2JXVjBZV1JoZEdGY2JpQWdJQ0IzYUdsc1pTQW9hU0E4SUdScFptWnpkSEl1YkdWdVozUm9LU0I3WEc0Z0lDQWdJQ0JzWlhRZ2JHbHVaU0E5SUdScFptWnpkSEpiYVYwN1hHNWNiaUFnSUNBZ0lDOHZJRVpwYkdVZ2FHVmhaR1Z5SUdadmRXNWtMQ0JsYm1RZ2NHRnljMmx1WnlCa2FXWm1JRzFsZEdGa1lYUmhYRzRnSUNBZ0lDQnBaaUFvTDE0b1hGd3RYRnd0WEZ3dGZGeGNLMXhjSzF4Y0szeEFRQ2xjWEhNdkxuUmxjM1FvYkdsdVpTa3BJSHRjYmlBZ0lDQWdJQ0FnWW5KbFlXczdYRzRnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQzh2SUVScFptWWdhVzVrWlhoY2JpQWdJQ0FnSUd4bGRDQm9aV0ZrWlhJZ1BTQW9MMTRvUHpwSmJtUmxlRHA4WkdsbVppZy9PaUF0Y2lCY1hIY3JLU3NwWEZ4ekt5Z3VLejhwWEZ4ektpUXZLUzVsZUdWaktHeHBibVVwTzF4dUlDQWdJQ0FnYVdZZ0tHaGxZV1JsY2lrZ2UxeHVJQ0FnSUNBZ0lDQnBibVJsZUM1cGJtUmxlQ0E5SUdobFlXUmxjbHN4WFR0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ2FTc3JPMXh1SUNBZ0lIMWNibHh1SUNBZ0lDOHZJRkJoY25ObElHWnBiR1VnYUdWaFpHVnljeUJwWmlCMGFHVjVJR0Z5WlNCa1pXWnBibVZrTGlCVmJtbG1hV1ZrSUdScFptWWdjbVZ4ZFdseVpYTWdkR2hsYlN3Z1luVjBYRzRnSUNBZ0x5OGdkR2hsY21VbmN5QnVieUIwWldOb2JtbGpZV3dnYVhOemRXVnpJSFJ2SUdoaGRtVWdZVzRnYVhOdmJHRjBaV1FnYUhWdWF5QjNhWFJvYjNWMElHWnBiR1VnYUdWaFpHVnlYRzRnSUNBZ2NHRnljMlZHYVd4bFNHVmhaR1Z5S0dsdVpHVjRLVHRjYmlBZ0lDQndZWEp6WlVacGJHVklaV0ZrWlhJb2FXNWtaWGdwTzF4dVhHNGdJQ0FnTHk4Z1VHRnljMlVnYUhWdWEzTmNiaUFnSUNCcGJtUmxlQzVvZFc1cmN5QTlJRnRkTzF4dVhHNGdJQ0FnZDJocGJHVWdLR2tnUENCa2FXWm1jM1J5TG14bGJtZDBhQ2tnZTF4dUlDQWdJQ0FnYkdWMElHeHBibVVnUFNCa2FXWm1jM1J5VzJsZE8xeHVYRzRnSUNBZ0lDQnBaaUFvTDE0b1NXNWtaWGc2ZkdScFptWjhYRnd0WEZ3dFhGd3RmRnhjSzF4Y0sxeGNLeWxjWEhNdkxuUmxjM1FvYkdsdVpTa3BJSHRjYmlBZ0lDQWdJQ0FnWW5KbFlXczdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLQzllUUVBdkxuUmxjM1FvYkdsdVpTa3BJSHRjYmlBZ0lDQWdJQ0FnYVc1a1pYZ3VhSFZ1YTNNdWNIVnphQ2h3WVhKelpVaDFibXNvS1NrN1hHNGdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tHeHBibVVnSmlZZ2IzQjBhVzl1Y3k1emRISnBZM1FwSUh0Y2JpQWdJQ0FnSUNBZ0x5OGdTV2R1YjNKbElIVnVaWGh3WldOMFpXUWdZMjl1ZEdWdWRDQjFibXhsYzNNZ2FXNGdjM1J5YVdOMElHMXZaR1ZjYmlBZ0lDQWdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLQ2RWYm10dWIzZHVJR3hwYm1VZ0p5QXJJQ2hwSUNzZ01Ta2dLeUFuSUNjZ0t5QktVMDlPTG5OMGNtbHVaMmxtZVNoc2FXNWxLU2s3WEc0Z0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0JwS3lzN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQjlYRzVjYmlBZ0x5OGdVR0Z5YzJWeklIUm9aU0F0TFMwZ1lXNWtJQ3NyS3lCb1pXRmtaWEp6TENCcFppQnViMjVsSUdGeVpTQm1iM1Z1WkN3Z2JtOGdiR2x1WlhOY2JpQWdMeThnWVhKbElHTnZibk4xYldWa0xseHVJQ0JtZFc1amRHbHZiaUJ3WVhKelpVWnBiR1ZJWldGa1pYSW9hVzVrWlhncElIdGNiaUFnSUNCamIyNXpkQ0JvWldGa1pYSlFZWFIwWlhKdUlEMGdMMTRvTFMwdGZGeGNLMXhjSzF4Y0t5bGNYSE1yS0Z0Y1hGTWdYU29wS0Q4NlhGeDBLQzRxUHlsY1hITXFLVDhrTHp0Y2JpQWdJQ0JqYjI1emRDQm1hV3hsU0dWaFpHVnlJRDBnYUdWaFpHVnlVR0YwZEdWeWJpNWxlR1ZqS0dScFptWnpkSEpiYVYwcE8xeHVJQ0FnSUdsbUlDaG1hV3hsU0dWaFpHVnlLU0I3WEc0Z0lDQWdJQ0JzWlhRZ2EyVjVVSEpsWm1sNElEMGdabWxzWlVobFlXUmxjbHN4WFNBOVBUMGdKeTB0TFNjZ1B5QW5iMnhrSnlBNklDZHVaWGNuTzF4dUlDQWdJQ0FnYkdWMElHWnBiR1ZPWVcxbElEMGdabWxzWlVobFlXUmxjbHN5WFM1eVpYQnNZV05sS0M5Y1hGeGNYRnhjWEM5bkxDQW5YRnhjWENjcE8xeHVJQ0FnSUNBZ2FXWWdLQzllWENJdUtsd2lKQzh1ZEdWemRDaG1hV3hsVG1GdFpTa3BJSHRjYmlBZ0lDQWdJQ0FnWm1sc1pVNWhiV1VnUFNCbWFXeGxUbUZ0WlM1emRXSnpkSElvTVN3Z1ptbHNaVTVoYldVdWJHVnVaM1JvSUMwZ01pazdYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQnBibVJsZUZ0clpYbFFjbVZtYVhnZ0t5QW5SbWxzWlU1aGJXVW5YU0E5SUdacGJHVk9ZVzFsTzF4dUlDQWdJQ0FnYVc1a1pYaGJhMlY1VUhKbFptbDRJQ3NnSjBobFlXUmxjaWRkSUQwZ1ptbHNaVWhsWVdSbGNsc3pYVHRjYmx4dUlDQWdJQ0FnYVNzck8xeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lDOHZJRkJoY25ObGN5QmhJR2gxYm10Y2JpQWdMeThnVkdocGN5QmhjM04xYldWeklIUm9ZWFFnZDJVZ1lYSmxJR0YwSUhSb1pTQnpkR0Z5ZENCdlppQmhJR2gxYm1zdVhHNGdJR1oxYm1OMGFXOXVJSEJoY25ObFNIVnVheWdwSUh0Y2JpQWdJQ0JzWlhRZ1kyaDFibXRJWldGa1pYSkpibVJsZUNBOUlHa3NYRzRnSUNBZ0lDQWdJR05vZFc1clNHVmhaR1Z5VEdsdVpTQTlJR1JwWm1aemRISmJhU3NyWFN4Y2JpQWdJQ0FnSUNBZ1kyaDFibXRJWldGa1pYSWdQU0JqYUhWdWEwaGxZV1JsY2t4cGJtVXVjM0JzYVhRb0wwQkFJQzBvWEZ4a0t5a29Qem9zS0Z4Y1pDc3BLVDhnWEZ3cktGeGNaQ3NwS0Q4NkxDaGNYR1FyS1NrL0lFQkFMeWs3WEc1Y2JpQWdJQ0JzWlhRZ2FIVnVheUE5SUh0Y2JpQWdJQ0FnSUc5c1pGTjBZWEowT2lBclkyaDFibXRJWldGa1pYSmJNVjBzWEc0Z0lDQWdJQ0J2YkdSTWFXNWxjem9nSzJOb2RXNXJTR1ZoWkdWeVd6SmRJSHg4SURFc1hHNGdJQ0FnSUNCdVpYZFRkR0Z5ZERvZ0syTm9kVzVyU0dWaFpHVnlXek5kTEZ4dUlDQWdJQ0FnYm1WM1RHbHVaWE02SUN0amFIVnVhMGhsWVdSbGNsczBYU0I4ZkNBeExGeHVJQ0FnSUNBZ2JHbHVaWE02SUZ0ZExGeHVJQ0FnSUNBZ2JHbHVaV1JsYkdsdGFYUmxjbk02SUZ0ZFhHNGdJQ0FnZlR0Y2JseHVJQ0FnSUd4bGRDQmhaR1JEYjNWdWRDQTlJREFzWEc0Z0lDQWdJQ0FnSUhKbGJXOTJaVU52ZFc1MElEMGdNRHRjYmlBZ0lDQm1iM0lnS0RzZ2FTQThJR1JwWm1aemRISXViR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0FnSUM4dklFeHBibVZ6SUhOMFlYSjBhVzVuSUhkcGRHZ2dKeTB0TFNjZ1kyOTFiR1FnWW1VZ2JXbHpkR0ZyWlc0Z1ptOXlJSFJvWlNCY0luSmxiVzkyWlNCc2FXNWxYQ0lnYjNCbGNtRjBhVzl1WEc0Z0lDQWdJQ0F2THlCQ2RYUWdkR2hsZVNCamIzVnNaQ0JpWlNCMGFHVWdhR1ZoWkdWeUlHWnZjaUIwYUdVZ2JtVjRkQ0JtYVd4bExpQlVhR1Z5WldadmNtVWdjSEoxYm1VZ2MzVmphQ0JqWVhObGN5QnZkWFF1WEc0Z0lDQWdJQ0JwWmlBb1pHbG1abk4wY2x0cFhTNXBibVJsZUU5bUtDY3RMUzBnSnlrZ1BUMDlJREJjYmlBZ0lDQWdJQ0FnSUNBZ0lDWW1JQ2hwSUNzZ01pQThJR1JwWm1aemRISXViR1Z1WjNSb0tWeHVJQ0FnSUNBZ0lDQWdJQ0FnSmlZZ1pHbG1abk4wY2x0cElDc2dNVjB1YVc1a1pYaFBaaWduS3lzcklDY3BJRDA5UFNBd1hHNGdJQ0FnSUNBZ0lDQWdJQ0FtSmlCa2FXWm1jM1J5VzJrZ0t5QXlYUzVwYm1SbGVFOW1LQ2RBUUNjcElEMDlQU0F3S1NCN1hHNGdJQ0FnSUNBZ0lDQWdZbkpsWVdzN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCc1pYUWdiM0JsY21GMGFXOXVJRDBnWkdsbVpuTjBjbHRwWFZzd1hUdGNibHh1SUNBZ0lDQWdhV1lnS0c5d1pYSmhkR2x2YmlBOVBUMGdKeXNuSUh4OElHOXdaWEpoZEdsdmJpQTlQVDBnSnkwbklIeDhJRzl3WlhKaGRHbHZiaUE5UFQwZ0p5QW5JSHg4SUc5d1pYSmhkR2x2YmlBOVBUMGdKMXhjWEZ3bktTQjdYRzRnSUNBZ0lDQWdJR2gxYm1zdWJHbHVaWE11Y0hWemFDaGthV1ptYzNSeVcybGRLVHRjYmlBZ0lDQWdJQ0FnYUhWdWF5NXNhVzVsWkdWc2FXMXBkR1Z5Y3k1d2RYTm9LR1JsYkdsdGFYUmxjbk5iYVYwZ2ZId2dKMXhjYmljcE8xeHVYRzRnSUNBZ0lDQWdJR2xtSUNodmNHVnlZWFJwYjI0Z1BUMDlJQ2NySnlrZ2UxeHVJQ0FnSUNBZ0lDQWdJR0ZrWkVOdmRXNTBLeXM3WEc0Z0lDQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb2IzQmxjbUYwYVc5dUlEMDlQU0FuTFNjcElIdGNiaUFnSUNBZ0lDQWdJQ0J5WlcxdmRtVkRiM1Z1ZENzck8xeHVJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLRzl3WlhKaGRHbHZiaUE5UFQwZ0p5QW5LU0I3WEc0Z0lDQWdJQ0FnSUNBZ1lXUmtRMjkxYm5Rckt6dGNiaUFnSUNBZ0lDQWdJQ0J5WlcxdmRtVkRiM1Z1ZENzck8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQmljbVZoYXp0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0F2THlCSVlXNWtiR1VnZEdobElHVnRjSFI1SUdKc2IyTnJJR052ZFc1MElHTmhjMlZjYmlBZ0lDQnBaaUFvSVdGa1pFTnZkVzUwSUNZbUlHaDFibXN1Ym1WM1RHbHVaWE1nUFQwOUlERXBJSHRjYmlBZ0lDQWdJR2gxYm1zdWJtVjNUR2x1WlhNZ1BTQXdPMXh1SUNBZ0lIMWNiaUFnSUNCcFppQW9JWEpsYlc5MlpVTnZkVzUwSUNZbUlHaDFibXN1YjJ4a1RHbHVaWE1nUFQwOUlERXBJSHRjYmlBZ0lDQWdJR2gxYm1zdWIyeGtUR2x1WlhNZ1BTQXdPMXh1SUNBZ0lIMWNibHh1SUNBZ0lDOHZJRkJsY21admNtMGdiM0IwYVc5dVlXd2djMkZ1YVhSNUlHTm9aV05yYVc1blhHNGdJQ0FnYVdZZ0tHOXdkR2x2Ym5NdWMzUnlhV04wS1NCN1hHNGdJQ0FnSUNCcFppQW9ZV1JrUTI5MWJuUWdJVDA5SUdoMWJtc3VibVYzVEdsdVpYTXBJSHRjYmlBZ0lDQWdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLQ2RCWkdSbFpDQnNhVzVsSUdOdmRXNTBJR1JwWkNCdWIzUWdiV0YwWTJnZ1ptOXlJR2gxYm1zZ1lYUWdiR2x1WlNBbklDc2dLR05vZFc1clNHVmhaR1Z5U1c1a1pYZ2dLeUF4S1NrN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCcFppQW9jbVZ0YjNabFEyOTFiblFnSVQwOUlHaDFibXN1YjJ4a1RHbHVaWE1wSUh0Y2JpQWdJQ0FnSUNBZ2RHaHliM2NnYm1WM0lFVnljbTl5S0NkU1pXMXZkbVZrSUd4cGJtVWdZMjkxYm5RZ1pHbGtJRzV2ZENCdFlYUmphQ0JtYjNJZ2FIVnVheUJoZENCc2FXNWxJQ2NnS3lBb1kyaDFibXRJWldGa1pYSkpibVJsZUNBcklERXBLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzVjYmlBZ0lDQnlaWFIxY200Z2FIVnVhenRjYmlBZ2ZWeHVYRzRnSUhkb2FXeGxJQ2hwSUR3Z1pHbG1abk4wY2k1c1pXNW5kR2dwSUh0Y2JpQWdJQ0J3WVhKelpVbHVaR1Y0S0NrN1hHNGdJSDFjYmx4dUlDQnlaWFIxY200Z2JHbHpkRHRjYm4xY2JpSmRmUT09XG5cblxuLyoqKi8gfSksXG4vKiAxMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cInVzZSBzdHJpY3RcIjtcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG5cdGV4cG9ydHNbXCJkZWZhdWx0XCJdID0gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9mdW5jdGlvbiAoc3RhcnQsIG1pbkxpbmUsIG1heExpbmUpIHtcblx0ICB2YXIgd2FudEZvcndhcmQgPSB0cnVlLFxuXHQgICAgICBiYWNrd2FyZEV4aGF1c3RlZCA9IGZhbHNlLFxuXHQgICAgICBmb3J3YXJkRXhoYXVzdGVkID0gZmFsc2UsXG5cdCAgICAgIGxvY2FsT2Zmc2V0ID0gMTtcblxuXHQgIHJldHVybiBmdW5jdGlvbiBpdGVyYXRvcigpIHtcblx0ICAgIGlmICh3YW50Rm9yd2FyZCAmJiAhZm9yd2FyZEV4aGF1c3RlZCkge1xuXHQgICAgICBpZiAoYmFja3dhcmRFeGhhdXN0ZWQpIHtcblx0ICAgICAgICBsb2NhbE9mZnNldCsrO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHdhbnRGb3J3YXJkID0gZmFsc2U7XG5cdCAgICAgIH1cblxuXHQgICAgICAvLyBDaGVjayBpZiB0cnlpbmcgdG8gZml0IGJleW9uZCB0ZXh0IGxlbmd0aCwgYW5kIGlmIG5vdCwgY2hlY2sgaXQgZml0c1xuXHQgICAgICAvLyBhZnRlciBvZmZzZXQgbG9jYXRpb24gKG9yIGRlc2lyZWQgbG9jYXRpb24gb24gZmlyc3QgaXRlcmF0aW9uKVxuXHQgICAgICBpZiAoc3RhcnQgKyBsb2NhbE9mZnNldCA8PSBtYXhMaW5lKSB7XG5cdCAgICAgICAgcmV0dXJuIGxvY2FsT2Zmc2V0O1xuXHQgICAgICB9XG5cblx0ICAgICAgZm9yd2FyZEV4aGF1c3RlZCA9IHRydWU7XG5cdCAgICB9XG5cblx0ICAgIGlmICghYmFja3dhcmRFeGhhdXN0ZWQpIHtcblx0ICAgICAgaWYgKCFmb3J3YXJkRXhoYXVzdGVkKSB7XG5cdCAgICAgICAgd2FudEZvcndhcmQgPSB0cnVlO1xuXHQgICAgICB9XG5cblx0ICAgICAgLy8gQ2hlY2sgaWYgdHJ5aW5nIHRvIGZpdCBiZWZvcmUgdGV4dCBiZWdpbm5pbmcsIGFuZCBpZiBub3QsIGNoZWNrIGl0IGZpdHNcblx0ICAgICAgLy8gYmVmb3JlIG9mZnNldCBsb2NhdGlvblxuXHQgICAgICBpZiAobWluTGluZSA8PSBzdGFydCAtIGxvY2FsT2Zmc2V0KSB7XG5cdCAgICAgICAgcmV0dXJuIC1sb2NhbE9mZnNldCsrO1xuXHQgICAgICB9XG5cblx0ICAgICAgYmFja3dhcmRFeGhhdXN0ZWQgPSB0cnVlO1xuXHQgICAgICByZXR1cm4gaXRlcmF0b3IoKTtcblx0ICAgIH1cblxuXHQgICAgLy8gV2UgdHJpZWQgdG8gZml0IGh1bmsgYmVmb3JlIHRleHQgYmVnaW5uaW5nIGFuZCBiZXlvbmQgdGV4dCBsZW5ndGgsIHRoZW5cblx0ICAgIC8vIGh1bmsgY2FuJ3QgZml0IG9uIHRoZSB0ZXh0LiBSZXR1cm4gdW5kZWZpbmVkXG5cdCAgfTtcblx0fTtcblx0Ly8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5MWRHbHNMMlJwYzNSaGJtTmxMV2wwWlhKaGRHOXlMbXB6SWwwc0ltNWhiV1Z6SWpwYkluTjBZWEowSWl3aWJXbHVUR2x1WlNJc0ltMWhlRXhwYm1VaUxDSjNZVzUwUm05eWQyRnlaQ0lzSW1KaFkydDNZWEprUlhob1lYVnpkR1ZrSWl3aVptOXlkMkZ5WkVWNGFHRjFjM1JsWkNJc0lteHZZMkZzVDJabWMyVjBJaXdpYVhSbGNtRjBiM0lpWFN3aWJXRndjR2x1WjNNaU9pSTdPenM3TkVOQlIyVXNWVUZCVTBFc1MwRkJWQ3hGUVVGblFrTXNUMEZCYUVJc1JVRkJlVUpETEU5QlFYcENMRVZCUVd0RE8wRkJReTlETEUxQlFVbERMR05CUVdNc1NVRkJiRUk3UVVGQlFTeE5RVU5KUXl4dlFrRkJiMElzUzBGRWVFSTdRVUZCUVN4TlFVVkpReXh0UWtGQmJVSXNTMEZHZGtJN1FVRkJRU3hOUVVkSlF5eGpRVUZqTEVOQlNHeENPenRCUVV0QkxGTkJRVThzVTBGQlUwTXNVVUZCVkN4SFFVRnZRanRCUVVONlFpeFJRVUZKU2l4bFFVRmxMRU5CUVVORkxHZENRVUZ3UWl4RlFVRnpRenRCUVVOd1F5eFZRVUZKUkN4cFFrRkJTaXhGUVVGMVFqdEJRVU55UWtVN1FVRkRSQ3hQUVVaRUxFMUJSVTg3UVVGRFRFZ3NjMEpCUVdNc1MwRkJaRHRCUVVORU96dEJRVVZFTzBGQlEwRTdRVUZEUVN4VlFVRkpTQ3hSUVVGUlRTeFhRVUZTTEVsQlFYVkNTaXhQUVVFelFpeEZRVUZ2UXp0QlFVTnNReXhsUVVGUFNTeFhRVUZRTzBGQlEwUTdPMEZCUlVSRUxIbENRVUZ0UWl4SlFVRnVRanRCUVVORU96dEJRVVZFTEZGQlFVa3NRMEZCUTBRc2FVSkJRVXdzUlVGQmQwSTdRVUZEZEVJc1ZVRkJTU3hEUVVGRFF5eG5Ra0ZCVEN4RlFVRjFRanRCUVVOeVFrWXNjMEpCUVdNc1NVRkJaRHRCUVVORU96dEJRVVZFTzBGQlEwRTdRVUZEUVN4VlFVRkpSaXhYUVVGWFJDeFJRVUZSVFN4WFFVRjJRaXhGUVVGdlF6dEJRVU5zUXl4bFFVRlBMRU5CUVVOQkxHRkJRVkk3UVVGRFJEczdRVUZGUkVZc01FSkJRVzlDTEVsQlFYQkNPMEZCUTBFc1lVRkJUMGNzVlVGQlVEdEJRVU5FT3p0QlFVVkVPMEZCUTBFN1FVRkRSQ3hIUVd4RFJEdEJRVzFEUkN4RElpd2labWxzWlNJNkltUnBjM1JoYm1ObExXbDBaWEpoZEc5eUxtcHpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpTHk4Z1NYUmxjbUYwYjNJZ2RHaGhkQ0IwY21GMlpYSnpaWE1nYVc0Z2RHaGxJSEpoYm1kbElHOW1JRnR0YVc0c0lHMWhlRjBzSUhOMFpYQndhVzVuWEc0dkx5QmllU0JrYVhOMFlXNWpaU0JtY205dElHRWdaMmwyWlc0Z2MzUmhjblFnY0c5emFYUnBiMjR1SUVrdVpTNGdabTl5SUZzd0xDQTBYU3dnZDJsMGFGeHVMeThnYzNSaGNuUWdiMllnTWl3Z2RHaHBjeUIzYVd4c0lHbDBaWEpoZEdVZ01pd2dNeXdnTVN3Z05Dd2dNQzVjYm1WNGNHOXlkQ0JrWldaaGRXeDBJR1oxYm1OMGFXOXVLSE4wWVhKMExDQnRhVzVNYVc1bExDQnRZWGhNYVc1bEtTQjdYRzRnSUd4bGRDQjNZVzUwUm05eWQyRnlaQ0E5SUhSeWRXVXNYRzRnSUNBZ0lDQmlZV05yZDJGeVpFVjRhR0YxYzNSbFpDQTlJR1poYkhObExGeHVJQ0FnSUNBZ1ptOXlkMkZ5WkVWNGFHRjFjM1JsWkNBOUlHWmhiSE5sTEZ4dUlDQWdJQ0FnYkc5allXeFBabVp6WlhRZ1BTQXhPMXh1WEc0Z0lISmxkSFZ5YmlCbWRXNWpkR2x2YmlCcGRHVnlZWFJ2Y2lncElIdGNiaUFnSUNCcFppQW9kMkZ1ZEVadmNuZGhjbVFnSmlZZ0lXWnZjbmRoY21SRmVHaGhkWE4wWldRcElIdGNiaUFnSUNBZ0lHbG1JQ2hpWVdOcmQyRnlaRVY0YUdGMWMzUmxaQ2tnZTF4dUlDQWdJQ0FnSUNCc2IyTmhiRTltWm5ObGRDc3JPMXh1SUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdkMkZ1ZEVadmNuZGhjbVFnUFNCbVlXeHpaVHRjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnTHk4Z1EyaGxZMnNnYVdZZ2RISjVhVzVuSUhSdklHWnBkQ0JpWlhsdmJtUWdkR1Y0ZENCc1pXNW5kR2dzSUdGdVpDQnBaaUJ1YjNRc0lHTm9aV05ySUdsMElHWnBkSE5jYmlBZ0lDQWdJQzh2SUdGbWRHVnlJRzltWm5ObGRDQnNiMk5oZEdsdmJpQW9iM0lnWkdWemFYSmxaQ0JzYjJOaGRHbHZiaUJ2YmlCbWFYSnpkQ0JwZEdWeVlYUnBiMjRwWEc0Z0lDQWdJQ0JwWmlBb2MzUmhjblFnS3lCc2IyTmhiRTltWm5ObGRDQThQU0J0WVhoTWFXNWxLU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJzYjJOaGJFOW1abk5sZER0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ1ptOXlkMkZ5WkVWNGFHRjFjM1JsWkNBOUlIUnlkV1U3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdhV1lnS0NGaVlXTnJkMkZ5WkVWNGFHRjFjM1JsWkNrZ2UxeHVJQ0FnSUNBZ2FXWWdLQ0ZtYjNKM1lYSmtSWGhvWVhWemRHVmtLU0I3WEc0Z0lDQWdJQ0FnSUhkaGJuUkdiM0ozWVhKa0lEMGdkSEoxWlR0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0x5OGdRMmhsWTJzZ2FXWWdkSEo1YVc1bklIUnZJR1pwZENCaVpXWnZjbVVnZEdWNGRDQmlaV2RwYm01cGJtY3NJR0Z1WkNCcFppQnViM1FzSUdOb1pXTnJJR2wwSUdacGRITmNiaUFnSUNBZ0lDOHZJR0psWm05eVpTQnZabVp6WlhRZ2JHOWpZWFJwYjI1Y2JpQWdJQ0FnSUdsbUlDaHRhVzVNYVc1bElEdzlJSE4wWVhKMElDMGdiRzlqWVd4UFptWnpaWFFwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUMxc2IyTmhiRTltWm5ObGRDc3JPMXh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0JpWVdOcmQyRnlaRVY0YUdGMWMzUmxaQ0E5SUhSeWRXVTdYRzRnSUNBZ0lDQnlaWFIxY200Z2FYUmxjbUYwYjNJb0tUdGNiaUFnSUNCOVhHNWNiaUFnSUNBdkx5QlhaU0IwY21sbFpDQjBieUJtYVhRZ2FIVnVheUJpWldadmNtVWdkR1Y0ZENCaVpXZHBibTVwYm1jZ1lXNWtJR0psZVc5dVpDQjBaWGgwSUd4bGJtZDBhQ3dnZEdobGJseHVJQ0FnSUM4dklHaDFibXNnWTJGdUozUWdabWwwSUc5dUlIUm9aU0IwWlhoMExpQlNaWFIxY200Z2RXNWtaV1pwYm1Wa1hHNGdJSDA3WEc1OVhHNGlYWDA9XG5cblxuLyoqKi8gfSksXG4vKiAxMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8ndXNlIHN0cmljdCc7XG5cblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jYWxjTGluZUNvdW50ID0gY2FsY0xpbmVDb3VudDtcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovbWVyZ2UgPSBtZXJnZTtcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19jcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19wYXJzZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2FycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2Z1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gZWxzZSB7IHJldHVybiBBcnJheS5mcm9tKGFycik7IH0gfVxuXG5cdC8qaXN0YW5idWwgaWdub3JlIGVuZCovZnVuY3Rpb24gY2FsY0xpbmVDb3VudChodW5rKSB7XG5cdCAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciBfY2FsY09sZE5ld0xpbmVDb3VudCA9IC8qaXN0YW5idWwgaWdub3JlIGVuZCovY2FsY09sZE5ld0xpbmVDb3VudChodW5rLmxpbmVzKSxcblx0ICAgICAgb2xkTGluZXMgPSBfY2FsY09sZE5ld0xpbmVDb3VudC5vbGRMaW5lcyxcblx0ICAgICAgbmV3TGluZXMgPSBfY2FsY09sZE5ld0xpbmVDb3VudC5uZXdMaW5lcztcblxuXHQgIGlmIChvbGRMaW5lcyAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICBodW5rLm9sZExpbmVzID0gb2xkTGluZXM7XG5cdCAgfSBlbHNlIHtcblx0ICAgIGRlbGV0ZSBodW5rLm9sZExpbmVzO1xuXHQgIH1cblxuXHQgIGlmIChuZXdMaW5lcyAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICBodW5rLm5ld0xpbmVzID0gbmV3TGluZXM7XG5cdCAgfSBlbHNlIHtcblx0ICAgIGRlbGV0ZSBodW5rLm5ld0xpbmVzO1xuXHQgIH1cblx0fVxuXG5cdGZ1bmN0aW9uIG1lcmdlKG1pbmUsIHRoZWlycywgYmFzZSkge1xuXHQgIG1pbmUgPSBsb2FkUGF0Y2gobWluZSwgYmFzZSk7XG5cdCAgdGhlaXJzID0gbG9hZFBhdGNoKHRoZWlycywgYmFzZSk7XG5cblx0ICB2YXIgcmV0ID0ge307XG5cblx0ICAvLyBGb3IgaW5kZXggd2UganVzdCBsZXQgaXQgcGFzcyB0aHJvdWdoIGFzIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgbmVjZXNzYXJ5IG1lYW5pbmcuXG5cdCAgLy8gTGVhdmluZyBzYW5pdHkgY2hlY2tzIG9uIHRoaXMgdG8gdGhlIEFQSSBjb25zdW1lciB0aGF0IG1heSBrbm93IG1vcmUgYWJvdXQgdGhlXG5cdCAgLy8gbWVhbmluZyBpbiB0aGVpciBvd24gY29udGV4dC5cblx0ICBpZiAobWluZS5pbmRleCB8fCB0aGVpcnMuaW5kZXgpIHtcblx0ICAgIHJldC5pbmRleCA9IG1pbmUuaW5kZXggfHwgdGhlaXJzLmluZGV4O1xuXHQgIH1cblxuXHQgIGlmIChtaW5lLm5ld0ZpbGVOYW1lIHx8IHRoZWlycy5uZXdGaWxlTmFtZSkge1xuXHQgICAgaWYgKCFmaWxlTmFtZUNoYW5nZWQobWluZSkpIHtcblx0ICAgICAgLy8gTm8gaGVhZGVyIG9yIG5vIGNoYW5nZSBpbiBvdXJzLCB1c2UgdGhlaXJzIChhbmQgb3VycyBpZiB0aGVpcnMgZG9lcyBub3QgZXhpc3QpXG5cdCAgICAgIHJldC5vbGRGaWxlTmFtZSA9IHRoZWlycy5vbGRGaWxlTmFtZSB8fCBtaW5lLm9sZEZpbGVOYW1lO1xuXHQgICAgICByZXQubmV3RmlsZU5hbWUgPSB0aGVpcnMubmV3RmlsZU5hbWUgfHwgbWluZS5uZXdGaWxlTmFtZTtcblx0ICAgICAgcmV0Lm9sZEhlYWRlciA9IHRoZWlycy5vbGRIZWFkZXIgfHwgbWluZS5vbGRIZWFkZXI7XG5cdCAgICAgIHJldC5uZXdIZWFkZXIgPSB0aGVpcnMubmV3SGVhZGVyIHx8IG1pbmUubmV3SGVhZGVyO1xuXHQgICAgfSBlbHNlIGlmICghZmlsZU5hbWVDaGFuZ2VkKHRoZWlycykpIHtcblx0ICAgICAgLy8gTm8gaGVhZGVyIG9yIG5vIGNoYW5nZSBpbiB0aGVpcnMsIHVzZSBvdXJzXG5cdCAgICAgIHJldC5vbGRGaWxlTmFtZSA9IG1pbmUub2xkRmlsZU5hbWU7XG5cdCAgICAgIHJldC5uZXdGaWxlTmFtZSA9IG1pbmUubmV3RmlsZU5hbWU7XG5cdCAgICAgIHJldC5vbGRIZWFkZXIgPSBtaW5lLm9sZEhlYWRlcjtcblx0ICAgICAgcmV0Lm5ld0hlYWRlciA9IG1pbmUubmV3SGVhZGVyO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgLy8gQm90aCBjaGFuZ2VkLi4uIGZpZ3VyZSBpdCBvdXRcblx0ICAgICAgcmV0Lm9sZEZpbGVOYW1lID0gc2VsZWN0RmllbGQocmV0LCBtaW5lLm9sZEZpbGVOYW1lLCB0aGVpcnMub2xkRmlsZU5hbWUpO1xuXHQgICAgICByZXQubmV3RmlsZU5hbWUgPSBzZWxlY3RGaWVsZChyZXQsIG1pbmUubmV3RmlsZU5hbWUsIHRoZWlycy5uZXdGaWxlTmFtZSk7XG5cdCAgICAgIHJldC5vbGRIZWFkZXIgPSBzZWxlY3RGaWVsZChyZXQsIG1pbmUub2xkSGVhZGVyLCB0aGVpcnMub2xkSGVhZGVyKTtcblx0ICAgICAgcmV0Lm5ld0hlYWRlciA9IHNlbGVjdEZpZWxkKHJldCwgbWluZS5uZXdIZWFkZXIsIHRoZWlycy5uZXdIZWFkZXIpO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHJldC5odW5rcyA9IFtdO1xuXG5cdCAgdmFyIG1pbmVJbmRleCA9IDAsXG5cdCAgICAgIHRoZWlyc0luZGV4ID0gMCxcblx0ICAgICAgbWluZU9mZnNldCA9IDAsXG5cdCAgICAgIHRoZWlyc09mZnNldCA9IDA7XG5cblx0ICB3aGlsZSAobWluZUluZGV4IDwgbWluZS5odW5rcy5sZW5ndGggfHwgdGhlaXJzSW5kZXggPCB0aGVpcnMuaHVua3MubGVuZ3RoKSB7XG5cdCAgICB2YXIgbWluZUN1cnJlbnQgPSBtaW5lLmh1bmtzW21pbmVJbmRleF0gfHwgeyBvbGRTdGFydDogSW5maW5pdHkgfSxcblx0ICAgICAgICB0aGVpcnNDdXJyZW50ID0gdGhlaXJzLmh1bmtzW3RoZWlyc0luZGV4XSB8fCB7IG9sZFN0YXJ0OiBJbmZpbml0eSB9O1xuXG5cdCAgICBpZiAoaHVua0JlZm9yZShtaW5lQ3VycmVudCwgdGhlaXJzQ3VycmVudCkpIHtcblx0ICAgICAgLy8gVGhpcyBwYXRjaCBkb2VzIG5vdCBvdmVybGFwIHdpdGggYW55IG9mIHRoZSBvdGhlcnMsIHlheS5cblx0ICAgICAgcmV0Lmh1bmtzLnB1c2goY2xvbmVIdW5rKG1pbmVDdXJyZW50LCBtaW5lT2Zmc2V0KSk7XG5cdCAgICAgIG1pbmVJbmRleCsrO1xuXHQgICAgICB0aGVpcnNPZmZzZXQgKz0gbWluZUN1cnJlbnQubmV3TGluZXMgLSBtaW5lQ3VycmVudC5vbGRMaW5lcztcblx0ICAgIH0gZWxzZSBpZiAoaHVua0JlZm9yZSh0aGVpcnNDdXJyZW50LCBtaW5lQ3VycmVudCkpIHtcblx0ICAgICAgLy8gVGhpcyBwYXRjaCBkb2VzIG5vdCBvdmVybGFwIHdpdGggYW55IG9mIHRoZSBvdGhlcnMsIHlheS5cblx0ICAgICAgcmV0Lmh1bmtzLnB1c2goY2xvbmVIdW5rKHRoZWlyc0N1cnJlbnQsIHRoZWlyc09mZnNldCkpO1xuXHQgICAgICB0aGVpcnNJbmRleCsrO1xuXHQgICAgICBtaW5lT2Zmc2V0ICs9IHRoZWlyc0N1cnJlbnQubmV3TGluZXMgLSB0aGVpcnNDdXJyZW50Lm9sZExpbmVzO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgLy8gT3ZlcmxhcCwgbWVyZ2UgYXMgYmVzdCB3ZSBjYW5cblx0ICAgICAgdmFyIG1lcmdlZEh1bmsgPSB7XG5cdCAgICAgICAgb2xkU3RhcnQ6IE1hdGgubWluKG1pbmVDdXJyZW50Lm9sZFN0YXJ0LCB0aGVpcnNDdXJyZW50Lm9sZFN0YXJ0KSxcblx0ICAgICAgICBvbGRMaW5lczogMCxcblx0ICAgICAgICBuZXdTdGFydDogTWF0aC5taW4obWluZUN1cnJlbnQubmV3U3RhcnQgKyBtaW5lT2Zmc2V0LCB0aGVpcnNDdXJyZW50Lm9sZFN0YXJ0ICsgdGhlaXJzT2Zmc2V0KSxcblx0ICAgICAgICBuZXdMaW5lczogMCxcblx0ICAgICAgICBsaW5lczogW11cblx0ICAgICAgfTtcblx0ICAgICAgbWVyZ2VMaW5lcyhtZXJnZWRIdW5rLCBtaW5lQ3VycmVudC5vbGRTdGFydCwgbWluZUN1cnJlbnQubGluZXMsIHRoZWlyc0N1cnJlbnQub2xkU3RhcnQsIHRoZWlyc0N1cnJlbnQubGluZXMpO1xuXHQgICAgICB0aGVpcnNJbmRleCsrO1xuXHQgICAgICBtaW5lSW5kZXgrKztcblxuXHQgICAgICByZXQuaHVua3MucHVzaChtZXJnZWRIdW5rKTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICByZXR1cm4gcmV0O1xuXHR9XG5cblx0ZnVuY3Rpb24gbG9hZFBhdGNoKHBhcmFtLCBiYXNlKSB7XG5cdCAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycpIHtcblx0ICAgIGlmICgvXkBAL20udGVzdChwYXJhbSkgfHwgL15JbmRleDovbS50ZXN0KHBhcmFtKSkge1xuXHQgICAgICByZXR1cm4gKC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oMCwgX3BhcnNlLnBhcnNlUGF0Y2gpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovKHBhcmFtKVswXVxuXHQgICAgICApO1xuXHQgICAgfVxuXG5cdCAgICBpZiAoIWJhc2UpIHtcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IHByb3ZpZGUgYSBiYXNlIHJlZmVyZW5jZSBvciBwYXNzIGluIGEgcGF0Y2gnKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiAoLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLygwLCBfY3JlYXRlLnN0cnVjdHVyZWRQYXRjaCkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8odW5kZWZpbmVkLCB1bmRlZmluZWQsIGJhc2UsIHBhcmFtKVxuXHQgICAgKTtcblx0ICB9XG5cblx0ICByZXR1cm4gcGFyYW07XG5cdH1cblxuXHRmdW5jdGlvbiBmaWxlTmFtZUNoYW5nZWQocGF0Y2gpIHtcblx0ICByZXR1cm4gcGF0Y2gubmV3RmlsZU5hbWUgJiYgcGF0Y2gubmV3RmlsZU5hbWUgIT09IHBhdGNoLm9sZEZpbGVOYW1lO1xuXHR9XG5cblx0ZnVuY3Rpb24gc2VsZWN0RmllbGQoaW5kZXgsIG1pbmUsIHRoZWlycykge1xuXHQgIGlmIChtaW5lID09PSB0aGVpcnMpIHtcblx0ICAgIHJldHVybiBtaW5lO1xuXHQgIH0gZWxzZSB7XG5cdCAgICBpbmRleC5jb25mbGljdCA9IHRydWU7XG5cdCAgICByZXR1cm4geyBtaW5lOiBtaW5lLCB0aGVpcnM6IHRoZWlycyB9O1xuXHQgIH1cblx0fVxuXG5cdGZ1bmN0aW9uIGh1bmtCZWZvcmUodGVzdCwgY2hlY2spIHtcblx0ICByZXR1cm4gdGVzdC5vbGRTdGFydCA8IGNoZWNrLm9sZFN0YXJ0ICYmIHRlc3Qub2xkU3RhcnQgKyB0ZXN0Lm9sZExpbmVzIDwgY2hlY2sub2xkU3RhcnQ7XG5cdH1cblxuXHRmdW5jdGlvbiBjbG9uZUh1bmsoaHVuaywgb2Zmc2V0KSB7XG5cdCAgcmV0dXJuIHtcblx0ICAgIG9sZFN0YXJ0OiBodW5rLm9sZFN0YXJ0LCBvbGRMaW5lczogaHVuay5vbGRMaW5lcyxcblx0ICAgIG5ld1N0YXJ0OiBodW5rLm5ld1N0YXJ0ICsgb2Zmc2V0LCBuZXdMaW5lczogaHVuay5uZXdMaW5lcyxcblx0ICAgIGxpbmVzOiBodW5rLmxpbmVzXG5cdCAgfTtcblx0fVxuXG5cdGZ1bmN0aW9uIG1lcmdlTGluZXMoaHVuaywgbWluZU9mZnNldCwgbWluZUxpbmVzLCB0aGVpck9mZnNldCwgdGhlaXJMaW5lcykge1xuXHQgIC8vIFRoaXMgd2lsbCBnZW5lcmFsbHkgcmVzdWx0IGluIGEgY29uZmxpY3RlZCBodW5rLCBidXQgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHRoZSBjb250ZXh0XG5cdCAgLy8gaXMgdGhlIG9ubHkgb3ZlcmxhcCB3aGVyZSB3ZSBjYW4gc3VjY2Vzc2Z1bGx5IG1lcmdlIHRoZSBjb250ZW50IGhlcmUuXG5cdCAgdmFyIG1pbmUgPSB7IG9mZnNldDogbWluZU9mZnNldCwgbGluZXM6IG1pbmVMaW5lcywgaW5kZXg6IDAgfSxcblx0ICAgICAgdGhlaXIgPSB7IG9mZnNldDogdGhlaXJPZmZzZXQsIGxpbmVzOiB0aGVpckxpbmVzLCBpbmRleDogMCB9O1xuXG5cdCAgLy8gSGFuZGxlIGFueSBsZWFkaW5nIGNvbnRlbnRcblx0ICBpbnNlcnRMZWFkaW5nKGh1bmssIG1pbmUsIHRoZWlyKTtcblx0ICBpbnNlcnRMZWFkaW5nKGh1bmssIHRoZWlyLCBtaW5lKTtcblxuXHQgIC8vIE5vdyBpbiB0aGUgb3ZlcmxhcCBjb250ZW50LiBTY2FuIHRocm91Z2ggYW5kIHNlbGVjdCB0aGUgYmVzdCBjaGFuZ2VzIGZyb20gZWFjaC5cblx0ICB3aGlsZSAobWluZS5pbmRleCA8IG1pbmUubGluZXMubGVuZ3RoICYmIHRoZWlyLmluZGV4IDwgdGhlaXIubGluZXMubGVuZ3RoKSB7XG5cdCAgICB2YXIgbWluZUN1cnJlbnQgPSBtaW5lLmxpbmVzW21pbmUuaW5kZXhdLFxuXHQgICAgICAgIHRoZWlyQ3VycmVudCA9IHRoZWlyLmxpbmVzW3RoZWlyLmluZGV4XTtcblxuXHQgICAgaWYgKChtaW5lQ3VycmVudFswXSA9PT0gJy0nIHx8IG1pbmVDdXJyZW50WzBdID09PSAnKycpICYmICh0aGVpckN1cnJlbnRbMF0gPT09ICctJyB8fCB0aGVpckN1cnJlbnRbMF0gPT09ICcrJykpIHtcblx0ICAgICAgLy8gQm90aCBtb2RpZmllZCAuLi5cblx0ICAgICAgbXV0dWFsQ2hhbmdlKGh1bmssIG1pbmUsIHRoZWlyKTtcblx0ICAgIH0gZWxzZSBpZiAobWluZUN1cnJlbnRbMF0gPT09ICcrJyAmJiB0aGVpckN1cnJlbnRbMF0gPT09ICcgJykge1xuXHQgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9odW5rJGxpbmVzO1xuXG5cdCAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovIC8vIE1pbmUgaW5zZXJ0ZWRcblx0ICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyhfaHVuayRsaW5lcyA9IC8qaXN0YW5idWwgaWdub3JlIGVuZCovaHVuay5saW5lcykucHVzaC4gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2FwcGx5IC8qaXN0YW5idWwgaWdub3JlIGVuZCovKCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2h1bmskbGluZXMgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8sIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fdG9Db25zdW1hYmxlQXJyYXkoIC8qaXN0YW5idWwgaWdub3JlIGVuZCovY29sbGVjdENoYW5nZShtaW5lKSkpO1xuXHQgICAgfSBlbHNlIGlmICh0aGVpckN1cnJlbnRbMF0gPT09ICcrJyAmJiBtaW5lQ3VycmVudFswXSA9PT0gJyAnKSB7XG5cdCAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2h1bmskbGluZXMyO1xuXG5cdCAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovIC8vIFRoZWlycyBpbnNlcnRlZFxuXHQgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKF9odW5rJGxpbmVzMiA9IC8qaXN0YW5idWwgaWdub3JlIGVuZCovaHVuay5saW5lcykucHVzaC4gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2FwcGx5IC8qaXN0YW5idWwgaWdub3JlIGVuZCovKCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2h1bmskbGluZXMyIC8qaXN0YW5idWwgaWdub3JlIGVuZCovLCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX3RvQ29uc3VtYWJsZUFycmF5KCAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2NvbGxlY3RDaGFuZ2UodGhlaXIpKSk7XG5cdCAgICB9IGVsc2UgaWYgKG1pbmVDdXJyZW50WzBdID09PSAnLScgJiYgdGhlaXJDdXJyZW50WzBdID09PSAnICcpIHtcblx0ICAgICAgLy8gTWluZSByZW1vdmVkIG9yIGVkaXRlZFxuXHQgICAgICByZW1vdmFsKGh1bmssIG1pbmUsIHRoZWlyKTtcblx0ICAgIH0gZWxzZSBpZiAodGhlaXJDdXJyZW50WzBdID09PSAnLScgJiYgbWluZUN1cnJlbnRbMF0gPT09ICcgJykge1xuXHQgICAgICAvLyBUaGVpciByZW1vdmVkIG9yIGVkaXRlZFxuXHQgICAgICByZW1vdmFsKGh1bmssIHRoZWlyLCBtaW5lLCB0cnVlKTtcblx0ICAgIH0gZWxzZSBpZiAobWluZUN1cnJlbnQgPT09IHRoZWlyQ3VycmVudCkge1xuXHQgICAgICAvLyBDb250ZXh0IGlkZW50aXR5XG5cdCAgICAgIGh1bmsubGluZXMucHVzaChtaW5lQ3VycmVudCk7XG5cdCAgICAgIG1pbmUuaW5kZXgrKztcblx0ICAgICAgdGhlaXIuaW5kZXgrKztcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIC8vIENvbnRleHQgbWlzbWF0Y2hcblx0ICAgICAgY29uZmxpY3QoaHVuaywgY29sbGVjdENoYW5nZShtaW5lKSwgY29sbGVjdENoYW5nZSh0aGVpcikpO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIC8vIE5vdyBwdXNoIGFueXRoaW5nIHRoYXQgbWF5IGJlIHJlbWFpbmluZ1xuXHQgIGluc2VydFRyYWlsaW5nKGh1bmssIG1pbmUpO1xuXHQgIGluc2VydFRyYWlsaW5nKGh1bmssIHRoZWlyKTtcblxuXHQgIGNhbGNMaW5lQ291bnQoaHVuayk7XG5cdH1cblxuXHRmdW5jdGlvbiBtdXR1YWxDaGFuZ2UoaHVuaywgbWluZSwgdGhlaXIpIHtcblx0ICB2YXIgbXlDaGFuZ2VzID0gY29sbGVjdENoYW5nZShtaW5lKSxcblx0ICAgICAgdGhlaXJDaGFuZ2VzID0gY29sbGVjdENoYW5nZSh0aGVpcik7XG5cblx0ICBpZiAoYWxsUmVtb3ZlcyhteUNoYW5nZXMpICYmIGFsbFJlbW92ZXModGhlaXJDaGFuZ2VzKSkge1xuXHQgICAgLy8gU3BlY2lhbCBjYXNlIGZvciByZW1vdmUgY2hhbmdlcyB0aGF0IGFyZSBzdXBlcnNldHMgb2Ygb25lIGFub3RoZXJcblx0ICAgIGlmICggLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLygwLCBfYXJyYXkuYXJyYXlTdGFydHNXaXRoKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyhteUNoYW5nZXMsIHRoZWlyQ2hhbmdlcykgJiYgc2tpcFJlbW92ZVN1cGVyc2V0KHRoZWlyLCBteUNoYW5nZXMsIG15Q2hhbmdlcy5sZW5ndGggLSB0aGVpckNoYW5nZXMubGVuZ3RoKSkge1xuXHQgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9odW5rJGxpbmVzMztcblxuXHQgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKF9odW5rJGxpbmVzMyA9IC8qaXN0YW5idWwgaWdub3JlIGVuZCovaHVuay5saW5lcykucHVzaC4gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2FwcGx5IC8qaXN0YW5idWwgaWdub3JlIGVuZCovKCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2h1bmskbGluZXMzIC8qaXN0YW5idWwgaWdub3JlIGVuZCovLCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX3RvQ29uc3VtYWJsZUFycmF5KCAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL215Q2hhbmdlcykpO1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9IGVsc2UgaWYgKCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKDAsIF9hcnJheS5hcnJheVN0YXJ0c1dpdGgpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovKHRoZWlyQ2hhbmdlcywgbXlDaGFuZ2VzKSAmJiBza2lwUmVtb3ZlU3VwZXJzZXQobWluZSwgdGhlaXJDaGFuZ2VzLCB0aGVpckNoYW5nZXMubGVuZ3RoIC0gbXlDaGFuZ2VzLmxlbmd0aCkpIHtcblx0ICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciBfaHVuayRsaW5lczQ7XG5cblx0ICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyhfaHVuayRsaW5lczQgPSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2h1bmsubGluZXMpLnB1c2guIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9hcHBseSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyggLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19odW5rJGxpbmVzNCAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLywgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL190b0NvbnN1bWFibGVBcnJheSggLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi90aGVpckNoYW5nZXMpKTtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgIH0gZWxzZSBpZiAoIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oMCwgX2FycmF5LmFycmF5RXF1YWwpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovKG15Q2hhbmdlcywgdGhlaXJDaGFuZ2VzKSkge1xuXHQgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciBfaHVuayRsaW5lczU7XG5cblx0ICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oX2h1bmskbGluZXM1ID0gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9odW5rLmxpbmVzKS5wdXNoLiAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovYXBwbHkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8oIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9faHVuayRsaW5lczUgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8sIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fdG9Db25zdW1hYmxlQXJyYXkoIC8qaXN0YW5idWwgaWdub3JlIGVuZCovbXlDaGFuZ2VzKSk7XG5cdCAgICByZXR1cm47XG5cdCAgfVxuXG5cdCAgY29uZmxpY3QoaHVuaywgbXlDaGFuZ2VzLCB0aGVpckNoYW5nZXMpO1xuXHR9XG5cblx0ZnVuY3Rpb24gcmVtb3ZhbChodW5rLCBtaW5lLCB0aGVpciwgc3dhcCkge1xuXHQgIHZhciBteUNoYW5nZXMgPSBjb2xsZWN0Q2hhbmdlKG1pbmUpLFxuXHQgICAgICB0aGVpckNoYW5nZXMgPSBjb2xsZWN0Q29udGV4dCh0aGVpciwgbXlDaGFuZ2VzKTtcblx0ICBpZiAodGhlaXJDaGFuZ2VzLm1lcmdlZCkge1xuXHQgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciBfaHVuayRsaW5lczY7XG5cblx0ICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oX2h1bmskbGluZXM2ID0gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9odW5rLmxpbmVzKS5wdXNoLiAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovYXBwbHkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8oIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9faHVuayRsaW5lczYgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8sIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fdG9Db25zdW1hYmxlQXJyYXkoIC8qaXN0YW5idWwgaWdub3JlIGVuZCovdGhlaXJDaGFuZ2VzLm1lcmdlZCkpO1xuXHQgIH0gZWxzZSB7XG5cdCAgICBjb25mbGljdChodW5rLCBzd2FwID8gdGhlaXJDaGFuZ2VzIDogbXlDaGFuZ2VzLCBzd2FwID8gbXlDaGFuZ2VzIDogdGhlaXJDaGFuZ2VzKTtcblx0ICB9XG5cdH1cblxuXHRmdW5jdGlvbiBjb25mbGljdChodW5rLCBtaW5lLCB0aGVpcikge1xuXHQgIGh1bmsuY29uZmxpY3QgPSB0cnVlO1xuXHQgIGh1bmsubGluZXMucHVzaCh7XG5cdCAgICBjb25mbGljdDogdHJ1ZSxcblx0ICAgIG1pbmU6IG1pbmUsXG5cdCAgICB0aGVpcnM6IHRoZWlyXG5cdCAgfSk7XG5cdH1cblxuXHRmdW5jdGlvbiBpbnNlcnRMZWFkaW5nKGh1bmssIGluc2VydCwgdGhlaXIpIHtcblx0ICB3aGlsZSAoaW5zZXJ0Lm9mZnNldCA8IHRoZWlyLm9mZnNldCAmJiBpbnNlcnQuaW5kZXggPCBpbnNlcnQubGluZXMubGVuZ3RoKSB7XG5cdCAgICB2YXIgbGluZSA9IGluc2VydC5saW5lc1tpbnNlcnQuaW5kZXgrK107XG5cdCAgICBodW5rLmxpbmVzLnB1c2gobGluZSk7XG5cdCAgICBpbnNlcnQub2Zmc2V0Kys7XG5cdCAgfVxuXHR9XG5cdGZ1bmN0aW9uIGluc2VydFRyYWlsaW5nKGh1bmssIGluc2VydCkge1xuXHQgIHdoaWxlIChpbnNlcnQuaW5kZXggPCBpbnNlcnQubGluZXMubGVuZ3RoKSB7XG5cdCAgICB2YXIgbGluZSA9IGluc2VydC5saW5lc1tpbnNlcnQuaW5kZXgrK107XG5cdCAgICBodW5rLmxpbmVzLnB1c2gobGluZSk7XG5cdCAgfVxuXHR9XG5cblx0ZnVuY3Rpb24gY29sbGVjdENoYW5nZShzdGF0ZSkge1xuXHQgIHZhciByZXQgPSBbXSxcblx0ICAgICAgb3BlcmF0aW9uID0gc3RhdGUubGluZXNbc3RhdGUuaW5kZXhdWzBdO1xuXHQgIHdoaWxlIChzdGF0ZS5pbmRleCA8IHN0YXRlLmxpbmVzLmxlbmd0aCkge1xuXHQgICAgdmFyIGxpbmUgPSBzdGF0ZS5saW5lc1tzdGF0ZS5pbmRleF07XG5cblx0ICAgIC8vIEdyb3VwIGFkZGl0aW9ucyB0aGF0IGFyZSBpbW1lZGlhdGVseSBhZnRlciBzdWJ0cmFjdGlvbnMgYW5kIHRyZWF0IHRoZW0gYXMgb25lIFwiYXRvbWljXCIgbW9kaWZ5IGNoYW5nZS5cblx0ICAgIGlmIChvcGVyYXRpb24gPT09ICctJyAmJiBsaW5lWzBdID09PSAnKycpIHtcblx0ICAgICAgb3BlcmF0aW9uID0gJysnO1xuXHQgICAgfVxuXG5cdCAgICBpZiAob3BlcmF0aW9uID09PSBsaW5lWzBdKSB7XG5cdCAgICAgIHJldC5wdXNoKGxpbmUpO1xuXHQgICAgICBzdGF0ZS5pbmRleCsrO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgYnJlYWs7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgcmV0dXJuIHJldDtcblx0fVxuXHRmdW5jdGlvbiBjb2xsZWN0Q29udGV4dChzdGF0ZSwgbWF0Y2hDaGFuZ2VzKSB7XG5cdCAgdmFyIGNoYW5nZXMgPSBbXSxcblx0ICAgICAgbWVyZ2VkID0gW10sXG5cdCAgICAgIG1hdGNoSW5kZXggPSAwLFxuXHQgICAgICBjb250ZXh0Q2hhbmdlcyA9IGZhbHNlLFxuXHQgICAgICBjb25mbGljdGVkID0gZmFsc2U7XG5cdCAgd2hpbGUgKG1hdGNoSW5kZXggPCBtYXRjaENoYW5nZXMubGVuZ3RoICYmIHN0YXRlLmluZGV4IDwgc3RhdGUubGluZXMubGVuZ3RoKSB7XG5cdCAgICB2YXIgY2hhbmdlID0gc3RhdGUubGluZXNbc3RhdGUuaW5kZXhdLFxuXHQgICAgICAgIG1hdGNoID0gbWF0Y2hDaGFuZ2VzW21hdGNoSW5kZXhdO1xuXG5cdCAgICAvLyBPbmNlIHdlJ3ZlIGhpdCBvdXIgYWRkLCB0aGVuIHdlIGFyZSBkb25lXG5cdCAgICBpZiAobWF0Y2hbMF0gPT09ICcrJykge1xuXHQgICAgICBicmVhaztcblx0ICAgIH1cblxuXHQgICAgY29udGV4dENoYW5nZXMgPSBjb250ZXh0Q2hhbmdlcyB8fCBjaGFuZ2VbMF0gIT09ICcgJztcblxuXHQgICAgbWVyZ2VkLnB1c2gobWF0Y2gpO1xuXHQgICAgbWF0Y2hJbmRleCsrO1xuXG5cdCAgICAvLyBDb25zdW1lIGFueSBhZGRpdGlvbnMgaW4gdGhlIG90aGVyIGJsb2NrIGFzIGEgY29uZmxpY3QgdG8gYXR0ZW1wdFxuXHQgICAgLy8gdG8gcHVsbCBpbiB0aGUgcmVtYWluaW5nIGNvbnRleHQgYWZ0ZXIgdGhpc1xuXHQgICAgaWYgKGNoYW5nZVswXSA9PT0gJysnKSB7XG5cdCAgICAgIGNvbmZsaWN0ZWQgPSB0cnVlO1xuXG5cdCAgICAgIHdoaWxlIChjaGFuZ2VbMF0gPT09ICcrJykge1xuXHQgICAgICAgIGNoYW5nZXMucHVzaChjaGFuZ2UpO1xuXHQgICAgICAgIGNoYW5nZSA9IHN0YXRlLmxpbmVzWysrc3RhdGUuaW5kZXhdO1xuXHQgICAgICB9XG5cdCAgICB9XG5cblx0ICAgIGlmIChtYXRjaC5zdWJzdHIoMSkgPT09IGNoYW5nZS5zdWJzdHIoMSkpIHtcblx0ICAgICAgY2hhbmdlcy5wdXNoKGNoYW5nZSk7XG5cdCAgICAgIHN0YXRlLmluZGV4Kys7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBjb25mbGljdGVkID0gdHJ1ZTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICBpZiAoKG1hdGNoQ2hhbmdlc1ttYXRjaEluZGV4XSB8fCAnJylbMF0gPT09ICcrJyAmJiBjb250ZXh0Q2hhbmdlcykge1xuXHQgICAgY29uZmxpY3RlZCA9IHRydWU7XG5cdCAgfVxuXG5cdCAgaWYgKGNvbmZsaWN0ZWQpIHtcblx0ICAgIHJldHVybiBjaGFuZ2VzO1xuXHQgIH1cblxuXHQgIHdoaWxlIChtYXRjaEluZGV4IDwgbWF0Y2hDaGFuZ2VzLmxlbmd0aCkge1xuXHQgICAgbWVyZ2VkLnB1c2gobWF0Y2hDaGFuZ2VzW21hdGNoSW5kZXgrK10pO1xuXHQgIH1cblxuXHQgIHJldHVybiB7XG5cdCAgICBtZXJnZWQ6IG1lcmdlZCxcblx0ICAgIGNoYW5nZXM6IGNoYW5nZXNcblx0ICB9O1xuXHR9XG5cblx0ZnVuY3Rpb24gYWxsUmVtb3ZlcyhjaGFuZ2VzKSB7XG5cdCAgcmV0dXJuIGNoYW5nZXMucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBjaGFuZ2UpIHtcblx0ICAgIHJldHVybiBwcmV2ICYmIGNoYW5nZVswXSA9PT0gJy0nO1xuXHQgIH0sIHRydWUpO1xuXHR9XG5cdGZ1bmN0aW9uIHNraXBSZW1vdmVTdXBlcnNldChzdGF0ZSwgcmVtb3ZlQ2hhbmdlcywgZGVsdGEpIHtcblx0ICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbHRhOyBpKyspIHtcblx0ICAgIHZhciBjaGFuZ2VDb250ZW50ID0gcmVtb3ZlQ2hhbmdlc1tyZW1vdmVDaGFuZ2VzLmxlbmd0aCAtIGRlbHRhICsgaV0uc3Vic3RyKDEpO1xuXHQgICAgaWYgKHN0YXRlLmxpbmVzW3N0YXRlLmluZGV4ICsgaV0gIT09ICcgJyArIGNoYW5nZUNvbnRlbnQpIHtcblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHN0YXRlLmluZGV4ICs9IGRlbHRhO1xuXHQgIHJldHVybiB0cnVlO1xuXHR9XG5cblx0ZnVuY3Rpb24gY2FsY09sZE5ld0xpbmVDb3VudChsaW5lcykge1xuXHQgIHZhciBvbGRMaW5lcyA9IDA7XG5cdCAgdmFyIG5ld0xpbmVzID0gMDtcblxuXHQgIGxpbmVzLmZvckVhY2goZnVuY3Rpb24gKGxpbmUpIHtcblx0ICAgIGlmICh0eXBlb2YgbGluZSAhPT0gJ3N0cmluZycpIHtcblx0ICAgICAgdmFyIG15Q291bnQgPSBjYWxjT2xkTmV3TGluZUNvdW50KGxpbmUubWluZSk7XG5cdCAgICAgIHZhciB0aGVpckNvdW50ID0gY2FsY09sZE5ld0xpbmVDb3VudChsaW5lLnRoZWlycyk7XG5cblx0ICAgICAgaWYgKG9sZExpbmVzICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICBpZiAobXlDb3VudC5vbGRMaW5lcyA9PT0gdGhlaXJDb3VudC5vbGRMaW5lcykge1xuXHQgICAgICAgICAgb2xkTGluZXMgKz0gbXlDb3VudC5vbGRMaW5lcztcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgb2xkTGluZXMgPSB1bmRlZmluZWQ7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cblx0ICAgICAgaWYgKG5ld0xpbmVzICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICBpZiAobXlDb3VudC5uZXdMaW5lcyA9PT0gdGhlaXJDb3VudC5uZXdMaW5lcykge1xuXHQgICAgICAgICAgbmV3TGluZXMgKz0gbXlDb3VudC5uZXdMaW5lcztcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgbmV3TGluZXMgPSB1bmRlZmluZWQ7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBpZiAobmV3TGluZXMgIT09IHVuZGVmaW5lZCAmJiAobGluZVswXSA9PT0gJysnIHx8IGxpbmVbMF0gPT09ICcgJykpIHtcblx0ICAgICAgICBuZXdMaW5lcysrO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChvbGRMaW5lcyAhPT0gdW5kZWZpbmVkICYmIChsaW5lWzBdID09PSAnLScgfHwgbGluZVswXSA9PT0gJyAnKSkge1xuXHQgICAgICAgIG9sZExpbmVzKys7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KTtcblxuXHQgIHJldHVybiB7IG9sZExpbmVzOiBvbGRMaW5lcywgbmV3TGluZXM6IG5ld0xpbmVzIH07XG5cdH1cblx0Ly8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5d1lYUmphQzl0WlhKblpTNXFjeUpkTENKdVlXMWxjeUk2V3lKallXeGpUR2x1WlVOdmRXNTBJaXdpYldWeVoyVWlMQ0pvZFc1cklpd2lZMkZzWTA5c1pFNWxkMHhwYm1WRGIzVnVkQ0lzSW14cGJtVnpJaXdpYjJ4a1RHbHVaWE1pTENKdVpYZE1hVzVsY3lJc0luVnVaR1ZtYVc1bFpDSXNJbTFwYm1VaUxDSjBhR1ZwY25NaUxDSmlZWE5sSWl3aWJHOWhaRkJoZEdOb0lpd2ljbVYwSWl3aWFXNWtaWGdpTENKdVpYZEdhV3hsVG1GdFpTSXNJbVpwYkdWT1lXMWxRMmhoYm1kbFpDSXNJbTlzWkVacGJHVk9ZVzFsSWl3aWIyeGtTR1ZoWkdWeUlpd2libVYzU0dWaFpHVnlJaXdpYzJWc1pXTjBSbWxsYkdRaUxDSm9kVzVyY3lJc0ltMXBibVZKYm1SbGVDSXNJblJvWldseWMwbHVaR1Y0SWl3aWJXbHVaVTltWm5ObGRDSXNJblJvWldseWMwOW1abk5sZENJc0lteGxibWQwYUNJc0ltMXBibVZEZFhKeVpXNTBJaXdpYjJ4a1UzUmhjblFpTENKSmJtWnBibWwwZVNJc0luUm9aV2x5YzBOMWNuSmxiblFpTENKb2RXNXJRbVZtYjNKbElpd2ljSFZ6YUNJc0ltTnNiMjVsU0hWdWF5SXNJbTFsY21kbFpFaDFibXNpTENKTllYUm9JaXdpYldsdUlpd2libVYzVTNSaGNuUWlMQ0p0WlhKblpVeHBibVZ6SWl3aWNHRnlZVzBpTENKMFpYTjBJaXdpUlhKeWIzSWlMQ0p3WVhSamFDSXNJbU52Ym1ac2FXTjBJaXdpWTJobFkyc2lMQ0p2Wm1aelpYUWlMQ0p0YVc1bFRHbHVaWE1pTENKMGFHVnBjazltWm5ObGRDSXNJblJvWldseVRHbHVaWE1pTENKMGFHVnBjaUlzSW1sdWMyVnlkRXhsWVdScGJtY2lMQ0owYUdWcGNrTjFjbkpsYm5RaUxDSnRkWFIxWVd4RGFHRnVaMlVpTENKamIyeHNaV04wUTJoaGJtZGxJaXdpY21WdGIzWmhiQ0lzSW1sdWMyVnlkRlJ5WVdsc2FXNW5JaXdpYlhsRGFHRnVaMlZ6SWl3aWRHaGxhWEpEYUdGdVoyVnpJaXdpWVd4c1VtVnRiM1psY3lJc0luTnJhWEJTWlcxdmRtVlRkWEJsY25ObGRDSXNJbk4zWVhBaUxDSmpiMnhzWldOMFEyOXVkR1Y0ZENJc0ltMWxjbWRsWkNJc0ltbHVjMlZ5ZENJc0lteHBibVVpTENKemRHRjBaU0lzSW05d1pYSmhkR2x2YmlJc0ltMWhkR05vUTJoaGJtZGxjeUlzSW1Ob1lXNW5aWE1pTENKdFlYUmphRWx1WkdWNElpd2lZMjl1ZEdWNGRFTm9ZVzVuWlhNaUxDSmpiMjVtYkdsamRHVmtJaXdpWTJoaGJtZGxJaXdpYldGMFkyZ2lMQ0p6ZFdKemRISWlMQ0p5WldSMVkyVWlMQ0p3Y21WMklpd2ljbVZ0YjNabFEyaGhibWRsY3lJc0ltUmxiSFJoSWl3aWFTSXNJbU5vWVc1blpVTnZiblJsYm5RaUxDSm1iM0pGWVdOb0lpd2liWGxEYjNWdWRDSXNJblJvWldseVEyOTFiblFpWFN3aWJXRndjR2x1WjNNaU9pSTdPenRuUTBGTFowSkJMR0VzUjBGQlFVRXNZVHQ1UkVGblFrRkRMRXNzUjBGQlFVRXNTenM3UVVGeVFtaENPenRCUVVOQk96dEJRVVZCT3pzN08zVkNRVVZQTEZOQlFWTkVMR0ZCUVZRc1EwRkJkVUpGTEVsQlFYWkNMRVZCUVRaQ08wRkJRVUVzTmtWQlEweERMRzlDUVVGdlFrUXNTMEZCUzBVc1MwRkJla0lzUTBGRVN6dEJRVUZCTEUxQlF6TkNReXhSUVVReVFpeDNRa0ZETTBKQkxGRkJSREpDTzBGQlFVRXNUVUZEYWtKRExGRkJSR2xDTEhkQ1FVTnFRa0VzVVVGRWFVSTdPMEZCUjJ4RExFMUJRVWxFTEdGQlFXRkZMRk5CUVdwQ0xFVkJRVFJDTzBGQlF6RkNUQ3hUUVVGTFJ5eFJRVUZNTEVkQlFXZENRU3hSUVVGb1FqdEJRVU5FTEVkQlJrUXNUVUZGVHp0QlFVTk1MRmRCUVU5SUxFdEJRVXRITEZGQlFWbzdRVUZEUkRzN1FVRkZSQ3hOUVVGSlF5eGhRVUZoUXl4VFFVRnFRaXhGUVVFMFFqdEJRVU14UWt3c1UwRkJTMGtzVVVGQlRDeEhRVUZuUWtFc1VVRkJhRUk3UVVGRFJDeEhRVVpFTEUxQlJVODdRVUZEVEN4WFFVRlBTaXhMUVVGTFNTeFJRVUZhTzBGQlEwUTdRVUZEUmpzN1FVRkZUU3hUUVVGVFRDeExRVUZVTEVOQlFXVlBMRWxCUVdZc1JVRkJjVUpETEUxQlFYSkNMRVZCUVRaQ1F5eEpRVUUzUWl4RlFVRnRRenRCUVVONFEwWXNVMEZCVDBjc1ZVRkJWVWdzU1VGQlZpeEZRVUZuUWtVc1NVRkJhRUlzUTBGQlVEdEJRVU5CUkN4WFFVRlRSU3hWUVVGVlJpeE5RVUZXTEVWQlFXdENReXhKUVVGc1FpeERRVUZVT3p0QlFVVkJMRTFCUVVsRkxFMUJRVTBzUlVGQlZqczdRVUZGUVR0QlFVTkJPMEZCUTBFN1FVRkRRU3hOUVVGSlNpeExRVUZMU3l4TFFVRk1MRWxCUVdOS0xFOUJRVTlKTEV0QlFYcENMRVZCUVdkRE8wRkJRemxDUkN4UlFVRkpReXhMUVVGS0xFZEJRVmxNTEV0QlFVdExMRXRCUVV3c1NVRkJZMG9zVDBGQlQwa3NTMEZCYWtNN1FVRkRSRHM3UVVGRlJDeE5RVUZKVEN4TFFVRkxUU3hYUVVGTUxFbEJRVzlDVEN4UFFVRlBTeXhYUVVFdlFpeEZRVUUwUXp0QlFVTXhReXhSUVVGSkxFTkJRVU5ETEdkQ1FVRm5RbEFzU1VGQmFFSXNRMEZCVEN4RlFVRTBRanRCUVVNeFFqdEJRVU5CU1N4VlFVRkpTU3hYUVVGS0xFZEJRV3RDVUN4UFFVRlBUeXhYUVVGUUxFbEJRWE5DVWl4TFFVRkxVU3hYUVVFM1F6dEJRVU5CU2l4VlFVRkpSU3hYUVVGS0xFZEJRV3RDVEN4UFFVRlBTeXhYUVVGUUxFbEJRWE5DVGl4TFFVRkxUU3hYUVVFM1F6dEJRVU5CUml4VlFVRkpTeXhUUVVGS0xFZEJRV2RDVWl4UFFVRlBVU3hUUVVGUUxFbEJRVzlDVkN4TFFVRkxVeXhUUVVGNlF6dEJRVU5CVEN4VlFVRkpUU3hUUVVGS0xFZEJRV2RDVkN4UFFVRlBVeXhUUVVGUUxFbEJRVzlDVml4TFFVRkxWU3hUUVVGNlF6dEJRVU5FTEV0QlRrUXNUVUZOVHl4SlFVRkpMRU5CUVVOSUxHZENRVUZuUWs0c1RVRkJhRUlzUTBGQlRDeEZRVUU0UWp0QlFVTnVRenRCUVVOQlJ5eFZRVUZKU1N4WFFVRktMRWRCUVd0Q1VpeExRVUZMVVN4WFFVRjJRanRCUVVOQlNpeFZRVUZKUlN4WFFVRktMRWRCUVd0Q1RpeExRVUZMVFN4WFFVRjJRanRCUVVOQlJpeFZRVUZKU3l4VFFVRktMRWRCUVdkQ1ZDeExRVUZMVXl4VFFVRnlRanRCUVVOQlRDeFZRVUZKVFN4VFFVRktMRWRCUVdkQ1ZpeExRVUZMVlN4VFFVRnlRanRCUVVORUxFdEJUazBzVFVGTlFUdEJRVU5NTzBGQlEwRk9MRlZCUVVsSkxGZEJRVW9zUjBGQmEwSkhMRmxCUVZsUUxFZEJRVm9zUlVGQmFVSktMRXRCUVV0UkxGZEJRWFJDTEVWQlFXMURVQ3hQUVVGUFR5eFhRVUV4UXl4RFFVRnNRanRCUVVOQlNpeFZRVUZKUlN4WFFVRktMRWRCUVd0Q1N5eFpRVUZaVUN4SFFVRmFMRVZCUVdsQ1NpeExRVUZMVFN4WFFVRjBRaXhGUVVGdFEwd3NUMEZCVDBzc1YwRkJNVU1zUTBGQmJFSTdRVUZEUVVZc1ZVRkJTVXNzVTBGQlNpeEhRVUZuUWtVc1dVRkJXVkFzUjBGQldpeEZRVUZwUWtvc1MwRkJTMU1zVTBGQmRFSXNSVUZCYVVOU0xFOUJRVTlSTEZOQlFYaERMRU5CUVdoQ08wRkJRMEZNTEZWQlFVbE5MRk5CUVVvc1IwRkJaMEpETEZsQlFWbFFMRWRCUVZvc1JVRkJhVUpLTEV0QlFVdFZMRk5CUVhSQ0xFVkJRV2xEVkN4UFFVRlBVeXhUUVVGNFF5eERRVUZvUWp0QlFVTkVPMEZCUTBZN08wRkJSVVJPTEUxQlFVbFJMRXRCUVVvc1IwRkJXU3hGUVVGYU96dEJRVVZCTEUxQlFVbERMRmxCUVZrc1EwRkJhRUk3UVVGQlFTeE5RVU5KUXl4alFVRmpMRU5CUkd4Q08wRkJRVUVzVFVGRlNVTXNZVUZCWVN4RFFVWnFRanRCUVVGQkxFMUJSMGxETEdWQlFXVXNRMEZJYmtJN08wRkJTMEVzVTBGQlQwZ3NXVUZCV1dJc1MwRkJTMWtzUzBGQlRDeERRVUZYU3l4TlFVRjJRaXhKUVVGcFEwZ3NZMEZCWTJJc1QwRkJUMWNzUzBGQlVDeERRVUZoU3l4TlFVRnVSU3hGUVVFeVJUdEJRVU42UlN4UlFVRkpReXhqUVVGamJFSXNTMEZCUzFrc1MwRkJUQ3hEUVVGWFF5eFRRVUZZTEV0QlFYbENMRVZCUVVOTkxGVkJRVlZETEZGQlFWZ3NSVUZCTTBNN1FVRkJRU3hSUVVOSlF5eG5Ra0ZCWjBKd1FpeFBRVUZQVnl4TFFVRlFMRU5CUVdGRkxGZEJRV0lzUzBGQk5rSXNSVUZCUTBzc1ZVRkJWVU1zVVVGQldDeEZRVVJxUkRzN1FVRkhRU3hSUVVGSlJTeFhRVUZYU2l4WFFVRllMRVZCUVhkQ1J5eGhRVUY0UWl4RFFVRktMRVZCUVRSRE8wRkJRekZETzBGQlEwRnFRaXhWUVVGSlVTeExRVUZLTEVOQlFWVlhMRWxCUVZZc1EwRkJaVU1zVlVGQlZVNHNWMEZCVml4RlFVRjFRa2dzVlVGQmRrSXNRMEZCWmp0QlFVTkJSanRCUVVOQlJ5eHpRa0ZCWjBKRkxGbEJRVmx3UWl4UlFVRmFMRWRCUVhWQ2IwSXNXVUZCV1hKQ0xGRkJRVzVFTzBGQlEwUXNTMEZNUkN4TlFVdFBMRWxCUVVsNVFpeFhRVUZYUkN4aFFVRllMRVZCUVRCQ1NDeFhRVUV4UWl4RFFVRktMRVZCUVRSRE8wRkJRMnBFTzBGQlEwRmtMRlZCUVVsUkxFdEJRVW9zUTBGQlZWY3NTVUZCVml4RFFVRmxReXhWUVVGVlNDeGhRVUZXTEVWQlFYbENUQ3haUVVGNlFpeERRVUZtTzBGQlEwRkdPMEZCUTBGRExHOUNRVUZqVFN4alFVRmpka0lzVVVGQlpDeEhRVUY1UW5WQ0xHTkJRV040UWl4UlFVRnlSRHRCUVVORUxFdEJURTBzVFVGTFFUdEJRVU5NTzBGQlEwRXNWVUZCU1RSQ0xHRkJRV0U3UVVGRFprNHNhMEpCUVZWUExFdEJRVXRETEVkQlFVd3NRMEZCVTFRc1dVRkJXVU1zVVVGQmNrSXNSVUZCSzBKRkxHTkJRV05HTEZGQlFUZERMRU5CUkVzN1FVRkZablJDTEd0Q1FVRlZMRU5CUmtzN1FVRkhaaXRDTEd0Q1FVRlZSaXhMUVVGTFF5eEhRVUZNTEVOQlFWTlVMRmxCUVZsVkxGRkJRVm9zUjBGQmRVSmlMRlZCUVdoRExFVkJRVFJEVFN4alFVRmpSaXhSUVVGa0xFZEJRWGxDU0N4WlFVRnlSU3hEUVVoTE8wRkJTV1pzUWl4clFrRkJWU3hEUVVwTE8wRkJTMlpHTEdWQlFVODdRVUZNVVN4UFFVRnFRanRCUVU5QmFVTXNhVUpCUVZkS0xGVkJRVmdzUlVGQmRVSlFMRmxCUVZsRExGRkJRVzVETEVWQlFUWkRSQ3haUVVGWmRFSXNTMEZCZWtRc1JVRkJaMFY1UWl4alFVRmpSaXhSUVVFNVJTeEZRVUYzUmtVc1kwRkJZM3BDTEV0QlFYUkhPMEZCUTBGclFqdEJRVU5CUkRzN1FVRkZRVlFzVlVGQlNWRXNTMEZCU2l4RFFVRlZWeXhKUVVGV0xFTkJRV1ZGTEZWQlFXWTdRVUZEUkR0QlFVTkdPenRCUVVWRUxGTkJRVTl5UWl4SFFVRlFPMEZCUTBRN08wRkJSVVFzVTBGQlUwUXNVMEZCVkN4RFFVRnRRakpDTEV0QlFXNUNMRVZCUVRCQ05VSXNTVUZCTVVJc1JVRkJaME03UVVGRE9VSXNUVUZCU1N4UFFVRlBORUlzUzBGQlVDeExRVUZwUWl4UlFVRnlRaXhGUVVFclFqdEJRVU0zUWl4UlFVRkpMRTlCUVU5RExFbEJRVkFzUTBGQldVUXNTMEZCV2l4TFFVRjFRaXhYUVVGWFF5eEpRVUZZTEVOQlFXZENSQ3hMUVVGb1FpeERRVUV6UWl4RlFVRnZSRHRCUVVOc1JDeGhRVUZQTEhsRlFVRlhRU3hMUVVGWUxFVkJRV3RDTEVOQlFXeENPMEZCUVZBN1FVRkRSRHM3UVVGRlJDeFJRVUZKTEVOQlFVTTFRaXhKUVVGTUxFVkJRVmM3UVVGRFZDeFpRVUZOTEVsQlFVazRRaXhMUVVGS0xFTkJRVlVzYTBSQlFWWXNRMEZCVGp0QlFVTkVPMEZCUTBRc1YwRkJUeXdyUlVGQlowSnFReXhUUVVGb1FpeEZRVUV5UWtFc1UwRkJNMElzUlVGQmMwTkhMRWxCUVhSRExFVkJRVFJETkVJc1MwRkJOVU03UVVGQlVEdEJRVU5FT3p0QlFVVkVMRk5CUVU5QkxFdEJRVkE3UVVGRFJEczdRVUZGUkN4VFFVRlRka0lzWlVGQlZDeERRVUY1UWpCQ0xFdEJRWHBDTEVWQlFXZERPMEZCUXpsQ0xGTkJRVTlCTEUxQlFVMHpRaXhYUVVGT0xFbEJRWEZDTWtJc1RVRkJUVE5DTEZkQlFVNHNTMEZCYzBJeVFpeE5RVUZOZWtJc1YwRkJlRVE3UVVGRFJEczdRVUZGUkN4VFFVRlRSeXhYUVVGVUxFTkJRWEZDVGl4TFFVRnlRaXhGUVVFMFFrd3NTVUZCTlVJc1JVRkJhME5ETEUxQlFXeERMRVZCUVRCRE8wRkJRM2hETEUxQlFVbEVMRk5CUVZORExFMUJRV0lzUlVGQmNVSTdRVUZEYmtJc1YwRkJUMFFzU1VGQlVEdEJRVU5FTEVkQlJrUXNUVUZGVHp0QlFVTk1TeXhWUVVGTk5rSXNVVUZCVGl4SFFVRnBRaXhKUVVGcVFqdEJRVU5CTEZkQlFVOHNSVUZCUTJ4RExGVkJRVVFzUlVGQlQwTXNZMEZCVUN4RlFVRlFPMEZCUTBRN1FVRkRSanM3UVVGRlJDeFRRVUZUY1VJc1ZVRkJWQ3hEUVVGdlFsTXNTVUZCY0VJc1JVRkJNRUpKTEV0QlFURkNMRVZCUVdsRE8wRkJReTlDTEZOQlFVOUtMRXRCUVV0YUxGRkJRVXdzUjBGQlowSm5RaXhOUVVGTmFFSXNVVUZCZEVJc1NVRkRSRmtzUzBGQlMxb3NVVUZCVEN4SFFVRm5RbGtzUzBGQlMyeERMRkZCUVhSQ0xFZEJRV3REYzBNc1RVRkJUV2hDTEZGQlJEZERPMEZCUlVRN08wRkJSVVFzVTBGQlUwc3NVMEZCVkN4RFFVRnRRamxDTEVsQlFXNUNMRVZCUVhsQ01FTXNUVUZCZWtJc1JVRkJhVU03UVVGREwwSXNVMEZCVHp0QlFVTk1ha0lzWTBGQlZYcENMRXRCUVV0NVFpeFJRVVJXTEVWQlEyOUNkRUlzVlVGQlZVZ3NTMEZCUzBjc1VVRkVia003UVVGRlRDdENMR05CUVZWc1F5eExRVUZMYTBNc1VVRkJUQ3hIUVVGblFsRXNUVUZHY2tJc1JVRkZOa0owUXl4VlFVRlZTaXhMUVVGTFNTeFJRVVkxUXp0QlFVZE1SaXhYUVVGUFJpeExRVUZMUlR0QlFVaFFMRWRCUVZBN1FVRkxSRHM3UVVGRlJDeFRRVUZUYVVNc1ZVRkJWQ3hEUVVGdlFtNURMRWxCUVhCQ0xFVkJRVEJDY1VJc1ZVRkJNVUlzUlVGQmMwTnpRaXhUUVVGMFF5eEZRVUZwUkVNc1YwRkJha1FzUlVGQk9FUkRMRlZCUVRsRUxFVkJRVEJGTzBGQlEzaEZPMEZCUTBFN1FVRkRRU3hOUVVGSmRrTXNUMEZCVHl4RlFVRkRiME1zVVVGQlVYSkNMRlZCUVZRc1JVRkJjVUp1UWl4UFFVRlBlVU1zVTBGQk5VSXNSVUZCZFVOb1F5eFBRVUZQTEVOQlFUbERMRVZCUVZnN1FVRkJRU3hOUVVOSmJVTXNVVUZCVVN4RlFVRkRTaXhSUVVGUlJTeFhRVUZVTEVWQlFYTkNNVU1zVDBGQlR6SkRMRlZCUVRkQ0xFVkJRWGxEYkVNc1QwRkJUeXhEUVVGb1JDeEZRVVJhT3p0QlFVZEJPMEZCUTBGdlF5eG5Ra0ZCWXk5RExFbEJRV1FzUlVGQmIwSk5MRWxCUVhCQ0xFVkJRVEJDZDBNc1MwRkJNVUk3UVVGRFFVTXNaMEpCUVdNdlF5eEpRVUZrTEVWQlFXOUNPRU1zUzBGQmNFSXNSVUZCTWtKNFF5eEpRVUV6UWpzN1FVRkZRVHRCUVVOQkxGTkJRVTlCTEV0QlFVdExMRXRCUVV3c1IwRkJZVXdzUzBGQlMwb3NTMEZCVEN4RFFVRlhjVUlzVFVGQmVFSXNTVUZCYTBOMVFpeE5RVUZOYmtNc1MwRkJUaXhIUVVGamJVTXNUVUZCVFRWRExFdEJRVTRzUTBGQldYRkNMRTFCUVc1RkxFVkJRVEpGTzBGQlEzcEZMRkZCUVVsRExHTkJRV05zUWl4TFFVRkxTaXhMUVVGTUxFTkJRVmRKTEV0QlFVdExMRXRCUVdoQ0xFTkJRV3hDTzBGQlFVRXNVVUZEU1hGRExHVkJRV1ZHTEUxQlFVMDFReXhMUVVGT0xFTkJRVmswUXl4TlFVRk5ia01zUzBGQmJFSXNRMEZFYmtJN08wRkJSMEVzVVVGQlNTeERRVUZEWVN4WlFVRlpMRU5CUVZvc1RVRkJiVUlzUjBGQmJrSXNTVUZCTUVKQkxGbEJRVmtzUTBGQldpeE5RVUZ0UWl4SFFVRTVReXhOUVVOSmQwSXNZVUZCWVN4RFFVRmlMRTFCUVc5Q0xFZEJRWEJDTEVsQlFUSkNRU3hoUVVGaExFTkJRV0lzVFVGQmIwSXNSMEZFYmtRc1EwRkJTaXhGUVVNMlJEdEJRVU16UkR0QlFVTkJReXh0UWtGQllXcEVMRWxCUVdJc1JVRkJiVUpOTEVsQlFXNUNMRVZCUVhsQ2QwTXNTMEZCZWtJN1FVRkRSQ3hMUVVwRUxFMUJTVThzU1VGQlNYUkNMRmxCUVZrc1EwRkJXaXhOUVVGdFFpeEhRVUZ1UWl4SlFVRXdRbmRDTEdGQlFXRXNRMEZCWWl4TlFVRnZRaXhIUVVGc1JDeEZRVUYxUkR0QlFVRkJPenRCUVVGQkxEaENRVU0xUkR0QlFVTkJMREJGUVVGTE9VTXNTMEZCVEN4RlFVRlhNa0lzU1VGQldDdzBURUZCYjBKeFFpeGpRVUZqTlVNc1NVRkJaQ3hEUVVGd1FqdEJRVU5FTEV0QlNFMHNUVUZIUVN4SlFVRkpNRU1zWVVGQllTeERRVUZpTEUxQlFXOUNMRWRCUVhCQ0xFbEJRVEpDZUVJc1dVRkJXU3hEUVVGYUxFMUJRVzFDTEVkQlFXeEVMRVZCUVhWRU8wRkJRVUU3TzBGQlFVRXNPRUpCUXpWRU8wRkJRMEVzTWtWQlFVdDBRaXhMUVVGTUxFVkJRVmN5UWl4SlFVRllMRFpNUVVGdlFuRkNMR05CUVdOS0xFdEJRV1FzUTBGQmNFSTdRVUZEUkN4TFFVaE5MRTFCUjBFc1NVRkJTWFJDTEZsQlFWa3NRMEZCV2l4TlFVRnRRaXhIUVVGdVFpeEpRVUV3UW5kQ0xHRkJRV0VzUTBGQllpeE5RVUZ2UWl4SFFVRnNSQ3hGUVVGMVJEdEJRVU0xUkR0QlFVTkJSeXhqUVVGUmJrUXNTVUZCVWl4RlFVRmpUU3hKUVVGa0xFVkJRVzlDZDBNc1MwRkJjRUk3UVVGRFJDeExRVWhOTEUxQlIwRXNTVUZCU1VVc1lVRkJZU3hEUVVGaUxFMUJRVzlDTEVkQlFYQkNMRWxCUVRKQ2VFSXNXVUZCV1N4RFFVRmFMRTFCUVcxQ0xFZEJRV3hFTEVWQlFYVkVPMEZCUXpWRU8wRkJRMEV5UWl4alFVRlJia1FzU1VGQlVpeEZRVUZqT0VNc1MwRkJaQ3hGUVVGeFFuaERMRWxCUVhKQ0xFVkJRVEpDTEVsQlFUTkNPMEZCUTBRc1MwRklUU3hOUVVkQkxFbEJRVWxyUWl4blFrRkJaMEozUWl4WlFVRndRaXhGUVVGclF6dEJRVU4yUXp0QlFVTkJhRVFzVjBGQlMwVXNTMEZCVEN4RFFVRlhNa0lzU1VGQldDeERRVUZuUWt3c1YwRkJhRUk3UVVGRFFXeENMRmRCUVV0TExFdEJRVXc3UVVGRFFXMURMRmxCUVUxdVF5eExRVUZPTzBGQlEwUXNTMEZNVFN4TlFVdEJPMEZCUTB3N1FVRkRRVFpDTEdWQlFWTjRReXhKUVVGVUxFVkJRV1ZyUkN4alFVRmpOVU1zU1VGQlpDeERRVUZtTEVWQlFXOURORU1zWTBGQlkwb3NTMEZCWkN4RFFVRndRenRCUVVORU8wRkJRMFk3TzBGQlJVUTdRVUZEUVUwc2FVSkJRV1Z3UkN4SlFVRm1MRVZCUVhGQ1RTeEpRVUZ5UWp0QlFVTkJPRU1zYVVKQlFXVndSQ3hKUVVGbUxFVkJRWEZDT0VNc1MwRkJja0k3TzBGQlJVRm9SQ3huUWtGQlkwVXNTVUZCWkR0QlFVTkVPenRCUVVWRUxGTkJRVk5wUkN4WlFVRlVMRU5CUVhOQ2FrUXNTVUZCZEVJc1JVRkJORUpOTEVsQlFUVkNMRVZCUVd0RGQwTXNTMEZCYkVNc1JVRkJlVU03UVVGRGRrTXNUVUZCU1U4c1dVRkJXVWdzWTBGQll6VkRMRWxCUVdRc1EwRkJhRUk3UVVGQlFTeE5RVU5KWjBRc1pVRkJaVW9zWTBGQlkwb3NTMEZCWkN4RFFVUnVRanM3UVVGSFFTeE5RVUZKVXl4WFFVRlhSaXhUUVVGWUxFdEJRWGxDUlN4WFFVRlhSQ3haUVVGWUxFTkJRVGRDTEVWQlFYVkVPMEZCUTNKRU8wRkJRMEVzVVVGQlNTdzRSVUZCWjBKRUxGTkJRV2hDTEVWQlFUSkNReXhaUVVFelFpeExRVU5IUlN4dFFrRkJiVUpXTEV0QlFXNUNMRVZCUVRCQ1R5eFRRVUV4UWl4RlFVRnhRMEVzVlVGQlZUbENMRTFCUVZZc1IwRkJiVUlyUWl4aFFVRmhMMElzVFVGQmNrVXNRMEZFVUN4RlFVTnhSanRCUVVGQk96dEJRVUZCTERaQ1FVTnVSaXh6UlVGQlMzSkNMRXRCUVV3c1JVRkJWekpDTEVsQlFWZ3NOa3hCUVc5Q2QwSXNVMEZCY0VJN1FVRkRRVHRCUVVORUxFdEJTa1FzVFVGSlR5eEpRVUZKTERoRlFVRm5Ra01zV1VGQmFFSXNSVUZCT0VKRUxGTkJRVGxDTEV0QlEwcEhMRzFDUVVGdFFteEVMRWxCUVc1Q0xFVkJRWGxDWjBRc1dVRkJla0lzUlVGQmRVTkJMR0ZCUVdFdlFpeE5RVUZpTEVkQlFYTkNPRUlzVlVGQlZUbENMRTFCUVhaRkxFTkJSRUVzUlVGRFowWTdRVUZCUVRzN1FVRkJRU3cyUWtGRGNrWXNjMFZCUVV0eVFpeExRVUZNTEVWQlFWY3lRaXhKUVVGWUxEWk1RVUZ2UW5sQ0xGbEJRWEJDTzBGQlEwRTdRVUZEUkR0QlFVTkdMRWRCV0VRc1RVRlhUeXhKUVVGSkxIbEZRVUZYUkN4VFFVRllMRVZCUVhOQ1F5eFpRVUYwUWl4RFFVRktMRVZCUVhsRE8wRkJRVUU3TzBGQlFVRXNNa0pCUXpsRExITkZRVUZMY0VRc1MwRkJUQ3hGUVVGWE1rSXNTVUZCV0N3MlRFRkJiMEozUWl4VFFVRndRanRCUVVOQk8wRkJRMFE3TzBGQlJVUmlMRmRCUVZONFF5eEpRVUZVTEVWQlFXVnhSQ3hUUVVGbUxFVkJRVEJDUXl4WlFVRXhRanRCUVVORU96dEJRVVZFTEZOQlFWTklMRTlCUVZRc1EwRkJhVUp1UkN4SlFVRnFRaXhGUVVGMVFrMHNTVUZCZGtJc1JVRkJOa0ozUXl4TFFVRTNRaXhGUVVGdlExY3NTVUZCY0VNc1JVRkJNRU03UVVGRGVFTXNUVUZCU1Vvc1dVRkJXVWdzWTBGQll6VkRMRWxCUVdRc1EwRkJhRUk3UVVGQlFTeE5RVU5KWjBRc1pVRkJaVWtzWlVGQlpWb3NTMEZCWml4RlFVRnpRazhzVTBGQmRFSXNRMEZFYmtJN1FVRkZRU3hOUVVGSlF5eGhRVUZoU3l4TlFVRnFRaXhGUVVGNVFqdEJRVUZCT3p0QlFVRkJMREpDUVVOMlFpeHpSVUZCUzNwRUxFdEJRVXdzUlVGQlZ6SkNMRWxCUVZnc05reEJRVzlDZVVJc1lVRkJZVXNzVFVGQmFrTTdRVUZEUkN4SFFVWkVMRTFCUlU4N1FVRkRURzVDTEdGQlFWTjRReXhKUVVGVUxFVkJRV1Y1UkN4UFFVRlBTQ3haUVVGUUxFZEJRWE5DUkN4VFFVRnlReXhGUVVGblJFa3NUMEZCVDBvc1UwRkJVQ3hIUVVGdFFrTXNXVUZCYmtVN1FVRkRSRHRCUVVOR096dEJRVVZFTEZOQlFWTmtMRkZCUVZRc1EwRkJhMEo0UXl4SlFVRnNRaXhGUVVGM1FrMHNTVUZCZUVJc1JVRkJPRUozUXl4TFFVRTVRaXhGUVVGeFF6dEJRVU51UXpsRExFOUJRVXQzUXl4UlFVRk1MRWRCUVdkQ0xFbEJRV2hDTzBGQlEwRjRReXhQUVVGTFJTeExRVUZNTEVOQlFWY3lRaXhKUVVGWUxFTkJRV2RDTzBGQlEyUlhMR05CUVZVc1NVRkVTVHRCUVVWa2JFTXNWVUZCVFVFc1NVRkdVVHRCUVVka1F5eFpRVUZSZFVNN1FVRklUU3hIUVVGb1FqdEJRVXRFT3p0QlFVVkVMRk5CUVZORExHRkJRVlFzUTBGQmRVSXZReXhKUVVGMlFpeEZRVUUyUWpSRUxFMUJRVGRDTEVWQlFYRkRaQ3hMUVVGeVF5eEZRVUUwUXp0QlFVTXhReXhUUVVGUFl5eFBRVUZQYkVJc1RVRkJVQ3hIUVVGblFra3NUVUZCVFVvc1RVRkJkRUlzU1VGQlowTnJRaXhQUVVGUGFrUXNTMEZCVUN4SFFVRmxhVVFzVDBGQlR6RkVMRXRCUVZBc1EwRkJZWEZDTEUxQlFXNUZMRVZCUVRKRk8wRkJRM3BGTEZGQlFVbHpReXhQUVVGUFJDeFBRVUZQTVVRc1MwRkJVQ3hEUVVGaE1FUXNUMEZCVDJwRUxFdEJRVkFzUlVGQllpeERRVUZZTzBGQlEwRllMRk5CUVV0RkxFdEJRVXdzUTBGQlZ6SkNMRWxCUVZnc1EwRkJaMEpuUXl4SlFVRm9RanRCUVVOQlJDeFhRVUZQYkVJc1RVRkJVRHRCUVVORU8wRkJRMFk3UVVGRFJDeFRRVUZUVlN4alFVRlVMRU5CUVhkQ2NFUXNTVUZCZUVJc1JVRkJPRUkwUkN4TlFVRTVRaXhGUVVGelF6dEJRVU53UXl4VFFVRlBRU3hQUVVGUGFrUXNTMEZCVUN4SFFVRmxhVVFzVDBGQlR6RkVMRXRCUVZBc1EwRkJZWEZDTEUxQlFXNURMRVZCUVRKRE8wRkJRM3BETEZGQlFVbHpReXhQUVVGUFJDeFBRVUZQTVVRc1MwRkJVQ3hEUVVGaE1FUXNUMEZCVDJwRUxFdEJRVkFzUlVGQllpeERRVUZZTzBGQlEwRllMRk5CUVV0RkxFdEJRVXdzUTBGQlZ6SkNMRWxCUVZnc1EwRkJaMEpuUXl4SlFVRm9RanRCUVVORU8wRkJRMFk3TzBGQlJVUXNVMEZCVTFnc1lVRkJWQ3hEUVVGMVFsa3NTMEZCZGtJc1JVRkJPRUk3UVVGRE5VSXNUVUZCU1hCRUxFMUJRVTBzUlVGQlZqdEJRVUZCTEUxQlEwbHhSQ3haUVVGWlJDeE5RVUZOTlVRc1MwRkJUaXhEUVVGWk5FUXNUVUZCVFc1RUxFdEJRV3hDTEVWQlFYbENMRU5CUVhwQ0xFTkJSR2hDTzBGQlJVRXNVMEZCVDIxRUxFMUJRVTF1UkN4TFFVRk9MRWRCUVdOdFJDeE5RVUZOTlVRc1MwRkJUaXhEUVVGWmNVSXNUVUZCYWtNc1JVRkJlVU03UVVGRGRrTXNVVUZCU1hORExFOUJRVTlETEUxQlFVMDFSQ3hMUVVGT0xFTkJRVmswUkN4TlFVRk5ia1FzUzBGQmJFSXNRMEZCV0RzN1FVRkZRVHRCUVVOQkxGRkJRVWx2UkN4alFVRmpMRWRCUVdRc1NVRkJjVUpHTEV0QlFVc3NRMEZCVEN4TlFVRlpMRWRCUVhKRExFVkJRVEJETzBGQlEzaERSU3hyUWtGQldTeEhRVUZhTzBGQlEwUTdPMEZCUlVRc1VVRkJTVUVzWTBGQlkwWXNTMEZCU3l4RFFVRk1MRU5CUVd4Q0xFVkJRVEpDTzBGQlEzcENia1FzVlVGQlNXMUNMRWxCUVVvc1EwRkJVMmRETEVsQlFWUTdRVUZEUVVNc1dVRkJUVzVFTEV0QlFVNDdRVUZEUkN4TFFVaEVMRTFCUjA4N1FVRkRURHRCUVVORU8wRkJRMFk3TzBGQlJVUXNVMEZCVDBRc1IwRkJVRHRCUVVORU8wRkJRMFFzVTBGQlUyZEVMR05CUVZRc1EwRkJkMEpKTEV0QlFYaENMRVZCUVN0Q1JTeFpRVUV2UWl4RlFVRTJRenRCUVVNelF5eE5RVUZKUXl4VlFVRlZMRVZCUVdRN1FVRkJRU3hOUVVOSlRpeFRRVUZUTEVWQlJHSTdRVUZCUVN4TlFVVkpUeXhoUVVGaExFTkJSbXBDTzBGQlFVRXNUVUZIU1VNc2FVSkJRV2xDTEV0QlNISkNPMEZCUVVFc1RVRkpTVU1zWVVGQllTeExRVXBxUWp0QlFVdEJMRk5CUVU5R0xHRkJRV0ZHTEdGQlFXRjZReXhOUVVFeFFpeEpRVU5GZFVNc1RVRkJUVzVFTEV0QlFVNHNSMEZCWTIxRUxFMUJRVTAxUkN4TFFVRk9MRU5CUVZseFFpeE5RVVJ1UXl4RlFVTXlRenRCUVVONlF5eFJRVUZKT0VNc1UwRkJVMUFzVFVGQlRUVkVMRXRCUVU0c1EwRkJXVFJFTEUxQlFVMXVSQ3hMUVVGc1FpeERRVUZpTzBGQlFVRXNVVUZEU1RKRUxGRkJRVkZPTEdGQlFXRkZMRlZCUVdJc1EwRkVXanM3UVVGSFFUdEJRVU5CTEZGQlFVbEpMRTFCUVUwc1EwRkJUaXhOUVVGaExFZEJRV3BDTEVWQlFYTkNPMEZCUTNCQ08wRkJRMFE3TzBGQlJVUklMSEZDUVVGcFFrRXNhMEpCUVd0Q1JTeFBRVUZQTEVOQlFWQXNUVUZCWXl4SFFVRnFSRHM3UVVGRlFWWXNWMEZCVHpsQ0xFbEJRVkFzUTBGQldYbERMRXRCUVZvN1FVRkRRVW83TzBGQlJVRTdRVUZEUVR0QlFVTkJMRkZCUVVsSExFOUJRVThzUTBGQlVDeE5RVUZqTEVkQlFXeENMRVZCUVhWQ08wRkJRM0pDUkN4dFFrRkJZU3hKUVVGaU96dEJRVVZCTEdGQlFVOURMRTlCUVU4c1EwRkJVQ3hOUVVGakxFZEJRWEpDTEVWQlFUQkNPMEZCUTNoQ1NpeG5Ra0ZCVVhCRExFbEJRVklzUTBGQllYZERMRTFCUVdJN1FVRkRRVUVzYVVKQlFWTlFMRTFCUVUwMVJDeExRVUZPTEVOQlFWa3NSVUZCUlRSRUxFMUJRVTF1UkN4TFFVRndRaXhEUVVGVU8wRkJRMFE3UVVGRFJqczdRVUZGUkN4UlFVRkpNa1FzVFVGQlRVTXNUVUZCVGl4RFFVRmhMRU5CUVdJc1RVRkJiMEpHTEU5QlFVOUZMRTFCUVZBc1EwRkJZeXhEUVVGa0xFTkJRWGhDTEVWQlFUQkRPMEZCUTNoRFRpeGpRVUZSY0VNc1NVRkJVaXhEUVVGaGQwTXNUVUZCWWp0QlFVTkJVQ3haUVVGTmJrUXNTMEZCVGp0QlFVTkVMRXRCU0VRc1RVRkhUenRCUVVOTWVVUXNiVUpCUVdFc1NVRkJZanRCUVVORU8wRkJRMFk3TzBGQlJVUXNUVUZCU1N4RFFVRkRTaXhoUVVGaFJTeFZRVUZpTEV0QlFUUkNMRVZCUVRkQ0xFVkJRV2xETEVOQlFXcERMRTFCUVhkRExFZEJRWGhETEVsQlEwZERMR05CUkZBc1JVRkRkVUk3UVVGRGNrSkRMR2xDUVVGaExFbEJRV0k3UVVGRFJEczdRVUZGUkN4TlFVRkpRU3hWUVVGS0xFVkJRV2RDTzBGQlEyUXNWMEZCVDBnc1QwRkJVRHRCUVVORU96dEJRVVZFTEZOQlFVOURMR0ZCUVdGR0xHRkJRV0Y2UXl4TlFVRnFReXhGUVVGNVF6dEJRVU4yUTI5RExGZEJRVTg1UWl4SlFVRlFMRU5CUVZsdFF5eGhRVUZoUlN4WlFVRmlMRU5CUVZvN1FVRkRSRHM3UVVGRlJDeFRRVUZQTzBGQlEweFFMR3RDUVVSTE8wRkJSVXhOTzBGQlJrc3NSMEZCVUR0QlFVbEVPenRCUVVWRUxGTkJRVk5XTEZWQlFWUXNRMEZCYjBKVkxFOUJRWEJDTEVWQlFUWkNPMEZCUXpOQ0xGTkJRVTlCTEZGQlFWRlBMRTFCUVZJc1EwRkJaU3hWUVVGVFF5eEpRVUZVTEVWQlFXVktMRTFCUVdZc1JVRkJkVUk3UVVGRE0wTXNWMEZCVDBrc1VVRkJVVW9zVDBGQlR5eERRVUZRTEUxQlFXTXNSMEZCTjBJN1FVRkRSQ3hIUVVaTkxFVkJSVW9zU1VGR1NTeERRVUZRTzBGQlIwUTdRVUZEUkN4VFFVRlRZaXhyUWtGQlZDeERRVUUwUWswc1MwRkJOVUlzUlVGQmJVTlpMR0ZCUVc1RExFVkJRV3RFUXl4TFFVRnNSQ3hGUVVGNVJEdEJRVU4yUkN4UFFVRkxMRWxCUVVsRExFbEJRVWtzUTBGQllpeEZRVUZuUWtFc1NVRkJTVVFzUzBGQmNFSXNSVUZCTWtKRExFZEJRVE5DTEVWQlFXZERPMEZCUXpsQ0xGRkJRVWxETEdkQ1FVRm5Ra2dzWTBGQlkwRXNZMEZCWTI1RUxFMUJRV1FzUjBGQmRVSnZSQ3hMUVVGMlFpeEhRVUVyUWtNc1EwRkJOME1zUlVGQlowUk1MRTFCUVdoRUxFTkJRWFZFTEVOQlFYWkVMRU5CUVhCQ08wRkJRMEVzVVVGQlNWUXNUVUZCVFRWRUxFdEJRVTRzUTBGQldUUkVMRTFCUVUxdVJDeExRVUZPTEVkQlFXTnBSU3hEUVVFeFFpeE5RVUZwUXl4TlFVRk5ReXhoUVVFelF5eEZRVUV3UkR0QlFVTjRSQ3hoUVVGUExFdEJRVkE3UVVGRFJEdEJRVU5HT3p0QlFVVkVaaXhSUVVGTmJrUXNTMEZCVGl4SlFVRmxaMFVzUzBGQlpqdEJRVU5CTEZOQlFVOHNTVUZCVUR0QlFVTkVPenRCUVVWRUxGTkJRVk14UlN4dFFrRkJWQ3hEUVVFMlFrTXNTMEZCTjBJc1JVRkJiME03UVVGRGJFTXNUVUZCU1VNc1YwRkJWeXhEUVVGbU8wRkJRMEVzVFVGQlNVTXNWMEZCVnl4RFFVRm1PenRCUVVWQlJpeFJRVUZOTkVVc1QwRkJUaXhEUVVGakxGVkJRVk5xUWl4SlFVRlVMRVZCUVdVN1FVRkRNMElzVVVGQlNTeFBRVUZQUVN4SlFVRlFMRXRCUVdkQ0xGRkJRWEJDTEVWQlFUaENPMEZCUXpWQ0xGVkJRVWxyUWl4VlFVRlZPVVVzYjBKQlFXOUNORVFzUzBGQlMzWkVMRWxCUVhwQ0xFTkJRV1E3UVVGRFFTeFZRVUZKTUVVc1lVRkJZUzlGTEc5Q1FVRnZRalJFTEV0QlFVdDBSQ3hOUVVGNlFpeERRVUZxUWpzN1FVRkZRU3hWUVVGSlNpeGhRVUZoUlN4VFFVRnFRaXhGUVVFMFFqdEJRVU14UWl4WlFVRkpNRVVzVVVGQlVUVkZMRkZCUVZJc1MwRkJjVUkyUlN4WFFVRlhOMFVzVVVGQmNFTXNSVUZCT0VNN1FVRkROVU5CTEhOQ1FVRlpORVVzVVVGQlVUVkZMRkZCUVhCQ08wRkJRMFFzVTBGR1JDeE5RVVZQTzBGQlEweEJMSEZDUVVGWFJTeFRRVUZZTzBGQlEwUTdRVUZEUmpzN1FVRkZSQ3hWUVVGSlJDeGhRVUZoUXl4VFFVRnFRaXhGUVVFMFFqdEJRVU14UWl4WlFVRkpNRVVzVVVGQlVUTkZMRkZCUVZJc1MwRkJjVUkwUlN4WFFVRlhOVVVzVVVGQmNFTXNSVUZCT0VNN1FVRkROVU5CTEhOQ1FVRlpNa1VzVVVGQlVUTkZMRkZCUVhCQ08wRkJRMFFzVTBGR1JDeE5RVVZQTzBGQlEweEJMSEZDUVVGWFF5eFRRVUZZTzBGQlEwUTdRVUZEUmp0QlFVTkdMRXRCYmtKRUxFMUJiVUpQTzBGQlEwd3NWVUZCU1VRc1lVRkJZVU1zVTBGQllpeExRVUV5UW5kRUxFdEJRVXNzUTBGQlRDeE5RVUZaTEVkQlFWb3NTVUZCYlVKQkxFdEJRVXNzUTBGQlRDeE5RVUZaTEVkQlFURkVMRU5CUVVvc1JVRkJiMFU3UVVGRGJFVjZSRHRCUVVORU8wRkJRMFFzVlVGQlNVUXNZVUZCWVVVc1UwRkJZaXhMUVVFeVFuZEVMRXRCUVVzc1EwRkJUQ3hOUVVGWkxFZEJRVm9zU1VGQmJVSkJMRXRCUVVzc1EwRkJUQ3hOUVVGWkxFZEJRVEZFTEVOQlFVb3NSVUZCYjBVN1FVRkRiRVV4UkR0QlFVTkVPMEZCUTBZN1FVRkRSaXhIUVRWQ1JEczdRVUU0UWtFc1UwRkJUeXhGUVVGRFFTeHJRa0ZCUkN4RlFVRlhReXhyUWtGQldDeEZRVUZRTzBGQlEwUWlMQ0ptYVd4bElqb2liV1Z5WjJVdWFuTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUpwYlhCdmNuUWdlM04wY25WamRIVnlaV1JRWVhSamFIMGdabkp2YlNBbkxpOWpjbVZoZEdVbk8xeHVhVzF3YjNKMElIdHdZWEp6WlZCaGRHTm9mU0JtY205dElDY3VMM0JoY25ObEp6dGNibHh1YVcxd2IzSjBJSHRoY25KaGVVVnhkV0ZzTENCaGNuSmhlVk4wWVhKMGMxZHBkR2g5SUdaeWIyMGdKeTR1TDNWMGFXd3ZZWEp5WVhrbk8xeHVYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdZMkZzWTB4cGJtVkRiM1Z1ZENob2RXNXJLU0I3WEc0Z0lHTnZibk4wSUh0dmJHUk1hVzVsY3l3Z2JtVjNUR2x1WlhOOUlEMGdZMkZzWTA5c1pFNWxkMHhwYm1WRGIzVnVkQ2hvZFc1ckxteHBibVZ6S1R0Y2JseHVJQ0JwWmlBb2IyeGtUR2x1WlhNZ0lUMDlJSFZ1WkdWbWFXNWxaQ2tnZTF4dUlDQWdJR2gxYm1zdWIyeGtUR2x1WlhNZ1BTQnZiR1JNYVc1bGN6dGNiaUFnZlNCbGJITmxJSHRjYmlBZ0lDQmtaV3hsZEdVZ2FIVnVheTV2YkdSTWFXNWxjenRjYmlBZ2ZWeHVYRzRnSUdsbUlDaHVaWGRNYVc1bGN5QWhQVDBnZFc1a1pXWnBibVZrS1NCN1hHNGdJQ0FnYUhWdWF5NXVaWGRNYVc1bGN5QTlJRzVsZDB4cGJtVnpPMXh1SUNCOUlHVnNjMlVnZTF4dUlDQWdJR1JsYkdWMFpTQm9kVzVyTG01bGQweHBibVZ6TzF4dUlDQjlYRzU5WEc1Y2JtVjRjRzl5ZENCbWRXNWpkR2x2YmlCdFpYSm5aU2h0YVc1bExDQjBhR1ZwY25Nc0lHSmhjMlVwSUh0Y2JpQWdiV2x1WlNBOUlHeHZZV1JRWVhSamFDaHRhVzVsTENCaVlYTmxLVHRjYmlBZ2RHaGxhWEp6SUQwZ2JHOWhaRkJoZEdOb0tIUm9aV2x5Y3l3Z1ltRnpaU2s3WEc1Y2JpQWdiR1YwSUhKbGRDQTlJSHQ5TzF4dVhHNGdJQzh2SUVadmNpQnBibVJsZUNCM1pTQnFkWE4wSUd4bGRDQnBkQ0J3WVhOeklIUm9jbTkxWjJnZ1lYTWdhWFFnWkc5bGMyNG5kQ0JvWVhabElHRnVlU0J1WldObGMzTmhjbmtnYldWaGJtbHVaeTVjYmlBZ0x5OGdUR1ZoZG1sdVp5QnpZVzVwZEhrZ1kyaGxZMnR6SUc5dUlIUm9hWE1nZEc4Z2RHaGxJRUZRU1NCamIyNXpkVzFsY2lCMGFHRjBJRzFoZVNCcmJtOTNJRzF2Y21VZ1lXSnZkWFFnZEdobFhHNGdJQzh2SUcxbFlXNXBibWNnYVc0Z2RHaGxhWElnYjNkdUlHTnZiblJsZUhRdVhHNGdJR2xtSUNodGFXNWxMbWx1WkdWNElIeDhJSFJvWldseWN5NXBibVJsZUNrZ2UxeHVJQ0FnSUhKbGRDNXBibVJsZUNBOUlHMXBibVV1YVc1a1pYZ2dmSHdnZEdobGFYSnpMbWx1WkdWNE8xeHVJQ0I5WEc1Y2JpQWdhV1lnS0cxcGJtVXVibVYzUm1sc1pVNWhiV1VnZkh3Z2RHaGxhWEp6TG01bGQwWnBiR1ZPWVcxbEtTQjdYRzRnSUNBZ2FXWWdLQ0ZtYVd4bFRtRnRaVU5vWVc1blpXUW9iV2x1WlNrcElIdGNiaUFnSUNBZ0lDOHZJRTV2SUdobFlXUmxjaUJ2Y2lCdWJ5QmphR0Z1WjJVZ2FXNGdiM1Z5Y3l3Z2RYTmxJSFJvWldseWN5QW9ZVzVrSUc5MWNuTWdhV1lnZEdobGFYSnpJR1J2WlhNZ2JtOTBJR1Y0YVhOMEtWeHVJQ0FnSUNBZ2NtVjBMbTlzWkVacGJHVk9ZVzFsSUQwZ2RHaGxhWEp6TG05c1pFWnBiR1ZPWVcxbElIeDhJRzFwYm1VdWIyeGtSbWxzWlU1aGJXVTdYRzRnSUNBZ0lDQnlaWFF1Ym1WM1JtbHNaVTVoYldVZ1BTQjBhR1ZwY25NdWJtVjNSbWxzWlU1aGJXVWdmSHdnYldsdVpTNXVaWGRHYVd4bFRtRnRaVHRjYmlBZ0lDQWdJSEpsZEM1dmJHUklaV0ZrWlhJZ1BTQjBhR1ZwY25NdWIyeGtTR1ZoWkdWeUlIeDhJRzFwYm1VdWIyeGtTR1ZoWkdWeU8xeHVJQ0FnSUNBZ2NtVjBMbTVsZDBobFlXUmxjaUE5SUhSb1pXbHljeTV1WlhkSVpXRmtaWElnZkh3Z2JXbHVaUzV1WlhkSVpXRmtaWEk3WEc0Z0lDQWdmU0JsYkhObElHbG1JQ2doWm1sc1pVNWhiV1ZEYUdGdVoyVmtLSFJvWldseWN5a3BJSHRjYmlBZ0lDQWdJQzh2SUU1dklHaGxZV1JsY2lCdmNpQnVieUJqYUdGdVoyVWdhVzRnZEdobGFYSnpMQ0IxYzJVZ2IzVnljMXh1SUNBZ0lDQWdjbVYwTG05c1pFWnBiR1ZPWVcxbElEMGdiV2x1WlM1dmJHUkdhV3hsVG1GdFpUdGNiaUFnSUNBZ0lISmxkQzV1WlhkR2FXeGxUbUZ0WlNBOUlHMXBibVV1Ym1WM1JtbHNaVTVoYldVN1hHNGdJQ0FnSUNCeVpYUXViMnhrU0dWaFpHVnlJRDBnYldsdVpTNXZiR1JJWldGa1pYSTdYRzRnSUNBZ0lDQnlaWFF1Ym1WM1NHVmhaR1Z5SUQwZ2JXbHVaUzV1WlhkSVpXRmtaWEk3WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDOHZJRUp2ZEdnZ1kyaGhibWRsWkM0dUxpQm1hV2QxY21VZ2FYUWdiM1YwWEc0Z0lDQWdJQ0J5WlhRdWIyeGtSbWxzWlU1aGJXVWdQU0J6Wld4bFkzUkdhV1ZzWkNoeVpYUXNJRzFwYm1VdWIyeGtSbWxzWlU1aGJXVXNJSFJvWldseWN5NXZiR1JHYVd4bFRtRnRaU2s3WEc0Z0lDQWdJQ0J5WlhRdWJtVjNSbWxzWlU1aGJXVWdQU0J6Wld4bFkzUkdhV1ZzWkNoeVpYUXNJRzFwYm1VdWJtVjNSbWxzWlU1aGJXVXNJSFJvWldseWN5NXVaWGRHYVd4bFRtRnRaU2s3WEc0Z0lDQWdJQ0J5WlhRdWIyeGtTR1ZoWkdWeUlEMGdjMlZzWldOMFJtbGxiR1FvY21WMExDQnRhVzVsTG05c1pFaGxZV1JsY2l3Z2RHaGxhWEp6TG05c1pFaGxZV1JsY2lrN1hHNGdJQ0FnSUNCeVpYUXVibVYzU0dWaFpHVnlJRDBnYzJWc1pXTjBSbWxsYkdRb2NtVjBMQ0J0YVc1bExtNWxkMGhsWVdSbGNpd2dkR2hsYVhKekxtNWxkMGhsWVdSbGNpazdYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdjbVYwTG1oMWJtdHpJRDBnVzEwN1hHNWNiaUFnYkdWMElHMXBibVZKYm1SbGVDQTlJREFzWEc0Z0lDQWdJQ0IwYUdWcGNuTkpibVJsZUNBOUlEQXNYRzRnSUNBZ0lDQnRhVzVsVDJabWMyVjBJRDBnTUN4Y2JpQWdJQ0FnSUhSb1pXbHljMDltWm5ObGRDQTlJREE3WEc1Y2JpQWdkMmhwYkdVZ0tHMXBibVZKYm1SbGVDQThJRzFwYm1VdWFIVnVhM011YkdWdVozUm9JSHg4SUhSb1pXbHljMGx1WkdWNElEd2dkR2hsYVhKekxtaDFibXR6TG14bGJtZDBhQ2tnZTF4dUlDQWdJR3hsZENCdGFXNWxRM1Z5Y21WdWRDQTlJRzFwYm1VdWFIVnVhM05iYldsdVpVbHVaR1Y0WFNCOGZDQjdiMnhrVTNSaGNuUTZJRWx1Wm1sdWFYUjVmU3hjYmlBZ0lDQWdJQ0FnZEdobGFYSnpRM1Z5Y21WdWRDQTlJSFJvWldseWN5NW9kVzVyYzF0MGFHVnBjbk5KYm1SbGVGMGdmSHdnZTI5c1pGTjBZWEowT2lCSmJtWnBibWwwZVgwN1hHNWNiaUFnSUNCcFppQW9hSFZ1YTBKbFptOXlaU2h0YVc1bFEzVnljbVZ1ZEN3Z2RHaGxhWEp6UTNWeWNtVnVkQ2twSUh0Y2JpQWdJQ0FnSUM4dklGUm9hWE1nY0dGMFkyZ2daRzlsY3lCdWIzUWdiM1psY214aGNDQjNhWFJvSUdGdWVTQnZaaUIwYUdVZ2IzUm9aWEp6TENCNVlYa3VYRzRnSUNBZ0lDQnlaWFF1YUhWdWEzTXVjSFZ6YUNoamJHOXVaVWgxYm1zb2JXbHVaVU4xY25KbGJuUXNJRzFwYm1WUFptWnpaWFFwS1R0Y2JpQWdJQ0FnSUcxcGJtVkpibVJsZUNzck8xeHVJQ0FnSUNBZ2RHaGxhWEp6VDJabWMyVjBJQ3M5SUcxcGJtVkRkWEp5Wlc1MExtNWxkMHhwYm1WeklDMGdiV2x1WlVOMWNuSmxiblF1YjJ4a1RHbHVaWE03WEc0Z0lDQWdmU0JsYkhObElHbG1JQ2hvZFc1clFtVm1iM0psS0hSb1pXbHljME4xY25KbGJuUXNJRzFwYm1WRGRYSnlaVzUwS1NrZ2UxeHVJQ0FnSUNBZ0x5OGdWR2hwY3lCd1lYUmphQ0JrYjJWeklHNXZkQ0J2ZG1WeWJHRndJSGRwZEdnZ1lXNTVJRzltSUhSb1pTQnZkR2hsY25Nc0lIbGhlUzVjYmlBZ0lDQWdJSEpsZEM1b2RXNXJjeTV3ZFhOb0tHTnNiMjVsU0hWdWF5aDBhR1ZwY25ORGRYSnlaVzUwTENCMGFHVnBjbk5QWm1aelpYUXBLVHRjYmlBZ0lDQWdJSFJvWldseWMwbHVaR1Y0S3lzN1hHNGdJQ0FnSUNCdGFXNWxUMlptYzJWMElDczlJSFJvWldseWMwTjFjbkpsYm5RdWJtVjNUR2x1WlhNZ0xTQjBhR1ZwY25ORGRYSnlaVzUwTG05c1pFeHBibVZ6TzF4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQXZMeUJQZG1WeWJHRndMQ0J0WlhKblpTQmhjeUJpWlhOMElIZGxJR05oYmx4dUlDQWdJQ0FnYkdWMElHMWxjbWRsWkVoMWJtc2dQU0I3WEc0Z0lDQWdJQ0FnSUc5c1pGTjBZWEowT2lCTllYUm9MbTFwYmlodGFXNWxRM1Z5Y21WdWRDNXZiR1JUZEdGeWRDd2dkR2hsYVhKelEzVnljbVZ1ZEM1dmJHUlRkR0Z5ZENrc1hHNGdJQ0FnSUNBZ0lHOXNaRXhwYm1Wek9pQXdMRnh1SUNBZ0lDQWdJQ0J1WlhkVGRHRnlkRG9nVFdGMGFDNXRhVzRvYldsdVpVTjFjbkpsYm5RdWJtVjNVM1JoY25RZ0t5QnRhVzVsVDJabWMyVjBMQ0IwYUdWcGNuTkRkWEp5Wlc1MExtOXNaRk4wWVhKMElDc2dkR2hsYVhKelQyWm1jMlYwS1N4Y2JpQWdJQ0FnSUNBZ2JtVjNUR2x1WlhNNklEQXNYRzRnSUNBZ0lDQWdJR3hwYm1Wek9pQmJYVnh1SUNBZ0lDQWdmVHRjYmlBZ0lDQWdJRzFsY21kbFRHbHVaWE1vYldWeVoyVmtTSFZ1YXl3Z2JXbHVaVU4xY25KbGJuUXViMnhrVTNSaGNuUXNJRzFwYm1WRGRYSnlaVzUwTG14cGJtVnpMQ0IwYUdWcGNuTkRkWEp5Wlc1MExtOXNaRk4wWVhKMExDQjBhR1ZwY25ORGRYSnlaVzUwTG14cGJtVnpLVHRjYmlBZ0lDQWdJSFJvWldseWMwbHVaR1Y0S3lzN1hHNGdJQ0FnSUNCdGFXNWxTVzVrWlhnckt6dGNibHh1SUNBZ0lDQWdjbVYwTG1oMWJtdHpMbkIxYzJnb2JXVnlaMlZrU0hWdWF5azdYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdjbVYwZFhKdUlISmxkRHRjYm4xY2JseHVablZ1WTNScGIyNGdiRzloWkZCaGRHTm9LSEJoY21GdExDQmlZWE5sS1NCN1hHNGdJR2xtSUNoMGVYQmxiMllnY0dGeVlXMGdQVDA5SUNkemRISnBibWNuS1NCN1hHNGdJQ0FnYVdZZ0tDOWVRRUF2YlM1MFpYTjBLSEJoY21GdEtTQjhmQ0FvTDE1SmJtUmxlRG92YlM1MFpYTjBLSEJoY21GdEtTa3BJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQndZWEp6WlZCaGRHTm9LSEJoY21GdEtWc3dYVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQnBaaUFvSVdKaGMyVXBJSHRjYmlBZ0lDQWdJSFJvY205M0lHNWxkeUJGY25KdmNpZ25UWFZ6ZENCd2NtOTJhV1JsSUdFZ1ltRnpaU0J5WldabGNtVnVZMlVnYjNJZ2NHRnpjeUJwYmlCaElIQmhkR05vSnlrN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQnpkSEoxWTNSMWNtVmtVR0YwWTJnb2RXNWtaV1pwYm1Wa0xDQjFibVJsWm1sdVpXUXNJR0poYzJVc0lIQmhjbUZ0S1R0Y2JpQWdmVnh1WEc0Z0lISmxkSFZ5YmlCd1lYSmhiVHRjYm4xY2JseHVablZ1WTNScGIyNGdabWxzWlU1aGJXVkRhR0Z1WjJWa0tIQmhkR05vS1NCN1hHNGdJSEpsZEhWeWJpQndZWFJqYUM1dVpYZEdhV3hsVG1GdFpTQW1KaUJ3WVhSamFDNXVaWGRHYVd4bFRtRnRaU0FoUFQwZ2NHRjBZMmd1YjJ4a1JtbHNaVTVoYldVN1hHNTlYRzVjYm1aMWJtTjBhVzl1SUhObGJHVmpkRVpwWld4a0tHbHVaR1Y0TENCdGFXNWxMQ0IwYUdWcGNuTXBJSHRjYmlBZ2FXWWdLRzFwYm1VZ1BUMDlJSFJvWldseWN5a2dlMXh1SUNBZ0lISmxkSFZ5YmlCdGFXNWxPMXh1SUNCOUlHVnNjMlVnZTF4dUlDQWdJR2x1WkdWNExtTnZibVpzYVdOMElEMGdkSEoxWlR0Y2JpQWdJQ0J5WlhSMWNtNGdlMjFwYm1Vc0lIUm9aV2x5YzMwN1hHNGdJSDFjYm4xY2JseHVablZ1WTNScGIyNGdhSFZ1YTBKbFptOXlaU2gwWlhOMExDQmphR1ZqYXlrZ2UxeHVJQ0J5WlhSMWNtNGdkR1Z6ZEM1dmJHUlRkR0Z5ZENBOElHTm9aV05yTG05c1pGTjBZWEowWEc0Z0lDQWdKaVlnS0hSbGMzUXViMnhrVTNSaGNuUWdLeUIwWlhOMExtOXNaRXhwYm1WektTQThJR05vWldOckxtOXNaRk4wWVhKME8xeHVmVnh1WEc1bWRXNWpkR2x2YmlCamJHOXVaVWgxYm1zb2FIVnVheXdnYjJabWMyVjBLU0I3WEc0Z0lISmxkSFZ5YmlCN1hHNGdJQ0FnYjJ4a1UzUmhjblE2SUdoMWJtc3ViMnhrVTNSaGNuUXNJRzlzWkV4cGJtVnpPaUJvZFc1ckxtOXNaRXhwYm1WekxGeHVJQ0FnSUc1bGQxTjBZWEowT2lCb2RXNXJMbTVsZDFOMFlYSjBJQ3NnYjJabWMyVjBMQ0J1WlhkTWFXNWxjem9nYUhWdWF5NXVaWGRNYVc1bGN5eGNiaUFnSUNCc2FXNWxjem9nYUhWdWF5NXNhVzVsYzF4dUlDQjlPMXh1ZlZ4dVhHNW1kVzVqZEdsdmJpQnRaWEpuWlV4cGJtVnpLR2gxYm1zc0lHMXBibVZQWm1aelpYUXNJRzFwYm1WTWFXNWxjeXdnZEdobGFYSlBabVp6WlhRc0lIUm9aV2x5VEdsdVpYTXBJSHRjYmlBZ0x5OGdWR2hwY3lCM2FXeHNJR2RsYm1WeVlXeHNlU0J5WlhOMWJIUWdhVzRnWVNCamIyNW1iR2xqZEdWa0lHaDFibXNzSUdKMWRDQjBhR1Z5WlNCaGNtVWdZMkZ6WlhNZ2QyaGxjbVVnZEdobElHTnZiblJsZUhSY2JpQWdMeThnYVhNZ2RHaGxJRzl1YkhrZ2IzWmxjbXhoY0NCM2FHVnlaU0IzWlNCallXNGdjM1ZqWTJWemMyWjFiR3g1SUcxbGNtZGxJSFJvWlNCamIyNTBaVzUwSUdobGNtVXVYRzRnSUd4bGRDQnRhVzVsSUQwZ2UyOW1abk5sZERvZ2JXbHVaVTltWm5ObGRDd2diR2x1WlhNNklHMXBibVZNYVc1bGN5d2dhVzVrWlhnNklEQjlMRnh1SUNBZ0lDQWdkR2hsYVhJZ1BTQjdiMlptYzJWME9pQjBhR1ZwY2s5bVpuTmxkQ3dnYkdsdVpYTTZJSFJvWldseVRHbHVaWE1zSUdsdVpHVjRPaUF3ZlR0Y2JseHVJQ0F2THlCSVlXNWtiR1VnWVc1NUlHeGxZV1JwYm1jZ1kyOXVkR1Z1ZEZ4dUlDQnBibk5sY25STVpXRmthVzVuS0doMWJtc3NJRzFwYm1Vc0lIUm9aV2x5S1R0Y2JpQWdhVzV6WlhKMFRHVmhaR2x1Wnlob2RXNXJMQ0IwYUdWcGNpd2diV2x1WlNrN1hHNWNiaUFnTHk4Z1RtOTNJR2x1SUhSb1pTQnZkbVZ5YkdGd0lHTnZiblJsYm5RdUlGTmpZVzRnZEdoeWIzVm5hQ0JoYm1RZ2MyVnNaV04wSUhSb1pTQmlaWE4wSUdOb1lXNW5aWE1nWm5KdmJTQmxZV05vTGx4dUlDQjNhR2xzWlNBb2JXbHVaUzVwYm1SbGVDQThJRzFwYm1VdWJHbHVaWE11YkdWdVozUm9JQ1ltSUhSb1pXbHlMbWx1WkdWNElEd2dkR2hsYVhJdWJHbHVaWE11YkdWdVozUm9LU0I3WEc0Z0lDQWdiR1YwSUcxcGJtVkRkWEp5Wlc1MElEMGdiV2x1WlM1c2FXNWxjMXR0YVc1bExtbHVaR1Y0WFN4Y2JpQWdJQ0FnSUNBZ2RHaGxhWEpEZFhKeVpXNTBJRDBnZEdobGFYSXViR2x1WlhOYmRHaGxhWEl1YVc1a1pYaGRPMXh1WEc0Z0lDQWdhV1lnS0NodGFXNWxRM1Z5Y21WdWRGc3dYU0E5UFQwZ0p5MG5JSHg4SUcxcGJtVkRkWEp5Wlc1MFd6QmRJRDA5UFNBbkt5Y3BYRzRnSUNBZ0lDQWdJQ1ltSUNoMGFHVnBja04xY25KbGJuUmJNRjBnUFQwOUlDY3RKeUI4ZkNCMGFHVnBja04xY25KbGJuUmJNRjBnUFQwOUlDY3JKeWtwSUh0Y2JpQWdJQ0FnSUM4dklFSnZkR2dnYlc5a2FXWnBaV1FnTGk0dVhHNGdJQ0FnSUNCdGRYUjFZV3hEYUdGdVoyVW9hSFZ1YXl3Z2JXbHVaU3dnZEdobGFYSXBPMXh1SUNBZ0lIMGdaV3h6WlNCcFppQW9iV2x1WlVOMWNuSmxiblJiTUYwZ1BUMDlJQ2NySnlBbUppQjBhR1ZwY2tOMWNuSmxiblJiTUYwZ1BUMDlJQ2NnSnlrZ2UxeHVJQ0FnSUNBZ0x5OGdUV2x1WlNCcGJuTmxjblJsWkZ4dUlDQWdJQ0FnYUhWdWF5NXNhVzVsY3k1d2RYTm9LQzR1TGlCamIyeHNaV04wUTJoaGJtZGxLRzFwYm1VcEtUdGNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tIUm9aV2x5UTNWeWNtVnVkRnN3WFNBOVBUMGdKeXNuSUNZbUlHMXBibVZEZFhKeVpXNTBXekJkSUQwOVBTQW5JQ2NwSUh0Y2JpQWdJQ0FnSUM4dklGUm9aV2x5Y3lCcGJuTmxjblJsWkZ4dUlDQWdJQ0FnYUhWdWF5NXNhVzVsY3k1d2RYTm9LQzR1TGlCamIyeHNaV04wUTJoaGJtZGxLSFJvWldseUtTazdYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDaHRhVzVsUTNWeWNtVnVkRnN3WFNBOVBUMGdKeTBuSUNZbUlIUm9aV2x5UTNWeWNtVnVkRnN3WFNBOVBUMGdKeUFuS1NCN1hHNGdJQ0FnSUNBdkx5Qk5hVzVsSUhKbGJXOTJaV1FnYjNJZ1pXUnBkR1ZrWEc0Z0lDQWdJQ0J5WlcxdmRtRnNLR2gxYm1zc0lHMXBibVVzSUhSb1pXbHlLVHRjYmlBZ0lDQjlJR1ZzYzJVZ2FXWWdLSFJvWldseVEzVnljbVZ1ZEZzd1hTQTlQVDBnSnkwbklDWW1JRzFwYm1WRGRYSnlaVzUwV3pCZElEMDlQU0FuSUNjcElIdGNiaUFnSUNBZ0lDOHZJRlJvWldseUlISmxiVzkyWldRZ2IzSWdaV1JwZEdWa1hHNGdJQ0FnSUNCeVpXMXZkbUZzS0doMWJtc3NJSFJvWldseUxDQnRhVzVsTENCMGNuVmxLVHRjYmlBZ0lDQjlJR1ZzYzJVZ2FXWWdLRzFwYm1WRGRYSnlaVzUwSUQwOVBTQjBhR1ZwY2tOMWNuSmxiblFwSUh0Y2JpQWdJQ0FnSUM4dklFTnZiblJsZUhRZ2FXUmxiblJwZEhsY2JpQWdJQ0FnSUdoMWJtc3ViR2x1WlhNdWNIVnphQ2h0YVc1bFEzVnljbVZ1ZENrN1hHNGdJQ0FnSUNCdGFXNWxMbWx1WkdWNEt5czdYRzRnSUNBZ0lDQjBhR1ZwY2k1cGJtUmxlQ3NyTzF4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQXZMeUJEYjI1MFpYaDBJRzFwYzIxaGRHTm9YRzRnSUNBZ0lDQmpiMjVtYkdsamRDaG9kVzVyTENCamIyeHNaV04wUTJoaGJtZGxLRzFwYm1VcExDQmpiMnhzWldOMFEyaGhibWRsS0hSb1pXbHlLU2s3WEc0Z0lDQWdmVnh1SUNCOVhHNWNiaUFnTHk4Z1RtOTNJSEIxYzJnZ1lXNTVkR2hwYm1jZ2RHaGhkQ0J0WVhrZ1ltVWdjbVZ0WVdsdWFXNW5YRzRnSUdsdWMyVnlkRlJ5WVdsc2FXNW5LR2gxYm1zc0lHMXBibVVwTzF4dUlDQnBibk5sY25SVWNtRnBiR2x1Wnlob2RXNXJMQ0IwYUdWcGNpazdYRzVjYmlBZ1kyRnNZMHhwYm1WRGIzVnVkQ2hvZFc1cktUdGNibjFjYmx4dVpuVnVZM1JwYjI0Z2JYVjBkV0ZzUTJoaGJtZGxLR2gxYm1zc0lHMXBibVVzSUhSb1pXbHlLU0I3WEc0Z0lHeGxkQ0J0ZVVOb1lXNW5aWE1nUFNCamIyeHNaV04wUTJoaGJtZGxLRzFwYm1VcExGeHVJQ0FnSUNBZ2RHaGxhWEpEYUdGdVoyVnpJRDBnWTI5c2JHVmpkRU5vWVc1blpTaDBhR1ZwY2lrN1hHNWNiaUFnYVdZZ0tHRnNiRkpsYlc5MlpYTW9iWGxEYUdGdVoyVnpLU0FtSmlCaGJHeFNaVzF2ZG1WektIUm9aV2x5UTJoaGJtZGxjeWtwSUh0Y2JpQWdJQ0F2THlCVGNHVmphV0ZzSUdOaGMyVWdabTl5SUhKbGJXOTJaU0JqYUdGdVoyVnpJSFJvWVhRZ1lYSmxJSE4xY0dWeWMyVjBjeUJ2WmlCdmJtVWdZVzV2ZEdobGNseHVJQ0FnSUdsbUlDaGhjbkpoZVZOMFlYSjBjMWRwZEdnb2JYbERhR0Z1WjJWekxDQjBhR1ZwY2tOb1lXNW5aWE1wWEc0Z0lDQWdJQ0FnSUNZbUlITnJhWEJTWlcxdmRtVlRkWEJsY25ObGRDaDBhR1ZwY2l3Z2JYbERhR0Z1WjJWekxDQnRlVU5vWVc1blpYTXViR1Z1WjNSb0lDMGdkR2hsYVhKRGFHRnVaMlZ6TG14bGJtZDBhQ2twSUh0Y2JpQWdJQ0FnSUdoMWJtc3ViR2x1WlhNdWNIVnphQ2d1TGk0Z2JYbERhR0Z1WjJWektUdGNiaUFnSUNBZ0lISmxkSFZ5Ymp0Y2JpQWdJQ0I5SUdWc2MyVWdhV1lnS0dGeWNtRjVVM1JoY25SelYybDBhQ2gwYUdWcGNrTm9ZVzVuWlhNc0lHMTVRMmhoYm1kbGN5bGNiaUFnSUNBZ0lDQWdKaVlnYzJ0cGNGSmxiVzkyWlZOMWNHVnljMlYwS0cxcGJtVXNJSFJvWldseVEyaGhibWRsY3l3Z2RHaGxhWEpEYUdGdVoyVnpMbXhsYm1kMGFDQXRJRzE1UTJoaGJtZGxjeTVzWlc1bmRHZ3BLU0I3WEc0Z0lDQWdJQ0JvZFc1ckxteHBibVZ6TG5CMWMyZ29MaTR1SUhSb1pXbHlRMmhoYm1kbGN5azdYRzRnSUNBZ0lDQnlaWFIxY200N1hHNGdJQ0FnZlZ4dUlDQjlJR1ZzYzJVZ2FXWWdLR0Z5Y21GNVJYRjFZV3dvYlhsRGFHRnVaMlZ6TENCMGFHVnBja05vWVc1blpYTXBLU0I3WEc0Z0lDQWdhSFZ1YXk1c2FXNWxjeTV3ZFhOb0tDNHVMaUJ0ZVVOb1lXNW5aWE1wTzF4dUlDQWdJSEpsZEhWeWJqdGNiaUFnZlZ4dVhHNGdJR052Ym1ac2FXTjBLR2gxYm1zc0lHMTVRMmhoYm1kbGN5d2dkR2hsYVhKRGFHRnVaMlZ6S1R0Y2JuMWNibHh1Wm5WdVkzUnBiMjRnY21WdGIzWmhiQ2hvZFc1ckxDQnRhVzVsTENCMGFHVnBjaXdnYzNkaGNDa2dlMXh1SUNCc1pYUWdiWGxEYUdGdVoyVnpJRDBnWTI5c2JHVmpkRU5vWVc1blpTaHRhVzVsS1N4Y2JpQWdJQ0FnSUhSb1pXbHlRMmhoYm1kbGN5QTlJR052Ykd4bFkzUkRiMjUwWlhoMEtIUm9aV2x5TENCdGVVTm9ZVzVuWlhNcE8xeHVJQ0JwWmlBb2RHaGxhWEpEYUdGdVoyVnpMbTFsY21kbFpDa2dlMXh1SUNBZ0lHaDFibXN1YkdsdVpYTXVjSFZ6YUNndUxpNGdkR2hsYVhKRGFHRnVaMlZ6TG0xbGNtZGxaQ2s3WEc0Z0lIMGdaV3h6WlNCN1hHNGdJQ0FnWTI5dVpteHBZM1FvYUhWdWF5d2djM2RoY0NBL0lIUm9aV2x5UTJoaGJtZGxjeUE2SUcxNVEyaGhibWRsY3l3Z2MzZGhjQ0EvSUcxNVEyaGhibWRsY3lBNklIUm9aV2x5UTJoaGJtZGxjeWs3WEc0Z0lIMWNibjFjYmx4dVpuVnVZM1JwYjI0Z1kyOXVabXhwWTNRb2FIVnVheXdnYldsdVpTd2dkR2hsYVhJcElIdGNiaUFnYUhWdWF5NWpiMjVtYkdsamRDQTlJSFJ5ZFdVN1hHNGdJR2gxYm1zdWJHbHVaWE11Y0hWemFDaDdYRzRnSUNBZ1kyOXVabXhwWTNRNklIUnlkV1VzWEc0Z0lDQWdiV2x1WlRvZ2JXbHVaU3hjYmlBZ0lDQjBhR1ZwY25NNklIUm9aV2x5WEc0Z0lIMHBPMXh1ZlZ4dVhHNW1kVzVqZEdsdmJpQnBibk5sY25STVpXRmthVzVuS0doMWJtc3NJR2x1YzJWeWRDd2dkR2hsYVhJcElIdGNiaUFnZDJocGJHVWdLR2x1YzJWeWRDNXZabVp6WlhRZ1BDQjBhR1ZwY2k1dlptWnpaWFFnSmlZZ2FXNXpaWEowTG1sdVpHVjRJRHdnYVc1elpYSjBMbXhwYm1WekxteGxibWQwYUNrZ2UxeHVJQ0FnSUd4bGRDQnNhVzVsSUQwZ2FXNXpaWEowTG14cGJtVnpXMmx1YzJWeWRDNXBibVJsZUNzclhUdGNiaUFnSUNCb2RXNXJMbXhwYm1WekxuQjFjMmdvYkdsdVpTazdYRzRnSUNBZ2FXNXpaWEowTG05bVpuTmxkQ3NyTzF4dUlDQjlYRzU5WEc1bWRXNWpkR2x2YmlCcGJuTmxjblJVY21GcGJHbHVaeWhvZFc1ckxDQnBibk5sY25RcElIdGNiaUFnZDJocGJHVWdLR2x1YzJWeWRDNXBibVJsZUNBOElHbHVjMlZ5ZEM1c2FXNWxjeTVzWlc1bmRHZ3BJSHRjYmlBZ0lDQnNaWFFnYkdsdVpTQTlJR2x1YzJWeWRDNXNhVzVsYzF0cGJuTmxjblF1YVc1a1pYZ3JLMTA3WEc0Z0lDQWdhSFZ1YXk1c2FXNWxjeTV3ZFhOb0tHeHBibVVwTzF4dUlDQjlYRzU5WEc1Y2JtWjFibU4wYVc5dUlHTnZiR3hsWTNSRGFHRnVaMlVvYzNSaGRHVXBJSHRjYmlBZ2JHVjBJSEpsZENBOUlGdGRMRnh1SUNBZ0lDQWdiM0JsY21GMGFXOXVJRDBnYzNSaGRHVXViR2x1WlhOYmMzUmhkR1V1YVc1a1pYaGRXekJkTzF4dUlDQjNhR2xzWlNBb2MzUmhkR1V1YVc1a1pYZ2dQQ0J6ZEdGMFpTNXNhVzVsY3k1c1pXNW5kR2dwSUh0Y2JpQWdJQ0JzWlhRZ2JHbHVaU0E5SUhOMFlYUmxMbXhwYm1WelczTjBZWFJsTG1sdVpHVjRYVHRjYmx4dUlDQWdJQzh2SUVkeWIzVndJR0ZrWkdsMGFXOXVjeUIwYUdGMElHRnlaU0JwYlcxbFpHbGhkR1ZzZVNCaFpuUmxjaUJ6ZFdKMGNtRmpkR2x2Ym5NZ1lXNWtJSFJ5WldGMElIUm9aVzBnWVhNZ2IyNWxJRndpWVhSdmJXbGpYQ0lnYlc5a2FXWjVJR05vWVc1blpTNWNiaUFnSUNCcFppQW9iM0JsY21GMGFXOXVJRDA5UFNBbkxTY2dKaVlnYkdsdVpWc3dYU0E5UFQwZ0p5c25LU0I3WEc0Z0lDQWdJQ0J2Y0dWeVlYUnBiMjRnUFNBbkt5YzdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2FXWWdLRzl3WlhKaGRHbHZiaUE5UFQwZ2JHbHVaVnN3WFNrZ2UxeHVJQ0FnSUNBZ2NtVjBMbkIxYzJnb2JHbHVaU2s3WEc0Z0lDQWdJQ0J6ZEdGMFpTNXBibVJsZUNzck8xeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0JpY21WaGF6dGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQnlaWFIxY200Z2NtVjBPMXh1ZlZ4dVpuVnVZM1JwYjI0Z1kyOXNiR1ZqZEVOdmJuUmxlSFFvYzNSaGRHVXNJRzFoZEdOb1EyaGhibWRsY3lrZ2UxeHVJQ0JzWlhRZ1kyaGhibWRsY3lBOUlGdGRMRnh1SUNBZ0lDQWdiV1Z5WjJWa0lEMGdXMTBzWEc0Z0lDQWdJQ0J0WVhSamFFbHVaR1Y0SUQwZ01DeGNiaUFnSUNBZ0lHTnZiblJsZUhSRGFHRnVaMlZ6SUQwZ1ptRnNjMlVzWEc0Z0lDQWdJQ0JqYjI1bWJHbGpkR1ZrSUQwZ1ptRnNjMlU3WEc0Z0lIZG9hV3hsSUNodFlYUmphRWx1WkdWNElEd2diV0YwWTJoRGFHRnVaMlZ6TG14bGJtZDBhRnh1SUNBZ0lDQWdJQ0FtSmlCemRHRjBaUzVwYm1SbGVDQThJSE4wWVhSbExteHBibVZ6TG14bGJtZDBhQ2tnZTF4dUlDQWdJR3hsZENCamFHRnVaMlVnUFNCemRHRjBaUzVzYVc1bGMxdHpkR0YwWlM1cGJtUmxlRjBzWEc0Z0lDQWdJQ0FnSUcxaGRHTm9JRDBnYldGMFkyaERhR0Z1WjJWelcyMWhkR05vU1c1a1pYaGRPMXh1WEc0Z0lDQWdMeThnVDI1alpTQjNaU2QyWlNCb2FYUWdiM1Z5SUdGa1pDd2dkR2hsYmlCM1pTQmhjbVVnWkc5dVpWeHVJQ0FnSUdsbUlDaHRZWFJqYUZzd1hTQTlQVDBnSnlzbktTQjdYRzRnSUNBZ0lDQmljbVZoYXp0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JqYjI1MFpYaDBRMmhoYm1kbGN5QTlJR052Ym5SbGVIUkRhR0Z1WjJWeklIeDhJR05vWVc1blpWc3dYU0FoUFQwZ0p5QW5PMXh1WEc0Z0lDQWdiV1Z5WjJWa0xuQjFjMmdvYldGMFkyZ3BPMXh1SUNBZ0lHMWhkR05vU1c1a1pYZ3JLenRjYmx4dUlDQWdJQzh2SUVOdmJuTjFiV1VnWVc1NUlHRmtaR2wwYVc5dWN5QnBiaUIwYUdVZ2IzUm9aWElnWW14dlkyc2dZWE1nWVNCamIyNW1iR2xqZENCMGJ5QmhkSFJsYlhCMFhHNGdJQ0FnTHk4Z2RHOGdjSFZzYkNCcGJpQjBhR1VnY21WdFlXbHVhVzVuSUdOdmJuUmxlSFFnWVdaMFpYSWdkR2hwYzF4dUlDQWdJR2xtSUNoamFHRnVaMlZiTUYwZ1BUMDlJQ2NySnlrZ2UxeHVJQ0FnSUNBZ1kyOXVabXhwWTNSbFpDQTlJSFJ5ZFdVN1hHNWNiaUFnSUNBZ0lIZG9hV3hsSUNoamFHRnVaMlZiTUYwZ1BUMDlJQ2NySnlrZ2UxeHVJQ0FnSUNBZ0lDQmphR0Z1WjJWekxuQjFjMmdvWTJoaGJtZGxLVHRjYmlBZ0lDQWdJQ0FnWTJoaGJtZGxJRDBnYzNSaGRHVXViR2x1WlhOYkt5dHpkR0YwWlM1cGJtUmxlRjA3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1WEc0Z0lDQWdhV1lnS0cxaGRHTm9Mbk4xWW5OMGNpZ3hLU0E5UFQwZ1kyaGhibWRsTG5OMVluTjBjaWd4S1NrZ2UxeHVJQ0FnSUNBZ1kyaGhibWRsY3k1d2RYTm9LR05vWVc1blpTazdYRzRnSUNBZ0lDQnpkR0YwWlM1cGJtUmxlQ3NyTzF4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQmpiMjVtYkdsamRHVmtJRDBnZEhKMVpUdGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQnBaaUFvS0cxaGRHTm9RMmhoYm1kbGMxdHRZWFJqYUVsdVpHVjRYU0I4ZkNBbkp5bGJNRjBnUFQwOUlDY3JKMXh1SUNBZ0lDQWdKaVlnWTI5dWRHVjRkRU5vWVc1blpYTXBJSHRjYmlBZ0lDQmpiMjVtYkdsamRHVmtJRDBnZEhKMVpUdGNiaUFnZlZ4dVhHNGdJR2xtSUNoamIyNW1iR2xqZEdWa0tTQjdYRzRnSUNBZ2NtVjBkWEp1SUdOb1lXNW5aWE03WEc0Z0lIMWNibHh1SUNCM2FHbHNaU0FvYldGMFkyaEpibVJsZUNBOElHMWhkR05vUTJoaGJtZGxjeTVzWlc1bmRHZ3BJSHRjYmlBZ0lDQnRaWEpuWldRdWNIVnphQ2h0WVhSamFFTm9ZVzVuWlhOYmJXRjBZMmhKYm1SbGVDc3JYU2s3WEc0Z0lIMWNibHh1SUNCeVpYUjFjbTRnZTF4dUlDQWdJRzFsY21kbFpDeGNiaUFnSUNCamFHRnVaMlZ6WEc0Z0lIMDdYRzU5WEc1Y2JtWjFibU4wYVc5dUlHRnNiRkpsYlc5MlpYTW9ZMmhoYm1kbGN5a2dlMXh1SUNCeVpYUjFjbTRnWTJoaGJtZGxjeTV5WldSMVkyVW9ablZ1WTNScGIyNG9jSEpsZGl3Z1kyaGhibWRsS1NCN1hHNGdJQ0FnY21WMGRYSnVJSEJ5WlhZZ0ppWWdZMmhoYm1kbFd6QmRJRDA5UFNBbkxTYzdYRzRnSUgwc0lIUnlkV1VwTzF4dWZWeHVablZ1WTNScGIyNGdjMnRwY0ZKbGJXOTJaVk4xY0dWeWMyVjBLSE4wWVhSbExDQnlaVzF2ZG1WRGFHRnVaMlZ6TENCa1pXeDBZU2tnZTF4dUlDQm1iM0lnS0d4bGRDQnBJRDBnTURzZ2FTQThJR1JsYkhSaE95QnBLeXNwSUh0Y2JpQWdJQ0JzWlhRZ1kyaGhibWRsUTI5dWRHVnVkQ0E5SUhKbGJXOTJaVU5vWVc1blpYTmJjbVZ0YjNabFEyaGhibWRsY3k1c1pXNW5kR2dnTFNCa1pXeDBZU0FySUdsZExuTjFZbk4wY2lneEtUdGNiaUFnSUNCcFppQW9jM1JoZEdVdWJHbHVaWE5iYzNSaGRHVXVhVzVrWlhnZ0t5QnBYU0FoUFQwZ0p5QW5JQ3NnWTJoaGJtZGxRMjl1ZEdWdWRDa2dlMXh1SUNBZ0lDQWdjbVYwZFhKdUlHWmhiSE5sTzF4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUhOMFlYUmxMbWx1WkdWNElDczlJR1JsYkhSaE8xeHVJQ0J5WlhSMWNtNGdkSEoxWlR0Y2JuMWNibHh1Wm5WdVkzUnBiMjRnWTJGc1kwOXNaRTVsZDB4cGJtVkRiM1Z1ZENoc2FXNWxjeWtnZTF4dUlDQnNaWFFnYjJ4a1RHbHVaWE1nUFNBd08xeHVJQ0JzWlhRZ2JtVjNUR2x1WlhNZ1BTQXdPMXh1WEc0Z0lHeHBibVZ6TG1admNrVmhZMmdvWm5WdVkzUnBiMjRvYkdsdVpTa2dlMXh1SUNBZ0lHbG1JQ2gwZVhCbGIyWWdiR2x1WlNBaFBUMGdKM04wY21sdVp5Y3BJSHRjYmlBZ0lDQWdJR3hsZENCdGVVTnZkVzUwSUQwZ1kyRnNZMDlzWkU1bGQweHBibVZEYjNWdWRDaHNhVzVsTG0xcGJtVXBPMXh1SUNBZ0lDQWdiR1YwSUhSb1pXbHlRMjkxYm5RZ1BTQmpZV3hqVDJ4a1RtVjNUR2x1WlVOdmRXNTBLR3hwYm1VdWRHaGxhWEp6S1R0Y2JseHVJQ0FnSUNBZ2FXWWdLRzlzWkV4cGJtVnpJQ0U5UFNCMWJtUmxabWx1WldRcElIdGNiaUFnSUNBZ0lDQWdhV1lnS0cxNVEyOTFiblF1YjJ4a1RHbHVaWE1nUFQwOUlIUm9aV2x5UTI5MWJuUXViMnhrVEdsdVpYTXBJSHRjYmlBZ0lDQWdJQ0FnSUNCdmJHUk1hVzVsY3lBclBTQnRlVU52ZFc1MExtOXNaRXhwYm1Wek8xeHVJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJRzlzWkV4cGJtVnpJRDBnZFc1a1pXWnBibVZrTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lHbG1JQ2h1WlhkTWFXNWxjeUFoUFQwZ2RXNWtaV1pwYm1Wa0tTQjdYRzRnSUNBZ0lDQWdJR2xtSUNodGVVTnZkVzUwTG01bGQweHBibVZ6SUQwOVBTQjBhR1ZwY2tOdmRXNTBMbTVsZDB4cGJtVnpLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2JtVjNUR2x1WlhNZ0t6MGdiWGxEYjNWdWRDNXVaWGRNYVc1bGN6dGNiaUFnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0J1WlhkTWFXNWxjeUE5SUhWdVpHVm1hVzVsWkR0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0JwWmlBb2JtVjNUR2x1WlhNZ0lUMDlJSFZ1WkdWbWFXNWxaQ0FtSmlBb2JHbHVaVnN3WFNBOVBUMGdKeXNuSUh4OElHeHBibVZiTUYwZ1BUMDlJQ2NnSnlrcElIdGNiaUFnSUNBZ0lDQWdibVYzVEdsdVpYTXJLenRjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJR2xtSUNodmJHUk1hVzVsY3lBaFBUMGdkVzVrWldacGJtVmtJQ1ltSUNoc2FXNWxXekJkSUQwOVBTQW5MU2NnZkh3Z2JHbHVaVnN3WFNBOVBUMGdKeUFuS1NrZ2UxeHVJQ0FnSUNBZ0lDQnZiR1JNYVc1bGN5c3JPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNiaUFnZlNrN1hHNWNiaUFnY21WMGRYSnVJSHR2YkdSTWFXNWxjeXdnYm1WM1RHbHVaWE45TzF4dWZWeHVJbDE5XG5cblxuLyoqKi8gfSksXG4vKiAxNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8ndXNlIHN0cmljdCc7XG5cblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9zdHJ1Y3R1cmVkUGF0Y2ggPSBzdHJ1Y3R1cmVkUGF0Y2g7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2NyZWF0ZVR3b0ZpbGVzUGF0Y2ggPSBjcmVhdGVUd29GaWxlc1BhdGNoO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jcmVhdGVQYXRjaCA9IGNyZWF0ZVBhdGNoO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2xpbmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IGVsc2UgeyByZXR1cm4gQXJyYXkuZnJvbShhcnIpOyB9IH1cblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2Z1bmN0aW9uIHN0cnVjdHVyZWRQYXRjaChvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucykge1xuXHQgIGlmICghb3B0aW9ucykge1xuXHQgICAgb3B0aW9ucyA9IHt9O1xuXHQgIH1cblx0ICBpZiAodHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0ICAgIG9wdGlvbnMuY29udGV4dCA9IDQ7XG5cdCAgfVxuXG5cdCAgdmFyIGRpZmYgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKDAsIF9saW5lLmRpZmZMaW5lcykgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8ob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpO1xuXHQgIGRpZmYucHVzaCh7IHZhbHVlOiAnJywgbGluZXM6IFtdIH0pOyAvLyBBcHBlbmQgYW4gZW1wdHkgdmFsdWUgdG8gbWFrZSBjbGVhbnVwIGVhc2llclxuXG5cdCAgZnVuY3Rpb24gY29udGV4dExpbmVzKGxpbmVzKSB7XG5cdCAgICByZXR1cm4gbGluZXMubWFwKGZ1bmN0aW9uIChlbnRyeSkge1xuXHQgICAgICByZXR1cm4gJyAnICsgZW50cnk7XG5cdCAgICB9KTtcblx0ICB9XG5cblx0ICB2YXIgaHVua3MgPSBbXTtcblx0ICB2YXIgb2xkUmFuZ2VTdGFydCA9IDAsXG5cdCAgICAgIG5ld1JhbmdlU3RhcnQgPSAwLFxuXHQgICAgICBjdXJSYW5nZSA9IFtdLFxuXHQgICAgICBvbGRMaW5lID0gMSxcblx0ICAgICAgbmV3TGluZSA9IDE7XG5cblx0ICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoIC8qaXN0YW5idWwgaWdub3JlIGVuZCovaSkge1xuXHQgICAgdmFyIGN1cnJlbnQgPSBkaWZmW2ldLFxuXHQgICAgICAgIGxpbmVzID0gY3VycmVudC5saW5lcyB8fCBjdXJyZW50LnZhbHVlLnJlcGxhY2UoL1xcbiQvLCAnJykuc3BsaXQoJ1xcbicpO1xuXHQgICAgY3VycmVudC5saW5lcyA9IGxpbmVzO1xuXG5cdCAgICBpZiAoY3VycmVudC5hZGRlZCB8fCBjdXJyZW50LnJlbW92ZWQpIHtcblx0ICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciBfY3VyUmFuZ2U7XG5cblx0ICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8gLy8gSWYgd2UgaGF2ZSBwcmV2aW91cyBjb250ZXh0LCBzdGFydCB3aXRoIHRoYXRcblx0ICAgICAgaWYgKCFvbGRSYW5nZVN0YXJ0KSB7XG5cdCAgICAgICAgdmFyIHByZXYgPSBkaWZmW2kgLSAxXTtcblx0ICAgICAgICBvbGRSYW5nZVN0YXJ0ID0gb2xkTGluZTtcblx0ICAgICAgICBuZXdSYW5nZVN0YXJ0ID0gbmV3TGluZTtcblxuXHQgICAgICAgIGlmIChwcmV2KSB7XG5cdCAgICAgICAgICBjdXJSYW5nZSA9IG9wdGlvbnMuY29udGV4dCA+IDAgPyBjb250ZXh0TGluZXMocHJldi5saW5lcy5zbGljZSgtb3B0aW9ucy5jb250ZXh0KSkgOiBbXTtcblx0ICAgICAgICAgIG9sZFJhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuXHQgICAgICAgICAgbmV3UmFuZ2VTdGFydCAtPSBjdXJSYW5nZS5sZW5ndGg7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cblx0ICAgICAgLy8gT3V0cHV0IG91ciBjaGFuZ2VzXG5cdCAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oX2N1clJhbmdlID0gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jdXJSYW5nZSkucHVzaC4gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2FwcGx5IC8qaXN0YW5idWwgaWdub3JlIGVuZCovKCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2N1clJhbmdlIC8qaXN0YW5idWwgaWdub3JlIGVuZCovLCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX3RvQ29uc3VtYWJsZUFycmF5KCAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2xpbmVzLm1hcChmdW5jdGlvbiAoZW50cnkpIHtcblx0ICAgICAgICByZXR1cm4gKGN1cnJlbnQuYWRkZWQgPyAnKycgOiAnLScpICsgZW50cnk7XG5cdCAgICAgIH0pKSk7XG5cblx0ICAgICAgLy8gVHJhY2sgdGhlIHVwZGF0ZWQgZmlsZSBwb3NpdGlvblxuXHQgICAgICBpZiAoY3VycmVudC5hZGRlZCkge1xuXHQgICAgICAgIG5ld0xpbmUgKz0gbGluZXMubGVuZ3RoO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIG9sZExpbmUgKz0gbGluZXMubGVuZ3RoO1xuXHQgICAgICB9XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICAvLyBJZGVudGljYWwgY29udGV4dCBsaW5lcy4gVHJhY2sgbGluZSBjaGFuZ2VzXG5cdCAgICAgIGlmIChvbGRSYW5nZVN0YXJ0KSB7XG5cdCAgICAgICAgLy8gQ2xvc2Ugb3V0IGFueSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG91dHB1dCAob3Igam9pbiBvdmVybGFwcGluZylcblx0ICAgICAgICBpZiAobGluZXMubGVuZ3RoIDw9IG9wdGlvbnMuY29udGV4dCAqIDIgJiYgaSA8IGRpZmYubGVuZ3RoIC0gMikge1xuXHQgICAgICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciBfY3VyUmFuZ2UyO1xuXG5cdCAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyAvLyBPdmVybGFwcGluZ1xuXHQgICAgICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyhfY3VyUmFuZ2UyID0gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jdXJSYW5nZSkucHVzaC4gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2FwcGx5IC8qaXN0YW5idWwgaWdub3JlIGVuZCovKCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2N1clJhbmdlMiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLywgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL190b0NvbnN1bWFibGVBcnJheSggLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jb250ZXh0TGluZXMobGluZXMpKSk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2N1clJhbmdlMztcblxuXHQgICAgICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8gLy8gZW5kIHRoZSByYW5nZSBhbmQgb3V0cHV0XG5cdCAgICAgICAgICB2YXIgY29udGV4dFNpemUgPSBNYXRoLm1pbihsaW5lcy5sZW5ndGgsIG9wdGlvbnMuY29udGV4dCk7XG5cdCAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKF9jdXJSYW5nZTMgPSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2N1clJhbmdlKS5wdXNoLiAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovYXBwbHkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8oIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fY3VyUmFuZ2UzIC8qaXN0YW5idWwgaWdub3JlIGVuZCovLCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX3RvQ29uc3VtYWJsZUFycmF5KCAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2NvbnRleHRMaW5lcyhsaW5lcy5zbGljZSgwLCBjb250ZXh0U2l6ZSkpKSk7XG5cblx0ICAgICAgICAgIHZhciBodW5rID0ge1xuXHQgICAgICAgICAgICBvbGRTdGFydDogb2xkUmFuZ2VTdGFydCxcblx0ICAgICAgICAgICAgb2xkTGluZXM6IG9sZExpbmUgLSBvbGRSYW5nZVN0YXJ0ICsgY29udGV4dFNpemUsXG5cdCAgICAgICAgICAgIG5ld1N0YXJ0OiBuZXdSYW5nZVN0YXJ0LFxuXHQgICAgICAgICAgICBuZXdMaW5lczogbmV3TGluZSAtIG5ld1JhbmdlU3RhcnQgKyBjb250ZXh0U2l6ZSxcblx0ICAgICAgICAgICAgbGluZXM6IGN1clJhbmdlXG5cdCAgICAgICAgICB9O1xuXHQgICAgICAgICAgaWYgKGkgPj0gZGlmZi5sZW5ndGggLSAyICYmIGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQpIHtcblx0ICAgICAgICAgICAgLy8gRU9GIGlzIGluc2lkZSB0aGlzIGh1bmtcblx0ICAgICAgICAgICAgdmFyIG9sZEVPRk5ld2xpbmUgPSAvXFxuJC8udGVzdChvbGRTdHIpO1xuXHQgICAgICAgICAgICB2YXIgbmV3RU9GTmV3bGluZSA9IC9cXG4kLy50ZXN0KG5ld1N0cik7XG5cdCAgICAgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPT0gMCAmJiAhb2xkRU9GTmV3bGluZSkge1xuXHQgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZTogb2xkIGhhcyBubyBlb2wgYW5kIG5vIHRyYWlsaW5nIGNvbnRleHQ7IG5vLW5sIGNhbiBlbmQgdXAgYmVmb3JlIGFkZHNcblx0ICAgICAgICAgICAgICBjdXJSYW5nZS5zcGxpY2UoaHVuay5vbGRMaW5lcywgMCwgJ1xcXFwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZScpO1xuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKCFvbGRFT0ZOZXdsaW5lIHx8ICFuZXdFT0ZOZXdsaW5lKSB7XG5cdCAgICAgICAgICAgICAgY3VyUmFuZ2UucHVzaCgnXFxcXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlJyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGh1bmtzLnB1c2goaHVuayk7XG5cblx0ICAgICAgICAgIG9sZFJhbmdlU3RhcnQgPSAwO1xuXHQgICAgICAgICAgbmV3UmFuZ2VTdGFydCA9IDA7XG5cdCAgICAgICAgICBjdXJSYW5nZSA9IFtdO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICBvbGRMaW5lICs9IGxpbmVzLmxlbmd0aDtcblx0ICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG5cdCAgICB9XG5cdCAgfTtcblxuXHQgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlmZi5sZW5ndGg7IGkrKykge1xuXHQgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19sb29wKCAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2kpO1xuXHQgIH1cblxuXHQgIHJldHVybiB7XG5cdCAgICBvbGRGaWxlTmFtZTogb2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lOiBuZXdGaWxlTmFtZSxcblx0ICAgIG9sZEhlYWRlcjogb2xkSGVhZGVyLCBuZXdIZWFkZXI6IG5ld0hlYWRlcixcblx0ICAgIGh1bmtzOiBodW5rc1xuXHQgIH07XG5cdH1cblxuXHRmdW5jdGlvbiBjcmVhdGVUd29GaWxlc1BhdGNoKG9sZEZpbGVOYW1lLCBuZXdGaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSB7XG5cdCAgdmFyIGRpZmYgPSBzdHJ1Y3R1cmVkUGF0Y2gob2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpO1xuXG5cdCAgdmFyIHJldCA9IFtdO1xuXHQgIGlmIChvbGRGaWxlTmFtZSA9PSBuZXdGaWxlTmFtZSkge1xuXHQgICAgcmV0LnB1c2goJ0luZGV4OiAnICsgb2xkRmlsZU5hbWUpO1xuXHQgIH1cblx0ICByZXQucHVzaCgnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PScpO1xuXHQgIHJldC5wdXNoKCctLS0gJyArIGRpZmYub2xkRmlsZU5hbWUgKyAodHlwZW9mIGRpZmYub2xkSGVhZGVyID09PSAndW5kZWZpbmVkJyA/ICcnIDogJ1xcdCcgKyBkaWZmLm9sZEhlYWRlcikpO1xuXHQgIHJldC5wdXNoKCcrKysgJyArIGRpZmYubmV3RmlsZU5hbWUgKyAodHlwZW9mIGRpZmYubmV3SGVhZGVyID09PSAndW5kZWZpbmVkJyA/ICcnIDogJ1xcdCcgKyBkaWZmLm5ld0hlYWRlcikpO1xuXG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaWZmLmh1bmtzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICB2YXIgaHVuayA9IGRpZmYuaHVua3NbaV07XG5cdCAgICByZXQucHVzaCgnQEAgLScgKyBodW5rLm9sZFN0YXJ0ICsgJywnICsgaHVuay5vbGRMaW5lcyArICcgKycgKyBodW5rLm5ld1N0YXJ0ICsgJywnICsgaHVuay5uZXdMaW5lcyArICcgQEAnKTtcblx0ICAgIHJldC5wdXNoLmFwcGx5KHJldCwgaHVuay5saW5lcyk7XG5cdCAgfVxuXG5cdCAgcmV0dXJuIHJldC5qb2luKCdcXG4nKSArICdcXG4nO1xuXHR9XG5cblx0ZnVuY3Rpb24gY3JlYXRlUGF0Y2goZmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucykge1xuXHQgIHJldHVybiBjcmVhdGVUd29GaWxlc1BhdGNoKGZpbGVOYW1lLCBmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKTtcblx0fVxuXHQvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTl3WVhSamFDOWpjbVZoZEdVdWFuTWlYU3dpYm1GdFpYTWlPbHNpYzNSeWRXTjBkWEpsWkZCaGRHTm9JaXdpWTNKbFlYUmxWSGR2Um1sc1pYTlFZWFJqYUNJc0ltTnlaV0YwWlZCaGRHTm9JaXdpYjJ4a1JtbHNaVTVoYldVaUxDSnVaWGRHYVd4bFRtRnRaU0lzSW05c1pGTjBjaUlzSW01bGQxTjBjaUlzSW05c1pFaGxZV1JsY2lJc0ltNWxkMGhsWVdSbGNpSXNJbTl3ZEdsdmJuTWlMQ0pqYjI1MFpYaDBJaXdpWkdsbVppSXNJbkIxYzJnaUxDSjJZV3gxWlNJc0lteHBibVZ6SWl3aVkyOXVkR1Y0ZEV4cGJtVnpJaXdpYldGd0lpd2laVzUwY25raUxDSm9kVzVyY3lJc0ltOXNaRkpoYm1kbFUzUmhjblFpTENKdVpYZFNZVzVuWlZOMFlYSjBJaXdpWTNWeVVtRnVaMlVpTENKdmJHUk1hVzVsSWl3aWJtVjNUR2x1WlNJc0lta2lMQ0pqZFhKeVpXNTBJaXdpY21Wd2JHRmpaU0lzSW5Od2JHbDBJaXdpWVdSa1pXUWlMQ0p5WlcxdmRtVmtJaXdpY0hKbGRpSXNJbk5zYVdObElpd2liR1Z1WjNSb0lpd2lZMjl1ZEdWNGRGTnBlbVVpTENKTllYUm9JaXdpYldsdUlpd2lhSFZ1YXlJc0ltOXNaRk4wWVhKMElpd2liMnhrVEdsdVpYTWlMQ0p1WlhkVGRHRnlkQ0lzSW01bGQweHBibVZ6SWl3aWIyeGtSVTlHVG1WM2JHbHVaU0lzSW5SbGMzUWlMQ0p1WlhkRlQwWk9aWGRzYVc1bElpd2ljM0JzYVdObElpd2ljbVYwSWl3aVlYQndiSGtpTENKcWIybHVJaXdpWm1sc1pVNWhiV1VpWFN3aWJXRndjR2x1WjNNaU9pSTdPenRuUTBGRlowSkJMR1VzUjBGQlFVRXNaVHQ1UkVGcFIwRkRMRzFDTEVkQlFVRkJMRzFDTzNsRVFYZENRVU1zVnl4SFFVRkJRU3hYT3p0QlFUTklhRUk3T3pzN2RVSkJSVThzVTBGQlUwWXNaVUZCVkN4RFFVRjVRa2NzVjBGQmVrSXNSVUZCYzBORExGZEJRWFJETEVWQlFXMUVReXhOUVVGdVJDeEZRVUV5UkVNc1RVRkJNMFFzUlVGQmJVVkRMRk5CUVc1RkxFVkJRVGhGUXl4VFFVRTVSU3hGUVVGNVJrTXNUMEZCZWtZc1JVRkJhMGM3UVVGRGRrY3NUVUZCU1N4RFFVRkRRU3hQUVVGTUxFVkJRV003UVVGRFdrRXNZMEZCVlN4RlFVRldPMEZCUTBRN1FVRkRSQ3hOUVVGSkxFOUJRVTlCTEZGQlFWRkRMRTlCUVdZc1MwRkJNa0lzVjBGQkwwSXNSVUZCTkVNN1FVRkRNVU5FTEZsQlFWRkRMRTlCUVZJc1IwRkJhMElzUTBGQmJFSTdRVUZEUkRzN1FVRkZSQ3hOUVVGTlF5eFBRVUZQTEhORlFVRlZUaXhOUVVGV0xFVkJRV3RDUXl4TlFVRnNRaXhGUVVFd1FrY3NUMEZCTVVJc1EwRkJZanRCUVVOQlJTeFBRVUZMUXl4SlFVRk1MRU5CUVZVc1JVRkJRME1zVDBGQlR5eEZRVUZTTEVWQlFWbERMRTlCUVU4c1JVRkJia0lzUlVGQlZpeEZRVlIxUnl4RFFWTnNSVHM3UVVGRmNrTXNWMEZCVTBNc1dVRkJWQ3hEUVVGelFrUXNTMEZCZEVJc1JVRkJOa0k3UVVGRE0wSXNWMEZCVDBFc1RVRkJUVVVzUjBGQlRpeERRVUZWTEZWQlFWTkRMRXRCUVZRc1JVRkJaMEk3UVVGQlJTeGhRVUZQTEUxQlFVMUJMRXRCUVdJN1FVRkJjVUlzUzBGQmFrUXNRMEZCVUR0QlFVTkVPenRCUVVWRUxFMUJRVWxETEZGQlFWRXNSVUZCV2p0QlFVTkJMRTFCUVVsRExHZENRVUZuUWl4RFFVRndRanRCUVVGQkxFMUJRWFZDUXl4blFrRkJaMElzUTBGQmRrTTdRVUZCUVN4TlFVRXdRME1zVjBGQlZ5eEZRVUZ5UkR0QlFVRkJMRTFCUTBsRExGVkJRVlVzUTBGRVpEdEJRVUZCTEUxQlEybENReXhWUVVGVkxFTkJSRE5DT3p0QlFXaENkVWNzT0VWQmEwSTVSa01zUTBGc1FqaEdPMEZCYlVKeVJ5eFJRVUZOUXl4VlFVRlZaQ3hMUVVGTFlTeERRVUZNTEVOQlFXaENPMEZCUVVFc1VVRkRUVllzVVVGQlVWY3NVVUZCVVZnc1MwRkJVaXhKUVVGcFFsY3NVVUZCVVZvc1MwRkJVaXhEUVVGallTeFBRVUZrTEVOQlFYTkNMRXRCUVhSQ0xFVkJRVFpDTEVWQlFUZENMRVZCUVdsRFF5eExRVUZxUXl4RFFVRjFReXhKUVVGMlF5eERRVVF2UWp0QlFVVkJSaXhaUVVGUldDeExRVUZTTEVkQlFXZENRU3hMUVVGb1FqczdRVUZGUVN4UlFVRkpWeXhSUVVGUlJ5eExRVUZTTEVsQlFXbENTQ3hSUVVGUlNTeFBRVUUzUWl4RlFVRnpRenRCUVVGQk96dEJRVUZCTERoQ1FVTndRenRCUVVOQkxGVkJRVWtzUTBGQlExWXNZVUZCVEN4RlFVRnZRanRCUVVOc1FpeFpRVUZOVnl4UFFVRlBia0lzUzBGQlMyRXNTVUZCU1N4RFFVRlVMRU5CUVdJN1FVRkRRVXdzZDBKQlFXZENSeXhQUVVGb1FqdEJRVU5CUml4M1FrRkJaMEpITEU5QlFXaENPenRCUVVWQkxGbEJRVWxQTEVsQlFVb3NSVUZCVlR0QlFVTlNWQ3h4UWtGQlYxb3NVVUZCVVVNc1QwRkJVaXhIUVVGclFpeERRVUZzUWl4SFFVRnpRa3NzWVVGQllXVXNTMEZCUzJoQ0xFdEJRVXdzUTBGQlYybENMRXRCUVZnc1EwRkJhVUlzUTBGQlEzUkNMRkZCUVZGRExFOUJRVEZDTEVOQlFXSXNRMEZCZEVJc1IwRkJlVVVzUlVGQmNFWTdRVUZEUVZNc01rSkJRV2xDUlN4VFFVRlRWeXhOUVVFeFFqdEJRVU5CV2l3eVFrRkJhVUpETEZOQlFWTlhMRTFCUVRGQ08wRkJRMFE3UVVGRFJqczdRVUZGUkR0QlFVTkJMRFpGUVVGVGNFSXNTVUZCVkN3d1RFRkJhMEpGTEUxQlFVMUZMRWRCUVU0c1EwRkJWU3hWUVVGVFF5eExRVUZVTEVWQlFXZENPMEZCUXpGRExHVkJRVThzUTBGQlExRXNVVUZCVVVjc1MwRkJVaXhIUVVGblFpeEhRVUZvUWl4SFFVRnpRaXhIUVVGMlFpeEpRVUU0UWxnc1MwRkJja003UVVGRFJDeFBRVVpwUWl4RFFVRnNRanM3UVVGSlFUdEJRVU5CTEZWQlFVbFJMRkZCUVZGSExFdEJRVm9zUlVGQmJVSTdRVUZEYWtKTUxHMUNRVUZYVkN4TlFVRk5hMElzVFVGQmFrSTdRVUZEUkN4UFFVWkVMRTFCUlU4N1FVRkRURllzYlVKQlFWZFNMRTFCUVUxclFpeE5RVUZxUWp0QlFVTkVPMEZCUTBZc1MwRjZRa1FzVFVGNVFrODdRVUZEVER0QlFVTkJMRlZCUVVsaUxHRkJRVW9zUlVGQmJVSTdRVUZEYWtJN1FVRkRRU3haUVVGSlRDeE5RVUZOYTBJc1RVRkJUaXhKUVVGblFuWkNMRkZCUVZGRExFOUJRVklzUjBGQmEwSXNRMEZCYkVNc1NVRkJkVU5qTEVsQlFVbGlMRXRCUVV0eFFpeE5RVUZNTEVkQlFXTXNRMEZCTjBRc1JVRkJaMFU3UVVGQlFUczdRVUZCUVN4clEwRkRPVVE3UVVGRFFTeHJSa0ZCVTNCQ0xFbEJRVlFzTWt4QlFXdENSeXhoUVVGaFJDeExRVUZpTEVOQlFXeENPMEZCUTBRc1UwRklSQ3hOUVVkUE8wRkJRVUU3TzBGQlFVRXNhME5CUTB3N1FVRkRRU3hqUVVGSmJVSXNZMEZCWTBNc1MwRkJTME1zUjBGQlRDeERRVUZUY2tJc1RVRkJUV3RDTEUxQlFXWXNSVUZCZFVKMlFpeFJRVUZSUXl4UFFVRXZRaXhEUVVGc1FqdEJRVU5CTEd0R1FVRlRSU3hKUVVGVUxESk1RVUZyUWtjc1lVRkJZVVFzVFVGQlRXbENMRXRCUVU0c1EwRkJXU3hEUVVGYUxFVkJRV1ZGTEZkQlFXWXNRMEZCWWl4RFFVRnNRanM3UVVGRlFTeGpRVUZKUnl4UFFVRlBPMEZCUTFSRExITkNRVUZWYkVJc1lVRkVSRHRCUVVWVWJVSXNjMEpCUVZkb1FpeFZRVUZWU0N4aFFVRldMRWRCUVRCQ1l5eFhRVVkxUWp0QlFVZFVUU3h6UWtGQlZXNUNMR0ZCU0VRN1FVRkpWRzlDTEhOQ1FVRlhha0lzVlVGQlZVZ3NZVUZCVml4SFFVRXdRbUVzVjBGS05VSTdRVUZMVkc1Q0xHMUNRVUZQVHp0QlFVeEZMRmRCUVZnN1FVRlBRU3hqUVVGSlJ5eExRVUZMWWl4TFFVRkxjVUlzVFVGQlRDeEhRVUZqTEVOQlFXNUNMRWxCUVhkQ2JFSXNUVUZCVFd0Q0xFMUJRVTRzU1VGQlowSjJRaXhSUVVGUlF5eFBRVUZ3UkN4RlFVRTJSRHRCUVVNelJEdEJRVU5CTEdkQ1FVRkpLMElzWjBKQlFXbENMRTFCUVUxRExFbEJRVTRzUTBGQlYzSkRMRTFCUVZnc1EwRkJja0k3UVVGRFFTeG5Ra0ZCU1hORExHZENRVUZwUWl4TlFVRk5SQ3hKUVVGT0xFTkJRVmR3UXl4TlFVRllMRU5CUVhKQ08wRkJRMEVzWjBKQlFVbFJMRTFCUVUxclFpeE5RVUZPTEVsQlFXZENMRU5CUVdoQ0xFbEJRWEZDTEVOQlFVTlRMR0ZCUVRGQ0xFVkJRWGxETzBGQlEzWkRPMEZCUTBGd1FpeDFRa0ZCVTNWQ0xFMUJRVlFzUTBGQlowSlNMRXRCUVV0RkxGRkJRWEpDTEVWQlFTdENMRU5CUVM5Q0xFVkJRV3RETERoQ1FVRnNRenRCUVVORUxHRkJTRVFzVFVGSFR5eEpRVUZKTEVOQlFVTkhMR0ZCUVVRc1NVRkJhMElzUTBGQlEwVXNZVUZCZGtJc1JVRkJjME03UVVGRE0wTjBRaXgxUWtGQlUxUXNTVUZCVkN4RFFVRmpMRGhDUVVGa08wRkJRMFE3UVVGRFJqdEJRVU5FVFN4blFrRkJUVTRzU1VGQlRpeERRVUZYZDBJc1NVRkJXRHM3UVVGRlFXcENMREJDUVVGblFpeERRVUZvUWp0QlFVTkJReXd3UWtGQlowSXNRMEZCYUVJN1FVRkRRVU1zY1VKQlFWY3NSVUZCV0R0QlFVTkVPMEZCUTBZN1FVRkRSRU1zYVVKQlFWZFNMRTFCUVUxclFpeE5RVUZxUWp0QlFVTkJWQ3hwUWtGQlYxUXNUVUZCVFd0Q0xFMUJRV3BDTzBGQlEwUTdRVUYyUm05SE96dEJRV3RDZGtjc1QwRkJTeXhKUVVGSlVpeEpRVUZKTEVOQlFXSXNSVUZCWjBKQkxFbEJRVWxpTEV0QlFVdHhRaXhOUVVGNlFpeEZRVUZwUTFJc1IwRkJha01zUlVGQmMwTTdRVUZCUVN3eVJFRkJOMEpCTEVOQlFUWkNPMEZCYzBWeVF6czdRVUZGUkN4VFFVRlBPMEZCUTB4eVFpeHBRa0ZCWVVFc1YwRkVVaXhGUVVOeFFrTXNZVUZCWVVFc1YwRkViRU03UVVGRlRFY3NaVUZCVjBFc1UwRkdUaXhGUVVWcFFrTXNWMEZCVjBFc1UwRkdOVUk3UVVGSFRGVXNWMEZCVDBFN1FVRklSaXhIUVVGUU8wRkJTMFE3TzBGQlJVMHNVMEZCVTJwQ0xHMUNRVUZVTEVOQlFUWkNSU3hYUVVFM1FpeEZRVUV3UTBNc1YwRkJNVU1zUlVGQmRVUkRMRTFCUVhaRUxFVkJRU3RFUXl4TlFVRXZSQ3hGUVVGMVJVTXNVMEZCZGtVc1JVRkJhMFpETEZOQlFXeEdMRVZCUVRaR1F5eFBRVUUzUml4RlFVRnpSenRCUVVNelJ5eE5RVUZOUlN4UFFVRlBXQ3huUWtGQlowSkhMRmRCUVdoQ0xFVkJRVFpDUXl4WFFVRTNRaXhGUVVFd1EwTXNUVUZCTVVNc1JVRkJhMFJETEUxQlFXeEVMRVZCUVRCRVF5eFRRVUV4UkN4RlFVRnhSVU1zVTBGQmNrVXNSVUZCWjBaRExFOUJRV2hHTEVOQlFXSTdPMEZCUlVFc1RVRkJUVzlETEUxQlFVMHNSVUZCV2p0QlFVTkJMRTFCUVVreFF5eGxRVUZsUXl4WFFVRnVRaXhGUVVGblF6dEJRVU01UW5sRExGRkJRVWxxUXl4SlFVRktMRU5CUVZNc1dVRkJXVlFzVjBGQmNrSTdRVUZEUkR0QlFVTkVNRU1zVFVGQlNXcERMRWxCUVVvc1EwRkJVeXh4UlVGQlZEdEJRVU5CYVVNc1RVRkJTV3BETEVsQlFVb3NRMEZCVXl4VFFVRlRSQ3hMUVVGTFVpeFhRVUZrTEVsQlFUWkNMRTlCUVU5UkxFdEJRVXRLTEZOQlFWb3NTMEZCTUVJc1YwRkJNVUlzUjBGQmQwTXNSVUZCZUVNc1IwRkJOa01zVDBGQlQwa3NTMEZCUzBvc1UwRkJkRVlzUTBGQlZEdEJRVU5CYzBNc1RVRkJTV3BETEVsQlFVb3NRMEZCVXl4VFFVRlRSQ3hMUVVGTFVDeFhRVUZrTEVsQlFUWkNMRTlCUVU5UExFdEJRVXRJTEZOQlFWb3NTMEZCTUVJc1YwRkJNVUlzUjBGQmQwTXNSVUZCZUVNc1IwRkJOa01zVDBGQlQwY3NTMEZCUzBnc1UwRkJkRVlzUTBGQlZEczdRVUZGUVN4UFFVRkxMRWxCUVVsblFpeEpRVUZKTEVOQlFXSXNSVUZCWjBKQkxFbEJRVWxpTEV0QlFVdFBMRXRCUVV3c1EwRkJWMk1zVFVGQkwwSXNSVUZCZFVOU0xFZEJRWFpETEVWQlFUUkRPMEZCUXpGRExGRkJRVTFaTEU5QlFVOTZRaXhMUVVGTFR5eExRVUZNTEVOQlFWZE5MRU5CUVZnc1EwRkJZanRCUVVOQmNVSXNVVUZCU1dwRExFbEJRVW9zUTBGRFJTeFRRVUZUZDBJc1MwRkJTME1zVVVGQlpDeEhRVUY1UWl4SFFVRjZRaXhIUVVFclFrUXNTMEZCUzBVc1VVRkJjRU1zUjBGRFJTeEpRVVJHTEVkQlExTkdMRXRCUVV0SExGRkJSR1FzUjBGRGVVSXNSMEZFZWtJc1IwRkRLMEpJTEV0QlFVdEpMRkZCUkhCRExFZEJSVVVzUzBGSVNqdEJRVXRCU3l4UlFVRkpha01zU1VGQlNpeERRVUZUYTBNc1MwRkJWQ3hEUVVGbFJDeEhRVUZtTEVWQlFXOUNWQ3hMUVVGTGRFSXNTMEZCZWtJN1FVRkRSRHM3UVVGRlJDeFRRVUZQSzBJc1NVRkJTVVVzU1VGQlNpeERRVUZUTEVsQlFWUXNTVUZCYVVJc1NVRkJlRUk3UVVGRFJEczdRVUZGVFN4VFFVRlROME1zVjBGQlZDeERRVUZ4UWpoRExGRkJRWEpDTEVWQlFTdENNME1zVFVGQkwwSXNSVUZCZFVORExFMUJRWFpETEVWQlFTdERReXhUUVVFdlF5eEZRVUV3UkVNc1UwRkJNVVFzUlVGQmNVVkRMRTlCUVhKRkxFVkJRVGhGTzBGQlEyNUdMRk5CUVU5U0xHOUNRVUZ2UWl0RExGRkJRWEJDTEVWQlFUaENRU3hSUVVFNVFpeEZRVUYzUXpORExFMUJRWGhETEVWQlFXZEVReXhOUVVGb1JDeEZRVUYzUkVNc1UwRkJlRVFzUlVGQmJVVkRMRk5CUVc1RkxFVkJRVGhGUXl4UFFVRTVSU3hEUVVGUU8wRkJRMFFpTENKbWFXeGxJam9pWTNKbFlYUmxMbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaWFXMXdiM0owSUh0a2FXWm1UR2x1WlhOOUlHWnliMjBnSnk0dUwyUnBabVl2YkdsdVpTYzdYRzVjYm1WNGNHOXlkQ0JtZFc1amRHbHZiaUJ6ZEhKMVkzUjFjbVZrVUdGMFkyZ29iMnhrUm1sc1pVNWhiV1VzSUc1bGQwWnBiR1ZPWVcxbExDQnZiR1JUZEhJc0lHNWxkMU4wY2l3Z2IyeGtTR1ZoWkdWeUxDQnVaWGRJWldGa1pYSXNJRzl3ZEdsdmJuTXBJSHRjYmlBZ2FXWWdLQ0Z2Y0hScGIyNXpLU0I3WEc0Z0lDQWdiM0IwYVc5dWN5QTlJSHQ5TzF4dUlDQjlYRzRnSUdsbUlDaDBlWEJsYjJZZ2IzQjBhVzl1Y3k1amIyNTBaWGgwSUQwOVBTQW5kVzVrWldacGJtVmtKeWtnZTF4dUlDQWdJRzl3ZEdsdmJuTXVZMjl1ZEdWNGRDQTlJRFE3WEc0Z0lIMWNibHh1SUNCamIyNXpkQ0JrYVdabUlEMGdaR2xtWmt4cGJtVnpLRzlzWkZOMGNpd2dibVYzVTNSeUxDQnZjSFJwYjI1ektUdGNiaUFnWkdsbVppNXdkWE5vS0h0MllXeDFaVG9nSnljc0lHeHBibVZ6T2lCYlhYMHBPeUFnSUM4dklFRndjR1Z1WkNCaGJpQmxiWEIwZVNCMllXeDFaU0IwYnlCdFlXdGxJR05zWldGdWRYQWdaV0Z6YVdWeVhHNWNiaUFnWm5WdVkzUnBiMjRnWTI5dWRHVjRkRXhwYm1WektHeHBibVZ6S1NCN1hHNGdJQ0FnY21WMGRYSnVJR3hwYm1WekxtMWhjQ2htZFc1amRHbHZiaWhsYm5SeWVTa2dleUJ5WlhSMWNtNGdKeUFuSUNzZ1pXNTBjbms3SUgwcE8xeHVJQ0I5WEc1Y2JpQWdiR1YwSUdoMWJtdHpJRDBnVzEwN1hHNGdJR3hsZENCdmJHUlNZVzVuWlZOMFlYSjBJRDBnTUN3Z2JtVjNVbUZ1WjJWVGRHRnlkQ0E5SURBc0lHTjFjbEpoYm1kbElEMGdXMTBzWEc0Z0lDQWdJQ0J2YkdSTWFXNWxJRDBnTVN3Z2JtVjNUR2x1WlNBOUlERTdYRzRnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z1pHbG1aaTVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVJQ0FnSUdOdmJuTjBJR04xY25KbGJuUWdQU0JrYVdabVcybGRMRnh1SUNBZ0lDQWdJQ0FnSUd4cGJtVnpJRDBnWTNWeWNtVnVkQzVzYVc1bGN5QjhmQ0JqZFhKeVpXNTBMblpoYkhWbExuSmxjR3hoWTJVb0wxeGNiaVF2TENBbkp5a3VjM0JzYVhRb0oxeGNiaWNwTzF4dUlDQWdJR04xY25KbGJuUXViR2x1WlhNZ1BTQnNhVzVsY3p0Y2JseHVJQ0FnSUdsbUlDaGpkWEp5Wlc1MExtRmtaR1ZrSUh4OElHTjFjbkpsYm5RdWNtVnRiM1psWkNrZ2UxeHVJQ0FnSUNBZ0x5OGdTV1lnZDJVZ2FHRjJaU0J3Y21WMmFXOTFjeUJqYjI1MFpYaDBMQ0J6ZEdGeWRDQjNhWFJvSUhSb1lYUmNiaUFnSUNBZ0lHbG1JQ2doYjJ4a1VtRnVaMlZUZEdGeWRDa2dlMXh1SUNBZ0lDQWdJQ0JqYjI1emRDQndjbVYySUQwZ1pHbG1abHRwSUMwZ01WMDdYRzRnSUNBZ0lDQWdJRzlzWkZKaGJtZGxVM1JoY25RZ1BTQnZiR1JNYVc1bE8xeHVJQ0FnSUNBZ0lDQnVaWGRTWVc1blpWTjBZWEowSUQwZ2JtVjNUR2x1WlR0Y2JseHVJQ0FnSUNBZ0lDQnBaaUFvY0hKbGRpa2dlMXh1SUNBZ0lDQWdJQ0FnSUdOMWNsSmhibWRsSUQwZ2IzQjBhVzl1Y3k1amIyNTBaWGgwSUQ0Z01DQS9JR052Ym5SbGVIUk1hVzVsY3lod2NtVjJMbXhwYm1WekxuTnNhV05sS0MxdmNIUnBiMjV6TG1OdmJuUmxlSFFwS1NBNklGdGRPMXh1SUNBZ0lDQWdJQ0FnSUc5c1pGSmhibWRsVTNSaGNuUWdMVDBnWTNWeVVtRnVaMlV1YkdWdVozUm9PMXh1SUNBZ0lDQWdJQ0FnSUc1bGQxSmhibWRsVTNSaGNuUWdMVDBnWTNWeVVtRnVaMlV1YkdWdVozUm9PMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUM4dklFOTFkSEIxZENCdmRYSWdZMmhoYm1kbGMxeHVJQ0FnSUNBZ1kzVnlVbUZ1WjJVdWNIVnphQ2d1TGk0Z2JHbHVaWE11YldGd0tHWjFibU4wYVc5dUtHVnVkSEo1S1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlBb1kzVnljbVZ1ZEM1aFpHUmxaQ0EvSUNjckp5QTZJQ2N0SnlrZ0t5QmxiblJ5ZVR0Y2JpQWdJQ0FnSUgwcEtUdGNibHh1SUNBZ0lDQWdMeThnVkhKaFkyc2dkR2hsSUhWd1pHRjBaV1FnWm1sc1pTQndiM05wZEdsdmJseHVJQ0FnSUNBZ2FXWWdLR04xY25KbGJuUXVZV1JrWldRcElIdGNiaUFnSUNBZ0lDQWdibVYzVEdsdVpTQXJQU0JzYVc1bGN5NXNaVzVuZEdnN1hHNGdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNCdmJHUk1hVzVsSUNzOUlHeHBibVZ6TG14bGJtZDBhRHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0x5OGdTV1JsYm5ScFkyRnNJR052Ym5SbGVIUWdiR2x1WlhNdUlGUnlZV05ySUd4cGJtVWdZMmhoYm1kbGMxeHVJQ0FnSUNBZ2FXWWdLRzlzWkZKaGJtZGxVM1JoY25RcElIdGNiaUFnSUNBZ0lDQWdMeThnUTJ4dmMyVWdiM1YwSUdGdWVTQmphR0Z1WjJWeklIUm9ZWFFnYUdGMlpTQmlaV1Z1SUc5MWRIQjFkQ0FvYjNJZ2FtOXBiaUJ2ZG1WeWJHRndjR2x1WnlsY2JpQWdJQ0FnSUNBZ2FXWWdLR3hwYm1WekxteGxibWQwYUNBOFBTQnZjSFJwYjI1ekxtTnZiblJsZUhRZ0tpQXlJQ1ltSUdrZ1BDQmthV1ptTG14bGJtZDBhQ0F0SURJcElIdGNiaUFnSUNBZ0lDQWdJQ0F2THlCUGRtVnliR0Z3Y0dsdVoxeHVJQ0FnSUNBZ0lDQWdJR04xY2xKaGJtZGxMbkIxYzJnb0xpNHVJR052Ym5SbGVIUk1hVzVsY3loc2FXNWxjeWtwTzF4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lDOHZJR1Z1WkNCMGFHVWdjbUZ1WjJVZ1lXNWtJRzkxZEhCMWRGeHVJQ0FnSUNBZ0lDQWdJR3hsZENCamIyNTBaWGgwVTJsNlpTQTlJRTFoZEdndWJXbHVLR3hwYm1WekxteGxibWQwYUN3Z2IzQjBhVzl1Y3k1amIyNTBaWGgwS1R0Y2JpQWdJQ0FnSUNBZ0lDQmpkWEpTWVc1blpTNXdkWE5vS0M0dUxpQmpiMjUwWlhoMFRHbHVaWE1vYkdsdVpYTXVjMnhwWTJVb01Dd2dZMjl1ZEdWNGRGTnBlbVVwS1NrN1hHNWNiaUFnSUNBZ0lDQWdJQ0JzWlhRZ2FIVnVheUE5SUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJRzlzWkZOMFlYSjBPaUJ2YkdSU1lXNW5aVk4wWVhKMExGeHVJQ0FnSUNBZ0lDQWdJQ0FnYjJ4a1RHbHVaWE02SUNodmJHUk1hVzVsSUMwZ2IyeGtVbUZ1WjJWVGRHRnlkQ0FySUdOdmJuUmxlSFJUYVhwbEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUc1bGQxTjBZWEowT2lCdVpYZFNZVzVuWlZOMFlYSjBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ2JtVjNUR2x1WlhNNklDaHVaWGRNYVc1bElDMGdibVYzVW1GdVoyVlRkR0Z5ZENBcklHTnZiblJsZUhSVGFYcGxLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lHeHBibVZ6T2lCamRYSlNZVzVuWlZ4dUlDQWdJQ0FnSUNBZ0lIMDdYRzRnSUNBZ0lDQWdJQ0FnYVdZZ0tHa2dQajBnWkdsbVppNXNaVzVuZEdnZ0xTQXlJQ1ltSUd4cGJtVnpMbXhsYm1kMGFDQThQU0J2Y0hScGIyNXpMbU52Ym5SbGVIUXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZJRVZQUmlCcGN5QnBibk5wWkdVZ2RHaHBjeUJvZFc1clhHNGdJQ0FnSUNBZ0lDQWdJQ0JzWlhRZ2IyeGtSVTlHVG1WM2JHbHVaU0E5SUNndlhGeHVKQzh1ZEdWemRDaHZiR1JUZEhJcEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUd4bGRDQnVaWGRGVDBaT1pYZHNhVzVsSUQwZ0tDOWNYRzRrTHk1MFpYTjBLRzVsZDFOMGNpa3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR3hwYm1WekxteGxibWQwYUNBOVBTQXdJQ1ltSUNGdmJHUkZUMFpPWlhkc2FXNWxLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUhOd1pXTnBZV3dnWTJGelpUb2diMnhrSUdoaGN5QnVieUJsYjJ3Z1lXNWtJRzV2SUhSeVlXbHNhVzVuSUdOdmJuUmxlSFE3SUc1dkxXNXNJR05oYmlCbGJtUWdkWEFnWW1WbWIzSmxJR0ZrWkhOY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnWTNWeVVtRnVaMlV1YzNCc2FXTmxLR2gxYm1zdWIyeGtUR2x1WlhNc0lEQXNJQ2RjWEZ4Y0lFNXZJRzVsZDJ4cGJtVWdZWFFnWlc1a0lHOW1JR1pwYkdVbktUdGNiaUFnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb0lXOXNaRVZQUms1bGQyeHBibVVnZkh3Z0lXNWxkMFZQUms1bGQyeHBibVVwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnWTNWeVVtRnVaMlV1Y0hWemFDZ25YRnhjWENCT2J5QnVaWGRzYVc1bElHRjBJR1Z1WkNCdlppQm1hV3hsSnlrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJR2gxYm10ekxuQjFjMmdvYUhWdWF5azdYRzVjYmlBZ0lDQWdJQ0FnSUNCdmJHUlNZVzVuWlZOMFlYSjBJRDBnTUR0Y2JpQWdJQ0FnSUNBZ0lDQnVaWGRTWVc1blpWTjBZWEowSUQwZ01EdGNiaUFnSUNBZ0lDQWdJQ0JqZFhKU1lXNW5aU0E5SUZ0ZE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQnZiR1JNYVc1bElDczlJR3hwYm1WekxteGxibWQwYUR0Y2JpQWdJQ0FnSUc1bGQweHBibVVnS3owZ2JHbHVaWE11YkdWdVozUm9PMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJSEpsZEhWeWJpQjdYRzRnSUNBZ2IyeGtSbWxzWlU1aGJXVTZJRzlzWkVacGJHVk9ZVzFsTENCdVpYZEdhV3hsVG1GdFpUb2dibVYzUm1sc1pVNWhiV1VzWEc0Z0lDQWdiMnhrU0dWaFpHVnlPaUJ2YkdSSVpXRmtaWElzSUc1bGQwaGxZV1JsY2pvZ2JtVjNTR1ZoWkdWeUxGeHVJQ0FnSUdoMWJtdHpPaUJvZFc1cmMxeHVJQ0I5TzF4dWZWeHVYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdZM0psWVhSbFZIZHZSbWxzWlhOUVlYUmphQ2h2YkdSR2FXeGxUbUZ0WlN3Z2JtVjNSbWxzWlU1aGJXVXNJRzlzWkZOMGNpd2dibVYzVTNSeUxDQnZiR1JJWldGa1pYSXNJRzVsZDBobFlXUmxjaXdnYjNCMGFXOXVjeWtnZTF4dUlDQmpiMjV6ZENCa2FXWm1JRDBnYzNSeWRXTjBkWEpsWkZCaGRHTm9LRzlzWkVacGJHVk9ZVzFsTENCdVpYZEdhV3hsVG1GdFpTd2diMnhrVTNSeUxDQnVaWGRUZEhJc0lHOXNaRWhsWVdSbGNpd2dibVYzU0dWaFpHVnlMQ0J2Y0hScGIyNXpLVHRjYmx4dUlDQmpiMjV6ZENCeVpYUWdQU0JiWFR0Y2JpQWdhV1lnS0c5c1pFWnBiR1ZPWVcxbElEMDlJRzVsZDBacGJHVk9ZVzFsS1NCN1hHNGdJQ0FnY21WMExuQjFjMmdvSjBsdVpHVjRPaUFuSUNzZ2IyeGtSbWxzWlU1aGJXVXBPMXh1SUNCOVhHNGdJSEpsZEM1d2RYTm9LQ2M5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOUp5azdYRzRnSUhKbGRDNXdkWE5vS0NjdExTMGdKeUFySUdScFptWXViMnhrUm1sc1pVNWhiV1VnS3lBb2RIbHdaVzltSUdScFptWXViMnhrU0dWaFpHVnlJRDA5UFNBbmRXNWtaV1pwYm1Wa0p5QS9JQ2NuSURvZ0oxeGNkQ2NnS3lCa2FXWm1MbTlzWkVobFlXUmxjaWtwTzF4dUlDQnlaWFF1Y0hWemFDZ25LeXNySUNjZ0t5QmthV1ptTG01bGQwWnBiR1ZPWVcxbElDc2dLSFI1Y0dWdlppQmthV1ptTG01bGQwaGxZV1JsY2lBOVBUMGdKM1Z1WkdWbWFXNWxaQ2NnUHlBbkp5QTZJQ2RjWEhRbklDc2daR2xtWmk1dVpYZElaV0ZrWlhJcEtUdGNibHh1SUNCbWIzSWdLR3hsZENCcElEMGdNRHNnYVNBOElHUnBabVl1YUhWdWEzTXViR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0JqYjI1emRDQm9kVzVySUQwZ1pHbG1aaTVvZFc1cmMxdHBYVHRjYmlBZ0lDQnlaWFF1Y0hWemFDaGNiaUFnSUNBZ0lDZEFRQ0F0SnlBcklHaDFibXN1YjJ4a1UzUmhjblFnS3lBbkxDY2dLeUJvZFc1ckxtOXNaRXhwYm1WelhHNGdJQ0FnSUNBcklDY2dLeWNnS3lCb2RXNXJMbTVsZDFOMFlYSjBJQ3NnSnl3bklDc2dhSFZ1YXk1dVpYZE1hVzVsYzF4dUlDQWdJQ0FnS3lBbklFQkFKMXh1SUNBZ0lDazdYRzRnSUNBZ2NtVjBMbkIxYzJndVlYQndiSGtvY21WMExDQm9kVzVyTG14cGJtVnpLVHRjYmlBZ2ZWeHVYRzRnSUhKbGRIVnliaUJ5WlhRdWFtOXBiaWduWEZ4dUp5a2dLeUFuWEZ4dUp6dGNibjFjYmx4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUdOeVpXRjBaVkJoZEdOb0tHWnBiR1ZPWVcxbExDQnZiR1JUZEhJc0lHNWxkMU4wY2l3Z2IyeGtTR1ZoWkdWeUxDQnVaWGRJWldGa1pYSXNJRzl3ZEdsdmJuTXBJSHRjYmlBZ2NtVjBkWEp1SUdOeVpXRjBaVlIzYjBacGJHVnpVR0YwWTJnb1ptbHNaVTVoYldVc0lHWnBiR1ZPWVcxbExDQnZiR1JUZEhJc0lHNWxkMU4wY2l3Z2IyeGtTR1ZoWkdWeUxDQnVaWGRJWldGa1pYSXNJRzl3ZEdsdmJuTXBPMXh1ZlZ4dUlsMTlcblxuXG4vKioqLyB9KSxcbi8qIDE1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1widXNlIHN0cmljdFwiO1xuXG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovYXJyYXlFcXVhbCA9IGFycmF5RXF1YWw7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2FycmF5U3RhcnRzV2l0aCA9IGFycmF5U3RhcnRzV2l0aDtcblx0ZnVuY3Rpb24gYXJyYXlFcXVhbChhLCBiKSB7XG5cdCAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuXHQgICAgcmV0dXJuIGZhbHNlO1xuXHQgIH1cblxuXHQgIHJldHVybiBhcnJheVN0YXJ0c1dpdGgoYSwgYik7XG5cdH1cblxuXHRmdW5jdGlvbiBhcnJheVN0YXJ0c1dpdGgoYXJyYXksIHN0YXJ0KSB7XG5cdCAgaWYgKHN0YXJ0Lmxlbmd0aCA+IGFycmF5Lmxlbmd0aCkge1xuXHQgICAgcmV0dXJuIGZhbHNlO1xuXHQgIH1cblxuXHQgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhcnQubGVuZ3RoOyBpKyspIHtcblx0ICAgIGlmIChzdGFydFtpXSAhPT0gYXJyYXlbaV0pIHtcblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHJldHVybiB0cnVlO1xuXHR9XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OTFkR2xzTDJGeWNtRjVMbXB6SWwwc0ltNWhiV1Z6SWpwYkltRnljbUY1UlhGMVlXd2lMQ0poY25KaGVWTjBZWEowYzFkcGRHZ2lMQ0poSWl3aVlpSXNJbXhsYm1kMGFDSXNJbUZ5Y21GNUlpd2ljM1JoY25RaUxDSnBJbDBzSW0xaGNIQnBibWR6SWpvaU96czdaME5CUVdkQ1FTeFZMRWRCUVVGQkxGVTdlVVJCVVVGRExHVXNSMEZCUVVFc1pUdEJRVkpVTEZOQlFWTkVMRlZCUVZRc1EwRkJiMEpGTEVOQlFYQkNMRVZCUVhWQ1F5eERRVUYyUWl4RlFVRXdRanRCUVVNdlFpeE5RVUZKUkN4RlFVRkZSU3hOUVVGR0xFdEJRV0ZFTEVWQlFVVkRMRTFCUVc1Q0xFVkJRVEpDTzBGQlEzcENMRmRCUVU4c1MwRkJVRHRCUVVORU96dEJRVVZFTEZOQlFVOUlMR2RDUVVGblFrTXNRMEZCYUVJc1JVRkJiVUpETEVOQlFXNUNMRU5CUVZBN1FVRkRSRHM3UVVGRlRTeFRRVUZUUml4bFFVRlVMRU5CUVhsQ1NTeExRVUY2UWl4RlFVRm5RME1zUzBGQmFFTXNSVUZCZFVNN1FVRkROVU1zVFVGQlNVRXNUVUZCVFVZc1RVRkJUaXhIUVVGbFF5eE5RVUZOUkN4TlFVRjZRaXhGUVVGcFF6dEJRVU12UWl4WFFVRlBMRXRCUVZBN1FVRkRSRHM3UVVGRlJDeFBRVUZMTEVsQlFVbEhMRWxCUVVrc1EwRkJZaXhGUVVGblFrRXNTVUZCU1VRc1RVRkJUVVlzVFVGQk1VSXNSVUZCYTBOSExFZEJRV3hETEVWQlFYVkRPMEZCUTNKRExGRkJRVWxFTEUxQlFVMURMRU5CUVU0c1RVRkJZVVlzVFVGQlRVVXNRMEZCVGl4RFFVRnFRaXhGUVVFeVFqdEJRVU42UWl4aFFVRlBMRXRCUVZBN1FVRkRSRHRCUVVOR096dEJRVVZFTEZOQlFVOHNTVUZCVUR0QlFVTkVJaXdpWm1sc1pTSTZJbUZ5Y21GNUxtcHpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpWlhod2IzSjBJR1oxYm1OMGFXOXVJR0Z5Y21GNVJYRjFZV3dvWVN3Z1lpa2dlMXh1SUNCcFppQW9ZUzVzWlc1bmRHZ2dJVDA5SUdJdWJHVnVaM1JvS1NCN1hHNGdJQ0FnY21WMGRYSnVJR1poYkhObE8xeHVJQ0I5WEc1Y2JpQWdjbVYwZFhKdUlHRnljbUY1VTNSaGNuUnpWMmwwYUNoaExDQmlLVHRjYm4xY2JseHVaWGh3YjNKMElHWjFibU4wYVc5dUlHRnljbUY1VTNSaGNuUnpWMmwwYUNoaGNuSmhlU3dnYzNSaGNuUXBJSHRjYmlBZ2FXWWdLSE4wWVhKMExteGxibWQwYUNBK0lHRnljbUY1TG14bGJtZDBhQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQm1ZV3h6WlR0Y2JpQWdmVnh1WEc0Z0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2djM1JoY25RdWJHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQnBaaUFvYzNSaGNuUmJhVjBnSVQwOUlHRnljbUY1VzJsZEtTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z1ptRnNjMlU3WEc0Z0lDQWdmVnh1SUNCOVhHNWNiaUFnY21WMGRYSnVJSFJ5ZFdVN1hHNTlYRzRpWFgwPVxuXG5cbi8qKiovIH0pLFxuLyogMTYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXCJ1c2Ugc3RyaWN0XCI7XG5cblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jb252ZXJ0Q2hhbmdlc1RvRE1QID0gY29udmVydENoYW5nZXNUb0RNUDtcblx0Ly8gU2VlOiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLWRpZmYtbWF0Y2gtcGF0Y2gvd2lraS9BUElcblx0ZnVuY3Rpb24gY29udmVydENoYW5nZXNUb0RNUChjaGFuZ2VzKSB7XG5cdCAgdmFyIHJldCA9IFtdLFxuXHQgICAgICBjaGFuZ2UgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdm9pZCAwIC8qaXN0YW5idWwgaWdub3JlIGVuZCovLFxuXHQgICAgICBvcGVyYXRpb24gPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdm9pZCAwIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXHQgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGg7IGkrKykge1xuXHQgICAgY2hhbmdlID0gY2hhbmdlc1tpXTtcblx0ICAgIGlmIChjaGFuZ2UuYWRkZWQpIHtcblx0ICAgICAgb3BlcmF0aW9uID0gMTtcblx0ICAgIH0gZWxzZSBpZiAoY2hhbmdlLnJlbW92ZWQpIHtcblx0ICAgICAgb3BlcmF0aW9uID0gLTE7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBvcGVyYXRpb24gPSAwO1xuXHQgICAgfVxuXG5cdCAgICByZXQucHVzaChbb3BlcmF0aW9uLCBjaGFuZ2UudmFsdWVdKTtcblx0ICB9XG5cdCAgcmV0dXJuIHJldDtcblx0fVxuXHQvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTlqYjI1MlpYSjBMMlJ0Y0M1cWN5SmRMQ0p1WVcxbGN5STZXeUpqYjI1MlpYSjBRMmhoYm1kbGMxUnZSRTFRSWl3aVkyaGhibWRsY3lJc0luSmxkQ0lzSW1Ob1lXNW5aU0lzSW05d1pYSmhkR2x2YmlJc0lta2lMQ0pzWlc1bmRHZ2lMQ0poWkdSbFpDSXNJbkpsYlc5MlpXUWlMQ0p3ZFhOb0lpd2lkbUZzZFdVaVhTd2liV0Z3Y0dsdVozTWlPaUk3T3p0blEwRkRaMEpCTEcxQ0xFZEJRVUZCTEcxQ08wRkJSR2hDTzBGQlEwOHNVMEZCVTBFc2JVSkJRVlFzUTBGQk5rSkRMRTlCUVRkQ0xFVkJRWE5ETzBGQlF6TkRMRTFCUVVsRExFMUJRVTBzUlVGQlZqdEJRVUZCTEUxQlEwbERMSGREUVVSS08wRkJRVUVzVFVGRlNVTXNNa05CUmtvN1FVRkhRU3hQUVVGTExFbEJRVWxETEVsQlFVa3NRMEZCWWl4RlFVRm5Ra0VzU1VGQlNVb3NVVUZCVVVzc1RVRkJOVUlzUlVGQmIwTkVMRWRCUVhCRExFVkJRWGxETzBGQlEzWkRSaXhoUVVGVFJpeFJRVUZSU1N4RFFVRlNMRU5CUVZRN1FVRkRRU3hSUVVGSlJpeFBRVUZQU1N4TFFVRllMRVZCUVd0Q08wRkJRMmhDU0N4clFrRkJXU3hEUVVGYU8wRkJRMFFzUzBGR1JDeE5RVVZQTEVsQlFVbEVMRTlCUVU5TExFOUJRVmdzUlVGQmIwSTdRVUZEZWtKS0xHdENRVUZaTEVOQlFVTXNRMEZCWWp0QlFVTkVMRXRCUmswc1RVRkZRVHRCUVVOTVFTeHJRa0ZCV1N4RFFVRmFPMEZCUTBRN08wRkJSVVJHTEZGQlFVbFBMRWxCUVVvc1EwRkJVeXhEUVVGRFRDeFRRVUZFTEVWQlFWbEVMRTlCUVU5UExFdEJRVzVDTEVOQlFWUTdRVUZEUkR0QlFVTkVMRk5CUVU5U0xFZEJRVkE3UVVGRFJDSXNJbVpwYkdVaU9pSmtiWEF1YW5NaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SXZMeUJUWldVNklHaDBkSEE2THk5amIyUmxMbWR2YjJkc1pTNWpiMjB2Y0M5bmIyOW5iR1V0WkdsbVppMXRZWFJqYUMxd1lYUmphQzkzYVd0cEwwRlFTVnh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR052Ym5abGNuUkRhR0Z1WjJWelZHOUVUVkFvWTJoaGJtZGxjeWtnZTF4dUlDQnNaWFFnY21WMElEMGdXMTBzWEc0Z0lDQWdJQ0JqYUdGdVoyVXNYRzRnSUNBZ0lDQnZjR1Z5WVhScGIyNDdYRzRnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z1kyaGhibWRsY3k1c1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lHTm9ZVzVuWlNBOUlHTm9ZVzVuWlhOYmFWMDdYRzRnSUNBZ2FXWWdLR05vWVc1blpTNWhaR1JsWkNrZ2UxeHVJQ0FnSUNBZ2IzQmxjbUYwYVc5dUlEMGdNVHRjYmlBZ0lDQjlJR1ZzYzJVZ2FXWWdLR05vWVc1blpTNXlaVzF2ZG1Wa0tTQjdYRzRnSUNBZ0lDQnZjR1Z5WVhScGIyNGdQU0F0TVR0Y2JpQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdiM0JsY21GMGFXOXVJRDBnTUR0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0J5WlhRdWNIVnphQ2hiYjNCbGNtRjBhVzl1TENCamFHRnVaMlV1ZG1Gc2RXVmRLVHRjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdjbVYwTzF4dWZWeHVJbDE5XG5cblxuLyoqKi8gfSksXG4vKiAxNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8ndXNlIHN0cmljdCc7XG5cblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jb252ZXJ0Q2hhbmdlc1RvWE1MID0gY29udmVydENoYW5nZXNUb1hNTDtcblx0ZnVuY3Rpb24gY29udmVydENoYW5nZXNUb1hNTChjaGFuZ2VzKSB7XG5cdCAgdmFyIHJldCA9IFtdO1xuXHQgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGg7IGkrKykge1xuXHQgICAgdmFyIGNoYW5nZSA9IGNoYW5nZXNbaV07XG5cdCAgICBpZiAoY2hhbmdlLmFkZGVkKSB7XG5cdCAgICAgIHJldC5wdXNoKCc8aW5zPicpO1xuXHQgICAgfSBlbHNlIGlmIChjaGFuZ2UucmVtb3ZlZCkge1xuXHQgICAgICByZXQucHVzaCgnPGRlbD4nKTtcblx0ICAgIH1cblxuXHQgICAgcmV0LnB1c2goZXNjYXBlSFRNTChjaGFuZ2UudmFsdWUpKTtcblxuXHQgICAgaWYgKGNoYW5nZS5hZGRlZCkge1xuXHQgICAgICByZXQucHVzaCgnPC9pbnM+Jyk7XG5cdCAgICB9IGVsc2UgaWYgKGNoYW5nZS5yZW1vdmVkKSB7XG5cdCAgICAgIHJldC5wdXNoKCc8L2RlbD4nKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgcmV0dXJuIHJldC5qb2luKCcnKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGVzY2FwZUhUTUwocykge1xuXHQgIHZhciBuID0gcztcblx0ICBuID0gbi5yZXBsYWNlKC8mL2csICcmYW1wOycpO1xuXHQgIG4gPSBuLnJlcGxhY2UoLzwvZywgJyZsdDsnKTtcblx0ICBuID0gbi5yZXBsYWNlKC8+L2csICcmZ3Q7Jyk7XG5cdCAgbiA9IG4ucmVwbGFjZSgvXCIvZywgJyZxdW90OycpO1xuXG5cdCAgcmV0dXJuIG47XG5cdH1cblx0Ly8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5amIyNTJaWEowTDNodGJDNXFjeUpkTENKdVlXMWxjeUk2V3lKamIyNTJaWEowUTJoaGJtZGxjMVJ2V0UxTUlpd2lZMmhoYm1kbGN5SXNJbkpsZENJc0lta2lMQ0pzWlc1bmRHZ2lMQ0pqYUdGdVoyVWlMQ0poWkdSbFpDSXNJbkIxYzJnaUxDSnlaVzF2ZG1Wa0lpd2laWE5qWVhCbFNGUk5UQ0lzSW5aaGJIVmxJaXdpYW05cGJpSXNJbk1pTENKdUlpd2ljbVZ3YkdGalpTSmRMQ0p0WVhCd2FXNW5jeUk2SWpzN08yZERRVUZuUWtFc2JVSXNSMEZCUVVFc2JVSTdRVUZCVkN4VFFVRlRRU3h0UWtGQlZDeERRVUUyUWtNc1QwRkJOMElzUlVGQmMwTTdRVUZETTBNc1RVRkJTVU1zVFVGQlRTeEZRVUZXTzBGQlEwRXNUMEZCU3l4SlFVRkpReXhKUVVGSkxFTkJRV0lzUlVGQlowSkJMRWxCUVVsR0xGRkJRVkZITEUxQlFUVkNMRVZCUVc5RFJDeEhRVUZ3UXl4RlFVRjVRenRCUVVOMlF5eFJRVUZKUlN4VFFVRlRTaXhSUVVGUlJTeERRVUZTTEVOQlFXSTdRVUZEUVN4UlFVRkpSU3hQUVVGUFF5eExRVUZZTEVWQlFXdENPMEZCUTJoQ1NpeFZRVUZKU3l4SlFVRktMRU5CUVZNc1QwRkJWRHRCUVVORUxFdEJSa1FzVFVGRlR5eEpRVUZKUml4UFFVRlBSeXhQUVVGWUxFVkJRVzlDTzBGQlEzcENUaXhWUVVGSlN5eEpRVUZLTEVOQlFWTXNUMEZCVkR0QlFVTkVPenRCUVVWRVRDeFJRVUZKU3l4SlFVRktMRU5CUVZORkxGZEJRVmRLTEU5QlFVOUxMRXRCUVd4Q0xFTkJRVlE3TzBGQlJVRXNVVUZCU1V3c1QwRkJUME1zUzBGQldDeEZRVUZyUWp0QlFVTm9Ra29zVlVGQlNVc3NTVUZCU2l4RFFVRlRMRkZCUVZRN1FVRkRSQ3hMUVVaRUxFMUJSVThzU1VGQlNVWXNUMEZCVDBjc1QwRkJXQ3hGUVVGdlFqdEJRVU42UWs0c1ZVRkJTVXNzU1VGQlNpeERRVUZUTEZGQlFWUTdRVUZEUkR0QlFVTkdPMEZCUTBRc1UwRkJUMHdzU1VGQlNWTXNTVUZCU2l4RFFVRlRMRVZCUVZRc1EwRkJVRHRCUVVORU96dEJRVVZFTEZOQlFWTkdMRlZCUVZRc1EwRkJiMEpITEVOQlFYQkNMRVZCUVhWQ08wRkJRM0pDTEUxQlFVbERMRWxCUVVsRUxFTkJRVkk3UVVGRFFVTXNUVUZCU1VFc1JVRkJSVU1zVDBGQlJpeERRVUZWTEVsQlFWWXNSVUZCWjBJc1QwRkJhRUlzUTBGQlNqdEJRVU5CUkN4TlFVRkpRU3hGUVVGRlF5eFBRVUZHTEVOQlFWVXNTVUZCVml4RlFVRm5RaXhOUVVGb1FpeERRVUZLTzBGQlEwRkVMRTFCUVVsQkxFVkJRVVZETEU5QlFVWXNRMEZCVlN4SlFVRldMRVZCUVdkQ0xFMUJRV2hDTEVOQlFVbzdRVUZEUVVRc1RVRkJTVUVzUlVGQlJVTXNUMEZCUml4RFFVRlZMRWxCUVZZc1JVRkJaMElzVVVGQmFFSXNRMEZCU2pzN1FVRkZRU3hUUVVGUFJDeERRVUZRTzBGQlEwUWlMQ0ptYVd4bElqb2llRzFzTG1weklpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2laWGh3YjNKMElHWjFibU4wYVc5dUlHTnZiblpsY25SRGFHRnVaMlZ6Vkc5WVRVd29ZMmhoYm1kbGN5a2dlMXh1SUNCc1pYUWdjbVYwSUQwZ1cxMDdYRzRnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z1kyaGhibWRsY3k1c1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lHeGxkQ0JqYUdGdVoyVWdQU0JqYUdGdVoyVnpXMmxkTzF4dUlDQWdJR2xtSUNoamFHRnVaMlV1WVdSa1pXUXBJSHRjYmlBZ0lDQWdJSEpsZEM1d2RYTm9LQ2M4YVc1elBpY3BPMXh1SUNBZ0lIMGdaV3h6WlNCcFppQW9ZMmhoYm1kbExuSmxiVzkyWldRcElIdGNiaUFnSUNBZ0lISmxkQzV3ZFhOb0tDYzhaR1ZzUGljcE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUhKbGRDNXdkWE5vS0dWelkyRndaVWhVVFV3b1kyaGhibWRsTG5aaGJIVmxLU2s3WEc1Y2JpQWdJQ0JwWmlBb1kyaGhibWRsTG1Ga1pHVmtLU0I3WEc0Z0lDQWdJQ0J5WlhRdWNIVnphQ2duUEM5cGJuTStKeWs3WEc0Z0lDQWdmU0JsYkhObElHbG1JQ2hqYUdGdVoyVXVjbVZ0YjNabFpDa2dlMXh1SUNBZ0lDQWdjbVYwTG5CMWMyZ29Kend2WkdWc1BpY3BPMXh1SUNBZ0lIMWNiaUFnZlZ4dUlDQnlaWFIxY200Z2NtVjBMbXB2YVc0b0p5Y3BPMXh1ZlZ4dVhHNW1kVzVqZEdsdmJpQmxjMk5oY0dWSVZFMU1LSE1wSUh0Y2JpQWdiR1YwSUc0Z1BTQnpPMXh1SUNCdUlEMGdiaTV5WlhCc1lXTmxLQzhtTDJjc0lDY21ZVzF3T3ljcE8xeHVJQ0J1SUQwZ2JpNXlaWEJzWVdObEtDODhMMmNzSUNjbWJIUTdKeWs3WEc0Z0lHNGdQU0J1TG5KbGNHeGhZMlVvTHo0dlp5d2dKeVpuZERzbktUdGNiaUFnYmlBOUlHNHVjbVZ3YkdGalpTZ3ZYQ0l2Wnl3Z0p5WnhkVzkwT3ljcE8xeHVYRzRnSUhKbGRIVnliaUJ1TzF4dWZWeHVJbDE5XG5cblxuLyoqKi8gfSlcbi8qKioqKiovIF0pXG59KTtcbjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9kaWZmL2Rpc3QvZGlmZi5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvZGlmZi9kaXN0L2RpZmYuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyID0gbm9vcDtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIihmdW5jdGlvbiAoZ2xvYmFsLCB1bmRlZmluZWQpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIGlmIChnbG9iYWwuc2V0SW1tZWRpYXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbmV4dEhhbmRsZSA9IDE7IC8vIFNwZWMgc2F5cyBncmVhdGVyIHRoYW4gemVyb1xuICAgIHZhciB0YXNrc0J5SGFuZGxlID0ge307XG4gICAgdmFyIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IGZhbHNlO1xuICAgIHZhciBkb2MgPSBnbG9iYWwuZG9jdW1lbnQ7XG4gICAgdmFyIHJlZ2lzdGVySW1tZWRpYXRlO1xuXG4gICAgZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGNhbGxiYWNrKSB7XG4gICAgICAvLyBDYWxsYmFjayBjYW4gZWl0aGVyIGJlIGEgZnVuY3Rpb24gb3IgYSBzdHJpbmdcbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjYWxsYmFjayA9IG5ldyBGdW5jdGlvbihcIlwiICsgY2FsbGJhY2spO1xuICAgICAgfVxuICAgICAgLy8gQ29weSBmdW5jdGlvbiBhcmd1bWVudHNcbiAgICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaSArIDFdO1xuICAgICAgfVxuICAgICAgLy8gU3RvcmUgYW5kIHJlZ2lzdGVyIHRoZSB0YXNrXG4gICAgICB2YXIgdGFzayA9IHsgY2FsbGJhY2s6IGNhbGxiYWNrLCBhcmdzOiBhcmdzIH07XG4gICAgICB0YXNrc0J5SGFuZGxlW25leHRIYW5kbGVdID0gdGFzaztcbiAgICAgIHJlZ2lzdGVySW1tZWRpYXRlKG5leHRIYW5kbGUpO1xuICAgICAgcmV0dXJuIG5leHRIYW5kbGUrKztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShoYW5kbGUpIHtcbiAgICAgICAgZGVsZXRlIHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW4odGFzaykge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSB0YXNrLmNhbGxiYWNrO1xuICAgICAgICB2YXIgYXJncyA9IHRhc2suYXJncztcbiAgICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjYWxsYmFjay5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW5JZlByZXNlbnQoaGFuZGxlKSB7XG4gICAgICAgIC8vIEZyb20gdGhlIHNwZWM6IFwiV2FpdCB1bnRpbCBhbnkgaW52b2NhdGlvbnMgb2YgdGhpcyBhbGdvcml0aG0gc3RhcnRlZCBiZWZvcmUgdGhpcyBvbmUgaGF2ZSBjb21wbGV0ZWQuXCJcbiAgICAgICAgLy8gU28gaWYgd2UncmUgY3VycmVudGx5IHJ1bm5pbmcgYSB0YXNrLCB3ZSdsbCBuZWVkIHRvIGRlbGF5IHRoaXMgaW52b2NhdGlvbi5cbiAgICAgICAgaWYgKGN1cnJlbnRseVJ1bm5pbmdBVGFzaykge1xuICAgICAgICAgICAgLy8gRGVsYXkgYnkgZG9pbmcgYSBzZXRUaW1lb3V0LiBzZXRJbW1lZGlhdGUgd2FzIHRyaWVkIGluc3RlYWQsIGJ1dCBpbiBGaXJlZm94IDcgaXQgZ2VuZXJhdGVkIGFcbiAgICAgICAgICAgIC8vIFwidG9vIG11Y2ggcmVjdXJzaW9uXCIgZXJyb3IuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwgMCwgaGFuZGxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciB0YXNrID0gdGFza3NCeUhhbmRsZVtoYW5kbGVdO1xuICAgICAgICAgICAgaWYgKHRhc2spIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bih0YXNrKTtcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckltbWVkaWF0ZShoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTmV4dFRpY2tJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkgeyBydW5JZlByZXNlbnQoaGFuZGxlKTsgfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FuVXNlUG9zdE1lc3NhZ2UoKSB7XG4gICAgICAgIC8vIFRoZSB0ZXN0IGFnYWluc3QgYGltcG9ydFNjcmlwdHNgIHByZXZlbnRzIHRoaXMgaW1wbGVtZW50YXRpb24gZnJvbSBiZWluZyBpbnN0YWxsZWQgaW5zaWRlIGEgd2ViIHdvcmtlcixcbiAgICAgICAgLy8gd2hlcmUgYGdsb2JhbC5wb3N0TWVzc2FnZWAgbWVhbnMgc29tZXRoaW5nIGNvbXBsZXRlbHkgZGlmZmVyZW50IGFuZCBjYW4ndCBiZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UuXG4gICAgICAgIGlmIChnbG9iYWwucG9zdE1lc3NhZ2UgJiYgIWdsb2JhbC5pbXBvcnRTY3JpcHRzKSB7XG4gICAgICAgICAgICB2YXIgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IHRydWU7XG4gICAgICAgICAgICB2YXIgb2xkT25NZXNzYWdlID0gZ2xvYmFsLm9ubWVzc2FnZTtcbiAgICAgICAgICAgIGdsb2JhbC5vbm1lc3NhZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzID0gZmFsc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKFwiXCIsIFwiKlwiKTtcbiAgICAgICAgICAgIGdsb2JhbC5vbm1lc3NhZ2UgPSBvbGRPbk1lc3NhZ2U7XG4gICAgICAgICAgICByZXR1cm4gcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxQb3N0TWVzc2FnZUltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICAvLyBJbnN0YWxscyBhbiBldmVudCBoYW5kbGVyIG9uIGBnbG9iYWxgIGZvciB0aGUgYG1lc3NhZ2VgIGV2ZW50OiBzZWVcbiAgICAgICAgLy8gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9ET00vd2luZG93LnBvc3RNZXNzYWdlXG4gICAgICAgIC8vICogaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvY29tbXMuaHRtbCNjcm9zc0RvY3VtZW50TWVzc2FnZXNcblxuICAgICAgICB2YXIgbWVzc2FnZVByZWZpeCA9IFwic2V0SW1tZWRpYXRlJFwiICsgTWF0aC5yYW5kb20oKSArIFwiJFwiO1xuICAgICAgICB2YXIgb25HbG9iYWxNZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2UgPT09IGdsb2JhbCAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBldmVudC5kYXRhID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgZXZlbnQuZGF0YS5pbmRleE9mKG1lc3NhZ2VQcmVmaXgpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KCtldmVudC5kYXRhLnNsaWNlKG1lc3NhZ2VQcmVmaXgubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgb25HbG9iYWxNZXNzYWdlLCBmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbG9iYWwuYXR0YWNoRXZlbnQoXCJvbm1lc3NhZ2VcIiwgb25HbG9iYWxNZXNzYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBnbG9iYWwucG9zdE1lc3NhZ2UobWVzc2FnZVByZWZpeCArIGhhbmRsZSwgXCIqXCIpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxNZXNzYWdlQ2hhbm5lbEltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIHJ1bklmUHJlc2VudChoYW5kbGUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKGhhbmRsZSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFJlYWR5U3RhdGVDaGFuZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGh0bWwgPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgPHNjcmlwdD4gZWxlbWVudDsgaXRzIHJlYWR5c3RhdGVjaGFuZ2UgZXZlbnQgd2lsbCBiZSBmaXJlZCBhc3luY2hyb25vdXNseSBvbmNlIGl0IGlzIGluc2VydGVkXG4gICAgICAgICAgICAvLyBpbnRvIHRoZSBkb2N1bWVudC4gRG8gc28sIHRodXMgcXVldWluZyB1cCB0aGUgdGFzay4gUmVtZW1iZXIgdG8gY2xlYW4gdXAgb25jZSBpdCdzIGJlZW4gY2FsbGVkLlxuICAgICAgICAgICAgdmFyIHNjcmlwdCA9IGRvYy5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICAgICAgc2NyaXB0ID0gbnVsbDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBodG1sLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFNldFRpbWVvdXRJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQocnVuSWZQcmVzZW50LCAwLCBoYW5kbGUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIElmIHN1cHBvcnRlZCwgd2Ugc2hvdWxkIGF0dGFjaCB0byB0aGUgcHJvdG90eXBlIG9mIGdsb2JhbCwgc2luY2UgdGhhdCBpcyB3aGVyZSBzZXRUaW1lb3V0IGV0IGFsLiBsaXZlLlxuICAgIHZhciBhdHRhY2hUbyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZ2xvYmFsKTtcbiAgICBhdHRhY2hUbyA9IGF0dGFjaFRvICYmIGF0dGFjaFRvLnNldFRpbWVvdXQgPyBhdHRhY2hUbyA6IGdsb2JhbDtcblxuICAgIC8vIERvbid0IGdldCBmb29sZWQgYnkgZS5nLiBicm93c2VyaWZ5IGVudmlyb25tZW50cy5cbiAgICBpZiAoe30udG9TdHJpbmcuY2FsbChnbG9iYWwucHJvY2VzcykgPT09IFwiW29iamVjdCBwcm9jZXNzXVwiKSB7XG4gICAgICAgIC8vIEZvciBOb2RlLmpzIGJlZm9yZSAwLjlcbiAgICAgICAgaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoY2FuVXNlUG9zdE1lc3NhZ2UoKSkge1xuICAgICAgICAvLyBGb3Igbm9uLUlFMTAgbW9kZXJuIGJyb3dzZXJzXG4gICAgICAgIGluc3RhbGxQb3N0TWVzc2FnZUltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGdsb2JhbC5NZXNzYWdlQ2hhbm5lbCkge1xuICAgICAgICAvLyBGb3Igd2ViIHdvcmtlcnMsIHdoZXJlIHN1cHBvcnRlZFxuICAgICAgICBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChkb2MgJiYgXCJvbnJlYWR5c3RhdGVjaGFuZ2VcIiBpbiBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKSkge1xuICAgICAgICAvLyBGb3IgSUUgNuKAkzhcbiAgICAgICAgaW5zdGFsbFJlYWR5U3RhdGVDaGFuZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRm9yIG9sZGVyIGJyb3dzZXJzXG4gICAgICAgIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKTtcbiAgICB9XG5cbiAgICBhdHRhY2hUby5zZXRJbW1lZGlhdGUgPSBzZXRJbW1lZGlhdGU7XG4gICAgYXR0YWNoVG8uY2xlYXJJbW1lZGlhdGUgPSBjbGVhckltbWVkaWF0ZTtcbn0odHlwZW9mIHNlbGYgPT09IFwidW5kZWZpbmVkXCIgPyB0eXBlb2YgZ2xvYmFsID09PSBcInVuZGVmaW5lZFwiID8gdGhpcyA6IGdsb2JhbCA6IHNlbGYpKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3NldGltbWVkaWF0ZS9zZXRJbW1lZGlhdGUuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3NldGltbWVkaWF0ZS9zZXRJbW1lZGlhdGUuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiLypcblx0TUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcblx0QXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cblxudmFyIHN0eWxlc0luRG9tID0ge307XG5cbnZhclx0bWVtb2l6ZSA9IGZ1bmN0aW9uIChmbikge1xuXHR2YXIgbWVtbztcblxuXHRyZXR1cm4gZnVuY3Rpb24gKCkge1xuXHRcdGlmICh0eXBlb2YgbWVtbyA9PT0gXCJ1bmRlZmluZWRcIikgbWVtbyA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0cmV0dXJuIG1lbW87XG5cdH07XG59O1xuXG52YXIgaXNPbGRJRSA9IG1lbW9pemUoZnVuY3Rpb24gKCkge1xuXHQvLyBUZXN0IGZvciBJRSA8PSA5IGFzIHByb3Bvc2VkIGJ5IEJyb3dzZXJoYWNrc1xuXHQvLyBAc2VlIGh0dHA6Ly9icm93c2VyaGFja3MuY29tLyNoYWNrLWU3MWQ4NjkyZjY1MzM0MTczZmVlNzE1YzIyMmNiODA1XG5cdC8vIFRlc3RzIGZvciBleGlzdGVuY2Ugb2Ygc3RhbmRhcmQgZ2xvYmFscyBpcyB0byBhbGxvdyBzdHlsZS1sb2FkZXJcblx0Ly8gdG8gb3BlcmF0ZSBjb3JyZWN0bHkgaW50byBub24tc3RhbmRhcmQgZW52aXJvbm1lbnRzXG5cdC8vIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3dlYnBhY2stY29udHJpYi9zdHlsZS1sb2FkZXIvaXNzdWVzLzE3N1xuXHRyZXR1cm4gd2luZG93ICYmIGRvY3VtZW50ICYmIGRvY3VtZW50LmFsbCAmJiAhd2luZG93LmF0b2I7XG59KTtcblxudmFyIGdldEVsZW1lbnQgPSAoZnVuY3Rpb24gKGZuKSB7XG5cdHZhciBtZW1vID0ge307XG5cblx0cmV0dXJuIGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG5cdFx0aWYgKHR5cGVvZiBtZW1vW3NlbGVjdG9yXSA9PT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdFx0dmFyIHN0eWxlVGFyZ2V0ID0gZm4uY2FsbCh0aGlzLCBzZWxlY3Rvcik7XG5cdFx0XHQvLyBTcGVjaWFsIGNhc2UgdG8gcmV0dXJuIGhlYWQgb2YgaWZyYW1lIGluc3RlYWQgb2YgaWZyYW1lIGl0c2VsZlxuXHRcdFx0aWYgKHN0eWxlVGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkhUTUxJRnJhbWVFbGVtZW50KSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Ly8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gaWZyYW1lIGlzIGJsb2NrZWRcblx0XHRcdFx0XHQvLyBkdWUgdG8gY3Jvc3Mtb3JpZ2luIHJlc3RyaWN0aW9uc1xuXHRcdFx0XHRcdHN0eWxlVGFyZ2V0ID0gc3R5bGVUYXJnZXQuY29udGVudERvY3VtZW50LmhlYWQ7XG5cdFx0XHRcdH0gY2F0Y2goZSkge1xuXHRcdFx0XHRcdHN0eWxlVGFyZ2V0ID0gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0bWVtb1tzZWxlY3Rvcl0gPSBzdHlsZVRhcmdldDtcblx0XHR9XG5cdFx0cmV0dXJuIG1lbW9bc2VsZWN0b3JdXG5cdH07XG59KShmdW5jdGlvbiAodGFyZ2V0KSB7XG5cdHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldClcbn0pO1xuXG52YXIgc2luZ2xldG9uID0gbnVsbDtcbnZhclx0c2luZ2xldG9uQ291bnRlciA9IDA7XG52YXJcdHN0eWxlc0luc2VydGVkQXRUb3AgPSBbXTtcblxudmFyXHRmaXhVcmxzID0gcmVxdWlyZShcIi4vdXJsc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihsaXN0LCBvcHRpb25zKSB7XG5cdGlmICh0eXBlb2YgREVCVUcgIT09IFwidW5kZWZpbmVkXCIgJiYgREVCVUcpIHtcblx0XHRpZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgc3R5bGUtbG9hZGVyIGNhbm5vdCBiZSB1c2VkIGluIGEgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRcIik7XG5cdH1cblxuXHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRvcHRpb25zLmF0dHJzID0gdHlwZW9mIG9wdGlvbnMuYXR0cnMgPT09IFwib2JqZWN0XCIgPyBvcHRpb25zLmF0dHJzIDoge307XG5cblx0Ly8gRm9yY2Ugc2luZ2xlLXRhZyBzb2x1dGlvbiBvbiBJRTYtOSwgd2hpY2ggaGFzIGEgaGFyZCBsaW1pdCBvbiB0aGUgIyBvZiA8c3R5bGU+XG5cdC8vIHRhZ3MgaXQgd2lsbCBhbGxvdyBvbiBhIHBhZ2Vcblx0aWYgKCFvcHRpb25zLnNpbmdsZXRvbikgb3B0aW9ucy5zaW5nbGV0b24gPSBpc09sZElFKCk7XG5cblx0Ly8gQnkgZGVmYXVsdCwgYWRkIDxzdHlsZT4gdGFncyB0byB0aGUgPGhlYWQ+IGVsZW1lbnRcblx0aWYgKCFvcHRpb25zLmluc2VydEludG8pIG9wdGlvbnMuaW5zZXJ0SW50byA9IFwiaGVhZFwiO1xuXG5cdC8vIEJ5IGRlZmF1bHQsIGFkZCA8c3R5bGU+IHRhZ3MgdG8gdGhlIGJvdHRvbSBvZiB0aGUgdGFyZ2V0XG5cdGlmICghb3B0aW9ucy5pbnNlcnRBdCkgb3B0aW9ucy5pbnNlcnRBdCA9IFwiYm90dG9tXCI7XG5cblx0dmFyIHN0eWxlcyA9IGxpc3RUb1N0eWxlcyhsaXN0LCBvcHRpb25zKTtcblxuXHRhZGRTdHlsZXNUb0RvbShzdHlsZXMsIG9wdGlvbnMpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUgKG5ld0xpc3QpIHtcblx0XHR2YXIgbWF5UmVtb3ZlID0gW107XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGl0ZW0gPSBzdHlsZXNbaV07XG5cdFx0XHR2YXIgZG9tU3R5bGUgPSBzdHlsZXNJbkRvbVtpdGVtLmlkXTtcblxuXHRcdFx0ZG9tU3R5bGUucmVmcy0tO1xuXHRcdFx0bWF5UmVtb3ZlLnB1c2goZG9tU3R5bGUpO1xuXHRcdH1cblxuXHRcdGlmKG5ld0xpc3QpIHtcblx0XHRcdHZhciBuZXdTdHlsZXMgPSBsaXN0VG9TdHlsZXMobmV3TGlzdCwgb3B0aW9ucyk7XG5cdFx0XHRhZGRTdHlsZXNUb0RvbShuZXdTdHlsZXMsIG9wdGlvbnMpO1xuXHRcdH1cblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbWF5UmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgZG9tU3R5bGUgPSBtYXlSZW1vdmVbaV07XG5cblx0XHRcdGlmKGRvbVN0eWxlLnJlZnMgPT09IDApIHtcblx0XHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBkb21TdHlsZS5wYXJ0cy5sZW5ndGg7IGorKykgZG9tU3R5bGUucGFydHNbal0oKTtcblxuXHRcdFx0XHRkZWxldGUgc3R5bGVzSW5Eb21bZG9tU3R5bGUuaWRdO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn07XG5cbmZ1bmN0aW9uIGFkZFN0eWxlc1RvRG9tIChzdHlsZXMsIG9wdGlvbnMpIHtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgaXRlbSA9IHN0eWxlc1tpXTtcblx0XHR2YXIgZG9tU3R5bGUgPSBzdHlsZXNJbkRvbVtpdGVtLmlkXTtcblxuXHRcdGlmKGRvbVN0eWxlKSB7XG5cdFx0XHRkb21TdHlsZS5yZWZzKys7XG5cblx0XHRcdGZvcih2YXIgaiA9IDA7IGogPCBkb21TdHlsZS5wYXJ0cy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRkb21TdHlsZS5wYXJ0c1tqXShpdGVtLnBhcnRzW2pdKTtcblx0XHRcdH1cblxuXHRcdFx0Zm9yKDsgaiA8IGl0ZW0ucGFydHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0ZG9tU3R5bGUucGFydHMucHVzaChhZGRTdHlsZShpdGVtLnBhcnRzW2pdLCBvcHRpb25zKSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciBwYXJ0cyA9IFtdO1xuXG5cdFx0XHRmb3IodmFyIGogPSAwOyBqIDwgaXRlbS5wYXJ0cy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRwYXJ0cy5wdXNoKGFkZFN0eWxlKGl0ZW0ucGFydHNbal0sIG9wdGlvbnMpKTtcblx0XHRcdH1cblxuXHRcdFx0c3R5bGVzSW5Eb21baXRlbS5pZF0gPSB7aWQ6IGl0ZW0uaWQsIHJlZnM6IDEsIHBhcnRzOiBwYXJ0c307XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGxpc3RUb1N0eWxlcyAobGlzdCwgb3B0aW9ucykge1xuXHR2YXIgc3R5bGVzID0gW107XG5cdHZhciBuZXdTdHlsZXMgPSB7fTtcblxuXHRmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgaXRlbSA9IGxpc3RbaV07XG5cdFx0dmFyIGlkID0gb3B0aW9ucy5iYXNlID8gaXRlbVswXSArIG9wdGlvbnMuYmFzZSA6IGl0ZW1bMF07XG5cdFx0dmFyIGNzcyA9IGl0ZW1bMV07XG5cdFx0dmFyIG1lZGlhID0gaXRlbVsyXTtcblx0XHR2YXIgc291cmNlTWFwID0gaXRlbVszXTtcblx0XHR2YXIgcGFydCA9IHtjc3M6IGNzcywgbWVkaWE6IG1lZGlhLCBzb3VyY2VNYXA6IHNvdXJjZU1hcH07XG5cblx0XHRpZighbmV3U3R5bGVzW2lkXSkgc3R5bGVzLnB1c2gobmV3U3R5bGVzW2lkXSA9IHtpZDogaWQsIHBhcnRzOiBbcGFydF19KTtcblx0XHRlbHNlIG5ld1N0eWxlc1tpZF0ucGFydHMucHVzaChwYXJ0KTtcblx0fVxuXG5cdHJldHVybiBzdHlsZXM7XG59XG5cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudCAob3B0aW9ucywgc3R5bGUpIHtcblx0dmFyIHRhcmdldCA9IGdldEVsZW1lbnQob3B0aW9ucy5pbnNlcnRJbnRvKVxuXG5cdGlmICghdGFyZ2V0KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnRJbnRvJyBwYXJhbWV0ZXIgaXMgaW52YWxpZC5cIik7XG5cdH1cblxuXHR2YXIgbGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3AgPSBzdHlsZXNJbnNlcnRlZEF0VG9wW3N0eWxlc0luc2VydGVkQXRUb3AubGVuZ3RoIC0gMV07XG5cblx0aWYgKG9wdGlvbnMuaW5zZXJ0QXQgPT09IFwidG9wXCIpIHtcblx0XHRpZiAoIWxhc3RTdHlsZUVsZW1lbnRJbnNlcnRlZEF0VG9wKSB7XG5cdFx0XHR0YXJnZXQuaW5zZXJ0QmVmb3JlKHN0eWxlLCB0YXJnZXQuZmlyc3RDaGlsZCk7XG5cdFx0fSBlbHNlIGlmIChsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcC5uZXh0U2libGluZykge1xuXHRcdFx0dGFyZ2V0Lmluc2VydEJlZm9yZShzdHlsZSwgbGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3AubmV4dFNpYmxpbmcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuXHRcdH1cblx0XHRzdHlsZXNJbnNlcnRlZEF0VG9wLnB1c2goc3R5bGUpO1xuXHR9IGVsc2UgaWYgKG9wdGlvbnMuaW5zZXJ0QXQgPT09IFwiYm90dG9tXCIpIHtcblx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zLmluc2VydEF0ID09PSBcIm9iamVjdFwiICYmIG9wdGlvbnMuaW5zZXJ0QXQuYmVmb3JlKSB7XG5cdFx0dmFyIG5leHRTaWJsaW5nID0gZ2V0RWxlbWVudChvcHRpb25zLmluc2VydEludG8gKyBcIiBcIiArIG9wdGlvbnMuaW5zZXJ0QXQuYmVmb3JlKTtcblx0XHR0YXJnZXQuaW5zZXJ0QmVmb3JlKHN0eWxlLCBuZXh0U2libGluZyk7XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiW1N0eWxlIExvYWRlcl1cXG5cXG4gSW52YWxpZCB2YWx1ZSBmb3IgcGFyYW1ldGVyICdpbnNlcnRBdCcgKCdvcHRpb25zLmluc2VydEF0JykgZm91bmQuXFxuIE11c3QgYmUgJ3RvcCcsICdib3R0b20nLCBvciBPYmplY3QuXFxuIChodHRwczovL2dpdGh1Yi5jb20vd2VicGFjay1jb250cmliL3N0eWxlLWxvYWRlciNpbnNlcnRhdClcXG5cIik7XG5cdH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50IChzdHlsZSkge1xuXHRpZiAoc3R5bGUucGFyZW50Tm9kZSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXHRzdHlsZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlKTtcblxuXHR2YXIgaWR4ID0gc3R5bGVzSW5zZXJ0ZWRBdFRvcC5pbmRleE9mKHN0eWxlKTtcblx0aWYoaWR4ID49IDApIHtcblx0XHRzdHlsZXNJbnNlcnRlZEF0VG9wLnNwbGljZShpZHgsIDEpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0eWxlRWxlbWVudCAob3B0aW9ucykge1xuXHR2YXIgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG5cblx0b3B0aW9ucy5hdHRycy50eXBlID0gXCJ0ZXh0L2Nzc1wiO1xuXG5cdGFkZEF0dHJzKHN0eWxlLCBvcHRpb25zLmF0dHJzKTtcblx0aW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMsIHN0eWxlKTtcblxuXHRyZXR1cm4gc3R5bGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxpbmtFbGVtZW50IChvcHRpb25zKSB7XG5cdHZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XG5cblx0b3B0aW9ucy5hdHRycy50eXBlID0gXCJ0ZXh0L2Nzc1wiO1xuXHRvcHRpb25zLmF0dHJzLnJlbCA9IFwic3R5bGVzaGVldFwiO1xuXG5cdGFkZEF0dHJzKGxpbmssIG9wdGlvbnMuYXR0cnMpO1xuXHRpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucywgbGluayk7XG5cblx0cmV0dXJuIGxpbms7XG59XG5cbmZ1bmN0aW9uIGFkZEF0dHJzIChlbCwgYXR0cnMpIHtcblx0T2JqZWN0LmtleXMoYXR0cnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuXHRcdGVsLnNldEF0dHJpYnV0ZShrZXksIGF0dHJzW2tleV0pO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gYWRkU3R5bGUgKG9iaiwgb3B0aW9ucykge1xuXHR2YXIgc3R5bGUsIHVwZGF0ZSwgcmVtb3ZlLCByZXN1bHQ7XG5cblx0Ly8gSWYgYSB0cmFuc2Zvcm0gZnVuY3Rpb24gd2FzIGRlZmluZWQsIHJ1biBpdCBvbiB0aGUgY3NzXG5cdGlmIChvcHRpb25zLnRyYW5zZm9ybSAmJiBvYmouY3NzKSB7XG5cdCAgICByZXN1bHQgPSBvcHRpb25zLnRyYW5zZm9ybShvYmouY3NzKTtcblxuXHQgICAgaWYgKHJlc3VsdCkge1xuXHQgICAgXHQvLyBJZiB0cmFuc2Zvcm0gcmV0dXJucyBhIHZhbHVlLCB1c2UgdGhhdCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCBjc3MuXG5cdCAgICBcdC8vIFRoaXMgYWxsb3dzIHJ1bm5pbmcgcnVudGltZSB0cmFuc2Zvcm1hdGlvbnMgb24gdGhlIGNzcy5cblx0ICAgIFx0b2JqLmNzcyA9IHJlc3VsdDtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICBcdC8vIElmIHRoZSB0cmFuc2Zvcm0gZnVuY3Rpb24gcmV0dXJucyBhIGZhbHN5IHZhbHVlLCBkb24ndCBhZGQgdGhpcyBjc3MuXG5cdCAgICBcdC8vIFRoaXMgYWxsb3dzIGNvbmRpdGlvbmFsIGxvYWRpbmcgb2YgY3NzXG5cdCAgICBcdHJldHVybiBmdW5jdGlvbigpIHtcblx0ICAgIFx0XHQvLyBub29wXG5cdCAgICBcdH07XG5cdCAgICB9XG5cdH1cblxuXHRpZiAob3B0aW9ucy5zaW5nbGV0b24pIHtcblx0XHR2YXIgc3R5bGVJbmRleCA9IHNpbmdsZXRvbkNvdW50ZXIrKztcblxuXHRcdHN0eWxlID0gc2luZ2xldG9uIHx8IChzaW5nbGV0b24gPSBjcmVhdGVTdHlsZUVsZW1lbnQob3B0aW9ucykpO1xuXG5cdFx0dXBkYXRlID0gYXBwbHlUb1NpbmdsZXRvblRhZy5iaW5kKG51bGwsIHN0eWxlLCBzdHlsZUluZGV4LCBmYWxzZSk7XG5cdFx0cmVtb3ZlID0gYXBwbHlUb1NpbmdsZXRvblRhZy5iaW5kKG51bGwsIHN0eWxlLCBzdHlsZUluZGV4LCB0cnVlKTtcblxuXHR9IGVsc2UgaWYgKFxuXHRcdG9iai5zb3VyY2VNYXAgJiZcblx0XHR0eXBlb2YgVVJMID09PSBcImZ1bmN0aW9uXCIgJiZcblx0XHR0eXBlb2YgVVJMLmNyZWF0ZU9iamVjdFVSTCA9PT0gXCJmdW5jdGlvblwiICYmXG5cdFx0dHlwZW9mIFVSTC5yZXZva2VPYmplY3RVUkwgPT09IFwiZnVuY3Rpb25cIiAmJlxuXHRcdHR5cGVvZiBCbG9iID09PSBcImZ1bmN0aW9uXCIgJiZcblx0XHR0eXBlb2YgYnRvYSA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRcdHN0eWxlID0gY3JlYXRlTGlua0VsZW1lbnQob3B0aW9ucyk7XG5cdFx0dXBkYXRlID0gdXBkYXRlTGluay5iaW5kKG51bGwsIHN0eWxlLCBvcHRpb25zKTtcblx0XHRyZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGUpO1xuXG5cdFx0XHRpZihzdHlsZS5ocmVmKSBVUkwucmV2b2tlT2JqZWN0VVJMKHN0eWxlLmhyZWYpO1xuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0c3R5bGUgPSBjcmVhdGVTdHlsZUVsZW1lbnQob3B0aW9ucyk7XG5cdFx0dXBkYXRlID0gYXBwbHlUb1RhZy5iaW5kKG51bGwsIHN0eWxlKTtcblx0XHRyZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGUpO1xuXHRcdH07XG5cdH1cblxuXHR1cGRhdGUob2JqKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlU3R5bGUgKG5ld09iaikge1xuXHRcdGlmIChuZXdPYmopIHtcblx0XHRcdGlmIChcblx0XHRcdFx0bmV3T2JqLmNzcyA9PT0gb2JqLmNzcyAmJlxuXHRcdFx0XHRuZXdPYmoubWVkaWEgPT09IG9iai5tZWRpYSAmJlxuXHRcdFx0XHRuZXdPYmouc291cmNlTWFwID09PSBvYmouc291cmNlTWFwXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR1cGRhdGUob2JqID0gbmV3T2JqKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVtb3ZlKCk7XG5cdFx0fVxuXHR9O1xufVxuXG52YXIgcmVwbGFjZVRleHQgPSAoZnVuY3Rpb24gKCkge1xuXHR2YXIgdGV4dFN0b3JlID0gW107XG5cblx0cmV0dXJuIGZ1bmN0aW9uIChpbmRleCwgcmVwbGFjZW1lbnQpIHtcblx0XHR0ZXh0U3RvcmVbaW5kZXhdID0gcmVwbGFjZW1lbnQ7XG5cblx0XHRyZXR1cm4gdGV4dFN0b3JlLmZpbHRlcihCb29sZWFuKS5qb2luKCdcXG4nKTtcblx0fTtcbn0pKCk7XG5cbmZ1bmN0aW9uIGFwcGx5VG9TaW5nbGV0b25UYWcgKHN0eWxlLCBpbmRleCwgcmVtb3ZlLCBvYmopIHtcblx0dmFyIGNzcyA9IHJlbW92ZSA/IFwiXCIgOiBvYmouY3NzO1xuXG5cdGlmIChzdHlsZS5zdHlsZVNoZWV0KSB7XG5cdFx0c3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gcmVwbGFjZVRleHQoaW5kZXgsIGNzcyk7XG5cdH0gZWxzZSB7XG5cdFx0dmFyIGNzc05vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpO1xuXHRcdHZhciBjaGlsZE5vZGVzID0gc3R5bGUuY2hpbGROb2RlcztcblxuXHRcdGlmIChjaGlsZE5vZGVzW2luZGV4XSkgc3R5bGUucmVtb3ZlQ2hpbGQoY2hpbGROb2Rlc1tpbmRleF0pO1xuXG5cdFx0aWYgKGNoaWxkTm9kZXMubGVuZ3RoKSB7XG5cdFx0XHRzdHlsZS5pbnNlcnRCZWZvcmUoY3NzTm9kZSwgY2hpbGROb2Rlc1tpbmRleF0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzdHlsZS5hcHBlbmRDaGlsZChjc3NOb2RlKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gYXBwbHlUb1RhZyAoc3R5bGUsIG9iaikge1xuXHR2YXIgY3NzID0gb2JqLmNzcztcblx0dmFyIG1lZGlhID0gb2JqLm1lZGlhO1xuXG5cdGlmKG1lZGlhKSB7XG5cdFx0c3R5bGUuc2V0QXR0cmlidXRlKFwibWVkaWFcIiwgbWVkaWEpXG5cdH1cblxuXHRpZihzdHlsZS5zdHlsZVNoZWV0KSB7XG5cdFx0c3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuXHR9IGVsc2Uge1xuXHRcdHdoaWxlKHN0eWxlLmZpcnN0Q2hpbGQpIHtcblx0XHRcdHN0eWxlLnJlbW92ZUNoaWxkKHN0eWxlLmZpcnN0Q2hpbGQpO1xuXHRcdH1cblxuXHRcdHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUxpbmsgKGxpbmssIG9wdGlvbnMsIG9iaikge1xuXHR2YXIgY3NzID0gb2JqLmNzcztcblx0dmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG5cblx0Lypcblx0XHRJZiBjb252ZXJ0VG9BYnNvbHV0ZVVybHMgaXNuJ3QgZGVmaW5lZCwgYnV0IHNvdXJjZW1hcHMgYXJlIGVuYWJsZWRcblx0XHRhbmQgdGhlcmUgaXMgbm8gcHVibGljUGF0aCBkZWZpbmVkIHRoZW4gbGV0cyB0dXJuIGNvbnZlcnRUb0Fic29sdXRlVXJsc1xuXHRcdG9uIGJ5IGRlZmF1bHQuICBPdGhlcndpc2UgZGVmYXVsdCB0byB0aGUgY29udmVydFRvQWJzb2x1dGVVcmxzIG9wdGlvblxuXHRcdGRpcmVjdGx5XG5cdCovXG5cdHZhciBhdXRvRml4VXJscyA9IG9wdGlvbnMuY29udmVydFRvQWJzb2x1dGVVcmxzID09PSB1bmRlZmluZWQgJiYgc291cmNlTWFwO1xuXG5cdGlmIChvcHRpb25zLmNvbnZlcnRUb0Fic29sdXRlVXJscyB8fCBhdXRvRml4VXJscykge1xuXHRcdGNzcyA9IGZpeFVybHMoY3NzKTtcblx0fVxuXG5cdGlmIChzb3VyY2VNYXApIHtcblx0XHQvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yNjYwMzg3NVxuXHRcdGNzcyArPSBcIlxcbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsXCIgKyBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpICsgXCIgKi9cIjtcblx0fVxuXG5cdHZhciBibG9iID0gbmV3IEJsb2IoW2Nzc10sIHsgdHlwZTogXCJ0ZXh0L2Nzc1wiIH0pO1xuXG5cdHZhciBvbGRTcmMgPSBsaW5rLmhyZWY7XG5cblx0bGluay5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcblxuXHRpZihvbGRTcmMpIFVSTC5yZXZva2VPYmplY3RVUkwob2xkU3JjKTtcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvbGliL2FkZFN0eWxlcy5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcbi8qKlxuICogV2hlbiBzb3VyY2UgbWFwcyBhcmUgZW5hYmxlZCwgYHN0eWxlLWxvYWRlcmAgdXNlcyBhIGxpbmsgZWxlbWVudCB3aXRoIGEgZGF0YS11cmkgdG9cbiAqIGVtYmVkIHRoZSBjc3Mgb24gdGhlIHBhZ2UuIFRoaXMgYnJlYWtzIGFsbCByZWxhdGl2ZSB1cmxzIGJlY2F1c2Ugbm93IHRoZXkgYXJlIHJlbGF0aXZlIHRvIGFcbiAqIGJ1bmRsZSBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHBhZ2UuXG4gKlxuICogT25lIHNvbHV0aW9uIGlzIHRvIG9ubHkgdXNlIGZ1bGwgdXJscywgYnV0IHRoYXQgbWF5IGJlIGltcG9zc2libGUuXG4gKlxuICogSW5zdGVhZCwgdGhpcyBmdW5jdGlvbiBcImZpeGVzXCIgdGhlIHJlbGF0aXZlIHVybHMgdG8gYmUgYWJzb2x1dGUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHBhZ2UgbG9jYXRpb24uXG4gKlxuICogQSBydWRpbWVudGFyeSB0ZXN0IHN1aXRlIGlzIGxvY2F0ZWQgYXQgYHRlc3QvZml4VXJscy5qc2AgYW5kIGNhbiBiZSBydW4gdmlhIHRoZSBgbnBtIHRlc3RgIGNvbW1hbmQuXG4gKlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNzcykge1xuICAvLyBnZXQgY3VycmVudCBsb2NhdGlvblxuICB2YXIgbG9jYXRpb24gPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5sb2NhdGlvbjtcblxuICBpZiAoIWxvY2F0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiZml4VXJscyByZXF1aXJlcyB3aW5kb3cubG9jYXRpb25cIik7XG4gIH1cblxuXHQvLyBibGFuayBvciBudWxsP1xuXHRpZiAoIWNzcyB8fCB0eXBlb2YgY3NzICE9PSBcInN0cmluZ1wiKSB7XG5cdCAgcmV0dXJuIGNzcztcbiAgfVxuXG4gIHZhciBiYXNlVXJsID0gbG9jYXRpb24ucHJvdG9jb2wgKyBcIi8vXCIgKyBsb2NhdGlvbi5ob3N0O1xuICB2YXIgY3VycmVudERpciA9IGJhc2VVcmwgKyBsb2NhdGlvbi5wYXRobmFtZS5yZXBsYWNlKC9cXC9bXlxcL10qJC8sIFwiL1wiKTtcblxuXHQvLyBjb252ZXJ0IGVhY2ggdXJsKC4uLilcblx0Lypcblx0VGhpcyByZWd1bGFyIGV4cHJlc3Npb24gaXMganVzdCBhIHdheSB0byByZWN1cnNpdmVseSBtYXRjaCBicmFja2V0cyB3aXRoaW5cblx0YSBzdHJpbmcuXG5cblx0IC91cmxcXHMqXFwoICA9IE1hdGNoIG9uIHRoZSB3b3JkIFwidXJsXCIgd2l0aCBhbnkgd2hpdGVzcGFjZSBhZnRlciBpdCBhbmQgdGhlbiBhIHBhcmVuc1xuXHQgICAoICA9IFN0YXJ0IGEgY2FwdHVyaW5nIGdyb3VwXG5cdCAgICAgKD86ICA9IFN0YXJ0IGEgbm9uLWNhcHR1cmluZyBncm91cFxuXHQgICAgICAgICBbXikoXSAgPSBNYXRjaCBhbnl0aGluZyB0aGF0IGlzbid0IGEgcGFyZW50aGVzZXNcblx0ICAgICAgICAgfCAgPSBPUlxuXHQgICAgICAgICBcXCggID0gTWF0Y2ggYSBzdGFydCBwYXJlbnRoZXNlc1xuXHQgICAgICAgICAgICAgKD86ICA9IFN0YXJ0IGFub3RoZXIgbm9uLWNhcHR1cmluZyBncm91cHNcblx0ICAgICAgICAgICAgICAgICBbXikoXSsgID0gTWF0Y2ggYW55dGhpbmcgdGhhdCBpc24ndCBhIHBhcmVudGhlc2VzXG5cdCAgICAgICAgICAgICAgICAgfCAgPSBPUlxuXHQgICAgICAgICAgICAgICAgIFxcKCAgPSBNYXRjaCBhIHN0YXJ0IHBhcmVudGhlc2VzXG5cdCAgICAgICAgICAgICAgICAgICAgIFteKShdKiAgPSBNYXRjaCBhbnl0aGluZyB0aGF0IGlzbid0IGEgcGFyZW50aGVzZXNcblx0ICAgICAgICAgICAgICAgICBcXCkgID0gTWF0Y2ggYSBlbmQgcGFyZW50aGVzZXNcblx0ICAgICAgICAgICAgICkgID0gRW5kIEdyb3VwXG4gICAgICAgICAgICAgICpcXCkgPSBNYXRjaCBhbnl0aGluZyBhbmQgdGhlbiBhIGNsb3NlIHBhcmVuc1xuICAgICAgICAgICkgID0gQ2xvc2Ugbm9uLWNhcHR1cmluZyBncm91cFxuICAgICAgICAgICogID0gTWF0Y2ggYW55dGhpbmdcbiAgICAgICApICA9IENsb3NlIGNhcHR1cmluZyBncm91cFxuXHQgXFwpICA9IE1hdGNoIGEgY2xvc2UgcGFyZW5zXG5cblx0IC9naSAgPSBHZXQgYWxsIG1hdGNoZXMsIG5vdCB0aGUgZmlyc3QuICBCZSBjYXNlIGluc2Vuc2l0aXZlLlxuXHQgKi9cblx0dmFyIGZpeGVkQ3NzID0gY3NzLnJlcGxhY2UoL3VybFxccypcXCgoKD86W14pKF18XFwoKD86W14pKF0rfFxcKFteKShdKlxcKSkqXFwpKSopXFwpL2dpLCBmdW5jdGlvbihmdWxsTWF0Y2gsIG9yaWdVcmwpIHtcblx0XHQvLyBzdHJpcCBxdW90ZXMgKGlmIHRoZXkgZXhpc3QpXG5cdFx0dmFyIHVucXVvdGVkT3JpZ1VybCA9IG9yaWdVcmxcblx0XHRcdC50cmltKClcblx0XHRcdC5yZXBsYWNlKC9eXCIoLiopXCIkLywgZnVuY3Rpb24obywgJDEpeyByZXR1cm4gJDE7IH0pXG5cdFx0XHQucmVwbGFjZSgvXicoLiopJyQvLCBmdW5jdGlvbihvLCAkMSl7IHJldHVybiAkMTsgfSk7XG5cblx0XHQvLyBhbHJlYWR5IGEgZnVsbCB1cmw/IG5vIGNoYW5nZVxuXHRcdGlmICgvXigjfGRhdGE6fGh0dHA6XFwvXFwvfGh0dHBzOlxcL1xcL3xmaWxlOlxcL1xcL1xcLykvaS50ZXN0KHVucXVvdGVkT3JpZ1VybCkpIHtcblx0XHQgIHJldHVybiBmdWxsTWF0Y2g7XG5cdFx0fVxuXG5cdFx0Ly8gY29udmVydCB0aGUgdXJsIHRvIGEgZnVsbCB1cmxcblx0XHR2YXIgbmV3VXJsO1xuXG5cdFx0aWYgKHVucXVvdGVkT3JpZ1VybC5pbmRleE9mKFwiLy9cIikgPT09IDApIHtcblx0XHQgIFx0Ly9UT0RPOiBzaG91bGQgd2UgYWRkIHByb3RvY29sP1xuXHRcdFx0bmV3VXJsID0gdW5xdW90ZWRPcmlnVXJsO1xuXHRcdH0gZWxzZSBpZiAodW5xdW90ZWRPcmlnVXJsLmluZGV4T2YoXCIvXCIpID09PSAwKSB7XG5cdFx0XHQvLyBwYXRoIHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgYmFzZSB1cmxcblx0XHRcdG5ld1VybCA9IGJhc2VVcmwgKyB1bnF1b3RlZE9yaWdVcmw7IC8vIGFscmVhZHkgc3RhcnRzIHdpdGggJy8nXG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHBhdGggc2hvdWxkIGJlIHJlbGF0aXZlIHRvIGN1cnJlbnQgZGlyZWN0b3J5XG5cdFx0XHRuZXdVcmwgPSBjdXJyZW50RGlyICsgdW5xdW90ZWRPcmlnVXJsLnJlcGxhY2UoL15cXC5cXC8vLCBcIlwiKTsgLy8gU3RyaXAgbGVhZGluZyAnLi8nXG5cdFx0fVxuXG5cdFx0Ly8gc2VuZCBiYWNrIHRoZSBmaXhlZCB1cmwoLi4uKVxuXHRcdHJldHVybiBcInVybChcIiArIEpTT04uc3RyaW5naWZ5KG5ld1VybCkgKyBcIilcIjtcblx0fSk7XG5cblx0Ly8gc2VuZCBiYWNrIHRoZSBmaXhlZCBjc3Ncblx0cmV0dXJuIGZpeGVkQ3NzO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9saWIvdXJscy5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2xpYi91cmxzLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsInZhciBzY29wZSA9ICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbCkgfHxcbiAgICAgICAgICAgICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmKSB8fFxuICAgICAgICAgICAgd2luZG93O1xudmFyIGFwcGx5ID0gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5O1xuXG4vLyBET00gQVBJcywgZm9yIGNvbXBsZXRlbmVzc1xuXG5leHBvcnRzLnNldFRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0VGltZW91dCwgc2NvcGUsIGFyZ3VtZW50cyksIGNsZWFyVGltZW91dCk7XG59O1xuZXhwb3J0cy5zZXRJbnRlcnZhbCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRJbnRlcnZhbCwgc2NvcGUsIGFyZ3VtZW50cyksIGNsZWFySW50ZXJ2YWwpO1xufTtcbmV4cG9ydHMuY2xlYXJUaW1lb3V0ID1cbmV4cG9ydHMuY2xlYXJJbnRlcnZhbCA9IGZ1bmN0aW9uKHRpbWVvdXQpIHtcbiAgaWYgKHRpbWVvdXQpIHtcbiAgICB0aW1lb3V0LmNsb3NlKCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIFRpbWVvdXQoaWQsIGNsZWFyRm4pIHtcbiAgdGhpcy5faWQgPSBpZDtcbiAgdGhpcy5fY2xlYXJGbiA9IGNsZWFyRm47XG59XG5UaW1lb3V0LnByb3RvdHlwZS51bnJlZiA9IFRpbWVvdXQucHJvdG90eXBlLnJlZiA9IGZ1bmN0aW9uKCkge307XG5UaW1lb3V0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9jbGVhckZuLmNhbGwoc2NvcGUsIHRoaXMuX2lkKTtcbn07XG5cbi8vIERvZXMgbm90IHN0YXJ0IHRoZSB0aW1lLCBqdXN0IHNldHMgdXAgdGhlIG1lbWJlcnMgbmVlZGVkLlxuZXhwb3J0cy5lbnJvbGwgPSBmdW5jdGlvbihpdGVtLCBtc2Vjcykge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG4gIGl0ZW0uX2lkbGVUaW1lb3V0ID0gbXNlY3M7XG59O1xuXG5leHBvcnRzLnVuZW5yb2xsID0gZnVuY3Rpb24oaXRlbSkge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG4gIGl0ZW0uX2lkbGVUaW1lb3V0ID0gLTE7XG59O1xuXG5leHBvcnRzLl91bnJlZkFjdGl2ZSA9IGV4cG9ydHMuYWN0aXZlID0gZnVuY3Rpb24oaXRlbSkge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG5cbiAgdmFyIG1zZWNzID0gaXRlbS5faWRsZVRpbWVvdXQ7XG4gIGlmIChtc2VjcyA+PSAwKSB7XG4gICAgaXRlbS5faWRsZVRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gb25UaW1lb3V0KCkge1xuICAgICAgaWYgKGl0ZW0uX29uVGltZW91dClcbiAgICAgICAgaXRlbS5fb25UaW1lb3V0KCk7XG4gICAgfSwgbXNlY3MpO1xuICB9XG59O1xuXG4vLyBzZXRpbW1lZGlhdGUgYXR0YWNoZXMgaXRzZWxmIHRvIHRoZSBnbG9iYWwgb2JqZWN0XG5yZXF1aXJlKFwic2V0aW1tZWRpYXRlXCIpO1xuLy8gT24gc29tZSBleG90aWMgZW52aXJvbm1lbnRzLCBpdCdzIG5vdCBjbGVhciB3aGljaCBvYmplY3QgYHNldGltbWVkaWF0ZWAgd2FzXG4vLyBhYmxlIHRvIGluc3RhbGwgb250by4gIFNlYXJjaCBlYWNoIHBvc3NpYmlsaXR5IGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZVxuLy8gYHNldGltbWVkaWF0ZWAgbGlicmFyeS5cbmV4cG9ydHMuc2V0SW1tZWRpYXRlID0gKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGYuc2V0SW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwuc2V0SW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAodGhpcyAmJiB0aGlzLnNldEltbWVkaWF0ZSk7XG5leHBvcnRzLmNsZWFySW1tZWRpYXRlID0gKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGYuY2xlYXJJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsLmNsZWFySW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzICYmIHRoaXMuY2xlYXJJbW1lZGlhdGUpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvdGltZXJzLWJyb3dzZXJpZnkvbWFpbi5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvdGltZXJzLWJyb3dzZXJpZnkvbWFpbi5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCIvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxyXG50aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZVxyXG5MaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG5cclxuVEhJUyBDT0RFIElTIFBST1ZJREVEIE9OIEFOICpBUyBJUyogQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxyXG5LSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVEXHJcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXHJcbk1FUkNIQU5UQUJMSVRZIE9SIE5PTi1JTkZSSU5HRU1FTlQuXHJcblxyXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcclxuYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMClcclxuICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZShyZXN1bHQudmFsdWUpOyB9KS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IHlbb3BbMF0gJiAyID8gXCJyZXR1cm5cIiA6IG9wWzBdID8gXCJ0aHJvd1wiIDogXCJuZXh0XCJdKSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFswLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgZXhwb3J0cykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAoIWV4cG9ydHMuaGFzT3duUHJvcGVydHkocCkpIGV4cG9ydHNbcF0gPSBtW3BdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyAgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaWYgKG9bbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSBcInJldHVyblwiIH0gOiBmID8gZih2KSA6IHY7IH07IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl07XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCkgfHwgKDEsZXZhbCkoXCJ0aGlzXCIpO1xufSBjYXRjaChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpXG5cdFx0ZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy93ZWJwYWNrL2J1aWxkaW4vZ2xvYmFsLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIm51bGxcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbWVudS1pdGVtL01lbnVJdGVtLnRzIiwiLy8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblxuLy8gbG9hZCB0aGUgc3R5bGVzXG52YXIgY29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kZWNvcmF0b3ItbG9hZGVyL2luZGV4LmpzIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTEwLTMhLi4vLi4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL2xpYi9pbmRleC5qcz8/cG9zdGNzcyEuLi8uLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZHRzLWxvYWRlci9pbmRleC5qcz90eXBlPWNzcyEuL21lbnVJdGVtLm0uY3NzXCIpO1xuaWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG4vLyBQcmVwYXJlIGNzc1RyYW5zZm9ybWF0aW9uXG52YXIgdHJhbnNmb3JtO1xuXG52YXIgb3B0aW9ucyA9IHtcImhtclwiOnRydWV9XG5vcHRpb25zLnRyYW5zZm9ybSA9IHRyYW5zZm9ybVxuLy8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxudmFyIHVwZGF0ZSA9IHJlcXVpcmUoXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzLmpzXCIpKGNvbnRlbnQsIG9wdGlvbnMpO1xuaWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG4vLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5pZihtb2R1bGUuaG90KSB7XG5cdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLi8uLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZGVjb3JhdG9yLWxvYWRlci9pbmRleC5qcyEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS0xMC0zIS4uLy4uL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9saWIvaW5kZXguanM/P3Bvc3Rjc3MhLi4vLi4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWR0cy1sb2FkZXIvaW5kZXguanM/dHlwZT1jc3MhLi9tZW51SXRlbS5tLmNzc1wiLCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWRlY29yYXRvci1sb2FkZXIvaW5kZXguanMhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tMTAtMyEuLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvbGliL2luZGV4LmpzPz9wb3N0Y3NzIS4uLy4uL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kdHMtbG9hZGVyL2luZGV4LmpzP3R5cGU9Y3NzIS4vbWVudUl0ZW0ubS5jc3NcIik7XG5cdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHR9KTtcblx0fVxuXHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xufVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL21lbnUtaXRlbS9tZW51SXRlbS5tLmNzc1xuLy8gbW9kdWxlIGlkID0gLi9zcmMvbWVudS1pdGVtL21lbnVJdGVtLm0uY3NzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIm51bGxcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbWVudS9NZW51LnRzIiwiLy8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblxuLy8gbG9hZCB0aGUgc3R5bGVzXG52YXIgY29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kZWNvcmF0b3ItbG9hZGVyL2luZGV4LmpzIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTEwLTMhLi4vLi4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL2xpYi9pbmRleC5qcz8/cG9zdGNzcyEuLi8uLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZHRzLWxvYWRlci9pbmRleC5qcz90eXBlPWNzcyEuL21lbnUubS5jc3NcIik7XG5pZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcbi8vIFByZXBhcmUgY3NzVHJhbnNmb3JtYXRpb25cbnZhciB0cmFuc2Zvcm07XG5cbnZhciBvcHRpb25zID0ge1wiaG1yXCI6dHJ1ZX1cbm9wdGlvbnMudHJhbnNmb3JtID0gdHJhbnNmb3JtXG4vLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG52YXIgdXBkYXRlID0gcmVxdWlyZShcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2xpYi9hZGRTdHlsZXMuanNcIikoY29udGVudCwgb3B0aW9ucyk7XG5pZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcbi8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcbmlmKG1vZHVsZS5ob3QpIHtcblx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kZWNvcmF0b3ItbG9hZGVyL2luZGV4LmpzIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTEwLTMhLi4vLi4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL2xpYi9pbmRleC5qcz8/cG9zdGNzcyEuLi8uLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZHRzLWxvYWRlci9pbmRleC5qcz90eXBlPWNzcyEuL21lbnUubS5jc3NcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kZWNvcmF0b3ItbG9hZGVyL2luZGV4LmpzIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTEwLTMhLi4vLi4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL2xpYi9pbmRleC5qcz8/cG9zdGNzcyEuLi8uLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZHRzLWxvYWRlci9pbmRleC5qcz90eXBlPWNzcyEuL21lbnUubS5jc3NcIik7XG5cdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHR9KTtcblx0fVxuXHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xufVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL21lbnUvbWVudS5tLmNzc1xuLy8gbW9kdWxlIGlkID0gLi9zcmMvbWVudS9tZW51Lm0uY3NzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsImltcG9ydCAnLi9tZW51LWl0ZW0vTWVudUl0ZW0nO1xuaW1wb3J0ICcuL21lbnUvTWVudSc7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZHRzLWxvYWRlcj90eXBlPXRzJmluc3RhbmNlTmFtZT0wX2N1c3RvbS1lbGVtZW50cyEuL3Rlc3RzL3VuaXQvYWxsLnRzIiwiY29uc3QgeyBkZXNjcmliZSwgaXQgfSA9IGludGVybi5nZXRJbnRlcmZhY2UoJ2JkZCcpO1xuaW1wb3J0IGhhcm5lc3MgZnJvbSAnQGRvam8vdGVzdC1leHRyYXMvaGFybmVzcyc7XG5cbmltcG9ydCB7IHYgfSBmcm9tICdAZG9qby93aWRnZXQtY29yZS9kJztcblxuaW1wb3J0IHsgTWVudUl0ZW0gfSBmcm9tICcuLi8uLi8uLi9zcmMvbWVudS1pdGVtL01lbnVJdGVtJztcbmltcG9ydCAqIGFzIGNzcyBmcm9tICcuLi8uLi8uLi9zcmMvbWVudS1pdGVtL21lbnVJdGVtLm0uY3NzJztcblxuZGVzY3JpYmUoJ01lbnVJdGVtJywgKCkgPT4ge1xuXHRpdCgnc2hvdWxkIHJlbmRlciB3aWRnZXQnLCAoKSA9PiB7XG5cdFx0Y29uc3QgdGVzdE1lbnVJdGVtID0gaGFybmVzcyhNZW51SXRlbSk7XG5cdFx0Y29uc3Qgc2VsZWN0ZWQgPSB0cnVlO1xuXHRcdGNvbnN0IHRpdGxlID0gJ01lbnUgSXRlbSc7XG5cdFx0dGVzdE1lbnVJdGVtLnNldFByb3BlcnRpZXMoeyBzZWxlY3RlZCwgdGl0bGUgfSk7XG5cdFx0dGVzdE1lbnVJdGVtLmV4cGVjdFJlbmRlcihcblx0XHRcdHYoJ2xpJywgeyBjbGFzc2VzOiBjc3Mucm9vdCB9LCBbXG5cdFx0XHRcdHYoXG5cdFx0XHRcdFx0J3NwYW4nLFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNsYXNzZXM6IFtjc3MuaXRlbSwgY3NzLnNlbGVjdGVkXSxcblx0XHRcdFx0XHRcdG9uY2xpY2s6IHRlc3RNZW51SXRlbS5saXN0ZW5lclxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0W3RpdGxlXVxuXHRcdFx0XHQpXG5cdFx0XHRdKVxuXHRcdCk7XG5cdH0pO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZHRzLWxvYWRlcj90eXBlPXRzJmluc3RhbmNlTmFtZT0wX2N1c3RvbS1lbGVtZW50cyEuL3Rlc3RzL3VuaXQvbWVudS1pdGVtL01lbnVJdGVtLnRzIiwiY29uc3QgeyBkZXNjcmliZSwgaXQgfSA9IGludGVybi5nZXRJbnRlcmZhY2UoJ2JkZCcpO1xuaW1wb3J0IGhhcm5lc3MgZnJvbSAnQGRvam8vdGVzdC1leHRyYXMvaGFybmVzcyc7XG5cbmltcG9ydCB7IHYgfSBmcm9tICdAZG9qby93aWRnZXQtY29yZS9kJztcblxuaW1wb3J0IHsgTWVudSB9IGZyb20gJy4uLy4uLy4uL3NyYy9tZW51L01lbnUnO1xuaW1wb3J0ICogYXMgY3NzIGZyb20gJy4uLy4uLy4uL3NyYy9tZW51L21lbnUubS5jc3MnO1xuXG5kZXNjcmliZSgnTWVudScsICgpID0+IHtcblx0aXQoJ3Nob3VsZCByZW5kZXIgd2lkZ2V0JywgKCkgPT4ge1xuXHRcdGNvbnN0IHRlc3RNZW51ID0gaGFybmVzcyhNZW51KTtcblx0XHR0ZXN0TWVudS5leHBlY3RSZW5kZXIodignbmF2JywgeyBjbGFzc2VzOiBjc3Mucm9vdCB9LCBbdignb2wnLCB7IGNsYXNzZXM6IGNzcy5tZW51Q29udGFpbmVyIH0pXSkpO1xuXHR9KTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWR0cy1sb2FkZXI/dHlwZT10cyZpbnN0YW5jZU5hbWU9MF9jdXN0b20tZWxlbWVudHMhLi90ZXN0cy91bml0L21lbnUvTWVudS50cyJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgZWYzNTAzNjRjNjU4OTg4ZTRiMzMiLCJ3ZWJwYWNrOi8vL0Rlc3Ryb3lhYmxlLnRzIiwid2VicGFjazovLy9FdmVudGVkLnRzIiwid2VicGFjazovLy9sYW5nLnRzIiwid2VicGFjazovLy9oYXMudHMiLCJ3ZWJwYWNrOi8vL01hcC50cyIsIndlYnBhY2s6Ly8vUHJvbWlzZS50cyIsIndlYnBhY2s6Ly8vU2V0LnRzIiwid2VicGFjazovLy9TeW1ib2wudHMiLCJ3ZWJwYWNrOi8vL1dlYWtNYXAudHMiLCJ3ZWJwYWNrOi8vL2FycmF5LnRzIiwid2VicGFjazovLy9nbG9iYWwudHMiLCJ3ZWJwYWNrOi8vL2l0ZXJhdG9yLnRzIiwid2VicGFjazovLy9udW1iZXIudHMiLCJ3ZWJwYWNrOi8vL29iamVjdC50cyIsIndlYnBhY2s6Ly8vc3RyaW5nLnRzIiwid2VicGFjazovLy9xdWV1ZS50cyIsIndlYnBhY2s6Ly8vdXRpbC50cyIsIndlYnBhY2s6Ly8vaGFybmVzcy50cyIsIndlYnBhY2s6Ly8vYXNzZXJ0UmVuZGVyLnRzIiwid2VicGFjazovLy9zZWxlY3Rvci50cyIsIndlYnBhY2s6Ly8vSW5qZWN0b3IudHMiLCJ3ZWJwYWNrOi8vL05vZGVIYW5kbGVyLnRzIiwid2VicGFjazovLy9SZWdpc3RyeS50cyIsIndlYnBhY2s6Ly8vUmVnaXN0cnlIYW5kbGVyLnRzIiwid2VicGFjazovLy9XaWRnZXRCYXNlLnRzIiwid2VicGFjazovLy9jc3NUcmFuc2l0aW9ucy50cyIsIndlYnBhY2s6Ly8vZC50cyIsIndlYnBhY2s6Ly8vYWZ0ZXJSZW5kZXIudHMiLCJ3ZWJwYWNrOi8vL2Fsd2F5c1JlbmRlci50cyIsIndlYnBhY2s6Ly8vYmVmb3JlUHJvcGVydGllcy50cyIsIndlYnBhY2s6Ly8vY3VzdG9tRWxlbWVudC50cyIsIndlYnBhY2s6Ly8vZGlmZlByb3BlcnR5LnRzIiwid2VicGFjazovLy9oYW5kbGVEZWNvcmF0b3IudHMiLCJ3ZWJwYWNrOi8vL2luamVjdC50cyIsIndlYnBhY2s6Ly8vZGlmZi50cyIsIndlYnBhY2s6Ly8vUHJvamVjdG9yLnRzIiwid2VicGFjazovLy9UaGVtZWQudHMiLCJ3ZWJwYWNrOi8vL3JlZ2lzdGVyQ3VzdG9tRWxlbWVudC50cyIsIndlYnBhY2s6Ly8vdmRvbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbWVudS1pdGVtL21lbnVJdGVtLm0uY3NzPzJlNTYiLCJ3ZWJwYWNrOi8vLy4vc3JjL21lbnUvbWVudS5tLmNzcz80MWNiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY3NzLXNlbGVjdC11bWQvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGlmZi9kaXN0L2RpZmYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2V0aW1tZWRpYXRlL3NldEltbWVkaWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2xpYi9hZGRTdHlsZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9saWIvdXJscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdGltZXJzLWJyb3dzZXJpZnkvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL21lbnUtaXRlbS9NZW51SXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbWVudS1pdGVtL21lbnVJdGVtLm0uY3NzIiwid2VicGFjazovLy8uL3NyYy9tZW51L01lbnUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL21lbnUvbWVudS5tLmNzcyIsIndlYnBhY2s6Ly8vLi90ZXN0cy91bml0L2FsbC50cyIsIndlYnBhY2s6Ly8vLi90ZXN0cy91bml0L21lbnUtaXRlbS9NZW51SXRlbS50cyIsIndlYnBhY2s6Ly8vLi90ZXN0cy91bml0L21lbnUvTWVudS50cyJdLCJuYW1lcyI6WyJkXzEiLCJyZXF1aXJlIiwiY3VzdG9tRWxlbWVudF8xIiwiVGhlbWVkXzEiLCJXaWRnZXRCYXNlXzEiLCJjc3MiLCJNZW51SXRlbSIsIl9zdXBlciIsInRzbGliXzEiLCJfX2V4dGVuZHMiLCJwcm90b3R5cGUiLCJfb25DbGljayIsInByb3BlcnRpZXMiLCJvblNlbGVjdGVkIiwiZGF0YSIsInJlbmRlciIsIl9hIiwidGl0bGUiLCJzZWxlY3RlZCIsInYiLCJjbGFzc2VzIiwidGhlbWUiLCJyb290IiwiaXRlbSIsIm9uY2xpY2siLCJfX2RlY29yYXRlIiwiY3VzdG9tRWxlbWVudCIsInRhZyIsImF0dHJpYnV0ZXMiLCJldmVudHMiLCJUaGVtZWRNaXhpbiIsIldpZGdldEJhc2UiLCJleHBvcnRzIiwiZGVmYXVsdCIsIk1lbnUiLCJfb25TZWxlY3RlZCIsImlkIiwiX3NlbGVjdGVkSWQiLCJpbnZhbGlkYXRlIiwiX3RoaXMiLCJpdGVtcyIsImNoaWxkcmVuIiwibWFwIiwiY2hpbGQiLCJpbmRleCIsInVuZGVmaW5lZCIsIl9fYXNzaWduIiwibWVudUNvbnRhaW5lciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFB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O0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUEsU0FBUztBQUNUO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQSwyQ0FBMkM7O0FBRTNDO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7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QTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1DQUFtQyxTQUFTO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRixDQUFDOzs7QUFHRCxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsZ0JBQWdCLGdCQUFnQjtBQUNoQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0EsRUFBRSxJQUFJO0FBQ047O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLCtEQUErRDtBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsd0NBQXdDOztBQUV4QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxzQkFBc0IsaUJBQWlCO0FBQ3ZDO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0EsR0FBRztBQUNILGdCQUFnQjtBQUNoQjtBQUNBOztBQUVBLG1FQUFtRSxRQUFRO0FBQzNFOztBQUVBO0FBQ0EsMEJBQTBCLFlBQVk7QUFDdEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQSxrQkFBa0I7O0FBRWxCLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUEsa0JBQWtCOztBQUVsQixPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlDQUFpQyxPQUFPO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQyxPQUFPO0FBQ3hDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlDQUFpQyxnQkFBZ0I7QUFDakQ7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQyxPQUFPO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUNBQWlDLE9BQU87QUFDeEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLHVDQUF1QztBQUNoRSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0gseUJBQXlCLDBDQUEwQztBQUNuRTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EseUJBQXlCLHdCQUF3QjtBQUNqRCxHQUFHO0FBQ0gseUJBQXlCLDJCQUEyQjtBQUNwRDtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EseUJBQXlCLHdDQUF3QztBQUNqRSxHQUFHO0FBQ0gseUJBQXlCLDJDQUEyQztBQUNwRTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdCQUF3QixvREFBb0Q7QUFDNUUsRUFBRTtBQUNGLHdCQUF3Qix1REFBdUQ7QUFDL0U7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxLQUFLO0FBQ25CLGNBQWMsS0FBSztBQUNuQjtBQUNBLFlBQVksT0FBTztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsTUFBTTtBQUNwQjtBQUNBLGFBQWEsTUFBTTtBQUNuQjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUEseUJBQXlCLG1CQUFtQjtBQUM1QywrQkFBK0IsNEJBQTRCO0FBQzNELGlCQUFpQiw4QkFBOEI7QUFDL0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQSxtQ0FBbUMscUJBQXFCLEVBQUU7O0FBRTFEOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTs7QUFFQTtBQUNBLDRCQUE0QixJQUFJO0FBQ2hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFF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QUVBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLFlBQVksWUFBWTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7O0FBRWxCOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLDRCQUE0QjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTzs7QUFFcEI7QUFDQSxhQUFhLDJC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QUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaURBQWlELHFCQUFxQjtBQUN0RSx1REFBdUQ7O0FBRXZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGlEQUFpRDtBQUNoRSxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxrQkFBa0IsV0FBVztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSixXQUFXO0FBQ1g7QUFDQSw0Q0FBNEMsY0FBYzs7O0FBRzFELE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLDREQUE0RCwwQkFBMEIsMENBQTBDLGdCQUFnQixPQUFPLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxPQUFPLHdCQUF3QixFQUFFOztBQUUzTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWMsdUJBQXVCLEVBQUU7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUVBQXVFO0FBQ3ZFO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLHVCQUF1QjtBQUN6QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxjQUFjOzs7QUFHMUQsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0Q0FBNEMsY0FBYzs7O0FBRzFELE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLG9CQUFvQjtBQUN0QztBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxjQUFjOzs7QUFHMUQsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isb0JBQW9CO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLDRCQUE0QjtBQUM1Qiw0QkFBNEI7QUFDNUIsOEJBQThCOztBQUU5QjtBQUNBO0FBQ0EsNENBQTRDLGNBQWM7OztBQUcxRCxPQUFPO0FBQ1A7QUFDQSxDQUFDO0FBQ0QsQzs7Ozs7OztBQzl5REE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixzQkFBc0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFDQUFxQzs7QUFFckM7QUFDQTtBQUNBOztBQUVBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsVUFBVTs7Ozs7Ozs7QUN2THRDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixpQkFBaUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBDQUEwQyxzQkFBc0IsRUFBRTtBQUNsRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7Ozs7O0FDekxEO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFtQjtBQUNwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUIsc0JBQXNCO0FBQ3ZDOztBQUVBO0FBQ0EsbUJBQW1CLDJCQUEyQjs7QUFFOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdCQUFnQixtQkFBbUI7QUFDbkM7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlCQUFpQiwyQkFBMkI7QUFDNUM7QUFDQTs7QUFFQSxRQUFRLHVCQUF1QjtBQUMvQjtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBLGlCQUFpQix1QkFBdUI7QUFDeEM7QUFDQTs7QUFFQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxnQkFBZ0IsaUJBQWlCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjOztBQUVkLGtEQUFrRCxzQkFBc0I7QUFDeEU7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQ7O0FBRUEsNkJBQTZCLG1CQUFtQjs7QUFFaEQ7O0FBRUE7O0FBRUE7QUFDQTs7Ozs7Ozs7O0FDNVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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IiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIGVmMzUwMzY0YzY1ODk4OGU0YjMzIiwiaW1wb3J0IHsgSGFuZGxlIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGNyZWF0ZUNvbXBvc2l0ZUhhbmRsZSB9IGZyb20gJy4vbGFuZyc7XG5pbXBvcnQgUHJvbWlzZSBmcm9tICcuLi9zaGltL1Byb21pc2UnO1xuXG4vKipcbiAqIE5vIG9wZXJhdGlvbiBmdW5jdGlvbiB0byByZXBsYWNlIG93biBvbmNlIGluc3RhbmNlIGlzIGRlc3RvcnllZFxuICovXG5mdW5jdGlvbiBub29wKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbn1cblxuLyoqXG4gKiBObyBvcCBmdW5jdGlvbiB1c2VkIHRvIHJlcGxhY2Ugb3duLCBvbmNlIGluc3RhbmNlIGhhcyBiZWVuIGRlc3RvcnllZFxuICovXG5mdW5jdGlvbiBkZXN0cm95ZWQoKTogbmV2ZXIge1xuXHR0aHJvdyBuZXcgRXJyb3IoJ0NhbGwgbWFkZSB0byBkZXN0cm95ZWQgbWV0aG9kJyk7XG59XG5cbmV4cG9ydCBjbGFzcyBEZXN0cm95YWJsZSB7XG5cdC8qKlxuXHQgKiByZWdpc3RlciBoYW5kbGVzIGZvciB0aGUgaW5zdGFuY2Vcblx0ICovXG5cdHByaXZhdGUgaGFuZGxlczogSGFuZGxlW107XG5cblx0LyoqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy5oYW5kbGVzID0gW107XG5cdH1cblxuXHQvKipcblx0ICogUmVnaXN0ZXIgaGFuZGxlcyBmb3IgdGhlIGluc3RhbmNlIHRoYXQgd2lsbCBiZSBkZXN0cm95ZWQgd2hlbiBgdGhpcy5kZXN0cm95YCBpcyBjYWxsZWRcblx0ICpcblx0ICogQHBhcmFtIHtIYW5kbGV9IGhhbmRsZSBUaGUgaGFuZGxlIHRvIGFkZCBmb3IgdGhlIGluc3RhbmNlXG5cdCAqIEByZXR1cm5zIHtIYW5kbGV9IGEgaGFuZGxlIGZvciB0aGUgaGFuZGxlLCByZW1vdmVzIHRoZSBoYW5kbGUgZm9yIHRoZSBpbnN0YW5jZSBhbmQgY2FsbHMgZGVzdHJveVxuXHQgKi9cblx0b3duKGhhbmRsZXM6IEhhbmRsZSB8IEhhbmRsZVtdKTogSGFuZGxlIHtcblx0XHRjb25zdCBoYW5kbGUgPSBBcnJheS5pc0FycmF5KGhhbmRsZXMpID8gY3JlYXRlQ29tcG9zaXRlSGFuZGxlKC4uLmhhbmRsZXMpIDogaGFuZGxlcztcblx0XHRjb25zdCB7IGhhbmRsZXM6IF9oYW5kbGVzIH0gPSB0aGlzO1xuXHRcdF9oYW5kbGVzLnB1c2goaGFuZGxlKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0ZGVzdHJveSgpIHtcblx0XHRcdFx0X2hhbmRsZXMuc3BsaWNlKF9oYW5kbGVzLmluZGV4T2YoaGFuZGxlKSk7XG5cdFx0XHRcdGhhbmRsZS5kZXN0cm95KCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZXN0cnB5cyBhbGwgaGFuZGVycyByZWdpc3RlcmVkIGZvciB0aGUgaW5zdGFuY2Vcblx0ICpcblx0ICogQHJldHVybnMge1Byb21pc2U8YW55fSBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIGFsbCBoYW5kbGVzIGhhdmUgYmVlbiBkZXN0cm95ZWRcblx0ICovXG5cdGRlc3Ryb3koKTogUHJvbWlzZTxhbnk+IHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRcdHRoaXMuaGFuZGxlcy5mb3JFYWNoKChoYW5kbGUpID0+IHtcblx0XHRcdFx0aGFuZGxlICYmIGhhbmRsZS5kZXN0cm95ICYmIGhhbmRsZS5kZXN0cm95KCk7XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuZGVzdHJveSA9IG5vb3A7XG5cdFx0XHR0aGlzLm93biA9IGRlc3Ryb3llZDtcblx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0fSk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRGVzdHJveWFibGU7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gRGVzdHJveWFibGUudHMiLCJpbXBvcnQgTWFwIGZyb20gJy4uL3NoaW0vTWFwJztcbmltcG9ydCB7IEhhbmRsZSwgRXZlbnRUeXBlLCBFdmVudE9iamVjdCB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBEZXN0cm95YWJsZSB9IGZyb20gJy4vRGVzdHJveWFibGUnO1xuXG4vKipcbiAqIE1hcCBvZiBjb21wdXRlZCByZWd1bGFyIGV4cHJlc3Npb25zLCBrZXllZCBieSBzdHJpbmdcbiAqL1xuY29uc3QgcmVnZXhNYXAgPSBuZXcgTWFwPHN0cmluZywgUmVnRXhwPigpO1xuXG4vKipcbiAqIERldGVybWluZXMgaXMgdGhlIGV2ZW50IHR5cGUgZ2xvYiBoYXMgYmVlbiBtYXRjaGVkXG4gKlxuICogQHJldHVybnMgYm9vbGVhbiB0aGF0IGluZGljYXRlcyBpZiB0aGUgZ2xvYiBpcyBtYXRjaGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0dsb2JNYXRjaChnbG9iU3RyaW5nOiBzdHJpbmcgfCBzeW1ib2wsIHRhcmdldFN0cmluZzogc3RyaW5nIHwgc3ltYm9sKTogYm9vbGVhbiB7XG5cdGlmICh0eXBlb2YgdGFyZ2V0U3RyaW5nID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgZ2xvYlN0cmluZyA9PT0gJ3N0cmluZycgJiYgZ2xvYlN0cmluZy5pbmRleE9mKCcqJykgIT09IC0xKSB7XG5cdFx0bGV0IHJlZ2V4OiBSZWdFeHA7XG5cdFx0aWYgKHJlZ2V4TWFwLmhhcyhnbG9iU3RyaW5nKSkge1xuXHRcdFx0cmVnZXggPSByZWdleE1hcC5nZXQoZ2xvYlN0cmluZykhO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZWdleCA9IG5ldyBSZWdFeHAoYF4ke2dsb2JTdHJpbmcucmVwbGFjZSgvXFwqL2csICcuKicpfSRgKTtcblx0XHRcdHJlZ2V4TWFwLnNldChnbG9iU3RyaW5nLCByZWdleCk7XG5cdFx0fVxuXHRcdHJldHVybiByZWdleC50ZXN0KHRhcmdldFN0cmluZyk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGdsb2JTdHJpbmcgPT09IHRhcmdldFN0cmluZztcblx0fVxufVxuXG5leHBvcnQgdHlwZSBFdmVudGVkQ2FsbGJhY2s8VCA9IEV2ZW50VHlwZSwgRSBleHRlbmRzIEV2ZW50T2JqZWN0PFQ+ID0gRXZlbnRPYmplY3Q8VD4+ID0ge1xuXHQvKipcblx0ICogQSBjYWxsYmFjayB0aGF0IHRha2VzIGFuIGBldmVudGAgYXJndW1lbnRcblx0ICpcblx0ICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBvYmplY3Rcblx0ICovXG5cblx0KGV2ZW50OiBFKTogYm9vbGVhbiB8IHZvaWQ7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbUV2ZW50VHlwZXM8VCBleHRlbmRzIEV2ZW50T2JqZWN0PGFueT4gPSBFdmVudE9iamVjdDxhbnk+PiB7XG5cdFtpbmRleDogc3RyaW5nXTogVDtcbn1cblxuLyoqXG4gKiBBIHR5cGUgd2hpY2ggaXMgZWl0aGVyIGEgdGFyZ2V0ZWQgZXZlbnQgbGlzdGVuZXIgb3IgYW4gYXJyYXkgb2YgbGlzdGVuZXJzXG4gKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB0YXJnZXQgZm9yIHRoZSBldmVudHNcbiAqIEB0ZW1wbGF0ZSBFIFRoZSBldmVudCB0eXBlIGZvciB0aGUgZXZlbnRzXG4gKi9cbmV4cG9ydCB0eXBlIEV2ZW50ZWRDYWxsYmFja09yQXJyYXk8VCA9IEV2ZW50VHlwZSwgRSBleHRlbmRzIEV2ZW50T2JqZWN0PFQ+ID0gRXZlbnRPYmplY3Q8VD4+ID1cblx0fCBFdmVudGVkQ2FsbGJhY2s8VCwgRT5cblx0fCBFdmVudGVkQ2FsbGJhY2s8VCwgRT5bXTtcblxuLyoqXG4gKiBFdmVudCBDbGFzc1xuICovXG5leHBvcnQgY2xhc3MgRXZlbnRlZDxcblx0TSBleHRlbmRzIEN1c3RvbUV2ZW50VHlwZXMgPSB7fSxcblx0VCA9IEV2ZW50VHlwZSxcblx0TyBleHRlbmRzIEV2ZW50T2JqZWN0PFQ+ID0gRXZlbnRPYmplY3Q8VD5cbj4gZXh0ZW5kcyBEZXN0cm95YWJsZSB7XG5cdC8vIFRoZSBmb2xsb3dpbmcgbWVtYmVyIGlzIHB1cmVseSBzbyBUeXBlU2NyaXB0IHJlbWVtYmVycyB0aGUgdHlwZSBvZiBgTWAgd2hlbiBleHRlbmRpbmcgc29cblx0Ly8gdGhhdCB0aGUgdXRpbGl0aWVzIGluIGBvbi50c2Agd2lsbCB3b3JrIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMjAzNDhcblx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG5cdHByb3RlY3RlZCBfX3R5cGVNYXBfXz86IE07XG5cdC8qKlxuXHQgKiBtYXAgb2YgbGlzdGVuZXJzIGtleWVkIGJ5IGV2ZW50IHR5cGVcblx0ICovXG5cdHByb3RlY3RlZCBsaXN0ZW5lcnNNYXA6IE1hcDxUIHwga2V5b2YgTSwgRXZlbnRlZENhbGxiYWNrPFQsIE8+W10+ID0gbmV3IE1hcCgpO1xuXG5cdC8qKlxuXHQgKiBFbWl0cyB0aGUgZXZlbnQgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIHR5cGVcblx0ICpcblx0ICogQHBhcmFtIGV2ZW50IHRoZSBldmVudCB0byBlbWl0XG5cdCAqL1xuXHRlbWl0PEsgZXh0ZW5kcyBrZXlvZiBNPihldmVudDogTVtLXSk6IHZvaWQ7XG5cdGVtaXQoZXZlbnQ6IE8pOiB2b2lkO1xuXHRlbWl0KGV2ZW50OiBhbnkpOiB2b2lkIHtcblx0XHR0aGlzLmxpc3RlbmVyc01hcC5mb3JFYWNoKChtZXRob2RzLCB0eXBlKSA9PiB7XG5cdFx0XHRpZiAoaXNHbG9iTWF0Y2godHlwZSBhcyBhbnksIGV2ZW50LnR5cGUpKSB7XG5cdFx0XHRcdFsuLi5tZXRob2RzXS5mb3JFYWNoKChtZXRob2QpID0+IHtcblx0XHRcdFx0XHRtZXRob2QuY2FsbCh0aGlzLCBldmVudCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENhdGNoIGFsbCBoYW5kbGVyIGZvciB2YXJpb3VzIGNhbGwgc2lnbmF0dXJlcy4gVGhlIHNpZ25hdHVyZXMgYXJlIGRlZmluZWQgaW5cblx0ICogYEJhc2VFdmVudGVkRXZlbnRzYC4gIFlvdSBjYW4gYWRkIHlvdXIgb3duIGV2ZW50IHR5cGUgLT4gaGFuZGxlciB0eXBlcyBieSBleHRlbmRpbmdcblx0ICogYEJhc2VFdmVudGVkRXZlbnRzYC4gIFNlZSBleGFtcGxlIGZvciBkZXRhaWxzLlxuXHQgKlxuXHQgKiBAcGFyYW0gYXJnc1xuXHQgKlxuXHQgKiBAZXhhbXBsZVxuXHQgKlxuXHQgKiBpbnRlcmZhY2UgV2lkZ2V0QmFzZUV2ZW50cyBleHRlbmRzIEJhc2VFdmVudGVkRXZlbnRzIHtcblx0ICogICAgICh0eXBlOiAncHJvcGVydGllczpjaGFuZ2VkJywgaGFuZGxlcjogUHJvcGVydGllc0NoYW5nZWRIYW5kbGVyKTogSGFuZGxlO1xuXHQgKiB9XG5cdCAqIGNsYXNzIFdpZGdldEJhc2UgZXh0ZW5kcyBFdmVudGVkIHtcblx0ICogICAgb246IFdpZGdldEJhc2VFdmVudHM7XG5cdCAqIH1cblx0ICpcblx0ICogQHJldHVybiB7YW55fVxuXHQgKi9cblx0b248SyBleHRlbmRzIGtleW9mIE0+KHR5cGU6IEssIGxpc3RlbmVyOiBFdmVudGVkQ2FsbGJhY2tPckFycmF5PEssIE1bS10+KTogSGFuZGxlO1xuXHRvbih0eXBlOiBULCBsaXN0ZW5lcjogRXZlbnRlZENhbGxiYWNrT3JBcnJheTxULCBPPik6IEhhbmRsZTtcblx0b24odHlwZTogYW55LCBsaXN0ZW5lcjogRXZlbnRlZENhbGxiYWNrT3JBcnJheTxhbnksIGFueT4pOiBIYW5kbGUge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KGxpc3RlbmVyKSkge1xuXHRcdFx0Y29uc3QgaGFuZGxlcyA9IGxpc3RlbmVyLm1hcCgobGlzdGVuZXIpID0+IHRoaXMuX2FkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkZXN0cm95KCkge1xuXHRcdFx0XHRcdGhhbmRsZXMuZm9yRWFjaCgoaGFuZGxlKSA9PiBoYW5kbGUuZGVzdHJveSgpKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuX2FkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKTtcblx0fVxuXG5cdHByaXZhdGUgX2FkZExpc3RlbmVyKHR5cGU6IFQgfCBrZXlvZiBNLCBsaXN0ZW5lcjogRXZlbnRlZENhbGxiYWNrPFQsIE8+KSB7XG5cdFx0Y29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnNNYXAuZ2V0KHR5cGUpIHx8IFtdO1xuXHRcdGxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcblx0XHR0aGlzLmxpc3RlbmVyc01hcC5zZXQodHlwZSwgbGlzdGVuZXJzKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0ZGVzdHJveTogKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyc01hcC5nZXQodHlwZSkgfHwgW107XG5cdFx0XHRcdGxpc3RlbmVycy5zcGxpY2UobGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpLCAxKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEV2ZW50ZWQ7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gRXZlbnRlZC50cyIsImltcG9ydCB7IEhhbmRsZSB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBhc3NpZ24gfSBmcm9tICcuLi9zaGltL29iamVjdCc7XG5cbmV4cG9ydCB7IGFzc2lnbiB9IGZyb20gJy4uL3NoaW0vb2JqZWN0JztcblxuY29uc3Qgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5jb25zdCBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVHlwZSBndWFyZCB0aGF0IGVuc3VyZXMgdGhhdCB0aGUgdmFsdWUgY2FuIGJlIGNvZXJjZWQgdG8gT2JqZWN0XG4gKiB0byB3ZWVkIG91dCBob3N0IG9iamVjdHMgdGhhdCBkbyBub3QgZGVyaXZlIGZyb20gT2JqZWN0LlxuICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNoZWNrIGlmIHdlIHdhbnQgdG8gZGVlcCBjb3B5IGFuIG9iamVjdCBvciBub3QuXG4gKiBOb3RlOiBJbiBFUzYgaXQgaXMgcG9zc2libGUgdG8gbW9kaWZ5IGFuIG9iamVjdCdzIFN5bWJvbC50b1N0cmluZ1RhZyBwcm9wZXJ0eSwgd2hpY2ggd2lsbFxuICogY2hhbmdlIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBgdG9TdHJpbmdgLiBUaGlzIGlzIGEgcmFyZSBlZGdlIGNhc2UgdGhhdCBpcyBkaWZmaWN1bHQgdG8gaGFuZGxlLFxuICogc28gaXQgaXMgbm90IGhhbmRsZWQgaGVyZS5cbiAqIEBwYXJhbSAgdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJuICAgICAgIElmIHRoZSB2YWx1ZSBpcyBjb2VyY2libGUgaW50byBhbiBPYmplY3RcbiAqL1xuZnVuY3Rpb24gc2hvdWxkRGVlcENvcHlPYmplY3QodmFsdWU6IGFueSk6IHZhbHVlIGlzIE9iamVjdCB7XG5cdHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJztcbn1cblxuZnVuY3Rpb24gY29weUFycmF5PFQ+KGFycmF5OiBUW10sIGluaGVyaXRlZDogYm9vbGVhbik6IFRbXSB7XG5cdHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24oaXRlbTogVCk6IFQge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG5cdFx0XHRyZXR1cm4gPGFueT5jb3B5QXJyYXkoPGFueT5pdGVtLCBpbmhlcml0ZWQpO1xuXHRcdH1cblxuXHRcdHJldHVybiAhc2hvdWxkRGVlcENvcHlPYmplY3QoaXRlbSlcblx0XHRcdD8gaXRlbVxuXHRcdFx0OiBfbWl4aW4oe1xuXHRcdFx0XHRcdGRlZXA6IHRydWUsXG5cdFx0XHRcdFx0aW5oZXJpdGVkOiBpbmhlcml0ZWQsXG5cdFx0XHRcdFx0c291cmNlczogPEFycmF5PFQ+PltpdGVtXSxcblx0XHRcdFx0XHR0YXJnZXQ6IDxUPnt9XG5cdFx0XHRcdH0pO1xuXHR9KTtcbn1cblxuaW50ZXJmYWNlIE1peGluQXJnczxUIGV4dGVuZHMge30sIFUgZXh0ZW5kcyB7fT4ge1xuXHRkZWVwOiBib29sZWFuO1xuXHRpbmhlcml0ZWQ6IGJvb2xlYW47XG5cdHNvdXJjZXM6IChVIHwgbnVsbCB8IHVuZGVmaW5lZClbXTtcblx0dGFyZ2V0OiBUO1xuXHRjb3BpZWQ/OiBhbnlbXTtcbn1cblxuZnVuY3Rpb24gX21peGluPFQgZXh0ZW5kcyB7fSwgVSBleHRlbmRzIHt9Pihrd0FyZ3M6IE1peGluQXJnczxULCBVPik6IFQgJiBVIHtcblx0Y29uc3QgZGVlcCA9IGt3QXJncy5kZWVwO1xuXHRjb25zdCBpbmhlcml0ZWQgPSBrd0FyZ3MuaW5oZXJpdGVkO1xuXHRjb25zdCB0YXJnZXQ6IGFueSA9IGt3QXJncy50YXJnZXQ7XG5cdGNvbnN0IGNvcGllZCA9IGt3QXJncy5jb3BpZWQgfHwgW107XG5cdGNvbnN0IGNvcGllZENsb25lID0gWy4uLmNvcGllZF07XG5cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBrd0FyZ3Muc291cmNlcy5sZW5ndGg7IGkrKykge1xuXHRcdGNvbnN0IHNvdXJjZSA9IGt3QXJncy5zb3VyY2VzW2ldO1xuXG5cdFx0aWYgKHNvdXJjZSA9PT0gbnVsbCB8fCBzb3VyY2UgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdGZvciAobGV0IGtleSBpbiBzb3VyY2UpIHtcblx0XHRcdGlmIChpbmhlcml0ZWQgfHwgaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcblx0XHRcdFx0bGV0IHZhbHVlOiBhbnkgPSBzb3VyY2Vba2V5XTtcblxuXHRcdFx0XHRpZiAoY29waWVkQ2xvbmUuaW5kZXhPZih2YWx1ZSkgIT09IC0xKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZGVlcCkge1xuXHRcdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0XHRcdFx0dmFsdWUgPSBjb3B5QXJyYXkodmFsdWUsIGluaGVyaXRlZCk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChzaG91bGREZWVwQ29weU9iamVjdCh2YWx1ZSkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHRhcmdldFZhbHVlOiBhbnkgPSB0YXJnZXRba2V5XSB8fCB7fTtcblx0XHRcdFx0XHRcdGNvcGllZC5wdXNoKHNvdXJjZSk7XG5cdFx0XHRcdFx0XHR2YWx1ZSA9IF9taXhpbih7XG5cdFx0XHRcdFx0XHRcdGRlZXA6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGluaGVyaXRlZDogaW5oZXJpdGVkLFxuXHRcdFx0XHRcdFx0XHRzb3VyY2VzOiBbdmFsdWVdLFxuXHRcdFx0XHRcdFx0XHR0YXJnZXQ6IHRhcmdldFZhbHVlLFxuXHRcdFx0XHRcdFx0XHRjb3BpZWRcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR0YXJnZXRba2V5XSA9IHZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiA8VCAmIFU+dGFyZ2V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IGZyb20gdGhlIGdpdmVuIHByb3RvdHlwZSwgYW5kIGNvcGllcyBhbGwgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBvZiBvbmUgb3IgbW9yZVxuICogc291cmNlIG9iamVjdHMgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gcHJvdG90eXBlIFRoZSBwcm90b3R5cGUgdG8gY3JlYXRlIGEgbmV3IG9iamVjdCBmcm9tXG4gKiBAcGFyYW0gbWl4aW5zIEFueSBudW1iZXIgb2Ygb2JqZWN0cyB3aG9zZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIHdpbGwgYmUgY29waWVkIHRvIHRoZSBjcmVhdGVkIG9iamVjdFxuICogQHJldHVybiBUaGUgbmV3IG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlPFxuXHRUIGV4dGVuZHMge30sXG5cdFUgZXh0ZW5kcyB7fSxcblx0ViBleHRlbmRzIHt9LFxuXHRXIGV4dGVuZHMge30sXG5cdFggZXh0ZW5kcyB7fSxcblx0WSBleHRlbmRzIHt9LFxuXHRaIGV4dGVuZHMge31cbj4ocHJvdG90eXBlOiBULCBtaXhpbjE6IFUsIG1peGluMjogViwgbWl4aW4zOiBXLCBtaXhpbjQ6IFgsIG1peGluNTogWSwgbWl4aW42OiBaKTogVCAmIFUgJiBWICYgVyAmIFggJiBZICYgWjtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGU8VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30sIFYgZXh0ZW5kcyB7fSwgVyBleHRlbmRzIHt9LCBYIGV4dGVuZHMge30sIFkgZXh0ZW5kcyB7fT4oXG5cdHByb3RvdHlwZTogVCxcblx0bWl4aW4xOiBVLFxuXHRtaXhpbjI6IFYsXG5cdG1peGluMzogVyxcblx0bWl4aW40OiBYLFxuXHRtaXhpbjU6IFlcbik6IFQgJiBVICYgViAmIFcgJiBYICYgWTtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGU8VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30sIFYgZXh0ZW5kcyB7fSwgVyBleHRlbmRzIHt9LCBYIGV4dGVuZHMge30+KFxuXHRwcm90b3R5cGU6IFQsXG5cdG1peGluMTogVSxcblx0bWl4aW4yOiBWLFxuXHRtaXhpbjM6IFcsXG5cdG1peGluNDogWFxuKTogVCAmIFUgJiBWICYgVyAmIFg7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlPFQgZXh0ZW5kcyB7fSwgVSBleHRlbmRzIHt9LCBWIGV4dGVuZHMge30sIFcgZXh0ZW5kcyB7fT4oXG5cdHByb3RvdHlwZTogVCxcblx0bWl4aW4xOiBVLFxuXHRtaXhpbjI6IFYsXG5cdG1peGluMzogV1xuKTogVCAmIFUgJiBWICYgVztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGU8VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30sIFYgZXh0ZW5kcyB7fT4ocHJvdG90eXBlOiBULCBtaXhpbjE6IFUsIG1peGluMjogVik6IFQgJiBVICYgVjtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGU8VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30+KHByb3RvdHlwZTogVCwgbWl4aW46IFUpOiBUICYgVTtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGU8VCBleHRlbmRzIHt9Pihwcm90b3R5cGU6IFQpOiBUO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZShwcm90b3R5cGU6IGFueSwgLi4ubWl4aW5zOiBhbnlbXSk6IGFueSB7XG5cdGlmICghbWl4aW5zLmxlbmd0aCkge1xuXHRcdHRocm93IG5ldyBSYW5nZUVycm9yKCdsYW5nLmNyZWF0ZSByZXF1aXJlcyBhdCBsZWFzdCBvbmUgbWl4aW4gb2JqZWN0LicpO1xuXHR9XG5cblx0Y29uc3QgYXJncyA9IG1peGlucy5zbGljZSgpO1xuXHRhcmdzLnVuc2hpZnQoT2JqZWN0LmNyZWF0ZShwcm90b3R5cGUpKTtcblxuXHRyZXR1cm4gYXNzaWduLmFwcGx5KG51bGwsIGFyZ3MpO1xufVxuXG4vKipcbiAqIENvcGllcyB0aGUgdmFsdWVzIG9mIGFsbCBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIG9mIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIHRoZSB0YXJnZXQgb2JqZWN0LFxuICogcmVjdXJzaXZlbHkgY29weWluZyBhbGwgbmVzdGVkIG9iamVjdHMgYW5kIGFycmF5cyBhcyB3ZWxsLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gcmVjZWl2ZSB2YWx1ZXMgZnJvbSBzb3VyY2Ugb2JqZWN0c1xuICogQHBhcmFtIHNvdXJjZXMgQW55IG51bWJlciBvZiBvYmplY3RzIHdob3NlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIHRhcmdldCBvYmplY3RcbiAqIEByZXR1cm4gVGhlIG1vZGlmaWVkIHRhcmdldCBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBBc3NpZ248XG5cdFQgZXh0ZW5kcyB7fSxcblx0VSBleHRlbmRzIHt9LFxuXHRWIGV4dGVuZHMge30sXG5cdFcgZXh0ZW5kcyB7fSxcblx0WCBleHRlbmRzIHt9LFxuXHRZIGV4dGVuZHMge30sXG5cdFogZXh0ZW5kcyB7fVxuPih0YXJnZXQ6IFQsIHNvdXJjZTE6IFUsIHNvdXJjZTI6IFYsIHNvdXJjZTM6IFcsIHNvdXJjZTQ6IFgsIHNvdXJjZTU6IFksIHNvdXJjZTY6IFopOiBUICYgVSAmIFYgJiBXICYgWCAmIFkgJiBaO1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBBc3NpZ248VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30sIFYgZXh0ZW5kcyB7fSwgVyBleHRlbmRzIHt9LCBYIGV4dGVuZHMge30sIFkgZXh0ZW5kcyB7fT4oXG5cdHRhcmdldDogVCxcblx0c291cmNlMTogVSxcblx0c291cmNlMjogVixcblx0c291cmNlMzogVyxcblx0c291cmNlNDogWCxcblx0c291cmNlNTogWVxuKTogVCAmIFUgJiBWICYgVyAmIFggJiBZO1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBBc3NpZ248VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30sIFYgZXh0ZW5kcyB7fSwgVyBleHRlbmRzIHt9LCBYIGV4dGVuZHMge30+KFxuXHR0YXJnZXQ6IFQsXG5cdHNvdXJjZTE6IFUsXG5cdHNvdXJjZTI6IFYsXG5cdHNvdXJjZTM6IFcsXG5cdHNvdXJjZTQ6IFhcbik6IFQgJiBVICYgViAmIFcgJiBYO1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBBc3NpZ248VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30sIFYgZXh0ZW5kcyB7fSwgVyBleHRlbmRzIHt9Pihcblx0dGFyZ2V0OiBULFxuXHRzb3VyY2UxOiBVLFxuXHRzb3VyY2UyOiBWLFxuXHRzb3VyY2UzOiBXXG4pOiBUICYgVSAmIFYgJiBXO1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBBc3NpZ248VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30sIFYgZXh0ZW5kcyB7fT4odGFyZ2V0OiBULCBzb3VyY2UxOiBVLCBzb3VyY2UyOiBWKTogVCAmIFUgJiBWO1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBBc3NpZ248VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30+KHRhcmdldDogVCwgc291cmNlOiBVKTogVCAmIFU7XG5leHBvcnQgZnVuY3Rpb24gZGVlcEFzc2lnbih0YXJnZXQ6IGFueSwgLi4uc291cmNlczogYW55W10pOiBhbnkge1xuXHRyZXR1cm4gX21peGluKHtcblx0XHRkZWVwOiB0cnVlLFxuXHRcdGluaGVyaXRlZDogZmFsc2UsXG5cdFx0c291cmNlczogc291cmNlcyxcblx0XHR0YXJnZXQ6IHRhcmdldFxuXHR9KTtcbn1cblxuLyoqXG4gKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBhbGwgZW51bWVyYWJsZSAob3duIG9yIGluaGVyaXRlZCkgcHJvcGVydGllcyBvZiBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byB0aGVcbiAqIHRhcmdldCBvYmplY3QsIHJlY3Vyc2l2ZWx5IGNvcHlpbmcgYWxsIG5lc3RlZCBvYmplY3RzIGFuZCBhcnJheXMgYXMgd2VsbC5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IHRvIHJlY2VpdmUgdmFsdWVzIGZyb20gc291cmNlIG9iamVjdHNcbiAqIEBwYXJhbSBzb3VyY2VzIEFueSBudW1iZXIgb2Ygb2JqZWN0cyB3aG9zZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIHRhcmdldCBvYmplY3RcbiAqIEByZXR1cm4gVGhlIG1vZGlmaWVkIHRhcmdldCBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBNaXhpbjxcblx0VCBleHRlbmRzIHt9LFxuXHRVIGV4dGVuZHMge30sXG5cdFYgZXh0ZW5kcyB7fSxcblx0VyBleHRlbmRzIHt9LFxuXHRYIGV4dGVuZHMge30sXG5cdFkgZXh0ZW5kcyB7fSxcblx0WiBleHRlbmRzIHt9XG4+KHRhcmdldDogVCwgc291cmNlMTogVSwgc291cmNlMjogViwgc291cmNlMzogVywgc291cmNlNDogWCwgc291cmNlNTogWSwgc291cmNlNjogWik6IFQgJiBVICYgViAmIFcgJiBYICYgWSAmIFo7XG5leHBvcnQgZnVuY3Rpb24gZGVlcE1peGluPFQgZXh0ZW5kcyB7fSwgVSBleHRlbmRzIHt9LCBWIGV4dGVuZHMge30sIFcgZXh0ZW5kcyB7fSwgWCBleHRlbmRzIHt9LCBZIGV4dGVuZHMge30+KFxuXHR0YXJnZXQ6IFQsXG5cdHNvdXJjZTE6IFUsXG5cdHNvdXJjZTI6IFYsXG5cdHNvdXJjZTM6IFcsXG5cdHNvdXJjZTQ6IFgsXG5cdHNvdXJjZTU6IFlcbik6IFQgJiBVICYgViAmIFcgJiBYICYgWTtcbmV4cG9ydCBmdW5jdGlvbiBkZWVwTWl4aW48VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30sIFYgZXh0ZW5kcyB7fSwgVyBleHRlbmRzIHt9LCBYIGV4dGVuZHMge30+KFxuXHR0YXJnZXQ6IFQsXG5cdHNvdXJjZTE6IFUsXG5cdHNvdXJjZTI6IFYsXG5cdHNvdXJjZTM6IFcsXG5cdHNvdXJjZTQ6IFhcbik6IFQgJiBVICYgViAmIFcgJiBYO1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBNaXhpbjxUIGV4dGVuZHMge30sIFUgZXh0ZW5kcyB7fSwgViBleHRlbmRzIHt9LCBXIGV4dGVuZHMge30+KFxuXHR0YXJnZXQ6IFQsXG5cdHNvdXJjZTE6IFUsXG5cdHNvdXJjZTI6IFYsXG5cdHNvdXJjZTM6IFdcbik6IFQgJiBVICYgViAmIFc7XG5leHBvcnQgZnVuY3Rpb24gZGVlcE1peGluPFQgZXh0ZW5kcyB7fSwgVSBleHRlbmRzIHt9LCBWIGV4dGVuZHMge30+KHRhcmdldDogVCwgc291cmNlMTogVSwgc291cmNlMjogVik6IFQgJiBVICYgVjtcbmV4cG9ydCBmdW5jdGlvbiBkZWVwTWl4aW48VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30+KHRhcmdldDogVCwgc291cmNlOiBVKTogVCAmIFU7XG5leHBvcnQgZnVuY3Rpb24gZGVlcE1peGluKHRhcmdldDogYW55LCAuLi5zb3VyY2VzOiBhbnlbXSk6IGFueSB7XG5cdHJldHVybiBfbWl4aW4oe1xuXHRcdGRlZXA6IHRydWUsXG5cdFx0aW5oZXJpdGVkOiB0cnVlLFxuXHRcdHNvdXJjZXM6IHNvdXJjZXMsXG5cdFx0dGFyZ2V0OiB0YXJnZXRcblx0fSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3QgdXNpbmcgdGhlIHByb3ZpZGVkIHNvdXJjZSdzIHByb3RvdHlwZSBhcyB0aGUgcHJvdG90eXBlIGZvciB0aGUgbmV3IG9iamVjdCwgYW5kIHRoZW5cbiAqIGRlZXAgY29waWVzIHRoZSBwcm92aWRlZCBzb3VyY2UncyB2YWx1ZXMgaW50byB0aGUgbmV3IHRhcmdldC5cbiAqXG4gKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3QgdG8gZHVwbGljYXRlXG4gKiBAcmV0dXJuIFRoZSBuZXcgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkdXBsaWNhdGU8VCBleHRlbmRzIHt9Pihzb3VyY2U6IFQpOiBUIHtcblx0Y29uc3QgdGFyZ2V0ID0gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2Yoc291cmNlKSk7XG5cblx0cmV0dXJuIGRlZXBNaXhpbih0YXJnZXQsIHNvdXJjZSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHR3byB2YWx1ZXMgYXJlIHRoZSBzYW1lIHZhbHVlLlxuICpcbiAqIEBwYXJhbSBhIEZpcnN0IHZhbHVlIHRvIGNvbXBhcmVcbiAqIEBwYXJhbSBiIFNlY29uZCB2YWx1ZSB0byBjb21wYXJlXG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlcyBhcmUgdGhlIHNhbWU7IGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJZGVudGljYWwoYTogYW55LCBiOiBhbnkpOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHRhID09PSBiIHx8XG5cdFx0LyogYm90aCB2YWx1ZXMgYXJlIE5hTiAqL1xuXHRcdChhICE9PSBhICYmIGIgIT09IGIpXG5cdCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgYmluZHMgYSBtZXRob2QgdG8gdGhlIHNwZWNpZmllZCBvYmplY3QgYXQgcnVudGltZS4gVGhpcyBpcyBzaW1pbGFyIHRvXG4gKiBgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRgLCBidXQgaW5zdGVhZCBvZiBhIGZ1bmN0aW9uIGl0IHRha2VzIHRoZSBuYW1lIG9mIGEgbWV0aG9kIG9uIGFuIG9iamVjdC5cbiAqIEFzIGEgcmVzdWx0LCB0aGUgZnVuY3Rpb24gcmV0dXJuZWQgYnkgYGxhdGVCaW5kYCB3aWxsIGFsd2F5cyBjYWxsIHRoZSBmdW5jdGlvbiBjdXJyZW50bHkgYXNzaWduZWQgdG9cbiAqIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgb24gdGhlIG9iamVjdCBhcyBvZiB0aGUgbW9tZW50IHRoZSBmdW5jdGlvbiBpdCByZXR1cm5zIGlzIGNhbGxlZC5cbiAqXG4gKiBAcGFyYW0gaW5zdGFuY2UgVGhlIGNvbnRleHQgb2JqZWN0XG4gKiBAcGFyYW0gbWV0aG9kIFRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgb24gdGhlIGNvbnRleHQgb2JqZWN0IHRvIGJpbmQgdG8gaXRzZWxmXG4gKiBAcGFyYW0gc3VwcGxpZWRBcmdzIEFuIG9wdGlvbmFsIGFycmF5IG9mIHZhbHVlcyB0byBwcmVwZW5kIHRvIHRoZSBgaW5zdGFuY2VbbWV0aG9kXWAgYXJndW1lbnRzIGxpc3RcbiAqIEByZXR1cm4gVGhlIGJvdW5kIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXRlQmluZChpbnN0YW5jZToge30sIG1ldGhvZDogc3RyaW5nLCAuLi5zdXBwbGllZEFyZ3M6IGFueVtdKTogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkge1xuXHRyZXR1cm4gc3VwcGxpZWRBcmdzLmxlbmd0aFxuXHRcdD8gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGNvbnN0IGFyZ3M6IGFueVtdID0gYXJndW1lbnRzLmxlbmd0aCA/IHN1cHBsaWVkQXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKSA6IHN1cHBsaWVkQXJncztcblxuXHRcdFx0XHQvLyBUUzcwMTdcblx0XHRcdFx0cmV0dXJuICg8YW55Pmluc3RhbmNlKVttZXRob2RdLmFwcGx5KGluc3RhbmNlLCBhcmdzKTtcblx0XHRcdH1cblx0XHQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHQvLyBUUzcwMTdcblx0XHRcdFx0cmV0dXJuICg8YW55Pmluc3RhbmNlKVttZXRob2RdLmFwcGx5KGluc3RhbmNlLCBhcmd1bWVudHMpO1xuXHRcdFx0fTtcbn1cblxuLyoqXG4gKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBhbGwgZW51bWVyYWJsZSAob3duIG9yIGluaGVyaXRlZCkgcHJvcGVydGllcyBvZiBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byB0aGVcbiAqIHRhcmdldCBvYmplY3QuXG4gKlxuICogQHJldHVybiBUaGUgbW9kaWZpZWQgdGFyZ2V0IG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWl4aW48VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30sIFYgZXh0ZW5kcyB7fSwgVyBleHRlbmRzIHt9LCBYIGV4dGVuZHMge30sIFkgZXh0ZW5kcyB7fSwgWiBleHRlbmRzIHt9Pihcblx0dGFyZ2V0OiBULFxuXHRzb3VyY2UxOiBVLFxuXHRzb3VyY2UyOiBWLFxuXHRzb3VyY2UzOiBXLFxuXHRzb3VyY2U0OiBYLFxuXHRzb3VyY2U1OiBZLFxuXHRzb3VyY2U2OiBaXG4pOiBUICYgVSAmIFYgJiBXICYgWCAmIFkgJiBaO1xuZXhwb3J0IGZ1bmN0aW9uIG1peGluPFQgZXh0ZW5kcyB7fSwgVSBleHRlbmRzIHt9LCBWIGV4dGVuZHMge30sIFcgZXh0ZW5kcyB7fSwgWCBleHRlbmRzIHt9LCBZIGV4dGVuZHMge30+KFxuXHR0YXJnZXQ6IFQsXG5cdHNvdXJjZTE6IFUsXG5cdHNvdXJjZTI6IFYsXG5cdHNvdXJjZTM6IFcsXG5cdHNvdXJjZTQ6IFgsXG5cdHNvdXJjZTU6IFlcbik6IFQgJiBVICYgViAmIFcgJiBYICYgWTtcbmV4cG9ydCBmdW5jdGlvbiBtaXhpbjxUIGV4dGVuZHMge30sIFUgZXh0ZW5kcyB7fSwgViBleHRlbmRzIHt9LCBXIGV4dGVuZHMge30sIFggZXh0ZW5kcyB7fT4oXG5cdHRhcmdldDogVCxcblx0c291cmNlMTogVSxcblx0c291cmNlMjogVixcblx0c291cmNlMzogVyxcblx0c291cmNlNDogWFxuKTogVCAmIFUgJiBWICYgVyAmIFg7XG5leHBvcnQgZnVuY3Rpb24gbWl4aW48VCBleHRlbmRzIHt9LCBVIGV4dGVuZHMge30sIFYgZXh0ZW5kcyB7fSwgVyBleHRlbmRzIHt9Pihcblx0dGFyZ2V0OiBULFxuXHRzb3VyY2UxOiBVLFxuXHRzb3VyY2UyOiBWLFxuXHRzb3VyY2UzOiBXXG4pOiBUICYgVSAmIFYgJiBXO1xuZXhwb3J0IGZ1bmN0aW9uIG1peGluPFQgZXh0ZW5kcyB7fSwgVSBleHRlbmRzIHt9LCBWIGV4dGVuZHMge30+KHRhcmdldDogVCwgc291cmNlMTogVSwgc291cmNlMjogVik6IFQgJiBVICYgVjtcbmV4cG9ydCBmdW5jdGlvbiBtaXhpbjxUIGV4dGVuZHMge30sIFUgZXh0ZW5kcyB7fT4odGFyZ2V0OiBULCBzb3VyY2U6IFUpOiBUICYgVTtcbmV4cG9ydCBmdW5jdGlvbiBtaXhpbih0YXJnZXQ6IGFueSwgLi4uc291cmNlczogYW55W10pOiBhbnkge1xuXHRyZXR1cm4gX21peGluKHtcblx0XHRkZWVwOiBmYWxzZSxcblx0XHRpbmhlcml0ZWQ6IHRydWUsXG5cdFx0c291cmNlczogc291cmNlcyxcblx0XHR0YXJnZXQ6IHRhcmdldFxuXHR9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gd2hpY2ggaW52b2tlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzIHByZXBlbmRlZCB0byBpdHMgYXJndW1lbnQgbGlzdC5cbiAqIExpa2UgYEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kYCwgYnV0IGRvZXMgbm90IGFsdGVyIGV4ZWN1dGlvbiBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSB0YXJnZXRGdW5jdGlvbiBUaGUgZnVuY3Rpb24gdGhhdCBuZWVkcyB0byBiZSBib3VuZFxuICogQHBhcmFtIHN1cHBsaWVkQXJncyBBbiBvcHRpb25hbCBhcnJheSBvZiBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aGUgYHRhcmdldEZ1bmN0aW9uYCBhcmd1bWVudHMgbGlzdFxuICogQHJldHVybiBUaGUgYm91bmQgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnRpYWwodGFyZ2V0RnVuY3Rpb246ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCAuLi5zdXBwbGllZEFyZ3M6IGFueVtdKTogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkge1xuXHRyZXR1cm4gZnVuY3Rpb24odGhpczogYW55KSB7XG5cdFx0Y29uc3QgYXJnczogYW55W10gPSBhcmd1bWVudHMubGVuZ3RoID8gc3VwcGxpZWRBcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpIDogc3VwcGxpZWRBcmdzO1xuXG5cdFx0cmV0dXJuIHRhcmdldEZ1bmN0aW9uLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBkZXN0cm95IG1ldGhvZCB0aGF0LCB3aGVuIGNhbGxlZCwgY2FsbHMgdGhlIHBhc3NlZC1pbiBkZXN0cnVjdG9yLlxuICogVGhpcyBpcyBpbnRlbmRlZCB0byBwcm92aWRlIGEgdW5pZmllZCBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIFwicmVtb3ZlXCIgLyBcImRlc3Ryb3lcIiBoYW5kbGVycyBmb3JcbiAqIGV2ZW50IGxpc3RlbmVycywgdGltZXJzLCBldGMuXG4gKlxuICogQHBhcmFtIGRlc3RydWN0b3IgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGhhbmRsZSdzIGBkZXN0cm95YCBtZXRob2QgaXMgaW52b2tlZFxuICogQHJldHVybiBUaGUgaGFuZGxlIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSGFuZGxlKGRlc3RydWN0b3I6ICgpID0+IHZvaWQpOiBIYW5kbGUge1xuXHRsZXQgY2FsbGVkID0gZmFsc2U7XG5cdHJldHVybiB7XG5cdFx0ZGVzdHJveTogZnVuY3Rpb24odGhpczogSGFuZGxlKSB7XG5cdFx0XHRpZiAoIWNhbGxlZCkge1xuXHRcdFx0XHRjYWxsZWQgPSB0cnVlO1xuXHRcdFx0XHRkZXN0cnVjdG9yKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBzaW5nbGUgaGFuZGxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVzdHJveSBtdWx0aXBsZSBoYW5kbGVzIHNpbXVsdGFuZW91c2x5LlxuICpcbiAqIEBwYXJhbSBoYW5kbGVzIEFuIGFycmF5IG9mIGhhbmRsZXMgd2l0aCBgZGVzdHJveWAgbWV0aG9kc1xuICogQHJldHVybiBUaGUgaGFuZGxlIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29tcG9zaXRlSGFuZGxlKC4uLmhhbmRsZXM6IEhhbmRsZVtdKTogSGFuZGxlIHtcblx0cmV0dXJuIGNyZWF0ZUhhbmRsZShmdW5jdGlvbigpIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGhhbmRsZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGhhbmRsZXNbaV0uZGVzdHJveSgpO1xuXHRcdH1cblx0fSk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gbGFuZy50cyIsImltcG9ydCBoYXMsIHsgYWRkIH0gZnJvbSAnLi4vLi4vaGFzL2hhcyc7XG5pbXBvcnQgZ2xvYmFsIGZyb20gJy4uL2dsb2JhbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGhhcztcbmV4cG9ydCAqIGZyb20gJy4uLy4uL2hhcy9oYXMnO1xuXG4vKiBFQ01BU2NyaXB0IDYgYW5kIDcgRmVhdHVyZXMgKi9cblxuLyogQXJyYXkgKi9cbmFkZChcblx0J2VzNi1hcnJheScsXG5cdCgpID0+IHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0Wydmcm9tJywgJ29mJ10uZXZlcnkoKGtleSkgPT4ga2V5IGluIGdsb2JhbC5BcnJheSkgJiZcblx0XHRcdFsnZmluZEluZGV4JywgJ2ZpbmQnLCAnY29weVdpdGhpbiddLmV2ZXJ5KChrZXkpID0+IGtleSBpbiBnbG9iYWwuQXJyYXkucHJvdG90eXBlKVxuXHRcdCk7XG5cdH0sXG5cdHRydWVcbik7XG5cbmFkZChcblx0J2VzNi1hcnJheS1maWxsJyxcblx0KCkgPT4ge1xuXHRcdGlmICgnZmlsbCcgaW4gZ2xvYmFsLkFycmF5LnByb3RvdHlwZSkge1xuXHRcdFx0LyogU29tZSB2ZXJzaW9ucyBvZiBTYWZhcmkgZG8gbm90IHByb3Blcmx5IGltcGxlbWVudCB0aGlzICovXG5cdFx0XHRyZXR1cm4gKDxhbnk+WzFdKS5maWxsKDksIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSlbMF0gPT09IDE7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblx0dHJ1ZVxuKTtcblxuYWRkKCdlczctYXJyYXknLCAoKSA9PiAnaW5jbHVkZXMnIGluIGdsb2JhbC5BcnJheS5wcm90b3R5cGUsIHRydWUpO1xuXG4vKiBNYXAgKi9cbmFkZChcblx0J2VzNi1tYXAnLFxuXHQoKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBnbG9iYWwuTWFwID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHQvKlxuXHRcdElFMTEgYW5kIG9sZGVyIHZlcnNpb25zIG9mIFNhZmFyaSBhcmUgbWlzc2luZyBjcml0aWNhbCBFUzYgTWFwIGZ1bmN0aW9uYWxpdHlcblx0XHRXZSB3cmFwIHRoaXMgaW4gYSB0cnkvY2F0Y2ggYmVjYXVzZSBzb21ldGltZXMgdGhlIE1hcCBjb25zdHJ1Y3RvciBleGlzdHMsIGJ1dCBkb2VzIG5vdFxuXHRcdHRha2UgYXJndW1lbnRzIChpT1MgOC40KVxuXHRcdCAqL1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgbWFwID0gbmV3IGdsb2JhbC5NYXAoW1swLCAxXV0pO1xuXG5cdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0bWFwLmhhcygwKSAmJlxuXHRcdFx0XHRcdHR5cGVvZiBtYXAua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdFx0XHRcdGhhcygnZXM2LXN5bWJvbCcpICYmXG5cdFx0XHRcdFx0dHlwZW9mIG1hcC52YWx1ZXMgPT09ICdmdW5jdGlvbicgJiZcblx0XHRcdFx0XHR0eXBlb2YgbWFwLmVudHJpZXMgPT09ICdmdW5jdGlvbidcblx0XHRcdFx0KTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0LyogaXN0YW5idWwgaWdub3JlIG5leHQ6IG5vdCB0ZXN0aW5nIG9uIGlPUyBhdCB0aGUgbW9tZW50ICovXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXHR0cnVlXG4pO1xuXG4vKiBNYXRoICovXG5hZGQoXG5cdCdlczYtbWF0aCcsXG5cdCgpID0+IHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0J2NsejMyJyxcblx0XHRcdCdzaWduJyxcblx0XHRcdCdsb2cxMCcsXG5cdFx0XHQnbG9nMicsXG5cdFx0XHQnbG9nMXAnLFxuXHRcdFx0J2V4cG0xJyxcblx0XHRcdCdjb3NoJyxcblx0XHRcdCdzaW5oJyxcblx0XHRcdCd0YW5oJyxcblx0XHRcdCdhY29zaCcsXG5cdFx0XHQnYXNpbmgnLFxuXHRcdFx0J2F0YW5oJyxcblx0XHRcdCd0cnVuYycsXG5cdFx0XHQnZnJvdW5kJyxcblx0XHRcdCdjYnJ0Jyxcblx0XHRcdCdoeXBvdCdcblx0XHRdLmV2ZXJ5KChuYW1lKSA9PiB0eXBlb2YgZ2xvYmFsLk1hdGhbbmFtZV0gPT09ICdmdW5jdGlvbicpO1xuXHR9LFxuXHR0cnVlXG4pO1xuXG5hZGQoXG5cdCdlczYtbWF0aC1pbXVsJyxcblx0KCkgPT4ge1xuXHRcdGlmICgnaW11bCcgaW4gZ2xvYmFsLk1hdGgpIHtcblx0XHRcdC8qIFNvbWUgdmVyc2lvbnMgb2YgU2FmYXJpIG9uIGlvcyBkbyBub3QgcHJvcGVybHkgaW1wbGVtZW50IHRoaXMgKi9cblx0XHRcdHJldHVybiAoPGFueT5NYXRoKS5pbXVsKDB4ZmZmZmZmZmYsIDUpID09PSAtNTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXHR0cnVlXG4pO1xuXG4vKiBPYmplY3QgKi9cbmFkZChcblx0J2VzNi1vYmplY3QnLFxuXHQoKSA9PiB7XG5cdFx0cmV0dXJuIChcblx0XHRcdGhhcygnZXM2LXN5bWJvbCcpICYmXG5cdFx0XHRbJ2Fzc2lnbicsICdpcycsICdnZXRPd25Qcm9wZXJ0eVN5bWJvbHMnLCAnc2V0UHJvdG90eXBlT2YnXS5ldmVyeShcblx0XHRcdFx0KG5hbWUpID0+IHR5cGVvZiBnbG9iYWwuT2JqZWN0W25hbWVdID09PSAnZnVuY3Rpb24nXG5cdFx0XHQpXG5cdFx0KTtcblx0fSxcblx0dHJ1ZVxuKTtcblxuYWRkKFxuXHQnZXMyMDE3LW9iamVjdCcsXG5cdCgpID0+IHtcblx0XHRyZXR1cm4gWyd2YWx1ZXMnLCAnZW50cmllcycsICdnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzJ10uZXZlcnkoXG5cdFx0XHQobmFtZSkgPT4gdHlwZW9mIGdsb2JhbC5PYmplY3RbbmFtZV0gPT09ICdmdW5jdGlvbidcblx0XHQpO1xuXHR9LFxuXHR0cnVlXG4pO1xuXG4vKiBPYnNlcnZhYmxlICovXG5hZGQoJ2VzLW9ic2VydmFibGUnLCAoKSA9PiB0eXBlb2YgZ2xvYmFsLk9ic2VydmFibGUgIT09ICd1bmRlZmluZWQnLCB0cnVlKTtcblxuLyogUHJvbWlzZSAqL1xuYWRkKCdlczYtcHJvbWlzZScsICgpID0+IHR5cGVvZiBnbG9iYWwuUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgaGFzKCdlczYtc3ltYm9sJyksIHRydWUpO1xuXG4vKiBTZXQgKi9cbmFkZChcblx0J2VzNi1zZXQnLFxuXHQoKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBnbG9iYWwuU2V0ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHQvKiBJRTExIGFuZCBvbGRlciB2ZXJzaW9ucyBvZiBTYWZhcmkgYXJlIG1pc3NpbmcgY3JpdGljYWwgRVM2IFNldCBmdW5jdGlvbmFsaXR5ICovXG5cdFx0XHRjb25zdCBzZXQgPSBuZXcgZ2xvYmFsLlNldChbMV0pO1xuXHRcdFx0cmV0dXJuIHNldC5oYXMoMSkgJiYgJ2tleXMnIGluIHNldCAmJiB0eXBlb2Ygc2V0LmtleXMgPT09ICdmdW5jdGlvbicgJiYgaGFzKCdlczYtc3ltYm9sJyk7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblx0dHJ1ZVxuKTtcblxuLyogU3RyaW5nICovXG5hZGQoXG5cdCdlczYtc3RyaW5nJyxcblx0KCkgPT4ge1xuXHRcdHJldHVybiAoXG5cdFx0XHRbXG5cdFx0XHRcdC8qIHN0YXRpYyBtZXRob2RzICovXG5cdFx0XHRcdCdmcm9tQ29kZVBvaW50J1xuXHRcdFx0XS5ldmVyeSgoa2V5KSA9PiB0eXBlb2YgZ2xvYmFsLlN0cmluZ1trZXldID09PSAnZnVuY3Rpb24nKSAmJlxuXHRcdFx0W1xuXHRcdFx0XHQvKiBpbnN0YW5jZSBtZXRob2RzICovXG5cdFx0XHRcdCdjb2RlUG9pbnRBdCcsXG5cdFx0XHRcdCdub3JtYWxpemUnLFxuXHRcdFx0XHQncmVwZWF0Jyxcblx0XHRcdFx0J3N0YXJ0c1dpdGgnLFxuXHRcdFx0XHQnZW5kc1dpdGgnLFxuXHRcdFx0XHQnaW5jbHVkZXMnXG5cdFx0XHRdLmV2ZXJ5KChrZXkpID0+IHR5cGVvZiBnbG9iYWwuU3RyaW5nLnByb3RvdHlwZVtrZXldID09PSAnZnVuY3Rpb24nKVxuXHRcdCk7XG5cdH0sXG5cdHRydWVcbik7XG5cbmFkZChcblx0J2VzNi1zdHJpbmctcmF3Jyxcblx0KCkgPT4ge1xuXHRcdGZ1bmN0aW9uIGdldENhbGxTaXRlKGNhbGxTaXRlOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSwgLi4uc3Vic3RpdHV0aW9uczogYW55W10pIHtcblx0XHRcdGNvbnN0IHJlc3VsdCA9IFsuLi5jYWxsU2l0ZV07XG5cdFx0XHQocmVzdWx0IGFzIGFueSkucmF3ID0gY2FsbFNpdGUucmF3O1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRpZiAoJ3JhdycgaW4gZ2xvYmFsLlN0cmluZykge1xuXHRcdFx0bGV0IGIgPSAxO1xuXHRcdFx0bGV0IGNhbGxTaXRlID0gZ2V0Q2FsbFNpdGVgYVxcbiR7Yn1gO1xuXG5cdFx0XHQoY2FsbFNpdGUgYXMgYW55KS5yYXcgPSBbJ2FcXFxcbiddO1xuXHRcdFx0Y29uc3Qgc3VwcG9ydHNUcnVuYyA9IGdsb2JhbC5TdHJpbmcucmF3KGNhbGxTaXRlLCA0MikgPT09ICdhOlxcXFxuJztcblxuXHRcdFx0cmV0dXJuIHN1cHBvcnRzVHJ1bmM7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXHR0cnVlXG4pO1xuXG5hZGQoXG5cdCdlczIwMTctc3RyaW5nJyxcblx0KCkgPT4ge1xuXHRcdHJldHVybiBbJ3BhZFN0YXJ0JywgJ3BhZEVuZCddLmV2ZXJ5KChrZXkpID0+IHR5cGVvZiBnbG9iYWwuU3RyaW5nLnByb3RvdHlwZVtrZXldID09PSAnZnVuY3Rpb24nKTtcblx0fSxcblx0dHJ1ZVxuKTtcblxuLyogU3ltYm9sICovXG5hZGQoJ2VzNi1zeW1ib2wnLCAoKSA9PiB0eXBlb2YgZ2xvYmFsLlN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIFN5bWJvbCgpID09PSAnc3ltYm9sJywgdHJ1ZSk7XG5cbi8qIFdlYWtNYXAgKi9cbmFkZChcblx0J2VzNi13ZWFrbWFwJyxcblx0KCkgPT4ge1xuXHRcdGlmICh0eXBlb2YgZ2xvYmFsLldlYWtNYXAgIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHQvKiBJRTExIGFuZCBvbGRlciB2ZXJzaW9ucyBvZiBTYWZhcmkgYXJlIG1pc3NpbmcgY3JpdGljYWwgRVM2IE1hcCBmdW5jdGlvbmFsaXR5ICovXG5cdFx0XHRjb25zdCBrZXkxID0ge307XG5cdFx0XHRjb25zdCBrZXkyID0ge307XG5cdFx0XHRjb25zdCBtYXAgPSBuZXcgZ2xvYmFsLldlYWtNYXAoW1trZXkxLCAxXV0pO1xuXHRcdFx0T2JqZWN0LmZyZWV6ZShrZXkxKTtcblx0XHRcdHJldHVybiBtYXAuZ2V0KGtleTEpID09PSAxICYmIG1hcC5zZXQoa2V5MiwgMikgPT09IG1hcCAmJiBoYXMoJ2VzNi1zeW1ib2wnKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXHR0cnVlXG4pO1xuXG4vKiBNaXNjZWxsYW5lb3VzIGZlYXR1cmVzICovXG5hZGQoJ21pY3JvdGFza3MnLCAoKSA9PiBoYXMoJ2VzNi1wcm9taXNlJykgfHwgaGFzKCdob3N0LW5vZGUnKSB8fCBoYXMoJ2RvbS1tdXRhdGlvbm9ic2VydmVyJyksIHRydWUpO1xuYWRkKFxuXHQncG9zdG1lc3NhZ2UnLFxuXHQoKSA9PiB7XG5cdFx0Ly8gSWYgd2luZG93IGlzIHVuZGVmaW5lZCwgYW5kIHdlIGhhdmUgcG9zdE1lc3NhZ2UsIGl0IHByb2JhYmx5IG1lYW5zIHdlJ3JlIGluIGEgd2ViIHdvcmtlci4gV2ViIHdvcmtlcnMgaGF2ZVxuXHRcdC8vIHBvc3QgbWVzc2FnZSBidXQgaXQgZG9lc24ndCB3b3JrIGhvdyB3ZSBleHBlY3QgaXQgdG8sIHNvIGl0J3MgYmVzdCBqdXN0IHRvIHByZXRlbmQgaXQgZG9lc24ndCBleGlzdC5cblx0XHRyZXR1cm4gdHlwZW9mIGdsb2JhbC53aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBnbG9iYWwucG9zdE1lc3NhZ2UgPT09ICdmdW5jdGlvbic7XG5cdH0sXG5cdHRydWVcbik7XG5hZGQoJ3JhZicsICgpID0+IHR5cGVvZiBnbG9iYWwucmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nLCB0cnVlKTtcbmFkZCgnc2V0aW1tZWRpYXRlJywgKCkgPT4gdHlwZW9mIGdsb2JhbC5zZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnLCB0cnVlKTtcblxuLyogRE9NIEZlYXR1cmVzICovXG5cbmFkZChcblx0J2RvbS1tdXRhdGlvbm9ic2VydmVyJyxcblx0KCkgPT4ge1xuXHRcdGlmIChoYXMoJ2hvc3QtYnJvd3NlcicpICYmIEJvb2xlYW4oZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXIpKSB7XG5cdFx0XHQvLyBJRTExIGhhcyBhbiB1bnJlbGlhYmxlIE11dGF0aW9uT2JzZXJ2ZXIgaW1wbGVtZW50YXRpb24gd2hlcmUgc2V0UHJvcGVydHkoKSBkb2VzIG5vdFxuXHRcdFx0Ly8gZ2VuZXJhdGUgYSBtdXRhdGlvbiBldmVudCwgb2JzZXJ2ZXJzIGNhbiBjcmFzaCwgYW5kIHRoZSBxdWV1ZSBkb2VzIG5vdCBkcmFpblxuXHRcdFx0Ly8gcmVsaWFibHkuIFRoZSBmb2xsb3dpbmcgZmVhdHVyZSB0ZXN0IHdhcyBhZGFwdGVkIGZyb21cblx0XHRcdC8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3QxMGtvLzRhY2ViOGM3MTY4MWZkYjI3NWUzM2VmZTVlNTc2YjE0XG5cdFx0XHRjb25zdCBleGFtcGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0XHQvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZSAqL1xuXHRcdFx0Y29uc3QgSG9zdE11dGF0aW9uT2JzZXJ2ZXIgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcblx0XHRcdGNvbnN0IG9ic2VydmVyID0gbmV3IEhvc3RNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKCkge30pO1xuXHRcdFx0b2JzZXJ2ZXIub2JzZXJ2ZShleGFtcGxlLCB7IGF0dHJpYnV0ZXM6IHRydWUgfSk7XG5cblx0XHRcdGV4YW1wbGUuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCAnYmxvY2snKTtcblxuXHRcdFx0cmV0dXJuIEJvb2xlYW4ob2JzZXJ2ZXIudGFrZVJlY29yZHMoKS5sZW5ndGgpO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cdHRydWVcbik7XG5cbmFkZChcblx0J2RvbS13ZWJhbmltYXRpb24nLFxuXHQoKSA9PiBoYXMoJ2hvc3QtYnJvd3NlcicpICYmIGdsb2JhbC5BbmltYXRpb24gIT09IHVuZGVmaW5lZCAmJiBnbG9iYWwuS2V5ZnJhbWVFZmZlY3QgIT09IHVuZGVmaW5lZCxcblx0dHJ1ZVxuKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBoYXMudHMiLCJpbXBvcnQgeyBpc0FycmF5TGlrZSwgSXRlcmFibGUsIEl0ZXJhYmxlSXRlcmF0b3IsIFNoaW1JdGVyYXRvciB9IGZyb20gJy4vaXRlcmF0b3InO1xuaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XG5pbXBvcnQgeyBpcyBhcyBvYmplY3RJcyB9IGZyb20gJy4vb2JqZWN0JztcbmltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XG5pbXBvcnQgJy4vU3ltYm9sJztcblxuZXhwb3J0IGludGVyZmFjZSBNYXA8SywgVj4ge1xuXHQvKipcblx0ICogRGVsZXRlcyBhbGwga2V5cyBhbmQgdGhlaXIgYXNzb2NpYXRlZCB2YWx1ZXMuXG5cdCAqL1xuXHRjbGVhcigpOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBEZWxldGVzIGEgZ2l2ZW4ga2V5IGFuZCBpdHMgYXNzb2NpYXRlZCB2YWx1ZS5cblx0ICpcblx0ICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGRlbGV0ZVxuXHQgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGtleSBleGlzdHMsIGZhbHNlIGlmIGl0IGRvZXMgbm90XG5cdCAqL1xuXHRkZWxldGUoa2V5OiBLKTogYm9vbGVhbjtcblxuXHQvKipcblx0ICogUmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IHlpZWxkcyBlYWNoIGtleS92YWx1ZSBwYWlyIGFzIGFuIGFycmF5LlxuXHQgKlxuXHQgKiBAcmV0dXJuIEFuIGl0ZXJhdG9yIGZvciBlYWNoIGtleS92YWx1ZSBwYWlyIGluIHRoZSBpbnN0YW5jZS5cblx0ICovXG5cdGVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbSywgVl0+O1xuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBhIGdpdmVuIGZ1bmN0aW9uIGZvciBlYWNoIG1hcCBlbnRyeS4gVGhlIGZ1bmN0aW9uXG5cdCAqIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6IHRoZSBlbGVtZW50IHZhbHVlLCB0aGVcblx0ICogZWxlbWVudCBrZXksIGFuZCB0aGUgYXNzb2NpYXRlZCBNYXAgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBjYWxsYmFja2ZuIFRoZSBmdW5jdGlvbiB0byBleGVjdXRlIGZvciBlYWNoIG1hcCBlbnRyeSxcblx0ICogQHBhcmFtIHRoaXNBcmcgVGhlIHZhbHVlIHRvIHVzZSBmb3IgYHRoaXNgIGZvciBlYWNoIGV4ZWN1dGlvbiBvZiB0aGUgY2FsYmFja1xuXHQgKi9cblx0Zm9yRWFjaChjYWxsYmFja2ZuOiAodmFsdWU6IFYsIGtleTogSywgbWFwOiBNYXA8SywgVj4pID0+IHZvaWQsIHRoaXNBcmc/OiBhbnkpOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBrZXkuXG5cdCAqXG5cdCAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byBsb29rIHVwXG5cdCAqIEByZXR1cm4gVGhlIHZhbHVlIGlmIG9uZSBleGlzdHMgb3IgdW5kZWZpbmVkXG5cdCAqL1xuXHRnZXQoa2V5OiBLKTogViB8IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogUmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IHlpZWxkcyBlYWNoIGtleSBpbiB0aGUgbWFwLlxuXHQgKlxuXHQgKiBAcmV0dXJuIEFuIGl0ZXJhdG9yIGNvbnRhaW5pbmcgdGhlIGluc3RhbmNlJ3Mga2V5cy5cblx0ICovXG5cdGtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxLPjtcblxuXHQvKipcblx0ICogQ2hlY2tzIGZvciB0aGUgcHJlc2VuY2Ugb2YgYSBnaXZlbiBrZXkuXG5cdCAqXG5cdCAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byBjaGVjayBmb3Jcblx0ICogQHJldHVybiB0cnVlIGlmIHRoZSBrZXkgZXhpc3RzLCBmYWxzZSBpZiBpdCBkb2VzIG5vdFxuXHQgKi9cblx0aGFzKGtleTogSyk6IGJvb2xlYW47XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGtleS5cblx0ICpcblx0ICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGRlZmluZSBhIHZhbHVlIHRvXG5cdCAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduXG5cdCAqIEByZXR1cm4gVGhlIE1hcCBpbnN0YW5jZVxuXHQgKi9cblx0c2V0KGtleTogSywgdmFsdWU6IFYpOiB0aGlzO1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5IC8gdmFsdWUgcGFpcnMgaW4gdGhlIE1hcC5cblx0ICovXG5cdHJlYWRvbmx5IHNpemU6IG51bWJlcjtcblxuXHQvKipcblx0ICogUmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IHlpZWxkcyBlYWNoIHZhbHVlIGluIHRoZSBtYXAuXG5cdCAqXG5cdCAqIEByZXR1cm4gQW4gaXRlcmF0b3IgY29udGFpbmluZyB0aGUgaW5zdGFuY2UncyB2YWx1ZXMuXG5cdCAqL1xuXHR2YWx1ZXMoKTogSXRlcmFibGVJdGVyYXRvcjxWPjtcblxuXHQvKiogUmV0dXJucyBhbiBpdGVyYWJsZSBvZiBlbnRyaWVzIGluIHRoZSBtYXAuICovXG5cdFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0ssIFZdPjtcblxuXHRyZWFkb25seSBbU3ltYm9sLnRvU3RyaW5nVGFnXTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hcENvbnN0cnVjdG9yIHtcblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgTWFwXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0bmV3ICgpOiBNYXA8YW55LCBhbnk+O1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IE1hcFxuXHQgKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICpcblx0ICogQHBhcmFtIGl0ZXJhdG9yXG5cdCAqIEFycmF5IG9yIGl0ZXJhdG9yIGNvbnRhaW5pbmcgdHdvLWl0ZW0gdHVwbGVzIHVzZWQgdG8gaW5pdGlhbGx5IHBvcHVsYXRlIHRoZSBtYXAuXG5cdCAqIFRoZSBmaXJzdCBpdGVtIGluIGVhY2ggdHVwbGUgY29ycmVzcG9uZHMgdG8gdGhlIGtleSBvZiB0aGUgbWFwIGVudHJ5LlxuXHQgKiBUaGUgc2Vjb25kIGl0ZW0gY29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIG9mIHRoZSBtYXAgZW50cnkuXG5cdCAqL1xuXHRuZXcgPEssIFY+KGl0ZXJhdG9yPzogW0ssIFZdW10pOiBNYXA8SywgVj47XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgTWFwXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKlxuXHQgKiBAcGFyYW0gaXRlcmF0b3Jcblx0ICogQXJyYXkgb3IgaXRlcmF0b3IgY29udGFpbmluZyB0d28taXRlbSB0dXBsZXMgdXNlZCB0byBpbml0aWFsbHkgcG9wdWxhdGUgdGhlIG1hcC5cblx0ICogVGhlIGZpcnN0IGl0ZW0gaW4gZWFjaCB0dXBsZSBjb3JyZXNwb25kcyB0byB0aGUga2V5IG9mIHRoZSBtYXAgZW50cnkuXG5cdCAqIFRoZSBzZWNvbmQgaXRlbSBjb3JyZXNwb25kcyB0byB0aGUgdmFsdWUgb2YgdGhlIG1hcCBlbnRyeS5cblx0ICovXG5cdG5ldyA8SywgVj4oaXRlcmF0b3I6IEl0ZXJhYmxlPFtLLCBWXT4pOiBNYXA8SywgVj47XG5cblx0cmVhZG9ubHkgcHJvdG90eXBlOiBNYXA8YW55LCBhbnk+O1xuXG5cdHJlYWRvbmx5IFtTeW1ib2wuc3BlY2llc106IE1hcENvbnN0cnVjdG9yO1xufVxuXG5leHBvcnQgbGV0IE1hcDogTWFwQ29uc3RydWN0b3IgPSBnbG9iYWwuTWFwO1xuXG5pZiAoIWhhcygnZXM2LW1hcCcpKSB7XG5cdE1hcCA9IGNsYXNzIE1hcDxLLCBWPiB7XG5cdFx0cHJvdGVjdGVkIHJlYWRvbmx5IF9rZXlzOiBLW10gPSBbXTtcblx0XHRwcm90ZWN0ZWQgcmVhZG9ubHkgX3ZhbHVlczogVltdID0gW107XG5cblx0XHQvKipcblx0XHQgKiBBbiBhbHRlcm5hdGl2ZSB0byBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiB1c2luZyBPYmplY3QuaXNcblx0XHQgKiB0byBjaGVjayBmb3IgZXF1YWxpdHkuIFNlZSBodHRwOi8vbXpsLmxhLzF6dUtPMlZcblx0XHQgKi9cblx0XHRwcm90ZWN0ZWQgX2luZGV4T2ZLZXkoa2V5czogS1tdLCBrZXk6IEspOiBudW1iZXIge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKG9iamVjdElzKGtleXNbaV0sIGtleSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIC0xO1xuXHRcdH1cblxuXHRcdHN0YXRpYyBbU3ltYm9sLnNwZWNpZXNdID0gTWFwO1xuXG5cdFx0Y29uc3RydWN0b3IoaXRlcmFibGU/OiBBcnJheUxpa2U8W0ssIFZdPiB8IEl0ZXJhYmxlPFtLLCBWXT4pIHtcblx0XHRcdGlmIChpdGVyYWJsZSkge1xuXHRcdFx0XHRpZiAoaXNBcnJheUxpa2UoaXRlcmFibGUpKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBpdGVyYWJsZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0Y29uc3QgdmFsdWUgPSBpdGVyYWJsZVtpXTtcblx0XHRcdFx0XHRcdHRoaXMuc2V0KHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZvciAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcblx0XHRcdFx0XHRcdHRoaXMuc2V0KHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Z2V0IHNpemUoKTogbnVtYmVyIHtcblx0XHRcdHJldHVybiB0aGlzLl9rZXlzLmxlbmd0aDtcblx0XHR9XG5cblx0XHRjbGVhcigpOiB2b2lkIHtcblx0XHRcdHRoaXMuX2tleXMubGVuZ3RoID0gdGhpcy5fdmFsdWVzLmxlbmd0aCA9IDA7XG5cdFx0fVxuXG5cdFx0ZGVsZXRlKGtleTogSyk6IGJvb2xlYW4ge1xuXHRcdFx0Y29uc3QgaW5kZXggPSB0aGlzLl9pbmRleE9mS2V5KHRoaXMuX2tleXMsIGtleSk7XG5cdFx0XHRpZiAoaW5kZXggPCAwKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX2tleXMuc3BsaWNlKGluZGV4LCAxKTtcblx0XHRcdHRoaXMuX3ZhbHVlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0ZW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtLLCBWXT4ge1xuXHRcdFx0Y29uc3QgdmFsdWVzID0gdGhpcy5fa2V5cy5tYXAoKGtleTogSywgaTogbnVtYmVyKTogW0ssIFZdID0+IHtcblx0XHRcdFx0cmV0dXJuIFtrZXksIHRoaXMuX3ZhbHVlc1tpXV07XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIG5ldyBTaGltSXRlcmF0b3IodmFsdWVzKTtcblx0XHR9XG5cblx0XHRmb3JFYWNoKGNhbGxiYWNrOiAodmFsdWU6IFYsIGtleTogSywgbWFwSW5zdGFuY2U6IE1hcDxLLCBWPikgPT4gYW55LCBjb250ZXh0Pzoge30pIHtcblx0XHRcdGNvbnN0IGtleXMgPSB0aGlzLl9rZXlzO1xuXHRcdFx0Y29uc3QgdmFsdWVzID0gdGhpcy5fdmFsdWVzO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0Y2FsbGJhY2suY2FsbChjb250ZXh0LCB2YWx1ZXNbaV0sIGtleXNbaV0sIHRoaXMpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGdldChrZXk6IEspOiBWIHwgdW5kZWZpbmVkIHtcblx0XHRcdGNvbnN0IGluZGV4ID0gdGhpcy5faW5kZXhPZktleSh0aGlzLl9rZXlzLCBrZXkpO1xuXHRcdFx0cmV0dXJuIGluZGV4IDwgMCA/IHVuZGVmaW5lZCA6IHRoaXMuX3ZhbHVlc1tpbmRleF07XG5cdFx0fVxuXG5cdFx0aGFzKGtleTogSyk6IGJvb2xlYW4ge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2luZGV4T2ZLZXkodGhpcy5fa2V5cywga2V5KSA+IC0xO1xuXHRcdH1cblxuXHRcdGtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxLPiB7XG5cdFx0XHRyZXR1cm4gbmV3IFNoaW1JdGVyYXRvcih0aGlzLl9rZXlzKTtcblx0XHR9XG5cblx0XHRzZXQoa2V5OiBLLCB2YWx1ZTogVik6IE1hcDxLLCBWPiB7XG5cdFx0XHRsZXQgaW5kZXggPSB0aGlzLl9pbmRleE9mS2V5KHRoaXMuX2tleXMsIGtleSk7XG5cdFx0XHRpbmRleCA9IGluZGV4IDwgMCA/IHRoaXMuX2tleXMubGVuZ3RoIDogaW5kZXg7XG5cdFx0XHR0aGlzLl9rZXlzW2luZGV4XSA9IGtleTtcblx0XHRcdHRoaXMuX3ZhbHVlc1tpbmRleF0gPSB2YWx1ZTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdHZhbHVlcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFY+IHtcblx0XHRcdHJldHVybiBuZXcgU2hpbUl0ZXJhdG9yKHRoaXMuX3ZhbHVlcyk7XG5cdFx0fVxuXG5cdFx0W1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmFibGVJdGVyYXRvcjxbSywgVl0+IHtcblx0XHRcdHJldHVybiB0aGlzLmVudHJpZXMoKTtcblx0XHR9XG5cblx0XHRbU3ltYm9sLnRvU3RyaW5nVGFnXTogJ01hcCcgPSAnTWFwJztcblx0fTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgTWFwO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIE1hcC50cyIsImltcG9ydCB7IFRoZW5hYmxlIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xuaW1wb3J0IHsgcXVldWVNaWNyb1Rhc2sgfSBmcm9tICcuL3N1cHBvcnQvcXVldWUnO1xuaW1wb3J0IHsgSXRlcmFibGUgfSBmcm9tICcuL2l0ZXJhdG9yJztcbmltcG9ydCAnLi9TeW1ib2wnO1xuaW1wb3J0IGhhcyBmcm9tICcuL3N1cHBvcnQvaGFzJztcblxuLyoqXG4gKiBFeGVjdXRvciBpcyB0aGUgaW50ZXJmYWNlIGZvciBmdW5jdGlvbnMgdXNlZCB0byBpbml0aWFsaXplIGEgUHJvbWlzZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRvcjxUPiB7XG5cdC8qKlxuXHQgKiBUaGUgZXhlY3V0b3IgZm9yIHRoZSBwcm9taXNlXG5cdCAqXG5cdCAqIEBwYXJhbSByZXNvbHZlIFRoZSByZXNvbHZlciBjYWxsYmFjayBvZiB0aGUgcHJvbWlzZVxuXHQgKiBAcGFyYW0gcmVqZWN0IFRoZSByZWplY3RvciBjYWxsYmFjayBvZiB0aGUgcHJvbWlzZVxuXHQgKi9cblx0KHJlc29sdmU6ICh2YWx1ZT86IFQgfCBQcm9taXNlTGlrZTxUPikgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkKTogdm9pZDtcbn1cblxuZXhwb3J0IGxldCBTaGltUHJvbWlzZTogdHlwZW9mIFByb21pc2UgPSBnbG9iYWwuUHJvbWlzZTtcblxuZXhwb3J0IGNvbnN0IGlzVGhlbmFibGUgPSBmdW5jdGlvbiBpc1RoZW5hYmxlPFQ+KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBQcm9taXNlTGlrZTxUPiB7XG5cdHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn07XG5cbmlmICghaGFzKCdlczYtcHJvbWlzZScpKSB7XG5cdGNvbnN0IGVudW0gU3RhdGUge1xuXHRcdEZ1bGZpbGxlZCxcblx0XHRQZW5kaW5nLFxuXHRcdFJlamVjdGVkXG5cdH1cblxuXHRnbG9iYWwuUHJvbWlzZSA9IFNoaW1Qcm9taXNlID0gY2xhc3MgUHJvbWlzZTxUPiBpbXBsZW1lbnRzIFRoZW5hYmxlPFQ+IHtcblx0XHRzdGF0aWMgYWxsKGl0ZXJhYmxlOiBJdGVyYWJsZTxhbnkgfCBQcm9taXNlTGlrZTxhbnk+PiB8IChhbnkgfCBQcm9taXNlTGlrZTxhbnk+KVtdKTogUHJvbWlzZTxhbnk+IHtcblx0XHRcdHJldHVybiBuZXcgdGhpcyhmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdFx0Y29uc3QgdmFsdWVzOiBhbnlbXSA9IFtdO1xuXHRcdFx0XHRsZXQgY29tcGxldGUgPSAwO1xuXHRcdFx0XHRsZXQgdG90YWwgPSAwO1xuXHRcdFx0XHRsZXQgcG9wdWxhdGluZyA9IHRydWU7XG5cblx0XHRcdFx0ZnVuY3Rpb24gZnVsZmlsbChpbmRleDogbnVtYmVyLCB2YWx1ZTogYW55KTogdm9pZCB7XG5cdFx0XHRcdFx0dmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuXHRcdFx0XHRcdCsrY29tcGxldGU7XG5cdFx0XHRcdFx0ZmluaXNoKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmdW5jdGlvbiBmaW5pc2goKTogdm9pZCB7XG5cdFx0XHRcdFx0aWYgKHBvcHVsYXRpbmcgfHwgY29tcGxldGUgPCB0b3RhbCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXNvbHZlKHZhbHVlcyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmdW5jdGlvbiBwcm9jZXNzSXRlbShpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpOiB2b2lkIHtcblx0XHRcdFx0XHQrK3RvdGFsO1xuXHRcdFx0XHRcdGlmIChpc1RoZW5hYmxlKGl0ZW0pKSB7XG5cdFx0XHRcdFx0XHQvLyBJZiBhbiBpdGVtIFByb21pc2UgcmVqZWN0cywgdGhpcyBQcm9taXNlIGlzIGltbWVkaWF0ZWx5IHJlamVjdGVkIHdpdGggdGhlIGl0ZW1cblx0XHRcdFx0XHRcdC8vIFByb21pc2UncyByZWplY3Rpb24gZXJyb3IuXG5cdFx0XHRcdFx0XHRpdGVtLnRoZW4oZnVsZmlsbC5iaW5kKG51bGwsIGluZGV4KSwgcmVqZWN0KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0UHJvbWlzZS5yZXNvbHZlKGl0ZW0pLnRoZW4oZnVsZmlsbC5iaW5kKG51bGwsIGluZGV4KSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IGkgPSAwO1xuXHRcdFx0XHRmb3IgKGNvbnN0IHZhbHVlIG9mIGl0ZXJhYmxlKSB7XG5cdFx0XHRcdFx0cHJvY2Vzc0l0ZW0oaSwgdmFsdWUpO1xuXHRcdFx0XHRcdGkrKztcblx0XHRcdFx0fVxuXHRcdFx0XHRwb3B1bGF0aW5nID0gZmFsc2U7XG5cblx0XHRcdFx0ZmluaXNoKCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRzdGF0aWMgcmFjZTxUPihpdGVyYWJsZTogSXRlcmFibGU8VCB8IFByb21pc2VMaWtlPFQ+PiB8IChUIHwgUHJvbWlzZUxpa2U8VD4pW10pOiBQcm9taXNlPFRbXT4ge1xuXHRcdFx0cmV0dXJuIG5ldyB0aGlzKGZ1bmN0aW9uKHJlc29sdmU6ICh2YWx1ZT86IGFueSkgPT4gdm9pZCwgcmVqZWN0KSB7XG5cdFx0XHRcdGZvciAoY29uc3QgaXRlbSBvZiBpdGVyYWJsZSkge1xuXHRcdFx0XHRcdGlmIChpdGVtIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgYSBQcm9taXNlIGl0ZW0gcmVqZWN0cywgdGhpcyBQcm9taXNlIGlzIGltbWVkaWF0ZWx5IHJlamVjdGVkIHdpdGggdGhlIGl0ZW1cblx0XHRcdFx0XHRcdC8vIFByb21pc2UncyByZWplY3Rpb24gZXJyb3IuXG5cdFx0XHRcdFx0XHRpdGVtLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0UHJvbWlzZS5yZXNvbHZlKGl0ZW0pLnRoZW4ocmVzb2x2ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRzdGF0aWMgcmVqZWN0KHJlYXNvbj86IGFueSk6IFByb21pc2U8bmV2ZXI+IHtcblx0XHRcdHJldHVybiBuZXcgdGhpcyhmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdFx0cmVqZWN0KHJlYXNvbik7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRzdGF0aWMgcmVzb2x2ZSgpOiBQcm9taXNlPHZvaWQ+O1xuXHRcdHN0YXRpYyByZXNvbHZlPFQ+KHZhbHVlOiBUIHwgUHJvbWlzZUxpa2U8VD4pOiBQcm9taXNlPFQ+O1xuXHRcdHN0YXRpYyByZXNvbHZlPFQ+KHZhbHVlPzogYW55KTogUHJvbWlzZTxUPiB7XG5cdFx0XHRyZXR1cm4gbmV3IHRoaXMoZnVuY3Rpb24ocmVzb2x2ZSkge1xuXHRcdFx0XHRyZXNvbHZlKDxUPnZhbHVlKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHN0YXRpYyBbU3ltYm9sLnNwZWNpZXNdOiBQcm9taXNlQ29uc3RydWN0b3IgPSBTaGltUHJvbWlzZSBhcyBQcm9taXNlQ29uc3RydWN0b3I7XG5cblx0XHQvKipcblx0XHQgKiBDcmVhdGVzIGEgbmV3IFByb21pc2UuXG5cdFx0ICpcblx0XHQgKiBAY29uc3RydWN0b3Jcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSBleGVjdXRvclxuXHRcdCAqIFRoZSBleGVjdXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgaW1tZWRpYXRlbHkgd2hlbiB0aGUgUHJvbWlzZSBpcyBpbnN0YW50aWF0ZWQuIEl0IGlzIHJlc3BvbnNpYmxlIGZvclxuXHRcdCAqIHN0YXJ0aW5nIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoZW4gaXQgaXMgaW52b2tlZC5cblx0XHQgKlxuXHRcdCAqIFRoZSBleGVjdXRvciBtdXN0IGNhbGwgZWl0aGVyIHRoZSBwYXNzZWQgYHJlc29sdmVgIGZ1bmN0aW9uIHdoZW4gdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZFxuXHRcdCAqIHN1Y2Nlc3NmdWxseSwgb3IgdGhlIGByZWplY3RgIGZ1bmN0aW9uIHdoZW4gdGhlIG9wZXJhdGlvbiBmYWlscy5cblx0XHQgKi9cblx0XHRjb25zdHJ1Y3RvcihleGVjdXRvcjogRXhlY3V0b3I8VD4pIHtcblx0XHRcdC8qKlxuXHRcdFx0ICogSWYgdHJ1ZSwgdGhlIHJlc29sdXRpb24gb2YgdGhpcyBwcm9taXNlIGlzIGNoYWluZWQgKFwibG9ja2VkIGluXCIpIHRvIGFub3RoZXIgcHJvbWlzZS5cblx0XHRcdCAqL1xuXHRcdFx0bGV0IGlzQ2hhaW5lZCA9IGZhbHNlO1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIFdoZXRoZXIgb3Igbm90IHRoaXMgcHJvbWlzZSBpcyBpbiBhIHJlc29sdmVkIHN0YXRlLlxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBpc1Jlc29sdmVkID0gKCk6IGJvb2xlYW4gPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5zdGF0ZSAhPT0gU3RhdGUuUGVuZGluZyB8fCBpc0NoYWluZWQ7XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIENhbGxiYWNrcyB0aGF0IHNob3VsZCBiZSBpbnZva2VkIG9uY2UgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC5cblx0XHRcdCAqL1xuXHRcdFx0bGV0IGNhbGxiYWNrczogbnVsbCB8IChBcnJheTwoKSA9PiB2b2lkPikgPSBbXTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBJbml0aWFsbHkgcHVzaGVzIGNhbGxiYWNrcyBvbnRvIGEgcXVldWUgZm9yIGV4ZWN1dGlvbiBvbmNlIHRoaXMgcHJvbWlzZSBzZXR0bGVzLiBBZnRlciB0aGUgcHJvbWlzZSBzZXR0bGVzLFxuXHRcdFx0ICogZW5xdWV1ZXMgY2FsbGJhY2tzIGZvciBleGVjdXRpb24gb24gdGhlIG5leHQgZXZlbnQgbG9vcCB0dXJuLlxuXHRcdFx0ICovXG5cdFx0XHRsZXQgd2hlbkZpbmlzaGVkID0gZnVuY3Rpb24oY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcblx0XHRcdFx0aWYgKGNhbGxiYWNrcykge1xuXHRcdFx0XHRcdGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBTZXR0bGVzIHRoaXMgcHJvbWlzZS5cblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0gbmV3U3RhdGUgVGhlIHJlc29sdmVkIHN0YXRlIGZvciB0aGlzIHByb21pc2UuXG5cdFx0XHQgKiBAcGFyYW0ge1R8YW55fSB2YWx1ZSBUaGUgcmVzb2x2ZWQgdmFsdWUgZm9yIHRoaXMgcHJvbWlzZS5cblx0XHRcdCAqL1xuXHRcdFx0Y29uc3Qgc2V0dGxlID0gKG5ld1N0YXRlOiBTdGF0ZSwgdmFsdWU6IGFueSk6IHZvaWQgPT4ge1xuXHRcdFx0XHQvLyBBIHByb21pc2UgY2FuIG9ubHkgYmUgc2V0dGxlZCBvbmNlLlxuXHRcdFx0XHRpZiAodGhpcy5zdGF0ZSAhPT0gU3RhdGUuUGVuZGluZykge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuc3RhdGUgPSBuZXdTdGF0ZTtcblx0XHRcdFx0dGhpcy5yZXNvbHZlZFZhbHVlID0gdmFsdWU7XG5cdFx0XHRcdHdoZW5GaW5pc2hlZCA9IHF1ZXVlTWljcm9UYXNrO1xuXG5cdFx0XHRcdC8vIE9ubHkgZW5xdWV1ZSBhIGNhbGxiYWNrIHJ1bm5lciBpZiB0aGVyZSBhcmUgY2FsbGJhY2tzIHNvIHRoYXQgaW5pdGlhbGx5IGZ1bGZpbGxlZCBQcm9taXNlcyBkb24ndCBoYXZlIHRvXG5cdFx0XHRcdC8vIHdhaXQgYW4gZXh0cmEgdHVybi5cblx0XHRcdFx0aWYgKGNhbGxiYWNrcyAmJiBjYWxsYmFja3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdHF1ZXVlTWljcm9UYXNrKGZ1bmN0aW9uKCk6IHZvaWQge1xuXHRcdFx0XHRcdFx0aWYgKGNhbGxiYWNrcykge1xuXHRcdFx0XHRcdFx0XHRsZXQgY291bnQgPSBjYWxsYmFja3MubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcblx0XHRcdFx0XHRcdFx0XHRjYWxsYmFja3NbaV0uY2FsbChudWxsKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRjYWxsYmFja3MgPSBudWxsO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIFJlc29sdmVzIHRoaXMgcHJvbWlzZS5cblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0gbmV3U3RhdGUgVGhlIHJlc29sdmVkIHN0YXRlIGZvciB0aGlzIHByb21pc2UuXG5cdFx0XHQgKiBAcGFyYW0ge1R8YW55fSB2YWx1ZSBUaGUgcmVzb2x2ZWQgdmFsdWUgZm9yIHRoaXMgcHJvbWlzZS5cblx0XHRcdCAqL1xuXHRcdFx0Y29uc3QgcmVzb2x2ZSA9IChuZXdTdGF0ZTogU3RhdGUsIHZhbHVlOiBhbnkpOiB2b2lkID0+IHtcblx0XHRcdFx0aWYgKGlzUmVzb2x2ZWQoKSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChpc1RoZW5hYmxlKHZhbHVlKSkge1xuXHRcdFx0XHRcdHZhbHVlLnRoZW4oc2V0dGxlLmJpbmQobnVsbCwgU3RhdGUuRnVsZmlsbGVkKSwgc2V0dGxlLmJpbmQobnVsbCwgU3RhdGUuUmVqZWN0ZWQpKTtcblx0XHRcdFx0XHRpc0NoYWluZWQgPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNldHRsZShuZXdTdGF0ZSwgdmFsdWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHR0aGlzLnRoZW4gPSA8VFJlc3VsdDEgPSBULCBUUmVzdWx0MiA9IG5ldmVyPihcblx0XHRcdFx0b25GdWxmaWxsZWQ/OiAoKHZhbHVlOiBUKSA9PiBUUmVzdWx0MSB8IFByb21pc2VMaWtlPFRSZXN1bHQxPikgfCB1bmRlZmluZWQgfCBudWxsLFxuXHRcdFx0XHRvblJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgdW5kZWZpbmVkIHwgbnVsbFxuXHRcdFx0KTogUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiA9PiB7XG5cdFx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdFx0Ly8gd2hlbkZpbmlzaGVkIGluaXRpYWxseSBxdWV1ZXMgdXAgY2FsbGJhY2tzIGZvciBleGVjdXRpb24gYWZ0ZXIgdGhlIHByb21pc2UgaGFzIHNldHRsZWQuIE9uY2UgdGhlXG5cdFx0XHRcdFx0Ly8gcHJvbWlzZSBoYXMgc2V0dGxlZCwgd2hlbkZpbmlzaGVkIHdpbGwgc2NoZWR1bGUgY2FsbGJhY2tzIGZvciBleGVjdXRpb24gb24gdGhlIG5leHQgdHVybiB0aHJvdWdoIHRoZVxuXHRcdFx0XHRcdC8vIGV2ZW50IGxvb3AuXG5cdFx0XHRcdFx0d2hlbkZpbmlzaGVkKCgpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGNhbGxiYWNrOiAoKHZhbHVlPzogYW55KSA9PiBhbnkpIHwgdW5kZWZpbmVkIHwgbnVsbCA9XG5cdFx0XHRcdFx0XHRcdHRoaXMuc3RhdGUgPT09IFN0YXRlLlJlamVjdGVkID8gb25SZWplY3RlZCA6IG9uRnVsZmlsbGVkO1xuXG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZShjYWxsYmFjayh0aGlzLnJlc29sdmVkVmFsdWUpKTtcblx0XHRcdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09IFN0YXRlLlJlamVjdGVkKSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdCh0aGlzLnJlc29sdmVkVmFsdWUpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZSh0aGlzLnJlc29sdmVkVmFsdWUpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH07XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGV4ZWN1dG9yKHJlc29sdmUuYmluZChudWxsLCBTdGF0ZS5GdWxmaWxsZWQpLCByZXNvbHZlLmJpbmQobnVsbCwgU3RhdGUuUmVqZWN0ZWQpKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdHNldHRsZShTdGF0ZS5SZWplY3RlZCwgZXJyb3IpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNhdGNoPFRSZXN1bHQgPSBuZXZlcj4oXG5cdFx0XHRvblJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdCB8IFByb21pc2VMaWtlPFRSZXN1bHQ+KSB8IHVuZGVmaW5lZCB8IG51bGxcblx0XHQpOiBQcm9taXNlPFQgfCBUUmVzdWx0PiB7XG5cdFx0XHRyZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhpcyBwcm9taXNlLlxuXHRcdCAqL1xuXHRcdHByaXZhdGUgc3RhdGUgPSBTdGF0ZS5QZW5kaW5nO1xuXG5cdFx0LyoqXG5cdFx0ICogVGhlIHJlc29sdmVkIHZhbHVlIGZvciB0aGlzIHByb21pc2UuXG5cdFx0ICpcblx0XHQgKiBAdHlwZSB7VHxhbnl9XG5cdFx0ICovXG5cdFx0cHJpdmF0ZSByZXNvbHZlZFZhbHVlOiBhbnk7XG5cblx0XHR0aGVuOiA8VFJlc3VsdDEgPSBULCBUUmVzdWx0MiA9IG5ldmVyPihcblx0XHRcdG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogVCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgdW5kZWZpbmVkIHwgbnVsbCxcblx0XHRcdG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCB1bmRlZmluZWQgfCBudWxsXG5cdFx0KSA9PiBQcm9taXNlPFRSZXN1bHQxIHwgVFJlc3VsdDI+O1xuXG5cdFx0W1N5bWJvbC50b1N0cmluZ1RhZ106ICdQcm9taXNlJyA9ICdQcm9taXNlJztcblx0fTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgU2hpbVByb21pc2U7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gUHJvbWlzZS50cyIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xuaW1wb3J0IHsgaXNBcnJheUxpa2UsIEl0ZXJhYmxlLCBJdGVyYWJsZUl0ZXJhdG9yLCBTaGltSXRlcmF0b3IgfSBmcm9tICcuL2l0ZXJhdG9yJztcbmltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XG5pbXBvcnQgJy4vU3ltYm9sJztcblxuZXhwb3J0IGludGVyZmFjZSBTZXQ8VD4ge1xuXHQvKipcblx0ICogQWRkcyBhIGB2YWx1ZWAgdG8gdGhlIGBTZXRgXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gYWRkIHRvIHRoZSBzZXRcblx0ICogQHJldHVybnMgVGhlIGluc3RhbmNlIG9mIHRoZSBgU2V0YFxuXHQgKi9cblx0YWRkKHZhbHVlOiBUKTogdGhpcztcblxuXHQvKipcblx0ICogUmVtb3ZlcyBhbGwgdGhlIHZhbHVlcyBmcm9tIHRoZSBgU2V0YC5cblx0ICovXG5cdGNsZWFyKCk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYSBgdmFsdWVgIGZyb20gdGhlIHNldFxuXHQgKlxuXHQgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHJlbW92ZWRcblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZSB3YXMgcmVtb3ZlZFxuXHQgKi9cblx0ZGVsZXRlKHZhbHVlOiBUKTogYm9vbGVhbjtcblxuXHQvKipcblx0ICogUmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IHlpZWxkcyBlYWNoIGVudHJ5LlxuXHQgKlxuXHQgKiBAcmV0dXJuIEFuIGl0ZXJhdG9yIGZvciBlYWNoIGtleS92YWx1ZSBwYWlyIGluIHRoZSBpbnN0YW5jZS5cblx0ICovXG5cdGVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbVCwgVF0+O1xuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBhIGdpdmVuIGZ1bmN0aW9uIGZvciBlYWNoIHNldCBlbnRyeS4gVGhlIGZ1bmN0aW9uXG5cdCAqIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6IHRoZSBlbGVtZW50IHZhbHVlLCB0aGVcblx0ICogZWxlbWVudCBrZXksIGFuZCB0aGUgYXNzb2NpYXRlZCBgU2V0YCBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIGNhbGxiYWNrZm4gVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgZm9yIGVhY2ggbWFwIGVudHJ5LFxuXHQgKiBAcGFyYW0gdGhpc0FyZyBUaGUgdmFsdWUgdG8gdXNlIGZvciBgdGhpc2AgZm9yIGVhY2ggZXhlY3V0aW9uIG9mIHRoZSBjYWxiYWNrXG5cdCAqL1xuXHRmb3JFYWNoKGNhbGxiYWNrZm46ICh2YWx1ZTogVCwgdmFsdWUyOiBULCBzZXQ6IFNldDxUPikgPT4gdm9pZCwgdGhpc0FyZz86IGFueSk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIElkZW50aWZpZXMgaWYgYSB2YWx1ZSBpcyBwYXJ0IG9mIHRoZSBzZXQuXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2tcblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZSBpcyBwYXJ0IG9mIHRoZSBzZXQgb3RoZXJ3aXNlIGBmYWxzZWBcblx0ICovXG5cdGhhcyh2YWx1ZTogVCk6IGJvb2xlYW47XG5cblx0LyoqXG5cdCAqIERlc3BpdGUgaXRzIG5hbWUsIHJldHVybnMgYW4gaXRlcmFibGUgb2YgdGhlIHZhbHVlcyBpbiB0aGUgc2V0LFxuXHQgKi9cblx0a2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+O1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdmFsdWVzIGluIHRoZSBgU2V0YC5cblx0ICovXG5cdHJlYWRvbmx5IHNpemU6IG51bWJlcjtcblxuXHQvKipcblx0ICogUmV0dXJucyBhbiBpdGVyYWJsZSBvZiB2YWx1ZXMgaW4gdGhlIHNldC5cblx0ICovXG5cdHZhbHVlcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+O1xuXG5cdC8qKiBJdGVyYXRlcyBvdmVyIHZhbHVlcyBpbiB0aGUgc2V0LiAqL1xuXHRbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+O1xuXG5cdHJlYWRvbmx5IFtTeW1ib2wudG9TdHJpbmdUYWddOiAnU2V0Jztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXRDb25zdHJ1Y3RvciB7XG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IFNldFxuXHQgKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdG5ldyAoKTogU2V0PGFueT47XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgU2V0XG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKlxuXHQgKiBAcGFyYW0gaXRlcmF0b3IgVGhlIGl0ZXJhYmxlIHN0cnVjdHVyZSB0byBpbml0aWFsaXplIHRoZSBzZXQgd2l0aFxuXHQgKi9cblx0bmV3IDxUPihpdGVyYXRvcj86IFRbXSk6IFNldDxUPjtcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBTZXRcblx0ICpcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqXG5cdCAqIEBwYXJhbSBpdGVyYXRvciBUaGUgaXRlcmFibGUgc3RydWN0dXJlIHRvIGluaXRpYWxpemUgdGhlIHNldCB3aXRoXG5cdCAqL1xuXHRuZXcgPFQ+KGl0ZXJhdG9yOiBJdGVyYWJsZTxUPik6IFNldDxUPjtcblxuXHRyZWFkb25seSBwcm90b3R5cGU6IFNldDxhbnk+O1xufVxuXG5leHBvcnQgbGV0IFNldDogU2V0Q29uc3RydWN0b3IgPSBnbG9iYWwuU2V0O1xuXG5pZiAoIWhhcygnZXM2LXNldCcpKSB7XG5cdFNldCA9IGNsYXNzIFNldDxUPiB7XG5cdFx0cHJpdmF0ZSByZWFkb25seSBfc2V0RGF0YTogVFtdID0gW107XG5cblx0XHRzdGF0aWMgW1N5bWJvbC5zcGVjaWVzXSA9IFNldDtcblxuXHRcdGNvbnN0cnVjdG9yKGl0ZXJhYmxlPzogQXJyYXlMaWtlPFQ+IHwgSXRlcmFibGU8VD4pIHtcblx0XHRcdGlmIChpdGVyYWJsZSkge1xuXHRcdFx0XHRpZiAoaXNBcnJheUxpa2UoaXRlcmFibGUpKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBpdGVyYWJsZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0dGhpcy5hZGQoaXRlcmFibGVbaV0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHZhbHVlIG9mIGl0ZXJhYmxlKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmFkZCh2YWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0YWRkKHZhbHVlOiBUKTogdGhpcyB7XG5cdFx0XHRpZiAodGhpcy5oYXModmFsdWUpKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fc2V0RGF0YS5wdXNoKHZhbHVlKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGNsZWFyKCk6IHZvaWQge1xuXHRcdFx0dGhpcy5fc2V0RGF0YS5sZW5ndGggPSAwO1xuXHRcdH1cblxuXHRcdGRlbGV0ZSh2YWx1ZTogVCk6IGJvb2xlYW4ge1xuXHRcdFx0Y29uc3QgaWR4ID0gdGhpcy5fc2V0RGF0YS5pbmRleE9mKHZhbHVlKTtcblx0XHRcdGlmIChpZHggPT09IC0xKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX3NldERhdGEuc3BsaWNlKGlkeCwgMSk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRlbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W1QsIFRdPiB7XG5cdFx0XHRyZXR1cm4gbmV3IFNoaW1JdGVyYXRvcjxbYW55LCBhbnldPih0aGlzLl9zZXREYXRhLm1hcDxbYW55LCBhbnldPigodmFsdWUpID0+IFt2YWx1ZSwgdmFsdWVdKSk7XG5cdFx0fVxuXG5cdFx0Zm9yRWFjaChjYWxsYmFja2ZuOiAodmFsdWU6IFQsIGluZGV4OiBULCBzZXQ6IFNldDxUPikgPT4gdm9pZCwgdGhpc0FyZz86IGFueSk6IHZvaWQge1xuXHRcdFx0Y29uc3QgaXRlcmF0b3IgPSB0aGlzLnZhbHVlcygpO1xuXHRcdFx0bGV0IHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcblx0XHRcdHdoaWxlICghcmVzdWx0LmRvbmUpIHtcblx0XHRcdFx0Y2FsbGJhY2tmbi5jYWxsKHRoaXNBcmcsIHJlc3VsdC52YWx1ZSwgcmVzdWx0LnZhbHVlLCB0aGlzKTtcblx0XHRcdFx0cmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGhhcyh2YWx1ZTogVCk6IGJvb2xlYW4ge1xuXHRcdFx0cmV0dXJuIHRoaXMuX3NldERhdGEuaW5kZXhPZih2YWx1ZSkgPiAtMTtcblx0XHR9XG5cblx0XHRrZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8VD4ge1xuXHRcdFx0cmV0dXJuIG5ldyBTaGltSXRlcmF0b3IodGhpcy5fc2V0RGF0YSk7XG5cdFx0fVxuXG5cdFx0Z2V0IHNpemUoKTogbnVtYmVyIHtcblx0XHRcdHJldHVybiB0aGlzLl9zZXREYXRhLmxlbmd0aDtcblx0XHR9XG5cblx0XHR2YWx1ZXMoKTogSXRlcmFibGVJdGVyYXRvcjxUPiB7XG5cdFx0XHRyZXR1cm4gbmV3IFNoaW1JdGVyYXRvcih0aGlzLl9zZXREYXRhKTtcblx0XHR9XG5cblx0XHRbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcblx0XHRcdHJldHVybiBuZXcgU2hpbUl0ZXJhdG9yKHRoaXMuX3NldERhdGEpO1xuXHRcdH1cblxuXHRcdFtTeW1ib2wudG9TdHJpbmdUYWddOiAnU2V0JyA9ICdTZXQnO1xuXHR9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBTZXQ7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gU2V0LnRzIiwiaW1wb3J0IGhhcyBmcm9tICcuL3N1cHBvcnQvaGFzJztcbmltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xuaW1wb3J0IHsgZ2V0VmFsdWVEZXNjcmlwdG9yIH0gZnJvbSAnLi9zdXBwb3J0L3V0aWwnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG5cdGludGVyZmFjZSBTeW1ib2xDb25zdHJ1Y3RvciB7XG5cdFx0b2JzZXJ2YWJsZTogc3ltYm9sO1xuXHR9XG59XG5cbmV4cG9ydCBsZXQgU3ltYm9sOiBTeW1ib2xDb25zdHJ1Y3RvciA9IGdsb2JhbC5TeW1ib2w7XG5cbmlmICghaGFzKCdlczYtc3ltYm9sJykpIHtcblx0LyoqXG5cdCAqIFRocm93cyBpZiB0aGUgdmFsdWUgaXMgbm90IGEgc3ltYm9sLCB1c2VkIGludGVybmFsbHkgd2l0aGluIHRoZSBTaGltXG5cdCAqIEBwYXJhbSAge2FueX0gICAgdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrXG5cdCAqIEByZXR1cm4ge3N5bWJvbH0gICAgICAgUmV0dXJucyB0aGUgc3ltYm9sIG9yIHRocm93c1xuXHQgKi9cblx0Y29uc3QgdmFsaWRhdGVTeW1ib2wgPSBmdW5jdGlvbiB2YWxpZGF0ZVN5bWJvbCh2YWx1ZTogYW55KTogc3ltYm9sIHtcblx0XHRpZiAoIWlzU3ltYm9sKHZhbHVlKSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcih2YWx1ZSArICcgaXMgbm90IGEgc3ltYm9sJyk7XG5cdFx0fVxuXHRcdHJldHVybiB2YWx1ZTtcblx0fTtcblxuXHRjb25zdCBkZWZpbmVQcm9wZXJ0aWVzID0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXM7XG5cdGNvbnN0IGRlZmluZVByb3BlcnR5OiAoXG5cdFx0bzogYW55LFxuXHRcdHA6IHN0cmluZyB8IHN5bWJvbCxcblx0XHRhdHRyaWJ1dGVzOiBQcm9wZXJ0eURlc2NyaXB0b3IgJiBUaGlzVHlwZTxhbnk+XG5cdCkgPT4gYW55ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5IGFzIGFueTtcblx0Y29uc3QgY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcblxuXHRjb25zdCBvYmpQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuXG5cdGNvbnN0IGdsb2JhbFN5bWJvbHM6IHsgW2tleTogc3RyaW5nXTogc3ltYm9sIH0gPSB7fTtcblxuXHRjb25zdCBnZXRTeW1ib2xOYW1lID0gKGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGNyZWF0ZWQgPSBjcmVhdGUobnVsbCk7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uKGRlc2M6IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB7XG5cdFx0XHRsZXQgcG9zdGZpeCA9IDA7XG5cdFx0XHRsZXQgbmFtZTogc3RyaW5nO1xuXHRcdFx0d2hpbGUgKGNyZWF0ZWRbU3RyaW5nKGRlc2MpICsgKHBvc3RmaXggfHwgJycpXSkge1xuXHRcdFx0XHQrK3Bvc3RmaXg7XG5cdFx0XHR9XG5cdFx0XHRkZXNjICs9IFN0cmluZyhwb3N0Zml4IHx8ICcnKTtcblx0XHRcdGNyZWF0ZWRbZGVzY10gPSB0cnVlO1xuXHRcdFx0bmFtZSA9ICdAQCcgKyBkZXNjO1xuXG5cdFx0XHQvLyBGSVhNRTogVGVtcG9yYXJ5IGd1YXJkIHVudGlsIHRoZSBkdXBsaWNhdGUgZXhlY3V0aW9uIHdoZW4gdGVzdGluZyBjYW4gYmVcblx0XHRcdC8vIHBpbm5lZCBkb3duLlxuXHRcdFx0aWYgKCFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9ialByb3RvdHlwZSwgbmFtZSkpIHtcblx0XHRcdFx0ZGVmaW5lUHJvcGVydHkob2JqUHJvdG90eXBlLCBuYW1lLCB7XG5cdFx0XHRcdFx0c2V0OiBmdW5jdGlvbih0aGlzOiBTeW1ib2wsIHZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRcdGRlZmluZVByb3BlcnR5KHRoaXMsIG5hbWUsIGdldFZhbHVlRGVzY3JpcHRvcih2YWx1ZSkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBuYW1lO1xuXHRcdH07XG5cdH0pKCk7XG5cblx0Y29uc3QgSW50ZXJuYWxTeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2wodGhpczogYW55LCBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bWJlcik6IHN5bWJvbCB7XG5cdFx0aWYgKHRoaXMgaW5zdGFuY2VvZiBJbnRlcm5hbFN5bWJvbCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignVHlwZUVycm9yOiBTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3InKTtcblx0XHR9XG5cdFx0cmV0dXJuIFN5bWJvbChkZXNjcmlwdGlvbik7XG5cdH07XG5cblx0U3ltYm9sID0gZ2xvYmFsLlN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbCh0aGlzOiBTeW1ib2wsIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVtYmVyKTogc3ltYm9sIHtcblx0XHRpZiAodGhpcyBpbnN0YW5jZW9mIFN5bWJvbCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignVHlwZUVycm9yOiBTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3InKTtcblx0XHR9XG5cdFx0Y29uc3Qgc3ltID0gT2JqZWN0LmNyZWF0ZShJbnRlcm5hbFN5bWJvbC5wcm90b3R5cGUpO1xuXHRcdGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCA/ICcnIDogU3RyaW5nKGRlc2NyaXB0aW9uKTtcblx0XHRyZXR1cm4gZGVmaW5lUHJvcGVydGllcyhzeW0sIHtcblx0XHRcdF9fZGVzY3JpcHRpb25fXzogZ2V0VmFsdWVEZXNjcmlwdG9yKGRlc2NyaXB0aW9uKSxcblx0XHRcdF9fbmFtZV9fOiBnZXRWYWx1ZURlc2NyaXB0b3IoZ2V0U3ltYm9sTmFtZShkZXNjcmlwdGlvbikpXG5cdFx0fSk7XG5cdH0gYXMgU3ltYm9sQ29uc3RydWN0b3I7XG5cblx0LyogRGVjb3JhdGUgdGhlIFN5bWJvbCBmdW5jdGlvbiB3aXRoIHRoZSBhcHByb3ByaWF0ZSBwcm9wZXJ0aWVzICovXG5cdGRlZmluZVByb3BlcnR5KFxuXHRcdFN5bWJvbCxcblx0XHQnZm9yJyxcblx0XHRnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24oa2V5OiBzdHJpbmcpOiBzeW1ib2wge1xuXHRcdFx0aWYgKGdsb2JhbFN5bWJvbHNba2V5XSkge1xuXHRcdFx0XHRyZXR1cm4gZ2xvYmFsU3ltYm9sc1trZXldO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIChnbG9iYWxTeW1ib2xzW2tleV0gPSBTeW1ib2woU3RyaW5nKGtleSkpKTtcblx0XHR9KVxuXHQpO1xuXHRkZWZpbmVQcm9wZXJ0aWVzKFN5bWJvbCwge1xuXHRcdGtleUZvcjogZ2V0VmFsdWVEZXNjcmlwdG9yKGZ1bmN0aW9uKHN5bTogc3ltYm9sKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRcdGxldCBrZXk6IHN0cmluZztcblx0XHRcdHZhbGlkYXRlU3ltYm9sKHN5bSk7XG5cdFx0XHRmb3IgKGtleSBpbiBnbG9iYWxTeW1ib2xzKSB7XG5cdFx0XHRcdGlmIChnbG9iYWxTeW1ib2xzW2tleV0gPT09IHN5bSkge1xuXHRcdFx0XHRcdHJldHVybiBrZXk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KSxcblx0XHRoYXNJbnN0YW5jZTogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ2hhc0luc3RhbmNlJyksIGZhbHNlLCBmYWxzZSksXG5cdFx0aXNDb25jYXRTcHJlYWRhYmxlOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignaXNDb25jYXRTcHJlYWRhYmxlJyksIGZhbHNlLCBmYWxzZSksXG5cdFx0aXRlcmF0b3I6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdpdGVyYXRvcicpLCBmYWxzZSwgZmFsc2UpLFxuXHRcdG1hdGNoOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignbWF0Y2gnKSwgZmFsc2UsIGZhbHNlKSxcblx0XHRvYnNlcnZhYmxlOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignb2JzZXJ2YWJsZScpLCBmYWxzZSwgZmFsc2UpLFxuXHRcdHJlcGxhY2U6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdyZXBsYWNlJyksIGZhbHNlLCBmYWxzZSksXG5cdFx0c2VhcmNoOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignc2VhcmNoJyksIGZhbHNlLCBmYWxzZSksXG5cdFx0c3BlY2llczogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3NwZWNpZXMnKSwgZmFsc2UsIGZhbHNlKSxcblx0XHRzcGxpdDogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3NwbGl0JyksIGZhbHNlLCBmYWxzZSksXG5cdFx0dG9QcmltaXRpdmU6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCd0b1ByaW1pdGl2ZScpLCBmYWxzZSwgZmFsc2UpLFxuXHRcdHRvU3RyaW5nVGFnOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcigndG9TdHJpbmdUYWcnKSwgZmFsc2UsIGZhbHNlKSxcblx0XHR1bnNjb3BhYmxlczogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3Vuc2NvcGFibGVzJyksIGZhbHNlLCBmYWxzZSlcblx0fSk7XG5cblx0LyogRGVjb3JhdGUgdGhlIEludGVybmFsU3ltYm9sIG9iamVjdCAqL1xuXHRkZWZpbmVQcm9wZXJ0aWVzKEludGVybmFsU3ltYm9sLnByb3RvdHlwZSwge1xuXHRcdGNvbnN0cnVjdG9yOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sKSxcblx0XHR0b1N0cmluZzogZ2V0VmFsdWVEZXNjcmlwdG9yKFxuXHRcdFx0ZnVuY3Rpb24odGhpczogeyBfX25hbWVfXzogc3RyaW5nIH0pIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX19uYW1lX187XG5cdFx0XHR9LFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHRmYWxzZVxuXHRcdClcblx0fSk7XG5cblx0LyogRGVjb3JhdGUgdGhlIFN5bWJvbC5wcm90b3R5cGUgKi9cblx0ZGVmaW5lUHJvcGVydGllcyhTeW1ib2wucHJvdG90eXBlLCB7XG5cdFx0dG9TdHJpbmc6IGdldFZhbHVlRGVzY3JpcHRvcihmdW5jdGlvbih0aGlzOiBTeW1ib2wpIHtcblx0XHRcdHJldHVybiAnU3ltYm9sICgnICsgKDxhbnk+dmFsaWRhdGVTeW1ib2wodGhpcykpLl9fZGVzY3JpcHRpb25fXyArICcpJztcblx0XHR9KSxcblx0XHR2YWx1ZU9mOiBnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24odGhpczogU3ltYm9sKSB7XG5cdFx0XHRyZXR1cm4gdmFsaWRhdGVTeW1ib2wodGhpcyk7XG5cdFx0fSlcblx0fSk7XG5cblx0ZGVmaW5lUHJvcGVydHkoXG5cdFx0U3ltYm9sLnByb3RvdHlwZSxcblx0XHRTeW1ib2wudG9QcmltaXRpdmUsXG5cdFx0Z2V0VmFsdWVEZXNjcmlwdG9yKGZ1bmN0aW9uKHRoaXM6IFN5bWJvbCkge1xuXHRcdFx0cmV0dXJuIHZhbGlkYXRlU3ltYm9sKHRoaXMpO1xuXHRcdH0pXG5cdCk7XG5cdGRlZmluZVByb3BlcnR5KFN5bWJvbC5wcm90b3R5cGUsIFN5bWJvbC50b1N0cmluZ1RhZywgZ2V0VmFsdWVEZXNjcmlwdG9yKCdTeW1ib2wnLCBmYWxzZSwgZmFsc2UsIHRydWUpKTtcblxuXHRkZWZpbmVQcm9wZXJ0eShcblx0XHRJbnRlcm5hbFN5bWJvbC5wcm90b3R5cGUsXG5cdFx0U3ltYm9sLnRvUHJpbWl0aXZlLFxuXHRcdGdldFZhbHVlRGVzY3JpcHRvcigoPGFueT5TeW1ib2wpLnByb3RvdHlwZVtTeW1ib2wudG9QcmltaXRpdmVdLCBmYWxzZSwgZmFsc2UsIHRydWUpXG5cdCk7XG5cdGRlZmluZVByb3BlcnR5KFxuXHRcdEludGVybmFsU3ltYm9sLnByb3RvdHlwZSxcblx0XHRTeW1ib2wudG9TdHJpbmdUYWcsXG5cdFx0Z2V0VmFsdWVEZXNjcmlwdG9yKCg8YW55PlN5bWJvbCkucHJvdG90eXBlW1N5bWJvbC50b1N0cmluZ1RhZ10sIGZhbHNlLCBmYWxzZSwgdHJ1ZSlcblx0KTtcbn1cblxuLyoqXG4gKiBBIGN1c3RvbSBndWFyZCBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgaWYgYW4gb2JqZWN0IGlzIGEgc3ltYm9sIG9yIG5vdFxuICogQHBhcmFtICB7YW55fSAgICAgICB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2sgdG8gc2VlIGlmIGl0IGlzIGEgc3ltYm9sIG9yIG5vdFxuICogQHJldHVybiB7aXMgc3ltYm9sfSAgICAgICBSZXR1cm5zIHRydWUgaWYgYSBzeW1ib2wgb3Igbm90IChhbmQgbmFycm93cyB0aGUgdHlwZSBndWFyZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBzeW1ib2wge1xuXHRyZXR1cm4gKHZhbHVlICYmICh0eXBlb2YgdmFsdWUgPT09ICdzeW1ib2wnIHx8IHZhbHVlWydAQHRvU3RyaW5nVGFnJ10gPT09ICdTeW1ib2wnKSkgfHwgZmFsc2U7XG59XG5cbi8qKlxuICogRmlsbCBhbnkgbWlzc2luZyB3ZWxsIGtub3duIHN5bWJvbHMgaWYgdGhlIG5hdGl2ZSBTeW1ib2wgaXMgbWlzc2luZyB0aGVtXG4gKi9cbltcblx0J2hhc0luc3RhbmNlJyxcblx0J2lzQ29uY2F0U3ByZWFkYWJsZScsXG5cdCdpdGVyYXRvcicsXG5cdCdzcGVjaWVzJyxcblx0J3JlcGxhY2UnLFxuXHQnc2VhcmNoJyxcblx0J3NwbGl0Jyxcblx0J21hdGNoJyxcblx0J3RvUHJpbWl0aXZlJyxcblx0J3RvU3RyaW5nVGFnJyxcblx0J3Vuc2NvcGFibGVzJyxcblx0J29ic2VydmFibGUnXG5dLmZvckVhY2goKHdlbGxLbm93bikgPT4ge1xuXHRpZiAoIShTeW1ib2wgYXMgYW55KVt3ZWxsS25vd25dKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KFN5bWJvbCwgd2VsbEtub3duLCBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcih3ZWxsS25vd24pLCBmYWxzZSwgZmFsc2UpKTtcblx0fVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IFN5bWJvbDtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBTeW1ib2wudHMiLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4vZ2xvYmFsJztcbmltcG9ydCB7IGlzQXJyYXlMaWtlLCBJdGVyYWJsZSB9IGZyb20gJy4vaXRlcmF0b3InO1xuaW1wb3J0IGhhcyBmcm9tICcuL3N1cHBvcnQvaGFzJztcbmltcG9ydCAnLi9TeW1ib2wnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdlYWtNYXA8SyBleHRlbmRzIG9iamVjdCwgVj4ge1xuXHQvKipcblx0ICogUmVtb3ZlIGEgYGtleWAgZnJvbSB0aGUgbWFwXG5cdCAqXG5cdCAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byByZW1vdmVcblx0ICogQHJldHVybiBgdHJ1ZWAgaWYgdGhlIHZhbHVlIHdhcyByZW1vdmVkLCBvdGhlcndpc2UgYGZhbHNlYFxuXHQgKi9cblx0ZGVsZXRlKGtleTogSyk6IGJvb2xlYW47XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIHRoZSB2YWx1ZSwgYmFzZWQgb24gdGhlIHN1cHBsaWVkIGBrZXlgXG5cdCAqXG5cdCAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byByZXRyaWV2ZSB0aGUgYHZhbHVlYCBmb3Jcblx0ICogQHJldHVybiB0aGUgYHZhbHVlYCBiYXNlZCBvbiB0aGUgYGtleWAgaWYgZm91bmQsIG90aGVyd2lzZSBgZmFsc2VgXG5cdCAqL1xuXHRnZXQoa2V5OiBLKTogViB8IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogRGV0ZXJtaW5lcyBpZiBhIGBrZXlgIGlzIHByZXNlbnQgaW4gdGhlIG1hcFxuXHQgKlxuXHQgKiBAcGFyYW0ga2V5IFRoZSBga2V5YCB0byBjaGVja1xuXHQgKiBAcmV0dXJuIGB0cnVlYCBpZiB0aGUga2V5IGlzIHBhcnQgb2YgdGhlIG1hcCwgb3RoZXJ3aXNlIGBmYWxzZWAuXG5cdCAqL1xuXHRoYXMoa2V5OiBLKTogYm9vbGVhbjtcblxuXHQvKipcblx0ICogU2V0IGEgYHZhbHVlYCBmb3IgYSBwYXJ0aWN1bGFyIGBrZXlgLlxuXHQgKlxuXHQgKiBAcGFyYW0ga2V5IFRoZSBga2V5YCB0byBzZXQgdGhlIGB2YWx1ZWAgZm9yXG5cdCAqIEBwYXJhbSB2YWx1ZSBUaGUgYHZhbHVlYCB0byBzZXRcblx0ICogQHJldHVybiB0aGUgaW5zdGFuY2VzXG5cdCAqL1xuXHRzZXQoa2V5OiBLLCB2YWx1ZTogVik6IHRoaXM7XG5cblx0cmVhZG9ubHkgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdXZWFrTWFwJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWFrTWFwQ29uc3RydWN0b3Ige1xuXHQvKipcblx0ICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgYFdlYWtNYXBgXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0bmV3ICgpOiBXZWFrTWFwPG9iamVjdCwgYW55PjtcblxuXHQvKipcblx0ICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgYFdlYWtNYXBgXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKlxuXHQgKiBAcGFyYW0gaXRlcmFibGUgQW4gaXRlcmFibGUgdGhhdCBjb250YWlucyB5aWVsZHMgdXAga2V5L3ZhbHVlIHBhaXIgZW50cmllc1xuXHQgKi9cblx0bmV3IDxLIGV4dGVuZHMgb2JqZWN0LCBWPihpdGVyYWJsZT86IFtLLCBWXVtdKTogV2Vha01hcDxLLCBWPjtcblxuXHQvKipcblx0ICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgYFdlYWtNYXBgXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKlxuXHQgKiBAcGFyYW0gaXRlcmFibGUgQW4gaXRlcmFibGUgdGhhdCBjb250YWlucyB5aWVsZHMgdXAga2V5L3ZhbHVlIHBhaXIgZW50cmllc1xuXHQgKi9cblx0bmV3IDxLIGV4dGVuZHMgb2JqZWN0LCBWPihpdGVyYWJsZTogSXRlcmFibGU8W0ssIFZdPik6IFdlYWtNYXA8SywgVj47XG5cblx0cmVhZG9ubHkgcHJvdG90eXBlOiBXZWFrTWFwPG9iamVjdCwgYW55Pjtcbn1cblxuZXhwb3J0IGxldCBXZWFrTWFwOiBXZWFrTWFwQ29uc3RydWN0b3IgPSBnbG9iYWwuV2Vha01hcDtcblxuaW50ZXJmYWNlIEVudHJ5PEssIFY+IHtcblx0a2V5OiBLO1xuXHR2YWx1ZTogVjtcbn1cblxuaWYgKCFoYXMoJ2VzNi13ZWFrbWFwJykpIHtcblx0Y29uc3QgREVMRVRFRDogYW55ID0ge307XG5cblx0Y29uc3QgZ2V0VUlEID0gZnVuY3Rpb24gZ2V0VUlEKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDAwMCk7XG5cdH07XG5cblx0Y29uc3QgZ2VuZXJhdGVOYW1lID0gKGZ1bmN0aW9uKCkge1xuXHRcdGxldCBzdGFydElkID0gTWF0aC5mbG9vcihEYXRlLm5vdygpICUgMTAwMDAwMDAwKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZW5lcmF0ZU5hbWUoKTogc3RyaW5nIHtcblx0XHRcdHJldHVybiAnX193bScgKyBnZXRVSUQoKSArIChzdGFydElkKysgKyAnX18nKTtcblx0XHR9O1xuXHR9KSgpO1xuXG5cdFdlYWtNYXAgPSBjbGFzcyBXZWFrTWFwPEssIFY+IHtcblx0XHRwcml2YXRlIHJlYWRvbmx5IF9uYW1lOiBzdHJpbmc7XG5cdFx0cHJpdmF0ZSByZWFkb25seSBfZnJvemVuRW50cmllczogRW50cnk8SywgVj5bXTtcblxuXHRcdGNvbnN0cnVjdG9yKGl0ZXJhYmxlPzogQXJyYXlMaWtlPFtLLCBWXT4gfCBJdGVyYWJsZTxbSywgVl0+KSB7XG5cdFx0XHR0aGlzLl9uYW1lID0gZ2VuZXJhdGVOYW1lKCk7XG5cblx0XHRcdHRoaXMuX2Zyb3plbkVudHJpZXMgPSBbXTtcblxuXHRcdFx0aWYgKGl0ZXJhYmxlKSB7XG5cdFx0XHRcdGlmIChpc0FycmF5TGlrZShpdGVyYWJsZSkpIHtcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGl0ZXJhYmxlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBpdGVtID0gaXRlcmFibGVbaV07XG5cdFx0XHRcdFx0XHR0aGlzLnNldChpdGVtWzBdLCBpdGVtWzFdKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaXRlcmFibGUpIHtcblx0XHRcdFx0XHRcdHRoaXMuc2V0KGtleSwgdmFsdWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHByaXZhdGUgX2dldEZyb3plbkVudHJ5SW5kZXgoa2V5OiBhbnkpOiBudW1iZXIge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9mcm96ZW5FbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmICh0aGlzLl9mcm96ZW5FbnRyaWVzW2ldLmtleSA9PT0ga2V5KSB7XG5cdFx0XHRcdFx0cmV0dXJuIGk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIC0xO1xuXHRcdH1cblxuXHRcdGRlbGV0ZShrZXk6IGFueSk6IGJvb2xlYW4ge1xuXHRcdFx0aWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGVudHJ5OiBFbnRyeTxLLCBWPiA9IGtleVt0aGlzLl9uYW1lXTtcblx0XHRcdGlmIChlbnRyeSAmJiBlbnRyeS5rZXkgPT09IGtleSAmJiBlbnRyeS52YWx1ZSAhPT0gREVMRVRFRCkge1xuXHRcdFx0XHRlbnRyeS52YWx1ZSA9IERFTEVURUQ7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBmcm96ZW5JbmRleCA9IHRoaXMuX2dldEZyb3plbkVudHJ5SW5kZXgoa2V5KTtcblx0XHRcdGlmIChmcm96ZW5JbmRleCA+PSAwKSB7XG5cdFx0XHRcdHRoaXMuX2Zyb3plbkVudHJpZXMuc3BsaWNlKGZyb3plbkluZGV4LCAxKTtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRnZXQoa2V5OiBhbnkpOiBWIHwgdW5kZWZpbmVkIHtcblx0XHRcdGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09IG51bGwpIHtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZW50cnk6IEVudHJ5PEssIFY+ID0ga2V5W3RoaXMuX25hbWVdO1xuXHRcdFx0aWYgKGVudHJ5ICYmIGVudHJ5LmtleSA9PT0ga2V5ICYmIGVudHJ5LnZhbHVlICE9PSBERUxFVEVEKSB7XG5cdFx0XHRcdHJldHVybiBlbnRyeS52YWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZnJvemVuSW5kZXggPSB0aGlzLl9nZXRGcm96ZW5FbnRyeUluZGV4KGtleSk7XG5cdFx0XHRpZiAoZnJvemVuSW5kZXggPj0gMCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fZnJvemVuRW50cmllc1tmcm96ZW5JbmRleF0udmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aGFzKGtleTogYW55KTogYm9vbGVhbiB7XG5cdFx0XHRpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwga2V5ID09PSBudWxsKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZW50cnk6IEVudHJ5PEssIFY+ID0ga2V5W3RoaXMuX25hbWVdO1xuXHRcdFx0aWYgKEJvb2xlYW4oZW50cnkgJiYgZW50cnkua2V5ID09PSBrZXkgJiYgZW50cnkudmFsdWUgIT09IERFTEVURUQpKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBmcm96ZW5JbmRleCA9IHRoaXMuX2dldEZyb3plbkVudHJ5SW5kZXgoa2V5KTtcblx0XHRcdGlmIChmcm96ZW5JbmRleCA+PSAwKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0c2V0KGtleTogYW55LCB2YWx1ZT86IGFueSk6IHRoaXMge1xuXHRcdFx0aWYgKCFrZXkgfHwgKHR5cGVvZiBrZXkgIT09ICdvYmplY3QnICYmIHR5cGVvZiBrZXkgIT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgdmFsdWUgdXNlZCBhcyB3ZWFrIG1hcCBrZXknKTtcblx0XHRcdH1cblx0XHRcdGxldCBlbnRyeTogRW50cnk8SywgVj4gPSBrZXlbdGhpcy5fbmFtZV07XG5cdFx0XHRpZiAoIWVudHJ5IHx8IGVudHJ5LmtleSAhPT0ga2V5KSB7XG5cdFx0XHRcdGVudHJ5ID0gT2JqZWN0LmNyZWF0ZShudWxsLCB7XG5cdFx0XHRcdFx0a2V5OiB7IHZhbHVlOiBrZXkgfVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZiAoT2JqZWN0LmlzRnJvemVuKGtleSkpIHtcblx0XHRcdFx0XHR0aGlzLl9mcm96ZW5FbnRyaWVzLnB1c2goZW50cnkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShrZXksIHRoaXMuX25hbWUsIHtcblx0XHRcdFx0XHRcdHZhbHVlOiBlbnRyeVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRlbnRyeS52YWx1ZSA9IHZhbHVlO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0W1N5bWJvbC50b1N0cmluZ1RhZ106ICdXZWFrTWFwJyA9ICdXZWFrTWFwJztcblx0fTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgV2Vha01hcDtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBXZWFrTWFwLnRzIiwiaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XG5pbXBvcnQgeyBpc0FycmF5TGlrZSwgaXNJdGVyYWJsZSwgSXRlcmFibGUgfSBmcm9tICcuL2l0ZXJhdG9yJztcbmltcG9ydCB7IE1BWF9TQUZFX0lOVEVHRVIgfSBmcm9tICcuL251bWJlcic7XG5pbXBvcnQgaGFzIGZyb20gJy4vc3VwcG9ydC9oYXMnO1xuaW1wb3J0IHsgd3JhcE5hdGl2ZSB9IGZyb20gJy4vc3VwcG9ydC91dGlsJztcblxuZXhwb3J0IGludGVyZmFjZSBNYXBDYWxsYmFjazxULCBVPiB7XG5cdC8qKlxuXHQgKiBBIGNhbGxiYWNrIGZ1bmN0aW9uIHdoZW4gbWFwcGluZ1xuXHQgKlxuXHQgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyBtYXBwZWRcblx0ICogQHBhcmFtIGluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBlbGVtZW50XG5cdCAqL1xuXHQoZWxlbWVudDogVCwgaW5kZXg6IG51bWJlcik6IFU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmluZENhbGxiYWNrPFQ+IHtcblx0LyoqXG5cdCAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gd2hlbiB1c2luZyBmaW5kXG5cdCAqXG5cdCAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRoYXQgaXMgY3VycmVudHkgYmVpbmcgYW5hbHlzZWRcblx0ICogQHBhcmFtIGluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBlbGVtZW50IHRoYXQgaXMgYmVpbmcgYW5hbHlzZWRcblx0ICogQHBhcmFtIGFycmF5IFRoZSBzb3VyY2UgYXJyYXlcblx0ICovXG5cdChlbGVtZW50OiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogQXJyYXlMaWtlPFQ+KTogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFdyaXRhYmxlQXJyYXlMaWtlPFQ+IHtcblx0cmVhZG9ubHkgbGVuZ3RoOiBudW1iZXI7XG5cdFtuOiBudW1iZXJdOiBUO1xufVxuXG4vKiBFUzYgQXJyYXkgc3RhdGljIG1ldGhvZHMgKi9cblxuZXhwb3J0IGludGVyZmFjZSBGcm9tIHtcblx0LyoqXG5cdCAqIFRoZSBBcnJheS5mcm9tKCkgbWV0aG9kIGNyZWF0ZXMgYSBuZXcgQXJyYXkgaW5zdGFuY2UgZnJvbSBhbiBhcnJheS1saWtlIG9yIGl0ZXJhYmxlIG9iamVjdC5cblx0ICpcblx0ICogQHBhcmFtIHNvdXJjZSBBbiBhcnJheS1saWtlIG9yIGl0ZXJhYmxlIG9iamVjdCB0byBjb252ZXJ0IHRvIGFuIGFycmF5XG5cdCAqIEBwYXJhbSBtYXBGdW5jdGlvbiBBIG1hcCBmdW5jdGlvbiB0byBjYWxsIG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXlcblx0ICogQHBhcmFtIHRoaXNBcmcgVGhlIGV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgbWFwIGZ1bmN0aW9uXG5cdCAqIEByZXR1cm4gVGhlIG5ldyBBcnJheVxuXHQgKi9cblx0PFQsIFU+KHNvdXJjZTogQXJyYXlMaWtlPFQ+IHwgSXRlcmFibGU8VD4sIG1hcEZ1bmN0aW9uOiBNYXBDYWxsYmFjazxULCBVPiwgdGhpc0FyZz86IGFueSk6IEFycmF5PFU+O1xuXG5cdC8qKlxuXHQgKiBUaGUgQXJyYXkuZnJvbSgpIG1ldGhvZCBjcmVhdGVzIGEgbmV3IEFycmF5IGluc3RhbmNlIGZyb20gYW4gYXJyYXktbGlrZSBvciBpdGVyYWJsZSBvYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBzb3VyY2UgQW4gYXJyYXktbGlrZSBvciBpdGVyYWJsZSBvYmplY3QgdG8gY29udmVydCB0byBhbiBhcnJheVxuXHQgKiBAcmV0dXJuIFRoZSBuZXcgQXJyYXlcblx0ICovXG5cdDxUPihzb3VyY2U6IEFycmF5TGlrZTxUPiB8IEl0ZXJhYmxlPFQ+KTogQXJyYXk8VD47XG59XG5cbmV4cG9ydCBsZXQgZnJvbTogRnJvbTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGFycmF5IGZyb20gdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIGFyZ3VtZW50cyBBbnkgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgdGhlIGFycmF5XG4gKiBAcmV0dXJuIEFuIGFycmF5IGZyb20gdGhlIGdpdmVuIGFyZ3VtZW50c1xuICovXG5leHBvcnQgbGV0IG9mOiA8VD4oLi4uaXRlbXM6IFRbXSkgPT4gQXJyYXk8VD47XG5cbi8qIEVTNiBBcnJheSBpbnN0YW5jZSBtZXRob2RzICovXG5cbi8qKlxuICogQ29waWVzIGRhdGEgaW50ZXJuYWxseSB3aXRoaW4gYW4gYXJyYXkgb3IgYXJyYXktbGlrZSBvYmplY3QuXG4gKlxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IGFycmF5LWxpa2Ugb2JqZWN0XG4gKiBAcGFyYW0gb2Zmc2V0IFRoZSBpbmRleCB0byBzdGFydCBjb3B5aW5nIHZhbHVlcyB0bzsgaWYgbmVnYXRpdmUsIGl0IGNvdW50cyBiYWNrd2FyZHMgZnJvbSBsZW5ndGhcbiAqIEBwYXJhbSBzdGFydCBUaGUgZmlyc3QgKGluY2x1c2l2ZSkgaW5kZXggdG8gY29weTsgaWYgbmVnYXRpdmUsIGl0IGNvdW50cyBiYWNrd2FyZHMgZnJvbSBsZW5ndGhcbiAqIEBwYXJhbSBlbmQgVGhlIGxhc3QgKGV4Y2x1c2l2ZSkgaW5kZXggdG8gY29weTsgaWYgbmVnYXRpdmUsIGl0IGNvdW50cyBiYWNrd2FyZHMgZnJvbSBsZW5ndGhcbiAqIEByZXR1cm4gVGhlIHRhcmdldFxuICovXG5leHBvcnQgbGV0IGNvcHlXaXRoaW46IDxUPih0YXJnZXQ6IEFycmF5TGlrZTxUPiwgb2Zmc2V0OiBudW1iZXIsIHN0YXJ0OiBudW1iZXIsIGVuZD86IG51bWJlcikgPT4gQXJyYXlMaWtlPFQ+O1xuXG4vKipcbiAqIEZpbGxzIGVsZW1lbnRzIG9mIGFuIGFycmF5LWxpa2Ugb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgdG8gZmlsbFxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBmaWxsIGVhY2ggZWxlbWVudCBvZiB0aGUgdGFyZ2V0IHdpdGhcbiAqIEBwYXJhbSBzdGFydCBUaGUgZmlyc3QgaW5kZXggdG8gZmlsbFxuICogQHBhcmFtIGVuZCBUaGUgKGV4Y2x1c2l2ZSkgaW5kZXggYXQgd2hpY2ggdG8gc3RvcCBmaWxsaW5nXG4gKiBAcmV0dXJuIFRoZSBmaWxsZWQgdGFyZ2V0XG4gKi9cbmV4cG9ydCBsZXQgZmlsbDogPFQ+KHRhcmdldDogQXJyYXlMaWtlPFQ+LCB2YWx1ZTogVCwgc3RhcnQ/OiBudW1iZXIsIGVuZD86IG51bWJlcikgPT4gQXJyYXlMaWtlPFQ+O1xuXG4vKipcbiAqIEZpbmRzIGFuZCByZXR1cm5zIHRoZSBmaXJzdCBpbnN0YW5jZSBtYXRjaGluZyB0aGUgY2FsbGJhY2sgb3IgdW5kZWZpbmVkIGlmIG9uZSBpcyBub3QgZm91bmQuXG4gKlxuICogQHBhcmFtIHRhcmdldCBBbiBhcnJheS1saWtlIG9iamVjdFxuICogQHBhcmFtIGNhbGxiYWNrIEEgZnVuY3Rpb24gcmV0dXJuaW5nIGlmIHRoZSBjdXJyZW50IHZhbHVlIG1hdGNoZXMgYSBjcml0ZXJpYVxuICogQHBhcmFtIHRoaXNBcmcgVGhlIGV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgZmluZCBmdW5jdGlvblxuICogQHJldHVybiBUaGUgZmlyc3QgZWxlbWVudCBtYXRjaGluZyB0aGUgY2FsbGJhY2ssIG9yIHVuZGVmaW5lZCBpZiBvbmUgZG9lcyBub3QgZXhpc3RcbiAqL1xuZXhwb3J0IGxldCBmaW5kOiA8VD4odGFyZ2V0OiBBcnJheUxpa2U8VD4sIGNhbGxiYWNrOiBGaW5kQ2FsbGJhY2s8VD4sIHRoaXNBcmc/OiB7fSkgPT4gVCB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIGxpbmVhciBzZWFyY2ggYW5kIHJldHVybnMgdGhlIGZpcnN0IGluZGV4IHdob3NlIHZhbHVlIHNhdGlzZmllcyB0aGUgcGFzc2VkIGNhbGxiYWNrLFxuICogb3IgLTEgaWYgbm8gdmFsdWVzIHNhdGlzZnkgaXQuXG4gKlxuICogQHBhcmFtIHRhcmdldCBBbiBhcnJheS1saWtlIG9iamVjdFxuICogQHBhcmFtIGNhbGxiYWNrIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRydWUgaWYgdGhlIGN1cnJlbnQgdmFsdWUgc2F0aXNmaWVzIGl0cyBjcml0ZXJpYVxuICogQHBhcmFtIHRoaXNBcmcgVGhlIGV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgZmluZCBmdW5jdGlvblxuICogQHJldHVybiBUaGUgZmlyc3QgaW5kZXggd2hvc2UgdmFsdWUgc2F0aXNmaWVzIHRoZSBwYXNzZWQgY2FsbGJhY2ssIG9yIC0xIGlmIG5vIHZhbHVlcyBzYXRpc2Z5IGl0XG4gKi9cbmV4cG9ydCBsZXQgZmluZEluZGV4OiA8VD4odGFyZ2V0OiBBcnJheUxpa2U8VD4sIGNhbGxiYWNrOiBGaW5kQ2FsbGJhY2s8VD4sIHRoaXNBcmc/OiB7fSkgPT4gbnVtYmVyO1xuXG4vKiBFUzcgQXJyYXkgaW5zdGFuY2UgbWV0aG9kcyAqL1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhbiBhcnJheSBpbmNsdWRlcyBhIGdpdmVuIHZhbHVlXG4gKlxuICogQHBhcmFtIHRhcmdldCB0aGUgdGFyZ2V0IGFycmF5LWxpa2Ugb2JqZWN0XG4gKiBAcGFyYW0gc2VhcmNoRWxlbWVudCB0aGUgaXRlbSB0byBzZWFyY2ggZm9yXG4gKiBAcGFyYW0gZnJvbUluZGV4IHRoZSBzdGFydGluZyBpbmRleCB0byBzZWFyY2ggZnJvbVxuICogQHJldHVybiBgdHJ1ZWAgaWYgdGhlIGFycmF5IGluY2x1ZGVzIHRoZSBlbGVtZW50LCBvdGhlcndpc2UgYGZhbHNlYFxuICovXG5leHBvcnQgbGV0IGluY2x1ZGVzOiA8VD4odGFyZ2V0OiBBcnJheUxpa2U8VD4sIHNlYXJjaEVsZW1lbnQ6IFQsIGZyb21JbmRleD86IG51bWJlcikgPT4gYm9vbGVhbjtcblxuaWYgKGhhcygnZXM2LWFycmF5JykgJiYgaGFzKCdlczYtYXJyYXktZmlsbCcpKSB7XG5cdGZyb20gPSBnbG9iYWwuQXJyYXkuZnJvbTtcblx0b2YgPSBnbG9iYWwuQXJyYXkub2Y7XG5cdGNvcHlXaXRoaW4gPSB3cmFwTmF0aXZlKGdsb2JhbC5BcnJheS5wcm90b3R5cGUuY29weVdpdGhpbik7XG5cdGZpbGwgPSB3cmFwTmF0aXZlKGdsb2JhbC5BcnJheS5wcm90b3R5cGUuZmlsbCk7XG5cdGZpbmQgPSB3cmFwTmF0aXZlKGdsb2JhbC5BcnJheS5wcm90b3R5cGUuZmluZCk7XG5cdGZpbmRJbmRleCA9IHdyYXBOYXRpdmUoZ2xvYmFsLkFycmF5LnByb3RvdHlwZS5maW5kSW5kZXgpO1xufSBlbHNlIHtcblx0Ly8gSXQgaXMgb25seSBvbGRlciB2ZXJzaW9ucyBvZiBTYWZhcmkvaU9TIHRoYXQgaGF2ZSBhIGJhZCBmaWxsIGltcGxlbWVudGF0aW9uIGFuZCBzbyBhcmVuJ3QgaW4gdGhlIHdpbGRcblx0Ly8gVG8gbWFrZSB0aGluZ3MgZWFzaWVyLCBpZiB0aGVyZSBpcyBhIGJhZCBmaWxsIGltcGxlbWVudGF0aW9uLCB0aGUgd2hvbGUgc2V0IG9mIGZ1bmN0aW9ucyB3aWxsIGJlIGZpbGxlZFxuXG5cdC8qKlxuXHQgKiBFbnN1cmVzIGEgbm9uLW5lZ2F0aXZlLCBub24taW5maW5pdGUsIHNhZmUgaW50ZWdlci5cblx0ICpcblx0ICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIHRvIHZhbGlkYXRlXG5cdCAqIEByZXR1cm4gQSBwcm9wZXIgbGVuZ3RoXG5cdCAqL1xuXHRjb25zdCB0b0xlbmd0aCA9IGZ1bmN0aW9uIHRvTGVuZ3RoKGxlbmd0aDogbnVtYmVyKTogbnVtYmVyIHtcblx0XHRpZiAoaXNOYU4obGVuZ3RoKSkge1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0bGVuZ3RoID0gTnVtYmVyKGxlbmd0aCk7XG5cdFx0aWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcblx0XHRcdGxlbmd0aCA9IE1hdGguZmxvb3IobGVuZ3RoKTtcblx0XHR9XG5cdFx0Ly8gRW5zdXJlIGEgbm9uLW5lZ2F0aXZlLCByZWFsLCBzYWZlIGludGVnZXJcblx0XHRyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobGVuZ3RoLCAwKSwgTUFYX1NBRkVfSU5URUdFUik7XG5cdH07XG5cblx0LyoqXG5cdCAqIEZyb20gRVM2IDcuMS40IFRvSW50ZWdlcigpXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWx1ZSBBIHZhbHVlIHRvIGNvbnZlcnRcblx0ICogQHJldHVybiBBbiBpbnRlZ2VyXG5cdCAqL1xuXHRjb25zdCB0b0ludGVnZXIgPSBmdW5jdGlvbiB0b0ludGVnZXIodmFsdWU6IGFueSk6IG51bWJlciB7XG5cdFx0dmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuXHRcdGlmIChpc05hTih2YWx1ZSkpIHtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblx0XHRpZiAodmFsdWUgPT09IDAgfHwgIWlzRmluaXRlKHZhbHVlKSkge1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblxuXHRcdHJldHVybiAodmFsdWUgPiAwID8gMSA6IC0xKSAqIE1hdGguZmxvb3IoTWF0aC5hYnModmFsdWUpKTtcblx0fTtcblxuXHQvKipcblx0ICogTm9ybWFsaXplcyBhbiBvZmZzZXQgYWdhaW5zdCBhIGdpdmVuIGxlbmd0aCwgd3JhcHBpbmcgaXQgaWYgbmVnYXRpdmUuXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWx1ZSBUaGUgb3JpZ2luYWwgb2Zmc2V0XG5cdCAqIEBwYXJhbSBsZW5ndGggVGhlIHRvdGFsIGxlbmd0aCB0byBub3JtYWxpemUgYWdhaW5zdFxuXHQgKiBAcmV0dXJuIElmIG5lZ2F0aXZlLCBwcm92aWRlIGEgZGlzdGFuY2UgZnJvbSB0aGUgZW5kIChsZW5ndGgpOyBvdGhlcndpc2UgcHJvdmlkZSBhIGRpc3RhbmNlIGZyb20gMFxuXHQgKi9cblx0Y29uc3Qgbm9ybWFsaXplT2Zmc2V0ID0gZnVuY3Rpb24gbm9ybWFsaXplT2Zmc2V0KHZhbHVlOiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdmFsdWUgPCAwID8gTWF0aC5tYXgobGVuZ3RoICsgdmFsdWUsIDApIDogTWF0aC5taW4odmFsdWUsIGxlbmd0aCk7XG5cdH07XG5cblx0ZnJvbSA9IGZ1bmN0aW9uIGZyb20oXG5cdFx0dGhpczogQXJyYXlDb25zdHJ1Y3Rvcixcblx0XHRhcnJheUxpa2U6IEl0ZXJhYmxlPGFueT4gfCBBcnJheUxpa2U8YW55Pixcblx0XHRtYXBGdW5jdGlvbj86IE1hcENhbGxiYWNrPGFueSwgYW55Pixcblx0XHR0aGlzQXJnPzogYW55XG5cdCk6IEFycmF5PGFueT4ge1xuXHRcdGlmIChhcnJheUxpa2UgPT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignZnJvbTogcmVxdWlyZXMgYW4gYXJyYXktbGlrZSBvYmplY3QnKTtcblx0XHR9XG5cblx0XHRpZiAobWFwRnVuY3Rpb24gJiYgdGhpc0FyZykge1xuXHRcdFx0bWFwRnVuY3Rpb24gPSBtYXBGdW5jdGlvbi5iaW5kKHRoaXNBcmcpO1xuXHRcdH1cblxuXHRcdC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lICovXG5cdFx0Y29uc3QgQ29uc3RydWN0b3IgPSB0aGlzO1xuXHRcdGNvbnN0IGxlbmd0aDogbnVtYmVyID0gdG9MZW5ndGgoKDxhbnk+YXJyYXlMaWtlKS5sZW5ndGgpO1xuXG5cdFx0Ly8gU3VwcG9ydCBleHRlbnNpb25cblx0XHRjb25zdCBhcnJheTogYW55W10gPVxuXHRcdFx0dHlwZW9mIENvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nID8gPGFueVtdPk9iamVjdChuZXcgQ29uc3RydWN0b3IobGVuZ3RoKSkgOiBuZXcgQXJyYXkobGVuZ3RoKTtcblxuXHRcdGlmICghaXNBcnJheUxpa2UoYXJyYXlMaWtlKSAmJiAhaXNJdGVyYWJsZShhcnJheUxpa2UpKSB7XG5cdFx0XHRyZXR1cm4gYXJyYXk7XG5cdFx0fVxuXG5cdFx0Ly8gaWYgdGhpcyBpcyBhbiBhcnJheSBhbmQgdGhlIG5vcm1hbGl6ZWQgbGVuZ3RoIGlzIDAsIGp1c3QgcmV0dXJuIGFuIGVtcHR5IGFycmF5LiB0aGlzIHByZXZlbnRzIGEgcHJvYmxlbVxuXHRcdC8vIHdpdGggdGhlIGl0ZXJhdGlvbiBvbiBJRSB3aGVuIHVzaW5nIGEgTmFOIGFycmF5IGxlbmd0aC5cblx0XHRpZiAoaXNBcnJheUxpa2UoYXJyYXlMaWtlKSkge1xuXHRcdFx0aWYgKGxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRyZXR1cm4gW107XG5cdFx0XHR9XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXlMaWtlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGFycmF5W2ldID0gbWFwRnVuY3Rpb24gPyBtYXBGdW5jdGlvbihhcnJheUxpa2VbaV0sIGkpIDogYXJyYXlMaWtlW2ldO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZXQgaSA9IDA7XG5cdFx0XHRmb3IgKGNvbnN0IHZhbHVlIG9mIGFycmF5TGlrZSkge1xuXHRcdFx0XHRhcnJheVtpXSA9IG1hcEZ1bmN0aW9uID8gbWFwRnVuY3Rpb24odmFsdWUsIGkpIDogdmFsdWU7XG5cdFx0XHRcdGkrKztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoKDxhbnk+YXJyYXlMaWtlKS5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0YXJyYXkubGVuZ3RoID0gbGVuZ3RoO1xuXHRcdH1cblxuXHRcdHJldHVybiBhcnJheTtcblx0fTtcblxuXHRvZiA9IGZ1bmN0aW9uIG9mPFQ+KC4uLml0ZW1zOiBUW10pOiBBcnJheTxUPiB7XG5cdFx0cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGl0ZW1zKTtcblx0fTtcblxuXHRjb3B5V2l0aGluID0gZnVuY3Rpb24gY29weVdpdGhpbjxUPihcblx0XHR0YXJnZXQ6IEFycmF5TGlrZTxUPixcblx0XHRvZmZzZXQ6IG51bWJlcixcblx0XHRzdGFydDogbnVtYmVyLFxuXHRcdGVuZD86IG51bWJlclxuXHQpOiBBcnJheUxpa2U8VD4ge1xuXHRcdGlmICh0YXJnZXQgPT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignY29weVdpdGhpbjogdGFyZ2V0IG11c3QgYmUgYW4gYXJyYXktbGlrZSBvYmplY3QnKTtcblx0XHR9XG5cblx0XHRjb25zdCBsZW5ndGggPSB0b0xlbmd0aCh0YXJnZXQubGVuZ3RoKTtcblx0XHRvZmZzZXQgPSBub3JtYWxpemVPZmZzZXQodG9JbnRlZ2VyKG9mZnNldCksIGxlbmd0aCk7XG5cdFx0c3RhcnQgPSBub3JtYWxpemVPZmZzZXQodG9JbnRlZ2VyKHN0YXJ0KSwgbGVuZ3RoKTtcblx0XHRlbmQgPSBub3JtYWxpemVPZmZzZXQoZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0ludGVnZXIoZW5kKSwgbGVuZ3RoKTtcblx0XHRsZXQgY291bnQgPSBNYXRoLm1pbihlbmQgLSBzdGFydCwgbGVuZ3RoIC0gb2Zmc2V0KTtcblxuXHRcdGxldCBkaXJlY3Rpb24gPSAxO1xuXHRcdGlmIChvZmZzZXQgPiBzdGFydCAmJiBvZmZzZXQgPCBzdGFydCArIGNvdW50KSB7XG5cdFx0XHRkaXJlY3Rpb24gPSAtMTtcblx0XHRcdHN0YXJ0ICs9IGNvdW50IC0gMTtcblx0XHRcdG9mZnNldCArPSBjb3VudCAtIDE7XG5cdFx0fVxuXG5cdFx0d2hpbGUgKGNvdW50ID4gMCkge1xuXHRcdFx0aWYgKHN0YXJ0IGluIHRhcmdldCkge1xuXHRcdFx0XHQodGFyZ2V0IGFzIFdyaXRhYmxlQXJyYXlMaWtlPFQ+KVtvZmZzZXRdID0gdGFyZ2V0W3N0YXJ0XTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlbGV0ZSAodGFyZ2V0IGFzIFdyaXRhYmxlQXJyYXlMaWtlPFQ+KVtvZmZzZXRdO1xuXHRcdFx0fVxuXG5cdFx0XHRvZmZzZXQgKz0gZGlyZWN0aW9uO1xuXHRcdFx0c3RhcnQgKz0gZGlyZWN0aW9uO1xuXHRcdFx0Y291bnQtLTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0O1xuXHR9O1xuXG5cdGZpbGwgPSBmdW5jdGlvbiBmaWxsPFQ+KHRhcmdldDogQXJyYXlMaWtlPFQ+LCB2YWx1ZTogYW55LCBzdGFydD86IG51bWJlciwgZW5kPzogbnVtYmVyKTogQXJyYXlMaWtlPFQ+IHtcblx0XHRjb25zdCBsZW5ndGggPSB0b0xlbmd0aCh0YXJnZXQubGVuZ3RoKTtcblx0XHRsZXQgaSA9IG5vcm1hbGl6ZU9mZnNldCh0b0ludGVnZXIoc3RhcnQpLCBsZW5ndGgpO1xuXHRcdGVuZCA9IG5vcm1hbGl6ZU9mZnNldChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvSW50ZWdlcihlbmQpLCBsZW5ndGgpO1xuXG5cdFx0d2hpbGUgKGkgPCBlbmQpIHtcblx0XHRcdCh0YXJnZXQgYXMgV3JpdGFibGVBcnJheUxpa2U8VD4pW2krK10gPSB2YWx1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0O1xuXHR9O1xuXG5cdGZpbmQgPSBmdW5jdGlvbiBmaW5kPFQ+KHRhcmdldDogQXJyYXlMaWtlPFQ+LCBjYWxsYmFjazogRmluZENhbGxiYWNrPFQ+LCB0aGlzQXJnPzoge30pOiBUIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBpbmRleCA9IGZpbmRJbmRleDxUPih0YXJnZXQsIGNhbGxiYWNrLCB0aGlzQXJnKTtcblx0XHRyZXR1cm4gaW5kZXggIT09IC0xID8gdGFyZ2V0W2luZGV4XSA6IHVuZGVmaW5lZDtcblx0fTtcblxuXHRmaW5kSW5kZXggPSBmdW5jdGlvbiBmaW5kSW5kZXg8VD4odGFyZ2V0OiBBcnJheUxpa2U8VD4sIGNhbGxiYWNrOiBGaW5kQ2FsbGJhY2s8VD4sIHRoaXNBcmc/OiB7fSk6IG51bWJlciB7XG5cdFx0Y29uc3QgbGVuZ3RoID0gdG9MZW5ndGgodGFyZ2V0Lmxlbmd0aCk7XG5cblx0XHRpZiAoIWNhbGxiYWNrKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdmaW5kOiBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXNBcmcpIHtcblx0XHRcdGNhbGxiYWNrID0gY2FsbGJhY2suYmluZCh0aGlzQXJnKTtcblx0XHR9XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoY2FsbGJhY2sodGFyZ2V0W2ldLCBpLCB0YXJnZXQpKSB7XG5cdFx0XHRcdHJldHVybiBpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAtMTtcblx0fTtcbn1cblxuaWYgKGhhcygnZXM3LWFycmF5JykpIHtcblx0aW5jbHVkZXMgPSB3cmFwTmF0aXZlKGdsb2JhbC5BcnJheS5wcm90b3R5cGUuaW5jbHVkZXMpO1xufSBlbHNlIHtcblx0LyoqXG5cdCAqIEVuc3VyZXMgYSBub24tbmVnYXRpdmUsIG5vbi1pbmZpbml0ZSwgc2FmZSBpbnRlZ2VyLlxuXHQgKlxuXHQgKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgdG8gdmFsaWRhdGVcblx0ICogQHJldHVybiBBIHByb3BlciBsZW5ndGhcblx0ICovXG5cdGNvbnN0IHRvTGVuZ3RoID0gZnVuY3Rpb24gdG9MZW5ndGgobGVuZ3RoOiBudW1iZXIpOiBudW1iZXIge1xuXHRcdGxlbmd0aCA9IE51bWJlcihsZW5ndGgpO1xuXHRcdGlmIChpc05hTihsZW5ndGgpKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cdFx0aWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcblx0XHRcdGxlbmd0aCA9IE1hdGguZmxvb3IobGVuZ3RoKTtcblx0XHR9XG5cdFx0Ly8gRW5zdXJlIGEgbm9uLW5lZ2F0aXZlLCByZWFsLCBzYWZlIGludGVnZXJcblx0XHRyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobGVuZ3RoLCAwKSwgTUFYX1NBRkVfSU5URUdFUik7XG5cdH07XG5cblx0aW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlczxUPih0YXJnZXQ6IEFycmF5TGlrZTxUPiwgc2VhcmNoRWxlbWVudDogVCwgZnJvbUluZGV4OiBudW1iZXIgPSAwKTogYm9vbGVhbiB7XG5cdFx0bGV0IGxlbiA9IHRvTGVuZ3RoKHRhcmdldC5sZW5ndGgpO1xuXG5cdFx0Zm9yIChsZXQgaSA9IGZyb21JbmRleDsgaSA8IGxlbjsgKytpKSB7XG5cdFx0XHRjb25zdCBjdXJyZW50RWxlbWVudCA9IHRhcmdldFtpXTtcblx0XHRcdGlmIChcblx0XHRcdFx0c2VhcmNoRWxlbWVudCA9PT0gY3VycmVudEVsZW1lbnQgfHxcblx0XHRcdFx0KHNlYXJjaEVsZW1lbnQgIT09IHNlYXJjaEVsZW1lbnQgJiYgY3VycmVudEVsZW1lbnQgIT09IGN1cnJlbnRFbGVtZW50KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBhcnJheS50cyIsImNvbnN0IGdsb2JhbE9iamVjdDogYW55ID0gKGZ1bmN0aW9uKCk6IGFueSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuXHRcdC8vIGdsb2JhbCBzcGVjIGRlZmluZXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QgY2FsbGVkICdnbG9iYWwnXG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZ2xvYmFsXG5cdFx0Ly8gYGdsb2JhbGAgaXMgYWxzbyBkZWZpbmVkIGluIE5vZGVKU1xuXHRcdHJldHVybiBnbG9iYWw7XG5cdH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHQvLyB3aW5kb3cgaXMgZGVmaW5lZCBpbiBicm93c2Vyc1xuXHRcdHJldHVybiB3aW5kb3c7XG5cdH0gZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0Ly8gc2VsZiBpcyBkZWZpbmVkIGluIFdlYldvcmtlcnNcblx0XHRyZXR1cm4gc2VsZjtcblx0fVxufSkoKTtcblxuZXhwb3J0IGRlZmF1bHQgZ2xvYmFsT2JqZWN0O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGdsb2JhbC50cyIsImltcG9ydCAnLi9TeW1ib2wnO1xuaW1wb3J0IHsgSElHSF9TVVJST0dBVEVfTUFYLCBISUdIX1NVUlJPR0FURV9NSU4gfSBmcm9tICcuL3N0cmluZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSXRlcmF0b3JSZXN1bHQ8VD4ge1xuXHRyZWFkb25seSBkb25lOiBib29sZWFuO1xuXHRyZWFkb25seSB2YWx1ZTogVDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJdGVyYXRvcjxUPiB7XG5cdG5leHQodmFsdWU/OiBhbnkpOiBJdGVyYXRvclJlc3VsdDxUPjtcblxuXHRyZXR1cm4/KHZhbHVlPzogYW55KTogSXRlcmF0b3JSZXN1bHQ8VD47XG5cblx0dGhyb3c/KGU/OiBhbnkpOiBJdGVyYXRvclJlc3VsdDxUPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJdGVyYWJsZTxUPiB7XG5cdFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhdG9yPFQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEl0ZXJhYmxlSXRlcmF0b3I8VD4gZXh0ZW5kcyBJdGVyYXRvcjxUPiB7XG5cdFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8VD47XG59XG5cbmNvbnN0IHN0YXRpY0RvbmU6IEl0ZXJhdG9yUmVzdWx0PGFueT4gPSB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgX3NoaW1zXyBhbiBpdGVyYXRvciBpbnRlcmZhY2Ugb24gYXJyYXkgbGlrZSBvYmplY3RzLlxuICovXG5leHBvcnQgY2xhc3MgU2hpbUl0ZXJhdG9yPFQ+IHtcblx0cHJpdmF0ZSBfbGlzdDogQXJyYXlMaWtlPFQ+IHwgdW5kZWZpbmVkO1xuXHRwcml2YXRlIF9uZXh0SW5kZXggPSAtMTtcblx0cHJpdmF0ZSBfbmF0aXZlSXRlcmF0b3I6IEl0ZXJhdG9yPFQ+IHwgdW5kZWZpbmVkO1xuXG5cdGNvbnN0cnVjdG9yKGxpc3Q6IEFycmF5TGlrZTxUPiB8IEl0ZXJhYmxlPFQ+KSB7XG5cdFx0aWYgKGlzSXRlcmFibGUobGlzdCkpIHtcblx0XHRcdHRoaXMuX25hdGl2ZUl0ZXJhdG9yID0gbGlzdFtTeW1ib2wuaXRlcmF0b3JdKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX2xpc3QgPSBsaXN0O1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm4gdGhlIG5leHQgaXRlcmF0aW9uIHJlc3VsdCBmb3IgdGhlIEl0ZXJhdG9yXG5cdCAqL1xuXHRuZXh0KCk6IEl0ZXJhdG9yUmVzdWx0PFQ+IHtcblx0XHRpZiAodGhpcy5fbmF0aXZlSXRlcmF0b3IpIHtcblx0XHRcdHJldHVybiB0aGlzLl9uYXRpdmVJdGVyYXRvci5uZXh0KCk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5fbGlzdCkge1xuXHRcdFx0cmV0dXJuIHN0YXRpY0RvbmU7XG5cdFx0fVxuXHRcdGlmICgrK3RoaXMuX25leHRJbmRleCA8IHRoaXMuX2xpc3QubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkb25lOiBmYWxzZSxcblx0XHRcdFx0dmFsdWU6IHRoaXMuX2xpc3RbdGhpcy5fbmV4dEluZGV4XVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIHN0YXRpY0RvbmU7XG5cdH1cblxuXHRbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG4vKipcbiAqIEEgdHlwZSBndWFyZCBmb3IgY2hlY2tpbmcgaWYgc29tZXRoaW5nIGhhcyBhbiBJdGVyYWJsZSBpbnRlcmZhY2VcbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHR5cGUgZ3VhcmQgYWdhaW5zdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJdGVyYWJsZSh2YWx1ZTogYW55KTogdmFsdWUgaXMgSXRlcmFibGU8YW55PiB7XG5cdHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWVbU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBBIHR5cGUgZ3VhcmQgZm9yIGNoZWNraW5nIGlmIHNvbWV0aGluZyBpcyBBcnJheUxpa2VcbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHR5cGUgZ3VhcmQgYWdhaW5zdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWU6IGFueSk6IHZhbHVlIGlzIEFycmF5TGlrZTxhbnk+IHtcblx0cmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5sZW5ndGggPT09ICdudW1iZXInO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGl0ZXJhdG9yIGZvciBhbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0gaXRlcmFibGUgVGhlIGl0ZXJhYmxlIG9iamVjdCB0byByZXR1cm4gdGhlIGl0ZXJhdG9yIGZvclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0PFQ+KGl0ZXJhYmxlOiBJdGVyYWJsZTxUPiB8IEFycmF5TGlrZTxUPik6IEl0ZXJhdG9yPFQ+IHwgdW5kZWZpbmVkIHtcblx0aWYgKGlzSXRlcmFibGUoaXRlcmFibGUpKSB7XG5cdFx0cmV0dXJuIGl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcblx0fSBlbHNlIGlmIChpc0FycmF5TGlrZShpdGVyYWJsZSkpIHtcblx0XHRyZXR1cm4gbmV3IFNoaW1JdGVyYXRvcihpdGVyYWJsZSk7XG5cdH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JPZkNhbGxiYWNrPFQ+IHtcblx0LyoqXG5cdCAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGEgZm9yT2YoKSBpdGVyYXRpb25cblx0ICpcblx0ICogQHBhcmFtIHZhbHVlIFRoZSBjdXJyZW50IHZhbHVlXG5cdCAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCBiZWluZyBpdGVyYXRlZCBvdmVyXG5cdCAqIEBwYXJhbSBkb0JyZWFrIEEgZnVuY3Rpb24sIGlmIGNhbGxlZCwgd2lsbCBzdG9wIHRoZSBpdGVyYXRpb25cblx0ICovXG5cdCh2YWx1ZTogVCwgb2JqZWN0OiBJdGVyYWJsZTxUPiB8IEFycmF5TGlrZTxUPiB8IHN0cmluZywgZG9CcmVhazogKCkgPT4gdm9pZCk6IHZvaWQ7XG59XG5cbi8qKlxuICogU2hpbXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYGZvciAuLi4gb2ZgIGJsb2Nrc1xuICpcbiAqIEBwYXJhbSBpdGVyYWJsZSBUaGUgb2JqZWN0IHRoZSBwcm92aWRlcyBhbiBpbnRlcmF0b3IgaW50ZXJmYWNlXG4gKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIGl0ZW0gb2YgdGhlIGl0ZXJhYmxlXG4gKiBAcGFyYW0gdGhpc0FyZyBPcHRpb25hbCBzY29wZSB0byBwYXNzIHRoZSBjYWxsYmFja1xuICovXG5leHBvcnQgZnVuY3Rpb24gZm9yT2Y8VD4oXG5cdGl0ZXJhYmxlOiBJdGVyYWJsZTxUPiB8IEFycmF5TGlrZTxUPiB8IHN0cmluZyxcblx0Y2FsbGJhY2s6IEZvck9mQ2FsbGJhY2s8VD4sXG5cdHRoaXNBcmc/OiBhbnlcbik6IHZvaWQge1xuXHRsZXQgYnJva2VuID0gZmFsc2U7XG5cblx0ZnVuY3Rpb24gZG9CcmVhaygpIHtcblx0XHRicm9rZW4gPSB0cnVlO1xuXHR9XG5cblx0LyogV2UgbmVlZCB0byBoYW5kbGUgaXRlcmF0aW9uIG9mIGRvdWJsZSBieXRlIHN0cmluZ3MgcHJvcGVybHkgKi9cblx0aWYgKGlzQXJyYXlMaWtlKGl0ZXJhYmxlKSAmJiB0eXBlb2YgaXRlcmFibGUgPT09ICdzdHJpbmcnKSB7XG5cdFx0Y29uc3QgbCA9IGl0ZXJhYmxlLmxlbmd0aDtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGw7ICsraSkge1xuXHRcdFx0bGV0IGNoYXIgPSBpdGVyYWJsZVtpXTtcblx0XHRcdGlmIChpICsgMSA8IGwpIHtcblx0XHRcdFx0Y29uc3QgY29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcblx0XHRcdFx0aWYgKGNvZGUgPj0gSElHSF9TVVJST0dBVEVfTUlOICYmIGNvZGUgPD0gSElHSF9TVVJST0dBVEVfTUFYKSB7XG5cdFx0XHRcdFx0Y2hhciArPSBpdGVyYWJsZVsrK2ldO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjYWxsYmFjay5jYWxsKHRoaXNBcmcsIGNoYXIsIGl0ZXJhYmxlLCBkb0JyZWFrKTtcblx0XHRcdGlmIChicm9rZW4pIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRjb25zdCBpdGVyYXRvciA9IGdldChpdGVyYWJsZSk7XG5cdFx0aWYgKGl0ZXJhdG9yKSB7XG5cdFx0XHRsZXQgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuXG5cdFx0XHR3aGlsZSAoIXJlc3VsdC5kb25lKSB7XG5cdFx0XHRcdGNhbGxiYWNrLmNhbGwodGhpc0FyZywgcmVzdWx0LnZhbHVlLCBpdGVyYWJsZSwgZG9CcmVhayk7XG5cdFx0XHRcdGlmIChicm9rZW4pIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0cmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGl0ZXJhdG9yLnRzIiwiaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XG5cbi8qKlxuICogVGhlIHNtYWxsZXN0IGludGVydmFsIGJldHdlZW4gdHdvIHJlcHJlc2VudGFibGUgbnVtYmVycy5cbiAqL1xuZXhwb3J0IGNvbnN0IEVQU0lMT04gPSAxO1xuXG4vKipcbiAqIFRoZSBtYXhpbXVtIHNhZmUgaW50ZWdlciBpbiBKYXZhU2NyaXB0XG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfU0FGRV9JTlRFR0VSID0gTWF0aC5wb3coMiwgNTMpIC0gMTtcblxuLyoqXG4gKiBUaGUgbWluaW11bSBzYWZlIGludGVnZXIgaW4gSmF2YVNjcmlwdFxuICovXG5leHBvcnQgY29uc3QgTUlOX1NBRkVfSU5URUdFUiA9IC1NQVhfU0FGRV9JTlRFR0VSO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGFzc2VkIHZhbHVlIGlzIE5hTiB3aXRob3V0IGNvZXJzaW9uLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBOYU4sIGZhbHNlIGlmIGl0IGlzIG5vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOYU4odmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBnbG9iYWwuaXNOYU4odmFsdWUpO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGFzc2VkIHZhbHVlIGlzIGEgZmluaXRlIG51bWJlciB3aXRob3V0IGNvZXJzaW9uLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBmaW5pdGUsIGZhbHNlIGlmIGl0IGlzIG5vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNGaW5pdGUodmFsdWU6IGFueSk6IHZhbHVlIGlzIG51bWJlciB7XG5cdHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGdsb2JhbC5pc0Zpbml0ZSh2YWx1ZSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXNzZWQgdmFsdWUgaXMgYW4gaW50ZWdlci5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlciwgZmFsc2UgaWYgaXQgaXMgbm90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0ludGVnZXIodmFsdWU6IGFueSk6IHZhbHVlIGlzIG51bWJlciB7XG5cdHJldHVybiBpc0Zpbml0ZSh2YWx1ZSkgJiYgTWF0aC5mbG9vcih2YWx1ZSkgPT09IHZhbHVlO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGFzc2VkIHZhbHVlIGlzIGFuIGludGVnZXIgdGhhdCBpcyAnc2FmZSwnIG1lYW5pbmc6XG4gKiAgIDEuIGl0IGNhbiBiZSBleHByZXNzZWQgYXMgYW4gSUVFRS03NTQgZG91YmxlIHByZWNpc2lvbiBudW1iZXJcbiAqICAgMi4gaXQgaGFzIGEgb25lLXRvLW9uZSBtYXBwaW5nIHRvIGEgbWF0aGVtYXRpY2FsIGludGVnZXIsIG1lYW5pbmcgaXRzXG4gKiAgICAgIElFRUUtNzU0IHJlcHJlc2VudGF0aW9uIGNhbm5vdCBiZSB0aGUgcmVzdWx0IG9mIHJvdW5kaW5nIGFueSBvdGhlclxuICogICAgICBpbnRlZ2VyIHRvIGZpdCB0aGUgSUVFRS03NTQgcmVwcmVzZW50YXRpb25cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlciwgZmFsc2UgaWYgaXQgaXMgbm90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBudW1iZXIge1xuXHRyZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSAmJiBNYXRoLmFicyh2YWx1ZSkgPD0gTUFYX1NBRkVfSU5URUdFUjtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBudW1iZXIudHMiLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4vZ2xvYmFsJztcbmltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XG5pbXBvcnQgeyBpc1N5bWJvbCB9IGZyb20gJy4vU3ltYm9sJztcblxuZXhwb3J0IGludGVyZmFjZSBPYmplY3RBc3NpZ24ge1xuXHQvKipcblx0ICogQ29weSB0aGUgdmFsdWVzIG9mIGFsbCBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBmcm9tIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIGFcblx0ICogdGFyZ2V0IG9iamVjdC4gUmV0dXJucyB0aGUgdGFyZ2V0IG9iamVjdC5cblx0ICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCB0byBjb3B5IHRvLlxuXHQgKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IGZyb20gd2hpY2ggdG8gY29weSBwcm9wZXJ0aWVzLlxuXHQgKi9cblx0PFQsIFU+KHRhcmdldDogVCwgc291cmNlOiBVKTogVCAmIFU7XG5cblx0LyoqXG5cdCAqIENvcHkgdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhXG5cdCAqIHRhcmdldCBvYmplY3QuIFJldHVybnMgdGhlIHRhcmdldCBvYmplY3QuXG5cdCAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gY29weSB0by5cblx0ICogQHBhcmFtIHNvdXJjZTEgVGhlIGZpcnN0IHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG5cdCAqIEBwYXJhbSBzb3VyY2UyIFRoZSBzZWNvbmQgc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllcy5cblx0ICovXG5cdDxULCBVLCBWPih0YXJnZXQ6IFQsIHNvdXJjZTE6IFUsIHNvdXJjZTI6IFYpOiBUICYgVSAmIFY7XG5cblx0LyoqXG5cdCAqIENvcHkgdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhXG5cdCAqIHRhcmdldCBvYmplY3QuIFJldHVybnMgdGhlIHRhcmdldCBvYmplY3QuXG5cdCAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gY29weSB0by5cblx0ICogQHBhcmFtIHNvdXJjZTEgVGhlIGZpcnN0IHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG5cdCAqIEBwYXJhbSBzb3VyY2UyIFRoZSBzZWNvbmQgc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllcy5cblx0ICogQHBhcmFtIHNvdXJjZTMgVGhlIHRoaXJkIHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG5cdCAqL1xuXHQ8VCwgVSwgViwgVz4odGFyZ2V0OiBULCBzb3VyY2UxOiBVLCBzb3VyY2UyOiBWLCBzb3VyY2UzOiBXKTogVCAmIFUgJiBWICYgVztcblxuXHQvKipcblx0ICogQ29weSB0aGUgdmFsdWVzIG9mIGFsbCBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBmcm9tIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIGFcblx0ICogdGFyZ2V0IG9iamVjdC4gUmV0dXJucyB0aGUgdGFyZ2V0IG9iamVjdC5cblx0ICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCB0byBjb3B5IHRvLlxuXHQgKiBAcGFyYW0gc291cmNlcyBPbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllc1xuXHQgKi9cblx0KHRhcmdldDogb2JqZWN0LCAuLi5zb3VyY2VzOiBhbnlbXSk6IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPYmplY3RFbnRlcmllcyB7XG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGtleS92YWx1ZXMgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBhbiBvYmplY3Rcblx0ICogQHBhcmFtIG8gT2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMuIFRoaXMgY2FuIGJlIGFuIG9iamVjdCB0aGF0IHlvdSBjcmVhdGVkIG9yIGFuIGV4aXN0aW5nIERvY3VtZW50IE9iamVjdCBNb2RlbCAoRE9NKSBvYmplY3QuXG5cdCAqL1xuXHQ8VCBleHRlbmRzIHsgW2tleTogc3RyaW5nXTogYW55IH0sIEsgZXh0ZW5kcyBrZXlvZiBUPihvOiBUKTogW2tleW9mIFQsIFRbS11dW107XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYW4gYXJyYXkgb2Yga2V5L3ZhbHVlcyBvZiB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdFxuXHQgKiBAcGFyYW0gbyBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgcHJvcGVydGllcyBhbmQgbWV0aG9kcy4gVGhpcyBjYW4gYmUgYW4gb2JqZWN0IHRoYXQgeW91IGNyZWF0ZWQgb3IgYW4gZXhpc3RpbmcgRG9jdW1lbnQgT2JqZWN0IE1vZGVsIChET00pIG9iamVjdC5cblx0ICovXG5cdChvOiBvYmplY3QpOiBbc3RyaW5nLCBhbnldW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyB7XG5cdDxUPihvOiBUKTogeyBbSyBpbiBrZXlvZiBUXTogUHJvcGVydHlEZXNjcmlwdG9yIH07XG5cdChvOiBhbnkpOiB7IFtrZXk6IHN0cmluZ106IFByb3BlcnR5RGVzY3JpcHRvciB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9iamVjdFZhbHVlcyB7XG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHZhbHVlcyBvZiB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdFxuXHQgKiBAcGFyYW0gbyBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgcHJvcGVydGllcyBhbmQgbWV0aG9kcy4gVGhpcyBjYW4gYmUgYW4gb2JqZWN0IHRoYXQgeW91IGNyZWF0ZWQgb3IgYW4gZXhpc3RpbmcgRG9jdW1lbnQgT2JqZWN0IE1vZGVsIChET00pIG9iamVjdC5cblx0ICovXG5cdDxUPihvOiB7IFtzOiBzdHJpbmddOiBUIH0pOiBUW107XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYW4gYXJyYXkgb2YgdmFsdWVzIG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0XG5cdCAqIEBwYXJhbSBvIE9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzLiBUaGlzIGNhbiBiZSBhbiBvYmplY3QgdGhhdCB5b3UgY3JlYXRlZCBvciBhbiBleGlzdGluZyBEb2N1bWVudCBPYmplY3QgTW9kZWwgKERPTSkgb2JqZWN0LlxuXHQgKi9cblx0KG86IG9iamVjdCk6IGFueVtdO1xufVxuXG5leHBvcnQgbGV0IGFzc2lnbjogT2JqZWN0QXNzaWduO1xuXG4vKipcbiAqIEdldHMgdGhlIG93biBwcm9wZXJ0eSBkZXNjcmlwdG9yIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LlxuICogQW4gb3duIHByb3BlcnR5IGRlc2NyaXB0b3IgaXMgb25lIHRoYXQgaXMgZGVmaW5lZCBkaXJlY3RseSBvbiB0aGUgb2JqZWN0IGFuZCBpcyBub3RcbiAqIGluaGVyaXRlZCBmcm9tIHRoZSBvYmplY3QncyBwcm90b3R5cGUuXG4gKiBAcGFyYW0gbyBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgcHJvcGVydHkuXG4gKiBAcGFyYW0gcCBOYW1lIG9mIHRoZSBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGxldCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IDxULCBLIGV4dGVuZHMga2V5b2YgVD4obzogVCwgcHJvcGVydHlLZXk6IEspID0+IFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgb3duIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0LiBUaGUgb3duIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IGFyZSB0aG9zZSB0aGF0IGFyZSBkZWZpbmVkIGRpcmVjdGx5XG4gKiBvbiB0aGF0IG9iamVjdCwgYW5kIGFyZSBub3QgaW5oZXJpdGVkIGZyb20gdGhlIG9iamVjdCdzIHByb3RvdHlwZS4gVGhlIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IGluY2x1ZGUgYm90aCBmaWVsZHMgKG9iamVjdHMpIGFuZCBmdW5jdGlvbnMuXG4gKiBAcGFyYW0gbyBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgb3duIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBsZXQgZ2V0T3duUHJvcGVydHlOYW1lczogKG86IGFueSkgPT4gc3RyaW5nW107XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgc3ltYm9sIHByb3BlcnRpZXMgZm91bmQgZGlyZWN0bHkgb24gb2JqZWN0IG8uXG4gKiBAcGFyYW0gbyBPYmplY3QgdG8gcmV0cmlldmUgdGhlIHN5bWJvbHMgZnJvbS5cbiAqL1xuZXhwb3J0IGxldCBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6IChvOiBhbnkpID0+IHN5bWJvbFtdO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWVzIGFyZSB0aGUgc2FtZSB2YWx1ZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICogQHBhcmFtIHZhbHVlMSBUaGUgZmlyc3QgdmFsdWUuXG4gKiBAcGFyYW0gdmFsdWUyIFRoZSBzZWNvbmQgdmFsdWUuXG4gKi9cbmV4cG9ydCBsZXQgaXM6ICh2YWx1ZTE6IGFueSwgdmFsdWUyOiBhbnkpID0+IGJvb2xlYW47XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydGllcyBhbmQgbWV0aG9kcyBvZiBhbiBvYmplY3QuXG4gKiBAcGFyYW0gbyBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgcHJvcGVydGllcyBhbmQgbWV0aG9kcy4gVGhpcyBjYW4gYmUgYW4gb2JqZWN0IHRoYXQgeW91IGNyZWF0ZWQgb3IgYW4gZXhpc3RpbmcgRG9jdW1lbnQgT2JqZWN0IE1vZGVsIChET00pIG9iamVjdC5cbiAqL1xuZXhwb3J0IGxldCBrZXlzOiAobzogb2JqZWN0KSA9PiBzdHJpbmdbXTtcblxuLyogRVM3IE9iamVjdCBzdGF0aWMgbWV0aG9kcyAqL1xuXG5leHBvcnQgbGV0IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnM6IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7XG5cbmV4cG9ydCBsZXQgZW50cmllczogT2JqZWN0RW50ZXJpZXM7XG5cbmV4cG9ydCBsZXQgdmFsdWVzOiBPYmplY3RWYWx1ZXM7XG5cbmlmIChoYXMoJ2VzNi1vYmplY3QnKSkge1xuXHRjb25zdCBnbG9iYWxPYmplY3QgPSBnbG9iYWwuT2JqZWN0O1xuXHRhc3NpZ24gPSBnbG9iYWxPYmplY3QuYXNzaWduO1xuXHRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBnbG9iYWxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXHRnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZ2xvYmFsT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7XG5cdGdldE93blByb3BlcnR5U3ltYm9scyA9IGdsb2JhbE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cdGlzID0gZ2xvYmFsT2JqZWN0LmlzO1xuXHRrZXlzID0gZ2xvYmFsT2JqZWN0LmtleXM7XG59IGVsc2Uge1xuXHRrZXlzID0gZnVuY3Rpb24gc3ltYm9sQXdhcmVLZXlzKG86IG9iamVjdCk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gT2JqZWN0LmtleXMobykuZmlsdGVyKChrZXkpID0+ICFCb29sZWFuKGtleS5tYXRjaCgvXkBALisvKSkpO1xuXHR9O1xuXG5cdGFzc2lnbiA9IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQ6IGFueSwgLi4uc291cmNlczogYW55W10pIHtcblx0XHRpZiAodGFyZ2V0ID09IG51bGwpIHtcblx0XHRcdC8vIFR5cGVFcnJvciBpZiB1bmRlZmluZWQgb3IgbnVsbFxuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdG8gPSBPYmplY3QodGFyZ2V0KTtcblx0XHRzb3VyY2VzLmZvckVhY2goKG5leHRTb3VyY2UpID0+IHtcblx0XHRcdGlmIChuZXh0U291cmNlKSB7XG5cdFx0XHRcdC8vIFNraXAgb3ZlciBpZiB1bmRlZmluZWQgb3IgbnVsbFxuXHRcdFx0XHRrZXlzKG5leHRTb3VyY2UpLmZvckVhY2goKG5leHRLZXkpID0+IHtcblx0XHRcdFx0XHR0b1tuZXh0S2V5XSA9IG5leHRTb3VyY2VbbmV4dEtleV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHRvO1xuXHR9O1xuXG5cdGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihcblx0XHRvOiBhbnksXG5cdFx0cHJvcDogc3RyaW5nIHwgc3ltYm9sXG5cdCk6IFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKGlzU3ltYm9sKHByb3ApKSB7XG5cdFx0XHRyZXR1cm4gKDxhbnk+T2JqZWN0KS5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobywgcHJvcCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8sIHByb3ApO1xuXHRcdH1cblx0fTtcblxuXHRnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhvOiBhbnkpOiBzdHJpbmdbXSB7XG5cdFx0cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG8pLmZpbHRlcigoa2V5KSA9PiAhQm9vbGVhbihrZXkubWF0Y2goL15AQC4rLykpKTtcblx0fTtcblxuXHRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMobzogYW55KTogc3ltYm9sW10ge1xuXHRcdHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvKVxuXHRcdFx0LmZpbHRlcigoa2V5KSA9PiBCb29sZWFuKGtleS5tYXRjaCgvXkBALisvKSkpXG5cdFx0XHQubWFwKChrZXkpID0+IFN5bWJvbC5mb3Ioa2V5LnN1YnN0cmluZygyKSkpO1xuXHR9O1xuXG5cdGlzID0gZnVuY3Rpb24gaXModmFsdWUxOiBhbnksIHZhbHVlMjogYW55KTogYm9vbGVhbiB7XG5cdFx0aWYgKHZhbHVlMSA9PT0gdmFsdWUyKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWUxICE9PSAwIHx8IDEgLyB2YWx1ZTEgPT09IDEgLyB2YWx1ZTI7IC8vIC0wXG5cdFx0fVxuXHRcdHJldHVybiB2YWx1ZTEgIT09IHZhbHVlMSAmJiB2YWx1ZTIgIT09IHZhbHVlMjsgLy8gTmFOXG5cdH07XG59XG5cbmlmIChoYXMoJ2VzMjAxNy1vYmplY3QnKSkge1xuXHRjb25zdCBnbG9iYWxPYmplY3QgPSBnbG9iYWwuT2JqZWN0O1xuXHRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID0gZ2xvYmFsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7XG5cdGVudHJpZXMgPSBnbG9iYWxPYmplY3QuZW50cmllcztcblx0dmFsdWVzID0gZ2xvYmFsT2JqZWN0LnZhbHVlcztcbn0gZWxzZSB7XG5cdGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG86IGFueSkge1xuXHRcdHJldHVybiBnZXRPd25Qcm9wZXJ0eU5hbWVzKG8pLnJlZHVjZShcblx0XHRcdChwcmV2aW91cywga2V5KSA9PiB7XG5cdFx0XHRcdHByZXZpb3VzW2tleV0gPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobywga2V5KSE7XG5cdFx0XHRcdHJldHVybiBwcmV2aW91cztcblx0XHRcdH0sXG5cdFx0XHR7fSBhcyB7IFtrZXk6IHN0cmluZ106IFByb3BlcnR5RGVzY3JpcHRvciB9XG5cdFx0KTtcblx0fTtcblxuXHRlbnRyaWVzID0gZnVuY3Rpb24gZW50cmllcyhvOiBhbnkpOiBbc3RyaW5nLCBhbnldW10ge1xuXHRcdHJldHVybiBrZXlzKG8pLm1hcCgoa2V5KSA9PiBba2V5LCBvW2tleV1dIGFzIFtzdHJpbmcsIGFueV0pO1xuXHR9O1xuXG5cdHZhbHVlcyA9IGZ1bmN0aW9uIHZhbHVlcyhvOiBhbnkpOiBhbnlbXSB7XG5cdFx0cmV0dXJuIGtleXMobykubWFwKChrZXkpID0+IG9ba2V5XSk7XG5cdH07XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gb2JqZWN0LnRzIiwiaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XG5pbXBvcnQgaGFzIGZyb20gJy4vc3VwcG9ydC9oYXMnO1xuaW1wb3J0IHsgd3JhcE5hdGl2ZSB9IGZyb20gJy4vc3VwcG9ydC91dGlsJztcblxuZXhwb3J0IGludGVyZmFjZSBTdHJpbmdOb3JtYWxpemUge1xuXHQvKipcblx0ICogUmV0dXJucyB0aGUgU3RyaW5nIHZhbHVlIHJlc3VsdCBvZiBub3JtYWxpemluZyB0aGUgc3RyaW5nIGludG8gdGhlIG5vcm1hbGl6YXRpb24gZm9ybVxuXHQgKiBuYW1lZCBieSBmb3JtIGFzIHNwZWNpZmllZCBpbiBVbmljb2RlIFN0YW5kYXJkIEFubmV4ICMxNSwgVW5pY29kZSBOb3JtYWxpemF0aW9uIEZvcm1zLlxuXHQgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgc3RyaW5nXG5cdCAqIEBwYXJhbSBmb3JtIEFwcGxpY2FibGUgdmFsdWVzOiBcIk5GQ1wiLCBcIk5GRFwiLCBcIk5GS0NcIiwgb3IgXCJORktEXCIsIElmIG5vdCBzcGVjaWZpZWQgZGVmYXVsdFxuXHQgKiBpcyBcIk5GQ1wiXG5cdCAqL1xuXHQodGFyZ2V0OiBzdHJpbmcsIGZvcm06ICdORkMnIHwgJ05GRCcgfCAnTkZLQycgfCAnTkZLRCcpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIFN0cmluZyB2YWx1ZSByZXN1bHQgb2Ygbm9ybWFsaXppbmcgdGhlIHN0cmluZyBpbnRvIHRoZSBub3JtYWxpemF0aW9uIGZvcm1cblx0ICogbmFtZWQgYnkgZm9ybSBhcyBzcGVjaWZpZWQgaW4gVW5pY29kZSBTdGFuZGFyZCBBbm5leCAjMTUsIFVuaWNvZGUgTm9ybWFsaXphdGlvbiBGb3Jtcy5cblx0ICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHN0cmluZ1xuXHQgKiBAcGFyYW0gZm9ybSBBcHBsaWNhYmxlIHZhbHVlczogXCJORkNcIiwgXCJORkRcIiwgXCJORktDXCIsIG9yIFwiTkZLRFwiLCBJZiBub3Qgc3BlY2lmaWVkIGRlZmF1bHRcblx0ICogaXMgXCJORkNcIlxuXHQgKi9cblx0KHRhcmdldDogc3RyaW5nLCBmb3JtPzogc3RyaW5nKTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBtaW5pbXVtIGxvY2F0aW9uIG9mIGhpZ2ggc3Vycm9nYXRlc1xuICovXG5leHBvcnQgY29uc3QgSElHSF9TVVJST0dBVEVfTUlOID0gMHhkODAwO1xuXG4vKipcbiAqIFRoZSBtYXhpbXVtIGxvY2F0aW9uIG9mIGhpZ2ggc3Vycm9nYXRlc1xuICovXG5leHBvcnQgY29uc3QgSElHSF9TVVJST0dBVEVfTUFYID0gMHhkYmZmO1xuXG4vKipcbiAqIFRoZSBtaW5pbXVtIGxvY2F0aW9uIG9mIGxvdyBzdXJyb2dhdGVzXG4gKi9cbmV4cG9ydCBjb25zdCBMT1dfU1VSUk9HQVRFX01JTiA9IDB4ZGMwMDtcblxuLyoqXG4gKiBUaGUgbWF4aW11bSBsb2NhdGlvbiBvZiBsb3cgc3Vycm9nYXRlc1xuICovXG5leHBvcnQgY29uc3QgTE9XX1NVUlJPR0FURV9NQVggPSAweGRmZmY7XG5cbi8qIEVTNiBzdGF0aWMgbWV0aG9kcyAqL1xuXG4vKipcbiAqIFJldHVybiB0aGUgU3RyaW5nIHZhbHVlIHdob3NlIGVsZW1lbnRzIGFyZSwgaW4gb3JkZXIsIHRoZSBlbGVtZW50cyBpbiB0aGUgTGlzdCBlbGVtZW50cy5cbiAqIElmIGxlbmd0aCBpcyAwLCB0aGUgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLlxuICogQHBhcmFtIGNvZGVQb2ludHMgVGhlIGNvZGUgcG9pbnRzIHRvIGdlbmVyYXRlIHRoZSBzdHJpbmdcbiAqL1xuZXhwb3J0IGxldCBmcm9tQ29kZVBvaW50OiAoLi4uY29kZVBvaW50czogbnVtYmVyW10pID0+IHN0cmluZztcblxuLyoqXG4gKiBgcmF3YCBpcyBpbnRlbmRlZCBmb3IgdXNlIGFzIGEgdGFnIGZ1bmN0aW9uIG9mIGEgVGFnZ2VkIFRlbXBsYXRlIFN0cmluZy4gV2hlbiBjYWxsZWRcbiAqIGFzIHN1Y2ggdGhlIGZpcnN0IGFyZ3VtZW50IHdpbGwgYmUgYSB3ZWxsIGZvcm1lZCB0ZW1wbGF0ZSBjYWxsIHNpdGUgb2JqZWN0IGFuZCB0aGUgcmVzdFxuICogcGFyYW1ldGVyIHdpbGwgY29udGFpbiB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcy5cbiAqIEBwYXJhbSB0ZW1wbGF0ZSBBIHdlbGwtZm9ybWVkIHRlbXBsYXRlIHN0cmluZyBjYWxsIHNpdGUgcmVwcmVzZW50YXRpb24uXG4gKiBAcGFyYW0gc3Vic3RpdHV0aW9ucyBBIHNldCBvZiBzdWJzdGl0dXRpb24gdmFsdWVzLlxuICovXG5leHBvcnQgbGV0IHJhdzogKHRlbXBsYXRlOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSwgLi4uc3Vic3RpdHV0aW9uczogYW55W10pID0+IHN0cmluZztcblxuLyogRVM2IGluc3RhbmNlIG1ldGhvZHMgKi9cblxuLyoqXG4gKiBSZXR1cm5zIGEgbm9ubmVnYXRpdmUgaW50ZWdlciBOdW1iZXIgbGVzcyB0aGFuIDExMTQxMTIgKDB4MTEwMDAwKSB0aGF0IGlzIHRoZSBjb2RlIHBvaW50XG4gKiB2YWx1ZSBvZiB0aGUgVVRGLTE2IGVuY29kZWQgY29kZSBwb2ludCBzdGFydGluZyBhdCB0aGUgc3RyaW5nIGVsZW1lbnQgYXQgcG9zaXRpb24gcG9zIGluXG4gKiB0aGUgU3RyaW5nIHJlc3VsdGluZyBmcm9tIGNvbnZlcnRpbmcgdGhpcyBvYmplY3QgdG8gYSBTdHJpbmcuXG4gKiBJZiB0aGVyZSBpcyBubyBlbGVtZW50IGF0IHRoYXQgcG9zaXRpb24sIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLlxuICogSWYgYSB2YWxpZCBVVEYtMTYgc3Vycm9nYXRlIHBhaXIgZG9lcyBub3QgYmVnaW4gYXQgcG9zLCB0aGUgcmVzdWx0IGlzIHRoZSBjb2RlIHVuaXQgYXQgcG9zLlxuICovXG5leHBvcnQgbGV0IGNvZGVQb2ludEF0OiAodGFyZ2V0OiBzdHJpbmcsIHBvcz86IG51bWJlcikgPT4gbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VxdWVuY2Ugb2YgZWxlbWVudHMgb2Ygc2VhcmNoU3RyaW5nIGNvbnZlcnRlZCB0byBhIFN0cmluZyBpcyB0aGVcbiAqIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgdGhpcyBvYmplY3QgKGNvbnZlcnRlZCB0byBhIFN0cmluZykgc3RhcnRpbmcgYXRcbiAqIGVuZFBvc2l0aW9uIOKAkyBsZW5ndGgodGhpcykuIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlLlxuICovXG5leHBvcnQgbGV0IGVuZHNXaXRoOiAodGFyZ2V0OiBzdHJpbmcsIHNlYXJjaFN0cmluZzogc3RyaW5nLCBlbmRQb3NpdGlvbj86IG51bWJlcikgPT4gYm9vbGVhbjtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgc2VhcmNoU3RyaW5nIGFwcGVhcnMgYXMgYSBzdWJzdHJpbmcgb2YgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoaXNcbiAqIG9iamVjdCB0byBhIFN0cmluZywgYXQgb25lIG9yIG1vcmUgcG9zaXRpb25zIHRoYXQgYXJlXG4gKiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gcG9zaXRpb247IG90aGVyd2lzZSwgcmV0dXJucyBmYWxzZS5cbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBzdHJpbmdcbiAqIEBwYXJhbSBzZWFyY2hTdHJpbmcgc2VhcmNoIHN0cmluZ1xuICogQHBhcmFtIHBvc2l0aW9uIElmIHBvc2l0aW9uIGlzIHVuZGVmaW5lZCwgMCBpcyBhc3N1bWVkLCBzbyBhcyB0byBzZWFyY2ggYWxsIG9mIHRoZSBTdHJpbmcuXG4gKi9cbmV4cG9ydCBsZXQgaW5jbHVkZXM6ICh0YXJnZXQ6IHN0cmluZywgc2VhcmNoU3RyaW5nOiBzdHJpbmcsIHBvc2l0aW9uPzogbnVtYmVyKSA9PiBib29sZWFuO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIFN0cmluZyB2YWx1ZSByZXN1bHQgb2Ygbm9ybWFsaXppbmcgdGhlIHN0cmluZyBpbnRvIHRoZSBub3JtYWxpemF0aW9uIGZvcm1cbiAqIG5hbWVkIGJ5IGZvcm0gYXMgc3BlY2lmaWVkIGluIFVuaWNvZGUgU3RhbmRhcmQgQW5uZXggIzE1LCBVbmljb2RlIE5vcm1hbGl6YXRpb24gRm9ybXMuXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgc3RyaW5nXG4gKiBAcGFyYW0gZm9ybSBBcHBsaWNhYmxlIHZhbHVlczogXCJORkNcIiwgXCJORkRcIiwgXCJORktDXCIsIG9yIFwiTkZLRFwiLCBJZiBub3Qgc3BlY2lmaWVkIGRlZmF1bHRcbiAqIGlzIFwiTkZDXCJcbiAqL1xuZXhwb3J0IGxldCBub3JtYWxpemU6IFN0cmluZ05vcm1hbGl6ZTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgU3RyaW5nIHZhbHVlIHRoYXQgaXMgbWFkZSBmcm9tIGNvdW50IGNvcGllcyBhcHBlbmRlZCB0b2dldGhlci4gSWYgY291bnQgaXMgMCxcbiAqIFQgaXMgdGhlIGVtcHR5IFN0cmluZyBpcyByZXR1cm5lZC5cbiAqIEBwYXJhbSBjb3VudCBudW1iZXIgb2YgY29waWVzIHRvIGFwcGVuZFxuICovXG5leHBvcnQgbGV0IHJlcGVhdDogKHRhcmdldDogc3RyaW5nLCBjb3VudD86IG51bWJlcikgPT4gc3RyaW5nO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VxdWVuY2Ugb2YgZWxlbWVudHMgb2Ygc2VhcmNoU3RyaW5nIGNvbnZlcnRlZCB0byBhIFN0cmluZyBpcyB0aGVcbiAqIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgdGhpcyBvYmplY3QgKGNvbnZlcnRlZCB0byBhIFN0cmluZykgc3RhcnRpbmcgYXRcbiAqIHBvc2l0aW9uLiBPdGhlcndpc2UgcmV0dXJucyBmYWxzZS5cbiAqL1xuZXhwb3J0IGxldCBzdGFydHNXaXRoOiAodGFyZ2V0OiBzdHJpbmcsIHNlYXJjaFN0cmluZzogc3RyaW5nLCBwb3NpdGlvbj86IG51bWJlcikgPT4gYm9vbGVhbjtcblxuLyogRVM3IGluc3RhbmNlIG1ldGhvZHMgKi9cblxuLyoqXG4gKiBQYWRzIHRoZSBjdXJyZW50IHN0cmluZyB3aXRoIGEgZ2l2ZW4gc3RyaW5nIChwb3NzaWJseSByZXBlYXRlZCkgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHN0cmluZyByZWFjaGVzIGEgZ2l2ZW4gbGVuZ3RoLlxuICogVGhlIHBhZGRpbmcgaXMgYXBwbGllZCBmcm9tIHRoZSBlbmQgKHJpZ2h0KSBvZiB0aGUgY3VycmVudCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHN0cmluZ1xuICogQHBhcmFtIG1heExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nIG9uY2UgdGhlIGN1cnJlbnQgc3RyaW5nIGhhcyBiZWVuIHBhZGRlZC5cbiAqICAgICAgICBJZiB0aGlzIHBhcmFtZXRlciBpcyBzbWFsbGVyIHRoYW4gdGhlIGN1cnJlbnQgc3RyaW5nJ3MgbGVuZ3RoLCB0aGUgY3VycmVudCBzdHJpbmcgd2lsbCBiZSByZXR1cm5lZCBhcyBpdCBpcy5cbiAqXG4gKiBAcGFyYW0gZmlsbFN0cmluZyBUaGUgc3RyaW5nIHRvIHBhZCB0aGUgY3VycmVudCBzdHJpbmcgd2l0aC5cbiAqICAgICAgICBJZiB0aGlzIHN0cmluZyBpcyB0b28gbG9uZywgaXQgd2lsbCBiZSB0cnVuY2F0ZWQgYW5kIHRoZSBsZWZ0LW1vc3QgcGFydCB3aWxsIGJlIGFwcGxpZWQuXG4gKiAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlzIFwiIFwiIChVKzAwMjApLlxuICovXG5leHBvcnQgbGV0IHBhZEVuZDogKHRhcmdldDogc3RyaW5nLCBtYXhMZW5ndGg6IG51bWJlciwgZmlsbFN0cmluZz86IHN0cmluZykgPT4gc3RyaW5nO1xuXG4vKipcbiAqIFBhZHMgdGhlIGN1cnJlbnQgc3RyaW5nIHdpdGggYSBnaXZlbiBzdHJpbmcgKHBvc3NpYmx5IHJlcGVhdGVkKSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgc3RyaW5nIHJlYWNoZXMgYSBnaXZlbiBsZW5ndGguXG4gKiBUaGUgcGFkZGluZyBpcyBhcHBsaWVkIGZyb20gdGhlIHN0YXJ0IChsZWZ0KSBvZiB0aGUgY3VycmVudCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHN0cmluZ1xuICogQHBhcmFtIG1heExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nIG9uY2UgdGhlIGN1cnJlbnQgc3RyaW5nIGhhcyBiZWVuIHBhZGRlZC5cbiAqICAgICAgICBJZiB0aGlzIHBhcmFtZXRlciBpcyBzbWFsbGVyIHRoYW4gdGhlIGN1cnJlbnQgc3RyaW5nJ3MgbGVuZ3RoLCB0aGUgY3VycmVudCBzdHJpbmcgd2lsbCBiZSByZXR1cm5lZCBhcyBpdCBpcy5cbiAqXG4gKiBAcGFyYW0gZmlsbFN0cmluZyBUaGUgc3RyaW5nIHRvIHBhZCB0aGUgY3VycmVudCBzdHJpbmcgd2l0aC5cbiAqICAgICAgICBJZiB0aGlzIHN0cmluZyBpcyB0b28gbG9uZywgaXQgd2lsbCBiZSB0cnVuY2F0ZWQgYW5kIHRoZSBsZWZ0LW1vc3QgcGFydCB3aWxsIGJlIGFwcGxpZWQuXG4gKiAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlzIFwiIFwiIChVKzAwMjApLlxuICovXG5leHBvcnQgbGV0IHBhZFN0YXJ0OiAodGFyZ2V0OiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyLCBmaWxsU3RyaW5nPzogc3RyaW5nKSA9PiBzdHJpbmc7XG5cbmlmIChoYXMoJ2VzNi1zdHJpbmcnKSAmJiBoYXMoJ2VzNi1zdHJpbmctcmF3JykpIHtcblx0ZnJvbUNvZGVQb2ludCA9IGdsb2JhbC5TdHJpbmcuZnJvbUNvZGVQb2ludDtcblx0cmF3ID0gZ2xvYmFsLlN0cmluZy5yYXc7XG5cblx0Y29kZVBvaW50QXQgPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0KTtcblx0ZW5kc1dpdGggPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoKTtcblx0aW5jbHVkZXMgPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzKTtcblx0bm9ybWFsaXplID0gd3JhcE5hdGl2ZShnbG9iYWwuU3RyaW5nLnByb3RvdHlwZS5ub3JtYWxpemUpO1xuXHRyZXBlYXQgPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLnJlcGVhdCk7XG5cdHN0YXJ0c1dpdGggPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGgpO1xufSBlbHNlIHtcblx0LyoqXG5cdCAqIFZhbGlkYXRlcyB0aGF0IHRleHQgaXMgZGVmaW5lZCwgYW5kIG5vcm1hbGl6ZXMgcG9zaXRpb24gKGJhc2VkIG9uIHRoZSBnaXZlbiBkZWZhdWx0IGlmIHRoZSBpbnB1dCBpcyBOYU4pLlxuXHQgKiBVc2VkIGJ5IHN0YXJ0c1dpdGgsIGluY2x1ZGVzLCBhbmQgZW5kc1dpdGguXG5cdCAqXG5cdCAqIEByZXR1cm4gTm9ybWFsaXplZCBwb3NpdGlvbi5cblx0ICovXG5cdGNvbnN0IG5vcm1hbGl6ZVN1YnN0cmluZ0FyZ3MgPSBmdW5jdGlvbihcblx0XHRuYW1lOiBzdHJpbmcsXG5cdFx0dGV4dDogc3RyaW5nLFxuXHRcdHNlYXJjaDogc3RyaW5nLFxuXHRcdHBvc2l0aW9uOiBudW1iZXIsXG5cdFx0aXNFbmQ6IGJvb2xlYW4gPSBmYWxzZVxuXHQpOiBbc3RyaW5nLCBzdHJpbmcsIG51bWJlcl0ge1xuXHRcdGlmICh0ZXh0ID09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmluZy4nICsgbmFtZSArICcgcmVxdWlyZXMgYSB2YWxpZCBzdHJpbmcgdG8gc2VhcmNoIGFnYWluc3QuJyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbGVuZ3RoID0gdGV4dC5sZW5ndGg7XG5cdFx0cG9zaXRpb24gPSBwb3NpdGlvbiAhPT0gcG9zaXRpb24gPyAoaXNFbmQgPyBsZW5ndGggOiAwKSA6IHBvc2l0aW9uO1xuXHRcdHJldHVybiBbdGV4dCwgU3RyaW5nKHNlYXJjaCksIE1hdGgubWluKE1hdGgubWF4KHBvc2l0aW9uLCAwKSwgbGVuZ3RoKV07XG5cdH07XG5cblx0ZnJvbUNvZGVQb2ludCA9IGZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoLi4uY29kZVBvaW50czogbnVtYmVyW10pOiBzdHJpbmcge1xuXHRcdC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcuZnJvbUNvZGVQb2ludFxuXHRcdGNvbnN0IGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cdFx0aWYgKCFsZW5ndGgpIHtcblx0XHRcdHJldHVybiAnJztcblx0XHR9XG5cblx0XHRjb25zdCBmcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xuXHRcdGNvbnN0IE1BWF9TSVpFID0gMHg0MDAwO1xuXHRcdGxldCBjb2RlVW5pdHM6IG51bWJlcltdID0gW107XG5cdFx0bGV0IGluZGV4ID0gLTE7XG5cdFx0bGV0IHJlc3VsdCA9ICcnO1xuXG5cdFx0d2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcblx0XHRcdGxldCBjb2RlUG9pbnQgPSBOdW1iZXIoYXJndW1lbnRzW2luZGV4XSk7XG5cblx0XHRcdC8vIENvZGUgcG9pbnRzIG11c3QgYmUgZmluaXRlIGludGVnZXJzIHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2Vcblx0XHRcdGxldCBpc1ZhbGlkID1cblx0XHRcdFx0aXNGaW5pdGUoY29kZVBvaW50KSAmJiBNYXRoLmZsb29yKGNvZGVQb2ludCkgPT09IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPj0gMCAmJiBjb2RlUG9pbnQgPD0gMHgxMGZmZmY7XG5cdFx0XHRpZiAoIWlzVmFsaWQpIHtcblx0XHRcdFx0dGhyb3cgUmFuZ2VFcnJvcignc3RyaW5nLmZyb21Db2RlUG9pbnQ6IEludmFsaWQgY29kZSBwb2ludCAnICsgY29kZVBvaW50KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNvZGVQb2ludCA8PSAweGZmZmYpIHtcblx0XHRcdFx0Ly8gQk1QIGNvZGUgcG9pbnRcblx0XHRcdFx0Y29kZVVuaXRzLnB1c2goY29kZVBvaW50KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEFzdHJhbCBjb2RlIHBvaW50OyBzcGxpdCBpbiBzdXJyb2dhdGUgaGFsdmVzXG5cdFx0XHRcdC8vIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nI3N1cnJvZ2F0ZS1mb3JtdWxhZVxuXHRcdFx0XHRjb2RlUG9pbnQgLT0gMHgxMDAwMDtcblx0XHRcdFx0bGV0IGhpZ2hTdXJyb2dhdGUgPSAoY29kZVBvaW50ID4+IDEwKSArIEhJR0hfU1VSUk9HQVRFX01JTjtcblx0XHRcdFx0bGV0IGxvd1N1cnJvZ2F0ZSA9IGNvZGVQb2ludCAlIDB4NDAwICsgTE9XX1NVUlJPR0FURV9NSU47XG5cdFx0XHRcdGNvZGVVbml0cy5wdXNoKGhpZ2hTdXJyb2dhdGUsIGxvd1N1cnJvZ2F0ZSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpbmRleCArIDEgPT09IGxlbmd0aCB8fCBjb2RlVW5pdHMubGVuZ3RoID4gTUFYX1NJWkUpIHtcblx0XHRcdFx0cmVzdWx0ICs9IGZyb21DaGFyQ29kZS5hcHBseShudWxsLCBjb2RlVW5pdHMpO1xuXHRcdFx0XHRjb2RlVW5pdHMubGVuZ3RoID0gMDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fTtcblxuXHRyYXcgPSBmdW5jdGlvbiByYXcoY2FsbFNpdGU6IFRlbXBsYXRlU3RyaW5nc0FycmF5LCAuLi5zdWJzdGl0dXRpb25zOiBhbnlbXSk6IHN0cmluZyB7XG5cdFx0bGV0IHJhd1N0cmluZ3MgPSBjYWxsU2l0ZS5yYXc7XG5cdFx0bGV0IHJlc3VsdCA9ICcnO1xuXHRcdGxldCBudW1TdWJzdGl0dXRpb25zID0gc3Vic3RpdHV0aW9ucy5sZW5ndGg7XG5cblx0XHRpZiAoY2FsbFNpdGUgPT0gbnVsbCB8fCBjYWxsU2l0ZS5yYXcgPT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignc3RyaW5nLnJhdyByZXF1aXJlcyBhIHZhbGlkIGNhbGxTaXRlIG9iamVjdCB3aXRoIGEgcmF3IHZhbHVlJyk7XG5cdFx0fVxuXG5cdFx0Zm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IHJhd1N0cmluZ3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0XHRcdHJlc3VsdCArPSByYXdTdHJpbmdzW2ldICsgKGkgPCBudW1TdWJzdGl0dXRpb25zICYmIGkgPCBsZW5ndGggLSAxID8gc3Vic3RpdHV0aW9uc1tpXSA6ICcnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9O1xuXG5cdGNvZGVQb2ludEF0ID0gZnVuY3Rpb24gY29kZVBvaW50QXQodGV4dDogc3RyaW5nLCBwb3NpdGlvbjogbnVtYmVyID0gMCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG5cdFx0Ly8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXRcblx0XHRpZiAodGV4dCA9PSBudWxsKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJpbmcuY29kZVBvaW50QXQgcmVxdXJpZXMgYSB2YWxpZCBzdHJpbmcuJyk7XG5cdFx0fVxuXHRcdGNvbnN0IGxlbmd0aCA9IHRleHQubGVuZ3RoO1xuXG5cdFx0aWYgKHBvc2l0aW9uICE9PSBwb3NpdGlvbikge1xuXHRcdFx0cG9zaXRpb24gPSAwO1xuXHRcdH1cblx0XHRpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID49IGxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBHZXQgdGhlIGZpcnN0IGNvZGUgdW5pdFxuXHRcdGNvbnN0IGZpcnN0ID0gdGV4dC5jaGFyQ29kZUF0KHBvc2l0aW9uKTtcblx0XHRpZiAoZmlyc3QgPj0gSElHSF9TVVJST0dBVEVfTUlOICYmIGZpcnN0IDw9IEhJR0hfU1VSUk9HQVRFX01BWCAmJiBsZW5ndGggPiBwb3NpdGlvbiArIDEpIHtcblx0XHRcdC8vIFN0YXJ0IG9mIGEgc3Vycm9nYXRlIHBhaXIgKGhpZ2ggc3Vycm9nYXRlIGFuZCB0aGVyZSBpcyBhIG5leHQgY29kZSB1bml0KTsgY2hlY2sgZm9yIGxvdyBzdXJyb2dhdGVcblx0XHRcdC8vIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nI3N1cnJvZ2F0ZS1mb3JtdWxhZVxuXHRcdFx0Y29uc3Qgc2Vjb25kID0gdGV4dC5jaGFyQ29kZUF0KHBvc2l0aW9uICsgMSk7XG5cdFx0XHRpZiAoc2Vjb25kID49IExPV19TVVJST0dBVEVfTUlOICYmIHNlY29uZCA8PSBMT1dfU1VSUk9HQVRFX01BWCkge1xuXHRcdFx0XHRyZXR1cm4gKGZpcnN0IC0gSElHSF9TVVJST0dBVEVfTUlOKSAqIDB4NDAwICsgc2Vjb25kIC0gTE9XX1NVUlJPR0FURV9NSU4gKyAweDEwMDAwO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmlyc3Q7XG5cdH07XG5cblx0ZW5kc1dpdGggPSBmdW5jdGlvbiBlbmRzV2l0aCh0ZXh0OiBzdHJpbmcsIHNlYXJjaDogc3RyaW5nLCBlbmRQb3NpdGlvbj86IG51bWJlcik6IGJvb2xlYW4ge1xuXHRcdGlmIChlbmRQb3NpdGlvbiA9PSBudWxsKSB7XG5cdFx0XHRlbmRQb3NpdGlvbiA9IHRleHQubGVuZ3RoO1xuXHRcdH1cblxuXHRcdFt0ZXh0LCBzZWFyY2gsIGVuZFBvc2l0aW9uXSA9IG5vcm1hbGl6ZVN1YnN0cmluZ0FyZ3MoJ2VuZHNXaXRoJywgdGV4dCwgc2VhcmNoLCBlbmRQb3NpdGlvbiwgdHJ1ZSk7XG5cblx0XHRjb25zdCBzdGFydCA9IGVuZFBvc2l0aW9uIC0gc2VhcmNoLmxlbmd0aDtcblx0XHRpZiAoc3RhcnQgPCAwKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRleHQuc2xpY2Uoc3RhcnQsIGVuZFBvc2l0aW9uKSA9PT0gc2VhcmNoO1xuXHR9O1xuXG5cdGluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXModGV4dDogc3RyaW5nLCBzZWFyY2g6IHN0cmluZywgcG9zaXRpb246IG51bWJlciA9IDApOiBib29sZWFuIHtcblx0XHRbdGV4dCwgc2VhcmNoLCBwb3NpdGlvbl0gPSBub3JtYWxpemVTdWJzdHJpbmdBcmdzKCdpbmNsdWRlcycsIHRleHQsIHNlYXJjaCwgcG9zaXRpb24pO1xuXHRcdHJldHVybiB0ZXh0LmluZGV4T2Yoc2VhcmNoLCBwb3NpdGlvbikgIT09IC0xO1xuXHR9O1xuXG5cdHJlcGVhdCA9IGZ1bmN0aW9uIHJlcGVhdCh0ZXh0OiBzdHJpbmcsIGNvdW50OiBudW1iZXIgPSAwKTogc3RyaW5nIHtcblx0XHQvLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL21hdGhpYXNieW5lbnMvU3RyaW5nLnByb3RvdHlwZS5yZXBlYXRcblx0XHRpZiAodGV4dCA9PSBudWxsKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJpbmcucmVwZWF0IHJlcXVpcmVzIGEgdmFsaWQgc3RyaW5nLicpO1xuXHRcdH1cblx0XHRpZiAoY291bnQgIT09IGNvdW50KSB7XG5cdFx0XHRjb3VudCA9IDA7XG5cdFx0fVxuXHRcdGlmIChjb3VudCA8IDAgfHwgY291bnQgPT09IEluZmluaXR5KSB7XG5cdFx0XHR0aHJvdyBuZXcgUmFuZ2VFcnJvcignc3RyaW5nLnJlcGVhdCByZXF1aXJlcyBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgY291bnQuJyk7XG5cdFx0fVxuXG5cdFx0bGV0IHJlc3VsdCA9ICcnO1xuXHRcdHdoaWxlIChjb3VudCkge1xuXHRcdFx0aWYgKGNvdW50ICUgMikge1xuXHRcdFx0XHRyZXN1bHQgKz0gdGV4dDtcblx0XHRcdH1cblx0XHRcdGlmIChjb3VudCA+IDEpIHtcblx0XHRcdFx0dGV4dCArPSB0ZXh0O1xuXHRcdFx0fVxuXHRcdFx0Y291bnQgPj49IDE7XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cblx0c3RhcnRzV2l0aCA9IGZ1bmN0aW9uIHN0YXJ0c1dpdGgodGV4dDogc3RyaW5nLCBzZWFyY2g6IHN0cmluZywgcG9zaXRpb246IG51bWJlciA9IDApOiBib29sZWFuIHtcblx0XHRzZWFyY2ggPSBTdHJpbmcoc2VhcmNoKTtcblx0XHRbdGV4dCwgc2VhcmNoLCBwb3NpdGlvbl0gPSBub3JtYWxpemVTdWJzdHJpbmdBcmdzKCdzdGFydHNXaXRoJywgdGV4dCwgc2VhcmNoLCBwb3NpdGlvbik7XG5cblx0XHRjb25zdCBlbmQgPSBwb3NpdGlvbiArIHNlYXJjaC5sZW5ndGg7XG5cdFx0aWYgKGVuZCA+IHRleHQubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRleHQuc2xpY2UocG9zaXRpb24sIGVuZCkgPT09IHNlYXJjaDtcblx0fTtcbn1cblxuaWYgKGhhcygnZXMyMDE3LXN0cmluZycpKSB7XG5cdHBhZEVuZCA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUucGFkRW5kKTtcblx0cGFkU3RhcnQgPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLnBhZFN0YXJ0KTtcbn0gZWxzZSB7XG5cdHBhZEVuZCA9IGZ1bmN0aW9uIHBhZEVuZCh0ZXh0OiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyLCBmaWxsU3RyaW5nOiBzdHJpbmcgPSAnICcpOiBzdHJpbmcge1xuXHRcdGlmICh0ZXh0ID09PSBudWxsIHx8IHRleHQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignc3RyaW5nLnJlcGVhdCByZXF1aXJlcyBhIHZhbGlkIHN0cmluZy4nKTtcblx0XHR9XG5cblx0XHRpZiAobWF4TGVuZ3RoID09PSBJbmZpbml0eSkge1xuXHRcdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3N0cmluZy5wYWRFbmQgcmVxdWlyZXMgYSBub24tbmVnYXRpdmUgZmluaXRlIGNvdW50LicpO1xuXHRcdH1cblxuXHRcdGlmIChtYXhMZW5ndGggPT09IG51bGwgfHwgbWF4TGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbWF4TGVuZ3RoIDwgMCkge1xuXHRcdFx0bWF4TGVuZ3RoID0gMDtcblx0XHR9XG5cblx0XHRsZXQgc3RyVGV4dCA9IFN0cmluZyh0ZXh0KTtcblx0XHRjb25zdCBwYWRkaW5nID0gbWF4TGVuZ3RoIC0gc3RyVGV4dC5sZW5ndGg7XG5cblx0XHRpZiAocGFkZGluZyA+IDApIHtcblx0XHRcdHN0clRleHQgKz1cblx0XHRcdFx0cmVwZWF0KGZpbGxTdHJpbmcsIE1hdGguZmxvb3IocGFkZGluZyAvIGZpbGxTdHJpbmcubGVuZ3RoKSkgK1xuXHRcdFx0XHRmaWxsU3RyaW5nLnNsaWNlKDAsIHBhZGRpbmcgJSBmaWxsU3RyaW5nLmxlbmd0aCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHN0clRleHQ7XG5cdH07XG5cblx0cGFkU3RhcnQgPSBmdW5jdGlvbiBwYWRTdGFydCh0ZXh0OiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyLCBmaWxsU3RyaW5nOiBzdHJpbmcgPSAnICcpOiBzdHJpbmcge1xuXHRcdGlmICh0ZXh0ID09PSBudWxsIHx8IHRleHQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignc3RyaW5nLnJlcGVhdCByZXF1aXJlcyBhIHZhbGlkIHN0cmluZy4nKTtcblx0XHR9XG5cblx0XHRpZiAobWF4TGVuZ3RoID09PSBJbmZpbml0eSkge1xuXHRcdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3N0cmluZy5wYWRTdGFydCByZXF1aXJlcyBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgY291bnQuJyk7XG5cdFx0fVxuXG5cdFx0aWYgKG1heExlbmd0aCA9PT0gbnVsbCB8fCBtYXhMZW5ndGggPT09IHVuZGVmaW5lZCB8fCBtYXhMZW5ndGggPCAwKSB7XG5cdFx0XHRtYXhMZW5ndGggPSAwO1xuXHRcdH1cblxuXHRcdGxldCBzdHJUZXh0ID0gU3RyaW5nKHRleHQpO1xuXHRcdGNvbnN0IHBhZGRpbmcgPSBtYXhMZW5ndGggLSBzdHJUZXh0Lmxlbmd0aDtcblxuXHRcdGlmIChwYWRkaW5nID4gMCkge1xuXHRcdFx0c3RyVGV4dCA9XG5cdFx0XHRcdHJlcGVhdChmaWxsU3RyaW5nLCBNYXRoLmZsb29yKHBhZGRpbmcgLyBmaWxsU3RyaW5nLmxlbmd0aCkpICtcblx0XHRcdFx0ZmlsbFN0cmluZy5zbGljZSgwLCBwYWRkaW5nICUgZmlsbFN0cmluZy5sZW5ndGgpICtcblx0XHRcdFx0c3RyVGV4dDtcblx0XHR9XG5cblx0XHRyZXR1cm4gc3RyVGV4dDtcblx0fTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBzdHJpbmcudHMiLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4uL2dsb2JhbCc7XG5pbXBvcnQgaGFzIGZyb20gJy4vaGFzJztcbmltcG9ydCB7IEhhbmRsZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuXG5mdW5jdGlvbiBleGVjdXRlVGFzayhpdGVtOiBRdWV1ZUl0ZW0gfCB1bmRlZmluZWQpOiB2b2lkIHtcblx0aWYgKGl0ZW0gJiYgaXRlbS5pc0FjdGl2ZSAmJiBpdGVtLmNhbGxiYWNrKSB7XG5cdFx0aXRlbS5jYWxsYmFjaygpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldFF1ZXVlSGFuZGxlKGl0ZW06IFF1ZXVlSXRlbSwgZGVzdHJ1Y3Rvcj86ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55KTogSGFuZGxlIHtcblx0cmV0dXJuIHtcblx0XHRkZXN0cm95OiBmdW5jdGlvbih0aGlzOiBIYW5kbGUpIHtcblx0XHRcdHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uKCkge307XG5cdFx0XHRpdGVtLmlzQWN0aXZlID0gZmFsc2U7XG5cdFx0XHRpdGVtLmNhbGxiYWNrID0gbnVsbDtcblxuXHRcdFx0aWYgKGRlc3RydWN0b3IpIHtcblx0XHRcdFx0ZGVzdHJ1Y3RvcigpO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuaW50ZXJmYWNlIFBvc3RNZXNzYWdlRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG5cdHNvdXJjZTogYW55O1xuXHRkYXRhOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVldWVJdGVtIHtcblx0aXNBY3RpdmU6IGJvb2xlYW47XG5cdGNhbGxiYWNrOiBudWxsIHwgKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KTtcbn1cblxubGV0IGNoZWNrTWljcm9UYXNrUXVldWU6ICgpID0+IHZvaWQ7XG5sZXQgbWljcm9UYXNrczogUXVldWVJdGVtW107XG5cbi8qKlxuICogU2NoZWR1bGVzIGEgY2FsbGJhY2sgdG8gdGhlIG1hY3JvdGFzayBxdWV1ZS5cbiAqXG4gKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGJlIHF1ZXVlZCBhbmQgbGF0ZXIgZXhlY3V0ZWQuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBhIGBkZXN0cm95YCBtZXRob2QgdGhhdCwgd2hlbiBjYWxsZWQsIHByZXZlbnRzIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZyb20gZXhlY3V0aW5nLlxuICovXG5leHBvcnQgY29uc3QgcXVldWVUYXNrID0gKGZ1bmN0aW9uKCkge1xuXHRsZXQgZGVzdHJ1Y3RvcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk7XG5cdGxldCBlbnF1ZXVlOiAoaXRlbTogUXVldWVJdGVtKSA9PiB2b2lkO1xuXG5cdC8vIFNpbmNlIHRoZSBJRSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0SW1tZWRpYXRlYCBpcyBub3QgZmxhd2xlc3MsIHdlIHdpbGwgdGVzdCBmb3IgYHBvc3RNZXNzYWdlYCBmaXJzdC5cblx0aWYgKGhhcygncG9zdG1lc3NhZ2UnKSkge1xuXHRcdGNvbnN0IHF1ZXVlOiBRdWV1ZUl0ZW1bXSA9IFtdO1xuXG5cdFx0Z2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbihldmVudDogUG9zdE1lc3NhZ2VFdmVudCk6IHZvaWQge1xuXHRcdFx0Ly8gQ29uZmlybSB0aGF0IHRoZSBldmVudCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSBjdXJyZW50IHdpbmRvdyBhbmQgYnkgdGhpcyBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uLlxuXHRcdFx0aWYgKGV2ZW50LnNvdXJjZSA9PT0gZ2xvYmFsICYmIGV2ZW50LmRhdGEgPT09ICdkb2pvLXF1ZXVlLW1lc3NhZ2UnKSB7XG5cdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0XHRcdGlmIChxdWV1ZS5sZW5ndGgpIHtcblx0XHRcdFx0XHRleGVjdXRlVGFzayhxdWV1ZS5zaGlmdCgpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0ZW5xdWV1ZSA9IGZ1bmN0aW9uKGl0ZW06IFF1ZXVlSXRlbSk6IHZvaWQge1xuXHRcdFx0cXVldWUucHVzaChpdGVtKTtcblx0XHRcdGdsb2JhbC5wb3N0TWVzc2FnZSgnZG9qby1xdWV1ZS1tZXNzYWdlJywgJyonKTtcblx0XHR9O1xuXHR9IGVsc2UgaWYgKGhhcygnc2V0aW1tZWRpYXRlJykpIHtcblx0XHRkZXN0cnVjdG9yID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlO1xuXHRcdGVucXVldWUgPSBmdW5jdGlvbihpdGVtOiBRdWV1ZUl0ZW0pOiBhbnkge1xuXHRcdFx0cmV0dXJuIHNldEltbWVkaWF0ZShleGVjdXRlVGFzay5iaW5kKG51bGwsIGl0ZW0pKTtcblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdGRlc3RydWN0b3IgPSBnbG9iYWwuY2xlYXJUaW1lb3V0O1xuXHRcdGVucXVldWUgPSBmdW5jdGlvbihpdGVtOiBRdWV1ZUl0ZW0pOiBhbnkge1xuXHRcdFx0cmV0dXJuIHNldFRpbWVvdXQoZXhlY3V0ZVRhc2suYmluZChudWxsLCBpdGVtKSwgMCk7XG5cdFx0fTtcblx0fVxuXG5cdGZ1bmN0aW9uIHF1ZXVlVGFzayhjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpOiBIYW5kbGUge1xuXHRcdGNvbnN0IGl0ZW06IFF1ZXVlSXRlbSA9IHtcblx0XHRcdGlzQWN0aXZlOiB0cnVlLFxuXHRcdFx0Y2FsbGJhY2s6IGNhbGxiYWNrXG5cdFx0fTtcblx0XHRjb25zdCBpZDogYW55ID0gZW5xdWV1ZShpdGVtKTtcblxuXHRcdHJldHVybiBnZXRRdWV1ZUhhbmRsZShcblx0XHRcdGl0ZW0sXG5cdFx0XHRkZXN0cnVjdG9yICYmXG5cdFx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGRlc3RydWN0b3IoaWQpO1xuXHRcdFx0XHR9XG5cdFx0KTtcblx0fVxuXG5cdC8vIFRPRE86IFVzZSBhc3BlY3QuYmVmb3JlIHdoZW4gaXQgaXMgYXZhaWxhYmxlLlxuXHRyZXR1cm4gaGFzKCdtaWNyb3Rhc2tzJylcblx0XHQ/IHF1ZXVlVGFza1xuXHRcdDogZnVuY3Rpb24oY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55KTogSGFuZGxlIHtcblx0XHRcdFx0Y2hlY2tNaWNyb1Rhc2tRdWV1ZSgpO1xuXHRcdFx0XHRyZXR1cm4gcXVldWVUYXNrKGNhbGxiYWNrKTtcblx0XHRcdH07XG59KSgpO1xuXG4vLyBXaGVuIG5vIG1lY2hhbmlzbSBmb3IgcmVnaXN0ZXJpbmcgbWljcm90YXNrcyBpcyBleHBvc2VkIGJ5IHRoZSBlbnZpcm9ubWVudCwgbWljcm90YXNrcyB3aWxsXG4vLyBiZSBxdWV1ZWQgYW5kIHRoZW4gZXhlY3V0ZWQgaW4gYSBzaW5nbGUgbWFjcm90YXNrIGJlZm9yZSB0aGUgb3RoZXIgbWFjcm90YXNrcyBhcmUgZXhlY3V0ZWQuXG5pZiAoIWhhcygnbWljcm90YXNrcycpKSB7XG5cdGxldCBpc01pY3JvVGFza1F1ZXVlZCA9IGZhbHNlO1xuXG5cdG1pY3JvVGFza3MgPSBbXTtcblx0Y2hlY2tNaWNyb1Rhc2tRdWV1ZSA9IGZ1bmN0aW9uKCk6IHZvaWQge1xuXHRcdGlmICghaXNNaWNyb1Rhc2tRdWV1ZWQpIHtcblx0XHRcdGlzTWljcm9UYXNrUXVldWVkID0gdHJ1ZTtcblx0XHRcdHF1ZXVlVGFzayhmdW5jdGlvbigpIHtcblx0XHRcdFx0aXNNaWNyb1Rhc2tRdWV1ZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRpZiAobWljcm9UYXNrcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRsZXQgaXRlbTogUXVldWVJdGVtIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRcdHdoaWxlICgoaXRlbSA9IG1pY3JvVGFza3Muc2hpZnQoKSkpIHtcblx0XHRcdFx0XHRcdGV4ZWN1dGVUYXNrKGl0ZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9O1xufVxuXG4vKipcbiAqIFNjaGVkdWxlcyBhbiBhbmltYXRpb24gdGFzayB3aXRoIGB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lYCBpZiBpdCBleGlzdHMsIG9yIHdpdGggYHF1ZXVlVGFza2Agb3RoZXJ3aXNlLlxuICpcbiAqIFNpbmNlIHJlcXVlc3RBbmltYXRpb25GcmFtZSdzIGJlaGF2aW9yIGRvZXMgbm90IG1hdGNoIHRoYXQgZXhwZWN0ZWQgZnJvbSBgcXVldWVUYXNrYCwgaXQgaXMgbm90IHVzZWQgdGhlcmUuXG4gKiBIb3dldmVyLCBhdCB0aW1lcyBpdCBtYWtlcyBtb3JlIHNlbnNlIHRvIGRlbGVnYXRlIHRvIHJlcXVlc3RBbmltYXRpb25GcmFtZTsgaGVuY2UgdGhlIGZvbGxvd2luZyBtZXRob2QuXG4gKlxuICogQHBhcmFtIGNhbGxiYWNrIHRoZSBmdW5jdGlvbiB0byBiZSBxdWV1ZWQgYW5kIGxhdGVyIGV4ZWN1dGVkLlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggYSBgZGVzdHJveWAgbWV0aG9kIHRoYXQsIHdoZW4gY2FsbGVkLCBwcmV2ZW50cyB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmcm9tIGV4ZWN1dGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IHF1ZXVlQW5pbWF0aW9uVGFzayA9IChmdW5jdGlvbigpIHtcblx0aWYgKCFoYXMoJ3JhZicpKSB7XG5cdFx0cmV0dXJuIHF1ZXVlVGFzaztcblx0fVxuXG5cdGZ1bmN0aW9uIHF1ZXVlQW5pbWF0aW9uVGFzayhjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpOiBIYW5kbGUge1xuXHRcdGNvbnN0IGl0ZW06IFF1ZXVlSXRlbSA9IHtcblx0XHRcdGlzQWN0aXZlOiB0cnVlLFxuXHRcdFx0Y2FsbGJhY2s6IGNhbGxiYWNrXG5cdFx0fTtcblx0XHRjb25zdCByYWZJZDogbnVtYmVyID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGV4ZWN1dGVUYXNrLmJpbmQobnVsbCwgaXRlbSkpO1xuXG5cdFx0cmV0dXJuIGdldFF1ZXVlSGFuZGxlKGl0ZW0sIGZ1bmN0aW9uKCkge1xuXHRcdFx0Y2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpO1xuXHRcdH0pO1xuXHR9XG5cblx0Ly8gVE9ETzogVXNlIGFzcGVjdC5iZWZvcmUgd2hlbiBpdCBpcyBhdmFpbGFibGUuXG5cdHJldHVybiBoYXMoJ21pY3JvdGFza3MnKVxuXHRcdD8gcXVldWVBbmltYXRpb25UYXNrXG5cdFx0OiBmdW5jdGlvbihjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpOiBIYW5kbGUge1xuXHRcdFx0XHRjaGVja01pY3JvVGFza1F1ZXVlKCk7XG5cdFx0XHRcdHJldHVybiBxdWV1ZUFuaW1hdGlvblRhc2soY2FsbGJhY2spO1xuXHRcdFx0fTtcbn0pKCk7XG5cbi8qKlxuICogU2NoZWR1bGVzIGEgY2FsbGJhY2sgdG8gdGhlIG1pY3JvdGFzayBxdWV1ZS5cbiAqXG4gKiBBbnkgY2FsbGJhY2tzIHJlZ2lzdGVyZWQgd2l0aCBgcXVldWVNaWNyb1Rhc2tgIHdpbGwgYmUgZXhlY3V0ZWQgYmVmb3JlIHRoZSBuZXh0IG1hY3JvdGFzay4gSWYgbm8gbmF0aXZlXG4gKiBtZWNoYW5pc20gZm9yIHNjaGVkdWxpbmcgbWFjcm90YXNrcyBpcyBleHBvc2VkLCB0aGVuIGFueSBjYWxsYmFja3Mgd2lsbCBiZSBmaXJlZCBiZWZvcmUgYW55IG1hY3JvdGFza1xuICogcmVnaXN0ZXJlZCB3aXRoIGBxdWV1ZVRhc2tgIG9yIGBxdWV1ZUFuaW1hdGlvblRhc2tgLlxuICpcbiAqIEBwYXJhbSBjYWxsYmFjayB0aGUgZnVuY3Rpb24gdG8gYmUgcXVldWVkIGFuZCBsYXRlciBleGVjdXRlZC5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIGEgYGRlc3Ryb3lgIG1ldGhvZCB0aGF0LCB3aGVuIGNhbGxlZCwgcHJldmVudHMgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnJvbSBleGVjdXRpbmcuXG4gKi9cbmV4cG9ydCBsZXQgcXVldWVNaWNyb1Rhc2sgPSAoZnVuY3Rpb24oKSB7XG5cdGxldCBlbnF1ZXVlOiAoaXRlbTogUXVldWVJdGVtKSA9PiB2b2lkO1xuXG5cdGlmIChoYXMoJ2hvc3Qtbm9kZScpKSB7XG5cdFx0ZW5xdWV1ZSA9IGZ1bmN0aW9uKGl0ZW06IFF1ZXVlSXRlbSk6IHZvaWQge1xuXHRcdFx0Z2xvYmFsLnByb2Nlc3MubmV4dFRpY2soZXhlY3V0ZVRhc2suYmluZChudWxsLCBpdGVtKSk7XG5cdFx0fTtcblx0fSBlbHNlIGlmIChoYXMoJ2VzNi1wcm9taXNlJykpIHtcblx0XHRlbnF1ZXVlID0gZnVuY3Rpb24oaXRlbTogUXVldWVJdGVtKTogdm9pZCB7XG5cdFx0XHRnbG9iYWwuUHJvbWlzZS5yZXNvbHZlKGl0ZW0pLnRoZW4oZXhlY3V0ZVRhc2spO1xuXHRcdH07XG5cdH0gZWxzZSBpZiAoaGFzKCdkb20tbXV0YXRpb25vYnNlcnZlcicpKSB7XG5cdFx0LyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWUgKi9cblx0XHRjb25zdCBIb3N0TXV0YXRpb25PYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xuXHRcdGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRjb25zdCBxdWV1ZTogUXVldWVJdGVtW10gPSBbXTtcblx0XHRjb25zdCBvYnNlcnZlciA9IG5ldyBIb3N0TXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbigpOiB2b2lkIHtcblx0XHRcdHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNvbnN0IGl0ZW0gPSBxdWV1ZS5zaGlmdCgpO1xuXHRcdFx0XHRpZiAoaXRlbSAmJiBpdGVtLmlzQWN0aXZlICYmIGl0ZW0uY2FsbGJhY2spIHtcblx0XHRcdFx0XHRpdGVtLmNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdG9ic2VydmVyLm9ic2VydmUobm9kZSwgeyBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuXG5cdFx0ZW5xdWV1ZSA9IGZ1bmN0aW9uKGl0ZW06IFF1ZXVlSXRlbSk6IHZvaWQge1xuXHRcdFx0cXVldWUucHVzaChpdGVtKTtcblx0XHRcdG5vZGUuc2V0QXR0cmlidXRlKCdxdWV1ZVN0YXR1cycsICcxJyk7XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRlbnF1ZXVlID0gZnVuY3Rpb24oaXRlbTogUXVldWVJdGVtKTogdm9pZCB7XG5cdFx0XHRjaGVja01pY3JvVGFza1F1ZXVlKCk7XG5cdFx0XHRtaWNyb1Rhc2tzLnB1c2goaXRlbSk7XG5cdFx0fTtcblx0fVxuXG5cdHJldHVybiBmdW5jdGlvbihjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpOiBIYW5kbGUge1xuXHRcdGNvbnN0IGl0ZW06IFF1ZXVlSXRlbSA9IHtcblx0XHRcdGlzQWN0aXZlOiB0cnVlLFxuXHRcdFx0Y2FsbGJhY2s6IGNhbGxiYWNrXG5cdFx0fTtcblxuXHRcdGVucXVldWUoaXRlbSk7XG5cblx0XHRyZXR1cm4gZ2V0UXVldWVIYW5kbGUoaXRlbSk7XG5cdH07XG59KSgpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHF1ZXVlLnRzIiwiLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgYSB2YWx1ZSBwcm9wZXJ0eSBkZXNjcmlwdG9yXG4gKlxuICogQHBhcmFtIHZhbHVlICAgICAgICBUaGUgdmFsdWUgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3Igc2hvdWxkIGJlIHNldCB0b1xuICogQHBhcmFtIGVudW1lcmFibGUgICBJZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGVudW1iZXJhYmxlLCBkZWZhdWx0cyB0byBmYWxzZVxuICogQHBhcmFtIHdyaXRhYmxlICAgICBJZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIHdyaXRhYmxlLCBkZWZhdWx0cyB0byB0cnVlXG4gKiBAcGFyYW0gY29uZmlndXJhYmxlIElmIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uZmlndXJhYmxlLCBkZWZhdWx0cyB0byB0cnVlXG4gKiBAcmV0dXJuICAgICAgICAgICAgIFRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVEZXNjcmlwdG9yPFQ+KFxuXHR2YWx1ZTogVCxcblx0ZW51bWVyYWJsZTogYm9vbGVhbiA9IGZhbHNlLFxuXHR3cml0YWJsZTogYm9vbGVhbiA9IHRydWUsXG5cdGNvbmZpZ3VyYWJsZTogYm9vbGVhbiA9IHRydWVcbik6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPFQ+IHtcblx0cmV0dXJuIHtcblx0XHR2YWx1ZTogdmFsdWUsXG5cdFx0ZW51bWVyYWJsZTogZW51bWVyYWJsZSxcblx0XHR3cml0YWJsZTogd3JpdGFibGUsXG5cdFx0Y29uZmlndXJhYmxlOiBjb25maWd1cmFibGVcblx0fTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciBmdW5jdGlvbiB3aGljaCB3cmFwcyBhIGZ1bmN0aW9uIHdoZXJlIHRoZSBmaXJzdCBhcmd1bWVudCBiZWNvbWVzIHRoZSBzY29wZVxuICogb2YgdGhlIGNhbGxcbiAqXG4gKiBAcGFyYW0gbmF0aXZlRnVuY3Rpb24gVGhlIHNvdXJjZSBmdW5jdGlvbiB0byBiZSB3cmFwcGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwTmF0aXZlPFQsIFUsIFI+KG5hdGl2ZUZ1bmN0aW9uOiAoYXJnMTogVSkgPT4gUik6ICh0YXJnZXQ6IFQsIGFyZzE6IFUpID0+IFI7XG5leHBvcnQgZnVuY3Rpb24gd3JhcE5hdGl2ZTxULCBVLCBWLCBSPihuYXRpdmVGdW5jdGlvbjogKGFyZzE6IFUsIGFyZzI6IFYpID0+IFIpOiAodGFyZ2V0OiBULCBhcmcxOiBVLCBhcmcyOiBWKSA9PiBSO1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBOYXRpdmU8VCwgVSwgViwgVywgUj4oXG5cdG5hdGl2ZUZ1bmN0aW9uOiAoYXJnMTogVSwgYXJnMjogViwgYXJnMzogVykgPT4gUlxuKTogKHRhcmdldDogVCwgYXJnMTogVSwgYXJnMjogViwgYXJnMzogVykgPT4gUjtcbmV4cG9ydCBmdW5jdGlvbiB3cmFwTmF0aXZlPFQsIFUsIFYsIFcsIFgsIFI+KFxuXHRuYXRpdmVGdW5jdGlvbjogKGFyZzE6IFUsIGFyZzI6IFYsIGFyZzM6IFcpID0+IFJcbik6ICh0YXJnZXQ6IFQsIGFyZzE6IFUsIGFyZzI6IFYsIGFyZzM6IFcpID0+IFI7XG5leHBvcnQgZnVuY3Rpb24gd3JhcE5hdGl2ZTxULCBVLCBWLCBXLCBYLCBZLCBSPihcblx0bmF0aXZlRnVuY3Rpb246IChhcmcxOiBVLCBhcmcyOiBWLCBhcmczOiBXLCBhcmc0OiBZKSA9PiBSXG4pOiAodGFyZ2V0OiBULCBhcmcxOiBVLCBhcmcyOiBWLCBhcmczOiBXLCBhcmc0OiBZKSA9PiBSO1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBOYXRpdmUobmF0aXZlRnVuY3Rpb246ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55KTogKHRhcmdldDogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gYW55IHtcblx0cmV0dXJuIGZ1bmN0aW9uKHRhcmdldDogYW55LCAuLi5hcmdzOiBhbnlbXSk6IGFueSB7XG5cdFx0cmV0dXJuIG5hdGl2ZUZ1bmN0aW9uLmFwcGx5KHRhcmdldCwgYXJncyk7XG5cdH07XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gdXRpbC50cyIsImltcG9ydCBhc3NlcnRSZW5kZXIgZnJvbSAnLi9zdXBwb3J0L2Fzc2VydFJlbmRlcic7XG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICcuL3N1cHBvcnQvc2VsZWN0b3InO1xuaW1wb3J0IHsgV05vZGUsIEROb2RlLCBXaWRnZXRCYXNlSW50ZXJmYWNlLCBDb25zdHJ1Y3RvciwgVk5vZGUgfSBmcm9tICcuLi93aWRnZXQtY29yZS9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFdpZGdldEJhc2UgfSBmcm9tICcuLi93aWRnZXQtY29yZS9XaWRnZXRCYXNlJztcbmltcG9ydCB7IGRlY29yYXRlLCBpc1ZOb2RlLCBpc1dOb2RlIH0gZnJvbSAnLi4vd2lkZ2V0LWNvcmUvZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tQ29tcGFyYXRvciB7XG5cdHNlbGVjdG9yOiBzdHJpbmc7XG5cdHByb3BlcnR5OiBzdHJpbmc7XG5cdGNvbXBhcmF0b3I6ICh2YWx1ZTogYW55KSA9PiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uYWxTZWxlY3RvciB7XG5cdChub2RlOiBWTm9kZSB8IFdOb2RlKTogdW5kZWZpbmVkIHwgRnVuY3Rpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVjb3JhdG9yUmVzdWx0PFQ+IHtcblx0aGFzRGVmZXJyZWRQcm9wZXJ0aWVzOiBib29sZWFuO1xuXHRub2RlczogVDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBlY3RlZFJlbmRlciB7XG5cdCgpOiBETm9kZSB8IEROb2RlW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwZWN0IHtcblx0KGV4cGVjdGVkUmVuZGVyRnVuYzogRXhwZWN0ZWRSZW5kZXIpOiB2b2lkO1xuXHQoZXhwZWN0ZWRSZW5kZXJGdW5jOiBFeHBlY3RlZFJlbmRlciwgYWN0dWFsUmVuZGVyRnVuYz86IEV4cGVjdGVkUmVuZGVyKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBlY3RQYXJ0aWFsIHtcblx0KHNlbGVjdG9yOiBzdHJpbmcsIGV4cGVjdGVkUmVuZGVyRnVuYzogRXhwZWN0ZWRSZW5kZXIpOiB2b2lkO1xuXHQoc2VsZWN0b3I6IHN0cmluZywgZXhwZWN0ZWRSZW5kZXJGdW5jOiBFeHBlY3RlZFJlbmRlciwgYWN0dWFsUmVuZGVyRnVuYz86IEV4cGVjdGVkUmVuZGVyKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmlnZ2VyIHtcblx0KHNlbGVjdG9yOiBzdHJpbmcsIGZ1bmN0aW9uU2VsZWN0b3I6IEZ1bmN0aW9uYWxTZWxlY3RvciwgLi4uYXJnczogYW55W10pOiBhbnk7XG5cdChzZWxlY3Rvcjogc3RyaW5nLCBmdW5jdGlvblNlbGVjdG9yOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldFJlbmRlciB7XG5cdChpbmRleD86IG51bWJlcik6IEROb2RlIHwgRE5vZGVbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIYXJuZXNzQVBJIHtcblx0ZXhwZWN0OiBFeHBlY3Q7XG5cdGV4cGVjdFBhcnRpYWw6IEV4cGVjdFBhcnRpYWw7XG5cdHRyaWdnZXI6IFRyaWdnZXI7XG5cdGdldFJlbmRlcjogR2V0UmVuZGVyO1xufVxuXG5mdW5jdGlvbiBkZWNvcmF0ZU5vZGVzKGROb2RlOiBETm9kZVtdKTogRGVjb3JhdG9yUmVzdWx0PEROb2RlW10+O1xuZnVuY3Rpb24gZGVjb3JhdGVOb2RlcyhkTm9kZTogRE5vZGUpOiBEZWNvcmF0b3JSZXN1bHQ8RE5vZGU+O1xuZnVuY3Rpb24gZGVjb3JhdGVOb2RlcyhkTm9kZTogRE5vZGUgfCBETm9kZVtdKTogRGVjb3JhdG9yUmVzdWx0PEROb2RlIHwgRE5vZGVbXT47XG5mdW5jdGlvbiBkZWNvcmF0ZU5vZGVzKGROb2RlOiBhbnkpOiBEZWNvcmF0b3JSZXN1bHQ8RE5vZGUgfCBETm9kZVtdPiB7XG5cdGxldCBoYXNEZWZlcnJlZFByb3BlcnRpZXMgPSBmYWxzZTtcblx0ZnVuY3Rpb24gYWRkUGFyZW50KHBhcmVudDogV05vZGUgfCBWTm9kZSk6IHZvaWQge1xuXHRcdChwYXJlbnQuY2hpbGRyZW4gfHwgW10pLmZvckVhY2goKGNoaWxkKSA9PiB7XG5cdFx0XHRpZiAoaXNWTm9kZShjaGlsZCkgfHwgaXNXTm9kZShjaGlsZCkpIHtcblx0XHRcdFx0KGNoaWxkIGFzIGFueSkucGFyZW50ID0gcGFyZW50O1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGlmIChpc1ZOb2RlKHBhcmVudCkgJiYgdHlwZW9mIHBhcmVudC5kZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0aGFzRGVmZXJyZWRQcm9wZXJ0aWVzID0gdHJ1ZTtcblx0XHRcdHBhcmVudC5wcm9wZXJ0aWVzID0geyAuLi5wYXJlbnQucHJvcGVydGllcywgLi4ucGFyZW50LmRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrKGZhbHNlKSB9O1xuXHRcdH1cblx0fVxuXHRjb25zdCBub2RlcyA9IGRlY29yYXRlKGROb2RlLCBhZGRQYXJlbnQsIChub2RlOiBETm9kZSk6IG5vZGUgaXMgV05vZGUgfCBWTm9kZSA9PiBpc1dOb2RlKG5vZGUpIHx8IGlzVk5vZGUobm9kZSkpO1xuXHRyZXR1cm4geyBoYXNEZWZlcnJlZFByb3BlcnRpZXMsIG5vZGVzIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXJuZXNzKFxuXHRyZW5kZXJGdW5jOiAoKSA9PiBXTm9kZTxXaWRnZXRCYXNlSW50ZXJmYWNlPixcblx0Y3VzdG9tQ29tcGFyYXRvcjogQ3VzdG9tQ29tcGFyYXRvcltdID0gW11cbik6IEhhcm5lc3NBUEkge1xuXHRsZXQgaW52YWxpZGF0ZWQgPSB0cnVlO1xuXHRsZXQgd05vZGUgPSByZW5kZXJGdW5jKCk7XG5cdGxldCB3aWRnZXQ6IFdpZGdldEJhc2U7XG5cdGNvbnN0IHJlbmRlclN0YWNrOiAoRE5vZGUgfCBETm9kZVtdKVtdID0gW107XG5cdGNvbnN0IHsgcHJvcGVydGllcywgY2hpbGRyZW4gfSA9IHdOb2RlO1xuXHRjb25zdCB3aWRnZXRDb25zdHJ1Y3RvciA9IHdOb2RlLndpZGdldENvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPFdpZGdldEJhc2U+O1xuXHRpZiAodHlwZW9mIHdpZGdldENvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0d2lkZ2V0ID0gbmV3IGNsYXNzIGV4dGVuZHMgd2lkZ2V0Q29uc3RydWN0b3Ige1xuXHRcdFx0aW52YWxpZGF0ZSgpIHtcblx0XHRcdFx0aW52YWxpZGF0ZWQgPSB0cnVlO1xuXHRcdFx0XHRzdXBlci5pbnZhbGlkYXRlKCk7XG5cdFx0XHR9XG5cdFx0fSgpO1xuXHRcdHdpZGdldC5fX3NldFByb3BlcnRpZXNfXyhwcm9wZXJ0aWVzKTtcblx0XHR3aWRnZXQuX19zZXRDaGlsZHJlbl9fKGNoaWxkcmVuKTtcblx0XHRfdHJ5UmVuZGVyKCk7XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdIYXJuZXNzIGRvZXMgbm90IHN1cHBvcnQgcmVnaXN0cnkgaXRlbXMnKTtcblx0fVxuXG5cdGZ1bmN0aW9uIF9nZXRSZW5kZXIoY291bnQ/OiBudW1iZXIpOiBETm9kZSB8IEROb2RlW10ge1xuXHRcdHJldHVybiBjb3VudCA/IHJlbmRlclN0YWNrW2NvdW50XSA6IHJlbmRlclN0YWNrW3JlbmRlclN0YWNrLmxlbmd0aCAtIDFdO1xuXHR9XG5cblx0ZnVuY3Rpb24gX3J1bkNvbXBhcmVzKG5vZGVzOiBETm9kZSB8IEROb2RlW10sIGlzRXhwZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuXHRcdGN1c3RvbUNvbXBhcmF0b3IuZm9yRWFjaCgoeyBzZWxlY3RvciwgcHJvcGVydHksIGNvbXBhcmF0b3IgfSkgPT4ge1xuXHRcdFx0Y29uc3QgaXRlbXMgPSBzZWxlY3Qoc2VsZWN0b3IsIG5vZGVzKTtcblx0XHRcdGl0ZW1zLmZvckVhY2goKGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuXHRcdFx0XHRjb25zdCBjb21wYXJhdG9yTmFtZSA9IGBjb21wYXJhdG9yKHNlbGVjdG9yPSR7c2VsZWN0b3J9LCAke3Byb3BlcnR5fSlgO1xuXHRcdFx0XHRpZiAoaXRlbSAmJiBpdGVtLnByb3BlcnRpZXMgJiYgaXRlbS5wcm9wZXJ0aWVzW3Byb3BlcnR5XSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Y29uc3QgY29tcGFyYXRvclJlc3VsdCA9IGNvbXBhcmF0b3IoaXRlbS5wcm9wZXJ0aWVzW3Byb3BlcnR5XSlcblx0XHRcdFx0XHRcdD8gY29tcGFyYXRvck5hbWVcblx0XHRcdFx0XHRcdDogYCR7Y29tcGFyYXRvck5hbWV9IEZBSUxFRGA7XG5cdFx0XHRcdFx0aXRlbS5wcm9wZXJ0aWVzW3Byb3BlcnR5XSA9IGlzRXhwZWN0ZWQgPyBjb21wYXJhdG9yTmFtZSA6IGNvbXBhcmF0b3JSZXN1bHQ7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gX3RyeVJlbmRlcigpIHtcblx0XHRjb25zdCB7IHByb3BlcnRpZXMsIGNoaWxkcmVuIH0gPSByZW5kZXJGdW5jKCk7XG5cdFx0d2lkZ2V0Ll9fc2V0UHJvcGVydGllc19fKHByb3BlcnRpZXMpO1xuXHRcdHdpZGdldC5fX3NldENoaWxkcmVuX18oY2hpbGRyZW4pO1xuXHRcdGlmIChpbnZhbGlkYXRlZCkge1xuXHRcdFx0Y29uc3QgcmVuZGVyID0gd2lkZ2V0Ll9fcmVuZGVyX18oKTtcblx0XHRcdGNvbnN0IHsgaGFzRGVmZXJyZWRQcm9wZXJ0aWVzLCBub2RlcyB9ID0gZGVjb3JhdGVOb2RlcyhyZW5kZXIpO1xuXHRcdFx0X3J1bkNvbXBhcmVzKG5vZGVzKTtcblx0XHRcdHJlbmRlclN0YWNrLnB1c2gobm9kZXMpO1xuXHRcdFx0aWYgKGhhc0RlZmVycmVkUHJvcGVydGllcykge1xuXHRcdFx0XHRjb25zdCB7IG5vZGVzOiBhZnRlckRlZmVycmVkUHJvcGVydGllc05vZGVzIH0gPSBkZWNvcmF0ZU5vZGVzKHJlbmRlcik7XG5cdFx0XHRcdF9ydW5Db21wYXJlcyhhZnRlckRlZmVycmVkUHJvcGVydGllc05vZGVzKTtcblx0XHRcdFx0cmVuZGVyU3RhY2sucHVzaChhZnRlckRlZmVycmVkUHJvcGVydGllc05vZGVzKTtcblx0XHRcdH1cblx0XHRcdGludmFsaWRhdGVkID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gX2V4cGVjdChleHBlY3RlZFJlbmRlckZ1bmM6IEV4cGVjdGVkUmVuZGVyLCBhY3R1YWxSZW5kZXJGdW5jPzogRXhwZWN0ZWRSZW5kZXIsIHNlbGVjdG9yPzogc3RyaW5nKSB7XG5cdFx0bGV0IHJlbmRlclJlc3VsdDogRE5vZGUgfCBETm9kZVtdO1xuXHRcdGlmIChhY3R1YWxSZW5kZXJGdW5jID09PSB1bmRlZmluZWQpIHtcblx0XHRcdF90cnlSZW5kZXIoKTtcblx0XHRcdHJlbmRlclJlc3VsdCA9IF9nZXRSZW5kZXIoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVuZGVyUmVzdWx0ID0gYWN0dWFsUmVuZGVyRnVuYygpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHsgbm9kZXM6IGV4cGVjdGVkUmVuZGVyUmVzdWx0IH0gPSBkZWNvcmF0ZU5vZGVzKGV4cGVjdGVkUmVuZGVyRnVuYygpKTtcblx0XHRfcnVuQ29tcGFyZXMoZXhwZWN0ZWRSZW5kZXJSZXN1bHQsIHRydWUpO1xuXHRcdGlmIChzZWxlY3Rvcikge1xuXHRcdFx0Y29uc3QgW2ZpcnN0SXRlbV0gPSBzZWxlY3Qoc2VsZWN0b3IsIHJlbmRlclJlc3VsdCk7XG5cdFx0XHRhc3NlcnRSZW5kZXIoZmlyc3RJdGVtLCBleHBlY3RlZFJlbmRlclJlc3VsdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFzc2VydFJlbmRlcihyZW5kZXJSZXN1bHQsIGV4cGVjdGVkUmVuZGVyUmVzdWx0KTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGV4cGVjdChleHBlY3RlZFJlbmRlckZ1bmM6IEV4cGVjdGVkUmVuZGVyLCBhY3R1YWxSZW5kZXJGdW5jPzogRXhwZWN0ZWRSZW5kZXIpIHtcblx0XHRcdHJldHVybiBfZXhwZWN0KGV4cGVjdGVkUmVuZGVyRnVuYywgYWN0dWFsUmVuZGVyRnVuYyk7XG5cdFx0fSxcblx0XHRleHBlY3RQYXJ0aWFsKHNlbGVjdG9yOiBzdHJpbmcsIGV4cGVjdGVkUmVuZGVyRnVuYzogRXhwZWN0ZWRSZW5kZXIsIGFjdHVhbFJlbmRlckZ1bmM/OiBFeHBlY3RlZFJlbmRlcikge1xuXHRcdFx0cmV0dXJuIF9leHBlY3QoZXhwZWN0ZWRSZW5kZXJGdW5jLCBhY3R1YWxSZW5kZXJGdW5jLCBzZWxlY3Rvcik7XG5cdFx0fSxcblx0XHR0cmlnZ2VyKHNlbGVjdG9yOiBzdHJpbmcsIGZ1bmN0aW9uU2VsZWN0b3I6IHN0cmluZyB8IEZ1bmN0aW9uYWxTZWxlY3RvciwgLi4uYXJnczogYW55W10pOiBhbnkge1xuXHRcdFx0X3RyeVJlbmRlcigpO1xuXHRcdFx0Y29uc3QgW2ZpcnN0SXRlbV0gPSBzZWxlY3Qoc2VsZWN0b3IsIF9nZXRSZW5kZXIoKSk7XG5cdFx0XHRpZiAoZmlyc3RJdGVtKSB7XG5cdFx0XHRcdGxldCB0cmlnZ2VyRnVuY3Rpb246IEZ1bmN0aW9uIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAodHlwZW9mIGZ1bmN0aW9uU2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdFx0dHJpZ2dlckZ1bmN0aW9uID0gKGZpcnN0SXRlbS5wcm9wZXJ0aWVzIGFzIGFueSlbZnVuY3Rpb25TZWxlY3Rvcl07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dHJpZ2dlckZ1bmN0aW9uID0gZnVuY3Rpb25TZWxlY3RvcihmaXJzdEl0ZW0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0cmlnZ2VyRnVuY3Rpb24pIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJpZ2dlckZ1bmN0aW9uLmFwcGx5KHdpZGdldCwgYXJncyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdGdldFJlbmRlcihpbmRleD86IG51bWJlcik6IEROb2RlIHwgRE5vZGVbXSB7XG5cdFx0XHRyZXR1cm4gX2dldFJlbmRlcihpbmRleCk7XG5cdFx0fVxuXHR9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBoYXJuZXNzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGhhcm5lc3MudHMiLCJpbXBvcnQgeyBETm9kZSwgV05vZGUsIFZOb2RlLCBEZWZhdWx0V2lkZ2V0QmFzZUludGVyZmFjZSwgQ29uc3RydWN0b3IgfSBmcm9tICcuLi8uLi93aWRnZXQtY29yZS9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGlzV05vZGUgfSBmcm9tICcuLi8uLi93aWRnZXQtY29yZS9kJztcbmltcG9ydCAqIGFzIGRpZmYgZnJvbSAnZGlmZic7XG5pbXBvcnQgV2Vha01hcCBmcm9tICcuLi8uLi9zaGltL1dlYWtNYXAnO1xuaW1wb3J0IFNldCBmcm9tICcuLi8uLi9zaGltL1NldCc7XG5pbXBvcnQgTWFwIGZyb20gJy4uLy4uL3NoaW0vTWFwJztcbmltcG9ydCB7IGZyb20gYXMgYXJyYXlGcm9tIH0gZnJvbSAnLi4vLi4vc2hpbS9hcnJheSc7XG5cbmxldCB3aWRnZXRDbGFzc0NvdW50ZXIgPSAwO1xuY29uc3Qgd2lkZ2V0TWFwID0gbmV3IFdlYWtNYXA8Q29uc3RydWN0b3I8RGVmYXVsdFdpZGdldEJhc2VJbnRlcmZhY2U+LCBudW1iZXI+KCk7XG5cbmZ1bmN0aW9uIHJlcGxhY2VyKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogYW55IHtcblx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdHJldHVybiAnZnVuY3Rpb24nO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRyZXR1cm4gJ3VuZGVmaW5lZCc7XG5cdH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZXQgfHwgdmFsdWUgaW5zdGFuY2VvZiBNYXApIHtcblx0XHRyZXR1cm4gYXJyYXlGcm9tKHZhbHVlKTtcblx0fVxuXHRyZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRETm9kZXMobm9kZXM6IEROb2RlIHwgRE5vZGVbXSwgZGVwdGg6IG51bWJlciA9IDApOiBzdHJpbmcge1xuXHRjb25zdCBpc0FycmF5RnJhZ21lbnQgPSBBcnJheS5pc0FycmF5KG5vZGVzKSAmJiBkZXB0aCA9PT0gMDtcblx0bGV0IGluaXRpYWwgPSBpc0FycmF5RnJhZ21lbnQgPyAnW1xcbicgOiAnJztcblx0bGV0IHRhYnMgPSAnJztcblx0ZGVwdGggPSBpc0FycmF5RnJhZ21lbnQgPyAxIDogZGVwdGg7XG5cdG5vZGVzID0gQXJyYXkuaXNBcnJheShub2RlcykgPyBub2RlcyA6IFtub2Rlc107XG5cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBkZXB0aDsgaSsrKSB7XG5cdFx0dGFicyA9IGAke3RhYnN9XFx0YDtcblx0fVxuXHRsZXQgZm9ybWF0dGVkTm9kZSA9IG5vZGVzLnJlZHVjZSgocmVzdWx0OiBzdHJpbmcsIG5vZGUsIGluZGV4KSA9PiB7XG5cdFx0aWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblx0XHRpZiAoaW5kZXggPiAwKSB7XG5cdFx0XHRyZXN1bHQgPSBgJHtyZXN1bHR9XFxuYDtcblx0XHR9XG5cdFx0cmVzdWx0ID0gYCR7cmVzdWx0fSR7dGFic31gO1xuXG5cdFx0aWYgKHR5cGVvZiBub2RlID09PSAnc3RyaW5nJykge1xuXHRcdFx0cmV0dXJuIGAke3Jlc3VsdH1cIiR7bm9kZX1cImA7XG5cdFx0fVxuXG5cdFx0cmVzdWx0ID0gYCR7cmVzdWx0fSR7Zm9ybWF0Tm9kZShub2RlLCB0YWJzKX1gO1xuXHRcdGlmIChub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0cmVzdWx0ID0gYCR7cmVzdWx0fSwgW1xcbiR7Zm9ybWF0RE5vZGVzKG5vZGUuY2hpbGRyZW4sIGRlcHRoICsgMSl9XFxuJHt0YWJzfV1gO1xuXHRcdH1cblx0XHRyZXR1cm4gYCR7cmVzdWx0fSlgO1xuXHR9LCBpbml0aWFsKTtcblxuXHRyZXR1cm4gaXNBcnJheUZyYWdtZW50ID8gKGZvcm1hdHRlZE5vZGUgPSBgJHtmb3JtYXR0ZWROb2RlfVxcbl1gKSA6IGZvcm1hdHRlZE5vZGU7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFByb3BlcnRpZXMocHJvcGVydGllczogYW55LCB0YWJzOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRwcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMocHJvcGVydGllcylcblx0XHQuc29ydCgpXG5cdFx0LnJlZHVjZSgocHJvcHM6IGFueSwga2V5KSA9PiB7XG5cdFx0XHRwcm9wc1trZXldID0gcHJvcGVydGllc1trZXldO1xuXHRcdFx0cmV0dXJuIHByb3BzO1xuXHRcdH0sIHt9KTtcblx0cHJvcGVydGllcyA9IEpTT04uc3RyaW5naWZ5KHByb3BlcnRpZXMsIHJlcGxhY2VyLCBgJHt0YWJzfVxcdGApLnNsaWNlKDAsIC0xKTtcblx0cmV0dXJuIGAke3Byb3BlcnRpZXN9JHt0YWJzfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRXaWRnZXROYW1lKHdpZGdldENvbnN0cnVjdG9yOiBhbnkpOiBzdHJpbmcge1xuXHRsZXQgbmFtZTogc3RyaW5nO1xuXHRpZiAodHlwZW9mIHdpZGdldENvbnN0cnVjdG9yID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygd2lkZ2V0Q29uc3RydWN0b3IgPT09ICdzeW1ib2wnKSB7XG5cdFx0bmFtZSA9IHdpZGdldENvbnN0cnVjdG9yLnRvU3RyaW5nKCk7XG5cdH0gZWxzZSB7XG5cdFx0bmFtZSA9IHdpZGdldENvbnN0cnVjdG9yLm5hbWU7XG5cdFx0aWYgKG5hbWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0bGV0IGlkID0gd2lkZ2V0TWFwLmdldCh3aWRnZXRDb25zdHJ1Y3Rvcik7XG5cdFx0XHRpZiAoaWQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpZCA9ICsrd2lkZ2V0Q2xhc3NDb3VudGVyO1xuXHRcdFx0XHR3aWRnZXRNYXAuc2V0KHdpZGdldENvbnN0cnVjdG9yLCBpZCk7XG5cdFx0XHR9XG5cdFx0XHRuYW1lID0gYFdpZGdldC0ke2lkfWA7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBuYW1lO1xufVxuXG5mdW5jdGlvbiBmb3JtYXROb2RlKG5vZGU6IFdOb2RlIHwgVk5vZGUsIHRhYnM6IGFueSk6IHN0cmluZyB7XG5cdGNvbnN0IHByb3BlcnR5S2V5Q291bnQgPSBPYmplY3Qua2V5cyhub2RlLnByb3BlcnRpZXMpLmxlbmd0aDtcblx0bGV0IHByb3BlcnRpZXMgPSBwcm9wZXJ0eUtleUNvdW50ID4gMCA/IGZvcm1hdFByb3BlcnRpZXMobm9kZS5wcm9wZXJ0aWVzLCB0YWJzKSA6ICd7fSc7XG5cdGlmIChpc1dOb2RlKG5vZGUpKSB7XG5cdFx0cmV0dXJuIGB3KCR7Z2V0V2lkZ2V0TmFtZShub2RlLndpZGdldENvbnN0cnVjdG9yKX0sICR7cHJvcGVydGllc31gO1xuXHR9XG5cdHJldHVybiBgdihcIiR7bm9kZS50YWd9XCIsICR7cHJvcGVydGllc31gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UmVuZGVyKGFjdHVhbDogRE5vZGUgfCBETm9kZVtdLCBleHBlY3RlZDogRE5vZGUgfCBETm9kZVtdLCBtZXNzYWdlPzogc3RyaW5nKTogdm9pZCB7XG5cdGNvbnN0IHBhcnNlZEFjdHVhbCA9IGZvcm1hdEROb2RlcyhhY3R1YWwpO1xuXHRjb25zdCBwYXJzZWRFeHBlY3RlZCA9IGZvcm1hdEROb2RlcyhleHBlY3RlZCk7XG5cdGNvbnN0IGRpZmZSZXN1bHQgPSBkaWZmLmRpZmZMaW5lcyhwYXJzZWRBY3R1YWwsIHBhcnNlZEV4cGVjdGVkKTtcblx0bGV0IGRpZmZGb3VuZCA9IGZhbHNlO1xuXHRjb25zdCBwYXJzZWREaWZmID0gZGlmZlJlc3VsdC5yZWR1Y2UoKHJlc3VsdDogc3RyaW5nLCBwYXJ0LCBpbmRleCkgPT4ge1xuXHRcdGlmIChwYXJ0LmFkZGVkKSB7XG5cdFx0XHRkaWZmRm91bmQgPSB0cnVlO1xuXHRcdFx0cmVzdWx0ID0gYCR7cmVzdWx0fShFKSR7cGFydC52YWx1ZS5yZXBsYWNlKC9cXG5cXHQvZywgJ1xcbihFKVxcdCcpfWA7XG5cdFx0fSBlbHNlIGlmIChwYXJ0LnJlbW92ZWQpIHtcblx0XHRcdGRpZmZGb3VuZCA9IHRydWU7XG5cdFx0XHRyZXN1bHQgPSBgJHtyZXN1bHR9KEEpJHtwYXJ0LnZhbHVlLnJlcGxhY2UoL1xcblxcdC9nLCAnXFxuKEEpXFx0Jyl9YDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0ID0gYCR7cmVzdWx0fSR7cGFydC52YWx1ZX1gO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LCAnXFxuJyk7XG5cblx0aWYgKGRpZmZGb3VuZCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihwYXJzZWREaWZmKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBhc3NlcnRSZW5kZXI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gYXNzZXJ0UmVuZGVyLnRzIiwiaW1wb3J0IHsgRE5vZGUsIERlZmF1bHRXaWRnZXRCYXNlSW50ZXJmYWNlLCBXTm9kZSwgVk5vZGUgfSBmcm9tICcuLi8uLi93aWRnZXQtY29yZS9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGlzVk5vZGUsIGlzV05vZGUgfSBmcm9tICcuLi8uLi93aWRnZXQtY29yZS9kJztcbmltcG9ydCAqIGFzIGNzc1NlbGVjdCBmcm9tICdjc3Mtc2VsZWN0LXVtZCc7XG5cbmV4cG9ydCB0eXBlIFRlc3RGdW5jdGlvbiA9IChlbGVtOiBETm9kZTxEZWZhdWx0V2lkZ2V0QmFzZUludGVyZmFjZT4pID0+IGJvb2xlYW47XG5cbmV4cG9ydCBjb25zdCBwYXJzZVNlbGVjdG9yID0gKHNlbGVjdG9yOiBzdHJpbmcpID0+IHtcblx0Y29uc3Qgc2VsZWN0b3JzID0gc2VsZWN0b3Iuc3BsaXQoJyAnKTtcblx0cmV0dXJuIHNlbGVjdG9yc1xuXHRcdC5tYXAoKHNlbGVjdG9yKSA9PiB7XG5cdFx0XHRjb25zdCBrZXlTaWdpbEluZGV4ID0gc2VsZWN0b3IuaW5kZXhPZignQCcpO1xuXHRcdFx0aWYgKGtleVNpZ2lsSW5kZXggPT09IDApIHtcblx0XHRcdFx0cmV0dXJuIGBba2V5PVwiJHtzZWxlY3Rvci5zdWJzdHIoMSl9XCJdYDtcblx0XHRcdH0gZWxzZSBpZiAoa2V5U2lnaWxJbmRleCA+IDApIHtcblx0XHRcdFx0Y29uc3Qga2V5ID0gc2VsZWN0b3Iuc3Vic3RyaW5nKGtleVNpZ2lsSW5kZXggKyAxKTtcblx0XHRcdFx0cmV0dXJuIGAke3NlbGVjdG9yLnNsaWNlKDAsIGtleVNpZ2lsSW5kZXgpfVtrZXk9XCIke2tleX1cIl1gO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHNlbGVjdG9yO1xuXHRcdH0pXG5cdFx0LmpvaW4oJyAnKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGFwdGVyOiBhbnkgPSB7XG5cdGlzVGFnKGVsZW06IEROb2RlKSB7XG5cdFx0cmV0dXJuIGlzVk5vZGUoZWxlbSk7XG5cdH0sXG5cdGdldFRleHQoZWxlbTogRE5vZGVbXSkge1xuXHRcdHJldHVybiAnJztcblx0fSxcblx0cmVtb3ZlU3Vic2V0cyhlbGVtZW50czogRE5vZGVbXSkge1xuXHRcdHJldHVybiBlbGVtZW50cztcblx0fSxcblx0Z2V0Q2hpbGRyZW4oZWxlbTogRE5vZGUpIHtcblx0XHRyZXR1cm4gaXNWTm9kZShlbGVtKSB8fCBpc1dOb2RlKGVsZW0pID8gZWxlbS5jaGlsZHJlbiA6IFtdO1xuXHR9LFxuXHRnZXRBdHRyaWJ1dGVWYWx1ZShlbGVtOiBETm9kZSwgbmFtZTogc3RyaW5nKSB7XG5cdFx0aWYgKGlzVk5vZGUoZWxlbSkgfHwgaXNXTm9kZShlbGVtKSkge1xuXHRcdFx0aWYgKG5hbWUgPT09ICdjbGFzcycpIHtcblx0XHRcdFx0Y29uc3QgY2xhc3NlcyA9IChlbGVtLnByb3BlcnRpZXMgYXMgYW55KS5jbGFzc2VzO1xuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShjbGFzc2VzKSkge1xuXHRcdFx0XHRcdHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gY2xhc3Nlcztcblx0XHRcdH1cblx0XHRcdHJldHVybiAoZWxlbS5wcm9wZXJ0aWVzIGFzIGFueSlbbmFtZV07XG5cdFx0fVxuXHR9LFxuXHRoYXNBdHRyaWIoZWxlbTogRE5vZGUsIG5hbWU6IHN0cmluZykge1xuXHRcdGlmIChpc1ZOb2RlKGVsZW0pIHx8IGlzV05vZGUoZWxlbSkpIHtcblx0XHRcdHJldHVybiBuYW1lIGluIGVsZW0ucHJvcGVydGllcztcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXHRleGlzdHNPbmUodGVzdDogVGVzdEZ1bmN0aW9uLCBlbGVtZW50czogRE5vZGVbXSkge1xuXHRcdHJldHVybiBlbGVtZW50cy5zb21lKChlbGVtOiBETm9kZSkgPT4gdGVzdChlbGVtKSk7XG5cdH0sXG5cdGdldE5hbWUoZWxlbTogRE5vZGUpIHtcblx0XHRpZiAoaXNWTm9kZShlbGVtKSkge1xuXHRcdFx0cmV0dXJuIGVsZW0udGFnO1xuXHRcdH1cblx0fSxcblx0Z2V0UGFyZW50KGVsZW06IEROb2RlKSB7XG5cdFx0aWYgKGlzVk5vZGUoZWxlbSkgfHwgaXNXTm9kZShlbGVtKSkge1xuXHRcdFx0cmV0dXJuIChlbGVtIGFzIGFueSkucGFyZW50O1xuXHRcdH1cblx0fSxcblx0Z2V0U2libGluZ3MoZWxlbTogRE5vZGUpIHtcblx0XHRpZiAoaXNWTm9kZShlbGVtKSB8fCBpc1dOb2RlKGVsZW0pKSB7XG5cdFx0XHRpZiAoKGVsZW0gYXMgYW55KS5wYXJlbnQpIHtcblx0XHRcdFx0cmV0dXJuIChlbGVtIGFzIGFueSkucGFyZW50LmNoaWxkcmVuO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFtlbGVtXTtcblx0XHR9XG5cdH0sXG5cdGZpbmRPbmUodGVzdDogVGVzdEZ1bmN0aW9uLCBhcnI6IEROb2RlW10pOiBETm9kZSB7XG5cdFx0bGV0IGVsZW0gPSBudWxsO1xuXHRcdGZvciAobGV0IGkgPSAwLCBsID0gYXJyLmxlbmd0aDsgaSA8IGwgJiYgIWVsZW07IGkrKykge1xuXHRcdFx0aWYgKHRlc3QoYXJyW2ldKSkge1xuXHRcdFx0XHRlbGVtID0gYXJyW2ldO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgY2hpbGRyZW4gPSBhZGFwdGVyLmdldENoaWxkcmVuKGFycltpXSk7XG5cdFx0XHRcdGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGFkYXB0ZXIuZmluZE9uZSh0ZXN0LCBjaGlsZHJlbik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGVsZW07XG5cdH0sXG5cdGZpbmRBbGwodGVzdDogVGVzdEZ1bmN0aW9uLCBlbGVtZW50czogRE5vZGVbXSk6IEROb2RlW10ge1xuXHRcdGxldCByZXN1bHQ6IEROb2RlW10gPSBbXTtcblx0XHRmb3IgKGxldCBpID0gMCwgaiA9IGVsZW1lbnRzLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuXHRcdFx0aWYgKHRlc3QoZWxlbWVudHNbaV0pKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKGVsZW1lbnRzW2ldKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGNoaWxkcmVuID0gYWRhcHRlci5nZXRDaGlsZHJlbihlbGVtZW50c1tpXSk7XG5cdFx0XHRpZiAoY2hpbGRyZW4pIHtcblx0XHRcdFx0cmVzdWx0ID0gWy4uLnJlc3VsdCwgLi4uYWRhcHRlci5maW5kQWxsKHRlc3QsIGNoaWxkcmVuKV07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3Qoc2VsZWN0b3I6IHN0cmluZywgbm9kZXM6IEROb2RlIHwgRE5vZGVbXSk6IChXTm9kZSB8IFZOb2RlKVtdIHtcblx0bm9kZXMgPSBBcnJheS5pc0FycmF5KG5vZGVzKSA/IG5vZGVzIDogW25vZGVzXTtcblx0c2VsZWN0b3IgPSBwYXJzZVNlbGVjdG9yKHNlbGVjdG9yKTtcblx0cmV0dXJuIGNzc1NlbGVjdChzZWxlY3Rvciwgbm9kZXMsIHsgYWRhcHRlciB9KSBhcyAoV05vZGUgfCBWTm9kZSlbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2VsZWN0O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHNlbGVjdG9yLnRzIiwiaW1wb3J0IHsgRXZlbnRlZCB9IGZyb20gJy4uL2NvcmUvRXZlbnRlZCc7XG5pbXBvcnQgeyBFdmVudE9iamVjdCB9IGZyb20gJy4uL2NvcmUvaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCB0eXBlIEluamVjdG9yRXZlbnRNYXAgPSB7XG5cdGludmFsaWRhdGU6IEV2ZW50T2JqZWN0PCdpbnZhbGlkYXRlJz47XG59O1xuXG5leHBvcnQgY2xhc3MgSW5qZWN0b3I8VCA9IGFueT4gZXh0ZW5kcyBFdmVudGVkPEluamVjdG9yRXZlbnRNYXA+IHtcblx0cHJpdmF0ZSBfcGF5bG9hZDogVDtcblx0cHJpdmF0ZSBfaW52YWxpZGF0b3I6IHVuZGVmaW5lZCB8ICgoKSA9PiB2b2lkKTtcblxuXHRjb25zdHJ1Y3RvcihwYXlsb2FkOiBUKSB7XG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLl9wYXlsb2FkID0gcGF5bG9hZDtcblx0fVxuXG5cdHB1YmxpYyBzZXRJbnZhbGlkYXRvcihpbnZhbGlkYXRvcjogKCkgPT4gdm9pZCkge1xuXHRcdHRoaXMuX2ludmFsaWRhdG9yID0gaW52YWxpZGF0b3I7XG5cdH1cblxuXHRwdWJsaWMgZ2V0KCk6IFQge1xuXHRcdHJldHVybiB0aGlzLl9wYXlsb2FkO1xuXHR9XG5cblx0cHVibGljIHNldChwYXlsb2FkOiBUKTogdm9pZCB7XG5cdFx0dGhpcy5fcGF5bG9hZCA9IHBheWxvYWQ7XG5cdFx0aWYgKHRoaXMuX2ludmFsaWRhdG9yKSB7XG5cdFx0XHR0aGlzLl9pbnZhbGlkYXRvcigpO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbmplY3RvcjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBJbmplY3Rvci50cyIsImltcG9ydCB7IEV2ZW50ZWQgfSBmcm9tICcuLi9jb3JlL0V2ZW50ZWQnO1xuaW1wb3J0IHsgRXZlbnRPYmplY3QgfSBmcm9tICcuLi9jb3JlL2ludGVyZmFjZXMnO1xuaW1wb3J0IE1hcCBmcm9tICcuLi9zaGltL01hcCc7XG5pbXBvcnQgeyBOb2RlSGFuZGxlckludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5cbi8qKlxuICogRW51bSB0byBpZGVudGlmeSB0aGUgdHlwZSBvZiBldmVudC5cbiAqIExpc3RlbmluZyB0byAnUHJvamVjdG9yJyB3aWxsIG5vdGlmeSB3aGVuIHByb2plY3RvciBpcyBjcmVhdGVkIG9yIHVwZGF0ZWRcbiAqIExpc3RlbmluZyB0byAnV2lkZ2V0JyB3aWxsIG5vdGlmeSB3aGVuIHdpZGdldCByb290IGlzIGNyZWF0ZWQgb3IgdXBkYXRlZFxuICovXG5leHBvcnQgZW51bSBOb2RlRXZlbnRUeXBlIHtcblx0UHJvamVjdG9yID0gJ1Byb2plY3RvcicsXG5cdFdpZGdldCA9ICdXaWRnZXQnXG59XG5cbmV4cG9ydCB0eXBlIE5vZGVIYW5kbGVyRXZlbnRNYXAgPSB7XG5cdFByb2plY3RvcjogRXZlbnRPYmplY3Q8Tm9kZUV2ZW50VHlwZS5Qcm9qZWN0b3I+O1xuXHRXaWRnZXQ6IEV2ZW50T2JqZWN0PE5vZGVFdmVudFR5cGUuV2lkZ2V0Pjtcbn07XG5cbmV4cG9ydCBjbGFzcyBOb2RlSGFuZGxlciBleHRlbmRzIEV2ZW50ZWQ8Tm9kZUhhbmRsZXJFdmVudE1hcD4gaW1wbGVtZW50cyBOb2RlSGFuZGxlckludGVyZmFjZSB7XG5cdHByaXZhdGUgX25vZGVNYXAgPSBuZXcgTWFwPHN0cmluZywgRWxlbWVudD4oKTtcblxuXHRwdWJsaWMgZ2V0KGtleTogc3RyaW5nKTogRWxlbWVudCB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuX25vZGVNYXAuZ2V0KGtleSk7XG5cdH1cblxuXHRwdWJsaWMgaGFzKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX25vZGVNYXAuaGFzKGtleSk7XG5cdH1cblxuXHRwdWJsaWMgYWRkKGVsZW1lbnQ6IEVsZW1lbnQsIGtleTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5fbm9kZU1hcC5zZXQoa2V5LCBlbGVtZW50KTtcblx0XHR0aGlzLmVtaXQoeyB0eXBlOiBrZXkgfSk7XG5cdH1cblxuXHRwdWJsaWMgYWRkUm9vdCgpOiB2b2lkIHtcblx0XHR0aGlzLmVtaXQoeyB0eXBlOiBOb2RlRXZlbnRUeXBlLldpZGdldCB9KTtcblx0fVxuXG5cdHB1YmxpYyBhZGRQcm9qZWN0b3IoKTogdm9pZCB7XG5cdFx0dGhpcy5lbWl0KHsgdHlwZTogTm9kZUV2ZW50VHlwZS5Qcm9qZWN0b3IgfSk7XG5cdH1cblxuXHRwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG5cdFx0dGhpcy5fbm9kZU1hcC5jbGVhcigpO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE5vZGVIYW5kbGVyO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIE5vZGVIYW5kbGVyLnRzIiwiaW1wb3J0IFByb21pc2UgZnJvbSAnLi4vc2hpbS9Qcm9taXNlJztcbmltcG9ydCBNYXAgZnJvbSAnLi4vc2hpbS9NYXAnO1xuaW1wb3J0IFN5bWJvbCBmcm9tICcuLi9zaGltL1N5bWJvbCc7XG5pbXBvcnQgeyBFdmVudE9iamVjdCB9IGZyb20gJy4uL2NvcmUvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBFdmVudGVkIH0gZnJvbSAnLi4vY29yZS9FdmVudGVkJztcbmltcG9ydCB7XG5cdENvbnN0cnVjdG9yLFxuXHRJbmplY3RvckZhY3RvcnksXG5cdEluamVjdG9ySXRlbSxcblx0UmVnaXN0cnlMYWJlbCxcblx0V2lkZ2V0QmFzZUNvbnN0cnVjdG9yLFxuXHRXaWRnZXRCYXNlSW50ZXJmYWNlXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCB0eXBlIFdpZGdldEJhc2VDb25zdHJ1Y3RvckZ1bmN0aW9uID0gKCkgPT4gUHJvbWlzZTxXaWRnZXRCYXNlQ29uc3RydWN0b3I+O1xuXG5leHBvcnQgdHlwZSBFU01EZWZhdWx0V2lkZ2V0QmFzZUZ1bmN0aW9uID0gKCkgPT4gUHJvbWlzZTxFU01EZWZhdWx0V2lkZ2V0QmFzZTxXaWRnZXRCYXNlSW50ZXJmYWNlPj47XG5cbmV4cG9ydCB0eXBlIFJlZ2lzdHJ5SXRlbSA9XG5cdHwgV2lkZ2V0QmFzZUNvbnN0cnVjdG9yXG5cdHwgUHJvbWlzZTxXaWRnZXRCYXNlQ29uc3RydWN0b3I+XG5cdHwgV2lkZ2V0QmFzZUNvbnN0cnVjdG9yRnVuY3Rpb25cblx0fCBFU01EZWZhdWx0V2lkZ2V0QmFzZUZ1bmN0aW9uO1xuXG4vKipcbiAqIFdpZGdldCBiYXNlIHN5bWJvbCB0eXBlXG4gKi9cbmV4cG9ydCBjb25zdCBXSURHRVRfQkFTRV9UWVBFID0gU3ltYm9sKCdXaWRnZXQgQmFzZScpO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdHJ5RXZlbnRPYmplY3QgZXh0ZW5kcyBFdmVudE9iamVjdDxSZWdpc3RyeUxhYmVsPiB7XG5cdGFjdGlvbjogc3RyaW5nO1xuXHRpdGVtOiBXaWRnZXRCYXNlQ29uc3RydWN0b3IgfCBJbmplY3RvckZhY3Rvcnk7XG59XG4vKipcbiAqIFdpZGdldCBSZWdpc3RyeSBJbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RyeUludGVyZmFjZSB7XG5cdC8qKlxuXHQgKiBEZWZpbmUgYSBXaWRnZXRSZWdpc3RyeUl0ZW0gYWdhaW5zdCBhIGxhYmVsXG5cdCAqXG5cdCAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgb2YgdGhlIHdpZGdldCB0byByZWdpc3RlclxuXHQgKiBAcGFyYW0gcmVnaXN0cnlJdGVtIFRoZSByZWdpc3RyeSBpdGVtIHRvIGRlZmluZVxuXHQgKi9cblx0ZGVmaW5lKGxhYmVsOiBSZWdpc3RyeUxhYmVsLCByZWdpc3RyeUl0ZW06IFJlZ2lzdHJ5SXRlbSk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIFJldHVybiBhIFJlZ2lzdHJ5SXRlbSBmb3IgdGhlIGdpdmVuIGxhYmVsLCBudWxsIGlmIGFuIGVudHJ5IGRvZXNuJ3QgZXhpc3Rcblx0ICpcblx0ICogQHBhcmFtIHdpZGdldExhYmVsIFRoZSBsYWJlbCBvZiB0aGUgd2lkZ2V0IHRvIHJldHVyblxuXHQgKiBAcmV0dXJucyBUaGUgUmVnaXN0cnlJdGVtIGZvciB0aGUgd2lkZ2V0TGFiZWwsIGBudWxsYCBpZiBubyBlbnRyeSBleGlzdHNcblx0ICovXG5cdGdldDxUIGV4dGVuZHMgV2lkZ2V0QmFzZUludGVyZmFjZSA9IFdpZGdldEJhc2VJbnRlcmZhY2U+KGxhYmVsOiBSZWdpc3RyeUxhYmVsKTogQ29uc3RydWN0b3I8VD4gfCBudWxsO1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgYm9vbGVhbiBpZiBhbiBlbnRyeSBmb3IgdGhlIGxhYmVsIGV4aXN0c1xuXHQgKlxuXHQgKiBAcGFyYW0gd2lkZ2V0TGFiZWwgVGhlIGxhYmVsIHRvIHNlYXJjaCBmb3Jcblx0ICogQHJldHVybnMgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGEgd2lkZ2V0IHJlZ2lzdHJ5IGl0ZW0gZXhpc3RzXG5cdCAqL1xuXHRoYXMobGFiZWw6IFJlZ2lzdHJ5TGFiZWwpOiBib29sZWFuO1xuXG5cdC8qKlxuXHQgKiBEZWZpbmUgYW4gSW5qZWN0b3IgYWdhaW5zdCBhIGxhYmVsXG5cdCAqXG5cdCAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgb2YgdGhlIGluamVjdG9yIHRvIHJlZ2lzdGVyXG5cdCAqIEBwYXJhbSByZWdpc3RyeUl0ZW0gVGhlIGluamVjdG9yIGZhY3Rvcnlcblx0ICovXG5cdGRlZmluZUluamVjdG9yKGxhYmVsOiBSZWdpc3RyeUxhYmVsLCBpbmplY3RvckZhY3Rvcnk6IEluamVjdG9yRmFjdG9yeSk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIFJldHVybiBhbiBJbmplY3RvciByZWdpc3RyeSBpdGVtIGZvciB0aGUgZ2l2ZW4gbGFiZWwsIG51bGwgaWYgYW4gZW50cnkgZG9lc24ndCBleGlzdFxuXHQgKlxuXHQgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIG9mIHRoZSBpbmplY3RvciB0byByZXR1cm5cblx0ICogQHJldHVybnMgVGhlIFJlZ2lzdHJ5SXRlbSBmb3IgdGhlIHdpZGdldExhYmVsLCBgbnVsbGAgaWYgbm8gZW50cnkgZXhpc3RzXG5cdCAqL1xuXHRnZXRJbmplY3RvcjxUPihsYWJlbDogUmVnaXN0cnlMYWJlbCk6IEluamVjdG9ySXRlbTxUPiB8IG51bGw7XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBib29sZWFuIGlmIGFuIGluamVjdG9yIGZvciB0aGUgbGFiZWwgZXhpc3RzXG5cdCAqXG5cdCAqIEBwYXJhbSB3aWRnZXRMYWJlbCBUaGUgbGFiZWwgdG8gc2VhcmNoIGZvclxuXHQgKiBAcmV0dXJucyBib29sZWFuIGluZGljYXRpbmcgaWYgYSBpbmplY3RvciByZWdpc3RyeSBpdGVtIGV4aXN0c1xuXHQgKi9cblx0aGFzSW5qZWN0b3IobGFiZWw6IFJlZ2lzdHJ5TGFiZWwpOiBib29sZWFuO1xufVxuXG4vKipcbiAqIENoZWNrcyBpcyB0aGUgaXRlbSBpcyBhIHN1YmNsYXNzIG9mIFdpZGdldEJhc2UgKG9yIGEgV2lkZ2V0QmFzZSlcbiAqXG4gKiBAcGFyYW0gaXRlbSB0aGUgaXRlbSB0byBjaGVja1xuICogQHJldHVybnMgdHJ1ZS9mYWxzZSBpbmRpY2F0aW5nIGlmIHRoZSBpdGVtIGlzIGEgV2lkZ2V0QmFzZUNvbnN0cnVjdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1dpZGdldEJhc2VDb25zdHJ1Y3RvcjxUIGV4dGVuZHMgV2lkZ2V0QmFzZUludGVyZmFjZT4oaXRlbTogYW55KTogaXRlbSBpcyBDb25zdHJ1Y3RvcjxUPiB7XG5cdHJldHVybiBCb29sZWFuKGl0ZW0gJiYgaXRlbS5fdHlwZSA9PT0gV0lER0VUX0JBU0VfVFlQRSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRVNNRGVmYXVsdFdpZGdldEJhc2U8VD4ge1xuXHRkZWZhdWx0OiBDb25zdHJ1Y3RvcjxUPjtcblx0X19lc01vZHVsZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1dpZGdldENvbnN0cnVjdG9yRGVmYXVsdEV4cG9ydDxUPihpdGVtOiBhbnkpOiBpdGVtIGlzIEVTTURlZmF1bHRXaWRnZXRCYXNlPFQ+IHtcblx0cmV0dXJuIEJvb2xlYW4oXG5cdFx0aXRlbSAmJlxuXHRcdFx0aXRlbS5oYXNPd25Qcm9wZXJ0eSgnX19lc01vZHVsZScpICYmXG5cdFx0XHRpdGVtLmhhc093blByb3BlcnR5KCdkZWZhdWx0JykgJiZcblx0XHRcdGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yKGl0ZW0uZGVmYXVsdClcblx0KTtcbn1cblxuLyoqXG4gKiBUaGUgUmVnaXN0cnkgaW1wbGVtZW50YXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lzdHJ5IGV4dGVuZHMgRXZlbnRlZDx7fSwgUmVnaXN0cnlMYWJlbCwgUmVnaXN0cnlFdmVudE9iamVjdD4gaW1wbGVtZW50cyBSZWdpc3RyeUludGVyZmFjZSB7XG5cdC8qKlxuXHQgKiBpbnRlcm5hbCBtYXAgb2YgbGFiZWxzIGFuZCBSZWdpc3RyeUl0ZW1cblx0ICovXG5cdHByaXZhdGUgX3dpZGdldFJlZ2lzdHJ5OiBNYXA8UmVnaXN0cnlMYWJlbCwgUmVnaXN0cnlJdGVtPiB8IHVuZGVmaW5lZDtcblxuXHRwcml2YXRlIF9pbmplY3RvclJlZ2lzdHJ5OiBNYXA8UmVnaXN0cnlMYWJlbCwgSW5qZWN0b3JJdGVtPiB8IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogRW1pdCBsb2FkZWQgZXZlbnQgZm9yIHJlZ2lzdHJ5IGxhYmVsXG5cdCAqL1xuXHRwcml2YXRlIGVtaXRMb2FkZWRFdmVudCh3aWRnZXRMYWJlbDogUmVnaXN0cnlMYWJlbCwgaXRlbTogV2lkZ2V0QmFzZUNvbnN0cnVjdG9yIHwgSW5qZWN0b3JJdGVtKTogdm9pZCB7XG5cdFx0dGhpcy5lbWl0KHtcblx0XHRcdHR5cGU6IHdpZGdldExhYmVsLFxuXHRcdFx0YWN0aW9uOiAnbG9hZGVkJyxcblx0XHRcdGl0ZW1cblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBkZWZpbmUobGFiZWw6IFJlZ2lzdHJ5TGFiZWwsIGl0ZW06IFJlZ2lzdHJ5SXRlbSk6IHZvaWQge1xuXHRcdGlmICh0aGlzLl93aWRnZXRSZWdpc3RyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLl93aWRnZXRSZWdpc3RyeSA9IG5ldyBNYXAoKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5fd2lkZ2V0UmVnaXN0cnkuaGFzKGxhYmVsKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGB3aWRnZXQgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIGZvciAnJHtsYWJlbC50b1N0cmluZygpfSdgKTtcblx0XHR9XG5cblx0XHR0aGlzLl93aWRnZXRSZWdpc3RyeS5zZXQobGFiZWwsIGl0ZW0pO1xuXG5cdFx0aWYgKGl0ZW0gaW5zdGFuY2VvZiBQcm9taXNlKSB7XG5cdFx0XHRpdGVtLnRoZW4oXG5cdFx0XHRcdCh3aWRnZXRDdG9yKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fd2lkZ2V0UmVnaXN0cnkhLnNldChsYWJlbCwgd2lkZ2V0Q3Rvcik7XG5cdFx0XHRcdFx0dGhpcy5lbWl0TG9hZGVkRXZlbnQobGFiZWwsIHdpZGdldEN0b3IpO1xuXHRcdFx0XHRcdHJldHVybiB3aWRnZXRDdG9yO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQoZXJyb3IpID0+IHtcblx0XHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yKGl0ZW0pKSB7XG5cdFx0XHR0aGlzLmVtaXRMb2FkZWRFdmVudChsYWJlbCwgaXRlbSk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGRlZmluZUluamVjdG9yKGxhYmVsOiBSZWdpc3RyeUxhYmVsLCBpbmplY3RvckZhY3Rvcnk6IEluamVjdG9yRmFjdG9yeSk6IHZvaWQge1xuXHRcdGlmICh0aGlzLl9pbmplY3RvclJlZ2lzdHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuX2luamVjdG9yUmVnaXN0cnkgPSBuZXcgTWFwKCk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX2luamVjdG9yUmVnaXN0cnkuaGFzKGxhYmVsKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBpbmplY3RvciBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgZm9yICcke2xhYmVsLnRvU3RyaW5nKCl9J2ApO1xuXHRcdH1cblxuXHRcdGNvbnN0IGludmFsaWRhdG9yID0gbmV3IEV2ZW50ZWQoKTtcblxuXHRcdGNvbnN0IGluamVjdG9ySXRlbTogSW5qZWN0b3JJdGVtID0ge1xuXHRcdFx0aW5qZWN0b3I6IGluamVjdG9yRmFjdG9yeSgoKSA9PiBpbnZhbGlkYXRvci5lbWl0KHsgdHlwZTogJ2ludmFsaWRhdGUnIH0pKSxcblx0XHRcdGludmFsaWRhdG9yXG5cdFx0fTtcblxuXHRcdHRoaXMuX2luamVjdG9yUmVnaXN0cnkuc2V0KGxhYmVsLCBpbmplY3Rvckl0ZW0pO1xuXHRcdHRoaXMuZW1pdExvYWRlZEV2ZW50KGxhYmVsLCBpbmplY3Rvckl0ZW0pO1xuXHR9XG5cblx0cHVibGljIGdldDxUIGV4dGVuZHMgV2lkZ2V0QmFzZUludGVyZmFjZSA9IFdpZGdldEJhc2VJbnRlcmZhY2U+KGxhYmVsOiBSZWdpc3RyeUxhYmVsKTogQ29uc3RydWN0b3I8VD4gfCBudWxsIHtcblx0XHRpZiAoIXRoaXMuX3dpZGdldFJlZ2lzdHJ5IHx8ICF0aGlzLmhhcyhsYWJlbCkpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGNvbnN0IGl0ZW0gPSB0aGlzLl93aWRnZXRSZWdpc3RyeS5nZXQobGFiZWwpO1xuXG5cdFx0aWYgKGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yPFQ+KGl0ZW0pKSB7XG5cdFx0XHRyZXR1cm4gaXRlbTtcblx0XHR9XG5cblx0XHRpZiAoaXRlbSBpbnN0YW5jZW9mIFByb21pc2UpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGNvbnN0IHByb21pc2UgPSAoPFdpZGdldEJhc2VDb25zdHJ1Y3RvckZ1bmN0aW9uPml0ZW0pKCk7XG5cdFx0dGhpcy5fd2lkZ2V0UmVnaXN0cnkuc2V0KGxhYmVsLCBwcm9taXNlKTtcblxuXHRcdHByb21pc2UudGhlbihcblx0XHRcdCh3aWRnZXRDdG9yKSA9PiB7XG5cdFx0XHRcdGlmIChpc1dpZGdldENvbnN0cnVjdG9yRGVmYXVsdEV4cG9ydDxUPih3aWRnZXRDdG9yKSkge1xuXHRcdFx0XHRcdHdpZGdldEN0b3IgPSB3aWRnZXRDdG9yLmRlZmF1bHQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLl93aWRnZXRSZWdpc3RyeSEuc2V0KGxhYmVsLCB3aWRnZXRDdG9yKTtcblx0XHRcdFx0dGhpcy5lbWl0TG9hZGVkRXZlbnQobGFiZWwsIHdpZGdldEN0b3IpO1xuXHRcdFx0XHRyZXR1cm4gd2lkZ2V0Q3Rvcjtcblx0XHRcdH0sXG5cdFx0XHQoZXJyb3IpID0+IHtcblx0XHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0XHR9XG5cdFx0KTtcblxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0cHVibGljIGdldEluamVjdG9yPFQ+KGxhYmVsOiBSZWdpc3RyeUxhYmVsKTogSW5qZWN0b3JJdGVtPFQ+IHwgbnVsbCB7XG5cdFx0aWYgKCF0aGlzLl9pbmplY3RvclJlZ2lzdHJ5IHx8ICF0aGlzLmhhc0luamVjdG9yKGxhYmVsKSkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX2luamVjdG9yUmVnaXN0cnkuZ2V0KGxhYmVsKSE7XG5cdH1cblxuXHRwdWJsaWMgaGFzKGxhYmVsOiBSZWdpc3RyeUxhYmVsKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIEJvb2xlYW4odGhpcy5fd2lkZ2V0UmVnaXN0cnkgJiYgdGhpcy5fd2lkZ2V0UmVnaXN0cnkuaGFzKGxhYmVsKSk7XG5cdH1cblxuXHRwdWJsaWMgaGFzSW5qZWN0b3IobGFiZWw6IFJlZ2lzdHJ5TGFiZWwpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gQm9vbGVhbih0aGlzLl9pbmplY3RvclJlZ2lzdHJ5ICYmIHRoaXMuX2luamVjdG9yUmVnaXN0cnkuaGFzKGxhYmVsKSk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVnaXN0cnk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gUmVnaXN0cnkudHMiLCJpbXBvcnQgeyBNYXAgfSBmcm9tICcuLi9zaGltL01hcCc7XG5pbXBvcnQgeyBFdmVudGVkIH0gZnJvbSAnLi4vY29yZS9FdmVudGVkJztcbmltcG9ydCB7IEV2ZW50T2JqZWN0IH0gZnJvbSAnLi4vY29yZS9pbnRlcmZhY2VzJztcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBJbmplY3RvckZhY3RvcnksIEluamVjdG9ySXRlbSwgUmVnaXN0cnlMYWJlbCwgV2lkZ2V0QmFzZUludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBSZWdpc3RyeSwgUmVnaXN0cnlFdmVudE9iamVjdCwgUmVnaXN0cnlJdGVtIH0gZnJvbSAnLi9SZWdpc3RyeSc7XG5cbmV4cG9ydCB0eXBlIFJlZ2lzdHJ5SGFuZGxlckV2ZW50TWFwID0ge1xuXHRpbnZhbGlkYXRlOiBFdmVudE9iamVjdDwnaW52YWxpZGF0ZSc+O1xufTtcblxuZXhwb3J0IGNsYXNzIFJlZ2lzdHJ5SGFuZGxlciBleHRlbmRzIEV2ZW50ZWQ8UmVnaXN0cnlIYW5kbGVyRXZlbnRNYXA+IHtcblx0cHJpdmF0ZSBfcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnkoKTtcblx0cHJpdmF0ZSBfcmVnaXN0cnlXaWRnZXRMYWJlbE1hcDogTWFwPFJlZ2lzdHJ5LCBSZWdpc3RyeUxhYmVsW10+ID0gbmV3IE1hcCgpO1xuXHRwcml2YXRlIF9yZWdpc3RyeUluamVjdG9yTGFiZWxNYXA6IE1hcDxSZWdpc3RyeSwgUmVnaXN0cnlMYWJlbFtdPiA9IG5ldyBNYXAoKTtcblx0cHJvdGVjdGVkIGJhc2VSZWdpc3RyeT86IFJlZ2lzdHJ5O1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpcy5vd24odGhpcy5fcmVnaXN0cnkpO1xuXHRcdGNvbnN0IGRlc3Ryb3kgPSAoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5iYXNlUmVnaXN0cnkpIHtcblx0XHRcdFx0dGhpcy5fcmVnaXN0cnlXaWRnZXRMYWJlbE1hcC5kZWxldGUodGhpcy5iYXNlUmVnaXN0cnkpO1xuXHRcdFx0XHR0aGlzLl9yZWdpc3RyeUluamVjdG9yTGFiZWxNYXAuZGVsZXRlKHRoaXMuYmFzZVJlZ2lzdHJ5KTtcblx0XHRcdFx0dGhpcy5iYXNlUmVnaXN0cnkgPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHR0aGlzLm93bih7IGRlc3Ryb3kgfSk7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGJhc2UoYmFzZVJlZ2lzdHJ5OiBSZWdpc3RyeSkge1xuXHRcdGlmICh0aGlzLmJhc2VSZWdpc3RyeSkge1xuXHRcdFx0dGhpcy5fcmVnaXN0cnlXaWRnZXRMYWJlbE1hcC5kZWxldGUodGhpcy5iYXNlUmVnaXN0cnkpO1xuXHRcdFx0dGhpcy5fcmVnaXN0cnlJbmplY3RvckxhYmVsTWFwLmRlbGV0ZSh0aGlzLmJhc2VSZWdpc3RyeSk7XG5cdFx0fVxuXHRcdHRoaXMuYmFzZVJlZ2lzdHJ5ID0gYmFzZVJlZ2lzdHJ5O1xuXHR9XG5cblx0cHVibGljIGRlZmluZShsYWJlbDogUmVnaXN0cnlMYWJlbCwgd2lkZ2V0OiBSZWdpc3RyeUl0ZW0pOiB2b2lkIHtcblx0XHR0aGlzLl9yZWdpc3RyeS5kZWZpbmUobGFiZWwsIHdpZGdldCk7XG5cdH1cblxuXHRwdWJsaWMgZGVmaW5lSW5qZWN0b3IobGFiZWw6IFJlZ2lzdHJ5TGFiZWwsIGluamVjdG9yOiBJbmplY3RvckZhY3RvcnkpOiB2b2lkIHtcblx0XHR0aGlzLl9yZWdpc3RyeS5kZWZpbmVJbmplY3RvcihsYWJlbCwgaW5qZWN0b3IpO1xuXHR9XG5cblx0cHVibGljIGhhcyhsYWJlbDogUmVnaXN0cnlMYWJlbCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9yZWdpc3RyeS5oYXMobGFiZWwpIHx8IEJvb2xlYW4odGhpcy5iYXNlUmVnaXN0cnkgJiYgdGhpcy5iYXNlUmVnaXN0cnkuaGFzKGxhYmVsKSk7XG5cdH1cblxuXHRwdWJsaWMgaGFzSW5qZWN0b3IobGFiZWw6IFJlZ2lzdHJ5TGFiZWwpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5fcmVnaXN0cnkuaGFzSW5qZWN0b3IobGFiZWwpIHx8IEJvb2xlYW4odGhpcy5iYXNlUmVnaXN0cnkgJiYgdGhpcy5iYXNlUmVnaXN0cnkuaGFzSW5qZWN0b3IobGFiZWwpKTtcblx0fVxuXG5cdHB1YmxpYyBnZXQ8VCBleHRlbmRzIFdpZGdldEJhc2VJbnRlcmZhY2UgPSBXaWRnZXRCYXNlSW50ZXJmYWNlPihcblx0XHRsYWJlbDogUmVnaXN0cnlMYWJlbCxcblx0XHRnbG9iYWxQcmVjZWRlbmNlOiBib29sZWFuID0gZmFsc2Vcblx0KTogQ29uc3RydWN0b3I8VD4gfCBudWxsIHtcblx0XHRyZXR1cm4gdGhpcy5fZ2V0KGxhYmVsLCBnbG9iYWxQcmVjZWRlbmNlLCAnZ2V0JywgdGhpcy5fcmVnaXN0cnlXaWRnZXRMYWJlbE1hcCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0SW5qZWN0b3I8VD4obGFiZWw6IFJlZ2lzdHJ5TGFiZWwsIGdsb2JhbFByZWNlZGVuY2U6IGJvb2xlYW4gPSBmYWxzZSk6IEluamVjdG9ySXRlbTxUPiB8IG51bGwge1xuXHRcdHJldHVybiB0aGlzLl9nZXQobGFiZWwsIGdsb2JhbFByZWNlZGVuY2UsICdnZXRJbmplY3RvcicsIHRoaXMuX3JlZ2lzdHJ5SW5qZWN0b3JMYWJlbE1hcCk7XG5cdH1cblxuXHRwcml2YXRlIF9nZXQoXG5cdFx0bGFiZWw6IFJlZ2lzdHJ5TGFiZWwsXG5cdFx0Z2xvYmFsUHJlY2VkZW5jZTogYm9vbGVhbixcblx0XHRnZXRGdW5jdGlvbk5hbWU6ICdnZXRJbmplY3RvcicgfCAnZ2V0Jyxcblx0XHRsYWJlbE1hcDogTWFwPFJlZ2lzdHJ5LCBSZWdpc3RyeUxhYmVsW10+XG5cdCk6IGFueSB7XG5cdFx0Y29uc3QgcmVnaXN0cmllcyA9IGdsb2JhbFByZWNlZGVuY2UgPyBbdGhpcy5iYXNlUmVnaXN0cnksIHRoaXMuX3JlZ2lzdHJ5XSA6IFt0aGlzLl9yZWdpc3RyeSwgdGhpcy5iYXNlUmVnaXN0cnldO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcmVnaXN0cmllcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgcmVnaXN0cnk6IGFueSA9IHJlZ2lzdHJpZXNbaV07XG5cdFx0XHRpZiAoIXJlZ2lzdHJ5KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaXRlbSA9IHJlZ2lzdHJ5W2dldEZ1bmN0aW9uTmFtZV0obGFiZWwpO1xuXHRcdFx0Y29uc3QgcmVnaXN0ZXJlZExhYmVscyA9IGxhYmVsTWFwLmdldChyZWdpc3RyeSkgfHwgW107XG5cdFx0XHRpZiAoaXRlbSkge1xuXHRcdFx0XHRyZXR1cm4gaXRlbTtcblx0XHRcdH0gZWxzZSBpZiAocmVnaXN0ZXJlZExhYmVscy5pbmRleE9mKGxhYmVsKSA9PT0gLTEpIHtcblx0XHRcdFx0Y29uc3QgaGFuZGxlID0gcmVnaXN0cnkub24obGFiZWwsIChldmVudDogUmVnaXN0cnlFdmVudE9iamVjdCkgPT4ge1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdGV2ZW50LmFjdGlvbiA9PT0gJ2xvYWRlZCcgJiZcblx0XHRcdFx0XHRcdCh0aGlzIGFzIGFueSlbZ2V0RnVuY3Rpb25OYW1lXShsYWJlbCwgZ2xvYmFsUHJlY2VkZW5jZSkgPT09IGV2ZW50Lml0ZW1cblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdHRoaXMuZW1pdCh7IHR5cGU6ICdpbnZhbGlkYXRlJyB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR0aGlzLm93bihoYW5kbGUpO1xuXHRcdFx0XHRsYWJlbE1hcC5zZXQocmVnaXN0cnksIFsuLi5yZWdpc3RlcmVkTGFiZWxzLCBsYWJlbF0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBSZWdpc3RyeUhhbmRsZXI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gUmVnaXN0cnlIYW5kbGVyLnRzIiwiaW1wb3J0IE1hcCBmcm9tICcuLi9zaGltL01hcCc7XG5pbXBvcnQgV2Vha01hcCBmcm9tICcuLi9zaGltL1dlYWtNYXAnO1xuaW1wb3J0IFN5bWJvbCBmcm9tICcuLi9zaGltL1N5bWJvbCc7XG5pbXBvcnQgeyBIYW5kbGUgfSBmcm9tICcuLi9jb3JlL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgdiB9IGZyb20gJy4vZCc7XG5pbXBvcnQgeyBhdXRvIH0gZnJvbSAnLi9kaWZmJztcbmltcG9ydCB7XG5cdEFmdGVyUmVuZGVyLFxuXHRCZWZvcmVQcm9wZXJ0aWVzLFxuXHRCZWZvcmVSZW5kZXIsXG5cdENvcmVQcm9wZXJ0aWVzLFxuXHREaWZmUHJvcGVydHlSZWFjdGlvbixcblx0RE5vZGUsXG5cdFJlbmRlcixcblx0V2lkZ2V0TWV0YUJhc2UsXG5cdFdpZGdldE1ldGFDb25zdHJ1Y3Rvcixcblx0V2lkZ2V0QmFzZUludGVyZmFjZSxcblx0V2lkZ2V0UHJvcGVydGllc1xufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IFJlZ2lzdHJ5SGFuZGxlciBmcm9tICcuL1JlZ2lzdHJ5SGFuZGxlcic7XG5pbXBvcnQgTm9kZUhhbmRsZXIgZnJvbSAnLi9Ob2RlSGFuZGxlcic7XG5pbXBvcnQgeyB3aWRnZXRJbnN0YW5jZU1hcCB9IGZyb20gJy4vdmRvbSc7XG5pbXBvcnQgeyBpc1dpZGdldEJhc2VDb25zdHJ1Y3RvciwgV0lER0VUX0JBU0VfVFlQRSB9IGZyb20gJy4vUmVnaXN0cnknO1xuXG5pbnRlcmZhY2UgUmVhY3Rpb25GdW5jdGlvbkNvbmZpZyB7XG5cdHByb3BlcnR5TmFtZTogc3RyaW5nO1xuXHRyZWFjdGlvbjogRGlmZlByb3BlcnR5UmVhY3Rpb247XG59XG5cbmV4cG9ydCB0eXBlIEJvdW5kRnVuY3Rpb25EYXRhID0geyBib3VuZEZ1bmM6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55OyBzY29wZTogYW55IH07XG5cbmNvbnN0IGRlY29yYXRvck1hcCA9IG5ldyBNYXA8RnVuY3Rpb24sIE1hcDxzdHJpbmcsIGFueVtdPj4oKTtcbmNvbnN0IGJvdW5kQXV0byA9IGF1dG8uYmluZChudWxsKTtcblxuZXhwb3J0IGNvbnN0IG5vQmluZCA9IFN5bWJvbC5mb3IoJ2Rvam9Ob0JpbmQnKTtcblxuLyoqXG4gKiBNYWluIHdpZGdldCBiYXNlIGZvciBhbGwgd2lkZ2V0cyB0byBleHRlbmRcbiAqL1xuZXhwb3J0IGNsYXNzIFdpZGdldEJhc2U8UCA9IFdpZGdldFByb3BlcnRpZXMsIEMgZXh0ZW5kcyBETm9kZSA9IEROb2RlPiBpbXBsZW1lbnRzIFdpZGdldEJhc2VJbnRlcmZhY2U8UCwgQz4ge1xuXHQvKipcblx0ICogc3RhdGljIGlkZW50aWZpZXJcblx0ICovXG5cdHN0YXRpYyBfdHlwZTogc3ltYm9sID0gV0lER0VUX0JBU0VfVFlQRTtcblxuXHQvKipcblx0ICogY2hpbGRyZW4gYXJyYXlcblx0ICovXG5cdHByaXZhdGUgX2NoaWxkcmVuOiAoQyB8IG51bGwpW107XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyBpZiBpdCBpcyB0aGUgaW5pdGlhbCBzZXQgcHJvcGVydGllcyBjeWNsZVxuXHQgKi9cblx0cHJpdmF0ZSBfaW5pdGlhbFByb3BlcnRpZXMgPSB0cnVlO1xuXG5cdC8qKlxuXHQgKiBpbnRlcm5hbCB3aWRnZXQgcHJvcGVydGllc1xuXHQgKi9cblx0cHJpdmF0ZSBfcHJvcGVydGllczogUCAmIFdpZGdldFByb3BlcnRpZXMgJiB7IFtpbmRleDogc3RyaW5nXTogYW55IH07XG5cblx0LyoqXG5cdCAqIEFycmF5IG9mIHByb3BlcnR5IGtleXMgY29uc2lkZXJlZCBjaGFuZ2VkIGZyb20gdGhlIHByZXZpb3VzIHNldCBwcm9wZXJ0aWVzXG5cdCAqL1xuXHRwcml2YXRlIF9jaGFuZ2VkUHJvcGVydHlLZXlzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdC8qKlxuXHQgKiBtYXAgb2YgZGVjb3JhdG9ycyB0aGF0IGFyZSBhcHBsaWVkIHRvIHRoaXMgd2lkZ2V0XG5cdCAqL1xuXHRwcml2YXRlIF9kZWNvcmF0b3JDYWNoZTogTWFwPHN0cmluZywgYW55W10+O1xuXG5cdHByaXZhdGUgX3JlZ2lzdHJ5OiBSZWdpc3RyeUhhbmRsZXIgfCB1bmRlZmluZWQ7XG5cblx0LyoqXG5cdCAqIE1hcCBvZiBmdW5jdGlvbnMgcHJvcGVydGllcyBmb3IgdGhlIGJvdW5kIGZ1bmN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIF9iaW5kRnVuY3Rpb25Qcm9wZXJ0eU1hcDogV2Vha01hcDwoLi4uYXJnczogYW55W10pID0+IGFueSwgQm91bmRGdW5jdGlvbkRhdGE+IHwgdW5kZWZpbmVkO1xuXG5cdHByaXZhdGUgX21ldGFNYXA6IE1hcDxXaWRnZXRNZXRhQ29uc3RydWN0b3I8YW55PiwgV2lkZ2V0TWV0YUJhc2U+IHwgdW5kZWZpbmVkO1xuXG5cdHByaXZhdGUgX2JvdW5kUmVuZGVyRnVuYzogUmVuZGVyO1xuXG5cdHByaXZhdGUgX2JvdW5kSW52YWxpZGF0ZTogKCkgPT4gdm9pZDtcblxuXHRwcml2YXRlIF9ub2RlSGFuZGxlcjogTm9kZUhhbmRsZXIgPSBuZXcgTm9kZUhhbmRsZXIoKTtcblxuXHRwcml2YXRlIF9oYW5kbGVzOiBIYW5kbGVbXSA9IFtdO1xuXG5cdC8qKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHRoaXMuX2NoaWxkcmVuID0gW107XG5cdFx0dGhpcy5fZGVjb3JhdG9yQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgYW55W10+KCk7XG5cdFx0dGhpcy5fcHJvcGVydGllcyA9IDxQPnt9O1xuXHRcdHRoaXMuX2JvdW5kUmVuZGVyRnVuYyA9IHRoaXMucmVuZGVyLmJpbmQodGhpcyk7XG5cdFx0dGhpcy5fYm91bmRJbnZhbGlkYXRlID0gdGhpcy5pbnZhbGlkYXRlLmJpbmQodGhpcyk7XG5cblx0XHR3aWRnZXRJbnN0YW5jZU1hcC5zZXQodGhpcywge1xuXHRcdFx0ZGlydHk6IHRydWUsXG5cdFx0XHRvbkF0dGFjaDogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHR0aGlzLm9uQXR0YWNoKCk7XG5cdFx0XHR9LFxuXHRcdFx0b25EZXRhY2g6ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0dGhpcy5vbkRldGFjaCgpO1xuXHRcdFx0XHR0aGlzLmRlc3Ryb3koKTtcblx0XHRcdH0sXG5cdFx0XHRub2RlSGFuZGxlcjogdGhpcy5fbm9kZUhhbmRsZXIsXG5cdFx0XHRyZWdpc3RyeTogKCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5yZWdpc3RyeTtcblx0XHRcdH0sXG5cdFx0XHRjb3JlUHJvcGVydGllczoge30gYXMgQ29yZVByb3BlcnRpZXMsXG5cdFx0XHRyZW5kZXJpbmc6IGZhbHNlLFxuXHRcdFx0aW5wdXRQcm9wZXJ0aWVzOiB7fVxuXHRcdH0pO1xuXG5cdFx0dGhpcy5fcnVuQWZ0ZXJDb25zdHJ1Y3RvcnMoKTtcblx0fVxuXG5cdHByb3RlY3RlZCBtZXRhPFQgZXh0ZW5kcyBXaWRnZXRNZXRhQmFzZT4oTWV0YVR5cGU6IFdpZGdldE1ldGFDb25zdHJ1Y3RvcjxUPik6IFQge1xuXHRcdGlmICh0aGlzLl9tZXRhTWFwID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuX21ldGFNYXAgPSBuZXcgTWFwPFdpZGdldE1ldGFDb25zdHJ1Y3Rvcjxhbnk+LCBXaWRnZXRNZXRhQmFzZT4oKTtcblx0XHR9XG5cdFx0bGV0IGNhY2hlZCA9IHRoaXMuX21ldGFNYXAuZ2V0KE1ldGFUeXBlKTtcblx0XHRpZiAoIWNhY2hlZCkge1xuXHRcdFx0Y2FjaGVkID0gbmV3IE1ldGFUeXBlKHtcblx0XHRcdFx0aW52YWxpZGF0ZTogdGhpcy5fYm91bmRJbnZhbGlkYXRlLFxuXHRcdFx0XHRub2RlSGFuZGxlcjogdGhpcy5fbm9kZUhhbmRsZXIsXG5cdFx0XHRcdGJpbmQ6IHRoaXNcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5vd24oY2FjaGVkKTtcblx0XHRcdHRoaXMuX21ldGFNYXAuc2V0KE1ldGFUeXBlLCBjYWNoZWQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjYWNoZWQgYXMgVDtcblx0fVxuXG5cdHByb3RlY3RlZCBvbkF0dGFjaCgpOiB2b2lkIHtcblx0XHQvLyBEbyBub3RoaW5nIGJ5IGRlZmF1bHQuXG5cdH1cblxuXHRwcm90ZWN0ZWQgb25EZXRhY2goKTogdm9pZCB7XG5cdFx0Ly8gRG8gbm90aGluZyBieSBkZWZhdWx0LlxuXHR9XG5cblx0cHVibGljIGdldCBwcm9wZXJ0aWVzKCk6IFJlYWRvbmx5PFA+ICYgUmVhZG9ubHk8V2lkZ2V0UHJvcGVydGllcz4ge1xuXHRcdHJldHVybiB0aGlzLl9wcm9wZXJ0aWVzO1xuXHR9XG5cblx0cHVibGljIGdldCBjaGFuZ2VkUHJvcGVydHlLZXlzKCk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gWy4uLnRoaXMuX2NoYW5nZWRQcm9wZXJ0eUtleXNdO1xuXHR9XG5cblx0cHVibGljIF9fc2V0Q29yZVByb3BlcnRpZXNfXyhjb3JlUHJvcGVydGllczogQ29yZVByb3BlcnRpZXMpOiB2b2lkIHtcblx0XHRjb25zdCB7IGJhc2VSZWdpc3RyeSB9ID0gY29yZVByb3BlcnRpZXM7XG5cdFx0Y29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHRoaXMpITtcblxuXHRcdGlmIChpbnN0YW5jZURhdGEuY29yZVByb3BlcnRpZXMuYmFzZVJlZ2lzdHJ5ICE9PSBiYXNlUmVnaXN0cnkpIHtcblx0XHRcdGlmICh0aGlzLl9yZWdpc3RyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRoaXMuX3JlZ2lzdHJ5ID0gbmV3IFJlZ2lzdHJ5SGFuZGxlcigpO1xuXHRcdFx0XHR0aGlzLm93bih0aGlzLl9yZWdpc3RyeSk7XG5cdFx0XHRcdHRoaXMub3duKHRoaXMuX3JlZ2lzdHJ5Lm9uKCdpbnZhbGlkYXRlJywgdGhpcy5fYm91bmRJbnZhbGlkYXRlKSk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9yZWdpc3RyeS5iYXNlID0gYmFzZVJlZ2lzdHJ5O1xuXHRcdFx0dGhpcy5pbnZhbGlkYXRlKCk7XG5cdFx0fVxuXHRcdGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcyA9IGNvcmVQcm9wZXJ0aWVzO1xuXHR9XG5cblx0cHVibGljIF9fc2V0UHJvcGVydGllc19fKG9yaWdpbmFsUHJvcGVydGllczogdGhpc1sncHJvcGVydGllcyddKTogdm9pZCB7XG5cdFx0Y29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHRoaXMpITtcblx0XHRpbnN0YW5jZURhdGEuaW5wdXRQcm9wZXJ0aWVzID0gb3JpZ2luYWxQcm9wZXJ0aWVzO1xuXHRcdGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLl9ydW5CZWZvcmVQcm9wZXJ0aWVzKG9yaWdpbmFsUHJvcGVydGllcyk7XG5cdFx0Y29uc3QgcmVnaXN0ZXJlZERpZmZQcm9wZXJ0eU5hbWVzID0gdGhpcy5nZXREZWNvcmF0b3IoJ3JlZ2lzdGVyZWREaWZmUHJvcGVydHknKTtcblx0XHRjb25zdCBjaGFuZ2VkUHJvcGVydHlLZXlzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IHByb3BlcnR5TmFtZXMgPSBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKTtcblxuXHRcdGlmICh0aGlzLl9pbml0aWFsUHJvcGVydGllcyA9PT0gZmFsc2UgfHwgcmVnaXN0ZXJlZERpZmZQcm9wZXJ0eU5hbWVzLmxlbmd0aCAhPT0gMCkge1xuXHRcdFx0Y29uc3QgYWxsUHJvcGVydGllcyA9IFsuLi5wcm9wZXJ0eU5hbWVzLCAuLi5PYmplY3Qua2V5cyh0aGlzLl9wcm9wZXJ0aWVzKV07XG5cdFx0XHRjb25zdCBjaGVja2VkUHJvcGVydGllczogKHN0cmluZyB8IG51bWJlcilbXSA9IFtdO1xuXHRcdFx0Y29uc3QgZGlmZlByb3BlcnR5UmVzdWx0czogYW55ID0ge307XG5cdFx0XHRsZXQgcnVuUmVhY3Rpb25zID0gZmFsc2U7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYWxsUHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBhbGxQcm9wZXJ0aWVzW2ldO1xuXHRcdFx0XHRpZiAoY2hlY2tlZFByb3BlcnRpZXMuaW5kZXhPZihwcm9wZXJ0eU5hbWUpICE9PSAtMSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNoZWNrZWRQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHlOYW1lKTtcblx0XHRcdFx0Y29uc3QgcHJldmlvdXNQcm9wZXJ0eSA9IHRoaXMuX3Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcblx0XHRcdFx0Y29uc3QgbmV3UHJvcGVydHkgPSB0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eShcblx0XHRcdFx0XHRwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0sXG5cdFx0XHRcdFx0aW5zdGFuY2VEYXRhLmNvcmVQcm9wZXJ0aWVzLmJpbmRcblx0XHRcdFx0KTtcblx0XHRcdFx0aWYgKHJlZ2lzdGVyZWREaWZmUHJvcGVydHlOYW1lcy5pbmRleE9mKHByb3BlcnR5TmFtZSkgIT09IC0xKSB7XG5cdFx0XHRcdFx0cnVuUmVhY3Rpb25zID0gdHJ1ZTtcblx0XHRcdFx0XHRjb25zdCBkaWZmRnVuY3Rpb25zID0gdGhpcy5nZXREZWNvcmF0b3IoYGRpZmZQcm9wZXJ0eToke3Byb3BlcnR5TmFtZX1gKTtcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGRpZmZGdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdGNvbnN0IHJlc3VsdCA9IGRpZmZGdW5jdGlvbnNbaV0ocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpO1xuXHRcdFx0XHRcdFx0aWYgKHJlc3VsdC5jaGFuZ2VkICYmIGNoYW5nZWRQcm9wZXJ0eUtleXMuaW5kZXhPZihwcm9wZXJ0eU5hbWUpID09PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRjaGFuZ2VkUHJvcGVydHlLZXlzLnB1c2gocHJvcGVydHlOYW1lKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydGllcykge1xuXHRcdFx0XHRcdFx0XHRkaWZmUHJvcGVydHlSZXN1bHRzW3Byb3BlcnR5TmFtZV0gPSByZXN1bHQudmFsdWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0IHJlc3VsdCA9IGJvdW5kQXV0byhwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSk7XG5cdFx0XHRcdFx0aWYgKHJlc3VsdC5jaGFuZ2VkICYmIGNoYW5nZWRQcm9wZXJ0eUtleXMuaW5kZXhPZihwcm9wZXJ0eU5hbWUpID09PSAtMSkge1xuXHRcdFx0XHRcdFx0Y2hhbmdlZFByb3BlcnR5S2V5cy5wdXNoKHByb3BlcnR5TmFtZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydGllcykge1xuXHRcdFx0XHRcdFx0ZGlmZlByb3BlcnR5UmVzdWx0c1twcm9wZXJ0eU5hbWVdID0gcmVzdWx0LnZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAocnVuUmVhY3Rpb25zKSB7XG5cdFx0XHRcdGNvbnN0IHJlYWN0aW9uRnVuY3Rpb25zOiBSZWFjdGlvbkZ1bmN0aW9uQ29uZmlnW10gPSB0aGlzLmdldERlY29yYXRvcignZGlmZlJlYWN0aW9uJyk7XG5cdFx0XHRcdGNvbnN0IGV4ZWN1dGVkUmVhY3Rpb25zOiBGdW5jdGlvbltdID0gW107XG5cdFx0XHRcdHJlYWN0aW9uRnVuY3Rpb25zLmZvckVhY2goKHsgcmVhY3Rpb24sIHByb3BlcnR5TmFtZSB9KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgcHJvcGVydHlDaGFuZ2VkID0gY2hhbmdlZFByb3BlcnR5S2V5cy5pbmRleE9mKHByb3BlcnR5TmFtZSkgIT09IC0xO1xuXHRcdFx0XHRcdGNvbnN0IHJlYWN0aW9uUnVuID0gZXhlY3V0ZWRSZWFjdGlvbnMuaW5kZXhPZihyZWFjdGlvbikgIT09IC0xO1xuXHRcdFx0XHRcdGlmIChwcm9wZXJ0eUNoYW5nZWQgJiYgIXJlYWN0aW9uUnVuKSB7XG5cdFx0XHRcdFx0XHRyZWFjdGlvbi5jYWxsKHRoaXMsIHRoaXMuX3Byb3BlcnRpZXMsIGRpZmZQcm9wZXJ0eVJlc3VsdHMpO1xuXHRcdFx0XHRcdFx0ZXhlY3V0ZWRSZWFjdGlvbnMucHVzaChyZWFjdGlvbik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX3Byb3BlcnRpZXMgPSBkaWZmUHJvcGVydHlSZXN1bHRzO1xuXHRcdFx0dGhpcy5fY2hhbmdlZFByb3BlcnR5S2V5cyA9IGNoYW5nZWRQcm9wZXJ0eUtleXM7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX2luaXRpYWxQcm9wZXJ0aWVzID0gZmFsc2U7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lc1tpXTtcblx0XHRcdFx0aWYgKHR5cGVvZiBwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHRwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eShcblx0XHRcdFx0XHRcdHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSxcblx0XHRcdFx0XHRcdGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcy5iaW5kXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjaGFuZ2VkUHJvcGVydHlLZXlzLnB1c2gocHJvcGVydHlOYW1lKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5fY2hhbmdlZFByb3BlcnR5S2V5cyA9IGNoYW5nZWRQcm9wZXJ0eUtleXM7XG5cdFx0XHR0aGlzLl9wcm9wZXJ0aWVzID0geyAuLi5wcm9wZXJ0aWVzIH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX2NoYW5nZWRQcm9wZXJ0eUtleXMubGVuZ3RoID4gMCkge1xuXHRcdFx0dGhpcy5pbnZhbGlkYXRlKCk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGdldCBjaGlsZHJlbigpOiAoQyB8IG51bGwpW10ge1xuXHRcdHJldHVybiB0aGlzLl9jaGlsZHJlbjtcblx0fVxuXG5cdHB1YmxpYyBfX3NldENoaWxkcmVuX18oY2hpbGRyZW46IChDIHwgbnVsbClbXSk6IHZvaWQge1xuXHRcdGlmICh0aGlzLl9jaGlsZHJlbi5sZW5ndGggPiAwIHx8IGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcblx0XHRcdHRoaXMuX2NoaWxkcmVuID0gY2hpbGRyZW47XG5cdFx0XHR0aGlzLmludmFsaWRhdGUoKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgX19yZW5kZXJfXygpOiBETm9kZSB8IEROb2RlW10ge1xuXHRcdGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldCh0aGlzKSE7XG5cdFx0aW5zdGFuY2VEYXRhLmRpcnR5ID0gZmFsc2U7XG5cdFx0Y29uc3QgcmVuZGVyID0gdGhpcy5fcnVuQmVmb3JlUmVuZGVycygpO1xuXHRcdGxldCBkTm9kZSA9IHJlbmRlcigpO1xuXHRcdGROb2RlID0gdGhpcy5ydW5BZnRlclJlbmRlcnMoZE5vZGUpO1xuXHRcdHRoaXMuX25vZGVIYW5kbGVyLmNsZWFyKCk7XG5cdFx0cmV0dXJuIGROb2RlO1xuXHR9XG5cblx0cHVibGljIGludmFsaWRhdGUoKTogdm9pZCB7XG5cdFx0Y29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHRoaXMpITtcblx0XHRpZiAoaW5zdGFuY2VEYXRhLmludmFsaWRhdGUpIHtcblx0XHRcdGluc3RhbmNlRGF0YS5pbnZhbGlkYXRlKCk7XG5cdFx0fVxuXHR9XG5cblx0cHJvdGVjdGVkIHJlbmRlcigpOiBETm9kZSB8IEROb2RlW10ge1xuXHRcdHJldHVybiB2KCdkaXYnLCB7fSwgdGhpcy5jaGlsZHJlbik7XG5cdH1cblxuXHQvKipcblx0ICogRnVuY3Rpb24gdG8gYWRkIGRlY29yYXRvcnMgdG8gV2lkZ2V0QmFzZVxuXHQgKlxuXHQgKiBAcGFyYW0gZGVjb3JhdG9yS2V5IFRoZSBrZXkgb2YgdGhlIGRlY29yYXRvclxuXHQgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBkZWNvcmF0b3Jcblx0ICovXG5cdHByb3RlY3RlZCBhZGREZWNvcmF0b3IoZGVjb3JhdG9yS2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcblx0XHR2YWx1ZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuXHRcdGlmICh0aGlzLmhhc093blByb3BlcnR5KCdjb25zdHJ1Y3RvcicpKSB7XG5cdFx0XHRsZXQgZGVjb3JhdG9yTGlzdCA9IGRlY29yYXRvck1hcC5nZXQodGhpcy5jb25zdHJ1Y3Rvcik7XG5cdFx0XHRpZiAoIWRlY29yYXRvckxpc3QpIHtcblx0XHRcdFx0ZGVjb3JhdG9yTGlzdCA9IG5ldyBNYXA8c3RyaW5nLCBhbnlbXT4oKTtcblx0XHRcdFx0ZGVjb3JhdG9yTWFwLnNldCh0aGlzLmNvbnN0cnVjdG9yLCBkZWNvcmF0b3JMaXN0KTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IHNwZWNpZmljRGVjb3JhdG9yTGlzdCA9IGRlY29yYXRvckxpc3QuZ2V0KGRlY29yYXRvcktleSk7XG5cdFx0XHRpZiAoIXNwZWNpZmljRGVjb3JhdG9yTGlzdCkge1xuXHRcdFx0XHRzcGVjaWZpY0RlY29yYXRvckxpc3QgPSBbXTtcblx0XHRcdFx0ZGVjb3JhdG9yTGlzdC5zZXQoZGVjb3JhdG9yS2V5LCBzcGVjaWZpY0RlY29yYXRvckxpc3QpO1xuXHRcdFx0fVxuXHRcdFx0c3BlY2lmaWNEZWNvcmF0b3JMaXN0LnB1c2goLi4udmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBkZWNvcmF0b3JzID0gdGhpcy5nZXREZWNvcmF0b3IoZGVjb3JhdG9yS2V5KTtcblx0XHRcdHRoaXMuX2RlY29yYXRvckNhY2hlLnNldChkZWNvcmF0b3JLZXksIFsuLi5kZWNvcmF0b3JzLCAuLi52YWx1ZV0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byBidWlsZCB0aGUgbGlzdCBvZiBkZWNvcmF0b3JzIGZyb20gdGhlIGdsb2JhbCBkZWNvcmF0b3IgbWFwLlxuXHQgKlxuXHQgKiBAcGFyYW0gZGVjb3JhdG9yS2V5ICBUaGUga2V5IG9mIHRoZSBkZWNvcmF0b3Jcblx0ICogQHJldHVybiBBbiBhcnJheSBvZiBkZWNvcmF0b3IgdmFsdWVzXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRwcml2YXRlIF9idWlsZERlY29yYXRvckxpc3QoZGVjb3JhdG9yS2V5OiBzdHJpbmcpOiBhbnlbXSB7XG5cdFx0Y29uc3QgYWxsRGVjb3JhdG9ycyA9IFtdO1xuXG5cdFx0bGV0IGNvbnN0cnVjdG9yID0gdGhpcy5jb25zdHJ1Y3RvcjtcblxuXHRcdHdoaWxlIChjb25zdHJ1Y3Rvcikge1xuXHRcdFx0Y29uc3QgaW5zdGFuY2VNYXAgPSBkZWNvcmF0b3JNYXAuZ2V0KGNvbnN0cnVjdG9yKTtcblx0XHRcdGlmIChpbnN0YW5jZU1hcCkge1xuXHRcdFx0XHRjb25zdCBkZWNvcmF0b3JzID0gaW5zdGFuY2VNYXAuZ2V0KGRlY29yYXRvcktleSk7XG5cblx0XHRcdFx0aWYgKGRlY29yYXRvcnMpIHtcblx0XHRcdFx0XHRhbGxEZWNvcmF0b3JzLnVuc2hpZnQoLi4uZGVjb3JhdG9ycyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3RydWN0b3IgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY29uc3RydWN0b3IpO1xuXHRcdH1cblxuXHRcdHJldHVybiBhbGxEZWNvcmF0b3JzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRvIHJldHJpZXZlIGRlY29yYXRvciB2YWx1ZXNcblx0ICpcblx0ICogQHBhcmFtIGRlY29yYXRvcktleSBUaGUga2V5IG9mIHRoZSBkZWNvcmF0b3Jcblx0ICogQHJldHVybnMgQW4gYXJyYXkgb2YgZGVjb3JhdG9yIHZhbHVlc1xuXHQgKi9cblx0cHJvdGVjdGVkIGdldERlY29yYXRvcihkZWNvcmF0b3JLZXk6IHN0cmluZyk6IGFueVtdIHtcblx0XHRsZXQgYWxsRGVjb3JhdG9ycyA9IHRoaXMuX2RlY29yYXRvckNhY2hlLmdldChkZWNvcmF0b3JLZXkpO1xuXG5cdFx0aWYgKGFsbERlY29yYXRvcnMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGFsbERlY29yYXRvcnM7XG5cdFx0fVxuXG5cdFx0YWxsRGVjb3JhdG9ycyA9IHRoaXMuX2J1aWxkRGVjb3JhdG9yTGlzdChkZWNvcmF0b3JLZXkpO1xuXG5cdFx0dGhpcy5fZGVjb3JhdG9yQ2FjaGUuc2V0KGRlY29yYXRvcktleSwgYWxsRGVjb3JhdG9ycyk7XG5cdFx0cmV0dXJuIGFsbERlY29yYXRvcnM7XG5cdH1cblxuXHQvKipcblx0ICogQmluZHMgdW5ib3VuZCBwcm9wZXJ0eSBmdW5jdGlvbnMgdG8gdGhlIHNwZWNpZmllZCBgYmluZGAgcHJvcGVydHlcblx0ICpcblx0ICogQHBhcmFtIHByb3BlcnRpZXMgcHJvcGVydGllcyB0byBjaGVjayBmb3IgZnVuY3Rpb25zXG5cdCAqL1xuXHRwcml2YXRlIF9iaW5kRnVuY3Rpb25Qcm9wZXJ0eShwcm9wZXJ0eTogYW55LCBiaW5kOiBhbnkpOiBhbnkge1xuXHRcdGlmICh0eXBlb2YgcHJvcGVydHkgPT09ICdmdW5jdGlvbicgJiYgIXByb3BlcnR5W25vQmluZF0gJiYgaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IocHJvcGVydHkpID09PSBmYWxzZSkge1xuXHRcdFx0aWYgKHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5TWFwID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhpcy5fYmluZEZ1bmN0aW9uUHJvcGVydHlNYXAgPSBuZXcgV2Vha01hcDxcblx0XHRcdFx0XHQoLi4uYXJnczogYW55W10pID0+IGFueSxcblx0XHRcdFx0XHR7IGJvdW5kRnVuYzogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk7IHNjb3BlOiBhbnkgfVxuXHRcdFx0XHQ+KCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBiaW5kSW5mbzogUGFydGlhbDxCb3VuZEZ1bmN0aW9uRGF0YT4gPSB0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eU1hcC5nZXQocHJvcGVydHkpIHx8IHt9O1xuXHRcdFx0bGV0IHsgYm91bmRGdW5jLCBzY29wZSB9ID0gYmluZEluZm87XG5cblx0XHRcdGlmIChib3VuZEZ1bmMgPT09IHVuZGVmaW5lZCB8fCBzY29wZSAhPT0gYmluZCkge1xuXHRcdFx0XHRib3VuZEZ1bmMgPSBwcm9wZXJ0eS5iaW5kKGJpbmQpIGFzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuXHRcdFx0XHR0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eU1hcC5zZXQocHJvcGVydHksIHsgYm91bmRGdW5jLCBzY29wZTogYmluZCB9KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBib3VuZEZ1bmM7XG5cdFx0fVxuXHRcdHJldHVybiBwcm9wZXJ0eTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgcmVnaXN0cnkoKTogUmVnaXN0cnlIYW5kbGVyIHtcblx0XHRpZiAodGhpcy5fcmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5fcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnlIYW5kbGVyKCk7XG5cdFx0XHR0aGlzLm93bih0aGlzLl9yZWdpc3RyeSk7XG5cdFx0XHR0aGlzLm93bih0aGlzLl9yZWdpc3RyeS5vbignaW52YWxpZGF0ZScsIHRoaXMuX2JvdW5kSW52YWxpZGF0ZSkpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5fcmVnaXN0cnk7XG5cdH1cblxuXHRwcml2YXRlIF9ydW5CZWZvcmVQcm9wZXJ0aWVzKHByb3BlcnRpZXM6IGFueSkge1xuXHRcdGNvbnN0IGJlZm9yZVByb3BlcnRpZXM6IEJlZm9yZVByb3BlcnRpZXNbXSA9IHRoaXMuZ2V0RGVjb3JhdG9yKCdiZWZvcmVQcm9wZXJ0aWVzJyk7XG5cdFx0aWYgKGJlZm9yZVByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0cmV0dXJuIGJlZm9yZVByb3BlcnRpZXMucmVkdWNlKFxuXHRcdFx0XHQocHJvcGVydGllcywgYmVmb3JlUHJvcGVydGllc0Z1bmN0aW9uKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHsgLi4ucHJvcGVydGllcywgLi4uYmVmb3JlUHJvcGVydGllc0Z1bmN0aW9uLmNhbGwodGhpcywgcHJvcGVydGllcykgfTtcblx0XHRcdFx0fSxcblx0XHRcdFx0eyAuLi5wcm9wZXJ0aWVzIH1cblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiBwcm9wZXJ0aWVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJ1biBhbGwgcmVnaXN0ZXJlZCBiZWZvcmUgcmVuZGVycyBhbmQgcmV0dXJuIHRoZSB1cGRhdGVkIHJlbmRlciBtZXRob2Rcblx0ICovXG5cdHByaXZhdGUgX3J1bkJlZm9yZVJlbmRlcnMoKTogUmVuZGVyIHtcblx0XHRjb25zdCBiZWZvcmVSZW5kZXJzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2JlZm9yZVJlbmRlcicpO1xuXG5cdFx0aWYgKGJlZm9yZVJlbmRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0cmV0dXJuIGJlZm9yZVJlbmRlcnMucmVkdWNlKChyZW5kZXI6IFJlbmRlciwgYmVmb3JlUmVuZGVyRnVuY3Rpb246IEJlZm9yZVJlbmRlcikgPT4ge1xuXHRcdFx0XHRjb25zdCB1cGRhdGVkUmVuZGVyID0gYmVmb3JlUmVuZGVyRnVuY3Rpb24uY2FsbCh0aGlzLCByZW5kZXIsIHRoaXMuX3Byb3BlcnRpZXMsIHRoaXMuX2NoaWxkcmVuKTtcblx0XHRcdFx0aWYgKCF1cGRhdGVkUmVuZGVyKSB7XG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCdSZW5kZXIgZnVuY3Rpb24gbm90IHJldHVybmVkIGZyb20gYmVmb3JlUmVuZGVyLCB1c2luZyBwcmV2aW91cyByZW5kZXInKTtcblx0XHRcdFx0XHRyZXR1cm4gcmVuZGVyO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB1cGRhdGVkUmVuZGVyO1xuXHRcdFx0fSwgdGhpcy5fYm91bmRSZW5kZXJGdW5jKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuX2JvdW5kUmVuZGVyRnVuYztcblx0fVxuXG5cdC8qKlxuXHQgKiBSdW4gYWxsIHJlZ2lzdGVyZWQgYWZ0ZXIgcmVuZGVycyBhbmQgcmV0dXJuIHRoZSBkZWNvcmF0ZWQgRE5vZGVzXG5cdCAqXG5cdCAqIEBwYXJhbSBkTm9kZSBUaGUgRE5vZGVzIHRvIHJ1biB0aHJvdWdoIHRoZSBhZnRlciByZW5kZXJzXG5cdCAqL1xuXHRwcm90ZWN0ZWQgcnVuQWZ0ZXJSZW5kZXJzKGROb2RlOiBETm9kZSB8IEROb2RlW10pOiBETm9kZSB8IEROb2RlW10ge1xuXHRcdGNvbnN0IGFmdGVyUmVuZGVycyA9IHRoaXMuZ2V0RGVjb3JhdG9yKCdhZnRlclJlbmRlcicpO1xuXG5cdFx0aWYgKGFmdGVyUmVuZGVycy5sZW5ndGggPiAwKSB7XG5cdFx0XHRkTm9kZSA9IGFmdGVyUmVuZGVycy5yZWR1Y2UoKGROb2RlOiBETm9kZSB8IEROb2RlW10sIGFmdGVyUmVuZGVyRnVuY3Rpb246IEFmdGVyUmVuZGVyKSA9PiB7XG5cdFx0XHRcdHJldHVybiBhZnRlclJlbmRlckZ1bmN0aW9uLmNhbGwodGhpcywgZE5vZGUpO1xuXHRcdFx0fSwgZE5vZGUpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9tZXRhTWFwICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuX21ldGFNYXAuZm9yRWFjaCgobWV0YSkgPT4ge1xuXHRcdFx0XHRtZXRhLmFmdGVyUmVuZGVyKCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZE5vZGU7XG5cdH1cblxuXHRwcml2YXRlIF9ydW5BZnRlckNvbnN0cnVjdG9ycygpOiB2b2lkIHtcblx0XHRjb25zdCBhZnRlckNvbnN0cnVjdG9ycyA9IHRoaXMuZ2V0RGVjb3JhdG9yKCdhZnRlckNvbnN0cnVjdG9yJyk7XG5cblx0XHRpZiAoYWZ0ZXJDb25zdHJ1Y3RvcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0YWZ0ZXJDb25zdHJ1Y3RvcnMuZm9yRWFjaCgoYWZ0ZXJDb25zdHJ1Y3RvcikgPT4gYWZ0ZXJDb25zdHJ1Y3Rvci5jYWxsKHRoaXMpKTtcblx0XHR9XG5cdH1cblxuXHRwcm90ZWN0ZWQgb3duKGhhbmRsZTogSGFuZGxlKTogdm9pZCB7XG5cdFx0dGhpcy5faGFuZGxlcy5wdXNoKGhhbmRsZSk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgZGVzdHJveSgpIHtcblx0XHR3aGlsZSAodGhpcy5faGFuZGxlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25zdCBoYW5kbGUgPSB0aGlzLl9oYW5kbGVzLnBvcCgpO1xuXHRcdFx0aWYgKGhhbmRsZSkge1xuXHRcdFx0XHRoYW5kbGUuZGVzdHJveSgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBXaWRnZXRCYXNlO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIFdpZGdldEJhc2UudHMiLCJpbXBvcnQgeyBWTm9kZVByb3BlcnRpZXMgfSBmcm9tICcuLy4uL2ludGVyZmFjZXMnO1xuXG5sZXQgYnJvd3NlclNwZWNpZmljVHJhbnNpdGlvbkVuZEV2ZW50TmFtZSA9ICcnO1xubGV0IGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSA9ICcnO1xuXG5mdW5jdGlvbiBkZXRlcm1pbmVCcm93c2VyU3R5bGVOYW1lcyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuXHRpZiAoJ1dlYmtpdFRyYW5zaXRpb24nIGluIGVsZW1lbnQuc3R5bGUpIHtcblx0XHRicm93c2VyU3BlY2lmaWNUcmFuc2l0aW9uRW5kRXZlbnROYW1lID0gJ3dlYmtpdFRyYW5zaXRpb25FbmQnO1xuXHRcdGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSA9ICd3ZWJraXRBbmltYXRpb25FbmQnO1xuXHR9IGVsc2UgaWYgKCd0cmFuc2l0aW9uJyBpbiBlbGVtZW50LnN0eWxlIHx8ICdNb3pUcmFuc2l0aW9uJyBpbiBlbGVtZW50LnN0eWxlKSB7XG5cdFx0YnJvd3NlclNwZWNpZmljVHJhbnNpdGlvbkVuZEV2ZW50TmFtZSA9ICd0cmFuc2l0aW9uZW5kJztcblx0XHRicm93c2VyU3BlY2lmaWNBbmltYXRpb25FbmRFdmVudE5hbWUgPSAnYW5pbWF0aW9uZW5kJztcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1lvdXIgYnJvd3NlciBpcyBub3Qgc3VwcG9ydGVkJyk7XG5cdH1cbn1cblxuZnVuY3Rpb24gaW5pdGlhbGl6ZShlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuXHRpZiAoYnJvd3NlclNwZWNpZmljQW5pbWF0aW9uRW5kRXZlbnROYW1lID09PSAnJykge1xuXHRcdGRldGVybWluZUJyb3dzZXJTdHlsZU5hbWVzKGVsZW1lbnQpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHJ1bkFuZENsZWFuVXAoZWxlbWVudDogSFRNTEVsZW1lbnQsIHN0YXJ0QW5pbWF0aW9uOiAoKSA9PiB2b2lkLCBmaW5pc2hBbmltYXRpb246ICgpID0+IHZvaWQpIHtcblx0aW5pdGlhbGl6ZShlbGVtZW50KTtcblxuXHRsZXQgZmluaXNoZWQgPSBmYWxzZTtcblxuXHRsZXQgdHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghZmluaXNoZWQpIHtcblx0XHRcdGZpbmlzaGVkID0gdHJ1ZTtcblx0XHRcdGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihicm93c2VyU3BlY2lmaWNUcmFuc2l0aW9uRW5kRXZlbnROYW1lLCB0cmFuc2l0aW9uRW5kKTtcblx0XHRcdGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihicm93c2VyU3BlY2lmaWNBbmltYXRpb25FbmRFdmVudE5hbWUsIHRyYW5zaXRpb25FbmQpO1xuXG5cdFx0XHRmaW5pc2hBbmltYXRpb24oKTtcblx0XHR9XG5cdH07XG5cblx0c3RhcnRBbmltYXRpb24oKTtcblxuXHRlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoYnJvd3NlclNwZWNpZmljQW5pbWF0aW9uRW5kRXZlbnROYW1lLCB0cmFuc2l0aW9uRW5kKTtcblx0ZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGJyb3dzZXJTcGVjaWZpY1RyYW5zaXRpb25FbmRFdmVudE5hbWUsIHRyYW5zaXRpb25FbmQpO1xufVxuXG5mdW5jdGlvbiBleGl0KG5vZGU6IEhUTUxFbGVtZW50LCBwcm9wZXJ0aWVzOiBWTm9kZVByb3BlcnRpZXMsIGV4aXRBbmltYXRpb246IHN0cmluZywgcmVtb3ZlTm9kZTogKCkgPT4gdm9pZCkge1xuXHRjb25zdCBhY3RpdmVDbGFzcyA9IHByb3BlcnRpZXMuZXhpdEFuaW1hdGlvbkFjdGl2ZSB8fCBgJHtleGl0QW5pbWF0aW9ufS1hY3RpdmVgO1xuXG5cdHJ1bkFuZENsZWFuVXAoXG5cdFx0bm9kZSxcblx0XHQoKSA9PiB7XG5cdFx0XHRub2RlLmNsYXNzTGlzdC5hZGQoZXhpdEFuaW1hdGlvbik7XG5cblx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpIHtcblx0XHRcdFx0bm9kZS5jbGFzc0xpc3QuYWRkKGFjdGl2ZUNsYXNzKTtcblx0XHRcdH0pO1xuXHRcdH0sXG5cdFx0KCkgPT4ge1xuXHRcdFx0cmVtb3ZlTm9kZSgpO1xuXHRcdH1cblx0KTtcbn1cblxuZnVuY3Rpb24gZW50ZXIobm9kZTogSFRNTEVsZW1lbnQsIHByb3BlcnRpZXM6IFZOb2RlUHJvcGVydGllcywgZW50ZXJBbmltYXRpb246IHN0cmluZykge1xuXHRjb25zdCBhY3RpdmVDbGFzcyA9IHByb3BlcnRpZXMuZW50ZXJBbmltYXRpb25BY3RpdmUgfHwgYCR7ZW50ZXJBbmltYXRpb259LWFjdGl2ZWA7XG5cblx0cnVuQW5kQ2xlYW5VcChcblx0XHRub2RlLFxuXHRcdCgpID0+IHtcblx0XHRcdG5vZGUuY2xhc3NMaXN0LmFkZChlbnRlckFuaW1hdGlvbik7XG5cblx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpIHtcblx0XHRcdFx0bm9kZS5jbGFzc0xpc3QuYWRkKGFjdGl2ZUNsYXNzKTtcblx0XHRcdH0pO1xuXHRcdH0sXG5cdFx0KCkgPT4ge1xuXHRcdFx0bm9kZS5jbGFzc0xpc3QucmVtb3ZlKGVudGVyQW5pbWF0aW9uKTtcblx0XHRcdG5vZGUuY2xhc3NMaXN0LnJlbW92ZShhY3RpdmVDbGFzcyk7XG5cdFx0fVxuXHQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG5cdGVudGVyLFxuXHRleGl0XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGNzc1RyYW5zaXRpb25zLnRzIiwiaW1wb3J0IFN5bWJvbCBmcm9tICcuLi9zaGltL1N5bWJvbCc7XG5pbXBvcnQge1xuXHRDb25zdHJ1Y3Rvcixcblx0RGVmYXVsdFdpZGdldEJhc2VJbnRlcmZhY2UsXG5cdERlZmVycmVkVmlydHVhbFByb3BlcnRpZXMsXG5cdEROb2RlLFxuXHRWTm9kZSxcblx0UmVnaXN0cnlMYWJlbCxcblx0Vk5vZGVQcm9wZXJ0aWVzLFxuXHRXaWRnZXRCYXNlSW50ZXJmYWNlLFxuXHRXTm9kZSxcblx0RG9tT3B0aW9uc1xufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgSW50ZXJuYWxWTm9kZSwgUmVuZGVyUmVzdWx0IH0gZnJvbSAnLi92ZG9tJztcblxuLyoqXG4gKiBUaGUgc3ltYm9sIGlkZW50aWZpZXIgZm9yIGEgV05vZGUgdHlwZVxuICovXG5leHBvcnQgY29uc3QgV05PREUgPSBTeW1ib2woJ0lkZW50aWZpZXIgZm9yIGEgV05vZGUuJyk7XG5cbi8qKlxuICogVGhlIHN5bWJvbCBpZGVudGlmaWVyIGZvciBhIFZOb2RlIHR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IFZOT0RFID0gU3ltYm9sKCdJZGVudGlmaWVyIGZvciBhIFZOb2RlLicpO1xuXG4vKipcbiAqIFRoZSBzeW1ib2wgaWRlbnRpZmllciBmb3IgYSBWTm9kZSB0eXBlIGNyZWF0ZWQgdXNpbmcgZG9tKClcbiAqL1xuZXhwb3J0IGNvbnN0IERPTVZOT0RFID0gU3ltYm9sKCdJZGVudGlmaWVyIGZvciBhIFZOb2RlIGNyZWF0ZWQgdXNpbmcgZXhpc3RpbmcgZG9tLicpO1xuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgYEROb2RlYCBpcyBhIGBXTm9kZWAgdXNpbmcgdGhlIGB0eXBlYCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNXTm9kZTxXIGV4dGVuZHMgV2lkZ2V0QmFzZUludGVyZmFjZSA9IERlZmF1bHRXaWRnZXRCYXNlSW50ZXJmYWNlPihcblx0Y2hpbGQ6IEROb2RlPFc+XG4pOiBjaGlsZCBpcyBXTm9kZTxXPiB7XG5cdHJldHVybiBCb29sZWFuKGNoaWxkICYmIHR5cGVvZiBjaGlsZCAhPT0gJ3N0cmluZycgJiYgY2hpbGQudHlwZSA9PT0gV05PREUpO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgYEROb2RlYCBpcyBhIGBWTm9kZWAgdXNpbmcgdGhlIGB0eXBlYCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWTm9kZShjaGlsZDogRE5vZGUpOiBjaGlsZCBpcyBWTm9kZSB7XG5cdHJldHVybiBCb29sZWFuKGNoaWxkICYmIHR5cGVvZiBjaGlsZCAhPT0gJ3N0cmluZycgJiYgKGNoaWxkLnR5cGUgPT09IFZOT0RFIHx8IGNoaWxkLnR5cGUgPT09IERPTVZOT0RFKSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBgRE5vZGVgIGlzIGEgYFZOb2RlYCBjcmVhdGVkIHdpdGggYGRvbSgpYCB1c2luZyB0aGUgYHR5cGVgIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RvbVZOb2RlKGNoaWxkOiBETm9kZSk6IGNoaWxkIGlzIFZOb2RlIHtcblx0cmV0dXJuIEJvb2xlYW4oY2hpbGQgJiYgdHlwZW9mIGNoaWxkICE9PSAnc3RyaW5nJyAmJiBjaGlsZC50eXBlID09PSBET01WTk9ERSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VsZW1lbnROb2RlKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBFbGVtZW50IHtcblx0cmV0dXJuICEhdmFsdWUudGFnTmFtZTtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIHRoZSBkZWNvcmF0ZSBtb2RpZmllclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGlmaWVyPFQgZXh0ZW5kcyBETm9kZT4ge1xuXHQoZE5vZGU6IFQsIGJyZWFrZXI6ICgpID0+IHZvaWQpOiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSBwcmVkaWNhdGUgZnVuY3Rpb24gZm9yIGRlY29yYXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJlZGljYXRlPFQgZXh0ZW5kcyBETm9kZT4ge1xuXHQoZE5vZGU6IEROb2RlKTogZE5vZGUgaXMgVDtcbn1cblxuLyoqXG4gKiBEZWNvcmF0b3Igb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERlY29yYXRlT3B0aW9uczxUIGV4dGVuZHMgRE5vZGU+IHtcblx0bW9kaWZpZXI6IE1vZGlmaWVyPFQ+O1xuXHRwcmVkaWNhdGU/OiBQcmVkaWNhdGU8VD47XG5cdHNoYWxsb3c/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEdlbmVyaWMgZGVjb3JhdGUgZnVuY3Rpb24gZm9yIEROb2Rlcy4gVGhlIG5vZGVzIGFyZSBtb2RpZmllZCBpbiBwbGFjZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcHJlZGljYXRlXG4gKiBhbmQgbW9kaWZpZXIgZnVuY3Rpb25zLlxuICpcbiAqIFRoZSBjaGlsZHJlbiBvZiBlYWNoIG5vZGUgYXJlIGZsYXR0ZW5lZCBhbmQgYWRkZWQgdG8gdGhlIGFycmF5IGZvciBkZWNvcmF0aW9uLlxuICpcbiAqIElmIG5vIHByZWRpY2F0ZSBpcyBzdXBwbGllZCB0aGVuIHRoZSBtb2RpZmllciB3aWxsIGJlIGV4ZWN1dGVkIG9uIGFsbCBub2Rlcy4gQSBgYnJlYWtlcmAgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIHRoZVxuICogbW9kaWZpZXIgd2hpY2ggd2lsbCBkcmFpbiB0aGUgbm9kZXMgYXJyYXkgYW5kIGV4aXQgdGhlIGRlY29yYXRpb24uXG4gKlxuICogV2hlbiB0aGUgYHNoYWxsb3dgIG9wdGlvbnMgaXMgc2V0IHRvIGB0cnVlYCB0aGUgb25seSB0aGUgdG9wIG5vZGUgb3Igbm9kZXMgd2lsbCBiZSBkZWNvcmF0ZWQgKG9ubHkgc3VwcG9ydGVkIHVzaW5nXG4gKiBgRGVjb3JhdGVPcHRpb25zYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvcmF0ZTxUIGV4dGVuZHMgRE5vZGU+KGROb2RlczogRE5vZGUsIG9wdGlvbnM6IERlY29yYXRlT3B0aW9uczxUPik6IEROb2RlO1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29yYXRlPFQgZXh0ZW5kcyBETm9kZT4oZE5vZGVzOiBETm9kZVtdLCBvcHRpb25zOiBEZWNvcmF0ZU9wdGlvbnM8VD4pOiBETm9kZVtdO1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29yYXRlPFQgZXh0ZW5kcyBETm9kZT4oZE5vZGVzOiBETm9kZSB8IEROb2RlW10sIG9wdGlvbnM6IERlY29yYXRlT3B0aW9uczxUPik6IEROb2RlIHwgRE5vZGVbXTtcbmV4cG9ydCBmdW5jdGlvbiBkZWNvcmF0ZTxUIGV4dGVuZHMgRE5vZGU+KGROb2RlczogRE5vZGUsIG1vZGlmaWVyOiBNb2RpZmllcjxUPiwgcHJlZGljYXRlOiBQcmVkaWNhdGU8VD4pOiBETm9kZTtcbmV4cG9ydCBmdW5jdGlvbiBkZWNvcmF0ZTxUIGV4dGVuZHMgRE5vZGU+KGROb2RlczogRE5vZGVbXSwgbW9kaWZpZXI6IE1vZGlmaWVyPFQ+LCBwcmVkaWNhdGU6IFByZWRpY2F0ZTxUPik6IEROb2RlW107XG5leHBvcnQgZnVuY3Rpb24gZGVjb3JhdGU8VCBleHRlbmRzIEROb2RlPihcblx0ZE5vZGVzOiBSZW5kZXJSZXN1bHQsXG5cdG1vZGlmaWVyOiBNb2RpZmllcjxUPixcblx0cHJlZGljYXRlOiBQcmVkaWNhdGU8VD5cbik6IFJlbmRlclJlc3VsdDtcbmV4cG9ydCBmdW5jdGlvbiBkZWNvcmF0ZShkTm9kZXM6IEROb2RlLCBtb2RpZmllcjogTW9kaWZpZXI8RE5vZGU+KTogRE5vZGU7XG5leHBvcnQgZnVuY3Rpb24gZGVjb3JhdGUoZE5vZGVzOiBETm9kZVtdLCBtb2RpZmllcjogTW9kaWZpZXI8RE5vZGU+KTogRE5vZGVbXTtcbmV4cG9ydCBmdW5jdGlvbiBkZWNvcmF0ZShkTm9kZXM6IFJlbmRlclJlc3VsdCwgbW9kaWZpZXI6IE1vZGlmaWVyPEROb2RlPik6IFJlbmRlclJlc3VsdDtcbmV4cG9ydCBmdW5jdGlvbiBkZWNvcmF0ZShcblx0ZE5vZGVzOiBETm9kZSB8IEROb2RlW10sXG5cdG9wdGlvbnNPck1vZGlmaWVyOiBNb2RpZmllcjxETm9kZT4gfCBEZWNvcmF0ZU9wdGlvbnM8RE5vZGU+LFxuXHRwcmVkaWNhdGU/OiBQcmVkaWNhdGU8RE5vZGU+XG4pOiBETm9kZSB8IEROb2RlW10ge1xuXHRsZXQgc2hhbGxvdyA9IGZhbHNlO1xuXHRsZXQgbW9kaWZpZXI7XG5cdGlmICh0eXBlb2Ygb3B0aW9uc09yTW9kaWZpZXIgPT09ICdmdW5jdGlvbicpIHtcblx0XHRtb2RpZmllciA9IG9wdGlvbnNPck1vZGlmaWVyO1xuXHR9IGVsc2Uge1xuXHRcdG1vZGlmaWVyID0gb3B0aW9uc09yTW9kaWZpZXIubW9kaWZpZXI7XG5cdFx0cHJlZGljYXRlID0gb3B0aW9uc09yTW9kaWZpZXIucHJlZGljYXRlO1xuXHRcdHNoYWxsb3cgPSBvcHRpb25zT3JNb2RpZmllci5zaGFsbG93IHx8IGZhbHNlO1xuXHR9XG5cblx0bGV0IG5vZGVzID0gQXJyYXkuaXNBcnJheShkTm9kZXMpID8gWy4uLmROb2Rlc10gOiBbZE5vZGVzXTtcblx0ZnVuY3Rpb24gYnJlYWtlcigpIHtcblx0XHRub2RlcyA9IFtdO1xuXHR9XG5cdHdoaWxlIChub2Rlcy5sZW5ndGgpIHtcblx0XHRjb25zdCBub2RlID0gbm9kZXMuc2hpZnQoKTtcblx0XHRpZiAobm9kZSkge1xuXHRcdFx0aWYgKCFzaGFsbG93ICYmIChpc1dOb2RlKG5vZGUpIHx8IGlzVk5vZGUobm9kZSkpICYmIG5vZGUuY2hpbGRyZW4pIHtcblx0XHRcdFx0bm9kZXMgPSBbLi4ubm9kZXMsIC4uLm5vZGUuY2hpbGRyZW5dO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFwcmVkaWNhdGUgfHwgcHJlZGljYXRlKG5vZGUpKSB7XG5cdFx0XHRcdG1vZGlmaWVyKG5vZGUsIGJyZWFrZXIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gZE5vZGVzO1xufVxuXG4vKipcbiAqIFdyYXBwZXIgZnVuY3Rpb24gZm9yIGNhbGxzIHRvIGNyZWF0ZSBhIHdpZGdldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHc8VyBleHRlbmRzIFdpZGdldEJhc2VJbnRlcmZhY2U+KFxuXHR3aWRnZXRDb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8Vz4gfCBSZWdpc3RyeUxhYmVsLFxuXHRwcm9wZXJ0aWVzOiBXWydwcm9wZXJ0aWVzJ10sXG5cdGNoaWxkcmVuOiBXWydjaGlsZHJlbiddID0gW11cbik6IFdOb2RlPFc+IHtcblx0cmV0dXJuIHtcblx0XHRjaGlsZHJlbixcblx0XHR3aWRnZXRDb25zdHJ1Y3Rvcixcblx0XHRwcm9wZXJ0aWVzLFxuXHRcdHR5cGU6IFdOT0RFXG5cdH07XG59XG5cbi8qKlxuICogV3JhcHBlciBmdW5jdGlvbiBmb3IgY2FsbHMgdG8gY3JlYXRlIFZOb2Rlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHYodGFnOiBzdHJpbmcsIGNoaWxkcmVuOiB1bmRlZmluZWQgfCBETm9kZVtdKTogVk5vZGU7XG5leHBvcnQgZnVuY3Rpb24gdih0YWc6IHN0cmluZywgcHJvcGVydGllczogRGVmZXJyZWRWaXJ0dWFsUHJvcGVydGllcyB8IFZOb2RlUHJvcGVydGllcywgY2hpbGRyZW4/OiBETm9kZVtdKTogVk5vZGU7XG5leHBvcnQgZnVuY3Rpb24gdih0YWc6IHN0cmluZyk6IFZOb2RlO1xuZXhwb3J0IGZ1bmN0aW9uIHYoXG5cdHRhZzogc3RyaW5nLFxuXHRwcm9wZXJ0aWVzT3JDaGlsZHJlbjogVk5vZGVQcm9wZXJ0aWVzIHwgRGVmZXJyZWRWaXJ0dWFsUHJvcGVydGllcyB8IEROb2RlW10gPSB7fSxcblx0Y2hpbGRyZW46IHVuZGVmaW5lZCB8IEROb2RlW10gPSB1bmRlZmluZWRcbik6IFZOb2RlIHtcblx0bGV0IHByb3BlcnRpZXM6IFZOb2RlUHJvcGVydGllcyB8IERlZmVycmVkVmlydHVhbFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzT3JDaGlsZHJlbjtcblx0bGV0IGRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrO1xuXG5cdGlmIChBcnJheS5pc0FycmF5KHByb3BlcnRpZXNPckNoaWxkcmVuKSkge1xuXHRcdGNoaWxkcmVuID0gcHJvcGVydGllc09yQ2hpbGRyZW47XG5cdFx0cHJvcGVydGllcyA9IHt9O1xuXHR9XG5cblx0aWYgKHR5cGVvZiBwcm9wZXJ0aWVzID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0ZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2sgPSBwcm9wZXJ0aWVzO1xuXHRcdHByb3BlcnRpZXMgPSB7fTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0dGFnLFxuXHRcdGRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrLFxuXHRcdGNoaWxkcmVuLFxuXHRcdHByb3BlcnRpZXMsXG5cdFx0dHlwZTogVk5PREVcblx0fTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBWTm9kZSBmb3IgYW4gZXhpc3RpbmcgRE9NIE5vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb20oXG5cdHsgbm9kZSwgYXR0cnMgPSB7fSwgcHJvcHMgPSB7fSwgb24gPSB7fSwgZGlmZlR5cGUgPSAnbm9uZScgfTogRG9tT3B0aW9ucyxcblx0Y2hpbGRyZW4/OiBETm9kZVtdXG4pOiBWTm9kZSB7XG5cdHJldHVybiB7XG5cdFx0dGFnOiBpc0VsZW1lbnROb2RlKG5vZGUpID8gbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgOiAnJyxcblx0XHRwcm9wZXJ0aWVzOiBwcm9wcyxcblx0XHRhdHRyaWJ1dGVzOiBhdHRycyxcblx0XHRldmVudHM6IG9uLFxuXHRcdGNoaWxkcmVuLFxuXHRcdHR5cGU6IERPTVZOT0RFLFxuXHRcdGRvbU5vZGU6IG5vZGUsXG5cdFx0dGV4dDogaXNFbGVtZW50Tm9kZShub2RlKSA/IHVuZGVmaW5lZCA6IG5vZGUuZGF0YSxcblx0XHRkaWZmVHlwZVxuXHR9IGFzIEludGVybmFsVk5vZGU7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZC50cyIsImltcG9ydCB7IGhhbmRsZURlY29yYXRvciB9IGZyb20gJy4vaGFuZGxlRGVjb3JhdG9yJztcblxuLyoqXG4gKiBEZWNvcmF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byByZWdpc3RlciBhIGZ1bmN0aW9uIHRvIHJ1biBhcyBhbiBhc3BlY3QgdG8gYHJlbmRlcmBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyUmVuZGVyKG1ldGhvZDogRnVuY3Rpb24pOiAodGFyZ2V0OiBhbnkpID0+IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gYWZ0ZXJSZW5kZXIoKTogKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyUmVuZGVyKG1ldGhvZD86IEZ1bmN0aW9uKSB7XG5cdHJldHVybiBoYW5kbGVEZWNvcmF0b3IoKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcblx0XHR0YXJnZXQuYWRkRGVjb3JhdG9yKCdhZnRlclJlbmRlcicsIHByb3BlcnR5S2V5ID8gdGFyZ2V0W3Byb3BlcnR5S2V5XSA6IG1ldGhvZCk7XG5cdH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBhZnRlclJlbmRlcjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBhZnRlclJlbmRlci50cyIsImltcG9ydCB7IFdpZGdldEJhc2UgfSBmcm9tICcuLy4uL1dpZGdldEJhc2UnO1xuaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi9oYW5kbGVEZWNvcmF0b3InO1xuaW1wb3J0IHsgYmVmb3JlUHJvcGVydGllcyB9IGZyb20gJy4vYmVmb3JlUHJvcGVydGllcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhbHdheXNSZW5kZXIoKSB7XG5cdHJldHVybiBoYW5kbGVEZWNvcmF0b3IoKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcblx0XHRiZWZvcmVQcm9wZXJ0aWVzKGZ1bmN0aW9uKHRoaXM6IFdpZGdldEJhc2UpIHtcblx0XHRcdHRoaXMuaW52YWxpZGF0ZSgpO1xuXHRcdH0pKHRhcmdldCk7XG5cdH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBhbHdheXNSZW5kZXI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gYWx3YXlzUmVuZGVyLnRzIiwiaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi9oYW5kbGVEZWNvcmF0b3InO1xuaW1wb3J0IHsgQmVmb3JlUHJvcGVydGllcyB9IGZyb20gJy4vLi4vaW50ZXJmYWNlcyc7XG5cbi8qKlxuICogRGVjb3JhdG9yIHRoYXQgYWRkcyB0aGUgZnVuY3Rpb24gcGFzc2VkIG9mIHRhcmdldCBtZXRob2QgdG8gYmUgcnVuXG4gKiBpbiB0aGUgYGJlZm9yZVByb3BlcnRpZXNgIGxpZmVjeWNsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlZm9yZVByb3BlcnRpZXMobWV0aG9kOiBCZWZvcmVQcm9wZXJ0aWVzKTogKHRhcmdldDogYW55KSA9PiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIGJlZm9yZVByb3BlcnRpZXMoKTogKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIGJlZm9yZVByb3BlcnRpZXMobWV0aG9kPzogQmVmb3JlUHJvcGVydGllcykge1xuXHRyZXR1cm4gaGFuZGxlRGVjb3JhdG9yKCh0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG5cdFx0dGFyZ2V0LmFkZERlY29yYXRvcignYmVmb3JlUHJvcGVydGllcycsIHByb3BlcnR5S2V5ID8gdGFyZ2V0W3Byb3BlcnR5S2V5XSA6IG1ldGhvZCk7XG5cdH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiZWZvcmVQcm9wZXJ0aWVzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGJlZm9yZVByb3BlcnRpZXMudHMiLCJpbXBvcnQgeyBDb25zdHJ1Y3RvciwgV2lkZ2V0UHJvcGVydGllcyB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ3VzdG9tRWxlbWVudENoaWxkVHlwZSB9IGZyb20gJy4uL3JlZ2lzdGVyQ3VzdG9tRWxlbWVudCc7XG5pbXBvcnQgUmVnaXN0cnkgZnJvbSAnLi4vUmVnaXN0cnknO1xuXG5leHBvcnQgdHlwZSBDdXN0b21FbGVtZW50UHJvcGVydHlOYW1lczxQIGV4dGVuZHMgb2JqZWN0PiA9ICgoa2V5b2YgUCkgfCAoa2V5b2YgV2lkZ2V0UHJvcGVydGllcykpW107XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgY3VzdG9tIGVsZW1lbnQgY29uZmlndXJhdGlvbiB1c2VkIGJ5IHRoZSBjdXN0b21FbGVtZW50IGRlY29yYXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbUVsZW1lbnRDb25maWc8UCBleHRlbmRzIG9iamVjdCA9IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4ge1xuXHQvKipcblx0ICogVGhlIHRhZyBvZiB0aGUgY3VzdG9tIGVsZW1lbnRcblx0ICovXG5cdHRhZzogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBMaXN0IG9mIHdpZGdldCBwcm9wZXJ0aWVzIHRvIGV4cG9zZSBhcyBwcm9wZXJ0aWVzIG9uIHRoZSBjdXN0b20gZWxlbWVudFxuXHQgKi9cblx0cHJvcGVydGllcz86IEN1c3RvbUVsZW1lbnRQcm9wZXJ0eU5hbWVzPFA+O1xuXG5cdC8qKlxuXHQgKiBMaXN0IG9mIGF0dHJpYnV0ZXMgb24gdGhlIGN1c3RvbSBlbGVtZW50IHRvIG1hcCB0byB3aWRnZXQgcHJvcGVydGllc1xuXHQgKi9cblx0YXR0cmlidXRlcz86IEN1c3RvbUVsZW1lbnRQcm9wZXJ0eU5hbWVzPFA+O1xuXG5cdC8qKlxuXHQgKiBMaXN0IG9mIGV2ZW50cyB0byBleHBvc2Vcblx0ICovXG5cdGV2ZW50cz86IEN1c3RvbUVsZW1lbnRQcm9wZXJ0eU5hbWVzPFA+O1xuXG5cdGNoaWxkVHlwZT86IEN1c3RvbUVsZW1lbnRDaGlsZFR5cGU7XG5cblx0cmVnaXN0cnlGYWN0b3J5PzogKCkgPT4gUmVnaXN0cnk7XG59XG5cbi8qKlxuICogVGhpcyBEZWNvcmF0b3IgaXMgcHJvdmlkZWQgcHJvcGVydGllcyB0aGF0IGRlZmluZSB0aGUgYmVoYXZpb3Igb2YgYSBjdXN0b20gZWxlbWVudCwgYW5kXG4gKiByZWdpc3RlcnMgdGhhdCBjdXN0b20gZWxlbWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGN1c3RvbUVsZW1lbnQ8UCBleHRlbmRzIG9iamVjdCA9IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4oe1xuXHR0YWcsXG5cdHByb3BlcnRpZXMgPSBbXSxcblx0YXR0cmlidXRlcyA9IFtdLFxuXHRldmVudHMgPSBbXSxcblx0Y2hpbGRUeXBlID0gQ3VzdG9tRWxlbWVudENoaWxkVHlwZS5ET0pPLFxuXHRyZWdpc3RyeUZhY3RvcnkgPSAoKSA9PiBuZXcgUmVnaXN0cnkoKVxufTogQ3VzdG9tRWxlbWVudENvbmZpZzxQPikge1xuXHRyZXR1cm4gZnVuY3Rpb248VCBleHRlbmRzIENvbnN0cnVjdG9yPGFueT4+KHRhcmdldDogVCkge1xuXHRcdHRhcmdldC5wcm90b3R5cGUuX19jdXN0b21FbGVtZW50RGVzY3JpcHRvciA9IHtcblx0XHRcdHRhZ05hbWU6IHRhZyxcblx0XHRcdGF0dHJpYnV0ZXMsXG5cdFx0XHRwcm9wZXJ0aWVzLFxuXHRcdFx0ZXZlbnRzLFxuXHRcdFx0Y2hpbGRUeXBlLFxuXHRcdFx0cmVnaXN0cnlGYWN0b3J5XG5cdFx0fTtcblx0fTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3VzdG9tRWxlbWVudDtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBjdXN0b21FbGVtZW50LnRzIiwiaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi9oYW5kbGVEZWNvcmF0b3InO1xuaW1wb3J0IHsgRGlmZlByb3BlcnR5RnVuY3Rpb24gfSBmcm9tICcuLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgYXV0byB9IGZyb20gJy4vLi4vZGlmZic7XG5cbi8qKlxuICogRGVjb3JhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVnaXN0ZXIgYSBmdW5jdGlvbiBhcyBhIHNwZWNpZmljIHByb3BlcnR5IGRpZmZcbiAqXG4gKiBAcGFyYW0gcHJvcGVydHlOYW1lICBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb2Ygd2hpY2ggdGhlIGRpZmYgZnVuY3Rpb24gaXMgYXBwbGllZFxuICogQHBhcmFtIGRpZmZUeXBlICAgICAgVGhlIGRpZmYgdHlwZSwgZGVmYXVsdCBpcyBEaWZmVHlwZS5BVVRPLlxuICogQHBhcmFtIGRpZmZGdW5jdGlvbiAgQSBkaWZmIGZ1bmN0aW9uIHRvIHJ1biBpZiBkaWZmVHlwZSBpZiBEaWZmVHlwZS5DVVNUT01cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmZQcm9wZXJ0eShcblx0cHJvcGVydHlOYW1lOiBzdHJpbmcsXG5cdGRpZmZGdW5jdGlvbjogRGlmZlByb3BlcnR5RnVuY3Rpb24gPSBhdXRvLFxuXHRyZWFjdGlvbkZ1bmN0aW9uPzogRnVuY3Rpb25cbikge1xuXHRyZXR1cm4gaGFuZGxlRGVjb3JhdG9yKCh0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG5cdFx0dGFyZ2V0LmFkZERlY29yYXRvcihgZGlmZlByb3BlcnR5OiR7cHJvcGVydHlOYW1lfWAsIGRpZmZGdW5jdGlvbi5iaW5kKG51bGwpKTtcblx0XHR0YXJnZXQuYWRkRGVjb3JhdG9yKCdyZWdpc3RlcmVkRGlmZlByb3BlcnR5JywgcHJvcGVydHlOYW1lKTtcblx0XHRpZiAocmVhY3Rpb25GdW5jdGlvbiB8fCBwcm9wZXJ0eUtleSkge1xuXHRcdFx0dGFyZ2V0LmFkZERlY29yYXRvcignZGlmZlJlYWN0aW9uJywge1xuXHRcdFx0XHRwcm9wZXJ0eU5hbWUsXG5cdFx0XHRcdHJlYWN0aW9uOiBwcm9wZXJ0eUtleSA/IHRhcmdldFtwcm9wZXJ0eUtleV0gOiByZWFjdGlvbkZ1bmN0aW9uXG5cdFx0XHR9KTtcblx0XHR9XG5cdH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBkaWZmUHJvcGVydHk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZGlmZlByb3BlcnR5LnRzIiwiZXhwb3J0IHR5cGUgRGVjb3JhdG9ySGFuZGxlciA9ICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk/OiBzdHJpbmcpID0+IHZvaWQ7XG5cbi8qKlxuICogR2VuZXJpYyBkZWNvcmF0b3IgaGFuZGxlciB0byB0YWtlIGNhcmUgb2Ygd2hldGhlciBvciBub3QgdGhlIGRlY29yYXRvciB3YXMgY2FsbGVkIGF0IHRoZSBjbGFzcyBsZXZlbFxuICogb3IgdGhlIG1ldGhvZCBsZXZlbC5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlclxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRGVjb3JhdG9yKGhhbmRsZXI6IERlY29yYXRvckhhbmRsZXIpIHtcblx0cmV0dXJuIGZ1bmN0aW9uKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleT86IHN0cmluZywgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvcikge1xuXHRcdGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRoYW5kbGVyKHRhcmdldC5wcm90b3R5cGUsIHVuZGVmaW5lZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGhhbmRsZXIodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG5cdFx0fVxuXHR9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBoYW5kbGVEZWNvcmF0b3I7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gaGFuZGxlRGVjb3JhdG9yLnRzIiwiaW1wb3J0IFdlYWtNYXAgZnJvbSAnLi4vLi4vc2hpbS9XZWFrTWFwJztcbmltcG9ydCB7IFdpZGdldEJhc2UgfSBmcm9tICcuLy4uL1dpZGdldEJhc2UnO1xuaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi9oYW5kbGVEZWNvcmF0b3InO1xuaW1wb3J0IHsgYmVmb3JlUHJvcGVydGllcyB9IGZyb20gJy4vYmVmb3JlUHJvcGVydGllcyc7XG5pbXBvcnQgeyBJbmplY3Rvckl0ZW0sIFJlZ2lzdHJ5TGFiZWwgfSBmcm9tICcuLy4uL2ludGVyZmFjZXMnO1xuXG4vKipcbiAqIE1hcCBvZiBpbnN0YW5jZXMgYWdhaW5zdCByZWdpc3RlcmVkIGluamVjdG9ycy5cbiAqL1xuY29uc3QgcmVnaXN0ZXJlZEluamVjdG9yc01hcDogV2Vha01hcDxXaWRnZXRCYXNlLCBJbmplY3Rvckl0ZW1bXT4gPSBuZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIERlZmluZXMgdGhlIGNvbnRyYWN0IHJlcXVpcmVzIGZvciB0aGUgZ2V0IHByb3BlcnRpZXMgZnVuY3Rpb25cbiAqIHVzZWQgdG8gbWFwIHRoZSBpbmplY3RlZCBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFByb3BlcnRpZXM8VCA9IGFueT4ge1xuXHQocGF5bG9hZDogYW55LCBwcm9wZXJ0aWVzOiBUKTogVDtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSBpbmplY3QgY29uZmlndXJhdGlvbiByZXF1aXJlZCBmb3IgdXNlIG9mIHRoZSBgaW5qZWN0YCBkZWNvcmF0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmplY3RDb25maWcge1xuXHQvKipcblx0ICogVGhlIGxhYmVsIG9mIHRoZSByZWdpc3RyeSBpbmplY3RvclxuXHQgKi9cblx0bmFtZTogUmVnaXN0cnlMYWJlbDtcblxuXHQvKipcblx0ICogRnVuY3Rpb24gdGhhdCByZXR1cm5zIHByb3BlcnR1ZXMgdG8gaW5qZWN0IHVzaW5nIHRoZSBwYXNzZWQgcHJvcGVydGllc1xuXHQgKiBhbmQgdGhlIGluamVjdGVkIHBheWxvYWQuXG5cdCAqL1xuXHRnZXRQcm9wZXJ0aWVzOiBHZXRQcm9wZXJ0aWVzO1xufVxuXG4vKipcbiAqIERlY29yYXRvciByZXRyaWV2ZXMgYW4gaW5qZWN0b3IgZnJvbSBhbiBhdmFpbGFibGUgcmVnaXN0cnkgdXNpbmcgdGhlIG5hbWUgYW5kXG4gKiBjYWxscyB0aGUgYGdldFByb3BlcnRpZXNgIGZ1bmN0aW9uIHdpdGggdGhlIHBheWxvYWQgZnJvbSB0aGUgaW5qZWN0b3JcbiAqIGFuZCBjdXJyZW50IHByb3BlcnRpZXMgd2l0aCB0aGUgdGhlIGluamVjdGVkIHByb3BlcnRpZXMgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIEluamVjdENvbmZpZyB0aGUgaW5qZWN0IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdCh7IG5hbWUsIGdldFByb3BlcnRpZXMgfTogSW5qZWN0Q29uZmlnKSB7XG5cdHJldHVybiBoYW5kbGVEZWNvcmF0b3IoKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcblx0XHRiZWZvcmVQcm9wZXJ0aWVzKGZ1bmN0aW9uKHRoaXM6IFdpZGdldEJhc2UgJiB7IG93bjogRnVuY3Rpb24gfSwgcHJvcGVydGllczogYW55KSB7XG5cdFx0XHRjb25zdCBpbmplY3Rvckl0ZW0gPSB0aGlzLnJlZ2lzdHJ5LmdldEluamVjdG9yKG5hbWUpO1xuXHRcdFx0aWYgKGluamVjdG9ySXRlbSkge1xuXHRcdFx0XHRjb25zdCB7IGluamVjdG9yLCBpbnZhbGlkYXRvciB9ID0gaW5qZWN0b3JJdGVtO1xuXHRcdFx0XHRjb25zdCByZWdpc3RlcmVkSW5qZWN0b3JzID0gcmVnaXN0ZXJlZEluamVjdG9yc01hcC5nZXQodGhpcykgfHwgW107XG5cdFx0XHRcdGlmIChyZWdpc3RlcmVkSW5qZWN0b3JzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdHJlZ2lzdGVyZWRJbmplY3RvcnNNYXAuc2V0KHRoaXMsIHJlZ2lzdGVyZWRJbmplY3RvcnMpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChyZWdpc3RlcmVkSW5qZWN0b3JzLmluZGV4T2YoaW5qZWN0b3JJdGVtKSA9PT0gLTEpIHtcblx0XHRcdFx0XHR0aGlzLm93bihcblx0XHRcdFx0XHRcdGludmFsaWRhdG9yLm9uKCdpbnZhbGlkYXRlJywgKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmludmFsaWRhdGUoKTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRyZWdpc3RlcmVkSW5qZWN0b3JzLnB1c2goaW5qZWN0b3JJdGVtKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZ2V0UHJvcGVydGllcyhpbmplY3RvcigpLCBwcm9wZXJ0aWVzKTtcblx0XHRcdH1cblx0XHR9KSh0YXJnZXQpO1xuXHR9KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5qZWN0O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGluamVjdC50cyIsImltcG9ydCB7IFByb3BlcnR5Q2hhbmdlUmVjb3JkIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFdJREdFVF9CQVNFX1RZUEUgfSBmcm9tICcuL1JlZ2lzdHJ5JztcblxuZnVuY3Rpb24gaXNPYmplY3RPckFycmF5KHZhbHVlOiBhbnkpOiBib29sZWFuIHtcblx0cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWx3YXlzKHByZXZpb3VzUHJvcGVydHk6IGFueSwgbmV3UHJvcGVydHk6IGFueSk6IFByb3BlcnR5Q2hhbmdlUmVjb3JkIHtcblx0cmV0dXJuIHtcblx0XHRjaGFuZ2VkOiB0cnVlLFxuXHRcdHZhbHVlOiBuZXdQcm9wZXJ0eVxuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlKHByZXZpb3VzUHJvcGVydHk6IGFueSwgbmV3UHJvcGVydHk6IGFueSk6IFByb3BlcnR5Q2hhbmdlUmVjb3JkIHtcblx0cmV0dXJuIHtcblx0XHRjaGFuZ2VkOiBmYWxzZSxcblx0XHR2YWx1ZTogbmV3UHJvcGVydHlcblx0fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZmVyZW5jZShwcmV2aW91c1Byb3BlcnR5OiBhbnksIG5ld1Byb3BlcnR5OiBhbnkpOiBQcm9wZXJ0eUNoYW5nZVJlY29yZCB7XG5cdHJldHVybiB7XG5cdFx0Y2hhbmdlZDogcHJldmlvdXNQcm9wZXJ0eSAhPT0gbmV3UHJvcGVydHksXG5cdFx0dmFsdWU6IG5ld1Byb3BlcnR5XG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGFsbG93KHByZXZpb3VzUHJvcGVydHk6IGFueSwgbmV3UHJvcGVydHk6IGFueSk6IFByb3BlcnR5Q2hhbmdlUmVjb3JkIHtcblx0bGV0IGNoYW5nZWQgPSBmYWxzZTtcblxuXHRjb25zdCB2YWxpZE9sZFByb3BlcnR5ID0gcHJldmlvdXNQcm9wZXJ0eSAmJiBpc09iamVjdE9yQXJyYXkocHJldmlvdXNQcm9wZXJ0eSk7XG5cdGNvbnN0IHZhbGlkTmV3UHJvcGVydHkgPSBuZXdQcm9wZXJ0eSAmJiBpc09iamVjdE9yQXJyYXkobmV3UHJvcGVydHkpO1xuXG5cdGlmICghdmFsaWRPbGRQcm9wZXJ0eSB8fCAhdmFsaWROZXdQcm9wZXJ0eSkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRjaGFuZ2VkOiB0cnVlLFxuXHRcdFx0dmFsdWU6IG5ld1Byb3BlcnR5XG5cdFx0fTtcblx0fVxuXG5cdGNvbnN0IHByZXZpb3VzS2V5cyA9IE9iamVjdC5rZXlzKHByZXZpb3VzUHJvcGVydHkpO1xuXHRjb25zdCBuZXdLZXlzID0gT2JqZWN0LmtleXMobmV3UHJvcGVydHkpO1xuXG5cdGlmIChwcmV2aW91c0tleXMubGVuZ3RoICE9PSBuZXdLZXlzLmxlbmd0aCkge1xuXHRcdGNoYW5nZWQgPSB0cnVlO1xuXHR9IGVsc2Uge1xuXHRcdGNoYW5nZWQgPSBuZXdLZXlzLnNvbWUoKGtleSkgPT4ge1xuXHRcdFx0cmV0dXJuIG5ld1Byb3BlcnR5W2tleV0gIT09IHByZXZpb3VzUHJvcGVydHlba2V5XTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdGNoYW5nZWQsXG5cdFx0dmFsdWU6IG5ld1Byb3BlcnR5XG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhdXRvKHByZXZpb3VzUHJvcGVydHk6IGFueSwgbmV3UHJvcGVydHk6IGFueSk6IFByb3BlcnR5Q2hhbmdlUmVjb3JkIHtcblx0bGV0IHJlc3VsdDtcblx0aWYgKHR5cGVvZiBuZXdQcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdGlmIChuZXdQcm9wZXJ0eS5fdHlwZSA9PT0gV0lER0VUX0JBU0VfVFlQRSkge1xuXHRcdFx0cmVzdWx0ID0gcmVmZXJlbmNlKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0ID0gaWdub3JlKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoaXNPYmplY3RPckFycmF5KG5ld1Byb3BlcnR5KSkge1xuXHRcdHJlc3VsdCA9IHNoYWxsb3cocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpO1xuXHR9IGVsc2Uge1xuXHRcdHJlc3VsdCA9IHJlZmVyZW5jZShwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSk7XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBkaWZmLnRzIiwiaW1wb3J0IHsgYXNzaWduIH0gZnJvbSAnLi4vLi4vY29yZS9sYW5nJztcbmltcG9ydCB7IEhhbmRsZSB9IGZyb20gJy4uLy4uL2NvcmUvaW50ZXJmYWNlcyc7XG5pbXBvcnQgY3NzVHJhbnNpdGlvbnMgZnJvbSAnLi4vYW5pbWF0aW9ucy9jc3NUcmFuc2l0aW9ucyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgRE5vZGUsIFByb2plY3Rpb24sIFByb2plY3Rpb25PcHRpb25zIH0gZnJvbSAnLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFdpZGdldEJhc2UgfSBmcm9tICcuLy4uL1dpZGdldEJhc2UnO1xuaW1wb3J0IHsgYWZ0ZXJSZW5kZXIgfSBmcm9tICcuLy4uL2RlY29yYXRvcnMvYWZ0ZXJSZW5kZXInO1xuaW1wb3J0IHsgdiB9IGZyb20gJy4vLi4vZCc7XG5pbXBvcnQgeyBSZWdpc3RyeSB9IGZyb20gJy4vLi4vUmVnaXN0cnknO1xuaW1wb3J0IHsgZG9tIH0gZnJvbSAnLi8uLi92ZG9tJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBhdHRhY2ggc3RhdGUgb2YgdGhlIHByb2plY3RvclxuICovXG5leHBvcnQgZW51bSBQcm9qZWN0b3JBdHRhY2hTdGF0ZSB7XG5cdEF0dGFjaGVkID0gMSxcblx0RGV0YWNoZWRcbn1cblxuLyoqXG4gKiBBdHRhY2ggdHlwZSBmb3IgdGhlIHByb2plY3RvclxuICovXG5leHBvcnQgZW51bSBBdHRhY2hUeXBlIHtcblx0QXBwZW5kID0gMSxcblx0TWVyZ2UgPSAyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXR0YWNoT3B0aW9ucyB7XG5cdC8qKlxuXHQgKiBJZiBgJ2FwcGVuZCdgIGl0IHdpbGwgYXBwZW5kZWQgdG8gdGhlIHJvb3QuIElmIGAnbWVyZ2UnYCBpdCB3aWxsIG1lcmdlZCB3aXRoIHRoZSByb290LiBJZiBgJ3JlcGxhY2UnYCBpdCB3aWxsXG5cdCAqIHJlcGxhY2UgdGhlIHJvb3QuXG5cdCAqL1xuXHR0eXBlOiBBdHRhY2hUeXBlO1xuXG5cdC8qKlxuXHQgKiBFbGVtZW50IHRvIGF0dGFjaCB0aGUgcHJvamVjdG9yLlxuXHQgKi9cblx0cm9vdD86IEVsZW1lbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdG9yUHJvcGVydGllcyB7XG5cdHJlZ2lzdHJ5PzogUmVnaXN0cnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdG9yTWl4aW48UD4ge1xuXHRyZWFkb25seSBwcm9wZXJ0aWVzOiBSZWFkb25seTxQPiAmIFJlYWRvbmx5PFByb2plY3RvclByb3BlcnRpZXM+O1xuXG5cdC8qKlxuXHQgKiBBcHBlbmQgdGhlIHByb2plY3RvciB0byB0aGUgcm9vdC5cblx0ICovXG5cdGFwcGVuZChyb290PzogRWxlbWVudCk6IEhhbmRsZTtcblxuXHQvKipcblx0ICogTWVyZ2UgdGhlIHByb2plY3RvciBvbnRvIHRoZSByb290LlxuXHQgKlxuXHQgKiBUaGUgYHJvb3RgIGFuZCBhbnkgb2YgaXRzIGBjaGlsZHJlbmAgd2lsbCBiZSByZS11c2VkLiAgQW55IGV4Y2VzcyBET00gbm9kZXMgd2lsbCBiZSBpZ25vcmVkIGFuZCBhbnkgbWlzc2luZyBET00gbm9kZXNcblx0ICogd2lsbCBiZSBjcmVhdGVkLlxuXHQgKiBAcGFyYW0gcm9vdCBUaGUgcm9vdCBlbGVtZW50IHRoYXQgdGhlIHJvb3QgdmlydHVhbCBET00gbm9kZSB3aWxsIGJlIG1lcmdlZCB3aXRoLiAgRGVmYXVsdHMgdG8gYGRvY3VtZW50LmJvZHlgLlxuXHQgKi9cblx0bWVyZ2Uocm9vdD86IEVsZW1lbnQpOiBIYW5kbGU7XG5cblx0LyoqXG5cdCAqIEF0dGFjaCB0aGUgcHJvamVjdCB0byBhIF9zYW5kYm94ZWRfIGRvY3VtZW50IGZyYWdtZW50IHRoYXQgaXMgbm90IHBhcnQgb2YgdGhlIERPTS5cblx0ICpcblx0ICogV2hlbiBzYW5kYm94ZWQsIHRoZSBgUHJvamVjdG9yYCB3aWxsIHJ1biBpbiBhIHN5bmMgbWFubmVyLCB3aGVyZSByZW5kZXJzIGFyZSBjb21wbGV0ZWQgd2l0aGluIHRoZSBzYW1lIHR1cm4uXG5cdCAqIFRoZSBgUHJvamVjdG9yYCBjcmVhdGVzIGEgYERvY3VtZW50RnJhZ21lbnRgIHdoaWNoIHJlcGxhY2VzIGFueSBvdGhlciBgcm9vdGAgdGhhdCBoYXMgYmVlbiBzZXQuXG5cdCAqIEBwYXJhbSBkb2MgVGhlIGBEb2N1bWVudGAgdG8gdXNlLCB3aGljaCBkZWZhdWx0cyB0byB0aGUgZ2xvYmFsIGBkb2N1bWVudGAuXG5cdCAqL1xuXHRzYW5kYm94KGRvYz86IERvY3VtZW50KTogdm9pZDtcblxuXHQvKipcblx0ICogU2V0cyB0aGUgcHJvcGVydGllcyBmb3IgdGhlIHdpZGdldC4gUmVzcG9uc2libGUgZm9yIGNhbGxpbmcgdGhlIGRpZmZpbmcgZnVuY3Rpb25zIGZvciB0aGUgcHJvcGVydGllcyBhZ2FpbnN0IHRoZVxuXHQgKiBwcmV2aW91cyBwcm9wZXJ0aWVzLiBSdW5zIHRob3VnaCBhbnkgcmVnaXN0ZXJlZCBzcGVjaWZpYyBwcm9wZXJ0eSBkaWZmIGZ1bmN0aW9ucyBjb2xsZWN0aW5nIHRoZSByZXN1bHRzIGFuZCB0aGVuXG5cdCAqIHJ1bnMgdGhlIHJlbWFpbmRlciB0aHJvdWdoIHRoZSBjYXRjaCBhbGwgZGlmZiBmdW5jdGlvbi4gVGhlIGFnZ3JlZ2F0ZSBvZiB0aGUgdHdvIHNldHMgb2YgdGhlIHJlc3VsdHMgaXMgdGhlblxuXHQgKiBzZXQgYXMgdGhlIHdpZGdldCdzIHByb3BlcnRpZXNcblx0ICpcblx0ICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIG5ldyB3aWRnZXQgcHJvcGVydGllc1xuXHQgKi9cblx0c2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzOiB0aGlzWydwcm9wZXJ0aWVzJ10pOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSB3aWRnZXQncyBjaGlsZHJlblxuXHQgKi9cblx0c2V0Q2hpbGRyZW4oY2hpbGRyZW46IEROb2RlW10pOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBSZXR1cm4gYSBgc3RyaW5nYCB0aGF0IHJlcHJlc2VudHMgdGhlIEhUTUwgb2YgdGhlIGN1cnJlbnQgcHJvamVjdGlvbi4gIFRoZSBwcm9qZWN0b3IgbmVlZHMgdG8gYmUgYXR0YWNoZWQuXG5cdCAqL1xuXHR0b0h0bWwoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgaWYgdGhlIHByb2plY3RvcnMgaXMgaW4gYXN5bmMgbW9kZSwgY29uZmlndXJlZCB0byBgdHJ1ZWAgYnkgZGVmYXVsdHMuXG5cdCAqL1xuXHRhc3luYzogYm9vbGVhbjtcblxuXHQvKipcblx0ICogUm9vdCBlbGVtZW50IHRvIGF0dGFjaCB0aGUgcHJvamVjdG9yXG5cdCAqL1xuXHRyb290OiBFbGVtZW50O1xuXG5cdC8qKlxuXHQgKiBUaGUgc3RhdHVzIG9mIHRoZSBwcm9qZWN0b3Jcblx0ICovXG5cdHJlYWRvbmx5IHByb2plY3RvclN0YXRlOiBQcm9qZWN0b3JBdHRhY2hTdGF0ZTtcblxuXHQvKipcblx0ICogUnVucyByZWdpc3RlcmVkIGRlc3Ryb3kgaGFuZGxlc1xuXHQgKi9cblx0ZGVzdHJveSgpOiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUHJvamVjdG9yTWl4aW48UCwgVCBleHRlbmRzIENvbnN0cnVjdG9yPFdpZGdldEJhc2U8UD4+PihCYXNlOiBUKTogVCAmIENvbnN0cnVjdG9yPFByb2plY3Rvck1peGluPFA+PiB7XG5cdGFic3RyYWN0IGNsYXNzIFByb2plY3RvciBleHRlbmRzIEJhc2Uge1xuXHRcdHB1YmxpYyBwcm9qZWN0b3JTdGF0ZTogUHJvamVjdG9yQXR0YWNoU3RhdGU7XG5cblx0XHRwcml2YXRlIF9yb290OiBFbGVtZW50ID0gZG9jdW1lbnQuYm9keTtcblx0XHRwcml2YXRlIF9hc3luYyA9IHRydWU7XG5cdFx0cHJpdmF0ZSBfYXR0YWNoSGFuZGxlOiBIYW5kbGUgfCB1bmRlZmluZWQ7XG5cdFx0cHJpdmF0ZSBfcHJvamVjdGlvbk9wdGlvbnM6IFBhcnRpYWw8UHJvamVjdGlvbk9wdGlvbnM+O1xuXHRcdHByaXZhdGUgX3Byb2plY3Rpb246IFByb2plY3Rpb24gfCB1bmRlZmluZWQ7XG5cdFx0cHJpdmF0ZSBfcHJvamVjdG9yUHJvcGVydGllczogdGhpc1sncHJvcGVydGllcyddID0ge30gYXMgdGhpc1sncHJvcGVydGllcyddO1xuXHRcdHB1YmxpYyBhYnN0cmFjdCBwcm9wZXJ0aWVzOiBSZWFkb25seTxQPiAmIFJlYWRvbmx5PFByb2plY3RvclByb3BlcnRpZXM+O1xuXG5cdFx0Y29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcblx0XHRcdHN1cGVyKC4uLmFyZ3MpO1xuXG5cdFx0XHR0aGlzLl9wcm9qZWN0aW9uT3B0aW9ucyA9IHtcblx0XHRcdFx0dHJhbnNpdGlvbnM6IGNzc1RyYW5zaXRpb25zXG5cdFx0XHR9O1xuXG5cdFx0XHR0aGlzLnJvb3QgPSBkb2N1bWVudC5ib2R5O1xuXHRcdFx0dGhpcy5wcm9qZWN0b3JTdGF0ZSA9IFByb2plY3RvckF0dGFjaFN0YXRlLkRldGFjaGVkO1xuXHRcdH1cblxuXHRcdHB1YmxpYyBhcHBlbmQocm9vdD86IEVsZW1lbnQpOiBIYW5kbGUge1xuXHRcdFx0Y29uc3Qgb3B0aW9ucyA9IHtcblx0XHRcdFx0dHlwZTogQXR0YWNoVHlwZS5BcHBlbmQsXG5cdFx0XHRcdHJvb3Rcblx0XHRcdH07XG5cblx0XHRcdHJldHVybiB0aGlzLl9hdHRhY2gob3B0aW9ucyk7XG5cdFx0fVxuXG5cdFx0cHVibGljIG1lcmdlKHJvb3Q/OiBFbGVtZW50KTogSGFuZGxlIHtcblx0XHRcdGNvbnN0IG9wdGlvbnMgPSB7XG5cdFx0XHRcdHR5cGU6IEF0dGFjaFR5cGUuTWVyZ2UsXG5cdFx0XHRcdHJvb3Rcblx0XHRcdH07XG5cblx0XHRcdHJldHVybiB0aGlzLl9hdHRhY2gob3B0aW9ucyk7XG5cdFx0fVxuXG5cdFx0cHVibGljIHNldCByb290KHJvb3Q6IEVsZW1lbnQpIHtcblx0XHRcdGlmICh0aGlzLnByb2plY3RvclN0YXRlID09PSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5BdHRhY2hlZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1Byb2plY3RvciBhbHJlYWR5IGF0dGFjaGVkLCBjYW5ub3QgY2hhbmdlIHJvb3QgZWxlbWVudCcpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fcm9vdCA9IHJvb3Q7XG5cdFx0fVxuXG5cdFx0cHVibGljIGdldCByb290KCk6IEVsZW1lbnQge1xuXHRcdFx0cmV0dXJuIHRoaXMuX3Jvb3Q7XG5cdFx0fVxuXG5cdFx0cHVibGljIGdldCBhc3luYygpOiBib29sZWFuIHtcblx0XHRcdHJldHVybiB0aGlzLl9hc3luYztcblx0XHR9XG5cblx0XHRwdWJsaWMgc2V0IGFzeW5jKGFzeW5jOiBib29sZWFuKSB7XG5cdFx0XHRpZiAodGhpcy5wcm9qZWN0b3JTdGF0ZSA9PT0gUHJvamVjdG9yQXR0YWNoU3RhdGUuQXR0YWNoZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdQcm9qZWN0b3IgYWxyZWFkeSBhdHRhY2hlZCwgY2Fubm90IGNoYW5nZSBhc3luYyBtb2RlJyk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9hc3luYyA9IGFzeW5jO1xuXHRcdH1cblxuXHRcdHB1YmxpYyBzYW5kYm94KGRvYzogRG9jdW1lbnQgPSBkb2N1bWVudCk6IHZvaWQge1xuXHRcdFx0aWYgKHRoaXMucHJvamVjdG9yU3RhdGUgPT09IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignUHJvamVjdG9yIGFscmVhZHkgYXR0YWNoZWQsIGNhbm5vdCBjcmVhdGUgc2FuZGJveCcpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fYXN5bmMgPSBmYWxzZTtcblx0XHRcdGNvbnN0IHByZXZpb3VzUm9vdCA9IHRoaXMucm9vdDtcblxuXHRcdFx0LyogZnJlZSB1cCB0aGUgZG9jdW1lbnQgZnJhZ21lbnQgZm9yIEdDICovXG5cdFx0XHR0aGlzLm93bih7XG5cdFx0XHRcdGRlc3Ryb3k6ICgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl9yb290ID0gcHJldmlvdXNSb290O1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5fYXR0YWNoKHtcblx0XHRcdFx0LyogRG9jdW1lbnRGcmFnbWVudCBpcyBub3QgYXNzaWduYWJsZSB0byBFbGVtZW50LCBidXQgcHJvdmlkZXMgZXZlcnl0aGluZyBuZWVkZWQgdG8gd29yayAqL1xuXHRcdFx0XHRyb290OiBkb2MuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpIGFzIGFueSxcblx0XHRcdFx0dHlwZTogQXR0YWNoVHlwZS5BcHBlbmRcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHB1YmxpYyBzZXRDaGlsZHJlbihjaGlsZHJlbjogRE5vZGVbXSk6IHZvaWQge1xuXHRcdFx0dGhpcy5fX3NldENoaWxkcmVuX18oY2hpbGRyZW4pO1xuXHRcdH1cblxuXHRcdHB1YmxpYyBzZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXM6IHRoaXNbJ3Byb3BlcnRpZXMnXSk6IHZvaWQge1xuXHRcdFx0dGhpcy5fX3NldFByb3BlcnRpZXNfXyhwcm9wZXJ0aWVzKTtcblx0XHR9XG5cblx0XHRwdWJsaWMgX19zZXRQcm9wZXJ0aWVzX18ocHJvcGVydGllczogdGhpc1sncHJvcGVydGllcyddKTogdm9pZCB7XG5cdFx0XHRpZiAodGhpcy5fcHJvamVjdG9yUHJvcGVydGllcyAmJiB0aGlzLl9wcm9qZWN0b3JQcm9wZXJ0aWVzLnJlZ2lzdHJ5ICE9PSBwcm9wZXJ0aWVzLnJlZ2lzdHJ5KSB7XG5cdFx0XHRcdGlmICh0aGlzLl9wcm9qZWN0b3JQcm9wZXJ0aWVzLnJlZ2lzdHJ5KSB7XG5cdFx0XHRcdFx0dGhpcy5fcHJvamVjdG9yUHJvcGVydGllcy5yZWdpc3RyeS5kZXN0cm95KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMuX3Byb2plY3RvclByb3BlcnRpZXMgPSBhc3NpZ24oe30sIHByb3BlcnRpZXMpO1xuXHRcdFx0c3VwZXIuX19zZXRDb3JlUHJvcGVydGllc19fKHsgYmluZDogdGhpcywgYmFzZVJlZ2lzdHJ5OiBwcm9wZXJ0aWVzLnJlZ2lzdHJ5IH0pO1xuXHRcdFx0c3VwZXIuX19zZXRQcm9wZXJ0aWVzX18ocHJvcGVydGllcyk7XG5cdFx0fVxuXG5cdFx0cHVibGljIHRvSHRtbCgpOiBzdHJpbmcge1xuXHRcdFx0aWYgKHRoaXMucHJvamVjdG9yU3RhdGUgIT09IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkIHx8ICF0aGlzLl9wcm9qZWN0aW9uKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignUHJvamVjdG9yIGlzIG5vdCBhdHRhY2hlZCwgY2Fubm90IHJldHVybiBhbiBIVE1MIHN0cmluZyBvZiBwcm9qZWN0aW9uLicpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuICh0aGlzLl9wcm9qZWN0aW9uLmRvbU5vZGUuY2hpbGROb2Rlc1swXSBhcyBFbGVtZW50KS5vdXRlckhUTUw7XG5cdFx0fVxuXG5cdFx0QGFmdGVyUmVuZGVyKClcblx0XHRwdWJsaWMgYWZ0ZXJSZW5kZXIocmVzdWx0OiBETm9kZSkge1xuXHRcdFx0bGV0IG5vZGUgPSByZXN1bHQ7XG5cdFx0XHRpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgfHwgcmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdG5vZGUgPSB2KCdzcGFuJywge30sIFtyZXN1bHRdKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG5vZGU7XG5cdFx0fVxuXG5cdFx0cHVibGljIGRlc3Ryb3koKSB7XG5cdFx0XHRzdXBlci5kZXN0cm95KCk7XG5cdFx0fVxuXG5cdFx0cHJpdmF0ZSBfYXR0YWNoKHsgdHlwZSwgcm9vdCB9OiBBdHRhY2hPcHRpb25zKTogSGFuZGxlIHtcblx0XHRcdGlmIChyb290KSB7XG5cdFx0XHRcdHRoaXMucm9vdCA9IHJvb3Q7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLl9hdHRhY2hIYW5kbGUpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2F0dGFjaEhhbmRsZTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5wcm9qZWN0b3JTdGF0ZSA9IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkO1xuXG5cdFx0XHRjb25zdCBoYW5kbGUgPSB7XG5cdFx0XHRcdGRlc3Ryb3k6ICgpID0+IHtcblx0XHRcdFx0XHRpZiAodGhpcy5wcm9qZWN0b3JTdGF0ZSA9PT0gUHJvamVjdG9yQXR0YWNoU3RhdGUuQXR0YWNoZWQpIHtcblx0XHRcdFx0XHRcdHRoaXMuX3Byb2plY3Rpb24gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHR0aGlzLnByb2plY3RvclN0YXRlID0gUHJvamVjdG9yQXR0YWNoU3RhdGUuRGV0YWNoZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHR0aGlzLm93bihoYW5kbGUpO1xuXHRcdFx0dGhpcy5fYXR0YWNoSGFuZGxlID0gaGFuZGxlO1xuXG5cdFx0XHR0aGlzLl9wcm9qZWN0aW9uT3B0aW9ucyA9IHsgLi4udGhpcy5fcHJvamVjdGlvbk9wdGlvbnMsIC4uLnsgc3luYzogIXRoaXMuX2FzeW5jIH0gfTtcblxuXHRcdFx0c3dpdGNoICh0eXBlKSB7XG5cdFx0XHRcdGNhc2UgQXR0YWNoVHlwZS5BcHBlbmQ6XG5cdFx0XHRcdFx0dGhpcy5fcHJvamVjdGlvbiA9IGRvbS5hcHBlbmQodGhpcy5yb290LCB0aGlzLCB0aGlzLl9wcm9qZWN0aW9uT3B0aW9ucyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgQXR0YWNoVHlwZS5NZXJnZTpcblx0XHRcdFx0XHR0aGlzLl9wcm9qZWN0aW9uID0gZG9tLm1lcmdlKHRoaXMucm9vdCwgdGhpcywgdGhpcy5fcHJvamVjdGlvbk9wdGlvbnMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy5fYXR0YWNoSGFuZGxlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBQcm9qZWN0b3I7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFByb2plY3Rvck1peGluO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIFByb2plY3Rvci50cyIsImltcG9ydCB7IENvbnN0cnVjdG9yLCBXaWRnZXRQcm9wZXJ0aWVzLCBTdXBwb3J0ZWRDbGFzc05hbWUgfSBmcm9tICcuLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgUmVnaXN0cnkgfSBmcm9tICcuLy4uL1JlZ2lzdHJ5JztcbmltcG9ydCB7IEluamVjdG9yIH0gZnJvbSAnLi8uLi9JbmplY3Rvcic7XG5pbXBvcnQgeyBpbmplY3QgfSBmcm9tICcuLy4uL2RlY29yYXRvcnMvaW5qZWN0JztcbmltcG9ydCB7IFdpZGdldEJhc2UgfSBmcm9tICcuLy4uL1dpZGdldEJhc2UnO1xuaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi8uLi9kZWNvcmF0b3JzL2hhbmRsZURlY29yYXRvcic7XG5pbXBvcnQgeyBkaWZmUHJvcGVydHkgfSBmcm9tICcuLy4uL2RlY29yYXRvcnMvZGlmZlByb3BlcnR5JztcbmltcG9ydCB7IHNoYWxsb3cgfSBmcm9tICcuLy4uL2RpZmYnO1xuXG4vKipcbiAqIEEgbG9va3VwIG9iamVjdCBmb3IgYXZhaWxhYmxlIGNsYXNzIG5hbWVzXG4gKi9cbmV4cG9ydCB0eXBlIENsYXNzTmFtZXMgPSB7XG5cdFtrZXk6IHN0cmluZ106IHN0cmluZztcbn07XG5cbi8qKlxuICogQSBsb29rdXAgb2JqZWN0IGZvciBhdmFpbGFibGUgd2lkZ2V0IGNsYXNzZXMgbmFtZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaGVtZSB7XG5cdFtrZXk6IHN0cmluZ106IG9iamVjdDtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIHJlcXVpcmVkIGZvciB0aGUgVGhlbWVkIG1peGluXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGhlbWVkUHJvcGVydGllczxUID0gQ2xhc3NOYW1lcz4gZXh0ZW5kcyBXaWRnZXRQcm9wZXJ0aWVzIHtcblx0aW5qZWN0ZWRUaGVtZT86IGFueTtcblx0dGhlbWU/OiBUaGVtZTtcblx0ZXh0cmFDbGFzc2VzPzogeyBbUCBpbiBrZXlvZiBUXT86IHN0cmluZyB9O1xufVxuXG5jb25zdCBUSEVNRV9LRVkgPSAnIF9rZXknO1xuXG5leHBvcnQgY29uc3QgSU5KRUNURURfVEhFTUVfS0VZID0gU3ltYm9sKCd0aGVtZScpO1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgdGhlIFRoZW1lZE1peGluXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGhlbWVkTWl4aW48VCA9IENsYXNzTmFtZXM+IHtcblx0dGhlbWUoY2xhc3NlczogU3VwcG9ydGVkQ2xhc3NOYW1lKTogU3VwcG9ydGVkQ2xhc3NOYW1lO1xuXHR0aGVtZShjbGFzc2VzOiBTdXBwb3J0ZWRDbGFzc05hbWVbXSk6IFN1cHBvcnRlZENsYXNzTmFtZVtdO1xuXHRwcm9wZXJ0aWVzOiBUaGVtZWRQcm9wZXJ0aWVzPFQ+O1xufVxuXG4vKipcbiAqIERlY29yYXRvciBmb3IgYmFzZSBjc3MgY2xhc3Nlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGhlbWUodGhlbWU6IHt9KSB7XG5cdHJldHVybiBoYW5kbGVEZWNvcmF0b3IoKHRhcmdldCkgPT4ge1xuXHRcdHRhcmdldC5hZGREZWNvcmF0b3IoJ2Jhc2VUaGVtZUNsYXNzZXMnLCB0aGVtZSk7XG5cdH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSByZXZlcnNlIGxvb2t1cCBmb3IgdGhlIGNsYXNzZXMgcGFzc2VkIGluIHZpYSB0aGUgYHRoZW1lYCBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gY2xhc3NlcyBUaGUgYmFzZUNsYXNzZXMgb2JqZWN0XG4gKiBAcmVxdWlyZXNcbiAqL1xuZnVuY3Rpb24gY3JlYXRlVGhlbWVDbGFzc2VzTG9va3VwKGNsYXNzZXM6IENsYXNzTmFtZXNbXSk6IENsYXNzTmFtZXMge1xuXHRyZXR1cm4gY2xhc3Nlcy5yZWR1Y2UoXG5cdFx0KGN1cnJlbnRDbGFzc05hbWVzLCBiYXNlQ2xhc3MpID0+IHtcblx0XHRcdE9iamVjdC5rZXlzKGJhc2VDbGFzcykuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0Y3VycmVudENsYXNzTmFtZXNbYmFzZUNsYXNzW2tleV1dID0ga2V5O1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gY3VycmVudENsYXNzTmFtZXM7XG5cdFx0fSxcblx0XHQ8Q2xhc3NOYW1lcz57fVxuXHQpO1xufVxuXG4vKipcbiAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgaXMgZ2l2ZW4gYSB0aGVtZSBhbmQgYW4gb3B0aW9uYWwgcmVnaXN0cnksIHRoZSB0aGVtZVxuICogaW5qZWN0b3IgaXMgZGVmaW5lZCBhZ2FpbnN0IHRoZSByZWdpc3RyeSwgcmV0dXJuaW5nIHRoZSB0aGVtZS5cbiAqXG4gKiBAcGFyYW0gdGhlbWUgdGhlIHRoZW1lIHRvIHNldFxuICogQHBhcmFtIHRoZW1lUmVnaXN0cnkgcmVnaXN0cnkgdG8gZGVmaW5lIHRoZSB0aGVtZSBpbmplY3RvciBhZ2FpbnN0LiBEZWZhdWx0c1xuICogdG8gdGhlIGdsb2JhbCByZWdpc3RyeVxuICpcbiAqIEByZXR1cm5zIHRoZSB0aGVtZSBpbmplY3RvciB1c2VkIHRvIHNldCB0aGUgdGhlbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyVGhlbWVJbmplY3Rvcih0aGVtZTogYW55LCB0aGVtZVJlZ2lzdHJ5OiBSZWdpc3RyeSk6IEluamVjdG9yIHtcblx0Y29uc3QgdGhlbWVJbmplY3RvciA9IG5ldyBJbmplY3Rvcih0aGVtZSk7XG5cdHRoZW1lUmVnaXN0cnkuZGVmaW5lSW5qZWN0b3IoSU5KRUNURURfVEhFTUVfS0VZLCAoaW52YWxpZGF0b3IpID0+IHtcblx0XHR0aGVtZUluamVjdG9yLnNldEludmFsaWRhdG9yKGludmFsaWRhdG9yKTtcblx0XHRyZXR1cm4gKCkgPT4gdGhlbWVJbmplY3Rvci5nZXQoKTtcblx0fSk7XG5cdHJldHVybiB0aGVtZUluamVjdG9yO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGNsYXNzIGRlY29yYXRlZCB3aXRoIHdpdGggVGhlbWVkIGZ1bmN0aW9uYWxpdHlcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gVGhlbWVkTWl4aW48RSwgVCBleHRlbmRzIENvbnN0cnVjdG9yPFdpZGdldEJhc2U8VGhlbWVkUHJvcGVydGllczxFPj4+Pihcblx0QmFzZTogVFxuKTogQ29uc3RydWN0b3I8VGhlbWVkTWl4aW48RT4+ICYgVCB7XG5cdEBpbmplY3Qoe1xuXHRcdG5hbWU6IElOSkVDVEVEX1RIRU1FX0tFWSxcblx0XHRnZXRQcm9wZXJ0aWVzOiAodGhlbWU6IFRoZW1lLCBwcm9wZXJ0aWVzOiBUaGVtZWRQcm9wZXJ0aWVzKTogVGhlbWVkUHJvcGVydGllcyA9PiB7XG5cdFx0XHRpZiAoIXByb3BlcnRpZXMudGhlbWUpIHtcblx0XHRcdFx0cmV0dXJuIHsgdGhlbWUgfTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB7fTtcblx0XHR9XG5cdH0pXG5cdGFic3RyYWN0IGNsYXNzIFRoZW1lZCBleHRlbmRzIEJhc2Uge1xuXHRcdHB1YmxpYyBhYnN0cmFjdCBwcm9wZXJ0aWVzOiBUaGVtZWRQcm9wZXJ0aWVzPEU+O1xuXG5cdFx0LyoqXG5cdFx0ICogVGhlIFRoZW1lZCBiYXNlQ2xhc3Nlc1xuXHRcdCAqL1xuXHRcdHByaXZhdGUgX3JlZ2lzdGVyZWRCYXNlVGhlbWU6IENsYXNzTmFtZXMgfCB1bmRlZmluZWQ7XG5cblx0XHQvKipcblx0XHQgKiBSZWdpc3RlcmVkIGJhc2UgdGhlbWUga2V5c1xuXHRcdCAqL1xuXHRcdHByaXZhdGUgX3JlZ2lzdGVyZWRCYXNlVGhlbWVLZXlzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdFx0LyoqXG5cdFx0ICogUmV2ZXJzZSBsb29rdXAgb2YgdGhlIHRoZW1lIGNsYXNzZXNcblx0XHQgKi9cblx0XHRwcml2YXRlIF9iYXNlVGhlbWVDbGFzc2VzUmV2ZXJzZUxvb2t1cDogQ2xhc3NOYW1lcyB8IHVuZGVmaW5lZDtcblxuXHRcdC8qKlxuXHRcdCAqIEluZGljYXRlcyBpZiBjbGFzc2VzIG1ldGEgZGF0YSBuZWVkIHRvIGJlIGNhbGN1bGF0ZWQuXG5cdFx0ICovXG5cdFx0cHJpdmF0ZSBfcmVjYWxjdWxhdGVDbGFzc2VzID0gdHJ1ZTtcblxuXHRcdC8qKlxuXHRcdCAqIExvYWRlZCB0aGVtZVxuXHRcdCAqL1xuXHRcdHByaXZhdGUgX3RoZW1lOiBDbGFzc05hbWVzID0ge307XG5cblx0XHRwdWJsaWMgdGhlbWUoY2xhc3NlczogU3VwcG9ydGVkQ2xhc3NOYW1lKTogU3VwcG9ydGVkQ2xhc3NOYW1lO1xuXHRcdHB1YmxpYyB0aGVtZShjbGFzc2VzOiBTdXBwb3J0ZWRDbGFzc05hbWVbXSk6IFN1cHBvcnRlZENsYXNzTmFtZVtdO1xuXHRcdHB1YmxpYyB0aGVtZShjbGFzc2VzOiBTdXBwb3J0ZWRDbGFzc05hbWUgfCBTdXBwb3J0ZWRDbGFzc05hbWVbXSk6IFN1cHBvcnRlZENsYXNzTmFtZSB8IFN1cHBvcnRlZENsYXNzTmFtZVtdIHtcblx0XHRcdGlmICh0aGlzLl9yZWNhbGN1bGF0ZUNsYXNzZXMpIHtcblx0XHRcdFx0dGhpcy5fcmVjYWxjdWxhdGVUaGVtZUNsYXNzZXMoKTtcblx0XHRcdH1cblx0XHRcdGlmIChBcnJheS5pc0FycmF5KGNsYXNzZXMpKSB7XG5cdFx0XHRcdHJldHVybiBjbGFzc2VzLm1hcCgoY2xhc3NOYW1lKSA9PiB0aGlzLl9nZXRUaGVtZUNsYXNzKGNsYXNzTmFtZSkpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMuX2dldFRoZW1lQ2xhc3MoY2xhc3Nlcyk7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogRnVuY3Rpb24gZmlyZWQgd2hlbiBgdGhlbWVgIG9yIGBleHRyYUNsYXNzZXNgIGFyZSBjaGFuZ2VkLlxuXHRcdCAqL1xuXHRcdEBkaWZmUHJvcGVydHkoJ3RoZW1lJywgc2hhbGxvdylcblx0XHRAZGlmZlByb3BlcnR5KCdleHRyYUNsYXNzZXMnLCBzaGFsbG93KVxuXHRcdHByb3RlY3RlZCBvblByb3BlcnRpZXNDaGFuZ2VkKCkge1xuXHRcdFx0dGhpcy5fcmVjYWxjdWxhdGVDbGFzc2VzID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRwcml2YXRlIF9nZXRUaGVtZUNsYXNzKGNsYXNzTmFtZTogU3VwcG9ydGVkQ2xhc3NOYW1lKTogU3VwcG9ydGVkQ2xhc3NOYW1lIHtcblx0XHRcdGlmIChjbGFzc05hbWUgPT09IHVuZGVmaW5lZCB8fCBjbGFzc05hbWUgPT09IG51bGwpIHtcblx0XHRcdFx0cmV0dXJuIGNsYXNzTmFtZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZXh0cmFDbGFzc2VzID0gdGhpcy5wcm9wZXJ0aWVzLmV4dHJhQ2xhc3NlcyB8fCAoe30gYXMgYW55KTtcblx0XHRcdGNvbnN0IHRoZW1lQ2xhc3NOYW1lID0gdGhpcy5fYmFzZVRoZW1lQ2xhc3Nlc1JldmVyc2VMb29rdXAhW2NsYXNzTmFtZV07XG5cdFx0XHRsZXQgcmVzdWx0Q2xhc3NOYW1lczogc3RyaW5nW10gPSBbXTtcblx0XHRcdGlmICghdGhlbWVDbGFzc05hbWUpIHtcblx0XHRcdFx0Y29uc29sZS53YXJuKGBDbGFzcyBuYW1lOiAnJHtjbGFzc05hbWV9JyBub3QgZm91bmQgaW4gdGhlbWVgKTtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChleHRyYUNsYXNzZXNbdGhlbWVDbGFzc05hbWVdKSB7XG5cdFx0XHRcdHJlc3VsdENsYXNzTmFtZXMucHVzaChleHRyYUNsYXNzZXNbdGhlbWVDbGFzc05hbWVdKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX3RoZW1lW3RoZW1lQ2xhc3NOYW1lXSkge1xuXHRcdFx0XHRyZXN1bHRDbGFzc05hbWVzLnB1c2godGhpcy5fdGhlbWVbdGhlbWVDbGFzc05hbWVdKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlc3VsdENsYXNzTmFtZXMucHVzaCh0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lIVt0aGVtZUNsYXNzTmFtZV0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3VsdENsYXNzTmFtZXMuam9pbignICcpO1xuXHRcdH1cblxuXHRcdHByaXZhdGUgX3JlY2FsY3VsYXRlVGhlbWVDbGFzc2VzKCkge1xuXHRcdFx0Y29uc3QgeyB0aGVtZSA9IHt9IH0gPSB0aGlzLnByb3BlcnRpZXM7XG5cdFx0XHRjb25zdCBiYXNlVGhlbWVzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2Jhc2VUaGVtZUNsYXNzZXMnKTtcblx0XHRcdGlmICghdGhpcy5fcmVnaXN0ZXJlZEJhc2VUaGVtZSkge1xuXHRcdFx0XHR0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lID0gYmFzZVRoZW1lcy5yZWR1Y2UoKGZpbmFsQmFzZVRoZW1lLCBiYXNlVGhlbWUpID0+IHtcblx0XHRcdFx0XHRjb25zdCB7IFtUSEVNRV9LRVldOiBrZXksIC4uLmNsYXNzZXMgfSA9IGJhc2VUaGVtZTtcblx0XHRcdFx0XHR0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lS2V5cy5wdXNoKGtleSk7XG5cdFx0XHRcdFx0cmV0dXJuIHsgLi4uZmluYWxCYXNlVGhlbWUsIC4uLmNsYXNzZXMgfTtcblx0XHRcdFx0fSwge30pO1xuXHRcdFx0XHR0aGlzLl9iYXNlVGhlbWVDbGFzc2VzUmV2ZXJzZUxvb2t1cCA9IGNyZWF0ZVRoZW1lQ2xhc3Nlc0xvb2t1cChiYXNlVGhlbWVzKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fdGhlbWUgPSB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lS2V5cy5yZWR1Y2UoKGJhc2VUaGVtZSwgdGhlbWVLZXkpID0+IHtcblx0XHRcdFx0cmV0dXJuIHsgLi4uYmFzZVRoZW1lLCAuLi50aGVtZVt0aGVtZUtleV0gfTtcblx0XHRcdH0sIHt9KTtcblxuXHRcdFx0dGhpcy5fcmVjYWxjdWxhdGVDbGFzc2VzID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIFRoZW1lZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgVGhlbWVkTWl4aW47XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gVGhlbWVkLnRzIiwiaW1wb3J0IHsgV2lkZ2V0QmFzZSwgbm9CaW5kIH0gZnJvbSAnLi9XaWRnZXRCYXNlJztcbmltcG9ydCB7IFByb2plY3Rvck1peGluIH0gZnJvbSAnLi9taXhpbnMvUHJvamVjdG9yJztcbmltcG9ydCB7IGZyb20gfSBmcm9tICcuLi9zaGltL2FycmF5JztcbmltcG9ydCB7IHcsIGRvbSB9IGZyb20gJy4vZCc7XG5pbXBvcnQgZ2xvYmFsIGZyb20gJy4uL3NoaW0vZ2xvYmFsJztcbmltcG9ydCB7IHJlZ2lzdGVyVGhlbWVJbmplY3RvciB9IGZyb20gJy4vbWl4aW5zL1RoZW1lZCc7XG5pbXBvcnQgeyBhbHdheXNSZW5kZXIgfSBmcm9tICcuL2RlY29yYXRvcnMvYWx3YXlzUmVuZGVyJztcblxuZXhwb3J0IGVudW0gQ3VzdG9tRWxlbWVudENoaWxkVHlwZSB7XG5cdERPSk8gPSAnRE9KTycsXG5cdE5PREUgPSAnTk9ERScsXG5cdFRFWFQgPSAnVEVYVCdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIERvbVRvV2lkZ2V0V3JhcHBlcihkb21Ob2RlOiBIVE1MRWxlbWVudCk6IGFueSB7XG5cdEBhbHdheXNSZW5kZXIoKVxuXHRjbGFzcyBEb21Ub1dpZGdldFdyYXBwZXIgZXh0ZW5kcyBXaWRnZXRCYXNlPGFueT4ge1xuXHRcdHByb3RlY3RlZCByZW5kZXIoKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0aWVzID0gT2JqZWN0LmtleXModGhpcy5wcm9wZXJ0aWVzKS5yZWR1Y2UoXG5cdFx0XHRcdChwcm9wcywga2V5OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRjb25zdCB2YWx1ZSA9IHRoaXMucHJvcGVydGllc1trZXldO1xuXHRcdFx0XHRcdGlmIChrZXkuaW5kZXhPZignb24nKSA9PT0gMCkge1xuXHRcdFx0XHRcdFx0a2V5ID0gYF9fJHtrZXl9YDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cHJvcHNba2V5XSA9IHZhbHVlO1xuXHRcdFx0XHRcdHJldHVybiBwcm9wcztcblx0XHRcdFx0fSxcblx0XHRcdFx0e30gYXMgYW55XG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIGRvbSh7IG5vZGU6IGRvbU5vZGUsIHByb3BzOiBwcm9wZXJ0aWVzLCBkaWZmVHlwZTogJ2RvbScgfSk7XG5cdFx0fVxuXG5cdFx0c3RhdGljIGdldCBkb21Ob2RlKCkge1xuXHRcdFx0cmV0dXJuIGRvbU5vZGU7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIERvbVRvV2lkZ2V0V3JhcHBlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZShkZXNjcmlwdG9yOiBhbnksIFdpZGdldENvbnN0cnVjdG9yOiBhbnkpOiBhbnkge1xuXHRjb25zdCB7IGF0dHJpYnV0ZXMsIGNoaWxkVHlwZSwgcmVnaXN0cnlGYWN0b3J5IH0gPSBkZXNjcmlwdG9yO1xuXHRjb25zdCBhdHRyaWJ1dGVNYXA6IGFueSA9IHt9O1xuXG5cdGF0dHJpYnV0ZXMuZm9yRWFjaCgocHJvcGVydHlOYW1lOiBzdHJpbmcpID0+IHtcblx0XHRjb25zdCBhdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0YXR0cmlidXRlTWFwW2F0dHJpYnV0ZU5hbWVdID0gcHJvcGVydHlOYW1lO1xuXHR9KTtcblxuXHRyZXR1cm4gY2xhc3MgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG5cdFx0cHJpdmF0ZSBfcHJvamVjdG9yOiBhbnk7XG5cdFx0cHJpdmF0ZSBfcHJvcGVydGllczogYW55ID0ge307XG5cdFx0cHJpdmF0ZSBfY2hpbGRyZW46IGFueVtdID0gW107XG5cdFx0cHJpdmF0ZSBfZXZlbnRQcm9wZXJ0aWVzOiBhbnkgPSB7fTtcblx0XHRwcml2YXRlIF9pbml0aWFsaXNlZCA9IGZhbHNlO1xuXG5cdFx0cHVibGljIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuXHRcdFx0aWYgKHRoaXMuX2luaXRpYWxpc2VkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZG9tUHJvcGVydGllczogYW55ID0ge307XG5cdFx0XHRjb25zdCB7IGF0dHJpYnV0ZXMsIHByb3BlcnRpZXMsIGV2ZW50cyB9ID0gZGVzY3JpcHRvcjtcblxuXHRcdFx0dGhpcy5fcHJvcGVydGllcyA9IHsgLi4udGhpcy5fcHJvcGVydGllcywgLi4udGhpcy5fYXR0cmlidXRlc1RvUHJvcGVydGllcyhhdHRyaWJ1dGVzKSB9O1xuXG5cdFx0XHRbLi4uYXR0cmlidXRlcywgLi4ucHJvcGVydGllc10uZm9yRWFjaCgocHJvcGVydHlOYW1lOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0Y29uc3QgdmFsdWUgPSAodGhpcyBhcyBhbnkpW3Byb3BlcnR5TmFtZV07XG5cdFx0XHRcdGNvbnN0IGZpbHRlcmVkUHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lLnJlcGxhY2UoL15vbi8sICdfXycpO1xuXHRcdFx0XHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHRoaXMuX3Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGZpbHRlcmVkUHJvcGVydHlOYW1lICE9PSBwcm9wZXJ0eU5hbWUpIHtcblx0XHRcdFx0XHRkb21Qcm9wZXJ0aWVzW2ZpbHRlcmVkUHJvcGVydHlOYW1lXSA9IHtcblx0XHRcdFx0XHRcdGdldDogKCkgPT4gdGhpcy5fZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSxcblx0XHRcdFx0XHRcdHNldDogKHZhbHVlOiBhbnkpID0+IHRoaXMuX3NldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRvbVByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHtcblx0XHRcdFx0XHRnZXQ6ICgpID0+IHRoaXMuX2dldFByb3BlcnR5KHByb3BlcnR5TmFtZSksXG5cdFx0XHRcdFx0c2V0OiAodmFsdWU6IGFueSkgPT4gdGhpcy5fc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSlcblx0XHRcdFx0fTtcblx0XHRcdH0pO1xuXG5cdFx0XHRldmVudHMuZm9yRWFjaCgocHJvcGVydHlOYW1lOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0Y29uc3QgZXZlbnROYW1lID0gcHJvcGVydHlOYW1lLnJlcGxhY2UoL15vbi8sICcnKS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRjb25zdCBmaWx0ZXJlZFByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZS5yZXBsYWNlKC9eb24vLCAnX19vbicpO1xuXG5cdFx0XHRcdGRvbVByb3BlcnRpZXNbZmlsdGVyZWRQcm9wZXJ0eU5hbWVdID0ge1xuXHRcdFx0XHRcdGdldDogKCkgPT4gdGhpcy5fZ2V0RXZlbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpLFxuXHRcdFx0XHRcdHNldDogKHZhbHVlOiBhbnkpID0+IHRoaXMuX3NldEV2ZW50UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSlcblx0XHRcdFx0fTtcblxuXHRcdFx0XHR0aGlzLl9ldmVudFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0dGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgZXZlbnRDYWxsYmFjayA9IHRoaXMuX2dldEV2ZW50UHJvcGVydHkocHJvcGVydHlOYW1lKTtcblx0XHRcdFx0XHRpZiAodHlwZW9mIGV2ZW50Q2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHRcdGV2ZW50Q2FsbGJhY2soLi4uYXJncyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudChcblx0XHRcdFx0XHRcdG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHtcblx0XHRcdFx0XHRcdFx0YnViYmxlczogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdGRldGFpbDogYXJnc1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9O1xuXHRcdFx0fSk7XG5cblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIGRvbVByb3BlcnRpZXMpO1xuXG5cdFx0XHRjb25zdCBjaGlsZHJlbiA9IGNoaWxkVHlwZSA9PT0gQ3VzdG9tRWxlbWVudENoaWxkVHlwZS5URVhUID8gdGhpcy5jaGlsZE5vZGVzIDogdGhpcy5jaGlsZHJlbjtcblxuXHRcdFx0ZnJvbShjaGlsZHJlbikuZm9yRWFjaCgoY2hpbGROb2RlOiBOb2RlKSA9PiB7XG5cdFx0XHRcdGlmIChjaGlsZFR5cGUgPT09IEN1c3RvbUVsZW1lbnRDaGlsZFR5cGUuRE9KTykge1xuXHRcdFx0XHRcdGNoaWxkTm9kZS5hZGRFdmVudExpc3RlbmVyKCdkb2pvLWNlLXJlbmRlcicsICgpID0+IHRoaXMuX3JlbmRlcigpKTtcblx0XHRcdFx0XHRjaGlsZE5vZGUuYWRkRXZlbnRMaXN0ZW5lcignZG9qby1jZS1jb25uZWN0ZWQnLCAoKSA9PiB0aGlzLl9yZW5kZXIoKSk7XG5cdFx0XHRcdFx0dGhpcy5fY2hpbGRyZW4ucHVzaChEb21Ub1dpZGdldFdyYXBwZXIoY2hpbGROb2RlIGFzIEhUTUxFbGVtZW50KSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5fY2hpbGRyZW4ucHVzaChkb20oeyBub2RlOiBjaGlsZE5vZGUgYXMgSFRNTEVsZW1lbnQsIGRpZmZUeXBlOiAnZG9tJyB9KSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2Rvam8tY2UtY29ubmVjdGVkJywgKGU6IGFueSkgPT4gdGhpcy5fY2hpbGRDb25uZWN0ZWQoZSkpO1xuXG5cdFx0XHRjb25zdCB3aWRnZXRQcm9wZXJ0aWVzID0gdGhpcy5fcHJvcGVydGllcztcblx0XHRcdGNvbnN0IHJlbmRlckNoaWxkcmVuID0gKCkgPT4gdGhpcy5fX2NoaWxkcmVuX18oKTtcblx0XHRcdGNvbnN0IFdyYXBwZXIgPSBjbGFzcyBleHRlbmRzIFdpZGdldEJhc2Uge1xuXHRcdFx0XHRyZW5kZXIoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHcoV2lkZ2V0Q29uc3RydWN0b3IsIHdpZGdldFByb3BlcnRpZXMsIHJlbmRlckNoaWxkcmVuKCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgcmVnaXN0cnkgPSByZWdpc3RyeUZhY3RvcnkoKTtcblx0XHRcdGNvbnN0IHRoZW1lQ29udGV4dCA9IHJlZ2lzdGVyVGhlbWVJbmplY3Rvcih0aGlzLl9nZXRUaGVtZSgpLCByZWdpc3RyeSk7XG5cdFx0XHRnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignZG9qby10aGVtZS1zZXQnLCAoKSA9PiB0aGVtZUNvbnRleHQuc2V0KHRoaXMuX2dldFRoZW1lKCkpKTtcblx0XHRcdGNvbnN0IFByb2plY3RvciA9IFByb2plY3Rvck1peGluKFdyYXBwZXIpO1xuXHRcdFx0dGhpcy5fcHJvamVjdG9yID0gbmV3IFByb2plY3RvcigpO1xuXHRcdFx0dGhpcy5fcHJvamVjdG9yLnNldFByb3BlcnRpZXMoeyByZWdpc3RyeSB9KTtcblx0XHRcdHRoaXMuX3Byb2plY3Rvci5hcHBlbmQodGhpcyk7XG5cblx0XHRcdHRoaXMuX2luaXRpYWxpc2VkID0gdHJ1ZTtcblx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudChcblx0XHRcdFx0bmV3IEN1c3RvbUV2ZW50KCdkb2pvLWNlLWNvbm5lY3RlZCcsIHtcblx0XHRcdFx0XHRidWJibGVzOiB0cnVlLFxuXHRcdFx0XHRcdGRldGFpbDogdGhpc1xuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRwcml2YXRlIF9nZXRUaGVtZSgpIHtcblx0XHRcdGlmIChnbG9iYWwgJiYgZ2xvYmFsLmRvam9jZSAmJiBnbG9iYWwuZG9qb2NlLnRoZW1lKSB7XG5cdFx0XHRcdHJldHVybiBnbG9iYWwuZG9qb2NlLnRoZW1lc1tnbG9iYWwuZG9qb2NlLnRoZW1lXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRwcml2YXRlIF9jaGlsZENvbm5lY3RlZChlOiBhbnkpIHtcblx0XHRcdGNvbnN0IG5vZGUgPSBlLmRldGFpbDtcblx0XHRcdGlmIChub2RlLnBhcmVudE5vZGUgPT09IHRoaXMpIHtcblx0XHRcdFx0Y29uc3QgZXhpc3RzID0gdGhpcy5fY2hpbGRyZW4uc29tZSgoY2hpbGQpID0+IGNoaWxkLmRvbU5vZGUgPT09IG5vZGUpO1xuXHRcdFx0XHRpZiAoIWV4aXN0cykge1xuXHRcdFx0XHRcdG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignZG9qby1jZS1yZW5kZXInLCAoKSA9PiB0aGlzLl9yZW5kZXIoKSk7XG5cdFx0XHRcdFx0dGhpcy5fY2hpbGRyZW4ucHVzaChEb21Ub1dpZGdldFdyYXBwZXIobm9kZSkpO1xuXHRcdFx0XHRcdHRoaXMuX3JlbmRlcigpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cHJpdmF0ZSBfcmVuZGVyKCkge1xuXHRcdFx0aWYgKHRoaXMuX3Byb2plY3Rvcikge1xuXHRcdFx0XHR0aGlzLl9wcm9qZWN0b3IuaW52YWxpZGF0ZSgpO1xuXHRcdFx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoXG5cdFx0XHRcdFx0bmV3IEN1c3RvbUV2ZW50KCdkb2pvLWNlLXJlbmRlcicsIHtcblx0XHRcdFx0XHRcdGJ1YmJsZXM6IGZhbHNlLFxuXHRcdFx0XHRcdFx0ZGV0YWlsOiB0aGlzXG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRwdWJsaWMgX19wcm9wZXJ0aWVzX18oKSB7XG5cdFx0XHRyZXR1cm4geyAuLi50aGlzLl9wcm9wZXJ0aWVzLCAuLi50aGlzLl9ldmVudFByb3BlcnRpZXMgfTtcblx0XHR9XG5cblx0XHRwdWJsaWMgX19jaGlsZHJlbl9fKCkge1xuXHRcdFx0aWYgKGNoaWxkVHlwZSA9PT0gQ3VzdG9tRWxlbWVudENoaWxkVHlwZS5ET0pPKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9jaGlsZHJlbi5maWx0ZXIoKENoaWxkKSA9PiBDaGlsZC5kb21Ob2RlLmlzV2lkZ2V0KS5tYXAoKENoaWxkOiBhbnkpID0+IHtcblx0XHRcdFx0XHRjb25zdCB7IGRvbU5vZGUgfSA9IENoaWxkO1xuXHRcdFx0XHRcdHJldHVybiB3KENoaWxkLCB7IC4uLmRvbU5vZGUuX19wcm9wZXJ0aWVzX18oKSB9LCBbLi4uZG9tTm9kZS5fX2NoaWxkcmVuX18oKV0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9jaGlsZHJlbjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRwdWJsaWMgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWU6IHN0cmluZywgb2xkVmFsdWU6IHN0cmluZyB8IG51bGwsIHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBhdHRyaWJ1dGVNYXBbbmFtZV07XG5cdFx0XHR0aGlzLl9zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKTtcblx0XHR9XG5cblx0XHRwcml2YXRlIF9zZXRFdmVudFByb3BlcnR5KHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG5cdFx0XHR0aGlzLl9ldmVudFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuXHRcdH1cblxuXHRcdHByaXZhdGUgX2dldEV2ZW50UHJvcGVydHkocHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcblx0XHRcdHJldHVybiB0aGlzLl9ldmVudFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcblx0XHR9XG5cblx0XHRwcml2YXRlIF9zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xuXHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHR2YWx1ZVtub0JpbmRdID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX3Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuXHRcdFx0dGhpcy5fcmVuZGVyKCk7XG5cdFx0fVxuXG5cdFx0cHJpdmF0ZSBfZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcblx0XHRcdHJldHVybiB0aGlzLl9wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG5cdFx0fVxuXG5cdFx0cHJpdmF0ZSBfYXR0cmlidXRlc1RvUHJvcGVydGllcyhhdHRyaWJ1dGVzOiBzdHJpbmdbXSkge1xuXHRcdFx0cmV0dXJuIGF0dHJpYnV0ZXMucmVkdWNlKChwcm9wZXJ0aWVzOiBhbnksIHByb3BlcnR5TmFtZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0Y29uc3QgdmFsdWUgPSB0aGlzLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcblx0XHRcdFx0aWYgKHZhbHVlICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0cHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHByb3BlcnRpZXM7XG5cdFx0XHR9LCB7fSk7XG5cdFx0fVxuXG5cdFx0c3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG5cdFx0XHRyZXR1cm4gT2JqZWN0LmtleXMoYXR0cmlidXRlTWFwKTtcblx0XHR9XG5cblx0XHRwdWJsaWMgZ2V0IGlzV2lkZ2V0KCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXIoV2lkZ2V0Q29uc3RydWN0b3I6IGFueSk6IHZvaWQge1xuXHRjb25zdCBkZXNjcmlwdG9yID0gV2lkZ2V0Q29uc3RydWN0b3IucHJvdG90eXBlICYmIFdpZGdldENvbnN0cnVjdG9yLnByb3RvdHlwZS5fX2N1c3RvbUVsZW1lbnREZXNjcmlwdG9yO1xuXG5cdGlmICghZGVzY3JpcHRvcikge1xuXHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdCdDYW5ub3QgZ2V0IGRlc2NyaXB0b3IgZm9yIEN1c3RvbSBFbGVtZW50LCBoYXZlIHlvdSBhZGRlZCB0aGUgQGN1c3RvbUVsZW1lbnQgZGVjb3JhdG9yIHRvIHlvdXIgV2lkZ2V0Pydcblx0XHQpO1xuXHR9XG5cblx0Z2xvYmFsLmN1c3RvbUVsZW1lbnRzLmRlZmluZShkZXNjcmlwdG9yLnRhZ05hbWUsIGNyZWF0ZShkZXNjcmlwdG9yLCBXaWRnZXRDb25zdHJ1Y3RvcikpO1xufVxuXG5leHBvcnQgZGVmYXVsdCByZWdpc3RlcjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyByZWdpc3RlckN1c3RvbUVsZW1lbnQudHMiLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4uL3NoaW0vZ2xvYmFsJztcbmltcG9ydCB7XG5cdENvcmVQcm9wZXJ0aWVzLFxuXHREZWZhdWx0V2lkZ2V0QmFzZUludGVyZmFjZSxcblx0RE5vZGUsXG5cdFZOb2RlLFxuXHRXTm9kZSxcblx0UHJvamVjdGlvbk9wdGlvbnMsXG5cdFByb2plY3Rpb24sXG5cdFN1cHBvcnRlZENsYXNzTmFtZSxcblx0VHJhbnNpdGlvblN0cmF0ZWd5LFxuXHRWTm9kZVByb3BlcnRpZXNcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGZyb20gYXMgYXJyYXlGcm9tIH0gZnJvbSAnLi4vc2hpbS9hcnJheSc7XG5pbXBvcnQgeyBpc1dOb2RlLCBpc1ZOb2RlLCBpc0RvbVZOb2RlLCBWTk9ERSwgV05PREUgfSBmcm9tICcuL2QnO1xuaW1wb3J0IHsgaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IgfSBmcm9tICcuL1JlZ2lzdHJ5JztcbmltcG9ydCBXZWFrTWFwIGZyb20gJy4uL3NoaW0vV2Vha01hcCc7XG5pbXBvcnQgTm9kZUhhbmRsZXIgZnJvbSAnLi9Ob2RlSGFuZGxlcic7XG5pbXBvcnQgUmVnaXN0cnlIYW5kbGVyIGZyb20gJy4vUmVnaXN0cnlIYW5kbGVyJztcblxuY29uc3QgTkFNRVNQQUNFX1czID0gJ2h0dHA6Ly93d3cudzMub3JnLyc7XG5jb25zdCBOQU1FU1BBQ0VfU1ZHID0gTkFNRVNQQUNFX1czICsgJzIwMDAvc3ZnJztcbmNvbnN0IE5BTUVTUEFDRV9YTElOSyA9IE5BTUVTUEFDRV9XMyArICcxOTk5L3hsaW5rJztcblxuY29uc3QgZW1wdHlBcnJheTogKEludGVybmFsV05vZGUgfCBJbnRlcm5hbFZOb2RlKVtdID0gW107XG5cbmNvbnN0IG5vZGVPcGVyYXRpb25zID0gWydmb2N1cycsICdibHVyJywgJ3Njcm9sbEludG9WaWV3JywgJ2NsaWNrJ107XG5cbmV4cG9ydCB0eXBlIFJlbmRlclJlc3VsdCA9IEROb2RlPGFueT4gfCBETm9kZTxhbnk+W107XG5cbmludGVyZmFjZSBJbnN0YW5jZU1hcERhdGEge1xuXHRwYXJlbnRWTm9kZTogSW50ZXJuYWxWTm9kZTtcblx0ZG5vZGU6IEludGVybmFsV05vZGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJuYWxXTm9kZSBleHRlbmRzIFdOb2RlPERlZmF1bHRXaWRnZXRCYXNlSW50ZXJmYWNlPiB7XG5cdC8qKlxuXHQgKiBUaGUgaW5zdGFuY2Ugb2YgdGhlIHdpZGdldFxuXHQgKi9cblx0aW5zdGFuY2U6IERlZmF1bHRXaWRnZXRCYXNlSW50ZXJmYWNlO1xuXG5cdC8qKlxuXHQgKiBUaGUgcmVuZGVyZWQgRE5vZGVzIGZyb20gdGhlIGluc3RhbmNlXG5cdCAqL1xuXHRyZW5kZXJlZDogSW50ZXJuYWxETm9kZVtdO1xuXG5cdC8qKlxuXHQgKiBDb3JlIHByb3BlcnRpZXMgdGhhdCBhcmUgdXNlZCBieSB0aGUgd2lkZ2V0IGNvcmUgc3lzdGVtXG5cdCAqL1xuXHRjb3JlUHJvcGVydGllczogQ29yZVByb3BlcnRpZXM7XG5cblx0LyoqXG5cdCAqIENoaWxkcmVuIGZvciB0aGUgV05vZGVcblx0ICovXG5cdGNoaWxkcmVuOiBJbnRlcm5hbEROb2RlW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJuYWxWTm9kZSBleHRlbmRzIFZOb2RlIHtcblx0LyoqXG5cdCAqIENoaWxkcmVuIGZvciB0aGUgVk5vZGVcblx0ICovXG5cdGNoaWxkcmVuPzogSW50ZXJuYWxETm9kZVtdO1xuXG5cdGluc2VydGVkPzogYm9vbGVhbjtcblxuXHQvKipcblx0ICogQmFnIHVzZWQgdG8gc3RpbGwgZGVjb3JhdGUgcHJvcGVydGllcyBvbiBhIGRlZmVycmVkIHByb3BlcnRpZXMgY2FsbGJhY2tcblx0ICovXG5cdGRlY29yYXRlZERlZmVycmVkUHJvcGVydGllcz86IFZOb2RlUHJvcGVydGllcztcblxuXHQvKipcblx0ICogRE9NIGVsZW1lbnRcblx0ICovXG5cdGRvbU5vZGU/OiBFbGVtZW50IHwgVGV4dDtcbn1cblxuZXhwb3J0IHR5cGUgSW50ZXJuYWxETm9kZSA9IEludGVybmFsVk5vZGUgfCBJbnRlcm5hbFdOb2RlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlclF1ZXVlIHtcblx0aW5zdGFuY2U6IERlZmF1bHRXaWRnZXRCYXNlSW50ZXJmYWNlO1xuXHRkZXB0aDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdpZGdldERhdGEge1xuXHRvbkRldGFjaDogKCkgPT4gdm9pZDtcblx0b25BdHRhY2g6ICgpID0+IHZvaWQ7XG5cdGRpcnR5OiBib29sZWFuO1xuXHRyZWdpc3RyeTogKCkgPT4gUmVnaXN0cnlIYW5kbGVyO1xuXHRub2RlSGFuZGxlcjogTm9kZUhhbmRsZXI7XG5cdGNvcmVQcm9wZXJ0aWVzOiBDb3JlUHJvcGVydGllcztcblx0aW52YWxpZGF0ZT86IEZ1bmN0aW9uO1xuXHRyZW5kZXJpbmc6IGJvb2xlYW47XG5cdGlucHV0UHJvcGVydGllczogYW55O1xufVxuXG5pbnRlcmZhY2UgUHJvamVjdG9yU3RhdGUge1xuXHRkZWZlcnJlZFJlbmRlckNhbGxiYWNrczogRnVuY3Rpb25bXTtcblx0YWZ0ZXJSZW5kZXJDYWxsYmFja3M6IEZ1bmN0aW9uW107XG5cdG5vZGVNYXA6IFdlYWtNYXA8Tm9kZSwgV2Vha01hcDxGdW5jdGlvbiwgRXZlbnRMaXN0ZW5lcj4+O1xuXHRyZW5kZXJTY2hlZHVsZWQ/OiBudW1iZXI7XG5cdHJlbmRlclF1ZXVlOiBSZW5kZXJRdWV1ZVtdO1xuXHRtZXJnZTogYm9vbGVhbjtcblx0bWVyZ2VFbGVtZW50PzogTm9kZTtcbn1cblxuZXhwb3J0IGNvbnN0IHdpZGdldEluc3RhbmNlTWFwID0gbmV3IFdlYWtNYXA8YW55LCBXaWRnZXREYXRhPigpO1xuXG5jb25zdCBpbnN0YW5jZU1hcCA9IG5ldyBXZWFrTWFwPERlZmF1bHRXaWRnZXRCYXNlSW50ZXJmYWNlLCBJbnN0YW5jZU1hcERhdGE+KCk7XG5jb25zdCBuZXh0U2libGluZ01hcCA9IG5ldyBXZWFrTWFwPERlZmF1bHRXaWRnZXRCYXNlSW50ZXJmYWNlLCBJbnRlcm5hbEROb2RlW10+KCk7XG5jb25zdCBwcm9qZWN0b3JTdGF0ZU1hcCA9IG5ldyBXZWFrTWFwPERlZmF1bHRXaWRnZXRCYXNlSW50ZXJmYWNlLCBQcm9qZWN0b3JTdGF0ZT4oKTtcblxuZnVuY3Rpb24gc2FtZShkbm9kZTE6IEludGVybmFsRE5vZGUsIGRub2RlMjogSW50ZXJuYWxETm9kZSkge1xuXHRpZiAoaXNWTm9kZShkbm9kZTEpICYmIGlzVk5vZGUoZG5vZGUyKSkge1xuXHRcdGlmIChpc0RvbVZOb2RlKGRub2RlMSkgfHwgaXNEb21WTm9kZShkbm9kZTIpKSB7XG5cdFx0XHRpZiAoZG5vZGUxLmRvbU5vZGUgIT09IGRub2RlMi5kb21Ob2RlKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGRub2RlMS50YWcgIT09IGRub2RlMi50YWcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKGRub2RlMS5wcm9wZXJ0aWVzLmtleSAhPT0gZG5vZGUyLnByb3BlcnRpZXMua2V5KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGVsc2UgaWYgKGlzV05vZGUoZG5vZGUxKSAmJiBpc1dOb2RlKGRub2RlMikpIHtcblx0XHRpZiAoZG5vZGUxLmluc3RhbmNlID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIGRub2RlMi53aWRnZXRDb25zdHJ1Y3RvciA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKGRub2RlMS53aWRnZXRDb25zdHJ1Y3RvciAhPT0gZG5vZGUyLndpZGdldENvbnN0cnVjdG9yKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGlmIChkbm9kZTEucHJvcGVydGllcy5rZXkgIT09IGRub2RlMi5wcm9wZXJ0aWVzLmtleSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmNvbnN0IG1pc3NpbmdUcmFuc2l0aW9uID0gZnVuY3Rpb24oKSB7XG5cdHRocm93IG5ldyBFcnJvcignUHJvdmlkZSBhIHRyYW5zaXRpb25zIG9iamVjdCB0byB0aGUgcHJvamVjdGlvbk9wdGlvbnMgdG8gZG8gYW5pbWF0aW9ucycpO1xufTtcblxuZnVuY3Rpb24gZ2V0UHJvamVjdGlvbk9wdGlvbnMoXG5cdHByb2plY3Rvck9wdGlvbnM6IFBhcnRpYWw8UHJvamVjdGlvbk9wdGlvbnM+LFxuXHRwcm9qZWN0b3JJbnN0YW5jZTogRGVmYXVsdFdpZGdldEJhc2VJbnRlcmZhY2Vcbik6IFByb2plY3Rpb25PcHRpb25zIHtcblx0Y29uc3QgZGVmYXVsdHM6IFBhcnRpYWw8UHJvamVjdGlvbk9wdGlvbnM+ID0ge1xuXHRcdG5hbWVzcGFjZTogdW5kZWZpbmVkLFxuXHRcdHN0eWxlQXBwbHllcjogZnVuY3Rpb24oZG9tTm9kZTogSFRNTEVsZW1lbnQsIHN0eWxlTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG5cdFx0XHQoZG9tTm9kZS5zdHlsZSBhcyBhbnkpW3N0eWxlTmFtZV0gPSB2YWx1ZTtcblx0XHR9LFxuXHRcdHRyYW5zaXRpb25zOiB7XG5cdFx0XHRlbnRlcjogbWlzc2luZ1RyYW5zaXRpb24sXG5cdFx0XHRleGl0OiBtaXNzaW5nVHJhbnNpdGlvblxuXHRcdH0sXG5cdFx0ZGVwdGg6IDAsXG5cdFx0bWVyZ2U6IGZhbHNlLFxuXHRcdHN5bmM6IGZhbHNlLFxuXHRcdHByb2plY3Rvckluc3RhbmNlXG5cdH07XG5cdHJldHVybiB7IC4uLmRlZmF1bHRzLCAuLi5wcm9qZWN0b3JPcHRpb25zIH0gYXMgUHJvamVjdGlvbk9wdGlvbnM7XG59XG5cbmZ1bmN0aW9uIGNoZWNrU3R5bGVWYWx1ZShzdHlsZVZhbHVlOiBPYmplY3QpIHtcblx0aWYgKHR5cGVvZiBzdHlsZVZhbHVlICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBFcnJvcignU3R5bGUgdmFsdWVzIG11c3QgYmUgc3RyaW5ncycpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUV2ZW50KFxuXHRkb21Ob2RlOiBOb2RlLFxuXHRldmVudE5hbWU6IHN0cmluZyxcblx0Y3VycmVudFZhbHVlOiBGdW5jdGlvbixcblx0cHJvamVjdGlvbk9wdGlvbnM6IFByb2plY3Rpb25PcHRpb25zLFxuXHRiaW5kOiBhbnksXG5cdHByZXZpb3VzVmFsdWU/OiBGdW5jdGlvblxuKSB7XG5cdGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKSE7XG5cdGNvbnN0IGV2ZW50TWFwID0gcHJvamVjdG9yU3RhdGUubm9kZU1hcC5nZXQoZG9tTm9kZSkgfHwgbmV3IFdlYWtNYXAoKTtcblxuXHRpZiAocHJldmlvdXNWYWx1ZSkge1xuXHRcdGNvbnN0IHByZXZpb3VzRXZlbnQgPSBldmVudE1hcC5nZXQocHJldmlvdXNWYWx1ZSk7XG5cdFx0ZG9tTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgcHJldmlvdXNFdmVudCk7XG5cdH1cblxuXHRsZXQgY2FsbGJhY2sgPSBjdXJyZW50VmFsdWUuYmluZChiaW5kKTtcblxuXHRpZiAoZXZlbnROYW1lID09PSAnaW5wdXQnKSB7XG5cdFx0Y2FsbGJhY2sgPSBmdW5jdGlvbih0aGlzOiBhbnksIGV2dDogRXZlbnQpIHtcblx0XHRcdGN1cnJlbnRWYWx1ZS5jYWxsKHRoaXMsIGV2dCk7XG5cdFx0XHQoZXZ0LnRhcmdldCBhcyBhbnkpWydvbmlucHV0LXZhbHVlJ10gPSAoZXZ0LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcblx0XHR9LmJpbmQoYmluZCk7XG5cdH1cblxuXHRkb21Ob2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBjYWxsYmFjayk7XG5cdGV2ZW50TWFwLnNldChjdXJyZW50VmFsdWUsIGNhbGxiYWNrKTtcblx0cHJvamVjdG9yU3RhdGUubm9kZU1hcC5zZXQoZG9tTm9kZSwgZXZlbnRNYXApO1xufVxuXG5mdW5jdGlvbiBhZGRDbGFzc2VzKGRvbU5vZGU6IEVsZW1lbnQsIGNsYXNzZXM6IFN1cHBvcnRlZENsYXNzTmFtZSkge1xuXHRpZiAoY2xhc3Nlcykge1xuXHRcdGNvbnN0IGNsYXNzTmFtZXMgPSBjbGFzc2VzLnNwbGl0KCcgJyk7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBjbGFzc05hbWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRkb21Ob2RlLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lc1tpXSk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUNsYXNzZXMoZG9tTm9kZTogRWxlbWVudCwgY2xhc3NlczogU3VwcG9ydGVkQ2xhc3NOYW1lKSB7XG5cdGlmIChjbGFzc2VzKSB7XG5cdFx0Y29uc3QgY2xhc3NOYW1lcyA9IGNsYXNzZXMuc3BsaXQoJyAnKTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGNsYXNzTmFtZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGRvbU5vZGUuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWVzW2ldKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gYnVpbGRQcmV2aW91c1Byb3BlcnRpZXMoZG9tTm9kZTogYW55LCBwcmV2aW91czogSW50ZXJuYWxWTm9kZSwgY3VycmVudDogSW50ZXJuYWxWTm9kZSkge1xuXHRjb25zdCB7IGRpZmZUeXBlLCBwcm9wZXJ0aWVzLCBhdHRyaWJ1dGVzIH0gPSBjdXJyZW50O1xuXHRpZiAoIWRpZmZUeXBlIHx8IGRpZmZUeXBlID09PSAndmRvbScpIHtcblx0XHRyZXR1cm4geyBwcm9wZXJ0aWVzOiBwcmV2aW91cy5wcm9wZXJ0aWVzLCBhdHRyaWJ1dGVzOiBwcmV2aW91cy5hdHRyaWJ1dGVzLCBldmVudHM6IHByZXZpb3VzLmV2ZW50cyB9O1xuXHR9IGVsc2UgaWYgKGRpZmZUeXBlID09PSAnbm9uZScpIHtcblx0XHRyZXR1cm4geyBwcm9wZXJ0aWVzOiB7fSwgYXR0cmlidXRlczogcHJldmlvdXMuYXR0cmlidXRlcyA/IHt9IDogdW5kZWZpbmVkLCBldmVudHM6IHByZXZpb3VzLmV2ZW50cyB9O1xuXHR9XG5cdGxldCBuZXdQcm9wZXJ0aWVzOiBhbnkgPSB7XG5cdFx0cHJvcGVydGllczoge31cblx0fTtcblx0aWYgKGF0dHJpYnV0ZXMpIHtcblx0XHRuZXdQcm9wZXJ0aWVzLmF0dHJpYnV0ZXMgPSB7fTtcblx0XHRuZXdQcm9wZXJ0aWVzLmV2ZW50cyA9IHByZXZpb3VzLmV2ZW50cztcblx0XHRPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5mb3JFYWNoKChwcm9wTmFtZSkgPT4ge1xuXHRcdFx0bmV3UHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BOYW1lXSA9IGRvbU5vZGVbcHJvcE5hbWVdO1xuXHRcdH0pO1xuXHRcdE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goKGF0dHJOYW1lKSA9PiB7XG5cdFx0XHRuZXdQcm9wZXJ0aWVzLmF0dHJpYnV0ZXNbYXR0ck5hbWVdID0gZG9tTm9kZS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuXHRcdH0pO1xuXHRcdHJldHVybiBuZXdQcm9wZXJ0aWVzO1xuXHR9XG5cdG5ld1Byb3BlcnRpZXMucHJvcGVydGllcyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpLnJlZHVjZShcblx0XHQocHJvcHMsIHByb3BlcnR5KSA9PiB7XG5cdFx0XHRwcm9wc1twcm9wZXJ0eV0gPSBkb21Ob2RlLmdldEF0dHJpYnV0ZShwcm9wZXJ0eSkgfHwgZG9tTm9kZVtwcm9wZXJ0eV07XG5cdFx0XHRyZXR1cm4gcHJvcHM7XG5cdFx0fSxcblx0XHR7fSBhcyBhbnlcblx0KTtcblx0cmV0dXJuIG5ld1Byb3BlcnRpZXM7XG59XG5cbmZ1bmN0aW9uIG5vZGVPcGVyYXRpb24oXG5cdHByb3BOYW1lOiBzdHJpbmcsXG5cdHByb3BWYWx1ZTogYW55LFxuXHRwcmV2aW91c1ZhbHVlOiBhbnksXG5cdGRvbU5vZGU6IEVsZW1lbnQsXG5cdHByb2plY3Rpb25PcHRpb25zOiBQcm9qZWN0aW9uT3B0aW9uc1xuKTogdm9pZCB7XG5cdGxldCByZXN1bHQ7XG5cdGlmICh0eXBlb2YgcHJvcFZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0cmVzdWx0ID0gcHJvcFZhbHVlKCk7XG5cdH0gZWxzZSB7XG5cdFx0cmVzdWx0ID0gcHJvcFZhbHVlICYmICFwcmV2aW91c1ZhbHVlO1xuXHR9XG5cdGlmIChyZXN1bHQgPT09IHRydWUpIHtcblx0XHRjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSkhO1xuXHRcdHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xuXHRcdFx0KGRvbU5vZGUgYXMgYW55KVtwcm9wTmFtZV0oKTtcblx0XHR9KTtcblx0fVxufVxuXG5mdW5jdGlvbiByZW1vdmVPcnBoYW5lZEV2ZW50cyhcblx0ZG9tTm9kZTogRWxlbWVudCxcblx0cHJldmlvdXNQcm9wZXJ0aWVzOiBWTm9kZVByb3BlcnRpZXMsXG5cdHByb3BlcnRpZXM6IFZOb2RlUHJvcGVydGllcyxcblx0cHJvamVjdGlvbk9wdGlvbnM6IFByb2plY3Rpb25PcHRpb25zLFxuXHRvbmx5RXZlbnRzOiBib29sZWFuID0gZmFsc2Vcbikge1xuXHRjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSkhO1xuXHRjb25zdCBldmVudE1hcCA9IHByb2plY3RvclN0YXRlLm5vZGVNYXAuZ2V0KGRvbU5vZGUpO1xuXHRpZiAoZXZlbnRNYXApIHtcblx0XHRPYmplY3Qua2V5cyhwcmV2aW91c1Byb3BlcnRpZXMpLmZvckVhY2goKHByb3BOYW1lKSA9PiB7XG5cdFx0XHRjb25zdCBpc0V2ZW50ID0gcHJvcE5hbWUuc3Vic3RyKDAsIDIpID09PSAnb24nIHx8IG9ubHlFdmVudHM7XG5cdFx0XHRjb25zdCBldmVudE5hbWUgPSBvbmx5RXZlbnRzID8gcHJvcE5hbWUgOiBwcm9wTmFtZS5zdWJzdHIoMik7XG5cdFx0XHRpZiAoaXNFdmVudCAmJiAhcHJvcGVydGllc1twcm9wTmFtZV0pIHtcblx0XHRcdFx0Y29uc3QgZXZlbnRDYWxsYmFjayA9IGV2ZW50TWFwLmdldChwcmV2aW91c1Byb3BlcnRpZXNbcHJvcE5hbWVdKTtcblx0XHRcdFx0aWYgKGV2ZW50Q2FsbGJhY2spIHtcblx0XHRcdFx0XHRkb21Ob2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBldmVudENhbGxiYWNrKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUF0dHJpYnV0ZShkb21Ob2RlOiBFbGVtZW50LCBhdHRyTmFtZTogc3RyaW5nLCBhdHRyVmFsdWU6IHN0cmluZywgcHJvamVjdGlvbk9wdGlvbnM6IFByb2plY3Rpb25PcHRpb25zKSB7XG5cdGlmIChwcm9qZWN0aW9uT3B0aW9ucy5uYW1lc3BhY2UgPT09IE5BTUVTUEFDRV9TVkcgJiYgYXR0ck5hbWUgPT09ICdocmVmJykge1xuXHRcdGRvbU5vZGUuc2V0QXR0cmlidXRlTlMoTkFNRVNQQUNFX1hMSU5LLCBhdHRyTmFtZSwgYXR0clZhbHVlKTtcblx0fSBlbHNlIGlmICgoYXR0ck5hbWUgPT09ICdyb2xlJyAmJiBhdHRyVmFsdWUgPT09ICcnKSB8fCBhdHRyVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdGRvbU5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTtcblx0fSBlbHNlIHtcblx0XHRkb21Ob2RlLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0clZhbHVlKTtcblx0fVxufVxuXG5mdW5jdGlvbiB1cGRhdGVBdHRyaWJ1dGVzKFxuXHRkb21Ob2RlOiBFbGVtZW50LFxuXHRwcmV2aW91c0F0dHJpYnV0ZXM6IHsgW2luZGV4OiBzdHJpbmddOiBzdHJpbmcgfSxcblx0YXR0cmlidXRlczogeyBbaW5kZXg6IHN0cmluZ106IHN0cmluZyB9LFxuXHRwcm9qZWN0aW9uT3B0aW9uczogUHJvamVjdGlvbk9wdGlvbnNcbikge1xuXHRjb25zdCBhdHRyTmFtZXMgPSBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKTtcblx0Y29uc3QgYXR0ckNvdW50ID0gYXR0ck5hbWVzLmxlbmd0aDtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyQ291bnQ7IGkrKykge1xuXHRcdGNvbnN0IGF0dHJOYW1lID0gYXR0ck5hbWVzW2ldO1xuXHRcdGNvbnN0IGF0dHJWYWx1ZSA9IGF0dHJpYnV0ZXNbYXR0ck5hbWVdO1xuXHRcdGNvbnN0IHByZXZpb3VzQXR0clZhbHVlID0gcHJldmlvdXNBdHRyaWJ1dGVzW2F0dHJOYW1lXTtcblx0XHRpZiAoYXR0clZhbHVlICE9PSBwcmV2aW91c0F0dHJWYWx1ZSkge1xuXHRcdFx0dXBkYXRlQXR0cmlidXRlKGRvbU5vZGUsIGF0dHJOYW1lLCBhdHRyVmFsdWUsIHByb2plY3Rpb25PcHRpb25zKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlUHJvcGVydGllcyhcblx0ZG9tTm9kZTogRWxlbWVudCxcblx0cHJldmlvdXNQcm9wZXJ0aWVzOiBWTm9kZVByb3BlcnRpZXMsXG5cdHByb3BlcnRpZXM6IFZOb2RlUHJvcGVydGllcyxcblx0cHJvamVjdGlvbk9wdGlvbnM6IFByb2plY3Rpb25PcHRpb25zLFxuXHRpbmNsdWRlc0V2ZW50c0FuZEF0dHJpYnV0ZXMgPSB0cnVlXG4pIHtcblx0bGV0IHByb3BlcnRpZXNVcGRhdGVkID0gZmFsc2U7XG5cdGNvbnN0IHByb3BOYW1lcyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpO1xuXHRjb25zdCBwcm9wQ291bnQgPSBwcm9wTmFtZXMubGVuZ3RoO1xuXHRpZiAocHJvcE5hbWVzLmluZGV4T2YoJ2NsYXNzZXMnKSA9PT0gLTEgJiYgcHJldmlvdXNQcm9wZXJ0aWVzLmNsYXNzZXMpIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShwcmV2aW91c1Byb3BlcnRpZXMuY2xhc3NlcykpIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcHJldmlvdXNQcm9wZXJ0aWVzLmNsYXNzZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0cmVtb3ZlQ2xhc3Nlcyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMuY2xhc3Nlc1tpXSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlbW92ZUNsYXNzZXMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLmNsYXNzZXMpO1xuXHRcdH1cblx0fVxuXG5cdGluY2x1ZGVzRXZlbnRzQW5kQXR0cmlidXRlcyAmJiByZW1vdmVPcnBoYW5lZEV2ZW50cyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMsIHByb3BlcnRpZXMsIHByb2plY3Rpb25PcHRpb25zKTtcblxuXHRmb3IgKGxldCBpID0gMDsgaSA8IHByb3BDb3VudDsgaSsrKSB7XG5cdFx0Y29uc3QgcHJvcE5hbWUgPSBwcm9wTmFtZXNbaV07XG5cdFx0bGV0IHByb3BWYWx1ZSA9IHByb3BlcnRpZXNbcHJvcE5hbWVdO1xuXHRcdGNvbnN0IHByZXZpb3VzVmFsdWUgPSBwcmV2aW91c1Byb3BlcnRpZXMhW3Byb3BOYW1lXTtcblx0XHRpZiAocHJvcE5hbWUgPT09ICdjbGFzc2VzJykge1xuXHRcdFx0Y29uc3QgcHJldmlvdXNDbGFzc2VzID0gQXJyYXkuaXNBcnJheShwcmV2aW91c1ZhbHVlKSA/IHByZXZpb3VzVmFsdWUgOiBbcHJldmlvdXNWYWx1ZV07XG5cdFx0XHRjb25zdCBjdXJyZW50Q2xhc3NlcyA9IEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSA/IHByb3BWYWx1ZSA6IFtwcm9wVmFsdWVdO1xuXHRcdFx0aWYgKHByZXZpb3VzQ2xhc3NlcyAmJiBwcmV2aW91c0NsYXNzZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRpZiAoIXByb3BWYWx1ZSB8fCBwcm9wVmFsdWUubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2aW91c0NsYXNzZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdHJlbW92ZUNsYXNzZXMoZG9tTm9kZSwgcHJldmlvdXNDbGFzc2VzW2ldKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgbmV3Q2xhc3NlczogKG51bGwgfCB1bmRlZmluZWQgfCBzdHJpbmcpW10gPSBbLi4uY3VycmVudENsYXNzZXNdO1xuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcHJldmlvdXNDbGFzc2VzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBwcmV2aW91c0NsYXNzTmFtZSA9IHByZXZpb3VzQ2xhc3Nlc1tpXTtcblx0XHRcdFx0XHRcdGlmIChwcmV2aW91c0NsYXNzTmFtZSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjbGFzc0luZGV4ID0gbmV3Q2xhc3Nlcy5pbmRleE9mKHByZXZpb3VzQ2xhc3NOYW1lKTtcblx0XHRcdFx0XHRcdFx0aWYgKGNsYXNzSW5kZXggPT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVtb3ZlQ2xhc3Nlcyhkb21Ob2RlLCBwcmV2aW91c0NsYXNzTmFtZSk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0bmV3Q2xhc3Nlcy5zcGxpY2UoY2xhc3NJbmRleCwgMSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBuZXdDbGFzc2VzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRhZGRDbGFzc2VzKGRvbU5vZGUsIG5ld0NsYXNzZXNbaV0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50Q2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdGFkZENsYXNzZXMoZG9tTm9kZSwgY3VycmVudENsYXNzZXNbaV0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChub2RlT3BlcmF0aW9ucy5pbmRleE9mKHByb3BOYW1lKSAhPT0gLTEpIHtcblx0XHRcdG5vZGVPcGVyYXRpb24ocHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJldmlvdXNWYWx1ZSwgZG9tTm9kZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xuXHRcdH0gZWxzZSBpZiAocHJvcE5hbWUgPT09ICdzdHlsZXMnKSB7XG5cdFx0XHRjb25zdCBzdHlsZU5hbWVzID0gT2JqZWN0LmtleXMocHJvcFZhbHVlKTtcblx0XHRcdGNvbnN0IHN0eWxlQ291bnQgPSBzdHlsZU5hbWVzLmxlbmd0aDtcblx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgc3R5bGVDb3VudDsgaisrKSB7XG5cdFx0XHRcdGNvbnN0IHN0eWxlTmFtZSA9IHN0eWxlTmFtZXNbal07XG5cdFx0XHRcdGNvbnN0IG5ld1N0eWxlVmFsdWUgPSBwcm9wVmFsdWVbc3R5bGVOYW1lXTtcblx0XHRcdFx0Y29uc3Qgb2xkU3R5bGVWYWx1ZSA9IHByZXZpb3VzVmFsdWUgJiYgcHJldmlvdXNWYWx1ZVtzdHlsZU5hbWVdO1xuXHRcdFx0XHRpZiAobmV3U3R5bGVWYWx1ZSA9PT0gb2xkU3R5bGVWYWx1ZSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHByb3BlcnRpZXNVcGRhdGVkID0gdHJ1ZTtcblx0XHRcdFx0aWYgKG5ld1N0eWxlVmFsdWUpIHtcblx0XHRcdFx0XHRjaGVja1N0eWxlVmFsdWUobmV3U3R5bGVWYWx1ZSk7XG5cdFx0XHRcdFx0cHJvamVjdGlvbk9wdGlvbnMuc3R5bGVBcHBseWVyIShkb21Ob2RlIGFzIEhUTUxFbGVtZW50LCBzdHlsZU5hbWUsIG5ld1N0eWxlVmFsdWUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHByb2plY3Rpb25PcHRpb25zLnN0eWxlQXBwbHllciEoZG9tTm9kZSBhcyBIVE1MRWxlbWVudCwgc3R5bGVOYW1lLCAnJyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKCFwcm9wVmFsdWUgJiYgdHlwZW9mIHByZXZpb3VzVmFsdWUgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdHByb3BWYWx1ZSA9ICcnO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHByb3BOYW1lID09PSAndmFsdWUnKSB7XG5cdFx0XHRcdGNvbnN0IGRvbVZhbHVlID0gKGRvbU5vZGUgYXMgYW55KVtwcm9wTmFtZV07XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRkb21WYWx1ZSAhPT0gcHJvcFZhbHVlICYmXG5cdFx0XHRcdFx0KChkb21Ob2RlIGFzIGFueSlbJ29uaW5wdXQtdmFsdWUnXVxuXHRcdFx0XHRcdFx0PyBkb21WYWx1ZSA9PT0gKGRvbU5vZGUgYXMgYW55KVsnb25pbnB1dC12YWx1ZSddXG5cdFx0XHRcdFx0XHQ6IHByb3BWYWx1ZSAhPT0gcHJldmlvdXNWYWx1ZSlcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0KGRvbU5vZGUgYXMgYW55KVtwcm9wTmFtZV0gPSBwcm9wVmFsdWU7XG5cdFx0XHRcdFx0KGRvbU5vZGUgYXMgYW55KVsnb25pbnB1dC12YWx1ZSddID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChwcm9wVmFsdWUgIT09IHByZXZpb3VzVmFsdWUpIHtcblx0XHRcdFx0XHRwcm9wZXJ0aWVzVXBkYXRlZCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAocHJvcE5hbWUgIT09ICdrZXknICYmIHByb3BWYWx1ZSAhPT0gcHJldmlvdXNWYWx1ZSkge1xuXHRcdFx0XHRjb25zdCB0eXBlID0gdHlwZW9mIHByb3BWYWx1ZTtcblx0XHRcdFx0aWYgKHR5cGUgPT09ICdmdW5jdGlvbicgJiYgcHJvcE5hbWUubGFzdEluZGV4T2YoJ29uJywgMCkgPT09IDAgJiYgaW5jbHVkZXNFdmVudHNBbmRBdHRyaWJ1dGVzKSB7XG5cdFx0XHRcdFx0dXBkYXRlRXZlbnQoXG5cdFx0XHRcdFx0XHRkb21Ob2RlLFxuXHRcdFx0XHRcdFx0cHJvcE5hbWUuc3Vic3RyKDIpLFxuXHRcdFx0XHRcdFx0cHJvcFZhbHVlLFxuXHRcdFx0XHRcdFx0cHJvamVjdGlvbk9wdGlvbnMsXG5cdFx0XHRcdFx0XHRwcm9wZXJ0aWVzLmJpbmQsXG5cdFx0XHRcdFx0XHRwcmV2aW91c1ZhbHVlXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiBwcm9wTmFtZSAhPT0gJ2lubmVySFRNTCcgJiYgaW5jbHVkZXNFdmVudHNBbmRBdHRyaWJ1dGVzKSB7XG5cdFx0XHRcdFx0dXBkYXRlQXR0cmlidXRlKGRvbU5vZGUsIHByb3BOYW1lLCBwcm9wVmFsdWUsIHByb2plY3Rpb25PcHRpb25zKTtcblx0XHRcdFx0fSBlbHNlIGlmIChwcm9wTmFtZSA9PT0gJ3Njcm9sbExlZnQnIHx8IHByb3BOYW1lID09PSAnc2Nyb2xsVG9wJykge1xuXHRcdFx0XHRcdGlmICgoZG9tTm9kZSBhcyBhbnkpW3Byb3BOYW1lXSAhPT0gcHJvcFZhbHVlKSB7XG5cdFx0XHRcdFx0XHQoZG9tTm9kZSBhcyBhbnkpW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0KGRvbU5vZGUgYXMgYW55KVtwcm9wTmFtZV0gPSBwcm9wVmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0cHJvcGVydGllc1VwZGF0ZWQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gcHJvcGVydGllc1VwZGF0ZWQ7XG59XG5cbmZ1bmN0aW9uIGZpbmRJbmRleE9mQ2hpbGQoY2hpbGRyZW46IEludGVybmFsRE5vZGVbXSwgc2FtZUFzOiBJbnRlcm5hbEROb2RlLCBzdGFydDogbnVtYmVyKSB7XG5cdGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKHNhbWUoY2hpbGRyZW5baV0sIHNhbWVBcykpIHtcblx0XHRcdHJldHVybiBpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gLTE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1BhcmVudFZOb2RlKGRvbU5vZGU6IEVsZW1lbnQpOiBJbnRlcm5hbFZOb2RlIHtcblx0cmV0dXJuIHtcblx0XHR0YWc6ICcnLFxuXHRcdHByb3BlcnRpZXM6IHt9LFxuXHRcdGNoaWxkcmVuOiB1bmRlZmluZWQsXG5cdFx0ZG9tTm9kZSxcblx0XHR0eXBlOiBWTk9ERVxuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9UZXh0Vk5vZGUoZGF0YTogYW55KTogSW50ZXJuYWxWTm9kZSB7XG5cdHJldHVybiB7XG5cdFx0dGFnOiAnJyxcblx0XHRwcm9wZXJ0aWVzOiB7fSxcblx0XHRjaGlsZHJlbjogdW5kZWZpbmVkLFxuXHRcdHRleHQ6IGAke2RhdGF9YCxcblx0XHRkb21Ob2RlOiB1bmRlZmluZWQsXG5cdFx0dHlwZTogVk5PREVcblx0fTtcbn1cblxuZnVuY3Rpb24gdG9JbnRlcm5hbFdOb2RlKGluc3RhbmNlOiBEZWZhdWx0V2lkZ2V0QmFzZUludGVyZmFjZSwgaW5zdGFuY2VEYXRhOiBXaWRnZXREYXRhKTogSW50ZXJuYWxXTm9kZSB7XG5cdHJldHVybiB7XG5cdFx0aW5zdGFuY2UsXG5cdFx0cmVuZGVyZWQ6IFtdLFxuXHRcdGNvcmVQcm9wZXJ0aWVzOiBpbnN0YW5jZURhdGEuY29yZVByb3BlcnRpZXMsXG5cdFx0Y2hpbGRyZW46IGluc3RhbmNlLmNoaWxkcmVuIGFzIGFueSxcblx0XHR3aWRnZXRDb25zdHJ1Y3RvcjogaW5zdGFuY2UuY29uc3RydWN0b3IgYXMgYW55LFxuXHRcdHByb3BlcnRpZXM6IGluc3RhbmNlRGF0YS5pbnB1dFByb3BlcnRpZXMsXG5cdFx0dHlwZTogV05PREVcblx0fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlckFuZERlY29yYXRlQ2hpbGRyZW4oXG5cdGNoaWxkcmVuOiB1bmRlZmluZWQgfCBETm9kZSB8IEROb2RlW10sXG5cdGluc3RhbmNlOiBEZWZhdWx0V2lkZ2V0QmFzZUludGVyZmFjZVxuKTogSW50ZXJuYWxETm9kZVtdIHtcblx0aWYgKGNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gZW1wdHlBcnJheTtcblx0fVxuXHRjaGlsZHJlbiA9IEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pID8gY2hpbGRyZW4gOiBbY2hpbGRyZW5dO1xuXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyApIHtcblx0XHRjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldIGFzIEludGVybmFsRE5vZGU7XG5cdFx0aWYgKGNoaWxkID09PSB1bmRlZmluZWQgfHwgY2hpbGQgPT09IG51bGwpIHtcblx0XHRcdGNoaWxkcmVuLnNwbGljZShpLCAxKTtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJykge1xuXHRcdFx0Y2hpbGRyZW5baV0gPSB0b1RleHRWTm9kZShjaGlsZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChpc1ZOb2RlKGNoaWxkKSkge1xuXHRcdFx0XHRpZiAoY2hpbGQucHJvcGVydGllcy5iaW5kID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHQoY2hpbGQucHJvcGVydGllcyBhcyBhbnkpLmJpbmQgPSBpbnN0YW5jZTtcblx0XHRcdFx0XHRpZiAoY2hpbGQuY2hpbGRyZW4gJiYgY2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0ZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihjaGlsZC5jaGlsZHJlbiwgaW5zdGFuY2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKCFjaGlsZC5jb3JlUHJvcGVydGllcykge1xuXHRcdFx0XHRcdGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldChpbnN0YW5jZSkhO1xuXHRcdFx0XHRcdGNoaWxkLmNvcmVQcm9wZXJ0aWVzID0ge1xuXHRcdFx0XHRcdFx0YmluZDogaW5zdGFuY2UsXG5cdFx0XHRcdFx0XHRiYXNlUmVnaXN0cnk6IGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcy5iYXNlUmVnaXN0cnlcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChjaGlsZC5jaGlsZHJlbiAmJiBjaGlsZC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0ZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihjaGlsZC5jaGlsZHJlbiwgaW5zdGFuY2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGkrKztcblx0fVxuXHRyZXR1cm4gY2hpbGRyZW4gYXMgSW50ZXJuYWxETm9kZVtdO1xufVxuXG5mdW5jdGlvbiBub2RlQWRkZWQoZG5vZGU6IEludGVybmFsRE5vZGUsIHRyYW5zaXRpb25zOiBUcmFuc2l0aW9uU3RyYXRlZ3kpIHtcblx0aWYgKGlzVk5vZGUoZG5vZGUpICYmIGRub2RlLnByb3BlcnRpZXMpIHtcblx0XHRjb25zdCBlbnRlckFuaW1hdGlvbiA9IGRub2RlLnByb3BlcnRpZXMuZW50ZXJBbmltYXRpb247XG5cdFx0aWYgKGVudGVyQW5pbWF0aW9uKSB7XG5cdFx0XHRpZiAodHlwZW9mIGVudGVyQW5pbWF0aW9uID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdGVudGVyQW5pbWF0aW9uKGRub2RlLmRvbU5vZGUgYXMgRWxlbWVudCwgZG5vZGUucHJvcGVydGllcyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0cmFuc2l0aW9ucy5lbnRlcihkbm9kZS5kb21Ob2RlIGFzIEVsZW1lbnQsIGRub2RlLnByb3BlcnRpZXMsIGVudGVyQW5pbWF0aW9uIGFzIHN0cmluZyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIG5vZGVUb1JlbW92ZShkbm9kZTogSW50ZXJuYWxETm9kZSwgdHJhbnNpdGlvbnM6IFRyYW5zaXRpb25TdHJhdGVneSwgcHJvamVjdGlvbk9wdGlvbnM6IFByb2plY3Rpb25PcHRpb25zKSB7XG5cdGlmIChpc1dOb2RlKGRub2RlKSkge1xuXHRcdGNvbnN0IGl0ZW0gPSBpbnN0YW5jZU1hcC5nZXQoZG5vZGUuaW5zdGFuY2UpO1xuXHRcdGNvbnN0IHJlbmRlcmVkID0gKGl0ZW0gPyBpdGVtLmRub2RlLnJlbmRlcmVkIDogZG5vZGUucmVuZGVyZWQpIHx8IGVtcHR5QXJyYXk7XG5cdFx0aWYgKGRub2RlLmluc3RhbmNlKSB7XG5cdFx0XHRjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQoZG5vZGUuaW5zdGFuY2UpITtcblx0XHRcdGluc3RhbmNlRGF0YS5vbkRldGFjaCgpO1xuXHRcdFx0aW5zdGFuY2VNYXAuZGVsZXRlKGRub2RlLmluc3RhbmNlKTtcblx0XHR9XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCByZW5kZXJlZC5sZW5ndGg7IGkrKykge1xuXHRcdFx0bm9kZVRvUmVtb3ZlKHJlbmRlcmVkW2ldLCB0cmFuc2l0aW9ucywgcHJvamVjdGlvbk9wdGlvbnMpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRjb25zdCBkb21Ob2RlID0gZG5vZGUuZG9tTm9kZTtcblx0XHRjb25zdCBwcm9wZXJ0aWVzID0gZG5vZGUucHJvcGVydGllcztcblx0XHRpZiAoZG5vZGUuY2hpbGRyZW4gJiYgZG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBkbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRub2RlVG9SZW1vdmUoZG5vZGUuY2hpbGRyZW5baV0sIHRyYW5zaXRpb25zLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IGV4aXRBbmltYXRpb24gPSBwcm9wZXJ0aWVzLmV4aXRBbmltYXRpb247XG5cdFx0aWYgKHByb3BlcnRpZXMgJiYgZXhpdEFuaW1hdGlvbikge1xuXHRcdFx0KGRvbU5vZGUgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG5cdFx0XHRjb25zdCByZW1vdmVEb21Ob2RlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGRvbU5vZGUgJiYgZG9tTm9kZS5wYXJlbnROb2RlICYmIGRvbU5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkb21Ob2RlKTtcblx0XHRcdFx0ZG5vZGUuZG9tTm9kZSA9IHVuZGVmaW5lZDtcblx0XHRcdH07XG5cdFx0XHRpZiAodHlwZW9mIGV4aXRBbmltYXRpb24gPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0ZXhpdEFuaW1hdGlvbihkb21Ob2RlIGFzIEVsZW1lbnQsIHJlbW92ZURvbU5vZGUsIHByb3BlcnRpZXMpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0cmFuc2l0aW9ucy5leGl0KGRub2RlLmRvbU5vZGUgYXMgRWxlbWVudCwgcHJvcGVydGllcywgZXhpdEFuaW1hdGlvbiBhcyBzdHJpbmcsIHJlbW92ZURvbU5vZGUpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGRvbU5vZGUgJiYgZG9tTm9kZS5wYXJlbnROb2RlICYmIGRvbU5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkb21Ob2RlKTtcblx0XHRkbm9kZS5kb21Ob2RlID0gdW5kZWZpbmVkO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNoZWNrRGlzdGluZ3Vpc2hhYmxlKFxuXHRjaGlsZE5vZGVzOiBJbnRlcm5hbEROb2RlW10sXG5cdGluZGV4VG9DaGVjazogbnVtYmVyLFxuXHRwYXJlbnRJbnN0YW5jZTogRGVmYXVsdFdpZGdldEJhc2VJbnRlcmZhY2Vcbikge1xuXHRjb25zdCBjaGlsZE5vZGUgPSBjaGlsZE5vZGVzW2luZGV4VG9DaGVja107XG5cdGlmIChpc1ZOb2RlKGNoaWxkTm9kZSkgJiYgIWNoaWxkTm9kZS50YWcpIHtcblx0XHRyZXR1cm47IC8vIFRleHQgbm9kZXMgbmVlZCBub3QgYmUgZGlzdGluZ3Vpc2hhYmxlXG5cdH1cblx0Y29uc3QgeyBrZXkgfSA9IGNoaWxkTm9kZS5wcm9wZXJ0aWVzO1xuXG5cdGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09IG51bGwpIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmIChpICE9PSBpbmRleFRvQ2hlY2spIHtcblx0XHRcdFx0Y29uc3Qgbm9kZSA9IGNoaWxkTm9kZXNbaV07XG5cdFx0XHRcdGlmIChzYW1lKG5vZGUsIGNoaWxkTm9kZSkpIHtcblx0XHRcdFx0XHRsZXQgbm9kZUlkZW50aWZpZXI6IHN0cmluZztcblx0XHRcdFx0XHRjb25zdCBwYXJlbnROYW1lID0gKHBhcmVudEluc3RhbmNlIGFzIGFueSkuY29uc3RydWN0b3IubmFtZSB8fCAndW5rbm93bic7XG5cdFx0XHRcdFx0aWYgKGlzV05vZGUoY2hpbGROb2RlKSkge1xuXHRcdFx0XHRcdFx0bm9kZUlkZW50aWZpZXIgPSAoY2hpbGROb2RlLndpZGdldENvbnN0cnVjdG9yIGFzIGFueSkubmFtZSB8fCAndW5rbm93bic7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG5vZGVJZGVudGlmaWVyID0gY2hpbGROb2RlLnRhZztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oXG5cdFx0XHRcdFx0XHRgQSB3aWRnZXQgKCR7cGFyZW50TmFtZX0pIGhhcyBoYWQgYSBjaGlsZCBhZGRkZWQgb3IgcmVtb3ZlZCwgYnV0IHRoZXkgd2VyZSBub3QgYWJsZSB0byB1bmlxdWVseSBpZGVudGlmaWVkLiBJdCBpcyByZWNvbW1lbmRlZCB0byBwcm92aWRlIGEgdW5pcXVlICdrZXknIHByb3BlcnR5IHdoZW4gdXNpbmcgdGhlIHNhbWUgd2lkZ2V0IG9yIGVsZW1lbnQgKCR7bm9kZUlkZW50aWZpZXJ9KSBtdWx0aXBsZSB0aW1lcyBhcyBzaWJsaW5nc2Bcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNoaWxkcmVuKFxuXHRwYXJlbnRWTm9kZTogSW50ZXJuYWxWTm9kZSxcblx0c2libGluZ3M6IEludGVybmFsRE5vZGVbXSxcblx0b2xkQ2hpbGRyZW46IEludGVybmFsRE5vZGVbXSxcblx0bmV3Q2hpbGRyZW46IEludGVybmFsRE5vZGVbXSxcblx0cGFyZW50SW5zdGFuY2U6IERlZmF1bHRXaWRnZXRCYXNlSW50ZXJmYWNlLFxuXHRwcm9qZWN0aW9uT3B0aW9uczogUHJvamVjdGlvbk9wdGlvbnNcbikge1xuXHRvbGRDaGlsZHJlbiA9IG9sZENoaWxkcmVuIHx8IGVtcHR5QXJyYXk7XG5cdG5ld0NoaWxkcmVuID0gbmV3Q2hpbGRyZW47XG5cdGNvbnN0IG9sZENoaWxkcmVuTGVuZ3RoID0gb2xkQ2hpbGRyZW4ubGVuZ3RoO1xuXHRjb25zdCBuZXdDaGlsZHJlbkxlbmd0aCA9IG5ld0NoaWxkcmVuLmxlbmd0aDtcblx0Y29uc3QgdHJhbnNpdGlvbnMgPSBwcm9qZWN0aW9uT3B0aW9ucy50cmFuc2l0aW9ucyE7XG5cdGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKSE7XG5cdHByb2plY3Rpb25PcHRpb25zID0geyAuLi5wcm9qZWN0aW9uT3B0aW9ucywgZGVwdGg6IHByb2plY3Rpb25PcHRpb25zLmRlcHRoICsgMSB9O1xuXHRsZXQgb2xkSW5kZXggPSAwO1xuXHRsZXQgbmV3SW5kZXggPSAwO1xuXHRsZXQgaTogbnVtYmVyO1xuXHRsZXQgdGV4dFVwZGF0ZWQgPSBmYWxzZTtcblx0d2hpbGUgKG5ld0luZGV4IDwgbmV3Q2hpbGRyZW5MZW5ndGgpIHtcblx0XHRsZXQgb2xkQ2hpbGQgPSBvbGRJbmRleCA8IG9sZENoaWxkcmVuTGVuZ3RoID8gb2xkQ2hpbGRyZW5bb2xkSW5kZXhdIDogdW5kZWZpbmVkO1xuXHRcdGNvbnN0IG5ld0NoaWxkID0gbmV3Q2hpbGRyZW5bbmV3SW5kZXhdO1xuXHRcdGlmIChpc1ZOb2RlKG5ld0NoaWxkKSAmJiB0eXBlb2YgbmV3Q2hpbGQuZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdG5ld0NoaWxkLmluc2VydGVkID0gaXNWTm9kZShvbGRDaGlsZCkgJiYgb2xkQ2hpbGQuaW5zZXJ0ZWQ7XG5cdFx0XHRhZGREZWZlcnJlZFByb3BlcnRpZXMobmV3Q2hpbGQsIHByb2plY3Rpb25PcHRpb25zKTtcblx0XHR9XG5cdFx0aWYgKG9sZENoaWxkICE9PSB1bmRlZmluZWQgJiYgc2FtZShvbGRDaGlsZCwgbmV3Q2hpbGQpKSB7XG5cdFx0XHRvbGRJbmRleCsrO1xuXHRcdFx0bmV3SW5kZXgrKztcblx0XHRcdHRleHRVcGRhdGVkID1cblx0XHRcdFx0dXBkYXRlRG9tKFxuXHRcdFx0XHRcdG9sZENoaWxkLFxuXHRcdFx0XHRcdG5ld0NoaWxkLFxuXHRcdFx0XHRcdHByb2plY3Rpb25PcHRpb25zLFxuXHRcdFx0XHRcdHBhcmVudFZOb2RlLFxuXHRcdFx0XHRcdHBhcmVudEluc3RhbmNlLFxuXHRcdFx0XHRcdG9sZENoaWxkcmVuLnNsaWNlKG9sZEluZGV4KSxcblx0XHRcdFx0XHRuZXdDaGlsZHJlbi5zbGljZShuZXdJbmRleClcblx0XHRcdFx0KSB8fCB0ZXh0VXBkYXRlZDtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZpbmRPbGRJbmRleCA9IGZpbmRJbmRleE9mQ2hpbGQob2xkQ2hpbGRyZW4sIG5ld0NoaWxkLCBvbGRJbmRleCArIDEpO1xuXHRcdGNvbnN0IGFkZENoaWxkID0gKCkgPT4ge1xuXHRcdFx0bGV0IGluc2VydEJlZm9yZURvbU5vZGU6IE5vZGUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cdFx0XHRsZXQgY2hpbGRyZW5BcnJheSA9IG9sZENoaWxkcmVuO1xuXHRcdFx0bGV0IG5leHRJbmRleCA9IG9sZEluZGV4ICsgMTtcblx0XHRcdGxldCBjaGlsZDogSW50ZXJuYWxETm9kZSA9IG9sZENoaWxkcmVuW29sZEluZGV4XTtcblx0XHRcdGlmICghY2hpbGQpIHtcblx0XHRcdFx0Y2hpbGQgPSBzaWJsaW5nc1swXTtcblx0XHRcdFx0bmV4dEluZGV4ID0gMTtcblx0XHRcdFx0Y2hpbGRyZW5BcnJheSA9IHNpYmxpbmdzO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGNoaWxkKSB7XG5cdFx0XHRcdGxldCBpbnNlcnRCZWZvcmVDaGlsZHJlbiA9IFtjaGlsZF07XG5cdFx0XHRcdHdoaWxlIChpbnNlcnRCZWZvcmVDaGlsZHJlbi5sZW5ndGgpIHtcblx0XHRcdFx0XHRjb25zdCBpbnNlcnRCZWZvcmUgPSBpbnNlcnRCZWZvcmVDaGlsZHJlbi5zaGlmdCgpITtcblx0XHRcdFx0XHRpZiAoaXNXTm9kZShpbnNlcnRCZWZvcmUpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBpdGVtID0gaW5zdGFuY2VNYXAuZ2V0KGluc2VydEJlZm9yZS5pbnN0YW5jZSk7XG5cdFx0XHRcdFx0XHRpZiAoaXRlbSAmJiBpdGVtLmRub2RlLnJlbmRlcmVkKSB7XG5cdFx0XHRcdFx0XHRcdGluc2VydEJlZm9yZUNoaWxkcmVuLnB1c2goLi4uaXRlbS5kbm9kZS5yZW5kZXJlZCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGlmIChpbnNlcnRCZWZvcmUuZG9tTm9kZSkge1xuXHRcdFx0XHRcdFx0XHRpZiAoaW5zZXJ0QmVmb3JlLmRvbU5vZGUucGFyZW50RWxlbWVudCAhPT0gcGFyZW50Vk5vZGUuZG9tTm9kZSkge1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGluc2VydEJlZm9yZURvbU5vZGUgPSBpbnNlcnRCZWZvcmUuZG9tTm9kZTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChpbnNlcnRCZWZvcmVDaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgY2hpbGRyZW5BcnJheVtuZXh0SW5kZXhdKSB7XG5cdFx0XHRcdFx0XHRpbnNlcnRCZWZvcmVDaGlsZHJlbi5wdXNoKGNoaWxkcmVuQXJyYXlbbmV4dEluZGV4XSk7XG5cdFx0XHRcdFx0XHRuZXh0SW5kZXgrKztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y3JlYXRlRG9tKFxuXHRcdFx0XHRuZXdDaGlsZCxcblx0XHRcdFx0cGFyZW50Vk5vZGUsXG5cdFx0XHRcdG5ld0NoaWxkcmVuLnNsaWNlKG5ld0luZGV4ICsgMSksXG5cdFx0XHRcdGluc2VydEJlZm9yZURvbU5vZGUsXG5cdFx0XHRcdHByb2plY3Rpb25PcHRpb25zLFxuXHRcdFx0XHRwYXJlbnRJbnN0YW5jZVxuXHRcdFx0KTtcblx0XHRcdG5vZGVBZGRlZChuZXdDaGlsZCwgdHJhbnNpdGlvbnMpO1xuXHRcdFx0Y29uc3QgaW5kZXhUb0NoZWNrID0gbmV3SW5kZXg7XG5cdFx0XHRwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcblx0XHRcdFx0Y2hlY2tEaXN0aW5ndWlzaGFibGUobmV3Q2hpbGRyZW4sIGluZGV4VG9DaGVjaywgcGFyZW50SW5zdGFuY2UpO1xuXHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdGlmICghb2xkQ2hpbGQgfHwgZmluZE9sZEluZGV4ID09PSAtMSkge1xuXHRcdFx0YWRkQ2hpbGQoKTtcblx0XHRcdG5ld0luZGV4Kys7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRjb25zdCByZW1vdmVDaGlsZCA9ICgpID0+IHtcblx0XHRcdGNvbnN0IGluZGV4VG9DaGVjayA9IG9sZEluZGV4O1xuXHRcdFx0cHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MucHVzaCgoKSA9PiB7XG5cdFx0XHRcdGNoZWNrRGlzdGluZ3Vpc2hhYmxlKG9sZENoaWxkcmVuLCBpbmRleFRvQ2hlY2ssIHBhcmVudEluc3RhbmNlKTtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKGlzV05vZGUob2xkQ2hpbGQpKSB7XG5cdFx0XHRcdGNvbnN0IGl0ZW0gPSBpbnN0YW5jZU1hcC5nZXQob2xkQ2hpbGQuaW5zdGFuY2UpO1xuXHRcdFx0XHRpZiAoaXRlbSkge1xuXHRcdFx0XHRcdG9sZENoaWxkID0gaXRlbS5kbm9kZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0bm9kZVRvUmVtb3ZlKG9sZENoaWxkISwgdHJhbnNpdGlvbnMsIHByb2plY3Rpb25PcHRpb25zKTtcblx0XHR9O1xuXHRcdGNvbnN0IGZpbmROZXdJbmRleCA9IGZpbmRJbmRleE9mQ2hpbGQobmV3Q2hpbGRyZW4sIG9sZENoaWxkLCBuZXdJbmRleCArIDEpO1xuXG5cdFx0aWYgKGZpbmROZXdJbmRleCA9PT0gLTEpIHtcblx0XHRcdHJlbW92ZUNoaWxkKCk7XG5cdFx0XHRvbGRJbmRleCsrO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0YWRkQ2hpbGQoKTtcblx0XHRyZW1vdmVDaGlsZCgpO1xuXHRcdG9sZEluZGV4Kys7XG5cdFx0bmV3SW5kZXgrKztcblx0fVxuXHRpZiAob2xkQ2hpbGRyZW5MZW5ndGggPiBvbGRJbmRleCkge1xuXHRcdC8vIFJlbW92ZSBjaGlsZCBmcmFnbWVudHNcblx0XHRmb3IgKGkgPSBvbGRJbmRleDsgaSA8IG9sZENoaWxkcmVuTGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGluZGV4VG9DaGVjayA9IGk7XG5cdFx0XHRwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcblx0XHRcdFx0Y2hlY2tEaXN0aW5ndWlzaGFibGUob2xkQ2hpbGRyZW4sIGluZGV4VG9DaGVjaywgcGFyZW50SW5zdGFuY2UpO1xuXHRcdFx0fSk7XG5cdFx0XHRsZXQgY2hpbGRUb1JlbW92ZSA9IG9sZENoaWxkcmVuW2ldO1xuXHRcdFx0aWYgKGlzV05vZGUoY2hpbGRUb1JlbW92ZSkpIHtcblx0XHRcdFx0Y29uc3QgaXRlbSA9IGluc3RhbmNlTWFwLmdldChjaGlsZFRvUmVtb3ZlLmluc3RhbmNlKTtcblx0XHRcdFx0aWYgKGl0ZW0pIHtcblx0XHRcdFx0XHRjaGlsZFRvUmVtb3ZlID0gaXRlbS5kbm9kZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0bm9kZVRvUmVtb3ZlKGNoaWxkVG9SZW1vdmUsIHRyYW5zaXRpb25zLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB0ZXh0VXBkYXRlZDtcbn1cblxuZnVuY3Rpb24gYWRkQ2hpbGRyZW4oXG5cdHBhcmVudFZOb2RlOiBJbnRlcm5hbFZOb2RlLFxuXHRjaGlsZHJlbjogSW50ZXJuYWxETm9kZVtdIHwgdW5kZWZpbmVkLFxuXHRwcm9qZWN0aW9uT3B0aW9uczogUHJvamVjdGlvbk9wdGlvbnMsXG5cdHBhcmVudEluc3RhbmNlOiBEZWZhdWx0V2lkZ2V0QmFzZUludGVyZmFjZSxcblx0aW5zZXJ0QmVmb3JlOiBOb2RlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuXHRjaGlsZE5vZGVzPzogKEVsZW1lbnQgfCBUZXh0KVtdXG4pIHtcblx0aWYgKGNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSkhO1xuXHRpZiAocHJvamVjdG9yU3RhdGUubWVyZ2UgJiYgY2hpbGROb2RlcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0Y2hpbGROb2RlcyA9IGFycmF5RnJvbShwYXJlbnRWTm9kZS5kb21Ob2RlIS5jaGlsZE5vZGVzKSBhcyAoRWxlbWVudCB8IFRleHQpW107XG5cdH1cblx0Y29uc3QgdHJhbnNpdGlvbnMgPSBwcm9qZWN0aW9uT3B0aW9ucy50cmFuc2l0aW9ucyE7XG5cdHByb2plY3Rpb25PcHRpb25zID0geyAuLi5wcm9qZWN0aW9uT3B0aW9ucywgZGVwdGg6IHByb2plY3Rpb25PcHRpb25zLmRlcHRoICsgMSB9O1xuXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcblx0XHRjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuXHRcdGNvbnN0IG5leHRTaWJsaW5ncyA9IGNoaWxkcmVuLnNsaWNlKGkgKyAxKTtcblxuXHRcdGlmIChpc1ZOb2RlKGNoaWxkKSkge1xuXHRcdFx0aWYgKHByb2plY3RvclN0YXRlLm1lcmdlICYmIGNoaWxkTm9kZXMpIHtcblx0XHRcdFx0bGV0IGRvbUVsZW1lbnQ6IEVsZW1lbnQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdHdoaWxlIChjaGlsZC5kb21Ob2RlID09PSB1bmRlZmluZWQgJiYgY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0ZG9tRWxlbWVudCA9IGNoaWxkTm9kZXMuc2hpZnQoKSBhcyBFbGVtZW50O1xuXHRcdFx0XHRcdGlmIChkb21FbGVtZW50ICYmIGRvbUVsZW1lbnQudGFnTmFtZSA9PT0gKGNoaWxkLnRhZy50b1VwcGVyQ2FzZSgpIHx8IHVuZGVmaW5lZCkpIHtcblx0XHRcdFx0XHRcdGNoaWxkLmRvbU5vZGUgPSBkb21FbGVtZW50O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Y3JlYXRlRG9tKGNoaWxkLCBwYXJlbnRWTm9kZSwgbmV4dFNpYmxpbmdzLCBpbnNlcnRCZWZvcmUsIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRJbnN0YW5jZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNyZWF0ZURvbShjaGlsZCwgcGFyZW50Vk5vZGUsIG5leHRTaWJsaW5ncywgaW5zZXJ0QmVmb3JlLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UsIGNoaWxkTm9kZXMpO1xuXHRcdH1cblx0XHRub2RlQWRkZWQoY2hpbGQsIHRyYW5zaXRpb25zKTtcblx0fVxufVxuXG5mdW5jdGlvbiBpbml0UHJvcGVydGllc0FuZENoaWxkcmVuKFxuXHRkb21Ob2RlOiBFbGVtZW50LFxuXHRkbm9kZTogSW50ZXJuYWxWTm9kZSxcblx0cGFyZW50SW5zdGFuY2U6IERlZmF1bHRXaWRnZXRCYXNlSW50ZXJmYWNlLFxuXHRwcm9qZWN0aW9uT3B0aW9uczogUHJvamVjdGlvbk9wdGlvbnNcbikge1xuXHRhZGRDaGlsZHJlbihkbm9kZSwgZG5vZGUuY2hpbGRyZW4sIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRJbnN0YW5jZSwgdW5kZWZpbmVkKTtcblx0aWYgKHR5cGVvZiBkbm9kZS5kZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyAmJiBkbm9kZS5pbnNlcnRlZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0YWRkRGVmZXJyZWRQcm9wZXJ0aWVzKGRub2RlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG5cdH1cblxuXHRpZiAoZG5vZGUuYXR0cmlidXRlcyAmJiBkbm9kZS5ldmVudHMpIHtcblx0XHR1cGRhdGVBdHRyaWJ1dGVzKGRvbU5vZGUsIHt9LCBkbm9kZS5hdHRyaWJ1dGVzLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG5cdFx0dXBkYXRlUHJvcGVydGllcyhkb21Ob2RlLCB7fSwgZG5vZGUucHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMsIGZhbHNlKTtcblx0XHRyZW1vdmVPcnBoYW5lZEV2ZW50cyhkb21Ob2RlLCB7fSwgZG5vZGUuZXZlbnRzLCBwcm9qZWN0aW9uT3B0aW9ucywgdHJ1ZSk7XG5cdFx0Y29uc3QgZXZlbnRzID0gZG5vZGUuZXZlbnRzO1xuXHRcdE9iamVjdC5rZXlzKGV2ZW50cykuZm9yRWFjaCgoZXZlbnQpID0+IHtcblx0XHRcdHVwZGF0ZUV2ZW50KGRvbU5vZGUsIGV2ZW50LCBldmVudHNbZXZlbnRdLCBwcm9qZWN0aW9uT3B0aW9ucywgZG5vZGUucHJvcGVydGllcy5iaW5kKTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHR1cGRhdGVQcm9wZXJ0aWVzKGRvbU5vZGUsIHt9LCBkbm9kZS5wcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG5cdH1cblx0aWYgKGRub2RlLnByb3BlcnRpZXMua2V5ICE9PSBudWxsICYmIGRub2RlLnByb3BlcnRpZXMua2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQocGFyZW50SW5zdGFuY2UpITtcblx0XHRpbnN0YW5jZURhdGEubm9kZUhhbmRsZXIuYWRkKGRvbU5vZGUgYXMgSFRNTEVsZW1lbnQsIGAke2Rub2RlLnByb3BlcnRpZXMua2V5fWApO1xuXHR9XG5cdGRub2RlLmluc2VydGVkID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRG9tKFxuXHRkbm9kZTogSW50ZXJuYWxETm9kZSxcblx0cGFyZW50Vk5vZGU6IEludGVybmFsVk5vZGUsXG5cdG5leHRTaWJsaW5nczogSW50ZXJuYWxETm9kZVtdLFxuXHRpbnNlcnRCZWZvcmU6IE5vZGUgfCB1bmRlZmluZWQsXG5cdHByb2plY3Rpb25PcHRpb25zOiBQcm9qZWN0aW9uT3B0aW9ucyxcblx0cGFyZW50SW5zdGFuY2U6IERlZmF1bHRXaWRnZXRCYXNlSW50ZXJmYWNlLFxuXHRjaGlsZE5vZGVzPzogKEVsZW1lbnQgfCBUZXh0KVtdXG4pIHtcblx0bGV0IGRvbU5vZGU6IEVsZW1lbnQgfCBUZXh0IHwgdW5kZWZpbmVkO1xuXHRjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSkhO1xuXHRpZiAoaXNXTm9kZShkbm9kZSkpIHtcblx0XHRsZXQgeyB3aWRnZXRDb25zdHJ1Y3RvciB9ID0gZG5vZGU7XG5cdFx0Y29uc3QgcGFyZW50SW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHBhcmVudEluc3RhbmNlKSE7XG5cdFx0aWYgKCFpc1dpZGdldEJhc2VDb25zdHJ1Y3RvcjxEZWZhdWx0V2lkZ2V0QmFzZUludGVyZmFjZT4od2lkZ2V0Q29uc3RydWN0b3IpKSB7XG5cdFx0XHRjb25zdCBpdGVtID0gcGFyZW50SW5zdGFuY2VEYXRhLnJlZ2lzdHJ5KCkuZ2V0PERlZmF1bHRXaWRnZXRCYXNlSW50ZXJmYWNlPih3aWRnZXRDb25zdHJ1Y3Rvcik7XG5cdFx0XHRpZiAoaXRlbSA9PT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR3aWRnZXRDb25zdHJ1Y3RvciA9IGl0ZW07XG5cdFx0fVxuXHRcdGNvbnN0IGluc3RhbmNlID0gbmV3IHdpZGdldENvbnN0cnVjdG9yKCk7XG5cdFx0ZG5vZGUuaW5zdGFuY2UgPSBpbnN0YW5jZTtcblx0XHRuZXh0U2libGluZ01hcC5zZXQoaW5zdGFuY2UsIG5leHRTaWJsaW5ncyk7XG5cdFx0Y29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKSE7XG5cdFx0aW5zdGFuY2VEYXRhLmludmFsaWRhdGUgPSAoKSA9PiB7XG5cdFx0XHRpbnN0YW5jZURhdGEuZGlydHkgPSB0cnVlO1xuXHRcdFx0aWYgKGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPT09IGZhbHNlKSB7XG5cdFx0XHRcdHByb2plY3RvclN0YXRlLnJlbmRlclF1ZXVlLnB1c2goeyBpbnN0YW5jZSwgZGVwdGg6IHByb2plY3Rpb25PcHRpb25zLmRlcHRoIH0pO1xuXHRcdFx0XHRzY2hlZHVsZVJlbmRlcihwcm9qZWN0aW9uT3B0aW9ucyk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRpbnN0YW5jZURhdGEucmVuZGVyaW5nID0gdHJ1ZTtcblx0XHRpbnN0YW5jZS5fX3NldENvcmVQcm9wZXJ0aWVzX18oZG5vZGUuY29yZVByb3BlcnRpZXMpO1xuXHRcdGluc3RhbmNlLl9fc2V0Q2hpbGRyZW5fXyhkbm9kZS5jaGlsZHJlbik7XG5cdFx0aW5zdGFuY2UuX19zZXRQcm9wZXJ0aWVzX18oZG5vZGUucHJvcGVydGllcyk7XG5cdFx0Y29uc3QgcmVuZGVyZWQgPSBpbnN0YW5jZS5fX3JlbmRlcl9fKCk7XG5cdFx0aW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9IGZhbHNlO1xuXHRcdGlmIChyZW5kZXJlZCkge1xuXHRcdFx0Y29uc3QgZmlsdGVyZWRSZW5kZXJlZCA9IGZpbHRlckFuZERlY29yYXRlQ2hpbGRyZW4ocmVuZGVyZWQsIGluc3RhbmNlKTtcblx0XHRcdGRub2RlLnJlbmRlcmVkID0gZmlsdGVyZWRSZW5kZXJlZDtcblx0XHRcdGFkZENoaWxkcmVuKHBhcmVudFZOb2RlLCBmaWx0ZXJlZFJlbmRlcmVkLCBwcm9qZWN0aW9uT3B0aW9ucywgaW5zdGFuY2UsIGluc2VydEJlZm9yZSwgY2hpbGROb2Rlcyk7XG5cdFx0fVxuXHRcdGluc3RhbmNlTWFwLnNldChpbnN0YW5jZSwgeyBkbm9kZSwgcGFyZW50Vk5vZGUgfSk7XG5cdFx0aW5zdGFuY2VEYXRhLm5vZGVIYW5kbGVyLmFkZFJvb3QoKTtcblx0XHRwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcblx0XHRcdGluc3RhbmNlRGF0YS5vbkF0dGFjaCgpO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdGlmIChwcm9qZWN0b3JTdGF0ZS5tZXJnZSAmJiBwcm9qZWN0b3JTdGF0ZS5tZXJnZUVsZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZG9tTm9kZSA9IGRub2RlLmRvbU5vZGUgPSBwcm9qZWN0aW9uT3B0aW9ucy5tZXJnZUVsZW1lbnQ7XG5cdFx0XHRwcm9qZWN0b3JTdGF0ZS5tZXJnZUVsZW1lbnQgPSB1bmRlZmluZWQ7XG5cdFx0XHRpbml0UHJvcGVydGllc0FuZENoaWxkcmVuKGRvbU5vZGUhLCBkbm9kZSwgcGFyZW50SW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgZG9jID0gcGFyZW50Vk5vZGUuZG9tTm9kZSEub3duZXJEb2N1bWVudDtcblx0XHRpZiAoIWRub2RlLnRhZyAmJiB0eXBlb2YgZG5vZGUudGV4dCA9PT0gJ3N0cmluZycpIHtcblx0XHRcdGlmIChkbm9kZS5kb21Ob2RlICE9PSB1bmRlZmluZWQgJiYgcGFyZW50Vk5vZGUuZG9tTm9kZSkge1xuXHRcdFx0XHRjb25zdCBuZXdEb21Ob2RlID0gZG5vZGUuZG9tTm9kZS5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRub2RlLnRleHQhKTtcblx0XHRcdFx0aWYgKHBhcmVudFZOb2RlLmRvbU5vZGUgPT09IGRub2RlLmRvbU5vZGUucGFyZW50Tm9kZSkge1xuXHRcdFx0XHRcdHBhcmVudFZOb2RlLmRvbU5vZGUucmVwbGFjZUNoaWxkKG5ld0RvbU5vZGUsIGRub2RlLmRvbU5vZGUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHBhcmVudFZOb2RlLmRvbU5vZGUuYXBwZW5kQ2hpbGQobmV3RG9tTm9kZSk7XG5cdFx0XHRcdFx0ZG5vZGUuZG9tTm9kZS5wYXJlbnROb2RlICYmIGRub2RlLmRvbU5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkbm9kZS5kb21Ob2RlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkbm9kZS5kb21Ob2RlID0gbmV3RG9tTm9kZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlID0gZG9jLmNyZWF0ZVRleHROb2RlKGRub2RlLnRleHQhKTtcblx0XHRcdFx0aWYgKGluc2VydEJlZm9yZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cGFyZW50Vk5vZGUuZG9tTm9kZSEuaW5zZXJ0QmVmb3JlKGRvbU5vZGUsIGluc2VydEJlZm9yZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cGFyZW50Vk5vZGUuZG9tTm9kZSEuYXBwZW5kQ2hpbGQoZG9tTm9kZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKGRub2RlLmRvbU5vZGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpZiAoZG5vZGUudGFnID09PSAnc3ZnJykge1xuXHRcdFx0XHRcdHByb2plY3Rpb25PcHRpb25zID0geyAuLi5wcm9qZWN0aW9uT3B0aW9ucywgLi4ueyBuYW1lc3BhY2U6IE5BTUVTUEFDRV9TVkcgfSB9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChwcm9qZWN0aW9uT3B0aW9ucy5uYW1lc3BhY2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhwcm9qZWN0aW9uT3B0aW9ucy5uYW1lc3BhY2UsIGRub2RlLnRhZyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZG9tTm9kZSA9IGRub2RlLmRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlIHx8IGRvYy5jcmVhdGVFbGVtZW50KGRub2RlLnRhZyk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlO1xuXHRcdFx0fVxuXHRcdFx0aW5pdFByb3BlcnRpZXNBbmRDaGlsZHJlbihkb21Ob2RlISBhcyBFbGVtZW50LCBkbm9kZSwgcGFyZW50SW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKTtcblx0XHRcdGlmIChpbnNlcnRCZWZvcmUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRwYXJlbnRWTm9kZS5kb21Ob2RlIS5pbnNlcnRCZWZvcmUoZG9tTm9kZSwgaW5zZXJ0QmVmb3JlKTtcblx0XHRcdH0gZWxzZSBpZiAoZG9tTm9kZSEucGFyZW50Tm9kZSAhPT0gcGFyZW50Vk5vZGUuZG9tTm9kZSEpIHtcblx0XHRcdFx0cGFyZW50Vk5vZGUuZG9tTm9kZSEuYXBwZW5kQ2hpbGQoZG9tTm9kZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURvbShcblx0cHJldmlvdXM6IGFueSxcblx0ZG5vZGU6IEludGVybmFsRE5vZGUsXG5cdHByb2plY3Rpb25PcHRpb25zOiBQcm9qZWN0aW9uT3B0aW9ucyxcblx0cGFyZW50Vk5vZGU6IEludGVybmFsVk5vZGUsXG5cdHBhcmVudEluc3RhbmNlOiBEZWZhdWx0V2lkZ2V0QmFzZUludGVyZmFjZSxcblx0b2xkTmV4dFNpYmxpbmdzOiBJbnRlcm5hbEROb2RlW10sXG5cdG5leHRTaWJsaW5nczogSW50ZXJuYWxETm9kZVtdXG4pIHtcblx0aWYgKGlzV05vZGUoZG5vZGUpKSB7XG5cdFx0Y29uc3QgeyBpbnN0YW5jZSB9ID0gcHJldmlvdXM7XG5cdFx0Y29uc3QgeyBwYXJlbnRWTm9kZSwgZG5vZGU6IG5vZGUgfSA9IGluc3RhbmNlTWFwLmdldChpbnN0YW5jZSkhO1xuXHRcdGNvbnN0IHByZXZpb3VzUmVuZGVyZWQgPSBub2RlID8gbm9kZS5yZW5kZXJlZCA6IHByZXZpb3VzLnJlbmRlcmVkO1xuXHRcdGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldChpbnN0YW5jZSkhO1xuXHRcdGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPSB0cnVlO1xuXHRcdGluc3RhbmNlLl9fc2V0Q29yZVByb3BlcnRpZXNfXyhkbm9kZS5jb3JlUHJvcGVydGllcyk7XG5cdFx0aW5zdGFuY2UuX19zZXRDaGlsZHJlbl9fKGRub2RlLmNoaWxkcmVuKTtcblx0XHRpbnN0YW5jZS5fX3NldFByb3BlcnRpZXNfXyhkbm9kZS5wcm9wZXJ0aWVzKTtcblx0XHRuZXh0U2libGluZ01hcC5zZXQoaW5zdGFuY2UsIG5leHRTaWJsaW5ncyk7XG5cdFx0ZG5vZGUuaW5zdGFuY2UgPSBpbnN0YW5jZTtcblx0XHRpZiAoaW5zdGFuY2VEYXRhLmRpcnR5ID09PSB0cnVlKSB7XG5cdFx0XHRjb25zdCByZW5kZXJlZCA9IGluc3RhbmNlLl9fcmVuZGVyX18oKTtcblx0XHRcdGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPSBmYWxzZTtcblx0XHRcdGRub2RlLnJlbmRlcmVkID0gZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihyZW5kZXJlZCwgaW5zdGFuY2UpO1xuXHRcdFx0dXBkYXRlQ2hpbGRyZW4ocGFyZW50Vk5vZGUsIG9sZE5leHRTaWJsaW5ncywgcHJldmlvdXNSZW5kZXJlZCwgZG5vZGUucmVuZGVyZWQsIGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPSBmYWxzZTtcblx0XHRcdGRub2RlLnJlbmRlcmVkID0gcHJldmlvdXNSZW5kZXJlZDtcblx0XHR9XG5cdFx0aW5zdGFuY2VNYXAuc2V0KGluc3RhbmNlLCB7IGRub2RlLCBwYXJlbnRWTm9kZSB9KTtcblx0XHRpbnN0YW5jZURhdGEubm9kZUhhbmRsZXIuYWRkUm9vdCgpO1xuXHR9IGVsc2Uge1xuXHRcdGlmIChwcmV2aW91cyA9PT0gZG5vZGUpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Y29uc3QgZG9tTm9kZSA9IChkbm9kZS5kb21Ob2RlID0gcHJldmlvdXMuZG9tTm9kZSk7XG5cdFx0bGV0IHRleHRVcGRhdGVkID0gZmFsc2U7XG5cdFx0bGV0IHVwZGF0ZWQgPSBmYWxzZTtcblx0XHRpZiAoIWRub2RlLnRhZyAmJiB0eXBlb2YgZG5vZGUudGV4dCA9PT0gJ3N0cmluZycpIHtcblx0XHRcdGlmIChkbm9kZS50ZXh0ICE9PSBwcmV2aW91cy50ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IG5ld0RvbU5vZGUgPSBkb21Ob2RlLm93bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZG5vZGUudGV4dCEpO1xuXHRcdFx0XHRkb21Ob2RlLnBhcmVudE5vZGUhLnJlcGxhY2VDaGlsZChuZXdEb21Ob2RlLCBkb21Ob2RlKTtcblx0XHRcdFx0ZG5vZGUuZG9tTm9kZSA9IG5ld0RvbU5vZGU7XG5cdFx0XHRcdHRleHRVcGRhdGVkID0gdHJ1ZTtcblx0XHRcdFx0cmV0dXJuIHRleHRVcGRhdGVkO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoZG5vZGUudGFnICYmIGRub2RlLnRhZy5sYXN0SW5kZXhPZignc3ZnJywgMCkgPT09IDApIHtcblx0XHRcdFx0cHJvamVjdGlvbk9wdGlvbnMgPSB7IC4uLnByb2plY3Rpb25PcHRpb25zLCAuLi57IG5hbWVzcGFjZTogTkFNRVNQQUNFX1NWRyB9IH07XG5cdFx0XHR9XG5cdFx0XHRpZiAocHJldmlvdXMuY2hpbGRyZW4gIT09IGRub2RlLmNoaWxkcmVuKSB7XG5cdFx0XHRcdGNvbnN0IGNoaWxkcmVuID0gZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihkbm9kZS5jaGlsZHJlbiwgcGFyZW50SW5zdGFuY2UpO1xuXHRcdFx0XHRkbm9kZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuXHRcdFx0XHR1cGRhdGVkID1cblx0XHRcdFx0XHR1cGRhdGVDaGlsZHJlbihcblx0XHRcdFx0XHRcdGRub2RlLFxuXHRcdFx0XHRcdFx0b2xkTmV4dFNpYmxpbmdzLFxuXHRcdFx0XHRcdFx0cHJldmlvdXMuY2hpbGRyZW4sXG5cdFx0XHRcdFx0XHRjaGlsZHJlbixcblx0XHRcdFx0XHRcdHBhcmVudEluc3RhbmNlLFxuXHRcdFx0XHRcdFx0cHJvamVjdGlvbk9wdGlvbnNcblx0XHRcdFx0XHQpIHx8IHVwZGF0ZWQ7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHByZXZpb3VzUHJvcGVydGllcyA9IGJ1aWxkUHJldmlvdXNQcm9wZXJ0aWVzKGRvbU5vZGUsIHByZXZpb3VzLCBkbm9kZSk7XG5cdFx0XHRpZiAoZG5vZGUuYXR0cmlidXRlcyAmJiBkbm9kZS5ldmVudHMpIHtcblx0XHRcdFx0dXBkYXRlQXR0cmlidXRlcyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMuYXR0cmlidXRlcywgZG5vZGUuYXR0cmlidXRlcywgcHJvamVjdGlvbk9wdGlvbnMpO1xuXHRcdFx0XHR1cGRhdGVkID1cblx0XHRcdFx0XHR1cGRhdGVQcm9wZXJ0aWVzKFxuXHRcdFx0XHRcdFx0ZG9tTm9kZSxcblx0XHRcdFx0XHRcdHByZXZpb3VzUHJvcGVydGllcy5wcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0ZG5vZGUucHJvcGVydGllcyxcblx0XHRcdFx0XHRcdHByb2plY3Rpb25PcHRpb25zLFxuXHRcdFx0XHRcdFx0ZmFsc2Vcblx0XHRcdFx0XHQpIHx8IHVwZGF0ZWQ7XG5cdFx0XHRcdHJlbW92ZU9ycGhhbmVkRXZlbnRzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcy5ldmVudHMsIGRub2RlLmV2ZW50cywgcHJvamVjdGlvbk9wdGlvbnMsIHRydWUpO1xuXHRcdFx0XHRjb25zdCBldmVudHMgPSBkbm9kZS5ldmVudHM7XG5cdFx0XHRcdE9iamVjdC5rZXlzKGV2ZW50cykuZm9yRWFjaCgoZXZlbnQpID0+IHtcblx0XHRcdFx0XHR1cGRhdGVFdmVudChcblx0XHRcdFx0XHRcdGRvbU5vZGUsXG5cdFx0XHRcdFx0XHRldmVudCxcblx0XHRcdFx0XHRcdGV2ZW50c1tldmVudF0sXG5cdFx0XHRcdFx0XHRwcm9qZWN0aW9uT3B0aW9ucyxcblx0XHRcdFx0XHRcdGRub2RlLnByb3BlcnRpZXMuYmluZCxcblx0XHRcdFx0XHRcdHByZXZpb3VzUHJvcGVydGllcy5ldmVudHNbZXZlbnRdXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR1cGRhdGVkID1cblx0XHRcdFx0XHR1cGRhdGVQcm9wZXJ0aWVzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcy5wcm9wZXJ0aWVzLCBkbm9kZS5wcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucykgfHxcblx0XHRcdFx0XHR1cGRhdGVkO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZG5vZGUucHJvcGVydGllcy5rZXkgIT09IG51bGwgJiYgZG5vZGUucHJvcGVydGllcy5rZXkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQocGFyZW50SW5zdGFuY2UpITtcblx0XHRcdFx0aW5zdGFuY2VEYXRhLm5vZGVIYW5kbGVyLmFkZChkb21Ob2RlLCBgJHtkbm9kZS5wcm9wZXJ0aWVzLmtleX1gKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHVwZGF0ZWQgJiYgZG5vZGUucHJvcGVydGllcyAmJiBkbm9kZS5wcm9wZXJ0aWVzLnVwZGF0ZUFuaW1hdGlvbikge1xuXHRcdFx0ZG5vZGUucHJvcGVydGllcy51cGRhdGVBbmltYXRpb24oZG9tTm9kZSBhcyBFbGVtZW50LCBkbm9kZS5wcm9wZXJ0aWVzLCBwcmV2aW91cy5wcm9wZXJ0aWVzKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gYWRkRGVmZXJyZWRQcm9wZXJ0aWVzKHZub2RlOiBJbnRlcm5hbFZOb2RlLCBwcm9qZWN0aW9uT3B0aW9uczogUHJvamVjdGlvbk9wdGlvbnMpIHtcblx0Ly8gdHJhbnNmZXIgYW55IHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gcGFzc2VkIC0gYXMgdGhlc2UgbXVzdCBiZSBkZWNvcmF0ZWQgcHJvcGVydGllc1xuXHR2bm9kZS5kZWNvcmF0ZWREZWZlcnJlZFByb3BlcnRpZXMgPSB2bm9kZS5wcm9wZXJ0aWVzO1xuXHRjb25zdCBwcm9wZXJ0aWVzID0gdm5vZGUuZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2shKCEhdm5vZGUuaW5zZXJ0ZWQpO1xuXHRjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSkhO1xuXHR2bm9kZS5wcm9wZXJ0aWVzID0geyAuLi5wcm9wZXJ0aWVzLCAuLi52bm9kZS5kZWNvcmF0ZWREZWZlcnJlZFByb3BlcnRpZXMgfTtcblx0cHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3MucHVzaCgoKSA9PiB7XG5cdFx0Y29uc3QgcHJvcGVydGllcyA9IHtcblx0XHRcdC4uLnZub2RlLmRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrISghIXZub2RlLmluc2VydGVkKSxcblx0XHRcdC4uLnZub2RlLmRlY29yYXRlZERlZmVycmVkUHJvcGVydGllc1xuXHRcdH07XG5cdFx0dXBkYXRlUHJvcGVydGllcyh2bm9kZS5kb21Ob2RlISBhcyBFbGVtZW50LCB2bm9kZS5wcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucyk7XG5cdFx0dm5vZGUucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBydW5EZWZlcnJlZFJlbmRlckNhbGxiYWNrcyhwcm9qZWN0aW9uT3B0aW9uczogUHJvamVjdGlvbk9wdGlvbnMpIHtcblx0Y29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpITtcblx0aWYgKHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLmxlbmd0aCkge1xuXHRcdGlmIChwcm9qZWN0aW9uT3B0aW9ucy5zeW5jKSB7XG5cdFx0XHR3aGlsZSAocHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3MubGVuZ3RoKSB7XG5cdFx0XHRcdGNvbnN0IGNhbGxiYWNrID0gcHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3Muc2hpZnQoKTtcblx0XHRcdFx0Y2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Z2xvYmFsLnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG5cdFx0XHRcdHdoaWxlIChwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRjb25zdCBjYWxsYmFjayA9IHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLnNoaWZ0KCk7XG5cdFx0XHRcdFx0Y2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHJ1bkFmdGVyUmVuZGVyQ2FsbGJhY2tzKHByb2plY3Rpb25PcHRpb25zOiBQcm9qZWN0aW9uT3B0aW9ucykge1xuXHRjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSkhO1xuXHRpZiAocHJvamVjdGlvbk9wdGlvbnMuc3luYykge1xuXHRcdHdoaWxlIChwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGNhbGxiYWNrID0gcHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3Muc2hpZnQoKTtcblx0XHRcdGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGlmIChnbG9iYWwucmVxdWVzdElkbGVDYWxsYmFjaykge1xuXHRcdFx0Z2xvYmFsLnJlcXVlc3RJZGxlQ2FsbGJhY2soKCkgPT4ge1xuXHRcdFx0XHR3aGlsZSAocHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MubGVuZ3RoKSB7XG5cdFx0XHRcdFx0Y29uc3QgY2FsbGJhY2sgPSBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5zaGlmdCgpO1xuXHRcdFx0XHRcdGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0d2hpbGUgKHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLmxlbmd0aCkge1xuXHRcdFx0XHRcdGNvbnN0IGNhbGxiYWNrID0gcHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3Muc2hpZnQoKTtcblx0XHRcdFx0XHRjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVSZW5kZXIocHJvamVjdGlvbk9wdGlvbnM6IFByb2plY3Rpb25PcHRpb25zKSB7XG5cdGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKSE7XG5cdGlmIChwcm9qZWN0aW9uT3B0aW9ucy5zeW5jKSB7XG5cdFx0cmVuZGVyKHByb2plY3Rpb25PcHRpb25zKTtcblx0fSBlbHNlIGlmIChwcm9qZWN0b3JTdGF0ZS5yZW5kZXJTY2hlZHVsZWQgPT09IHVuZGVmaW5lZCkge1xuXHRcdHByb2plY3RvclN0YXRlLnJlbmRlclNjaGVkdWxlZCA9IGdsb2JhbC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuXHRcdFx0cmVuZGVyKHByb2plY3Rpb25PcHRpb25zKTtcblx0XHR9KTtcblx0fVxufVxuXG5mdW5jdGlvbiByZW5kZXIocHJvamVjdGlvbk9wdGlvbnM6IFByb2plY3Rpb25PcHRpb25zKSB7XG5cdGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKSE7XG5cdHByb2plY3RvclN0YXRlLnJlbmRlclNjaGVkdWxlZCA9IHVuZGVmaW5lZDtcblx0Y29uc3QgcmVuZGVyUXVldWUgPSBwcm9qZWN0b3JTdGF0ZS5yZW5kZXJRdWV1ZTtcblx0Y29uc3QgcmVuZGVycyA9IFsuLi5yZW5kZXJRdWV1ZV07XG5cdHByb2plY3RvclN0YXRlLnJlbmRlclF1ZXVlID0gW107XG5cdHJlbmRlcnMuc29ydCgoYSwgYikgPT4gYS5kZXB0aCAtIGIuZGVwdGgpO1xuXHRjb25zdCBwcmV2aW91c2x5UmVuZGVyZWQgPSBbXTtcblx0d2hpbGUgKHJlbmRlcnMubGVuZ3RoKSB7XG5cdFx0Y29uc3QgeyBpbnN0YW5jZSB9ID0gcmVuZGVycy5zaGlmdCgpITtcblx0XHRpZiAoaW5zdGFuY2VNYXAuaGFzKGluc3RhbmNlKSAmJiBwcmV2aW91c2x5UmVuZGVyZWQuaW5kZXhPZihpbnN0YW5jZSkgPT09IC0xKSB7XG5cdFx0XHRwcmV2aW91c2x5UmVuZGVyZWQucHVzaChpbnN0YW5jZSk7XG5cdFx0XHRjb25zdCB7IHBhcmVudFZOb2RlLCBkbm9kZSB9ID0gaW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKSE7XG5cdFx0XHRjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpITtcblx0XHRcdGNvbnN0IG5leHRTaWJsaW5ncyA9IG5leHRTaWJsaW5nTWFwLmdldChpbnN0YW5jZSkhO1xuXHRcdFx0dXBkYXRlRG9tKFxuXHRcdFx0XHRkbm9kZSxcblx0XHRcdFx0dG9JbnRlcm5hbFdOb2RlKGluc3RhbmNlLCBpbnN0YW5jZURhdGEpLFxuXHRcdFx0XHRwcm9qZWN0aW9uT3B0aW9ucyxcblx0XHRcdFx0cGFyZW50Vk5vZGUsXG5cdFx0XHRcdGluc3RhbmNlLFxuXHRcdFx0XHRuZXh0U2libGluZ3MsXG5cdFx0XHRcdG5leHRTaWJsaW5nc1xuXHRcdFx0KTtcblx0XHR9XG5cdH1cblx0cnVuQWZ0ZXJSZW5kZXJDYWxsYmFja3MocHJvamVjdGlvbk9wdGlvbnMpO1xuXHRydW5EZWZlcnJlZFJlbmRlckNhbGxiYWNrcyhwcm9qZWN0aW9uT3B0aW9ucyk7XG59XG5cbmV4cG9ydCBjb25zdCBkb20gPSB7XG5cdGFwcGVuZDogZnVuY3Rpb24oXG5cdFx0cGFyZW50Tm9kZTogRWxlbWVudCxcblx0XHRpbnN0YW5jZTogRGVmYXVsdFdpZGdldEJhc2VJbnRlcmZhY2UsXG5cdFx0cHJvamVjdGlvbk9wdGlvbnM6IFBhcnRpYWw8UHJvamVjdGlvbk9wdGlvbnM+ID0ge31cblx0KTogUHJvamVjdGlvbiB7XG5cdFx0Y29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKSE7XG5cdFx0Y29uc3QgZmluYWxQcm9qZWN0b3JPcHRpb25zID0gZ2V0UHJvamVjdGlvbk9wdGlvbnMocHJvamVjdGlvbk9wdGlvbnMsIGluc3RhbmNlKTtcblx0XHRjb25zdCBwcm9qZWN0b3JTdGF0ZTogUHJvamVjdG9yU3RhdGUgPSB7XG5cdFx0XHRhZnRlclJlbmRlckNhbGxiYWNrczogW10sXG5cdFx0XHRkZWZlcnJlZFJlbmRlckNhbGxiYWNrczogW10sXG5cdFx0XHRub2RlTWFwOiBuZXcgV2Vha01hcCgpLFxuXHRcdFx0cmVuZGVyU2NoZWR1bGVkOiB1bmRlZmluZWQsXG5cdFx0XHRyZW5kZXJRdWV1ZTogW10sXG5cdFx0XHRtZXJnZTogcHJvamVjdGlvbk9wdGlvbnMubWVyZ2UgfHwgZmFsc2UsXG5cdFx0XHRtZXJnZUVsZW1lbnQ6IHByb2plY3Rpb25PcHRpb25zLm1lcmdlRWxlbWVudFxuXHRcdH07XG5cdFx0cHJvamVjdG9yU3RhdGVNYXAuc2V0KGluc3RhbmNlLCBwcm9qZWN0b3JTdGF0ZSk7XG5cblx0XHRmaW5hbFByb2plY3Rvck9wdGlvbnMucm9vdE5vZGUgPSBwYXJlbnROb2RlO1xuXHRcdGNvbnN0IHBhcmVudFZOb2RlID0gdG9QYXJlbnRWTm9kZShmaW5hbFByb2plY3Rvck9wdGlvbnMucm9vdE5vZGUpO1xuXHRcdGNvbnN0IG5vZGUgPSB0b0ludGVybmFsV05vZGUoaW5zdGFuY2UsIGluc3RhbmNlRGF0YSk7XG5cdFx0aW5zdGFuY2VNYXAuc2V0KGluc3RhbmNlLCB7IGRub2RlOiBub2RlLCBwYXJlbnRWTm9kZSB9KTtcblx0XHRpbnN0YW5jZURhdGEuaW52YWxpZGF0ZSA9ICgpID0+IHtcblx0XHRcdGluc3RhbmNlRGF0YS5kaXJ0eSA9IHRydWU7XG5cdFx0XHRpZiAoaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9PT0gZmFsc2UpIHtcblx0XHRcdFx0cHJvamVjdG9yU3RhdGUucmVuZGVyUXVldWUucHVzaCh7IGluc3RhbmNlLCBkZXB0aDogZmluYWxQcm9qZWN0b3JPcHRpb25zLmRlcHRoIH0pO1xuXHRcdFx0XHRzY2hlZHVsZVJlbmRlcihmaW5hbFByb2plY3Rvck9wdGlvbnMpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0dXBkYXRlRG9tKG5vZGUsIG5vZGUsIGZpbmFsUHJvamVjdG9yT3B0aW9ucywgcGFyZW50Vk5vZGUsIGluc3RhbmNlLCBbXSwgW10pO1xuXHRcdHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xuXHRcdFx0aW5zdGFuY2VEYXRhLm9uQXR0YWNoKCk7XG5cdFx0fSk7XG5cdFx0cnVuRGVmZXJyZWRSZW5kZXJDYWxsYmFja3MoZmluYWxQcm9qZWN0b3JPcHRpb25zKTtcblx0XHRydW5BZnRlclJlbmRlckNhbGxiYWNrcyhmaW5hbFByb2plY3Rvck9wdGlvbnMpO1xuXHRcdHJldHVybiB7XG5cdFx0XHRkb21Ob2RlOiBmaW5hbFByb2plY3Rvck9wdGlvbnMucm9vdE5vZGVcblx0XHR9O1xuXHR9LFxuXHRjcmVhdGU6IGZ1bmN0aW9uKGluc3RhbmNlOiBEZWZhdWx0V2lkZ2V0QmFzZUludGVyZmFjZSwgcHJvamVjdGlvbk9wdGlvbnM/OiBQYXJ0aWFsPFByb2plY3Rpb25PcHRpb25zPik6IFByb2plY3Rpb24ge1xuXHRcdHJldHVybiB0aGlzLmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwgaW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKTtcblx0fSxcblx0bWVyZ2U6IGZ1bmN0aW9uKFxuXHRcdGVsZW1lbnQ6IEVsZW1lbnQsXG5cdFx0aW5zdGFuY2U6IERlZmF1bHRXaWRnZXRCYXNlSW50ZXJmYWNlLFxuXHRcdHByb2plY3Rpb25PcHRpb25zOiBQYXJ0aWFsPFByb2plY3Rpb25PcHRpb25zPiA9IHt9XG5cdCk6IFByb2plY3Rpb24ge1xuXHRcdHByb2plY3Rpb25PcHRpb25zLm1lcmdlID0gdHJ1ZTtcblx0XHRwcm9qZWN0aW9uT3B0aW9ucy5tZXJnZUVsZW1lbnQgPSBlbGVtZW50O1xuXHRcdGNvbnN0IHByb2plY3Rpb24gPSB0aGlzLmFwcGVuZChlbGVtZW50LnBhcmVudE5vZGUgYXMgRWxlbWVudCwgaW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKTtcblx0XHRjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChpbnN0YW5jZSkhO1xuXHRcdHByb2plY3RvclN0YXRlLm1lcmdlID0gZmFsc2U7XG5cdFx0cmV0dXJuIHByb2plY3Rpb247XG5cdH1cbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gdmRvbS50cyIsImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcIikodHJ1ZSk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCIuc1VtVWk0U2gge1xcblxcdGhlaWdodDogMTAwJTtcXG5cXHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcblxcbi5fMk1rNlJkcWEge1xcblxcdGNvbG9yOiAjZmZmO1xcblxcdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXG5cXHRtYXJnaW46IDAgNi40cHg7XFxuXFx0cG9zaXRpb246IHJlbGF0aXZlO1xcblxcdGRpc3BsYXk6IC13ZWJraXQtYm94O1xcblxcdGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xcblxcdGRpc3BsYXk6IGZsZXg7XFxuXFx0LXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcXG5cXHQtd2Via2l0LWJveC1kaXJlY3Rpb246IG5vcm1hbDtcXG5cXHQgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuXFx0ICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcblxcdC13ZWJraXQtYm94LXBhY2s6IGNlbnRlcjtcXG5cXHQgICAgLW1zLWZsZXgtcGFjazogY2VudGVyO1xcblxcdCAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuXFx0aGVpZ2h0OiA0OHB4O1xcblxcdGN1cnNvcjogcG9pbnRlcjtcXG59XFxuXFxuLl8yTWs2UmRxYTo6YWZ0ZXIge1xcblxcdGRpc3BsYXk6IGJsb2NrO1xcblxcdGNvbnRlbnQ6IFxcXCJcXFwiO1xcblxcdGJhY2tncm91bmQ6ICNmZmY7XFxuXFx0aGVpZ2h0OiAycHg7XFxuXFx0cG9zaXRpb246IGFic29sdXRlO1xcblxcdHdpZHRoOiAxMDAlO1xcblxcdGJvdHRvbTogMDtcXG5cXHQtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIC4zcyBlYXNlLW91dDtcXG5cXHR0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAuM3MgZWFzZS1vdXQ7XFxuXFx0dHJhbnNpdGlvbjogdHJhbnNmb3JtIC4zcyBlYXNlLW91dDtcXG5cXHR0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gLjNzIGVhc2Utb3V0LCAtd2Via2l0LXRyYW5zZm9ybSAuM3MgZWFzZS1vdXQ7XFxuXFx0LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoM3B4KTtcXG5cXHQgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgzcHgpO1xcbn1cXG5cXG4uXzEtZjNJdE9oOjphZnRlciB7XFxuXFx0LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7XFxuXFx0ICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7XFxufVxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvVXNlcnMvYnJ5YW4vUHJvamVjdHMvZG9qbzIvY2xpLWJ1aWxkLXdpZGdldC90ZXN0LWFwcC9zcmMvbWVudS1pdGVtL21lbnVJdGVtLm0uY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0NBQ0MsYUFBYTtDQUNiLHNCQUFzQjtDQUN0Qjs7QUFFRDtDQUNDLFlBQVk7Q0FDWixzQkFBc0I7Q0FDdEIsZ0JBQWdCO0NBQ2hCLG1CQUFtQjtDQUNuQixxQkFBcUI7Q0FDckIscUJBQXFCO0NBQ3JCLGNBQWM7Q0FDZCw2QkFBNkI7Q0FDN0IsOEJBQThCO0tBQzFCLDJCQUEyQjtTQUN2Qix1QkFBdUI7Q0FDL0IseUJBQXlCO0tBQ3JCLHNCQUFzQjtTQUNsQix3QkFBd0I7Q0FDaEMsYUFBYTtDQUNiLGdCQUFnQjtDQUNoQjs7QUFFRDtDQUNDLGVBQWU7Q0FDZixZQUFZO0NBQ1osaUJBQWlCO0NBQ2pCLFlBQVk7Q0FDWixtQkFBbUI7Q0FDbkIsWUFBWTtDQUNaLFVBQVU7Q0FDVixtREFBbUQ7Q0FDbkQsMkNBQTJDO0NBQzNDLG1DQUFtQztDQUNuQyxtRUFBbUU7Q0FDbkUsbUNBQW1DO1NBQzNCLDJCQUEyQjtDQUNuQzs7QUFFRDtDQUNDLGlDQUFpQztTQUN6Qix5QkFBeUI7Q0FDakNcIixcImZpbGVcIjpcIm1lbnVJdGVtLm0uY3NzXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5yb290IHtcXG5cXHRoZWlnaHQ6IDEwMCU7XFxuXFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5cXG4uaXRlbSB7XFxuXFx0Y29sb3I6ICNmZmY7XFxuXFx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xcblxcdG1hcmdpbjogMCA2LjRweDtcXG5cXHRwb3NpdGlvbjogcmVsYXRpdmU7XFxuXFx0ZGlzcGxheTogLXdlYmtpdC1ib3g7XFxuXFx0ZGlzcGxheTogLW1zLWZsZXhib3g7XFxuXFx0ZGlzcGxheTogZmxleDtcXG5cXHQtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xcblxcdC13ZWJraXQtYm94LWRpcmVjdGlvbjogbm9ybWFsO1xcblxcdCAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG5cXHQgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuXFx0LXdlYmtpdC1ib3gtcGFjazogY2VudGVyO1xcblxcdCAgICAtbXMtZmxleC1wYWNrOiBjZW50ZXI7XFxuXFx0ICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG5cXHRoZWlnaHQ6IDQ4cHg7XFxuXFx0Y3Vyc29yOiBwb2ludGVyO1xcbn1cXG5cXG4uaXRlbTo6YWZ0ZXIge1xcblxcdGRpc3BsYXk6IGJsb2NrO1xcblxcdGNvbnRlbnQ6IFxcXCJcXFwiO1xcblxcdGJhY2tncm91bmQ6ICNmZmY7XFxuXFx0aGVpZ2h0OiAycHg7XFxuXFx0cG9zaXRpb246IGFic29sdXRlO1xcblxcdHdpZHRoOiAxMDAlO1xcblxcdGJvdHRvbTogMDtcXG5cXHQtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIC4zcyBlYXNlLW91dDtcXG5cXHR0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAuM3MgZWFzZS1vdXQ7XFxuXFx0dHJhbnNpdGlvbjogdHJhbnNmb3JtIC4zcyBlYXNlLW91dDtcXG5cXHR0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gLjNzIGVhc2Utb3V0LCAtd2Via2l0LXRyYW5zZm9ybSAuM3MgZWFzZS1vdXQ7XFxuXFx0LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoM3B4KTtcXG5cXHQgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgzcHgpO1xcbn1cXG5cXG4uc2VsZWN0ZWQ6OmFmdGVyIHtcXG5cXHQtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcXG5cXHQgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG5cbi8vIGV4cG9ydHNcbmV4cG9ydHMubG9jYWxzID0ge1wiIF9rZXlcIjogXCJ0ZXN0LWFwcC9tZW51SXRlbVwiLFxuXHRcInJvb3RcIjogXCJzVW1VaTRTaFwiLFxuXHRcIml0ZW1cIjogXCJfMk1rNlJkcWFcIixcblx0XCJzZWxlY3RlZFwiOiBcIl8xLWYzSXRPaFwiXG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWRlY29yYXRvci1sb2FkZXIhLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlcj97XCJtb2R1bGVzXCI6dHJ1ZSxcInNvdXJjZU1hcFwiOnRydWUsXCJpbXBvcnRMb2FkZXJzXCI6MSxcImxvY2FsSWRlbnROYW1lXCI6XCJbaGFzaDpiYXNlNjQ6OF1cIn0hLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvbGliP3tcImlkZW50XCI6XCJwb3N0Y3NzXCIsXCJwbHVnaW5zXCI6W251bGwse1widmVyc2lvblwiOlwiNi4wLjIzXCIsXCJwbHVnaW5zXCI6W251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLFwicG9zdGNzc1BsdWdpblwiOlwicG9zdGNzcy1jc3NuZXh0XCIsXCJwb3N0Y3NzVmVyc2lvblwiOlwiNi4wLjIzXCJ9XX0hLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZHRzLWxvYWRlcj90eXBlPWNzcyEuL3NyYy9tZW51LWl0ZW0vbWVudUl0ZW0ubS5jc3Ncbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWRlY29yYXRvci1sb2FkZXIvaW5kZXguanMhLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz97XCJtb2R1bGVzXCI6dHJ1ZSxcInNvdXJjZU1hcFwiOnRydWUsXCJpbXBvcnRMb2FkZXJzXCI6MSxcImxvY2FsSWRlbnROYW1lXCI6XCJbaGFzaDpiYXNlNjQ6OF1cIn0hLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvbGliL2luZGV4LmpzP3tcImlkZW50XCI6XCJwb3N0Y3NzXCIsXCJwbHVnaW5zXCI6W251bGwse1widmVyc2lvblwiOlwiNi4wLjIzXCIsXCJwbHVnaW5zXCI6W251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLFwicG9zdGNzc1BsdWdpblwiOlwicG9zdGNzcy1jc3NuZXh0XCIsXCJwb3N0Y3NzVmVyc2lvblwiOlwiNi4wLjIzXCJ9XX0hLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZHRzLWxvYWRlci9pbmRleC5qcz90eXBlPWNzcyEuL3NyYy9tZW51LWl0ZW0vbWVudUl0ZW0ubS5jc3Ncbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKSh0cnVlKTtcbi8vIGltcG9ydHNcblxuXG4vLyBtb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIi5fM2JBNmpkU24ge1xcblxcdHdpZHRoOiAxMDAlO1xcblxcdHRvcDogMDtcXG5cXHRoZWlnaHQ6IDQ4cHg7XFxuXFx0ei1pbmRleDogMTAwO1xcblxcdGJhY2tncm91bmQtY29sb3I6ICMxZDFmMjA7XFxufVxcblxcbi5fMWVvR2Zxa3Uge1xcblxcdGhlaWdodDogMTAwJTtcXG5cXHRtYXJnaW46IDAgYXV0bztcXG59XFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi9Vc2Vycy9icnlhbi9Qcm9qZWN0cy9kb2pvMi9jbGktYnVpbGQtd2lkZ2V0L3Rlc3QtYXBwL3NyYy9tZW51L21lbnUubS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7Q0FDQyxZQUFZO0NBQ1osT0FBTztDQUNQLGFBQWE7Q0FDYixhQUFhO0NBQ2IsMEJBQTBCO0NBQzFCOztBQUVEO0NBQ0MsYUFBYTtDQUNiLGVBQWU7Q0FDZlwiLFwiZmlsZVwiOlwibWVudS5tLmNzc1wiLFwic291cmNlc0NvbnRlbnRcIjpbXCIucm9vdCB7XFxuXFx0d2lkdGg6IDEwMCU7XFxuXFx0dG9wOiAwO1xcblxcdGhlaWdodDogNDhweDtcXG5cXHR6LWluZGV4OiAxMDA7XFxuXFx0YmFja2dyb3VuZC1jb2xvcjogIzFkMWYyMDtcXG59XFxuXFxuLm1lbnVDb250YWluZXIge1xcblxcdGhlaWdodDogMTAwJTtcXG5cXHRtYXJnaW46IDAgYXV0bztcXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG5cbi8vIGV4cG9ydHNcbmV4cG9ydHMubG9jYWxzID0ge1wiIF9rZXlcIjogXCJ0ZXN0LWFwcC9tZW51XCIsXG5cdFwicm9vdFwiOiBcIl8zYkE2amRTblwiLFxuXHRcIm1lbnVDb250YWluZXJcIjogXCJfMWVvR2Zxa3VcIlxufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kZWNvcmF0b3ItbG9hZGVyIS4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXI/e1wibW9kdWxlc1wiOnRydWUsXCJzb3VyY2VNYXBcIjp0cnVlLFwiaW1wb3J0TG9hZGVyc1wiOjEsXCJsb2NhbElkZW50TmFtZVwiOlwiW2hhc2g6YmFzZTY0OjhdXCJ9IS4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL2xpYj97XCJpZGVudFwiOlwicG9zdGNzc1wiLFwicGx1Z2luc1wiOltudWxsLHtcInZlcnNpb25cIjpcIjYuMC4yM1wiLFwicGx1Z2luc1wiOltudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsXSxcInBvc3Rjc3NQbHVnaW5cIjpcInBvc3Rjc3MtY3NzbmV4dFwiLFwicG9zdGNzc1ZlcnNpb25cIjpcIjYuMC4yM1wifV19IS4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWR0cy1sb2FkZXI/dHlwZT1jc3MhLi9zcmMvbWVudS9tZW51Lm0uY3NzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kZWNvcmF0b3ItbG9hZGVyL2luZGV4LmpzIS4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/e1wibW9kdWxlc1wiOnRydWUsXCJzb3VyY2VNYXBcIjp0cnVlLFwiaW1wb3J0TG9hZGVyc1wiOjEsXCJsb2NhbElkZW50TmFtZVwiOlwiW2hhc2g6YmFzZTY0OjhdXCJ9IS4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL2xpYi9pbmRleC5qcz97XCJpZGVudFwiOlwicG9zdGNzc1wiLFwicGx1Z2luc1wiOltudWxsLHtcInZlcnNpb25cIjpcIjYuMC4yM1wiLFwicGx1Z2luc1wiOltudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsXSxcInBvc3Rjc3NQbHVnaW5cIjpcInBvc3Rjc3MtY3NzbmV4dFwiLFwicG9zdGNzc1ZlcnNpb25cIjpcIjYuMC4yM1wifV19IS4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWR0cy1sb2FkZXIvaW5kZXguanM/dHlwZT1jc3MhLi9zcmMvbWVudS9tZW51Lm0uY3NzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIi8qXG5cdE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG5cdEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcbiovXG4vLyBjc3MgYmFzZSBjb2RlLCBpbmplY3RlZCBieSB0aGUgY3NzLWxvYWRlclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih1c2VTb3VyY2VNYXApIHtcblx0dmFyIGxpc3QgPSBbXTtcblxuXHQvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXG5cdGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcblx0XHRcdHZhciBjb250ZW50ID0gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtLCB1c2VTb3VyY2VNYXApO1xuXHRcdFx0aWYoaXRlbVsyXSkge1xuXHRcdFx0XHRyZXR1cm4gXCJAbWVkaWEgXCIgKyBpdGVtWzJdICsgXCJ7XCIgKyBjb250ZW50ICsgXCJ9XCI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gY29udGVudDtcblx0XHRcdH1cblx0XHR9KS5qb2luKFwiXCIpO1xuXHR9O1xuXG5cdC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG5cdGxpc3QuaSA9IGZ1bmN0aW9uKG1vZHVsZXMsIG1lZGlhUXVlcnkpIHtcblx0XHRpZih0eXBlb2YgbW9kdWxlcyA9PT0gXCJzdHJpbmdcIilcblx0XHRcdG1vZHVsZXMgPSBbW251bGwsIG1vZHVsZXMsIFwiXCJdXTtcblx0XHR2YXIgYWxyZWFkeUltcG9ydGVkTW9kdWxlcyA9IHt9O1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgaWQgPSB0aGlzW2ldWzBdO1xuXHRcdFx0aWYodHlwZW9mIGlkID09PSBcIm51bWJlclwiKVxuXHRcdFx0XHRhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG5cdFx0fVxuXHRcdGZvcihpID0gMDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBpdGVtID0gbW9kdWxlc1tpXTtcblx0XHRcdC8vIHNraXAgYWxyZWFkeSBpbXBvcnRlZCBtb2R1bGVcblx0XHRcdC8vIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IDEwMCUgcGVyZmVjdCBmb3Igd2VpcmQgbWVkaWEgcXVlcnkgY29tYmluYXRpb25zXG5cdFx0XHQvLyAgd2hlbiBhIG1vZHVsZSBpcyBpbXBvcnRlZCBtdWx0aXBsZSB0aW1lcyB3aXRoIGRpZmZlcmVudCBtZWRpYSBxdWVyaWVzLlxuXHRcdFx0Ly8gIEkgaG9wZSB0aGlzIHdpbGwgbmV2ZXIgb2NjdXIgKEhleSB0aGlzIHdheSB3ZSBoYXZlIHNtYWxsZXIgYnVuZGxlcylcblx0XHRcdGlmKHR5cGVvZiBpdGVtWzBdICE9PSBcIm51bWJlclwiIHx8ICFhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XG5cdFx0XHRcdGlmKG1lZGlhUXVlcnkgJiYgIWl0ZW1bMl0pIHtcblx0XHRcdFx0XHRpdGVtWzJdID0gbWVkaWFRdWVyeTtcblx0XHRcdFx0fSBlbHNlIGlmKG1lZGlhUXVlcnkpIHtcblx0XHRcdFx0XHRpdGVtWzJdID0gXCIoXCIgKyBpdGVtWzJdICsgXCIpIGFuZCAoXCIgKyBtZWRpYVF1ZXJ5ICsgXCIpXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0bGlzdC5wdXNoKGl0ZW0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0cmV0dXJuIGxpc3Q7XG59O1xuXG5mdW5jdGlvbiBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0sIHVzZVNvdXJjZU1hcCkge1xuXHR2YXIgY29udGVudCA9IGl0ZW1bMV0gfHwgJyc7XG5cdHZhciBjc3NNYXBwaW5nID0gaXRlbVszXTtcblx0aWYgKCFjc3NNYXBwaW5nKSB7XG5cdFx0cmV0dXJuIGNvbnRlbnQ7XG5cdH1cblxuXHRpZiAodXNlU291cmNlTWFwICYmIHR5cGVvZiBidG9hID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0dmFyIHNvdXJjZU1hcHBpbmcgPSB0b0NvbW1lbnQoY3NzTWFwcGluZyk7XG5cdFx0dmFyIHNvdXJjZVVSTHMgPSBjc3NNYXBwaW5nLnNvdXJjZXMubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcblx0XHRcdHJldHVybiAnLyojIHNvdXJjZVVSTD0nICsgY3NzTWFwcGluZy5zb3VyY2VSb290ICsgc291cmNlICsgJyAqLydcblx0XHR9KTtcblxuXHRcdHJldHVybiBbY29udGVudF0uY29uY2F0KHNvdXJjZVVSTHMpLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oJ1xcbicpO1xuXHR9XG5cblx0cmV0dXJuIFtjb250ZW50XS5qb2luKCdcXG4nKTtcbn1cblxuLy8gQWRhcHRlZCBmcm9tIGNvbnZlcnQtc291cmNlLW1hcCAoTUlUKVxuZnVuY3Rpb24gdG9Db21tZW50KHNvdXJjZU1hcCkge1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcblx0dmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCkpKSk7XG5cdHZhciBkYXRhID0gJ3NvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LCcgKyBiYXNlNjQ7XG5cblx0cmV0dXJuICcvKiMgJyArIGRhdGEgKyAnICovJztcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJjc3NTZWxlY3RcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiY3NzU2VsZWN0XCJdID0gZmFjdG9yeSgpO1xufSkodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAyNCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBpc1ZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0aWYgKCFpc1ZhbHVlKHZhbHVlKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgbnVsbCBvciB1bmRlZmluZWRcIik7XG5cdHJldHVybiB2YWx1ZTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuKSB7XG5cdGlmICh0eXBlb2YgZm4gIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihmbiArIFwiIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO1xuXHRyZXR1cm4gZm47XG59O1xuXG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNjYpKCkgPyBTeW1ib2wgOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDY3KTtcblxuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGFzc2lnbiAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKVxuICAsIG5vcm1hbGl6ZU9wdHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKVxuICAsIGlzQ2FsbGFibGUgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYyKVxuICAsIGNvbnRhaW5zICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKVxuXG4gICwgZDtcblxuZCA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGRzY3IsIHZhbHVlLyosIG9wdGlvbnMqLykge1xuXHR2YXIgYywgZSwgdywgb3B0aW9ucywgZGVzYztcblx0aWYgKChhcmd1bWVudHMubGVuZ3RoIDwgMikgfHwgKHR5cGVvZiBkc2NyICE9PSAnc3RyaW5nJykpIHtcblx0XHRvcHRpb25zID0gdmFsdWU7XG5cdFx0dmFsdWUgPSBkc2NyO1xuXHRcdGRzY3IgPSBudWxsO1xuXHR9IGVsc2Uge1xuXHRcdG9wdGlvbnMgPSBhcmd1bWVudHNbMl07XG5cdH1cblx0aWYgKGRzY3IgPT0gbnVsbCkge1xuXHRcdGMgPSB3ID0gdHJ1ZTtcblx0XHRlID0gZmFsc2U7XG5cdH0gZWxzZSB7XG5cdFx0YyA9IGNvbnRhaW5zLmNhbGwoZHNjciwgJ2MnKTtcblx0XHRlID0gY29udGFpbnMuY2FsbChkc2NyLCAnZScpO1xuXHRcdHcgPSBjb250YWlucy5jYWxsKGRzY3IsICd3Jyk7XG5cdH1cblxuXHRkZXNjID0geyB2YWx1ZTogdmFsdWUsIGNvbmZpZ3VyYWJsZTogYywgZW51bWVyYWJsZTogZSwgd3JpdGFibGU6IHcgfTtcblx0cmV0dXJuICFvcHRpb25zID8gZGVzYyA6IGFzc2lnbihub3JtYWxpemVPcHRzKG9wdGlvbnMpLCBkZXNjKTtcbn07XG5cbmQuZ3MgPSBmdW5jdGlvbiAoZHNjciwgZ2V0LCBzZXQvKiwgb3B0aW9ucyovKSB7XG5cdHZhciBjLCBlLCBvcHRpb25zLCBkZXNjO1xuXHRpZiAodHlwZW9mIGRzY3IgIT09ICdzdHJpbmcnKSB7XG5cdFx0b3B0aW9ucyA9IHNldDtcblx0XHRzZXQgPSBnZXQ7XG5cdFx0Z2V0ID0gZHNjcjtcblx0XHRkc2NyID0gbnVsbDtcblx0fSBlbHNlIHtcblx0XHRvcHRpb25zID0gYXJndW1lbnRzWzNdO1xuXHR9XG5cdGlmIChnZXQgPT0gbnVsbCkge1xuXHRcdGdldCA9IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmICghaXNDYWxsYWJsZShnZXQpKSB7XG5cdFx0b3B0aW9ucyA9IGdldDtcblx0XHRnZXQgPSBzZXQgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoc2V0ID09IG51bGwpIHtcblx0XHRzZXQgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoIWlzQ2FsbGFibGUoc2V0KSkge1xuXHRcdG9wdGlvbnMgPSBzZXQ7XG5cdFx0c2V0ID0gdW5kZWZpbmVkO1xuXHR9XG5cdGlmIChkc2NyID09IG51bGwpIHtcblx0XHRjID0gdHJ1ZTtcblx0XHRlID0gZmFsc2U7XG5cdH0gZWxzZSB7XG5cdFx0YyA9IGNvbnRhaW5zLmNhbGwoZHNjciwgJ2MnKTtcblx0XHRlID0gY29udGFpbnMuY2FsbChkc2NyLCAnZScpO1xuXHR9XG5cblx0ZGVzYyA9IHsgZ2V0OiBnZXQsIHNldDogc2V0LCBjb25maWd1cmFibGU6IGMsIGVudW1lcmFibGU6IGUgfTtcblx0cmV0dXJuICFvcHRpb25zID8gZGVzYyA6IGFzc2lnbihub3JtYWxpemVPcHRzKG9wdGlvbnMpLCBkZXNjKTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBfdW5kZWZpbmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNykoKTsgLy8gU3VwcG9ydCBFUzMgZW5naW5lc1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWwpIHtcbiByZXR1cm4gKHZhbCAhPT0gX3VuZGVmaW5lZCkgJiYgKHZhbCAhPT0gbnVsbCk7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0dHJ1ZUZ1bmM6IGZ1bmN0aW9uIHRydWVGdW5jKCl7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cdGZhbHNlRnVuYzogZnVuY3Rpb24gZmFsc2VGdW5jKCl7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xuXG4vKioqLyB9KSxcbi8qIDYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KSgpXG5cdD8gT2JqZWN0LnNldFByb3RvdHlwZU9mXG5cdDogX193ZWJwYWNrX3JlcXVpcmVfXygyMCk7XG5cblxuLyoqKi8gfSksXG4vKiA3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBvYmpUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdcbiAgLCBpZCA9IG9ialRvU3RyaW5nLmNhbGwoXG5cdChmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIGFyZ3VtZW50cztcblx0fSkoKVxuKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0cmV0dXJuIG9ialRvU3RyaW5nLmNhbGwodmFsdWUpID09PSBpZDtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBvYmpUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsIGlkID0gb2JqVG9TdHJpbmcuY2FsbChcIlwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0cmV0dXJuIChcblx0XHR0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHxcblx0XHQodmFsdWUgJiZcblx0XHRcdHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuXHRcdFx0KHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nIHx8IG9ialRvU3RyaW5nLmNhbGwodmFsdWUpID09PSBpZCkpIHx8XG5cdFx0ZmFsc2Vcblx0KTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbi8vVHlwZXMgb2YgZWxlbWVudHMgZm91bmQgaW4gdGhlIERPTVxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdFRleHQ6IFwidGV4dFwiLCAvL1RleHRcblx0RGlyZWN0aXZlOiBcImRpcmVjdGl2ZVwiLCAvLzw/IC4uLiA/PlxuXHRDb21tZW50OiBcImNvbW1lbnRcIiwgLy88IS0tIC4uLiAtLT5cblx0U2NyaXB0OiBcInNjcmlwdFwiLCAvLzxzY3JpcHQ+IHRhZ3Ncblx0U3R5bGU6IFwic3R5bGVcIiwgLy88c3R5bGU+IHRhZ3Ncblx0VGFnOiBcInRhZ1wiLCAvL0FueSB0YWdcblx0Q0RBVEE6IFwiY2RhdGFcIiwgLy88IVtDREFUQVsgLi4uIF1dPlxuXHREb2N0eXBlOiBcImRvY3R5cGVcIixcblxuXHRpc1RhZzogZnVuY3Rpb24oZWxlbSl7XG5cdFx0cmV0dXJuIGVsZW0udHlwZSA9PT0gXCJ0YWdcIiB8fCBlbGVtLnR5cGUgPT09IFwic2NyaXB0XCIgfHwgZWxlbS50eXBlID09PSBcInN0eWxlXCI7XG5cdH1cbn07XG5cblxuLyoqKi8gfSksXG4vKiAxMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNTcpKClcblx0PyBPYmplY3QuYXNzaWduXG5cdDogX193ZWJwYWNrX3JlcXVpcmVfXyg1OCk7XG5cblxuLyoqKi8gfSksXG4vKiAxMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNjMpKClcblx0PyBTdHJpbmcucHJvdG90eXBlLmNvbnRhaW5zXG5cdDogX193ZWJwYWNrX3JlcXVpcmVfXyg2NCk7XG5cblxuLyoqKi8gfSksXG4vKiAxMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgY2xlYXIgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KVxuICAsIGFzc2lnbiAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMClcbiAgLCBjYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSlcbiAgLCB2YWx1ZSAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMClcbiAgLCBkICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMylcbiAgLCBhdXRvQmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oNzQpXG4gICwgU3ltYm9sICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHksIGRlZmluZVByb3BlcnRpZXMgPSBPYmplY3QuZGVmaW5lUHJvcGVydGllcywgSXRlcmF0b3I7XG5cbm1vZHVsZS5leHBvcnRzID0gSXRlcmF0b3IgPSBmdW5jdGlvbiAobGlzdCwgY29udGV4dCkge1xuXHRpZiAoISh0aGlzIGluc3RhbmNlb2YgSXRlcmF0b3IpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ29uc3RydWN0b3IgcmVxdWlyZXMgJ25ldydcIik7XG5cdGRlZmluZVByb3BlcnRpZXModGhpcywge1xuXHRcdF9fbGlzdF9fOiBkKFwid1wiLCB2YWx1ZShsaXN0KSksXG5cdFx0X19jb250ZXh0X186IGQoXCJ3XCIsIGNvbnRleHQpLFxuXHRcdF9fbmV4dEluZGV4X186IGQoXCJ3XCIsIDApXG5cdH0pO1xuXHRpZiAoIWNvbnRleHQpIHJldHVybjtcblx0Y2FsbGFibGUoY29udGV4dC5vbik7XG5cdGNvbnRleHQub24oXCJfYWRkXCIsIHRoaXMuX29uQWRkKTtcblx0Y29udGV4dC5vbihcIl9kZWxldGVcIiwgdGhpcy5fb25EZWxldGUpO1xuXHRjb250ZXh0Lm9uKFwiX2NsZWFyXCIsIHRoaXMuX29uQ2xlYXIpO1xufTtcblxuLy8gSW50ZXJuYWwgJUl0ZXJhdG9yUHJvdG90eXBlJSBkb2Vzbid0IGV4cG9zZSBpdHMgY29uc3RydWN0b3JcbmRlbGV0ZSBJdGVyYXRvci5wcm90b3R5cGUuY29uc3RydWN0b3I7XG5cbmRlZmluZVByb3BlcnRpZXMoXG5cdEl0ZXJhdG9yLnByb3RvdHlwZSxcblx0YXNzaWduKFxuXHRcdHtcblx0XHRcdF9uZXh0OiBkKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dmFyIGk7XG5cdFx0XHRcdGlmICghdGhpcy5fX2xpc3RfXykgcmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKHRoaXMuX19yZWRvX18pIHtcblx0XHRcdFx0XHRpID0gdGhpcy5fX3JlZG9fXy5zaGlmdCgpO1xuXHRcdFx0XHRcdGlmIChpICE9PSB1bmRlZmluZWQpIHJldHVybiBpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0aGlzLl9fbmV4dEluZGV4X18gPCB0aGlzLl9fbGlzdF9fLmxlbmd0aCkgcmV0dXJuIHRoaXMuX19uZXh0SW5kZXhfXysrO1xuXHRcdFx0XHR0aGlzLl91bkJpbmQoKTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH0pLFxuXHRcdFx0bmV4dDogZChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9jcmVhdGVSZXN1bHQodGhpcy5fbmV4dCgpKTtcblx0XHRcdH0pLFxuXHRcdFx0X2NyZWF0ZVJlc3VsdDogZChmdW5jdGlvbiAoaSkge1xuXHRcdFx0XHRpZiAoaSA9PT0gdW5kZWZpbmVkKSByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG5cdFx0XHRcdHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogdGhpcy5fcmVzb2x2ZShpKSB9O1xuXHRcdFx0fSksXG5cdFx0XHRfcmVzb2x2ZTogZChmdW5jdGlvbiAoaSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fX2xpc3RfX1tpXTtcblx0XHRcdH0pLFxuXHRcdFx0X3VuQmluZDogZChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHRoaXMuX19saXN0X18gPSBudWxsO1xuXHRcdFx0XHRkZWxldGUgdGhpcy5fX3JlZG9fXztcblx0XHRcdFx0aWYgKCF0aGlzLl9fY29udGV4dF9fKSByZXR1cm47XG5cdFx0XHRcdHRoaXMuX19jb250ZXh0X18ub2ZmKFwiX2FkZFwiLCB0aGlzLl9vbkFkZCk7XG5cdFx0XHRcdHRoaXMuX19jb250ZXh0X18ub2ZmKFwiX2RlbGV0ZVwiLCB0aGlzLl9vbkRlbGV0ZSk7XG5cdFx0XHRcdHRoaXMuX19jb250ZXh0X18ub2ZmKFwiX2NsZWFyXCIsIHRoaXMuX29uQ2xlYXIpO1xuXHRcdFx0XHR0aGlzLl9fY29udGV4dF9fID0gbnVsbDtcblx0XHRcdH0pLFxuXHRcdFx0dG9TdHJpbmc6IGQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gXCJbb2JqZWN0IFwiICsgKHRoaXNbU3ltYm9sLnRvU3RyaW5nVGFnXSB8fCBcIk9iamVjdFwiKSArIFwiXVwiO1xuXHRcdFx0fSlcblx0XHR9LFxuXHRcdGF1dG9CaW5kKHtcblx0XHRcdF9vbkFkZDogZChmdW5jdGlvbiAoaW5kZXgpIHtcblx0XHRcdFx0aWYgKGluZGV4ID49IHRoaXMuX19uZXh0SW5kZXhfXykgcmV0dXJuO1xuXHRcdFx0XHQrK3RoaXMuX19uZXh0SW5kZXhfXztcblx0XHRcdFx0aWYgKCF0aGlzLl9fcmVkb19fKSB7XG5cdFx0XHRcdFx0ZGVmaW5lUHJvcGVydHkodGhpcywgXCJfX3JlZG9fX1wiLCBkKFwiY1wiLCBbaW5kZXhdKSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX19yZWRvX18uZm9yRWFjaChmdW5jdGlvbiAocmVkbywgaSkge1xuXHRcdFx0XHRcdGlmIChyZWRvID49IGluZGV4KSB0aGlzLl9fcmVkb19fW2ldID0gKytyZWRvO1xuXHRcdFx0XHR9LCB0aGlzKTtcblx0XHRcdFx0dGhpcy5fX3JlZG9fXy5wdXNoKGluZGV4KTtcblx0XHRcdH0pLFxuXHRcdFx0X29uRGVsZXRlOiBkKGZ1bmN0aW9uIChpbmRleCkge1xuXHRcdFx0XHR2YXIgaTtcblx0XHRcdFx0aWYgKGluZGV4ID49IHRoaXMuX19uZXh0SW5kZXhfXykgcmV0dXJuO1xuXHRcdFx0XHQtLXRoaXMuX19uZXh0SW5kZXhfXztcblx0XHRcdFx0aWYgKCF0aGlzLl9fcmVkb19fKSByZXR1cm47XG5cdFx0XHRcdGkgPSB0aGlzLl9fcmVkb19fLmluZGV4T2YoaW5kZXgpO1xuXHRcdFx0XHRpZiAoaSAhPT0gLTEpIHRoaXMuX19yZWRvX18uc3BsaWNlKGksIDEpO1xuXHRcdFx0XHR0aGlzLl9fcmVkb19fLmZvckVhY2goZnVuY3Rpb24gKHJlZG8sIGopIHtcblx0XHRcdFx0XHRpZiAocmVkbyA+IGluZGV4KSB0aGlzLl9fcmVkb19fW2pdID0gLS1yZWRvO1xuXHRcdFx0XHR9LCB0aGlzKTtcblx0XHRcdH0pLFxuXHRcdFx0X29uQ2xlYXI6IGQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRpZiAodGhpcy5fX3JlZG9fXykgY2xlYXIuY2FsbCh0aGlzLl9fcmVkb19fKTtcblx0XHRcdFx0dGhpcy5fX25leHRJbmRleF9fID0gMDtcblx0XHRcdH0pXG5cdFx0fSlcblx0KVxuKTtcblxuZGVmaW5lUHJvcGVydHkoXG5cdEl0ZXJhdG9yLnByb3RvdHlwZSxcblx0U3ltYm9sLml0ZXJhdG9yLFxuXHRkKGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcztcblx0fSlcbik7XG5cblxuLyoqKi8gfSksXG4vKiAxMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcImFtcFwiOlwiJlwiLFwiYXBvc1wiOlwiJ1wiLFwiZ3RcIjpcIj5cIixcImx0XCI6XCI8XCIsXCJxdW90XCI6XCJcXFwiXCJ9XG5cbi8qKiovIH0pLFxuLyogMTQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSB7XCJBYWN1dGVcIjpcIsOBXCIsXCJhYWN1dGVcIjpcIsOhXCIsXCJBYnJldmVcIjpcIsSCXCIsXCJhYnJldmVcIjpcIsSDXCIsXCJhY1wiOlwi4oi+XCIsXCJhY2RcIjpcIuKIv1wiLFwiYWNFXCI6XCLiiL7Ms1wiLFwiQWNpcmNcIjpcIsOCXCIsXCJhY2lyY1wiOlwiw6JcIixcImFjdXRlXCI6XCLCtFwiLFwiQWN5XCI6XCLQkFwiLFwiYWN5XCI6XCLQsFwiLFwiQUVsaWdcIjpcIsOGXCIsXCJhZWxpZ1wiOlwiw6ZcIixcImFmXCI6XCLigaFcIixcIkFmclwiOlwi8J2UhFwiLFwiYWZyXCI6XCLwnZSeXCIsXCJBZ3JhdmVcIjpcIsOAXCIsXCJhZ3JhdmVcIjpcIsOgXCIsXCJhbGVmc3ltXCI6XCLihLVcIixcImFsZXBoXCI6XCLihLVcIixcIkFscGhhXCI6XCLOkVwiLFwiYWxwaGFcIjpcIs6xXCIsXCJBbWFjclwiOlwixIBcIixcImFtYWNyXCI6XCLEgVwiLFwiYW1hbGdcIjpcIuKov1wiLFwiYW1wXCI6XCImXCIsXCJBTVBcIjpcIiZcIixcImFuZGFuZFwiOlwi4qmVXCIsXCJBbmRcIjpcIuKpk1wiLFwiYW5kXCI6XCLiiKdcIixcImFuZGRcIjpcIuKpnFwiLFwiYW5kc2xvcGVcIjpcIuKpmFwiLFwiYW5kdlwiOlwi4qmaXCIsXCJhbmdcIjpcIuKIoFwiLFwiYW5nZVwiOlwi4qakXCIsXCJhbmdsZVwiOlwi4oigXCIsXCJhbmdtc2RhYVwiOlwi4qaoXCIsXCJhbmdtc2RhYlwiOlwi4qapXCIsXCJhbmdtc2RhY1wiOlwi4qaqXCIsXCJhbmdtc2RhZFwiOlwi4qarXCIsXCJhbmdtc2RhZVwiOlwi4qasXCIsXCJhbmdtc2RhZlwiOlwi4qatXCIsXCJhbmdtc2RhZ1wiOlwi4qauXCIsXCJhbmdtc2RhaFwiOlwi4qavXCIsXCJhbmdtc2RcIjpcIuKIoVwiLFwiYW5ncnRcIjpcIuKIn1wiLFwiYW5ncnR2YlwiOlwi4oq+XCIsXCJhbmdydHZiZFwiOlwi4qadXCIsXCJhbmdzcGhcIjpcIuKIolwiLFwiYW5nc3RcIjpcIsOFXCIsXCJhbmd6YXJyXCI6XCLijbxcIixcIkFvZ29uXCI6XCLEhFwiLFwiYW9nb25cIjpcIsSFXCIsXCJBb3BmXCI6XCLwnZS4XCIsXCJhb3BmXCI6XCLwnZWSXCIsXCJhcGFjaXJcIjpcIuKpr1wiLFwiYXBcIjpcIuKJiFwiLFwiYXBFXCI6XCLiqbBcIixcImFwZVwiOlwi4omKXCIsXCJhcGlkXCI6XCLiiYtcIixcImFwb3NcIjpcIidcIixcIkFwcGx5RnVuY3Rpb25cIjpcIuKBoVwiLFwiYXBwcm94XCI6XCLiiYhcIixcImFwcHJveGVxXCI6XCLiiYpcIixcIkFyaW5nXCI6XCLDhVwiLFwiYXJpbmdcIjpcIsOlXCIsXCJBc2NyXCI6XCLwnZKcXCIsXCJhc2NyXCI6XCLwnZK2XCIsXCJBc3NpZ25cIjpcIuKJlFwiLFwiYXN0XCI6XCIqXCIsXCJhc3ltcFwiOlwi4omIXCIsXCJhc3ltcGVxXCI6XCLiiY1cIixcIkF0aWxkZVwiOlwiw4NcIixcImF0aWxkZVwiOlwiw6NcIixcIkF1bWxcIjpcIsOEXCIsXCJhdW1sXCI6XCLDpFwiLFwiYXdjb25pbnRcIjpcIuKIs1wiLFwiYXdpbnRcIjpcIuKokVwiLFwiYmFja2NvbmdcIjpcIuKJjFwiLFwiYmFja2Vwc2lsb25cIjpcIs+2XCIsXCJiYWNrcHJpbWVcIjpcIuKAtVwiLFwiYmFja3NpbVwiOlwi4oi9XCIsXCJiYWNrc2ltZXFcIjpcIuKLjVwiLFwiQmFja3NsYXNoXCI6XCLiiJZcIixcIkJhcnZcIjpcIuKrp1wiLFwiYmFydmVlXCI6XCLiir1cIixcImJhcndlZFwiOlwi4oyFXCIsXCJCYXJ3ZWRcIjpcIuKMhlwiLFwiYmFyd2VkZ2VcIjpcIuKMhVwiLFwiYmJya1wiOlwi4o61XCIsXCJiYnJrdGJya1wiOlwi4o62XCIsXCJiY29uZ1wiOlwi4omMXCIsXCJCY3lcIjpcItCRXCIsXCJiY3lcIjpcItCxXCIsXCJiZHF1b1wiOlwi4oCeXCIsXCJiZWNhdXNcIjpcIuKItVwiLFwiYmVjYXVzZVwiOlwi4oi1XCIsXCJCZWNhdXNlXCI6XCLiiLVcIixcImJlbXB0eXZcIjpcIuKmsFwiLFwiYmVwc2lcIjpcIs+2XCIsXCJiZXJub3VcIjpcIuKErFwiLFwiQmVybm91bGxpc1wiOlwi4oSsXCIsXCJCZXRhXCI6XCLOklwiLFwiYmV0YVwiOlwizrJcIixcImJldGhcIjpcIuKEtlwiLFwiYmV0d2VlblwiOlwi4omsXCIsXCJCZnJcIjpcIvCdlIVcIixcImJmclwiOlwi8J2Un1wiLFwiYmlnY2FwXCI6XCLii4JcIixcImJpZ2NpcmNcIjpcIuKXr1wiLFwiYmlnY3VwXCI6XCLii4NcIixcImJpZ29kb3RcIjpcIuKogFwiLFwiYmlnb3BsdXNcIjpcIuKogVwiLFwiYmlnb3RpbWVzXCI6XCLiqIJcIixcImJpZ3NxY3VwXCI6XCLiqIZcIixcImJpZ3N0YXJcIjpcIuKYhVwiLFwiYmlndHJpYW5nbGVkb3duXCI6XCLilr1cIixcImJpZ3RyaWFuZ2xldXBcIjpcIuKWs1wiLFwiYmlndXBsdXNcIjpcIuKohFwiLFwiYmlndmVlXCI6XCLii4FcIixcImJpZ3dlZGdlXCI6XCLii4BcIixcImJrYXJvd1wiOlwi4qSNXCIsXCJibGFja2xvemVuZ2VcIjpcIuKnq1wiLFwiYmxhY2tzcXVhcmVcIjpcIuKWqlwiLFwiYmxhY2t0cmlhbmdsZVwiOlwi4pa0XCIsXCJibGFja3RyaWFuZ2xlZG93blwiOlwi4pa+XCIsXCJibGFja3RyaWFuZ2xlbGVmdFwiOlwi4peCXCIsXCJibGFja3RyaWFuZ2xlcmlnaHRcIjpcIuKWuFwiLFwiYmxhbmtcIjpcIuKQo1wiLFwiYmxrMTJcIjpcIuKWklwiLFwiYmxrMTRcIjpcIuKWkVwiLFwiYmxrMzRcIjpcIuKWk1wiLFwiYmxvY2tcIjpcIuKWiFwiLFwiYm5lXCI6XCI94oOlXCIsXCJibmVxdWl2XCI6XCLiiaHig6VcIixcImJOb3RcIjpcIuKrrVwiLFwiYm5vdFwiOlwi4oyQXCIsXCJCb3BmXCI6XCLwnZS5XCIsXCJib3BmXCI6XCLwnZWTXCIsXCJib3RcIjpcIuKKpVwiLFwiYm90dG9tXCI6XCLiiqVcIixcImJvd3RpZVwiOlwi4ouIXCIsXCJib3hib3hcIjpcIuKniVwiLFwiYm94ZGxcIjpcIuKUkFwiLFwiYm94ZExcIjpcIuKVlVwiLFwiYm94RGxcIjpcIuKVllwiLFwiYm94RExcIjpcIuKVl1wiLFwiYm94ZHJcIjpcIuKUjFwiLFwiYm94ZFJcIjpcIuKVklwiLFwiYm94RHJcIjpcIuKVk1wiLFwiYm94RFJcIjpcIuKVlFwiLFwiYm94aFwiOlwi4pSAXCIsXCJib3hIXCI6XCLilZBcIixcImJveGhkXCI6XCLilKxcIixcImJveEhkXCI6XCLilaRcIixcImJveGhEXCI6XCLilaVcIixcImJveEhEXCI6XCLilaZcIixcImJveGh1XCI6XCLilLRcIixcImJveEh1XCI6XCLiladcIixcImJveGhVXCI6XCLilahcIixcImJveEhVXCI6XCLilalcIixcImJveG1pbnVzXCI6XCLiip9cIixcImJveHBsdXNcIjpcIuKKnlwiLFwiYm94dGltZXNcIjpcIuKKoFwiLFwiYm94dWxcIjpcIuKUmFwiLFwiYm94dUxcIjpcIuKVm1wiLFwiYm94VWxcIjpcIuKVnFwiLFwiYm94VUxcIjpcIuKVnVwiLFwiYm94dXJcIjpcIuKUlFwiLFwiYm94dVJcIjpcIuKVmFwiLFwiYm94VXJcIjpcIuKVmVwiLFwiYm94VVJcIjpcIuKVmlwiLFwiYm94dlwiOlwi4pSCXCIsXCJib3hWXCI6XCLilZFcIixcImJveHZoXCI6XCLilLxcIixcImJveHZIXCI6XCLilapcIixcImJveFZoXCI6XCLilatcIixcImJveFZIXCI6XCLilaxcIixcImJveHZsXCI6XCLilKRcIixcImJveHZMXCI6XCLilaFcIixcImJveFZsXCI6XCLilaJcIixcImJveFZMXCI6XCLilaNcIixcImJveHZyXCI6XCLilJxcIixcImJveHZSXCI6XCLilZ5cIixcImJveFZyXCI6XCLilZ9cIixcImJveFZSXCI6XCLilaBcIixcImJwcmltZVwiOlwi4oC1XCIsXCJicmV2ZVwiOlwiy5hcIixcIkJyZXZlXCI6XCLLmFwiLFwiYnJ2YmFyXCI6XCLCplwiLFwiYnNjclwiOlwi8J2St1wiLFwiQnNjclwiOlwi4oSsXCIsXCJic2VtaVwiOlwi4oGPXCIsXCJic2ltXCI6XCLiiL1cIixcImJzaW1lXCI6XCLii41cIixcImJzb2xiXCI6XCLip4VcIixcImJzb2xcIjpcIlxcXFxcIixcImJzb2xoc3ViXCI6XCLin4hcIixcImJ1bGxcIjpcIuKAolwiLFwiYnVsbGV0XCI6XCLigKJcIixcImJ1bXBcIjpcIuKJjlwiLFwiYnVtcEVcIjpcIuKqrlwiLFwiYnVtcGVcIjpcIuKJj1wiLFwiQnVtcGVxXCI6XCLiiY5cIixcImJ1bXBlcVwiOlwi4omPXCIsXCJDYWN1dGVcIjpcIsSGXCIsXCJjYWN1dGVcIjpcIsSHXCIsXCJjYXBhbmRcIjpcIuKphFwiLFwiY2FwYnJjdXBcIjpcIuKpiVwiLFwiY2FwY2FwXCI6XCLiqYtcIixcImNhcFwiOlwi4oipXCIsXCJDYXBcIjpcIuKLklwiLFwiY2FwY3VwXCI6XCLiqYdcIixcImNhcGRvdFwiOlwi4qmAXCIsXCJDYXBpdGFsRGlmZmVyZW50aWFsRFwiOlwi4oWFXCIsXCJjYXBzXCI6XCLiiKnvuIBcIixcImNhcmV0XCI6XCLigYFcIixcImNhcm9uXCI6XCLLh1wiLFwiQ2F5bGV5c1wiOlwi4oStXCIsXCJjY2Fwc1wiOlwi4qmNXCIsXCJDY2Fyb25cIjpcIsSMXCIsXCJjY2Fyb25cIjpcIsSNXCIsXCJDY2VkaWxcIjpcIsOHXCIsXCJjY2VkaWxcIjpcIsOnXCIsXCJDY2lyY1wiOlwixIhcIixcImNjaXJjXCI6XCLEiVwiLFwiQ2NvbmludFwiOlwi4oiwXCIsXCJjY3Vwc1wiOlwi4qmMXCIsXCJjY3Vwc3NtXCI6XCLiqZBcIixcIkNkb3RcIjpcIsSKXCIsXCJjZG90XCI6XCLEi1wiLFwiY2VkaWxcIjpcIsK4XCIsXCJDZWRpbGxhXCI6XCLCuFwiLFwiY2VtcHR5dlwiOlwi4qayXCIsXCJjZW50XCI6XCLColwiLFwiY2VudGVyZG90XCI6XCLCt1wiLFwiQ2VudGVyRG90XCI6XCLCt1wiLFwiY2ZyXCI6XCLwnZSgXCIsXCJDZnJcIjpcIuKErVwiLFwiQ0hjeVwiOlwi0KdcIixcImNoY3lcIjpcItGHXCIsXCJjaGVja1wiOlwi4pyTXCIsXCJjaGVja21hcmtcIjpcIuKck1wiLFwiQ2hpXCI6XCLOp1wiLFwiY2hpXCI6XCLPh1wiLFwiY2lyY1wiOlwiy4ZcIixcImNpcmNlcVwiOlwi4omXXCIsXCJjaXJjbGVhcnJvd2xlZnRcIjpcIuKGulwiLFwiY2lyY2xlYXJyb3dyaWdodFwiOlwi4oa7XCIsXCJjaXJjbGVkYXN0XCI6XCLiiptcIixcImNpcmNsZWRjaXJjXCI6XCLiippcIixcImNpcmNsZWRkYXNoXCI6XCLiip1cIixcIkNpcmNsZURvdFwiOlwi4oqZXCIsXCJjaXJjbGVkUlwiOlwiwq5cIixcImNpcmNsZWRTXCI6XCLik4hcIixcIkNpcmNsZU1pbnVzXCI6XCLiipZcIixcIkNpcmNsZVBsdXNcIjpcIuKKlVwiLFwiQ2lyY2xlVGltZXNcIjpcIuKKl1wiLFwiY2lyXCI6XCLil4tcIixcImNpckVcIjpcIuKng1wiLFwiY2lyZVwiOlwi4omXXCIsXCJjaXJmbmludFwiOlwi4qiQXCIsXCJjaXJtaWRcIjpcIuKrr1wiLFwiY2lyc2NpclwiOlwi4qeCXCIsXCJDbG9ja3dpc2VDb250b3VySW50ZWdyYWxcIjpcIuKIslwiLFwiQ2xvc2VDdXJseURvdWJsZVF1b3RlXCI6XCLigJ1cIixcIkNsb3NlQ3VybHlRdW90ZVwiOlwi4oCZXCIsXCJjbHVic1wiOlwi4pmjXCIsXCJjbHVic3VpdFwiOlwi4pmjXCIsXCJjb2xvblwiOlwiOlwiLFwiQ29sb25cIjpcIuKIt1wiLFwiQ29sb25lXCI6XCLiqbRcIixcImNvbG9uZVwiOlwi4omUXCIsXCJjb2xvbmVxXCI6XCLiiZRcIixcImNvbW1hXCI6XCIsXCIsXCJjb21tYXRcIjpcIkBcIixcImNvbXBcIjpcIuKIgVwiLFwiY29tcGZuXCI6XCLiiJhcIixcImNvbXBsZW1lbnRcIjpcIuKIgVwiLFwiY29tcGxleGVzXCI6XCLihIJcIixcImNvbmdcIjpcIuKJhVwiLFwiY29uZ2RvdFwiOlwi4qmtXCIsXCJDb25ncnVlbnRcIjpcIuKJoVwiLFwiY29uaW50XCI6XCLiiK5cIixcIkNvbmludFwiOlwi4oivXCIsXCJDb250b3VySW50ZWdyYWxcIjpcIuKIrlwiLFwiY29wZlwiOlwi8J2VlFwiLFwiQ29wZlwiOlwi4oSCXCIsXCJjb3Byb2RcIjpcIuKIkFwiLFwiQ29wcm9kdWN0XCI6XCLiiJBcIixcImNvcHlcIjpcIsKpXCIsXCJDT1BZXCI6XCLCqVwiLFwiY29weXNyXCI6XCLihJdcIixcIkNvdW50ZXJDbG9ja3dpc2VDb250b3VySW50ZWdyYWxcIjpcIuKIs1wiLFwiY3JhcnJcIjpcIuKGtVwiLFwiY3Jvc3NcIjpcIuKcl1wiLFwiQ3Jvc3NcIjpcIuKor1wiLFwiQ3NjclwiOlwi8J2SnlwiLFwiY3NjclwiOlwi8J2SuFwiLFwiY3N1YlwiOlwi4quPXCIsXCJjc3ViZVwiOlwi4quRXCIsXCJjc3VwXCI6XCLiq5BcIixcImNzdXBlXCI6XCLiq5JcIixcImN0ZG90XCI6XCLii69cIixcImN1ZGFycmxcIjpcIuKkuFwiLFwiY3VkYXJyclwiOlwi4qS1XCIsXCJjdWVwclwiOlwi4oueXCIsXCJjdWVzY1wiOlwi4oufXCIsXCJjdWxhcnJcIjpcIuKGtlwiLFwiY3VsYXJycFwiOlwi4qS9XCIsXCJjdXBicmNhcFwiOlwi4qmIXCIsXCJjdXBjYXBcIjpcIuKphlwiLFwiQ3VwQ2FwXCI6XCLiiY1cIixcImN1cFwiOlwi4oiqXCIsXCJDdXBcIjpcIuKLk1wiLFwiY3VwY3VwXCI6XCLiqYpcIixcImN1cGRvdFwiOlwi4oqNXCIsXCJjdXBvclwiOlwi4qmFXCIsXCJjdXBzXCI6XCLiiKrvuIBcIixcImN1cmFyclwiOlwi4oa3XCIsXCJjdXJhcnJtXCI6XCLipLxcIixcImN1cmx5ZXFwcmVjXCI6XCLii55cIixcImN1cmx5ZXFzdWNjXCI6XCLii59cIixcImN1cmx5dmVlXCI6XCLii45cIixcImN1cmx5d2VkZ2VcIjpcIuKLj1wiLFwiY3VycmVuXCI6XCLCpFwiLFwiY3VydmVhcnJvd2xlZnRcIjpcIuKGtlwiLFwiY3VydmVhcnJvd3JpZ2h0XCI6XCLihrdcIixcImN1dmVlXCI6XCLii45cIixcImN1d2VkXCI6XCLii49cIixcImN3Y29uaW50XCI6XCLiiLJcIixcImN3aW50XCI6XCLiiLFcIixcImN5bGN0eVwiOlwi4oytXCIsXCJkYWdnZXJcIjpcIuKAoFwiLFwiRGFnZ2VyXCI6XCLigKFcIixcImRhbGV0aFwiOlwi4oS4XCIsXCJkYXJyXCI6XCLihpNcIixcIkRhcnJcIjpcIuKGoVwiLFwiZEFyclwiOlwi4oeTXCIsXCJkYXNoXCI6XCLigJBcIixcIkRhc2h2XCI6XCLiq6RcIixcImRhc2h2XCI6XCLiiqNcIixcImRia2Fyb3dcIjpcIuKkj1wiLFwiZGJsYWNcIjpcIsudXCIsXCJEY2Fyb25cIjpcIsSOXCIsXCJkY2Fyb25cIjpcIsSPXCIsXCJEY3lcIjpcItCUXCIsXCJkY3lcIjpcItC0XCIsXCJkZGFnZ2VyXCI6XCLigKFcIixcImRkYXJyXCI6XCLih4pcIixcIkREXCI6XCLihYVcIixcImRkXCI6XCLihYZcIixcIkREb3RyYWhkXCI6XCLipJFcIixcImRkb3RzZXFcIjpcIuKpt1wiLFwiZGVnXCI6XCLCsFwiLFwiRGVsXCI6XCLiiIdcIixcIkRlbHRhXCI6XCLOlFwiLFwiZGVsdGFcIjpcIs60XCIsXCJkZW1wdHl2XCI6XCLiprFcIixcImRmaXNodFwiOlwi4qW/XCIsXCJEZnJcIjpcIvCdlIdcIixcImRmclwiOlwi8J2UoVwiLFwiZEhhclwiOlwi4qWlXCIsXCJkaGFybFwiOlwi4oeDXCIsXCJkaGFyclwiOlwi4oeCXCIsXCJEaWFjcml0aWNhbEFjdXRlXCI6XCLCtFwiLFwiRGlhY3JpdGljYWxEb3RcIjpcIsuZXCIsXCJEaWFjcml0aWNhbERvdWJsZUFjdXRlXCI6XCLLnVwiLFwiRGlhY3JpdGljYWxHcmF2ZVwiOlwiYFwiLFwiRGlhY3JpdGljYWxUaWxkZVwiOlwiy5xcIixcImRpYW1cIjpcIuKLhFwiLFwiZGlhbW9uZFwiOlwi4ouEXCIsXCJEaWFtb25kXCI6XCLii4RcIixcImRpYW1vbmRzdWl0XCI6XCLimaZcIixcImRpYW1zXCI6XCLimaZcIixcImRpZVwiOlwiwqhcIixcIkRpZmZlcmVudGlhbERcIjpcIuKFhlwiLFwiZGlnYW1tYVwiOlwiz51cIixcImRpc2luXCI6XCLii7JcIixcImRpdlwiOlwiw7dcIixcImRpdmlkZVwiOlwiw7dcIixcImRpdmlkZW9udGltZXNcIjpcIuKLh1wiLFwiZGl2b254XCI6XCLii4dcIixcIkRKY3lcIjpcItCCXCIsXCJkamN5XCI6XCLRklwiLFwiZGxjb3JuXCI6XCLijJ5cIixcImRsY3JvcFwiOlwi4oyNXCIsXCJkb2xsYXJcIjpcIiRcIixcIkRvcGZcIjpcIvCdlLtcIixcImRvcGZcIjpcIvCdlZVcIixcIkRvdFwiOlwiwqhcIixcImRvdFwiOlwiy5lcIixcIkRvdERvdFwiOlwi4oOcXCIsXCJkb3RlcVwiOlwi4omQXCIsXCJkb3RlcWRvdFwiOlwi4omRXCIsXCJEb3RFcXVhbFwiOlwi4omQXCIsXCJkb3RtaW51c1wiOlwi4oi4XCIsXCJkb3RwbHVzXCI6XCLiiJRcIixcImRvdHNxdWFyZVwiOlwi4oqhXCIsXCJkb3VibGViYXJ3ZWRnZVwiOlwi4oyGXCIsXCJEb3VibGVDb250b3VySW50ZWdyYWxcIjpcIuKIr1wiLFwiRG91YmxlRG90XCI6XCLCqFwiLFwiRG91YmxlRG93bkFycm93XCI6XCLih5NcIixcIkRvdWJsZUxlZnRBcnJvd1wiOlwi4oeQXCIsXCJEb3VibGVMZWZ0UmlnaHRBcnJvd1wiOlwi4oeUXCIsXCJEb3VibGVMZWZ0VGVlXCI6XCLiq6RcIixcIkRvdWJsZUxvbmdMZWZ0QXJyb3dcIjpcIuKfuFwiLFwiRG91YmxlTG9uZ0xlZnRSaWdodEFycm93XCI6XCLin7pcIixcIkRvdWJsZUxvbmdSaWdodEFycm93XCI6XCLin7lcIixcIkRvdWJsZVJpZ2h0QXJyb3dcIjpcIuKHklwiLFwiRG91YmxlUmlnaHRUZWVcIjpcIuKKqFwiLFwiRG91YmxlVXBBcnJvd1wiOlwi4oeRXCIsXCJEb3VibGVVcERvd25BcnJvd1wiOlwi4oeVXCIsXCJEb3VibGVWZXJ0aWNhbEJhclwiOlwi4oilXCIsXCJEb3duQXJyb3dCYXJcIjpcIuKkk1wiLFwiZG93bmFycm93XCI6XCLihpNcIixcIkRvd25BcnJvd1wiOlwi4oaTXCIsXCJEb3duYXJyb3dcIjpcIuKHk1wiLFwiRG93bkFycm93VXBBcnJvd1wiOlwi4oe1XCIsXCJEb3duQnJldmVcIjpcIsyRXCIsXCJkb3duZG93bmFycm93c1wiOlwi4oeKXCIsXCJkb3duaGFycG9vbmxlZnRcIjpcIuKHg1wiLFwiZG93bmhhcnBvb25yaWdodFwiOlwi4oeCXCIsXCJEb3duTGVmdFJpZ2h0VmVjdG9yXCI6XCLipZBcIixcIkRvd25MZWZ0VGVlVmVjdG9yXCI6XCLipZ5cIixcIkRvd25MZWZ0VmVjdG9yQmFyXCI6XCLipZZcIixcIkRvd25MZWZ0VmVjdG9yXCI6XCLihr1cIixcIkRvd25SaWdodFRlZVZlY3RvclwiOlwi4qWfXCIsXCJEb3duUmlnaHRWZWN0b3JCYXJcIjpcIuKll1wiLFwiRG93blJpZ2h0VmVjdG9yXCI6XCLih4FcIixcIkRvd25UZWVBcnJvd1wiOlwi4oanXCIsXCJEb3duVGVlXCI6XCLiiqRcIixcImRyYmthcm93XCI6XCLipJBcIixcImRyY29yblwiOlwi4oyfXCIsXCJkcmNyb3BcIjpcIuKMjFwiLFwiRHNjclwiOlwi8J2Sn1wiLFwiZHNjclwiOlwi8J2SuVwiLFwiRFNjeVwiOlwi0IVcIixcImRzY3lcIjpcItGVXCIsXCJkc29sXCI6XCLip7ZcIixcIkRzdHJva1wiOlwixJBcIixcImRzdHJva1wiOlwixJFcIixcImR0ZG90XCI6XCLii7FcIixcImR0cmlcIjpcIuKWv1wiLFwiZHRyaWZcIjpcIuKWvlwiLFwiZHVhcnJcIjpcIuKHtVwiLFwiZHVoYXJcIjpcIuKlr1wiLFwiZHdhbmdsZVwiOlwi4qamXCIsXCJEWmN5XCI6XCLQj1wiLFwiZHpjeVwiOlwi0Z9cIixcImR6aWdyYXJyXCI6XCLin79cIixcIkVhY3V0ZVwiOlwiw4lcIixcImVhY3V0ZVwiOlwiw6lcIixcImVhc3RlclwiOlwi4qmuXCIsXCJFY2Fyb25cIjpcIsSaXCIsXCJlY2Fyb25cIjpcIsSbXCIsXCJFY2lyY1wiOlwiw4pcIixcImVjaXJjXCI6XCLDqlwiLFwiZWNpclwiOlwi4omWXCIsXCJlY29sb25cIjpcIuKJlVwiLFwiRWN5XCI6XCLQrVwiLFwiZWN5XCI6XCLRjVwiLFwiZUREb3RcIjpcIuKpt1wiLFwiRWRvdFwiOlwixJZcIixcImVkb3RcIjpcIsSXXCIsXCJlRG90XCI6XCLiiZFcIixcImVlXCI6XCLihYdcIixcImVmRG90XCI6XCLiiZJcIixcIkVmclwiOlwi8J2UiFwiLFwiZWZyXCI6XCLwnZSiXCIsXCJlZ1wiOlwi4qqaXCIsXCJFZ3JhdmVcIjpcIsOIXCIsXCJlZ3JhdmVcIjpcIsOoXCIsXCJlZ3NcIjpcIuKqllwiLFwiZWdzZG90XCI6XCLiqphcIixcImVsXCI6XCLiqplcIixcIkVsZW1lbnRcIjpcIuKIiFwiLFwiZWxpbnRlcnNcIjpcIuKPp1wiLFwiZWxsXCI6XCLihJNcIixcImVsc1wiOlwi4qqVXCIsXCJlbHNkb3RcIjpcIuKql1wiLFwiRW1hY3JcIjpcIsSSXCIsXCJlbWFjclwiOlwixJNcIixcImVtcHR5XCI6XCLiiIVcIixcImVtcHR5c2V0XCI6XCLiiIVcIixcIkVtcHR5U21hbGxTcXVhcmVcIjpcIuKXu1wiLFwiZW1wdHl2XCI6XCLiiIVcIixcIkVtcHR5VmVyeVNtYWxsU3F1YXJlXCI6XCLilqtcIixcImVtc3AxM1wiOlwi4oCEXCIsXCJlbXNwMTRcIjpcIuKAhVwiLFwiZW1zcFwiOlwi4oCDXCIsXCJFTkdcIjpcIsWKXCIsXCJlbmdcIjpcIsWLXCIsXCJlbnNwXCI6XCLigIJcIixcIkVvZ29uXCI6XCLEmFwiLFwiZW9nb25cIjpcIsSZXCIsXCJFb3BmXCI6XCLwnZS8XCIsXCJlb3BmXCI6XCLwnZWWXCIsXCJlcGFyXCI6XCLii5VcIixcImVwYXJzbFwiOlwi4qejXCIsXCJlcGx1c1wiOlwi4qmxXCIsXCJlcHNpXCI6XCLOtVwiLFwiRXBzaWxvblwiOlwizpVcIixcImVwc2lsb25cIjpcIs61XCIsXCJlcHNpdlwiOlwiz7VcIixcImVxY2lyY1wiOlwi4omWXCIsXCJlcWNvbG9uXCI6XCLiiZVcIixcImVxc2ltXCI6XCLiiYJcIixcImVxc2xhbnRndHJcIjpcIuKqllwiLFwiZXFzbGFudGxlc3NcIjpcIuKqlVwiLFwiRXF1YWxcIjpcIuKptVwiLFwiZXF1YWxzXCI6XCI9XCIsXCJFcXVhbFRpbGRlXCI6XCLiiYJcIixcImVxdWVzdFwiOlwi4omfXCIsXCJFcXVpbGlicml1bVwiOlwi4oeMXCIsXCJlcXVpdlwiOlwi4omhXCIsXCJlcXVpdkREXCI6XCLiqbhcIixcImVxdnBhcnNsXCI6XCLip6VcIixcImVyYXJyXCI6XCLipbFcIixcImVyRG90XCI6XCLiiZNcIixcImVzY3JcIjpcIuKEr1wiLFwiRXNjclwiOlwi4oSwXCIsXCJlc2RvdFwiOlwi4omQXCIsXCJFc2ltXCI6XCLiqbNcIixcImVzaW1cIjpcIuKJglwiLFwiRXRhXCI6XCLOl1wiLFwiZXRhXCI6XCLOt1wiLFwiRVRIXCI6XCLDkFwiLFwiZXRoXCI6XCLDsFwiLFwiRXVtbFwiOlwiw4tcIixcImV1bWxcIjpcIsOrXCIsXCJldXJvXCI6XCLigqxcIixcImV4Y2xcIjpcIiFcIixcImV4aXN0XCI6XCLiiINcIixcIkV4aXN0c1wiOlwi4oiDXCIsXCJleHBlY3RhdGlvblwiOlwi4oSwXCIsXCJleHBvbmVudGlhbGVcIjpcIuKFh1wiLFwiRXhwb25lbnRpYWxFXCI6XCLihYdcIixcImZhbGxpbmdkb3RzZXFcIjpcIuKJklwiLFwiRmN5XCI6XCLQpFwiLFwiZmN5XCI6XCLRhFwiLFwiZmVtYWxlXCI6XCLimYBcIixcImZmaWxpZ1wiOlwi76yDXCIsXCJmZmxpZ1wiOlwi76yAXCIsXCJmZmxsaWdcIjpcIu+shFwiLFwiRmZyXCI6XCLwnZSJXCIsXCJmZnJcIjpcIvCdlKNcIixcImZpbGlnXCI6XCLvrIFcIixcIkZpbGxlZFNtYWxsU3F1YXJlXCI6XCLil7xcIixcIkZpbGxlZFZlcnlTbWFsbFNxdWFyZVwiOlwi4paqXCIsXCJmamxpZ1wiOlwiZmpcIixcImZsYXRcIjpcIuKZrVwiLFwiZmxsaWdcIjpcIu+sglwiLFwiZmx0bnNcIjpcIuKWsVwiLFwiZm5vZlwiOlwixpJcIixcIkZvcGZcIjpcIvCdlL1cIixcImZvcGZcIjpcIvCdlZdcIixcImZvcmFsbFwiOlwi4oiAXCIsXCJGb3JBbGxcIjpcIuKIgFwiLFwiZm9ya1wiOlwi4ouUXCIsXCJmb3JrdlwiOlwi4quZXCIsXCJGb3VyaWVydHJmXCI6XCLihLFcIixcImZwYXJ0aW50XCI6XCLiqI1cIixcImZyYWMxMlwiOlwiwr1cIixcImZyYWMxM1wiOlwi4oWTXCIsXCJmcmFjMTRcIjpcIsK8XCIsXCJmcmFjMTVcIjpcIuKFlVwiLFwiZnJhYzE2XCI6XCLihZlcIixcImZyYWMxOFwiOlwi4oWbXCIsXCJmcmFjMjNcIjpcIuKFlFwiLFwiZnJhYzI1XCI6XCLihZZcIixcImZyYWMzNFwiOlwiwr5cIixcImZyYWMzNVwiOlwi4oWXXCIsXCJmcmFjMzhcIjpcIuKFnFwiLFwiZnJhYzQ1XCI6XCLihZhcIixcImZyYWM1NlwiOlwi4oWaXCIsXCJmcmFjNThcIjpcIuKFnVwiLFwiZnJhYzc4XCI6XCLihZ5cIixcImZyYXNsXCI6XCLigYRcIixcImZyb3duXCI6XCLijKJcIixcImZzY3JcIjpcIvCdkrtcIixcIkZzY3JcIjpcIuKEsVwiLFwiZ2FjdXRlXCI6XCLHtVwiLFwiR2FtbWFcIjpcIs6TXCIsXCJnYW1tYVwiOlwizrNcIixcIkdhbW1hZFwiOlwiz5xcIixcImdhbW1hZFwiOlwiz51cIixcImdhcFwiOlwi4qqGXCIsXCJHYnJldmVcIjpcIsSeXCIsXCJnYnJldmVcIjpcIsSfXCIsXCJHY2VkaWxcIjpcIsSiXCIsXCJHY2lyY1wiOlwixJxcIixcImdjaXJjXCI6XCLEnVwiLFwiR2N5XCI6XCLQk1wiLFwiZ2N5XCI6XCLQs1wiLFwiR2RvdFwiOlwixKBcIixcImdkb3RcIjpcIsShXCIsXCJnZVwiOlwi4omlXCIsXCJnRVwiOlwi4omnXCIsXCJnRWxcIjpcIuKqjFwiLFwiZ2VsXCI6XCLii5tcIixcImdlcVwiOlwi4omlXCIsXCJnZXFxXCI6XCLiiadcIixcImdlcXNsYW50XCI6XCLiqb5cIixcImdlc2NjXCI6XCLiqqlcIixcImdlc1wiOlwi4qm+XCIsXCJnZXNkb3RcIjpcIuKqgFwiLFwiZ2VzZG90b1wiOlwi4qqCXCIsXCJnZXNkb3RvbFwiOlwi4qqEXCIsXCJnZXNsXCI6XCLii5vvuIBcIixcImdlc2xlc1wiOlwi4qqUXCIsXCJHZnJcIjpcIvCdlIpcIixcImdmclwiOlwi8J2UpFwiLFwiZ2dcIjpcIuKJq1wiLFwiR2dcIjpcIuKLmVwiLFwiZ2dnXCI6XCLii5lcIixcImdpbWVsXCI6XCLihLdcIixcIkdKY3lcIjpcItCDXCIsXCJnamN5XCI6XCLRk1wiLFwiZ2xhXCI6XCLiqqVcIixcImdsXCI6XCLiibdcIixcImdsRVwiOlwi4qqSXCIsXCJnbGpcIjpcIuKqpFwiLFwiZ25hcFwiOlwi4qqKXCIsXCJnbmFwcHJveFwiOlwi4qqKXCIsXCJnbmVcIjpcIuKqiFwiLFwiZ25FXCI6XCLiialcIixcImduZXFcIjpcIuKqiFwiLFwiZ25lcXFcIjpcIuKJqVwiLFwiZ25zaW1cIjpcIuKLp1wiLFwiR29wZlwiOlwi8J2UvlwiLFwiZ29wZlwiOlwi8J2VmFwiLFwiZ3JhdmVcIjpcImBcIixcIkdyZWF0ZXJFcXVhbFwiOlwi4omlXCIsXCJHcmVhdGVyRXF1YWxMZXNzXCI6XCLii5tcIixcIkdyZWF0ZXJGdWxsRXF1YWxcIjpcIuKJp1wiLFwiR3JlYXRlckdyZWF0ZXJcIjpcIuKqolwiLFwiR3JlYXRlckxlc3NcIjpcIuKJt1wiLFwiR3JlYXRlclNsYW50RXF1YWxcIjpcIuKpvlwiLFwiR3JlYXRlclRpbGRlXCI6XCLiibNcIixcIkdzY3JcIjpcIvCdkqJcIixcImdzY3JcIjpcIuKEilwiLFwiZ3NpbVwiOlwi4omzXCIsXCJnc2ltZVwiOlwi4qqOXCIsXCJnc2ltbFwiOlwi4qqQXCIsXCJndGNjXCI6XCLiqqdcIixcImd0Y2lyXCI6XCLiqbpcIixcImd0XCI6XCI+XCIsXCJHVFwiOlwiPlwiLFwiR3RcIjpcIuKJq1wiLFwiZ3Rkb3RcIjpcIuKLl1wiLFwiZ3RsUGFyXCI6XCLippVcIixcImd0cXVlc3RcIjpcIuKpvFwiLFwiZ3RyYXBwcm94XCI6XCLiqoZcIixcImd0cmFyclwiOlwi4qW4XCIsXCJndHJkb3RcIjpcIuKLl1wiLFwiZ3RyZXFsZXNzXCI6XCLii5tcIixcImd0cmVxcWxlc3NcIjpcIuKqjFwiLFwiZ3RybGVzc1wiOlwi4om3XCIsXCJndHJzaW1cIjpcIuKJs1wiLFwiZ3ZlcnRuZXFxXCI6XCLiianvuIBcIixcImd2bkVcIjpcIuKJqe+4gFwiLFwiSGFjZWtcIjpcIsuHXCIsXCJoYWlyc3BcIjpcIuKAilwiLFwiaGFsZlwiOlwiwr1cIixcImhhbWlsdFwiOlwi4oSLXCIsXCJIQVJEY3lcIjpcItCqXCIsXCJoYXJkY3lcIjpcItGKXCIsXCJoYXJyY2lyXCI6XCLipYhcIixcImhhcnJcIjpcIuKGlFwiLFwiaEFyclwiOlwi4oeUXCIsXCJoYXJyd1wiOlwi4oatXCIsXCJIYXRcIjpcIl5cIixcImhiYXJcIjpcIuKEj1wiLFwiSGNpcmNcIjpcIsSkXCIsXCJoY2lyY1wiOlwixKVcIixcImhlYXJ0c1wiOlwi4pmlXCIsXCJoZWFydHN1aXRcIjpcIuKZpVwiLFwiaGVsbGlwXCI6XCLigKZcIixcImhlcmNvblwiOlwi4oq5XCIsXCJoZnJcIjpcIvCdlKVcIixcIkhmclwiOlwi4oSMXCIsXCJIaWxiZXJ0U3BhY2VcIjpcIuKEi1wiLFwiaGtzZWFyb3dcIjpcIuKkpVwiLFwiaGtzd2Fyb3dcIjpcIuKkplwiLFwiaG9hcnJcIjpcIuKHv1wiLFwiaG9tdGh0XCI6XCLiiLtcIixcImhvb2tsZWZ0YXJyb3dcIjpcIuKGqVwiLFwiaG9va3JpZ2h0YXJyb3dcIjpcIuKGqlwiLFwiaG9wZlwiOlwi8J2VmVwiLFwiSG9wZlwiOlwi4oSNXCIsXCJob3JiYXJcIjpcIuKAlVwiLFwiSG9yaXpvbnRhbExpbmVcIjpcIuKUgFwiLFwiaHNjclwiOlwi8J2SvVwiLFwiSHNjclwiOlwi4oSLXCIsXCJoc2xhc2hcIjpcIuKEj1wiLFwiSHN0cm9rXCI6XCLEplwiLFwiaHN0cm9rXCI6XCLEp1wiLFwiSHVtcERvd25IdW1wXCI6XCLiiY5cIixcIkh1bXBFcXVhbFwiOlwi4omPXCIsXCJoeWJ1bGxcIjpcIuKBg1wiLFwiaHlwaGVuXCI6XCLigJBcIixcIklhY3V0ZVwiOlwiw41cIixcImlhY3V0ZVwiOlwiw61cIixcImljXCI6XCLigaNcIixcIkljaXJjXCI6XCLDjlwiLFwiaWNpcmNcIjpcIsOuXCIsXCJJY3lcIjpcItCYXCIsXCJpY3lcIjpcItC4XCIsXCJJZG90XCI6XCLEsFwiLFwiSUVjeVwiOlwi0JVcIixcImllY3lcIjpcItC1XCIsXCJpZXhjbFwiOlwiwqFcIixcImlmZlwiOlwi4oeUXCIsXCJpZnJcIjpcIvCdlKZcIixcIklmclwiOlwi4oSRXCIsXCJJZ3JhdmVcIjpcIsOMXCIsXCJpZ3JhdmVcIjpcIsOsXCIsXCJpaVwiOlwi4oWIXCIsXCJpaWlpbnRcIjpcIuKojFwiLFwiaWlpbnRcIjpcIuKIrVwiLFwiaWluZmluXCI6XCLip5xcIixcImlpb3RhXCI6XCLihKlcIixcIklKbGlnXCI6XCLEslwiLFwiaWpsaWdcIjpcIsSzXCIsXCJJbWFjclwiOlwixKpcIixcImltYWNyXCI6XCLEq1wiLFwiaW1hZ2VcIjpcIuKEkVwiLFwiSW1hZ2luYXJ5SVwiOlwi4oWIXCIsXCJpbWFnbGluZVwiOlwi4oSQXCIsXCJpbWFncGFydFwiOlwi4oSRXCIsXCJpbWF0aFwiOlwixLFcIixcIkltXCI6XCLihJFcIixcImltb2ZcIjpcIuKKt1wiLFwiaW1wZWRcIjpcIsa1XCIsXCJJbXBsaWVzXCI6XCLih5JcIixcImluY2FyZVwiOlwi4oSFXCIsXCJpblwiOlwi4oiIXCIsXCJpbmZpblwiOlwi4oieXCIsXCJpbmZpbnRpZVwiOlwi4qedXCIsXCJpbm9kb3RcIjpcIsSxXCIsXCJpbnRjYWxcIjpcIuKKulwiLFwiaW50XCI6XCLiiKtcIixcIkludFwiOlwi4oisXCIsXCJpbnRlZ2Vyc1wiOlwi4oSkXCIsXCJJbnRlZ3JhbFwiOlwi4oirXCIsXCJpbnRlcmNhbFwiOlwi4oq6XCIsXCJJbnRlcnNlY3Rpb25cIjpcIuKLglwiLFwiaW50bGFyaGtcIjpcIuKol1wiLFwiaW50cHJvZFwiOlwi4qi8XCIsXCJJbnZpc2libGVDb21tYVwiOlwi4oGjXCIsXCJJbnZpc2libGVUaW1lc1wiOlwi4oGiXCIsXCJJT2N5XCI6XCLQgVwiLFwiaW9jeVwiOlwi0ZFcIixcIklvZ29uXCI6XCLErlwiLFwiaW9nb25cIjpcIsSvXCIsXCJJb3BmXCI6XCLwnZWAXCIsXCJpb3BmXCI6XCLwnZWaXCIsXCJJb3RhXCI6XCLOmVwiLFwiaW90YVwiOlwizrlcIixcImlwcm9kXCI6XCLiqLxcIixcImlxdWVzdFwiOlwiwr9cIixcImlzY3JcIjpcIvCdkr5cIixcIklzY3JcIjpcIuKEkFwiLFwiaXNpblwiOlwi4oiIXCIsXCJpc2luZG90XCI6XCLii7VcIixcImlzaW5FXCI6XCLii7lcIixcImlzaW5zXCI6XCLii7RcIixcImlzaW5zdlwiOlwi4ouzXCIsXCJpc2ludlwiOlwi4oiIXCIsXCJpdFwiOlwi4oGiXCIsXCJJdGlsZGVcIjpcIsSoXCIsXCJpdGlsZGVcIjpcIsSpXCIsXCJJdWtjeVwiOlwi0IZcIixcIml1a2N5XCI6XCLRllwiLFwiSXVtbFwiOlwiw49cIixcIml1bWxcIjpcIsOvXCIsXCJKY2lyY1wiOlwixLRcIixcImpjaXJjXCI6XCLEtVwiLFwiSmN5XCI6XCLQmVwiLFwiamN5XCI6XCLQuVwiLFwiSmZyXCI6XCLwnZSNXCIsXCJqZnJcIjpcIvCdlKdcIixcImptYXRoXCI6XCLIt1wiLFwiSm9wZlwiOlwi8J2VgVwiLFwiam9wZlwiOlwi8J2Vm1wiLFwiSnNjclwiOlwi8J2SpVwiLFwianNjclwiOlwi8J2Sv1wiLFwiSnNlcmN5XCI6XCLQiFwiLFwianNlcmN5XCI6XCLRmFwiLFwiSnVrY3lcIjpcItCEXCIsXCJqdWtjeVwiOlwi0ZRcIixcIkthcHBhXCI6XCLOmlwiLFwia2FwcGFcIjpcIs66XCIsXCJrYXBwYXZcIjpcIs+wXCIsXCJLY2VkaWxcIjpcIsS2XCIsXCJrY2VkaWxcIjpcIsS3XCIsXCJLY3lcIjpcItCaXCIsXCJrY3lcIjpcItC6XCIsXCJLZnJcIjpcIvCdlI5cIixcImtmclwiOlwi8J2UqFwiLFwia2dyZWVuXCI6XCLEuFwiLFwiS0hjeVwiOlwi0KVcIixcImtoY3lcIjpcItGFXCIsXCJLSmN5XCI6XCLQjFwiLFwia2pjeVwiOlwi0ZxcIixcIktvcGZcIjpcIvCdlYJcIixcImtvcGZcIjpcIvCdlZxcIixcIktzY3JcIjpcIvCdkqZcIixcImtzY3JcIjpcIvCdk4BcIixcImxBYXJyXCI6XCLih5pcIixcIkxhY3V0ZVwiOlwixLlcIixcImxhY3V0ZVwiOlwixLpcIixcImxhZW1wdHl2XCI6XCLiprRcIixcImxhZ3JhblwiOlwi4oSSXCIsXCJMYW1iZGFcIjpcIs6bXCIsXCJsYW1iZGFcIjpcIs67XCIsXCJsYW5nXCI6XCLin6hcIixcIkxhbmdcIjpcIuKfqlwiLFwibGFuZ2RcIjpcIuKmkVwiLFwibGFuZ2xlXCI6XCLin6hcIixcImxhcFwiOlwi4qqFXCIsXCJMYXBsYWNldHJmXCI6XCLihJJcIixcImxhcXVvXCI6XCLCq1wiLFwibGFycmJcIjpcIuKHpFwiLFwibGFycmJmc1wiOlwi4qSfXCIsXCJsYXJyXCI6XCLihpBcIixcIkxhcnJcIjpcIuKGnlwiLFwibEFyclwiOlwi4oeQXCIsXCJsYXJyZnNcIjpcIuKknVwiLFwibGFycmhrXCI6XCLihqlcIixcImxhcnJscFwiOlwi4oarXCIsXCJsYXJycGxcIjpcIuKkuVwiLFwibGFycnNpbVwiOlwi4qWzXCIsXCJsYXJydGxcIjpcIuKGolwiLFwibGF0YWlsXCI6XCLipJlcIixcImxBdGFpbFwiOlwi4qSbXCIsXCJsYXRcIjpcIuKqq1wiLFwibGF0ZVwiOlwi4qqtXCIsXCJsYXRlc1wiOlwi4qqt77iAXCIsXCJsYmFyclwiOlwi4qSMXCIsXCJsQmFyclwiOlwi4qSOXCIsXCJsYmJya1wiOlwi4p2yXCIsXCJsYnJhY2VcIjpcIntcIixcImxicmFja1wiOlwiW1wiLFwibGJya2VcIjpcIuKmi1wiLFwibGJya3NsZFwiOlwi4qaPXCIsXCJsYnJrc2x1XCI6XCLipo1cIixcIkxjYXJvblwiOlwixL1cIixcImxjYXJvblwiOlwixL5cIixcIkxjZWRpbFwiOlwixLtcIixcImxjZWRpbFwiOlwixLxcIixcImxjZWlsXCI6XCLijIhcIixcImxjdWJcIjpcIntcIixcIkxjeVwiOlwi0JtcIixcImxjeVwiOlwi0LtcIixcImxkY2FcIjpcIuKktlwiLFwibGRxdW9cIjpcIuKAnFwiLFwibGRxdW9yXCI6XCLigJ5cIixcImxkcmRoYXJcIjpcIuKlp1wiLFwibGRydXNoYXJcIjpcIuKli1wiLFwibGRzaFwiOlwi4oayXCIsXCJsZVwiOlwi4omkXCIsXCJsRVwiOlwi4ommXCIsXCJMZWZ0QW5nbGVCcmFja2V0XCI6XCLin6hcIixcIkxlZnRBcnJvd0JhclwiOlwi4oekXCIsXCJsZWZ0YXJyb3dcIjpcIuKGkFwiLFwiTGVmdEFycm93XCI6XCLihpBcIixcIkxlZnRhcnJvd1wiOlwi4oeQXCIsXCJMZWZ0QXJyb3dSaWdodEFycm93XCI6XCLih4ZcIixcImxlZnRhcnJvd3RhaWxcIjpcIuKGolwiLFwiTGVmdENlaWxpbmdcIjpcIuKMiFwiLFwiTGVmdERvdWJsZUJyYWNrZXRcIjpcIuKfplwiLFwiTGVmdERvd25UZWVWZWN0b3JcIjpcIuKloVwiLFwiTGVmdERvd25WZWN0b3JCYXJcIjpcIuKlmVwiLFwiTGVmdERvd25WZWN0b3JcIjpcIuKHg1wiLFwiTGVmdEZsb29yXCI6XCLijIpcIixcImxlZnRoYXJwb29uZG93blwiOlwi4oa9XCIsXCJsZWZ0aGFycG9vbnVwXCI6XCLihrxcIixcImxlZnRsZWZ0YXJyb3dzXCI6XCLih4dcIixcImxlZnRyaWdodGFycm93XCI6XCLihpRcIixcIkxlZnRSaWdodEFycm93XCI6XCLihpRcIixcIkxlZnRyaWdodGFycm93XCI6XCLih5RcIixcImxlZnRyaWdodGFycm93c1wiOlwi4oeGXCIsXCJsZWZ0cmlnaHRoYXJwb29uc1wiOlwi4oeLXCIsXCJsZWZ0cmlnaHRzcXVpZ2Fycm93XCI6XCLihq1cIixcIkxlZnRSaWdodFZlY3RvclwiOlwi4qWOXCIsXCJMZWZ0VGVlQXJyb3dcIjpcIuKGpFwiLFwiTGVmdFRlZVwiOlwi4oqjXCIsXCJMZWZ0VGVlVmVjdG9yXCI6XCLipZpcIixcImxlZnR0aHJlZXRpbWVzXCI6XCLii4tcIixcIkxlZnRUcmlhbmdsZUJhclwiOlwi4qePXCIsXCJMZWZ0VHJpYW5nbGVcIjpcIuKKslwiLFwiTGVmdFRyaWFuZ2xlRXF1YWxcIjpcIuKKtFwiLFwiTGVmdFVwRG93blZlY3RvclwiOlwi4qWRXCIsXCJMZWZ0VXBUZWVWZWN0b3JcIjpcIuKloFwiLFwiTGVmdFVwVmVjdG9yQmFyXCI6XCLipZhcIixcIkxlZnRVcFZlY3RvclwiOlwi4oa/XCIsXCJMZWZ0VmVjdG9yQmFyXCI6XCLipZJcIixcIkxlZnRWZWN0b3JcIjpcIuKGvFwiLFwibEVnXCI6XCLiqotcIixcImxlZ1wiOlwi4ouaXCIsXCJsZXFcIjpcIuKJpFwiLFwibGVxcVwiOlwi4ommXCIsXCJsZXFzbGFudFwiOlwi4qm9XCIsXCJsZXNjY1wiOlwi4qqoXCIsXCJsZXNcIjpcIuKpvVwiLFwibGVzZG90XCI6XCLiqb9cIixcImxlc2RvdG9cIjpcIuKqgVwiLFwibGVzZG90b3JcIjpcIuKqg1wiLFwibGVzZ1wiOlwi4oua77iAXCIsXCJsZXNnZXNcIjpcIuKqk1wiLFwibGVzc2FwcHJveFwiOlwi4qqFXCIsXCJsZXNzZG90XCI6XCLii5ZcIixcImxlc3NlcWd0clwiOlwi4ouaXCIsXCJsZXNzZXFxZ3RyXCI6XCLiqotcIixcIkxlc3NFcXVhbEdyZWF0ZXJcIjpcIuKLmlwiLFwiTGVzc0Z1bGxFcXVhbFwiOlwi4ommXCIsXCJMZXNzR3JlYXRlclwiOlwi4om2XCIsXCJsZXNzZ3RyXCI6XCLiibZcIixcIkxlc3NMZXNzXCI6XCLiqqFcIixcImxlc3NzaW1cIjpcIuKJslwiLFwiTGVzc1NsYW50RXF1YWxcIjpcIuKpvVwiLFwiTGVzc1RpbGRlXCI6XCLiibJcIixcImxmaXNodFwiOlwi4qW8XCIsXCJsZmxvb3JcIjpcIuKMilwiLFwiTGZyXCI6XCLwnZSPXCIsXCJsZnJcIjpcIvCdlKlcIixcImxnXCI6XCLiibZcIixcImxnRVwiOlwi4qqRXCIsXCJsSGFyXCI6XCLipaJcIixcImxoYXJkXCI6XCLihr1cIixcImxoYXJ1XCI6XCLihrxcIixcImxoYXJ1bFwiOlwi4qWqXCIsXCJsaGJsa1wiOlwi4paEXCIsXCJMSmN5XCI6XCLQiVwiLFwibGpjeVwiOlwi0ZlcIixcImxsYXJyXCI6XCLih4dcIixcImxsXCI6XCLiiapcIixcIkxsXCI6XCLii5hcIixcImxsY29ybmVyXCI6XCLijJ5cIixcIkxsZWZ0YXJyb3dcIjpcIuKHmlwiLFwibGxoYXJkXCI6XCLipatcIixcImxsdHJpXCI6XCLil7pcIixcIkxtaWRvdFwiOlwixL9cIixcImxtaWRvdFwiOlwixYBcIixcImxtb3VzdGFjaGVcIjpcIuKOsFwiLFwibG1vdXN0XCI6XCLijrBcIixcImxuYXBcIjpcIuKqiVwiLFwibG5hcHByb3hcIjpcIuKqiVwiLFwibG5lXCI6XCLiqodcIixcImxuRVwiOlwi4omoXCIsXCJsbmVxXCI6XCLiqodcIixcImxuZXFxXCI6XCLiiahcIixcImxuc2ltXCI6XCLii6ZcIixcImxvYW5nXCI6XCLin6xcIixcImxvYXJyXCI6XCLih71cIixcImxvYnJrXCI6XCLin6ZcIixcImxvbmdsZWZ0YXJyb3dcIjpcIuKftVwiLFwiTG9uZ0xlZnRBcnJvd1wiOlwi4p+1XCIsXCJMb25nbGVmdGFycm93XCI6XCLin7hcIixcImxvbmdsZWZ0cmlnaHRhcnJvd1wiOlwi4p+3XCIsXCJMb25nTGVmdFJpZ2h0QXJyb3dcIjpcIuKft1wiLFwiTG9uZ2xlZnRyaWdodGFycm93XCI6XCLin7pcIixcImxvbmdtYXBzdG9cIjpcIuKfvFwiLFwibG9uZ3JpZ2h0YXJyb3dcIjpcIuKftlwiLFwiTG9uZ1JpZ2h0QXJyb3dcIjpcIuKftlwiLFwiTG9uZ3JpZ2h0YXJyb3dcIjpcIuKfuVwiLFwibG9vcGFycm93bGVmdFwiOlwi4oarXCIsXCJsb29wYXJyb3dyaWdodFwiOlwi4oasXCIsXCJsb3BhclwiOlwi4qaFXCIsXCJMb3BmXCI6XCLwnZWDXCIsXCJsb3BmXCI6XCLwnZWdXCIsXCJsb3BsdXNcIjpcIuKorVwiLFwibG90aW1lc1wiOlwi4qi0XCIsXCJsb3dhc3RcIjpcIuKIl1wiLFwibG93YmFyXCI6XCJfXCIsXCJMb3dlckxlZnRBcnJvd1wiOlwi4oaZXCIsXCJMb3dlclJpZ2h0QXJyb3dcIjpcIuKGmFwiLFwibG96XCI6XCLil4pcIixcImxvemVuZ2VcIjpcIuKXilwiLFwibG96ZlwiOlwi4qerXCIsXCJscGFyXCI6XCIoXCIsXCJscGFybHRcIjpcIuKmk1wiLFwibHJhcnJcIjpcIuKHhlwiLFwibHJjb3JuZXJcIjpcIuKMn1wiLFwibHJoYXJcIjpcIuKHi1wiLFwibHJoYXJkXCI6XCLipa1cIixcImxybVwiOlwi4oCOXCIsXCJscnRyaVwiOlwi4oq/XCIsXCJsc2FxdW9cIjpcIuKAuVwiLFwibHNjclwiOlwi8J2TgVwiLFwiTHNjclwiOlwi4oSSXCIsXCJsc2hcIjpcIuKGsFwiLFwiTHNoXCI6XCLihrBcIixcImxzaW1cIjpcIuKJslwiLFwibHNpbWVcIjpcIuKqjVwiLFwibHNpbWdcIjpcIuKqj1wiLFwibHNxYlwiOlwiW1wiLFwibHNxdW9cIjpcIuKAmFwiLFwibHNxdW9yXCI6XCLigJpcIixcIkxzdHJva1wiOlwixYFcIixcImxzdHJva1wiOlwixYJcIixcImx0Y2NcIjpcIuKqplwiLFwibHRjaXJcIjpcIuKpuVwiLFwibHRcIjpcIjxcIixcIkxUXCI6XCI8XCIsXCJMdFwiOlwi4omqXCIsXCJsdGRvdFwiOlwi4ouWXCIsXCJsdGhyZWVcIjpcIuKLi1wiLFwibHRpbWVzXCI6XCLii4lcIixcImx0bGFyclwiOlwi4qW2XCIsXCJsdHF1ZXN0XCI6XCLiqbtcIixcImx0cmlcIjpcIuKXg1wiLFwibHRyaWVcIjpcIuKKtFwiLFwibHRyaWZcIjpcIuKXglwiLFwibHRyUGFyXCI6XCLippZcIixcImx1cmRzaGFyXCI6XCLipYpcIixcImx1cnVoYXJcIjpcIuKlplwiLFwibHZlcnRuZXFxXCI6XCLiiajvuIBcIixcImx2bkVcIjpcIuKJqO+4gFwiLFwibWFjclwiOlwiwq9cIixcIm1hbGVcIjpcIuKZglwiLFwibWFsdFwiOlwi4pygXCIsXCJtYWx0ZXNlXCI6XCLinKBcIixcIk1hcFwiOlwi4qSFXCIsXCJtYXBcIjpcIuKGplwiLFwibWFwc3RvXCI6XCLihqZcIixcIm1hcHN0b2Rvd25cIjpcIuKGp1wiLFwibWFwc3RvbGVmdFwiOlwi4oakXCIsXCJtYXBzdG91cFwiOlwi4oalXCIsXCJtYXJrZXJcIjpcIuKWrlwiLFwibWNvbW1hXCI6XCLiqKlcIixcIk1jeVwiOlwi0JxcIixcIm1jeVwiOlwi0LxcIixcIm1kYXNoXCI6XCLigJRcIixcIm1ERG90XCI6XCLiiLpcIixcIm1lYXN1cmVkYW5nbGVcIjpcIuKIoVwiLFwiTWVkaXVtU3BhY2VcIjpcIuKBn1wiLFwiTWVsbGludHJmXCI6XCLihLNcIixcIk1mclwiOlwi8J2UkFwiLFwibWZyXCI6XCLwnZSqXCIsXCJtaG9cIjpcIuKEp1wiLFwibWljcm9cIjpcIsK1XCIsXCJtaWRhc3RcIjpcIipcIixcIm1pZGNpclwiOlwi4quwXCIsXCJtaWRcIjpcIuKIo1wiLFwibWlkZG90XCI6XCLCt1wiLFwibWludXNiXCI6XCLiip9cIixcIm1pbnVzXCI6XCLiiJJcIixcIm1pbnVzZFwiOlwi4oi4XCIsXCJtaW51c2R1XCI6XCLiqKpcIixcIk1pbnVzUGx1c1wiOlwi4oiTXCIsXCJtbGNwXCI6XCLiq5tcIixcIm1sZHJcIjpcIuKAplwiLFwibW5wbHVzXCI6XCLiiJNcIixcIm1vZGVsc1wiOlwi4oqnXCIsXCJNb3BmXCI6XCLwnZWEXCIsXCJtb3BmXCI6XCLwnZWeXCIsXCJtcFwiOlwi4oiTXCIsXCJtc2NyXCI6XCLwnZOCXCIsXCJNc2NyXCI6XCLihLNcIixcIm1zdHBvc1wiOlwi4oi+XCIsXCJNdVwiOlwizpxcIixcIm11XCI6XCLOvFwiLFwibXVsdGltYXBcIjpcIuKKuFwiLFwibXVtYXBcIjpcIuKKuFwiLFwibmFibGFcIjpcIuKIh1wiLFwiTmFjdXRlXCI6XCLFg1wiLFwibmFjdXRlXCI6XCLFhFwiLFwibmFuZ1wiOlwi4oig4oOSXCIsXCJuYXBcIjpcIuKJiVwiLFwibmFwRVwiOlwi4qmwzLhcIixcIm5hcGlkXCI6XCLiiYvMuFwiLFwibmFwb3NcIjpcIsWJXCIsXCJuYXBwcm94XCI6XCLiiYlcIixcIm5hdHVyYWxcIjpcIuKZrlwiLFwibmF0dXJhbHNcIjpcIuKElVwiLFwibmF0dXJcIjpcIuKZrlwiLFwibmJzcFwiOlwiwqBcIixcIm5idW1wXCI6XCLiiY7MuFwiLFwibmJ1bXBlXCI6XCLiiY/MuFwiLFwibmNhcFwiOlwi4qmDXCIsXCJOY2Fyb25cIjpcIsWHXCIsXCJuY2Fyb25cIjpcIsWIXCIsXCJOY2VkaWxcIjpcIsWFXCIsXCJuY2VkaWxcIjpcIsWGXCIsXCJuY29uZ1wiOlwi4omHXCIsXCJuY29uZ2RvdFwiOlwi4qmtzLhcIixcIm5jdXBcIjpcIuKpglwiLFwiTmN5XCI6XCLQnVwiLFwibmN5XCI6XCLQvVwiLFwibmRhc2hcIjpcIuKAk1wiLFwibmVhcmhrXCI6XCLipKRcIixcIm5lYXJyXCI6XCLihpdcIixcIm5lQXJyXCI6XCLih5dcIixcIm5lYXJyb3dcIjpcIuKGl1wiLFwibmVcIjpcIuKJoFwiLFwibmVkb3RcIjpcIuKJkMy4XCIsXCJOZWdhdGl2ZU1lZGl1bVNwYWNlXCI6XCLigItcIixcIk5lZ2F0aXZlVGhpY2tTcGFjZVwiOlwi4oCLXCIsXCJOZWdhdGl2ZVRoaW5TcGFjZVwiOlwi4oCLXCIsXCJOZWdhdGl2ZVZlcnlUaGluU3BhY2VcIjpcIuKAi1wiLFwibmVxdWl2XCI6XCLiiaJcIixcIm5lc2VhclwiOlwi4qSoXCIsXCJuZXNpbVwiOlwi4omCzLhcIixcIk5lc3RlZEdyZWF0ZXJHcmVhdGVyXCI6XCLiiatcIixcIk5lc3RlZExlc3NMZXNzXCI6XCLiiapcIixcIk5ld0xpbmVcIjpcIlxcblwiLFwibmV4aXN0XCI6XCLiiIRcIixcIm5leGlzdHNcIjpcIuKIhFwiLFwiTmZyXCI6XCLwnZSRXCIsXCJuZnJcIjpcIvCdlKtcIixcIm5nRVwiOlwi4omnzLhcIixcIm5nZVwiOlwi4omxXCIsXCJuZ2VxXCI6XCLiibFcIixcIm5nZXFxXCI6XCLiiafMuFwiLFwibmdlcXNsYW50XCI6XCLiqb7MuFwiLFwibmdlc1wiOlwi4qm+zLhcIixcIm5HZ1wiOlwi4ouZzLhcIixcIm5nc2ltXCI6XCLiibVcIixcIm5HdFwiOlwi4omr4oOSXCIsXCJuZ3RcIjpcIuKJr1wiLFwibmd0clwiOlwi4omvXCIsXCJuR3R2XCI6XCLiiavMuFwiLFwibmhhcnJcIjpcIuKGrlwiLFwibmhBcnJcIjpcIuKHjlwiLFwibmhwYXJcIjpcIuKrslwiLFwibmlcIjpcIuKIi1wiLFwibmlzXCI6XCLii7xcIixcIm5pc2RcIjpcIuKLulwiLFwibml2XCI6XCLiiItcIixcIk5KY3lcIjpcItCKXCIsXCJuamN5XCI6XCLRmlwiLFwibmxhcnJcIjpcIuKGmlwiLFwibmxBcnJcIjpcIuKHjVwiLFwibmxkclwiOlwi4oClXCIsXCJubEVcIjpcIuKJpsy4XCIsXCJubGVcIjpcIuKJsFwiLFwibmxlZnRhcnJvd1wiOlwi4oaaXCIsXCJuTGVmdGFycm93XCI6XCLih41cIixcIm5sZWZ0cmlnaHRhcnJvd1wiOlwi4oauXCIsXCJuTGVmdHJpZ2h0YXJyb3dcIjpcIuKHjlwiLFwibmxlcVwiOlwi4omwXCIsXCJubGVxcVwiOlwi4ommzLhcIixcIm5sZXFzbGFudFwiOlwi4qm9zLhcIixcIm5sZXNcIjpcIuKpvcy4XCIsXCJubGVzc1wiOlwi4omuXCIsXCJuTGxcIjpcIuKLmMy4XCIsXCJubHNpbVwiOlwi4om0XCIsXCJuTHRcIjpcIuKJquKDklwiLFwibmx0XCI6XCLiia5cIixcIm5sdHJpXCI6XCLii6pcIixcIm5sdHJpZVwiOlwi4ousXCIsXCJuTHR2XCI6XCLiiarMuFwiLFwibm1pZFwiOlwi4oikXCIsXCJOb0JyZWFrXCI6XCLigaBcIixcIk5vbkJyZWFraW5nU3BhY2VcIjpcIsKgXCIsXCJub3BmXCI6XCLwnZWfXCIsXCJOb3BmXCI6XCLihJVcIixcIk5vdFwiOlwi4qusXCIsXCJub3RcIjpcIsKsXCIsXCJOb3RDb25ncnVlbnRcIjpcIuKJolwiLFwiTm90Q3VwQ2FwXCI6XCLiia1cIixcIk5vdERvdWJsZVZlcnRpY2FsQmFyXCI6XCLiiKZcIixcIk5vdEVsZW1lbnRcIjpcIuKIiVwiLFwiTm90RXF1YWxcIjpcIuKJoFwiLFwiTm90RXF1YWxUaWxkZVwiOlwi4omCzLhcIixcIk5vdEV4aXN0c1wiOlwi4oiEXCIsXCJOb3RHcmVhdGVyXCI6XCLiia9cIixcIk5vdEdyZWF0ZXJFcXVhbFwiOlwi4omxXCIsXCJOb3RHcmVhdGVyRnVsbEVxdWFsXCI6XCLiiafMuFwiLFwiTm90R3JlYXRlckdyZWF0ZXJcIjpcIuKJq8y4XCIsXCJOb3RHcmVhdGVyTGVzc1wiOlwi4om5XCIsXCJOb3RHcmVhdGVyU2xhbnRFcXVhbFwiOlwi4qm+zLhcIixcIk5vdEdyZWF0ZXJUaWxkZVwiOlwi4om1XCIsXCJOb3RIdW1wRG93bkh1bXBcIjpcIuKJjsy4XCIsXCJOb3RIdW1wRXF1YWxcIjpcIuKJj8y4XCIsXCJub3RpblwiOlwi4oiJXCIsXCJub3RpbmRvdFwiOlwi4ou1zLhcIixcIm5vdGluRVwiOlwi4ou5zLhcIixcIm5vdGludmFcIjpcIuKIiVwiLFwibm90aW52YlwiOlwi4ou3XCIsXCJub3RpbnZjXCI6XCLii7ZcIixcIk5vdExlZnRUcmlhbmdsZUJhclwiOlwi4qePzLhcIixcIk5vdExlZnRUcmlhbmdsZVwiOlwi4ouqXCIsXCJOb3RMZWZ0VHJpYW5nbGVFcXVhbFwiOlwi4ousXCIsXCJOb3RMZXNzXCI6XCLiia5cIixcIk5vdExlc3NFcXVhbFwiOlwi4omwXCIsXCJOb3RMZXNzR3JlYXRlclwiOlwi4om4XCIsXCJOb3RMZXNzTGVzc1wiOlwi4omqzLhcIixcIk5vdExlc3NTbGFudEVxdWFsXCI6XCLiqb3MuFwiLFwiTm90TGVzc1RpbGRlXCI6XCLiibRcIixcIk5vdE5lc3RlZEdyZWF0ZXJHcmVhdGVyXCI6XCLiqqLMuFwiLFwiTm90TmVzdGVkTGVzc0xlc3NcIjpcIuKqocy4XCIsXCJub3RuaVwiOlwi4oiMXCIsXCJub3RuaXZhXCI6XCLiiIxcIixcIm5vdG5pdmJcIjpcIuKLvlwiLFwibm90bml2Y1wiOlwi4ou9XCIsXCJOb3RQcmVjZWRlc1wiOlwi4oqAXCIsXCJOb3RQcmVjZWRlc0VxdWFsXCI6XCLiqq/MuFwiLFwiTm90UHJlY2VkZXNTbGFudEVxdWFsXCI6XCLii6BcIixcIk5vdFJldmVyc2VFbGVtZW50XCI6XCLiiIxcIixcIk5vdFJpZ2h0VHJpYW5nbGVCYXJcIjpcIuKnkMy4XCIsXCJOb3RSaWdodFRyaWFuZ2xlXCI6XCLii6tcIixcIk5vdFJpZ2h0VHJpYW5nbGVFcXVhbFwiOlwi4outXCIsXCJOb3RTcXVhcmVTdWJzZXRcIjpcIuKKj8y4XCIsXCJOb3RTcXVhcmVTdWJzZXRFcXVhbFwiOlwi4ouiXCIsXCJOb3RTcXVhcmVTdXBlcnNldFwiOlwi4oqQzLhcIixcIk5vdFNxdWFyZVN1cGVyc2V0RXF1YWxcIjpcIuKLo1wiLFwiTm90U3Vic2V0XCI6XCLiioLig5JcIixcIk5vdFN1YnNldEVxdWFsXCI6XCLiiohcIixcIk5vdFN1Y2NlZWRzXCI6XCLiioFcIixcIk5vdFN1Y2NlZWRzRXF1YWxcIjpcIuKqsMy4XCIsXCJOb3RTdWNjZWVkc1NsYW50RXF1YWxcIjpcIuKLoVwiLFwiTm90U3VjY2VlZHNUaWxkZVwiOlwi4om/zLhcIixcIk5vdFN1cGVyc2V0XCI6XCLiioPig5JcIixcIk5vdFN1cGVyc2V0RXF1YWxcIjpcIuKKiVwiLFwiTm90VGlsZGVcIjpcIuKJgVwiLFwiTm90VGlsZGVFcXVhbFwiOlwi4omEXCIsXCJOb3RUaWxkZUZ1bGxFcXVhbFwiOlwi4omHXCIsXCJOb3RUaWxkZVRpbGRlXCI6XCLiiYlcIixcIk5vdFZlcnRpY2FsQmFyXCI6XCLiiKRcIixcIm5wYXJhbGxlbFwiOlwi4oimXCIsXCJucGFyXCI6XCLiiKZcIixcIm5wYXJzbFwiOlwi4qu94oOlXCIsXCJucGFydFwiOlwi4oiCzLhcIixcIm5wb2xpbnRcIjpcIuKolFwiLFwibnByXCI6XCLiioBcIixcIm5wcmN1ZVwiOlwi4ougXCIsXCJucHJlY1wiOlwi4oqAXCIsXCJucHJlY2VxXCI6XCLiqq/MuFwiLFwibnByZVwiOlwi4qqvzLhcIixcIm5yYXJyY1wiOlwi4qSzzLhcIixcIm5yYXJyXCI6XCLihptcIixcIm5yQXJyXCI6XCLih49cIixcIm5yYXJyd1wiOlwi4oadzLhcIixcIm5yaWdodGFycm93XCI6XCLihptcIixcIm5SaWdodGFycm93XCI6XCLih49cIixcIm5ydHJpXCI6XCLii6tcIixcIm5ydHJpZVwiOlwi4outXCIsXCJuc2NcIjpcIuKKgVwiLFwibnNjY3VlXCI6XCLii6FcIixcIm5zY2VcIjpcIuKqsMy4XCIsXCJOc2NyXCI6XCLwnZKpXCIsXCJuc2NyXCI6XCLwnZODXCIsXCJuc2hvcnRtaWRcIjpcIuKIpFwiLFwibnNob3J0cGFyYWxsZWxcIjpcIuKIplwiLFwibnNpbVwiOlwi4omBXCIsXCJuc2ltZVwiOlwi4omEXCIsXCJuc2ltZXFcIjpcIuKJhFwiLFwibnNtaWRcIjpcIuKIpFwiLFwibnNwYXJcIjpcIuKIplwiLFwibnNxc3ViZVwiOlwi4ouiXCIsXCJuc3FzdXBlXCI6XCLii6NcIixcIm5zdWJcIjpcIuKKhFwiLFwibnN1YkVcIjpcIuKrhcy4XCIsXCJuc3ViZVwiOlwi4oqIXCIsXCJuc3Vic2V0XCI6XCLiioLig5JcIixcIm5zdWJzZXRlcVwiOlwi4oqIXCIsXCJuc3Vic2V0ZXFxXCI6XCLiq4XMuFwiLFwibnN1Y2NcIjpcIuKKgVwiLFwibnN1Y2NlcVwiOlwi4qqwzLhcIixcIm5zdXBcIjpcIuKKhVwiLFwibnN1cEVcIjpcIuKrhsy4XCIsXCJuc3VwZVwiOlwi4oqJXCIsXCJuc3Vwc2V0XCI6XCLiioPig5JcIixcIm5zdXBzZXRlcVwiOlwi4oqJXCIsXCJuc3Vwc2V0ZXFxXCI6XCLiq4bMuFwiLFwibnRnbFwiOlwi4om5XCIsXCJOdGlsZGVcIjpcIsORXCIsXCJudGlsZGVcIjpcIsOxXCIsXCJudGxnXCI6XCLiibhcIixcIm50cmlhbmdsZWxlZnRcIjpcIuKLqlwiLFwibnRyaWFuZ2xlbGVmdGVxXCI6XCLii6xcIixcIm50cmlhbmdsZXJpZ2h0XCI6XCLii6tcIixcIm50cmlhbmdsZXJpZ2h0ZXFcIjpcIuKLrVwiLFwiTnVcIjpcIs6dXCIsXCJudVwiOlwizr1cIixcIm51bVwiOlwiI1wiLFwibnVtZXJvXCI6XCLihJZcIixcIm51bXNwXCI6XCLigIdcIixcIm52YXBcIjpcIuKJjeKDklwiLFwibnZkYXNoXCI6XCLiiqxcIixcIm52RGFzaFwiOlwi4oqtXCIsXCJuVmRhc2hcIjpcIuKKrlwiLFwiblZEYXNoXCI6XCLiiq9cIixcIm52Z2VcIjpcIuKJpeKDklwiLFwibnZndFwiOlwiPuKDklwiLFwibnZIYXJyXCI6XCLipIRcIixcIm52aW5maW5cIjpcIuKnnlwiLFwibnZsQXJyXCI6XCLipIJcIixcIm52bGVcIjpcIuKJpOKDklwiLFwibnZsdFwiOlwiPOKDklwiLFwibnZsdHJpZVwiOlwi4oq04oOSXCIsXCJudnJBcnJcIjpcIuKkg1wiLFwibnZydHJpZVwiOlwi4oq14oOSXCIsXCJudnNpbVwiOlwi4oi84oOSXCIsXCJud2FyaGtcIjpcIuKko1wiLFwibndhcnJcIjpcIuKGllwiLFwibndBcnJcIjpcIuKHllwiLFwibndhcnJvd1wiOlwi4oaWXCIsXCJud25lYXJcIjpcIuKkp1wiLFwiT2FjdXRlXCI6XCLDk1wiLFwib2FjdXRlXCI6XCLDs1wiLFwib2FzdFwiOlwi4oqbXCIsXCJPY2lyY1wiOlwiw5RcIixcIm9jaXJjXCI6XCLDtFwiLFwib2NpclwiOlwi4oqaXCIsXCJPY3lcIjpcItCeXCIsXCJvY3lcIjpcItC+XCIsXCJvZGFzaFwiOlwi4oqdXCIsXCJPZGJsYWNcIjpcIsWQXCIsXCJvZGJsYWNcIjpcIsWRXCIsXCJvZGl2XCI6XCLiqLhcIixcIm9kb3RcIjpcIuKKmVwiLFwib2Rzb2xkXCI6XCLiprxcIixcIk9FbGlnXCI6XCLFklwiLFwib2VsaWdcIjpcIsWTXCIsXCJvZmNpclwiOlwi4qa/XCIsXCJPZnJcIjpcIvCdlJJcIixcIm9mclwiOlwi8J2UrFwiLFwib2dvblwiOlwiy5tcIixcIk9ncmF2ZVwiOlwiw5JcIixcIm9ncmF2ZVwiOlwiw7JcIixcIm9ndFwiOlwi4qeBXCIsXCJvaGJhclwiOlwi4qa1XCIsXCJvaG1cIjpcIs6pXCIsXCJvaW50XCI6XCLiiK5cIixcIm9sYXJyXCI6XCLihrpcIixcIm9sY2lyXCI6XCLipr5cIixcIm9sY3Jvc3NcIjpcIuKmu1wiLFwib2xpbmVcIjpcIuKAvlwiLFwib2x0XCI6XCLip4BcIixcIk9tYWNyXCI6XCLFjFwiLFwib21hY3JcIjpcIsWNXCIsXCJPbWVnYVwiOlwizqlcIixcIm9tZWdhXCI6XCLPiVwiLFwiT21pY3JvblwiOlwizp9cIixcIm9taWNyb25cIjpcIs6/XCIsXCJvbWlkXCI6XCLiprZcIixcIm9taW51c1wiOlwi4oqWXCIsXCJPb3BmXCI6XCLwnZWGXCIsXCJvb3BmXCI6XCLwnZWgXCIsXCJvcGFyXCI6XCLiprdcIixcIk9wZW5DdXJseURvdWJsZVF1b3RlXCI6XCLigJxcIixcIk9wZW5DdXJseVF1b3RlXCI6XCLigJhcIixcIm9wZXJwXCI6XCLiprlcIixcIm9wbHVzXCI6XCLiipVcIixcIm9yYXJyXCI6XCLihrtcIixcIk9yXCI6XCLiqZRcIixcIm9yXCI6XCLiiKhcIixcIm9yZFwiOlwi4qmdXCIsXCJvcmRlclwiOlwi4oS0XCIsXCJvcmRlcm9mXCI6XCLihLRcIixcIm9yZGZcIjpcIsKqXCIsXCJvcmRtXCI6XCLCulwiLFwib3JpZ29mXCI6XCLiirZcIixcIm9yb3JcIjpcIuKpllwiLFwib3JzbG9wZVwiOlwi4qmXXCIsXCJvcnZcIjpcIuKpm1wiLFwib1NcIjpcIuKTiFwiLFwiT3NjclwiOlwi8J2SqlwiLFwib3NjclwiOlwi4oS0XCIsXCJPc2xhc2hcIjpcIsOYXCIsXCJvc2xhc2hcIjpcIsO4XCIsXCJvc29sXCI6XCLiiphcIixcIk90aWxkZVwiOlwiw5VcIixcIm90aWxkZVwiOlwiw7VcIixcIm90aW1lc2FzXCI6XCLiqLZcIixcIk90aW1lc1wiOlwi4qi3XCIsXCJvdGltZXNcIjpcIuKKl1wiLFwiT3VtbFwiOlwiw5ZcIixcIm91bWxcIjpcIsO2XCIsXCJvdmJhclwiOlwi4oy9XCIsXCJPdmVyQmFyXCI6XCLigL5cIixcIk92ZXJCcmFjZVwiOlwi4o+eXCIsXCJPdmVyQnJhY2tldFwiOlwi4o60XCIsXCJPdmVyUGFyZW50aGVzaXNcIjpcIuKPnFwiLFwicGFyYVwiOlwiwrZcIixcInBhcmFsbGVsXCI6XCLiiKVcIixcInBhclwiOlwi4oilXCIsXCJwYXJzaW1cIjpcIuKrs1wiLFwicGFyc2xcIjpcIuKrvVwiLFwicGFydFwiOlwi4oiCXCIsXCJQYXJ0aWFsRFwiOlwi4oiCXCIsXCJQY3lcIjpcItCfXCIsXCJwY3lcIjpcItC/XCIsXCJwZXJjbnRcIjpcIiVcIixcInBlcmlvZFwiOlwiLlwiLFwicGVybWlsXCI6XCLigLBcIixcInBlcnBcIjpcIuKKpVwiLFwicGVydGVua1wiOlwi4oCxXCIsXCJQZnJcIjpcIvCdlJNcIixcInBmclwiOlwi8J2UrVwiLFwiUGhpXCI6XCLOplwiLFwicGhpXCI6XCLPhlwiLFwicGhpdlwiOlwiz5VcIixcInBobW1hdFwiOlwi4oSzXCIsXCJwaG9uZVwiOlwi4piOXCIsXCJQaVwiOlwizqBcIixcInBpXCI6XCLPgFwiLFwicGl0Y2hmb3JrXCI6XCLii5RcIixcInBpdlwiOlwiz5ZcIixcInBsYW5ja1wiOlwi4oSPXCIsXCJwbGFuY2toXCI6XCLihI5cIixcInBsYW5rdlwiOlwi4oSPXCIsXCJwbHVzYWNpclwiOlwi4qijXCIsXCJwbHVzYlwiOlwi4oqeXCIsXCJwbHVzY2lyXCI6XCLiqKJcIixcInBsdXNcIjpcIitcIixcInBsdXNkb1wiOlwi4oiUXCIsXCJwbHVzZHVcIjpcIuKopVwiLFwicGx1c2VcIjpcIuKpslwiLFwiUGx1c01pbnVzXCI6XCLCsVwiLFwicGx1c21uXCI6XCLCsVwiLFwicGx1c3NpbVwiOlwi4qimXCIsXCJwbHVzdHdvXCI6XCLiqKdcIixcInBtXCI6XCLCsVwiLFwiUG9pbmNhcmVwbGFuZVwiOlwi4oSMXCIsXCJwb2ludGludFwiOlwi4qiVXCIsXCJwb3BmXCI6XCLwnZWhXCIsXCJQb3BmXCI6XCLihJlcIixcInBvdW5kXCI6XCLCo1wiLFwicHJhcFwiOlwi4qq3XCIsXCJQclwiOlwi4qq7XCIsXCJwclwiOlwi4om6XCIsXCJwcmN1ZVwiOlwi4om8XCIsXCJwcmVjYXBwcm94XCI6XCLiqrdcIixcInByZWNcIjpcIuKJulwiLFwicHJlY2N1cmx5ZXFcIjpcIuKJvFwiLFwiUHJlY2VkZXNcIjpcIuKJulwiLFwiUHJlY2VkZXNFcXVhbFwiOlwi4qqvXCIsXCJQcmVjZWRlc1NsYW50RXF1YWxcIjpcIuKJvFwiLFwiUHJlY2VkZXNUaWxkZVwiOlwi4om+XCIsXCJwcmVjZXFcIjpcIuKqr1wiLFwicHJlY25hcHByb3hcIjpcIuKquVwiLFwicHJlY25lcXFcIjpcIuKqtVwiLFwicHJlY25zaW1cIjpcIuKLqFwiLFwicHJlXCI6XCLiqq9cIixcInByRVwiOlwi4qqzXCIsXCJwcmVjc2ltXCI6XCLiib5cIixcInByaW1lXCI6XCLigLJcIixcIlByaW1lXCI6XCLigLNcIixcInByaW1lc1wiOlwi4oSZXCIsXCJwcm5hcFwiOlwi4qq5XCIsXCJwcm5FXCI6XCLiqrVcIixcInBybnNpbVwiOlwi4ouoXCIsXCJwcm9kXCI6XCLiiI9cIixcIlByb2R1Y3RcIjpcIuKIj1wiLFwicHJvZmFsYXJcIjpcIuKMrlwiLFwicHJvZmxpbmVcIjpcIuKMklwiLFwicHJvZnN1cmZcIjpcIuKMk1wiLFwicHJvcFwiOlwi4oidXCIsXCJQcm9wb3J0aW9uYWxcIjpcIuKInVwiLFwiUHJvcG9ydGlvblwiOlwi4oi3XCIsXCJwcm9wdG9cIjpcIuKInVwiLFwicHJzaW1cIjpcIuKJvlwiLFwicHJ1cmVsXCI6XCLiirBcIixcIlBzY3JcIjpcIvCdkqtcIixcInBzY3JcIjpcIvCdk4VcIixcIlBzaVwiOlwizqhcIixcInBzaVwiOlwiz4hcIixcInB1bmNzcFwiOlwi4oCIXCIsXCJRZnJcIjpcIvCdlJRcIixcInFmclwiOlwi8J2UrlwiLFwicWludFwiOlwi4qiMXCIsXCJxb3BmXCI6XCLwnZWiXCIsXCJRb3BmXCI6XCLihJpcIixcInFwcmltZVwiOlwi4oGXXCIsXCJRc2NyXCI6XCLwnZKsXCIsXCJxc2NyXCI6XCLwnZOGXCIsXCJxdWF0ZXJuaW9uc1wiOlwi4oSNXCIsXCJxdWF0aW50XCI6XCLiqJZcIixcInF1ZXN0XCI6XCI/XCIsXCJxdWVzdGVxXCI6XCLiiZ9cIixcInF1b3RcIjpcIlxcXCJcIixcIlFVT1RcIjpcIlxcXCJcIixcInJBYXJyXCI6XCLih5tcIixcInJhY2VcIjpcIuKIvcyxXCIsXCJSYWN1dGVcIjpcIsWUXCIsXCJyYWN1dGVcIjpcIsWVXCIsXCJyYWRpY1wiOlwi4oiaXCIsXCJyYWVtcHR5dlwiOlwi4qazXCIsXCJyYW5nXCI6XCLin6lcIixcIlJhbmdcIjpcIuKfq1wiLFwicmFuZ2RcIjpcIuKmklwiLFwicmFuZ2VcIjpcIuKmpVwiLFwicmFuZ2xlXCI6XCLin6lcIixcInJhcXVvXCI6XCLCu1wiLFwicmFycmFwXCI6XCLipbVcIixcInJhcnJiXCI6XCLih6VcIixcInJhcnJiZnNcIjpcIuKkoFwiLFwicmFycmNcIjpcIuKks1wiLFwicmFyclwiOlwi4oaSXCIsXCJSYXJyXCI6XCLihqBcIixcInJBcnJcIjpcIuKHklwiLFwicmFycmZzXCI6XCLipJ5cIixcInJhcnJoa1wiOlwi4oaqXCIsXCJyYXJybHBcIjpcIuKGrFwiLFwicmFycnBsXCI6XCLipYVcIixcInJhcnJzaW1cIjpcIuKltFwiLFwiUmFycnRsXCI6XCLipJZcIixcInJhcnJ0bFwiOlwi4oajXCIsXCJyYXJyd1wiOlwi4oadXCIsXCJyYXRhaWxcIjpcIuKkmlwiLFwickF0YWlsXCI6XCLipJxcIixcInJhdGlvXCI6XCLiiLZcIixcInJhdGlvbmFsc1wiOlwi4oSaXCIsXCJyYmFyclwiOlwi4qSNXCIsXCJyQmFyclwiOlwi4qSPXCIsXCJSQmFyclwiOlwi4qSQXCIsXCJyYmJya1wiOlwi4p2zXCIsXCJyYnJhY2VcIjpcIn1cIixcInJicmFja1wiOlwiXVwiLFwicmJya2VcIjpcIuKmjFwiLFwicmJya3NsZFwiOlwi4qaOXCIsXCJyYnJrc2x1XCI6XCLippBcIixcIlJjYXJvblwiOlwixZhcIixcInJjYXJvblwiOlwixZlcIixcIlJjZWRpbFwiOlwixZZcIixcInJjZWRpbFwiOlwixZdcIixcInJjZWlsXCI6XCLijIlcIixcInJjdWJcIjpcIn1cIixcIlJjeVwiOlwi0KBcIixcInJjeVwiOlwi0YBcIixcInJkY2FcIjpcIuKkt1wiLFwicmRsZGhhclwiOlwi4qWpXCIsXCJyZHF1b1wiOlwi4oCdXCIsXCJyZHF1b3JcIjpcIuKAnVwiLFwicmRzaFwiOlwi4oazXCIsXCJyZWFsXCI6XCLihJxcIixcInJlYWxpbmVcIjpcIuKEm1wiLFwicmVhbHBhcnRcIjpcIuKEnFwiLFwicmVhbHNcIjpcIuKEnVwiLFwiUmVcIjpcIuKEnFwiLFwicmVjdFwiOlwi4patXCIsXCJyZWdcIjpcIsKuXCIsXCJSRUdcIjpcIsKuXCIsXCJSZXZlcnNlRWxlbWVudFwiOlwi4oiLXCIsXCJSZXZlcnNlRXF1aWxpYnJpdW1cIjpcIuKHi1wiLFwiUmV2ZXJzZVVwRXF1aWxpYnJpdW1cIjpcIuKlr1wiLFwicmZpc2h0XCI6XCLipb1cIixcInJmbG9vclwiOlwi4oyLXCIsXCJyZnJcIjpcIvCdlK9cIixcIlJmclwiOlwi4oScXCIsXCJySGFyXCI6XCLipaRcIixcInJoYXJkXCI6XCLih4FcIixcInJoYXJ1XCI6XCLih4BcIixcInJoYXJ1bFwiOlwi4qWsXCIsXCJSaG9cIjpcIs6hXCIsXCJyaG9cIjpcIs+BXCIsXCJyaG92XCI6XCLPsVwiLFwiUmlnaHRBbmdsZUJyYWNrZXRcIjpcIuKfqVwiLFwiUmlnaHRBcnJvd0JhclwiOlwi4oelXCIsXCJyaWdodGFycm93XCI6XCLihpJcIixcIlJpZ2h0QXJyb3dcIjpcIuKGklwiLFwiUmlnaHRhcnJvd1wiOlwi4oeSXCIsXCJSaWdodEFycm93TGVmdEFycm93XCI6XCLih4RcIixcInJpZ2h0YXJyb3d0YWlsXCI6XCLihqNcIixcIlJpZ2h0Q2VpbGluZ1wiOlwi4oyJXCIsXCJSaWdodERvdWJsZUJyYWNrZXRcIjpcIuKfp1wiLFwiUmlnaHREb3duVGVlVmVjdG9yXCI6XCLipZ1cIixcIlJpZ2h0RG93blZlY3RvckJhclwiOlwi4qWVXCIsXCJSaWdodERvd25WZWN0b3JcIjpcIuKHglwiLFwiUmlnaHRGbG9vclwiOlwi4oyLXCIsXCJyaWdodGhhcnBvb25kb3duXCI6XCLih4FcIixcInJpZ2h0aGFycG9vbnVwXCI6XCLih4BcIixcInJpZ2h0bGVmdGFycm93c1wiOlwi4oeEXCIsXCJyaWdodGxlZnRoYXJwb29uc1wiOlwi4oeMXCIsXCJyaWdodHJpZ2h0YXJyb3dzXCI6XCLih4lcIixcInJpZ2h0c3F1aWdhcnJvd1wiOlwi4oadXCIsXCJSaWdodFRlZUFycm93XCI6XCLihqZcIixcIlJpZ2h0VGVlXCI6XCLiiqJcIixcIlJpZ2h0VGVlVmVjdG9yXCI6XCLipZtcIixcInJpZ2h0dGhyZWV0aW1lc1wiOlwi4ouMXCIsXCJSaWdodFRyaWFuZ2xlQmFyXCI6XCLip5BcIixcIlJpZ2h0VHJpYW5nbGVcIjpcIuKKs1wiLFwiUmlnaHRUcmlhbmdsZUVxdWFsXCI6XCLiirVcIixcIlJpZ2h0VXBEb3duVmVjdG9yXCI6XCLipY9cIixcIlJpZ2h0VXBUZWVWZWN0b3JcIjpcIuKlnFwiLFwiUmlnaHRVcFZlY3RvckJhclwiOlwi4qWUXCIsXCJSaWdodFVwVmVjdG9yXCI6XCLihr5cIixcIlJpZ2h0VmVjdG9yQmFyXCI6XCLipZNcIixcIlJpZ2h0VmVjdG9yXCI6XCLih4BcIixcInJpbmdcIjpcIsuaXCIsXCJyaXNpbmdkb3RzZXFcIjpcIuKJk1wiLFwicmxhcnJcIjpcIuKHhFwiLFwicmxoYXJcIjpcIuKHjFwiLFwicmxtXCI6XCLigI9cIixcInJtb3VzdGFjaGVcIjpcIuKOsVwiLFwicm1vdXN0XCI6XCLijrFcIixcInJubWlkXCI6XCLiq65cIixcInJvYW5nXCI6XCLin61cIixcInJvYXJyXCI6XCLih75cIixcInJvYnJrXCI6XCLin6dcIixcInJvcGFyXCI6XCLipoZcIixcInJvcGZcIjpcIvCdlaNcIixcIlJvcGZcIjpcIuKEnVwiLFwicm9wbHVzXCI6XCLiqK5cIixcInJvdGltZXNcIjpcIuKotVwiLFwiUm91bmRJbXBsaWVzXCI6XCLipbBcIixcInJwYXJcIjpcIilcIixcInJwYXJndFwiOlwi4qaUXCIsXCJycHBvbGludFwiOlwi4qiSXCIsXCJycmFyclwiOlwi4oeJXCIsXCJScmlnaHRhcnJvd1wiOlwi4oebXCIsXCJyc2FxdW9cIjpcIuKAulwiLFwicnNjclwiOlwi8J2Th1wiLFwiUnNjclwiOlwi4oSbXCIsXCJyc2hcIjpcIuKGsVwiLFwiUnNoXCI6XCLihrFcIixcInJzcWJcIjpcIl1cIixcInJzcXVvXCI6XCLigJlcIixcInJzcXVvclwiOlwi4oCZXCIsXCJydGhyZWVcIjpcIuKLjFwiLFwicnRpbWVzXCI6XCLii4pcIixcInJ0cmlcIjpcIuKWuVwiLFwicnRyaWVcIjpcIuKKtVwiLFwicnRyaWZcIjpcIuKWuFwiLFwicnRyaWx0cmlcIjpcIuKnjlwiLFwiUnVsZURlbGF5ZWRcIjpcIuKntFwiLFwicnVsdWhhclwiOlwi4qWoXCIsXCJyeFwiOlwi4oSeXCIsXCJTYWN1dGVcIjpcIsWaXCIsXCJzYWN1dGVcIjpcIsWbXCIsXCJzYnF1b1wiOlwi4oCaXCIsXCJzY2FwXCI6XCLiqrhcIixcIlNjYXJvblwiOlwixaBcIixcInNjYXJvblwiOlwixaFcIixcIlNjXCI6XCLiqrxcIixcInNjXCI6XCLiibtcIixcInNjY3VlXCI6XCLiib1cIixcInNjZVwiOlwi4qqwXCIsXCJzY0VcIjpcIuKqtFwiLFwiU2NlZGlsXCI6XCLFnlwiLFwic2NlZGlsXCI6XCLFn1wiLFwiU2NpcmNcIjpcIsWcXCIsXCJzY2lyY1wiOlwixZ1cIixcInNjbmFwXCI6XCLiqrpcIixcInNjbkVcIjpcIuKqtlwiLFwic2Nuc2ltXCI6XCLii6lcIixcInNjcG9saW50XCI6XCLiqJNcIixcInNjc2ltXCI6XCLiib9cIixcIlNjeVwiOlwi0KFcIixcInNjeVwiOlwi0YFcIixcInNkb3RiXCI6XCLiiqFcIixcInNkb3RcIjpcIuKLhVwiLFwic2RvdGVcIjpcIuKpplwiLFwic2VhcmhrXCI6XCLipKVcIixcInNlYXJyXCI6XCLihphcIixcInNlQXJyXCI6XCLih5hcIixcInNlYXJyb3dcIjpcIuKGmFwiLFwic2VjdFwiOlwiwqdcIixcInNlbWlcIjpcIjtcIixcInNlc3dhclwiOlwi4qSpXCIsXCJzZXRtaW51c1wiOlwi4oiWXCIsXCJzZXRtblwiOlwi4oiWXCIsXCJzZXh0XCI6XCLinLZcIixcIlNmclwiOlwi8J2UllwiLFwic2ZyXCI6XCLwnZSwXCIsXCJzZnJvd25cIjpcIuKMolwiLFwic2hhcnBcIjpcIuKZr1wiLFwiU0hDSGN5XCI6XCLQqVwiLFwic2hjaGN5XCI6XCLRiVwiLFwiU0hjeVwiOlwi0KhcIixcInNoY3lcIjpcItGIXCIsXCJTaG9ydERvd25BcnJvd1wiOlwi4oaTXCIsXCJTaG9ydExlZnRBcnJvd1wiOlwi4oaQXCIsXCJzaG9ydG1pZFwiOlwi4oijXCIsXCJzaG9ydHBhcmFsbGVsXCI6XCLiiKVcIixcIlNob3J0UmlnaHRBcnJvd1wiOlwi4oaSXCIsXCJTaG9ydFVwQXJyb3dcIjpcIuKGkVwiLFwic2h5XCI6XCLCrVwiLFwiU2lnbWFcIjpcIs6jXCIsXCJzaWdtYVwiOlwiz4NcIixcInNpZ21hZlwiOlwiz4JcIixcInNpZ21hdlwiOlwiz4JcIixcInNpbVwiOlwi4oi8XCIsXCJzaW1kb3RcIjpcIuKpqlwiLFwic2ltZVwiOlwi4omDXCIsXCJzaW1lcVwiOlwi4omDXCIsXCJzaW1nXCI6XCLiqp5cIixcInNpbWdFXCI6XCLiqqBcIixcInNpbWxcIjpcIuKqnVwiLFwic2ltbEVcIjpcIuKqn1wiLFwic2ltbmVcIjpcIuKJhlwiLFwic2ltcGx1c1wiOlwi4qikXCIsXCJzaW1yYXJyXCI6XCLipbJcIixcInNsYXJyXCI6XCLihpBcIixcIlNtYWxsQ2lyY2xlXCI6XCLiiJhcIixcInNtYWxsc2V0bWludXNcIjpcIuKIllwiLFwic21hc2hwXCI6XCLiqLNcIixcInNtZXBhcnNsXCI6XCLip6RcIixcInNtaWRcIjpcIuKIo1wiLFwic21pbGVcIjpcIuKMo1wiLFwic210XCI6XCLiqqpcIixcInNtdGVcIjpcIuKqrFwiLFwic210ZXNcIjpcIuKqrO+4gFwiLFwiU09GVGN5XCI6XCLQrFwiLFwic29mdGN5XCI6XCLRjFwiLFwic29sYmFyXCI6XCLijL9cIixcInNvbGJcIjpcIuKnhFwiLFwic29sXCI6XCIvXCIsXCJTb3BmXCI6XCLwnZWKXCIsXCJzb3BmXCI6XCLwnZWkXCIsXCJzcGFkZXNcIjpcIuKZoFwiLFwic3BhZGVzdWl0XCI6XCLimaBcIixcInNwYXJcIjpcIuKIpVwiLFwic3FjYXBcIjpcIuKKk1wiLFwic3FjYXBzXCI6XCLiipPvuIBcIixcInNxY3VwXCI6XCLiipRcIixcInNxY3Vwc1wiOlwi4oqU77iAXCIsXCJTcXJ0XCI6XCLiiJpcIixcInNxc3ViXCI6XCLiio9cIixcInNxc3ViZVwiOlwi4oqRXCIsXCJzcXN1YnNldFwiOlwi4oqPXCIsXCJzcXN1YnNldGVxXCI6XCLiipFcIixcInNxc3VwXCI6XCLiipBcIixcInNxc3VwZVwiOlwi4oqSXCIsXCJzcXN1cHNldFwiOlwi4oqQXCIsXCJzcXN1cHNldGVxXCI6XCLiipJcIixcInNxdWFyZVwiOlwi4pahXCIsXCJTcXVhcmVcIjpcIuKWoVwiLFwiU3F1YXJlSW50ZXJzZWN0aW9uXCI6XCLiipNcIixcIlNxdWFyZVN1YnNldFwiOlwi4oqPXCIsXCJTcXVhcmVTdWJzZXRFcXVhbFwiOlwi4oqRXCIsXCJTcXVhcmVTdXBlcnNldFwiOlwi4oqQXCIsXCJTcXVhcmVTdXBlcnNldEVxdWFsXCI6XCLiipJcIixcIlNxdWFyZVVuaW9uXCI6XCLiipRcIixcInNxdWFyZlwiOlwi4paqXCIsXCJzcXVcIjpcIuKWoVwiLFwic3F1ZlwiOlwi4paqXCIsXCJzcmFyclwiOlwi4oaSXCIsXCJTc2NyXCI6XCLwnZKuXCIsXCJzc2NyXCI6XCLwnZOIXCIsXCJzc2V0bW5cIjpcIuKIllwiLFwic3NtaWxlXCI6XCLijKNcIixcInNzdGFyZlwiOlwi4ouGXCIsXCJTdGFyXCI6XCLii4ZcIixcInN0YXJcIjpcIuKYhlwiLFwic3RhcmZcIjpcIuKYhVwiLFwic3RyYWlnaHRlcHNpbG9uXCI6XCLPtVwiLFwic3RyYWlnaHRwaGlcIjpcIs+VXCIsXCJzdHJuc1wiOlwiwq9cIixcInN1YlwiOlwi4oqCXCIsXCJTdWJcIjpcIuKLkFwiLFwic3ViZG90XCI6XCLiqr1cIixcInN1YkVcIjpcIuKrhVwiLFwic3ViZVwiOlwi4oqGXCIsXCJzdWJlZG90XCI6XCLiq4NcIixcInN1Ym11bHRcIjpcIuKrgVwiLFwic3VibkVcIjpcIuKri1wiLFwic3VibmVcIjpcIuKKilwiLFwic3VicGx1c1wiOlwi4qq/XCIsXCJzdWJyYXJyXCI6XCLipblcIixcInN1YnNldFwiOlwi4oqCXCIsXCJTdWJzZXRcIjpcIuKLkFwiLFwic3Vic2V0ZXFcIjpcIuKKhlwiLFwic3Vic2V0ZXFxXCI6XCLiq4VcIixcIlN1YnNldEVxdWFsXCI6XCLiioZcIixcInN1YnNldG5lcVwiOlwi4oqKXCIsXCJzdWJzZXRuZXFxXCI6XCLiq4tcIixcInN1YnNpbVwiOlwi4quHXCIsXCJzdWJzdWJcIjpcIuKrlVwiLFwic3Vic3VwXCI6XCLiq5NcIixcInN1Y2NhcHByb3hcIjpcIuKquFwiLFwic3VjY1wiOlwi4om7XCIsXCJzdWNjY3VybHllcVwiOlwi4om9XCIsXCJTdWNjZWVkc1wiOlwi4om7XCIsXCJTdWNjZWVkc0VxdWFsXCI6XCLiqrBcIixcIlN1Y2NlZWRzU2xhbnRFcXVhbFwiOlwi4om9XCIsXCJTdWNjZWVkc1RpbGRlXCI6XCLiib9cIixcInN1Y2NlcVwiOlwi4qqwXCIsXCJzdWNjbmFwcHJveFwiOlwi4qq6XCIsXCJzdWNjbmVxcVwiOlwi4qq2XCIsXCJzdWNjbnNpbVwiOlwi4oupXCIsXCJzdWNjc2ltXCI6XCLiib9cIixcIlN1Y2hUaGF0XCI6XCLiiItcIixcInN1bVwiOlwi4oiRXCIsXCJTdW1cIjpcIuKIkVwiLFwic3VuZ1wiOlwi4pmqXCIsXCJzdXAxXCI6XCLCuVwiLFwic3VwMlwiOlwiwrJcIixcInN1cDNcIjpcIsKzXCIsXCJzdXBcIjpcIuKKg1wiLFwiU3VwXCI6XCLii5FcIixcInN1cGRvdFwiOlwi4qq+XCIsXCJzdXBkc3ViXCI6XCLiq5hcIixcInN1cEVcIjpcIuKrhlwiLFwic3VwZVwiOlwi4oqHXCIsXCJzdXBlZG90XCI6XCLiq4RcIixcIlN1cGVyc2V0XCI6XCLiioNcIixcIlN1cGVyc2V0RXF1YWxcIjpcIuKKh1wiLFwic3VwaHNvbFwiOlwi4p+JXCIsXCJzdXBoc3ViXCI6XCLiq5dcIixcInN1cGxhcnJcIjpcIuKlu1wiLFwic3VwbXVsdFwiOlwi4quCXCIsXCJzdXBuRVwiOlwi4quMXCIsXCJzdXBuZVwiOlwi4oqLXCIsXCJzdXBwbHVzXCI6XCLiq4BcIixcInN1cHNldFwiOlwi4oqDXCIsXCJTdXBzZXRcIjpcIuKLkVwiLFwic3Vwc2V0ZXFcIjpcIuKKh1wiLFwic3Vwc2V0ZXFxXCI6XCLiq4ZcIixcInN1cHNldG5lcVwiOlwi4oqLXCIsXCJzdXBzZXRuZXFxXCI6XCLiq4xcIixcInN1cHNpbVwiOlwi4quIXCIsXCJzdXBzdWJcIjpcIuKrlFwiLFwic3Vwc3VwXCI6XCLiq5ZcIixcInN3YXJoa1wiOlwi4qSmXCIsXCJzd2FyclwiOlwi4oaZXCIsXCJzd0FyclwiOlwi4oeZXCIsXCJzd2Fycm93XCI6XCLihplcIixcInN3bndhclwiOlwi4qSqXCIsXCJzemxpZ1wiOlwiw59cIixcIlRhYlwiOlwiXFx0XCIsXCJ0YXJnZXRcIjpcIuKMllwiLFwiVGF1XCI6XCLOpFwiLFwidGF1XCI6XCLPhFwiLFwidGJya1wiOlwi4o60XCIsXCJUY2Fyb25cIjpcIsWkXCIsXCJ0Y2Fyb25cIjpcIsWlXCIsXCJUY2VkaWxcIjpcIsWiXCIsXCJ0Y2VkaWxcIjpcIsWjXCIsXCJUY3lcIjpcItCiXCIsXCJ0Y3lcIjpcItGCXCIsXCJ0ZG90XCI6XCLig5tcIixcInRlbHJlY1wiOlwi4oyVXCIsXCJUZnJcIjpcIvCdlJdcIixcInRmclwiOlwi8J2UsVwiLFwidGhlcmU0XCI6XCLiiLRcIixcInRoZXJlZm9yZVwiOlwi4oi0XCIsXCJUaGVyZWZvcmVcIjpcIuKItFwiLFwiVGhldGFcIjpcIs6YXCIsXCJ0aGV0YVwiOlwizrhcIixcInRoZXRhc3ltXCI6XCLPkVwiLFwidGhldGF2XCI6XCLPkVwiLFwidGhpY2thcHByb3hcIjpcIuKJiFwiLFwidGhpY2tzaW1cIjpcIuKIvFwiLFwiVGhpY2tTcGFjZVwiOlwi4oGf4oCKXCIsXCJUaGluU3BhY2VcIjpcIuKAiVwiLFwidGhpbnNwXCI6XCLigIlcIixcInRoa2FwXCI6XCLiiYhcIixcInRoa3NpbVwiOlwi4oi8XCIsXCJUSE9STlwiOlwiw55cIixcInRob3JuXCI6XCLDvlwiLFwidGlsZGVcIjpcIsucXCIsXCJUaWxkZVwiOlwi4oi8XCIsXCJUaWxkZUVxdWFsXCI6XCLiiYNcIixcIlRpbGRlRnVsbEVxdWFsXCI6XCLiiYVcIixcIlRpbGRlVGlsZGVcIjpcIuKJiFwiLFwidGltZXNiYXJcIjpcIuKosVwiLFwidGltZXNiXCI6XCLiiqBcIixcInRpbWVzXCI6XCLDl1wiLFwidGltZXNkXCI6XCLiqLBcIixcInRpbnRcIjpcIuKIrVwiLFwidG9lYVwiOlwi4qSoXCIsXCJ0b3Bib3RcIjpcIuKMtlwiLFwidG9wY2lyXCI6XCLiq7FcIixcInRvcFwiOlwi4oqkXCIsXCJUb3BmXCI6XCLwnZWLXCIsXCJ0b3BmXCI6XCLwnZWlXCIsXCJ0b3Bmb3JrXCI6XCLiq5pcIixcInRvc2FcIjpcIuKkqVwiLFwidHByaW1lXCI6XCLigLRcIixcInRyYWRlXCI6XCLihKJcIixcIlRSQURFXCI6XCLihKJcIixcInRyaWFuZ2xlXCI6XCLilrVcIixcInRyaWFuZ2xlZG93blwiOlwi4pa/XCIsXCJ0cmlhbmdsZWxlZnRcIjpcIuKXg1wiLFwidHJpYW5nbGVsZWZ0ZXFcIjpcIuKKtFwiLFwidHJpYW5nbGVxXCI6XCLiiZxcIixcInRyaWFuZ2xlcmlnaHRcIjpcIuKWuVwiLFwidHJpYW5nbGVyaWdodGVxXCI6XCLiirVcIixcInRyaWRvdFwiOlwi4pesXCIsXCJ0cmllXCI6XCLiiZxcIixcInRyaW1pbnVzXCI6XCLiqLpcIixcIlRyaXBsZURvdFwiOlwi4oObXCIsXCJ0cmlwbHVzXCI6XCLiqLlcIixcInRyaXNiXCI6XCLip41cIixcInRyaXRpbWVcIjpcIuKou1wiLFwidHJwZXppdW1cIjpcIuKPolwiLFwiVHNjclwiOlwi8J2Sr1wiLFwidHNjclwiOlwi8J2TiVwiLFwiVFNjeVwiOlwi0KZcIixcInRzY3lcIjpcItGGXCIsXCJUU0hjeVwiOlwi0ItcIixcInRzaGN5XCI6XCLRm1wiLFwiVHN0cm9rXCI6XCLFplwiLFwidHN0cm9rXCI6XCLFp1wiLFwidHdpeHRcIjpcIuKJrFwiLFwidHdvaGVhZGxlZnRhcnJvd1wiOlwi4oaeXCIsXCJ0d29oZWFkcmlnaHRhcnJvd1wiOlwi4oagXCIsXCJVYWN1dGVcIjpcIsOaXCIsXCJ1YWN1dGVcIjpcIsO6XCIsXCJ1YXJyXCI6XCLihpFcIixcIlVhcnJcIjpcIuKGn1wiLFwidUFyclwiOlwi4oeRXCIsXCJVYXJyb2NpclwiOlwi4qWJXCIsXCJVYnJjeVwiOlwi0I5cIixcInVicmN5XCI6XCLRnlwiLFwiVWJyZXZlXCI6XCLFrFwiLFwidWJyZXZlXCI6XCLFrVwiLFwiVWNpcmNcIjpcIsObXCIsXCJ1Y2lyY1wiOlwiw7tcIixcIlVjeVwiOlwi0KNcIixcInVjeVwiOlwi0YNcIixcInVkYXJyXCI6XCLih4VcIixcIlVkYmxhY1wiOlwixbBcIixcInVkYmxhY1wiOlwixbFcIixcInVkaGFyXCI6XCLipa5cIixcInVmaXNodFwiOlwi4qW+XCIsXCJVZnJcIjpcIvCdlJhcIixcInVmclwiOlwi8J2UslwiLFwiVWdyYXZlXCI6XCLDmVwiLFwidWdyYXZlXCI6XCLDuVwiLFwidUhhclwiOlwi4qWjXCIsXCJ1aGFybFwiOlwi4oa/XCIsXCJ1aGFyclwiOlwi4oa+XCIsXCJ1aGJsa1wiOlwi4paAXCIsXCJ1bGNvcm5cIjpcIuKMnFwiLFwidWxjb3JuZXJcIjpcIuKMnFwiLFwidWxjcm9wXCI6XCLijI9cIixcInVsdHJpXCI6XCLil7hcIixcIlVtYWNyXCI6XCLFqlwiLFwidW1hY3JcIjpcIsWrXCIsXCJ1bWxcIjpcIsKoXCIsXCJVbmRlckJhclwiOlwiX1wiLFwiVW5kZXJCcmFjZVwiOlwi4o+fXCIsXCJVbmRlckJyYWNrZXRcIjpcIuKOtVwiLFwiVW5kZXJQYXJlbnRoZXNpc1wiOlwi4o+dXCIsXCJVbmlvblwiOlwi4ouDXCIsXCJVbmlvblBsdXNcIjpcIuKKjlwiLFwiVW9nb25cIjpcIsWyXCIsXCJ1b2dvblwiOlwixbNcIixcIlVvcGZcIjpcIvCdlYxcIixcInVvcGZcIjpcIvCdlaZcIixcIlVwQXJyb3dCYXJcIjpcIuKkklwiLFwidXBhcnJvd1wiOlwi4oaRXCIsXCJVcEFycm93XCI6XCLihpFcIixcIlVwYXJyb3dcIjpcIuKHkVwiLFwiVXBBcnJvd0Rvd25BcnJvd1wiOlwi4oeFXCIsXCJ1cGRvd25hcnJvd1wiOlwi4oaVXCIsXCJVcERvd25BcnJvd1wiOlwi4oaVXCIsXCJVcGRvd25hcnJvd1wiOlwi4oeVXCIsXCJVcEVxdWlsaWJyaXVtXCI6XCLipa5cIixcInVwaGFycG9vbmxlZnRcIjpcIuKGv1wiLFwidXBoYXJwb29ucmlnaHRcIjpcIuKGvlwiLFwidXBsdXNcIjpcIuKKjlwiLFwiVXBwZXJMZWZ0QXJyb3dcIjpcIuKGllwiLFwiVXBwZXJSaWdodEFycm93XCI6XCLihpdcIixcInVwc2lcIjpcIs+FXCIsXCJVcHNpXCI6XCLPklwiLFwidXBzaWhcIjpcIs+SXCIsXCJVcHNpbG9uXCI6XCLOpVwiLFwidXBzaWxvblwiOlwiz4VcIixcIlVwVGVlQXJyb3dcIjpcIuKGpVwiLFwiVXBUZWVcIjpcIuKKpVwiLFwidXB1cGFycm93c1wiOlwi4oeIXCIsXCJ1cmNvcm5cIjpcIuKMnVwiLFwidXJjb3JuZXJcIjpcIuKMnVwiLFwidXJjcm9wXCI6XCLijI5cIixcIlVyaW5nXCI6XCLFrlwiLFwidXJpbmdcIjpcIsWvXCIsXCJ1cnRyaVwiOlwi4pe5XCIsXCJVc2NyXCI6XCLwnZKwXCIsXCJ1c2NyXCI6XCLwnZOKXCIsXCJ1dGRvdFwiOlwi4ouwXCIsXCJVdGlsZGVcIjpcIsWoXCIsXCJ1dGlsZGVcIjpcIsWpXCIsXCJ1dHJpXCI6XCLilrVcIixcInV0cmlmXCI6XCLilrRcIixcInV1YXJyXCI6XCLih4hcIixcIlV1bWxcIjpcIsOcXCIsXCJ1dW1sXCI6XCLDvFwiLFwidXdhbmdsZVwiOlwi4qanXCIsXCJ2YW5ncnRcIjpcIuKmnFwiLFwidmFyZXBzaWxvblwiOlwiz7VcIixcInZhcmthcHBhXCI6XCLPsFwiLFwidmFybm90aGluZ1wiOlwi4oiFXCIsXCJ2YXJwaGlcIjpcIs+VXCIsXCJ2YXJwaVwiOlwiz5ZcIixcInZhcnByb3B0b1wiOlwi4oidXCIsXCJ2YXJyXCI6XCLihpVcIixcInZBcnJcIjpcIuKHlVwiLFwidmFycmhvXCI6XCLPsVwiLFwidmFyc2lnbWFcIjpcIs+CXCIsXCJ2YXJzdWJzZXRuZXFcIjpcIuKKiu+4gFwiLFwidmFyc3Vic2V0bmVxcVwiOlwi4quL77iAXCIsXCJ2YXJzdXBzZXRuZXFcIjpcIuKKi++4gFwiLFwidmFyc3Vwc2V0bmVxcVwiOlwi4quM77iAXCIsXCJ2YXJ0aGV0YVwiOlwiz5FcIixcInZhcnRyaWFuZ2xlbGVmdFwiOlwi4oqyXCIsXCJ2YXJ0cmlhbmdsZXJpZ2h0XCI6XCLiirNcIixcInZCYXJcIjpcIuKrqFwiLFwiVmJhclwiOlwi4qurXCIsXCJ2QmFydlwiOlwi4qupXCIsXCJWY3lcIjpcItCSXCIsXCJ2Y3lcIjpcItCyXCIsXCJ2ZGFzaFwiOlwi4oqiXCIsXCJ2RGFzaFwiOlwi4oqoXCIsXCJWZGFzaFwiOlwi4oqpXCIsXCJWRGFzaFwiOlwi4oqrXCIsXCJWZGFzaGxcIjpcIuKrplwiLFwidmVlYmFyXCI6XCLiirtcIixcInZlZVwiOlwi4oioXCIsXCJWZWVcIjpcIuKLgVwiLFwidmVlZXFcIjpcIuKJmlwiLFwidmVsbGlwXCI6XCLii65cIixcInZlcmJhclwiOlwifFwiLFwiVmVyYmFyXCI6XCLigJZcIixcInZlcnRcIjpcInxcIixcIlZlcnRcIjpcIuKAllwiLFwiVmVydGljYWxCYXJcIjpcIuKIo1wiLFwiVmVydGljYWxMaW5lXCI6XCJ8XCIsXCJWZXJ0aWNhbFNlcGFyYXRvclwiOlwi4p2YXCIsXCJWZXJ0aWNhbFRpbGRlXCI6XCLiiYBcIixcIlZlcnlUaGluU3BhY2VcIjpcIuKAilwiLFwiVmZyXCI6XCLwnZSZXCIsXCJ2ZnJcIjpcIvCdlLNcIixcInZsdHJpXCI6XCLiirJcIixcInZuc3ViXCI6XCLiioLig5JcIixcInZuc3VwXCI6XCLiioPig5JcIixcIlZvcGZcIjpcIvCdlY1cIixcInZvcGZcIjpcIvCdladcIixcInZwcm9wXCI6XCLiiJ1cIixcInZydHJpXCI6XCLiirNcIixcIlZzY3JcIjpcIvCdkrFcIixcInZzY3JcIjpcIvCdk4tcIixcInZzdWJuRVwiOlwi4quL77iAXCIsXCJ2c3VibmVcIjpcIuKKiu+4gFwiLFwidnN1cG5FXCI6XCLiq4zvuIBcIixcInZzdXBuZVwiOlwi4oqL77iAXCIsXCJWdmRhc2hcIjpcIuKKqlwiLFwidnppZ3phZ1wiOlwi4qaaXCIsXCJXY2lyY1wiOlwixbRcIixcIndjaXJjXCI6XCLFtVwiLFwid2VkYmFyXCI6XCLiqZ9cIixcIndlZGdlXCI6XCLiiKdcIixcIldlZGdlXCI6XCLii4BcIixcIndlZGdlcVwiOlwi4omZXCIsXCJ3ZWllcnBcIjpcIuKEmFwiLFwiV2ZyXCI6XCLwnZSaXCIsXCJ3ZnJcIjpcIvCdlLRcIixcIldvcGZcIjpcIvCdlY5cIixcIndvcGZcIjpcIvCdlahcIixcIndwXCI6XCLihJhcIixcIndyXCI6XCLiiYBcIixcIndyZWF0aFwiOlwi4omAXCIsXCJXc2NyXCI6XCLwnZKyXCIsXCJ3c2NyXCI6XCLwnZOMXCIsXCJ4Y2FwXCI6XCLii4JcIixcInhjaXJjXCI6XCLil69cIixcInhjdXBcIjpcIuKLg1wiLFwieGR0cmlcIjpcIuKWvVwiLFwiWGZyXCI6XCLwnZSbXCIsXCJ4ZnJcIjpcIvCdlLVcIixcInhoYXJyXCI6XCLin7dcIixcInhoQXJyXCI6XCLin7pcIixcIlhpXCI6XCLOnlwiLFwieGlcIjpcIs6+XCIsXCJ4bGFyclwiOlwi4p+1XCIsXCJ4bEFyclwiOlwi4p+4XCIsXCJ4bWFwXCI6XCLin7xcIixcInhuaXNcIjpcIuKLu1wiLFwieG9kb3RcIjpcIuKogFwiLFwiWG9wZlwiOlwi8J2Vj1wiLFwieG9wZlwiOlwi8J2VqVwiLFwieG9wbHVzXCI6XCLiqIFcIixcInhvdGltZVwiOlwi4qiCXCIsXCJ4cmFyclwiOlwi4p+2XCIsXCJ4ckFyclwiOlwi4p+5XCIsXCJYc2NyXCI6XCLwnZKzXCIsXCJ4c2NyXCI6XCLwnZONXCIsXCJ4c3FjdXBcIjpcIuKohlwiLFwieHVwbHVzXCI6XCLiqIRcIixcInh1dHJpXCI6XCLilrNcIixcInh2ZWVcIjpcIuKLgVwiLFwieHdlZGdlXCI6XCLii4BcIixcIllhY3V0ZVwiOlwiw51cIixcInlhY3V0ZVwiOlwiw71cIixcIllBY3lcIjpcItCvXCIsXCJ5YWN5XCI6XCLRj1wiLFwiWWNpcmNcIjpcIsW2XCIsXCJ5Y2lyY1wiOlwixbdcIixcIlljeVwiOlwi0KtcIixcInljeVwiOlwi0YtcIixcInllblwiOlwiwqVcIixcIllmclwiOlwi8J2UnFwiLFwieWZyXCI6XCLwnZS2XCIsXCJZSWN5XCI6XCLQh1wiLFwieWljeVwiOlwi0ZdcIixcIllvcGZcIjpcIvCdlZBcIixcInlvcGZcIjpcIvCdlapcIixcIllzY3JcIjpcIvCdkrRcIixcInlzY3JcIjpcIvCdk45cIixcIllVY3lcIjpcItCuXCIsXCJ5dWN5XCI6XCLRjlwiLFwieXVtbFwiOlwiw79cIixcIll1bWxcIjpcIsW4XCIsXCJaYWN1dGVcIjpcIsW5XCIsXCJ6YWN1dGVcIjpcIsW6XCIsXCJaY2Fyb25cIjpcIsW9XCIsXCJ6Y2Fyb25cIjpcIsW+XCIsXCJaY3lcIjpcItCXXCIsXCJ6Y3lcIjpcItC3XCIsXCJaZG90XCI6XCLFu1wiLFwiemRvdFwiOlwixbxcIixcInplZXRyZlwiOlwi4oSoXCIsXCJaZXJvV2lkdGhTcGFjZVwiOlwi4oCLXCIsXCJaZXRhXCI6XCLOllwiLFwiemV0YVwiOlwizrZcIixcInpmclwiOlwi8J2Ut1wiLFwiWmZyXCI6XCLihKhcIixcIlpIY3lcIjpcItCWXCIsXCJ6aGN5XCI6XCLQtlwiLFwiemlncmFyclwiOlwi4oedXCIsXCJ6b3BmXCI6XCLwnZWrXCIsXCJab3BmXCI6XCLihKRcIixcIlpzY3JcIjpcIvCdkrVcIixcInpzY3JcIjpcIvCdk49cIixcInp3alwiOlwi4oCNXCIsXCJ6d25qXCI6XCLigIxcIn1cblxuLyoqKi8gfSksXG4vKiAxNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcInVuaXZlcnNhbFwiOjUwLFwidGFnXCI6MzAsXCJhdHRyaWJ1dGVcIjoxLFwicHNldWRvXCI6MCxcImRlc2NlbmRhbnRcIjotMSxcImNoaWxkXCI6LTEsXCJwYXJlbnRcIjotMSxcInNpYmxpbmdcIjotMSxcImFkamFjZW50XCI6LTF9XG5cbi8qKiovIH0pLFxuLyogMTYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vLyBJbnNwaXJlZCBieSBHb29nbGUgQ2xvc3VyZTpcbi8vIGh0dHA6Ly9jbG9zdXJlLWxpYnJhcnkuZ29vZ2xlY29kZS5jb20vc3ZuL2RvY3MvXG4vLyBjbG9zdXJlX2dvb2dfYXJyYXlfYXJyYXkuanMuaHRtbCNnb29nLmFycmF5LmNsZWFyXG5cblxuXG52YXIgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblx0dmFsdWUodGhpcykubGVuZ3RoID0gMDtcblx0cmV0dXJuIHRoaXM7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogMTcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5LWZ1bmN0aW9uXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHt9O1xuXG5cbi8qKiovIH0pLFxuLyogMTggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oNTEpXG5cbiAgLCBtYXggPSBNYXRoLm1heDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiByZXR1cm4gbWF4KDAsIHRvSW50ZWdlcih2YWx1ZSkpO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDE5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBjcmVhdGUgPSBPYmplY3QuY3JlYXRlLCBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiwgcGxhaW5PYmplY3QgPSB7fTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoLyogQ3VzdG9tQ3JlYXRlKi8pIHtcblx0dmFyIHNldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mLCBjdXN0b21DcmVhdGUgPSBhcmd1bWVudHNbMF0gfHwgY3JlYXRlO1xuXHRpZiAodHlwZW9mIHNldFByb3RvdHlwZU9mICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIGdldFByb3RvdHlwZU9mKHNldFByb3RvdHlwZU9mKGN1c3RvbUNyZWF0ZShudWxsKSwgcGxhaW5PYmplY3QpKSA9PT0gcGxhaW5PYmplY3Q7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogMjAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBlc2xpbnQgbm8tcHJvdG86IFwib2ZmXCIgKi9cblxuLy8gQmlnIHRoYW5rcyB0byBAV2ViUmVmbGVjdGlvbiBmb3Igc29ydGluZyB0aGlzIG91dFxuLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vV2ViUmVmbGVjdGlvbi81NTkzNTU0XG5cblxuXG52YXIgaXNPYmplY3QgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NSlcbiAgLCB2YWx1ZSAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApXG4gICwgb2JqSXNQcm90b3R5cGVPZiA9IE9iamVjdC5wcm90b3R5cGUuaXNQcm90b3R5cGVPZlxuICAsIGRlZmluZVByb3BlcnR5ICA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eVxuICAsIG51bGxEZXNjICAgICAgICA9IHtcblx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0d3JpdGFibGU6IHRydWUsXG5cdHZhbHVlOiB1bmRlZmluZWRcbn1cbiAgLCB2YWxpZGF0ZTtcblxudmFsaWRhdGUgPSBmdW5jdGlvbiAob2JqLCBwcm90b3R5cGUpIHtcblx0dmFsdWUob2JqKTtcblx0aWYgKHByb3RvdHlwZSA9PT0gbnVsbCB8fCBpc09iamVjdChwcm90b3R5cGUpKSByZXR1cm4gb2JqO1xuXHR0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJvdG90eXBlIG11c3QgYmUgbnVsbCBvciBhbiBvYmplY3RcIik7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbiAoc3RhdHVzKSB7XG5cdHZhciBmbiwgc2V0O1xuXHRpZiAoIXN0YXR1cykgcmV0dXJuIG51bGw7XG5cdGlmIChzdGF0dXMubGV2ZWwgPT09IDIpIHtcblx0XHRpZiAoc3RhdHVzLnNldCkge1xuXHRcdFx0c2V0ID0gc3RhdHVzLnNldDtcblx0XHRcdGZuID0gZnVuY3Rpb24gKG9iaiwgcHJvdG90eXBlKSB7XG5cdFx0XHRcdHNldC5jYWxsKHZhbGlkYXRlKG9iaiwgcHJvdG90eXBlKSwgcHJvdG90eXBlKTtcblx0XHRcdFx0cmV0dXJuIG9iajtcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZuID0gZnVuY3Rpb24gKG9iaiwgcHJvdG90eXBlKSB7XG5cdFx0XHRcdHZhbGlkYXRlKG9iaiwgcHJvdG90eXBlKS5fX3Byb3RvX18gPSBwcm90b3R5cGU7XG5cdFx0XHRcdHJldHVybiBvYmo7XG5cdFx0XHR9O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRmbiA9IGZ1bmN0aW9uIHNlbGYob2JqLCBwcm90b3R5cGUpIHtcblx0XHRcdHZhciBpc051bGxCYXNlO1xuXHRcdFx0dmFsaWRhdGUob2JqLCBwcm90b3R5cGUpO1xuXHRcdFx0aXNOdWxsQmFzZSA9IG9iaklzUHJvdG90eXBlT2YuY2FsbChzZWxmLm51bGxQb2x5ZmlsbCwgb2JqKTtcblx0XHRcdGlmIChpc051bGxCYXNlKSBkZWxldGUgc2VsZi5udWxsUG9seWZpbGwuX19wcm90b19fO1xuXHRcdFx0aWYgKHByb3RvdHlwZSA9PT0gbnVsbCkgcHJvdG90eXBlID0gc2VsZi5udWxsUG9seWZpbGw7XG5cdFx0XHRvYmouX19wcm90b19fID0gcHJvdG90eXBlO1xuXHRcdFx0aWYgKGlzTnVsbEJhc2UpIGRlZmluZVByb3BlcnR5KHNlbGYubnVsbFBvbHlmaWxsLCBcIl9fcHJvdG9fX1wiLCBudWxsRGVzYyk7XG5cdFx0XHRyZXR1cm4gb2JqO1xuXHRcdH07XG5cdH1cblx0cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgXCJsZXZlbFwiLCB7XG5cdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcblx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR3cml0YWJsZTogZmFsc2UsXG5cdFx0dmFsdWU6IHN0YXR1cy5sZXZlbFxuXHR9KTtcbn0oXG5cdChmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHRtcE9iajEgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cdFx0ICAsIHRtcE9iajIgPSB7fVxuXHRcdCAgLCBzZXRcblx0XHQgICwgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LnByb3RvdHlwZSwgXCJfX3Byb3RvX19cIik7XG5cblx0XHRpZiAoZGVzYykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0c2V0ID0gZGVzYy5zZXQ7IC8vIE9wZXJhIGNyYXNoZXMgYXQgdGhpcyBwb2ludFxuXHRcdFx0XHRzZXQuY2FsbCh0bXBPYmoxLCB0bXBPYmoyKTtcblx0XHRcdH0gY2F0Y2ggKGlnbm9yZSkge31cblx0XHRcdGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YodG1wT2JqMSkgPT09IHRtcE9iajIpIHJldHVybiB7IHNldDogc2V0LCBsZXZlbDogMiB9O1xuXHRcdH1cblxuXHRcdHRtcE9iajEuX19wcm90b19fID0gdG1wT2JqMjtcblx0XHRpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRtcE9iajEpID09PSB0bXBPYmoyKSByZXR1cm4geyBsZXZlbDogMiB9O1xuXG5cdFx0dG1wT2JqMSA9IHt9O1xuXHRcdHRtcE9iajEuX19wcm90b19fID0gdG1wT2JqMjtcblx0XHRpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRtcE9iajEpID09PSB0bXBPYmoyKSByZXR1cm4geyBsZXZlbDogMSB9O1xuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KSgpXG4pKTtcblxuX193ZWJwYWNrX3JlcXVpcmVfXyg1Nik7XG5cblxuLyoqKi8gfSksXG4vKiAyMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgaXNWYWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5cbnZhciBmb3JFYWNoID0gQXJyYXkucHJvdG90eXBlLmZvckVhY2gsIGNyZWF0ZSA9IE9iamVjdC5jcmVhdGU7XG5cbnZhciBwcm9jZXNzID0gZnVuY3Rpb24gKHNyYywgb2JqKSB7XG5cdHZhciBrZXk7XG5cdGZvciAoa2V5IGluIHNyYykgb2JqW2tleV0gPSBzcmNba2V5XTtcbn07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0czEgLyosIOKApm9wdGlvbnMqLykge1xuXHR2YXIgcmVzdWx0ID0gY3JlYXRlKG51bGwpO1xuXHRmb3JFYWNoLmNhbGwoYXJndW1lbnRzLCBmdW5jdGlvbiAob3B0aW9ucykge1xuXHRcdGlmICghaXNWYWx1ZShvcHRpb25zKSkgcmV0dXJuO1xuXHRcdHByb2Nlc3MoT2JqZWN0KG9wdGlvbnMpLCByZXN1bHQpO1xuXHR9KTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG5cblxuLyoqKi8gfSksXG4vKiAyMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgaXNJdGVyYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzApO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRpZiAoIWlzSXRlcmFibGUodmFsdWUpKSB0aHJvdyBuZXcgVHlwZUVycm9yKHZhbHVlICsgXCIgaXMgbm90IGl0ZXJhYmxlXCIpO1xuXHRyZXR1cm4gdmFsdWU7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogMjMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGZhbHNlRnVuYyA9IF9fd2VicGFja19yZXF1aXJlX18oNSkuZmFsc2VGdW5jO1xuXG4vL2h0dHBzOi8vZ2l0aHViLmNvbS9zbGV2aXRoYW4vWFJlZ0V4cC9ibG9iL21hc3Rlci9zcmMveHJlZ2V4cC5qcyNMNDY5XG52YXIgcmVDaGFycyA9IC9bLVtcXF17fSgpKis/LixcXFxcXiR8I1xcc10vZztcblxuZnVuY3Rpb24gZmFjdG9yeShhZGFwdGVyKXtcblx0Lypcblx0XHRhdHRyaWJ1dGUgc2VsZWN0b3JzXG5cdCovXG5cdHZhciBhdHRyaWJ1dGVSdWxlcyA9IHtcblx0XHRfX3Byb3RvX186IG51bGwsXG5cdFx0ZXF1YWxzOiBmdW5jdGlvbihuZXh0LCBkYXRhKXtcblx0XHRcdHZhciBuYW1lICA9IGRhdGEubmFtZSxcblx0XHRcdFx0dmFsdWUgPSBkYXRhLnZhbHVlO1xuXG5cdFx0XHRpZihkYXRhLmlnbm9yZUNhc2Upe1xuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGVxdWFsc0lDKGVsZW0pe1xuXHRcdFx0XHRcdHZhciBhdHRyID0gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBuYW1lKTtcblx0XHRcdFx0XHRyZXR1cm4gYXR0ciAhPSBudWxsICYmIGF0dHIudG9Mb3dlckNhc2UoKSA9PT0gdmFsdWUgJiYgbmV4dChlbGVtKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGVxdWFscyhlbGVtKXtcblx0XHRcdFx0cmV0dXJuIGFkYXB0ZXIuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbSwgbmFtZSkgPT09IHZhbHVlICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0aHlwaGVuOiBmdW5jdGlvbihuZXh0LCBkYXRhKXtcblx0XHRcdHZhciBuYW1lICA9IGRhdGEubmFtZSxcblx0XHRcdFx0dmFsdWUgPSBkYXRhLnZhbHVlLFxuXHRcdFx0XHRsZW4gPSB2YWx1ZS5sZW5ndGg7XG5cblx0XHRcdGlmKGRhdGEuaWdub3JlQ2FzZSl7XG5cdFx0XHRcdHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcblxuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gaHlwaGVuSUMoZWxlbSl7XG5cdFx0XHRcdFx0dmFyIGF0dHIgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIG5hbWUpO1xuXHRcdFx0XHRcdHJldHVybiBhdHRyICE9IG51bGwgJiZcblx0XHRcdFx0XHRcdFx0KGF0dHIubGVuZ3RoID09PSBsZW4gfHwgYXR0ci5jaGFyQXQobGVuKSA9PT0gXCItXCIpICYmXG5cdFx0XHRcdFx0XHRcdGF0dHIuc3Vic3RyKDAsIGxlbikudG9Mb3dlckNhc2UoKSA9PT0gdmFsdWUgJiZcblx0XHRcdFx0XHRcdFx0bmV4dChlbGVtKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGh5cGhlbihlbGVtKXtcblx0XHRcdFx0dmFyIGF0dHIgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIG5hbWUpO1xuXHRcdFx0XHRyZXR1cm4gYXR0ciAhPSBudWxsICYmXG5cdFx0XHRcdFx0XHRhdHRyLnN1YnN0cigwLCBsZW4pID09PSB2YWx1ZSAmJlxuXHRcdFx0XHRcdFx0KGF0dHIubGVuZ3RoID09PSBsZW4gfHwgYXR0ci5jaGFyQXQobGVuKSA9PT0gXCItXCIpICYmXG5cdFx0XHRcdFx0XHRuZXh0KGVsZW0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGVsZW1lbnQ6IGZ1bmN0aW9uKG5leHQsIGRhdGEpe1xuXHRcdFx0dmFyIG5hbWUgPSBkYXRhLm5hbWUsXG5cdFx0XHRcdHZhbHVlID0gZGF0YS52YWx1ZTtcblxuXHRcdFx0aWYoL1xccy8udGVzdCh2YWx1ZSkpe1xuXHRcdFx0XHRyZXR1cm4gZmFsc2VGdW5jO1xuXHRcdFx0fVxuXG5cdFx0XHR2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocmVDaGFycywgXCJcXFxcJCZcIik7XG5cblx0XHRcdHZhciBwYXR0ZXJuID0gXCIoPzpefFxcXFxzKVwiICsgdmFsdWUgKyBcIig/OiR8XFxcXHMpXCIsXG5cdFx0XHRcdGZsYWdzID0gZGF0YS5pZ25vcmVDYXNlID8gXCJpXCIgOiBcIlwiLFxuXHRcdFx0XHRyZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybiwgZmxhZ3MpO1xuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gZWxlbWVudChlbGVtKXtcblx0XHRcdFx0dmFyIGF0dHIgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIG5hbWUpO1xuXHRcdFx0XHRyZXR1cm4gYXR0ciAhPSBudWxsICYmIHJlZ2V4LnRlc3QoYXR0cikgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRleGlzdHM6IGZ1bmN0aW9uKG5leHQsIGRhdGEpe1xuXHRcdFx0dmFyIG5hbWUgPSBkYXRhLm5hbWU7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gZXhpc3RzKGVsZW0pe1xuXHRcdFx0XHRyZXR1cm4gYWRhcHRlci5oYXNBdHRyaWIoZWxlbSwgbmFtZSkgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRzdGFydDogZnVuY3Rpb24obmV4dCwgZGF0YSl7XG5cdFx0XHR2YXIgbmFtZSAgPSBkYXRhLm5hbWUsXG5cdFx0XHRcdHZhbHVlID0gZGF0YS52YWx1ZSxcblx0XHRcdFx0bGVuID0gdmFsdWUubGVuZ3RoO1xuXG5cdFx0XHRpZihsZW4gPT09IDApe1xuXHRcdFx0XHRyZXR1cm4gZmFsc2VGdW5jO1xuXHRcdFx0fVxuXG5cdFx0XHRpZihkYXRhLmlnbm9yZUNhc2Upe1xuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uIHN0YXJ0SUMoZWxlbSl7XG5cdFx0XHRcdFx0dmFyIGF0dHIgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIG5hbWUpO1xuXHRcdFx0XHRcdHJldHVybiBhdHRyICE9IG51bGwgJiYgYXR0ci5zdWJzdHIoMCwgbGVuKS50b0xvd2VyQ2FzZSgpID09PSB2YWx1ZSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gc3RhcnQoZWxlbSl7XG5cdFx0XHRcdHZhciBhdHRyID0gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBuYW1lKTtcblx0XHRcdFx0cmV0dXJuIGF0dHIgIT0gbnVsbCAmJiBhdHRyLnN1YnN0cigwLCBsZW4pID09PSB2YWx1ZSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGVuZDogZnVuY3Rpb24obmV4dCwgZGF0YSl7XG5cdFx0XHR2YXIgbmFtZSAgPSBkYXRhLm5hbWUsXG5cdFx0XHRcdHZhbHVlID0gZGF0YS52YWx1ZSxcblx0XHRcdFx0bGVuICAgPSAtdmFsdWUubGVuZ3RoO1xuXG5cdFx0XHRpZihsZW4gPT09IDApe1xuXHRcdFx0XHRyZXR1cm4gZmFsc2VGdW5jO1xuXHRcdFx0fVxuXG5cdFx0XHRpZihkYXRhLmlnbm9yZUNhc2Upe1xuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGVuZElDKGVsZW0pe1xuXHRcdFx0XHRcdHZhciBhdHRyID0gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBuYW1lKTtcblx0XHRcdFx0XHRyZXR1cm4gYXR0ciAhPSBudWxsICYmIGF0dHIuc3Vic3RyKGxlbikudG9Mb3dlckNhc2UoKSA9PT0gdmFsdWUgJiYgbmV4dChlbGVtKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGVuZChlbGVtKXtcblx0XHRcdFx0dmFyIGF0dHIgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIG5hbWUpO1xuXHRcdFx0XHRyZXR1cm4gYXR0ciAhPSBudWxsICYmIGF0dHIuc3Vic3RyKGxlbikgPT09IHZhbHVlICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YW55OiBmdW5jdGlvbihuZXh0LCBkYXRhKXtcblx0XHRcdHZhciBuYW1lICA9IGRhdGEubmFtZSxcblx0XHRcdFx0dmFsdWUgPSBkYXRhLnZhbHVlO1xuXG5cdFx0XHRpZih2YWx1ZSA9PT0gXCJcIil7XG5cdFx0XHRcdHJldHVybiBmYWxzZUZ1bmM7XG5cdFx0XHR9XG5cblx0XHRcdGlmKGRhdGEuaWdub3JlQ2FzZSl7XG5cdFx0XHRcdHZhciByZWdleCA9IG5ldyBSZWdFeHAodmFsdWUucmVwbGFjZShyZUNoYXJzLCBcIlxcXFwkJlwiKSwgXCJpXCIpO1xuXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiBhbnlJQyhlbGVtKXtcblx0XHRcdFx0XHR2YXIgYXR0ciA9IGFkYXB0ZXIuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbSwgbmFtZSk7XG5cdFx0XHRcdFx0cmV0dXJuIGF0dHIgIT0gbnVsbCAmJiByZWdleC50ZXN0KGF0dHIpICYmIG5leHQoZWxlbSk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmdW5jdGlvbiBhbnkoZWxlbSl7XG5cdFx0XHRcdHZhciBhdHRyID0gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBuYW1lKTtcblx0XHRcdFx0cmV0dXJuIGF0dHIgIT0gbnVsbCAmJiBhdHRyLmluZGV4T2YodmFsdWUpID49IDAgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRub3Q6IGZ1bmN0aW9uKG5leHQsIGRhdGEpe1xuXHRcdFx0dmFyIG5hbWUgID0gZGF0YS5uYW1lLFxuXHRcdFx0XHR2YWx1ZSA9IGRhdGEudmFsdWU7XG5cblx0XHRcdGlmKHZhbHVlID09PSBcIlwiKXtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uIG5vdEVtcHR5KGVsZW0pe1xuXHRcdFx0XHRcdHJldHVybiAhIWFkYXB0ZXIuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbSwgbmFtZSkgJiYgbmV4dChlbGVtKTtcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSBpZihkYXRhLmlnbm9yZUNhc2Upe1xuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uIG5vdElDKGVsZW0pe1xuXHRcdFx0XHRcdHZhciBhdHRyID0gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBuYW1lKTtcblx0XHRcdFx0XHRyZXR1cm4gYXR0ciAhPSBudWxsICYmIGF0dHIudG9Mb3dlckNhc2UoKSAhPT0gdmFsdWUgJiYgbmV4dChlbGVtKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIG5vdChlbGVtKXtcblx0XHRcdFx0cmV0dXJuIGFkYXB0ZXIuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbSwgbmFtZSkgIT09IHZhbHVlICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH1cblx0fTtcblxuXHRyZXR1cm4ge1xuXHRcdGNvbXBpbGU6IGZ1bmN0aW9uKG5leHQsIGRhdGEsIG9wdGlvbnMpe1xuXHRcdFx0aWYob3B0aW9ucyAmJiBvcHRpb25zLnN0cmljdCAmJiAoXG5cdFx0XHRcdGRhdGEuaWdub3JlQ2FzZSB8fCBkYXRhLmFjdGlvbiA9PT0gXCJub3RcIlxuXHRcdFx0KSkgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgYXR0cmlidXRlIHNlbGVjdG9yXCIpO1xuXHRcdFx0cmV0dXJuIGF0dHJpYnV0ZVJ1bGVzW2RhdGEuYWN0aW9uXShuZXh0LCBkYXRhKTtcblx0XHR9LFxuXHRcdHJ1bGVzOiBhdHRyaWJ1dGVSdWxlc1xuXHR9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZhY3Rvcnk7XG5cblxuLyoqKi8gfSksXG4vKiAyNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IENTU3NlbGVjdDtcblxudmFyIERvbVV0aWxzICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSksXG5cdGZhbHNlRnVuYyAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KS5mYWxzZUZ1bmMsXG5cdGNvbXBpbGVGYWN0b3J5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MCksXG5cdGRlZmF1bHRDb21waWxlID0gY29tcGlsZUZhY3RvcnkoRG9tVXRpbHMpO1xuXG5mdW5jdGlvbiBhZGFwdGVyQ29tcGlsZShhZGFwdGVyKXtcblx0cmV0dXJuIGFkYXB0ZXIgPT09IERvbVV0aWxzID8gZGVmYXVsdENvbXBpbGUgOiBjb21waWxlRmFjdG9yeShhZGFwdGVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0U2VsZWN0b3JGdW5jKHNlYXJjaEZ1bmMpe1xuXHRyZXR1cm4gZnVuY3Rpb24gc2VsZWN0KHF1ZXJ5LCBlbGVtcywgb3B0aW9ucyl7XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblx0XHRvcHRpb25zLmFkYXB0ZXIgPSBvcHRpb25zLmFkYXB0ZXIgfHwgRG9tVXRpbHM7XG5cdFx0dmFyIGNvbXBpbGUgPSBhZGFwdGVyQ29tcGlsZShvcHRpb25zLmFkYXB0ZXIpO1xuXG5cdFx0aWYodHlwZW9mIHF1ZXJ5ICE9PSBcImZ1bmN0aW9uXCIpIHF1ZXJ5ID0gY29tcGlsZS5jb21waWxlVW5zYWZlKHF1ZXJ5LCBvcHRpb25zLCBlbGVtcyk7XG5cdFx0aWYocXVlcnkuc2hvdWxkVGVzdE5leHRTaWJsaW5ncykgZWxlbXMgPSBhcHBlbmROZXh0U2libGluZ3MoKG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0KSB8fCBlbGVtcywgb3B0aW9ucy5hZGFwdGVyKTtcblx0XHRpZighQXJyYXkuaXNBcnJheShlbGVtcykpIGVsZW1zID0gb3B0aW9ucy5hZGFwdGVyLmdldENoaWxkcmVuKGVsZW1zKTtcblx0XHRlbHNlIGVsZW1zID0gb3B0aW9ucy5hZGFwdGVyLnJlbW92ZVN1YnNldHMoZWxlbXMpO1xuXHRcdHJldHVybiBzZWFyY2hGdW5jKHF1ZXJ5LCBlbGVtcywgb3B0aW9ucyk7XG5cdH07XG59XG5cbmZ1bmN0aW9uIGdldE5leHRTaWJsaW5ncyhlbGVtLCBhZGFwdGVyKXtcblx0dmFyIHNpYmxpbmdzID0gYWRhcHRlci5nZXRTaWJsaW5ncyhlbGVtKTtcblx0aWYoIUFycmF5LmlzQXJyYXkoc2libGluZ3MpKSByZXR1cm4gW107XG5cdHNpYmxpbmdzID0gc2libGluZ3Muc2xpY2UoMCk7XG5cdHdoaWxlKHNpYmxpbmdzLnNoaWZ0KCkgIT09IGVsZW0pO1xuXHRyZXR1cm4gc2libGluZ3M7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZE5leHRTaWJsaW5ncyhlbGVtcywgYWRhcHRlcil7XG5cdC8vIE9yZGVyIG1hdHRlcnMgYmVjYXVzZSBqUXVlcnkgc2VlbXMgdG8gY2hlY2sgdGhlIGNoaWxkcmVuIGJlZm9yZSB0aGUgc2libGluZ3Ncblx0aWYoIUFycmF5LmlzQXJyYXkoZWxlbXMpKSBlbGVtcyA9IFtlbGVtc107XG5cdHZhciBuZXdFbGVtcyA9IGVsZW1zLnNsaWNlKDApO1xuXG5cdGZvcih2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXtcblx0XHR2YXIgbmV4dFNpYmxpbmdzID0gZ2V0TmV4dFNpYmxpbmdzKG5ld0VsZW1zW2ldLCBhZGFwdGVyKTtcblx0XHRuZXdFbGVtcy5wdXNoLmFwcGx5KG5ld0VsZW1zLCBuZXh0U2libGluZ3MpO1xuXHR9XG5cdHJldHVybiBuZXdFbGVtcztcbn1cblxudmFyIHNlbGVjdEFsbCA9IGdldFNlbGVjdG9yRnVuYyhmdW5jdGlvbiBzZWxlY3RBbGwocXVlcnksIGVsZW1zLCBvcHRpb25zKXtcblx0cmV0dXJuIChxdWVyeSA9PT0gZmFsc2VGdW5jIHx8ICFlbGVtcyB8fCBlbGVtcy5sZW5ndGggPT09IDApID8gW10gOiBvcHRpb25zLmFkYXB0ZXIuZmluZEFsbChxdWVyeSwgZWxlbXMpO1xufSk7XG5cbnZhciBzZWxlY3RPbmUgPSBnZXRTZWxlY3RvckZ1bmMoZnVuY3Rpb24gc2VsZWN0T25lKHF1ZXJ5LCBlbGVtcywgb3B0aW9ucyl7XG5cdHJldHVybiAocXVlcnkgPT09IGZhbHNlRnVuYyB8fCAhZWxlbXMgfHwgZWxlbXMubGVuZ3RoID09PSAwKSA/IG51bGwgOiBvcHRpb25zLmFkYXB0ZXIuZmluZE9uZShxdWVyeSwgZWxlbXMpO1xufSk7XG5cbmZ1bmN0aW9uIGlzKGVsZW0sIHF1ZXJ5LCBvcHRpb25zKXtcblx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblx0b3B0aW9ucy5hZGFwdGVyID0gb3B0aW9ucy5hZGFwdGVyIHx8IERvbVV0aWxzO1xuXHR2YXIgY29tcGlsZSA9IGFkYXB0ZXJDb21waWxlKG9wdGlvbnMuYWRhcHRlcik7XG5cdHJldHVybiAodHlwZW9mIHF1ZXJ5ID09PSBcImZ1bmN0aW9uXCIgPyBxdWVyeSA6IGNvbXBpbGUocXVlcnksIG9wdGlvbnMpKShlbGVtKTtcbn1cblxuLypcblx0dGhlIGV4cG9ydGVkIGludGVyZmFjZVxuKi9cbmZ1bmN0aW9uIENTU3NlbGVjdChxdWVyeSwgZWxlbXMsIG9wdGlvbnMpe1xuXHRyZXR1cm4gc2VsZWN0QWxsKHF1ZXJ5LCBlbGVtcywgb3B0aW9ucyk7XG59XG5cbkNTU3NlbGVjdC5jb21waWxlID0gZGVmYXVsdENvbXBpbGU7XG5DU1NzZWxlY3QuZmlsdGVycyA9IGRlZmF1bHRDb21waWxlLlBzZXVkb3MuZmlsdGVycztcbkNTU3NlbGVjdC5wc2V1ZG9zID0gZGVmYXVsdENvbXBpbGUuUHNldWRvcy5wc2V1ZG9zO1xuXG5DU1NzZWxlY3Quc2VsZWN0QWxsID0gc2VsZWN0QWxsO1xuQ1NTc2VsZWN0LnNlbGVjdE9uZSA9IHNlbGVjdE9uZTtcblxuQ1NTc2VsZWN0LmlzID0gaXM7XG5cbi8vbGVnYWN5IG1ldGhvZHMgKG1pZ2h0IGJlIHJlbW92ZWQpXG5DU1NzZWxlY3QucGFyc2UgPSBkZWZhdWx0Q29tcGlsZTtcbkNTU3NlbGVjdC5pdGVyYXRlID0gc2VsZWN0QWxsO1xuXG4vL2hvb2tzXG5DU1NzZWxlY3QuX2NvbXBpbGVVbnNhZmUgPSBkZWZhdWx0Q29tcGlsZS5jb21waWxlVW5zYWZlO1xuQ1NTc2VsZWN0Ll9jb21waWxlVG9rZW4gPSBkZWZhdWx0Q29tcGlsZS5jb21waWxlVG9rZW47XG5cblxuLyoqKi8gfSksXG4vKiAyNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgRG9tVXRpbHMgPSBtb2R1bGUuZXhwb3J0cztcblxuW1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDI2KSxcblx0X193ZWJwYWNrX3JlcXVpcmVfXygzNSksXG5cdF9fd2VicGFja19yZXF1aXJlX18oMzYpLFxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDM3KSxcblx0X193ZWJwYWNrX3JlcXVpcmVfXygzOCksXG5cdF9fd2VicGFja19yZXF1aXJlX18oMzkpXG5dLmZvckVhY2goZnVuY3Rpb24oZXh0KXtcblx0T2JqZWN0LmtleXMoZXh0KS5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7XG5cdFx0RG9tVXRpbHNba2V5XSA9IGV4dFtrZXldLmJpbmQoRG9tVXRpbHMpO1xuXHR9KTtcbn0pO1xuXG5cbi8qKiovIH0pLFxuLyogMjYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIEVsZW1lbnRUeXBlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KSxcbiAgICBnZXRPdXRlckhUTUwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KSxcbiAgICBpc1RhZyA9IEVsZW1lbnRUeXBlLmlzVGFnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0Z2V0SW5uZXJIVE1MOiBnZXRJbm5lckhUTUwsXG5cdGdldE91dGVySFRNTDogZ2V0T3V0ZXJIVE1MLFxuXHRnZXRUZXh0OiBnZXRUZXh0XG59O1xuXG5mdW5jdGlvbiBnZXRJbm5lckhUTUwoZWxlbSwgb3B0cyl7XG5cdHJldHVybiBlbGVtLmNoaWxkcmVuID8gZWxlbS5jaGlsZHJlbi5tYXAoZnVuY3Rpb24oZWxlbSl7XG5cdFx0cmV0dXJuIGdldE91dGVySFRNTChlbGVtLCBvcHRzKTtcblx0fSkuam9pbihcIlwiKSA6IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGdldFRleHQoZWxlbSl7XG5cdGlmKEFycmF5LmlzQXJyYXkoZWxlbSkpIHJldHVybiBlbGVtLm1hcChnZXRUZXh0KS5qb2luKFwiXCIpO1xuXHRpZihpc1RhZyhlbGVtKSB8fCBlbGVtLnR5cGUgPT09IEVsZW1lbnRUeXBlLkNEQVRBKSByZXR1cm4gZ2V0VGV4dChlbGVtLmNoaWxkcmVuKTtcblx0aWYoZWxlbS50eXBlID09PSBFbGVtZW50VHlwZS5UZXh0KSByZXR1cm4gZWxlbS5kYXRhO1xuXHRyZXR1cm4gXCJcIjtcbn1cblxuXG4vKioqLyB9KSxcbi8qIDI3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbi8qXG4gIE1vZHVsZSBkZXBlbmRlbmNpZXNcbiovXG52YXIgRWxlbWVudFR5cGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI4KTtcbnZhciBlbnRpdGllcyA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpO1xuXG4vKlxuICBCb29sZWFuIEF0dHJpYnV0ZXNcbiovXG52YXIgYm9vbGVhbkF0dHJpYnV0ZXMgPSB7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgYWxsb3dmdWxsc2NyZWVuOiB0cnVlLFxuICBhc3luYzogdHJ1ZSxcbiAgYXV0b2ZvY3VzOiB0cnVlLFxuICBhdXRvcGxheTogdHJ1ZSxcbiAgY2hlY2tlZDogdHJ1ZSxcbiAgY29udHJvbHM6IHRydWUsXG4gIGRlZmF1bHQ6IHRydWUsXG4gIGRlZmVyOiB0cnVlLFxuICBkaXNhYmxlZDogdHJ1ZSxcbiAgaGlkZGVuOiB0cnVlLFxuICBpc21hcDogdHJ1ZSxcbiAgbG9vcDogdHJ1ZSxcbiAgbXVsdGlwbGU6IHRydWUsXG4gIG11dGVkOiB0cnVlLFxuICBvcGVuOiB0cnVlLFxuICByZWFkb25seTogdHJ1ZSxcbiAgcmVxdWlyZWQ6IHRydWUsXG4gIHJldmVyc2VkOiB0cnVlLFxuICBzY29wZWQ6IHRydWUsXG4gIHNlYW1sZXNzOiB0cnVlLFxuICBzZWxlY3RlZDogdHJ1ZSxcbiAgdHlwZW11c3RtYXRjaDogdHJ1ZVxufTtcblxudmFyIHVuZW5jb2RlZEVsZW1lbnRzID0ge1xuICBfX3Byb3RvX186IG51bGwsXG4gIHN0eWxlOiB0cnVlLFxuICBzY3JpcHQ6IHRydWUsXG4gIHhtcDogdHJ1ZSxcbiAgaWZyYW1lOiB0cnVlLFxuICBub2VtYmVkOiB0cnVlLFxuICBub2ZyYW1lczogdHJ1ZSxcbiAgcGxhaW50ZXh0OiB0cnVlLFxuICBub3NjcmlwdDogdHJ1ZVxufTtcblxuLypcbiAgRm9ybWF0IGF0dHJpYnV0ZXNcbiovXG5mdW5jdGlvbiBmb3JtYXRBdHRycyhhdHRyaWJ1dGVzLCBvcHRzKSB7XG4gIGlmICghYXR0cmlidXRlcykgcmV0dXJuO1xuXG4gIHZhciBvdXRwdXQgPSAnJyxcbiAgICAgIHZhbHVlO1xuXG4gIC8vIExvb3AgdGhyb3VnaCB0aGUgYXR0cmlidXRlc1xuICBmb3IgKHZhciBrZXkgaW4gYXR0cmlidXRlcykge1xuICAgIHZhbHVlID0gYXR0cmlidXRlc1trZXldO1xuICAgIGlmIChvdXRwdXQpIHtcbiAgICAgIG91dHB1dCArPSAnICc7XG4gICAgfVxuXG4gICAgaWYgKCF2YWx1ZSAmJiBib29sZWFuQXR0cmlidXRlc1trZXldKSB7XG4gICAgICBvdXRwdXQgKz0ga2V5O1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQgKz0ga2V5ICsgJz1cIicgKyAob3B0cy5kZWNvZGVFbnRpdGllcyA/IGVudGl0aWVzLmVuY29kZVhNTCh2YWx1ZSkgOiB2YWx1ZSkgKyAnXCInO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbi8qXG4gIFNlbGYtZW5jbG9zaW5nIHRhZ3MgKHN0b2xlbiBmcm9tIG5vZGUtaHRtbHBhcnNlcilcbiovXG52YXIgc2luZ2xlVGFnID0ge1xuICBfX3Byb3RvX186IG51bGwsXG4gIGFyZWE6IHRydWUsXG4gIGJhc2U6IHRydWUsXG4gIGJhc2Vmb250OiB0cnVlLFxuICBicjogdHJ1ZSxcbiAgY29sOiB0cnVlLFxuICBjb21tYW5kOiB0cnVlLFxuICBlbWJlZDogdHJ1ZSxcbiAgZnJhbWU6IHRydWUsXG4gIGhyOiB0cnVlLFxuICBpbWc6IHRydWUsXG4gIGlucHV0OiB0cnVlLFxuICBpc2luZGV4OiB0cnVlLFxuICBrZXlnZW46IHRydWUsXG4gIGxpbms6IHRydWUsXG4gIG1ldGE6IHRydWUsXG4gIHBhcmFtOiB0cnVlLFxuICBzb3VyY2U6IHRydWUsXG4gIHRyYWNrOiB0cnVlLFxuICB3YnI6IHRydWUsXG59O1xuXG5cbnZhciByZW5kZXIgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRvbSwgb3B0cykge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZG9tKSAmJiAhZG9tLmNoZWVyaW8pIGRvbSA9IFtkb21dO1xuICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICB2YXIgb3V0cHV0ID0gJyc7XG5cbiAgZm9yKHZhciBpID0gMDsgaSA8IGRvbS5sZW5ndGg7IGkrKyl7XG4gICAgdmFyIGVsZW0gPSBkb21baV07XG5cbiAgICBpZiAoZWxlbS50eXBlID09PSAncm9vdCcpXG4gICAgICBvdXRwdXQgKz0gcmVuZGVyKGVsZW0uY2hpbGRyZW4sIG9wdHMpO1xuICAgIGVsc2UgaWYgKEVsZW1lbnRUeXBlLmlzVGFnKGVsZW0pKVxuICAgICAgb3V0cHV0ICs9IHJlbmRlclRhZyhlbGVtLCBvcHRzKTtcbiAgICBlbHNlIGlmIChlbGVtLnR5cGUgPT09IEVsZW1lbnRUeXBlLkRpcmVjdGl2ZSlcbiAgICAgIG91dHB1dCArPSByZW5kZXJEaXJlY3RpdmUoZWxlbSk7XG4gICAgZWxzZSBpZiAoZWxlbS50eXBlID09PSBFbGVtZW50VHlwZS5Db21tZW50KVxuICAgICAgb3V0cHV0ICs9IHJlbmRlckNvbW1lbnQoZWxlbSk7XG4gICAgZWxzZSBpZiAoZWxlbS50eXBlID09PSBFbGVtZW50VHlwZS5DREFUQSlcbiAgICAgIG91dHB1dCArPSByZW5kZXJDZGF0YShlbGVtKTtcbiAgICBlbHNlXG4gICAgICBvdXRwdXQgKz0gcmVuZGVyVGV4dChlbGVtLCBvcHRzKTtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59O1xuXG5mdW5jdGlvbiByZW5kZXJUYWcoZWxlbSwgb3B0cykge1xuICAvLyBIYW5kbGUgU1ZHXG4gIGlmIChlbGVtLm5hbWUgPT09IFwic3ZnXCIpIG9wdHMgPSB7ZGVjb2RlRW50aXRpZXM6IG9wdHMuZGVjb2RlRW50aXRpZXMsIHhtbE1vZGU6IHRydWV9O1xuXG4gIHZhciB0YWcgPSAnPCcgKyBlbGVtLm5hbWUsXG4gICAgICBhdHRyaWJzID0gZm9ybWF0QXR0cnMoZWxlbS5hdHRyaWJzLCBvcHRzKTtcblxuICBpZiAoYXR0cmlicykge1xuICAgIHRhZyArPSAnICcgKyBhdHRyaWJzO1xuICB9XG5cbiAgaWYgKFxuICAgIG9wdHMueG1sTW9kZVxuICAgICYmICghZWxlbS5jaGlsZHJlbiB8fCBlbGVtLmNoaWxkcmVuLmxlbmd0aCA9PT0gMClcbiAgKSB7XG4gICAgdGFnICs9ICcvPic7XG4gIH0gZWxzZSB7XG4gICAgdGFnICs9ICc+JztcbiAgICBpZiAoZWxlbS5jaGlsZHJlbikge1xuICAgICAgdGFnICs9IHJlbmRlcihlbGVtLmNoaWxkcmVuLCBvcHRzKTtcbiAgICB9XG5cbiAgICBpZiAoIXNpbmdsZVRhZ1tlbGVtLm5hbWVdIHx8IG9wdHMueG1sTW9kZSkge1xuICAgICAgdGFnICs9ICc8LycgKyBlbGVtLm5hbWUgKyAnPic7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhZztcbn1cblxuZnVuY3Rpb24gcmVuZGVyRGlyZWN0aXZlKGVsZW0pIHtcbiAgcmV0dXJuICc8JyArIGVsZW0uZGF0YSArICc+Jztcbn1cblxuZnVuY3Rpb24gcmVuZGVyVGV4dChlbGVtLCBvcHRzKSB7XG4gIHZhciBkYXRhID0gZWxlbS5kYXRhIHx8ICcnO1xuXG4gIC8vIGlmIGVudGl0aWVzIHdlcmVuJ3QgZGVjb2RlZCwgbm8gbmVlZCB0byBlbmNvZGUgdGhlbSBiYWNrXG4gIGlmIChvcHRzLmRlY29kZUVudGl0aWVzICYmICEoZWxlbS5wYXJlbnQgJiYgZWxlbS5wYXJlbnQubmFtZSBpbiB1bmVuY29kZWRFbGVtZW50cykpIHtcbiAgICBkYXRhID0gZW50aXRpZXMuZW5jb2RlWE1MKGRhdGEpO1xuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckNkYXRhKGVsZW0pIHtcbiAgcmV0dXJuICc8IVtDREFUQVsnICsgZWxlbS5jaGlsZHJlblswXS5kYXRhICsgJ11dPic7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckNvbW1lbnQoZWxlbSkge1xuICByZXR1cm4gJzwhLS0nICsgZWxlbS5kYXRhICsgJy0tPic7XG59XG5cblxuLyoqKi8gfSksXG4vKiAyOCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG4vL1R5cGVzIG9mIGVsZW1lbnRzIGZvdW5kIGluIHRoZSBET01cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRUZXh0OiBcInRleHRcIiwgLy9UZXh0XG5cdERpcmVjdGl2ZTogXCJkaXJlY3RpdmVcIiwgLy88PyAuLi4gPz5cblx0Q29tbWVudDogXCJjb21tZW50XCIsIC8vPCEtLSAuLi4gLS0+XG5cdFNjcmlwdDogXCJzY3JpcHRcIiwgLy88c2NyaXB0PiB0YWdzXG5cdFN0eWxlOiBcInN0eWxlXCIsIC8vPHN0eWxlPiB0YWdzXG5cdFRhZzogXCJ0YWdcIiwgLy9BbnkgdGFnXG5cdENEQVRBOiBcImNkYXRhXCIsIC8vPCFbQ0RBVEFbIC4uLiBdXT5cblxuXHRpc1RhZzogZnVuY3Rpb24oZWxlbSl7XG5cdFx0cmV0dXJuIGVsZW0udHlwZSA9PT0gXCJ0YWdcIiB8fCBlbGVtLnR5cGUgPT09IFwic2NyaXB0XCIgfHwgZWxlbS50eXBlID09PSBcInN0eWxlXCI7XG5cdH1cbn07XG5cbi8qKiovIH0pLFxuLyogMjkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGVuY29kZSA9IF9fd2VicGFja19yZXF1aXJlX18oMzApLFxuICAgIGRlY29kZSA9IF9fd2VicGFja19yZXF1aXJlX18oMzEpO1xuXG5leHBvcnRzLmRlY29kZSA9IGZ1bmN0aW9uKGRhdGEsIGxldmVsKXtcblx0cmV0dXJuICghbGV2ZWwgfHwgbGV2ZWwgPD0gMCA/IGRlY29kZS5YTUwgOiBkZWNvZGUuSFRNTCkoZGF0YSk7XG59O1xuXG5leHBvcnRzLmRlY29kZVN0cmljdCA9IGZ1bmN0aW9uKGRhdGEsIGxldmVsKXtcblx0cmV0dXJuICghbGV2ZWwgfHwgbGV2ZWwgPD0gMCA/IGRlY29kZS5YTUwgOiBkZWNvZGUuSFRNTFN0cmljdCkoZGF0YSk7XG59O1xuXG5leHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uKGRhdGEsIGxldmVsKXtcblx0cmV0dXJuICghbGV2ZWwgfHwgbGV2ZWwgPD0gMCA/IGVuY29kZS5YTUwgOiBlbmNvZGUuSFRNTCkoZGF0YSk7XG59O1xuXG5leHBvcnRzLmVuY29kZVhNTCA9IGVuY29kZS5YTUw7XG5cbmV4cG9ydHMuZW5jb2RlSFRNTDQgPVxuZXhwb3J0cy5lbmNvZGVIVE1MNSA9XG5leHBvcnRzLmVuY29kZUhUTUwgID0gZW5jb2RlLkhUTUw7XG5cbmV4cG9ydHMuZGVjb2RlWE1MID1cbmV4cG9ydHMuZGVjb2RlWE1MU3RyaWN0ID0gZGVjb2RlLlhNTDtcblxuZXhwb3J0cy5kZWNvZGVIVE1MNCA9XG5leHBvcnRzLmRlY29kZUhUTUw1ID1cbmV4cG9ydHMuZGVjb2RlSFRNTCA9IGRlY29kZS5IVE1MO1xuXG5leHBvcnRzLmRlY29kZUhUTUw0U3RyaWN0ID1cbmV4cG9ydHMuZGVjb2RlSFRNTDVTdHJpY3QgPVxuZXhwb3J0cy5kZWNvZGVIVE1MU3RyaWN0ID0gZGVjb2RlLkhUTUxTdHJpY3Q7XG5cbmV4cG9ydHMuZXNjYXBlID0gZW5jb2RlLmVzY2FwZTtcblxuXG4vKioqLyB9KSxcbi8qIDMwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBpbnZlcnNlWE1MID0gZ2V0SW52ZXJzZU9iaihfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKSksXG4gICAgeG1sUmVwbGFjZXIgPSBnZXRJbnZlcnNlUmVwbGFjZXIoaW52ZXJzZVhNTCk7XG5cbmV4cG9ydHMuWE1MID0gZ2V0SW52ZXJzZShpbnZlcnNlWE1MLCB4bWxSZXBsYWNlcik7XG5cbnZhciBpbnZlcnNlSFRNTCA9IGdldEludmVyc2VPYmooX193ZWJwYWNrX3JlcXVpcmVfXygxNCkpLFxuICAgIGh0bWxSZXBsYWNlciA9IGdldEludmVyc2VSZXBsYWNlcihpbnZlcnNlSFRNTCk7XG5cbmV4cG9ydHMuSFRNTCA9IGdldEludmVyc2UoaW52ZXJzZUhUTUwsIGh0bWxSZXBsYWNlcik7XG5cbmZ1bmN0aW9uIGdldEludmVyc2VPYmoob2JqKXtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG9iaikuc29ydCgpLnJlZHVjZShmdW5jdGlvbihpbnZlcnNlLCBuYW1lKXtcblx0XHRpbnZlcnNlW29ialtuYW1lXV0gPSBcIiZcIiArIG5hbWUgKyBcIjtcIjtcblx0XHRyZXR1cm4gaW52ZXJzZTtcblx0fSwge30pO1xufVxuXG5mdW5jdGlvbiBnZXRJbnZlcnNlUmVwbGFjZXIoaW52ZXJzZSl7XG5cdHZhciBzaW5nbGUgPSBbXSxcblx0ICAgIG11bHRpcGxlID0gW107XG5cblx0T2JqZWN0LmtleXMoaW52ZXJzZSkuZm9yRWFjaChmdW5jdGlvbihrKXtcblx0XHRpZihrLmxlbmd0aCA9PT0gMSl7XG5cdFx0XHRzaW5nbGUucHVzaChcIlxcXFxcIiArIGspO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtdWx0aXBsZS5wdXNoKGspO1xuXHRcdH1cblx0fSk7XG5cblx0Ly9UT0RPIGFkZCByYW5nZXNcblx0bXVsdGlwbGUudW5zaGlmdChcIltcIiArIHNpbmdsZS5qb2luKFwiXCIpICsgXCJdXCIpO1xuXG5cdHJldHVybiBuZXcgUmVnRXhwKG11bHRpcGxlLmpvaW4oXCJ8XCIpLCBcImdcIik7XG59XG5cbnZhciByZV9ub25BU0NJSSA9IC9bXlxcMC1cXHg3Rl0vZyxcbiAgICByZV9hc3RyYWxTeW1ib2xzID0gL1tcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl0vZztcblxuZnVuY3Rpb24gc2luZ2xlQ2hhclJlcGxhY2VyKGMpe1xuXHRyZXR1cm4gXCImI3hcIiArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSArIFwiO1wiO1xufVxuXG5mdW5jdGlvbiBhc3RyYWxSZXBsYWNlcihjKXtcblx0Ly8gaHR0cDovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZyNzdXJyb2dhdGUtZm9ybXVsYWVcblx0dmFyIGhpZ2ggPSBjLmNoYXJDb2RlQXQoMCk7XG5cdHZhciBsb3cgID0gYy5jaGFyQ29kZUF0KDEpO1xuXHR2YXIgY29kZVBvaW50ID0gKGhpZ2ggLSAweEQ4MDApICogMHg0MDAgKyBsb3cgLSAweERDMDAgKyAweDEwMDAwO1xuXHRyZXR1cm4gXCImI3hcIiArIGNvZGVQb2ludC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSArIFwiO1wiO1xufVxuXG5mdW5jdGlvbiBnZXRJbnZlcnNlKGludmVyc2UsIHJlKXtcblx0ZnVuY3Rpb24gZnVuYyhuYW1lKXtcblx0XHRyZXR1cm4gaW52ZXJzZVtuYW1lXTtcblx0fVxuXG5cdHJldHVybiBmdW5jdGlvbihkYXRhKXtcblx0XHRyZXR1cm4gZGF0YVxuXHRcdFx0XHQucmVwbGFjZShyZSwgZnVuYylcblx0XHRcdFx0LnJlcGxhY2UocmVfYXN0cmFsU3ltYm9scywgYXN0cmFsUmVwbGFjZXIpXG5cdFx0XHRcdC5yZXBsYWNlKHJlX25vbkFTQ0lJLCBzaW5nbGVDaGFyUmVwbGFjZXIpO1xuXHR9O1xufVxuXG52YXIgcmVfeG1sQ2hhcnMgPSBnZXRJbnZlcnNlUmVwbGFjZXIoaW52ZXJzZVhNTCk7XG5cbmZ1bmN0aW9uIGVzY2FwZVhNTChkYXRhKXtcblx0cmV0dXJuIGRhdGFcblx0XHRcdC5yZXBsYWNlKHJlX3htbENoYXJzLCBzaW5nbGVDaGFyUmVwbGFjZXIpXG5cdFx0XHQucmVwbGFjZShyZV9hc3RyYWxTeW1ib2xzLCBhc3RyYWxSZXBsYWNlcilcblx0XHRcdC5yZXBsYWNlKHJlX25vbkFTQ0lJLCBzaW5nbGVDaGFyUmVwbGFjZXIpO1xufVxuXG5leHBvcnRzLmVzY2FwZSA9IGVzY2FwZVhNTDtcblxuXG4vKioqLyB9KSxcbi8qIDMxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBlbnRpdHlNYXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KSxcbiAgICBsZWdhY3lNYXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMyKSxcbiAgICB4bWxNYXAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKSxcbiAgICBkZWNvZGVDb2RlUG9pbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMzKTtcblxudmFyIGRlY29kZVhNTFN0cmljdCAgPSBnZXRTdHJpY3REZWNvZGVyKHhtbE1hcCksXG4gICAgZGVjb2RlSFRNTFN0cmljdCA9IGdldFN0cmljdERlY29kZXIoZW50aXR5TWFwKTtcblxuZnVuY3Rpb24gZ2V0U3RyaWN0RGVjb2RlcihtYXApe1xuXHR2YXIga2V5cyA9IE9iamVjdC5rZXlzKG1hcCkuam9pbihcInxcIiksXG5cdCAgICByZXBsYWNlID0gZ2V0UmVwbGFjZXIobWFwKTtcblxuXHRrZXlzICs9IFwifCNbeFhdW1xcXFxkYS1mQS1GXSt8I1xcXFxkK1wiO1xuXG5cdHZhciByZSA9IG5ldyBSZWdFeHAoXCImKD86XCIgKyBrZXlzICsgXCIpO1wiLCBcImdcIik7XG5cblx0cmV0dXJuIGZ1bmN0aW9uKHN0cil7XG5cdFx0cmV0dXJuIFN0cmluZyhzdHIpLnJlcGxhY2UocmUsIHJlcGxhY2UpO1xuXHR9O1xufVxuXG52YXIgZGVjb2RlSFRNTCA9IChmdW5jdGlvbigpe1xuXHR2YXIgbGVnYWN5ID0gT2JqZWN0LmtleXMobGVnYWN5TWFwKVxuXHRcdC5zb3J0KHNvcnRlcik7XG5cblx0dmFyIGtleXMgPSBPYmplY3Qua2V5cyhlbnRpdHlNYXApXG5cdFx0LnNvcnQoc29ydGVyKTtcblxuXHRmb3IodmFyIGkgPSAwLCBqID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspe1xuXHRcdGlmKGxlZ2FjeVtqXSA9PT0ga2V5c1tpXSl7XG5cdFx0XHRrZXlzW2ldICs9IFwiOz9cIjtcblx0XHRcdGorKztcblx0XHR9IGVsc2Uge1xuXHRcdFx0a2V5c1tpXSArPSBcIjtcIjtcblx0XHR9XG5cdH1cblxuXHR2YXIgcmUgPSBuZXcgUmVnRXhwKFwiJig/OlwiICsga2V5cy5qb2luKFwifFwiKSArIFwifCNbeFhdW1xcXFxkYS1mQS1GXSs7P3wjXFxcXGQrOz8pXCIsIFwiZ1wiKSxcblx0ICAgIHJlcGxhY2UgPSBnZXRSZXBsYWNlcihlbnRpdHlNYXApO1xuXG5cdGZ1bmN0aW9uIHJlcGxhY2VyKHN0cil7XG5cdFx0aWYoc3RyLnN1YnN0cigtMSkgIT09IFwiO1wiKSBzdHIgKz0gXCI7XCI7XG5cdFx0cmV0dXJuIHJlcGxhY2Uoc3RyKTtcblx0fVxuXG5cdC8vVE9ETyBjb25zaWRlciBjcmVhdGluZyBhIG1lcmdlZCBtYXBcblx0cmV0dXJuIGZ1bmN0aW9uKHN0cil7XG5cdFx0cmV0dXJuIFN0cmluZyhzdHIpLnJlcGxhY2UocmUsIHJlcGxhY2VyKTtcblx0fTtcbn0oKSk7XG5cbmZ1bmN0aW9uIHNvcnRlcihhLCBiKXtcblx0cmV0dXJuIGEgPCBiID8gMSA6IC0xO1xufVxuXG5mdW5jdGlvbiBnZXRSZXBsYWNlcihtYXApe1xuXHRyZXR1cm4gZnVuY3Rpb24gcmVwbGFjZShzdHIpe1xuXHRcdGlmKHN0ci5jaGFyQXQoMSkgPT09IFwiI1wiKXtcblx0XHRcdGlmKHN0ci5jaGFyQXQoMikgPT09IFwiWFwiIHx8IHN0ci5jaGFyQXQoMikgPT09IFwieFwiKXtcblx0XHRcdFx0cmV0dXJuIGRlY29kZUNvZGVQb2ludChwYXJzZUludChzdHIuc3Vic3RyKDMpLCAxNikpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGRlY29kZUNvZGVQb2ludChwYXJzZUludChzdHIuc3Vic3RyKDIpLCAxMCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gbWFwW3N0ci5zbGljZSgxLCAtMSldO1xuXHR9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0WE1MOiBkZWNvZGVYTUxTdHJpY3QsXG5cdEhUTUw6IGRlY29kZUhUTUwsXG5cdEhUTUxTdHJpY3Q6IGRlY29kZUhUTUxTdHJpY3Rcbn07XG5cbi8qKiovIH0pLFxuLyogMzIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSB7XCJBYWN1dGVcIjpcIsOBXCIsXCJhYWN1dGVcIjpcIsOhXCIsXCJBY2lyY1wiOlwiw4JcIixcImFjaXJjXCI6XCLDolwiLFwiYWN1dGVcIjpcIsK0XCIsXCJBRWxpZ1wiOlwiw4ZcIixcImFlbGlnXCI6XCLDplwiLFwiQWdyYXZlXCI6XCLDgFwiLFwiYWdyYXZlXCI6XCLDoFwiLFwiYW1wXCI6XCImXCIsXCJBTVBcIjpcIiZcIixcIkFyaW5nXCI6XCLDhVwiLFwiYXJpbmdcIjpcIsOlXCIsXCJBdGlsZGVcIjpcIsODXCIsXCJhdGlsZGVcIjpcIsOjXCIsXCJBdW1sXCI6XCLDhFwiLFwiYXVtbFwiOlwiw6RcIixcImJydmJhclwiOlwiwqZcIixcIkNjZWRpbFwiOlwiw4dcIixcImNjZWRpbFwiOlwiw6dcIixcImNlZGlsXCI6XCLCuFwiLFwiY2VudFwiOlwiwqJcIixcImNvcHlcIjpcIsKpXCIsXCJDT1BZXCI6XCLCqVwiLFwiY3VycmVuXCI6XCLCpFwiLFwiZGVnXCI6XCLCsFwiLFwiZGl2aWRlXCI6XCLDt1wiLFwiRWFjdXRlXCI6XCLDiVwiLFwiZWFjdXRlXCI6XCLDqVwiLFwiRWNpcmNcIjpcIsOKXCIsXCJlY2lyY1wiOlwiw6pcIixcIkVncmF2ZVwiOlwiw4hcIixcImVncmF2ZVwiOlwiw6hcIixcIkVUSFwiOlwiw5BcIixcImV0aFwiOlwiw7BcIixcIkV1bWxcIjpcIsOLXCIsXCJldW1sXCI6XCLDq1wiLFwiZnJhYzEyXCI6XCLCvVwiLFwiZnJhYzE0XCI6XCLCvFwiLFwiZnJhYzM0XCI6XCLCvlwiLFwiZ3RcIjpcIj5cIixcIkdUXCI6XCI+XCIsXCJJYWN1dGVcIjpcIsONXCIsXCJpYWN1dGVcIjpcIsOtXCIsXCJJY2lyY1wiOlwiw45cIixcImljaXJjXCI6XCLDrlwiLFwiaWV4Y2xcIjpcIsKhXCIsXCJJZ3JhdmVcIjpcIsOMXCIsXCJpZ3JhdmVcIjpcIsOsXCIsXCJpcXVlc3RcIjpcIsK/XCIsXCJJdW1sXCI6XCLDj1wiLFwiaXVtbFwiOlwiw69cIixcImxhcXVvXCI6XCLCq1wiLFwibHRcIjpcIjxcIixcIkxUXCI6XCI8XCIsXCJtYWNyXCI6XCLCr1wiLFwibWljcm9cIjpcIsK1XCIsXCJtaWRkb3RcIjpcIsK3XCIsXCJuYnNwXCI6XCLCoFwiLFwibm90XCI6XCLCrFwiLFwiTnRpbGRlXCI6XCLDkVwiLFwibnRpbGRlXCI6XCLDsVwiLFwiT2FjdXRlXCI6XCLDk1wiLFwib2FjdXRlXCI6XCLDs1wiLFwiT2NpcmNcIjpcIsOUXCIsXCJvY2lyY1wiOlwiw7RcIixcIk9ncmF2ZVwiOlwiw5JcIixcIm9ncmF2ZVwiOlwiw7JcIixcIm9yZGZcIjpcIsKqXCIsXCJvcmRtXCI6XCLCulwiLFwiT3NsYXNoXCI6XCLDmFwiLFwib3NsYXNoXCI6XCLDuFwiLFwiT3RpbGRlXCI6XCLDlVwiLFwib3RpbGRlXCI6XCLDtVwiLFwiT3VtbFwiOlwiw5ZcIixcIm91bWxcIjpcIsO2XCIsXCJwYXJhXCI6XCLCtlwiLFwicGx1c21uXCI6XCLCsVwiLFwicG91bmRcIjpcIsKjXCIsXCJxdW90XCI6XCJcXFwiXCIsXCJRVU9UXCI6XCJcXFwiXCIsXCJyYXF1b1wiOlwiwrtcIixcInJlZ1wiOlwiwq5cIixcIlJFR1wiOlwiwq5cIixcInNlY3RcIjpcIsKnXCIsXCJzaHlcIjpcIsKtXCIsXCJzdXAxXCI6XCLCuVwiLFwic3VwMlwiOlwiwrJcIixcInN1cDNcIjpcIsKzXCIsXCJzemxpZ1wiOlwiw59cIixcIlRIT1JOXCI6XCLDnlwiLFwidGhvcm5cIjpcIsO+XCIsXCJ0aW1lc1wiOlwiw5dcIixcIlVhY3V0ZVwiOlwiw5pcIixcInVhY3V0ZVwiOlwiw7pcIixcIlVjaXJjXCI6XCLDm1wiLFwidWNpcmNcIjpcIsO7XCIsXCJVZ3JhdmVcIjpcIsOZXCIsXCJ1Z3JhdmVcIjpcIsO5XCIsXCJ1bWxcIjpcIsKoXCIsXCJVdW1sXCI6XCLDnFwiLFwidXVtbFwiOlwiw7xcIixcIllhY3V0ZVwiOlwiw51cIixcInlhY3V0ZVwiOlwiw71cIixcInllblwiOlwiwqVcIixcInl1bWxcIjpcIsO/XCJ9XG5cbi8qKiovIH0pLFxuLyogMzMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGRlY29kZU1hcCA9IF9fd2VicGFja19yZXF1aXJlX18oMzQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlY29kZUNvZGVQb2ludDtcblxuLy8gbW9kaWZpZWQgdmVyc2lvbiBvZiBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9oZS9ibG9iL21hc3Rlci9zcmMvaGUuanMjTDk0LUwxMTlcbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludChjb2RlUG9pbnQpe1xuXG5cdGlmKChjb2RlUG9pbnQgPj0gMHhEODAwICYmIGNvZGVQb2ludCA8PSAweERGRkYpIHx8IGNvZGVQb2ludCA+IDB4MTBGRkZGKXtcblx0XHRyZXR1cm4gXCJcXHVGRkZEXCI7XG5cdH1cblxuXHRpZihjb2RlUG9pbnQgaW4gZGVjb2RlTWFwKXtcblx0XHRjb2RlUG9pbnQgPSBkZWNvZGVNYXBbY29kZVBvaW50XTtcblx0fVxuXG5cdHZhciBvdXRwdXQgPSBcIlwiO1xuXG5cdGlmKGNvZGVQb2ludCA+IDB4RkZGRil7XG5cdFx0Y29kZVBvaW50IC09IDB4MTAwMDA7XG5cdFx0b3V0cHV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKTtcblx0XHRjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRjtcblx0fVxuXG5cdG91dHB1dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGVQb2ludCk7XG5cdHJldHVybiBvdXRwdXQ7XG59XG5cblxuLyoqKi8gfSksXG4vKiAzNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcIjBcIjo2NTUzMyxcIjEyOFwiOjgzNjQsXCIxMzBcIjo4MjE4LFwiMTMxXCI6NDAyLFwiMTMyXCI6ODIyMixcIjEzM1wiOjgyMzAsXCIxMzRcIjo4MjI0LFwiMTM1XCI6ODIyNSxcIjEzNlwiOjcxMCxcIjEzN1wiOjgyNDAsXCIxMzhcIjozNTIsXCIxMzlcIjo4MjQ5LFwiMTQwXCI6MzM4LFwiMTQyXCI6MzgxLFwiMTQ1XCI6ODIxNixcIjE0NlwiOjgyMTcsXCIxNDdcIjo4MjIwLFwiMTQ4XCI6ODIyMSxcIjE0OVwiOjgyMjYsXCIxNTBcIjo4MjExLFwiMTUxXCI6ODIxMixcIjE1MlwiOjczMixcIjE1M1wiOjg0ODIsXCIxNTRcIjozNTMsXCIxNTVcIjo4MjUwLFwiMTU2XCI6MzM5LFwiMTU4XCI6MzgyLFwiMTU5XCI6Mzc2fVxuXG4vKioqLyB9KSxcbi8qIDM1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbnZhciBnZXRDaGlsZHJlbiA9IGV4cG9ydHMuZ2V0Q2hpbGRyZW4gPSBmdW5jdGlvbihlbGVtKXtcblx0cmV0dXJuIGVsZW0uY2hpbGRyZW47XG59O1xuXG52YXIgZ2V0UGFyZW50ID0gZXhwb3J0cy5nZXRQYXJlbnQgPSBmdW5jdGlvbihlbGVtKXtcblx0cmV0dXJuIGVsZW0ucGFyZW50O1xufTtcblxuZXhwb3J0cy5nZXRTaWJsaW5ncyA9IGZ1bmN0aW9uKGVsZW0pe1xuXHR2YXIgcGFyZW50ID0gZ2V0UGFyZW50KGVsZW0pO1xuXHRyZXR1cm4gcGFyZW50ID8gZ2V0Q2hpbGRyZW4ocGFyZW50KSA6IFtlbGVtXTtcbn07XG5cbmV4cG9ydHMuZ2V0QXR0cmlidXRlVmFsdWUgPSBmdW5jdGlvbihlbGVtLCBuYW1lKXtcblx0cmV0dXJuIGVsZW0uYXR0cmlicyAmJiBlbGVtLmF0dHJpYnNbbmFtZV07XG59O1xuXG5leHBvcnRzLmhhc0F0dHJpYiA9IGZ1bmN0aW9uKGVsZW0sIG5hbWUpe1xuXHRyZXR1cm4gISFlbGVtLmF0dHJpYnMgJiYgaGFzT3duUHJvcGVydHkuY2FsbChlbGVtLmF0dHJpYnMsIG5hbWUpO1xufTtcblxuZXhwb3J0cy5nZXROYW1lID0gZnVuY3Rpb24oZWxlbSl7XG5cdHJldHVybiBlbGVtLm5hbWU7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogMzYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuZXhwb3J0cy5yZW1vdmVFbGVtZW50ID0gZnVuY3Rpb24oZWxlbSl7XG5cdGlmKGVsZW0ucHJldikgZWxlbS5wcmV2Lm5leHQgPSBlbGVtLm5leHQ7XG5cdGlmKGVsZW0ubmV4dCkgZWxlbS5uZXh0LnByZXYgPSBlbGVtLnByZXY7XG5cblx0aWYoZWxlbS5wYXJlbnQpe1xuXHRcdHZhciBjaGlsZHMgPSBlbGVtLnBhcmVudC5jaGlsZHJlbjtcblx0XHRjaGlsZHMuc3BsaWNlKGNoaWxkcy5sYXN0SW5kZXhPZihlbGVtKSwgMSk7XG5cdH1cbn07XG5cbmV4cG9ydHMucmVwbGFjZUVsZW1lbnQgPSBmdW5jdGlvbihlbGVtLCByZXBsYWNlbWVudCl7XG5cdHZhciBwcmV2ID0gcmVwbGFjZW1lbnQucHJldiA9IGVsZW0ucHJldjtcblx0aWYocHJldil7XG5cdFx0cHJldi5uZXh0ID0gcmVwbGFjZW1lbnQ7XG5cdH1cblxuXHR2YXIgbmV4dCA9IHJlcGxhY2VtZW50Lm5leHQgPSBlbGVtLm5leHQ7XG5cdGlmKG5leHQpe1xuXHRcdG5leHQucHJldiA9IHJlcGxhY2VtZW50O1xuXHR9XG5cblx0dmFyIHBhcmVudCA9IHJlcGxhY2VtZW50LnBhcmVudCA9IGVsZW0ucGFyZW50O1xuXHRpZihwYXJlbnQpe1xuXHRcdHZhciBjaGlsZHMgPSBwYXJlbnQuY2hpbGRyZW47XG5cdFx0Y2hpbGRzW2NoaWxkcy5sYXN0SW5kZXhPZihlbGVtKV0gPSByZXBsYWNlbWVudDtcblx0fVxufTtcblxuZXhwb3J0cy5hcHBlbmRDaGlsZCA9IGZ1bmN0aW9uKGVsZW0sIGNoaWxkKXtcblx0Y2hpbGQucGFyZW50ID0gZWxlbTtcblxuXHRpZihlbGVtLmNoaWxkcmVuLnB1c2goY2hpbGQpICE9PSAxKXtcblx0XHR2YXIgc2libGluZyA9IGVsZW0uY2hpbGRyZW5bZWxlbS5jaGlsZHJlbi5sZW5ndGggLSAyXTtcblx0XHRzaWJsaW5nLm5leHQgPSBjaGlsZDtcblx0XHRjaGlsZC5wcmV2ID0gc2libGluZztcblx0XHRjaGlsZC5uZXh0ID0gbnVsbDtcblx0fVxufTtcblxuZXhwb3J0cy5hcHBlbmQgPSBmdW5jdGlvbihlbGVtLCBuZXh0KXtcblx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50LFxuXHRcdGN1cnJOZXh0ID0gZWxlbS5uZXh0O1xuXG5cdG5leHQubmV4dCA9IGN1cnJOZXh0O1xuXHRuZXh0LnByZXYgPSBlbGVtO1xuXHRlbGVtLm5leHQgPSBuZXh0O1xuXHRuZXh0LnBhcmVudCA9IHBhcmVudDtcblxuXHRpZihjdXJyTmV4dCl7XG5cdFx0Y3Vyck5leHQucHJldiA9IG5leHQ7XG5cdFx0aWYocGFyZW50KXtcblx0XHRcdHZhciBjaGlsZHMgPSBwYXJlbnQuY2hpbGRyZW47XG5cdFx0XHRjaGlsZHMuc3BsaWNlKGNoaWxkcy5sYXN0SW5kZXhPZihjdXJyTmV4dCksIDAsIG5leHQpO1xuXHRcdH1cblx0fSBlbHNlIGlmKHBhcmVudCl7XG5cdFx0cGFyZW50LmNoaWxkcmVuLnB1c2gobmV4dCk7XG5cdH1cbn07XG5cbmV4cG9ydHMucHJlcGVuZCA9IGZ1bmN0aW9uKGVsZW0sIHByZXYpe1xuXHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnQ7XG5cdGlmKHBhcmVudCl7XG5cdFx0dmFyIGNoaWxkcyA9IHBhcmVudC5jaGlsZHJlbjtcblx0XHRjaGlsZHMuc3BsaWNlKGNoaWxkcy5sYXN0SW5kZXhPZihlbGVtKSwgMCwgcHJldik7XG5cdH1cblxuXHRpZihlbGVtLnByZXYpe1xuXHRcdGVsZW0ucHJldi5uZXh0ID0gcHJldjtcblx0fVxuXHRcblx0cHJldi5wYXJlbnQgPSBwYXJlbnQ7XG5cdHByZXYucHJldiA9IGVsZW0ucHJldjtcblx0cHJldi5uZXh0ID0gZWxlbTtcblx0ZWxlbS5wcmV2ID0gcHJldjtcbn07XG5cblxuXG5cbi8qKiovIH0pLFxuLyogMzcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGlzVGFnID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KS5pc1RhZztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdGZpbHRlcjogZmlsdGVyLFxuXHRmaW5kOiBmaW5kLFxuXHRmaW5kT25lQ2hpbGQ6IGZpbmRPbmVDaGlsZCxcblx0ZmluZE9uZTogZmluZE9uZSxcblx0ZXhpc3RzT25lOiBleGlzdHNPbmUsXG5cdGZpbmRBbGw6IGZpbmRBbGxcbn07XG5cbmZ1bmN0aW9uIGZpbHRlcih0ZXN0LCBlbGVtZW50LCByZWN1cnNlLCBsaW1pdCl7XG5cdGlmKCFBcnJheS5pc0FycmF5KGVsZW1lbnQpKSBlbGVtZW50ID0gW2VsZW1lbnRdO1xuXG5cdGlmKHR5cGVvZiBsaW1pdCAhPT0gXCJudW1iZXJcIiB8fCAhaXNGaW5pdGUobGltaXQpKXtcblx0XHRsaW1pdCA9IEluZmluaXR5O1xuXHR9XG5cdHJldHVybiBmaW5kKHRlc3QsIGVsZW1lbnQsIHJlY3Vyc2UgIT09IGZhbHNlLCBsaW1pdCk7XG59XG5cbmZ1bmN0aW9uIGZpbmQodGVzdCwgZWxlbXMsIHJlY3Vyc2UsIGxpbWl0KXtcblx0dmFyIHJlc3VsdCA9IFtdLCBjaGlsZHM7XG5cblx0Zm9yKHZhciBpID0gMCwgaiA9IGVsZW1zLmxlbmd0aDsgaSA8IGo7IGkrKyl7XG5cdFx0aWYodGVzdChlbGVtc1tpXSkpe1xuXHRcdFx0cmVzdWx0LnB1c2goZWxlbXNbaV0pO1xuXHRcdFx0aWYoLS1saW1pdCA8PSAwKSBicmVhaztcblx0XHR9XG5cblx0XHRjaGlsZHMgPSBlbGVtc1tpXS5jaGlsZHJlbjtcblx0XHRpZihyZWN1cnNlICYmIGNoaWxkcyAmJiBjaGlsZHMubGVuZ3RoID4gMCl7XG5cdFx0XHRjaGlsZHMgPSBmaW5kKHRlc3QsIGNoaWxkcywgcmVjdXJzZSwgbGltaXQpO1xuXHRcdFx0cmVzdWx0ID0gcmVzdWx0LmNvbmNhdChjaGlsZHMpO1xuXHRcdFx0bGltaXQgLT0gY2hpbGRzLmxlbmd0aDtcblx0XHRcdGlmKGxpbWl0IDw9IDApIGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGZpbmRPbmVDaGlsZCh0ZXN0LCBlbGVtcyl7XG5cdGZvcih2YXIgaSA9IDAsIGwgPSBlbGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspe1xuXHRcdGlmKHRlc3QoZWxlbXNbaV0pKSByZXR1cm4gZWxlbXNbaV07XG5cdH1cblxuXHRyZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmluZE9uZSh0ZXN0LCBlbGVtcyl7XG5cdHZhciBlbGVtID0gbnVsbDtcblxuXHRmb3IodmFyIGkgPSAwLCBsID0gZWxlbXMubGVuZ3RoOyBpIDwgbCAmJiAhZWxlbTsgaSsrKXtcblx0XHRpZighaXNUYWcoZWxlbXNbaV0pKXtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH0gZWxzZSBpZih0ZXN0KGVsZW1zW2ldKSl7XG5cdFx0XHRlbGVtID0gZWxlbXNbaV07XG5cdFx0fSBlbHNlIGlmKGVsZW1zW2ldLmNoaWxkcmVuLmxlbmd0aCA+IDApe1xuXHRcdFx0ZWxlbSA9IGZpbmRPbmUodGVzdCwgZWxlbXNbaV0uY2hpbGRyZW4pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG5mdW5jdGlvbiBleGlzdHNPbmUodGVzdCwgZWxlbXMpe1xuXHRmb3IodmFyIGkgPSAwLCBsID0gZWxlbXMubGVuZ3RoOyBpIDwgbDsgaSsrKXtcblx0XHRpZihcblx0XHRcdGlzVGFnKGVsZW1zW2ldKSAmJiAoXG5cdFx0XHRcdHRlc3QoZWxlbXNbaV0pIHx8IChcblx0XHRcdFx0XHRlbGVtc1tpXS5jaGlsZHJlbi5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0ZXhpc3RzT25lKHRlc3QsIGVsZW1zW2ldLmNoaWxkcmVuKVxuXHRcdFx0XHQpXG5cdFx0XHQpXG5cdFx0KXtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZmluZEFsbCh0ZXN0LCBlbGVtcyl7XG5cdHZhciByZXN1bHQgPSBbXTtcblx0Zm9yKHZhciBpID0gMCwgaiA9IGVsZW1zLmxlbmd0aDsgaSA8IGo7IGkrKyl7XG5cdFx0aWYoIWlzVGFnKGVsZW1zW2ldKSkgY29udGludWU7XG5cdFx0aWYodGVzdChlbGVtc1tpXSkpIHJlc3VsdC5wdXNoKGVsZW1zW2ldKTtcblxuXHRcdGlmKGVsZW1zW2ldLmNoaWxkcmVuLmxlbmd0aCA+IDApe1xuXHRcdFx0cmVzdWx0ID0gcmVzdWx0LmNvbmNhdChmaW5kQWxsKHRlc3QsIGVsZW1zW2ldLmNoaWxkcmVuKSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59XG5cblxuLyoqKi8gfSksXG4vKiAzOCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgRWxlbWVudFR5cGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xudmFyIGlzVGFnID0gZXhwb3J0cy5pc1RhZyA9IEVsZW1lbnRUeXBlLmlzVGFnO1xuXG5leHBvcnRzLnRlc3RFbGVtZW50ID0gZnVuY3Rpb24ob3B0aW9ucywgZWxlbWVudCl7XG5cdGZvcih2YXIga2V5IGluIG9wdGlvbnMpe1xuXHRcdGlmKCFvcHRpb25zLmhhc093blByb3BlcnR5KGtleSkpO1xuXHRcdGVsc2UgaWYoa2V5ID09PSBcInRhZ19uYW1lXCIpe1xuXHRcdFx0aWYoIWlzVGFnKGVsZW1lbnQpIHx8ICFvcHRpb25zLnRhZ19uYW1lKGVsZW1lbnQubmFtZSkpe1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmKGtleSA9PT0gXCJ0YWdfdHlwZVwiKXtcblx0XHRcdGlmKCFvcHRpb25zLnRhZ190eXBlKGVsZW1lbnQudHlwZSkpIHJldHVybiBmYWxzZTtcblx0XHR9IGVsc2UgaWYoa2V5ID09PSBcInRhZ19jb250YWluc1wiKXtcblx0XHRcdGlmKGlzVGFnKGVsZW1lbnQpIHx8ICFvcHRpb25zLnRhZ19jb250YWlucyhlbGVtZW50LmRhdGEpKXtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZighZWxlbWVudC5hdHRyaWJzIHx8ICFvcHRpb25zW2tleV0oZWxlbWVudC5hdHRyaWJzW2tleV0pKXtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHRydWU7XG59O1xuXG52YXIgQ2hlY2tzID0ge1xuXHR0YWdfbmFtZTogZnVuY3Rpb24obmFtZSl7XG5cdFx0aWYodHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIil7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oZWxlbSl7IHJldHVybiBpc1RhZyhlbGVtKSAmJiBuYW1lKGVsZW0ubmFtZSk7IH07XG5cdFx0fSBlbHNlIGlmKG5hbWUgPT09IFwiKlwiKXtcblx0XHRcdHJldHVybiBpc1RhZztcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0peyByZXR1cm4gaXNUYWcoZWxlbSkgJiYgZWxlbS5uYW1lID09PSBuYW1lOyB9O1xuXHRcdH1cblx0fSxcblx0dGFnX3R5cGU6IGZ1bmN0aW9uKHR5cGUpe1xuXHRcdGlmKHR5cGVvZiB0eXBlID09PSBcImZ1bmN0aW9uXCIpe1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0peyByZXR1cm4gdHlwZShlbGVtLnR5cGUpOyB9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oZWxlbSl7IHJldHVybiBlbGVtLnR5cGUgPT09IHR5cGU7IH07XG5cdFx0fVxuXHR9LFxuXHR0YWdfY29udGFpbnM6IGZ1bmN0aW9uKGRhdGEpe1xuXHRcdGlmKHR5cGVvZiBkYXRhID09PSBcImZ1bmN0aW9uXCIpe1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0peyByZXR1cm4gIWlzVGFnKGVsZW0pICYmIGRhdGEoZWxlbS5kYXRhKTsgfTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0peyByZXR1cm4gIWlzVGFnKGVsZW0pICYmIGVsZW0uZGF0YSA9PT0gZGF0YTsgfTtcblx0XHR9XG5cdH1cbn07XG5cbmZ1bmN0aW9uIGdldEF0dHJpYkNoZWNrKGF0dHJpYiwgdmFsdWUpe1xuXHRpZih0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIil7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0peyByZXR1cm4gZWxlbS5hdHRyaWJzICYmIHZhbHVlKGVsZW0uYXR0cmlic1thdHRyaWJdKTsgfTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZnVuY3Rpb24oZWxlbSl7IHJldHVybiBlbGVtLmF0dHJpYnMgJiYgZWxlbS5hdHRyaWJzW2F0dHJpYl0gPT09IHZhbHVlOyB9O1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNvbWJpbmVGdW5jcyhhLCBiKXtcblx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0pe1xuXHRcdHJldHVybiBhKGVsZW0pIHx8IGIoZWxlbSk7XG5cdH07XG59XG5cbmV4cG9ydHMuZ2V0RWxlbWVudHMgPSBmdW5jdGlvbihvcHRpb25zLCBlbGVtZW50LCByZWN1cnNlLCBsaW1pdCl7XG5cdHZhciBmdW5jcyA9IE9iamVjdC5rZXlzKG9wdGlvbnMpLm1hcChmdW5jdGlvbihrZXkpe1xuXHRcdHZhciB2YWx1ZSA9IG9wdGlvbnNba2V5XTtcblx0XHRyZXR1cm4ga2V5IGluIENoZWNrcyA/IENoZWNrc1trZXldKHZhbHVlKSA6IGdldEF0dHJpYkNoZWNrKGtleSwgdmFsdWUpO1xuXHR9KTtcblxuXHRyZXR1cm4gZnVuY3MubGVuZ3RoID09PSAwID8gW10gOiB0aGlzLmZpbHRlcihcblx0XHRmdW5jcy5yZWR1Y2UoY29tYmluZUZ1bmNzKSxcblx0XHRlbGVtZW50LCByZWN1cnNlLCBsaW1pdFxuXHQpO1xufTtcblxuZXhwb3J0cy5nZXRFbGVtZW50QnlJZCA9IGZ1bmN0aW9uKGlkLCBlbGVtZW50LCByZWN1cnNlKXtcblx0aWYoIUFycmF5LmlzQXJyYXkoZWxlbWVudCkpIGVsZW1lbnQgPSBbZWxlbWVudF07XG5cdHJldHVybiB0aGlzLmZpbmRPbmUoZ2V0QXR0cmliQ2hlY2soXCJpZFwiLCBpZCksIGVsZW1lbnQsIHJlY3Vyc2UgIT09IGZhbHNlKTtcbn07XG5cbmV4cG9ydHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBmdW5jdGlvbihuYW1lLCBlbGVtZW50LCByZWN1cnNlLCBsaW1pdCl7XG5cdHJldHVybiB0aGlzLmZpbHRlcihDaGVja3MudGFnX25hbWUobmFtZSksIGVsZW1lbnQsIHJlY3Vyc2UsIGxpbWl0KTtcbn07XG5cbmV4cG9ydHMuZ2V0RWxlbWVudHNCeVRhZ1R5cGUgPSBmdW5jdGlvbih0eXBlLCBlbGVtZW50LCByZWN1cnNlLCBsaW1pdCl7XG5cdHJldHVybiB0aGlzLmZpbHRlcihDaGVja3MudGFnX3R5cGUodHlwZSksIGVsZW1lbnQsIHJlY3Vyc2UsIGxpbWl0KTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiAzOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG4vLyByZW1vdmVTdWJzZXRzXG4vLyBHaXZlbiBhbiBhcnJheSBvZiBub2RlcywgcmVtb3ZlIGFueSBtZW1iZXIgdGhhdCBpcyBjb250YWluZWQgYnkgYW5vdGhlci5cbmV4cG9ydHMucmVtb3ZlU3Vic2V0cyA9IGZ1bmN0aW9uKG5vZGVzKSB7XG5cdHZhciBpZHggPSBub2Rlcy5sZW5ndGgsIG5vZGUsIGFuY2VzdG9yLCByZXBsYWNlO1xuXG5cdC8vIENoZWNrIGlmIGVhY2ggbm9kZSAob3Igb25lIG9mIGl0cyBhbmNlc3RvcnMpIGlzIGFscmVhZHkgY29udGFpbmVkIGluIHRoZVxuXHQvLyBhcnJheS5cblx0d2hpbGUgKC0taWR4ID4gLTEpIHtcblx0XHRub2RlID0gYW5jZXN0b3IgPSBub2Rlc1tpZHhdO1xuXG5cdFx0Ly8gVGVtcG9yYXJpbHkgcmVtb3ZlIHRoZSBub2RlIHVuZGVyIGNvbnNpZGVyYXRpb25cblx0XHRub2Rlc1tpZHhdID0gbnVsbDtcblx0XHRyZXBsYWNlID0gdHJ1ZTtcblxuXHRcdHdoaWxlIChhbmNlc3Rvcikge1xuXHRcdFx0aWYgKG5vZGVzLmluZGV4T2YoYW5jZXN0b3IpID4gLTEpIHtcblx0XHRcdFx0cmVwbGFjZSA9IGZhbHNlO1xuXHRcdFx0XHRub2Rlcy5zcGxpY2UoaWR4LCAxKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudDtcblx0XHR9XG5cblx0XHQvLyBJZiB0aGUgbm9kZSBoYXMgYmVlbiBmb3VuZCB0byBiZSB1bmlxdWUsIHJlLWluc2VydCBpdC5cblx0XHRpZiAocmVwbGFjZSkge1xuXHRcdFx0bm9kZXNbaWR4XSA9IG5vZGU7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG5vZGVzO1xufTtcblxuLy8gU291cmNlOiBodHRwOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLW5vZGUtY29tcGFyZWRvY3VtZW50cG9zaXRpb25cbnZhciBQT1NJVElPTiA9IHtcblx0RElTQ09OTkVDVEVEOiAxLFxuXHRQUkVDRURJTkc6IDIsXG5cdEZPTExPV0lORzogNCxcblx0Q09OVEFJTlM6IDgsXG5cdENPTlRBSU5FRF9CWTogMTZcbn07XG5cbi8vIENvbXBhcmUgdGhlIHBvc2l0aW9uIG9mIG9uZSBub2RlIGFnYWluc3QgYW5vdGhlciBub2RlIGluIGFueSBvdGhlciBkb2N1bWVudC5cbi8vIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBiaXRtYXNrIHdpdGggdGhlIGZvbGxvd2luZyB2YWx1ZXM6XG4vL1xuLy8gZG9jdW1lbnQgb3JkZXI6XG4vLyA+IFRoZXJlIGlzIGFuIG9yZGVyaW5nLCBkb2N1bWVudCBvcmRlciwgZGVmaW5lZCBvbiBhbGwgdGhlIG5vZGVzIGluIHRoZVxuLy8gPiBkb2N1bWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZVxuLy8gPiBYTUwgcmVwcmVzZW50YXRpb24gb2YgZWFjaCBub2RlIG9jY3VycyBpbiB0aGUgWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoZVxuLy8gPiBkb2N1bWVudCBhZnRlciBleHBhbnNpb24gb2YgZ2VuZXJhbCBlbnRpdGllcy4gVGh1cywgdGhlIGRvY3VtZW50IGVsZW1lbnRcbi8vID4gbm9kZSB3aWxsIGJlIHRoZSBmaXJzdCBub2RlLiBFbGVtZW50IG5vZGVzIG9jY3VyIGJlZm9yZSB0aGVpciBjaGlsZHJlbi5cbi8vID4gVGh1cywgZG9jdW1lbnQgb3JkZXIgb3JkZXJzIGVsZW1lbnQgbm9kZXMgaW4gb3JkZXIgb2YgdGhlIG9jY3VycmVuY2Ugb2Zcbi8vID4gdGhlaXIgc3RhcnQtdGFnIGluIHRoZSBYTUwgKGFmdGVyIGV4cGFuc2lvbiBvZiBlbnRpdGllcykuIFRoZSBhdHRyaWJ1dGVcbi8vID4gbm9kZXMgb2YgYW4gZWxlbWVudCBvY2N1ciBhZnRlciB0aGUgZWxlbWVudCBhbmQgYmVmb3JlIGl0cyBjaGlsZHJlbi4gVGhlXG4vLyA+IHJlbGF0aXZlIG9yZGVyIG9mIGF0dHJpYnV0ZSBub2RlcyBpcyBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQuL1xuLy8gU291cmNlOlxuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtQ29yZS9nbG9zc2FyeS5odG1sI2R0LWRvY3VtZW50LW9yZGVyXG4vL1xuLy8gQGFyZ3VtZW50IHtOb2RlfSBub2RhQSBUaGUgZmlyc3Qgbm9kZSB0byB1c2UgaW4gdGhlIGNvbXBhcmlzb25cbi8vIEBhcmd1bWVudCB7Tm9kZX0gbm9kZUIgVGhlIHNlY29uZCBub2RlIHRvIHVzZSBpbiB0aGUgY29tcGFyaXNvblxuLy9cbi8vIEByZXR1cm4ge051bWJlcn0gQSBiaXRtYXNrIGRlc2NyaWJpbmcgdGhlIGlucHV0IG5vZGVzJyByZWxhdGl2ZSBwb3NpdGlvbi5cbi8vICAgICAgICAgU2VlIGh0dHA6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tbm9kZS1jb21wYXJlZG9jdW1lbnRwb3NpdGlvbiBmb3Jcbi8vICAgICAgICAgYSBkZXNjcmlwdGlvbiBvZiB0aGVzZSB2YWx1ZXMuXG52YXIgY29tcGFyZVBvcyA9IGV4cG9ydHMuY29tcGFyZURvY3VtZW50UG9zaXRpb24gPSBmdW5jdGlvbihub2RlQSwgbm9kZUIpIHtcblx0dmFyIGFQYXJlbnRzID0gW107XG5cdHZhciBiUGFyZW50cyA9IFtdO1xuXHR2YXIgY3VycmVudCwgc2hhcmVkUGFyZW50LCBzaWJsaW5ncywgYVNpYmxpbmcsIGJTaWJsaW5nLCBpZHg7XG5cblx0aWYgKG5vZGVBID09PSBub2RlQikge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0Y3VycmVudCA9IG5vZGVBO1xuXHR3aGlsZSAoY3VycmVudCkge1xuXHRcdGFQYXJlbnRzLnVuc2hpZnQoY3VycmVudCk7XG5cdFx0Y3VycmVudCA9IGN1cnJlbnQucGFyZW50O1xuXHR9XG5cdGN1cnJlbnQgPSBub2RlQjtcblx0d2hpbGUgKGN1cnJlbnQpIHtcblx0XHRiUGFyZW50cy51bnNoaWZ0KGN1cnJlbnQpO1xuXHRcdGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcblx0fVxuXG5cdGlkeCA9IDA7XG5cdHdoaWxlIChhUGFyZW50c1tpZHhdID09PSBiUGFyZW50c1tpZHhdKSB7XG5cdFx0aWR4Kys7XG5cdH1cblxuXHRpZiAoaWR4ID09PSAwKSB7XG5cdFx0cmV0dXJuIFBPU0lUSU9OLkRJU0NPTk5FQ1RFRDtcblx0fVxuXG5cdHNoYXJlZFBhcmVudCA9IGFQYXJlbnRzW2lkeCAtIDFdO1xuXHRzaWJsaW5ncyA9IHNoYXJlZFBhcmVudC5jaGlsZHJlbjtcblx0YVNpYmxpbmcgPSBhUGFyZW50c1tpZHhdO1xuXHRiU2libGluZyA9IGJQYXJlbnRzW2lkeF07XG5cblx0aWYgKHNpYmxpbmdzLmluZGV4T2YoYVNpYmxpbmcpID4gc2libGluZ3MuaW5kZXhPZihiU2libGluZykpIHtcblx0XHRpZiAoc2hhcmVkUGFyZW50ID09PSBub2RlQikge1xuXHRcdFx0cmV0dXJuIFBPU0lUSU9OLkZPTExPV0lORyB8IFBPU0lUSU9OLkNPTlRBSU5FRF9CWTtcblx0XHR9XG5cdFx0cmV0dXJuIFBPU0lUSU9OLkZPTExPV0lORztcblx0fSBlbHNlIHtcblx0XHRpZiAoc2hhcmVkUGFyZW50ID09PSBub2RlQSkge1xuXHRcdFx0cmV0dXJuIFBPU0lUSU9OLlBSRUNFRElORyB8IFBPU0lUSU9OLkNPTlRBSU5TO1xuXHRcdH1cblx0XHRyZXR1cm4gUE9TSVRJT04uUFJFQ0VESU5HO1xuXHR9XG59O1xuXG4vLyBTb3J0IGFuIGFycmF5IG9mIG5vZGVzIGJhc2VkIG9uIHRoZWlyIHJlbGF0aXZlIHBvc2l0aW9uIGluIHRoZSBkb2N1bWVudCBhbmRcbi8vIHJlbW92ZSBhbnkgZHVwbGljYXRlIG5vZGVzLiBJZiB0aGUgYXJyYXkgY29udGFpbnMgbm9kZXMgdGhhdCBkbyBub3QgYmVsb25nXG4vLyB0byB0aGUgc2FtZSBkb2N1bWVudCwgc29ydCBvcmRlciBpcyB1bnNwZWNpZmllZC5cbi8vXG4vLyBAYXJndW1lbnQge0FycmF5fSBub2RlcyBBcnJheSBvZiBET00gbm9kZXNcbi8vXG4vLyBAcmV0dXJucyB7QXJyYXl9IGNvbGxlY3Rpb24gb2YgdW5pcXVlIG5vZGVzLCBzb3J0ZWQgaW4gZG9jdW1lbnQgb3JkZXJcbmV4cG9ydHMudW5pcXVlU29ydCA9IGZ1bmN0aW9uKG5vZGVzKSB7XG5cdHZhciBpZHggPSBub2Rlcy5sZW5ndGgsIG5vZGUsIHBvc2l0aW9uO1xuXG5cdG5vZGVzID0gbm9kZXMuc2xpY2UoKTtcblxuXHR3aGlsZSAoLS1pZHggPiAtMSkge1xuXHRcdG5vZGUgPSBub2Rlc1tpZHhdO1xuXHRcdHBvc2l0aW9uID0gbm9kZXMuaW5kZXhPZihub2RlKTtcblx0XHRpZiAocG9zaXRpb24gPiAtMSAmJiBwb3NpdGlvbiA8IGlkeCkge1xuXHRcdFx0bm9kZXMuc3BsaWNlKGlkeCwgMSk7XG5cdFx0fVxuXHR9XG5cdG5vZGVzLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuXHRcdHZhciByZWxhdGl2ZSA9IGNvbXBhcmVQb3MoYSwgYik7XG5cdFx0aWYgKHJlbGF0aXZlICYgUE9TSVRJT04uUFJFQ0VESU5HKSB7XG5cdFx0XHRyZXR1cm4gLTE7XG5cdFx0fSBlbHNlIGlmIChyZWxhdGl2ZSAmIFBPU0lUSU9OLkZPTExPV0lORykge1xuXHRcdFx0cmV0dXJuIDE7XG5cdFx0fVxuXHRcdHJldHVybiAwO1xuXHR9KTtcblxuXHRyZXR1cm4gbm9kZXM7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuLypcblx0Y29tcGlsZXMgYSBzZWxlY3RvciB0byBhbiBleGVjdXRhYmxlIGZ1bmN0aW9uXG4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBpbGVGYWN0b3J5O1xuXG52YXIgcGFyc2UgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQxKSxcblx0QmFzZUZ1bmNzICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpLFxuXHRzb3J0UnVsZXMgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDIpLFxuXHRwcm9jZWR1cmUgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpLFxuXHRydWxlc0ZhY3RvcnkgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDMpLFxuXHRwc2V1ZG9zRmFjdG9yeSA9IF9fd2VicGFja19yZXF1aXJlX18oODYpLFxuXHR0cnVlRnVuYyAgICAgICA9IEJhc2VGdW5jcy50cnVlRnVuYyxcblx0ZmFsc2VGdW5jICAgICAgPSBCYXNlRnVuY3MuZmFsc2VGdW5jO1xuXG5mdW5jdGlvbiBjb21waWxlRmFjdG9yeShhZGFwdGVyKXtcblx0dmFyIFBzZXVkb3MgICAgID0gcHNldWRvc0ZhY3RvcnkoYWRhcHRlciksXG5cdFx0ZmlsdGVycyAgICAgPSBQc2V1ZG9zLmZpbHRlcnMsXG5cdFx0UnVsZXMgXHRcdFx0PSBydWxlc0ZhY3RvcnkoYWRhcHRlciwgUHNldWRvcyk7XG5cblx0ZnVuY3Rpb24gY29tcGlsZShzZWxlY3Rvciwgb3B0aW9ucywgY29udGV4dCl7XG5cdFx0dmFyIG5leHQgPSBjb21waWxlVW5zYWZlKHNlbGVjdG9yLCBvcHRpb25zLCBjb250ZXh0KTtcblx0XHRyZXR1cm4gd3JhcChuZXh0KTtcblx0fVxuXG5cdGZ1bmN0aW9uIHdyYXAobmV4dCl7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGJhc2UoZWxlbSl7XG5cdFx0XHRyZXR1cm4gYWRhcHRlci5pc1RhZyhlbGVtKSAmJiBuZXh0KGVsZW0pO1xuXHRcdH07XG5cdH1cblxuXHRmdW5jdGlvbiBjb21waWxlVW5zYWZlKHNlbGVjdG9yLCBvcHRpb25zLCBjb250ZXh0KXtcblx0XHR2YXIgdG9rZW4gPSBwYXJzZShzZWxlY3Rvciwgb3B0aW9ucyk7XG5cdFx0cmV0dXJuIGNvbXBpbGVUb2tlbih0b2tlbiwgb3B0aW9ucywgY29udGV4dCk7XG5cdH1cblxuXHRmdW5jdGlvbiBpbmNsdWRlc1Njb3BlUHNldWRvKHQpe1xuXHRcdHJldHVybiB0LnR5cGUgPT09IFwicHNldWRvXCIgJiYgKFxuXHRcdFx0dC5uYW1lID09PSBcInNjb3BlXCIgfHwgKFxuXHRcdFx0XHRBcnJheS5pc0FycmF5KHQuZGF0YSkgJiZcblx0XHRcdFx0dC5kYXRhLnNvbWUoZnVuY3Rpb24oZGF0YSl7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGEuc29tZShpbmNsdWRlc1Njb3BlUHNldWRvKTtcblx0XHRcdFx0fSlcblx0XHRcdClcblx0XHQpO1xuXHR9XG5cblx0dmFyIERFU0NFTkRBTlRfVE9LRU4gPSB7dHlwZTogXCJkZXNjZW5kYW50XCJ9LFxuXHRcdEZMRVhJQkxFX0RFU0NFTkRBTlRfVE9LRU4gPSB7dHlwZTogXCJfZmxleGlibGVEZXNjZW5kYW50XCJ9LFxuXHRcdFNDT1BFX1RPS0VOID0ge3R5cGU6IFwicHNldWRvXCIsIG5hbWU6IFwic2NvcGVcIn0sXG5cdFx0UExBQ0VIT0xERVJfRUxFTUVOVCA9IHt9O1xuXG5cdC8vQ1NTIDQgU3BlYyAoRHJhZnQpOiAzLjMuMS4gQWJzb2x1dGl6aW5nIGEgU2NvcGUtcmVsYXRpdmUgU2VsZWN0b3Jcblx0Ly9odHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnM0LyNhYnNvbHV0aXppbmdcblx0ZnVuY3Rpb24gYWJzb2x1dGl6ZSh0b2tlbiwgY29udGV4dCl7XG5cdFx0Ly9UT0RPIGJldHRlciBjaGVjayBpZiBjb250ZXh0IGlzIGRvY3VtZW50XG5cdFx0dmFyIGhhc0NvbnRleHQgPSAhIWNvbnRleHQgJiYgISFjb250ZXh0Lmxlbmd0aCAmJiBjb250ZXh0LmV2ZXJ5KGZ1bmN0aW9uKGUpe1xuXHRcdFx0cmV0dXJuIGUgPT09IFBMQUNFSE9MREVSX0VMRU1FTlQgfHwgISFhZGFwdGVyLmdldFBhcmVudChlKTtcblx0XHR9KTtcblxuXG5cdFx0dG9rZW4uZm9yRWFjaChmdW5jdGlvbih0KXtcblx0XHRcdGlmKHQubGVuZ3RoID4gMCAmJiBpc1RyYXZlcnNhbCh0WzBdKSAmJiB0WzBdLnR5cGUgIT09IFwiZGVzY2VuZGFudFwiKXtcblx0XHRcdFx0Ly9kb24ndCByZXR1cm4gaW4gZWxzZSBicmFuY2hcblx0XHRcdH0gZWxzZSBpZihoYXNDb250ZXh0ICYmICFpbmNsdWRlc1Njb3BlUHNldWRvKHQpKXtcblx0XHRcdFx0dC51bnNoaWZ0KERFU0NFTkRBTlRfVE9LRU4pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR0LnVuc2hpZnQoU0NPUEVfVE9LRU4pO1xuXHRcdH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gY29tcGlsZVRva2VuKHRva2VuLCBvcHRpb25zLCBjb250ZXh0KXtcblx0XHR0b2tlbiA9IHRva2VuLmZpbHRlcihmdW5jdGlvbih0KXsgcmV0dXJuIHQubGVuZ3RoID4gMDsgfSk7XG5cblx0XHR0b2tlbi5mb3JFYWNoKHNvcnRSdWxlcyk7XG5cblx0XHR2YXIgaXNBcnJheUNvbnRleHQgPSBBcnJheS5pc0FycmF5KGNvbnRleHQpO1xuXG5cdFx0Y29udGV4dCA9IChvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dCkgfHwgY29udGV4dDtcblxuXHRcdGlmKGNvbnRleHQgJiYgIWlzQXJyYXlDb250ZXh0KSBjb250ZXh0ID0gW2NvbnRleHRdO1xuXG5cdFx0YWJzb2x1dGl6ZSh0b2tlbiwgY29udGV4dCk7XG5cblx0XHR2YXIgc2hvdWxkVGVzdE5leHRTaWJsaW5ncyA9IGZhbHNlO1xuXG5cdFx0dmFyIHF1ZXJ5ID0gdG9rZW5cblx0XHRcdC5tYXAoZnVuY3Rpb24ocnVsZXMpe1xuXHRcdFx0XHRpZihydWxlc1swXSAmJiBydWxlc1sxXSAmJiBydWxlc1swXS5uYW1lID09PSBcInNjb3BlXCIpe1xuXHRcdFx0XHRcdHZhciBydWxlVHlwZSA9IHJ1bGVzWzFdLnR5cGU7XG5cdFx0XHRcdFx0aWYoaXNBcnJheUNvbnRleHQgJiYgcnVsZVR5cGUgPT09IFwiZGVzY2VuZGFudFwiKSBydWxlc1sxXSA9IEZMRVhJQkxFX0RFU0NFTkRBTlRfVE9LRU47XG5cdFx0XHRcdFx0ZWxzZSBpZihydWxlVHlwZSA9PT0gXCJhZGphY2VudFwiIHx8IHJ1bGVUeXBlID09PSBcInNpYmxpbmdcIikgc2hvdWxkVGVzdE5leHRTaWJsaW5ncyA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGNvbXBpbGVSdWxlcyhydWxlcywgb3B0aW9ucywgY29udGV4dCk7XG5cdFx0XHR9KVxuXHRcdFx0LnJlZHVjZShyZWR1Y2VSdWxlcywgZmFsc2VGdW5jKTtcblxuXHRcdHF1ZXJ5LnNob3VsZFRlc3ROZXh0U2libGluZ3MgPSBzaG91bGRUZXN0TmV4dFNpYmxpbmdzO1xuXG5cdFx0cmV0dXJuIHF1ZXJ5O1xuXHR9XG5cblx0ZnVuY3Rpb24gaXNUcmF2ZXJzYWwodCl7XG5cdFx0cmV0dXJuIHByb2NlZHVyZVt0LnR5cGVdIDwgMDtcblx0fVxuXG5cdGZ1bmN0aW9uIGNvbXBpbGVSdWxlcyhydWxlcywgb3B0aW9ucywgY29udGV4dCl7XG5cdFx0cmV0dXJuIHJ1bGVzLnJlZHVjZShmdW5jdGlvbihmdW5jLCBydWxlKXtcblx0XHRcdGlmKGZ1bmMgPT09IGZhbHNlRnVuYykgcmV0dXJuIGZ1bmM7XG5cdFx0XHRyZXR1cm4gUnVsZXNbcnVsZS50eXBlXShmdW5jLCBydWxlLCBvcHRpb25zLCBjb250ZXh0KTtcblx0XHR9LCBvcHRpb25zICYmIG9wdGlvbnMucm9vdEZ1bmMgfHwgdHJ1ZUZ1bmMpO1xuXHR9XG5cblx0ZnVuY3Rpb24gcmVkdWNlUnVsZXMoYSwgYil7XG5cdFx0aWYoYiA9PT0gZmFsc2VGdW5jIHx8IGEgPT09IHRydWVGdW5jKXtcblx0XHRcdHJldHVybiBhO1xuXHRcdH1cblx0XHRpZihhID09PSBmYWxzZUZ1bmMgfHwgYiA9PT0gdHJ1ZUZ1bmMpe1xuXHRcdFx0cmV0dXJuIGI7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNvbWJpbmUoZWxlbSl7XG5cdFx0XHRyZXR1cm4gYShlbGVtKSB8fCBiKGVsZW0pO1xuXHRcdH07XG5cdH1cblxuXHRmdW5jdGlvbiBjb250YWluc1RyYXZlcnNhbCh0KXtcblx0XHRyZXR1cm4gdC5zb21lKGlzVHJhdmVyc2FsKTtcblx0fVxuXG5cdC8vOm5vdCwgOmhhcyBhbmQgOm1hdGNoZXMgaGF2ZSB0byBjb21waWxlIHNlbGVjdG9yc1xuXHQvL2RvaW5nIHRoaXMgaW4gbGliL3BzZXVkb3MuanMgd291bGQgbGVhZCB0byBjaXJjdWxhciBkZXBlbmRlbmNpZXMsXG5cdC8vc28gd2UgYWRkIHRoZW0gaGVyZVxuXHRmaWx0ZXJzLm5vdCA9IGZ1bmN0aW9uKG5leHQsIHRva2VuLCBvcHRpb25zLCBjb250ZXh0KXtcblx0XHR2YXIgb3B0cyA9IHtcblx0XHRcdHhtbE1vZGU6ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy54bWxNb2RlKSxcblx0XHRcdHN0cmljdDogISEob3B0aW9ucyAmJiBvcHRpb25zLnN0cmljdClcblx0XHR9O1xuXG5cdFx0aWYob3B0cy5zdHJpY3Qpe1xuXHRcdFx0aWYodG9rZW4ubGVuZ3RoID4gMSB8fCB0b2tlbi5zb21lKGNvbnRhaW5zVHJhdmVyc2FsKSl7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcImNvbXBsZXggc2VsZWN0b3JzIGluIDpub3QgYXJlbid0IGFsbG93ZWQgaW4gc3RyaWN0IG1vZGVcIik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dmFyIGZ1bmMgPSBjb21waWxlVG9rZW4odG9rZW4sIG9wdHMsIGNvbnRleHQpO1xuXG5cdFx0aWYoZnVuYyA9PT0gZmFsc2VGdW5jKSByZXR1cm4gbmV4dDtcblx0XHRpZihmdW5jID09PSB0cnVlRnVuYykgIHJldHVybiBmYWxzZUZ1bmM7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRyZXR1cm4gIWZ1bmMoZWxlbSkgJiYgbmV4dChlbGVtKTtcblx0XHR9O1xuXHR9O1xuXG5cdGZpbHRlcnMuaGFzID0gZnVuY3Rpb24obmV4dCwgdG9rZW4sIG9wdGlvbnMpe1xuXHRcdHZhciBvcHRzID0ge1xuXHRcdFx0eG1sTW9kZTogISEob3B0aW9ucyAmJiBvcHRpb25zLnhtbE1vZGUpLFxuXHRcdFx0c3RyaWN0OiAhIShvcHRpb25zICYmIG9wdGlvbnMuc3RyaWN0KVxuXHRcdH07XG5cblx0XHQvL0ZJWE1FOiBVc2VzIGFuIGFycmF5IGFzIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBlbGVtZW50IChzaWRlIGVmZmVjdHMpXG5cdFx0dmFyIGNvbnRleHQgPSB0b2tlbi5zb21lKGNvbnRhaW5zVHJhdmVyc2FsKSA/IFtQTEFDRUhPTERFUl9FTEVNRU5UXSA6IG51bGw7XG5cblx0XHR2YXIgZnVuYyA9IGNvbXBpbGVUb2tlbih0b2tlbiwgb3B0cywgY29udGV4dCk7XG5cblx0XHRpZihmdW5jID09PSBmYWxzZUZ1bmMpIHJldHVybiBmYWxzZUZ1bmM7XG5cdFx0aWYoZnVuYyA9PT0gdHJ1ZUZ1bmMpe1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0XHRyZXR1cm4gYWRhcHRlci5nZXRDaGlsZHJlbihlbGVtKS5zb21lKGFkYXB0ZXIuaXNUYWcpICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGZ1bmMgPSB3cmFwKGZ1bmMpO1xuXG5cdFx0aWYoY29udGV4dCl7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gaGFzKGVsZW0pe1xuXHRcdFx0XHRyZXR1cm4gbmV4dChlbGVtKSAmJiAoXG5cdFx0XHRcdFx0KGNvbnRleHRbMF0gPSBlbGVtKSwgYWRhcHRlci5leGlzdHNPbmUoZnVuYywgYWRhcHRlci5nZXRDaGlsZHJlbihlbGVtKSlcblx0XHRcdFx0KTtcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGhhcyhlbGVtKXtcblx0XHRcdHJldHVybiBuZXh0KGVsZW0pICYmIGFkYXB0ZXIuZXhpc3RzT25lKGZ1bmMsIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oZWxlbSkpO1xuXHRcdH07XG5cdH07XG5cblx0ZmlsdGVycy5tYXRjaGVzID0gZnVuY3Rpb24obmV4dCwgdG9rZW4sIG9wdGlvbnMsIGNvbnRleHQpe1xuXHRcdHZhciBvcHRzID0ge1xuXHRcdFx0eG1sTW9kZTogISEob3B0aW9ucyAmJiBvcHRpb25zLnhtbE1vZGUpLFxuXHRcdFx0c3RyaWN0OiAhIShvcHRpb25zICYmIG9wdGlvbnMuc3RyaWN0KSxcblx0XHRcdHJvb3RGdW5jOiBuZXh0XG5cdFx0fTtcblxuXHRcdHJldHVybiBjb21waWxlVG9rZW4odG9rZW4sIG9wdHMsIGNvbnRleHQpO1xuXHR9O1xuXG5cdGNvbXBpbGUuY29tcGlsZVRva2VuID0gY29tcGlsZVRva2VuO1xuXHRjb21waWxlLmNvbXBpbGVVbnNhZmUgPSBjb21waWxlVW5zYWZlO1xuXHRjb21waWxlLlBzZXVkb3MgPSBQc2V1ZG9zO1xuXG5cdHJldHVybiBjb21waWxlO1xufVxuXG5cbi8qKiovIH0pLFxuLyogNDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZTtcblxudmFyIHJlX25hbWUgPSAvXig/OlxcXFwufFtcXHdcXC1cXHUwMGMwLVxcdUZGRkZdKSsvLFxuICAgIHJlX2VzY2FwZSA9IC9cXFxcKFtcXGRhLWZdezEsNn1cXHM/fChcXHMpfC4pL2lnLFxuICAgIC8vbW9kaWZpZWQgdmVyc2lvbiBvZiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L3NpenpsZS9ibG9iL21hc3Rlci9zcmMvc2l6emxlLmpzI0w4N1xuICAgIHJlX2F0dHIgPSAvXlxccyooKD86XFxcXC58W1xcd1xcdTAwYzAtXFx1RkZGRlxcLV0pKylcXHMqKD86KFxcUz8pPVxccyooPzooWydcIl0pKC4qPylcXDN8KCM/KD86XFxcXC58W1xcd1xcdTAwYzAtXFx1RkZGRlxcLV0pKil8KXwpXFxzKihpKT9cXF0vO1xuXG52YXIgYWN0aW9uVHlwZXMgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0XCJ1bmRlZmluZWRcIjogXCJleGlzdHNcIixcblx0XCJcIjogIFwiZXF1YWxzXCIsXG5cdFwiflwiOiBcImVsZW1lbnRcIixcblx0XCJeXCI6IFwic3RhcnRcIixcblx0XCIkXCI6IFwiZW5kXCIsXG5cdFwiKlwiOiBcImFueVwiLFxuXHRcIiFcIjogXCJub3RcIixcblx0XCJ8XCI6IFwiaHlwaGVuXCJcbn07XG5cbnZhciBzaW1wbGVTZWxlY3RvcnMgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0XCI+XCI6IFwiY2hpbGRcIixcblx0XCI8XCI6IFwicGFyZW50XCIsXG5cdFwiflwiOiBcInNpYmxpbmdcIixcblx0XCIrXCI6IFwiYWRqYWNlbnRcIlxufTtcblxudmFyIGF0dHJpYlNlbGVjdG9ycyA9IHtcblx0X19wcm90b19fOiBudWxsLFxuXHRcIiNcIjogW1wiaWRcIiwgXCJlcXVhbHNcIl0sXG5cdFwiLlwiOiBbXCJjbGFzc1wiLCBcImVsZW1lbnRcIl1cbn07XG5cbi8vcHNldWRvcywgd2hvc2UgZGF0YS1wcm9wZXJ0eSBpcyBwYXJzZWQgYXMgd2VsbFxudmFyIHVucGFja1BzZXVkb3MgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0XCJoYXNcIjogdHJ1ZSxcblx0XCJub3RcIjogdHJ1ZSxcblx0XCJtYXRjaGVzXCI6IHRydWVcbn07XG5cbnZhciBzdHJpcFF1b3Rlc0Zyb21Qc2V1ZG9zID0ge1xuXHRfX3Byb3RvX186IG51bGwsXG5cdFwiY29udGFpbnNcIjogdHJ1ZSxcblx0XCJpY29udGFpbnNcIjogdHJ1ZVxufTtcblxudmFyIHF1b3RlcyA9IHtcblx0X19wcm90b19fOiBudWxsLFxuXHRcIlxcXCJcIjogdHJ1ZSxcblx0XCInXCI6IHRydWVcbn07XG5cbi8vdW5lc2NhcGUgZnVuY3Rpb24gdGFrZW4gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L3NpenpsZS9ibG9iL21hc3Rlci9zcmMvc2l6emxlLmpzI0wxMzlcbmZ1bmN0aW9uIGZ1bmVzY2FwZSggXywgZXNjYXBlZCwgZXNjYXBlZFdoaXRlc3BhY2UgKSB7XG5cdHZhciBoaWdoID0gXCIweFwiICsgZXNjYXBlZCAtIDB4MTAwMDA7XG5cdC8vIE5hTiBtZWFucyBub24tY29kZXBvaW50XG5cdC8vIFN1cHBvcnQ6IEZpcmVmb3hcblx0Ly8gV29ya2Fyb3VuZCBlcnJvbmVvdXMgbnVtZXJpYyBpbnRlcnByZXRhdGlvbiBvZiArXCIweFwiXG5cdHJldHVybiBoaWdoICE9PSBoaWdoIHx8IGVzY2FwZWRXaGl0ZXNwYWNlID9cblx0XHRlc2NhcGVkIDpcblx0XHQvLyBCTVAgY29kZXBvaW50XG5cdFx0aGlnaCA8IDAgP1xuXHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCArIDB4MTAwMDAgKSA6XG5cdFx0XHQvLyBTdXBwbGVtZW50YWwgUGxhbmUgY29kZXBvaW50IChzdXJyb2dhdGUgcGFpcilcblx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggPj4gMTAgfCAweEQ4MDAsIGhpZ2ggJiAweDNGRiB8IDB4REMwMCApO1xufVxuXG5mdW5jdGlvbiB1bmVzY2FwZUNTUyhzdHIpe1xuXHRyZXR1cm4gc3RyLnJlcGxhY2UocmVfZXNjYXBlLCBmdW5lc2NhcGUpO1xufVxuXG5mdW5jdGlvbiBpc1doaXRlc3BhY2UoYyl7XG5cdHJldHVybiBjID09PSBcIiBcIiB8fCBjID09PSBcIlxcblwiIHx8IGMgPT09IFwiXFx0XCIgfHwgYyA9PT0gXCJcXGZcIiB8fCBjID09PSBcIlxcclwiO1xufVxuXG5mdW5jdGlvbiBwYXJzZShzZWxlY3Rvciwgb3B0aW9ucyl7XG5cdHZhciBzdWJzZWxlY3RzID0gW107XG5cblx0c2VsZWN0b3IgPSBwYXJzZVNlbGVjdG9yKHN1YnNlbGVjdHMsIHNlbGVjdG9yICsgXCJcIiwgb3B0aW9ucyk7XG5cblx0aWYoc2VsZWN0b3IgIT09IFwiXCIpe1xuXHRcdHRocm93IG5ldyBTeW50YXhFcnJvcihcIlVubWF0Y2hlZCBzZWxlY3RvcjogXCIgKyBzZWxlY3Rvcik7XG5cdH1cblxuXHRyZXR1cm4gc3Vic2VsZWN0cztcbn1cblxuZnVuY3Rpb24gcGFyc2VTZWxlY3RvcihzdWJzZWxlY3RzLCBzZWxlY3Rvciwgb3B0aW9ucyl7XG5cdHZhciB0b2tlbnMgPSBbXSxcblx0XHRzYXdXUyA9IGZhbHNlLFxuXHRcdGRhdGEsIGZpcnN0Q2hhciwgbmFtZSwgcXVvdDtcblxuXHRmdW5jdGlvbiBnZXROYW1lKCl7XG5cdFx0dmFyIHN1YiA9IHNlbGVjdG9yLm1hdGNoKHJlX25hbWUpWzBdO1xuXHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKHN1Yi5sZW5ndGgpO1xuXHRcdHJldHVybiB1bmVzY2FwZUNTUyhzdWIpO1xuXHR9XG5cblx0ZnVuY3Rpb24gc3RyaXBXaGl0ZXNwYWNlKHN0YXJ0KXtcblx0XHR3aGlsZShpc1doaXRlc3BhY2Uoc2VsZWN0b3IuY2hhckF0KHN0YXJ0KSkpIHN0YXJ0Kys7XG5cdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHIoc3RhcnQpO1xuXHR9XG5cblx0c3RyaXBXaGl0ZXNwYWNlKDApO1xuXG5cdHdoaWxlKHNlbGVjdG9yICE9PSBcIlwiKXtcblx0XHRmaXJzdENoYXIgPSBzZWxlY3Rvci5jaGFyQXQoMCk7XG5cblx0XHRpZihpc1doaXRlc3BhY2UoZmlyc3RDaGFyKSl7XG5cdFx0XHRzYXdXUyA9IHRydWU7XG5cdFx0XHRzdHJpcFdoaXRlc3BhY2UoMSk7XG5cdFx0fSBlbHNlIGlmKGZpcnN0Q2hhciBpbiBzaW1wbGVTZWxlY3RvcnMpe1xuXHRcdFx0dG9rZW5zLnB1c2goe3R5cGU6IHNpbXBsZVNlbGVjdG9yc1tmaXJzdENoYXJdfSk7XG5cdFx0XHRzYXdXUyA9IGZhbHNlO1xuXG5cdFx0XHRzdHJpcFdoaXRlc3BhY2UoMSk7XG5cdFx0fSBlbHNlIGlmKGZpcnN0Q2hhciA9PT0gXCIsXCIpe1xuXHRcdFx0aWYodG9rZW5zLmxlbmd0aCA9PT0gMCl7XG5cdFx0XHRcdHRocm93IG5ldyBTeW50YXhFcnJvcihcImVtcHR5IHN1Yi1zZWxlY3RvclwiKTtcblx0XHRcdH1cblx0XHRcdHN1YnNlbGVjdHMucHVzaCh0b2tlbnMpO1xuXHRcdFx0dG9rZW5zID0gW107XG5cdFx0XHRzYXdXUyA9IGZhbHNlO1xuXHRcdFx0c3RyaXBXaGl0ZXNwYWNlKDEpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZihzYXdXUyl7XG5cdFx0XHRcdGlmKHRva2Vucy5sZW5ndGggPiAwKXtcblx0XHRcdFx0XHR0b2tlbnMucHVzaCh7dHlwZTogXCJkZXNjZW5kYW50XCJ9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzYXdXUyA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZihmaXJzdENoYXIgPT09IFwiKlwiKXtcblx0XHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHIoMSk7XG5cdFx0XHRcdHRva2Vucy5wdXNoKHt0eXBlOiBcInVuaXZlcnNhbFwifSk7XG5cdFx0XHR9IGVsc2UgaWYoZmlyc3RDaGFyIGluIGF0dHJpYlNlbGVjdG9ycyl7XG5cdFx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKDEpO1xuXHRcdFx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRcdFx0dHlwZTogXCJhdHRyaWJ1dGVcIixcblx0XHRcdFx0XHRuYW1lOiBhdHRyaWJTZWxlY3RvcnNbZmlyc3RDaGFyXVswXSxcblx0XHRcdFx0XHRhY3Rpb246IGF0dHJpYlNlbGVjdG9yc1tmaXJzdENoYXJdWzFdLFxuXHRcdFx0XHRcdHZhbHVlOiBnZXROYW1lKCksXG5cdFx0XHRcdFx0aWdub3JlQ2FzZTogZmFsc2Vcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2UgaWYoZmlyc3RDaGFyID09PSBcIltcIil7XG5cdFx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKDEpO1xuXHRcdFx0XHRkYXRhID0gc2VsZWN0b3IubWF0Y2gocmVfYXR0cik7XG5cdFx0XHRcdGlmKCFkYXRhKXtcblx0XHRcdFx0XHR0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJNYWxmb3JtZWQgYXR0cmlidXRlIHNlbGVjdG9yOiBcIiArIHNlbGVjdG9yKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cihkYXRhWzBdLmxlbmd0aCk7XG5cdFx0XHRcdG5hbWUgPSB1bmVzY2FwZUNTUyhkYXRhWzFdKTtcblxuXHRcdFx0XHRpZihcblx0XHRcdFx0XHQhb3B0aW9ucyB8fCAoXG5cdFx0XHRcdFx0XHRcImxvd2VyQ2FzZUF0dHJpYnV0ZU5hbWVzXCIgaW4gb3B0aW9ucyA/XG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMubG93ZXJDYXNlQXR0cmlidXRlTmFtZXMgOlxuXHRcdFx0XHRcdFx0XHQhb3B0aW9ucy54bWxNb2RlXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpe1xuXHRcdFx0XHRcdG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRcdFx0dHlwZTogXCJhdHRyaWJ1dGVcIixcblx0XHRcdFx0XHRuYW1lOiBuYW1lLFxuXHRcdFx0XHRcdGFjdGlvbjogYWN0aW9uVHlwZXNbZGF0YVsyXV0sXG5cdFx0XHRcdFx0dmFsdWU6IHVuZXNjYXBlQ1NTKGRhdGFbNF0gfHwgZGF0YVs1XSB8fCBcIlwiKSxcblx0XHRcdFx0XHRpZ25vcmVDYXNlOiAhIWRhdGFbNl1cblx0XHRcdFx0fSk7XG5cblx0XHRcdH0gZWxzZSBpZihmaXJzdENoYXIgPT09IFwiOlwiKXtcblx0XHRcdFx0aWYoc2VsZWN0b3IuY2hhckF0KDEpID09PSBcIjpcIil7XG5cdFx0XHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHIoMik7XG5cdFx0XHRcdFx0dG9rZW5zLnB1c2goe3R5cGU6IFwicHNldWRvLWVsZW1lbnRcIiwgbmFtZTogZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCl9KTtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKDEpO1xuXG5cdFx0XHRcdG5hbWUgPSBnZXROYW1lKCkudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0ZGF0YSA9IG51bGw7XG5cblx0XHRcdFx0aWYoc2VsZWN0b3IuY2hhckF0KDApID09PSBcIihcIil7XG5cdFx0XHRcdFx0aWYobmFtZSBpbiB1bnBhY2tQc2V1ZG9zKXtcblx0XHRcdFx0XHRcdHF1b3QgPSBzZWxlY3Rvci5jaGFyQXQoMSk7XG5cdFx0XHRcdFx0XHR2YXIgcXVvdGVkID0gcXVvdCBpbiBxdW90ZXM7XG5cblx0XHRcdFx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKHF1b3RlZCArIDEpO1xuXG5cdFx0XHRcdFx0XHRkYXRhID0gW107XG5cdFx0XHRcdFx0XHRzZWxlY3RvciA9IHBhcnNlU2VsZWN0b3IoZGF0YSwgc2VsZWN0b3IsIG9wdGlvbnMpO1xuXG5cdFx0XHRcdFx0XHRpZihxdW90ZWQpe1xuXHRcdFx0XHRcdFx0XHRpZihzZWxlY3Rvci5jaGFyQXQoMCkgIT09IHF1b3Qpe1xuXHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBTeW50YXhFcnJvcihcInVubWF0Y2hlZCBxdW90ZXMgaW4gOlwiICsgbmFtZSk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHIoMSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYoc2VsZWN0b3IuY2hhckF0KDApICE9PSBcIilcIil7XG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBTeW50YXhFcnJvcihcIm1pc3NpbmcgY2xvc2luZyBwYXJlbnRoZXNpcyBpbiA6XCIgKyBuYW1lICsgXCIgXCIgKyBzZWxlY3Rvcik7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKDEpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR2YXIgcG9zID0gMSwgY291bnRlciA9IDE7XG5cblx0XHRcdFx0XHRcdGZvcig7IGNvdW50ZXIgPiAwICYmIHBvcyA8IHNlbGVjdG9yLmxlbmd0aDsgcG9zKyspe1xuXHRcdFx0XHRcdFx0XHRpZihzZWxlY3Rvci5jaGFyQXQocG9zKSA9PT0gXCIoXCIpIGNvdW50ZXIrKztcblx0XHRcdFx0XHRcdFx0ZWxzZSBpZihzZWxlY3Rvci5jaGFyQXQocG9zKSA9PT0gXCIpXCIpIGNvdW50ZXItLTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYoY291bnRlcil7XG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBTeW50YXhFcnJvcihcInBhcmVudGhlc2lzIG5vdCBtYXRjaGVkXCIpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRkYXRhID0gc2VsZWN0b3Iuc3Vic3RyKDEsIHBvcyAtIDIpO1xuXHRcdFx0XHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHIocG9zKTtcblxuXHRcdFx0XHRcdFx0aWYobmFtZSBpbiBzdHJpcFF1b3Rlc0Zyb21Qc2V1ZG9zKXtcblx0XHRcdFx0XHRcdFx0cXVvdCA9IGRhdGEuY2hhckF0KDApO1xuXG5cdFx0XHRcdFx0XHRcdGlmKHF1b3QgPT09IGRhdGEuc2xpY2UoLTEpICYmIHF1b3QgaW4gcXVvdGVzKXtcblx0XHRcdFx0XHRcdFx0XHRkYXRhID0gZGF0YS5zbGljZSgxLCAtMSk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRkYXRhID0gdW5lc2NhcGVDU1MoZGF0YSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dG9rZW5zLnB1c2goe3R5cGU6IFwicHNldWRvXCIsIG5hbWU6IG5hbWUsIGRhdGE6IGRhdGF9KTtcblx0XHRcdH0gZWxzZSBpZihyZV9uYW1lLnRlc3Qoc2VsZWN0b3IpKXtcblx0XHRcdFx0bmFtZSA9IGdldE5hbWUoKTtcblxuXHRcdFx0XHRpZighb3B0aW9ucyB8fCAoXCJsb3dlckNhc2VUYWdzXCIgaW4gb3B0aW9ucyA/IG9wdGlvbnMubG93ZXJDYXNlVGFncyA6ICFvcHRpb25zLnhtbE1vZGUpKXtcblx0XHRcdFx0XHRuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dG9rZW5zLnB1c2goe3R5cGU6IFwidGFnXCIsIG5hbWU6IG5hbWV9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmKHRva2Vucy5sZW5ndGggJiYgdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXS50eXBlID09PSBcImRlc2NlbmRhbnRcIil7XG5cdFx0XHRcdFx0dG9rZW5zLnBvcCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFkZFRva2VuKHN1YnNlbGVjdHMsIHRva2Vucyk7XG5cdFx0XHRcdHJldHVybiBzZWxlY3Rvcjtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRhZGRUb2tlbihzdWJzZWxlY3RzLCB0b2tlbnMpO1xuXG5cdHJldHVybiBzZWxlY3Rvcjtcbn1cblxuZnVuY3Rpb24gYWRkVG9rZW4oc3Vic2VsZWN0cywgdG9rZW5zKXtcblx0aWYoc3Vic2VsZWN0cy5sZW5ndGggPiAwICYmIHRva2Vucy5sZW5ndGggPT09IDApe1xuXHRcdHRocm93IG5ldyBTeW50YXhFcnJvcihcImVtcHR5IHN1Yi1zZWxlY3RvclwiKTtcblx0fVxuXG5cdHN1YnNlbGVjdHMucHVzaCh0b2tlbnMpO1xufVxuXG5cbi8qKiovIH0pLFxuLyogNDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxubW9kdWxlLmV4cG9ydHMgPSBzb3J0QnlQcm9jZWR1cmU7XG5cbi8qXG5cdHNvcnQgdGhlIHBhcnRzIG9mIHRoZSBwYXNzZWQgc2VsZWN0b3IsXG5cdGFzIHRoZXJlIGlzIHBvdGVudGlhbCBmb3Igb3B0aW1pemF0aW9uXG5cdChzb21lIHR5cGVzIG9mIHNlbGVjdG9ycyBhcmUgZmFzdGVyIHRoYW4gb3RoZXJzKVxuKi9cblxudmFyIHByb2NlZHVyZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpO1xuXG52YXIgYXR0cmlidXRlcyA9IHtcblx0X19wcm90b19fOiBudWxsLFxuXHRleGlzdHM6IDEwLFxuXHRlcXVhbHM6IDgsXG5cdG5vdDogNyxcblx0c3RhcnQ6IDYsXG5cdGVuZDogNixcblx0YW55OiA1LFxuXHRoeXBoZW46IDQsXG5cdGVsZW1lbnQ6IDRcbn07XG5cbmZ1bmN0aW9uIHNvcnRCeVByb2NlZHVyZShhcnIpe1xuXHR2YXIgcHJvY3MgPSBhcnIubWFwKGdldFByb2NlZHVyZSk7XG5cdGZvcih2YXIgaSA9IDE7IGkgPCBhcnIubGVuZ3RoOyBpKyspe1xuXHRcdHZhciBwcm9jTmV3ID0gcHJvY3NbaV07XG5cblx0XHRpZihwcm9jTmV3IDwgMCkgY29udGludWU7XG5cblx0XHRmb3IodmFyIGogPSBpIC0gMTsgaiA+PSAwICYmIHByb2NOZXcgPCBwcm9jc1tqXTsgai0tKXtcblx0XHRcdHZhciB0b2tlbiA9IGFycltqICsgMV07XG5cdFx0XHRhcnJbaiArIDFdID0gYXJyW2pdO1xuXHRcdFx0YXJyW2pdID0gdG9rZW47XG5cdFx0XHRwcm9jc1tqICsgMV0gPSBwcm9jc1tqXTtcblx0XHRcdHByb2NzW2pdID0gcHJvY05ldztcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0UHJvY2VkdXJlKHRva2VuKXtcblx0dmFyIHByb2MgPSBwcm9jZWR1cmVbdG9rZW4udHlwZV07XG5cblx0aWYocHJvYyA9PT0gcHJvY2VkdXJlLmF0dHJpYnV0ZSl7XG5cdFx0cHJvYyA9IGF0dHJpYnV0ZXNbdG9rZW4uYWN0aW9uXTtcblxuXHRcdGlmKHByb2MgPT09IGF0dHJpYnV0ZXMuZXF1YWxzICYmIHRva2VuLm5hbWUgPT09IFwiaWRcIil7XG5cdFx0XHQvL3ByZWZlciBJRCBzZWxlY3RvcnMgKGVnLiAjSUQpXG5cdFx0XHRwcm9jID0gOTtcblx0XHR9XG5cblx0XHRpZih0b2tlbi5pZ25vcmVDYXNlKXtcblx0XHRcdC8vaWdub3JlQ2FzZSBhZGRzIHNvbWUgb3ZlcmhlYWQsIHByZWZlciBcIm5vcm1hbFwiIHRva2VuXG5cdFx0XHQvL3RoaXMgaXMgYSBiaW5hcnkgb3BlcmF0aW9uLCB0byBlbnN1cmUgaXQncyBzdGlsbCBhbiBpbnRcblx0XHRcdHByb2MgPj49IDE7XG5cdFx0fVxuXHR9IGVsc2UgaWYocHJvYyA9PT0gcHJvY2VkdXJlLnBzZXVkbyl7XG5cdFx0aWYoIXRva2VuLmRhdGEpe1xuXHRcdFx0cHJvYyA9IDM7XG5cdFx0fSBlbHNlIGlmKHRva2VuLm5hbWUgPT09IFwiaGFzXCIgfHwgdG9rZW4ubmFtZSA9PT0gXCJjb250YWluc1wiKXtcblx0XHRcdHByb2MgPSAwOyAvL2V4cGVuc2l2ZSBpbiBhbnkgY2FzZVxuXHRcdH0gZWxzZSBpZih0b2tlbi5uYW1lID09PSBcIm1hdGNoZXNcIiB8fCB0b2tlbi5uYW1lID09PSBcIm5vdFwiKXtcblx0XHRcdHByb2MgPSAwO1xuXHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IHRva2VuLmRhdGEubGVuZ3RoOyBpKyspe1xuXHRcdFx0XHQvL1RPRE8gYmV0dGVyIGhhbmRsaW5nIG9mIGNvbXBsZXggc2VsZWN0b3JzXG5cdFx0XHRcdGlmKHRva2VuLmRhdGFbaV0ubGVuZ3RoICE9PSAxKSBjb250aW51ZTtcblx0XHRcdFx0dmFyIGN1ciA9IGdldFByb2NlZHVyZSh0b2tlbi5kYXRhW2ldWzBdKTtcblx0XHRcdFx0Ly9hdm9pZCBleGVjdXRpbmcgOmhhcyBvciA6Y29udGFpbnNcblx0XHRcdFx0aWYoY3VyID09PSAwKXtcblx0XHRcdFx0XHRwcm9jID0gMDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZihjdXIgPiBwcm9jKSBwcm9jID0gY3VyO1xuXHRcdFx0fVxuXHRcdFx0aWYodG9rZW4uZGF0YS5sZW5ndGggPiAxICYmIHByb2MgPiAwKSBwcm9jIC09IDE7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb2MgPSAxO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcHJvYztcbn1cblxuXG4vKioqLyB9KSxcbi8qIDQzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBTZXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ0KTtcbnZhciBhdHRyaWJ1dGVGYWN0b3J5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMyk7XG5cbmZ1bmN0aW9uIGdlbmVyYWxGYWN0b3J5KGFkYXB0ZXIsIFBzZXVkb3Mpe1xuXHQvKlxuXHRcdGFsbCBhdmFpbGFibGUgcnVsZXNcblx0Ki9cblx0cmV0dXJuIHtcblx0XHRfX3Byb3RvX186IG51bGwsXG5cblx0XHRhdHRyaWJ1dGU6IGF0dHJpYnV0ZUZhY3RvcnkoYWRhcHRlcikuY29tcGlsZSxcblx0XHRwc2V1ZG86IFBzZXVkb3MuY29tcGlsZSxcblxuXHRcdC8vdGFnc1xuXHRcdHRhZzogZnVuY3Rpb24obmV4dCwgZGF0YSl7XG5cdFx0XHR2YXIgbmFtZSA9IGRhdGEubmFtZTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiB0YWcoZWxlbSl7XG5cdFx0XHRcdHJldHVybiBhZGFwdGVyLmdldE5hbWUoZWxlbSkgPT09IG5hbWUgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdC8vdHJhdmVyc2FsXG5cdFx0ZGVzY2VuZGFudDogZnVuY3Rpb24obmV4dCl7XG5cdFx0XHR2YXIgaXNGYWxzZUNhY2hlID0gbmV3IFNldCgpO1xuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gZGVzY2VuZGFudChlbGVtKXtcblx0XHRcdFx0dmFyIGZvdW5kID0gZmFsc2U7XG5cblx0XHRcdFx0d2hpbGUoIWZvdW5kICYmIChlbGVtID0gYWRhcHRlci5nZXRQYXJlbnQoZWxlbSkpKXtcblx0XHRcdFx0XHRpZighaXNGYWxzZUNhY2hlLmhhcyhlbGVtKSl7XG5cdFx0XHRcdFx0XHRmb3VuZCA9IG5leHQoZWxlbSk7XG5cdFx0XHRcdFx0XHRpZighZm91bmQpe1xuXHRcdFx0XHRcdFx0XHRpc0ZhbHNlQ2FjaGUuYWRkKGVsZW0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBmb3VuZDtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRfZmxleGlibGVEZXNjZW5kYW50OiBmdW5jdGlvbihuZXh0KXtcblx0XHRcdC8vIEluY2x1ZGUgZWxlbWVudCBpdHNlbGYsIG9ubHkgdXNlZCB3aGlsZSBxdWVyeWluZyBhbiBhcnJheVxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGRlc2NlbmRhbnQoZWxlbSl7XG5cblx0XHRcdFx0dmFyIGZvdW5kID0gbmV4dChlbGVtKTtcblxuXHRcdFx0XHR3aGlsZSghZm91bmQgJiYgKGVsZW0gPSBhZGFwdGVyLmdldFBhcmVudChlbGVtKSkpe1xuXHRcdFx0XHRcdGZvdW5kID0gbmV4dChlbGVtKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBmb3VuZDtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRwYXJlbnQ6IGZ1bmN0aW9uKG5leHQsIGRhdGEsIG9wdGlvbnMpe1xuXHRcdFx0aWYob3B0aW9ucyAmJiBvcHRpb25zLnN0cmljdCkgdGhyb3cgbmV3IEVycm9yKFwiUGFyZW50IHNlbGVjdG9yIGlzbid0IHBhcnQgb2YgQ1NTM1wiKTtcblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIHBhcmVudChlbGVtKXtcblx0XHRcdFx0cmV0dXJuIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oZWxlbSkuc29tZSh0ZXN0KTtcblx0XHRcdH07XG5cblx0XHRcdGZ1bmN0aW9uIHRlc3QoZWxlbSl7XG5cdFx0XHRcdHJldHVybiBhZGFwdGVyLmlzVGFnKGVsZW0pICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRjaGlsZDogZnVuY3Rpb24obmV4dCl7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gY2hpbGQoZWxlbSl7XG5cdFx0XHRcdHZhciBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChlbGVtKTtcblx0XHRcdFx0cmV0dXJuICEhcGFyZW50ICYmIG5leHQocGFyZW50KTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRzaWJsaW5nOiBmdW5jdGlvbihuZXh0KXtcblx0XHRcdHJldHVybiBmdW5jdGlvbiBzaWJsaW5nKGVsZW0pe1xuXHRcdFx0XHR2YXIgc2libGluZ3MgPSBhZGFwdGVyLmdldFNpYmxpbmdzKGVsZW0pO1xuXG5cdFx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzaWJsaW5ncy5sZW5ndGg7IGkrKyl7XG5cdFx0XHRcdFx0aWYoYWRhcHRlci5pc1RhZyhzaWJsaW5nc1tpXSkpe1xuXHRcdFx0XHRcdFx0aWYoc2libGluZ3NbaV0gPT09IGVsZW0pIGJyZWFrO1xuXHRcdFx0XHRcdFx0aWYobmV4dChzaWJsaW5nc1tpXSkpIHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRhZGphY2VudDogZnVuY3Rpb24obmV4dCl7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gYWRqYWNlbnQoZWxlbSl7XG5cdFx0XHRcdHZhciBzaWJsaW5ncyA9IGFkYXB0ZXIuZ2V0U2libGluZ3MoZWxlbSksXG5cdFx0XHRcdFx0bGFzdEVsZW1lbnQ7XG5cblx0XHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IHNpYmxpbmdzLmxlbmd0aDsgaSsrKXtcblx0XHRcdFx0XHRpZihhZGFwdGVyLmlzVGFnKHNpYmxpbmdzW2ldKSl7XG5cdFx0XHRcdFx0XHRpZihzaWJsaW5nc1tpXSA9PT0gZWxlbSkgYnJlYWs7XG5cdFx0XHRcdFx0XHRsYXN0RWxlbWVudCA9IHNpYmxpbmdzW2ldO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAhIWxhc3RFbGVtZW50ICYmIG5leHQobGFzdEVsZW1lbnQpO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdHVuaXZlcnNhbDogZnVuY3Rpb24obmV4dCl7XG5cdFx0XHRyZXR1cm4gbmV4dDtcblx0XHR9XG5cdH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2VuZXJhbEZhY3Rvcnk7XG5cblxuLyoqKi8gfSksXG4vKiA0NCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNDUpKCkgPyBTZXQgOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ2KTtcblxuXG4vKioqLyB9KSxcbi8qIDQ1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgc2V0LCBpdGVyYXRvciwgcmVzdWx0O1xuXHRpZiAodHlwZW9mIFNldCAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuXHRzZXQgPSBuZXcgU2V0KFsncmF6JywgJ2R3YScsICd0cnp5J10pO1xuXHRpZiAoU3RyaW5nKHNldCkgIT09ICdbb2JqZWN0IFNldF0nKSByZXR1cm4gZmFsc2U7XG5cdGlmIChzZXQuc2l6ZSAhPT0gMykgcmV0dXJuIGZhbHNlO1xuXHRpZiAodHlwZW9mIHNldC5hZGQgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcblx0aWYgKHR5cGVvZiBzZXQuY2xlYXIgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcblx0aWYgKHR5cGVvZiBzZXQuZGVsZXRlICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG5cdGlmICh0eXBlb2Ygc2V0LmVudHJpZXMgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcblx0aWYgKHR5cGVvZiBzZXQuZm9yRWFjaCAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuXHRpZiAodHlwZW9mIHNldC5oYXMgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcblx0aWYgKHR5cGVvZiBzZXQua2V5cyAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuXHRpZiAodHlwZW9mIHNldC52YWx1ZXMgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcblxuXHRpdGVyYXRvciA9IHNldC52YWx1ZXMoKTtcblx0cmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuXHRpZiAocmVzdWx0LmRvbmUgIT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG5cdGlmIChyZXN1bHQudmFsdWUgIT09ICdyYXonKSByZXR1cm4gZmFsc2U7XG5cblx0cmV0dXJuIHRydWU7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNDYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGNsZWFyICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNilcbiAgLCBlSW5kZXhPZiAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDcpXG4gICwgc2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG4gICwgY2FsbGFibGUgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpXG4gICwgZCAgICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpXG4gICwgZWUgICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KVxuICAsIFN5bWJvbCAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKVxuICAsIGl0ZXJhdG9yICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMilcbiAgLCBmb3JPZiAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNzEpXG4gICwgSXRlcmF0b3IgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg0KVxuICAsIGlzTmF0aXZlICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NSlcblxuICAsIGNhbGwgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbFxuICAsIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5LCBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZlxuICAsIFNldFBvbHksIGdldFZhbHVlcywgTmF0aXZlU2V0O1xuXG5pZiAoaXNOYXRpdmUpIE5hdGl2ZVNldCA9IFNldDtcblxubW9kdWxlLmV4cG9ydHMgPSBTZXRQb2x5ID0gZnVuY3Rpb24gU2V0KC8qaXRlcmFibGUqLykge1xuXHR2YXIgaXRlcmFibGUgPSBhcmd1bWVudHNbMF0sIHNlbGY7XG5cdGlmICghKHRoaXMgaW5zdGFuY2VvZiBTZXRQb2x5KSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQ29uc3RydWN0b3IgcmVxdWlyZXMgXFwnbmV3XFwnJyk7XG5cdGlmIChpc05hdGl2ZSAmJiBzZXRQcm90b3R5cGVPZikgc2VsZiA9IHNldFByb3RvdHlwZU9mKG5ldyBOYXRpdmVTZXQoKSwgZ2V0UHJvdG90eXBlT2YodGhpcykpO1xuXHRlbHNlIHNlbGYgPSB0aGlzO1xuXHRpZiAoaXRlcmFibGUgIT0gbnVsbCkgaXRlcmF0b3IoaXRlcmFibGUpO1xuXHRkZWZpbmVQcm9wZXJ0eShzZWxmLCAnX19zZXREYXRhX18nLCBkKCdjJywgW10pKTtcblx0aWYgKCFpdGVyYWJsZSkgcmV0dXJuIHNlbGY7XG5cdGZvck9mKGl0ZXJhYmxlLCBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRpZiAoZUluZGV4T2YuY2FsbCh0aGlzLCB2YWx1ZSkgIT09IC0xKSByZXR1cm47XG5cdFx0dGhpcy5wdXNoKHZhbHVlKTtcblx0fSwgc2VsZi5fX3NldERhdGFfXyk7XG5cdHJldHVybiBzZWxmO1xufTtcblxuaWYgKGlzTmF0aXZlKSB7XG5cdGlmIChzZXRQcm90b3R5cGVPZikgc2V0UHJvdG90eXBlT2YoU2V0UG9seSwgTmF0aXZlU2V0KTtcblx0U2V0UG9seS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE5hdGl2ZVNldC5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IGQoU2V0UG9seSkgfSk7XG59XG5cbmVlKE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFNldFBvbHkucHJvdG90eXBlLCB7XG5cdGFkZDogZChmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRpZiAodGhpcy5oYXModmFsdWUpKSByZXR1cm4gdGhpcztcblx0XHR0aGlzLmVtaXQoJ19hZGQnLCB0aGlzLl9fc2V0RGF0YV9fLnB1c2godmFsdWUpIC0gMSwgdmFsdWUpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9KSxcblx0Y2xlYXI6IGQoZnVuY3Rpb24gKCkge1xuXHRcdGlmICghdGhpcy5fX3NldERhdGFfXy5sZW5ndGgpIHJldHVybjtcblx0XHRjbGVhci5jYWxsKHRoaXMuX19zZXREYXRhX18pO1xuXHRcdHRoaXMuZW1pdCgnX2NsZWFyJyk7XG5cdH0pLFxuXHRkZWxldGU6IGQoZnVuY3Rpb24gKHZhbHVlKSB7XG5cdFx0dmFyIGluZGV4ID0gZUluZGV4T2YuY2FsbCh0aGlzLl9fc2V0RGF0YV9fLCB2YWx1ZSk7XG5cdFx0aWYgKGluZGV4ID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuXHRcdHRoaXMuX19zZXREYXRhX18uc3BsaWNlKGluZGV4LCAxKTtcblx0XHR0aGlzLmVtaXQoJ19kZWxldGUnLCBpbmRleCwgdmFsdWUpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9KSxcblx0ZW50cmllczogZChmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgJ2tleSt2YWx1ZScpOyB9KSxcblx0Zm9yRWFjaDogZChmdW5jdGlvbiAoY2IvKiwgdGhpc0FyZyovKSB7XG5cdFx0dmFyIHRoaXNBcmcgPSBhcmd1bWVudHNbMV0sIGl0ZXJhdG9yLCByZXN1bHQsIHZhbHVlO1xuXHRcdGNhbGxhYmxlKGNiKTtcblx0XHRpdGVyYXRvciA9IHRoaXMudmFsdWVzKCk7XG5cdFx0cmVzdWx0ID0gaXRlcmF0b3IuX25leHQoKTtcblx0XHR3aGlsZSAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHZhbHVlID0gaXRlcmF0b3IuX3Jlc29sdmUocmVzdWx0KTtcblx0XHRcdGNhbGwuY2FsbChjYiwgdGhpc0FyZywgdmFsdWUsIHZhbHVlLCB0aGlzKTtcblx0XHRcdHJlc3VsdCA9IGl0ZXJhdG9yLl9uZXh0KCk7XG5cdFx0fVxuXHR9KSxcblx0aGFzOiBkKGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRcdHJldHVybiAoZUluZGV4T2YuY2FsbCh0aGlzLl9fc2V0RGF0YV9fLCB2YWx1ZSkgIT09IC0xKTtcblx0fSksXG5cdGtleXM6IGQoZ2V0VmFsdWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy52YWx1ZXMoKTsgfSksXG5cdHNpemU6IGQuZ3MoZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fX3NldERhdGFfXy5sZW5ndGg7IH0pLFxuXHR2YWx1ZXM6IGQoZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMpOyB9KSxcblx0dG9TdHJpbmc6IGQoZnVuY3Rpb24gKCkgeyByZXR1cm4gJ1tvYmplY3QgU2V0XSc7IH0pXG59KSk7XG5kZWZpbmVQcm9wZXJ0eShTZXRQb2x5LnByb3RvdHlwZSwgU3ltYm9sLml0ZXJhdG9yLCBkKGdldFZhbHVlcykpO1xuZGVmaW5lUHJvcGVydHkoU2V0UG9seS5wcm90b3R5cGUsIFN5bWJvbC50b1N0cmluZ1RhZywgZCgnYycsICdTZXQnKSk7XG5cblxuLyoqKi8gfSksXG4vKiA0NyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgbnVtYmVySXNOYU4gICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KVxuICAsIHRvUG9zSW50ICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOClcbiAgLCB2YWx1ZSAgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMClcbiAgLCBpbmRleE9mICAgICAgICAgICA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mXG4gICwgb2JqSGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG4gICwgYWJzICAgICAgICAgICAgICAgPSBNYXRoLmFic1xuICAsIGZsb29yICAgICAgICAgICAgID0gTWF0aC5mbG9vcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2VhcmNoRWxlbWVudCAvKiwgZnJvbUluZGV4Ki8pIHtcblx0dmFyIGksIGxlbmd0aCwgZnJvbUluZGV4LCB2YWw7XG5cdGlmICghbnVtYmVySXNOYU4oc2VhcmNoRWxlbWVudCkpIHJldHVybiBpbmRleE9mLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cblx0bGVuZ3RoID0gdG9Qb3NJbnQodmFsdWUodGhpcykubGVuZ3RoKTtcblx0ZnJvbUluZGV4ID0gYXJndW1lbnRzWzFdO1xuXHRpZiAoaXNOYU4oZnJvbUluZGV4KSkgZnJvbUluZGV4ID0gMDtcblx0ZWxzZSBpZiAoZnJvbUluZGV4ID49IDApIGZyb21JbmRleCA9IGZsb29yKGZyb21JbmRleCk7XG5cdGVsc2UgZnJvbUluZGV4ID0gdG9Qb3NJbnQodGhpcy5sZW5ndGgpIC0gZmxvb3IoYWJzKGZyb21JbmRleCkpO1xuXG5cdGZvciAoaSA9IGZyb21JbmRleDsgaSA8IGxlbmd0aDsgKytpKSB7XG5cdFx0aWYgKG9iakhhc093blByb3BlcnR5LmNhbGwodGhpcywgaSkpIHtcblx0XHRcdHZhbCA9IHRoaXNbaV07XG5cdFx0XHRpZiAobnVtYmVySXNOYU4odmFsKSkgcmV0dXJuIGk7IC8vIEpzbGludDogaWdub3JlXG5cdFx0fVxuXHR9XG5cdHJldHVybiAtMTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA0OCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNDkpKClcblx0PyBOdW1iZXIuaXNOYU5cblx0OiBfX3dlYnBhY2tfcmVxdWlyZV9fKDUwKTtcblxuXG4vKioqLyB9KSxcbi8qIDQ5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgbnVtYmVySXNOYU4gPSBOdW1iZXIuaXNOYU47XG5cdGlmICh0eXBlb2YgbnVtYmVySXNOYU4gIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gIW51bWJlcklzTmFOKHt9KSAmJiBudW1iZXJJc05hTihOYU4pICYmICFudW1iZXJJc05hTigzNCk7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNTAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuXHRyZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDUxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBzaWduID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MilcblxuICAsIGFicyA9IE1hdGguYWJzLCBmbG9vciA9IE1hdGguZmxvb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdGlmIChpc05hTih2YWx1ZSkpIHJldHVybiAwO1xuXHR2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XG5cdGlmICgodmFsdWUgPT09IDApIHx8ICFpc0Zpbml0ZSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcblx0cmV0dXJuIHNpZ24odmFsdWUpICogZmxvb3IoYWJzKHZhbHVlKSk7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNTIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUzKSgpXG5cdD8gTWF0aC5zaWduXG5cdDogX193ZWJwYWNrX3JlcXVpcmVfXyg1NCk7XG5cblxuLyoqKi8gfSksXG4vKiA1MyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHNpZ24gPSBNYXRoLnNpZ247XG5cdGlmICh0eXBlb2Ygc2lnbiAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiAoc2lnbigxMCkgPT09IDEpICYmIChzaWduKC0yMCkgPT09IC0xKTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA1NCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHR2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XG5cdGlmIChpc05hTih2YWx1ZSkgfHwgKHZhbHVlID09PSAwKSkgcmV0dXJuIHZhbHVlO1xuXHRyZXR1cm4gdmFsdWUgPiAwID8gMSA6IC0xO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDU1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBpc1ZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblxudmFyIG1hcCA9IHsgZnVuY3Rpb246IHRydWUsIG9iamVjdDogdHJ1ZSB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRyZXR1cm4gKGlzVmFsdWUodmFsdWUpICYmIG1hcFt0eXBlb2YgdmFsdWVdKSB8fCBmYWxzZTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA1NiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8vIFdvcmthcm91bmQgZm9yIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTI4MDRcblxuXG5cbnZhciBjcmVhdGUgPSBPYmplY3QuY3JlYXRlLCBzaGltO1xuXG5pZiAoIV9fd2VicGFja19yZXF1aXJlX18oMTkpKCkpIHtcblx0c2hpbSA9IF9fd2VicGFja19yZXF1aXJlX18oMjApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbiAoKSB7XG5cdHZhciBudWxsT2JqZWN0LCBwb2x5UHJvcHMsIGRlc2M7XG5cdGlmICghc2hpbSkgcmV0dXJuIGNyZWF0ZTtcblx0aWYgKHNoaW0ubGV2ZWwgIT09IDEpIHJldHVybiBjcmVhdGU7XG5cblx0bnVsbE9iamVjdCA9IHt9O1xuXHRwb2x5UHJvcHMgPSB7fTtcblx0ZGVzYyA9IHtcblx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuXHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdHdyaXRhYmxlOiB0cnVlLFxuXHRcdHZhbHVlOiB1bmRlZmluZWRcblx0fTtcblx0T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoT2JqZWN0LnByb3RvdHlwZSkuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuXHRcdGlmIChuYW1lID09PSBcIl9fcHJvdG9fX1wiKSB7XG5cdFx0XHRwb2x5UHJvcHNbbmFtZV0gPSB7XG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0XHRcdHdyaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHR2YWx1ZTogdW5kZWZpbmVkXG5cdFx0XHR9O1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRwb2x5UHJvcHNbbmFtZV0gPSBkZXNjO1xuXHR9KTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobnVsbE9iamVjdCwgcG9seVByb3BzKTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc2hpbSwgXCJudWxsUG9seWZpbGxcIiwge1xuXHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG5cdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0d3JpdGFibGU6IGZhbHNlLFxuXHRcdHZhbHVlOiBudWxsT2JqZWN0XG5cdH0pO1xuXG5cdHJldHVybiBmdW5jdGlvbiAocHJvdG90eXBlLCBwcm9wcykge1xuXHRcdHJldHVybiBjcmVhdGUocHJvdG90eXBlID09PSBudWxsID8gbnVsbE9iamVjdCA6IHByb3RvdHlwZSwgcHJvcHMpO1xuXHR9O1xufSgpKTtcblxuXG4vKioqLyB9KSxcbi8qIDU3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgYXNzaWduID0gT2JqZWN0LmFzc2lnbiwgb2JqO1xuXHRpZiAodHlwZW9mIGFzc2lnbiAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cdG9iaiA9IHsgZm9vOiBcInJhelwiIH07XG5cdGFzc2lnbihvYmosIHsgYmFyOiBcImR3YVwiIH0sIHsgdHJ6eTogXCJ0cnp5XCIgfSk7XG5cdHJldHVybiAob2JqLmZvbyArIG9iai5iYXIgKyBvYmoudHJ6eSkgPT09IFwicmF6ZHdhdHJ6eVwiO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDU4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBrZXlzICA9IF9fd2VicGFja19yZXF1aXJlX18oNTkpXG4gICwgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApXG4gICwgbWF4ICAgPSBNYXRoLm1heDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZGVzdCwgc3JjIC8qLCDigKZzcmNuKi8pIHtcblx0dmFyIGVycm9yLCBpLCBsZW5ndGggPSBtYXgoYXJndW1lbnRzLmxlbmd0aCwgMiksIGFzc2lnbjtcblx0ZGVzdCA9IE9iamVjdCh2YWx1ZShkZXN0KSk7XG5cdGFzc2lnbiA9IGZ1bmN0aW9uIChrZXkpIHtcblx0XHR0cnkge1xuXHRcdFx0ZGVzdFtrZXldID0gc3JjW2tleV07XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0aWYgKCFlcnJvcikgZXJyb3IgPSBlO1xuXHRcdH1cblx0fTtcblx0Zm9yIChpID0gMTsgaSA8IGxlbmd0aDsgKytpKSB7XG5cdFx0c3JjID0gYXJndW1lbnRzW2ldO1xuXHRcdGtleXMoc3JjKS5mb3JFYWNoKGFzc2lnbik7XG5cdH1cblx0aWYgKGVycm9yICE9PSB1bmRlZmluZWQpIHRocm93IGVycm9yO1xuXHRyZXR1cm4gZGVzdDtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA1OSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNjApKClcblx0PyBPYmplY3Qua2V5c1xuXHQ6IF9fd2VicGFja19yZXF1aXJlX18oNjEpO1xuXG5cbi8qKiovIH0pLFxuLyogNjAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG5cdHRyeSB7XG5cdFx0T2JqZWN0LmtleXMoXCJwcmltaXRpdmVcIik7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGUpIHtcbiByZXR1cm4gZmFsc2U7XG59XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNjEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGlzVmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXG52YXIga2V5cyA9IE9iamVjdC5rZXlzO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QpIHtcblx0cmV0dXJuIGtleXMoaXNWYWx1ZShvYmplY3QpID8gT2JqZWN0KG9iamVjdCkgOiBvYmplY3QpO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDYyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLy8gRGVwcmVjYXRlZFxuXG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7XG4gcmV0dXJuIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIjtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA2MyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgc3RyID0gXCJyYXpkd2F0cnp5XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuXHRpZiAodHlwZW9mIHN0ci5jb250YWlucyAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiAoc3RyLmNvbnRhaW5zKFwiZHdhXCIpID09PSB0cnVlKSAmJiAoc3RyLmNvbnRhaW5zKFwiZm9vXCIpID09PSBmYWxzZSk7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNjQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGluZGV4T2YgPSBTdHJpbmcucHJvdG90eXBlLmluZGV4T2Y7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNlYXJjaFN0cmluZy8qLCBwb3NpdGlvbiovKSB7XG5cdHJldHVybiBpbmRleE9mLmNhbGwodGhpcywgc2VhcmNoU3RyaW5nLCBhcmd1bWVudHNbMV0pID4gLTE7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNjUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGQgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKVxuICAsIGNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVxuXG4gICwgYXBwbHkgPSBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHksIGNhbGwgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbFxuICAsIGNyZWF0ZSA9IE9iamVjdC5jcmVhdGUsIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5XG4gICwgZGVmaW5lUHJvcGVydGllcyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzXG4gICwgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG4gICwgZGVzY3JpcHRvciA9IHsgY29uZmlndXJhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUgfVxuXG4gICwgb24sIG9uY2UsIG9mZiwgZW1pdCwgbWV0aG9kcywgZGVzY3JpcHRvcnMsIGJhc2U7XG5cbm9uID0gZnVuY3Rpb24gKHR5cGUsIGxpc3RlbmVyKSB7XG5cdHZhciBkYXRhO1xuXG5cdGNhbGxhYmxlKGxpc3RlbmVyKTtcblxuXHRpZiAoIWhhc093blByb3BlcnR5LmNhbGwodGhpcywgJ19fZWVfXycpKSB7XG5cdFx0ZGF0YSA9IGRlc2NyaXB0b3IudmFsdWUgPSBjcmVhdGUobnVsbCk7XG5cdFx0ZGVmaW5lUHJvcGVydHkodGhpcywgJ19fZWVfXycsIGRlc2NyaXB0b3IpO1xuXHRcdGRlc2NyaXB0b3IudmFsdWUgPSBudWxsO1xuXHR9IGVsc2Uge1xuXHRcdGRhdGEgPSB0aGlzLl9fZWVfXztcblx0fVxuXHRpZiAoIWRhdGFbdHlwZV0pIGRhdGFbdHlwZV0gPSBsaXN0ZW5lcjtcblx0ZWxzZSBpZiAodHlwZW9mIGRhdGFbdHlwZV0gPT09ICdvYmplY3QnKSBkYXRhW3R5cGVdLnB1c2gobGlzdGVuZXIpO1xuXHRlbHNlIGRhdGFbdHlwZV0gPSBbZGF0YVt0eXBlXSwgbGlzdGVuZXJdO1xuXG5cdHJldHVybiB0aGlzO1xufTtcblxub25jZSA9IGZ1bmN0aW9uICh0eXBlLCBsaXN0ZW5lcikge1xuXHR2YXIgb25jZSwgc2VsZjtcblxuXHRjYWxsYWJsZShsaXN0ZW5lcik7XG5cdHNlbGYgPSB0aGlzO1xuXHRvbi5jYWxsKHRoaXMsIHR5cGUsIG9uY2UgPSBmdW5jdGlvbiAoKSB7XG5cdFx0b2ZmLmNhbGwoc2VsZiwgdHlwZSwgb25jZSk7XG5cdFx0YXBwbHkuY2FsbChsaXN0ZW5lciwgdGhpcywgYXJndW1lbnRzKTtcblx0fSk7XG5cblx0b25jZS5fX2VlT25jZUxpc3RlbmVyX18gPSBsaXN0ZW5lcjtcblx0cmV0dXJuIHRoaXM7XG59O1xuXG5vZmYgPSBmdW5jdGlvbiAodHlwZSwgbGlzdGVuZXIpIHtcblx0dmFyIGRhdGEsIGxpc3RlbmVycywgY2FuZGlkYXRlLCBpO1xuXG5cdGNhbGxhYmxlKGxpc3RlbmVyKTtcblxuXHRpZiAoIWhhc093blByb3BlcnR5LmNhbGwodGhpcywgJ19fZWVfXycpKSByZXR1cm4gdGhpcztcblx0ZGF0YSA9IHRoaXMuX19lZV9fO1xuXHRpZiAoIWRhdGFbdHlwZV0pIHJldHVybiB0aGlzO1xuXHRsaXN0ZW5lcnMgPSBkYXRhW3R5cGVdO1xuXG5cdGlmICh0eXBlb2YgbGlzdGVuZXJzID09PSAnb2JqZWN0Jykge1xuXHRcdGZvciAoaSA9IDA7IChjYW5kaWRhdGUgPSBsaXN0ZW5lcnNbaV0pOyArK2kpIHtcblx0XHRcdGlmICgoY2FuZGlkYXRlID09PSBsaXN0ZW5lcikgfHxcblx0XHRcdFx0XHQoY2FuZGlkYXRlLl9fZWVPbmNlTGlzdGVuZXJfXyA9PT0gbGlzdGVuZXIpKSB7XG5cdFx0XHRcdGlmIChsaXN0ZW5lcnMubGVuZ3RoID09PSAyKSBkYXRhW3R5cGVdID0gbGlzdGVuZXJzW2kgPyAwIDogMV07XG5cdFx0XHRcdGVsc2UgbGlzdGVuZXJzLnNwbGljZShpLCAxKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0aWYgKChsaXN0ZW5lcnMgPT09IGxpc3RlbmVyKSB8fFxuXHRcdFx0XHQobGlzdGVuZXJzLl9fZWVPbmNlTGlzdGVuZXJfXyA9PT0gbGlzdGVuZXIpKSB7XG5cdFx0XHRkZWxldGUgZGF0YVt0eXBlXTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdGhpcztcbn07XG5cbmVtaXQgPSBmdW5jdGlvbiAodHlwZSkge1xuXHR2YXIgaSwgbCwgbGlzdGVuZXIsIGxpc3RlbmVycywgYXJncztcblxuXHRpZiAoIWhhc093blByb3BlcnR5LmNhbGwodGhpcywgJ19fZWVfXycpKSByZXR1cm47XG5cdGxpc3RlbmVycyA9IHRoaXMuX19lZV9fW3R5cGVdO1xuXHRpZiAoIWxpc3RlbmVycykgcmV0dXJuO1xuXG5cdGlmICh0eXBlb2YgbGlzdGVuZXJzID09PSAnb2JqZWN0Jykge1xuXHRcdGwgPSBhcmd1bWVudHMubGVuZ3RoO1xuXHRcdGFyZ3MgPSBuZXcgQXJyYXkobCAtIDEpO1xuXHRcdGZvciAoaSA9IDE7IGkgPCBsOyArK2kpIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuXG5cdFx0bGlzdGVuZXJzID0gbGlzdGVuZXJzLnNsaWNlKCk7XG5cdFx0Zm9yIChpID0gMDsgKGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldKTsgKytpKSB7XG5cdFx0XHRhcHBseS5jYWxsKGxpc3RlbmVyLCB0aGlzLCBhcmdzKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0c3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0Y2FzZSAxOlxuXHRcdFx0Y2FsbC5jYWxsKGxpc3RlbmVycywgdGhpcyk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIDI6XG5cdFx0XHRjYWxsLmNhbGwobGlzdGVuZXJzLCB0aGlzLCBhcmd1bWVudHNbMV0pO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAzOlxuXHRcdFx0Y2FsbC5jYWxsKGxpc3RlbmVycywgdGhpcywgYXJndW1lbnRzWzFdLCBhcmd1bWVudHNbMl0pO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdGwgPSBhcmd1bWVudHMubGVuZ3RoO1xuXHRcdFx0YXJncyA9IG5ldyBBcnJheShsIC0gMSk7XG5cdFx0XHRmb3IgKGkgPSAxOyBpIDwgbDsgKytpKSB7XG5cdFx0XHRcdGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuXHRcdFx0fVxuXHRcdFx0YXBwbHkuY2FsbChsaXN0ZW5lcnMsIHRoaXMsIGFyZ3MpO1xuXHRcdH1cblx0fVxufTtcblxubWV0aG9kcyA9IHtcblx0b246IG9uLFxuXHRvbmNlOiBvbmNlLFxuXHRvZmY6IG9mZixcblx0ZW1pdDogZW1pdFxufTtcblxuZGVzY3JpcHRvcnMgPSB7XG5cdG9uOiBkKG9uKSxcblx0b25jZTogZChvbmNlKSxcblx0b2ZmOiBkKG9mZiksXG5cdGVtaXQ6IGQoZW1pdClcbn07XG5cbmJhc2UgPSBkZWZpbmVQcm9wZXJ0aWVzKHt9LCBkZXNjcmlwdG9ycyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZ1bmN0aW9uIChvKSB7XG5cdHJldHVybiAobyA9PSBudWxsKSA/IGNyZWF0ZShiYXNlKSA6IGRlZmluZVByb3BlcnRpZXMoT2JqZWN0KG8pLCBkZXNjcmlwdG9ycyk7XG59O1xuZXhwb3J0cy5tZXRob2RzID0gbWV0aG9kcztcblxuXG4vKioqLyB9KSxcbi8qIDY2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciB2YWxpZFR5cGVzID0geyBvYmplY3Q6IHRydWUsIHN5bWJvbDogdHJ1ZSB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHN5bWJvbDtcblx0aWYgKHR5cGVvZiBTeW1ib2wgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcblx0c3ltYm9sID0gU3ltYm9sKCd0ZXN0IHN5bWJvbCcpO1xuXHR0cnkgeyBTdHJpbmcoc3ltYm9sKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHQvLyBSZXR1cm4gJ3RydWUnIGFsc28gZm9yIHBvbHlmaWxsc1xuXHRpZiAoIXZhbGlkVHlwZXNbdHlwZW9mIFN5bWJvbC5pdGVyYXRvcl0pIHJldHVybiBmYWxzZTtcblx0aWYgKCF2YWxpZFR5cGVzW3R5cGVvZiBTeW1ib2wudG9QcmltaXRpdmVdKSByZXR1cm4gZmFsc2U7XG5cdGlmICghdmFsaWRUeXBlc1t0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnXSkgcmV0dXJuIGZhbHNlO1xuXG5cdHJldHVybiB0cnVlO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDY3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLy8gRVMyMDE1IFN5bWJvbCBwb2x5ZmlsbCBmb3IgZW52aXJvbm1lbnRzIHRoYXQgZG8gbm90IChvciBwYXJ0aWFsbHkpIHN1cHBvcnQgaXRcblxuXG5cbnZhciBkICAgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMylcbiAgLCB2YWxpZGF0ZVN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oNjgpXG5cbiAgLCBjcmVhdGUgPSBPYmplY3QuY3JlYXRlLCBkZWZpbmVQcm9wZXJ0aWVzID0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXNcbiAgLCBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSwgb2JqUHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZVxuICAsIE5hdGl2ZVN5bWJvbCwgU3ltYm9sUG9seWZpbGwsIEhpZGRlblN5bWJvbCwgZ2xvYmFsU3ltYm9scyA9IGNyZWF0ZShudWxsKVxuICAsIGlzTmF0aXZlU2FmZTtcblxuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicpIHtcblx0TmF0aXZlU3ltYm9sID0gU3ltYm9sO1xuXHR0cnkge1xuXHRcdFN0cmluZyhOYXRpdmVTeW1ib2woKSk7XG5cdFx0aXNOYXRpdmVTYWZlID0gdHJ1ZTtcblx0fSBjYXRjaCAoaWdub3JlKSB7fVxufVxuXG52YXIgZ2VuZXJhdGVOYW1lID0gKGZ1bmN0aW9uICgpIHtcblx0dmFyIGNyZWF0ZWQgPSBjcmVhdGUobnVsbCk7XG5cdHJldHVybiBmdW5jdGlvbiAoZGVzYykge1xuXHRcdHZhciBwb3N0Zml4ID0gMCwgbmFtZSwgaWUxMUJ1Z1dvcmthcm91bmQ7XG5cdFx0d2hpbGUgKGNyZWF0ZWRbZGVzYyArIChwb3N0Zml4IHx8ICcnKV0pICsrcG9zdGZpeDtcblx0XHRkZXNjICs9IChwb3N0Zml4IHx8ICcnKTtcblx0XHRjcmVhdGVkW2Rlc2NdID0gdHJ1ZTtcblx0XHRuYW1lID0gJ0BAJyArIGRlc2M7XG5cdFx0ZGVmaW5lUHJvcGVydHkob2JqUHJvdG90eXBlLCBuYW1lLCBkLmdzKG51bGwsIGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRcdFx0Ly8gRm9yIElFMTEgaXNzdWUgc2VlOlxuXHRcdFx0Ly8gaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2tkZXRhaWwvdmlldy8xOTI4NTA4L1xuXHRcdFx0Ly8gICAgaWUxMS1icm9rZW4tZ2V0dGVycy1vbi1kb20tb2JqZWN0c1xuXHRcdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL21lZGlrb28vZXM2LXN5bWJvbC9pc3N1ZXMvMTJcblx0XHRcdGlmIChpZTExQnVnV29ya2Fyb3VuZCkgcmV0dXJuO1xuXHRcdFx0aWUxMUJ1Z1dvcmthcm91bmQgPSB0cnVlO1xuXHRcdFx0ZGVmaW5lUHJvcGVydHkodGhpcywgbmFtZSwgZCh2YWx1ZSkpO1xuXHRcdFx0aWUxMUJ1Z1dvcmthcm91bmQgPSBmYWxzZTtcblx0XHR9KSk7XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH07XG59KCkpO1xuXG4vLyBJbnRlcm5hbCBjb25zdHJ1Y3RvciAobm90IG9uZSBleHBvc2VkKSBmb3IgY3JlYXRpbmcgU3ltYm9sIGluc3RhbmNlcy5cbi8vIFRoaXMgb25lIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgYHNvbWVTeW1ib2wgaW5zdGFuY2VvZiBTeW1ib2xgIGFsd2F5cyByZXR1cm4gZmFsc2VcbkhpZGRlblN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbChkZXNjcmlwdGlvbikge1xuXHRpZiAodGhpcyBpbnN0YW5jZW9mIEhpZGRlblN5bWJvbCkgdGhyb3cgbmV3IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XG5cdHJldHVybiBTeW1ib2xQb2x5ZmlsbChkZXNjcmlwdGlvbik7XG59O1xuXG4vLyBFeHBvc2VkIGBTeW1ib2xgIGNvbnN0cnVjdG9yXG4vLyAocmV0dXJucyBpbnN0YW5jZXMgb2YgSGlkZGVuU3ltYm9sKVxubW9kdWxlLmV4cG9ydHMgPSBTeW1ib2xQb2x5ZmlsbCA9IGZ1bmN0aW9uIFN5bWJvbChkZXNjcmlwdGlvbikge1xuXHR2YXIgc3ltYm9sO1xuXHRpZiAodGhpcyBpbnN0YW5jZW9mIFN5bWJvbCkgdGhyb3cgbmV3IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XG5cdGlmIChpc05hdGl2ZVNhZmUpIHJldHVybiBOYXRpdmVTeW1ib2woZGVzY3JpcHRpb24pO1xuXHRzeW1ib2wgPSBjcmVhdGUoSGlkZGVuU3ltYm9sLnByb3RvdHlwZSk7XG5cdGRlc2NyaXB0aW9uID0gKGRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQgPyAnJyA6IFN0cmluZyhkZXNjcmlwdGlvbikpO1xuXHRyZXR1cm4gZGVmaW5lUHJvcGVydGllcyhzeW1ib2wsIHtcblx0XHRfX2Rlc2NyaXB0aW9uX186IGQoJycsIGRlc2NyaXB0aW9uKSxcblx0XHRfX25hbWVfXzogZCgnJywgZ2VuZXJhdGVOYW1lKGRlc2NyaXB0aW9uKSlcblx0fSk7XG59O1xuZGVmaW5lUHJvcGVydGllcyhTeW1ib2xQb2x5ZmlsbCwge1xuXHRmb3I6IGQoZnVuY3Rpb24gKGtleSkge1xuXHRcdGlmIChnbG9iYWxTeW1ib2xzW2tleV0pIHJldHVybiBnbG9iYWxTeW1ib2xzW2tleV07XG5cdFx0cmV0dXJuIChnbG9iYWxTeW1ib2xzW2tleV0gPSBTeW1ib2xQb2x5ZmlsbChTdHJpbmcoa2V5KSkpO1xuXHR9KSxcblx0a2V5Rm9yOiBkKGZ1bmN0aW9uIChzKSB7XG5cdFx0dmFyIGtleTtcblx0XHR2YWxpZGF0ZVN5bWJvbChzKTtcblx0XHRmb3IgKGtleSBpbiBnbG9iYWxTeW1ib2xzKSBpZiAoZ2xvYmFsU3ltYm9sc1trZXldID09PSBzKSByZXR1cm4ga2V5O1xuXHR9KSxcblxuXHQvLyBUbyBlbnN1cmUgcHJvcGVyIGludGVyb3BlcmFiaWxpdHkgd2l0aCBvdGhlciBuYXRpdmUgZnVuY3Rpb25zIChlLmcuIEFycmF5LmZyb20pXG5cdC8vIGZhbGxiYWNrIHRvIGV2ZW50dWFsIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBvZiBnaXZlbiBzeW1ib2xcblx0aGFzSW5zdGFuY2U6IGQoJycsIChOYXRpdmVTeW1ib2wgJiYgTmF0aXZlU3ltYm9sLmhhc0luc3RhbmNlKSB8fCBTeW1ib2xQb2x5ZmlsbCgnaGFzSW5zdGFuY2UnKSksXG5cdGlzQ29uY2F0U3ByZWFkYWJsZTogZCgnJywgKE5hdGl2ZVN5bWJvbCAmJiBOYXRpdmVTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlKSB8fFxuXHRcdFN5bWJvbFBvbHlmaWxsKCdpc0NvbmNhdFNwcmVhZGFibGUnKSksXG5cdGl0ZXJhdG9yOiBkKCcnLCAoTmF0aXZlU3ltYm9sICYmIE5hdGl2ZVN5bWJvbC5pdGVyYXRvcikgfHwgU3ltYm9sUG9seWZpbGwoJ2l0ZXJhdG9yJykpLFxuXHRtYXRjaDogZCgnJywgKE5hdGl2ZVN5bWJvbCAmJiBOYXRpdmVTeW1ib2wubWF0Y2gpIHx8IFN5bWJvbFBvbHlmaWxsKCdtYXRjaCcpKSxcblx0cmVwbGFjZTogZCgnJywgKE5hdGl2ZVN5bWJvbCAmJiBOYXRpdmVTeW1ib2wucmVwbGFjZSkgfHwgU3ltYm9sUG9seWZpbGwoJ3JlcGxhY2UnKSksXG5cdHNlYXJjaDogZCgnJywgKE5hdGl2ZVN5bWJvbCAmJiBOYXRpdmVTeW1ib2wuc2VhcmNoKSB8fCBTeW1ib2xQb2x5ZmlsbCgnc2VhcmNoJykpLFxuXHRzcGVjaWVzOiBkKCcnLCAoTmF0aXZlU3ltYm9sICYmIE5hdGl2ZVN5bWJvbC5zcGVjaWVzKSB8fCBTeW1ib2xQb2x5ZmlsbCgnc3BlY2llcycpKSxcblx0c3BsaXQ6IGQoJycsIChOYXRpdmVTeW1ib2wgJiYgTmF0aXZlU3ltYm9sLnNwbGl0KSB8fCBTeW1ib2xQb2x5ZmlsbCgnc3BsaXQnKSksXG5cdHRvUHJpbWl0aXZlOiBkKCcnLCAoTmF0aXZlU3ltYm9sICYmIE5hdGl2ZVN5bWJvbC50b1ByaW1pdGl2ZSkgfHwgU3ltYm9sUG9seWZpbGwoJ3RvUHJpbWl0aXZlJykpLFxuXHR0b1N0cmluZ1RhZzogZCgnJywgKE5hdGl2ZVN5bWJvbCAmJiBOYXRpdmVTeW1ib2wudG9TdHJpbmdUYWcpIHx8IFN5bWJvbFBvbHlmaWxsKCd0b1N0cmluZ1RhZycpKSxcblx0dW5zY29wYWJsZXM6IGQoJycsIChOYXRpdmVTeW1ib2wgJiYgTmF0aXZlU3ltYm9sLnVuc2NvcGFibGVzKSB8fCBTeW1ib2xQb2x5ZmlsbCgndW5zY29wYWJsZXMnKSlcbn0pO1xuXG4vLyBJbnRlcm5hbCB0d2Vha3MgZm9yIHJlYWwgc3ltYm9sIHByb2R1Y2VyXG5kZWZpbmVQcm9wZXJ0aWVzKEhpZGRlblN5bWJvbC5wcm90b3R5cGUsIHtcblx0Y29uc3RydWN0b3I6IGQoU3ltYm9sUG9seWZpbGwpLFxuXHR0b1N0cmluZzogZCgnJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fX25hbWVfXzsgfSlcbn0pO1xuXG4vLyBQcm9wZXIgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBleHBvc2VkIG9uIFN5bWJvbC5wcm90b3R5cGVcbi8vIFRoZXkgd29uJ3QgYmUgYWNjZXNzaWJsZSBvbiBwcm9kdWNlZCBzeW1ib2wgaW5zdGFuY2VzIGFzIHRoZXkgZGVyaXZlIGZyb20gSGlkZGVuU3ltYm9sLnByb3RvdHlwZVxuZGVmaW5lUHJvcGVydGllcyhTeW1ib2xQb2x5ZmlsbC5wcm90b3R5cGUsIHtcblx0dG9TdHJpbmc6IGQoZnVuY3Rpb24gKCkgeyByZXR1cm4gJ1N5bWJvbCAoJyArIHZhbGlkYXRlU3ltYm9sKHRoaXMpLl9fZGVzY3JpcHRpb25fXyArICcpJzsgfSksXG5cdHZhbHVlT2Y6IGQoZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsaWRhdGVTeW1ib2wodGhpcyk7IH0pXG59KTtcbmRlZmluZVByb3BlcnR5KFN5bWJvbFBvbHlmaWxsLnByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwudG9QcmltaXRpdmUsIGQoJycsIGZ1bmN0aW9uICgpIHtcblx0dmFyIHN5bWJvbCA9IHZhbGlkYXRlU3ltYm9sKHRoaXMpO1xuXHRpZiAodHlwZW9mIHN5bWJvbCA9PT0gJ3N5bWJvbCcpIHJldHVybiBzeW1ib2w7XG5cdHJldHVybiBzeW1ib2wudG9TdHJpbmcoKTtcbn0pKTtcbmRlZmluZVByb3BlcnR5KFN5bWJvbFBvbHlmaWxsLnByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcsIGQoJ2MnLCAnU3ltYm9sJykpO1xuXG4vLyBQcm9wZXIgaW1wbGVtZW50YXRvbiBvZiB0b1ByaW1pdGl2ZSBhbmQgdG9TdHJpbmdUYWcgZm9yIHJldHVybmVkIHN5bWJvbCBpbnN0YW5jZXNcbmRlZmluZVByb3BlcnR5KEhpZGRlblN5bWJvbC5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnLFxuXHRkKCdjJywgU3ltYm9sUG9seWZpbGwucHJvdG90eXBlW1N5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnXSkpO1xuXG4vLyBOb3RlOiBJdCdzIGltcG9ydGFudCB0byBkZWZpbmUgYHRvUHJpbWl0aXZlYCBhcyBsYXN0IG9uZSwgYXMgc29tZSBpbXBsZW1lbnRhdGlvbnNcbi8vIGltcGxlbWVudCBgdG9QcmltaXRpdmVgIG5hdGl2ZWx5IHdpdGhvdXQgaW1wbGVtZW50aW5nIGB0b1N0cmluZ1RhZ2AgKG9yIG90aGVyIHNwZWNpZmllZCBzeW1ib2xzKVxuLy8gQW5kIHRoYXQgbWF5IGludm9rZSBlcnJvciBpbiBkZWZpbml0aW9uIGZsb3c6XG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9tZWRpa29vL2VzNi1zeW1ib2wvaXNzdWVzLzEzI2lzc3VlY29tbWVudC0xNjQxNDYxNDlcbmRlZmluZVByb3BlcnR5KEhpZGRlblN5bWJvbC5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvUHJpbWl0aXZlLFxuXHRkKCdjJywgU3ltYm9sUG9seWZpbGwucHJvdG90eXBlW1N5bWJvbFBvbHlmaWxsLnRvUHJpbWl0aXZlXSkpO1xuXG5cbi8qKiovIH0pLFxuLyogNjggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGlzU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2OSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdGlmICghaXNTeW1ib2wodmFsdWUpKSB0aHJvdyBuZXcgVHlwZUVycm9yKHZhbHVlICsgXCIgaXMgbm90IGEgc3ltYm9sXCIpO1xuXHRyZXR1cm4gdmFsdWU7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNjkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoeCkge1xuXHRpZiAoIXgpIHJldHVybiBmYWxzZTtcblx0aWYgKHR5cGVvZiB4ID09PSAnc3ltYm9sJykgcmV0dXJuIHRydWU7XG5cdGlmICgheC5jb25zdHJ1Y3RvcikgcmV0dXJuIGZhbHNlO1xuXHRpZiAoeC5jb25zdHJ1Y3Rvci5uYW1lICE9PSAnU3ltYm9sJykgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gKHhbeC5jb25zdHJ1Y3Rvci50b1N0cmluZ1RhZ10gPT09ICdTeW1ib2wnKTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA3MCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgaXNBcmd1bWVudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpXG4gICwgaXNWYWx1ZSAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpXG4gICwgaXNTdHJpbmcgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xuXG52YXIgaXRlcmF0b3JTeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpLml0ZXJhdG9yXG4gICwgaXNBcnJheSAgICAgICAgPSBBcnJheS5pc0FycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRpZiAoIWlzVmFsdWUodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmIChpc0FycmF5KHZhbHVlKSkgcmV0dXJuIHRydWU7XG5cdGlmIChpc1N0cmluZyh2YWx1ZSkpIHJldHVybiB0cnVlO1xuXHRpZiAoaXNBcmd1bWVudHModmFsdWUpKSByZXR1cm4gdHJ1ZTtcblx0cmV0dXJuIHR5cGVvZiB2YWx1ZVtpdGVyYXRvclN5bWJvbF0gPT09IFwiZnVuY3Rpb25cIjtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA3MSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgaXNBcmd1bWVudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpXG4gICwgY2FsbGFibGUgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpXG4gICwgaXNTdHJpbmcgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpXG4gICwgZ2V0ICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcyKTtcblxudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5LCBjYWxsID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwsIHNvbWUgPSBBcnJheS5wcm90b3R5cGUuc29tZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIGNiIC8qLCB0aGlzQXJnKi8pIHtcblx0dmFyIG1vZGUsIHRoaXNBcmcgPSBhcmd1bWVudHNbMl0sIHJlc3VsdCwgZG9CcmVhaywgYnJva2VuLCBpLCBsZW5ndGgsIGNoYXIsIGNvZGU7XG5cdGlmIChpc0FycmF5KGl0ZXJhYmxlKSB8fCBpc0FyZ3VtZW50cyhpdGVyYWJsZSkpIG1vZGUgPSBcImFycmF5XCI7XG5cdGVsc2UgaWYgKGlzU3RyaW5nKGl0ZXJhYmxlKSkgbW9kZSA9IFwic3RyaW5nXCI7XG5cdGVsc2UgaXRlcmFibGUgPSBnZXQoaXRlcmFibGUpO1xuXG5cdGNhbGxhYmxlKGNiKTtcblx0ZG9CcmVhayA9IGZ1bmN0aW9uICgpIHtcblx0XHRicm9rZW4gPSB0cnVlO1xuXHR9O1xuXHRpZiAobW9kZSA9PT0gXCJhcnJheVwiKSB7XG5cdFx0c29tZS5jYWxsKGl0ZXJhYmxlLCBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRcdGNhbGwuY2FsbChjYiwgdGhpc0FyZywgdmFsdWUsIGRvQnJlYWspO1xuXHRcdFx0cmV0dXJuIGJyb2tlbjtcblx0XHR9KTtcblx0XHRyZXR1cm47XG5cdH1cblx0aWYgKG1vZGUgPT09IFwic3RyaW5nXCIpIHtcblx0XHRsZW5ndGggPSBpdGVyYWJsZS5sZW5ndGg7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG5cdFx0XHRjaGFyID0gaXRlcmFibGVbaV07XG5cdFx0XHRpZiAoaSArIDEgPCBsZW5ndGgpIHtcblx0XHRcdFx0Y29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcblx0XHRcdFx0aWYgKGNvZGUgPj0gMHhkODAwICYmIGNvZGUgPD0gMHhkYmZmKSBjaGFyICs9IGl0ZXJhYmxlWysraV07XG5cdFx0XHR9XG5cdFx0XHRjYWxsLmNhbGwoY2IsIHRoaXNBcmcsIGNoYXIsIGRvQnJlYWspO1xuXHRcdFx0aWYgKGJyb2tlbikgYnJlYWs7XG5cdFx0fVxuXHRcdHJldHVybjtcblx0fVxuXHRyZXN1bHQgPSBpdGVyYWJsZS5uZXh0KCk7XG5cblx0d2hpbGUgKCFyZXN1bHQuZG9uZSkge1xuXHRcdGNhbGwuY2FsbChjYiwgdGhpc0FyZywgcmVzdWx0LnZhbHVlLCBkb0JyZWFrKTtcblx0XHRpZiAoYnJva2VuKSByZXR1cm47XG5cdFx0cmVzdWx0ID0gaXRlcmFibGUubmV4dCgpO1xuXHR9XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNzIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGlzQXJndW1lbnRzICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KVxuICAsIGlzU3RyaW5nICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KVxuICAsIEFycmF5SXRlcmF0b3IgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MylcbiAgLCBTdHJpbmdJdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oODMpXG4gICwgaXRlcmFibGUgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKVxuICAsIGl0ZXJhdG9yU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKS5pdGVyYXRvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7XG5cdGlmICh0eXBlb2YgaXRlcmFibGUob2JqKVtpdGVyYXRvclN5bWJvbF0gPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG9ialtpdGVyYXRvclN5bWJvbF0oKTtcblx0aWYgKGlzQXJndW1lbnRzKG9iaikpIHJldHVybiBuZXcgQXJyYXlJdGVyYXRvcihvYmopO1xuXHRpZiAoaXNTdHJpbmcob2JqKSkgcmV0dXJuIG5ldyBTdHJpbmdJdGVyYXRvcihvYmopO1xuXHRyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3Iob2JqKTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA3MyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgc2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG4gICwgY29udGFpbnMgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKVxuICAsIGQgICAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKVxuICAsIFN5bWJvbCAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKVxuICAsIEl0ZXJhdG9yICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSwgQXJyYXlJdGVyYXRvcjtcblxuQXJyYXlJdGVyYXRvciA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyciwga2luZCkge1xuXHRpZiAoISh0aGlzIGluc3RhbmNlb2YgQXJyYXlJdGVyYXRvcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDb25zdHJ1Y3RvciByZXF1aXJlcyAnbmV3J1wiKTtcblx0SXRlcmF0b3IuY2FsbCh0aGlzLCBhcnIpO1xuXHRpZiAoIWtpbmQpIGtpbmQgPSBcInZhbHVlXCI7XG5cdGVsc2UgaWYgKGNvbnRhaW5zLmNhbGwoa2luZCwgXCJrZXkrdmFsdWVcIikpIGtpbmQgPSBcImtleSt2YWx1ZVwiO1xuXHRlbHNlIGlmIChjb250YWlucy5jYWxsKGtpbmQsIFwia2V5XCIpKSBraW5kID0gXCJrZXlcIjtcblx0ZWxzZSBraW5kID0gXCJ2YWx1ZVwiO1xuXHRkZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIl9fa2luZF9fXCIsIGQoXCJcIiwga2luZCkpO1xufTtcbmlmIChzZXRQcm90b3R5cGVPZikgc2V0UHJvdG90eXBlT2YoQXJyYXlJdGVyYXRvciwgSXRlcmF0b3IpO1xuXG4vLyBJbnRlcm5hbCAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUgZG9lc24ndCBleHBvc2UgaXRzIGNvbnN0cnVjdG9yXG5kZWxldGUgQXJyYXlJdGVyYXRvci5wcm90b3R5cGUuY29uc3RydWN0b3I7XG5cbkFycmF5SXRlcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvci5wcm90b3R5cGUsIHtcblx0X3Jlc29sdmU6IGQoZnVuY3Rpb24gKGkpIHtcblx0XHRpZiAodGhpcy5fX2tpbmRfXyA9PT0gXCJ2YWx1ZVwiKSByZXR1cm4gdGhpcy5fX2xpc3RfX1tpXTtcblx0XHRpZiAodGhpcy5fX2tpbmRfXyA9PT0gXCJrZXkrdmFsdWVcIikgcmV0dXJuIFtpLCB0aGlzLl9fbGlzdF9fW2ldXTtcblx0XHRyZXR1cm4gaTtcblx0fSlcbn0pO1xuZGVmaW5lUHJvcGVydHkoQXJyYXlJdGVyYXRvci5wcm90b3R5cGUsIFN5bWJvbC50b1N0cmluZ1RhZywgZChcImNcIiwgXCJBcnJheSBJdGVyYXRvclwiKSk7XG5cblxuLyoqKi8gfSksXG4vKiA3NCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgY29weSAgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNzUpXG4gICwgbm9ybWFsaXplT3B0aW9ucyA9IF9fd2VicGFja19yZXF1aXJlX18oMjEpXG4gICwgZW5zdXJlQ2FsbGFibGUgICA9IF9fd2VicGFja19yZXF1aXJlX18oMSlcbiAgLCBtYXAgICAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MClcbiAgLCBjYWxsYWJsZSAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVxuICAsIHZhbGlkVmFsdWUgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApXG5cbiAgLCBiaW5kID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQsIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5XG4gICwgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG4gICwgZGVmaW5lO1xuXG5kZWZpbmUgPSBmdW5jdGlvbiAobmFtZSwgZGVzYywgb3B0aW9ucykge1xuXHR2YXIgdmFsdWUgPSB2YWxpZFZhbHVlKGRlc2MpICYmIGNhbGxhYmxlKGRlc2MudmFsdWUpLCBkZ3M7XG5cdGRncyA9IGNvcHkoZGVzYyk7XG5cdGRlbGV0ZSBkZ3Mud3JpdGFibGU7XG5cdGRlbGV0ZSBkZ3MudmFsdWU7XG5cdGRncy5nZXQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0aWYgKCFvcHRpb25zLm92ZXJ3cml0ZURlZmluaXRpb24gJiYgaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLCBuYW1lKSkgcmV0dXJuIHZhbHVlO1xuXHRcdGRlc2MudmFsdWUgPSBiaW5kLmNhbGwodmFsdWUsIG9wdGlvbnMucmVzb2x2ZUNvbnRleHQgPyBvcHRpb25zLnJlc29sdmVDb250ZXh0KHRoaXMpIDogdGhpcyk7XG5cdFx0ZGVmaW5lUHJvcGVydHkodGhpcywgbmFtZSwgZGVzYyk7XG5cdFx0cmV0dXJuIHRoaXNbbmFtZV07XG5cdH07XG5cdHJldHVybiBkZ3M7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChwcm9wcy8qLCBvcHRpb25zKi8pIHtcblx0dmFyIG9wdGlvbnMgPSBub3JtYWxpemVPcHRpb25zKGFyZ3VtZW50c1sxXSk7XG5cdGlmIChvcHRpb25zLnJlc29sdmVDb250ZXh0ICE9IG51bGwpIGVuc3VyZUNhbGxhYmxlKG9wdGlvbnMucmVzb2x2ZUNvbnRleHQpO1xuXHRyZXR1cm4gbWFwKHByb3BzLCBmdW5jdGlvbiAoZGVzYywgbmFtZSkgeyByZXR1cm4gZGVmaW5lKG5hbWUsIGRlc2MsIG9wdGlvbnMpOyB9KTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA3NSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgYUZyb20gID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NilcbiAgLCBhc3NpZ24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKVxuICAsIHZhbHVlICA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iai8qLCBwcm9wZXJ0eU5hbWVzLCBvcHRpb25zKi8pIHtcblx0dmFyIGNvcHkgPSBPYmplY3QodmFsdWUob2JqKSksIHByb3BlcnR5TmFtZXMgPSBhcmd1bWVudHNbMV0sIG9wdGlvbnMgPSBPYmplY3QoYXJndW1lbnRzWzJdKTtcblx0aWYgKGNvcHkgIT09IG9iaiAmJiAhcHJvcGVydHlOYW1lcykgcmV0dXJuIGNvcHk7XG5cdHZhciByZXN1bHQgPSB7fTtcblx0aWYgKHByb3BlcnR5TmFtZXMpIHtcblx0XHRhRnJvbShwcm9wZXJ0eU5hbWVzLCBmdW5jdGlvbiAocHJvcGVydHlOYW1lKSB7XG5cdFx0XHRpZiAob3B0aW9ucy5lbnN1cmUgfHwgcHJvcGVydHlOYW1lIGluIG9iaikgcmVzdWx0W3Byb3BlcnR5TmFtZV0gPSBvYmpbcHJvcGVydHlOYW1lXTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRhc3NpZ24ocmVzdWx0LCBvYmopO1xuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNzYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc3KSgpXG5cdD8gQXJyYXkuZnJvbVxuXHQ6IF9fd2VicGFja19yZXF1aXJlX18oNzgpO1xuXG5cbi8qKiovIH0pLFxuLyogNzcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBmcm9tID0gQXJyYXkuZnJvbSwgYXJyLCByZXN1bHQ7XG5cdGlmICh0eXBlb2YgZnJvbSAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cdGFyciA9IFtcInJhelwiLCBcImR3YVwiXTtcblx0cmVzdWx0ID0gZnJvbShhcnIpO1xuXHRyZXR1cm4gQm9vbGVhbihyZXN1bHQgJiYgKHJlc3VsdCAhPT0gYXJyKSAmJiAocmVzdWx0WzFdID09PSBcImR3YVwiKSk7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNzggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGl0ZXJhdG9yU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKS5pdGVyYXRvclxuICAsIGlzQXJndW1lbnRzICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KVxuICAsIGlzRnVuY3Rpb24gICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSlcbiAgLCB0b1Bvc0ludCAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTgpXG4gICwgY2FsbGFibGUgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpXG4gICwgdmFsaWRWYWx1ZSAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApXG4gICwgaXNWYWx1ZSAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpXG4gICwgaXNTdHJpbmcgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpXG4gICwgaXNBcnJheSAgICAgICAgPSBBcnJheS5pc0FycmF5XG4gICwgY2FsbCAgICAgICAgICAgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbFxuICAsIGRlc2MgICAgICAgICAgID0geyBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogbnVsbCB9XG4gICwgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcnJheUxpa2UgLyosIG1hcEZuLCB0aGlzQXJnKi8pIHtcblx0dmFyIG1hcEZuID0gYXJndW1lbnRzWzFdXG5cdCAgLCB0aGlzQXJnID0gYXJndW1lbnRzWzJdXG5cdCAgLCBDb250ZXh0XG5cdCAgLCBpXG5cdCAgLCBqXG5cdCAgLCBhcnJcblx0ICAsIGxlbmd0aFxuXHQgICwgY29kZVxuXHQgICwgaXRlcmF0b3Jcblx0ICAsIHJlc3VsdFxuXHQgICwgZ2V0SXRlcmF0b3Jcblx0ICAsIHZhbHVlO1xuXG5cdGFycmF5TGlrZSA9IE9iamVjdCh2YWxpZFZhbHVlKGFycmF5TGlrZSkpO1xuXG5cdGlmIChpc1ZhbHVlKG1hcEZuKSkgY2FsbGFibGUobWFwRm4pO1xuXHRpZiAoIXRoaXMgfHwgdGhpcyA9PT0gQXJyYXkgfHwgIWlzRnVuY3Rpb24odGhpcykpIHtcblx0XHQvLyBSZXN1bHQ6IFBsYWluIGFycmF5XG5cdFx0aWYgKCFtYXBGbikge1xuXHRcdFx0aWYgKGlzQXJndW1lbnRzKGFycmF5TGlrZSkpIHtcblx0XHRcdFx0Ly8gU291cmNlOiBBcmd1bWVudHNcblx0XHRcdFx0bGVuZ3RoID0gYXJyYXlMaWtlLmxlbmd0aDtcblx0XHRcdFx0aWYgKGxlbmd0aCAhPT0gMSkgcmV0dXJuIEFycmF5LmFwcGx5KG51bGwsIGFycmF5TGlrZSk7XG5cdFx0XHRcdGFyciA9IG5ldyBBcnJheSgxKTtcblx0XHRcdFx0YXJyWzBdID0gYXJyYXlMaWtlWzBdO1xuXHRcdFx0XHRyZXR1cm4gYXJyO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGlzQXJyYXkoYXJyYXlMaWtlKSkge1xuXHRcdFx0XHQvLyBTb3VyY2U6IEFycmF5XG5cdFx0XHRcdGFyciA9IG5ldyBBcnJheShsZW5ndGggPSBhcnJheUxpa2UubGVuZ3RoKTtcblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSBhcnJbaV0gPSBhcnJheUxpa2VbaV07XG5cdFx0XHRcdHJldHVybiBhcnI7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGFyciA9IFtdO1xuXHR9IGVsc2Uge1xuXHRcdC8vIFJlc3VsdDogTm9uIHBsYWluIGFycmF5XG5cdFx0Q29udGV4dCA9IHRoaXM7XG5cdH1cblxuXHRpZiAoIWlzQXJyYXkoYXJyYXlMaWtlKSkge1xuXHRcdGlmICgoZ2V0SXRlcmF0b3IgPSBhcnJheUxpa2VbaXRlcmF0b3JTeW1ib2xdKSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBTb3VyY2U6IEl0ZXJhdG9yXG5cdFx0XHRpdGVyYXRvciA9IGNhbGxhYmxlKGdldEl0ZXJhdG9yKS5jYWxsKGFycmF5TGlrZSk7XG5cdFx0XHRpZiAoQ29udGV4dCkgYXJyID0gbmV3IENvbnRleHQoKTtcblx0XHRcdHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcblx0XHRcdGkgPSAwO1xuXHRcdFx0d2hpbGUgKCFyZXN1bHQuZG9uZSkge1xuXHRcdFx0XHR2YWx1ZSA9IG1hcEZuID8gY2FsbC5jYWxsKG1hcEZuLCB0aGlzQXJnLCByZXN1bHQudmFsdWUsIGkpIDogcmVzdWx0LnZhbHVlO1xuXHRcdFx0XHRpZiAoQ29udGV4dCkge1xuXHRcdFx0XHRcdGRlc2MudmFsdWUgPSB2YWx1ZTtcblx0XHRcdFx0XHRkZWZpbmVQcm9wZXJ0eShhcnIsIGksIGRlc2MpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFycltpXSA9IHZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcblx0XHRcdFx0KytpO1xuXHRcdFx0fVxuXHRcdFx0bGVuZ3RoID0gaTtcblx0XHR9IGVsc2UgaWYgKGlzU3RyaW5nKGFycmF5TGlrZSkpIHtcblx0XHRcdC8vIFNvdXJjZTogU3RyaW5nXG5cdFx0XHRsZW5ndGggPSBhcnJheUxpa2UubGVuZ3RoO1xuXHRcdFx0aWYgKENvbnRleHQpIGFyciA9IG5ldyBDb250ZXh0KCk7XG5cdFx0XHRmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG5cdFx0XHRcdHZhbHVlID0gYXJyYXlMaWtlW2ldO1xuXHRcdFx0XHRpZiAoaSArIDEgPCBsZW5ndGgpIHtcblx0XHRcdFx0XHRjb2RlID0gdmFsdWUuY2hhckNvZGVBdCgwKTtcblx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWRlcHRoXG5cdFx0XHRcdFx0aWYgKGNvZGUgPj0gMHhkODAwICYmIGNvZGUgPD0gMHhkYmZmKSB2YWx1ZSArPSBhcnJheUxpa2VbKytpXTtcblx0XHRcdFx0fVxuXHRcdFx0XHR2YWx1ZSA9IG1hcEZuID8gY2FsbC5jYWxsKG1hcEZuLCB0aGlzQXJnLCB2YWx1ZSwgaikgOiB2YWx1ZTtcblx0XHRcdFx0aWYgKENvbnRleHQpIHtcblx0XHRcdFx0XHRkZXNjLnZhbHVlID0gdmFsdWU7XG5cdFx0XHRcdFx0ZGVmaW5lUHJvcGVydHkoYXJyLCBqLCBkZXNjKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhcnJbal0gPSB2YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHQrK2o7XG5cdFx0XHR9XG5cdFx0XHRsZW5ndGggPSBqO1xuXHRcdH1cblx0fVxuXHRpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcblx0XHQvLyBTb3VyY2U6IGFycmF5IG9yIGFycmF5LWxpa2Vcblx0XHRsZW5ndGggPSB0b1Bvc0ludChhcnJheUxpa2UubGVuZ3RoKTtcblx0XHRpZiAoQ29udGV4dCkgYXJyID0gbmV3IENvbnRleHQobGVuZ3RoKTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcblx0XHRcdHZhbHVlID0gbWFwRm4gPyBjYWxsLmNhbGwobWFwRm4sIHRoaXNBcmcsIGFycmF5TGlrZVtpXSwgaSkgOiBhcnJheUxpa2VbaV07XG5cdFx0XHRpZiAoQ29udGV4dCkge1xuXHRcdFx0XHRkZXNjLnZhbHVlID0gdmFsdWU7XG5cdFx0XHRcdGRlZmluZVByb3BlcnR5KGFyciwgaSwgZGVzYyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhcnJbaV0gPSB2YWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0aWYgKENvbnRleHQpIHtcblx0XHRkZXNjLnZhbHVlID0gbnVsbDtcblx0XHRhcnIubGVuZ3RoID0gbGVuZ3RoO1xuXHR9XG5cdHJldHVybiBhcnI7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNzkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIG9ialRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZywgaWQgPSBvYmpUb1N0cmluZy5jYWxsKF9fd2VicGFja19yZXF1aXJlX18oMTcpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiICYmIG9ialRvU3RyaW5nLmNhbGwodmFsdWUpID09PSBpZDtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA4MCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgY2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpXG4gICwgZm9yRWFjaCAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgxKVxuICAsIGNhbGwgICAgID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaiwgY2IgLyosIHRoaXNBcmcqLykge1xuXHR2YXIgcmVzdWx0ID0ge30sIHRoaXNBcmcgPSBhcmd1bWVudHNbMl07XG5cdGNhbGxhYmxlKGNiKTtcblx0Zm9yRWFjaChvYmosIGZ1bmN0aW9uICh2YWx1ZSwga2V5LCB0YXJnZXRPYmosIGluZGV4KSB7XG5cdFx0cmVzdWx0W2tleV0gPSBjYWxsLmNhbGwoY2IsIHRoaXNBcmcsIHZhbHVlLCBrZXksIHRhcmdldE9iaiwgaW5kZXgpO1xuXHR9KTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA4MSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oODIpKFwiZm9yRWFjaFwiKTtcblxuXG4vKioqLyB9KSxcbi8qIDgyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLy8gSW50ZXJuYWwgbWV0aG9kLCB1c2VkIGJ5IGl0ZXJhdGlvbiBmdW5jdGlvbnMuXG4vLyBDYWxscyBhIGZ1bmN0aW9uIGZvciBlYWNoIGtleS12YWx1ZSBwYWlyIGZvdW5kIGluIG9iamVjdFxuLy8gT3B0aW9uYWxseSB0YWtlcyBjb21wYXJlRm4gdG8gaXRlcmF0ZSBvYmplY3QgaW4gc3BlY2lmaWMgb3JkZXJcblxuXG5cbnZhciBjYWxsYWJsZSAgICAgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMSlcbiAgLCB2YWx1ZSAgICAgICAgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMClcbiAgLCBiaW5kICAgICAgICAgICAgICAgICAgICA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kXG4gICwgY2FsbCAgICAgICAgICAgICAgICAgICAgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbFxuICAsIGtleXMgICAgICAgICAgICAgICAgICAgID0gT2JqZWN0LmtleXNcbiAgLCBvYmpQcm9wZXJ0eUlzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG1ldGhvZCwgZGVmVmFsKSB7XG5cdHJldHVybiBmdW5jdGlvbiAob2JqLCBjYiAvKiwgdGhpc0FyZywgY29tcGFyZUZuKi8pIHtcblx0XHR2YXIgbGlzdCwgdGhpc0FyZyA9IGFyZ3VtZW50c1syXSwgY29tcGFyZUZuID0gYXJndW1lbnRzWzNdO1xuXHRcdG9iaiA9IE9iamVjdCh2YWx1ZShvYmopKTtcblx0XHRjYWxsYWJsZShjYik7XG5cblx0XHRsaXN0ID0ga2V5cyhvYmopO1xuXHRcdGlmIChjb21wYXJlRm4pIHtcblx0XHRcdGxpc3Quc29ydCh0eXBlb2YgY29tcGFyZUZuID09PSBcImZ1bmN0aW9uXCIgPyBiaW5kLmNhbGwoY29tcGFyZUZuLCBvYmopIDogdW5kZWZpbmVkKTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiBtZXRob2QgIT09IFwiZnVuY3Rpb25cIikgbWV0aG9kID0gbGlzdFttZXRob2RdO1xuXHRcdHJldHVybiBjYWxsLmNhbGwobWV0aG9kLCBsaXN0LCBmdW5jdGlvbiAoa2V5LCBpbmRleCkge1xuXHRcdFx0aWYgKCFvYmpQcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iaiwga2V5KSkgcmV0dXJuIGRlZlZhbDtcblx0XHRcdHJldHVybiBjYWxsLmNhbGwoY2IsIHRoaXNBcmcsIG9ialtrZXldLCBrZXksIG9iaiwgaW5kZXgpO1xuXHRcdH0pO1xuXHR9O1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDgzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLy8gVGhhbmtzIEBtYXRoaWFzYnluZW5zXG4vLyBodHRwOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LXVuaWNvZGUjaXRlcmF0aW5nLW92ZXItc3ltYm9sc1xuXG5cblxudmFyIHNldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KVxuICAsIGQgICAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKVxuICAsIFN5bWJvbCAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKVxuICAsIEl0ZXJhdG9yICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSwgU3RyaW5nSXRlcmF0b3I7XG5cblN0cmluZ0l0ZXJhdG9yID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RyKSB7XG5cdGlmICghKHRoaXMgaW5zdGFuY2VvZiBTdHJpbmdJdGVyYXRvcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDb25zdHJ1Y3RvciByZXF1aXJlcyAnbmV3J1wiKTtcblx0c3RyID0gU3RyaW5nKHN0cik7XG5cdEl0ZXJhdG9yLmNhbGwodGhpcywgc3RyKTtcblx0ZGVmaW5lUHJvcGVydHkodGhpcywgXCJfX2xlbmd0aF9fXCIsIGQoXCJcIiwgc3RyLmxlbmd0aCkpO1xufTtcbmlmIChzZXRQcm90b3R5cGVPZikgc2V0UHJvdG90eXBlT2YoU3RyaW5nSXRlcmF0b3IsIEl0ZXJhdG9yKTtcblxuLy8gSW50ZXJuYWwgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlIGRvZXNuJ3QgZXhwb3NlIGl0cyBjb25zdHJ1Y3RvclxuZGVsZXRlIFN0cmluZ0l0ZXJhdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvcjtcblxuU3RyaW5nSXRlcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvci5wcm90b3R5cGUsIHtcblx0X25leHQ6IGQoZnVuY3Rpb24gKCkge1xuXHRcdGlmICghdGhpcy5fX2xpc3RfXykgcmV0dXJuIHVuZGVmaW5lZDtcblx0XHRpZiAodGhpcy5fX25leHRJbmRleF9fIDwgdGhpcy5fX2xlbmd0aF9fKSByZXR1cm4gdGhpcy5fX25leHRJbmRleF9fKys7XG5cdFx0dGhpcy5fdW5CaW5kKCk7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fSksXG5cdF9yZXNvbHZlOiBkKGZ1bmN0aW9uIChpKSB7XG5cdFx0dmFyIGNoYXIgPSB0aGlzLl9fbGlzdF9fW2ldLCBjb2RlO1xuXHRcdGlmICh0aGlzLl9fbmV4dEluZGV4X18gPT09IHRoaXMuX19sZW5ndGhfXykgcmV0dXJuIGNoYXI7XG5cdFx0Y29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcblx0XHRpZiAoY29kZSA+PSAweGQ4MDAgJiYgY29kZSA8PSAweGRiZmYpIHJldHVybiBjaGFyICsgdGhpcy5fX2xpc3RfX1t0aGlzLl9fbmV4dEluZGV4X18rK107XG5cdFx0cmV0dXJuIGNoYXI7XG5cdH0pXG59KTtcbmRlZmluZVByb3BlcnR5KFN0cmluZ0l0ZXJhdG9yLnByb3RvdHlwZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCBkKFwiY1wiLCBcIlN0cmluZyBJdGVyYXRvclwiKSk7XG5cblxuLyoqKi8gfSksXG4vKiA4NCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgc2V0UHJvdG90eXBlT2YgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG4gICwgY29udGFpbnMgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKVxuICAsIGQgICAgICAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKVxuICAsIEl0ZXJhdG9yICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMilcbiAgLCB0b1N0cmluZ1RhZ1N5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oMikudG9TdHJpbmdUYWdcblxuICAsIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5XG4gICwgU2V0SXRlcmF0b3I7XG5cblNldEl0ZXJhdG9yID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2V0LCBraW5kKSB7XG5cdGlmICghKHRoaXMgaW5zdGFuY2VvZiBTZXRJdGVyYXRvcikpIHJldHVybiBuZXcgU2V0SXRlcmF0b3Ioc2V0LCBraW5kKTtcblx0SXRlcmF0b3IuY2FsbCh0aGlzLCBzZXQuX19zZXREYXRhX18sIHNldCk7XG5cdGlmICgha2luZCkga2luZCA9ICd2YWx1ZSc7XG5cdGVsc2UgaWYgKGNvbnRhaW5zLmNhbGwoa2luZCwgJ2tleSt2YWx1ZScpKSBraW5kID0gJ2tleSt2YWx1ZSc7XG5cdGVsc2Uga2luZCA9ICd2YWx1ZSc7XG5cdGRlZmluZVByb3BlcnR5KHRoaXMsICdfX2tpbmRfXycsIGQoJycsIGtpbmQpKTtcbn07XG5pZiAoc2V0UHJvdG90eXBlT2YpIHNldFByb3RvdHlwZU9mKFNldEl0ZXJhdG9yLCBJdGVyYXRvcik7XG5cblNldEl0ZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3IucHJvdG90eXBlLCB7XG5cdGNvbnN0cnVjdG9yOiBkKFNldEl0ZXJhdG9yKSxcblx0X3Jlc29sdmU6IGQoZnVuY3Rpb24gKGkpIHtcblx0XHRpZiAodGhpcy5fX2tpbmRfXyA9PT0gJ3ZhbHVlJykgcmV0dXJuIHRoaXMuX19saXN0X19baV07XG5cdFx0cmV0dXJuIFt0aGlzLl9fbGlzdF9fW2ldLCB0aGlzLl9fbGlzdF9fW2ldXTtcblx0fSksXG5cdHRvU3RyaW5nOiBkKGZ1bmN0aW9uICgpIHsgcmV0dXJuICdbb2JqZWN0IFNldCBJdGVyYXRvcl0nOyB9KVxufSk7XG5kZWZpbmVQcm9wZXJ0eShTZXRJdGVyYXRvci5wcm90b3R5cGUsIHRvU3RyaW5nVGFnU3ltYm9sLCBkKCdjJywgJ1NldCBJdGVyYXRvcicpKTtcblxuXG4vKioqLyB9KSxcbi8qIDg1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLy8gRXhwb3J0cyB0cnVlIGlmIGVudmlyb25tZW50IHByb3ZpZGVzIG5hdGl2ZSBgU2V0YCBpbXBsZW1lbnRhdGlvbixcbi8vIHdoYXRldmVyIHRoYXQgaXMuXG5cblxuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbiAoKSB7XG5cdGlmICh0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJykgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChTZXQucHJvdG90eXBlKSA9PT0gJ1tvYmplY3QgU2V0XScpO1xufSgpKTtcblxuXG4vKioqLyB9KSxcbi8qIDg2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbi8qXG5cdHBzZXVkbyBzZWxlY3RvcnNcblxuXHQtLS1cblxuXHR0aGV5IGFyZSBhdmFpbGFibGUgaW4gdHdvIGZvcm1zOlxuXHQqIGZpbHRlcnMgY2FsbGVkIHdoZW4gdGhlIHNlbGVjdG9yXG5cdCAgaXMgY29tcGlsZWQgYW5kIHJldHVybiBhIGZ1bmN0aW9uXG5cdCAgdGhhdCBuZWVkcyB0byByZXR1cm4gbmV4dCgpXG5cdCogcHNldWRvcyBnZXQgY2FsbGVkIG9uIGV4ZWN1dGlvblxuXHQgIHRoZXkgbmVlZCB0byByZXR1cm4gYSBib29sZWFuXG4qL1xuXG52YXIgZ2V0TkNoZWNrICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg3KSxcblx0QmFzZUZ1bmNzICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpLFxuXHRhdHRyaWJ1dGVzRmFjdG9yeSA9IF9fd2VicGFja19yZXF1aXJlX18oMjMpLFxuXHR0cnVlRnVuYyAgICAgICAgICA9IEJhc2VGdW5jcy50cnVlRnVuYyxcblx0ZmFsc2VGdW5jICAgICAgICAgPSBCYXNlRnVuY3MuZmFsc2VGdW5jO1xuXG5mdW5jdGlvbiBmaWx0ZXJzRmFjdG9yeShhZGFwdGVyKXtcblx0dmFyIGF0dHJpYnV0ZXMgID0gYXR0cmlidXRlc0ZhY3RvcnkoYWRhcHRlciksXG5cdFx0Y2hlY2tBdHRyaWIgPSBhdHRyaWJ1dGVzLnJ1bGVzLmVxdWFscztcblxuXHQvL2hlbHBlciBtZXRob2RzXG5cdGZ1bmN0aW9uIGVxdWFscyhhLCBiKXtcblx0XHRpZih0eXBlb2YgYWRhcHRlci5lcXVhbHMgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGFkYXB0ZXIuZXF1YWxzKGEsIGIpO1xuXG5cdFx0cmV0dXJuIGEgPT09IGI7XG5cdH1cblxuXHRmdW5jdGlvbiBnZXRBdHRyaWJGdW5jKG5hbWUsIHZhbHVlKXtcblx0XHR2YXIgZGF0YSA9IHtuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWV9O1xuXHRcdHJldHVybiBmdW5jdGlvbiBhdHRyaWJGdW5jKG5leHQpe1xuXHRcdFx0cmV0dXJuIGNoZWNrQXR0cmliKG5leHQsIGRhdGEpO1xuXHRcdH07XG5cdH1cblxuXHRmdW5jdGlvbiBnZXRDaGlsZEZ1bmMobmV4dCl7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0cmV0dXJuICEhYWRhcHRlci5nZXRQYXJlbnQoZWxlbSkgJiYgbmV4dChlbGVtKTtcblx0XHR9O1xuXHR9XG5cblx0dmFyIGZpbHRlcnMgPSB7XG5cdFx0Y29udGFpbnM6IGZ1bmN0aW9uKG5leHQsIHRleHQpe1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGNvbnRhaW5zKGVsZW0pe1xuXHRcdFx0XHRyZXR1cm4gbmV4dChlbGVtKSAmJiBhZGFwdGVyLmdldFRleHQoZWxlbSkuaW5kZXhPZih0ZXh0KSA+PSAwO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGljb250YWluczogZnVuY3Rpb24obmV4dCwgdGV4dCl7XG5cdFx0XHR2YXIgaXRleHQgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gaWNvbnRhaW5zKGVsZW0pe1xuXHRcdFx0XHRyZXR1cm4gbmV4dChlbGVtKSAmJlxuXHRcdFx0XHRcdGFkYXB0ZXIuZ2V0VGV4dChlbGVtKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoaXRleHQpID49IDA7XG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHQvL2xvY2F0aW9uIHNwZWNpZmljIG1ldGhvZHNcblx0XHRcIm50aC1jaGlsZFwiOiBmdW5jdGlvbihuZXh0LCBydWxlKXtcblx0XHRcdHZhciBmdW5jID0gZ2V0TkNoZWNrKHJ1bGUpO1xuXG5cdFx0XHRpZihmdW5jID09PSBmYWxzZUZ1bmMpIHJldHVybiBmdW5jO1xuXHRcdFx0aWYoZnVuYyA9PT0gdHJ1ZUZ1bmMpICByZXR1cm4gZ2V0Q2hpbGRGdW5jKG5leHQpO1xuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gbnRoQ2hpbGQoZWxlbSl7XG5cdFx0XHRcdHZhciBzaWJsaW5ncyA9IGFkYXB0ZXIuZ2V0U2libGluZ3MoZWxlbSk7XG5cblx0XHRcdFx0Zm9yKHZhciBpID0gMCwgcG9zID0gMDsgaSA8IHNpYmxpbmdzLmxlbmd0aDsgaSsrKXtcblx0XHRcdFx0XHRpZihhZGFwdGVyLmlzVGFnKHNpYmxpbmdzW2ldKSl7XG5cdFx0XHRcdFx0XHRpZihzaWJsaW5nc1tpXSA9PT0gZWxlbSkgYnJlYWs7XG5cdFx0XHRcdFx0XHRlbHNlIHBvcysrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBmdW5jKHBvcykgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRcIm50aC1sYXN0LWNoaWxkXCI6IGZ1bmN0aW9uKG5leHQsIHJ1bGUpe1xuXHRcdFx0dmFyIGZ1bmMgPSBnZXROQ2hlY2socnVsZSk7XG5cblx0XHRcdGlmKGZ1bmMgPT09IGZhbHNlRnVuYykgcmV0dXJuIGZ1bmM7XG5cdFx0XHRpZihmdW5jID09PSB0cnVlRnVuYykgIHJldHVybiBnZXRDaGlsZEZ1bmMobmV4dCk7XG5cblx0XHRcdHJldHVybiBmdW5jdGlvbiBudGhMYXN0Q2hpbGQoZWxlbSl7XG5cdFx0XHRcdHZhciBzaWJsaW5ncyA9IGFkYXB0ZXIuZ2V0U2libGluZ3MoZWxlbSk7XG5cblx0XHRcdFx0Zm9yKHZhciBwb3MgPSAwLCBpID0gc2libGluZ3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pe1xuXHRcdFx0XHRcdGlmKGFkYXB0ZXIuaXNUYWcoc2libGluZ3NbaV0pKXtcblx0XHRcdFx0XHRcdGlmKHNpYmxpbmdzW2ldID09PSBlbGVtKSBicmVhaztcblx0XHRcdFx0XHRcdGVsc2UgcG9zKys7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGZ1bmMocG9zKSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdFwibnRoLW9mLXR5cGVcIjogZnVuY3Rpb24obmV4dCwgcnVsZSl7XG5cdFx0XHR2YXIgZnVuYyA9IGdldE5DaGVjayhydWxlKTtcblxuXHRcdFx0aWYoZnVuYyA9PT0gZmFsc2VGdW5jKSByZXR1cm4gZnVuYztcblx0XHRcdGlmKGZ1bmMgPT09IHRydWVGdW5jKSAgcmV0dXJuIGdldENoaWxkRnVuYyhuZXh0KTtcblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIG50aE9mVHlwZShlbGVtKXtcblx0XHRcdFx0dmFyIHNpYmxpbmdzID0gYWRhcHRlci5nZXRTaWJsaW5ncyhlbGVtKTtcblxuXHRcdFx0XHRmb3IodmFyIHBvcyA9IDAsIGkgPSAwOyBpIDwgc2libGluZ3MubGVuZ3RoOyBpKyspe1xuXHRcdFx0XHRcdGlmKGFkYXB0ZXIuaXNUYWcoc2libGluZ3NbaV0pKXtcblx0XHRcdFx0XHRcdGlmKHNpYmxpbmdzW2ldID09PSBlbGVtKSBicmVhaztcblx0XHRcdFx0XHRcdGlmKGFkYXB0ZXIuZ2V0TmFtZShzaWJsaW5nc1tpXSkgPT09IGFkYXB0ZXIuZ2V0TmFtZShlbGVtKSkgcG9zKys7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGZ1bmMocG9zKSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdFwibnRoLWxhc3Qtb2YtdHlwZVwiOiBmdW5jdGlvbihuZXh0LCBydWxlKXtcblx0XHRcdHZhciBmdW5jID0gZ2V0TkNoZWNrKHJ1bGUpO1xuXG5cdFx0XHRpZihmdW5jID09PSBmYWxzZUZ1bmMpIHJldHVybiBmdW5jO1xuXHRcdFx0aWYoZnVuYyA9PT0gdHJ1ZUZ1bmMpICByZXR1cm4gZ2V0Q2hpbGRGdW5jKG5leHQpO1xuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gbnRoTGFzdE9mVHlwZShlbGVtKXtcblx0XHRcdFx0dmFyIHNpYmxpbmdzID0gYWRhcHRlci5nZXRTaWJsaW5ncyhlbGVtKTtcblxuXHRcdFx0XHRmb3IodmFyIHBvcyA9IDAsIGkgPSBzaWJsaW5ncy5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7XG5cdFx0XHRcdFx0aWYoYWRhcHRlci5pc1RhZyhzaWJsaW5nc1tpXSkpe1xuXHRcdFx0XHRcdFx0aWYoc2libGluZ3NbaV0gPT09IGVsZW0pIGJyZWFrO1xuXHRcdFx0XHRcdFx0aWYoYWRhcHRlci5nZXROYW1lKHNpYmxpbmdzW2ldKSA9PT0gYWRhcHRlci5nZXROYW1lKGVsZW0pKSBwb3MrKztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZnVuYyhwb3MpICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHQvL1RPRE8gZGV0ZXJtaW5lIHRoZSBhY3R1YWwgcm9vdCBlbGVtZW50XG5cdFx0cm9vdDogZnVuY3Rpb24obmV4dCl7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRcdHJldHVybiAhYWRhcHRlci5nZXRQYXJlbnQoZWxlbSkgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdHNjb3BlOiBmdW5jdGlvbihuZXh0LCBydWxlLCBvcHRpb25zLCBjb250ZXh0KXtcblx0XHRcdGlmKCFjb250ZXh0IHx8IGNvbnRleHQubGVuZ3RoID09PSAwKXtcblx0XHRcdFx0Ly9lcXVpdmFsZW50IHRvIDpyb290XG5cdFx0XHRcdHJldHVybiBmaWx0ZXJzLnJvb3QobmV4dCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmKGNvbnRleHQubGVuZ3RoID09PSAxKXtcblx0XHRcdFx0Ly9OT1RFOiBjYW4ndCBiZSB1bnBhY2tlZCwgYXMgOmhhcyB1c2VzIHRoaXMgZm9yIHNpZGUtZWZmZWN0c1xuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRcdFx0cmV0dXJuIGVxdWFscyhjb250ZXh0WzBdLCBlbGVtKSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0LmluZGV4T2YoZWxlbSkgPj0gMCAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0Ly9qUXVlcnkgZXh0ZW5zaW9ucyAob3RoZXJzIGZvbGxvdyBhcyBwc2V1ZG9zKVxuXHRcdGNoZWNrYm94OiBnZXRBdHRyaWJGdW5jKFwidHlwZVwiLCBcImNoZWNrYm94XCIpLFxuXHRcdGZpbGU6IGdldEF0dHJpYkZ1bmMoXCJ0eXBlXCIsIFwiZmlsZVwiKSxcblx0XHRwYXNzd29yZDogZ2V0QXR0cmliRnVuYyhcInR5cGVcIiwgXCJwYXNzd29yZFwiKSxcblx0XHRyYWRpbzogZ2V0QXR0cmliRnVuYyhcInR5cGVcIiwgXCJyYWRpb1wiKSxcblx0XHRyZXNldDogZ2V0QXR0cmliRnVuYyhcInR5cGVcIiwgXCJyZXNldFwiKSxcblx0XHRpbWFnZTogZ2V0QXR0cmliRnVuYyhcInR5cGVcIiwgXCJpbWFnZVwiKSxcblx0XHRzdWJtaXQ6IGdldEF0dHJpYkZ1bmMoXCJ0eXBlXCIsIFwic3VibWl0XCIpXG5cdH07XG5cdHJldHVybiBmaWx0ZXJzO1xufVxuXG5mdW5jdGlvbiBwc2V1ZG9zRmFjdG9yeShhZGFwdGVyKXtcblx0Ly9oZWxwZXIgbWV0aG9kc1xuXHRmdW5jdGlvbiBnZXRGaXJzdEVsZW1lbnQoZWxlbXMpe1xuXHRcdGZvcih2YXIgaSA9IDA7IGVsZW1zICYmIGkgPCBlbGVtcy5sZW5ndGg7IGkrKyl7XG5cdFx0XHRpZihhZGFwdGVyLmlzVGFnKGVsZW1zW2ldKSkgcmV0dXJuIGVsZW1zW2ldO1xuXHRcdH1cblx0fVxuXG5cdC8vd2hpbGUgZmlsdGVycyBhcmUgcHJlY29tcGlsZWQsIHBzZXVkb3MgZ2V0IGNhbGxlZCB3aGVuIHRoZXkgYXJlIG5lZWRlZFxuXHR2YXIgcHNldWRvcyA9IHtcblx0XHRlbXB0eTogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRyZXR1cm4gIWFkYXB0ZXIuZ2V0Q2hpbGRyZW4oZWxlbSkuc29tZShmdW5jdGlvbihlbGVtKXtcblx0XHRcdFx0cmV0dXJuIGFkYXB0ZXIuaXNUYWcoZWxlbSkgfHwgZWxlbS50eXBlID09PSBcInRleHRcIjtcblx0XHRcdH0pO1xuXHRcdH0sXG5cblx0XHRcImZpcnN0LWNoaWxkXCI6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0cmV0dXJuIGdldEZpcnN0RWxlbWVudChhZGFwdGVyLmdldFNpYmxpbmdzKGVsZW0pKSA9PT0gZWxlbTtcblx0XHR9LFxuXHRcdFwibGFzdC1jaGlsZFwiOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHZhciBzaWJsaW5ncyA9IGFkYXB0ZXIuZ2V0U2libGluZ3MoZWxlbSk7XG5cblx0XHRcdGZvcih2YXIgaSA9IHNpYmxpbmdzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXtcblx0XHRcdFx0aWYoc2libGluZ3NbaV0gPT09IGVsZW0pIHJldHVybiB0cnVlO1xuXHRcdFx0XHRpZihhZGFwdGVyLmlzVGFnKHNpYmxpbmdzW2ldKSkgYnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdFwiZmlyc3Qtb2YtdHlwZVwiOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHZhciBzaWJsaW5ncyA9IGFkYXB0ZXIuZ2V0U2libGluZ3MoZWxlbSk7XG5cblx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzaWJsaW5ncy5sZW5ndGg7IGkrKyl7XG5cdFx0XHRcdGlmKGFkYXB0ZXIuaXNUYWcoc2libGluZ3NbaV0pKXtcblx0XHRcdFx0XHRpZihzaWJsaW5nc1tpXSA9PT0gZWxlbSkgcmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0aWYoYWRhcHRlci5nZXROYW1lKHNpYmxpbmdzW2ldKSA9PT0gYWRhcHRlci5nZXROYW1lKGVsZW0pKSBicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblx0XHRcImxhc3Qtb2YtdHlwZVwiOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHZhciBzaWJsaW5ncyA9IGFkYXB0ZXIuZ2V0U2libGluZ3MoZWxlbSk7XG5cblx0XHRcdGZvcih2YXIgaSA9IHNpYmxpbmdzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXtcblx0XHRcdFx0aWYoYWRhcHRlci5pc1RhZyhzaWJsaW5nc1tpXSkpe1xuXHRcdFx0XHRcdGlmKHNpYmxpbmdzW2ldID09PSBlbGVtKSByZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRpZihhZGFwdGVyLmdldE5hbWUoc2libGluZ3NbaV0pID09PSBhZGFwdGVyLmdldE5hbWUoZWxlbSkpIGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdFwib25seS1vZi10eXBlXCI6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0dmFyIHNpYmxpbmdzID0gYWRhcHRlci5nZXRTaWJsaW5ncyhlbGVtKTtcblxuXHRcdFx0Zm9yKHZhciBpID0gMCwgaiA9IHNpYmxpbmdzLmxlbmd0aDsgaSA8IGo7IGkrKyl7XG5cdFx0XHRcdGlmKGFkYXB0ZXIuaXNUYWcoc2libGluZ3NbaV0pKXtcblx0XHRcdFx0XHRpZihzaWJsaW5nc1tpXSA9PT0gZWxlbSkgY29udGludWU7XG5cdFx0XHRcdFx0aWYoYWRhcHRlci5nZXROYW1lKHNpYmxpbmdzW2ldKSA9PT0gYWRhcHRlci5nZXROYW1lKGVsZW0pKSByZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblx0XHRcIm9ubHktY2hpbGRcIjogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHR2YXIgc2libGluZ3MgPSBhZGFwdGVyLmdldFNpYmxpbmdzKGVsZW0pO1xuXG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgc2libGluZ3MubGVuZ3RoOyBpKyspe1xuXHRcdFx0XHRpZihhZGFwdGVyLmlzVGFnKHNpYmxpbmdzW2ldKSAmJiBzaWJsaW5nc1tpXSAhPT0gZWxlbSkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0Ly86bWF0Y2hlcyhhLCBhcmVhLCBsaW5rKVtocmVmXVxuXHRcdGxpbms6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0cmV0dXJuIGFkYXB0ZXIuaGFzQXR0cmliKGVsZW0sIFwiaHJlZlwiKTtcblx0XHR9LFxuXHRcdHZpc2l0ZWQ6IGZhbHNlRnVuYywgLy9zZWVtcyB0byBiZSBhIHZhbGlkIGltcGxlbWVudGF0aW9uXG5cdFx0Ly9UT0RPOiA6YW55LWxpbmsgb25jZSB0aGUgbmFtZSBpcyBmaW5hbGl6ZWQgKGFzIGFuIGFsaWFzIG9mIDpsaW5rKVxuXG5cdFx0Ly9mb3Jtc1xuXHRcdC8vdG8gY29uc2lkZXI6IDp0YXJnZXRcblxuXHRcdC8vOm1hdGNoZXMoW3NlbGVjdGVkXSwgc2VsZWN0Om5vdChbbXVsdGlwbGVdKTpub3QoPiBvcHRpb25bc2VsZWN0ZWRdKSA+IG9wdGlvbjpmaXJzdC1vZi10eXBlKVxuXHRcdHNlbGVjdGVkOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdGlmKGFkYXB0ZXIuaGFzQXR0cmliKGVsZW0sIFwic2VsZWN0ZWRcIikpIHJldHVybiB0cnVlO1xuXHRcdFx0ZWxzZSBpZihhZGFwdGVyLmdldE5hbWUoZWxlbSkgIT09IFwib3B0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuXHRcdFx0Ly90aGUgZmlyc3QgPG9wdGlvbj4gaW4gYSA8c2VsZWN0PiBpcyBhbHNvIHNlbGVjdGVkXG5cdFx0XHR2YXIgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoZWxlbSk7XG5cblx0XHRcdGlmKFxuXHRcdFx0XHQhcGFyZW50IHx8XG5cdFx0XHRcdGFkYXB0ZXIuZ2V0TmFtZShwYXJlbnQpICE9PSBcInNlbGVjdFwiIHx8XG5cdFx0XHRcdGFkYXB0ZXIuaGFzQXR0cmliKHBhcmVudCwgXCJtdWx0aXBsZVwiKVxuXHRcdFx0KSByZXR1cm4gZmFsc2U7XG5cblx0XHRcdHZhciBzaWJsaW5ncyA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KSxcblx0XHRcdFx0c2F3RWxlbSAgPSBmYWxzZTtcblxuXHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IHNpYmxpbmdzLmxlbmd0aDsgaSsrKXtcblx0XHRcdFx0aWYoYWRhcHRlci5pc1RhZyhzaWJsaW5nc1tpXSkpe1xuXHRcdFx0XHRcdGlmKHNpYmxpbmdzW2ldID09PSBlbGVtKXtcblx0XHRcdFx0XHRcdHNhd0VsZW0gPSB0cnVlO1xuXHRcdFx0XHRcdH0gZWxzZSBpZighc2F3RWxlbSl7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fSBlbHNlIGlmKGFkYXB0ZXIuaGFzQXR0cmliKHNpYmxpbmdzW2ldLCBcInNlbGVjdGVkXCIpKXtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNhd0VsZW07XG5cdFx0fSxcblx0XHQvL2h0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NjcmlwdGluZy5odG1sI2Rpc2FibGVkLWVsZW1lbnRzXG5cdFx0Ly86bWF0Y2hlcyhcblx0XHQvLyAgOm1hdGNoZXMoYnV0dG9uLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgbWVudWl0ZW0sIG9wdGdyb3VwLCBvcHRpb24pW2Rpc2FibGVkXSxcblx0XHQvLyAgb3B0Z3JvdXBbZGlzYWJsZWRdID4gb3B0aW9uKSxcblx0XHQvLyBmaWVsZHNldFtkaXNhYmxlZF0gKiAvL1RPRE8gbm90IGNoaWxkIG9mIGZpcnN0IDxsZWdlbmQ+XG5cdFx0Ly8pXG5cdFx0ZGlzYWJsZWQ6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0cmV0dXJuIGFkYXB0ZXIuaGFzQXR0cmliKGVsZW0sIFwiZGlzYWJsZWRcIik7XG5cdFx0fSxcblx0XHRlbmFibGVkOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHJldHVybiAhYWRhcHRlci5oYXNBdHRyaWIoZWxlbSwgXCJkaXNhYmxlZFwiKTtcblx0XHR9LFxuXHRcdC8vOm1hdGNoZXMoOm1hdGNoZXMoOnJhZGlvLCA6Y2hlY2tib3gpW2NoZWNrZWRdLCA6c2VsZWN0ZWQpIChUT0RPIG1lbnVpdGVtKVxuXHRcdGNoZWNrZWQ6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0cmV0dXJuIGFkYXB0ZXIuaGFzQXR0cmliKGVsZW0sIFwiY2hlY2tlZFwiKSB8fCBwc2V1ZG9zLnNlbGVjdGVkKGVsZW0pO1xuXHRcdH0sXG5cdFx0Ly86bWF0Y2hlcyhpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSlbcmVxdWlyZWRdXG5cdFx0cmVxdWlyZWQ6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0cmV0dXJuIGFkYXB0ZXIuaGFzQXR0cmliKGVsZW0sIFwicmVxdWlyZWRcIik7XG5cdFx0fSxcblx0XHQvLzptYXRjaGVzKGlucHV0LCBzZWxlY3QsIHRleHRhcmVhKTpub3QoW3JlcXVpcmVkXSlcblx0XHRvcHRpb25hbDogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRyZXR1cm4gIWFkYXB0ZXIuaGFzQXR0cmliKGVsZW0sIFwicmVxdWlyZWRcIik7XG5cdFx0fSxcblxuXHRcdC8valF1ZXJ5IGV4dGVuc2lvbnNcblxuXHRcdC8vOm5vdCg6ZW1wdHkpXG5cdFx0cGFyZW50OiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHJldHVybiAhcHNldWRvcy5lbXB0eShlbGVtKTtcblx0XHR9LFxuXHRcdC8vOm1hdGNoZXMoaDEsIGgyLCBoMywgaDQsIGg1LCBoNilcblx0XHRoZWFkZXI6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0dmFyIG5hbWUgPSBhZGFwdGVyLmdldE5hbWUoZWxlbSk7XG5cdFx0XHRyZXR1cm4gbmFtZSA9PT0gXCJoMVwiIHx8XG5cdFx0XHRcdFx0bmFtZSA9PT0gXCJoMlwiIHx8XG5cdFx0XHRcdFx0bmFtZSA9PT0gXCJoM1wiIHx8XG5cdFx0XHRcdFx0bmFtZSA9PT0gXCJoNFwiIHx8XG5cdFx0XHRcdFx0bmFtZSA9PT0gXCJoNVwiIHx8XG5cdFx0XHRcdFx0bmFtZSA9PT0gXCJoNlwiO1xuXHRcdH0sXG5cblx0XHQvLzptYXRjaGVzKGJ1dHRvbiwgaW5wdXRbdHlwZT1idXR0b25dKVxuXHRcdGJ1dHRvbjogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHR2YXIgbmFtZSA9IGFkYXB0ZXIuZ2V0TmFtZShlbGVtKTtcblx0XHRcdHJldHVybiBuYW1lID09PSBcImJ1dHRvblwiIHx8XG5cdFx0XHRcdFx0bmFtZSA9PT0gXCJpbnB1dFwiICYmXG5cdFx0XHRcdFx0YWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBcInR5cGVcIikgPT09IFwiYnV0dG9uXCI7XG5cdFx0fSxcblx0XHQvLzptYXRjaGVzKGlucHV0LCB0ZXh0YXJlYSwgc2VsZWN0LCBidXR0b24pXG5cdFx0aW5wdXQ6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0dmFyIG5hbWUgPSBhZGFwdGVyLmdldE5hbWUoZWxlbSk7XG5cdFx0XHRyZXR1cm4gbmFtZSA9PT0gXCJpbnB1dFwiIHx8XG5cdFx0XHRcdFx0bmFtZSA9PT0gXCJ0ZXh0YXJlYVwiIHx8XG5cdFx0XHRcdFx0bmFtZSA9PT0gXCJzZWxlY3RcIiB8fFxuXHRcdFx0XHRcdG5hbWUgPT09IFwiYnV0dG9uXCI7XG5cdFx0fSxcblx0XHQvL2lucHV0Om1hdGNoZXMoOm5vdChbdHlwZSE9JyddKSwgW3R5cGU9J3RleHQnIGldKVxuXHRcdHRleHQ6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0dmFyIGF0dHI7XG5cdFx0XHRyZXR1cm4gYWRhcHRlci5nZXROYW1lKGVsZW0pID09PSBcImlucHV0XCIgJiYgKFxuXHRcdFx0XHQhKGF0dHIgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIFwidHlwZVwiKSkgfHxcblx0XHRcdFx0YXR0ci50b0xvd2VyQ2FzZSgpID09PSBcInRleHRcIlxuXHRcdFx0KTtcblx0XHR9XG5cdH07XG5cblx0cmV0dXJuIHBzZXVkb3M7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeUFyZ3MoZnVuYywgbmFtZSwgc3Vic2VsZWN0KXtcblx0aWYoc3Vic2VsZWN0ID09PSBudWxsKXtcblx0XHRpZihmdW5jLmxlbmd0aCA+IDEgJiYgbmFtZSAhPT0gXCJzY29wZVwiKXtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInBzZXVkby1zZWxlY3RvciA6XCIgKyBuYW1lICsgXCIgcmVxdWlyZXMgYW4gYXJndW1lbnRcIik7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGlmKGZ1bmMubGVuZ3RoID09PSAxKXtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInBzZXVkby1zZWxlY3RvciA6XCIgKyBuYW1lICsgXCIgZG9lc24ndCBoYXZlIGFueSBhcmd1bWVudHNcIik7XG5cdFx0fVxuXHR9XG59XG5cbi8vRklYTUUgdGhpcyBmZWVscyBoYWNreVxudmFyIHJlX0NTUzMgPSAvXig/Oig/Om50aHxsYXN0fGZpcnN0fG9ubHkpLSg/OmNoaWxkfG9mLXR5cGUpfHJvb3R8ZW1wdHl8KD86ZW58ZGlzKWFibGVkfGNoZWNrZWR8bm90KSQvO1xuXG5mdW5jdGlvbiBmYWN0b3J5KGFkYXB0ZXIpe1xuXHR2YXIgcHNldWRvcyA9IHBzZXVkb3NGYWN0b3J5KGFkYXB0ZXIpO1xuXHR2YXIgZmlsdGVycyA9IGZpbHRlcnNGYWN0b3J5KGFkYXB0ZXIpO1xuXG5cdHJldHVybiB7XG5cdFx0Y29tcGlsZTogZnVuY3Rpb24obmV4dCwgZGF0YSwgb3B0aW9ucywgY29udGV4dCl7XG5cdFx0XHR2YXIgbmFtZSA9IGRhdGEubmFtZSxcblx0XHRcdFx0c3Vic2VsZWN0ID0gZGF0YS5kYXRhO1xuXG5cdFx0XHRpZihvcHRpb25zICYmIG9wdGlvbnMuc3RyaWN0ICYmICFyZV9DU1MzLnRlc3QobmFtZSkpe1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCI6XCIgKyBuYW1lICsgXCIgaXNuJ3QgcGFydCBvZiBDU1MzXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZih0eXBlb2YgZmlsdGVyc1tuYW1lXSA9PT0gXCJmdW5jdGlvblwiKXtcblx0XHRcdFx0dmVyaWZ5QXJncyhmaWx0ZXJzW25hbWVdLCBuYW1lLCAgc3Vic2VsZWN0KTtcblx0XHRcdFx0cmV0dXJuIGZpbHRlcnNbbmFtZV0obmV4dCwgc3Vic2VsZWN0LCBvcHRpb25zLCBjb250ZXh0KTtcblx0XHRcdH0gZWxzZSBpZih0eXBlb2YgcHNldWRvc1tuYW1lXSA9PT0gXCJmdW5jdGlvblwiKXtcblx0XHRcdFx0dmFyIGZ1bmMgPSBwc2V1ZG9zW25hbWVdO1xuXHRcdFx0XHR2ZXJpZnlBcmdzKGZ1bmMsIG5hbWUsIHN1YnNlbGVjdCk7XG5cblx0XHRcdFx0aWYobmV4dCA9PT0gdHJ1ZUZ1bmMpIHJldHVybiBmdW5jO1xuXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiBwc2V1ZG9BcmdzKGVsZW0pe1xuXHRcdFx0XHRcdHJldHVybiBmdW5jKGVsZW0sIHN1YnNlbGVjdCkgJiYgbmV4dChlbGVtKTtcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInVubWF0Y2hlZCBwc2V1ZG8tY2xhc3MgOlwiICsgbmFtZSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRmaWx0ZXJzOiBmaWx0ZXJzLFxuXHRcdHBzZXVkb3M6IHBzZXVkb3Ncblx0fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5O1xuXG5cbi8qKiovIH0pLFxuLyogODcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIHBhcnNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4OCksXG4gICAgY29tcGlsZSA9IF9fd2VicGFja19yZXF1aXJlX18oODkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG50aENoZWNrKGZvcm11bGEpe1xuXHRyZXR1cm4gY29tcGlsZShwYXJzZShmb3JtdWxhKSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xubW9kdWxlLmV4cG9ydHMuY29tcGlsZSA9IGNvbXBpbGU7XG5cbi8qKiovIH0pLFxuLyogODggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZTtcblxuLy9mb2xsb3dpbmcgaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zZWxlY3RvcnMvI250aC1jaGlsZC1wc2V1ZG9cblxuLy9bIFsnLSd8JysnXT8gSU5URUdFUj8ge059IFsgUyogWyctJ3wnKyddIFMqIElOVEVHRVIgXT9cbnZhciByZV9udGhFbGVtZW50ID0gL14oWytcXC1dP1xcZCpuKT9cXHMqKD86KFsrXFwtXT8pXFxzKihcXGQrKSk/JC87XG5cbi8qXG5cdHBhcnNlcyBhIG50aC1jaGVjayBmb3JtdWxhLCByZXR1cm5zIGFuIGFycmF5IG9mIHR3byBudW1iZXJzXG4qL1xuZnVuY3Rpb24gcGFyc2UoZm9ybXVsYSl7XG5cdGZvcm11bGEgPSBmb3JtdWxhLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG5cdGlmKGZvcm11bGEgPT09IFwiZXZlblwiKXtcblx0XHRyZXR1cm4gWzIsIDBdO1xuXHR9IGVsc2UgaWYoZm9ybXVsYSA9PT0gXCJvZGRcIil7XG5cdFx0cmV0dXJuIFsyLCAxXTtcblx0fSBlbHNlIHtcblx0XHR2YXIgcGFyc2VkID0gZm9ybXVsYS5tYXRjaChyZV9udGhFbGVtZW50KTtcblxuXHRcdGlmKCFwYXJzZWQpe1xuXHRcdFx0dGhyb3cgbmV3IFN5bnRheEVycm9yKFwibi10aCBydWxlIGNvdWxkbid0IGJlIHBhcnNlZCAoJ1wiICsgZm9ybXVsYSArIFwiJylcIik7XG5cdFx0fVxuXG5cdFx0dmFyIGE7XG5cblx0XHRpZihwYXJzZWRbMV0pe1xuXHRcdFx0YSA9IHBhcnNlSW50KHBhcnNlZFsxXSwgMTApO1xuXHRcdFx0aWYoaXNOYU4oYSkpe1xuXHRcdFx0XHRpZihwYXJzZWRbMV0uY2hhckF0KDApID09PSBcIi1cIikgYSA9IC0xO1xuXHRcdFx0XHRlbHNlIGEgPSAxO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBhID0gMDtcblxuXHRcdHJldHVybiBbXG5cdFx0XHRhLFxuXHRcdFx0cGFyc2VkWzNdID8gcGFyc2VJbnQoKHBhcnNlZFsyXSB8fCBcIlwiKSArIHBhcnNlZFszXSwgMTApIDogMFxuXHRcdF07XG5cdH1cbn1cblxuXG4vKioqLyB9KSxcbi8qIDg5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGlsZTtcblxudmFyIEJhc2VGdW5jcyA9IF9fd2VicGFja19yZXF1aXJlX18oNSksXG4gICAgdHJ1ZUZ1bmMgID0gQmFzZUZ1bmNzLnRydWVGdW5jLFxuICAgIGZhbHNlRnVuYyA9IEJhc2VGdW5jcy5mYWxzZUZ1bmM7XG5cbi8qXG5cdHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiBhbiBlbGVtZW50cyBpbmRleCBtYXRjaGVzIHRoZSBnaXZlbiBydWxlXG5cdGhpZ2hseSBvcHRpbWl6ZWQgdG8gcmV0dXJuIHRoZSBmYXN0ZXN0IHNvbHV0aW9uXG4qL1xuZnVuY3Rpb24gY29tcGlsZShwYXJzZWQpe1xuXHR2YXIgYSA9IHBhcnNlZFswXSxcblx0ICAgIGIgPSBwYXJzZWRbMV0gLSAxO1xuXG5cdC8vd2hlbiBiIDw9IDAsIGEqbiB3b24ndCBiZSBwb3NzaWJsZSBmb3IgYW55IG1hdGNoZXMgd2hlbiBhIDwgMFxuXHQvL2Jlc2lkZXMsIHRoZSBzcGVjaWZpY2F0aW9uIHNheXMgdGhhdCBubyBlbGVtZW50IGlzIG1hdGNoZWQgd2hlbiBhIGFuZCBiIGFyZSAwXG5cdGlmKGIgPCAwICYmIGEgPD0gMCkgcmV0dXJuIGZhbHNlRnVuYztcblxuXHQvL3doZW4gYSBpcyBpbiB0aGUgcmFuZ2UgLTEuLjEsIGl0IG1hdGNoZXMgYW55IGVsZW1lbnQgKHNvIG9ubHkgYiBpcyBjaGVja2VkKVxuXHRpZihhID09PS0xKSByZXR1cm4gZnVuY3Rpb24ocG9zKXsgcmV0dXJuIHBvcyA8PSBiOyB9O1xuXHRpZihhID09PSAwKSByZXR1cm4gZnVuY3Rpb24ocG9zKXsgcmV0dXJuIHBvcyA9PT0gYjsgfTtcblx0Ly93aGVuIGIgPD0gMCBhbmQgYSA9PT0gMSwgdGhleSBtYXRjaCBhbnkgZWxlbWVudFxuXHRpZihhID09PSAxKSByZXR1cm4gYiA8IDAgPyB0cnVlRnVuYyA6IGZ1bmN0aW9uKHBvcyl7IHJldHVybiBwb3MgPj0gYjsgfTtcblxuXHQvL3doZW4gYSA+IDAsIG1vZHVsbyBjYW4gYmUgdXNlZCB0byBjaGVjayBpZiB0aGVyZSBpcyBhIG1hdGNoXG5cdHZhciBiTW9kID0gYiAlIGE7XG5cdGlmKGJNb2QgPCAwKSBiTW9kICs9IGE7XG5cblx0aWYoYSA+IDEpe1xuXHRcdHJldHVybiBmdW5jdGlvbihwb3Mpe1xuXHRcdFx0cmV0dXJuIHBvcyA+PSBiICYmIHBvcyAlIGEgPT09IGJNb2Q7XG5cdFx0fTtcblx0fVxuXG5cdGEgKj0gLTE7IC8vbWFrZSBgYWAgcG9zaXRpdmVcblxuXHRyZXR1cm4gZnVuY3Rpb24ocG9zKXtcblx0XHRyZXR1cm4gcG9zIDw9IGIgJiYgcG9zICUgYSA9PT0gYk1vZDtcblx0fTtcbn1cblxuLyoqKi8gfSlcbi8qKioqKiovIF0pO1xufSk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY3NzLXNlbGVjdC11bWQvZGlzdC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvY3NzLXNlbGVjdC11bWQvZGlzdC9pbmRleC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCIvKiFcblxuIGRpZmYgdjMuNC4wXG5cblNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSlcblxuQ29weXJpZ2h0IChjKSAyMDA5LTIwMTUsIEtldmluIERlY2tlciA8a3BkZWNrZXJAZ21haWwuY29tPlxuXG5BbGwgcmlnaHRzIHJlc2VydmVkLlxuXG5SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sXG5hcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZVxuICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlXG4gIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmVcbiAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZVxuICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXJcbiAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEtldmluIERlY2tlciBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzXG4gIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3JcbiAgd3JpdHRlbiBwZXJtaXNzaW9uLlxuXG5USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1JcbklNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1JcbkNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUxcbkRBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbkRBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSXG5JTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUXG5PRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG5AbGljZW5zZVxuKi9cbihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIkpzRGlmZlwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJKc0RpZmZcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fSxcbi8qKioqKiovIFx0XHRcdGlkOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGxvYWRlZDogZmFsc2Vcbi8qKioqKiovIFx0XHR9O1xuXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuXG5cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8ndXNlIHN0cmljdCc7XG5cblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0cy5jYW5vbmljYWxpemUgPSBleHBvcnRzLmNvbnZlcnRDaGFuZ2VzVG9YTUwgPSBleHBvcnRzLmNvbnZlcnRDaGFuZ2VzVG9ETVAgPSBleHBvcnRzLm1lcmdlID0gZXhwb3J0cy5wYXJzZVBhdGNoID0gZXhwb3J0cy5hcHBseVBhdGNoZXMgPSBleHBvcnRzLmFwcGx5UGF0Y2ggPSBleHBvcnRzLmNyZWF0ZVBhdGNoID0gZXhwb3J0cy5jcmVhdGVUd29GaWxlc1BhdGNoID0gZXhwb3J0cy5zdHJ1Y3R1cmVkUGF0Y2ggPSBleHBvcnRzLmRpZmZBcnJheXMgPSBleHBvcnRzLmRpZmZKc29uID0gZXhwb3J0cy5kaWZmQ3NzID0gZXhwb3J0cy5kaWZmU2VudGVuY2VzID0gZXhwb3J0cy5kaWZmVHJpbW1lZExpbmVzID0gZXhwb3J0cy5kaWZmTGluZXMgPSBleHBvcnRzLmRpZmZXb3Jkc1dpdGhTcGFjZSA9IGV4cG9ydHMuZGlmZldvcmRzID0gZXhwb3J0cy5kaWZmQ2hhcnMgPSBleHBvcnRzLkRpZmYgPSB1bmRlZmluZWQ7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgZW5kKi92YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19iYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9iYXNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Jhc2UpO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIGVuZCovdmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fY2hhcmFjdGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL193b3JkID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19saW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19zZW50ZW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oNikgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fY3NzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19qc29uID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19hcnJheSA9IF9fd2VicGFja19yZXF1aXJlX18oOSkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fYXBwbHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19wYXJzZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX21lcmdlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMykgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fZG1wID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNikgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9feG1sID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNykgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuXHQvKiBTZWUgTElDRU5TRSBmaWxlIGZvciB0ZXJtcyBvZiB1c2UgKi9cblxuXHQvKlxuXHQgKiBUZXh0IGRpZmYgaW1wbGVtZW50YXRpb24uXG5cdCAqXG5cdCAqIFRoaXMgbGlicmFyeSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIEFQSVM6XG5cdCAqIEpzRGlmZi5kaWZmQ2hhcnM6IENoYXJhY3RlciBieSBjaGFyYWN0ZXIgZGlmZlxuXHQgKiBKc0RpZmYuZGlmZldvcmRzOiBXb3JkIChhcyBkZWZpbmVkIGJ5IFxcYiByZWdleCkgZGlmZiB3aGljaCBpZ25vcmVzIHdoaXRlc3BhY2Vcblx0ICogSnNEaWZmLmRpZmZMaW5lczogTGluZSBiYXNlZCBkaWZmXG5cdCAqXG5cdCAqIEpzRGlmZi5kaWZmQ3NzOiBEaWZmIHRhcmdldGVkIGF0IENTUyBjb250ZW50XG5cdCAqXG5cdCAqIFRoZXNlIG1ldGhvZHMgYXJlIGJhc2VkIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBwcm9wb3NlZCBpblxuXHQgKiBcIkFuIE8oTkQpIERpZmZlcmVuY2UgQWxnb3JpdGhtIGFuZCBpdHMgVmFyaWF0aW9uc1wiIChNeWVycywgMTk4NikuXG5cdCAqIGh0dHA6Ly9jaXRlc2VlcnguaXN0LnBzdS5lZHUvdmlld2RvYy9zdW1tYXJ5P2RvaT0xMC4xLjEuNC42OTI3XG5cdCAqL1xuXHRleHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL0RpZmYgPSBfYmFzZTJbJ2RlZmF1bHQnXTtcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZkNoYXJzID0gX2NoYXJhY3Rlci5kaWZmQ2hhcnM7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2RpZmZXb3JkcyA9IF93b3JkLmRpZmZXb3Jkcztcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZldvcmRzV2l0aFNwYWNlID0gX3dvcmQuZGlmZldvcmRzV2l0aFNwYWNlO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9kaWZmTGluZXMgPSBfbGluZS5kaWZmTGluZXM7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2RpZmZUcmltbWVkTGluZXMgPSBfbGluZS5kaWZmVHJpbW1lZExpbmVzO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9kaWZmU2VudGVuY2VzID0gX3NlbnRlbmNlLmRpZmZTZW50ZW5jZXM7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2RpZmZDc3MgPSBfY3NzLmRpZmZDc3M7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2RpZmZKc29uID0gX2pzb24uZGlmZkpzb247XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2RpZmZBcnJheXMgPSBfYXJyYXkuZGlmZkFycmF5cztcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovc3RydWN0dXJlZFBhdGNoID0gX2NyZWF0ZS5zdHJ1Y3R1cmVkUGF0Y2g7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2NyZWF0ZVR3b0ZpbGVzUGF0Y2ggPSBfY3JlYXRlLmNyZWF0ZVR3b0ZpbGVzUGF0Y2g7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2NyZWF0ZVBhdGNoID0gX2NyZWF0ZS5jcmVhdGVQYXRjaDtcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovYXBwbHlQYXRjaCA9IF9hcHBseS5hcHBseVBhdGNoO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9hcHBseVBhdGNoZXMgPSBfYXBwbHkuYXBwbHlQYXRjaGVzO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9wYXJzZVBhdGNoID0gX3BhcnNlLnBhcnNlUGF0Y2g7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL21lcmdlID0gX21lcmdlLm1lcmdlO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jb252ZXJ0Q2hhbmdlc1RvRE1QID0gX2RtcC5jb252ZXJ0Q2hhbmdlc1RvRE1QO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jb252ZXJ0Q2hhbmdlc1RvWE1MID0gX3htbC5jb252ZXJ0Q2hhbmdlc1RvWE1MO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jYW5vbmljYWxpemUgPSBfanNvbi5jYW5vbmljYWxpemU7XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMM055WXk5cGJtUmxlQzVxY3lKZExDSnVZVzFsY3lJNld5SkVhV1ptSWl3aVpHbG1aa05vWVhKeklpd2laR2xtWmxkdmNtUnpJaXdpWkdsbVpsZHZjbVJ6VjJsMGFGTndZV05sSWl3aVpHbG1aa3hwYm1Weklpd2laR2xtWmxSeWFXMXRaV1JNYVc1bGN5SXNJbVJwWm1aVFpXNTBaVzVqWlhNaUxDSmthV1ptUTNOeklpd2laR2xtWmtwemIyNGlMQ0prYVdabVFYSnlZWGx6SWl3aWMzUnlkV04wZFhKbFpGQmhkR05vSWl3aVkzSmxZWFJsVkhkdlJtbHNaWE5RWVhSamFDSXNJbU55WldGMFpWQmhkR05vSWl3aVlYQndiSGxRWVhSamFDSXNJbUZ3Y0d4NVVHRjBZMmhsY3lJc0luQmhjbk5sVUdGMFkyZ2lMQ0p0WlhKblpTSXNJbU52Ym5abGNuUkRhR0Z1WjJWelZHOUVUVkFpTENKamIyNTJaWEowUTJoaGJtZGxjMVJ2V0UxTUlpd2lZMkZ1YjI1cFkyRnNhWHBsSWwwc0ltMWhjSEJwYm1keklqb2lPenM3T3p0MVFrRm5Ra0U3T3pzN2RVSkJRMEU3TzBGQlEwRTdPMEZCUTBFN08wRkJRMEU3TzBGQlJVRTdPMEZCUTBFN08wRkJSVUU3TzBGQlJVRTdPMEZCUTBFN08wRkJRMEU3TzBGQlEwRTdPMEZCUlVFN08wRkJRMEU3T3pzN1FVRnFRMEU3TzBGQlJVRTdPenM3T3pzN096czdPenM3TzJkRFFXdERSVUVzU1R0NVJFRkZRVU1zVXp0NVJFRkRRVU1zVXp0NVJFRkRRVU1zYTBJN2VVUkJRMEZETEZNN2VVUkJRMEZETEdkQ08zbEVRVU5CUXl4aE8zbEVRVVZCUXl4UE8zbEVRVU5CUXl4Uk8zbEVRVVZCUXl4Vk8zbEVRVVZCUXl4bE8zbEVRVU5CUXl4dFFqdDVSRUZEUVVNc1Z6dDVSRUZEUVVNc1ZUdDVSRUZEUVVNc1dUdDVSRUZEUVVNc1ZUdDVSRUZEUVVNc1N6dDVSRUZEUVVNc2JVSTdlVVJCUTBGRExHMUNPM2xFUVVOQlF5eFpJaXdpWm1sc1pTSTZJbWx1WkdWNExtcHpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpTHlvZ1UyVmxJRXhKUTBWT1UwVWdabWxzWlNCbWIzSWdkR1Z5YlhNZ2IyWWdkWE5sSUNvdlhHNWNiaThxWEc0Z0tpQlVaWGgwSUdScFptWWdhVzF3YkdWdFpXNTBZWFJwYjI0dVhHNGdLbHh1SUNvZ1ZHaHBjeUJzYVdKeVlYSjVJSE4xY0hCdmNuUnpJSFJvWlNCbWIyeHNiM2RwYm1jZ1FWQkpVenBjYmlBcUlFcHpSR2xtWmk1a2FXWm1RMmhoY25NNklFTm9ZWEpoWTNSbGNpQmllU0JqYUdGeVlXTjBaWElnWkdsbVpseHVJQ29nU25ORWFXWm1MbVJwWm1aWGIzSmtjem9nVjI5eVpDQW9ZWE1nWkdWbWFXNWxaQ0JpZVNCY1hHSWdjbVZuWlhncElHUnBabVlnZDJocFkyZ2dhV2R1YjNKbGN5QjNhR2wwWlhOd1lXTmxYRzRnS2lCS2MwUnBabVl1WkdsbVpreHBibVZ6T2lCTWFXNWxJR0poYzJWa0lHUnBabVpjYmlBcVhHNGdLaUJLYzBScFptWXVaR2xtWmtOemN6b2dSR2xtWmlCMFlYSm5aWFJsWkNCaGRDQkRVMU1nWTI5dWRHVnVkRnh1SUNwY2JpQXFJRlJvWlhObElHMWxkR2h2WkhNZ1lYSmxJR0poYzJWa0lHOXVJSFJvWlNCcGJYQnNaVzFsYm5SaGRHbHZiaUJ3Y205d2IzTmxaQ0JwYmx4dUlDb2dYQ0pCYmlCUEtFNUVLU0JFYVdabVpYSmxibU5sSUVGc1oyOXlhWFJvYlNCaGJtUWdhWFJ6SUZaaGNtbGhkR2x2Ym5OY0lpQW9UWGxsY25Nc0lERTVPRFlwTGx4dUlDb2dhSFIwY0RvdkwyTnBkR1Z6WldWeWVDNXBjM1F1Y0hOMUxtVmtkUzkyYVdWM1pHOWpMM04xYlcxaGNuay9aRzlwUFRFd0xqRXVNUzQwTGpZNU1qZGNiaUFxTDF4dWFXMXdiM0owSUVScFptWWdabkp2YlNBbkxpOWthV1ptTDJKaGMyVW5PMXh1YVcxd2IzSjBJSHRrYVdabVEyaGhjbk45SUdaeWIyMGdKeTR2WkdsbVppOWphR0Z5WVdOMFpYSW5PMXh1YVcxd2IzSjBJSHRrYVdabVYyOXlaSE1zSUdScFptWlhiM0prYzFkcGRHaFRjR0ZqWlgwZ1puSnZiU0FuTGk5a2FXWm1MM2R2Y21Rbk8xeHVhVzF3YjNKMElIdGthV1ptVEdsdVpYTXNJR1JwWm1aVWNtbHRiV1ZrVEdsdVpYTjlJR1p5YjIwZ0p5NHZaR2xtWmk5c2FXNWxKenRjYm1sdGNHOXlkQ0I3WkdsbVpsTmxiblJsYm1ObGMzMGdabkp2YlNBbkxpOWthV1ptTDNObGJuUmxibU5sSnp0Y2JseHVhVzF3YjNKMElIdGthV1ptUTNOemZTQm1jbTl0SUNjdUwyUnBabVl2WTNOekp6dGNibWx0Y0c5eWRDQjdaR2xtWmtwemIyNHNJR05oYm05dWFXTmhiR2w2WlgwZ1puSnZiU0FuTGk5a2FXWm1MMnB6YjI0bk8xeHVYRzVwYlhCdmNuUWdlMlJwWm1aQmNuSmhlWE45SUdaeWIyMGdKeTR2WkdsbVppOWhjbkpoZVNjN1hHNWNibWx0Y0c5eWRDQjdZWEJ3YkhsUVlYUmphQ3dnWVhCd2JIbFFZWFJqYUdWemZTQm1jbTl0SUNjdUwzQmhkR05vTDJGd2NHeDVKenRjYm1sdGNHOXlkQ0I3Y0dGeWMyVlFZWFJqYUgwZ1puSnZiU0FuTGk5d1lYUmphQzl3WVhKelpTYzdYRzVwYlhCdmNuUWdlMjFsY21kbGZTQm1jbTl0SUNjdUwzQmhkR05vTDIxbGNtZGxKenRjYm1sdGNHOXlkQ0I3YzNSeWRXTjBkWEpsWkZCaGRHTm9MQ0JqY21WaGRHVlVkMjlHYVd4bGMxQmhkR05vTENCamNtVmhkR1ZRWVhSamFIMGdabkp2YlNBbkxpOXdZWFJqYUM5amNtVmhkR1VuTzF4dVhHNXBiWEJ2Y25RZ2UyTnZiblpsY25SRGFHRnVaMlZ6Vkc5RVRWQjlJR1p5YjIwZ0p5NHZZMjl1ZG1WeWRDOWtiWEFuTzF4dWFXMXdiM0owSUh0amIyNTJaWEowUTJoaGJtZGxjMVJ2V0UxTWZTQm1jbTl0SUNjdUwyTnZiblpsY25RdmVHMXNKenRjYmx4dVpYaHdiM0owSUh0Y2JpQWdSR2xtWml4Y2JseHVJQ0JrYVdabVEyaGhjbk1zWEc0Z0lHUnBabVpYYjNKa2N5eGNiaUFnWkdsbVpsZHZjbVJ6VjJsMGFGTndZV05sTEZ4dUlDQmthV1ptVEdsdVpYTXNYRzRnSUdScFptWlVjbWx0YldWa1RHbHVaWE1zWEc0Z0lHUnBabVpUWlc1MFpXNWpaWE1zWEc1Y2JpQWdaR2xtWmtOemN5eGNiaUFnWkdsbVprcHpiMjRzWEc1Y2JpQWdaR2xtWmtGeWNtRjVjeXhjYmx4dUlDQnpkSEoxWTNSMWNtVmtVR0YwWTJnc1hHNGdJR055WldGMFpWUjNiMFpwYkdWelVHRjBZMmdzWEc0Z0lHTnlaV0YwWlZCaGRHTm9MRnh1SUNCaGNIQnNlVkJoZEdOb0xGeHVJQ0JoY0hCc2VWQmhkR05vWlhNc1hHNGdJSEJoY25ObFVHRjBZMmdzWEc0Z0lHMWxjbWRsTEZ4dUlDQmpiMjUyWlhKMFEyaGhibWRsYzFSdlJFMVFMRnh1SUNCamIyNTJaWEowUTJoaGJtZGxjMVJ2V0UxTUxGeHVJQ0JqWVc1dmJtbGpZV3hwZW1WY2JuMDdYRzRpWFgwPVxuXG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8ndXNlIHN0cmljdCc7XG5cblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1snZGVmYXVsdCddID0gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9EaWZmO1xuXHRmdW5jdGlvbiBEaWZmKCkge31cblxuXHREaWZmLnByb3RvdHlwZSA9IHtcblx0ICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZjogZnVuY3Rpb24gZGlmZihvbGRTdHJpbmcsIG5ld1N0cmluZykge1xuXHQgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL29wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXG5cdCAgICB2YXIgY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrO1xuXHQgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcblx0ICAgICAgb3B0aW9ucyA9IHt9O1xuXHQgICAgfVxuXHQgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuXHQgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG5cdCAgICBmdW5jdGlvbiBkb25lKHZhbHVlKSB7XG5cdCAgICAgIGlmIChjYWxsYmFjaykge1xuXHQgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgY2FsbGJhY2sodW5kZWZpbmVkLCB2YWx1ZSk7XG5cdCAgICAgICAgfSwgMCk7XG5cdCAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgcmV0dXJuIHZhbHVlO1xuXHQgICAgICB9XG5cdCAgICB9XG5cblx0ICAgIC8vIEFsbG93IHN1YmNsYXNzZXMgdG8gbWFzc2FnZSB0aGUgaW5wdXQgcHJpb3IgdG8gcnVubmluZ1xuXHQgICAgb2xkU3RyaW5nID0gdGhpcy5jYXN0SW5wdXQob2xkU3RyaW5nKTtcblx0ICAgIG5ld1N0cmluZyA9IHRoaXMuY2FzdElucHV0KG5ld1N0cmluZyk7XG5cblx0ICAgIG9sZFN0cmluZyA9IHRoaXMucmVtb3ZlRW1wdHkodGhpcy50b2tlbml6ZShvbGRTdHJpbmcpKTtcblx0ICAgIG5ld1N0cmluZyA9IHRoaXMucmVtb3ZlRW1wdHkodGhpcy50b2tlbml6ZShuZXdTdHJpbmcpKTtcblxuXHQgICAgdmFyIG5ld0xlbiA9IG5ld1N0cmluZy5sZW5ndGgsXG5cdCAgICAgICAgb2xkTGVuID0gb2xkU3RyaW5nLmxlbmd0aDtcblx0ICAgIHZhciBlZGl0TGVuZ3RoID0gMTtcblx0ICAgIHZhciBtYXhFZGl0TGVuZ3RoID0gbmV3TGVuICsgb2xkTGVuO1xuXHQgICAgdmFyIGJlc3RQYXRoID0gW3sgbmV3UG9zOiAtMSwgY29tcG9uZW50czogW10gfV07XG5cblx0ICAgIC8vIFNlZWQgZWRpdExlbmd0aCA9IDAsIGkuZS4gdGhlIGNvbnRlbnQgc3RhcnRzIHdpdGggdGhlIHNhbWUgdmFsdWVzXG5cdCAgICB2YXIgb2xkUG9zID0gdGhpcy5leHRyYWN0Q29tbW9uKGJlc3RQYXRoWzBdLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgMCk7XG5cdCAgICBpZiAoYmVzdFBhdGhbMF0ubmV3UG9zICsgMSA+PSBuZXdMZW4gJiYgb2xkUG9zICsgMSA+PSBvbGRMZW4pIHtcblx0ICAgICAgLy8gSWRlbnRpdHkgcGVyIHRoZSBlcXVhbGl0eSBhbmQgdG9rZW5pemVyXG5cdCAgICAgIHJldHVybiBkb25lKFt7IHZhbHVlOiB0aGlzLmpvaW4obmV3U3RyaW5nKSwgY291bnQ6IG5ld1N0cmluZy5sZW5ndGggfV0pO1xuXHQgICAgfVxuXG5cdCAgICAvLyBNYWluIHdvcmtlciBtZXRob2QuIGNoZWNrcyBhbGwgcGVybXV0YXRpb25zIG9mIGEgZ2l2ZW4gZWRpdCBsZW5ndGggZm9yIGFjY2VwdGFuY2UuXG5cdCAgICBmdW5jdGlvbiBleGVjRWRpdExlbmd0aCgpIHtcblx0ICAgICAgZm9yICh2YXIgZGlhZ29uYWxQYXRoID0gLTEgKiBlZGl0TGVuZ3RoOyBkaWFnb25hbFBhdGggPD0gZWRpdExlbmd0aDsgZGlhZ29uYWxQYXRoICs9IDIpIHtcblx0ICAgICAgICB2YXIgYmFzZVBhdGggPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdm9pZCAwIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXHQgICAgICAgIHZhciBhZGRQYXRoID0gYmVzdFBhdGhbZGlhZ29uYWxQYXRoIC0gMV0sXG5cdCAgICAgICAgICAgIHJlbW92ZVBhdGggPSBiZXN0UGF0aFtkaWFnb25hbFBhdGggKyAxXSxcblx0ICAgICAgICAgICAgX29sZFBvcyA9IChyZW1vdmVQYXRoID8gcmVtb3ZlUGF0aC5uZXdQb3MgOiAwKSAtIGRpYWdvbmFsUGF0aDtcblx0ICAgICAgICBpZiAoYWRkUGF0aCkge1xuXHQgICAgICAgICAgLy8gTm8gb25lIGVsc2UgaXMgZ29pbmcgdG8gYXR0ZW1wdCB0byB1c2UgdGhpcyB2YWx1ZSwgY2xlYXIgaXRcblx0ICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aCAtIDFdID0gdW5kZWZpbmVkO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHZhciBjYW5BZGQgPSBhZGRQYXRoICYmIGFkZFBhdGgubmV3UG9zICsgMSA8IG5ld0xlbixcblx0ICAgICAgICAgICAgY2FuUmVtb3ZlID0gcmVtb3ZlUGF0aCAmJiAwIDw9IF9vbGRQb3MgJiYgX29sZFBvcyA8IG9sZExlbjtcblx0ICAgICAgICBpZiAoIWNhbkFkZCAmJiAhY2FuUmVtb3ZlKSB7XG5cdCAgICAgICAgICAvLyBJZiB0aGlzIHBhdGggaXMgYSB0ZXJtaW5hbCB0aGVuIHBydW5lXG5cdCAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGhdID0gdW5kZWZpbmVkO1xuXHQgICAgICAgICAgY29udGludWU7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgLy8gU2VsZWN0IHRoZSBkaWFnb25hbCB0aGF0IHdlIHdhbnQgdG8gYnJhbmNoIGZyb20uIFdlIHNlbGVjdCB0aGUgcHJpb3Jcblx0ICAgICAgICAvLyBwYXRoIHdob3NlIHBvc2l0aW9uIGluIHRoZSBuZXcgc3RyaW5nIGlzIHRoZSBmYXJ0aGVzdCBmcm9tIHRoZSBvcmlnaW5cblx0ICAgICAgICAvLyBhbmQgZG9lcyBub3QgcGFzcyB0aGUgYm91bmRzIG9mIHRoZSBkaWZmIGdyYXBoXG5cdCAgICAgICAgaWYgKCFjYW5BZGQgfHwgY2FuUmVtb3ZlICYmIGFkZFBhdGgubmV3UG9zIDwgcmVtb3ZlUGF0aC5uZXdQb3MpIHtcblx0ICAgICAgICAgIGJhc2VQYXRoID0gY2xvbmVQYXRoKHJlbW92ZVBhdGgpO1xuXHQgICAgICAgICAgc2VsZi5wdXNoQ29tcG9uZW50KGJhc2VQYXRoLmNvbXBvbmVudHMsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIGJhc2VQYXRoID0gYWRkUGF0aDsgLy8gTm8gbmVlZCB0byBjbG9uZSwgd2UndmUgcHVsbGVkIGl0IGZyb20gdGhlIGxpc3Rcblx0ICAgICAgICAgIGJhc2VQYXRoLm5ld1BvcysrO1xuXHQgICAgICAgICAgc2VsZi5wdXNoQ29tcG9uZW50KGJhc2VQYXRoLmNvbXBvbmVudHMsIHRydWUsIHVuZGVmaW5lZCk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgX29sZFBvcyA9IHNlbGYuZXh0cmFjdENvbW1vbihiYXNlUGF0aCwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIGRpYWdvbmFsUGF0aCk7XG5cblx0ICAgICAgICAvLyBJZiB3ZSBoYXZlIGhpdCB0aGUgZW5kIG9mIGJvdGggc3RyaW5ncywgdGhlbiB3ZSBhcmUgZG9uZVxuXHQgICAgICAgIGlmIChiYXNlUGF0aC5uZXdQb3MgKyAxID49IG5ld0xlbiAmJiBfb2xkUG9zICsgMSA+PSBvbGRMZW4pIHtcblx0ICAgICAgICAgIHJldHVybiBkb25lKGJ1aWxkVmFsdWVzKHNlbGYsIGJhc2VQYXRoLmNvbXBvbmVudHMsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBzZWxmLnVzZUxvbmdlc3RUb2tlbikpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAvLyBPdGhlcndpc2UgdHJhY2sgdGhpcyBwYXRoIGFzIGEgcG90ZW50aWFsIGNhbmRpZGF0ZSBhbmQgY29udGludWUuXG5cdCAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGhdID0gYmFzZVBhdGg7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cblx0ICAgICAgZWRpdExlbmd0aCsrO1xuXHQgICAgfVxuXG5cdCAgICAvLyBQZXJmb3JtcyB0aGUgbGVuZ3RoIG9mIGVkaXQgaXRlcmF0aW9uLiBJcyBhIGJpdCBmdWdseSBhcyB0aGlzIGhhcyB0byBzdXBwb3J0IHRoZVxuXHQgICAgLy8gc3luYyBhbmQgYXN5bmMgbW9kZSB3aGljaCBpcyBuZXZlciBmdW4uIExvb3BzIG92ZXIgZXhlY0VkaXRMZW5ndGggdW50aWwgYSB2YWx1ZVxuXHQgICAgLy8gaXMgcHJvZHVjZWQuXG5cdCAgICBpZiAoY2FsbGJhY2spIHtcblx0ICAgICAgKGZ1bmN0aW9uIGV4ZWMoKSB7XG5cdCAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCBidXQgd2Ugd2FudCB0byBiZSBzYWZlLlxuXHQgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblx0ICAgICAgICAgIGlmIChlZGl0TGVuZ3RoID4gbWF4RWRpdExlbmd0aCkge1xuXHQgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcblx0ICAgICAgICAgIH1cblxuXHQgICAgICAgICAgaWYgKCFleGVjRWRpdExlbmd0aCgpKSB7XG5cdCAgICAgICAgICAgIGV4ZWMoKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9LCAwKTtcblx0ICAgICAgfSkoKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHdoaWxlIChlZGl0TGVuZ3RoIDw9IG1heEVkaXRMZW5ndGgpIHtcblx0ICAgICAgICB2YXIgcmV0ID0gZXhlY0VkaXRMZW5ndGgoKTtcblx0ICAgICAgICBpZiAocmV0KSB7XG5cdCAgICAgICAgICByZXR1cm4gcmV0O1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3B1c2hDb21wb25lbnQ6IGZ1bmN0aW9uIHB1c2hDb21wb25lbnQoY29tcG9uZW50cywgYWRkZWQsIHJlbW92ZWQpIHtcblx0ICAgIHZhciBsYXN0ID0gY29tcG9uZW50c1tjb21wb25lbnRzLmxlbmd0aCAtIDFdO1xuXHQgICAgaWYgKGxhc3QgJiYgbGFzdC5hZGRlZCA9PT0gYWRkZWQgJiYgbGFzdC5yZW1vdmVkID09PSByZW1vdmVkKSB7XG5cdCAgICAgIC8vIFdlIG5lZWQgdG8gY2xvbmUgaGVyZSBhcyB0aGUgY29tcG9uZW50IGNsb25lIG9wZXJhdGlvbiBpcyBqdXN0XG5cdCAgICAgIC8vIGFzIHNoYWxsb3cgYXJyYXkgY2xvbmVcblx0ICAgICAgY29tcG9uZW50c1tjb21wb25lbnRzLmxlbmd0aCAtIDFdID0geyBjb3VudDogbGFzdC5jb3VudCArIDEsIGFkZGVkOiBhZGRlZCwgcmVtb3ZlZDogcmVtb3ZlZCB9O1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgY29tcG9uZW50cy5wdXNoKHsgY291bnQ6IDEsIGFkZGVkOiBhZGRlZCwgcmVtb3ZlZDogcmVtb3ZlZCB9KTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9leHRyYWN0Q29tbW9uOiBmdW5jdGlvbiBleHRyYWN0Q29tbW9uKGJhc2VQYXRoLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgZGlhZ29uYWxQYXRoKSB7XG5cdCAgICB2YXIgbmV3TGVuID0gbmV3U3RyaW5nLmxlbmd0aCxcblx0ICAgICAgICBvbGRMZW4gPSBvbGRTdHJpbmcubGVuZ3RoLFxuXHQgICAgICAgIG5ld1BvcyA9IGJhc2VQYXRoLm5ld1Bvcyxcblx0ICAgICAgICBvbGRQb3MgPSBuZXdQb3MgLSBkaWFnb25hbFBhdGgsXG5cdCAgICAgICAgY29tbW9uQ291bnQgPSAwO1xuXHQgICAgd2hpbGUgKG5ld1BvcyArIDEgPCBuZXdMZW4gJiYgb2xkUG9zICsgMSA8IG9sZExlbiAmJiB0aGlzLmVxdWFscyhuZXdTdHJpbmdbbmV3UG9zICsgMV0sIG9sZFN0cmluZ1tvbGRQb3MgKyAxXSkpIHtcblx0ICAgICAgbmV3UG9zKys7XG5cdCAgICAgIG9sZFBvcysrO1xuXHQgICAgICBjb21tb25Db3VudCsrO1xuXHQgICAgfVxuXG5cdCAgICBpZiAoY29tbW9uQ291bnQpIHtcblx0ICAgICAgYmFzZVBhdGguY29tcG9uZW50cy5wdXNoKHsgY291bnQ6IGNvbW1vbkNvdW50IH0pO1xuXHQgICAgfVxuXG5cdCAgICBiYXNlUGF0aC5uZXdQb3MgPSBuZXdQb3M7XG5cdCAgICByZXR1cm4gb2xkUG9zO1xuXHQgIH0sXG5cdCAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2VxdWFsczogZnVuY3Rpb24gZXF1YWxzKGxlZnQsIHJpZ2h0KSB7XG5cdCAgICBpZiAodGhpcy5vcHRpb25zLmNvbXBhcmF0b3IpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb21wYXJhdG9yKGxlZnQsIHJpZ2h0KTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHJldHVybiBsZWZ0ID09PSByaWdodCB8fCB0aGlzLm9wdGlvbnMuaWdub3JlQ2FzZSAmJiBsZWZ0LnRvTG93ZXJDYXNlKCkgPT09IHJpZ2h0LnRvTG93ZXJDYXNlKCk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovIC8qaXN0YW5idWwgaWdub3JlIGVuZCovcmVtb3ZlRW1wdHk6IGZ1bmN0aW9uIHJlbW92ZUVtcHR5KGFycmF5KSB7XG5cdCAgICB2YXIgcmV0ID0gW107XG5cdCAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgIGlmIChhcnJheVtpXSkge1xuXHQgICAgICAgIHJldC5wdXNoKGFycmF5W2ldKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIHJldDtcblx0ICB9LFxuXHQgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jYXN0SW5wdXQ6IGZ1bmN0aW9uIGNhc3RJbnB1dCh2YWx1ZSkge1xuXHQgICAgcmV0dXJuIHZhbHVlO1xuXHQgIH0sXG5cdCAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3Rva2VuaXplOiBmdW5jdGlvbiB0b2tlbml6ZSh2YWx1ZSkge1xuXHQgICAgcmV0dXJuIHZhbHVlLnNwbGl0KCcnKTtcblx0ICB9LFxuXHQgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9qb2luOiBmdW5jdGlvbiBqb2luKGNoYXJzKSB7XG5cdCAgICByZXR1cm4gY2hhcnMuam9pbignJyk7XG5cdCAgfVxuXHR9O1xuXG5cdGZ1bmN0aW9uIGJ1aWxkVmFsdWVzKGRpZmYsIGNvbXBvbmVudHMsIG5ld1N0cmluZywgb2xkU3RyaW5nLCB1c2VMb25nZXN0VG9rZW4pIHtcblx0ICB2YXIgY29tcG9uZW50UG9zID0gMCxcblx0ICAgICAgY29tcG9uZW50TGVuID0gY29tcG9uZW50cy5sZW5ndGgsXG5cdCAgICAgIG5ld1BvcyA9IDAsXG5cdCAgICAgIG9sZFBvcyA9IDA7XG5cblx0ICBmb3IgKDsgY29tcG9uZW50UG9zIDwgY29tcG9uZW50TGVuOyBjb21wb25lbnRQb3MrKykge1xuXHQgICAgdmFyIGNvbXBvbmVudCA9IGNvbXBvbmVudHNbY29tcG9uZW50UG9zXTtcblx0ICAgIGlmICghY29tcG9uZW50LnJlbW92ZWQpIHtcblx0ICAgICAgaWYgKCFjb21wb25lbnQuYWRkZWQgJiYgdXNlTG9uZ2VzdFRva2VuKSB7XG5cdCAgICAgICAgdmFyIHZhbHVlID0gbmV3U3RyaW5nLnNsaWNlKG5ld1BvcywgbmV3UG9zICsgY29tcG9uZW50LmNvdW50KTtcblx0ICAgICAgICB2YWx1ZSA9IHZhbHVlLm1hcChmdW5jdGlvbiAodmFsdWUsIGkpIHtcblx0ICAgICAgICAgIHZhciBvbGRWYWx1ZSA9IG9sZFN0cmluZ1tvbGRQb3MgKyBpXTtcblx0ICAgICAgICAgIHJldHVybiBvbGRWYWx1ZS5sZW5ndGggPiB2YWx1ZS5sZW5ndGggPyBvbGRWYWx1ZSA6IHZhbHVlO1xuXHQgICAgICAgIH0pO1xuXG5cdCAgICAgICAgY29tcG9uZW50LnZhbHVlID0gZGlmZi5qb2luKHZhbHVlKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBjb21wb25lbnQudmFsdWUgPSBkaWZmLmpvaW4obmV3U3RyaW5nLnNsaWNlKG5ld1BvcywgbmV3UG9zICsgY29tcG9uZW50LmNvdW50KSk7XG5cdCAgICAgIH1cblx0ICAgICAgbmV3UG9zICs9IGNvbXBvbmVudC5jb3VudDtcblxuXHQgICAgICAvLyBDb21tb24gY2FzZVxuXHQgICAgICBpZiAoIWNvbXBvbmVudC5hZGRlZCkge1xuXHQgICAgICAgIG9sZFBvcyArPSBjb21wb25lbnQuY291bnQ7XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGNvbXBvbmVudC52YWx1ZSA9IGRpZmYuam9pbihvbGRTdHJpbmcuc2xpY2Uob2xkUG9zLCBvbGRQb3MgKyBjb21wb25lbnQuY291bnQpKTtcblx0ICAgICAgb2xkUG9zICs9IGNvbXBvbmVudC5jb3VudDtcblxuXHQgICAgICAvLyBSZXZlcnNlIGFkZCBhbmQgcmVtb3ZlIHNvIHJlbW92ZXMgYXJlIG91dHB1dCBmaXJzdCB0byBtYXRjaCBjb21tb24gY29udmVudGlvblxuXHQgICAgICAvLyBUaGUgZGlmZmluZyBhbGdvcml0aG0gaXMgdGllZCB0byBhZGQgdGhlbiByZW1vdmUgb3V0cHV0IGFuZCB0aGlzIGlzIHRoZSBzaW1wbGVzdFxuXHQgICAgICAvLyByb3V0ZSB0byBnZXQgdGhlIGRlc2lyZWQgb3V0cHV0IHdpdGggbWluaW1hbCBvdmVyaGVhZC5cblx0ICAgICAgaWYgKGNvbXBvbmVudFBvcyAmJiBjb21wb25lbnRzW2NvbXBvbmVudFBvcyAtIDFdLmFkZGVkKSB7XG5cdCAgICAgICAgdmFyIHRtcCA9IGNvbXBvbmVudHNbY29tcG9uZW50UG9zIC0gMV07XG5cdCAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXSA9IGNvbXBvbmVudHNbY29tcG9uZW50UG9zXTtcblx0ICAgICAgICBjb21wb25lbnRzW2NvbXBvbmVudFBvc10gPSB0bXA7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9XG5cblx0ICAvLyBTcGVjaWFsIGNhc2UgaGFuZGxlIGZvciB3aGVuIG9uZSB0ZXJtaW5hbCBpcyBpZ25vcmVkIChpLmUuIHdoaXRlc3BhY2UpLlxuXHQgIC8vIEZvciB0aGlzIGNhc2Ugd2UgbWVyZ2UgdGhlIHRlcm1pbmFsIGludG8gdGhlIHByaW9yIHN0cmluZyBhbmQgZHJvcCB0aGUgY2hhbmdlLlxuXHQgIC8vIFRoaXMgaXMgb25seSBhdmFpbGFibGUgZm9yIHN0cmluZyBtb2RlLlxuXHQgIHZhciBsYXN0Q29tcG9uZW50ID0gY29tcG9uZW50c1tjb21wb25lbnRMZW4gLSAxXTtcblx0ICBpZiAoY29tcG9uZW50TGVuID4gMSAmJiB0eXBlb2YgbGFzdENvbXBvbmVudC52YWx1ZSA9PT0gJ3N0cmluZycgJiYgKGxhc3RDb21wb25lbnQuYWRkZWQgfHwgbGFzdENvbXBvbmVudC5yZW1vdmVkKSAmJiBkaWZmLmVxdWFscygnJywgbGFzdENvbXBvbmVudC52YWx1ZSkpIHtcblx0ICAgIGNvbXBvbmVudHNbY29tcG9uZW50TGVuIC0gMl0udmFsdWUgKz0gbGFzdENvbXBvbmVudC52YWx1ZTtcblx0ICAgIGNvbXBvbmVudHMucG9wKCk7XG5cdCAgfVxuXG5cdCAgcmV0dXJuIGNvbXBvbmVudHM7XG5cdH1cblxuXHRmdW5jdGlvbiBjbG9uZVBhdGgocGF0aCkge1xuXHQgIHJldHVybiB7IG5ld1BvczogcGF0aC5uZXdQb3MsIGNvbXBvbmVudHM6IHBhdGguY29tcG9uZW50cy5zbGljZSgwKSB9O1xuXHR9XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OWthV1ptTDJKaGMyVXVhbk1pWFN3aWJtRnRaWE1pT2xzaVJHbG1aaUlzSW5CeWIzUnZkSGx3WlNJc0ltUnBabVlpTENKdmJHUlRkSEpwYm1jaUxDSnVaWGRUZEhKcGJtY2lMQ0p2Y0hScGIyNXpJaXdpWTJGc2JHSmhZMnNpTENKelpXeG1JaXdpWkc5dVpTSXNJblpoYkhWbElpd2ljMlYwVkdsdFpXOTFkQ0lzSW5WdVpHVm1hVzVsWkNJc0ltTmhjM1JKYm5CMWRDSXNJbkpsYlc5MlpVVnRjSFI1SWl3aWRHOXJaVzVwZW1VaUxDSnVaWGRNWlc0aUxDSnNaVzVuZEdnaUxDSnZiR1JNWlc0aUxDSmxaR2wwVEdWdVozUm9JaXdpYldGNFJXUnBkRXhsYm1kMGFDSXNJbUpsYzNSUVlYUm9JaXdpYm1WM1VHOXpJaXdpWTI5dGNHOXVaVzUwY3lJc0ltOXNaRkJ2Y3lJc0ltVjRkSEpoWTNSRGIyMXRiMjRpTENKcWIybHVJaXdpWTI5MWJuUWlMQ0psZUdWalJXUnBkRXhsYm1kMGFDSXNJbVJwWVdkdmJtRnNVR0YwYUNJc0ltSmhjMlZRWVhSb0lpd2lZV1JrVUdGMGFDSXNJbkpsYlc5MlpWQmhkR2dpTENKallXNUJaR1FpTENKallXNVNaVzF2ZG1VaUxDSmpiRzl1WlZCaGRHZ2lMQ0p3ZFhOb1EyOXRjRzl1Wlc1MElpd2lZblZwYkdSV1lXeDFaWE1pTENKMWMyVk1iMjVuWlhOMFZHOXJaVzRpTENKbGVHVmpJaXdpY21WMElpd2lZV1JrWldRaUxDSnlaVzF2ZG1Wa0lpd2liR0Z6ZENJc0luQjFjMmdpTENKamIyMXRiMjVEYjNWdWRDSXNJbVZ4ZFdGc2N5SXNJbXhsWm5RaUxDSnlhV2RvZENJc0ltTnZiWEJoY21GMGIzSWlMQ0pwWjI1dmNtVkRZWE5sSWl3aWRHOU1iM2RsY2tOaGMyVWlMQ0poY25KaGVTSXNJbWtpTENKemNHeHBkQ0lzSW1Ob1lYSnpJaXdpWTI5dGNHOXVaVzUwVUc5eklpd2lZMjl0Y0c5dVpXNTBUR1Z1SWl3aVkyOXRjRzl1Wlc1MElpd2ljMnhwWTJVaUxDSnRZWEFpTENKdmJHUldZV3gxWlNJc0luUnRjQ0lzSW14aGMzUkRiMjF3YjI1bGJuUWlMQ0p3YjNBaUxDSndZWFJvSWwwc0ltMWhjSEJwYm1keklqb2lPenM3TkVOQlFYZENRU3hKTzBGQlFWUXNVMEZCVTBFc1NVRkJWQ3hIUVVGblFpeERRVUZGT3p0QlFVVnFRMEVzUzBGQlMwTXNVMEZCVEN4SFFVRnBRanRCUVVGQkxHMUVRVU5tUXl4SlFVUmxMR2RDUVVOV1F5eFRRVVJWTEVWQlEwTkRMRk5CUkVRc1JVRkRNRUk3UVVGQlFTeDNSRUZCWkVNc1QwRkJZeXgxUlVGQlNpeEZRVUZKT3p0QlFVTjJReXhSUVVGSlF5eFhRVUZYUkN4UlFVRlJReXhSUVVGMlFqdEJRVU5CTEZGQlFVa3NUMEZCVDBRc1QwRkJVQ3hMUVVGdFFpeFZRVUYyUWl4RlFVRnRRenRCUVVOcVEwTXNhVUpCUVZkRUxFOUJRVmc3UVVGRFFVRXNaMEpCUVZVc1JVRkJWanRCUVVORU8wRkJRMFFzVTBGQlMwRXNUMEZCVEN4SFFVRmxRU3hQUVVGbU96dEJRVVZCTEZGQlFVbEZMRTlCUVU4c1NVRkJXRHM3UVVGRlFTeGhRVUZUUXl4SlFVRlVMRU5CUVdORExFdEJRV1FzUlVGQmNVSTdRVUZEYmtJc1ZVRkJTVWdzVVVGQlNpeEZRVUZqTzBGQlExcEpMRzFDUVVGWExGbEJRVmM3UVVGQlJVb3NiVUpCUVZOTExGTkJRVlFzUlVGQmIwSkdMRXRCUVhCQ08wRkJRVFpDTEZOQlFYSkVMRVZCUVhWRUxFTkJRWFpFTzBGQlEwRXNaVUZCVHl4SlFVRlFPMEZCUTBRc1QwRklSQ3hOUVVkUE8wRkJRMHdzWlVGQlQwRXNTMEZCVUR0QlFVTkVPMEZCUTBZN08wRkJSVVE3UVVGRFFVNHNaMEpCUVZrc1MwRkJTMU1zVTBGQlRDeERRVUZsVkN4VFFVRm1MRU5CUVZvN1FVRkRRVU1zWjBKQlFWa3NTMEZCUzFFc1UwRkJUQ3hEUVVGbFVpeFRRVUZtTEVOQlFWbzdPMEZCUlVGRUxHZENRVUZaTEV0QlFVdFZMRmRCUVV3c1EwRkJhVUlzUzBGQlMwTXNVVUZCVEN4RFFVRmpXQ3hUUVVGa0xFTkJRV3BDTEVOQlFWbzdRVUZEUVVNc1owSkJRVmtzUzBGQlMxTXNWMEZCVEN4RFFVRnBRaXhMUVVGTFF5eFJRVUZNTEVOQlFXTldMRk5CUVdRc1EwRkJha0lzUTBGQldqczdRVUZGUVN4UlFVRkpWeXhUUVVGVFdDeFZRVUZWV1N4TlFVRjJRanRCUVVGQkxGRkJRU3RDUXl4VFFVRlRaQ3hWUVVGVllTeE5RVUZzUkR0QlFVTkJMRkZCUVVsRkxHRkJRV0VzUTBGQmFrSTdRVUZEUVN4UlFVRkpReXhuUWtGQlowSktMRk5CUVZORkxFMUJRVGRDTzBGQlEwRXNVVUZCU1Vjc1YwRkJWeXhEUVVGRExFVkJRVVZETEZGQlFWRXNRMEZCUXl4RFFVRllMRVZCUVdORExGbEJRVmtzUlVGQk1VSXNSVUZCUkN4RFFVRm1PenRCUVVWQk8wRkJRMEVzVVVGQlNVTXNVMEZCVXl4TFFVRkxReXhoUVVGTUxFTkJRVzFDU2l4VFFVRlRMRU5CUVZRc1EwRkJia0lzUlVGQlowTm9RaXhUUVVGb1F5eEZRVUV5UTBRc1UwRkJNME1zUlVGQmMwUXNRMEZCZEVRc1EwRkJZanRCUVVOQkxGRkJRVWxwUWl4VFFVRlRMRU5CUVZRc1JVRkJXVU1zVFVGQldpeEhRVUZ4UWl4RFFVRnlRaXhKUVVFd1FrNHNUVUZCTVVJc1NVRkJiME5STEZOQlFWTXNRMEZCVkN4SlFVRmpUaXhOUVVGMFJDeEZRVUU0UkR0QlFVTTFSRHRCUVVOQkxHRkJRVTlVTEV0QlFVc3NRMEZCUXl4RlFVRkRReXhQUVVGUExFdEJRVXRuUWl4SlFVRk1MRU5CUVZWeVFpeFRRVUZXTEVOQlFWSXNSVUZCT0VKelFpeFBRVUZQZEVJc1ZVRkJWVmtzVFVGQkwwTXNSVUZCUkN4RFFVRk1MRU5CUVZBN1FVRkRSRHM3UVVGRlJEdEJRVU5CTEdGQlFWTlhMR05CUVZRc1IwRkJNRUk3UVVGRGVFSXNWMEZCU3l4SlFVRkpReXhsUVVGbExFTkJRVU1zUTBGQlJDeEhRVUZMVml4VlFVRTNRaXhGUVVGNVExVXNaMEpCUVdkQ1ZpeFZRVUY2UkN4RlFVRnhSVlVzWjBKQlFXZENMRU5CUVhKR0xFVkJRWGRHTzBGQlEzUkdMRmxCUVVsRExEQkRRVUZLTzBGQlEwRXNXVUZCU1VNc1ZVRkJWVllzVTBGQlUxRXNaVUZCWlN4RFFVRjRRaXhEUVVGa08wRkJRVUVzV1VGRFNVY3NZVUZCWVZnc1UwRkJVMUVzWlVGQlpTeERRVUY0UWl4RFFVUnFRanRCUVVGQkxGbEJSVWxNTEZWQlFWTXNRMEZCUTFFc1lVRkJZVUVzVjBGQlYxWXNUVUZCZUVJc1IwRkJhVU1zUTBGQmJFTXNTVUZCZFVOUExGbEJSbkJFTzBGQlIwRXNXVUZCU1VVc1QwRkJTaXhGUVVGaE8wRkJRMWc3UVVGRFFWWXNiVUpCUVZOUkxHVkJRV1VzUTBGQmVFSXNTVUZCTmtKcVFpeFRRVUUzUWp0QlFVTkVPenRCUVVWRUxGbEJRVWx4UWl4VFFVRlRSaXhYUVVGWFFTeFJRVUZSVkN4TlFVRlNMRWRCUVdsQ0xFTkJRV3BDTEVkQlFYRkNUaXhOUVVFM1F6dEJRVUZCTEZsQlEwbHJRaXhaUVVGWlJpeGpRVUZqTEV0QlFVdFNMRTlCUVc1Q0xFbEJRVFpDUVN4VlFVRlRUaXhOUVVSMFJEdEJRVVZCTEZsQlFVa3NRMEZCUTJVc1RVRkJSQ3hKUVVGWExFTkJRVU5ETEZOQlFXaENMRVZCUVRKQ08wRkJRM3BDTzBGQlEwRmlMRzFDUVVGVFVTeFpRVUZVTEVsQlFYbENha0lzVTBGQmVrSTdRVUZEUVR0QlFVTkVPenRCUVVWRU8wRkJRMEU3UVVGRFFUdEJRVU5CTEZsQlFVa3NRMEZCUTNGQ0xFMUJRVVFzU1VGQldVTXNZVUZCWVVnc1VVRkJVVlFzVFVGQlVpeEhRVUZwUWxVc1YwRkJWMVlzVFVGQmVrUXNSVUZCYTBVN1FVRkRhRVZSTEhGQ1FVRlhTeXhWUVVGVlNDeFZRVUZXTEVOQlFWZzdRVUZEUVhoQ0xHVkJRVXMwUWl4aFFVRk1MRU5CUVcxQ1RpeFRRVUZUVUN4VlFVRTFRaXhGUVVGM1ExZ3NVMEZCZUVNc1JVRkJiVVFzU1VGQmJrUTdRVUZEUkN4VFFVaEVMRTFCUjA4N1FVRkRUR3RDTEhGQ1FVRlhReXhQUVVGWUxFTkJSRXNzUTBGRGFVSTdRVUZEZEVKRUxHMUNRVUZUVWl4TlFVRlVPMEZCUTBGa0xHVkJRVXMwUWl4aFFVRk1MRU5CUVcxQ1RpeFRRVUZUVUN4VlFVRTFRaXhGUVVGM1F5eEpRVUY0UXl4RlFVRTRRMWdzVTBGQk9VTTdRVUZEUkRzN1FVRkZSRmtzYTBKQlFWTm9RaXhMUVVGTGFVSXNZVUZCVEN4RFFVRnRRa3NzVVVGQmJrSXNSVUZCTmtKNlFpeFRRVUUzUWl4RlFVRjNRMFFzVTBGQmVFTXNSVUZCYlVSNVFpeFpRVUZ1UkN4RFFVRlVPenRCUVVWQk8wRkJRMEVzV1VGQlNVTXNVMEZCVTFJc1RVRkJWQ3hIUVVGclFpeERRVUZzUWl4SlFVRjFRazRzVFVGQmRrSXNTVUZCYVVOUkxGVkJRVk1zUTBGQlZDeEpRVUZqVGl4TlFVRnVSQ3hGUVVFeVJEdEJRVU42UkN4cFFrRkJUMVFzUzBGQlN6UkNMRmxCUVZrM1FpeEpRVUZhTEVWQlFXdENjMElzVTBGQlUxQXNWVUZCTTBJc1JVRkJkVU5zUWl4VFFVRjJReXhGUVVGclJFUXNVMEZCYkVRc1JVRkJOa1JKTEV0QlFVczRRaXhsUVVGc1JTeERRVUZNTEVOQlFWQTdRVUZEUkN4VFFVWkVMRTFCUlU4N1FVRkRURHRCUVVOQmFrSXNiVUpCUVZOUkxGbEJRVlFzU1VGQmVVSkRMRkZCUVhwQ08wRkJRMFE3UVVGRFJqczdRVUZGUkZnN1FVRkRSRHM3UVVGRlJEdEJRVU5CTzBGQlEwRTdRVUZEUVN4UlFVRkpXaXhSUVVGS0xFVkJRV003UVVGRFdDeG5Ra0ZCVTJkRExFbEJRVlFzUjBGQlowSTdRVUZEWmpWQ0xHMUNRVUZYTEZsQlFWYzdRVUZEY0VJN1FVRkRRVHRCUVVOQkxHTkJRVWxSTEdGQlFXRkRMR0ZCUVdwQ0xFVkJRV2RETzBGQlF6bENMRzFDUVVGUFlpeFZRVUZRTzBGQlEwUTdPMEZCUlVRc1kwRkJTU3hEUVVGRGNVSXNaMEpCUVV3c1JVRkJkVUk3UVVGRGNrSlhPMEZCUTBRN1FVRkRSaXhUUVZaRUxFVkJWVWNzUTBGV1NEdEJRVmRFTEU5QldrRXNSMEZCUkR0QlFXRkVMRXRCWkVRc1RVRmpUenRCUVVOTUxHRkJRVTl3UWl4alFVRmpReXhoUVVGeVFpeEZRVUZ2UXp0QlFVTnNReXhaUVVGSmIwSXNUVUZCVFZvc1owSkJRVlk3UVVGRFFTeFpRVUZKV1N4SFFVRktMRVZCUVZNN1FVRkRVQ3hwUWtGQlQwRXNSMEZCVUR0QlFVTkVPMEZCUTBZN1FVRkRSanRCUVVOR0xFZEJPVWRqTzBGQlFVRXNiVVJCWjBobVNpeGhRV2hJWlN4NVFrRm5TRVJpTEZWQmFFaERMRVZCWjBoWGEwSXNTMEZvU0Znc1JVRm5TR3RDUXl4UFFXaEliRUlzUlVGblNESkNPMEZCUTNoRExGRkJRVWxETEU5QlFVOXdRaXhYUVVGWFFTeFhRVUZYVGl4TlFVRllMRWRCUVc5Q0xFTkJRUzlDTEVOQlFWZzdRVUZEUVN4UlFVRkpNRUlzVVVGQlVVRXNTMEZCUzBZc1MwRkJUQ3hMUVVGbFFTeExRVUYyUWl4SlFVRm5RMFVzUzBGQlMwUXNUMEZCVEN4TFFVRnBRa0VzVDBGQmNrUXNSVUZCT0VRN1FVRkROVVE3UVVGRFFUdEJRVU5CYmtJc2FVSkJRVmRCTEZkQlFWZE9MRTFCUVZnc1IwRkJiMElzUTBGQkwwSXNTVUZCYjBNc1JVRkJRMVVzVDBGQlQyZENMRXRCUVV0b1FpeExRVUZNTEVkQlFXRXNRMEZCY2tJc1JVRkJkMEpqTEU5QlFVOUJMRXRCUVM5Q0xFVkJRWE5EUXl4VFFVRlRRU3hQUVVFdlF5eEZRVUZ3UXp0QlFVTkVMRXRCU2tRc1RVRkpUenRCUVVOTWJrSXNhVUpCUVZkeFFpeEpRVUZZTEVOQlFXZENMRVZCUVVOcVFpeFBRVUZQTEVOQlFWSXNSVUZCVjJNc1QwRkJUMEVzUzBGQmJFSXNSVUZCZVVKRExGTkJRVk5CTEU5QlFXeERMRVZCUVdoQ08wRkJRMFE3UVVGRFJpeEhRWHBJWXp0QlFVRkJMRzFFUVRCSVptcENMR0ZCTVVobExIbENRVEJJUkVzc1VVRXhTRU1zUlVFd1NGTjZRaXhUUVRGSVZDeEZRVEJJYjBKRUxGTkJNVWh3UWl4RlFUQklLMEo1UWl4WlFURklMMElzUlVFd1NEWkRPMEZCUXpGRUxGRkJRVWxpTEZOQlFWTllMRlZCUVZWWkxFMUJRWFpDTzBGQlFVRXNVVUZEU1VNc1UwRkJVMlFzVlVGQlZXRXNUVUZFZGtJN1FVRkJRU3hSUVVWSlN5eFRRVUZUVVN4VFFVRlRVaXhOUVVaMFFqdEJRVUZCTEZGQlIwbEZMRk5CUVZOR0xGTkJRVk5QTEZsQlNIUkNPMEZCUVVFc1VVRkxTV2RDTEdOQlFXTXNRMEZNYkVJN1FVRk5RU3hYUVVGUGRrSXNVMEZCVXl4RFFVRlVMRWRCUVdGT0xFMUJRV0lzU1VGQmRVSlJMRk5CUVZNc1EwRkJWQ3hIUVVGaFRpeE5RVUZ3UXl4SlFVRTRReXhMUVVGTE5FSXNUVUZCVEN4RFFVRlpla01zVlVGQlZXbENMRk5CUVZNc1EwRkJia0lzUTBGQldpeEZRVUZ0UTJ4Q0xGVkJRVlZ2UWl4VFFVRlRMRU5CUVc1Q0xFTkJRVzVETEVOQlFYSkVMRVZCUVdkSU8wRkJRemxIUmp0QlFVTkJSVHRCUVVOQmNVSTdRVUZEUkRzN1FVRkZSQ3hSUVVGSlFTeFhRVUZLTEVWQlFXbENPMEZCUTJabUxHVkJRVk5RTEZWQlFWUXNRMEZCYjBKeFFpeEpRVUZ3UWl4RFFVRjVRaXhGUVVGRGFrSXNUMEZCVDJ0Q0xGZEJRVklzUlVGQmVrSTdRVUZEUkRzN1FVRkZSR1lzWVVGQlUxSXNUVUZCVkN4SFFVRnJRa0VzVFVGQmJFSTdRVUZEUVN4WFFVRlBSU3hOUVVGUU8wRkJRMFFzUjBFM1NXTTdRVUZCUVN4dFJFRXJTV1p6UWl4TlFTOUpaU3hyUWtFclNWSkRMRWxCTDBsUkxFVkJLMGxHUXl4TFFTOUpSU3hGUVN0SlN6dEJRVU5zUWl4UlFVRkpMRXRCUVVzeFF5eFBRVUZNTEVOQlFXRXlReXhWUVVGcVFpeEZRVUUyUWp0QlFVTXpRaXhoUVVGUExFdEJRVXN6UXl4UFFVRk1MRU5CUVdFeVF5eFZRVUZpTEVOQlFYZENSaXhKUVVGNFFpeEZRVUU0UWtNc1MwRkJPVUlzUTBGQlVEdEJRVU5FTEV0QlJrUXNUVUZGVHp0QlFVTk1MR0ZCUVU5RUxGTkJRVk5ETEV0QlFWUXNTVUZEUkN4TFFVRkxNVU1zVDBGQlRDeERRVUZoTkVNc1ZVRkJZaXhKUVVFeVFrZ3NTMEZCUzBrc1YwRkJUQ3hQUVVGMVFrZ3NUVUZCVFVjc1YwRkJUaXhGUVVSNFJEdEJRVVZFTzBGQlEwWXNSMEYwU21NN1FVRkJRU3h0UkVGMVNtWnlReXhYUVhaS1pTeDFRa0YxU2toelF5eExRWFpLUnl4RlFYVktTVHRCUVVOcVFpeFJRVUZKV2l4TlFVRk5MRVZCUVZZN1FVRkRRU3hUUVVGTExFbEJRVWxoTEVsQlFVa3NRMEZCWWl4RlFVRm5Ra0VzU1VGQlNVUXNUVUZCVFc1RExFMUJRVEZDTEVWQlFXdERiME1zUjBGQmJFTXNSVUZCZFVNN1FVRkRja01zVlVGQlNVUXNUVUZCVFVNc1EwRkJUaXhEUVVGS0xFVkJRV003UVVGRFdtSXNXVUZCU1Vrc1NVRkJTaXhEUVVGVFVTeE5RVUZOUXl4RFFVRk9MRU5CUVZRN1FVRkRSRHRCUVVOR08wRkJRMFFzVjBGQlQySXNSMEZCVUR0QlFVTkVMRWRCTDBwak8wRkJRVUVzYlVSQlowdG1NMElzVTBGb1MyVXNjVUpCWjB0TVNDeExRV2hMU3l4RlFXZExSVHRCUVVObUxGZEJRVTlCTEV0QlFWQTdRVUZEUkN4SFFXeExZenRCUVVGQkxHMUVRVzFMWmtzc1VVRnVTMlVzYjBKQmJVdE9UQ3hMUVc1TFRTeEZRVzFMUXp0QlFVTmtMRmRCUVU5QkxFMUJRVTAwUXl4TFFVRk9MRU5CUVZrc1JVRkJXaXhEUVVGUU8wRkJRMFFzUjBGeVMyTTdRVUZCUVN4dFJFRnpTMlkxUWl4SlFYUkxaU3huUWtGelMxWTJRaXhMUVhSTFZTeEZRWE5MU0R0QlFVTldMRmRCUVU5QkxFMUJRVTAzUWl4SlFVRk9MRU5CUVZjc1JVRkJXQ3hEUVVGUU8wRkJRMFE3UVVGNFMyTXNRMEZCYWtJN08wRkJNa3RCTEZOQlFWTlhMRmRCUVZRc1EwRkJjVUpzUXl4SlFVRnlRaXhGUVVFeVFtOUNMRlZCUVROQ0xFVkJRWFZEYkVJc1UwRkJka01zUlVGQmEwUkVMRk5CUVd4RUxFVkJRVFpFYTBNc1pVRkJOMFFzUlVGQk9FVTdRVUZETlVVc1RVRkJTV3RDTEdWQlFXVXNRMEZCYmtJN1FVRkJRU3hOUVVOSlF5eGxRVUZsYkVNc1YwRkJWMDRzVFVGRU9VSTdRVUZCUVN4TlFVVkpTeXhUUVVGVExFTkJSbUk3UVVGQlFTeE5RVWRKUlN4VFFVRlRMRU5CU0dJN08wRkJTMEVzVTBGQlQyZERMR1ZCUVdWRExGbEJRWFJDTEVWQlFXOURSQ3hqUVVGd1F5eEZRVUZ2UkR0QlFVTnNSQ3hSUVVGSlJTeFpRVUZaYmtNc1YwRkJWMmxETEZsQlFWZ3NRMEZCYUVJN1FVRkRRU3hSUVVGSkxFTkJRVU5GTEZWQlFWVm9RaXhQUVVGbUxFVkJRWGRDTzBGQlEzUkNMRlZCUVVrc1EwRkJRMmRDTEZWQlFWVnFRaXhMUVVGWUxFbEJRVzlDU0N4bFFVRjRRaXhGUVVGNVF6dEJRVU4yUXl4WlFVRkpOVUlzVVVGQlVVd3NWVUZCVlhORUxFdEJRVllzUTBGQlowSnlReXhOUVVGb1FpeEZRVUYzUWtFc1UwRkJVMjlETEZWQlFWVXZRaXhMUVVFelF5eERRVUZhTzBGQlEwRnFRaXhuUWtGQlVVRXNUVUZCVFd0RUxFZEJRVTRzUTBGQlZTeFZRVUZUYkVRc1MwRkJWQ3hGUVVGblFqSkRMRU5CUVdoQ0xFVkJRVzFDTzBGQlEyNURMR05CUVVsUkxGZEJRVmQ2UkN4VlFVRlZiMElzVTBGQlV6WkNMRU5CUVc1Q0xFTkJRV1k3UVVGRFFTeHBRa0ZCVDFFc1UwRkJVelZETEUxQlFWUXNSMEZCYTBKUUxFMUJRVTFQTEUxQlFYaENMRWRCUVdsRE5FTXNVVUZCYWtNc1IwRkJORU51UkN4TFFVRnVSRHRCUVVORUxGTkJTRThzUTBGQlVqczdRVUZMUVdkRUxHdENRVUZWYUVRc1MwRkJWaXhIUVVGclFsQXNTMEZCUzNWQ0xFbEJRVXdzUTBGQlZXaENMRXRCUVZZc1EwRkJiRUk3UVVGRFJDeFBRVkpFTEUxQlVVODdRVUZEVEdkRUxHdENRVUZWYUVRc1MwRkJWaXhIUVVGclFsQXNTMEZCUzNWQ0xFbEJRVXdzUTBGQlZYSkNMRlZCUVZWelJDeExRVUZXTEVOQlFXZENja01zVFVGQmFFSXNSVUZCZDBKQkxGTkJRVk52UXl4VlFVRlZMMElzUzBGQk0wTXNRMEZCVml4RFFVRnNRanRCUVVORU8wRkJRMFJNTEdkQ1FVRlZiME1zVlVGQlZTOUNMRXRCUVhCQ096dEJRVVZCTzBGQlEwRXNWVUZCU1N4RFFVRkRLMElzVlVGQlZXcENMRXRCUVdZc1JVRkJjMEk3UVVGRGNFSnFRaXhyUWtGQlZXdERMRlZCUVZVdlFpeExRVUZ3UWp0QlFVTkVPMEZCUTBZc1MwRnNRa1FzVFVGclFrODdRVUZEVEN0Q0xHZENRVUZWYUVRc1MwRkJWaXhIUVVGclFsQXNTMEZCUzNWQ0xFbEJRVXdzUTBGQlZYUkNMRlZCUVZWMVJDeExRVUZXTEVOQlFXZENia01zVFVGQmFFSXNSVUZCZDBKQkxGTkJRVk5yUXl4VlFVRlZMMElzUzBGQk0wTXNRMEZCVml4RFFVRnNRanRCUVVOQlNDeG5Ra0ZCVld0RExGVkJRVlV2UWl4TFFVRndRanM3UVVGRlFUdEJRVU5CTzBGQlEwRTdRVUZEUVN4VlFVRkpOa0lzWjBKQlFXZENha01zVjBGQlYybERMR1ZCUVdVc1EwRkJNVUlzUlVGQk5rSm1MRXRCUVdwRUxFVkJRWGRFTzBGQlEzUkVMRmxCUVVseFFpeE5RVUZOZGtNc1YwRkJWMmxETEdWQlFXVXNRMEZCTVVJc1EwRkJWanRCUVVOQmFrTXNiVUpCUVZkcFF5eGxRVUZsTEVOQlFURkNMRWxCUVN0Q2FrTXNWMEZCVjJsRExGbEJRVmdzUTBGQkwwSTdRVUZEUVdwRExHMUNRVUZYYVVNc1dVRkJXQ3hKUVVFeVFrMHNSMEZCTTBJN1FVRkRSRHRCUVVOR08wRkJRMFk3TzBGQlJVUTdRVUZEUVR0QlFVTkJPMEZCUTBFc1RVRkJTVU1zWjBKQlFXZENlRU1zVjBGQlYydERMR1ZCUVdVc1EwRkJNVUlzUTBGQmNFSTdRVUZEUVN4TlFVRkpRU3hsUVVGbExFTkJRV1lzU1VGRFJ5eFBRVUZQVFN4alFVRmpja1FzUzBGQmNrSXNTMEZCSzBJc1VVRkViRU1zUzBGRlNYRkVMR05CUVdOMFFpeExRVUZrTEVsQlFYVkNjMElzWTBGQlkzSkNMRTlCUm5wRExFdEJSMGQyUXl4TFFVRkxNa01zVFVGQlRDeERRVUZaTEVWQlFWb3NSVUZCWjBKcFFpeGpRVUZqY2tRc1MwRkJPVUlzUTBGSVVDeEZRVWMyUXp0QlFVTXpRMkVzWlVGQlYydERMR1ZCUVdVc1EwRkJNVUlzUlVGQk5rSXZReXhMUVVFM1FpeEpRVUZ6UTNGRUxHTkJRV055UkN4TFFVRndSRHRCUVVOQllTeGxRVUZYZVVNc1IwRkJXRHRCUVVORU96dEJRVVZFTEZOQlFVOTZReXhWUVVGUU8wRkJRMFE3TzBGQlJVUXNVMEZCVTFrc1UwRkJWQ3hEUVVGdFFqaENMRWxCUVc1Q0xFVkJRWGxDTzBGQlEzWkNMRk5CUVU4c1JVRkJSVE5ETEZGQlFWRXlReXhMUVVGTE0wTXNUVUZCWml4RlFVRjFRa01zV1VGQldUQkRMRXRCUVVzeFF5eFZRVUZNTEVOQlFXZENiME1zUzBGQmFFSXNRMEZCYzBJc1EwRkJkRUlzUTBGQmJrTXNSVUZCVUR0QlFVTkVJaXdpWm1sc1pTSTZJbUpoYzJVdWFuTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUpsZUhCdmNuUWdaR1ZtWVhWc2RDQm1kVzVqZEdsdmJpQkVhV1ptS0NrZ2UzMWNibHh1UkdsbVppNXdjbTkwYjNSNWNHVWdQU0I3WEc0Z0lHUnBabVlvYjJ4a1UzUnlhVzVuTENCdVpYZFRkSEpwYm1jc0lHOXdkR2x2Ym5NZ1BTQjdmU2tnZTF4dUlDQWdJR3hsZENCallXeHNZbUZqYXlBOUlHOXdkR2x2Ym5NdVkyRnNiR0poWTJzN1hHNGdJQ0FnYVdZZ0tIUjVjR1Z2WmlCdmNIUnBiMjV6SUQwOVBTQW5ablZ1WTNScGIyNG5LU0I3WEc0Z0lDQWdJQ0JqWVd4c1ltRmpheUE5SUc5d2RHbHZibk03WEc0Z0lDQWdJQ0J2Y0hScGIyNXpJRDBnZTMwN1hHNGdJQ0FnZlZ4dUlDQWdJSFJvYVhNdWIzQjBhVzl1Y3lBOUlHOXdkR2x2Ym5NN1hHNWNiaUFnSUNCc1pYUWdjMlZzWmlBOUlIUm9hWE03WEc1Y2JpQWdJQ0JtZFc1amRHbHZiaUJrYjI1bEtIWmhiSFZsS1NCN1hHNGdJQ0FnSUNCcFppQW9ZMkZzYkdKaFkyc3BJSHRjYmlBZ0lDQWdJQ0FnYzJWMFZHbHRaVzkxZENobWRXNWpkR2x2YmlncElIc2dZMkZzYkdKaFkyc29kVzVrWldacGJtVmtMQ0IyWVd4MVpTazdJSDBzSURBcE8xeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2RISjFaVHRjYmlBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjJZV3gxWlR0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0F2THlCQmJHeHZkeUJ6ZFdKamJHRnpjMlZ6SUhSdklHMWhjM05oWjJVZ2RHaGxJR2x1Y0hWMElIQnlhVzl5SUhSdklISjFibTVwYm1kY2JpQWdJQ0J2YkdSVGRISnBibWNnUFNCMGFHbHpMbU5oYzNSSmJuQjFkQ2h2YkdSVGRISnBibWNwTzF4dUlDQWdJRzVsZDFOMGNtbHVaeUE5SUhSb2FYTXVZMkZ6ZEVsdWNIVjBLRzVsZDFOMGNtbHVaeWs3WEc1Y2JpQWdJQ0J2YkdSVGRISnBibWNnUFNCMGFHbHpMbkpsYlc5MlpVVnRjSFI1S0hSb2FYTXVkRzlyWlc1cGVtVW9iMnhrVTNSeWFXNW5LU2s3WEc0Z0lDQWdibVYzVTNSeWFXNW5JRDBnZEdocGN5NXlaVzF2ZG1WRmJYQjBlU2gwYUdsekxuUnZhMlZ1YVhwbEtHNWxkMU4wY21sdVp5a3BPMXh1WEc0Z0lDQWdiR1YwSUc1bGQweGxiaUE5SUc1bGQxTjBjbWx1Wnk1c1pXNW5kR2dzSUc5c1pFeGxiaUE5SUc5c1pGTjBjbWx1Wnk1c1pXNW5kR2c3WEc0Z0lDQWdiR1YwSUdWa2FYUk1aVzVuZEdnZ1BTQXhPMXh1SUNBZ0lHeGxkQ0J0WVhoRlpHbDBUR1Z1WjNSb0lEMGdibVYzVEdWdUlDc2diMnhrVEdWdU8xeHVJQ0FnSUd4bGRDQmlaWE4wVUdGMGFDQTlJRnQ3SUc1bGQxQnZjem9nTFRFc0lHTnZiWEJ2Ym1WdWRITTZJRnRkSUgxZE8xeHVYRzRnSUNBZ0x5OGdVMlZsWkNCbFpHbDBUR1Z1WjNSb0lEMGdNQ3dnYVM1bExpQjBhR1VnWTI5dWRHVnVkQ0J6ZEdGeWRITWdkMmwwYUNCMGFHVWdjMkZ0WlNCMllXeDFaWE5jYmlBZ0lDQnNaWFFnYjJ4a1VHOXpJRDBnZEdocGN5NWxlSFJ5WVdOMFEyOXRiVzl1S0dKbGMzUlFZWFJvV3pCZExDQnVaWGRUZEhKcGJtY3NJRzlzWkZOMGNtbHVaeXdnTUNrN1hHNGdJQ0FnYVdZZ0tHSmxjM1JRWVhSb1d6QmRMbTVsZDFCdmN5QXJJREVnUGowZ2JtVjNUR1Z1SUNZbUlHOXNaRkJ2Y3lBcklERWdQajBnYjJ4a1RHVnVLU0I3WEc0Z0lDQWdJQ0F2THlCSlpHVnVkR2wwZVNCd1pYSWdkR2hsSUdWeGRXRnNhWFI1SUdGdVpDQjBiMnRsYm1sNlpYSmNiaUFnSUNBZ0lISmxkSFZ5YmlCa2IyNWxLRnQ3ZG1Gc2RXVTZJSFJvYVhNdWFtOXBiaWh1WlhkVGRISnBibWNwTENCamIzVnVkRG9nYm1WM1UzUnlhVzVuTG14bGJtZDBhSDFkS1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0F2THlCTllXbHVJSGR2Y210bGNpQnRaWFJvYjJRdUlHTm9aV05yY3lCaGJHd2djR1Z5YlhWMFlYUnBiMjV6SUc5bUlHRWdaMmwyWlc0Z1pXUnBkQ0JzWlc1bmRHZ2dabTl5SUdGalkyVndkR0Z1WTJVdVhHNGdJQ0FnWm5WdVkzUnBiMjRnWlhobFkwVmthWFJNWlc1bmRHZ29LU0I3WEc0Z0lDQWdJQ0JtYjNJZ0tHeGxkQ0JrYVdGbmIyNWhiRkJoZEdnZ1BTQXRNU0FxSUdWa2FYUk1aVzVuZEdnN0lHUnBZV2R2Ym1Gc1VHRjBhQ0E4UFNCbFpHbDBUR1Z1WjNSb095QmthV0ZuYjI1aGJGQmhkR2dnS3owZ01pa2dlMXh1SUNBZ0lDQWdJQ0JzWlhRZ1ltRnpaVkJoZEdnN1hHNGdJQ0FnSUNBZ0lHeGxkQ0JoWkdSUVlYUm9JRDBnWW1WemRGQmhkR2hiWkdsaFoyOXVZV3hRWVhSb0lDMGdNVjBzWEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaVzF2ZG1WUVlYUm9JRDBnWW1WemRGQmhkR2hiWkdsaFoyOXVZV3hRWVhSb0lDc2dNVjBzWEc0Z0lDQWdJQ0FnSUNBZ0lDQnZiR1JRYjNNZ1BTQW9jbVZ0YjNabFVHRjBhQ0EvSUhKbGJXOTJaVkJoZEdndWJtVjNVRzl6SURvZ01Da2dMU0JrYVdGbmIyNWhiRkJoZEdnN1hHNGdJQ0FnSUNBZ0lHbG1JQ2hoWkdSUVlYUm9LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0x5OGdUbThnYjI1bElHVnNjMlVnYVhNZ1oyOXBibWNnZEc4Z1lYUjBaVzF3ZENCMGJ5QjFjMlVnZEdocGN5QjJZV3gxWlN3Z1kyeGxZWElnYVhSY2JpQWdJQ0FnSUNBZ0lDQmlaWE4wVUdGMGFGdGthV0ZuYjI1aGJGQmhkR2dnTFNBeFhTQTlJSFZ1WkdWbWFXNWxaRHRjYmlBZ0lDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNBZ0lHeGxkQ0JqWVc1QlpHUWdQU0JoWkdSUVlYUm9JQ1ltSUdGa1pGQmhkR2d1Ym1WM1VHOXpJQ3NnTVNBOElHNWxkMHhsYml4Y2JpQWdJQ0FnSUNBZ0lDQWdJR05oYmxKbGJXOTJaU0E5SUhKbGJXOTJaVkJoZEdnZ0ppWWdNQ0E4UFNCdmJHUlFiM01nSmlZZ2IyeGtVRzl6SUR3Z2IyeGtUR1Z1TzF4dUlDQWdJQ0FnSUNCcFppQW9JV05oYmtGa1pDQW1KaUFoWTJGdVVtVnRiM1psS1NCN1hHNGdJQ0FnSUNBZ0lDQWdMeThnU1dZZ2RHaHBjeUJ3WVhSb0lHbHpJR0VnZEdWeWJXbHVZV3dnZEdobGJpQndjblZ1WlZ4dUlDQWdJQ0FnSUNBZ0lHSmxjM1JRWVhSb1cyUnBZV2R2Ym1Gc1VHRjBhRjBnUFNCMWJtUmxabWx1WldRN1hHNGdJQ0FnSUNBZ0lDQWdZMjl1ZEdsdWRXVTdYRzRnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNBdkx5QlRaV3hsWTNRZ2RHaGxJR1JwWVdkdmJtRnNJSFJvWVhRZ2QyVWdkMkZ1ZENCMGJ5QmljbUZ1WTJnZ1puSnZiUzRnVjJVZ2MyVnNaV04wSUhSb1pTQndjbWx2Y2x4dUlDQWdJQ0FnSUNBdkx5QndZWFJvSUhkb2IzTmxJSEJ2YzJsMGFXOXVJR2x1SUhSb1pTQnVaWGNnYzNSeWFXNW5JR2x6SUhSb1pTQm1ZWEowYUdWemRDQm1jbTl0SUhSb1pTQnZjbWxuYVc1Y2JpQWdJQ0FnSUNBZ0x5OGdZVzVrSUdSdlpYTWdibTkwSUhCaGMzTWdkR2hsSUdKdmRXNWtjeUJ2WmlCMGFHVWdaR2xtWmlCbmNtRndhRnh1SUNBZ0lDQWdJQ0JwWmlBb0lXTmhia0ZrWkNCOGZDQW9ZMkZ1VW1WdGIzWmxJQ1ltSUdGa1pGQmhkR2d1Ym1WM1VHOXpJRHdnY21WdGIzWmxVR0YwYUM1dVpYZFFiM01wS1NCN1hHNGdJQ0FnSUNBZ0lDQWdZbUZ6WlZCaGRHZ2dQU0JqYkc5dVpWQmhkR2dvY21WdGIzWmxVR0YwYUNrN1hHNGdJQ0FnSUNBZ0lDQWdjMlZzWmk1d2RYTm9RMjl0Y0c5dVpXNTBLR0poYzJWUVlYUm9MbU52YlhCdmJtVnVkSE1zSUhWdVpHVm1hVzVsWkN3Z2RISjFaU2s3WEc0Z0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ1ltRnpaVkJoZEdnZ1BTQmhaR1JRWVhSb095QWdJQzh2SUU1dklHNWxaV1FnZEc4Z1kyeHZibVVzSUhkbEozWmxJSEIxYkd4bFpDQnBkQ0JtY205dElIUm9aU0JzYVhOMFhHNGdJQ0FnSUNBZ0lDQWdZbUZ6WlZCaGRHZ3VibVYzVUc5ekt5czdYRzRnSUNBZ0lDQWdJQ0FnYzJWc1ppNXdkWE5vUTI5dGNHOXVaVzUwS0dKaGMyVlFZWFJvTG1OdmJYQnZibVZ1ZEhNc0lIUnlkV1VzSUhWdVpHVm1hVzVsWkNrN1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0J2YkdSUWIzTWdQU0J6Wld4bUxtVjRkSEpoWTNSRGIyMXRiMjRvWW1GelpWQmhkR2dzSUc1bGQxTjBjbWx1Wnl3Z2IyeGtVM1J5YVc1bkxDQmthV0ZuYjI1aGJGQmhkR2dwTzF4dVhHNGdJQ0FnSUNBZ0lDOHZJRWxtSUhkbElHaGhkbVVnYUdsMElIUm9aU0JsYm1RZ2IyWWdZbTkwYUNCemRISnBibWR6TENCMGFHVnVJSGRsSUdGeVpTQmtiMjVsWEc0Z0lDQWdJQ0FnSUdsbUlDaGlZWE5sVUdGMGFDNXVaWGRRYjNNZ0t5QXhJRDQ5SUc1bGQweGxiaUFtSmlCdmJHUlFiM01nS3lBeElENDlJRzlzWkV4bGJpa2dlMXh1SUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJrYjI1bEtHSjFhV3hrVm1Gc2RXVnpLSE5sYkdZc0lHSmhjMlZRWVhSb0xtTnZiWEJ2Ym1WdWRITXNJRzVsZDFOMGNtbHVaeXdnYjJ4a1UzUnlhVzVuTENCelpXeG1MblZ6WlV4dmJtZGxjM1JVYjJ0bGJpa3BPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUM4dklFOTBhR1Z5ZDJselpTQjBjbUZqYXlCMGFHbHpJSEJoZEdnZ1lYTWdZU0J3YjNSbGJuUnBZV3dnWTJGdVpHbGtZWFJsSUdGdVpDQmpiMjUwYVc1MVpTNWNiaUFnSUNBZ0lDQWdJQ0JpWlhOMFVHRjBhRnRrYVdGbmIyNWhiRkJoZEdoZElEMGdZbUZ6WlZCaGRHZzdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnWldScGRFeGxibWQwYUNzck8xeHVJQ0FnSUgxY2JseHVJQ0FnSUM4dklGQmxjbVp2Y20xeklIUm9aU0JzWlc1bmRHZ2diMllnWldScGRDQnBkR1Z5WVhScGIyNHVJRWx6SUdFZ1ltbDBJR1oxWjJ4NUlHRnpJSFJvYVhNZ2FHRnpJSFJ2SUhOMWNIQnZjblFnZEdobFhHNGdJQ0FnTHk4Z2MzbHVZeUJoYm1RZ1lYTjVibU1nYlc5a1pTQjNhR2xqYUNCcGN5QnVaWFpsY2lCbWRXNHVJRXh2YjNCeklHOTJaWElnWlhobFkwVmthWFJNWlc1bmRHZ2dkVzUwYVd3Z1lTQjJZV3gxWlZ4dUlDQWdJQzh2SUdseklIQnliMlIxWTJWa0xseHVJQ0FnSUdsbUlDaGpZV3hzWW1GamF5a2dlMXh1SUNBZ0lDQWdLR1oxYm1OMGFXOXVJR1Y0WldNb0tTQjdYRzRnSUNBZ0lDQWdJSE5sZEZScGJXVnZkWFFvWm5WdVkzUnBiMjRvS1NCN1hHNGdJQ0FnSUNBZ0lDQWdMeThnVkdocGN5QnphRzkxYkdRZ2JtOTBJR2hoY0hCbGJpd2dZblYwSUhkbElIZGhiblFnZEc4Z1ltVWdjMkZtWlM1Y2JpQWdJQ0FnSUNBZ0lDQXZLaUJwYzNSaGJtSjFiQ0JwWjI1dmNtVWdibVY0ZENBcUwxeHVJQ0FnSUNBZ0lDQWdJR2xtSUNobFpHbDBUR1Z1WjNSb0lENGdiV0Y0UldScGRFeGxibWQwYUNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR05oYkd4aVlXTnJLQ2s3WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJQ0FnYVdZZ0tDRmxlR1ZqUldScGRFeGxibWQwYUNncEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCbGVHVmpLQ2s3WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQjlMQ0F3S1R0Y2JpQWdJQ0FnSUgwb0tTazdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUhkb2FXeGxJQ2hsWkdsMFRHVnVaM1JvSUR3OUlHMWhlRVZrYVhSTVpXNW5kR2dwSUh0Y2JpQWdJQ0FnSUNBZ2JHVjBJSEpsZENBOUlHVjRaV05GWkdsMFRHVnVaM1JvS0NrN1hHNGdJQ0FnSUNBZ0lHbG1JQ2h5WlhRcElIdGNiaUFnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdjbVYwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQjlMRnh1WEc0Z0lIQjFjMmhEYjIxd2IyNWxiblFvWTI5dGNHOXVaVzUwY3l3Z1lXUmtaV1FzSUhKbGJXOTJaV1FwSUh0Y2JpQWdJQ0JzWlhRZ2JHRnpkQ0E5SUdOdmJYQnZibVZ1ZEhOYlkyOXRjRzl1Wlc1MGN5NXNaVzVuZEdnZ0xTQXhYVHRjYmlBZ0lDQnBaaUFvYkdGemRDQW1KaUJzWVhOMExtRmtaR1ZrSUQwOVBTQmhaR1JsWkNBbUppQnNZWE4wTG5KbGJXOTJaV1FnUFQwOUlISmxiVzkyWldRcElIdGNiaUFnSUNBZ0lDOHZJRmRsSUc1bFpXUWdkRzhnWTJ4dmJtVWdhR1Z5WlNCaGN5QjBhR1VnWTI5dGNHOXVaVzUwSUdOc2IyNWxJRzl3WlhKaGRHbHZiaUJwY3lCcWRYTjBYRzRnSUNBZ0lDQXZMeUJoY3lCemFHRnNiRzkzSUdGeWNtRjVJR05zYjI1bFhHNGdJQ0FnSUNCamIyMXdiMjVsYm5SelcyTnZiWEJ2Ym1WdWRITXViR1Z1WjNSb0lDMGdNVjBnUFNCN1kyOTFiblE2SUd4aGMzUXVZMjkxYm5RZ0t5QXhMQ0JoWkdSbFpEb2dZV1JrWldRc0lISmxiVzkyWldRNklISmxiVzkyWldRZ2ZUdGNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnWTI5dGNHOXVaVzUwY3k1d2RYTm9LSHRqYjNWdWREb2dNU3dnWVdSa1pXUTZJR0ZrWkdWa0xDQnlaVzF2ZG1Wa09pQnlaVzF2ZG1Wa0lIMHBPMXh1SUNBZ0lIMWNiaUFnZlN4Y2JpQWdaWGgwY21GamRFTnZiVzF2YmloaVlYTmxVR0YwYUN3Z2JtVjNVM1J5YVc1bkxDQnZiR1JUZEhKcGJtY3NJR1JwWVdkdmJtRnNVR0YwYUNrZ2UxeHVJQ0FnSUd4bGRDQnVaWGRNWlc0Z1BTQnVaWGRUZEhKcGJtY3ViR1Z1WjNSb0xGeHVJQ0FnSUNBZ0lDQnZiR1JNWlc0Z1BTQnZiR1JUZEhKcGJtY3ViR1Z1WjNSb0xGeHVJQ0FnSUNBZ0lDQnVaWGRRYjNNZ1BTQmlZWE5sVUdGMGFDNXVaWGRRYjNNc1hHNGdJQ0FnSUNBZ0lHOXNaRkJ2Y3lBOUlHNWxkMUJ2Y3lBdElHUnBZV2R2Ym1Gc1VHRjBhQ3hjYmx4dUlDQWdJQ0FnSUNCamIyMXRiMjVEYjNWdWRDQTlJREE3WEc0Z0lDQWdkMmhwYkdVZ0tHNWxkMUJ2Y3lBcklERWdQQ0J1WlhkTVpXNGdKaVlnYjJ4a1VHOXpJQ3NnTVNBOElHOXNaRXhsYmlBbUppQjBhR2x6TG1WeGRXRnNjeWh1WlhkVGRISnBibWRiYm1WM1VHOXpJQ3NnTVYwc0lHOXNaRk4wY21sdVoxdHZiR1JRYjNNZ0t5QXhYU2twSUh0Y2JpQWdJQ0FnSUc1bGQxQnZjeXNyTzF4dUlDQWdJQ0FnYjJ4a1VHOXpLeXM3WEc0Z0lDQWdJQ0JqYjIxdGIyNURiM1Z1ZENzck8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdsbUlDaGpiMjF0YjI1RGIzVnVkQ2tnZTF4dUlDQWdJQ0FnWW1GelpWQmhkR2d1WTI5dGNHOXVaVzUwY3k1d2RYTm9LSHRqYjNWdWREb2dZMjl0Ylc5dVEyOTFiblI5S1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JpWVhObFVHRjBhQzV1WlhkUWIzTWdQU0J1WlhkUWIzTTdYRzRnSUNBZ2NtVjBkWEp1SUc5c1pGQnZjenRjYmlBZ2ZTeGNibHh1SUNCbGNYVmhiSE1vYkdWbWRDd2djbWxuYUhRcElIdGNiaUFnSUNCcFppQW9kR2hwY3k1dmNIUnBiMjV6TG1OdmJYQmhjbUYwYjNJcElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMbTl3ZEdsdmJuTXVZMjl0Y0dGeVlYUnZjaWhzWldaMExDQnlhV2RvZENrN1hHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQnNaV1owSUQwOVBTQnlhV2RvZEZ4dUlDQWdJQ0FnSUNCOGZDQW9kR2hwY3k1dmNIUnBiMjV6TG1sbmJtOXlaVU5oYzJVZ0ppWWdiR1ZtZEM1MGIweHZkMlZ5UTJGelpTZ3BJRDA5UFNCeWFXZG9kQzUwYjB4dmQyVnlRMkZ6WlNncEtUdGNiaUFnSUNCOVhHNGdJSDBzWEc0Z0lISmxiVzkyWlVWdGNIUjVLR0Z5Y21GNUtTQjdYRzRnSUNBZ2JHVjBJSEpsZENBOUlGdGRPMXh1SUNBZ0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dZWEp5WVhrdWJHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQWdJR2xtSUNoaGNuSmhlVnRwWFNrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFF1Y0hWemFDaGhjbkpoZVZ0cFhTazdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVJQ0FnSUhKbGRIVnliaUJ5WlhRN1hHNGdJSDBzWEc0Z0lHTmhjM1JKYm5CMWRDaDJZV3gxWlNrZ2UxeHVJQ0FnSUhKbGRIVnliaUIyWVd4MVpUdGNiaUFnZlN4Y2JpQWdkRzlyWlc1cGVtVW9kbUZzZFdVcElIdGNiaUFnSUNCeVpYUjFjbTRnZG1Gc2RXVXVjM0JzYVhRb0p5Y3BPMXh1SUNCOUxGeHVJQ0JxYjJsdUtHTm9ZWEp6S1NCN1hHNGdJQ0FnY21WMGRYSnVJR05vWVhKekxtcHZhVzRvSnljcE8xeHVJQ0I5WEc1OU8xeHVYRzVtZFc1amRHbHZiaUJpZFdsc1pGWmhiSFZsY3loa2FXWm1MQ0JqYjIxd2IyNWxiblJ6TENCdVpYZFRkSEpwYm1jc0lHOXNaRk4wY21sdVp5d2dkWE5sVEc5dVoyVnpkRlJ2YTJWdUtTQjdYRzRnSUd4bGRDQmpiMjF3YjI1bGJuUlFiM01nUFNBd0xGeHVJQ0FnSUNBZ1kyOXRjRzl1Wlc1MFRHVnVJRDBnWTI5dGNHOXVaVzUwY3k1c1pXNW5kR2dzWEc0Z0lDQWdJQ0J1WlhkUWIzTWdQU0F3TEZ4dUlDQWdJQ0FnYjJ4a1VHOXpJRDBnTUR0Y2JseHVJQ0JtYjNJZ0tEc2dZMjl0Y0c5dVpXNTBVRzl6SUR3Z1kyOXRjRzl1Wlc1MFRHVnVPeUJqYjIxd2IyNWxiblJRYjNNckt5a2dlMXh1SUNBZ0lHeGxkQ0JqYjIxd2IyNWxiblFnUFNCamIyMXdiMjVsYm5SelcyTnZiWEJ2Ym1WdWRGQnZjMTA3WEc0Z0lDQWdhV1lnS0NGamIyMXdiMjVsYm5RdWNtVnRiM1psWkNrZ2UxeHVJQ0FnSUNBZ2FXWWdLQ0ZqYjIxd2IyNWxiblF1WVdSa1pXUWdKaVlnZFhObFRHOXVaMlZ6ZEZSdmEyVnVLU0I3WEc0Z0lDQWdJQ0FnSUd4bGRDQjJZV3gxWlNBOUlHNWxkMU4wY21sdVp5NXpiR2xqWlNodVpYZFFiM01zSUc1bGQxQnZjeUFySUdOdmJYQnZibVZ1ZEM1amIzVnVkQ2s3WEc0Z0lDQWdJQ0FnSUhaaGJIVmxJRDBnZG1Gc2RXVXViV0Z3S0daMWJtTjBhVzl1S0haaGJIVmxMQ0JwS1NCN1hHNGdJQ0FnSUNBZ0lDQWdiR1YwSUc5c1pGWmhiSFZsSUQwZ2IyeGtVM1J5YVc1blcyOXNaRkJ2Y3lBcklHbGRPMXh1SUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJ2YkdSV1lXeDFaUzVzWlc1bmRHZ2dQaUIyWVd4MVpTNXNaVzVuZEdnZ1B5QnZiR1JXWVd4MVpTQTZJSFpoYkhWbE8xeHVJQ0FnSUNBZ0lDQjlLVHRjYmx4dUlDQWdJQ0FnSUNCamIyMXdiMjVsYm5RdWRtRnNkV1VnUFNCa2FXWm1MbXB2YVc0b2RtRnNkV1VwTzF4dUlDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnWTI5dGNHOXVaVzUwTG5aaGJIVmxJRDBnWkdsbVppNXFiMmx1S0c1bGQxTjBjbWx1Wnk1emJHbGpaU2h1WlhkUWIzTXNJRzVsZDFCdmN5QXJJR052YlhCdmJtVnVkQzVqYjNWdWRDa3BPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdibVYzVUc5eklDczlJR052YlhCdmJtVnVkQzVqYjNWdWREdGNibHh1SUNBZ0lDQWdMeThnUTI5dGJXOXVJR05oYzJWY2JpQWdJQ0FnSUdsbUlDZ2hZMjl0Y0c5dVpXNTBMbUZrWkdWa0tTQjdYRzRnSUNBZ0lDQWdJRzlzWkZCdmN5QXJQU0JqYjIxd2IyNWxiblF1WTI5MWJuUTdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUdOdmJYQnZibVZ1ZEM1MllXeDFaU0E5SUdScFptWXVhbTlwYmlodmJHUlRkSEpwYm1jdWMyeHBZMlVvYjJ4a1VHOXpMQ0J2YkdSUWIzTWdLeUJqYjIxd2IyNWxiblF1WTI5MWJuUXBLVHRjYmlBZ0lDQWdJRzlzWkZCdmN5QXJQU0JqYjIxd2IyNWxiblF1WTI5MWJuUTdYRzVjYmlBZ0lDQWdJQzh2SUZKbGRtVnljMlVnWVdSa0lHRnVaQ0J5WlcxdmRtVWdjMjhnY21WdGIzWmxjeUJoY21VZ2IzVjBjSFYwSUdacGNuTjBJSFJ2SUcxaGRHTm9JR052YlcxdmJpQmpiMjUyWlc1MGFXOXVYRzRnSUNBZ0lDQXZMeUJVYUdVZ1pHbG1abWx1WnlCaGJHZHZjbWwwYUcwZ2FYTWdkR2xsWkNCMGJ5QmhaR1FnZEdobGJpQnlaVzF2ZG1VZ2IzVjBjSFYwSUdGdVpDQjBhR2x6SUdseklIUm9aU0J6YVcxd2JHVnpkRnh1SUNBZ0lDQWdMeThnY205MWRHVWdkRzhnWjJWMElIUm9aU0JrWlhOcGNtVmtJRzkxZEhCMWRDQjNhWFJvSUcxcGJtbHRZV3dnYjNabGNtaGxZV1F1WEc0Z0lDQWdJQ0JwWmlBb1kyOXRjRzl1Wlc1MFVHOXpJQ1ltSUdOdmJYQnZibVZ1ZEhOYlkyOXRjRzl1Wlc1MFVHOXpJQzBnTVYwdVlXUmtaV1FwSUh0Y2JpQWdJQ0FnSUNBZ2JHVjBJSFJ0Y0NBOUlHTnZiWEJ2Ym1WdWRITmJZMjl0Y0c5dVpXNTBVRzl6SUMwZ01WMDdYRzRnSUNBZ0lDQWdJR052YlhCdmJtVnVkSE5iWTI5dGNHOXVaVzUwVUc5eklDMGdNVjBnUFNCamIyMXdiMjVsYm5SelcyTnZiWEJ2Ym1WdWRGQnZjMTA3WEc0Z0lDQWdJQ0FnSUdOdmJYQnZibVZ1ZEhOYlkyOXRjRzl1Wlc1MFVHOXpYU0E5SUhSdGNEdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQXZMeUJUY0dWamFXRnNJR05oYzJVZ2FHRnVaR3hsSUdadmNpQjNhR1Z1SUc5dVpTQjBaWEp0YVc1aGJDQnBjeUJwWjI1dmNtVmtJQ2hwTG1VdUlIZG9hWFJsYzNCaFkyVXBMbHh1SUNBdkx5QkdiM0lnZEdocGN5QmpZWE5sSUhkbElHMWxjbWRsSUhSb1pTQjBaWEp0YVc1aGJDQnBiblJ2SUhSb1pTQndjbWx2Y2lCemRISnBibWNnWVc1a0lHUnliM0FnZEdobElHTm9ZVzVuWlM1Y2JpQWdMeThnVkdocGN5QnBjeUJ2Ym14NUlHRjJZV2xzWVdKc1pTQm1iM0lnYzNSeWFXNW5JRzF2WkdVdVhHNGdJR3hsZENCc1lYTjBRMjl0Y0c5dVpXNTBJRDBnWTI5dGNHOXVaVzUwYzF0amIyMXdiMjVsYm5STVpXNGdMU0F4WFR0Y2JpQWdhV1lnS0dOdmJYQnZibVZ1ZEV4bGJpQStJREZjYmlBZ0lDQWdJQ1ltSUhSNWNHVnZaaUJzWVhOMFEyOXRjRzl1Wlc1MExuWmhiSFZsSUQwOVBTQW5jM1J5YVc1bkoxeHVJQ0FnSUNBZ0ppWWdLR3hoYzNSRGIyMXdiMjVsYm5RdVlXUmtaV1FnZkh3Z2JHRnpkRU52YlhCdmJtVnVkQzV5WlcxdmRtVmtLVnh1SUNBZ0lDQWdKaVlnWkdsbVppNWxjWFZoYkhNb0p5Y3NJR3hoYzNSRGIyMXdiMjVsYm5RdWRtRnNkV1VwS1NCN1hHNGdJQ0FnWTI5dGNHOXVaVzUwYzF0amIyMXdiMjVsYm5STVpXNGdMU0F5WFM1MllXeDFaU0FyUFNCc1lYTjBRMjl0Y0c5dVpXNTBMblpoYkhWbE8xeHVJQ0FnSUdOdmJYQnZibVZ1ZEhNdWNHOXdLQ2s3WEc0Z0lIMWNibHh1SUNCeVpYUjFjbTRnWTI5dGNHOXVaVzUwY3p0Y2JuMWNibHh1Wm5WdVkzUnBiMjRnWTJ4dmJtVlFZWFJvS0hCaGRHZ3BJSHRjYmlBZ2NtVjBkWEp1SUhzZ2JtVjNVRzl6T2lCd1lYUm9MbTVsZDFCdmN5d2dZMjl0Y0c5dVpXNTBjem9nY0dGMGFDNWpiMjF3YjI1bGJuUnpMbk5zYVdObEtEQXBJSDA3WEc1OVhHNGlYWDA9XG5cblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyd1c2Ugc3RyaWN0JztcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLmNoYXJhY3RlckRpZmYgPSB1bmRlZmluZWQ7XG5cdGV4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZkNoYXJzID0gZGlmZkNoYXJzO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2Jhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2Jhc2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYmFzZSk7XG5cblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5cdC8qaXN0YW5idWwgaWdub3JlIGVuZCovdmFyIGNoYXJhY3RlckRpZmYgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jaGFyYWN0ZXJEaWZmID0gbmV3IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fYmFzZTJbJ2RlZmF1bHQnXSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLygpO1xuXHRmdW5jdGlvbiBkaWZmQ2hhcnMob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpIHtcblx0ICByZXR1cm4gY2hhcmFjdGVyRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcblx0fVxuXHQvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTlrYVdabUwyTm9ZWEpoWTNSbGNpNXFjeUpkTENKdVlXMWxjeUk2V3lKa2FXWm1RMmhoY25NaUxDSmphR0Z5WVdOMFpYSkVhV1ptSWl3aWIyeGtVM1J5SWl3aWJtVjNVM1J5SWl3aWIzQjBhVzl1Y3lJc0ltUnBabVlpWFN3aWJXRndjR2x1WjNNaU9pSTdPenM3WjBOQlIyZENRU3hUTEVkQlFVRkJMRk03TzBGQlNHaENPenM3T3pzN2RVSkJSVThzU1VGQlRVTXNlVVpCUVdkQ0xIZEZRVUYwUWp0QlFVTkJMRk5CUVZORUxGTkJRVlFzUTBGQmJVSkZMRTFCUVc1Q0xFVkJRVEpDUXl4TlFVRXpRaXhGUVVGdFEwTXNUMEZCYmtNc1JVRkJORU03UVVGQlJTeFRRVUZQU0N4alFVRmpTU3hKUVVGa0xFTkJRVzFDU0N4TlFVRnVRaXhGUVVFeVFrTXNUVUZCTTBJc1JVRkJiVU5ETEU5QlFXNURMRU5CUVZBN1FVRkJjVVFpTENKbWFXeGxJam9pWTJoaGNtRmpkR1Z5TG1weklpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lhVzF3YjNKMElFUnBabVlnWm5KdmJTQW5MaTlpWVhObEp6dGNibHh1Wlhod2IzSjBJR052Ym5OMElHTm9ZWEpoWTNSbGNrUnBabVlnUFNCdVpYY2dSR2xtWmlncE8xeHVaWGh3YjNKMElHWjFibU4wYVc5dUlHUnBabVpEYUdGeWN5aHZiR1JUZEhJc0lHNWxkMU4wY2l3Z2IzQjBhVzl1Y3lrZ2V5QnlaWFIxY200Z1kyaGhjbUZqZEdWeVJHbG1aaTVrYVdabUtHOXNaRk4wY2l3Z2JtVjNVM1J5TENCdmNIUnBiMjV6S1RzZ2ZWeHVJbDE5XG5cblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyd1c2Ugc3RyaWN0JztcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLndvcmREaWZmID0gdW5kZWZpbmVkO1xuXHRleHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2RpZmZXb3JkcyA9IGRpZmZXb3Jkcztcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZldvcmRzV2l0aFNwYWNlID0gZGlmZldvcmRzV2l0aFNwYWNlO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2Jhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2Jhc2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYmFzZSk7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgZW5kKi92YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19wYXJhbXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8gLy8gQmFzZWQgb24gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW5fc2NyaXB0X2luX1VuaWNvZGVcblx0Ly9cblx0Ly8gUmFuZ2VzIGFuZCBleGNlcHRpb25zOlxuXHQvLyBMYXRpbi0xIFN1cHBsZW1lbnQsIDAwODDigJMwMEZGXG5cdC8vICAtIFUrMDBENyAgw5cgTXVsdGlwbGljYXRpb24gc2lnblxuXHQvLyAgLSBVKzAwRjcgIMO3IERpdmlzaW9uIHNpZ25cblx0Ly8gTGF0aW4gRXh0ZW5kZWQtQSwgMDEwMOKAkzAxN0Zcblx0Ly8gTGF0aW4gRXh0ZW5kZWQtQiwgMDE4MOKAkzAyNEZcblx0Ly8gSVBBIEV4dGVuc2lvbnMsIDAyNTDigJMwMkFGXG5cdC8vIFNwYWNpbmcgTW9kaWZpZXIgTGV0dGVycywgMDJCMOKAkzAyRkZcblx0Ly8gIC0gVSswMkM3ICDLhyAmIzcxMTsgIENhcm9uXG5cdC8vICAtIFUrMDJEOCAgy5ggJiM3Mjg7ICBCcmV2ZVxuXHQvLyAgLSBVKzAyRDkgIMuZICYjNzI5OyAgRG90IEFib3ZlXG5cdC8vICAtIFUrMDJEQSAgy5ogJiM3MzA7ICBSaW5nIEFib3ZlXG5cdC8vICAtIFUrMDJEQiAgy5sgJiM3MzE7ICBPZ29uZWtcblx0Ly8gIC0gVSswMkRDICDLnCAmIzczMjsgIFNtYWxsIFRpbGRlXG5cdC8vICAtIFUrMDJERCAgy50gJiM3MzM7ICBEb3VibGUgQWN1dGUgQWNjZW50XG5cdC8vIExhdGluIEV4dGVuZGVkIEFkZGl0aW9uYWwsIDFFMDDigJMxRUZGXG5cdHZhciBleHRlbmRlZFdvcmRDaGFycyA9IC9eW0EtWmEtelxceEMwLVxcdTAyQzZcXHUwMkM4LVxcdTAyRDdcXHUwMkRFLVxcdTAyRkZcXHUxRTAwLVxcdTFFRkZdKyQvO1xuXG5cdHZhciByZVdoaXRlc3BhY2UgPSAvXFxTLztcblxuXHR2YXIgd29yZERpZmYgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi93b3JkRGlmZiA9IG5ldyAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2Jhc2UyWydkZWZhdWx0J10gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8oKTtcblx0d29yZERpZmYuZXF1YWxzID0gZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7XG5cdCAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVDYXNlKSB7XG5cdCAgICBsZWZ0ID0gbGVmdC50b0xvd2VyQ2FzZSgpO1xuXHQgICAgcmlnaHQgPSByaWdodC50b0xvd2VyQ2FzZSgpO1xuXHQgIH1cblx0ICByZXR1cm4gbGVmdCA9PT0gcmlnaHQgfHwgdGhpcy5vcHRpb25zLmlnbm9yZVdoaXRlc3BhY2UgJiYgIXJlV2hpdGVzcGFjZS50ZXN0KGxlZnQpICYmICFyZVdoaXRlc3BhY2UudGVzdChyaWdodCk7XG5cdH07XG5cdHdvcmREaWZmLnRva2VuaXplID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgdmFyIHRva2VucyA9IHZhbHVlLnNwbGl0KC8oXFxzK3xcXGIpLyk7XG5cblx0ICAvLyBKb2luIHRoZSBib3VuZGFyeSBzcGxpdHMgdGhhdCB3ZSBkbyBub3QgY29uc2lkZXIgdG8gYmUgYm91bmRhcmllcy4gVGhpcyBpcyBwcmltYXJpbHkgdGhlIGV4dGVuZGVkIExhdGluIGNoYXJhY3RlciBzZXQuXG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoIC0gMTsgaSsrKSB7XG5cdCAgICAvLyBJZiB3ZSBoYXZlIGFuIGVtcHR5IHN0cmluZyBpbiB0aGUgbmV4dCBmaWVsZCBhbmQgd2UgaGF2ZSBvbmx5IHdvcmQgY2hhcnMgYmVmb3JlIGFuZCBhZnRlciwgbWVyZ2Vcblx0ICAgIGlmICghdG9rZW5zW2kgKyAxXSAmJiB0b2tlbnNbaSArIDJdICYmIGV4dGVuZGVkV29yZENoYXJzLnRlc3QodG9rZW5zW2ldKSAmJiBleHRlbmRlZFdvcmRDaGFycy50ZXN0KHRva2Vuc1tpICsgMl0pKSB7XG5cdCAgICAgIHRva2Vuc1tpXSArPSB0b2tlbnNbaSArIDJdO1xuXHQgICAgICB0b2tlbnMuc3BsaWNlKGkgKyAxLCAyKTtcblx0ICAgICAgaS0tO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHJldHVybiB0b2tlbnM7XG5cdH07XG5cblx0ZnVuY3Rpb24gZGlmZldvcmRzKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKSB7XG5cdCAgb3B0aW9ucyA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oMCwgX3BhcmFtcy5nZW5lcmF0ZU9wdGlvbnMpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovKG9wdGlvbnMsIHsgaWdub3JlV2hpdGVzcGFjZTogdHJ1ZSB9KTtcblx0ICByZXR1cm4gd29yZERpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG5cdH1cblxuXHRmdW5jdGlvbiBkaWZmV29yZHNXaXRoU3BhY2Uob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpIHtcblx0ICByZXR1cm4gd29yZERpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG5cdH1cblx0Ly8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5a2FXWm1MM2R2Y21RdWFuTWlYU3dpYm1GdFpYTWlPbHNpWkdsbVpsZHZjbVJ6SWl3aVpHbG1abGR2Y21SelYybDBhRk53WVdObElpd2laWGgwWlc1a1pXUlhiM0prUTJoaGNuTWlMQ0p5WlZkb2FYUmxjM0JoWTJVaUxDSjNiM0prUkdsbVppSXNJbVZ4ZFdGc2N5SXNJbXhsWm5RaUxDSnlhV2RvZENJc0ltOXdkR2x2Ym5NaUxDSnBaMjV2Y21WRFlYTmxJaXdpZEc5TWIzZGxja05oYzJVaUxDSnBaMjV2Y21WWGFHbDBaWE53WVdObElpd2lkR1Z6ZENJc0luUnZhMlZ1YVhwbElpd2lkbUZzZFdVaUxDSjBiMnRsYm5NaUxDSnpjR3hwZENJc0lta2lMQ0pzWlc1bmRHZ2lMQ0p6Y0d4cFkyVWlMQ0p2YkdSVGRISWlMQ0p1WlhkVGRISWlMQ0prYVdabUlsMHNJbTFoY0hCcGJtZHpJam9pT3pzN08yZERRVzFFWjBKQkxGTXNSMEZCUVVFc1V6dDVSRUZMUVVNc2EwSXNSMEZCUVVFc2EwSTdPMEZCZUVSb1FqczdPenQxUWtGRFFUczdPenQzUWtGRlFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFTeEpRVUZOUXl4dlFrRkJiMElzSzBSQlFURkNPenRCUVVWQkxFbEJRVTFETEdWQlFXVXNTVUZCY2tJN08wRkJSVThzU1VGQlRVTXNLMFZCUVZjc2QwVkJRV3BDTzBGQlExQkJMRk5CUVZORExFMUJRVlFzUjBGQmEwSXNWVUZCVTBNc1NVRkJWQ3hGUVVGbFF5eExRVUZtTEVWQlFYTkNPMEZCUTNSRExFMUJRVWtzUzBGQlMwTXNUMEZCVEN4RFFVRmhReXhWUVVGcVFpeEZRVUUyUWp0QlFVTXpRa2dzVjBGQlQwRXNTMEZCUzBrc1YwRkJUQ3hGUVVGUU8wRkJRMEZJTEZsQlFWRkJMRTFCUVUxSExGZEJRVTRzUlVGQlVqdEJRVU5FTzBGQlEwUXNVMEZCVDBvc1UwRkJVME1zUzBGQlZDeEpRVUZ0UWl4TFFVRkxReXhQUVVGTUxFTkJRV0ZITEdkQ1FVRmlMRWxCUVdsRExFTkJRVU5TTEdGQlFXRlRMRWxCUVdJc1EwRkJhMEpPTEVsQlFXeENMRU5CUVd4RExFbEJRVFpFTEVOQlFVTklMR0ZCUVdGVExFbEJRV0lzUTBGQmEwSk1MRXRCUVd4Q0xFTkJRWGhHTzBGQlEwUXNRMEZPUkR0QlFVOUJTQ3hUUVVGVFV5eFJRVUZVTEVkQlFXOUNMRlZCUVZORExFdEJRVlFzUlVGQlowSTdRVUZEYkVNc1RVRkJTVU1zVTBGQlUwUXNUVUZCVFVVc1MwRkJUaXhEUVVGWkxGVkJRVm9zUTBGQllqczdRVUZGUVR0QlFVTkJMRTlCUVVzc1NVRkJTVU1zU1VGQlNTeERRVUZpTEVWQlFXZENRU3hKUVVGSlJpeFBRVUZQUnl4TlFVRlFMRWRCUVdkQ0xFTkJRWEJETEVWQlFYVkRSQ3hIUVVGMlF5eEZRVUUwUXp0QlFVTXhRenRCUVVOQkxGRkJRVWtzUTBGQlEwWXNUMEZCVDBVc1NVRkJTU3hEUVVGWUxFTkJRVVFzU1VGQmEwSkdMRTlCUVU5RkxFbEJRVWtzUTBGQldDeERRVUZzUWl4SlFVTkxaaXhyUWtGQmEwSlZMRWxCUVd4Q0xFTkJRWFZDUnl4UFFVRlBSU3hEUVVGUUxFTkJRWFpDTEVOQlJFd3NTVUZGUzJZc2EwSkJRV3RDVlN4SlFVRnNRaXhEUVVGMVFrY3NUMEZCVDBVc1NVRkJTU3hEUVVGWUxFTkJRWFpDTEVOQlJsUXNSVUZGWjBRN1FVRkRPVU5HTEdGQlFVOUZMRU5CUVZBc1MwRkJZVVlzVDBGQlQwVXNTVUZCU1N4RFFVRllMRU5CUVdJN1FVRkRRVVlzWVVGQlQwa3NUVUZCVUN4RFFVRmpSaXhKUVVGSkxFTkJRV3hDTEVWQlFYRkNMRU5CUVhKQ08wRkJRMEZCTzBGQlEwUTdRVUZEUmpzN1FVRkZSQ3hUUVVGUFJpeE5RVUZRTzBGQlEwUXNRMEZvUWtRN08wRkJhMEpQTEZOQlFWTm1MRk5CUVZRc1EwRkJiVUp2UWl4TlFVRnVRaXhGUVVFeVFrTXNUVUZCTTBJc1JVRkJiVU5pTEU5QlFXNURMRVZCUVRSRE8wRkJRMnBFUVN4WlFVRlZMRGhGUVVGblFrRXNUMEZCYUVJc1JVRkJlVUlzUlVGQlEwY3NhMEpCUVd0Q0xFbEJRVzVDTEVWQlFYcENMRU5CUVZZN1FVRkRRU3hUUVVGUFVDeFRRVUZUYTBJc1NVRkJWQ3hEUVVGalJpeE5RVUZrTEVWQlFYTkNReXhOUVVGMFFpeEZRVUU0UW1Jc1QwRkJPVUlzUTBGQlVEdEJRVU5FT3p0QlFVVk5MRk5CUVZOUUxHdENRVUZVTEVOQlFUUkNiVUlzVFVGQk5VSXNSVUZCYjBORExFMUJRWEJETEVWQlFUUkRZaXhQUVVFMVF5eEZRVUZ4UkR0QlFVTXhSQ3hUUVVGUFNpeFRRVUZUYTBJc1NVRkJWQ3hEUVVGalJpeE5RVUZrTEVWQlFYTkNReXhOUVVGMFFpeEZRVUU0UW1Jc1QwRkJPVUlzUTBGQlVEdEJRVU5FSWl3aVptbHNaU0k2SW5kdmNtUXVhbk1pTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKcGJYQnZjblFnUkdsbVppQm1jbTl0SUNjdUwySmhjMlVuTzF4dWFXMXdiM0owSUh0blpXNWxjbUYwWlU5d2RHbHZibk45SUdaeWIyMGdKeTR1TDNWMGFXd3ZjR0Z5WVcxekp6dGNibHh1THk4Z1FtRnpaV1FnYjI0Z2FIUjBjSE02THk5bGJpNTNhV3RwY0dWa2FXRXViM0puTDNkcGEya3ZUR0YwYVc1ZmMyTnlhWEIwWDJsdVgxVnVhV052WkdWY2JpOHZYRzR2THlCU1lXNW5aWE1nWVc1a0lHVjRZMlZ3ZEdsdmJuTTZYRzR2THlCTVlYUnBiaTB4SUZOMWNIQnNaVzFsYm5Rc0lEQXdPRERpZ0pNd01FWkdYRzR2THlBZ0xTQlZLekF3UkRjZ0lNT1hJRTExYkhScGNHeHBZMkYwYVc5dUlITnBaMjVjYmk4dklDQXRJRlVyTURCR055QWd3N2NnUkdsMmFYTnBiMjRnYzJsbmJseHVMeThnVEdGMGFXNGdSWGgwWlc1a1pXUXRRU3dnTURFd01PS0FrekF4TjBaY2JpOHZJRXhoZEdsdUlFVjRkR1Z1WkdWa0xVSXNJREF4T0REaWdKTXdNalJHWEc0dkx5QkpVRUVnUlhoMFpXNXphVzl1Y3l3Z01ESTFNT0tBa3pBeVFVWmNiaTh2SUZOd1lXTnBibWNnVFc5a2FXWnBaWElnVEdWMGRHVnljeXdnTURKQ01PS0FrekF5UmtaY2JpOHZJQ0F0SUZVck1ESkROeUFneTRjZ0ppTTNNVEU3SUNCRFlYSnZibHh1THk4Z0lDMGdWU3N3TWtRNElDRExtQ0FtSXpjeU9Ec2dJRUp5WlhabFhHNHZMeUFnTFNCVkt6QXlSRGtnSU11WklDWWpOekk1T3lBZ1JHOTBJRUZpYjNabFhHNHZMeUFnTFNCVkt6QXlSRUVnSU11YUlDWWpOek13T3lBZ1VtbHVaeUJCWW05MlpWeHVMeThnSUMwZ1ZTc3dNa1JDSUNETG15QW1JemN6TVRzZ0lFOW5iMjVsYTF4dUx5OGdJQzBnVlNzd01rUkRJQ0RMbkNBbUl6Y3pNanNnSUZOdFlXeHNJRlJwYkdSbFhHNHZMeUFnTFNCVkt6QXlSRVFnSU11ZElDWWpOek16T3lBZ1JHOTFZbXhsSUVGamRYUmxJRUZqWTJWdWRGeHVMeThnVEdGMGFXNGdSWGgwWlc1a1pXUWdRV1JrYVhScGIyNWhiQ3dnTVVVd01PS0FrekZGUmtaY2JtTnZibk4wSUdWNGRHVnVaR1ZrVjI5eVpFTm9ZWEp6SUQwZ0wxNWJZUzE2UVMxYVhGeDFlME13ZlMxY1hIVjdSa1o5WEZ4MWUwUTRmUzFjWEhWN1JqWjlYRngxZTBZNGZTMWNYSFY3TWtNMmZWeGNkWHN5UXpoOUxWeGNkWHN5UkRkOVhGeDFlekpFUlgwdFhGeDFlekpHUm4xY1hIVjdNVVV3TUgwdFhGeDFlekZGUmtaOVhTc2tMM1U3WEc1Y2JtTnZibk4wSUhKbFYyaHBkR1Z6Y0dGalpTQTlJQzljWEZNdk8xeHVYRzVsZUhCdmNuUWdZMjl1YzNRZ2QyOXlaRVJwWm1ZZ1BTQnVaWGNnUkdsbVppZ3BPMXh1ZDI5eVpFUnBabVl1WlhGMVlXeHpJRDBnWm5WdVkzUnBiMjRvYkdWbWRDd2djbWxuYUhRcElIdGNiaUFnYVdZZ0tIUm9hWE11YjNCMGFXOXVjeTVwWjI1dmNtVkRZWE5sS1NCN1hHNGdJQ0FnYkdWbWRDQTlJR3hsWm5RdWRHOU1iM2RsY2tOaGMyVW9LVHRjYmlBZ0lDQnlhV2RvZENBOUlISnBaMmgwTG5SdlRHOTNaWEpEWVhObEtDazdYRzRnSUgxY2JpQWdjbVYwZFhKdUlHeGxablFnUFQwOUlISnBaMmgwSUh4OElDaDBhR2x6TG05d2RHbHZibk11YVdkdWIzSmxWMmhwZEdWemNHRmpaU0FtSmlBaGNtVlhhR2wwWlhOd1lXTmxMblJsYzNRb2JHVm1kQ2tnSmlZZ0lYSmxWMmhwZEdWemNHRmpaUzUwWlhOMEtISnBaMmgwS1NrN1hHNTlPMXh1ZDI5eVpFUnBabVl1ZEc5clpXNXBlbVVnUFNCbWRXNWpkR2x2YmloMllXeDFaU2tnZTF4dUlDQnNaWFFnZEc5clpXNXpJRDBnZG1Gc2RXVXVjM0JzYVhRb0x5aGNYSE1yZkZ4Y1lpa3ZLVHRjYmx4dUlDQXZMeUJLYjJsdUlIUm9aU0JpYjNWdVpHRnllU0J6Y0d4cGRITWdkR2hoZENCM1pTQmtieUJ1YjNRZ1kyOXVjMmxrWlhJZ2RHOGdZbVVnWW05MWJtUmhjbWxsY3k0Z1ZHaHBjeUJwY3lCd2NtbHRZWEpwYkhrZ2RHaGxJR1Y0ZEdWdVpHVmtJRXhoZEdsdUlHTm9ZWEpoWTNSbGNpQnpaWFF1WEc0Z0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dkRzlyWlc1ekxteGxibWQwYUNBdElERTdJR2tyS3lrZ2UxeHVJQ0FnSUM4dklFbG1JSGRsSUdoaGRtVWdZVzRnWlcxd2RIa2djM1J5YVc1bklHbHVJSFJvWlNCdVpYaDBJR1pwWld4a0lHRnVaQ0IzWlNCb1lYWmxJRzl1YkhrZ2QyOXlaQ0JqYUdGeWN5QmlaV1p2Y21VZ1lXNWtJR0ZtZEdWeUxDQnRaWEpuWlZ4dUlDQWdJR2xtSUNnaGRHOXJaVzV6VzJrZ0t5QXhYU0FtSmlCMGIydGxibk5iYVNBcklESmRYRzRnSUNBZ0lDQWdJQ0FnSmlZZ1pYaDBaVzVrWldSWGIzSmtRMmhoY25NdWRHVnpkQ2gwYjJ0bGJuTmJhVjBwWEc0Z0lDQWdJQ0FnSUNBZ0ppWWdaWGgwWlc1a1pXUlhiM0prUTJoaGNuTXVkR1Z6ZENoMGIydGxibk5iYVNBcklESmRLU2tnZTF4dUlDQWdJQ0FnZEc5clpXNXpXMmxkSUNzOUlIUnZhMlZ1YzF0cElDc2dNbDA3WEc0Z0lDQWdJQ0IwYjJ0bGJuTXVjM0JzYVdObEtHa2dLeUF4TENBeUtUdGNiaUFnSUNBZ0lHa3RMVHRjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0J5WlhSMWNtNGdkRzlyWlc1ek8xeHVmVHRjYmx4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUdScFptWlhiM0prY3lodmJHUlRkSElzSUc1bGQxTjBjaXdnYjNCMGFXOXVjeWtnZTF4dUlDQnZjSFJwYjI1eklEMGdaMlZ1WlhKaGRHVlBjSFJwYjI1ektHOXdkR2x2Ym5Nc0lIdHBaMjV2Y21WWGFHbDBaWE53WVdObE9pQjBjblZsZlNrN1hHNGdJSEpsZEhWeWJpQjNiM0prUkdsbVppNWthV1ptS0c5c1pGTjBjaXdnYm1WM1UzUnlMQ0J2Y0hScGIyNXpLVHRjYm4xY2JseHVaWGh3YjNKMElHWjFibU4wYVc5dUlHUnBabVpYYjNKa2MxZHBkR2hUY0dGalpTaHZiR1JUZEhJc0lHNWxkMU4wY2l3Z2IzQjBhVzl1Y3lrZ2UxeHVJQ0J5WlhSMWNtNGdkMjl5WkVScFptWXVaR2xtWmlodmJHUlRkSElzSUc1bGQxTjBjaXdnYjNCMGFXOXVjeWs3WEc1OVhHNGlYWDA9XG5cblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyd1c2Ugc3RyaWN0JztcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2dlbmVyYXRlT3B0aW9ucyA9IGdlbmVyYXRlT3B0aW9ucztcblx0ZnVuY3Rpb24gZ2VuZXJhdGVPcHRpb25zKG9wdGlvbnMsIGRlZmF1bHRzKSB7XG5cdCAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICBkZWZhdWx0cy5jYWxsYmFjayA9IG9wdGlvbnM7XG5cdCAgfSBlbHNlIGlmIChvcHRpb25zKSB7XG5cdCAgICBmb3IgKHZhciBuYW1lIGluIG9wdGlvbnMpIHtcblx0ICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0ICAgICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcblx0ICAgICAgICBkZWZhdWx0c1tuYW1lXSA9IG9wdGlvbnNbbmFtZV07XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9XG5cdCAgcmV0dXJuIGRlZmF1bHRzO1xuXHR9XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OTFkR2xzTDNCaGNtRnRjeTVxY3lKZExDSnVZVzFsY3lJNld5Sm5aVzVsY21GMFpVOXdkR2x2Ym5NaUxDSnZjSFJwYjI1eklpd2laR1ZtWVhWc2RITWlMQ0pqWVd4c1ltRmpheUlzSW01aGJXVWlMQ0pvWVhOUGQyNVFjbTl3WlhKMGVTSmRMQ0p0WVhCd2FXNW5jeUk2SWpzN08yZERRVUZuUWtFc1pTeEhRVUZCUVN4bE8wRkJRVlFzVTBGQlUwRXNaVUZCVkN4RFFVRjVRa01zVDBGQmVrSXNSVUZCYTBORExGRkJRV3hETEVWQlFUUkRPMEZCUTJwRUxFMUJRVWtzVDBGQlQwUXNUMEZCVUN4TFFVRnRRaXhWUVVGMlFpeEZRVUZ0UXp0QlFVTnFRME1zWVVGQlUwTXNVVUZCVkN4SFFVRnZRa1lzVDBGQmNFSTdRVUZEUkN4SFFVWkVMRTFCUlU4c1NVRkJTVUVzVDBGQlNpeEZRVUZoTzBGQlEyeENMRk5CUVVzc1NVRkJTVWNzU1VGQlZDeEpRVUZwUWtnc1QwRkJha0lzUlVGQk1FSTdRVUZEZUVJN1FVRkRRU3hWUVVGSlFTeFJRVUZSU1N4alFVRlNMRU5CUVhWQ1JDeEpRVUYyUWl4RFFVRktMRVZCUVd0RE8wRkJRMmhEUml4cFFrRkJVMFVzU1VGQlZDeEpRVUZwUWtnc1VVRkJVVWNzU1VGQlVpeERRVUZxUWp0QlFVTkVPMEZCUTBZN1FVRkRSanRCUVVORUxGTkJRVTlHTEZGQlFWQTdRVUZEUkNJc0ltWnBiR1VpT2lKd1lYSmhiWE11YW5NaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SmxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1oyVnVaWEpoZEdWUGNIUnBiMjV6S0c5d2RHbHZibk1zSUdSbFptRjFiSFJ6S1NCN1hHNGdJR2xtSUNoMGVYQmxiMllnYjNCMGFXOXVjeUE5UFQwZ0oyWjFibU4wYVc5dUp5a2dlMXh1SUNBZ0lHUmxabUYxYkhSekxtTmhiR3hpWVdOcklEMGdiM0IwYVc5dWN6dGNiaUFnZlNCbGJITmxJR2xtSUNodmNIUnBiMjV6S1NCN1hHNGdJQ0FnWm05eUlDaHNaWFFnYm1GdFpTQnBiaUJ2Y0hScGIyNXpLU0I3WEc0Z0lDQWdJQ0F2S2lCcGMzUmhibUoxYkNCcFoyNXZjbVVnWld4elpTQXFMMXh1SUNBZ0lDQWdhV1lnS0c5d2RHbHZibk11YUdGelQzZHVVSEp2Y0dWeWRIa29ibUZ0WlNrcElIdGNiaUFnSUNBZ0lDQWdaR1ZtWVhWc2RITmJibUZ0WlYwZ1BTQnZjSFJwYjI1elcyNWhiV1ZkTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdaR1ZtWVhWc2RITTdYRzU5WEc0aVhYMD1cblxuXG4vKioqLyB9KSxcbi8qIDUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovJ3VzZSBzdHJpY3QnO1xuXG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHMubGluZURpZmYgPSB1bmRlZmluZWQ7XG5cdGV4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZkxpbmVzID0gZGlmZkxpbmVzO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9kaWZmVHJpbW1lZExpbmVzID0gZGlmZlRyaW1tZWRMaW5lcztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19iYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9iYXNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Jhc2UpO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIGVuZCovdmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fcGFyYW1zID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5cdC8qaXN0YW5idWwgaWdub3JlIGVuZCovdmFyIGxpbmVEaWZmID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovbGluZURpZmYgPSBuZXcgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19iYXNlMlsnZGVmYXVsdCddIC8qaXN0YW5idWwgaWdub3JlIGVuZCovKCk7XG5cdGxpbmVEaWZmLnRva2VuaXplID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgdmFyIHJldExpbmVzID0gW10sXG5cdCAgICAgIGxpbmVzQW5kTmV3bGluZXMgPSB2YWx1ZS5zcGxpdCgvKFxcbnxcXHJcXG4pLyk7XG5cblx0ICAvLyBJZ25vcmUgdGhlIGZpbmFsIGVtcHR5IHRva2VuIHRoYXQgb2NjdXJzIGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIGEgbmV3IGxpbmVcblx0ICBpZiAoIWxpbmVzQW5kTmV3bGluZXNbbGluZXNBbmROZXdsaW5lcy5sZW5ndGggLSAxXSkge1xuXHQgICAgbGluZXNBbmROZXdsaW5lcy5wb3AoKTtcblx0ICB9XG5cblx0ICAvLyBNZXJnZSB0aGUgY29udGVudCBhbmQgbGluZSBzZXBhcmF0b3JzIGludG8gc2luZ2xlIHRva2Vuc1xuXHQgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXNBbmROZXdsaW5lcy5sZW5ndGg7IGkrKykge1xuXHQgICAgdmFyIGxpbmUgPSBsaW5lc0FuZE5ld2xpbmVzW2ldO1xuXG5cdCAgICBpZiAoaSAlIDIgJiYgIXRoaXMub3B0aW9ucy5uZXdsaW5lSXNUb2tlbikge1xuXHQgICAgICByZXRMaW5lc1tyZXRMaW5lcy5sZW5ndGggLSAxXSArPSBsaW5lO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVXaGl0ZXNwYWNlKSB7XG5cdCAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpO1xuXHQgICAgICB9XG5cdCAgICAgIHJldExpbmVzLnB1c2gobGluZSk7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgcmV0dXJuIHJldExpbmVzO1xuXHR9O1xuXG5cdGZ1bmN0aW9uIGRpZmZMaW5lcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHtcblx0ICByZXR1cm4gbGluZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spO1xuXHR9XG5cdGZ1bmN0aW9uIGRpZmZUcmltbWVkTGluZXMob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKSB7XG5cdCAgdmFyIG9wdGlvbnMgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKDAsIF9wYXJhbXMuZ2VuZXJhdGVPcHRpb25zKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyhjYWxsYmFjaywgeyBpZ25vcmVXaGl0ZXNwYWNlOiB0cnVlIH0pO1xuXHQgIHJldHVybiBsaW5lRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcblx0fVxuXHQvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTlrYVdabUwyeHBibVV1YW5NaVhTd2libUZ0WlhNaU9sc2laR2xtWmt4cGJtVnpJaXdpWkdsbVpsUnlhVzF0WldSTWFXNWxjeUlzSW14cGJtVkVhV1ptSWl3aWRHOXJaVzVwZW1VaUxDSjJZV3gxWlNJc0luSmxkRXhwYm1Weklpd2liR2x1WlhOQmJtUk9aWGRzYVc1bGN5SXNJbk53YkdsMElpd2liR1Z1WjNSb0lpd2ljRzl3SWl3aWFTSXNJbXhwYm1VaUxDSnZjSFJwYjI1eklpd2libVYzYkdsdVpVbHpWRzlyWlc0aUxDSnBaMjV2Y21WWGFHbDBaWE53WVdObElpd2lkSEpwYlNJc0luQjFjMmdpTENKdmJHUlRkSElpTENKdVpYZFRkSElpTENKallXeHNZbUZqYXlJc0ltUnBabVlpWFN3aWJXRndjR2x1WjNNaU9pSTdPenM3WjBOQk9FSm5Ra0VzVXl4SFFVRkJRU3hUTzNsRVFVTkJReXhuUWl4SFFVRkJRU3huUWpzN1FVRXZRbWhDT3pzN08zVkNRVU5CT3pzN08zVkNRVVZQTEVsQlFVMURMQ3RGUVVGWExIZEZRVUZxUWp0QlFVTlFRU3hUUVVGVFF5eFJRVUZVTEVkQlFXOUNMRlZCUVZORExFdEJRVlFzUlVGQlowSTdRVUZEYkVNc1RVRkJTVU1zVjBGQlZ5eEZRVUZtTzBGQlFVRXNUVUZEU1VNc2JVSkJRVzFDUml4TlFVRk5SeXhMUVVGT0xFTkJRVmtzVjBGQldpeERRVVIyUWpzN1FVRkhRVHRCUVVOQkxFMUJRVWtzUTBGQlEwUXNhVUpCUVdsQ1FTeHBRa0ZCYVVKRkxFMUJRV3BDTEVkQlFUQkNMRU5CUVRORExFTkJRVXdzUlVGQmIwUTdRVUZEYkVSR0xIRkNRVUZwUWtjc1IwRkJha0k3UVVGRFJEczdRVUZGUkR0QlFVTkJMRTlCUVVzc1NVRkJTVU1zU1VGQlNTeERRVUZpTEVWQlFXZENRU3hKUVVGSlNpeHBRa0ZCYVVKRkxFMUJRWEpETEVWQlFUWkRSU3hIUVVFM1F5eEZRVUZyUkR0QlFVTm9SQ3hSUVVGSlF5eFBRVUZQVEN4cFFrRkJhVUpKTEVOQlFXcENMRU5CUVZnN08wRkJSVUVzVVVGQlNVRXNTVUZCU1N4RFFVRktMRWxCUVZNc1EwRkJReXhMUVVGTFJTeFBRVUZNTEVOQlFXRkRMR05CUVROQ0xFVkJRVEpETzBGQlEzcERVaXhsUVVGVFFTeFRRVUZUUnl4TlFVRlVMRWRCUVd0Q0xFTkJRVE5DTEV0QlFXbERSeXhKUVVGcVF6dEJRVU5FTEV0QlJrUXNUVUZGVHp0QlFVTk1MRlZCUVVrc1MwRkJTME1zVDBGQlRDeERRVUZoUlN4blFrRkJha0lzUlVGQmJVTTdRVUZEYWtOSUxHVkJRVTlCTEV0QlFVdEpMRWxCUVV3c1JVRkJVRHRCUVVORU8wRkJRMFJXTEdWQlFWTlhMRWxCUVZRc1EwRkJZMHdzU1VGQlpEdEJRVU5FTzBGQlEwWTdPMEZCUlVRc1UwRkJUMDRzVVVGQlVEdEJRVU5FTEVOQmVFSkVPenRCUVRCQ1R5eFRRVUZUVEN4VFFVRlVMRU5CUVcxQ2FVSXNUVUZCYmtJc1JVRkJNa0pETEUxQlFUTkNMRVZCUVcxRFF5eFJRVUZ1UXl4RlFVRTJRenRCUVVGRkxGTkJRVTlxUWl4VFFVRlRhMElzU1VGQlZDeERRVUZqU0N4TlFVRmtMRVZCUVhOQ1F5eE5RVUYwUWl4RlFVRTRRa01zVVVGQk9VSXNRMEZCVUR0QlFVRnBSRHRCUVVOb1J5eFRRVUZUYkVJc1owSkJRVlFzUTBGQk1FSm5RaXhOUVVFeFFpeEZRVUZyUTBNc1RVRkJiRU1zUlVGQk1FTkRMRkZCUVRGRExFVkJRVzlFTzBGQlEzcEVMRTFCUVVsUUxGVkJRVlVzT0VWQlFXZENUeXhSUVVGb1FpeEZRVUV3UWl4RlFVRkRUQ3hyUWtGQmEwSXNTVUZCYmtJc1JVRkJNVUlzUTBGQlpEdEJRVU5CTEZOQlFVOWFMRk5CUVZOclFpeEpRVUZVTEVOQlFXTklMRTFCUVdRc1JVRkJjMEpETEUxQlFYUkNMRVZCUVRoQ1RpeFBRVUU1UWl4RFFVRlFPMEZCUTBRaUxDSm1hV3hsSWpvaWJHbHVaUzVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCRWFXWm1JR1p5YjIwZ0p5NHZZbUZ6WlNjN1hHNXBiWEJ2Y25RZ2UyZGxibVZ5WVhSbFQzQjBhVzl1YzMwZ1puSnZiU0FuTGk0dmRYUnBiQzl3WVhKaGJYTW5PMXh1WEc1bGVIQnZjblFnWTI5dWMzUWdiR2x1WlVScFptWWdQU0J1WlhjZ1JHbG1aaWdwTzF4dWJHbHVaVVJwWm1ZdWRHOXJaVzVwZW1VZ1BTQm1kVzVqZEdsdmJpaDJZV3gxWlNrZ2UxeHVJQ0JzWlhRZ2NtVjBUR2x1WlhNZ1BTQmJYU3hjYmlBZ0lDQWdJR3hwYm1WelFXNWtUbVYzYkdsdVpYTWdQU0IyWVd4MVpTNXpjR3hwZENndktGeGNibnhjWEhKY1hHNHBMeWs3WEc1Y2JpQWdMeThnU1dkdWIzSmxJSFJvWlNCbWFXNWhiQ0JsYlhCMGVTQjBiMnRsYmlCMGFHRjBJRzlqWTNWeWN5QnBaaUIwYUdVZ2MzUnlhVzVuSUdWdVpITWdkMmwwYUNCaElHNWxkeUJzYVc1bFhHNGdJR2xtSUNnaGJHbHVaWE5CYm1ST1pYZHNhVzVsYzF0c2FXNWxjMEZ1WkU1bGQyeHBibVZ6TG14bGJtZDBhQ0F0SURGZEtTQjdYRzRnSUNBZ2JHbHVaWE5CYm1ST1pYZHNhVzVsY3k1d2IzQW9LVHRjYmlBZ2ZWeHVYRzRnSUM4dklFMWxjbWRsSUhSb1pTQmpiMjUwWlc1MElHRnVaQ0JzYVc1bElITmxjR0Z5WVhSdmNuTWdhVzUwYnlCemFXNW5iR1VnZEc5clpXNXpYRzRnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z2JHbHVaWE5CYm1ST1pYZHNhVzVsY3k1c1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lHeGxkQ0JzYVc1bElEMGdiR2x1WlhOQmJtUk9aWGRzYVc1bGMxdHBYVHRjYmx4dUlDQWdJR2xtSUNocElDVWdNaUFtSmlBaGRHaHBjeTV2Y0hScGIyNXpMbTVsZDJ4cGJtVkpjMVJ2YTJWdUtTQjdYRzRnSUNBZ0lDQnlaWFJNYVc1bGMxdHlaWFJNYVc1bGN5NXNaVzVuZEdnZ0xTQXhYU0FyUFNCc2FXNWxPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCcFppQW9kR2hwY3k1dmNIUnBiMjV6TG1sbmJtOXlaVmRvYVhSbGMzQmhZMlVwSUh0Y2JpQWdJQ0FnSUNBZ2JHbHVaU0E5SUd4cGJtVXVkSEpwYlNncE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2NtVjBUR2x1WlhNdWNIVnphQ2hzYVc1bEtUdGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQnlaWFIxY200Z2NtVjBUR2x1WlhNN1hHNTlPMXh1WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWkdsbVpreHBibVZ6S0c5c1pGTjBjaXdnYm1WM1UzUnlMQ0JqWVd4c1ltRmpheWtnZXlCeVpYUjFjbTRnYkdsdVpVUnBabVl1WkdsbVppaHZiR1JUZEhJc0lHNWxkMU4wY2l3Z1kyRnNiR0poWTJzcE95QjlYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdaR2xtWmxSeWFXMXRaV1JNYVc1bGN5aHZiR1JUZEhJc0lHNWxkMU4wY2l3Z1kyRnNiR0poWTJzcElIdGNiaUFnYkdWMElHOXdkR2x2Ym5NZ1BTQm5aVzVsY21GMFpVOXdkR2x2Ym5Nb1kyRnNiR0poWTJzc0lIdHBaMjV2Y21WWGFHbDBaWE53WVdObE9pQjBjblZsZlNrN1hHNGdJSEpsZEhWeWJpQnNhVzVsUkdsbVppNWthV1ptS0c5c1pGTjBjaXdnYm1WM1UzUnlMQ0J2Y0hScGIyNXpLVHRjYm4xY2JpSmRmUT09XG5cblxuLyoqKi8gfSksXG4vKiA2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyd1c2Ugc3RyaWN0JztcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLnNlbnRlbmNlRGlmZiA9IHVuZGVmaW5lZDtcblx0ZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9kaWZmU2VudGVuY2VzID0gZGlmZlNlbnRlbmNlcztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19iYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9iYXNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Jhc2UpO1xuXG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3ZhciBzZW50ZW5jZURpZmYgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9zZW50ZW5jZURpZmYgPSBuZXcgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19iYXNlMlsnZGVmYXVsdCddIC8qaXN0YW5idWwgaWdub3JlIGVuZCovKCk7XG5cdHNlbnRlbmNlRGlmZi50b2tlbml6ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgIHJldHVybiB2YWx1ZS5zcGxpdCgvKFxcUy4rP1suIT9dKSg/PVxccyt8JCkvKTtcblx0fTtcblxuXHRmdW5jdGlvbiBkaWZmU2VudGVuY2VzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykge1xuXHQgIHJldHVybiBzZW50ZW5jZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spO1xuXHR9XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OWthV1ptTDNObGJuUmxibU5sTG1weklsMHNJbTVoYldWeklqcGJJbVJwWm1aVFpXNTBaVzVqWlhNaUxDSnpaVzUwWlc1alpVUnBabVlpTENKMGIydGxibWw2WlNJc0luWmhiSFZsSWl3aWMzQnNhWFFpTENKdmJHUlRkSElpTENKdVpYZFRkSElpTENKallXeHNZbUZqYXlJc0ltUnBabVlpWFN3aWJXRndjR2x1WjNNaU9pSTdPenM3WjBOQlVXZENRU3hoTEVkQlFVRkJMR0U3TzBGQlVtaENPenM3T3pzN2RVSkJSMDhzU1VGQlRVTXNkVVpCUVdVc2QwVkJRWEpDTzBGQlExQkJMR0ZCUVdGRExGRkJRV0lzUjBGQmQwSXNWVUZCVTBNc1MwRkJWQ3hGUVVGblFqdEJRVU4wUXl4VFFVRlBRU3hOUVVGTlF5eExRVUZPTEVOQlFWa3NkVUpCUVZvc1EwRkJVRHRCUVVORUxFTkJSa1E3TzBGQlNVOHNVMEZCVTBvc1lVRkJWQ3hEUVVGMVFrc3NUVUZCZGtJc1JVRkJLMEpETEUxQlFTOUNMRVZCUVhWRFF5eFJRVUYyUXl4RlFVRnBSRHRCUVVGRkxGTkJRVTlPTEdGQlFXRlBMRWxCUVdJc1EwRkJhMEpJTEUxQlFXeENMRVZCUVRCQ1F5eE5RVUV4UWl4RlFVRnJRME1zVVVGQmJFTXNRMEZCVUR0QlFVRnhSQ0lzSW1acGJHVWlPaUp6Wlc1MFpXNWpaUzVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCRWFXWm1JR1p5YjIwZ0p5NHZZbUZ6WlNjN1hHNWNibHh1Wlhod2IzSjBJR052Ym5OMElITmxiblJsYm1ObFJHbG1aaUE5SUc1bGR5QkVhV1ptS0NrN1hHNXpaVzUwWlc1alpVUnBabVl1ZEc5clpXNXBlbVVnUFNCbWRXNWpkR2x2YmloMllXeDFaU2tnZTF4dUlDQnlaWFIxY200Z2RtRnNkV1V1YzNCc2FYUW9MeWhjWEZNdUt6OWJMaUUvWFNrb1B6MWNYSE1yZkNRcEx5azdYRzU5TzF4dVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1pHbG1abE5sYm5SbGJtTmxjeWh2YkdSVGRISXNJRzVsZDFOMGNpd2dZMkZzYkdKaFkyc3BJSHNnY21WMGRYSnVJSE5sYm5SbGJtTmxSR2xtWmk1a2FXWm1LRzlzWkZOMGNpd2dibVYzVTNSeUxDQmpZV3hzWW1GamF5azdJSDFjYmlKZGZRPT1cblxuXG4vKioqLyB9KSxcbi8qIDcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovJ3VzZSBzdHJpY3QnO1xuXG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHMuY3NzRGlmZiA9IHVuZGVmaW5lZDtcblx0ZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9kaWZmQ3NzID0gZGlmZkNzcztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19iYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9iYXNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Jhc2UpO1xuXG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3ZhciBjc3NEaWZmID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovY3NzRGlmZiA9IG5ldyAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2Jhc2UyWydkZWZhdWx0J10gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8oKTtcblx0Y3NzRGlmZi50b2tlbml6ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgIHJldHVybiB2YWx1ZS5zcGxpdCgvKFt7fTo7LF18XFxzKykvKTtcblx0fTtcblxuXHRmdW5jdGlvbiBkaWZmQ3NzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykge1xuXHQgIHJldHVybiBjc3NEaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKTtcblx0fVxuXHQvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTlrYVdabUwyTnpjeTVxY3lKZExDSnVZVzFsY3lJNld5SmthV1ptUTNOeklpd2lZM056UkdsbVppSXNJblJ2YTJWdWFYcGxJaXdpZG1Gc2RXVWlMQ0p6Y0d4cGRDSXNJbTlzWkZOMGNpSXNJbTVsZDFOMGNpSXNJbU5oYkd4aVlXTnJJaXdpWkdsbVppSmRMQ0p0WVhCd2FXNW5jeUk2SWpzN096dG5RMEZQWjBKQkxFOHNSMEZCUVVFc1R6czdRVUZRYUVJN096czdPenQxUWtGRlR5eEpRVUZOUXl3MlJVRkJWU3gzUlVGQmFFSTdRVUZEVUVFc1VVRkJVVU1zVVVGQlVpeEhRVUZ0UWl4VlFVRlRReXhMUVVGVUxFVkJRV2RDTzBGQlEycERMRk5CUVU5QkxFMUJRVTFETEV0QlFVNHNRMEZCV1N4bFFVRmFMRU5CUVZBN1FVRkRSQ3hEUVVaRU96dEJRVWxQTEZOQlFWTktMRTlCUVZRc1EwRkJhVUpMTEUxQlFXcENMRVZCUVhsQ1F5eE5RVUY2UWl4RlFVRnBRME1zVVVGQmFrTXNSVUZCTWtNN1FVRkJSU3hUUVVGUFRpeFJRVUZSVHl4SlFVRlNMRU5CUVdGSUxFMUJRV0lzUlVGQmNVSkRMRTFCUVhKQ0xFVkJRVFpDUXl4UlFVRTNRaXhEUVVGUU8wRkJRV2RFSWl3aVptbHNaU0k2SW1OemN5NXFjeUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSW1sdGNHOXlkQ0JFYVdabUlHWnliMjBnSnk0dlltRnpaU2M3WEc1Y2JtVjRjRzl5ZENCamIyNXpkQ0JqYzNORWFXWm1JRDBnYm1WM0lFUnBabVlvS1R0Y2JtTnpjMFJwWm1ZdWRHOXJaVzVwZW1VZ1BTQm1kVzVqZEdsdmJpaDJZV3gxWlNrZ2UxeHVJQ0J5WlhSMWNtNGdkbUZzZFdVdWMzQnNhWFFvTHloYmUzMDZPeXhkZkZ4Y2N5c3BMeWs3WEc1OU8xeHVYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdaR2xtWmtOemN5aHZiR1JUZEhJc0lHNWxkMU4wY2l3Z1kyRnNiR0poWTJzcElIc2djbVYwZFhKdUlHTnpjMFJwWm1ZdVpHbG1aaWh2YkdSVGRISXNJRzVsZDFOMGNpd2dZMkZzYkdKaFkyc3BPeUI5WEc0aVhYMD1cblxuXG4vKioqLyB9KSxcbi8qIDggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovJ3VzZSBzdHJpY3QnO1xuXG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHMuanNvbkRpZmYgPSB1bmRlZmluZWQ7XG5cblx0dmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5cdGV4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZkpzb24gPSBkaWZmSnNvbjtcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovY2Fub25pY2FsaXplID0gY2Fub25pY2FsaXplO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2Jhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2Jhc2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYmFzZSk7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgZW5kKi92YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19saW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5cdC8qaXN0YW5idWwgaWdub3JlIGVuZCovdmFyIG9iamVjdFByb3RvdHlwZVRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuXHR2YXIganNvbkRpZmYgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9qc29uRGlmZiA9IG5ldyAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2Jhc2UyWydkZWZhdWx0J10gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8oKTtcblx0Ly8gRGlzY3JpbWluYXRlIGJldHdlZW4gdHdvIGxpbmVzIG9mIHByZXR0eS1wcmludGVkLCBzZXJpYWxpemVkIEpTT04gd2hlcmUgb25lIG9mIHRoZW0gaGFzIGFcblx0Ly8gZGFuZ2xpbmcgY29tbWEgYW5kIHRoZSBvdGhlciBkb2Vzbid0LiBUdXJucyBvdXQgaW5jbHVkaW5nIHRoZSBkYW5nbGluZyBjb21tYSB5aWVsZHMgdGhlIG5pY2VzdCBvdXRwdXQ6XG5cdGpzb25EaWZmLnVzZUxvbmdlc3RUb2tlbiA9IHRydWU7XG5cblx0anNvbkRpZmYudG9rZW5pemUgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2xpbmUubGluZURpZmYgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8udG9rZW5pemU7XG5cdGpzb25EaWZmLmNhc3RJbnB1dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi91bmRlZmluZWRSZXBsYWNlbWVudCA9IHRoaXMub3B0aW9ucy51bmRlZmluZWRSZXBsYWNlbWVudDtcblxuXG5cdCAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KGNhbm9uaWNhbGl6ZSh2YWx1ZSksIGZ1bmN0aW9uIChrLCB2KSB7XG5cdCAgICBpZiAodHlwZW9mIHYgPT09ICd1bmRlZmluZWQnKSB7XG5cdCAgICAgIHJldHVybiB1bmRlZmluZWRSZXBsYWNlbWVudDtcblx0ICAgIH1cblxuXHQgICAgcmV0dXJuIHY7XG5cdCAgfSwgJyAgJyk7XG5cdH07XG5cdGpzb25EaWZmLmVxdWFscyA9IGZ1bmN0aW9uIChsZWZ0LCByaWdodCkge1xuXHQgIHJldHVybiAoLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19iYXNlMlsnZGVmYXVsdCddIC8qaXN0YW5idWwgaWdub3JlIGVuZCovLnByb3RvdHlwZS5lcXVhbHMuY2FsbChqc29uRGlmZiwgbGVmdC5yZXBsYWNlKC8sKFtcXHJcXG5dKS9nLCAnJDEnKSwgcmlnaHQucmVwbGFjZSgvLChbXFxyXFxuXSkvZywgJyQxJykpXG5cdCAgKTtcblx0fTtcblxuXHRmdW5jdGlvbiBkaWZmSnNvbihvbGRPYmosIG5ld09iaiwgb3B0aW9ucykge1xuXHQgIHJldHVybiBqc29uRGlmZi5kaWZmKG9sZE9iaiwgbmV3T2JqLCBvcHRpb25zKTtcblx0fVxuXG5cdC8vIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgcHJlc2VuY2Ugb2YgY2lyY3VsYXIgcmVmZXJlbmNlcyBieSBiYWlsaW5nIG91dCB3aGVuIGVuY291bnRlcmluZyBhblxuXHQvLyBvYmplY3QgdGhhdCBpcyBhbHJlYWR5IG9uIHRoZSBcInN0YWNrXCIgb2YgaXRlbXMgYmVpbmcgcHJvY2Vzc2VkLlxuXHRmdW5jdGlvbiBjYW5vbmljYWxpemUob2JqLCBzdGFjaywgcmVwbGFjZW1lbnRTdGFjaykge1xuXHQgIHN0YWNrID0gc3RhY2sgfHwgW107XG5cdCAgcmVwbGFjZW1lbnRTdGFjayA9IHJlcGxhY2VtZW50U3RhY2sgfHwgW107XG5cblx0ICB2YXIgaSA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92b2lkIDAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0ICBmb3IgKGkgPSAwOyBpIDwgc3RhY2subGVuZ3RoOyBpICs9IDEpIHtcblx0ICAgIGlmIChzdGFja1tpXSA9PT0gb2JqKSB7XG5cdCAgICAgIHJldHVybiByZXBsYWNlbWVudFN0YWNrW2ldO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHZhciBjYW5vbmljYWxpemVkT2JqID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZvaWQgMCAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQgIGlmICgnW29iamVjdCBBcnJheV0nID09PSBvYmplY3RQcm90b3R5cGVUb1N0cmluZy5jYWxsKG9iaikpIHtcblx0ICAgIHN0YWNrLnB1c2gob2JqKTtcblx0ICAgIGNhbm9uaWNhbGl6ZWRPYmogPSBuZXcgQXJyYXkob2JqLmxlbmd0aCk7XG5cdCAgICByZXBsYWNlbWVudFN0YWNrLnB1c2goY2Fub25pY2FsaXplZE9iaik7XG5cdCAgICBmb3IgKGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSArPSAxKSB7XG5cdCAgICAgIGNhbm9uaWNhbGl6ZWRPYmpbaV0gPSBjYW5vbmljYWxpemUob2JqW2ldLCBzdGFjaywgcmVwbGFjZW1lbnRTdGFjayk7XG5cdCAgICB9XG5cdCAgICBzdGFjay5wb3AoKTtcblx0ICAgIHJlcGxhY2VtZW50U3RhY2sucG9wKCk7XG5cdCAgICByZXR1cm4gY2Fub25pY2FsaXplZE9iajtcblx0ICB9XG5cblx0ICBpZiAob2JqICYmIG9iai50b0pTT04pIHtcblx0ICAgIG9iaiA9IG9iai50b0pTT04oKTtcblx0ICB9XG5cblx0ICBpZiAoIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8odHlwZW9mIC8qaXN0YW5idWwgaWdub3JlIGVuZCovb2JqID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihvYmopKSA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsKSB7XG5cdCAgICBzdGFjay5wdXNoKG9iaik7XG5cdCAgICBjYW5vbmljYWxpemVkT2JqID0ge307XG5cdCAgICByZXBsYWNlbWVudFN0YWNrLnB1c2goY2Fub25pY2FsaXplZE9iaik7XG5cdCAgICB2YXIgc29ydGVkS2V5cyA9IFtdLFxuXHQgICAgICAgIGtleSA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92b2lkIDAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cdCAgICBmb3IgKGtleSBpbiBvYmopIHtcblx0ICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0ICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdCAgICAgICAgc29ydGVkS2V5cy5wdXNoKGtleSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHNvcnRlZEtleXMuc29ydCgpO1xuXHQgICAgZm9yIChpID0gMDsgaSA8IHNvcnRlZEtleXMubGVuZ3RoOyBpICs9IDEpIHtcblx0ICAgICAga2V5ID0gc29ydGVkS2V5c1tpXTtcblx0ICAgICAgY2Fub25pY2FsaXplZE9ialtrZXldID0gY2Fub25pY2FsaXplKG9ialtrZXldLCBzdGFjaywgcmVwbGFjZW1lbnRTdGFjayk7XG5cdCAgICB9XG5cdCAgICBzdGFjay5wb3AoKTtcblx0ICAgIHJlcGxhY2VtZW50U3RhY2sucG9wKCk7XG5cdCAgfSBlbHNlIHtcblx0ICAgIGNhbm9uaWNhbGl6ZWRPYmogPSBvYmo7XG5cdCAgfVxuXHQgIHJldHVybiBjYW5vbmljYWxpemVkT2JqO1xuXHR9XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OWthV1ptTDJwemIyNHVhbk1pWFN3aWJtRnRaWE1pT2xzaVpHbG1aa3B6YjI0aUxDSmpZVzV2Ym1sallXeHBlbVVpTENKdlltcGxZM1JRY205MGIzUjVjR1ZVYjFOMGNtbHVaeUlzSWs5aWFtVmpkQ0lzSW5CeWIzUnZkSGx3WlNJc0luUnZVM1J5YVc1bklpd2lhbk52YmtScFptWWlMQ0oxYzJWTWIyNW5aWE4wVkc5clpXNGlMQ0owYjJ0bGJtbDZaU0lzSW1OaGMzUkpibkIxZENJc0luWmhiSFZsSWl3aWRXNWtaV1pwYm1Wa1VtVndiR0ZqWlcxbGJuUWlMQ0p2Y0hScGIyNXpJaXdpU2xOUFRpSXNJbk4wY21sdVoybG1lU0lzSW1zaUxDSjJJaXdpWlhGMVlXeHpJaXdpYkdWbWRDSXNJbkpwWjJoMElpd2lZMkZzYkNJc0luSmxjR3hoWTJVaUxDSnZiR1JQWW1vaUxDSnVaWGRQWW1vaUxDSmthV1ptSWl3aWIySnFJaXdpYzNSaFkyc2lMQ0p5WlhCc1lXTmxiV1Z1ZEZOMFlXTnJJaXdpYVNJc0lteGxibWQwYUNJc0ltTmhibTl1YVdOaGJHbDZaV1JQWW1vaUxDSndkWE5vSWl3aVFYSnlZWGtpTENKd2IzQWlMQ0owYjBwVFQwNGlMQ0p6YjNKMFpXUkxaWGx6SWl3aWEyVjVJaXdpYUdGelQzZHVVSEp2Y0dWeWRIa2lMQ0p6YjNKMElsMHNJbTFoY0hCcGJtZHpJam9pT3pzN096czdPMmREUVRKQ1owSkJMRkVzUjBGQlFVRXNVVHQ1UkVGSlFVTXNXU3hIUVVGQlFTeFpPenRCUVM5Q2FFSTdPenM3ZFVKQlEwRTdPenM3ZFVKQlJVRXNTVUZCVFVNc01FSkJRVEJDUXl4UFFVRlBReXhUUVVGUUxFTkJRV2xDUXl4UlFVRnFSRHM3UVVGSFR5eEpRVUZOUXl3clJVRkJWeXgzUlVGQmFrSTdRVUZEVUR0QlFVTkJPMEZCUTBGQkxGTkJRVk5ETEdWQlFWUXNSMEZCTWtJc1NVRkJNMEk3TzBGQlJVRkVMRk5CUVZORkxGRkJRVlFzUjBGQmIwSXNaMFZCUVZOQkxGRkJRVGRDTzBGQlEwRkdMRk5CUVZOSExGTkJRVlFzUjBGQmNVSXNWVUZCVTBNc1MwRkJWQ3hGUVVGblFqdEJRVUZCTEhORVFVTTFRa01zYjBKQlJEUkNMRWRCUTBvc1MwRkJTME1zVDBGRVJDeERRVU0xUWtRc2IwSkJSRFJDT3pzN1FVRkhia01zVTBGQlR5eFBRVUZQUkN4TFFVRlFMRXRCUVdsQ0xGRkJRV3BDTEVkQlFUUkNRU3hMUVVFMVFpeEhRVUZ2UTBjc1MwRkJTME1zVTBGQlRDeERRVUZsWWl4aFFVRmhVeXhMUVVGaUxFTkJRV1lzUlVGQmIwTXNWVUZCVTBzc1EwRkJWQ3hGUVVGWlF5eERRVUZhTEVWQlFXVTdRVUZETlVZc1VVRkJTU3hQUVVGUFFTeERRVUZRTEV0QlFXRXNWMEZCYWtJc1JVRkJPRUk3UVVGRE5VSXNZVUZCVDB3c2IwSkJRVkE3UVVGRFJEczdRVUZGUkN4WFFVRlBTeXhEUVVGUU8wRkJRMFFzUjBGT01FTXNSVUZOZUVNc1NVRk9kME1zUTBGQk0wTTdRVUZQUkN4RFFWWkVPMEZCVjBGV0xGTkJRVk5YTEUxQlFWUXNSMEZCYTBJc1ZVRkJVME1zU1VGQlZDeEZRVUZsUXl4TFFVRm1MRVZCUVhOQ08wRkJRM1JETEZOQlFVOHNiMFZCUVV0bUxGTkJRVXdzUTBGQlpXRXNUVUZCWml4RFFVRnpRa2NzU1VGQmRFSXNRMEZCTWtKa0xGRkJRVE5DTEVWQlFYRkRXU3hMUVVGTFJ5eFBRVUZNTEVOQlFXRXNXVUZCWWl4RlFVRXlRaXhKUVVFelFpeERRVUZ5UXl4RlFVRjFSVVlzVFVGQlRVVXNUMEZCVGl4RFFVRmpMRmxCUVdRc1JVRkJORUlzU1VGQk5VSXNRMEZCZGtVN1FVRkJVRHRCUVVORUxFTkJSa1E3TzBGQlNVOHNVMEZCVTNKQ0xGRkJRVlFzUTBGQmEwSnpRaXhOUVVGc1FpeEZRVUV3UWtNc1RVRkJNVUlzUlVGQmEwTllMRTlCUVd4RExFVkJRVEpETzBGQlFVVXNVMEZCVDA0c1UwRkJVMnRDTEVsQlFWUXNRMEZCWTBZc1RVRkJaQ3hGUVVGelFrTXNUVUZCZEVJc1JVRkJPRUpZTEU5QlFUbENMRU5CUVZBN1FVRkJaMFE3TzBGQlJYQkhPMEZCUTBFN1FVRkRUeXhUUVVGVFdDeFpRVUZVTEVOQlFYTkNkMElzUjBGQmRFSXNSVUZCTWtKRExFdEJRVE5DTEVWQlFXdERReXhuUWtGQmJFTXNSVUZCYjBRN1FVRkRla1JFTEZWQlFWRkJMRk5CUVZNc1JVRkJha0k3UVVGRFFVTXNjVUpCUVcxQ1FTeHZRa0ZCYjBJc1JVRkJka003TzBGQlJVRXNUVUZCU1VNc2JVTkJRVW83TzBGQlJVRXNUMEZCUzBFc1NVRkJTU3hEUVVGVUxFVkJRVmxCTEVsQlFVbEdMRTFCUVUxSExFMUJRWFJDTEVWQlFUaENSQ3hMUVVGTExFTkJRVzVETEVWQlFYTkRPMEZCUTNCRExGRkJRVWxHTEUxQlFVMUZMRU5CUVU0c1RVRkJZVWdzUjBGQmFrSXNSVUZCYzBJN1FVRkRjRUlzWVVGQlQwVXNhVUpCUVdsQ1F5eERRVUZxUWl4RFFVRlFPMEZCUTBRN1FVRkRSanM3UVVGRlJDeE5RVUZKUlN4clJFRkJTanM3UVVGRlFTeE5RVUZKTEhGQ1FVRnhRalZDTEhkQ1FVRjNRbXRDTEVsQlFYaENMRU5CUVRaQ1N5eEhRVUUzUWl4RFFVRjZRaXhGUVVFMFJEdEJRVU14UkVNc1ZVRkJUVXNzU1VGQlRpeERRVUZYVGl4SFFVRllPMEZCUTBGTExIVkNRVUZ0UWl4SlFVRkpSU3hMUVVGS0xFTkJRVlZRTEVsQlFVbEpMRTFCUVdRc1EwRkJia0k3UVVGRFFVWXNjVUpCUVdsQ1NTeEpRVUZxUWl4RFFVRnpRa1FzWjBKQlFYUkNPMEZCUTBFc1UwRkJTMFlzU1VGQlNTeERRVUZVTEVWQlFWbEJMRWxCUVVsSUxFbEJRVWxKTEUxQlFYQkNMRVZCUVRSQ1JDeExRVUZMTEVOQlFXcERMRVZCUVc5RE8wRkJRMnhEUlN4MVFrRkJhVUpHTEVOQlFXcENMRWxCUVhOQ00wSXNZVUZCWVhkQ0xFbEJRVWxITEVOQlFVb3NRMEZCWWl4RlFVRnhRa1lzUzBGQmNrSXNSVUZCTkVKRExHZENRVUUxUWl4RFFVRjBRanRCUVVORU8wRkJRMFJFTEZWQlFVMVBMRWRCUVU0N1FVRkRRVTRzY1VKQlFXbENUU3hIUVVGcVFqdEJRVU5CTEZkQlFVOUlMR2RDUVVGUU8wRkJRMFE3TzBGQlJVUXNUVUZCU1V3c1QwRkJUMEVzU1VGQlNWTXNUVUZCWml4RlFVRjFRanRCUVVOeVFsUXNWVUZCVFVFc1NVRkJTVk1zVFVGQlNpeEZRVUZPTzBGQlEwUTdPMEZCUlVRc1RVRkJTU3g1UkVGQlQxUXNSMEZCVUN4NVEwRkJUMEVzUjBGQlVDeFBRVUZsTEZGQlFXWXNTVUZCTWtKQkxGRkJRVkVzU1VGQmRrTXNSVUZCTmtNN1FVRkRNME5ETEZWQlFVMUxMRWxCUVU0c1EwRkJWMDRzUjBGQldEdEJRVU5CU3l4MVFrRkJiVUlzUlVGQmJrSTdRVUZEUVVnc2NVSkJRV2xDU1N4SlFVRnFRaXhEUVVGelFrUXNaMEpCUVhSQ08wRkJRMEVzVVVGQlNVc3NZVUZCWVN4RlFVRnFRanRCUVVGQkxGRkJRMGxETEhGRFFVUktPMEZCUlVFc1UwRkJTMEVzUjBGQlRDeEpRVUZaV0N4SFFVRmFMRVZCUVdsQ08wRkJRMlk3UVVGRFFTeFZRVUZKUVN4SlFVRkpXU3hqUVVGS0xFTkJRVzFDUkN4SFFVRnVRaXhEUVVGS0xFVkJRVFpDTzBGQlF6TkNSQ3h0UWtGQlYwb3NTVUZCV0N4RFFVRm5Ra3NzUjBGQmFFSTdRVUZEUkR0QlFVTkdPMEZCUTBSRUxHVkJRVmRITEVsQlFWZzdRVUZEUVN4VFFVRkxWaXhKUVVGSkxFTkJRVlFzUlVGQldVRXNTVUZCU1U4c1YwRkJWMDRzVFVGQk0wSXNSVUZCYlVORUxFdEJRVXNzUTBGQmVFTXNSVUZCTWtNN1FVRkRla05STEZsQlFVMUVMRmRCUVZkUUxFTkJRVmdzUTBGQlRqdEJRVU5CUlN4MVFrRkJhVUpOTEVkQlFXcENMRWxCUVhkQ2JrTXNZVUZCWVhkQ0xFbEJRVWxYTEVkQlFVb3NRMEZCWWl4RlFVRjFRbFlzUzBGQmRrSXNSVUZCT0VKRExHZENRVUU1UWl4RFFVRjRRanRCUVVORU8wRkJRMFJFTEZWQlFVMVBMRWRCUVU0N1FVRkRRVTRzY1VKQlFXbENUU3hIUVVGcVFqdEJRVU5FTEVkQmJrSkVMRTFCYlVKUE8wRkJRMHhJTEhWQ1FVRnRRa3dzUjBGQmJrSTdRVUZEUkR0QlFVTkVMRk5CUVU5TExHZENRVUZRTzBGQlEwUWlMQ0ptYVd4bElqb2lhbk52Ymk1cWN5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbWx0Y0c5eWRDQkVhV1ptSUdaeWIyMGdKeTR2WW1GelpTYzdYRzVwYlhCdmNuUWdlMnhwYm1WRWFXWm1mU0JtY205dElDY3VMMnhwYm1Vbk8xeHVYRzVqYjI1emRDQnZZbXBsWTNSUWNtOTBiM1I1Y0dWVWIxTjBjbWx1WnlBOUlFOWlhbVZqZEM1d2NtOTBiM1I1Y0dVdWRHOVRkSEpwYm1jN1hHNWNibHh1Wlhod2IzSjBJR052Ym5OMElHcHpiMjVFYVdabUlEMGdibVYzSUVScFptWW9LVHRjYmk4dklFUnBjMk55YVcxcGJtRjBaU0JpWlhSM1pXVnVJSFIzYnlCc2FXNWxjeUJ2WmlCd2NtVjBkSGt0Y0hKcGJuUmxaQ3dnYzJWeWFXRnNhWHBsWkNCS1UwOU9JSGRvWlhKbElHOXVaU0J2WmlCMGFHVnRJR2hoY3lCaFhHNHZMeUJrWVc1bmJHbHVaeUJqYjIxdFlTQmhibVFnZEdobElHOTBhR1Z5SUdSdlpYTnVKM1F1SUZSMWNtNXpJRzkxZENCcGJtTnNkV1JwYm1jZ2RHaGxJR1JoYm1kc2FXNW5JR052YlcxaElIbHBaV3hrY3lCMGFHVWdibWxqWlhOMElHOTFkSEIxZERwY2JtcHpiMjVFYVdabUxuVnpaVXh2Ym1kbGMzUlViMnRsYmlBOUlIUnlkV1U3WEc1Y2JtcHpiMjVFYVdabUxuUnZhMlZ1YVhwbElEMGdiR2x1WlVScFptWXVkRzlyWlc1cGVtVTdYRzVxYzI5dVJHbG1aaTVqWVhOMFNXNXdkWFFnUFNCbWRXNWpkR2x2YmloMllXeDFaU2tnZTF4dUlDQmpiMjV6ZENCN2RXNWtaV1pwYm1Wa1VtVndiR0ZqWlcxbGJuUjlJRDBnZEdocGN5NXZjSFJwYjI1ek8xeHVYRzRnSUhKbGRIVnliaUIwZVhCbGIyWWdkbUZzZFdVZ1BUMDlJQ2R6ZEhKcGJtY25JRDhnZG1Gc2RXVWdPaUJLVTA5T0xuTjBjbWx1WjJsbWVTaGpZVzV2Ym1sallXeHBlbVVvZG1Gc2RXVXBMQ0JtZFc1amRHbHZiaWhyTENCMktTQjdYRzRnSUNBZ2FXWWdLSFI1Y0dWdlppQjJJRDA5UFNBbmRXNWtaV1pwYm1Wa0p5a2dlMXh1SUNBZ0lDQWdjbVYwZFhKdUlIVnVaR1ZtYVc1bFpGSmxjR3hoWTJWdFpXNTBPMXh1SUNBZ0lIMWNibHh1SUNBZ0lISmxkSFZ5YmlCMk8xeHVJQ0I5TENBbklDQW5LVHRjYm4wN1hHNXFjMjl1UkdsbVppNWxjWFZoYkhNZ1BTQm1kVzVqZEdsdmJpaHNaV1owTENCeWFXZG9kQ2tnZTF4dUlDQnlaWFIxY200Z1JHbG1aaTV3Y205MGIzUjVjR1V1WlhGMVlXeHpMbU5oYkd3b2FuTnZia1JwWm1Zc0lHeGxablF1Y21Wd2JHRmpaU2d2TENoYlhGeHlYRnh1WFNrdlp5d2dKeVF4Snlrc0lISnBaMmgwTG5KbGNHeGhZMlVvTHl3b1cxeGNjbHhjYmwwcEwyY3NJQ2NrTVNjcEtUdGNibjA3WEc1Y2JtVjRjRzl5ZENCbWRXNWpkR2x2YmlCa2FXWm1Tbk52YmlodmJHUlBZbW9zSUc1bGQwOWlhaXdnYjNCMGFXOXVjeWtnZXlCeVpYUjFjbTRnYW5OdmJrUnBabVl1WkdsbVppaHZiR1JQWW1vc0lHNWxkMDlpYWl3Z2IzQjBhVzl1Y3lrN0lIMWNibHh1THk4Z1ZHaHBjeUJtZFc1amRHbHZiaUJvWVc1a2JHVnpJSFJvWlNCd2NtVnpaVzVqWlNCdlppQmphWEpqZFd4aGNpQnlaV1psY21WdVkyVnpJR0o1SUdKaGFXeHBibWNnYjNWMElIZG9aVzRnWlc1amIzVnVkR1Z5YVc1bklHRnVYRzR2THlCdlltcGxZM1FnZEdoaGRDQnBjeUJoYkhKbFlXUjVJRzl1SUhSb1pTQmNJbk4wWVdOclhDSWdiMllnYVhSbGJYTWdZbVZwYm1jZ2NISnZZMlZ6YzJWa0xseHVaWGh3YjNKMElHWjFibU4wYVc5dUlHTmhibTl1YVdOaGJHbDZaU2h2WW1vc0lITjBZV05yTENCeVpYQnNZV05sYldWdWRGTjBZV05yS1NCN1hHNGdJSE4wWVdOcklEMGdjM1JoWTJzZ2ZId2dXMTA3WEc0Z0lISmxjR3hoWTJWdFpXNTBVM1JoWTJzZ1BTQnlaWEJzWVdObGJXVnVkRk4wWVdOcklIeDhJRnRkTzF4dVhHNGdJR3hsZENCcE8xeHVYRzRnSUdadmNpQW9hU0E5SURBN0lHa2dQQ0J6ZEdGamF5NXNaVzVuZEdnN0lHa2dLejBnTVNrZ2UxeHVJQ0FnSUdsbUlDaHpkR0ZqYTF0cFhTQTlQVDBnYjJKcUtTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z2NtVndiR0ZqWlcxbGJuUlRkR0ZqYTF0cFhUdGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQnNaWFFnWTJGdWIyNXBZMkZzYVhwbFpFOWlhanRjYmx4dUlDQnBaaUFvSjF0dlltcGxZM1FnUVhKeVlYbGRKeUE5UFQwZ2IySnFaV04wVUhKdmRHOTBlWEJsVkc5VGRISnBibWN1WTJGc2JDaHZZbW9wS1NCN1hHNGdJQ0FnYzNSaFkyc3VjSFZ6YUNodlltb3BPMXh1SUNBZ0lHTmhibTl1YVdOaGJHbDZaV1JQWW1vZ1BTQnVaWGNnUVhKeVlYa29iMkpxTG14bGJtZDBhQ2s3WEc0Z0lDQWdjbVZ3YkdGalpXMWxiblJUZEdGamF5NXdkWE5vS0dOaGJtOXVhV05oYkdsNlpXUlBZbW9wTzF4dUlDQWdJR1p2Y2lBb2FTQTlJREE3SUdrZ1BDQnZZbW91YkdWdVozUm9PeUJwSUNzOUlERXBJSHRjYmlBZ0lDQWdJR05oYm05dWFXTmhiR2w2WldSUFltcGJhVjBnUFNCallXNXZibWxqWVd4cGVtVW9iMkpxVzJsZExDQnpkR0ZqYXl3Z2NtVndiR0ZqWlcxbGJuUlRkR0ZqYXlrN1hHNGdJQ0FnZlZ4dUlDQWdJSE4wWVdOckxuQnZjQ2dwTzF4dUlDQWdJSEpsY0d4aFkyVnRaVzUwVTNSaFkyc3VjRzl3S0NrN1hHNGdJQ0FnY21WMGRYSnVJR05oYm05dWFXTmhiR2w2WldSUFltbzdYRzRnSUgxY2JseHVJQ0JwWmlBb2IySnFJQ1ltSUc5aWFpNTBiMHBUVDA0cElIdGNiaUFnSUNCdlltb2dQU0J2WW1vdWRHOUtVMDlPS0NrN1hHNGdJSDFjYmx4dUlDQnBaaUFvZEhsd1pXOW1JRzlpYWlBOVBUMGdKMjlpYW1WamRDY2dKaVlnYjJKcUlDRTlQU0J1ZFd4c0tTQjdYRzRnSUNBZ2MzUmhZMnN1Y0hWemFDaHZZbW9wTzF4dUlDQWdJR05oYm05dWFXTmhiR2w2WldSUFltb2dQU0I3ZlR0Y2JpQWdJQ0J5WlhCc1lXTmxiV1Z1ZEZOMFlXTnJMbkIxYzJnb1kyRnViMjVwWTJGc2FYcGxaRTlpYWlrN1hHNGdJQ0FnYkdWMElITnZjblJsWkV0bGVYTWdQU0JiWFN4Y2JpQWdJQ0FnSUNBZ2EyVjVPMXh1SUNBZ0lHWnZjaUFvYTJWNUlHbHVJRzlpYWlrZ2UxeHVJQ0FnSUNBZ0x5b2dhWE4wWVc1aWRXd2dhV2R1YjNKbElHVnNjMlVnS2k5Y2JpQWdJQ0FnSUdsbUlDaHZZbW91YUdGelQzZHVVSEp2Y0dWeWRIa29hMlY1S1NrZ2UxeHVJQ0FnSUNBZ0lDQnpiM0owWldSTFpYbHpMbkIxYzJnb2EyVjVLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzRnSUNBZ2MyOXlkR1ZrUzJWNWN5NXpiM0owS0NrN1hHNGdJQ0FnWm05eUlDaHBJRDBnTURzZ2FTQThJSE52Y25SbFpFdGxlWE11YkdWdVozUm9PeUJwSUNzOUlERXBJSHRjYmlBZ0lDQWdJR3RsZVNBOUlITnZjblJsWkV0bGVYTmJhVjA3WEc0Z0lDQWdJQ0JqWVc1dmJtbGpZV3hwZW1Wa1QySnFXMnRsZVYwZ1BTQmpZVzV2Ym1sallXeHBlbVVvYjJKcVcydGxlVjBzSUhOMFlXTnJMQ0J5WlhCc1lXTmxiV1Z1ZEZOMFlXTnJLVHRjYmlBZ0lDQjlYRzRnSUNBZ2MzUmhZMnN1Y0c5d0tDazdYRzRnSUNBZ2NtVndiR0ZqWlcxbGJuUlRkR0ZqYXk1d2IzQW9LVHRjYmlBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0JqWVc1dmJtbGpZV3hwZW1Wa1QySnFJRDBnYjJKcU8xeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCallXNXZibWxqWVd4cGVtVmtUMkpxTzF4dWZWeHVJbDE5XG5cblxuLyoqKi8gfSksXG4vKiA5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyd1c2Ugc3RyaWN0JztcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLmFycmF5RGlmZiA9IHVuZGVmaW5lZDtcblx0ZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9kaWZmQXJyYXlzID0gZGlmZkFycmF5cztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19iYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9iYXNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Jhc2UpO1xuXG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3ZhciBhcnJheURpZmYgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9hcnJheURpZmYgPSBuZXcgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19iYXNlMlsnZGVmYXVsdCddIC8qaXN0YW5idWwgaWdub3JlIGVuZCovKCk7XG5cdGFycmF5RGlmZi50b2tlbml6ZSA9IGFycmF5RGlmZi5qb2luID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgcmV0dXJuIHZhbHVlLnNsaWNlKCk7XG5cdH07XG5cdGFycmF5RGlmZi5yZW1vdmVFbXB0eSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgIHJldHVybiB2YWx1ZTtcblx0fTtcblxuXHRmdW5jdGlvbiBkaWZmQXJyYXlzKG9sZEFyciwgbmV3QXJyLCBjYWxsYmFjaykge1xuXHQgIHJldHVybiBhcnJheURpZmYuZGlmZihvbGRBcnIsIG5ld0FyciwgY2FsbGJhY2spO1xuXHR9XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OWthV1ptTDJGeWNtRjVMbXB6SWwwc0ltNWhiV1Z6SWpwYkltUnBabVpCY25KaGVYTWlMQ0poY25KaGVVUnBabVlpTENKMGIydGxibWw2WlNJc0ltcHZhVzRpTENKMllXeDFaU0lzSW5Oc2FXTmxJaXdpY21WdGIzWmxSVzF3ZEhraUxDSnZiR1JCY25JaUxDSnVaWGRCY25JaUxDSmpZV3hzWW1GamF5SXNJbVJwWm1ZaVhTd2liV0Z3Y0dsdVozTWlPaUk3T3pzN1owTkJWV2RDUVN4VkxFZEJRVUZCTEZVN08wRkJWbWhDT3pzN096czdkVUpCUlU4c1NVRkJUVU1zYVVaQlFWa3NkMFZCUVd4Q08wRkJRMUJCTEZWQlFWVkRMRkZCUVZZc1IwRkJjVUpFTEZWQlFWVkZMRWxCUVZZc1IwRkJhVUlzVlVGQlUwTXNTMEZCVkN4RlFVRm5RanRCUVVOd1JDeFRRVUZQUVN4TlFVRk5ReXhMUVVGT0xFVkJRVkE3UVVGRFJDeERRVVpFTzBGQlIwRktMRlZCUVZWTExGZEJRVllzUjBGQmQwSXNWVUZCVTBZc1MwRkJWQ3hGUVVGblFqdEJRVU4wUXl4VFFVRlBRU3hMUVVGUU8wRkJRMFFzUTBGR1JEczdRVUZKVHl4VFFVRlRTaXhWUVVGVUxFTkJRVzlDVHl4TlFVRndRaXhGUVVFMFFrTXNUVUZCTlVJc1JVRkJiME5ETEZGQlFYQkRMRVZCUVRoRE8wRkJRVVVzVTBGQlQxSXNWVUZCVlZNc1NVRkJWaXhEUVVGbFNDeE5RVUZtTEVWQlFYVkNReXhOUVVGMlFpeEZRVUVyUWtNc1VVRkJMMElzUTBGQlVEdEJRVUZyUkNJc0ltWnBiR1VpT2lKaGNuSmhlUzVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCRWFXWm1JR1p5YjIwZ0p5NHZZbUZ6WlNjN1hHNWNibVY0Y0c5eWRDQmpiMjV6ZENCaGNuSmhlVVJwWm1ZZ1BTQnVaWGNnUkdsbVppZ3BPMXh1WVhKeVlYbEVhV1ptTG5SdmEyVnVhWHBsSUQwZ1lYSnlZWGxFYVdabUxtcHZhVzRnUFNCbWRXNWpkR2x2YmloMllXeDFaU2tnZTF4dUlDQnlaWFIxY200Z2RtRnNkV1V1YzJ4cFkyVW9LVHRjYm4wN1hHNWhjbkpoZVVScFptWXVjbVZ0YjNabFJXMXdkSGtnUFNCbWRXNWpkR2x2YmloMllXeDFaU2tnZTF4dUlDQnlaWFIxY200Z2RtRnNkV1U3WEc1OU8xeHVYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdaR2xtWmtGeWNtRjVjeWh2YkdSQmNuSXNJRzVsZDBGeWNpd2dZMkZzYkdKaFkyc3BJSHNnY21WMGRYSnVJR0Z5Y21GNVJHbG1aaTVrYVdabUtHOXNaRUZ5Y2l3Z2JtVjNRWEp5TENCallXeHNZbUZqYXlrN0lIMWNiaUpkZlE9PVxuXG5cbi8qKiovIH0pLFxuLyogMTAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovJ3VzZSBzdHJpY3QnO1xuXG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovYXBwbHlQYXRjaCA9IGFwcGx5UGF0Y2g7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2FwcGx5UGF0Y2hlcyA9IGFwcGx5UGF0Y2hlcztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19wYXJzZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2Rpc3RhbmNlSXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9kaXN0YW5jZUl0ZXJhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Rpc3RhbmNlSXRlcmF0b3IpO1xuXG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2Z1bmN0aW9uIGFwcGx5UGF0Y2goc291cmNlLCB1bmlEaWZmKSB7XG5cdCAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL29wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXG5cdCAgaWYgKHR5cGVvZiB1bmlEaWZmID09PSAnc3RyaW5nJykge1xuXHQgICAgdW5pRGlmZiA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oMCwgX3BhcnNlLnBhcnNlUGF0Y2gpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovKHVuaURpZmYpO1xuXHQgIH1cblxuXHQgIGlmIChBcnJheS5pc0FycmF5KHVuaURpZmYpKSB7XG5cdCAgICBpZiAodW5pRGlmZi5sZW5ndGggPiAxKSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcignYXBwbHlQYXRjaCBvbmx5IHdvcmtzIHdpdGggYSBzaW5nbGUgaW5wdXQuJyk7XG5cdCAgICB9XG5cblx0ICAgIHVuaURpZmYgPSB1bmlEaWZmWzBdO1xuXHQgIH1cblxuXHQgIC8vIEFwcGx5IHRoZSBkaWZmIHRvIHRoZSBpbnB1dFxuXHQgIHZhciBsaW5lcyA9IHNvdXJjZS5zcGxpdCgvXFxyXFxufFtcXG5cXHZcXGZcXHJcXHg4NV0vKSxcblx0ICAgICAgZGVsaW1pdGVycyA9IHNvdXJjZS5tYXRjaCgvXFxyXFxufFtcXG5cXHZcXGZcXHJcXHg4NV0vZykgfHwgW10sXG5cdCAgICAgIGh1bmtzID0gdW5pRGlmZi5odW5rcyxcblx0ICAgICAgY29tcGFyZUxpbmUgPSBvcHRpb25zLmNvbXBhcmVMaW5lIHx8IGZ1bmN0aW9uIChsaW5lTnVtYmVyLCBsaW5lLCBvcGVyYXRpb24sIHBhdGNoQ29udGVudCkgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3tcblx0ICAgIHJldHVybiAoLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9saW5lID09PSBwYXRjaENvbnRlbnRcblx0ICAgICk7XG5cdCAgfSxcblx0ICAgICAgZXJyb3JDb3VudCA9IDAsXG5cdCAgICAgIGZ1enpGYWN0b3IgPSBvcHRpb25zLmZ1enpGYWN0b3IgfHwgMCxcblx0ICAgICAgbWluTGluZSA9IDAsXG5cdCAgICAgIG9mZnNldCA9IDAsXG5cdCAgICAgIHJlbW92ZUVPRk5MID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZvaWQgMCAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyxcblx0ICAgICAgYWRkRU9GTkwgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdm9pZCAwIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdCAgLyoqXG5cdCAgICogQ2hlY2tzIGlmIHRoZSBodW5rIGV4YWN0bHkgZml0cyBvbiB0aGUgcHJvdmlkZWQgbG9jYXRpb25cblx0ICAgKi9cblx0ICBmdW5jdGlvbiBodW5rRml0cyhodW5rLCB0b1Bvcykge1xuXHQgICAgZm9yICh2YXIgaiA9IDA7IGogPCBodW5rLmxpbmVzLmxlbmd0aDsgaisrKSB7XG5cdCAgICAgIHZhciBsaW5lID0gaHVuay5saW5lc1tqXSxcblx0ICAgICAgICAgIG9wZXJhdGlvbiA9IGxpbmVbMF0sXG5cdCAgICAgICAgICBjb250ZW50ID0gbGluZS5zdWJzdHIoMSk7XG5cblx0ICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnIHx8IG9wZXJhdGlvbiA9PT0gJy0nKSB7XG5cdCAgICAgICAgLy8gQ29udGV4dCBzYW5pdHkgY2hlY2tcblx0ICAgICAgICBpZiAoIWNvbXBhcmVMaW5lKHRvUG9zICsgMSwgbGluZXNbdG9Qb3NdLCBvcGVyYXRpb24sIGNvbnRlbnQpKSB7XG5cdCAgICAgICAgICBlcnJvckNvdW50Kys7XG5cblx0ICAgICAgICAgIGlmIChlcnJvckNvdW50ID4gZnV6ekZhY3Rvcikge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRvUG9zKys7XG5cdCAgICAgIH1cblx0ICAgIH1cblxuXHQgICAgcmV0dXJuIHRydWU7XG5cdCAgfVxuXG5cdCAgLy8gU2VhcmNoIGJlc3QgZml0IG9mZnNldHMgZm9yIGVhY2ggaHVuayBiYXNlZCBvbiB0aGUgcHJldmlvdXMgb25lc1xuXHQgIGZvciAodmFyIGkgPSAwOyBpIDwgaHVua3MubGVuZ3RoOyBpKyspIHtcblx0ICAgIHZhciBodW5rID0gaHVua3NbaV0sXG5cdCAgICAgICAgbWF4TGluZSA9IGxpbmVzLmxlbmd0aCAtIGh1bmsub2xkTGluZXMsXG5cdCAgICAgICAgbG9jYWxPZmZzZXQgPSAwLFxuXHQgICAgICAgIHRvUG9zID0gb2Zmc2V0ICsgaHVuay5vbGRTdGFydCAtIDE7XG5cblx0ICAgIHZhciBpdGVyYXRvciA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oMCwgX2Rpc3RhbmNlSXRlcmF0b3IyWydkZWZhdWx0J10pIC8qaXN0YW5idWwgaWdub3JlIGVuZCovKHRvUG9zLCBtaW5MaW5lLCBtYXhMaW5lKTtcblxuXHQgICAgZm9yICg7IGxvY2FsT2Zmc2V0ICE9PSB1bmRlZmluZWQ7IGxvY2FsT2Zmc2V0ID0gaXRlcmF0b3IoKSkge1xuXHQgICAgICBpZiAoaHVua0ZpdHMoaHVuaywgdG9Qb3MgKyBsb2NhbE9mZnNldCkpIHtcblx0ICAgICAgICBodW5rLm9mZnNldCA9IG9mZnNldCArPSBsb2NhbE9mZnNldDtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgfVxuXHQgICAgfVxuXG5cdCAgICBpZiAobG9jYWxPZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9XG5cblx0ICAgIC8vIFNldCBsb3dlciB0ZXh0IGxpbWl0IHRvIGVuZCBvZiB0aGUgY3VycmVudCBodW5rLCBzbyBuZXh0IG9uZXMgZG9uJ3QgdHJ5XG5cdCAgICAvLyB0byBmaXQgb3ZlciBhbHJlYWR5IHBhdGNoZWQgdGV4dFxuXHQgICAgbWluTGluZSA9IGh1bmsub2Zmc2V0ICsgaHVuay5vbGRTdGFydCArIGh1bmsub2xkTGluZXM7XG5cdCAgfVxuXG5cdCAgLy8gQXBwbHkgcGF0Y2ggaHVua3Ncblx0ICB2YXIgZGlmZk9mZnNldCA9IDA7XG5cdCAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGh1bmtzLmxlbmd0aDsgX2krKykge1xuXHQgICAgdmFyIF9odW5rID0gaHVua3NbX2ldLFxuXHQgICAgICAgIF90b1BvcyA9IF9odW5rLm9sZFN0YXJ0ICsgX2h1bmsub2Zmc2V0ICsgZGlmZk9mZnNldCAtIDE7XG5cdCAgICBkaWZmT2Zmc2V0ICs9IF9odW5rLm5ld0xpbmVzIC0gX2h1bmsub2xkTGluZXM7XG5cblx0ICAgIGlmIChfdG9Qb3MgPCAwKSB7XG5cdCAgICAgIC8vIENyZWF0aW5nIGEgbmV3IGZpbGVcblx0ICAgICAgX3RvUG9zID0gMDtcblx0ICAgIH1cblxuXHQgICAgZm9yICh2YXIgaiA9IDA7IGogPCBfaHVuay5saW5lcy5sZW5ndGg7IGorKykge1xuXHQgICAgICB2YXIgbGluZSA9IF9odW5rLmxpbmVzW2pdLFxuXHQgICAgICAgICAgb3BlcmF0aW9uID0gbGluZVswXSxcblx0ICAgICAgICAgIGNvbnRlbnQgPSBsaW5lLnN1YnN0cigxKSxcblx0ICAgICAgICAgIGRlbGltaXRlciA9IF9odW5rLmxpbmVkZWxpbWl0ZXJzW2pdO1xuXG5cdCAgICAgIGlmIChvcGVyYXRpb24gPT09ICcgJykge1xuXHQgICAgICAgIF90b1BvcysrO1xuXHQgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJy0nKSB7XG5cdCAgICAgICAgbGluZXMuc3BsaWNlKF90b1BvcywgMSk7XG5cdCAgICAgICAgZGVsaW1pdGVycy5zcGxpY2UoX3RvUG9zLCAxKTtcblx0ICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHQgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJysnKSB7XG5cdCAgICAgICAgbGluZXMuc3BsaWNlKF90b1BvcywgMCwgY29udGVudCk7XG5cdCAgICAgICAgZGVsaW1pdGVycy5zcGxpY2UoX3RvUG9zLCAwLCBkZWxpbWl0ZXIpO1xuXHQgICAgICAgIF90b1BvcysrO1xuXHQgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJ1xcXFwnKSB7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzT3BlcmF0aW9uID0gX2h1bmsubGluZXNbaiAtIDFdID8gX2h1bmsubGluZXNbaiAtIDFdWzBdIDogbnVsbDtcblx0ICAgICAgICBpZiAocHJldmlvdXNPcGVyYXRpb24gPT09ICcrJykge1xuXHQgICAgICAgICAgcmVtb3ZlRU9GTkwgPSB0cnVlO1xuXHQgICAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNPcGVyYXRpb24gPT09ICctJykge1xuXHQgICAgICAgICAgYWRkRU9GTkwgPSB0cnVlO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblxuXHQgIC8vIEhhbmRsZSBFT0ZOTCBpbnNlcnRpb24vcmVtb3ZhbFxuXHQgIGlmIChyZW1vdmVFT0ZOTCkge1xuXHQgICAgd2hpbGUgKCFsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSkge1xuXHQgICAgICBsaW5lcy5wb3AoKTtcblx0ICAgICAgZGVsaW1pdGVycy5wb3AoKTtcblx0ICAgIH1cblx0ICB9IGVsc2UgaWYgKGFkZEVPRk5MKSB7XG5cdCAgICBsaW5lcy5wdXNoKCcnKTtcblx0ICAgIGRlbGltaXRlcnMucHVzaCgnXFxuJyk7XG5cdCAgfVxuXHQgIGZvciAodmFyIF9rID0gMDsgX2sgPCBsaW5lcy5sZW5ndGggLSAxOyBfaysrKSB7XG5cdCAgICBsaW5lc1tfa10gPSBsaW5lc1tfa10gKyBkZWxpbWl0ZXJzW19rXTtcblx0ICB9XG5cdCAgcmV0dXJuIGxpbmVzLmpvaW4oJycpO1xuXHR9XG5cblx0Ly8gV3JhcHBlciB0aGF0IHN1cHBvcnRzIG11bHRpcGxlIGZpbGUgcGF0Y2hlcyB2aWEgY2FsbGJhY2tzLlxuXHRmdW5jdGlvbiBhcHBseVBhdGNoZXModW5pRGlmZiwgb3B0aW9ucykge1xuXHQgIGlmICh0eXBlb2YgdW5pRGlmZiA9PT0gJ3N0cmluZycpIHtcblx0ICAgIHVuaURpZmYgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKDAsIF9wYXJzZS5wYXJzZVBhdGNoKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyh1bmlEaWZmKTtcblx0ICB9XG5cblx0ICB2YXIgY3VycmVudEluZGV4ID0gMDtcblx0ICBmdW5jdGlvbiBwcm9jZXNzSW5kZXgoKSB7XG5cdCAgICB2YXIgaW5kZXggPSB1bmlEaWZmW2N1cnJlbnRJbmRleCsrXTtcblx0ICAgIGlmICghaW5kZXgpIHtcblx0ICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoKTtcblx0ICAgIH1cblxuXHQgICAgb3B0aW9ucy5sb2FkRmlsZShpbmRleCwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuXHQgICAgICBpZiAoZXJyKSB7XG5cdCAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoZXJyKTtcblx0ICAgICAgfVxuXG5cdCAgICAgIHZhciB1cGRhdGVkQ29udGVudCA9IGFwcGx5UGF0Y2goZGF0YSwgaW5kZXgsIG9wdGlvbnMpO1xuXHQgICAgICBvcHRpb25zLnBhdGNoZWQoaW5kZXgsIHVwZGF0ZWRDb250ZW50LCBmdW5jdGlvbiAoZXJyKSB7XG5cdCAgICAgICAgaWYgKGVycikge1xuXHQgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoZXJyKTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBwcm9jZXNzSW5kZXgoKTtcblx0ICAgICAgfSk7XG5cdCAgICB9KTtcblx0ICB9XG5cdCAgcHJvY2Vzc0luZGV4KCk7XG5cdH1cblx0Ly8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5d1lYUmphQzloY0hCc2VTNXFjeUpkTENKdVlXMWxjeUk2V3lKaGNIQnNlVkJoZEdOb0lpd2lZWEJ3YkhsUVlYUmphR1Z6SWl3aWMyOTFjbU5sSWl3aWRXNXBSR2xtWmlJc0ltOXdkR2x2Ym5NaUxDSkJjbkpoZVNJc0ltbHpRWEp5WVhraUxDSnNaVzVuZEdnaUxDSkZjbkp2Y2lJc0lteHBibVZ6SWl3aWMzQnNhWFFpTENKa1pXeHBiV2wwWlhKeklpd2liV0YwWTJnaUxDSm9kVzVyY3lJc0ltTnZiWEJoY21WTWFXNWxJaXdpYkdsdVpVNTFiV0psY2lJc0lteHBibVVpTENKdmNHVnlZWFJwYjI0aUxDSndZWFJqYUVOdmJuUmxiblFpTENKbGNuSnZja052ZFc1MElpd2lablY2ZWtaaFkzUnZjaUlzSW0xcGJreHBibVVpTENKdlptWnpaWFFpTENKeVpXMXZkbVZGVDBaT1RDSXNJbUZrWkVWUFJrNU1JaXdpYUhWdWEwWnBkSE1pTENKb2RXNXJJaXdpZEc5UWIzTWlMQ0pxSWl3aVkyOXVkR1Z1ZENJc0luTjFZbk4wY2lJc0lta2lMQ0p0WVhoTWFXNWxJaXdpYjJ4a1RHbHVaWE1pTENKc2IyTmhiRTltWm5ObGRDSXNJbTlzWkZOMFlYSjBJaXdpYVhSbGNtRjBiM0lpTENKMWJtUmxabWx1WldRaUxDSmthV1ptVDJabWMyVjBJaXdpYm1WM1RHbHVaWE1pTENKa1pXeHBiV2wwWlhJaUxDSnNhVzVsWkdWc2FXMXBkR1Z5Y3lJc0luTndiR2xqWlNJc0luQnlaWFpwYjNWelQzQmxjbUYwYVc5dUlpd2ljRzl3SWl3aWNIVnphQ0lzSWw5cklpd2lhbTlwYmlJc0ltTjFjbkpsYm5SSmJtUmxlQ0lzSW5CeWIyTmxjM05KYm1SbGVDSXNJbWx1WkdWNElpd2lZMjl0Y0d4bGRHVWlMQ0pzYjJGa1JtbHNaU0lzSW1WeWNpSXNJbVJoZEdFaUxDSjFjR1JoZEdWa1EyOXVkR1Z1ZENJc0luQmhkR05vWldRaVhTd2liV0Z3Y0dsdVozTWlPaUk3T3p0blEwRkhaMEpCTEZVc1IwRkJRVUVzVlR0NVJFRnZTVUZETEZrc1IwRkJRVUVzV1RzN1FVRjJTV2hDT3p0QlFVTkJPenM3T3pzN2RVSkJSVThzVTBGQlUwUXNWVUZCVkN4RFFVRnZRa1VzVFVGQmNFSXNSVUZCTkVKRExFOUJRVFZDTEVWQlFXMUVPMEZCUVVFc2MwUkJRV1JETEU5QlFXTXNkVVZCUVVvc1JVRkJTVHM3UVVGRGVFUXNUVUZCU1N4UFFVRlBSQ3hQUVVGUUxFdEJRVzFDTEZGQlFYWkNMRVZCUVdsRE8wRkJReTlDUVN4alFVRlZMSGRGUVVGWFFTeFBRVUZZTEVOQlFWWTdRVUZEUkRzN1FVRkZSQ3hOUVVGSlJTeE5RVUZOUXl4UFFVRk9MRU5CUVdOSUxFOUJRV1FzUTBGQlNpeEZRVUUwUWp0QlFVTXhRaXhSUVVGSlFTeFJRVUZSU1N4TlFVRlNMRWRCUVdsQ0xFTkJRWEpDTEVWQlFYZENPMEZCUTNSQ0xGbEJRVTBzU1VGQlNVTXNTMEZCU2l4RFFVRlZMRFJEUVVGV0xFTkJRVTQ3UVVGRFJEczdRVUZGUkV3c1kwRkJWVUVzVVVGQlVTeERRVUZTTEVOQlFWWTdRVUZEUkRzN1FVRkZSRHRCUVVOQkxFMUJRVWxOTEZGQlFWRlFMRTlCUVU5UkxFdEJRVkFzUTBGQllTeHhRa0ZCWWl4RFFVRmFPMEZCUVVFc1RVRkRTVU1zWVVGQllWUXNUMEZCVDFVc1MwRkJVQ3hEUVVGaExITkNRVUZpTEV0QlFYZERMRVZCUkhwRU8wRkJRVUVzVFVGRlNVTXNVVUZCVVZZc1VVRkJVVlVzUzBGR2NFSTdRVUZCUVN4TlFVbEpReXhqUVVGalZpeFJRVUZSVlN4WFFVRlNMRWxCUVhkQ0xGVkJRVU5ETEZWQlFVUXNSVUZCWVVNc1NVRkJZaXhGUVVGdFFrTXNVMEZCYmtJc1JVRkJPRUpETEZsQlFUbENPMEZCUVVFc2JVTkJRU3REUml4VFFVRlRSVHRCUVVGNFJEdEJRVUZCTEVkQlNqRkRPMEZCUVVFc1RVRkxTVU1zWVVGQllTeERRVXhxUWp0QlFVRkJMRTFCVFVsRExHRkJRV0ZvUWl4UlFVRlJaMElzVlVGQlVpeEpRVUZ6UWl4RFFVNTJRenRCUVVGQkxFMUJUMGxETEZWQlFWVXNRMEZRWkR0QlFVRkJMRTFCVVVsRExGTkJRVk1zUTBGU1lqdEJRVUZCTEUxQlZVbERMRFpEUVZaS08wRkJRVUVzVFVGWFNVTXNNRU5CV0VvN08wRkJZVUU3T3p0QlFVZEJMRmRCUVZORExGRkJRVlFzUTBGQmEwSkRMRWxCUVd4Q0xFVkJRWGRDUXl4TFFVRjRRaXhGUVVFclFqdEJRVU0zUWl4VFFVRkxMRWxCUVVsRExFbEJRVWtzUTBGQllpeEZRVUZuUWtFc1NVRkJTVVlzUzBGQlMycENMRXRCUVV3c1EwRkJWMFlzVFVGQkwwSXNSVUZCZFVOeFFpeEhRVUYyUXl4RlFVRTBRenRCUVVNeFF5eFZRVUZKV2l4UFFVRlBWU3hMUVVGTGFrSXNTMEZCVEN4RFFVRlhiVUlzUTBGQldDeERRVUZZTzBGQlFVRXNWVUZEU1Znc1dVRkJXVVFzUzBGQlN5eERRVUZNTEVOQlJHaENPMEZCUVVFc1ZVRkZTV0VzVlVGQlZXSXNTMEZCUzJNc1RVRkJUQ3hEUVVGWkxFTkJRVm9zUTBGR1pEczdRVUZKUVN4VlFVRkpZaXhqUVVGakxFZEJRV1FzU1VGQmNVSkJMR05CUVdNc1IwRkJka01zUlVGQk5FTTdRVUZETVVNN1FVRkRRU3haUVVGSkxFTkJRVU5JTEZsQlFWbGhMRkZCUVZFc1EwRkJjRUlzUlVGQmRVSnNRaXhOUVVGTmEwSXNTMEZCVGl4RFFVRjJRaXhGUVVGeFExWXNVMEZCY2tNc1JVRkJaMFJaTEU5QlFXaEVMRU5CUVV3c1JVRkJLMFE3UVVGRE4wUldPenRCUVVWQkxHTkJRVWxCTEdGQlFXRkRMRlZCUVdwQ0xFVkJRVFpDTzBGQlF6TkNMRzFDUVVGUExFdEJRVkE3UVVGRFJEdEJRVU5HTzBGQlEwUlBPMEZCUTBRN1FVRkRSanM3UVVGRlJDeFhRVUZQTEVsQlFWQTdRVUZEUkRzN1FVRkZSRHRCUVVOQkxFOUJRVXNzU1VGQlNVa3NTVUZCU1N4RFFVRmlMRVZCUVdkQ1FTeEpRVUZKYkVJc1RVRkJUVTRzVFVGQk1VSXNSVUZCYTBOM1FpeEhRVUZzUXl4RlFVRjFRenRCUVVOeVF5eFJRVUZKVEN4UFFVRlBZaXhOUVVGTmEwSXNRMEZCVGl4RFFVRllPMEZCUVVFc1VVRkRTVU1zVlVGQlZYWkNMRTFCUVUxR0xFMUJRVTRzUjBGQlpXMUNMRXRCUVV0UExGRkJSR3hETzBGQlFVRXNVVUZGU1VNc1kwRkJZeXhEUVVac1FqdEJRVUZCTEZGQlIwbFFMRkZCUVZGTUxGTkJRVk5KTEV0QlFVdFRMRkZCUVdRc1IwRkJlVUlzUTBGSWNrTTdPMEZCUzBFc1VVRkJTVU1zVjBGQlZ5eHZSa0ZCYVVKVUxFdEJRV3BDTEVWQlFYZENUaXhQUVVGNFFpeEZRVUZwUTFjc1QwRkJha01zUTBGQlpqczdRVUZGUVN4WFFVRlBSU3huUWtGQlowSkhMRk5CUVhaQ0xFVkJRV3REU0N4alFVRmpSU3hWUVVGb1JDeEZRVUUwUkR0QlFVTXhSQ3hWUVVGSldDeFRRVUZUUXl4SlFVRlVMRVZCUVdWRExGRkJRVkZQTEZkQlFYWkNMRU5CUVVvc1JVRkJlVU03UVVGRGRrTlNMR0ZCUVV0S0xFMUJRVXdzUjBGQlkwRXNWVUZCVlZrc1YwRkJlRUk3UVVGRFFUdEJRVU5FTzBGQlEwWTdPMEZCUlVRc1VVRkJTVUVzWjBKQlFXZENSeXhUUVVGd1FpeEZRVUVyUWp0QlFVTTNRaXhoUVVGUExFdEJRVkE3UVVGRFJEczdRVUZGUkR0QlFVTkJPMEZCUTBGb1FpeGpRVUZWU3l4TFFVRkxTaXhOUVVGTUxFZEJRV05KTEV0QlFVdFRMRkZCUVc1Q0xFZEJRVGhDVkN4TFFVRkxUeXhSUVVFM1F6dEJRVU5FT3p0QlFVVkVPMEZCUTBFc1RVRkJTVXNzWVVGQllTeERRVUZxUWp0QlFVTkJMRTlCUVVzc1NVRkJTVkFzUzBGQlNTeERRVUZpTEVWQlFXZENRU3hMUVVGSmJFSXNUVUZCVFU0c1RVRkJNVUlzUlVGQmEwTjNRaXhKUVVGc1F5eEZRVUYxUXp0QlFVTnlReXhSUVVGSlRDeFJRVUZQWWl4TlFVRk5hMElzUlVGQlRpeERRVUZZTzBGQlFVRXNVVUZEU1Vvc1UwRkJVVVFzVFVGQlMxTXNVVUZCVEN4SFFVRm5RbFFzVFVGQlMwb3NUVUZCY2tJc1IwRkJPRUpuUWl4VlFVRTVRaXhIUVVFeVF5eERRVVIyUkR0QlFVVkJRU3hyUWtGQlkxb3NUVUZCUzJFc1VVRkJUQ3hIUVVGblFtSXNUVUZCUzA4c1VVRkJia003TzBGQlJVRXNVVUZCU1U0c1UwRkJVU3hEUVVGYUxFVkJRV1U3UVVGQlJUdEJRVU5tUVN4bFFVRlJMRU5CUVZJN1FVRkRSRHM3UVVGRlJDeFRRVUZMTEVsQlFVbERMRWxCUVVrc1EwRkJZaXhGUVVGblFrRXNTVUZCU1VZc1RVRkJTMnBDTEV0QlFVd3NRMEZCVjBZc1RVRkJMMElzUlVGQmRVTnhRaXhIUVVGMlF5eEZRVUUwUXp0QlFVTXhReXhWUVVGSldpeFBRVUZQVlN4TlFVRkxha0lzUzBGQlRDeERRVUZYYlVJc1EwRkJXQ3hEUVVGWU8wRkJRVUVzVlVGRFNWZ3NXVUZCV1VRc1MwRkJTeXhEUVVGTUxFTkJSR2hDTzBGQlFVRXNWVUZGU1dFc1ZVRkJWV0lzUzBGQlMyTXNUVUZCVEN4RFFVRlpMRU5CUVZvc1EwRkdaRHRCUVVGQkxGVkJSMGxWTEZsQlFWbGtMRTFCUVV0bExHTkJRVXdzUTBGQmIwSmlMRU5CUVhCQ0xFTkJTR2hDT3p0QlFVdEJMRlZCUVVsWUxHTkJRV01zUjBGQmJFSXNSVUZCZFVJN1FVRkRja0pWTzBGQlEwUXNUMEZHUkN4TlFVVlBMRWxCUVVsV0xHTkJRV01zUjBGQmJFSXNSVUZCZFVJN1FVRkROVUpTTEdOQlFVMXBReXhOUVVGT0xFTkJRV0ZtTEUxQlFXSXNSVUZCYjBJc1EwRkJjRUk3UVVGRFFXaENMRzFDUVVGWEswSXNUVUZCV0N4RFFVRnJRbVlzVFVGQmJFSXNSVUZCZVVJc1EwRkJla0k3UVVGRFJqdEJRVU5ETEU5QlNrMHNUVUZKUVN4SlFVRkpWaXhqUVVGakxFZEJRV3hDTEVWQlFYVkNPMEZCUXpWQ1VpeGpRVUZOYVVNc1RVRkJUaXhEUVVGaFppeE5RVUZpTEVWQlFXOUNMRU5CUVhCQ0xFVkJRWFZDUlN4UFFVRjJRanRCUVVOQmJFSXNiVUpCUVZjclFpeE5RVUZZTEVOQlFXdENaaXhOUVVGc1FpeEZRVUY1UWl4RFFVRjZRaXhGUVVFMFFtRXNVMEZCTlVJN1FVRkRRV0k3UVVGRFJDeFBRVXBOTEUxQlNVRXNTVUZCU1ZZc1kwRkJZeXhKUVVGc1FpeEZRVUYzUWp0QlFVTTNRaXhaUVVGSk1FSXNiMEpCUVc5Q2FrSXNUVUZCUzJwQ0xFdEJRVXdzUTBGQlYyMUNMRWxCUVVrc1EwRkJaaXhKUVVGdlFrWXNUVUZCUzJwQ0xFdEJRVXdzUTBGQlYyMUNMRWxCUVVrc1EwRkJaaXhGUVVGclFpeERRVUZzUWl4RFFVRndRaXhIUVVFeVF5eEpRVUZ1UlR0QlFVTkJMRmxCUVVsbExITkNRVUZ6UWl4SFFVRXhRaXhGUVVFclFqdEJRVU0zUW5CQ0xIZENRVUZqTEVsQlFXUTdRVUZEUkN4VFFVWkVMRTFCUlU4c1NVRkJTVzlDTEhOQ1FVRnpRaXhIUVVFeFFpeEZRVUVyUWp0QlFVTndRMjVDTEhGQ1FVRlhMRWxCUVZnN1FVRkRSRHRCUVVOR08wRkJRMFk3UVVGRFJqczdRVUZGUkR0QlFVTkJMRTFCUVVsRUxGZEJRVW9zUlVGQmFVSTdRVUZEWml4WFFVRlBMRU5CUVVOa0xFMUJRVTFCTEUxQlFVMUdMRTFCUVU0c1IwRkJaU3hEUVVGeVFpeERRVUZTTEVWQlFXbERPMEZCUXk5Q1JTeFpRVUZOYlVNc1IwRkJUanRCUVVOQmFrTXNhVUpCUVZkcFF5eEhRVUZZTzBGQlEwUTdRVUZEUml4SFFVeEVMRTFCUzA4c1NVRkJTWEJDTEZGQlFVb3NSVUZCWXp0QlFVTnVRbVlzVlVGQlRXOURMRWxCUVU0c1EwRkJWeXhGUVVGWU8wRkJRMEZzUXl4bFFVRlhhME1zU1VGQldDeERRVUZuUWl4SlFVRm9RanRCUVVORU8wRkJRMFFzVDBGQlN5eEpRVUZKUXl4TFFVRkxMRU5CUVdRc1JVRkJhVUpCTEV0QlFVdHlReXhOUVVGTlJpeE5RVUZPTEVkQlFXVXNRMEZCY2tNc1JVRkJkME4xUXl4SlFVRjRReXhGUVVFNFF6dEJRVU0xUTNKRExGVkJRVTF4UXl4RlFVRk9MRWxCUVZseVF5eE5RVUZOY1VNc1JVRkJUaXhKUVVGWmJrTXNWMEZCVjIxRExFVkJRVmdzUTBGQmVFSTdRVUZEUkR0QlFVTkVMRk5CUVU5eVF5eE5RVUZOYzBNc1NVRkJUaXhEUVVGWExFVkJRVmdzUTBGQlVEdEJRVU5FT3p0QlFVVkVPMEZCUTA4c1UwRkJVemxETEZsQlFWUXNRMEZCYzBKRkxFOUJRWFJDTEVWQlFTdENReXhQUVVFdlFpeEZRVUYzUXp0QlFVTTNReXhOUVVGSkxFOUJRVTlFTEU5QlFWQXNTMEZCYlVJc1VVRkJka0lzUlVGQmFVTTdRVUZETDBKQkxHTkJRVlVzZDBWQlFWZEJMRTlCUVZnc1EwRkJWanRCUVVORU96dEJRVVZFTEUxQlFVazJReXhsUVVGbExFTkJRVzVDTzBGQlEwRXNWMEZCVTBNc1dVRkJWQ3hIUVVGM1FqdEJRVU4wUWl4UlFVRkpReXhSUVVGUkwwTXNVVUZCVVRaRExHTkJRVklzUTBGQldqdEJRVU5CTEZGQlFVa3NRMEZCUTBVc1MwRkJUQ3hGUVVGWk8wRkJRMVlzWVVGQlR6bERMRkZCUVZFclF5eFJRVUZTTEVWQlFWQTdRVUZEUkRzN1FVRkZSQzlETEZsQlFWRm5SQ3hSUVVGU0xFTkJRV2xDUml4TFFVRnFRaXhGUVVGM1FpeFZRVUZUUnl4SFFVRlVMRVZCUVdORExFbEJRV1FzUlVGQmIwSTdRVUZETVVNc1ZVRkJTVVFzUjBGQlNpeEZRVUZUTzBGQlExQXNaVUZCVDJwRUxGRkJRVkVyUXl4UlFVRlNMRU5CUVdsQ1JTeEhRVUZxUWl4RFFVRlFPMEZCUTBRN08wRkJSVVFzVlVGQlNVVXNhVUpCUVdsQ2RrUXNWMEZCVjNORUxFbEJRVmdzUlVGQmFVSktMRXRCUVdwQ0xFVkJRWGRDT1VNc1QwRkJlRUlzUTBGQmNrSTdRVUZEUVVFc1kwRkJVVzlFTEU5QlFWSXNRMEZCWjBKT0xFdEJRV2hDTEVWQlFYVkNTeXhqUVVGMlFpeEZRVUYxUXl4VlFVRlRSaXhIUVVGVUxFVkJRV003UVVGRGJrUXNXVUZCU1VFc1IwRkJTaXhGUVVGVE8wRkJRMUFzYVVKQlFVOXFSQ3hSUVVGUkswTXNVVUZCVWl4RFFVRnBRa1VzUjBGQmFrSXNRMEZCVUR0QlFVTkVPenRCUVVWRVNqdEJRVU5FTEU5QlRrUTdRVUZQUkN4TFFXSkVPMEZCWTBRN1FVRkRSRUU3UVVGRFJDSXNJbVpwYkdVaU9pSmhjSEJzZVM1cWN5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbWx0Y0c5eWRDQjdjR0Z5YzJWUVlYUmphSDBnWm5KdmJTQW5MaTl3WVhKelpTYzdYRzVwYlhCdmNuUWdaR2x6ZEdGdVkyVkpkR1Z5WVhSdmNpQm1jbTl0SUNjdUxpOTFkR2xzTDJScGMzUmhibU5sTFdsMFpYSmhkRzl5Snp0Y2JseHVaWGh3YjNKMElHWjFibU4wYVc5dUlHRndjR3g1VUdGMFkyZ29jMjkxY21ObExDQjFibWxFYVdabUxDQnZjSFJwYjI1eklEMGdlMzBwSUh0Y2JpQWdhV1lnS0hSNWNHVnZaaUIxYm1sRWFXWm1JRDA5UFNBbmMzUnlhVzVuSnlrZ2UxeHVJQ0FnSUhWdWFVUnBabVlnUFNCd1lYSnpaVkJoZEdOb0tIVnVhVVJwWm1ZcE8xeHVJQ0I5WEc1Y2JpQWdhV1lnS0VGeWNtRjVMbWx6UVhKeVlYa29kVzVwUkdsbVppa3BJSHRjYmlBZ0lDQnBaaUFvZFc1cFJHbG1aaTVzWlc1bmRHZ2dQaUF4S1NCN1hHNGdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvSjJGd2NHeDVVR0YwWTJnZ2IyNXNlU0IzYjNKcmN5QjNhWFJvSUdFZ2MybHVaMnhsSUdsdWNIVjBMaWNwTzF4dUlDQWdJSDFjYmx4dUlDQWdJSFZ1YVVScFptWWdQU0IxYm1sRWFXWm1XekJkTzF4dUlDQjlYRzVjYmlBZ0x5OGdRWEJ3YkhrZ2RHaGxJR1JwWm1ZZ2RHOGdkR2hsSUdsdWNIVjBYRzRnSUd4bGRDQnNhVzVsY3lBOUlITnZkWEpqWlM1emNHeHBkQ2d2WEZ4eVhGeHVmRnRjWEc1Y1hIWmNYR1pjWEhKY1hIZzROVjB2S1N4Y2JpQWdJQ0FnSUdSbGJHbHRhWFJsY25NZ1BTQnpiM1Z5WTJVdWJXRjBZMmdvTDF4Y2NseGNibnhiWEZ4dVhGeDJYRnhtWEZ4eVhGeDRPRFZkTDJjcElIeDhJRnRkTEZ4dUlDQWdJQ0FnYUhWdWEzTWdQU0IxYm1sRWFXWm1MbWgxYm10ekxGeHVYRzRnSUNBZ0lDQmpiMjF3WVhKbFRHbHVaU0E5SUc5d2RHbHZibk11WTI5dGNHRnlaVXhwYm1VZ2ZId2dLQ2hzYVc1bFRuVnRZbVZ5TENCc2FXNWxMQ0J2Y0dWeVlYUnBiMjRzSUhCaGRHTm9RMjl1ZEdWdWRDa2dQVDRnYkdsdVpTQTlQVDBnY0dGMFkyaERiMjUwWlc1MEtTeGNiaUFnSUNBZ0lHVnljbTl5UTI5MWJuUWdQU0F3TEZ4dUlDQWdJQ0FnWm5WNmVrWmhZM1J2Y2lBOUlHOXdkR2x2Ym5NdVpuVjZla1poWTNSdmNpQjhmQ0F3TEZ4dUlDQWdJQ0FnYldsdVRHbHVaU0E5SURBc1hHNGdJQ0FnSUNCdlptWnpaWFFnUFNBd0xGeHVYRzRnSUNBZ0lDQnlaVzF2ZG1WRlQwWk9UQ3hjYmlBZ0lDQWdJR0ZrWkVWUFJrNU1PMXh1WEc0Z0lDOHFLbHh1SUNBZ0tpQkRhR1ZqYTNNZ2FXWWdkR2hsSUdoMWJtc2daWGhoWTNSc2VTQm1hWFJ6SUc5dUlIUm9aU0J3Y205MmFXUmxaQ0JzYjJOaGRHbHZibHh1SUNBZ0tpOWNiaUFnWm5WdVkzUnBiMjRnYUhWdWEwWnBkSE1vYUhWdWF5d2dkRzlRYjNNcElIdGNiaUFnSUNCbWIzSWdLR3hsZENCcUlEMGdNRHNnYWlBOElHaDFibXN1YkdsdVpYTXViR1Z1WjNSb095QnFLeXNwSUh0Y2JpQWdJQ0FnSUd4bGRDQnNhVzVsSUQwZ2FIVnVheTVzYVc1bGMxdHFYU3hjYmlBZ0lDQWdJQ0FnSUNCdmNHVnlZWFJwYjI0Z1BTQnNhVzVsV3pCZExGeHVJQ0FnSUNBZ0lDQWdJR052Ym5SbGJuUWdQU0JzYVc1bExuTjFZbk4wY2lneEtUdGNibHh1SUNBZ0lDQWdhV1lnS0c5d1pYSmhkR2x2YmlBOVBUMGdKeUFuSUh4OElHOXdaWEpoZEdsdmJpQTlQVDBnSnkwbktTQjdYRzRnSUNBZ0lDQWdJQzh2SUVOdmJuUmxlSFFnYzJGdWFYUjVJR05vWldOclhHNGdJQ0FnSUNBZ0lHbG1JQ2doWTI5dGNHRnlaVXhwYm1Vb2RHOVFiM01nS3lBeExDQnNhVzVsYzF0MGIxQnZjMTBzSUc5d1pYSmhkR2x2Yml3Z1kyOXVkR1Z1ZENrcElIdGNiaUFnSUNBZ0lDQWdJQ0JsY25KdmNrTnZkVzUwS3lzN1hHNWNiaUFnSUNBZ0lDQWdJQ0JwWmlBb1pYSnliM0pEYjNWdWRDQStJR1oxZW5wR1lXTjBiM0lwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQm1ZV3h6WlR0Y2JpQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnZEc5UWIzTXJLenRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzVjYmlBZ0lDQnlaWFIxY200Z2RISjFaVHRjYmlBZ2ZWeHVYRzRnSUM4dklGTmxZWEpqYUNCaVpYTjBJR1pwZENCdlptWnpaWFJ6SUdadmNpQmxZV05vSUdoMWJtc2dZbUZ6WldRZ2IyNGdkR2hsSUhCeVpYWnBiM1Z6SUc5dVpYTmNiaUFnWm05eUlDaHNaWFFnYVNBOUlEQTdJR2tnUENCb2RXNXJjeTVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVJQ0FnSUd4bGRDQm9kVzVySUQwZ2FIVnVhM05iYVYwc1hHNGdJQ0FnSUNBZ0lHMWhlRXhwYm1VZ1BTQnNhVzVsY3k1c1pXNW5kR2dnTFNCb2RXNXJMbTlzWkV4cGJtVnpMRnh1SUNBZ0lDQWdJQ0JzYjJOaGJFOW1abk5sZENBOUlEQXNYRzRnSUNBZ0lDQWdJSFJ2VUc5eklEMGdiMlptYzJWMElDc2dhSFZ1YXk1dmJHUlRkR0Z5ZENBdElERTdYRzVjYmlBZ0lDQnNaWFFnYVhSbGNtRjBiM0lnUFNCa2FYTjBZVzVqWlVsMFpYSmhkRzl5S0hSdlVHOXpMQ0J0YVc1TWFXNWxMQ0J0WVhoTWFXNWxLVHRjYmx4dUlDQWdJR1p2Y2lBb095QnNiMk5oYkU5bVpuTmxkQ0FoUFQwZ2RXNWtaV1pwYm1Wa095QnNiMk5oYkU5bVpuTmxkQ0E5SUdsMFpYSmhkRzl5S0NrcElIdGNiaUFnSUNBZ0lHbG1JQ2hvZFc1clJtbDBjeWhvZFc1ckxDQjBiMUJ2Y3lBcklHeHZZMkZzVDJabWMyVjBLU2tnZTF4dUlDQWdJQ0FnSUNCb2RXNXJMbTltWm5ObGRDQTlJRzltWm5ObGRDQXJQU0JzYjJOaGJFOW1abk5sZER0Y2JpQWdJQ0FnSUNBZ1luSmxZV3M3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1WEc0Z0lDQWdhV1lnS0d4dlkyRnNUMlptYzJWMElEMDlQU0IxYm1SbFptbHVaV1FwSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUJtWVd4elpUdGNiaUFnSUNCOVhHNWNiaUFnSUNBdkx5QlRaWFFnYkc5M1pYSWdkR1Y0ZENCc2FXMXBkQ0IwYnlCbGJtUWdiMllnZEdobElHTjFjbkpsYm5RZ2FIVnVheXdnYzI4Z2JtVjRkQ0J2Ym1WeklHUnZiaWQwSUhSeWVWeHVJQ0FnSUM4dklIUnZJR1pwZENCdmRtVnlJR0ZzY21WaFpIa2djR0YwWTJobFpDQjBaWGgwWEc0Z0lDQWdiV2x1VEdsdVpTQTlJR2gxYm1zdWIyWm1jMlYwSUNzZ2FIVnVheTV2YkdSVGRHRnlkQ0FySUdoMWJtc3ViMnhrVEdsdVpYTTdYRzRnSUgxY2JseHVJQ0F2THlCQmNIQnNlU0J3WVhSamFDQm9kVzVyYzF4dUlDQnNaWFFnWkdsbVprOW1abk5sZENBOUlEQTdYRzRnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z2FIVnVhM011YkdWdVozUm9PeUJwS3lzcElIdGNiaUFnSUNCc1pYUWdhSFZ1YXlBOUlHaDFibXR6VzJsZExGeHVJQ0FnSUNBZ0lDQjBiMUJ2Y3lBOUlHaDFibXN1YjJ4a1UzUmhjblFnS3lCb2RXNXJMbTltWm5ObGRDQXJJR1JwWm1aUFptWnpaWFFnTFNBeE8xeHVJQ0FnSUdScFptWlBabVp6WlhRZ0t6MGdhSFZ1YXk1dVpYZE1hVzVsY3lBdElHaDFibXN1YjJ4a1RHbHVaWE03WEc1Y2JpQWdJQ0JwWmlBb2RHOVFiM01nUENBd0tTQjdJQzh2SUVOeVpXRjBhVzVuSUdFZ2JtVjNJR1pwYkdWY2JpQWdJQ0FnSUhSdlVHOXpJRDBnTUR0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JtYjNJZ0tHeGxkQ0JxSUQwZ01Ec2dhaUE4SUdoMWJtc3ViR2x1WlhNdWJHVnVaM1JvT3lCcUt5c3BJSHRjYmlBZ0lDQWdJR3hsZENCc2FXNWxJRDBnYUhWdWF5NXNhVzVsYzF0cVhTeGNiaUFnSUNBZ0lDQWdJQ0J2Y0dWeVlYUnBiMjRnUFNCc2FXNWxXekJkTEZ4dUlDQWdJQ0FnSUNBZ0lHTnZiblJsYm5RZ1BTQnNhVzVsTG5OMVluTjBjaWd4S1N4Y2JpQWdJQ0FnSUNBZ0lDQmtaV3hwYldsMFpYSWdQU0JvZFc1ckxteHBibVZrWld4cGJXbDBaWEp6VzJwZE8xeHVYRzRnSUNBZ0lDQnBaaUFvYjNCbGNtRjBhVzl1SUQwOVBTQW5JQ2NwSUh0Y2JpQWdJQ0FnSUNBZ2RHOVFiM01yS3p0Y2JpQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb2IzQmxjbUYwYVc5dUlEMDlQU0FuTFNjcElIdGNiaUFnSUNBZ0lDQWdiR2x1WlhNdWMzQnNhV05sS0hSdlVHOXpMQ0F4S1R0Y2JpQWdJQ0FnSUNBZ1pHVnNhVzFwZEdWeWN5NXpjR3hwWTJVb2RHOVFiM01zSURFcE8xeHVJQ0FnSUNBZ0x5b2dhWE4wWVc1aWRXd2dhV2R1YjNKbElHVnNjMlVnS2k5Y2JpQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb2IzQmxjbUYwYVc5dUlEMDlQU0FuS3ljcElIdGNiaUFnSUNBZ0lDQWdiR2x1WlhNdWMzQnNhV05sS0hSdlVHOXpMQ0F3TENCamIyNTBaVzUwS1R0Y2JpQWdJQ0FnSUNBZ1pHVnNhVzFwZEdWeWN5NXpjR3hwWTJVb2RHOVFiM01zSURBc0lHUmxiR2x0YVhSbGNpazdYRzRnSUNBZ0lDQWdJSFJ2VUc5ekt5czdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLRzl3WlhKaGRHbHZiaUE5UFQwZ0oxeGNYRnduS1NCN1hHNGdJQ0FnSUNBZ0lHeGxkQ0J3Y21WMmFXOTFjMDl3WlhKaGRHbHZiaUE5SUdoMWJtc3ViR2x1WlhOYmFpQXRJREZkSUQ4Z2FIVnVheTVzYVc1bGMxdHFJQzBnTVYxYk1GMGdPaUJ1ZFd4c08xeHVJQ0FnSUNBZ0lDQnBaaUFvY0hKbGRtbHZkWE5QY0dWeVlYUnBiMjRnUFQwOUlDY3JKeWtnZTF4dUlDQWdJQ0FnSUNBZ0lISmxiVzkyWlVWUFJrNU1JRDBnZEhKMVpUdGNiaUFnSUNBZ0lDQWdmU0JsYkhObElHbG1JQ2h3Y21WMmFXOTFjMDl3WlhKaGRHbHZiaUE5UFQwZ0p5MG5LU0I3WEc0Z0lDQWdJQ0FnSUNBZ1lXUmtSVTlHVGt3Z1BTQjBjblZsTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQjlYRzVjYmlBZ0x5OGdTR0Z1Wkd4bElFVlBSazVNSUdsdWMyVnlkR2x2Ymk5eVpXMXZkbUZzWEc0Z0lHbG1JQ2h5WlcxdmRtVkZUMFpPVENrZ2UxeHVJQ0FnSUhkb2FXeGxJQ2doYkdsdVpYTmJiR2x1WlhNdWJHVnVaM1JvSUMwZ01WMHBJSHRjYmlBZ0lDQWdJR3hwYm1WekxuQnZjQ2dwTzF4dUlDQWdJQ0FnWkdWc2FXMXBkR1Z5Y3k1d2IzQW9LVHRjYmlBZ0lDQjlYRzRnSUgwZ1pXeHpaU0JwWmlBb1lXUmtSVTlHVGt3cElIdGNiaUFnSUNCc2FXNWxjeTV3ZFhOb0tDY25LVHRjYmlBZ0lDQmtaV3hwYldsMFpYSnpMbkIxYzJnb0oxeGNiaWNwTzF4dUlDQjlYRzRnSUdadmNpQW9iR1YwSUY5cklEMGdNRHNnWDJzZ1BDQnNhVzVsY3k1c1pXNW5kR2dnTFNBeE95QmZheXNyS1NCN1hHNGdJQ0FnYkdsdVpYTmJYMnRkSUQwZ2JHbHVaWE5iWDJ0ZElDc2daR1ZzYVcxcGRHVnljMXRmYTEwN1hHNGdJSDFjYmlBZ2NtVjBkWEp1SUd4cGJtVnpMbXB2YVc0b0p5Y3BPMXh1ZlZ4dVhHNHZMeUJYY21Gd2NHVnlJSFJvWVhRZ2MzVndjRzl5ZEhNZ2JYVnNkR2x3YkdVZ1ptbHNaU0J3WVhSamFHVnpJSFpwWVNCallXeHNZbUZqYTNNdVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1lYQndiSGxRWVhSamFHVnpLSFZ1YVVScFptWXNJRzl3ZEdsdmJuTXBJSHRjYmlBZ2FXWWdLSFI1Y0dWdlppQjFibWxFYVdabUlEMDlQU0FuYzNSeWFXNW5KeWtnZTF4dUlDQWdJSFZ1YVVScFptWWdQU0J3WVhKelpWQmhkR05vS0hWdWFVUnBabVlwTzF4dUlDQjlYRzVjYmlBZ2JHVjBJR04xY25KbGJuUkpibVJsZUNBOUlEQTdYRzRnSUdaMWJtTjBhVzl1SUhCeWIyTmxjM05KYm1SbGVDZ3BJSHRjYmlBZ0lDQnNaWFFnYVc1a1pYZ2dQU0IxYm1sRWFXWm1XMk4xY25KbGJuUkpibVJsZUNzclhUdGNiaUFnSUNCcFppQW9JV2x1WkdWNEtTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z2IzQjBhVzl1Y3k1amIyMXdiR1YwWlNncE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUc5d2RHbHZibk11Ykc5aFpFWnBiR1VvYVc1a1pYZ3NJR1oxYm1OMGFXOXVLR1Z5Y2l3Z1pHRjBZU2tnZTF4dUlDQWdJQ0FnYVdZZ0tHVnljaWtnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnYjNCMGFXOXVjeTVqYjIxd2JHVjBaU2hsY25JcE8xeHVJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQnNaWFFnZFhCa1lYUmxaRU52Ym5SbGJuUWdQU0JoY0hCc2VWQmhkR05vS0dSaGRHRXNJR2x1WkdWNExDQnZjSFJwYjI1ektUdGNiaUFnSUNBZ0lHOXdkR2x2Ym5NdWNHRjBZMmhsWkNocGJtUmxlQ3dnZFhCa1lYUmxaRU52Ym5SbGJuUXNJR1oxYm1OMGFXOXVLR1Z5Y2lrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvWlhKeUtTQjdYRzRnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJRzl3ZEdsdmJuTXVZMjl0Y0d4bGRHVW9aWEp5S1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJSEJ5YjJObGMzTkpibVJsZUNncE8xeHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ2ZTazdYRzRnSUgxY2JpQWdjSEp2WTJWemMwbHVaR1Y0S0NrN1hHNTlYRzRpWFgwPVxuXG5cbi8qKiovIH0pLFxuLyogMTEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovJ3VzZSBzdHJpY3QnO1xuXG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovcGFyc2VQYXRjaCA9IHBhcnNlUGF0Y2g7XG5cdGZ1bmN0aW9uIHBhcnNlUGF0Y2godW5pRGlmZikge1xuXHQgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9vcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuXHQgIHZhciBkaWZmc3RyID0gdW5pRGlmZi5zcGxpdCgvXFxyXFxufFtcXG5cXHZcXGZcXHJcXHg4NV0vKSxcblx0ICAgICAgZGVsaW1pdGVycyA9IHVuaURpZmYubWF0Y2goL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdL2cpIHx8IFtdLFxuXHQgICAgICBsaXN0ID0gW10sXG5cdCAgICAgIGkgPSAwO1xuXG5cdCAgZnVuY3Rpb24gcGFyc2VJbmRleCgpIHtcblx0ICAgIHZhciBpbmRleCA9IHt9O1xuXHQgICAgbGlzdC5wdXNoKGluZGV4KTtcblxuXHQgICAgLy8gUGFyc2UgZGlmZiBtZXRhZGF0YVxuXHQgICAgd2hpbGUgKGkgPCBkaWZmc3RyLmxlbmd0aCkge1xuXHQgICAgICB2YXIgbGluZSA9IGRpZmZzdHJbaV07XG5cblx0ICAgICAgLy8gRmlsZSBoZWFkZXIgZm91bmQsIGVuZCBwYXJzaW5nIGRpZmYgbWV0YWRhdGFcblx0ICAgICAgaWYgKC9eKFxcLVxcLVxcLXxcXCtcXCtcXCt8QEApXFxzLy50ZXN0KGxpbmUpKSB7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIH1cblxuXHQgICAgICAvLyBEaWZmIGluZGV4XG5cdCAgICAgIHZhciBoZWFkZXIgPSAvXig/OkluZGV4OnxkaWZmKD86IC1yIFxcdyspKylcXHMrKC4rPylcXHMqJC8uZXhlYyhsaW5lKTtcblx0ICAgICAgaWYgKGhlYWRlcikge1xuXHQgICAgICAgIGluZGV4LmluZGV4ID0gaGVhZGVyWzFdO1xuXHQgICAgICB9XG5cblx0ICAgICAgaSsrO1xuXHQgICAgfVxuXG5cdCAgICAvLyBQYXJzZSBmaWxlIGhlYWRlcnMgaWYgdGhleSBhcmUgZGVmaW5lZC4gVW5pZmllZCBkaWZmIHJlcXVpcmVzIHRoZW0sIGJ1dFxuXHQgICAgLy8gdGhlcmUncyBubyB0ZWNobmljYWwgaXNzdWVzIHRvIGhhdmUgYW4gaXNvbGF0ZWQgaHVuayB3aXRob3V0IGZpbGUgaGVhZGVyXG5cdCAgICBwYXJzZUZpbGVIZWFkZXIoaW5kZXgpO1xuXHQgICAgcGFyc2VGaWxlSGVhZGVyKGluZGV4KTtcblxuXHQgICAgLy8gUGFyc2UgaHVua3Ncblx0ICAgIGluZGV4Lmh1bmtzID0gW107XG5cblx0ICAgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcblx0ICAgICAgdmFyIF9saW5lID0gZGlmZnN0cltpXTtcblxuXHQgICAgICBpZiAoL14oSW5kZXg6fGRpZmZ8XFwtXFwtXFwtfFxcK1xcK1xcKylcXHMvLnRlc3QoX2xpbmUpKSB7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIH0gZWxzZSBpZiAoL15AQC8udGVzdChfbGluZSkpIHtcblx0ICAgICAgICBpbmRleC5odW5rcy5wdXNoKHBhcnNlSHVuaygpKTtcblx0ICAgICAgfSBlbHNlIGlmIChfbGluZSAmJiBvcHRpb25zLnN0cmljdCkge1xuXHQgICAgICAgIC8vIElnbm9yZSB1bmV4cGVjdGVkIGNvbnRlbnQgdW5sZXNzIGluIHN0cmljdCBtb2RlXG5cdCAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGxpbmUgJyArIChpICsgMSkgKyAnICcgKyBKU09OLnN0cmluZ2lmeShfbGluZSkpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGkrKztcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblxuXHQgIC8vIFBhcnNlcyB0aGUgLS0tIGFuZCArKysgaGVhZGVycywgaWYgbm9uZSBhcmUgZm91bmQsIG5vIGxpbmVzXG5cdCAgLy8gYXJlIGNvbnN1bWVkLlxuXHQgIGZ1bmN0aW9uIHBhcnNlRmlsZUhlYWRlcihpbmRleCkge1xuXHQgICAgdmFyIGhlYWRlclBhdHRlcm4gPSAvXigtLS18XFwrXFwrXFwrKVxccysoW1xcUyBdKikoPzpcXHQoLio/KVxccyopPyQvO1xuXHQgICAgdmFyIGZpbGVIZWFkZXIgPSBoZWFkZXJQYXR0ZXJuLmV4ZWMoZGlmZnN0cltpXSk7XG5cdCAgICBpZiAoZmlsZUhlYWRlcikge1xuXHQgICAgICB2YXIga2V5UHJlZml4ID0gZmlsZUhlYWRlclsxXSA9PT0gJy0tLScgPyAnb2xkJyA6ICduZXcnO1xuXHQgICAgICB2YXIgZmlsZU5hbWUgPSBmaWxlSGVhZGVyWzJdLnJlcGxhY2UoL1xcXFxcXFxcL2csICdcXFxcJyk7XG5cdCAgICAgIGlmICgvXlwiLipcIiQvLnRlc3QoZmlsZU5hbWUpKSB7XG5cdCAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHIoMSwgZmlsZU5hbWUubGVuZ3RoIC0gMik7XG5cdCAgICAgIH1cblx0ICAgICAgaW5kZXhba2V5UHJlZml4ICsgJ0ZpbGVOYW1lJ10gPSBmaWxlTmFtZTtcblx0ICAgICAgaW5kZXhba2V5UHJlZml4ICsgJ0hlYWRlciddID0gZmlsZUhlYWRlclszXTtcblxuXHQgICAgICBpKys7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgLy8gUGFyc2VzIGEgaHVua1xuXHQgIC8vIFRoaXMgYXNzdW1lcyB0aGF0IHdlIGFyZSBhdCB0aGUgc3RhcnQgb2YgYSBodW5rLlxuXHQgIGZ1bmN0aW9uIHBhcnNlSHVuaygpIHtcblx0ICAgIHZhciBjaHVua0hlYWRlckluZGV4ID0gaSxcblx0ICAgICAgICBjaHVua0hlYWRlckxpbmUgPSBkaWZmc3RyW2krK10sXG5cdCAgICAgICAgY2h1bmtIZWFkZXIgPSBjaHVua0hlYWRlckxpbmUuc3BsaXQoL0BAIC0oXFxkKykoPzosKFxcZCspKT8gXFwrKFxcZCspKD86LChcXGQrKSk/IEBALyk7XG5cblx0ICAgIHZhciBodW5rID0ge1xuXHQgICAgICBvbGRTdGFydDogK2NodW5rSGVhZGVyWzFdLFxuXHQgICAgICBvbGRMaW5lczogK2NodW5rSGVhZGVyWzJdIHx8IDEsXG5cdCAgICAgIG5ld1N0YXJ0OiArY2h1bmtIZWFkZXJbM10sXG5cdCAgICAgIG5ld0xpbmVzOiArY2h1bmtIZWFkZXJbNF0gfHwgMSxcblx0ICAgICAgbGluZXM6IFtdLFxuXHQgICAgICBsaW5lZGVsaW1pdGVyczogW11cblx0ICAgIH07XG5cblx0ICAgIHZhciBhZGRDb3VudCA9IDAsXG5cdCAgICAgICAgcmVtb3ZlQ291bnQgPSAwO1xuXHQgICAgZm9yICg7IGkgPCBkaWZmc3RyLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgIC8vIExpbmVzIHN0YXJ0aW5nIHdpdGggJy0tLScgY291bGQgYmUgbWlzdGFrZW4gZm9yIHRoZSBcInJlbW92ZSBsaW5lXCIgb3BlcmF0aW9uXG5cdCAgICAgIC8vIEJ1dCB0aGV5IGNvdWxkIGJlIHRoZSBoZWFkZXIgZm9yIHRoZSBuZXh0IGZpbGUuIFRoZXJlZm9yZSBwcnVuZSBzdWNoIGNhc2VzIG91dC5cblx0ICAgICAgaWYgKGRpZmZzdHJbaV0uaW5kZXhPZignLS0tICcpID09PSAwICYmIGkgKyAyIDwgZGlmZnN0ci5sZW5ndGggJiYgZGlmZnN0cltpICsgMV0uaW5kZXhPZignKysrICcpID09PSAwICYmIGRpZmZzdHJbaSArIDJdLmluZGV4T2YoJ0BAJykgPT09IDApIHtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgfVxuXHQgICAgICB2YXIgb3BlcmF0aW9uID0gZGlmZnN0cltpXVswXTtcblxuXHQgICAgICBpZiAob3BlcmF0aW9uID09PSAnKycgfHwgb3BlcmF0aW9uID09PSAnLScgfHwgb3BlcmF0aW9uID09PSAnICcgfHwgb3BlcmF0aW9uID09PSAnXFxcXCcpIHtcblx0ICAgICAgICBodW5rLmxpbmVzLnB1c2goZGlmZnN0cltpXSk7XG5cdCAgICAgICAgaHVuay5saW5lZGVsaW1pdGVycy5wdXNoKGRlbGltaXRlcnNbaV0gfHwgJ1xcbicpO1xuXG5cdCAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJysnKSB7XG5cdCAgICAgICAgICBhZGRDb3VudCsrO1xuXHQgICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSAnLScpIHtcblx0ICAgICAgICAgIHJlbW92ZUNvdW50Kys7XG5cdCAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICcgJykge1xuXHQgICAgICAgICAgYWRkQ291bnQrKztcblx0ICAgICAgICAgIHJlbW92ZUNvdW50Kys7XG5cdCAgICAgICAgfVxuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICB9XG5cdCAgICB9XG5cblx0ICAgIC8vIEhhbmRsZSB0aGUgZW1wdHkgYmxvY2sgY291bnQgY2FzZVxuXHQgICAgaWYgKCFhZGRDb3VudCAmJiBodW5rLm5ld0xpbmVzID09PSAxKSB7XG5cdCAgICAgIGh1bmsubmV3TGluZXMgPSAwO1xuXHQgICAgfVxuXHQgICAgaWYgKCFyZW1vdmVDb3VudCAmJiBodW5rLm9sZExpbmVzID09PSAxKSB7XG5cdCAgICAgIGh1bmsub2xkTGluZXMgPSAwO1xuXHQgICAgfVxuXG5cdCAgICAvLyBQZXJmb3JtIG9wdGlvbmFsIHNhbml0eSBjaGVja2luZ1xuXHQgICAgaWYgKG9wdGlvbnMuc3RyaWN0KSB7XG5cdCAgICAgIGlmIChhZGRDb3VudCAhPT0gaHVuay5uZXdMaW5lcykge1xuXHQgICAgICAgIHRocm93IG5ldyBFcnJvcignQWRkZWQgbGluZSBjb3VudCBkaWQgbm90IG1hdGNoIGZvciBodW5rIGF0IGxpbmUgJyArIChjaHVua0hlYWRlckluZGV4ICsgMSkpO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChyZW1vdmVDb3VudCAhPT0gaHVuay5vbGRMaW5lcykge1xuXHQgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVtb3ZlZCBsaW5lIGNvdW50IGRpZCBub3QgbWF0Y2ggZm9yIGh1bmsgYXQgbGluZSAnICsgKGNodW5rSGVhZGVySW5kZXggKyAxKSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblxuXHQgICAgcmV0dXJuIGh1bms7XG5cdCAgfVxuXG5cdCAgd2hpbGUgKGkgPCBkaWZmc3RyLmxlbmd0aCkge1xuXHQgICAgcGFyc2VJbmRleCgpO1xuXHQgIH1cblxuXHQgIHJldHVybiBsaXN0O1xuXHR9XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OXdZWFJqYUM5d1lYSnpaUzVxY3lKZExDSnVZVzFsY3lJNld5SndZWEp6WlZCaGRHTm9JaXdpZFc1cFJHbG1aaUlzSW05d2RHbHZibk1pTENKa2FXWm1jM1J5SWl3aWMzQnNhWFFpTENKa1pXeHBiV2wwWlhKeklpd2liV0YwWTJnaUxDSnNhWE4wSWl3aWFTSXNJbkJoY25ObFNXNWtaWGdpTENKcGJtUmxlQ0lzSW5CMWMyZ2lMQ0pzWlc1bmRHZ2lMQ0pzYVc1bElpd2lkR1Z6ZENJc0ltaGxZV1JsY2lJc0ltVjRaV01pTENKd1lYSnpaVVpwYkdWSVpXRmtaWElpTENKb2RXNXJjeUlzSW5CaGNuTmxTSFZ1YXlJc0luTjBjbWxqZENJc0lrVnljbTl5SWl3aVNsTlBUaUlzSW5OMGNtbHVaMmxtZVNJc0ltaGxZV1JsY2xCaGRIUmxjbTRpTENKbWFXeGxTR1ZoWkdWeUlpd2lhMlY1VUhKbFptbDRJaXdpWm1sc1pVNWhiV1VpTENKeVpYQnNZV05sSWl3aWMzVmljM1J5SWl3aVkyaDFibXRJWldGa1pYSkpibVJsZUNJc0ltTm9kVzVyU0dWaFpHVnlUR2x1WlNJc0ltTm9kVzVyU0dWaFpHVnlJaXdpYUhWdWF5SXNJbTlzWkZOMFlYSjBJaXdpYjJ4a1RHbHVaWE1pTENKdVpYZFRkR0Z5ZENJc0ltNWxkMHhwYm1Weklpd2liR2x1WlhNaUxDSnNhVzVsWkdWc2FXMXBkR1Z5Y3lJc0ltRmtaRU52ZFc1MElpd2ljbVZ0YjNabFEyOTFiblFpTENKcGJtUmxlRTltSWl3aWIzQmxjbUYwYVc5dUlsMHNJbTFoY0hCcGJtZHpJam9pT3pzN1owTkJRV2RDUVN4VkxFZEJRVUZCTEZVN1FVRkJWQ3hUUVVGVFFTeFZRVUZVTEVOQlFXOUNReXhQUVVGd1FpeEZRVUV5UXp0QlFVRkJMSE5FUVVGa1F5eFBRVUZqTEhWRlFVRktMRVZCUVVrN08wRkJRMmhFTEUxQlFVbERMRlZCUVZWR0xGRkJRVkZITEV0QlFWSXNRMEZCWXl4eFFrRkJaQ3hEUVVGa08wRkJRVUVzVFVGRFNVTXNZVUZCWVVvc1VVRkJVVXNzUzBGQlVpeERRVUZqTEhOQ1FVRmtMRXRCUVhsRExFVkJSREZFTzBGQlFVRXNUVUZGU1VNc1QwRkJUeXhGUVVaWU8wRkJRVUVzVFVGSFNVTXNTVUZCU1N4RFFVaFNPenRCUVV0QkxGZEJRVk5ETEZWQlFWUXNSMEZCYzBJN1FVRkRjRUlzVVVGQlNVTXNVVUZCVVN4RlFVRmFPMEZCUTBGSUxGTkJRVXRKTEVsQlFVd3NRMEZCVlVRc1MwRkJWanM3UVVGRlFUdEJRVU5CTEZkQlFVOUdMRWxCUVVsTUxGRkJRVkZUTEUxQlFXNUNMRVZCUVRKQ08wRkJRM3BDTEZWQlFVbERMRTlCUVU5V0xGRkJRVkZMTEVOQlFWSXNRMEZCV0RzN1FVRkZRVHRCUVVOQkxGVkJRVWtzZDBKQlFYZENUU3hKUVVGNFFpeERRVUUyUWtRc1NVRkJOMElzUTBGQlNpeEZRVUYzUXp0QlFVTjBRenRCUVVORU96dEJRVVZFTzBGQlEwRXNWVUZCU1VVc1UwRkJWU3d3UTBGQlJDeERRVUUyUTBNc1NVRkJOME1zUTBGQmEwUklMRWxCUVd4RUxFTkJRV0k3UVVGRFFTeFZRVUZKUlN4TlFVRktMRVZCUVZrN1FVRkRWa3dzWTBGQlRVRXNTMEZCVGl4SFFVRmpTeXhQUVVGUExFTkJRVkFzUTBGQlpEdEJRVU5FT3p0QlFVVkVVRHRCUVVORU96dEJRVVZFTzBGQlEwRTdRVUZEUVZNc2IwSkJRV2RDVUN4TFFVRm9RanRCUVVOQlR5eHZRa0ZCWjBKUUxFdEJRV2hDT3p0QlFVVkJPMEZCUTBGQkxGVkJRVTFSTEV0QlFVNHNSMEZCWXl4RlFVRmtPenRCUVVWQkxGZEJRVTlXTEVsQlFVbE1MRkZCUVZGVExFMUJRVzVDTEVWQlFUSkNPMEZCUTNwQ0xGVkJRVWxETEZGQlFVOVdMRkZCUVZGTExFTkJRVklzUTBGQldEczdRVUZGUVN4VlFVRkpMR2xEUVVGcFEwMHNTVUZCYWtNc1EwRkJjME5FTEV0QlFYUkRMRU5CUVVvc1JVRkJhVVE3UVVGREwwTTdRVUZEUkN4UFFVWkVMRTFCUlU4c1NVRkJTU3hOUVVGTlF5eEpRVUZPTEVOQlFWZEVMRXRCUVZnc1EwRkJTaXhGUVVGelFqdEJRVU16UWtnc1kwRkJUVkVzUzBGQlRpeERRVUZaVUN4SlFVRmFMRU5CUVdsQ1VTeFhRVUZxUWp0QlFVTkVMRTlCUmswc1RVRkZRU3hKUVVGSlRpeFRRVUZSV0N4UlFVRlJhMElzVFVGQmNFSXNSVUZCTkVJN1FVRkRha003UVVGRFFTeGpRVUZOTEVsQlFVbERMRXRCUVVvc1EwRkJWU3h0UWtGQmJVSmlMRWxCUVVrc1EwRkJka0lzU1VGQk5FSXNSMEZCTlVJc1IwRkJhME5qTEV0QlFVdERMRk5CUVV3c1EwRkJaVllzUzBGQlppeERRVUUxUXl4RFFVRk9PMEZCUTBRc1QwRklUU3hOUVVkQk8wRkJRMHhNTzBGQlEwUTdRVUZEUmp0QlFVTkdPenRCUVVWRU8wRkJRMEU3UVVGRFFTeFhRVUZUVXl4bFFVRlVMRU5CUVhsQ1VDeExRVUY2UWl4RlFVRm5RenRCUVVNNVFpeFJRVUZOWXl4blFrRkJaMElzTUVOQlFYUkNPMEZCUTBFc1VVRkJUVU1zWVVGQllVUXNZMEZCWTFJc1NVRkJaQ3hEUVVGdFFtSXNVVUZCVVVzc1EwRkJVaXhEUVVGdVFpeERRVUZ1UWp0QlFVTkJMRkZCUVVscFFpeFZRVUZLTEVWQlFXZENPMEZCUTJRc1ZVRkJTVU1zV1VGQldVUXNWMEZCVnl4RFFVRllMRTFCUVd0Q0xFdEJRV3hDTEVkQlFUQkNMRXRCUVRGQ0xFZEJRV3RETEV0QlFXeEVPMEZCUTBFc1ZVRkJTVVVzVjBGQlYwWXNWMEZCVnl4RFFVRllMRVZCUVdOSExFOUJRV1FzUTBGQmMwSXNUMEZCZEVJc1JVRkJLMElzU1VGQkwwSXNRMEZCWmp0QlFVTkJMRlZCUVVrc1UwRkJVMlFzU1VGQlZDeERRVUZqWVN4UlFVRmtMRU5CUVVvc1JVRkJOa0k3UVVGRE0wSkJMRzFDUVVGWFFTeFRRVUZUUlN4TlFVRlVMRU5CUVdkQ0xFTkJRV2hDTEVWQlFXMUNSaXhUUVVGVFppeE5RVUZVTEVkQlFXdENMRU5CUVhKRExFTkJRVmc3UVVGRFJEdEJRVU5FUml4WlFVRk5aMElzV1VGQldTeFZRVUZzUWl4SlFVRm5RME1zVVVGQmFFTTdRVUZEUVdwQ0xGbEJRVTFuUWl4WlFVRlpMRkZCUVd4Q0xFbEJRVGhDUkN4WFFVRlhMRU5CUVZnc1EwRkJPVUk3TzBGQlJVRnFRanRCUVVORU8wRkJRMFk3TzBGQlJVUTdRVUZEUVR0QlFVTkJMRmRCUVZOWExGTkJRVlFzUjBGQmNVSTdRVUZEYmtJc1VVRkJTVmNzYlVKQlFXMUNkRUlzUTBGQmRrSTdRVUZCUVN4UlFVTkpkVUlzYTBKQlFXdENOVUlzVVVGQlVVc3NSMEZCVWl4RFFVUjBRanRCUVVGQkxGRkJSVWwzUWl4alFVRmpSQ3huUWtGQlowSXpRaXhMUVVGb1FpeERRVUZ6UWl3MFEwRkJkRUlzUTBGR2JFSTdPMEZCU1VFc1VVRkJTVFpDTEU5QlFVODdRVUZEVkVNc1owSkJRVlVzUTBGQlEwWXNXVUZCV1N4RFFVRmFMRU5CUkVZN1FVRkZWRWNzWjBKQlFWVXNRMEZCUTBnc1dVRkJXU3hEUVVGYUxFTkJRVVFzU1VGQmJVSXNRMEZHY0VJN1FVRkhWRWtzWjBKQlFWVXNRMEZCUTBvc1dVRkJXU3hEUVVGYUxFTkJTRVk3UVVGSlZFc3NaMEpCUVZVc1EwRkJRMHdzV1VGQldTeERRVUZhTEVOQlFVUXNTVUZCYlVJc1EwRktjRUk3UVVGTFZFMHNZVUZCVHl4RlFVeEZPMEZCVFZSRExITkNRVUZuUWp0QlFVNVFMRXRCUVZnN08wRkJVMEVzVVVGQlNVTXNWMEZCVnl4RFFVRm1PMEZCUVVFc1VVRkRTVU1zWTBGQll5eERRVVJzUWp0QlFVVkJMRmRCUVU5cVF5eEpRVUZKVEN4UlFVRlJVeXhOUVVGdVFpeEZRVUV5UWtvc1IwRkJNMElzUlVGQlowTTdRVUZET1VJN1FVRkRRVHRCUVVOQkxGVkJRVWxNTEZGQlFWRkxMRU5CUVZJc1JVRkJWMnRETEU5QlFWZ3NRMEZCYlVJc1RVRkJia0lzVFVGQkswSXNRMEZCTDBJc1NVRkRUV3hETEVsQlFVa3NRMEZCU2l4SFFVRlJUQ3hSUVVGUlV5eE5RVVIwUWl4SlFVVkxWQ3hSUVVGUlN5eEpRVUZKTEVOQlFWb3NSVUZCWld0RExFOUJRV1lzUTBGQmRVSXNUVUZCZGtJc1RVRkJiVU1zUTBGR2VFTXNTVUZIUzNaRExGRkJRVkZMTEVsQlFVa3NRMEZCV2l4RlFVRmxhME1zVDBGQlppeERRVUYxUWl4SlFVRjJRaXhOUVVGcFF5eERRVWd4UXl4RlFVYzJRenRCUVVONlF6dEJRVU5JTzBGQlEwUXNWVUZCU1VNc1dVRkJXWGhETEZGQlFWRkxMRU5CUVZJc1JVRkJWeXhEUVVGWUxFTkJRV2hDT3p0QlFVVkJMRlZCUVVsdFF5eGpRVUZqTEVkQlFXUXNTVUZCY1VKQkxHTkJRV01zUjBGQmJrTXNTVUZCTUVOQkxHTkJRV01zUjBGQmVFUXNTVUZCSzBSQkxHTkJRV01zU1VGQmFrWXNSVUZCZFVZN1FVRkRja1pXTEdGQlFVdExMRXRCUVV3c1EwRkJWek5DTEVsQlFWZ3NRMEZCWjBKU0xGRkJRVkZMTEVOQlFWSXNRMEZCYUVJN1FVRkRRWGxDTEdGQlFVdE5MR05CUVV3c1EwRkJiMEkxUWl4SlFVRndRaXhEUVVGNVFrNHNWMEZCVjBjc1EwRkJXQ3hMUVVGcFFpeEpRVUV4UXpzN1FVRkZRU3haUVVGSmJVTXNZMEZCWXl4SFFVRnNRaXhGUVVGMVFqdEJRVU55UWtnN1FVRkRSQ3hUUVVaRUxFMUJSVThzU1VGQlNVY3NZMEZCWXl4SFFVRnNRaXhGUVVGMVFqdEJRVU0xUWtZN1FVRkRSQ3hUUVVaTkxFMUJSVUVzU1VGQlNVVXNZMEZCWXl4SFFVRnNRaXhGUVVGMVFqdEJRVU0xUWtnN1FVRkRRVU03UVVGRFJEdEJRVU5HTEU5QldrUXNUVUZaVHp0QlFVTk1PMEZCUTBRN1FVRkRSanM3UVVGRlJEdEJRVU5CTEZGQlFVa3NRMEZCUTBRc1VVRkJSQ3hKUVVGaFVDeExRVUZMU1N4UlFVRk1MRXRCUVd0Q0xFTkJRVzVETEVWQlFYTkRPMEZCUTNCRFNpeFhRVUZMU1N4UlFVRk1MRWRCUVdkQ0xFTkJRV2hDTzBGQlEwUTdRVUZEUkN4UlFVRkpMRU5CUVVOSkxGZEJRVVFzU1VGQlowSlNMRXRCUVV0RkxGRkJRVXdzUzBGQmEwSXNRMEZCZEVNc1JVRkJlVU03UVVGRGRrTkdMRmRCUVV0RkxGRkJRVXdzUjBGQlowSXNRMEZCYUVJN1FVRkRSRHM3UVVGRlJEdEJRVU5CTEZGQlFVbHFReXhSUVVGUmEwSXNUVUZCV2l4RlFVRnZRanRCUVVOc1FpeFZRVUZKYjBJc1lVRkJZVkFzUzBGQlMwa3NVVUZCZEVJc1JVRkJaME03UVVGRE9VSXNZMEZCVFN4SlFVRkphRUlzUzBGQlNpeERRVUZWTEhORVFVRnpSRk1zYlVKQlFXMUNMRU5CUVhwRkxFTkJRVllzUTBGQlRqdEJRVU5FTzBGQlEwUXNWVUZCU1Zjc1owSkJRV2RDVWl4TFFVRkxSU3hSUVVGNlFpeEZRVUZ0UXp0QlFVTnFReXhqUVVGTkxFbEJRVWxrTEV0QlFVb3NRMEZCVlN4M1JFRkJkMFJUTEcxQ1FVRnRRaXhEUVVFelJTeERRVUZXTEVOQlFVNDdRVUZEUkR0QlFVTkdPenRCUVVWRUxGZEJRVTlITEVsQlFWQTdRVUZEUkRzN1FVRkZSQ3hUUVVGUGVrSXNTVUZCU1V3c1VVRkJVVk1zVFVGQmJrSXNSVUZCTWtJN1FVRkRla0pJTzBGQlEwUTdPMEZCUlVRc1UwRkJUMFlzU1VGQlVEdEJRVU5FSWl3aVptbHNaU0k2SW5CaGNuTmxMbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaVpYaHdiM0owSUdaMWJtTjBhVzl1SUhCaGNuTmxVR0YwWTJnb2RXNXBSR2xtWml3Z2IzQjBhVzl1Y3lBOUlIdDlLU0I3WEc0Z0lHeGxkQ0JrYVdabWMzUnlJRDBnZFc1cFJHbG1aaTV6Y0d4cGRDZ3ZYRnh5WEZ4dWZGdGNYRzVjWEhaY1hHWmNYSEpjWEhnNE5WMHZLU3hjYmlBZ0lDQWdJR1JsYkdsdGFYUmxjbk1nUFNCMWJtbEVhV1ptTG0xaGRHTm9LQzljWEhKY1hHNThXMXhjYmx4Y2RseGNabHhjY2x4Y2VEZzFYUzluS1NCOGZDQmJYU3hjYmlBZ0lDQWdJR3hwYzNRZ1BTQmJYU3hjYmlBZ0lDQWdJR2tnUFNBd08xeHVYRzRnSUdaMWJtTjBhVzl1SUhCaGNuTmxTVzVrWlhnb0tTQjdYRzRnSUNBZ2JHVjBJR2x1WkdWNElEMGdlMzA3WEc0Z0lDQWdiR2x6ZEM1d2RYTm9LR2x1WkdWNEtUdGNibHh1SUNBZ0lDOHZJRkJoY25ObElHUnBabVlnYldWMFlXUmhkR0ZjYmlBZ0lDQjNhR2xzWlNBb2FTQThJR1JwWm1aemRISXViR1Z1WjNSb0tTQjdYRzRnSUNBZ0lDQnNaWFFnYkdsdVpTQTlJR1JwWm1aemRISmJhVjA3WEc1Y2JpQWdJQ0FnSUM4dklFWnBiR1VnYUdWaFpHVnlJR1p2ZFc1a0xDQmxibVFnY0dGeWMybHVaeUJrYVdabUlHMWxkR0ZrWVhSaFhHNGdJQ0FnSUNCcFppQW9MMTRvWEZ3dFhGd3RYRnd0ZkZ4Y0sxeGNLMXhjSzN4QVFDbGNYSE12TG5SbGMzUW9iR2x1WlNrcElIdGNiaUFnSUNBZ0lDQWdZbkpsWVdzN1hHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDOHZJRVJwWm1ZZ2FXNWtaWGhjYmlBZ0lDQWdJR3hsZENCb1pXRmtaWElnUFNBb0wxNG9QenBKYm1SbGVEcDhaR2xtWmlnL09pQXRjaUJjWEhjcktTc3BYRnh6S3lndUt6OHBYRnh6S2lRdktTNWxlR1ZqS0d4cGJtVXBPMXh1SUNBZ0lDQWdhV1lnS0dobFlXUmxjaWtnZTF4dUlDQWdJQ0FnSUNCcGJtUmxlQzVwYm1SbGVDQTlJR2hsWVdSbGNsc3hYVHRjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnYVNzck8xeHVJQ0FnSUgxY2JseHVJQ0FnSUM4dklGQmhjbk5sSUdacGJHVWdhR1ZoWkdWeWN5QnBaaUIwYUdWNUlHRnlaU0JrWldacGJtVmtMaUJWYm1sbWFXVmtJR1JwWm1ZZ2NtVnhkV2x5WlhNZ2RHaGxiU3dnWW5WMFhHNGdJQ0FnTHk4Z2RHaGxjbVVuY3lCdWJ5QjBaV05vYm1sallXd2dhWE56ZFdWeklIUnZJR2hoZG1VZ1lXNGdhWE52YkdGMFpXUWdhSFZ1YXlCM2FYUm9iM1YwSUdacGJHVWdhR1ZoWkdWeVhHNGdJQ0FnY0dGeWMyVkdhV3hsU0dWaFpHVnlLR2x1WkdWNEtUdGNiaUFnSUNCd1lYSnpaVVpwYkdWSVpXRmtaWElvYVc1a1pYZ3BPMXh1WEc0Z0lDQWdMeThnVUdGeWMyVWdhSFZ1YTNOY2JpQWdJQ0JwYm1SbGVDNW9kVzVyY3lBOUlGdGRPMXh1WEc0Z0lDQWdkMmhwYkdVZ0tHa2dQQ0JrYVdabWMzUnlMbXhsYm1kMGFDa2dlMXh1SUNBZ0lDQWdiR1YwSUd4cGJtVWdQU0JrYVdabWMzUnlXMmxkTzF4dVhHNGdJQ0FnSUNCcFppQW9MMTRvU1c1a1pYZzZmR1JwWm1aOFhGd3RYRnd0WEZ3dGZGeGNLMXhjSzF4Y0t5bGNYSE12TG5SbGMzUW9iR2x1WlNrcElIdGNiaUFnSUNBZ0lDQWdZbkpsWVdzN1hHNGdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tDOWVRRUF2TG5SbGMzUW9iR2x1WlNrcElIdGNiaUFnSUNBZ0lDQWdhVzVrWlhndWFIVnVhM011Y0hWemFDaHdZWEp6WlVoMWJtc29LU2s3WEc0Z0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0d4cGJtVWdKaVlnYjNCMGFXOXVjeTV6ZEhKcFkzUXBJSHRjYmlBZ0lDQWdJQ0FnTHk4Z1NXZHViM0psSUhWdVpYaHdaV04wWldRZ1kyOXVkR1Z1ZENCMWJteGxjM01nYVc0Z2MzUnlhV04wSUcxdlpHVmNiaUFnSUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtDZFZibXR1YjNkdUlHeHBibVVnSnlBcklDaHBJQ3NnTVNrZ0t5QW5JQ2NnS3lCS1UwOU9Mbk4wY21sdVoybG1lU2hzYVc1bEtTazdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQnBLeXM3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1SUNCOVhHNWNiaUFnTHk4Z1VHRnljMlZ6SUhSb1pTQXRMUzBnWVc1a0lDc3JLeUJvWldGa1pYSnpMQ0JwWmlCdWIyNWxJR0Z5WlNCbWIzVnVaQ3dnYm04Z2JHbHVaWE5jYmlBZ0x5OGdZWEpsSUdOdmJuTjFiV1ZrTGx4dUlDQm1kVzVqZEdsdmJpQndZWEp6WlVacGJHVklaV0ZrWlhJb2FXNWtaWGdwSUh0Y2JpQWdJQ0JqYjI1emRDQm9aV0ZrWlhKUVlYUjBaWEp1SUQwZ0wxNG9MUzB0ZkZ4Y0sxeGNLMXhjS3lsY1hITXJLRnRjWEZNZ1hTb3BLRDg2WEZ4MEtDNHFQeWxjWEhNcUtUOGtMenRjYmlBZ0lDQmpiMjV6ZENCbWFXeGxTR1ZoWkdWeUlEMGdhR1ZoWkdWeVVHRjBkR1Z5Ymk1bGVHVmpLR1JwWm1aemRISmJhVjBwTzF4dUlDQWdJR2xtSUNobWFXeGxTR1ZoWkdWeUtTQjdYRzRnSUNBZ0lDQnNaWFFnYTJWNVVISmxabWw0SUQwZ1ptbHNaVWhsWVdSbGNsc3hYU0E5UFQwZ0p5MHRMU2NnUHlBbmIyeGtKeUE2SUNkdVpYY25PMXh1SUNBZ0lDQWdiR1YwSUdacGJHVk9ZVzFsSUQwZ1ptbHNaVWhsWVdSbGNsc3lYUzV5WlhCc1lXTmxLQzljWEZ4Y1hGeGNYQzluTENBblhGeGNYQ2NwTzF4dUlDQWdJQ0FnYVdZZ0tDOWVYQ0l1S2x3aUpDOHVkR1Z6ZENobWFXeGxUbUZ0WlNrcElIdGNiaUFnSUNBZ0lDQWdabWxzWlU1aGJXVWdQU0JtYVd4bFRtRnRaUzV6ZFdKemRISW9NU3dnWm1sc1pVNWhiV1V1YkdWdVozUm9JQzBnTWlrN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCcGJtUmxlRnRyWlhsUWNtVm1hWGdnS3lBblJtbHNaVTVoYldVblhTQTlJR1pwYkdWT1lXMWxPMXh1SUNBZ0lDQWdhVzVrWlhoYmEyVjVVSEpsWm1sNElDc2dKMGhsWVdSbGNpZGRJRDBnWm1sc1pVaGxZV1JsY2xzelhUdGNibHh1SUNBZ0lDQWdhU3NyTzF4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUM4dklGQmhjbk5sY3lCaElHaDFibXRjYmlBZ0x5OGdWR2hwY3lCaGMzTjFiV1Z6SUhSb1lYUWdkMlVnWVhKbElHRjBJSFJvWlNCemRHRnlkQ0J2WmlCaElHaDFibXN1WEc0Z0lHWjFibU4wYVc5dUlIQmhjbk5sU0hWdWF5Z3BJSHRjYmlBZ0lDQnNaWFFnWTJoMWJtdElaV0ZrWlhKSmJtUmxlQ0E5SUdrc1hHNGdJQ0FnSUNBZ0lHTm9kVzVyU0dWaFpHVnlUR2x1WlNBOUlHUnBabVp6ZEhKYmFTc3JYU3hjYmlBZ0lDQWdJQ0FnWTJoMWJtdElaV0ZrWlhJZ1BTQmphSFZ1YTBobFlXUmxja3hwYm1VdWMzQnNhWFFvTDBCQUlDMG9YRnhrS3lrb1B6b3NLRnhjWkNzcEtUOGdYRndyS0Z4Y1pDc3BLRDg2TENoY1hHUXJLU2svSUVCQUx5azdYRzVjYmlBZ0lDQnNaWFFnYUhWdWF5QTlJSHRjYmlBZ0lDQWdJRzlzWkZOMFlYSjBPaUFyWTJoMWJtdElaV0ZrWlhKYk1WMHNYRzRnSUNBZ0lDQnZiR1JNYVc1bGN6b2dLMk5vZFc1clNHVmhaR1Z5V3pKZElIeDhJREVzWEc0Z0lDQWdJQ0J1WlhkVGRHRnlkRG9nSzJOb2RXNXJTR1ZoWkdWeVd6TmRMRnh1SUNBZ0lDQWdibVYzVEdsdVpYTTZJQ3RqYUhWdWEwaGxZV1JsY2xzMFhTQjhmQ0F4TEZ4dUlDQWdJQ0FnYkdsdVpYTTZJRnRkTEZ4dUlDQWdJQ0FnYkdsdVpXUmxiR2x0YVhSbGNuTTZJRnRkWEc0Z0lDQWdmVHRjYmx4dUlDQWdJR3hsZENCaFpHUkRiM1Z1ZENBOUlEQXNYRzRnSUNBZ0lDQWdJSEpsYlc5MlpVTnZkVzUwSUQwZ01EdGNiaUFnSUNCbWIzSWdLRHNnYVNBOElHUnBabVp6ZEhJdWJHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQWdJQzh2SUV4cGJtVnpJSE4wWVhKMGFXNW5JSGRwZEdnZ0p5MHRMU2NnWTI5MWJHUWdZbVVnYldsemRHRnJaVzRnWm05eUlIUm9aU0JjSW5KbGJXOTJaU0JzYVc1bFhDSWdiM0JsY21GMGFXOXVYRzRnSUNBZ0lDQXZMeUJDZFhRZ2RHaGxlU0JqYjNWc1pDQmlaU0IwYUdVZ2FHVmhaR1Z5SUdadmNpQjBhR1VnYm1WNGRDQm1hV3hsTGlCVWFHVnlaV1p2Y21VZ2NISjFibVVnYzNWamFDQmpZWE5sY3lCdmRYUXVYRzRnSUNBZ0lDQnBaaUFvWkdsbVpuTjBjbHRwWFM1cGJtUmxlRTltS0NjdExTMGdKeWtnUFQwOUlEQmNiaUFnSUNBZ0lDQWdJQ0FnSUNZbUlDaHBJQ3NnTWlBOElHUnBabVp6ZEhJdWJHVnVaM1JvS1Z4dUlDQWdJQ0FnSUNBZ0lDQWdKaVlnWkdsbVpuTjBjbHRwSUNzZ01WMHVhVzVrWlhoUFppZ25LeXNySUNjcElEMDlQU0F3WEc0Z0lDQWdJQ0FnSUNBZ0lDQW1KaUJrYVdabWMzUnlXMmtnS3lBeVhTNXBibVJsZUU5bUtDZEFRQ2NwSUQwOVBTQXdLU0I3WEc0Z0lDQWdJQ0FnSUNBZ1luSmxZV3M3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0JzWlhRZ2IzQmxjbUYwYVc5dUlEMGdaR2xtWm5OMGNsdHBYVnN3WFR0Y2JseHVJQ0FnSUNBZ2FXWWdLRzl3WlhKaGRHbHZiaUE5UFQwZ0p5c25JSHg4SUc5d1pYSmhkR2x2YmlBOVBUMGdKeTBuSUh4OElHOXdaWEpoZEdsdmJpQTlQVDBnSnlBbklIeDhJRzl3WlhKaGRHbHZiaUE5UFQwZ0oxeGNYRnduS1NCN1hHNGdJQ0FnSUNBZ0lHaDFibXN1YkdsdVpYTXVjSFZ6YUNoa2FXWm1jM1J5VzJsZEtUdGNiaUFnSUNBZ0lDQWdhSFZ1YXk1c2FXNWxaR1ZzYVcxcGRHVnljeTV3ZFhOb0tHUmxiR2x0YVhSbGNuTmJhVjBnZkh3Z0oxeGNiaWNwTzF4dVhHNGdJQ0FnSUNBZ0lHbG1JQ2h2Y0dWeVlYUnBiMjRnUFQwOUlDY3JKeWtnZTF4dUlDQWdJQ0FnSUNBZ0lHRmtaRU52ZFc1MEt5czdYRzRnSUNBZ0lDQWdJSDBnWld4elpTQnBaaUFvYjNCbGNtRjBhVzl1SUQwOVBTQW5MU2NwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnlaVzF2ZG1WRGIzVnVkQ3NyTzF4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tHOXdaWEpoZEdsdmJpQTlQVDBnSnlBbktTQjdYRzRnSUNBZ0lDQWdJQ0FnWVdSa1EyOTFiblFyS3p0Y2JpQWdJQ0FnSUNBZ0lDQnlaVzF2ZG1WRGIzVnVkQ3NyTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNCaWNtVmhhenRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzVjYmlBZ0lDQXZMeUJJWVc1a2JHVWdkR2hsSUdWdGNIUjVJR0pzYjJOcklHTnZkVzUwSUdOaGMyVmNiaUFnSUNCcFppQW9JV0ZrWkVOdmRXNTBJQ1ltSUdoMWJtc3VibVYzVEdsdVpYTWdQVDA5SURFcElIdGNiaUFnSUNBZ0lHaDFibXN1Ym1WM1RHbHVaWE1nUFNBd08xeHVJQ0FnSUgxY2JpQWdJQ0JwWmlBb0lYSmxiVzkyWlVOdmRXNTBJQ1ltSUdoMWJtc3ViMnhrVEdsdVpYTWdQVDA5SURFcElIdGNiaUFnSUNBZ0lHaDFibXN1YjJ4a1RHbHVaWE1nUFNBd08xeHVJQ0FnSUgxY2JseHVJQ0FnSUM4dklGQmxjbVp2Y20wZ2IzQjBhVzl1WVd3Z2MyRnVhWFI1SUdOb1pXTnJhVzVuWEc0Z0lDQWdhV1lnS0c5d2RHbHZibk11YzNSeWFXTjBLU0I3WEc0Z0lDQWdJQ0JwWmlBb1lXUmtRMjkxYm5RZ0lUMDlJR2gxYm1zdWJtVjNUR2x1WlhNcElIdGNiaUFnSUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtDZEJaR1JsWkNCc2FXNWxJR052ZFc1MElHUnBaQ0J1YjNRZ2JXRjBZMmdnWm05eUlHaDFibXNnWVhRZ2JHbHVaU0FuSUNzZ0tHTm9kVzVyU0dWaFpHVnlTVzVrWlhnZ0t5QXhLU2s3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0JwWmlBb2NtVnRiM1psUTI5MWJuUWdJVDA5SUdoMWJtc3ViMnhrVEdsdVpYTXBJSHRjYmlBZ0lDQWdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLQ2RTWlcxdmRtVmtJR3hwYm1VZ1kyOTFiblFnWkdsa0lHNXZkQ0J0WVhSamFDQm1iM0lnYUhWdWF5QmhkQ0JzYVc1bElDY2dLeUFvWTJoMWJtdElaV0ZrWlhKSmJtUmxlQ0FySURFcEtUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNWNiaUFnSUNCeVpYUjFjbTRnYUhWdWF6dGNiaUFnZlZ4dVhHNGdJSGRvYVd4bElDaHBJRHdnWkdsbVpuTjBjaTVzWlc1bmRHZ3BJSHRjYmlBZ0lDQndZWEp6WlVsdVpHVjRLQ2s3WEc0Z0lIMWNibHh1SUNCeVpYUjFjbTRnYkdsemREdGNibjFjYmlKZGZRPT1cblxuXG4vKioqLyB9KSxcbi8qIDEyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1widXNlIHN0cmljdFwiO1xuXG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2Z1bmN0aW9uIChzdGFydCwgbWluTGluZSwgbWF4TGluZSkge1xuXHQgIHZhciB3YW50Rm9yd2FyZCA9IHRydWUsXG5cdCAgICAgIGJhY2t3YXJkRXhoYXVzdGVkID0gZmFsc2UsXG5cdCAgICAgIGZvcndhcmRFeGhhdXN0ZWQgPSBmYWxzZSxcblx0ICAgICAgbG9jYWxPZmZzZXQgPSAxO1xuXG5cdCAgcmV0dXJuIGZ1bmN0aW9uIGl0ZXJhdG9yKCkge1xuXHQgICAgaWYgKHdhbnRGb3J3YXJkICYmICFmb3J3YXJkRXhoYXVzdGVkKSB7XG5cdCAgICAgIGlmIChiYWNrd2FyZEV4aGF1c3RlZCkge1xuXHQgICAgICAgIGxvY2FsT2Zmc2V0Kys7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgd2FudEZvcndhcmQgPSBmYWxzZTtcblx0ICAgICAgfVxuXG5cdCAgICAgIC8vIENoZWNrIGlmIHRyeWluZyB0byBmaXQgYmV5b25kIHRleHQgbGVuZ3RoLCBhbmQgaWYgbm90LCBjaGVjayBpdCBmaXRzXG5cdCAgICAgIC8vIGFmdGVyIG9mZnNldCBsb2NhdGlvbiAob3IgZGVzaXJlZCBsb2NhdGlvbiBvbiBmaXJzdCBpdGVyYXRpb24pXG5cdCAgICAgIGlmIChzdGFydCArIGxvY2FsT2Zmc2V0IDw9IG1heExpbmUpIHtcblx0ICAgICAgICByZXR1cm4gbG9jYWxPZmZzZXQ7XG5cdCAgICAgIH1cblxuXHQgICAgICBmb3J3YXJkRXhoYXVzdGVkID0gdHJ1ZTtcblx0ICAgIH1cblxuXHQgICAgaWYgKCFiYWNrd2FyZEV4aGF1c3RlZCkge1xuXHQgICAgICBpZiAoIWZvcndhcmRFeGhhdXN0ZWQpIHtcblx0ICAgICAgICB3YW50Rm9yd2FyZCA9IHRydWU7XG5cdCAgICAgIH1cblxuXHQgICAgICAvLyBDaGVjayBpZiB0cnlpbmcgdG8gZml0IGJlZm9yZSB0ZXh0IGJlZ2lubmluZywgYW5kIGlmIG5vdCwgY2hlY2sgaXQgZml0c1xuXHQgICAgICAvLyBiZWZvcmUgb2Zmc2V0IGxvY2F0aW9uXG5cdCAgICAgIGlmIChtaW5MaW5lIDw9IHN0YXJ0IC0gbG9jYWxPZmZzZXQpIHtcblx0ICAgICAgICByZXR1cm4gLWxvY2FsT2Zmc2V0Kys7XG5cdCAgICAgIH1cblxuXHQgICAgICBiYWNrd2FyZEV4aGF1c3RlZCA9IHRydWU7XG5cdCAgICAgIHJldHVybiBpdGVyYXRvcigpO1xuXHQgICAgfVxuXG5cdCAgICAvLyBXZSB0cmllZCB0byBmaXQgaHVuayBiZWZvcmUgdGV4dCBiZWdpbm5pbmcgYW5kIGJleW9uZCB0ZXh0IGxlbmd0aCwgdGhlblxuXHQgICAgLy8gaHVuayBjYW4ndCBmaXQgb24gdGhlIHRleHQuIFJldHVybiB1bmRlZmluZWRcblx0ICB9O1xuXHR9O1xuXHQvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTkxZEdsc0wyUnBjM1JoYm1ObExXbDBaWEpoZEc5eUxtcHpJbDBzSW01aGJXVnpJanBiSW5OMFlYSjBJaXdpYldsdVRHbHVaU0lzSW0xaGVFeHBibVVpTENKM1lXNTBSbTl5ZDJGeVpDSXNJbUpoWTJ0M1lYSmtSWGhvWVhWemRHVmtJaXdpWm05eWQyRnlaRVY0YUdGMWMzUmxaQ0lzSW14dlkyRnNUMlptYzJWMElpd2lhWFJsY21GMGIzSWlYU3dpYldGd2NHbHVaM01pT2lJN096czdORU5CUjJVc1ZVRkJVMEVzUzBGQlZDeEZRVUZuUWtNc1QwRkJhRUlzUlVGQmVVSkRMRTlCUVhwQ0xFVkJRV3RETzBGQlF5OURMRTFCUVVsRExHTkJRV01zU1VGQmJFSTdRVUZCUVN4TlFVTkpReXh2UWtGQmIwSXNTMEZFZUVJN1FVRkJRU3hOUVVWSlF5eHRRa0ZCYlVJc1MwRkdka0k3UVVGQlFTeE5RVWRKUXl4alFVRmpMRU5CU0d4Q096dEJRVXRCTEZOQlFVOHNVMEZCVTBNc1VVRkJWQ3hIUVVGdlFqdEJRVU42UWl4UlFVRkpTaXhsUVVGbExFTkJRVU5GTEdkQ1FVRndRaXhGUVVGelF6dEJRVU53UXl4VlFVRkpSQ3hwUWtGQlNpeEZRVUYxUWp0QlFVTnlRa1U3UVVGRFJDeFBRVVpFTEUxQlJVODdRVUZEVEVnc2MwSkJRV01zUzBGQlpEdEJRVU5FT3p0QlFVVkVPMEZCUTBFN1FVRkRRU3hWUVVGSlNDeFJRVUZSVFN4WFFVRlNMRWxCUVhWQ1NpeFBRVUV6UWl4RlFVRnZRenRCUVVOc1F5eGxRVUZQU1N4WFFVRlFPMEZCUTBRN08wRkJSVVJFTEhsQ1FVRnRRaXhKUVVGdVFqdEJRVU5FT3p0QlFVVkVMRkZCUVVrc1EwRkJRMFFzYVVKQlFVd3NSVUZCZDBJN1FVRkRkRUlzVlVGQlNTeERRVUZEUXl4blFrRkJUQ3hGUVVGMVFqdEJRVU55UWtZc2MwSkJRV01zU1VGQlpEdEJRVU5FT3p0QlFVVkVPMEZCUTBFN1FVRkRRU3hWUVVGSlJpeFhRVUZYUkN4UlFVRlJUU3hYUVVGMlFpeEZRVUZ2UXp0QlFVTnNReXhsUVVGUExFTkJRVU5CTEdGQlFWSTdRVUZEUkRzN1FVRkZSRVlzTUVKQlFXOUNMRWxCUVhCQ08wRkJRMEVzWVVGQlQwY3NWVUZCVUR0QlFVTkVPenRCUVVWRU8wRkJRMEU3UVVGRFJDeEhRV3hEUkR0QlFXMURSQ3hESWl3aVptbHNaU0k2SW1ScGMzUmhibU5sTFdsMFpYSmhkRzl5TG1weklpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lMeThnU1hSbGNtRjBiM0lnZEdoaGRDQjBjbUYyWlhKelpYTWdhVzRnZEdobElISmhibWRsSUc5bUlGdHRhVzRzSUcxaGVGMHNJSE4wWlhCd2FXNW5YRzR2THlCaWVTQmthWE4wWVc1alpTQm1jbTl0SUdFZ1oybDJaVzRnYzNSaGNuUWdjRzl6YVhScGIyNHVJRWt1WlM0Z1ptOXlJRnN3TENBMFhTd2dkMmwwYUZ4dUx5OGdjM1JoY25RZ2IyWWdNaXdnZEdocGN5QjNhV3hzSUdsMFpYSmhkR1VnTWl3Z015d2dNU3dnTkN3Z01DNWNibVY0Y0c5eWRDQmtaV1poZFd4MElHWjFibU4wYVc5dUtITjBZWEowTENCdGFXNU1hVzVsTENCdFlYaE1hVzVsS1NCN1hHNGdJR3hsZENCM1lXNTBSbTl5ZDJGeVpDQTlJSFJ5ZFdVc1hHNGdJQ0FnSUNCaVlXTnJkMkZ5WkVWNGFHRjFjM1JsWkNBOUlHWmhiSE5sTEZ4dUlDQWdJQ0FnWm05eWQyRnlaRVY0YUdGMWMzUmxaQ0E5SUdaaGJITmxMRnh1SUNBZ0lDQWdiRzlqWVd4UFptWnpaWFFnUFNBeE8xeHVYRzRnSUhKbGRIVnliaUJtZFc1amRHbHZiaUJwZEdWeVlYUnZjaWdwSUh0Y2JpQWdJQ0JwWmlBb2QyRnVkRVp2Y25kaGNtUWdKaVlnSVdadmNuZGhjbVJGZUdoaGRYTjBaV1FwSUh0Y2JpQWdJQ0FnSUdsbUlDaGlZV05yZDJGeVpFVjRhR0YxYzNSbFpDa2dlMXh1SUNBZ0lDQWdJQ0JzYjJOaGJFOW1abk5sZENzck8xeHVJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ2QyRnVkRVp2Y25kaGNtUWdQU0JtWVd4elpUdGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdMeThnUTJobFkyc2dhV1lnZEhKNWFXNW5JSFJ2SUdacGRDQmlaWGx2Ym1RZ2RHVjRkQ0JzWlc1bmRHZ3NJR0Z1WkNCcFppQnViM1FzSUdOb1pXTnJJR2wwSUdacGRITmNiaUFnSUNBZ0lDOHZJR0ZtZEdWeUlHOW1abk5sZENCc2IyTmhkR2x2YmlBb2IzSWdaR1Z6YVhKbFpDQnNiMk5oZEdsdmJpQnZiaUJtYVhKemRDQnBkR1Z5WVhScGIyNHBYRzRnSUNBZ0lDQnBaaUFvYzNSaGNuUWdLeUJzYjJOaGJFOW1abk5sZENBOFBTQnRZWGhNYVc1bEtTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnNiMk5oYkU5bVpuTmxkRHRjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnWm05eWQyRnlaRVY0YUdGMWMzUmxaQ0E5SUhSeWRXVTdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2FXWWdLQ0ZpWVdOcmQyRnlaRVY0YUdGMWMzUmxaQ2tnZTF4dUlDQWdJQ0FnYVdZZ0tDRm1iM0ozWVhKa1JYaG9ZWFZ6ZEdWa0tTQjdYRzRnSUNBZ0lDQWdJSGRoYm5SR2IzSjNZWEprSUQwZ2RISjFaVHRjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnTHk4Z1EyaGxZMnNnYVdZZ2RISjVhVzVuSUhSdklHWnBkQ0JpWldadmNtVWdkR1Y0ZENCaVpXZHBibTVwYm1jc0lHRnVaQ0JwWmlCdWIzUXNJR05vWldOcklHbDBJR1pwZEhOY2JpQWdJQ0FnSUM4dklHSmxabTl5WlNCdlptWnpaWFFnYkc5allYUnBiMjVjYmlBZ0lDQWdJR2xtSUNodGFXNU1hVzVsSUR3OUlITjBZWEowSUMwZ2JHOWpZV3hQWm1aelpYUXBJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJQzFzYjJOaGJFOW1abk5sZENzck8xeHVJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQmlZV05yZDJGeVpFVjRhR0YxYzNSbFpDQTlJSFJ5ZFdVN1hHNGdJQ0FnSUNCeVpYUjFjbTRnYVhSbGNtRjBiM0lvS1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0F2THlCWFpTQjBjbWxsWkNCMGJ5Qm1hWFFnYUhWdWF5QmlaV1p2Y21VZ2RHVjRkQ0JpWldkcGJtNXBibWNnWVc1a0lHSmxlVzl1WkNCMFpYaDBJR3hsYm1kMGFDd2dkR2hsYmx4dUlDQWdJQzh2SUdoMWJtc2dZMkZ1SjNRZ1ptbDBJRzl1SUhSb1pTQjBaWGgwTGlCU1pYUjFjbTRnZFc1a1pXWnBibVZrWEc0Z0lIMDdYRzU5WEc0aVhYMD1cblxuXG4vKioqLyB9KSxcbi8qIDEzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyd1c2Ugc3RyaWN0JztcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2NhbGNMaW5lQ291bnQgPSBjYWxjTGluZUNvdW50O1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9tZXJnZSA9IG1lcmdlO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2NyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX3BhcnNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fYXJyYXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSBlbHNlIHsgcmV0dXJuIEFycmF5LmZyb20oYXJyKTsgfSB9XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9mdW5jdGlvbiBjYWxjTGluZUNvdW50KGh1bmspIHtcblx0ICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9jYWxjT2xkTmV3TGluZUNvdW50ID0gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jYWxjT2xkTmV3TGluZUNvdW50KGh1bmsubGluZXMpLFxuXHQgICAgICBvbGRMaW5lcyA9IF9jYWxjT2xkTmV3TGluZUNvdW50Lm9sZExpbmVzLFxuXHQgICAgICBuZXdMaW5lcyA9IF9jYWxjT2xkTmV3TGluZUNvdW50Lm5ld0xpbmVzO1xuXG5cdCAgaWYgKG9sZExpbmVzICE9PSB1bmRlZmluZWQpIHtcblx0ICAgIGh1bmsub2xkTGluZXMgPSBvbGRMaW5lcztcblx0ICB9IGVsc2Uge1xuXHQgICAgZGVsZXRlIGh1bmsub2xkTGluZXM7XG5cdCAgfVxuXG5cdCAgaWYgKG5ld0xpbmVzICE9PSB1bmRlZmluZWQpIHtcblx0ICAgIGh1bmsubmV3TGluZXMgPSBuZXdMaW5lcztcblx0ICB9IGVsc2Uge1xuXHQgICAgZGVsZXRlIGh1bmsubmV3TGluZXM7XG5cdCAgfVxuXHR9XG5cblx0ZnVuY3Rpb24gbWVyZ2UobWluZSwgdGhlaXJzLCBiYXNlKSB7XG5cdCAgbWluZSA9IGxvYWRQYXRjaChtaW5lLCBiYXNlKTtcblx0ICB0aGVpcnMgPSBsb2FkUGF0Y2godGhlaXJzLCBiYXNlKTtcblxuXHQgIHZhciByZXQgPSB7fTtcblxuXHQgIC8vIEZvciBpbmRleCB3ZSBqdXN0IGxldCBpdCBwYXNzIHRocm91Z2ggYXMgaXQgZG9lc24ndCBoYXZlIGFueSBuZWNlc3NhcnkgbWVhbmluZy5cblx0ICAvLyBMZWF2aW5nIHNhbml0eSBjaGVja3Mgb24gdGhpcyB0byB0aGUgQVBJIGNvbnN1bWVyIHRoYXQgbWF5IGtub3cgbW9yZSBhYm91dCB0aGVcblx0ICAvLyBtZWFuaW5nIGluIHRoZWlyIG93biBjb250ZXh0LlxuXHQgIGlmIChtaW5lLmluZGV4IHx8IHRoZWlycy5pbmRleCkge1xuXHQgICAgcmV0LmluZGV4ID0gbWluZS5pbmRleCB8fCB0aGVpcnMuaW5kZXg7XG5cdCAgfVxuXG5cdCAgaWYgKG1pbmUubmV3RmlsZU5hbWUgfHwgdGhlaXJzLm5ld0ZpbGVOYW1lKSB7XG5cdCAgICBpZiAoIWZpbGVOYW1lQ2hhbmdlZChtaW5lKSkge1xuXHQgICAgICAvLyBObyBoZWFkZXIgb3Igbm8gY2hhbmdlIGluIG91cnMsIHVzZSB0aGVpcnMgKGFuZCBvdXJzIGlmIHRoZWlycyBkb2VzIG5vdCBleGlzdClcblx0ICAgICAgcmV0Lm9sZEZpbGVOYW1lID0gdGhlaXJzLm9sZEZpbGVOYW1lIHx8IG1pbmUub2xkRmlsZU5hbWU7XG5cdCAgICAgIHJldC5uZXdGaWxlTmFtZSA9IHRoZWlycy5uZXdGaWxlTmFtZSB8fCBtaW5lLm5ld0ZpbGVOYW1lO1xuXHQgICAgICByZXQub2xkSGVhZGVyID0gdGhlaXJzLm9sZEhlYWRlciB8fCBtaW5lLm9sZEhlYWRlcjtcblx0ICAgICAgcmV0Lm5ld0hlYWRlciA9IHRoZWlycy5uZXdIZWFkZXIgfHwgbWluZS5uZXdIZWFkZXI7XG5cdCAgICB9IGVsc2UgaWYgKCFmaWxlTmFtZUNoYW5nZWQodGhlaXJzKSkge1xuXHQgICAgICAvLyBObyBoZWFkZXIgb3Igbm8gY2hhbmdlIGluIHRoZWlycywgdXNlIG91cnNcblx0ICAgICAgcmV0Lm9sZEZpbGVOYW1lID0gbWluZS5vbGRGaWxlTmFtZTtcblx0ICAgICAgcmV0Lm5ld0ZpbGVOYW1lID0gbWluZS5uZXdGaWxlTmFtZTtcblx0ICAgICAgcmV0Lm9sZEhlYWRlciA9IG1pbmUub2xkSGVhZGVyO1xuXHQgICAgICByZXQubmV3SGVhZGVyID0gbWluZS5uZXdIZWFkZXI7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICAvLyBCb3RoIGNoYW5nZWQuLi4gZmlndXJlIGl0IG91dFxuXHQgICAgICByZXQub2xkRmlsZU5hbWUgPSBzZWxlY3RGaWVsZChyZXQsIG1pbmUub2xkRmlsZU5hbWUsIHRoZWlycy5vbGRGaWxlTmFtZSk7XG5cdCAgICAgIHJldC5uZXdGaWxlTmFtZSA9IHNlbGVjdEZpZWxkKHJldCwgbWluZS5uZXdGaWxlTmFtZSwgdGhlaXJzLm5ld0ZpbGVOYW1lKTtcblx0ICAgICAgcmV0Lm9sZEhlYWRlciA9IHNlbGVjdEZpZWxkKHJldCwgbWluZS5vbGRIZWFkZXIsIHRoZWlycy5vbGRIZWFkZXIpO1xuXHQgICAgICByZXQubmV3SGVhZGVyID0gc2VsZWN0RmllbGQocmV0LCBtaW5lLm5ld0hlYWRlciwgdGhlaXJzLm5ld0hlYWRlcik7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgcmV0Lmh1bmtzID0gW107XG5cblx0ICB2YXIgbWluZUluZGV4ID0gMCxcblx0ICAgICAgdGhlaXJzSW5kZXggPSAwLFxuXHQgICAgICBtaW5lT2Zmc2V0ID0gMCxcblx0ICAgICAgdGhlaXJzT2Zmc2V0ID0gMDtcblxuXHQgIHdoaWxlIChtaW5lSW5kZXggPCBtaW5lLmh1bmtzLmxlbmd0aCB8fCB0aGVpcnNJbmRleCA8IHRoZWlycy5odW5rcy5sZW5ndGgpIHtcblx0ICAgIHZhciBtaW5lQ3VycmVudCA9IG1pbmUuaHVua3NbbWluZUluZGV4XSB8fCB7IG9sZFN0YXJ0OiBJbmZpbml0eSB9LFxuXHQgICAgICAgIHRoZWlyc0N1cnJlbnQgPSB0aGVpcnMuaHVua3NbdGhlaXJzSW5kZXhdIHx8IHsgb2xkU3RhcnQ6IEluZmluaXR5IH07XG5cblx0ICAgIGlmIChodW5rQmVmb3JlKG1pbmVDdXJyZW50LCB0aGVpcnNDdXJyZW50KSkge1xuXHQgICAgICAvLyBUaGlzIHBhdGNoIGRvZXMgbm90IG92ZXJsYXAgd2l0aCBhbnkgb2YgdGhlIG90aGVycywgeWF5LlxuXHQgICAgICByZXQuaHVua3MucHVzaChjbG9uZUh1bmsobWluZUN1cnJlbnQsIG1pbmVPZmZzZXQpKTtcblx0ICAgICAgbWluZUluZGV4Kys7XG5cdCAgICAgIHRoZWlyc09mZnNldCArPSBtaW5lQ3VycmVudC5uZXdMaW5lcyAtIG1pbmVDdXJyZW50Lm9sZExpbmVzO1xuXHQgICAgfSBlbHNlIGlmIChodW5rQmVmb3JlKHRoZWlyc0N1cnJlbnQsIG1pbmVDdXJyZW50KSkge1xuXHQgICAgICAvLyBUaGlzIHBhdGNoIGRvZXMgbm90IG92ZXJsYXAgd2l0aCBhbnkgb2YgdGhlIG90aGVycywgeWF5LlxuXHQgICAgICByZXQuaHVua3MucHVzaChjbG9uZUh1bmsodGhlaXJzQ3VycmVudCwgdGhlaXJzT2Zmc2V0KSk7XG5cdCAgICAgIHRoZWlyc0luZGV4Kys7XG5cdCAgICAgIG1pbmVPZmZzZXQgKz0gdGhlaXJzQ3VycmVudC5uZXdMaW5lcyAtIHRoZWlyc0N1cnJlbnQub2xkTGluZXM7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICAvLyBPdmVybGFwLCBtZXJnZSBhcyBiZXN0IHdlIGNhblxuXHQgICAgICB2YXIgbWVyZ2VkSHVuayA9IHtcblx0ICAgICAgICBvbGRTdGFydDogTWF0aC5taW4obWluZUN1cnJlbnQub2xkU3RhcnQsIHRoZWlyc0N1cnJlbnQub2xkU3RhcnQpLFxuXHQgICAgICAgIG9sZExpbmVzOiAwLFxuXHQgICAgICAgIG5ld1N0YXJ0OiBNYXRoLm1pbihtaW5lQ3VycmVudC5uZXdTdGFydCArIG1pbmVPZmZzZXQsIHRoZWlyc0N1cnJlbnQub2xkU3RhcnQgKyB0aGVpcnNPZmZzZXQpLFxuXHQgICAgICAgIG5ld0xpbmVzOiAwLFxuXHQgICAgICAgIGxpbmVzOiBbXVxuXHQgICAgICB9O1xuXHQgICAgICBtZXJnZUxpbmVzKG1lcmdlZEh1bmssIG1pbmVDdXJyZW50Lm9sZFN0YXJ0LCBtaW5lQ3VycmVudC5saW5lcywgdGhlaXJzQ3VycmVudC5vbGRTdGFydCwgdGhlaXJzQ3VycmVudC5saW5lcyk7XG5cdCAgICAgIHRoZWlyc0luZGV4Kys7XG5cdCAgICAgIG1pbmVJbmRleCsrO1xuXG5cdCAgICAgIHJldC5odW5rcy5wdXNoKG1lcmdlZEh1bmspO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHJldHVybiByZXQ7XG5cdH1cblxuXHRmdW5jdGlvbiBsb2FkUGF0Y2gocGFyYW0sIGJhc2UpIHtcblx0ICBpZiAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJykge1xuXHQgICAgaWYgKC9eQEAvbS50ZXN0KHBhcmFtKSB8fCAvXkluZGV4Oi9tLnRlc3QocGFyYW0pKSB7XG5cdCAgICAgIHJldHVybiAoLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLygwLCBfcGFyc2UucGFyc2VQYXRjaCkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8ocGFyYW0pWzBdXG5cdCAgICAgICk7XG5cdCAgICB9XG5cblx0ICAgIGlmICghYmFzZSkge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgcHJvdmlkZSBhIGJhc2UgcmVmZXJlbmNlIG9yIHBhc3MgaW4gYSBwYXRjaCcpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuICgvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKDAsIF9jcmVhdGUuc3RydWN0dXJlZFBhdGNoKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyh1bmRlZmluZWQsIHVuZGVmaW5lZCwgYmFzZSwgcGFyYW0pXG5cdCAgICApO1xuXHQgIH1cblxuXHQgIHJldHVybiBwYXJhbTtcblx0fVxuXG5cdGZ1bmN0aW9uIGZpbGVOYW1lQ2hhbmdlZChwYXRjaCkge1xuXHQgIHJldHVybiBwYXRjaC5uZXdGaWxlTmFtZSAmJiBwYXRjaC5uZXdGaWxlTmFtZSAhPT0gcGF0Y2gub2xkRmlsZU5hbWU7XG5cdH1cblxuXHRmdW5jdGlvbiBzZWxlY3RGaWVsZChpbmRleCwgbWluZSwgdGhlaXJzKSB7XG5cdCAgaWYgKG1pbmUgPT09IHRoZWlycykge1xuXHQgICAgcmV0dXJuIG1pbmU7XG5cdCAgfSBlbHNlIHtcblx0ICAgIGluZGV4LmNvbmZsaWN0ID0gdHJ1ZTtcblx0ICAgIHJldHVybiB7IG1pbmU6IG1pbmUsIHRoZWlyczogdGhlaXJzIH07XG5cdCAgfVxuXHR9XG5cblx0ZnVuY3Rpb24gaHVua0JlZm9yZSh0ZXN0LCBjaGVjaykge1xuXHQgIHJldHVybiB0ZXN0Lm9sZFN0YXJ0IDwgY2hlY2sub2xkU3RhcnQgJiYgdGVzdC5vbGRTdGFydCArIHRlc3Qub2xkTGluZXMgPCBjaGVjay5vbGRTdGFydDtcblx0fVxuXG5cdGZ1bmN0aW9uIGNsb25lSHVuayhodW5rLCBvZmZzZXQpIHtcblx0ICByZXR1cm4ge1xuXHQgICAgb2xkU3RhcnQ6IGh1bmsub2xkU3RhcnQsIG9sZExpbmVzOiBodW5rLm9sZExpbmVzLFxuXHQgICAgbmV3U3RhcnQ6IGh1bmsubmV3U3RhcnQgKyBvZmZzZXQsIG5ld0xpbmVzOiBodW5rLm5ld0xpbmVzLFxuXHQgICAgbGluZXM6IGh1bmsubGluZXNcblx0ICB9O1xuXHR9XG5cblx0ZnVuY3Rpb24gbWVyZ2VMaW5lcyhodW5rLCBtaW5lT2Zmc2V0LCBtaW5lTGluZXMsIHRoZWlyT2Zmc2V0LCB0aGVpckxpbmVzKSB7XG5cdCAgLy8gVGhpcyB3aWxsIGdlbmVyYWxseSByZXN1bHQgaW4gYSBjb25mbGljdGVkIGh1bmssIGJ1dCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlIGNvbnRleHRcblx0ICAvLyBpcyB0aGUgb25seSBvdmVybGFwIHdoZXJlIHdlIGNhbiBzdWNjZXNzZnVsbHkgbWVyZ2UgdGhlIGNvbnRlbnQgaGVyZS5cblx0ICB2YXIgbWluZSA9IHsgb2Zmc2V0OiBtaW5lT2Zmc2V0LCBsaW5lczogbWluZUxpbmVzLCBpbmRleDogMCB9LFxuXHQgICAgICB0aGVpciA9IHsgb2Zmc2V0OiB0aGVpck9mZnNldCwgbGluZXM6IHRoZWlyTGluZXMsIGluZGV4OiAwIH07XG5cblx0ICAvLyBIYW5kbGUgYW55IGxlYWRpbmcgY29udGVudFxuXHQgIGluc2VydExlYWRpbmcoaHVuaywgbWluZSwgdGhlaXIpO1xuXHQgIGluc2VydExlYWRpbmcoaHVuaywgdGhlaXIsIG1pbmUpO1xuXG5cdCAgLy8gTm93IGluIHRoZSBvdmVybGFwIGNvbnRlbnQuIFNjYW4gdGhyb3VnaCBhbmQgc2VsZWN0IHRoZSBiZXN0IGNoYW5nZXMgZnJvbSBlYWNoLlxuXHQgIHdoaWxlIChtaW5lLmluZGV4IDwgbWluZS5saW5lcy5sZW5ndGggJiYgdGhlaXIuaW5kZXggPCB0aGVpci5saW5lcy5sZW5ndGgpIHtcblx0ICAgIHZhciBtaW5lQ3VycmVudCA9IG1pbmUubGluZXNbbWluZS5pbmRleF0sXG5cdCAgICAgICAgdGhlaXJDdXJyZW50ID0gdGhlaXIubGluZXNbdGhlaXIuaW5kZXhdO1xuXG5cdCAgICBpZiAoKG1pbmVDdXJyZW50WzBdID09PSAnLScgfHwgbWluZUN1cnJlbnRbMF0gPT09ICcrJykgJiYgKHRoZWlyQ3VycmVudFswXSA9PT0gJy0nIHx8IHRoZWlyQ3VycmVudFswXSA9PT0gJysnKSkge1xuXHQgICAgICAvLyBCb3RoIG1vZGlmaWVkIC4uLlxuXHQgICAgICBtdXR1YWxDaGFuZ2UoaHVuaywgbWluZSwgdGhlaXIpO1xuXHQgICAgfSBlbHNlIGlmIChtaW5lQ3VycmVudFswXSA9PT0gJysnICYmIHRoZWlyQ3VycmVudFswXSA9PT0gJyAnKSB7XG5cdCAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2h1bmskbGluZXM7XG5cblx0ICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8gLy8gTWluZSBpbnNlcnRlZFxuXHQgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKF9odW5rJGxpbmVzID0gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9odW5rLmxpbmVzKS5wdXNoLiAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovYXBwbHkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8oIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9faHVuayRsaW5lcyAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLywgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL190b0NvbnN1bWFibGVBcnJheSggLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jb2xsZWN0Q2hhbmdlKG1pbmUpKSk7XG5cdCAgICB9IGVsc2UgaWYgKHRoZWlyQ3VycmVudFswXSA9PT0gJysnICYmIG1pbmVDdXJyZW50WzBdID09PSAnICcpIHtcblx0ICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciBfaHVuayRsaW5lczI7XG5cblx0ICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8gLy8gVGhlaXJzIGluc2VydGVkXG5cdCAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oX2h1bmskbGluZXMyID0gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9odW5rLmxpbmVzKS5wdXNoLiAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovYXBwbHkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8oIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9faHVuayRsaW5lczIgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8sIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fdG9Db25zdW1hYmxlQXJyYXkoIC8qaXN0YW5idWwgaWdub3JlIGVuZCovY29sbGVjdENoYW5nZSh0aGVpcikpKTtcblx0ICAgIH0gZWxzZSBpZiAobWluZUN1cnJlbnRbMF0gPT09ICctJyAmJiB0aGVpckN1cnJlbnRbMF0gPT09ICcgJykge1xuXHQgICAgICAvLyBNaW5lIHJlbW92ZWQgb3IgZWRpdGVkXG5cdCAgICAgIHJlbW92YWwoaHVuaywgbWluZSwgdGhlaXIpO1xuXHQgICAgfSBlbHNlIGlmICh0aGVpckN1cnJlbnRbMF0gPT09ICctJyAmJiBtaW5lQ3VycmVudFswXSA9PT0gJyAnKSB7XG5cdCAgICAgIC8vIFRoZWlyIHJlbW92ZWQgb3IgZWRpdGVkXG5cdCAgICAgIHJlbW92YWwoaHVuaywgdGhlaXIsIG1pbmUsIHRydWUpO1xuXHQgICAgfSBlbHNlIGlmIChtaW5lQ3VycmVudCA9PT0gdGhlaXJDdXJyZW50KSB7XG5cdCAgICAgIC8vIENvbnRleHQgaWRlbnRpdHlcblx0ICAgICAgaHVuay5saW5lcy5wdXNoKG1pbmVDdXJyZW50KTtcblx0ICAgICAgbWluZS5pbmRleCsrO1xuXHQgICAgICB0aGVpci5pbmRleCsrO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgLy8gQ29udGV4dCBtaXNtYXRjaFxuXHQgICAgICBjb25mbGljdChodW5rLCBjb2xsZWN0Q2hhbmdlKG1pbmUpLCBjb2xsZWN0Q2hhbmdlKHRoZWlyKSk7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgLy8gTm93IHB1c2ggYW55dGhpbmcgdGhhdCBtYXkgYmUgcmVtYWluaW5nXG5cdCAgaW5zZXJ0VHJhaWxpbmcoaHVuaywgbWluZSk7XG5cdCAgaW5zZXJ0VHJhaWxpbmcoaHVuaywgdGhlaXIpO1xuXG5cdCAgY2FsY0xpbmVDb3VudChodW5rKTtcblx0fVxuXG5cdGZ1bmN0aW9uIG11dHVhbENoYW5nZShodW5rLCBtaW5lLCB0aGVpcikge1xuXHQgIHZhciBteUNoYW5nZXMgPSBjb2xsZWN0Q2hhbmdlKG1pbmUpLFxuXHQgICAgICB0aGVpckNoYW5nZXMgPSBjb2xsZWN0Q2hhbmdlKHRoZWlyKTtcblxuXHQgIGlmIChhbGxSZW1vdmVzKG15Q2hhbmdlcykgJiYgYWxsUmVtb3Zlcyh0aGVpckNoYW5nZXMpKSB7XG5cdCAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHJlbW92ZSBjaGFuZ2VzIHRoYXQgYXJlIHN1cGVyc2V0cyBvZiBvbmUgYW5vdGhlclxuXHQgICAgaWYgKCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKDAsIF9hcnJheS5hcnJheVN0YXJ0c1dpdGgpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovKG15Q2hhbmdlcywgdGhlaXJDaGFuZ2VzKSAmJiBza2lwUmVtb3ZlU3VwZXJzZXQodGhlaXIsIG15Q2hhbmdlcywgbXlDaGFuZ2VzLmxlbmd0aCAtIHRoZWlyQ2hhbmdlcy5sZW5ndGgpKSB7XG5cdCAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2h1bmskbGluZXMzO1xuXG5cdCAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oX2h1bmskbGluZXMzID0gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9odW5rLmxpbmVzKS5wdXNoLiAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovYXBwbHkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8oIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9faHVuayRsaW5lczMgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8sIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fdG9Db25zdW1hYmxlQXJyYXkoIC8qaXN0YW5idWwgaWdub3JlIGVuZCovbXlDaGFuZ2VzKSk7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH0gZWxzZSBpZiAoIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oMCwgX2FycmF5LmFycmF5U3RhcnRzV2l0aCkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8odGhlaXJDaGFuZ2VzLCBteUNoYW5nZXMpICYmIHNraXBSZW1vdmVTdXBlcnNldChtaW5lLCB0aGVpckNoYW5nZXMsIHRoZWlyQ2hhbmdlcy5sZW5ndGggLSBteUNoYW5nZXMubGVuZ3RoKSkge1xuXHQgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9odW5rJGxpbmVzNDtcblxuXHQgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKF9odW5rJGxpbmVzNCA9IC8qaXN0YW5idWwgaWdub3JlIGVuZCovaHVuay5saW5lcykucHVzaC4gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2FwcGx5IC8qaXN0YW5idWwgaWdub3JlIGVuZCovKCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2h1bmskbGluZXM0IC8qaXN0YW5idWwgaWdub3JlIGVuZCovLCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX3RvQ29uc3VtYWJsZUFycmF5KCAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3RoZWlyQ2hhbmdlcykpO1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgfSBlbHNlIGlmICggLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLygwLCBfYXJyYXkuYXJyYXlFcXVhbCkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8obXlDaGFuZ2VzLCB0aGVpckNoYW5nZXMpKSB7XG5cdCAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9odW5rJGxpbmVzNTtcblxuXHQgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyhfaHVuayRsaW5lczUgPSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2h1bmsubGluZXMpLnB1c2guIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9hcHBseSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyggLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19odW5rJGxpbmVzNSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLywgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL190b0NvbnN1bWFibGVBcnJheSggLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9teUNoYW5nZXMpKTtcblx0ICAgIHJldHVybjtcblx0ICB9XG5cblx0ICBjb25mbGljdChodW5rLCBteUNoYW5nZXMsIHRoZWlyQ2hhbmdlcyk7XG5cdH1cblxuXHRmdW5jdGlvbiByZW1vdmFsKGh1bmssIG1pbmUsIHRoZWlyLCBzd2FwKSB7XG5cdCAgdmFyIG15Q2hhbmdlcyA9IGNvbGxlY3RDaGFuZ2UobWluZSksXG5cdCAgICAgIHRoZWlyQ2hhbmdlcyA9IGNvbGxlY3RDb250ZXh0KHRoZWlyLCBteUNoYW5nZXMpO1xuXHQgIGlmICh0aGVpckNoYW5nZXMubWVyZ2VkKSB7XG5cdCAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9odW5rJGxpbmVzNjtcblxuXHQgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyhfaHVuayRsaW5lczYgPSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2h1bmsubGluZXMpLnB1c2guIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9hcHBseSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyggLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19odW5rJGxpbmVzNiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLywgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL190b0NvbnN1bWFibGVBcnJheSggLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi90aGVpckNoYW5nZXMubWVyZ2VkKSk7XG5cdCAgfSBlbHNlIHtcblx0ICAgIGNvbmZsaWN0KGh1bmssIHN3YXAgPyB0aGVpckNoYW5nZXMgOiBteUNoYW5nZXMsIHN3YXAgPyBteUNoYW5nZXMgOiB0aGVpckNoYW5nZXMpO1xuXHQgIH1cblx0fVxuXG5cdGZ1bmN0aW9uIGNvbmZsaWN0KGh1bmssIG1pbmUsIHRoZWlyKSB7XG5cdCAgaHVuay5jb25mbGljdCA9IHRydWU7XG5cdCAgaHVuay5saW5lcy5wdXNoKHtcblx0ICAgIGNvbmZsaWN0OiB0cnVlLFxuXHQgICAgbWluZTogbWluZSxcblx0ICAgIHRoZWlyczogdGhlaXJcblx0ICB9KTtcblx0fVxuXG5cdGZ1bmN0aW9uIGluc2VydExlYWRpbmcoaHVuaywgaW5zZXJ0LCB0aGVpcikge1xuXHQgIHdoaWxlIChpbnNlcnQub2Zmc2V0IDwgdGhlaXIub2Zmc2V0ICYmIGluc2VydC5pbmRleCA8IGluc2VydC5saW5lcy5sZW5ndGgpIHtcblx0ICAgIHZhciBsaW5lID0gaW5zZXJ0LmxpbmVzW2luc2VydC5pbmRleCsrXTtcblx0ICAgIGh1bmsubGluZXMucHVzaChsaW5lKTtcblx0ICAgIGluc2VydC5vZmZzZXQrKztcblx0ICB9XG5cdH1cblx0ZnVuY3Rpb24gaW5zZXJ0VHJhaWxpbmcoaHVuaywgaW5zZXJ0KSB7XG5cdCAgd2hpbGUgKGluc2VydC5pbmRleCA8IGluc2VydC5saW5lcy5sZW5ndGgpIHtcblx0ICAgIHZhciBsaW5lID0gaW5zZXJ0LmxpbmVzW2luc2VydC5pbmRleCsrXTtcblx0ICAgIGh1bmsubGluZXMucHVzaChsaW5lKTtcblx0ICB9XG5cdH1cblxuXHRmdW5jdGlvbiBjb2xsZWN0Q2hhbmdlKHN0YXRlKSB7XG5cdCAgdmFyIHJldCA9IFtdLFxuXHQgICAgICBvcGVyYXRpb24gPSBzdGF0ZS5saW5lc1tzdGF0ZS5pbmRleF1bMF07XG5cdCAgd2hpbGUgKHN0YXRlLmluZGV4IDwgc3RhdGUubGluZXMubGVuZ3RoKSB7XG5cdCAgICB2YXIgbGluZSA9IHN0YXRlLmxpbmVzW3N0YXRlLmluZGV4XTtcblxuXHQgICAgLy8gR3JvdXAgYWRkaXRpb25zIHRoYXQgYXJlIGltbWVkaWF0ZWx5IGFmdGVyIHN1YnRyYWN0aW9ucyBhbmQgdHJlYXQgdGhlbSBhcyBvbmUgXCJhdG9taWNcIiBtb2RpZnkgY2hhbmdlLlxuXHQgICAgaWYgKG9wZXJhdGlvbiA9PT0gJy0nICYmIGxpbmVbMF0gPT09ICcrJykge1xuXHQgICAgICBvcGVyYXRpb24gPSAnKyc7XG5cdCAgICB9XG5cblx0ICAgIGlmIChvcGVyYXRpb24gPT09IGxpbmVbMF0pIHtcblx0ICAgICAgcmV0LnB1c2gobGluZSk7XG5cdCAgICAgIHN0YXRlLmluZGV4Kys7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBicmVhaztcblx0ICAgIH1cblx0ICB9XG5cblx0ICByZXR1cm4gcmV0O1xuXHR9XG5cdGZ1bmN0aW9uIGNvbGxlY3RDb250ZXh0KHN0YXRlLCBtYXRjaENoYW5nZXMpIHtcblx0ICB2YXIgY2hhbmdlcyA9IFtdLFxuXHQgICAgICBtZXJnZWQgPSBbXSxcblx0ICAgICAgbWF0Y2hJbmRleCA9IDAsXG5cdCAgICAgIGNvbnRleHRDaGFuZ2VzID0gZmFsc2UsXG5cdCAgICAgIGNvbmZsaWN0ZWQgPSBmYWxzZTtcblx0ICB3aGlsZSAobWF0Y2hJbmRleCA8IG1hdGNoQ2hhbmdlcy5sZW5ndGggJiYgc3RhdGUuaW5kZXggPCBzdGF0ZS5saW5lcy5sZW5ndGgpIHtcblx0ICAgIHZhciBjaGFuZ2UgPSBzdGF0ZS5saW5lc1tzdGF0ZS5pbmRleF0sXG5cdCAgICAgICAgbWF0Y2ggPSBtYXRjaENoYW5nZXNbbWF0Y2hJbmRleF07XG5cblx0ICAgIC8vIE9uY2Ugd2UndmUgaGl0IG91ciBhZGQsIHRoZW4gd2UgYXJlIGRvbmVcblx0ICAgIGlmIChtYXRjaFswXSA9PT0gJysnKSB7XG5cdCAgICAgIGJyZWFrO1xuXHQgICAgfVxuXG5cdCAgICBjb250ZXh0Q2hhbmdlcyA9IGNvbnRleHRDaGFuZ2VzIHx8IGNoYW5nZVswXSAhPT0gJyAnO1xuXG5cdCAgICBtZXJnZWQucHVzaChtYXRjaCk7XG5cdCAgICBtYXRjaEluZGV4Kys7XG5cblx0ICAgIC8vIENvbnN1bWUgYW55IGFkZGl0aW9ucyBpbiB0aGUgb3RoZXIgYmxvY2sgYXMgYSBjb25mbGljdCB0byBhdHRlbXB0XG5cdCAgICAvLyB0byBwdWxsIGluIHRoZSByZW1haW5pbmcgY29udGV4dCBhZnRlciB0aGlzXG5cdCAgICBpZiAoY2hhbmdlWzBdID09PSAnKycpIHtcblx0ICAgICAgY29uZmxpY3RlZCA9IHRydWU7XG5cblx0ICAgICAgd2hpbGUgKGNoYW5nZVswXSA9PT0gJysnKSB7XG5cdCAgICAgICAgY2hhbmdlcy5wdXNoKGNoYW5nZSk7XG5cdCAgICAgICAgY2hhbmdlID0gc3RhdGUubGluZXNbKytzdGF0ZS5pbmRleF07XG5cdCAgICAgIH1cblx0ICAgIH1cblxuXHQgICAgaWYgKG1hdGNoLnN1YnN0cigxKSA9PT0gY2hhbmdlLnN1YnN0cigxKSkge1xuXHQgICAgICBjaGFuZ2VzLnB1c2goY2hhbmdlKTtcblx0ICAgICAgc3RhdGUuaW5kZXgrKztcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGNvbmZsaWN0ZWQgPSB0cnVlO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIGlmICgobWF0Y2hDaGFuZ2VzW21hdGNoSW5kZXhdIHx8ICcnKVswXSA9PT0gJysnICYmIGNvbnRleHRDaGFuZ2VzKSB7XG5cdCAgICBjb25mbGljdGVkID0gdHJ1ZTtcblx0ICB9XG5cblx0ICBpZiAoY29uZmxpY3RlZCkge1xuXHQgICAgcmV0dXJuIGNoYW5nZXM7XG5cdCAgfVxuXG5cdCAgd2hpbGUgKG1hdGNoSW5kZXggPCBtYXRjaENoYW5nZXMubGVuZ3RoKSB7XG5cdCAgICBtZXJnZWQucHVzaChtYXRjaENoYW5nZXNbbWF0Y2hJbmRleCsrXSk7XG5cdCAgfVxuXG5cdCAgcmV0dXJuIHtcblx0ICAgIG1lcmdlZDogbWVyZ2VkLFxuXHQgICAgY2hhbmdlczogY2hhbmdlc1xuXHQgIH07XG5cdH1cblxuXHRmdW5jdGlvbiBhbGxSZW1vdmVzKGNoYW5nZXMpIHtcblx0ICByZXR1cm4gY2hhbmdlcy5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGNoYW5nZSkge1xuXHQgICAgcmV0dXJuIHByZXYgJiYgY2hhbmdlWzBdID09PSAnLSc7XG5cdCAgfSwgdHJ1ZSk7XG5cdH1cblx0ZnVuY3Rpb24gc2tpcFJlbW92ZVN1cGVyc2V0KHN0YXRlLCByZW1vdmVDaGFuZ2VzLCBkZWx0YSkge1xuXHQgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVsdGE7IGkrKykge1xuXHQgICAgdmFyIGNoYW5nZUNvbnRlbnQgPSByZW1vdmVDaGFuZ2VzW3JlbW92ZUNoYW5nZXMubGVuZ3RoIC0gZGVsdGEgKyBpXS5zdWJzdHIoMSk7XG5cdCAgICBpZiAoc3RhdGUubGluZXNbc3RhdGUuaW5kZXggKyBpXSAhPT0gJyAnICsgY2hhbmdlQ29udGVudCkge1xuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgc3RhdGUuaW5kZXggKz0gZGVsdGE7XG5cdCAgcmV0dXJuIHRydWU7XG5cdH1cblxuXHRmdW5jdGlvbiBjYWxjT2xkTmV3TGluZUNvdW50KGxpbmVzKSB7XG5cdCAgdmFyIG9sZExpbmVzID0gMDtcblx0ICB2YXIgbmV3TGluZXMgPSAwO1xuXG5cdCAgbGluZXMuZm9yRWFjaChmdW5jdGlvbiAobGluZSkge1xuXHQgICAgaWYgKHR5cGVvZiBsaW5lICE9PSAnc3RyaW5nJykge1xuXHQgICAgICB2YXIgbXlDb3VudCA9IGNhbGNPbGROZXdMaW5lQ291bnQobGluZS5taW5lKTtcblx0ICAgICAgdmFyIHRoZWlyQ291bnQgPSBjYWxjT2xkTmV3TGluZUNvdW50KGxpbmUudGhlaXJzKTtcblxuXHQgICAgICBpZiAob2xkTGluZXMgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgIGlmIChteUNvdW50Lm9sZExpbmVzID09PSB0aGVpckNvdW50Lm9sZExpbmVzKSB7XG5cdCAgICAgICAgICBvbGRMaW5lcyArPSBteUNvdW50Lm9sZExpbmVzO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBvbGRMaW5lcyA9IHVuZGVmaW5lZDtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblxuXHQgICAgICBpZiAobmV3TGluZXMgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgIGlmIChteUNvdW50Lm5ld0xpbmVzID09PSB0aGVpckNvdW50Lm5ld0xpbmVzKSB7XG5cdCAgICAgICAgICBuZXdMaW5lcyArPSBteUNvdW50Lm5ld0xpbmVzO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBuZXdMaW5lcyA9IHVuZGVmaW5lZDtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGlmIChuZXdMaW5lcyAhPT0gdW5kZWZpbmVkICYmIChsaW5lWzBdID09PSAnKycgfHwgbGluZVswXSA9PT0gJyAnKSkge1xuXHQgICAgICAgIG5ld0xpbmVzKys7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKG9sZExpbmVzICE9PSB1bmRlZmluZWQgJiYgKGxpbmVbMF0gPT09ICctJyB8fCBsaW5lWzBdID09PSAnICcpKSB7XG5cdCAgICAgICAgb2xkTGluZXMrKztcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pO1xuXG5cdCAgcmV0dXJuIHsgb2xkTGluZXM6IG9sZExpbmVzLCBuZXdMaW5lczogbmV3TGluZXMgfTtcblx0fVxuXHQvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTl3WVhSamFDOXRaWEpuWlM1cWN5SmRMQ0p1WVcxbGN5STZXeUpqWVd4alRHbHVaVU52ZFc1MElpd2liV1Z5WjJVaUxDSm9kVzVySWl3aVkyRnNZMDlzWkU1bGQweHBibVZEYjNWdWRDSXNJbXhwYm1Weklpd2liMnhrVEdsdVpYTWlMQ0p1WlhkTWFXNWxjeUlzSW5WdVpHVm1hVzVsWkNJc0ltMXBibVVpTENKMGFHVnBjbk1pTENKaVlYTmxJaXdpYkc5aFpGQmhkR05vSWl3aWNtVjBJaXdpYVc1a1pYZ2lMQ0p1WlhkR2FXeGxUbUZ0WlNJc0ltWnBiR1ZPWVcxbFEyaGhibWRsWkNJc0ltOXNaRVpwYkdWT1lXMWxJaXdpYjJ4a1NHVmhaR1Z5SWl3aWJtVjNTR1ZoWkdWeUlpd2ljMlZzWldOMFJtbGxiR1FpTENKb2RXNXJjeUlzSW0xcGJtVkpibVJsZUNJc0luUm9aV2x5YzBsdVpHVjRJaXdpYldsdVpVOW1abk5sZENJc0luUm9aV2x5YzA5bVpuTmxkQ0lzSW14bGJtZDBhQ0lzSW0xcGJtVkRkWEp5Wlc1MElpd2liMnhrVTNSaGNuUWlMQ0pKYm1acGJtbDBlU0lzSW5Sb1pXbHljME4xY25KbGJuUWlMQ0pvZFc1clFtVm1iM0psSWl3aWNIVnphQ0lzSW1Oc2IyNWxTSFZ1YXlJc0ltMWxjbWRsWkVoMWJtc2lMQ0pOWVhSb0lpd2liV2x1SWl3aWJtVjNVM1JoY25RaUxDSnRaWEpuWlV4cGJtVnpJaXdpY0dGeVlXMGlMQ0owWlhOMElpd2lSWEp5YjNJaUxDSndZWFJqYUNJc0ltTnZibVpzYVdOMElpd2lZMmhsWTJzaUxDSnZabVp6WlhRaUxDSnRhVzVsVEdsdVpYTWlMQ0owYUdWcGNrOW1abk5sZENJc0luUm9aV2x5VEdsdVpYTWlMQ0owYUdWcGNpSXNJbWx1YzJWeWRFeGxZV1JwYm1jaUxDSjBhR1ZwY2tOMWNuSmxiblFpTENKdGRYUjFZV3hEYUdGdVoyVWlMQ0pqYjJ4c1pXTjBRMmhoYm1kbElpd2ljbVZ0YjNaaGJDSXNJbWx1YzJWeWRGUnlZV2xzYVc1bklpd2liWGxEYUdGdVoyVnpJaXdpZEdobGFYSkRhR0Z1WjJWeklpd2lZV3hzVW1WdGIzWmxjeUlzSW5OcmFYQlNaVzF2ZG1WVGRYQmxjbk5sZENJc0luTjNZWEFpTENKamIyeHNaV04wUTI5dWRHVjRkQ0lzSW0xbGNtZGxaQ0lzSW1sdWMyVnlkQ0lzSW14cGJtVWlMQ0p6ZEdGMFpTSXNJbTl3WlhKaGRHbHZiaUlzSW0xaGRHTm9RMmhoYm1kbGN5SXNJbU5vWVc1blpYTWlMQ0p0WVhSamFFbHVaR1Y0SWl3aVkyOXVkR1Y0ZEVOb1lXNW5aWE1pTENKamIyNW1iR2xqZEdWa0lpd2lZMmhoYm1kbElpd2liV0YwWTJnaUxDSnpkV0p6ZEhJaUxDSnlaV1IxWTJVaUxDSndjbVYySWl3aWNtVnRiM1psUTJoaGJtZGxjeUlzSW1SbGJIUmhJaXdpYVNJc0ltTm9ZVzVuWlVOdmJuUmxiblFpTENKbWIzSkZZV05vSWl3aWJYbERiM1Z1ZENJc0luUm9aV2x5UTI5MWJuUWlYU3dpYldGd2NHbHVaM01pT2lJN096dG5RMEZMWjBKQkxHRXNSMEZCUVVFc1lUdDVSRUZuUWtGRExFc3NSMEZCUVVFc1N6czdRVUZ5UW1oQ096dEJRVU5CT3p0QlFVVkJPenM3TzNWQ1FVVlBMRk5CUVZORUxHRkJRVlFzUTBGQmRVSkZMRWxCUVhaQ0xFVkJRVFpDTzBGQlFVRXNOa1ZCUTB4RExHOUNRVUZ2UWtRc1MwRkJTMFVzUzBGQmVrSXNRMEZFU3p0QlFVRkJMRTFCUXpOQ1F5eFJRVVF5UWl4M1FrRkRNMEpCTEZGQlJESkNPMEZCUVVFc1RVRkRha0pETEZGQlJHbENMSGRDUVVOcVFrRXNVVUZFYVVJN08wRkJSMnhETEUxQlFVbEVMR0ZCUVdGRkxGTkJRV3BDTEVWQlFUUkNPMEZCUXpGQ1RDeFRRVUZMUnl4UlFVRk1MRWRCUVdkQ1FTeFJRVUZvUWp0QlFVTkVMRWRCUmtRc1RVRkZUenRCUVVOTUxGZEJRVTlJTEV0QlFVdEhMRkZCUVZvN1FVRkRSRHM3UVVGRlJDeE5RVUZKUXl4aFFVRmhReXhUUVVGcVFpeEZRVUUwUWp0QlFVTXhRa3dzVTBGQlMwa3NVVUZCVEN4SFFVRm5Ra0VzVVVGQmFFSTdRVUZEUkN4SFFVWkVMRTFCUlU4N1FVRkRUQ3hYUVVGUFNpeExRVUZMU1N4UlFVRmFPMEZCUTBRN1FVRkRSanM3UVVGRlRTeFRRVUZUVEN4TFFVRlVMRU5CUVdWUExFbEJRV1lzUlVGQmNVSkRMRTFCUVhKQ0xFVkJRVFpDUXl4SlFVRTNRaXhGUVVGdFF6dEJRVU40UTBZc1UwRkJUMGNzVlVGQlZVZ3NTVUZCVml4RlFVRm5Ra1VzU1VGQmFFSXNRMEZCVUR0QlFVTkJSQ3hYUVVGVFJTeFZRVUZWUml4TlFVRldMRVZCUVd0Q1F5eEpRVUZzUWl4RFFVRlVPenRCUVVWQkxFMUJRVWxGTEUxQlFVMHNSVUZCVmpzN1FVRkZRVHRCUVVOQk8wRkJRMEU3UVVGRFFTeE5RVUZKU2l4TFFVRkxTeXhMUVVGTUxFbEJRV05LTEU5QlFVOUpMRXRCUVhwQ0xFVkJRV2RETzBGQlF6bENSQ3hSUVVGSlF5eExRVUZLTEVkQlFWbE1MRXRCUVV0TExFdEJRVXdzU1VGQlkwb3NUMEZCVDBrc1MwRkJha003UVVGRFJEczdRVUZGUkN4TlFVRkpUQ3hMUVVGTFRTeFhRVUZNTEVsQlFXOUNUQ3hQUVVGUFN5eFhRVUV2UWl4RlFVRTBRenRCUVVNeFF5eFJRVUZKTEVOQlFVTkRMR2RDUVVGblFsQXNTVUZCYUVJc1EwRkJUQ3hGUVVFMFFqdEJRVU14UWp0QlFVTkJTU3hWUVVGSlNTeFhRVUZLTEVkQlFXdENVQ3hQUVVGUFR5eFhRVUZRTEVsQlFYTkNVaXhMUVVGTFVTeFhRVUUzUXp0QlFVTkJTaXhWUVVGSlJTeFhRVUZLTEVkQlFXdENUQ3hQUVVGUFN5eFhRVUZRTEVsQlFYTkNUaXhMUVVGTFRTeFhRVUUzUXp0QlFVTkJSaXhWUVVGSlN5eFRRVUZLTEVkQlFXZENVaXhQUVVGUFVTeFRRVUZRTEVsQlFXOUNWQ3hMUVVGTFV5eFRRVUY2UXp0QlFVTkJUQ3hWUVVGSlRTeFRRVUZLTEVkQlFXZENWQ3hQUVVGUFV5eFRRVUZRTEVsQlFXOUNWaXhMUVVGTFZTeFRRVUY2UXp0QlFVTkVMRXRCVGtRc1RVRk5UeXhKUVVGSkxFTkJRVU5JTEdkQ1FVRm5RazRzVFVGQmFFSXNRMEZCVEN4RlFVRTRRanRCUVVOdVF6dEJRVU5CUnl4VlFVRkpTU3hYUVVGS0xFZEJRV3RDVWl4TFFVRkxVU3hYUVVGMlFqdEJRVU5CU2l4VlFVRkpSU3hYUVVGS0xFZEJRV3RDVGl4TFFVRkxUU3hYUVVGMlFqdEJRVU5CUml4VlFVRkpTeXhUUVVGS0xFZEJRV2RDVkN4TFFVRkxVeXhUUVVGeVFqdEJRVU5CVEN4VlFVRkpUU3hUUVVGS0xFZEJRV2RDVml4TFFVRkxWU3hUUVVGeVFqdEJRVU5FTEV0QlRrMHNUVUZOUVR0QlFVTk1PMEZCUTBGT0xGVkJRVWxKTEZkQlFVb3NSMEZCYTBKSExGbEJRVmxRTEVkQlFWb3NSVUZCYVVKS0xFdEJRVXRSTEZkQlFYUkNMRVZCUVcxRFVDeFBRVUZQVHl4WFFVRXhReXhEUVVGc1FqdEJRVU5CU2l4VlFVRkpSU3hYUVVGS0xFZEJRV3RDU3l4WlFVRlpVQ3hIUVVGYUxFVkJRV2xDU2l4TFFVRkxUU3hYUVVGMFFpeEZRVUZ0UTB3c1QwRkJUMHNzVjBGQk1VTXNRMEZCYkVJN1FVRkRRVVlzVlVGQlNVc3NVMEZCU2l4SFFVRm5Ra1VzV1VGQldWQXNSMEZCV2l4RlFVRnBRa29zUzBGQlMxTXNVMEZCZEVJc1JVRkJhVU5TTEU5QlFVOVJMRk5CUVhoRExFTkJRV2hDTzBGQlEwRk1MRlZCUVVsTkxGTkJRVW9zUjBGQlowSkRMRmxCUVZsUUxFZEJRVm9zUlVGQmFVSktMRXRCUVV0VkxGTkJRWFJDTEVWQlFXbERWQ3hQUVVGUFV5eFRRVUY0UXl4RFFVRm9RanRCUVVORU8wRkJRMFk3TzBGQlJVUk9MRTFCUVVsUkxFdEJRVW9zUjBGQldTeEZRVUZhT3p0QlFVVkJMRTFCUVVsRExGbEJRVmtzUTBGQmFFSTdRVUZCUVN4TlFVTkpReXhqUVVGakxFTkJSR3hDTzBGQlFVRXNUVUZGU1VNc1lVRkJZU3hEUVVacVFqdEJRVUZCTEUxQlIwbERMR1ZCUVdVc1EwRklia0k3TzBGQlMwRXNVMEZCVDBnc1dVRkJXV0lzUzBGQlMxa3NTMEZCVEN4RFFVRlhTeXhOUVVGMlFpeEpRVUZwUTBnc1kwRkJZMklzVDBGQlQxY3NTMEZCVUN4RFFVRmhTeXhOUVVGdVJTeEZRVUV5UlR0QlFVTjZSU3hSUVVGSlF5eGpRVUZqYkVJc1MwRkJTMWtzUzBGQlRDeERRVUZYUXl4VFFVRllMRXRCUVhsQ0xFVkJRVU5OTEZWQlFWVkRMRkZCUVZnc1JVRkJNME03UVVGQlFTeFJRVU5KUXl4blFrRkJaMEp3UWl4UFFVRlBWeXhMUVVGUUxFTkJRV0ZGTEZkQlFXSXNTMEZCTmtJc1JVRkJRMHNzVlVGQlZVTXNVVUZCV0N4RlFVUnFSRHM3UVVGSFFTeFJRVUZKUlN4WFFVRlhTaXhYUVVGWUxFVkJRWGRDUnl4aFFVRjRRaXhEUVVGS0xFVkJRVFJETzBGQlF6RkRPMEZCUTBGcVFpeFZRVUZKVVN4TFFVRktMRU5CUVZWWExFbEJRVllzUTBGQlpVTXNWVUZCVlU0c1YwRkJWaXhGUVVGMVFrZ3NWVUZCZGtJc1EwRkJaanRCUVVOQlJqdEJRVU5CUnl4elFrRkJaMEpGTEZsQlFWbHdRaXhSUVVGYUxFZEJRWFZDYjBJc1dVRkJXWEpDTEZGQlFXNUVPMEZCUTBRc1MwRk1SQ3hOUVV0UExFbEJRVWw1UWl4WFFVRlhSQ3hoUVVGWUxFVkJRVEJDU0N4WFFVRXhRaXhEUVVGS0xFVkJRVFJETzBGQlEycEVPMEZCUTBGa0xGVkJRVWxSTEV0QlFVb3NRMEZCVlZjc1NVRkJWaXhEUVVGbFF5eFZRVUZWU0N4aFFVRldMRVZCUVhsQ1RDeFpRVUY2UWl4RFFVRm1PMEZCUTBGR08wRkJRMEZETEc5Q1FVRmpUU3hqUVVGamRrSXNVVUZCWkN4SFFVRjVRblZDTEdOQlFXTjRRaXhSUVVGeVJEdEJRVU5FTEV0QlRFMHNUVUZMUVR0QlFVTk1PMEZCUTBFc1ZVRkJTVFJDTEdGQlFXRTdRVUZEWms0c2EwSkJRVlZQTEV0QlFVdERMRWRCUVV3c1EwRkJVMVFzV1VGQldVTXNVVUZCY2tJc1JVRkJLMEpGTEdOQlFXTkdMRkZCUVRkRExFTkJSRXM3UVVGRlpuUkNMR3RDUVVGVkxFTkJSa3M3UVVGSFppdENMR3RDUVVGVlJpeExRVUZMUXl4SFFVRk1MRU5CUVZOVUxGbEJRVmxWTEZGQlFWb3NSMEZCZFVKaUxGVkJRV2hETEVWQlFUUkRUU3hqUVVGalJpeFJRVUZrTEVkQlFYbENTQ3haUVVGeVJTeERRVWhMTzBGQlNXWnNRaXhyUWtGQlZTeERRVXBMTzBGQlMyWkdMR1ZCUVU4N1FVRk1VU3hQUVVGcVFqdEJRVTlCYVVNc2FVSkJRVmRLTEZWQlFWZ3NSVUZCZFVKUUxGbEJRVmxETEZGQlFXNURMRVZCUVRaRFJDeFpRVUZaZEVJc1MwRkJla1FzUlVGQlowVjVRaXhqUVVGalJpeFJRVUU1UlN4RlFVRjNSa1VzWTBGQlkzcENMRXRCUVhSSE8wRkJRMEZyUWp0QlFVTkJSRHM3UVVGRlFWUXNWVUZCU1ZFc1MwRkJTaXhEUVVGVlZ5eEpRVUZXTEVOQlFXVkZMRlZCUVdZN1FVRkRSRHRCUVVOR096dEJRVVZFTEZOQlFVOXlRaXhIUVVGUU8wRkJRMFE3TzBGQlJVUXNVMEZCVTBRc1UwRkJWQ3hEUVVGdFFqSkNMRXRCUVc1Q0xFVkJRVEJDTlVJc1NVRkJNVUlzUlVGQlowTTdRVUZET1VJc1RVRkJTU3hQUVVGUE5FSXNTMEZCVUN4TFFVRnBRaXhSUVVGeVFpeEZRVUVyUWp0QlFVTTNRaXhSUVVGSkxFOUJRVTlETEVsQlFWQXNRMEZCV1VRc1MwRkJXaXhMUVVGMVFpeFhRVUZYUXl4SlFVRllMRU5CUVdkQ1JDeExRVUZvUWl4RFFVRXpRaXhGUVVGdlJEdEJRVU5zUkN4aFFVRlBMSGxGUVVGWFFTeExRVUZZTEVWQlFXdENMRU5CUVd4Q08wRkJRVkE3UVVGRFJEczdRVUZGUkN4UlFVRkpMRU5CUVVNMVFpeEpRVUZNTEVWQlFWYzdRVUZEVkN4WlFVRk5MRWxCUVVrNFFpeExRVUZLTEVOQlFWVXNhMFJCUVZZc1EwRkJUanRCUVVORU8wRkJRMFFzVjBGQlR5d3JSVUZCWjBKcVF5eFRRVUZvUWl4RlFVRXlRa0VzVTBGQk0wSXNSVUZCYzBOSExFbEJRWFJETEVWQlFUUkRORUlzUzBGQk5VTTdRVUZCVUR0QlFVTkVPenRCUVVWRUxGTkJRVTlCTEV0QlFWQTdRVUZEUkRzN1FVRkZSQ3hUUVVGVGRrSXNaVUZCVkN4RFFVRjVRakJDTEV0QlFYcENMRVZCUVdkRE8wRkJRemxDTEZOQlFVOUJMRTFCUVUwelFpeFhRVUZPTEVsQlFYRkNNa0lzVFVGQlRUTkNMRmRCUVU0c1MwRkJjMEl5UWl4TlFVRk5la0lzVjBGQmVFUTdRVUZEUkRzN1FVRkZSQ3hUUVVGVFJ5eFhRVUZVTEVOQlFYRkNUaXhMUVVGeVFpeEZRVUUwUWt3c1NVRkJOVUlzUlVGQmEwTkRMRTFCUVd4RExFVkJRVEJETzBGQlEzaERMRTFCUVVsRUxGTkJRVk5ETEUxQlFXSXNSVUZCY1VJN1FVRkRia0lzVjBGQlQwUXNTVUZCVUR0QlFVTkVMRWRCUmtRc1RVRkZUenRCUVVOTVN5eFZRVUZOTmtJc1VVRkJUaXhIUVVGcFFpeEpRVUZxUWp0QlFVTkJMRmRCUVU4c1JVRkJRMnhETEZWQlFVUXNSVUZCVDBNc1kwRkJVQ3hGUVVGUU8wRkJRMFE3UVVGRFJqczdRVUZGUkN4VFFVRlRjVUlzVlVGQlZDeERRVUZ2UWxNc1NVRkJjRUlzUlVGQk1FSkpMRXRCUVRGQ0xFVkJRV2xETzBGQlF5OUNMRk5CUVU5S0xFdEJRVXRhTEZGQlFVd3NSMEZCWjBKblFpeE5RVUZOYUVJc1VVRkJkRUlzU1VGRFJGa3NTMEZCUzFvc1VVRkJUQ3hIUVVGblFsa3NTMEZCUzJ4RExGRkJRWFJDTEVkQlFXdERjME1zVFVGQlRXaENMRkZCUkRkRE8wRkJSVVE3TzBGQlJVUXNVMEZCVTBzc1UwRkJWQ3hEUVVGdFFqbENMRWxCUVc1Q0xFVkJRWGxDTUVNc1RVRkJla0lzUlVGQmFVTTdRVUZETDBJc1UwRkJUenRCUVVOTWFrSXNZMEZCVlhwQ0xFdEJRVXQ1UWl4UlFVUldMRVZCUTI5Q2RFSXNWVUZCVlVnc1MwRkJTMGNzVVVGRWJrTTdRVUZGVEN0Q0xHTkJRVlZzUXl4TFFVRkxhME1zVVVGQlRDeEhRVUZuUWxFc1RVRkdja0lzUlVGRk5rSjBReXhWUVVGVlNpeExRVUZMU1N4UlFVWTFRenRCUVVkTVJpeFhRVUZQUml4TFFVRkxSVHRCUVVoUUxFZEJRVkE3UVVGTFJEczdRVUZGUkN4VFFVRlRhVU1zVlVGQlZDeERRVUZ2UW01RExFbEJRWEJDTEVWQlFUQkNjVUlzVlVGQk1VSXNSVUZCYzBOelFpeFRRVUYwUXl4RlFVRnBSRU1zVjBGQmFrUXNSVUZCT0VSRExGVkJRVGxFTEVWQlFUQkZPMEZCUTNoRk8wRkJRMEU3UVVGRFFTeE5RVUZKZGtNc1QwRkJUeXhGUVVGRGIwTXNVVUZCVVhKQ0xGVkJRVlFzUlVGQmNVSnVRaXhQUVVGUGVVTXNVMEZCTlVJc1JVRkJkVU5vUXl4UFFVRlBMRU5CUVRsRExFVkJRVmc3UVVGQlFTeE5RVU5KYlVNc1VVRkJVU3hGUVVGRFNpeFJRVUZSUlN4WFFVRlVMRVZCUVhOQ01VTXNUMEZCVHpKRExGVkJRVGRDTEVWQlFYbERiRU1zVDBGQlR5eERRVUZvUkN4RlFVUmFPenRCUVVkQk8wRkJRMEZ2UXl4blFrRkJZeTlETEVsQlFXUXNSVUZCYjBKTkxFbEJRWEJDTEVWQlFUQkNkME1zUzBGQk1VSTdRVUZEUVVNc1owSkJRV012UXl4SlFVRmtMRVZCUVc5Q09FTXNTMEZCY0VJc1JVRkJNa0o0UXl4SlFVRXpRanM3UVVGRlFUdEJRVU5CTEZOQlFVOUJMRXRCUVV0TExFdEJRVXdzUjBGQllVd3NTMEZCUzBvc1MwRkJUQ3hEUVVGWGNVSXNUVUZCZUVJc1NVRkJhME4xUWl4TlFVRk5ia01zUzBGQlRpeEhRVUZqYlVNc1RVRkJUVFZETEV0QlFVNHNRMEZCV1hGQ0xFMUJRVzVGTEVWQlFUSkZPMEZCUTNwRkxGRkJRVWxETEdOQlFXTnNRaXhMUVVGTFNpeExRVUZNTEVOQlFWZEpMRXRCUVV0TExFdEJRV2hDTEVOQlFXeENPMEZCUVVFc1VVRkRTWEZETEdWQlFXVkdMRTFCUVUwMVF5eExRVUZPTEVOQlFWazBReXhOUVVGTmJrTXNTMEZCYkVJc1EwRkVia0k3TzBGQlIwRXNVVUZCU1N4RFFVRkRZU3haUVVGWkxFTkJRVm9zVFVGQmJVSXNSMEZCYmtJc1NVRkJNRUpCTEZsQlFWa3NRMEZCV2l4TlFVRnRRaXhIUVVFNVF5eE5RVU5KZDBJc1lVRkJZU3hEUVVGaUxFMUJRVzlDTEVkQlFYQkNMRWxCUVRKQ1FTeGhRVUZoTEVOQlFXSXNUVUZCYjBJc1IwRkVia1FzUTBGQlNpeEZRVU0yUkR0QlFVTXpSRHRCUVVOQlF5eHRRa0ZCWVdwRUxFbEJRV0lzUlVGQmJVSk5MRWxCUVc1Q0xFVkJRWGxDZDBNc1MwRkJla0k3UVVGRFJDeExRVXBFTEUxQlNVOHNTVUZCU1hSQ0xGbEJRVmtzUTBGQldpeE5RVUZ0UWl4SFFVRnVRaXhKUVVFd1FuZENMR0ZCUVdFc1EwRkJZaXhOUVVGdlFpeEhRVUZzUkN4RlFVRjFSRHRCUVVGQk96dEJRVUZCTERoQ1FVTTFSRHRCUVVOQkxEQkZRVUZMT1VNc1MwRkJUQ3hGUVVGWE1rSXNTVUZCV0N3MFRFRkJiMEp4UWl4alFVRmpOVU1zU1VGQlpDeERRVUZ3UWp0QlFVTkVMRXRCU0Uwc1RVRkhRU3hKUVVGSk1FTXNZVUZCWVN4RFFVRmlMRTFCUVc5Q0xFZEJRWEJDTEVsQlFUSkNlRUlzV1VGQldTeERRVUZhTEUxQlFXMUNMRWRCUVd4RUxFVkJRWFZFTzBGQlFVRTdPMEZCUVVFc09FSkJRelZFTzBGQlEwRXNNa1ZCUVV0MFFpeExRVUZNTEVWQlFWY3lRaXhKUVVGWUxEWk1RVUZ2UW5GQ0xHTkJRV05LTEV0QlFXUXNRMEZCY0VJN1FVRkRSQ3hMUVVoTkxFMUJSMEVzU1VGQlNYUkNMRmxCUVZrc1EwRkJXaXhOUVVGdFFpeEhRVUZ1UWl4SlFVRXdRbmRDTEdGQlFXRXNRMEZCWWl4TlFVRnZRaXhIUVVGc1JDeEZRVUYxUkR0QlFVTTFSRHRCUVVOQlJ5eGpRVUZSYmtRc1NVRkJVaXhGUVVGalRTeEpRVUZrTEVWQlFXOUNkME1zUzBGQmNFSTdRVUZEUkN4TFFVaE5MRTFCUjBFc1NVRkJTVVVzWVVGQllTeERRVUZpTEUxQlFXOUNMRWRCUVhCQ0xFbEJRVEpDZUVJc1dVRkJXU3hEUVVGYUxFMUJRVzFDTEVkQlFXeEVMRVZCUVhWRU8wRkJRelZFTzBGQlEwRXlRaXhqUVVGUmJrUXNTVUZCVWl4RlFVRmpPRU1zUzBGQlpDeEZRVUZ4UW5oRExFbEJRWEpDTEVWQlFUSkNMRWxCUVROQ08wRkJRMFFzUzBGSVRTeE5RVWRCTEVsQlFVbHJRaXhuUWtGQlowSjNRaXhaUVVGd1FpeEZRVUZyUXp0QlFVTjJRenRCUVVOQmFFUXNWMEZCUzBVc1MwRkJUQ3hEUVVGWE1rSXNTVUZCV0N4RFFVRm5Ra3dzVjBGQmFFSTdRVUZEUVd4Q0xGZEJRVXRMTEV0QlFVdzdRVUZEUVcxRExGbEJRVTF1UXl4TFFVRk9PMEZCUTBRc1MwRk1UU3hOUVV0Qk8wRkJRMHc3UVVGRFFUWkNMR1ZCUVZONFF5eEpRVUZVTEVWQlFXVnJSQ3hqUVVGak5VTXNTVUZCWkN4RFFVRm1MRVZCUVc5RE5FTXNZMEZCWTBvc1MwRkJaQ3hEUVVGd1F6dEJRVU5FTzBGQlEwWTdPMEZCUlVRN1FVRkRRVTBzYVVKQlFXVndSQ3hKUVVGbUxFVkJRWEZDVFN4SlFVRnlRanRCUVVOQk9FTXNhVUpCUVdWd1JDeEpRVUZtTEVWQlFYRkNPRU1zUzBGQmNrSTdPMEZCUlVGb1JDeG5Ra0ZCWTBVc1NVRkJaRHRCUVVORU96dEJRVVZFTEZOQlFWTnBSQ3haUVVGVUxFTkJRWE5DYWtRc1NVRkJkRUlzUlVGQk5FSk5MRWxCUVRWQ0xFVkJRV3REZDBNc1MwRkJiRU1zUlVGQmVVTTdRVUZEZGtNc1RVRkJTVThzV1VGQldVZ3NZMEZCWXpWRExFbEJRV1FzUTBGQmFFSTdRVUZCUVN4TlFVTkpaMFFzWlVGQlpVb3NZMEZCWTBvc1MwRkJaQ3hEUVVSdVFqczdRVUZIUVN4TlFVRkpVeXhYUVVGWFJpeFRRVUZZTEV0QlFYbENSU3hYUVVGWFJDeFpRVUZZTEVOQlFUZENMRVZCUVhWRU8wRkJRM0pFTzBGQlEwRXNVVUZCU1N3NFJVRkJaMEpFTEZOQlFXaENMRVZCUVRKQ1F5eFpRVUV6UWl4TFFVTkhSU3h0UWtGQmJVSldMRXRCUVc1Q0xFVkJRVEJDVHl4VFFVRXhRaXhGUVVGeFEwRXNWVUZCVlRsQ0xFMUJRVllzUjBGQmJVSXJRaXhoUVVGaEwwSXNUVUZCY2tVc1EwRkVVQ3hGUVVOeFJqdEJRVUZCT3p0QlFVRkJMRFpDUVVOdVJpeHpSVUZCUzNKQ0xFdEJRVXdzUlVGQlZ6SkNMRWxCUVZnc05reEJRVzlDZDBJc1UwRkJjRUk3UVVGRFFUdEJRVU5FTEV0QlNrUXNUVUZKVHl4SlFVRkpMRGhGUVVGblFrTXNXVUZCYUVJc1JVRkJPRUpFTEZOQlFUbENMRXRCUTBwSExHMUNRVUZ0UW14RUxFbEJRVzVDTEVWQlFYbENaMFFzV1VGQmVrSXNSVUZCZFVOQkxHRkJRV0V2UWl4TlFVRmlMRWRCUVhOQ09FSXNWVUZCVlRsQ0xFMUJRWFpGTEVOQlJFRXNSVUZEWjBZN1FVRkJRVHM3UVVGQlFTdzJRa0ZEY2tZc2MwVkJRVXR5UWl4TFFVRk1MRVZCUVZjeVFpeEpRVUZZTERaTVFVRnZRbmxDTEZsQlFYQkNPMEZCUTBFN1FVRkRSRHRCUVVOR0xFZEJXRVFzVFVGWFR5eEpRVUZKTEhsRlFVRlhSQ3hUUVVGWUxFVkJRWE5DUXl4WlFVRjBRaXhEUVVGS0xFVkJRWGxETzBGQlFVRTdPMEZCUVVFc01rSkJRemxETEhORlFVRkxjRVFzUzBGQlRDeEZRVUZYTWtJc1NVRkJXQ3cyVEVGQmIwSjNRaXhUUVVGd1FqdEJRVU5CTzBGQlEwUTdPMEZCUlVSaUxGZEJRVk40UXl4SlFVRlVMRVZCUVdWeFJDeFRRVUZtTEVWQlFUQkNReXhaUVVFeFFqdEJRVU5FT3p0QlFVVkVMRk5CUVZOSUxFOUJRVlFzUTBGQmFVSnVSQ3hKUVVGcVFpeEZRVUYxUWswc1NVRkJka0lzUlVGQk5rSjNReXhMUVVFM1FpeEZRVUZ2UTFjc1NVRkJjRU1zUlVGQk1FTTdRVUZEZUVNc1RVRkJTVW9zV1VGQldVZ3NZMEZCWXpWRExFbEJRV1FzUTBGQmFFSTdRVUZCUVN4TlFVTkpaMFFzWlVGQlpVa3NaVUZCWlZvc1MwRkJaaXhGUVVGelFrOHNVMEZCZEVJc1EwRkVia0k3UVVGRlFTeE5RVUZKUXl4aFFVRmhTeXhOUVVGcVFpeEZRVUY1UWp0QlFVRkJPenRCUVVGQkxESkNRVU4yUWl4elJVRkJTM3BFTEV0QlFVd3NSVUZCVnpKQ0xFbEJRVmdzTmt4QlFXOUNlVUlzWVVGQllVc3NUVUZCYWtNN1FVRkRSQ3hIUVVaRUxFMUJSVTg3UVVGRFRHNUNMR0ZCUVZONFF5eEpRVUZVTEVWQlFXVjVSQ3hQUVVGUFNDeFpRVUZRTEVkQlFYTkNSQ3hUUVVGeVF5eEZRVUZuUkVrc1QwRkJUMG9zVTBGQlVDeEhRVUZ0UWtNc1dVRkJia1U3UVVGRFJEdEJRVU5HT3p0QlFVVkVMRk5CUVZOa0xGRkJRVlFzUTBGQmEwSjRReXhKUVVGc1FpeEZRVUYzUWswc1NVRkJlRUlzUlVGQk9FSjNReXhMUVVFNVFpeEZRVUZ4UXp0QlFVTnVRemxETEU5QlFVdDNReXhSUVVGTUxFZEJRV2RDTEVsQlFXaENPMEZCUTBGNFF5eFBRVUZMUlN4TFFVRk1MRU5CUVZjeVFpeEpRVUZZTEVOQlFXZENPMEZCUTJSWExHTkJRVlVzU1VGRVNUdEJRVVZrYkVNc1ZVRkJUVUVzU1VGR1VUdEJRVWRrUXl4WlFVRlJkVU03UVVGSVRTeEhRVUZvUWp0QlFVdEVPenRCUVVWRUxGTkJRVk5ETEdGQlFWUXNRMEZCZFVJdlF5eEpRVUYyUWl4RlFVRTJRalJFTEUxQlFUZENMRVZCUVhGRFpDeExRVUZ5UXl4RlFVRTBRenRCUVVNeFF5eFRRVUZQWXl4UFFVRlBiRUlzVFVGQlVDeEhRVUZuUWtrc1RVRkJUVW9zVFVGQmRFSXNTVUZCWjBOclFpeFBRVUZQYWtRc1MwRkJVQ3hIUVVGbGFVUXNUMEZCVHpGRUxFdEJRVkFzUTBGQllYRkNMRTFCUVc1RkxFVkJRVEpGTzBGQlEzcEZMRkZCUVVselF5eFBRVUZQUkN4UFFVRlBNVVFzUzBGQlVDeERRVUZoTUVRc1QwRkJUMnBFTEV0QlFWQXNSVUZCWWl4RFFVRllPMEZCUTBGWUxGTkJRVXRGTEV0QlFVd3NRMEZCVnpKQ0xFbEJRVmdzUTBGQlowSm5ReXhKUVVGb1FqdEJRVU5CUkN4WFFVRlBiRUlzVFVGQlVEdEJRVU5FTzBGQlEwWTdRVUZEUkN4VFFVRlRWU3hqUVVGVUxFTkJRWGRDY0VRc1NVRkJlRUlzUlVGQk9FSTBSQ3hOUVVFNVFpeEZRVUZ6UXp0QlFVTndReXhUUVVGUFFTeFBRVUZQYWtRc1MwRkJVQ3hIUVVGbGFVUXNUMEZCVHpGRUxFdEJRVkFzUTBGQllYRkNMRTFCUVc1RExFVkJRVEpETzBGQlEzcERMRkZCUVVselF5eFBRVUZQUkN4UFFVRlBNVVFzUzBGQlVDeERRVUZoTUVRc1QwRkJUMnBFTEV0QlFWQXNSVUZCWWl4RFFVRllPMEZCUTBGWUxGTkJRVXRGTEV0QlFVd3NRMEZCVnpKQ0xFbEJRVmdzUTBGQlowSm5ReXhKUVVGb1FqdEJRVU5FTzBGQlEwWTdPMEZCUlVRc1UwRkJVMWdzWVVGQlZDeERRVUYxUWxrc1MwRkJka0lzUlVGQk9FSTdRVUZETlVJc1RVRkJTWEJFTEUxQlFVMHNSVUZCVmp0QlFVRkJMRTFCUTBseFJDeFpRVUZaUkN4TlFVRk5OVVFzUzBGQlRpeERRVUZaTkVRc1RVRkJUVzVFTEV0QlFXeENMRVZCUVhsQ0xFTkJRWHBDTEVOQlJHaENPMEZCUlVFc1UwRkJUMjFFTEUxQlFVMXVSQ3hMUVVGT0xFZEJRV050UkN4TlFVRk5OVVFzUzBGQlRpeERRVUZaY1VJc1RVRkJha01zUlVGQmVVTTdRVUZEZGtNc1VVRkJTWE5ETEU5QlFVOURMRTFCUVUwMVJDeExRVUZPTEVOQlFWazBSQ3hOUVVGTmJrUXNTMEZCYkVJc1EwRkJXRHM3UVVGRlFUdEJRVU5CTEZGQlFVbHZSQ3hqUVVGakxFZEJRV1FzU1VGQmNVSkdMRXRCUVVzc1EwRkJUQ3hOUVVGWkxFZEJRWEpETEVWQlFUQkRPMEZCUTNoRFJTeHJRa0ZCV1N4SFFVRmFPMEZCUTBRN08wRkJSVVFzVVVGQlNVRXNZMEZCWTBZc1MwRkJTeXhEUVVGTUxFTkJRV3hDTEVWQlFUSkNPMEZCUTNwQ2JrUXNWVUZCU1cxQ0xFbEJRVW9zUTBGQlUyZERMRWxCUVZRN1FVRkRRVU1zV1VGQlRXNUVMRXRCUVU0N1FVRkRSQ3hMUVVoRUxFMUJSMDg3UVVGRFREdEJRVU5FTzBGQlEwWTdPMEZCUlVRc1UwRkJUMFFzUjBGQlVEdEJRVU5FTzBGQlEwUXNVMEZCVTJkRUxHTkJRVlFzUTBGQmQwSkpMRXRCUVhoQ0xFVkJRU3RDUlN4WlFVRXZRaXhGUVVFMlF6dEJRVU16UXl4TlFVRkpReXhWUVVGVkxFVkJRV1E3UVVGQlFTeE5RVU5KVGl4VFFVRlRMRVZCUkdJN1FVRkJRU3hOUVVWSlR5eGhRVUZoTEVOQlJtcENPMEZCUVVFc1RVRkhTVU1zYVVKQlFXbENMRXRCU0hKQ08wRkJRVUVzVFVGSlNVTXNZVUZCWVN4TFFVcHFRanRCUVV0QkxGTkJRVTlHTEdGQlFXRkdMR0ZCUVdGNlF5eE5RVUV4UWl4SlFVTkZkVU1zVFVGQlRXNUVMRXRCUVU0c1IwRkJZMjFFTEUxQlFVMDFSQ3hMUVVGT0xFTkJRVmx4UWl4TlFVUnVReXhGUVVNeVF6dEJRVU42UXl4UlFVRkpPRU1zVTBGQlUxQXNUVUZCVFRWRUxFdEJRVTRzUTBGQldUUkVMRTFCUVUxdVJDeExRVUZzUWl4RFFVRmlPMEZCUVVFc1VVRkRTVEpFTEZGQlFWRk9MR0ZCUVdGRkxGVkJRV0lzUTBGRVdqczdRVUZIUVR0QlFVTkJMRkZCUVVsSkxFMUJRVTBzUTBGQlRpeE5RVUZoTEVkQlFXcENMRVZCUVhOQ08wRkJRM0JDTzBGQlEwUTdPMEZCUlVSSUxIRkNRVUZwUWtFc2EwSkJRV3RDUlN4UFFVRlBMRU5CUVZBc1RVRkJZeXhIUVVGcVJEczdRVUZGUVZZc1YwRkJUemxDTEVsQlFWQXNRMEZCV1hsRExFdEJRVm83UVVGRFFVbzdPMEZCUlVFN1FVRkRRVHRCUVVOQkxGRkJRVWxITEU5QlFVOHNRMEZCVUN4TlFVRmpMRWRCUVd4Q0xFVkJRWFZDTzBGQlEzSkNSQ3h0UWtGQllTeEpRVUZpT3p0QlFVVkJMR0ZCUVU5RExFOUJRVThzUTBGQlVDeE5RVUZqTEVkQlFYSkNMRVZCUVRCQ08wRkJRM2hDU2l4blFrRkJVWEJETEVsQlFWSXNRMEZCWVhkRExFMUJRV0k3UVVGRFFVRXNhVUpCUVZOUUxFMUJRVTAxUkN4TFFVRk9MRU5CUVZrc1JVRkJSVFJFTEUxQlFVMXVSQ3hMUVVGd1FpeERRVUZVTzBGQlEwUTdRVUZEUmpzN1FVRkZSQ3hSUVVGSk1rUXNUVUZCVFVNc1RVRkJUaXhEUVVGaExFTkJRV0lzVFVGQmIwSkdMRTlCUVU5RkxFMUJRVkFzUTBGQll5eERRVUZrTEVOQlFYaENMRVZCUVRCRE8wRkJRM2hEVGl4alFVRlJjRU1zU1VGQlVpeERRVUZoZDBNc1RVRkJZanRCUVVOQlVDeFpRVUZOYmtRc1MwRkJUanRCUVVORUxFdEJTRVFzVFVGSFR6dEJRVU5NZVVRc2JVSkJRV0VzU1VGQllqdEJRVU5FTzBGQlEwWTdPMEZCUlVRc1RVRkJTU3hEUVVGRFNpeGhRVUZoUlN4VlFVRmlMRXRCUVRSQ0xFVkJRVGRDTEVWQlFXbERMRU5CUVdwRExFMUJRWGRETEVkQlFYaERMRWxCUTBkRExHTkJSRkFzUlVGRGRVSTdRVUZEY2tKRExHbENRVUZoTEVsQlFXSTdRVUZEUkRzN1FVRkZSQ3hOUVVGSlFTeFZRVUZLTEVWQlFXZENPMEZCUTJRc1YwRkJUMGdzVDBGQlVEdEJRVU5FT3p0QlFVVkVMRk5CUVU5RExHRkJRV0ZHTEdGQlFXRjZReXhOUVVGcVF5eEZRVUY1UXp0QlFVTjJRMjlETEZkQlFVODVRaXhKUVVGUUxFTkJRVmx0UXl4aFFVRmhSU3haUVVGaUxFTkJRVm83UVVGRFJEczdRVUZGUkN4VFFVRlBPMEZCUTB4UUxHdENRVVJMTzBGQlJVeE5PMEZCUmtzc1IwRkJVRHRCUVVsRU96dEJRVVZFTEZOQlFWTldMRlZCUVZRc1EwRkJiMEpWTEU5QlFYQkNMRVZCUVRaQ08wRkJRek5DTEZOQlFVOUJMRkZCUVZGUExFMUJRVklzUTBGQlpTeFZRVUZUUXl4SlFVRlVMRVZCUVdWS0xFMUJRV1lzUlVGQmRVSTdRVUZETTBNc1YwRkJUMGtzVVVGQlVVb3NUMEZCVHl4RFFVRlFMRTFCUVdNc1IwRkJOMEk3UVVGRFJDeEhRVVpOTEVWQlJVb3NTVUZHU1N4RFFVRlFPMEZCUjBRN1FVRkRSQ3hUUVVGVFlpeHJRa0ZCVkN4RFFVRTBRazBzUzBGQk5VSXNSVUZCYlVOWkxHRkJRVzVETEVWQlFXdEVReXhMUVVGc1JDeEZRVUY1UkR0QlFVTjJSQ3hQUVVGTExFbEJRVWxETEVsQlFVa3NRMEZCWWl4RlFVRm5Ra0VzU1VGQlNVUXNTMEZCY0VJc1JVRkJNa0pETEVkQlFUTkNMRVZCUVdkRE8wRkJRemxDTEZGQlFVbERMR2RDUVVGblFrZ3NZMEZCWTBFc1kwRkJZMjVFTEUxQlFXUXNSMEZCZFVKdlJDeExRVUYyUWl4SFFVRXJRa01zUTBGQk4wTXNSVUZCWjBSTUxFMUJRV2hFTEVOQlFYVkVMRU5CUVhaRUxFTkJRWEJDTzBGQlEwRXNVVUZCU1ZRc1RVRkJUVFZFTEV0QlFVNHNRMEZCV1RSRUxFMUJRVTF1UkN4TFFVRk9MRWRCUVdOcFJTeERRVUV4UWl4TlFVRnBReXhOUVVGTlF5eGhRVUV6UXl4RlFVRXdSRHRCUVVONFJDeGhRVUZQTEV0QlFWQTdRVUZEUkR0QlFVTkdPenRCUVVWRVppeFJRVUZOYmtRc1MwRkJUaXhKUVVGbFowVXNTMEZCWmp0QlFVTkJMRk5CUVU4c1NVRkJVRHRCUVVORU96dEJRVVZFTEZOQlFWTXhSU3h0UWtGQlZDeERRVUUyUWtNc1MwRkJOMElzUlVGQmIwTTdRVUZEYkVNc1RVRkJTVU1zVjBGQlZ5eERRVUZtTzBGQlEwRXNUVUZCU1VNc1YwRkJWeXhEUVVGbU96dEJRVVZCUml4UlFVRk5ORVVzVDBGQlRpeERRVUZqTEZWQlFWTnFRaXhKUVVGVUxFVkJRV1U3UVVGRE0wSXNVVUZCU1N4UFFVRlBRU3hKUVVGUUxFdEJRV2RDTEZGQlFYQkNMRVZCUVRoQ08wRkJRelZDTEZWQlFVbHJRaXhWUVVGVk9VVXNiMEpCUVc5Q05FUXNTMEZCUzNaRUxFbEJRWHBDTEVOQlFXUTdRVUZEUVN4VlFVRkpNRVVzWVVGQllTOUZMRzlDUVVGdlFqUkVMRXRCUVV0MFJDeE5RVUY2UWl4RFFVRnFRanM3UVVGRlFTeFZRVUZKU2l4aFFVRmhSU3hUUVVGcVFpeEZRVUUwUWp0QlFVTXhRaXhaUVVGSk1FVXNVVUZCVVRWRkxGRkJRVklzUzBGQmNVSTJSU3hYUVVGWE4wVXNVVUZCY0VNc1JVRkJPRU03UVVGRE5VTkJMSE5DUVVGWk5FVXNVVUZCVVRWRkxGRkJRWEJDTzBGQlEwUXNVMEZHUkN4TlFVVlBPMEZCUTB4QkxIRkNRVUZYUlN4VFFVRllPMEZCUTBRN1FVRkRSanM3UVVGRlJDeFZRVUZKUkN4aFFVRmhReXhUUVVGcVFpeEZRVUUwUWp0QlFVTXhRaXhaUVVGSk1FVXNVVUZCVVRORkxGRkJRVklzUzBGQmNVSTBSU3hYUVVGWE5VVXNVVUZCY0VNc1JVRkJPRU03UVVGRE5VTkJMSE5DUVVGWk1rVXNVVUZCVVRORkxGRkJRWEJDTzBGQlEwUXNVMEZHUkN4TlFVVlBPMEZCUTB4QkxIRkNRVUZYUXl4VFFVRllPMEZCUTBRN1FVRkRSanRCUVVOR0xFdEJia0pFTEUxQmJVSlBPMEZCUTB3c1ZVRkJTVVFzWVVGQllVTXNVMEZCWWl4TFFVRXlRbmRFTEV0QlFVc3NRMEZCVEN4TlFVRlpMRWRCUVZvc1NVRkJiVUpCTEV0QlFVc3NRMEZCVEN4TlFVRlpMRWRCUVRGRUxFTkJRVW9zUlVGQmIwVTdRVUZEYkVWNlJEdEJRVU5FTzBGQlEwUXNWVUZCU1VRc1lVRkJZVVVzVTBGQllpeExRVUV5UW5kRUxFdEJRVXNzUTBGQlRDeE5RVUZaTEVkQlFWb3NTVUZCYlVKQkxFdEJRVXNzUTBGQlRDeE5RVUZaTEVkQlFURkVMRU5CUVVvc1JVRkJiMFU3UVVGRGJFVXhSRHRCUVVORU8wRkJRMFk3UVVGRFJpeEhRVFZDUkRzN1FVRTRRa0VzVTBGQlR5eEZRVUZEUVN4clFrRkJSQ3hGUVVGWFF5eHJRa0ZCV0N4RlFVRlFPMEZCUTBRaUxDSm1hV3hsSWpvaWJXVnlaMlV1YW5NaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SnBiWEJ2Y25RZ2UzTjBjblZqZEhWeVpXUlFZWFJqYUgwZ1puSnZiU0FuTGk5amNtVmhkR1VuTzF4dWFXMXdiM0owSUh0d1lYSnpaVkJoZEdOb2ZTQm1jbTl0SUNjdUwzQmhjbk5sSnp0Y2JseHVhVzF3YjNKMElIdGhjbkpoZVVWeGRXRnNMQ0JoY25KaGVWTjBZWEowYzFkcGRHaDlJR1p5YjIwZ0p5NHVMM1YwYVd3dllYSnlZWGtuTzF4dVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1kyRnNZMHhwYm1WRGIzVnVkQ2hvZFc1cktTQjdYRzRnSUdOdmJuTjBJSHR2YkdSTWFXNWxjeXdnYm1WM1RHbHVaWE45SUQwZ1kyRnNZMDlzWkU1bGQweHBibVZEYjNWdWRDaG9kVzVyTG14cGJtVnpLVHRjYmx4dUlDQnBaaUFvYjJ4a1RHbHVaWE1nSVQwOUlIVnVaR1ZtYVc1bFpDa2dlMXh1SUNBZ0lHaDFibXN1YjJ4a1RHbHVaWE1nUFNCdmJHUk1hVzVsY3p0Y2JpQWdmU0JsYkhObElIdGNiaUFnSUNCa1pXeGxkR1VnYUhWdWF5NXZiR1JNYVc1bGN6dGNiaUFnZlZ4dVhHNGdJR2xtSUNodVpYZE1hVzVsY3lBaFBUMGdkVzVrWldacGJtVmtLU0I3WEc0Z0lDQWdhSFZ1YXk1dVpYZE1hVzVsY3lBOUlHNWxkMHhwYm1Wek8xeHVJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lHUmxiR1YwWlNCb2RXNXJMbTVsZDB4cGJtVnpPMXh1SUNCOVhHNTlYRzVjYm1WNGNHOXlkQ0JtZFc1amRHbHZiaUJ0WlhKblpTaHRhVzVsTENCMGFHVnBjbk1zSUdKaGMyVXBJSHRjYmlBZ2JXbHVaU0E5SUd4dllXUlFZWFJqYUNodGFXNWxMQ0JpWVhObEtUdGNiaUFnZEdobGFYSnpJRDBnYkc5aFpGQmhkR05vS0hSb1pXbHljeXdnWW1GelpTazdYRzVjYmlBZ2JHVjBJSEpsZENBOUlIdDlPMXh1WEc0Z0lDOHZJRVp2Y2lCcGJtUmxlQ0IzWlNCcWRYTjBJR3hsZENCcGRDQndZWE56SUhSb2NtOTFaMmdnWVhNZ2FYUWdaRzlsYzI0bmRDQm9ZWFpsSUdGdWVTQnVaV05sYzNOaGNua2diV1ZoYm1sdVp5NWNiaUFnTHk4Z1RHVmhkbWx1WnlCellXNXBkSGtnWTJobFkydHpJRzl1SUhSb2FYTWdkRzhnZEdobElFRlFTU0JqYjI1emRXMWxjaUIwYUdGMElHMWhlU0JyYm05M0lHMXZjbVVnWVdKdmRYUWdkR2hsWEc0Z0lDOHZJRzFsWVc1cGJtY2dhVzRnZEdobGFYSWdiM2R1SUdOdmJuUmxlSFF1WEc0Z0lHbG1JQ2h0YVc1bExtbHVaR1Y0SUh4OElIUm9aV2x5Y3k1cGJtUmxlQ2tnZTF4dUlDQWdJSEpsZEM1cGJtUmxlQ0E5SUcxcGJtVXVhVzVrWlhnZ2ZId2dkR2hsYVhKekxtbHVaR1Y0TzF4dUlDQjlYRzVjYmlBZ2FXWWdLRzFwYm1VdWJtVjNSbWxzWlU1aGJXVWdmSHdnZEdobGFYSnpMbTVsZDBacGJHVk9ZVzFsS1NCN1hHNGdJQ0FnYVdZZ0tDRm1hV3hsVG1GdFpVTm9ZVzVuWldRb2JXbHVaU2twSUh0Y2JpQWdJQ0FnSUM4dklFNXZJR2hsWVdSbGNpQnZjaUJ1YnlCamFHRnVaMlVnYVc0Z2IzVnljeXdnZFhObElIUm9aV2x5Y3lBb1lXNWtJRzkxY25NZ2FXWWdkR2hsYVhKeklHUnZaWE1nYm05MElHVjRhWE4wS1Z4dUlDQWdJQ0FnY21WMExtOXNaRVpwYkdWT1lXMWxJRDBnZEdobGFYSnpMbTlzWkVacGJHVk9ZVzFsSUh4OElHMXBibVV1YjJ4a1JtbHNaVTVoYldVN1hHNGdJQ0FnSUNCeVpYUXVibVYzUm1sc1pVNWhiV1VnUFNCMGFHVnBjbk11Ym1WM1JtbHNaVTVoYldVZ2ZId2diV2x1WlM1dVpYZEdhV3hsVG1GdFpUdGNiaUFnSUNBZ0lISmxkQzV2YkdSSVpXRmtaWElnUFNCMGFHVnBjbk11YjJ4a1NHVmhaR1Z5SUh4OElHMXBibVV1YjJ4a1NHVmhaR1Z5TzF4dUlDQWdJQ0FnY21WMExtNWxkMGhsWVdSbGNpQTlJSFJvWldseWN5NXVaWGRJWldGa1pYSWdmSHdnYldsdVpTNXVaWGRJWldGa1pYSTdYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDZ2habWxzWlU1aGJXVkRhR0Z1WjJWa0tIUm9aV2x5Y3lrcElIdGNiaUFnSUNBZ0lDOHZJRTV2SUdobFlXUmxjaUJ2Y2lCdWJ5QmphR0Z1WjJVZ2FXNGdkR2hsYVhKekxDQjFjMlVnYjNWeWMxeHVJQ0FnSUNBZ2NtVjBMbTlzWkVacGJHVk9ZVzFsSUQwZ2JXbHVaUzV2YkdSR2FXeGxUbUZ0WlR0Y2JpQWdJQ0FnSUhKbGRDNXVaWGRHYVd4bFRtRnRaU0E5SUcxcGJtVXVibVYzUm1sc1pVNWhiV1U3WEc0Z0lDQWdJQ0J5WlhRdWIyeGtTR1ZoWkdWeUlEMGdiV2x1WlM1dmJHUklaV0ZrWlhJN1hHNGdJQ0FnSUNCeVpYUXVibVYzU0dWaFpHVnlJRDBnYldsdVpTNXVaWGRJWldGa1pYSTdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUM4dklFSnZkR2dnWTJoaGJtZGxaQzR1TGlCbWFXZDFjbVVnYVhRZ2IzVjBYRzRnSUNBZ0lDQnlaWFF1YjJ4a1JtbHNaVTVoYldVZ1BTQnpaV3hsWTNSR2FXVnNaQ2h5WlhRc0lHMXBibVV1YjJ4a1JtbHNaVTVoYldVc0lIUm9aV2x5Y3k1dmJHUkdhV3hsVG1GdFpTazdYRzRnSUNBZ0lDQnlaWFF1Ym1WM1JtbHNaVTVoYldVZ1BTQnpaV3hsWTNSR2FXVnNaQ2h5WlhRc0lHMXBibVV1Ym1WM1JtbHNaVTVoYldVc0lIUm9aV2x5Y3k1dVpYZEdhV3hsVG1GdFpTazdYRzRnSUNBZ0lDQnlaWFF1YjJ4a1NHVmhaR1Z5SUQwZ2MyVnNaV04wUm1sbGJHUW9jbVYwTENCdGFXNWxMbTlzWkVobFlXUmxjaXdnZEdobGFYSnpMbTlzWkVobFlXUmxjaWs3WEc0Z0lDQWdJQ0J5WlhRdWJtVjNTR1ZoWkdWeUlEMGdjMlZzWldOMFJtbGxiR1FvY21WMExDQnRhVzVsTG01bGQwaGxZV1JsY2l3Z2RHaGxhWEp6TG01bGQwaGxZV1JsY2lrN1hHNGdJQ0FnZlZ4dUlDQjlYRzVjYmlBZ2NtVjBMbWgxYm10eklEMGdXMTA3WEc1Y2JpQWdiR1YwSUcxcGJtVkpibVJsZUNBOUlEQXNYRzRnSUNBZ0lDQjBhR1ZwY25OSmJtUmxlQ0E5SURBc1hHNGdJQ0FnSUNCdGFXNWxUMlptYzJWMElEMGdNQ3hjYmlBZ0lDQWdJSFJvWldseWMwOW1abk5sZENBOUlEQTdYRzVjYmlBZ2QyaHBiR1VnS0cxcGJtVkpibVJsZUNBOElHMXBibVV1YUhWdWEzTXViR1Z1WjNSb0lIeDhJSFJvWldseWMwbHVaR1Y0SUR3Z2RHaGxhWEp6TG1oMWJtdHpMbXhsYm1kMGFDa2dlMXh1SUNBZ0lHeGxkQ0J0YVc1bFEzVnljbVZ1ZENBOUlHMXBibVV1YUhWdWEzTmJiV2x1WlVsdVpHVjRYU0I4ZkNCN2IyeGtVM1JoY25RNklFbHVabWx1YVhSNWZTeGNiaUFnSUNBZ0lDQWdkR2hsYVhKelEzVnljbVZ1ZENBOUlIUm9aV2x5Y3k1b2RXNXJjMXQwYUdWcGNuTkpibVJsZUYwZ2ZId2dlMjlzWkZOMFlYSjBPaUJKYm1acGJtbDBlWDA3WEc1Y2JpQWdJQ0JwWmlBb2FIVnVhMEpsWm05eVpTaHRhVzVsUTNWeWNtVnVkQ3dnZEdobGFYSnpRM1Z5Y21WdWRDa3BJSHRjYmlBZ0lDQWdJQzh2SUZSb2FYTWdjR0YwWTJnZ1pHOWxjeUJ1YjNRZ2IzWmxjbXhoY0NCM2FYUm9JR0Z1ZVNCdlppQjBhR1VnYjNSb1pYSnpMQ0I1WVhrdVhHNGdJQ0FnSUNCeVpYUXVhSFZ1YTNNdWNIVnphQ2hqYkc5dVpVaDFibXNvYldsdVpVTjFjbkpsYm5Rc0lHMXBibVZQWm1aelpYUXBLVHRjYmlBZ0lDQWdJRzFwYm1WSmJtUmxlQ3NyTzF4dUlDQWdJQ0FnZEdobGFYSnpUMlptYzJWMElDczlJRzFwYm1WRGRYSnlaVzUwTG01bGQweHBibVZ6SUMwZ2JXbHVaVU4xY25KbGJuUXViMnhrVEdsdVpYTTdYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDaG9kVzVyUW1WbWIzSmxLSFJvWldseWMwTjFjbkpsYm5Rc0lHMXBibVZEZFhKeVpXNTBLU2tnZTF4dUlDQWdJQ0FnTHk4Z1ZHaHBjeUJ3WVhSamFDQmtiMlZ6SUc1dmRDQnZkbVZ5YkdGd0lIZHBkR2dnWVc1NUlHOW1JSFJvWlNCdmRHaGxjbk1zSUhsaGVTNWNiaUFnSUNBZ0lISmxkQzVvZFc1cmN5NXdkWE5vS0dOc2IyNWxTSFZ1YXloMGFHVnBjbk5EZFhKeVpXNTBMQ0IwYUdWcGNuTlBabVp6WlhRcEtUdGNiaUFnSUNBZ0lIUm9aV2x5YzBsdVpHVjRLeXM3WEc0Z0lDQWdJQ0J0YVc1bFQyWm1jMlYwSUNzOUlIUm9aV2x5YzBOMWNuSmxiblF1Ym1WM1RHbHVaWE1nTFNCMGFHVnBjbk5EZFhKeVpXNTBMbTlzWkV4cGJtVnpPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBdkx5QlBkbVZ5YkdGd0xDQnRaWEpuWlNCaGN5QmlaWE4wSUhkbElHTmhibHh1SUNBZ0lDQWdiR1YwSUcxbGNtZGxaRWgxYm1zZ1BTQjdYRzRnSUNBZ0lDQWdJRzlzWkZOMFlYSjBPaUJOWVhSb0xtMXBiaWh0YVc1bFEzVnljbVZ1ZEM1dmJHUlRkR0Z5ZEN3Z2RHaGxhWEp6UTNWeWNtVnVkQzV2YkdSVGRHRnlkQ2tzWEc0Z0lDQWdJQ0FnSUc5c1pFeHBibVZ6T2lBd0xGeHVJQ0FnSUNBZ0lDQnVaWGRUZEdGeWREb2dUV0YwYUM1dGFXNG9iV2x1WlVOMWNuSmxiblF1Ym1WM1UzUmhjblFnS3lCdGFXNWxUMlptYzJWMExDQjBhR1ZwY25ORGRYSnlaVzUwTG05c1pGTjBZWEowSUNzZ2RHaGxhWEp6VDJabWMyVjBLU3hjYmlBZ0lDQWdJQ0FnYm1WM1RHbHVaWE02SURBc1hHNGdJQ0FnSUNBZ0lHeHBibVZ6T2lCYlhWeHVJQ0FnSUNBZ2ZUdGNiaUFnSUNBZ0lHMWxjbWRsVEdsdVpYTW9iV1Z5WjJWa1NIVnVheXdnYldsdVpVTjFjbkpsYm5RdWIyeGtVM1JoY25Rc0lHMXBibVZEZFhKeVpXNTBMbXhwYm1WekxDQjBhR1ZwY25ORGRYSnlaVzUwTG05c1pGTjBZWEowTENCMGFHVnBjbk5EZFhKeVpXNTBMbXhwYm1WektUdGNiaUFnSUNBZ0lIUm9aV2x5YzBsdVpHVjRLeXM3WEc0Z0lDQWdJQ0J0YVc1bFNXNWtaWGdyS3p0Y2JseHVJQ0FnSUNBZ2NtVjBMbWgxYm10ekxuQjFjMmdvYldWeVoyVmtTSFZ1YXlrN1hHNGdJQ0FnZlZ4dUlDQjlYRzVjYmlBZ2NtVjBkWEp1SUhKbGREdGNibjFjYmx4dVpuVnVZM1JwYjI0Z2JHOWhaRkJoZEdOb0tIQmhjbUZ0TENCaVlYTmxLU0I3WEc0Z0lHbG1JQ2gwZVhCbGIyWWdjR0Z5WVcwZ1BUMDlJQ2R6ZEhKcGJtY25LU0I3WEc0Z0lDQWdhV1lnS0M5ZVFFQXZiUzUwWlhOMEtIQmhjbUZ0S1NCOGZDQW9MMTVKYm1SbGVEb3ZiUzUwWlhOMEtIQmhjbUZ0S1NrcElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCd1lYSnpaVkJoZEdOb0tIQmhjbUZ0S1Zzd1hUdGNiaUFnSUNCOVhHNWNiaUFnSUNCcFppQW9JV0poYzJVcElIdGNiaUFnSUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2lnblRYVnpkQ0J3Y205MmFXUmxJR0VnWW1GelpTQnlaV1psY21WdVkyVWdiM0lnY0dGemN5QnBiaUJoSUhCaGRHTm9KeWs3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCemRISjFZM1IxY21Wa1VHRjBZMmdvZFc1a1pXWnBibVZrTENCMWJtUmxabWx1WldRc0lHSmhjMlVzSUhCaGNtRnRLVHRjYmlBZ2ZWeHVYRzRnSUhKbGRIVnliaUJ3WVhKaGJUdGNibjFjYmx4dVpuVnVZM1JwYjI0Z1ptbHNaVTVoYldWRGFHRnVaMlZrS0hCaGRHTm9LU0I3WEc0Z0lISmxkSFZ5YmlCd1lYUmphQzV1WlhkR2FXeGxUbUZ0WlNBbUppQndZWFJqYUM1dVpYZEdhV3hsVG1GdFpTQWhQVDBnY0dGMFkyZ3ViMnhrUm1sc1pVNWhiV1U3WEc1OVhHNWNibVoxYm1OMGFXOXVJSE5sYkdWamRFWnBaV3hrS0dsdVpHVjRMQ0J0YVc1bExDQjBhR1ZwY25NcElIdGNiaUFnYVdZZ0tHMXBibVVnUFQwOUlIUm9aV2x5Y3lrZ2UxeHVJQ0FnSUhKbGRIVnliaUJ0YVc1bE8xeHVJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lHbHVaR1Y0TG1OdmJtWnNhV04wSUQwZ2RISjFaVHRjYmlBZ0lDQnlaWFIxY200Z2UyMXBibVVzSUhSb1pXbHljMzA3WEc0Z0lIMWNibjFjYmx4dVpuVnVZM1JwYjI0Z2FIVnVhMEpsWm05eVpTaDBaWE4wTENCamFHVmpheWtnZTF4dUlDQnlaWFIxY200Z2RHVnpkQzV2YkdSVGRHRnlkQ0E4SUdOb1pXTnJMbTlzWkZOMFlYSjBYRzRnSUNBZ0ppWWdLSFJsYzNRdWIyeGtVM1JoY25RZ0t5QjBaWE4wTG05c1pFeHBibVZ6S1NBOElHTm9aV05yTG05c1pGTjBZWEowTzF4dWZWeHVYRzVtZFc1amRHbHZiaUJqYkc5dVpVaDFibXNvYUhWdWF5d2diMlptYzJWMEtTQjdYRzRnSUhKbGRIVnliaUI3WEc0Z0lDQWdiMnhrVTNSaGNuUTZJR2gxYm1zdWIyeGtVM1JoY25Rc0lHOXNaRXhwYm1Wek9pQm9kVzVyTG05c1pFeHBibVZ6TEZ4dUlDQWdJRzVsZDFOMFlYSjBPaUJvZFc1ckxtNWxkMU4wWVhKMElDc2diMlptYzJWMExDQnVaWGRNYVc1bGN6b2dhSFZ1YXk1dVpYZE1hVzVsY3l4Y2JpQWdJQ0JzYVc1bGN6b2dhSFZ1YXk1c2FXNWxjMXh1SUNCOU8xeHVmVnh1WEc1bWRXNWpkR2x2YmlCdFpYSm5aVXhwYm1WektHaDFibXNzSUcxcGJtVlBabVp6WlhRc0lHMXBibVZNYVc1bGN5d2dkR2hsYVhKUFptWnpaWFFzSUhSb1pXbHlUR2x1WlhNcElIdGNiaUFnTHk4Z1ZHaHBjeUIzYVd4c0lHZGxibVZ5WVd4c2VTQnlaWE4xYkhRZ2FXNGdZU0JqYjI1bWJHbGpkR1ZrSUdoMWJtc3NJR0oxZENCMGFHVnlaU0JoY21VZ1kyRnpaWE1nZDJobGNtVWdkR2hsSUdOdmJuUmxlSFJjYmlBZ0x5OGdhWE1nZEdobElHOXViSGtnYjNabGNteGhjQ0IzYUdWeVpTQjNaU0JqWVc0Z2MzVmpZMlZ6YzJaMWJHeDVJRzFsY21kbElIUm9aU0JqYjI1MFpXNTBJR2hsY21VdVhHNGdJR3hsZENCdGFXNWxJRDBnZTI5bVpuTmxkRG9nYldsdVpVOW1abk5sZEN3Z2JHbHVaWE02SUcxcGJtVk1hVzVsY3l3Z2FXNWtaWGc2SURCOUxGeHVJQ0FnSUNBZ2RHaGxhWElnUFNCN2IyWm1jMlYwT2lCMGFHVnBjazltWm5ObGRDd2diR2x1WlhNNklIUm9aV2x5VEdsdVpYTXNJR2x1WkdWNE9pQXdmVHRjYmx4dUlDQXZMeUJJWVc1a2JHVWdZVzU1SUd4bFlXUnBibWNnWTI5dWRHVnVkRnh1SUNCcGJuTmxjblJNWldGa2FXNW5LR2gxYm1zc0lHMXBibVVzSUhSb1pXbHlLVHRjYmlBZ2FXNXpaWEowVEdWaFpHbHVaeWhvZFc1ckxDQjBhR1ZwY2l3Z2JXbHVaU2s3WEc1Y2JpQWdMeThnVG05M0lHbHVJSFJvWlNCdmRtVnliR0Z3SUdOdmJuUmxiblF1SUZOallXNGdkR2h5YjNWbmFDQmhibVFnYzJWc1pXTjBJSFJvWlNCaVpYTjBJR05vWVc1blpYTWdabkp2YlNCbFlXTm9MbHh1SUNCM2FHbHNaU0FvYldsdVpTNXBibVJsZUNBOElHMXBibVV1YkdsdVpYTXViR1Z1WjNSb0lDWW1JSFJvWldseUxtbHVaR1Y0SUR3Z2RHaGxhWEl1YkdsdVpYTXViR1Z1WjNSb0tTQjdYRzRnSUNBZ2JHVjBJRzFwYm1WRGRYSnlaVzUwSUQwZ2JXbHVaUzVzYVc1bGMxdHRhVzVsTG1sdVpHVjRYU3hjYmlBZ0lDQWdJQ0FnZEdobGFYSkRkWEp5Wlc1MElEMGdkR2hsYVhJdWJHbHVaWE5iZEdobGFYSXVhVzVrWlhoZE8xeHVYRzRnSUNBZ2FXWWdLQ2h0YVc1bFEzVnljbVZ1ZEZzd1hTQTlQVDBnSnkwbklIeDhJRzFwYm1WRGRYSnlaVzUwV3pCZElEMDlQU0FuS3ljcFhHNGdJQ0FnSUNBZ0lDWW1JQ2gwYUdWcGNrTjFjbkpsYm5SYk1GMGdQVDA5SUNjdEp5QjhmQ0IwYUdWcGNrTjFjbkpsYm5SYk1GMGdQVDA5SUNjckp5a3BJSHRjYmlBZ0lDQWdJQzh2SUVKdmRHZ2diVzlrYVdacFpXUWdMaTR1WEc0Z0lDQWdJQ0J0ZFhSMVlXeERhR0Z1WjJVb2FIVnVheXdnYldsdVpTd2dkR2hsYVhJcE8xeHVJQ0FnSUgwZ1pXeHpaU0JwWmlBb2JXbHVaVU4xY25KbGJuUmJNRjBnUFQwOUlDY3JKeUFtSmlCMGFHVnBja04xY25KbGJuUmJNRjBnUFQwOUlDY2dKeWtnZTF4dUlDQWdJQ0FnTHk4Z1RXbHVaU0JwYm5ObGNuUmxaRnh1SUNBZ0lDQWdhSFZ1YXk1c2FXNWxjeTV3ZFhOb0tDNHVMaUJqYjJ4c1pXTjBRMmhoYm1kbEtHMXBibVVwS1R0Y2JpQWdJQ0I5SUdWc2MyVWdhV1lnS0hSb1pXbHlRM1Z5Y21WdWRGc3dYU0E5UFQwZ0p5c25JQ1ltSUcxcGJtVkRkWEp5Wlc1MFd6QmRJRDA5UFNBbklDY3BJSHRjYmlBZ0lDQWdJQzh2SUZSb1pXbHljeUJwYm5ObGNuUmxaRnh1SUNBZ0lDQWdhSFZ1YXk1c2FXNWxjeTV3ZFhOb0tDNHVMaUJqYjJ4c1pXTjBRMmhoYm1kbEtIUm9aV2x5S1NrN1hHNGdJQ0FnZlNCbGJITmxJR2xtSUNodGFXNWxRM1Z5Y21WdWRGc3dYU0E5UFQwZ0p5MG5JQ1ltSUhSb1pXbHlRM1Z5Y21WdWRGc3dYU0E5UFQwZ0p5QW5LU0I3WEc0Z0lDQWdJQ0F2THlCTmFXNWxJSEpsYlc5MlpXUWdiM0lnWldScGRHVmtYRzRnSUNBZ0lDQnlaVzF2ZG1Gc0tHaDFibXNzSUcxcGJtVXNJSFJvWldseUtUdGNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tIUm9aV2x5UTNWeWNtVnVkRnN3WFNBOVBUMGdKeTBuSUNZbUlHMXBibVZEZFhKeVpXNTBXekJkSUQwOVBTQW5JQ2NwSUh0Y2JpQWdJQ0FnSUM4dklGUm9aV2x5SUhKbGJXOTJaV1FnYjNJZ1pXUnBkR1ZrWEc0Z0lDQWdJQ0J5WlcxdmRtRnNLR2gxYm1zc0lIUm9aV2x5TENCdGFXNWxMQ0IwY25WbEtUdGNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tHMXBibVZEZFhKeVpXNTBJRDA5UFNCMGFHVnBja04xY25KbGJuUXBJSHRjYmlBZ0lDQWdJQzh2SUVOdmJuUmxlSFFnYVdSbGJuUnBkSGxjYmlBZ0lDQWdJR2gxYm1zdWJHbHVaWE11Y0hWemFDaHRhVzVsUTNWeWNtVnVkQ2s3WEc0Z0lDQWdJQ0J0YVc1bExtbHVaR1Y0S3lzN1hHNGdJQ0FnSUNCMGFHVnBjaTVwYm1SbGVDc3JPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBdkx5QkRiMjUwWlhoMElHMXBjMjFoZEdOb1hHNGdJQ0FnSUNCamIyNW1iR2xqZENob2RXNXJMQ0JqYjJ4c1pXTjBRMmhoYm1kbEtHMXBibVVwTENCamIyeHNaV04wUTJoaGJtZGxLSFJvWldseUtTazdYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdMeThnVG05M0lIQjFjMmdnWVc1NWRHaHBibWNnZEdoaGRDQnRZWGtnWW1VZ2NtVnRZV2x1YVc1blhHNGdJR2x1YzJWeWRGUnlZV2xzYVc1bktHaDFibXNzSUcxcGJtVXBPMXh1SUNCcGJuTmxjblJVY21GcGJHbHVaeWhvZFc1ckxDQjBhR1ZwY2lrN1hHNWNiaUFnWTJGc1kweHBibVZEYjNWdWRDaG9kVzVyS1R0Y2JuMWNibHh1Wm5WdVkzUnBiMjRnYlhWMGRXRnNRMmhoYm1kbEtHaDFibXNzSUcxcGJtVXNJSFJvWldseUtTQjdYRzRnSUd4bGRDQnRlVU5vWVc1blpYTWdQU0JqYjJ4c1pXTjBRMmhoYm1kbEtHMXBibVVwTEZ4dUlDQWdJQ0FnZEdobGFYSkRhR0Z1WjJWeklEMGdZMjlzYkdWamRFTm9ZVzVuWlNoMGFHVnBjaWs3WEc1Y2JpQWdhV1lnS0dGc2JGSmxiVzkyWlhNb2JYbERhR0Z1WjJWektTQW1KaUJoYkd4U1pXMXZkbVZ6S0hSb1pXbHlRMmhoYm1kbGN5a3BJSHRjYmlBZ0lDQXZMeUJUY0dWamFXRnNJR05oYzJVZ1ptOXlJSEpsYlc5MlpTQmphR0Z1WjJWeklIUm9ZWFFnWVhKbElITjFjR1Z5YzJWMGN5QnZaaUJ2Ym1VZ1lXNXZkR2hsY2x4dUlDQWdJR2xtSUNoaGNuSmhlVk4wWVhKMGMxZHBkR2dvYlhsRGFHRnVaMlZ6TENCMGFHVnBja05vWVc1blpYTXBYRzRnSUNBZ0lDQWdJQ1ltSUhOcmFYQlNaVzF2ZG1WVGRYQmxjbk5sZENoMGFHVnBjaXdnYlhsRGFHRnVaMlZ6TENCdGVVTm9ZVzVuWlhNdWJHVnVaM1JvSUMwZ2RHaGxhWEpEYUdGdVoyVnpMbXhsYm1kMGFDa3BJSHRjYmlBZ0lDQWdJR2gxYm1zdWJHbHVaWE11Y0hWemFDZ3VMaTRnYlhsRGFHRnVaMlZ6S1R0Y2JpQWdJQ0FnSUhKbGRIVnlianRjYmlBZ0lDQjlJR1ZzYzJVZ2FXWWdLR0Z5Y21GNVUzUmhjblJ6VjJsMGFDaDBhR1ZwY2tOb1lXNW5aWE1zSUcxNVEyaGhibWRsY3lsY2JpQWdJQ0FnSUNBZ0ppWWdjMnRwY0ZKbGJXOTJaVk4xY0dWeWMyVjBLRzFwYm1Vc0lIUm9aV2x5UTJoaGJtZGxjeXdnZEdobGFYSkRhR0Z1WjJWekxteGxibWQwYUNBdElHMTVRMmhoYm1kbGN5NXNaVzVuZEdncEtTQjdYRzRnSUNBZ0lDQm9kVzVyTG14cGJtVnpMbkIxYzJnb0xpNHVJSFJvWldseVEyaGhibWRsY3lrN1hHNGdJQ0FnSUNCeVpYUjFjbTQ3WEc0Z0lDQWdmVnh1SUNCOUlHVnNjMlVnYVdZZ0tHRnljbUY1UlhGMVlXd29iWGxEYUdGdVoyVnpMQ0IwYUdWcGNrTm9ZVzVuWlhNcEtTQjdYRzRnSUNBZ2FIVnVheTVzYVc1bGN5NXdkWE5vS0M0dUxpQnRlVU5vWVc1blpYTXBPMXh1SUNBZ0lISmxkSFZ5Ymp0Y2JpQWdmVnh1WEc0Z0lHTnZibVpzYVdOMEtHaDFibXNzSUcxNVEyaGhibWRsY3l3Z2RHaGxhWEpEYUdGdVoyVnpLVHRjYm4xY2JseHVablZ1WTNScGIyNGdjbVZ0YjNaaGJDaG9kVzVyTENCdGFXNWxMQ0IwYUdWcGNpd2djM2RoY0NrZ2UxeHVJQ0JzWlhRZ2JYbERhR0Z1WjJWeklEMGdZMjlzYkdWamRFTm9ZVzVuWlNodGFXNWxLU3hjYmlBZ0lDQWdJSFJvWldseVEyaGhibWRsY3lBOUlHTnZiR3hsWTNSRGIyNTBaWGgwS0hSb1pXbHlMQ0J0ZVVOb1lXNW5aWE1wTzF4dUlDQnBaaUFvZEdobGFYSkRhR0Z1WjJWekxtMWxjbWRsWkNrZ2UxeHVJQ0FnSUdoMWJtc3ViR2x1WlhNdWNIVnphQ2d1TGk0Z2RHaGxhWEpEYUdGdVoyVnpMbTFsY21kbFpDazdYRzRnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdZMjl1Wm14cFkzUW9hSFZ1YXl3Z2MzZGhjQ0EvSUhSb1pXbHlRMmhoYm1kbGN5QTZJRzE1UTJoaGJtZGxjeXdnYzNkaGNDQS9JRzE1UTJoaGJtZGxjeUE2SUhSb1pXbHlRMmhoYm1kbGN5azdYRzRnSUgxY2JuMWNibHh1Wm5WdVkzUnBiMjRnWTI5dVpteHBZM1FvYUhWdWF5d2diV2x1WlN3Z2RHaGxhWElwSUh0Y2JpQWdhSFZ1YXk1amIyNW1iR2xqZENBOUlIUnlkV1U3WEc0Z0lHaDFibXN1YkdsdVpYTXVjSFZ6YUNoN1hHNGdJQ0FnWTI5dVpteHBZM1E2SUhSeWRXVXNYRzRnSUNBZ2JXbHVaVG9nYldsdVpTeGNiaUFnSUNCMGFHVnBjbk02SUhSb1pXbHlYRzRnSUgwcE8xeHVmVnh1WEc1bWRXNWpkR2x2YmlCcGJuTmxjblJNWldGa2FXNW5LR2gxYm1zc0lHbHVjMlZ5ZEN3Z2RHaGxhWElwSUh0Y2JpQWdkMmhwYkdVZ0tHbHVjMlZ5ZEM1dlptWnpaWFFnUENCMGFHVnBjaTV2Wm1aelpYUWdKaVlnYVc1elpYSjBMbWx1WkdWNElEd2dhVzV6WlhKMExteHBibVZ6TG14bGJtZDBhQ2tnZTF4dUlDQWdJR3hsZENCc2FXNWxJRDBnYVc1elpYSjBMbXhwYm1WelcybHVjMlZ5ZEM1cGJtUmxlQ3NyWFR0Y2JpQWdJQ0JvZFc1ckxteHBibVZ6TG5CMWMyZ29iR2x1WlNrN1hHNGdJQ0FnYVc1elpYSjBMbTltWm5ObGRDc3JPMXh1SUNCOVhHNTlYRzVtZFc1amRHbHZiaUJwYm5ObGNuUlVjbUZwYkdsdVp5aG9kVzVyTENCcGJuTmxjblFwSUh0Y2JpQWdkMmhwYkdVZ0tHbHVjMlZ5ZEM1cGJtUmxlQ0E4SUdsdWMyVnlkQzVzYVc1bGN5NXNaVzVuZEdncElIdGNiaUFnSUNCc1pYUWdiR2x1WlNBOUlHbHVjMlZ5ZEM1c2FXNWxjMXRwYm5ObGNuUXVhVzVrWlhncksxMDdYRzRnSUNBZ2FIVnVheTVzYVc1bGN5NXdkWE5vS0d4cGJtVXBPMXh1SUNCOVhHNTlYRzVjYm1aMWJtTjBhVzl1SUdOdmJHeGxZM1JEYUdGdVoyVW9jM1JoZEdVcElIdGNiaUFnYkdWMElISmxkQ0E5SUZ0ZExGeHVJQ0FnSUNBZ2IzQmxjbUYwYVc5dUlEMGdjM1JoZEdVdWJHbHVaWE5iYzNSaGRHVXVhVzVrWlhoZFd6QmRPMXh1SUNCM2FHbHNaU0FvYzNSaGRHVXVhVzVrWlhnZ1BDQnpkR0YwWlM1c2FXNWxjeTVzWlc1bmRHZ3BJSHRjYmlBZ0lDQnNaWFFnYkdsdVpTQTlJSE4wWVhSbExteHBibVZ6VzNOMFlYUmxMbWx1WkdWNFhUdGNibHh1SUNBZ0lDOHZJRWR5YjNWd0lHRmtaR2wwYVc5dWN5QjBhR0YwSUdGeVpTQnBiVzFsWkdsaGRHVnNlU0JoWm5SbGNpQnpkV0owY21GamRHbHZibk1nWVc1a0lIUnlaV0YwSUhSb1pXMGdZWE1nYjI1bElGd2lZWFJ2YldsalhDSWdiVzlrYVdaNUlHTm9ZVzVuWlM1Y2JpQWdJQ0JwWmlBb2IzQmxjbUYwYVc5dUlEMDlQU0FuTFNjZ0ppWWdiR2x1WlZzd1hTQTlQVDBnSnlzbktTQjdYRzRnSUNBZ0lDQnZjR1Z5WVhScGIyNGdQU0FuS3ljN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnYVdZZ0tHOXdaWEpoZEdsdmJpQTlQVDBnYkdsdVpWc3dYU2tnZTF4dUlDQWdJQ0FnY21WMExuQjFjMmdvYkdsdVpTazdYRzRnSUNBZ0lDQnpkR0YwWlM1cGJtUmxlQ3NyTzF4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQmljbVZoYXp0Y2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNCeVpYUjFjbTRnY21WME8xeHVmVnh1Wm5WdVkzUnBiMjRnWTI5c2JHVmpkRU52Ym5SbGVIUW9jM1JoZEdVc0lHMWhkR05vUTJoaGJtZGxjeWtnZTF4dUlDQnNaWFFnWTJoaGJtZGxjeUE5SUZ0ZExGeHVJQ0FnSUNBZ2JXVnlaMlZrSUQwZ1cxMHNYRzRnSUNBZ0lDQnRZWFJqYUVsdVpHVjRJRDBnTUN4Y2JpQWdJQ0FnSUdOdmJuUmxlSFJEYUdGdVoyVnpJRDBnWm1Gc2MyVXNYRzRnSUNBZ0lDQmpiMjVtYkdsamRHVmtJRDBnWm1Gc2MyVTdYRzRnSUhkb2FXeGxJQ2h0WVhSamFFbHVaR1Y0SUR3Z2JXRjBZMmhEYUdGdVoyVnpMbXhsYm1kMGFGeHVJQ0FnSUNBZ0lDQW1KaUJ6ZEdGMFpTNXBibVJsZUNBOElITjBZWFJsTG14cGJtVnpMbXhsYm1kMGFDa2dlMXh1SUNBZ0lHeGxkQ0JqYUdGdVoyVWdQU0J6ZEdGMFpTNXNhVzVsYzF0emRHRjBaUzVwYm1SbGVGMHNYRzRnSUNBZ0lDQWdJRzFoZEdOb0lEMGdiV0YwWTJoRGFHRnVaMlZ6VzIxaGRHTm9TVzVrWlhoZE8xeHVYRzRnSUNBZ0x5OGdUMjVqWlNCM1pTZDJaU0JvYVhRZ2IzVnlJR0ZrWkN3Z2RHaGxiaUIzWlNCaGNtVWdaRzl1WlZ4dUlDQWdJR2xtSUNodFlYUmphRnN3WFNBOVBUMGdKeXNuS1NCN1hHNGdJQ0FnSUNCaWNtVmhhenRjYmlBZ0lDQjlYRzVjYmlBZ0lDQmpiMjUwWlhoMFEyaGhibWRsY3lBOUlHTnZiblJsZUhSRGFHRnVaMlZ6SUh4OElHTm9ZVzVuWlZzd1hTQWhQVDBnSnlBbk8xeHVYRzRnSUNBZ2JXVnlaMlZrTG5CMWMyZ29iV0YwWTJncE8xeHVJQ0FnSUcxaGRHTm9TVzVrWlhnckt6dGNibHh1SUNBZ0lDOHZJRU52Ym5OMWJXVWdZVzU1SUdGa1pHbDBhVzl1Y3lCcGJpQjBhR1VnYjNSb1pYSWdZbXh2WTJzZ1lYTWdZU0JqYjI1bWJHbGpkQ0IwYnlCaGRIUmxiWEIwWEc0Z0lDQWdMeThnZEc4Z2NIVnNiQ0JwYmlCMGFHVWdjbVZ0WVdsdWFXNW5JR052Ym5SbGVIUWdZV1owWlhJZ2RHaHBjMXh1SUNBZ0lHbG1JQ2hqYUdGdVoyVmJNRjBnUFQwOUlDY3JKeWtnZTF4dUlDQWdJQ0FnWTI5dVpteHBZM1JsWkNBOUlIUnlkV1U3WEc1Y2JpQWdJQ0FnSUhkb2FXeGxJQ2hqYUdGdVoyVmJNRjBnUFQwOUlDY3JKeWtnZTF4dUlDQWdJQ0FnSUNCamFHRnVaMlZ6TG5CMWMyZ29ZMmhoYm1kbEtUdGNiaUFnSUNBZ0lDQWdZMmhoYm1kbElEMGdjM1JoZEdVdWJHbHVaWE5iS3l0emRHRjBaUzVwYm1SbGVGMDdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2FXWWdLRzFoZEdOb0xuTjFZbk4wY2lneEtTQTlQVDBnWTJoaGJtZGxMbk4xWW5OMGNpZ3hLU2tnZTF4dUlDQWdJQ0FnWTJoaGJtZGxjeTV3ZFhOb0tHTm9ZVzVuWlNrN1hHNGdJQ0FnSUNCemRHRjBaUzVwYm1SbGVDc3JPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCamIyNW1iR2xqZEdWa0lEMGdkSEoxWlR0Y2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNCcFppQW9LRzFoZEdOb1EyaGhibWRsYzF0dFlYUmphRWx1WkdWNFhTQjhmQ0FuSnlsYk1GMGdQVDA5SUNjckoxeHVJQ0FnSUNBZ0ppWWdZMjl1ZEdWNGRFTm9ZVzVuWlhNcElIdGNiaUFnSUNCamIyNW1iR2xqZEdWa0lEMGdkSEoxWlR0Y2JpQWdmVnh1WEc0Z0lHbG1JQ2hqYjI1bWJHbGpkR1ZrS1NCN1hHNGdJQ0FnY21WMGRYSnVJR05vWVc1blpYTTdYRzRnSUgxY2JseHVJQ0IzYUdsc1pTQW9iV0YwWTJoSmJtUmxlQ0E4SUcxaGRHTm9RMmhoYm1kbGN5NXNaVzVuZEdncElIdGNiaUFnSUNCdFpYSm5aV1F1Y0hWemFDaHRZWFJqYUVOb1lXNW5aWE5iYldGMFkyaEpibVJsZUNzclhTazdYRzRnSUgxY2JseHVJQ0J5WlhSMWNtNGdlMXh1SUNBZ0lHMWxjbWRsWkN4Y2JpQWdJQ0JqYUdGdVoyVnpYRzRnSUgwN1hHNTlYRzVjYm1aMWJtTjBhVzl1SUdGc2JGSmxiVzkyWlhNb1kyaGhibWRsY3lrZ2UxeHVJQ0J5WlhSMWNtNGdZMmhoYm1kbGN5NXlaV1IxWTJVb1puVnVZM1JwYjI0b2NISmxkaXdnWTJoaGJtZGxLU0I3WEc0Z0lDQWdjbVYwZFhKdUlIQnlaWFlnSmlZZ1kyaGhibWRsV3pCZElEMDlQU0FuTFNjN1hHNGdJSDBzSUhSeWRXVXBPMXh1ZlZ4dVpuVnVZM1JwYjI0Z2MydHBjRkpsYlc5MlpWTjFjR1Z5YzJWMEtITjBZWFJsTENCeVpXMXZkbVZEYUdGdVoyVnpMQ0JrWld4MFlTa2dlMXh1SUNCbWIzSWdLR3hsZENCcElEMGdNRHNnYVNBOElHUmxiSFJoT3lCcEt5c3BJSHRjYmlBZ0lDQnNaWFFnWTJoaGJtZGxRMjl1ZEdWdWRDQTlJSEpsYlc5MlpVTm9ZVzVuWlhOYmNtVnRiM1psUTJoaGJtZGxjeTVzWlc1bmRHZ2dMU0JrWld4MFlTQXJJR2xkTG5OMVluTjBjaWd4S1R0Y2JpQWdJQ0JwWmlBb2MzUmhkR1V1YkdsdVpYTmJjM1JoZEdVdWFXNWtaWGdnS3lCcFhTQWhQVDBnSnlBbklDc2dZMmhoYm1kbFEyOXVkR1Z1ZENrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUdaaGJITmxPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJSE4wWVhSbExtbHVaR1Y0SUNzOUlHUmxiSFJoTzF4dUlDQnlaWFIxY200Z2RISjFaVHRjYm4xY2JseHVablZ1WTNScGIyNGdZMkZzWTA5c1pFNWxkMHhwYm1WRGIzVnVkQ2hzYVc1bGN5a2dlMXh1SUNCc1pYUWdiMnhrVEdsdVpYTWdQU0F3TzF4dUlDQnNaWFFnYm1WM1RHbHVaWE1nUFNBd08xeHVYRzRnSUd4cGJtVnpMbVp2Y2tWaFkyZ29ablZ1WTNScGIyNG9iR2x1WlNrZ2UxeHVJQ0FnSUdsbUlDaDBlWEJsYjJZZ2JHbHVaU0FoUFQwZ0ozTjBjbWx1WnljcElIdGNiaUFnSUNBZ0lHeGxkQ0J0ZVVOdmRXNTBJRDBnWTJGc1kwOXNaRTVsZDB4cGJtVkRiM1Z1ZENoc2FXNWxMbTFwYm1VcE8xeHVJQ0FnSUNBZ2JHVjBJSFJvWldseVEyOTFiblFnUFNCallXeGpUMnhrVG1WM1RHbHVaVU52ZFc1MEtHeHBibVV1ZEdobGFYSnpLVHRjYmx4dUlDQWdJQ0FnYVdZZ0tHOXNaRXhwYm1WeklDRTlQU0IxYm1SbFptbHVaV1FwSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLRzE1UTI5MWJuUXViMnhrVEdsdVpYTWdQVDA5SUhSb1pXbHlRMjkxYm5RdWIyeGtUR2x1WlhNcElIdGNiaUFnSUNBZ0lDQWdJQ0J2YkdSTWFXNWxjeUFyUFNCdGVVTnZkVzUwTG05c1pFeHBibVZ6TzF4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lHOXNaRXhwYm1WeklEMGdkVzVrWldacGJtVmtPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUdsbUlDaHVaWGRNYVc1bGN5QWhQVDBnZFc1a1pXWnBibVZrS1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2h0ZVVOdmRXNTBMbTVsZDB4cGJtVnpJRDA5UFNCMGFHVnBja052ZFc1MExtNWxkMHhwYm1WektTQjdYRzRnSUNBZ0lDQWdJQ0FnYm1WM1RHbHVaWE1nS3owZ2JYbERiM1Z1ZEM1dVpYZE1hVzVsY3p0Y2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQnVaWGRNYVc1bGN5QTlJSFZ1WkdWbWFXNWxaRHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnZlZ4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQnBaaUFvYm1WM1RHbHVaWE1nSVQwOUlIVnVaR1ZtYVc1bFpDQW1KaUFvYkdsdVpWc3dYU0E5UFQwZ0p5c25JSHg4SUd4cGJtVmJNRjBnUFQwOUlDY2dKeWtwSUh0Y2JpQWdJQ0FnSUNBZ2JtVjNUR2x1WlhNckt6dGNiaUFnSUNBZ0lIMWNiaUFnSUNBZ0lHbG1JQ2h2YkdSTWFXNWxjeUFoUFQwZ2RXNWtaV1pwYm1Wa0lDWW1JQ2hzYVc1bFd6QmRJRDA5UFNBbkxTY2dmSHdnYkdsdVpWc3dYU0E5UFQwZ0p5QW5LU2tnZTF4dUlDQWdJQ0FnSUNCdmJHUk1hVzVsY3lzck8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdmU2s3WEc1Y2JpQWdjbVYwZFhKdUlIdHZiR1JNYVc1bGN5d2dibVYzVEdsdVpYTjlPMXh1ZlZ4dUlsMTlcblxuXG4vKioqLyB9KSxcbi8qIDE0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyd1c2Ugc3RyaWN0JztcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3N0cnVjdHVyZWRQYXRjaCA9IHN0cnVjdHVyZWRQYXRjaDtcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovY3JlYXRlVHdvRmlsZXNQYXRjaCA9IGNyZWF0ZVR3b0ZpbGVzUGF0Y2g7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2NyZWF0ZVBhdGNoID0gY3JlYXRlUGF0Y2g7XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fbGluZSA9IF9fd2VicGFja19yZXF1aXJlX18oNSkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2Z1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gZWxzZSB7IHJldHVybiBBcnJheS5mcm9tKGFycik7IH0gfVxuXG5cdC8qaXN0YW5idWwgaWdub3JlIGVuZCovZnVuY3Rpb24gc3RydWN0dXJlZFBhdGNoKG9sZEZpbGVOYW1lLCBuZXdGaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSB7XG5cdCAgaWYgKCFvcHRpb25zKSB7XG5cdCAgICBvcHRpb25zID0ge307XG5cdCAgfVxuXHQgIGlmICh0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAndW5kZWZpbmVkJykge1xuXHQgICAgb3B0aW9ucy5jb250ZXh0ID0gNDtcblx0ICB9XG5cblx0ICB2YXIgZGlmZiA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oMCwgX2xpbmUuZGlmZkxpbmVzKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyhvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG5cdCAgZGlmZi5wdXNoKHsgdmFsdWU6ICcnLCBsaW5lczogW10gfSk7IC8vIEFwcGVuZCBhbiBlbXB0eSB2YWx1ZSB0byBtYWtlIGNsZWFudXAgZWFzaWVyXG5cblx0ICBmdW5jdGlvbiBjb250ZXh0TGluZXMobGluZXMpIHtcblx0ICAgIHJldHVybiBsaW5lcy5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7XG5cdCAgICAgIHJldHVybiAnICcgKyBlbnRyeTtcblx0ICAgIH0pO1xuXHQgIH1cblxuXHQgIHZhciBodW5rcyA9IFtdO1xuXHQgIHZhciBvbGRSYW5nZVN0YXJ0ID0gMCxcblx0ICAgICAgbmV3UmFuZ2VTdGFydCA9IDAsXG5cdCAgICAgIGN1clJhbmdlID0gW10sXG5cdCAgICAgIG9sZExpbmUgPSAxLFxuXHQgICAgICBuZXdMaW5lID0gMTtcblxuXHQgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcCggLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9pKSB7XG5cdCAgICB2YXIgY3VycmVudCA9IGRpZmZbaV0sXG5cdCAgICAgICAgbGluZXMgPSBjdXJyZW50LmxpbmVzIHx8IGN1cnJlbnQudmFsdWUucmVwbGFjZSgvXFxuJC8sICcnKS5zcGxpdCgnXFxuJyk7XG5cdCAgICBjdXJyZW50LmxpbmVzID0gbGluZXM7XG5cblx0ICAgIGlmIChjdXJyZW50LmFkZGVkIHx8IGN1cnJlbnQucmVtb3ZlZCkge1xuXHQgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9jdXJSYW5nZTtcblxuXHQgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyAvLyBJZiB3ZSBoYXZlIHByZXZpb3VzIGNvbnRleHQsIHN0YXJ0IHdpdGggdGhhdFxuXHQgICAgICBpZiAoIW9sZFJhbmdlU3RhcnQpIHtcblx0ICAgICAgICB2YXIgcHJldiA9IGRpZmZbaSAtIDFdO1xuXHQgICAgICAgIG9sZFJhbmdlU3RhcnQgPSBvbGRMaW5lO1xuXHQgICAgICAgIG5ld1JhbmdlU3RhcnQgPSBuZXdMaW5lO1xuXG5cdCAgICAgICAgaWYgKHByZXYpIHtcblx0ICAgICAgICAgIGN1clJhbmdlID0gb3B0aW9ucy5jb250ZXh0ID4gMCA/IGNvbnRleHRMaW5lcyhwcmV2LmxpbmVzLnNsaWNlKC1vcHRpb25zLmNvbnRleHQpKSA6IFtdO1xuXHQgICAgICAgICAgb2xkUmFuZ2VTdGFydCAtPSBjdXJSYW5nZS5sZW5ndGg7XG5cdCAgICAgICAgICBuZXdSYW5nZVN0YXJ0IC09IGN1clJhbmdlLmxlbmd0aDtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblxuXHQgICAgICAvLyBPdXRwdXQgb3VyIGNoYW5nZXNcblx0ICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyhfY3VyUmFuZ2UgPSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2N1clJhbmdlKS5wdXNoLiAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovYXBwbHkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8oIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fY3VyUmFuZ2UgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8sIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fdG9Db25zdW1hYmxlQXJyYXkoIC8qaXN0YW5idWwgaWdub3JlIGVuZCovbGluZXMubWFwKGZ1bmN0aW9uIChlbnRyeSkge1xuXHQgICAgICAgIHJldHVybiAoY3VycmVudC5hZGRlZCA/ICcrJyA6ICctJykgKyBlbnRyeTtcblx0ICAgICAgfSkpKTtcblxuXHQgICAgICAvLyBUcmFjayB0aGUgdXBkYXRlZCBmaWxlIHBvc2l0aW9uXG5cdCAgICAgIGlmIChjdXJyZW50LmFkZGVkKSB7XG5cdCAgICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgb2xkTGluZSArPSBsaW5lcy5sZW5ndGg7XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIC8vIElkZW50aWNhbCBjb250ZXh0IGxpbmVzLiBUcmFjayBsaW5lIGNoYW5nZXNcblx0ICAgICAgaWYgKG9sZFJhbmdlU3RhcnQpIHtcblx0ICAgICAgICAvLyBDbG9zZSBvdXQgYW55IGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gb3V0cHV0IChvciBqb2luIG92ZXJsYXBwaW5nKVxuXHQgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPD0gb3B0aW9ucy5jb250ZXh0ICogMiAmJiBpIDwgZGlmZi5sZW5ndGggLSAyKSB7XG5cdCAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9jdXJSYW5nZTI7XG5cblx0ICAgICAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovIC8vIE92ZXJsYXBwaW5nXG5cdCAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKF9jdXJSYW5nZTIgPSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2N1clJhbmdlKS5wdXNoLiAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovYXBwbHkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8oIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fY3VyUmFuZ2UyIC8qaXN0YW5idWwgaWdub3JlIGVuZCovLCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX3RvQ29uc3VtYWJsZUFycmF5KCAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2NvbnRleHRMaW5lcyhsaW5lcykpKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciBfY3VyUmFuZ2UzO1xuXG5cdCAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyAvLyBlbmQgdGhlIHJhbmdlIGFuZCBvdXRwdXRcblx0ICAgICAgICAgIHZhciBjb250ZXh0U2l6ZSA9IE1hdGgubWluKGxpbmVzLmxlbmd0aCwgb3B0aW9ucy5jb250ZXh0KTtcblx0ICAgICAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oX2N1clJhbmdlMyA9IC8qaXN0YW5idWwgaWdub3JlIGVuZCovY3VyUmFuZ2UpLnB1c2guIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9hcHBseSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyggLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19jdXJSYW5nZTMgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8sIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fdG9Db25zdW1hYmxlQXJyYXkoIC8qaXN0YW5idWwgaWdub3JlIGVuZCovY29udGV4dExpbmVzKGxpbmVzLnNsaWNlKDAsIGNvbnRleHRTaXplKSkpKTtcblxuXHQgICAgICAgICAgdmFyIGh1bmsgPSB7XG5cdCAgICAgICAgICAgIG9sZFN0YXJ0OiBvbGRSYW5nZVN0YXJ0LFxuXHQgICAgICAgICAgICBvbGRMaW5lczogb2xkTGluZSAtIG9sZFJhbmdlU3RhcnQgKyBjb250ZXh0U2l6ZSxcblx0ICAgICAgICAgICAgbmV3U3RhcnQ6IG5ld1JhbmdlU3RhcnQsXG5cdCAgICAgICAgICAgIG5ld0xpbmVzOiBuZXdMaW5lIC0gbmV3UmFuZ2VTdGFydCArIGNvbnRleHRTaXplLFxuXHQgICAgICAgICAgICBsaW5lczogY3VyUmFuZ2Vcblx0ICAgICAgICAgIH07XG5cdCAgICAgICAgICBpZiAoaSA+PSBkaWZmLmxlbmd0aCAtIDIgJiYgbGluZXMubGVuZ3RoIDw9IG9wdGlvbnMuY29udGV4dCkge1xuXHQgICAgICAgICAgICAvLyBFT0YgaXMgaW5zaWRlIHRoaXMgaHVua1xuXHQgICAgICAgICAgICB2YXIgb2xkRU9GTmV3bGluZSA9IC9cXG4kLy50ZXN0KG9sZFN0cik7XG5cdCAgICAgICAgICAgIHZhciBuZXdFT0ZOZXdsaW5lID0gL1xcbiQvLnRlc3QobmV3U3RyKTtcblx0ICAgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA9PSAwICYmICFvbGRFT0ZOZXdsaW5lKSB7XG5cdCAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiBvbGQgaGFzIG5vIGVvbCBhbmQgbm8gdHJhaWxpbmcgY29udGV4dDsgbm8tbmwgY2FuIGVuZCB1cCBiZWZvcmUgYWRkc1xuXHQgICAgICAgICAgICAgIGN1clJhbmdlLnNwbGljZShodW5rLm9sZExpbmVzLCAwLCAnXFxcXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlJyk7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAoIW9sZEVPRk5ld2xpbmUgfHwgIW5ld0VPRk5ld2xpbmUpIHtcblx0ICAgICAgICAgICAgICBjdXJSYW5nZS5wdXNoKCdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgaHVua3MucHVzaChodW5rKTtcblxuXHQgICAgICAgICAgb2xkUmFuZ2VTdGFydCA9IDA7XG5cdCAgICAgICAgICBuZXdSYW5nZVN0YXJ0ID0gMDtcblx0ICAgICAgICAgIGN1clJhbmdlID0gW107XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIG9sZExpbmUgKz0gbGluZXMubGVuZ3RoO1xuXHQgICAgICBuZXdMaW5lICs9IGxpbmVzLmxlbmd0aDtcblx0ICAgIH1cblx0ICB9O1xuXG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaWZmLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2xvb3AoIC8qaXN0YW5idWwgaWdub3JlIGVuZCovaSk7XG5cdCAgfVxuXG5cdCAgcmV0dXJuIHtcblx0ICAgIG9sZEZpbGVOYW1lOiBvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWU6IG5ld0ZpbGVOYW1lLFxuXHQgICAgb2xkSGVhZGVyOiBvbGRIZWFkZXIsIG5ld0hlYWRlcjogbmV3SGVhZGVyLFxuXHQgICAgaHVua3M6IGh1bmtzXG5cdCAgfTtcblx0fVxuXG5cdGZ1bmN0aW9uIGNyZWF0ZVR3b0ZpbGVzUGF0Y2gob2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcblx0ICB2YXIgZGlmZiA9IHN0cnVjdHVyZWRQYXRjaChvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucyk7XG5cblx0ICB2YXIgcmV0ID0gW107XG5cdCAgaWYgKG9sZEZpbGVOYW1lID09IG5ld0ZpbGVOYW1lKSB7XG5cdCAgICByZXQucHVzaCgnSW5kZXg6ICcgKyBvbGRGaWxlTmFtZSk7XG5cdCAgfVxuXHQgIHJldC5wdXNoKCc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Jyk7XG5cdCAgcmV0LnB1c2goJy0tLSAnICsgZGlmZi5vbGRGaWxlTmFtZSArICh0eXBlb2YgZGlmZi5vbGRIZWFkZXIgPT09ICd1bmRlZmluZWQnID8gJycgOiAnXFx0JyArIGRpZmYub2xkSGVhZGVyKSk7XG5cdCAgcmV0LnB1c2goJysrKyAnICsgZGlmZi5uZXdGaWxlTmFtZSArICh0eXBlb2YgZGlmZi5uZXdIZWFkZXIgPT09ICd1bmRlZmluZWQnID8gJycgOiAnXFx0JyArIGRpZmYubmV3SGVhZGVyKSk7XG5cblx0ICBmb3IgKHZhciBpID0gMDsgaSA8IGRpZmYuaHVua3MubGVuZ3RoOyBpKyspIHtcblx0ICAgIHZhciBodW5rID0gZGlmZi5odW5rc1tpXTtcblx0ICAgIHJldC5wdXNoKCdAQCAtJyArIGh1bmsub2xkU3RhcnQgKyAnLCcgKyBodW5rLm9sZExpbmVzICsgJyArJyArIGh1bmsubmV3U3RhcnQgKyAnLCcgKyBodW5rLm5ld0xpbmVzICsgJyBAQCcpO1xuXHQgICAgcmV0LnB1c2guYXBwbHkocmV0LCBodW5rLmxpbmVzKTtcblx0ICB9XG5cblx0ICByZXR1cm4gcmV0LmpvaW4oJ1xcbicpICsgJ1xcbic7XG5cdH1cblxuXHRmdW5jdGlvbiBjcmVhdGVQYXRjaChmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSB7XG5cdCAgcmV0dXJuIGNyZWF0ZVR3b0ZpbGVzUGF0Y2goZmlsZU5hbWUsIGZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpO1xuXHR9XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OXdZWFJqYUM5amNtVmhkR1V1YW5NaVhTd2libUZ0WlhNaU9sc2ljM1J5ZFdOMGRYSmxaRkJoZEdOb0lpd2lZM0psWVhSbFZIZHZSbWxzWlhOUVlYUmphQ0lzSW1OeVpXRjBaVkJoZEdOb0lpd2liMnhrUm1sc1pVNWhiV1VpTENKdVpYZEdhV3hsVG1GdFpTSXNJbTlzWkZOMGNpSXNJbTVsZDFOMGNpSXNJbTlzWkVobFlXUmxjaUlzSW01bGQwaGxZV1JsY2lJc0ltOXdkR2x2Ym5NaUxDSmpiMjUwWlhoMElpd2laR2xtWmlJc0luQjFjMmdpTENKMllXeDFaU0lzSW14cGJtVnpJaXdpWTI5dWRHVjRkRXhwYm1Weklpd2liV0Z3SWl3aVpXNTBjbmtpTENKb2RXNXJjeUlzSW05c1pGSmhibWRsVTNSaGNuUWlMQ0p1WlhkU1lXNW5aVk4wWVhKMElpd2lZM1Z5VW1GdVoyVWlMQ0p2YkdSTWFXNWxJaXdpYm1WM1RHbHVaU0lzSW1raUxDSmpkWEp5Wlc1MElpd2ljbVZ3YkdGalpTSXNJbk53YkdsMElpd2lZV1JrWldRaUxDSnlaVzF2ZG1Wa0lpd2ljSEpsZGlJc0luTnNhV05sSWl3aWJHVnVaM1JvSWl3aVkyOXVkR1Y0ZEZOcGVtVWlMQ0pOWVhSb0lpd2liV2x1SWl3aWFIVnVheUlzSW05c1pGTjBZWEowSWl3aWIyeGtUR2x1WlhNaUxDSnVaWGRUZEdGeWRDSXNJbTVsZDB4cGJtVnpJaXdpYjJ4a1JVOUdUbVYzYkdsdVpTSXNJblJsYzNRaUxDSnVaWGRGVDBaT1pYZHNhVzVsSWl3aWMzQnNhV05sSWl3aWNtVjBJaXdpWVhCd2JIa2lMQ0pxYjJsdUlpd2labWxzWlU1aGJXVWlYU3dpYldGd2NHbHVaM01pT2lJN096dG5RMEZGWjBKQkxHVXNSMEZCUVVFc1pUdDVSRUZwUjBGRExHMUNMRWRCUVVGQkxHMUNPM2xFUVhkQ1FVTXNWeXhIUVVGQlFTeFhPenRCUVROSWFFSTdPenM3ZFVKQlJVOHNVMEZCVTBZc1pVRkJWQ3hEUVVGNVFrY3NWMEZCZWtJc1JVRkJjME5ETEZkQlFYUkRMRVZCUVcxRVF5eE5RVUZ1UkN4RlFVRXlSRU1zVFVGQk0wUXNSVUZCYlVWRExGTkJRVzVGTEVWQlFUaEZReXhUUVVFNVJTeEZRVUY1UmtNc1QwRkJla1lzUlVGQmEwYzdRVUZEZGtjc1RVRkJTU3hEUVVGRFFTeFBRVUZNTEVWQlFXTTdRVUZEV2tFc1kwRkJWU3hGUVVGV08wRkJRMFE3UVVGRFJDeE5RVUZKTEU5QlFVOUJMRkZCUVZGRExFOUJRV1lzUzBGQk1rSXNWMEZCTDBJc1JVRkJORU03UVVGRE1VTkVMRmxCUVZGRExFOUJRVklzUjBGQmEwSXNRMEZCYkVJN1FVRkRSRHM3UVVGRlJDeE5RVUZOUXl4UFFVRlBMSE5GUVVGVlRpeE5RVUZXTEVWQlFXdENReXhOUVVGc1FpeEZRVUV3UWtjc1QwRkJNVUlzUTBGQllqdEJRVU5CUlN4UFFVRkxReXhKUVVGTUxFTkJRVlVzUlVGQlEwTXNUMEZCVHl4RlFVRlNMRVZCUVZsRExFOUJRVThzUlVGQmJrSXNSVUZCVml4RlFWUjFSeXhEUVZOc1JUczdRVUZGY2tNc1YwRkJVME1zV1VGQlZDeERRVUZ6UWtRc1MwRkJkRUlzUlVGQk5rSTdRVUZETTBJc1YwRkJUMEVzVFVGQlRVVXNSMEZCVGl4RFFVRlZMRlZCUVZORExFdEJRVlFzUlVGQlowSTdRVUZCUlN4aFFVRlBMRTFCUVUxQkxFdEJRV0k3UVVGQmNVSXNTMEZCYWtRc1EwRkJVRHRCUVVORU96dEJRVVZFTEUxQlFVbERMRkZCUVZFc1JVRkJXanRCUVVOQkxFMUJRVWxETEdkQ1FVRm5RaXhEUVVGd1FqdEJRVUZCTEUxQlFYVkNReXhuUWtGQlowSXNRMEZCZGtNN1FVRkJRU3hOUVVFd1EwTXNWMEZCVnl4RlFVRnlSRHRCUVVGQkxFMUJRMGxETEZWQlFWVXNRMEZFWkR0QlFVRkJMRTFCUTJsQ1F5eFZRVUZWTEVOQlJETkNPenRCUVdoQ2RVY3NPRVZCYTBJNVJrTXNRMEZzUWpoR08wRkJiVUp5Unl4UlFVRk5ReXhWUVVGVlpDeExRVUZMWVN4RFFVRk1MRU5CUVdoQ08wRkJRVUVzVVVGRFRWWXNVVUZCVVZjc1VVRkJVVmdzUzBGQlVpeEpRVUZwUWxjc1VVRkJVVm9zUzBGQlVpeERRVUZqWVN4UFFVRmtMRU5CUVhOQ0xFdEJRWFJDTEVWQlFUWkNMRVZCUVRkQ0xFVkJRV2xEUXl4TFFVRnFReXhEUVVGMVF5eEpRVUYyUXl4RFFVUXZRanRCUVVWQlJpeFpRVUZSV0N4TFFVRlNMRWRCUVdkQ1FTeExRVUZvUWpzN1FVRkZRU3hSUVVGSlZ5eFJRVUZSUnl4TFFVRlNMRWxCUVdsQ1NDeFJRVUZSU1N4UFFVRTNRaXhGUVVGelF6dEJRVUZCT3p0QlFVRkJMRGhDUVVOd1F6dEJRVU5CTEZWQlFVa3NRMEZCUTFZc1lVRkJUQ3hGUVVGdlFqdEJRVU5zUWl4WlFVRk5WeXhQUVVGUGJrSXNTMEZCUzJFc1NVRkJTU3hEUVVGVUxFTkJRV0k3UVVGRFFVd3NkMEpCUVdkQ1J5eFBRVUZvUWp0QlFVTkJSaXgzUWtGQlowSkhMRTlCUVdoQ096dEJRVVZCTEZsQlFVbFBMRWxCUVVvc1JVRkJWVHRCUVVOU1ZDeHhRa0ZCVjFvc1VVRkJVVU1zVDBGQlVpeEhRVUZyUWl4RFFVRnNRaXhIUVVGelFrc3NZVUZCWVdVc1MwRkJTMmhDTEV0QlFVd3NRMEZCVjJsQ0xFdEJRVmdzUTBGQmFVSXNRMEZCUTNSQ0xGRkJRVkZETEU5QlFURkNMRU5CUVdJc1EwRkJkRUlzUjBGQmVVVXNSVUZCY0VZN1FVRkRRVk1zTWtKQlFXbENSU3hUUVVGVFZ5eE5RVUV4UWp0QlFVTkJXaXd5UWtGQmFVSkRMRk5CUVZOWExFMUJRVEZDTzBGQlEwUTdRVUZEUmpzN1FVRkZSRHRCUVVOQkxEWkZRVUZUY0VJc1NVRkJWQ3d3VEVGQmEwSkZMRTFCUVUxRkxFZEJRVTRzUTBGQlZTeFZRVUZUUXl4TFFVRlVMRVZCUVdkQ08wRkJRekZETEdWQlFVOHNRMEZCUTFFc1VVRkJVVWNzUzBGQlVpeEhRVUZuUWl4SFFVRm9RaXhIUVVGelFpeEhRVUYyUWl4SlFVRTRRbGdzUzBGQmNrTTdRVUZEUkN4UFFVWnBRaXhEUVVGc1FqczdRVUZKUVR0QlFVTkJMRlZCUVVsUkxGRkJRVkZITEV0QlFWb3NSVUZCYlVJN1FVRkRha0pNTEcxQ1FVRlhWQ3hOUVVGTmEwSXNUVUZCYWtJN1FVRkRSQ3hQUVVaRUxFMUJSVTg3UVVGRFRGWXNiVUpCUVZkU0xFMUJRVTFyUWl4TlFVRnFRanRCUVVORU8wRkJRMFlzUzBGNlFrUXNUVUY1UWs4N1FVRkRURHRCUVVOQkxGVkJRVWxpTEdGQlFVb3NSVUZCYlVJN1FVRkRha0k3UVVGRFFTeFpRVUZKVEN4TlFVRk5hMElzVFVGQlRpeEpRVUZuUW5aQ0xGRkJRVkZETEU5QlFWSXNSMEZCYTBJc1EwRkJiRU1zU1VGQmRVTmpMRWxCUVVsaUxFdEJRVXR4UWl4TlFVRk1MRWRCUVdNc1EwRkJOMFFzUlVGQlowVTdRVUZCUVRzN1FVRkJRU3hyUTBGRE9VUTdRVUZEUVN4clJrRkJVM0JDTEVsQlFWUXNNa3hCUVd0Q1J5eGhRVUZoUkN4TFFVRmlMRU5CUVd4Q08wRkJRMFFzVTBGSVJDeE5RVWRQTzBGQlFVRTdPMEZCUVVFc2EwTkJRMHc3UVVGRFFTeGpRVUZKYlVJc1kwRkJZME1zUzBGQlMwTXNSMEZCVEN4RFFVRlRja0lzVFVGQlRXdENMRTFCUVdZc1JVRkJkVUoyUWl4UlFVRlJReXhQUVVFdlFpeERRVUZzUWp0QlFVTkJMR3RHUVVGVFJTeEpRVUZVTERKTVFVRnJRa2NzWVVGQllVUXNUVUZCVFdsQ0xFdEJRVTRzUTBGQldTeERRVUZhTEVWQlFXVkZMRmRCUVdZc1EwRkJZaXhEUVVGc1FqczdRVUZGUVN4alFVRkpSeXhQUVVGUE8wRkJRMVJETEhOQ1FVRlZiRUlzWVVGRVJEdEJRVVZVYlVJc2MwSkJRVmRvUWl4VlFVRlZTQ3hoUVVGV0xFZEJRVEJDWXl4WFFVWTFRanRCUVVkVVRTeHpRa0ZCVlc1Q0xHRkJTRVE3UVVGSlZHOUNMSE5DUVVGWGFrSXNWVUZCVlVnc1lVRkJWaXhIUVVFd1FtRXNWMEZLTlVJN1FVRkxWRzVDTEcxQ1FVRlBUenRCUVV4RkxGZEJRVmc3UVVGUFFTeGpRVUZKUnl4TFFVRkxZaXhMUVVGTGNVSXNUVUZCVEN4SFFVRmpMRU5CUVc1Q0xFbEJRWGRDYkVJc1RVRkJUV3RDTEUxQlFVNHNTVUZCWjBKMlFpeFJRVUZSUXl4UFFVRndSQ3hGUVVFMlJEdEJRVU16UkR0QlFVTkJMR2RDUVVGSkswSXNaMEpCUVdsQ0xFMUJRVTFETEVsQlFVNHNRMEZCVjNKRExFMUJRVmdzUTBGQmNrSTdRVUZEUVN4blFrRkJTWE5ETEdkQ1FVRnBRaXhOUVVGTlJDeEpRVUZPTEVOQlFWZHdReXhOUVVGWUxFTkJRWEpDTzBGQlEwRXNaMEpCUVVsUkxFMUJRVTFyUWl4TlFVRk9MRWxCUVdkQ0xFTkJRV2hDTEVsQlFYRkNMRU5CUVVOVExHRkJRVEZDTEVWQlFYbERPMEZCUTNaRE8wRkJRMEZ3UWl4MVFrRkJVM1ZDTEUxQlFWUXNRMEZCWjBKU0xFdEJRVXRGTEZGQlFYSkNMRVZCUVN0Q0xFTkJRUzlDTEVWQlFXdERMRGhDUVVGc1F6dEJRVU5FTEdGQlNFUXNUVUZIVHl4SlFVRkpMRU5CUVVOSExHRkJRVVFzU1VGQmEwSXNRMEZCUTBVc1lVRkJka0lzUlVGQmMwTTdRVUZETTBOMFFpeDFRa0ZCVTFRc1NVRkJWQ3hEUVVGakxEaENRVUZrTzBGQlEwUTdRVUZEUmp0QlFVTkVUU3huUWtGQlRVNHNTVUZCVGl4RFFVRlhkMElzU1VGQldEczdRVUZGUVdwQ0xEQkNRVUZuUWl4RFFVRm9RanRCUVVOQlF5d3dRa0ZCWjBJc1EwRkJhRUk3UVVGRFFVTXNjVUpCUVZjc1JVRkJXRHRCUVVORU8wRkJRMFk3UVVGRFJFTXNhVUpCUVZkU0xFMUJRVTFyUWl4TlFVRnFRanRCUVVOQlZDeHBRa0ZCVjFRc1RVRkJUV3RDTEUxQlFXcENPMEZCUTBRN1FVRjJSbTlIT3p0QlFXdENka2NzVDBGQlN5eEpRVUZKVWl4SlFVRkpMRU5CUVdJc1JVRkJaMEpCTEVsQlFVbGlMRXRCUVV0eFFpeE5RVUY2UWl4RlFVRnBRMUlzUjBGQmFrTXNSVUZCYzBNN1FVRkJRU3d5UkVGQk4wSkJMRU5CUVRaQ08wRkJjMFZ5UXpzN1FVRkZSQ3hUUVVGUE8wRkJRMHh5UWl4cFFrRkJZVUVzVjBGRVVpeEZRVU54UWtNc1lVRkJZVUVzVjBGRWJFTTdRVUZGVEVjc1pVRkJWMEVzVTBGR1RpeEZRVVZwUWtNc1YwRkJWMEVzVTBGR05VSTdRVUZIVEZVc1YwRkJUMEU3UVVGSVJpeEhRVUZRTzBGQlMwUTdPMEZCUlUwc1UwRkJVMnBDTEcxQ1FVRlVMRU5CUVRaQ1JTeFhRVUUzUWl4RlFVRXdRME1zVjBGQk1VTXNSVUZCZFVSRExFMUJRWFpFTEVWQlFTdEVReXhOUVVFdlJDeEZRVUYxUlVNc1UwRkJka1VzUlVGQmEwWkRMRk5CUVd4R0xFVkJRVFpHUXl4UFFVRTNSaXhGUVVGelJ6dEJRVU16Unl4TlFVRk5SU3hQUVVGUFdDeG5Ra0ZCWjBKSExGZEJRV2hDTEVWQlFUWkNReXhYUVVFM1FpeEZRVUV3UTBNc1RVRkJNVU1zUlVGQmEwUkRMRTFCUVd4RUxFVkJRVEJFUXl4VFFVRXhSQ3hGUVVGeFJVTXNVMEZCY2tVc1JVRkJaMFpETEU5QlFXaEdMRU5CUVdJN08wRkJSVUVzVFVGQlRXOURMRTFCUVUwc1JVRkJXanRCUVVOQkxFMUJRVWt4UXl4bFFVRmxReXhYUVVGdVFpeEZRVUZuUXp0QlFVTTVRbmxETEZGQlFVbHFReXhKUVVGS0xFTkJRVk1zV1VGQldWUXNWMEZCY2tJN1FVRkRSRHRCUVVORU1FTXNUVUZCU1dwRExFbEJRVW9zUTBGQlV5eHhSVUZCVkR0QlFVTkJhVU1zVFVGQlNXcERMRWxCUVVvc1EwRkJVeXhUUVVGVFJDeExRVUZMVWl4WFFVRmtMRWxCUVRaQ0xFOUJRVTlSTEV0QlFVdEtMRk5CUVZvc1MwRkJNRUlzVjBGQk1VSXNSMEZCZDBNc1JVRkJlRU1zUjBGQk5rTXNUMEZCVDBrc1MwRkJTMG9zVTBGQmRFWXNRMEZCVkR0QlFVTkJjME1zVFVGQlNXcERMRWxCUVVvc1EwRkJVeXhUUVVGVFJDeExRVUZMVUN4WFFVRmtMRWxCUVRaQ0xFOUJRVTlQTEV0QlFVdElMRk5CUVZvc1MwRkJNRUlzVjBGQk1VSXNSMEZCZDBNc1JVRkJlRU1zUjBGQk5rTXNUMEZCVDBjc1MwRkJTMGdzVTBGQmRFWXNRMEZCVkRzN1FVRkZRU3hQUVVGTExFbEJRVWxuUWl4SlFVRkpMRU5CUVdJc1JVRkJaMEpCTEVsQlFVbGlMRXRCUVV0UExFdEJRVXdzUTBGQlYyTXNUVUZCTDBJc1JVRkJkVU5TTEVkQlFYWkRMRVZCUVRSRE8wRkJRekZETEZGQlFVMVpMRTlCUVU5NlFpeExRVUZMVHl4TFFVRk1MRU5CUVZkTkxFTkJRVmdzUTBGQllqdEJRVU5CY1VJc1VVRkJTV3BETEVsQlFVb3NRMEZEUlN4VFFVRlRkMElzUzBGQlMwTXNVVUZCWkN4SFFVRjVRaXhIUVVGNlFpeEhRVUVyUWtRc1MwRkJTMFVzVVVGQmNFTXNSMEZEUlN4SlFVUkdMRWRCUTFOR0xFdEJRVXRITEZGQlJHUXNSMEZEZVVJc1IwRkVla0lzUjBGREswSklMRXRCUVV0SkxGRkJSSEJETEVkQlJVVXNTMEZJU2p0QlFVdEJTeXhSUVVGSmFrTXNTVUZCU2l4RFFVRlRhME1zUzBGQlZDeERRVUZsUkN4SFFVRm1MRVZCUVc5Q1ZDeExRVUZMZEVJc1MwRkJla0k3UVVGRFJEczdRVUZGUkN4VFFVRlBLMElzU1VGQlNVVXNTVUZCU2l4RFFVRlRMRWxCUVZRc1NVRkJhVUlzU1VGQmVFSTdRVUZEUkRzN1FVRkZUU3hUUVVGVE4wTXNWMEZCVkN4RFFVRnhRamhETEZGQlFYSkNMRVZCUVN0Q00wTXNUVUZCTDBJc1JVRkJkVU5ETEUxQlFYWkRMRVZCUVN0RFF5eFRRVUV2UXl4RlFVRXdSRU1zVTBGQk1VUXNSVUZCY1VWRExFOUJRWEpGTEVWQlFUaEZPMEZCUTI1R0xGTkJRVTlTTEc5Q1FVRnZRaXRETEZGQlFYQkNMRVZCUVRoQ1FTeFJRVUU1UWl4RlFVRjNRek5ETEUxQlFYaERMRVZCUVdkRVF5eE5RVUZvUkN4RlFVRjNSRU1zVTBGQmVFUXNSVUZCYlVWRExGTkJRVzVGTEVWQlFUaEZReXhQUVVFNVJTeERRVUZRTzBGQlEwUWlMQ0ptYVd4bElqb2lZM0psWVhSbExtcHpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpYVcxd2IzSjBJSHRrYVdabVRHbHVaWE45SUdaeWIyMGdKeTR1TDJScFptWXZiR2x1WlNjN1hHNWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQnpkSEoxWTNSMWNtVmtVR0YwWTJnb2IyeGtSbWxzWlU1aGJXVXNJRzVsZDBacGJHVk9ZVzFsTENCdmJHUlRkSElzSUc1bGQxTjBjaXdnYjJ4a1NHVmhaR1Z5TENCdVpYZElaV0ZrWlhJc0lHOXdkR2x2Ym5NcElIdGNiaUFnYVdZZ0tDRnZjSFJwYjI1ektTQjdYRzRnSUNBZ2IzQjBhVzl1Y3lBOUlIdDlPMXh1SUNCOVhHNGdJR2xtSUNoMGVYQmxiMllnYjNCMGFXOXVjeTVqYjI1MFpYaDBJRDA5UFNBbmRXNWtaV1pwYm1Wa0p5a2dlMXh1SUNBZ0lHOXdkR2x2Ym5NdVkyOXVkR1Y0ZENBOUlEUTdYRzRnSUgxY2JseHVJQ0JqYjI1emRDQmthV1ptSUQwZ1pHbG1aa3hwYm1WektHOXNaRk4wY2l3Z2JtVjNVM1J5TENCdmNIUnBiMjV6S1R0Y2JpQWdaR2xtWmk1d2RYTm9LSHQyWVd4MVpUb2dKeWNzSUd4cGJtVnpPaUJiWFgwcE95QWdJQzh2SUVGd2NHVnVaQ0JoYmlCbGJYQjBlU0IyWVd4MVpTQjBieUJ0WVd0bElHTnNaV0Z1ZFhBZ1pXRnphV1Z5WEc1Y2JpQWdablZ1WTNScGIyNGdZMjl1ZEdWNGRFeHBibVZ6S0d4cGJtVnpLU0I3WEc0Z0lDQWdjbVYwZFhKdUlHeHBibVZ6TG0xaGNDaG1kVzVqZEdsdmJpaGxiblJ5ZVNrZ2V5QnlaWFIxY200Z0p5QW5JQ3NnWlc1MGNuazdJSDBwTzF4dUlDQjlYRzVjYmlBZ2JHVjBJR2gxYm10eklEMGdXMTA3WEc0Z0lHeGxkQ0J2YkdSU1lXNW5aVk4wWVhKMElEMGdNQ3dnYm1WM1VtRnVaMlZUZEdGeWRDQTlJREFzSUdOMWNsSmhibWRsSUQwZ1cxMHNYRzRnSUNBZ0lDQnZiR1JNYVc1bElEMGdNU3dnYm1WM1RHbHVaU0E5SURFN1hHNGdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnWkdsbVppNXNaVzVuZEdnN0lHa3JLeWtnZTF4dUlDQWdJR052Ym5OMElHTjFjbkpsYm5RZ1BTQmthV1ptVzJsZExGeHVJQ0FnSUNBZ0lDQWdJR3hwYm1WeklEMGdZM1Z5Y21WdWRDNXNhVzVsY3lCOGZDQmpkWEp5Wlc1MExuWmhiSFZsTG5KbGNHeGhZMlVvTDF4Y2JpUXZMQ0FuSnlrdWMzQnNhWFFvSjF4Y2JpY3BPMXh1SUNBZ0lHTjFjbkpsYm5RdWJHbHVaWE1nUFNCc2FXNWxjenRjYmx4dUlDQWdJR2xtSUNoamRYSnlaVzUwTG1Ga1pHVmtJSHg4SUdOMWNuSmxiblF1Y21WdGIzWmxaQ2tnZTF4dUlDQWdJQ0FnTHk4Z1NXWWdkMlVnYUdGMlpTQndjbVYyYVc5MWN5QmpiMjUwWlhoMExDQnpkR0Z5ZENCM2FYUm9JSFJvWVhSY2JpQWdJQ0FnSUdsbUlDZ2hiMnhrVW1GdVoyVlRkR0Z5ZENrZ2UxeHVJQ0FnSUNBZ0lDQmpiMjV6ZENCd2NtVjJJRDBnWkdsbVpsdHBJQzBnTVYwN1hHNGdJQ0FnSUNBZ0lHOXNaRkpoYm1kbFUzUmhjblFnUFNCdmJHUk1hVzVsTzF4dUlDQWdJQ0FnSUNCdVpYZFNZVzVuWlZOMFlYSjBJRDBnYm1WM1RHbHVaVHRjYmx4dUlDQWdJQ0FnSUNCcFppQW9jSEpsZGlrZ2UxeHVJQ0FnSUNBZ0lDQWdJR04xY2xKaGJtZGxJRDBnYjNCMGFXOXVjeTVqYjI1MFpYaDBJRDRnTUNBL0lHTnZiblJsZUhSTWFXNWxjeWh3Y21WMkxteHBibVZ6TG5Oc2FXTmxLQzF2Y0hScGIyNXpMbU52Ym5SbGVIUXBLU0E2SUZ0ZE8xeHVJQ0FnSUNBZ0lDQWdJRzlzWkZKaGJtZGxVM1JoY25RZ0xUMGdZM1Z5VW1GdVoyVXViR1Z1WjNSb08xeHVJQ0FnSUNBZ0lDQWdJRzVsZDFKaGJtZGxVM1JoY25RZ0xUMGdZM1Z5VW1GdVoyVXViR1Z1WjNSb08xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQzh2SUU5MWRIQjFkQ0J2ZFhJZ1kyaGhibWRsYzF4dUlDQWdJQ0FnWTNWeVVtRnVaMlV1Y0hWemFDZ3VMaTRnYkdsdVpYTXViV0Z3S0daMWJtTjBhVzl1S0dWdWRISjVLU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUFvWTNWeWNtVnVkQzVoWkdSbFpDQS9JQ2NySnlBNklDY3RKeWtnS3lCbGJuUnllVHRjYmlBZ0lDQWdJSDBwS1R0Y2JseHVJQ0FnSUNBZ0x5OGdWSEpoWTJzZ2RHaGxJSFZ3WkdGMFpXUWdabWxzWlNCd2IzTnBkR2x2Ymx4dUlDQWdJQ0FnYVdZZ0tHTjFjbkpsYm5RdVlXUmtaV1FwSUh0Y2JpQWdJQ0FnSUNBZ2JtVjNUR2x1WlNBclBTQnNhVzVsY3k1c1pXNW5kR2c3WEc0Z0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0J2YkdSTWFXNWxJQ3M5SUd4cGJtVnpMbXhsYm1kMGFEdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnTHk4Z1NXUmxiblJwWTJGc0lHTnZiblJsZUhRZ2JHbHVaWE11SUZSeVlXTnJJR3hwYm1VZ1kyaGhibWRsYzF4dUlDQWdJQ0FnYVdZZ0tHOXNaRkpoYm1kbFUzUmhjblFwSUh0Y2JpQWdJQ0FnSUNBZ0x5OGdRMnh2YzJVZ2IzVjBJR0Z1ZVNCamFHRnVaMlZ6SUhSb1lYUWdhR0YyWlNCaVpXVnVJRzkxZEhCMWRDQW9iM0lnYW05cGJpQnZkbVZ5YkdGd2NHbHVaeWxjYmlBZ0lDQWdJQ0FnYVdZZ0tHeHBibVZ6TG14bGJtZDBhQ0E4UFNCdmNIUnBiMjV6TG1OdmJuUmxlSFFnS2lBeUlDWW1JR2tnUENCa2FXWm1MbXhsYm1kMGFDQXRJRElwSUh0Y2JpQWdJQ0FnSUNBZ0lDQXZMeUJQZG1WeWJHRndjR2x1WjF4dUlDQWdJQ0FnSUNBZ0lHTjFjbEpoYm1kbExuQjFjMmdvTGk0dUlHTnZiblJsZUhSTWFXNWxjeWhzYVc1bGN5a3BPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUM4dklHVnVaQ0IwYUdVZ2NtRnVaMlVnWVc1a0lHOTFkSEIxZEZ4dUlDQWdJQ0FnSUNBZ0lHeGxkQ0JqYjI1MFpYaDBVMmw2WlNBOUlFMWhkR2d1YldsdUtHeHBibVZ6TG14bGJtZDBhQ3dnYjNCMGFXOXVjeTVqYjI1MFpYaDBLVHRjYmlBZ0lDQWdJQ0FnSUNCamRYSlNZVzVuWlM1d2RYTm9LQzR1TGlCamIyNTBaWGgwVEdsdVpYTW9iR2x1WlhNdWMyeHBZMlVvTUN3Z1kyOXVkR1Y0ZEZOcGVtVXBLU2s3WEc1Y2JpQWdJQ0FnSUNBZ0lDQnNaWFFnYUhWdWF5QTlJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHOXNaRk4wWVhKME9pQnZiR1JTWVc1blpWTjBZWEowTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdiMnhrVEdsdVpYTTZJQ2h2YkdSTWFXNWxJQzBnYjJ4a1VtRnVaMlZUZEdGeWRDQXJJR052Ym5SbGVIUlRhWHBsS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJRzVsZDFOMFlYSjBPaUJ1WlhkU1lXNW5aVk4wWVhKMExGeHVJQ0FnSUNBZ0lDQWdJQ0FnYm1WM1RHbHVaWE02SUNodVpYZE1hVzVsSUMwZ2JtVjNVbUZ1WjJWVGRHRnlkQ0FySUdOdmJuUmxlSFJUYVhwbEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUd4cGJtVnpPaUJqZFhKU1lXNW5aVnh1SUNBZ0lDQWdJQ0FnSUgwN1hHNGdJQ0FnSUNBZ0lDQWdhV1lnS0drZ1BqMGdaR2xtWmk1c1pXNW5kR2dnTFNBeUlDWW1JR3hwYm1WekxteGxibWQwYUNBOFBTQnZjSFJwYjI1ekxtTnZiblJsZUhRcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklFVlBSaUJwY3lCcGJuTnBaR1VnZEdocGN5Qm9kVzVyWEc0Z0lDQWdJQ0FnSUNBZ0lDQnNaWFFnYjJ4a1JVOUdUbVYzYkdsdVpTQTlJQ2d2WEZ4dUpDOHVkR1Z6ZENodmJHUlRkSElwS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJR3hsZENCdVpYZEZUMFpPWlhkc2FXNWxJRDBnS0M5Y1hHNGtMeTUwWlhOMEtHNWxkMU4wY2lrcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHeHBibVZ6TG14bGJtZDBhQ0E5UFNBd0lDWW1JQ0Z2YkdSRlQwWk9aWGRzYVc1bEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJSE53WldOcFlXd2dZMkZ6WlRvZ2IyeGtJR2hoY3lCdWJ5QmxiMndnWVc1a0lHNXZJSFJ5WVdsc2FXNW5JR052Ym5SbGVIUTdJRzV2TFc1c0lHTmhiaUJsYm1RZ2RYQWdZbVZtYjNKbElHRmtaSE5jYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdZM1Z5VW1GdVoyVXVjM0JzYVdObEtHaDFibXN1YjJ4a1RHbHVaWE1zSURBc0lDZGNYRnhjSUU1dklHNWxkMnhwYm1VZ1lYUWdaVzVrSUc5bUlHWnBiR1VuS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQnBaaUFvSVc5c1pFVlBSazVsZDJ4cGJtVWdmSHdnSVc1bGQwVlBSazVsZDJ4cGJtVXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdZM1Z5VW1GdVoyVXVjSFZ6YUNnblhGeGNYQ0JPYnlCdVpYZHNhVzVsSUdGMElHVnVaQ0J2WmlCbWFXeGxKeWs3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lHaDFibXR6TG5CMWMyZ29hSFZ1YXlrN1hHNWNiaUFnSUNBZ0lDQWdJQ0J2YkdSU1lXNW5aVk4wWVhKMElEMGdNRHRjYmlBZ0lDQWdJQ0FnSUNCdVpYZFNZVzVuWlZOMFlYSjBJRDBnTUR0Y2JpQWdJQ0FnSUNBZ0lDQmpkWEpTWVc1blpTQTlJRnRkTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCdmJHUk1hVzVsSUNzOUlHeHBibVZ6TG14bGJtZDBhRHRjYmlBZ0lDQWdJRzVsZDB4cGJtVWdLejBnYkdsdVpYTXViR1Z1WjNSb08xeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lISmxkSFZ5YmlCN1hHNGdJQ0FnYjJ4a1JtbHNaVTVoYldVNklHOXNaRVpwYkdWT1lXMWxMQ0J1WlhkR2FXeGxUbUZ0WlRvZ2JtVjNSbWxzWlU1aGJXVXNYRzRnSUNBZ2IyeGtTR1ZoWkdWeU9pQnZiR1JJWldGa1pYSXNJRzVsZDBobFlXUmxjam9nYm1WM1NHVmhaR1Z5TEZ4dUlDQWdJR2gxYm10ek9pQm9kVzVyYzF4dUlDQjlPMXh1ZlZ4dVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1kzSmxZWFJsVkhkdlJtbHNaWE5RWVhSamFDaHZiR1JHYVd4bFRtRnRaU3dnYm1WM1JtbHNaVTVoYldVc0lHOXNaRk4wY2l3Z2JtVjNVM1J5TENCdmJHUklaV0ZrWlhJc0lHNWxkMGhsWVdSbGNpd2diM0IwYVc5dWN5a2dlMXh1SUNCamIyNXpkQ0JrYVdabUlEMGdjM1J5ZFdOMGRYSmxaRkJoZEdOb0tHOXNaRVpwYkdWT1lXMWxMQ0J1WlhkR2FXeGxUbUZ0WlN3Z2IyeGtVM1J5TENCdVpYZFRkSElzSUc5c1pFaGxZV1JsY2l3Z2JtVjNTR1ZoWkdWeUxDQnZjSFJwYjI1ektUdGNibHh1SUNCamIyNXpkQ0J5WlhRZ1BTQmJYVHRjYmlBZ2FXWWdLRzlzWkVacGJHVk9ZVzFsSUQwOUlHNWxkMFpwYkdWT1lXMWxLU0I3WEc0Z0lDQWdjbVYwTG5CMWMyZ29KMGx1WkdWNE9pQW5JQ3NnYjJ4a1JtbHNaVTVoYldVcE8xeHVJQ0I5WEc0Z0lISmxkQzV3ZFhOb0tDYzlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5SnlrN1hHNGdJSEpsZEM1d2RYTm9LQ2N0TFMwZ0p5QXJJR1JwWm1ZdWIyeGtSbWxzWlU1aGJXVWdLeUFvZEhsd1pXOW1JR1JwWm1ZdWIyeGtTR1ZoWkdWeUlEMDlQU0FuZFc1a1pXWnBibVZrSnlBL0lDY25JRG9nSjF4Y2RDY2dLeUJrYVdabUxtOXNaRWhsWVdSbGNpa3BPMXh1SUNCeVpYUXVjSFZ6YUNnbkt5c3JJQ2NnS3lCa2FXWm1MbTVsZDBacGJHVk9ZVzFsSUNzZ0tIUjVjR1Z2WmlCa2FXWm1MbTVsZDBobFlXUmxjaUE5UFQwZ0ozVnVaR1ZtYVc1bFpDY2dQeUFuSnlBNklDZGNYSFFuSUNzZ1pHbG1aaTV1WlhkSVpXRmtaWElwS1R0Y2JseHVJQ0JtYjNJZ0tHeGxkQ0JwSUQwZ01Ec2dhU0E4SUdScFptWXVhSFZ1YTNNdWJHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQmpiMjV6ZENCb2RXNXJJRDBnWkdsbVppNW9kVzVyYzF0cFhUdGNiaUFnSUNCeVpYUXVjSFZ6YUNoY2JpQWdJQ0FnSUNkQVFDQXRKeUFySUdoMWJtc3ViMnhrVTNSaGNuUWdLeUFuTENjZ0t5Qm9kVzVyTG05c1pFeHBibVZ6WEc0Z0lDQWdJQ0FySUNjZ0t5Y2dLeUJvZFc1ckxtNWxkMU4wWVhKMElDc2dKeXduSUNzZ2FIVnVheTV1WlhkTWFXNWxjMXh1SUNBZ0lDQWdLeUFuSUVCQUoxeHVJQ0FnSUNrN1hHNGdJQ0FnY21WMExuQjFjMmd1WVhCd2JIa29jbVYwTENCb2RXNXJMbXhwYm1WektUdGNiaUFnZlZ4dVhHNGdJSEpsZEhWeWJpQnlaWFF1YW05cGJpZ25YRnh1SnlrZ0t5QW5YRnh1Snp0Y2JuMWNibHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR055WldGMFpWQmhkR05vS0dacGJHVk9ZVzFsTENCdmJHUlRkSElzSUc1bGQxTjBjaXdnYjJ4a1NHVmhaR1Z5TENCdVpYZElaV0ZrWlhJc0lHOXdkR2x2Ym5NcElIdGNiaUFnY21WMGRYSnVJR055WldGMFpWUjNiMFpwYkdWelVHRjBZMmdvWm1sc1pVNWhiV1VzSUdacGJHVk9ZVzFsTENCdmJHUlRkSElzSUc1bGQxTjBjaXdnYjJ4a1NHVmhaR1Z5TENCdVpYZElaV0ZrWlhJc0lHOXdkR2x2Ym5NcE8xeHVmVnh1SWwxOVxuXG5cbi8qKiovIH0pLFxuLyogMTUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXCJ1c2Ugc3RyaWN0XCI7XG5cblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9hcnJheUVxdWFsID0gYXJyYXlFcXVhbDtcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovYXJyYXlTdGFydHNXaXRoID0gYXJyYXlTdGFydHNXaXRoO1xuXHRmdW5jdGlvbiBhcnJheUVxdWFsKGEsIGIpIHtcblx0ICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG5cdCAgICByZXR1cm4gZmFsc2U7XG5cdCAgfVxuXG5cdCAgcmV0dXJuIGFycmF5U3RhcnRzV2l0aChhLCBiKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGFycmF5U3RhcnRzV2l0aChhcnJheSwgc3RhcnQpIHtcblx0ICBpZiAoc3RhcnQubGVuZ3RoID4gYXJyYXkubGVuZ3RoKSB7XG5cdCAgICByZXR1cm4gZmFsc2U7XG5cdCAgfVxuXG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGFydC5sZW5ndGg7IGkrKykge1xuXHQgICAgaWYgKHN0YXJ0W2ldICE9PSBhcnJheVtpXSkge1xuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgcmV0dXJuIHRydWU7XG5cdH1cblx0Ly8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5MWRHbHNMMkZ5Y21GNUxtcHpJbDBzSW01aGJXVnpJanBiSW1GeWNtRjVSWEYxWVd3aUxDSmhjbkpoZVZOMFlYSjBjMWRwZEdnaUxDSmhJaXdpWWlJc0lteGxibWQwYUNJc0ltRnljbUY1SWl3aWMzUmhjblFpTENKcElsMHNJbTFoY0hCcGJtZHpJam9pT3pzN1owTkJRV2RDUVN4VkxFZEJRVUZCTEZVN2VVUkJVVUZETEdVc1IwRkJRVUVzWlR0QlFWSlVMRk5CUVZORUxGVkJRVlFzUTBGQmIwSkZMRU5CUVhCQ0xFVkJRWFZDUXl4RFFVRjJRaXhGUVVFd1FqdEJRVU12UWl4TlFVRkpSQ3hGUVVGRlJTeE5RVUZHTEV0QlFXRkVMRVZCUVVWRExFMUJRVzVDTEVWQlFUSkNPMEZCUTNwQ0xGZEJRVThzUzBGQlVEdEJRVU5FT3p0QlFVVkVMRk5CUVU5SUxHZENRVUZuUWtNc1EwRkJhRUlzUlVGQmJVSkRMRU5CUVc1Q0xFTkJRVkE3UVVGRFJEczdRVUZGVFN4VFFVRlRSaXhsUVVGVUxFTkJRWGxDU1N4TFFVRjZRaXhGUVVGblEwTXNTMEZCYUVNc1JVRkJkVU03UVVGRE5VTXNUVUZCU1VFc1RVRkJUVVlzVFVGQlRpeEhRVUZsUXl4TlFVRk5SQ3hOUVVGNlFpeEZRVUZwUXp0QlFVTXZRaXhYUVVGUExFdEJRVkE3UVVGRFJEczdRVUZGUkN4UFFVRkxMRWxCUVVsSExFbEJRVWtzUTBGQllpeEZRVUZuUWtFc1NVRkJTVVFzVFVGQlRVWXNUVUZCTVVJc1JVRkJhME5ITEVkQlFXeERMRVZCUVhWRE8wRkJRM0pETEZGQlFVbEVMRTFCUVUxRExFTkJRVTRzVFVGQllVWXNUVUZCVFVVc1EwRkJUaXhEUVVGcVFpeEZRVUV5UWp0QlFVTjZRaXhoUVVGUExFdEJRVkE3UVVGRFJEdEJRVU5HT3p0QlFVVkVMRk5CUVU4c1NVRkJVRHRCUVVORUlpd2labWxzWlNJNkltRnljbUY1TG1weklpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2laWGh3YjNKMElHWjFibU4wYVc5dUlHRnljbUY1UlhGMVlXd29ZU3dnWWlrZ2UxeHVJQ0JwWmlBb1lTNXNaVzVuZEdnZ0lUMDlJR0l1YkdWdVozUm9LU0I3WEc0Z0lDQWdjbVYwZFhKdUlHWmhiSE5sTzF4dUlDQjlYRzVjYmlBZ2NtVjBkWEp1SUdGeWNtRjVVM1JoY25SelYybDBhQ2hoTENCaUtUdGNibjFjYmx4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUdGeWNtRjVVM1JoY25SelYybDBhQ2hoY25KaGVTd2djM1JoY25RcElIdGNiaUFnYVdZZ0tITjBZWEowTG14bGJtZDBhQ0ErSUdGeWNtRjVMbXhsYm1kMGFDa2dlMXh1SUNBZ0lISmxkSFZ5YmlCbVlXeHpaVHRjYmlBZ2ZWeHVYRzRnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z2MzUmhjblF1YkdWdVozUm9PeUJwS3lzcElIdGNiaUFnSUNCcFppQW9jM1JoY25SYmFWMGdJVDA5SUdGeWNtRjVXMmxkS1NCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnWm1Gc2MyVTdYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdjbVYwZFhKdUlIUnlkV1U3WEc1OVhHNGlYWDA9XG5cblxuLyoqKi8gfSksXG4vKiAxNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cInVzZSBzdHJpY3RcIjtcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2NvbnZlcnRDaGFuZ2VzVG9ETVAgPSBjb252ZXJ0Q2hhbmdlc1RvRE1QO1xuXHQvLyBTZWU6IGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGUtZGlmZi1tYXRjaC1wYXRjaC93aWtpL0FQSVxuXHRmdW5jdGlvbiBjb252ZXJ0Q2hhbmdlc1RvRE1QKGNoYW5nZXMpIHtcblx0ICB2YXIgcmV0ID0gW10sXG5cdCAgICAgIGNoYW5nZSA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92b2lkIDAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8sXG5cdCAgICAgIG9wZXJhdGlvbiA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92b2lkIDAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICBjaGFuZ2UgPSBjaGFuZ2VzW2ldO1xuXHQgICAgaWYgKGNoYW5nZS5hZGRlZCkge1xuXHQgICAgICBvcGVyYXRpb24gPSAxO1xuXHQgICAgfSBlbHNlIGlmIChjaGFuZ2UucmVtb3ZlZCkge1xuXHQgICAgICBvcGVyYXRpb24gPSAtMTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIG9wZXJhdGlvbiA9IDA7XG5cdCAgICB9XG5cblx0ICAgIHJldC5wdXNoKFtvcGVyYXRpb24sIGNoYW5nZS52YWx1ZV0pO1xuXHQgIH1cblx0ICByZXR1cm4gcmV0O1xuXHR9XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OWpiMjUyWlhKMEwyUnRjQzVxY3lKZExDSnVZVzFsY3lJNld5SmpiMjUyWlhKMFEyaGhibWRsYzFSdlJFMVFJaXdpWTJoaGJtZGxjeUlzSW5KbGRDSXNJbU5vWVc1blpTSXNJbTl3WlhKaGRHbHZiaUlzSW1raUxDSnNaVzVuZEdnaUxDSmhaR1JsWkNJc0luSmxiVzkyWldRaUxDSndkWE5vSWl3aWRtRnNkV1VpWFN3aWJXRndjR2x1WjNNaU9pSTdPenRuUTBGRFowSkJMRzFDTEVkQlFVRkJMRzFDTzBGQlJHaENPMEZCUTA4c1UwRkJVMEVzYlVKQlFWUXNRMEZCTmtKRExFOUJRVGRDTEVWQlFYTkRPMEZCUXpORExFMUJRVWxETEUxQlFVMHNSVUZCVmp0QlFVRkJMRTFCUTBsRExIZERRVVJLTzBGQlFVRXNUVUZGU1VNc01rTkJSa283UVVGSFFTeFBRVUZMTEVsQlFVbERMRWxCUVVrc1EwRkJZaXhGUVVGblFrRXNTVUZCU1Vvc1VVRkJVVXNzVFVGQk5VSXNSVUZCYjBORUxFZEJRWEJETEVWQlFYbERPMEZCUTNaRFJpeGhRVUZUUml4UlFVRlJTU3hEUVVGU0xFTkJRVlE3UVVGRFFTeFJRVUZKUml4UFFVRlBTU3hMUVVGWUxFVkJRV3RDTzBGQlEyaENTQ3hyUWtGQldTeERRVUZhTzBGQlEwUXNTMEZHUkN4TlFVVlBMRWxCUVVsRUxFOUJRVTlMTEU5QlFWZ3NSVUZCYjBJN1FVRkRla0pLTEd0Q1FVRlpMRU5CUVVNc1EwRkJZanRCUVVORUxFdEJSazBzVFVGRlFUdEJRVU5NUVN4clFrRkJXU3hEUVVGYU8wRkJRMFE3TzBGQlJVUkdMRkZCUVVsUExFbEJRVW9zUTBGQlV5eERRVUZEVEN4VFFVRkVMRVZCUVZsRUxFOUJRVTlQTEV0QlFXNUNMRU5CUVZRN1FVRkRSRHRCUVVORUxGTkJRVTlTTEVkQlFWQTdRVUZEUkNJc0ltWnBiR1VpT2lKa2JYQXVhbk1pTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lJdkx5QlRaV1U2SUdoMGRIQTZMeTlqYjJSbExtZHZiMmRzWlM1amIyMHZjQzluYjI5bmJHVXRaR2xtWmkxdFlYUmphQzF3WVhSamFDOTNhV3RwTDBGUVNWeHVaWGh3YjNKMElHWjFibU4wYVc5dUlHTnZiblpsY25SRGFHRnVaMlZ6Vkc5RVRWQW9ZMmhoYm1kbGN5a2dlMXh1SUNCc1pYUWdjbVYwSUQwZ1cxMHNYRzRnSUNBZ0lDQmphR0Z1WjJVc1hHNGdJQ0FnSUNCdmNHVnlZWFJwYjI0N1hHNGdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnWTJoaGJtZGxjeTVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVJQ0FnSUdOb1lXNW5aU0E5SUdOb1lXNW5aWE5iYVYwN1hHNGdJQ0FnYVdZZ0tHTm9ZVzVuWlM1aFpHUmxaQ2tnZTF4dUlDQWdJQ0FnYjNCbGNtRjBhVzl1SUQwZ01UdGNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tHTm9ZVzVuWlM1eVpXMXZkbVZrS1NCN1hHNGdJQ0FnSUNCdmNHVnlZWFJwYjI0Z1BTQXRNVHRjYmlBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ2IzQmxjbUYwYVc5dUlEMGdNRHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQnlaWFF1Y0hWemFDaGJiM0JsY21GMGFXOXVMQ0JqYUdGdVoyVXVkbUZzZFdWZEtUdGNiaUFnZlZ4dUlDQnlaWFIxY200Z2NtVjBPMXh1ZlZ4dUlsMTlcblxuXG4vKioqLyB9KSxcbi8qIDE3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyd1c2Ugc3RyaWN0JztcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2NvbnZlcnRDaGFuZ2VzVG9YTUwgPSBjb252ZXJ0Q2hhbmdlc1RvWE1MO1xuXHRmdW5jdGlvbiBjb252ZXJ0Q2hhbmdlc1RvWE1MKGNoYW5nZXMpIHtcblx0ICB2YXIgcmV0ID0gW107XG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICB2YXIgY2hhbmdlID0gY2hhbmdlc1tpXTtcblx0ICAgIGlmIChjaGFuZ2UuYWRkZWQpIHtcblx0ICAgICAgcmV0LnB1c2goJzxpbnM+Jyk7XG5cdCAgICB9IGVsc2UgaWYgKGNoYW5nZS5yZW1vdmVkKSB7XG5cdCAgICAgIHJldC5wdXNoKCc8ZGVsPicpO1xuXHQgICAgfVxuXG5cdCAgICByZXQucHVzaChlc2NhcGVIVE1MKGNoYW5nZS52YWx1ZSkpO1xuXG5cdCAgICBpZiAoY2hhbmdlLmFkZGVkKSB7XG5cdCAgICAgIHJldC5wdXNoKCc8L2lucz4nKTtcblx0ICAgIH0gZWxzZSBpZiAoY2hhbmdlLnJlbW92ZWQpIHtcblx0ICAgICAgcmV0LnB1c2goJzwvZGVsPicpO1xuXHQgICAgfVxuXHQgIH1cblx0ICByZXR1cm4gcmV0LmpvaW4oJycpO1xuXHR9XG5cblx0ZnVuY3Rpb24gZXNjYXBlSFRNTChzKSB7XG5cdCAgdmFyIG4gPSBzO1xuXHQgIG4gPSBuLnJlcGxhY2UoLyYvZywgJyZhbXA7Jyk7XG5cdCAgbiA9IG4ucmVwbGFjZSgvPC9nLCAnJmx0OycpO1xuXHQgIG4gPSBuLnJlcGxhY2UoLz4vZywgJyZndDsnKTtcblx0ICBuID0gbi5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7Jyk7XG5cblx0ICByZXR1cm4gbjtcblx0fVxuXHQvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTlqYjI1MlpYSjBMM2h0YkM1cWN5SmRMQ0p1WVcxbGN5STZXeUpqYjI1MlpYSjBRMmhoYm1kbGMxUnZXRTFNSWl3aVkyaGhibWRsY3lJc0luSmxkQ0lzSW1raUxDSnNaVzVuZEdnaUxDSmphR0Z1WjJVaUxDSmhaR1JsWkNJc0luQjFjMmdpTENKeVpXMXZkbVZrSWl3aVpYTmpZWEJsU0ZSTlRDSXNJblpoYkhWbElpd2lhbTlwYmlJc0luTWlMQ0p1SWl3aWNtVndiR0ZqWlNKZExDSnRZWEJ3YVc1bmN5STZJanM3TzJkRFFVRm5Ra0VzYlVJc1IwRkJRVUVzYlVJN1FVRkJWQ3hUUVVGVFFTeHRRa0ZCVkN4RFFVRTJRa01zVDBGQk4wSXNSVUZCYzBNN1FVRkRNME1zVFVGQlNVTXNUVUZCVFN4RlFVRldPMEZCUTBFc1QwRkJTeXhKUVVGSlF5eEpRVUZKTEVOQlFXSXNSVUZCWjBKQkxFbEJRVWxHTEZGQlFWRkhMRTFCUVRWQ0xFVkJRVzlEUkN4SFFVRndReXhGUVVGNVF6dEJRVU4yUXl4UlFVRkpSU3hUUVVGVFNpeFJRVUZSUlN4RFFVRlNMRU5CUVdJN1FVRkRRU3hSUVVGSlJTeFBRVUZQUXl4TFFVRllMRVZCUVd0Q08wRkJRMmhDU2l4VlFVRkpTeXhKUVVGS0xFTkJRVk1zVDBGQlZEdEJRVU5FTEV0QlJrUXNUVUZGVHl4SlFVRkpSaXhQUVVGUFJ5eFBRVUZZTEVWQlFXOUNPMEZCUTNwQ1RpeFZRVUZKU3l4SlFVRktMRU5CUVZNc1QwRkJWRHRCUVVORU96dEJRVVZFVEN4UlFVRkpTeXhKUVVGS0xFTkJRVk5GTEZkQlFWZEtMRTlCUVU5TExFdEJRV3hDTEVOQlFWUTdPMEZCUlVFc1VVRkJTVXdzVDBGQlQwTXNTMEZCV0N4RlFVRnJRanRCUVVOb1Frb3NWVUZCU1Vzc1NVRkJTaXhEUVVGVExGRkJRVlE3UVVGRFJDeExRVVpFTEUxQlJVOHNTVUZCU1VZc1QwRkJUMGNzVDBGQldDeEZRVUZ2UWp0QlFVTjZRazRzVlVGQlNVc3NTVUZCU2l4RFFVRlRMRkZCUVZRN1FVRkRSRHRCUVVOR08wRkJRMFFzVTBGQlQwd3NTVUZCU1ZNc1NVRkJTaXhEUVVGVExFVkJRVlFzUTBGQlVEdEJRVU5FT3p0QlFVVkVMRk5CUVZOR0xGVkJRVlFzUTBGQmIwSkhMRU5CUVhCQ0xFVkJRWFZDTzBGQlEzSkNMRTFCUVVsRExFbEJRVWxFTEVOQlFWSTdRVUZEUVVNc1RVRkJTVUVzUlVGQlJVTXNUMEZCUml4RFFVRlZMRWxCUVZZc1JVRkJaMElzVDBGQmFFSXNRMEZCU2p0QlFVTkJSQ3hOUVVGSlFTeEZRVUZGUXl4UFFVRkdMRU5CUVZVc1NVRkJWaXhGUVVGblFpeE5RVUZvUWl4RFFVRktPMEZCUTBGRUxFMUJRVWxCTEVWQlFVVkRMRTlCUVVZc1EwRkJWU3hKUVVGV0xFVkJRV2RDTEUxQlFXaENMRU5CUVVvN1FVRkRRVVFzVFVGQlNVRXNSVUZCUlVNc1QwRkJSaXhEUVVGVkxFbEJRVllzUlVGQlowSXNVVUZCYUVJc1EwRkJTanM3UVVGRlFTeFRRVUZQUkN4RFFVRlFPMEZCUTBRaUxDSm1hV3hsSWpvaWVHMXNMbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaVpYaHdiM0owSUdaMWJtTjBhVzl1SUdOdmJuWmxjblJEYUdGdVoyVnpWRzlZVFV3b1kyaGhibWRsY3lrZ2UxeHVJQ0JzWlhRZ2NtVjBJRDBnVzEwN1hHNGdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnWTJoaGJtZGxjeTVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVJQ0FnSUd4bGRDQmphR0Z1WjJVZ1BTQmphR0Z1WjJWelcybGRPMXh1SUNBZ0lHbG1JQ2hqYUdGdVoyVXVZV1JrWldRcElIdGNiaUFnSUNBZ0lISmxkQzV3ZFhOb0tDYzhhVzV6UGljcE8xeHVJQ0FnSUgwZ1pXeHpaU0JwWmlBb1kyaGhibWRsTG5KbGJXOTJaV1FwSUh0Y2JpQWdJQ0FnSUhKbGRDNXdkWE5vS0NjOFpHVnNQaWNwTzF4dUlDQWdJSDFjYmx4dUlDQWdJSEpsZEM1d2RYTm9LR1Z6WTJGd1pVaFVUVXdvWTJoaGJtZGxMblpoYkhWbEtTazdYRzVjYmlBZ0lDQnBaaUFvWTJoaGJtZGxMbUZrWkdWa0tTQjdYRzRnSUNBZ0lDQnlaWFF1Y0hWemFDZ25QQzlwYm5NK0p5azdYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDaGphR0Z1WjJVdWNtVnRiM1psWkNrZ2UxeHVJQ0FnSUNBZ2NtVjBMbkIxYzJnb0p6d3ZaR1ZzUGljcE8xeHVJQ0FnSUgxY2JpQWdmVnh1SUNCeVpYUjFjbTRnY21WMExtcHZhVzRvSnljcE8xeHVmVnh1WEc1bWRXNWpkR2x2YmlCbGMyTmhjR1ZJVkUxTUtITXBJSHRjYmlBZ2JHVjBJRzRnUFNCek8xeHVJQ0J1SUQwZ2JpNXlaWEJzWVdObEtDOG1MMmNzSUNjbVlXMXdPeWNwTzF4dUlDQnVJRDBnYmk1eVpYQnNZV05sS0M4OEwyY3NJQ2NtYkhRN0p5azdYRzRnSUc0Z1BTQnVMbkpsY0d4aFkyVW9MejR2Wnl3Z0p5Wm5kRHNuS1R0Y2JpQWdiaUE5SUc0dWNtVndiR0ZqWlNndlhDSXZaeXdnSnlaeGRXOTBPeWNwTzF4dVhHNGdJSEpsZEhWeWJpQnVPMXh1ZlZ4dUlsMTlcblxuXG4vKioqLyB9KVxuLyoqKioqKi8gXSlcbn0pO1xuO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2RpZmYvZGlzdC9kaWZmLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9kaWZmL2Rpc3QvZGlmZi5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiKGZ1bmN0aW9uIChnbG9iYWwsIHVuZGVmaW5lZCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgaWYgKGdsb2JhbC5zZXRJbW1lZGlhdGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBuZXh0SGFuZGxlID0gMTsgLy8gU3BlYyBzYXlzIGdyZWF0ZXIgdGhhbiB6ZXJvXG4gICAgdmFyIHRhc2tzQnlIYW5kbGUgPSB7fTtcbiAgICB2YXIgY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgdmFyIGRvYyA9IGdsb2JhbC5kb2N1bWVudDtcbiAgICB2YXIgcmVnaXN0ZXJJbW1lZGlhdGU7XG5cbiAgICBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoY2FsbGJhY2spIHtcbiAgICAgIC8vIENhbGxiYWNrIGNhbiBlaXRoZXIgYmUgYSBmdW5jdGlvbiBvciBhIHN0cmluZ1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNhbGxiYWNrID0gbmV3IEZ1bmN0aW9uKFwiXCIgKyBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgICAvLyBDb3B5IGZ1bmN0aW9uIGFyZ3VtZW50c1xuICAgICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMV07XG4gICAgICB9XG4gICAgICAvLyBTdG9yZSBhbmQgcmVnaXN0ZXIgdGhlIHRhc2tcbiAgICAgIHZhciB0YXNrID0geyBjYWxsYmFjazogY2FsbGJhY2ssIGFyZ3M6IGFyZ3MgfTtcbiAgICAgIHRhc2tzQnlIYW5kbGVbbmV4dEhhbmRsZV0gPSB0YXNrO1xuICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUobmV4dEhhbmRsZSk7XG4gICAgICByZXR1cm4gbmV4dEhhbmRsZSsrO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGhhbmRsZSkge1xuICAgICAgICBkZWxldGUgdGFza3NCeUhhbmRsZVtoYW5kbGVdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJ1bih0YXNrKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IHRhc2suY2FsbGJhY2s7XG4gICAgICAgIHZhciBhcmdzID0gdGFzay5hcmdzO1xuICAgICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgY2FsbGJhY2soYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgY2FsbGJhY2soYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgY2FsbGJhY2soYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJ1bklmUHJlc2VudChoYW5kbGUpIHtcbiAgICAgICAgLy8gRnJvbSB0aGUgc3BlYzogXCJXYWl0IHVudGlsIGFueSBpbnZvY2F0aW9ucyBvZiB0aGlzIGFsZ29yaXRobSBzdGFydGVkIGJlZm9yZSB0aGlzIG9uZSBoYXZlIGNvbXBsZXRlZC5cIlxuICAgICAgICAvLyBTbyBpZiB3ZSdyZSBjdXJyZW50bHkgcnVubmluZyBhIHRhc2ssIHdlJ2xsIG5lZWQgdG8gZGVsYXkgdGhpcyBpbnZvY2F0aW9uLlxuICAgICAgICBpZiAoY3VycmVudGx5UnVubmluZ0FUYXNrKSB7XG4gICAgICAgICAgICAvLyBEZWxheSBieSBkb2luZyBhIHNldFRpbWVvdXQuIHNldEltbWVkaWF0ZSB3YXMgdHJpZWQgaW5zdGVhZCwgYnV0IGluIEZpcmVmb3ggNyBpdCBnZW5lcmF0ZWQgYVxuICAgICAgICAgICAgLy8gXCJ0b28gbXVjaCByZWN1cnNpb25cIiBlcnJvci5cbiAgICAgICAgICAgIHNldFRpbWVvdXQocnVuSWZQcmVzZW50LCAwLCBoYW5kbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHRhc2sgPSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG4gICAgICAgICAgICBpZiAodGFzaykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IHRydWU7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcnVuKHRhc2spO1xuICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW1tZWRpYXRlKGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7IHJ1bklmUHJlc2VudChoYW5kbGUpOyB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYW5Vc2VQb3N0TWVzc2FnZSgpIHtcbiAgICAgICAgLy8gVGhlIHRlc3QgYWdhaW5zdCBgaW1wb3J0U2NyaXB0c2AgcHJldmVudHMgdGhpcyBpbXBsZW1lbnRhdGlvbiBmcm9tIGJlaW5nIGluc3RhbGxlZCBpbnNpZGUgYSB3ZWIgd29ya2VyLFxuICAgICAgICAvLyB3aGVyZSBgZ2xvYmFsLnBvc3RNZXNzYWdlYCBtZWFucyBzb21ldGhpbmcgY29tcGxldGVseSBkaWZmZXJlbnQgYW5kIGNhbid0IGJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZS5cbiAgICAgICAgaWYgKGdsb2JhbC5wb3N0TWVzc2FnZSAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpIHtcbiAgICAgICAgICAgIHZhciBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBvbGRPbk1lc3NhZ2UgPSBnbG9iYWwub25tZXNzYWdlO1xuICAgICAgICAgICAgZ2xvYmFsLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMgPSBmYWxzZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoXCJcIiwgXCIqXCIpO1xuICAgICAgICAgICAgZ2xvYmFsLm9ubWVzc2FnZSA9IG9sZE9uTWVzc2FnZTtcbiAgICAgICAgICAgIHJldHVybiBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFBvc3RNZXNzYWdlSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIC8vIEluc3RhbGxzIGFuIGV2ZW50IGhhbmRsZXIgb24gYGdsb2JhbGAgZm9yIHRoZSBgbWVzc2FnZWAgZXZlbnQ6IHNlZVxuICAgICAgICAvLyAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0RPTS93aW5kb3cucG9zdE1lc3NhZ2VcbiAgICAgICAgLy8gKiBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS9jb21tcy5odG1sI2Nyb3NzRG9jdW1lbnRNZXNzYWdlc1xuXG4gICAgICAgIHZhciBtZXNzYWdlUHJlZml4ID0gXCJzZXRJbW1lZGlhdGUkXCIgKyBNYXRoLnJhbmRvbSgpICsgXCIkXCI7XG4gICAgICAgIHZhciBvbkdsb2JhbE1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZSA9PT0gZ2xvYmFsICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGV2ZW50LmRhdGEgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICBldmVudC5kYXRhLmluZGV4T2YobWVzc2FnZVByZWZpeCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBydW5JZlByZXNlbnQoK2V2ZW50LmRhdGEuc2xpY2UobWVzc2FnZVByZWZpeC5sZW5ndGgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBvbkdsb2JhbE1lc3NhZ2UsIGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdsb2JhbC5hdHRhY2hFdmVudChcIm9ubWVzc2FnZVwiLCBvbkdsb2JhbE1lc3NhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShtZXNzYWdlUHJlZml4ICsgaGFuZGxlLCBcIipcIik7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBldmVudC5kYXRhO1xuICAgICAgICAgICAgcnVuSWZQcmVzZW50KGhhbmRsZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoaGFuZGxlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsUmVhZHlTdGF0ZUNoYW5nZUltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICB2YXIgaHRtbCA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgYSA8c2NyaXB0PiBlbGVtZW50OyBpdHMgcmVhZHlzdGF0ZWNoYW5nZSBldmVudCB3aWxsIGJlIGZpcmVkIGFzeW5jaHJvbm91c2x5IG9uY2UgaXQgaXMgaW5zZXJ0ZWRcbiAgICAgICAgICAgIC8vIGludG8gdGhlIGRvY3VtZW50LiBEbyBzbywgdGh1cyBxdWV1aW5nIHVwIHRoZSB0YXNrLiBSZW1lbWJlciB0byBjbGVhbiB1cCBvbmNlIGl0J3MgYmVlbiBjYWxsZWQuXG4gICAgICAgICAgICB2YXIgc2NyaXB0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICAgICAgICBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJ1bklmUHJlc2VudChoYW5kbGUpO1xuICAgICAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICBzY3JpcHQgPSBudWxsO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgc2V0VGltZW91dChydW5JZlByZXNlbnQsIDAsIGhhbmRsZSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSWYgc3VwcG9ydGVkLCB3ZSBzaG91bGQgYXR0YWNoIHRvIHRoZSBwcm90b3R5cGUgb2YgZ2xvYmFsLCBzaW5jZSB0aGF0IGlzIHdoZXJlIHNldFRpbWVvdXQgZXQgYWwuIGxpdmUuXG4gICAgdmFyIGF0dGFjaFRvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihnbG9iYWwpO1xuICAgIGF0dGFjaFRvID0gYXR0YWNoVG8gJiYgYXR0YWNoVG8uc2V0VGltZW91dCA/IGF0dGFjaFRvIDogZ2xvYmFsO1xuXG4gICAgLy8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBlLmcuIGJyb3dzZXJpZnkgZW52aXJvbm1lbnRzLlxuICAgIGlmICh7fS50b1N0cmluZy5jYWxsKGdsb2JhbC5wcm9jZXNzKSA9PT0gXCJbb2JqZWN0IHByb2Nlc3NdXCIpIHtcbiAgICAgICAgLy8gRm9yIE5vZGUuanMgYmVmb3JlIDAuOVxuICAgICAgICBpbnN0YWxsTmV4dFRpY2tJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChjYW5Vc2VQb3N0TWVzc2FnZSgpKSB7XG4gICAgICAgIC8vIEZvciBub24tSUUxMCBtb2Rlcm4gYnJvd3NlcnNcbiAgICAgICAgaW5zdGFsbFBvc3RNZXNzYWdlSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoZ2xvYmFsLk1lc3NhZ2VDaGFubmVsKSB7XG4gICAgICAgIC8vIEZvciB3ZWIgd29ya2Vycywgd2hlcmUgc3VwcG9ydGVkXG4gICAgICAgIGluc3RhbGxNZXNzYWdlQ2hhbm5lbEltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGRvYyAmJiBcIm9ucmVhZHlzdGF0ZWNoYW5nZVwiIGluIGRvYy5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpKSB7XG4gICAgICAgIC8vIEZvciBJRSA24oCTOFxuICAgICAgICBpbnN0YWxsUmVhZHlTdGF0ZUNoYW5nZUltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGb3Igb2xkZXIgYnJvd3NlcnNcbiAgICAgICAgaW5zdGFsbFNldFRpbWVvdXRJbXBsZW1lbnRhdGlvbigpO1xuICAgIH1cblxuICAgIGF0dGFjaFRvLnNldEltbWVkaWF0ZSA9IHNldEltbWVkaWF0ZTtcbiAgICBhdHRhY2hUby5jbGVhckltbWVkaWF0ZSA9IGNsZWFySW1tZWRpYXRlO1xufSh0eXBlb2Ygc2VsZiA9PT0gXCJ1bmRlZmluZWRcIiA/IHR5cGVvZiBnbG9iYWwgPT09IFwidW5kZWZpbmVkXCIgPyB0aGlzIDogZ2xvYmFsIDogc2VsZikpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvc2V0aW1tZWRpYXRlL3NldEltbWVkaWF0ZS5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvc2V0aW1tZWRpYXRlL3NldEltbWVkaWF0ZS5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCIvKlxuXHRNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuXHRBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xuXG52YXIgc3R5bGVzSW5Eb20gPSB7fTtcblxudmFyXHRtZW1vaXplID0gZnVuY3Rpb24gKGZuKSB7XG5cdHZhciBtZW1vO1xuXG5cdHJldHVybiBmdW5jdGlvbiAoKSB7XG5cdFx0aWYgKHR5cGVvZiBtZW1vID09PSBcInVuZGVmaW5lZFwiKSBtZW1vID0gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0XHRyZXR1cm4gbWVtbztcblx0fTtcbn07XG5cbnZhciBpc09sZElFID0gbWVtb2l6ZShmdW5jdGlvbiAoKSB7XG5cdC8vIFRlc3QgZm9yIElFIDw9IDkgYXMgcHJvcG9zZWQgYnkgQnJvd3NlcmhhY2tzXG5cdC8vIEBzZWUgaHR0cDovL2Jyb3dzZXJoYWNrcy5jb20vI2hhY2stZTcxZDg2OTJmNjUzMzQxNzNmZWU3MTVjMjIyY2I4MDVcblx0Ly8gVGVzdHMgZm9yIGV4aXN0ZW5jZSBvZiBzdGFuZGFyZCBnbG9iYWxzIGlzIHRvIGFsbG93IHN0eWxlLWxvYWRlclxuXHQvLyB0byBvcGVyYXRlIGNvcnJlY3RseSBpbnRvIG5vbi1zdGFuZGFyZCBlbnZpcm9ubWVudHNcblx0Ly8gQHNlZSBodHRwczovL2dpdGh1Yi5jb20vd2VicGFjay1jb250cmliL3N0eWxlLWxvYWRlci9pc3N1ZXMvMTc3XG5cdHJldHVybiB3aW5kb3cgJiYgZG9jdW1lbnQgJiYgZG9jdW1lbnQuYWxsICYmICF3aW5kb3cuYXRvYjtcbn0pO1xuXG52YXIgZ2V0RWxlbWVudCA9IChmdW5jdGlvbiAoZm4pIHtcblx0dmFyIG1lbW8gPSB7fTtcblxuXHRyZXR1cm4gZnVuY3Rpb24oc2VsZWN0b3IpIHtcblx0XHRpZiAodHlwZW9mIG1lbW9bc2VsZWN0b3JdID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0XHR2YXIgc3R5bGVUYXJnZXQgPSBmbi5jYWxsKHRoaXMsIHNlbGVjdG9yKTtcblx0XHRcdC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG5cdFx0XHRpZiAoc3R5bGVUYXJnZXQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHQvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFjY2VzcyB0byBpZnJhbWUgaXMgYmxvY2tlZFxuXHRcdFx0XHRcdC8vIGR1ZSB0byBjcm9zcy1vcmlnaW4gcmVzdHJpY3Rpb25zXG5cdFx0XHRcdFx0c3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcblx0XHRcdFx0fSBjYXRjaChlKSB7XG5cdFx0XHRcdFx0c3R5bGVUYXJnZXQgPSBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRtZW1vW3NlbGVjdG9yXSA9IHN0eWxlVGFyZ2V0O1xuXHRcdH1cblx0XHRyZXR1cm4gbWVtb1tzZWxlY3Rvcl1cblx0fTtcbn0pKGZ1bmN0aW9uICh0YXJnZXQpIHtcblx0cmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KVxufSk7XG5cbnZhciBzaW5nbGV0b24gPSBudWxsO1xudmFyXHRzaW5nbGV0b25Db3VudGVyID0gMDtcbnZhclx0c3R5bGVzSW5zZXJ0ZWRBdFRvcCA9IFtdO1xuXG52YXJcdGZpeFVybHMgPSByZXF1aXJlKFwiLi91cmxzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGxpc3QsIG9wdGlvbnMpIHtcblx0aWYgKHR5cGVvZiBERUJVRyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBERUJVRykge1xuXHRcdGlmICh0eXBlb2YgZG9jdW1lbnQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBFcnJvcihcIlRoZSBzdHlsZS1sb2FkZXIgY2Fubm90IGJlIHVzZWQgaW4gYSBub24tYnJvd3NlciBlbnZpcm9ubWVudFwiKTtcblx0fVxuXG5cdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdG9wdGlvbnMuYXR0cnMgPSB0eXBlb2Ygb3B0aW9ucy5hdHRycyA9PT0gXCJvYmplY3RcIiA/IG9wdGlvbnMuYXR0cnMgOiB7fTtcblxuXHQvLyBGb3JjZSBzaW5nbGUtdGFnIHNvbHV0aW9uIG9uIElFNi05LCB3aGljaCBoYXMgYSBoYXJkIGxpbWl0IG9uIHRoZSAjIG9mIDxzdHlsZT5cblx0Ly8gdGFncyBpdCB3aWxsIGFsbG93IG9uIGEgcGFnZVxuXHRpZiAoIW9wdGlvbnMuc2luZ2xldG9uKSBvcHRpb25zLnNpbmdsZXRvbiA9IGlzT2xkSUUoKTtcblxuXHQvLyBCeSBkZWZhdWx0LCBhZGQgPHN0eWxlPiB0YWdzIHRvIHRoZSA8aGVhZD4gZWxlbWVudFxuXHRpZiAoIW9wdGlvbnMuaW5zZXJ0SW50bykgb3B0aW9ucy5pbnNlcnRJbnRvID0gXCJoZWFkXCI7XG5cblx0Ly8gQnkgZGVmYXVsdCwgYWRkIDxzdHlsZT4gdGFncyB0byB0aGUgYm90dG9tIG9mIHRoZSB0YXJnZXRcblx0aWYgKCFvcHRpb25zLmluc2VydEF0KSBvcHRpb25zLmluc2VydEF0ID0gXCJib3R0b21cIjtcblxuXHR2YXIgc3R5bGVzID0gbGlzdFRvU3R5bGVzKGxpc3QsIG9wdGlvbnMpO1xuXG5cdGFkZFN0eWxlc1RvRG9tKHN0eWxlcywgb3B0aW9ucyk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSAobmV3TGlzdCkge1xuXHRcdHZhciBtYXlSZW1vdmUgPSBbXTtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgaXRlbSA9IHN0eWxlc1tpXTtcblx0XHRcdHZhciBkb21TdHlsZSA9IHN0eWxlc0luRG9tW2l0ZW0uaWRdO1xuXG5cdFx0XHRkb21TdHlsZS5yZWZzLS07XG5cdFx0XHRtYXlSZW1vdmUucHVzaChkb21TdHlsZSk7XG5cdFx0fVxuXG5cdFx0aWYobmV3TGlzdCkge1xuXHRcdFx0dmFyIG5ld1N0eWxlcyA9IGxpc3RUb1N0eWxlcyhuZXdMaXN0LCBvcHRpb25zKTtcblx0XHRcdGFkZFN0eWxlc1RvRG9tKG5ld1N0eWxlcywgb3B0aW9ucyk7XG5cdFx0fVxuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBtYXlSZW1vdmUubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBkb21TdHlsZSA9IG1heVJlbW92ZVtpXTtcblxuXHRcdFx0aWYoZG9tU3R5bGUucmVmcyA9PT0gMCkge1xuXHRcdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IGRvbVN0eWxlLnBhcnRzLmxlbmd0aDsgaisrKSBkb21TdHlsZS5wYXJ0c1tqXSgpO1xuXG5cdFx0XHRcdGRlbGV0ZSBzdHlsZXNJbkRvbVtkb21TdHlsZS5pZF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufTtcblxuZnVuY3Rpb24gYWRkU3R5bGVzVG9Eb20gKHN0eWxlcywgb3B0aW9ucykge1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBpdGVtID0gc3R5bGVzW2ldO1xuXHRcdHZhciBkb21TdHlsZSA9IHN0eWxlc0luRG9tW2l0ZW0uaWRdO1xuXG5cdFx0aWYoZG9tU3R5bGUpIHtcblx0XHRcdGRvbVN0eWxlLnJlZnMrKztcblxuXHRcdFx0Zm9yKHZhciBqID0gMDsgaiA8IGRvbVN0eWxlLnBhcnRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdGRvbVN0eWxlLnBhcnRzW2pdKGl0ZW0ucGFydHNbal0pO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IoOyBqIDwgaXRlbS5wYXJ0cy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRkb21TdHlsZS5wYXJ0cy5wdXNoKGFkZFN0eWxlKGl0ZW0ucGFydHNbal0sIG9wdGlvbnMpKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIHBhcnRzID0gW107XG5cblx0XHRcdGZvcih2YXIgaiA9IDA7IGogPCBpdGVtLnBhcnRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdHBhcnRzLnB1c2goYWRkU3R5bGUoaXRlbS5wYXJ0c1tqXSwgb3B0aW9ucykpO1xuXHRcdFx0fVxuXG5cdFx0XHRzdHlsZXNJbkRvbVtpdGVtLmlkXSA9IHtpZDogaXRlbS5pZCwgcmVmczogMSwgcGFydHM6IHBhcnRzfTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gbGlzdFRvU3R5bGVzIChsaXN0LCBvcHRpb25zKSB7XG5cdHZhciBzdHlsZXMgPSBbXTtcblx0dmFyIG5ld1N0eWxlcyA9IHt9O1xuXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBpdGVtID0gbGlzdFtpXTtcblx0XHR2YXIgaWQgPSBvcHRpb25zLmJhc2UgPyBpdGVtWzBdICsgb3B0aW9ucy5iYXNlIDogaXRlbVswXTtcblx0XHR2YXIgY3NzID0gaXRlbVsxXTtcblx0XHR2YXIgbWVkaWEgPSBpdGVtWzJdO1xuXHRcdHZhciBzb3VyY2VNYXAgPSBpdGVtWzNdO1xuXHRcdHZhciBwYXJ0ID0ge2NzczogY3NzLCBtZWRpYTogbWVkaWEsIHNvdXJjZU1hcDogc291cmNlTWFwfTtcblxuXHRcdGlmKCFuZXdTdHlsZXNbaWRdKSBzdHlsZXMucHVzaChuZXdTdHlsZXNbaWRdID0ge2lkOiBpZCwgcGFydHM6IFtwYXJ0XX0pO1xuXHRcdGVsc2UgbmV3U3R5bGVzW2lkXS5wYXJ0cy5wdXNoKHBhcnQpO1xuXHR9XG5cblx0cmV0dXJuIHN0eWxlcztcbn1cblxuZnVuY3Rpb24gaW5zZXJ0U3R5bGVFbGVtZW50IChvcHRpb25zLCBzdHlsZSkge1xuXHR2YXIgdGFyZ2V0ID0gZ2V0RWxlbWVudChvcHRpb25zLmluc2VydEludG8pXG5cblx0aWYgKCF0YXJnZXQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGEgc3R5bGUgdGFyZ2V0LiBUaGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHZhbHVlIGZvciB0aGUgJ2luc2VydEludG8nIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcblx0fVxuXG5cdHZhciBsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcCA9IHN0eWxlc0luc2VydGVkQXRUb3Bbc3R5bGVzSW5zZXJ0ZWRBdFRvcC5sZW5ndGggLSAxXTtcblxuXHRpZiAob3B0aW9ucy5pbnNlcnRBdCA9PT0gXCJ0b3BcIikge1xuXHRcdGlmICghbGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3ApIHtcblx0XHRcdHRhcmdldC5pbnNlcnRCZWZvcmUoc3R5bGUsIHRhcmdldC5maXJzdENoaWxkKTtcblx0XHR9IGVsc2UgaWYgKGxhc3RTdHlsZUVsZW1lbnRJbnNlcnRlZEF0VG9wLm5leHRTaWJsaW5nKSB7XG5cdFx0XHR0YXJnZXQuaW5zZXJ0QmVmb3JlKHN0eWxlLCBsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcC5uZXh0U2libGluZyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG5cdFx0fVxuXHRcdHN0eWxlc0luc2VydGVkQXRUb3AucHVzaChzdHlsZSk7XG5cdH0gZWxzZSBpZiAob3B0aW9ucy5pbnNlcnRBdCA9PT0gXCJib3R0b21cIikge1xuXHRcdHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG5cdH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMuaW5zZXJ0QXQgPT09IFwib2JqZWN0XCIgJiYgb3B0aW9ucy5pbnNlcnRBdC5iZWZvcmUpIHtcblx0XHR2YXIgbmV4dFNpYmxpbmcgPSBnZXRFbGVtZW50KG9wdGlvbnMuaW5zZXJ0SW50byArIFwiIFwiICsgb3B0aW9ucy5pbnNlcnRBdC5iZWZvcmUpO1xuXHRcdHRhcmdldC5pbnNlcnRCZWZvcmUoc3R5bGUsIG5leHRTaWJsaW5nKTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJbU3R5bGUgTG9hZGVyXVxcblxcbiBJbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXIgJ2luc2VydEF0JyAoJ29wdGlvbnMuaW5zZXJ0QXQnKSBmb3VuZC5cXG4gTXVzdCBiZSAndG9wJywgJ2JvdHRvbScsIG9yIE9iamVjdC5cXG4gKGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJwYWNrLWNvbnRyaWIvc3R5bGUtbG9hZGVyI2luc2VydGF0KVxcblwiKTtcblx0fVxufVxuXG5mdW5jdGlvbiByZW1vdmVTdHlsZUVsZW1lbnQgKHN0eWxlKSB7XG5cdGlmIChzdHlsZS5wYXJlbnROb2RlID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cdHN0eWxlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGUpO1xuXG5cdHZhciBpZHggPSBzdHlsZXNJbnNlcnRlZEF0VG9wLmluZGV4T2Yoc3R5bGUpO1xuXHRpZihpZHggPj0gMCkge1xuXHRcdHN0eWxlc0luc2VydGVkQXRUb3Auc3BsaWNlKGlkeCwgMSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlU3R5bGVFbGVtZW50IChvcHRpb25zKSB7XG5cdHZhciBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcblxuXHRvcHRpb25zLmF0dHJzLnR5cGUgPSBcInRleHQvY3NzXCI7XG5cblx0YWRkQXR0cnMoc3R5bGUsIG9wdGlvbnMuYXR0cnMpO1xuXHRpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucywgc3R5bGUpO1xuXG5cdHJldHVybiBzdHlsZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTGlua0VsZW1lbnQgKG9wdGlvbnMpIHtcblx0dmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlua1wiKTtcblxuXHRvcHRpb25zLmF0dHJzLnR5cGUgPSBcInRleHQvY3NzXCI7XG5cdG9wdGlvbnMuYXR0cnMucmVsID0gXCJzdHlsZXNoZWV0XCI7XG5cblx0YWRkQXR0cnMobGluaywgb3B0aW9ucy5hdHRycyk7XG5cdGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zLCBsaW5rKTtcblxuXHRyZXR1cm4gbGluaztcbn1cblxuZnVuY3Rpb24gYWRkQXR0cnMgKGVsLCBhdHRycykge1xuXHRPYmplY3Qua2V5cyhhdHRycykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0ZWwuc2V0QXR0cmlidXRlKGtleSwgYXR0cnNba2V5XSk7XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBhZGRTdHlsZSAob2JqLCBvcHRpb25zKSB7XG5cdHZhciBzdHlsZSwgdXBkYXRlLCByZW1vdmUsIHJlc3VsdDtcblxuXHQvLyBJZiBhIHRyYW5zZm9ybSBmdW5jdGlvbiB3YXMgZGVmaW5lZCwgcnVuIGl0IG9uIHRoZSBjc3Ncblx0aWYgKG9wdGlvbnMudHJhbnNmb3JtICYmIG9iai5jc3MpIHtcblx0ICAgIHJlc3VsdCA9IG9wdGlvbnMudHJhbnNmb3JtKG9iai5jc3MpO1xuXG5cdCAgICBpZiAocmVzdWx0KSB7XG5cdCAgICBcdC8vIElmIHRyYW5zZm9ybSByZXR1cm5zIGEgdmFsdWUsIHVzZSB0aGF0IGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsIGNzcy5cblx0ICAgIFx0Ly8gVGhpcyBhbGxvd3MgcnVubmluZyBydW50aW1lIHRyYW5zZm9ybWF0aW9ucyBvbiB0aGUgY3NzLlxuXHQgICAgXHRvYmouY3NzID0gcmVzdWx0O1xuXHQgICAgfSBlbHNlIHtcblx0ICAgIFx0Ly8gSWYgdGhlIHRyYW5zZm9ybSBmdW5jdGlvbiByZXR1cm5zIGEgZmFsc3kgdmFsdWUsIGRvbid0IGFkZCB0aGlzIGNzcy5cblx0ICAgIFx0Ly8gVGhpcyBhbGxvd3MgY29uZGl0aW9uYWwgbG9hZGluZyBvZiBjc3Ncblx0ICAgIFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHQgICAgXHRcdC8vIG5vb3Bcblx0ICAgIFx0fTtcblx0ICAgIH1cblx0fVxuXG5cdGlmIChvcHRpb25zLnNpbmdsZXRvbikge1xuXHRcdHZhciBzdHlsZUluZGV4ID0gc2luZ2xldG9uQ291bnRlcisrO1xuXG5cdFx0c3R5bGUgPSBzaW5nbGV0b24gfHwgKHNpbmdsZXRvbiA9IGNyZWF0ZVN0eWxlRWxlbWVudChvcHRpb25zKSk7XG5cblx0XHR1cGRhdGUgPSBhcHBseVRvU2luZ2xldG9uVGFnLmJpbmQobnVsbCwgc3R5bGUsIHN0eWxlSW5kZXgsIGZhbHNlKTtcblx0XHRyZW1vdmUgPSBhcHBseVRvU2luZ2xldG9uVGFnLmJpbmQobnVsbCwgc3R5bGUsIHN0eWxlSW5kZXgsIHRydWUpO1xuXG5cdH0gZWxzZSBpZiAoXG5cdFx0b2JqLnNvdXJjZU1hcCAmJlxuXHRcdHR5cGVvZiBVUkwgPT09IFwiZnVuY3Rpb25cIiAmJlxuXHRcdHR5cGVvZiBVUkwuY3JlYXRlT2JqZWN0VVJMID09PSBcImZ1bmN0aW9uXCIgJiZcblx0XHR0eXBlb2YgVVJMLnJldm9rZU9iamVjdFVSTCA9PT0gXCJmdW5jdGlvblwiICYmXG5cdFx0dHlwZW9mIEJsb2IgPT09IFwiZnVuY3Rpb25cIiAmJlxuXHRcdHR5cGVvZiBidG9hID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdFx0c3R5bGUgPSBjcmVhdGVMaW5rRWxlbWVudChvcHRpb25zKTtcblx0XHR1cGRhdGUgPSB1cGRhdGVMaW5rLmJpbmQobnVsbCwgc3R5bGUsIG9wdGlvbnMpO1xuXHRcdHJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZSk7XG5cblx0XHRcdGlmKHN0eWxlLmhyZWYpIFVSTC5yZXZva2VPYmplY3RVUkwoc3R5bGUuaHJlZik7XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRzdHlsZSA9IGNyZWF0ZVN0eWxlRWxlbWVudChvcHRpb25zKTtcblx0XHR1cGRhdGUgPSBhcHBseVRvVGFnLmJpbmQobnVsbCwgc3R5bGUpO1xuXHRcdHJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZSk7XG5cdFx0fTtcblx0fVxuXG5cdHVwZGF0ZShvYmopO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGVTdHlsZSAobmV3T2JqKSB7XG5cdFx0aWYgKG5ld09iaikge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRuZXdPYmouY3NzID09PSBvYmouY3NzICYmXG5cdFx0XHRcdG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmXG5cdFx0XHRcdG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXBcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHVwZGF0ZShvYmogPSBuZXdPYmopO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZW1vdmUoKTtcblx0XHR9XG5cdH07XG59XG5cbnZhciByZXBsYWNlVGV4dCA9IChmdW5jdGlvbiAoKSB7XG5cdHZhciB0ZXh0U3RvcmUgPSBbXTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gKGluZGV4LCByZXBsYWNlbWVudCkge1xuXHRcdHRleHRTdG9yZVtpbmRleF0gPSByZXBsYWNlbWVudDtcblxuXHRcdHJldHVybiB0ZXh0U3RvcmUuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJ1xcbicpO1xuXHR9O1xufSkoKTtcblxuZnVuY3Rpb24gYXBwbHlUb1NpbmdsZXRvblRhZyAoc3R5bGUsIGluZGV4LCByZW1vdmUsIG9iaikge1xuXHR2YXIgY3NzID0gcmVtb3ZlID8gXCJcIiA6IG9iai5jc3M7XG5cblx0aWYgKHN0eWxlLnN0eWxlU2hlZXQpIHtcblx0XHRzdHlsZS5zdHlsZVNoZWV0LmNzc1RleHQgPSByZXBsYWNlVGV4dChpbmRleCwgY3NzKTtcblx0fSBlbHNlIHtcblx0XHR2YXIgY3NzTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcyk7XG5cdFx0dmFyIGNoaWxkTm9kZXMgPSBzdHlsZS5jaGlsZE5vZGVzO1xuXG5cdFx0aWYgKGNoaWxkTm9kZXNbaW5kZXhdKSBzdHlsZS5yZW1vdmVDaGlsZChjaGlsZE5vZGVzW2luZGV4XSk7XG5cblx0XHRpZiAoY2hpbGROb2Rlcy5sZW5ndGgpIHtcblx0XHRcdHN0eWxlLmluc2VydEJlZm9yZShjc3NOb2RlLCBjaGlsZE5vZGVzW2luZGV4XSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHN0eWxlLmFwcGVuZENoaWxkKGNzc05vZGUpO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBhcHBseVRvVGFnIChzdHlsZSwgb2JqKSB7XG5cdHZhciBjc3MgPSBvYmouY3NzO1xuXHR2YXIgbWVkaWEgPSBvYmoubWVkaWE7XG5cblx0aWYobWVkaWEpIHtcblx0XHRzdHlsZS5zZXRBdHRyaWJ1dGUoXCJtZWRpYVwiLCBtZWRpYSlcblx0fVxuXG5cdGlmKHN0eWxlLnN0eWxlU2hlZXQpIHtcblx0XHRzdHlsZS5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3M7XG5cdH0gZWxzZSB7XG5cdFx0d2hpbGUoc3R5bGUuZmlyc3RDaGlsZCkge1xuXHRcdFx0c3R5bGUucmVtb3ZlQ2hpbGQoc3R5bGUuZmlyc3RDaGlsZCk7XG5cdFx0fVxuXG5cdFx0c3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlTGluayAobGluaywgb3B0aW9ucywgb2JqKSB7XG5cdHZhciBjc3MgPSBvYmouY3NzO1xuXHR2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcblxuXHQvKlxuXHRcdElmIGNvbnZlcnRUb0Fic29sdXRlVXJscyBpc24ndCBkZWZpbmVkLCBidXQgc291cmNlbWFwcyBhcmUgZW5hYmxlZFxuXHRcdGFuZCB0aGVyZSBpcyBubyBwdWJsaWNQYXRoIGRlZmluZWQgdGhlbiBsZXRzIHR1cm4gY29udmVydFRvQWJzb2x1dGVVcmxzXG5cdFx0b24gYnkgZGVmYXVsdC4gIE90aGVyd2lzZSBkZWZhdWx0IHRvIHRoZSBjb252ZXJ0VG9BYnNvbHV0ZVVybHMgb3B0aW9uXG5cdFx0ZGlyZWN0bHlcblx0Ki9cblx0dmFyIGF1dG9GaXhVcmxzID0gb3B0aW9ucy5jb252ZXJ0VG9BYnNvbHV0ZVVybHMgPT09IHVuZGVmaW5lZCAmJiBzb3VyY2VNYXA7XG5cblx0aWYgKG9wdGlvbnMuY29udmVydFRvQWJzb2x1dGVVcmxzIHx8IGF1dG9GaXhVcmxzKSB7XG5cdFx0Y3NzID0gZml4VXJscyhjc3MpO1xuXHR9XG5cblx0aWYgKHNvdXJjZU1hcCkge1xuXHRcdC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzI2NjAzODc1XG5cdFx0Y3NzICs9IFwiXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxcIiArIGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCkpKSkgKyBcIiAqL1wiO1xuXHR9XG5cblx0dmFyIGJsb2IgPSBuZXcgQmxvYihbY3NzXSwgeyB0eXBlOiBcInRleHQvY3NzXCIgfSk7XG5cblx0dmFyIG9sZFNyYyA9IGxpbmsuaHJlZjtcblxuXHRsaW5rLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuXG5cdGlmKG9sZFNyYykgVVJMLnJldm9rZU9iamVjdFVSTChvbGRTcmMpO1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2xpYi9hZGRTdHlsZXMuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlxuLyoqXG4gKiBXaGVuIHNvdXJjZSBtYXBzIGFyZSBlbmFibGVkLCBgc3R5bGUtbG9hZGVyYCB1c2VzIGEgbGluayBlbGVtZW50IHdpdGggYSBkYXRhLXVyaSB0b1xuICogZW1iZWQgdGhlIGNzcyBvbiB0aGUgcGFnZS4gVGhpcyBicmVha3MgYWxsIHJlbGF0aXZlIHVybHMgYmVjYXVzZSBub3cgdGhleSBhcmUgcmVsYXRpdmUgdG8gYVxuICogYnVuZGxlIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgcGFnZS5cbiAqXG4gKiBPbmUgc29sdXRpb24gaXMgdG8gb25seSB1c2UgZnVsbCB1cmxzLCBidXQgdGhhdCBtYXkgYmUgaW1wb3NzaWJsZS5cbiAqXG4gKiBJbnN0ZWFkLCB0aGlzIGZ1bmN0aW9uIFwiZml4ZXNcIiB0aGUgcmVsYXRpdmUgdXJscyB0byBiZSBhYnNvbHV0ZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcGFnZSBsb2NhdGlvbi5cbiAqXG4gKiBBIHJ1ZGltZW50YXJ5IHRlc3Qgc3VpdGUgaXMgbG9jYXRlZCBhdCBgdGVzdC9maXhVcmxzLmpzYCBhbmQgY2FuIGJlIHJ1biB2aWEgdGhlIGBucG0gdGVzdGAgY29tbWFuZC5cbiAqXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzKSB7XG4gIC8vIGdldCBjdXJyZW50IGxvY2F0aW9uXG4gIHZhciBsb2NhdGlvbiA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LmxvY2F0aW9uO1xuXG4gIGlmICghbG9jYXRpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJmaXhVcmxzIHJlcXVpcmVzIHdpbmRvdy5sb2NhdGlvblwiKTtcbiAgfVxuXG5cdC8vIGJsYW5rIG9yIG51bGw/XG5cdGlmICghY3NzIHx8IHR5cGVvZiBjc3MgIT09IFwic3RyaW5nXCIpIHtcblx0ICByZXR1cm4gY3NzO1xuICB9XG5cbiAgdmFyIGJhc2VVcmwgPSBsb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiArIGxvY2F0aW9uLmhvc3Q7XG4gIHZhciBjdXJyZW50RGlyID0gYmFzZVVybCArIGxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoL1xcL1teXFwvXSokLywgXCIvXCIpO1xuXG5cdC8vIGNvbnZlcnQgZWFjaCB1cmwoLi4uKVxuXHQvKlxuXHRUaGlzIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBqdXN0IGEgd2F5IHRvIHJlY3Vyc2l2ZWx5IG1hdGNoIGJyYWNrZXRzIHdpdGhpblxuXHRhIHN0cmluZy5cblxuXHQgL3VybFxccypcXCggID0gTWF0Y2ggb24gdGhlIHdvcmQgXCJ1cmxcIiB3aXRoIGFueSB3aGl0ZXNwYWNlIGFmdGVyIGl0IGFuZCB0aGVuIGEgcGFyZW5zXG5cdCAgICggID0gU3RhcnQgYSBjYXB0dXJpbmcgZ3JvdXBcblx0ICAgICAoPzogID0gU3RhcnQgYSBub24tY2FwdHVyaW5nIGdyb3VwXG5cdCAgICAgICAgIFteKShdICA9IE1hdGNoIGFueXRoaW5nIHRoYXQgaXNuJ3QgYSBwYXJlbnRoZXNlc1xuXHQgICAgICAgICB8ICA9IE9SXG5cdCAgICAgICAgIFxcKCAgPSBNYXRjaCBhIHN0YXJ0IHBhcmVudGhlc2VzXG5cdCAgICAgICAgICAgICAoPzogID0gU3RhcnQgYW5vdGhlciBub24tY2FwdHVyaW5nIGdyb3Vwc1xuXHQgICAgICAgICAgICAgICAgIFteKShdKyAgPSBNYXRjaCBhbnl0aGluZyB0aGF0IGlzbid0IGEgcGFyZW50aGVzZXNcblx0ICAgICAgICAgICAgICAgICB8ICA9IE9SXG5cdCAgICAgICAgICAgICAgICAgXFwoICA9IE1hdGNoIGEgc3RhcnQgcGFyZW50aGVzZXNcblx0ICAgICAgICAgICAgICAgICAgICAgW14pKF0qICA9IE1hdGNoIGFueXRoaW5nIHRoYXQgaXNuJ3QgYSBwYXJlbnRoZXNlc1xuXHQgICAgICAgICAgICAgICAgIFxcKSAgPSBNYXRjaCBhIGVuZCBwYXJlbnRoZXNlc1xuXHQgICAgICAgICAgICAgKSAgPSBFbmQgR3JvdXBcbiAgICAgICAgICAgICAgKlxcKSA9IE1hdGNoIGFueXRoaW5nIGFuZCB0aGVuIGEgY2xvc2UgcGFyZW5zXG4gICAgICAgICAgKSAgPSBDbG9zZSBub24tY2FwdHVyaW5nIGdyb3VwXG4gICAgICAgICAgKiAgPSBNYXRjaCBhbnl0aGluZ1xuICAgICAgICkgID0gQ2xvc2UgY2FwdHVyaW5nIGdyb3VwXG5cdCBcXCkgID0gTWF0Y2ggYSBjbG9zZSBwYXJlbnNcblxuXHQgL2dpICA9IEdldCBhbGwgbWF0Y2hlcywgbm90IHRoZSBmaXJzdC4gIEJlIGNhc2UgaW5zZW5zaXRpdmUuXG5cdCAqL1xuXHR2YXIgZml4ZWRDc3MgPSBjc3MucmVwbGFjZSgvdXJsXFxzKlxcKCgoPzpbXikoXXxcXCgoPzpbXikoXSt8XFwoW14pKF0qXFwpKSpcXCkpKilcXCkvZ2ksIGZ1bmN0aW9uKGZ1bGxNYXRjaCwgb3JpZ1VybCkge1xuXHRcdC8vIHN0cmlwIHF1b3RlcyAoaWYgdGhleSBleGlzdClcblx0XHR2YXIgdW5xdW90ZWRPcmlnVXJsID0gb3JpZ1VybFxuXHRcdFx0LnRyaW0oKVxuXHRcdFx0LnJlcGxhY2UoL15cIiguKilcIiQvLCBmdW5jdGlvbihvLCAkMSl7IHJldHVybiAkMTsgfSlcblx0XHRcdC5yZXBsYWNlKC9eJyguKiknJC8sIGZ1bmN0aW9uKG8sICQxKXsgcmV0dXJuICQxOyB9KTtcblxuXHRcdC8vIGFscmVhZHkgYSBmdWxsIHVybD8gbm8gY2hhbmdlXG5cdFx0aWYgKC9eKCN8ZGF0YTp8aHR0cDpcXC9cXC98aHR0cHM6XFwvXFwvfGZpbGU6XFwvXFwvXFwvKS9pLnRlc3QodW5xdW90ZWRPcmlnVXJsKSkge1xuXHRcdCAgcmV0dXJuIGZ1bGxNYXRjaDtcblx0XHR9XG5cblx0XHQvLyBjb252ZXJ0IHRoZSB1cmwgdG8gYSBmdWxsIHVybFxuXHRcdHZhciBuZXdVcmw7XG5cblx0XHRpZiAodW5xdW90ZWRPcmlnVXJsLmluZGV4T2YoXCIvL1wiKSA9PT0gMCkge1xuXHRcdCAgXHQvL1RPRE86IHNob3VsZCB3ZSBhZGQgcHJvdG9jb2w/XG5cdFx0XHRuZXdVcmwgPSB1bnF1b3RlZE9yaWdVcmw7XG5cdFx0fSBlbHNlIGlmICh1bnF1b3RlZE9yaWdVcmwuaW5kZXhPZihcIi9cIikgPT09IDApIHtcblx0XHRcdC8vIHBhdGggc2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlIHVybFxuXHRcdFx0bmV3VXJsID0gYmFzZVVybCArIHVucXVvdGVkT3JpZ1VybDsgLy8gYWxyZWFkeSBzdGFydHMgd2l0aCAnLydcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gcGF0aCBzaG91bGQgYmUgcmVsYXRpdmUgdG8gY3VycmVudCBkaXJlY3Rvcnlcblx0XHRcdG5ld1VybCA9IGN1cnJlbnREaXIgKyB1bnF1b3RlZE9yaWdVcmwucmVwbGFjZSgvXlxcLlxcLy8sIFwiXCIpOyAvLyBTdHJpcCBsZWFkaW5nICcuLydcblx0XHR9XG5cblx0XHQvLyBzZW5kIGJhY2sgdGhlIGZpeGVkIHVybCguLi4pXG5cdFx0cmV0dXJuIFwidXJsKFwiICsgSlNPTi5zdHJpbmdpZnkobmV3VXJsKSArIFwiKVwiO1xuXHR9KTtcblxuXHQvLyBzZW5kIGJhY2sgdGhlIGZpeGVkIGNzc1xuXHRyZXR1cm4gZml4ZWRDc3M7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2xpYi91cmxzLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvbGliL3VybHMuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwidmFyIHNjb3BlID0gKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsKSB8fFxuICAgICAgICAgICAgKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGYpIHx8XG4gICAgICAgICAgICB3aW5kb3c7XG52YXIgYXBwbHkgPSBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHk7XG5cbi8vIERPTSBBUElzLCBmb3IgY29tcGxldGVuZXNzXG5cbmV4cG9ydHMuc2V0VGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRUaW1lb3V0LCBzY29wZSwgYXJndW1lbnRzKSwgY2xlYXJUaW1lb3V0KTtcbn07XG5leHBvcnRzLnNldEludGVydmFsID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldEludGVydmFsLCBzY29wZSwgYXJndW1lbnRzKSwgY2xlYXJJbnRlcnZhbCk7XG59O1xuZXhwb3J0cy5jbGVhclRpbWVvdXQgPVxuZXhwb3J0cy5jbGVhckludGVydmFsID0gZnVuY3Rpb24odGltZW91dCkge1xuICBpZiAodGltZW91dCkge1xuICAgIHRpbWVvdXQuY2xvc2UoKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gVGltZW91dChpZCwgY2xlYXJGbikge1xuICB0aGlzLl9pZCA9IGlkO1xuICB0aGlzLl9jbGVhckZuID0gY2xlYXJGbjtcbn1cblRpbWVvdXQucHJvdG90eXBlLnVucmVmID0gVGltZW91dC5wcm90b3R5cGUucmVmID0gZnVuY3Rpb24oKSB7fTtcblRpbWVvdXQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX2NsZWFyRm4uY2FsbChzY29wZSwgdGhpcy5faWQpO1xufTtcblxuLy8gRG9lcyBub3Qgc3RhcnQgdGhlIHRpbWUsIGp1c3Qgc2V0cyB1cCB0aGUgbWVtYmVycyBuZWVkZWQuXG5leHBvcnRzLmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0sIG1zZWNzKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSBtc2Vjcztcbn07XG5cbmV4cG9ydHMudW5lbnJvbGwgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSAtMTtcbn07XG5cbmV4cG9ydHMuX3VucmVmQWN0aXZlID0gZXhwb3J0cy5hY3RpdmUgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcblxuICB2YXIgbXNlY3MgPSBpdGVtLl9pZGxlVGltZW91dDtcbiAgaWYgKG1zZWNzID49IDApIHtcbiAgICBpdGVtLl9pZGxlVGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiBvblRpbWVvdXQoKSB7XG4gICAgICBpZiAoaXRlbS5fb25UaW1lb3V0KVxuICAgICAgICBpdGVtLl9vblRpbWVvdXQoKTtcbiAgICB9LCBtc2Vjcyk7XG4gIH1cbn07XG5cbi8vIHNldGltbWVkaWF0ZSBhdHRhY2hlcyBpdHNlbGYgdG8gdGhlIGdsb2JhbCBvYmplY3RcbnJlcXVpcmUoXCJzZXRpbW1lZGlhdGVcIik7XG4vLyBPbiBzb21lIGV4b3RpYyBlbnZpcm9ubWVudHMsIGl0J3Mgbm90IGNsZWFyIHdoaWNoIG9iamVjdCBgc2V0aW1tZWRpYXRlYCB3YXNcbi8vIGFibGUgdG8gaW5zdGFsbCBvbnRvLiAgU2VhcmNoIGVhY2ggcG9zc2liaWxpdHkgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlXG4vLyBgc2V0aW1tZWRpYXRlYCBsaWJyYXJ5LlxuZXhwb3J0cy5zZXRJbW1lZGlhdGUgPSAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZi5zZXRJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbC5zZXRJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICh0aGlzICYmIHRoaXMuc2V0SW1tZWRpYXRlKTtcbmV4cG9ydHMuY2xlYXJJbW1lZGlhdGUgPSAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZi5jbGVhckltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwuY2xlYXJJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgJiYgdGhpcy5jbGVhckltbWVkaWF0ZSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy90aW1lcnMtYnJvd3NlcmlmeS9tYWluLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy90aW1lcnMtYnJvd3NlcmlmeS9tYWluLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXHJcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXHJcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcblxyXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXHJcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcclxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcclxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cclxuXHJcblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xyXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIGlmIChlLmluZGV4T2YocFtpXSkgPCAwKVxyXG4gICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHJlc3VsdC52YWx1ZSk7IH0pLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0geVtvcFswXSAmIDIgPyBcInJldHVyblwiIDogb3BbMF0gPyBcInRocm93XCIgOiBcIm5leHRcIl0pICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gWzAsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBleHBvcnRzKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmICghZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7ICB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAob1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKSB8fCAoMSxldmFsKShcInRoaXNcIik7XG59IGNhdGNoKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIilcblx0XHRnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAod2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3dlYnBhY2svYnVpbGRpbi9nbG9iYWwuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwibnVsbFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9tZW51LWl0ZW0vTWVudUl0ZW0udHMiLCIvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXG4vLyBsb2FkIHRoZSBzdHlsZXNcbnZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWRlY29yYXRvci1sb2FkZXIvaW5kZXguanMhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tMTAtMyEuLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvbGliL2luZGV4LmpzPz9wb3N0Y3NzIS4uLy4uL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kdHMtbG9hZGVyL2luZGV4LmpzP3R5cGU9Y3NzIS4vbWVudUl0ZW0ubS5jc3NcIik7XG5pZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcbi8vIFByZXBhcmUgY3NzVHJhbnNmb3JtYXRpb25cbnZhciB0cmFuc2Zvcm07XG5cbnZhciBvcHRpb25zID0ge1wiaG1yXCI6dHJ1ZX1cbm9wdGlvbnMudHJhbnNmb3JtID0gdHJhbnNmb3JtXG4vLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG52YXIgdXBkYXRlID0gcmVxdWlyZShcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2xpYi9hZGRTdHlsZXMuanNcIikoY29udGVudCwgb3B0aW9ucyk7XG5pZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcbi8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcbmlmKG1vZHVsZS5ob3QpIHtcblx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kZWNvcmF0b3ItbG9hZGVyL2luZGV4LmpzIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTEwLTMhLi4vLi4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL2xpYi9pbmRleC5qcz8/cG9zdGNzcyEuLi8uLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZHRzLWxvYWRlci9pbmRleC5qcz90eXBlPWNzcyEuL21lbnVJdGVtLm0uY3NzXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZGVjb3JhdG9yLWxvYWRlci9pbmRleC5qcyEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS0xMC0zIS4uLy4uL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9saWIvaW5kZXguanM/P3Bvc3Rjc3MhLi4vLi4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWR0cy1sb2FkZXIvaW5kZXguanM/dHlwZT1jc3MhLi9tZW51SXRlbS5tLmNzc1wiKTtcblx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdH0pO1xuXHR9XG5cdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG59XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvbWVudS1pdGVtL21lbnVJdGVtLm0uY3NzXG4vLyBtb2R1bGUgaWQgPSAuL3NyYy9tZW51LWl0ZW0vbWVudUl0ZW0ubS5jc3Ncbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwibnVsbFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9tZW51L01lbnUudHMiLCIvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXG4vLyBsb2FkIHRoZSBzdHlsZXNcbnZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWRlY29yYXRvci1sb2FkZXIvaW5kZXguanMhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tMTAtMyEuLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvbGliL2luZGV4LmpzPz9wb3N0Y3NzIS4uLy4uL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kdHMtbG9hZGVyL2luZGV4LmpzP3R5cGU9Y3NzIS4vbWVudS5tLmNzc1wiKTtcbmlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuLy8gUHJlcGFyZSBjc3NUcmFuc2Zvcm1hdGlvblxudmFyIHRyYW5zZm9ybTtcblxudmFyIG9wdGlvbnMgPSB7XCJobXJcIjp0cnVlfVxub3B0aW9ucy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1cbi8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cbnZhciB1cGRhdGUgPSByZXF1aXJlKFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvbGliL2FkZFN0eWxlcy5qc1wiKShjb250ZW50LCBvcHRpb25zKTtcbmlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuLy8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuaWYobW9kdWxlLmhvdCkge1xuXHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWRlY29yYXRvci1sb2FkZXIvaW5kZXguanMhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tMTAtMyEuLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvbGliL2luZGV4LmpzPz9wb3N0Y3NzIS4uLy4uL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kdHMtbG9hZGVyL2luZGV4LmpzP3R5cGU9Y3NzIS4vbWVudS5tLmNzc1wiLCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWRlY29yYXRvci1sb2FkZXIvaW5kZXguanMhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tMTAtMyEuLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvbGliL2luZGV4LmpzPz9wb3N0Y3NzIS4uLy4uL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kdHMtbG9hZGVyL2luZGV4LmpzP3R5cGU9Y3NzIS4vbWVudS5tLmNzc1wiKTtcblx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdH0pO1xuXHR9XG5cdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG59XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvbWVudS9tZW51Lm0uY3NzXG4vLyBtb2R1bGUgaWQgPSAuL3NyYy9tZW51L21lbnUubS5jc3Ncbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiaW1wb3J0ICcuL21lbnUtaXRlbS9NZW51SXRlbSc7XG5pbXBvcnQgJy4vbWVudS9NZW51JztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kdHMtbG9hZGVyP3R5cGU9dHMmaW5zdGFuY2VOYW1lPTBfY3VzdG9tLWVsZW1lbnRzIS4vdGVzdHMvdW5pdC9hbGwudHMiLCJjb25zdCB7IGRlc2NyaWJlLCBpdCB9ID0gaW50ZXJuLmdldEludGVyZmFjZSgnYmRkJyk7XG5pbXBvcnQgaGFybmVzcyBmcm9tICdAZG9qby9mcmFtZXdvcmsvdGVzdGluZy9oYXJuZXNzJztcblxuaW1wb3J0IHsgdiB9IGZyb20gJ0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kJztcblxuaW1wb3J0IHsgTWVudUl0ZW0gfSBmcm9tICcuLi8uLi8uLi9zcmMvbWVudS1pdGVtL01lbnVJdGVtJztcbmltcG9ydCAqIGFzIGNzcyBmcm9tICcuLi8uLi8uLi9zcmMvbWVudS1pdGVtL21lbnVJdGVtLm0uY3NzJztcblxuZGVzY3JpYmUoJ01lbnVJdGVtJywgKCkgPT4ge1xuXHRpdCgnc2hvdWxkIHJlbmRlciB3aWRnZXQnLCAoKSA9PiB7XG5cdFx0Y29uc3QgdGVzdE1lbnVJdGVtID0gaGFybmVzcyhNZW51SXRlbSk7XG5cdFx0Y29uc3Qgc2VsZWN0ZWQgPSB0cnVlO1xuXHRcdGNvbnN0IHRpdGxlID0gJ01lbnUgSXRlbSc7XG5cdFx0dGVzdE1lbnVJdGVtLnNldFByb3BlcnRpZXMoeyBzZWxlY3RlZCwgdGl0bGUgfSk7XG5cdFx0dGVzdE1lbnVJdGVtLmV4cGVjdFJlbmRlcihcblx0XHRcdHYoJ2xpJywgeyBjbGFzc2VzOiBjc3Mucm9vdCB9LCBbXG5cdFx0XHRcdHYoXG5cdFx0XHRcdFx0J3NwYW4nLFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNsYXNzZXM6IFtjc3MuaXRlbSwgY3NzLnNlbGVjdGVkXSxcblx0XHRcdFx0XHRcdG9uY2xpY2s6IHRlc3RNZW51SXRlbS5saXN0ZW5lclxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0W3RpdGxlXVxuXHRcdFx0XHQpXG5cdFx0XHRdKVxuXHRcdCk7XG5cdH0pO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZHRzLWxvYWRlcj90eXBlPXRzJmluc3RhbmNlTmFtZT0wX2N1c3RvbS1lbGVtZW50cyEuL3Rlc3RzL3VuaXQvbWVudS1pdGVtL01lbnVJdGVtLnRzIiwiY29uc3QgeyBkZXNjcmliZSwgaXQgfSA9IGludGVybi5nZXRJbnRlcmZhY2UoJ2JkZCcpO1xuaW1wb3J0IGhhcm5lc3MgZnJvbSAnQGRvam8vZnJhbWV3b3JrL3Rlc3RpbmcvaGFybmVzcyc7XG5cbmltcG9ydCB7IHYgfSBmcm9tICdAZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZCc7XG5cbmltcG9ydCB7IE1lbnUgfSBmcm9tICcuLi8uLi8uLi9zcmMvbWVudS9NZW51JztcbmltcG9ydCAqIGFzIGNzcyBmcm9tICcuLi8uLi8uLi9zcmMvbWVudS9tZW51Lm0uY3NzJztcblxuZGVzY3JpYmUoJ01lbnUnLCAoKSA9PiB7XG5cdGl0KCdzaG91bGQgcmVuZGVyIHdpZGdldCcsICgpID0+IHtcblx0XHRjb25zdCB0ZXN0TWVudSA9IGhhcm5lc3MoTWVudSk7XG5cdFx0dGVzdE1lbnUuZXhwZWN0UmVuZGVyKHYoJ25hdicsIHsgY2xhc3NlczogY3NzLnJvb3QgfSwgW3YoJ29sJywgeyBjbGFzc2VzOiBjc3MubWVudUNvbnRhaW5lciB9KV0pKTtcblx0fSk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kdHMtbG9hZGVyP3R5cGU9dHMmaW5zdGFuY2VOYW1lPTBfY3VzdG9tLWVsZW1lbnRzIS4vdGVzdHMvdW5pdC9tZW51L01lbnUudHMiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/test-app/fixtures/windows/dev/menu-item/menu-item-1.0.0.js b/test-app/fixtures/windows/dev/menu-item/menu-item-1.0.0.js index 996b186..9f75ff6 100644 --- a/test-app/fixtures/windows/dev/menu-item/menu-item-1.0.0.js +++ b/test-app/fixtures/windows/dev/menu-item/menu-item-1.0.0.js @@ -73,19 +73,19 @@ /************************************************************************/ /******/ ({ -/***/ "./node_modules/@dojo/core/Destroyable.mjs": +/***/ "./node_modules/@dojo/framework/core/Destroyable.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__lang__ = __webpack_require__("./node_modules/@dojo/core/lang.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Promise__ = __webpack_require__("./node_modules/@dojo/shim/Promise.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__lang__ = __webpack_require__("./node_modules/@dojo/framework/core/lang.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__shim_Promise__ = __webpack_require__("./node_modules/@dojo/framework/shim/Promise.mjs"); /** * No operation function to replace own once instance is destoryed */ function noop() { - return __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Promise__["a" /* default */].resolve(false); + return __WEBPACK_IMPORTED_MODULE_1__shim_Promise__["a" /* default */].resolve(false); } /** * No op function used to replace own, once instance has been destoryed @@ -123,7 +123,7 @@ class Destroyable { * @returns {Promise { + return new __WEBPACK_IMPORTED_MODULE_1__shim_Promise__["a" /* default */]((resolve) => { this.handles.forEach((handle) => { handle && handle.destroy && handle.destroy(); }); @@ -140,19 +140,19 @@ class Destroyable { /***/ }), -/***/ "./node_modules/@dojo/core/Evented.mjs": +/***/ "./node_modules/@dojo/framework/core/Evented.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export isGlobMatch */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__ = __webpack_require__("./node_modules/@dojo/shim/Map.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Destroyable__ = __webpack_require__("./node_modules/@dojo/core/Destroyable.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_Map__ = __webpack_require__("./node_modules/@dojo/framework/shim/Map.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Destroyable__ = __webpack_require__("./node_modules/@dojo/framework/core/Destroyable.mjs"); /** * Map of computed regular expressions, keyed by string */ -const regexMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */](); +const regexMap = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["b" /* default */](); /** * Determines is the event type glob has been matched * @@ -183,12 +183,12 @@ class Evented extends __WEBPACK_IMPORTED_MODULE_1__Destroyable__["a" /* Destroya /** * map of listeners keyed by event type */ - this.listenersMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */](); + this.listenersMap = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["b" /* default */](); } emit(event) { this.listenersMap.forEach((methods, type) => { if (isGlobMatch(type, event.type)) { - methods.forEach((method) => { + [...methods].forEach((method) => { method.call(this, event); }); } @@ -224,7 +224,7 @@ class Evented extends __WEBPACK_IMPORTED_MODULE_1__Destroyable__["a" /* Destroya /***/ }), -/***/ "./node_modules/@dojo/core/lang.mjs": +/***/ "./node_modules/@dojo/framework/core/lang.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -238,8 +238,8 @@ class Evented extends __WEBPACK_IMPORTED_MODULE_1__Destroyable__["a" /* Destroya /* unused harmony export partial */ /* unused harmony export createHandle */ /* harmony export (immutable) */ __webpack_exports__["b"] = createCompositeHandle; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_object__ = __webpack_require__("./node_modules/@dojo/shim/object.mjs"); -/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return __WEBPACK_IMPORTED_MODULE_0__dojo_shim_object__["a"]; }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_object__ = __webpack_require__("./node_modules/@dojo/framework/shim/object.mjs"); +/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return __WEBPACK_IMPORTED_MODULE_0__shim_object__["a"]; }); const slice = Array.prototype.slice; @@ -317,7 +317,7 @@ function create(prototype, ...mixins) { } const args = mixins.slice(); args.unshift(Object.create(prototype)); - return __WEBPACK_IMPORTED_MODULE_0__dojo_shim_object__["a" /* assign */].apply(null, args); + return __WEBPACK_IMPORTED_MODULE_0__shim_object__["a" /* assign */].apply(null, args); } function deepAssign(target, ...sources) { return _mixin({ @@ -439,7 +439,7 @@ function createCompositeHandle(...handles) { /***/ }), -/***/ "./node_modules/@dojo/has/has.mjs": +/***/ "./node_modules/@dojo/framework/has/has.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -652,16 +652,16 @@ add('host-node', function () { /***/ }), -/***/ "./node_modules/@dojo/shim/Map.mjs": +/***/ "./node_modules/@dojo/framework/shim/Map.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Map; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__iterator__ = __webpack_require__("./node_modules/@dojo/shim/iterator.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__object__ = __webpack_require__("./node_modules/@dojo/shim/object.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__iterator__ = __webpack_require__("./node_modules/@dojo/framework/shim/iterator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__object__ = __webpack_require__("./node_modules/@dojo/framework/shim/object.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); @@ -761,15 +761,15 @@ var _a; /***/ }), -/***/ "./node_modules/@dojo/shim/Promise.mjs": +/***/ "./node_modules/@dojo/framework/shim/Promise.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export ShimPromise */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__support_queue__ = __webpack_require__("./node_modules/@dojo/shim/support/queue.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__support_queue__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/queue.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); @@ -974,15 +974,15 @@ var _a; /***/ }), -/***/ "./node_modules/@dojo/shim/Symbol.mjs": +/***/ "./node_modules/@dojo/framework/shim/Symbol.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export Symbol */ /* unused harmony export isSymbol */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__support_util__ = __webpack_require__("./node_modules/@dojo/shim/support/util.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__support_util__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/util.mjs"); @@ -1131,15 +1131,15 @@ function isSymbol(value) { /***/ }), -/***/ "./node_modules/@dojo/shim/WeakMap.mjs": +/***/ "./node_modules/@dojo/framework/shim/WeakMap.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export WeakMap */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__iterator__ = __webpack_require__("./node_modules/@dojo/shim/iterator.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__iterator__ = __webpack_require__("./node_modules/@dojo/framework/shim/iterator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); @@ -1254,7 +1254,7 @@ if (false) { /***/ }), -/***/ "./node_modules/@dojo/shim/array.mjs": +/***/ "./node_modules/@dojo/framework/shim/array.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -1265,11 +1265,11 @@ if (false) { /* unused harmony export find */ /* unused harmony export findIndex */ /* unused harmony export includes */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__iterator__ = __webpack_require__("./node_modules/@dojo/shim/iterator.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__number__ = __webpack_require__("./node_modules/@dojo/shim/number.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__support_util__ = __webpack_require__("./node_modules/@dojo/shim/support/util.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__iterator__ = __webpack_require__("./node_modules/@dojo/framework/shim/iterator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__number__ = __webpack_require__("./node_modules/@dojo/framework/shim/number.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__support_util__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/util.mjs"); @@ -1521,7 +1521,7 @@ else { /***/ }), -/***/ "./node_modules/@dojo/shim/global.mjs": +/***/ "./node_modules/@dojo/framework/shim/global.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -1547,7 +1547,7 @@ else { /***/ }), -/***/ "./node_modules/@dojo/shim/iterator.mjs": +/***/ "./node_modules/@dojo/framework/shim/iterator.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -1555,8 +1555,8 @@ else { /* unused harmony export isArrayLike */ /* unused harmony export get */ /* unused harmony export forOf */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__string__ = __webpack_require__("./node_modules/@dojo/shim/string.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__string__ = __webpack_require__("./node_modules/@dojo/framework/shim/string.mjs"); const staticDone = { done: true, value: undefined }; @@ -1673,7 +1673,7 @@ function forOf(iterable, callback, thisArg) { /***/ }), -/***/ "./node_modules/@dojo/shim/number.mjs": +/***/ "./node_modules/@dojo/framework/shim/number.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -1681,7 +1681,7 @@ function forOf(iterable, callback, thisArg) { /* unused harmony export isFinite */ /* unused harmony export isInteger */ /* unused harmony export isSafeInteger */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); /** * The smallest interval between two representable numbers. @@ -1745,7 +1745,7 @@ function isSafeInteger(value) { /***/ }), -/***/ "./node_modules/@dojo/shim/object.mjs": +/***/ "./node_modules/@dojo/framework/shim/object.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -1758,9 +1758,9 @@ function isSafeInteger(value) { /* unused harmony export getOwnPropertyDescriptors */ /* unused harmony export entries */ /* unused harmony export values */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); @@ -1875,7 +1875,7 @@ else { /***/ }), -/***/ "./node_modules/@dojo/shim/string.mjs": +/***/ "./node_modules/@dojo/framework/shim/string.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -1889,9 +1889,9 @@ else { /* unused harmony export startsWith */ /* unused harmony export padEnd */ /* unused harmony export padStart */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__support_util__ = __webpack_require__("./node_modules/@dojo/shim/support/util.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__support_util__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/util.mjs"); @@ -2200,33 +2200,33 @@ else { /***/ }), -/***/ "./node_modules/@dojo/shim/support/has.mjs": +/***/ "./node_modules/@dojo/framework/shim/support/has.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_has_has__ = __webpack_require__("./node_modules/@dojo/has/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__has_has__ = __webpack_require__("./node_modules/@dojo/framework/has/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); /* unused harmony reexport namespace */ -/* unused harmony default export */ var _unused_webpack_default_export = (__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["b" /* default */]); +/* unused harmony default export */ var _unused_webpack_default_export = (__WEBPACK_IMPORTED_MODULE_0__has_has__["b" /* default */]); /* ECMAScript 6 and 7 Features */ /* Array */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-array', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-array', () => { return (['from', 'of'].every((key) => key in __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Array) && ['findIndex', 'find', 'copyWithin'].every((key) => key in __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Array.prototype)); }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-array-fill', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-array-fill', () => { if ('fill' in __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Array.prototype) { /* Some versions of Safari do not properly implement this */ return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1; } return false; }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es7-array', () => 'includes' in __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Array.prototype, true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es7-array', () => 'includes' in __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Array.prototype, true); /* Map */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-map', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-map', () => { if (typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Map === 'function') { /* IE11 and older versions of Safari are missing critical ES6 Map functionality @@ -2249,7 +2249,7 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-map', () return false; }, true); /* Math */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-math', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-math', () => { return [ 'clz32', 'sign', @@ -2269,7 +2269,7 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-math', ( 'hypot' ].every((name) => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Math[name] === 'function'); }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-math-imul', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-math-imul', () => { if ('imul' in __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Math) { /* Some versions of Safari on ios do not properly implement this */ return Math.imul(0xffffffff, 5) === -5; @@ -2277,19 +2277,19 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-math-imu return false; }, true); /* Object */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-object', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-object', () => { return true && ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Object[name] === 'function'); }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es2017-object', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es2017-object', () => { return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Object[name] === 'function'); }, true); /* Observable */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es-observable', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Observable !== 'undefined', true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es-observable', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Observable !== 'undefined', true); /* Promise */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-promise', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Promise !== 'undefined' && true, true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-promise', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Promise !== 'undefined' && true, true); /* Set */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-set', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-set', () => { if (typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Set === 'function') { /* IE11 and older versions of Safari are missing critical ES6 Set functionality */ const set = new __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Set([1]); @@ -2298,7 +2298,7 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-set', () return false; }, true); /* String */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-string', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-string', () => { return ([ /* static methods */ 'fromCodePoint' @@ -2313,7 +2313,7 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-string', 'includes' ].every((key) => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].String.prototype[key] === 'function')); }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-string-raw', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-string-raw', () => { function getCallSite(callSite, ...substitutions) { const result = [...callSite]; result.raw = callSite.raw; @@ -2328,13 +2328,13 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-string-r } return false; }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es2017-string', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es2017-string', () => { return ['padStart', 'padEnd'].every((key) => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].String.prototype[key] === 'function'); }, true); /* Symbol */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-symbol', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Symbol !== 'undefined' && typeof Symbol() === 'symbol', true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-symbol', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Symbol !== 'undefined' && typeof Symbol() === 'symbol', true); /* WeakMap */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-weakmap', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-weakmap', () => { if (typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].WeakMap !== 'undefined') { /* IE11 and older versions of Safari are missing critical ES6 Map functionality */ const key1 = {}; @@ -2346,16 +2346,16 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-weakmap' return false; }, true); /* Miscellaneous features */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('microtasks', () => true || false || true, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('postmessage', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('microtasks', () => true || false || true, true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('postmessage', () => { // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist. return typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].window !== 'undefined' && typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].postMessage === 'function'; }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('raf', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].requestAnimationFrame === 'function', true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('setimmediate', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].setImmediate !== 'undefined', true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('raf', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].requestAnimationFrame === 'function', true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('setimmediate', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].setImmediate !== 'undefined', true); /* DOM Features */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('dom-mutationobserver', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('dom-mutationobserver', () => { if (true && Boolean(__WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].MutationObserver || __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].WebKitMutationObserver)) { // IE11 has an unreliable MutationObserver implementation where setProperty() does not // generate a mutation event, observers can crash, and the queue does not drain @@ -2371,18 +2371,18 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('dom-mutation } return false; }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('dom-webanimation', () => true && __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Animation !== undefined && __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].KeyframeEffect !== undefined, true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('dom-webanimation', () => true && __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Animation !== undefined && __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].KeyframeEffect !== undefined, true); //# sourceMappingURL=has.mjs.map /***/ }), -/***/ "./node_modules/@dojo/shim/support/queue.mjs": +/***/ "./node_modules/@dojo/framework/shim/support/queue.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export queueMicroTask */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); function executeTask(item) { @@ -2576,7 +2576,7 @@ let queueMicroTask = (function () { /***/ }), -/***/ "./node_modules/@dojo/shim/support/util.mjs": +/***/ "./node_modules/@dojo/framework/shim/support/util.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -2608,13 +2608,13 @@ function wrapNative(nativeFunction) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/Injector.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/Injector.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__ = __webpack_require__("./node_modules/@dojo/core/Evented.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__core_Evented__ = __webpack_require__("./node_modules/@dojo/framework/core/Evented.mjs"); -class Injector extends __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__["a" /* Evented */] { +class Injector extends __WEBPACK_IMPORTED_MODULE_0__core_Evented__["a" /* Evented */] { constructor(payload) { super(); this._payload = payload; @@ -2639,13 +2639,13 @@ class Injector extends __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__["a" /* E /***/ }), -/***/ "./node_modules/@dojo/widget-core/NodeHandler.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export NodeEventType */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__ = __webpack_require__("./node_modules/@dojo/core/Evented.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Map__ = __webpack_require__("./node_modules/@dojo/shim/Map.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__core_Evented__ = __webpack_require__("./node_modules/@dojo/framework/core/Evented.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__shim_Map__ = __webpack_require__("./node_modules/@dojo/framework/shim/Map.mjs"); /** @@ -2658,10 +2658,10 @@ var NodeEventType; NodeEventType["Projector"] = "Projector"; NodeEventType["Widget"] = "Widget"; })(NodeEventType || (NodeEventType = {})); -class NodeHandler extends __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__["a" /* Evented */] { +class NodeHandler extends __WEBPACK_IMPORTED_MODULE_0__core_Evented__["a" /* Evented */] { constructor() { super(...arguments); - this._nodeMap = new __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Map__["b" /* default */](); + this._nodeMap = new __WEBPACK_IMPORTED_MODULE_1__shim_Map__["b" /* default */](); } get(key) { return this._nodeMap.get(key); @@ -2690,16 +2690,16 @@ class NodeHandler extends __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__["a" / /***/ }), -/***/ "./node_modules/@dojo/widget-core/Registry.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/Registry.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["d"] = isWidgetBaseConstructor; /* unused harmony export isWidgetConstructorDefaultExport */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Promise__ = __webpack_require__("./node_modules/@dojo/shim/Promise.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Map__ = __webpack_require__("./node_modules/@dojo/shim/Map.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__dojo_shim_Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__ = __webpack_require__("./node_modules/@dojo/core/Evented.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_Promise__ = __webpack_require__("./node_modules/@dojo/framework/shim/Promise.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__shim_Map__ = __webpack_require__("./node_modules/@dojo/framework/shim/Map.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__shim_Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__core_Evented__ = __webpack_require__("./node_modules/@dojo/framework/core/Evented.mjs"); @@ -2707,7 +2707,7 @@ class NodeHandler extends __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__["a" / /** * Widget base symbol type */ -const WIDGET_BASE_TYPE = Object(__WEBPACK_IMPORTED_MODULE_2__dojo_shim_Symbol__["a" /* default */])('Widget Base'); +const WIDGET_BASE_TYPE = Object(__WEBPACK_IMPORTED_MODULE_2__shim_Symbol__["a" /* default */])('Widget Base'); /* harmony export (immutable) */ __webpack_exports__["b"] = WIDGET_BASE_TYPE; /** @@ -2728,7 +2728,7 @@ function isWidgetConstructorDefaultExport(item) { /** * The Registry implementation */ -class Registry extends __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__["a" /* Evented */] { +class Registry extends __WEBPACK_IMPORTED_MODULE_3__core_Evented__["a" /* Evented */] { /** * Emit loaded event for registry label */ @@ -2741,13 +2741,13 @@ class Registry extends __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__["a" /* E } define(label, item) { if (this._widgetRegistry === undefined) { - this._widgetRegistry = new __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Map__["b" /* default */](); + this._widgetRegistry = new __WEBPACK_IMPORTED_MODULE_1__shim_Map__["b" /* default */](); } if (this._widgetRegistry.has(label)) { throw new Error(`widget has already been registered for '${label.toString()}'`); } this._widgetRegistry.set(label, item); - if (item instanceof __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Promise__["a" /* default */]) { + if (item instanceof __WEBPACK_IMPORTED_MODULE_0__shim_Promise__["a" /* default */]) { item.then((widgetCtor) => { this._widgetRegistry.set(label, widgetCtor); this.emitLoadedEvent(label, widgetCtor); @@ -2762,12 +2762,12 @@ class Registry extends __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__["a" /* E } defineInjector(label, injectorFactory) { if (this._injectorRegistry === undefined) { - this._injectorRegistry = new __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Map__["b" /* default */](); + this._injectorRegistry = new __WEBPACK_IMPORTED_MODULE_1__shim_Map__["b" /* default */](); } if (this._injectorRegistry.has(label)) { throw new Error(`injector has already been registered for '${label.toString()}'`); } - const invalidator = new __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__["a" /* Evented */](); + const invalidator = new __WEBPACK_IMPORTED_MODULE_3__core_Evented__["a" /* Evented */](); const injectorItem = { injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })), invalidator @@ -2783,7 +2783,7 @@ class Registry extends __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__["a" /* E if (isWidgetBaseConstructor(item)) { return item; } - if (item instanceof __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Promise__["a" /* default */]) { + if (item instanceof __WEBPACK_IMPORTED_MODULE_0__shim_Promise__["a" /* default */]) { return null; } const promise = item(); @@ -2820,22 +2820,22 @@ class Registry extends __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__["a" /* E /***/ }), -/***/ "./node_modules/@dojo/widget-core/RegistryHandler.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__ = __webpack_require__("./node_modules/@dojo/shim/Map.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_core_Evented__ = __webpack_require__("./node_modules/@dojo/core/Evented.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Registry__ = __webpack_require__("./node_modules/@dojo/widget-core/Registry.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_Map__ = __webpack_require__("./node_modules/@dojo/framework/shim/Map.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__core_Evented__ = __webpack_require__("./node_modules/@dojo/framework/core/Evented.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Registry__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.mjs"); -class RegistryHandler extends __WEBPACK_IMPORTED_MODULE_1__dojo_core_Evented__["a" /* Evented */] { +class RegistryHandler extends __WEBPACK_IMPORTED_MODULE_1__core_Evented__["a" /* Evented */] { constructor() { super(); this._registry = new __WEBPACK_IMPORTED_MODULE_2__Registry__["a" /* Registry */](); - this._registryWidgetLabelMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["a" /* Map */](); - this._registryInjectorLabelMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["a" /* Map */](); + this._registryWidgetLabelMap = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["a" /* Map */](); + this._registryInjectorLabelMap = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["a" /* Map */](); this.own(this._registry); const destroy = () => { if (this.baseRegistry) { @@ -2904,19 +2904,19 @@ class RegistryHandler extends __WEBPACK_IMPORTED_MODULE_1__dojo_core_Evented__[" /***/ }), -/***/ "./node_modules/@dojo/widget-core/WidgetBase.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__ = __webpack_require__("./node_modules/@dojo/shim/Map.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_shim_WeakMap__ = __webpack_require__("./node_modules/@dojo/shim/WeakMap.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__dojo_shim_Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__d__ = __webpack_require__("./node_modules/@dojo/widget-core/d.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__diff__ = __webpack_require__("./node_modules/@dojo/widget-core/diff.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__RegistryHandler__ = __webpack_require__("./node_modules/@dojo/widget-core/RegistryHandler.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__NodeHandler__ = __webpack_require__("./node_modules/@dojo/widget-core/NodeHandler.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__vdom__ = __webpack_require__("./node_modules/@dojo/widget-core/vdom.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__Registry__ = __webpack_require__("./node_modules/@dojo/widget-core/Registry.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_Map__ = __webpack_require__("./node_modules/@dojo/framework/shim/Map.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__shim_WeakMap__ = __webpack_require__("./node_modules/@dojo/framework/shim/WeakMap.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__shim_Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__d__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__diff__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/diff.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__RegistryHandler__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__NodeHandler__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/NodeHandler.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__vdom__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/vdom.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__Registry__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.mjs"); @@ -2926,9 +2926,9 @@ class RegistryHandler extends __WEBPACK_IMPORTED_MODULE_1__dojo_core_Evented__[" -const decoratorMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */](); +const decoratorMap = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["b" /* default */](); const boundAuto = __WEBPACK_IMPORTED_MODULE_4__diff__["a" /* auto */].bind(null); -const noBind = __WEBPACK_IMPORTED_MODULE_2__dojo_shim_Symbol__["a" /* default */].for('dojoNoBind'); +const noBind = __WEBPACK_IMPORTED_MODULE_2__shim_Symbol__["a" /* default */].for('dojoNoBind'); /* harmony export (immutable) */ __webpack_exports__["b"] = noBind; /** @@ -2950,7 +2950,7 @@ class WidgetBase { this._nodeHandler = new __WEBPACK_IMPORTED_MODULE_6__NodeHandler__["a" /* default */](); this._handles = []; this._children = []; - this._decoratorCache = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */](); + this._decoratorCache = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["b" /* default */](); this._properties = {}; this._boundRenderFunc = this.render.bind(this); this._boundInvalidate = this.invalidate.bind(this); @@ -2975,7 +2975,7 @@ class WidgetBase { } meta(MetaType) { if (this._metaMap === undefined) { - this._metaMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */](); + this._metaMap = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["b" /* default */](); } let cached = this._metaMap.get(MetaType); if (!cached) { @@ -3059,9 +3059,14 @@ class WidgetBase { } } if (runReactions) { - this._mapDiffPropertyReactions(properties, changedPropertyKeys).forEach((args, reaction) => { - if (args.changed) { - reaction.call(this, args.previousProperties, args.newProperties); + const reactionFunctions = this.getDecorator('diffReaction'); + const executedReactions = []; + reactionFunctions.forEach(({ reaction, propertyName }) => { + const propertyChanged = changedPropertyKeys.indexOf(propertyName) !== -1; + const reactionRun = executedReactions.indexOf(reaction) !== -1; + if (propertyChanged && !reactionRun) { + reaction.call(this, this._properties, diffPropertyResults); + executedReactions.push(reaction); } }); } @@ -3124,7 +3129,7 @@ class WidgetBase { if (this.hasOwnProperty('constructor')) { let decoratorList = decoratorMap.get(this.constructor); if (!decoratorList) { - decoratorList = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */](); + decoratorList = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["b" /* default */](); decoratorMap.set(this.constructor, decoratorList); } let specificDecoratorList = decoratorList.get(decoratorKey); @@ -3176,26 +3181,6 @@ class WidgetBase { this._decoratorCache.set(decoratorKey, allDecorators); return allDecorators; } - _mapDiffPropertyReactions(newProperties, changedPropertyKeys) { - const reactionFunctions = this.getDecorator('diffReaction'); - return reactionFunctions.reduce((reactionPropertyMap, { reaction, propertyName }) => { - let reactionArguments = reactionPropertyMap.get(reaction); - if (reactionArguments === undefined) { - reactionArguments = { - previousProperties: {}, - newProperties: {}, - changed: false - }; - } - reactionArguments.previousProperties[propertyName] = this._properties[propertyName]; - reactionArguments.newProperties[propertyName] = newProperties[propertyName]; - if (changedPropertyKeys.indexOf(propertyName) !== -1) { - reactionArguments.changed = true; - } - reactionPropertyMap.set(reaction, reactionArguments); - return reactionPropertyMap; - }, new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */]()); - } /** * Binds unbound property functions to the specified `bind` property * @@ -3204,7 +3189,7 @@ class WidgetBase { _bindFunctionProperty(property, bind) { if (typeof property === 'function' && !property[noBind] && Object(__WEBPACK_IMPORTED_MODULE_8__Registry__["d" /* isWidgetBaseConstructor */])(property) === false) { if (this._bindFunctionPropertyMap === undefined) { - this._bindFunctionPropertyMap = new __WEBPACK_IMPORTED_MODULE_1__dojo_shim_WeakMap__["a" /* default */](); + this._bindFunctionPropertyMap = new __WEBPACK_IMPORTED_MODULE_1__shim_WeakMap__["a" /* default */](); } const bindInfo = this._bindFunctionPropertyMap.get(property) || {}; let { boundFunc, scope } = bindInfo; @@ -3258,7 +3243,7 @@ class WidgetBase { runAfterRenders(dNode) { const afterRenders = this.getDecorator('afterRender'); if (afterRenders.length > 0) { - return afterRenders.reduce((dNode, afterRenderFunction) => { + dNode = afterRenders.reduce((dNode, afterRenderFunction) => { return afterRenderFunction.call(this, dNode); }, dNode); } @@ -3298,7 +3283,7 @@ WidgetBase._type = __WEBPACK_IMPORTED_MODULE_8__Registry__["b" /* WIDGET_BASE_TY /***/ }), -/***/ "./node_modules/@dojo/widget-core/animations/cssTransitions.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -3368,7 +3353,7 @@ function enter(node, properties, enterAnimation) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/d.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/d.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -3380,24 +3365,24 @@ function enter(node, properties, enterAnimation) { /* harmony export (immutable) */ __webpack_exports__["h"] = w; /* harmony export (immutable) */ __webpack_exports__["g"] = v; /* harmony export (immutable) */ __webpack_exports__["c"] = dom; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); /** * The symbol identifier for a WNode type */ -const WNODE = Object(__WEBPACK_IMPORTED_MODULE_0__dojo_shim_Symbol__["a" /* default */])('Identifier for a WNode.'); +const WNODE = Object(__WEBPACK_IMPORTED_MODULE_0__shim_Symbol__["a" /* default */])('Identifier for a WNode.'); /* harmony export (immutable) */ __webpack_exports__["b"] = WNODE; /** * The symbol identifier for a VNode type */ -const VNODE = Object(__WEBPACK_IMPORTED_MODULE_0__dojo_shim_Symbol__["a" /* default */])('Identifier for a VNode.'); +const VNODE = Object(__WEBPACK_IMPORTED_MODULE_0__shim_Symbol__["a" /* default */])('Identifier for a VNode.'); /* harmony export (immutable) */ __webpack_exports__["a"] = VNODE; /** * The symbol identifier for a VNode type created using dom() */ -const DOMVNODE = Object(__WEBPACK_IMPORTED_MODULE_0__dojo_shim_Symbol__["a" /* default */])('Identifier for a VNode created using existing dom.'); +const DOMVNODE = Object(__WEBPACK_IMPORTED_MODULE_0__shim_Symbol__["a" /* default */])('Identifier for a VNode created using existing dom.'); /* unused harmony export DOMVNODE */ /** @@ -3499,12 +3484,12 @@ function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, child /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/afterRender.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = afterRender; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"); function afterRender(method) { return Object(__WEBPACK_IMPORTED_MODULE_0__handleDecorator__["a" /* handleDecorator */])((target, propertyKey) => { @@ -3516,13 +3501,13 @@ function afterRender(method) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = alwaysRender; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__beforeProperties__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__beforeProperties__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs"); function alwaysRender() { @@ -3537,12 +3522,12 @@ function alwaysRender() { /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = beforeProperties; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"); function beforeProperties(method) { return Object(__WEBPACK_IMPORTED_MODULE_0__handleDecorator__["a" /* handleDecorator */])((target, propertyKey) => { @@ -3554,13 +3539,13 @@ function beforeProperties(method) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/customElement.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = customElement; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__registerCustomElement__ = __webpack_require__("./node_modules/@dojo/widget-core/registerCustomElement.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Registry__ = __webpack_require__("./node_modules/@dojo/widget-core/Registry.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__registerCustomElement__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Registry__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.mjs"); /** @@ -3584,12 +3569,14 @@ function customElement({ tag, properties = [], attributes = [], events = [], chi /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = diffProperty; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__diff__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/diff.mjs"); + /** * Decorator that can be used to register a function as a specific property diff @@ -3598,7 +3585,7 @@ function customElement({ tag, properties = [], attributes = [], events = [], chi * @param diffType The diff type, default is DiffType.AUTO. * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM */ -function diffProperty(propertyName, diffFunction, reactionFunction) { +function diffProperty(propertyName, diffFunction = __WEBPACK_IMPORTED_MODULE_1__diff__["a" /* auto */], reactionFunction) { return Object(__WEBPACK_IMPORTED_MODULE_0__handleDecorator__["a" /* handleDecorator */])((target, propertyKey) => { target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null)); target.addDecorator('registeredDiffProperty', propertyName); @@ -3615,7 +3602,7 @@ function diffProperty(propertyName, diffFunction, reactionFunction) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -3641,21 +3628,21 @@ function handleDecorator(handler) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/inject.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = inject; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_WeakMap__ = __webpack_require__("./node_modules/@dojo/shim/WeakMap.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__handleDecorator__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__beforeProperties__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_WeakMap__ = __webpack_require__("./node_modules/@dojo/framework/shim/WeakMap.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__handleDecorator__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__beforeProperties__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs"); /** * Map of instances against registered injectors. */ -const registeredInjectorsMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_WeakMap__["a" /* default */](); +const registeredInjectorsMap = new __WEBPACK_IMPORTED_MODULE_0__shim_WeakMap__["a" /* default */](); /** * Decorator retrieves an injector from an available registry using the name and * calls the `getProperties` function with the payload from the injector @@ -3689,7 +3676,7 @@ function inject({ name, getProperties }) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/diff.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/diff.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -3698,7 +3685,7 @@ function inject({ name, getProperties }) { /* unused harmony export reference */ /* harmony export (immutable) */ __webpack_exports__["b"] = shallow; /* harmony export (immutable) */ __webpack_exports__["a"] = auto; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Registry__ = __webpack_require__("./node_modules/@dojo/widget-core/Registry.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Registry__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.mjs"); function isObjectOrArray(value) { return Object.prototype.toString.call(value) === '[object Object]' || Array.isArray(value); @@ -3768,7 +3755,7 @@ function auto(previousProperty, newProperty) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/mixins/Projector.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -3776,11 +3763,11 @@ function auto(previousProperty, newProperty) { /* unused harmony export AttachType */ /* harmony export (immutable) */ __webpack_exports__["a"] = ProjectorMixin; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_core_lang__ = __webpack_require__("./node_modules/@dojo/core/lang.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__animations_cssTransitions__ = __webpack_require__("./node_modules/@dojo/widget-core/animations/cssTransitions.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__decorators_afterRender__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/afterRender.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__d__ = __webpack_require__("./node_modules/@dojo/widget-core/d.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__vdom__ = __webpack_require__("./node_modules/@dojo/widget-core/vdom.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__core_lang__ = __webpack_require__("./node_modules/@dojo/framework/core/lang.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__animations_cssTransitions__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__decorators_afterRender__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__d__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__vdom__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/vdom.mjs"); @@ -3878,7 +3865,7 @@ function ProjectorMixin(Base) { this._projectorProperties.registry.destroy(); } } - this._projectorProperties = Object(__WEBPACK_IMPORTED_MODULE_1__dojo_core_lang__["a" /* assign */])({}, properties); + this._projectorProperties = Object(__WEBPACK_IMPORTED_MODULE_1__core_lang__["a" /* assign */])({}, properties); super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry }); super.__setProperties__(properties); } @@ -3929,10 +3916,7 @@ function ProjectorMixin(Base) { } } __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __decorate */]([ - Object(__WEBPACK_IMPORTED_MODULE_3__decorators_afterRender__["a" /* afterRender */])(), - __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __metadata */]("design:type", Function), - __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __metadata */]("design:paramtypes", [Object]), - __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __metadata */]("design:returntype", void 0) + Object(__WEBPACK_IMPORTED_MODULE_3__decorators_afterRender__["a" /* afterRender */])() ], Projector.prototype, "afterRender", null); return Projector; } @@ -3941,7 +3925,7 @@ function ProjectorMixin(Base) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/mixins/Themed.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -3949,11 +3933,11 @@ function ProjectorMixin(Base) { /* harmony export (immutable) */ __webpack_exports__["b"] = registerThemeInjector; /* harmony export (immutable) */ __webpack_exports__["a"] = ThemedMixin; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Injector__ = __webpack_require__("./node_modules/@dojo/widget-core/Injector.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__decorators_inject__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/inject.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__decorators_handleDecorator__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/diffProperty.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__diff__ = __webpack_require__("./node_modules/@dojo/widget-core/diff.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Injector__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/Injector.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__decorators_inject__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/inject.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__decorators_handleDecorator__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__diff__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/diff.mjs"); @@ -4066,7 +4050,7 @@ function ThemedMixin(Base) { const baseThemes = this.getDecorator('baseThemeClasses'); if (!this._registeredBaseTheme) { this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => { - const _a = THEME_KEY, key = baseTheme[_a], classes = __WEBPACK_IMPORTED_MODULE_0_tslib__["c" /* __rest */](baseTheme, [typeof _a === "symbol" ? _a : _a + ""]); + const _a = THEME_KEY, key = baseTheme[_a], classes = __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __rest */](baseTheme, [typeof _a === "symbol" ? _a : _a + ""]); this._registeredBaseThemeKeys.push(key); return Object.assign({}, finalBaseTheme, classes); }, {}); @@ -4080,10 +4064,7 @@ function ThemedMixin(Base) { }; __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __decorate */]([ Object(__WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__["a" /* diffProperty */])('theme', __WEBPACK_IMPORTED_MODULE_5__diff__["b" /* shallow */]), - Object(__WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__["a" /* diffProperty */])('extraClasses', __WEBPACK_IMPORTED_MODULE_5__diff__["b" /* shallow */]), - __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __metadata */]("design:type", Function), - __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __metadata */]("design:paramtypes", []), - __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __metadata */]("design:returntype", void 0) + Object(__WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__["a" /* diffProperty */])('extraClasses', __WEBPACK_IMPORTED_MODULE_5__diff__["b" /* shallow */]) ], Themed.prototype, "onPropertiesChanged", null); Themed = __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __decorate */]([ Object(__WEBPACK_IMPORTED_MODULE_2__decorators_inject__["a" /* inject */])({ @@ -4103,7 +4084,7 @@ function ThemedMixin(Base) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/registerCustomElement.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -4113,13 +4094,13 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony export (immutable) */ __webpack_exports__["create"] = create; /* harmony export (immutable) */ __webpack_exports__["register"] = register; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__WidgetBase__ = __webpack_require__("./node_modules/@dojo/widget-core/WidgetBase.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mixins_Projector__ = __webpack_require__("./node_modules/@dojo/widget-core/mixins/Projector.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__dojo_shim_array__ = __webpack_require__("./node_modules/@dojo/shim/array.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__d__ = __webpack_require__("./node_modules/@dojo/widget-core/d.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__mixins_Themed__ = __webpack_require__("./node_modules/@dojo/widget-core/mixins/Themed.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__decorators_alwaysRender__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__WidgetBase__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/WidgetBase.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mixins_Projector__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__shim_array__ = __webpack_require__("./node_modules/@dojo/framework/shim/array.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__d__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__shim_global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__mixins_Themed__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__decorators_alwaysRender__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs"); @@ -4216,7 +4197,7 @@ function create(descriptor, WidgetConstructor) { }); Object.defineProperties(this, domProperties); const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children; - Object(__WEBPACK_IMPORTED_MODULE_3__dojo_shim_array__["a" /* from */])(children).forEach((childNode) => { + Object(__WEBPACK_IMPORTED_MODULE_3__shim_array__["a" /* from */])(children).forEach((childNode) => { if (childType === CustomElementChildType.DOJO) { childNode.addEventListener('dojo-ce-render', () => this._render()); childNode.addEventListener('dojo-ce-connected', () => this._render()); @@ -4236,7 +4217,7 @@ function create(descriptor, WidgetConstructor) { }; const registry = registryFactory(); const themeContext = Object(__WEBPACK_IMPORTED_MODULE_6__mixins_Themed__["b" /* registerThemeInjector */])(this._getTheme(), registry); - __WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */].addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme())); + __WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */].addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme())); const Projector = Object(__WEBPACK_IMPORTED_MODULE_2__mixins_Projector__["a" /* ProjectorMixin */])(Wrapper); this._projector = new Projector(); this._projector.setProperties({ registry }); @@ -4248,8 +4229,8 @@ function create(descriptor, WidgetConstructor) { })); } _getTheme() { - if (__WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */] && __WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */].dojoce && __WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */].dojoce.theme) { - return __WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */].dojoce.themes[__WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */].dojoce.theme]; + if (__WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */] && __WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */].dojoce && __WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */].dojoce.theme) { + return __WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */].dojoce.themes[__WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */].dojoce.theme]; } } _childConnected(e) { @@ -4329,25 +4310,25 @@ function register(WidgetConstructor) { if (!descriptor) { throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?'); } - __WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */].customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor)); + __WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */].customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor)); } /* harmony default export */ __webpack_exports__["default"] = (register); //# sourceMappingURL=registerCustomElement.mjs.map /***/ }), -/***/ "./node_modules/@dojo/widget-core/vdom.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/vdom.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export toParentVNode */ /* unused harmony export toTextVNode */ /* unused harmony export filterAndDecorateChildren */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_shim_array__ = __webpack_require__("./node_modules/@dojo/shim/array.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__d__ = __webpack_require__("./node_modules/@dojo/widget-core/d.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Registry__ = __webpack_require__("./node_modules/@dojo/widget-core/Registry.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__ = __webpack_require__("./node_modules/@dojo/shim/WeakMap.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__shim_array__ = __webpack_require__("./node_modules/@dojo/framework/shim/array.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__d__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Registry__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__ = __webpack_require__("./node_modules/@dojo/framework/shim/WeakMap.mjs"); @@ -4357,11 +4338,13 @@ const NAMESPACE_W3 = 'http://www.w3.org/'; const NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg'; const NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink'; const emptyArray = []; -const widgetInstanceMap = new __WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__["a" /* default */](); +const nodeOperations = ['focus', 'blur', 'scrollIntoView', 'click']; +const widgetInstanceMap = new __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__["a" /* default */](); /* harmony export (immutable) */ __webpack_exports__["b"] = widgetInstanceMap; -const instanceMap = new __WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__["a" /* default */](); -const projectorStateMap = new __WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__["a" /* default */](); +const instanceMap = new __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__["a" /* default */](); +const nextSiblingMap = new __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__["a" /* default */](); +const projectorStateMap = new __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__["a" /* default */](); function same(dnode1, dnode2) { if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["e" /* isVNode */])(dnode1) && Object(__WEBPACK_IMPORTED_MODULE_2__d__["e" /* isVNode */])(dnode2)) { if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["d" /* isDomVNode */])(dnode1) || Object(__WEBPACK_IMPORTED_MODULE_2__d__["d" /* isDomVNode */])(dnode2)) { @@ -4418,7 +4401,7 @@ function checkStyleValue(styleValue) { } function updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) { const projectorState = projectorStateMap.get(projectionOptions.projectorInstance); - const eventMap = projectorState.nodeMap.get(domNode) || new __WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__["a" /* default */](); + const eventMap = projectorState.nodeMap.get(domNode) || new __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__["a" /* default */](); if (previousValue) { const previousEvent = eventMap.get(previousValue); domNode.removeEventListener(eventName, previousEvent); @@ -4478,7 +4461,7 @@ function buildPreviousProperties(domNode, previous, current) { }, {}); return newProperties; } -function focusNode(propValue, previousValue, domNode, projectionOptions) { +function nodeOperation(propName, propValue, previousValue, domNode, projectionOptions) { let result; if (typeof propValue === 'function') { result = propValue(); @@ -4489,7 +4472,7 @@ function focusNode(propValue, previousValue, domNode, projectionOptions) { if (result === true) { const projectorState = projectorStateMap.get(projectionOptions.projectorInstance); projectorState.deferredRenderCallbacks.push(() => { - domNode.focus(); + domNode[propName](); }); } } @@ -4585,8 +4568,8 @@ function updateProperties(domNode, previousProperties, properties, projectionOpt } } } - else if (propName === 'focus') { - focusNode(propValue, previousValue, domNode, projectionOptions); + else if (nodeOperations.indexOf(propName) !== -1) { + nodeOperation(propName, propValue, previousValue, domNode, projectionOptions); } else if (propName === 'styles') { const styleNames = Object.keys(propValue); @@ -4740,7 +4723,8 @@ function nodeAdded(dnode, transitions) { } function nodeToRemove(dnode, transitions, projectionOptions) { if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["f" /* isWNode */])(dnode)) { - const rendered = dnode.rendered || emptyArray; + const item = instanceMap.get(dnode.instance); + const rendered = (item ? item.dnode.rendered : dnode.rendered) || emptyArray; if (dnode.instance) { const instanceData = widgetInstanceMap.get(dnode.instance); instanceData.onDetach(); @@ -4804,7 +4788,7 @@ function checkDistinguishable(childNodes, indexToCheck, parentInstance) { } } } -function updateChildren(parentVNode, oldChildren, newChildren, parentInstance, projectionOptions) { +function updateChildren(parentVNode, siblings, oldChildren, newChildren, parentInstance, projectionOptions) { oldChildren = oldChildren || emptyArray; newChildren = newChildren; const oldChildrenLength = oldChildren.length; @@ -4824,38 +4808,49 @@ function updateChildren(parentVNode, oldChildren, newChildren, parentInstance, p addDeferredProperties(newChild, projectionOptions); } if (oldChild !== undefined && same(oldChild, newChild)) { - textUpdated = updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance) || textUpdated; oldIndex++; newIndex++; + textUpdated = + updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance, oldChildren.slice(oldIndex), newChildren.slice(newIndex)) || textUpdated; continue; } const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1); const addChild = () => { let insertBeforeDomNode = undefined; + let childrenArray = oldChildren; + let nextIndex = oldIndex + 1; let child = oldChildren[oldIndex]; + if (!child) { + child = siblings[0]; + nextIndex = 1; + childrenArray = siblings; + } if (child) { - let nextIndex = oldIndex + 1; let insertBeforeChildren = [child]; while (insertBeforeChildren.length) { const insertBefore = insertBeforeChildren.shift(); if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["f" /* isWNode */])(insertBefore)) { - if (insertBefore.rendered) { - insertBeforeChildren.push(...insertBefore.rendered); + const item = instanceMap.get(insertBefore.instance); + if (item && item.dnode.rendered) { + insertBeforeChildren.push(...item.dnode.rendered); } } else { if (insertBefore.domNode) { + if (insertBefore.domNode.parentElement !== parentVNode.domNode) { + break; + } insertBeforeDomNode = insertBefore.domNode; break; } } - if (insertBeforeChildren.length === 0 && oldChildren[nextIndex]) { - insertBeforeChildren.push(oldChildren[nextIndex]); + if (insertBeforeChildren.length === 0 && childrenArray[nextIndex]) { + insertBeforeChildren.push(childrenArray[nextIndex]); nextIndex++; } } } - createDom(newChild, parentVNode, insertBeforeDomNode, projectionOptions, parentInstance); + createDom(newChild, parentVNode, newChildren.slice(newIndex + 1), insertBeforeDomNode, projectionOptions, parentInstance); nodeAdded(newChild, transitions); const indexToCheck = newIndex; projectorState.afterRenderCallbacks.push(() => { @@ -4916,12 +4911,13 @@ function addChildren(parentVNode, children, projectionOptions, parentInstance, i } const projectorState = projectorStateMap.get(projectionOptions.projectorInstance); if (projectorState.merge && childNodes === undefined) { - childNodes = Object(__WEBPACK_IMPORTED_MODULE_1__dojo_shim_array__["a" /* from */])(parentVNode.domNode.childNodes); + childNodes = Object(__WEBPACK_IMPORTED_MODULE_1__shim_array__["a" /* from */])(parentVNode.domNode.childNodes); } const transitions = projectionOptions.transitions; projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 }); for (let i = 0; i < children.length; i++) { const child = children[i]; + const nextSiblings = children.slice(i + 1); if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["e" /* isVNode */])(child)) { if (projectorState.merge && childNodes) { let domElement = undefined; @@ -4932,10 +4928,10 @@ function addChildren(parentVNode, children, projectionOptions, parentInstance, i } } } - createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance); + createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance); } else { - createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes); + createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes); } nodeAdded(child, transitions); } @@ -4963,7 +4959,7 @@ function initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOpt } dnode.inserted = true; } -function createDom(dnode, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes) { +function createDom(dnode, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes) { let domNode; const projectorState = projectorStateMap.get(projectionOptions.projectorInstance); if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["f" /* isWNode */])(dnode)) { @@ -4978,6 +4974,7 @@ function createDom(dnode, parentVNode, insertBefore, projectionOptions, parentIn } const instance = new widgetConstructor(); dnode.instance = instance; + nextSiblingMap.set(instance, nextSiblings); const instanceData = widgetInstanceMap.get(instance); instanceData.invalidate = () => { instanceData.dirty = true; @@ -5058,7 +5055,7 @@ function createDom(dnode, parentVNode, insertBefore, projectionOptions, parentIn } } } -function updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance) { +function updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance, oldNextSiblings, nextSiblings) { if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["f" /* isWNode */])(dnode)) { const { instance } = previous; const { parentVNode, dnode: node } = instanceMap.get(instance); @@ -5068,12 +5065,13 @@ function updateDom(previous, dnode, projectionOptions, parentVNode, parentInstan instance.__setCoreProperties__(dnode.coreProperties); instance.__setChildren__(dnode.children); instance.__setProperties__(dnode.properties); + nextSiblingMap.set(instance, nextSiblings); dnode.instance = instance; if (instanceData.dirty === true) { const rendered = instance.__render__(); instanceData.rendering = false; dnode.rendered = filterAndDecorateChildren(rendered, instance); - updateChildren(parentVNode, previousRendered, dnode.rendered, instance, projectionOptions); + updateChildren(parentVNode, oldNextSiblings, previousRendered, dnode.rendered, instance, projectionOptions); } else { instanceData.rendering = false; @@ -5106,7 +5104,7 @@ function updateDom(previous, dnode, projectionOptions, parentVNode, parentInstan const children = filterAndDecorateChildren(dnode.children, parentInstance); dnode.children = children; updated = - updateChildren(dnode, previous.children, children, parentInstance, projectionOptions) || updated; + updateChildren(dnode, oldNextSiblings, previous.children, children, parentInstance, projectionOptions) || updated; } const previousProperties = buildPreviousProperties(domNode, previous, dnode); if (dnode.attributes && dnode.events) { @@ -5156,7 +5154,7 @@ function runDeferredRenderCallbacks(projectionOptions) { } } else { - __WEBPACK_IMPORTED_MODULE_0__dojo_shim_global__["a" /* default */].requestAnimationFrame(() => { + __WEBPACK_IMPORTED_MODULE_0__shim_global__["a" /* default */].requestAnimationFrame(() => { while (projectorState.deferredRenderCallbacks.length) { const callback = projectorState.deferredRenderCallbacks.shift(); callback && callback(); @@ -5174,8 +5172,8 @@ function runAfterRenderCallbacks(projectionOptions) { } } else { - if (__WEBPACK_IMPORTED_MODULE_0__dojo_shim_global__["a" /* default */].requestIdleCallback) { - __WEBPACK_IMPORTED_MODULE_0__dojo_shim_global__["a" /* default */].requestIdleCallback(() => { + if (__WEBPACK_IMPORTED_MODULE_0__shim_global__["a" /* default */].requestIdleCallback) { + __WEBPACK_IMPORTED_MODULE_0__shim_global__["a" /* default */].requestIdleCallback(() => { while (projectorState.afterRenderCallbacks.length) { const callback = projectorState.afterRenderCallbacks.shift(); callback && callback(); @@ -5198,7 +5196,7 @@ function scheduleRender(projectionOptions) { render(projectionOptions); } else if (projectorState.renderScheduled === undefined) { - projectorState.renderScheduled = __WEBPACK_IMPORTED_MODULE_0__dojo_shim_global__["a" /* default */].requestAnimationFrame(() => { + projectorState.renderScheduled = __WEBPACK_IMPORTED_MODULE_0__shim_global__["a" /* default */].requestAnimationFrame(() => { render(projectionOptions); }); } @@ -5217,7 +5215,8 @@ function render(projectionOptions) { previouslyRendered.push(instance); const { parentVNode, dnode } = instanceMap.get(instance); const instanceData = widgetInstanceMap.get(instance); - updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance); + const nextSiblings = nextSiblingMap.get(instance); + updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance, nextSiblings, nextSiblings); } } runAfterRenderCallbacks(projectionOptions); @@ -5230,7 +5229,7 @@ const dom = { const projectorState = { afterRenderCallbacks: [], deferredRenderCallbacks: [], - nodeMap: new __WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__["a" /* default */](), + nodeMap: new __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__["a" /* default */](), renderScheduled: undefined, renderQueue: [], merge: projectionOptions.merge || false, @@ -5248,7 +5247,7 @@ const dom = { scheduleRender(finalProjectorOptions); } }; - updateDom(node, node, finalProjectorOptions, parentVNode, instance); + updateDom(node, node, finalProjectorOptions, parentVNode, instance, [], []); projectorState.afterRenderCallbacks.push(() => { instanceData.onAttach(); }); @@ -5282,7 +5281,7 @@ const dom = { /*** IMPORTS FROM imports-loader ***/ var widgetFactory = __webpack_require__("./src/menu-item/MenuItem.ts"); -var registerCustomElement = __webpack_require__("./node_modules/@dojo/widget-core/registerCustomElement.mjs").default; +var registerCustomElement = __webpack_require__("./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs").default; var defaultExport = widgetFactory.default; defaultExport && registerCustomElement(defaultExport); @@ -5488,10 +5487,10 @@ process.umask = function() { return 0; }; "use strict"; /* unused harmony export __extends */ /* unused harmony export __assign */ -/* harmony export (immutable) */ __webpack_exports__["c"] = __rest; +/* harmony export (immutable) */ __webpack_exports__["b"] = __rest; /* harmony export (immutable) */ __webpack_exports__["a"] = __decorate; /* unused harmony export __param */ -/* harmony export (immutable) */ __webpack_exports__["b"] = __metadata; +/* unused harmony export __metadata */ /* unused harmony export __awaiter */ /* unused harmony export __generator */ /* unused harmony export __exportStar */ @@ -5708,10 +5707,10 @@ module.exports = g; Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MenuItem", function() { return MenuItem; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_widget_core_d__ = __webpack_require__("./node_modules/@dojo/widget-core/d.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__dojo_widget_core_decorators_customElement__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/customElement.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__dojo_widget_core_mixins_Themed__ = __webpack_require__("./node_modules/@dojo/widget-core/mixins/Themed.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__dojo_widget_core_WidgetBase__ = __webpack_require__("./node_modules/@dojo/widget-core/WidgetBase.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_framework_widget_core_d__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__dojo_framework_widget_core_decorators_customElement__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__dojo_framework_widget_core_mixins_Themed__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__dojo_framework_widget_core_WidgetBase__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/WidgetBase.mjs"); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__menuItem_m_css__ = __webpack_require__("./src/menu-item/menuItem.m.css"); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__menuItem_m_css___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5__menuItem_m_css__); @@ -5720,14 +5719,14 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); -let MenuItem = class MenuItem extends Object(__WEBPACK_IMPORTED_MODULE_3__dojo_widget_core_mixins_Themed__["a" /* ThemedMixin */])(__WEBPACK_IMPORTED_MODULE_4__dojo_widget_core_WidgetBase__["a" /* WidgetBase */]) { +let MenuItem = class MenuItem extends Object(__WEBPACK_IMPORTED_MODULE_3__dojo_framework_widget_core_mixins_Themed__["a" /* ThemedMixin */])(__WEBPACK_IMPORTED_MODULE_4__dojo_framework_widget_core_WidgetBase__["a" /* WidgetBase */]) { _onClick() { this.properties.onSelected && this.properties.onSelected(this.properties.data); } render() { const { title, selected } = this.properties; - return Object(__WEBPACK_IMPORTED_MODULE_1__dojo_widget_core_d__["g" /* v */])('li', { classes: this.theme(__WEBPACK_IMPORTED_MODULE_5__menuItem_m_css__["root"]) }, [ - Object(__WEBPACK_IMPORTED_MODULE_1__dojo_widget_core_d__["g" /* v */])('span', { + return Object(__WEBPACK_IMPORTED_MODULE_1__dojo_framework_widget_core_d__["g" /* v */])('li', { classes: this.theme(__WEBPACK_IMPORTED_MODULE_5__menuItem_m_css__["root"]) }, [ + Object(__WEBPACK_IMPORTED_MODULE_1__dojo_framework_widget_core_d__["g" /* v */])('span', { classes: this.theme([__WEBPACK_IMPORTED_MODULE_5__menuItem_m_css__["item"], selected ? __WEBPACK_IMPORTED_MODULE_5__menuItem_m_css__["selected"] : null]), onclick: this._onClick }, [title]) @@ -5735,13 +5734,13 @@ let MenuItem = class MenuItem extends Object(__WEBPACK_IMPORTED_MODULE_3__dojo_w } }; MenuItem = __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __decorate */]([ - Object(__WEBPACK_IMPORTED_MODULE_2__dojo_widget_core_decorators_customElement__["a" /* customElement */])({ + Object(__WEBPACK_IMPORTED_MODULE_2__dojo_framework_widget_core_decorators_customElement__["a" /* customElement */])({ tag: 'demo-menu-item', attributes: ['title', 'selected'], events: ['onSelected'], properties: ['data', 'selected'] }), - Object(__WEBPACK_IMPORTED_MODULE_3__dojo_widget_core_mixins_Themed__["c" /* theme */])(__WEBPACK_IMPORTED_MODULE_5__menuItem_m_css__) + Object(__WEBPACK_IMPORTED_MODULE_3__dojo_framework_widget_core_mixins_Themed__["c" /* theme */])(__WEBPACK_IMPORTED_MODULE_5__menuItem_m_css__) ], MenuItem); /* harmony default export */ __webpack_exports__["default"] = (MenuItem); @@ -5766,4 +5765,4 @@ module.exports = __webpack_require__("./node_modules/imports-loader/index.js?wid /***/ }) /******/ }));; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgYjc5NDY0NmU4ZDE5YjUwOTczZGYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2NvcmUvRGVzdHJveWFibGUubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9jb3JlL0V2ZW50ZWQubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9jb3JlL2xhbmcubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9oYXMvaGFzLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9NYXAubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL1Byb21pc2UubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL1N5bWJvbC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vV2Vha01hcC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vYXJyYXkubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL2dsb2JhbC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vaXRlcmF0b3IubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL251bWJlci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vb2JqZWN0Lm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdHJpbmcubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL3N1cHBvcnQvaGFzLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdXBwb3J0L3F1ZXVlLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdXBwb3J0L3V0aWwubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9JbmplY3Rvci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL05vZGVIYW5kbGVyLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvUmVnaXN0cnkubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9SZWdpc3RyeUhhbmRsZXIubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9XaWRnZXRCYXNlLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvYW5pbWF0aW9ucy9jc3NUcmFuc2l0aW9ucy5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2QubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2FmdGVyUmVuZGVyLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9hbHdheXNSZW5kZXIubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2JlZm9yZVByb3BlcnRpZXMubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2N1c3RvbUVsZW1lbnQubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2RpZmZQcm9wZXJ0eS5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaGFuZGxlRGVjb3JhdG9yLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9pbmplY3QubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kaWZmLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvbWl4aW5zL1Byb2plY3Rvci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL21peGlucy9UaGVtZWQubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9yZWdpc3RlckN1c3RvbUVsZW1lbnQubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS92ZG9tLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vY2xpLWJ1aWxkLXdpZGdldC90ZW1wbGF0ZS9jdXN0b20tZWxlbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbWVudS1pdGVtL01lbnVJdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9tZW51LWl0ZW0vbWVudUl0ZW0ubS5jc3M/NmE5NSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUFzRCwrREFBK0Q7O0FBRXJIO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7QUM3RGdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEIsaUJBQWlCLE9BQU87QUFDeEI7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvQkFBb0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQSx3Qzs7Ozs7Ozs7Ozs7QUN2REE7QUFDc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsZ0NBQWdDO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2RWlCO0FBQ0E7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiwyQkFBMkI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLG9CQUFvQjtBQUMzQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsaUM7Ozs7Ozs7Ozs7OztBQ25NQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLE9BQU8saUJBQWlCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxRQUFRO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRUFBMkUsUUFBUTtBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxnQzs7Ozs7Ozs7Ozs7Ozs7O0FDbk1vQztBQUNwQztBQUN5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLHFCQUFxQjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxZQUFZO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFELFlBQVk7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0M7Ozs7Ozs7Ozs7Ozs7QUMvRkE7QUFDeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsTUFBTTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MsV0FBVztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsTUFBTTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QixxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7Ozs7O0FDdE1BO0FBQ0E7QUFDNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsSUFBSTtBQUNwQixnQkFBZ0IsT0FBTztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxJQUFJO0FBQ2hCLFlBQVksVUFBVTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxtQzs7Ozs7Ozs7Ozs7OztBQ2hKQTtBQUNzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxxQkFBcUI7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGdDQUFnQztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlHQTtBQUNrQztBQUNQO0FBQzNCO0FBQ3FCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3RELG9EQUFvRDtBQUNwRCxpREFBaUQ7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRUFBcUU7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsc0JBQXNCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFlBQVk7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLFNBQVM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0M7Ozs7Ozs7O0FDdlBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG1DOzs7Ozs7Ozs7Ozs7Ozs7QUNqQkE7QUFDaUQ7QUFDakQsb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDOzs7Ozs7Ozs7Ozs7O0FDOUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyREE7QUFDQTtBQUNtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0Q7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLElBQUk7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlHQTtBQUNBO0FBQ3FCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELFlBQVk7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RkFBd0Y7QUFDeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DOzs7Ozs7Ozs7OztBQ3hTbUI7QUFDbkI7MEVBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsRUFBRTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCxFQUFFO0FBQ2pFLG1DQUFtQyxtQkFBbUI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxnQzs7Ozs7Ozs7Ozs7QUNyS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFBQTtBQUFBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4RUFBOEU7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFBQTtBQUFBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsYUFBYSxrQkFBa0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Qzs7Ozs7Ozs7QUNyWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZELGNBQWM7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSw4REFBOEQsZUFBZTtBQUM3RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixxQkFBcUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSxpQkFBaUIsS0FBSztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHFCQUFxQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixxQkFBcUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsMkJBQTJCO0FBQ3REO0FBQ0E7QUFD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RUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLHlEQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMvRCxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVE7YUFDdEIsRUFDRCxDQUFDLEtBQUssQ0FBQyxDQUNQO1NBQ0QsQ0FBQyxDQUFDO0lBQ0osQ0FBQztDQUNEO0FBbkJZLFFBQVE7SUFQcEIseUdBQWEsQ0FBcUI7UUFDbEMsR0FBRyxFQUFFLGdCQUFnQjtRQUNyQixVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDO1FBQ2pDLE1BQU0sRUFBRSxDQUFDLFlBQVksQ0FBQztRQUN0QixVQUFVLEVBQUUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDO0tBQ2hDLENBQUM7SUFDRCxzRkFBSyxDQUFDLDZDQUFHLENBQUM7R0FDRSxRQUFRLENBbUJwQjtBQW5Cb0I7QUFxQnJCLCtEQUFlLFFBQVEsRUFBQzs7Ozs7Ozs7QUMzQ3hCO0FBQ0Esa0JBQWtCLHdJIiwiZmlsZSI6Im1lbnUtaXRlbS0xLjAuMC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIGI3OTQ2NDZlOGQxOWI1MDk3M2RmIiwiaW1wb3J0IHsgY3JlYXRlQ29tcG9zaXRlSGFuZGxlIH0gZnJvbSAnLi9sYW5nJztcbmltcG9ydCBQcm9taXNlIGZyb20gJ0Bkb2pvL3NoaW0vUHJvbWlzZSc7XG4vKipcbiAqIE5vIG9wZXJhdGlvbiBmdW5jdGlvbiB0byByZXBsYWNlIG93biBvbmNlIGluc3RhbmNlIGlzIGRlc3RvcnllZFxuICovXG5mdW5jdGlvbiBub29wKCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xufVxuLyoqXG4gKiBObyBvcCBmdW5jdGlvbiB1c2VkIHRvIHJlcGxhY2Ugb3duLCBvbmNlIGluc3RhbmNlIGhhcyBiZWVuIGRlc3RvcnllZFxuICovXG5mdW5jdGlvbiBkZXN0cm95ZWQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsIG1hZGUgdG8gZGVzdHJveWVkIG1ldGhvZCcpO1xufVxuZXhwb3J0IGNsYXNzIERlc3Ryb3lhYmxlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVzID0gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGhhbmRsZXMgZm9yIHRoZSBpbnN0YW5jZSB0aGF0IHdpbGwgYmUgZGVzdHJveWVkIHdoZW4gYHRoaXMuZGVzdHJveWAgaXMgY2FsbGVkXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hhbmRsZX0gaGFuZGxlIFRoZSBoYW5kbGUgdG8gYWRkIGZvciB0aGUgaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7SGFuZGxlfSBhIGhhbmRsZSBmb3IgdGhlIGhhbmRsZSwgcmVtb3ZlcyB0aGUgaGFuZGxlIGZvciB0aGUgaW5zdGFuY2UgYW5kIGNhbGxzIGRlc3Ryb3lcbiAgICAgKi9cbiAgICBvd24oaGFuZGxlcykge1xuICAgICAgICBjb25zdCBoYW5kbGUgPSBBcnJheS5pc0FycmF5KGhhbmRsZXMpID8gY3JlYXRlQ29tcG9zaXRlSGFuZGxlKC4uLmhhbmRsZXMpIDogaGFuZGxlcztcbiAgICAgICAgY29uc3QgeyBoYW5kbGVzOiBfaGFuZGxlcyB9ID0gdGhpcztcbiAgICAgICAgX2hhbmRsZXMucHVzaChoYW5kbGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgICAgICAgICBfaGFuZGxlcy5zcGxpY2UoX2hhbmRsZXMuaW5kZXhPZihoYW5kbGUpKTtcbiAgICAgICAgICAgICAgICBoYW5kbGUuZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZXN0cnB5cyBhbGwgaGFuZGVycyByZWdpc3RlcmVkIGZvciB0aGUgaW5zdGFuY2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPGFueX0gYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSBhbGwgaGFuZGxlcyBoYXZlIGJlZW4gZGVzdHJveWVkXG4gICAgICovXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZXMuZm9yRWFjaCgoaGFuZGxlKSA9PiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlICYmIGhhbmRsZS5kZXN0cm95ICYmIGhhbmRsZS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveSA9IG5vb3A7XG4gICAgICAgICAgICB0aGlzLm93biA9IGRlc3Ryb3llZDtcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IERlc3Ryb3lhYmxlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVzdHJveWFibGUubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2NvcmUvRGVzdHJveWFibGUubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9jb3JlL0Rlc3Ryb3lhYmxlLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBNYXAgZnJvbSAnQGRvam8vc2hpbS9NYXAnO1xyXG5pbXBvcnQgeyBEZXN0cm95YWJsZSB9IGZyb20gJy4vRGVzdHJveWFibGUnO1xyXG4vKipcclxuICogTWFwIG9mIGNvbXB1dGVkIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIGtleWVkIGJ5IHN0cmluZ1xyXG4gKi9cclxuY29uc3QgcmVnZXhNYXAgPSBuZXcgTWFwKCk7XHJcbi8qKlxyXG4gKiBEZXRlcm1pbmVzIGlzIHRoZSBldmVudCB0eXBlIGdsb2IgaGFzIGJlZW4gbWF0Y2hlZFxyXG4gKlxyXG4gKiBAcmV0dXJucyBib29sZWFuIHRoYXQgaW5kaWNhdGVzIGlmIHRoZSBnbG9iIGlzIG1hdGNoZWRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0dsb2JNYXRjaChnbG9iU3RyaW5nLCB0YXJnZXRTdHJpbmcpIHtcclxuICAgIGlmICh0eXBlb2YgdGFyZ2V0U3RyaW5nID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgZ2xvYlN0cmluZyA9PT0gJ3N0cmluZycgJiYgZ2xvYlN0cmluZy5pbmRleE9mKCcqJykgIT09IC0xKSB7XHJcbiAgICAgICAgbGV0IHJlZ2V4O1xyXG4gICAgICAgIGlmIChyZWdleE1hcC5oYXMoZ2xvYlN0cmluZykpIHtcclxuICAgICAgICAgICAgcmVnZXggPSByZWdleE1hcC5nZXQoZ2xvYlN0cmluZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZWdleCA9IG5ldyBSZWdFeHAoYF4ke2dsb2JTdHJpbmcucmVwbGFjZSgvXFwqL2csICcuKicpfSRgKTtcclxuICAgICAgICAgICAgcmVnZXhNYXAuc2V0KGdsb2JTdHJpbmcsIHJlZ2V4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodGFyZ2V0U3RyaW5nKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBnbG9iU3RyaW5nID09PSB0YXJnZXRTdHJpbmc7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIEV2ZW50IENsYXNzXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRXZlbnRlZCBleHRlbmRzIERlc3Ryb3lhYmxlIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogbWFwIG9mIGxpc3RlbmVycyBrZXllZCBieSBldmVudCB0eXBlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5saXN0ZW5lcnNNYXAgPSBuZXcgTWFwKCk7XHJcbiAgICB9XHJcbiAgICBlbWl0KGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5saXN0ZW5lcnNNYXAuZm9yRWFjaCgobWV0aG9kcywgdHlwZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaXNHbG9iTWF0Y2godHlwZSwgZXZlbnQudHlwZSkpIHtcclxuICAgICAgICAgICAgICAgIG1ldGhvZHMuZm9yRWFjaCgobWV0aG9kKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmNhbGwodGhpcywgZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIG9uKHR5cGUsIGxpc3RlbmVyKSB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGlzdGVuZXIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXMgPSBsaXN0ZW5lci5tYXAoKGxpc3RlbmVyKSA9PiB0aGlzLl9hZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgZGVzdHJveSgpIHtcclxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVzLmZvckVhY2goKGhhbmRsZSkgPT4gaGFuZGxlLmRlc3Ryb3koKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7XHJcbiAgICB9XHJcbiAgICBfYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcclxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyc01hcC5nZXQodHlwZSkgfHwgW107XHJcbiAgICAgICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xyXG4gICAgICAgIHRoaXMubGlzdGVuZXJzTWFwLnNldCh0eXBlLCBsaXN0ZW5lcnMpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGRlc3Ryb3k6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzTWFwLmdldCh0eXBlKSB8fCBbXTtcclxuICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UobGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpLCAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgRXZlbnRlZDtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXZlbnRlZC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vY29yZS9FdmVudGVkLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vY29yZS9FdmVudGVkLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCB7IGFzc2lnbiB9IGZyb20gJ0Bkb2pvL3NoaW0vb2JqZWN0JztcbmV4cG9ydCB7IGFzc2lnbiB9IGZyb20gJ0Bkb2pvL3NoaW0vb2JqZWN0JztcbmNvbnN0IHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuY29uc3QgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuLyoqXG4gKiBUeXBlIGd1YXJkIHRoYXQgZW5zdXJlcyB0aGF0IHRoZSB2YWx1ZSBjYW4gYmUgY29lcmNlZCB0byBPYmplY3RcbiAqIHRvIHdlZWQgb3V0IGhvc3Qgb2JqZWN0cyB0aGF0IGRvIG5vdCBkZXJpdmUgZnJvbSBPYmplY3QuXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2hlY2sgaWYgd2Ugd2FudCB0byBkZWVwIGNvcHkgYW4gb2JqZWN0IG9yIG5vdC5cbiAqIE5vdGU6IEluIEVTNiBpdCBpcyBwb3NzaWJsZSB0byBtb2RpZnkgYW4gb2JqZWN0J3MgU3ltYm9sLnRvU3RyaW5nVGFnIHByb3BlcnR5LCB3aGljaCB3aWxsXG4gKiBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkIGJ5IGB0b1N0cmluZ2AuIFRoaXMgaXMgYSByYXJlIGVkZ2UgY2FzZSB0aGF0IGlzIGRpZmZpY3VsdCB0byBoYW5kbGUsXG4gKiBzbyBpdCBpcyBub3QgaGFuZGxlZCBoZXJlLlxuICogQHBhcmFtICB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm4gICAgICAgSWYgdGhlIHZhbHVlIGlzIGNvZXJjaWJsZSBpbnRvIGFuIE9iamVjdFxuICovXG5mdW5jdGlvbiBzaG91bGREZWVwQ29weU9iamVjdCh2YWx1ZSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJztcbn1cbmZ1bmN0aW9uIGNvcHlBcnJheShhcnJheSwgaW5oZXJpdGVkKSB7XG4gICAgcmV0dXJuIGFycmF5Lm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvcHlBcnJheShpdGVtLCBpbmhlcml0ZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhc2hvdWxkRGVlcENvcHlPYmplY3QoaXRlbSlcbiAgICAgICAgICAgID8gaXRlbVxuICAgICAgICAgICAgOiBfbWl4aW4oe1xuICAgICAgICAgICAgICAgIGRlZXA6IHRydWUsXG4gICAgICAgICAgICAgICAgaW5oZXJpdGVkOiBpbmhlcml0ZWQsXG4gICAgICAgICAgICAgICAgc291cmNlczogW2l0ZW1dLFxuICAgICAgICAgICAgICAgIHRhcmdldDoge31cbiAgICAgICAgICAgIH0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gX21peGluKGt3QXJncykge1xuICAgIGNvbnN0IGRlZXAgPSBrd0FyZ3MuZGVlcDtcbiAgICBjb25zdCBpbmhlcml0ZWQgPSBrd0FyZ3MuaW5oZXJpdGVkO1xuICAgIGNvbnN0IHRhcmdldCA9IGt3QXJncy50YXJnZXQ7XG4gICAgY29uc3QgY29waWVkID0ga3dBcmdzLmNvcGllZCB8fCBbXTtcbiAgICBjb25zdCBjb3BpZWRDbG9uZSA9IFsuLi5jb3BpZWRdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga3dBcmdzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0ga3dBcmdzLnNvdXJjZXNbaV07XG4gICAgICAgIGlmIChzb3VyY2UgPT09IG51bGwgfHwgc291cmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChpbmhlcml0ZWQgfHwgaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoY29waWVkQ2xvbmUuaW5kZXhPZih2YWx1ZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGVlcCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY29weUFycmF5KHZhbHVlLCBpbmhlcml0ZWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNob3VsZERlZXBDb3B5T2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0VmFsdWUgPSB0YXJnZXRba2V5XSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZC5wdXNoKHNvdXJjZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF9taXhpbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0ZWQ6IGluaGVyaXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzOiBbdmFsdWVdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0VmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSwgLi4ubWl4aW5zKSB7XG4gICAgaWYgKCFtaXhpbnMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdsYW5nLmNyZWF0ZSByZXF1aXJlcyBhdCBsZWFzdCBvbmUgbWl4aW4gb2JqZWN0LicpO1xuICAgIH1cbiAgICBjb25zdCBhcmdzID0gbWl4aW5zLnNsaWNlKCk7XG4gICAgYXJncy51bnNoaWZ0KE9iamVjdC5jcmVhdGUocHJvdG90eXBlKSk7XG4gICAgcmV0dXJuIGFzc2lnbi5hcHBseShudWxsLCBhcmdzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWVwQXNzaWduKHRhcmdldCwgLi4uc291cmNlcykge1xuICAgIHJldHVybiBfbWl4aW4oe1xuICAgICAgICBkZWVwOiB0cnVlLFxuICAgICAgICBpbmhlcml0ZWQ6IGZhbHNlLFxuICAgICAgICBzb3VyY2VzOiBzb3VyY2VzLFxuICAgICAgICB0YXJnZXQ6IHRhcmdldFxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBNaXhpbih0YXJnZXQsIC4uLnNvdXJjZXMpIHtcbiAgICByZXR1cm4gX21peGluKHtcbiAgICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgICAgaW5oZXJpdGVkOiB0cnVlLFxuICAgICAgICBzb3VyY2VzOiBzb3VyY2VzLFxuICAgICAgICB0YXJnZXQ6IHRhcmdldFxuICAgIH0pO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG9iamVjdCB1c2luZyB0aGUgcHJvdmlkZWQgc291cmNlJ3MgcHJvdG90eXBlIGFzIHRoZSBwcm90b3R5cGUgZm9yIHRoZSBuZXcgb2JqZWN0LCBhbmQgdGhlblxuICogZGVlcCBjb3BpZXMgdGhlIHByb3ZpZGVkIHNvdXJjZSdzIHZhbHVlcyBpbnRvIHRoZSBuZXcgdGFyZ2V0LlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCB0byBkdXBsaWNhdGVcbiAqIEByZXR1cm4gVGhlIG5ldyBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGR1cGxpY2F0ZShzb3VyY2UpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihzb3VyY2UpKTtcbiAgICByZXR1cm4gZGVlcE1peGluKHRhcmdldCwgc291cmNlKTtcbn1cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHR3byB2YWx1ZXMgYXJlIHRoZSBzYW1lIHZhbHVlLlxuICpcbiAqIEBwYXJhbSBhIEZpcnN0IHZhbHVlIHRvIGNvbXBhcmVcbiAqIEBwYXJhbSBiIFNlY29uZCB2YWx1ZSB0byBjb21wYXJlXG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlcyBhcmUgdGhlIHNhbWU7IGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJZGVudGljYWwoYSwgYikge1xuICAgIHJldHVybiAoYSA9PT0gYiB8fFxuICAgICAgICAvKiBib3RoIHZhbHVlcyBhcmUgTmFOICovXG4gICAgICAgIChhICE9PSBhICYmIGIgIT09IGIpKTtcbn1cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgYmluZHMgYSBtZXRob2QgdG8gdGhlIHNwZWNpZmllZCBvYmplY3QgYXQgcnVudGltZS4gVGhpcyBpcyBzaW1pbGFyIHRvXG4gKiBgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRgLCBidXQgaW5zdGVhZCBvZiBhIGZ1bmN0aW9uIGl0IHRha2VzIHRoZSBuYW1lIG9mIGEgbWV0aG9kIG9uIGFuIG9iamVjdC5cbiAqIEFzIGEgcmVzdWx0LCB0aGUgZnVuY3Rpb24gcmV0dXJuZWQgYnkgYGxhdGVCaW5kYCB3aWxsIGFsd2F5cyBjYWxsIHRoZSBmdW5jdGlvbiBjdXJyZW50bHkgYXNzaWduZWQgdG9cbiAqIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgb24gdGhlIG9iamVjdCBhcyBvZiB0aGUgbW9tZW50IHRoZSBmdW5jdGlvbiBpdCByZXR1cm5zIGlzIGNhbGxlZC5cbiAqXG4gKiBAcGFyYW0gaW5zdGFuY2UgVGhlIGNvbnRleHQgb2JqZWN0XG4gKiBAcGFyYW0gbWV0aG9kIFRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgb24gdGhlIGNvbnRleHQgb2JqZWN0IHRvIGJpbmQgdG8gaXRzZWxmXG4gKiBAcGFyYW0gc3VwcGxpZWRBcmdzIEFuIG9wdGlvbmFsIGFycmF5IG9mIHZhbHVlcyB0byBwcmVwZW5kIHRvIHRoZSBgaW5zdGFuY2VbbWV0aG9kXWAgYXJndW1lbnRzIGxpc3RcbiAqIEByZXR1cm4gVGhlIGJvdW5kIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXRlQmluZChpbnN0YW5jZSwgbWV0aG9kLCAuLi5zdXBwbGllZEFyZ3MpIHtcbiAgICByZXR1cm4gc3VwcGxpZWRBcmdzLmxlbmd0aFxuICAgICAgICA/IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID8gc3VwcGxpZWRBcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpIDogc3VwcGxpZWRBcmdzO1xuICAgICAgICAgICAgLy8gVFM3MDE3XG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VbbWV0aG9kXS5hcHBseShpbnN0YW5jZSwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBUUzcwMTdcbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZVttZXRob2RdLmFwcGx5KGluc3RhbmNlLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1peGluKHRhcmdldCwgLi4uc291cmNlcykge1xuICAgIHJldHVybiBfbWl4aW4oe1xuICAgICAgICBkZWVwOiBmYWxzZSxcbiAgICAgICAgaW5oZXJpdGVkOiB0cnVlLFxuICAgICAgICBzb3VyY2VzOiBzb3VyY2VzLFxuICAgICAgICB0YXJnZXQ6IHRhcmdldFxuICAgIH0pO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gd2hpY2ggaW52b2tlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzIHByZXBlbmRlZCB0byBpdHMgYXJndW1lbnQgbGlzdC5cbiAqIExpa2UgYEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kYCwgYnV0IGRvZXMgbm90IGFsdGVyIGV4ZWN1dGlvbiBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSB0YXJnZXRGdW5jdGlvbiBUaGUgZnVuY3Rpb24gdGhhdCBuZWVkcyB0byBiZSBib3VuZFxuICogQHBhcmFtIHN1cHBsaWVkQXJncyBBbiBvcHRpb25hbCBhcnJheSBvZiBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aGUgYHRhcmdldEZ1bmN0aW9uYCBhcmd1bWVudHMgbGlzdFxuICogQHJldHVybiBUaGUgYm91bmQgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnRpYWwodGFyZ2V0RnVuY3Rpb24sIC4uLnN1cHBsaWVkQXJncykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID8gc3VwcGxpZWRBcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpIDogc3VwcGxpZWRBcmdzO1xuICAgICAgICByZXR1cm4gdGFyZ2V0RnVuY3Rpb24uYXBwbHkodGhpcywgYXJncyk7XG4gICAgfTtcbn1cbi8qKlxuICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIGRlc3Ryb3kgbWV0aG9kIHRoYXQsIHdoZW4gY2FsbGVkLCBjYWxscyB0aGUgcGFzc2VkLWluIGRlc3RydWN0b3IuXG4gKiBUaGlzIGlzIGludGVuZGVkIHRvIHByb3ZpZGUgYSB1bmlmaWVkIGludGVyZmFjZSBmb3IgY3JlYXRpbmcgXCJyZW1vdmVcIiAvIFwiZGVzdHJveVwiIGhhbmRsZXJzIGZvclxuICogZXZlbnQgbGlzdGVuZXJzLCB0aW1lcnMsIGV0Yy5cbiAqXG4gKiBAcGFyYW0gZGVzdHJ1Y3RvciBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgaGFuZGxlJ3MgYGRlc3Ryb3lgIG1ldGhvZCBpcyBpbnZva2VkXG4gKiBAcmV0dXJuIFRoZSBoYW5kbGUgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIYW5kbGUoZGVzdHJ1Y3Rvcikge1xuICAgIGxldCBjYWxsZWQgPSBmYWxzZTtcbiAgICByZXR1cm4ge1xuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZGVzdHJ1Y3RvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cbi8qKlxuICogUmV0dXJucyBhIHNpbmdsZSBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCB0byBkZXN0cm95IG11bHRpcGxlIGhhbmRsZXMgc2ltdWx0YW5lb3VzbHkuXG4gKlxuICogQHBhcmFtIGhhbmRsZXMgQW4gYXJyYXkgb2YgaGFuZGxlcyB3aXRoIGBkZXN0cm95YCBtZXRob2RzXG4gKiBAcmV0dXJuIFRoZSBoYW5kbGUgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb21wb3NpdGVIYW5kbGUoLi4uaGFuZGxlcykge1xuICAgIHJldHVybiBjcmVhdGVIYW5kbGUoZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhhbmRsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGhhbmRsZXNbaV0uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sYW5nLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9jb3JlL2xhbmcubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9jb3JlL2xhbmcubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiZnVuY3Rpb24gaXNGZWF0dXJlVGVzdFRoZW5hYmxlKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gdmFsdWUgJiYgdmFsdWUudGhlbjtcclxufVxyXG4vKipcclxuICogQSBjYWNoZSBvZiByZXN1bHRzIG9mIGZlYXR1cmUgdGVzdHNcclxuICovXHJcbmV4cG9ydCBjb25zdCB0ZXN0Q2FjaGUgPSB7fTtcclxuLyoqXHJcbiAqIEEgY2FjaGUgb2YgdGhlIHVuLXJlc29sdmVkIGZlYXR1cmUgdGVzdHNcclxuICovXHJcbmV4cG9ydCBjb25zdCB0ZXN0RnVuY3Rpb25zID0ge307XHJcbi8qKlxyXG4gKiBBIGNhY2hlIG9mIHVucmVzb2x2ZWQgdGhlbmFibGVzIChwcm9iYWJseSBwcm9taXNlcylcclxuICogQHR5cGUge3t9fVxyXG4gKi9cclxuY29uc3QgdGVzdFRoZW5hYmxlcyA9IHt9O1xyXG4vKipcclxuICogQSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBzY29wZSAoYHdpbmRvd2AgaW4gYSBicm93c2VyLCBgZ2xvYmFsYCBpbiBOb2RlSlMpXHJcbiAqL1xyXG5jb25zdCBnbG9iYWxTY29wZSA9IChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgLy8gQnJvd3NlcnNcclxuICAgICAgICByZXR1cm4gd2luZG93O1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAvLyBOb2RlXHJcbiAgICAgICAgcmV0dXJuIGdsb2JhbDtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIC8vIFdlYiB3b3JrZXJzXHJcbiAgICAgICAgcmV0dXJuIHNlbGY7XHJcbiAgICB9XHJcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xyXG4gICAgcmV0dXJuIHt9O1xyXG59KSgpO1xyXG4vKiBHcmFiIHRoZSBzdGF0aWNGZWF0dXJlcyBpZiB0aGVyZSBhcmUgYXZhaWxhYmxlICovXHJcbmNvbnN0IHsgc3RhdGljRmVhdHVyZXMgfSA9IGdsb2JhbFNjb3BlLkRvam9IYXNFbnZpcm9ubWVudCB8fCB7fTtcclxuLyogQ2xlYW5pbmcgdXAgdGhlIERvam9IYXNFbnZpb3JubWVudCAqL1xyXG5pZiAoJ0Rvam9IYXNFbnZpcm9ubWVudCcgaW4gZ2xvYmFsU2NvcGUpIHtcclxuICAgIGRlbGV0ZSBnbG9iYWxTY29wZS5Eb2pvSGFzRW52aXJvbm1lbnQ7XHJcbn1cclxuLyoqXHJcbiAqIEN1c3RvbSB0eXBlIGd1YXJkIHRvIG5hcnJvdyB0aGUgYHN0YXRpY0ZlYXR1cmVzYCB0byBlaXRoZXIgYSBtYXAgb3IgYSBmdW5jdGlvbiB0aGF0XHJcbiAqIHJldHVybnMgYSBtYXAuXHJcbiAqXHJcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gZ3VhcmQgZm9yXHJcbiAqL1xyXG5mdW5jdGlvbiBpc1N0YXRpY0ZlYXR1cmVGdW5jdGlvbih2YWx1ZSkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcclxufVxyXG4vKipcclxuICogVGhlIGNhY2hlIG9mIGFzc2VydGVkIGZlYXR1cmVzIHRoYXQgd2VyZSBhdmFpbGFibGUgaW4gdGhlIGdsb2JhbCBzY29wZSB3aGVuIHRoZVxyXG4gKiBtb2R1bGUgbG9hZGVkXHJcbiAqL1xyXG5jb25zdCBzdGF0aWNDYWNoZSA9IHN0YXRpY0ZlYXR1cmVzXHJcbiAgICA/IGlzU3RhdGljRmVhdHVyZUZ1bmN0aW9uKHN0YXRpY0ZlYXR1cmVzKSA/IHN0YXRpY0ZlYXR1cmVzLmFwcGx5KGdsb2JhbFNjb3BlKSA6IHN0YXRpY0ZlYXR1cmVzXHJcbiAgICA6IHt9OyAvKiBQcm92aWRpbmcgYW4gZW1wdHkgY2FjaGUsIGlmIG5vbmUgd2FzIGluIHRoZSBlbnZpcm9ubWVudFxyXG5cclxuLyoqXHJcbiogQU1EIHBsdWdpbiBmdW5jdGlvbi5cclxuKlxyXG4qIENvbmRpdGlvbmFsIGxvYWRzIG1vZHVsZXMgYmFzZWQgb24gYSBoYXMgZmVhdHVyZSB0ZXN0IHZhbHVlLlxyXG4qXHJcbiogQHBhcmFtIHJlc291cmNlSWQgR2l2ZXMgdGhlIHJlc29sdmVkIG1vZHVsZSBpZCB0byBsb2FkLlxyXG4qIEBwYXJhbSByZXF1aXJlIFRoZSBsb2FkZXIgcmVxdWlyZSBmdW5jdGlvbiB3aXRoIHJlc3BlY3QgdG8gdGhlIG1vZHVsZSB0aGF0IGNvbnRhaW5lZCB0aGUgcGx1Z2luIHJlc291cmNlIGluIGl0c1xyXG4qICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kgbGlzdC5cclxuKiBAcGFyYW0gbG9hZCBDYWxsYmFjayB0byBsb2FkZXIgdGhhdCBjb25zdW1lcyByZXN1bHQgb2YgcGx1Z2luIGRlbWFuZC5cclxuKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGxvYWQocmVzb3VyY2VJZCwgcmVxdWlyZSwgbG9hZCwgY29uZmlnKSB7XHJcbiAgICByZXNvdXJjZUlkID8gcmVxdWlyZShbcmVzb3VyY2VJZF0sIGxvYWQpIDogbG9hZCgpO1xyXG59XHJcbi8qKlxyXG4gKiBBTUQgcGx1Z2luIGZ1bmN0aW9uLlxyXG4gKlxyXG4gKiBSZXNvbHZlcyByZXNvdXJjZUlkIGludG8gYSBtb2R1bGUgaWQgYmFzZWQgb24gcG9zc2libHktbmVzdGVkIHRlbmFyeSBleHByZXNzaW9uIHRoYXQgYnJhbmNoZXMgb24gaGFzIGZlYXR1cmUgdGVzdFxyXG4gKiB2YWx1ZShzKS5cclxuICpcclxuICogQHBhcmFtIHJlc291cmNlSWQgVGhlIGlkIG9mIHRoZSBtb2R1bGVcclxuICogQHBhcmFtIG5vcm1hbGl6ZSBSZXNvbHZlcyBhIHJlbGF0aXZlIG1vZHVsZSBpZCBpbnRvIGFuIGFic29sdXRlIG1vZHVsZSBpZFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShyZXNvdXJjZUlkLCBub3JtYWxpemUpIHtcclxuICAgIGNvbnN0IHRva2VucyA9IHJlc291cmNlSWQubWF0Y2goL1tcXD86XXxbXjpcXD9dKi9nKSB8fCBbXTtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGZ1bmN0aW9uIGdldChza2lwKSB7XHJcbiAgICAgICAgY29uc3QgdGVybSA9IHRva2Vuc1tpKytdO1xyXG4gICAgICAgIGlmICh0ZXJtID09PSAnOicpIHtcclxuICAgICAgICAgICAgLy8gZW1wdHkgc3RyaW5nIG1vZHVsZSBuYW1lLCByZXNvbHZlcyB0byBudWxsXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gcG9zdGZpeGVkIHdpdGggYSA/IG1lYW5zIGl0IGlzIGEgZmVhdHVyZSB0byBicmFuY2ggb24sIHRoZSB0ZXJtIGlzIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlXHJcbiAgICAgICAgICAgIGlmICh0b2tlbnNbaSsrXSA9PT0gJz8nKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNraXAgJiYgaGFzKHRlcm0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hlZCB0aGUgZmVhdHVyZSwgZ2V0IHRoZSBmaXJzdCB2YWx1ZSBmcm9tIHRoZSBvcHRpb25zXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZGlkIG5vdCBtYXRjaCwgZ2V0IHRoZSBzZWNvbmQgdmFsdWUsIHBhc3Npbmcgb3ZlciB0aGUgZmlyc3RcclxuICAgICAgICAgICAgICAgICAgICBnZXQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChza2lwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBhIG1vZHVsZVxyXG4gICAgICAgICAgICByZXR1cm4gdGVybTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBpZCA9IGdldCgpO1xyXG4gICAgcmV0dXJuIGlkICYmIG5vcm1hbGl6ZShpZCk7XHJcbn1cclxuLyoqXHJcbiAqIENoZWNrIGlmIGEgZmVhdHVyZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWRcclxuICpcclxuICogQHBhcmFtIGZlYXR1cmUgdGhlIG5hbWUgb2YgdGhlIGZlYXR1cmVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBleGlzdHMoZmVhdHVyZSkge1xyXG4gICAgY29uc3Qgbm9ybWFsaXplZEZlYXR1cmUgPSBmZWF0dXJlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gQm9vbGVhbihub3JtYWxpemVkRmVhdHVyZSBpbiBzdGF0aWNDYWNoZSB8fCBub3JtYWxpemVkRmVhdHVyZSBpbiB0ZXN0Q2FjaGUgfHwgdGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV0pO1xyXG59XHJcbi8qKlxyXG4gKiBSZWdpc3RlciBhIG5ldyB0ZXN0IGZvciBhIG5hbWVkIGZlYXR1cmUuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGhhcy5hZGQoJ2RvbS1hZGRldmVudGxpc3RlbmVyJywgISFkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKTtcclxuICpcclxuICogQGV4YW1wbGVcclxuICogaGFzLmFkZCgndG91Y2gtZXZlbnRzJywgZnVuY3Rpb24gKCkge1xyXG4gKiAgICByZXR1cm4gJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnRcclxuICogfSk7XHJcbiAqXHJcbiAqIEBwYXJhbSBmZWF0dXJlIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlXHJcbiAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgcmVwb3J0ZWQgb2YgdGhlIGZlYXR1cmUsIG9yIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIG9uY2Ugb24gZmlyc3QgdGVzdFxyXG4gKiBAcGFyYW0gb3ZlcndyaXRlIGlmIGFuIGV4aXN0aW5nIHZhbHVlIHNob3VsZCBiZSBvdmVyd3JpdHRlbi4gRGVmYXVsdHMgdG8gZmFsc2UuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYWRkKGZlYXR1cmUsIHZhbHVlLCBvdmVyd3JpdGUgPSBmYWxzZSkge1xyXG4gICAgY29uc3Qgbm9ybWFsaXplZEZlYXR1cmUgPSBmZWF0dXJlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBpZiAoZXhpc3RzKG5vcm1hbGl6ZWRGZWF0dXJlKSAmJiAhb3ZlcndyaXRlICYmICEobm9ybWFsaXplZEZlYXR1cmUgaW4gc3RhdGljQ2FjaGUpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRmVhdHVyZSBcIiR7ZmVhdHVyZX1cIiBleGlzdHMgYW5kIG92ZXJ3cml0ZSBub3QgdHJ1ZS5gKTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICB0ZXN0RnVuY3Rpb25zW25vcm1hbGl6ZWRGZWF0dXJlXSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoaXNGZWF0dXJlVGVzdFRoZW5hYmxlKHZhbHVlKSkge1xyXG4gICAgICAgIHRlc3RUaGVuYWJsZXNbZmVhdHVyZV0gPSB2YWx1ZS50aGVuKChyZXNvbHZlZFZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHRlc3RDYWNoZVtmZWF0dXJlXSA9IHJlc29sdmVkVmFsdWU7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0ZXN0VGhlbmFibGVzW2ZlYXR1cmVdO1xyXG4gICAgICAgIH0sICgpID0+IHtcclxuICAgICAgICAgICAgZGVsZXRlIHRlc3RUaGVuYWJsZXNbZmVhdHVyZV07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICB0ZXN0Q2FjaGVbbm9ybWFsaXplZEZlYXR1cmVdID0gdmFsdWU7XHJcbiAgICAgICAgZGVsZXRlIHRlc3RGdW5jdGlvbnNbbm9ybWFsaXplZEZlYXR1cmVdO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgYSBuYW1lZCBmZWF0dXJlLlxyXG4gKlxyXG4gKiBAcGFyYW0gZmVhdHVyZSBUaGUgbmFtZSAoaWYgYSBzdHJpbmcpIG9yIGlkZW50aWZpZXIgKGlmIGFuIGludGVnZXIpIG9mIHRoZSBmZWF0dXJlIHRvIHRlc3QuXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBoYXMoZmVhdHVyZSkge1xyXG4gICAgbGV0IHJlc3VsdDtcclxuICAgIGNvbnN0IG5vcm1hbGl6ZWRGZWF0dXJlID0gZmVhdHVyZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgaWYgKG5vcm1hbGl6ZWRGZWF0dXJlIGluIHN0YXRpY0NhY2hlKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gc3RhdGljQ2FjaGVbbm9ybWFsaXplZEZlYXR1cmVdO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV0pIHtcclxuICAgICAgICByZXN1bHQgPSB0ZXN0Q2FjaGVbbm9ybWFsaXplZEZlYXR1cmVdID0gdGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV0uY2FsbChudWxsKTtcclxuICAgICAgICBkZWxldGUgdGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV07XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChub3JtYWxpemVkRmVhdHVyZSBpbiB0ZXN0Q2FjaGUpIHtcclxuICAgICAgICByZXN1bHQgPSB0ZXN0Q2FjaGVbbm9ybWFsaXplZEZlYXR1cmVdO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZmVhdHVyZSBpbiB0ZXN0VGhlbmFibGVzKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQXR0ZW1wdCB0byBkZXRlY3QgdW5yZWdpc3RlcmVkIGhhcyBmZWF0dXJlIFwiJHtmZWF0dXJlfVwiYCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcbi8qXHJcbiAqIE91dCBvZiB0aGUgYm94IGZlYXR1cmUgdGVzdHNcclxuICovXHJcbi8qIEVudmlyb25tZW50cyAqL1xyXG4vKiBVc2VkIGFzIGEgdmFsdWUgdG8gcHJvdmlkZSBhIGRlYnVnIG9ubHkgY29kZSBwYXRoICovXHJcbmFkZCgnZGVidWcnLCB0cnVlKTtcclxuLyogRGV0ZWN0cyBpZiB0aGUgZW52aXJvbm1lbnQgaXMgXCJicm93c2VyIGxpa2VcIiAqL1xyXG5hZGQoJ2hvc3QtYnJvd3NlcicsIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGxvY2F0aW9uICE9PSAndW5kZWZpbmVkJyk7XHJcbi8qIERldGVjdHMgaWYgdGhlIGVudmlyb25tZW50IGFwcGVhcnMgdG8gYmUgTm9kZUpTICovXHJcbmFkZCgnaG9zdC1ub2RlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzLnZlcnNpb25zICYmIHByb2Nlc3MudmVyc2lvbnMubm9kZSkge1xyXG4gICAgICAgIHJldHVybiBwcm9jZXNzLnZlcnNpb25zLm5vZGU7XHJcbiAgICB9XHJcbn0pO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXMubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2hhcy9oYXMubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9oYXMvaGFzLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCB7IGlzQXJyYXlMaWtlLCBTaGltSXRlcmF0b3IgfSBmcm9tICcuL2l0ZXJhdG9yJztcclxuaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XHJcbmltcG9ydCB7IGlzIGFzIG9iamVjdElzIH0gZnJvbSAnLi9vYmplY3QnO1xyXG5pbXBvcnQgaGFzIGZyb20gJy4vc3VwcG9ydC9oYXMnO1xyXG5pbXBvcnQgJy4vU3ltYm9sJztcclxuZXhwb3J0IGxldCBNYXAgPSBnbG9iYWwuTWFwO1xyXG5pZiAoIXRydWUpIHtcclxuICAgIE1hcCA9IChfYSA9IGNsYXNzIE1hcCB7XHJcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKGl0ZXJhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gW107XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSBbXTtcclxuICAgICAgICAgICAgICAgIHRoaXNbU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdNYXAnO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZXJhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXJyYXlMaWtlKGl0ZXJhYmxlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZXJhYmxlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGl0ZXJhYmxlW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQodmFsdWVbMF0sIHZhbHVlWzFdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBpdGVyYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQodmFsdWVbMF0sIHZhbHVlWzFdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogQW4gYWx0ZXJuYXRpdmUgdG8gQXJyYXkucHJvdG90eXBlLmluZGV4T2YgdXNpbmcgT2JqZWN0LmlzXHJcbiAgICAgICAgICAgICAqIHRvIGNoZWNrIGZvciBlcXVhbGl0eS4gU2VlIGh0dHA6Ly9temwubGEvMXp1S08yVlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgX2luZGV4T2ZLZXkoa2V5cywga2V5KSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3RJcyhrZXlzW2ldLCBrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBnZXQgc2l6ZSgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9rZXlzLmxlbmd0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjbGVhcigpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2tleXMubGVuZ3RoID0gdGhpcy5fdmFsdWVzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGVsZXRlKGtleSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9pbmRleE9mS2V5KHRoaXMuX2tleXMsIGtleSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbnRyaWVzKCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5fa2V5cy5tYXAoKGtleSwgaSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBba2V5LCB0aGlzLl92YWx1ZXNbaV1dO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNoaW1JdGVyYXRvcih2YWx1ZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvckVhY2goY2FsbGJhY2ssIGNvbnRleHQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSB0aGlzLl9rZXlzO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5fdmFsdWVzO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIHZhbHVlc1tpXSwga2V5c1tpXSwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZ2V0KGtleSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9pbmRleE9mS2V5KHRoaXMuX2tleXMsIGtleSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggPCAwID8gdW5kZWZpbmVkIDogdGhpcy5fdmFsdWVzW2luZGV4XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBoYXMoa2V5KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faW5kZXhPZktleSh0aGlzLl9rZXlzLCBrZXkpID4gLTE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAga2V5cygpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2hpbUl0ZXJhdG9yKHRoaXMuX2tleXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNldChrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLl9pbmRleE9mS2V5KHRoaXMuX2tleXMsIGtleSk7XHJcbiAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4IDwgMCA/IHRoaXMuX2tleXMubGVuZ3RoIDogaW5kZXg7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9rZXlzW2luZGV4XSA9IGtleTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlc1tpbmRleF0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhbHVlcygpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2hpbUl0ZXJhdG9yKHRoaXMuX3ZhbHVlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIF9hW1N5bWJvbC5zcGVjaWVzXSA9IF9hLFxyXG4gICAgICAgIF9hKTtcclxufVxyXG5leHBvcnQgZGVmYXVsdCBNYXA7XHJcbnZhciBfYTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWFwLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL01hcC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vTWFwLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xyXG5pbXBvcnQgeyBxdWV1ZU1pY3JvVGFzayB9IGZyb20gJy4vc3VwcG9ydC9xdWV1ZSc7XHJcbmltcG9ydCAnLi9TeW1ib2wnO1xyXG5pbXBvcnQgaGFzIGZyb20gJy4vc3VwcG9ydC9oYXMnO1xyXG5leHBvcnQgbGV0IFNoaW1Qcm9taXNlID0gZ2xvYmFsLlByb21pc2U7XHJcbmV4cG9ydCBjb25zdCBpc1RoZW5hYmxlID0gZnVuY3Rpb24gaXNUaGVuYWJsZSh2YWx1ZSkge1xyXG4gICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nO1xyXG59O1xyXG5pZiAoIXRydWUpIHtcclxuICAgIGdsb2JhbC5Qcm9taXNlID0gU2hpbVByb21pc2UgPSAoX2EgPSBjbGFzcyBQcm9taXNlIHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgUHJvbWlzZS5cclxuICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgICogQGNvbnN0cnVjdG9yXHJcbiAgICAgICAgICAgICAqXHJcbiAgICAgICAgICAgICAqIEBwYXJhbSBleGVjdXRvclxyXG4gICAgICAgICAgICAgKiBUaGUgZXhlY3V0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIFByb21pc2UgaXMgaW5zdGFudGlhdGVkLiBJdCBpcyByZXNwb25zaWJsZSBmb3JcclxuICAgICAgICAgICAgICogc3RhcnRpbmcgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gd2hlbiBpdCBpcyBpbnZva2VkLlxyXG4gICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAgKiBUaGUgZXhlY3V0b3IgbXVzdCBjYWxsIGVpdGhlciB0aGUgcGFzc2VkIGByZXNvbHZlYCBmdW5jdGlvbiB3aGVuIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWRcclxuICAgICAgICAgICAgICogc3VjY2Vzc2Z1bGx5LCBvciB0aGUgYHJlamVjdGAgZnVuY3Rpb24gd2hlbiB0aGUgb3BlcmF0aW9uIGZhaWxzLlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgY29uc3RydWN0b3IoZXhlY3V0b3IpIHtcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhpcyBwcm9taXNlLlxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gMSAvKiBQZW5kaW5nICovO1xyXG4gICAgICAgICAgICAgICAgdGhpc1tTeW1ib2wudG9TdHJpbmdUYWddID0gJ1Byb21pc2UnO1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBJZiB0cnVlLCB0aGUgcmVzb2x1dGlvbiBvZiB0aGlzIHByb21pc2UgaXMgY2hhaW5lZCAoXCJsb2NrZWQgaW5cIikgdG8gYW5vdGhlciBwcm9taXNlLlxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBsZXQgaXNDaGFpbmVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIFdoZXRoZXIgb3Igbm90IHRoaXMgcHJvbWlzZSBpcyBpbiBhIHJlc29sdmVkIHN0YXRlLlxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBjb25zdCBpc1Jlc29sdmVkID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlICE9PSAxIC8qIFBlbmRpbmcgKi8gfHwgaXNDaGFpbmVkO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogQ2FsbGJhY2tzIHRoYXQgc2hvdWxkIGJlIGludm9rZWQgb25jZSB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLlxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBsZXQgY2FsbGJhY2tzID0gW107XHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIEluaXRpYWxseSBwdXNoZXMgY2FsbGJhY2tzIG9udG8gYSBxdWV1ZSBmb3IgZXhlY3V0aW9uIG9uY2UgdGhpcyBwcm9taXNlIHNldHRsZXMuIEFmdGVyIHRoZSBwcm9taXNlIHNldHRsZXMsXHJcbiAgICAgICAgICAgICAgICAgKiBlbnF1ZXVlcyBjYWxsYmFja3MgZm9yIGV4ZWN1dGlvbiBvbiB0aGUgbmV4dCBldmVudCBsb29wIHR1cm4uXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGxldCB3aGVuRmluaXNoZWQgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBTZXR0bGVzIHRoaXMgcHJvbWlzZS5cclxuICAgICAgICAgICAgICAgICAqXHJcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gbmV3U3RhdGUgVGhlIHJlc29sdmVkIHN0YXRlIGZvciB0aGlzIHByb21pc2UuXHJcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0ge1R8YW55fSB2YWx1ZSBUaGUgcmVzb2x2ZWQgdmFsdWUgZm9yIHRoaXMgcHJvbWlzZS5cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2V0dGxlID0gKG5ld1N0YXRlLCB2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEEgcHJvbWlzZSBjYW4gb25seSBiZSBzZXR0bGVkIG9uY2UuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT09IDEgLyogUGVuZGluZyAqLykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBuZXdTdGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmVkVmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB3aGVuRmluaXNoZWQgPSBxdWV1ZU1pY3JvVGFzaztcclxuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGVucXVldWUgYSBjYWxsYmFjayBydW5uZXIgaWYgdGhlcmUgYXJlIGNhbGxiYWNrcyBzbyB0aGF0IGluaXRpYWxseSBmdWxmaWxsZWQgUHJvbWlzZXMgZG9uJ3QgaGF2ZSB0b1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgYW4gZXh0cmEgdHVybi5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tzICYmIGNhbGxiYWNrcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlTWljcm9UYXNrKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY291bnQgPSBjYWxsYmFja3MubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7ICsraSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3NbaV0uY2FsbChudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogUmVzb2x2ZXMgdGhpcyBwcm9taXNlLlxyXG4gICAgICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSBuZXdTdGF0ZSBUaGUgcmVzb2x2ZWQgc3RhdGUgZm9yIHRoaXMgcHJvbWlzZS5cclxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7VHxhbnl9IHZhbHVlIFRoZSByZXNvbHZlZCB2YWx1ZSBmb3IgdGhpcyBwcm9taXNlLlxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlID0gKG5ld1N0YXRlLCB2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1Jlc29sdmVkKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNUaGVuYWJsZSh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUudGhlbihzZXR0bGUuYmluZChudWxsLCAwIC8qIEZ1bGZpbGxlZCAqLyksIHNldHRsZS5iaW5kKG51bGwsIDIgLyogUmVqZWN0ZWQgKi8pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDaGFpbmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRsZShuZXdTdGF0ZSwgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRoZW4gPSAob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuRmluaXNoZWQgaW5pdGlhbGx5IHF1ZXVlcyB1cCBjYWxsYmFja3MgZm9yIGV4ZWN1dGlvbiBhZnRlciB0aGUgcHJvbWlzZSBoYXMgc2V0dGxlZC4gT25jZSB0aGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvbWlzZSBoYXMgc2V0dGxlZCwgd2hlbkZpbmlzaGVkIHdpbGwgc2NoZWR1bGUgY2FsbGJhY2tzIGZvciBleGVjdXRpb24gb24gdGhlIG5leHQgdHVybiB0aHJvdWdoIHRoZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudCBsb29wLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVuRmluaXNoZWQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLnN0YXRlID09PSAyIC8qIFJlamVjdGVkICovID8gb25SZWplY3RlZCA6IG9uRnVsZmlsbGVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY2FsbGJhY2sodGhpcy5yZXNvbHZlZFZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09IDIgLyogUmVqZWN0ZWQgKi8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhpcy5yZXNvbHZlZFZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5yZXNvbHZlZFZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBleGVjdXRvcihyZXNvbHZlLmJpbmQobnVsbCwgMCAvKiBGdWxmaWxsZWQgKi8pLCByZXNvbHZlLmJpbmQobnVsbCwgMiAvKiBSZWplY3RlZCAqLykpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0dGxlKDIgLyogUmVqZWN0ZWQgKi8sIGVycm9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzdGF0aWMgYWxsKGl0ZXJhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21wbGV0ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcG9wdWxhdGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZnVsZmlsbChpbmRleCwgdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICArK2NvbXBsZXRlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2goKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZmluaXNoKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9wdWxhdGluZyB8fCBjb21wbGV0ZSA8IHRvdGFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwcm9jZXNzSXRlbShpbmRleCwgaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICArK3RvdGFsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNUaGVuYWJsZShpdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYW4gaXRlbSBQcm9taXNlIHJlamVjdHMsIHRoaXMgUHJvbWlzZSBpcyBpbW1lZGlhdGVseSByZWplY3RlZCB3aXRoIHRoZSBpdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9taXNlJ3MgcmVqZWN0aW9uIGVycm9yLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS50aGVuKGZ1bGZpbGwuYmluZChudWxsLCBpbmRleCksIHJlamVjdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoaXRlbSkudGhlbihmdWxmaWxsLmJpbmQobnVsbCwgaW5kZXgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBpdGVyYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzSXRlbShpLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaCgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3RhdGljIHJhY2UoaXRlcmFibGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcyhmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZXJhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSBQcm9taXNlIGl0ZW0gcmVqZWN0cywgdGhpcyBQcm9taXNlIGlzIGltbWVkaWF0ZWx5IHJlamVjdGVkIHdpdGggdGhlIGl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb21pc2UncyByZWplY3Rpb24gZXJyb3IuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShpdGVtKS50aGVuKHJlc29sdmUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3RhdGljIHJlamVjdChyZWFzb24pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcyhmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlYXNvbik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzdGF0aWMgcmVzb2x2ZSh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzKGZ1bmN0aW9uIChyZXNvbHZlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaChvblJlamVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIF9hW1N5bWJvbC5zcGVjaWVzXSA9IFNoaW1Qcm9taXNlLFxyXG4gICAgICAgIF9hKTtcclxufVxyXG5leHBvcnQgZGVmYXVsdCBTaGltUHJvbWlzZTtcclxudmFyIF9hO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Qcm9taXNlLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL1Byb21pc2UubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL1Byb21pc2UubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IGhhcyBmcm9tICcuL3N1cHBvcnQvaGFzJztcclxuaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XHJcbmltcG9ydCB7IGdldFZhbHVlRGVzY3JpcHRvciB9IGZyb20gJy4vc3VwcG9ydC91dGlsJztcclxuZXhwb3J0IGxldCBTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xyXG5pZiAoIXRydWUpIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhyb3dzIGlmIHRoZSB2YWx1ZSBpcyBub3QgYSBzeW1ib2wsIHVzZWQgaW50ZXJuYWxseSB3aXRoaW4gdGhlIFNoaW1cclxuICAgICAqIEBwYXJhbSAge2FueX0gICAgdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJuIHtzeW1ib2x9ICAgICAgIFJldHVybnMgdGhlIHN5bWJvbCBvciB0aHJvd3NcclxuICAgICAqL1xyXG4gICAgY29uc3QgdmFsaWRhdGVTeW1ib2wgPSBmdW5jdGlvbiB2YWxpZGF0ZVN5bWJvbCh2YWx1ZSkge1xyXG4gICAgICAgIGlmICghaXNTeW1ib2wodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IodmFsdWUgKyAnIGlzIG5vdCBhIHN5bWJvbCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9O1xyXG4gICAgY29uc3QgZGVmaW5lUHJvcGVydGllcyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzO1xyXG4gICAgY29uc3QgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XHJcbiAgICBjb25zdCBjcmVhdGUgPSBPYmplY3QuY3JlYXRlO1xyXG4gICAgY29uc3Qgb2JqUHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcclxuICAgIGNvbnN0IGdsb2JhbFN5bWJvbHMgPSB7fTtcclxuICAgIGNvbnN0IGdldFN5bWJvbE5hbWUgPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBjcmVhdGUobnVsbCk7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChkZXNjKSB7XHJcbiAgICAgICAgICAgIGxldCBwb3N0Zml4ID0gMDtcclxuICAgICAgICAgICAgbGV0IG5hbWU7XHJcbiAgICAgICAgICAgIHdoaWxlIChjcmVhdGVkW1N0cmluZyhkZXNjKSArIChwb3N0Zml4IHx8ICcnKV0pIHtcclxuICAgICAgICAgICAgICAgICsrcG9zdGZpeDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkZXNjICs9IFN0cmluZyhwb3N0Zml4IHx8ICcnKTtcclxuICAgICAgICAgICAgY3JlYXRlZFtkZXNjXSA9IHRydWU7XHJcbiAgICAgICAgICAgIG5hbWUgPSAnQEAnICsgZGVzYztcclxuICAgICAgICAgICAgLy8gRklYTUU6IFRlbXBvcmFyeSBndWFyZCB1bnRpbCB0aGUgZHVwbGljYXRlIGV4ZWN1dGlvbiB3aGVuIHRlc3RpbmcgY2FuIGJlXHJcbiAgICAgICAgICAgIC8vIHBpbm5lZCBkb3duLlxyXG4gICAgICAgICAgICBpZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqUHJvdG90eXBlLCBuYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgZGVmaW5lUHJvcGVydHkob2JqUHJvdG90eXBlLCBuYW1lLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lUHJvcGVydHkodGhpcywgbmFtZSwgZ2V0VmFsdWVEZXNjcmlwdG9yKHZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5hbWU7XHJcbiAgICAgICAgfTtcclxuICAgIH0pKCk7XHJcbiAgICBjb25zdCBJbnRlcm5hbFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbChkZXNjcmlwdGlvbikge1xyXG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgSW50ZXJuYWxTeW1ib2wpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHlwZUVycm9yOiBTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3InKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFN5bWJvbChkZXNjcmlwdGlvbik7XHJcbiAgICB9O1xyXG4gICAgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbChkZXNjcmlwdGlvbikge1xyXG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgU3ltYm9sKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1R5cGVFcnJvcjogU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN5bSA9IE9iamVjdC5jcmVhdGUoSW50ZXJuYWxTeW1ib2wucHJvdG90eXBlKTtcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQgPyAnJyA6IFN0cmluZyhkZXNjcmlwdGlvbik7XHJcbiAgICAgICAgcmV0dXJuIGRlZmluZVByb3BlcnRpZXMoc3ltLCB7XHJcbiAgICAgICAgICAgIF9fZGVzY3JpcHRpb25fXzogZ2V0VmFsdWVEZXNjcmlwdG9yKGRlc2NyaXB0aW9uKSxcclxuICAgICAgICAgICAgX19uYW1lX186IGdldFZhbHVlRGVzY3JpcHRvcihnZXRTeW1ib2xOYW1lKGRlc2NyaXB0aW9uKSlcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbiAgICAvKiBEZWNvcmF0ZSB0aGUgU3ltYm9sIGZ1bmN0aW9uIHdpdGggdGhlIGFwcHJvcHJpYXRlIHByb3BlcnRpZXMgKi9cclxuICAgIGRlZmluZVByb3BlcnR5KFN5bWJvbCwgJ2ZvcicsIGdldFZhbHVlRGVzY3JpcHRvcihmdW5jdGlvbiAoa2V5KSB7XHJcbiAgICAgICAgaWYgKGdsb2JhbFN5bWJvbHNba2V5XSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsU3ltYm9sc1trZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKGdsb2JhbFN5bWJvbHNba2V5XSA9IFN5bWJvbChTdHJpbmcoa2V5KSkpO1xyXG4gICAgfSkpO1xyXG4gICAgZGVmaW5lUHJvcGVydGllcyhTeW1ib2wsIHtcclxuICAgICAgICBrZXlGb3I6IGdldFZhbHVlRGVzY3JpcHRvcihmdW5jdGlvbiAoc3ltKSB7XHJcbiAgICAgICAgICAgIGxldCBrZXk7XHJcbiAgICAgICAgICAgIHZhbGlkYXRlU3ltYm9sKHN5bSk7XHJcbiAgICAgICAgICAgIGZvciAoa2V5IGluIGdsb2JhbFN5bWJvbHMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChnbG9iYWxTeW1ib2xzW2tleV0gPT09IHN5bSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICBoYXNJbnN0YW5jZTogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ2hhc0luc3RhbmNlJyksIGZhbHNlLCBmYWxzZSksXHJcbiAgICAgICAgaXNDb25jYXRTcHJlYWRhYmxlOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignaXNDb25jYXRTcHJlYWRhYmxlJyksIGZhbHNlLCBmYWxzZSksXHJcbiAgICAgICAgaXRlcmF0b3I6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdpdGVyYXRvcicpLCBmYWxzZSwgZmFsc2UpLFxyXG4gICAgICAgIG1hdGNoOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignbWF0Y2gnKSwgZmFsc2UsIGZhbHNlKSxcclxuICAgICAgICBvYnNlcnZhYmxlOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignb2JzZXJ2YWJsZScpLCBmYWxzZSwgZmFsc2UpLFxyXG4gICAgICAgIHJlcGxhY2U6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdyZXBsYWNlJyksIGZhbHNlLCBmYWxzZSksXHJcbiAgICAgICAgc2VhcmNoOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignc2VhcmNoJyksIGZhbHNlLCBmYWxzZSksXHJcbiAgICAgICAgc3BlY2llczogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3NwZWNpZXMnKSwgZmFsc2UsIGZhbHNlKSxcclxuICAgICAgICBzcGxpdDogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3NwbGl0JyksIGZhbHNlLCBmYWxzZSksXHJcbiAgICAgICAgdG9QcmltaXRpdmU6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCd0b1ByaW1pdGl2ZScpLCBmYWxzZSwgZmFsc2UpLFxyXG4gICAgICAgIHRvU3RyaW5nVGFnOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcigndG9TdHJpbmdUYWcnKSwgZmFsc2UsIGZhbHNlKSxcclxuICAgICAgICB1bnNjb3BhYmxlczogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3Vuc2NvcGFibGVzJyksIGZhbHNlLCBmYWxzZSlcclxuICAgIH0pO1xyXG4gICAgLyogRGVjb3JhdGUgdGhlIEludGVybmFsU3ltYm9sIG9iamVjdCAqL1xyXG4gICAgZGVmaW5lUHJvcGVydGllcyhJbnRlcm5hbFN5bWJvbC5wcm90b3R5cGUsIHtcclxuICAgICAgICBjb25zdHJ1Y3RvcjogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbCksXHJcbiAgICAgICAgdG9TdHJpbmc6IGdldFZhbHVlRGVzY3JpcHRvcihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9fbmFtZV9fO1xyXG4gICAgICAgIH0sIGZhbHNlLCBmYWxzZSlcclxuICAgIH0pO1xyXG4gICAgLyogRGVjb3JhdGUgdGhlIFN5bWJvbC5wcm90b3R5cGUgKi9cclxuICAgIGRlZmluZVByb3BlcnRpZXMoU3ltYm9sLnByb3RvdHlwZSwge1xyXG4gICAgICAgIHRvU3RyaW5nOiBnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ1N5bWJvbCAoJyArIHZhbGlkYXRlU3ltYm9sKHRoaXMpLl9fZGVzY3JpcHRpb25fXyArICcpJztcclxuICAgICAgICB9KSxcclxuICAgICAgICB2YWx1ZU9mOiBnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVTeW1ib2wodGhpcyk7XHJcbiAgICAgICAgfSlcclxuICAgIH0pO1xyXG4gICAgZGVmaW5lUHJvcGVydHkoU3ltYm9sLnByb3RvdHlwZSwgU3ltYm9sLnRvUHJpbWl0aXZlLCBnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB2YWxpZGF0ZVN5bWJvbCh0aGlzKTtcclxuICAgIH0pKTtcclxuICAgIGRlZmluZVByb3BlcnR5KFN5bWJvbC5wcm90b3R5cGUsIFN5bWJvbC50b1N0cmluZ1RhZywgZ2V0VmFsdWVEZXNjcmlwdG9yKCdTeW1ib2wnLCBmYWxzZSwgZmFsc2UsIHRydWUpKTtcclxuICAgIGRlZmluZVByb3BlcnR5KEludGVybmFsU3ltYm9sLnByb3RvdHlwZSwgU3ltYm9sLnRvUHJpbWl0aXZlLCBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLnByb3RvdHlwZVtTeW1ib2wudG9QcmltaXRpdmVdLCBmYWxzZSwgZmFsc2UsIHRydWUpKTtcclxuICAgIGRlZmluZVByb3BlcnR5KEludGVybmFsU3ltYm9sLnByb3RvdHlwZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLnByb3RvdHlwZVtTeW1ib2wudG9TdHJpbmdUYWddLCBmYWxzZSwgZmFsc2UsIHRydWUpKTtcclxufVxyXG4vKipcclxuICogQSBjdXN0b20gZ3VhcmQgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIGlmIGFuIG9iamVjdCBpcyBhIHN5bWJvbCBvciBub3RcclxuICogQHBhcmFtICB7YW55fSAgICAgICB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2sgdG8gc2VlIGlmIGl0IGlzIGEgc3ltYm9sIG9yIG5vdFxyXG4gKiBAcmV0dXJuIHtpcyBzeW1ib2x9ICAgICAgIFJldHVybnMgdHJ1ZSBpZiBhIHN5bWJvbCBvciBub3QgKGFuZCBuYXJyb3dzIHRoZSB0eXBlIGd1YXJkKVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gKHZhbHVlICYmICh0eXBlb2YgdmFsdWUgPT09ICdzeW1ib2wnIHx8IHZhbHVlWydAQHRvU3RyaW5nVGFnJ10gPT09ICdTeW1ib2wnKSkgfHwgZmFsc2U7XHJcbn1cclxuLyoqXHJcbiAqIEZpbGwgYW55IG1pc3Npbmcgd2VsbCBrbm93biBzeW1ib2xzIGlmIHRoZSBuYXRpdmUgU3ltYm9sIGlzIG1pc3NpbmcgdGhlbVxyXG4gKi9cclxuW1xyXG4gICAgJ2hhc0luc3RhbmNlJyxcclxuICAgICdpc0NvbmNhdFNwcmVhZGFibGUnLFxyXG4gICAgJ2l0ZXJhdG9yJyxcclxuICAgICdzcGVjaWVzJyxcclxuICAgICdyZXBsYWNlJyxcclxuICAgICdzZWFyY2gnLFxyXG4gICAgJ3NwbGl0JyxcclxuICAgICdtYXRjaCcsXHJcbiAgICAndG9QcmltaXRpdmUnLFxyXG4gICAgJ3RvU3RyaW5nVGFnJyxcclxuICAgICd1bnNjb3BhYmxlcycsXHJcbiAgICAnb2JzZXJ2YWJsZSdcclxuXS5mb3JFYWNoKCh3ZWxsS25vd24pID0+IHtcclxuICAgIGlmICghU3ltYm9sW3dlbGxLbm93bl0pIHtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3ltYm9sLCB3ZWxsS25vd24sIGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKHdlbGxLbm93biksIGZhbHNlLCBmYWxzZSkpO1xyXG4gICAgfVxyXG59KTtcclxuZXhwb3J0IGRlZmF1bHQgU3ltYm9sO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1TeW1ib2wubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vU3ltYm9sLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9TeW1ib2wubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XHJcbmltcG9ydCB7IGlzQXJyYXlMaWtlIH0gZnJvbSAnLi9pdGVyYXRvcic7XHJcbmltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XHJcbmltcG9ydCAnLi9TeW1ib2wnO1xyXG5leHBvcnQgbGV0IFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcclxuaWYgKCF0cnVlKSB7XHJcbiAgICBjb25zdCBERUxFVEVEID0ge307XHJcbiAgICBjb25zdCBnZXRVSUQgPSBmdW5jdGlvbiBnZXRVSUQoKSB7XHJcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDAwMCk7XHJcbiAgICB9O1xyXG4gICAgY29uc3QgZ2VuZXJhdGVOYW1lID0gKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgc3RhcnRJZCA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAlIDEwMDAwMDAwMCk7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGdlbmVyYXRlTmFtZSgpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdfX3dtJyArIGdldFVJRCgpICsgKHN0YXJ0SWQrKyArICdfXycpO1xyXG4gICAgICAgIH07XHJcbiAgICB9KSgpO1xyXG4gICAgV2Vha01hcCA9IGNsYXNzIFdlYWtNYXAge1xyXG4gICAgICAgIGNvbnN0cnVjdG9yKGl0ZXJhYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXNbU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdXZWFrTWFwJztcclxuICAgICAgICAgICAgdGhpcy5fbmFtZSA9IGdlbmVyYXRlTmFtZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9mcm96ZW5FbnRyaWVzID0gW107XHJcbiAgICAgICAgICAgIGlmIChpdGVyYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzQXJyYXlMaWtlKGl0ZXJhYmxlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlcmFibGUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGl0ZXJhYmxlW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldChpdGVtWzBdLCBpdGVtWzFdKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBpdGVyYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgX2dldEZyb3plbkVudHJ5SW5kZXgoa2V5KSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fZnJvemVuRW50cmllcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2Zyb3plbkVudHJpZXNbaV0ua2V5ID09PSBrZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlbGV0ZShrZXkpIHtcclxuICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0ga2V5W3RoaXMuX25hbWVdO1xyXG4gICAgICAgICAgICBpZiAoZW50cnkgJiYgZW50cnkua2V5ID09PSBrZXkgJiYgZW50cnkudmFsdWUgIT09IERFTEVURUQpIHtcclxuICAgICAgICAgICAgICAgIGVudHJ5LnZhbHVlID0gREVMRVRFRDtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGZyb3plbkluZGV4ID0gdGhpcy5fZ2V0RnJvemVuRW50cnlJbmRleChrZXkpO1xyXG4gICAgICAgICAgICBpZiAoZnJvemVuSW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZnJvemVuRW50cmllcy5zcGxpY2UoZnJvemVuSW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBnZXQoa2V5KSB7XHJcbiAgICAgICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBrZXlbdGhpcy5fbmFtZV07XHJcbiAgICAgICAgICAgIGlmIChlbnRyeSAmJiBlbnRyeS5rZXkgPT09IGtleSAmJiBlbnRyeS52YWx1ZSAhPT0gREVMRVRFRCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGZyb3plbkluZGV4ID0gdGhpcy5fZ2V0RnJvemVuRW50cnlJbmRleChrZXkpO1xyXG4gICAgICAgICAgICBpZiAoZnJvemVuSW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zyb3plbkVudHJpZXNbZnJvemVuSW5kZXhdLnZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhhcyhrZXkpIHtcclxuICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0ga2V5W3RoaXMuX25hbWVdO1xyXG4gICAgICAgICAgICBpZiAoQm9vbGVhbihlbnRyeSAmJiBlbnRyeS5rZXkgPT09IGtleSAmJiBlbnRyeS52YWx1ZSAhPT0gREVMRVRFRCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGZyb3plbkluZGV4ID0gdGhpcy5fZ2V0RnJvemVuRW50cnlJbmRleChrZXkpO1xyXG4gICAgICAgICAgICBpZiAoZnJvemVuSW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXQoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgICAgICBpZiAoIWtleSB8fCAodHlwZW9mIGtleSAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIGtleSAhPT0gJ2Z1bmN0aW9uJykpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgdmFsdWUgdXNlZCBhcyB3ZWFrIG1hcCBrZXknKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgZW50cnkgPSBrZXlbdGhpcy5fbmFtZV07XHJcbiAgICAgICAgICAgIGlmICghZW50cnkgfHwgZW50cnkua2V5ICE9PSBrZXkpIHtcclxuICAgICAgICAgICAgICAgIGVudHJ5ID0gT2JqZWN0LmNyZWF0ZShudWxsLCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiB7IHZhbHVlOiBrZXkgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmlzRnJvemVuKGtleSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mcm96ZW5FbnRyaWVzLnB1c2goZW50cnkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGtleSwgdGhpcy5fbmFtZSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZW50cnlcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbnRyeS52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydCBkZWZhdWx0IFdlYWtNYXA7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdlYWtNYXAubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vV2Vha01hcC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vV2Vha01hcC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4vZ2xvYmFsJztcclxuaW1wb3J0IHsgaXNBcnJheUxpa2UsIGlzSXRlcmFibGUgfSBmcm9tICcuL2l0ZXJhdG9yJztcclxuaW1wb3J0IHsgTUFYX1NBRkVfSU5URUdFUiB9IGZyb20gJy4vbnVtYmVyJztcclxuaW1wb3J0IGhhcyBmcm9tICcuL3N1cHBvcnQvaGFzJztcclxuaW1wb3J0IHsgd3JhcE5hdGl2ZSB9IGZyb20gJy4vc3VwcG9ydC91dGlsJztcclxuZXhwb3J0IGxldCBmcm9tO1xyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBhcnJheSBmcm9tIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzLlxyXG4gKlxyXG4gKiBAcGFyYW0gYXJndW1lbnRzIEFueSBudW1iZXIgb2YgYXJndW1lbnRzIGZvciB0aGUgYXJyYXlcclxuICogQHJldHVybiBBbiBhcnJheSBmcm9tIHRoZSBnaXZlbiBhcmd1bWVudHNcclxuICovXHJcbmV4cG9ydCBsZXQgb2Y7XHJcbi8qIEVTNiBBcnJheSBpbnN0YW5jZSBtZXRob2RzICovXHJcbi8qKlxyXG4gKiBDb3BpZXMgZGF0YSBpbnRlcm5hbGx5IHdpdGhpbiBhbiBhcnJheSBvciBhcnJheS1saWtlIG9iamVjdC5cclxuICpcclxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IGFycmF5LWxpa2Ugb2JqZWN0XHJcbiAqIEBwYXJhbSBvZmZzZXQgVGhlIGluZGV4IHRvIHN0YXJ0IGNvcHlpbmcgdmFsdWVzIHRvOyBpZiBuZWdhdGl2ZSwgaXQgY291bnRzIGJhY2t3YXJkcyBmcm9tIGxlbmd0aFxyXG4gKiBAcGFyYW0gc3RhcnQgVGhlIGZpcnN0IChpbmNsdXNpdmUpIGluZGV4IHRvIGNvcHk7IGlmIG5lZ2F0aXZlLCBpdCBjb3VudHMgYmFja3dhcmRzIGZyb20gbGVuZ3RoXHJcbiAqIEBwYXJhbSBlbmQgVGhlIGxhc3QgKGV4Y2x1c2l2ZSkgaW5kZXggdG8gY29weTsgaWYgbmVnYXRpdmUsIGl0IGNvdW50cyBiYWNrd2FyZHMgZnJvbSBsZW5ndGhcclxuICogQHJldHVybiBUaGUgdGFyZ2V0XHJcbiAqL1xyXG5leHBvcnQgbGV0IGNvcHlXaXRoaW47XHJcbi8qKlxyXG4gKiBGaWxscyBlbGVtZW50cyBvZiBhbiBhcnJheS1saWtlIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuXHJcbiAqXHJcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCB0byBmaWxsXHJcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBlYWNoIGVsZW1lbnQgb2YgdGhlIHRhcmdldCB3aXRoXHJcbiAqIEBwYXJhbSBzdGFydCBUaGUgZmlyc3QgaW5kZXggdG8gZmlsbFxyXG4gKiBAcGFyYW0gZW5kIFRoZSAoZXhjbHVzaXZlKSBpbmRleCBhdCB3aGljaCB0byBzdG9wIGZpbGxpbmdcclxuICogQHJldHVybiBUaGUgZmlsbGVkIHRhcmdldFxyXG4gKi9cclxuZXhwb3J0IGxldCBmaWxsO1xyXG4vKipcclxuICogRmluZHMgYW5kIHJldHVybnMgdGhlIGZpcnN0IGluc3RhbmNlIG1hdGNoaW5nIHRoZSBjYWxsYmFjayBvciB1bmRlZmluZWQgaWYgb25lIGlzIG5vdCBmb3VuZC5cclxuICpcclxuICogQHBhcmFtIHRhcmdldCBBbiBhcnJheS1saWtlIG9iamVjdFxyXG4gKiBAcGFyYW0gY2FsbGJhY2sgQSBmdW5jdGlvbiByZXR1cm5pbmcgaWYgdGhlIGN1cnJlbnQgdmFsdWUgbWF0Y2hlcyBhIGNyaXRlcmlhXHJcbiAqIEBwYXJhbSB0aGlzQXJnIFRoZSBleGVjdXRpb24gY29udGV4dCBmb3IgdGhlIGZpbmQgZnVuY3Rpb25cclxuICogQHJldHVybiBUaGUgZmlyc3QgZWxlbWVudCBtYXRjaGluZyB0aGUgY2FsbGJhY2ssIG9yIHVuZGVmaW5lZCBpZiBvbmUgZG9lcyBub3QgZXhpc3RcclxuICovXHJcbmV4cG9ydCBsZXQgZmluZDtcclxuLyoqXHJcbiAqIFBlcmZvcm1zIGEgbGluZWFyIHNlYXJjaCBhbmQgcmV0dXJucyB0aGUgZmlyc3QgaW5kZXggd2hvc2UgdmFsdWUgc2F0aXNmaWVzIHRoZSBwYXNzZWQgY2FsbGJhY2ssXHJcbiAqIG9yIC0xIGlmIG5vIHZhbHVlcyBzYXRpc2Z5IGl0LlxyXG4gKlxyXG4gKiBAcGFyYW0gdGFyZ2V0IEFuIGFycmF5LWxpa2Ugb2JqZWN0XHJcbiAqIEBwYXJhbSBjYWxsYmFjayBBIGZ1bmN0aW9uIHJldHVybmluZyB0cnVlIGlmIHRoZSBjdXJyZW50IHZhbHVlIHNhdGlzZmllcyBpdHMgY3JpdGVyaWFcclxuICogQHBhcmFtIHRoaXNBcmcgVGhlIGV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgZmluZCBmdW5jdGlvblxyXG4gKiBAcmV0dXJuIFRoZSBmaXJzdCBpbmRleCB3aG9zZSB2YWx1ZSBzYXRpc2ZpZXMgdGhlIHBhc3NlZCBjYWxsYmFjaywgb3IgLTEgaWYgbm8gdmFsdWVzIHNhdGlzZnkgaXRcclxuICovXHJcbmV4cG9ydCBsZXQgZmluZEluZGV4O1xyXG4vKiBFUzcgQXJyYXkgaW5zdGFuY2UgbWV0aG9kcyAqL1xyXG4vKipcclxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGFycmF5IGluY2x1ZGVzIGEgZ2l2ZW4gdmFsdWVcclxuICpcclxuICogQHBhcmFtIHRhcmdldCB0aGUgdGFyZ2V0IGFycmF5LWxpa2Ugb2JqZWN0XHJcbiAqIEBwYXJhbSBzZWFyY2hFbGVtZW50IHRoZSBpdGVtIHRvIHNlYXJjaCBmb3JcclxuICogQHBhcmFtIGZyb21JbmRleCB0aGUgc3RhcnRpbmcgaW5kZXggdG8gc2VhcmNoIGZyb21cclxuICogQHJldHVybiBgdHJ1ZWAgaWYgdGhlIGFycmF5IGluY2x1ZGVzIHRoZSBlbGVtZW50LCBvdGhlcndpc2UgYGZhbHNlYFxyXG4gKi9cclxuZXhwb3J0IGxldCBpbmNsdWRlcztcclxuaWYgKHRydWUgJiYgdHJ1ZSkge1xyXG4gICAgZnJvbSA9IGdsb2JhbC5BcnJheS5mcm9tO1xyXG4gICAgb2YgPSBnbG9iYWwuQXJyYXkub2Y7XHJcbiAgICBjb3B5V2l0aGluID0gd3JhcE5hdGl2ZShnbG9iYWwuQXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4pO1xyXG4gICAgZmlsbCA9IHdyYXBOYXRpdmUoZ2xvYmFsLkFycmF5LnByb3RvdHlwZS5maWxsKTtcclxuICAgIGZpbmQgPSB3cmFwTmF0aXZlKGdsb2JhbC5BcnJheS5wcm90b3R5cGUuZmluZCk7XHJcbiAgICBmaW5kSW5kZXggPSB3cmFwTmF0aXZlKGdsb2JhbC5BcnJheS5wcm90b3R5cGUuZmluZEluZGV4KTtcclxufVxyXG5lbHNlIHtcclxuICAgIC8vIEl0IGlzIG9ubHkgb2xkZXIgdmVyc2lvbnMgb2YgU2FmYXJpL2lPUyB0aGF0IGhhdmUgYSBiYWQgZmlsbCBpbXBsZW1lbnRhdGlvbiBhbmQgc28gYXJlbid0IGluIHRoZSB3aWxkXHJcbiAgICAvLyBUbyBtYWtlIHRoaW5ncyBlYXNpZXIsIGlmIHRoZXJlIGlzIGEgYmFkIGZpbGwgaW1wbGVtZW50YXRpb24sIHRoZSB3aG9sZSBzZXQgb2YgZnVuY3Rpb25zIHdpbGwgYmUgZmlsbGVkXHJcbiAgICAvKipcclxuICAgICAqIEVuc3VyZXMgYSBub24tbmVnYXRpdmUsIG5vbi1pbmZpbml0ZSwgc2FmZSBpbnRlZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciB0byB2YWxpZGF0ZVxyXG4gICAgICogQHJldHVybiBBIHByb3BlciBsZW5ndGhcclxuICAgICAqL1xyXG4gICAgY29uc3QgdG9MZW5ndGggPSBmdW5jdGlvbiB0b0xlbmd0aChsZW5ndGgpIHtcclxuICAgICAgICBpZiAoaXNOYU4obGVuZ3RoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aCk7XHJcbiAgICAgICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcclxuICAgICAgICAgICAgbGVuZ3RoID0gTWF0aC5mbG9vcihsZW5ndGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBFbnN1cmUgYSBub24tbmVnYXRpdmUsIHJlYWwsIHNhZmUgaW50ZWdlclxyXG4gICAgICAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heChsZW5ndGgsIDApLCBNQVhfU0FGRV9JTlRFR0VSKTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIEZyb20gRVM2IDcuMS40IFRvSW50ZWdlcigpXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHZhbHVlIEEgdmFsdWUgdG8gY29udmVydFxyXG4gICAgICogQHJldHVybiBBbiBpbnRlZ2VyXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHRvSW50ZWdlciA9IGZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSkge1xyXG4gICAgICAgIHZhbHVlID0gTnVtYmVyKHZhbHVlKTtcclxuICAgICAgICBpZiAoaXNOYU4odmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsdWUgPT09IDAgfHwgIWlzRmluaXRlKHZhbHVlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAodmFsdWUgPiAwID8gMSA6IC0xKSAqIE1hdGguZmxvb3IoTWF0aC5hYnModmFsdWUpKTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIE5vcm1hbGl6ZXMgYW4gb2Zmc2V0IGFnYWluc3QgYSBnaXZlbiBsZW5ndGgsIHdyYXBwaW5nIGl0IGlmIG5lZ2F0aXZlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgb3JpZ2luYWwgb2Zmc2V0XHJcbiAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSB0b3RhbCBsZW5ndGggdG8gbm9ybWFsaXplIGFnYWluc3RcclxuICAgICAqIEByZXR1cm4gSWYgbmVnYXRpdmUsIHByb3ZpZGUgYSBkaXN0YW5jZSBmcm9tIHRoZSBlbmQgKGxlbmd0aCk7IG90aGVyd2lzZSBwcm92aWRlIGEgZGlzdGFuY2UgZnJvbSAwXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IG5vcm1hbGl6ZU9mZnNldCA9IGZ1bmN0aW9uIG5vcm1hbGl6ZU9mZnNldCh2YWx1ZSwgbGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlIDwgMCA/IE1hdGgubWF4KGxlbmd0aCArIHZhbHVlLCAwKSA6IE1hdGgubWluKHZhbHVlLCBsZW5ndGgpO1xyXG4gICAgfTtcclxuICAgIGZyb20gPSBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZSwgbWFwRnVuY3Rpb24sIHRoaXNBcmcpIHtcclxuICAgICAgICBpZiAoYXJyYXlMaWtlID09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZnJvbTogcmVxdWlyZXMgYW4gYXJyYXktbGlrZSBvYmplY3QnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1hcEZ1bmN0aW9uICYmIHRoaXNBcmcpIHtcclxuICAgICAgICAgICAgbWFwRnVuY3Rpb24gPSBtYXBGdW5jdGlvbi5iaW5kKHRoaXNBcmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZSAqL1xyXG4gICAgICAgIGNvbnN0IENvbnN0cnVjdG9yID0gdGhpcztcclxuICAgICAgICBjb25zdCBsZW5ndGggPSB0b0xlbmd0aChhcnJheUxpa2UubGVuZ3RoKTtcclxuICAgICAgICAvLyBTdXBwb3J0IGV4dGVuc2lvblxyXG4gICAgICAgIGNvbnN0IGFycmF5ID0gdHlwZW9mIENvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nID8gT2JqZWN0KG5ldyBDb25zdHJ1Y3RvcihsZW5ndGgpKSA6IG5ldyBBcnJheShsZW5ndGgpO1xyXG4gICAgICAgIGlmICghaXNBcnJheUxpa2UoYXJyYXlMaWtlKSAmJiAhaXNJdGVyYWJsZShhcnJheUxpa2UpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhcnJheTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgdGhpcyBpcyBhbiBhcnJheSBhbmQgdGhlIG5vcm1hbGl6ZWQgbGVuZ3RoIGlzIDAsIGp1c3QgcmV0dXJuIGFuIGVtcHR5IGFycmF5LiB0aGlzIHByZXZlbnRzIGEgcHJvYmxlbVxyXG4gICAgICAgIC8vIHdpdGggdGhlIGl0ZXJhdGlvbiBvbiBJRSB3aGVuIHVzaW5nIGEgTmFOIGFycmF5IGxlbmd0aC5cclxuICAgICAgICBpZiAoaXNBcnJheUxpa2UoYXJyYXlMaWtlKSkge1xyXG4gICAgICAgICAgICBpZiAobGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheUxpa2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGFycmF5W2ldID0gbWFwRnVuY3Rpb24gPyBtYXBGdW5jdGlvbihhcnJheUxpa2VbaV0sIGkpIDogYXJyYXlMaWtlW2ldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgaSA9IDA7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgYXJyYXlMaWtlKSB7XHJcbiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IG1hcEZ1bmN0aW9uID8gbWFwRnVuY3Rpb24odmFsdWUsIGkpIDogdmFsdWU7XHJcbiAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFycmF5TGlrZS5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBhcnJheS5sZW5ndGggPSBsZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhcnJheTtcclxuICAgIH07XHJcbiAgICBvZiA9IGZ1bmN0aW9uIG9mKC4uLml0ZW1zKSB7XHJcbiAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGl0ZW1zKTtcclxuICAgIH07XHJcbiAgICBjb3B5V2l0aGluID0gZnVuY3Rpb24gY29weVdpdGhpbih0YXJnZXQsIG9mZnNldCwgc3RhcnQsIGVuZCkge1xyXG4gICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjb3B5V2l0aGluOiB0YXJnZXQgbXVzdCBiZSBhbiBhcnJheS1saWtlIG9iamVjdCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBsZW5ndGggPSB0b0xlbmd0aCh0YXJnZXQubGVuZ3RoKTtcclxuICAgICAgICBvZmZzZXQgPSBub3JtYWxpemVPZmZzZXQodG9JbnRlZ2VyKG9mZnNldCksIGxlbmd0aCk7XHJcbiAgICAgICAgc3RhcnQgPSBub3JtYWxpemVPZmZzZXQodG9JbnRlZ2VyKHN0YXJ0KSwgbGVuZ3RoKTtcclxuICAgICAgICBlbmQgPSBub3JtYWxpemVPZmZzZXQoZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0ludGVnZXIoZW5kKSwgbGVuZ3RoKTtcclxuICAgICAgICBsZXQgY291bnQgPSBNYXRoLm1pbihlbmQgLSBzdGFydCwgbGVuZ3RoIC0gb2Zmc2V0KTtcclxuICAgICAgICBsZXQgZGlyZWN0aW9uID0gMTtcclxuICAgICAgICBpZiAob2Zmc2V0ID4gc3RhcnQgJiYgb2Zmc2V0IDwgc3RhcnQgKyBjb3VudCkge1xyXG4gICAgICAgICAgICBkaXJlY3Rpb24gPSAtMTtcclxuICAgICAgICAgICAgc3RhcnQgKz0gY291bnQgLSAxO1xyXG4gICAgICAgICAgICBvZmZzZXQgKz0gY291bnQgLSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICB3aGlsZSAoY291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCBpbiB0YXJnZXQpIHtcclxuICAgICAgICAgICAgICAgIHRhcmdldFtvZmZzZXRdID0gdGFyZ2V0W3N0YXJ0XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0YXJnZXRbb2Zmc2V0XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvZmZzZXQgKz0gZGlyZWN0aW9uO1xyXG4gICAgICAgICAgICBzdGFydCArPSBkaXJlY3Rpb247XHJcbiAgICAgICAgICAgIGNvdW50LS07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XHJcbiAgICB9O1xyXG4gICAgZmlsbCA9IGZ1bmN0aW9uIGZpbGwodGFyZ2V0LCB2YWx1ZSwgc3RhcnQsIGVuZCkge1xyXG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRvTGVuZ3RoKHRhcmdldC5sZW5ndGgpO1xyXG4gICAgICAgIGxldCBpID0gbm9ybWFsaXplT2Zmc2V0KHRvSW50ZWdlcihzdGFydCksIGxlbmd0aCk7XHJcbiAgICAgICAgZW5kID0gbm9ybWFsaXplT2Zmc2V0KGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9JbnRlZ2VyKGVuZCksIGxlbmd0aCk7XHJcbiAgICAgICAgd2hpbGUgKGkgPCBlbmQpIHtcclxuICAgICAgICAgICAgdGFyZ2V0W2krK10gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcclxuICAgIH07XHJcbiAgICBmaW5kID0gZnVuY3Rpb24gZmluZCh0YXJnZXQsIGNhbGxiYWNrLCB0aGlzQXJnKSB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBmaW5kSW5kZXgodGFyZ2V0LCBjYWxsYmFjaywgdGhpc0FyZyk7XHJcbiAgICAgICAgcmV0dXJuIGluZGV4ICE9PSAtMSA/IHRhcmdldFtpbmRleF0gOiB1bmRlZmluZWQ7XHJcbiAgICB9O1xyXG4gICAgZmluZEluZGV4ID0gZnVuY3Rpb24gZmluZEluZGV4KHRhcmdldCwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcclxuICAgICAgICBjb25zdCBsZW5ndGggPSB0b0xlbmd0aCh0YXJnZXQubGVuZ3RoKTtcclxuICAgICAgICBpZiAoIWNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZpbmQ6IHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXNBcmcpIHtcclxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjay5iaW5kKHRoaXNBcmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChjYWxsYmFjayh0YXJnZXRbaV0sIGksIHRhcmdldCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgIH07XHJcbn1cclxuaWYgKHRydWUpIHtcclxuICAgIGluY2x1ZGVzID0gd3JhcE5hdGl2ZShnbG9iYWwuQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzKTtcclxufVxyXG5lbHNlIHtcclxuICAgIC8qKlxyXG4gICAgICogRW5zdXJlcyBhIG5vbi1uZWdhdGl2ZSwgbm9uLWluZmluaXRlLCBzYWZlIGludGVnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIHRvIHZhbGlkYXRlXHJcbiAgICAgKiBAcmV0dXJuIEEgcHJvcGVyIGxlbmd0aFxyXG4gICAgICovXHJcbiAgICBjb25zdCB0b0xlbmd0aCA9IGZ1bmN0aW9uIHRvTGVuZ3RoKGxlbmd0aCkge1xyXG4gICAgICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpO1xyXG4gICAgICAgIGlmIChpc05hTihsZW5ndGgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xyXG4gICAgICAgICAgICBsZW5ndGggPSBNYXRoLmZsb29yKGxlbmd0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEVuc3VyZSBhIG5vbi1uZWdhdGl2ZSwgcmVhbCwgc2FmZSBpbnRlZ2VyXHJcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KGxlbmd0aCwgMCksIE1BWF9TQUZFX0lOVEVHRVIpO1xyXG4gICAgfTtcclxuICAgIGluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXModGFyZ2V0LCBzZWFyY2hFbGVtZW50LCBmcm9tSW5kZXggPSAwKSB7XHJcbiAgICAgICAgbGV0IGxlbiA9IHRvTGVuZ3RoKHRhcmdldC5sZW5ndGgpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSBmcm9tSW5kZXg7IGkgPCBsZW47ICsraSkge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RWxlbWVudCA9IHRhcmdldFtpXTtcclxuICAgICAgICAgICAgaWYgKHNlYXJjaEVsZW1lbnQgPT09IGN1cnJlbnRFbGVtZW50IHx8XHJcbiAgICAgICAgICAgICAgICAoc2VhcmNoRWxlbWVudCAhPT0gc2VhcmNoRWxlbWVudCAmJiBjdXJyZW50RWxlbWVudCAhPT0gY3VycmVudEVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9O1xyXG59XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFycmF5Lm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL2FycmF5Lm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9hcnJheS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJjb25zdCBnbG9iYWxPYmplY3QgPSAoZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBnbG9iYWwgc3BlYyBkZWZpbmVzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0IGNhbGxlZCAnZ2xvYmFsJ1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1nbG9iYWxcbiAgICAgICAgLy8gYGdsb2JhbGAgaXMgYWxzbyBkZWZpbmVkIGluIE5vZGVKU1xuICAgICAgICByZXR1cm4gZ2xvYmFsO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyB3aW5kb3cgaXMgZGVmaW5lZCBpbiBicm93c2Vyc1xuICAgICAgICByZXR1cm4gd2luZG93O1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gc2VsZiBpcyBkZWZpbmVkIGluIFdlYldvcmtlcnNcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxufSkoKTtcbmV4cG9ydCBkZWZhdWx0IGdsb2JhbE9iamVjdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdsb2JhbC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9nbG9iYWwubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL2dsb2JhbC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgJy4vU3ltYm9sJztcbmltcG9ydCB7IEhJR0hfU1VSUk9HQVRFX01BWCwgSElHSF9TVVJST0dBVEVfTUlOIH0gZnJvbSAnLi9zdHJpbmcnO1xuY29uc3Qgc3RhdGljRG9uZSA9IHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuLyoqXG4gKiBBIGNsYXNzIHRoYXQgX3NoaW1zXyBhbiBpdGVyYXRvciBpbnRlcmZhY2Ugb24gYXJyYXkgbGlrZSBvYmplY3RzLlxuICovXG5leHBvcnQgY2xhc3MgU2hpbUl0ZXJhdG9yIHtcbiAgICBjb25zdHJ1Y3RvcihsaXN0KSB7XG4gICAgICAgIHRoaXMuX25leHRJbmRleCA9IC0xO1xuICAgICAgICBpZiAoaXNJdGVyYWJsZShsaXN0KSkge1xuICAgICAgICAgICAgdGhpcy5fbmF0aXZlSXRlcmF0b3IgPSBsaXN0W1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2xpc3QgPSBsaXN0O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgbmV4dCBpdGVyYXRpb24gcmVzdWx0IGZvciB0aGUgSXRlcmF0b3JcbiAgICAgKi9cbiAgICBuZXh0KCkge1xuICAgICAgICBpZiAodGhpcy5fbmF0aXZlSXRlcmF0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9uYXRpdmVJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9saXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGljRG9uZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKyt0aGlzLl9uZXh0SW5kZXggPCB0aGlzLl9saXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkb25lOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5fbGlzdFt0aGlzLl9uZXh0SW5kZXhdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0aWNEb25lO1xuICAgIH1cbiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuLyoqXG4gKiBBIHR5cGUgZ3VhcmQgZm9yIGNoZWNraW5nIGlmIHNvbWV0aGluZyBoYXMgYW4gSXRlcmFibGUgaW50ZXJmYWNlXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB0eXBlIGd1YXJkIGFnYWluc3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSXRlcmFibGUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlW1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbic7XG59XG4vKipcbiAqIEEgdHlwZSBndWFyZCBmb3IgY2hlY2tpbmcgaWYgc29tZXRoaW5nIGlzIEFycmF5TGlrZVxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdHlwZSBndWFyZCBhZ2FpbnN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUubGVuZ3RoID09PSAnbnVtYmVyJztcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgaXRlcmF0b3IgZm9yIGFuIG9iamVjdFxuICpcbiAqIEBwYXJhbSBpdGVyYWJsZSBUaGUgaXRlcmFibGUgb2JqZWN0IHRvIHJldHVybiB0aGUgaXRlcmF0b3IgZm9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXQoaXRlcmFibGUpIHtcbiAgICBpZiAoaXNJdGVyYWJsZShpdGVyYWJsZSkpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNBcnJheUxpa2UoaXRlcmFibGUpKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2hpbUl0ZXJhdG9yKGl0ZXJhYmxlKTtcbiAgICB9XG59XG4vKipcbiAqIFNoaW1zIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGBmb3IgLi4uIG9mYCBibG9ja3NcbiAqXG4gKiBAcGFyYW0gaXRlcmFibGUgVGhlIG9iamVjdCB0aGUgcHJvdmlkZXMgYW4gaW50ZXJhdG9yIGludGVyZmFjZVxuICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB3aGljaCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBpdGVtIG9mIHRoZSBpdGVyYWJsZVxuICogQHBhcmFtIHRoaXNBcmcgT3B0aW9uYWwgc2NvcGUgdG8gcGFzcyB0aGUgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvck9mKGl0ZXJhYmxlLCBjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIGxldCBicm9rZW4gPSBmYWxzZTtcbiAgICBmdW5jdGlvbiBkb0JyZWFrKCkge1xuICAgICAgICBicm9rZW4gPSB0cnVlO1xuICAgIH1cbiAgICAvKiBXZSBuZWVkIHRvIGhhbmRsZSBpdGVyYXRpb24gb2YgZG91YmxlIGJ5dGUgc3RyaW5ncyBwcm9wZXJseSAqL1xuICAgIGlmIChpc0FycmF5TGlrZShpdGVyYWJsZSkgJiYgdHlwZW9mIGl0ZXJhYmxlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBsID0gaXRlcmFibGUubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgbGV0IGNoYXIgPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgIGlmIChpICsgMSA8IGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2RlID0gY2hhci5jaGFyQ29kZUF0KDApO1xuICAgICAgICAgICAgICAgIGlmIChjb2RlID49IEhJR0hfU1VSUk9HQVRFX01JTiAmJiBjb2RlIDw9IEhJR0hfU1VSUk9HQVRFX01BWCkge1xuICAgICAgICAgICAgICAgICAgICBjaGFyICs9IGl0ZXJhYmxlWysraV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzQXJnLCBjaGFyLCBpdGVyYWJsZSwgZG9CcmVhayk7XG4gICAgICAgICAgICBpZiAoYnJva2VuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBpdGVyYXRvciA9IGdldChpdGVyYWJsZSk7XG4gICAgICAgIGlmIChpdGVyYXRvcikge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIHdoaWxlICghcmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHJlc3VsdC52YWx1ZSwgaXRlcmFibGUsIGRvQnJlYWspO1xuICAgICAgICAgICAgICAgIGlmIChicm9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pdGVyYXRvci5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9pdGVyYXRvci5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vaXRlcmF0b3IubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XG4vKipcbiAqIFRoZSBzbWFsbGVzdCBpbnRlcnZhbCBiZXR3ZWVuIHR3byByZXByZXNlbnRhYmxlIG51bWJlcnMuXG4gKi9cbmV4cG9ydCBjb25zdCBFUFNJTE9OID0gMTtcbi8qKlxuICogVGhlIG1heGltdW0gc2FmZSBpbnRlZ2VyIGluIEphdmFTY3JpcHRcbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9TQUZFX0lOVEVHRVIgPSBNYXRoLnBvdygyLCA1MykgLSAxO1xuLyoqXG4gKiBUaGUgbWluaW11bSBzYWZlIGludGVnZXIgaW4gSmF2YVNjcmlwdFxuICovXG5leHBvcnQgY29uc3QgTUlOX1NBRkVfSU5URUdFUiA9IC1NQVhfU0FGRV9JTlRFR0VSO1xuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhc3NlZCB2YWx1ZSBpcyBOYU4gd2l0aG91dCBjb2Vyc2lvbi5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgTmFOLCBmYWxzZSBpZiBpdCBpcyBub3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTmFOKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgZ2xvYmFsLmlzTmFOKHZhbHVlKTtcbn1cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXNzZWQgdmFsdWUgaXMgYSBmaW5pdGUgbnVtYmVyIHdpdGhvdXQgY29lcnNpb24uXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGZpbml0ZSwgZmFsc2UgaWYgaXQgaXMgbm90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Zpbml0ZSh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGdsb2JhbC5pc0Zpbml0ZSh2YWx1ZSk7XG59XG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGFzc2VkIHZhbHVlIGlzIGFuIGludGVnZXIuXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGFuIGludGVnZXIsIGZhbHNlIGlmIGl0IGlzIG5vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJbnRlZ2VyKHZhbHVlKSB7XG4gICAgcmV0dXJuIGlzRmluaXRlKHZhbHVlKSAmJiBNYXRoLmZsb29yKHZhbHVlKSA9PT0gdmFsdWU7XG59XG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGFzc2VkIHZhbHVlIGlzIGFuIGludGVnZXIgdGhhdCBpcyAnc2FmZSwnIG1lYW5pbmc6XG4gKiAgIDEuIGl0IGNhbiBiZSBleHByZXNzZWQgYXMgYW4gSUVFRS03NTQgZG91YmxlIHByZWNpc2lvbiBudW1iZXJcbiAqICAgMi4gaXQgaGFzIGEgb25lLXRvLW9uZSBtYXBwaW5nIHRvIGEgbWF0aGVtYXRpY2FsIGludGVnZXIsIG1lYW5pbmcgaXRzXG4gKiAgICAgIElFRUUtNzU0IHJlcHJlc2VudGF0aW9uIGNhbm5vdCBiZSB0aGUgcmVzdWx0IG9mIHJvdW5kaW5nIGFueSBvdGhlclxuICogICAgICBpbnRlZ2VyIHRvIGZpdCB0aGUgSUVFRS03NTQgcmVwcmVzZW50YXRpb25cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlciwgZmFsc2UgaWYgaXQgaXMgbm90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlKSB7XG4gICAgcmV0dXJuIGlzSW50ZWdlcih2YWx1ZSkgJiYgTWF0aC5hYnModmFsdWUpIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1udW1iZXIubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vbnVtYmVyLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9udW1iZXIubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XHJcbmltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XHJcbmltcG9ydCB7IGlzU3ltYm9sIH0gZnJvbSAnLi9TeW1ib2wnO1xyXG5leHBvcnQgbGV0IGFzc2lnbjtcclxuLyoqXHJcbiAqIEdldHMgdGhlIG93biBwcm9wZXJ0eSBkZXNjcmlwdG9yIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LlxyXG4gKiBBbiBvd24gcHJvcGVydHkgZGVzY3JpcHRvciBpcyBvbmUgdGhhdCBpcyBkZWZpbmVkIGRpcmVjdGx5IG9uIHRoZSBvYmplY3QgYW5kIGlzIG5vdFxyXG4gKiBpbmhlcml0ZWQgZnJvbSB0aGUgb2JqZWN0J3MgcHJvdG90eXBlLlxyXG4gKiBAcGFyYW0gbyBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgcHJvcGVydHkuXHJcbiAqIEBwYXJhbSBwIE5hbWUgb2YgdGhlIHByb3BlcnR5LlxyXG4gKi9cclxuZXhwb3J0IGxldCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgb3duIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0LiBUaGUgb3duIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IGFyZSB0aG9zZSB0aGF0IGFyZSBkZWZpbmVkIGRpcmVjdGx5XHJcbiAqIG9uIHRoYXQgb2JqZWN0LCBhbmQgYXJlIG5vdCBpbmhlcml0ZWQgZnJvbSB0aGUgb2JqZWN0J3MgcHJvdG90eXBlLiBUaGUgcHJvcGVydGllcyBvZiBhbiBvYmplY3QgaW5jbHVkZSBib3RoIGZpZWxkcyAob2JqZWN0cykgYW5kIGZ1bmN0aW9ucy5cclxuICogQHBhcmFtIG8gT2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIG93biBwcm9wZXJ0aWVzLlxyXG4gKi9cclxuZXhwb3J0IGxldCBnZXRPd25Qcm9wZXJ0eU5hbWVzO1xyXG4vKipcclxuICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgc3ltYm9sIHByb3BlcnRpZXMgZm91bmQgZGlyZWN0bHkgb24gb2JqZWN0IG8uXHJcbiAqIEBwYXJhbSBvIE9iamVjdCB0byByZXRyaWV2ZSB0aGUgc3ltYm9scyBmcm9tLlxyXG4gKi9cclxuZXhwb3J0IGxldCBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlcyBhcmUgdGhlIHNhbWUgdmFsdWUsIGZhbHNlIG90aGVyd2lzZS5cclxuICogQHBhcmFtIHZhbHVlMSBUaGUgZmlyc3QgdmFsdWUuXHJcbiAqIEBwYXJhbSB2YWx1ZTIgVGhlIHNlY29uZCB2YWx1ZS5cclxuICovXHJcbmV4cG9ydCBsZXQgaXM7XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIG9mIGFuIG9iamVjdC5cclxuICogQHBhcmFtIG8gT2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMuIFRoaXMgY2FuIGJlIGFuIG9iamVjdCB0aGF0IHlvdSBjcmVhdGVkIG9yIGFuIGV4aXN0aW5nIERvY3VtZW50IE9iamVjdCBNb2RlbCAoRE9NKSBvYmplY3QuXHJcbiAqL1xyXG5leHBvcnQgbGV0IGtleXM7XHJcbi8qIEVTNyBPYmplY3Qgc3RhdGljIG1ldGhvZHMgKi9cclxuZXhwb3J0IGxldCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzO1xyXG5leHBvcnQgbGV0IGVudHJpZXM7XHJcbmV4cG9ydCBsZXQgdmFsdWVzO1xyXG5pZiAodHJ1ZSkge1xyXG4gICAgY29uc3QgZ2xvYmFsT2JqZWN0ID0gZ2xvYmFsLk9iamVjdDtcclxuICAgIGFzc2lnbiA9IGdsb2JhbE9iamVjdC5hc3NpZ247XHJcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBnbG9iYWxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xyXG4gICAgZ2V0T3duUHJvcGVydHlOYW1lcyA9IGdsb2JhbE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzO1xyXG4gICAgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2xvYmFsT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcclxuICAgIGlzID0gZ2xvYmFsT2JqZWN0LmlzO1xyXG4gICAga2V5cyA9IGdsb2JhbE9iamVjdC5rZXlzO1xyXG59XHJcbmVsc2Uge1xyXG4gICAga2V5cyA9IGZ1bmN0aW9uIHN5bWJvbEF3YXJlS2V5cyhvKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG8pLmZpbHRlcigoa2V5KSA9PiAhQm9vbGVhbihrZXkubWF0Y2goL15AQC4rLykpKTtcclxuICAgIH07XHJcbiAgICBhc3NpZ24gPSBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCAuLi5zb3VyY2VzKSB7XHJcbiAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIC8vIFR5cGVFcnJvciBpZiB1bmRlZmluZWQgb3IgbnVsbFxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdG8gPSBPYmplY3QodGFyZ2V0KTtcclxuICAgICAgICBzb3VyY2VzLmZvckVhY2goKG5leHRTb3VyY2UpID0+IHtcclxuICAgICAgICAgICAgaWYgKG5leHRTb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgIC8vIFNraXAgb3ZlciBpZiB1bmRlZmluZWQgb3IgbnVsbFxyXG4gICAgICAgICAgICAgICAga2V5cyhuZXh0U291cmNlKS5mb3JFYWNoKChuZXh0S2V5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9bbmV4dEtleV0gPSBuZXh0U291cmNlW25leHRLZXldO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdG87XHJcbiAgICB9O1xyXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8sIHByb3ApIHtcclxuICAgICAgICBpZiAoaXNTeW1ib2wocHJvcCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobywgcHJvcCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvLCBwcm9wKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMobykge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvKS5maWx0ZXIoKGtleSkgPT4gIUJvb2xlYW4oa2V5Lm1hdGNoKC9eQEAuKy8pKSk7XHJcbiAgICB9O1xyXG4gICAgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKG8pIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobylcclxuICAgICAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBCb29sZWFuKGtleS5tYXRjaCgvXkBALisvKSkpXHJcbiAgICAgICAgICAgIC5tYXAoKGtleSkgPT4gU3ltYm9sLmZvcihrZXkuc3Vic3RyaW5nKDIpKSk7XHJcbiAgICB9O1xyXG4gICAgaXMgPSBmdW5jdGlvbiBpcyh2YWx1ZTEsIHZhbHVlMikge1xyXG4gICAgICAgIGlmICh2YWx1ZTEgPT09IHZhbHVlMikge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUxICE9PSAwIHx8IDEgLyB2YWx1ZTEgPT09IDEgLyB2YWx1ZTI7IC8vIC0wXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWx1ZTEgIT09IHZhbHVlMSAmJiB2YWx1ZTIgIT09IHZhbHVlMjsgLy8gTmFOXHJcbiAgICB9O1xyXG59XHJcbmlmICh0cnVlKSB7XHJcbiAgICBjb25zdCBnbG9iYWxPYmplY3QgPSBnbG9iYWwuT2JqZWN0O1xyXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA9IGdsb2JhbE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzO1xyXG4gICAgZW50cmllcyA9IGdsb2JhbE9iamVjdC5lbnRyaWVzO1xyXG4gICAgdmFsdWVzID0gZ2xvYmFsT2JqZWN0LnZhbHVlcztcclxufVxyXG5lbHNlIHtcclxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG8pIHtcclxuICAgICAgICByZXR1cm4gZ2V0T3duUHJvcGVydHlOYW1lcyhvKS5yZWR1Y2UoKHByZXZpb3VzLCBrZXkpID0+IHtcclxuICAgICAgICAgICAgcHJldmlvdXNba2V5XSA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihvLCBrZXkpO1xyXG4gICAgICAgICAgICByZXR1cm4gcHJldmlvdXM7XHJcbiAgICAgICAgfSwge30pO1xyXG4gICAgfTtcclxuICAgIGVudHJpZXMgPSBmdW5jdGlvbiBlbnRyaWVzKG8pIHtcclxuICAgICAgICByZXR1cm4ga2V5cyhvKS5tYXAoKGtleSkgPT4gW2tleSwgb1trZXldXSk7XHJcbiAgICB9O1xyXG4gICAgdmFsdWVzID0gZnVuY3Rpb24gdmFsdWVzKG8pIHtcclxuICAgICAgICByZXR1cm4ga2V5cyhvKS5tYXAoKGtleSkgPT4gb1trZXldKTtcclxuICAgIH07XHJcbn1cclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b2JqZWN0Lm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL29iamVjdC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vb2JqZWN0Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xyXG5pbXBvcnQgaGFzIGZyb20gJy4vc3VwcG9ydC9oYXMnO1xyXG5pbXBvcnQgeyB3cmFwTmF0aXZlIH0gZnJvbSAnLi9zdXBwb3J0L3V0aWwnO1xyXG4vKipcclxuICogVGhlIG1pbmltdW0gbG9jYXRpb24gb2YgaGlnaCBzdXJyb2dhdGVzXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgSElHSF9TVVJST0dBVEVfTUlOID0gMHhkODAwO1xyXG4vKipcclxuICogVGhlIG1heGltdW0gbG9jYXRpb24gb2YgaGlnaCBzdXJyb2dhdGVzXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgSElHSF9TVVJST0dBVEVfTUFYID0gMHhkYmZmO1xyXG4vKipcclxuICogVGhlIG1pbmltdW0gbG9jYXRpb24gb2YgbG93IHN1cnJvZ2F0ZXNcclxuICovXHJcbmV4cG9ydCBjb25zdCBMT1dfU1VSUk9HQVRFX01JTiA9IDB4ZGMwMDtcclxuLyoqXHJcbiAqIFRoZSBtYXhpbXVtIGxvY2F0aW9uIG9mIGxvdyBzdXJyb2dhdGVzXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTE9XX1NVUlJPR0FURV9NQVggPSAweGRmZmY7XHJcbi8qIEVTNiBzdGF0aWMgbWV0aG9kcyAqL1xyXG4vKipcclxuICogUmV0dXJuIHRoZSBTdHJpbmcgdmFsdWUgd2hvc2UgZWxlbWVudHMgYXJlLCBpbiBvcmRlciwgdGhlIGVsZW1lbnRzIGluIHRoZSBMaXN0IGVsZW1lbnRzLlxyXG4gKiBJZiBsZW5ndGggaXMgMCwgdGhlIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC5cclxuICogQHBhcmFtIGNvZGVQb2ludHMgVGhlIGNvZGUgcG9pbnRzIHRvIGdlbmVyYXRlIHRoZSBzdHJpbmdcclxuICovXHJcbmV4cG9ydCBsZXQgZnJvbUNvZGVQb2ludDtcclxuLyoqXHJcbiAqIGByYXdgIGlzIGludGVuZGVkIGZvciB1c2UgYXMgYSB0YWcgZnVuY3Rpb24gb2YgYSBUYWdnZWQgVGVtcGxhdGUgU3RyaW5nLiBXaGVuIGNhbGxlZFxyXG4gKiBhcyBzdWNoIHRoZSBmaXJzdCBhcmd1bWVudCB3aWxsIGJlIGEgd2VsbCBmb3JtZWQgdGVtcGxhdGUgY2FsbCBzaXRlIG9iamVjdCBhbmQgdGhlIHJlc3RcclxuICogcGFyYW1ldGVyIHdpbGwgY29udGFpbiB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcy5cclxuICogQHBhcmFtIHRlbXBsYXRlIEEgd2VsbC1mb3JtZWQgdGVtcGxhdGUgc3RyaW5nIGNhbGwgc2l0ZSByZXByZXNlbnRhdGlvbi5cclxuICogQHBhcmFtIHN1YnN0aXR1dGlvbnMgQSBzZXQgb2Ygc3Vic3RpdHV0aW9uIHZhbHVlcy5cclxuICovXHJcbmV4cG9ydCBsZXQgcmF3O1xyXG4vKiBFUzYgaW5zdGFuY2UgbWV0aG9kcyAqL1xyXG4vKipcclxuICogUmV0dXJucyBhIG5vbm5lZ2F0aXZlIGludGVnZXIgTnVtYmVyIGxlc3MgdGhhbiAxMTE0MTEyICgweDExMDAwMCkgdGhhdCBpcyB0aGUgY29kZSBwb2ludFxyXG4gKiB2YWx1ZSBvZiB0aGUgVVRGLTE2IGVuY29kZWQgY29kZSBwb2ludCBzdGFydGluZyBhdCB0aGUgc3RyaW5nIGVsZW1lbnQgYXQgcG9zaXRpb24gcG9zIGluXHJcbiAqIHRoZSBTdHJpbmcgcmVzdWx0aW5nIGZyb20gY29udmVydGluZyB0aGlzIG9iamVjdCB0byBhIFN0cmluZy5cclxuICogSWYgdGhlcmUgaXMgbm8gZWxlbWVudCBhdCB0aGF0IHBvc2l0aW9uLCB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZC5cclxuICogSWYgYSB2YWxpZCBVVEYtMTYgc3Vycm9nYXRlIHBhaXIgZG9lcyBub3QgYmVnaW4gYXQgcG9zLCB0aGUgcmVzdWx0IGlzIHRoZSBjb2RlIHVuaXQgYXQgcG9zLlxyXG4gKi9cclxuZXhwb3J0IGxldCBjb2RlUG9pbnRBdDtcclxuLyoqXHJcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VxdWVuY2Ugb2YgZWxlbWVudHMgb2Ygc2VhcmNoU3RyaW5nIGNvbnZlcnRlZCB0byBhIFN0cmluZyBpcyB0aGVcclxuICogc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiB0aGlzIG9iamVjdCAoY29udmVydGVkIHRvIGEgU3RyaW5nKSBzdGFydGluZyBhdFxyXG4gKiBlbmRQb3NpdGlvbiDigJMgbGVuZ3RoKHRoaXMpLiBPdGhlcndpc2UgcmV0dXJucyBmYWxzZS5cclxuICovXHJcbmV4cG9ydCBsZXQgZW5kc1dpdGg7XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRydWUgaWYgc2VhcmNoU3RyaW5nIGFwcGVhcnMgYXMgYSBzdWJzdHJpbmcgb2YgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoaXNcclxuICogb2JqZWN0IHRvIGEgU3RyaW5nLCBhdCBvbmUgb3IgbW9yZSBwb3NpdGlvbnMgdGhhdCBhcmVcclxuICogZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHBvc2l0aW9uOyBvdGhlcndpc2UsIHJldHVybnMgZmFsc2UuXHJcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBzdHJpbmdcclxuICogQHBhcmFtIHNlYXJjaFN0cmluZyBzZWFyY2ggc3RyaW5nXHJcbiAqIEBwYXJhbSBwb3NpdGlvbiBJZiBwb3NpdGlvbiBpcyB1bmRlZmluZWQsIDAgaXMgYXNzdW1lZCwgc28gYXMgdG8gc2VhcmNoIGFsbCBvZiB0aGUgU3RyaW5nLlxyXG4gKi9cclxuZXhwb3J0IGxldCBpbmNsdWRlcztcclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIFN0cmluZyB2YWx1ZSByZXN1bHQgb2Ygbm9ybWFsaXppbmcgdGhlIHN0cmluZyBpbnRvIHRoZSBub3JtYWxpemF0aW9uIGZvcm1cclxuICogbmFtZWQgYnkgZm9ybSBhcyBzcGVjaWZpZWQgaW4gVW5pY29kZSBTdGFuZGFyZCBBbm5leCAjMTUsIFVuaWNvZGUgTm9ybWFsaXphdGlvbiBGb3Jtcy5cclxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHN0cmluZ1xyXG4gKiBAcGFyYW0gZm9ybSBBcHBsaWNhYmxlIHZhbHVlczogXCJORkNcIiwgXCJORkRcIiwgXCJORktDXCIsIG9yIFwiTkZLRFwiLCBJZiBub3Qgc3BlY2lmaWVkIGRlZmF1bHRcclxuICogaXMgXCJORkNcIlxyXG4gKi9cclxuZXhwb3J0IGxldCBub3JtYWxpemU7XHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgU3RyaW5nIHZhbHVlIHRoYXQgaXMgbWFkZSBmcm9tIGNvdW50IGNvcGllcyBhcHBlbmRlZCB0b2dldGhlci4gSWYgY291bnQgaXMgMCxcclxuICogVCBpcyB0aGUgZW1wdHkgU3RyaW5nIGlzIHJldHVybmVkLlxyXG4gKiBAcGFyYW0gY291bnQgbnVtYmVyIG9mIGNvcGllcyB0byBhcHBlbmRcclxuICovXHJcbmV4cG9ydCBsZXQgcmVwZWF0O1xyXG4vKipcclxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXF1ZW5jZSBvZiBlbGVtZW50cyBvZiBzZWFyY2hTdHJpbmcgY29udmVydGVkIHRvIGEgU3RyaW5nIGlzIHRoZVxyXG4gKiBzYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIHRoaXMgb2JqZWN0IChjb252ZXJ0ZWQgdG8gYSBTdHJpbmcpIHN0YXJ0aW5nIGF0XHJcbiAqIHBvc2l0aW9uLiBPdGhlcndpc2UgcmV0dXJucyBmYWxzZS5cclxuICovXHJcbmV4cG9ydCBsZXQgc3RhcnRzV2l0aDtcclxuLyogRVM3IGluc3RhbmNlIG1ldGhvZHMgKi9cclxuLyoqXHJcbiAqIFBhZHMgdGhlIGN1cnJlbnQgc3RyaW5nIHdpdGggYSBnaXZlbiBzdHJpbmcgKHBvc3NpYmx5IHJlcGVhdGVkKSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgc3RyaW5nIHJlYWNoZXMgYSBnaXZlbiBsZW5ndGguXHJcbiAqIFRoZSBwYWRkaW5nIGlzIGFwcGxpZWQgZnJvbSB0aGUgZW5kIChyaWdodCkgb2YgdGhlIGN1cnJlbnQgc3RyaW5nLlxyXG4gKlxyXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgc3RyaW5nXHJcbiAqIEBwYXJhbSBtYXhMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZyBvbmNlIHRoZSBjdXJyZW50IHN0cmluZyBoYXMgYmVlbiBwYWRkZWQuXHJcbiAqICAgICAgICBJZiB0aGlzIHBhcmFtZXRlciBpcyBzbWFsbGVyIHRoYW4gdGhlIGN1cnJlbnQgc3RyaW5nJ3MgbGVuZ3RoLCB0aGUgY3VycmVudCBzdHJpbmcgd2lsbCBiZSByZXR1cm5lZCBhcyBpdCBpcy5cclxuICpcclxuICogQHBhcmFtIGZpbGxTdHJpbmcgVGhlIHN0cmluZyB0byBwYWQgdGhlIGN1cnJlbnQgc3RyaW5nIHdpdGguXHJcbiAqICAgICAgICBJZiB0aGlzIHN0cmluZyBpcyB0b28gbG9uZywgaXQgd2lsbCBiZSB0cnVuY2F0ZWQgYW5kIHRoZSBsZWZ0LW1vc3QgcGFydCB3aWxsIGJlIGFwcGxpZWQuXHJcbiAqICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaXMgXCIgXCIgKFUrMDAyMCkuXHJcbiAqL1xyXG5leHBvcnQgbGV0IHBhZEVuZDtcclxuLyoqXHJcbiAqIFBhZHMgdGhlIGN1cnJlbnQgc3RyaW5nIHdpdGggYSBnaXZlbiBzdHJpbmcgKHBvc3NpYmx5IHJlcGVhdGVkKSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgc3RyaW5nIHJlYWNoZXMgYSBnaXZlbiBsZW5ndGguXHJcbiAqIFRoZSBwYWRkaW5nIGlzIGFwcGxpZWQgZnJvbSB0aGUgc3RhcnQgKGxlZnQpIG9mIHRoZSBjdXJyZW50IHN0cmluZy5cclxuICpcclxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHN0cmluZ1xyXG4gKiBAcGFyYW0gbWF4TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcgb25jZSB0aGUgY3VycmVudCBzdHJpbmcgaGFzIGJlZW4gcGFkZGVkLlxyXG4gKiAgICAgICAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgc21hbGxlciB0aGFuIHRoZSBjdXJyZW50IHN0cmluZydzIGxlbmd0aCwgdGhlIGN1cnJlbnQgc3RyaW5nIHdpbGwgYmUgcmV0dXJuZWQgYXMgaXQgaXMuXHJcbiAqXHJcbiAqIEBwYXJhbSBmaWxsU3RyaW5nIFRoZSBzdHJpbmcgdG8gcGFkIHRoZSBjdXJyZW50IHN0cmluZyB3aXRoLlxyXG4gKiAgICAgICAgSWYgdGhpcyBzdHJpbmcgaXMgdG9vIGxvbmcsIGl0IHdpbGwgYmUgdHJ1bmNhdGVkIGFuZCB0aGUgbGVmdC1tb3N0IHBhcnQgd2lsbCBiZSBhcHBsaWVkLlxyXG4gKiAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlzIFwiIFwiIChVKzAwMjApLlxyXG4gKi9cclxuZXhwb3J0IGxldCBwYWRTdGFydDtcclxuaWYgKHRydWUgJiYgdHJ1ZSkge1xyXG4gICAgZnJvbUNvZGVQb2ludCA9IGdsb2JhbC5TdHJpbmcuZnJvbUNvZGVQb2ludDtcclxuICAgIHJhdyA9IGdsb2JhbC5TdHJpbmcucmF3O1xyXG4gICAgY29kZVBvaW50QXQgPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0KTtcclxuICAgIGVuZHNXaXRoID0gd3JhcE5hdGl2ZShnbG9iYWwuU3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aCk7XHJcbiAgICBpbmNsdWRlcyA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMpO1xyXG4gICAgbm9ybWFsaXplID0gd3JhcE5hdGl2ZShnbG9iYWwuU3RyaW5nLnByb3RvdHlwZS5ub3JtYWxpemUpO1xyXG4gICAgcmVwZWF0ID0gd3JhcE5hdGl2ZShnbG9iYWwuU3RyaW5nLnByb3RvdHlwZS5yZXBlYXQpO1xyXG4gICAgc3RhcnRzV2l0aCA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aCk7XHJcbn1cclxuZWxzZSB7XHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXRlcyB0aGF0IHRleHQgaXMgZGVmaW5lZCwgYW5kIG5vcm1hbGl6ZXMgcG9zaXRpb24gKGJhc2VkIG9uIHRoZSBnaXZlbiBkZWZhdWx0IGlmIHRoZSBpbnB1dCBpcyBOYU4pLlxyXG4gICAgICogVXNlZCBieSBzdGFydHNXaXRoLCBpbmNsdWRlcywgYW5kIGVuZHNXaXRoLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gTm9ybWFsaXplZCBwb3NpdGlvbi5cclxuICAgICAqL1xyXG4gICAgY29uc3Qgbm9ybWFsaXplU3Vic3RyaW5nQXJncyA9IGZ1bmN0aW9uIChuYW1lLCB0ZXh0LCBzZWFyY2gsIHBvc2l0aW9uLCBpc0VuZCA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJpbmcuJyArIG5hbWUgKyAnIHJlcXVpcmVzIGEgdmFsaWQgc3RyaW5nIHRvIHNlYXJjaCBhZ2FpbnN0LicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBsZW5ndGggPSB0ZXh0Lmxlbmd0aDtcclxuICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uICE9PSBwb3NpdGlvbiA/IChpc0VuZCA/IGxlbmd0aCA6IDApIDogcG9zaXRpb247XHJcbiAgICAgICAgcmV0dXJuIFt0ZXh0LCBTdHJpbmcoc2VhcmNoKSwgTWF0aC5taW4oTWF0aC5tYXgocG9zaXRpb24sIDApLCBsZW5ndGgpXTtcclxuICAgIH07XHJcbiAgICBmcm9tQ29kZVBvaW50ID0gZnVuY3Rpb24gZnJvbUNvZGVQb2ludCguLi5jb2RlUG9pbnRzKSB7XHJcbiAgICAgICAgLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5mcm9tQ29kZVBvaW50XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcclxuICAgICAgICBpZiAoIWxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XHJcbiAgICAgICAgY29uc3QgTUFYX1NJWkUgPSAweDQwMDA7XHJcbiAgICAgICAgbGV0IGNvZGVVbml0cyA9IFtdO1xyXG4gICAgICAgIGxldCBpbmRleCA9IC0xO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcclxuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xyXG4gICAgICAgICAgICBsZXQgY29kZVBvaW50ID0gTnVtYmVyKGFyZ3VtZW50c1tpbmRleF0pO1xyXG4gICAgICAgICAgICAvLyBDb2RlIHBvaW50cyBtdXN0IGJlIGZpbml0ZSBpbnRlZ2VycyB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlXHJcbiAgICAgICAgICAgIGxldCBpc1ZhbGlkID0gaXNGaW5pdGUoY29kZVBvaW50KSAmJiBNYXRoLmZsb29yKGNvZGVQb2ludCkgPT09IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPj0gMCAmJiBjb2RlUG9pbnQgPD0gMHgxMGZmZmY7XHJcbiAgICAgICAgICAgIGlmICghaXNWYWxpZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcignc3RyaW5nLmZyb21Db2RlUG9pbnQ6IEludmFsaWQgY29kZSBwb2ludCAnICsgY29kZVBvaW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY29kZVBvaW50IDw9IDB4ZmZmZikge1xyXG4gICAgICAgICAgICAgICAgLy8gQk1QIGNvZGUgcG9pbnRcclxuICAgICAgICAgICAgICAgIGNvZGVVbml0cy5wdXNoKGNvZGVQb2ludCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBBc3RyYWwgY29kZSBwb2ludDsgc3BsaXQgaW4gc3Vycm9nYXRlIGhhbHZlc1xyXG4gICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmcjc3Vycm9nYXRlLWZvcm11bGFlXHJcbiAgICAgICAgICAgICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMDtcclxuICAgICAgICAgICAgICAgIGxldCBoaWdoU3Vycm9nYXRlID0gKGNvZGVQb2ludCA+PiAxMCkgKyBISUdIX1NVUlJPR0FURV9NSU47XHJcbiAgICAgICAgICAgICAgICBsZXQgbG93U3Vycm9nYXRlID0gY29kZVBvaW50ICUgMHg0MDAgKyBMT1dfU1VSUk9HQVRFX01JTjtcclxuICAgICAgICAgICAgICAgIGNvZGVVbml0cy5wdXNoKGhpZ2hTdXJyb2dhdGUsIGxvd1N1cnJvZ2F0ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA9PT0gbGVuZ3RoIHx8IGNvZGVVbml0cy5sZW5ndGggPiBNQVhfU0laRSkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGZyb21DaGFyQ29kZS5hcHBseShudWxsLCBjb2RlVW5pdHMpO1xyXG4gICAgICAgICAgICAgICAgY29kZVVuaXRzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcbiAgICByYXcgPSBmdW5jdGlvbiByYXcoY2FsbFNpdGUsIC4uLnN1YnN0aXR1dGlvbnMpIHtcclxuICAgICAgICBsZXQgcmF3U3RyaW5ncyA9IGNhbGxTaXRlLnJhdztcclxuICAgICAgICBsZXQgcmVzdWx0ID0gJyc7XHJcbiAgICAgICAgbGV0IG51bVN1YnN0aXR1dGlvbnMgPSBzdWJzdGl0dXRpb25zLmxlbmd0aDtcclxuICAgICAgICBpZiAoY2FsbFNpdGUgPT0gbnVsbCB8fCBjYWxsU2l0ZS5yYXcgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJpbmcucmF3IHJlcXVpcmVzIGEgdmFsaWQgY2FsbFNpdGUgb2JqZWN0IHdpdGggYSByYXcgdmFsdWUnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IHJhd1N0cmluZ3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgcmVzdWx0ICs9IHJhd1N0cmluZ3NbaV0gKyAoaSA8IG51bVN1YnN0aXR1dGlvbnMgJiYgaSA8IGxlbmd0aCAtIDEgPyBzdWJzdGl0dXRpb25zW2ldIDogJycpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfTtcclxuICAgIGNvZGVQb2ludEF0ID0gZnVuY3Rpb24gY29kZVBvaW50QXQodGV4dCwgcG9zaXRpb24gPSAwKSB7XHJcbiAgICAgICAgLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXRcclxuICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmluZy5jb2RlUG9pbnRBdCByZXF1cmllcyBhIHZhbGlkIHN0cmluZy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGV4dC5sZW5ndGg7XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uICE9PSBwb3NpdGlvbikge1xyXG4gICAgICAgICAgICBwb3NpdGlvbiA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gbGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEdldCB0aGUgZmlyc3QgY29kZSB1bml0XHJcbiAgICAgICAgY29uc3QgZmlyc3QgPSB0ZXh0LmNoYXJDb2RlQXQocG9zaXRpb24pO1xyXG4gICAgICAgIGlmIChmaXJzdCA+PSBISUdIX1NVUlJPR0FURV9NSU4gJiYgZmlyc3QgPD0gSElHSF9TVVJST0dBVEVfTUFYICYmIGxlbmd0aCA+IHBvc2l0aW9uICsgMSkge1xyXG4gICAgICAgICAgICAvLyBTdGFydCBvZiBhIHN1cnJvZ2F0ZSBwYWlyIChoaWdoIHN1cnJvZ2F0ZSBhbmQgdGhlcmUgaXMgYSBuZXh0IGNvZGUgdW5pdCk7IGNoZWNrIGZvciBsb3cgc3Vycm9nYXRlXHJcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nI3N1cnJvZ2F0ZS1mb3JtdWxhZVxyXG4gICAgICAgICAgICBjb25zdCBzZWNvbmQgPSB0ZXh0LmNoYXJDb2RlQXQocG9zaXRpb24gKyAxKTtcclxuICAgICAgICAgICAgaWYgKHNlY29uZCA+PSBMT1dfU1VSUk9HQVRFX01JTiAmJiBzZWNvbmQgPD0gTE9XX1NVUlJPR0FURV9NQVgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAoZmlyc3QgLSBISUdIX1NVUlJPR0FURV9NSU4pICogMHg0MDAgKyBzZWNvbmQgLSBMT1dfU1VSUk9HQVRFX01JTiArIDB4MTAwMDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZpcnN0O1xyXG4gICAgfTtcclxuICAgIGVuZHNXaXRoID0gZnVuY3Rpb24gZW5kc1dpdGgodGV4dCwgc2VhcmNoLCBlbmRQb3NpdGlvbikge1xyXG4gICAgICAgIGlmIChlbmRQb3NpdGlvbiA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGVuZFBvc2l0aW9uID0gdGV4dC5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFt0ZXh0LCBzZWFyY2gsIGVuZFBvc2l0aW9uXSA9IG5vcm1hbGl6ZVN1YnN0cmluZ0FyZ3MoJ2VuZHNXaXRoJywgdGV4dCwgc2VhcmNoLCBlbmRQb3NpdGlvbiwgdHJ1ZSk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBlbmRQb3NpdGlvbiAtIHNlYXJjaC5sZW5ndGg7XHJcbiAgICAgICAgaWYgKHN0YXJ0IDwgMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKHN0YXJ0LCBlbmRQb3NpdGlvbikgPT09IHNlYXJjaDtcclxuICAgIH07XHJcbiAgICBpbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzKHRleHQsIHNlYXJjaCwgcG9zaXRpb24gPSAwKSB7XHJcbiAgICAgICAgW3RleHQsIHNlYXJjaCwgcG9zaXRpb25dID0gbm9ybWFsaXplU3Vic3RyaW5nQXJncygnaW5jbHVkZXMnLCB0ZXh0LCBzZWFyY2gsIHBvc2l0aW9uKTtcclxuICAgICAgICByZXR1cm4gdGV4dC5pbmRleE9mKHNlYXJjaCwgcG9zaXRpb24pICE9PSAtMTtcclxuICAgIH07XHJcbiAgICByZXBlYXQgPSBmdW5jdGlvbiByZXBlYXQodGV4dCwgY291bnQgPSAwKSB7XHJcbiAgICAgICAgLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUucmVwZWF0XHJcbiAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJpbmcucmVwZWF0IHJlcXVpcmVzIGEgdmFsaWQgc3RyaW5nLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY291bnQgIT09IGNvdW50KSB7XHJcbiAgICAgICAgICAgIGNvdW50ID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvdW50IDwgMCB8fCBjb3VudCA9PT0gSW5maW5pdHkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3N0cmluZy5yZXBlYXQgcmVxdWlyZXMgYSBub24tbmVnYXRpdmUgZmluaXRlIGNvdW50LicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcmVzdWx0ID0gJyc7XHJcbiAgICAgICAgd2hpbGUgKGNvdW50KSB7XHJcbiAgICAgICAgICAgIGlmIChjb3VudCAlIDIpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSB0ZXh0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjb3VudCA+IDEpIHtcclxuICAgICAgICAgICAgICAgIHRleHQgKz0gdGV4dDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb3VudCA+Pj0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcbiAgICBzdGFydHNXaXRoID0gZnVuY3Rpb24gc3RhcnRzV2l0aCh0ZXh0LCBzZWFyY2gsIHBvc2l0aW9uID0gMCkge1xyXG4gICAgICAgIHNlYXJjaCA9IFN0cmluZyhzZWFyY2gpO1xyXG4gICAgICAgIFt0ZXh0LCBzZWFyY2gsIHBvc2l0aW9uXSA9IG5vcm1hbGl6ZVN1YnN0cmluZ0FyZ3MoJ3N0YXJ0c1dpdGgnLCB0ZXh0LCBzZWFyY2gsIHBvc2l0aW9uKTtcclxuICAgICAgICBjb25zdCBlbmQgPSBwb3NpdGlvbiArIHNlYXJjaC5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGVuZCA+IHRleHQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRleHQuc2xpY2UocG9zaXRpb24sIGVuZCkgPT09IHNlYXJjaDtcclxuICAgIH07XHJcbn1cclxuaWYgKHRydWUpIHtcclxuICAgIHBhZEVuZCA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUucGFkRW5kKTtcclxuICAgIHBhZFN0YXJ0ID0gd3JhcE5hdGl2ZShnbG9iYWwuU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydCk7XHJcbn1cclxuZWxzZSB7XHJcbiAgICBwYWRFbmQgPSBmdW5jdGlvbiBwYWRFbmQodGV4dCwgbWF4TGVuZ3RoLCBmaWxsU3RyaW5nID0gJyAnKSB7XHJcbiAgICAgICAgaWYgKHRleHQgPT09IG51bGwgfHwgdGV4dCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmluZy5yZXBlYXQgcmVxdWlyZXMgYSB2YWxpZCBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtYXhMZW5ndGggPT09IEluZmluaXR5KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdzdHJpbmcucGFkRW5kIHJlcXVpcmVzIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSBjb3VudC4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1heExlbmd0aCA9PT0gbnVsbCB8fCBtYXhMZW5ndGggPT09IHVuZGVmaW5lZCB8fCBtYXhMZW5ndGggPCAwKSB7XHJcbiAgICAgICAgICAgIG1heExlbmd0aCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBzdHJUZXh0ID0gU3RyaW5nKHRleHQpO1xyXG4gICAgICAgIGNvbnN0IHBhZGRpbmcgPSBtYXhMZW5ndGggLSBzdHJUZXh0Lmxlbmd0aDtcclxuICAgICAgICBpZiAocGFkZGluZyA+IDApIHtcclxuICAgICAgICAgICAgc3RyVGV4dCArPVxyXG4gICAgICAgICAgICAgICAgcmVwZWF0KGZpbGxTdHJpbmcsIE1hdGguZmxvb3IocGFkZGluZyAvIGZpbGxTdHJpbmcubGVuZ3RoKSkgK1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbGxTdHJpbmcuc2xpY2UoMCwgcGFkZGluZyAlIGZpbGxTdHJpbmcubGVuZ3RoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0clRleHQ7XHJcbiAgICB9O1xyXG4gICAgcGFkU3RhcnQgPSBmdW5jdGlvbiBwYWRTdGFydCh0ZXh0LCBtYXhMZW5ndGgsIGZpbGxTdHJpbmcgPSAnICcpIHtcclxuICAgICAgICBpZiAodGV4dCA9PT0gbnVsbCB8fCB0ZXh0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RyaW5nLnJlcGVhdCByZXF1aXJlcyBhIHZhbGlkIHN0cmluZy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1heExlbmd0aCA9PT0gSW5maW5pdHkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3N0cmluZy5wYWRTdGFydCByZXF1aXJlcyBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgY291bnQuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtYXhMZW5ndGggPT09IG51bGwgfHwgbWF4TGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbWF4TGVuZ3RoIDwgMCkge1xyXG4gICAgICAgICAgICBtYXhMZW5ndGggPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgc3RyVGV4dCA9IFN0cmluZyh0ZXh0KTtcclxuICAgICAgICBjb25zdCBwYWRkaW5nID0gbWF4TGVuZ3RoIC0gc3RyVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgaWYgKHBhZGRpbmcgPiAwKSB7XHJcbiAgICAgICAgICAgIHN0clRleHQgPVxyXG4gICAgICAgICAgICAgICAgcmVwZWF0KGZpbGxTdHJpbmcsIE1hdGguZmxvb3IocGFkZGluZyAvIGZpbGxTdHJpbmcubGVuZ3RoKSkgK1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbGxTdHJpbmcuc2xpY2UoMCwgcGFkZGluZyAlIGZpbGxTdHJpbmcubGVuZ3RoKSArXHJcbiAgICAgICAgICAgICAgICAgICAgc3RyVGV4dDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0clRleHQ7XHJcbiAgICB9O1xyXG59XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmluZy5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdHJpbmcubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL3N0cmluZy5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgaGFzLCB7IGFkZCB9IGZyb20gJ0Bkb2pvL2hhcy9oYXMnO1xyXG5pbXBvcnQgZ2xvYmFsIGZyb20gJy4uL2dsb2JhbCc7XHJcbmV4cG9ydCBkZWZhdWx0IGhhcztcclxuZXhwb3J0ICogZnJvbSAnQGRvam8vaGFzL2hhcyc7XHJcbi8qIEVDTUFTY3JpcHQgNiBhbmQgNyBGZWF0dXJlcyAqL1xyXG4vKiBBcnJheSAqL1xyXG5hZGQoJ2VzNi1hcnJheScsICgpID0+IHtcclxuICAgIHJldHVybiAoWydmcm9tJywgJ29mJ10uZXZlcnkoKGtleSkgPT4ga2V5IGluIGdsb2JhbC5BcnJheSkgJiZcclxuICAgICAgICBbJ2ZpbmRJbmRleCcsICdmaW5kJywgJ2NvcHlXaXRoaW4nXS5ldmVyeSgoa2V5KSA9PiBrZXkgaW4gZ2xvYmFsLkFycmF5LnByb3RvdHlwZSkpO1xyXG59LCB0cnVlKTtcclxuYWRkKCdlczYtYXJyYXktZmlsbCcsICgpID0+IHtcclxuICAgIGlmICgnZmlsbCcgaW4gZ2xvYmFsLkFycmF5LnByb3RvdHlwZSkge1xyXG4gICAgICAgIC8qIFNvbWUgdmVyc2lvbnMgb2YgU2FmYXJpIGRvIG5vdCBwcm9wZXJseSBpbXBsZW1lbnQgdGhpcyAqL1xyXG4gICAgICAgIHJldHVybiBbMV0uZmlsbCg5LCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpWzBdID09PSAxO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59LCB0cnVlKTtcclxuYWRkKCdlczctYXJyYXknLCAoKSA9PiAnaW5jbHVkZXMnIGluIGdsb2JhbC5BcnJheS5wcm90b3R5cGUsIHRydWUpO1xyXG4vKiBNYXAgKi9cclxuYWRkKCdlczYtbWFwJywgKCkgPT4ge1xyXG4gICAgaWYgKHR5cGVvZiBnbG9iYWwuTWFwID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgLypcclxuICAgIElFMTEgYW5kIG9sZGVyIHZlcnNpb25zIG9mIFNhZmFyaSBhcmUgbWlzc2luZyBjcml0aWNhbCBFUzYgTWFwIGZ1bmN0aW9uYWxpdHlcclxuICAgIFdlIHdyYXAgdGhpcyBpbiBhIHRyeS9jYXRjaCBiZWNhdXNlIHNvbWV0aW1lcyB0aGUgTWFwIGNvbnN0cnVjdG9yIGV4aXN0cywgYnV0IGRvZXMgbm90XHJcbiAgICB0YWtlIGFyZ3VtZW50cyAoaU9TIDguNClcclxuICAgICAqL1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hcCA9IG5ldyBnbG9iYWwuTWFwKFtbMCwgMV1dKTtcclxuICAgICAgICAgICAgcmV0dXJuIG1hcC5oYXMoMCkgJiZcclxuICAgICAgICAgICAgICAgIHR5cGVvZiBtYXAua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJlxyXG4gICAgICAgICAgICAgICAgdHJ1ZSAmJlxyXG4gICAgICAgICAgICAgICAgdHlwZW9mIG1hcC52YWx1ZXMgPT09ICdmdW5jdGlvbicgJiZcclxuICAgICAgICAgICAgICAgIHR5cGVvZiBtYXAuZW50cmllcyA9PT0gJ2Z1bmN0aW9uJztcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IG5vdCB0ZXN0aW5nIG9uIGlPUyBhdCB0aGUgbW9tZW50ICovXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn0sIHRydWUpO1xyXG4vKiBNYXRoICovXHJcbmFkZCgnZXM2LW1hdGgnLCAoKSA9PiB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAgICdjbHozMicsXHJcbiAgICAgICAgJ3NpZ24nLFxyXG4gICAgICAgICdsb2cxMCcsXHJcbiAgICAgICAgJ2xvZzInLFxyXG4gICAgICAgICdsb2cxcCcsXHJcbiAgICAgICAgJ2V4cG0xJyxcclxuICAgICAgICAnY29zaCcsXHJcbiAgICAgICAgJ3NpbmgnLFxyXG4gICAgICAgICd0YW5oJyxcclxuICAgICAgICAnYWNvc2gnLFxyXG4gICAgICAgICdhc2luaCcsXHJcbiAgICAgICAgJ2F0YW5oJyxcclxuICAgICAgICAndHJ1bmMnLFxyXG4gICAgICAgICdmcm91bmQnLFxyXG4gICAgICAgICdjYnJ0JyxcclxuICAgICAgICAnaHlwb3QnXHJcbiAgICBdLmV2ZXJ5KChuYW1lKSA9PiB0eXBlb2YgZ2xvYmFsLk1hdGhbbmFtZV0gPT09ICdmdW5jdGlvbicpO1xyXG59LCB0cnVlKTtcclxuYWRkKCdlczYtbWF0aC1pbXVsJywgKCkgPT4ge1xyXG4gICAgaWYgKCdpbXVsJyBpbiBnbG9iYWwuTWF0aCkge1xyXG4gICAgICAgIC8qIFNvbWUgdmVyc2lvbnMgb2YgU2FmYXJpIG9uIGlvcyBkbyBub3QgcHJvcGVybHkgaW1wbGVtZW50IHRoaXMgKi9cclxuICAgICAgICByZXR1cm4gTWF0aC5pbXVsKDB4ZmZmZmZmZmYsIDUpID09PSAtNTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxufSwgdHJ1ZSk7XHJcbi8qIE9iamVjdCAqL1xyXG5hZGQoJ2VzNi1vYmplY3QnLCAoKSA9PiB7XHJcbiAgICByZXR1cm4gdHJ1ZSAmJlxyXG4gICAgICAgIFsnYXNzaWduJywgJ2lzJywgJ2dldE93blByb3BlcnR5U3ltYm9scycsICdzZXRQcm90b3R5cGVPZiddLmV2ZXJ5KChuYW1lKSA9PiB0eXBlb2YgZ2xvYmFsLk9iamVjdFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJyk7XHJcbn0sIHRydWUpO1xyXG5hZGQoJ2VzMjAxNy1vYmplY3QnLCAoKSA9PiB7XHJcbiAgICByZXR1cm4gWyd2YWx1ZXMnLCAnZW50cmllcycsICdnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzJ10uZXZlcnkoKG5hbWUpID0+IHR5cGVvZiBnbG9iYWwuT2JqZWN0W25hbWVdID09PSAnZnVuY3Rpb24nKTtcclxufSwgdHJ1ZSk7XHJcbi8qIE9ic2VydmFibGUgKi9cclxuYWRkKCdlcy1vYnNlcnZhYmxlJywgKCkgPT4gdHlwZW9mIGdsb2JhbC5PYnNlcnZhYmxlICE9PSAndW5kZWZpbmVkJywgdHJ1ZSk7XHJcbi8qIFByb21pc2UgKi9cclxuYWRkKCdlczYtcHJvbWlzZScsICgpID0+IHR5cGVvZiBnbG9iYWwuUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHJ1ZSwgdHJ1ZSk7XHJcbi8qIFNldCAqL1xyXG5hZGQoJ2VzNi1zZXQnLCAoKSA9PiB7XHJcbiAgICBpZiAodHlwZW9mIGdsb2JhbC5TZXQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAvKiBJRTExIGFuZCBvbGRlciB2ZXJzaW9ucyBvZiBTYWZhcmkgYXJlIG1pc3NpbmcgY3JpdGljYWwgRVM2IFNldCBmdW5jdGlvbmFsaXR5ICovXHJcbiAgICAgICAgY29uc3Qgc2V0ID0gbmV3IGdsb2JhbC5TZXQoWzFdKTtcclxuICAgICAgICByZXR1cm4gc2V0LmhhcygxKSAmJiAna2V5cycgaW4gc2V0ICYmIHR5cGVvZiBzZXQua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59LCB0cnVlKTtcclxuLyogU3RyaW5nICovXHJcbmFkZCgnZXM2LXN0cmluZycsICgpID0+IHtcclxuICAgIHJldHVybiAoW1xyXG4gICAgICAgIC8qIHN0YXRpYyBtZXRob2RzICovXHJcbiAgICAgICAgJ2Zyb21Db2RlUG9pbnQnXHJcbiAgICBdLmV2ZXJ5KChrZXkpID0+IHR5cGVvZiBnbG9iYWwuU3RyaW5nW2tleV0gPT09ICdmdW5jdGlvbicpICYmXHJcbiAgICAgICAgW1xyXG4gICAgICAgICAgICAvKiBpbnN0YW5jZSBtZXRob2RzICovXHJcbiAgICAgICAgICAgICdjb2RlUG9pbnRBdCcsXHJcbiAgICAgICAgICAgICdub3JtYWxpemUnLFxyXG4gICAgICAgICAgICAncmVwZWF0JyxcclxuICAgICAgICAgICAgJ3N0YXJ0c1dpdGgnLFxyXG4gICAgICAgICAgICAnZW5kc1dpdGgnLFxyXG4gICAgICAgICAgICAnaW5jbHVkZXMnXHJcbiAgICAgICAgXS5ldmVyeSgoa2V5KSA9PiB0eXBlb2YgZ2xvYmFsLlN0cmluZy5wcm90b3R5cGVba2V5XSA9PT0gJ2Z1bmN0aW9uJykpO1xyXG59LCB0cnVlKTtcclxuYWRkKCdlczYtc3RyaW5nLXJhdycsICgpID0+IHtcclxuICAgIGZ1bmN0aW9uIGdldENhbGxTaXRlKGNhbGxTaXRlLCAuLi5zdWJzdGl0dXRpb25zKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gWy4uLmNhbGxTaXRlXTtcclxuICAgICAgICByZXN1bHQucmF3ID0gY2FsbFNpdGUucmF3O1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBpZiAoJ3JhdycgaW4gZ2xvYmFsLlN0cmluZykge1xyXG4gICAgICAgIGxldCBiID0gMTtcclxuICAgICAgICBsZXQgY2FsbFNpdGUgPSBnZXRDYWxsU2l0ZSBgYVxcbiR7Yn1gO1xyXG4gICAgICAgIGNhbGxTaXRlLnJhdyA9IFsnYVxcXFxuJ107XHJcbiAgICAgICAgY29uc3Qgc3VwcG9ydHNUcnVuYyA9IGdsb2JhbC5TdHJpbmcucmF3KGNhbGxTaXRlLCA0MikgPT09ICdhOlxcXFxuJztcclxuICAgICAgICByZXR1cm4gc3VwcG9ydHNUcnVuYztcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxufSwgdHJ1ZSk7XHJcbmFkZCgnZXMyMDE3LXN0cmluZycsICgpID0+IHtcclxuICAgIHJldHVybiBbJ3BhZFN0YXJ0JywgJ3BhZEVuZCddLmV2ZXJ5KChrZXkpID0+IHR5cGVvZiBnbG9iYWwuU3RyaW5nLnByb3RvdHlwZVtrZXldID09PSAnZnVuY3Rpb24nKTtcclxufSwgdHJ1ZSk7XHJcbi8qIFN5bWJvbCAqL1xyXG5hZGQoJ2VzNi1zeW1ib2wnLCAoKSA9PiB0eXBlb2YgZ2xvYmFsLlN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIFN5bWJvbCgpID09PSAnc3ltYm9sJywgdHJ1ZSk7XHJcbi8qIFdlYWtNYXAgKi9cclxuYWRkKCdlczYtd2Vha21hcCcsICgpID0+IHtcclxuICAgIGlmICh0eXBlb2YgZ2xvYmFsLldlYWtNYXAgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgLyogSUUxMSBhbmQgb2xkZXIgdmVyc2lvbnMgb2YgU2FmYXJpIGFyZSBtaXNzaW5nIGNyaXRpY2FsIEVTNiBNYXAgZnVuY3Rpb25hbGl0eSAqL1xyXG4gICAgICAgIGNvbnN0IGtleTEgPSB7fTtcclxuICAgICAgICBjb25zdCBrZXkyID0ge307XHJcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IGdsb2JhbC5XZWFrTWFwKFtba2V5MSwgMV1dKTtcclxuICAgICAgICBPYmplY3QuZnJlZXplKGtleTEpO1xyXG4gICAgICAgIHJldHVybiBtYXAuZ2V0KGtleTEpID09PSAxICYmIG1hcC5zZXQoa2V5MiwgMikgPT09IG1hcCAmJiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59LCB0cnVlKTtcclxuLyogTWlzY2VsbGFuZW91cyBmZWF0dXJlcyAqL1xyXG5hZGQoJ21pY3JvdGFza3MnLCAoKSA9PiB0cnVlIHx8IGZhbHNlIHx8IHRydWUsIHRydWUpO1xyXG5hZGQoJ3Bvc3RtZXNzYWdlJywgKCkgPT4ge1xyXG4gICAgLy8gSWYgd2luZG93IGlzIHVuZGVmaW5lZCwgYW5kIHdlIGhhdmUgcG9zdE1lc3NhZ2UsIGl0IHByb2JhYmx5IG1lYW5zIHdlJ3JlIGluIGEgd2ViIHdvcmtlci4gV2ViIHdvcmtlcnMgaGF2ZVxyXG4gICAgLy8gcG9zdCBtZXNzYWdlIGJ1dCBpdCBkb2Vzbid0IHdvcmsgaG93IHdlIGV4cGVjdCBpdCB0bywgc28gaXQncyBiZXN0IGp1c3QgdG8gcHJldGVuZCBpdCBkb2Vzbid0IGV4aXN0LlxyXG4gICAgcmV0dXJuIHR5cGVvZiBnbG9iYWwud2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZ2xvYmFsLnBvc3RNZXNzYWdlID09PSAnZnVuY3Rpb24nO1xyXG59LCB0cnVlKTtcclxuYWRkKCdyYWYnLCAoKSA9PiB0eXBlb2YgZ2xvYmFsLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJywgdHJ1ZSk7XHJcbmFkZCgnc2V0aW1tZWRpYXRlJywgKCkgPT4gdHlwZW9mIGdsb2JhbC5zZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnLCB0cnVlKTtcclxuLyogRE9NIEZlYXR1cmVzICovXHJcbmFkZCgnZG9tLW11dGF0aW9ub2JzZXJ2ZXInLCAoKSA9PiB7XHJcbiAgICBpZiAodHJ1ZSAmJiBCb29sZWFuKGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyKSkge1xyXG4gICAgICAgIC8vIElFMTEgaGFzIGFuIHVucmVsaWFibGUgTXV0YXRpb25PYnNlcnZlciBpbXBsZW1lbnRhdGlvbiB3aGVyZSBzZXRQcm9wZXJ0eSgpIGRvZXMgbm90XHJcbiAgICAgICAgLy8gZ2VuZXJhdGUgYSBtdXRhdGlvbiBldmVudCwgb2JzZXJ2ZXJzIGNhbiBjcmFzaCwgYW5kIHRoZSBxdWV1ZSBkb2VzIG5vdCBkcmFpblxyXG4gICAgICAgIC8vIHJlbGlhYmx5LiBUaGUgZm9sbG93aW5nIGZlYXR1cmUgdGVzdCB3YXMgYWRhcHRlZCBmcm9tXHJcbiAgICAgICAgLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vdDEwa28vNGFjZWI4YzcxNjgxZmRiMjc1ZTMzZWZlNWU1NzZiMTRcclxuICAgICAgICBjb25zdCBleGFtcGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWUgKi9cclxuICAgICAgICBjb25zdCBIb3N0TXV0YXRpb25PYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xyXG4gICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEhvc3RNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uICgpIHsgfSk7XHJcbiAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShleGFtcGxlLCB7IGF0dHJpYnV0ZXM6IHRydWUgfSk7XHJcbiAgICAgICAgZXhhbXBsZS5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdibG9jaycpO1xyXG4gICAgICAgIHJldHVybiBCb29sZWFuKG9ic2VydmVyLnRha2VSZWNvcmRzKCkubGVuZ3RoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxufSwgdHJ1ZSk7XHJcbmFkZCgnZG9tLXdlYmFuaW1hdGlvbicsICgpID0+IHRydWUgJiYgZ2xvYmFsLkFuaW1hdGlvbiAhPT0gdW5kZWZpbmVkICYmIGdsb2JhbC5LZXlmcmFtZUVmZmVjdCAhPT0gdW5kZWZpbmVkLCB0cnVlKTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFzLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL3N1cHBvcnQvaGFzLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdXBwb3J0L2hhcy5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4uL2dsb2JhbCc7XHJcbmltcG9ydCBoYXMgZnJvbSAnLi9oYXMnO1xyXG5mdW5jdGlvbiBleGVjdXRlVGFzayhpdGVtKSB7XHJcbiAgICBpZiAoaXRlbSAmJiBpdGVtLmlzQWN0aXZlICYmIGl0ZW0uY2FsbGJhY2spIHtcclxuICAgICAgICBpdGVtLmNhbGxiYWNrKCk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gZ2V0UXVldWVIYW5kbGUoaXRlbSwgZGVzdHJ1Y3Rvcikge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsgfTtcclxuICAgICAgICAgICAgaXRlbS5pc0FjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpdGVtLmNhbGxiYWNrID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKGRlc3RydWN0b3IpIHtcclxuICAgICAgICAgICAgICAgIGRlc3RydWN0b3IoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxubGV0IGNoZWNrTWljcm9UYXNrUXVldWU7XHJcbmxldCBtaWNyb1Rhc2tzO1xyXG4vKipcclxuICogU2NoZWR1bGVzIGEgY2FsbGJhY2sgdG8gdGhlIG1hY3JvdGFzayBxdWV1ZS5cclxuICpcclxuICogQHBhcmFtIGNhbGxiYWNrIHRoZSBmdW5jdGlvbiB0byBiZSBxdWV1ZWQgYW5kIGxhdGVyIGV4ZWN1dGVkLlxyXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBhIGBkZXN0cm95YCBtZXRob2QgdGhhdCwgd2hlbiBjYWxsZWQsIHByZXZlbnRzIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZyb20gZXhlY3V0aW5nLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHF1ZXVlVGFzayA9IChmdW5jdGlvbiAoKSB7XHJcbiAgICBsZXQgZGVzdHJ1Y3RvcjtcclxuICAgIGxldCBlbnF1ZXVlO1xyXG4gICAgLy8gU2luY2UgdGhlIElFIGltcGxlbWVudGF0aW9uIG9mIGBzZXRJbW1lZGlhdGVgIGlzIG5vdCBmbGF3bGVzcywgd2Ugd2lsbCB0ZXN0IGZvciBgcG9zdE1lc3NhZ2VgIGZpcnN0LlxyXG4gICAgaWYgKHRydWUpIHtcclxuICAgICAgICBjb25zdCBxdWV1ZSA9IFtdO1xyXG4gICAgICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIC8vIENvbmZpcm0gdGhhdCB0aGUgZXZlbnQgd2FzIHRyaWdnZXJlZCBieSB0aGUgY3VycmVudCB3aW5kb3cgYW5kIGJ5IHRoaXMgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbi5cclxuICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZSA9PT0gZ2xvYmFsICYmIGV2ZW50LmRhdGEgPT09ICdkb2pvLXF1ZXVlLW1lc3NhZ2UnKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBleGVjdXRlVGFzayhxdWV1ZS5zaGlmdCgpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGVucXVldWUgPSBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICBxdWV1ZS5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoJ2Rvam8tcXVldWUtbWVzc2FnZScsICcqJyk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGZhbHNlKSB7XHJcbiAgICAgICAgZGVzdHJ1Y3RvciA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcclxuICAgICAgICBlbnF1ZXVlID0gZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZShleGVjdXRlVGFzay5iaW5kKG51bGwsIGl0ZW0pKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgZGVzdHJ1Y3RvciA9IGdsb2JhbC5jbGVhclRpbWVvdXQ7XHJcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGV4ZWN1dGVUYXNrLmJpbmQobnVsbCwgaXRlbSksIDApO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBxdWV1ZVRhc2soY2FsbGJhY2spIHtcclxuICAgICAgICBjb25zdCBpdGVtID0ge1xyXG4gICAgICAgICAgICBpc0FjdGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpZCA9IGVucXVldWUoaXRlbSk7XHJcbiAgICAgICAgcmV0dXJuIGdldFF1ZXVlSGFuZGxlKGl0ZW0sIGRlc3RydWN0b3IgJiZcclxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgZGVzdHJ1Y3RvcihpZCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy8gVE9ETzogVXNlIGFzcGVjdC5iZWZvcmUgd2hlbiBpdCBpcyBhdmFpbGFibGUuXHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICAgID8gcXVldWVUYXNrXHJcbiAgICAgICAgOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgY2hlY2tNaWNyb1Rhc2tRdWV1ZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gcXVldWVUYXNrKGNhbGxiYWNrKTtcclxuICAgICAgICB9O1xyXG59KSgpO1xyXG4vLyBXaGVuIG5vIG1lY2hhbmlzbSBmb3IgcmVnaXN0ZXJpbmcgbWljcm90YXNrcyBpcyBleHBvc2VkIGJ5IHRoZSBlbnZpcm9ubWVudCwgbWljcm90YXNrcyB3aWxsXHJcbi8vIGJlIHF1ZXVlZCBhbmQgdGhlbiBleGVjdXRlZCBpbiBhIHNpbmdsZSBtYWNyb3Rhc2sgYmVmb3JlIHRoZSBvdGhlciBtYWNyb3Rhc2tzIGFyZSBleGVjdXRlZC5cclxuaWYgKCF0cnVlKSB7XHJcbiAgICBsZXQgaXNNaWNyb1Rhc2tRdWV1ZWQgPSBmYWxzZTtcclxuICAgIG1pY3JvVGFza3MgPSBbXTtcclxuICAgIGNoZWNrTWljcm9UYXNrUXVldWUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKCFpc01pY3JvVGFza1F1ZXVlZCkge1xyXG4gICAgICAgICAgICBpc01pY3JvVGFza1F1ZXVlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHF1ZXVlVGFzayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpc01pY3JvVGFza1F1ZXVlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgaWYgKG1pY3JvVGFza3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChpdGVtID0gbWljcm9UYXNrcy5zaGlmdCgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlVGFzayhpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuLyoqXHJcbiAqIFNjaGVkdWxlcyBhbiBhbmltYXRpb24gdGFzayB3aXRoIGB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lYCBpZiBpdCBleGlzdHMsIG9yIHdpdGggYHF1ZXVlVGFza2Agb3RoZXJ3aXNlLlxyXG4gKlxyXG4gKiBTaW5jZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUncyBiZWhhdmlvciBkb2VzIG5vdCBtYXRjaCB0aGF0IGV4cGVjdGVkIGZyb20gYHF1ZXVlVGFza2AsIGl0IGlzIG5vdCB1c2VkIHRoZXJlLlxyXG4gKiBIb3dldmVyLCBhdCB0aW1lcyBpdCBtYWtlcyBtb3JlIHNlbnNlIHRvIGRlbGVnYXRlIHRvIHJlcXVlc3RBbmltYXRpb25GcmFtZTsgaGVuY2UgdGhlIGZvbGxvd2luZyBtZXRob2QuXHJcbiAqXHJcbiAqIEBwYXJhbSBjYWxsYmFjayB0aGUgZnVuY3Rpb24gdG8gYmUgcXVldWVkIGFuZCBsYXRlciBleGVjdXRlZC5cclxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggYSBgZGVzdHJveWAgbWV0aG9kIHRoYXQsIHdoZW4gY2FsbGVkLCBwcmV2ZW50cyB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmcm9tIGV4ZWN1dGluZy5cclxuICovXHJcbmV4cG9ydCBjb25zdCBxdWV1ZUFuaW1hdGlvblRhc2sgPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgaWYgKCF0cnVlKSB7XHJcbiAgICAgICAgcmV0dXJuIHF1ZXVlVGFzaztcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHF1ZXVlQW5pbWF0aW9uVGFzayhjYWxsYmFjaykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB7XHJcbiAgICAgICAgICAgIGlzQWN0aXZlOiB0cnVlLFxyXG4gICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2tcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGV4ZWN1dGVUYXNrLmJpbmQobnVsbCwgaXRlbSkpO1xyXG4gICAgICAgIHJldHVybiBnZXRRdWV1ZUhhbmRsZShpdGVtLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vIFRPRE86IFVzZSBhc3BlY3QuYmVmb3JlIHdoZW4gaXQgaXMgYXZhaWxhYmxlLlxyXG4gICAgcmV0dXJuIHRydWVcclxuICAgICAgICA/IHF1ZXVlQW5pbWF0aW9uVGFza1xyXG4gICAgICAgIDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIGNoZWNrTWljcm9UYXNrUXVldWUoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlQW5pbWF0aW9uVGFzayhjYWxsYmFjayk7XHJcbiAgICAgICAgfTtcclxufSkoKTtcclxuLyoqXHJcbiAqIFNjaGVkdWxlcyBhIGNhbGxiYWNrIHRvIHRoZSBtaWNyb3Rhc2sgcXVldWUuXHJcbiAqXHJcbiAqIEFueSBjYWxsYmFja3MgcmVnaXN0ZXJlZCB3aXRoIGBxdWV1ZU1pY3JvVGFza2Agd2lsbCBiZSBleGVjdXRlZCBiZWZvcmUgdGhlIG5leHQgbWFjcm90YXNrLiBJZiBubyBuYXRpdmVcclxuICogbWVjaGFuaXNtIGZvciBzY2hlZHVsaW5nIG1hY3JvdGFza3MgaXMgZXhwb3NlZCwgdGhlbiBhbnkgY2FsbGJhY2tzIHdpbGwgYmUgZmlyZWQgYmVmb3JlIGFueSBtYWNyb3Rhc2tcclxuICogcmVnaXN0ZXJlZCB3aXRoIGBxdWV1ZVRhc2tgIG9yIGBxdWV1ZUFuaW1hdGlvblRhc2tgLlxyXG4gKlxyXG4gKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGJlIHF1ZXVlZCBhbmQgbGF0ZXIgZXhlY3V0ZWQuXHJcbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIGEgYGRlc3Ryb3lgIG1ldGhvZCB0aGF0LCB3aGVuIGNhbGxlZCwgcHJldmVudHMgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnJvbSBleGVjdXRpbmcuXHJcbiAqL1xyXG5leHBvcnQgbGV0IHF1ZXVlTWljcm9UYXNrID0gKGZ1bmN0aW9uICgpIHtcclxuICAgIGxldCBlbnF1ZXVlO1xyXG4gICAgaWYgKGZhbHNlKSB7XHJcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5wcm9jZXNzLm5leHRUaWNrKGV4ZWN1dGVUYXNrLmJpbmQobnVsbCwgaXRlbSkpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0cnVlKSB7XHJcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Qcm9taXNlLnJlc29sdmUoaXRlbSkudGhlbihleGVjdXRlVGFzayk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRydWUpIHtcclxuICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZSAqL1xyXG4gICAgICAgIGNvbnN0IEhvc3RNdXRhdGlvbk9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGNvbnN0IHF1ZXVlID0gW107XHJcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSG9zdE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHF1ZXVlLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLmlzQWN0aXZlICYmIGl0ZW0uY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLmNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBvYnNlcnZlci5vYnNlcnZlKG5vZGUsIHsgYXR0cmlidXRlczogdHJ1ZSB9KTtcclxuICAgICAgICBlbnF1ZXVlID0gZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgcXVldWUucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ3F1ZXVlU3RhdHVzJywgJzEnKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgIGNoZWNrTWljcm9UYXNrUXVldWUoKTtcclxuICAgICAgICAgICAgbWljcm9UYXNrcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHtcclxuICAgICAgICAgICAgaXNBY3RpdmU6IHRydWUsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgZW5xdWV1ZShpdGVtKTtcclxuICAgICAgICByZXR1cm4gZ2V0UXVldWVIYW5kbGUoaXRlbSk7XHJcbiAgICB9O1xyXG59KSgpO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1xdWV1ZS5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdXBwb3J0L3F1ZXVlLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdXBwb3J0L3F1ZXVlLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsIi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGEgdmFsdWUgcHJvcGVydHkgZGVzY3JpcHRvclxuICpcbiAqIEBwYXJhbSB2YWx1ZSAgICAgICAgVGhlIHZhbHVlIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHNob3VsZCBiZSBzZXQgdG9cbiAqIEBwYXJhbSBlbnVtZXJhYmxlICAgSWYgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBlbnVtYmVyYWJsZSwgZGVmYXVsdHMgdG8gZmFsc2VcbiAqIEBwYXJhbSB3cml0YWJsZSAgICAgSWYgdGhlIHByb3BlcnR5IHNob3VsZCBiZSB3cml0YWJsZSwgZGVmYXVsdHMgdG8gdHJ1ZVxuICogQHBhcmFtIGNvbmZpZ3VyYWJsZSBJZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGNvbmZpZ3VyYWJsZSwgZGVmYXVsdHMgdG8gdHJ1ZVxuICogQHJldHVybiAgICAgICAgICAgICBUaGUgcHJvcGVydHkgZGVzY3JpcHRvciBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlRGVzY3JpcHRvcih2YWx1ZSwgZW51bWVyYWJsZSA9IGZhbHNlLCB3cml0YWJsZSA9IHRydWUsIGNvbmZpZ3VyYWJsZSA9IHRydWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIGVudW1lcmFibGU6IGVudW1lcmFibGUsXG4gICAgICAgIHdyaXRhYmxlOiB3cml0YWJsZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBjb25maWd1cmFibGVcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdyYXBOYXRpdmUobmF0aXZlRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmF0aXZlRnVuY3Rpb24uYXBwbHkodGFyZ2V0LCBhcmdzKTtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdXBwb3J0L3V0aWwubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL3N1cHBvcnQvdXRpbC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgeyBFdmVudGVkIH0gZnJvbSAnQGRvam8vY29yZS9FdmVudGVkJztcbmV4cG9ydCBjbGFzcyBJbmplY3RvciBleHRlbmRzIEV2ZW50ZWQge1xuICAgIGNvbnN0cnVjdG9yKHBheWxvYWQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fcGF5bG9hZCA9IHBheWxvYWQ7XG4gICAgfVxuICAgIHNldEludmFsaWRhdG9yKGludmFsaWRhdG9yKSB7XG4gICAgICAgIHRoaXMuX2ludmFsaWRhdG9yID0gaW52YWxpZGF0b3I7XG4gICAgfVxuICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BheWxvYWQ7XG4gICAgfVxuICAgIHNldChwYXlsb2FkKSB7XG4gICAgICAgIHRoaXMuX3BheWxvYWQgPSBwYXlsb2FkO1xuICAgICAgICBpZiAodGhpcy5faW52YWxpZGF0b3IpIHtcbiAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdG9yKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBJbmplY3Rvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUluamVjdG9yLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9JbmplY3Rvci5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL0luamVjdG9yLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCB7IEV2ZW50ZWQgfSBmcm9tICdAZG9qby9jb3JlL0V2ZW50ZWQnO1xyXG5pbXBvcnQgTWFwIGZyb20gJ0Bkb2pvL3NoaW0vTWFwJztcclxuLyoqXHJcbiAqIEVudW0gdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgZXZlbnQuXHJcbiAqIExpc3RlbmluZyB0byAnUHJvamVjdG9yJyB3aWxsIG5vdGlmeSB3aGVuIHByb2plY3RvciBpcyBjcmVhdGVkIG9yIHVwZGF0ZWRcclxuICogTGlzdGVuaW5nIHRvICdXaWRnZXQnIHdpbGwgbm90aWZ5IHdoZW4gd2lkZ2V0IHJvb3QgaXMgY3JlYXRlZCBvciB1cGRhdGVkXHJcbiAqL1xyXG5leHBvcnQgdmFyIE5vZGVFdmVudFR5cGU7XHJcbihmdW5jdGlvbiAoTm9kZUV2ZW50VHlwZSkge1xyXG4gICAgTm9kZUV2ZW50VHlwZVtcIlByb2plY3RvclwiXSA9IFwiUHJvamVjdG9yXCI7XHJcbiAgICBOb2RlRXZlbnRUeXBlW1wiV2lkZ2V0XCJdID0gXCJXaWRnZXRcIjtcclxufSkoTm9kZUV2ZW50VHlwZSB8fCAoTm9kZUV2ZW50VHlwZSA9IHt9KSk7XHJcbmV4cG9ydCBjbGFzcyBOb2RlSGFuZGxlciBleHRlbmRzIEV2ZW50ZWQge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLl9ub2RlTWFwID0gbmV3IE1hcCgpO1xyXG4gICAgfVxyXG4gICAgZ2V0KGtleSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ub2RlTWFwLmdldChrZXkpO1xyXG4gICAgfVxyXG4gICAgaGFzKGtleSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ub2RlTWFwLmhhcyhrZXkpO1xyXG4gICAgfVxyXG4gICAgYWRkKGVsZW1lbnQsIGtleSkge1xyXG4gICAgICAgIHRoaXMuX25vZGVNYXAuc2V0KGtleSwgZWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5lbWl0KHsgdHlwZToga2V5IH0pO1xyXG4gICAgfVxyXG4gICAgYWRkUm9vdCgpIHtcclxuICAgICAgICB0aGlzLmVtaXQoeyB0eXBlOiBOb2RlRXZlbnRUeXBlLldpZGdldCB9KTtcclxuICAgIH1cclxuICAgIGFkZFByb2plY3RvcigpIHtcclxuICAgICAgICB0aGlzLmVtaXQoeyB0eXBlOiBOb2RlRXZlbnRUeXBlLlByb2plY3RvciB9KTtcclxuICAgIH1cclxuICAgIGNsZWFyKCkge1xyXG4gICAgICAgIHRoaXMuX25vZGVNYXAuY2xlYXIoKTtcclxuICAgIH1cclxufVxyXG5leHBvcnQgZGVmYXVsdCBOb2RlSGFuZGxlcjtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9kZUhhbmRsZXIubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL05vZGVIYW5kbGVyLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvTm9kZUhhbmRsZXIubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IFByb21pc2UgZnJvbSAnQGRvam8vc2hpbS9Qcm9taXNlJztcclxuaW1wb3J0IE1hcCBmcm9tICdAZG9qby9zaGltL01hcCc7XHJcbmltcG9ydCBTeW1ib2wgZnJvbSAnQGRvam8vc2hpbS9TeW1ib2wnO1xyXG5pbXBvcnQgeyBFdmVudGVkIH0gZnJvbSAnQGRvam8vY29yZS9FdmVudGVkJztcclxuLyoqXHJcbiAqIFdpZGdldCBiYXNlIHN5bWJvbCB0eXBlXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgV0lER0VUX0JBU0VfVFlQRSA9IFN5bWJvbCgnV2lkZ2V0IEJhc2UnKTtcclxuLyoqXHJcbiAqIENoZWNrcyBpcyB0aGUgaXRlbSBpcyBhIHN1YmNsYXNzIG9mIFdpZGdldEJhc2UgKG9yIGEgV2lkZ2V0QmFzZSlcclxuICpcclxuICogQHBhcmFtIGl0ZW0gdGhlIGl0ZW0gdG8gY2hlY2tcclxuICogQHJldHVybnMgdHJ1ZS9mYWxzZSBpbmRpY2F0aW5nIGlmIHRoZSBpdGVtIGlzIGEgV2lkZ2V0QmFzZUNvbnN0cnVjdG9yXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IoaXRlbSkge1xyXG4gICAgcmV0dXJuIEJvb2xlYW4oaXRlbSAmJiBpdGVtLl90eXBlID09PSBXSURHRVRfQkFTRV9UWVBFKTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gaXNXaWRnZXRDb25zdHJ1Y3RvckRlZmF1bHRFeHBvcnQoaXRlbSkge1xyXG4gICAgcmV0dXJuIEJvb2xlYW4oaXRlbSAmJlxyXG4gICAgICAgIGl0ZW0uaGFzT3duUHJvcGVydHkoJ19fZXNNb2R1bGUnKSAmJlxyXG4gICAgICAgIGl0ZW0uaGFzT3duUHJvcGVydHkoJ2RlZmF1bHQnKSAmJlxyXG4gICAgICAgIGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yKGl0ZW0uZGVmYXVsdCkpO1xyXG59XHJcbi8qKlxyXG4gKiBUaGUgUmVnaXN0cnkgaW1wbGVtZW50YXRpb25cclxuICovXHJcbmV4cG9ydCBjbGFzcyBSZWdpc3RyeSBleHRlbmRzIEV2ZW50ZWQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0IGxvYWRlZCBldmVudCBmb3IgcmVnaXN0cnkgbGFiZWxcclxuICAgICAqL1xyXG4gICAgZW1pdExvYWRlZEV2ZW50KHdpZGdldExhYmVsLCBpdGVtKSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KHtcclxuICAgICAgICAgICAgdHlwZTogd2lkZ2V0TGFiZWwsXHJcbiAgICAgICAgICAgIGFjdGlvbjogJ2xvYWRlZCcsXHJcbiAgICAgICAgICAgIGl0ZW1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGRlZmluZShsYWJlbCwgaXRlbSkge1xyXG4gICAgICAgIGlmICh0aGlzLl93aWRnZXRSZWdpc3RyeSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dpZGdldFJlZ2lzdHJ5ID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fd2lkZ2V0UmVnaXN0cnkuaGFzKGxhYmVsKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHdpZGdldCBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgZm9yICcke2xhYmVsLnRvU3RyaW5nKCl9J2ApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl93aWRnZXRSZWdpc3RyeS5zZXQobGFiZWwsIGl0ZW0pO1xyXG4gICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgICBpdGVtLnRoZW4oKHdpZGdldEN0b3IpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3dpZGdldFJlZ2lzdHJ5LnNldChsYWJlbCwgd2lkZ2V0Q3Rvcik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRMb2FkZWRFdmVudChsYWJlbCwgd2lkZ2V0Q3Rvcik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gd2lkZ2V0Q3RvcjtcclxuICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdExvYWRlZEV2ZW50KGxhYmVsLCBpdGVtKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBkZWZpbmVJbmplY3RvcihsYWJlbCwgaW5qZWN0b3JGYWN0b3J5KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2luamVjdG9yUmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9pbmplY3RvclJlZ2lzdHJ5ID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5faW5qZWN0b3JSZWdpc3RyeS5oYXMobGFiZWwpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW5qZWN0b3IgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIGZvciAnJHtsYWJlbC50b1N0cmluZygpfSdgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaW52YWxpZGF0b3IgPSBuZXcgRXZlbnRlZCgpO1xyXG4gICAgICAgIGNvbnN0IGluamVjdG9ySXRlbSA9IHtcclxuICAgICAgICAgICAgaW5qZWN0b3I6IGluamVjdG9yRmFjdG9yeSgoKSA9PiBpbnZhbGlkYXRvci5lbWl0KHsgdHlwZTogJ2ludmFsaWRhdGUnIH0pKSxcclxuICAgICAgICAgICAgaW52YWxpZGF0b3JcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX2luamVjdG9yUmVnaXN0cnkuc2V0KGxhYmVsLCBpbmplY3Rvckl0ZW0pO1xyXG4gICAgICAgIHRoaXMuZW1pdExvYWRlZEV2ZW50KGxhYmVsLCBpbmplY3Rvckl0ZW0pO1xyXG4gICAgfVxyXG4gICAgZ2V0KGxhYmVsKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl93aWRnZXRSZWdpc3RyeSB8fCAhdGhpcy5oYXMobGFiZWwpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fd2lkZ2V0UmVnaXN0cnkuZ2V0KGxhYmVsKTtcclxuICAgICAgICBpZiAoaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IoaXRlbSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IGl0ZW0oKTtcclxuICAgICAgICB0aGlzLl93aWRnZXRSZWdpc3RyeS5zZXQobGFiZWwsIHByb21pc2UpO1xyXG4gICAgICAgIHByb21pc2UudGhlbigod2lkZ2V0Q3RvcikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaXNXaWRnZXRDb25zdHJ1Y3RvckRlZmF1bHRFeHBvcnQod2lkZ2V0Q3RvcikpIHtcclxuICAgICAgICAgICAgICAgIHdpZGdldEN0b3IgPSB3aWRnZXRDdG9yLmRlZmF1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fd2lkZ2V0UmVnaXN0cnkuc2V0KGxhYmVsLCB3aWRnZXRDdG9yKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0TG9hZGVkRXZlbnQobGFiZWwsIHdpZGdldEN0b3IpO1xyXG4gICAgICAgICAgICByZXR1cm4gd2lkZ2V0Q3RvcjtcclxuICAgICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBnZXRJbmplY3RvcihsYWJlbCkge1xyXG4gICAgICAgIGlmICghdGhpcy5faW5qZWN0b3JSZWdpc3RyeSB8fCAhdGhpcy5oYXNJbmplY3RvcihsYWJlbCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbmplY3RvclJlZ2lzdHJ5LmdldChsYWJlbCk7XHJcbiAgICB9XHJcbiAgICBoYXMobGFiZWwpIHtcclxuICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLl93aWRnZXRSZWdpc3RyeSAmJiB0aGlzLl93aWRnZXRSZWdpc3RyeS5oYXMobGFiZWwpKTtcclxuICAgIH1cclxuICAgIGhhc0luamVjdG9yKGxhYmVsKSB7XHJcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5faW5qZWN0b3JSZWdpc3RyeSAmJiB0aGlzLl9pbmplY3RvclJlZ2lzdHJ5LmhhcyhsYWJlbCkpO1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydCBkZWZhdWx0IFJlZ2lzdHJ5O1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWdpc3RyeS5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvUmVnaXN0cnkubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9SZWdpc3RyeS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgeyBNYXAgfSBmcm9tICdAZG9qby9zaGltL01hcCc7XHJcbmltcG9ydCB7IEV2ZW50ZWQgfSBmcm9tICdAZG9qby9jb3JlL0V2ZW50ZWQnO1xyXG5pbXBvcnQgeyBSZWdpc3RyeSB9IGZyb20gJy4vUmVnaXN0cnknO1xyXG5leHBvcnQgY2xhc3MgUmVnaXN0cnlIYW5kbGVyIGV4dGVuZHMgRXZlbnRlZCB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuX3JlZ2lzdHJ5ID0gbmV3IFJlZ2lzdHJ5KCk7XHJcbiAgICAgICAgdGhpcy5fcmVnaXN0cnlXaWRnZXRMYWJlbE1hcCA9IG5ldyBNYXAoKTtcclxuICAgICAgICB0aGlzLl9yZWdpc3RyeUluamVjdG9yTGFiZWxNYXAgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgdGhpcy5vd24odGhpcy5fcmVnaXN0cnkpO1xyXG4gICAgICAgIGNvbnN0IGRlc3Ryb3kgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmJhc2VSZWdpc3RyeSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnlXaWRnZXRMYWJlbE1hcC5kZWxldGUodGhpcy5iYXNlUmVnaXN0cnkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnlJbmplY3RvckxhYmVsTWFwLmRlbGV0ZSh0aGlzLmJhc2VSZWdpc3RyeSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhc2VSZWdpc3RyeSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5vd24oeyBkZXN0cm95IH0pO1xyXG4gICAgfVxyXG4gICAgc2V0IGJhc2UoYmFzZVJlZ2lzdHJ5KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYmFzZVJlZ2lzdHJ5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5V2lkZ2V0TGFiZWxNYXAuZGVsZXRlKHRoaXMuYmFzZVJlZ2lzdHJ5KTtcclxuICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnlJbmplY3RvckxhYmVsTWFwLmRlbGV0ZSh0aGlzLmJhc2VSZWdpc3RyeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYmFzZVJlZ2lzdHJ5ID0gYmFzZVJlZ2lzdHJ5O1xyXG4gICAgfVxyXG4gICAgZGVmaW5lKGxhYmVsLCB3aWRnZXQpIHtcclxuICAgICAgICB0aGlzLl9yZWdpc3RyeS5kZWZpbmUobGFiZWwsIHdpZGdldCk7XHJcbiAgICB9XHJcbiAgICBkZWZpbmVJbmplY3RvcihsYWJlbCwgaW5qZWN0b3IpIHtcclxuICAgICAgICB0aGlzLl9yZWdpc3RyeS5kZWZpbmVJbmplY3RvcihsYWJlbCwgaW5qZWN0b3IpO1xyXG4gICAgfVxyXG4gICAgaGFzKGxhYmVsKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZ2lzdHJ5LmhhcyhsYWJlbCkgfHwgQm9vbGVhbih0aGlzLmJhc2VSZWdpc3RyeSAmJiB0aGlzLmJhc2VSZWdpc3RyeS5oYXMobGFiZWwpKTtcclxuICAgIH1cclxuICAgIGhhc0luamVjdG9yKGxhYmVsKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZ2lzdHJ5Lmhhc0luamVjdG9yKGxhYmVsKSB8fCBCb29sZWFuKHRoaXMuYmFzZVJlZ2lzdHJ5ICYmIHRoaXMuYmFzZVJlZ2lzdHJ5Lmhhc0luamVjdG9yKGxhYmVsKSk7XHJcbiAgICB9XHJcbiAgICBnZXQobGFiZWwsIGdsb2JhbFByZWNlZGVuY2UgPSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXQobGFiZWwsIGdsb2JhbFByZWNlZGVuY2UsICdnZXQnLCB0aGlzLl9yZWdpc3RyeVdpZGdldExhYmVsTWFwKTtcclxuICAgIH1cclxuICAgIGdldEluamVjdG9yKGxhYmVsLCBnbG9iYWxQcmVjZWRlbmNlID0gZmFsc2UpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0KGxhYmVsLCBnbG9iYWxQcmVjZWRlbmNlLCAnZ2V0SW5qZWN0b3InLCB0aGlzLl9yZWdpc3RyeUluamVjdG9yTGFiZWxNYXApO1xyXG4gICAgfVxyXG4gICAgX2dldChsYWJlbCwgZ2xvYmFsUHJlY2VkZW5jZSwgZ2V0RnVuY3Rpb25OYW1lLCBsYWJlbE1hcCkge1xyXG4gICAgICAgIGNvbnN0IHJlZ2lzdHJpZXMgPSBnbG9iYWxQcmVjZWRlbmNlID8gW3RoaXMuYmFzZVJlZ2lzdHJ5LCB0aGlzLl9yZWdpc3RyeV0gOiBbdGhpcy5fcmVnaXN0cnksIHRoaXMuYmFzZVJlZ2lzdHJ5XTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlZ2lzdHJpZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcmVnaXN0cnkgPSByZWdpc3RyaWVzW2ldO1xyXG4gICAgICAgICAgICBpZiAoIXJlZ2lzdHJ5KSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gcmVnaXN0cnlbZ2V0RnVuY3Rpb25OYW1lXShsYWJlbCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlZ2lzdGVyZWRMYWJlbHMgPSBsYWJlbE1hcC5nZXQocmVnaXN0cnkpIHx8IFtdO1xyXG4gICAgICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAocmVnaXN0ZXJlZExhYmVscy5pbmRleE9mKGxhYmVsKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHJlZ2lzdHJ5Lm9uKGxhYmVsLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuYWN0aW9uID09PSAnbG9hZGVkJyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzW2dldEZ1bmN0aW9uTmFtZV0obGFiZWwsIGdsb2JhbFByZWNlZGVuY2UpID09PSBldmVudC5pdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCh7IHR5cGU6ICdpbnZhbGlkYXRlJyB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMub3duKGhhbmRsZSk7XHJcbiAgICAgICAgICAgICAgICBsYWJlbE1hcC5zZXQocmVnaXN0cnksIFsuLi5yZWdpc3RlcmVkTGFiZWxzLCBsYWJlbF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydCBkZWZhdWx0IFJlZ2lzdHJ5SGFuZGxlcjtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVnaXN0cnlIYW5kbGVyLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9SZWdpc3RyeUhhbmRsZXIubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9SZWdpc3RyeUhhbmRsZXIubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IE1hcCBmcm9tICdAZG9qby9zaGltL01hcCc7XG5pbXBvcnQgV2Vha01hcCBmcm9tICdAZG9qby9zaGltL1dlYWtNYXAnO1xuaW1wb3J0IFN5bWJvbCBmcm9tICdAZG9qby9zaGltL1N5bWJvbCc7XG5pbXBvcnQgeyB2IH0gZnJvbSAnLi9kJztcbmltcG9ydCB7IGF1dG8gfSBmcm9tICcuL2RpZmYnO1xuaW1wb3J0IFJlZ2lzdHJ5SGFuZGxlciBmcm9tICcuL1JlZ2lzdHJ5SGFuZGxlcic7XG5pbXBvcnQgTm9kZUhhbmRsZXIgZnJvbSAnLi9Ob2RlSGFuZGxlcic7XG5pbXBvcnQgeyB3aWRnZXRJbnN0YW5jZU1hcCB9IGZyb20gJy4vdmRvbSc7XG5pbXBvcnQgeyBpc1dpZGdldEJhc2VDb25zdHJ1Y3RvciwgV0lER0VUX0JBU0VfVFlQRSB9IGZyb20gJy4vUmVnaXN0cnknO1xuY29uc3QgZGVjb3JhdG9yTWFwID0gbmV3IE1hcCgpO1xuY29uc3QgYm91bmRBdXRvID0gYXV0by5iaW5kKG51bGwpO1xuZXhwb3J0IGNvbnN0IG5vQmluZCA9IFN5bWJvbC5mb3IoJ2Rvam9Ob0JpbmQnKTtcbi8qKlxuICogTWFpbiB3aWRnZXQgYmFzZSBmb3IgYWxsIHdpZGdldHMgdG8gZXh0ZW5kXG4gKi9cbmV4cG9ydCBjbGFzcyBXaWRnZXRCYXNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiBpdCBpcyB0aGUgaW5pdGlhbCBzZXQgcHJvcGVydGllcyBjeWNsZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5faW5pdGlhbFByb3BlcnRpZXMgPSB0cnVlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQXJyYXkgb2YgcHJvcGVydHkga2V5cyBjb25zaWRlcmVkIGNoYW5nZWQgZnJvbSB0aGUgcHJldmlvdXMgc2V0IHByb3BlcnRpZXNcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2NoYW5nZWRQcm9wZXJ0eUtleXMgPSBbXTtcbiAgICAgICAgdGhpcy5fbm9kZUhhbmRsZXIgPSBuZXcgTm9kZUhhbmRsZXIoKTtcbiAgICAgICAgdGhpcy5faGFuZGxlcyA9IFtdO1xuICAgICAgICB0aGlzLl9jaGlsZHJlbiA9IFtdO1xuICAgICAgICB0aGlzLl9kZWNvcmF0b3JDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHt9O1xuICAgICAgICB0aGlzLl9ib3VuZFJlbmRlckZ1bmMgPSB0aGlzLnJlbmRlci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLl9ib3VuZEludmFsaWRhdGUgPSB0aGlzLmludmFsaWRhdGUuYmluZCh0aGlzKTtcbiAgICAgICAgd2lkZ2V0SW5zdGFuY2VNYXAuc2V0KHRoaXMsIHtcbiAgICAgICAgICAgIGRpcnR5OiB0cnVlLFxuICAgICAgICAgICAgb25BdHRhY2g6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQXR0YWNoKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25EZXRhY2g6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRGV0YWNoKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbm9kZUhhbmRsZXI6IHRoaXMuX25vZGVIYW5kbGVyLFxuICAgICAgICAgICAgcmVnaXN0cnk6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RyeTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3JlUHJvcGVydGllczoge30sXG4gICAgICAgICAgICByZW5kZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgaW5wdXRQcm9wZXJ0aWVzOiB7fVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fcnVuQWZ0ZXJDb25zdHJ1Y3RvcnMoKTtcbiAgICB9XG4gICAgbWV0YShNZXRhVHlwZSkge1xuICAgICAgICBpZiAodGhpcy5fbWV0YU1hcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9tZXRhTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjYWNoZWQgPSB0aGlzLl9tZXRhTWFwLmdldChNZXRhVHlwZSk7XG4gICAgICAgIGlmICghY2FjaGVkKSB7XG4gICAgICAgICAgICBjYWNoZWQgPSBuZXcgTWV0YVR5cGUoe1xuICAgICAgICAgICAgICAgIGludmFsaWRhdGU6IHRoaXMuX2JvdW5kSW52YWxpZGF0ZSxcbiAgICAgICAgICAgICAgICBub2RlSGFuZGxlcjogdGhpcy5fbm9kZUhhbmRsZXIsXG4gICAgICAgICAgICAgICAgYmluZDogdGhpc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLm93bihjYWNoZWQpO1xuICAgICAgICAgICAgdGhpcy5fbWV0YU1hcC5zZXQoTWV0YVR5cGUsIGNhY2hlZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG4gICAgb25BdHRhY2goKSB7XG4gICAgICAgIC8vIERvIG5vdGhpbmcgYnkgZGVmYXVsdC5cbiAgICB9XG4gICAgb25EZXRhY2goKSB7XG4gICAgICAgIC8vIERvIG5vdGhpbmcgYnkgZGVmYXVsdC5cbiAgICB9XG4gICAgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9wZXJ0aWVzO1xuICAgIH1cbiAgICBnZXQgY2hhbmdlZFByb3BlcnR5S2V5cygpIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLl9jaGFuZ2VkUHJvcGVydHlLZXlzXTtcbiAgICB9XG4gICAgX19zZXRDb3JlUHJvcGVydGllc19fKGNvcmVQcm9wZXJ0aWVzKSB7XG4gICAgICAgIGNvbnN0IHsgYmFzZVJlZ2lzdHJ5IH0gPSBjb3JlUHJvcGVydGllcztcbiAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHRoaXMpO1xuICAgICAgICBpZiAoaW5zdGFuY2VEYXRhLmNvcmVQcm9wZXJ0aWVzLmJhc2VSZWdpc3RyeSAhPT0gYmFzZVJlZ2lzdHJ5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5ID0gbmV3IFJlZ2lzdHJ5SGFuZGxlcigpO1xuICAgICAgICAgICAgICAgIHRoaXMub3duKHRoaXMuX3JlZ2lzdHJ5KTtcbiAgICAgICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeS5vbignaW52YWxpZGF0ZScsIHRoaXMuX2JvdW5kSW52YWxpZGF0ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnkuYmFzZSA9IGJhc2VSZWdpc3RyeTtcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcyA9IGNvcmVQcm9wZXJ0aWVzO1xuICAgIH1cbiAgICBfX3NldFByb3BlcnRpZXNfXyhvcmlnaW5hbFByb3BlcnRpZXMpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHRoaXMpO1xuICAgICAgICBpbnN0YW5jZURhdGEuaW5wdXRQcm9wZXJ0aWVzID0gb3JpZ2luYWxQcm9wZXJ0aWVzO1xuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gdGhpcy5fcnVuQmVmb3JlUHJvcGVydGllcyhvcmlnaW5hbFByb3BlcnRpZXMpO1xuICAgICAgICBjb25zdCByZWdpc3RlcmVkRGlmZlByb3BlcnR5TmFtZXMgPSB0aGlzLmdldERlY29yYXRvcigncmVnaXN0ZXJlZERpZmZQcm9wZXJ0eScpO1xuICAgICAgICBjb25zdCBjaGFuZ2VkUHJvcGVydHlLZXlzID0gW107XG4gICAgICAgIGNvbnN0IHByb3BlcnR5TmFtZXMgPSBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKTtcbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxQcm9wZXJ0aWVzID09PSBmYWxzZSB8fCByZWdpc3RlcmVkRGlmZlByb3BlcnR5TmFtZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBhbGxQcm9wZXJ0aWVzID0gWy4uLnByb3BlcnR5TmFtZXMsIC4uLk9iamVjdC5rZXlzKHRoaXMuX3Byb3BlcnRpZXMpXTtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrZWRQcm9wZXJ0aWVzID0gW107XG4gICAgICAgICAgICBjb25zdCBkaWZmUHJvcGVydHlSZXN1bHRzID0ge307XG4gICAgICAgICAgICBsZXQgcnVuUmVhY3Rpb25zID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBhbGxQcm9wZXJ0aWVzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChjaGVja2VkUHJvcGVydGllcy5pbmRleE9mKHByb3BlcnR5TmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaGVja2VkUHJvcGVydGllcy5wdXNoKHByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNQcm9wZXJ0eSA9IHRoaXMuX3Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdQcm9wZXJ0eSA9IHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5KHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSwgaW5zdGFuY2VEYXRhLmNvcmVQcm9wZXJ0aWVzLmJpbmQpO1xuICAgICAgICAgICAgICAgIGlmIChyZWdpc3RlcmVkRGlmZlByb3BlcnR5TmFtZXMuaW5kZXhPZihwcm9wZXJ0eU5hbWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBydW5SZWFjdGlvbnMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmRnVuY3Rpb25zID0gdGhpcy5nZXREZWNvcmF0b3IoYGRpZmZQcm9wZXJ0eToke3Byb3BlcnR5TmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaWZmRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkaWZmRnVuY3Rpb25zW2ldKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuY2hhbmdlZCAmJiBjaGFuZ2VkUHJvcGVydHlLZXlzLmluZGV4T2YocHJvcGVydHlOYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkUHJvcGVydHlLZXlzLnB1c2gocHJvcGVydHlOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZQcm9wZXJ0eVJlc3VsdHNbcHJvcGVydHlOYW1lXSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYm91bmRBdXRvKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5jaGFuZ2VkICYmIGNoYW5nZWRQcm9wZXJ0eUtleXMuaW5kZXhPZihwcm9wZXJ0eU5hbWUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFByb3BlcnR5S2V5cy5wdXNoKHByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZSBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaWZmUHJvcGVydHlSZXN1bHRzW3Byb3BlcnR5TmFtZV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVuUmVhY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwRGlmZlByb3BlcnR5UmVhY3Rpb25zKHByb3BlcnRpZXMsIGNoYW5nZWRQcm9wZXJ0eUtleXMpLmZvckVhY2goKGFyZ3MsIHJlYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWN0aW9uLmNhbGwodGhpcywgYXJncy5wcmV2aW91c1Byb3BlcnRpZXMsIGFyZ3MubmV3UHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBkaWZmUHJvcGVydHlSZXN1bHRzO1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlZFByb3BlcnR5S2V5cyA9IGNoYW5nZWRQcm9wZXJ0eUtleXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsUHJvcGVydGllcyA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eShwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0sIGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcy5iaW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWRQcm9wZXJ0eUtleXMucHVzaChwcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZWRQcm9wZXJ0eUtleXMgPSBjaGFuZ2VkUHJvcGVydHlLZXlzO1xuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oe30sIHByb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaGFuZ2VkUHJvcGVydHlLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBjaGlsZHJlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuO1xuICAgIH1cbiAgICBfX3NldENoaWxkcmVuX18oY2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX2NoaWxkcmVuLmxlbmd0aCA+IDAgfHwgY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9fcmVuZGVyX18oKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldCh0aGlzKTtcbiAgICAgICAgaW5zdGFuY2VEYXRhLmRpcnR5ID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlbmRlciA9IHRoaXMuX3J1bkJlZm9yZVJlbmRlcnMoKTtcbiAgICAgICAgbGV0IGROb2RlID0gcmVuZGVyKCk7XG4gICAgICAgIGROb2RlID0gdGhpcy5ydW5BZnRlclJlbmRlcnMoZE5vZGUpO1xuICAgICAgICB0aGlzLl9ub2RlSGFuZGxlci5jbGVhcigpO1xuICAgICAgICByZXR1cm4gZE5vZGU7XG4gICAgfVxuICAgIGludmFsaWRhdGUoKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldCh0aGlzKTtcbiAgICAgICAgaWYgKGluc3RhbmNlRGF0YS5pbnZhbGlkYXRlKSB7XG4gICAgICAgICAgICBpbnN0YW5jZURhdGEuaW52YWxpZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIHYoJ2RpdicsIHt9LCB0aGlzLmNoaWxkcmVuKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdG8gYWRkIGRlY29yYXRvcnMgdG8gV2lkZ2V0QmFzZVxuICAgICAqXG4gICAgICogQHBhcmFtIGRlY29yYXRvcktleSBUaGUga2V5IG9mIHRoZSBkZWNvcmF0b3JcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBkZWNvcmF0b3JcbiAgICAgKi9cbiAgICBhZGREZWNvcmF0b3IoZGVjb3JhdG9yS2V5LCB2YWx1ZSkge1xuICAgICAgICB2YWx1ZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eSgnY29uc3RydWN0b3InKSkge1xuICAgICAgICAgICAgbGV0IGRlY29yYXRvckxpc3QgPSBkZWNvcmF0b3JNYXAuZ2V0KHRoaXMuY29uc3RydWN0b3IpO1xuICAgICAgICAgICAgaWYgKCFkZWNvcmF0b3JMaXN0KSB7XG4gICAgICAgICAgICAgICAgZGVjb3JhdG9yTGlzdCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgICAgICBkZWNvcmF0b3JNYXAuc2V0KHRoaXMuY29uc3RydWN0b3IsIGRlY29yYXRvckxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHNwZWNpZmljRGVjb3JhdG9yTGlzdCA9IGRlY29yYXRvckxpc3QuZ2V0KGRlY29yYXRvcktleSk7XG4gICAgICAgICAgICBpZiAoIXNwZWNpZmljRGVjb3JhdG9yTGlzdCkge1xuICAgICAgICAgICAgICAgIHNwZWNpZmljRGVjb3JhdG9yTGlzdCA9IFtdO1xuICAgICAgICAgICAgICAgIGRlY29yYXRvckxpc3Quc2V0KGRlY29yYXRvcktleSwgc3BlY2lmaWNEZWNvcmF0b3JMaXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNwZWNpZmljRGVjb3JhdG9yTGlzdC5wdXNoKC4uLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSB0aGlzLmdldERlY29yYXRvcihkZWNvcmF0b3JLZXkpO1xuICAgICAgICAgICAgdGhpcy5fZGVjb3JhdG9yQ2FjaGUuc2V0KGRlY29yYXRvcktleSwgWy4uLmRlY29yYXRvcnMsIC4uLnZhbHVlXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdG8gYnVpbGQgdGhlIGxpc3Qgb2YgZGVjb3JhdG9ycyBmcm9tIHRoZSBnbG9iYWwgZGVjb3JhdG9yIG1hcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkZWNvcmF0b3JLZXkgIFRoZSBrZXkgb2YgdGhlIGRlY29yYXRvclxuICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgZGVjb3JhdG9yIHZhbHVlc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2J1aWxkRGVjb3JhdG9yTGlzdChkZWNvcmF0b3JLZXkpIHtcbiAgICAgICAgY29uc3QgYWxsRGVjb3JhdG9ycyA9IFtdO1xuICAgICAgICBsZXQgY29uc3RydWN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yO1xuICAgICAgICB3aGlsZSAoY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlTWFwID0gZGVjb3JhdG9yTWFwLmdldChjb25zdHJ1Y3Rvcik7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VNYXApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWNvcmF0b3JzID0gaW5zdGFuY2VNYXAuZ2V0KGRlY29yYXRvcktleSk7XG4gICAgICAgICAgICAgICAgaWYgKGRlY29yYXRvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsRGVjb3JhdG9ycy51bnNoaWZ0KC4uLmRlY29yYXRvcnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0cnVjdG9yID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNvbnN0cnVjdG9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsRGVjb3JhdG9ycztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdG8gcmV0cmlldmUgZGVjb3JhdG9yIHZhbHVlc1xuICAgICAqXG4gICAgICogQHBhcmFtIGRlY29yYXRvcktleSBUaGUga2V5IG9mIHRoZSBkZWNvcmF0b3JcbiAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBkZWNvcmF0b3IgdmFsdWVzXG4gICAgICovXG4gICAgZ2V0RGVjb3JhdG9yKGRlY29yYXRvcktleSkge1xuICAgICAgICBsZXQgYWxsRGVjb3JhdG9ycyA9IHRoaXMuX2RlY29yYXRvckNhY2hlLmdldChkZWNvcmF0b3JLZXkpO1xuICAgICAgICBpZiAoYWxsRGVjb3JhdG9ycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYWxsRGVjb3JhdG9ycztcbiAgICAgICAgfVxuICAgICAgICBhbGxEZWNvcmF0b3JzID0gdGhpcy5fYnVpbGREZWNvcmF0b3JMaXN0KGRlY29yYXRvcktleSk7XG4gICAgICAgIHRoaXMuX2RlY29yYXRvckNhY2hlLnNldChkZWNvcmF0b3JLZXksIGFsbERlY29yYXRvcnMpO1xuICAgICAgICByZXR1cm4gYWxsRGVjb3JhdG9ycztcbiAgICB9XG4gICAgX21hcERpZmZQcm9wZXJ0eVJlYWN0aW9ucyhuZXdQcm9wZXJ0aWVzLCBjaGFuZ2VkUHJvcGVydHlLZXlzKSB7XG4gICAgICAgIGNvbnN0IHJlYWN0aW9uRnVuY3Rpb25zID0gdGhpcy5nZXREZWNvcmF0b3IoJ2RpZmZSZWFjdGlvbicpO1xuICAgICAgICByZXR1cm4gcmVhY3Rpb25GdW5jdGlvbnMucmVkdWNlKChyZWFjdGlvblByb3BlcnR5TWFwLCB7IHJlYWN0aW9uLCBwcm9wZXJ0eU5hbWUgfSkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlYWN0aW9uQXJndW1lbnRzID0gcmVhY3Rpb25Qcm9wZXJ0eU1hcC5nZXQocmVhY3Rpb24pO1xuICAgICAgICAgICAgaWYgKHJlYWN0aW9uQXJndW1lbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZWFjdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNQcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgbmV3UHJvcGVydGllczoge30sXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWN0aW9uQXJndW1lbnRzLnByZXZpb3VzUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgcmVhY3Rpb25Bcmd1bWVudHMubmV3UHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gbmV3UHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0eUtleXMuaW5kZXhPZihwcm9wZXJ0eU5hbWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHJlYWN0aW9uQXJndW1lbnRzLmNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhY3Rpb25Qcm9wZXJ0eU1hcC5zZXQocmVhY3Rpb24sIHJlYWN0aW9uQXJndW1lbnRzKTtcbiAgICAgICAgICAgIHJldHVybiByZWFjdGlvblByb3BlcnR5TWFwO1xuICAgICAgICB9LCBuZXcgTWFwKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCaW5kcyB1bmJvdW5kIHByb3BlcnR5IGZ1bmN0aW9ucyB0byB0aGUgc3BlY2lmaWVkIGBiaW5kYCBwcm9wZXJ0eVxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgcHJvcGVydGllcyB0byBjaGVjayBmb3IgZnVuY3Rpb25zXG4gICAgICovXG4gICAgX2JpbmRGdW5jdGlvblByb3BlcnR5KHByb3BlcnR5LCBiaW5kKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkgPT09ICdmdW5jdGlvbicgJiYgIXByb3BlcnR5W25vQmluZF0gJiYgaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IocHJvcGVydHkpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5TWFwID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eU1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBiaW5kSW5mbyA9IHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5TWFwLmdldChwcm9wZXJ0eSkgfHwge307XG4gICAgICAgICAgICBsZXQgeyBib3VuZEZ1bmMsIHNjb3BlIH0gPSBiaW5kSW5mbztcbiAgICAgICAgICAgIGlmIChib3VuZEZ1bmMgPT09IHVuZGVmaW5lZCB8fCBzY29wZSAhPT0gYmluZCkge1xuICAgICAgICAgICAgICAgIGJvdW5kRnVuYyA9IHByb3BlcnR5LmJpbmQoYmluZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fYmluZEZ1bmN0aW9uUHJvcGVydHlNYXAuc2V0KHByb3BlcnR5LCB7IGJvdW5kRnVuYywgc2NvcGU6IGJpbmQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYm91bmRGdW5jO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eTtcbiAgICB9XG4gICAgZ2V0IHJlZ2lzdHJ5KCkge1xuICAgICAgICBpZiAodGhpcy5fcmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnlIYW5kbGVyKCk7XG4gICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeSk7XG4gICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeS5vbignaW52YWxpZGF0ZScsIHRoaXMuX2JvdW5kSW52YWxpZGF0ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWdpc3RyeTtcbiAgICB9XG4gICAgX3J1bkJlZm9yZVByb3BlcnRpZXMocHJvcGVydGllcykge1xuICAgICAgICBjb25zdCBiZWZvcmVQcm9wZXJ0aWVzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2JlZm9yZVByb3BlcnRpZXMnKTtcbiAgICAgICAgaWYgKGJlZm9yZVByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJlZm9yZVByb3BlcnRpZXMucmVkdWNlKChwcm9wZXJ0aWVzLCBiZWZvcmVQcm9wZXJ0aWVzRnVuY3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcHJvcGVydGllcywgYmVmb3JlUHJvcGVydGllc0Z1bmN0aW9uLmNhbGwodGhpcywgcHJvcGVydGllcykpO1xuICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcGVydGllcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSdW4gYWxsIHJlZ2lzdGVyZWQgYmVmb3JlIHJlbmRlcnMgYW5kIHJldHVybiB0aGUgdXBkYXRlZCByZW5kZXIgbWV0aG9kXG4gICAgICovXG4gICAgX3J1bkJlZm9yZVJlbmRlcnMoKSB7XG4gICAgICAgIGNvbnN0IGJlZm9yZVJlbmRlcnMgPSB0aGlzLmdldERlY29yYXRvcignYmVmb3JlUmVuZGVyJyk7XG4gICAgICAgIGlmIChiZWZvcmVSZW5kZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBiZWZvcmVSZW5kZXJzLnJlZHVjZSgocmVuZGVyLCBiZWZvcmVSZW5kZXJGdW5jdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRSZW5kZXIgPSBiZWZvcmVSZW5kZXJGdW5jdGlvbi5jYWxsKHRoaXMsIHJlbmRlciwgdGhpcy5fcHJvcGVydGllcywgdGhpcy5fY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIGlmICghdXBkYXRlZFJlbmRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlbmRlciBmdW5jdGlvbiBub3QgcmV0dXJuZWQgZnJvbSBiZWZvcmVSZW5kZXIsIHVzaW5nIHByZXZpb3VzIHJlbmRlcicpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlZFJlbmRlcjtcbiAgICAgICAgICAgIH0sIHRoaXMuX2JvdW5kUmVuZGVyRnVuYyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2JvdW5kUmVuZGVyRnVuYztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUnVuIGFsbCByZWdpc3RlcmVkIGFmdGVyIHJlbmRlcnMgYW5kIHJldHVybiB0aGUgZGVjb3JhdGVkIEROb2Rlc1xuICAgICAqXG4gICAgICogQHBhcmFtIGROb2RlIFRoZSBETm9kZXMgdG8gcnVuIHRocm91Z2ggdGhlIGFmdGVyIHJlbmRlcnNcbiAgICAgKi9cbiAgICBydW5BZnRlclJlbmRlcnMoZE5vZGUpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJSZW5kZXJzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2FmdGVyUmVuZGVyJyk7XG4gICAgICAgIGlmIChhZnRlclJlbmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGFmdGVyUmVuZGVycy5yZWR1Y2UoKGROb2RlLCBhZnRlclJlbmRlckZ1bmN0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFmdGVyUmVuZGVyRnVuY3Rpb24uY2FsbCh0aGlzLCBkTm9kZSk7XG4gICAgICAgICAgICB9LCBkTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX21ldGFNYXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fbWV0YU1hcC5mb3JFYWNoKChtZXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgbWV0YS5hZnRlclJlbmRlcigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGROb2RlO1xuICAgIH1cbiAgICBfcnVuQWZ0ZXJDb25zdHJ1Y3RvcnMoKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyQ29uc3RydWN0b3JzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2FmdGVyQ29uc3RydWN0b3InKTtcbiAgICAgICAgaWYgKGFmdGVyQ29uc3RydWN0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFmdGVyQ29uc3RydWN0b3JzLmZvckVhY2goKGFmdGVyQ29uc3RydWN0b3IpID0+IGFmdGVyQ29uc3RydWN0b3IuY2FsbCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb3duKGhhbmRsZSkge1xuICAgICAgICB0aGlzLl9oYW5kbGVzLnB1c2goaGFuZGxlKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuX2hhbmRsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy5faGFuZGxlcy5wb3AoKTtcbiAgICAgICAgICAgIGlmIChoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGUuZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBzdGF0aWMgaWRlbnRpZmllclxuICovXG5XaWRnZXRCYXNlLl90eXBlID0gV0lER0VUX0JBU0VfVFlQRTtcbmV4cG9ydCBkZWZhdWx0IFdpZGdldEJhc2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaWRnZXRCYXNlLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9XaWRnZXRCYXNlLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvV2lkZ2V0QmFzZS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJsZXQgYnJvd3NlclNwZWNpZmljVHJhbnNpdGlvbkVuZEV2ZW50TmFtZSA9ICcnO1xubGV0IGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSA9ICcnO1xuZnVuY3Rpb24gZGV0ZXJtaW5lQnJvd3NlclN0eWxlTmFtZXMoZWxlbWVudCkge1xuICAgIGlmICgnV2Via2l0VHJhbnNpdGlvbicgaW4gZWxlbWVudC5zdHlsZSkge1xuICAgICAgICBicm93c2VyU3BlY2lmaWNUcmFuc2l0aW9uRW5kRXZlbnROYW1lID0gJ3dlYmtpdFRyYW5zaXRpb25FbmQnO1xuICAgICAgICBicm93c2VyU3BlY2lmaWNBbmltYXRpb25FbmRFdmVudE5hbWUgPSAnd2Via2l0QW5pbWF0aW9uRW5kJztcbiAgICB9XG4gICAgZWxzZSBpZiAoJ3RyYW5zaXRpb24nIGluIGVsZW1lbnQuc3R5bGUgfHwgJ01velRyYW5zaXRpb24nIGluIGVsZW1lbnQuc3R5bGUpIHtcbiAgICAgICAgYnJvd3NlclNwZWNpZmljVHJhbnNpdGlvbkVuZEV2ZW50TmFtZSA9ICd0cmFuc2l0aW9uZW5kJztcbiAgICAgICAgYnJvd3NlclNwZWNpZmljQW5pbWF0aW9uRW5kRXZlbnROYW1lID0gJ2FuaW1hdGlvbmVuZCc7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdXIgYnJvd3NlciBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxufVxuZnVuY3Rpb24gaW5pdGlhbGl6ZShlbGVtZW50KSB7XG4gICAgaWYgKGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSA9PT0gJycpIHtcbiAgICAgICAgZGV0ZXJtaW5lQnJvd3NlclN0eWxlTmFtZXMoZWxlbWVudCk7XG4gICAgfVxufVxuZnVuY3Rpb24gcnVuQW5kQ2xlYW5VcChlbGVtZW50LCBzdGFydEFuaW1hdGlvbiwgZmluaXNoQW5pbWF0aW9uKSB7XG4gICAgaW5pdGlhbGl6ZShlbGVtZW50KTtcbiAgICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcbiAgICBsZXQgdHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFmaW5pc2hlZCkge1xuICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGJyb3dzZXJTcGVjaWZpY1RyYW5zaXRpb25FbmRFdmVudE5hbWUsIHRyYW5zaXRpb25FbmQpO1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSwgdHJhbnNpdGlvbkVuZCk7XG4gICAgICAgICAgICBmaW5pc2hBbmltYXRpb24oKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgc3RhcnRBbmltYXRpb24oKTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoYnJvd3NlclNwZWNpZmljQW5pbWF0aW9uRW5kRXZlbnROYW1lLCB0cmFuc2l0aW9uRW5kKTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoYnJvd3NlclNwZWNpZmljVHJhbnNpdGlvbkVuZEV2ZW50TmFtZSwgdHJhbnNpdGlvbkVuZCk7XG59XG5mdW5jdGlvbiBleGl0KG5vZGUsIHByb3BlcnRpZXMsIGV4aXRBbmltYXRpb24sIHJlbW92ZU5vZGUpIHtcbiAgICBjb25zdCBhY3RpdmVDbGFzcyA9IHByb3BlcnRpZXMuZXhpdEFuaW1hdGlvbkFjdGl2ZSB8fCBgJHtleGl0QW5pbWF0aW9ufS1hY3RpdmVgO1xuICAgIHJ1bkFuZENsZWFuVXAobm9kZSwgKCkgPT4ge1xuICAgICAgICBub2RlLmNsYXNzTGlzdC5hZGQoZXhpdEFuaW1hdGlvbik7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBub2RlLmNsYXNzTGlzdC5hZGQoYWN0aXZlQ2xhc3MpO1xuICAgICAgICB9KTtcbiAgICB9LCAoKSA9PiB7XG4gICAgICAgIHJlbW92ZU5vZGUoKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGVudGVyKG5vZGUsIHByb3BlcnRpZXMsIGVudGVyQW5pbWF0aW9uKSB7XG4gICAgY29uc3QgYWN0aXZlQ2xhc3MgPSBwcm9wZXJ0aWVzLmVudGVyQW5pbWF0aW9uQWN0aXZlIHx8IGAke2VudGVyQW5pbWF0aW9ufS1hY3RpdmVgO1xuICAgIHJ1bkFuZENsZWFuVXAobm9kZSwgKCkgPT4ge1xuICAgICAgICBub2RlLmNsYXNzTGlzdC5hZGQoZW50ZXJBbmltYXRpb24pO1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKGFjdGl2ZUNsYXNzKTtcbiAgICAgICAgfSk7XG4gICAgfSwgKCkgPT4ge1xuICAgICAgICBub2RlLmNsYXNzTGlzdC5yZW1vdmUoZW50ZXJBbmltYXRpb24pO1xuICAgICAgICBub2RlLmNsYXNzTGlzdC5yZW1vdmUoYWN0aXZlQ2xhc3MpO1xuICAgIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQge1xuICAgIGVudGVyLFxuICAgIGV4aXRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jc3NUcmFuc2l0aW9ucy5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvYW5pbWF0aW9ucy9jc3NUcmFuc2l0aW9ucy5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2FuaW1hdGlvbnMvY3NzVHJhbnNpdGlvbnMubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IFN5bWJvbCBmcm9tICdAZG9qby9zaGltL1N5bWJvbCc7XG4vKipcbiAqIFRoZSBzeW1ib2wgaWRlbnRpZmllciBmb3IgYSBXTm9kZSB0eXBlXG4gKi9cbmV4cG9ydCBjb25zdCBXTk9ERSA9IFN5bWJvbCgnSWRlbnRpZmllciBmb3IgYSBXTm9kZS4nKTtcbi8qKlxuICogVGhlIHN5bWJvbCBpZGVudGlmaWVyIGZvciBhIFZOb2RlIHR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IFZOT0RFID0gU3ltYm9sKCdJZGVudGlmaWVyIGZvciBhIFZOb2RlLicpO1xuLyoqXG4gKiBUaGUgc3ltYm9sIGlkZW50aWZpZXIgZm9yIGEgVk5vZGUgdHlwZSBjcmVhdGVkIHVzaW5nIGRvbSgpXG4gKi9cbmV4cG9ydCBjb25zdCBET01WTk9ERSA9IFN5bWJvbCgnSWRlbnRpZmllciBmb3IgYSBWTm9kZSBjcmVhdGVkIHVzaW5nIGV4aXN0aW5nIGRvbS4nKTtcbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBgRE5vZGVgIGlzIGEgYFdOb2RlYCB1c2luZyB0aGUgYHR5cGVgIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1dOb2RlKGNoaWxkKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oY2hpbGQgJiYgdHlwZW9mIGNoaWxkICE9PSAnc3RyaW5nJyAmJiBjaGlsZC50eXBlID09PSBXTk9ERSk7XG59XG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgYEROb2RlYCBpcyBhIGBWTm9kZWAgdXNpbmcgdGhlIGB0eXBlYCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWTm9kZShjaGlsZCkge1xuICAgIHJldHVybiBCb29sZWFuKGNoaWxkICYmIHR5cGVvZiBjaGlsZCAhPT0gJ3N0cmluZycgJiYgKGNoaWxkLnR5cGUgPT09IFZOT0RFIHx8IGNoaWxkLnR5cGUgPT09IERPTVZOT0RFKSk7XG59XG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgYEROb2RlYCBpcyBhIGBWTm9kZWAgY3JlYXRlZCB3aXRoIGBkb20oKWAgdXNpbmcgdGhlIGB0eXBlYCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEb21WTm9kZShjaGlsZCkge1xuICAgIHJldHVybiBCb29sZWFuKGNoaWxkICYmIHR5cGVvZiBjaGlsZCAhPT0gJ3N0cmluZycgJiYgY2hpbGQudHlwZSA9PT0gRE9NVk5PREUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRWxlbWVudE5vZGUodmFsdWUpIHtcbiAgICByZXR1cm4gISF2YWx1ZS50YWdOYW1lO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY29yYXRlKGROb2Rlcywgb3B0aW9uc09yTW9kaWZpZXIsIHByZWRpY2F0ZSkge1xuICAgIGxldCBzaGFsbG93ID0gZmFsc2U7XG4gICAgbGV0IG1vZGlmaWVyO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uc09yTW9kaWZpZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbW9kaWZpZXIgPSBvcHRpb25zT3JNb2RpZmllcjtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG1vZGlmaWVyID0gb3B0aW9uc09yTW9kaWZpZXIubW9kaWZpZXI7XG4gICAgICAgIHByZWRpY2F0ZSA9IG9wdGlvbnNPck1vZGlmaWVyLnByZWRpY2F0ZTtcbiAgICAgICAgc2hhbGxvdyA9IG9wdGlvbnNPck1vZGlmaWVyLnNoYWxsb3cgfHwgZmFsc2U7XG4gICAgfVxuICAgIGxldCBub2RlcyA9IEFycmF5LmlzQXJyYXkoZE5vZGVzKSA/IFsuLi5kTm9kZXNdIDogW2ROb2Rlc107XG4gICAgZnVuY3Rpb24gYnJlYWtlcigpIHtcbiAgICAgICAgbm9kZXMgPSBbXTtcbiAgICB9XG4gICAgd2hpbGUgKG5vZGVzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBub2RlID0gbm9kZXMuc2hpZnQoKTtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIGlmICghc2hhbGxvdyAmJiAoaXNXTm9kZShub2RlKSB8fCBpc1ZOb2RlKG5vZGUpKSAmJiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgbm9kZXMgPSBbLi4ubm9kZXMsIC4uLm5vZGUuY2hpbGRyZW5dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwcmVkaWNhdGUgfHwgcHJlZGljYXRlKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgbW9kaWZpZXIobm9kZSwgYnJlYWtlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGROb2Rlcztcbn1cbi8qKlxuICogV3JhcHBlciBmdW5jdGlvbiBmb3IgY2FsbHMgdG8gY3JlYXRlIGEgd2lkZ2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdyh3aWRnZXRDb25zdHJ1Y3RvciwgcHJvcGVydGllcywgY2hpbGRyZW4gPSBbXSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICB3aWRnZXRDb25zdHJ1Y3RvcixcbiAgICAgICAgcHJvcGVydGllcyxcbiAgICAgICAgdHlwZTogV05PREVcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHYodGFnLCBwcm9wZXJ0aWVzT3JDaGlsZHJlbiA9IHt9LCBjaGlsZHJlbiA9IHVuZGVmaW5lZCkge1xuICAgIGxldCBwcm9wZXJ0aWVzID0gcHJvcGVydGllc09yQ2hpbGRyZW47XG4gICAgbGV0IGRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BlcnRpZXNPckNoaWxkcmVuKSkge1xuICAgICAgICBjaGlsZHJlbiA9IHByb3BlcnRpZXNPckNoaWxkcmVuO1xuICAgICAgICBwcm9wZXJ0aWVzID0ge307XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcHJvcGVydGllcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBkZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayA9IHByb3BlcnRpZXM7XG4gICAgICAgIHByb3BlcnRpZXMgPSB7fTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGFnLFxuICAgICAgICBkZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayxcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgIHR5cGU6IFZOT0RFXG4gICAgfTtcbn1cbi8qKlxuICogQ3JlYXRlIGEgVk5vZGUgZm9yIGFuIGV4aXN0aW5nIERPTSBOb2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZG9tKHsgbm9kZSwgYXR0cnMgPSB7fSwgcHJvcHMgPSB7fSwgb24gPSB7fSwgZGlmZlR5cGUgPSAnbm9uZScgfSwgY2hpbGRyZW4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0YWc6IGlzRWxlbWVudE5vZGUobm9kZSkgPyBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA6ICcnLFxuICAgICAgICBwcm9wZXJ0aWVzOiBwcm9wcyxcbiAgICAgICAgYXR0cmlidXRlczogYXR0cnMsXG4gICAgICAgIGV2ZW50czogb24sXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICB0eXBlOiBET01WTk9ERSxcbiAgICAgICAgZG9tTm9kZTogbm9kZSxcbiAgICAgICAgdGV4dDogaXNFbGVtZW50Tm9kZShub2RlKSA/IHVuZGVmaW5lZCA6IG5vZGUuZGF0YSxcbiAgICAgICAgZGlmZlR5cGVcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2QubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi9oYW5kbGVEZWNvcmF0b3InO1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyUmVuZGVyKG1ldGhvZCkge1xuICAgIHJldHVybiBoYW5kbGVEZWNvcmF0b3IoKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcignYWZ0ZXJSZW5kZXInLCBwcm9wZXJ0eUtleSA/IHRhcmdldFtwcm9wZXJ0eUtleV0gOiBtZXRob2QpO1xuICAgIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQgYWZ0ZXJSZW5kZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hZnRlclJlbmRlci5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9hZnRlclJlbmRlci5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYWZ0ZXJSZW5kZXIubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi9oYW5kbGVEZWNvcmF0b3InO1xuaW1wb3J0IHsgYmVmb3JlUHJvcGVydGllcyB9IGZyb20gJy4vYmVmb3JlUHJvcGVydGllcyc7XG5leHBvcnQgZnVuY3Rpb24gYWx3YXlzUmVuZGVyKCkge1xuICAgIHJldHVybiBoYW5kbGVEZWNvcmF0b3IoKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICAgICAgYmVmb3JlUHJvcGVydGllcyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmludmFsaWRhdGUoKTtcbiAgICAgICAgfSkodGFyZ2V0KTtcbiAgICB9KTtcbn1cbmV4cG9ydCBkZWZhdWx0IGFsd2F5c1JlbmRlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFsd2F5c1JlbmRlci5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9hbHdheXNSZW5kZXIubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2Fsd2F5c1JlbmRlci5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgeyBoYW5kbGVEZWNvcmF0b3IgfSBmcm9tICcuL2hhbmRsZURlY29yYXRvcic7XG5leHBvcnQgZnVuY3Rpb24gYmVmb3JlUHJvcGVydGllcyhtZXRob2QpIHtcbiAgICByZXR1cm4gaGFuZGxlRGVjb3JhdG9yKCh0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICAgIHRhcmdldC5hZGREZWNvcmF0b3IoJ2JlZm9yZVByb3BlcnRpZXMnLCBwcm9wZXJ0eUtleSA/IHRhcmdldFtwcm9wZXJ0eUtleV0gOiBtZXRob2QpO1xuICAgIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQgYmVmb3JlUHJvcGVydGllcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJlZm9yZVByb3BlcnRpZXMubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYmVmb3JlUHJvcGVydGllcy5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYmVmb3JlUHJvcGVydGllcy5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgeyBDdXN0b21FbGVtZW50Q2hpbGRUeXBlIH0gZnJvbSAnLi4vcmVnaXN0ZXJDdXN0b21FbGVtZW50JztcbmltcG9ydCBSZWdpc3RyeSBmcm9tICcuLi9SZWdpc3RyeSc7XG4vKipcbiAqIFRoaXMgRGVjb3JhdG9yIGlzIHByb3ZpZGVkIHByb3BlcnRpZXMgdGhhdCBkZWZpbmUgdGhlIGJlaGF2aW9yIG9mIGEgY3VzdG9tIGVsZW1lbnQsIGFuZFxuICogcmVnaXN0ZXJzIHRoYXQgY3VzdG9tIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjdXN0b21FbGVtZW50KHsgdGFnLCBwcm9wZXJ0aWVzID0gW10sIGF0dHJpYnV0ZXMgPSBbXSwgZXZlbnRzID0gW10sIGNoaWxkVHlwZSA9IEN1c3RvbUVsZW1lbnRDaGlsZFR5cGUuRE9KTywgcmVnaXN0cnlGYWN0b3J5ID0gKCkgPT4gbmV3IFJlZ2lzdHJ5KCkgfSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5wcm90b3R5cGUuX19jdXN0b21FbGVtZW50RGVzY3JpcHRvciA9IHtcbiAgICAgICAgICAgIHRhZ05hbWU6IHRhZyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICAgICAgZXZlbnRzLFxuICAgICAgICAgICAgY2hpbGRUeXBlLFxuICAgICAgICAgICAgcmVnaXN0cnlGYWN0b3J5XG4gICAgICAgIH07XG4gICAgfTtcbn1cbmV4cG9ydCBkZWZhdWx0IGN1c3RvbUVsZW1lbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jdXN0b21FbGVtZW50Lm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2N1c3RvbUVsZW1lbnQubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2N1c3RvbUVsZW1lbnQubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi9oYW5kbGVEZWNvcmF0b3InO1xuLyoqXG4gKiBEZWNvcmF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byByZWdpc3RlciBhIGZ1bmN0aW9uIGFzIGEgc3BlY2lmaWMgcHJvcGVydHkgZGlmZlxuICpcbiAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvZiB3aGljaCB0aGUgZGlmZiBmdW5jdGlvbiBpcyBhcHBsaWVkXG4gKiBAcGFyYW0gZGlmZlR5cGUgICAgICBUaGUgZGlmZiB0eXBlLCBkZWZhdWx0IGlzIERpZmZUeXBlLkFVVE8uXG4gKiBAcGFyYW0gZGlmZkZ1bmN0aW9uICBBIGRpZmYgZnVuY3Rpb24gdG8gcnVuIGlmIGRpZmZUeXBlIGlmIERpZmZUeXBlLkNVU1RPTVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZlByb3BlcnR5KHByb3BlcnR5TmFtZSwgZGlmZkZ1bmN0aW9uLCByZWFjdGlvbkZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIGhhbmRsZURlY29yYXRvcigodGFyZ2V0LCBwcm9wZXJ0eUtleSkgPT4ge1xuICAgICAgICB0YXJnZXQuYWRkRGVjb3JhdG9yKGBkaWZmUHJvcGVydHk6JHtwcm9wZXJ0eU5hbWV9YCwgZGlmZkZ1bmN0aW9uLmJpbmQobnVsbCkpO1xuICAgICAgICB0YXJnZXQuYWRkRGVjb3JhdG9yKCdyZWdpc3RlcmVkRGlmZlByb3BlcnR5JywgcHJvcGVydHlOYW1lKTtcbiAgICAgICAgaWYgKHJlYWN0aW9uRnVuY3Rpb24gfHwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIHRhcmdldC5hZGREZWNvcmF0b3IoJ2RpZmZSZWFjdGlvbicsIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICAgICAgcmVhY3Rpb246IHByb3BlcnR5S2V5ID8gdGFyZ2V0W3Byb3BlcnR5S2V5XSA6IHJlYWN0aW9uRnVuY3Rpb25cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnQgZGVmYXVsdCBkaWZmUHJvcGVydHk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWZmUHJvcGVydHkubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvZGlmZlByb3BlcnR5Lm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9kaWZmUHJvcGVydHkubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiLyoqXG4gKiBHZW5lcmljIGRlY29yYXRvciBoYW5kbGVyIHRvIHRha2UgY2FyZSBvZiB3aGV0aGVyIG9yIG5vdCB0aGUgZGVjb3JhdG9yIHdhcyBjYWxsZWQgYXQgdGhlIGNsYXNzIGxldmVsXG4gKiBvciB0aGUgbWV0aG9kIGxldmVsLlxuICpcbiAqIEBwYXJhbSBoYW5kbGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVEZWNvcmF0b3IoaGFuZGxlcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikge1xuICAgICAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaGFuZGxlcih0YXJnZXQucHJvdG90eXBlLCB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaGFuZGxlcih0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgIH07XG59XG5leHBvcnQgZGVmYXVsdCBoYW5kbGVEZWNvcmF0b3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYW5kbGVEZWNvcmF0b3IubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaGFuZGxlRGVjb3JhdG9yLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9oYW5kbGVEZWNvcmF0b3IubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IFdlYWtNYXAgZnJvbSAnQGRvam8vc2hpbS9XZWFrTWFwJztcbmltcG9ydCB7IGhhbmRsZURlY29yYXRvciB9IGZyb20gJy4vaGFuZGxlRGVjb3JhdG9yJztcbmltcG9ydCB7IGJlZm9yZVByb3BlcnRpZXMgfSBmcm9tICcuL2JlZm9yZVByb3BlcnRpZXMnO1xuLyoqXG4gKiBNYXAgb2YgaW5zdGFuY2VzIGFnYWluc3QgcmVnaXN0ZXJlZCBpbmplY3RvcnMuXG4gKi9cbmNvbnN0IHJlZ2lzdGVyZWRJbmplY3RvcnNNYXAgPSBuZXcgV2Vha01hcCgpO1xuLyoqXG4gKiBEZWNvcmF0b3IgcmV0cmlldmVzIGFuIGluamVjdG9yIGZyb20gYW4gYXZhaWxhYmxlIHJlZ2lzdHJ5IHVzaW5nIHRoZSBuYW1lIGFuZFxuICogY2FsbHMgdGhlIGBnZXRQcm9wZXJ0aWVzYCBmdW5jdGlvbiB3aXRoIHRoZSBwYXlsb2FkIGZyb20gdGhlIGluamVjdG9yXG4gKiBhbmQgY3VycmVudCBwcm9wZXJ0aWVzIHdpdGggdGhlIHRoZSBpbmplY3RlZCBwcm9wZXJ0aWVzIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSBJbmplY3RDb25maWcgdGhlIGluamVjdCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3QoeyBuYW1lLCBnZXRQcm9wZXJ0aWVzIH0pIHtcbiAgICByZXR1cm4gaGFuZGxlRGVjb3JhdG9yKCh0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICAgIGJlZm9yZVByb3BlcnRpZXMoZnVuY3Rpb24gKHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGluamVjdG9ySXRlbSA9IHRoaXMucmVnaXN0cnkuZ2V0SW5qZWN0b3IobmFtZSk7XG4gICAgICAgICAgICBpZiAoaW5qZWN0b3JJdGVtKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBpbmplY3RvciwgaW52YWxpZGF0b3IgfSA9IGluamVjdG9ySXRlbTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWdpc3RlcmVkSW5qZWN0b3JzID0gcmVnaXN0ZXJlZEluamVjdG9yc01hcC5nZXQodGhpcykgfHwgW107XG4gICAgICAgICAgICAgICAgaWYgKHJlZ2lzdGVyZWRJbmplY3RvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWRJbmplY3RvcnNNYXAuc2V0KHRoaXMsIHJlZ2lzdGVyZWRJbmplY3RvcnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVnaXN0ZXJlZEluamVjdG9ycy5pbmRleE9mKGluamVjdG9ySXRlbSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3duKGludmFsaWRhdG9yLm9uKCdpbnZhbGlkYXRlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJlZEluamVjdG9ycy5wdXNoKGluamVjdG9ySXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0aWVzKGluamVjdG9yKCksIHByb3BlcnRpZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSh0YXJnZXQpO1xuICAgIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQgaW5qZWN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5qZWN0Lm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2luamVjdC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaW5qZWN0Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCB7IFdJREdFVF9CQVNFX1RZUEUgfSBmcm9tICcuL1JlZ2lzdHJ5JztcbmZ1bmN0aW9uIGlzT2JqZWN0T3JBcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhbHdheXMocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjaGFuZ2VkOiB0cnVlLFxuICAgICAgICB2YWx1ZTogbmV3UHJvcGVydHlcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZShwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5nZWQ6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogbmV3UHJvcGVydHlcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlZmVyZW5jZShwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5nZWQ6IHByZXZpb3VzUHJvcGVydHkgIT09IG5ld1Byb3BlcnR5LFxuICAgICAgICB2YWx1ZTogbmV3UHJvcGVydHlcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNoYWxsb3cocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpIHtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHZhbGlkT2xkUHJvcGVydHkgPSBwcmV2aW91c1Byb3BlcnR5ICYmIGlzT2JqZWN0T3JBcnJheShwcmV2aW91c1Byb3BlcnR5KTtcbiAgICBjb25zdCB2YWxpZE5ld1Byb3BlcnR5ID0gbmV3UHJvcGVydHkgJiYgaXNPYmplY3RPckFycmF5KG5ld1Byb3BlcnR5KTtcbiAgICBpZiAoIXZhbGlkT2xkUHJvcGVydHkgfHwgIXZhbGlkTmV3UHJvcGVydHkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNoYW5nZWQ6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbmV3UHJvcGVydHlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcHJldmlvdXNLZXlzID0gT2JqZWN0LmtleXMocHJldmlvdXNQcm9wZXJ0eSk7XG4gICAgY29uc3QgbmV3S2V5cyA9IE9iamVjdC5rZXlzKG5ld1Byb3BlcnR5KTtcbiAgICBpZiAocHJldmlvdXNLZXlzLmxlbmd0aCAhPT0gbmV3S2V5cy5sZW5ndGgpIHtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjaGFuZ2VkID0gbmV3S2V5cy5zb21lKChrZXkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXdQcm9wZXJ0eVtrZXldICE9PSBwcmV2aW91c1Byb3BlcnR5W2tleV07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBjaGFuZ2VkLFxuICAgICAgICB2YWx1ZTogbmV3UHJvcGVydHlcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGF1dG8ocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmICh0eXBlb2YgbmV3UHJvcGVydHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKG5ld1Byb3BlcnR5Ll90eXBlID09PSBXSURHRVRfQkFTRV9UWVBFKSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZWZlcmVuY2UocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gaWdub3JlKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChpc09iamVjdE9yQXJyYXkobmV3UHJvcGVydHkpKSB7XG4gICAgICAgIHJlc3VsdCA9IHNoYWxsb3cocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gcmVmZXJlbmNlKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRpZmYubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RpZmYubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kaWZmLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBhc3NpZ24gfSBmcm9tICdAZG9qby9jb3JlL2xhbmcnO1xuaW1wb3J0IGNzc1RyYW5zaXRpb25zIGZyb20gJy4uL2FuaW1hdGlvbnMvY3NzVHJhbnNpdGlvbnMnO1xuaW1wb3J0IHsgYWZ0ZXJSZW5kZXIgfSBmcm9tICcuLy4uL2RlY29yYXRvcnMvYWZ0ZXJSZW5kZXInO1xuaW1wb3J0IHsgdiB9IGZyb20gJy4vLi4vZCc7XG5pbXBvcnQgeyBkb20gfSBmcm9tICcuLy4uL3Zkb20nO1xuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBhdHRhY2ggc3RhdGUgb2YgdGhlIHByb2plY3RvclxuICovXG5leHBvcnQgdmFyIFByb2plY3RvckF0dGFjaFN0YXRlO1xuKGZ1bmN0aW9uIChQcm9qZWN0b3JBdHRhY2hTdGF0ZSkge1xuICAgIFByb2plY3RvckF0dGFjaFN0YXRlW1Byb2plY3RvckF0dGFjaFN0YXRlW1wiQXR0YWNoZWRcIl0gPSAxXSA9IFwiQXR0YWNoZWRcIjtcbiAgICBQcm9qZWN0b3JBdHRhY2hTdGF0ZVtQcm9qZWN0b3JBdHRhY2hTdGF0ZVtcIkRldGFjaGVkXCJdID0gMl0gPSBcIkRldGFjaGVkXCI7XG59KShQcm9qZWN0b3JBdHRhY2hTdGF0ZSB8fCAoUHJvamVjdG9yQXR0YWNoU3RhdGUgPSB7fSkpO1xuLyoqXG4gKiBBdHRhY2ggdHlwZSBmb3IgdGhlIHByb2plY3RvclxuICovXG5leHBvcnQgdmFyIEF0dGFjaFR5cGU7XG4oZnVuY3Rpb24gKEF0dGFjaFR5cGUpIHtcbiAgICBBdHRhY2hUeXBlW0F0dGFjaFR5cGVbXCJBcHBlbmRcIl0gPSAxXSA9IFwiQXBwZW5kXCI7XG4gICAgQXR0YWNoVHlwZVtBdHRhY2hUeXBlW1wiTWVyZ2VcIl0gPSAyXSA9IFwiTWVyZ2VcIjtcbn0pKEF0dGFjaFR5cGUgfHwgKEF0dGFjaFR5cGUgPSB7fSkpO1xuZXhwb3J0IGZ1bmN0aW9uIFByb2plY3Rvck1peGluKEJhc2UpIHtcbiAgICBjbGFzcyBQcm9qZWN0b3IgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykge1xuICAgICAgICAgICAgc3VwZXIoLi4uYXJncyk7XG4gICAgICAgICAgICB0aGlzLl9yb290ID0gZG9jdW1lbnQuYm9keTtcbiAgICAgICAgICAgIHRoaXMuX2FzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX3Byb2plY3RvclByb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rpb25PcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25zOiBjc3NUcmFuc2l0aW9uc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IGRvY3VtZW50LmJvZHk7XG4gICAgICAgICAgICB0aGlzLnByb2plY3RvclN0YXRlID0gUHJvamVjdG9yQXR0YWNoU3RhdGUuRGV0YWNoZWQ7XG4gICAgICAgIH1cbiAgICAgICAgYXBwZW5kKHJvb3QpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogQXR0YWNoVHlwZS5BcHBlbmQsXG4gICAgICAgICAgICAgICAgcm9vdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdHRhY2gob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgbWVyZ2Uocm9vdCkge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBBdHRhY2hUeXBlLk1lcmdlLFxuICAgICAgICAgICAgICAgIHJvb3RcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXR0YWNoKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHNldCByb290KHJvb3QpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb2plY3RvclN0YXRlID09PSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5BdHRhY2hlZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJvamVjdG9yIGFscmVhZHkgYXR0YWNoZWQsIGNhbm5vdCBjaGFuZ2Ugcm9vdCBlbGVtZW50Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9yb290ID0gcm9vdDtcbiAgICAgICAgfVxuICAgICAgICBnZXQgcm9vdCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yb290O1xuICAgICAgICB9XG4gICAgICAgIGdldCBhc3luYygpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hc3luYztcbiAgICAgICAgfVxuICAgICAgICBzZXQgYXN5bmMoYXN5bmMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb2plY3RvclN0YXRlID09PSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5BdHRhY2hlZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJvamVjdG9yIGFscmVhZHkgYXR0YWNoZWQsIGNhbm5vdCBjaGFuZ2UgYXN5bmMgbW9kZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fYXN5bmMgPSBhc3luYztcbiAgICAgICAgfVxuICAgICAgICBzYW5kYm94KGRvYyA9IGRvY3VtZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9qZWN0b3JTdGF0ZSA9PT0gUHJvamVjdG9yQXR0YWNoU3RhdGUuQXR0YWNoZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2plY3RvciBhbHJlYWR5IGF0dGFjaGVkLCBjYW5ub3QgY3JlYXRlIHNhbmRib3gnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2FzeW5jID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c1Jvb3QgPSB0aGlzLnJvb3Q7XG4gICAgICAgICAgICAvKiBmcmVlIHVwIHRoZSBkb2N1bWVudCBmcmFnbWVudCBmb3IgR0MgKi9cbiAgICAgICAgICAgIHRoaXMub3duKHtcbiAgICAgICAgICAgICAgICBkZXN0cm95OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Jvb3QgPSBwcmV2aW91c1Jvb3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl9hdHRhY2goe1xuICAgICAgICAgICAgICAgIC8qIERvY3VtZW50RnJhZ21lbnQgaXMgbm90IGFzc2lnbmFibGUgdG8gRWxlbWVudCwgYnV0IHByb3ZpZGVzIGV2ZXJ5dGhpbmcgbmVlZGVkIHRvIHdvcmsgKi9cbiAgICAgICAgICAgICAgICByb290OiBkb2MuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuICAgICAgICAgICAgICAgIHR5cGU6IEF0dGFjaFR5cGUuQXBwZW5kXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBzZXRDaGlsZHJlbihjaGlsZHJlbikge1xuICAgICAgICAgICAgdGhpcy5fX3NldENoaWxkcmVuX18oY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIHNldFByb3BlcnRpZXMocHJvcGVydGllcykge1xuICAgICAgICAgICAgdGhpcy5fX3NldFByb3BlcnRpZXNfXyhwcm9wZXJ0aWVzKTtcbiAgICAgICAgfVxuICAgICAgICBfX3NldFByb3BlcnRpZXNfXyhwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcHJvamVjdG9yUHJvcGVydGllcyAmJiB0aGlzLl9wcm9qZWN0b3JQcm9wZXJ0aWVzLnJlZ2lzdHJ5ICE9PSBwcm9wZXJ0aWVzLnJlZ2lzdHJ5KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Byb2plY3RvclByb3BlcnRpZXMucmVnaXN0cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvamVjdG9yUHJvcGVydGllcy5yZWdpc3RyeS5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcHJvamVjdG9yUHJvcGVydGllcyA9IGFzc2lnbih7fSwgcHJvcGVydGllcyk7XG4gICAgICAgICAgICBzdXBlci5fX3NldENvcmVQcm9wZXJ0aWVzX18oeyBiaW5kOiB0aGlzLCBiYXNlUmVnaXN0cnk6IHByb3BlcnRpZXMucmVnaXN0cnkgfSk7XG4gICAgICAgICAgICBzdXBlci5fX3NldFByb3BlcnRpZXNfXyhwcm9wZXJ0aWVzKTtcbiAgICAgICAgfVxuICAgICAgICB0b0h0bWwoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9qZWN0b3JTdGF0ZSAhPT0gUHJvamVjdG9yQXR0YWNoU3RhdGUuQXR0YWNoZWQgfHwgIXRoaXMuX3Byb2plY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2plY3RvciBpcyBub3QgYXR0YWNoZWQsIGNhbm5vdCByZXR1cm4gYW4gSFRNTCBzdHJpbmcgb2YgcHJvamVjdGlvbi4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9qZWN0aW9uLmRvbU5vZGUuY2hpbGROb2Rlc1swXS5vdXRlckhUTUw7XG4gICAgICAgIH1cbiAgICAgICAgYWZ0ZXJSZW5kZXIocmVzdWx0KSB7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IHJlc3VsdDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyB8fCByZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBub2RlID0gdignc3BhbicsIHt9LCBbcmVzdWx0XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBkZXN0cm95KCkge1xuICAgICAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIF9hdHRhY2goeyB0eXBlLCByb290IH0pIHtcbiAgICAgICAgICAgIGlmIChyb290KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb290ID0gcm9vdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9hdHRhY2hIYW5kbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYXR0YWNoSGFuZGxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcm9qZWN0b3JTdGF0ZSA9IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkO1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0ge1xuICAgICAgICAgICAgICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvamVjdG9yU3RhdGUgPT09IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm9qZWN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0b3JTdGF0ZSA9IFByb2plY3RvckF0dGFjaFN0YXRlLkRldGFjaGVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMub3duKGhhbmRsZSk7XG4gICAgICAgICAgICB0aGlzLl9hdHRhY2hIYW5kbGUgPSBoYW5kbGU7XG4gICAgICAgICAgICB0aGlzLl9wcm9qZWN0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3Byb2plY3Rpb25PcHRpb25zLCB7IHN5bmM6ICF0aGlzLl9hc3luYyB9KTtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgQXR0YWNoVHlwZS5BcHBlbmQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rpb24gPSBkb20uYXBwZW5kKHRoaXMucm9vdCwgdGhpcywgdGhpcy5fcHJvamVjdGlvbk9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEF0dGFjaFR5cGUuTWVyZ2U6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rpb24gPSBkb20ubWVyZ2UodGhpcy5yb290LCB0aGlzLCB0aGlzLl9wcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2F0dGFjaEhhbmRsZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0c2xpYl8xLl9fZGVjb3JhdGUoW1xuICAgICAgICBhZnRlclJlbmRlcigpLFxuICAgICAgICB0c2xpYl8xLl9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBGdW5jdGlvbiksXG4gICAgICAgIHRzbGliXzEuX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtPYmplY3RdKSxcbiAgICAgICAgdHNsaWJfMS5fX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuICAgIF0sIFByb2plY3Rvci5wcm90b3R5cGUsIFwiYWZ0ZXJSZW5kZXJcIiwgbnVsbCk7XG4gICAgcmV0dXJuIFByb2plY3Rvcjtcbn1cbmV4cG9ydCBkZWZhdWx0IFByb2plY3Rvck1peGluO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJvamVjdG9yLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9taXhpbnMvUHJvamVjdG9yLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvbWl4aW5zL1Byb2plY3Rvci5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgSW5qZWN0b3IgfSBmcm9tICcuLy4uL0luamVjdG9yJztcbmltcG9ydCB7IGluamVjdCB9IGZyb20gJy4vLi4vZGVjb3JhdG9ycy9pbmplY3QnO1xuaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi8uLi9kZWNvcmF0b3JzL2hhbmRsZURlY29yYXRvcic7XG5pbXBvcnQgeyBkaWZmUHJvcGVydHkgfSBmcm9tICcuLy4uL2RlY29yYXRvcnMvZGlmZlByb3BlcnR5JztcbmltcG9ydCB7IHNoYWxsb3cgfSBmcm9tICcuLy4uL2RpZmYnO1xuY29uc3QgVEhFTUVfS0VZID0gJyBfa2V5JztcbmV4cG9ydCBjb25zdCBJTkpFQ1RFRF9USEVNRV9LRVkgPSBTeW1ib2woJ3RoZW1lJyk7XG4vKipcbiAqIERlY29yYXRvciBmb3IgYmFzZSBjc3MgY2xhc3Nlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGhlbWUodGhlbWUpIHtcbiAgICByZXR1cm4gaGFuZGxlRGVjb3JhdG9yKCh0YXJnZXQpID0+IHtcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcignYmFzZVRoZW1lQ2xhc3NlcycsIHRoZW1lKTtcbiAgICB9KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIHJldmVyc2UgbG9va3VwIGZvciB0aGUgY2xhc3NlcyBwYXNzZWQgaW4gdmlhIHRoZSBgdGhlbWVgIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBjbGFzc2VzIFRoZSBiYXNlQ2xhc3NlcyBvYmplY3RcbiAqIEByZXF1aXJlc1xuICovXG5mdW5jdGlvbiBjcmVhdGVUaGVtZUNsYXNzZXNMb29rdXAoY2xhc3Nlcykge1xuICAgIHJldHVybiBjbGFzc2VzLnJlZHVjZSgoY3VycmVudENsYXNzTmFtZXMsIGJhc2VDbGFzcykgPT4ge1xuICAgICAgICBPYmplY3Qua2V5cyhiYXNlQ2xhc3MpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgY3VycmVudENsYXNzTmFtZXNbYmFzZUNsYXNzW2tleV1dID0ga2V5O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzc05hbWVzO1xuICAgIH0sIHt9KTtcbn1cbi8qKlxuICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBpcyBnaXZlbiBhIHRoZW1lIGFuZCBhbiBvcHRpb25hbCByZWdpc3RyeSwgdGhlIHRoZW1lXG4gKiBpbmplY3RvciBpcyBkZWZpbmVkIGFnYWluc3QgdGhlIHJlZ2lzdHJ5LCByZXR1cm5pbmcgdGhlIHRoZW1lLlxuICpcbiAqIEBwYXJhbSB0aGVtZSB0aGUgdGhlbWUgdG8gc2V0XG4gKiBAcGFyYW0gdGhlbWVSZWdpc3RyeSByZWdpc3RyeSB0byBkZWZpbmUgdGhlIHRoZW1lIGluamVjdG9yIGFnYWluc3QuIERlZmF1bHRzXG4gKiB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5XG4gKlxuICogQHJldHVybnMgdGhlIHRoZW1lIGluamVjdG9yIHVzZWQgdG8gc2V0IHRoZSB0aGVtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJUaGVtZUluamVjdG9yKHRoZW1lLCB0aGVtZVJlZ2lzdHJ5KSB7XG4gICAgY29uc3QgdGhlbWVJbmplY3RvciA9IG5ldyBJbmplY3Rvcih0aGVtZSk7XG4gICAgdGhlbWVSZWdpc3RyeS5kZWZpbmVJbmplY3RvcihJTkpFQ1RFRF9USEVNRV9LRVksIChpbnZhbGlkYXRvcikgPT4ge1xuICAgICAgICB0aGVtZUluamVjdG9yLnNldEludmFsaWRhdG9yKGludmFsaWRhdG9yKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHRoZW1lSW5qZWN0b3IuZ2V0KCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoZW1lSW5qZWN0b3I7XG59XG4vKipcbiAqIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGNsYXNzIGRlY29yYXRlZCB3aXRoIHdpdGggVGhlbWVkIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFRoZW1lZE1peGluKEJhc2UpIHtcbiAgICBsZXQgVGhlbWVkID0gY2xhc3MgVGhlbWVkIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogUmVnaXN0ZXJlZCBiYXNlIHRoZW1lIGtleXNcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZEJhc2VUaGVtZUtleXMgPSBbXTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogSW5kaWNhdGVzIGlmIGNsYXNzZXMgbWV0YSBkYXRhIG5lZWQgdG8gYmUgY2FsY3VsYXRlZC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy5fcmVjYWxjdWxhdGVDbGFzc2VzID0gdHJ1ZTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogTG9hZGVkIHRoZW1lXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXMuX3RoZW1lID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhlbWUoY2xhc3Nlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JlY2FsY3VsYXRlQ2xhc3Nlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlY2FsY3VsYXRlVGhlbWVDbGFzc2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjbGFzc2VzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc2VzLm1hcCgoY2xhc3NOYW1lKSA9PiB0aGlzLl9nZXRUaGVtZUNsYXNzKGNsYXNzTmFtZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFRoZW1lQ2xhc3MoY2xhc3Nlcyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZ1bmN0aW9uIGZpcmVkIHdoZW4gYHRoZW1lYCBvciBgZXh0cmFDbGFzc2VzYCBhcmUgY2hhbmdlZC5cbiAgICAgICAgICovXG4gICAgICAgIG9uUHJvcGVydGllc0NoYW5nZWQoKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWNhbGN1bGF0ZUNsYXNzZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIF9nZXRUaGVtZUNsYXNzKGNsYXNzTmFtZSkge1xuICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PT0gdW5kZWZpbmVkIHx8IGNsYXNzTmFtZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBleHRyYUNsYXNzZXMgPSB0aGlzLnByb3BlcnRpZXMuZXh0cmFDbGFzc2VzIHx8IHt9O1xuICAgICAgICAgICAgY29uc3QgdGhlbWVDbGFzc05hbWUgPSB0aGlzLl9iYXNlVGhlbWVDbGFzc2VzUmV2ZXJzZUxvb2t1cFtjbGFzc05hbWVdO1xuICAgICAgICAgICAgbGV0IHJlc3VsdENsYXNzTmFtZXMgPSBbXTtcbiAgICAgICAgICAgIGlmICghdGhlbWVDbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYENsYXNzIG5hbWU6ICcke2NsYXNzTmFtZX0nIG5vdCBmb3VuZCBpbiB0aGVtZWApO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4dHJhQ2xhc3Nlc1t0aGVtZUNsYXNzTmFtZV0pIHtcbiAgICAgICAgICAgICAgICByZXN1bHRDbGFzc05hbWVzLnB1c2goZXh0cmFDbGFzc2VzW3RoZW1lQ2xhc3NOYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fdGhlbWVbdGhlbWVDbGFzc05hbWVdKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0Q2xhc3NOYW1lcy5wdXNoKHRoaXMuX3RoZW1lW3RoZW1lQ2xhc3NOYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHRDbGFzc05hbWVzLnB1c2godGhpcy5fcmVnaXN0ZXJlZEJhc2VUaGVtZVt0aGVtZUNsYXNzTmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENsYXNzTmFtZXMuam9pbignICcpO1xuICAgICAgICB9XG4gICAgICAgIF9yZWNhbGN1bGF0ZVRoZW1lQ2xhc3NlcygpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGhlbWUgPSB7fSB9ID0gdGhpcy5wcm9wZXJ0aWVzO1xuICAgICAgICAgICAgY29uc3QgYmFzZVRoZW1lcyA9IHRoaXMuZ2V0RGVjb3JhdG9yKCdiYXNlVGhlbWVDbGFzc2VzJyk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3JlZ2lzdGVyZWRCYXNlVGhlbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lID0gYmFzZVRoZW1lcy5yZWR1Y2UoKGZpbmFsQmFzZVRoZW1lLCBiYXNlVGhlbWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX2EgPSBUSEVNRV9LRVksIGtleSA9IGJhc2VUaGVtZVtfYV0sIGNsYXNzZXMgPSB0c2xpYl8xLl9fcmVzdChiYXNlVGhlbWUsIFt0eXBlb2YgX2EgPT09IFwic3ltYm9sXCIgPyBfYSA6IF9hICsgXCJcIl0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lS2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBmaW5hbEJhc2VUaGVtZSwgY2xhc3Nlcyk7XG4gICAgICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Jhc2VUaGVtZUNsYXNzZXNSZXZlcnNlTG9va3VwID0gY3JlYXRlVGhlbWVDbGFzc2VzTG9va3VwKGJhc2VUaGVtZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdGhlbWUgPSB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lS2V5cy5yZWR1Y2UoKGJhc2VUaGVtZSwgdGhlbWVLZXkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgYmFzZVRoZW1lLCB0aGVtZVt0aGVtZUtleV0pO1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgdGhpcy5fcmVjYWxjdWxhdGVDbGFzc2VzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHRzbGliXzEuX19kZWNvcmF0ZShbXG4gICAgICAgIGRpZmZQcm9wZXJ0eSgndGhlbWUnLCBzaGFsbG93KSxcbiAgICAgICAgZGlmZlByb3BlcnR5KCdleHRyYUNsYXNzZXMnLCBzaGFsbG93KSxcbiAgICAgICAgdHNsaWJfMS5fX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgICAgICB0c2xpYl8xLl9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbXSksXG4gICAgICAgIHRzbGliXzEuX19tZXRhZGF0YShcImRlc2lnbjpyZXR1cm50eXBlXCIsIHZvaWQgMClcbiAgICBdLCBUaGVtZWQucHJvdG90eXBlLCBcIm9uUHJvcGVydGllc0NoYW5nZWRcIiwgbnVsbCk7XG4gICAgVGhlbWVkID0gdHNsaWJfMS5fX2RlY29yYXRlKFtcbiAgICAgICAgaW5qZWN0KHtcbiAgICAgICAgICAgIG5hbWU6IElOSkVDVEVEX1RIRU1FX0tFWSxcbiAgICAgICAgICAgIGdldFByb3BlcnRpZXM6ICh0aGVtZSwgcHJvcGVydGllcykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcHJvcGVydGllcy50aGVtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB0aGVtZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgXSwgVGhlbWVkKTtcbiAgICByZXR1cm4gVGhlbWVkO1xufVxuZXhwb3J0IGRlZmF1bHQgVGhlbWVkTWl4aW47XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UaGVtZWQubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL21peGlucy9UaGVtZWQubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9taXhpbnMvVGhlbWVkLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBXaWRnZXRCYXNlLCBub0JpbmQgfSBmcm9tICcuL1dpZGdldEJhc2UnO1xuaW1wb3J0IHsgUHJvamVjdG9yTWl4aW4gfSBmcm9tICcuL21peGlucy9Qcm9qZWN0b3InO1xuaW1wb3J0IHsgZnJvbSB9IGZyb20gJ0Bkb2pvL3NoaW0vYXJyYXknO1xuaW1wb3J0IHsgdywgZG9tIH0gZnJvbSAnLi9kJztcbmltcG9ydCBnbG9iYWwgZnJvbSAnQGRvam8vc2hpbS9nbG9iYWwnO1xuaW1wb3J0IHsgcmVnaXN0ZXJUaGVtZUluamVjdG9yIH0gZnJvbSAnLi9taXhpbnMvVGhlbWVkJztcbmltcG9ydCB7IGFsd2F5c1JlbmRlciB9IGZyb20gJy4vZGVjb3JhdG9ycy9hbHdheXNSZW5kZXInO1xuZXhwb3J0IHZhciBDdXN0b21FbGVtZW50Q2hpbGRUeXBlO1xuKGZ1bmN0aW9uIChDdXN0b21FbGVtZW50Q2hpbGRUeXBlKSB7XG4gICAgQ3VzdG9tRWxlbWVudENoaWxkVHlwZVtcIkRPSk9cIl0gPSBcIkRPSk9cIjtcbiAgICBDdXN0b21FbGVtZW50Q2hpbGRUeXBlW1wiTk9ERVwiXSA9IFwiTk9ERVwiO1xuICAgIEN1c3RvbUVsZW1lbnRDaGlsZFR5cGVbXCJURVhUXCJdID0gXCJURVhUXCI7XG59KShDdXN0b21FbGVtZW50Q2hpbGRUeXBlIHx8IChDdXN0b21FbGVtZW50Q2hpbGRUeXBlID0ge30pKTtcbmV4cG9ydCBmdW5jdGlvbiBEb21Ub1dpZGdldFdyYXBwZXIoZG9tTm9kZSkge1xuICAgIGxldCBEb21Ub1dpZGdldFdyYXBwZXIgPSBjbGFzcyBEb21Ub1dpZGdldFdyYXBwZXIgZXh0ZW5kcyBXaWRnZXRCYXNlIHtcbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5rZXlzKHRoaXMucHJvcGVydGllcykucmVkdWNlKChwcm9wcywga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnByb3BlcnRpZXNba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoJ29uJykgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gYF9fJHtrZXl9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvcHNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9wcztcbiAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgICAgIHJldHVybiBkb20oeyBub2RlOiBkb21Ob2RlLCBwcm9wczogcHJvcGVydGllcywgZGlmZlR5cGU6ICdkb20nIH0pO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBnZXQgZG9tTm9kZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBkb21Ob2RlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEb21Ub1dpZGdldFdyYXBwZXIgPSB0c2xpYl8xLl9fZGVjb3JhdGUoW1xuICAgICAgICBhbHdheXNSZW5kZXIoKVxuICAgIF0sIERvbVRvV2lkZ2V0V3JhcHBlcik7XG4gICAgcmV0dXJuIERvbVRvV2lkZ2V0V3JhcHBlcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoZGVzY3JpcHRvciwgV2lkZ2V0Q29uc3RydWN0b3IpIHtcbiAgICBjb25zdCB7IGF0dHJpYnV0ZXMsIGNoaWxkVHlwZSwgcmVnaXN0cnlGYWN0b3J5IH0gPSBkZXNjcmlwdG9yO1xuICAgIGNvbnN0IGF0dHJpYnV0ZU1hcCA9IHt9O1xuICAgIGF0dHJpYnV0ZXMuZm9yRWFjaCgocHJvcGVydHlOYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgYXR0cmlidXRlTWFwW2F0dHJpYnV0ZU5hbWVdID0gcHJvcGVydHlOYW1lO1xuICAgIH0pO1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEhUTUxFbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHt9O1xuICAgICAgICAgICAgdGhpcy5fY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50UHJvcGVydGllcyA9IHt9O1xuICAgICAgICAgICAgdGhpcy5faW5pdGlhbGlzZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9pbml0aWFsaXNlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGRvbVByb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgICAgIGNvbnN0IHsgYXR0cmlidXRlcywgcHJvcGVydGllcywgZXZlbnRzIH0gPSBkZXNjcmlwdG9yO1xuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3Byb3BlcnRpZXMsIHRoaXMuX2F0dHJpYnV0ZXNUb1Byb3BlcnRpZXMoYXR0cmlidXRlcykpO1xuICAgICAgICAgICAgWy4uLmF0dHJpYnV0ZXMsIC4uLnByb3BlcnRpZXNdLmZvckVhY2goKHByb3BlcnR5TmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkUHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lLnJlcGxhY2UoL15vbi8sICdfXycpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyZWRQcm9wZXJ0eU5hbWUgIT09IHByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBkb21Qcm9wZXJ0aWVzW2ZpbHRlcmVkUHJvcGVydHlOYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldDogKCkgPT4gdGhpcy5fZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldDogKHZhbHVlKSA9PiB0aGlzLl9zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb21Qcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogKCkgPT4gdGhpcy5fZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgc2V0OiAodmFsdWUpID0+IHRoaXMuX3NldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZXZlbnRzLmZvckVhY2goKHByb3BlcnR5TmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IHByb3BlcnR5TmFtZS5yZXBsYWNlKC9eb24vLCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZFByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZS5yZXBsYWNlKC9eb24vLCAnX19vbicpO1xuICAgICAgICAgICAgICAgIGRvbVByb3BlcnRpZXNbZmlsdGVyZWRQcm9wZXJ0eU5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICBnZXQ6ICgpID0+IHRoaXMuX2dldEV2ZW50UHJvcGVydHkocHJvcGVydHlOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgc2V0OiAodmFsdWUpID0+IHRoaXMuX3NldEV2ZW50UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50UHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50Q2FsbGJhY2sgPSB0aGlzLl9nZXRFdmVudFByb3BlcnR5KHByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXZlbnRDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRDYWxsYmFjayguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IGFyZ3NcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIGRvbVByb3BlcnRpZXMpO1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBjaGlsZFR5cGUgPT09IEN1c3RvbUVsZW1lbnRDaGlsZFR5cGUuVEVYVCA/IHRoaXMuY2hpbGROb2RlcyA6IHRoaXMuY2hpbGRyZW47XG4gICAgICAgICAgICBmcm9tKGNoaWxkcmVuKS5mb3JFYWNoKChjaGlsZE5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRUeXBlID09PSBDdXN0b21FbGVtZW50Q2hpbGRUeXBlLkRPSk8pIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGROb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2Rvam8tY2UtcmVuZGVyJywgKCkgPT4gdGhpcy5fcmVuZGVyKCkpO1xuICAgICAgICAgICAgICAgICAgICBjaGlsZE5vZGUuYWRkRXZlbnRMaXN0ZW5lcignZG9qby1jZS1jb25uZWN0ZWQnLCAoKSA9PiB0aGlzLl9yZW5kZXIoKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoaWxkcmVuLnB1c2goRG9tVG9XaWRnZXRXcmFwcGVyKGNoaWxkTm9kZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hpbGRyZW4ucHVzaChkb20oeyBub2RlOiBjaGlsZE5vZGUsIGRpZmZUeXBlOiAnZG9tJyB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2Rvam8tY2UtY29ubmVjdGVkJywgKGUpID0+IHRoaXMuX2NoaWxkQ29ubmVjdGVkKGUpKTtcbiAgICAgICAgICAgIGNvbnN0IHdpZGdldFByb3BlcnRpZXMgPSB0aGlzLl9wcm9wZXJ0aWVzO1xuICAgICAgICAgICAgY29uc3QgcmVuZGVyQ2hpbGRyZW4gPSAoKSA9PiB0aGlzLl9fY2hpbGRyZW5fXygpO1xuICAgICAgICAgICAgY29uc3QgV3JhcHBlciA9IGNsYXNzIGV4dGVuZHMgV2lkZ2V0QmFzZSB7XG4gICAgICAgICAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdyhXaWRnZXRDb25zdHJ1Y3Rvciwgd2lkZ2V0UHJvcGVydGllcywgcmVuZGVyQ2hpbGRyZW4oKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gcmVnaXN0cnlGYWN0b3J5KCk7XG4gICAgICAgICAgICBjb25zdCB0aGVtZUNvbnRleHQgPSByZWdpc3RlclRoZW1lSW5qZWN0b3IodGhpcy5fZ2V0VGhlbWUoKSwgcmVnaXN0cnkpO1xuICAgICAgICAgICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Rvam8tdGhlbWUtc2V0JywgKCkgPT4gdGhlbWVDb250ZXh0LnNldCh0aGlzLl9nZXRUaGVtZSgpKSk7XG4gICAgICAgICAgICBjb25zdCBQcm9qZWN0b3IgPSBQcm9qZWN0b3JNaXhpbihXcmFwcGVyKTtcbiAgICAgICAgICAgIHRoaXMuX3Byb2plY3RvciA9IG5ldyBQcm9qZWN0b3IoKTtcbiAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rvci5zZXRQcm9wZXJ0aWVzKHsgcmVnaXN0cnkgfSk7XG4gICAgICAgICAgICB0aGlzLl9wcm9qZWN0b3IuYXBwZW5kKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5faW5pdGlhbGlzZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnZG9qby1jZS1jb25uZWN0ZWQnLCB7XG4gICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHRoaXNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBfZ2V0VGhlbWUoKSB7XG4gICAgICAgICAgICBpZiAoZ2xvYmFsICYmIGdsb2JhbC5kb2pvY2UgJiYgZ2xvYmFsLmRvam9jZS50aGVtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBnbG9iYWwuZG9qb2NlLnRoZW1lc1tnbG9iYWwuZG9qb2NlLnRoZW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfY2hpbGRDb25uZWN0ZWQoZSkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGUuZGV0YWlsO1xuICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50Tm9kZSA9PT0gdGhpcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuX2NoaWxkcmVuLnNvbWUoKGNoaWxkKSA9PiBjaGlsZC5kb21Ob2RlID09PSBub2RlKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgICAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2Rvam8tY2UtcmVuZGVyJywgKCkgPT4gdGhpcy5fcmVuZGVyKCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGlsZHJlbi5wdXNoKERvbVRvV2lkZ2V0V3JhcHBlcihub2RlKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfcmVuZGVyKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Byb2plY3Rvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rvci5pbnZhbGlkYXRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnZG9qby1jZS1yZW5kZXInLCB7XG4gICAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHRoaXNcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX19wcm9wZXJ0aWVzX18oKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcHJvcGVydGllcywgdGhpcy5fZXZlbnRQcm9wZXJ0aWVzKTtcbiAgICAgICAgfVxuICAgICAgICBfX2NoaWxkcmVuX18oKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGRUeXBlID09PSBDdXN0b21FbGVtZW50Q2hpbGRUeXBlLkRPSk8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW4uZmlsdGVyKChDaGlsZCkgPT4gQ2hpbGQuZG9tTm9kZS5pc1dpZGdldCkubWFwKChDaGlsZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRvbU5vZGUgfSA9IENoaWxkO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdyhDaGlsZCwgT2JqZWN0LmFzc2lnbih7fSwgZG9tTm9kZS5fX3Byb3BlcnRpZXNfXygpKSwgWy4uLmRvbU5vZGUuX19jaGlsZHJlbl9fKCldKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jaGlsZHJlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgb2xkVmFsdWUsIHZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBhdHRyaWJ1dGVNYXBbbmFtZV07XG4gICAgICAgICAgICB0aGlzLl9zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBfc2V0RXZlbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9ldmVudFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIF9nZXRFdmVudFByb3BlcnR5KHByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50UHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIF9zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVbbm9CaW5kXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcigpO1xuICAgICAgICB9XG4gICAgICAgIF9nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgX2F0dHJpYnV0ZXNUb1Byb3BlcnRpZXMoYXR0cmlidXRlcykge1xuICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXMucmVkdWNlKChwcm9wZXJ0aWVzLCBwcm9wZXJ0eU5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGF0dHJpYnV0ZU1hcCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzV2lkZ2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyKFdpZGdldENvbnN0cnVjdG9yKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IFdpZGdldENvbnN0cnVjdG9yLnByb3RvdHlwZSAmJiBXaWRnZXRDb25zdHJ1Y3Rvci5wcm90b3R5cGUuX19jdXN0b21FbGVtZW50RGVzY3JpcHRvcjtcbiAgICBpZiAoIWRlc2NyaXB0b3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZ2V0IGRlc2NyaXB0b3IgZm9yIEN1c3RvbSBFbGVtZW50LCBoYXZlIHlvdSBhZGRlZCB0aGUgQGN1c3RvbUVsZW1lbnQgZGVjb3JhdG9yIHRvIHlvdXIgV2lkZ2V0PycpO1xuICAgIH1cbiAgICBnbG9iYWwuY3VzdG9tRWxlbWVudHMuZGVmaW5lKGRlc2NyaXB0b3IudGFnTmFtZSwgY3JlYXRlKGRlc2NyaXB0b3IsIFdpZGdldENvbnN0cnVjdG9yKSk7XG59XG5leHBvcnQgZGVmYXVsdCByZWdpc3Rlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZ2lzdGVyQ3VzdG9tRWxlbWVudC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvcmVnaXN0ZXJDdXN0b21FbGVtZW50Lm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvcmVnaXN0ZXJDdXN0b21FbGVtZW50Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBnbG9iYWwgZnJvbSAnQGRvam8vc2hpbS9nbG9iYWwnO1xyXG5pbXBvcnQgeyBmcm9tIGFzIGFycmF5RnJvbSB9IGZyb20gJ0Bkb2pvL3NoaW0vYXJyYXknO1xyXG5pbXBvcnQgeyBpc1dOb2RlLCBpc1ZOb2RlLCBpc0RvbVZOb2RlLCBWTk9ERSwgV05PREUgfSBmcm9tICcuL2QnO1xyXG5pbXBvcnQgeyBpc1dpZGdldEJhc2VDb25zdHJ1Y3RvciB9IGZyb20gJy4vUmVnaXN0cnknO1xyXG5pbXBvcnQgV2Vha01hcCBmcm9tICdAZG9qby9zaGltL1dlYWtNYXAnO1xyXG5jb25zdCBOQU1FU1BBQ0VfVzMgPSAnaHR0cDovL3d3dy53My5vcmcvJztcclxuY29uc3QgTkFNRVNQQUNFX1NWRyA9IE5BTUVTUEFDRV9XMyArICcyMDAwL3N2Zyc7XHJcbmNvbnN0IE5BTUVTUEFDRV9YTElOSyA9IE5BTUVTUEFDRV9XMyArICcxOTk5L3hsaW5rJztcclxuY29uc3QgZW1wdHlBcnJheSA9IFtdO1xyXG5leHBvcnQgY29uc3Qgd2lkZ2V0SW5zdGFuY2VNYXAgPSBuZXcgV2Vha01hcCgpO1xyXG5jb25zdCBpbnN0YW5jZU1hcCA9IG5ldyBXZWFrTWFwKCk7XHJcbmNvbnN0IHByb2plY3RvclN0YXRlTWFwID0gbmV3IFdlYWtNYXAoKTtcclxuZnVuY3Rpb24gc2FtZShkbm9kZTEsIGRub2RlMikge1xyXG4gICAgaWYgKGlzVk5vZGUoZG5vZGUxKSAmJiBpc1ZOb2RlKGRub2RlMikpIHtcclxuICAgICAgICBpZiAoaXNEb21WTm9kZShkbm9kZTEpIHx8IGlzRG9tVk5vZGUoZG5vZGUyKSkge1xyXG4gICAgICAgICAgICBpZiAoZG5vZGUxLmRvbU5vZGUgIT09IGRub2RlMi5kb21Ob2RlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRub2RlMS50YWcgIT09IGRub2RlMi50YWcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZG5vZGUxLnByb3BlcnRpZXMua2V5ICE9PSBkbm9kZTIucHJvcGVydGllcy5rZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGlzV05vZGUoZG5vZGUxKSAmJiBpc1dOb2RlKGRub2RlMikpIHtcclxuICAgICAgICBpZiAoZG5vZGUxLmluc3RhbmNlID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIGRub2RlMi53aWRnZXRDb25zdHJ1Y3RvciA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZG5vZGUxLndpZGdldENvbnN0cnVjdG9yICE9PSBkbm9kZTIud2lkZ2V0Q29uc3RydWN0b3IpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZG5vZGUxLnByb3BlcnRpZXMua2V5ICE9PSBkbm9kZTIucHJvcGVydGllcy5rZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxufVxyXG5jb25zdCBtaXNzaW5nVHJhbnNpdGlvbiA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignUHJvdmlkZSBhIHRyYW5zaXRpb25zIG9iamVjdCB0byB0aGUgcHJvamVjdGlvbk9wdGlvbnMgdG8gZG8gYW5pbWF0aW9ucycpO1xyXG59O1xyXG5mdW5jdGlvbiBnZXRQcm9qZWN0aW9uT3B0aW9ucyhwcm9qZWN0b3JPcHRpb25zLCBwcm9qZWN0b3JJbnN0YW5jZSkge1xyXG4gICAgY29uc3QgZGVmYXVsdHMgPSB7XHJcbiAgICAgICAgbmFtZXNwYWNlOiB1bmRlZmluZWQsXHJcbiAgICAgICAgc3R5bGVBcHBseWVyOiBmdW5jdGlvbiAoZG9tTm9kZSwgc3R5bGVOYW1lLCB2YWx1ZSkge1xyXG4gICAgICAgICAgICBkb21Ob2RlLnN0eWxlW3N0eWxlTmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRyYW5zaXRpb25zOiB7XHJcbiAgICAgICAgICAgIGVudGVyOiBtaXNzaW5nVHJhbnNpdGlvbixcclxuICAgICAgICAgICAgZXhpdDogbWlzc2luZ1RyYW5zaXRpb25cclxuICAgICAgICB9LFxyXG4gICAgICAgIGRlcHRoOiAwLFxyXG4gICAgICAgIG1lcmdlOiBmYWxzZSxcclxuICAgICAgICBzeW5jOiBmYWxzZSxcclxuICAgICAgICBwcm9qZWN0b3JJbnN0YW5jZVxyXG4gICAgfTtcclxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0cywgcHJvamVjdG9yT3B0aW9ucyk7XHJcbn1cclxuZnVuY3Rpb24gY2hlY2tTdHlsZVZhbHVlKHN0eWxlVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2Ygc3R5bGVWYWx1ZSAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0eWxlIHZhbHVlcyBtdXN0IGJlIHN0cmluZ3MnKTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiB1cGRhdGVFdmVudChkb21Ob2RlLCBldmVudE5hbWUsIGN1cnJlbnRWYWx1ZSwgcHJvamVjdGlvbk9wdGlvbnMsIGJpbmQsIHByZXZpb3VzVmFsdWUpIHtcclxuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgIGNvbnN0IGV2ZW50TWFwID0gcHJvamVjdG9yU3RhdGUubm9kZU1hcC5nZXQoZG9tTm9kZSkgfHwgbmV3IFdlYWtNYXAoKTtcclxuICAgIGlmIChwcmV2aW91c1ZhbHVlKSB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNFdmVudCA9IGV2ZW50TWFwLmdldChwcmV2aW91c1ZhbHVlKTtcclxuICAgICAgICBkb21Ob2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBwcmV2aW91c0V2ZW50KTtcclxuICAgIH1cclxuICAgIGxldCBjYWxsYmFjayA9IGN1cnJlbnRWYWx1ZS5iaW5kKGJpbmQpO1xyXG4gICAgaWYgKGV2ZW50TmFtZSA9PT0gJ2lucHV0Jykge1xyXG4gICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKGV2dCkge1xyXG4gICAgICAgICAgICBjdXJyZW50VmFsdWUuY2FsbCh0aGlzLCBldnQpO1xyXG4gICAgICAgICAgICBldnQudGFyZ2V0WydvbmlucHV0LXZhbHVlJ10gPSBldnQudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIH0uYmluZChiaW5kKTtcclxuICAgIH1cclxuICAgIGRvbU5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrKTtcclxuICAgIGV2ZW50TWFwLnNldChjdXJyZW50VmFsdWUsIGNhbGxiYWNrKTtcclxuICAgIHByb2plY3RvclN0YXRlLm5vZGVNYXAuc2V0KGRvbU5vZGUsIGV2ZW50TWFwKTtcclxufVxyXG5mdW5jdGlvbiBhZGRDbGFzc2VzKGRvbU5vZGUsIGNsYXNzZXMpIHtcclxuICAgIGlmIChjbGFzc2VzKSB7XHJcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IGNsYXNzZXMuc3BsaXQoJyAnKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsYXNzTmFtZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZG9tTm9kZS5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZXNbaV0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiByZW1vdmVDbGFzc2VzKGRvbU5vZGUsIGNsYXNzZXMpIHtcclxuICAgIGlmIChjbGFzc2VzKSB7XHJcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IGNsYXNzZXMuc3BsaXQoJyAnKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsYXNzTmFtZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZG9tTm9kZS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZXNbaV0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBidWlsZFByZXZpb3VzUHJvcGVydGllcyhkb21Ob2RlLCBwcmV2aW91cywgY3VycmVudCkge1xyXG4gICAgY29uc3QgeyBkaWZmVHlwZSwgcHJvcGVydGllcywgYXR0cmlidXRlcyB9ID0gY3VycmVudDtcclxuICAgIGlmICghZGlmZlR5cGUgfHwgZGlmZlR5cGUgPT09ICd2ZG9tJykge1xyXG4gICAgICAgIHJldHVybiB7IHByb3BlcnRpZXM6IHByZXZpb3VzLnByb3BlcnRpZXMsIGF0dHJpYnV0ZXM6IHByZXZpb3VzLmF0dHJpYnV0ZXMsIGV2ZW50czogcHJldmlvdXMuZXZlbnRzIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChkaWZmVHlwZSA9PT0gJ25vbmUnKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgcHJvcGVydGllczoge30sIGF0dHJpYnV0ZXM6IHByZXZpb3VzLmF0dHJpYnV0ZXMgPyB7fSA6IHVuZGVmaW5lZCwgZXZlbnRzOiBwcmV2aW91cy5ldmVudHMgfTtcclxuICAgIH1cclxuICAgIGxldCBuZXdQcm9wZXJ0aWVzID0ge1xyXG4gICAgICAgIHByb3BlcnRpZXM6IHt9XHJcbiAgICB9O1xyXG4gICAgaWYgKGF0dHJpYnV0ZXMpIHtcclxuICAgICAgICBuZXdQcm9wZXJ0aWVzLmF0dHJpYnV0ZXMgPSB7fTtcclxuICAgICAgICBuZXdQcm9wZXJ0aWVzLmV2ZW50cyA9IHByZXZpb3VzLmV2ZW50cztcclxuICAgICAgICBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5mb3JFYWNoKChwcm9wTmFtZSkgPT4ge1xyXG4gICAgICAgICAgICBuZXdQcm9wZXJ0aWVzLnByb3BlcnRpZXNbcHJvcE5hbWVdID0gZG9tTm9kZVtwcm9wTmFtZV07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaCgoYXR0ck5hbWUpID0+IHtcclxuICAgICAgICAgICAgbmV3UHJvcGVydGllcy5hdHRyaWJ1dGVzW2F0dHJOYW1lXSA9IGRvbU5vZGUuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gbmV3UHJvcGVydGllcztcclxuICAgIH1cclxuICAgIG5ld1Byb3BlcnRpZXMucHJvcGVydGllcyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpLnJlZHVjZSgocHJvcHMsIHByb3BlcnR5KSA9PiB7XHJcbiAgICAgICAgcHJvcHNbcHJvcGVydHldID0gZG9tTm9kZS5nZXRBdHRyaWJ1dGUocHJvcGVydHkpIHx8IGRvbU5vZGVbcHJvcGVydHldO1xyXG4gICAgICAgIHJldHVybiBwcm9wcztcclxuICAgIH0sIHt9KTtcclxuICAgIHJldHVybiBuZXdQcm9wZXJ0aWVzO1xyXG59XHJcbmZ1bmN0aW9uIGZvY3VzTm9kZShwcm9wVmFsdWUsIHByZXZpb3VzVmFsdWUsIGRvbU5vZGUsIHByb2plY3Rpb25PcHRpb25zKSB7XHJcbiAgICBsZXQgcmVzdWx0O1xyXG4gICAgaWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICByZXN1bHQgPSBwcm9wVmFsdWUoKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHJlc3VsdCA9IHByb3BWYWx1ZSAmJiAhcHJldmlvdXNWYWx1ZTtcclxuICAgIH1cclxuICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHtcclxuICAgICAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XHJcbiAgICAgICAgcHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3MucHVzaCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGRvbU5vZGUuZm9jdXMoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiByZW1vdmVPcnBoYW5lZEV2ZW50cyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMsIHByb3BlcnRpZXMsIHByb2plY3Rpb25PcHRpb25zLCBvbmx5RXZlbnRzID0gZmFsc2UpIHtcclxuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgIGNvbnN0IGV2ZW50TWFwID0gcHJvamVjdG9yU3RhdGUubm9kZU1hcC5nZXQoZG9tTm9kZSk7XHJcbiAgICBpZiAoZXZlbnRNYXApIHtcclxuICAgICAgICBPYmplY3Qua2V5cyhwcmV2aW91c1Byb3BlcnRpZXMpLmZvckVhY2goKHByb3BOYW1lKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzRXZlbnQgPSBwcm9wTmFtZS5zdWJzdHIoMCwgMikgPT09ICdvbicgfHwgb25seUV2ZW50cztcclxuICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0gb25seUV2ZW50cyA/IHByb3BOYW1lIDogcHJvcE5hbWUuc3Vic3RyKDIpO1xyXG4gICAgICAgICAgICBpZiAoaXNFdmVudCAmJiAhcHJvcGVydGllc1twcm9wTmFtZV0pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50Q2FsbGJhY2sgPSBldmVudE1hcC5nZXQocHJldmlvdXNQcm9wZXJ0aWVzW3Byb3BOYW1lXSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRDYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgIGRvbU5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGV2ZW50Q2FsbGJhY2spO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gdXBkYXRlQXR0cmlidXRlKGRvbU5vZGUsIGF0dHJOYW1lLCBhdHRyVmFsdWUsIHByb2plY3Rpb25PcHRpb25zKSB7XHJcbiAgICBpZiAocHJvamVjdGlvbk9wdGlvbnMubmFtZXNwYWNlID09PSBOQU1FU1BBQ0VfU1ZHICYmIGF0dHJOYW1lID09PSAnaHJlZicpIHtcclxuICAgICAgICBkb21Ob2RlLnNldEF0dHJpYnV0ZU5TKE5BTUVTUEFDRV9YTElOSywgYXR0ck5hbWUsIGF0dHJWYWx1ZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICgoYXR0ck5hbWUgPT09ICdyb2xlJyAmJiBhdHRyVmFsdWUgPT09ICcnKSB8fCBhdHRyVmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGRvbU5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGRvbU5vZGUuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHVwZGF0ZUF0dHJpYnV0ZXMoZG9tTm9kZSwgcHJldmlvdXNBdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzLCBwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgY29uc3QgYXR0ck5hbWVzID0gT2JqZWN0LmtleXMoYXR0cmlidXRlcyk7XHJcbiAgICBjb25zdCBhdHRyQ291bnQgPSBhdHRyTmFtZXMubGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyQ291bnQ7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGF0dHJOYW1lID0gYXR0ck5hbWVzW2ldO1xyXG4gICAgICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGF0dHJpYnV0ZXNbYXR0ck5hbWVdO1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzQXR0clZhbHVlID0gcHJldmlvdXNBdHRyaWJ1dGVzW2F0dHJOYW1lXTtcclxuICAgICAgICBpZiAoYXR0clZhbHVlICE9PSBwcmV2aW91c0F0dHJWYWx1ZSkge1xyXG4gICAgICAgICAgICB1cGRhdGVBdHRyaWJ1dGUoZG9tTm9kZSwgYXR0ck5hbWUsIGF0dHJWYWx1ZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiB1cGRhdGVQcm9wZXJ0aWVzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcywgcHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMsIGluY2x1ZGVzRXZlbnRzQW5kQXR0cmlidXRlcyA9IHRydWUpIHtcclxuICAgIGxldCBwcm9wZXJ0aWVzVXBkYXRlZCA9IGZhbHNlO1xyXG4gICAgY29uc3QgcHJvcE5hbWVzID0gT2JqZWN0LmtleXMocHJvcGVydGllcyk7XHJcbiAgICBjb25zdCBwcm9wQ291bnQgPSBwcm9wTmFtZXMubGVuZ3RoO1xyXG4gICAgaWYgKHByb3BOYW1lcy5pbmRleE9mKCdjbGFzc2VzJykgPT09IC0xICYmIHByZXZpb3VzUHJvcGVydGllcy5jbGFzc2VzKSB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocHJldmlvdXNQcm9wZXJ0aWVzLmNsYXNzZXMpKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldmlvdXNQcm9wZXJ0aWVzLmNsYXNzZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzZXMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLmNsYXNzZXNbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZW1vdmVDbGFzc2VzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcy5jbGFzc2VzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpbmNsdWRlc0V2ZW50c0FuZEF0dHJpYnV0ZXMgJiYgcmVtb3ZlT3JwaGFuZWRFdmVudHMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcE5hbWUgPSBwcm9wTmFtZXNbaV07XHJcbiAgICAgICAgbGV0IHByb3BWYWx1ZSA9IHByb3BlcnRpZXNbcHJvcE5hbWVdO1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBwcmV2aW91c1Byb3BlcnRpZXNbcHJvcE5hbWVdO1xyXG4gICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ2NsYXNzZXMnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzQ2xhc3NlcyA9IEFycmF5LmlzQXJyYXkocHJldmlvdXNWYWx1ZSkgPyBwcmV2aW91c1ZhbHVlIDogW3ByZXZpb3VzVmFsdWVdO1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50Q2xhc3NlcyA9IEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSA/IHByb3BWYWx1ZSA6IFtwcm9wVmFsdWVdO1xyXG4gICAgICAgICAgICBpZiAocHJldmlvdXNDbGFzc2VzICYmIHByZXZpb3VzQ2xhc3Nlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXByb3BWYWx1ZSB8fCBwcm9wVmFsdWUubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2aW91c0NsYXNzZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3Nlcyhkb21Ob2RlLCBwcmV2aW91c0NsYXNzZXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NsYXNzZXMgPSBbLi4uY3VycmVudENsYXNzZXNdO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldmlvdXNDbGFzc2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzQ2xhc3NOYW1lID0gcHJldmlvdXNDbGFzc2VzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNDbGFzc05hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzSW5kZXggPSBuZXdDbGFzc2VzLmluZGV4T2YocHJldmlvdXNDbGFzc05hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzSW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3Nlcyhkb21Ob2RlLCBwcmV2aW91c0NsYXNzTmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDbGFzc2VzLnNwbGljZShjbGFzc0luZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld0NsYXNzZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkQ2xhc3Nlcyhkb21Ob2RlLCBuZXdDbGFzc2VzW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnJlbnRDbGFzc2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWRkQ2xhc3Nlcyhkb21Ob2RlLCBjdXJyZW50Q2xhc3Nlc1tpXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocHJvcE5hbWUgPT09ICdmb2N1cycpIHtcclxuICAgICAgICAgICAgZm9jdXNOb2RlKHByb3BWYWx1ZSwgcHJldmlvdXNWYWx1ZSwgZG9tTm9kZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChwcm9wTmFtZSA9PT0gJ3N0eWxlcycpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3R5bGVOYW1lcyA9IE9iamVjdC5rZXlzKHByb3BWYWx1ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlQ291bnQgPSBzdHlsZU5hbWVzLmxlbmd0aDtcclxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzdHlsZUNvdW50OyBqKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlTmFtZSA9IHN0eWxlTmFtZXNbal07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdTdHlsZVZhbHVlID0gcHJvcFZhbHVlW3N0eWxlTmFtZV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRTdHlsZVZhbHVlID0gcHJldmlvdXNWYWx1ZSAmJiBwcmV2aW91c1ZhbHVlW3N0eWxlTmFtZV07XHJcbiAgICAgICAgICAgICAgICBpZiAobmV3U3R5bGVWYWx1ZSA9PT0gb2xkU3R5bGVWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcHJvcGVydGllc1VwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKG5ld1N0eWxlVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjaGVja1N0eWxlVmFsdWUobmV3U3R5bGVWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbk9wdGlvbnMuc3R5bGVBcHBseWVyKGRvbU5vZGUsIHN0eWxlTmFtZSwgbmV3U3R5bGVWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uT3B0aW9ucy5zdHlsZUFwcGx5ZXIoZG9tTm9kZSwgc3R5bGVOYW1lLCAnJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghcHJvcFZhbHVlICYmIHR5cGVvZiBwcmV2aW91c1ZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgcHJvcFZhbHVlID0gJyc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAndmFsdWUnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkb21WYWx1ZSA9IGRvbU5vZGVbcHJvcE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRvbVZhbHVlICE9PSBwcm9wVmFsdWUgJiZcclxuICAgICAgICAgICAgICAgICAgICAoZG9tTm9kZVsnb25pbnB1dC12YWx1ZSddXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZG9tVmFsdWUgPT09IGRvbU5vZGVbJ29uaW5wdXQtdmFsdWUnXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHByb3BWYWx1ZSAhPT0gcHJldmlvdXNWYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBkb21Ob2RlW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICBkb21Ob2RlWydvbmlucHV0LXZhbHVlJ10gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvcFZhbHVlICE9PSBwcmV2aW91c1ZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc1VwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHByb3BOYW1lICE9PSAna2V5JyAmJiBwcm9wVmFsdWUgIT09IHByZXZpb3VzVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgcHJvcFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdmdW5jdGlvbicgJiYgcHJvcE5hbWUubGFzdEluZGV4T2YoJ29uJywgMCkgPT09IDAgJiYgaW5jbHVkZXNFdmVudHNBbmRBdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlRXZlbnQoZG9tTm9kZSwgcHJvcE5hbWUuc3Vic3RyKDIpLCBwcm9wVmFsdWUsIHByb2plY3Rpb25PcHRpb25zLCBwcm9wZXJ0aWVzLmJpbmQsIHByZXZpb3VzVmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgcHJvcE5hbWUgIT09ICdpbm5lckhUTUwnICYmIGluY2x1ZGVzRXZlbnRzQW5kQXR0cmlidXRlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZShkb21Ob2RlLCBwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9wTmFtZSA9PT0gJ3Njcm9sbExlZnQnIHx8IHByb3BOYW1lID09PSAnc2Nyb2xsVG9wJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkb21Ob2RlW3Byb3BOYW1lXSAhPT0gcHJvcFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbU5vZGVbcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGRvbU5vZGVbcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcHJvcGVydGllc1VwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHByb3BlcnRpZXNVcGRhdGVkO1xyXG59XHJcbmZ1bmN0aW9uIGZpbmRJbmRleE9mQ2hpbGQoY2hpbGRyZW4sIHNhbWVBcywgc3RhcnQpIHtcclxuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHNhbWUoY2hpbGRyZW5baV0sIHNhbWVBcykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIC0xO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiB0b1BhcmVudFZOb2RlKGRvbU5vZGUpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgdGFnOiAnJyxcclxuICAgICAgICBwcm9wZXJ0aWVzOiB7fSxcclxuICAgICAgICBjaGlsZHJlbjogdW5kZWZpbmVkLFxyXG4gICAgICAgIGRvbU5vZGUsXHJcbiAgICAgICAgdHlwZTogVk5PREVcclxuICAgIH07XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIHRvVGV4dFZOb2RlKGRhdGEpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgdGFnOiAnJyxcclxuICAgICAgICBwcm9wZXJ0aWVzOiB7fSxcclxuICAgICAgICBjaGlsZHJlbjogdW5kZWZpbmVkLFxyXG4gICAgICAgIHRleHQ6IGAke2RhdGF9YCxcclxuICAgICAgICBkb21Ob2RlOiB1bmRlZmluZWQsXHJcbiAgICAgICAgdHlwZTogVk5PREVcclxuICAgIH07XHJcbn1cclxuZnVuY3Rpb24gdG9JbnRlcm5hbFdOb2RlKGluc3RhbmNlLCBpbnN0YW5jZURhdGEpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgaW5zdGFuY2UsXHJcbiAgICAgICAgcmVuZGVyZWQ6IFtdLFxyXG4gICAgICAgIGNvcmVQcm9wZXJ0aWVzOiBpbnN0YW5jZURhdGEuY29yZVByb3BlcnRpZXMsXHJcbiAgICAgICAgY2hpbGRyZW46IGluc3RhbmNlLmNoaWxkcmVuLFxyXG4gICAgICAgIHdpZGdldENvbnN0cnVjdG9yOiBpbnN0YW5jZS5jb25zdHJ1Y3RvcixcclxuICAgICAgICBwcm9wZXJ0aWVzOiBpbnN0YW5jZURhdGEuaW5wdXRQcm9wZXJ0aWVzLFxyXG4gICAgICAgIHR5cGU6IFdOT0RFXHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJBbmREZWNvcmF0ZUNoaWxkcmVuKGNoaWxkcmVuLCBpbnN0YW5jZSkge1xyXG4gICAgaWYgKGNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4gZW1wdHlBcnJheTtcclxuICAgIH1cclxuICAgIGNoaWxkcmVuID0gQXJyYXkuaXNBcnJheShjaGlsZHJlbikgPyBjaGlsZHJlbiA6IFtjaGlsZHJlbl07XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDspIHtcclxuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xyXG4gICAgICAgIGlmIChjaGlsZCA9PT0gdW5kZWZpbmVkIHx8IGNoaWxkID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNoaWxkcmVuLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgY2hpbGRyZW5baV0gPSB0b1RleHRWTm9kZShjaGlsZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoaXNWTm9kZShjaGlsZCkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5wcm9wZXJ0aWVzLmJpbmQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLnByb3BlcnRpZXMuYmluZCA9IGluc3RhbmNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5jaGlsZHJlbiAmJiBjaGlsZC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlckFuZERlY29yYXRlQ2hpbGRyZW4oY2hpbGQuY2hpbGRyZW4sIGluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNoaWxkLmNvcmVQcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZC5jb3JlUHJvcGVydGllcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmluZDogaW5zdGFuY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VSZWdpc3RyeTogaW5zdGFuY2VEYXRhLmNvcmVQcm9wZXJ0aWVzLmJhc2VSZWdpc3RyeVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuY2hpbGRyZW4gJiYgY2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlckFuZERlY29yYXRlQ2hpbGRyZW4oY2hpbGQuY2hpbGRyZW4sIGluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpKys7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2hpbGRyZW47XHJcbn1cclxuZnVuY3Rpb24gbm9kZUFkZGVkKGRub2RlLCB0cmFuc2l0aW9ucykge1xyXG4gICAgaWYgKGlzVk5vZGUoZG5vZGUpICYmIGRub2RlLnByb3BlcnRpZXMpIHtcclxuICAgICAgICBjb25zdCBlbnRlckFuaW1hdGlvbiA9IGRub2RlLnByb3BlcnRpZXMuZW50ZXJBbmltYXRpb247XHJcbiAgICAgICAgaWYgKGVudGVyQW5pbWF0aW9uKSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZW50ZXJBbmltYXRpb24gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIGVudGVyQW5pbWF0aW9uKGRub2RlLmRvbU5vZGUsIGRub2RlLnByb3BlcnRpZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbnMuZW50ZXIoZG5vZGUuZG9tTm9kZSwgZG5vZGUucHJvcGVydGllcywgZW50ZXJBbmltYXRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIG5vZGVUb1JlbW92ZShkbm9kZSwgdHJhbnNpdGlvbnMsIHByb2plY3Rpb25PcHRpb25zKSB7XHJcbiAgICBpZiAoaXNXTm9kZShkbm9kZSkpIHtcclxuICAgICAgICBjb25zdCByZW5kZXJlZCA9IGRub2RlLnJlbmRlcmVkIHx8IGVtcHR5QXJyYXk7XHJcbiAgICAgICAgaWYgKGRub2RlLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldChkbm9kZS5pbnN0YW5jZSk7XHJcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5vbkRldGFjaCgpO1xyXG4gICAgICAgICAgICBpbnN0YW5jZU1hcC5kZWxldGUoZG5vZGUuaW5zdGFuY2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbmRlcmVkLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIG5vZGVUb1JlbW92ZShyZW5kZXJlZFtpXSwgdHJhbnNpdGlvbnMsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBjb25zdCBkb21Ob2RlID0gZG5vZGUuZG9tTm9kZTtcclxuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gZG5vZGUucHJvcGVydGllcztcclxuICAgICAgICBpZiAoZG5vZGUuY2hpbGRyZW4gJiYgZG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBub2RlVG9SZW1vdmUoZG5vZGUuY2hpbGRyZW5baV0sIHRyYW5zaXRpb25zLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZXhpdEFuaW1hdGlvbiA9IHByb3BlcnRpZXMuZXhpdEFuaW1hdGlvbjtcclxuICAgICAgICBpZiAocHJvcGVydGllcyAmJiBleGl0QW5pbWF0aW9uKSB7XHJcbiAgICAgICAgICAgIGRvbU5vZGUuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcclxuICAgICAgICAgICAgY29uc3QgcmVtb3ZlRG9tTm9kZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGRvbU5vZGUgJiYgZG9tTm9kZS5wYXJlbnROb2RlICYmIGRvbU5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkb21Ob2RlKTtcclxuICAgICAgICAgICAgICAgIGRub2RlLmRvbU5vZGUgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXhpdEFuaW1hdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgZXhpdEFuaW1hdGlvbihkb21Ob2RlLCByZW1vdmVEb21Ob2RlLCBwcm9wZXJ0aWVzKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25zLmV4aXQoZG5vZGUuZG9tTm9kZSwgcHJvcGVydGllcywgZXhpdEFuaW1hdGlvbiwgcmVtb3ZlRG9tTm9kZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZG9tTm9kZSAmJiBkb21Ob2RlLnBhcmVudE5vZGUgJiYgZG9tTm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRvbU5vZGUpO1xyXG4gICAgICAgIGRub2RlLmRvbU5vZGUgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gY2hlY2tEaXN0aW5ndWlzaGFibGUoY2hpbGROb2RlcywgaW5kZXhUb0NoZWNrLCBwYXJlbnRJbnN0YW5jZSkge1xyXG4gICAgY29uc3QgY2hpbGROb2RlID0gY2hpbGROb2Rlc1tpbmRleFRvQ2hlY2tdO1xyXG4gICAgaWYgKGlzVk5vZGUoY2hpbGROb2RlKSAmJiAhY2hpbGROb2RlLnRhZykge1xyXG4gICAgICAgIHJldHVybjsgLy8gVGV4dCBub2RlcyBuZWVkIG5vdCBiZSBkaXN0aW5ndWlzaGFibGVcclxuICAgIH1cclxuICAgIGNvbnN0IHsga2V5IH0gPSBjaGlsZE5vZGUucHJvcGVydGllcztcclxuICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09IG51bGwpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGkgIT09IGluZGV4VG9DaGVjaykge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGNoaWxkTm9kZXNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoc2FtZShub2RlLCBjaGlsZE5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVJZGVudGlmaWVyO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudE5hbWUgPSBwYXJlbnRJbnN0YW5jZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICd1bmtub3duJztcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNXTm9kZShjaGlsZE5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVJZGVudGlmaWVyID0gY2hpbGROb2RlLndpZGdldENvbnN0cnVjdG9yLm5hbWUgfHwgJ3Vua25vd24nO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUlkZW50aWZpZXIgPSBjaGlsZE5vZGUudGFnO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEEgd2lkZ2V0ICgke3BhcmVudE5hbWV9KSBoYXMgaGFkIGEgY2hpbGQgYWRkZGVkIG9yIHJlbW92ZWQsIGJ1dCB0aGV5IHdlcmUgbm90IGFibGUgdG8gdW5pcXVlbHkgaWRlbnRpZmllZC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gcHJvdmlkZSBhIHVuaXF1ZSAna2V5JyBwcm9wZXJ0eSB3aGVuIHVzaW5nIHRoZSBzYW1lIHdpZGdldCBvciBlbGVtZW50ICgke25vZGVJZGVudGlmaWVyfSkgbXVsdGlwbGUgdGltZXMgYXMgc2libGluZ3NgKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiB1cGRhdGVDaGlsZHJlbihwYXJlbnRWTm9kZSwgb2xkQ2hpbGRyZW4sIG5ld0NoaWxkcmVuLCBwYXJlbnRJbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpIHtcclxuICAgIG9sZENoaWxkcmVuID0gb2xkQ2hpbGRyZW4gfHwgZW1wdHlBcnJheTtcclxuICAgIG5ld0NoaWxkcmVuID0gbmV3Q2hpbGRyZW47XHJcbiAgICBjb25zdCBvbGRDaGlsZHJlbkxlbmd0aCA9IG9sZENoaWxkcmVuLmxlbmd0aDtcclxuICAgIGNvbnN0IG5ld0NoaWxkcmVuTGVuZ3RoID0gbmV3Q2hpbGRyZW4ubGVuZ3RoO1xyXG4gICAgY29uc3QgdHJhbnNpdGlvbnMgPSBwcm9qZWN0aW9uT3B0aW9ucy50cmFuc2l0aW9ucztcclxuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgIHByb2plY3Rpb25PcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvamVjdGlvbk9wdGlvbnMsIHsgZGVwdGg6IHByb2plY3Rpb25PcHRpb25zLmRlcHRoICsgMSB9KTtcclxuICAgIGxldCBvbGRJbmRleCA9IDA7XHJcbiAgICBsZXQgbmV3SW5kZXggPSAwO1xyXG4gICAgbGV0IGk7XHJcbiAgICBsZXQgdGV4dFVwZGF0ZWQgPSBmYWxzZTtcclxuICAgIHdoaWxlIChuZXdJbmRleCA8IG5ld0NoaWxkcmVuTGVuZ3RoKSB7XHJcbiAgICAgICAgbGV0IG9sZENoaWxkID0gb2xkSW5kZXggPCBvbGRDaGlsZHJlbkxlbmd0aCA/IG9sZENoaWxkcmVuW29sZEluZGV4XSA6IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCBuZXdDaGlsZCA9IG5ld0NoaWxkcmVuW25ld0luZGV4XTtcclxuICAgICAgICBpZiAoaXNWTm9kZShuZXdDaGlsZCkgJiYgdHlwZW9mIG5ld0NoaWxkLmRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIG5ld0NoaWxkLmluc2VydGVkID0gaXNWTm9kZShvbGRDaGlsZCkgJiYgb2xkQ2hpbGQuaW5zZXJ0ZWQ7XHJcbiAgICAgICAgICAgIGFkZERlZmVycmVkUHJvcGVydGllcyhuZXdDaGlsZCwgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob2xkQ2hpbGQgIT09IHVuZGVmaW5lZCAmJiBzYW1lKG9sZENoaWxkLCBuZXdDaGlsZCkpIHtcclxuICAgICAgICAgICAgdGV4dFVwZGF0ZWQgPSB1cGRhdGVEb20ob2xkQ2hpbGQsIG5ld0NoaWxkLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50Vk5vZGUsIHBhcmVudEluc3RhbmNlKSB8fCB0ZXh0VXBkYXRlZDtcclxuICAgICAgICAgICAgb2xkSW5kZXgrKztcclxuICAgICAgICAgICAgbmV3SW5kZXgrKztcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZpbmRPbGRJbmRleCA9IGZpbmRJbmRleE9mQ2hpbGQob2xkQ2hpbGRyZW4sIG5ld0NoaWxkLCBvbGRJbmRleCArIDEpO1xyXG4gICAgICAgIGNvbnN0IGFkZENoaWxkID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgaW5zZXJ0QmVmb3JlRG9tTm9kZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgbGV0IGNoaWxkID0gb2xkQ2hpbGRyZW5bb2xkSW5kZXhdO1xyXG4gICAgICAgICAgICBpZiAoY2hpbGQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBuZXh0SW5kZXggPSBvbGRJbmRleCArIDE7XHJcbiAgICAgICAgICAgICAgICBsZXQgaW5zZXJ0QmVmb3JlQ2hpbGRyZW4gPSBbY2hpbGRdO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGluc2VydEJlZm9yZUNoaWxkcmVuLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc2VydEJlZm9yZSA9IGluc2VydEJlZm9yZUNoaWxkcmVuLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzV05vZGUoaW5zZXJ0QmVmb3JlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlLnJlbmRlcmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRCZWZvcmVDaGlsZHJlbi5wdXNoKC4uLmluc2VydEJlZm9yZS5yZW5kZXJlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRCZWZvcmUuZG9tTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlRG9tTm9kZSA9IGluc2VydEJlZm9yZS5kb21Ob2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydEJlZm9yZUNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiBvbGRDaGlsZHJlbltuZXh0SW5kZXhdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEJlZm9yZUNoaWxkcmVuLnB1c2gob2xkQ2hpbGRyZW5bbmV4dEluZGV4XSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRJbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjcmVhdGVEb20obmV3Q2hpbGQsIHBhcmVudFZOb2RlLCBpbnNlcnRCZWZvcmVEb21Ob2RlLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UpO1xyXG4gICAgICAgICAgICBub2RlQWRkZWQobmV3Q2hpbGQsIHRyYW5zaXRpb25zKTtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXhUb0NoZWNrID0gbmV3SW5kZXg7XHJcbiAgICAgICAgICAgIHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2hlY2tEaXN0aW5ndWlzaGFibGUobmV3Q2hpbGRyZW4sIGluZGV4VG9DaGVjaywgcGFyZW50SW5zdGFuY2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmICghb2xkQ2hpbGQgfHwgZmluZE9sZEluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICBhZGRDaGlsZCgpO1xyXG4gICAgICAgICAgICBuZXdJbmRleCsrO1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVtb3ZlQ2hpbGQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4VG9DaGVjayA9IG9sZEluZGV4O1xyXG4gICAgICAgICAgICBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNoZWNrRGlzdGluZ3Vpc2hhYmxlKG9sZENoaWxkcmVuLCBpbmRleFRvQ2hlY2ssIHBhcmVudEluc3RhbmNlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChpc1dOb2RlKG9sZENoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGluc3RhbmNlTWFwLmdldChvbGRDaGlsZC5pbnN0YW5jZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9sZENoaWxkID0gaXRlbS5kbm9kZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBub2RlVG9SZW1vdmUob2xkQ2hpbGQsIHRyYW5zaXRpb25zLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBmaW5kTmV3SW5kZXggPSBmaW5kSW5kZXhPZkNoaWxkKG5ld0NoaWxkcmVuLCBvbGRDaGlsZCwgbmV3SW5kZXggKyAxKTtcclxuICAgICAgICBpZiAoZmluZE5ld0luZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICByZW1vdmVDaGlsZCgpO1xyXG4gICAgICAgICAgICBvbGRJbmRleCsrO1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYWRkQ2hpbGQoKTtcclxuICAgICAgICByZW1vdmVDaGlsZCgpO1xyXG4gICAgICAgIG9sZEluZGV4Kys7XHJcbiAgICAgICAgbmV3SW5kZXgrKztcclxuICAgIH1cclxuICAgIGlmIChvbGRDaGlsZHJlbkxlbmd0aCA+IG9sZEluZGV4KSB7XHJcbiAgICAgICAgLy8gUmVtb3ZlIGNoaWxkIGZyYWdtZW50c1xyXG4gICAgICAgIGZvciAoaSA9IG9sZEluZGV4OyBpIDwgb2xkQ2hpbGRyZW5MZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleFRvQ2hlY2sgPSBpO1xyXG4gICAgICAgICAgICBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNoZWNrRGlzdGluZ3Vpc2hhYmxlKG9sZENoaWxkcmVuLCBpbmRleFRvQ2hlY2ssIHBhcmVudEluc3RhbmNlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGxldCBjaGlsZFRvUmVtb3ZlID0gb2xkQ2hpbGRyZW5baV07XHJcbiAgICAgICAgICAgIGlmIChpc1dOb2RlKGNoaWxkVG9SZW1vdmUpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gaW5zdGFuY2VNYXAuZ2V0KGNoaWxkVG9SZW1vdmUuaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZFRvUmVtb3ZlID0gaXRlbS5kbm9kZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBub2RlVG9SZW1vdmUoY2hpbGRUb1JlbW92ZSwgdHJhbnNpdGlvbnMsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGV4dFVwZGF0ZWQ7XHJcbn1cclxuZnVuY3Rpb24gYWRkQ2hpbGRyZW4ocGFyZW50Vk5vZGUsIGNoaWxkcmVuLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UsIGluc2VydEJlZm9yZSA9IHVuZGVmaW5lZCwgY2hpbGROb2Rlcykge1xyXG4gICAgaWYgKGNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XHJcbiAgICBpZiAocHJvamVjdG9yU3RhdGUubWVyZ2UgJiYgY2hpbGROb2RlcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgY2hpbGROb2RlcyA9IGFycmF5RnJvbShwYXJlbnRWTm9kZS5kb21Ob2RlLmNoaWxkTm9kZXMpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdHJhbnNpdGlvbnMgPSBwcm9qZWN0aW9uT3B0aW9ucy50cmFuc2l0aW9ucztcclxuICAgIHByb2plY3Rpb25PcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvamVjdGlvbk9wdGlvbnMsIHsgZGVwdGg6IHByb2plY3Rpb25PcHRpb25zLmRlcHRoICsgMSB9KTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xyXG4gICAgICAgIGlmIChpc1ZOb2RlKGNoaWxkKSkge1xyXG4gICAgICAgICAgICBpZiAocHJvamVjdG9yU3RhdGUubWVyZ2UgJiYgY2hpbGROb2Rlcykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGRvbUVsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoY2hpbGQuZG9tTm9kZSA9PT0gdW5kZWZpbmVkICYmIGNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQgPSBjaGlsZE5vZGVzLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbUVsZW1lbnQgJiYgZG9tRWxlbWVudC50YWdOYW1lID09PSAoY2hpbGQudGFnLnRvVXBwZXJDYXNlKCkgfHwgdW5kZWZpbmVkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5kb21Ob2RlID0gZG9tRWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3JlYXRlRG9tKGNoaWxkLCBwYXJlbnRWTm9kZSwgaW5zZXJ0QmVmb3JlLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY3JlYXRlRG9tKGNoaWxkLCBwYXJlbnRWTm9kZSwgaW5zZXJ0QmVmb3JlLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UsIGNoaWxkTm9kZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBub2RlQWRkZWQoY2hpbGQsIHRyYW5zaXRpb25zKTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBpbml0UHJvcGVydGllc0FuZENoaWxkcmVuKGRvbU5vZGUsIGRub2RlLCBwYXJlbnRJbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpIHtcclxuICAgIGFkZENoaWxkcmVuKGRub2RlLCBkbm9kZS5jaGlsZHJlbiwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudEluc3RhbmNlLCB1bmRlZmluZWQpO1xyXG4gICAgaWYgKHR5cGVvZiBkbm9kZS5kZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyAmJiBkbm9kZS5pbnNlcnRlZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgYWRkRGVmZXJyZWRQcm9wZXJ0aWVzKGRub2RlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgICBpZiAoZG5vZGUuYXR0cmlidXRlcyAmJiBkbm9kZS5ldmVudHMpIHtcclxuICAgICAgICB1cGRhdGVBdHRyaWJ1dGVzKGRvbU5vZGUsIHt9LCBkbm9kZS5hdHRyaWJ1dGVzLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgdXBkYXRlUHJvcGVydGllcyhkb21Ob2RlLCB7fSwgZG5vZGUucHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMsIGZhbHNlKTtcclxuICAgICAgICByZW1vdmVPcnBoYW5lZEV2ZW50cyhkb21Ob2RlLCB7fSwgZG5vZGUuZXZlbnRzLCBwcm9qZWN0aW9uT3B0aW9ucywgdHJ1ZSk7XHJcbiAgICAgICAgY29uc3QgZXZlbnRzID0gZG5vZGUuZXZlbnRzO1xyXG4gICAgICAgIE9iamVjdC5rZXlzKGV2ZW50cykuZm9yRWFjaCgoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgdXBkYXRlRXZlbnQoZG9tTm9kZSwgZXZlbnQsIGV2ZW50c1tldmVudF0sIHByb2plY3Rpb25PcHRpb25zLCBkbm9kZS5wcm9wZXJ0aWVzLmJpbmQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdXBkYXRlUHJvcGVydGllcyhkb21Ob2RlLCB7fSwgZG5vZGUucHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgfVxyXG4gICAgaWYgKGRub2RlLnByb3BlcnRpZXMua2V5ICE9PSBudWxsICYmIGRub2RlLnByb3BlcnRpZXMua2V5ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQocGFyZW50SW5zdGFuY2UpO1xyXG4gICAgICAgIGluc3RhbmNlRGF0YS5ub2RlSGFuZGxlci5hZGQoZG9tTm9kZSwgYCR7ZG5vZGUucHJvcGVydGllcy5rZXl9YCk7XHJcbiAgICB9XHJcbiAgICBkbm9kZS5pbnNlcnRlZCA9IHRydWU7XHJcbn1cclxuZnVuY3Rpb24gY3JlYXRlRG9tKGRub2RlLCBwYXJlbnRWTm9kZSwgaW5zZXJ0QmVmb3JlLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UsIGNoaWxkTm9kZXMpIHtcclxuICAgIGxldCBkb21Ob2RlO1xyXG4gICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xyXG4gICAgaWYgKGlzV05vZGUoZG5vZGUpKSB7XHJcbiAgICAgICAgbGV0IHsgd2lkZ2V0Q29uc3RydWN0b3IgfSA9IGRub2RlO1xyXG4gICAgICAgIGNvbnN0IHBhcmVudEluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldChwYXJlbnRJbnN0YW5jZSk7XHJcbiAgICAgICAgaWYgKCFpc1dpZGdldEJhc2VDb25zdHJ1Y3Rvcih3aWRnZXRDb25zdHJ1Y3RvcikpIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHBhcmVudEluc3RhbmNlRGF0YS5yZWdpc3RyeSgpLmdldCh3aWRnZXRDb25zdHJ1Y3Rvcik7XHJcbiAgICAgICAgICAgIGlmIChpdGVtID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgd2lkZ2V0Q29uc3RydWN0b3IgPSBpdGVtO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyB3aWRnZXRDb25zdHJ1Y3RvcigpO1xyXG4gICAgICAgIGRub2RlLmluc3RhbmNlID0gaW5zdGFuY2U7XHJcbiAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKTtcclxuICAgICAgICBpbnN0YW5jZURhdGEuaW52YWxpZGF0ZSA9ICgpID0+IHtcclxuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLmRpcnR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9qZWN0b3JTdGF0ZS5yZW5kZXJRdWV1ZS5wdXNoKHsgaW5zdGFuY2UsIGRlcHRoOiBwcm9qZWN0aW9uT3B0aW9ucy5kZXB0aCB9KTtcclxuICAgICAgICAgICAgICAgIHNjaGVkdWxlUmVuZGVyKHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9IHRydWU7XHJcbiAgICAgICAgaW5zdGFuY2UuX19zZXRDb3JlUHJvcGVydGllc19fKGRub2RlLmNvcmVQcm9wZXJ0aWVzKTtcclxuICAgICAgICBpbnN0YW5jZS5fX3NldENoaWxkcmVuX18oZG5vZGUuY2hpbGRyZW4pO1xyXG4gICAgICAgIGluc3RhbmNlLl9fc2V0UHJvcGVydGllc19fKGRub2RlLnByb3BlcnRpZXMpO1xyXG4gICAgICAgIGNvbnN0IHJlbmRlcmVkID0gaW5zdGFuY2UuX19yZW5kZXJfXygpO1xyXG4gICAgICAgIGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPSBmYWxzZTtcclxuICAgICAgICBpZiAocmVuZGVyZWQpIHtcclxuICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRSZW5kZXJlZCA9IGZpbHRlckFuZERlY29yYXRlQ2hpbGRyZW4ocmVuZGVyZWQsIGluc3RhbmNlKTtcclxuICAgICAgICAgICAgZG5vZGUucmVuZGVyZWQgPSBmaWx0ZXJlZFJlbmRlcmVkO1xyXG4gICAgICAgICAgICBhZGRDaGlsZHJlbihwYXJlbnRWTm9kZSwgZmlsdGVyZWRSZW5kZXJlZCwgcHJvamVjdGlvbk9wdGlvbnMsIGluc3RhbmNlLCBpbnNlcnRCZWZvcmUsIGNoaWxkTm9kZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpbnN0YW5jZU1hcC5zZXQoaW5zdGFuY2UsIHsgZG5vZGUsIHBhcmVudFZOb2RlIH0pO1xyXG4gICAgICAgIGluc3RhbmNlRGF0YS5ub2RlSGFuZGxlci5hZGRSb290KCk7XHJcbiAgICAgICAgcHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MucHVzaCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5vbkF0dGFjaCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKHByb2plY3RvclN0YXRlLm1lcmdlICYmIHByb2plY3RvclN0YXRlLm1lcmdlRWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlID0gcHJvamVjdGlvbk9wdGlvbnMubWVyZ2VFbGVtZW50O1xyXG4gICAgICAgICAgICBwcm9qZWN0b3JTdGF0ZS5tZXJnZUVsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGluaXRQcm9wZXJ0aWVzQW5kQ2hpbGRyZW4oZG9tTm9kZSwgZG5vZGUsIHBhcmVudEluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZG9jID0gcGFyZW50Vk5vZGUuZG9tTm9kZS5vd25lckRvY3VtZW50O1xyXG4gICAgICAgIGlmICghZG5vZGUudGFnICYmIHR5cGVvZiBkbm9kZS50ZXh0ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBpZiAoZG5vZGUuZG9tTm9kZSAhPT0gdW5kZWZpbmVkICYmIHBhcmVudFZOb2RlLmRvbU5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0RvbU5vZGUgPSBkbm9kZS5kb21Ob2RlLm93bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZG5vZGUudGV4dCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50Vk5vZGUuZG9tTm9kZSA9PT0gZG5vZGUuZG9tTm9kZS5wYXJlbnROb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Vk5vZGUuZG9tTm9kZS5yZXBsYWNlQ2hpbGQobmV3RG9tTm9kZSwgZG5vZGUuZG9tTm9kZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRWTm9kZS5kb21Ob2RlLmFwcGVuZENoaWxkKG5ld0RvbU5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRub2RlLmRvbU5vZGUucGFyZW50Tm9kZSAmJiBkbm9kZS5kb21Ob2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZG5vZGUuZG9tTm9kZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkbm9kZS5kb21Ob2RlID0gbmV3RG9tTm9kZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlID0gZG9jLmNyZWF0ZVRleHROb2RlKGRub2RlLnRleHQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGluc2VydEJlZm9yZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Vk5vZGUuZG9tTm9kZS5pbnNlcnRCZWZvcmUoZG9tTm9kZSwgaW5zZXJ0QmVmb3JlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFZOb2RlLmRvbU5vZGUuYXBwZW5kQ2hpbGQoZG9tTm9kZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChkbm9kZS5kb21Ob2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChkbm9kZS50YWcgPT09ICdzdmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9qZWN0aW9uT3B0aW9ucywgeyBuYW1lc3BhY2U6IE5BTUVTUEFDRV9TVkcgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvamVjdGlvbk9wdGlvbnMubmFtZXNwYWNlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBkb21Ob2RlID0gZG5vZGUuZG9tTm9kZSA9IGRvYy5jcmVhdGVFbGVtZW50TlMocHJvamVjdGlvbk9wdGlvbnMubmFtZXNwYWNlLCBkbm9kZS50YWcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9tTm9kZSA9IGRub2RlLmRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlIHx8IGRvYy5jcmVhdGVFbGVtZW50KGRub2RlLnRhZyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkb21Ob2RlID0gZG5vZGUuZG9tTm9kZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpbml0UHJvcGVydGllc0FuZENoaWxkcmVuKGRvbU5vZGUsIGRub2RlLCBwYXJlbnRJbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudFZOb2RlLmRvbU5vZGUuaW5zZXJ0QmVmb3JlKGRvbU5vZGUsIGluc2VydEJlZm9yZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZG9tTm9kZS5wYXJlbnROb2RlICE9PSBwYXJlbnRWTm9kZS5kb21Ob2RlKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRWTm9kZS5kb21Ob2RlLmFwcGVuZENoaWxkKGRvbU5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHVwZGF0ZURvbShwcmV2aW91cywgZG5vZGUsIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRWTm9kZSwgcGFyZW50SW5zdGFuY2UpIHtcclxuICAgIGlmIChpc1dOb2RlKGRub2RlKSkge1xyXG4gICAgICAgIGNvbnN0IHsgaW5zdGFuY2UgfSA9IHByZXZpb3VzO1xyXG4gICAgICAgIGNvbnN0IHsgcGFyZW50Vk5vZGUsIGRub2RlOiBub2RlIH0gPSBpbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpO1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzUmVuZGVyZWQgPSBub2RlID8gbm9kZS5yZW5kZXJlZCA6IHByZXZpb3VzLnJlbmRlcmVkO1xyXG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldChpbnN0YW5jZSk7XHJcbiAgICAgICAgaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9IHRydWU7XHJcbiAgICAgICAgaW5zdGFuY2UuX19zZXRDb3JlUHJvcGVydGllc19fKGRub2RlLmNvcmVQcm9wZXJ0aWVzKTtcclxuICAgICAgICBpbnN0YW5jZS5fX3NldENoaWxkcmVuX18oZG5vZGUuY2hpbGRyZW4pO1xyXG4gICAgICAgIGluc3RhbmNlLl9fc2V0UHJvcGVydGllc19fKGRub2RlLnByb3BlcnRpZXMpO1xyXG4gICAgICAgIGRub2RlLmluc3RhbmNlID0gaW5zdGFuY2U7XHJcbiAgICAgICAgaWYgKGluc3RhbmNlRGF0YS5kaXJ0eSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBjb25zdCByZW5kZXJlZCA9IGluc3RhbmNlLl9fcmVuZGVyX18oKTtcclxuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBkbm9kZS5yZW5kZXJlZCA9IGZpbHRlckFuZERlY29yYXRlQ2hpbGRyZW4ocmVuZGVyZWQsIGluc3RhbmNlKTtcclxuICAgICAgICAgICAgdXBkYXRlQ2hpbGRyZW4ocGFyZW50Vk5vZGUsIHByZXZpb3VzUmVuZGVyZWQsIGRub2RlLnJlbmRlcmVkLCBpbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBkbm9kZS5yZW5kZXJlZCA9IHByZXZpb3VzUmVuZGVyZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGluc3RhbmNlTWFwLnNldChpbnN0YW5jZSwgeyBkbm9kZSwgcGFyZW50Vk5vZGUgfSk7XHJcbiAgICAgICAgaW5zdGFuY2VEYXRhLm5vZGVIYW5kbGVyLmFkZFJvb3QoKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChwcmV2aW91cyA9PT0gZG5vZGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkb21Ob2RlID0gKGRub2RlLmRvbU5vZGUgPSBwcmV2aW91cy5kb21Ob2RlKTtcclxuICAgICAgICBsZXQgdGV4dFVwZGF0ZWQgPSBmYWxzZTtcclxuICAgICAgICBsZXQgdXBkYXRlZCA9IGZhbHNlO1xyXG4gICAgICAgIGlmICghZG5vZGUudGFnICYmIHR5cGVvZiBkbm9kZS50ZXh0ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBpZiAoZG5vZGUudGV4dCAhPT0gcHJldmlvdXMudGV4dCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3RG9tTm9kZSA9IGRvbU5vZGUub3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkbm9kZS50ZXh0KTtcclxuICAgICAgICAgICAgICAgIGRvbU5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobmV3RG9tTm9kZSwgZG9tTm9kZSk7XHJcbiAgICAgICAgICAgICAgICBkbm9kZS5kb21Ob2RlID0gbmV3RG9tTm9kZTtcclxuICAgICAgICAgICAgICAgIHRleHRVcGRhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0VXBkYXRlZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGRub2RlLnRhZyAmJiBkbm9kZS50YWcubGFzdEluZGV4T2YoJ3N2ZycsIDApID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9qZWN0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHByb2plY3Rpb25PcHRpb25zLCB7IG5hbWVzcGFjZTogTkFNRVNQQUNFX1NWRyB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocHJldmlvdXMuY2hpbGRyZW4gIT09IGRub2RlLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGZpbHRlckFuZERlY29yYXRlQ2hpbGRyZW4oZG5vZGUuY2hpbGRyZW4sIHBhcmVudEluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgIGRub2RlLmNoaWxkcmVuID0gY2hpbGRyZW47XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVkID1cclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlbihkbm9kZSwgcHJldmlvdXMuY2hpbGRyZW4sIGNoaWxkcmVuLCBwYXJlbnRJbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpIHx8IHVwZGF0ZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNQcm9wZXJ0aWVzID0gYnVpbGRQcmV2aW91c1Byb3BlcnRpZXMoZG9tTm9kZSwgcHJldmlvdXMsIGRub2RlKTtcclxuICAgICAgICAgICAgaWYgKGRub2RlLmF0dHJpYnV0ZXMgJiYgZG5vZGUuZXZlbnRzKSB7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVBdHRyaWJ1dGVzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcy5hdHRyaWJ1dGVzLCBkbm9kZS5hdHRyaWJ1dGVzLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVkID1cclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVQcm9wZXJ0aWVzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcy5wcm9wZXJ0aWVzLCBkbm9kZS5wcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucywgZmFsc2UpIHx8IHVwZGF0ZWQ7XHJcbiAgICAgICAgICAgICAgICByZW1vdmVPcnBoYW5lZEV2ZW50cyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMuZXZlbnRzLCBkbm9kZS5ldmVudHMsIHByb2plY3Rpb25PcHRpb25zLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IGRub2RlLmV2ZW50cztcclxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGV2ZW50cykuZm9yRWFjaCgoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVFdmVudChkb21Ob2RlLCBldmVudCwgZXZlbnRzW2V2ZW50XSwgcHJvamVjdGlvbk9wdGlvbnMsIGRub2RlLnByb3BlcnRpZXMuYmluZCwgcHJldmlvdXNQcm9wZXJ0aWVzLmV2ZW50c1tldmVudF0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVkID1cclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVQcm9wZXJ0aWVzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcy5wcm9wZXJ0aWVzLCBkbm9kZS5wcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucykgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZG5vZGUucHJvcGVydGllcy5rZXkgIT09IG51bGwgJiYgZG5vZGUucHJvcGVydGllcy5rZXkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHBhcmVudEluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgIGluc3RhbmNlRGF0YS5ub2RlSGFuZGxlci5hZGQoZG9tTm9kZSwgYCR7ZG5vZGUucHJvcGVydGllcy5rZXl9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHVwZGF0ZWQgJiYgZG5vZGUucHJvcGVydGllcyAmJiBkbm9kZS5wcm9wZXJ0aWVzLnVwZGF0ZUFuaW1hdGlvbikge1xyXG4gICAgICAgICAgICBkbm9kZS5wcm9wZXJ0aWVzLnVwZGF0ZUFuaW1hdGlvbihkb21Ob2RlLCBkbm9kZS5wcm9wZXJ0aWVzLCBwcmV2aW91cy5wcm9wZXJ0aWVzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gYWRkRGVmZXJyZWRQcm9wZXJ0aWVzKHZub2RlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgLy8gdHJhbnNmZXIgYW55IHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gcGFzc2VkIC0gYXMgdGhlc2UgbXVzdCBiZSBkZWNvcmF0ZWQgcHJvcGVydGllc1xyXG4gICAgdm5vZGUuZGVjb3JhdGVkRGVmZXJyZWRQcm9wZXJ0aWVzID0gdm5vZGUucHJvcGVydGllcztcclxuICAgIGNvbnN0IHByb3BlcnRpZXMgPSB2bm9kZS5kZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayghIXZub2RlLmluc2VydGVkKTtcclxuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgIHZub2RlLnByb3BlcnRpZXMgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9wZXJ0aWVzLCB2bm9kZS5kZWNvcmF0ZWREZWZlcnJlZFByb3BlcnRpZXMpO1xyXG4gICAgcHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3MucHVzaCgoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oe30sIHZub2RlLmRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrKCEhdm5vZGUuaW5zZXJ0ZWQpLCB2bm9kZS5kZWNvcmF0ZWREZWZlcnJlZFByb3BlcnRpZXMpO1xyXG4gICAgICAgIHVwZGF0ZVByb3BlcnRpZXModm5vZGUuZG9tTm9kZSwgdm5vZGUucHJvcGVydGllcywgcHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIHZub2RlLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xyXG4gICAgfSk7XHJcbn1cclxuZnVuY3Rpb24gcnVuRGVmZXJyZWRSZW5kZXJDYWxsYmFja3MocHJvamVjdGlvbk9wdGlvbnMpIHtcclxuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgIGlmIChwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcclxuICAgICAgICBpZiAocHJvamVjdGlvbk9wdGlvbnMuc3luYykge1xyXG4gICAgICAgICAgICB3aGlsZSAocHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBnbG9iYWwucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHJ1bkFmdGVyUmVuZGVyQ2FsbGJhY2tzKHByb2plY3Rpb25PcHRpb25zKSB7XHJcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XHJcbiAgICBpZiAocHJvamVjdGlvbk9wdGlvbnMuc3luYykge1xyXG4gICAgICAgIHdoaWxlIChwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5zaGlmdCgpO1xyXG4gICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChnbG9iYWwucmVxdWVzdElkbGVDYWxsYmFjaykge1xyXG4gICAgICAgICAgICBnbG9iYWwucmVxdWVzdElkbGVDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAocHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5zaGlmdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAocHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5zaGlmdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBzY2hlZHVsZVJlbmRlcihwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xyXG4gICAgaWYgKHByb2plY3Rpb25PcHRpb25zLnN5bmMpIHtcclxuICAgICAgICByZW5kZXIocHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAocHJvamVjdG9yU3RhdGUucmVuZGVyU2NoZWR1bGVkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBwcm9qZWN0b3JTdGF0ZS5yZW5kZXJTY2hlZHVsZWQgPSBnbG9iYWwucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgcmVuZGVyKHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiByZW5kZXIocHJvamVjdGlvbk9wdGlvbnMpIHtcclxuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgIHByb2plY3RvclN0YXRlLnJlbmRlclNjaGVkdWxlZCA9IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IHJlbmRlclF1ZXVlID0gcHJvamVjdG9yU3RhdGUucmVuZGVyUXVldWU7XHJcbiAgICBjb25zdCByZW5kZXJzID0gWy4uLnJlbmRlclF1ZXVlXTtcclxuICAgIHByb2plY3RvclN0YXRlLnJlbmRlclF1ZXVlID0gW107XHJcbiAgICByZW5kZXJzLnNvcnQoKGEsIGIpID0+IGEuZGVwdGggLSBiLmRlcHRoKTtcclxuICAgIGNvbnN0IHByZXZpb3VzbHlSZW5kZXJlZCA9IFtdO1xyXG4gICAgd2hpbGUgKHJlbmRlcnMubGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgeyBpbnN0YW5jZSB9ID0gcmVuZGVycy5zaGlmdCgpO1xyXG4gICAgICAgIGlmIChpbnN0YW5jZU1hcC5oYXMoaW5zdGFuY2UpICYmIHByZXZpb3VzbHlSZW5kZXJlZC5pbmRleE9mKGluc3RhbmNlKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgcHJldmlvdXNseVJlbmRlcmVkLnB1c2goaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICBjb25zdCB7IHBhcmVudFZOb2RlLCBkbm9kZSB9ID0gaW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKTtcclxuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKTtcclxuICAgICAgICAgICAgdXBkYXRlRG9tKGRub2RlLCB0b0ludGVybmFsV05vZGUoaW5zdGFuY2UsIGluc3RhbmNlRGF0YSksIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRWTm9kZSwgaW5zdGFuY2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJ1bkFmdGVyUmVuZGVyQ2FsbGJhY2tzKHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgIHJ1bkRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzKHByb2plY3Rpb25PcHRpb25zKTtcclxufVxyXG5leHBvcnQgY29uc3QgZG9tID0ge1xyXG4gICAgYXBwZW5kOiBmdW5jdGlvbiAocGFyZW50Tm9kZSwgaW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zID0ge30pIHtcclxuICAgICAgICBjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpO1xyXG4gICAgICAgIGNvbnN0IGZpbmFsUHJvamVjdG9yT3B0aW9ucyA9IGdldFByb2plY3Rpb25PcHRpb25zKHByb2plY3Rpb25PcHRpb25zLCBpbnN0YW5jZSk7XHJcbiAgICAgICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGFmdGVyUmVuZGVyQ2FsbGJhY2tzOiBbXSxcclxuICAgICAgICAgICAgZGVmZXJyZWRSZW5kZXJDYWxsYmFja3M6IFtdLFxyXG4gICAgICAgICAgICBub2RlTWFwOiBuZXcgV2Vha01hcCgpLFxyXG4gICAgICAgICAgICByZW5kZXJTY2hlZHVsZWQ6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgcmVuZGVyUXVldWU6IFtdLFxyXG4gICAgICAgICAgICBtZXJnZTogcHJvamVjdGlvbk9wdGlvbnMubWVyZ2UgfHwgZmFsc2UsXHJcbiAgICAgICAgICAgIG1lcmdlRWxlbWVudDogcHJvamVjdGlvbk9wdGlvbnMubWVyZ2VFbGVtZW50XHJcbiAgICAgICAgfTtcclxuICAgICAgICBwcm9qZWN0b3JTdGF0ZU1hcC5zZXQoaW5zdGFuY2UsIHByb2plY3RvclN0YXRlKTtcclxuICAgICAgICBmaW5hbFByb2plY3Rvck9wdGlvbnMucm9vdE5vZGUgPSBwYXJlbnROb2RlO1xyXG4gICAgICAgIGNvbnN0IHBhcmVudFZOb2RlID0gdG9QYXJlbnRWTm9kZShmaW5hbFByb2plY3Rvck9wdGlvbnMucm9vdE5vZGUpO1xyXG4gICAgICAgIGNvbnN0IG5vZGUgPSB0b0ludGVybmFsV05vZGUoaW5zdGFuY2UsIGluc3RhbmNlRGF0YSk7XHJcbiAgICAgICAgaW5zdGFuY2VNYXAuc2V0KGluc3RhbmNlLCB7IGRub2RlOiBub2RlLCBwYXJlbnRWTm9kZSB9KTtcclxuICAgICAgICBpbnN0YW5jZURhdGEuaW52YWxpZGF0ZSA9ICgpID0+IHtcclxuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLmRpcnR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9qZWN0b3JTdGF0ZS5yZW5kZXJRdWV1ZS5wdXNoKHsgaW5zdGFuY2UsIGRlcHRoOiBmaW5hbFByb2plY3Rvck9wdGlvbnMuZGVwdGggfSk7XHJcbiAgICAgICAgICAgICAgICBzY2hlZHVsZVJlbmRlcihmaW5hbFByb2plY3Rvck9wdGlvbnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB1cGRhdGVEb20obm9kZSwgbm9kZSwgZmluYWxQcm9qZWN0b3JPcHRpb25zLCBwYXJlbnRWTm9kZSwgaW5zdGFuY2UpO1xyXG4gICAgICAgIHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xyXG4gICAgICAgICAgICBpbnN0YW5jZURhdGEub25BdHRhY2goKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBydW5EZWZlcnJlZFJlbmRlckNhbGxiYWNrcyhmaW5hbFByb2plY3Rvck9wdGlvbnMpO1xyXG4gICAgICAgIHJ1bkFmdGVyUmVuZGVyQ2FsbGJhY2tzKGZpbmFsUHJvamVjdG9yT3B0aW9ucyk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZG9tTm9kZTogZmluYWxQcm9qZWN0b3JPcHRpb25zLnJvb3ROb2RlXHJcbiAgICAgICAgfTtcclxuICAgIH0sXHJcbiAgICBjcmVhdGU6IGZ1bmN0aW9uIChpbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksIGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICB9LFxyXG4gICAgbWVyZ2U6IGZ1bmN0aW9uIChlbGVtZW50LCBpbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIHByb2plY3Rpb25PcHRpb25zLm1lcmdlID0gdHJ1ZTtcclxuICAgICAgICBwcm9qZWN0aW9uT3B0aW9ucy5tZXJnZUVsZW1lbnQgPSBlbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24gPSB0aGlzLmFwcGVuZChlbGVtZW50LnBhcmVudE5vZGUsIGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQoaW5zdGFuY2UpO1xyXG4gICAgICAgIHByb2plY3RvclN0YXRlLm1lcmdlID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIHByb2plY3Rpb247XHJcbiAgICB9XHJcbn07XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZkb20ubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL3Zkb20ubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS92ZG9tLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsIi8qKiogSU1QT1JUUyBGUk9NIGltcG9ydHMtbG9hZGVyICoqKi9cbnZhciB3aWRnZXRGYWN0b3J5ID0gcmVxdWlyZShcInNyYy9tZW51LWl0ZW0vTWVudUl0ZW1cIik7XG5cbnZhciByZWdpc3RlckN1c3RvbUVsZW1lbnQgPSByZXF1aXJlKCdAZG9qby93aWRnZXQtY29yZS9yZWdpc3RlckN1c3RvbUVsZW1lbnQnKS5kZWZhdWx0O1xyXG5cclxudmFyIGRlZmF1bHRFeHBvcnQgPSB3aWRnZXRGYWN0b3J5LmRlZmF1bHQ7XHJcbmRlZmF1bHRFeHBvcnQgJiYgcmVnaXN0ZXJDdXN0b21FbGVtZW50KGRlZmF1bHRFeHBvcnQpO1xyXG5cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2ltcG9ydHMtbG9hZGVyP3dpZGdldEZhY3Rvcnk9c3JjL21lbnUtaXRlbS9NZW51SXRlbSEuL25vZGVfbW9kdWxlcy9AZG9qby9jbGktYnVpbGQtd2lkZ2V0L3RlbXBsYXRlL2N1c3RvbS1lbGVtZW50LmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9pbXBvcnRzLWxvYWRlci9pbmRleC5qcz93aWRnZXRGYWN0b3J5PXNyYy9tZW51LWl0ZW0vTWVudUl0ZW0hLi9ub2RlX21vZHVsZXMvQGRvam8vY2xpLWJ1aWxkLXdpZGdldC90ZW1wbGF0ZS9jdXN0b20tZWxlbWVudC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXHJcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXHJcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcblxyXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXHJcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcclxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcclxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cclxuXHJcblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xyXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIGlmIChlLmluZGV4T2YocFtpXSkgPCAwKVxyXG4gICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHJlc3VsdC52YWx1ZSk7IH0pLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0geVtvcFswXSAmIDIgPyBcInJldHVyblwiIDogb3BbMF0gPyBcInRocm93XCIgOiBcIm5leHRcIl0pICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gWzAsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBleHBvcnRzKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmICghZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7ICB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAob1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpIHx8ICgxLGV2YWwpKFwidGhpc1wiKTtcbn0gY2F0Y2goZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZih0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKVxuXHRcdGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vICh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvd2VicGFjay9idWlsZGluL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCB7IHYgfSBmcm9tICdAZG9qby93aWRnZXQtY29yZS9kJztcclxuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvY3VzdG9tRWxlbWVudCc7XHJcbmltcG9ydCB7IFdpZGdldFByb3BlcnRpZXMgfSBmcm9tICdAZG9qby93aWRnZXQtY29yZS9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgdGhlbWUsIFRoZW1lZE1peGluIH0gZnJvbSAnQGRvam8vd2lkZ2V0LWNvcmUvbWl4aW5zL1RoZW1lZCc7XHJcbmltcG9ydCB7IFdpZGdldEJhc2UgfSBmcm9tICdAZG9qby93aWRnZXQtY29yZS9XaWRnZXRCYXNlJztcclxuXHJcbmltcG9ydCAqIGFzIGNzcyBmcm9tICcuL21lbnVJdGVtLm0uY3NzJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVudUl0ZW1Qcm9wZXJ0aWVzIGV4dGVuZHMgV2lkZ2V0UHJvcGVydGllcyB7XHJcblx0dGl0bGU6IHN0cmluZztcclxuXHRzZWxlY3RlZD86IGJvb2xlYW47XHJcblx0ZGF0YT86IGFueTtcclxuXHRvblNlbGVjdGVkPzogKGRhdGE6IGFueSkgPT4gdm9pZDtcclxufVxyXG5cclxuQGN1c3RvbUVsZW1lbnQ8TWVudUl0ZW1Qcm9wZXJ0aWVzPih7XHJcblx0dGFnOiAnZGVtby1tZW51LWl0ZW0nLFxyXG5cdGF0dHJpYnV0ZXM6IFsndGl0bGUnLCAnc2VsZWN0ZWQnXSxcclxuXHRldmVudHM6IFsnb25TZWxlY3RlZCddLFxyXG5cdHByb3BlcnRpZXM6IFsnZGF0YScsICdzZWxlY3RlZCddXHJcbn0pXHJcbkB0aGVtZShjc3MpXHJcbmV4cG9ydCBjbGFzcyBNZW51SXRlbSBleHRlbmRzIFRoZW1lZE1peGluKFdpZGdldEJhc2UpPE1lbnVJdGVtUHJvcGVydGllcz4ge1xyXG5cdHByaXZhdGUgX29uQ2xpY2soKSB7XHJcblx0XHR0aGlzLnByb3BlcnRpZXMub25TZWxlY3RlZCAmJiB0aGlzLnByb3BlcnRpZXMub25TZWxlY3RlZCh0aGlzLnByb3BlcnRpZXMuZGF0YSk7XHJcblx0fVxyXG5cclxuXHRwcm90ZWN0ZWQgcmVuZGVyKCkge1xyXG5cdFx0Y29uc3QgeyB0aXRsZSwgc2VsZWN0ZWQgfSA9IHRoaXMucHJvcGVydGllcztcclxuXHJcblx0XHRyZXR1cm4gdignbGknLCB7IGNsYXNzZXM6IHRoaXMudGhlbWUoY3NzLnJvb3QpIH0sIFtcclxuXHRcdFx0dihcclxuXHRcdFx0XHQnc3BhbicsXHJcblx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0Y2xhc3NlczogdGhpcy50aGVtZShbY3NzLml0ZW0sIHNlbGVjdGVkID8gY3NzLnNlbGVjdGVkIDogbnVsbF0pLFxyXG5cdFx0XHRcdFx0b25jbGljazogdGhpcy5fb25DbGlja1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0W3RpdGxlXVxyXG5cdFx0XHQpXHJcblx0XHRdKTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE1lbnVJdGVtO1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZHRzLWxvYWRlcj90eXBlPXRzJmluc3RhbmNlTmFtZT0wX21lbnUtaXRlbSEuL3NyYy9tZW51LWl0ZW0vTWVudUl0ZW0udHMiLCIvLyByZW1vdmVkIGJ5IGV4dHJhY3QtdGV4dC13ZWJwYWNrLXBsdWdpblxubW9kdWxlLmV4cG9ydHMgPSB7XCIgX2tleVwiOlwidGVzdC1hcHAvbWVudUl0ZW1cIixcInJvb3RcIjpcIm1lbnVJdGVtLW1fX3Jvb3RfX3NVbVVpXCIsXCJpdGVtXCI6XCJtZW51SXRlbS1tX19pdGVtX18yTWs2UlwiLFwic2VsZWN0ZWRcIjpcIm1lbnVJdGVtLW1fX3NlbGVjdGVkX18xLWYzSVwifTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9tZW51LWl0ZW0vbWVudUl0ZW0ubS5jc3Ncbi8vIG1vZHVsZSBpZCA9IC4vc3JjL21lbnUtaXRlbS9tZW51SXRlbS5tLmNzc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgNTgxYzA3YWNjZGZjNTAwY2U0MzgiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9jb3JlL0Rlc3Ryb3lhYmxlLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL2NvcmUvRXZlbnRlZC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9jb3JlL2xhbmcubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvaGFzL2hhcy5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL01hcC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL1Byb21pc2UubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9TeW1ib2wubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9XZWFrTWFwLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vYXJyYXkubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9nbG9iYWwubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9pdGVyYXRvci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL251bWJlci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL29iamVjdC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL3N0cmluZy5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL3N1cHBvcnQvaGFzLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vc3VwcG9ydC9xdWV1ZS5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL3N1cHBvcnQvdXRpbC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9JbmplY3Rvci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9Ob2RlSGFuZGxlci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9SZWdpc3RyeS5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9SZWdpc3RyeUhhbmRsZXIubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvV2lkZ2V0QmFzZS5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9hbmltYXRpb25zL2Nzc1RyYW5zaXRpb25zLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2QubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9hZnRlclJlbmRlci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2Fsd2F5c1JlbmRlci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2JlZm9yZVByb3BlcnRpZXMubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9jdXN0b21FbGVtZW50Lm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvZGlmZlByb3BlcnR5Lm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaGFuZGxlRGVjb3JhdG9yLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaW5qZWN0Lm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RpZmYubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvbWl4aW5zL1Byb2plY3Rvci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9taXhpbnMvVGhlbWVkLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL3JlZ2lzdGVyQ3VzdG9tRWxlbWVudC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS92ZG9tLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vY2xpLWJ1aWxkLXdpZGdldC90ZW1wbGF0ZS9jdXN0b20tZWxlbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbWVudS1pdGVtL01lbnVJdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9tZW51LWl0ZW0vbWVudUl0ZW0ubS5jc3M/NmE5NSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUFzRCwrREFBK0Q7O0FBRXJIO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7QUM3RGdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEIsaUJBQWlCLE9BQU87QUFDeEI7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvQkFBb0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQSx3Qzs7Ozs7Ozs7Ozs7QUN2REE7QUFDc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsZ0NBQWdDO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2RWlCO0FBQ0E7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiwyQkFBMkI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLG9CQUFvQjtBQUMzQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsaUM7Ozs7Ozs7Ozs7OztBQ25NQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLE9BQU8saUJBQWlCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QkFBMkIsTUFBTTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QixxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7Ozs7O0FDdE1BO0FBQ0E7QUFDNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsSUFBSTtBQUNwQixnQkFBZ0IsT0FBTztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxJQUFJO0FBQ2hCLFlBQVksVUFBVTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxtQzs7Ozs7Ozs7Ozs7OztBQ2hKQTtBQUNzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxxQkFBcUI7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGdDQUFnQztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlHQTtBQUNrQztBQUNQO0FBQzNCO0FBQ3FCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3RELG9EQUFvRDtBQUNwRCxpREFBaUQ7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRUFBcUU7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsc0JBQXNCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFlBQVk7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLFNBQVM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0M7Ozs7Ozs7O0FDdlBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG1DOzs7Ozs7Ozs7Ozs7Ozs7QUNqQkE7QUFDaUQ7QUFDakQsb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDOzs7Ozs7Ozs7Ozs7O0FDOUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyREE7QUFDQTtBQUNtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0Q7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLElBQUk7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlHQTtBQUNBO0FBQ3FCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELFlBQVk7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RkFBd0Y7QUFDeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DOzs7Ozs7Ozs7OztBQ3hTbUI7QUFDbkI7MEVBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsRUFBRTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCxFQUFFO0FBQ2pFLG1DQUFtQyxtQkFBbUI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxnQzs7Ozs7Ozs7Ozs7QUNyS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFBQTtBQUFBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4RUFBOEU7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFBQTtBQUFBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsZ0NBQWdDLG1CQUFtQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxrQzs7Ozs7Ozs7O0FDekxBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQzs7Ozs7Ozs7O0FDdEJrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQSxxQzs7Ozs7Ozs7Ozs7QUNwQmtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNB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QUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsc0JBQXNCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFVBQVU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2THRDO0FBQUE7QUFDQTtBQUNBLCtEQUErRDtBQUMvRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFB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LENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVTLE1BQU07UUFDZixNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFFNUMsTUFBTSxDQUFDLGdGQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMscURBQVEsQ0FBQyxFQUFFLEVBQUU7WUFDakQsZ0ZBQUMsQ0FDQSxNQUFNLEVBQ047Z0JBQ0MsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxxREFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMseURBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQy9ELE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUTthQUN0QixFQUNELENBQUMsS0FBSyxDQUFDLENBQ1A7U0FDRCxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0Q7QUFuQlksUUFBUTtJQVBwQixtSEFBYSxDQUFxQjtRQUNsQyxHQUFHLEVBQUUsZ0JBQWdCO1FBQ3JCLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUM7UUFDakMsTUFBTSxFQUFFLENBQUMsWUFBWSxDQUFDO1FBQ3RCLFVBQVUsRUFBRSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUM7S0FDaEMsQ0FBQztJQUNELGdHQUFLLENBQUMsNkNBQUcsQ0FBQztHQUNFLFFBQVEsQ0FtQnBCO0FBbkJvQjtBQXFCckIsK0RBQWUsUUFBUSxFQUFDOzs7Ozs7OztBQzNDeEI7QUFDQSxrQkFBa0Isd0kiLCJmaWxlIjoibWVudS1pdGVtLTEuMC4wLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgNTgxYzA3YWNjZGZjNTAwY2U0MzgiLCJpbXBvcnQgeyBjcmVhdGVDb21wb3NpdGVIYW5kbGUgfSBmcm9tICcuL2xhbmcnO1xuaW1wb3J0IFByb21pc2UgZnJvbSAnLi4vc2hpbS9Qcm9taXNlJztcbi8qKlxuICogTm8gb3BlcmF0aW9uIGZ1bmN0aW9uIHRvIHJlcGxhY2Ugb3duIG9uY2UgaW5zdGFuY2UgaXMgZGVzdG9yeWVkXG4gKi9cbmZ1bmN0aW9uIG5vb3AoKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG59XG4vKipcbiAqIE5vIG9wIGZ1bmN0aW9uIHVzZWQgdG8gcmVwbGFjZSBvd24sIG9uY2UgaW5zdGFuY2UgaGFzIGJlZW4gZGVzdG9yeWVkXG4gKi9cbmZ1bmN0aW9uIGRlc3Ryb3llZCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbGwgbWFkZSB0byBkZXN0cm95ZWQgbWV0aG9kJyk7XG59XG5leHBvcnQgY2xhc3MgRGVzdHJveWFibGUge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmhhbmRsZXMgPSBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgaGFuZGxlcyBmb3IgdGhlIGluc3RhbmNlIHRoYXQgd2lsbCBiZSBkZXN0cm95ZWQgd2hlbiBgdGhpcy5kZXN0cm95YCBpcyBjYWxsZWRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SGFuZGxlfSBoYW5kbGUgVGhlIGhhbmRsZSB0byBhZGQgZm9yIHRoZSBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtIYW5kbGV9IGEgaGFuZGxlIGZvciB0aGUgaGFuZGxlLCByZW1vdmVzIHRoZSBoYW5kbGUgZm9yIHRoZSBpbnN0YW5jZSBhbmQgY2FsbHMgZGVzdHJveVxuICAgICAqL1xuICAgIG93bihoYW5kbGVzKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZSA9IEFycmF5LmlzQXJyYXkoaGFuZGxlcykgPyBjcmVhdGVDb21wb3NpdGVIYW5kbGUoLi4uaGFuZGxlcykgOiBoYW5kbGVzO1xuICAgICAgICBjb25zdCB7IGhhbmRsZXM6IF9oYW5kbGVzIH0gPSB0aGlzO1xuICAgICAgICBfaGFuZGxlcy5wdXNoKGhhbmRsZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZXN0cm95KCkge1xuICAgICAgICAgICAgICAgIF9oYW5kbGVzLnNwbGljZShfaGFuZGxlcy5pbmRleE9mKGhhbmRsZSkpO1xuICAgICAgICAgICAgICAgIGhhbmRsZS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlc3RycHlzIGFsbCBoYW5kZXJzIHJlZ2lzdGVyZWQgZm9yIHRoZSBpbnN0YW5jZVxuICAgICAqXG4gICAgICogQHJldHVybnMge1Byb21pc2U8YW55fSBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIGFsbCBoYW5kbGVzIGhhdmUgYmVlbiBkZXN0cm95ZWRcbiAgICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlcy5mb3JFYWNoKChoYW5kbGUpID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGUgJiYgaGFuZGxlLmRlc3Ryb3kgJiYgaGFuZGxlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95ID0gbm9vcDtcbiAgICAgICAgICAgIHRoaXMub3duID0gZGVzdHJveWVkO1xuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgRGVzdHJveWFibGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZXN0cm95YWJsZS5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL2NvcmUvRGVzdHJveWFibGUubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvY29yZS9EZXN0cm95YWJsZS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgTWFwIGZyb20gJy4uL3NoaW0vTWFwJztcclxuaW1wb3J0IHsgRGVzdHJveWFibGUgfSBmcm9tICcuL0Rlc3Ryb3lhYmxlJztcclxuLyoqXHJcbiAqIE1hcCBvZiBjb21wdXRlZCByZWd1bGFyIGV4cHJlc3Npb25zLCBrZXllZCBieSBzdHJpbmdcclxuICovXHJcbmNvbnN0IHJlZ2V4TWFwID0gbmV3IE1hcCgpO1xyXG4vKipcclxuICogRGV0ZXJtaW5lcyBpcyB0aGUgZXZlbnQgdHlwZSBnbG9iIGhhcyBiZWVuIG1hdGNoZWRcclxuICpcclxuICogQHJldHVybnMgYm9vbGVhbiB0aGF0IGluZGljYXRlcyBpZiB0aGUgZ2xvYiBpcyBtYXRjaGVkXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNHbG9iTWF0Y2goZ2xvYlN0cmluZywgdGFyZ2V0U3RyaW5nKSB7XHJcbiAgICBpZiAodHlwZW9mIHRhcmdldFN0cmluZyA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIGdsb2JTdHJpbmcgPT09ICdzdHJpbmcnICYmIGdsb2JTdHJpbmcuaW5kZXhPZignKicpICE9PSAtMSkge1xyXG4gICAgICAgIGxldCByZWdleDtcclxuICAgICAgICBpZiAocmVnZXhNYXAuaGFzKGdsb2JTdHJpbmcpKSB7XHJcbiAgICAgICAgICAgIHJlZ2V4ID0gcmVnZXhNYXAuZ2V0KGdsb2JTdHJpbmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmVnZXggPSBuZXcgUmVnRXhwKGBeJHtnbG9iU3RyaW5nLnJlcGxhY2UoL1xcKi9nLCAnLionKX0kYCk7XHJcbiAgICAgICAgICAgIHJlZ2V4TWFwLnNldChnbG9iU3RyaW5nLCByZWdleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZWdleC50ZXN0KHRhcmdldFN0cmluZyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gZ2xvYlN0cmluZyA9PT0gdGFyZ2V0U3RyaW5nO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBFdmVudCBDbGFzc1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEV2ZW50ZWQgZXh0ZW5kcyBEZXN0cm95YWJsZSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIG1hcCBvZiBsaXN0ZW5lcnMga2V5ZWQgYnkgZXZlbnQgdHlwZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubGlzdGVuZXJzTWFwID0gbmV3IE1hcCgpO1xyXG4gICAgfVxyXG4gICAgZW1pdChldmVudCkge1xyXG4gICAgICAgIHRoaXMubGlzdGVuZXJzTWFwLmZvckVhY2goKG1ldGhvZHMsIHR5cGUpID0+IHtcclxuICAgICAgICAgICAgaWYgKGlzR2xvYk1hdGNoKHR5cGUsIGV2ZW50LnR5cGUpKSB7XHJcbiAgICAgICAgICAgICAgICBbLi4ubWV0aG9kc10uZm9yRWFjaCgobWV0aG9kKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmNhbGwodGhpcywgZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIG9uKHR5cGUsIGxpc3RlbmVyKSB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGlzdGVuZXIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXMgPSBsaXN0ZW5lci5tYXAoKGxpc3RlbmVyKSA9PiB0aGlzLl9hZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgZGVzdHJveSgpIHtcclxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVzLmZvckVhY2goKGhhbmRsZSkgPT4gaGFuZGxlLmRlc3Ryb3koKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7XHJcbiAgICB9XHJcbiAgICBfYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcclxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyc01hcC5nZXQodHlwZSkgfHwgW107XHJcbiAgICAgICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xyXG4gICAgICAgIHRoaXMubGlzdGVuZXJzTWFwLnNldCh0eXBlLCBsaXN0ZW5lcnMpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGRlc3Ryb3k6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzTWFwLmdldCh0eXBlKSB8fCBbXTtcclxuICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UobGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpLCAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgRXZlbnRlZDtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXZlbnRlZC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL2NvcmUvRXZlbnRlZC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9jb3JlL0V2ZW50ZWQubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IHsgYXNzaWduIH0gZnJvbSAnLi4vc2hpbS9vYmplY3QnO1xuZXhwb3J0IHsgYXNzaWduIH0gZnJvbSAnLi4vc2hpbS9vYmplY3QnO1xuY29uc3Qgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5jb25zdCBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG4vKipcbiAqIFR5cGUgZ3VhcmQgdGhhdCBlbnN1cmVzIHRoYXQgdGhlIHZhbHVlIGNhbiBiZSBjb2VyY2VkIHRvIE9iamVjdFxuICogdG8gd2VlZCBvdXQgaG9zdCBvYmplY3RzIHRoYXQgZG8gbm90IGRlcml2ZSBmcm9tIE9iamVjdC5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjaGVjayBpZiB3ZSB3YW50IHRvIGRlZXAgY29weSBhbiBvYmplY3Qgb3Igbm90LlxuICogTm90ZTogSW4gRVM2IGl0IGlzIHBvc3NpYmxlIHRvIG1vZGlmeSBhbiBvYmplY3QncyBTeW1ib2wudG9TdHJpbmdUYWcgcHJvcGVydHksIHdoaWNoIHdpbGxcbiAqIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgYHRvU3RyaW5nYC4gVGhpcyBpcyBhIHJhcmUgZWRnZSBjYXNlIHRoYXQgaXMgZGlmZmljdWx0IHRvIGhhbmRsZSxcbiAqIHNvIGl0IGlzIG5vdCBoYW5kbGVkIGhlcmUuXG4gKiBAcGFyYW0gIHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybiAgICAgICBJZiB0aGUgdmFsdWUgaXMgY29lcmNpYmxlIGludG8gYW4gT2JqZWN0XG4gKi9cbmZ1bmN0aW9uIHNob3VsZERlZXBDb3B5T2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xufVxuZnVuY3Rpb24gY29weUFycmF5KGFycmF5LCBpbmhlcml0ZWQpIHtcbiAgICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gY29weUFycmF5KGl0ZW0sIGluaGVyaXRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFzaG91bGREZWVwQ29weU9iamVjdChpdGVtKVxuICAgICAgICAgICAgPyBpdGVtXG4gICAgICAgICAgICA6IF9taXhpbih7XG4gICAgICAgICAgICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpbmhlcml0ZWQ6IGluaGVyaXRlZCxcbiAgICAgICAgICAgICAgICBzb3VyY2VzOiBbaXRlbV0sXG4gICAgICAgICAgICAgICAgdGFyZ2V0OiB7fVxuICAgICAgICAgICAgfSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBfbWl4aW4oa3dBcmdzKSB7XG4gICAgY29uc3QgZGVlcCA9IGt3QXJncy5kZWVwO1xuICAgIGNvbnN0IGluaGVyaXRlZCA9IGt3QXJncy5pbmhlcml0ZWQ7XG4gICAgY29uc3QgdGFyZ2V0ID0ga3dBcmdzLnRhcmdldDtcbiAgICBjb25zdCBjb3BpZWQgPSBrd0FyZ3MuY29waWVkIHx8IFtdO1xuICAgIGNvbnN0IGNvcGllZENsb25lID0gWy4uLmNvcGllZF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrd0FyZ3Muc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBrd0FyZ3Muc291cmNlc1tpXTtcbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gbnVsbCB8fCBzb3VyY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgICAgICAgIGlmIChjb3BpZWRDbG9uZS5pbmRleE9mKHZhbHVlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkZWVwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb3B5QXJyYXkodmFsdWUsIGluaGVyaXRlZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2hvdWxkRGVlcENvcHlPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRWYWx1ZSA9IHRhcmdldFtrZXldIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkLnB1c2goc291cmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gX21peGluKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRlZDogaW5oZXJpdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM6IFt2YWx1ZV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUocHJvdG90eXBlLCAuLi5taXhpbnMpIHtcbiAgICBpZiAoIW1peGlucy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2xhbmcuY3JlYXRlIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBtaXhpbiBvYmplY3QuJyk7XG4gICAgfVxuICAgIGNvbnN0IGFyZ3MgPSBtaXhpbnMuc2xpY2UoKTtcbiAgICBhcmdzLnVuc2hpZnQoT2JqZWN0LmNyZWF0ZShwcm90b3R5cGUpKTtcbiAgICByZXR1cm4gYXNzaWduLmFwcGx5KG51bGwsIGFyZ3MpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBBc3NpZ24odGFyZ2V0LCAuLi5zb3VyY2VzKSB7XG4gICAgcmV0dXJuIF9taXhpbih7XG4gICAgICAgIGRlZXA6IHRydWUsXG4gICAgICAgIGluaGVyaXRlZDogZmFsc2UsXG4gICAgICAgIHNvdXJjZXM6IHNvdXJjZXMsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVlcE1peGluKHRhcmdldCwgLi4uc291cmNlcykge1xuICAgIHJldHVybiBfbWl4aW4oe1xuICAgICAgICBkZWVwOiB0cnVlLFxuICAgICAgICBpbmhlcml0ZWQ6IHRydWUsXG4gICAgICAgIHNvdXJjZXM6IHNvdXJjZXMsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0XG4gICAgfSk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHVzaW5nIHRoZSBwcm92aWRlZCBzb3VyY2UncyBwcm90b3R5cGUgYXMgdGhlIHByb3RvdHlwZSBmb3IgdGhlIG5ldyBvYmplY3QsIGFuZCB0aGVuXG4gKiBkZWVwIGNvcGllcyB0aGUgcHJvdmlkZWQgc291cmNlJ3MgdmFsdWVzIGludG8gdGhlIG5ldyB0YXJnZXQuXG4gKlxuICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IHRvIGR1cGxpY2F0ZVxuICogQHJldHVybiBUaGUgbmV3IG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZHVwbGljYXRlKHNvdXJjZSkge1xuICAgIGNvbnN0IHRhcmdldCA9IE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHNvdXJjZSkpO1xuICAgIHJldHVybiBkZWVwTWl4aW4odGFyZ2V0LCBzb3VyY2UpO1xufVxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdHdvIHZhbHVlcyBhcmUgdGhlIHNhbWUgdmFsdWUuXG4gKlxuICogQHBhcmFtIGEgRmlyc3QgdmFsdWUgdG8gY29tcGFyZVxuICogQHBhcmFtIGIgU2Vjb25kIHZhbHVlIHRvIGNvbXBhcmVcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWVzIGFyZSB0aGUgc2FtZTsgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0lkZW50aWNhbChhLCBiKSB7XG4gICAgcmV0dXJuIChhID09PSBiIHx8XG4gICAgICAgIC8qIGJvdGggdmFsdWVzIGFyZSBOYU4gKi9cbiAgICAgICAgKGEgIT09IGEgJiYgYiAhPT0gYikpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBiaW5kcyBhIG1ldGhvZCB0byB0aGUgc3BlY2lmaWVkIG9iamVjdCBhdCBydW50aW1lLiBUaGlzIGlzIHNpbWlsYXIgdG9cbiAqIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAsIGJ1dCBpbnN0ZWFkIG9mIGEgZnVuY3Rpb24gaXQgdGFrZXMgdGhlIG5hbWUgb2YgYSBtZXRob2Qgb24gYW4gb2JqZWN0LlxuICogQXMgYSByZXN1bHQsIHRoZSBmdW5jdGlvbiByZXR1cm5lZCBieSBgbGF0ZUJpbmRgIHdpbGwgYWx3YXlzIGNhbGwgdGhlIGZ1bmN0aW9uIGN1cnJlbnRseSBhc3NpZ25lZCB0b1xuICogdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBvbiB0aGUgb2JqZWN0IGFzIG9mIHRoZSBtb21lbnQgdGhlIGZ1bmN0aW9uIGl0IHJldHVybnMgaXMgY2FsbGVkLlxuICpcbiAqIEBwYXJhbSBpbnN0YW5jZSBUaGUgY29udGV4dCBvYmplY3RcbiAqIEBwYXJhbSBtZXRob2QgVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBvbiB0aGUgY29udGV4dCBvYmplY3QgdG8gYmluZCB0byBpdHNlbGZcbiAqIEBwYXJhbSBzdXBwbGllZEFyZ3MgQW4gb3B0aW9uYWwgYXJyYXkgb2YgdmFsdWVzIHRvIHByZXBlbmQgdG8gdGhlIGBpbnN0YW5jZVttZXRob2RdYCBhcmd1bWVudHMgbGlzdFxuICogQHJldHVybiBUaGUgYm91bmQgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhdGVCaW5kKGluc3RhbmNlLCBtZXRob2QsIC4uLnN1cHBsaWVkQXJncykge1xuICAgIHJldHVybiBzdXBwbGllZEFyZ3MubGVuZ3RoXG4gICAgICAgID8gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IGFyZ3VtZW50cy5sZW5ndGggPyBzdXBwbGllZEFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkgOiBzdXBwbGllZEFyZ3M7XG4gICAgICAgICAgICAvLyBUUzcwMTdcbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZVttZXRob2RdLmFwcGx5KGluc3RhbmNlLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIFRTNzAxN1xuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlW21ldGhvZF0uYXBwbHkoaW5zdGFuY2UsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gbWl4aW4odGFyZ2V0LCAuLi5zb3VyY2VzKSB7XG4gICAgcmV0dXJuIF9taXhpbih7XG4gICAgICAgIGRlZXA6IGZhbHNlLFxuICAgICAgICBpbmhlcml0ZWQ6IHRydWUsXG4gICAgICAgIHNvdXJjZXM6IHNvdXJjZXMsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0XG4gICAgfSk7XG59XG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB3aGljaCBpbnZva2VzIHRoZSBnaXZlbiBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgcHJlcGVuZGVkIHRvIGl0cyBhcmd1bWVudCBsaXN0LlxuICogTGlrZSBgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRgLCBidXQgZG9lcyBub3QgYWx0ZXIgZXhlY3V0aW9uIGNvbnRleHQuXG4gKlxuICogQHBhcmFtIHRhcmdldEZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0aGF0IG5lZWRzIHRvIGJlIGJvdW5kXG4gKiBAcGFyYW0gc3VwcGxpZWRBcmdzIEFuIG9wdGlvbmFsIGFycmF5IG9mIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRoZSBgdGFyZ2V0RnVuY3Rpb25gIGFyZ3VtZW50cyBsaXN0XG4gKiBAcmV0dXJuIFRoZSBib3VuZCBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFydGlhbCh0YXJnZXRGdW5jdGlvbiwgLi4uc3VwcGxpZWRBcmdzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IGFyZ3VtZW50cy5sZW5ndGggPyBzdXBwbGllZEFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkgOiBzdXBwbGllZEFyZ3M7XG4gICAgICAgIHJldHVybiB0YXJnZXRGdW5jdGlvbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xufVxuLyoqXG4gKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgZGVzdHJveSBtZXRob2QgdGhhdCwgd2hlbiBjYWxsZWQsIGNhbGxzIHRoZSBwYXNzZWQtaW4gZGVzdHJ1Y3Rvci5cbiAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBhIHVuaWZpZWQgaW50ZXJmYWNlIGZvciBjcmVhdGluZyBcInJlbW92ZVwiIC8gXCJkZXN0cm95XCIgaGFuZGxlcnMgZm9yXG4gKiBldmVudCBsaXN0ZW5lcnMsIHRpbWVycywgZXRjLlxuICpcbiAqIEBwYXJhbSBkZXN0cnVjdG9yIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBoYW5kbGUncyBgZGVzdHJveWAgbWV0aG9kIGlzIGludm9rZWRcbiAqIEByZXR1cm4gVGhlIGhhbmRsZSBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhhbmRsZShkZXN0cnVjdG9yKSB7XG4gICAgbGV0IGNhbGxlZCA9IGZhbHNlO1xuICAgIHJldHVybiB7XG4gICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghY2FsbGVkKSB7XG4gICAgICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBkZXN0cnVjdG9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgc2luZ2xlIGhhbmRsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlc3Ryb3kgbXVsdGlwbGUgaGFuZGxlcyBzaW11bHRhbmVvdXNseS5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlcyBBbiBhcnJheSBvZiBoYW5kbGVzIHdpdGggYGRlc3Ryb3lgIG1ldGhvZHNcbiAqIEByZXR1cm4gVGhlIGhhbmRsZSBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbXBvc2l0ZUhhbmRsZSguLi5oYW5kbGVzKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhhbmRsZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGFuZGxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaGFuZGxlc1tpXS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxhbmcubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9jb3JlL2xhbmcubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvY29yZS9sYW5nLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImZ1bmN0aW9uIGlzRmVhdHVyZVRlc3RUaGVuYWJsZSh2YWx1ZSkge1xyXG4gICAgcmV0dXJuIHZhbHVlICYmIHZhbHVlLnRoZW47XHJcbn1cclxuLyoqXHJcbiAqIEEgY2FjaGUgb2YgcmVzdWx0cyBvZiBmZWF0dXJlIHRlc3RzXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdGVzdENhY2hlID0ge307XHJcbi8qKlxyXG4gKiBBIGNhY2hlIG9mIHRoZSB1bi1yZXNvbHZlZCBmZWF0dXJlIHRlc3RzXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdGVzdEZ1bmN0aW9ucyA9IHt9O1xyXG4vKipcclxuICogQSBjYWNoZSBvZiB1bnJlc29sdmVkIHRoZW5hYmxlcyAocHJvYmFibHkgcHJvbWlzZXMpXHJcbiAqIEB0eXBlIHt7fX1cclxuICovXHJcbmNvbnN0IHRlc3RUaGVuYWJsZXMgPSB7fTtcclxuLyoqXHJcbiAqIEEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgc2NvcGUgKGB3aW5kb3dgIGluIGEgYnJvd3NlciwgYGdsb2JhbGAgaW4gTm9kZUpTKVxyXG4gKi9cclxuY29uc3QgZ2xvYmFsU2NvcGUgPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cclxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIC8vIEJyb3dzZXJzXHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdztcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgLy8gTm9kZVxyXG4gICAgICAgIHJldHVybiBnbG9iYWw7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAvLyBXZWIgd29ya2Vyc1xyXG4gICAgICAgIHJldHVybiBzZWxmO1xyXG4gICAgfVxyXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cclxuICAgIHJldHVybiB7fTtcclxufSkoKTtcclxuLyogR3JhYiB0aGUgc3RhdGljRmVhdHVyZXMgaWYgdGhlcmUgYXJlIGF2YWlsYWJsZSAqL1xyXG5jb25zdCB7IHN0YXRpY0ZlYXR1cmVzIH0gPSBnbG9iYWxTY29wZS5Eb2pvSGFzRW52aXJvbm1lbnQgfHwge307XHJcbi8qIENsZWFuaW5nIHVwIHRoZSBEb2pvSGFzRW52aW9ybm1lbnQgKi9cclxuaWYgKCdEb2pvSGFzRW52aXJvbm1lbnQnIGluIGdsb2JhbFNjb3BlKSB7XHJcbiAgICBkZWxldGUgZ2xvYmFsU2NvcGUuRG9qb0hhc0Vudmlyb25tZW50O1xyXG59XHJcbi8qKlxyXG4gKiBDdXN0b20gdHlwZSBndWFyZCB0byBuYXJyb3cgdGhlIGBzdGF0aWNGZWF0dXJlc2AgdG8gZWl0aGVyIGEgbWFwIG9yIGEgZnVuY3Rpb24gdGhhdFxyXG4gKiByZXR1cm5zIGEgbWFwLlxyXG4gKlxyXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGd1YXJkIGZvclxyXG4gKi9cclxuZnVuY3Rpb24gaXNTdGF0aWNGZWF0dXJlRnVuY3Rpb24odmFsdWUpIHtcclxuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XHJcbn1cclxuLyoqXHJcbiAqIFRoZSBjYWNoZSBvZiBhc3NlcnRlZCBmZWF0dXJlcyB0aGF0IHdlcmUgYXZhaWxhYmxlIGluIHRoZSBnbG9iYWwgc2NvcGUgd2hlbiB0aGVcclxuICogbW9kdWxlIGxvYWRlZFxyXG4gKi9cclxuY29uc3Qgc3RhdGljQ2FjaGUgPSBzdGF0aWNGZWF0dXJlc1xyXG4gICAgPyBpc1N0YXRpY0ZlYXR1cmVGdW5jdGlvbihzdGF0aWNGZWF0dXJlcykgPyBzdGF0aWNGZWF0dXJlcy5hcHBseShnbG9iYWxTY29wZSkgOiBzdGF0aWNGZWF0dXJlc1xyXG4gICAgOiB7fTsgLyogUHJvdmlkaW5nIGFuIGVtcHR5IGNhY2hlLCBpZiBub25lIHdhcyBpbiB0aGUgZW52aXJvbm1lbnRcclxuXHJcbi8qKlxyXG4qIEFNRCBwbHVnaW4gZnVuY3Rpb24uXHJcbipcclxuKiBDb25kaXRpb25hbCBsb2FkcyBtb2R1bGVzIGJhc2VkIG9uIGEgaGFzIGZlYXR1cmUgdGVzdCB2YWx1ZS5cclxuKlxyXG4qIEBwYXJhbSByZXNvdXJjZUlkIEdpdmVzIHRoZSByZXNvbHZlZCBtb2R1bGUgaWQgdG8gbG9hZC5cclxuKiBAcGFyYW0gcmVxdWlyZSBUaGUgbG9hZGVyIHJlcXVpcmUgZnVuY3Rpb24gd2l0aCByZXNwZWN0IHRvIHRoZSBtb2R1bGUgdGhhdCBjb250YWluZWQgdGhlIHBsdWdpbiByZXNvdXJjZSBpbiBpdHNcclxuKiAgICAgICAgICAgICAgICBkZXBlbmRlbmN5IGxpc3QuXHJcbiogQHBhcmFtIGxvYWQgQ2FsbGJhY2sgdG8gbG9hZGVyIHRoYXQgY29uc3VtZXMgcmVzdWx0IG9mIHBsdWdpbiBkZW1hbmQuXHJcbiovXHJcbmV4cG9ydCBmdW5jdGlvbiBsb2FkKHJlc291cmNlSWQsIHJlcXVpcmUsIGxvYWQsIGNvbmZpZykge1xyXG4gICAgcmVzb3VyY2VJZCA/IHJlcXVpcmUoW3Jlc291cmNlSWRdLCBsb2FkKSA6IGxvYWQoKTtcclxufVxyXG4vKipcclxuICogQU1EIHBsdWdpbiBmdW5jdGlvbi5cclxuICpcclxuICogUmVzb2x2ZXMgcmVzb3VyY2VJZCBpbnRvIGEgbW9kdWxlIGlkIGJhc2VkIG9uIHBvc3NpYmx5LW5lc3RlZCB0ZW5hcnkgZXhwcmVzc2lvbiB0aGF0IGJyYW5jaGVzIG9uIGhhcyBmZWF0dXJlIHRlc3RcclxuICogdmFsdWUocykuXHJcbiAqXHJcbiAqIEBwYXJhbSByZXNvdXJjZUlkIFRoZSBpZCBvZiB0aGUgbW9kdWxlXHJcbiAqIEBwYXJhbSBub3JtYWxpemUgUmVzb2x2ZXMgYSByZWxhdGl2ZSBtb2R1bGUgaWQgaW50byBhbiBhYnNvbHV0ZSBtb2R1bGUgaWRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUocmVzb3VyY2VJZCwgbm9ybWFsaXplKSB7XHJcbiAgICBjb25zdCB0b2tlbnMgPSByZXNvdXJjZUlkLm1hdGNoKC9bXFw/Ol18W146XFw/XSovZykgfHwgW107XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBmdW5jdGlvbiBnZXQoc2tpcCkge1xyXG4gICAgICAgIGNvbnN0IHRlcm0gPSB0b2tlbnNbaSsrXTtcclxuICAgICAgICBpZiAodGVybSA9PT0gJzonKSB7XHJcbiAgICAgICAgICAgIC8vIGVtcHR5IHN0cmluZyBtb2R1bGUgbmFtZSwgcmVzb2x2ZXMgdG8gbnVsbFxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIHBvc3RmaXhlZCB3aXRoIGEgPyBtZWFucyBpdCBpcyBhIGZlYXR1cmUgdG8gYnJhbmNoIG9uLCB0aGUgdGVybSBpcyB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZVxyXG4gICAgICAgICAgICBpZiAodG9rZW5zW2krK10gPT09ICc/Jykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFza2lwICYmIGhhcyh0ZXJtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoZWQgdGhlIGZlYXR1cmUsIGdldCB0aGUgZmlyc3QgdmFsdWUgZnJvbSB0aGUgb3B0aW9uc1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGRpZCBub3QgbWF0Y2gsIGdldCB0aGUgc2Vjb25kIHZhbHVlLCBwYXNzaW5nIG92ZXIgdGhlIGZpcnN0XHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQoc2tpcCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gYSBtb2R1bGVcclxuICAgICAgICAgICAgcmV0dXJuIHRlcm07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29uc3QgaWQgPSBnZXQoKTtcclxuICAgIHJldHVybiBpZCAmJiBub3JtYWxpemUoaWQpO1xyXG59XHJcbi8qKlxyXG4gKiBDaGVjayBpZiBhIGZlYXR1cmUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkXHJcbiAqXHJcbiAqIEBwYXJhbSBmZWF0dXJlIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZXhpc3RzKGZlYXR1cmUpIHtcclxuICAgIGNvbnN0IG5vcm1hbGl6ZWRGZWF0dXJlID0gZmVhdHVyZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIEJvb2xlYW4obm9ybWFsaXplZEZlYXR1cmUgaW4gc3RhdGljQ2FjaGUgfHwgbm9ybWFsaXplZEZlYXR1cmUgaW4gdGVzdENhY2hlIHx8IHRlc3RGdW5jdGlvbnNbbm9ybWFsaXplZEZlYXR1cmVdKTtcclxufVxyXG4vKipcclxuICogUmVnaXN0ZXIgYSBuZXcgdGVzdCBmb3IgYSBuYW1lZCBmZWF0dXJlLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBoYXMuYWRkKCdkb20tYWRkZXZlbnRsaXN0ZW5lcicsICEhZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcik7XHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGhhcy5hZGQoJ3RvdWNoLWV2ZW50cycsIGZ1bmN0aW9uICgpIHtcclxuICogICAgcmV0dXJuICdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50XHJcbiAqIH0pO1xyXG4gKlxyXG4gKiBAcGFyYW0gZmVhdHVyZSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZVxyXG4gKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHJlcG9ydGVkIG9mIHRoZSBmZWF0dXJlLCBvciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBvbmNlIG9uIGZpcnN0IHRlc3RcclxuICogQHBhcmFtIG92ZXJ3cml0ZSBpZiBhbiBleGlzdGluZyB2YWx1ZSBzaG91bGQgYmUgb3ZlcndyaXR0ZW4uIERlZmF1bHRzIHRvIGZhbHNlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZChmZWF0dXJlLCB2YWx1ZSwgb3ZlcndyaXRlID0gZmFsc2UpIHtcclxuICAgIGNvbnN0IG5vcm1hbGl6ZWRGZWF0dXJlID0gZmVhdHVyZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgaWYgKGV4aXN0cyhub3JtYWxpemVkRmVhdHVyZSkgJiYgIW92ZXJ3cml0ZSAmJiAhKG5vcm1hbGl6ZWRGZWF0dXJlIGluIHN0YXRpY0NhY2hlKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEZlYXR1cmUgXCIke2ZlYXR1cmV9XCIgZXhpc3RzIGFuZCBvdmVyd3JpdGUgbm90IHRydWUuYCk7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgdGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV0gPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGlzRmVhdHVyZVRlc3RUaGVuYWJsZSh2YWx1ZSkpIHtcclxuICAgICAgICB0ZXN0VGhlbmFibGVzW2ZlYXR1cmVdID0gdmFsdWUudGhlbigocmVzb2x2ZWRWYWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0ZXN0Q2FjaGVbZmVhdHVyZV0gPSByZXNvbHZlZFZhbHVlO1xyXG4gICAgICAgICAgICBkZWxldGUgdGVzdFRoZW5hYmxlc1tmZWF0dXJlXTtcclxuICAgICAgICB9LCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0ZXN0VGhlbmFibGVzW2ZlYXR1cmVdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdGVzdENhY2hlW25vcm1hbGl6ZWRGZWF0dXJlXSA9IHZhbHVlO1xyXG4gICAgICAgIGRlbGV0ZSB0ZXN0RnVuY3Rpb25zW25vcm1hbGl6ZWRGZWF0dXJlXTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIGEgbmFtZWQgZmVhdHVyZS5cclxuICpcclxuICogQHBhcmFtIGZlYXR1cmUgVGhlIG5hbWUgKGlmIGEgc3RyaW5nKSBvciBpZGVudGlmaWVyIChpZiBhbiBpbnRlZ2VyKSBvZiB0aGUgZmVhdHVyZSB0byB0ZXN0LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaGFzKGZlYXR1cmUpIHtcclxuICAgIGxldCByZXN1bHQ7XHJcbiAgICBjb25zdCBub3JtYWxpemVkRmVhdHVyZSA9IGZlYXR1cmUudG9Mb3dlckNhc2UoKTtcclxuICAgIGlmIChub3JtYWxpemVkRmVhdHVyZSBpbiBzdGF0aWNDYWNoZSkge1xyXG4gICAgICAgIHJlc3VsdCA9IHN0YXRpY0NhY2hlW25vcm1hbGl6ZWRGZWF0dXJlXTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRlc3RGdW5jdGlvbnNbbm9ybWFsaXplZEZlYXR1cmVdKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gdGVzdENhY2hlW25vcm1hbGl6ZWRGZWF0dXJlXSA9IHRlc3RGdW5jdGlvbnNbbm9ybWFsaXplZEZlYXR1cmVdLmNhbGwobnVsbCk7XHJcbiAgICAgICAgZGVsZXRlIHRlc3RGdW5jdGlvbnNbbm9ybWFsaXplZEZlYXR1cmVdO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAobm9ybWFsaXplZEZlYXR1cmUgaW4gdGVzdENhY2hlKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gdGVzdENhY2hlW25vcm1hbGl6ZWRGZWF0dXJlXTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGZlYXR1cmUgaW4gdGVzdFRoZW5hYmxlcykge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEF0dGVtcHQgdG8gZGV0ZWN0IHVucmVnaXN0ZXJlZCBoYXMgZmVhdHVyZSBcIiR7ZmVhdHVyZX1cImApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG4vKlxyXG4gKiBPdXQgb2YgdGhlIGJveCBmZWF0dXJlIHRlc3RzXHJcbiAqL1xyXG4vKiBFbnZpcm9ubWVudHMgKi9cclxuLyogVXNlZCBhcyBhIHZhbHVlIHRvIHByb3ZpZGUgYSBkZWJ1ZyBvbmx5IGNvZGUgcGF0aCAqL1xyXG5hZGQoJ2RlYnVnJywgdHJ1ZSk7XHJcbi8qIERldGVjdHMgaWYgdGhlIGVudmlyb25tZW50IGlzIFwiYnJvd3NlciBsaWtlXCIgKi9cclxuYWRkKCdob3N0LWJyb3dzZXInLCB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBsb2NhdGlvbiAhPT0gJ3VuZGVmaW5lZCcpO1xyXG4vKiBEZXRlY3RzIGlmIHRoZSBlbnZpcm9ubWVudCBhcHBlYXJzIHRvIGJlIE5vZGVKUyAqL1xyXG5hZGQoJ2hvc3Qtbm9kZScsIGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgcHJvY2Vzcy52ZXJzaW9ucyAmJiBwcm9jZXNzLnZlcnNpb25zLm5vZGUpIHtcclxuICAgICAgICByZXR1cm4gcHJvY2Vzcy52ZXJzaW9ucy5ub2RlO1xyXG4gICAgfVxyXG59KTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFzLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvaGFzL2hhcy5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9oYXMvaGFzLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCB7IGlzQXJyYXlMaWtlLCBTaGltSXRlcmF0b3IgfSBmcm9tICcuL2l0ZXJhdG9yJztcclxuaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XHJcbmltcG9ydCB7IGlzIGFzIG9iamVjdElzIH0gZnJvbSAnLi9vYmplY3QnO1xyXG5pbXBvcnQgaGFzIGZyb20gJy4vc3VwcG9ydC9oYXMnO1xyXG5pbXBvcnQgJy4vU3ltYm9sJztcclxuZXhwb3J0IGxldCBNYXAgPSBnbG9iYWwuTWFwO1xyXG5pZiAoIXRydWUpIHtcclxuICAgIE1hcCA9IChfYSA9IGNsYXNzIE1hcCB7XHJcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKGl0ZXJhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gW107XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSBbXTtcclxuICAgICAgICAgICAgICAgIHRoaXNbU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdNYXAnO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZXJhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXJyYXlMaWtlKGl0ZXJhYmxlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZXJhYmxlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGl0ZXJhYmxlW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQodmFsdWVbMF0sIHZhbHVlWzFdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBpdGVyYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQodmFsdWVbMF0sIHZhbHVlWzFdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogQW4gYWx0ZXJuYXRpdmUgdG8gQXJyYXkucHJvdG90eXBlLmluZGV4T2YgdXNpbmcgT2JqZWN0LmlzXHJcbiAgICAgICAgICAgICAqIHRvIGNoZWNrIGZvciBlcXVhbGl0eS4gU2VlIGh0dHA6Ly9temwubGEvMXp1S08yVlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgX2luZGV4T2ZLZXkoa2V5cywga2V5KSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3RJcyhrZXlzW2ldLCBrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBnZXQgc2l6ZSgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9rZXlzLmxlbmd0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjbGVhcigpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2tleXMubGVuZ3RoID0gdGhpcy5fdmFsdWVzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGVsZXRlKGtleSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9pbmRleE9mS2V5KHRoaXMuX2tleXMsIGtleSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbnRyaWVzKCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5fa2V5cy5tYXAoKGtleSwgaSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBba2V5LCB0aGlzLl92YWx1ZXNbaV1dO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNoaW1JdGVyYXRvcih2YWx1ZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvckVhY2goY2FsbGJhY2ssIGNvbnRleHQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSB0aGlzLl9rZXlzO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5fdmFsdWVzO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIHZhbHVlc1tpXSwga2V5c1tpXSwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZ2V0KGtleSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9pbmRleE9mS2V5KHRoaXMuX2tleXMsIGtleSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggPCAwID8gdW5kZWZpbmVkIDogdGhpcy5fdmFsdWVzW2luZGV4XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBoYXMoa2V5KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faW5kZXhPZktleSh0aGlzLl9rZXlzLCBrZXkpID4gLTE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAga2V5cygpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2hpbUl0ZXJhdG9yKHRoaXMuX2tleXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNldChrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLl9pbmRleE9mS2V5KHRoaXMuX2tleXMsIGtleSk7XHJcbiAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4IDwgMCA/IHRoaXMuX2tleXMubGVuZ3RoIDogaW5kZXg7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9rZXlzW2luZGV4XSA9IGtleTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlc1tpbmRleF0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhbHVlcygpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2hpbUl0ZXJhdG9yKHRoaXMuX3ZhbHVlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIF9hW1N5bWJvbC5zcGVjaWVzXSA9IF9hLFxyXG4gICAgICAgIF9hKTtcclxufVxyXG5leHBvcnQgZGVmYXVsdCBNYXA7XHJcbnZhciBfYTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWFwLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9NYXAubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9NYXAubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XHJcbmltcG9ydCB7IHF1ZXVlTWljcm9UYXNrIH0gZnJvbSAnLi9zdXBwb3J0L3F1ZXVlJztcclxuaW1wb3J0ICcuL1N5bWJvbCc7XHJcbmltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XHJcbmV4cG9ydCBsZXQgU2hpbVByb21pc2UgPSBnbG9iYWwuUHJvbWlzZTtcclxuZXhwb3J0IGNvbnN0IGlzVGhlbmFibGUgPSBmdW5jdGlvbiBpc1RoZW5hYmxlKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbic7XHJcbn07XHJcbmlmICghdHJ1ZSkge1xyXG4gICAgZ2xvYmFsLlByb21pc2UgPSBTaGltUHJvbWlzZSA9IChfYSA9IGNsYXNzIFByb21pc2Uge1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBQcm9taXNlLlxyXG4gICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAgKiBAY29uc3RydWN0b3JcclxuICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgICogQHBhcmFtIGV4ZWN1dG9yXHJcbiAgICAgICAgICAgICAqIFRoZSBleGVjdXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgaW1tZWRpYXRlbHkgd2hlbiB0aGUgUHJvbWlzZSBpcyBpbnN0YW50aWF0ZWQuIEl0IGlzIHJlc3BvbnNpYmxlIGZvclxyXG4gICAgICAgICAgICAgKiBzdGFydGluZyB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGVuIGl0IGlzIGludm9rZWQuXHJcbiAgICAgICAgICAgICAqXHJcbiAgICAgICAgICAgICAqIFRoZSBleGVjdXRvciBtdXN0IGNhbGwgZWl0aGVyIHRoZSBwYXNzZWQgYHJlc29sdmVgIGZ1bmN0aW9uIHdoZW4gdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZFxyXG4gICAgICAgICAgICAgKiBzdWNjZXNzZnVsbHksIG9yIHRoZSBgcmVqZWN0YCBmdW5jdGlvbiB3aGVuIHRoZSBvcGVyYXRpb24gZmFpbHMuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBjb25zdHJ1Y3RvcihleGVjdXRvcikge1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGlzIHByb21pc2UuXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAxIC8qIFBlbmRpbmcgKi87XHJcbiAgICAgICAgICAgICAgICB0aGlzW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnUHJvbWlzZSc7XHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIElmIHRydWUsIHRoZSByZXNvbHV0aW9uIG9mIHRoaXMgcHJvbWlzZSBpcyBjaGFpbmVkIChcImxvY2tlZCBpblwiKSB0byBhbm90aGVyIHByb21pc2UuXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGxldCBpc0NoYWluZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogV2hldGhlciBvciBub3QgdGhpcyBwcm9taXNlIGlzIGluIGEgcmVzb2x2ZWQgc3RhdGUuXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGNvbnN0IGlzUmVzb2x2ZWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUgIT09IDEgLyogUGVuZGluZyAqLyB8fCBpc0NoYWluZWQ7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBDYWxsYmFja3MgdGhhdCBzaG91bGQgYmUgaW52b2tlZCBvbmNlIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGxldCBjYWxsYmFja3MgPSBbXTtcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogSW5pdGlhbGx5IHB1c2hlcyBjYWxsYmFja3Mgb250byBhIHF1ZXVlIGZvciBleGVjdXRpb24gb25jZSB0aGlzIHByb21pc2Ugc2V0dGxlcy4gQWZ0ZXIgdGhlIHByb21pc2Ugc2V0dGxlcyxcclxuICAgICAgICAgICAgICAgICAqIGVucXVldWVzIGNhbGxiYWNrcyBmb3IgZXhlY3V0aW9uIG9uIHRoZSBuZXh0IGV2ZW50IGxvb3AgdHVybi5cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgbGV0IHdoZW5GaW5pc2hlZCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIFNldHRsZXMgdGhpcyBwcm9taXNlLlxyXG4gICAgICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSBuZXdTdGF0ZSBUaGUgcmVzb2x2ZWQgc3RhdGUgZm9yIHRoaXMgcHJvbWlzZS5cclxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7VHxhbnl9IHZhbHVlIFRoZSByZXNvbHZlZCB2YWx1ZSBmb3IgdGhpcyBwcm9taXNlLlxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZXR0bGUgPSAobmV3U3RhdGUsIHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQSBwcm9taXNlIGNhbiBvbmx5IGJlIHNldHRsZWQgb25jZS5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gMSAvKiBQZW5kaW5nICovKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IG5ld1N0YXRlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZWRWYWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZW5GaW5pc2hlZCA9IHF1ZXVlTWljcm9UYXNrO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgZW5xdWV1ZSBhIGNhbGxiYWNrIHJ1bm5lciBpZiB0aGVyZSBhcmUgY2FsbGJhY2tzIHNvIHRoYXQgaW5pdGlhbGx5IGZ1bGZpbGxlZCBQcm9taXNlcyBkb24ndCBoYXZlIHRvXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBhbiBleHRyYSB0dXJuLlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja3MgJiYgY2FsbGJhY2tzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNaWNyb1Rhc2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IGNhbGxiYWNrcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrc1tpXS5jYWxsKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBSZXNvbHZlcyB0aGlzIHByb21pc2UuXHJcbiAgICAgICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIG5ld1N0YXRlIFRoZSByZXNvbHZlZCBzdGF0ZSBmb3IgdGhpcyBwcm9taXNlLlxyXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIHtUfGFueX0gdmFsdWUgVGhlIHJlc29sdmVkIHZhbHVlIGZvciB0aGlzIHByb21pc2UuXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmUgPSAobmV3U3RhdGUsIHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVzb2x2ZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1RoZW5hYmxlKHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS50aGVuKHNldHRsZS5iaW5kKG51bGwsIDAgLyogRnVsZmlsbGVkICovKSwgc2V0dGxlLmJpbmQobnVsbCwgMiAvKiBSZWplY3RlZCAqLykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NoYWluZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGxlKG5ld1N0YXRlLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHRoaXMudGhlbiA9IChvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW5GaW5pc2hlZCBpbml0aWFsbHkgcXVldWVzIHVwIGNhbGxiYWNrcyBmb3IgZXhlY3V0aW9uIGFmdGVyIHRoZSBwcm9taXNlIGhhcyBzZXR0bGVkLiBPbmNlIHRoZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9taXNlIGhhcyBzZXR0bGVkLCB3aGVuRmluaXNoZWQgd2lsbCBzY2hlZHVsZSBjYWxsYmFja3MgZm9yIGV4ZWN1dGlvbiBvbiB0aGUgbmV4dCB0dXJuIHRocm91Z2ggdGhlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IGxvb3AuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZW5GaW5pc2hlZCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuc3RhdGUgPT09IDIgLyogUmVqZWN0ZWQgKi8gPyBvblJlamVjdGVkIDogb25GdWxmaWxsZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjYWxsYmFjayh0aGlzLnJlc29sdmVkVmFsdWUpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gMiAvKiBSZWplY3RlZCAqLykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh0aGlzLnJlc29sdmVkVmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnJlc29sdmVkVmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yKHJlc29sdmUuYmluZChudWxsLCAwIC8qIEZ1bGZpbGxlZCAqLyksIHJlc29sdmUuYmluZChudWxsLCAyIC8qIFJlamVjdGVkICovKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXR0bGUoMiAvKiBSZWplY3RlZCAqLywgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHN0YXRpYyBhbGwoaXRlcmFibGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcyhmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBsZXRlID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3B1bGF0aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmdWxmaWxsKGluZGV4LCB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICsrY29tcGxldGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmaW5pc2goKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3B1bGF0aW5nIHx8IGNvbXBsZXRlIDwgdG90YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHByb2Nlc3NJdGVtKGluZGV4LCBpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICsrdG90YWw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1RoZW5hYmxlKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbiBpdGVtIFByb21pc2UgcmVqZWN0cywgdGhpcyBQcm9taXNlIGlzIGltbWVkaWF0ZWx5IHJlamVjdGVkIHdpdGggdGhlIGl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb21pc2UncyByZWplY3Rpb24gZXJyb3IuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnRoZW4oZnVsZmlsbC5iaW5kKG51bGwsIGluZGV4KSwgcmVqZWN0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShpdGVtKS50aGVuKGZ1bGZpbGwuYmluZChudWxsLCBpbmRleCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBpID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGl0ZXJhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NJdGVtKGksIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBwb3B1bGF0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzdGF0aWMgcmFjZShpdGVyYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlcmFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIFByb21pc2UgaXRlbSByZWplY3RzLCB0aGlzIFByb21pc2UgaXMgaW1tZWRpYXRlbHkgcmVqZWN0ZWQgd2l0aCB0aGUgaXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvbWlzZSdzIHJlamVjdGlvbiBlcnJvci5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0udGhlbihyZXNvbHZlLCByZWplY3QpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKGl0ZW0pLnRoZW4ocmVzb2x2ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzdGF0aWMgcmVqZWN0KHJlYXNvbikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHN0YXRpYyByZXNvbHZlKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMoZnVuY3Rpb24gKHJlc29sdmUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoKG9uUmVqZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgX2FbU3ltYm9sLnNwZWNpZXNdID0gU2hpbVByb21pc2UsXHJcbiAgICAgICAgX2EpO1xyXG59XHJcbmV4cG9ydCBkZWZhdWx0IFNoaW1Qcm9taXNlO1xyXG52YXIgX2E7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVByb21pc2UubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL1Byb21pc2UubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9Qcm9taXNlLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XHJcbmltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xyXG5pbXBvcnQgeyBnZXRWYWx1ZURlc2NyaXB0b3IgfSBmcm9tICcuL3N1cHBvcnQvdXRpbCc7XHJcbmV4cG9ydCBsZXQgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcclxuaWYgKCF0cnVlKSB7XHJcbiAgICAvKipcclxuICAgICAqIFRocm93cyBpZiB0aGUgdmFsdWUgaXMgbm90IGEgc3ltYm9sLCB1c2VkIGludGVybmFsbHkgd2l0aGluIHRoZSBTaGltXHJcbiAgICAgKiBAcGFyYW0gIHthbnl9ICAgIHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVja1xyXG4gICAgICogQHJldHVybiB7c3ltYm9sfSAgICAgICBSZXR1cm5zIHRoZSBzeW1ib2wgb3IgdGhyb3dzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHZhbGlkYXRlU3ltYm9sID0gZnVuY3Rpb24gdmFsaWRhdGVTeW1ib2wodmFsdWUpIHtcclxuICAgICAgICBpZiAoIWlzU3ltYm9sKHZhbHVlKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHZhbHVlICsgJyBpcyBub3QgYSBzeW1ib2wnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfTtcclxuICAgIGNvbnN0IGRlZmluZVByb3BlcnRpZXMgPSBPYmplY3QuZGVmaW5lUHJvcGVydGllcztcclxuICAgIGNvbnN0IGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xyXG4gICAgY29uc3QgY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcclxuICAgIGNvbnN0IG9ialByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XHJcbiAgICBjb25zdCBnbG9iYWxTeW1ib2xzID0ge307XHJcbiAgICBjb25zdCBnZXRTeW1ib2xOYW1lID0gKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBjb25zdCBjcmVhdGVkID0gY3JlYXRlKG51bGwpO1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZGVzYykge1xyXG4gICAgICAgICAgICBsZXQgcG9zdGZpeCA9IDA7XHJcbiAgICAgICAgICAgIGxldCBuYW1lO1xyXG4gICAgICAgICAgICB3aGlsZSAoY3JlYXRlZFtTdHJpbmcoZGVzYykgKyAocG9zdGZpeCB8fCAnJyldKSB7XHJcbiAgICAgICAgICAgICAgICArK3Bvc3RmaXg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGVzYyArPSBTdHJpbmcocG9zdGZpeCB8fCAnJyk7XHJcbiAgICAgICAgICAgIGNyZWF0ZWRbZGVzY10gPSB0cnVlO1xyXG4gICAgICAgICAgICBuYW1lID0gJ0BAJyArIGRlc2M7XHJcbiAgICAgICAgICAgIC8vIEZJWE1FOiBUZW1wb3JhcnkgZ3VhcmQgdW50aWwgdGhlIGR1cGxpY2F0ZSBleGVjdXRpb24gd2hlbiB0ZXN0aW5nIGNhbiBiZVxyXG4gICAgICAgICAgICAvLyBwaW5uZWQgZG93bi5cclxuICAgICAgICAgICAgaWYgKCFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9ialByb3RvdHlwZSwgbmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIGRlZmluZVByb3BlcnR5KG9ialByb3RvdHlwZSwgbmFtZSwge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZVByb3BlcnR5KHRoaXMsIG5hbWUsIGdldFZhbHVlRGVzY3JpcHRvcih2YWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuYW1lO1xyXG4gICAgICAgIH07XHJcbiAgICB9KSgpO1xyXG4gICAgY29uc3QgSW50ZXJuYWxTeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woZGVzY3JpcHRpb24pIHtcclxuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEludGVybmFsU3ltYm9sKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1R5cGVFcnJvcjogU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBTeW1ib2woZGVzY3JpcHRpb24pO1xyXG4gICAgfTtcclxuICAgIFN5bWJvbCA9IGdsb2JhbC5TeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woZGVzY3JpcHRpb24pIHtcclxuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFN5bWJvbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUeXBlRXJyb3I6IFN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzeW0gPSBPYmplY3QuY3JlYXRlKEludGVybmFsU3ltYm9sLnByb3RvdHlwZSk7XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkID8gJycgOiBTdHJpbmcoZGVzY3JpcHRpb24pO1xyXG4gICAgICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0aWVzKHN5bSwge1xyXG4gICAgICAgICAgICBfX2Rlc2NyaXB0aW9uX186IGdldFZhbHVlRGVzY3JpcHRvcihkZXNjcmlwdGlvbiksXHJcbiAgICAgICAgICAgIF9fbmFtZV9fOiBnZXRWYWx1ZURlc2NyaXB0b3IoZ2V0U3ltYm9sTmFtZShkZXNjcmlwdGlvbikpXHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgLyogRGVjb3JhdGUgdGhlIFN5bWJvbCBmdW5jdGlvbiB3aXRoIHRoZSBhcHByb3ByaWF0ZSBwcm9wZXJ0aWVzICovXHJcbiAgICBkZWZpbmVQcm9wZXJ0eShTeW1ib2wsICdmb3InLCBnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgIGlmIChnbG9iYWxTeW1ib2xzW2tleV0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGdsb2JhbFN5bWJvbHNba2V5XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIChnbG9iYWxTeW1ib2xzW2tleV0gPSBTeW1ib2woU3RyaW5nKGtleSkpKTtcclxuICAgIH0pKTtcclxuICAgIGRlZmluZVByb3BlcnRpZXMoU3ltYm9sLCB7XHJcbiAgICAgICAga2V5Rm9yOiBnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKHN5bSkge1xyXG4gICAgICAgICAgICBsZXQga2V5O1xyXG4gICAgICAgICAgICB2YWxpZGF0ZVN5bWJvbChzeW0pO1xyXG4gICAgICAgICAgICBmb3IgKGtleSBpbiBnbG9iYWxTeW1ib2xzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsU3ltYm9sc1trZXldID09PSBzeW0pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgaGFzSW5zdGFuY2U6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdoYXNJbnN0YW5jZScpLCBmYWxzZSwgZmFsc2UpLFxyXG4gICAgICAgIGlzQ29uY2F0U3ByZWFkYWJsZTogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ2lzQ29uY2F0U3ByZWFkYWJsZScpLCBmYWxzZSwgZmFsc2UpLFxyXG4gICAgICAgIGl0ZXJhdG9yOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignaXRlcmF0b3InKSwgZmFsc2UsIGZhbHNlKSxcclxuICAgICAgICBtYXRjaDogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ21hdGNoJyksIGZhbHNlLCBmYWxzZSksXHJcbiAgICAgICAgb2JzZXJ2YWJsZTogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ29ic2VydmFibGUnKSwgZmFsc2UsIGZhbHNlKSxcclxuICAgICAgICByZXBsYWNlOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcigncmVwbGFjZScpLCBmYWxzZSwgZmFsc2UpLFxyXG4gICAgICAgIHNlYXJjaDogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3NlYXJjaCcpLCBmYWxzZSwgZmFsc2UpLFxyXG4gICAgICAgIHNwZWNpZXM6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdzcGVjaWVzJyksIGZhbHNlLCBmYWxzZSksXHJcbiAgICAgICAgc3BsaXQ6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdzcGxpdCcpLCBmYWxzZSwgZmFsc2UpLFxyXG4gICAgICAgIHRvUHJpbWl0aXZlOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcigndG9QcmltaXRpdmUnKSwgZmFsc2UsIGZhbHNlKSxcclxuICAgICAgICB0b1N0cmluZ1RhZzogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3RvU3RyaW5nVGFnJyksIGZhbHNlLCBmYWxzZSksXHJcbiAgICAgICAgdW5zY29wYWJsZXM6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCd1bnNjb3BhYmxlcycpLCBmYWxzZSwgZmFsc2UpXHJcbiAgICB9KTtcclxuICAgIC8qIERlY29yYXRlIHRoZSBJbnRlcm5hbFN5bWJvbCBvYmplY3QgKi9cclxuICAgIGRlZmluZVByb3BlcnRpZXMoSW50ZXJuYWxTeW1ib2wucHJvdG90eXBlLCB7XHJcbiAgICAgICAgY29uc3RydWN0b3I6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wpLFxyXG4gICAgICAgIHRvU3RyaW5nOiBnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fX25hbWVfXztcclxuICAgICAgICB9LCBmYWxzZSwgZmFsc2UpXHJcbiAgICB9KTtcclxuICAgIC8qIERlY29yYXRlIHRoZSBTeW1ib2wucHJvdG90eXBlICovXHJcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKFN5bWJvbC5wcm90b3R5cGUsIHtcclxuICAgICAgICB0b1N0cmluZzogZ2V0VmFsdWVEZXNjcmlwdG9yKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdTeW1ib2wgKCcgKyB2YWxpZGF0ZVN5bWJvbCh0aGlzKS5fX2Rlc2NyaXB0aW9uX18gKyAnKSc7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdmFsdWVPZjogZ2V0VmFsdWVEZXNjcmlwdG9yKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlU3ltYm9sKHRoaXMpO1xyXG4gICAgICAgIH0pXHJcbiAgICB9KTtcclxuICAgIGRlZmluZVByb3BlcnR5KFN5bWJvbC5wcm90b3R5cGUsIFN5bWJvbC50b1ByaW1pdGl2ZSwgZ2V0VmFsdWVEZXNjcmlwdG9yKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gdmFsaWRhdGVTeW1ib2wodGhpcyk7XHJcbiAgICB9KSk7XHJcbiAgICBkZWZpbmVQcm9wZXJ0eShTeW1ib2wucHJvdG90eXBlLCBTeW1ib2wudG9TdHJpbmdUYWcsIGdldFZhbHVlRGVzY3JpcHRvcignU3ltYm9sJywgZmFsc2UsIGZhbHNlLCB0cnVlKSk7XHJcbiAgICBkZWZpbmVQcm9wZXJ0eShJbnRlcm5hbFN5bWJvbC5wcm90b3R5cGUsIFN5bWJvbC50b1ByaW1pdGl2ZSwgZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5wcm90b3R5cGVbU3ltYm9sLnRvUHJpbWl0aXZlXSwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7XHJcbiAgICBkZWZpbmVQcm9wZXJ0eShJbnRlcm5hbFN5bWJvbC5wcm90b3R5cGUsIFN5bWJvbC50b1N0cmluZ1RhZywgZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5wcm90b3R5cGVbU3ltYm9sLnRvU3RyaW5nVGFnXSwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7XHJcbn1cclxuLyoqXHJcbiAqIEEgY3VzdG9tIGd1YXJkIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyBpZiBhbiBvYmplY3QgaXMgYSBzeW1ib2wgb3Igbm90XHJcbiAqIEBwYXJhbSAge2FueX0gICAgICAgdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrIHRvIHNlZSBpZiBpdCBpcyBhIHN5bWJvbCBvciBub3RcclxuICogQHJldHVybiB7aXMgc3ltYm9sfSAgICAgICBSZXR1cm5zIHRydWUgaWYgYSBzeW1ib2wgb3Igbm90IChhbmQgbmFycm93cyB0aGUgdHlwZSBndWFyZClcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xyXG4gICAgcmV0dXJuICh2YWx1ZSAmJiAodHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJyB8fCB2YWx1ZVsnQEB0b1N0cmluZ1RhZyddID09PSAnU3ltYm9sJykpIHx8IGZhbHNlO1xyXG59XHJcbi8qKlxyXG4gKiBGaWxsIGFueSBtaXNzaW5nIHdlbGwga25vd24gc3ltYm9scyBpZiB0aGUgbmF0aXZlIFN5bWJvbCBpcyBtaXNzaW5nIHRoZW1cclxuICovXHJcbltcclxuICAgICdoYXNJbnN0YW5jZScsXHJcbiAgICAnaXNDb25jYXRTcHJlYWRhYmxlJyxcclxuICAgICdpdGVyYXRvcicsXHJcbiAgICAnc3BlY2llcycsXHJcbiAgICAncmVwbGFjZScsXHJcbiAgICAnc2VhcmNoJyxcclxuICAgICdzcGxpdCcsXHJcbiAgICAnbWF0Y2gnLFxyXG4gICAgJ3RvUHJpbWl0aXZlJyxcclxuICAgICd0b1N0cmluZ1RhZycsXHJcbiAgICAndW5zY29wYWJsZXMnLFxyXG4gICAgJ29ic2VydmFibGUnXHJcbl0uZm9yRWFjaCgod2VsbEtub3duKSA9PiB7XHJcbiAgICBpZiAoIVN5bWJvbFt3ZWxsS25vd25dKSB7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN5bWJvbCwgd2VsbEtub3duLCBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcih3ZWxsS25vd24pLCBmYWxzZSwgZmFsc2UpKTtcclxuICAgIH1cclxufSk7XHJcbmV4cG9ydCBkZWZhdWx0IFN5bWJvbDtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3ltYm9sLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9TeW1ib2wubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9TeW1ib2wubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XHJcbmltcG9ydCB7IGlzQXJyYXlMaWtlIH0gZnJvbSAnLi9pdGVyYXRvcic7XHJcbmltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XHJcbmltcG9ydCAnLi9TeW1ib2wnO1xyXG5leHBvcnQgbGV0IFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcclxuaWYgKCF0cnVlKSB7XHJcbiAgICBjb25zdCBERUxFVEVEID0ge307XHJcbiAgICBjb25zdCBnZXRVSUQgPSBmdW5jdGlvbiBnZXRVSUQoKSB7XHJcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDAwMCk7XHJcbiAgICB9O1xyXG4gICAgY29uc3QgZ2VuZXJhdGVOYW1lID0gKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgc3RhcnRJZCA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAlIDEwMDAwMDAwMCk7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGdlbmVyYXRlTmFtZSgpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdfX3dtJyArIGdldFVJRCgpICsgKHN0YXJ0SWQrKyArICdfXycpO1xyXG4gICAgICAgIH07XHJcbiAgICB9KSgpO1xyXG4gICAgV2Vha01hcCA9IGNsYXNzIFdlYWtNYXAge1xyXG4gICAgICAgIGNvbnN0cnVjdG9yKGl0ZXJhYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXNbU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdXZWFrTWFwJztcclxuICAgICAgICAgICAgdGhpcy5fbmFtZSA9IGdlbmVyYXRlTmFtZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9mcm96ZW5FbnRyaWVzID0gW107XHJcbiAgICAgICAgICAgIGlmIChpdGVyYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzQXJyYXlMaWtlKGl0ZXJhYmxlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlcmFibGUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGl0ZXJhYmxlW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldChpdGVtWzBdLCBpdGVtWzFdKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBpdGVyYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgX2dldEZyb3plbkVudHJ5SW5kZXgoa2V5KSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fZnJvemVuRW50cmllcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2Zyb3plbkVudHJpZXNbaV0ua2V5ID09PSBrZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlbGV0ZShrZXkpIHtcclxuICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0ga2V5W3RoaXMuX25hbWVdO1xyXG4gICAgICAgICAgICBpZiAoZW50cnkgJiYgZW50cnkua2V5ID09PSBrZXkgJiYgZW50cnkudmFsdWUgIT09IERFTEVURUQpIHtcclxuICAgICAgICAgICAgICAgIGVudHJ5LnZhbHVlID0gREVMRVRFRDtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGZyb3plbkluZGV4ID0gdGhpcy5fZ2V0RnJvemVuRW50cnlJbmRleChrZXkpO1xyXG4gICAgICAgICAgICBpZiAoZnJvemVuSW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZnJvemVuRW50cmllcy5zcGxpY2UoZnJvemVuSW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBnZXQoa2V5KSB7XHJcbiAgICAgICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBrZXlbdGhpcy5fbmFtZV07XHJcbiAgICAgICAgICAgIGlmIChlbnRyeSAmJiBlbnRyeS5rZXkgPT09IGtleSAmJiBlbnRyeS52YWx1ZSAhPT0gREVMRVRFRCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGZyb3plbkluZGV4ID0gdGhpcy5fZ2V0RnJvemVuRW50cnlJbmRleChrZXkpO1xyXG4gICAgICAgICAgICBpZiAoZnJvemVuSW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zyb3plbkVudHJpZXNbZnJvemVuSW5kZXhdLnZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhhcyhrZXkpIHtcclxuICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0ga2V5W3RoaXMuX25hbWVdO1xyXG4gICAgICAgICAgICBpZiAoQm9vbGVhbihlbnRyeSAmJiBlbnRyeS5rZXkgPT09IGtleSAmJiBlbnRyeS52YWx1ZSAhPT0gREVMRVRFRCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGZyb3plbkluZGV4ID0gdGhpcy5fZ2V0RnJvemVuRW50cnlJbmRleChrZXkpO1xyXG4gICAgICAgICAgICBpZiAoZnJvemVuSW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXQoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgICAgICBpZiAoIWtleSB8fCAodHlwZW9mIGtleSAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIGtleSAhPT0gJ2Z1bmN0aW9uJykpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgdmFsdWUgdXNlZCBhcyB3ZWFrIG1hcCBrZXknKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgZW50cnkgPSBrZXlbdGhpcy5fbmFtZV07XHJcbiAgICAgICAgICAgIGlmICghZW50cnkgfHwgZW50cnkua2V5ICE9PSBrZXkpIHtcclxuICAgICAgICAgICAgICAgIGVudHJ5ID0gT2JqZWN0LmNyZWF0ZShudWxsLCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiB7IHZhbHVlOiBrZXkgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmlzRnJvemVuKGtleSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mcm96ZW5FbnRyaWVzLnB1c2goZW50cnkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGtleSwgdGhpcy5fbmFtZSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZW50cnlcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbnRyeS52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydCBkZWZhdWx0IFdlYWtNYXA7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdlYWtNYXAubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL1dlYWtNYXAubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9XZWFrTWFwLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xyXG5pbXBvcnQgeyBpc0FycmF5TGlrZSwgaXNJdGVyYWJsZSB9IGZyb20gJy4vaXRlcmF0b3InO1xyXG5pbXBvcnQgeyBNQVhfU0FGRV9JTlRFR0VSIH0gZnJvbSAnLi9udW1iZXInO1xyXG5pbXBvcnQgaGFzIGZyb20gJy4vc3VwcG9ydC9oYXMnO1xyXG5pbXBvcnQgeyB3cmFwTmF0aXZlIH0gZnJvbSAnLi9zdXBwb3J0L3V0aWwnO1xyXG5leHBvcnQgbGV0IGZyb207XHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IGFycmF5IGZyb20gdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMuXHJcbiAqXHJcbiAqIEBwYXJhbSBhcmd1bWVudHMgQW55IG51bWJlciBvZiBhcmd1bWVudHMgZm9yIHRoZSBhcnJheVxyXG4gKiBAcmV0dXJuIEFuIGFycmF5IGZyb20gdGhlIGdpdmVuIGFyZ3VtZW50c1xyXG4gKi9cclxuZXhwb3J0IGxldCBvZjtcclxuLyogRVM2IEFycmF5IGluc3RhbmNlIG1ldGhvZHMgKi9cclxuLyoqXHJcbiAqIENvcGllcyBkYXRhIGludGVybmFsbHkgd2l0aGluIGFuIGFycmF5IG9yIGFycmF5LWxpa2Ugb2JqZWN0LlxyXG4gKlxyXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgYXJyYXktbGlrZSBvYmplY3RcclxuICogQHBhcmFtIG9mZnNldCBUaGUgaW5kZXggdG8gc3RhcnQgY29weWluZyB2YWx1ZXMgdG87IGlmIG5lZ2F0aXZlLCBpdCBjb3VudHMgYmFja3dhcmRzIGZyb20gbGVuZ3RoXHJcbiAqIEBwYXJhbSBzdGFydCBUaGUgZmlyc3QgKGluY2x1c2l2ZSkgaW5kZXggdG8gY29weTsgaWYgbmVnYXRpdmUsIGl0IGNvdW50cyBiYWNrd2FyZHMgZnJvbSBsZW5ndGhcclxuICogQHBhcmFtIGVuZCBUaGUgbGFzdCAoZXhjbHVzaXZlKSBpbmRleCB0byBjb3B5OyBpZiBuZWdhdGl2ZSwgaXQgY291bnRzIGJhY2t3YXJkcyBmcm9tIGxlbmd0aFxyXG4gKiBAcmV0dXJuIFRoZSB0YXJnZXRcclxuICovXHJcbmV4cG9ydCBsZXQgY29weVdpdGhpbjtcclxuLyoqXHJcbiAqIEZpbGxzIGVsZW1lbnRzIG9mIGFuIGFycmF5LWxpa2Ugb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS5cclxuICpcclxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHRvIGZpbGxcclxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBmaWxsIGVhY2ggZWxlbWVudCBvZiB0aGUgdGFyZ2V0IHdpdGhcclxuICogQHBhcmFtIHN0YXJ0IFRoZSBmaXJzdCBpbmRleCB0byBmaWxsXHJcbiAqIEBwYXJhbSBlbmQgVGhlIChleGNsdXNpdmUpIGluZGV4IGF0IHdoaWNoIHRvIHN0b3AgZmlsbGluZ1xyXG4gKiBAcmV0dXJuIFRoZSBmaWxsZWQgdGFyZ2V0XHJcbiAqL1xyXG5leHBvcnQgbGV0IGZpbGw7XHJcbi8qKlxyXG4gKiBGaW5kcyBhbmQgcmV0dXJucyB0aGUgZmlyc3QgaW5zdGFuY2UgbWF0Y2hpbmcgdGhlIGNhbGxiYWNrIG9yIHVuZGVmaW5lZCBpZiBvbmUgaXMgbm90IGZvdW5kLlxyXG4gKlxyXG4gKiBAcGFyYW0gdGFyZ2V0IEFuIGFycmF5LWxpa2Ugb2JqZWN0XHJcbiAqIEBwYXJhbSBjYWxsYmFjayBBIGZ1bmN0aW9uIHJldHVybmluZyBpZiB0aGUgY3VycmVudCB2YWx1ZSBtYXRjaGVzIGEgY3JpdGVyaWFcclxuICogQHBhcmFtIHRoaXNBcmcgVGhlIGV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgZmluZCBmdW5jdGlvblxyXG4gKiBAcmV0dXJuIFRoZSBmaXJzdCBlbGVtZW50IG1hdGNoaW5nIHRoZSBjYWxsYmFjaywgb3IgdW5kZWZpbmVkIGlmIG9uZSBkb2VzIG5vdCBleGlzdFxyXG4gKi9cclxuZXhwb3J0IGxldCBmaW5kO1xyXG4vKipcclxuICogUGVyZm9ybXMgYSBsaW5lYXIgc2VhcmNoIGFuZCByZXR1cm5zIHRoZSBmaXJzdCBpbmRleCB3aG9zZSB2YWx1ZSBzYXRpc2ZpZXMgdGhlIHBhc3NlZCBjYWxsYmFjayxcclxuICogb3IgLTEgaWYgbm8gdmFsdWVzIHNhdGlzZnkgaXQuXHJcbiAqXHJcbiAqIEBwYXJhbSB0YXJnZXQgQW4gYXJyYXktbGlrZSBvYmplY3RcclxuICogQHBhcmFtIGNhbGxiYWNrIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRydWUgaWYgdGhlIGN1cnJlbnQgdmFsdWUgc2F0aXNmaWVzIGl0cyBjcml0ZXJpYVxyXG4gKiBAcGFyYW0gdGhpc0FyZyBUaGUgZXhlY3V0aW9uIGNvbnRleHQgZm9yIHRoZSBmaW5kIGZ1bmN0aW9uXHJcbiAqIEByZXR1cm4gVGhlIGZpcnN0IGluZGV4IHdob3NlIHZhbHVlIHNhdGlzZmllcyB0aGUgcGFzc2VkIGNhbGxiYWNrLCBvciAtMSBpZiBubyB2YWx1ZXMgc2F0aXNmeSBpdFxyXG4gKi9cclxuZXhwb3J0IGxldCBmaW5kSW5kZXg7XHJcbi8qIEVTNyBBcnJheSBpbnN0YW5jZSBtZXRob2RzICovXHJcbi8qKlxyXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gYXJyYXkgaW5jbHVkZXMgYSBnaXZlbiB2YWx1ZVxyXG4gKlxyXG4gKiBAcGFyYW0gdGFyZ2V0IHRoZSB0YXJnZXQgYXJyYXktbGlrZSBvYmplY3RcclxuICogQHBhcmFtIHNlYXJjaEVsZW1lbnQgdGhlIGl0ZW0gdG8gc2VhcmNoIGZvclxyXG4gKiBAcGFyYW0gZnJvbUluZGV4IHRoZSBzdGFydGluZyBpbmRleCB0byBzZWFyY2ggZnJvbVxyXG4gKiBAcmV0dXJuIGB0cnVlYCBpZiB0aGUgYXJyYXkgaW5jbHVkZXMgdGhlIGVsZW1lbnQsIG90aGVyd2lzZSBgZmFsc2VgXHJcbiAqL1xyXG5leHBvcnQgbGV0IGluY2x1ZGVzO1xyXG5pZiAodHJ1ZSAmJiB0cnVlKSB7XHJcbiAgICBmcm9tID0gZ2xvYmFsLkFycmF5LmZyb207XHJcbiAgICBvZiA9IGdsb2JhbC5BcnJheS5vZjtcclxuICAgIGNvcHlXaXRoaW4gPSB3cmFwTmF0aXZlKGdsb2JhbC5BcnJheS5wcm90b3R5cGUuY29weVdpdGhpbik7XHJcbiAgICBmaWxsID0gd3JhcE5hdGl2ZShnbG9iYWwuQXJyYXkucHJvdG90eXBlLmZpbGwpO1xyXG4gICAgZmluZCA9IHdyYXBOYXRpdmUoZ2xvYmFsLkFycmF5LnByb3RvdHlwZS5maW5kKTtcclxuICAgIGZpbmRJbmRleCA9IHdyYXBOYXRpdmUoZ2xvYmFsLkFycmF5LnByb3RvdHlwZS5maW5kSW5kZXgpO1xyXG59XHJcbmVsc2Uge1xyXG4gICAgLy8gSXQgaXMgb25seSBvbGRlciB2ZXJzaW9ucyBvZiBTYWZhcmkvaU9TIHRoYXQgaGF2ZSBhIGJhZCBmaWxsIGltcGxlbWVudGF0aW9uIGFuZCBzbyBhcmVuJ3QgaW4gdGhlIHdpbGRcclxuICAgIC8vIFRvIG1ha2UgdGhpbmdzIGVhc2llciwgaWYgdGhlcmUgaXMgYSBiYWQgZmlsbCBpbXBsZW1lbnRhdGlvbiwgdGhlIHdob2xlIHNldCBvZiBmdW5jdGlvbnMgd2lsbCBiZSBmaWxsZWRcclxuICAgIC8qKlxyXG4gICAgICogRW5zdXJlcyBhIG5vbi1uZWdhdGl2ZSwgbm9uLWluZmluaXRlLCBzYWZlIGludGVnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIHRvIHZhbGlkYXRlXHJcbiAgICAgKiBAcmV0dXJuIEEgcHJvcGVyIGxlbmd0aFxyXG4gICAgICovXHJcbiAgICBjb25zdCB0b0xlbmd0aCA9IGZ1bmN0aW9uIHRvTGVuZ3RoKGxlbmd0aCkge1xyXG4gICAgICAgIGlmIChpc05hTihsZW5ndGgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKTtcclxuICAgICAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xyXG4gICAgICAgICAgICBsZW5ndGggPSBNYXRoLmZsb29yKGxlbmd0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEVuc3VyZSBhIG5vbi1uZWdhdGl2ZSwgcmVhbCwgc2FmZSBpbnRlZ2VyXHJcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KGxlbmd0aCwgMCksIE1BWF9TQUZFX0lOVEVHRVIpO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogRnJvbSBFUzYgNy4xLjQgVG9JbnRlZ2VyKClcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgQSB2YWx1ZSB0byBjb252ZXJ0XHJcbiAgICAgKiBAcmV0dXJuIEFuIGludGVnZXJcclxuICAgICAqL1xyXG4gICAgY29uc3QgdG9JbnRlZ2VyID0gZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7XHJcbiAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xyXG4gICAgICAgIGlmIChpc05hTih2YWx1ZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gMCB8fCAhaXNGaW5pdGUodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICh2YWx1ZSA+IDAgPyAxIDogLTEpICogTWF0aC5mbG9vcihNYXRoLmFicyh2YWx1ZSkpO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogTm9ybWFsaXplcyBhbiBvZmZzZXQgYWdhaW5zdCBhIGdpdmVuIGxlbmd0aCwgd3JhcHBpbmcgaXQgaWYgbmVnYXRpdmUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSBvcmlnaW5hbCBvZmZzZXRcclxuICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIHRvdGFsIGxlbmd0aCB0byBub3JtYWxpemUgYWdhaW5zdFxyXG4gICAgICogQHJldHVybiBJZiBuZWdhdGl2ZSwgcHJvdmlkZSBhIGRpc3RhbmNlIGZyb20gdGhlIGVuZCAobGVuZ3RoKTsgb3RoZXJ3aXNlIHByb3ZpZGUgYSBkaXN0YW5jZSBmcm9tIDBcclxuICAgICAqL1xyXG4gICAgY29uc3Qgbm9ybWFsaXplT2Zmc2V0ID0gZnVuY3Rpb24gbm9ybWFsaXplT2Zmc2V0KHZhbHVlLCBsZW5ndGgpIHtcclxuICAgICAgICByZXR1cm4gdmFsdWUgPCAwID8gTWF0aC5tYXgobGVuZ3RoICsgdmFsdWUsIDApIDogTWF0aC5taW4odmFsdWUsIGxlbmd0aCk7XHJcbiAgICB9O1xyXG4gICAgZnJvbSA9IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlLCBtYXBGdW5jdGlvbiwgdGhpc0FyZykge1xyXG4gICAgICAgIGlmIChhcnJheUxpa2UgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdmcm9tOiByZXF1aXJlcyBhbiBhcnJheS1saWtlIG9iamVjdCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobWFwRnVuY3Rpb24gJiYgdGhpc0FyZykge1xyXG4gICAgICAgICAgICBtYXBGdW5jdGlvbiA9IG1hcEZ1bmN0aW9uLmJpbmQodGhpc0FyZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lICovXHJcbiAgICAgICAgY29uc3QgQ29uc3RydWN0b3IgPSB0aGlzO1xyXG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRvTGVuZ3RoKGFycmF5TGlrZS5sZW5ndGgpO1xyXG4gICAgICAgIC8vIFN1cHBvcnQgZXh0ZW5zaW9uXHJcbiAgICAgICAgY29uc3QgYXJyYXkgPSB0eXBlb2YgQ29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicgPyBPYmplY3QobmV3IENvbnN0cnVjdG9yKGxlbmd0aCkpIDogbmV3IEFycmF5KGxlbmd0aCk7XHJcbiAgICAgICAgaWYgKCFpc0FycmF5TGlrZShhcnJheUxpa2UpICYmICFpc0l0ZXJhYmxlKGFycmF5TGlrZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFycmF5O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGFycmF5IGFuZCB0aGUgbm9ybWFsaXplZCBsZW5ndGggaXMgMCwganVzdCByZXR1cm4gYW4gZW1wdHkgYXJyYXkuIHRoaXMgcHJldmVudHMgYSBwcm9ibGVtXHJcbiAgICAgICAgLy8gd2l0aCB0aGUgaXRlcmF0aW9uIG9uIElFIHdoZW4gdXNpbmcgYSBOYU4gYXJyYXkgbGVuZ3RoLlxyXG4gICAgICAgIGlmIChpc0FycmF5TGlrZShhcnJheUxpa2UpKSB7XHJcbiAgICAgICAgICAgIGlmIChsZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5TGlrZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBtYXBGdW5jdGlvbiA/IG1hcEZ1bmN0aW9uKGFycmF5TGlrZVtpXSwgaSkgOiBhcnJheUxpa2VbaV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBpID0gMDtcclxuICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhcnJheUxpa2UpIHtcclxuICAgICAgICAgICAgICAgIGFycmF5W2ldID0gbWFwRnVuY3Rpb24gPyBtYXBGdW5jdGlvbih2YWx1ZSwgaSkgOiB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYXJyYXlMaWtlLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGFycmF5Lmxlbmd0aCA9IGxlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFycmF5O1xyXG4gICAgfTtcclxuICAgIG9mID0gZnVuY3Rpb24gb2YoLi4uaXRlbXMpIHtcclxuICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoaXRlbXMpO1xyXG4gICAgfTtcclxuICAgIGNvcHlXaXRoaW4gPSBmdW5jdGlvbiBjb3B5V2l0aGluKHRhcmdldCwgb2Zmc2V0LCBzdGFydCwgZW5kKSB7XHJcbiAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NvcHlXaXRoaW46IHRhcmdldCBtdXN0IGJlIGFuIGFycmF5LWxpa2Ugb2JqZWN0Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRvTGVuZ3RoKHRhcmdldC5sZW5ndGgpO1xyXG4gICAgICAgIG9mZnNldCA9IG5vcm1hbGl6ZU9mZnNldCh0b0ludGVnZXIob2Zmc2V0KSwgbGVuZ3RoKTtcclxuICAgICAgICBzdGFydCA9IG5vcm1hbGl6ZU9mZnNldCh0b0ludGVnZXIoc3RhcnQpLCBsZW5ndGgpO1xyXG4gICAgICAgIGVuZCA9IG5vcm1hbGl6ZU9mZnNldChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvSW50ZWdlcihlbmQpLCBsZW5ndGgpO1xyXG4gICAgICAgIGxldCBjb3VudCA9IE1hdGgubWluKGVuZCAtIHN0YXJ0LCBsZW5ndGggLSBvZmZzZXQpO1xyXG4gICAgICAgIGxldCBkaXJlY3Rpb24gPSAxO1xyXG4gICAgICAgIGlmIChvZmZzZXQgPiBzdGFydCAmJiBvZmZzZXQgPCBzdGFydCArIGNvdW50KSB7XHJcbiAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xO1xyXG4gICAgICAgICAgICBzdGFydCArPSBjb3VudCAtIDE7XHJcbiAgICAgICAgICAgIG9mZnNldCArPSBjb3VudCAtIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHdoaWxlIChjb3VudCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0IGluIHRhcmdldCkge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0W29mZnNldF0gPSB0YXJnZXRbc3RhcnRdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRhcmdldFtvZmZzZXRdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9mZnNldCArPSBkaXJlY3Rpb247XHJcbiAgICAgICAgICAgIHN0YXJ0ICs9IGRpcmVjdGlvbjtcclxuICAgICAgICAgICAgY291bnQtLTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcclxuICAgIH07XHJcbiAgICBmaWxsID0gZnVuY3Rpb24gZmlsbCh0YXJnZXQsIHZhbHVlLCBzdGFydCwgZW5kKSB7XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdG9MZW5ndGgodGFyZ2V0Lmxlbmd0aCk7XHJcbiAgICAgICAgbGV0IGkgPSBub3JtYWxpemVPZmZzZXQodG9JbnRlZ2VyKHN0YXJ0KSwgbGVuZ3RoKTtcclxuICAgICAgICBlbmQgPSBub3JtYWxpemVPZmZzZXQoZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0ludGVnZXIoZW5kKSwgbGVuZ3RoKTtcclxuICAgICAgICB3aGlsZSAoaSA8IGVuZCkge1xyXG4gICAgICAgICAgICB0YXJnZXRbaSsrXSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xyXG4gICAgfTtcclxuICAgIGZpbmQgPSBmdW5jdGlvbiBmaW5kKHRhcmdldCwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IGZpbmRJbmRleCh0YXJnZXQsIGNhbGxiYWNrLCB0aGlzQXJnKTtcclxuICAgICAgICByZXR1cm4gaW5kZXggIT09IC0xID8gdGFyZ2V0W2luZGV4XSA6IHVuZGVmaW5lZDtcclxuICAgIH07XHJcbiAgICBmaW5kSW5kZXggPSBmdW5jdGlvbiBmaW5kSW5kZXgodGFyZ2V0LCBjYWxsYmFjaywgdGhpc0FyZykge1xyXG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRvTGVuZ3RoKHRhcmdldC5sZW5ndGgpO1xyXG4gICAgICAgIGlmICghY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZmluZDogc2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpc0FyZykge1xyXG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrLmJpbmQodGhpc0FyZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKHRhcmdldFtpXSwgaSwgdGFyZ2V0KSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfTtcclxufVxyXG5pZiAodHJ1ZSkge1xyXG4gICAgaW5jbHVkZXMgPSB3cmFwTmF0aXZlKGdsb2JhbC5BcnJheS5wcm90b3R5cGUuaW5jbHVkZXMpO1xyXG59XHJcbmVsc2Uge1xyXG4gICAgLyoqXHJcbiAgICAgKiBFbnN1cmVzIGEgbm9uLW5lZ2F0aXZlLCBub24taW5maW5pdGUsIHNhZmUgaW50ZWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgdG8gdmFsaWRhdGVcclxuICAgICAqIEByZXR1cm4gQSBwcm9wZXIgbGVuZ3RoXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHRvTGVuZ3RoID0gZnVuY3Rpb24gdG9MZW5ndGgobGVuZ3RoKSB7XHJcbiAgICAgICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aCk7XHJcbiAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XHJcbiAgICAgICAgICAgIGxlbmd0aCA9IE1hdGguZmxvb3IobGVuZ3RoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRW5zdXJlIGEgbm9uLW5lZ2F0aXZlLCByZWFsLCBzYWZlIGludGVnZXJcclxuICAgICAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobGVuZ3RoLCAwKSwgTUFYX1NBRkVfSU5URUdFUik7XHJcbiAgICB9O1xyXG4gICAgaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyh0YXJnZXQsIHNlYXJjaEVsZW1lbnQsIGZyb21JbmRleCA9IDApIHtcclxuICAgICAgICBsZXQgbGVuID0gdG9MZW5ndGgodGFyZ2V0Lmxlbmd0aCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IGZyb21JbmRleDsgaSA8IGxlbjsgKytpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gdGFyZ2V0W2ldO1xyXG4gICAgICAgICAgICBpZiAoc2VhcmNoRWxlbWVudCA9PT0gY3VycmVudEVsZW1lbnQgfHxcclxuICAgICAgICAgICAgICAgIChzZWFyY2hFbGVtZW50ICE9PSBzZWFyY2hFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50ICE9PSBjdXJyZW50RWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH07XHJcbn1cclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJyYXkubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL2FycmF5Lm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vYXJyYXkubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiY29uc3QgZ2xvYmFsT2JqZWN0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gZ2xvYmFsIHNwZWMgZGVmaW5lcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdCBjYWxsZWQgJ2dsb2JhbCdcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZ2xvYmFsXG4gICAgICAgIC8vIGBnbG9iYWxgIGlzIGFsc28gZGVmaW5lZCBpbiBOb2RlSlNcbiAgICAgICAgcmV0dXJuIGdsb2JhbDtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gd2luZG93IGlzIGRlZmluZWQgaW4gYnJvd3NlcnNcbiAgICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIHNlbGYgaXMgZGVmaW5lZCBpbiBXZWJXb3JrZXJzXG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cbn0pKCk7XG5leHBvcnQgZGVmYXVsdCBnbG9iYWxPYmplY3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nbG9iYWwubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL2dsb2JhbC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL2dsb2JhbC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgJy4vU3ltYm9sJztcbmltcG9ydCB7IEhJR0hfU1VSUk9HQVRFX01BWCwgSElHSF9TVVJST0dBVEVfTUlOIH0gZnJvbSAnLi9zdHJpbmcnO1xuY29uc3Qgc3RhdGljRG9uZSA9IHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuLyoqXG4gKiBBIGNsYXNzIHRoYXQgX3NoaW1zXyBhbiBpdGVyYXRvciBpbnRlcmZhY2Ugb24gYXJyYXkgbGlrZSBvYmplY3RzLlxuICovXG5leHBvcnQgY2xhc3MgU2hpbUl0ZXJhdG9yIHtcbiAgICBjb25zdHJ1Y3RvcihsaXN0KSB7XG4gICAgICAgIHRoaXMuX25leHRJbmRleCA9IC0xO1xuICAgICAgICBpZiAoaXNJdGVyYWJsZShsaXN0KSkge1xuICAgICAgICAgICAgdGhpcy5fbmF0aXZlSXRlcmF0b3IgPSBsaXN0W1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2xpc3QgPSBsaXN0O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgbmV4dCBpdGVyYXRpb24gcmVzdWx0IGZvciB0aGUgSXRlcmF0b3JcbiAgICAgKi9cbiAgICBuZXh0KCkge1xuICAgICAgICBpZiAodGhpcy5fbmF0aXZlSXRlcmF0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9uYXRpdmVJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9saXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGljRG9uZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKyt0aGlzLl9uZXh0SW5kZXggPCB0aGlzLl9saXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkb25lOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5fbGlzdFt0aGlzLl9uZXh0SW5kZXhdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0aWNEb25lO1xuICAgIH1cbiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuLyoqXG4gKiBBIHR5cGUgZ3VhcmQgZm9yIGNoZWNraW5nIGlmIHNvbWV0aGluZyBoYXMgYW4gSXRlcmFibGUgaW50ZXJmYWNlXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB0eXBlIGd1YXJkIGFnYWluc3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSXRlcmFibGUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlW1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbic7XG59XG4vKipcbiAqIEEgdHlwZSBndWFyZCBmb3IgY2hlY2tpbmcgaWYgc29tZXRoaW5nIGlzIEFycmF5TGlrZVxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdHlwZSBndWFyZCBhZ2FpbnN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUubGVuZ3RoID09PSAnbnVtYmVyJztcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgaXRlcmF0b3IgZm9yIGFuIG9iamVjdFxuICpcbiAqIEBwYXJhbSBpdGVyYWJsZSBUaGUgaXRlcmFibGUgb2JqZWN0IHRvIHJldHVybiB0aGUgaXRlcmF0b3IgZm9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXQoaXRlcmFibGUpIHtcbiAgICBpZiAoaXNJdGVyYWJsZShpdGVyYWJsZSkpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNBcnJheUxpa2UoaXRlcmFibGUpKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2hpbUl0ZXJhdG9yKGl0ZXJhYmxlKTtcbiAgICB9XG59XG4vKipcbiAqIFNoaW1zIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGBmb3IgLi4uIG9mYCBibG9ja3NcbiAqXG4gKiBAcGFyYW0gaXRlcmFibGUgVGhlIG9iamVjdCB0aGUgcHJvdmlkZXMgYW4gaW50ZXJhdG9yIGludGVyZmFjZVxuICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB3aGljaCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBpdGVtIG9mIHRoZSBpdGVyYWJsZVxuICogQHBhcmFtIHRoaXNBcmcgT3B0aW9uYWwgc2NvcGUgdG8gcGFzcyB0aGUgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvck9mKGl0ZXJhYmxlLCBjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIGxldCBicm9rZW4gPSBmYWxzZTtcbiAgICBmdW5jdGlvbiBkb0JyZWFrKCkge1xuICAgICAgICBicm9rZW4gPSB0cnVlO1xuICAgIH1cbiAgICAvKiBXZSBuZWVkIHRvIGhhbmRsZSBpdGVyYXRpb24gb2YgZG91YmxlIGJ5dGUgc3RyaW5ncyBwcm9wZXJseSAqL1xuICAgIGlmIChpc0FycmF5TGlrZShpdGVyYWJsZSkgJiYgdHlwZW9mIGl0ZXJhYmxlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBsID0gaXRlcmFibGUubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgbGV0IGNoYXIgPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgIGlmIChpICsgMSA8IGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2RlID0gY2hhci5jaGFyQ29kZUF0KDApO1xuICAgICAgICAgICAgICAgIGlmIChjb2RlID49IEhJR0hfU1VSUk9HQVRFX01JTiAmJiBjb2RlIDw9IEhJR0hfU1VSUk9HQVRFX01BWCkge1xuICAgICAgICAgICAgICAgICAgICBjaGFyICs9IGl0ZXJhYmxlWysraV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzQXJnLCBjaGFyLCBpdGVyYWJsZSwgZG9CcmVhayk7XG4gICAgICAgICAgICBpZiAoYnJva2VuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBpdGVyYXRvciA9IGdldChpdGVyYWJsZSk7XG4gICAgICAgIGlmIChpdGVyYXRvcikge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIHdoaWxlICghcmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHJlc3VsdC52YWx1ZSwgaXRlcmFibGUsIGRvQnJlYWspO1xuICAgICAgICAgICAgICAgIGlmIChicm9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pdGVyYXRvci5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vaXRlcmF0b3IubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9pdGVyYXRvci5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4vZ2xvYmFsJztcbi8qKlxuICogVGhlIHNtYWxsZXN0IGludGVydmFsIGJldHdlZW4gdHdvIHJlcHJlc2VudGFibGUgbnVtYmVycy5cbiAqL1xuZXhwb3J0IGNvbnN0IEVQU0lMT04gPSAxO1xuLyoqXG4gKiBUaGUgbWF4aW11bSBzYWZlIGludGVnZXIgaW4gSmF2YVNjcmlwdFxuICovXG5leHBvcnQgY29uc3QgTUFYX1NBRkVfSU5URUdFUiA9IE1hdGgucG93KDIsIDUzKSAtIDE7XG4vKipcbiAqIFRoZSBtaW5pbXVtIHNhZmUgaW50ZWdlciBpbiBKYXZhU2NyaXB0XG4gKi9cbmV4cG9ydCBjb25zdCBNSU5fU0FGRV9JTlRFR0VSID0gLU1BWF9TQUZFX0lOVEVHRVI7XG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGFzc2VkIHZhbHVlIGlzIE5hTiB3aXRob3V0IGNvZXJzaW9uLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBOYU4sIGZhbHNlIGlmIGl0IGlzIG5vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOYU4odmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBnbG9iYWwuaXNOYU4odmFsdWUpO1xufVxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhc3NlZCB2YWx1ZSBpcyBhIGZpbml0ZSBudW1iZXIgd2l0aG91dCBjb2Vyc2lvbi5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgZmluaXRlLCBmYWxzZSBpZiBpdCBpcyBub3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRmluaXRlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgZ2xvYmFsLmlzRmluaXRlKHZhbHVlKTtcbn1cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXNzZWQgdmFsdWUgaXMgYW4gaW50ZWdlci5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlciwgZmFsc2UgaWYgaXQgaXMgbm90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0ludGVnZXIodmFsdWUpIHtcbiAgICByZXR1cm4gaXNGaW5pdGUodmFsdWUpICYmIE1hdGguZmxvb3IodmFsdWUpID09PSB2YWx1ZTtcbn1cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXNzZWQgdmFsdWUgaXMgYW4gaW50ZWdlciB0aGF0IGlzICdzYWZlLCcgbWVhbmluZzpcbiAqICAgMS4gaXQgY2FuIGJlIGV4cHJlc3NlZCBhcyBhbiBJRUVFLTc1NCBkb3VibGUgcHJlY2lzaW9uIG51bWJlclxuICogICAyLiBpdCBoYXMgYSBvbmUtdG8tb25lIG1hcHBpbmcgdG8gYSBtYXRoZW1hdGljYWwgaW50ZWdlciwgbWVhbmluZyBpdHNcbiAqICAgICAgSUVFRS03NTQgcmVwcmVzZW50YXRpb24gY2Fubm90IGJlIHRoZSByZXN1bHQgb2Ygcm91bmRpbmcgYW55IG90aGVyXG4gKiAgICAgIGludGVnZXIgdG8gZml0IHRoZSBJRUVFLTc1NCByZXByZXNlbnRhdGlvblxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLCBmYWxzZSBpZiBpdCBpcyBub3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2FmZUludGVnZXIodmFsdWUpIHtcbiAgICByZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSAmJiBNYXRoLmFicyh2YWx1ZSkgPD0gTUFYX1NBRkVfSU5URUdFUjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW51bWJlci5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vbnVtYmVyLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vbnVtYmVyLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xyXG5pbXBvcnQgaGFzIGZyb20gJy4vc3VwcG9ydC9oYXMnO1xyXG5pbXBvcnQgeyBpc1N5bWJvbCB9IGZyb20gJy4vU3ltYm9sJztcclxuZXhwb3J0IGxldCBhc3NpZ247XHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBvd24gcHJvcGVydHkgZGVzY3JpcHRvciBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC5cclxuICogQW4gb3duIHByb3BlcnR5IGRlc2NyaXB0b3IgaXMgb25lIHRoYXQgaXMgZGVmaW5lZCBkaXJlY3RseSBvbiB0aGUgb2JqZWN0IGFuZCBpcyBub3RcclxuICogaW5oZXJpdGVkIGZyb20gdGhlIG9iamVjdCdzIHByb3RvdHlwZS5cclxuICogQHBhcmFtIG8gT2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHByb3BlcnR5LlxyXG4gKiBAcGFyYW0gcCBOYW1lIG9mIHRoZSBwcm9wZXJ0eS5cclxuICovXHJcbmV4cG9ydCBsZXQgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xyXG4vKipcclxuICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIG93biBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdC4gVGhlIG93biBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdCBhcmUgdGhvc2UgdGhhdCBhcmUgZGVmaW5lZCBkaXJlY3RseVxyXG4gKiBvbiB0aGF0IG9iamVjdCwgYW5kIGFyZSBub3QgaW5oZXJpdGVkIGZyb20gdGhlIG9iamVjdCdzIHByb3RvdHlwZS4gVGhlIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IGluY2x1ZGUgYm90aCBmaWVsZHMgKG9iamVjdHMpIGFuZCBmdW5jdGlvbnMuXHJcbiAqIEBwYXJhbSBvIE9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBvd24gcHJvcGVydGllcy5cclxuICovXHJcbmV4cG9ydCBsZXQgZ2V0T3duUHJvcGVydHlOYW1lcztcclxuLyoqXHJcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHN5bWJvbCBwcm9wZXJ0aWVzIGZvdW5kIGRpcmVjdGx5IG9uIG9iamVjdCBvLlxyXG4gKiBAcGFyYW0gbyBPYmplY3QgdG8gcmV0cmlldmUgdGhlIHN5bWJvbHMgZnJvbS5cclxuICovXHJcbmV4cG9ydCBsZXQgZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xyXG4vKipcclxuICogUmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZXMgYXJlIHRoZSBzYW1lIHZhbHVlLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqIEBwYXJhbSB2YWx1ZTEgVGhlIGZpcnN0IHZhbHVlLlxyXG4gKiBAcGFyYW0gdmFsdWUyIFRoZSBzZWNvbmQgdmFsdWUuXHJcbiAqL1xyXG5leHBvcnQgbGV0IGlzO1xyXG4vKipcclxuICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydGllcyBhbmQgbWV0aG9kcyBvZiBhbiBvYmplY3QuXHJcbiAqIEBwYXJhbSBvIE9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzLiBUaGlzIGNhbiBiZSBhbiBvYmplY3QgdGhhdCB5b3UgY3JlYXRlZCBvciBhbiBleGlzdGluZyBEb2N1bWVudCBPYmplY3QgTW9kZWwgKERPTSkgb2JqZWN0LlxyXG4gKi9cclxuZXhwb3J0IGxldCBrZXlzO1xyXG4vKiBFUzcgT2JqZWN0IHN0YXRpYyBtZXRob2RzICovXHJcbmV4cG9ydCBsZXQgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycztcclxuZXhwb3J0IGxldCBlbnRyaWVzO1xyXG5leHBvcnQgbGV0IHZhbHVlcztcclxuaWYgKHRydWUpIHtcclxuICAgIGNvbnN0IGdsb2JhbE9iamVjdCA9IGdsb2JhbC5PYmplY3Q7XHJcbiAgICBhc3NpZ24gPSBnbG9iYWxPYmplY3QuYXNzaWduO1xyXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2xvYmFsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcclxuICAgIGdldE93blByb3BlcnR5TmFtZXMgPSBnbG9iYWxPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcclxuICAgIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdsb2JhbE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XHJcbiAgICBpcyA9IGdsb2JhbE9iamVjdC5pcztcclxuICAgIGtleXMgPSBnbG9iYWxPYmplY3Qua2V5cztcclxufVxyXG5lbHNlIHtcclxuICAgIGtleXMgPSBmdW5jdGlvbiBzeW1ib2xBd2FyZUtleXMobykge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvKS5maWx0ZXIoKGtleSkgPT4gIUJvb2xlYW4oa2V5Lm1hdGNoKC9eQEAuKy8pKSk7XHJcbiAgICB9O1xyXG4gICAgYXNzaWduID0gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgLi4uc291cmNlcykge1xyXG4gICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAvLyBUeXBlRXJyb3IgaWYgdW5kZWZpbmVkIG9yIG51bGxcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRvID0gT2JqZWN0KHRhcmdldCk7XHJcbiAgICAgICAgc291cmNlcy5mb3JFYWNoKChuZXh0U291cmNlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChuZXh0U291cmNlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBTa2lwIG92ZXIgaWYgdW5kZWZpbmVkIG9yIG51bGxcclxuICAgICAgICAgICAgICAgIGtleXMobmV4dFNvdXJjZSkuZm9yRWFjaCgobmV4dEtleSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvW25leHRLZXldID0gbmV4dFNvdXJjZVtuZXh0S2V5XTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRvO1xyXG4gICAgfTtcclxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihvLCBwcm9wKSB7XHJcbiAgICAgICAgaWYgKGlzU3ltYm9sKHByb3ApKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8sIHByb3ApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobywgcHJvcCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIGdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKG8pIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobykuZmlsdGVyKChrZXkpID0+ICFCb29sZWFuKGtleS5tYXRjaCgvXkBALisvKSkpO1xyXG4gICAgfTtcclxuICAgIGdldE93blByb3BlcnR5U3ltYm9scyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhvKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG8pXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKGtleSkgPT4gQm9vbGVhbihrZXkubWF0Y2goL15AQC4rLykpKVxyXG4gICAgICAgICAgICAubWFwKChrZXkpID0+IFN5bWJvbC5mb3Ioa2V5LnN1YnN0cmluZygyKSkpO1xyXG4gICAgfTtcclxuICAgIGlzID0gZnVuY3Rpb24gaXModmFsdWUxLCB2YWx1ZTIpIHtcclxuICAgICAgICBpZiAodmFsdWUxID09PSB2YWx1ZTIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlMSAhPT0gMCB8fCAxIC8gdmFsdWUxID09PSAxIC8gdmFsdWUyOyAvLyAtMFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsdWUxICE9PSB2YWx1ZTEgJiYgdmFsdWUyICE9PSB2YWx1ZTI7IC8vIE5hTlxyXG4gICAgfTtcclxufVxyXG5pZiAodHJ1ZSkge1xyXG4gICAgY29uc3QgZ2xvYmFsT2JqZWN0ID0gZ2xvYmFsLk9iamVjdDtcclxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPSBnbG9iYWxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycztcclxuICAgIGVudHJpZXMgPSBnbG9iYWxPYmplY3QuZW50cmllcztcclxuICAgIHZhbHVlcyA9IGdsb2JhbE9iamVjdC52YWx1ZXM7XHJcbn1cclxuZWxzZSB7XHJcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvKSB7XHJcbiAgICAgICAgcmV0dXJuIGdldE93blByb3BlcnR5TmFtZXMobykucmVkdWNlKChwcmV2aW91cywga2V5KSA9PiB7XHJcbiAgICAgICAgICAgIHByZXZpb3VzW2tleV0gPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobywga2V5KTtcclxuICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzO1xyXG4gICAgICAgIH0sIHt9KTtcclxuICAgIH07XHJcbiAgICBlbnRyaWVzID0gZnVuY3Rpb24gZW50cmllcyhvKSB7XHJcbiAgICAgICAgcmV0dXJuIGtleXMobykubWFwKChrZXkpID0+IFtrZXksIG9ba2V5XV0pO1xyXG4gICAgfTtcclxuICAgIHZhbHVlcyA9IGZ1bmN0aW9uIHZhbHVlcyhvKSB7XHJcbiAgICAgICAgcmV0dXJuIGtleXMobykubWFwKChrZXkpID0+IG9ba2V5XSk7XHJcbiAgICB9O1xyXG59XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9iamVjdC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vb2JqZWN0Lm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vb2JqZWN0Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xyXG5pbXBvcnQgaGFzIGZyb20gJy4vc3VwcG9ydC9oYXMnO1xyXG5pbXBvcnQgeyB3cmFwTmF0aXZlIH0gZnJvbSAnLi9zdXBwb3J0L3V0aWwnO1xyXG4vKipcclxuICogVGhlIG1pbmltdW0gbG9jYXRpb24gb2YgaGlnaCBzdXJyb2dhdGVzXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgSElHSF9TVVJST0dBVEVfTUlOID0gMHhkODAwO1xyXG4vKipcclxuICogVGhlIG1heGltdW0gbG9jYXRpb24gb2YgaGlnaCBzdXJyb2dhdGVzXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgSElHSF9TVVJST0dBVEVfTUFYID0gMHhkYmZmO1xyXG4vKipcclxuICogVGhlIG1pbmltdW0gbG9jYXRpb24gb2YgbG93IHN1cnJvZ2F0ZXNcclxuICovXHJcbmV4cG9ydCBjb25zdCBMT1dfU1VSUk9HQVRFX01JTiA9IDB4ZGMwMDtcclxuLyoqXHJcbiAqIFRoZSBtYXhpbXVtIGxvY2F0aW9uIG9mIGxvdyBzdXJyb2dhdGVzXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTE9XX1NVUlJPR0FURV9NQVggPSAweGRmZmY7XHJcbi8qIEVTNiBzdGF0aWMgbWV0aG9kcyAqL1xyXG4vKipcclxuICogUmV0dXJuIHRoZSBTdHJpbmcgdmFsdWUgd2hvc2UgZWxlbWVudHMgYXJlLCBpbiBvcmRlciwgdGhlIGVsZW1lbnRzIGluIHRoZSBMaXN0IGVsZW1lbnRzLlxyXG4gKiBJZiBsZW5ndGggaXMgMCwgdGhlIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC5cclxuICogQHBhcmFtIGNvZGVQb2ludHMgVGhlIGNvZGUgcG9pbnRzIHRvIGdlbmVyYXRlIHRoZSBzdHJpbmdcclxuICovXHJcbmV4cG9ydCBsZXQgZnJvbUNvZGVQb2ludDtcclxuLyoqXHJcbiAqIGByYXdgIGlzIGludGVuZGVkIGZvciB1c2UgYXMgYSB0YWcgZnVuY3Rpb24gb2YgYSBUYWdnZWQgVGVtcGxhdGUgU3RyaW5nLiBXaGVuIGNhbGxlZFxyXG4gKiBhcyBzdWNoIHRoZSBmaXJzdCBhcmd1bWVudCB3aWxsIGJlIGEgd2VsbCBmb3JtZWQgdGVtcGxhdGUgY2FsbCBzaXRlIG9iamVjdCBhbmQgdGhlIHJlc3RcclxuICogcGFyYW1ldGVyIHdpbGwgY29udGFpbiB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcy5cclxuICogQHBhcmFtIHRlbXBsYXRlIEEgd2VsbC1mb3JtZWQgdGVtcGxhdGUgc3RyaW5nIGNhbGwgc2l0ZSByZXByZXNlbnRhdGlvbi5cclxuICogQHBhcmFtIHN1YnN0aXR1dGlvbnMgQSBzZXQgb2Ygc3Vic3RpdHV0aW9uIHZhbHVlcy5cclxuICovXHJcbmV4cG9ydCBsZXQgcmF3O1xyXG4vKiBFUzYgaW5zdGFuY2UgbWV0aG9kcyAqL1xyXG4vKipcclxuICogUmV0dXJucyBhIG5vbm5lZ2F0aXZlIGludGVnZXIgTnVtYmVyIGxlc3MgdGhhbiAxMTE0MTEyICgweDExMDAwMCkgdGhhdCBpcyB0aGUgY29kZSBwb2ludFxyXG4gKiB2YWx1ZSBvZiB0aGUgVVRGLTE2IGVuY29kZWQgY29kZSBwb2ludCBzdGFydGluZyBhdCB0aGUgc3RyaW5nIGVsZW1lbnQgYXQgcG9zaXRpb24gcG9zIGluXHJcbiAqIHRoZSBTdHJpbmcgcmVzdWx0aW5nIGZyb20gY29udmVydGluZyB0aGlzIG9iamVjdCB0byBhIFN0cmluZy5cclxuICogSWYgdGhlcmUgaXMgbm8gZWxlbWVudCBhdCB0aGF0IHBvc2l0aW9uLCB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZC5cclxuICogSWYgYSB2YWxpZCBVVEYtMTYgc3Vycm9nYXRlIHBhaXIgZG9lcyBub3QgYmVnaW4gYXQgcG9zLCB0aGUgcmVzdWx0IGlzIHRoZSBjb2RlIHVuaXQgYXQgcG9zLlxyXG4gKi9cclxuZXhwb3J0IGxldCBjb2RlUG9pbnRBdDtcclxuLyoqXHJcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VxdWVuY2Ugb2YgZWxlbWVudHMgb2Ygc2VhcmNoU3RyaW5nIGNvbnZlcnRlZCB0byBhIFN0cmluZyBpcyB0aGVcclxuICogc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiB0aGlzIG9iamVjdCAoY29udmVydGVkIHRvIGEgU3RyaW5nKSBzdGFydGluZyBhdFxyXG4gKiBlbmRQb3NpdGlvbiDigJMgbGVuZ3RoKHRoaXMpLiBPdGhlcndpc2UgcmV0dXJucyBmYWxzZS5cclxuICovXHJcbmV4cG9ydCBsZXQgZW5kc1dpdGg7XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRydWUgaWYgc2VhcmNoU3RyaW5nIGFwcGVhcnMgYXMgYSBzdWJzdHJpbmcgb2YgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoaXNcclxuICogb2JqZWN0IHRvIGEgU3RyaW5nLCBhdCBvbmUgb3IgbW9yZSBwb3NpdGlvbnMgdGhhdCBhcmVcclxuICogZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHBvc2l0aW9uOyBvdGhlcndpc2UsIHJldHVybnMgZmFsc2UuXHJcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBzdHJpbmdcclxuICogQHBhcmFtIHNlYXJjaFN0cmluZyBzZWFyY2ggc3RyaW5nXHJcbiAqIEBwYXJhbSBwb3NpdGlvbiBJZiBwb3NpdGlvbiBpcyB1bmRlZmluZWQsIDAgaXMgYXNzdW1lZCwgc28gYXMgdG8gc2VhcmNoIGFsbCBvZiB0aGUgU3RyaW5nLlxyXG4gKi9cclxuZXhwb3J0IGxldCBpbmNsdWRlcztcclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIFN0cmluZyB2YWx1ZSByZXN1bHQgb2Ygbm9ybWFsaXppbmcgdGhlIHN0cmluZyBpbnRvIHRoZSBub3JtYWxpemF0aW9uIGZvcm1cclxuICogbmFtZWQgYnkgZm9ybSBhcyBzcGVjaWZpZWQgaW4gVW5pY29kZSBTdGFuZGFyZCBBbm5leCAjMTUsIFVuaWNvZGUgTm9ybWFsaXphdGlvbiBGb3Jtcy5cclxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHN0cmluZ1xyXG4gKiBAcGFyYW0gZm9ybSBBcHBsaWNhYmxlIHZhbHVlczogXCJORkNcIiwgXCJORkRcIiwgXCJORktDXCIsIG9yIFwiTkZLRFwiLCBJZiBub3Qgc3BlY2lmaWVkIGRlZmF1bHRcclxuICogaXMgXCJORkNcIlxyXG4gKi9cclxuZXhwb3J0IGxldCBub3JtYWxpemU7XHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgU3RyaW5nIHZhbHVlIHRoYXQgaXMgbWFkZSBmcm9tIGNvdW50IGNvcGllcyBhcHBlbmRlZCB0b2dldGhlci4gSWYgY291bnQgaXMgMCxcclxuICogVCBpcyB0aGUgZW1wdHkgU3RyaW5nIGlzIHJldHVybmVkLlxyXG4gKiBAcGFyYW0gY291bnQgbnVtYmVyIG9mIGNvcGllcyB0byBhcHBlbmRcclxuICovXHJcbmV4cG9ydCBsZXQgcmVwZWF0O1xyXG4vKipcclxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXF1ZW5jZSBvZiBlbGVtZW50cyBvZiBzZWFyY2hTdHJpbmcgY29udmVydGVkIHRvIGEgU3RyaW5nIGlzIHRoZVxyXG4gKiBzYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIHRoaXMgb2JqZWN0IChjb252ZXJ0ZWQgdG8gYSBTdHJpbmcpIHN0YXJ0aW5nIGF0XHJcbiAqIHBvc2l0aW9uLiBPdGhlcndpc2UgcmV0dXJucyBmYWxzZS5cclxuICovXHJcbmV4cG9ydCBsZXQgc3RhcnRzV2l0aDtcclxuLyogRVM3IGluc3RhbmNlIG1ldGhvZHMgKi9cclxuLyoqXHJcbiAqIFBhZHMgdGhlIGN1cnJlbnQgc3RyaW5nIHdpdGggYSBnaXZlbiBzdHJpbmcgKHBvc3NpYmx5IHJlcGVhdGVkKSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgc3RyaW5nIHJlYWNoZXMgYSBnaXZlbiBsZW5ndGguXHJcbiAqIFRoZSBwYWRkaW5nIGlzIGFwcGxpZWQgZnJvbSB0aGUgZW5kIChyaWdodCkgb2YgdGhlIGN1cnJlbnQgc3RyaW5nLlxyXG4gKlxyXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgc3RyaW5nXHJcbiAqIEBwYXJhbSBtYXhMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZyBvbmNlIHRoZSBjdXJyZW50IHN0cmluZyBoYXMgYmVlbiBwYWRkZWQuXHJcbiAqICAgICAgICBJZiB0aGlzIHBhcmFtZXRlciBpcyBzbWFsbGVyIHRoYW4gdGhlIGN1cnJlbnQgc3RyaW5nJ3MgbGVuZ3RoLCB0aGUgY3VycmVudCBzdHJpbmcgd2lsbCBiZSByZXR1cm5lZCBhcyBpdCBpcy5cclxuICpcclxuICogQHBhcmFtIGZpbGxTdHJpbmcgVGhlIHN0cmluZyB0byBwYWQgdGhlIGN1cnJlbnQgc3RyaW5nIHdpdGguXHJcbiAqICAgICAgICBJZiB0aGlzIHN0cmluZyBpcyB0b28gbG9uZywgaXQgd2lsbCBiZSB0cnVuY2F0ZWQgYW5kIHRoZSBsZWZ0LW1vc3QgcGFydCB3aWxsIGJlIGFwcGxpZWQuXHJcbiAqICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaXMgXCIgXCIgKFUrMDAyMCkuXHJcbiAqL1xyXG5leHBvcnQgbGV0IHBhZEVuZDtcclxuLyoqXHJcbiAqIFBhZHMgdGhlIGN1cnJlbnQgc3RyaW5nIHdpdGggYSBnaXZlbiBzdHJpbmcgKHBvc3NpYmx5IHJlcGVhdGVkKSBzbyB0aGF0IHRoZSByZXN1bHRpbmcgc3RyaW5nIHJlYWNoZXMgYSBnaXZlbiBsZW5ndGguXHJcbiAqIFRoZSBwYWRkaW5nIGlzIGFwcGxpZWQgZnJvbSB0aGUgc3RhcnQgKGxlZnQpIG9mIHRoZSBjdXJyZW50IHN0cmluZy5cclxuICpcclxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHN0cmluZ1xyXG4gKiBAcGFyYW0gbWF4TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcgb25jZSB0aGUgY3VycmVudCBzdHJpbmcgaGFzIGJlZW4gcGFkZGVkLlxyXG4gKiAgICAgICAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgc21hbGxlciB0aGFuIHRoZSBjdXJyZW50IHN0cmluZydzIGxlbmd0aCwgdGhlIGN1cnJlbnQgc3RyaW5nIHdpbGwgYmUgcmV0dXJuZWQgYXMgaXQgaXMuXHJcbiAqXHJcbiAqIEBwYXJhbSBmaWxsU3RyaW5nIFRoZSBzdHJpbmcgdG8gcGFkIHRoZSBjdXJyZW50IHN0cmluZyB3aXRoLlxyXG4gKiAgICAgICAgSWYgdGhpcyBzdHJpbmcgaXMgdG9vIGxvbmcsIGl0IHdpbGwgYmUgdHJ1bmNhdGVkIGFuZCB0aGUgbGVmdC1tb3N0IHBhcnQgd2lsbCBiZSBhcHBsaWVkLlxyXG4gKiAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlzIFwiIFwiIChVKzAwMjApLlxyXG4gKi9cclxuZXhwb3J0IGxldCBwYWRTdGFydDtcclxuaWYgKHRydWUgJiYgdHJ1ZSkge1xyXG4gICAgZnJvbUNvZGVQb2ludCA9IGdsb2JhbC5TdHJpbmcuZnJvbUNvZGVQb2ludDtcclxuICAgIHJhdyA9IGdsb2JhbC5TdHJpbmcucmF3O1xyXG4gICAgY29kZVBvaW50QXQgPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0KTtcclxuICAgIGVuZHNXaXRoID0gd3JhcE5hdGl2ZShnbG9iYWwuU3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aCk7XHJcbiAgICBpbmNsdWRlcyA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMpO1xyXG4gICAgbm9ybWFsaXplID0gd3JhcE5hdGl2ZShnbG9iYWwuU3RyaW5nLnByb3RvdHlwZS5ub3JtYWxpemUpO1xyXG4gICAgcmVwZWF0ID0gd3JhcE5hdGl2ZShnbG9iYWwuU3RyaW5nLnByb3RvdHlwZS5yZXBlYXQpO1xyXG4gICAgc3RhcnRzV2l0aCA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aCk7XHJcbn1cclxuZWxzZSB7XHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXRlcyB0aGF0IHRleHQgaXMgZGVmaW5lZCwgYW5kIG5vcm1hbGl6ZXMgcG9zaXRpb24gKGJhc2VkIG9uIHRoZSBnaXZlbiBkZWZhdWx0IGlmIHRoZSBpbnB1dCBpcyBOYU4pLlxyXG4gICAgICogVXNlZCBieSBzdGFydHNXaXRoLCBpbmNsdWRlcywgYW5kIGVuZHNXaXRoLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gTm9ybWFsaXplZCBwb3NpdGlvbi5cclxuICAgICAqL1xyXG4gICAgY29uc3Qgbm9ybWFsaXplU3Vic3RyaW5nQXJncyA9IGZ1bmN0aW9uIChuYW1lLCB0ZXh0LCBzZWFyY2gsIHBvc2l0aW9uLCBpc0VuZCA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJpbmcuJyArIG5hbWUgKyAnIHJlcXVpcmVzIGEgdmFsaWQgc3RyaW5nIHRvIHNlYXJjaCBhZ2FpbnN0LicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBsZW5ndGggPSB0ZXh0Lmxlbmd0aDtcclxuICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uICE9PSBwb3NpdGlvbiA/IChpc0VuZCA/IGxlbmd0aCA6IDApIDogcG9zaXRpb247XHJcbiAgICAgICAgcmV0dXJuIFt0ZXh0LCBTdHJpbmcoc2VhcmNoKSwgTWF0aC5taW4oTWF0aC5tYXgocG9zaXRpb24sIDApLCBsZW5ndGgpXTtcclxuICAgIH07XHJcbiAgICBmcm9tQ29kZVBvaW50ID0gZnVuY3Rpb24gZnJvbUNvZGVQb2ludCguLi5jb2RlUG9pbnRzKSB7XHJcbiAgICAgICAgLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5mcm9tQ29kZVBvaW50XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcclxuICAgICAgICBpZiAoIWxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XHJcbiAgICAgICAgY29uc3QgTUFYX1NJWkUgPSAweDQwMDA7XHJcbiAgICAgICAgbGV0IGNvZGVVbml0cyA9IFtdO1xyXG4gICAgICAgIGxldCBpbmRleCA9IC0xO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcclxuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xyXG4gICAgICAgICAgICBsZXQgY29kZVBvaW50ID0gTnVtYmVyKGFyZ3VtZW50c1tpbmRleF0pO1xyXG4gICAgICAgICAgICAvLyBDb2RlIHBvaW50cyBtdXN0IGJlIGZpbml0ZSBpbnRlZ2VycyB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlXHJcbiAgICAgICAgICAgIGxldCBpc1ZhbGlkID0gaXNGaW5pdGUoY29kZVBvaW50KSAmJiBNYXRoLmZsb29yKGNvZGVQb2ludCkgPT09IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPj0gMCAmJiBjb2RlUG9pbnQgPD0gMHgxMGZmZmY7XHJcbiAgICAgICAgICAgIGlmICghaXNWYWxpZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcignc3RyaW5nLmZyb21Db2RlUG9pbnQ6IEludmFsaWQgY29kZSBwb2ludCAnICsgY29kZVBvaW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY29kZVBvaW50IDw9IDB4ZmZmZikge1xyXG4gICAgICAgICAgICAgICAgLy8gQk1QIGNvZGUgcG9pbnRcclxuICAgICAgICAgICAgICAgIGNvZGVVbml0cy5wdXNoKGNvZGVQb2ludCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBBc3RyYWwgY29kZSBwb2ludDsgc3BsaXQgaW4gc3Vycm9nYXRlIGhhbHZlc1xyXG4gICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmcjc3Vycm9nYXRlLWZvcm11bGFlXHJcbiAgICAgICAgICAgICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMDtcclxuICAgICAgICAgICAgICAgIGxldCBoaWdoU3Vycm9nYXRlID0gKGNvZGVQb2ludCA+PiAxMCkgKyBISUdIX1NVUlJPR0FURV9NSU47XHJcbiAgICAgICAgICAgICAgICBsZXQgbG93U3Vycm9nYXRlID0gY29kZVBvaW50ICUgMHg0MDAgKyBMT1dfU1VSUk9HQVRFX01JTjtcclxuICAgICAgICAgICAgICAgIGNvZGVVbml0cy5wdXNoKGhpZ2hTdXJyb2dhdGUsIGxvd1N1cnJvZ2F0ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA9PT0gbGVuZ3RoIHx8IGNvZGVVbml0cy5sZW5ndGggPiBNQVhfU0laRSkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGZyb21DaGFyQ29kZS5hcHBseShudWxsLCBjb2RlVW5pdHMpO1xyXG4gICAgICAgICAgICAgICAgY29kZVVuaXRzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcbiAgICByYXcgPSBmdW5jdGlvbiByYXcoY2FsbFNpdGUsIC4uLnN1YnN0aXR1dGlvbnMpIHtcclxuICAgICAgICBsZXQgcmF3U3RyaW5ncyA9IGNhbGxTaXRlLnJhdztcclxuICAgICAgICBsZXQgcmVzdWx0ID0gJyc7XHJcbiAgICAgICAgbGV0IG51bVN1YnN0aXR1dGlvbnMgPSBzdWJzdGl0dXRpb25zLmxlbmd0aDtcclxuICAgICAgICBpZiAoY2FsbFNpdGUgPT0gbnVsbCB8fCBjYWxsU2l0ZS5yYXcgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJpbmcucmF3IHJlcXVpcmVzIGEgdmFsaWQgY2FsbFNpdGUgb2JqZWN0IHdpdGggYSByYXcgdmFsdWUnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IHJhd1N0cmluZ3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgcmVzdWx0ICs9IHJhd1N0cmluZ3NbaV0gKyAoaSA8IG51bVN1YnN0aXR1dGlvbnMgJiYgaSA8IGxlbmd0aCAtIDEgPyBzdWJzdGl0dXRpb25zW2ldIDogJycpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfTtcclxuICAgIGNvZGVQb2ludEF0ID0gZnVuY3Rpb24gY29kZVBvaW50QXQodGV4dCwgcG9zaXRpb24gPSAwKSB7XHJcbiAgICAgICAgLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXRcclxuICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmluZy5jb2RlUG9pbnRBdCByZXF1cmllcyBhIHZhbGlkIHN0cmluZy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGV4dC5sZW5ndGg7XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uICE9PSBwb3NpdGlvbikge1xyXG4gICAgICAgICAgICBwb3NpdGlvbiA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gbGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEdldCB0aGUgZmlyc3QgY29kZSB1bml0XHJcbiAgICAgICAgY29uc3QgZmlyc3QgPSB0ZXh0LmNoYXJDb2RlQXQocG9zaXRpb24pO1xyXG4gICAgICAgIGlmIChmaXJzdCA+PSBISUdIX1NVUlJPR0FURV9NSU4gJiYgZmlyc3QgPD0gSElHSF9TVVJST0dBVEVfTUFYICYmIGxlbmd0aCA+IHBvc2l0aW9uICsgMSkge1xyXG4gICAgICAgICAgICAvLyBTdGFydCBvZiBhIHN1cnJvZ2F0ZSBwYWlyIChoaWdoIHN1cnJvZ2F0ZSBhbmQgdGhlcmUgaXMgYSBuZXh0IGNvZGUgdW5pdCk7IGNoZWNrIGZvciBsb3cgc3Vycm9nYXRlXHJcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nI3N1cnJvZ2F0ZS1mb3JtdWxhZVxyXG4gICAgICAgICAgICBjb25zdCBzZWNvbmQgPSB0ZXh0LmNoYXJDb2RlQXQocG9zaXRpb24gKyAxKTtcclxuICAgICAgICAgICAgaWYgKHNlY29uZCA+PSBMT1dfU1VSUk9HQVRFX01JTiAmJiBzZWNvbmQgPD0gTE9XX1NVUlJPR0FURV9NQVgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAoZmlyc3QgLSBISUdIX1NVUlJPR0FURV9NSU4pICogMHg0MDAgKyBzZWNvbmQgLSBMT1dfU1VSUk9HQVRFX01JTiArIDB4MTAwMDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZpcnN0O1xyXG4gICAgfTtcclxuICAgIGVuZHNXaXRoID0gZnVuY3Rpb24gZW5kc1dpdGgodGV4dCwgc2VhcmNoLCBlbmRQb3NpdGlvbikge1xyXG4gICAgICAgIGlmIChlbmRQb3NpdGlvbiA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGVuZFBvc2l0aW9uID0gdGV4dC5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFt0ZXh0LCBzZWFyY2gsIGVuZFBvc2l0aW9uXSA9IG5vcm1hbGl6ZVN1YnN0cmluZ0FyZ3MoJ2VuZHNXaXRoJywgdGV4dCwgc2VhcmNoLCBlbmRQb3NpdGlvbiwgdHJ1ZSk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBlbmRQb3NpdGlvbiAtIHNlYXJjaC5sZW5ndGg7XHJcbiAgICAgICAgaWYgKHN0YXJ0IDwgMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKHN0YXJ0LCBlbmRQb3NpdGlvbikgPT09IHNlYXJjaDtcclxuICAgIH07XHJcbiAgICBpbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzKHRleHQsIHNlYXJjaCwgcG9zaXRpb24gPSAwKSB7XHJcbiAgICAgICAgW3RleHQsIHNlYXJjaCwgcG9zaXRpb25dID0gbm9ybWFsaXplU3Vic3RyaW5nQXJncygnaW5jbHVkZXMnLCB0ZXh0LCBzZWFyY2gsIHBvc2l0aW9uKTtcclxuICAgICAgICByZXR1cm4gdGV4dC5pbmRleE9mKHNlYXJjaCwgcG9zaXRpb24pICE9PSAtMTtcclxuICAgIH07XHJcbiAgICByZXBlYXQgPSBmdW5jdGlvbiByZXBlYXQodGV4dCwgY291bnQgPSAwKSB7XHJcbiAgICAgICAgLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUucmVwZWF0XHJcbiAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJpbmcucmVwZWF0IHJlcXVpcmVzIGEgdmFsaWQgc3RyaW5nLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY291bnQgIT09IGNvdW50KSB7XHJcbiAgICAgICAgICAgIGNvdW50ID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvdW50IDwgMCB8fCBjb3VudCA9PT0gSW5maW5pdHkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3N0cmluZy5yZXBlYXQgcmVxdWlyZXMgYSBub24tbmVnYXRpdmUgZmluaXRlIGNvdW50LicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcmVzdWx0ID0gJyc7XHJcbiAgICAgICAgd2hpbGUgKGNvdW50KSB7XHJcbiAgICAgICAgICAgIGlmIChjb3VudCAlIDIpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSB0ZXh0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjb3VudCA+IDEpIHtcclxuICAgICAgICAgICAgICAgIHRleHQgKz0gdGV4dDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb3VudCA+Pj0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcbiAgICBzdGFydHNXaXRoID0gZnVuY3Rpb24gc3RhcnRzV2l0aCh0ZXh0LCBzZWFyY2gsIHBvc2l0aW9uID0gMCkge1xyXG4gICAgICAgIHNlYXJjaCA9IFN0cmluZyhzZWFyY2gpO1xyXG4gICAgICAgIFt0ZXh0LCBzZWFyY2gsIHBvc2l0aW9uXSA9IG5vcm1hbGl6ZVN1YnN0cmluZ0FyZ3MoJ3N0YXJ0c1dpdGgnLCB0ZXh0LCBzZWFyY2gsIHBvc2l0aW9uKTtcclxuICAgICAgICBjb25zdCBlbmQgPSBwb3NpdGlvbiArIHNlYXJjaC5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGVuZCA+IHRleHQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRleHQuc2xpY2UocG9zaXRpb24sIGVuZCkgPT09IHNlYXJjaDtcclxuICAgIH07XHJcbn1cclxuaWYgKHRydWUpIHtcclxuICAgIHBhZEVuZCA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUucGFkRW5kKTtcclxuICAgIHBhZFN0YXJ0ID0gd3JhcE5hdGl2ZShnbG9iYWwuU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydCk7XHJcbn1cclxuZWxzZSB7XHJcbiAgICBwYWRFbmQgPSBmdW5jdGlvbiBwYWRFbmQodGV4dCwgbWF4TGVuZ3RoLCBmaWxsU3RyaW5nID0gJyAnKSB7XHJcbiAgICAgICAgaWYgKHRleHQgPT09IG51bGwgfHwgdGV4dCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmluZy5yZXBlYXQgcmVxdWlyZXMgYSB2YWxpZCBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtYXhMZW5ndGggPT09IEluZmluaXR5KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdzdHJpbmcucGFkRW5kIHJlcXVpcmVzIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSBjb3VudC4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1heExlbmd0aCA9PT0gbnVsbCB8fCBtYXhMZW5ndGggPT09IHVuZGVmaW5lZCB8fCBtYXhMZW5ndGggPCAwKSB7XHJcbiAgICAgICAgICAgIG1heExlbmd0aCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBzdHJUZXh0ID0gU3RyaW5nKHRleHQpO1xyXG4gICAgICAgIGNvbnN0IHBhZGRpbmcgPSBtYXhMZW5ndGggLSBzdHJUZXh0Lmxlbmd0aDtcclxuICAgICAgICBpZiAocGFkZGluZyA+IDApIHtcclxuICAgICAgICAgICAgc3RyVGV4dCArPVxyXG4gICAgICAgICAgICAgICAgcmVwZWF0KGZpbGxTdHJpbmcsIE1hdGguZmxvb3IocGFkZGluZyAvIGZpbGxTdHJpbmcubGVuZ3RoKSkgK1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbGxTdHJpbmcuc2xpY2UoMCwgcGFkZGluZyAlIGZpbGxTdHJpbmcubGVuZ3RoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0clRleHQ7XHJcbiAgICB9O1xyXG4gICAgcGFkU3RhcnQgPSBmdW5jdGlvbiBwYWRTdGFydCh0ZXh0LCBtYXhMZW5ndGgsIGZpbGxTdHJpbmcgPSAnICcpIHtcclxuICAgICAgICBpZiAodGV4dCA9PT0gbnVsbCB8fCB0ZXh0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RyaW5nLnJlcGVhdCByZXF1aXJlcyBhIHZhbGlkIHN0cmluZy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1heExlbmd0aCA9PT0gSW5maW5pdHkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3N0cmluZy5wYWRTdGFydCByZXF1aXJlcyBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgY291bnQuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtYXhMZW5ndGggPT09IG51bGwgfHwgbWF4TGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbWF4TGVuZ3RoIDwgMCkge1xyXG4gICAgICAgICAgICBtYXhMZW5ndGggPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgc3RyVGV4dCA9IFN0cmluZyh0ZXh0KTtcclxuICAgICAgICBjb25zdCBwYWRkaW5nID0gbWF4TGVuZ3RoIC0gc3RyVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgaWYgKHBhZGRpbmcgPiAwKSB7XHJcbiAgICAgICAgICAgIHN0clRleHQgPVxyXG4gICAgICAgICAgICAgICAgcmVwZWF0KGZpbGxTdHJpbmcsIE1hdGguZmxvb3IocGFkZGluZyAvIGZpbGxTdHJpbmcubGVuZ3RoKSkgK1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbGxTdHJpbmcuc2xpY2UoMCwgcGFkZGluZyAlIGZpbGxTdHJpbmcubGVuZ3RoKSArXHJcbiAgICAgICAgICAgICAgICAgICAgc3RyVGV4dDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0clRleHQ7XHJcbiAgICB9O1xyXG59XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmluZy5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vc3RyaW5nLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vc3RyaW5nLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBoYXMsIHsgYWRkIH0gZnJvbSAnLi4vLi4vaGFzL2hhcyc7XHJcbmltcG9ydCBnbG9iYWwgZnJvbSAnLi4vZ2xvYmFsJztcclxuZXhwb3J0IGRlZmF1bHQgaGFzO1xyXG5leHBvcnQgKiBmcm9tICcuLi8uLi9oYXMvaGFzJztcclxuLyogRUNNQVNjcmlwdCA2IGFuZCA3IEZlYXR1cmVzICovXHJcbi8qIEFycmF5ICovXHJcbmFkZCgnZXM2LWFycmF5JywgKCkgPT4ge1xyXG4gICAgcmV0dXJuIChbJ2Zyb20nLCAnb2YnXS5ldmVyeSgoa2V5KSA9PiBrZXkgaW4gZ2xvYmFsLkFycmF5KSAmJlxyXG4gICAgICAgIFsnZmluZEluZGV4JywgJ2ZpbmQnLCAnY29weVdpdGhpbiddLmV2ZXJ5KChrZXkpID0+IGtleSBpbiBnbG9iYWwuQXJyYXkucHJvdG90eXBlKSk7XHJcbn0sIHRydWUpO1xyXG5hZGQoJ2VzNi1hcnJheS1maWxsJywgKCkgPT4ge1xyXG4gICAgaWYgKCdmaWxsJyBpbiBnbG9iYWwuQXJyYXkucHJvdG90eXBlKSB7XHJcbiAgICAgICAgLyogU29tZSB2ZXJzaW9ucyBvZiBTYWZhcmkgZG8gbm90IHByb3Blcmx5IGltcGxlbWVudCB0aGlzICovXHJcbiAgICAgICAgcmV0dXJuIFsxXS5maWxsKDksIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSlbMF0gPT09IDE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn0sIHRydWUpO1xyXG5hZGQoJ2VzNy1hcnJheScsICgpID0+ICdpbmNsdWRlcycgaW4gZ2xvYmFsLkFycmF5LnByb3RvdHlwZSwgdHJ1ZSk7XHJcbi8qIE1hcCAqL1xyXG5hZGQoJ2VzNi1tYXAnLCAoKSA9PiB7XHJcbiAgICBpZiAodHlwZW9mIGdsb2JhbC5NYXAgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAvKlxyXG4gICAgSUUxMSBhbmQgb2xkZXIgdmVyc2lvbnMgb2YgU2FmYXJpIGFyZSBtaXNzaW5nIGNyaXRpY2FsIEVTNiBNYXAgZnVuY3Rpb25hbGl0eVxyXG4gICAgV2Ugd3JhcCB0aGlzIGluIGEgdHJ5L2NhdGNoIGJlY2F1c2Ugc29tZXRpbWVzIHRoZSBNYXAgY29uc3RydWN0b3IgZXhpc3RzLCBidXQgZG9lcyBub3RcclxuICAgIHRha2UgYXJndW1lbnRzIChpT1MgOC40KVxyXG4gICAgICovXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgbWFwID0gbmV3IGdsb2JhbC5NYXAoW1swLCAxXV0pO1xyXG4gICAgICAgICAgICByZXR1cm4gbWFwLmhhcygwKSAmJlxyXG4gICAgICAgICAgICAgICAgdHlwZW9mIG1hcC5rZXlzID09PSAnZnVuY3Rpb24nICYmXHJcbiAgICAgICAgICAgICAgICB0cnVlICYmXHJcbiAgICAgICAgICAgICAgICB0eXBlb2YgbWFwLnZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyAmJlxyXG4gICAgICAgICAgICAgICAgdHlwZW9mIG1hcC5lbnRyaWVzID09PSAnZnVuY3Rpb24nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogbm90IHRlc3Rpbmcgb24gaU9TIGF0IHRoZSBtb21lbnQgKi9cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxufSwgdHJ1ZSk7XHJcbi8qIE1hdGggKi9cclxuYWRkKCdlczYtbWF0aCcsICgpID0+IHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgICAgJ2NsejMyJyxcclxuICAgICAgICAnc2lnbicsXHJcbiAgICAgICAgJ2xvZzEwJyxcclxuICAgICAgICAnbG9nMicsXHJcbiAgICAgICAgJ2xvZzFwJyxcclxuICAgICAgICAnZXhwbTEnLFxyXG4gICAgICAgICdjb3NoJyxcclxuICAgICAgICAnc2luaCcsXHJcbiAgICAgICAgJ3RhbmgnLFxyXG4gICAgICAgICdhY29zaCcsXHJcbiAgICAgICAgJ2FzaW5oJyxcclxuICAgICAgICAnYXRhbmgnLFxyXG4gICAgICAgICd0cnVuYycsXHJcbiAgICAgICAgJ2Zyb3VuZCcsXHJcbiAgICAgICAgJ2NicnQnLFxyXG4gICAgICAgICdoeXBvdCdcclxuICAgIF0uZXZlcnkoKG5hbWUpID0+IHR5cGVvZiBnbG9iYWwuTWF0aFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJyk7XHJcbn0sIHRydWUpO1xyXG5hZGQoJ2VzNi1tYXRoLWltdWwnLCAoKSA9PiB7XHJcbiAgICBpZiAoJ2ltdWwnIGluIGdsb2JhbC5NYXRoKSB7XHJcbiAgICAgICAgLyogU29tZSB2ZXJzaW9ucyBvZiBTYWZhcmkgb24gaW9zIGRvIG5vdCBwcm9wZXJseSBpbXBsZW1lbnQgdGhpcyAqL1xyXG4gICAgICAgIHJldHVybiBNYXRoLmltdWwoMHhmZmZmZmZmZiwgNSkgPT09IC01O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59LCB0cnVlKTtcclxuLyogT2JqZWN0ICovXHJcbmFkZCgnZXM2LW9iamVjdCcsICgpID0+IHtcclxuICAgIHJldHVybiB0cnVlICYmXHJcbiAgICAgICAgWydhc3NpZ24nLCAnaXMnLCAnZ2V0T3duUHJvcGVydHlTeW1ib2xzJywgJ3NldFByb3RvdHlwZU9mJ10uZXZlcnkoKG5hbWUpID0+IHR5cGVvZiBnbG9iYWwuT2JqZWN0W25hbWVdID09PSAnZnVuY3Rpb24nKTtcclxufSwgdHJ1ZSk7XHJcbmFkZCgnZXMyMDE3LW9iamVjdCcsICgpID0+IHtcclxuICAgIHJldHVybiBbJ3ZhbHVlcycsICdlbnRyaWVzJywgJ2dldE93blByb3BlcnR5RGVzY3JpcHRvcnMnXS5ldmVyeSgobmFtZSkgPT4gdHlwZW9mIGdsb2JhbC5PYmplY3RbbmFtZV0gPT09ICdmdW5jdGlvbicpO1xyXG59LCB0cnVlKTtcclxuLyogT2JzZXJ2YWJsZSAqL1xyXG5hZGQoJ2VzLW9ic2VydmFibGUnLCAoKSA9PiB0eXBlb2YgZ2xvYmFsLk9ic2VydmFibGUgIT09ICd1bmRlZmluZWQnLCB0cnVlKTtcclxuLyogUHJvbWlzZSAqL1xyXG5hZGQoJ2VzNi1wcm9taXNlJywgKCkgPT4gdHlwZW9mIGdsb2JhbC5Qcm9taXNlICE9PSAndW5kZWZpbmVkJyAmJiB0cnVlLCB0cnVlKTtcclxuLyogU2V0ICovXHJcbmFkZCgnZXM2LXNldCcsICgpID0+IHtcclxuICAgIGlmICh0eXBlb2YgZ2xvYmFsLlNldCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIC8qIElFMTEgYW5kIG9sZGVyIHZlcnNpb25zIG9mIFNhZmFyaSBhcmUgbWlzc2luZyBjcml0aWNhbCBFUzYgU2V0IGZ1bmN0aW9uYWxpdHkgKi9cclxuICAgICAgICBjb25zdCBzZXQgPSBuZXcgZ2xvYmFsLlNldChbMV0pO1xyXG4gICAgICAgIHJldHVybiBzZXQuaGFzKDEpICYmICdrZXlzJyBpbiBzZXQgJiYgdHlwZW9mIHNldC5rZXlzID09PSAnZnVuY3Rpb24nICYmIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn0sIHRydWUpO1xyXG4vKiBTdHJpbmcgKi9cclxuYWRkKCdlczYtc3RyaW5nJywgKCkgPT4ge1xyXG4gICAgcmV0dXJuIChbXHJcbiAgICAgICAgLyogc3RhdGljIG1ldGhvZHMgKi9cclxuICAgICAgICAnZnJvbUNvZGVQb2ludCdcclxuICAgIF0uZXZlcnkoKGtleSkgPT4gdHlwZW9mIGdsb2JhbC5TdHJpbmdba2V5XSA9PT0gJ2Z1bmN0aW9uJykgJiZcclxuICAgICAgICBbXHJcbiAgICAgICAgICAgIC8qIGluc3RhbmNlIG1ldGhvZHMgKi9cclxuICAgICAgICAgICAgJ2NvZGVQb2ludEF0JyxcclxuICAgICAgICAgICAgJ25vcm1hbGl6ZScsXHJcbiAgICAgICAgICAgICdyZXBlYXQnLFxyXG4gICAgICAgICAgICAnc3RhcnRzV2l0aCcsXHJcbiAgICAgICAgICAgICdlbmRzV2l0aCcsXHJcbiAgICAgICAgICAgICdpbmNsdWRlcydcclxuICAgICAgICBdLmV2ZXJ5KChrZXkpID0+IHR5cGVvZiBnbG9iYWwuU3RyaW5nLnByb3RvdHlwZVtrZXldID09PSAnZnVuY3Rpb24nKSk7XHJcbn0sIHRydWUpO1xyXG5hZGQoJ2VzNi1zdHJpbmctcmF3JywgKCkgPT4ge1xyXG4gICAgZnVuY3Rpb24gZ2V0Q2FsbFNpdGUoY2FsbFNpdGUsIC4uLnN1YnN0aXR1dGlvbnMpIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBbLi4uY2FsbFNpdGVdO1xyXG4gICAgICAgIHJlc3VsdC5yYXcgPSBjYWxsU2l0ZS5yYXc7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIGlmICgncmF3JyBpbiBnbG9iYWwuU3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IGIgPSAxO1xyXG4gICAgICAgIGxldCBjYWxsU2l0ZSA9IGdldENhbGxTaXRlIGBhXFxuJHtifWA7XHJcbiAgICAgICAgY2FsbFNpdGUucmF3ID0gWydhXFxcXG4nXTtcclxuICAgICAgICBjb25zdCBzdXBwb3J0c1RydW5jID0gZ2xvYmFsLlN0cmluZy5yYXcoY2FsbFNpdGUsIDQyKSA9PT0gJ2E6XFxcXG4nO1xyXG4gICAgICAgIHJldHVybiBzdXBwb3J0c1RydW5jO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59LCB0cnVlKTtcclxuYWRkKCdlczIwMTctc3RyaW5nJywgKCkgPT4ge1xyXG4gICAgcmV0dXJuIFsncGFkU3RhcnQnLCAncGFkRW5kJ10uZXZlcnkoKGtleSkgPT4gdHlwZW9mIGdsb2JhbC5TdHJpbmcucHJvdG90eXBlW2tleV0gPT09ICdmdW5jdGlvbicpO1xyXG59LCB0cnVlKTtcclxuLyogU3ltYm9sICovXHJcbmFkZCgnZXM2LXN5bWJvbCcsICgpID0+IHR5cGVvZiBnbG9iYWwuU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgU3ltYm9sKCkgPT09ICdzeW1ib2wnLCB0cnVlKTtcclxuLyogV2Vha01hcCAqL1xyXG5hZGQoJ2VzNi13ZWFrbWFwJywgKCkgPT4ge1xyXG4gICAgaWYgKHR5cGVvZiBnbG9iYWwuV2Vha01hcCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAvKiBJRTExIGFuZCBvbGRlciB2ZXJzaW9ucyBvZiBTYWZhcmkgYXJlIG1pc3NpbmcgY3JpdGljYWwgRVM2IE1hcCBmdW5jdGlvbmFsaXR5ICovXHJcbiAgICAgICAgY29uc3Qga2V5MSA9IHt9O1xyXG4gICAgICAgIGNvbnN0IGtleTIgPSB7fTtcclxuICAgICAgICBjb25zdCBtYXAgPSBuZXcgZ2xvYmFsLldlYWtNYXAoW1trZXkxLCAxXV0pO1xyXG4gICAgICAgIE9iamVjdC5mcmVlemUoa2V5MSk7XHJcbiAgICAgICAgcmV0dXJuIG1hcC5nZXQoa2V5MSkgPT09IDEgJiYgbWFwLnNldChrZXkyLCAyKSA9PT0gbWFwICYmIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn0sIHRydWUpO1xyXG4vKiBNaXNjZWxsYW5lb3VzIGZlYXR1cmVzICovXHJcbmFkZCgnbWljcm90YXNrcycsICgpID0+IHRydWUgfHwgZmFsc2UgfHwgdHJ1ZSwgdHJ1ZSk7XHJcbmFkZCgncG9zdG1lc3NhZ2UnLCAoKSA9PiB7XHJcbiAgICAvLyBJZiB3aW5kb3cgaXMgdW5kZWZpbmVkLCBhbmQgd2UgaGF2ZSBwb3N0TWVzc2FnZSwgaXQgcHJvYmFibHkgbWVhbnMgd2UncmUgaW4gYSB3ZWIgd29ya2VyLiBXZWIgd29ya2VycyBoYXZlXHJcbiAgICAvLyBwb3N0IG1lc3NhZ2UgYnV0IGl0IGRvZXNuJ3Qgd29yayBob3cgd2UgZXhwZWN0IGl0IHRvLCBzbyBpdCdzIGJlc3QganVzdCB0byBwcmV0ZW5kIGl0IGRvZXNuJ3QgZXhpc3QuXHJcbiAgICByZXR1cm4gdHlwZW9mIGdsb2JhbC53aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBnbG9iYWwucG9zdE1lc3NhZ2UgPT09ICdmdW5jdGlvbic7XHJcbn0sIHRydWUpO1xyXG5hZGQoJ3JhZicsICgpID0+IHR5cGVvZiBnbG9iYWwucmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nLCB0cnVlKTtcclxuYWRkKCdzZXRpbW1lZGlhdGUnLCAoKSA9PiB0eXBlb2YgZ2xvYmFsLnNldEltbWVkaWF0ZSAhPT0gJ3VuZGVmaW5lZCcsIHRydWUpO1xyXG4vKiBET00gRmVhdHVyZXMgKi9cclxuYWRkKCdkb20tbXV0YXRpb25vYnNlcnZlcicsICgpID0+IHtcclxuICAgIGlmICh0cnVlICYmIEJvb2xlYW4oZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXIpKSB7XHJcbiAgICAgICAgLy8gSUUxMSBoYXMgYW4gdW5yZWxpYWJsZSBNdXRhdGlvbk9ic2VydmVyIGltcGxlbWVudGF0aW9uIHdoZXJlIHNldFByb3BlcnR5KCkgZG9lcyBub3RcclxuICAgICAgICAvLyBnZW5lcmF0ZSBhIG11dGF0aW9uIGV2ZW50LCBvYnNlcnZlcnMgY2FuIGNyYXNoLCBhbmQgdGhlIHF1ZXVlIGRvZXMgbm90IGRyYWluXHJcbiAgICAgICAgLy8gcmVsaWFibHkuIFRoZSBmb2xsb3dpbmcgZmVhdHVyZSB0ZXN0IHdhcyBhZGFwdGVkIGZyb21cclxuICAgICAgICAvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS90MTBrby80YWNlYjhjNzE2ODFmZGIyNzVlMzNlZmU1ZTU3NmIxNFxyXG4gICAgICAgIGNvbnN0IGV4YW1wbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZSAqL1xyXG4gICAgICAgIGNvbnN0IEhvc3RNdXRhdGlvbk9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XHJcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSG9zdE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKCkgeyB9KTtcclxuICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGV4YW1wbGUsIHsgYXR0cmlidXRlczogdHJ1ZSB9KTtcclxuICAgICAgICBleGFtcGxlLnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywgJ2Jsb2NrJyk7XHJcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4ob2JzZXJ2ZXIudGFrZVJlY29yZHMoKS5sZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59LCB0cnVlKTtcclxuYWRkKCdkb20td2ViYW5pbWF0aW9uJywgKCkgPT4gdHJ1ZSAmJiBnbG9iYWwuQW5pbWF0aW9uICE9PSB1bmRlZmluZWQgJiYgZ2xvYmFsLktleWZyYW1lRWZmZWN0ICE9PSB1bmRlZmluZWQsIHRydWUpO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXMubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL3N1cHBvcnQvaGFzLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vc3VwcG9ydC9oYXMubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IGdsb2JhbCBmcm9tICcuLi9nbG9iYWwnO1xyXG5pbXBvcnQgaGFzIGZyb20gJy4vaGFzJztcclxuZnVuY3Rpb24gZXhlY3V0ZVRhc2soaXRlbSkge1xyXG4gICAgaWYgKGl0ZW0gJiYgaXRlbS5pc0FjdGl2ZSAmJiBpdGVtLmNhbGxiYWNrKSB7XHJcbiAgICAgICAgaXRlbS5jYWxsYmFjaygpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGdldFF1ZXVlSGFuZGxlKGl0ZW0sIGRlc3RydWN0b3IpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7IH07XHJcbiAgICAgICAgICAgIGl0ZW0uaXNBY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgaXRlbS5jYWxsYmFjayA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmIChkZXN0cnVjdG9yKSB7XHJcbiAgICAgICAgICAgICAgICBkZXN0cnVjdG9yKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcbmxldCBjaGVja01pY3JvVGFza1F1ZXVlO1xyXG5sZXQgbWljcm9UYXNrcztcclxuLyoqXHJcbiAqIFNjaGVkdWxlcyBhIGNhbGxiYWNrIHRvIHRoZSBtYWNyb3Rhc2sgcXVldWUuXHJcbiAqXHJcbiAqIEBwYXJhbSBjYWxsYmFjayB0aGUgZnVuY3Rpb24gdG8gYmUgcXVldWVkIGFuZCBsYXRlciBleGVjdXRlZC5cclxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggYSBgZGVzdHJveWAgbWV0aG9kIHRoYXQsIHdoZW4gY2FsbGVkLCBwcmV2ZW50cyB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmcm9tIGV4ZWN1dGluZy5cclxuICovXHJcbmV4cG9ydCBjb25zdCBxdWV1ZVRhc2sgPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgbGV0IGRlc3RydWN0b3I7XHJcbiAgICBsZXQgZW5xdWV1ZTtcclxuICAgIC8vIFNpbmNlIHRoZSBJRSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0SW1tZWRpYXRlYCBpcyBub3QgZmxhd2xlc3MsIHdlIHdpbGwgdGVzdCBmb3IgYHBvc3RNZXNzYWdlYCBmaXJzdC5cclxuICAgIGlmICh0cnVlKSB7XHJcbiAgICAgICAgY29uc3QgcXVldWUgPSBbXTtcclxuICAgICAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAvLyBDb25maXJtIHRoYXQgdGhlIGV2ZW50IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIGN1cnJlbnQgd2luZG93IGFuZCBieSB0aGlzIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24uXHJcbiAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2UgPT09IGdsb2JhbCAmJiBldmVudC5kYXRhID09PSAnZG9qby1xdWV1ZS1tZXNzYWdlJykge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocXVldWUubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVRhc2socXVldWUuc2hpZnQoKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBlbnF1ZXVlID0gZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgcXVldWUucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKCdkb2pvLXF1ZXVlLW1lc3NhZ2UnLCAnKicpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChmYWxzZSkge1xyXG4gICAgICAgIGRlc3RydWN0b3IgPSBnbG9iYWwuY2xlYXJJbW1lZGlhdGU7XHJcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzZXRJbW1lZGlhdGUoZXhlY3V0ZVRhc2suYmluZChudWxsLCBpdGVtKSk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGRlc3RydWN0b3IgPSBnbG9iYWwuY2xlYXJUaW1lb3V0O1xyXG4gICAgICAgIGVucXVldWUgPSBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gc2V0VGltZW91dChleGVjdXRlVGFzay5iaW5kKG51bGwsIGl0ZW0pLCAwKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcXVldWVUYXNrKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHtcclxuICAgICAgICAgICAgaXNBY3RpdmU6IHRydWUsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgaWQgPSBlbnF1ZXVlKGl0ZW0pO1xyXG4gICAgICAgIHJldHVybiBnZXRRdWV1ZUhhbmRsZShpdGVtLCBkZXN0cnVjdG9yICYmXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGRlc3RydWN0b3IoaWQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vIFRPRE86IFVzZSBhc3BlY3QuYmVmb3JlIHdoZW4gaXQgaXMgYXZhaWxhYmxlLlxyXG4gICAgcmV0dXJuIHRydWVcclxuICAgICAgICA/IHF1ZXVlVGFza1xyXG4gICAgICAgIDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIGNoZWNrTWljcm9UYXNrUXVldWUoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlVGFzayhjYWxsYmFjayk7XHJcbiAgICAgICAgfTtcclxufSkoKTtcclxuLy8gV2hlbiBubyBtZWNoYW5pc20gZm9yIHJlZ2lzdGVyaW5nIG1pY3JvdGFza3MgaXMgZXhwb3NlZCBieSB0aGUgZW52aXJvbm1lbnQsIG1pY3JvdGFza3Mgd2lsbFxyXG4vLyBiZSBxdWV1ZWQgYW5kIHRoZW4gZXhlY3V0ZWQgaW4gYSBzaW5nbGUgbWFjcm90YXNrIGJlZm9yZSB0aGUgb3RoZXIgbWFjcm90YXNrcyBhcmUgZXhlY3V0ZWQuXHJcbmlmICghdHJ1ZSkge1xyXG4gICAgbGV0IGlzTWljcm9UYXNrUXVldWVkID0gZmFsc2U7XHJcbiAgICBtaWNyb1Rhc2tzID0gW107XHJcbiAgICBjaGVja01pY3JvVGFza1F1ZXVlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICghaXNNaWNyb1Rhc2tRdWV1ZWQpIHtcclxuICAgICAgICAgICAgaXNNaWNyb1Rhc2tRdWV1ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBxdWV1ZVRhc2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaXNNaWNyb1Rhc2tRdWV1ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGlmIChtaWNyb1Rhc2tzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICgoaXRlbSA9IG1pY3JvVGFza3Muc2hpZnQoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVRhc2soaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcbi8qKlxyXG4gKiBTY2hlZHVsZXMgYW4gYW5pbWF0aW9uIHRhc2sgd2l0aCBgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZWAgaWYgaXQgZXhpc3RzLCBvciB3aXRoIGBxdWV1ZVRhc2tgIG90aGVyd2lzZS5cclxuICpcclxuICogU2luY2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lJ3MgYmVoYXZpb3IgZG9lcyBub3QgbWF0Y2ggdGhhdCBleHBlY3RlZCBmcm9tIGBxdWV1ZVRhc2tgLCBpdCBpcyBub3QgdXNlZCB0aGVyZS5cclxuICogSG93ZXZlciwgYXQgdGltZXMgaXQgbWFrZXMgbW9yZSBzZW5zZSB0byBkZWxlZ2F0ZSB0byByZXF1ZXN0QW5pbWF0aW9uRnJhbWU7IGhlbmNlIHRoZSBmb2xsb3dpbmcgbWV0aG9kLlxyXG4gKlxyXG4gKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGJlIHF1ZXVlZCBhbmQgbGF0ZXIgZXhlY3V0ZWQuXHJcbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIGEgYGRlc3Ryb3lgIG1ldGhvZCB0aGF0LCB3aGVuIGNhbGxlZCwgcHJldmVudHMgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnJvbSBleGVjdXRpbmcuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcXVldWVBbmltYXRpb25UYXNrID0gKGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICghdHJ1ZSkge1xyXG4gICAgICAgIHJldHVybiBxdWV1ZVRhc2s7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBxdWV1ZUFuaW1hdGlvblRhc2soY2FsbGJhY2spIHtcclxuICAgICAgICBjb25zdCBpdGVtID0ge1xyXG4gICAgICAgICAgICBpc0FjdGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCByYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShleGVjdXRlVGFzay5iaW5kKG51bGwsIGl0ZW0pKTtcclxuICAgICAgICByZXR1cm4gZ2V0UXVldWVIYW5kbGUoaXRlbSwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShyYWZJZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvLyBUT0RPOiBVc2UgYXNwZWN0LmJlZm9yZSB3aGVuIGl0IGlzIGF2YWlsYWJsZS5cclxuICAgIHJldHVybiB0cnVlXHJcbiAgICAgICAgPyBxdWV1ZUFuaW1hdGlvblRhc2tcclxuICAgICAgICA6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xyXG4gICAgICAgICAgICBjaGVja01pY3JvVGFza1F1ZXVlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZUFuaW1hdGlvblRhc2soY2FsbGJhY2spO1xyXG4gICAgICAgIH07XHJcbn0pKCk7XHJcbi8qKlxyXG4gKiBTY2hlZHVsZXMgYSBjYWxsYmFjayB0byB0aGUgbWljcm90YXNrIHF1ZXVlLlxyXG4gKlxyXG4gKiBBbnkgY2FsbGJhY2tzIHJlZ2lzdGVyZWQgd2l0aCBgcXVldWVNaWNyb1Rhc2tgIHdpbGwgYmUgZXhlY3V0ZWQgYmVmb3JlIHRoZSBuZXh0IG1hY3JvdGFzay4gSWYgbm8gbmF0aXZlXHJcbiAqIG1lY2hhbmlzbSBmb3Igc2NoZWR1bGluZyBtYWNyb3Rhc2tzIGlzIGV4cG9zZWQsIHRoZW4gYW55IGNhbGxiYWNrcyB3aWxsIGJlIGZpcmVkIGJlZm9yZSBhbnkgbWFjcm90YXNrXHJcbiAqIHJlZ2lzdGVyZWQgd2l0aCBgcXVldWVUYXNrYCBvciBgcXVldWVBbmltYXRpb25UYXNrYC5cclxuICpcclxuICogQHBhcmFtIGNhbGxiYWNrIHRoZSBmdW5jdGlvbiB0byBiZSBxdWV1ZWQgYW5kIGxhdGVyIGV4ZWN1dGVkLlxyXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBhIGBkZXN0cm95YCBtZXRob2QgdGhhdCwgd2hlbiBjYWxsZWQsIHByZXZlbnRzIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZyb20gZXhlY3V0aW5nLlxyXG4gKi9cclxuZXhwb3J0IGxldCBxdWV1ZU1pY3JvVGFzayA9IChmdW5jdGlvbiAoKSB7XHJcbiAgICBsZXQgZW5xdWV1ZTtcclxuICAgIGlmIChmYWxzZSkge1xyXG4gICAgICAgIGVucXVldWUgPSBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICBnbG9iYWwucHJvY2Vzcy5uZXh0VGljayhleGVjdXRlVGFzay5iaW5kKG51bGwsIGl0ZW0pKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodHJ1ZSkge1xyXG4gICAgICAgIGVucXVldWUgPSBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICBnbG9iYWwuUHJvbWlzZS5yZXNvbHZlKGl0ZW0pLnRoZW4oZXhlY3V0ZVRhc2spO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0cnVlKSB7XHJcbiAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWUgKi9cclxuICAgICAgICBjb25zdCBIb3N0TXV0YXRpb25PYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xyXG4gICAgICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBjb25zdCBxdWV1ZSA9IFtdO1xyXG4gICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEhvc3RNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBxdWV1ZS5zaGlmdCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5pc0FjdGl2ZSAmJiBpdGVtLmNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5jYWxsYmFjaygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShub2RlLCB7IGF0dHJpYnV0ZXM6IHRydWUgfSk7XHJcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgIHF1ZXVlLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCdxdWV1ZVN0YXR1cycsICcxJyk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGVucXVldWUgPSBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICBjaGVja01pY3JvVGFza1F1ZXVlKCk7XHJcbiAgICAgICAgICAgIG1pY3JvVGFza3MucHVzaChpdGVtKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChjYWxsYmFjaykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB7XHJcbiAgICAgICAgICAgIGlzQWN0aXZlOiB0cnVlLFxyXG4gICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2tcclxuICAgICAgICB9O1xyXG4gICAgICAgIGVucXVldWUoaXRlbSk7XHJcbiAgICAgICAgcmV0dXJuIGdldFF1ZXVlSGFuZGxlKGl0ZW0pO1xyXG4gICAgfTtcclxufSkoKTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVldWUubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL3N1cHBvcnQvcXVldWUubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9zdXBwb3J0L3F1ZXVlLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsIi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGEgdmFsdWUgcHJvcGVydHkgZGVzY3JpcHRvclxuICpcbiAqIEBwYXJhbSB2YWx1ZSAgICAgICAgVGhlIHZhbHVlIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHNob3VsZCBiZSBzZXQgdG9cbiAqIEBwYXJhbSBlbnVtZXJhYmxlICAgSWYgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBlbnVtYmVyYWJsZSwgZGVmYXVsdHMgdG8gZmFsc2VcbiAqIEBwYXJhbSB3cml0YWJsZSAgICAgSWYgdGhlIHByb3BlcnR5IHNob3VsZCBiZSB3cml0YWJsZSwgZGVmYXVsdHMgdG8gdHJ1ZVxuICogQHBhcmFtIGNvbmZpZ3VyYWJsZSBJZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGNvbmZpZ3VyYWJsZSwgZGVmYXVsdHMgdG8gdHJ1ZVxuICogQHJldHVybiAgICAgICAgICAgICBUaGUgcHJvcGVydHkgZGVzY3JpcHRvciBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlRGVzY3JpcHRvcih2YWx1ZSwgZW51bWVyYWJsZSA9IGZhbHNlLCB3cml0YWJsZSA9IHRydWUsIGNvbmZpZ3VyYWJsZSA9IHRydWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIGVudW1lcmFibGU6IGVudW1lcmFibGUsXG4gICAgICAgIHdyaXRhYmxlOiB3cml0YWJsZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBjb25maWd1cmFibGVcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdyYXBOYXRpdmUobmF0aXZlRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmF0aXZlRnVuY3Rpb24uYXBwbHkodGFyZ2V0LCBhcmdzKTtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vc3VwcG9ydC91dGlsLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vc3VwcG9ydC91dGlsLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCB7IEV2ZW50ZWQgfSBmcm9tICcuLi9jb3JlL0V2ZW50ZWQnO1xuZXhwb3J0IGNsYXNzIEluamVjdG9yIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgY29uc3RydWN0b3IocGF5bG9hZCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9wYXlsb2FkID0gcGF5bG9hZDtcbiAgICB9XG4gICAgc2V0SW52YWxpZGF0b3IoaW52YWxpZGF0b3IpIHtcbiAgICAgICAgdGhpcy5faW52YWxpZGF0b3IgPSBpbnZhbGlkYXRvcjtcbiAgICB9XG4gICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGF5bG9hZDtcbiAgICB9XG4gICAgc2V0KHBheWxvYWQpIHtcbiAgICAgICAgdGhpcy5fcGF5bG9hZCA9IHBheWxvYWQ7XG4gICAgICAgIGlmICh0aGlzLl9pbnZhbGlkYXRvcikge1xuICAgICAgICAgICAgdGhpcy5faW52YWxpZGF0b3IoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IEluamVjdG9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5qZWN0b3IubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9JbmplY3Rvci5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9JbmplY3Rvci5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgeyBFdmVudGVkIH0gZnJvbSAnLi4vY29yZS9FdmVudGVkJztcclxuaW1wb3J0IE1hcCBmcm9tICcuLi9zaGltL01hcCc7XHJcbi8qKlxyXG4gKiBFbnVtIHRvIGlkZW50aWZ5IHRoZSB0eXBlIG9mIGV2ZW50LlxyXG4gKiBMaXN0ZW5pbmcgdG8gJ1Byb2plY3Rvcicgd2lsbCBub3RpZnkgd2hlbiBwcm9qZWN0b3IgaXMgY3JlYXRlZCBvciB1cGRhdGVkXHJcbiAqIExpc3RlbmluZyB0byAnV2lkZ2V0JyB3aWxsIG5vdGlmeSB3aGVuIHdpZGdldCByb290IGlzIGNyZWF0ZWQgb3IgdXBkYXRlZFxyXG4gKi9cclxuZXhwb3J0IHZhciBOb2RlRXZlbnRUeXBlO1xyXG4oZnVuY3Rpb24gKE5vZGVFdmVudFR5cGUpIHtcclxuICAgIE5vZGVFdmVudFR5cGVbXCJQcm9qZWN0b3JcIl0gPSBcIlByb2plY3RvclwiO1xyXG4gICAgTm9kZUV2ZW50VHlwZVtcIldpZGdldFwiXSA9IFwiV2lkZ2V0XCI7XHJcbn0pKE5vZGVFdmVudFR5cGUgfHwgKE5vZGVFdmVudFR5cGUgPSB7fSkpO1xyXG5leHBvcnQgY2xhc3MgTm9kZUhhbmRsZXIgZXh0ZW5kcyBFdmVudGVkIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5fbm9kZU1hcCA9IG5ldyBNYXAoKTtcclxuICAgIH1cclxuICAgIGdldChrZXkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbm9kZU1hcC5nZXQoa2V5KTtcclxuICAgIH1cclxuICAgIGhhcyhrZXkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbm9kZU1hcC5oYXMoa2V5KTtcclxuICAgIH1cclxuICAgIGFkZChlbGVtZW50LCBrZXkpIHtcclxuICAgICAgICB0aGlzLl9ub2RlTWFwLnNldChrZXksIGVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuZW1pdCh7IHR5cGU6IGtleSB9KTtcclxuICAgIH1cclxuICAgIGFkZFJvb3QoKSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KHsgdHlwZTogTm9kZUV2ZW50VHlwZS5XaWRnZXQgfSk7XHJcbiAgICB9XHJcbiAgICBhZGRQcm9qZWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KHsgdHlwZTogTm9kZUV2ZW50VHlwZS5Qcm9qZWN0b3IgfSk7XHJcbiAgICB9XHJcbiAgICBjbGVhcigpIHtcclxuICAgICAgICB0aGlzLl9ub2RlTWFwLmNsZWFyKCk7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgTm9kZUhhbmRsZXI7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vZGVIYW5kbGVyLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvTm9kZUhhbmRsZXIubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvTm9kZUhhbmRsZXIubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IFByb21pc2UgZnJvbSAnLi4vc2hpbS9Qcm9taXNlJztcclxuaW1wb3J0IE1hcCBmcm9tICcuLi9zaGltL01hcCc7XHJcbmltcG9ydCBTeW1ib2wgZnJvbSAnLi4vc2hpbS9TeW1ib2wnO1xyXG5pbXBvcnQgeyBFdmVudGVkIH0gZnJvbSAnLi4vY29yZS9FdmVudGVkJztcclxuLyoqXHJcbiAqIFdpZGdldCBiYXNlIHN5bWJvbCB0eXBlXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgV0lER0VUX0JBU0VfVFlQRSA9IFN5bWJvbCgnV2lkZ2V0IEJhc2UnKTtcclxuLyoqXHJcbiAqIENoZWNrcyBpcyB0aGUgaXRlbSBpcyBhIHN1YmNsYXNzIG9mIFdpZGdldEJhc2UgKG9yIGEgV2lkZ2V0QmFzZSlcclxuICpcclxuICogQHBhcmFtIGl0ZW0gdGhlIGl0ZW0gdG8gY2hlY2tcclxuICogQHJldHVybnMgdHJ1ZS9mYWxzZSBpbmRpY2F0aW5nIGlmIHRoZSBpdGVtIGlzIGEgV2lkZ2V0QmFzZUNvbnN0cnVjdG9yXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IoaXRlbSkge1xyXG4gICAgcmV0dXJuIEJvb2xlYW4oaXRlbSAmJiBpdGVtLl90eXBlID09PSBXSURHRVRfQkFTRV9UWVBFKTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gaXNXaWRnZXRDb25zdHJ1Y3RvckRlZmF1bHRFeHBvcnQoaXRlbSkge1xyXG4gICAgcmV0dXJuIEJvb2xlYW4oaXRlbSAmJlxyXG4gICAgICAgIGl0ZW0uaGFzT3duUHJvcGVydHkoJ19fZXNNb2R1bGUnKSAmJlxyXG4gICAgICAgIGl0ZW0uaGFzT3duUHJvcGVydHkoJ2RlZmF1bHQnKSAmJlxyXG4gICAgICAgIGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yKGl0ZW0uZGVmYXVsdCkpO1xyXG59XHJcbi8qKlxyXG4gKiBUaGUgUmVnaXN0cnkgaW1wbGVtZW50YXRpb25cclxuICovXHJcbmV4cG9ydCBjbGFzcyBSZWdpc3RyeSBleHRlbmRzIEV2ZW50ZWQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0IGxvYWRlZCBldmVudCBmb3IgcmVnaXN0cnkgbGFiZWxcclxuICAgICAqL1xyXG4gICAgZW1pdExvYWRlZEV2ZW50KHdpZGdldExhYmVsLCBpdGVtKSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KHtcclxuICAgICAgICAgICAgdHlwZTogd2lkZ2V0TGFiZWwsXHJcbiAgICAgICAgICAgIGFjdGlvbjogJ2xvYWRlZCcsXHJcbiAgICAgICAgICAgIGl0ZW1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGRlZmluZShsYWJlbCwgaXRlbSkge1xyXG4gICAgICAgIGlmICh0aGlzLl93aWRnZXRSZWdpc3RyeSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dpZGdldFJlZ2lzdHJ5ID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fd2lkZ2V0UmVnaXN0cnkuaGFzKGxhYmVsKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHdpZGdldCBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgZm9yICcke2xhYmVsLnRvU3RyaW5nKCl9J2ApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl93aWRnZXRSZWdpc3RyeS5zZXQobGFiZWwsIGl0ZW0pO1xyXG4gICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgICBpdGVtLnRoZW4oKHdpZGdldEN0b3IpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3dpZGdldFJlZ2lzdHJ5LnNldChsYWJlbCwgd2lkZ2V0Q3Rvcik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRMb2FkZWRFdmVudChsYWJlbCwgd2lkZ2V0Q3Rvcik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gd2lkZ2V0Q3RvcjtcclxuICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdExvYWRlZEV2ZW50KGxhYmVsLCBpdGVtKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBkZWZpbmVJbmplY3RvcihsYWJlbCwgaW5qZWN0b3JGYWN0b3J5KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2luamVjdG9yUmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9pbmplY3RvclJlZ2lzdHJ5ID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5faW5qZWN0b3JSZWdpc3RyeS5oYXMobGFiZWwpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW5qZWN0b3IgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIGZvciAnJHtsYWJlbC50b1N0cmluZygpfSdgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaW52YWxpZGF0b3IgPSBuZXcgRXZlbnRlZCgpO1xyXG4gICAgICAgIGNvbnN0IGluamVjdG9ySXRlbSA9IHtcclxuICAgICAgICAgICAgaW5qZWN0b3I6IGluamVjdG9yRmFjdG9yeSgoKSA9PiBpbnZhbGlkYXRvci5lbWl0KHsgdHlwZTogJ2ludmFsaWRhdGUnIH0pKSxcclxuICAgICAgICAgICAgaW52YWxpZGF0b3JcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX2luamVjdG9yUmVnaXN0cnkuc2V0KGxhYmVsLCBpbmplY3Rvckl0ZW0pO1xyXG4gICAgICAgIHRoaXMuZW1pdExvYWRlZEV2ZW50KGxhYmVsLCBpbmplY3Rvckl0ZW0pO1xyXG4gICAgfVxyXG4gICAgZ2V0KGxhYmVsKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl93aWRnZXRSZWdpc3RyeSB8fCAhdGhpcy5oYXMobGFiZWwpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fd2lkZ2V0UmVnaXN0cnkuZ2V0KGxhYmVsKTtcclxuICAgICAgICBpZiAoaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IoaXRlbSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IGl0ZW0oKTtcclxuICAgICAgICB0aGlzLl93aWRnZXRSZWdpc3RyeS5zZXQobGFiZWwsIHByb21pc2UpO1xyXG4gICAgICAgIHByb21pc2UudGhlbigod2lkZ2V0Q3RvcikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaXNXaWRnZXRDb25zdHJ1Y3RvckRlZmF1bHRFeHBvcnQod2lkZ2V0Q3RvcikpIHtcclxuICAgICAgICAgICAgICAgIHdpZGdldEN0b3IgPSB3aWRnZXRDdG9yLmRlZmF1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fd2lkZ2V0UmVnaXN0cnkuc2V0KGxhYmVsLCB3aWRnZXRDdG9yKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0TG9hZGVkRXZlbnQobGFiZWwsIHdpZGdldEN0b3IpO1xyXG4gICAgICAgICAgICByZXR1cm4gd2lkZ2V0Q3RvcjtcclxuICAgICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBnZXRJbmplY3RvcihsYWJlbCkge1xyXG4gICAgICAgIGlmICghdGhpcy5faW5qZWN0b3JSZWdpc3RyeSB8fCAhdGhpcy5oYXNJbmplY3RvcihsYWJlbCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbmplY3RvclJlZ2lzdHJ5LmdldChsYWJlbCk7XHJcbiAgICB9XHJcbiAgICBoYXMobGFiZWwpIHtcclxuICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLl93aWRnZXRSZWdpc3RyeSAmJiB0aGlzLl93aWRnZXRSZWdpc3RyeS5oYXMobGFiZWwpKTtcclxuICAgIH1cclxuICAgIGhhc0luamVjdG9yKGxhYmVsKSB7XHJcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5faW5qZWN0b3JSZWdpc3RyeSAmJiB0aGlzLl9pbmplY3RvclJlZ2lzdHJ5LmhhcyhsYWJlbCkpO1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydCBkZWZhdWx0IFJlZ2lzdHJ5O1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWdpc3RyeS5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL1JlZ2lzdHJ5Lm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL1JlZ2lzdHJ5Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCB7IE1hcCB9IGZyb20gJy4uL3NoaW0vTWFwJztcclxuaW1wb3J0IHsgRXZlbnRlZCB9IGZyb20gJy4uL2NvcmUvRXZlbnRlZCc7XHJcbmltcG9ydCB7IFJlZ2lzdHJ5IH0gZnJvbSAnLi9SZWdpc3RyeSc7XHJcbmV4cG9ydCBjbGFzcyBSZWdpc3RyeUhhbmRsZXIgZXh0ZW5kcyBFdmVudGVkIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5fcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnkoKTtcclxuICAgICAgICB0aGlzLl9yZWdpc3RyeVdpZGdldExhYmVsTWFwID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIHRoaXMuX3JlZ2lzdHJ5SW5qZWN0b3JMYWJlbE1hcCA9IG5ldyBNYXAoKTtcclxuICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeSk7XHJcbiAgICAgICAgY29uc3QgZGVzdHJveSA9ICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYmFzZVJlZ2lzdHJ5KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RyeVdpZGdldExhYmVsTWFwLmRlbGV0ZSh0aGlzLmJhc2VSZWdpc3RyeSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RyeUluamVjdG9yTGFiZWxNYXAuZGVsZXRlKHRoaXMuYmFzZVJlZ2lzdHJ5KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmFzZVJlZ2lzdHJ5ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLm93bih7IGRlc3Ryb3kgfSk7XHJcbiAgICB9XHJcbiAgICBzZXQgYmFzZShiYXNlUmVnaXN0cnkpIHtcclxuICAgICAgICBpZiAodGhpcy5iYXNlUmVnaXN0cnkpIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnlXaWRnZXRMYWJlbE1hcC5kZWxldGUodGhpcy5iYXNlUmVnaXN0cnkpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZWdpc3RyeUluamVjdG9yTGFiZWxNYXAuZGVsZXRlKHRoaXMuYmFzZVJlZ2lzdHJ5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5iYXNlUmVnaXN0cnkgPSBiYXNlUmVnaXN0cnk7XHJcbiAgICB9XHJcbiAgICBkZWZpbmUobGFiZWwsIHdpZGdldCkge1xyXG4gICAgICAgIHRoaXMuX3JlZ2lzdHJ5LmRlZmluZShsYWJlbCwgd2lkZ2V0KTtcclxuICAgIH1cclxuICAgIGRlZmluZUluamVjdG9yKGxhYmVsLCBpbmplY3Rvcikge1xyXG4gICAgICAgIHRoaXMuX3JlZ2lzdHJ5LmRlZmluZUluamVjdG9yKGxhYmVsLCBpbmplY3Rvcik7XHJcbiAgICB9XHJcbiAgICBoYXMobGFiZWwpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVnaXN0cnkuaGFzKGxhYmVsKSB8fCBCb29sZWFuKHRoaXMuYmFzZVJlZ2lzdHJ5ICYmIHRoaXMuYmFzZVJlZ2lzdHJ5LmhhcyhsYWJlbCkpO1xyXG4gICAgfVxyXG4gICAgaGFzSW5qZWN0b3IobGFiZWwpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVnaXN0cnkuaGFzSW5qZWN0b3IobGFiZWwpIHx8IEJvb2xlYW4odGhpcy5iYXNlUmVnaXN0cnkgJiYgdGhpcy5iYXNlUmVnaXN0cnkuaGFzSW5qZWN0b3IobGFiZWwpKTtcclxuICAgIH1cclxuICAgIGdldChsYWJlbCwgZ2xvYmFsUHJlY2VkZW5jZSA9IGZhbHNlKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldChsYWJlbCwgZ2xvYmFsUHJlY2VkZW5jZSwgJ2dldCcsIHRoaXMuX3JlZ2lzdHJ5V2lkZ2V0TGFiZWxNYXApO1xyXG4gICAgfVxyXG4gICAgZ2V0SW5qZWN0b3IobGFiZWwsIGdsb2JhbFByZWNlZGVuY2UgPSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXQobGFiZWwsIGdsb2JhbFByZWNlZGVuY2UsICdnZXRJbmplY3RvcicsIHRoaXMuX3JlZ2lzdHJ5SW5qZWN0b3JMYWJlbE1hcCk7XHJcbiAgICB9XHJcbiAgICBfZ2V0KGxhYmVsLCBnbG9iYWxQcmVjZWRlbmNlLCBnZXRGdW5jdGlvbk5hbWUsIGxhYmVsTWFwKSB7XHJcbiAgICAgICAgY29uc3QgcmVnaXN0cmllcyA9IGdsb2JhbFByZWNlZGVuY2UgPyBbdGhpcy5iYXNlUmVnaXN0cnksIHRoaXMuX3JlZ2lzdHJ5XSA6IFt0aGlzLl9yZWdpc3RyeSwgdGhpcy5iYXNlUmVnaXN0cnldO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVnaXN0cmllcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCByZWdpc3RyeSA9IHJlZ2lzdHJpZXNbaV07XHJcbiAgICAgICAgICAgIGlmICghcmVnaXN0cnkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSByZWdpc3RyeVtnZXRGdW5jdGlvbk5hbWVdKGxhYmVsKTtcclxuICAgICAgICAgICAgY29uc3QgcmVnaXN0ZXJlZExhYmVscyA9IGxhYmVsTWFwLmdldChyZWdpc3RyeSkgfHwgW107XHJcbiAgICAgICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChyZWdpc3RlcmVkTGFiZWxzLmluZGV4T2YobGFiZWwpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gcmVnaXN0cnkub24obGFiZWwsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5hY3Rpb24gPT09ICdsb2FkZWQnICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbZ2V0RnVuY3Rpb25OYW1lXShsYWJlbCwgZ2xvYmFsUHJlY2VkZW5jZSkgPT09IGV2ZW50Lml0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KHsgdHlwZTogJ2ludmFsaWRhdGUnIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vd24oaGFuZGxlKTtcclxuICAgICAgICAgICAgICAgIGxhYmVsTWFwLnNldChyZWdpc3RyeSwgWy4uLnJlZ2lzdGVyZWRMYWJlbHMsIGxhYmVsXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgUmVnaXN0cnlIYW5kbGVyO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWdpc3RyeUhhbmRsZXIubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9SZWdpc3RyeUhhbmRsZXIubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvUmVnaXN0cnlIYW5kbGVyLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBNYXAgZnJvbSAnLi4vc2hpbS9NYXAnO1xuaW1wb3J0IFdlYWtNYXAgZnJvbSAnLi4vc2hpbS9XZWFrTWFwJztcbmltcG9ydCBTeW1ib2wgZnJvbSAnLi4vc2hpbS9TeW1ib2wnO1xuaW1wb3J0IHsgdiB9IGZyb20gJy4vZCc7XG5pbXBvcnQgeyBhdXRvIH0gZnJvbSAnLi9kaWZmJztcbmltcG9ydCBSZWdpc3RyeUhhbmRsZXIgZnJvbSAnLi9SZWdpc3RyeUhhbmRsZXInO1xuaW1wb3J0IE5vZGVIYW5kbGVyIGZyb20gJy4vTm9kZUhhbmRsZXInO1xuaW1wb3J0IHsgd2lkZ2V0SW5zdGFuY2VNYXAgfSBmcm9tICcuL3Zkb20nO1xuaW1wb3J0IHsgaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IsIFdJREdFVF9CQVNFX1RZUEUgfSBmcm9tICcuL1JlZ2lzdHJ5JztcbmNvbnN0IGRlY29yYXRvck1hcCA9IG5ldyBNYXAoKTtcbmNvbnN0IGJvdW5kQXV0byA9IGF1dG8uYmluZChudWxsKTtcbmV4cG9ydCBjb25zdCBub0JpbmQgPSBTeW1ib2wuZm9yKCdkb2pvTm9CaW5kJyk7XG4vKipcbiAqIE1haW4gd2lkZ2V0IGJhc2UgZm9yIGFsbCB3aWRnZXRzIHRvIGV4dGVuZFxuICovXG5leHBvcnQgY2xhc3MgV2lkZ2V0QmFzZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgaXQgaXMgdGhlIGluaXRpYWwgc2V0IHByb3BlcnRpZXMgY3ljbGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2luaXRpYWxQcm9wZXJ0aWVzID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFycmF5IG9mIHByb3BlcnR5IGtleXMgY29uc2lkZXJlZCBjaGFuZ2VkIGZyb20gdGhlIHByZXZpb3VzIHNldCBwcm9wZXJ0aWVzXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9jaGFuZ2VkUHJvcGVydHlLZXlzID0gW107XG4gICAgICAgIHRoaXMuX25vZGVIYW5kbGVyID0gbmV3IE5vZGVIYW5kbGVyKCk7XG4gICAgICAgIHRoaXMuX2hhbmRsZXMgPSBbXTtcbiAgICAgICAgdGhpcy5fY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgdGhpcy5fZGVjb3JhdG9yQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgdGhpcy5fYm91bmRSZW5kZXJGdW5jID0gdGhpcy5yZW5kZXIuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5fYm91bmRJbnZhbGlkYXRlID0gdGhpcy5pbnZhbGlkYXRlLmJpbmQodGhpcyk7XG4gICAgICAgIHdpZGdldEluc3RhbmNlTWFwLnNldCh0aGlzLCB7XG4gICAgICAgICAgICBkaXJ0eTogdHJ1ZSxcbiAgICAgICAgICAgIG9uQXR0YWNoOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkF0dGFjaCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uRGV0YWNoOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkRldGFjaCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5vZGVIYW5kbGVyOiB0aGlzLl9ub2RlSGFuZGxlcixcbiAgICAgICAgICAgIHJlZ2lzdHJ5OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0cnk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29yZVByb3BlcnRpZXM6IHt9LFxuICAgICAgICAgICAgcmVuZGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGlucHV0UHJvcGVydGllczoge31cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3J1bkFmdGVyQ29uc3RydWN0b3JzKCk7XG4gICAgfVxuICAgIG1ldGEoTWV0YVR5cGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX21ldGFNYXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fbWV0YU1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2FjaGVkID0gdGhpcy5fbWV0YU1hcC5nZXQoTWV0YVR5cGUpO1xuICAgICAgICBpZiAoIWNhY2hlZCkge1xuICAgICAgICAgICAgY2FjaGVkID0gbmV3IE1ldGFUeXBlKHtcbiAgICAgICAgICAgICAgICBpbnZhbGlkYXRlOiB0aGlzLl9ib3VuZEludmFsaWRhdGUsXG4gICAgICAgICAgICAgICAgbm9kZUhhbmRsZXI6IHRoaXMuX25vZGVIYW5kbGVyLFxuICAgICAgICAgICAgICAgIGJpbmQ6IHRoaXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5vd24oY2FjaGVkKTtcbiAgICAgICAgICAgIHRoaXMuX21ldGFNYXAuc2V0KE1ldGFUeXBlLCBjYWNoZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIG9uQXR0YWNoKCkge1xuICAgICAgICAvLyBEbyBub3RoaW5nIGJ5IGRlZmF1bHQuXG4gICAgfVxuICAgIG9uRGV0YWNoKCkge1xuICAgICAgICAvLyBEbyBub3RoaW5nIGJ5IGRlZmF1bHQuXG4gICAgfVxuICAgIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvcGVydGllcztcbiAgICB9XG4gICAgZ2V0IGNoYW5nZWRQcm9wZXJ0eUtleXMoKSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy5fY2hhbmdlZFByb3BlcnR5S2V5c107XG4gICAgfVxuICAgIF9fc2V0Q29yZVByb3BlcnRpZXNfXyhjb3JlUHJvcGVydGllcykge1xuICAgICAgICBjb25zdCB7IGJhc2VSZWdpc3RyeSB9ID0gY29yZVByb3BlcnRpZXM7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldCh0aGlzKTtcbiAgICAgICAgaWYgKGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcy5iYXNlUmVnaXN0cnkgIT09IGJhc2VSZWdpc3RyeSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JlZ2lzdHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RyeSA9IG5ldyBSZWdpc3RyeUhhbmRsZXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeSk7XG4gICAgICAgICAgICAgICAgdGhpcy5vd24odGhpcy5fcmVnaXN0cnkub24oJ2ludmFsaWRhdGUnLCB0aGlzLl9ib3VuZEludmFsaWRhdGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5LmJhc2UgPSBiYXNlUmVnaXN0cnk7XG4gICAgICAgICAgICB0aGlzLmludmFsaWRhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZURhdGEuY29yZVByb3BlcnRpZXMgPSBjb3JlUHJvcGVydGllcztcbiAgICB9XG4gICAgX19zZXRQcm9wZXJ0aWVzX18ob3JpZ2luYWxQcm9wZXJ0aWVzKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldCh0aGlzKTtcbiAgICAgICAgaW5zdGFuY2VEYXRhLmlucHV0UHJvcGVydGllcyA9IG9yaWdpbmFsUHJvcGVydGllcztcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMuX3J1bkJlZm9yZVByb3BlcnRpZXMob3JpZ2luYWxQcm9wZXJ0aWVzKTtcbiAgICAgICAgY29uc3QgcmVnaXN0ZXJlZERpZmZQcm9wZXJ0eU5hbWVzID0gdGhpcy5nZXREZWNvcmF0b3IoJ3JlZ2lzdGVyZWREaWZmUHJvcGVydHknKTtcbiAgICAgICAgY29uc3QgY2hhbmdlZFByb3BlcnR5S2V5cyA9IFtdO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWVzID0gT2JqZWN0LmtleXMocHJvcGVydGllcyk7XG4gICAgICAgIGlmICh0aGlzLl9pbml0aWFsUHJvcGVydGllcyA9PT0gZmFsc2UgfHwgcmVnaXN0ZXJlZERpZmZQcm9wZXJ0eU5hbWVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgY29uc3QgYWxsUHJvcGVydGllcyA9IFsuLi5wcm9wZXJ0eU5hbWVzLCAuLi5PYmplY3Qua2V5cyh0aGlzLl9wcm9wZXJ0aWVzKV07XG4gICAgICAgICAgICBjb25zdCBjaGVja2VkUHJvcGVydGllcyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgZGlmZlByb3BlcnR5UmVzdWx0cyA9IHt9O1xuICAgICAgICAgICAgbGV0IHJ1blJlYWN0aW9ucyA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gYWxsUHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZFByb3BlcnRpZXMuaW5kZXhPZihwcm9wZXJ0eU5hbWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hlY2tlZFByb3BlcnRpZXMucHVzaChwcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzUHJvcGVydHkgPSB0aGlzLl9wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3UHJvcGVydHkgPSB0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eShwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0sIGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcy5iaW5kKTtcbiAgICAgICAgICAgICAgICBpZiAocmVnaXN0ZXJlZERpZmZQcm9wZXJ0eU5hbWVzLmluZGV4T2YocHJvcGVydHlOYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVuUmVhY3Rpb25zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlmZkZ1bmN0aW9ucyA9IHRoaXMuZ2V0RGVjb3JhdG9yKGBkaWZmUHJvcGVydHk6JHtwcm9wZXJ0eU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZkZ1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGlmZkZ1bmN0aW9uc1tpXShwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmNoYW5nZWQgJiYgY2hhbmdlZFByb3BlcnR5S2V5cy5pbmRleE9mKHByb3BlcnR5TmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFByb3BlcnR5S2V5cy5wdXNoKHByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lIGluIHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmUHJvcGVydHlSZXN1bHRzW3Byb3BlcnR5TmFtZV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGJvdW5kQXV0byhwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuY2hhbmdlZCAmJiBjaGFuZ2VkUHJvcGVydHlLZXlzLmluZGV4T2YocHJvcGVydHlOYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRQcm9wZXJ0eUtleXMucHVzaChwcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlmZlByb3BlcnR5UmVzdWx0c1twcm9wZXJ0eU5hbWVdID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1blJlYWN0aW9ucykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWN0aW9uRnVuY3Rpb25zID0gdGhpcy5nZXREZWNvcmF0b3IoJ2RpZmZSZWFjdGlvbicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVkUmVhY3Rpb25zID0gW107XG4gICAgICAgICAgICAgICAgcmVhY3Rpb25GdW5jdGlvbnMuZm9yRWFjaCgoeyByZWFjdGlvbiwgcHJvcGVydHlOYW1lIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHlDaGFuZ2VkID0gY2hhbmdlZFByb3BlcnR5S2V5cy5pbmRleE9mKHByb3BlcnR5TmFtZSkgIT09IC0xO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFjdGlvblJ1biA9IGV4ZWN1dGVkUmVhY3Rpb25zLmluZGV4T2YocmVhY3Rpb24pICE9PSAtMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Q2hhbmdlZCAmJiAhcmVhY3Rpb25SdW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWN0aW9uLmNhbGwodGhpcywgdGhpcy5fcHJvcGVydGllcywgZGlmZlByb3BlcnR5UmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZFJlYWN0aW9ucy5wdXNoKHJlYWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IGRpZmZQcm9wZXJ0eVJlc3VsdHM7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VkUHJvcGVydHlLZXlzID0gY2hhbmdlZFByb3BlcnR5S2V5cztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxQcm9wZXJ0aWVzID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWVzW2ldO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5KHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSwgaW5zdGFuY2VEYXRhLmNvcmVQcm9wZXJ0aWVzLmJpbmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFByb3BlcnR5S2V5cy5wdXNoKHByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fY2hhbmdlZFByb3BlcnR5S2V5cyA9IGNoYW5nZWRQcm9wZXJ0eUtleXM7XG4gICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2NoYW5nZWRQcm9wZXJ0eUtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGNoaWxkcmVuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW47XG4gICAgfVxuICAgIF9fc2V0Q2hpbGRyZW5fXyhjaGlsZHJlbikge1xuICAgICAgICBpZiAodGhpcy5fY2hpbGRyZW4ubGVuZ3RoID4gMCB8fCBjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX19yZW5kZXJfXygpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHRoaXMpO1xuICAgICAgICBpbnN0YW5jZURhdGEuZGlydHkgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVuZGVyID0gdGhpcy5fcnVuQmVmb3JlUmVuZGVycygpO1xuICAgICAgICBsZXQgZE5vZGUgPSByZW5kZXIoKTtcbiAgICAgICAgZE5vZGUgPSB0aGlzLnJ1bkFmdGVyUmVuZGVycyhkTm9kZSk7XG4gICAgICAgIHRoaXMuX25vZGVIYW5kbGVyLmNsZWFyKCk7XG4gICAgICAgIHJldHVybiBkTm9kZTtcbiAgICB9XG4gICAgaW52YWxpZGF0ZSgpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHRoaXMpO1xuICAgICAgICBpZiAoaW5zdGFuY2VEYXRhLmludmFsaWRhdGUpIHtcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5pbnZhbGlkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gdignZGl2Jywge30sIHRoaXMuY2hpbGRyZW4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB0byBhZGQgZGVjb3JhdG9ycyB0byBXaWRnZXRCYXNlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVjb3JhdG9yS2V5IFRoZSBrZXkgb2YgdGhlIGRlY29yYXRvclxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGRlY29yYXRvclxuICAgICAqL1xuICAgIGFkZERlY29yYXRvcihkZWNvcmF0b3JLZXksIHZhbHVlKSB7XG4gICAgICAgIHZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KCdjb25zdHJ1Y3RvcicpKSB7XG4gICAgICAgICAgICBsZXQgZGVjb3JhdG9yTGlzdCA9IGRlY29yYXRvck1hcC5nZXQodGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgICAgICAgICBpZiAoIWRlY29yYXRvckxpc3QpIHtcbiAgICAgICAgICAgICAgICBkZWNvcmF0b3JMaXN0ID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgICAgIGRlY29yYXRvck1hcC5zZXQodGhpcy5jb25zdHJ1Y3RvciwgZGVjb3JhdG9yTGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc3BlY2lmaWNEZWNvcmF0b3JMaXN0ID0gZGVjb3JhdG9yTGlzdC5nZXQoZGVjb3JhdG9yS2V5KTtcbiAgICAgICAgICAgIGlmICghc3BlY2lmaWNEZWNvcmF0b3JMaXN0KSB7XG4gICAgICAgICAgICAgICAgc3BlY2lmaWNEZWNvcmF0b3JMaXN0ID0gW107XG4gICAgICAgICAgICAgICAgZGVjb3JhdG9yTGlzdC5zZXQoZGVjb3JhdG9yS2V5LCBzcGVjaWZpY0RlY29yYXRvckxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3BlY2lmaWNEZWNvcmF0b3JMaXN0LnB1c2goLi4udmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IHRoaXMuZ2V0RGVjb3JhdG9yKGRlY29yYXRvcktleSk7XG4gICAgICAgICAgICB0aGlzLl9kZWNvcmF0b3JDYWNoZS5zZXQoZGVjb3JhdG9yS2V5LCBbLi4uZGVjb3JhdG9ycywgLi4udmFsdWVdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB0byBidWlsZCB0aGUgbGlzdCBvZiBkZWNvcmF0b3JzIGZyb20gdGhlIGdsb2JhbCBkZWNvcmF0b3IgbWFwLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRlY29yYXRvcktleSAgVGhlIGtleSBvZiB0aGUgZGVjb3JhdG9yXG4gICAgICogQHJldHVybiBBbiBhcnJheSBvZiBkZWNvcmF0b3IgdmFsdWVzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfYnVpbGREZWNvcmF0b3JMaXN0KGRlY29yYXRvcktleSkge1xuICAgICAgICBjb25zdCBhbGxEZWNvcmF0b3JzID0gW107XG4gICAgICAgIGxldCBjb25zdHJ1Y3RvciA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgICAgIHdoaWxlIChjb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VNYXAgPSBkZWNvcmF0b3JNYXAuZ2V0KGNvbnN0cnVjdG9yKTtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZU1hcCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBpbnN0YW5jZU1hcC5nZXQoZGVjb3JhdG9yS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9ycykge1xuICAgICAgICAgICAgICAgICAgICBhbGxEZWNvcmF0b3JzLnVuc2hpZnQoLi4uZGVjb3JhdG9ycyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3RydWN0b3IgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY29uc3RydWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhbGxEZWNvcmF0b3JzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB0byByZXRyaWV2ZSBkZWNvcmF0b3IgdmFsdWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVjb3JhdG9yS2V5IFRoZSBrZXkgb2YgdGhlIGRlY29yYXRvclxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGRlY29yYXRvciB2YWx1ZXNcbiAgICAgKi9cbiAgICBnZXREZWNvcmF0b3IoZGVjb3JhdG9yS2V5KSB7XG4gICAgICAgIGxldCBhbGxEZWNvcmF0b3JzID0gdGhpcy5fZGVjb3JhdG9yQ2FjaGUuZ2V0KGRlY29yYXRvcktleSk7XG4gICAgICAgIGlmIChhbGxEZWNvcmF0b3JzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhbGxEZWNvcmF0b3JzO1xuICAgICAgICB9XG4gICAgICAgIGFsbERlY29yYXRvcnMgPSB0aGlzLl9idWlsZERlY29yYXRvckxpc3QoZGVjb3JhdG9yS2V5KTtcbiAgICAgICAgdGhpcy5fZGVjb3JhdG9yQ2FjaGUuc2V0KGRlY29yYXRvcktleSwgYWxsRGVjb3JhdG9ycyk7XG4gICAgICAgIHJldHVybiBhbGxEZWNvcmF0b3JzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCaW5kcyB1bmJvdW5kIHByb3BlcnR5IGZ1bmN0aW9ucyB0byB0aGUgc3BlY2lmaWVkIGBiaW5kYCBwcm9wZXJ0eVxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgcHJvcGVydGllcyB0byBjaGVjayBmb3IgZnVuY3Rpb25zXG4gICAgICovXG4gICAgX2JpbmRGdW5jdGlvblByb3BlcnR5KHByb3BlcnR5LCBiaW5kKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkgPT09ICdmdW5jdGlvbicgJiYgIXByb3BlcnR5W25vQmluZF0gJiYgaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IocHJvcGVydHkpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5TWFwID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eU1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBiaW5kSW5mbyA9IHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5TWFwLmdldChwcm9wZXJ0eSkgfHwge307XG4gICAgICAgICAgICBsZXQgeyBib3VuZEZ1bmMsIHNjb3BlIH0gPSBiaW5kSW5mbztcbiAgICAgICAgICAgIGlmIChib3VuZEZ1bmMgPT09IHVuZGVmaW5lZCB8fCBzY29wZSAhPT0gYmluZCkge1xuICAgICAgICAgICAgICAgIGJvdW5kRnVuYyA9IHByb3BlcnR5LmJpbmQoYmluZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fYmluZEZ1bmN0aW9uUHJvcGVydHlNYXAuc2V0KHByb3BlcnR5LCB7IGJvdW5kRnVuYywgc2NvcGU6IGJpbmQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYm91bmRGdW5jO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eTtcbiAgICB9XG4gICAgZ2V0IHJlZ2lzdHJ5KCkge1xuICAgICAgICBpZiAodGhpcy5fcmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnlIYW5kbGVyKCk7XG4gICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeSk7XG4gICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeS5vbignaW52YWxpZGF0ZScsIHRoaXMuX2JvdW5kSW52YWxpZGF0ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWdpc3RyeTtcbiAgICB9XG4gICAgX3J1bkJlZm9yZVByb3BlcnRpZXMocHJvcGVydGllcykge1xuICAgICAgICBjb25zdCBiZWZvcmVQcm9wZXJ0aWVzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2JlZm9yZVByb3BlcnRpZXMnKTtcbiAgICAgICAgaWYgKGJlZm9yZVByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJlZm9yZVByb3BlcnRpZXMucmVkdWNlKChwcm9wZXJ0aWVzLCBiZWZvcmVQcm9wZXJ0aWVzRnVuY3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcHJvcGVydGllcywgYmVmb3JlUHJvcGVydGllc0Z1bmN0aW9uLmNhbGwodGhpcywgcHJvcGVydGllcykpO1xuICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcGVydGllcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSdW4gYWxsIHJlZ2lzdGVyZWQgYmVmb3JlIHJlbmRlcnMgYW5kIHJldHVybiB0aGUgdXBkYXRlZCByZW5kZXIgbWV0aG9kXG4gICAgICovXG4gICAgX3J1bkJlZm9yZVJlbmRlcnMoKSB7XG4gICAgICAgIGNvbnN0IGJlZm9yZVJlbmRlcnMgPSB0aGlzLmdldERlY29yYXRvcignYmVmb3JlUmVuZGVyJyk7XG4gICAgICAgIGlmIChiZWZvcmVSZW5kZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBiZWZvcmVSZW5kZXJzLnJlZHVjZSgocmVuZGVyLCBiZWZvcmVSZW5kZXJGdW5jdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRSZW5kZXIgPSBiZWZvcmVSZW5kZXJGdW5jdGlvbi5jYWxsKHRoaXMsIHJlbmRlciwgdGhpcy5fcHJvcGVydGllcywgdGhpcy5fY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIGlmICghdXBkYXRlZFJlbmRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlbmRlciBmdW5jdGlvbiBub3QgcmV0dXJuZWQgZnJvbSBiZWZvcmVSZW5kZXIsIHVzaW5nIHByZXZpb3VzIHJlbmRlcicpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlZFJlbmRlcjtcbiAgICAgICAgICAgIH0sIHRoaXMuX2JvdW5kUmVuZGVyRnVuYyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2JvdW5kUmVuZGVyRnVuYztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUnVuIGFsbCByZWdpc3RlcmVkIGFmdGVyIHJlbmRlcnMgYW5kIHJldHVybiB0aGUgZGVjb3JhdGVkIEROb2Rlc1xuICAgICAqXG4gICAgICogQHBhcmFtIGROb2RlIFRoZSBETm9kZXMgdG8gcnVuIHRocm91Z2ggdGhlIGFmdGVyIHJlbmRlcnNcbiAgICAgKi9cbiAgICBydW5BZnRlclJlbmRlcnMoZE5vZGUpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJSZW5kZXJzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2FmdGVyUmVuZGVyJyk7XG4gICAgICAgIGlmIChhZnRlclJlbmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZE5vZGUgPSBhZnRlclJlbmRlcnMucmVkdWNlKChkTm9kZSwgYWZ0ZXJSZW5kZXJGdW5jdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhZnRlclJlbmRlckZ1bmN0aW9uLmNhbGwodGhpcywgZE5vZGUpO1xuICAgICAgICAgICAgfSwgZE5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9tZXRhTWFwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX21ldGFNYXAuZm9yRWFjaCgobWV0YSkgPT4ge1xuICAgICAgICAgICAgICAgIG1ldGEuYWZ0ZXJSZW5kZXIoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkTm9kZTtcbiAgICB9XG4gICAgX3J1bkFmdGVyQ29uc3RydWN0b3JzKCkge1xuICAgICAgICBjb25zdCBhZnRlckNvbnN0cnVjdG9ycyA9IHRoaXMuZ2V0RGVjb3JhdG9yKCdhZnRlckNvbnN0cnVjdG9yJyk7XG4gICAgICAgIGlmIChhZnRlckNvbnN0cnVjdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhZnRlckNvbnN0cnVjdG9ycy5mb3JFYWNoKChhZnRlckNvbnN0cnVjdG9yKSA9PiBhZnRlckNvbnN0cnVjdG9yLmNhbGwodGhpcykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG93bihoYW5kbGUpIHtcbiAgICAgICAgdGhpcy5faGFuZGxlcy5wdXNoKGhhbmRsZSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLl9oYW5kbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMuX2hhbmRsZXMucG9wKCk7XG4gICAgICAgICAgICBpZiAoaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogc3RhdGljIGlkZW50aWZpZXJcbiAqL1xuV2lkZ2V0QmFzZS5fdHlwZSA9IFdJREdFVF9CQVNFX1RZUEU7XG5leHBvcnQgZGVmYXVsdCBXaWRnZXRCYXNlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2lkZ2V0QmFzZS5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL1dpZGdldEJhc2UubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvV2lkZ2V0QmFzZS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJsZXQgYnJvd3NlclNwZWNpZmljVHJhbnNpdGlvbkVuZEV2ZW50TmFtZSA9ICcnO1xubGV0IGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSA9ICcnO1xuZnVuY3Rpb24gZGV0ZXJtaW5lQnJvd3NlclN0eWxlTmFtZXMoZWxlbWVudCkge1xuICAgIGlmICgnV2Via2l0VHJhbnNpdGlvbicgaW4gZWxlbWVudC5zdHlsZSkge1xuICAgICAgICBicm93c2VyU3BlY2lmaWNUcmFuc2l0aW9uRW5kRXZlbnROYW1lID0gJ3dlYmtpdFRyYW5zaXRpb25FbmQnO1xuICAgICAgICBicm93c2VyU3BlY2lmaWNBbmltYXRpb25FbmRFdmVudE5hbWUgPSAnd2Via2l0QW5pbWF0aW9uRW5kJztcbiAgICB9XG4gICAgZWxzZSBpZiAoJ3RyYW5zaXRpb24nIGluIGVsZW1lbnQuc3R5bGUgfHwgJ01velRyYW5zaXRpb24nIGluIGVsZW1lbnQuc3R5bGUpIHtcbiAgICAgICAgYnJvd3NlclNwZWNpZmljVHJhbnNpdGlvbkVuZEV2ZW50TmFtZSA9ICd0cmFuc2l0aW9uZW5kJztcbiAgICAgICAgYnJvd3NlclNwZWNpZmljQW5pbWF0aW9uRW5kRXZlbnROYW1lID0gJ2FuaW1hdGlvbmVuZCc7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdXIgYnJvd3NlciBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxufVxuZnVuY3Rpb24gaW5pdGlhbGl6ZShlbGVtZW50KSB7XG4gICAgaWYgKGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSA9PT0gJycpIHtcbiAgICAgICAgZGV0ZXJtaW5lQnJvd3NlclN0eWxlTmFtZXMoZWxlbWVudCk7XG4gICAgfVxufVxuZnVuY3Rpb24gcnVuQW5kQ2xlYW5VcChlbGVtZW50LCBzdGFydEFuaW1hdGlvbiwgZmluaXNoQW5pbWF0aW9uKSB7XG4gICAgaW5pdGlhbGl6ZShlbGVtZW50KTtcbiAgICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcbiAgICBsZXQgdHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFmaW5pc2hlZCkge1xuICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGJyb3dzZXJTcGVjaWZpY1RyYW5zaXRpb25FbmRFdmVudE5hbWUsIHRyYW5zaXRpb25FbmQpO1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSwgdHJhbnNpdGlvbkVuZCk7XG4gICAgICAgICAgICBmaW5pc2hBbmltYXRpb24oKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgc3RhcnRBbmltYXRpb24oKTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoYnJvd3NlclNwZWNpZmljQW5pbWF0aW9uRW5kRXZlbnROYW1lLCB0cmFuc2l0aW9uRW5kKTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoYnJvd3NlclNwZWNpZmljVHJhbnNpdGlvbkVuZEV2ZW50TmFtZSwgdHJhbnNpdGlvbkVuZCk7XG59XG5mdW5jdGlvbiBleGl0KG5vZGUsIHByb3BlcnRpZXMsIGV4aXRBbmltYXRpb24sIHJlbW92ZU5vZGUpIHtcbiAgICBjb25zdCBhY3RpdmVDbGFzcyA9IHByb3BlcnRpZXMuZXhpdEFuaW1hdGlvbkFjdGl2ZSB8fCBgJHtleGl0QW5pbWF0aW9ufS1hY3RpdmVgO1xuICAgIHJ1bkFuZENsZWFuVXAobm9kZSwgKCkgPT4ge1xuICAgICAgICBub2RlLmNsYXNzTGlzdC5hZGQoZXhpdEFuaW1hdGlvbik7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBub2RlLmNsYXNzTGlzdC5hZGQoYWN0aXZlQ2xhc3MpO1xuICAgICAgICB9KTtcbiAgICB9LCAoKSA9PiB7XG4gICAgICAgIHJlbW92ZU5vZGUoKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGVudGVyKG5vZGUsIHByb3BlcnRpZXMsIGVudGVyQW5pbWF0aW9uKSB7XG4gICAgY29uc3QgYWN0aXZlQ2xhc3MgPSBwcm9wZXJ0aWVzLmVudGVyQW5pbWF0aW9uQWN0aXZlIHx8IGAke2VudGVyQW5pbWF0aW9ufS1hY3RpdmVgO1xuICAgIHJ1bkFuZENsZWFuVXAobm9kZSwgKCkgPT4ge1xuICAgICAgICBub2RlLmNsYXNzTGlzdC5hZGQoZW50ZXJBbmltYXRpb24pO1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKGFjdGl2ZUNsYXNzKTtcbiAgICAgICAgfSk7XG4gICAgfSwgKCkgPT4ge1xuICAgICAgICBub2RlLmNsYXNzTGlzdC5yZW1vdmUoZW50ZXJBbmltYXRpb24pO1xuICAgICAgICBub2RlLmNsYXNzTGlzdC5yZW1vdmUoYWN0aXZlQ2xhc3MpO1xuICAgIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQge1xuICAgIGVudGVyLFxuICAgIGV4aXRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jc3NUcmFuc2l0aW9ucy5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2FuaW1hdGlvbnMvY3NzVHJhbnNpdGlvbnMubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvYW5pbWF0aW9ucy9jc3NUcmFuc2l0aW9ucy5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgU3ltYm9sIGZyb20gJy4uL3NoaW0vU3ltYm9sJztcbi8qKlxuICogVGhlIHN5bWJvbCBpZGVudGlmaWVyIGZvciBhIFdOb2RlIHR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IFdOT0RFID0gU3ltYm9sKCdJZGVudGlmaWVyIGZvciBhIFdOb2RlLicpO1xuLyoqXG4gKiBUaGUgc3ltYm9sIGlkZW50aWZpZXIgZm9yIGEgVk5vZGUgdHlwZVxuICovXG5leHBvcnQgY29uc3QgVk5PREUgPSBTeW1ib2woJ0lkZW50aWZpZXIgZm9yIGEgVk5vZGUuJyk7XG4vKipcbiAqIFRoZSBzeW1ib2wgaWRlbnRpZmllciBmb3IgYSBWTm9kZSB0eXBlIGNyZWF0ZWQgdXNpbmcgZG9tKClcbiAqL1xuZXhwb3J0IGNvbnN0IERPTVZOT0RFID0gU3ltYm9sKCdJZGVudGlmaWVyIGZvciBhIFZOb2RlIGNyZWF0ZWQgdXNpbmcgZXhpc3RpbmcgZG9tLicpO1xuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIGBETm9kZWAgaXMgYSBgV05vZGVgIHVzaW5nIHRoZSBgdHlwZWAgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV05vZGUoY2hpbGQpIHtcbiAgICByZXR1cm4gQm9vbGVhbihjaGlsZCAmJiB0eXBlb2YgY2hpbGQgIT09ICdzdHJpbmcnICYmIGNoaWxkLnR5cGUgPT09IFdOT0RFKTtcbn1cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBgRE5vZGVgIGlzIGEgYFZOb2RlYCB1c2luZyB0aGUgYHR5cGVgIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZOb2RlKGNoaWxkKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oY2hpbGQgJiYgdHlwZW9mIGNoaWxkICE9PSAnc3RyaW5nJyAmJiAoY2hpbGQudHlwZSA9PT0gVk5PREUgfHwgY2hpbGQudHlwZSA9PT0gRE9NVk5PREUpKTtcbn1cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBgRE5vZGVgIGlzIGEgYFZOb2RlYCBjcmVhdGVkIHdpdGggYGRvbSgpYCB1c2luZyB0aGUgYHR5cGVgIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RvbVZOb2RlKGNoaWxkKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oY2hpbGQgJiYgdHlwZW9mIGNoaWxkICE9PSAnc3RyaW5nJyAmJiBjaGlsZC50eXBlID09PSBET01WTk9ERSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFbGVtZW50Tm9kZSh2YWx1ZSkge1xuICAgIHJldHVybiAhIXZhbHVlLnRhZ05hbWU7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjb3JhdGUoZE5vZGVzLCBvcHRpb25zT3JNb2RpZmllciwgcHJlZGljYXRlKSB7XG4gICAgbGV0IHNoYWxsb3cgPSBmYWxzZTtcbiAgICBsZXQgbW9kaWZpZXI7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zT3JNb2RpZmllciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBtb2RpZmllciA9IG9wdGlvbnNPck1vZGlmaWVyO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbW9kaWZpZXIgPSBvcHRpb25zT3JNb2RpZmllci5tb2RpZmllcjtcbiAgICAgICAgcHJlZGljYXRlID0gb3B0aW9uc09yTW9kaWZpZXIucHJlZGljYXRlO1xuICAgICAgICBzaGFsbG93ID0gb3B0aW9uc09yTW9kaWZpZXIuc2hhbGxvdyB8fCBmYWxzZTtcbiAgICB9XG4gICAgbGV0IG5vZGVzID0gQXJyYXkuaXNBcnJheShkTm9kZXMpID8gWy4uLmROb2Rlc10gOiBbZE5vZGVzXTtcbiAgICBmdW5jdGlvbiBicmVha2VyKCkge1xuICAgICAgICBub2RlcyA9IFtdO1xuICAgIH1cbiAgICB3aGlsZSAobm9kZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlcy5zaGlmdCgpO1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKCFzaGFsbG93ICYmIChpc1dOb2RlKG5vZGUpIHx8IGlzVk5vZGUobm9kZSkpICYmIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBub2RlcyA9IFsuLi5ub2RlcywgLi4ubm9kZS5jaGlsZHJlbl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXByZWRpY2F0ZSB8fCBwcmVkaWNhdGUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICBtb2RpZmllcihub2RlLCBicmVha2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZE5vZGVzO1xufVxuLyoqXG4gKiBXcmFwcGVyIGZ1bmN0aW9uIGZvciBjYWxscyB0byBjcmVhdGUgYSB3aWRnZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3KHdpZGdldENvbnN0cnVjdG9yLCBwcm9wZXJ0aWVzLCBjaGlsZHJlbiA9IFtdKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIHdpZGdldENvbnN0cnVjdG9yLFxuICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICB0eXBlOiBXTk9ERVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gdih0YWcsIHByb3BlcnRpZXNPckNoaWxkcmVuID0ge30sIGNoaWxkcmVuID0gdW5kZWZpbmVkKSB7XG4gICAgbGV0IHByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzT3JDaGlsZHJlbjtcbiAgICBsZXQgZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2s7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcGVydGllc09yQ2hpbGRyZW4pKSB7XG4gICAgICAgIGNoaWxkcmVuID0gcHJvcGVydGllc09yQ2hpbGRyZW47XG4gICAgICAgIHByb3BlcnRpZXMgPSB7fTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcm9wZXJ0aWVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrID0gcHJvcGVydGllcztcbiAgICAgICAgcHJvcGVydGllcyA9IHt9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB0YWcsXG4gICAgICAgIGRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrLFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgcHJvcGVydGllcyxcbiAgICAgICAgdHlwZTogVk5PREVcbiAgICB9O1xufVxuLyoqXG4gKiBDcmVhdGUgYSBWTm9kZSBmb3IgYW4gZXhpc3RpbmcgRE9NIE5vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb20oeyBub2RlLCBhdHRycyA9IHt9LCBwcm9wcyA9IHt9LCBvbiA9IHt9LCBkaWZmVHlwZSA9ICdub25lJyB9LCBjaGlsZHJlbikge1xuICAgIHJldHVybiB7XG4gICAgICAgIHRhZzogaXNFbGVtZW50Tm9kZShub2RlKSA/IG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpIDogJycsXG4gICAgICAgIHByb3BlcnRpZXM6IHByb3BzLFxuICAgICAgICBhdHRyaWJ1dGVzOiBhdHRycyxcbiAgICAgICAgZXZlbnRzOiBvbixcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIHR5cGU6IERPTVZOT0RFLFxuICAgICAgICBkb21Ob2RlOiBub2RlLFxuICAgICAgICB0ZXh0OiBpc0VsZW1lbnROb2RlKG5vZGUpID8gdW5kZWZpbmVkIDogbm9kZS5kYXRhLFxuICAgICAgICBkaWZmVHlwZVxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCB7IGhhbmRsZURlY29yYXRvciB9IGZyb20gJy4vaGFuZGxlRGVjb3JhdG9yJztcbmV4cG9ydCBmdW5jdGlvbiBhZnRlclJlbmRlcihtZXRob2QpIHtcbiAgICByZXR1cm4gaGFuZGxlRGVjb3JhdG9yKCh0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICAgIHRhcmdldC5hZGREZWNvcmF0b3IoJ2FmdGVyUmVuZGVyJywgcHJvcGVydHlLZXkgPyB0YXJnZXRbcHJvcGVydHlLZXldIDogbWV0aG9kKTtcbiAgICB9KTtcbn1cbmV4cG9ydCBkZWZhdWx0IGFmdGVyUmVuZGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWZ0ZXJSZW5kZXIubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2FmdGVyUmVuZGVyLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYWZ0ZXJSZW5kZXIubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi9oYW5kbGVEZWNvcmF0b3InO1xuaW1wb3J0IHsgYmVmb3JlUHJvcGVydGllcyB9IGZyb20gJy4vYmVmb3JlUHJvcGVydGllcyc7XG5leHBvcnQgZnVuY3Rpb24gYWx3YXlzUmVuZGVyKCkge1xuICAgIHJldHVybiBoYW5kbGVEZWNvcmF0b3IoKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICAgICAgYmVmb3JlUHJvcGVydGllcyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmludmFsaWRhdGUoKTtcbiAgICAgICAgfSkodGFyZ2V0KTtcbiAgICB9KTtcbn1cbmV4cG9ydCBkZWZhdWx0IGFsd2F5c1JlbmRlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFsd2F5c1JlbmRlci5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYWx3YXlzUmVuZGVyLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYWx3YXlzUmVuZGVyLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCB7IGhhbmRsZURlY29yYXRvciB9IGZyb20gJy4vaGFuZGxlRGVjb3JhdG9yJztcbmV4cG9ydCBmdW5jdGlvbiBiZWZvcmVQcm9wZXJ0aWVzKG1ldGhvZCkge1xuICAgIHJldHVybiBoYW5kbGVEZWNvcmF0b3IoKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcignYmVmb3JlUHJvcGVydGllcycsIHByb3BlcnR5S2V5ID8gdGFyZ2V0W3Byb3BlcnR5S2V5XSA6IG1ldGhvZCk7XG4gICAgfSk7XG59XG5leHBvcnQgZGVmYXVsdCBiZWZvcmVQcm9wZXJ0aWVzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmVmb3JlUHJvcGVydGllcy5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYmVmb3JlUHJvcGVydGllcy5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2JlZm9yZVByb3BlcnRpZXMubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IHsgQ3VzdG9tRWxlbWVudENoaWxkVHlwZSB9IGZyb20gJy4uL3JlZ2lzdGVyQ3VzdG9tRWxlbWVudCc7XG5pbXBvcnQgUmVnaXN0cnkgZnJvbSAnLi4vUmVnaXN0cnknO1xuLyoqXG4gKiBUaGlzIERlY29yYXRvciBpcyBwcm92aWRlZCBwcm9wZXJ0aWVzIHRoYXQgZGVmaW5lIHRoZSBiZWhhdmlvciBvZiBhIGN1c3RvbSBlbGVtZW50LCBhbmRcbiAqIHJlZ2lzdGVycyB0aGF0IGN1c3RvbSBlbGVtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3VzdG9tRWxlbWVudCh7IHRhZywgcHJvcGVydGllcyA9IFtdLCBhdHRyaWJ1dGVzID0gW10sIGV2ZW50cyA9IFtdLCBjaGlsZFR5cGUgPSBDdXN0b21FbGVtZW50Q2hpbGRUeXBlLkRPSk8sIHJlZ2lzdHJ5RmFjdG9yeSA9ICgpID0+IG5ldyBSZWdpc3RyeSgpIH0pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICB0YXJnZXQucHJvdG90eXBlLl9fY3VzdG9tRWxlbWVudERlc2NyaXB0b3IgPSB7XG4gICAgICAgICAgICB0YWdOYW1lOiB0YWcsXG4gICAgICAgICAgICBhdHRyaWJ1dGVzLFxuICAgICAgICAgICAgcHJvcGVydGllcyxcbiAgICAgICAgICAgIGV2ZW50cyxcbiAgICAgICAgICAgIGNoaWxkVHlwZSxcbiAgICAgICAgICAgIHJlZ2lzdHJ5RmFjdG9yeVxuICAgICAgICB9O1xuICAgIH07XG59XG5leHBvcnQgZGVmYXVsdCBjdXN0b21FbGVtZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3VzdG9tRWxlbWVudC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvY3VzdG9tRWxlbWVudC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2N1c3RvbUVsZW1lbnQubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi9oYW5kbGVEZWNvcmF0b3InO1xuaW1wb3J0IHsgYXV0byB9IGZyb20gJy4vLi4vZGlmZic7XG4vKipcbiAqIERlY29yYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlZ2lzdGVyIGEgZnVuY3Rpb24gYXMgYSBzcGVjaWZpYyBwcm9wZXJ0eSBkaWZmXG4gKlxuICogQHBhcmFtIHByb3BlcnR5TmFtZSAgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IG9mIHdoaWNoIHRoZSBkaWZmIGZ1bmN0aW9uIGlzIGFwcGxpZWRcbiAqIEBwYXJhbSBkaWZmVHlwZSAgICAgIFRoZSBkaWZmIHR5cGUsIGRlZmF1bHQgaXMgRGlmZlR5cGUuQVVUTy5cbiAqIEBwYXJhbSBkaWZmRnVuY3Rpb24gIEEgZGlmZiBmdW5jdGlvbiB0byBydW4gaWYgZGlmZlR5cGUgaWYgRGlmZlR5cGUuQ1VTVE9NXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmUHJvcGVydHkocHJvcGVydHlOYW1lLCBkaWZmRnVuY3Rpb24gPSBhdXRvLCByZWFjdGlvbkZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIGhhbmRsZURlY29yYXRvcigodGFyZ2V0LCBwcm9wZXJ0eUtleSkgPT4ge1xuICAgICAgICB0YXJnZXQuYWRkRGVjb3JhdG9yKGBkaWZmUHJvcGVydHk6JHtwcm9wZXJ0eU5hbWV9YCwgZGlmZkZ1bmN0aW9uLmJpbmQobnVsbCkpO1xuICAgICAgICB0YXJnZXQuYWRkRGVjb3JhdG9yKCdyZWdpc3RlcmVkRGlmZlByb3BlcnR5JywgcHJvcGVydHlOYW1lKTtcbiAgICAgICAgaWYgKHJlYWN0aW9uRnVuY3Rpb24gfHwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIHRhcmdldC5hZGREZWNvcmF0b3IoJ2RpZmZSZWFjdGlvbicsIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICAgICAgcmVhY3Rpb246IHByb3BlcnR5S2V5ID8gdGFyZ2V0W3Byb3BlcnR5S2V5XSA6IHJlYWN0aW9uRnVuY3Rpb25cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnQgZGVmYXVsdCBkaWZmUHJvcGVydHk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWZmUHJvcGVydHkubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2RpZmZQcm9wZXJ0eS5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2RpZmZQcm9wZXJ0eS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCIvKipcbiAqIEdlbmVyaWMgZGVjb3JhdG9yIGhhbmRsZXIgdG8gdGFrZSBjYXJlIG9mIHdoZXRoZXIgb3Igbm90IHRoZSBkZWNvcmF0b3Igd2FzIGNhbGxlZCBhdCB0aGUgY2xhc3MgbGV2ZWxcbiAqIG9yIHRoZSBtZXRob2QgbGV2ZWwuXG4gKlxuICogQHBhcmFtIGhhbmRsZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZURlY29yYXRvcihoYW5kbGVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBoYW5kbGVyKHRhcmdldC5wcm90b3R5cGUsIHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVyKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydCBkZWZhdWx0IGhhbmRsZURlY29yYXRvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhbmRsZURlY29yYXRvci5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaGFuZGxlRGVjb3JhdG9yLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaGFuZGxlRGVjb3JhdG9yLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBXZWFrTWFwIGZyb20gJy4uLy4uL3NoaW0vV2Vha01hcCc7XG5pbXBvcnQgeyBoYW5kbGVEZWNvcmF0b3IgfSBmcm9tICcuL2hhbmRsZURlY29yYXRvcic7XG5pbXBvcnQgeyBiZWZvcmVQcm9wZXJ0aWVzIH0gZnJvbSAnLi9iZWZvcmVQcm9wZXJ0aWVzJztcbi8qKlxuICogTWFwIG9mIGluc3RhbmNlcyBhZ2FpbnN0IHJlZ2lzdGVyZWQgaW5qZWN0b3JzLlxuICovXG5jb25zdCByZWdpc3RlcmVkSW5qZWN0b3JzTWFwID0gbmV3IFdlYWtNYXAoKTtcbi8qKlxuICogRGVjb3JhdG9yIHJldHJpZXZlcyBhbiBpbmplY3RvciBmcm9tIGFuIGF2YWlsYWJsZSByZWdpc3RyeSB1c2luZyB0aGUgbmFtZSBhbmRcbiAqIGNhbGxzIHRoZSBgZ2V0UHJvcGVydGllc2AgZnVuY3Rpb24gd2l0aCB0aGUgcGF5bG9hZCBmcm9tIHRoZSBpbmplY3RvclxuICogYW5kIGN1cnJlbnQgcHJvcGVydGllcyB3aXRoIHRoZSB0aGUgaW5qZWN0ZWQgcHJvcGVydGllcyByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gSW5qZWN0Q29uZmlnIHRoZSBpbmplY3QgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KHsgbmFtZSwgZ2V0UHJvcGVydGllcyB9KSB7XG4gICAgcmV0dXJuIGhhbmRsZURlY29yYXRvcigodGFyZ2V0LCBwcm9wZXJ0eUtleSkgPT4ge1xuICAgICAgICBiZWZvcmVQcm9wZXJ0aWVzKGZ1bmN0aW9uIChwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBjb25zdCBpbmplY3Rvckl0ZW0gPSB0aGlzLnJlZ2lzdHJ5LmdldEluamVjdG9yKG5hbWUpO1xuICAgICAgICAgICAgaWYgKGluamVjdG9ySXRlbSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgaW5qZWN0b3IsIGludmFsaWRhdG9yIH0gPSBpbmplY3Rvckl0ZW07XG4gICAgICAgICAgICAgICAgY29uc3QgcmVnaXN0ZXJlZEluamVjdG9ycyA9IHJlZ2lzdGVyZWRJbmplY3RvcnNNYXAuZ2V0KHRoaXMpIHx8IFtdO1xuICAgICAgICAgICAgICAgIGlmIChyZWdpc3RlcmVkSW5qZWN0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZWdpc3RlcmVkSW5qZWN0b3JzTWFwLnNldCh0aGlzLCByZWdpc3RlcmVkSW5qZWN0b3JzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlZ2lzdGVyZWRJbmplY3RvcnMuaW5kZXhPZihpbmplY3Rvckl0ZW0pID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm93bihpbnZhbGlkYXRvci5vbignaW52YWxpZGF0ZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWRJbmplY3RvcnMucHVzaChpbmplY3Rvckl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJvcGVydGllcyhpbmplY3RvcigpLCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkodGFyZ2V0KTtcbiAgICB9KTtcbn1cbmV4cG9ydCBkZWZhdWx0IGluamVjdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluamVjdC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaW5qZWN0Lm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaW5qZWN0Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCB7IFdJREdFVF9CQVNFX1RZUEUgfSBmcm9tICcuL1JlZ2lzdHJ5JztcbmZ1bmN0aW9uIGlzT2JqZWN0T3JBcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhbHdheXMocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjaGFuZ2VkOiB0cnVlLFxuICAgICAgICB2YWx1ZTogbmV3UHJvcGVydHlcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZShwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5nZWQ6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogbmV3UHJvcGVydHlcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlZmVyZW5jZShwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5nZWQ6IHByZXZpb3VzUHJvcGVydHkgIT09IG5ld1Byb3BlcnR5LFxuICAgICAgICB2YWx1ZTogbmV3UHJvcGVydHlcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNoYWxsb3cocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpIHtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHZhbGlkT2xkUHJvcGVydHkgPSBwcmV2aW91c1Byb3BlcnR5ICYmIGlzT2JqZWN0T3JBcnJheShwcmV2aW91c1Byb3BlcnR5KTtcbiAgICBjb25zdCB2YWxpZE5ld1Byb3BlcnR5ID0gbmV3UHJvcGVydHkgJiYgaXNPYmplY3RPckFycmF5KG5ld1Byb3BlcnR5KTtcbiAgICBpZiAoIXZhbGlkT2xkUHJvcGVydHkgfHwgIXZhbGlkTmV3UHJvcGVydHkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNoYW5nZWQ6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbmV3UHJvcGVydHlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcHJldmlvdXNLZXlzID0gT2JqZWN0LmtleXMocHJldmlvdXNQcm9wZXJ0eSk7XG4gICAgY29uc3QgbmV3S2V5cyA9IE9iamVjdC5rZXlzKG5ld1Byb3BlcnR5KTtcbiAgICBpZiAocHJldmlvdXNLZXlzLmxlbmd0aCAhPT0gbmV3S2V5cy5sZW5ndGgpIHtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjaGFuZ2VkID0gbmV3S2V5cy5zb21lKChrZXkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXdQcm9wZXJ0eVtrZXldICE9PSBwcmV2aW91c1Byb3BlcnR5W2tleV07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBjaGFuZ2VkLFxuICAgICAgICB2YWx1ZTogbmV3UHJvcGVydHlcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGF1dG8ocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmICh0eXBlb2YgbmV3UHJvcGVydHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKG5ld1Byb3BlcnR5Ll90eXBlID09PSBXSURHRVRfQkFTRV9UWVBFKSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZWZlcmVuY2UocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gaWdub3JlKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChpc09iamVjdE9yQXJyYXkobmV3UHJvcGVydHkpKSB7XG4gICAgICAgIHJlc3VsdCA9IHNoYWxsb3cocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gcmVmZXJlbmNlKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRpZmYubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kaWZmLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RpZmYubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGFzc2lnbiB9IGZyb20gJy4uLy4uL2NvcmUvbGFuZyc7XG5pbXBvcnQgY3NzVHJhbnNpdGlvbnMgZnJvbSAnLi4vYW5pbWF0aW9ucy9jc3NUcmFuc2l0aW9ucyc7XG5pbXBvcnQgeyBhZnRlclJlbmRlciB9IGZyb20gJy4vLi4vZGVjb3JhdG9ycy9hZnRlclJlbmRlcic7XG5pbXBvcnQgeyB2IH0gZnJvbSAnLi8uLi9kJztcbmltcG9ydCB7IGRvbSB9IGZyb20gJy4vLi4vdmRvbSc7XG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGF0dGFjaCBzdGF0ZSBvZiB0aGUgcHJvamVjdG9yXG4gKi9cbmV4cG9ydCB2YXIgUHJvamVjdG9yQXR0YWNoU3RhdGU7XG4oZnVuY3Rpb24gKFByb2plY3RvckF0dGFjaFN0YXRlKSB7XG4gICAgUHJvamVjdG9yQXR0YWNoU3RhdGVbUHJvamVjdG9yQXR0YWNoU3RhdGVbXCJBdHRhY2hlZFwiXSA9IDFdID0gXCJBdHRhY2hlZFwiO1xuICAgIFByb2plY3RvckF0dGFjaFN0YXRlW1Byb2plY3RvckF0dGFjaFN0YXRlW1wiRGV0YWNoZWRcIl0gPSAyXSA9IFwiRGV0YWNoZWRcIjtcbn0pKFByb2plY3RvckF0dGFjaFN0YXRlIHx8IChQcm9qZWN0b3JBdHRhY2hTdGF0ZSA9IHt9KSk7XG4vKipcbiAqIEF0dGFjaCB0eXBlIGZvciB0aGUgcHJvamVjdG9yXG4gKi9cbmV4cG9ydCB2YXIgQXR0YWNoVHlwZTtcbihmdW5jdGlvbiAoQXR0YWNoVHlwZSkge1xuICAgIEF0dGFjaFR5cGVbQXR0YWNoVHlwZVtcIkFwcGVuZFwiXSA9IDFdID0gXCJBcHBlbmRcIjtcbiAgICBBdHRhY2hUeXBlW0F0dGFjaFR5cGVbXCJNZXJnZVwiXSA9IDJdID0gXCJNZXJnZVwiO1xufSkoQXR0YWNoVHlwZSB8fCAoQXR0YWNoVHlwZSA9IHt9KSk7XG5leHBvcnQgZnVuY3Rpb24gUHJvamVjdG9yTWl4aW4oQmFzZSkge1xuICAgIGNsYXNzIFByb2plY3RvciBleHRlbmRzIEJhc2Uge1xuICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7XG4gICAgICAgICAgICBzdXBlciguLi5hcmdzKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3QgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgICAgICAgdGhpcy5fYXN5bmMgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fcHJvamVjdG9yUHJvcGVydGllcyA9IHt9O1xuICAgICAgICAgICAgdGhpcy5fcHJvamVjdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbnM6IGNzc1RyYW5zaXRpb25zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5yb290ID0gZG9jdW1lbnQuYm9keTtcbiAgICAgICAgICAgIHRoaXMucHJvamVjdG9yU3RhdGUgPSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5EZXRhY2hlZDtcbiAgICAgICAgfVxuICAgICAgICBhcHBlbmQocm9vdCkge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBBdHRhY2hUeXBlLkFwcGVuZCxcbiAgICAgICAgICAgICAgICByb290XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2F0dGFjaChvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBtZXJnZShyb290KSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IEF0dGFjaFR5cGUuTWVyZ2UsXG4gICAgICAgICAgICAgICAgcm9vdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdHRhY2gob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0IHJvb3Qocm9vdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvamVjdG9yU3RhdGUgPT09IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9qZWN0b3IgYWxyZWFkeSBhdHRhY2hlZCwgY2Fubm90IGNoYW5nZSByb290IGVsZW1lbnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3Jvb3QgPSByb290O1xuICAgICAgICB9XG4gICAgICAgIGdldCByb290KCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3Q7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGFzeW5jKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FzeW5jO1xuICAgICAgICB9XG4gICAgICAgIHNldCBhc3luYyhhc3luYykge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvamVjdG9yU3RhdGUgPT09IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9qZWN0b3IgYWxyZWFkeSBhdHRhY2hlZCwgY2Fubm90IGNoYW5nZSBhc3luYyBtb2RlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9hc3luYyA9IGFzeW5jO1xuICAgICAgICB9XG4gICAgICAgIHNhbmRib3goZG9jID0gZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb2plY3RvclN0YXRlID09PSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5BdHRhY2hlZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJvamVjdG9yIGFscmVhZHkgYXR0YWNoZWQsIGNhbm5vdCBjcmVhdGUgc2FuZGJveCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fYXN5bmMgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzUm9vdCA9IHRoaXMucm9vdDtcbiAgICAgICAgICAgIC8qIGZyZWUgdXAgdGhlIGRvY3VtZW50IGZyYWdtZW50IGZvciBHQyAqL1xuICAgICAgICAgICAgdGhpcy5vd24oe1xuICAgICAgICAgICAgICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcm9vdCA9IHByZXZpb3VzUm9vdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX2F0dGFjaCh7XG4gICAgICAgICAgICAgICAgLyogRG9jdW1lbnRGcmFnbWVudCBpcyBub3QgYXNzaWduYWJsZSB0byBFbGVtZW50LCBidXQgcHJvdmlkZXMgZXZlcnl0aGluZyBuZWVkZWQgdG8gd29yayAqL1xuICAgICAgICAgICAgICAgIHJvb3Q6IGRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG4gICAgICAgICAgICAgICAgdHlwZTogQXR0YWNoVHlwZS5BcHBlbmRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHNldENoaWxkcmVuKGNoaWxkcmVuKSB7XG4gICAgICAgICAgICB0aGlzLl9fc2V0Q2hpbGRyZW5fXyhjaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICB0aGlzLl9fc2V0UHJvcGVydGllc19fKHByb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgICAgIF9fc2V0UHJvcGVydGllc19fKHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9wcm9qZWN0b3JQcm9wZXJ0aWVzICYmIHRoaXMuX3Byb2plY3RvclByb3BlcnRpZXMucmVnaXN0cnkgIT09IHByb3BlcnRpZXMucmVnaXN0cnkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcHJvamVjdG9yUHJvcGVydGllcy5yZWdpc3RyeSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm9qZWN0b3JQcm9wZXJ0aWVzLnJlZ2lzdHJ5LmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9wcm9qZWN0b3JQcm9wZXJ0aWVzID0gYXNzaWduKHt9LCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIHN1cGVyLl9fc2V0Q29yZVByb3BlcnRpZXNfXyh7IGJpbmQ6IHRoaXMsIGJhc2VSZWdpc3RyeTogcHJvcGVydGllcy5yZWdpc3RyeSB9KTtcbiAgICAgICAgICAgIHN1cGVyLl9fc2V0UHJvcGVydGllc19fKHByb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgICAgIHRvSHRtbCgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb2plY3RvclN0YXRlICE9PSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5BdHRhY2hlZCB8fCAhdGhpcy5fcHJvamVjdGlvbikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJvamVjdG9yIGlzIG5vdCBhdHRhY2hlZCwgY2Fubm90IHJldHVybiBhbiBIVE1MIHN0cmluZyBvZiBwcm9qZWN0aW9uLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2plY3Rpb24uZG9tTm9kZS5jaGlsZE5vZGVzWzBdLm91dGVySFRNTDtcbiAgICAgICAgfVxuICAgICAgICBhZnRlclJlbmRlcihyZXN1bHQpIHtcbiAgICAgICAgICAgIGxldCBub2RlID0gcmVzdWx0O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnIHx8IHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG5vZGUgPSB2KCdzcGFuJywge30sIFtyZXN1bHRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgICAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgX2F0dGFjaCh7IHR5cGUsIHJvb3QgfSkge1xuICAgICAgICAgICAgaWYgKHJvb3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3QgPSByb290O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2F0dGFjaEhhbmRsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdHRhY2hIYW5kbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByb2plY3RvclN0YXRlID0gUHJvamVjdG9yQXR0YWNoU3RhdGUuQXR0YWNoZWQ7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB7XG4gICAgICAgICAgICAgICAgZGVzdHJveTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9qZWN0b3JTdGF0ZSA9PT0gUHJvamVjdG9yQXR0YWNoU3RhdGUuQXR0YWNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2plY3RvclN0YXRlID0gUHJvamVjdG9yQXR0YWNoU3RhdGUuRGV0YWNoZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5vd24oaGFuZGxlKTtcbiAgICAgICAgICAgIHRoaXMuX2F0dGFjaEhhbmRsZSA9IGhhbmRsZTtcbiAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rpb25PcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcHJvamVjdGlvbk9wdGlvbnMsIHsgc3luYzogIXRoaXMuX2FzeW5jIH0pO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBBdHRhY2hUeXBlLkFwcGVuZDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvamVjdGlvbiA9IGRvbS5hcHBlbmQodGhpcy5yb290LCB0aGlzLCB0aGlzLl9wcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgQXR0YWNoVHlwZS5NZXJnZTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvamVjdGlvbiA9IGRvbS5tZXJnZSh0aGlzLnJvb3QsIHRoaXMsIHRoaXMuX3Byb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXR0YWNoSGFuZGxlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRzbGliXzEuX19kZWNvcmF0ZShbXG4gICAgICAgIGFmdGVyUmVuZGVyKClcbiAgICBdLCBQcm9qZWN0b3IucHJvdG90eXBlLCBcImFmdGVyUmVuZGVyXCIsIG51bGwpO1xuICAgIHJldHVybiBQcm9qZWN0b3I7XG59XG5leHBvcnQgZGVmYXVsdCBQcm9qZWN0b3JNaXhpbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVByb2plY3Rvci5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL21peGlucy9Qcm9qZWN0b3IubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvbWl4aW5zL1Byb2plY3Rvci5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgSW5qZWN0b3IgfSBmcm9tICcuLy4uL0luamVjdG9yJztcbmltcG9ydCB7IGluamVjdCB9IGZyb20gJy4vLi4vZGVjb3JhdG9ycy9pbmplY3QnO1xuaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi8uLi9kZWNvcmF0b3JzL2hhbmRsZURlY29yYXRvcic7XG5pbXBvcnQgeyBkaWZmUHJvcGVydHkgfSBmcm9tICcuLy4uL2RlY29yYXRvcnMvZGlmZlByb3BlcnR5JztcbmltcG9ydCB7IHNoYWxsb3cgfSBmcm9tICcuLy4uL2RpZmYnO1xuY29uc3QgVEhFTUVfS0VZID0gJyBfa2V5JztcbmV4cG9ydCBjb25zdCBJTkpFQ1RFRF9USEVNRV9LRVkgPSBTeW1ib2woJ3RoZW1lJyk7XG4vKipcbiAqIERlY29yYXRvciBmb3IgYmFzZSBjc3MgY2xhc3Nlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGhlbWUodGhlbWUpIHtcbiAgICByZXR1cm4gaGFuZGxlRGVjb3JhdG9yKCh0YXJnZXQpID0+IHtcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcignYmFzZVRoZW1lQ2xhc3NlcycsIHRoZW1lKTtcbiAgICB9KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIHJldmVyc2UgbG9va3VwIGZvciB0aGUgY2xhc3NlcyBwYXNzZWQgaW4gdmlhIHRoZSBgdGhlbWVgIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBjbGFzc2VzIFRoZSBiYXNlQ2xhc3NlcyBvYmplY3RcbiAqIEByZXF1aXJlc1xuICovXG5mdW5jdGlvbiBjcmVhdGVUaGVtZUNsYXNzZXNMb29rdXAoY2xhc3Nlcykge1xuICAgIHJldHVybiBjbGFzc2VzLnJlZHVjZSgoY3VycmVudENsYXNzTmFtZXMsIGJhc2VDbGFzcykgPT4ge1xuICAgICAgICBPYmplY3Qua2V5cyhiYXNlQ2xhc3MpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgY3VycmVudENsYXNzTmFtZXNbYmFzZUNsYXNzW2tleV1dID0ga2V5O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzc05hbWVzO1xuICAgIH0sIHt9KTtcbn1cbi8qKlxuICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBpcyBnaXZlbiBhIHRoZW1lIGFuZCBhbiBvcHRpb25hbCByZWdpc3RyeSwgdGhlIHRoZW1lXG4gKiBpbmplY3RvciBpcyBkZWZpbmVkIGFnYWluc3QgdGhlIHJlZ2lzdHJ5LCByZXR1cm5pbmcgdGhlIHRoZW1lLlxuICpcbiAqIEBwYXJhbSB0aGVtZSB0aGUgdGhlbWUgdG8gc2V0XG4gKiBAcGFyYW0gdGhlbWVSZWdpc3RyeSByZWdpc3RyeSB0byBkZWZpbmUgdGhlIHRoZW1lIGluamVjdG9yIGFnYWluc3QuIERlZmF1bHRzXG4gKiB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5XG4gKlxuICogQHJldHVybnMgdGhlIHRoZW1lIGluamVjdG9yIHVzZWQgdG8gc2V0IHRoZSB0aGVtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJUaGVtZUluamVjdG9yKHRoZW1lLCB0aGVtZVJlZ2lzdHJ5KSB7XG4gICAgY29uc3QgdGhlbWVJbmplY3RvciA9IG5ldyBJbmplY3Rvcih0aGVtZSk7XG4gICAgdGhlbWVSZWdpc3RyeS5kZWZpbmVJbmplY3RvcihJTkpFQ1RFRF9USEVNRV9LRVksIChpbnZhbGlkYXRvcikgPT4ge1xuICAgICAgICB0aGVtZUluamVjdG9yLnNldEludmFsaWRhdG9yKGludmFsaWRhdG9yKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHRoZW1lSW5qZWN0b3IuZ2V0KCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoZW1lSW5qZWN0b3I7XG59XG4vKipcbiAqIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGNsYXNzIGRlY29yYXRlZCB3aXRoIHdpdGggVGhlbWVkIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFRoZW1lZE1peGluKEJhc2UpIHtcbiAgICBsZXQgVGhlbWVkID0gY2xhc3MgVGhlbWVkIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogUmVnaXN0ZXJlZCBiYXNlIHRoZW1lIGtleXNcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZEJhc2VUaGVtZUtleXMgPSBbXTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogSW5kaWNhdGVzIGlmIGNsYXNzZXMgbWV0YSBkYXRhIG5lZWQgdG8gYmUgY2FsY3VsYXRlZC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy5fcmVjYWxjdWxhdGVDbGFzc2VzID0gdHJ1ZTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogTG9hZGVkIHRoZW1lXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXMuX3RoZW1lID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhlbWUoY2xhc3Nlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JlY2FsY3VsYXRlQ2xhc3Nlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlY2FsY3VsYXRlVGhlbWVDbGFzc2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjbGFzc2VzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc2VzLm1hcCgoY2xhc3NOYW1lKSA9PiB0aGlzLl9nZXRUaGVtZUNsYXNzKGNsYXNzTmFtZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFRoZW1lQ2xhc3MoY2xhc3Nlcyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZ1bmN0aW9uIGZpcmVkIHdoZW4gYHRoZW1lYCBvciBgZXh0cmFDbGFzc2VzYCBhcmUgY2hhbmdlZC5cbiAgICAgICAgICovXG4gICAgICAgIG9uUHJvcGVydGllc0NoYW5nZWQoKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWNhbGN1bGF0ZUNsYXNzZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIF9nZXRUaGVtZUNsYXNzKGNsYXNzTmFtZSkge1xuICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PT0gdW5kZWZpbmVkIHx8IGNsYXNzTmFtZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBleHRyYUNsYXNzZXMgPSB0aGlzLnByb3BlcnRpZXMuZXh0cmFDbGFzc2VzIHx8IHt9O1xuICAgICAgICAgICAgY29uc3QgdGhlbWVDbGFzc05hbWUgPSB0aGlzLl9iYXNlVGhlbWVDbGFzc2VzUmV2ZXJzZUxvb2t1cFtjbGFzc05hbWVdO1xuICAgICAgICAgICAgbGV0IHJlc3VsdENsYXNzTmFtZXMgPSBbXTtcbiAgICAgICAgICAgIGlmICghdGhlbWVDbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYENsYXNzIG5hbWU6ICcke2NsYXNzTmFtZX0nIG5vdCBmb3VuZCBpbiB0aGVtZWApO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4dHJhQ2xhc3Nlc1t0aGVtZUNsYXNzTmFtZV0pIHtcbiAgICAgICAgICAgICAgICByZXN1bHRDbGFzc05hbWVzLnB1c2goZXh0cmFDbGFzc2VzW3RoZW1lQ2xhc3NOYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fdGhlbWVbdGhlbWVDbGFzc05hbWVdKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0Q2xhc3NOYW1lcy5wdXNoKHRoaXMuX3RoZW1lW3RoZW1lQ2xhc3NOYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHRDbGFzc05hbWVzLnB1c2godGhpcy5fcmVnaXN0ZXJlZEJhc2VUaGVtZVt0aGVtZUNsYXNzTmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENsYXNzTmFtZXMuam9pbignICcpO1xuICAgICAgICB9XG4gICAgICAgIF9yZWNhbGN1bGF0ZVRoZW1lQ2xhc3NlcygpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGhlbWUgPSB7fSB9ID0gdGhpcy5wcm9wZXJ0aWVzO1xuICAgICAgICAgICAgY29uc3QgYmFzZVRoZW1lcyA9IHRoaXMuZ2V0RGVjb3JhdG9yKCdiYXNlVGhlbWVDbGFzc2VzJyk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3JlZ2lzdGVyZWRCYXNlVGhlbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lID0gYmFzZVRoZW1lcy5yZWR1Y2UoKGZpbmFsQmFzZVRoZW1lLCBiYXNlVGhlbWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX2EgPSBUSEVNRV9LRVksIGtleSA9IGJhc2VUaGVtZVtfYV0sIGNsYXNzZXMgPSB0c2xpYl8xLl9fcmVzdChiYXNlVGhlbWUsIFt0eXBlb2YgX2EgPT09IFwic3ltYm9sXCIgPyBfYSA6IF9hICsgXCJcIl0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lS2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBmaW5hbEJhc2VUaGVtZSwgY2xhc3Nlcyk7XG4gICAgICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Jhc2VUaGVtZUNsYXNzZXNSZXZlcnNlTG9va3VwID0gY3JlYXRlVGhlbWVDbGFzc2VzTG9va3VwKGJhc2VUaGVtZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdGhlbWUgPSB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lS2V5cy5yZWR1Y2UoKGJhc2VUaGVtZSwgdGhlbWVLZXkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgYmFzZVRoZW1lLCB0aGVtZVt0aGVtZUtleV0pO1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgdGhpcy5fcmVjYWxjdWxhdGVDbGFzc2VzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHRzbGliXzEuX19kZWNvcmF0ZShbXG4gICAgICAgIGRpZmZQcm9wZXJ0eSgndGhlbWUnLCBzaGFsbG93KSxcbiAgICAgICAgZGlmZlByb3BlcnR5KCdleHRyYUNsYXNzZXMnLCBzaGFsbG93KVxuICAgIF0sIFRoZW1lZC5wcm90b3R5cGUsIFwib25Qcm9wZXJ0aWVzQ2hhbmdlZFwiLCBudWxsKTtcbiAgICBUaGVtZWQgPSB0c2xpYl8xLl9fZGVjb3JhdGUoW1xuICAgICAgICBpbmplY3Qoe1xuICAgICAgICAgICAgbmFtZTogSU5KRUNURURfVEhFTUVfS0VZLFxuICAgICAgICAgICAgZ2V0UHJvcGVydGllczogKHRoZW1lLCBwcm9wZXJ0aWVzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFwcm9wZXJ0aWVzLnRoZW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHRoZW1lIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICBdLCBUaGVtZWQpO1xuICAgIHJldHVybiBUaGVtZWQ7XG59XG5leHBvcnQgZGVmYXVsdCBUaGVtZWRNaXhpbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRoZW1lZC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL21peGlucy9UaGVtZWQubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvbWl4aW5zL1RoZW1lZC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51LWl0ZW0iLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgV2lkZ2V0QmFzZSwgbm9CaW5kIH0gZnJvbSAnLi9XaWRnZXRCYXNlJztcbmltcG9ydCB7IFByb2plY3Rvck1peGluIH0gZnJvbSAnLi9taXhpbnMvUHJvamVjdG9yJztcbmltcG9ydCB7IGZyb20gfSBmcm9tICcuLi9zaGltL2FycmF5JztcbmltcG9ydCB7IHcsIGRvbSB9IGZyb20gJy4vZCc7XG5pbXBvcnQgZ2xvYmFsIGZyb20gJy4uL3NoaW0vZ2xvYmFsJztcbmltcG9ydCB7IHJlZ2lzdGVyVGhlbWVJbmplY3RvciB9IGZyb20gJy4vbWl4aW5zL1RoZW1lZCc7XG5pbXBvcnQgeyBhbHdheXNSZW5kZXIgfSBmcm9tICcuL2RlY29yYXRvcnMvYWx3YXlzUmVuZGVyJztcbmV4cG9ydCB2YXIgQ3VzdG9tRWxlbWVudENoaWxkVHlwZTtcbihmdW5jdGlvbiAoQ3VzdG9tRWxlbWVudENoaWxkVHlwZSkge1xuICAgIEN1c3RvbUVsZW1lbnRDaGlsZFR5cGVbXCJET0pPXCJdID0gXCJET0pPXCI7XG4gICAgQ3VzdG9tRWxlbWVudENoaWxkVHlwZVtcIk5PREVcIl0gPSBcIk5PREVcIjtcbiAgICBDdXN0b21FbGVtZW50Q2hpbGRUeXBlW1wiVEVYVFwiXSA9IFwiVEVYVFwiO1xufSkoQ3VzdG9tRWxlbWVudENoaWxkVHlwZSB8fCAoQ3VzdG9tRWxlbWVudENoaWxkVHlwZSA9IHt9KSk7XG5leHBvcnQgZnVuY3Rpb24gRG9tVG9XaWRnZXRXcmFwcGVyKGRvbU5vZGUpIHtcbiAgICBsZXQgRG9tVG9XaWRnZXRXcmFwcGVyID0gY2xhc3MgRG9tVG9XaWRnZXRXcmFwcGVyIGV4dGVuZHMgV2lkZ2V0QmFzZSB7XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyh0aGlzLnByb3BlcnRpZXMpLnJlZHVjZSgocHJvcHMsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5wcm9wZXJ0aWVzW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKGtleS5pbmRleE9mKCdvbicpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IGBfXyR7a2V5fWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByb3BzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvcHM7XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICByZXR1cm4gZG9tKHsgbm9kZTogZG9tTm9kZSwgcHJvcHM6IHByb3BlcnRpZXMsIGRpZmZUeXBlOiAnZG9tJyB9KTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZ2V0IGRvbU5vZGUoKSB7XG4gICAgICAgICAgICByZXR1cm4gZG9tTm9kZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRG9tVG9XaWRnZXRXcmFwcGVyID0gdHNsaWJfMS5fX2RlY29yYXRlKFtcbiAgICAgICAgYWx3YXlzUmVuZGVyKClcbiAgICBdLCBEb21Ub1dpZGdldFdyYXBwZXIpO1xuICAgIHJldHVybiBEb21Ub1dpZGdldFdyYXBwZXI7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKGRlc2NyaXB0b3IsIFdpZGdldENvbnN0cnVjdG9yKSB7XG4gICAgY29uc3QgeyBhdHRyaWJ1dGVzLCBjaGlsZFR5cGUsIHJlZ2lzdHJ5RmFjdG9yeSB9ID0gZGVzY3JpcHRvcjtcbiAgICBjb25zdCBhdHRyaWJ1dGVNYXAgPSB7fTtcbiAgICBhdHRyaWJ1dGVzLmZvckVhY2goKHByb3BlcnR5TmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGF0dHJpYnV0ZU1hcFthdHRyaWJ1dGVOYW1lXSA9IHByb3BlcnR5TmFtZTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkcmVuID0gW107XG4gICAgICAgICAgICB0aGlzLl9ldmVudFByb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxpc2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5faW5pdGlhbGlzZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBkb21Qcm9wZXJ0aWVzID0ge307XG4gICAgICAgICAgICBjb25zdCB7IGF0dHJpYnV0ZXMsIHByb3BlcnRpZXMsIGV2ZW50cyB9ID0gZGVzY3JpcHRvcjtcbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9wcm9wZXJ0aWVzLCB0aGlzLl9hdHRyaWJ1dGVzVG9Qcm9wZXJ0aWVzKGF0dHJpYnV0ZXMpKTtcbiAgICAgICAgICAgIFsuLi5hdHRyaWJ1dGVzLCAuLi5wcm9wZXJ0aWVzXS5mb3JFYWNoKChwcm9wZXJ0eU5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXNbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZFByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZS5yZXBsYWNlKC9eb24vLCAnX18nKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlcmVkUHJvcGVydHlOYW1lICE9PSBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tUHJvcGVydGllc1tmaWx0ZXJlZFByb3BlcnR5TmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXQ6ICgpID0+IHRoaXMuX2dldFByb3BlcnR5KHByb3BlcnR5TmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXQ6ICh2YWx1ZSkgPT4gdGhpcy5fc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZG9tUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICBnZXQ6ICgpID0+IHRoaXMuX2dldFByb3BlcnR5KHByb3BlcnR5TmFtZSksXG4gICAgICAgICAgICAgICAgICAgIHNldDogKHZhbHVlKSA9PiB0aGlzLl9zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGV2ZW50cy5mb3JFYWNoKChwcm9wZXJ0eU5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBwcm9wZXJ0eU5hbWUucmVwbGFjZSgvXm9uLywgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRQcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUucmVwbGFjZSgvXm9uLywgJ19fb24nKTtcbiAgICAgICAgICAgICAgICBkb21Qcm9wZXJ0aWVzW2ZpbHRlcmVkUHJvcGVydHlOYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiAoKSA9PiB0aGlzLl9nZXRFdmVudFByb3BlcnR5KHByb3BlcnR5TmFtZSksXG4gICAgICAgICAgICAgICAgICAgIHNldDogKHZhbHVlKSA9PiB0aGlzLl9zZXRFdmVudFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLl9ldmVudFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudENhbGxiYWNrID0gdGhpcy5fZ2V0RXZlbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV2ZW50Q2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Q2FsbGJhY2soLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBhcmdzXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCBkb21Qcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY2hpbGRUeXBlID09PSBDdXN0b21FbGVtZW50Q2hpbGRUeXBlLlRFWFQgPyB0aGlzLmNoaWxkTm9kZXMgOiB0aGlzLmNoaWxkcmVuO1xuICAgICAgICAgICAgZnJvbShjaGlsZHJlbikuZm9yRWFjaCgoY2hpbGROb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkVHlwZSA9PT0gQ3VzdG9tRWxlbWVudENoaWxkVHlwZS5ET0pPKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkTm9kZS5hZGRFdmVudExpc3RlbmVyKCdkb2pvLWNlLXJlbmRlcicsICgpID0+IHRoaXMuX3JlbmRlcigpKTtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGROb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2Rvam8tY2UtY29ubmVjdGVkJywgKCkgPT4gdGhpcy5fcmVuZGVyKCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGlsZHJlbi5wdXNoKERvbVRvV2lkZ2V0V3JhcHBlcihjaGlsZE5vZGUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoaWxkcmVuLnB1c2goZG9tKHsgbm9kZTogY2hpbGROb2RlLCBkaWZmVHlwZTogJ2RvbScgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdkb2pvLWNlLWNvbm5lY3RlZCcsIChlKSA9PiB0aGlzLl9jaGlsZENvbm5lY3RlZChlKSk7XG4gICAgICAgICAgICBjb25zdCB3aWRnZXRQcm9wZXJ0aWVzID0gdGhpcy5fcHJvcGVydGllcztcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlckNoaWxkcmVuID0gKCkgPT4gdGhpcy5fX2NoaWxkcmVuX18oKTtcbiAgICAgICAgICAgIGNvbnN0IFdyYXBwZXIgPSBjbGFzcyBleHRlbmRzIFdpZGdldEJhc2Uge1xuICAgICAgICAgICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHcoV2lkZ2V0Q29uc3RydWN0b3IsIHdpZGdldFByb3BlcnRpZXMsIHJlbmRlckNoaWxkcmVuKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCByZWdpc3RyeSA9IHJlZ2lzdHJ5RmFjdG9yeSgpO1xuICAgICAgICAgICAgY29uc3QgdGhlbWVDb250ZXh0ID0gcmVnaXN0ZXJUaGVtZUluamVjdG9yKHRoaXMuX2dldFRoZW1lKCksIHJlZ2lzdHJ5KTtcbiAgICAgICAgICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdkb2pvLXRoZW1lLXNldCcsICgpID0+IHRoZW1lQ29udGV4dC5zZXQodGhpcy5fZ2V0VGhlbWUoKSkpO1xuICAgICAgICAgICAgY29uc3QgUHJvamVjdG9yID0gUHJvamVjdG9yTWl4aW4oV3JhcHBlcik7XG4gICAgICAgICAgICB0aGlzLl9wcm9qZWN0b3IgPSBuZXcgUHJvamVjdG9yKCk7XG4gICAgICAgICAgICB0aGlzLl9wcm9qZWN0b3Iuc2V0UHJvcGVydGllcyh7IHJlZ2lzdHJ5IH0pO1xuICAgICAgICAgICAgdGhpcy5fcHJvamVjdG9yLmFwcGVuZCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxpc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2Rvam8tY2UtY29ubmVjdGVkJywge1xuICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgZGV0YWlsOiB0aGlzXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgX2dldFRoZW1lKCkge1xuICAgICAgICAgICAgaWYgKGdsb2JhbCAmJiBnbG9iYWwuZG9qb2NlICYmIGdsb2JhbC5kb2pvY2UudGhlbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2xvYmFsLmRvam9jZS50aGVtZXNbZ2xvYmFsLmRvam9jZS50aGVtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX2NoaWxkQ29ubmVjdGVkKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBlLmRldGFpbDtcbiAgICAgICAgICAgIGlmIChub2RlLnBhcmVudE5vZGUgPT09IHRoaXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdHMgPSB0aGlzLl9jaGlsZHJlbi5zb21lKChjaGlsZCkgPT4gY2hpbGQuZG9tTm9kZSA9PT0gbm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdkb2pvLWNlLXJlbmRlcicsICgpID0+IHRoaXMuX3JlbmRlcigpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hpbGRyZW4ucHVzaChEb21Ub1dpZGdldFdyYXBwZXIobm9kZSkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX3JlbmRlcigpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9wcm9qZWN0b3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9qZWN0b3IuaW52YWxpZGF0ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2Rvam8tY2UtcmVuZGVyJywge1xuICAgICAgICAgICAgICAgICAgICBidWJibGVzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB0aGlzXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9fcHJvcGVydGllc19fKCkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3Byb3BlcnRpZXMsIHRoaXMuX2V2ZW50UHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICAgICAgX19jaGlsZHJlbl9fKCkge1xuICAgICAgICAgICAgaWYgKGNoaWxkVHlwZSA9PT0gQ3VzdG9tRWxlbWVudENoaWxkVHlwZS5ET0pPKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuLmZpbHRlcigoQ2hpbGQpID0+IENoaWxkLmRvbU5vZGUuaXNXaWRnZXQpLm1hcCgoQ2hpbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkb21Ob2RlIH0gPSBDaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHcoQ2hpbGQsIE9iamVjdC5hc3NpZ24oe30sIGRvbU5vZGUuX19wcm9wZXJ0aWVzX18oKSksIFsuLi5kb21Ob2RlLl9fY2hpbGRyZW5fXygpXSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZFZhbHVlLCB2YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gYXR0cmlidXRlTWFwW25hbWVdO1xuICAgICAgICAgICAgdGhpcy5fc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgX3NldEV2ZW50UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fZXZlbnRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBfZ2V0RXZlbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ldmVudFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBfc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHZhbHVlW25vQmluZF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBfZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIF9hdHRyaWJ1dGVzVG9Qcm9wZXJ0aWVzKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzLnJlZHVjZSgocHJvcGVydGllcywgcHJvcGVydHlOYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IHByb3BlcnR5TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGVydGllcztcbiAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhhdHRyaWJ1dGVNYXApO1xuICAgICAgICB9XG4gICAgICAgIGdldCBpc1dpZGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlcihXaWRnZXRDb25zdHJ1Y3Rvcikge1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBXaWRnZXRDb25zdHJ1Y3Rvci5wcm90b3R5cGUgJiYgV2lkZ2V0Q29uc3RydWN0b3IucHJvdG90eXBlLl9fY3VzdG9tRWxlbWVudERlc2NyaXB0b3I7XG4gICAgaWYgKCFkZXNjcmlwdG9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdldCBkZXNjcmlwdG9yIGZvciBDdXN0b20gRWxlbWVudCwgaGF2ZSB5b3UgYWRkZWQgdGhlIEBjdXN0b21FbGVtZW50IGRlY29yYXRvciB0byB5b3VyIFdpZGdldD8nKTtcbiAgICB9XG4gICAgZ2xvYmFsLmN1c3RvbUVsZW1lbnRzLmRlZmluZShkZXNjcmlwdG9yLnRhZ05hbWUsIGNyZWF0ZShkZXNjcmlwdG9yLCBXaWRnZXRDb25zdHJ1Y3RvcikpO1xufVxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWdpc3RlckN1c3RvbUVsZW1lbnQubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9yZWdpc3RlckN1c3RvbUVsZW1lbnQubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvcmVnaXN0ZXJDdXN0b21FbGVtZW50Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi4vc2hpbS9nbG9iYWwnO1xyXG5pbXBvcnQgeyBmcm9tIGFzIGFycmF5RnJvbSB9IGZyb20gJy4uL3NoaW0vYXJyYXknO1xyXG5pbXBvcnQgeyBpc1dOb2RlLCBpc1ZOb2RlLCBpc0RvbVZOb2RlLCBWTk9ERSwgV05PREUgfSBmcm9tICcuL2QnO1xyXG5pbXBvcnQgeyBpc1dpZGdldEJhc2VDb25zdHJ1Y3RvciB9IGZyb20gJy4vUmVnaXN0cnknO1xyXG5pbXBvcnQgV2Vha01hcCBmcm9tICcuLi9zaGltL1dlYWtNYXAnO1xyXG5jb25zdCBOQU1FU1BBQ0VfVzMgPSAnaHR0cDovL3d3dy53My5vcmcvJztcclxuY29uc3QgTkFNRVNQQUNFX1NWRyA9IE5BTUVTUEFDRV9XMyArICcyMDAwL3N2Zyc7XHJcbmNvbnN0IE5BTUVTUEFDRV9YTElOSyA9IE5BTUVTUEFDRV9XMyArICcxOTk5L3hsaW5rJztcclxuY29uc3QgZW1wdHlBcnJheSA9IFtdO1xyXG5jb25zdCBub2RlT3BlcmF0aW9ucyA9IFsnZm9jdXMnLCAnYmx1cicsICdzY3JvbGxJbnRvVmlldycsICdjbGljayddO1xyXG5leHBvcnQgY29uc3Qgd2lkZ2V0SW5zdGFuY2VNYXAgPSBuZXcgV2Vha01hcCgpO1xyXG5jb25zdCBpbnN0YW5jZU1hcCA9IG5ldyBXZWFrTWFwKCk7XHJcbmNvbnN0IG5leHRTaWJsaW5nTWFwID0gbmV3IFdlYWtNYXAoKTtcclxuY29uc3QgcHJvamVjdG9yU3RhdGVNYXAgPSBuZXcgV2Vha01hcCgpO1xyXG5mdW5jdGlvbiBzYW1lKGRub2RlMSwgZG5vZGUyKSB7XHJcbiAgICBpZiAoaXNWTm9kZShkbm9kZTEpICYmIGlzVk5vZGUoZG5vZGUyKSkge1xyXG4gICAgICAgIGlmIChpc0RvbVZOb2RlKGRub2RlMSkgfHwgaXNEb21WTm9kZShkbm9kZTIpKSB7XHJcbiAgICAgICAgICAgIGlmIChkbm9kZTEuZG9tTm9kZSAhPT0gZG5vZGUyLmRvbU5vZGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZG5vZGUxLnRhZyAhPT0gZG5vZGUyLnRhZykge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkbm9kZTEucHJvcGVydGllcy5rZXkgIT09IGRub2RlMi5wcm9wZXJ0aWVzLmtleSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoaXNXTm9kZShkbm9kZTEpICYmIGlzV05vZGUoZG5vZGUyKSkge1xyXG4gICAgICAgIGlmIChkbm9kZTEuaW5zdGFuY2UgPT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZG5vZGUyLndpZGdldENvbnN0cnVjdG9yID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkbm9kZTEud2lkZ2V0Q29uc3RydWN0b3IgIT09IGRub2RlMi53aWRnZXRDb25zdHJ1Y3Rvcikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkbm9kZTEucHJvcGVydGllcy5rZXkgIT09IGRub2RlMi5wcm9wZXJ0aWVzLmtleSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59XHJcbmNvbnN0IG1pc3NpbmdUcmFuc2l0aW9uID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdQcm92aWRlIGEgdHJhbnNpdGlvbnMgb2JqZWN0IHRvIHRoZSBwcm9qZWN0aW9uT3B0aW9ucyB0byBkbyBhbmltYXRpb25zJyk7XHJcbn07XHJcbmZ1bmN0aW9uIGdldFByb2plY3Rpb25PcHRpb25zKHByb2plY3Rvck9wdGlvbnMsIHByb2plY3Rvckluc3RhbmNlKSB7XHJcbiAgICBjb25zdCBkZWZhdWx0cyA9IHtcclxuICAgICAgICBuYW1lc3BhY2U6IHVuZGVmaW5lZCxcclxuICAgICAgICBzdHlsZUFwcGx5ZXI6IGZ1bmN0aW9uIChkb21Ob2RlLCBzdHlsZU5hbWUsIHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGRvbU5vZGUuc3R5bGVbc3R5bGVOYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdHJhbnNpdGlvbnM6IHtcclxuICAgICAgICAgICAgZW50ZXI6IG1pc3NpbmdUcmFuc2l0aW9uLFxyXG4gICAgICAgICAgICBleGl0OiBtaXNzaW5nVHJhbnNpdGlvblxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZGVwdGg6IDAsXHJcbiAgICAgICAgbWVyZ2U6IGZhbHNlLFxyXG4gICAgICAgIHN5bmM6IGZhbHNlLFxyXG4gICAgICAgIHByb2plY3Rvckluc3RhbmNlXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRzLCBwcm9qZWN0b3JPcHRpb25zKTtcclxufVxyXG5mdW5jdGlvbiBjaGVja1N0eWxlVmFsdWUoc3R5bGVWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBzdHlsZVZhbHVlICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU3R5bGUgdmFsdWVzIG11c3QgYmUgc3RyaW5ncycpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHVwZGF0ZUV2ZW50KGRvbU5vZGUsIGV2ZW50TmFtZSwgY3VycmVudFZhbHVlLCBwcm9qZWN0aW9uT3B0aW9ucywgYmluZCwgcHJldmlvdXNWYWx1ZSkge1xyXG4gICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xyXG4gICAgY29uc3QgZXZlbnRNYXAgPSBwcm9qZWN0b3JTdGF0ZS5ub2RlTWFwLmdldChkb21Ob2RlKSB8fCBuZXcgV2Vha01hcCgpO1xyXG4gICAgaWYgKHByZXZpb3VzVmFsdWUpIHtcclxuICAgICAgICBjb25zdCBwcmV2aW91c0V2ZW50ID0gZXZlbnRNYXAuZ2V0KHByZXZpb3VzVmFsdWUpO1xyXG4gICAgICAgIGRvbU5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHByZXZpb3VzRXZlbnQpO1xyXG4gICAgfVxyXG4gICAgbGV0IGNhbGxiYWNrID0gY3VycmVudFZhbHVlLmJpbmQoYmluZCk7XHJcbiAgICBpZiAoZXZlbnROYW1lID09PSAnaW5wdXQnKSB7XHJcbiAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoZXZ0KSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZS5jYWxsKHRoaXMsIGV2dCk7XHJcbiAgICAgICAgICAgIGV2dC50YXJnZXRbJ29uaW5wdXQtdmFsdWUnXSA9IGV2dC50YXJnZXQudmFsdWU7XHJcbiAgICAgICAgfS5iaW5kKGJpbmQpO1xyXG4gICAgfVxyXG4gICAgZG9tTm9kZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgY2FsbGJhY2spO1xyXG4gICAgZXZlbnRNYXAuc2V0KGN1cnJlbnRWYWx1ZSwgY2FsbGJhY2spO1xyXG4gICAgcHJvamVjdG9yU3RhdGUubm9kZU1hcC5zZXQoZG9tTm9kZSwgZXZlbnRNYXApO1xyXG59XHJcbmZ1bmN0aW9uIGFkZENsYXNzZXMoZG9tTm9kZSwgY2xhc3Nlcykge1xyXG4gICAgaWYgKGNsYXNzZXMpIHtcclxuICAgICAgICBjb25zdCBjbGFzc05hbWVzID0gY2xhc3Nlcy5zcGxpdCgnICcpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBkb21Ob2RlLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lc1tpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHJlbW92ZUNsYXNzZXMoZG9tTm9kZSwgY2xhc3Nlcykge1xyXG4gICAgaWYgKGNsYXNzZXMpIHtcclxuICAgICAgICBjb25zdCBjbGFzc05hbWVzID0gY2xhc3Nlcy5zcGxpdCgnICcpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBkb21Ob2RlLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lc1tpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGJ1aWxkUHJldmlvdXNQcm9wZXJ0aWVzKGRvbU5vZGUsIHByZXZpb3VzLCBjdXJyZW50KSB7XHJcbiAgICBjb25zdCB7IGRpZmZUeXBlLCBwcm9wZXJ0aWVzLCBhdHRyaWJ1dGVzIH0gPSBjdXJyZW50O1xyXG4gICAgaWYgKCFkaWZmVHlwZSB8fCBkaWZmVHlwZSA9PT0gJ3Zkb20nKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgcHJvcGVydGllczogcHJldmlvdXMucHJvcGVydGllcywgYXR0cmlidXRlczogcHJldmlvdXMuYXR0cmlidXRlcywgZXZlbnRzOiBwcmV2aW91cy5ldmVudHMgfTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGRpZmZUeXBlID09PSAnbm9uZScpIHtcclxuICAgICAgICByZXR1cm4geyBwcm9wZXJ0aWVzOiB7fSwgYXR0cmlidXRlczogcHJldmlvdXMuYXR0cmlidXRlcyA/IHt9IDogdW5kZWZpbmVkLCBldmVudHM6IHByZXZpb3VzLmV2ZW50cyB9O1xyXG4gICAgfVxyXG4gICAgbGV0IG5ld1Byb3BlcnRpZXMgPSB7XHJcbiAgICAgICAgcHJvcGVydGllczoge31cclxuICAgIH07XHJcbiAgICBpZiAoYXR0cmlidXRlcykge1xyXG4gICAgICAgIG5ld1Byb3BlcnRpZXMuYXR0cmlidXRlcyA9IHt9O1xyXG4gICAgICAgIG5ld1Byb3BlcnRpZXMuZXZlbnRzID0gcHJldmlvdXMuZXZlbnRzO1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHByb3BlcnRpZXMpLmZvckVhY2goKHByb3BOYW1lKSA9PiB7XHJcbiAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wTmFtZV0gPSBkb21Ob2RlW3Byb3BOYW1lXTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKChhdHRyTmFtZSkgPT4ge1xyXG4gICAgICAgICAgICBuZXdQcm9wZXJ0aWVzLmF0dHJpYnV0ZXNbYXR0ck5hbWVdID0gZG9tTm9kZS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBuZXdQcm9wZXJ0aWVzO1xyXG4gICAgfVxyXG4gICAgbmV3UHJvcGVydGllcy5wcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMocHJvcGVydGllcykucmVkdWNlKChwcm9wcywgcHJvcGVydHkpID0+IHtcclxuICAgICAgICBwcm9wc1twcm9wZXJ0eV0gPSBkb21Ob2RlLmdldEF0dHJpYnV0ZShwcm9wZXJ0eSkgfHwgZG9tTm9kZVtwcm9wZXJ0eV07XHJcbiAgICAgICAgcmV0dXJuIHByb3BzO1xyXG4gICAgfSwge30pO1xyXG4gICAgcmV0dXJuIG5ld1Byb3BlcnRpZXM7XHJcbn1cclxuZnVuY3Rpb24gbm9kZU9wZXJhdGlvbihwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcmV2aW91c1ZhbHVlLCBkb21Ob2RlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgbGV0IHJlc3VsdDtcclxuICAgIGlmICh0eXBlb2YgcHJvcFZhbHVlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gcHJvcFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICByZXN1bHQgPSBwcm9wVmFsdWUgJiYgIXByZXZpb3VzVmFsdWU7XHJcbiAgICB9XHJcbiAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XHJcbiAgICAgICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xyXG4gICAgICAgIHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xyXG4gICAgICAgICAgICBkb21Ob2RlW3Byb3BOYW1lXSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHJlbW92ZU9ycGhhbmVkRXZlbnRzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcywgcHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMsIG9ubHlFdmVudHMgPSBmYWxzZSkge1xyXG4gICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xyXG4gICAgY29uc3QgZXZlbnRNYXAgPSBwcm9qZWN0b3JTdGF0ZS5ub2RlTWFwLmdldChkb21Ob2RlKTtcclxuICAgIGlmIChldmVudE1hcCkge1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHByZXZpb3VzUHJvcGVydGllcykuZm9yRWFjaCgocHJvcE5hbWUpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaXNFdmVudCA9IHByb3BOYW1lLnN1YnN0cigwLCAyKSA9PT0gJ29uJyB8fCBvbmx5RXZlbnRzO1xyXG4gICAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBvbmx5RXZlbnRzID8gcHJvcE5hbWUgOiBwcm9wTmFtZS5zdWJzdHIoMik7XHJcbiAgICAgICAgICAgIGlmIChpc0V2ZW50ICYmICFwcm9wZXJ0aWVzW3Byb3BOYW1lXSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRDYWxsYmFjayA9IGV2ZW50TWFwLmdldChwcmV2aW91c1Byb3BlcnRpZXNbcHJvcE5hbWVdKTtcclxuICAgICAgICAgICAgICAgIGlmIChldmVudENhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9tTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRDYWxsYmFjayk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiB1cGRhdGVBdHRyaWJ1dGUoZG9tTm9kZSwgYXR0ck5hbWUsIGF0dHJWYWx1ZSwgcHJvamVjdGlvbk9wdGlvbnMpIHtcclxuICAgIGlmIChwcm9qZWN0aW9uT3B0aW9ucy5uYW1lc3BhY2UgPT09IE5BTUVTUEFDRV9TVkcgJiYgYXR0ck5hbWUgPT09ICdocmVmJykge1xyXG4gICAgICAgIGRvbU5vZGUuc2V0QXR0cmlidXRlTlMoTkFNRVNQQUNFX1hMSU5LLCBhdHRyTmFtZSwgYXR0clZhbHVlKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKChhdHRyTmFtZSA9PT0gJ3JvbGUnICYmIGF0dHJWYWx1ZSA9PT0gJycpIHx8IGF0dHJWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgZG9tTm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0ck5hbWUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgZG9tTm9kZS5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIGF0dHJWYWx1ZSk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gdXBkYXRlQXR0cmlidXRlcyhkb21Ob2RlLCBwcmV2aW91c0F0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMsIHByb2plY3Rpb25PcHRpb25zKSB7XHJcbiAgICBjb25zdCBhdHRyTmFtZXMgPSBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKTtcclxuICAgIGNvbnN0IGF0dHJDb3VudCA9IGF0dHJOYW1lcy5sZW5ndGg7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgYXR0ck5hbWUgPSBhdHRyTmFtZXNbaV07XHJcbiAgICAgICAgY29uc3QgYXR0clZhbHVlID0gYXR0cmlidXRlc1thdHRyTmFtZV07XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNBdHRyVmFsdWUgPSBwcmV2aW91c0F0dHJpYnV0ZXNbYXR0ck5hbWVdO1xyXG4gICAgICAgIGlmIChhdHRyVmFsdWUgIT09IHByZXZpb3VzQXR0clZhbHVlKSB7XHJcbiAgICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZShkb21Ob2RlLCBhdHRyTmFtZSwgYXR0clZhbHVlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHVwZGF0ZVByb3BlcnRpZXMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucywgaW5jbHVkZXNFdmVudHNBbmRBdHRyaWJ1dGVzID0gdHJ1ZSkge1xyXG4gICAgbGV0IHByb3BlcnRpZXNVcGRhdGVkID0gZmFsc2U7XHJcbiAgICBjb25zdCBwcm9wTmFtZXMgPSBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKTtcclxuICAgIGNvbnN0IHByb3BDb3VudCA9IHByb3BOYW1lcy5sZW5ndGg7XHJcbiAgICBpZiAocHJvcE5hbWVzLmluZGV4T2YoJ2NsYXNzZXMnKSA9PT0gLTEgJiYgcHJldmlvdXNQcm9wZXJ0aWVzLmNsYXNzZXMpIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcmV2aW91c1Byb3BlcnRpZXMuY2xhc3NlcykpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2aW91c1Byb3BlcnRpZXMuY2xhc3Nlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3Nlcyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMuY2xhc3Nlc1tpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJlbW92ZUNsYXNzZXMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLmNsYXNzZXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGluY2x1ZGVzRXZlbnRzQW5kQXR0cmlidXRlcyAmJiByZW1vdmVPcnBoYW5lZEV2ZW50cyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMsIHByb3BlcnRpZXMsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcENvdW50OyBpKyspIHtcclxuICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHByb3BOYW1lc1tpXTtcclxuICAgICAgICBsZXQgcHJvcFZhbHVlID0gcHJvcGVydGllc1twcm9wTmFtZV07XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHByZXZpb3VzUHJvcGVydGllc1twcm9wTmFtZV07XHJcbiAgICAgICAgaWYgKHByb3BOYW1lID09PSAnY2xhc3NlcycpIHtcclxuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNDbGFzc2VzID0gQXJyYXkuaXNBcnJheShwcmV2aW91c1ZhbHVlKSA/IHByZXZpb3VzVmFsdWUgOiBbcHJldmlvdXNWYWx1ZV07XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDbGFzc2VzID0gQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpID8gcHJvcFZhbHVlIDogW3Byb3BWYWx1ZV07XHJcbiAgICAgICAgICAgIGlmIChwcmV2aW91c0NsYXNzZXMgJiYgcHJldmlvdXNDbGFzc2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGlmICghcHJvcFZhbHVlIHx8IHByb3BWYWx1ZS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZpb3VzQ2xhc3Nlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDbGFzc2VzKGRvbU5vZGUsIHByZXZpb3VzQ2xhc3Nlc1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Q2xhc3NlcyA9IFsuLi5jdXJyZW50Q2xhc3Nlc107XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2aW91c0NsYXNzZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNDbGFzc05hbWUgPSBwcmV2aW91c0NsYXNzZXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c0NsYXNzTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xhc3NJbmRleCA9IG5ld0NsYXNzZXMuaW5kZXhPZihwcmV2aW91c0NsYXNzTmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NJbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDbGFzc2VzKGRvbU5vZGUsIHByZXZpb3VzQ2xhc3NOYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NsYXNzZXMuc3BsaWNlKGNsYXNzSW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3Q2xhc3Nlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRDbGFzc2VzKGRvbU5vZGUsIG5ld0NsYXNzZXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3VycmVudENsYXNzZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBhZGRDbGFzc2VzKGRvbU5vZGUsIGN1cnJlbnRDbGFzc2VzW2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChub2RlT3BlcmF0aW9ucy5pbmRleE9mKHByb3BOYW1lKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgbm9kZU9wZXJhdGlvbihwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcmV2aW91c1ZhbHVlLCBkb21Ob2RlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHByb3BOYW1lID09PSAnc3R5bGVzJykge1xyXG4gICAgICAgICAgICBjb25zdCBzdHlsZU5hbWVzID0gT2JqZWN0LmtleXMocHJvcFZhbHVlKTtcclxuICAgICAgICAgICAgY29uc3Qgc3R5bGVDb3VudCA9IHN0eWxlTmFtZXMubGVuZ3RoO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHN0eWxlQ291bnQ7IGorKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVOYW1lID0gc3R5bGVOYW1lc1tqXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1N0eWxlVmFsdWUgPSBwcm9wVmFsdWVbc3R5bGVOYW1lXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZFN0eWxlVmFsdWUgPSBwcmV2aW91c1ZhbHVlICYmIHByZXZpb3VzVmFsdWVbc3R5bGVOYW1lXTtcclxuICAgICAgICAgICAgICAgIGlmIChuZXdTdHlsZVZhbHVlID09PSBvbGRTdHlsZVZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAobmV3U3R5bGVWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrU3R5bGVWYWx1ZShuZXdTdHlsZVZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uT3B0aW9ucy5zdHlsZUFwcGx5ZXIoZG9tTm9kZSwgc3R5bGVOYW1lLCBuZXdTdHlsZVZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb25PcHRpb25zLnN0eWxlQXBwbHllcihkb21Ob2RlLCBzdHlsZU5hbWUsICcnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCFwcm9wVmFsdWUgJiYgdHlwZW9mIHByZXZpb3VzVmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9wVmFsdWUgPSAnJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICd2YWx1ZScpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRvbVZhbHVlID0gZG9tTm9kZVtwcm9wTmFtZV07XHJcbiAgICAgICAgICAgICAgICBpZiAoZG9tVmFsdWUgIT09IHByb3BWYWx1ZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIChkb21Ob2RlWydvbmlucHV0LXZhbHVlJ11cclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBkb21WYWx1ZSA9PT0gZG9tTm9kZVsnb25pbnB1dC12YWx1ZSddXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogcHJvcFZhbHVlICE9PSBwcmV2aW91c1ZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRvbU5vZGVbcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGRvbU5vZGVbJ29uaW5wdXQtdmFsdWUnXSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChwcm9wVmFsdWUgIT09IHByZXZpb3VzVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAocHJvcE5hbWUgIT09ICdrZXknICYmIHByb3BWYWx1ZSAhPT0gcHJldmlvdXNWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IHR5cGVvZiBwcm9wVmFsdWU7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiBwcm9wTmFtZS5sYXN0SW5kZXhPZignb24nLCAwKSA9PT0gMCAmJiBpbmNsdWRlc0V2ZW50c0FuZEF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVFdmVudChkb21Ob2RlLCBwcm9wTmFtZS5zdWJzdHIoMiksIHByb3BWYWx1ZSwgcHJvamVjdGlvbk9wdGlvbnMsIHByb3BlcnRpZXMuYmluZCwgcHJldmlvdXNWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiBwcm9wTmFtZSAhPT0gJ2lubmVySFRNTCcgJiYgaW5jbHVkZXNFdmVudHNBbmRBdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQXR0cmlidXRlKGRvbU5vZGUsIHByb3BOYW1lLCBwcm9wVmFsdWUsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByb3BOYW1lID09PSAnc2Nyb2xsTGVmdCcgfHwgcHJvcE5hbWUgPT09ICdzY3JvbGxUb3AnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbU5vZGVbcHJvcE5hbWVdICE9PSBwcm9wVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9tTm9kZVtwcm9wTmFtZV0gPSBwcm9wVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9tTm9kZVtwcm9wTmFtZV0gPSBwcm9wVmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJvcGVydGllc1VwZGF0ZWQ7XHJcbn1cclxuZnVuY3Rpb24gZmluZEluZGV4T2ZDaGlsZChjaGlsZHJlbiwgc2FtZUFzLCBzdGFydCkge1xyXG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAoc2FtZShjaGlsZHJlbltpXSwgc2FtZUFzKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gLTE7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIHRvUGFyZW50Vk5vZGUoZG9tTm9kZSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB0YWc6ICcnLFxyXG4gICAgICAgIHByb3BlcnRpZXM6IHt9LFxyXG4gICAgICAgIGNoaWxkcmVuOiB1bmRlZmluZWQsXHJcbiAgICAgICAgZG9tTm9kZSxcclxuICAgICAgICB0eXBlOiBWTk9ERVxyXG4gICAgfTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gdG9UZXh0Vk5vZGUoZGF0YSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB0YWc6ICcnLFxyXG4gICAgICAgIHByb3BlcnRpZXM6IHt9LFxyXG4gICAgICAgIGNoaWxkcmVuOiB1bmRlZmluZWQsXHJcbiAgICAgICAgdGV4dDogYCR7ZGF0YX1gLFxyXG4gICAgICAgIGRvbU5vZGU6IHVuZGVmaW5lZCxcclxuICAgICAgICB0eXBlOiBWTk9ERVxyXG4gICAgfTtcclxufVxyXG5mdW5jdGlvbiB0b0ludGVybmFsV05vZGUoaW5zdGFuY2UsIGluc3RhbmNlRGF0YSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBpbnN0YW5jZSxcclxuICAgICAgICByZW5kZXJlZDogW10sXHJcbiAgICAgICAgY29yZVByb3BlcnRpZXM6IGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcyxcclxuICAgICAgICBjaGlsZHJlbjogaW5zdGFuY2UuY2hpbGRyZW4sXHJcbiAgICAgICAgd2lkZ2V0Q29uc3RydWN0b3I6IGluc3RhbmNlLmNvbnN0cnVjdG9yLFxyXG4gICAgICAgIHByb3BlcnRpZXM6IGluc3RhbmNlRGF0YS5pbnB1dFByb3BlcnRpZXMsXHJcbiAgICAgICAgdHlwZTogV05PREVcclxuICAgIH07XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlckFuZERlY29yYXRlQ2hpbGRyZW4oY2hpbGRyZW4sIGluc3RhbmNlKSB7XHJcbiAgICBpZiAoY2hpbGRyZW4gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiBlbXB0eUFycmF5O1xyXG4gICAgfVxyXG4gICAgY2hpbGRyZW4gPSBBcnJheS5pc0FycmF5KGNoaWxkcmVuKSA/IGNoaWxkcmVuIDogW2NoaWxkcmVuXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOykge1xyXG4gICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XHJcbiAgICAgICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQgfHwgY2hpbGQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgY2hpbGRyZW4uc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBjaGlsZHJlbltpXSA9IHRvVGV4dFZOb2RlKGNoaWxkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChpc1ZOb2RlKGNoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLnByb3BlcnRpZXMuYmluZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQucHJvcGVydGllcy5iaW5kID0gaW5zdGFuY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuICYmIGNoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihjaGlsZC5jaGlsZHJlbiwgaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICghY2hpbGQuY29yZVByb3BlcnRpZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLmNvcmVQcm9wZXJ0aWVzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiaW5kOiBpbnN0YW5jZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVJlZ2lzdHJ5OiBpbnN0YW5jZURhdGEuY29yZVByb3BlcnRpZXMuYmFzZVJlZ2lzdHJ5XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5jaGlsZHJlbiAmJiBjaGlsZC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihjaGlsZC5jaGlsZHJlbiwgaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGkrKztcclxuICAgIH1cclxuICAgIHJldHVybiBjaGlsZHJlbjtcclxufVxyXG5mdW5jdGlvbiBub2RlQWRkZWQoZG5vZGUsIHRyYW5zaXRpb25zKSB7XHJcbiAgICBpZiAoaXNWTm9kZShkbm9kZSkgJiYgZG5vZGUucHJvcGVydGllcykge1xyXG4gICAgICAgIGNvbnN0IGVudGVyQW5pbWF0aW9uID0gZG5vZGUucHJvcGVydGllcy5lbnRlckFuaW1hdGlvbjtcclxuICAgICAgICBpZiAoZW50ZXJBbmltYXRpb24pIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbnRlckFuaW1hdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgZW50ZXJBbmltYXRpb24oZG5vZGUuZG9tTm9kZSwgZG5vZGUucHJvcGVydGllcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9ucy5lbnRlcihkbm9kZS5kb21Ob2RlLCBkbm9kZS5wcm9wZXJ0aWVzLCBlbnRlckFuaW1hdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gbm9kZVRvUmVtb3ZlKGRub2RlLCB0cmFuc2l0aW9ucywgcHJvamVjdGlvbk9wdGlvbnMpIHtcclxuICAgIGlmIChpc1dOb2RlKGRub2RlKSkge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSBpbnN0YW5jZU1hcC5nZXQoZG5vZGUuaW5zdGFuY2UpO1xyXG4gICAgICAgIGNvbnN0IHJlbmRlcmVkID0gKGl0ZW0gPyBpdGVtLmRub2RlLnJlbmRlcmVkIDogZG5vZGUucmVuZGVyZWQpIHx8IGVtcHR5QXJyYXk7XHJcbiAgICAgICAgaWYgKGRub2RlLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldChkbm9kZS5pbnN0YW5jZSk7XHJcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5vbkRldGFjaCgpO1xyXG4gICAgICAgICAgICBpbnN0YW5jZU1hcC5kZWxldGUoZG5vZGUuaW5zdGFuY2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbmRlcmVkLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIG5vZGVUb1JlbW92ZShyZW5kZXJlZFtpXSwgdHJhbnNpdGlvbnMsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBjb25zdCBkb21Ob2RlID0gZG5vZGUuZG9tTm9kZTtcclxuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gZG5vZGUucHJvcGVydGllcztcclxuICAgICAgICBpZiAoZG5vZGUuY2hpbGRyZW4gJiYgZG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBub2RlVG9SZW1vdmUoZG5vZGUuY2hpbGRyZW5baV0sIHRyYW5zaXRpb25zLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZXhpdEFuaW1hdGlvbiA9IHByb3BlcnRpZXMuZXhpdEFuaW1hdGlvbjtcclxuICAgICAgICBpZiAocHJvcGVydGllcyAmJiBleGl0QW5pbWF0aW9uKSB7XHJcbiAgICAgICAgICAgIGRvbU5vZGUuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcclxuICAgICAgICAgICAgY29uc3QgcmVtb3ZlRG9tTm9kZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGRvbU5vZGUgJiYgZG9tTm9kZS5wYXJlbnROb2RlICYmIGRvbU5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkb21Ob2RlKTtcclxuICAgICAgICAgICAgICAgIGRub2RlLmRvbU5vZGUgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXhpdEFuaW1hdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgZXhpdEFuaW1hdGlvbihkb21Ob2RlLCByZW1vdmVEb21Ob2RlLCBwcm9wZXJ0aWVzKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25zLmV4aXQoZG5vZGUuZG9tTm9kZSwgcHJvcGVydGllcywgZXhpdEFuaW1hdGlvbiwgcmVtb3ZlRG9tTm9kZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZG9tTm9kZSAmJiBkb21Ob2RlLnBhcmVudE5vZGUgJiYgZG9tTm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRvbU5vZGUpO1xyXG4gICAgICAgIGRub2RlLmRvbU5vZGUgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gY2hlY2tEaXN0aW5ndWlzaGFibGUoY2hpbGROb2RlcywgaW5kZXhUb0NoZWNrLCBwYXJlbnRJbnN0YW5jZSkge1xyXG4gICAgY29uc3QgY2hpbGROb2RlID0gY2hpbGROb2Rlc1tpbmRleFRvQ2hlY2tdO1xyXG4gICAgaWYgKGlzVk5vZGUoY2hpbGROb2RlKSAmJiAhY2hpbGROb2RlLnRhZykge1xyXG4gICAgICAgIHJldHVybjsgLy8gVGV4dCBub2RlcyBuZWVkIG5vdCBiZSBkaXN0aW5ndWlzaGFibGVcclxuICAgIH1cclxuICAgIGNvbnN0IHsga2V5IH0gPSBjaGlsZE5vZGUucHJvcGVydGllcztcclxuICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09IG51bGwpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGkgIT09IGluZGV4VG9DaGVjaykge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGNoaWxkTm9kZXNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoc2FtZShub2RlLCBjaGlsZE5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVJZGVudGlmaWVyO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudE5hbWUgPSBwYXJlbnRJbnN0YW5jZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICd1bmtub3duJztcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNXTm9kZShjaGlsZE5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVJZGVudGlmaWVyID0gY2hpbGROb2RlLndpZGdldENvbnN0cnVjdG9yLm5hbWUgfHwgJ3Vua25vd24nO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUlkZW50aWZpZXIgPSBjaGlsZE5vZGUudGFnO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEEgd2lkZ2V0ICgke3BhcmVudE5hbWV9KSBoYXMgaGFkIGEgY2hpbGQgYWRkZGVkIG9yIHJlbW92ZWQsIGJ1dCB0aGV5IHdlcmUgbm90IGFibGUgdG8gdW5pcXVlbHkgaWRlbnRpZmllZC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gcHJvdmlkZSBhIHVuaXF1ZSAna2V5JyBwcm9wZXJ0eSB3aGVuIHVzaW5nIHRoZSBzYW1lIHdpZGdldCBvciBlbGVtZW50ICgke25vZGVJZGVudGlmaWVyfSkgbXVsdGlwbGUgdGltZXMgYXMgc2libGluZ3NgKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiB1cGRhdGVDaGlsZHJlbihwYXJlbnRWTm9kZSwgc2libGluZ3MsIG9sZENoaWxkcmVuLCBuZXdDaGlsZHJlbiwgcGFyZW50SW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKSB7XHJcbiAgICBvbGRDaGlsZHJlbiA9IG9sZENoaWxkcmVuIHx8IGVtcHR5QXJyYXk7XHJcbiAgICBuZXdDaGlsZHJlbiA9IG5ld0NoaWxkcmVuO1xyXG4gICAgY29uc3Qgb2xkQ2hpbGRyZW5MZW5ndGggPSBvbGRDaGlsZHJlbi5sZW5ndGg7XHJcbiAgICBjb25zdCBuZXdDaGlsZHJlbkxlbmd0aCA9IG5ld0NoaWxkcmVuLmxlbmd0aDtcclxuICAgIGNvbnN0IHRyYW5zaXRpb25zID0gcHJvamVjdGlvbk9wdGlvbnMudHJhbnNpdGlvbnM7XHJcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XHJcbiAgICBwcm9qZWN0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHByb2plY3Rpb25PcHRpb25zLCB7IGRlcHRoOiBwcm9qZWN0aW9uT3B0aW9ucy5kZXB0aCArIDEgfSk7XHJcbiAgICBsZXQgb2xkSW5kZXggPSAwO1xyXG4gICAgbGV0IG5ld0luZGV4ID0gMDtcclxuICAgIGxldCBpO1xyXG4gICAgbGV0IHRleHRVcGRhdGVkID0gZmFsc2U7XHJcbiAgICB3aGlsZSAobmV3SW5kZXggPCBuZXdDaGlsZHJlbkxlbmd0aCkge1xyXG4gICAgICAgIGxldCBvbGRDaGlsZCA9IG9sZEluZGV4IDwgb2xkQ2hpbGRyZW5MZW5ndGggPyBvbGRDaGlsZHJlbltvbGRJbmRleF0gOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgY29uc3QgbmV3Q2hpbGQgPSBuZXdDaGlsZHJlbltuZXdJbmRleF07XHJcbiAgICAgICAgaWYgKGlzVk5vZGUobmV3Q2hpbGQpICYmIHR5cGVvZiBuZXdDaGlsZC5kZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICBuZXdDaGlsZC5pbnNlcnRlZCA9IGlzVk5vZGUob2xkQ2hpbGQpICYmIG9sZENoaWxkLmluc2VydGVkO1xyXG4gICAgICAgICAgICBhZGREZWZlcnJlZFByb3BlcnRpZXMobmV3Q2hpbGQsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9sZENoaWxkICE9PSB1bmRlZmluZWQgJiYgc2FtZShvbGRDaGlsZCwgbmV3Q2hpbGQpKSB7XHJcbiAgICAgICAgICAgIG9sZEluZGV4Kys7XHJcbiAgICAgICAgICAgIG5ld0luZGV4Kys7XHJcbiAgICAgICAgICAgIHRleHRVcGRhdGVkID1cclxuICAgICAgICAgICAgICAgIHVwZGF0ZURvbShvbGRDaGlsZCwgbmV3Q2hpbGQsIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRWTm9kZSwgcGFyZW50SW5zdGFuY2UsIG9sZENoaWxkcmVuLnNsaWNlKG9sZEluZGV4KSwgbmV3Q2hpbGRyZW4uc2xpY2UobmV3SW5kZXgpKSB8fCB0ZXh0VXBkYXRlZDtcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZpbmRPbGRJbmRleCA9IGZpbmRJbmRleE9mQ2hpbGQob2xkQ2hpbGRyZW4sIG5ld0NoaWxkLCBvbGRJbmRleCArIDEpO1xyXG4gICAgICAgIGNvbnN0IGFkZENoaWxkID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgaW5zZXJ0QmVmb3JlRG9tTm9kZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgbGV0IGNoaWxkcmVuQXJyYXkgPSBvbGRDaGlsZHJlbjtcclxuICAgICAgICAgICAgbGV0IG5leHRJbmRleCA9IG9sZEluZGV4ICsgMTtcclxuICAgICAgICAgICAgbGV0IGNoaWxkID0gb2xkQ2hpbGRyZW5bb2xkSW5kZXhdO1xyXG4gICAgICAgICAgICBpZiAoIWNoaWxkKSB7XHJcbiAgICAgICAgICAgICAgICBjaGlsZCA9IHNpYmxpbmdzWzBdO1xyXG4gICAgICAgICAgICAgICAgbmV4dEluZGV4ID0gMTtcclxuICAgICAgICAgICAgICAgIGNoaWxkcmVuQXJyYXkgPSBzaWJsaW5ncztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY2hpbGQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBpbnNlcnRCZWZvcmVDaGlsZHJlbiA9IFtjaGlsZF07XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoaW5zZXJ0QmVmb3JlQ2hpbGRyZW4ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zZXJ0QmVmb3JlID0gaW5zZXJ0QmVmb3JlQ2hpbGRyZW4uc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNXTm9kZShpbnNlcnRCZWZvcmUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBpbnN0YW5jZU1hcC5nZXQoaW5zZXJ0QmVmb3JlLmluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5kbm9kZS5yZW5kZXJlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ2hpbGRyZW4ucHVzaCguLi5pdGVtLmRub2RlLnJlbmRlcmVkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydEJlZm9yZS5kb21Ob2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlLmRvbU5vZGUucGFyZW50RWxlbWVudCAhPT0gcGFyZW50Vk5vZGUuZG9tTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlRG9tTm9kZSA9IGluc2VydEJlZm9yZS5kb21Ob2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydEJlZm9yZUNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiBjaGlsZHJlbkFycmF5W25leHRJbmRleF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ2hpbGRyZW4ucHVzaChjaGlsZHJlbkFycmF5W25leHRJbmRleF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0SW5kZXgrKztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3JlYXRlRG9tKG5ld0NoaWxkLCBwYXJlbnRWTm9kZSwgbmV3Q2hpbGRyZW4uc2xpY2UobmV3SW5kZXggKyAxKSwgaW5zZXJ0QmVmb3JlRG9tTm9kZSwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudEluc3RhbmNlKTtcclxuICAgICAgICAgICAgbm9kZUFkZGVkKG5ld0NoaWxkLCB0cmFuc2l0aW9ucyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4VG9DaGVjayA9IG5ld0luZGV4O1xyXG4gICAgICAgICAgICBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNoZWNrRGlzdGluZ3Vpc2hhYmxlKG5ld0NoaWxkcmVuLCBpbmRleFRvQ2hlY2ssIHBhcmVudEluc3RhbmNlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAoIW9sZENoaWxkIHx8IGZpbmRPbGRJbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgYWRkQ2hpbGQoKTtcclxuICAgICAgICAgICAgbmV3SW5kZXgrKztcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJlbW92ZUNoaWxkID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleFRvQ2hlY2sgPSBvbGRJbmRleDtcclxuICAgICAgICAgICAgcHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MucHVzaCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjaGVja0Rpc3Rpbmd1aXNoYWJsZShvbGRDaGlsZHJlbiwgaW5kZXhUb0NoZWNrLCBwYXJlbnRJbnN0YW5jZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoaXNXTm9kZShvbGRDaGlsZCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBpbnN0YW5jZU1hcC5nZXQob2xkQ2hpbGQuaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBvbGRDaGlsZCA9IGl0ZW0uZG5vZGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbm9kZVRvUmVtb3ZlKG9sZENoaWxkLCB0cmFuc2l0aW9ucywgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgZmluZE5ld0luZGV4ID0gZmluZEluZGV4T2ZDaGlsZChuZXdDaGlsZHJlbiwgb2xkQ2hpbGQsIG5ld0luZGV4ICsgMSk7XHJcbiAgICAgICAgaWYgKGZpbmROZXdJbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgcmVtb3ZlQ2hpbGQoKTtcclxuICAgICAgICAgICAgb2xkSW5kZXgrKztcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGFkZENoaWxkKCk7XHJcbiAgICAgICAgcmVtb3ZlQ2hpbGQoKTtcclxuICAgICAgICBvbGRJbmRleCsrO1xyXG4gICAgICAgIG5ld0luZGV4Kys7XHJcbiAgICB9XHJcbiAgICBpZiAob2xkQ2hpbGRyZW5MZW5ndGggPiBvbGRJbmRleCkge1xyXG4gICAgICAgIC8vIFJlbW92ZSBjaGlsZCBmcmFnbWVudHNcclxuICAgICAgICBmb3IgKGkgPSBvbGRJbmRleDsgaSA8IG9sZENoaWxkcmVuTGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXhUb0NoZWNrID0gaTtcclxuICAgICAgICAgICAgcHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MucHVzaCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjaGVja0Rpc3Rpbmd1aXNoYWJsZShvbGRDaGlsZHJlbiwgaW5kZXhUb0NoZWNrLCBwYXJlbnRJbnN0YW5jZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBsZXQgY2hpbGRUb1JlbW92ZSA9IG9sZENoaWxkcmVuW2ldO1xyXG4gICAgICAgICAgICBpZiAoaXNXTm9kZShjaGlsZFRvUmVtb3ZlKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGluc3RhbmNlTWFwLmdldChjaGlsZFRvUmVtb3ZlLmluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRUb1JlbW92ZSA9IGl0ZW0uZG5vZGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbm9kZVRvUmVtb3ZlKGNoaWxkVG9SZW1vdmUsIHRyYW5zaXRpb25zLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRleHRVcGRhdGVkO1xyXG59XHJcbmZ1bmN0aW9uIGFkZENoaWxkcmVuKHBhcmVudFZOb2RlLCBjaGlsZHJlbiwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudEluc3RhbmNlLCBpbnNlcnRCZWZvcmUgPSB1bmRlZmluZWQsIGNoaWxkTm9kZXMpIHtcclxuICAgIGlmIChjaGlsZHJlbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xyXG4gICAgaWYgKHByb2plY3RvclN0YXRlLm1lcmdlICYmIGNoaWxkTm9kZXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNoaWxkTm9kZXMgPSBhcnJheUZyb20ocGFyZW50Vk5vZGUuZG9tTm9kZS5jaGlsZE5vZGVzKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHRyYW5zaXRpb25zID0gcHJvamVjdGlvbk9wdGlvbnMudHJhbnNpdGlvbnM7XHJcbiAgICBwcm9qZWN0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHByb2plY3Rpb25PcHRpb25zLCB7IGRlcHRoOiBwcm9qZWN0aW9uT3B0aW9ucy5kZXB0aCArIDEgfSk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcclxuICAgICAgICBjb25zdCBuZXh0U2libGluZ3MgPSBjaGlsZHJlbi5zbGljZShpICsgMSk7XHJcbiAgICAgICAgaWYgKGlzVk5vZGUoY2hpbGQpKSB7XHJcbiAgICAgICAgICAgIGlmIChwcm9qZWN0b3JTdGF0ZS5tZXJnZSAmJiBjaGlsZE5vZGVzKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZG9tRWxlbWVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChjaGlsZC5kb21Ob2RlID09PSB1bmRlZmluZWQgJiYgY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCA9IGNoaWxkTm9kZXMuc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZG9tRWxlbWVudCAmJiBkb21FbGVtZW50LnRhZ05hbWUgPT09IChjaGlsZC50YWcudG9VcHBlckNhc2UoKSB8fCB1bmRlZmluZWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmRvbU5vZGUgPSBkb21FbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjcmVhdGVEb20oY2hpbGQsIHBhcmVudFZOb2RlLCBuZXh0U2libGluZ3MsIGluc2VydEJlZm9yZSwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudEluc3RhbmNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNyZWF0ZURvbShjaGlsZCwgcGFyZW50Vk5vZGUsIG5leHRTaWJsaW5ncywgaW5zZXJ0QmVmb3JlLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UsIGNoaWxkTm9kZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBub2RlQWRkZWQoY2hpbGQsIHRyYW5zaXRpb25zKTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBpbml0UHJvcGVydGllc0FuZENoaWxkcmVuKGRvbU5vZGUsIGRub2RlLCBwYXJlbnRJbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpIHtcclxuICAgIGFkZENoaWxkcmVuKGRub2RlLCBkbm9kZS5jaGlsZHJlbiwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudEluc3RhbmNlLCB1bmRlZmluZWQpO1xyXG4gICAgaWYgKHR5cGVvZiBkbm9kZS5kZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyAmJiBkbm9kZS5pbnNlcnRlZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgYWRkRGVmZXJyZWRQcm9wZXJ0aWVzKGRub2RlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgICBpZiAoZG5vZGUuYXR0cmlidXRlcyAmJiBkbm9kZS5ldmVudHMpIHtcclxuICAgICAgICB1cGRhdGVBdHRyaWJ1dGVzKGRvbU5vZGUsIHt9LCBkbm9kZS5hdHRyaWJ1dGVzLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgdXBkYXRlUHJvcGVydGllcyhkb21Ob2RlLCB7fSwgZG5vZGUucHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMsIGZhbHNlKTtcclxuICAgICAgICByZW1vdmVPcnBoYW5lZEV2ZW50cyhkb21Ob2RlLCB7fSwgZG5vZGUuZXZlbnRzLCBwcm9qZWN0aW9uT3B0aW9ucywgdHJ1ZSk7XHJcbiAgICAgICAgY29uc3QgZXZlbnRzID0gZG5vZGUuZXZlbnRzO1xyXG4gICAgICAgIE9iamVjdC5rZXlzKGV2ZW50cykuZm9yRWFjaCgoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgdXBkYXRlRXZlbnQoZG9tTm9kZSwgZXZlbnQsIGV2ZW50c1tldmVudF0sIHByb2plY3Rpb25PcHRpb25zLCBkbm9kZS5wcm9wZXJ0aWVzLmJpbmQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdXBkYXRlUHJvcGVydGllcyhkb21Ob2RlLCB7fSwgZG5vZGUucHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgfVxyXG4gICAgaWYgKGRub2RlLnByb3BlcnRpZXMua2V5ICE9PSBudWxsICYmIGRub2RlLnByb3BlcnRpZXMua2V5ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQocGFyZW50SW5zdGFuY2UpO1xyXG4gICAgICAgIGluc3RhbmNlRGF0YS5ub2RlSGFuZGxlci5hZGQoZG9tTm9kZSwgYCR7ZG5vZGUucHJvcGVydGllcy5rZXl9YCk7XHJcbiAgICB9XHJcbiAgICBkbm9kZS5pbnNlcnRlZCA9IHRydWU7XHJcbn1cclxuZnVuY3Rpb24gY3JlYXRlRG9tKGRub2RlLCBwYXJlbnRWTm9kZSwgbmV4dFNpYmxpbmdzLCBpbnNlcnRCZWZvcmUsIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRJbnN0YW5jZSwgY2hpbGROb2Rlcykge1xyXG4gICAgbGV0IGRvbU5vZGU7XHJcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XHJcbiAgICBpZiAoaXNXTm9kZShkbm9kZSkpIHtcclxuICAgICAgICBsZXQgeyB3aWRnZXRDb25zdHJ1Y3RvciB9ID0gZG5vZGU7XHJcbiAgICAgICAgY29uc3QgcGFyZW50SW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHBhcmVudEluc3RhbmNlKTtcclxuICAgICAgICBpZiAoIWlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yKHdpZGdldENvbnN0cnVjdG9yKSkge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gcGFyZW50SW5zdGFuY2VEYXRhLnJlZ2lzdHJ5KCkuZ2V0KHdpZGdldENvbnN0cnVjdG9yKTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0gPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB3aWRnZXRDb25zdHJ1Y3RvciA9IGl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IHdpZGdldENvbnN0cnVjdG9yKCk7XHJcbiAgICAgICAgZG5vZGUuaW5zdGFuY2UgPSBpbnN0YW5jZTtcclxuICAgICAgICBuZXh0U2libGluZ01hcC5zZXQoaW5zdGFuY2UsIG5leHRTaWJsaW5ncyk7XHJcbiAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKTtcclxuICAgICAgICBpbnN0YW5jZURhdGEuaW52YWxpZGF0ZSA9ICgpID0+IHtcclxuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLmRpcnR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9qZWN0b3JTdGF0ZS5yZW5kZXJRdWV1ZS5wdXNoKHsgaW5zdGFuY2UsIGRlcHRoOiBwcm9qZWN0aW9uT3B0aW9ucy5kZXB0aCB9KTtcclxuICAgICAgICAgICAgICAgIHNjaGVkdWxlUmVuZGVyKHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9IHRydWU7XHJcbiAgICAgICAgaW5zdGFuY2UuX19zZXRDb3JlUHJvcGVydGllc19fKGRub2RlLmNvcmVQcm9wZXJ0aWVzKTtcclxuICAgICAgICBpbnN0YW5jZS5fX3NldENoaWxkcmVuX18oZG5vZGUuY2hpbGRyZW4pO1xyXG4gICAgICAgIGluc3RhbmNlLl9fc2V0UHJvcGVydGllc19fKGRub2RlLnByb3BlcnRpZXMpO1xyXG4gICAgICAgIGNvbnN0IHJlbmRlcmVkID0gaW5zdGFuY2UuX19yZW5kZXJfXygpO1xyXG4gICAgICAgIGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPSBmYWxzZTtcclxuICAgICAgICBpZiAocmVuZGVyZWQpIHtcclxuICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRSZW5kZXJlZCA9IGZpbHRlckFuZERlY29yYXRlQ2hpbGRyZW4ocmVuZGVyZWQsIGluc3RhbmNlKTtcclxuICAgICAgICAgICAgZG5vZGUucmVuZGVyZWQgPSBmaWx0ZXJlZFJlbmRlcmVkO1xyXG4gICAgICAgICAgICBhZGRDaGlsZHJlbihwYXJlbnRWTm9kZSwgZmlsdGVyZWRSZW5kZXJlZCwgcHJvamVjdGlvbk9wdGlvbnMsIGluc3RhbmNlLCBpbnNlcnRCZWZvcmUsIGNoaWxkTm9kZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpbnN0YW5jZU1hcC5zZXQoaW5zdGFuY2UsIHsgZG5vZGUsIHBhcmVudFZOb2RlIH0pO1xyXG4gICAgICAgIGluc3RhbmNlRGF0YS5ub2RlSGFuZGxlci5hZGRSb290KCk7XHJcbiAgICAgICAgcHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MucHVzaCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5vbkF0dGFjaCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKHByb2plY3RvclN0YXRlLm1lcmdlICYmIHByb2plY3RvclN0YXRlLm1lcmdlRWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlID0gcHJvamVjdGlvbk9wdGlvbnMubWVyZ2VFbGVtZW50O1xyXG4gICAgICAgICAgICBwcm9qZWN0b3JTdGF0ZS5tZXJnZUVsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGluaXRQcm9wZXJ0aWVzQW5kQ2hpbGRyZW4oZG9tTm9kZSwgZG5vZGUsIHBhcmVudEluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZG9jID0gcGFyZW50Vk5vZGUuZG9tTm9kZS5vd25lckRvY3VtZW50O1xyXG4gICAgICAgIGlmICghZG5vZGUudGFnICYmIHR5cGVvZiBkbm9kZS50ZXh0ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBpZiAoZG5vZGUuZG9tTm9kZSAhPT0gdW5kZWZpbmVkICYmIHBhcmVudFZOb2RlLmRvbU5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0RvbU5vZGUgPSBkbm9kZS5kb21Ob2RlLm93bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZG5vZGUudGV4dCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50Vk5vZGUuZG9tTm9kZSA9PT0gZG5vZGUuZG9tTm9kZS5wYXJlbnROb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Vk5vZGUuZG9tTm9kZS5yZXBsYWNlQ2hpbGQobmV3RG9tTm9kZSwgZG5vZGUuZG9tTm9kZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRWTm9kZS5kb21Ob2RlLmFwcGVuZENoaWxkKG5ld0RvbU5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRub2RlLmRvbU5vZGUucGFyZW50Tm9kZSAmJiBkbm9kZS5kb21Ob2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZG5vZGUuZG9tTm9kZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkbm9kZS5kb21Ob2RlID0gbmV3RG9tTm9kZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlID0gZG9jLmNyZWF0ZVRleHROb2RlKGRub2RlLnRleHQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGluc2VydEJlZm9yZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Vk5vZGUuZG9tTm9kZS5pbnNlcnRCZWZvcmUoZG9tTm9kZSwgaW5zZXJ0QmVmb3JlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFZOb2RlLmRvbU5vZGUuYXBwZW5kQ2hpbGQoZG9tTm9kZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChkbm9kZS5kb21Ob2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChkbm9kZS50YWcgPT09ICdzdmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9qZWN0aW9uT3B0aW9ucywgeyBuYW1lc3BhY2U6IE5BTUVTUEFDRV9TVkcgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvamVjdGlvbk9wdGlvbnMubmFtZXNwYWNlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBkb21Ob2RlID0gZG5vZGUuZG9tTm9kZSA9IGRvYy5jcmVhdGVFbGVtZW50TlMocHJvamVjdGlvbk9wdGlvbnMubmFtZXNwYWNlLCBkbm9kZS50YWcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9tTm9kZSA9IGRub2RlLmRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlIHx8IGRvYy5jcmVhdGVFbGVtZW50KGRub2RlLnRhZyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkb21Ob2RlID0gZG5vZGUuZG9tTm9kZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpbml0UHJvcGVydGllc0FuZENoaWxkcmVuKGRvbU5vZGUsIGRub2RlLCBwYXJlbnRJbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudFZOb2RlLmRvbU5vZGUuaW5zZXJ0QmVmb3JlKGRvbU5vZGUsIGluc2VydEJlZm9yZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZG9tTm9kZS5wYXJlbnROb2RlICE9PSBwYXJlbnRWTm9kZS5kb21Ob2RlKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRWTm9kZS5kb21Ob2RlLmFwcGVuZENoaWxkKGRvbU5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHVwZGF0ZURvbShwcmV2aW91cywgZG5vZGUsIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRWTm9kZSwgcGFyZW50SW5zdGFuY2UsIG9sZE5leHRTaWJsaW5ncywgbmV4dFNpYmxpbmdzKSB7XHJcbiAgICBpZiAoaXNXTm9kZShkbm9kZSkpIHtcclxuICAgICAgICBjb25zdCB7IGluc3RhbmNlIH0gPSBwcmV2aW91cztcclxuICAgICAgICBjb25zdCB7IHBhcmVudFZOb2RlLCBkbm9kZTogbm9kZSB9ID0gaW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKTtcclxuICAgICAgICBjb25zdCBwcmV2aW91c1JlbmRlcmVkID0gbm9kZSA/IG5vZGUucmVuZGVyZWQgOiBwcmV2aW91cy5yZW5kZXJlZDtcclxuICAgICAgICBjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpO1xyXG4gICAgICAgIGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPSB0cnVlO1xyXG4gICAgICAgIGluc3RhbmNlLl9fc2V0Q29yZVByb3BlcnRpZXNfXyhkbm9kZS5jb3JlUHJvcGVydGllcyk7XHJcbiAgICAgICAgaW5zdGFuY2UuX19zZXRDaGlsZHJlbl9fKGRub2RlLmNoaWxkcmVuKTtcclxuICAgICAgICBpbnN0YW5jZS5fX3NldFByb3BlcnRpZXNfXyhkbm9kZS5wcm9wZXJ0aWVzKTtcclxuICAgICAgICBuZXh0U2libGluZ01hcC5zZXQoaW5zdGFuY2UsIG5leHRTaWJsaW5ncyk7XHJcbiAgICAgICAgZG5vZGUuaW5zdGFuY2UgPSBpbnN0YW5jZTtcclxuICAgICAgICBpZiAoaW5zdGFuY2VEYXRhLmRpcnR5ID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVkID0gaW5zdGFuY2UuX19yZW5kZXJfXygpO1xyXG4gICAgICAgICAgICBpbnN0YW5jZURhdGEucmVuZGVyaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGRub2RlLnJlbmRlcmVkID0gZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihyZW5kZXJlZCwgaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICB1cGRhdGVDaGlsZHJlbihwYXJlbnRWTm9kZSwgb2xkTmV4dFNpYmxpbmdzLCBwcmV2aW91c1JlbmRlcmVkLCBkbm9kZS5yZW5kZXJlZCwgaW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgZG5vZGUucmVuZGVyZWQgPSBwcmV2aW91c1JlbmRlcmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpbnN0YW5jZU1hcC5zZXQoaW5zdGFuY2UsIHsgZG5vZGUsIHBhcmVudFZOb2RlIH0pO1xyXG4gICAgICAgIGluc3RhbmNlRGF0YS5ub2RlSGFuZGxlci5hZGRSb290KCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBpZiAocHJldmlvdXMgPT09IGRub2RlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZG9tTm9kZSA9IChkbm9kZS5kb21Ob2RlID0gcHJldmlvdXMuZG9tTm9kZSk7XHJcbiAgICAgICAgbGV0IHRleHRVcGRhdGVkID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IHVwZGF0ZWQgPSBmYWxzZTtcclxuICAgICAgICBpZiAoIWRub2RlLnRhZyAmJiB0eXBlb2YgZG5vZGUudGV4dCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgaWYgKGRub2RlLnRleHQgIT09IHByZXZpb3VzLnRleHQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0RvbU5vZGUgPSBkb21Ob2RlLm93bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZG5vZGUudGV4dCk7XHJcbiAgICAgICAgICAgICAgICBkb21Ob2RlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5ld0RvbU5vZGUsIGRvbU5vZGUpO1xyXG4gICAgICAgICAgICAgICAgZG5vZGUuZG9tTm9kZSA9IG5ld0RvbU5vZGU7XHJcbiAgICAgICAgICAgICAgICB0ZXh0VXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dFVwZGF0ZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChkbm9kZS50YWcgJiYgZG5vZGUudGFnLmxhc3RJbmRleE9mKCdzdmcnLCAwKSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcHJvamVjdGlvbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9qZWN0aW9uT3B0aW9ucywgeyBuYW1lc3BhY2U6IE5BTUVTUEFDRV9TVkcgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHByZXZpb3VzLmNoaWxkcmVuICE9PSBkbm9kZS5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBmaWx0ZXJBbmREZWNvcmF0ZUNoaWxkcmVuKGRub2RlLmNoaWxkcmVuLCBwYXJlbnRJbnN0YW5jZSk7XHJcbiAgICAgICAgICAgICAgICBkbm9kZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xyXG4gICAgICAgICAgICAgICAgdXBkYXRlZCA9XHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ2hpbGRyZW4oZG5vZGUsIG9sZE5leHRTaWJsaW5ncywgcHJldmlvdXMuY2hpbGRyZW4sIGNoaWxkcmVuLCBwYXJlbnRJbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpIHx8IHVwZGF0ZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNQcm9wZXJ0aWVzID0gYnVpbGRQcmV2aW91c1Byb3BlcnRpZXMoZG9tTm9kZSwgcHJldmlvdXMsIGRub2RlKTtcclxuICAgICAgICAgICAgaWYgKGRub2RlLmF0dHJpYnV0ZXMgJiYgZG5vZGUuZXZlbnRzKSB7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVBdHRyaWJ1dGVzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcy5hdHRyaWJ1dGVzLCBkbm9kZS5hdHRyaWJ1dGVzLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVkID1cclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVQcm9wZXJ0aWVzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcy5wcm9wZXJ0aWVzLCBkbm9kZS5wcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucywgZmFsc2UpIHx8IHVwZGF0ZWQ7XHJcbiAgICAgICAgICAgICAgICByZW1vdmVPcnBoYW5lZEV2ZW50cyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMuZXZlbnRzLCBkbm9kZS5ldmVudHMsIHByb2plY3Rpb25PcHRpb25zLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IGRub2RlLmV2ZW50cztcclxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGV2ZW50cykuZm9yRWFjaCgoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVFdmVudChkb21Ob2RlLCBldmVudCwgZXZlbnRzW2V2ZW50XSwgcHJvamVjdGlvbk9wdGlvbnMsIGRub2RlLnByb3BlcnRpZXMuYmluZCwgcHJldmlvdXNQcm9wZXJ0aWVzLmV2ZW50c1tldmVudF0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVkID1cclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVQcm9wZXJ0aWVzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcy5wcm9wZXJ0aWVzLCBkbm9kZS5wcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucykgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZG5vZGUucHJvcGVydGllcy5rZXkgIT09IG51bGwgJiYgZG5vZGUucHJvcGVydGllcy5rZXkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHBhcmVudEluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgIGluc3RhbmNlRGF0YS5ub2RlSGFuZGxlci5hZGQoZG9tTm9kZSwgYCR7ZG5vZGUucHJvcGVydGllcy5rZXl9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHVwZGF0ZWQgJiYgZG5vZGUucHJvcGVydGllcyAmJiBkbm9kZS5wcm9wZXJ0aWVzLnVwZGF0ZUFuaW1hdGlvbikge1xyXG4gICAgICAgICAgICBkbm9kZS5wcm9wZXJ0aWVzLnVwZGF0ZUFuaW1hdGlvbihkb21Ob2RlLCBkbm9kZS5wcm9wZXJ0aWVzLCBwcmV2aW91cy5wcm9wZXJ0aWVzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gYWRkRGVmZXJyZWRQcm9wZXJ0aWVzKHZub2RlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgLy8gdHJhbnNmZXIgYW55IHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gcGFzc2VkIC0gYXMgdGhlc2UgbXVzdCBiZSBkZWNvcmF0ZWQgcHJvcGVydGllc1xyXG4gICAgdm5vZGUuZGVjb3JhdGVkRGVmZXJyZWRQcm9wZXJ0aWVzID0gdm5vZGUucHJvcGVydGllcztcclxuICAgIGNvbnN0IHByb3BlcnRpZXMgPSB2bm9kZS5kZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayghIXZub2RlLmluc2VydGVkKTtcclxuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgIHZub2RlLnByb3BlcnRpZXMgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9wZXJ0aWVzLCB2bm9kZS5kZWNvcmF0ZWREZWZlcnJlZFByb3BlcnRpZXMpO1xyXG4gICAgcHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3MucHVzaCgoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oe30sIHZub2RlLmRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrKCEhdm5vZGUuaW5zZXJ0ZWQpLCB2bm9kZS5kZWNvcmF0ZWREZWZlcnJlZFByb3BlcnRpZXMpO1xyXG4gICAgICAgIHVwZGF0ZVByb3BlcnRpZXModm5vZGUuZG9tTm9kZSwgdm5vZGUucHJvcGVydGllcywgcHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIHZub2RlLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xyXG4gICAgfSk7XHJcbn1cclxuZnVuY3Rpb24gcnVuRGVmZXJyZWRSZW5kZXJDYWxsYmFja3MocHJvamVjdGlvbk9wdGlvbnMpIHtcclxuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgIGlmIChwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcclxuICAgICAgICBpZiAocHJvamVjdGlvbk9wdGlvbnMuc3luYykge1xyXG4gICAgICAgICAgICB3aGlsZSAocHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBnbG9iYWwucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHJ1bkFmdGVyUmVuZGVyQ2FsbGJhY2tzKHByb2plY3Rpb25PcHRpb25zKSB7XHJcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XHJcbiAgICBpZiAocHJvamVjdGlvbk9wdGlvbnMuc3luYykge1xyXG4gICAgICAgIHdoaWxlIChwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5zaGlmdCgpO1xyXG4gICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChnbG9iYWwucmVxdWVzdElkbGVDYWxsYmFjaykge1xyXG4gICAgICAgICAgICBnbG9iYWwucmVxdWVzdElkbGVDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAocHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5zaGlmdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAocHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5zaGlmdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBzY2hlZHVsZVJlbmRlcihwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xyXG4gICAgaWYgKHByb2plY3Rpb25PcHRpb25zLnN5bmMpIHtcclxuICAgICAgICByZW5kZXIocHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAocHJvamVjdG9yU3RhdGUucmVuZGVyU2NoZWR1bGVkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBwcm9qZWN0b3JTdGF0ZS5yZW5kZXJTY2hlZHVsZWQgPSBnbG9iYWwucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgcmVuZGVyKHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiByZW5kZXIocHJvamVjdGlvbk9wdGlvbnMpIHtcclxuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgIHByb2plY3RvclN0YXRlLnJlbmRlclNjaGVkdWxlZCA9IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IHJlbmRlclF1ZXVlID0gcHJvamVjdG9yU3RhdGUucmVuZGVyUXVldWU7XHJcbiAgICBjb25zdCByZW5kZXJzID0gWy4uLnJlbmRlclF1ZXVlXTtcclxuICAgIHByb2plY3RvclN0YXRlLnJlbmRlclF1ZXVlID0gW107XHJcbiAgICByZW5kZXJzLnNvcnQoKGEsIGIpID0+IGEuZGVwdGggLSBiLmRlcHRoKTtcclxuICAgIGNvbnN0IHByZXZpb3VzbHlSZW5kZXJlZCA9IFtdO1xyXG4gICAgd2hpbGUgKHJlbmRlcnMubGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgeyBpbnN0YW5jZSB9ID0gcmVuZGVycy5zaGlmdCgpO1xyXG4gICAgICAgIGlmIChpbnN0YW5jZU1hcC5oYXMoaW5zdGFuY2UpICYmIHByZXZpb3VzbHlSZW5kZXJlZC5pbmRleE9mKGluc3RhbmNlKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgcHJldmlvdXNseVJlbmRlcmVkLnB1c2goaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICBjb25zdCB7IHBhcmVudFZOb2RlLCBkbm9kZSB9ID0gaW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKTtcclxuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKTtcclxuICAgICAgICAgICAgY29uc3QgbmV4dFNpYmxpbmdzID0gbmV4dFNpYmxpbmdNYXAuZ2V0KGluc3RhbmNlKTtcclxuICAgICAgICAgICAgdXBkYXRlRG9tKGRub2RlLCB0b0ludGVybmFsV05vZGUoaW5zdGFuY2UsIGluc3RhbmNlRGF0YSksIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRWTm9kZSwgaW5zdGFuY2UsIG5leHRTaWJsaW5ncywgbmV4dFNpYmxpbmdzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBydW5BZnRlclJlbmRlckNhbGxiYWNrcyhwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICBydW5EZWZlcnJlZFJlbmRlckNhbGxiYWNrcyhwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbn1cclxuZXhwb3J0IGNvbnN0IGRvbSA9IHtcclxuICAgIGFwcGVuZDogZnVuY3Rpb24gKHBhcmVudE5vZGUsIGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyA9IHt9KSB7XHJcbiAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKTtcclxuICAgICAgICBjb25zdCBmaW5hbFByb2plY3Rvck9wdGlvbnMgPSBnZXRQcm9qZWN0aW9uT3B0aW9ucyhwcm9qZWN0aW9uT3B0aW9ucywgaW5zdGFuY2UpO1xyXG4gICAgICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0ge1xyXG4gICAgICAgICAgICBhZnRlclJlbmRlckNhbGxiYWNrczogW10sXHJcbiAgICAgICAgICAgIGRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzOiBbXSxcclxuICAgICAgICAgICAgbm9kZU1hcDogbmV3IFdlYWtNYXAoKSxcclxuICAgICAgICAgICAgcmVuZGVyU2NoZWR1bGVkOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHJlbmRlclF1ZXVlOiBbXSxcclxuICAgICAgICAgICAgbWVyZ2U6IHByb2plY3Rpb25PcHRpb25zLm1lcmdlIHx8IGZhbHNlLFxyXG4gICAgICAgICAgICBtZXJnZUVsZW1lbnQ6IHByb2plY3Rpb25PcHRpb25zLm1lcmdlRWxlbWVudFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcHJvamVjdG9yU3RhdGVNYXAuc2V0KGluc3RhbmNlLCBwcm9qZWN0b3JTdGF0ZSk7XHJcbiAgICAgICAgZmluYWxQcm9qZWN0b3JPcHRpb25zLnJvb3ROb2RlID0gcGFyZW50Tm9kZTtcclxuICAgICAgICBjb25zdCBwYXJlbnRWTm9kZSA9IHRvUGFyZW50Vk5vZGUoZmluYWxQcm9qZWN0b3JPcHRpb25zLnJvb3ROb2RlKTtcclxuICAgICAgICBjb25zdCBub2RlID0gdG9JbnRlcm5hbFdOb2RlKGluc3RhbmNlLCBpbnN0YW5jZURhdGEpO1xyXG4gICAgICAgIGluc3RhbmNlTWFwLnNldChpbnN0YW5jZSwgeyBkbm9kZTogbm9kZSwgcGFyZW50Vk5vZGUgfSk7XHJcbiAgICAgICAgaW5zdGFuY2VEYXRhLmludmFsaWRhdGUgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5kaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZURhdGEucmVuZGVyaW5nID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgcHJvamVjdG9yU3RhdGUucmVuZGVyUXVldWUucHVzaCh7IGluc3RhbmNlLCBkZXB0aDogZmluYWxQcm9qZWN0b3JPcHRpb25zLmRlcHRoIH0pO1xyXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVSZW5kZXIoZmluYWxQcm9qZWN0b3JPcHRpb25zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdXBkYXRlRG9tKG5vZGUsIG5vZGUsIGZpbmFsUHJvamVjdG9yT3B0aW9ucywgcGFyZW50Vk5vZGUsIGluc3RhbmNlLCBbXSwgW10pO1xyXG4gICAgICAgIHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xyXG4gICAgICAgICAgICBpbnN0YW5jZURhdGEub25BdHRhY2goKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBydW5EZWZlcnJlZFJlbmRlckNhbGxiYWNrcyhmaW5hbFByb2plY3Rvck9wdGlvbnMpO1xyXG4gICAgICAgIHJ1bkFmdGVyUmVuZGVyQ2FsbGJhY2tzKGZpbmFsUHJvamVjdG9yT3B0aW9ucyk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZG9tTm9kZTogZmluYWxQcm9qZWN0b3JPcHRpb25zLnJvb3ROb2RlXHJcbiAgICAgICAgfTtcclxuICAgIH0sXHJcbiAgICBjcmVhdGU6IGZ1bmN0aW9uIChpbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksIGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICB9LFxyXG4gICAgbWVyZ2U6IGZ1bmN0aW9uIChlbGVtZW50LCBpbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIHByb2plY3Rpb25PcHRpb25zLm1lcmdlID0gdHJ1ZTtcclxuICAgICAgICBwcm9qZWN0aW9uT3B0aW9ucy5tZXJnZUVsZW1lbnQgPSBlbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24gPSB0aGlzLmFwcGVuZChlbGVtZW50LnBhcmVudE5vZGUsIGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQoaW5zdGFuY2UpO1xyXG4gICAgICAgIHByb2plY3RvclN0YXRlLm1lcmdlID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIHByb2plY3Rpb247XHJcbiAgICB9XHJcbn07XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZkb20ubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS92ZG9tLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL3Zkb20ubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIiwiLyoqKiBJTVBPUlRTIEZST00gaW1wb3J0cy1sb2FkZXIgKioqL1xudmFyIHdpZGdldEZhY3RvcnkgPSByZXF1aXJlKFwic3JjL21lbnUtaXRlbS9NZW51SXRlbVwiKTtcblxudmFyIHJlZ2lzdGVyQ3VzdG9tRWxlbWVudCA9IHJlcXVpcmUoJ0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9yZWdpc3RlckN1c3RvbUVsZW1lbnQnKS5kZWZhdWx0O1xyXG5cclxudmFyIGRlZmF1bHRFeHBvcnQgPSB3aWRnZXRGYWN0b3J5LmRlZmF1bHQ7XHJcbmRlZmF1bHRFeHBvcnQgJiYgcmVnaXN0ZXJDdXN0b21FbGVtZW50KGRlZmF1bHRFeHBvcnQpO1xyXG5cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2ltcG9ydHMtbG9hZGVyP3dpZGdldEZhY3Rvcnk9c3JjL21lbnUtaXRlbS9NZW51SXRlbSEuL25vZGVfbW9kdWxlcy9AZG9qby9jbGktYnVpbGQtd2lkZ2V0L3RlbXBsYXRlL2N1c3RvbS1lbGVtZW50LmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9pbXBvcnRzLWxvYWRlci9pbmRleC5qcz93aWRnZXRGYWN0b3J5PXNyYy9tZW51LWl0ZW0vTWVudUl0ZW0hLi9ub2RlX21vZHVsZXMvQGRvam8vY2xpLWJ1aWxkLXdpZGdldC90ZW1wbGF0ZS9jdXN0b20tZWxlbWVudC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXHJcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXHJcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcblxyXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXHJcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcclxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcclxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cclxuXHJcblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xyXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIGlmIChlLmluZGV4T2YocFtpXSkgPCAwKVxyXG4gICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHJlc3VsdC52YWx1ZSk7IH0pLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0geVtvcFswXSAmIDIgPyBcInJldHVyblwiIDogb3BbMF0gPyBcInRocm93XCIgOiBcIm5leHRcIl0pICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gWzAsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBleHBvcnRzKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmICghZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7ICB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAob1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpIHx8ICgxLGV2YWwpKFwidGhpc1wiKTtcbn0gY2F0Y2goZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZih0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKVxuXHRcdGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vICh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvd2VicGFjay9idWlsZGluL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUtaXRlbSIsImltcG9ydCB7IHYgfSBmcm9tICdAZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZCc7XHJcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdAZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9jdXN0b21FbGVtZW50JztcclxuaW1wb3J0IHsgV2lkZ2V0UHJvcGVydGllcyB9IGZyb20gJ0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgdGhlbWUsIFRoZW1lZE1peGluIH0gZnJvbSAnQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL21peGlucy9UaGVtZWQnO1xyXG5pbXBvcnQgeyBXaWRnZXRCYXNlIH0gZnJvbSAnQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL1dpZGdldEJhc2UnO1xyXG5cclxuaW1wb3J0ICogYXMgY3NzIGZyb20gJy4vbWVudUl0ZW0ubS5jc3MnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNZW51SXRlbVByb3BlcnRpZXMgZXh0ZW5kcyBXaWRnZXRQcm9wZXJ0aWVzIHtcclxuXHR0aXRsZTogc3RyaW5nO1xyXG5cdHNlbGVjdGVkPzogYm9vbGVhbjtcclxuXHRkYXRhPzogYW55O1xyXG5cdG9uU2VsZWN0ZWQ/OiAoZGF0YTogYW55KSA9PiB2b2lkO1xyXG59XHJcblxyXG5AY3VzdG9tRWxlbWVudDxNZW51SXRlbVByb3BlcnRpZXM+KHtcclxuXHR0YWc6ICdkZW1vLW1lbnUtaXRlbScsXHJcblx0YXR0cmlidXRlczogWyd0aXRsZScsICdzZWxlY3RlZCddLFxyXG5cdGV2ZW50czogWydvblNlbGVjdGVkJ10sXHJcblx0cHJvcGVydGllczogWydkYXRhJywgJ3NlbGVjdGVkJ11cclxufSlcclxuQHRoZW1lKGNzcylcclxuZXhwb3J0IGNsYXNzIE1lbnVJdGVtIGV4dGVuZHMgVGhlbWVkTWl4aW4oV2lkZ2V0QmFzZSk8TWVudUl0ZW1Qcm9wZXJ0aWVzPiB7XHJcblx0cHJpdmF0ZSBfb25DbGljaygpIHtcclxuXHRcdHRoaXMucHJvcGVydGllcy5vblNlbGVjdGVkICYmIHRoaXMucHJvcGVydGllcy5vblNlbGVjdGVkKHRoaXMucHJvcGVydGllcy5kYXRhKTtcclxuXHR9XHJcblxyXG5cdHByb3RlY3RlZCByZW5kZXIoKSB7XHJcblx0XHRjb25zdCB7IHRpdGxlLCBzZWxlY3RlZCB9ID0gdGhpcy5wcm9wZXJ0aWVzO1xyXG5cclxuXHRcdHJldHVybiB2KCdsaScsIHsgY2xhc3NlczogdGhpcy50aGVtZShjc3Mucm9vdCkgfSwgW1xyXG5cdFx0XHR2KFxyXG5cdFx0XHRcdCdzcGFuJyxcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHRjbGFzc2VzOiB0aGlzLnRoZW1lKFtjc3MuaXRlbSwgc2VsZWN0ZWQgPyBjc3Muc2VsZWN0ZWQgOiBudWxsXSksXHJcblx0XHRcdFx0XHRvbmNsaWNrOiB0aGlzLl9vbkNsaWNrXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRbdGl0bGVdXHJcblx0XHRcdClcclxuXHRcdF0pO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWVudUl0ZW07XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kdHMtbG9hZGVyP3R5cGU9dHMmaW5zdGFuY2VOYW1lPTBfbWVudS1pdGVtIS4vc3JjL21lbnUtaXRlbS9NZW51SXRlbS50cyIsIi8vIHJlbW92ZWQgYnkgZXh0cmFjdC10ZXh0LXdlYnBhY2stcGx1Z2luXG5tb2R1bGUuZXhwb3J0cyA9IHtcIiBfa2V5XCI6XCJ0ZXN0LWFwcC9tZW51SXRlbVwiLFwicm9vdFwiOlwibWVudUl0ZW0tbV9fcm9vdF9fc1VtVWlcIixcIml0ZW1cIjpcIm1lbnVJdGVtLW1fX2l0ZW1fXzJNazZSXCIsXCJzZWxlY3RlZFwiOlwibWVudUl0ZW0tbV9fc2VsZWN0ZWRfXzEtZjNJXCJ9O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL21lbnUtaXRlbS9tZW51SXRlbS5tLmNzc1xuLy8gbW9kdWxlIGlkID0gLi9zcmMvbWVudS1pdGVtL21lbnVJdGVtLm0uY3NzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudS1pdGVtIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/test-app/fixtures/windows/dev/menu/menu-1.0.0.js b/test-app/fixtures/windows/dev/menu/menu-1.0.0.js index b1a8f13..af4da3d 100644 --- a/test-app/fixtures/windows/dev/menu/menu-1.0.0.js +++ b/test-app/fixtures/windows/dev/menu/menu-1.0.0.js @@ -73,19 +73,19 @@ /************************************************************************/ /******/ ({ -/***/ "./node_modules/@dojo/core/Destroyable.mjs": +/***/ "./node_modules/@dojo/framework/core/Destroyable.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__lang__ = __webpack_require__("./node_modules/@dojo/core/lang.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Promise__ = __webpack_require__("./node_modules/@dojo/shim/Promise.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__lang__ = __webpack_require__("./node_modules/@dojo/framework/core/lang.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__shim_Promise__ = __webpack_require__("./node_modules/@dojo/framework/shim/Promise.mjs"); /** * No operation function to replace own once instance is destoryed */ function noop() { - return __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Promise__["a" /* default */].resolve(false); + return __WEBPACK_IMPORTED_MODULE_1__shim_Promise__["a" /* default */].resolve(false); } /** * No op function used to replace own, once instance has been destoryed @@ -123,7 +123,7 @@ class Destroyable { * @returns {Promise { + return new __WEBPACK_IMPORTED_MODULE_1__shim_Promise__["a" /* default */]((resolve) => { this.handles.forEach((handle) => { handle && handle.destroy && handle.destroy(); }); @@ -140,19 +140,19 @@ class Destroyable { /***/ }), -/***/ "./node_modules/@dojo/core/Evented.mjs": +/***/ "./node_modules/@dojo/framework/core/Evented.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export isGlobMatch */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__ = __webpack_require__("./node_modules/@dojo/shim/Map.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Destroyable__ = __webpack_require__("./node_modules/@dojo/core/Destroyable.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_Map__ = __webpack_require__("./node_modules/@dojo/framework/shim/Map.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Destroyable__ = __webpack_require__("./node_modules/@dojo/framework/core/Destroyable.mjs"); /** * Map of computed regular expressions, keyed by string */ -const regexMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */](); +const regexMap = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["b" /* default */](); /** * Determines is the event type glob has been matched * @@ -183,12 +183,12 @@ class Evented extends __WEBPACK_IMPORTED_MODULE_1__Destroyable__["a" /* Destroya /** * map of listeners keyed by event type */ - this.listenersMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */](); + this.listenersMap = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["b" /* default */](); } emit(event) { this.listenersMap.forEach((methods, type) => { if (isGlobMatch(type, event.type)) { - methods.forEach((method) => { + [...methods].forEach((method) => { method.call(this, event); }); } @@ -224,7 +224,7 @@ class Evented extends __WEBPACK_IMPORTED_MODULE_1__Destroyable__["a" /* Destroya /***/ }), -/***/ "./node_modules/@dojo/core/lang.mjs": +/***/ "./node_modules/@dojo/framework/core/lang.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -238,8 +238,8 @@ class Evented extends __WEBPACK_IMPORTED_MODULE_1__Destroyable__["a" /* Destroya /* unused harmony export partial */ /* unused harmony export createHandle */ /* harmony export (immutable) */ __webpack_exports__["b"] = createCompositeHandle; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_object__ = __webpack_require__("./node_modules/@dojo/shim/object.mjs"); -/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return __WEBPACK_IMPORTED_MODULE_0__dojo_shim_object__["a"]; }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_object__ = __webpack_require__("./node_modules/@dojo/framework/shim/object.mjs"); +/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return __WEBPACK_IMPORTED_MODULE_0__shim_object__["a"]; }); const slice = Array.prototype.slice; @@ -317,7 +317,7 @@ function create(prototype, ...mixins) { } const args = mixins.slice(); args.unshift(Object.create(prototype)); - return __WEBPACK_IMPORTED_MODULE_0__dojo_shim_object__["a" /* assign */].apply(null, args); + return __WEBPACK_IMPORTED_MODULE_0__shim_object__["a" /* assign */].apply(null, args); } function deepAssign(target, ...sources) { return _mixin({ @@ -439,7 +439,7 @@ function createCompositeHandle(...handles) { /***/ }), -/***/ "./node_modules/@dojo/has/has.mjs": +/***/ "./node_modules/@dojo/framework/has/has.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -652,16 +652,16 @@ add('host-node', function () { /***/ }), -/***/ "./node_modules/@dojo/shim/Map.mjs": +/***/ "./node_modules/@dojo/framework/shim/Map.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Map; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__iterator__ = __webpack_require__("./node_modules/@dojo/shim/iterator.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__object__ = __webpack_require__("./node_modules/@dojo/shim/object.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__iterator__ = __webpack_require__("./node_modules/@dojo/framework/shim/iterator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__object__ = __webpack_require__("./node_modules/@dojo/framework/shim/object.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); @@ -761,15 +761,15 @@ var _a; /***/ }), -/***/ "./node_modules/@dojo/shim/Promise.mjs": +/***/ "./node_modules/@dojo/framework/shim/Promise.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export ShimPromise */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__support_queue__ = __webpack_require__("./node_modules/@dojo/shim/support/queue.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__support_queue__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/queue.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); @@ -974,15 +974,15 @@ var _a; /***/ }), -/***/ "./node_modules/@dojo/shim/Symbol.mjs": +/***/ "./node_modules/@dojo/framework/shim/Symbol.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export Symbol */ /* unused harmony export isSymbol */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__support_util__ = __webpack_require__("./node_modules/@dojo/shim/support/util.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__support_util__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/util.mjs"); @@ -1131,15 +1131,15 @@ function isSymbol(value) { /***/ }), -/***/ "./node_modules/@dojo/shim/WeakMap.mjs": +/***/ "./node_modules/@dojo/framework/shim/WeakMap.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export WeakMap */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__iterator__ = __webpack_require__("./node_modules/@dojo/shim/iterator.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__iterator__ = __webpack_require__("./node_modules/@dojo/framework/shim/iterator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); @@ -1254,7 +1254,7 @@ if (false) { /***/ }), -/***/ "./node_modules/@dojo/shim/array.mjs": +/***/ "./node_modules/@dojo/framework/shim/array.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -1265,11 +1265,11 @@ if (false) { /* unused harmony export find */ /* unused harmony export findIndex */ /* unused harmony export includes */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__iterator__ = __webpack_require__("./node_modules/@dojo/shim/iterator.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__number__ = __webpack_require__("./node_modules/@dojo/shim/number.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__support_util__ = __webpack_require__("./node_modules/@dojo/shim/support/util.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__iterator__ = __webpack_require__("./node_modules/@dojo/framework/shim/iterator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__number__ = __webpack_require__("./node_modules/@dojo/framework/shim/number.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__support_util__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/util.mjs"); @@ -1521,7 +1521,7 @@ else { /***/ }), -/***/ "./node_modules/@dojo/shim/global.mjs": +/***/ "./node_modules/@dojo/framework/shim/global.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -1547,7 +1547,7 @@ else { /***/ }), -/***/ "./node_modules/@dojo/shim/iterator.mjs": +/***/ "./node_modules/@dojo/framework/shim/iterator.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -1555,8 +1555,8 @@ else { /* unused harmony export isArrayLike */ /* unused harmony export get */ /* unused harmony export forOf */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__string__ = __webpack_require__("./node_modules/@dojo/shim/string.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__string__ = __webpack_require__("./node_modules/@dojo/framework/shim/string.mjs"); const staticDone = { done: true, value: undefined }; @@ -1673,7 +1673,7 @@ function forOf(iterable, callback, thisArg) { /***/ }), -/***/ "./node_modules/@dojo/shim/number.mjs": +/***/ "./node_modules/@dojo/framework/shim/number.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -1681,7 +1681,7 @@ function forOf(iterable, callback, thisArg) { /* unused harmony export isFinite */ /* unused harmony export isInteger */ /* unused harmony export isSafeInteger */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); /** * The smallest interval between two representable numbers. @@ -1745,7 +1745,7 @@ function isSafeInteger(value) { /***/ }), -/***/ "./node_modules/@dojo/shim/object.mjs": +/***/ "./node_modules/@dojo/framework/shim/object.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -1758,9 +1758,9 @@ function isSafeInteger(value) { /* unused harmony export getOwnPropertyDescriptors */ /* unused harmony export entries */ /* unused harmony export values */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); @@ -1875,7 +1875,7 @@ else { /***/ }), -/***/ "./node_modules/@dojo/shim/string.mjs": +/***/ "./node_modules/@dojo/framework/shim/string.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -1889,9 +1889,9 @@ else { /* unused harmony export startsWith */ /* unused harmony export padEnd */ /* unused harmony export padStart */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__support_has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__support_util__ = __webpack_require__("./node_modules/@dojo/shim/support/util.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__support_has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__support_util__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/util.mjs"); @@ -2200,33 +2200,33 @@ else { /***/ }), -/***/ "./node_modules/@dojo/shim/support/has.mjs": +/***/ "./node_modules/@dojo/framework/shim/support/has.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_has_has__ = __webpack_require__("./node_modules/@dojo/has/has.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__has_has__ = __webpack_require__("./node_modules/@dojo/framework/has/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); /* unused harmony reexport namespace */ -/* unused harmony default export */ var _unused_webpack_default_export = (__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["b" /* default */]); +/* unused harmony default export */ var _unused_webpack_default_export = (__WEBPACK_IMPORTED_MODULE_0__has_has__["b" /* default */]); /* ECMAScript 6 and 7 Features */ /* Array */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-array', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-array', () => { return (['from', 'of'].every((key) => key in __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Array) && ['findIndex', 'find', 'copyWithin'].every((key) => key in __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Array.prototype)); }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-array-fill', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-array-fill', () => { if ('fill' in __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Array.prototype) { /* Some versions of Safari do not properly implement this */ return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1; } return false; }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es7-array', () => 'includes' in __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Array.prototype, true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es7-array', () => 'includes' in __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Array.prototype, true); /* Map */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-map', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-map', () => { if (typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Map === 'function') { /* IE11 and older versions of Safari are missing critical ES6 Map functionality @@ -2249,7 +2249,7 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-map', () return false; }, true); /* Math */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-math', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-math', () => { return [ 'clz32', 'sign', @@ -2269,7 +2269,7 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-math', ( 'hypot' ].every((name) => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Math[name] === 'function'); }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-math-imul', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-math-imul', () => { if ('imul' in __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Math) { /* Some versions of Safari on ios do not properly implement this */ return Math.imul(0xffffffff, 5) === -5; @@ -2277,19 +2277,19 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-math-imu return false; }, true); /* Object */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-object', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-object', () => { return true && ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Object[name] === 'function'); }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es2017-object', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es2017-object', () => { return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Object[name] === 'function'); }, true); /* Observable */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es-observable', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Observable !== 'undefined', true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es-observable', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Observable !== 'undefined', true); /* Promise */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-promise', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Promise !== 'undefined' && true, true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-promise', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Promise !== 'undefined' && true, true); /* Set */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-set', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-set', () => { if (typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Set === 'function') { /* IE11 and older versions of Safari are missing critical ES6 Set functionality */ const set = new __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Set([1]); @@ -2298,7 +2298,7 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-set', () return false; }, true); /* String */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-string', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-string', () => { return ([ /* static methods */ 'fromCodePoint' @@ -2313,7 +2313,7 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-string', 'includes' ].every((key) => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].String.prototype[key] === 'function')); }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-string-raw', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-string-raw', () => { function getCallSite(callSite, ...substitutions) { const result = [...callSite]; result.raw = callSite.raw; @@ -2328,13 +2328,13 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-string-r } return false; }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es2017-string', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es2017-string', () => { return ['padStart', 'padEnd'].every((key) => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].String.prototype[key] === 'function'); }, true); /* Symbol */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-symbol', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Symbol !== 'undefined' && typeof Symbol() === 'symbol', true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-symbol', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Symbol !== 'undefined' && typeof Symbol() === 'symbol', true); /* WeakMap */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-weakmap', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('es6-weakmap', () => { if (typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].WeakMap !== 'undefined') { /* IE11 and older versions of Safari are missing critical ES6 Map functionality */ const key1 = {}; @@ -2346,16 +2346,16 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('es6-weakmap' return false; }, true); /* Miscellaneous features */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('microtasks', () => true || false || true, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('postmessage', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('microtasks', () => true || false || true, true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('postmessage', () => { // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist. return typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].window !== 'undefined' && typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].postMessage === 'function'; }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('raf', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].requestAnimationFrame === 'function', true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('setimmediate', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].setImmediate !== 'undefined', true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('raf', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].requestAnimationFrame === 'function', true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('setimmediate', () => typeof __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].setImmediate !== 'undefined', true); /* DOM Features */ -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('dom-mutationobserver', () => { +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('dom-mutationobserver', () => { if (true && Boolean(__WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].MutationObserver || __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].WebKitMutationObserver)) { // IE11 has an unreliable MutationObserver implementation where setProperty() does not // generate a mutation event, observers can crash, and the queue does not drain @@ -2371,18 +2371,18 @@ Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('dom-mutation } return false; }, true); -Object(__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__["a" /* add */])('dom-webanimation', () => true && __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Animation !== undefined && __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].KeyframeEffect !== undefined, true); +Object(__WEBPACK_IMPORTED_MODULE_0__has_has__["a" /* add */])('dom-webanimation', () => true && __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].Animation !== undefined && __WEBPACK_IMPORTED_MODULE_1__global__["a" /* default */].KeyframeEffect !== undefined, true); //# sourceMappingURL=has.mjs.map /***/ }), -/***/ "./node_modules/@dojo/shim/support/queue.mjs": +/***/ "./node_modules/@dojo/framework/shim/support/queue.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export queueMicroTask */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__has__ = __webpack_require__("./node_modules/@dojo/shim/support/has.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__has__ = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.mjs"); function executeTask(item) { @@ -2576,7 +2576,7 @@ let queueMicroTask = (function () { /***/ }), -/***/ "./node_modules/@dojo/shim/support/util.mjs": +/***/ "./node_modules/@dojo/framework/shim/support/util.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -2608,13 +2608,13 @@ function wrapNative(nativeFunction) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/Injector.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/Injector.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__ = __webpack_require__("./node_modules/@dojo/core/Evented.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__core_Evented__ = __webpack_require__("./node_modules/@dojo/framework/core/Evented.mjs"); -class Injector extends __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__["a" /* Evented */] { +class Injector extends __WEBPACK_IMPORTED_MODULE_0__core_Evented__["a" /* Evented */] { constructor(payload) { super(); this._payload = payload; @@ -2639,13 +2639,13 @@ class Injector extends __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__["a" /* E /***/ }), -/***/ "./node_modules/@dojo/widget-core/NodeHandler.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export NodeEventType */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__ = __webpack_require__("./node_modules/@dojo/core/Evented.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Map__ = __webpack_require__("./node_modules/@dojo/shim/Map.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__core_Evented__ = __webpack_require__("./node_modules/@dojo/framework/core/Evented.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__shim_Map__ = __webpack_require__("./node_modules/@dojo/framework/shim/Map.mjs"); /** @@ -2658,10 +2658,10 @@ var NodeEventType; NodeEventType["Projector"] = "Projector"; NodeEventType["Widget"] = "Widget"; })(NodeEventType || (NodeEventType = {})); -class NodeHandler extends __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__["a" /* Evented */] { +class NodeHandler extends __WEBPACK_IMPORTED_MODULE_0__core_Evented__["a" /* Evented */] { constructor() { super(...arguments); - this._nodeMap = new __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Map__["b" /* default */](); + this._nodeMap = new __WEBPACK_IMPORTED_MODULE_1__shim_Map__["b" /* default */](); } get(key) { return this._nodeMap.get(key); @@ -2690,16 +2690,16 @@ class NodeHandler extends __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__["a" / /***/ }), -/***/ "./node_modules/@dojo/widget-core/Registry.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/Registry.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["d"] = isWidgetBaseConstructor; /* unused harmony export isWidgetConstructorDefaultExport */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Promise__ = __webpack_require__("./node_modules/@dojo/shim/Promise.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Map__ = __webpack_require__("./node_modules/@dojo/shim/Map.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__dojo_shim_Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__ = __webpack_require__("./node_modules/@dojo/core/Evented.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_Promise__ = __webpack_require__("./node_modules/@dojo/framework/shim/Promise.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__shim_Map__ = __webpack_require__("./node_modules/@dojo/framework/shim/Map.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__shim_Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__core_Evented__ = __webpack_require__("./node_modules/@dojo/framework/core/Evented.mjs"); @@ -2707,7 +2707,7 @@ class NodeHandler extends __WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__["a" / /** * Widget base symbol type */ -const WIDGET_BASE_TYPE = Object(__WEBPACK_IMPORTED_MODULE_2__dojo_shim_Symbol__["a" /* default */])('Widget Base'); +const WIDGET_BASE_TYPE = Object(__WEBPACK_IMPORTED_MODULE_2__shim_Symbol__["a" /* default */])('Widget Base'); /* harmony export (immutable) */ __webpack_exports__["b"] = WIDGET_BASE_TYPE; /** @@ -2728,7 +2728,7 @@ function isWidgetConstructorDefaultExport(item) { /** * The Registry implementation */ -class Registry extends __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__["a" /* Evented */] { +class Registry extends __WEBPACK_IMPORTED_MODULE_3__core_Evented__["a" /* Evented */] { /** * Emit loaded event for registry label */ @@ -2741,13 +2741,13 @@ class Registry extends __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__["a" /* E } define(label, item) { if (this._widgetRegistry === undefined) { - this._widgetRegistry = new __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Map__["b" /* default */](); + this._widgetRegistry = new __WEBPACK_IMPORTED_MODULE_1__shim_Map__["b" /* default */](); } if (this._widgetRegistry.has(label)) { throw new Error(`widget has already been registered for '${label.toString()}'`); } this._widgetRegistry.set(label, item); - if (item instanceof __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Promise__["a" /* default */]) { + if (item instanceof __WEBPACK_IMPORTED_MODULE_0__shim_Promise__["a" /* default */]) { item.then((widgetCtor) => { this._widgetRegistry.set(label, widgetCtor); this.emitLoadedEvent(label, widgetCtor); @@ -2762,12 +2762,12 @@ class Registry extends __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__["a" /* E } defineInjector(label, injectorFactory) { if (this._injectorRegistry === undefined) { - this._injectorRegistry = new __WEBPACK_IMPORTED_MODULE_1__dojo_shim_Map__["b" /* default */](); + this._injectorRegistry = new __WEBPACK_IMPORTED_MODULE_1__shim_Map__["b" /* default */](); } if (this._injectorRegistry.has(label)) { throw new Error(`injector has already been registered for '${label.toString()}'`); } - const invalidator = new __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__["a" /* Evented */](); + const invalidator = new __WEBPACK_IMPORTED_MODULE_3__core_Evented__["a" /* Evented */](); const injectorItem = { injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })), invalidator @@ -2783,7 +2783,7 @@ class Registry extends __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__["a" /* E if (isWidgetBaseConstructor(item)) { return item; } - if (item instanceof __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Promise__["a" /* default */]) { + if (item instanceof __WEBPACK_IMPORTED_MODULE_0__shim_Promise__["a" /* default */]) { return null; } const promise = item(); @@ -2820,22 +2820,22 @@ class Registry extends __WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__["a" /* E /***/ }), -/***/ "./node_modules/@dojo/widget-core/RegistryHandler.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__ = __webpack_require__("./node_modules/@dojo/shim/Map.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_core_Evented__ = __webpack_require__("./node_modules/@dojo/core/Evented.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Registry__ = __webpack_require__("./node_modules/@dojo/widget-core/Registry.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_Map__ = __webpack_require__("./node_modules/@dojo/framework/shim/Map.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__core_Evented__ = __webpack_require__("./node_modules/@dojo/framework/core/Evented.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Registry__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.mjs"); -class RegistryHandler extends __WEBPACK_IMPORTED_MODULE_1__dojo_core_Evented__["a" /* Evented */] { +class RegistryHandler extends __WEBPACK_IMPORTED_MODULE_1__core_Evented__["a" /* Evented */] { constructor() { super(); this._registry = new __WEBPACK_IMPORTED_MODULE_2__Registry__["a" /* Registry */](); - this._registryWidgetLabelMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["a" /* Map */](); - this._registryInjectorLabelMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["a" /* Map */](); + this._registryWidgetLabelMap = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["a" /* Map */](); + this._registryInjectorLabelMap = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["a" /* Map */](); this.own(this._registry); const destroy = () => { if (this.baseRegistry) { @@ -2904,19 +2904,19 @@ class RegistryHandler extends __WEBPACK_IMPORTED_MODULE_1__dojo_core_Evented__[" /***/ }), -/***/ "./node_modules/@dojo/widget-core/WidgetBase.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__ = __webpack_require__("./node_modules/@dojo/shim/Map.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_shim_WeakMap__ = __webpack_require__("./node_modules/@dojo/shim/WeakMap.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__dojo_shim_Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__d__ = __webpack_require__("./node_modules/@dojo/widget-core/d.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__diff__ = __webpack_require__("./node_modules/@dojo/widget-core/diff.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__RegistryHandler__ = __webpack_require__("./node_modules/@dojo/widget-core/RegistryHandler.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__NodeHandler__ = __webpack_require__("./node_modules/@dojo/widget-core/NodeHandler.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__vdom__ = __webpack_require__("./node_modules/@dojo/widget-core/vdom.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__Registry__ = __webpack_require__("./node_modules/@dojo/widget-core/Registry.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_Map__ = __webpack_require__("./node_modules/@dojo/framework/shim/Map.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__shim_WeakMap__ = __webpack_require__("./node_modules/@dojo/framework/shim/WeakMap.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__shim_Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__d__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__diff__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/diff.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__RegistryHandler__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__NodeHandler__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/NodeHandler.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__vdom__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/vdom.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__Registry__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.mjs"); @@ -2926,9 +2926,9 @@ class RegistryHandler extends __WEBPACK_IMPORTED_MODULE_1__dojo_core_Evented__[" -const decoratorMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */](); +const decoratorMap = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["b" /* default */](); const boundAuto = __WEBPACK_IMPORTED_MODULE_4__diff__["a" /* auto */].bind(null); -const noBind = __WEBPACK_IMPORTED_MODULE_2__dojo_shim_Symbol__["a" /* default */].for('dojoNoBind'); +const noBind = __WEBPACK_IMPORTED_MODULE_2__shim_Symbol__["a" /* default */].for('dojoNoBind'); /* harmony export (immutable) */ __webpack_exports__["b"] = noBind; /** @@ -2950,7 +2950,7 @@ class WidgetBase { this._nodeHandler = new __WEBPACK_IMPORTED_MODULE_6__NodeHandler__["a" /* default */](); this._handles = []; this._children = []; - this._decoratorCache = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */](); + this._decoratorCache = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["b" /* default */](); this._properties = {}; this._boundRenderFunc = this.render.bind(this); this._boundInvalidate = this.invalidate.bind(this); @@ -2975,7 +2975,7 @@ class WidgetBase { } meta(MetaType) { if (this._metaMap === undefined) { - this._metaMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */](); + this._metaMap = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["b" /* default */](); } let cached = this._metaMap.get(MetaType); if (!cached) { @@ -3059,9 +3059,14 @@ class WidgetBase { } } if (runReactions) { - this._mapDiffPropertyReactions(properties, changedPropertyKeys).forEach((args, reaction) => { - if (args.changed) { - reaction.call(this, args.previousProperties, args.newProperties); + const reactionFunctions = this.getDecorator('diffReaction'); + const executedReactions = []; + reactionFunctions.forEach(({ reaction, propertyName }) => { + const propertyChanged = changedPropertyKeys.indexOf(propertyName) !== -1; + const reactionRun = executedReactions.indexOf(reaction) !== -1; + if (propertyChanged && !reactionRun) { + reaction.call(this, this._properties, diffPropertyResults); + executedReactions.push(reaction); } }); } @@ -3124,7 +3129,7 @@ class WidgetBase { if (this.hasOwnProperty('constructor')) { let decoratorList = decoratorMap.get(this.constructor); if (!decoratorList) { - decoratorList = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */](); + decoratorList = new __WEBPACK_IMPORTED_MODULE_0__shim_Map__["b" /* default */](); decoratorMap.set(this.constructor, decoratorList); } let specificDecoratorList = decoratorList.get(decoratorKey); @@ -3176,26 +3181,6 @@ class WidgetBase { this._decoratorCache.set(decoratorKey, allDecorators); return allDecorators; } - _mapDiffPropertyReactions(newProperties, changedPropertyKeys) { - const reactionFunctions = this.getDecorator('diffReaction'); - return reactionFunctions.reduce((reactionPropertyMap, { reaction, propertyName }) => { - let reactionArguments = reactionPropertyMap.get(reaction); - if (reactionArguments === undefined) { - reactionArguments = { - previousProperties: {}, - newProperties: {}, - changed: false - }; - } - reactionArguments.previousProperties[propertyName] = this._properties[propertyName]; - reactionArguments.newProperties[propertyName] = newProperties[propertyName]; - if (changedPropertyKeys.indexOf(propertyName) !== -1) { - reactionArguments.changed = true; - } - reactionPropertyMap.set(reaction, reactionArguments); - return reactionPropertyMap; - }, new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__["b" /* default */]()); - } /** * Binds unbound property functions to the specified `bind` property * @@ -3204,7 +3189,7 @@ class WidgetBase { _bindFunctionProperty(property, bind) { if (typeof property === 'function' && !property[noBind] && Object(__WEBPACK_IMPORTED_MODULE_8__Registry__["d" /* isWidgetBaseConstructor */])(property) === false) { if (this._bindFunctionPropertyMap === undefined) { - this._bindFunctionPropertyMap = new __WEBPACK_IMPORTED_MODULE_1__dojo_shim_WeakMap__["a" /* default */](); + this._bindFunctionPropertyMap = new __WEBPACK_IMPORTED_MODULE_1__shim_WeakMap__["a" /* default */](); } const bindInfo = this._bindFunctionPropertyMap.get(property) || {}; let { boundFunc, scope } = bindInfo; @@ -3258,7 +3243,7 @@ class WidgetBase { runAfterRenders(dNode) { const afterRenders = this.getDecorator('afterRender'); if (afterRenders.length > 0) { - return afterRenders.reduce((dNode, afterRenderFunction) => { + dNode = afterRenders.reduce((dNode, afterRenderFunction) => { return afterRenderFunction.call(this, dNode); }, dNode); } @@ -3298,7 +3283,7 @@ WidgetBase._type = __WEBPACK_IMPORTED_MODULE_8__Registry__["b" /* WIDGET_BASE_TY /***/ }), -/***/ "./node_modules/@dojo/widget-core/animations/cssTransitions.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -3368,7 +3353,7 @@ function enter(node, properties, enterAnimation) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/d.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/d.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -3380,24 +3365,24 @@ function enter(node, properties, enterAnimation) { /* harmony export (immutable) */ __webpack_exports__["h"] = w; /* harmony export (immutable) */ __webpack_exports__["g"] = v; /* harmony export (immutable) */ __webpack_exports__["c"] = dom; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_Symbol__ = __webpack_require__("./node_modules/@dojo/shim/Symbol.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_Symbol__ = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.mjs"); /** * The symbol identifier for a WNode type */ -const WNODE = Object(__WEBPACK_IMPORTED_MODULE_0__dojo_shim_Symbol__["a" /* default */])('Identifier for a WNode.'); +const WNODE = Object(__WEBPACK_IMPORTED_MODULE_0__shim_Symbol__["a" /* default */])('Identifier for a WNode.'); /* harmony export (immutable) */ __webpack_exports__["b"] = WNODE; /** * The symbol identifier for a VNode type */ -const VNODE = Object(__WEBPACK_IMPORTED_MODULE_0__dojo_shim_Symbol__["a" /* default */])('Identifier for a VNode.'); +const VNODE = Object(__WEBPACK_IMPORTED_MODULE_0__shim_Symbol__["a" /* default */])('Identifier for a VNode.'); /* harmony export (immutable) */ __webpack_exports__["a"] = VNODE; /** * The symbol identifier for a VNode type created using dom() */ -const DOMVNODE = Object(__WEBPACK_IMPORTED_MODULE_0__dojo_shim_Symbol__["a" /* default */])('Identifier for a VNode created using existing dom.'); +const DOMVNODE = Object(__WEBPACK_IMPORTED_MODULE_0__shim_Symbol__["a" /* default */])('Identifier for a VNode created using existing dom.'); /* unused harmony export DOMVNODE */ /** @@ -3499,12 +3484,12 @@ function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, child /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/afterRender.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = afterRender; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"); function afterRender(method) { return Object(__WEBPACK_IMPORTED_MODULE_0__handleDecorator__["a" /* handleDecorator */])((target, propertyKey) => { @@ -3516,13 +3501,13 @@ function afterRender(method) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = alwaysRender; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__beforeProperties__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__beforeProperties__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs"); function alwaysRender() { @@ -3537,12 +3522,12 @@ function alwaysRender() { /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = beforeProperties; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"); function beforeProperties(method) { return Object(__WEBPACK_IMPORTED_MODULE_0__handleDecorator__["a" /* handleDecorator */])((target, propertyKey) => { @@ -3554,13 +3539,13 @@ function beforeProperties(method) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/customElement.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = customElement; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__registerCustomElement__ = __webpack_require__("./node_modules/@dojo/widget-core/registerCustomElement.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Registry__ = __webpack_require__("./node_modules/@dojo/widget-core/Registry.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__registerCustomElement__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Registry__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.mjs"); /** @@ -3584,12 +3569,14 @@ function customElement({ tag, properties = [], attributes = [], events = [], chi /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = diffProperty; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__handleDecorator__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__diff__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/diff.mjs"); + /** * Decorator that can be used to register a function as a specific property diff @@ -3598,7 +3585,7 @@ function customElement({ tag, properties = [], attributes = [], events = [], chi * @param diffType The diff type, default is DiffType.AUTO. * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM */ -function diffProperty(propertyName, diffFunction, reactionFunction) { +function diffProperty(propertyName, diffFunction = __WEBPACK_IMPORTED_MODULE_1__diff__["a" /* auto */], reactionFunction) { return Object(__WEBPACK_IMPORTED_MODULE_0__handleDecorator__["a" /* handleDecorator */])((target, propertyKey) => { target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null)); target.addDecorator('registeredDiffProperty', propertyName); @@ -3615,7 +3602,7 @@ function diffProperty(propertyName, diffFunction, reactionFunction) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -3641,21 +3628,21 @@ function handleDecorator(handler) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/inject.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = inject; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_WeakMap__ = __webpack_require__("./node_modules/@dojo/shim/WeakMap.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__handleDecorator__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__beforeProperties__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_WeakMap__ = __webpack_require__("./node_modules/@dojo/framework/shim/WeakMap.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__handleDecorator__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__beforeProperties__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs"); /** * Map of instances against registered injectors. */ -const registeredInjectorsMap = new __WEBPACK_IMPORTED_MODULE_0__dojo_shim_WeakMap__["a" /* default */](); +const registeredInjectorsMap = new __WEBPACK_IMPORTED_MODULE_0__shim_WeakMap__["a" /* default */](); /** * Decorator retrieves an injector from an available registry using the name and * calls the `getProperties` function with the payload from the injector @@ -3689,7 +3676,7 @@ function inject({ name, getProperties }) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/diff.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/diff.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -3698,7 +3685,7 @@ function inject({ name, getProperties }) { /* unused harmony export reference */ /* harmony export (immutable) */ __webpack_exports__["b"] = shallow; /* harmony export (immutable) */ __webpack_exports__["a"] = auto; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Registry__ = __webpack_require__("./node_modules/@dojo/widget-core/Registry.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Registry__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.mjs"); function isObjectOrArray(value) { return Object.prototype.toString.call(value) === '[object Object]' || Array.isArray(value); @@ -3768,7 +3755,7 @@ function auto(previousProperty, newProperty) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/mixins/Projector.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -3776,11 +3763,11 @@ function auto(previousProperty, newProperty) { /* unused harmony export AttachType */ /* harmony export (immutable) */ __webpack_exports__["a"] = ProjectorMixin; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_core_lang__ = __webpack_require__("./node_modules/@dojo/core/lang.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__animations_cssTransitions__ = __webpack_require__("./node_modules/@dojo/widget-core/animations/cssTransitions.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__decorators_afterRender__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/afterRender.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__d__ = __webpack_require__("./node_modules/@dojo/widget-core/d.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__vdom__ = __webpack_require__("./node_modules/@dojo/widget-core/vdom.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__core_lang__ = __webpack_require__("./node_modules/@dojo/framework/core/lang.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__animations_cssTransitions__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__decorators_afterRender__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__d__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__vdom__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/vdom.mjs"); @@ -3878,7 +3865,7 @@ function ProjectorMixin(Base) { this._projectorProperties.registry.destroy(); } } - this._projectorProperties = Object(__WEBPACK_IMPORTED_MODULE_1__dojo_core_lang__["a" /* assign */])({}, properties); + this._projectorProperties = Object(__WEBPACK_IMPORTED_MODULE_1__core_lang__["a" /* assign */])({}, properties); super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry }); super.__setProperties__(properties); } @@ -3929,10 +3916,7 @@ function ProjectorMixin(Base) { } } __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __decorate */]([ - Object(__WEBPACK_IMPORTED_MODULE_3__decorators_afterRender__["a" /* afterRender */])(), - __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __metadata */]("design:type", Function), - __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __metadata */]("design:paramtypes", [Object]), - __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __metadata */]("design:returntype", void 0) + Object(__WEBPACK_IMPORTED_MODULE_3__decorators_afterRender__["a" /* afterRender */])() ], Projector.prototype, "afterRender", null); return Projector; } @@ -3941,7 +3925,7 @@ function ProjectorMixin(Base) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/mixins/Themed.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -3949,11 +3933,11 @@ function ProjectorMixin(Base) { /* harmony export (immutable) */ __webpack_exports__["b"] = registerThemeInjector; /* harmony export (immutable) */ __webpack_exports__["a"] = ThemedMixin; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Injector__ = __webpack_require__("./node_modules/@dojo/widget-core/Injector.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__decorators_inject__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/inject.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__decorators_handleDecorator__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/diffProperty.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__diff__ = __webpack_require__("./node_modules/@dojo/widget-core/diff.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Injector__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/Injector.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__decorators_inject__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/inject.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__decorators_handleDecorator__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__diff__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/diff.mjs"); @@ -4066,7 +4050,7 @@ function ThemedMixin(Base) { const baseThemes = this.getDecorator('baseThemeClasses'); if (!this._registeredBaseTheme) { this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => { - const _a = THEME_KEY, key = baseTheme[_a], classes = __WEBPACK_IMPORTED_MODULE_0_tslib__["c" /* __rest */](baseTheme, [typeof _a === "symbol" ? _a : _a + ""]); + const _a = THEME_KEY, key = baseTheme[_a], classes = __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __rest */](baseTheme, [typeof _a === "symbol" ? _a : _a + ""]); this._registeredBaseThemeKeys.push(key); return Object.assign({}, finalBaseTheme, classes); }, {}); @@ -4080,10 +4064,7 @@ function ThemedMixin(Base) { }; __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __decorate */]([ Object(__WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__["a" /* diffProperty */])('theme', __WEBPACK_IMPORTED_MODULE_5__diff__["b" /* shallow */]), - Object(__WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__["a" /* diffProperty */])('extraClasses', __WEBPACK_IMPORTED_MODULE_5__diff__["b" /* shallow */]), - __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __metadata */]("design:type", Function), - __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __metadata */]("design:paramtypes", []), - __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __metadata */]("design:returntype", void 0) + Object(__WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__["a" /* diffProperty */])('extraClasses', __WEBPACK_IMPORTED_MODULE_5__diff__["b" /* shallow */]) ], Themed.prototype, "onPropertiesChanged", null); Themed = __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __decorate */]([ Object(__WEBPACK_IMPORTED_MODULE_2__decorators_inject__["a" /* inject */])({ @@ -4103,7 +4084,7 @@ function ThemedMixin(Base) { /***/ }), -/***/ "./node_modules/@dojo/widget-core/registerCustomElement.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -4113,13 +4094,13 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony export (immutable) */ __webpack_exports__["create"] = create; /* harmony export (immutable) */ __webpack_exports__["register"] = register; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__WidgetBase__ = __webpack_require__("./node_modules/@dojo/widget-core/WidgetBase.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mixins_Projector__ = __webpack_require__("./node_modules/@dojo/widget-core/mixins/Projector.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__dojo_shim_array__ = __webpack_require__("./node_modules/@dojo/shim/array.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__d__ = __webpack_require__("./node_modules/@dojo/widget-core/d.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__mixins_Themed__ = __webpack_require__("./node_modules/@dojo/widget-core/mixins/Themed.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__decorators_alwaysRender__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__WidgetBase__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/WidgetBase.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mixins_Projector__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__shim_array__ = __webpack_require__("./node_modules/@dojo/framework/shim/array.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__d__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__shim_global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__mixins_Themed__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__decorators_alwaysRender__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs"); @@ -4216,7 +4197,7 @@ function create(descriptor, WidgetConstructor) { }); Object.defineProperties(this, domProperties); const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children; - Object(__WEBPACK_IMPORTED_MODULE_3__dojo_shim_array__["a" /* from */])(children).forEach((childNode) => { + Object(__WEBPACK_IMPORTED_MODULE_3__shim_array__["a" /* from */])(children).forEach((childNode) => { if (childType === CustomElementChildType.DOJO) { childNode.addEventListener('dojo-ce-render', () => this._render()); childNode.addEventListener('dojo-ce-connected', () => this._render()); @@ -4236,7 +4217,7 @@ function create(descriptor, WidgetConstructor) { }; const registry = registryFactory(); const themeContext = Object(__WEBPACK_IMPORTED_MODULE_6__mixins_Themed__["b" /* registerThemeInjector */])(this._getTheme(), registry); - __WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */].addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme())); + __WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */].addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme())); const Projector = Object(__WEBPACK_IMPORTED_MODULE_2__mixins_Projector__["a" /* ProjectorMixin */])(Wrapper); this._projector = new Projector(); this._projector.setProperties({ registry }); @@ -4248,8 +4229,8 @@ function create(descriptor, WidgetConstructor) { })); } _getTheme() { - if (__WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */] && __WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */].dojoce && __WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */].dojoce.theme) { - return __WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */].dojoce.themes[__WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */].dojoce.theme]; + if (__WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */] && __WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */].dojoce && __WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */].dojoce.theme) { + return __WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */].dojoce.themes[__WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */].dojoce.theme]; } } _childConnected(e) { @@ -4329,25 +4310,25 @@ function register(WidgetConstructor) { if (!descriptor) { throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?'); } - __WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__["a" /* default */].customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor)); + __WEBPACK_IMPORTED_MODULE_5__shim_global__["a" /* default */].customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor)); } /* harmony default export */ __webpack_exports__["default"] = (register); //# sourceMappingURL=registerCustomElement.mjs.map /***/ }), -/***/ "./node_modules/@dojo/widget-core/vdom.mjs": +/***/ "./node_modules/@dojo/framework/widget-core/vdom.mjs": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export toParentVNode */ /* unused harmony export toTextVNode */ /* unused harmony export filterAndDecorateChildren */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dojo_shim_global__ = __webpack_require__("./node_modules/@dojo/shim/global.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_shim_array__ = __webpack_require__("./node_modules/@dojo/shim/array.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__d__ = __webpack_require__("./node_modules/@dojo/widget-core/d.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Registry__ = __webpack_require__("./node_modules/@dojo/widget-core/Registry.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__ = __webpack_require__("./node_modules/@dojo/shim/WeakMap.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__shim_global__ = __webpack_require__("./node_modules/@dojo/framework/shim/global.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__shim_array__ = __webpack_require__("./node_modules/@dojo/framework/shim/array.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__d__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Registry__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__ = __webpack_require__("./node_modules/@dojo/framework/shim/WeakMap.mjs"); @@ -4357,11 +4338,13 @@ const NAMESPACE_W3 = 'http://www.w3.org/'; const NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg'; const NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink'; const emptyArray = []; -const widgetInstanceMap = new __WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__["a" /* default */](); +const nodeOperations = ['focus', 'blur', 'scrollIntoView', 'click']; +const widgetInstanceMap = new __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__["a" /* default */](); /* harmony export (immutable) */ __webpack_exports__["b"] = widgetInstanceMap; -const instanceMap = new __WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__["a" /* default */](); -const projectorStateMap = new __WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__["a" /* default */](); +const instanceMap = new __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__["a" /* default */](); +const nextSiblingMap = new __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__["a" /* default */](); +const projectorStateMap = new __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__["a" /* default */](); function same(dnode1, dnode2) { if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["e" /* isVNode */])(dnode1) && Object(__WEBPACK_IMPORTED_MODULE_2__d__["e" /* isVNode */])(dnode2)) { if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["d" /* isDomVNode */])(dnode1) || Object(__WEBPACK_IMPORTED_MODULE_2__d__["d" /* isDomVNode */])(dnode2)) { @@ -4418,7 +4401,7 @@ function checkStyleValue(styleValue) { } function updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) { const projectorState = projectorStateMap.get(projectionOptions.projectorInstance); - const eventMap = projectorState.nodeMap.get(domNode) || new __WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__["a" /* default */](); + const eventMap = projectorState.nodeMap.get(domNode) || new __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__["a" /* default */](); if (previousValue) { const previousEvent = eventMap.get(previousValue); domNode.removeEventListener(eventName, previousEvent); @@ -4478,7 +4461,7 @@ function buildPreviousProperties(domNode, previous, current) { }, {}); return newProperties; } -function focusNode(propValue, previousValue, domNode, projectionOptions) { +function nodeOperation(propName, propValue, previousValue, domNode, projectionOptions) { let result; if (typeof propValue === 'function') { result = propValue(); @@ -4489,7 +4472,7 @@ function focusNode(propValue, previousValue, domNode, projectionOptions) { if (result === true) { const projectorState = projectorStateMap.get(projectionOptions.projectorInstance); projectorState.deferredRenderCallbacks.push(() => { - domNode.focus(); + domNode[propName](); }); } } @@ -4585,8 +4568,8 @@ function updateProperties(domNode, previousProperties, properties, projectionOpt } } } - else if (propName === 'focus') { - focusNode(propValue, previousValue, domNode, projectionOptions); + else if (nodeOperations.indexOf(propName) !== -1) { + nodeOperation(propName, propValue, previousValue, domNode, projectionOptions); } else if (propName === 'styles') { const styleNames = Object.keys(propValue); @@ -4740,7 +4723,8 @@ function nodeAdded(dnode, transitions) { } function nodeToRemove(dnode, transitions, projectionOptions) { if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["f" /* isWNode */])(dnode)) { - const rendered = dnode.rendered || emptyArray; + const item = instanceMap.get(dnode.instance); + const rendered = (item ? item.dnode.rendered : dnode.rendered) || emptyArray; if (dnode.instance) { const instanceData = widgetInstanceMap.get(dnode.instance); instanceData.onDetach(); @@ -4804,7 +4788,7 @@ function checkDistinguishable(childNodes, indexToCheck, parentInstance) { } } } -function updateChildren(parentVNode, oldChildren, newChildren, parentInstance, projectionOptions) { +function updateChildren(parentVNode, siblings, oldChildren, newChildren, parentInstance, projectionOptions) { oldChildren = oldChildren || emptyArray; newChildren = newChildren; const oldChildrenLength = oldChildren.length; @@ -4824,38 +4808,49 @@ function updateChildren(parentVNode, oldChildren, newChildren, parentInstance, p addDeferredProperties(newChild, projectionOptions); } if (oldChild !== undefined && same(oldChild, newChild)) { - textUpdated = updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance) || textUpdated; oldIndex++; newIndex++; + textUpdated = + updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance, oldChildren.slice(oldIndex), newChildren.slice(newIndex)) || textUpdated; continue; } const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1); const addChild = () => { let insertBeforeDomNode = undefined; + let childrenArray = oldChildren; + let nextIndex = oldIndex + 1; let child = oldChildren[oldIndex]; + if (!child) { + child = siblings[0]; + nextIndex = 1; + childrenArray = siblings; + } if (child) { - let nextIndex = oldIndex + 1; let insertBeforeChildren = [child]; while (insertBeforeChildren.length) { const insertBefore = insertBeforeChildren.shift(); if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["f" /* isWNode */])(insertBefore)) { - if (insertBefore.rendered) { - insertBeforeChildren.push(...insertBefore.rendered); + const item = instanceMap.get(insertBefore.instance); + if (item && item.dnode.rendered) { + insertBeforeChildren.push(...item.dnode.rendered); } } else { if (insertBefore.domNode) { + if (insertBefore.domNode.parentElement !== parentVNode.domNode) { + break; + } insertBeforeDomNode = insertBefore.domNode; break; } } - if (insertBeforeChildren.length === 0 && oldChildren[nextIndex]) { - insertBeforeChildren.push(oldChildren[nextIndex]); + if (insertBeforeChildren.length === 0 && childrenArray[nextIndex]) { + insertBeforeChildren.push(childrenArray[nextIndex]); nextIndex++; } } } - createDom(newChild, parentVNode, insertBeforeDomNode, projectionOptions, parentInstance); + createDom(newChild, parentVNode, newChildren.slice(newIndex + 1), insertBeforeDomNode, projectionOptions, parentInstance); nodeAdded(newChild, transitions); const indexToCheck = newIndex; projectorState.afterRenderCallbacks.push(() => { @@ -4916,12 +4911,13 @@ function addChildren(parentVNode, children, projectionOptions, parentInstance, i } const projectorState = projectorStateMap.get(projectionOptions.projectorInstance); if (projectorState.merge && childNodes === undefined) { - childNodes = Object(__WEBPACK_IMPORTED_MODULE_1__dojo_shim_array__["a" /* from */])(parentVNode.domNode.childNodes); + childNodes = Object(__WEBPACK_IMPORTED_MODULE_1__shim_array__["a" /* from */])(parentVNode.domNode.childNodes); } const transitions = projectionOptions.transitions; projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 }); for (let i = 0; i < children.length; i++) { const child = children[i]; + const nextSiblings = children.slice(i + 1); if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["e" /* isVNode */])(child)) { if (projectorState.merge && childNodes) { let domElement = undefined; @@ -4932,10 +4928,10 @@ function addChildren(parentVNode, children, projectionOptions, parentInstance, i } } } - createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance); + createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance); } else { - createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes); + createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes); } nodeAdded(child, transitions); } @@ -4963,7 +4959,7 @@ function initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOpt } dnode.inserted = true; } -function createDom(dnode, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes) { +function createDom(dnode, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes) { let domNode; const projectorState = projectorStateMap.get(projectionOptions.projectorInstance); if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["f" /* isWNode */])(dnode)) { @@ -4978,6 +4974,7 @@ function createDom(dnode, parentVNode, insertBefore, projectionOptions, parentIn } const instance = new widgetConstructor(); dnode.instance = instance; + nextSiblingMap.set(instance, nextSiblings); const instanceData = widgetInstanceMap.get(instance); instanceData.invalidate = () => { instanceData.dirty = true; @@ -5058,7 +5055,7 @@ function createDom(dnode, parentVNode, insertBefore, projectionOptions, parentIn } } } -function updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance) { +function updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance, oldNextSiblings, nextSiblings) { if (Object(__WEBPACK_IMPORTED_MODULE_2__d__["f" /* isWNode */])(dnode)) { const { instance } = previous; const { parentVNode, dnode: node } = instanceMap.get(instance); @@ -5068,12 +5065,13 @@ function updateDom(previous, dnode, projectionOptions, parentVNode, parentInstan instance.__setCoreProperties__(dnode.coreProperties); instance.__setChildren__(dnode.children); instance.__setProperties__(dnode.properties); + nextSiblingMap.set(instance, nextSiblings); dnode.instance = instance; if (instanceData.dirty === true) { const rendered = instance.__render__(); instanceData.rendering = false; dnode.rendered = filterAndDecorateChildren(rendered, instance); - updateChildren(parentVNode, previousRendered, dnode.rendered, instance, projectionOptions); + updateChildren(parentVNode, oldNextSiblings, previousRendered, dnode.rendered, instance, projectionOptions); } else { instanceData.rendering = false; @@ -5106,7 +5104,7 @@ function updateDom(previous, dnode, projectionOptions, parentVNode, parentInstan const children = filterAndDecorateChildren(dnode.children, parentInstance); dnode.children = children; updated = - updateChildren(dnode, previous.children, children, parentInstance, projectionOptions) || updated; + updateChildren(dnode, oldNextSiblings, previous.children, children, parentInstance, projectionOptions) || updated; } const previousProperties = buildPreviousProperties(domNode, previous, dnode); if (dnode.attributes && dnode.events) { @@ -5156,7 +5154,7 @@ function runDeferredRenderCallbacks(projectionOptions) { } } else { - __WEBPACK_IMPORTED_MODULE_0__dojo_shim_global__["a" /* default */].requestAnimationFrame(() => { + __WEBPACK_IMPORTED_MODULE_0__shim_global__["a" /* default */].requestAnimationFrame(() => { while (projectorState.deferredRenderCallbacks.length) { const callback = projectorState.deferredRenderCallbacks.shift(); callback && callback(); @@ -5174,8 +5172,8 @@ function runAfterRenderCallbacks(projectionOptions) { } } else { - if (__WEBPACK_IMPORTED_MODULE_0__dojo_shim_global__["a" /* default */].requestIdleCallback) { - __WEBPACK_IMPORTED_MODULE_0__dojo_shim_global__["a" /* default */].requestIdleCallback(() => { + if (__WEBPACK_IMPORTED_MODULE_0__shim_global__["a" /* default */].requestIdleCallback) { + __WEBPACK_IMPORTED_MODULE_0__shim_global__["a" /* default */].requestIdleCallback(() => { while (projectorState.afterRenderCallbacks.length) { const callback = projectorState.afterRenderCallbacks.shift(); callback && callback(); @@ -5198,7 +5196,7 @@ function scheduleRender(projectionOptions) { render(projectionOptions); } else if (projectorState.renderScheduled === undefined) { - projectorState.renderScheduled = __WEBPACK_IMPORTED_MODULE_0__dojo_shim_global__["a" /* default */].requestAnimationFrame(() => { + projectorState.renderScheduled = __WEBPACK_IMPORTED_MODULE_0__shim_global__["a" /* default */].requestAnimationFrame(() => { render(projectionOptions); }); } @@ -5217,7 +5215,8 @@ function render(projectionOptions) { previouslyRendered.push(instance); const { parentVNode, dnode } = instanceMap.get(instance); const instanceData = widgetInstanceMap.get(instance); - updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance); + const nextSiblings = nextSiblingMap.get(instance); + updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance, nextSiblings, nextSiblings); } } runAfterRenderCallbacks(projectionOptions); @@ -5230,7 +5229,7 @@ const dom = { const projectorState = { afterRenderCallbacks: [], deferredRenderCallbacks: [], - nodeMap: new __WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__["a" /* default */](), + nodeMap: new __WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__["a" /* default */](), renderScheduled: undefined, renderQueue: [], merge: projectionOptions.merge || false, @@ -5248,7 +5247,7 @@ const dom = { scheduleRender(finalProjectorOptions); } }; - updateDom(node, node, finalProjectorOptions, parentVNode, instance); + updateDom(node, node, finalProjectorOptions, parentVNode, instance, [], []); projectorState.afterRenderCallbacks.push(() => { instanceData.onAttach(); }); @@ -5282,7 +5281,7 @@ const dom = { /*** IMPORTS FROM imports-loader ***/ var widgetFactory = __webpack_require__("./src/menu/Menu.ts"); -var registerCustomElement = __webpack_require__("./node_modules/@dojo/widget-core/registerCustomElement.mjs").default; +var registerCustomElement = __webpack_require__("./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs").default; var defaultExport = widgetFactory.default; defaultExport && registerCustomElement(defaultExport); @@ -5488,10 +5487,10 @@ process.umask = function() { return 0; }; "use strict"; /* unused harmony export __extends */ /* unused harmony export __assign */ -/* harmony export (immutable) */ __webpack_exports__["c"] = __rest; +/* harmony export (immutable) */ __webpack_exports__["b"] = __rest; /* harmony export (immutable) */ __webpack_exports__["a"] = __decorate; /* unused harmony export __param */ -/* harmony export (immutable) */ __webpack_exports__["b"] = __metadata; +/* unused harmony export __metadata */ /* unused harmony export __awaiter */ /* unused harmony export __generator */ /* unused harmony export __exportStar */ @@ -5708,10 +5707,10 @@ module.exports = g; Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Menu", function() { return Menu; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_widget_core_d__ = __webpack_require__("./node_modules/@dojo/widget-core/d.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__dojo_widget_core_decorators_customElement__ = __webpack_require__("./node_modules/@dojo/widget-core/decorators/customElement.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__dojo_widget_core_mixins_Themed__ = __webpack_require__("./node_modules/@dojo/widget-core/mixins/Themed.mjs"); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__dojo_widget_core_WidgetBase__ = __webpack_require__("./node_modules/@dojo/widget-core/WidgetBase.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dojo_framework_widget_core_d__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__dojo_framework_widget_core_decorators_customElement__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__dojo_framework_widget_core_mixins_Themed__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs"); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__dojo_framework_widget_core_WidgetBase__ = __webpack_require__("./node_modules/@dojo/framework/widget-core/WidgetBase.mjs"); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__menu_m_css__ = __webpack_require__("./src/menu/menu.m.css"); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__menu_m_css___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5__menu_m_css__); @@ -5720,7 +5719,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); -let Menu = class Menu extends Object(__WEBPACK_IMPORTED_MODULE_3__dojo_widget_core_mixins_Themed__["a" /* ThemedMixin */])(__WEBPACK_IMPORTED_MODULE_4__dojo_widget_core_WidgetBase__["a" /* WidgetBase */]) { +let Menu = class Menu extends Object(__WEBPACK_IMPORTED_MODULE_3__dojo_framework_widget_core_mixins_Themed__["a" /* ThemedMixin */])(__WEBPACK_IMPORTED_MODULE_4__dojo_framework_widget_core_WidgetBase__["a" /* WidgetBase */]) { _onSelected(id, data) { this._selectedId = id; this.properties.onSelected(data); @@ -5741,19 +5740,19 @@ let Menu = class Menu extends Object(__WEBPACK_IMPORTED_MODULE_3__dojo_widget_co } return child; }); - return Object(__WEBPACK_IMPORTED_MODULE_1__dojo_widget_core_d__["g" /* v */])('nav', { classes: this.theme(__WEBPACK_IMPORTED_MODULE_5__menu_m_css__["root"]) }, [ - Object(__WEBPACK_IMPORTED_MODULE_1__dojo_widget_core_d__["g" /* v */])('ol', { + return Object(__WEBPACK_IMPORTED_MODULE_1__dojo_framework_widget_core_d__["g" /* v */])('nav', { classes: this.theme(__WEBPACK_IMPORTED_MODULE_5__menu_m_css__["root"]) }, [ + Object(__WEBPACK_IMPORTED_MODULE_1__dojo_framework_widget_core_d__["g" /* v */])('ol', { classes: this.theme(__WEBPACK_IMPORTED_MODULE_5__menu_m_css__["menuContainer"]) }, items) ]); } }; Menu = __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __decorate */]([ - Object(__WEBPACK_IMPORTED_MODULE_2__dojo_widget_core_decorators_customElement__["a" /* customElement */])({ + Object(__WEBPACK_IMPORTED_MODULE_2__dojo_framework_widget_core_decorators_customElement__["a" /* customElement */])({ tag: 'demo-menu', events: ['onSelected'] }), - Object(__WEBPACK_IMPORTED_MODULE_3__dojo_widget_core_mixins_Themed__["c" /* theme */])(__WEBPACK_IMPORTED_MODULE_5__menu_m_css__) + Object(__WEBPACK_IMPORTED_MODULE_3__dojo_framework_widget_core_mixins_Themed__["c" /* theme */])(__WEBPACK_IMPORTED_MODULE_5__menu_m_css__) ], Menu); /* harmony default export */ __webpack_exports__["default"] = (Menu); @@ -5778,4 +5777,4 @@ module.exports = __webpack_require__("./node_modules/imports-loader/index.js?wid /***/ }) /******/ }));; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgY2EzYzE4N2FlYjBkOTcyZDNhZmQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2NvcmUvRGVzdHJveWFibGUubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9jb3JlL0V2ZW50ZWQubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9jb3JlL2xhbmcubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9oYXMvaGFzLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9NYXAubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL1Byb21pc2UubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL1N5bWJvbC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vV2Vha01hcC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vYXJyYXkubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL2dsb2JhbC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vaXRlcmF0b3IubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL251bWJlci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vb2JqZWN0Lm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdHJpbmcubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL3N1cHBvcnQvaGFzLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdXBwb3J0L3F1ZXVlLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdXBwb3J0L3V0aWwubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9JbmplY3Rvci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL05vZGVIYW5kbGVyLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvUmVnaXN0cnkubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9SZWdpc3RyeUhhbmRsZXIubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9XaWRnZXRCYXNlLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvYW5pbWF0aW9ucy9jc3NUcmFuc2l0aW9ucy5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2QubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2FmdGVyUmVuZGVyLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9hbHdheXNSZW5kZXIubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2JlZm9yZVByb3BlcnRpZXMubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2N1c3RvbUVsZW1lbnQubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2RpZmZQcm9wZXJ0eS5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaGFuZGxlRGVjb3JhdG9yLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9pbmplY3QubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kaWZmLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvbWl4aW5zL1Byb2plY3Rvci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL21peGlucy9UaGVtZWQubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9yZWdpc3RlckN1c3RvbUVsZW1lbnQubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS92ZG9tLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vY2xpLWJ1aWxkLXdpZGdldC90ZW1wbGF0ZS9jdXN0b20tZWxlbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbWVudS9NZW51LnRzIiwid2VicGFjazovLy8uL3NyYy9tZW51L21lbnUubS5jc3M/ZWMxMSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUFzRCwrREFBK0Q7O0FBRXJIO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7QUM3RGdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEIsaUJBQWlCLE9BQU87QUFDeEI7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvQkFBb0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQSx3Qzs7Ozs7Ozs7Ozs7QUN2REE7QUFDc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsZ0NBQWdDO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2RWlCO0FBQ0E7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiwyQkFBMkI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLG9CQUFvQjtBQUMzQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsaUM7Ozs7Ozs7Ozs7OztBQ25NQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLE9BQU8saUJBQWlCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxRQUFRO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRUFBMkUsUUFBUTtBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxnQzs7Ozs7Ozs7Ozs7Ozs7O0FDbk1vQztBQUNwQztBQUN5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLHFCQUFxQjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxZQUFZO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFELFlBQVk7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0M7Ozs7Ozs7Ozs7Ozs7QUMvRkE7QUFDeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsTUFBTTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MsV0FBVztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsTUFBTTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QixxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7Ozs7O0FDdE1BO0FBQ0E7QUFDNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsSUFBSTtBQUNwQixnQkFBZ0IsT0FBTztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxJQUFJO0FBQ2hCLFlBQVksVUFBVTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxtQzs7Ozs7Ozs7Ozs7OztBQ2hKQTtBQUNzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxxQkFBcUI7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGdDQUFnQztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlHQTtBQUNrQztBQUNQO0FBQzNCO0FBQ3FCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3RELG9EQUFvRDtBQUNwRCxpREFBaUQ7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRUFBcUU7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsc0JBQXNCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFlBQVk7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLFNBQVM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0M7Ozs7Ozs7O0FDdlBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG1DOzs7Ozs7Ozs7Ozs7Ozs7QUNqQkE7QUFDaUQ7QUFDakQsb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDOzs7Ozs7Ozs7Ozs7O0FDOUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyREE7QUFDQTtBQUNtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0Q7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLElBQUk7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlHQTtBQUNBO0FBQ3FCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELFlBQVk7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RkFBd0Y7QUFDeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DOzs7Ozs7Ozs7OztBQ3hTbUI7QUFDbkI7MEVBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsRUFBRTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCxFQUFFO0FBQ2pFLG1DQUFtQyxtQkFBbUI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxnQzs7Ozs7Ozs7Ozs7QUNyS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFBQTtBQUFBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4RUFBOEU7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFBQTtBQUFBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsYUFBYSxrQkFBa0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Qzs7Ozs7Ozs7QUNyWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZELGNBQWM7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSw4REFBOEQsZUFBZTtBQUM3RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixxQkFBcUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSxpQkFBaUIsS0FBSztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHFCQUFxQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixxQkFBcUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsMkJBQTJCO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQSxXQUFXLE1BQU07QUFDakI7QUFDQSx1QkFBdUIsdUJBQXVCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsV0FBVyxrTEFBa0wsZUFBZTtBQUMxUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxzQkFBc0IscUNBQXFDO0FBQ25HO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsdUJBQXVCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0Msc0JBQXNCLHFDQUFxQztBQUNuRyxtQkFBbUIscUJBQXFCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDLG9DQUFvQztBQUNwQyx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0EsaURBQWlELHFCQUFxQjtBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsb0JBQW9CO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsMkNBQTJDO0FBQzVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMscUJBQXFCO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RCxzQkFBc0IsMkJBQTJCO0FBQ3pHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFdBQVc7QUFDMUIsZUFBZSwyQkFBMkI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxxQkFBcUI7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRCxzQkFBc0IsMkJBQTJCO0FBQ3JHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQscUJBQXFCO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFdBQVc7QUFDMUI7QUFDQTtBQUNBLG1CQUFtQixxQkFBcUI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtFQUFrRTtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsMkJBQTJCO0FBQzlEO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCwrQ0FBK0M7QUFDaEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTCw4REFBOEQ7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQSxpQzs7Ozs7OztBQ3g1QkE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7QUNOQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQy9CLENBQUM7aUJBQ0QsQ0FBQztnQkFDRixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7b0JBQ3BDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsS0FBSyxLQUFLLElBQUksQ0FBQyxXQUFXLENBQUM7Z0JBQ2xELENBQUM7Z0JBQ0QsS0FBSyxDQUFDLFVBQVUscUJBQVEsS0FBSyxDQUFDLFVBQVUsRUFBSyxVQUFVLENBQUUsQ0FBQztZQUMzRCxDQUFDO1lBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLHNFQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsaURBQVEsQ0FBQyxFQUFFLEVBQUU7WUFDbEQsc0VBQUMsQ0FDQSxJQUFJLEVBQ0o7Z0JBQ0MsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsMERBQWlCLENBQUM7YUFDdEMsRUFDRCxLQUFLLENBQ0w7U0FDRCxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0Q7QUFuQ1ksSUFBSTtJQUxoQix5R0FBYSxDQUFpQjtRQUM5QixHQUFHLEVBQUUsV0FBVztRQUNoQixNQUFNLEVBQUUsQ0FBQyxZQUFZLENBQUM7S0FDdEIsQ0FBQztJQUNELHNGQUFLLENBQUMseUNBQUcsQ0FBQztHQUNFLElBQUksQ0FtQ2hCO0FBbkNnQjtBQXFDakIsK0RBQWUsSUFBSSxFQUFDOzs7Ozs7OztBQ3ZEcEI7QUFDQSxrQkFBa0IscUciLCJmaWxlIjoibWVudS0xLjAuMC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIGNhM2MxODdhZWIwZDk3MmQzYWZkIiwiaW1wb3J0IHsgY3JlYXRlQ29tcG9zaXRlSGFuZGxlIH0gZnJvbSAnLi9sYW5nJztcbmltcG9ydCBQcm9taXNlIGZyb20gJ0Bkb2pvL3NoaW0vUHJvbWlzZSc7XG4vKipcbiAqIE5vIG9wZXJhdGlvbiBmdW5jdGlvbiB0byByZXBsYWNlIG93biBvbmNlIGluc3RhbmNlIGlzIGRlc3RvcnllZFxuICovXG5mdW5jdGlvbiBub29wKCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xufVxuLyoqXG4gKiBObyBvcCBmdW5jdGlvbiB1c2VkIHRvIHJlcGxhY2Ugb3duLCBvbmNlIGluc3RhbmNlIGhhcyBiZWVuIGRlc3RvcnllZFxuICovXG5mdW5jdGlvbiBkZXN0cm95ZWQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsIG1hZGUgdG8gZGVzdHJveWVkIG1ldGhvZCcpO1xufVxuZXhwb3J0IGNsYXNzIERlc3Ryb3lhYmxlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVzID0gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGhhbmRsZXMgZm9yIHRoZSBpbnN0YW5jZSB0aGF0IHdpbGwgYmUgZGVzdHJveWVkIHdoZW4gYHRoaXMuZGVzdHJveWAgaXMgY2FsbGVkXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hhbmRsZX0gaGFuZGxlIFRoZSBoYW5kbGUgdG8gYWRkIGZvciB0aGUgaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7SGFuZGxlfSBhIGhhbmRsZSBmb3IgdGhlIGhhbmRsZSwgcmVtb3ZlcyB0aGUgaGFuZGxlIGZvciB0aGUgaW5zdGFuY2UgYW5kIGNhbGxzIGRlc3Ryb3lcbiAgICAgKi9cbiAgICBvd24oaGFuZGxlcykge1xuICAgICAgICBjb25zdCBoYW5kbGUgPSBBcnJheS5pc0FycmF5KGhhbmRsZXMpID8gY3JlYXRlQ29tcG9zaXRlSGFuZGxlKC4uLmhhbmRsZXMpIDogaGFuZGxlcztcbiAgICAgICAgY29uc3QgeyBoYW5kbGVzOiBfaGFuZGxlcyB9ID0gdGhpcztcbiAgICAgICAgX2hhbmRsZXMucHVzaChoYW5kbGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgICAgICAgICBfaGFuZGxlcy5zcGxpY2UoX2hhbmRsZXMuaW5kZXhPZihoYW5kbGUpKTtcbiAgICAgICAgICAgICAgICBoYW5kbGUuZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZXN0cnB5cyBhbGwgaGFuZGVycyByZWdpc3RlcmVkIGZvciB0aGUgaW5zdGFuY2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPGFueX0gYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSBhbGwgaGFuZGxlcyBoYXZlIGJlZW4gZGVzdHJveWVkXG4gICAgICovXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZXMuZm9yRWFjaCgoaGFuZGxlKSA9PiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlICYmIGhhbmRsZS5kZXN0cm95ICYmIGhhbmRsZS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveSA9IG5vb3A7XG4gICAgICAgICAgICB0aGlzLm93biA9IGRlc3Ryb3llZDtcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IERlc3Ryb3lhYmxlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVzdHJveWFibGUubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2NvcmUvRGVzdHJveWFibGUubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9jb3JlL0Rlc3Ryb3lhYmxlLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgTWFwIGZyb20gJ0Bkb2pvL3NoaW0vTWFwJztcclxuaW1wb3J0IHsgRGVzdHJveWFibGUgfSBmcm9tICcuL0Rlc3Ryb3lhYmxlJztcclxuLyoqXHJcbiAqIE1hcCBvZiBjb21wdXRlZCByZWd1bGFyIGV4cHJlc3Npb25zLCBrZXllZCBieSBzdHJpbmdcclxuICovXHJcbmNvbnN0IHJlZ2V4TWFwID0gbmV3IE1hcCgpO1xyXG4vKipcclxuICogRGV0ZXJtaW5lcyBpcyB0aGUgZXZlbnQgdHlwZSBnbG9iIGhhcyBiZWVuIG1hdGNoZWRcclxuICpcclxuICogQHJldHVybnMgYm9vbGVhbiB0aGF0IGluZGljYXRlcyBpZiB0aGUgZ2xvYiBpcyBtYXRjaGVkXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNHbG9iTWF0Y2goZ2xvYlN0cmluZywgdGFyZ2V0U3RyaW5nKSB7XHJcbiAgICBpZiAodHlwZW9mIHRhcmdldFN0cmluZyA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIGdsb2JTdHJpbmcgPT09ICdzdHJpbmcnICYmIGdsb2JTdHJpbmcuaW5kZXhPZignKicpICE9PSAtMSkge1xyXG4gICAgICAgIGxldCByZWdleDtcclxuICAgICAgICBpZiAocmVnZXhNYXAuaGFzKGdsb2JTdHJpbmcpKSB7XHJcbiAgICAgICAgICAgIHJlZ2V4ID0gcmVnZXhNYXAuZ2V0KGdsb2JTdHJpbmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmVnZXggPSBuZXcgUmVnRXhwKGBeJHtnbG9iU3RyaW5nLnJlcGxhY2UoL1xcKi9nLCAnLionKX0kYCk7XHJcbiAgICAgICAgICAgIHJlZ2V4TWFwLnNldChnbG9iU3RyaW5nLCByZWdleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZWdleC50ZXN0KHRhcmdldFN0cmluZyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gZ2xvYlN0cmluZyA9PT0gdGFyZ2V0U3RyaW5nO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBFdmVudCBDbGFzc1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEV2ZW50ZWQgZXh0ZW5kcyBEZXN0cm95YWJsZSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIG1hcCBvZiBsaXN0ZW5lcnMga2V5ZWQgYnkgZXZlbnQgdHlwZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubGlzdGVuZXJzTWFwID0gbmV3IE1hcCgpO1xyXG4gICAgfVxyXG4gICAgZW1pdChldmVudCkge1xyXG4gICAgICAgIHRoaXMubGlzdGVuZXJzTWFwLmZvckVhY2goKG1ldGhvZHMsIHR5cGUpID0+IHtcclxuICAgICAgICAgICAgaWYgKGlzR2xvYk1hdGNoKHR5cGUsIGV2ZW50LnR5cGUpKSB7XHJcbiAgICAgICAgICAgICAgICBtZXRob2RzLmZvckVhY2goKG1ldGhvZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZC5jYWxsKHRoaXMsIGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBvbih0eXBlLCBsaXN0ZW5lcikge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxpc3RlbmVyKSkge1xyXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVzID0gbGlzdGVuZXIubWFwKChsaXN0ZW5lcikgPT4gdGhpcy5fYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpKTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcy5mb3JFYWNoKChoYW5kbGUpID0+IGhhbmRsZS5kZXN0cm95KCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpO1xyXG4gICAgfVxyXG4gICAgX2FkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XHJcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnNNYXAuZ2V0KHR5cGUpIHx8IFtdO1xyXG4gICAgICAgIGxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcclxuICAgICAgICB0aGlzLmxpc3RlbmVyc01hcC5zZXQodHlwZSwgbGlzdGVuZXJzKTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBkZXN0cm95OiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyc01hcC5nZXQodHlwZSkgfHwgW107XHJcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKSwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydCBkZWZhdWx0IEV2ZW50ZWQ7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV2ZW50ZWQubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2NvcmUvRXZlbnRlZC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2NvcmUvRXZlbnRlZC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IHsgYXNzaWduIH0gZnJvbSAnQGRvam8vc2hpbS9vYmplY3QnO1xuZXhwb3J0IHsgYXNzaWduIH0gZnJvbSAnQGRvam8vc2hpbS9vYmplY3QnO1xuY29uc3Qgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5jb25zdCBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG4vKipcbiAqIFR5cGUgZ3VhcmQgdGhhdCBlbnN1cmVzIHRoYXQgdGhlIHZhbHVlIGNhbiBiZSBjb2VyY2VkIHRvIE9iamVjdFxuICogdG8gd2VlZCBvdXQgaG9zdCBvYmplY3RzIHRoYXQgZG8gbm90IGRlcml2ZSBmcm9tIE9iamVjdC5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjaGVjayBpZiB3ZSB3YW50IHRvIGRlZXAgY29weSBhbiBvYmplY3Qgb3Igbm90LlxuICogTm90ZTogSW4gRVM2IGl0IGlzIHBvc3NpYmxlIHRvIG1vZGlmeSBhbiBvYmplY3QncyBTeW1ib2wudG9TdHJpbmdUYWcgcHJvcGVydHksIHdoaWNoIHdpbGxcbiAqIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgYHRvU3RyaW5nYC4gVGhpcyBpcyBhIHJhcmUgZWRnZSBjYXNlIHRoYXQgaXMgZGlmZmljdWx0IHRvIGhhbmRsZSxcbiAqIHNvIGl0IGlzIG5vdCBoYW5kbGVkIGhlcmUuXG4gKiBAcGFyYW0gIHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybiAgICAgICBJZiB0aGUgdmFsdWUgaXMgY29lcmNpYmxlIGludG8gYW4gT2JqZWN0XG4gKi9cbmZ1bmN0aW9uIHNob3VsZERlZXBDb3B5T2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xufVxuZnVuY3Rpb24gY29weUFycmF5KGFycmF5LCBpbmhlcml0ZWQpIHtcbiAgICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gY29weUFycmF5KGl0ZW0sIGluaGVyaXRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFzaG91bGREZWVwQ29weU9iamVjdChpdGVtKVxuICAgICAgICAgICAgPyBpdGVtXG4gICAgICAgICAgICA6IF9taXhpbih7XG4gICAgICAgICAgICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpbmhlcml0ZWQ6IGluaGVyaXRlZCxcbiAgICAgICAgICAgICAgICBzb3VyY2VzOiBbaXRlbV0sXG4gICAgICAgICAgICAgICAgdGFyZ2V0OiB7fVxuICAgICAgICAgICAgfSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBfbWl4aW4oa3dBcmdzKSB7XG4gICAgY29uc3QgZGVlcCA9IGt3QXJncy5kZWVwO1xuICAgIGNvbnN0IGluaGVyaXRlZCA9IGt3QXJncy5pbmhlcml0ZWQ7XG4gICAgY29uc3QgdGFyZ2V0ID0ga3dBcmdzLnRhcmdldDtcbiAgICBjb25zdCBjb3BpZWQgPSBrd0FyZ3MuY29waWVkIHx8IFtdO1xuICAgIGNvbnN0IGNvcGllZENsb25lID0gWy4uLmNvcGllZF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrd0FyZ3Muc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBrd0FyZ3Muc291cmNlc1tpXTtcbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gbnVsbCB8fCBzb3VyY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgICAgICAgIGlmIChjb3BpZWRDbG9uZS5pbmRleE9mKHZhbHVlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkZWVwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb3B5QXJyYXkodmFsdWUsIGluaGVyaXRlZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2hvdWxkRGVlcENvcHlPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRWYWx1ZSA9IHRhcmdldFtrZXldIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkLnB1c2goc291cmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gX21peGluKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRlZDogaW5oZXJpdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM6IFt2YWx1ZV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUocHJvdG90eXBlLCAuLi5taXhpbnMpIHtcbiAgICBpZiAoIW1peGlucy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2xhbmcuY3JlYXRlIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBtaXhpbiBvYmplY3QuJyk7XG4gICAgfVxuICAgIGNvbnN0IGFyZ3MgPSBtaXhpbnMuc2xpY2UoKTtcbiAgICBhcmdzLnVuc2hpZnQoT2JqZWN0LmNyZWF0ZShwcm90b3R5cGUpKTtcbiAgICByZXR1cm4gYXNzaWduLmFwcGx5KG51bGwsIGFyZ3MpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBBc3NpZ24odGFyZ2V0LCAuLi5zb3VyY2VzKSB7XG4gICAgcmV0dXJuIF9taXhpbih7XG4gICAgICAgIGRlZXA6IHRydWUsXG4gICAgICAgIGluaGVyaXRlZDogZmFsc2UsXG4gICAgICAgIHNvdXJjZXM6IHNvdXJjZXMsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVlcE1peGluKHRhcmdldCwgLi4uc291cmNlcykge1xuICAgIHJldHVybiBfbWl4aW4oe1xuICAgICAgICBkZWVwOiB0cnVlLFxuICAgICAgICBpbmhlcml0ZWQ6IHRydWUsXG4gICAgICAgIHNvdXJjZXM6IHNvdXJjZXMsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0XG4gICAgfSk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHVzaW5nIHRoZSBwcm92aWRlZCBzb3VyY2UncyBwcm90b3R5cGUgYXMgdGhlIHByb3RvdHlwZSBmb3IgdGhlIG5ldyBvYmplY3QsIGFuZCB0aGVuXG4gKiBkZWVwIGNvcGllcyB0aGUgcHJvdmlkZWQgc291cmNlJ3MgdmFsdWVzIGludG8gdGhlIG5ldyB0YXJnZXQuXG4gKlxuICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IHRvIGR1cGxpY2F0ZVxuICogQHJldHVybiBUaGUgbmV3IG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZHVwbGljYXRlKHNvdXJjZSkge1xuICAgIGNvbnN0IHRhcmdldCA9IE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHNvdXJjZSkpO1xuICAgIHJldHVybiBkZWVwTWl4aW4odGFyZ2V0LCBzb3VyY2UpO1xufVxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdHdvIHZhbHVlcyBhcmUgdGhlIHNhbWUgdmFsdWUuXG4gKlxuICogQHBhcmFtIGEgRmlyc3QgdmFsdWUgdG8gY29tcGFyZVxuICogQHBhcmFtIGIgU2Vjb25kIHZhbHVlIHRvIGNvbXBhcmVcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWVzIGFyZSB0aGUgc2FtZTsgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0lkZW50aWNhbChhLCBiKSB7XG4gICAgcmV0dXJuIChhID09PSBiIHx8XG4gICAgICAgIC8qIGJvdGggdmFsdWVzIGFyZSBOYU4gKi9cbiAgICAgICAgKGEgIT09IGEgJiYgYiAhPT0gYikpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBiaW5kcyBhIG1ldGhvZCB0byB0aGUgc3BlY2lmaWVkIG9iamVjdCBhdCBydW50aW1lLiBUaGlzIGlzIHNpbWlsYXIgdG9cbiAqIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAsIGJ1dCBpbnN0ZWFkIG9mIGEgZnVuY3Rpb24gaXQgdGFrZXMgdGhlIG5hbWUgb2YgYSBtZXRob2Qgb24gYW4gb2JqZWN0LlxuICogQXMgYSByZXN1bHQsIHRoZSBmdW5jdGlvbiByZXR1cm5lZCBieSBgbGF0ZUJpbmRgIHdpbGwgYWx3YXlzIGNhbGwgdGhlIGZ1bmN0aW9uIGN1cnJlbnRseSBhc3NpZ25lZCB0b1xuICogdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBvbiB0aGUgb2JqZWN0IGFzIG9mIHRoZSBtb21lbnQgdGhlIGZ1bmN0aW9uIGl0IHJldHVybnMgaXMgY2FsbGVkLlxuICpcbiAqIEBwYXJhbSBpbnN0YW5jZSBUaGUgY29udGV4dCBvYmplY3RcbiAqIEBwYXJhbSBtZXRob2QgVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBvbiB0aGUgY29udGV4dCBvYmplY3QgdG8gYmluZCB0byBpdHNlbGZcbiAqIEBwYXJhbSBzdXBwbGllZEFyZ3MgQW4gb3B0aW9uYWwgYXJyYXkgb2YgdmFsdWVzIHRvIHByZXBlbmQgdG8gdGhlIGBpbnN0YW5jZVttZXRob2RdYCBhcmd1bWVudHMgbGlzdFxuICogQHJldHVybiBUaGUgYm91bmQgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhdGVCaW5kKGluc3RhbmNlLCBtZXRob2QsIC4uLnN1cHBsaWVkQXJncykge1xuICAgIHJldHVybiBzdXBwbGllZEFyZ3MubGVuZ3RoXG4gICAgICAgID8gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IGFyZ3VtZW50cy5sZW5ndGggPyBzdXBwbGllZEFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkgOiBzdXBwbGllZEFyZ3M7XG4gICAgICAgICAgICAvLyBUUzcwMTdcbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZVttZXRob2RdLmFwcGx5KGluc3RhbmNlLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIFRTNzAxN1xuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlW21ldGhvZF0uYXBwbHkoaW5zdGFuY2UsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gbWl4aW4odGFyZ2V0LCAuLi5zb3VyY2VzKSB7XG4gICAgcmV0dXJuIF9taXhpbih7XG4gICAgICAgIGRlZXA6IGZhbHNlLFxuICAgICAgICBpbmhlcml0ZWQ6IHRydWUsXG4gICAgICAgIHNvdXJjZXM6IHNvdXJjZXMsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0XG4gICAgfSk7XG59XG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB3aGljaCBpbnZva2VzIHRoZSBnaXZlbiBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgcHJlcGVuZGVkIHRvIGl0cyBhcmd1bWVudCBsaXN0LlxuICogTGlrZSBgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRgLCBidXQgZG9lcyBub3QgYWx0ZXIgZXhlY3V0aW9uIGNvbnRleHQuXG4gKlxuICogQHBhcmFtIHRhcmdldEZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0aGF0IG5lZWRzIHRvIGJlIGJvdW5kXG4gKiBAcGFyYW0gc3VwcGxpZWRBcmdzIEFuIG9wdGlvbmFsIGFycmF5IG9mIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRoZSBgdGFyZ2V0RnVuY3Rpb25gIGFyZ3VtZW50cyBsaXN0XG4gKiBAcmV0dXJuIFRoZSBib3VuZCBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFydGlhbCh0YXJnZXRGdW5jdGlvbiwgLi4uc3VwcGxpZWRBcmdzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IGFyZ3VtZW50cy5sZW5ndGggPyBzdXBwbGllZEFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkgOiBzdXBwbGllZEFyZ3M7XG4gICAgICAgIHJldHVybiB0YXJnZXRGdW5jdGlvbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xufVxuLyoqXG4gKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgZGVzdHJveSBtZXRob2QgdGhhdCwgd2hlbiBjYWxsZWQsIGNhbGxzIHRoZSBwYXNzZWQtaW4gZGVzdHJ1Y3Rvci5cbiAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBhIHVuaWZpZWQgaW50ZXJmYWNlIGZvciBjcmVhdGluZyBcInJlbW92ZVwiIC8gXCJkZXN0cm95XCIgaGFuZGxlcnMgZm9yXG4gKiBldmVudCBsaXN0ZW5lcnMsIHRpbWVycywgZXRjLlxuICpcbiAqIEBwYXJhbSBkZXN0cnVjdG9yIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBoYW5kbGUncyBgZGVzdHJveWAgbWV0aG9kIGlzIGludm9rZWRcbiAqIEByZXR1cm4gVGhlIGhhbmRsZSBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhhbmRsZShkZXN0cnVjdG9yKSB7XG4gICAgbGV0IGNhbGxlZCA9IGZhbHNlO1xuICAgIHJldHVybiB7XG4gICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghY2FsbGVkKSB7XG4gICAgICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBkZXN0cnVjdG9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgc2luZ2xlIGhhbmRsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlc3Ryb3kgbXVsdGlwbGUgaGFuZGxlcyBzaW11bHRhbmVvdXNseS5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlcyBBbiBhcnJheSBvZiBoYW5kbGVzIHdpdGggYGRlc3Ryb3lgIG1ldGhvZHNcbiAqIEByZXR1cm4gVGhlIGhhbmRsZSBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbXBvc2l0ZUhhbmRsZSguLi5oYW5kbGVzKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhhbmRsZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGFuZGxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaGFuZGxlc1tpXS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxhbmcubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2NvcmUvbGFuZy5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2NvcmUvbGFuZy5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiZnVuY3Rpb24gaXNGZWF0dXJlVGVzdFRoZW5hYmxlKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gdmFsdWUgJiYgdmFsdWUudGhlbjtcclxufVxyXG4vKipcclxuICogQSBjYWNoZSBvZiByZXN1bHRzIG9mIGZlYXR1cmUgdGVzdHNcclxuICovXHJcbmV4cG9ydCBjb25zdCB0ZXN0Q2FjaGUgPSB7fTtcclxuLyoqXHJcbiAqIEEgY2FjaGUgb2YgdGhlIHVuLXJlc29sdmVkIGZlYXR1cmUgdGVzdHNcclxuICovXHJcbmV4cG9ydCBjb25zdCB0ZXN0RnVuY3Rpb25zID0ge307XHJcbi8qKlxyXG4gKiBBIGNhY2hlIG9mIHVucmVzb2x2ZWQgdGhlbmFibGVzIChwcm9iYWJseSBwcm9taXNlcylcclxuICogQHR5cGUge3t9fVxyXG4gKi9cclxuY29uc3QgdGVzdFRoZW5hYmxlcyA9IHt9O1xyXG4vKipcclxuICogQSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBzY29wZSAoYHdpbmRvd2AgaW4gYSBicm93c2VyLCBgZ2xvYmFsYCBpbiBOb2RlSlMpXHJcbiAqL1xyXG5jb25zdCBnbG9iYWxTY29wZSA9IChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgLy8gQnJvd3NlcnNcclxuICAgICAgICByZXR1cm4gd2luZG93O1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAvLyBOb2RlXHJcbiAgICAgICAgcmV0dXJuIGdsb2JhbDtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIC8vIFdlYiB3b3JrZXJzXHJcbiAgICAgICAgcmV0dXJuIHNlbGY7XHJcbiAgICB9XHJcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xyXG4gICAgcmV0dXJuIHt9O1xyXG59KSgpO1xyXG4vKiBHcmFiIHRoZSBzdGF0aWNGZWF0dXJlcyBpZiB0aGVyZSBhcmUgYXZhaWxhYmxlICovXHJcbmNvbnN0IHsgc3RhdGljRmVhdHVyZXMgfSA9IGdsb2JhbFNjb3BlLkRvam9IYXNFbnZpcm9ubWVudCB8fCB7fTtcclxuLyogQ2xlYW5pbmcgdXAgdGhlIERvam9IYXNFbnZpb3JubWVudCAqL1xyXG5pZiAoJ0Rvam9IYXNFbnZpcm9ubWVudCcgaW4gZ2xvYmFsU2NvcGUpIHtcclxuICAgIGRlbGV0ZSBnbG9iYWxTY29wZS5Eb2pvSGFzRW52aXJvbm1lbnQ7XHJcbn1cclxuLyoqXHJcbiAqIEN1c3RvbSB0eXBlIGd1YXJkIHRvIG5hcnJvdyB0aGUgYHN0YXRpY0ZlYXR1cmVzYCB0byBlaXRoZXIgYSBtYXAgb3IgYSBmdW5jdGlvbiB0aGF0XHJcbiAqIHJldHVybnMgYSBtYXAuXHJcbiAqXHJcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gZ3VhcmQgZm9yXHJcbiAqL1xyXG5mdW5jdGlvbiBpc1N0YXRpY0ZlYXR1cmVGdW5jdGlvbih2YWx1ZSkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcclxufVxyXG4vKipcclxuICogVGhlIGNhY2hlIG9mIGFzc2VydGVkIGZlYXR1cmVzIHRoYXQgd2VyZSBhdmFpbGFibGUgaW4gdGhlIGdsb2JhbCBzY29wZSB3aGVuIHRoZVxyXG4gKiBtb2R1bGUgbG9hZGVkXHJcbiAqL1xyXG5jb25zdCBzdGF0aWNDYWNoZSA9IHN0YXRpY0ZlYXR1cmVzXHJcbiAgICA/IGlzU3RhdGljRmVhdHVyZUZ1bmN0aW9uKHN0YXRpY0ZlYXR1cmVzKSA/IHN0YXRpY0ZlYXR1cmVzLmFwcGx5KGdsb2JhbFNjb3BlKSA6IHN0YXRpY0ZlYXR1cmVzXHJcbiAgICA6IHt9OyAvKiBQcm92aWRpbmcgYW4gZW1wdHkgY2FjaGUsIGlmIG5vbmUgd2FzIGluIHRoZSBlbnZpcm9ubWVudFxyXG5cclxuLyoqXHJcbiogQU1EIHBsdWdpbiBmdW5jdGlvbi5cclxuKlxyXG4qIENvbmRpdGlvbmFsIGxvYWRzIG1vZHVsZXMgYmFzZWQgb24gYSBoYXMgZmVhdHVyZSB0ZXN0IHZhbHVlLlxyXG4qXHJcbiogQHBhcmFtIHJlc291cmNlSWQgR2l2ZXMgdGhlIHJlc29sdmVkIG1vZHVsZSBpZCB0byBsb2FkLlxyXG4qIEBwYXJhbSByZXF1aXJlIFRoZSBsb2FkZXIgcmVxdWlyZSBmdW5jdGlvbiB3aXRoIHJlc3BlY3QgdG8gdGhlIG1vZHVsZSB0aGF0IGNvbnRhaW5lZCB0aGUgcGx1Z2luIHJlc291cmNlIGluIGl0c1xyXG4qICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kgbGlzdC5cclxuKiBAcGFyYW0gbG9hZCBDYWxsYmFjayB0byBsb2FkZXIgdGhhdCBjb25zdW1lcyByZXN1bHQgb2YgcGx1Z2luIGRlbWFuZC5cclxuKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGxvYWQocmVzb3VyY2VJZCwgcmVxdWlyZSwgbG9hZCwgY29uZmlnKSB7XHJcbiAgICByZXNvdXJjZUlkID8gcmVxdWlyZShbcmVzb3VyY2VJZF0sIGxvYWQpIDogbG9hZCgpO1xyXG59XHJcbi8qKlxyXG4gKiBBTUQgcGx1Z2luIGZ1bmN0aW9uLlxyXG4gKlxyXG4gKiBSZXNvbHZlcyByZXNvdXJjZUlkIGludG8gYSBtb2R1bGUgaWQgYmFzZWQgb24gcG9zc2libHktbmVzdGVkIHRlbmFyeSBleHByZXNzaW9uIHRoYXQgYnJhbmNoZXMgb24gaGFzIGZlYXR1cmUgdGVzdFxyXG4gKiB2YWx1ZShzKS5cclxuICpcclxuICogQHBhcmFtIHJlc291cmNlSWQgVGhlIGlkIG9mIHRoZSBtb2R1bGVcclxuICogQHBhcmFtIG5vcm1hbGl6ZSBSZXNvbHZlcyBhIHJlbGF0aXZlIG1vZHVsZSBpZCBpbnRvIGFuIGFic29sdXRlIG1vZHVsZSBpZFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShyZXNvdXJjZUlkLCBub3JtYWxpemUpIHtcclxuICAgIGNvbnN0IHRva2VucyA9IHJlc291cmNlSWQubWF0Y2goL1tcXD86XXxbXjpcXD9dKi9nKSB8fCBbXTtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGZ1bmN0aW9uIGdldChza2lwKSB7XHJcbiAgICAgICAgY29uc3QgdGVybSA9IHRva2Vuc1tpKytdO1xyXG4gICAgICAgIGlmICh0ZXJtID09PSAnOicpIHtcclxuICAgICAgICAgICAgLy8gZW1wdHkgc3RyaW5nIG1vZHVsZSBuYW1lLCByZXNvbHZlcyB0byBudWxsXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gcG9zdGZpeGVkIHdpdGggYSA/IG1lYW5zIGl0IGlzIGEgZmVhdHVyZSB0byBicmFuY2ggb24sIHRoZSB0ZXJtIGlzIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlXHJcbiAgICAgICAgICAgIGlmICh0b2tlbnNbaSsrXSA9PT0gJz8nKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNraXAgJiYgaGFzKHRlcm0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hlZCB0aGUgZmVhdHVyZSwgZ2V0IHRoZSBmaXJzdCB2YWx1ZSBmcm9tIHRoZSBvcHRpb25zXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZGlkIG5vdCBtYXRjaCwgZ2V0IHRoZSBzZWNvbmQgdmFsdWUsIHBhc3Npbmcgb3ZlciB0aGUgZmlyc3RcclxuICAgICAgICAgICAgICAgICAgICBnZXQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChza2lwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBhIG1vZHVsZVxyXG4gICAgICAgICAgICByZXR1cm4gdGVybTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBpZCA9IGdldCgpO1xyXG4gICAgcmV0dXJuIGlkICYmIG5vcm1hbGl6ZShpZCk7XHJcbn1cclxuLyoqXHJcbiAqIENoZWNrIGlmIGEgZmVhdHVyZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWRcclxuICpcclxuICogQHBhcmFtIGZlYXR1cmUgdGhlIG5hbWUgb2YgdGhlIGZlYXR1cmVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBleGlzdHMoZmVhdHVyZSkge1xyXG4gICAgY29uc3Qgbm9ybWFsaXplZEZlYXR1cmUgPSBmZWF0dXJlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gQm9vbGVhbihub3JtYWxpemVkRmVhdHVyZSBpbiBzdGF0aWNDYWNoZSB8fCBub3JtYWxpemVkRmVhdHVyZSBpbiB0ZXN0Q2FjaGUgfHwgdGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV0pO1xyXG59XHJcbi8qKlxyXG4gKiBSZWdpc3RlciBhIG5ldyB0ZXN0IGZvciBhIG5hbWVkIGZlYXR1cmUuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGhhcy5hZGQoJ2RvbS1hZGRldmVudGxpc3RlbmVyJywgISFkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKTtcclxuICpcclxuICogQGV4YW1wbGVcclxuICogaGFzLmFkZCgndG91Y2gtZXZlbnRzJywgZnVuY3Rpb24gKCkge1xyXG4gKiAgICByZXR1cm4gJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnRcclxuICogfSk7XHJcbiAqXHJcbiAqIEBwYXJhbSBmZWF0dXJlIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlXHJcbiAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgcmVwb3J0ZWQgb2YgdGhlIGZlYXR1cmUsIG9yIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIG9uY2Ugb24gZmlyc3QgdGVzdFxyXG4gKiBAcGFyYW0gb3ZlcndyaXRlIGlmIGFuIGV4aXN0aW5nIHZhbHVlIHNob3VsZCBiZSBvdmVyd3JpdHRlbi4gRGVmYXVsdHMgdG8gZmFsc2UuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYWRkKGZlYXR1cmUsIHZhbHVlLCBvdmVyd3JpdGUgPSBmYWxzZSkge1xyXG4gICAgY29uc3Qgbm9ybWFsaXplZEZlYXR1cmUgPSBmZWF0dXJlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBpZiAoZXhpc3RzKG5vcm1hbGl6ZWRGZWF0dXJlKSAmJiAhb3ZlcndyaXRlICYmICEobm9ybWFsaXplZEZlYXR1cmUgaW4gc3RhdGljQ2FjaGUpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRmVhdHVyZSBcIiR7ZmVhdHVyZX1cIiBleGlzdHMgYW5kIG92ZXJ3cml0ZSBub3QgdHJ1ZS5gKTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICB0ZXN0RnVuY3Rpb25zW25vcm1hbGl6ZWRGZWF0dXJlXSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoaXNGZWF0dXJlVGVzdFRoZW5hYmxlKHZhbHVlKSkge1xyXG4gICAgICAgIHRlc3RUaGVuYWJsZXNbZmVhdHVyZV0gPSB2YWx1ZS50aGVuKChyZXNvbHZlZFZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHRlc3RDYWNoZVtmZWF0dXJlXSA9IHJlc29sdmVkVmFsdWU7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0ZXN0VGhlbmFibGVzW2ZlYXR1cmVdO1xyXG4gICAgICAgIH0sICgpID0+IHtcclxuICAgICAgICAgICAgZGVsZXRlIHRlc3RUaGVuYWJsZXNbZmVhdHVyZV07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICB0ZXN0Q2FjaGVbbm9ybWFsaXplZEZlYXR1cmVdID0gdmFsdWU7XHJcbiAgICAgICAgZGVsZXRlIHRlc3RGdW5jdGlvbnNbbm9ybWFsaXplZEZlYXR1cmVdO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgYSBuYW1lZCBmZWF0dXJlLlxyXG4gKlxyXG4gKiBAcGFyYW0gZmVhdHVyZSBUaGUgbmFtZSAoaWYgYSBzdHJpbmcpIG9yIGlkZW50aWZpZXIgKGlmIGFuIGludGVnZXIpIG9mIHRoZSBmZWF0dXJlIHRvIHRlc3QuXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBoYXMoZmVhdHVyZSkge1xyXG4gICAgbGV0IHJlc3VsdDtcclxuICAgIGNvbnN0IG5vcm1hbGl6ZWRGZWF0dXJlID0gZmVhdHVyZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgaWYgKG5vcm1hbGl6ZWRGZWF0dXJlIGluIHN0YXRpY0NhY2hlKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gc3RhdGljQ2FjaGVbbm9ybWFsaXplZEZlYXR1cmVdO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV0pIHtcclxuICAgICAgICByZXN1bHQgPSB0ZXN0Q2FjaGVbbm9ybWFsaXplZEZlYXR1cmVdID0gdGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV0uY2FsbChudWxsKTtcclxuICAgICAgICBkZWxldGUgdGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV07XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChub3JtYWxpemVkRmVhdHVyZSBpbiB0ZXN0Q2FjaGUpIHtcclxuICAgICAgICByZXN1bHQgPSB0ZXN0Q2FjaGVbbm9ybWFsaXplZEZlYXR1cmVdO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZmVhdHVyZSBpbiB0ZXN0VGhlbmFibGVzKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQXR0ZW1wdCB0byBkZXRlY3QgdW5yZWdpc3RlcmVkIGhhcyBmZWF0dXJlIFwiJHtmZWF0dXJlfVwiYCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcbi8qXHJcbiAqIE91dCBvZiB0aGUgYm94IGZlYXR1cmUgdGVzdHNcclxuICovXHJcbi8qIEVudmlyb25tZW50cyAqL1xyXG4vKiBVc2VkIGFzIGEgdmFsdWUgdG8gcHJvdmlkZSBhIGRlYnVnIG9ubHkgY29kZSBwYXRoICovXHJcbmFkZCgnZGVidWcnLCB0cnVlKTtcclxuLyogRGV0ZWN0cyBpZiB0aGUgZW52aXJvbm1lbnQgaXMgXCJicm93c2VyIGxpa2VcIiAqL1xyXG5hZGQoJ2hvc3QtYnJvd3NlcicsIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGxvY2F0aW9uICE9PSAndW5kZWZpbmVkJyk7XHJcbi8qIERldGVjdHMgaWYgdGhlIGVudmlyb25tZW50IGFwcGVhcnMgdG8gYmUgTm9kZUpTICovXHJcbmFkZCgnaG9zdC1ub2RlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzLnZlcnNpb25zICYmIHByb2Nlc3MudmVyc2lvbnMubm9kZSkge1xyXG4gICAgICAgIHJldHVybiBwcm9jZXNzLnZlcnNpb25zLm5vZGU7XHJcbiAgICB9XHJcbn0pO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXMubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2hhcy9oYXMubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9oYXMvaGFzLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgeyBpc0FycmF5TGlrZSwgU2hpbUl0ZXJhdG9yIH0gZnJvbSAnLi9pdGVyYXRvcic7XHJcbmltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xyXG5pbXBvcnQgeyBpcyBhcyBvYmplY3RJcyB9IGZyb20gJy4vb2JqZWN0JztcclxuaW1wb3J0IGhhcyBmcm9tICcuL3N1cHBvcnQvaGFzJztcclxuaW1wb3J0ICcuL1N5bWJvbCc7XHJcbmV4cG9ydCBsZXQgTWFwID0gZ2xvYmFsLk1hcDtcclxuaWYgKCF0cnVlKSB7XHJcbiAgICBNYXAgPSAoX2EgPSBjbGFzcyBNYXAge1xyXG4gICAgICAgICAgICBjb25zdHJ1Y3RvcihpdGVyYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gW107XHJcbiAgICAgICAgICAgICAgICB0aGlzW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnTWFwJztcclxuICAgICAgICAgICAgICAgIGlmIChpdGVyYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5TGlrZShpdGVyYWJsZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVyYWJsZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBpdGVyYWJsZVtpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KHZhbHVlWzBdLCB2YWx1ZVsxXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KHZhbHVlWzBdLCB2YWx1ZVsxXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEFuIGFsdGVybmF0aXZlIHRvIEFycmF5LnByb3RvdHlwZS5pbmRleE9mIHVzaW5nIE9iamVjdC5pc1xyXG4gICAgICAgICAgICAgKiB0byBjaGVjayBmb3IgZXF1YWxpdHkuIFNlZSBodHRwOi8vbXpsLmxhLzF6dUtPMlZcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIF9pbmRleE9mS2V5KGtleXMsIGtleSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0SXMoa2V5c1tpXSwga2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZ2V0IHNpemUoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fa2V5cy5sZW5ndGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2xlYXIoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9rZXlzLmxlbmd0aCA9IHRoaXMuX3ZhbHVlcy5sZW5ndGggPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRlbGV0ZShrZXkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5faW5kZXhPZktleSh0aGlzLl9rZXlzLCBrZXkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuX2tleXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZW50cmllcygpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuX2tleXMubWFwKChrZXksIGkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgdGhpcy5fdmFsdWVzW2ldXTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaGltSXRlcmF0b3IodmFsdWVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3JFYWNoKGNhbGxiYWNrLCBjb250ZXh0KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gdGhpcy5fa2V5cztcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuX3ZhbHVlcztcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCB2YWx1ZXNbaV0sIGtleXNbaV0sIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGdldChrZXkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5faW5kZXhPZktleSh0aGlzLl9rZXlzLCBrZXkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4IDwgMCA/IHVuZGVmaW5lZCA6IHRoaXMuX3ZhbHVlc1tpbmRleF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaGFzKGtleSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luZGV4T2ZLZXkodGhpcy5fa2V5cywga2V5KSA+IC0xO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGtleXMoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNoaW1JdGVyYXRvcih0aGlzLl9rZXlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXQoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5faW5kZXhPZktleSh0aGlzLl9rZXlzLCBrZXkpO1xyXG4gICAgICAgICAgICAgICAgaW5kZXggPSBpbmRleCA8IDAgPyB0aGlzLl9rZXlzLmxlbmd0aCA6IGluZGV4O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fa2V5c1tpbmRleF0gPSBrZXk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNbaW5kZXhdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YWx1ZXMoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNoaW1JdGVyYXRvcih0aGlzLl92YWx1ZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBfYVtTeW1ib2wuc3BlY2llc10gPSBfYSxcclxuICAgICAgICBfYSk7XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgTWFwO1xyXG52YXIgX2E7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1hcC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9NYXAubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL01hcC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XHJcbmltcG9ydCB7IHF1ZXVlTWljcm9UYXNrIH0gZnJvbSAnLi9zdXBwb3J0L3F1ZXVlJztcclxuaW1wb3J0ICcuL1N5bWJvbCc7XHJcbmltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XHJcbmV4cG9ydCBsZXQgU2hpbVByb21pc2UgPSBnbG9iYWwuUHJvbWlzZTtcclxuZXhwb3J0IGNvbnN0IGlzVGhlbmFibGUgPSBmdW5jdGlvbiBpc1RoZW5hYmxlKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbic7XHJcbn07XHJcbmlmICghdHJ1ZSkge1xyXG4gICAgZ2xvYmFsLlByb21pc2UgPSBTaGltUHJvbWlzZSA9IChfYSA9IGNsYXNzIFByb21pc2Uge1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBQcm9taXNlLlxyXG4gICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAgKiBAY29uc3RydWN0b3JcclxuICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgICogQHBhcmFtIGV4ZWN1dG9yXHJcbiAgICAgICAgICAgICAqIFRoZSBleGVjdXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgaW1tZWRpYXRlbHkgd2hlbiB0aGUgUHJvbWlzZSBpcyBpbnN0YW50aWF0ZWQuIEl0IGlzIHJlc3BvbnNpYmxlIGZvclxyXG4gICAgICAgICAgICAgKiBzdGFydGluZyB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGVuIGl0IGlzIGludm9rZWQuXHJcbiAgICAgICAgICAgICAqXHJcbiAgICAgICAgICAgICAqIFRoZSBleGVjdXRvciBtdXN0IGNhbGwgZWl0aGVyIHRoZSBwYXNzZWQgYHJlc29sdmVgIGZ1bmN0aW9uIHdoZW4gdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZFxyXG4gICAgICAgICAgICAgKiBzdWNjZXNzZnVsbHksIG9yIHRoZSBgcmVqZWN0YCBmdW5jdGlvbiB3aGVuIHRoZSBvcGVyYXRpb24gZmFpbHMuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBjb25zdHJ1Y3RvcihleGVjdXRvcikge1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGlzIHByb21pc2UuXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAxIC8qIFBlbmRpbmcgKi87XHJcbiAgICAgICAgICAgICAgICB0aGlzW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnUHJvbWlzZSc7XHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIElmIHRydWUsIHRoZSByZXNvbHV0aW9uIG9mIHRoaXMgcHJvbWlzZSBpcyBjaGFpbmVkIChcImxvY2tlZCBpblwiKSB0byBhbm90aGVyIHByb21pc2UuXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGxldCBpc0NoYWluZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogV2hldGhlciBvciBub3QgdGhpcyBwcm9taXNlIGlzIGluIGEgcmVzb2x2ZWQgc3RhdGUuXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGNvbnN0IGlzUmVzb2x2ZWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUgIT09IDEgLyogUGVuZGluZyAqLyB8fCBpc0NoYWluZWQ7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBDYWxsYmFja3MgdGhhdCBzaG91bGQgYmUgaW52b2tlZCBvbmNlIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGxldCBjYWxsYmFja3MgPSBbXTtcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogSW5pdGlhbGx5IHB1c2hlcyBjYWxsYmFja3Mgb250byBhIHF1ZXVlIGZvciBleGVjdXRpb24gb25jZSB0aGlzIHByb21pc2Ugc2V0dGxlcy4gQWZ0ZXIgdGhlIHByb21pc2Ugc2V0dGxlcyxcclxuICAgICAgICAgICAgICAgICAqIGVucXVldWVzIGNhbGxiYWNrcyBmb3IgZXhlY3V0aW9uIG9uIHRoZSBuZXh0IGV2ZW50IGxvb3AgdHVybi5cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgbGV0IHdoZW5GaW5pc2hlZCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIFNldHRsZXMgdGhpcyBwcm9taXNlLlxyXG4gICAgICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSBuZXdTdGF0ZSBUaGUgcmVzb2x2ZWQgc3RhdGUgZm9yIHRoaXMgcHJvbWlzZS5cclxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7VHxhbnl9IHZhbHVlIFRoZSByZXNvbHZlZCB2YWx1ZSBmb3IgdGhpcyBwcm9taXNlLlxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZXR0bGUgPSAobmV3U3RhdGUsIHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQSBwcm9taXNlIGNhbiBvbmx5IGJlIHNldHRsZWQgb25jZS5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gMSAvKiBQZW5kaW5nICovKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IG5ld1N0YXRlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZWRWYWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZW5GaW5pc2hlZCA9IHF1ZXVlTWljcm9UYXNrO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgZW5xdWV1ZSBhIGNhbGxiYWNrIHJ1bm5lciBpZiB0aGVyZSBhcmUgY2FsbGJhY2tzIHNvIHRoYXQgaW5pdGlhbGx5IGZ1bGZpbGxlZCBQcm9taXNlcyBkb24ndCBoYXZlIHRvXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBhbiBleHRyYSB0dXJuLlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja3MgJiYgY2FsbGJhY2tzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNaWNyb1Rhc2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IGNhbGxiYWNrcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrc1tpXS5jYWxsKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBSZXNvbHZlcyB0aGlzIHByb21pc2UuXHJcbiAgICAgICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIG5ld1N0YXRlIFRoZSByZXNvbHZlZCBzdGF0ZSBmb3IgdGhpcyBwcm9taXNlLlxyXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIHtUfGFueX0gdmFsdWUgVGhlIHJlc29sdmVkIHZhbHVlIGZvciB0aGlzIHByb21pc2UuXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmUgPSAobmV3U3RhdGUsIHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVzb2x2ZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1RoZW5hYmxlKHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS50aGVuKHNldHRsZS5iaW5kKG51bGwsIDAgLyogRnVsZmlsbGVkICovKSwgc2V0dGxlLmJpbmQobnVsbCwgMiAvKiBSZWplY3RlZCAqLykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NoYWluZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGxlKG5ld1N0YXRlLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHRoaXMudGhlbiA9IChvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW5GaW5pc2hlZCBpbml0aWFsbHkgcXVldWVzIHVwIGNhbGxiYWNrcyBmb3IgZXhlY3V0aW9uIGFmdGVyIHRoZSBwcm9taXNlIGhhcyBzZXR0bGVkLiBPbmNlIHRoZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9taXNlIGhhcyBzZXR0bGVkLCB3aGVuRmluaXNoZWQgd2lsbCBzY2hlZHVsZSBjYWxsYmFja3MgZm9yIGV4ZWN1dGlvbiBvbiB0aGUgbmV4dCB0dXJuIHRocm91Z2ggdGhlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IGxvb3AuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZW5GaW5pc2hlZCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuc3RhdGUgPT09IDIgLyogUmVqZWN0ZWQgKi8gPyBvblJlamVjdGVkIDogb25GdWxmaWxsZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjYWxsYmFjayh0aGlzLnJlc29sdmVkVmFsdWUpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gMiAvKiBSZWplY3RlZCAqLykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh0aGlzLnJlc29sdmVkVmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnJlc29sdmVkVmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yKHJlc29sdmUuYmluZChudWxsLCAwIC8qIEZ1bGZpbGxlZCAqLyksIHJlc29sdmUuYmluZChudWxsLCAyIC8qIFJlamVjdGVkICovKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXR0bGUoMiAvKiBSZWplY3RlZCAqLywgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHN0YXRpYyBhbGwoaXRlcmFibGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcyhmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBsZXRlID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3B1bGF0aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmdWxmaWxsKGluZGV4LCB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICsrY29tcGxldGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmaW5pc2goKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3B1bGF0aW5nIHx8IGNvbXBsZXRlIDwgdG90YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHByb2Nlc3NJdGVtKGluZGV4LCBpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICsrdG90YWw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1RoZW5hYmxlKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbiBpdGVtIFByb21pc2UgcmVqZWN0cywgdGhpcyBQcm9taXNlIGlzIGltbWVkaWF0ZWx5IHJlamVjdGVkIHdpdGggdGhlIGl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb21pc2UncyByZWplY3Rpb24gZXJyb3IuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnRoZW4oZnVsZmlsbC5iaW5kKG51bGwsIGluZGV4KSwgcmVqZWN0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShpdGVtKS50aGVuKGZ1bGZpbGwuYmluZChudWxsLCBpbmRleCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBpID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGl0ZXJhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NJdGVtKGksIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBwb3B1bGF0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzdGF0aWMgcmFjZShpdGVyYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlcmFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIFByb21pc2UgaXRlbSByZWplY3RzLCB0aGlzIFByb21pc2UgaXMgaW1tZWRpYXRlbHkgcmVqZWN0ZWQgd2l0aCB0aGUgaXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvbWlzZSdzIHJlamVjdGlvbiBlcnJvci5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0udGhlbihyZXNvbHZlLCByZWplY3QpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKGl0ZW0pLnRoZW4ocmVzb2x2ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzdGF0aWMgcmVqZWN0KHJlYXNvbikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHN0YXRpYyByZXNvbHZlKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMoZnVuY3Rpb24gKHJlc29sdmUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoKG9uUmVqZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgX2FbU3ltYm9sLnNwZWNpZXNdID0gU2hpbVByb21pc2UsXHJcbiAgICAgICAgX2EpO1xyXG59XHJcbmV4cG9ydCBkZWZhdWx0IFNoaW1Qcm9taXNlO1xyXG52YXIgX2E7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVByb21pc2UubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vUHJvbWlzZS5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vUHJvbWlzZS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IGhhcyBmcm9tICcuL3N1cHBvcnQvaGFzJztcclxuaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XHJcbmltcG9ydCB7IGdldFZhbHVlRGVzY3JpcHRvciB9IGZyb20gJy4vc3VwcG9ydC91dGlsJztcclxuZXhwb3J0IGxldCBTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xyXG5pZiAoIXRydWUpIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhyb3dzIGlmIHRoZSB2YWx1ZSBpcyBub3QgYSBzeW1ib2wsIHVzZWQgaW50ZXJuYWxseSB3aXRoaW4gdGhlIFNoaW1cclxuICAgICAqIEBwYXJhbSAge2FueX0gICAgdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJuIHtzeW1ib2x9ICAgICAgIFJldHVybnMgdGhlIHN5bWJvbCBvciB0aHJvd3NcclxuICAgICAqL1xyXG4gICAgY29uc3QgdmFsaWRhdGVTeW1ib2wgPSBmdW5jdGlvbiB2YWxpZGF0ZVN5bWJvbCh2YWx1ZSkge1xyXG4gICAgICAgIGlmICghaXNTeW1ib2wodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IodmFsdWUgKyAnIGlzIG5vdCBhIHN5bWJvbCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9O1xyXG4gICAgY29uc3QgZGVmaW5lUHJvcGVydGllcyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzO1xyXG4gICAgY29uc3QgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XHJcbiAgICBjb25zdCBjcmVhdGUgPSBPYmplY3QuY3JlYXRlO1xyXG4gICAgY29uc3Qgb2JqUHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcclxuICAgIGNvbnN0IGdsb2JhbFN5bWJvbHMgPSB7fTtcclxuICAgIGNvbnN0IGdldFN5bWJvbE5hbWUgPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBjcmVhdGUobnVsbCk7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChkZXNjKSB7XHJcbiAgICAgICAgICAgIGxldCBwb3N0Zml4ID0gMDtcclxuICAgICAgICAgICAgbGV0IG5hbWU7XHJcbiAgICAgICAgICAgIHdoaWxlIChjcmVhdGVkW1N0cmluZyhkZXNjKSArIChwb3N0Zml4IHx8ICcnKV0pIHtcclxuICAgICAgICAgICAgICAgICsrcG9zdGZpeDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkZXNjICs9IFN0cmluZyhwb3N0Zml4IHx8ICcnKTtcclxuICAgICAgICAgICAgY3JlYXRlZFtkZXNjXSA9IHRydWU7XHJcbiAgICAgICAgICAgIG5hbWUgPSAnQEAnICsgZGVzYztcclxuICAgICAgICAgICAgLy8gRklYTUU6IFRlbXBvcmFyeSBndWFyZCB1bnRpbCB0aGUgZHVwbGljYXRlIGV4ZWN1dGlvbiB3aGVuIHRlc3RpbmcgY2FuIGJlXHJcbiAgICAgICAgICAgIC8vIHBpbm5lZCBkb3duLlxyXG4gICAgICAgICAgICBpZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqUHJvdG90eXBlLCBuYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgZGVmaW5lUHJvcGVydHkob2JqUHJvdG90eXBlLCBuYW1lLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lUHJvcGVydHkodGhpcywgbmFtZSwgZ2V0VmFsdWVEZXNjcmlwdG9yKHZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5hbWU7XHJcbiAgICAgICAgfTtcclxuICAgIH0pKCk7XHJcbiAgICBjb25zdCBJbnRlcm5hbFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbChkZXNjcmlwdGlvbikge1xyXG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgSW50ZXJuYWxTeW1ib2wpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHlwZUVycm9yOiBTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3InKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFN5bWJvbChkZXNjcmlwdGlvbik7XHJcbiAgICB9O1xyXG4gICAgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbChkZXNjcmlwdGlvbikge1xyXG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgU3ltYm9sKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1R5cGVFcnJvcjogU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN5bSA9IE9iamVjdC5jcmVhdGUoSW50ZXJuYWxTeW1ib2wucHJvdG90eXBlKTtcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQgPyAnJyA6IFN0cmluZyhkZXNjcmlwdGlvbik7XHJcbiAgICAgICAgcmV0dXJuIGRlZmluZVByb3BlcnRpZXMoc3ltLCB7XHJcbiAgICAgICAgICAgIF9fZGVzY3JpcHRpb25fXzogZ2V0VmFsdWVEZXNjcmlwdG9yKGRlc2NyaXB0aW9uKSxcclxuICAgICAgICAgICAgX19uYW1lX186IGdldFZhbHVlRGVzY3JpcHRvcihnZXRTeW1ib2xOYW1lKGRlc2NyaXB0aW9uKSlcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbiAgICAvKiBEZWNvcmF0ZSB0aGUgU3ltYm9sIGZ1bmN0aW9uIHdpdGggdGhlIGFwcHJvcHJpYXRlIHByb3BlcnRpZXMgKi9cclxuICAgIGRlZmluZVByb3BlcnR5KFN5bWJvbCwgJ2ZvcicsIGdldFZhbHVlRGVzY3JpcHRvcihmdW5jdGlvbiAoa2V5KSB7XHJcbiAgICAgICAgaWYgKGdsb2JhbFN5bWJvbHNba2V5XSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsU3ltYm9sc1trZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKGdsb2JhbFN5bWJvbHNba2V5XSA9IFN5bWJvbChTdHJpbmcoa2V5KSkpO1xyXG4gICAgfSkpO1xyXG4gICAgZGVmaW5lUHJvcGVydGllcyhTeW1ib2wsIHtcclxuICAgICAgICBrZXlGb3I6IGdldFZhbHVlRGVzY3JpcHRvcihmdW5jdGlvbiAoc3ltKSB7XHJcbiAgICAgICAgICAgIGxldCBrZXk7XHJcbiAgICAgICAgICAgIHZhbGlkYXRlU3ltYm9sKHN5bSk7XHJcbiAgICAgICAgICAgIGZvciAoa2V5IGluIGdsb2JhbFN5bWJvbHMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChnbG9iYWxTeW1ib2xzW2tleV0gPT09IHN5bSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICBoYXNJbnN0YW5jZTogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ2hhc0luc3RhbmNlJyksIGZhbHNlLCBmYWxzZSksXHJcbiAgICAgICAgaXNDb25jYXRTcHJlYWRhYmxlOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignaXNDb25jYXRTcHJlYWRhYmxlJyksIGZhbHNlLCBmYWxzZSksXHJcbiAgICAgICAgaXRlcmF0b3I6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdpdGVyYXRvcicpLCBmYWxzZSwgZmFsc2UpLFxyXG4gICAgICAgIG1hdGNoOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignbWF0Y2gnKSwgZmFsc2UsIGZhbHNlKSxcclxuICAgICAgICBvYnNlcnZhYmxlOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignb2JzZXJ2YWJsZScpLCBmYWxzZSwgZmFsc2UpLFxyXG4gICAgICAgIHJlcGxhY2U6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdyZXBsYWNlJyksIGZhbHNlLCBmYWxzZSksXHJcbiAgICAgICAgc2VhcmNoOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignc2VhcmNoJyksIGZhbHNlLCBmYWxzZSksXHJcbiAgICAgICAgc3BlY2llczogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3NwZWNpZXMnKSwgZmFsc2UsIGZhbHNlKSxcclxuICAgICAgICBzcGxpdDogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3NwbGl0JyksIGZhbHNlLCBmYWxzZSksXHJcbiAgICAgICAgdG9QcmltaXRpdmU6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCd0b1ByaW1pdGl2ZScpLCBmYWxzZSwgZmFsc2UpLFxyXG4gICAgICAgIHRvU3RyaW5nVGFnOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcigndG9TdHJpbmdUYWcnKSwgZmFsc2UsIGZhbHNlKSxcclxuICAgICAgICB1bnNjb3BhYmxlczogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3Vuc2NvcGFibGVzJyksIGZhbHNlLCBmYWxzZSlcclxuICAgIH0pO1xyXG4gICAgLyogRGVjb3JhdGUgdGhlIEludGVybmFsU3ltYm9sIG9iamVjdCAqL1xyXG4gICAgZGVmaW5lUHJvcGVydGllcyhJbnRlcm5hbFN5bWJvbC5wcm90b3R5cGUsIHtcclxuICAgICAgICBjb25zdHJ1Y3RvcjogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbCksXHJcbiAgICAgICAgdG9TdHJpbmc6IGdldFZhbHVlRGVzY3JpcHRvcihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9fbmFtZV9fO1xyXG4gICAgICAgIH0sIGZhbHNlLCBmYWxzZSlcclxuICAgIH0pO1xyXG4gICAgLyogRGVjb3JhdGUgdGhlIFN5bWJvbC5wcm90b3R5cGUgKi9cclxuICAgIGRlZmluZVByb3BlcnRpZXMoU3ltYm9sLnByb3RvdHlwZSwge1xyXG4gICAgICAgIHRvU3RyaW5nOiBnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ1N5bWJvbCAoJyArIHZhbGlkYXRlU3ltYm9sKHRoaXMpLl9fZGVzY3JpcHRpb25fXyArICcpJztcclxuICAgICAgICB9KSxcclxuICAgICAgICB2YWx1ZU9mOiBnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVTeW1ib2wodGhpcyk7XHJcbiAgICAgICAgfSlcclxuICAgIH0pO1xyXG4gICAgZGVmaW5lUHJvcGVydHkoU3ltYm9sLnByb3RvdHlwZSwgU3ltYm9sLnRvUHJpbWl0aXZlLCBnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB2YWxpZGF0ZVN5bWJvbCh0aGlzKTtcclxuICAgIH0pKTtcclxuICAgIGRlZmluZVByb3BlcnR5KFN5bWJvbC5wcm90b3R5cGUsIFN5bWJvbC50b1N0cmluZ1RhZywgZ2V0VmFsdWVEZXNjcmlwdG9yKCdTeW1ib2wnLCBmYWxzZSwgZmFsc2UsIHRydWUpKTtcclxuICAgIGRlZmluZVByb3BlcnR5KEludGVybmFsU3ltYm9sLnByb3RvdHlwZSwgU3ltYm9sLnRvUHJpbWl0aXZlLCBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLnByb3RvdHlwZVtTeW1ib2wudG9QcmltaXRpdmVdLCBmYWxzZSwgZmFsc2UsIHRydWUpKTtcclxuICAgIGRlZmluZVByb3BlcnR5KEludGVybmFsU3ltYm9sLnByb3RvdHlwZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLnByb3RvdHlwZVtTeW1ib2wudG9TdHJpbmdUYWddLCBmYWxzZSwgZmFsc2UsIHRydWUpKTtcclxufVxyXG4vKipcclxuICogQSBjdXN0b20gZ3VhcmQgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIGlmIGFuIG9iamVjdCBpcyBhIHN5bWJvbCBvciBub3RcclxuICogQHBhcmFtICB7YW55fSAgICAgICB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2sgdG8gc2VlIGlmIGl0IGlzIGEgc3ltYm9sIG9yIG5vdFxyXG4gKiBAcmV0dXJuIHtpcyBzeW1ib2x9ICAgICAgIFJldHVybnMgdHJ1ZSBpZiBhIHN5bWJvbCBvciBub3QgKGFuZCBuYXJyb3dzIHRoZSB0eXBlIGd1YXJkKVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gKHZhbHVlICYmICh0eXBlb2YgdmFsdWUgPT09ICdzeW1ib2wnIHx8IHZhbHVlWydAQHRvU3RyaW5nVGFnJ10gPT09ICdTeW1ib2wnKSkgfHwgZmFsc2U7XHJcbn1cclxuLyoqXHJcbiAqIEZpbGwgYW55IG1pc3Npbmcgd2VsbCBrbm93biBzeW1ib2xzIGlmIHRoZSBuYXRpdmUgU3ltYm9sIGlzIG1pc3NpbmcgdGhlbVxyXG4gKi9cclxuW1xyXG4gICAgJ2hhc0luc3RhbmNlJyxcclxuICAgICdpc0NvbmNhdFNwcmVhZGFibGUnLFxyXG4gICAgJ2l0ZXJhdG9yJyxcclxuICAgICdzcGVjaWVzJyxcclxuICAgICdyZXBsYWNlJyxcclxuICAgICdzZWFyY2gnLFxyXG4gICAgJ3NwbGl0JyxcclxuICAgICdtYXRjaCcsXHJcbiAgICAndG9QcmltaXRpdmUnLFxyXG4gICAgJ3RvU3RyaW5nVGFnJyxcclxuICAgICd1bnNjb3BhYmxlcycsXHJcbiAgICAnb2JzZXJ2YWJsZSdcclxuXS5mb3JFYWNoKCh3ZWxsS25vd24pID0+IHtcclxuICAgIGlmICghU3ltYm9sW3dlbGxLbm93bl0pIHtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3ltYm9sLCB3ZWxsS25vd24sIGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKHdlbGxLbm93biksIGZhbHNlLCBmYWxzZSkpO1xyXG4gICAgfVxyXG59KTtcclxuZXhwb3J0IGRlZmF1bHQgU3ltYm9sO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1TeW1ib2wubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vU3ltYm9sLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9TeW1ib2wubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xyXG5pbXBvcnQgeyBpc0FycmF5TGlrZSB9IGZyb20gJy4vaXRlcmF0b3InO1xyXG5pbXBvcnQgaGFzIGZyb20gJy4vc3VwcG9ydC9oYXMnO1xyXG5pbXBvcnQgJy4vU3ltYm9sJztcclxuZXhwb3J0IGxldCBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7XHJcbmlmICghdHJ1ZSkge1xyXG4gICAgY29uc3QgREVMRVRFRCA9IHt9O1xyXG4gICAgY29uc3QgZ2V0VUlEID0gZnVuY3Rpb24gZ2V0VUlEKCkge1xyXG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwMDApO1xyXG4gICAgfTtcclxuICAgIGNvbnN0IGdlbmVyYXRlTmFtZSA9IChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IHN0YXJ0SWQgPSBNYXRoLmZsb29yKERhdGUubm93KCkgJSAxMDAwMDAwMDApO1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBnZW5lcmF0ZU5hbWUoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnX193bScgKyBnZXRVSUQoKSArIChzdGFydElkKysgKyAnX18nKTtcclxuICAgICAgICB9O1xyXG4gICAgfSkoKTtcclxuICAgIFdlYWtNYXAgPSBjbGFzcyBXZWFrTWFwIHtcclxuICAgICAgICBjb25zdHJ1Y3RvcihpdGVyYWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnV2Vha01hcCc7XHJcbiAgICAgICAgICAgIHRoaXMuX25hbWUgPSBnZW5lcmF0ZU5hbWUoKTtcclxuICAgICAgICAgICAgdGhpcy5fZnJvemVuRW50cmllcyA9IFtdO1xyXG4gICAgICAgICAgICBpZiAoaXRlcmFibGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc0FycmF5TGlrZShpdGVyYWJsZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZXJhYmxlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVyYWJsZVtpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoaXRlbVswXSwgaXRlbVsxXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaXRlcmFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIF9nZXRGcm96ZW5FbnRyeUluZGV4KGtleSkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2Zyb3plbkVudHJpZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9mcm96ZW5FbnRyaWVzW2ldLmtleSA9PT0ga2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZWxldGUoa2V5KSB7XHJcbiAgICAgICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IGtleVt0aGlzLl9uYW1lXTtcclxuICAgICAgICAgICAgaWYgKGVudHJ5ICYmIGVudHJ5LmtleSA9PT0ga2V5ICYmIGVudHJ5LnZhbHVlICE9PSBERUxFVEVEKSB7XHJcbiAgICAgICAgICAgICAgICBlbnRyeS52YWx1ZSA9IERFTEVURUQ7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBmcm96ZW5JbmRleCA9IHRoaXMuX2dldEZyb3plbkVudHJ5SW5kZXgoa2V5KTtcclxuICAgICAgICAgICAgaWYgKGZyb3plbkluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Zyb3plbkVudHJpZXMuc3BsaWNlKGZyb3plbkluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZ2V0KGtleSkge1xyXG4gICAgICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwga2V5ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0ga2V5W3RoaXMuX25hbWVdO1xyXG4gICAgICAgICAgICBpZiAoZW50cnkgJiYgZW50cnkua2V5ID09PSBrZXkgJiYgZW50cnkudmFsdWUgIT09IERFTEVURUQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS52YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBmcm96ZW5JbmRleCA9IHRoaXMuX2dldEZyb3plbkVudHJ5SW5kZXgoa2V5KTtcclxuICAgICAgICAgICAgaWYgKGZyb3plbkluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mcm96ZW5FbnRyaWVzW2Zyb3plbkluZGV4XS52YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBoYXMoa2V5KSB7XHJcbiAgICAgICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IGtleVt0aGlzLl9uYW1lXTtcclxuICAgICAgICAgICAgaWYgKEJvb2xlYW4oZW50cnkgJiYgZW50cnkua2V5ID09PSBrZXkgJiYgZW50cnkudmFsdWUgIT09IERFTEVURUQpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBmcm96ZW5JbmRleCA9IHRoaXMuX2dldEZyb3plbkVudHJ5SW5kZXgoa2V5KTtcclxuICAgICAgICAgICAgaWYgKGZyb3plbkluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0KGtleSwgdmFsdWUpIHtcclxuICAgICAgICAgICAgaWYgKCFrZXkgfHwgKHR5cGVvZiBrZXkgIT09ICdvYmplY3QnICYmIHR5cGVvZiBrZXkgIT09ICdmdW5jdGlvbicpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHZhbHVlIHVzZWQgYXMgd2VhayBtYXAga2V5Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGVudHJ5ID0ga2V5W3RoaXMuX25hbWVdO1xyXG4gICAgICAgICAgICBpZiAoIWVudHJ5IHx8IGVudHJ5LmtleSAhPT0ga2V5KSB7XHJcbiAgICAgICAgICAgICAgICBlbnRyeSA9IE9iamVjdC5jcmVhdGUobnVsbCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogeyB2YWx1ZToga2V5IH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5pc0Zyb3plbihrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZnJvemVuRW50cmllcy5wdXNoKGVudHJ5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShrZXksIHRoaXMuX25hbWUsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVudHJ5XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZW50cnkudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5leHBvcnQgZGVmYXVsdCBXZWFrTWFwO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XZWFrTWFwLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL1dlYWtNYXAubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL1dlYWtNYXAubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xyXG5pbXBvcnQgeyBpc0FycmF5TGlrZSwgaXNJdGVyYWJsZSB9IGZyb20gJy4vaXRlcmF0b3InO1xyXG5pbXBvcnQgeyBNQVhfU0FGRV9JTlRFR0VSIH0gZnJvbSAnLi9udW1iZXInO1xyXG5pbXBvcnQgaGFzIGZyb20gJy4vc3VwcG9ydC9oYXMnO1xyXG5pbXBvcnQgeyB3cmFwTmF0aXZlIH0gZnJvbSAnLi9zdXBwb3J0L3V0aWwnO1xyXG5leHBvcnQgbGV0IGZyb207XHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IGFycmF5IGZyb20gdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMuXHJcbiAqXHJcbiAqIEBwYXJhbSBhcmd1bWVudHMgQW55IG51bWJlciBvZiBhcmd1bWVudHMgZm9yIHRoZSBhcnJheVxyXG4gKiBAcmV0dXJuIEFuIGFycmF5IGZyb20gdGhlIGdpdmVuIGFyZ3VtZW50c1xyXG4gKi9cclxuZXhwb3J0IGxldCBvZjtcclxuLyogRVM2IEFycmF5IGluc3RhbmNlIG1ldGhvZHMgKi9cclxuLyoqXHJcbiAqIENvcGllcyBkYXRhIGludGVybmFsbHkgd2l0aGluIGFuIGFycmF5IG9yIGFycmF5LWxpa2Ugb2JqZWN0LlxyXG4gKlxyXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgYXJyYXktbGlrZSBvYmplY3RcclxuICogQHBhcmFtIG9mZnNldCBUaGUgaW5kZXggdG8gc3RhcnQgY29weWluZyB2YWx1ZXMgdG87IGlmIG5lZ2F0aXZlLCBpdCBjb3VudHMgYmFja3dhcmRzIGZyb20gbGVuZ3RoXHJcbiAqIEBwYXJhbSBzdGFydCBUaGUgZmlyc3QgKGluY2x1c2l2ZSkgaW5kZXggdG8gY29weTsgaWYgbmVnYXRpdmUsIGl0IGNvdW50cyBiYWNrd2FyZHMgZnJvbSBsZW5ndGhcclxuICogQHBhcmFtIGVuZCBUaGUgbGFzdCAoZXhjbHVzaXZlKSBpbmRleCB0byBjb3B5OyBpZiBuZWdhdGl2ZSwgaXQgY291bnRzIGJhY2t3YXJkcyBmcm9tIGxlbmd0aFxyXG4gKiBAcmV0dXJuIFRoZSB0YXJnZXRcclxuICovXHJcbmV4cG9ydCBsZXQgY29weVdpdGhpbjtcclxuLyoqXHJcbiAqIEZpbGxzIGVsZW1lbnRzIG9mIGFuIGFycmF5LWxpa2Ugb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS5cclxuICpcclxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHRvIGZpbGxcclxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBmaWxsIGVhY2ggZWxlbWVudCBvZiB0aGUgdGFyZ2V0IHdpdGhcclxuICogQHBhcmFtIHN0YXJ0IFRoZSBmaXJzdCBpbmRleCB0byBmaWxsXHJcbiAqIEBwYXJhbSBlbmQgVGhlIChleGNsdXNpdmUpIGluZGV4IGF0IHdoaWNoIHRvIHN0b3AgZmlsbGluZ1xyXG4gKiBAcmV0dXJuIFRoZSBmaWxsZWQgdGFyZ2V0XHJcbiAqL1xyXG5leHBvcnQgbGV0IGZpbGw7XHJcbi8qKlxyXG4gKiBGaW5kcyBhbmQgcmV0dXJucyB0aGUgZmlyc3QgaW5zdGFuY2UgbWF0Y2hpbmcgdGhlIGNhbGxiYWNrIG9yIHVuZGVmaW5lZCBpZiBvbmUgaXMgbm90IGZvdW5kLlxyXG4gKlxyXG4gKiBAcGFyYW0gdGFyZ2V0IEFuIGFycmF5LWxpa2Ugb2JqZWN0XHJcbiAqIEBwYXJhbSBjYWxsYmFjayBBIGZ1bmN0aW9uIHJldHVybmluZyBpZiB0aGUgY3VycmVudCB2YWx1ZSBtYXRjaGVzIGEgY3JpdGVyaWFcclxuICogQHBhcmFtIHRoaXNBcmcgVGhlIGV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgZmluZCBmdW5jdGlvblxyXG4gKiBAcmV0dXJuIFRoZSBmaXJzdCBlbGVtZW50IG1hdGNoaW5nIHRoZSBjYWxsYmFjaywgb3IgdW5kZWZpbmVkIGlmIG9uZSBkb2VzIG5vdCBleGlzdFxyXG4gKi9cclxuZXhwb3J0IGxldCBmaW5kO1xyXG4vKipcclxuICogUGVyZm9ybXMgYSBsaW5lYXIgc2VhcmNoIGFuZCByZXR1cm5zIHRoZSBmaXJzdCBpbmRleCB3aG9zZSB2YWx1ZSBzYXRpc2ZpZXMgdGhlIHBhc3NlZCBjYWxsYmFjayxcclxuICogb3IgLTEgaWYgbm8gdmFsdWVzIHNhdGlzZnkgaXQuXHJcbiAqXHJcbiAqIEBwYXJhbSB0YXJnZXQgQW4gYXJyYXktbGlrZSBvYmplY3RcclxuICogQHBhcmFtIGNhbGxiYWNrIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRydWUgaWYgdGhlIGN1cnJlbnQgdmFsdWUgc2F0aXNmaWVzIGl0cyBjcml0ZXJpYVxyXG4gKiBAcGFyYW0gdGhpc0FyZyBUaGUgZXhlY3V0aW9uIGNvbnRleHQgZm9yIHRoZSBmaW5kIGZ1bmN0aW9uXHJcbiAqIEByZXR1cm4gVGhlIGZpcnN0IGluZGV4IHdob3NlIHZhbHVlIHNhdGlzZmllcyB0aGUgcGFzc2VkIGNhbGxiYWNrLCBvciAtMSBpZiBubyB2YWx1ZXMgc2F0aXNmeSBpdFxyXG4gKi9cclxuZXhwb3J0IGxldCBmaW5kSW5kZXg7XHJcbi8qIEVTNyBBcnJheSBpbnN0YW5jZSBtZXRob2RzICovXHJcbi8qKlxyXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gYXJyYXkgaW5jbHVkZXMgYSBnaXZlbiB2YWx1ZVxyXG4gKlxyXG4gKiBAcGFyYW0gdGFyZ2V0IHRoZSB0YXJnZXQgYXJyYXktbGlrZSBvYmplY3RcclxuICogQHBhcmFtIHNlYXJjaEVsZW1lbnQgdGhlIGl0ZW0gdG8gc2VhcmNoIGZvclxyXG4gKiBAcGFyYW0gZnJvbUluZGV4IHRoZSBzdGFydGluZyBpbmRleCB0byBzZWFyY2ggZnJvbVxyXG4gKiBAcmV0dXJuIGB0cnVlYCBpZiB0aGUgYXJyYXkgaW5jbHVkZXMgdGhlIGVsZW1lbnQsIG90aGVyd2lzZSBgZmFsc2VgXHJcbiAqL1xyXG5leHBvcnQgbGV0IGluY2x1ZGVzO1xyXG5pZiAodHJ1ZSAmJiB0cnVlKSB7XHJcbiAgICBmcm9tID0gZ2xvYmFsLkFycmF5LmZyb207XHJcbiAgICBvZiA9IGdsb2JhbC5BcnJheS5vZjtcclxuICAgIGNvcHlXaXRoaW4gPSB3cmFwTmF0aXZlKGdsb2JhbC5BcnJheS5wcm90b3R5cGUuY29weVdpdGhpbik7XHJcbiAgICBmaWxsID0gd3JhcE5hdGl2ZShnbG9iYWwuQXJyYXkucHJvdG90eXBlLmZpbGwpO1xyXG4gICAgZmluZCA9IHdyYXBOYXRpdmUoZ2xvYmFsLkFycmF5LnByb3RvdHlwZS5maW5kKTtcclxuICAgIGZpbmRJbmRleCA9IHdyYXBOYXRpdmUoZ2xvYmFsLkFycmF5LnByb3RvdHlwZS5maW5kSW5kZXgpO1xyXG59XHJcbmVsc2Uge1xyXG4gICAgLy8gSXQgaXMgb25seSBvbGRlciB2ZXJzaW9ucyBvZiBTYWZhcmkvaU9TIHRoYXQgaGF2ZSBhIGJhZCBmaWxsIGltcGxlbWVudGF0aW9uIGFuZCBzbyBhcmVuJ3QgaW4gdGhlIHdpbGRcclxuICAgIC8vIFRvIG1ha2UgdGhpbmdzIGVhc2llciwgaWYgdGhlcmUgaXMgYSBiYWQgZmlsbCBpbXBsZW1lbnRhdGlvbiwgdGhlIHdob2xlIHNldCBvZiBmdW5jdGlvbnMgd2lsbCBiZSBmaWxsZWRcclxuICAgIC8qKlxyXG4gICAgICogRW5zdXJlcyBhIG5vbi1uZWdhdGl2ZSwgbm9uLWluZmluaXRlLCBzYWZlIGludGVnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIHRvIHZhbGlkYXRlXHJcbiAgICAgKiBAcmV0dXJuIEEgcHJvcGVyIGxlbmd0aFxyXG4gICAgICovXHJcbiAgICBjb25zdCB0b0xlbmd0aCA9IGZ1bmN0aW9uIHRvTGVuZ3RoKGxlbmd0aCkge1xyXG4gICAgICAgIGlmIChpc05hTihsZW5ndGgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKTtcclxuICAgICAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xyXG4gICAgICAgICAgICBsZW5ndGggPSBNYXRoLmZsb29yKGxlbmd0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEVuc3VyZSBhIG5vbi1uZWdhdGl2ZSwgcmVhbCwgc2FmZSBpbnRlZ2VyXHJcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KGxlbmd0aCwgMCksIE1BWF9TQUZFX0lOVEVHRVIpO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogRnJvbSBFUzYgNy4xLjQgVG9JbnRlZ2VyKClcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgQSB2YWx1ZSB0byBjb252ZXJ0XHJcbiAgICAgKiBAcmV0dXJuIEFuIGludGVnZXJcclxuICAgICAqL1xyXG4gICAgY29uc3QgdG9JbnRlZ2VyID0gZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7XHJcbiAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xyXG4gICAgICAgIGlmIChpc05hTih2YWx1ZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gMCB8fCAhaXNGaW5pdGUodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICh2YWx1ZSA+IDAgPyAxIDogLTEpICogTWF0aC5mbG9vcihNYXRoLmFicyh2YWx1ZSkpO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogTm9ybWFsaXplcyBhbiBvZmZzZXQgYWdhaW5zdCBhIGdpdmVuIGxlbmd0aCwgd3JhcHBpbmcgaXQgaWYgbmVnYXRpdmUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSBvcmlnaW5hbCBvZmZzZXRcclxuICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIHRvdGFsIGxlbmd0aCB0byBub3JtYWxpemUgYWdhaW5zdFxyXG4gICAgICogQHJldHVybiBJZiBuZWdhdGl2ZSwgcHJvdmlkZSBhIGRpc3RhbmNlIGZyb20gdGhlIGVuZCAobGVuZ3RoKTsgb3RoZXJ3aXNlIHByb3ZpZGUgYSBkaXN0YW5jZSBmcm9tIDBcclxuICAgICAqL1xyXG4gICAgY29uc3Qgbm9ybWFsaXplT2Zmc2V0ID0gZnVuY3Rpb24gbm9ybWFsaXplT2Zmc2V0KHZhbHVlLCBsZW5ndGgpIHtcclxuICAgICAgICByZXR1cm4gdmFsdWUgPCAwID8gTWF0aC5tYXgobGVuZ3RoICsgdmFsdWUsIDApIDogTWF0aC5taW4odmFsdWUsIGxlbmd0aCk7XHJcbiAgICB9O1xyXG4gICAgZnJvbSA9IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlLCBtYXBGdW5jdGlvbiwgdGhpc0FyZykge1xyXG4gICAgICAgIGlmIChhcnJheUxpa2UgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdmcm9tOiByZXF1aXJlcyBhbiBhcnJheS1saWtlIG9iamVjdCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobWFwRnVuY3Rpb24gJiYgdGhpc0FyZykge1xyXG4gICAgICAgICAgICBtYXBGdW5jdGlvbiA9IG1hcEZ1bmN0aW9uLmJpbmQodGhpc0FyZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lICovXHJcbiAgICAgICAgY29uc3QgQ29uc3RydWN0b3IgPSB0aGlzO1xyXG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRvTGVuZ3RoKGFycmF5TGlrZS5sZW5ndGgpO1xyXG4gICAgICAgIC8vIFN1cHBvcnQgZXh0ZW5zaW9uXHJcbiAgICAgICAgY29uc3QgYXJyYXkgPSB0eXBlb2YgQ29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicgPyBPYmplY3QobmV3IENvbnN0cnVjdG9yKGxlbmd0aCkpIDogbmV3IEFycmF5KGxlbmd0aCk7XHJcbiAgICAgICAgaWYgKCFpc0FycmF5TGlrZShhcnJheUxpa2UpICYmICFpc0l0ZXJhYmxlKGFycmF5TGlrZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFycmF5O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGFycmF5IGFuZCB0aGUgbm9ybWFsaXplZCBsZW5ndGggaXMgMCwganVzdCByZXR1cm4gYW4gZW1wdHkgYXJyYXkuIHRoaXMgcHJldmVudHMgYSBwcm9ibGVtXHJcbiAgICAgICAgLy8gd2l0aCB0aGUgaXRlcmF0aW9uIG9uIElFIHdoZW4gdXNpbmcgYSBOYU4gYXJyYXkgbGVuZ3RoLlxyXG4gICAgICAgIGlmIChpc0FycmF5TGlrZShhcnJheUxpa2UpKSB7XHJcbiAgICAgICAgICAgIGlmIChsZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5TGlrZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBtYXBGdW5jdGlvbiA/IG1hcEZ1bmN0aW9uKGFycmF5TGlrZVtpXSwgaSkgOiBhcnJheUxpa2VbaV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBpID0gMDtcclxuICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhcnJheUxpa2UpIHtcclxuICAgICAgICAgICAgICAgIGFycmF5W2ldID0gbWFwRnVuY3Rpb24gPyBtYXBGdW5jdGlvbih2YWx1ZSwgaSkgOiB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYXJyYXlMaWtlLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGFycmF5Lmxlbmd0aCA9IGxlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFycmF5O1xyXG4gICAgfTtcclxuICAgIG9mID0gZnVuY3Rpb24gb2YoLi4uaXRlbXMpIHtcclxuICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoaXRlbXMpO1xyXG4gICAgfTtcclxuICAgIGNvcHlXaXRoaW4gPSBmdW5jdGlvbiBjb3B5V2l0aGluKHRhcmdldCwgb2Zmc2V0LCBzdGFydCwgZW5kKSB7XHJcbiAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NvcHlXaXRoaW46IHRhcmdldCBtdXN0IGJlIGFuIGFycmF5LWxpa2Ugb2JqZWN0Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRvTGVuZ3RoKHRhcmdldC5sZW5ndGgpO1xyXG4gICAgICAgIG9mZnNldCA9IG5vcm1hbGl6ZU9mZnNldCh0b0ludGVnZXIob2Zmc2V0KSwgbGVuZ3RoKTtcclxuICAgICAgICBzdGFydCA9IG5vcm1hbGl6ZU9mZnNldCh0b0ludGVnZXIoc3RhcnQpLCBsZW5ndGgpO1xyXG4gICAgICAgIGVuZCA9IG5vcm1hbGl6ZU9mZnNldChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvSW50ZWdlcihlbmQpLCBsZW5ndGgpO1xyXG4gICAgICAgIGxldCBjb3VudCA9IE1hdGgubWluKGVuZCAtIHN0YXJ0LCBsZW5ndGggLSBvZmZzZXQpO1xyXG4gICAgICAgIGxldCBkaXJlY3Rpb24gPSAxO1xyXG4gICAgICAgIGlmIChvZmZzZXQgPiBzdGFydCAmJiBvZmZzZXQgPCBzdGFydCArIGNvdW50KSB7XHJcbiAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xO1xyXG4gICAgICAgICAgICBzdGFydCArPSBjb3VudCAtIDE7XHJcbiAgICAgICAgICAgIG9mZnNldCArPSBjb3VudCAtIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHdoaWxlIChjb3VudCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0IGluIHRhcmdldCkge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0W29mZnNldF0gPSB0YXJnZXRbc3RhcnRdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRhcmdldFtvZmZzZXRdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9mZnNldCArPSBkaXJlY3Rpb247XHJcbiAgICAgICAgICAgIHN0YXJ0ICs9IGRpcmVjdGlvbjtcclxuICAgICAgICAgICAgY291bnQtLTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcclxuICAgIH07XHJcbiAgICBmaWxsID0gZnVuY3Rpb24gZmlsbCh0YXJnZXQsIHZhbHVlLCBzdGFydCwgZW5kKSB7XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdG9MZW5ndGgodGFyZ2V0Lmxlbmd0aCk7XHJcbiAgICAgICAgbGV0IGkgPSBub3JtYWxpemVPZmZzZXQodG9JbnRlZ2VyKHN0YXJ0KSwgbGVuZ3RoKTtcclxuICAgICAgICBlbmQgPSBub3JtYWxpemVPZmZzZXQoZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0ludGVnZXIoZW5kKSwgbGVuZ3RoKTtcclxuICAgICAgICB3aGlsZSAoaSA8IGVuZCkge1xyXG4gICAgICAgICAgICB0YXJnZXRbaSsrXSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xyXG4gICAgfTtcclxuICAgIGZpbmQgPSBmdW5jdGlvbiBmaW5kKHRhcmdldCwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IGZpbmRJbmRleCh0YXJnZXQsIGNhbGxiYWNrLCB0aGlzQXJnKTtcclxuICAgICAgICByZXR1cm4gaW5kZXggIT09IC0xID8gdGFyZ2V0W2luZGV4XSA6IHVuZGVmaW5lZDtcclxuICAgIH07XHJcbiAgICBmaW5kSW5kZXggPSBmdW5jdGlvbiBmaW5kSW5kZXgodGFyZ2V0LCBjYWxsYmFjaywgdGhpc0FyZykge1xyXG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRvTGVuZ3RoKHRhcmdldC5sZW5ndGgpO1xyXG4gICAgICAgIGlmICghY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZmluZDogc2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpc0FyZykge1xyXG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrLmJpbmQodGhpc0FyZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKHRhcmdldFtpXSwgaSwgdGFyZ2V0KSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfTtcclxufVxyXG5pZiAodHJ1ZSkge1xyXG4gICAgaW5jbHVkZXMgPSB3cmFwTmF0aXZlKGdsb2JhbC5BcnJheS5wcm90b3R5cGUuaW5jbHVkZXMpO1xyXG59XHJcbmVsc2Uge1xyXG4gICAgLyoqXHJcbiAgICAgKiBFbnN1cmVzIGEgbm9uLW5lZ2F0aXZlLCBub24taW5maW5pdGUsIHNhZmUgaW50ZWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgdG8gdmFsaWRhdGVcclxuICAgICAqIEByZXR1cm4gQSBwcm9wZXIgbGVuZ3RoXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHRvTGVuZ3RoID0gZnVuY3Rpb24gdG9MZW5ndGgobGVuZ3RoKSB7XHJcbiAgICAgICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aCk7XHJcbiAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XHJcbiAgICAgICAgICAgIGxlbmd0aCA9IE1hdGguZmxvb3IobGVuZ3RoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRW5zdXJlIGEgbm9uLW5lZ2F0aXZlLCByZWFsLCBzYWZlIGludGVnZXJcclxuICAgICAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobGVuZ3RoLCAwKSwgTUFYX1NBRkVfSU5URUdFUik7XHJcbiAgICB9O1xyXG4gICAgaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyh0YXJnZXQsIHNlYXJjaEVsZW1lbnQsIGZyb21JbmRleCA9IDApIHtcclxuICAgICAgICBsZXQgbGVuID0gdG9MZW5ndGgodGFyZ2V0Lmxlbmd0aCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IGZyb21JbmRleDsgaSA8IGxlbjsgKytpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gdGFyZ2V0W2ldO1xyXG4gICAgICAgICAgICBpZiAoc2VhcmNoRWxlbWVudCA9PT0gY3VycmVudEVsZW1lbnQgfHxcclxuICAgICAgICAgICAgICAgIChzZWFyY2hFbGVtZW50ICE9PSBzZWFyY2hFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50ICE9PSBjdXJyZW50RWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH07XHJcbn1cclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJyYXkubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vYXJyYXkubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL2FycmF5Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJjb25zdCBnbG9iYWxPYmplY3QgPSAoZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBnbG9iYWwgc3BlYyBkZWZpbmVzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0IGNhbGxlZCAnZ2xvYmFsJ1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1nbG9iYWxcbiAgICAgICAgLy8gYGdsb2JhbGAgaXMgYWxzbyBkZWZpbmVkIGluIE5vZGVKU1xuICAgICAgICByZXR1cm4gZ2xvYmFsO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyB3aW5kb3cgaXMgZGVmaW5lZCBpbiBicm93c2Vyc1xuICAgICAgICByZXR1cm4gd2luZG93O1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gc2VsZiBpcyBkZWZpbmVkIGluIFdlYldvcmtlcnNcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxufSkoKTtcbmV4cG9ydCBkZWZhdWx0IGdsb2JhbE9iamVjdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdsb2JhbC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9nbG9iYWwubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL2dsb2JhbC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0ICcuL1N5bWJvbCc7XG5pbXBvcnQgeyBISUdIX1NVUlJPR0FURV9NQVgsIEhJR0hfU1VSUk9HQVRFX01JTiB9IGZyb20gJy4vc3RyaW5nJztcbmNvbnN0IHN0YXRpY0RvbmUgPSB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbi8qKlxuICogQSBjbGFzcyB0aGF0IF9zaGltc18gYW4gaXRlcmF0b3IgaW50ZXJmYWNlIG9uIGFycmF5IGxpa2Ugb2JqZWN0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNoaW1JdGVyYXRvciB7XG4gICAgY29uc3RydWN0b3IobGlzdCkge1xuICAgICAgICB0aGlzLl9uZXh0SW5kZXggPSAtMTtcbiAgICAgICAgaWYgKGlzSXRlcmFibGUobGlzdCkpIHtcbiAgICAgICAgICAgIHRoaXMuX25hdGl2ZUl0ZXJhdG9yID0gbGlzdFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9saXN0ID0gbGlzdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIG5leHQgaXRlcmF0aW9uIHJlc3VsdCBmb3IgdGhlIEl0ZXJhdG9yXG4gICAgICovXG4gICAgbmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX25hdGl2ZUl0ZXJhdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbmF0aXZlSXRlcmF0b3IubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fbGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRpY0RvbmU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCsrdGhpcy5fbmV4dEluZGV4IDwgdGhpcy5fbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZG9uZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuX2xpc3RbdGhpcy5fbmV4dEluZGV4XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdGljRG9uZTtcbiAgICB9XG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbi8qKlxuICogQSB0eXBlIGd1YXJkIGZvciBjaGVja2luZyBpZiBzb21ldGhpbmcgaGFzIGFuIEl0ZXJhYmxlIGludGVyZmFjZVxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdHlwZSBndWFyZCBhZ2FpbnN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0l0ZXJhYmxlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZVtTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nO1xufVxuLyoqXG4gKiBBIHR5cGUgZ3VhcmQgZm9yIGNoZWNraW5nIGlmIHNvbWV0aGluZyBpcyBBcnJheUxpa2VcbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHR5cGUgZ3VhcmQgYWdhaW5zdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLmxlbmd0aCA9PT0gJ251bWJlcic7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGl0ZXJhdG9yIGZvciBhbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0gaXRlcmFibGUgVGhlIGl0ZXJhYmxlIG9iamVjdCB0byByZXR1cm4gdGhlIGl0ZXJhdG9yIGZvclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0KGl0ZXJhYmxlKSB7XG4gICAgaWYgKGlzSXRlcmFibGUoaXRlcmFibGUpKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzQXJyYXlMaWtlKGl0ZXJhYmxlKSkge1xuICAgICAgICByZXR1cm4gbmV3IFNoaW1JdGVyYXRvcihpdGVyYWJsZSk7XG4gICAgfVxufVxuLyoqXG4gKiBTaGltcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBgZm9yIC4uLiBvZmAgYmxvY2tzXG4gKlxuICogQHBhcmFtIGl0ZXJhYmxlIFRoZSBvYmplY3QgdGhlIHByb3ZpZGVzIGFuIGludGVyYXRvciBpbnRlcmZhY2VcbiAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2ggaXRlbSBvZiB0aGUgaXRlcmFibGVcbiAqIEBwYXJhbSB0aGlzQXJnIE9wdGlvbmFsIHNjb3BlIHRvIHBhc3MgdGhlIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JPZihpdGVyYWJsZSwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICBsZXQgYnJva2VuID0gZmFsc2U7XG4gICAgZnVuY3Rpb24gZG9CcmVhaygpIHtcbiAgICAgICAgYnJva2VuID0gdHJ1ZTtcbiAgICB9XG4gICAgLyogV2UgbmVlZCB0byBoYW5kbGUgaXRlcmF0aW9uIG9mIGRvdWJsZSBieXRlIHN0cmluZ3MgcHJvcGVybHkgKi9cbiAgICBpZiAoaXNBcnJheUxpa2UoaXRlcmFibGUpICYmIHR5cGVvZiBpdGVyYWJsZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgbCA9IGl0ZXJhYmxlLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBjaGFyID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICBpZiAoaSArIDEgPCBsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSA+PSBISUdIX1NVUlJPR0FURV9NSU4gJiYgY29kZSA8PSBISUdIX1NVUlJPR0FURV9NQVgpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhciArPSBpdGVyYWJsZVsrK2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgY2hhciwgaXRlcmFibGUsIGRvQnJlYWspO1xuICAgICAgICAgICAgaWYgKGJyb2tlbikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSBnZXQoaXRlcmFibGUpO1xuICAgICAgICBpZiAoaXRlcmF0b3IpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICB3aGlsZSAoIXJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzQXJnLCByZXN1bHQudmFsdWUsIGl0ZXJhYmxlLCBkb0JyZWFrKTtcbiAgICAgICAgICAgICAgICBpZiAoYnJva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXRlcmF0b3IubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vaXRlcmF0b3IubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL2l0ZXJhdG9yLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4vZ2xvYmFsJztcbi8qKlxuICogVGhlIHNtYWxsZXN0IGludGVydmFsIGJldHdlZW4gdHdvIHJlcHJlc2VudGFibGUgbnVtYmVycy5cbiAqL1xuZXhwb3J0IGNvbnN0IEVQU0lMT04gPSAxO1xuLyoqXG4gKiBUaGUgbWF4aW11bSBzYWZlIGludGVnZXIgaW4gSmF2YVNjcmlwdFxuICovXG5leHBvcnQgY29uc3QgTUFYX1NBRkVfSU5URUdFUiA9IE1hdGgucG93KDIsIDUzKSAtIDE7XG4vKipcbiAqIFRoZSBtaW5pbXVtIHNhZmUgaW50ZWdlciBpbiBKYXZhU2NyaXB0XG4gKi9cbmV4cG9ydCBjb25zdCBNSU5fU0FGRV9JTlRFR0VSID0gLU1BWF9TQUZFX0lOVEVHRVI7XG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGFzc2VkIHZhbHVlIGlzIE5hTiB3aXRob3V0IGNvZXJzaW9uLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBOYU4sIGZhbHNlIGlmIGl0IGlzIG5vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOYU4odmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBnbG9iYWwuaXNOYU4odmFsdWUpO1xufVxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhc3NlZCB2YWx1ZSBpcyBhIGZpbml0ZSBudW1iZXIgd2l0aG91dCBjb2Vyc2lvbi5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgZmluaXRlLCBmYWxzZSBpZiBpdCBpcyBub3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRmluaXRlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgZ2xvYmFsLmlzRmluaXRlKHZhbHVlKTtcbn1cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXNzZWQgdmFsdWUgaXMgYW4gaW50ZWdlci5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlciwgZmFsc2UgaWYgaXQgaXMgbm90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0ludGVnZXIodmFsdWUpIHtcbiAgICByZXR1cm4gaXNGaW5pdGUodmFsdWUpICYmIE1hdGguZmxvb3IodmFsdWUpID09PSB2YWx1ZTtcbn1cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXNzZWQgdmFsdWUgaXMgYW4gaW50ZWdlciB0aGF0IGlzICdzYWZlLCcgbWVhbmluZzpcbiAqICAgMS4gaXQgY2FuIGJlIGV4cHJlc3NlZCBhcyBhbiBJRUVFLTc1NCBkb3VibGUgcHJlY2lzaW9uIG51bWJlclxuICogICAyLiBpdCBoYXMgYSBvbmUtdG8tb25lIG1hcHBpbmcgdG8gYSBtYXRoZW1hdGljYWwgaW50ZWdlciwgbWVhbmluZyBpdHNcbiAqICAgICAgSUVFRS03NTQgcmVwcmVzZW50YXRpb24gY2Fubm90IGJlIHRoZSByZXN1bHQgb2Ygcm91bmRpbmcgYW55IG90aGVyXG4gKiAgICAgIGludGVnZXIgdG8gZml0IHRoZSBJRUVFLTc1NCByZXByZXNlbnRhdGlvblxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLCBmYWxzZSBpZiBpdCBpcyBub3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2FmZUludGVnZXIodmFsdWUpIHtcbiAgICByZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSAmJiBNYXRoLmFicyh2YWx1ZSkgPD0gTUFYX1NBRkVfSU5URUdFUjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW51bWJlci5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9udW1iZXIubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL251bWJlci5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XHJcbmltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XHJcbmltcG9ydCB7IGlzU3ltYm9sIH0gZnJvbSAnLi9TeW1ib2wnO1xyXG5leHBvcnQgbGV0IGFzc2lnbjtcclxuLyoqXHJcbiAqIEdldHMgdGhlIG93biBwcm9wZXJ0eSBkZXNjcmlwdG9yIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LlxyXG4gKiBBbiBvd24gcHJvcGVydHkgZGVzY3JpcHRvciBpcyBvbmUgdGhhdCBpcyBkZWZpbmVkIGRpcmVjdGx5IG9uIHRoZSBvYmplY3QgYW5kIGlzIG5vdFxyXG4gKiBpbmhlcml0ZWQgZnJvbSB0aGUgb2JqZWN0J3MgcHJvdG90eXBlLlxyXG4gKiBAcGFyYW0gbyBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgcHJvcGVydHkuXHJcbiAqIEBwYXJhbSBwIE5hbWUgb2YgdGhlIHByb3BlcnR5LlxyXG4gKi9cclxuZXhwb3J0IGxldCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgb3duIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0LiBUaGUgb3duIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IGFyZSB0aG9zZSB0aGF0IGFyZSBkZWZpbmVkIGRpcmVjdGx5XHJcbiAqIG9uIHRoYXQgb2JqZWN0LCBhbmQgYXJlIG5vdCBpbmhlcml0ZWQgZnJvbSB0aGUgb2JqZWN0J3MgcHJvdG90eXBlLiBUaGUgcHJvcGVydGllcyBvZiBhbiBvYmplY3QgaW5jbHVkZSBib3RoIGZpZWxkcyAob2JqZWN0cykgYW5kIGZ1bmN0aW9ucy5cclxuICogQHBhcmFtIG8gT2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIG93biBwcm9wZXJ0aWVzLlxyXG4gKi9cclxuZXhwb3J0IGxldCBnZXRPd25Qcm9wZXJ0eU5hbWVzO1xyXG4vKipcclxuICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgc3ltYm9sIHByb3BlcnRpZXMgZm91bmQgZGlyZWN0bHkgb24gb2JqZWN0IG8uXHJcbiAqIEBwYXJhbSBvIE9iamVjdCB0byByZXRyaWV2ZSB0aGUgc3ltYm9scyBmcm9tLlxyXG4gKi9cclxuZXhwb3J0IGxldCBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlcyBhcmUgdGhlIHNhbWUgdmFsdWUsIGZhbHNlIG90aGVyd2lzZS5cclxuICogQHBhcmFtIHZhbHVlMSBUaGUgZmlyc3QgdmFsdWUuXHJcbiAqIEBwYXJhbSB2YWx1ZTIgVGhlIHNlY29uZCB2YWx1ZS5cclxuICovXHJcbmV4cG9ydCBsZXQgaXM7XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIG9mIGFuIG9iamVjdC5cclxuICogQHBhcmFtIG8gT2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMuIFRoaXMgY2FuIGJlIGFuIG9iamVjdCB0aGF0IHlvdSBjcmVhdGVkIG9yIGFuIGV4aXN0aW5nIERvY3VtZW50IE9iamVjdCBNb2RlbCAoRE9NKSBvYmplY3QuXHJcbiAqL1xyXG5leHBvcnQgbGV0IGtleXM7XHJcbi8qIEVTNyBPYmplY3Qgc3RhdGljIG1ldGhvZHMgKi9cclxuZXhwb3J0IGxldCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzO1xyXG5leHBvcnQgbGV0IGVudHJpZXM7XHJcbmV4cG9ydCBsZXQgdmFsdWVzO1xyXG5pZiAodHJ1ZSkge1xyXG4gICAgY29uc3QgZ2xvYmFsT2JqZWN0ID0gZ2xvYmFsLk9iamVjdDtcclxuICAgIGFzc2lnbiA9IGdsb2JhbE9iamVjdC5hc3NpZ247XHJcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBnbG9iYWxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xyXG4gICAgZ2V0T3duUHJvcGVydHlOYW1lcyA9IGdsb2JhbE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzO1xyXG4gICAgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2xvYmFsT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcclxuICAgIGlzID0gZ2xvYmFsT2JqZWN0LmlzO1xyXG4gICAga2V5cyA9IGdsb2JhbE9iamVjdC5rZXlzO1xyXG59XHJcbmVsc2Uge1xyXG4gICAga2V5cyA9IGZ1bmN0aW9uIHN5bWJvbEF3YXJlS2V5cyhvKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG8pLmZpbHRlcigoa2V5KSA9PiAhQm9vbGVhbihrZXkubWF0Y2goL15AQC4rLykpKTtcclxuICAgIH07XHJcbiAgICBhc3NpZ24gPSBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCAuLi5zb3VyY2VzKSB7XHJcbiAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIC8vIFR5cGVFcnJvciBpZiB1bmRlZmluZWQgb3IgbnVsbFxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdG8gPSBPYmplY3QodGFyZ2V0KTtcclxuICAgICAgICBzb3VyY2VzLmZvckVhY2goKG5leHRTb3VyY2UpID0+IHtcclxuICAgICAgICAgICAgaWYgKG5leHRTb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgIC8vIFNraXAgb3ZlciBpZiB1bmRlZmluZWQgb3IgbnVsbFxyXG4gICAgICAgICAgICAgICAga2V5cyhuZXh0U291cmNlKS5mb3JFYWNoKChuZXh0S2V5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9bbmV4dEtleV0gPSBuZXh0U291cmNlW25leHRLZXldO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdG87XHJcbiAgICB9O1xyXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8sIHByb3ApIHtcclxuICAgICAgICBpZiAoaXNTeW1ib2wocHJvcCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobywgcHJvcCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvLCBwcm9wKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMobykge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvKS5maWx0ZXIoKGtleSkgPT4gIUJvb2xlYW4oa2V5Lm1hdGNoKC9eQEAuKy8pKSk7XHJcbiAgICB9O1xyXG4gICAgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKG8pIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobylcclxuICAgICAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBCb29sZWFuKGtleS5tYXRjaCgvXkBALisvKSkpXHJcbiAgICAgICAgICAgIC5tYXAoKGtleSkgPT4gU3ltYm9sLmZvcihrZXkuc3Vic3RyaW5nKDIpKSk7XHJcbiAgICB9O1xyXG4gICAgaXMgPSBmdW5jdGlvbiBpcyh2YWx1ZTEsIHZhbHVlMikge1xyXG4gICAgICAgIGlmICh2YWx1ZTEgPT09IHZhbHVlMikge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUxICE9PSAwIHx8IDEgLyB2YWx1ZTEgPT09IDEgLyB2YWx1ZTI7IC8vIC0wXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWx1ZTEgIT09IHZhbHVlMSAmJiB2YWx1ZTIgIT09IHZhbHVlMjsgLy8gTmFOXHJcbiAgICB9O1xyXG59XHJcbmlmICh0cnVlKSB7XHJcbiAgICBjb25zdCBnbG9iYWxPYmplY3QgPSBnbG9iYWwuT2JqZWN0O1xyXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA9IGdsb2JhbE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzO1xyXG4gICAgZW50cmllcyA9IGdsb2JhbE9iamVjdC5lbnRyaWVzO1xyXG4gICAgdmFsdWVzID0gZ2xvYmFsT2JqZWN0LnZhbHVlcztcclxufVxyXG5lbHNlIHtcclxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG8pIHtcclxuICAgICAgICByZXR1cm4gZ2V0T3duUHJvcGVydHlOYW1lcyhvKS5yZWR1Y2UoKHByZXZpb3VzLCBrZXkpID0+IHtcclxuICAgICAgICAgICAgcHJldmlvdXNba2V5XSA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihvLCBrZXkpO1xyXG4gICAgICAgICAgICByZXR1cm4gcHJldmlvdXM7XHJcbiAgICAgICAgfSwge30pO1xyXG4gICAgfTtcclxuICAgIGVudHJpZXMgPSBmdW5jdGlvbiBlbnRyaWVzKG8pIHtcclxuICAgICAgICByZXR1cm4ga2V5cyhvKS5tYXAoKGtleSkgPT4gW2tleSwgb1trZXldXSk7XHJcbiAgICB9O1xyXG4gICAgdmFsdWVzID0gZnVuY3Rpb24gdmFsdWVzKG8pIHtcclxuICAgICAgICByZXR1cm4ga2V5cyhvKS5tYXAoKGtleSkgPT4gb1trZXldKTtcclxuICAgIH07XHJcbn1cclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b2JqZWN0Lm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL29iamVjdC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vb2JqZWN0Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4vZ2xvYmFsJztcclxuaW1wb3J0IGhhcyBmcm9tICcuL3N1cHBvcnQvaGFzJztcclxuaW1wb3J0IHsgd3JhcE5hdGl2ZSB9IGZyb20gJy4vc3VwcG9ydC91dGlsJztcclxuLyoqXHJcbiAqIFRoZSBtaW5pbXVtIGxvY2F0aW9uIG9mIGhpZ2ggc3Vycm9nYXRlc1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEhJR0hfU1VSUk9HQVRFX01JTiA9IDB4ZDgwMDtcclxuLyoqXHJcbiAqIFRoZSBtYXhpbXVtIGxvY2F0aW9uIG9mIGhpZ2ggc3Vycm9nYXRlc1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEhJR0hfU1VSUk9HQVRFX01BWCA9IDB4ZGJmZjtcclxuLyoqXHJcbiAqIFRoZSBtaW5pbXVtIGxvY2F0aW9uIG9mIGxvdyBzdXJyb2dhdGVzXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTE9XX1NVUlJPR0FURV9NSU4gPSAweGRjMDA7XHJcbi8qKlxyXG4gKiBUaGUgbWF4aW11bSBsb2NhdGlvbiBvZiBsb3cgc3Vycm9nYXRlc1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IExPV19TVVJST0dBVEVfTUFYID0gMHhkZmZmO1xyXG4vKiBFUzYgc3RhdGljIG1ldGhvZHMgKi9cclxuLyoqXHJcbiAqIFJldHVybiB0aGUgU3RyaW5nIHZhbHVlIHdob3NlIGVsZW1lbnRzIGFyZSwgaW4gb3JkZXIsIHRoZSBlbGVtZW50cyBpbiB0aGUgTGlzdCBlbGVtZW50cy5cclxuICogSWYgbGVuZ3RoIGlzIDAsIHRoZSBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuXHJcbiAqIEBwYXJhbSBjb2RlUG9pbnRzIFRoZSBjb2RlIHBvaW50cyB0byBnZW5lcmF0ZSB0aGUgc3RyaW5nXHJcbiAqL1xyXG5leHBvcnQgbGV0IGZyb21Db2RlUG9pbnQ7XHJcbi8qKlxyXG4gKiBgcmF3YCBpcyBpbnRlbmRlZCBmb3IgdXNlIGFzIGEgdGFnIGZ1bmN0aW9uIG9mIGEgVGFnZ2VkIFRlbXBsYXRlIFN0cmluZy4gV2hlbiBjYWxsZWRcclxuICogYXMgc3VjaCB0aGUgZmlyc3QgYXJndW1lbnQgd2lsbCBiZSBhIHdlbGwgZm9ybWVkIHRlbXBsYXRlIGNhbGwgc2l0ZSBvYmplY3QgYW5kIHRoZSByZXN0XHJcbiAqIHBhcmFtZXRlciB3aWxsIGNvbnRhaW4gdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMuXHJcbiAqIEBwYXJhbSB0ZW1wbGF0ZSBBIHdlbGwtZm9ybWVkIHRlbXBsYXRlIHN0cmluZyBjYWxsIHNpdGUgcmVwcmVzZW50YXRpb24uXHJcbiAqIEBwYXJhbSBzdWJzdGl0dXRpb25zIEEgc2V0IG9mIHN1YnN0aXR1dGlvbiB2YWx1ZXMuXHJcbiAqL1xyXG5leHBvcnQgbGV0IHJhdztcclxuLyogRVM2IGluc3RhbmNlIG1ldGhvZHMgKi9cclxuLyoqXHJcbiAqIFJldHVybnMgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIE51bWJlciBsZXNzIHRoYW4gMTExNDExMiAoMHgxMTAwMDApIHRoYXQgaXMgdGhlIGNvZGUgcG9pbnRcclxuICogdmFsdWUgb2YgdGhlIFVURi0xNiBlbmNvZGVkIGNvZGUgcG9pbnQgc3RhcnRpbmcgYXQgdGhlIHN0cmluZyBlbGVtZW50IGF0IHBvc2l0aW9uIHBvcyBpblxyXG4gKiB0aGUgU3RyaW5nIHJlc3VsdGluZyBmcm9tIGNvbnZlcnRpbmcgdGhpcyBvYmplY3QgdG8gYSBTdHJpbmcuXHJcbiAqIElmIHRoZXJlIGlzIG5vIGVsZW1lbnQgYXQgdGhhdCBwb3NpdGlvbiwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuXHJcbiAqIElmIGEgdmFsaWQgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlyIGRvZXMgbm90IGJlZ2luIGF0IHBvcywgdGhlIHJlc3VsdCBpcyB0aGUgY29kZSB1bml0IGF0IHBvcy5cclxuICovXHJcbmV4cG9ydCBsZXQgY29kZVBvaW50QXQ7XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcXVlbmNlIG9mIGVsZW1lbnRzIG9mIHNlYXJjaFN0cmluZyBjb252ZXJ0ZWQgdG8gYSBTdHJpbmcgaXMgdGhlXHJcbiAqIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgdGhpcyBvYmplY3QgKGNvbnZlcnRlZCB0byBhIFN0cmluZykgc3RhcnRpbmcgYXRcclxuICogZW5kUG9zaXRpb24g4oCTIGxlbmd0aCh0aGlzKS4gT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuXHJcbiAqL1xyXG5leHBvcnQgbGV0IGVuZHNXaXRoO1xyXG4vKipcclxuICogUmV0dXJucyB0cnVlIGlmIHNlYXJjaFN0cmluZyBhcHBlYXJzIGFzIGEgc3Vic3RyaW5nIG9mIHRoZSByZXN1bHQgb2YgY29udmVydGluZyB0aGlzXHJcbiAqIG9iamVjdCB0byBhIFN0cmluZywgYXQgb25lIG9yIG1vcmUgcG9zaXRpb25zIHRoYXQgYXJlXHJcbiAqIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBwb3NpdGlvbjsgb3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlLlxyXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgc3RyaW5nXHJcbiAqIEBwYXJhbSBzZWFyY2hTdHJpbmcgc2VhcmNoIHN0cmluZ1xyXG4gKiBAcGFyYW0gcG9zaXRpb24gSWYgcG9zaXRpb24gaXMgdW5kZWZpbmVkLCAwIGlzIGFzc3VtZWQsIHNvIGFzIHRvIHNlYXJjaCBhbGwgb2YgdGhlIFN0cmluZy5cclxuICovXHJcbmV4cG9ydCBsZXQgaW5jbHVkZXM7XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBTdHJpbmcgdmFsdWUgcmVzdWx0IG9mIG5vcm1hbGl6aW5nIHRoZSBzdHJpbmcgaW50byB0aGUgbm9ybWFsaXphdGlvbiBmb3JtXHJcbiAqIG5hbWVkIGJ5IGZvcm0gYXMgc3BlY2lmaWVkIGluIFVuaWNvZGUgU3RhbmRhcmQgQW5uZXggIzE1LCBVbmljb2RlIE5vcm1hbGl6YXRpb24gRm9ybXMuXHJcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBzdHJpbmdcclxuICogQHBhcmFtIGZvcm0gQXBwbGljYWJsZSB2YWx1ZXM6IFwiTkZDXCIsIFwiTkZEXCIsIFwiTkZLQ1wiLCBvciBcIk5GS0RcIiwgSWYgbm90IHNwZWNpZmllZCBkZWZhdWx0XHJcbiAqIGlzIFwiTkZDXCJcclxuICovXHJcbmV4cG9ydCBsZXQgbm9ybWFsaXplO1xyXG4vKipcclxuICogUmV0dXJucyBhIFN0cmluZyB2YWx1ZSB0aGF0IGlzIG1hZGUgZnJvbSBjb3VudCBjb3BpZXMgYXBwZW5kZWQgdG9nZXRoZXIuIElmIGNvdW50IGlzIDAsXHJcbiAqIFQgaXMgdGhlIGVtcHR5IFN0cmluZyBpcyByZXR1cm5lZC5cclxuICogQHBhcmFtIGNvdW50IG51bWJlciBvZiBjb3BpZXMgdG8gYXBwZW5kXHJcbiAqL1xyXG5leHBvcnQgbGV0IHJlcGVhdDtcclxuLyoqXHJcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VxdWVuY2Ugb2YgZWxlbWVudHMgb2Ygc2VhcmNoU3RyaW5nIGNvbnZlcnRlZCB0byBhIFN0cmluZyBpcyB0aGVcclxuICogc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiB0aGlzIG9iamVjdCAoY29udmVydGVkIHRvIGEgU3RyaW5nKSBzdGFydGluZyBhdFxyXG4gKiBwb3NpdGlvbi4gT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuXHJcbiAqL1xyXG5leHBvcnQgbGV0IHN0YXJ0c1dpdGg7XHJcbi8qIEVTNyBpbnN0YW5jZSBtZXRob2RzICovXHJcbi8qKlxyXG4gKiBQYWRzIHRoZSBjdXJyZW50IHN0cmluZyB3aXRoIGEgZ2l2ZW4gc3RyaW5nIChwb3NzaWJseSByZXBlYXRlZCkgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHN0cmluZyByZWFjaGVzIGEgZ2l2ZW4gbGVuZ3RoLlxyXG4gKiBUaGUgcGFkZGluZyBpcyBhcHBsaWVkIGZyb20gdGhlIGVuZCAocmlnaHQpIG9mIHRoZSBjdXJyZW50IHN0cmluZy5cclxuICpcclxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHN0cmluZ1xyXG4gKiBAcGFyYW0gbWF4TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcgb25jZSB0aGUgY3VycmVudCBzdHJpbmcgaGFzIGJlZW4gcGFkZGVkLlxyXG4gKiAgICAgICAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgc21hbGxlciB0aGFuIHRoZSBjdXJyZW50IHN0cmluZydzIGxlbmd0aCwgdGhlIGN1cnJlbnQgc3RyaW5nIHdpbGwgYmUgcmV0dXJuZWQgYXMgaXQgaXMuXHJcbiAqXHJcbiAqIEBwYXJhbSBmaWxsU3RyaW5nIFRoZSBzdHJpbmcgdG8gcGFkIHRoZSBjdXJyZW50IHN0cmluZyB3aXRoLlxyXG4gKiAgICAgICAgSWYgdGhpcyBzdHJpbmcgaXMgdG9vIGxvbmcsIGl0IHdpbGwgYmUgdHJ1bmNhdGVkIGFuZCB0aGUgbGVmdC1tb3N0IHBhcnQgd2lsbCBiZSBhcHBsaWVkLlxyXG4gKiAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlzIFwiIFwiIChVKzAwMjApLlxyXG4gKi9cclxuZXhwb3J0IGxldCBwYWRFbmQ7XHJcbi8qKlxyXG4gKiBQYWRzIHRoZSBjdXJyZW50IHN0cmluZyB3aXRoIGEgZ2l2ZW4gc3RyaW5nIChwb3NzaWJseSByZXBlYXRlZCkgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHN0cmluZyByZWFjaGVzIGEgZ2l2ZW4gbGVuZ3RoLlxyXG4gKiBUaGUgcGFkZGluZyBpcyBhcHBsaWVkIGZyb20gdGhlIHN0YXJ0IChsZWZ0KSBvZiB0aGUgY3VycmVudCBzdHJpbmcuXHJcbiAqXHJcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBzdHJpbmdcclxuICogQHBhcmFtIG1heExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nIG9uY2UgdGhlIGN1cnJlbnQgc3RyaW5nIGhhcyBiZWVuIHBhZGRlZC5cclxuICogICAgICAgIElmIHRoaXMgcGFyYW1ldGVyIGlzIHNtYWxsZXIgdGhhbiB0aGUgY3VycmVudCBzdHJpbmcncyBsZW5ndGgsIHRoZSBjdXJyZW50IHN0cmluZyB3aWxsIGJlIHJldHVybmVkIGFzIGl0IGlzLlxyXG4gKlxyXG4gKiBAcGFyYW0gZmlsbFN0cmluZyBUaGUgc3RyaW5nIHRvIHBhZCB0aGUgY3VycmVudCBzdHJpbmcgd2l0aC5cclxuICogICAgICAgIElmIHRoaXMgc3RyaW5nIGlzIHRvbyBsb25nLCBpdCB3aWxsIGJlIHRydW5jYXRlZCBhbmQgdGhlIGxlZnQtbW9zdCBwYXJ0IHdpbGwgYmUgYXBwbGllZC5cclxuICogICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciBpcyBcIiBcIiAoVSswMDIwKS5cclxuICovXHJcbmV4cG9ydCBsZXQgcGFkU3RhcnQ7XHJcbmlmICh0cnVlICYmIHRydWUpIHtcclxuICAgIGZyb21Db2RlUG9pbnQgPSBnbG9iYWwuU3RyaW5nLmZyb21Db2RlUG9pbnQ7XHJcbiAgICByYXcgPSBnbG9iYWwuU3RyaW5nLnJhdztcclxuICAgIGNvZGVQb2ludEF0ID0gd3JhcE5hdGl2ZShnbG9iYWwuU3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdCk7XHJcbiAgICBlbmRzV2l0aCA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUuZW5kc1dpdGgpO1xyXG4gICAgaW5jbHVkZXMgPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzKTtcclxuICAgIG5vcm1hbGl6ZSA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUubm9ybWFsaXplKTtcclxuICAgIHJlcGVhdCA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUucmVwZWF0KTtcclxuICAgIHN0YXJ0c1dpdGggPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGgpO1xyXG59XHJcbmVsc2Uge1xyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGF0ZXMgdGhhdCB0ZXh0IGlzIGRlZmluZWQsIGFuZCBub3JtYWxpemVzIHBvc2l0aW9uIChiYXNlZCBvbiB0aGUgZ2l2ZW4gZGVmYXVsdCBpZiB0aGUgaW5wdXQgaXMgTmFOKS5cclxuICAgICAqIFVzZWQgYnkgc3RhcnRzV2l0aCwgaW5jbHVkZXMsIGFuZCBlbmRzV2l0aC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIE5vcm1hbGl6ZWQgcG9zaXRpb24uXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IG5vcm1hbGl6ZVN1YnN0cmluZ0FyZ3MgPSBmdW5jdGlvbiAobmFtZSwgdGV4dCwgc2VhcmNoLCBwb3NpdGlvbiwgaXNFbmQgPSBmYWxzZSkge1xyXG4gICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RyaW5nLicgKyBuYW1lICsgJyByZXF1aXJlcyBhIHZhbGlkIHN0cmluZyB0byBzZWFyY2ggYWdhaW5zdC4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGV4dC5sZW5ndGg7XHJcbiAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiAhPT0gcG9zaXRpb24gPyAoaXNFbmQgPyBsZW5ndGggOiAwKSA6IHBvc2l0aW9uO1xyXG4gICAgICAgIHJldHVybiBbdGV4dCwgU3RyaW5nKHNlYXJjaCksIE1hdGgubWluKE1hdGgubWF4KHBvc2l0aW9uLCAwKSwgbGVuZ3RoKV07XHJcbiAgICB9O1xyXG4gICAgZnJvbUNvZGVQb2ludCA9IGZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoLi4uY29kZVBvaW50cykge1xyXG4gICAgICAgIC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcuZnJvbUNvZGVQb2ludFxyXG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKCFsZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBmcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xyXG4gICAgICAgIGNvbnN0IE1BWF9TSVpFID0gMHg0MDAwO1xyXG4gICAgICAgIGxldCBjb2RlVW5pdHMgPSBbXTtcclxuICAgICAgICBsZXQgaW5kZXggPSAtMTtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gJyc7XHJcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcclxuICAgICAgICAgICAgbGV0IGNvZGVQb2ludCA9IE51bWJlcihhcmd1bWVudHNbaW5kZXhdKTtcclxuICAgICAgICAgICAgLy8gQ29kZSBwb2ludHMgbXVzdCBiZSBmaW5pdGUgaW50ZWdlcnMgd2l0aGluIHRoZSB2YWxpZCByYW5nZVxyXG4gICAgICAgICAgICBsZXQgaXNWYWxpZCA9IGlzRmluaXRlKGNvZGVQb2ludCkgJiYgTWF0aC5mbG9vcihjb2RlUG9pbnQpID09PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50ID49IDAgJiYgY29kZVBvaW50IDw9IDB4MTBmZmZmO1xyXG4gICAgICAgICAgICBpZiAoIWlzVmFsaWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoJ3N0cmluZy5mcm9tQ29kZVBvaW50OiBJbnZhbGlkIGNvZGUgcG9pbnQgJyArIGNvZGVQb2ludCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA8PSAweGZmZmYpIHtcclxuICAgICAgICAgICAgICAgIC8vIEJNUCBjb2RlIHBvaW50XHJcbiAgICAgICAgICAgICAgICBjb2RlVW5pdHMucHVzaChjb2RlUG9pbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gQXN0cmFsIGNvZGUgcG9pbnQ7IHNwbGl0IGluIHN1cnJvZ2F0ZSBoYWx2ZXNcclxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nI3N1cnJvZ2F0ZS1mb3JtdWxhZVxyXG4gICAgICAgICAgICAgICAgY29kZVBvaW50IC09IDB4MTAwMDA7XHJcbiAgICAgICAgICAgICAgICBsZXQgaGlnaFN1cnJvZ2F0ZSA9IChjb2RlUG9pbnQgPj4gMTApICsgSElHSF9TVVJST0dBVEVfTUlOO1xyXG4gICAgICAgICAgICAgICAgbGV0IGxvd1N1cnJvZ2F0ZSA9IGNvZGVQb2ludCAlIDB4NDAwICsgTE9XX1NVUlJPR0FURV9NSU47XHJcbiAgICAgICAgICAgICAgICBjb2RlVW5pdHMucHVzaChoaWdoU3Vycm9nYXRlLCBsb3dTdXJyb2dhdGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpbmRleCArIDEgPT09IGxlbmd0aCB8fCBjb2RlVW5pdHMubGVuZ3RoID4gTUFYX1NJWkUpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBmcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgY29kZVVuaXRzKTtcclxuICAgICAgICAgICAgICAgIGNvZGVVbml0cy5sZW5ndGggPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9O1xyXG4gICAgcmF3ID0gZnVuY3Rpb24gcmF3KGNhbGxTaXRlLCAuLi5zdWJzdGl0dXRpb25zKSB7XHJcbiAgICAgICAgbGV0IHJhd1N0cmluZ3MgPSBjYWxsU2l0ZS5yYXc7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xyXG4gICAgICAgIGxldCBudW1TdWJzdGl0dXRpb25zID0gc3Vic3RpdHV0aW9ucy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGNhbGxTaXRlID09IG51bGwgfHwgY2FsbFNpdGUucmF3ID09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RyaW5nLnJhdyByZXF1aXJlcyBhIHZhbGlkIGNhbGxTaXRlIG9iamVjdCB3aXRoIGEgcmF3IHZhbHVlJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSByYXdTdHJpbmdzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCArPSByYXdTdHJpbmdzW2ldICsgKGkgPCBudW1TdWJzdGl0dXRpb25zICYmIGkgPCBsZW5ndGggLSAxID8gc3Vic3RpdHV0aW9uc1tpXSA6ICcnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcbiAgICBjb2RlUG9pbnRBdCA9IGZ1bmN0aW9uIGNvZGVQb2ludEF0KHRleHQsIHBvc2l0aW9uID0gMCkge1xyXG4gICAgICAgIC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0XHJcbiAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJpbmcuY29kZVBvaW50QXQgcmVxdXJpZXMgYSB2YWxpZCBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRleHQubGVuZ3RoO1xyXG4gICAgICAgIGlmIChwb3NpdGlvbiAhPT0gcG9zaXRpb24pIHtcclxuICAgICAgICAgICAgcG9zaXRpb24gPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID49IGxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBHZXQgdGhlIGZpcnN0IGNvZGUgdW5pdFxyXG4gICAgICAgIGNvbnN0IGZpcnN0ID0gdGV4dC5jaGFyQ29kZUF0KHBvc2l0aW9uKTtcclxuICAgICAgICBpZiAoZmlyc3QgPj0gSElHSF9TVVJST0dBVEVfTUlOICYmIGZpcnN0IDw9IEhJR0hfU1VSUk9HQVRFX01BWCAmJiBsZW5ndGggPiBwb3NpdGlvbiArIDEpIHtcclxuICAgICAgICAgICAgLy8gU3RhcnQgb2YgYSBzdXJyb2dhdGUgcGFpciAoaGlnaCBzdXJyb2dhdGUgYW5kIHRoZXJlIGlzIGEgbmV4dCBjb2RlIHVuaXQpOyBjaGVjayBmb3IgbG93IHN1cnJvZ2F0ZVxyXG4gICAgICAgICAgICAvLyBodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZyNzdXJyb2dhdGUtZm9ybXVsYWVcclxuICAgICAgICAgICAgY29uc3Qgc2Vjb25kID0gdGV4dC5jaGFyQ29kZUF0KHBvc2l0aW9uICsgMSk7XHJcbiAgICAgICAgICAgIGlmIChzZWNvbmQgPj0gTE9XX1NVUlJPR0FURV9NSU4gJiYgc2Vjb25kIDw9IExPV19TVVJST0dBVEVfTUFYKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKGZpcnN0IC0gSElHSF9TVVJST0dBVEVfTUlOKSAqIDB4NDAwICsgc2Vjb25kIC0gTE9XX1NVUlJPR0FURV9NSU4gKyAweDEwMDAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmaXJzdDtcclxuICAgIH07XHJcbiAgICBlbmRzV2l0aCA9IGZ1bmN0aW9uIGVuZHNXaXRoKHRleHQsIHNlYXJjaCwgZW5kUG9zaXRpb24pIHtcclxuICAgICAgICBpZiAoZW5kUG9zaXRpb24gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBlbmRQb3NpdGlvbiA9IHRleHQubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBbdGV4dCwgc2VhcmNoLCBlbmRQb3NpdGlvbl0gPSBub3JtYWxpemVTdWJzdHJpbmdBcmdzKCdlbmRzV2l0aCcsIHRleHQsIHNlYXJjaCwgZW5kUG9zaXRpb24sIHRydWUpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gZW5kUG9zaXRpb24gLSBzZWFyY2gubGVuZ3RoO1xyXG4gICAgICAgIGlmIChzdGFydCA8IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGV4dC5zbGljZShzdGFydCwgZW5kUG9zaXRpb24pID09PSBzZWFyY2g7XHJcbiAgICB9O1xyXG4gICAgaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyh0ZXh0LCBzZWFyY2gsIHBvc2l0aW9uID0gMCkge1xyXG4gICAgICAgIFt0ZXh0LCBzZWFyY2gsIHBvc2l0aW9uXSA9IG5vcm1hbGl6ZVN1YnN0cmluZ0FyZ3MoJ2luY2x1ZGVzJywgdGV4dCwgc2VhcmNoLCBwb3NpdGlvbik7XHJcbiAgICAgICAgcmV0dXJuIHRleHQuaW5kZXhPZihzZWFyY2gsIHBvc2l0aW9uKSAhPT0gLTE7XHJcbiAgICB9O1xyXG4gICAgcmVwZWF0ID0gZnVuY3Rpb24gcmVwZWF0KHRleHQsIGNvdW50ID0gMCkge1xyXG4gICAgICAgIC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcucHJvdG90eXBlLnJlcGVhdFxyXG4gICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RyaW5nLnJlcGVhdCByZXF1aXJlcyBhIHZhbGlkIHN0cmluZy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvdW50ICE9PSBjb3VudCkge1xyXG4gICAgICAgICAgICBjb3VudCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb3VudCA8IDAgfHwgY291bnQgPT09IEluZmluaXR5KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdzdHJpbmcucmVwZWF0IHJlcXVpcmVzIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSBjb3VudC4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xyXG4gICAgICAgIHdoaWxlIChjb3VudCkge1xyXG4gICAgICAgICAgICBpZiAoY291bnQgJSAyKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gdGV4dDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY291bnQgPiAxKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ICs9IHRleHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY291bnQgPj49IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9O1xyXG4gICAgc3RhcnRzV2l0aCA9IGZ1bmN0aW9uIHN0YXJ0c1dpdGgodGV4dCwgc2VhcmNoLCBwb3NpdGlvbiA9IDApIHtcclxuICAgICAgICBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoKTtcclxuICAgICAgICBbdGV4dCwgc2VhcmNoLCBwb3NpdGlvbl0gPSBub3JtYWxpemVTdWJzdHJpbmdBcmdzKCdzdGFydHNXaXRoJywgdGV4dCwgc2VhcmNoLCBwb3NpdGlvbik7XHJcbiAgICAgICAgY29uc3QgZW5kID0gcG9zaXRpb24gKyBzZWFyY2gubGVuZ3RoO1xyXG4gICAgICAgIGlmIChlbmQgPiB0ZXh0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKHBvc2l0aW9uLCBlbmQpID09PSBzZWFyY2g7XHJcbiAgICB9O1xyXG59XHJcbmlmICh0cnVlKSB7XHJcbiAgICBwYWRFbmQgPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLnBhZEVuZCk7XHJcbiAgICBwYWRTdGFydCA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUucGFkU3RhcnQpO1xyXG59XHJcbmVsc2Uge1xyXG4gICAgcGFkRW5kID0gZnVuY3Rpb24gcGFkRW5kKHRleHQsIG1heExlbmd0aCwgZmlsbFN0cmluZyA9ICcgJykge1xyXG4gICAgICAgIGlmICh0ZXh0ID09PSBudWxsIHx8IHRleHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJpbmcucmVwZWF0IHJlcXVpcmVzIGEgdmFsaWQgc3RyaW5nLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobWF4TGVuZ3RoID09PSBJbmZpbml0eSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc3RyaW5nLnBhZEVuZCByZXF1aXJlcyBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgY291bnQuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtYXhMZW5ndGggPT09IG51bGwgfHwgbWF4TGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbWF4TGVuZ3RoIDwgMCkge1xyXG4gICAgICAgICAgICBtYXhMZW5ndGggPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgc3RyVGV4dCA9IFN0cmluZyh0ZXh0KTtcclxuICAgICAgICBjb25zdCBwYWRkaW5nID0gbWF4TGVuZ3RoIC0gc3RyVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgaWYgKHBhZGRpbmcgPiAwKSB7XHJcbiAgICAgICAgICAgIHN0clRleHQgKz1cclxuICAgICAgICAgICAgICAgIHJlcGVhdChmaWxsU3RyaW5nLCBNYXRoLmZsb29yKHBhZGRpbmcgLyBmaWxsU3RyaW5nLmxlbmd0aCkpICtcclxuICAgICAgICAgICAgICAgICAgICBmaWxsU3RyaW5nLnNsaWNlKDAsIHBhZGRpbmcgJSBmaWxsU3RyaW5nLmxlbmd0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdHJUZXh0O1xyXG4gICAgfTtcclxuICAgIHBhZFN0YXJ0ID0gZnVuY3Rpb24gcGFkU3RhcnQodGV4dCwgbWF4TGVuZ3RoLCBmaWxsU3RyaW5nID0gJyAnKSB7XHJcbiAgICAgICAgaWYgKHRleHQgPT09IG51bGwgfHwgdGV4dCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmluZy5yZXBlYXQgcmVxdWlyZXMgYSB2YWxpZCBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtYXhMZW5ndGggPT09IEluZmluaXR5KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdzdHJpbmcucGFkU3RhcnQgcmVxdWlyZXMgYSBub24tbmVnYXRpdmUgZmluaXRlIGNvdW50LicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobWF4TGVuZ3RoID09PSBudWxsIHx8IG1heExlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IG1heExlbmd0aCA8IDApIHtcclxuICAgICAgICAgICAgbWF4TGVuZ3RoID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHN0clRleHQgPSBTdHJpbmcodGV4dCk7XHJcbiAgICAgICAgY29uc3QgcGFkZGluZyA9IG1heExlbmd0aCAtIHN0clRleHQubGVuZ3RoO1xyXG4gICAgICAgIGlmIChwYWRkaW5nID4gMCkge1xyXG4gICAgICAgICAgICBzdHJUZXh0ID1cclxuICAgICAgICAgICAgICAgIHJlcGVhdChmaWxsU3RyaW5nLCBNYXRoLmZsb29yKHBhZGRpbmcgLyBmaWxsU3RyaW5nLmxlbmd0aCkpICtcclxuICAgICAgICAgICAgICAgICAgICBmaWxsU3RyaW5nLnNsaWNlKDAsIHBhZGRpbmcgJSBmaWxsU3RyaW5nLmxlbmd0aCkgK1xyXG4gICAgICAgICAgICAgICAgICAgIHN0clRleHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdHJUZXh0O1xyXG4gICAgfTtcclxufVxyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmcubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vc3RyaW5nLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdHJpbmcubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCBoYXMsIHsgYWRkIH0gZnJvbSAnQGRvam8vaGFzL2hhcyc7XHJcbmltcG9ydCBnbG9iYWwgZnJvbSAnLi4vZ2xvYmFsJztcclxuZXhwb3J0IGRlZmF1bHQgaGFzO1xyXG5leHBvcnQgKiBmcm9tICdAZG9qby9oYXMvaGFzJztcclxuLyogRUNNQVNjcmlwdCA2IGFuZCA3IEZlYXR1cmVzICovXHJcbi8qIEFycmF5ICovXHJcbmFkZCgnZXM2LWFycmF5JywgKCkgPT4ge1xyXG4gICAgcmV0dXJuIChbJ2Zyb20nLCAnb2YnXS5ldmVyeSgoa2V5KSA9PiBrZXkgaW4gZ2xvYmFsLkFycmF5KSAmJlxyXG4gICAgICAgIFsnZmluZEluZGV4JywgJ2ZpbmQnLCAnY29weVdpdGhpbiddLmV2ZXJ5KChrZXkpID0+IGtleSBpbiBnbG9iYWwuQXJyYXkucHJvdG90eXBlKSk7XHJcbn0sIHRydWUpO1xyXG5hZGQoJ2VzNi1hcnJheS1maWxsJywgKCkgPT4ge1xyXG4gICAgaWYgKCdmaWxsJyBpbiBnbG9iYWwuQXJyYXkucHJvdG90eXBlKSB7XHJcbiAgICAgICAgLyogU29tZSB2ZXJzaW9ucyBvZiBTYWZhcmkgZG8gbm90IHByb3Blcmx5IGltcGxlbWVudCB0aGlzICovXHJcbiAgICAgICAgcmV0dXJuIFsxXS5maWxsKDksIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSlbMF0gPT09IDE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn0sIHRydWUpO1xyXG5hZGQoJ2VzNy1hcnJheScsICgpID0+ICdpbmNsdWRlcycgaW4gZ2xvYmFsLkFycmF5LnByb3RvdHlwZSwgdHJ1ZSk7XHJcbi8qIE1hcCAqL1xyXG5hZGQoJ2VzNi1tYXAnLCAoKSA9PiB7XHJcbiAgICBpZiAodHlwZW9mIGdsb2JhbC5NYXAgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAvKlxyXG4gICAgSUUxMSBhbmQgb2xkZXIgdmVyc2lvbnMgb2YgU2FmYXJpIGFyZSBtaXNzaW5nIGNyaXRpY2FsIEVTNiBNYXAgZnVuY3Rpb25hbGl0eVxyXG4gICAgV2Ugd3JhcCB0aGlzIGluIGEgdHJ5L2NhdGNoIGJlY2F1c2Ugc29tZXRpbWVzIHRoZSBNYXAgY29uc3RydWN0b3IgZXhpc3RzLCBidXQgZG9lcyBub3RcclxuICAgIHRha2UgYXJndW1lbnRzIChpT1MgOC40KVxyXG4gICAgICovXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgbWFwID0gbmV3IGdsb2JhbC5NYXAoW1swLCAxXV0pO1xyXG4gICAgICAgICAgICByZXR1cm4gbWFwLmhhcygwKSAmJlxyXG4gICAgICAgICAgICAgICAgdHlwZW9mIG1hcC5rZXlzID09PSAnZnVuY3Rpb24nICYmXHJcbiAgICAgICAgICAgICAgICB0cnVlICYmXHJcbiAgICAgICAgICAgICAgICB0eXBlb2YgbWFwLnZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyAmJlxyXG4gICAgICAgICAgICAgICAgdHlwZW9mIG1hcC5lbnRyaWVzID09PSAnZnVuY3Rpb24nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogbm90IHRlc3Rpbmcgb24gaU9TIGF0IHRoZSBtb21lbnQgKi9cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxufSwgdHJ1ZSk7XHJcbi8qIE1hdGggKi9cclxuYWRkKCdlczYtbWF0aCcsICgpID0+IHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgICAgJ2NsejMyJyxcclxuICAgICAgICAnc2lnbicsXHJcbiAgICAgICAgJ2xvZzEwJyxcclxuICAgICAgICAnbG9nMicsXHJcbiAgICAgICAgJ2xvZzFwJyxcclxuICAgICAgICAnZXhwbTEnLFxyXG4gICAgICAgICdjb3NoJyxcclxuICAgICAgICAnc2luaCcsXHJcbiAgICAgICAgJ3RhbmgnLFxyXG4gICAgICAgICdhY29zaCcsXHJcbiAgICAgICAgJ2FzaW5oJyxcclxuICAgICAgICAnYXRhbmgnLFxyXG4gICAgICAgICd0cnVuYycsXHJcbiAgICAgICAgJ2Zyb3VuZCcsXHJcbiAgICAgICAgJ2NicnQnLFxyXG4gICAgICAgICdoeXBvdCdcclxuICAgIF0uZXZlcnkoKG5hbWUpID0+IHR5cGVvZiBnbG9iYWwuTWF0aFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJyk7XHJcbn0sIHRydWUpO1xyXG5hZGQoJ2VzNi1tYXRoLWltdWwnLCAoKSA9PiB7XHJcbiAgICBpZiAoJ2ltdWwnIGluIGdsb2JhbC5NYXRoKSB7XHJcbiAgICAgICAgLyogU29tZSB2ZXJzaW9ucyBvZiBTYWZhcmkgb24gaW9zIGRvIG5vdCBwcm9wZXJseSBpbXBsZW1lbnQgdGhpcyAqL1xyXG4gICAgICAgIHJldHVybiBNYXRoLmltdWwoMHhmZmZmZmZmZiwgNSkgPT09IC01O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59LCB0cnVlKTtcclxuLyogT2JqZWN0ICovXHJcbmFkZCgnZXM2LW9iamVjdCcsICgpID0+IHtcclxuICAgIHJldHVybiB0cnVlICYmXHJcbiAgICAgICAgWydhc3NpZ24nLCAnaXMnLCAnZ2V0T3duUHJvcGVydHlTeW1ib2xzJywgJ3NldFByb3RvdHlwZU9mJ10uZXZlcnkoKG5hbWUpID0+IHR5cGVvZiBnbG9iYWwuT2JqZWN0W25hbWVdID09PSAnZnVuY3Rpb24nKTtcclxufSwgdHJ1ZSk7XHJcbmFkZCgnZXMyMDE3LW9iamVjdCcsICgpID0+IHtcclxuICAgIHJldHVybiBbJ3ZhbHVlcycsICdlbnRyaWVzJywgJ2dldE93blByb3BlcnR5RGVzY3JpcHRvcnMnXS5ldmVyeSgobmFtZSkgPT4gdHlwZW9mIGdsb2JhbC5PYmplY3RbbmFtZV0gPT09ICdmdW5jdGlvbicpO1xyXG59LCB0cnVlKTtcclxuLyogT2JzZXJ2YWJsZSAqL1xyXG5hZGQoJ2VzLW9ic2VydmFibGUnLCAoKSA9PiB0eXBlb2YgZ2xvYmFsLk9ic2VydmFibGUgIT09ICd1bmRlZmluZWQnLCB0cnVlKTtcclxuLyogUHJvbWlzZSAqL1xyXG5hZGQoJ2VzNi1wcm9taXNlJywgKCkgPT4gdHlwZW9mIGdsb2JhbC5Qcm9taXNlICE9PSAndW5kZWZpbmVkJyAmJiB0cnVlLCB0cnVlKTtcclxuLyogU2V0ICovXHJcbmFkZCgnZXM2LXNldCcsICgpID0+IHtcclxuICAgIGlmICh0eXBlb2YgZ2xvYmFsLlNldCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIC8qIElFMTEgYW5kIG9sZGVyIHZlcnNpb25zIG9mIFNhZmFyaSBhcmUgbWlzc2luZyBjcml0aWNhbCBFUzYgU2V0IGZ1bmN0aW9uYWxpdHkgKi9cclxuICAgICAgICBjb25zdCBzZXQgPSBuZXcgZ2xvYmFsLlNldChbMV0pO1xyXG4gICAgICAgIHJldHVybiBzZXQuaGFzKDEpICYmICdrZXlzJyBpbiBzZXQgJiYgdHlwZW9mIHNldC5rZXlzID09PSAnZnVuY3Rpb24nICYmIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn0sIHRydWUpO1xyXG4vKiBTdHJpbmcgKi9cclxuYWRkKCdlczYtc3RyaW5nJywgKCkgPT4ge1xyXG4gICAgcmV0dXJuIChbXHJcbiAgICAgICAgLyogc3RhdGljIG1ldGhvZHMgKi9cclxuICAgICAgICAnZnJvbUNvZGVQb2ludCdcclxuICAgIF0uZXZlcnkoKGtleSkgPT4gdHlwZW9mIGdsb2JhbC5TdHJpbmdba2V5XSA9PT0gJ2Z1bmN0aW9uJykgJiZcclxuICAgICAgICBbXHJcbiAgICAgICAgICAgIC8qIGluc3RhbmNlIG1ldGhvZHMgKi9cclxuICAgICAgICAgICAgJ2NvZGVQb2ludEF0JyxcclxuICAgICAgICAgICAgJ25vcm1hbGl6ZScsXHJcbiAgICAgICAgICAgICdyZXBlYXQnLFxyXG4gICAgICAgICAgICAnc3RhcnRzV2l0aCcsXHJcbiAgICAgICAgICAgICdlbmRzV2l0aCcsXHJcbiAgICAgICAgICAgICdpbmNsdWRlcydcclxuICAgICAgICBdLmV2ZXJ5KChrZXkpID0+IHR5cGVvZiBnbG9iYWwuU3RyaW5nLnByb3RvdHlwZVtrZXldID09PSAnZnVuY3Rpb24nKSk7XHJcbn0sIHRydWUpO1xyXG5hZGQoJ2VzNi1zdHJpbmctcmF3JywgKCkgPT4ge1xyXG4gICAgZnVuY3Rpb24gZ2V0Q2FsbFNpdGUoY2FsbFNpdGUsIC4uLnN1YnN0aXR1dGlvbnMpIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBbLi4uY2FsbFNpdGVdO1xyXG4gICAgICAgIHJlc3VsdC5yYXcgPSBjYWxsU2l0ZS5yYXc7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIGlmICgncmF3JyBpbiBnbG9iYWwuU3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IGIgPSAxO1xyXG4gICAgICAgIGxldCBjYWxsU2l0ZSA9IGdldENhbGxTaXRlIGBhXFxuJHtifWA7XHJcbiAgICAgICAgY2FsbFNpdGUucmF3ID0gWydhXFxcXG4nXTtcclxuICAgICAgICBjb25zdCBzdXBwb3J0c1RydW5jID0gZ2xvYmFsLlN0cmluZy5yYXcoY2FsbFNpdGUsIDQyKSA9PT0gJ2E6XFxcXG4nO1xyXG4gICAgICAgIHJldHVybiBzdXBwb3J0c1RydW5jO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59LCB0cnVlKTtcclxuYWRkKCdlczIwMTctc3RyaW5nJywgKCkgPT4ge1xyXG4gICAgcmV0dXJuIFsncGFkU3RhcnQnLCAncGFkRW5kJ10uZXZlcnkoKGtleSkgPT4gdHlwZW9mIGdsb2JhbC5TdHJpbmcucHJvdG90eXBlW2tleV0gPT09ICdmdW5jdGlvbicpO1xyXG59LCB0cnVlKTtcclxuLyogU3ltYm9sICovXHJcbmFkZCgnZXM2LXN5bWJvbCcsICgpID0+IHR5cGVvZiBnbG9iYWwuU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgU3ltYm9sKCkgPT09ICdzeW1ib2wnLCB0cnVlKTtcclxuLyogV2Vha01hcCAqL1xyXG5hZGQoJ2VzNi13ZWFrbWFwJywgKCkgPT4ge1xyXG4gICAgaWYgKHR5cGVvZiBnbG9iYWwuV2Vha01hcCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAvKiBJRTExIGFuZCBvbGRlciB2ZXJzaW9ucyBvZiBTYWZhcmkgYXJlIG1pc3NpbmcgY3JpdGljYWwgRVM2IE1hcCBmdW5jdGlvbmFsaXR5ICovXHJcbiAgICAgICAgY29uc3Qga2V5MSA9IHt9O1xyXG4gICAgICAgIGNvbnN0IGtleTIgPSB7fTtcclxuICAgICAgICBjb25zdCBtYXAgPSBuZXcgZ2xvYmFsLldlYWtNYXAoW1trZXkxLCAxXV0pO1xyXG4gICAgICAgIE9iamVjdC5mcmVlemUoa2V5MSk7XHJcbiAgICAgICAgcmV0dXJuIG1hcC5nZXQoa2V5MSkgPT09IDEgJiYgbWFwLnNldChrZXkyLCAyKSA9PT0gbWFwICYmIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn0sIHRydWUpO1xyXG4vKiBNaXNjZWxsYW5lb3VzIGZlYXR1cmVzICovXHJcbmFkZCgnbWljcm90YXNrcycsICgpID0+IHRydWUgfHwgZmFsc2UgfHwgdHJ1ZSwgdHJ1ZSk7XHJcbmFkZCgncG9zdG1lc3NhZ2UnLCAoKSA9PiB7XHJcbiAgICAvLyBJZiB3aW5kb3cgaXMgdW5kZWZpbmVkLCBhbmQgd2UgaGF2ZSBwb3N0TWVzc2FnZSwgaXQgcHJvYmFibHkgbWVhbnMgd2UncmUgaW4gYSB3ZWIgd29ya2VyLiBXZWIgd29ya2VycyBoYXZlXHJcbiAgICAvLyBwb3N0IG1lc3NhZ2UgYnV0IGl0IGRvZXNuJ3Qgd29yayBob3cgd2UgZXhwZWN0IGl0IHRvLCBzbyBpdCdzIGJlc3QganVzdCB0byBwcmV0ZW5kIGl0IGRvZXNuJ3QgZXhpc3QuXHJcbiAgICByZXR1cm4gdHlwZW9mIGdsb2JhbC53aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBnbG9iYWwucG9zdE1lc3NhZ2UgPT09ICdmdW5jdGlvbic7XHJcbn0sIHRydWUpO1xyXG5hZGQoJ3JhZicsICgpID0+IHR5cGVvZiBnbG9iYWwucmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nLCB0cnVlKTtcclxuYWRkKCdzZXRpbW1lZGlhdGUnLCAoKSA9PiB0eXBlb2YgZ2xvYmFsLnNldEltbWVkaWF0ZSAhPT0gJ3VuZGVmaW5lZCcsIHRydWUpO1xyXG4vKiBET00gRmVhdHVyZXMgKi9cclxuYWRkKCdkb20tbXV0YXRpb25vYnNlcnZlcicsICgpID0+IHtcclxuICAgIGlmICh0cnVlICYmIEJvb2xlYW4oZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXIpKSB7XHJcbiAgICAgICAgLy8gSUUxMSBoYXMgYW4gdW5yZWxpYWJsZSBNdXRhdGlvbk9ic2VydmVyIGltcGxlbWVudGF0aW9uIHdoZXJlIHNldFByb3BlcnR5KCkgZG9lcyBub3RcclxuICAgICAgICAvLyBnZW5lcmF0ZSBhIG11dGF0aW9uIGV2ZW50LCBvYnNlcnZlcnMgY2FuIGNyYXNoLCBhbmQgdGhlIHF1ZXVlIGRvZXMgbm90IGRyYWluXHJcbiAgICAgICAgLy8gcmVsaWFibHkuIFRoZSBmb2xsb3dpbmcgZmVhdHVyZSB0ZXN0IHdhcyBhZGFwdGVkIGZyb21cclxuICAgICAgICAvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS90MTBrby80YWNlYjhjNzE2ODFmZGIyNzVlMzNlZmU1ZTU3NmIxNFxyXG4gICAgICAgIGNvbnN0IGV4YW1wbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZSAqL1xyXG4gICAgICAgIGNvbnN0IEhvc3RNdXRhdGlvbk9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XHJcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSG9zdE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKCkgeyB9KTtcclxuICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGV4YW1wbGUsIHsgYXR0cmlidXRlczogdHJ1ZSB9KTtcclxuICAgICAgICBleGFtcGxlLnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywgJ2Jsb2NrJyk7XHJcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4ob2JzZXJ2ZXIudGFrZVJlY29yZHMoKS5sZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59LCB0cnVlKTtcclxuYWRkKCdkb20td2ViYW5pbWF0aW9uJywgKCkgPT4gdHJ1ZSAmJiBnbG9iYWwuQW5pbWF0aW9uICE9PSB1bmRlZmluZWQgJiYgZ2xvYmFsLktleWZyYW1lRWZmZWN0ICE9PSB1bmRlZmluZWQsIHRydWUpO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXMubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vc3VwcG9ydC9oYXMubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL3N1cHBvcnQvaGFzLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4uL2dsb2JhbCc7XHJcbmltcG9ydCBoYXMgZnJvbSAnLi9oYXMnO1xyXG5mdW5jdGlvbiBleGVjdXRlVGFzayhpdGVtKSB7XHJcbiAgICBpZiAoaXRlbSAmJiBpdGVtLmlzQWN0aXZlICYmIGl0ZW0uY2FsbGJhY2spIHtcclxuICAgICAgICBpdGVtLmNhbGxiYWNrKCk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gZ2V0UXVldWVIYW5kbGUoaXRlbSwgZGVzdHJ1Y3Rvcikge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsgfTtcclxuICAgICAgICAgICAgaXRlbS5pc0FjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpdGVtLmNhbGxiYWNrID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKGRlc3RydWN0b3IpIHtcclxuICAgICAgICAgICAgICAgIGRlc3RydWN0b3IoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxubGV0IGNoZWNrTWljcm9UYXNrUXVldWU7XHJcbmxldCBtaWNyb1Rhc2tzO1xyXG4vKipcclxuICogU2NoZWR1bGVzIGEgY2FsbGJhY2sgdG8gdGhlIG1hY3JvdGFzayBxdWV1ZS5cclxuICpcclxuICogQHBhcmFtIGNhbGxiYWNrIHRoZSBmdW5jdGlvbiB0byBiZSBxdWV1ZWQgYW5kIGxhdGVyIGV4ZWN1dGVkLlxyXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBhIGBkZXN0cm95YCBtZXRob2QgdGhhdCwgd2hlbiBjYWxsZWQsIHByZXZlbnRzIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZyb20gZXhlY3V0aW5nLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHF1ZXVlVGFzayA9IChmdW5jdGlvbiAoKSB7XHJcbiAgICBsZXQgZGVzdHJ1Y3RvcjtcclxuICAgIGxldCBlbnF1ZXVlO1xyXG4gICAgLy8gU2luY2UgdGhlIElFIGltcGxlbWVudGF0aW9uIG9mIGBzZXRJbW1lZGlhdGVgIGlzIG5vdCBmbGF3bGVzcywgd2Ugd2lsbCB0ZXN0IGZvciBgcG9zdE1lc3NhZ2VgIGZpcnN0LlxyXG4gICAgaWYgKHRydWUpIHtcclxuICAgICAgICBjb25zdCBxdWV1ZSA9IFtdO1xyXG4gICAgICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIC8vIENvbmZpcm0gdGhhdCB0aGUgZXZlbnQgd2FzIHRyaWdnZXJlZCBieSB0aGUgY3VycmVudCB3aW5kb3cgYW5kIGJ5IHRoaXMgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbi5cclxuICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZSA9PT0gZ2xvYmFsICYmIGV2ZW50LmRhdGEgPT09ICdkb2pvLXF1ZXVlLW1lc3NhZ2UnKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBleGVjdXRlVGFzayhxdWV1ZS5zaGlmdCgpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGVucXVldWUgPSBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICBxdWV1ZS5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoJ2Rvam8tcXVldWUtbWVzc2FnZScsICcqJyk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGZhbHNlKSB7XHJcbiAgICAgICAgZGVzdHJ1Y3RvciA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcclxuICAgICAgICBlbnF1ZXVlID0gZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZShleGVjdXRlVGFzay5iaW5kKG51bGwsIGl0ZW0pKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgZGVzdHJ1Y3RvciA9IGdsb2JhbC5jbGVhclRpbWVvdXQ7XHJcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGV4ZWN1dGVUYXNrLmJpbmQobnVsbCwgaXRlbSksIDApO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBxdWV1ZVRhc2soY2FsbGJhY2spIHtcclxuICAgICAgICBjb25zdCBpdGVtID0ge1xyXG4gICAgICAgICAgICBpc0FjdGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpZCA9IGVucXVldWUoaXRlbSk7XHJcbiAgICAgICAgcmV0dXJuIGdldFF1ZXVlSGFuZGxlKGl0ZW0sIGRlc3RydWN0b3IgJiZcclxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgZGVzdHJ1Y3RvcihpZCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy8gVE9ETzogVXNlIGFzcGVjdC5iZWZvcmUgd2hlbiBpdCBpcyBhdmFpbGFibGUuXHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICAgID8gcXVldWVUYXNrXHJcbiAgICAgICAgOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgY2hlY2tNaWNyb1Rhc2tRdWV1ZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gcXVldWVUYXNrKGNhbGxiYWNrKTtcclxuICAgICAgICB9O1xyXG59KSgpO1xyXG4vLyBXaGVuIG5vIG1lY2hhbmlzbSBmb3IgcmVnaXN0ZXJpbmcgbWljcm90YXNrcyBpcyBleHBvc2VkIGJ5IHRoZSBlbnZpcm9ubWVudCwgbWljcm90YXNrcyB3aWxsXHJcbi8vIGJlIHF1ZXVlZCBhbmQgdGhlbiBleGVjdXRlZCBpbiBhIHNpbmdsZSBtYWNyb3Rhc2sgYmVmb3JlIHRoZSBvdGhlciBtYWNyb3Rhc2tzIGFyZSBleGVjdXRlZC5cclxuaWYgKCF0cnVlKSB7XHJcbiAgICBsZXQgaXNNaWNyb1Rhc2tRdWV1ZWQgPSBmYWxzZTtcclxuICAgIG1pY3JvVGFza3MgPSBbXTtcclxuICAgIGNoZWNrTWljcm9UYXNrUXVldWUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKCFpc01pY3JvVGFza1F1ZXVlZCkge1xyXG4gICAgICAgICAgICBpc01pY3JvVGFza1F1ZXVlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHF1ZXVlVGFzayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpc01pY3JvVGFza1F1ZXVlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgaWYgKG1pY3JvVGFza3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChpdGVtID0gbWljcm9UYXNrcy5zaGlmdCgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlVGFzayhpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuLyoqXHJcbiAqIFNjaGVkdWxlcyBhbiBhbmltYXRpb24gdGFzayB3aXRoIGB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lYCBpZiBpdCBleGlzdHMsIG9yIHdpdGggYHF1ZXVlVGFza2Agb3RoZXJ3aXNlLlxyXG4gKlxyXG4gKiBTaW5jZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUncyBiZWhhdmlvciBkb2VzIG5vdCBtYXRjaCB0aGF0IGV4cGVjdGVkIGZyb20gYHF1ZXVlVGFza2AsIGl0IGlzIG5vdCB1c2VkIHRoZXJlLlxyXG4gKiBIb3dldmVyLCBhdCB0aW1lcyBpdCBtYWtlcyBtb3JlIHNlbnNlIHRvIGRlbGVnYXRlIHRvIHJlcXVlc3RBbmltYXRpb25GcmFtZTsgaGVuY2UgdGhlIGZvbGxvd2luZyBtZXRob2QuXHJcbiAqXHJcbiAqIEBwYXJhbSBjYWxsYmFjayB0aGUgZnVuY3Rpb24gdG8gYmUgcXVldWVkIGFuZCBsYXRlciBleGVjdXRlZC5cclxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggYSBgZGVzdHJveWAgbWV0aG9kIHRoYXQsIHdoZW4gY2FsbGVkLCBwcmV2ZW50cyB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmcm9tIGV4ZWN1dGluZy5cclxuICovXHJcbmV4cG9ydCBjb25zdCBxdWV1ZUFuaW1hdGlvblRhc2sgPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgaWYgKCF0cnVlKSB7XHJcbiAgICAgICAgcmV0dXJuIHF1ZXVlVGFzaztcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHF1ZXVlQW5pbWF0aW9uVGFzayhjYWxsYmFjaykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB7XHJcbiAgICAgICAgICAgIGlzQWN0aXZlOiB0cnVlLFxyXG4gICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2tcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGV4ZWN1dGVUYXNrLmJpbmQobnVsbCwgaXRlbSkpO1xyXG4gICAgICAgIHJldHVybiBnZXRRdWV1ZUhhbmRsZShpdGVtLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vIFRPRE86IFVzZSBhc3BlY3QuYmVmb3JlIHdoZW4gaXQgaXMgYXZhaWxhYmxlLlxyXG4gICAgcmV0dXJuIHRydWVcclxuICAgICAgICA/IHF1ZXVlQW5pbWF0aW9uVGFza1xyXG4gICAgICAgIDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIGNoZWNrTWljcm9UYXNrUXVldWUoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlQW5pbWF0aW9uVGFzayhjYWxsYmFjayk7XHJcbiAgICAgICAgfTtcclxufSkoKTtcclxuLyoqXHJcbiAqIFNjaGVkdWxlcyBhIGNhbGxiYWNrIHRvIHRoZSBtaWNyb3Rhc2sgcXVldWUuXHJcbiAqXHJcbiAqIEFueSBjYWxsYmFja3MgcmVnaXN0ZXJlZCB3aXRoIGBxdWV1ZU1pY3JvVGFza2Agd2lsbCBiZSBleGVjdXRlZCBiZWZvcmUgdGhlIG5leHQgbWFjcm90YXNrLiBJZiBubyBuYXRpdmVcclxuICogbWVjaGFuaXNtIGZvciBzY2hlZHVsaW5nIG1hY3JvdGFza3MgaXMgZXhwb3NlZCwgdGhlbiBhbnkgY2FsbGJhY2tzIHdpbGwgYmUgZmlyZWQgYmVmb3JlIGFueSBtYWNyb3Rhc2tcclxuICogcmVnaXN0ZXJlZCB3aXRoIGBxdWV1ZVRhc2tgIG9yIGBxdWV1ZUFuaW1hdGlvblRhc2tgLlxyXG4gKlxyXG4gKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGJlIHF1ZXVlZCBhbmQgbGF0ZXIgZXhlY3V0ZWQuXHJcbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIGEgYGRlc3Ryb3lgIG1ldGhvZCB0aGF0LCB3aGVuIGNhbGxlZCwgcHJldmVudHMgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnJvbSBleGVjdXRpbmcuXHJcbiAqL1xyXG5leHBvcnQgbGV0IHF1ZXVlTWljcm9UYXNrID0gKGZ1bmN0aW9uICgpIHtcclxuICAgIGxldCBlbnF1ZXVlO1xyXG4gICAgaWYgKGZhbHNlKSB7XHJcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5wcm9jZXNzLm5leHRUaWNrKGV4ZWN1dGVUYXNrLmJpbmQobnVsbCwgaXRlbSkpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0cnVlKSB7XHJcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Qcm9taXNlLnJlc29sdmUoaXRlbSkudGhlbihleGVjdXRlVGFzayk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRydWUpIHtcclxuICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZSAqL1xyXG4gICAgICAgIGNvbnN0IEhvc3RNdXRhdGlvbk9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGNvbnN0IHF1ZXVlID0gW107XHJcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSG9zdE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHF1ZXVlLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLmlzQWN0aXZlICYmIGl0ZW0uY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLmNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBvYnNlcnZlci5vYnNlcnZlKG5vZGUsIHsgYXR0cmlidXRlczogdHJ1ZSB9KTtcclxuICAgICAgICBlbnF1ZXVlID0gZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgcXVldWUucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ3F1ZXVlU3RhdHVzJywgJzEnKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgIGNoZWNrTWljcm9UYXNrUXVldWUoKTtcclxuICAgICAgICAgICAgbWljcm9UYXNrcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHtcclxuICAgICAgICAgICAgaXNBY3RpdmU6IHRydWUsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgZW5xdWV1ZShpdGVtKTtcclxuICAgICAgICByZXR1cm4gZ2V0UXVldWVIYW5kbGUoaXRlbSk7XHJcbiAgICB9O1xyXG59KSgpO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1xdWV1ZS5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdXBwb3J0L3F1ZXVlLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdXBwb3J0L3F1ZXVlLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCIvKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBnZW5lcmF0ZSBhIHZhbHVlIHByb3BlcnR5IGRlc2NyaXB0b3JcbiAqXG4gKiBAcGFyYW0gdmFsdWUgICAgICAgIFRoZSB2YWx1ZSB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciBzaG91bGQgYmUgc2V0IHRvXG4gKiBAcGFyYW0gZW51bWVyYWJsZSAgIElmIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgZW51bWJlcmFibGUsIGRlZmF1bHRzIHRvIGZhbHNlXG4gKiBAcGFyYW0gd3JpdGFibGUgICAgIElmIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgd3JpdGFibGUsIGRlZmF1bHRzIHRvIHRydWVcbiAqIEBwYXJhbSBjb25maWd1cmFibGUgSWYgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBjb25maWd1cmFibGUsIGRlZmF1bHRzIHRvIHRydWVcbiAqIEByZXR1cm4gICAgICAgICAgICAgVGhlIHByb3BlcnR5IGRlc2NyaXB0b3Igb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZURlc2NyaXB0b3IodmFsdWUsIGVudW1lcmFibGUgPSBmYWxzZSwgd3JpdGFibGUgPSB0cnVlLCBjb25maWd1cmFibGUgPSB0cnVlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBlbnVtZXJhYmxlOiBlbnVtZXJhYmxlLFxuICAgICAgICB3cml0YWJsZTogd3JpdGFibGUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogY29uZmlndXJhYmxlXG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3cmFwTmF0aXZlKG5hdGl2ZUZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZUZ1bmN0aW9uLmFwcGx5KHRhcmdldCwgYXJncyk7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWwubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vc3VwcG9ydC91dGlsLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdXBwb3J0L3V0aWwubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCB7IEV2ZW50ZWQgfSBmcm9tICdAZG9qby9jb3JlL0V2ZW50ZWQnO1xuZXhwb3J0IGNsYXNzIEluamVjdG9yIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgY29uc3RydWN0b3IocGF5bG9hZCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9wYXlsb2FkID0gcGF5bG9hZDtcbiAgICB9XG4gICAgc2V0SW52YWxpZGF0b3IoaW52YWxpZGF0b3IpIHtcbiAgICAgICAgdGhpcy5faW52YWxpZGF0b3IgPSBpbnZhbGlkYXRvcjtcbiAgICB9XG4gICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGF5bG9hZDtcbiAgICB9XG4gICAgc2V0KHBheWxvYWQpIHtcbiAgICAgICAgdGhpcy5fcGF5bG9hZCA9IHBheWxvYWQ7XG4gICAgICAgIGlmICh0aGlzLl9pbnZhbGlkYXRvcikge1xuICAgICAgICAgICAgdGhpcy5faW52YWxpZGF0b3IoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IEluamVjdG9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5qZWN0b3IubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL0luamVjdG9yLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvSW5qZWN0b3IubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCB7IEV2ZW50ZWQgfSBmcm9tICdAZG9qby9jb3JlL0V2ZW50ZWQnO1xyXG5pbXBvcnQgTWFwIGZyb20gJ0Bkb2pvL3NoaW0vTWFwJztcclxuLyoqXHJcbiAqIEVudW0gdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgZXZlbnQuXHJcbiAqIExpc3RlbmluZyB0byAnUHJvamVjdG9yJyB3aWxsIG5vdGlmeSB3aGVuIHByb2plY3RvciBpcyBjcmVhdGVkIG9yIHVwZGF0ZWRcclxuICogTGlzdGVuaW5nIHRvICdXaWRnZXQnIHdpbGwgbm90aWZ5IHdoZW4gd2lkZ2V0IHJvb3QgaXMgY3JlYXRlZCBvciB1cGRhdGVkXHJcbiAqL1xyXG5leHBvcnQgdmFyIE5vZGVFdmVudFR5cGU7XHJcbihmdW5jdGlvbiAoTm9kZUV2ZW50VHlwZSkge1xyXG4gICAgTm9kZUV2ZW50VHlwZVtcIlByb2plY3RvclwiXSA9IFwiUHJvamVjdG9yXCI7XHJcbiAgICBOb2RlRXZlbnRUeXBlW1wiV2lkZ2V0XCJdID0gXCJXaWRnZXRcIjtcclxufSkoTm9kZUV2ZW50VHlwZSB8fCAoTm9kZUV2ZW50VHlwZSA9IHt9KSk7XHJcbmV4cG9ydCBjbGFzcyBOb2RlSGFuZGxlciBleHRlbmRzIEV2ZW50ZWQge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLl9ub2RlTWFwID0gbmV3IE1hcCgpO1xyXG4gICAgfVxyXG4gICAgZ2V0KGtleSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ub2RlTWFwLmdldChrZXkpO1xyXG4gICAgfVxyXG4gICAgaGFzKGtleSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ub2RlTWFwLmhhcyhrZXkpO1xyXG4gICAgfVxyXG4gICAgYWRkKGVsZW1lbnQsIGtleSkge1xyXG4gICAgICAgIHRoaXMuX25vZGVNYXAuc2V0KGtleSwgZWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5lbWl0KHsgdHlwZToga2V5IH0pO1xyXG4gICAgfVxyXG4gICAgYWRkUm9vdCgpIHtcclxuICAgICAgICB0aGlzLmVtaXQoeyB0eXBlOiBOb2RlRXZlbnRUeXBlLldpZGdldCB9KTtcclxuICAgIH1cclxuICAgIGFkZFByb2plY3RvcigpIHtcclxuICAgICAgICB0aGlzLmVtaXQoeyB0eXBlOiBOb2RlRXZlbnRUeXBlLlByb2plY3RvciB9KTtcclxuICAgIH1cclxuICAgIGNsZWFyKCkge1xyXG4gICAgICAgIHRoaXMuX25vZGVNYXAuY2xlYXIoKTtcclxuICAgIH1cclxufVxyXG5leHBvcnQgZGVmYXVsdCBOb2RlSGFuZGxlcjtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9kZUhhbmRsZXIubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL05vZGVIYW5kbGVyLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvTm9kZUhhbmRsZXIubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCBQcm9taXNlIGZyb20gJ0Bkb2pvL3NoaW0vUHJvbWlzZSc7XHJcbmltcG9ydCBNYXAgZnJvbSAnQGRvam8vc2hpbS9NYXAnO1xyXG5pbXBvcnQgU3ltYm9sIGZyb20gJ0Bkb2pvL3NoaW0vU3ltYm9sJztcclxuaW1wb3J0IHsgRXZlbnRlZCB9IGZyb20gJ0Bkb2pvL2NvcmUvRXZlbnRlZCc7XHJcbi8qKlxyXG4gKiBXaWRnZXQgYmFzZSBzeW1ib2wgdHlwZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFdJREdFVF9CQVNFX1RZUEUgPSBTeW1ib2woJ1dpZGdldCBCYXNlJyk7XHJcbi8qKlxyXG4gKiBDaGVja3MgaXMgdGhlIGl0ZW0gaXMgYSBzdWJjbGFzcyBvZiBXaWRnZXRCYXNlIChvciBhIFdpZGdldEJhc2UpXHJcbiAqXHJcbiAqIEBwYXJhbSBpdGVtIHRoZSBpdGVtIHRvIGNoZWNrXHJcbiAqIEByZXR1cm5zIHRydWUvZmFsc2UgaW5kaWNhdGluZyBpZiB0aGUgaXRlbSBpcyBhIFdpZGdldEJhc2VDb25zdHJ1Y3RvclxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yKGl0ZW0pIHtcclxuICAgIHJldHVybiBCb29sZWFuKGl0ZW0gJiYgaXRlbS5fdHlwZSA9PT0gV0lER0VUX0JBU0VfVFlQRSk7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGlzV2lkZ2V0Q29uc3RydWN0b3JEZWZhdWx0RXhwb3J0KGl0ZW0pIHtcclxuICAgIHJldHVybiBCb29sZWFuKGl0ZW0gJiZcclxuICAgICAgICBpdGVtLmhhc093blByb3BlcnR5KCdfX2VzTW9kdWxlJykgJiZcclxuICAgICAgICBpdGVtLmhhc093blByb3BlcnR5KCdkZWZhdWx0JykgJiZcclxuICAgICAgICBpc1dpZGdldEJhc2VDb25zdHJ1Y3RvcihpdGVtLmRlZmF1bHQpKTtcclxufVxyXG4vKipcclxuICogVGhlIFJlZ2lzdHJ5IGltcGxlbWVudGF0aW9uXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUmVnaXN0cnkgZXh0ZW5kcyBFdmVudGVkIHtcclxuICAgIC8qKlxyXG4gICAgICogRW1pdCBsb2FkZWQgZXZlbnQgZm9yIHJlZ2lzdHJ5IGxhYmVsXHJcbiAgICAgKi9cclxuICAgIGVtaXRMb2FkZWRFdmVudCh3aWRnZXRMYWJlbCwgaXRlbSkge1xyXG4gICAgICAgIHRoaXMuZW1pdCh7XHJcbiAgICAgICAgICAgIHR5cGU6IHdpZGdldExhYmVsLFxyXG4gICAgICAgICAgICBhY3Rpb246ICdsb2FkZWQnLFxyXG4gICAgICAgICAgICBpdGVtXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBkZWZpbmUobGFiZWwsIGl0ZW0pIHtcclxuICAgICAgICBpZiAodGhpcy5fd2lkZ2V0UmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLl93aWRnZXRSZWdpc3RyeSA9IG5ldyBNYXAoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX3dpZGdldFJlZ2lzdHJ5LmhhcyhsYWJlbCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB3aWRnZXQgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIGZvciAnJHtsYWJlbC50b1N0cmluZygpfSdgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fd2lkZ2V0UmVnaXN0cnkuc2V0KGxhYmVsLCBpdGVtKTtcclxuICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgICAgaXRlbS50aGVuKCh3aWRnZXRDdG9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl93aWRnZXRSZWdpc3RyeS5zZXQobGFiZWwsIHdpZGdldEN0b3IpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0TG9hZGVkRXZlbnQobGFiZWwsIHdpZGdldEN0b3IpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpZGdldEN0b3I7XHJcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChpc1dpZGdldEJhc2VDb25zdHJ1Y3RvcihpdGVtKSkge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRMb2FkZWRFdmVudChsYWJlbCwgaXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZGVmaW5lSW5qZWN0b3IobGFiZWwsIGluamVjdG9yRmFjdG9yeSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9pbmplY3RvclJlZ2lzdHJ5ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5faW5qZWN0b3JSZWdpc3RyeSA9IG5ldyBNYXAoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2luamVjdG9yUmVnaXN0cnkuaGFzKGxhYmVsKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGluamVjdG9yIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBmb3IgJyR7bGFiZWwudG9TdHJpbmcoKX0nYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGludmFsaWRhdG9yID0gbmV3IEV2ZW50ZWQoKTtcclxuICAgICAgICBjb25zdCBpbmplY3Rvckl0ZW0gPSB7XHJcbiAgICAgICAgICAgIGluamVjdG9yOiBpbmplY3RvckZhY3RvcnkoKCkgPT4gaW52YWxpZGF0b3IuZW1pdCh7IHR5cGU6ICdpbnZhbGlkYXRlJyB9KSksXHJcbiAgICAgICAgICAgIGludmFsaWRhdG9yXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9pbmplY3RvclJlZ2lzdHJ5LnNldChsYWJlbCwgaW5qZWN0b3JJdGVtKTtcclxuICAgICAgICB0aGlzLmVtaXRMb2FkZWRFdmVudChsYWJlbCwgaW5qZWN0b3JJdGVtKTtcclxuICAgIH1cclxuICAgIGdldChsYWJlbCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fd2lkZ2V0UmVnaXN0cnkgfHwgIXRoaXMuaGFzKGxhYmVsKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX3dpZGdldFJlZ2lzdHJ5LmdldChsYWJlbCk7XHJcbiAgICAgICAgaWYgKGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBpdGVtKCk7XHJcbiAgICAgICAgdGhpcy5fd2lkZ2V0UmVnaXN0cnkuc2V0KGxhYmVsLCBwcm9taXNlKTtcclxuICAgICAgICBwcm9taXNlLnRoZW4oKHdpZGdldEN0b3IpID0+IHtcclxuICAgICAgICAgICAgaWYgKGlzV2lkZ2V0Q29uc3RydWN0b3JEZWZhdWx0RXhwb3J0KHdpZGdldEN0b3IpKSB7XHJcbiAgICAgICAgICAgICAgICB3aWRnZXRDdG9yID0gd2lkZ2V0Q3Rvci5kZWZhdWx0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3dpZGdldFJlZ2lzdHJ5LnNldChsYWJlbCwgd2lkZ2V0Q3Rvcik7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdExvYWRlZEV2ZW50KGxhYmVsLCB3aWRnZXRDdG9yKTtcclxuICAgICAgICAgICAgcmV0dXJuIHdpZGdldEN0b3I7XHJcbiAgICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgZ2V0SW5qZWN0b3IobGFiZWwpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2luamVjdG9yUmVnaXN0cnkgfHwgIXRoaXMuaGFzSW5qZWN0b3IobGFiZWwpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5faW5qZWN0b3JSZWdpc3RyeS5nZXQobGFiZWwpO1xyXG4gICAgfVxyXG4gICAgaGFzKGxhYmVsKSB7XHJcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5fd2lkZ2V0UmVnaXN0cnkgJiYgdGhpcy5fd2lkZ2V0UmVnaXN0cnkuaGFzKGxhYmVsKSk7XHJcbiAgICB9XHJcbiAgICBoYXNJbmplY3RvcihsYWJlbCkge1xyXG4gICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuX2luamVjdG9yUmVnaXN0cnkgJiYgdGhpcy5faW5qZWN0b3JSZWdpc3RyeS5oYXMobGFiZWwpKTtcclxuICAgIH1cclxufVxyXG5leHBvcnQgZGVmYXVsdCBSZWdpc3RyeTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVnaXN0cnkubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL1JlZ2lzdHJ5Lm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvUmVnaXN0cnkubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCB7IE1hcCB9IGZyb20gJ0Bkb2pvL3NoaW0vTWFwJztcclxuaW1wb3J0IHsgRXZlbnRlZCB9IGZyb20gJ0Bkb2pvL2NvcmUvRXZlbnRlZCc7XHJcbmltcG9ydCB7IFJlZ2lzdHJ5IH0gZnJvbSAnLi9SZWdpc3RyeSc7XHJcbmV4cG9ydCBjbGFzcyBSZWdpc3RyeUhhbmRsZXIgZXh0ZW5kcyBFdmVudGVkIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5fcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnkoKTtcclxuICAgICAgICB0aGlzLl9yZWdpc3RyeVdpZGdldExhYmVsTWFwID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIHRoaXMuX3JlZ2lzdHJ5SW5qZWN0b3JMYWJlbE1hcCA9IG5ldyBNYXAoKTtcclxuICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeSk7XHJcbiAgICAgICAgY29uc3QgZGVzdHJveSA9ICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYmFzZVJlZ2lzdHJ5KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RyeVdpZGdldExhYmVsTWFwLmRlbGV0ZSh0aGlzLmJhc2VSZWdpc3RyeSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RyeUluamVjdG9yTGFiZWxNYXAuZGVsZXRlKHRoaXMuYmFzZVJlZ2lzdHJ5KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmFzZVJlZ2lzdHJ5ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLm93bih7IGRlc3Ryb3kgfSk7XHJcbiAgICB9XHJcbiAgICBzZXQgYmFzZShiYXNlUmVnaXN0cnkpIHtcclxuICAgICAgICBpZiAodGhpcy5iYXNlUmVnaXN0cnkpIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnlXaWRnZXRMYWJlbE1hcC5kZWxldGUodGhpcy5iYXNlUmVnaXN0cnkpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZWdpc3RyeUluamVjdG9yTGFiZWxNYXAuZGVsZXRlKHRoaXMuYmFzZVJlZ2lzdHJ5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5iYXNlUmVnaXN0cnkgPSBiYXNlUmVnaXN0cnk7XHJcbiAgICB9XHJcbiAgICBkZWZpbmUobGFiZWwsIHdpZGdldCkge1xyXG4gICAgICAgIHRoaXMuX3JlZ2lzdHJ5LmRlZmluZShsYWJlbCwgd2lkZ2V0KTtcclxuICAgIH1cclxuICAgIGRlZmluZUluamVjdG9yKGxhYmVsLCBpbmplY3Rvcikge1xyXG4gICAgICAgIHRoaXMuX3JlZ2lzdHJ5LmRlZmluZUluamVjdG9yKGxhYmVsLCBpbmplY3Rvcik7XHJcbiAgICB9XHJcbiAgICBoYXMobGFiZWwpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVnaXN0cnkuaGFzKGxhYmVsKSB8fCBCb29sZWFuKHRoaXMuYmFzZVJlZ2lzdHJ5ICYmIHRoaXMuYmFzZVJlZ2lzdHJ5LmhhcyhsYWJlbCkpO1xyXG4gICAgfVxyXG4gICAgaGFzSW5qZWN0b3IobGFiZWwpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVnaXN0cnkuaGFzSW5qZWN0b3IobGFiZWwpIHx8IEJvb2xlYW4odGhpcy5iYXNlUmVnaXN0cnkgJiYgdGhpcy5iYXNlUmVnaXN0cnkuaGFzSW5qZWN0b3IobGFiZWwpKTtcclxuICAgIH1cclxuICAgIGdldChsYWJlbCwgZ2xvYmFsUHJlY2VkZW5jZSA9IGZhbHNlKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldChsYWJlbCwgZ2xvYmFsUHJlY2VkZW5jZSwgJ2dldCcsIHRoaXMuX3JlZ2lzdHJ5V2lkZ2V0TGFiZWxNYXApO1xyXG4gICAgfVxyXG4gICAgZ2V0SW5qZWN0b3IobGFiZWwsIGdsb2JhbFByZWNlZGVuY2UgPSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXQobGFiZWwsIGdsb2JhbFByZWNlZGVuY2UsICdnZXRJbmplY3RvcicsIHRoaXMuX3JlZ2lzdHJ5SW5qZWN0b3JMYWJlbE1hcCk7XHJcbiAgICB9XHJcbiAgICBfZ2V0KGxhYmVsLCBnbG9iYWxQcmVjZWRlbmNlLCBnZXRGdW5jdGlvbk5hbWUsIGxhYmVsTWFwKSB7XHJcbiAgICAgICAgY29uc3QgcmVnaXN0cmllcyA9IGdsb2JhbFByZWNlZGVuY2UgPyBbdGhpcy5iYXNlUmVnaXN0cnksIHRoaXMuX3JlZ2lzdHJ5XSA6IFt0aGlzLl9yZWdpc3RyeSwgdGhpcy5iYXNlUmVnaXN0cnldO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVnaXN0cmllcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCByZWdpc3RyeSA9IHJlZ2lzdHJpZXNbaV07XHJcbiAgICAgICAgICAgIGlmICghcmVnaXN0cnkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSByZWdpc3RyeVtnZXRGdW5jdGlvbk5hbWVdKGxhYmVsKTtcclxuICAgICAgICAgICAgY29uc3QgcmVnaXN0ZXJlZExhYmVscyA9IGxhYmVsTWFwLmdldChyZWdpc3RyeSkgfHwgW107XHJcbiAgICAgICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChyZWdpc3RlcmVkTGFiZWxzLmluZGV4T2YobGFiZWwpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gcmVnaXN0cnkub24obGFiZWwsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5hY3Rpb24gPT09ICdsb2FkZWQnICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbZ2V0RnVuY3Rpb25OYW1lXShsYWJlbCwgZ2xvYmFsUHJlY2VkZW5jZSkgPT09IGV2ZW50Lml0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KHsgdHlwZTogJ2ludmFsaWRhdGUnIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vd24oaGFuZGxlKTtcclxuICAgICAgICAgICAgICAgIGxhYmVsTWFwLnNldChyZWdpc3RyeSwgWy4uLnJlZ2lzdGVyZWRMYWJlbHMsIGxhYmVsXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgUmVnaXN0cnlIYW5kbGVyO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWdpc3RyeUhhbmRsZXIubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL1JlZ2lzdHJ5SGFuZGxlci5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL1JlZ2lzdHJ5SGFuZGxlci5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IE1hcCBmcm9tICdAZG9qby9zaGltL01hcCc7XG5pbXBvcnQgV2Vha01hcCBmcm9tICdAZG9qby9zaGltL1dlYWtNYXAnO1xuaW1wb3J0IFN5bWJvbCBmcm9tICdAZG9qby9zaGltL1N5bWJvbCc7XG5pbXBvcnQgeyB2IH0gZnJvbSAnLi9kJztcbmltcG9ydCB7IGF1dG8gfSBmcm9tICcuL2RpZmYnO1xuaW1wb3J0IFJlZ2lzdHJ5SGFuZGxlciBmcm9tICcuL1JlZ2lzdHJ5SGFuZGxlcic7XG5pbXBvcnQgTm9kZUhhbmRsZXIgZnJvbSAnLi9Ob2RlSGFuZGxlcic7XG5pbXBvcnQgeyB3aWRnZXRJbnN0YW5jZU1hcCB9IGZyb20gJy4vdmRvbSc7XG5pbXBvcnQgeyBpc1dpZGdldEJhc2VDb25zdHJ1Y3RvciwgV0lER0VUX0JBU0VfVFlQRSB9IGZyb20gJy4vUmVnaXN0cnknO1xuY29uc3QgZGVjb3JhdG9yTWFwID0gbmV3IE1hcCgpO1xuY29uc3QgYm91bmRBdXRvID0gYXV0by5iaW5kKG51bGwpO1xuZXhwb3J0IGNvbnN0IG5vQmluZCA9IFN5bWJvbC5mb3IoJ2Rvam9Ob0JpbmQnKTtcbi8qKlxuICogTWFpbiB3aWRnZXQgYmFzZSBmb3IgYWxsIHdpZGdldHMgdG8gZXh0ZW5kXG4gKi9cbmV4cG9ydCBjbGFzcyBXaWRnZXRCYXNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiBpdCBpcyB0aGUgaW5pdGlhbCBzZXQgcHJvcGVydGllcyBjeWNsZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5faW5pdGlhbFByb3BlcnRpZXMgPSB0cnVlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQXJyYXkgb2YgcHJvcGVydHkga2V5cyBjb25zaWRlcmVkIGNoYW5nZWQgZnJvbSB0aGUgcHJldmlvdXMgc2V0IHByb3BlcnRpZXNcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2NoYW5nZWRQcm9wZXJ0eUtleXMgPSBbXTtcbiAgICAgICAgdGhpcy5fbm9kZUhhbmRsZXIgPSBuZXcgTm9kZUhhbmRsZXIoKTtcbiAgICAgICAgdGhpcy5faGFuZGxlcyA9IFtdO1xuICAgICAgICB0aGlzLl9jaGlsZHJlbiA9IFtdO1xuICAgICAgICB0aGlzLl9kZWNvcmF0b3JDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHt9O1xuICAgICAgICB0aGlzLl9ib3VuZFJlbmRlckZ1bmMgPSB0aGlzLnJlbmRlci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLl9ib3VuZEludmFsaWRhdGUgPSB0aGlzLmludmFsaWRhdGUuYmluZCh0aGlzKTtcbiAgICAgICAgd2lkZ2V0SW5zdGFuY2VNYXAuc2V0KHRoaXMsIHtcbiAgICAgICAgICAgIGRpcnR5OiB0cnVlLFxuICAgICAgICAgICAgb25BdHRhY2g6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQXR0YWNoKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25EZXRhY2g6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRGV0YWNoKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbm9kZUhhbmRsZXI6IHRoaXMuX25vZGVIYW5kbGVyLFxuICAgICAgICAgICAgcmVnaXN0cnk6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RyeTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3JlUHJvcGVydGllczoge30sXG4gICAgICAgICAgICByZW5kZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgaW5wdXRQcm9wZXJ0aWVzOiB7fVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fcnVuQWZ0ZXJDb25zdHJ1Y3RvcnMoKTtcbiAgICB9XG4gICAgbWV0YShNZXRhVHlwZSkge1xuICAgICAgICBpZiAodGhpcy5fbWV0YU1hcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9tZXRhTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjYWNoZWQgPSB0aGlzLl9tZXRhTWFwLmdldChNZXRhVHlwZSk7XG4gICAgICAgIGlmICghY2FjaGVkKSB7XG4gICAgICAgICAgICBjYWNoZWQgPSBuZXcgTWV0YVR5cGUoe1xuICAgICAgICAgICAgICAgIGludmFsaWRhdGU6IHRoaXMuX2JvdW5kSW52YWxpZGF0ZSxcbiAgICAgICAgICAgICAgICBub2RlSGFuZGxlcjogdGhpcy5fbm9kZUhhbmRsZXIsXG4gICAgICAgICAgICAgICAgYmluZDogdGhpc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLm93bihjYWNoZWQpO1xuICAgICAgICAgICAgdGhpcy5fbWV0YU1hcC5zZXQoTWV0YVR5cGUsIGNhY2hlZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG4gICAgb25BdHRhY2goKSB7XG4gICAgICAgIC8vIERvIG5vdGhpbmcgYnkgZGVmYXVsdC5cbiAgICB9XG4gICAgb25EZXRhY2goKSB7XG4gICAgICAgIC8vIERvIG5vdGhpbmcgYnkgZGVmYXVsdC5cbiAgICB9XG4gICAgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9wZXJ0aWVzO1xuICAgIH1cbiAgICBnZXQgY2hhbmdlZFByb3BlcnR5S2V5cygpIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLl9jaGFuZ2VkUHJvcGVydHlLZXlzXTtcbiAgICB9XG4gICAgX19zZXRDb3JlUHJvcGVydGllc19fKGNvcmVQcm9wZXJ0aWVzKSB7XG4gICAgICAgIGNvbnN0IHsgYmFzZVJlZ2lzdHJ5IH0gPSBjb3JlUHJvcGVydGllcztcbiAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHRoaXMpO1xuICAgICAgICBpZiAoaW5zdGFuY2VEYXRhLmNvcmVQcm9wZXJ0aWVzLmJhc2VSZWdpc3RyeSAhPT0gYmFzZVJlZ2lzdHJ5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5ID0gbmV3IFJlZ2lzdHJ5SGFuZGxlcigpO1xuICAgICAgICAgICAgICAgIHRoaXMub3duKHRoaXMuX3JlZ2lzdHJ5KTtcbiAgICAgICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeS5vbignaW52YWxpZGF0ZScsIHRoaXMuX2JvdW5kSW52YWxpZGF0ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnkuYmFzZSA9IGJhc2VSZWdpc3RyeTtcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcyA9IGNvcmVQcm9wZXJ0aWVzO1xuICAgIH1cbiAgICBfX3NldFByb3BlcnRpZXNfXyhvcmlnaW5hbFByb3BlcnRpZXMpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHRoaXMpO1xuICAgICAgICBpbnN0YW5jZURhdGEuaW5wdXRQcm9wZXJ0aWVzID0gb3JpZ2luYWxQcm9wZXJ0aWVzO1xuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gdGhpcy5fcnVuQmVmb3JlUHJvcGVydGllcyhvcmlnaW5hbFByb3BlcnRpZXMpO1xuICAgICAgICBjb25zdCByZWdpc3RlcmVkRGlmZlByb3BlcnR5TmFtZXMgPSB0aGlzLmdldERlY29yYXRvcigncmVnaXN0ZXJlZERpZmZQcm9wZXJ0eScpO1xuICAgICAgICBjb25zdCBjaGFuZ2VkUHJvcGVydHlLZXlzID0gW107XG4gICAgICAgIGNvbnN0IHByb3BlcnR5TmFtZXMgPSBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKTtcbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxQcm9wZXJ0aWVzID09PSBmYWxzZSB8fCByZWdpc3RlcmVkRGlmZlByb3BlcnR5TmFtZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBhbGxQcm9wZXJ0aWVzID0gWy4uLnByb3BlcnR5TmFtZXMsIC4uLk9iamVjdC5rZXlzKHRoaXMuX3Byb3BlcnRpZXMpXTtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrZWRQcm9wZXJ0aWVzID0gW107XG4gICAgICAgICAgICBjb25zdCBkaWZmUHJvcGVydHlSZXN1bHRzID0ge307XG4gICAgICAgICAgICBsZXQgcnVuUmVhY3Rpb25zID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBhbGxQcm9wZXJ0aWVzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChjaGVja2VkUHJvcGVydGllcy5pbmRleE9mKHByb3BlcnR5TmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaGVja2VkUHJvcGVydGllcy5wdXNoKHByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNQcm9wZXJ0eSA9IHRoaXMuX3Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdQcm9wZXJ0eSA9IHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5KHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSwgaW5zdGFuY2VEYXRhLmNvcmVQcm9wZXJ0aWVzLmJpbmQpO1xuICAgICAgICAgICAgICAgIGlmIChyZWdpc3RlcmVkRGlmZlByb3BlcnR5TmFtZXMuaW5kZXhPZihwcm9wZXJ0eU5hbWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBydW5SZWFjdGlvbnMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmRnVuY3Rpb25zID0gdGhpcy5nZXREZWNvcmF0b3IoYGRpZmZQcm9wZXJ0eToke3Byb3BlcnR5TmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaWZmRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkaWZmRnVuY3Rpb25zW2ldKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuY2hhbmdlZCAmJiBjaGFuZ2VkUHJvcGVydHlLZXlzLmluZGV4T2YocHJvcGVydHlOYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkUHJvcGVydHlLZXlzLnB1c2gocHJvcGVydHlOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZQcm9wZXJ0eVJlc3VsdHNbcHJvcGVydHlOYW1lXSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYm91bmRBdXRvKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5jaGFuZ2VkICYmIGNoYW5nZWRQcm9wZXJ0eUtleXMuaW5kZXhPZihwcm9wZXJ0eU5hbWUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFByb3BlcnR5S2V5cy5wdXNoKHByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZSBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaWZmUHJvcGVydHlSZXN1bHRzW3Byb3BlcnR5TmFtZV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVuUmVhY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwRGlmZlByb3BlcnR5UmVhY3Rpb25zKHByb3BlcnRpZXMsIGNoYW5nZWRQcm9wZXJ0eUtleXMpLmZvckVhY2goKGFyZ3MsIHJlYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWN0aW9uLmNhbGwodGhpcywgYXJncy5wcmV2aW91c1Byb3BlcnRpZXMsIGFyZ3MubmV3UHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBkaWZmUHJvcGVydHlSZXN1bHRzO1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlZFByb3BlcnR5S2V5cyA9IGNoYW5nZWRQcm9wZXJ0eUtleXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsUHJvcGVydGllcyA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eShwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0sIGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcy5iaW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWRQcm9wZXJ0eUtleXMucHVzaChwcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZWRQcm9wZXJ0eUtleXMgPSBjaGFuZ2VkUHJvcGVydHlLZXlzO1xuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oe30sIHByb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaGFuZ2VkUHJvcGVydHlLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBjaGlsZHJlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuO1xuICAgIH1cbiAgICBfX3NldENoaWxkcmVuX18oY2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX2NoaWxkcmVuLmxlbmd0aCA+IDAgfHwgY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9fcmVuZGVyX18oKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldCh0aGlzKTtcbiAgICAgICAgaW5zdGFuY2VEYXRhLmRpcnR5ID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlbmRlciA9IHRoaXMuX3J1bkJlZm9yZVJlbmRlcnMoKTtcbiAgICAgICAgbGV0IGROb2RlID0gcmVuZGVyKCk7XG4gICAgICAgIGROb2RlID0gdGhpcy5ydW5BZnRlclJlbmRlcnMoZE5vZGUpO1xuICAgICAgICB0aGlzLl9ub2RlSGFuZGxlci5jbGVhcigpO1xuICAgICAgICByZXR1cm4gZE5vZGU7XG4gICAgfVxuICAgIGludmFsaWRhdGUoKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldCh0aGlzKTtcbiAgICAgICAgaWYgKGluc3RhbmNlRGF0YS5pbnZhbGlkYXRlKSB7XG4gICAgICAgICAgICBpbnN0YW5jZURhdGEuaW52YWxpZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIHYoJ2RpdicsIHt9LCB0aGlzLmNoaWxkcmVuKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdG8gYWRkIGRlY29yYXRvcnMgdG8gV2lkZ2V0QmFzZVxuICAgICAqXG4gICAgICogQHBhcmFtIGRlY29yYXRvcktleSBUaGUga2V5IG9mIHRoZSBkZWNvcmF0b3JcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBkZWNvcmF0b3JcbiAgICAgKi9cbiAgICBhZGREZWNvcmF0b3IoZGVjb3JhdG9yS2V5LCB2YWx1ZSkge1xuICAgICAgICB2YWx1ZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eSgnY29uc3RydWN0b3InKSkge1xuICAgICAgICAgICAgbGV0IGRlY29yYXRvckxpc3QgPSBkZWNvcmF0b3JNYXAuZ2V0KHRoaXMuY29uc3RydWN0b3IpO1xuICAgICAgICAgICAgaWYgKCFkZWNvcmF0b3JMaXN0KSB7XG4gICAgICAgICAgICAgICAgZGVjb3JhdG9yTGlzdCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgICAgICBkZWNvcmF0b3JNYXAuc2V0KHRoaXMuY29uc3RydWN0b3IsIGRlY29yYXRvckxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHNwZWNpZmljRGVjb3JhdG9yTGlzdCA9IGRlY29yYXRvckxpc3QuZ2V0KGRlY29yYXRvcktleSk7XG4gICAgICAgICAgICBpZiAoIXNwZWNpZmljRGVjb3JhdG9yTGlzdCkge1xuICAgICAgICAgICAgICAgIHNwZWNpZmljRGVjb3JhdG9yTGlzdCA9IFtdO1xuICAgICAgICAgICAgICAgIGRlY29yYXRvckxpc3Quc2V0KGRlY29yYXRvcktleSwgc3BlY2lmaWNEZWNvcmF0b3JMaXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNwZWNpZmljRGVjb3JhdG9yTGlzdC5wdXNoKC4uLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSB0aGlzLmdldERlY29yYXRvcihkZWNvcmF0b3JLZXkpO1xuICAgICAgICAgICAgdGhpcy5fZGVjb3JhdG9yQ2FjaGUuc2V0KGRlY29yYXRvcktleSwgWy4uLmRlY29yYXRvcnMsIC4uLnZhbHVlXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdG8gYnVpbGQgdGhlIGxpc3Qgb2YgZGVjb3JhdG9ycyBmcm9tIHRoZSBnbG9iYWwgZGVjb3JhdG9yIG1hcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkZWNvcmF0b3JLZXkgIFRoZSBrZXkgb2YgdGhlIGRlY29yYXRvclxuICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgZGVjb3JhdG9yIHZhbHVlc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2J1aWxkRGVjb3JhdG9yTGlzdChkZWNvcmF0b3JLZXkpIHtcbiAgICAgICAgY29uc3QgYWxsRGVjb3JhdG9ycyA9IFtdO1xuICAgICAgICBsZXQgY29uc3RydWN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yO1xuICAgICAgICB3aGlsZSAoY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlTWFwID0gZGVjb3JhdG9yTWFwLmdldChjb25zdHJ1Y3Rvcik7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VNYXApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWNvcmF0b3JzID0gaW5zdGFuY2VNYXAuZ2V0KGRlY29yYXRvcktleSk7XG4gICAgICAgICAgICAgICAgaWYgKGRlY29yYXRvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsRGVjb3JhdG9ycy51bnNoaWZ0KC4uLmRlY29yYXRvcnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0cnVjdG9yID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNvbnN0cnVjdG9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsRGVjb3JhdG9ycztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdG8gcmV0cmlldmUgZGVjb3JhdG9yIHZhbHVlc1xuICAgICAqXG4gICAgICogQHBhcmFtIGRlY29yYXRvcktleSBUaGUga2V5IG9mIHRoZSBkZWNvcmF0b3JcbiAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBkZWNvcmF0b3IgdmFsdWVzXG4gICAgICovXG4gICAgZ2V0RGVjb3JhdG9yKGRlY29yYXRvcktleSkge1xuICAgICAgICBsZXQgYWxsRGVjb3JhdG9ycyA9IHRoaXMuX2RlY29yYXRvckNhY2hlLmdldChkZWNvcmF0b3JLZXkpO1xuICAgICAgICBpZiAoYWxsRGVjb3JhdG9ycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYWxsRGVjb3JhdG9ycztcbiAgICAgICAgfVxuICAgICAgICBhbGxEZWNvcmF0b3JzID0gdGhpcy5fYnVpbGREZWNvcmF0b3JMaXN0KGRlY29yYXRvcktleSk7XG4gICAgICAgIHRoaXMuX2RlY29yYXRvckNhY2hlLnNldChkZWNvcmF0b3JLZXksIGFsbERlY29yYXRvcnMpO1xuICAgICAgICByZXR1cm4gYWxsRGVjb3JhdG9ycztcbiAgICB9XG4gICAgX21hcERpZmZQcm9wZXJ0eVJlYWN0aW9ucyhuZXdQcm9wZXJ0aWVzLCBjaGFuZ2VkUHJvcGVydHlLZXlzKSB7XG4gICAgICAgIGNvbnN0IHJlYWN0aW9uRnVuY3Rpb25zID0gdGhpcy5nZXREZWNvcmF0b3IoJ2RpZmZSZWFjdGlvbicpO1xuICAgICAgICByZXR1cm4gcmVhY3Rpb25GdW5jdGlvbnMucmVkdWNlKChyZWFjdGlvblByb3BlcnR5TWFwLCB7IHJlYWN0aW9uLCBwcm9wZXJ0eU5hbWUgfSkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlYWN0aW9uQXJndW1lbnRzID0gcmVhY3Rpb25Qcm9wZXJ0eU1hcC5nZXQocmVhY3Rpb24pO1xuICAgICAgICAgICAgaWYgKHJlYWN0aW9uQXJndW1lbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZWFjdGlvbkFyZ3VtZW50cyA9IHtcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNQcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgbmV3UHJvcGVydGllczoge30sXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWN0aW9uQXJndW1lbnRzLnByZXZpb3VzUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgcmVhY3Rpb25Bcmd1bWVudHMubmV3UHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gbmV3UHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0eUtleXMuaW5kZXhPZihwcm9wZXJ0eU5hbWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHJlYWN0aW9uQXJndW1lbnRzLmNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhY3Rpb25Qcm9wZXJ0eU1hcC5zZXQocmVhY3Rpb24sIHJlYWN0aW9uQXJndW1lbnRzKTtcbiAgICAgICAgICAgIHJldHVybiByZWFjdGlvblByb3BlcnR5TWFwO1xuICAgICAgICB9LCBuZXcgTWFwKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCaW5kcyB1bmJvdW5kIHByb3BlcnR5IGZ1bmN0aW9ucyB0byB0aGUgc3BlY2lmaWVkIGBiaW5kYCBwcm9wZXJ0eVxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgcHJvcGVydGllcyB0byBjaGVjayBmb3IgZnVuY3Rpb25zXG4gICAgICovXG4gICAgX2JpbmRGdW5jdGlvblByb3BlcnR5KHByb3BlcnR5LCBiaW5kKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkgPT09ICdmdW5jdGlvbicgJiYgIXByb3BlcnR5W25vQmluZF0gJiYgaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IocHJvcGVydHkpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5TWFwID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eU1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBiaW5kSW5mbyA9IHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5TWFwLmdldChwcm9wZXJ0eSkgfHwge307XG4gICAgICAgICAgICBsZXQgeyBib3VuZEZ1bmMsIHNjb3BlIH0gPSBiaW5kSW5mbztcbiAgICAgICAgICAgIGlmIChib3VuZEZ1bmMgPT09IHVuZGVmaW5lZCB8fCBzY29wZSAhPT0gYmluZCkge1xuICAgICAgICAgICAgICAgIGJvdW5kRnVuYyA9IHByb3BlcnR5LmJpbmQoYmluZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fYmluZEZ1bmN0aW9uUHJvcGVydHlNYXAuc2V0KHByb3BlcnR5LCB7IGJvdW5kRnVuYywgc2NvcGU6IGJpbmQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYm91bmRGdW5jO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eTtcbiAgICB9XG4gICAgZ2V0IHJlZ2lzdHJ5KCkge1xuICAgICAgICBpZiAodGhpcy5fcmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnlIYW5kbGVyKCk7XG4gICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeSk7XG4gICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeS5vbignaW52YWxpZGF0ZScsIHRoaXMuX2JvdW5kSW52YWxpZGF0ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWdpc3RyeTtcbiAgICB9XG4gICAgX3J1bkJlZm9yZVByb3BlcnRpZXMocHJvcGVydGllcykge1xuICAgICAgICBjb25zdCBiZWZvcmVQcm9wZXJ0aWVzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2JlZm9yZVByb3BlcnRpZXMnKTtcbiAgICAgICAgaWYgKGJlZm9yZVByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJlZm9yZVByb3BlcnRpZXMucmVkdWNlKChwcm9wZXJ0aWVzLCBiZWZvcmVQcm9wZXJ0aWVzRnVuY3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcHJvcGVydGllcywgYmVmb3JlUHJvcGVydGllc0Z1bmN0aW9uLmNhbGwodGhpcywgcHJvcGVydGllcykpO1xuICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcGVydGllcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSdW4gYWxsIHJlZ2lzdGVyZWQgYmVmb3JlIHJlbmRlcnMgYW5kIHJldHVybiB0aGUgdXBkYXRlZCByZW5kZXIgbWV0aG9kXG4gICAgICovXG4gICAgX3J1bkJlZm9yZVJlbmRlcnMoKSB7XG4gICAgICAgIGNvbnN0IGJlZm9yZVJlbmRlcnMgPSB0aGlzLmdldERlY29yYXRvcignYmVmb3JlUmVuZGVyJyk7XG4gICAgICAgIGlmIChiZWZvcmVSZW5kZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBiZWZvcmVSZW5kZXJzLnJlZHVjZSgocmVuZGVyLCBiZWZvcmVSZW5kZXJGdW5jdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRSZW5kZXIgPSBiZWZvcmVSZW5kZXJGdW5jdGlvbi5jYWxsKHRoaXMsIHJlbmRlciwgdGhpcy5fcHJvcGVydGllcywgdGhpcy5fY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIGlmICghdXBkYXRlZFJlbmRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlbmRlciBmdW5jdGlvbiBub3QgcmV0dXJuZWQgZnJvbSBiZWZvcmVSZW5kZXIsIHVzaW5nIHByZXZpb3VzIHJlbmRlcicpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlZFJlbmRlcjtcbiAgICAgICAgICAgIH0sIHRoaXMuX2JvdW5kUmVuZGVyRnVuYyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2JvdW5kUmVuZGVyRnVuYztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUnVuIGFsbCByZWdpc3RlcmVkIGFmdGVyIHJlbmRlcnMgYW5kIHJldHVybiB0aGUgZGVjb3JhdGVkIEROb2Rlc1xuICAgICAqXG4gICAgICogQHBhcmFtIGROb2RlIFRoZSBETm9kZXMgdG8gcnVuIHRocm91Z2ggdGhlIGFmdGVyIHJlbmRlcnNcbiAgICAgKi9cbiAgICBydW5BZnRlclJlbmRlcnMoZE5vZGUpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJSZW5kZXJzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2FmdGVyUmVuZGVyJyk7XG4gICAgICAgIGlmIChhZnRlclJlbmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGFmdGVyUmVuZGVycy5yZWR1Y2UoKGROb2RlLCBhZnRlclJlbmRlckZ1bmN0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFmdGVyUmVuZGVyRnVuY3Rpb24uY2FsbCh0aGlzLCBkTm9kZSk7XG4gICAgICAgICAgICB9LCBkTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX21ldGFNYXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fbWV0YU1hcC5mb3JFYWNoKChtZXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgbWV0YS5hZnRlclJlbmRlcigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGROb2RlO1xuICAgIH1cbiAgICBfcnVuQWZ0ZXJDb25zdHJ1Y3RvcnMoKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyQ29uc3RydWN0b3JzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2FmdGVyQ29uc3RydWN0b3InKTtcbiAgICAgICAgaWYgKGFmdGVyQ29uc3RydWN0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFmdGVyQ29uc3RydWN0b3JzLmZvckVhY2goKGFmdGVyQ29uc3RydWN0b3IpID0+IGFmdGVyQ29uc3RydWN0b3IuY2FsbCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb3duKGhhbmRsZSkge1xuICAgICAgICB0aGlzLl9oYW5kbGVzLnB1c2goaGFuZGxlKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuX2hhbmRsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy5faGFuZGxlcy5wb3AoKTtcbiAgICAgICAgICAgIGlmIChoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGUuZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBzdGF0aWMgaWRlbnRpZmllclxuICovXG5XaWRnZXRCYXNlLl90eXBlID0gV0lER0VUX0JBU0VfVFlQRTtcbmV4cG9ydCBkZWZhdWx0IFdpZGdldEJhc2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaWRnZXRCYXNlLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9XaWRnZXRCYXNlLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvV2lkZ2V0QmFzZS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwibGV0IGJyb3dzZXJTcGVjaWZpY1RyYW5zaXRpb25FbmRFdmVudE5hbWUgPSAnJztcbmxldCBicm93c2VyU3BlY2lmaWNBbmltYXRpb25FbmRFdmVudE5hbWUgPSAnJztcbmZ1bmN0aW9uIGRldGVybWluZUJyb3dzZXJTdHlsZU5hbWVzKGVsZW1lbnQpIHtcbiAgICBpZiAoJ1dlYmtpdFRyYW5zaXRpb24nIGluIGVsZW1lbnQuc3R5bGUpIHtcbiAgICAgICAgYnJvd3NlclNwZWNpZmljVHJhbnNpdGlvbkVuZEV2ZW50TmFtZSA9ICd3ZWJraXRUcmFuc2l0aW9uRW5kJztcbiAgICAgICAgYnJvd3NlclNwZWNpZmljQW5pbWF0aW9uRW5kRXZlbnROYW1lID0gJ3dlYmtpdEFuaW1hdGlvbkVuZCc7XG4gICAgfVxuICAgIGVsc2UgaWYgKCd0cmFuc2l0aW9uJyBpbiBlbGVtZW50LnN0eWxlIHx8ICdNb3pUcmFuc2l0aW9uJyBpbiBlbGVtZW50LnN0eWxlKSB7XG4gICAgICAgIGJyb3dzZXJTcGVjaWZpY1RyYW5zaXRpb25FbmRFdmVudE5hbWUgPSAndHJhbnNpdGlvbmVuZCc7XG4gICAgICAgIGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSA9ICdhbmltYXRpb25lbmQnO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3VyIGJyb3dzZXIgaXMgbm90IHN1cHBvcnRlZCcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGluaXRpYWxpemUoZWxlbWVudCkge1xuICAgIGlmIChicm93c2VyU3BlY2lmaWNBbmltYXRpb25FbmRFdmVudE5hbWUgPT09ICcnKSB7XG4gICAgICAgIGRldGVybWluZUJyb3dzZXJTdHlsZU5hbWVzKGVsZW1lbnQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJ1bkFuZENsZWFuVXAoZWxlbWVudCwgc3RhcnRBbmltYXRpb24sIGZpbmlzaEFuaW1hdGlvbikge1xuICAgIGluaXRpYWxpemUoZWxlbWVudCk7XG4gICAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG4gICAgbGV0IHRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghZmluaXNoZWQpIHtcbiAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihicm93c2VyU3BlY2lmaWNUcmFuc2l0aW9uRW5kRXZlbnROYW1lLCB0cmFuc2l0aW9uRW5kKTtcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihicm93c2VyU3BlY2lmaWNBbmltYXRpb25FbmRFdmVudE5hbWUsIHRyYW5zaXRpb25FbmQpO1xuICAgICAgICAgICAgZmluaXNoQW5pbWF0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHN0YXJ0QW5pbWF0aW9uKCk7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSwgdHJhbnNpdGlvbkVuZCk7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGJyb3dzZXJTcGVjaWZpY1RyYW5zaXRpb25FbmRFdmVudE5hbWUsIHRyYW5zaXRpb25FbmQpO1xufVxuZnVuY3Rpb24gZXhpdChub2RlLCBwcm9wZXJ0aWVzLCBleGl0QW5pbWF0aW9uLCByZW1vdmVOb2RlKSB7XG4gICAgY29uc3QgYWN0aXZlQ2xhc3MgPSBwcm9wZXJ0aWVzLmV4aXRBbmltYXRpb25BY3RpdmUgfHwgYCR7ZXhpdEFuaW1hdGlvbn0tYWN0aXZlYDtcbiAgICBydW5BbmRDbGVhblVwKG5vZGUsICgpID0+IHtcbiAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKGV4aXRBbmltYXRpb24pO1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKGFjdGl2ZUNsYXNzKTtcbiAgICAgICAgfSk7XG4gICAgfSwgKCkgPT4ge1xuICAgICAgICByZW1vdmVOb2RlKCk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBlbnRlcihub2RlLCBwcm9wZXJ0aWVzLCBlbnRlckFuaW1hdGlvbikge1xuICAgIGNvbnN0IGFjdGl2ZUNsYXNzID0gcHJvcGVydGllcy5lbnRlckFuaW1hdGlvbkFjdGl2ZSB8fCBgJHtlbnRlckFuaW1hdGlvbn0tYWN0aXZlYDtcbiAgICBydW5BbmRDbGVhblVwKG5vZGUsICgpID0+IHtcbiAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKGVudGVyQW5pbWF0aW9uKTtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZChhY3RpdmVDbGFzcyk7XG4gICAgICAgIH0pO1xuICAgIH0sICgpID0+IHtcbiAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKGVudGVyQW5pbWF0aW9uKTtcbiAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKGFjdGl2ZUNsYXNzKTtcbiAgICB9KTtcbn1cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBlbnRlcixcbiAgICBleGl0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3NzVHJhbnNpdGlvbnMubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2FuaW1hdGlvbnMvY3NzVHJhbnNpdGlvbnMubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9hbmltYXRpb25zL2Nzc1RyYW5zaXRpb25zLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgU3ltYm9sIGZyb20gJ0Bkb2pvL3NoaW0vU3ltYm9sJztcbi8qKlxuICogVGhlIHN5bWJvbCBpZGVudGlmaWVyIGZvciBhIFdOb2RlIHR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IFdOT0RFID0gU3ltYm9sKCdJZGVudGlmaWVyIGZvciBhIFdOb2RlLicpO1xuLyoqXG4gKiBUaGUgc3ltYm9sIGlkZW50aWZpZXIgZm9yIGEgVk5vZGUgdHlwZVxuICovXG5leHBvcnQgY29uc3QgVk5PREUgPSBTeW1ib2woJ0lkZW50aWZpZXIgZm9yIGEgVk5vZGUuJyk7XG4vKipcbiAqIFRoZSBzeW1ib2wgaWRlbnRpZmllciBmb3IgYSBWTm9kZSB0eXBlIGNyZWF0ZWQgdXNpbmcgZG9tKClcbiAqL1xuZXhwb3J0IGNvbnN0IERPTVZOT0RFID0gU3ltYm9sKCdJZGVudGlmaWVyIGZvciBhIFZOb2RlIGNyZWF0ZWQgdXNpbmcgZXhpc3RpbmcgZG9tLicpO1xuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIGBETm9kZWAgaXMgYSBgV05vZGVgIHVzaW5nIHRoZSBgdHlwZWAgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV05vZGUoY2hpbGQpIHtcbiAgICByZXR1cm4gQm9vbGVhbihjaGlsZCAmJiB0eXBlb2YgY2hpbGQgIT09ICdzdHJpbmcnICYmIGNoaWxkLnR5cGUgPT09IFdOT0RFKTtcbn1cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBgRE5vZGVgIGlzIGEgYFZOb2RlYCB1c2luZyB0aGUgYHR5cGVgIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZOb2RlKGNoaWxkKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oY2hpbGQgJiYgdHlwZW9mIGNoaWxkICE9PSAnc3RyaW5nJyAmJiAoY2hpbGQudHlwZSA9PT0gVk5PREUgfHwgY2hpbGQudHlwZSA9PT0gRE9NVk5PREUpKTtcbn1cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBgRE5vZGVgIGlzIGEgYFZOb2RlYCBjcmVhdGVkIHdpdGggYGRvbSgpYCB1c2luZyB0aGUgYHR5cGVgIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RvbVZOb2RlKGNoaWxkKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oY2hpbGQgJiYgdHlwZW9mIGNoaWxkICE9PSAnc3RyaW5nJyAmJiBjaGlsZC50eXBlID09PSBET01WTk9ERSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFbGVtZW50Tm9kZSh2YWx1ZSkge1xuICAgIHJldHVybiAhIXZhbHVlLnRhZ05hbWU7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjb3JhdGUoZE5vZGVzLCBvcHRpb25zT3JNb2RpZmllciwgcHJlZGljYXRlKSB7XG4gICAgbGV0IHNoYWxsb3cgPSBmYWxzZTtcbiAgICBsZXQgbW9kaWZpZXI7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zT3JNb2RpZmllciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBtb2RpZmllciA9IG9wdGlvbnNPck1vZGlmaWVyO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbW9kaWZpZXIgPSBvcHRpb25zT3JNb2RpZmllci5tb2RpZmllcjtcbiAgICAgICAgcHJlZGljYXRlID0gb3B0aW9uc09yTW9kaWZpZXIucHJlZGljYXRlO1xuICAgICAgICBzaGFsbG93ID0gb3B0aW9uc09yTW9kaWZpZXIuc2hhbGxvdyB8fCBmYWxzZTtcbiAgICB9XG4gICAgbGV0IG5vZGVzID0gQXJyYXkuaXNBcnJheShkTm9kZXMpID8gWy4uLmROb2Rlc10gOiBbZE5vZGVzXTtcbiAgICBmdW5jdGlvbiBicmVha2VyKCkge1xuICAgICAgICBub2RlcyA9IFtdO1xuICAgIH1cbiAgICB3aGlsZSAobm9kZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlcy5zaGlmdCgpO1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKCFzaGFsbG93ICYmIChpc1dOb2RlKG5vZGUpIHx8IGlzVk5vZGUobm9kZSkpICYmIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBub2RlcyA9IFsuLi5ub2RlcywgLi4ubm9kZS5jaGlsZHJlbl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXByZWRpY2F0ZSB8fCBwcmVkaWNhdGUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICBtb2RpZmllcihub2RlLCBicmVha2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZE5vZGVzO1xufVxuLyoqXG4gKiBXcmFwcGVyIGZ1bmN0aW9uIGZvciBjYWxscyB0byBjcmVhdGUgYSB3aWRnZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3KHdpZGdldENvbnN0cnVjdG9yLCBwcm9wZXJ0aWVzLCBjaGlsZHJlbiA9IFtdKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIHdpZGdldENvbnN0cnVjdG9yLFxuICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICB0eXBlOiBXTk9ERVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gdih0YWcsIHByb3BlcnRpZXNPckNoaWxkcmVuID0ge30sIGNoaWxkcmVuID0gdW5kZWZpbmVkKSB7XG4gICAgbGV0IHByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzT3JDaGlsZHJlbjtcbiAgICBsZXQgZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2s7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcGVydGllc09yQ2hpbGRyZW4pKSB7XG4gICAgICAgIGNoaWxkcmVuID0gcHJvcGVydGllc09yQ2hpbGRyZW47XG4gICAgICAgIHByb3BlcnRpZXMgPSB7fTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcm9wZXJ0aWVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrID0gcHJvcGVydGllcztcbiAgICAgICAgcHJvcGVydGllcyA9IHt9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB0YWcsXG4gICAgICAgIGRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrLFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgcHJvcGVydGllcyxcbiAgICAgICAgdHlwZTogVk5PREVcbiAgICB9O1xufVxuLyoqXG4gKiBDcmVhdGUgYSBWTm9kZSBmb3IgYW4gZXhpc3RpbmcgRE9NIE5vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb20oeyBub2RlLCBhdHRycyA9IHt9LCBwcm9wcyA9IHt9LCBvbiA9IHt9LCBkaWZmVHlwZSA9ICdub25lJyB9LCBjaGlsZHJlbikge1xuICAgIHJldHVybiB7XG4gICAgICAgIHRhZzogaXNFbGVtZW50Tm9kZShub2RlKSA/IG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpIDogJycsXG4gICAgICAgIHByb3BlcnRpZXM6IHByb3BzLFxuICAgICAgICBhdHRyaWJ1dGVzOiBhdHRycyxcbiAgICAgICAgZXZlbnRzOiBvbixcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIHR5cGU6IERPTVZOT0RFLFxuICAgICAgICBkb21Ob2RlOiBub2RlLFxuICAgICAgICB0ZXh0OiBpc0VsZW1lbnROb2RlKG5vZGUpID8gdW5kZWZpbmVkIDogbm9kZS5kYXRhLFxuICAgICAgICBkaWZmVHlwZVxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi9oYW5kbGVEZWNvcmF0b3InO1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyUmVuZGVyKG1ldGhvZCkge1xuICAgIHJldHVybiBoYW5kbGVEZWNvcmF0b3IoKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcignYWZ0ZXJSZW5kZXInLCBwcm9wZXJ0eUtleSA/IHRhcmdldFtwcm9wZXJ0eUtleV0gOiBtZXRob2QpO1xuICAgIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQgYWZ0ZXJSZW5kZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hZnRlclJlbmRlci5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9hZnRlclJlbmRlci5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYWZ0ZXJSZW5kZXIubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCB7IGhhbmRsZURlY29yYXRvciB9IGZyb20gJy4vaGFuZGxlRGVjb3JhdG9yJztcbmltcG9ydCB7IGJlZm9yZVByb3BlcnRpZXMgfSBmcm9tICcuL2JlZm9yZVByb3BlcnRpZXMnO1xuZXhwb3J0IGZ1bmN0aW9uIGFsd2F5c1JlbmRlcigpIHtcbiAgICByZXR1cm4gaGFuZGxlRGVjb3JhdG9yKCh0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICAgIGJlZm9yZVByb3BlcnRpZXMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgICAgIH0pKHRhcmdldCk7XG4gICAgfSk7XG59XG5leHBvcnQgZGVmYXVsdCBhbHdheXNSZW5kZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hbHdheXNSZW5kZXIubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYWx3YXlzUmVuZGVyLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9hbHdheXNSZW5kZXIubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCB7IGhhbmRsZURlY29yYXRvciB9IGZyb20gJy4vaGFuZGxlRGVjb3JhdG9yJztcbmV4cG9ydCBmdW5jdGlvbiBiZWZvcmVQcm9wZXJ0aWVzKG1ldGhvZCkge1xuICAgIHJldHVybiBoYW5kbGVEZWNvcmF0b3IoKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcignYmVmb3JlUHJvcGVydGllcycsIHByb3BlcnR5S2V5ID8gdGFyZ2V0W3Byb3BlcnR5S2V5XSA6IG1ldGhvZCk7XG4gICAgfSk7XG59XG5leHBvcnQgZGVmYXVsdCBiZWZvcmVQcm9wZXJ0aWVzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmVmb3JlUHJvcGVydGllcy5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9iZWZvcmVQcm9wZXJ0aWVzLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9iZWZvcmVQcm9wZXJ0aWVzLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgeyBDdXN0b21FbGVtZW50Q2hpbGRUeXBlIH0gZnJvbSAnLi4vcmVnaXN0ZXJDdXN0b21FbGVtZW50JztcbmltcG9ydCBSZWdpc3RyeSBmcm9tICcuLi9SZWdpc3RyeSc7XG4vKipcbiAqIFRoaXMgRGVjb3JhdG9yIGlzIHByb3ZpZGVkIHByb3BlcnRpZXMgdGhhdCBkZWZpbmUgdGhlIGJlaGF2aW9yIG9mIGEgY3VzdG9tIGVsZW1lbnQsIGFuZFxuICogcmVnaXN0ZXJzIHRoYXQgY3VzdG9tIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjdXN0b21FbGVtZW50KHsgdGFnLCBwcm9wZXJ0aWVzID0gW10sIGF0dHJpYnV0ZXMgPSBbXSwgZXZlbnRzID0gW10sIGNoaWxkVHlwZSA9IEN1c3RvbUVsZW1lbnRDaGlsZFR5cGUuRE9KTywgcmVnaXN0cnlGYWN0b3J5ID0gKCkgPT4gbmV3IFJlZ2lzdHJ5KCkgfSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5wcm90b3R5cGUuX19jdXN0b21FbGVtZW50RGVzY3JpcHRvciA9IHtcbiAgICAgICAgICAgIHRhZ05hbWU6IHRhZyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICAgICAgZXZlbnRzLFxuICAgICAgICAgICAgY2hpbGRUeXBlLFxuICAgICAgICAgICAgcmVnaXN0cnlGYWN0b3J5XG4gICAgICAgIH07XG4gICAgfTtcbn1cbmV4cG9ydCBkZWZhdWx0IGN1c3RvbUVsZW1lbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jdXN0b21FbGVtZW50Lm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2N1c3RvbUVsZW1lbnQubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2N1c3RvbUVsZW1lbnQubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCB7IGhhbmRsZURlY29yYXRvciB9IGZyb20gJy4vaGFuZGxlRGVjb3JhdG9yJztcbi8qKlxuICogRGVjb3JhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVnaXN0ZXIgYSBmdW5jdGlvbiBhcyBhIHNwZWNpZmljIHByb3BlcnR5IGRpZmZcbiAqXG4gKiBAcGFyYW0gcHJvcGVydHlOYW1lICBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb2Ygd2hpY2ggdGhlIGRpZmYgZnVuY3Rpb24gaXMgYXBwbGllZFxuICogQHBhcmFtIGRpZmZUeXBlICAgICAgVGhlIGRpZmYgdHlwZSwgZGVmYXVsdCBpcyBEaWZmVHlwZS5BVVRPLlxuICogQHBhcmFtIGRpZmZGdW5jdGlvbiAgQSBkaWZmIGZ1bmN0aW9uIHRvIHJ1biBpZiBkaWZmVHlwZSBpZiBEaWZmVHlwZS5DVVNUT01cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmZQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGRpZmZGdW5jdGlvbiwgcmVhY3Rpb25GdW5jdGlvbikge1xuICAgIHJldHVybiBoYW5kbGVEZWNvcmF0b3IoKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcihgZGlmZlByb3BlcnR5OiR7cHJvcGVydHlOYW1lfWAsIGRpZmZGdW5jdGlvbi5iaW5kKG51bGwpKTtcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcigncmVnaXN0ZXJlZERpZmZQcm9wZXJ0eScsIHByb3BlcnR5TmFtZSk7XG4gICAgICAgIGlmIChyZWFjdGlvbkZ1bmN0aW9uIHx8IHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICB0YXJnZXQuYWRkRGVjb3JhdG9yKCdkaWZmUmVhY3Rpb24nLCB7XG4gICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgICAgIHJlYWN0aW9uOiBwcm9wZXJ0eUtleSA/IHRhcmdldFtwcm9wZXJ0eUtleV0gOiByZWFjdGlvbkZ1bmN0aW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQgZGlmZlByb3BlcnR5O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGlmZlByb3BlcnR5Lm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2RpZmZQcm9wZXJ0eS5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvZGlmZlByb3BlcnR5Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCIvKipcbiAqIEdlbmVyaWMgZGVjb3JhdG9yIGhhbmRsZXIgdG8gdGFrZSBjYXJlIG9mIHdoZXRoZXIgb3Igbm90IHRoZSBkZWNvcmF0b3Igd2FzIGNhbGxlZCBhdCB0aGUgY2xhc3MgbGV2ZWxcbiAqIG9yIHRoZSBtZXRob2QgbGV2ZWwuXG4gKlxuICogQHBhcmFtIGhhbmRsZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZURlY29yYXRvcihoYW5kbGVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBoYW5kbGVyKHRhcmdldC5wcm90b3R5cGUsIHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVyKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydCBkZWZhdWx0IGhhbmRsZURlY29yYXRvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhbmRsZURlY29yYXRvci5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9oYW5kbGVEZWNvcmF0b3IubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2hhbmRsZURlY29yYXRvci5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IFdlYWtNYXAgZnJvbSAnQGRvam8vc2hpbS9XZWFrTWFwJztcbmltcG9ydCB7IGhhbmRsZURlY29yYXRvciB9IGZyb20gJy4vaGFuZGxlRGVjb3JhdG9yJztcbmltcG9ydCB7IGJlZm9yZVByb3BlcnRpZXMgfSBmcm9tICcuL2JlZm9yZVByb3BlcnRpZXMnO1xuLyoqXG4gKiBNYXAgb2YgaW5zdGFuY2VzIGFnYWluc3QgcmVnaXN0ZXJlZCBpbmplY3RvcnMuXG4gKi9cbmNvbnN0IHJlZ2lzdGVyZWRJbmplY3RvcnNNYXAgPSBuZXcgV2Vha01hcCgpO1xuLyoqXG4gKiBEZWNvcmF0b3IgcmV0cmlldmVzIGFuIGluamVjdG9yIGZyb20gYW4gYXZhaWxhYmxlIHJlZ2lzdHJ5IHVzaW5nIHRoZSBuYW1lIGFuZFxuICogY2FsbHMgdGhlIGBnZXRQcm9wZXJ0aWVzYCBmdW5jdGlvbiB3aXRoIHRoZSBwYXlsb2FkIGZyb20gdGhlIGluamVjdG9yXG4gKiBhbmQgY3VycmVudCBwcm9wZXJ0aWVzIHdpdGggdGhlIHRoZSBpbmplY3RlZCBwcm9wZXJ0aWVzIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSBJbmplY3RDb25maWcgdGhlIGluamVjdCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3QoeyBuYW1lLCBnZXRQcm9wZXJ0aWVzIH0pIHtcbiAgICByZXR1cm4gaGFuZGxlRGVjb3JhdG9yKCh0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICAgIGJlZm9yZVByb3BlcnRpZXMoZnVuY3Rpb24gKHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGluamVjdG9ySXRlbSA9IHRoaXMucmVnaXN0cnkuZ2V0SW5qZWN0b3IobmFtZSk7XG4gICAgICAgICAgICBpZiAoaW5qZWN0b3JJdGVtKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBpbmplY3RvciwgaW52YWxpZGF0b3IgfSA9IGluamVjdG9ySXRlbTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWdpc3RlcmVkSW5qZWN0b3JzID0gcmVnaXN0ZXJlZEluamVjdG9yc01hcC5nZXQodGhpcykgfHwgW107XG4gICAgICAgICAgICAgICAgaWYgKHJlZ2lzdGVyZWRJbmplY3RvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWRJbmplY3RvcnNNYXAuc2V0KHRoaXMsIHJlZ2lzdGVyZWRJbmplY3RvcnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVnaXN0ZXJlZEluamVjdG9ycy5pbmRleE9mKGluamVjdG9ySXRlbSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3duKGludmFsaWRhdG9yLm9uKCdpbnZhbGlkYXRlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJlZEluamVjdG9ycy5wdXNoKGluamVjdG9ySXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0aWVzKGluamVjdG9yKCksIHByb3BlcnRpZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSh0YXJnZXQpO1xuICAgIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQgaW5qZWN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5qZWN0Lm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2luamVjdC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaW5qZWN0Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgeyBXSURHRVRfQkFTRV9UWVBFIH0gZnJvbSAnLi9SZWdpc3RyeSc7XG5mdW5jdGlvbiBpc09iamVjdE9yQXJyYXkodmFsdWUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYWx3YXlzKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2hhbmdlZDogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IG5ld1Byb3BlcnR5XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmUocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjaGFuZ2VkOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IG5ld1Byb3BlcnR5XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWZlcmVuY2UocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjaGFuZ2VkOiBwcmV2aW91c1Byb3BlcnR5ICE9PSBuZXdQcm9wZXJ0eSxcbiAgICAgICAgdmFsdWU6IG5ld1Byb3BlcnR5XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzaGFsbG93KHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KSB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBjb25zdCB2YWxpZE9sZFByb3BlcnR5ID0gcHJldmlvdXNQcm9wZXJ0eSAmJiBpc09iamVjdE9yQXJyYXkocHJldmlvdXNQcm9wZXJ0eSk7XG4gICAgY29uc3QgdmFsaWROZXdQcm9wZXJ0eSA9IG5ld1Byb3BlcnR5ICYmIGlzT2JqZWN0T3JBcnJheShuZXdQcm9wZXJ0eSk7XG4gICAgaWYgKCF2YWxpZE9sZFByb3BlcnR5IHx8ICF2YWxpZE5ld1Byb3BlcnR5KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjaGFuZ2VkOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ld1Byb3BlcnR5XG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHByZXZpb3VzS2V5cyA9IE9iamVjdC5rZXlzKHByZXZpb3VzUHJvcGVydHkpO1xuICAgIGNvbnN0IG5ld0tleXMgPSBPYmplY3Qua2V5cyhuZXdQcm9wZXJ0eSk7XG4gICAgaWYgKHByZXZpb3VzS2V5cy5sZW5ndGggIT09IG5ld0tleXMubGVuZ3RoKSB7XG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2hhbmdlZCA9IG5ld0tleXMuc29tZSgoa2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3UHJvcGVydHlba2V5XSAhPT0gcHJldmlvdXNQcm9wZXJ0eVtrZXldO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2hhbmdlZCxcbiAgICAgICAgdmFsdWU6IG5ld1Byb3BlcnR5XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhdXRvKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KSB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAodHlwZW9mIG5ld1Byb3BlcnR5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGlmIChuZXdQcm9wZXJ0eS5fdHlwZSA9PT0gV0lER0VUX0JBU0VfVFlQRSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVmZXJlbmNlKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGlnbm9yZShwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoaXNPYmplY3RPckFycmF5KG5ld1Byb3BlcnR5KSkge1xuICAgICAgICByZXN1bHQgPSBzaGFsbG93KHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHJlZmVyZW5jZShwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWZmLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kaWZmLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGlmZi5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGFzc2lnbiB9IGZyb20gJ0Bkb2pvL2NvcmUvbGFuZyc7XG5pbXBvcnQgY3NzVHJhbnNpdGlvbnMgZnJvbSAnLi4vYW5pbWF0aW9ucy9jc3NUcmFuc2l0aW9ucyc7XG5pbXBvcnQgeyBhZnRlclJlbmRlciB9IGZyb20gJy4vLi4vZGVjb3JhdG9ycy9hZnRlclJlbmRlcic7XG5pbXBvcnQgeyB2IH0gZnJvbSAnLi8uLi9kJztcbmltcG9ydCB7IGRvbSB9IGZyb20gJy4vLi4vdmRvbSc7XG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGF0dGFjaCBzdGF0ZSBvZiB0aGUgcHJvamVjdG9yXG4gKi9cbmV4cG9ydCB2YXIgUHJvamVjdG9yQXR0YWNoU3RhdGU7XG4oZnVuY3Rpb24gKFByb2plY3RvckF0dGFjaFN0YXRlKSB7XG4gICAgUHJvamVjdG9yQXR0YWNoU3RhdGVbUHJvamVjdG9yQXR0YWNoU3RhdGVbXCJBdHRhY2hlZFwiXSA9IDFdID0gXCJBdHRhY2hlZFwiO1xuICAgIFByb2plY3RvckF0dGFjaFN0YXRlW1Byb2plY3RvckF0dGFjaFN0YXRlW1wiRGV0YWNoZWRcIl0gPSAyXSA9IFwiRGV0YWNoZWRcIjtcbn0pKFByb2plY3RvckF0dGFjaFN0YXRlIHx8IChQcm9qZWN0b3JBdHRhY2hTdGF0ZSA9IHt9KSk7XG4vKipcbiAqIEF0dGFjaCB0eXBlIGZvciB0aGUgcHJvamVjdG9yXG4gKi9cbmV4cG9ydCB2YXIgQXR0YWNoVHlwZTtcbihmdW5jdGlvbiAoQXR0YWNoVHlwZSkge1xuICAgIEF0dGFjaFR5cGVbQXR0YWNoVHlwZVtcIkFwcGVuZFwiXSA9IDFdID0gXCJBcHBlbmRcIjtcbiAgICBBdHRhY2hUeXBlW0F0dGFjaFR5cGVbXCJNZXJnZVwiXSA9IDJdID0gXCJNZXJnZVwiO1xufSkoQXR0YWNoVHlwZSB8fCAoQXR0YWNoVHlwZSA9IHt9KSk7XG5leHBvcnQgZnVuY3Rpb24gUHJvamVjdG9yTWl4aW4oQmFzZSkge1xuICAgIGNsYXNzIFByb2plY3RvciBleHRlbmRzIEJhc2Uge1xuICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7XG4gICAgICAgICAgICBzdXBlciguLi5hcmdzKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3QgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgICAgICAgdGhpcy5fYXN5bmMgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fcHJvamVjdG9yUHJvcGVydGllcyA9IHt9O1xuICAgICAgICAgICAgdGhpcy5fcHJvamVjdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbnM6IGNzc1RyYW5zaXRpb25zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5yb290ID0gZG9jdW1lbnQuYm9keTtcbiAgICAgICAgICAgIHRoaXMucHJvamVjdG9yU3RhdGUgPSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5EZXRhY2hlZDtcbiAgICAgICAgfVxuICAgICAgICBhcHBlbmQocm9vdCkge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBBdHRhY2hUeXBlLkFwcGVuZCxcbiAgICAgICAgICAgICAgICByb290XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2F0dGFjaChvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBtZXJnZShyb290KSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IEF0dGFjaFR5cGUuTWVyZ2UsXG4gICAgICAgICAgICAgICAgcm9vdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdHRhY2gob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0IHJvb3Qocm9vdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvamVjdG9yU3RhdGUgPT09IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9qZWN0b3IgYWxyZWFkeSBhdHRhY2hlZCwgY2Fubm90IGNoYW5nZSByb290IGVsZW1lbnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3Jvb3QgPSByb290O1xuICAgICAgICB9XG4gICAgICAgIGdldCByb290KCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3Q7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGFzeW5jKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FzeW5jO1xuICAgICAgICB9XG4gICAgICAgIHNldCBhc3luYyhhc3luYykge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvamVjdG9yU3RhdGUgPT09IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9qZWN0b3IgYWxyZWFkeSBhdHRhY2hlZCwgY2Fubm90IGNoYW5nZSBhc3luYyBtb2RlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9hc3luYyA9IGFzeW5jO1xuICAgICAgICB9XG4gICAgICAgIHNhbmRib3goZG9jID0gZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb2plY3RvclN0YXRlID09PSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5BdHRhY2hlZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJvamVjdG9yIGFscmVhZHkgYXR0YWNoZWQsIGNhbm5vdCBjcmVhdGUgc2FuZGJveCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fYXN5bmMgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzUm9vdCA9IHRoaXMucm9vdDtcbiAgICAgICAgICAgIC8qIGZyZWUgdXAgdGhlIGRvY3VtZW50IGZyYWdtZW50IGZvciBHQyAqL1xuICAgICAgICAgICAgdGhpcy5vd24oe1xuICAgICAgICAgICAgICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcm9vdCA9IHByZXZpb3VzUm9vdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX2F0dGFjaCh7XG4gICAgICAgICAgICAgICAgLyogRG9jdW1lbnRGcmFnbWVudCBpcyBub3QgYXNzaWduYWJsZSB0byBFbGVtZW50LCBidXQgcHJvdmlkZXMgZXZlcnl0aGluZyBuZWVkZWQgdG8gd29yayAqL1xuICAgICAgICAgICAgICAgIHJvb3Q6IGRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG4gICAgICAgICAgICAgICAgdHlwZTogQXR0YWNoVHlwZS5BcHBlbmRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHNldENoaWxkcmVuKGNoaWxkcmVuKSB7XG4gICAgICAgICAgICB0aGlzLl9fc2V0Q2hpbGRyZW5fXyhjaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICB0aGlzLl9fc2V0UHJvcGVydGllc19fKHByb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgICAgIF9fc2V0UHJvcGVydGllc19fKHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9wcm9qZWN0b3JQcm9wZXJ0aWVzICYmIHRoaXMuX3Byb2plY3RvclByb3BlcnRpZXMucmVnaXN0cnkgIT09IHByb3BlcnRpZXMucmVnaXN0cnkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcHJvamVjdG9yUHJvcGVydGllcy5yZWdpc3RyeSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm9qZWN0b3JQcm9wZXJ0aWVzLnJlZ2lzdHJ5LmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9wcm9qZWN0b3JQcm9wZXJ0aWVzID0gYXNzaWduKHt9LCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIHN1cGVyLl9fc2V0Q29yZVByb3BlcnRpZXNfXyh7IGJpbmQ6IHRoaXMsIGJhc2VSZWdpc3RyeTogcHJvcGVydGllcy5yZWdpc3RyeSB9KTtcbiAgICAgICAgICAgIHN1cGVyLl9fc2V0UHJvcGVydGllc19fKHByb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgICAgIHRvSHRtbCgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb2plY3RvclN0YXRlICE9PSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5BdHRhY2hlZCB8fCAhdGhpcy5fcHJvamVjdGlvbikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJvamVjdG9yIGlzIG5vdCBhdHRhY2hlZCwgY2Fubm90IHJldHVybiBhbiBIVE1MIHN0cmluZyBvZiBwcm9qZWN0aW9uLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2plY3Rpb24uZG9tTm9kZS5jaGlsZE5vZGVzWzBdLm91dGVySFRNTDtcbiAgICAgICAgfVxuICAgICAgICBhZnRlclJlbmRlcihyZXN1bHQpIHtcbiAgICAgICAgICAgIGxldCBub2RlID0gcmVzdWx0O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnIHx8IHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG5vZGUgPSB2KCdzcGFuJywge30sIFtyZXN1bHRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgICAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgX2F0dGFjaCh7IHR5cGUsIHJvb3QgfSkge1xuICAgICAgICAgICAgaWYgKHJvb3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3QgPSByb290O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2F0dGFjaEhhbmRsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdHRhY2hIYW5kbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByb2plY3RvclN0YXRlID0gUHJvamVjdG9yQXR0YWNoU3RhdGUuQXR0YWNoZWQ7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB7XG4gICAgICAgICAgICAgICAgZGVzdHJveTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9qZWN0b3JTdGF0ZSA9PT0gUHJvamVjdG9yQXR0YWNoU3RhdGUuQXR0YWNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2plY3RvclN0YXRlID0gUHJvamVjdG9yQXR0YWNoU3RhdGUuRGV0YWNoZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5vd24oaGFuZGxlKTtcbiAgICAgICAgICAgIHRoaXMuX2F0dGFjaEhhbmRsZSA9IGhhbmRsZTtcbiAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rpb25PcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcHJvamVjdGlvbk9wdGlvbnMsIHsgc3luYzogIXRoaXMuX2FzeW5jIH0pO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBBdHRhY2hUeXBlLkFwcGVuZDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvamVjdGlvbiA9IGRvbS5hcHBlbmQodGhpcy5yb290LCB0aGlzLCB0aGlzLl9wcm9qZWN0aW9uT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgQXR0YWNoVHlwZS5NZXJnZTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvamVjdGlvbiA9IGRvbS5tZXJnZSh0aGlzLnJvb3QsIHRoaXMsIHRoaXMuX3Byb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXR0YWNoSGFuZGxlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRzbGliXzEuX19kZWNvcmF0ZShbXG4gICAgICAgIGFmdGVyUmVuZGVyKCksXG4gICAgICAgIHRzbGliXzEuX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEZ1bmN0aW9uKSxcbiAgICAgICAgdHNsaWJfMS5fX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW09iamVjdF0pLFxuICAgICAgICB0c2xpYl8xLl9fbWV0YWRhdGEoXCJkZXNpZ246cmV0dXJudHlwZVwiLCB2b2lkIDApXG4gICAgXSwgUHJvamVjdG9yLnByb3RvdHlwZSwgXCJhZnRlclJlbmRlclwiLCBudWxsKTtcbiAgICByZXR1cm4gUHJvamVjdG9yO1xufVxuZXhwb3J0IGRlZmF1bHQgUHJvamVjdG9yTWl4aW47XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Qcm9qZWN0b3IubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL21peGlucy9Qcm9qZWN0b3IubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9taXhpbnMvUHJvamVjdG9yLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgSW5qZWN0b3IgfSBmcm9tICcuLy4uL0luamVjdG9yJztcbmltcG9ydCB7IGluamVjdCB9IGZyb20gJy4vLi4vZGVjb3JhdG9ycy9pbmplY3QnO1xuaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi8uLi9kZWNvcmF0b3JzL2hhbmRsZURlY29yYXRvcic7XG5pbXBvcnQgeyBkaWZmUHJvcGVydHkgfSBmcm9tICcuLy4uL2RlY29yYXRvcnMvZGlmZlByb3BlcnR5JztcbmltcG9ydCB7IHNoYWxsb3cgfSBmcm9tICcuLy4uL2RpZmYnO1xuY29uc3QgVEhFTUVfS0VZID0gJyBfa2V5JztcbmV4cG9ydCBjb25zdCBJTkpFQ1RFRF9USEVNRV9LRVkgPSBTeW1ib2woJ3RoZW1lJyk7XG4vKipcbiAqIERlY29yYXRvciBmb3IgYmFzZSBjc3MgY2xhc3Nlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGhlbWUodGhlbWUpIHtcbiAgICByZXR1cm4gaGFuZGxlRGVjb3JhdG9yKCh0YXJnZXQpID0+IHtcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcignYmFzZVRoZW1lQ2xhc3NlcycsIHRoZW1lKTtcbiAgICB9KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIHJldmVyc2UgbG9va3VwIGZvciB0aGUgY2xhc3NlcyBwYXNzZWQgaW4gdmlhIHRoZSBgdGhlbWVgIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBjbGFzc2VzIFRoZSBiYXNlQ2xhc3NlcyBvYmplY3RcbiAqIEByZXF1aXJlc1xuICovXG5mdW5jdGlvbiBjcmVhdGVUaGVtZUNsYXNzZXNMb29rdXAoY2xhc3Nlcykge1xuICAgIHJldHVybiBjbGFzc2VzLnJlZHVjZSgoY3VycmVudENsYXNzTmFtZXMsIGJhc2VDbGFzcykgPT4ge1xuICAgICAgICBPYmplY3Qua2V5cyhiYXNlQ2xhc3MpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgY3VycmVudENsYXNzTmFtZXNbYmFzZUNsYXNzW2tleV1dID0ga2V5O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzc05hbWVzO1xuICAgIH0sIHt9KTtcbn1cbi8qKlxuICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBpcyBnaXZlbiBhIHRoZW1lIGFuZCBhbiBvcHRpb25hbCByZWdpc3RyeSwgdGhlIHRoZW1lXG4gKiBpbmplY3RvciBpcyBkZWZpbmVkIGFnYWluc3QgdGhlIHJlZ2lzdHJ5LCByZXR1cm5pbmcgdGhlIHRoZW1lLlxuICpcbiAqIEBwYXJhbSB0aGVtZSB0aGUgdGhlbWUgdG8gc2V0XG4gKiBAcGFyYW0gdGhlbWVSZWdpc3RyeSByZWdpc3RyeSB0byBkZWZpbmUgdGhlIHRoZW1lIGluamVjdG9yIGFnYWluc3QuIERlZmF1bHRzXG4gKiB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5XG4gKlxuICogQHJldHVybnMgdGhlIHRoZW1lIGluamVjdG9yIHVzZWQgdG8gc2V0IHRoZSB0aGVtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJUaGVtZUluamVjdG9yKHRoZW1lLCB0aGVtZVJlZ2lzdHJ5KSB7XG4gICAgY29uc3QgdGhlbWVJbmplY3RvciA9IG5ldyBJbmplY3Rvcih0aGVtZSk7XG4gICAgdGhlbWVSZWdpc3RyeS5kZWZpbmVJbmplY3RvcihJTkpFQ1RFRF9USEVNRV9LRVksIChpbnZhbGlkYXRvcikgPT4ge1xuICAgICAgICB0aGVtZUluamVjdG9yLnNldEludmFsaWRhdG9yKGludmFsaWRhdG9yKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHRoZW1lSW5qZWN0b3IuZ2V0KCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoZW1lSW5qZWN0b3I7XG59XG4vKipcbiAqIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGNsYXNzIGRlY29yYXRlZCB3aXRoIHdpdGggVGhlbWVkIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFRoZW1lZE1peGluKEJhc2UpIHtcbiAgICBsZXQgVGhlbWVkID0gY2xhc3MgVGhlbWVkIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogUmVnaXN0ZXJlZCBiYXNlIHRoZW1lIGtleXNcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZEJhc2VUaGVtZUtleXMgPSBbXTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogSW5kaWNhdGVzIGlmIGNsYXNzZXMgbWV0YSBkYXRhIG5lZWQgdG8gYmUgY2FsY3VsYXRlZC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy5fcmVjYWxjdWxhdGVDbGFzc2VzID0gdHJ1ZTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogTG9hZGVkIHRoZW1lXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXMuX3RoZW1lID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhlbWUoY2xhc3Nlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JlY2FsY3VsYXRlQ2xhc3Nlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlY2FsY3VsYXRlVGhlbWVDbGFzc2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjbGFzc2VzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc2VzLm1hcCgoY2xhc3NOYW1lKSA9PiB0aGlzLl9nZXRUaGVtZUNsYXNzKGNsYXNzTmFtZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFRoZW1lQ2xhc3MoY2xhc3Nlcyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZ1bmN0aW9uIGZpcmVkIHdoZW4gYHRoZW1lYCBvciBgZXh0cmFDbGFzc2VzYCBhcmUgY2hhbmdlZC5cbiAgICAgICAgICovXG4gICAgICAgIG9uUHJvcGVydGllc0NoYW5nZWQoKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWNhbGN1bGF0ZUNsYXNzZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIF9nZXRUaGVtZUNsYXNzKGNsYXNzTmFtZSkge1xuICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PT0gdW5kZWZpbmVkIHx8IGNsYXNzTmFtZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBleHRyYUNsYXNzZXMgPSB0aGlzLnByb3BlcnRpZXMuZXh0cmFDbGFzc2VzIHx8IHt9O1xuICAgICAgICAgICAgY29uc3QgdGhlbWVDbGFzc05hbWUgPSB0aGlzLl9iYXNlVGhlbWVDbGFzc2VzUmV2ZXJzZUxvb2t1cFtjbGFzc05hbWVdO1xuICAgICAgICAgICAgbGV0IHJlc3VsdENsYXNzTmFtZXMgPSBbXTtcbiAgICAgICAgICAgIGlmICghdGhlbWVDbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYENsYXNzIG5hbWU6ICcke2NsYXNzTmFtZX0nIG5vdCBmb3VuZCBpbiB0aGVtZWApO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4dHJhQ2xhc3Nlc1t0aGVtZUNsYXNzTmFtZV0pIHtcbiAgICAgICAgICAgICAgICByZXN1bHRDbGFzc05hbWVzLnB1c2goZXh0cmFDbGFzc2VzW3RoZW1lQ2xhc3NOYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fdGhlbWVbdGhlbWVDbGFzc05hbWVdKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0Q2xhc3NOYW1lcy5wdXNoKHRoaXMuX3RoZW1lW3RoZW1lQ2xhc3NOYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHRDbGFzc05hbWVzLnB1c2godGhpcy5fcmVnaXN0ZXJlZEJhc2VUaGVtZVt0aGVtZUNsYXNzTmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENsYXNzTmFtZXMuam9pbignICcpO1xuICAgICAgICB9XG4gICAgICAgIF9yZWNhbGN1bGF0ZVRoZW1lQ2xhc3NlcygpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGhlbWUgPSB7fSB9ID0gdGhpcy5wcm9wZXJ0aWVzO1xuICAgICAgICAgICAgY29uc3QgYmFzZVRoZW1lcyA9IHRoaXMuZ2V0RGVjb3JhdG9yKCdiYXNlVGhlbWVDbGFzc2VzJyk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3JlZ2lzdGVyZWRCYXNlVGhlbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lID0gYmFzZVRoZW1lcy5yZWR1Y2UoKGZpbmFsQmFzZVRoZW1lLCBiYXNlVGhlbWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX2EgPSBUSEVNRV9LRVksIGtleSA9IGJhc2VUaGVtZVtfYV0sIGNsYXNzZXMgPSB0c2xpYl8xLl9fcmVzdChiYXNlVGhlbWUsIFt0eXBlb2YgX2EgPT09IFwic3ltYm9sXCIgPyBfYSA6IF9hICsgXCJcIl0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lS2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBmaW5hbEJhc2VUaGVtZSwgY2xhc3Nlcyk7XG4gICAgICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Jhc2VUaGVtZUNsYXNzZXNSZXZlcnNlTG9va3VwID0gY3JlYXRlVGhlbWVDbGFzc2VzTG9va3VwKGJhc2VUaGVtZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdGhlbWUgPSB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lS2V5cy5yZWR1Y2UoKGJhc2VUaGVtZSwgdGhlbWVLZXkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgYmFzZVRoZW1lLCB0aGVtZVt0aGVtZUtleV0pO1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgdGhpcy5fcmVjYWxjdWxhdGVDbGFzc2VzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHRzbGliXzEuX19kZWNvcmF0ZShbXG4gICAgICAgIGRpZmZQcm9wZXJ0eSgndGhlbWUnLCBzaGFsbG93KSxcbiAgICAgICAgZGlmZlByb3BlcnR5KCdleHRyYUNsYXNzZXMnLCBzaGFsbG93KSxcbiAgICAgICAgdHNsaWJfMS5fX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgICAgICB0c2xpYl8xLl9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbXSksXG4gICAgICAgIHRzbGliXzEuX19tZXRhZGF0YShcImRlc2lnbjpyZXR1cm50eXBlXCIsIHZvaWQgMClcbiAgICBdLCBUaGVtZWQucHJvdG90eXBlLCBcIm9uUHJvcGVydGllc0NoYW5nZWRcIiwgbnVsbCk7XG4gICAgVGhlbWVkID0gdHNsaWJfMS5fX2RlY29yYXRlKFtcbiAgICAgICAgaW5qZWN0KHtcbiAgICAgICAgICAgIG5hbWU6IElOSkVDVEVEX1RIRU1FX0tFWSxcbiAgICAgICAgICAgIGdldFByb3BlcnRpZXM6ICh0aGVtZSwgcHJvcGVydGllcykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcHJvcGVydGllcy50aGVtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB0aGVtZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgXSwgVGhlbWVkKTtcbiAgICByZXR1cm4gVGhlbWVkO1xufVxuZXhwb3J0IGRlZmF1bHQgVGhlbWVkTWl4aW47XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UaGVtZWQubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL21peGlucy9UaGVtZWQubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9taXhpbnMvVGhlbWVkLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgV2lkZ2V0QmFzZSwgbm9CaW5kIH0gZnJvbSAnLi9XaWRnZXRCYXNlJztcbmltcG9ydCB7IFByb2plY3Rvck1peGluIH0gZnJvbSAnLi9taXhpbnMvUHJvamVjdG9yJztcbmltcG9ydCB7IGZyb20gfSBmcm9tICdAZG9qby9zaGltL2FycmF5JztcbmltcG9ydCB7IHcsIGRvbSB9IGZyb20gJy4vZCc7XG5pbXBvcnQgZ2xvYmFsIGZyb20gJ0Bkb2pvL3NoaW0vZ2xvYmFsJztcbmltcG9ydCB7IHJlZ2lzdGVyVGhlbWVJbmplY3RvciB9IGZyb20gJy4vbWl4aW5zL1RoZW1lZCc7XG5pbXBvcnQgeyBhbHdheXNSZW5kZXIgfSBmcm9tICcuL2RlY29yYXRvcnMvYWx3YXlzUmVuZGVyJztcbmV4cG9ydCB2YXIgQ3VzdG9tRWxlbWVudENoaWxkVHlwZTtcbihmdW5jdGlvbiAoQ3VzdG9tRWxlbWVudENoaWxkVHlwZSkge1xuICAgIEN1c3RvbUVsZW1lbnRDaGlsZFR5cGVbXCJET0pPXCJdID0gXCJET0pPXCI7XG4gICAgQ3VzdG9tRWxlbWVudENoaWxkVHlwZVtcIk5PREVcIl0gPSBcIk5PREVcIjtcbiAgICBDdXN0b21FbGVtZW50Q2hpbGRUeXBlW1wiVEVYVFwiXSA9IFwiVEVYVFwiO1xufSkoQ3VzdG9tRWxlbWVudENoaWxkVHlwZSB8fCAoQ3VzdG9tRWxlbWVudENoaWxkVHlwZSA9IHt9KSk7XG5leHBvcnQgZnVuY3Rpb24gRG9tVG9XaWRnZXRXcmFwcGVyKGRvbU5vZGUpIHtcbiAgICBsZXQgRG9tVG9XaWRnZXRXcmFwcGVyID0gY2xhc3MgRG9tVG9XaWRnZXRXcmFwcGVyIGV4dGVuZHMgV2lkZ2V0QmFzZSB7XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyh0aGlzLnByb3BlcnRpZXMpLnJlZHVjZSgocHJvcHMsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5wcm9wZXJ0aWVzW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKGtleS5pbmRleE9mKCdvbicpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IGBfXyR7a2V5fWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByb3BzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvcHM7XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICByZXR1cm4gZG9tKHsgbm9kZTogZG9tTm9kZSwgcHJvcHM6IHByb3BlcnRpZXMsIGRpZmZUeXBlOiAnZG9tJyB9KTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZ2V0IGRvbU5vZGUoKSB7XG4gICAgICAgICAgICByZXR1cm4gZG9tTm9kZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRG9tVG9XaWRnZXRXcmFwcGVyID0gdHNsaWJfMS5fX2RlY29yYXRlKFtcbiAgICAgICAgYWx3YXlzUmVuZGVyKClcbiAgICBdLCBEb21Ub1dpZGdldFdyYXBwZXIpO1xuICAgIHJldHVybiBEb21Ub1dpZGdldFdyYXBwZXI7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKGRlc2NyaXB0b3IsIFdpZGdldENvbnN0cnVjdG9yKSB7XG4gICAgY29uc3QgeyBhdHRyaWJ1dGVzLCBjaGlsZFR5cGUsIHJlZ2lzdHJ5RmFjdG9yeSB9ID0gZGVzY3JpcHRvcjtcbiAgICBjb25zdCBhdHRyaWJ1dGVNYXAgPSB7fTtcbiAgICBhdHRyaWJ1dGVzLmZvckVhY2goKHByb3BlcnR5TmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGF0dHJpYnV0ZU1hcFthdHRyaWJ1dGVOYW1lXSA9IHByb3BlcnR5TmFtZTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkcmVuID0gW107XG4gICAgICAgICAgICB0aGlzLl9ldmVudFByb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxpc2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5faW5pdGlhbGlzZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBkb21Qcm9wZXJ0aWVzID0ge307XG4gICAgICAgICAgICBjb25zdCB7IGF0dHJpYnV0ZXMsIHByb3BlcnRpZXMsIGV2ZW50cyB9ID0gZGVzY3JpcHRvcjtcbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9wcm9wZXJ0aWVzLCB0aGlzLl9hdHRyaWJ1dGVzVG9Qcm9wZXJ0aWVzKGF0dHJpYnV0ZXMpKTtcbiAgICAgICAgICAgIFsuLi5hdHRyaWJ1dGVzLCAuLi5wcm9wZXJ0aWVzXS5mb3JFYWNoKChwcm9wZXJ0eU5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXNbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZFByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZS5yZXBsYWNlKC9eb24vLCAnX18nKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlcmVkUHJvcGVydHlOYW1lICE9PSBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tUHJvcGVydGllc1tmaWx0ZXJlZFByb3BlcnR5TmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXQ6ICgpID0+IHRoaXMuX2dldFByb3BlcnR5KHByb3BlcnR5TmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXQ6ICh2YWx1ZSkgPT4gdGhpcy5fc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZG9tUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICBnZXQ6ICgpID0+IHRoaXMuX2dldFByb3BlcnR5KHByb3BlcnR5TmFtZSksXG4gICAgICAgICAgICAgICAgICAgIHNldDogKHZhbHVlKSA9PiB0aGlzLl9zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGV2ZW50cy5mb3JFYWNoKChwcm9wZXJ0eU5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBwcm9wZXJ0eU5hbWUucmVwbGFjZSgvXm9uLywgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRQcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUucmVwbGFjZSgvXm9uLywgJ19fb24nKTtcbiAgICAgICAgICAgICAgICBkb21Qcm9wZXJ0aWVzW2ZpbHRlcmVkUHJvcGVydHlOYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiAoKSA9PiB0aGlzLl9nZXRFdmVudFByb3BlcnR5KHByb3BlcnR5TmFtZSksXG4gICAgICAgICAgICAgICAgICAgIHNldDogKHZhbHVlKSA9PiB0aGlzLl9zZXRFdmVudFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLl9ldmVudFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudENhbGxiYWNrID0gdGhpcy5fZ2V0RXZlbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV2ZW50Q2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Q2FsbGJhY2soLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBhcmdzXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCBkb21Qcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY2hpbGRUeXBlID09PSBDdXN0b21FbGVtZW50Q2hpbGRUeXBlLlRFWFQgPyB0aGlzLmNoaWxkTm9kZXMgOiB0aGlzLmNoaWxkcmVuO1xuICAgICAgICAgICAgZnJvbShjaGlsZHJlbikuZm9yRWFjaCgoY2hpbGROb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkVHlwZSA9PT0gQ3VzdG9tRWxlbWVudENoaWxkVHlwZS5ET0pPKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkTm9kZS5hZGRFdmVudExpc3RlbmVyKCdkb2pvLWNlLXJlbmRlcicsICgpID0+IHRoaXMuX3JlbmRlcigpKTtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGROb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2Rvam8tY2UtY29ubmVjdGVkJywgKCkgPT4gdGhpcy5fcmVuZGVyKCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGlsZHJlbi5wdXNoKERvbVRvV2lkZ2V0V3JhcHBlcihjaGlsZE5vZGUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoaWxkcmVuLnB1c2goZG9tKHsgbm9kZTogY2hpbGROb2RlLCBkaWZmVHlwZTogJ2RvbScgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdkb2pvLWNlLWNvbm5lY3RlZCcsIChlKSA9PiB0aGlzLl9jaGlsZENvbm5lY3RlZChlKSk7XG4gICAgICAgICAgICBjb25zdCB3aWRnZXRQcm9wZXJ0aWVzID0gdGhpcy5fcHJvcGVydGllcztcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlckNoaWxkcmVuID0gKCkgPT4gdGhpcy5fX2NoaWxkcmVuX18oKTtcbiAgICAgICAgICAgIGNvbnN0IFdyYXBwZXIgPSBjbGFzcyBleHRlbmRzIFdpZGdldEJhc2Uge1xuICAgICAgICAgICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHcoV2lkZ2V0Q29uc3RydWN0b3IsIHdpZGdldFByb3BlcnRpZXMsIHJlbmRlckNoaWxkcmVuKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCByZWdpc3RyeSA9IHJlZ2lzdHJ5RmFjdG9yeSgpO1xuICAgICAgICAgICAgY29uc3QgdGhlbWVDb250ZXh0ID0gcmVnaXN0ZXJUaGVtZUluamVjdG9yKHRoaXMuX2dldFRoZW1lKCksIHJlZ2lzdHJ5KTtcbiAgICAgICAgICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdkb2pvLXRoZW1lLXNldCcsICgpID0+IHRoZW1lQ29udGV4dC5zZXQodGhpcy5fZ2V0VGhlbWUoKSkpO1xuICAgICAgICAgICAgY29uc3QgUHJvamVjdG9yID0gUHJvamVjdG9yTWl4aW4oV3JhcHBlcik7XG4gICAgICAgICAgICB0aGlzLl9wcm9qZWN0b3IgPSBuZXcgUHJvamVjdG9yKCk7XG4gICAgICAgICAgICB0aGlzLl9wcm9qZWN0b3Iuc2V0UHJvcGVydGllcyh7IHJlZ2lzdHJ5IH0pO1xuICAgICAgICAgICAgdGhpcy5fcHJvamVjdG9yLmFwcGVuZCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxpc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2Rvam8tY2UtY29ubmVjdGVkJywge1xuICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgZGV0YWlsOiB0aGlzXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgX2dldFRoZW1lKCkge1xuICAgICAgICAgICAgaWYgKGdsb2JhbCAmJiBnbG9iYWwuZG9qb2NlICYmIGdsb2JhbC5kb2pvY2UudGhlbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2xvYmFsLmRvam9jZS50aGVtZXNbZ2xvYmFsLmRvam9jZS50aGVtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX2NoaWxkQ29ubmVjdGVkKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBlLmRldGFpbDtcbiAgICAgICAgICAgIGlmIChub2RlLnBhcmVudE5vZGUgPT09IHRoaXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdHMgPSB0aGlzLl9jaGlsZHJlbi5zb21lKChjaGlsZCkgPT4gY2hpbGQuZG9tTm9kZSA9PT0gbm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdkb2pvLWNlLXJlbmRlcicsICgpID0+IHRoaXMuX3JlbmRlcigpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hpbGRyZW4ucHVzaChEb21Ub1dpZGdldFdyYXBwZXIobm9kZSkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX3JlbmRlcigpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9wcm9qZWN0b3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9qZWN0b3IuaW52YWxpZGF0ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2Rvam8tY2UtcmVuZGVyJywge1xuICAgICAgICAgICAgICAgICAgICBidWJibGVzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB0aGlzXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9fcHJvcGVydGllc19fKCkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3Byb3BlcnRpZXMsIHRoaXMuX2V2ZW50UHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICAgICAgX19jaGlsZHJlbl9fKCkge1xuICAgICAgICAgICAgaWYgKGNoaWxkVHlwZSA9PT0gQ3VzdG9tRWxlbWVudENoaWxkVHlwZS5ET0pPKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuLmZpbHRlcigoQ2hpbGQpID0+IENoaWxkLmRvbU5vZGUuaXNXaWRnZXQpLm1hcCgoQ2hpbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkb21Ob2RlIH0gPSBDaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHcoQ2hpbGQsIE9iamVjdC5hc3NpZ24oe30sIGRvbU5vZGUuX19wcm9wZXJ0aWVzX18oKSksIFsuLi5kb21Ob2RlLl9fY2hpbGRyZW5fXygpXSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZFZhbHVlLCB2YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gYXR0cmlidXRlTWFwW25hbWVdO1xuICAgICAgICAgICAgdGhpcy5fc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgX3NldEV2ZW50UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fZXZlbnRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBfZ2V0RXZlbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ldmVudFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBfc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHZhbHVlW25vQmluZF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBfZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIF9hdHRyaWJ1dGVzVG9Qcm9wZXJ0aWVzKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzLnJlZHVjZSgocHJvcGVydGllcywgcHJvcGVydHlOYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IHByb3BlcnR5TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGVydGllcztcbiAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhhdHRyaWJ1dGVNYXApO1xuICAgICAgICB9XG4gICAgICAgIGdldCBpc1dpZGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlcihXaWRnZXRDb25zdHJ1Y3Rvcikge1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBXaWRnZXRDb25zdHJ1Y3Rvci5wcm90b3R5cGUgJiYgV2lkZ2V0Q29uc3RydWN0b3IucHJvdG90eXBlLl9fY3VzdG9tRWxlbWVudERlc2NyaXB0b3I7XG4gICAgaWYgKCFkZXNjcmlwdG9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdldCBkZXNjcmlwdG9yIGZvciBDdXN0b20gRWxlbWVudCwgaGF2ZSB5b3UgYWRkZWQgdGhlIEBjdXN0b21FbGVtZW50IGRlY29yYXRvciB0byB5b3VyIFdpZGdldD8nKTtcbiAgICB9XG4gICAgZ2xvYmFsLmN1c3RvbUVsZW1lbnRzLmRlZmluZShkZXNjcmlwdG9yLnRhZ05hbWUsIGNyZWF0ZShkZXNjcmlwdG9yLCBXaWRnZXRDb25zdHJ1Y3RvcikpO1xufVxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWdpc3RlckN1c3RvbUVsZW1lbnQubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL3JlZ2lzdGVyQ3VzdG9tRWxlbWVudC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL3JlZ2lzdGVyQ3VzdG9tRWxlbWVudC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IGdsb2JhbCBmcm9tICdAZG9qby9zaGltL2dsb2JhbCc7XHJcbmltcG9ydCB7IGZyb20gYXMgYXJyYXlGcm9tIH0gZnJvbSAnQGRvam8vc2hpbS9hcnJheSc7XHJcbmltcG9ydCB7IGlzV05vZGUsIGlzVk5vZGUsIGlzRG9tVk5vZGUsIFZOT0RFLCBXTk9ERSB9IGZyb20gJy4vZCc7XHJcbmltcG9ydCB7IGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yIH0gZnJvbSAnLi9SZWdpc3RyeSc7XHJcbmltcG9ydCBXZWFrTWFwIGZyb20gJ0Bkb2pvL3NoaW0vV2Vha01hcCc7XHJcbmNvbnN0IE5BTUVTUEFDRV9XMyA9ICdodHRwOi8vd3d3LnczLm9yZy8nO1xyXG5jb25zdCBOQU1FU1BBQ0VfU1ZHID0gTkFNRVNQQUNFX1czICsgJzIwMDAvc3ZnJztcclxuY29uc3QgTkFNRVNQQUNFX1hMSU5LID0gTkFNRVNQQUNFX1czICsgJzE5OTkveGxpbmsnO1xyXG5jb25zdCBlbXB0eUFycmF5ID0gW107XHJcbmV4cG9ydCBjb25zdCB3aWRnZXRJbnN0YW5jZU1hcCA9IG5ldyBXZWFrTWFwKCk7XHJcbmNvbnN0IGluc3RhbmNlTWFwID0gbmV3IFdlYWtNYXAoKTtcclxuY29uc3QgcHJvamVjdG9yU3RhdGVNYXAgPSBuZXcgV2Vha01hcCgpO1xyXG5mdW5jdGlvbiBzYW1lKGRub2RlMSwgZG5vZGUyKSB7XHJcbiAgICBpZiAoaXNWTm9kZShkbm9kZTEpICYmIGlzVk5vZGUoZG5vZGUyKSkge1xyXG4gICAgICAgIGlmIChpc0RvbVZOb2RlKGRub2RlMSkgfHwgaXNEb21WTm9kZShkbm9kZTIpKSB7XHJcbiAgICAgICAgICAgIGlmIChkbm9kZTEuZG9tTm9kZSAhPT0gZG5vZGUyLmRvbU5vZGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZG5vZGUxLnRhZyAhPT0gZG5vZGUyLnRhZykge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkbm9kZTEucHJvcGVydGllcy5rZXkgIT09IGRub2RlMi5wcm9wZXJ0aWVzLmtleSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoaXNXTm9kZShkbm9kZTEpICYmIGlzV05vZGUoZG5vZGUyKSkge1xyXG4gICAgICAgIGlmIChkbm9kZTEuaW5zdGFuY2UgPT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZG5vZGUyLndpZGdldENvbnN0cnVjdG9yID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkbm9kZTEud2lkZ2V0Q29uc3RydWN0b3IgIT09IGRub2RlMi53aWRnZXRDb25zdHJ1Y3Rvcikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkbm9kZTEucHJvcGVydGllcy5rZXkgIT09IGRub2RlMi5wcm9wZXJ0aWVzLmtleSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59XHJcbmNvbnN0IG1pc3NpbmdUcmFuc2l0aW9uID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdQcm92aWRlIGEgdHJhbnNpdGlvbnMgb2JqZWN0IHRvIHRoZSBwcm9qZWN0aW9uT3B0aW9ucyB0byBkbyBhbmltYXRpb25zJyk7XHJcbn07XHJcbmZ1bmN0aW9uIGdldFByb2plY3Rpb25PcHRpb25zKHByb2plY3Rvck9wdGlvbnMsIHByb2plY3Rvckluc3RhbmNlKSB7XHJcbiAgICBjb25zdCBkZWZhdWx0cyA9IHtcclxuICAgICAgICBuYW1lc3BhY2U6IHVuZGVmaW5lZCxcclxuICAgICAgICBzdHlsZUFwcGx5ZXI6IGZ1bmN0aW9uIChkb21Ob2RlLCBzdHlsZU5hbWUsIHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGRvbU5vZGUuc3R5bGVbc3R5bGVOYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdHJhbnNpdGlvbnM6IHtcclxuICAgICAgICAgICAgZW50ZXI6IG1pc3NpbmdUcmFuc2l0aW9uLFxyXG4gICAgICAgICAgICBleGl0OiBtaXNzaW5nVHJhbnNpdGlvblxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZGVwdGg6IDAsXHJcbiAgICAgICAgbWVyZ2U6IGZhbHNlLFxyXG4gICAgICAgIHN5bmM6IGZhbHNlLFxyXG4gICAgICAgIHByb2plY3Rvckluc3RhbmNlXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRzLCBwcm9qZWN0b3JPcHRpb25zKTtcclxufVxyXG5mdW5jdGlvbiBjaGVja1N0eWxlVmFsdWUoc3R5bGVWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBzdHlsZVZhbHVlICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU3R5bGUgdmFsdWVzIG11c3QgYmUgc3RyaW5ncycpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHVwZGF0ZUV2ZW50KGRvbU5vZGUsIGV2ZW50TmFtZSwgY3VycmVudFZhbHVlLCBwcm9qZWN0aW9uT3B0aW9ucywgYmluZCwgcHJldmlvdXNWYWx1ZSkge1xyXG4gICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xyXG4gICAgY29uc3QgZXZlbnRNYXAgPSBwcm9qZWN0b3JTdGF0ZS5ub2RlTWFwLmdldChkb21Ob2RlKSB8fCBuZXcgV2Vha01hcCgpO1xyXG4gICAgaWYgKHByZXZpb3VzVmFsdWUpIHtcclxuICAgICAgICBjb25zdCBwcmV2aW91c0V2ZW50ID0gZXZlbnRNYXAuZ2V0KHByZXZpb3VzVmFsdWUpO1xyXG4gICAgICAgIGRvbU5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHByZXZpb3VzRXZlbnQpO1xyXG4gICAgfVxyXG4gICAgbGV0IGNhbGxiYWNrID0gY3VycmVudFZhbHVlLmJpbmQoYmluZCk7XHJcbiAgICBpZiAoZXZlbnROYW1lID09PSAnaW5wdXQnKSB7XHJcbiAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoZXZ0KSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZS5jYWxsKHRoaXMsIGV2dCk7XHJcbiAgICAgICAgICAgIGV2dC50YXJnZXRbJ29uaW5wdXQtdmFsdWUnXSA9IGV2dC50YXJnZXQudmFsdWU7XHJcbiAgICAgICAgfS5iaW5kKGJpbmQpO1xyXG4gICAgfVxyXG4gICAgZG9tTm9kZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgY2FsbGJhY2spO1xyXG4gICAgZXZlbnRNYXAuc2V0KGN1cnJlbnRWYWx1ZSwgY2FsbGJhY2spO1xyXG4gICAgcHJvamVjdG9yU3RhdGUubm9kZU1hcC5zZXQoZG9tTm9kZSwgZXZlbnRNYXApO1xyXG59XHJcbmZ1bmN0aW9uIGFkZENsYXNzZXMoZG9tTm9kZSwgY2xhc3Nlcykge1xyXG4gICAgaWYgKGNsYXNzZXMpIHtcclxuICAgICAgICBjb25zdCBjbGFzc05hbWVzID0gY2xhc3Nlcy5zcGxpdCgnICcpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBkb21Ob2RlLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lc1tpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHJlbW92ZUNsYXNzZXMoZG9tTm9kZSwgY2xhc3Nlcykge1xyXG4gICAgaWYgKGNsYXNzZXMpIHtcclxuICAgICAgICBjb25zdCBjbGFzc05hbWVzID0gY2xhc3Nlcy5zcGxpdCgnICcpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBkb21Ob2RlLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lc1tpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGJ1aWxkUHJldmlvdXNQcm9wZXJ0aWVzKGRvbU5vZGUsIHByZXZpb3VzLCBjdXJyZW50KSB7XHJcbiAgICBjb25zdCB7IGRpZmZUeXBlLCBwcm9wZXJ0aWVzLCBhdHRyaWJ1dGVzIH0gPSBjdXJyZW50O1xyXG4gICAgaWYgKCFkaWZmVHlwZSB8fCBkaWZmVHlwZSA9PT0gJ3Zkb20nKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgcHJvcGVydGllczogcHJldmlvdXMucHJvcGVydGllcywgYXR0cmlidXRlczogcHJldmlvdXMuYXR0cmlidXRlcywgZXZlbnRzOiBwcmV2aW91cy5ldmVudHMgfTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGRpZmZUeXBlID09PSAnbm9uZScpIHtcclxuICAgICAgICByZXR1cm4geyBwcm9wZXJ0aWVzOiB7fSwgYXR0cmlidXRlczogcHJldmlvdXMuYXR0cmlidXRlcyA/IHt9IDogdW5kZWZpbmVkLCBldmVudHM6IHByZXZpb3VzLmV2ZW50cyB9O1xyXG4gICAgfVxyXG4gICAgbGV0IG5ld1Byb3BlcnRpZXMgPSB7XHJcbiAgICAgICAgcHJvcGVydGllczoge31cclxuICAgIH07XHJcbiAgICBpZiAoYXR0cmlidXRlcykge1xyXG4gICAgICAgIG5ld1Byb3BlcnRpZXMuYXR0cmlidXRlcyA9IHt9O1xyXG4gICAgICAgIG5ld1Byb3BlcnRpZXMuZXZlbnRzID0gcHJldmlvdXMuZXZlbnRzO1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHByb3BlcnRpZXMpLmZvckVhY2goKHByb3BOYW1lKSA9PiB7XHJcbiAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wTmFtZV0gPSBkb21Ob2RlW3Byb3BOYW1lXTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKChhdHRyTmFtZSkgPT4ge1xyXG4gICAgICAgICAgICBuZXdQcm9wZXJ0aWVzLmF0dHJpYnV0ZXNbYXR0ck5hbWVdID0gZG9tTm9kZS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBuZXdQcm9wZXJ0aWVzO1xyXG4gICAgfVxyXG4gICAgbmV3UHJvcGVydGllcy5wcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMocHJvcGVydGllcykucmVkdWNlKChwcm9wcywgcHJvcGVydHkpID0+IHtcclxuICAgICAgICBwcm9wc1twcm9wZXJ0eV0gPSBkb21Ob2RlLmdldEF0dHJpYnV0ZShwcm9wZXJ0eSkgfHwgZG9tTm9kZVtwcm9wZXJ0eV07XHJcbiAgICAgICAgcmV0dXJuIHByb3BzO1xyXG4gICAgfSwge30pO1xyXG4gICAgcmV0dXJuIG5ld1Byb3BlcnRpZXM7XHJcbn1cclxuZnVuY3Rpb24gZm9jdXNOb2RlKHByb3BWYWx1ZSwgcHJldmlvdXNWYWx1ZSwgZG9tTm9kZSwgcHJvamVjdGlvbk9wdGlvbnMpIHtcclxuICAgIGxldCByZXN1bHQ7XHJcbiAgICBpZiAodHlwZW9mIHByb3BWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIHJlc3VsdCA9IHByb3BWYWx1ZSgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgcmVzdWx0ID0gcHJvcFZhbHVlICYmICFwcmV2aW91c1ZhbHVlO1xyXG4gICAgfVxyXG4gICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgICAgICBwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcclxuICAgICAgICAgICAgZG9tTm9kZS5mb2N1cygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHJlbW92ZU9ycGhhbmVkRXZlbnRzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcywgcHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMsIG9ubHlFdmVudHMgPSBmYWxzZSkge1xyXG4gICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xyXG4gICAgY29uc3QgZXZlbnRNYXAgPSBwcm9qZWN0b3JTdGF0ZS5ub2RlTWFwLmdldChkb21Ob2RlKTtcclxuICAgIGlmIChldmVudE1hcCkge1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHByZXZpb3VzUHJvcGVydGllcykuZm9yRWFjaCgocHJvcE5hbWUpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaXNFdmVudCA9IHByb3BOYW1lLnN1YnN0cigwLCAyKSA9PT0gJ29uJyB8fCBvbmx5RXZlbnRzO1xyXG4gICAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBvbmx5RXZlbnRzID8gcHJvcE5hbWUgOiBwcm9wTmFtZS5zdWJzdHIoMik7XHJcbiAgICAgICAgICAgIGlmIChpc0V2ZW50ICYmICFwcm9wZXJ0aWVzW3Byb3BOYW1lXSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRDYWxsYmFjayA9IGV2ZW50TWFwLmdldChwcmV2aW91c1Byb3BlcnRpZXNbcHJvcE5hbWVdKTtcclxuICAgICAgICAgICAgICAgIGlmIChldmVudENhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9tTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRDYWxsYmFjayk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiB1cGRhdGVBdHRyaWJ1dGUoZG9tTm9kZSwgYXR0ck5hbWUsIGF0dHJWYWx1ZSwgcHJvamVjdGlvbk9wdGlvbnMpIHtcclxuICAgIGlmIChwcm9qZWN0aW9uT3B0aW9ucy5uYW1lc3BhY2UgPT09IE5BTUVTUEFDRV9TVkcgJiYgYXR0ck5hbWUgPT09ICdocmVmJykge1xyXG4gICAgICAgIGRvbU5vZGUuc2V0QXR0cmlidXRlTlMoTkFNRVNQQUNFX1hMSU5LLCBhdHRyTmFtZSwgYXR0clZhbHVlKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKChhdHRyTmFtZSA9PT0gJ3JvbGUnICYmIGF0dHJWYWx1ZSA9PT0gJycpIHx8IGF0dHJWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgZG9tTm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0ck5hbWUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgZG9tTm9kZS5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIGF0dHJWYWx1ZSk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gdXBkYXRlQXR0cmlidXRlcyhkb21Ob2RlLCBwcmV2aW91c0F0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMsIHByb2plY3Rpb25PcHRpb25zKSB7XHJcbiAgICBjb25zdCBhdHRyTmFtZXMgPSBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKTtcclxuICAgIGNvbnN0IGF0dHJDb3VudCA9IGF0dHJOYW1lcy5sZW5ndGg7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgYXR0ck5hbWUgPSBhdHRyTmFtZXNbaV07XHJcbiAgICAgICAgY29uc3QgYXR0clZhbHVlID0gYXR0cmlidXRlc1thdHRyTmFtZV07XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNBdHRyVmFsdWUgPSBwcmV2aW91c0F0dHJpYnV0ZXNbYXR0ck5hbWVdO1xyXG4gICAgICAgIGlmIChhdHRyVmFsdWUgIT09IHByZXZpb3VzQXR0clZhbHVlKSB7XHJcbiAgICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZShkb21Ob2RlLCBhdHRyTmFtZSwgYXR0clZhbHVlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHVwZGF0ZVByb3BlcnRpZXMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucywgaW5jbHVkZXNFdmVudHNBbmRBdHRyaWJ1dGVzID0gdHJ1ZSkge1xyXG4gICAgbGV0IHByb3BlcnRpZXNVcGRhdGVkID0gZmFsc2U7XHJcbiAgICBjb25zdCBwcm9wTmFtZXMgPSBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKTtcclxuICAgIGNvbnN0IHByb3BDb3VudCA9IHByb3BOYW1lcy5sZW5ndGg7XHJcbiAgICBpZiAocHJvcE5hbWVzLmluZGV4T2YoJ2NsYXNzZXMnKSA9PT0gLTEgJiYgcHJldmlvdXNQcm9wZXJ0aWVzLmNsYXNzZXMpIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcmV2aW91c1Byb3BlcnRpZXMuY2xhc3NlcykpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2aW91c1Byb3BlcnRpZXMuY2xhc3Nlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3Nlcyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMuY2xhc3Nlc1tpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJlbW92ZUNsYXNzZXMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLmNsYXNzZXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGluY2x1ZGVzRXZlbnRzQW5kQXR0cmlidXRlcyAmJiByZW1vdmVPcnBoYW5lZEV2ZW50cyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMsIHByb3BlcnRpZXMsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcENvdW50OyBpKyspIHtcclxuICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHByb3BOYW1lc1tpXTtcclxuICAgICAgICBsZXQgcHJvcFZhbHVlID0gcHJvcGVydGllc1twcm9wTmFtZV07XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHByZXZpb3VzUHJvcGVydGllc1twcm9wTmFtZV07XHJcbiAgICAgICAgaWYgKHByb3BOYW1lID09PSAnY2xhc3NlcycpIHtcclxuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNDbGFzc2VzID0gQXJyYXkuaXNBcnJheShwcmV2aW91c1ZhbHVlKSA/IHByZXZpb3VzVmFsdWUgOiBbcHJldmlvdXNWYWx1ZV07XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDbGFzc2VzID0gQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpID8gcHJvcFZhbHVlIDogW3Byb3BWYWx1ZV07XHJcbiAgICAgICAgICAgIGlmIChwcmV2aW91c0NsYXNzZXMgJiYgcHJldmlvdXNDbGFzc2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGlmICghcHJvcFZhbHVlIHx8IHByb3BWYWx1ZS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZpb3VzQ2xhc3Nlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDbGFzc2VzKGRvbU5vZGUsIHByZXZpb3VzQ2xhc3Nlc1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Q2xhc3NlcyA9IFsuLi5jdXJyZW50Q2xhc3Nlc107XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2aW91c0NsYXNzZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNDbGFzc05hbWUgPSBwcmV2aW91c0NsYXNzZXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c0NsYXNzTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xhc3NJbmRleCA9IG5ld0NsYXNzZXMuaW5kZXhPZihwcmV2aW91c0NsYXNzTmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NJbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDbGFzc2VzKGRvbU5vZGUsIHByZXZpb3VzQ2xhc3NOYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NsYXNzZXMuc3BsaWNlKGNsYXNzSW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3Q2xhc3Nlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRDbGFzc2VzKGRvbU5vZGUsIG5ld0NsYXNzZXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3VycmVudENsYXNzZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBhZGRDbGFzc2VzKGRvbU5vZGUsIGN1cnJlbnRDbGFzc2VzW2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChwcm9wTmFtZSA9PT0gJ2ZvY3VzJykge1xyXG4gICAgICAgICAgICBmb2N1c05vZGUocHJvcFZhbHVlLCBwcmV2aW91c1ZhbHVlLCBkb21Ob2RlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHByb3BOYW1lID09PSAnc3R5bGVzJykge1xyXG4gICAgICAgICAgICBjb25zdCBzdHlsZU5hbWVzID0gT2JqZWN0LmtleXMocHJvcFZhbHVlKTtcclxuICAgICAgICAgICAgY29uc3Qgc3R5bGVDb3VudCA9IHN0eWxlTmFtZXMubGVuZ3RoO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHN0eWxlQ291bnQ7IGorKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVOYW1lID0gc3R5bGVOYW1lc1tqXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1N0eWxlVmFsdWUgPSBwcm9wVmFsdWVbc3R5bGVOYW1lXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZFN0eWxlVmFsdWUgPSBwcmV2aW91c1ZhbHVlICYmIHByZXZpb3VzVmFsdWVbc3R5bGVOYW1lXTtcclxuICAgICAgICAgICAgICAgIGlmIChuZXdTdHlsZVZhbHVlID09PSBvbGRTdHlsZVZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAobmV3U3R5bGVWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrU3R5bGVWYWx1ZShuZXdTdHlsZVZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uT3B0aW9ucy5zdHlsZUFwcGx5ZXIoZG9tTm9kZSwgc3R5bGVOYW1lLCBuZXdTdHlsZVZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb25PcHRpb25zLnN0eWxlQXBwbHllcihkb21Ob2RlLCBzdHlsZU5hbWUsICcnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCFwcm9wVmFsdWUgJiYgdHlwZW9mIHByZXZpb3VzVmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9wVmFsdWUgPSAnJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICd2YWx1ZScpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRvbVZhbHVlID0gZG9tTm9kZVtwcm9wTmFtZV07XHJcbiAgICAgICAgICAgICAgICBpZiAoZG9tVmFsdWUgIT09IHByb3BWYWx1ZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIChkb21Ob2RlWydvbmlucHV0LXZhbHVlJ11cclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBkb21WYWx1ZSA9PT0gZG9tTm9kZVsnb25pbnB1dC12YWx1ZSddXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogcHJvcFZhbHVlICE9PSBwcmV2aW91c1ZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRvbU5vZGVbcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGRvbU5vZGVbJ29uaW5wdXQtdmFsdWUnXSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChwcm9wVmFsdWUgIT09IHByZXZpb3VzVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAocHJvcE5hbWUgIT09ICdrZXknICYmIHByb3BWYWx1ZSAhPT0gcHJldmlvdXNWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IHR5cGVvZiBwcm9wVmFsdWU7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiBwcm9wTmFtZS5sYXN0SW5kZXhPZignb24nLCAwKSA9PT0gMCAmJiBpbmNsdWRlc0V2ZW50c0FuZEF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVFdmVudChkb21Ob2RlLCBwcm9wTmFtZS5zdWJzdHIoMiksIHByb3BWYWx1ZSwgcHJvamVjdGlvbk9wdGlvbnMsIHByb3BlcnRpZXMuYmluZCwgcHJldmlvdXNWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiBwcm9wTmFtZSAhPT0gJ2lubmVySFRNTCcgJiYgaW5jbHVkZXNFdmVudHNBbmRBdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQXR0cmlidXRlKGRvbU5vZGUsIHByb3BOYW1lLCBwcm9wVmFsdWUsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByb3BOYW1lID09PSAnc2Nyb2xsTGVmdCcgfHwgcHJvcE5hbWUgPT09ICdzY3JvbGxUb3AnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbU5vZGVbcHJvcE5hbWVdICE9PSBwcm9wVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9tTm9kZVtwcm9wTmFtZV0gPSBwcm9wVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9tTm9kZVtwcm9wTmFtZV0gPSBwcm9wVmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJvcGVydGllc1VwZGF0ZWQ7XHJcbn1cclxuZnVuY3Rpb24gZmluZEluZGV4T2ZDaGlsZChjaGlsZHJlbiwgc2FtZUFzLCBzdGFydCkge1xyXG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAoc2FtZShjaGlsZHJlbltpXSwgc2FtZUFzKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gLTE7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIHRvUGFyZW50Vk5vZGUoZG9tTm9kZSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB0YWc6ICcnLFxyXG4gICAgICAgIHByb3BlcnRpZXM6IHt9LFxyXG4gICAgICAgIGNoaWxkcmVuOiB1bmRlZmluZWQsXHJcbiAgICAgICAgZG9tTm9kZSxcclxuICAgICAgICB0eXBlOiBWTk9ERVxyXG4gICAgfTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gdG9UZXh0Vk5vZGUoZGF0YSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB0YWc6ICcnLFxyXG4gICAgICAgIHByb3BlcnRpZXM6IHt9LFxyXG4gICAgICAgIGNoaWxkcmVuOiB1bmRlZmluZWQsXHJcbiAgICAgICAgdGV4dDogYCR7ZGF0YX1gLFxyXG4gICAgICAgIGRvbU5vZGU6IHVuZGVmaW5lZCxcclxuICAgICAgICB0eXBlOiBWTk9ERVxyXG4gICAgfTtcclxufVxyXG5mdW5jdGlvbiB0b0ludGVybmFsV05vZGUoaW5zdGFuY2UsIGluc3RhbmNlRGF0YSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBpbnN0YW5jZSxcclxuICAgICAgICByZW5kZXJlZDogW10sXHJcbiAgICAgICAgY29yZVByb3BlcnRpZXM6IGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcyxcclxuICAgICAgICBjaGlsZHJlbjogaW5zdGFuY2UuY2hpbGRyZW4sXHJcbiAgICAgICAgd2lkZ2V0Q29uc3RydWN0b3I6IGluc3RhbmNlLmNvbnN0cnVjdG9yLFxyXG4gICAgICAgIHByb3BlcnRpZXM6IGluc3RhbmNlRGF0YS5pbnB1dFByb3BlcnRpZXMsXHJcbiAgICAgICAgdHlwZTogV05PREVcclxuICAgIH07XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlckFuZERlY29yYXRlQ2hpbGRyZW4oY2hpbGRyZW4sIGluc3RhbmNlKSB7XHJcbiAgICBpZiAoY2hpbGRyZW4gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiBlbXB0eUFycmF5O1xyXG4gICAgfVxyXG4gICAgY2hpbGRyZW4gPSBBcnJheS5pc0FycmF5KGNoaWxkcmVuKSA/IGNoaWxkcmVuIDogW2NoaWxkcmVuXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOykge1xyXG4gICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XHJcbiAgICAgICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQgfHwgY2hpbGQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgY2hpbGRyZW4uc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBjaGlsZHJlbltpXSA9IHRvVGV4dFZOb2RlKGNoaWxkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChpc1ZOb2RlKGNoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLnByb3BlcnRpZXMuYmluZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQucHJvcGVydGllcy5iaW5kID0gaW5zdGFuY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuICYmIGNoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihjaGlsZC5jaGlsZHJlbiwgaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICghY2hpbGQuY29yZVByb3BlcnRpZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLmNvcmVQcm9wZXJ0aWVzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiaW5kOiBpbnN0YW5jZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVJlZ2lzdHJ5OiBpbnN0YW5jZURhdGEuY29yZVByb3BlcnRpZXMuYmFzZVJlZ2lzdHJ5XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5jaGlsZHJlbiAmJiBjaGlsZC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihjaGlsZC5jaGlsZHJlbiwgaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGkrKztcclxuICAgIH1cclxuICAgIHJldHVybiBjaGlsZHJlbjtcclxufVxyXG5mdW5jdGlvbiBub2RlQWRkZWQoZG5vZGUsIHRyYW5zaXRpb25zKSB7XHJcbiAgICBpZiAoaXNWTm9kZShkbm9kZSkgJiYgZG5vZGUucHJvcGVydGllcykge1xyXG4gICAgICAgIGNvbnN0IGVudGVyQW5pbWF0aW9uID0gZG5vZGUucHJvcGVydGllcy5lbnRlckFuaW1hdGlvbjtcclxuICAgICAgICBpZiAoZW50ZXJBbmltYXRpb24pIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbnRlckFuaW1hdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgZW50ZXJBbmltYXRpb24oZG5vZGUuZG9tTm9kZSwgZG5vZGUucHJvcGVydGllcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9ucy5lbnRlcihkbm9kZS5kb21Ob2RlLCBkbm9kZS5wcm9wZXJ0aWVzLCBlbnRlckFuaW1hdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gbm9kZVRvUmVtb3ZlKGRub2RlLCB0cmFuc2l0aW9ucywgcHJvamVjdGlvbk9wdGlvbnMpIHtcclxuICAgIGlmIChpc1dOb2RlKGRub2RlKSkge1xyXG4gICAgICAgIGNvbnN0IHJlbmRlcmVkID0gZG5vZGUucmVuZGVyZWQgfHwgZW1wdHlBcnJheTtcclxuICAgICAgICBpZiAoZG5vZGUuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGRub2RlLmluc3RhbmNlKTtcclxuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLm9uRGV0YWNoKCk7XHJcbiAgICAgICAgICAgIGluc3RhbmNlTWFwLmRlbGV0ZShkbm9kZS5pbnN0YW5jZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVuZGVyZWQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbm9kZVRvUmVtb3ZlKHJlbmRlcmVkW2ldLCB0cmFuc2l0aW9ucywgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlO1xyXG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBkbm9kZS5wcm9wZXJ0aWVzO1xyXG4gICAgICAgIGlmIChkbm9kZS5jaGlsZHJlbiAmJiBkbm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIG5vZGVUb1JlbW92ZShkbm9kZS5jaGlsZHJlbltpXSwgdHJhbnNpdGlvbnMsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBleGl0QW5pbWF0aW9uID0gcHJvcGVydGllcy5leGl0QW5pbWF0aW9uO1xyXG4gICAgICAgIGlmIChwcm9wZXJ0aWVzICYmIGV4aXRBbmltYXRpb24pIHtcclxuICAgICAgICAgICAgZG9tTm9kZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xyXG4gICAgICAgICAgICBjb25zdCByZW1vdmVEb21Ob2RlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgZG9tTm9kZSAmJiBkb21Ob2RlLnBhcmVudE5vZGUgJiYgZG9tTm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRvbU5vZGUpO1xyXG4gICAgICAgICAgICAgICAgZG5vZGUuZG9tTm9kZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBleGl0QW5pbWF0aW9uID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICBleGl0QW5pbWF0aW9uKGRvbU5vZGUsIHJlbW92ZURvbU5vZGUsIHByb3BlcnRpZXMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbnMuZXhpdChkbm9kZS5kb21Ob2RlLCBwcm9wZXJ0aWVzLCBleGl0QW5pbWF0aW9uLCByZW1vdmVEb21Ob2RlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBkb21Ob2RlICYmIGRvbU5vZGUucGFyZW50Tm9kZSAmJiBkb21Ob2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZG9tTm9kZSk7XHJcbiAgICAgICAgZG5vZGUuZG9tTm9kZSA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBjaGVja0Rpc3Rpbmd1aXNoYWJsZShjaGlsZE5vZGVzLCBpbmRleFRvQ2hlY2ssIHBhcmVudEluc3RhbmNlKSB7XHJcbiAgICBjb25zdCBjaGlsZE5vZGUgPSBjaGlsZE5vZGVzW2luZGV4VG9DaGVja107XHJcbiAgICBpZiAoaXNWTm9kZShjaGlsZE5vZGUpICYmICFjaGlsZE5vZGUudGFnKSB7XHJcbiAgICAgICAgcmV0dXJuOyAvLyBUZXh0IG5vZGVzIG5lZWQgbm90IGJlIGRpc3Rpbmd1aXNoYWJsZVxyXG4gICAgfVxyXG4gICAgY29uc3QgeyBrZXkgfSA9IGNoaWxkTm9kZS5wcm9wZXJ0aWVzO1xyXG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gbnVsbCkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoaSAhPT0gaW5kZXhUb0NoZWNrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gY2hpbGROb2Rlc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChzYW1lKG5vZGUsIGNoaWxkTm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZUlkZW50aWZpZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50TmFtZSA9IHBhcmVudEluc3RhbmNlLmNvbnN0cnVjdG9yLm5hbWUgfHwgJ3Vua25vd24nO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1dOb2RlKGNoaWxkTm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUlkZW50aWZpZXIgPSBjaGlsZE5vZGUud2lkZ2V0Q29uc3RydWN0b3IubmFtZSB8fCAndW5rbm93bic7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlSWRlbnRpZmllciA9IGNoaWxkTm9kZS50YWc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgQSB3aWRnZXQgKCR7cGFyZW50TmFtZX0pIGhhcyBoYWQgYSBjaGlsZCBhZGRkZWQgb3IgcmVtb3ZlZCwgYnV0IHRoZXkgd2VyZSBub3QgYWJsZSB0byB1bmlxdWVseSBpZGVudGlmaWVkLiBJdCBpcyByZWNvbW1lbmRlZCB0byBwcm92aWRlIGEgdW5pcXVlICdrZXknIHByb3BlcnR5IHdoZW4gdXNpbmcgdGhlIHNhbWUgd2lkZ2V0IG9yIGVsZW1lbnQgKCR7bm9kZUlkZW50aWZpZXJ9KSBtdWx0aXBsZSB0aW1lcyBhcyBzaWJsaW5nc2ApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHVwZGF0ZUNoaWxkcmVuKHBhcmVudFZOb2RlLCBvbGRDaGlsZHJlbiwgbmV3Q2hpbGRyZW4sIHBhcmVudEluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgb2xkQ2hpbGRyZW4gPSBvbGRDaGlsZHJlbiB8fCBlbXB0eUFycmF5O1xyXG4gICAgbmV3Q2hpbGRyZW4gPSBuZXdDaGlsZHJlbjtcclxuICAgIGNvbnN0IG9sZENoaWxkcmVuTGVuZ3RoID0gb2xkQ2hpbGRyZW4ubGVuZ3RoO1xyXG4gICAgY29uc3QgbmV3Q2hpbGRyZW5MZW5ndGggPSBuZXdDaGlsZHJlbi5sZW5ndGg7XHJcbiAgICBjb25zdCB0cmFuc2l0aW9ucyA9IHByb2plY3Rpb25PcHRpb25zLnRyYW5zaXRpb25zO1xyXG4gICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xyXG4gICAgcHJvamVjdGlvbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9qZWN0aW9uT3B0aW9ucywgeyBkZXB0aDogcHJvamVjdGlvbk9wdGlvbnMuZGVwdGggKyAxIH0pO1xyXG4gICAgbGV0IG9sZEluZGV4ID0gMDtcclxuICAgIGxldCBuZXdJbmRleCA9IDA7XHJcbiAgICBsZXQgaTtcclxuICAgIGxldCB0ZXh0VXBkYXRlZCA9IGZhbHNlO1xyXG4gICAgd2hpbGUgKG5ld0luZGV4IDwgbmV3Q2hpbGRyZW5MZW5ndGgpIHtcclxuICAgICAgICBsZXQgb2xkQ2hpbGQgPSBvbGRJbmRleCA8IG9sZENoaWxkcmVuTGVuZ3RoID8gb2xkQ2hpbGRyZW5bb2xkSW5kZXhdIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIGNvbnN0IG5ld0NoaWxkID0gbmV3Q2hpbGRyZW5bbmV3SW5kZXhdO1xyXG4gICAgICAgIGlmIChpc1ZOb2RlKG5ld0NoaWxkKSAmJiB0eXBlb2YgbmV3Q2hpbGQuZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgbmV3Q2hpbGQuaW5zZXJ0ZWQgPSBpc1ZOb2RlKG9sZENoaWxkKSAmJiBvbGRDaGlsZC5pbnNlcnRlZDtcclxuICAgICAgICAgICAgYWRkRGVmZXJyZWRQcm9wZXJ0aWVzKG5ld0NoaWxkLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvbGRDaGlsZCAhPT0gdW5kZWZpbmVkICYmIHNhbWUob2xkQ2hpbGQsIG5ld0NoaWxkKSkge1xyXG4gICAgICAgICAgICB0ZXh0VXBkYXRlZCA9IHVwZGF0ZURvbShvbGRDaGlsZCwgbmV3Q2hpbGQsIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRWTm9kZSwgcGFyZW50SW5zdGFuY2UpIHx8IHRleHRVcGRhdGVkO1xyXG4gICAgICAgICAgICBvbGRJbmRleCsrO1xyXG4gICAgICAgICAgICBuZXdJbmRleCsrO1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZmluZE9sZEluZGV4ID0gZmluZEluZGV4T2ZDaGlsZChvbGRDaGlsZHJlbiwgbmV3Q2hpbGQsIG9sZEluZGV4ICsgMSk7XHJcbiAgICAgICAgY29uc3QgYWRkQ2hpbGQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBpbnNlcnRCZWZvcmVEb21Ob2RlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBsZXQgY2hpbGQgPSBvbGRDaGlsZHJlbltvbGRJbmRleF07XHJcbiAgICAgICAgICAgIGlmIChjaGlsZCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IG5leHRJbmRleCA9IG9sZEluZGV4ICsgMTtcclxuICAgICAgICAgICAgICAgIGxldCBpbnNlcnRCZWZvcmVDaGlsZHJlbiA9IFtjaGlsZF07XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoaW5zZXJ0QmVmb3JlQ2hpbGRyZW4ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zZXJ0QmVmb3JlID0gaW5zZXJ0QmVmb3JlQ2hpbGRyZW4uc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNXTm9kZShpbnNlcnRCZWZvcmUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRCZWZvcmUucmVuZGVyZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEJlZm9yZUNoaWxkcmVuLnB1c2goLi4uaW5zZXJ0QmVmb3JlLnJlbmRlcmVkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydEJlZm9yZS5kb21Ob2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRCZWZvcmVEb21Ob2RlID0gaW5zZXJ0QmVmb3JlLmRvbU5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlQ2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIG9sZENoaWxkcmVuW25leHRJbmRleF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ2hpbGRyZW4ucHVzaChvbGRDaGlsZHJlbltuZXh0SW5kZXhdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEluZGV4Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNyZWF0ZURvbShuZXdDaGlsZCwgcGFyZW50Vk5vZGUsIGluc2VydEJlZm9yZURvbU5vZGUsIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRJbnN0YW5jZSk7XHJcbiAgICAgICAgICAgIG5vZGVBZGRlZChuZXdDaGlsZCwgdHJhbnNpdGlvbnMpO1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleFRvQ2hlY2sgPSBuZXdJbmRleDtcclxuICAgICAgICAgICAgcHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MucHVzaCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjaGVja0Rpc3Rpbmd1aXNoYWJsZShuZXdDaGlsZHJlbiwgaW5kZXhUb0NoZWNrLCBwYXJlbnRJbnN0YW5jZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKCFvbGRDaGlsZCB8fCBmaW5kT2xkSW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgIGFkZENoaWxkKCk7XHJcbiAgICAgICAgICAgIG5ld0luZGV4Kys7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCByZW1vdmVDaGlsZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXhUb0NoZWNrID0gb2xkSW5kZXg7XHJcbiAgICAgICAgICAgIHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2hlY2tEaXN0aW5ndWlzaGFibGUob2xkQ2hpbGRyZW4sIGluZGV4VG9DaGVjaywgcGFyZW50SW5zdGFuY2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYgKGlzV05vZGUob2xkQ2hpbGQpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gaW5zdGFuY2VNYXAuZ2V0KG9sZENoaWxkLmluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2xkQ2hpbGQgPSBpdGVtLmRub2RlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5vZGVUb1JlbW92ZShvbGRDaGlsZCwgdHJhbnNpdGlvbnMsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IGZpbmROZXdJbmRleCA9IGZpbmRJbmRleE9mQ2hpbGQobmV3Q2hpbGRyZW4sIG9sZENoaWxkLCBuZXdJbmRleCArIDEpO1xyXG4gICAgICAgIGlmIChmaW5kTmV3SW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHJlbW92ZUNoaWxkKCk7XHJcbiAgICAgICAgICAgIG9sZEluZGV4Kys7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhZGRDaGlsZCgpO1xyXG4gICAgICAgIHJlbW92ZUNoaWxkKCk7XHJcbiAgICAgICAgb2xkSW5kZXgrKztcclxuICAgICAgICBuZXdJbmRleCsrO1xyXG4gICAgfVxyXG4gICAgaWYgKG9sZENoaWxkcmVuTGVuZ3RoID4gb2xkSW5kZXgpIHtcclxuICAgICAgICAvLyBSZW1vdmUgY2hpbGQgZnJhZ21lbnRzXHJcbiAgICAgICAgZm9yIChpID0gb2xkSW5kZXg7IGkgPCBvbGRDaGlsZHJlbkxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4VG9DaGVjayA9IGk7XHJcbiAgICAgICAgICAgIHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2hlY2tEaXN0aW5ndWlzaGFibGUob2xkQ2hpbGRyZW4sIGluZGV4VG9DaGVjaywgcGFyZW50SW5zdGFuY2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgbGV0IGNoaWxkVG9SZW1vdmUgPSBvbGRDaGlsZHJlbltpXTtcclxuICAgICAgICAgICAgaWYgKGlzV05vZGUoY2hpbGRUb1JlbW92ZSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBpbnN0YW5jZU1hcC5nZXQoY2hpbGRUb1JlbW92ZS5pbnN0YW5jZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkVG9SZW1vdmUgPSBpdGVtLmRub2RlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5vZGVUb1JlbW92ZShjaGlsZFRvUmVtb3ZlLCB0cmFuc2l0aW9ucywgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0ZXh0VXBkYXRlZDtcclxufVxyXG5mdW5jdGlvbiBhZGRDaGlsZHJlbihwYXJlbnRWTm9kZSwgY2hpbGRyZW4sIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRJbnN0YW5jZSwgaW5zZXJ0QmVmb3JlID0gdW5kZWZpbmVkLCBjaGlsZE5vZGVzKSB7XHJcbiAgICBpZiAoY2hpbGRyZW4gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgIGlmIChwcm9qZWN0b3JTdGF0ZS5tZXJnZSAmJiBjaGlsZE5vZGVzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjaGlsZE5vZGVzID0gYXJyYXlGcm9tKHBhcmVudFZOb2RlLmRvbU5vZGUuY2hpbGROb2Rlcyk7XHJcbiAgICB9XHJcbiAgICBjb25zdCB0cmFuc2l0aW9ucyA9IHByb2plY3Rpb25PcHRpb25zLnRyYW5zaXRpb25zO1xyXG4gICAgcHJvamVjdGlvbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9qZWN0aW9uT3B0aW9ucywgeyBkZXB0aDogcHJvamVjdGlvbk9wdGlvbnMuZGVwdGggKyAxIH0pO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XHJcbiAgICAgICAgaWYgKGlzVk5vZGUoY2hpbGQpKSB7XHJcbiAgICAgICAgICAgIGlmIChwcm9qZWN0b3JTdGF0ZS5tZXJnZSAmJiBjaGlsZE5vZGVzKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZG9tRWxlbWVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChjaGlsZC5kb21Ob2RlID09PSB1bmRlZmluZWQgJiYgY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCA9IGNoaWxkTm9kZXMuc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZG9tRWxlbWVudCAmJiBkb21FbGVtZW50LnRhZ05hbWUgPT09IChjaGlsZC50YWcudG9VcHBlckNhc2UoKSB8fCB1bmRlZmluZWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmRvbU5vZGUgPSBkb21FbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjcmVhdGVEb20oY2hpbGQsIHBhcmVudFZOb2RlLCBpbnNlcnRCZWZvcmUsIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRJbnN0YW5jZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjcmVhdGVEb20oY2hpbGQsIHBhcmVudFZOb2RlLCBpbnNlcnRCZWZvcmUsIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRJbnN0YW5jZSwgY2hpbGROb2Rlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG5vZGVBZGRlZChjaGlsZCwgdHJhbnNpdGlvbnMpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGluaXRQcm9wZXJ0aWVzQW5kQ2hpbGRyZW4oZG9tTm9kZSwgZG5vZGUsIHBhcmVudEluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgYWRkQ2hpbGRyZW4oZG5vZGUsIGRub2RlLmNoaWxkcmVuLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UsIHVuZGVmaW5lZCk7XHJcbiAgICBpZiAodHlwZW9mIGRub2RlLmRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrID09PSAnZnVuY3Rpb24nICYmIGRub2RlLmluc2VydGVkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBhZGREZWZlcnJlZFByb3BlcnRpZXMoZG5vZGUsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgIH1cclxuICAgIGlmIChkbm9kZS5hdHRyaWJ1dGVzICYmIGRub2RlLmV2ZW50cykge1xyXG4gICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXMoZG9tTm9kZSwge30sIGRub2RlLmF0dHJpYnV0ZXMsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICB1cGRhdGVQcm9wZXJ0aWVzKGRvbU5vZGUsIHt9LCBkbm9kZS5wcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucywgZmFsc2UpO1xyXG4gICAgICAgIHJlbW92ZU9ycGhhbmVkRXZlbnRzKGRvbU5vZGUsIHt9LCBkbm9kZS5ldmVudHMsIHByb2plY3Rpb25PcHRpb25zLCB0cnVlKTtcclxuICAgICAgICBjb25zdCBldmVudHMgPSBkbm9kZS5ldmVudHM7XHJcbiAgICAgICAgT2JqZWN0LmtleXMoZXZlbnRzKS5mb3JFYWNoKChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICB1cGRhdGVFdmVudChkb21Ob2RlLCBldmVudCwgZXZlbnRzW2V2ZW50XSwgcHJvamVjdGlvbk9wdGlvbnMsIGRub2RlLnByb3BlcnRpZXMuYmluZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICB1cGRhdGVQcm9wZXJ0aWVzKGRvbU5vZGUsIHt9LCBkbm9kZS5wcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgICBpZiAoZG5vZGUucHJvcGVydGllcy5rZXkgIT09IG51bGwgJiYgZG5vZGUucHJvcGVydGllcy5rZXkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldChwYXJlbnRJbnN0YW5jZSk7XHJcbiAgICAgICAgaW5zdGFuY2VEYXRhLm5vZGVIYW5kbGVyLmFkZChkb21Ob2RlLCBgJHtkbm9kZS5wcm9wZXJ0aWVzLmtleX1gKTtcclxuICAgIH1cclxuICAgIGRub2RlLmluc2VydGVkID0gdHJ1ZTtcclxufVxyXG5mdW5jdGlvbiBjcmVhdGVEb20oZG5vZGUsIHBhcmVudFZOb2RlLCBpbnNlcnRCZWZvcmUsIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRJbnN0YW5jZSwgY2hpbGROb2Rlcykge1xyXG4gICAgbGV0IGRvbU5vZGU7XHJcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XHJcbiAgICBpZiAoaXNXTm9kZShkbm9kZSkpIHtcclxuICAgICAgICBsZXQgeyB3aWRnZXRDb25zdHJ1Y3RvciB9ID0gZG5vZGU7XHJcbiAgICAgICAgY29uc3QgcGFyZW50SW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHBhcmVudEluc3RhbmNlKTtcclxuICAgICAgICBpZiAoIWlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yKHdpZGdldENvbnN0cnVjdG9yKSkge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gcGFyZW50SW5zdGFuY2VEYXRhLnJlZ2lzdHJ5KCkuZ2V0KHdpZGdldENvbnN0cnVjdG9yKTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0gPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB3aWRnZXRDb25zdHJ1Y3RvciA9IGl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IHdpZGdldENvbnN0cnVjdG9yKCk7XHJcbiAgICAgICAgZG5vZGUuaW5zdGFuY2UgPSBpbnN0YW5jZTtcclxuICAgICAgICBjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpO1xyXG4gICAgICAgIGluc3RhbmNlRGF0YS5pbnZhbGlkYXRlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpbnN0YW5jZURhdGEuZGlydHkgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHByb2plY3RvclN0YXRlLnJlbmRlclF1ZXVlLnB1c2goeyBpbnN0YW5jZSwgZGVwdGg6IHByb2plY3Rpb25PcHRpb25zLmRlcHRoIH0pO1xyXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVSZW5kZXIocHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICBpbnN0YW5jZURhdGEucmVuZGVyaW5nID0gdHJ1ZTtcclxuICAgICAgICBpbnN0YW5jZS5fX3NldENvcmVQcm9wZXJ0aWVzX18oZG5vZGUuY29yZVByb3BlcnRpZXMpO1xyXG4gICAgICAgIGluc3RhbmNlLl9fc2V0Q2hpbGRyZW5fXyhkbm9kZS5jaGlsZHJlbik7XHJcbiAgICAgICAgaW5zdGFuY2UuX19zZXRQcm9wZXJ0aWVzX18oZG5vZGUucHJvcGVydGllcyk7XHJcbiAgICAgICAgY29uc3QgcmVuZGVyZWQgPSBpbnN0YW5jZS5fX3JlbmRlcl9fKCk7XHJcbiAgICAgICAgaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChyZW5kZXJlZCkge1xyXG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJlZFJlbmRlcmVkID0gZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihyZW5kZXJlZCwgaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICBkbm9kZS5yZW5kZXJlZCA9IGZpbHRlcmVkUmVuZGVyZWQ7XHJcbiAgICAgICAgICAgIGFkZENoaWxkcmVuKHBhcmVudFZOb2RlLCBmaWx0ZXJlZFJlbmRlcmVkLCBwcm9qZWN0aW9uT3B0aW9ucywgaW5zdGFuY2UsIGluc2VydEJlZm9yZSwgY2hpbGROb2Rlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGluc3RhbmNlTWFwLnNldChpbnN0YW5jZSwgeyBkbm9kZSwgcGFyZW50Vk5vZGUgfSk7XHJcbiAgICAgICAgaW5zdGFuY2VEYXRhLm5vZGVIYW5kbGVyLmFkZFJvb3QoKTtcclxuICAgICAgICBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcclxuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLm9uQXR0YWNoKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBpZiAocHJvamVjdG9yU3RhdGUubWVyZ2UgJiYgcHJvamVjdG9yU3RhdGUubWVyZ2VFbGVtZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgZG9tTm9kZSA9IGRub2RlLmRvbU5vZGUgPSBwcm9qZWN0aW9uT3B0aW9ucy5tZXJnZUVsZW1lbnQ7XHJcbiAgICAgICAgICAgIHByb2plY3RvclN0YXRlLm1lcmdlRWxlbWVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgaW5pdFByb3BlcnRpZXNBbmRDaGlsZHJlbihkb21Ob2RlLCBkbm9kZSwgcGFyZW50SW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkb2MgPSBwYXJlbnRWTm9kZS5kb21Ob2RlLm93bmVyRG9jdW1lbnQ7XHJcbiAgICAgICAgaWYgKCFkbm9kZS50YWcgJiYgdHlwZW9mIGRub2RlLnRleHQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGlmIChkbm9kZS5kb21Ob2RlICE9PSB1bmRlZmluZWQgJiYgcGFyZW50Vk5vZGUuZG9tTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3RG9tTm9kZSA9IGRub2RlLmRvbU5vZGUub3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkbm9kZS50ZXh0KTtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRWTm9kZS5kb21Ob2RlID09PSBkbm9kZS5kb21Ob2RlLnBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRWTm9kZS5kb21Ob2RlLnJlcGxhY2VDaGlsZChuZXdEb21Ob2RlLCBkbm9kZS5kb21Ob2RlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFZOb2RlLmRvbU5vZGUuYXBwZW5kQ2hpbGQobmV3RG9tTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZG5vZGUuZG9tTm9kZS5wYXJlbnROb2RlICYmIGRub2RlLmRvbU5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkbm9kZS5kb21Ob2RlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGRub2RlLmRvbU5vZGUgPSBuZXdEb21Ob2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZG9tTm9kZSA9IGRub2RlLmRvbU5vZGUgPSBkb2MuY3JlYXRlVGV4dE5vZGUoZG5vZGUudGV4dCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRWTm9kZS5kb21Ob2RlLmluc2VydEJlZm9yZShkb21Ob2RlLCBpbnNlcnRCZWZvcmUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Vk5vZGUuZG9tTm9kZS5hcHBlbmRDaGlsZChkb21Ob2RlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGRub2RlLmRvbU5vZGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRub2RlLnRhZyA9PT0gJ3N2ZycpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHByb2plY3Rpb25PcHRpb25zLCB7IG5hbWVzcGFjZTogTkFNRVNQQUNFX1NWRyB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0aW9uT3B0aW9ucy5uYW1lc3BhY2UgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhwcm9qZWN0aW9uT3B0aW9ucy5uYW1lc3BhY2UsIGRub2RlLnRhZyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBkb21Ob2RlID0gZG5vZGUuZG9tTm9kZSA9IGRub2RlLmRvbU5vZGUgfHwgZG9jLmNyZWF0ZUVsZW1lbnQoZG5vZGUudGFnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGluaXRQcm9wZXJ0aWVzQW5kQ2hpbGRyZW4oZG9tTm9kZSwgZG5vZGUsIHBhcmVudEluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgICAgIGlmIChpbnNlcnRCZWZvcmUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50Vk5vZGUuZG9tTm9kZS5pbnNlcnRCZWZvcmUoZG9tTm9kZSwgaW5zZXJ0QmVmb3JlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChkb21Ob2RlLnBhcmVudE5vZGUgIT09IHBhcmVudFZOb2RlLmRvbU5vZGUpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudFZOb2RlLmRvbU5vZGUuYXBwZW5kQ2hpbGQoZG9tTm9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gdXBkYXRlRG9tKHByZXZpb3VzLCBkbm9kZSwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudFZOb2RlLCBwYXJlbnRJbnN0YW5jZSkge1xyXG4gICAgaWYgKGlzV05vZGUoZG5vZGUpKSB7XHJcbiAgICAgICAgY29uc3QgeyBpbnN0YW5jZSB9ID0gcHJldmlvdXM7XHJcbiAgICAgICAgY29uc3QgeyBwYXJlbnRWTm9kZSwgZG5vZGU6IG5vZGUgfSA9IGluc3RhbmNlTWFwLmdldChpbnN0YW5jZSk7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNSZW5kZXJlZCA9IG5vZGUgPyBub2RlLnJlbmRlcmVkIDogcHJldmlvdXMucmVuZGVyZWQ7XHJcbiAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKTtcclxuICAgICAgICBpbnN0YW5jZURhdGEucmVuZGVyaW5nID0gdHJ1ZTtcclxuICAgICAgICBpbnN0YW5jZS5fX3NldENvcmVQcm9wZXJ0aWVzX18oZG5vZGUuY29yZVByb3BlcnRpZXMpO1xyXG4gICAgICAgIGluc3RhbmNlLl9fc2V0Q2hpbGRyZW5fXyhkbm9kZS5jaGlsZHJlbik7XHJcbiAgICAgICAgaW5zdGFuY2UuX19zZXRQcm9wZXJ0aWVzX18oZG5vZGUucHJvcGVydGllcyk7XHJcbiAgICAgICAgZG5vZGUuaW5zdGFuY2UgPSBpbnN0YW5jZTtcclxuICAgICAgICBpZiAoaW5zdGFuY2VEYXRhLmRpcnR5ID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVkID0gaW5zdGFuY2UuX19yZW5kZXJfXygpO1xyXG4gICAgICAgICAgICBpbnN0YW5jZURhdGEucmVuZGVyaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGRub2RlLnJlbmRlcmVkID0gZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihyZW5kZXJlZCwgaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICB1cGRhdGVDaGlsZHJlbihwYXJlbnRWTm9kZSwgcHJldmlvdXNSZW5kZXJlZCwgZG5vZGUucmVuZGVyZWQsIGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpbnN0YW5jZURhdGEucmVuZGVyaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGRub2RlLnJlbmRlcmVkID0gcHJldmlvdXNSZW5kZXJlZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5zdGFuY2VNYXAuc2V0KGluc3RhbmNlLCB7IGRub2RlLCBwYXJlbnRWTm9kZSB9KTtcclxuICAgICAgICBpbnN0YW5jZURhdGEubm9kZUhhbmRsZXIuYWRkUm9vdCgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKHByZXZpb3VzID09PSBkbm9kZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGRvbU5vZGUgPSAoZG5vZGUuZG9tTm9kZSA9IHByZXZpb3VzLmRvbU5vZGUpO1xyXG4gICAgICAgIGxldCB0ZXh0VXBkYXRlZCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCB1cGRhdGVkID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKCFkbm9kZS50YWcgJiYgdHlwZW9mIGRub2RlLnRleHQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGlmIChkbm9kZS50ZXh0ICE9PSBwcmV2aW91cy50ZXh0KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdEb21Ob2RlID0gZG9tTm9kZS5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRub2RlLnRleHQpO1xyXG4gICAgICAgICAgICAgICAgZG9tTm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdEb21Ob2RlLCBkb21Ob2RlKTtcclxuICAgICAgICAgICAgICAgIGRub2RlLmRvbU5vZGUgPSBuZXdEb21Ob2RlO1xyXG4gICAgICAgICAgICAgICAgdGV4dFVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRleHRVcGRhdGVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoZG5vZGUudGFnICYmIGRub2RlLnRhZy5sYXN0SW5kZXhPZignc3ZnJywgMCkgPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHByb2plY3Rpb25PcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvamVjdGlvbk9wdGlvbnMsIHsgbmFtZXNwYWNlOiBOQU1FU1BBQ0VfU1ZHIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwcmV2aW91cy5jaGlsZHJlbiAhPT0gZG5vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihkbm9kZS5jaGlsZHJlbiwgcGFyZW50SW5zdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgZG5vZGUuY2hpbGRyZW4gPSBjaGlsZHJlbjtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZWQgPVxyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNoaWxkcmVuKGRub2RlLCBwcmV2aW91cy5jaGlsZHJlbiwgY2hpbGRyZW4sIHBhcmVudEluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucykgfHwgdXBkYXRlZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c1Byb3BlcnRpZXMgPSBidWlsZFByZXZpb3VzUHJvcGVydGllcyhkb21Ob2RlLCBwcmV2aW91cywgZG5vZGUpO1xyXG4gICAgICAgICAgICBpZiAoZG5vZGUuYXR0cmlidXRlcyAmJiBkbm9kZS5ldmVudHMpIHtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLmF0dHJpYnV0ZXMsIGRub2RlLmF0dHJpYnV0ZXMsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZWQgPVxyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVByb3BlcnRpZXMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLnByb3BlcnRpZXMsIGRub2RlLnByb3BlcnRpZXMsIHByb2plY3Rpb25PcHRpb25zLCBmYWxzZSkgfHwgdXBkYXRlZDtcclxuICAgICAgICAgICAgICAgIHJlbW92ZU9ycGhhbmVkRXZlbnRzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcy5ldmVudHMsIGRub2RlLmV2ZW50cywgcHJvamVjdGlvbk9wdGlvbnMsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRzID0gZG5vZGUuZXZlbnRzO1xyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZXZlbnRzKS5mb3JFYWNoKChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUV2ZW50KGRvbU5vZGUsIGV2ZW50LCBldmVudHNbZXZlbnRdLCBwcm9qZWN0aW9uT3B0aW9ucywgZG5vZGUucHJvcGVydGllcy5iaW5kLCBwcmV2aW91c1Byb3BlcnRpZXMuZXZlbnRzW2V2ZW50XSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZWQgPVxyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVByb3BlcnRpZXMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLnByb3BlcnRpZXMsIGRub2RlLnByb3BlcnRpZXMsIHByb2plY3Rpb25PcHRpb25zKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChkbm9kZS5wcm9wZXJ0aWVzLmtleSAhPT0gbnVsbCAmJiBkbm9kZS5wcm9wZXJ0aWVzLmtleSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQocGFyZW50SW5zdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VEYXRhLm5vZGVIYW5kbGVyLmFkZChkb21Ob2RlLCBgJHtkbm9kZS5wcm9wZXJ0aWVzLmtleX1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodXBkYXRlZCAmJiBkbm9kZS5wcm9wZXJ0aWVzICYmIGRub2RlLnByb3BlcnRpZXMudXBkYXRlQW5pbWF0aW9uKSB7XHJcbiAgICAgICAgICAgIGRub2RlLnByb3BlcnRpZXMudXBkYXRlQW5pbWF0aW9uKGRvbU5vZGUsIGRub2RlLnByb3BlcnRpZXMsIHByZXZpb3VzLnByb3BlcnRpZXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBhZGREZWZlcnJlZFByb3BlcnRpZXModm5vZGUsIHByb2plY3Rpb25PcHRpb25zKSB7XHJcbiAgICAvLyB0cmFuc2ZlciBhbnkgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBwYXNzZWQgLSBhcyB0aGVzZSBtdXN0IGJlIGRlY29yYXRlZCBwcm9wZXJ0aWVzXHJcbiAgICB2bm9kZS5kZWNvcmF0ZWREZWZlcnJlZFByb3BlcnRpZXMgPSB2bm9kZS5wcm9wZXJ0aWVzO1xyXG4gICAgY29uc3QgcHJvcGVydGllcyA9IHZub2RlLmRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrKCEhdm5vZGUuaW5zZXJ0ZWQpO1xyXG4gICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xyXG4gICAgdm5vZGUucHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oe30sIHByb3BlcnRpZXMsIHZub2RlLmRlY29yYXRlZERlZmVycmVkUHJvcGVydGllcyk7XHJcbiAgICBwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcclxuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbih7fSwgdm5vZGUuZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2soISF2bm9kZS5pbnNlcnRlZCksIHZub2RlLmRlY29yYXRlZERlZmVycmVkUHJvcGVydGllcyk7XHJcbiAgICAgICAgdXBkYXRlUHJvcGVydGllcyh2bm9kZS5kb21Ob2RlLCB2bm9kZS5wcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgdm5vZGUucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XHJcbiAgICB9KTtcclxufVxyXG5mdW5jdGlvbiBydW5EZWZlcnJlZFJlbmRlckNhbGxiYWNrcyhwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xyXG4gICAgaWYgKHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLmxlbmd0aCkge1xyXG4gICAgICAgIGlmIChwcm9qZWN0aW9uT3B0aW9ucy5zeW5jKSB7XHJcbiAgICAgICAgICAgIHdoaWxlIChwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gcHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3Muc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gcHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3Muc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gcnVuQWZ0ZXJSZW5kZXJDYWxsYmFja3MocHJvamVjdGlvbk9wdGlvbnMpIHtcclxuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgIGlmIChwcm9qZWN0aW9uT3B0aW9ucy5zeW5jKSB7XHJcbiAgICAgICAgd2hpbGUgKHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKGdsb2JhbC5yZXF1ZXN0SWRsZUNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5yZXF1ZXN0SWRsZUNhbGxiYWNrKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHNjaGVkdWxlUmVuZGVyKHByb2plY3Rpb25PcHRpb25zKSB7XHJcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XHJcbiAgICBpZiAocHJvamVjdGlvbk9wdGlvbnMuc3luYykge1xyXG4gICAgICAgIHJlbmRlcihwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChwcm9qZWN0b3JTdGF0ZS5yZW5kZXJTY2hlZHVsZWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHByb2plY3RvclN0YXRlLnJlbmRlclNjaGVkdWxlZCA9IGdsb2JhbC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICByZW5kZXIocHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHJlbmRlcihwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xyXG4gICAgcHJvamVjdG9yU3RhdGUucmVuZGVyU2NoZWR1bGVkID0gdW5kZWZpbmVkO1xyXG4gICAgY29uc3QgcmVuZGVyUXVldWUgPSBwcm9qZWN0b3JTdGF0ZS5yZW5kZXJRdWV1ZTtcclxuICAgIGNvbnN0IHJlbmRlcnMgPSBbLi4ucmVuZGVyUXVldWVdO1xyXG4gICAgcHJvamVjdG9yU3RhdGUucmVuZGVyUXVldWUgPSBbXTtcclxuICAgIHJlbmRlcnMuc29ydCgoYSwgYikgPT4gYS5kZXB0aCAtIGIuZGVwdGgpO1xyXG4gICAgY29uc3QgcHJldmlvdXNseVJlbmRlcmVkID0gW107XHJcbiAgICB3aGlsZSAocmVuZGVycy5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCB7IGluc3RhbmNlIH0gPSByZW5kZXJzLnNoaWZ0KCk7XHJcbiAgICAgICAgaWYgKGluc3RhbmNlTWFwLmhhcyhpbnN0YW5jZSkgJiYgcHJldmlvdXNseVJlbmRlcmVkLmluZGV4T2YoaW5zdGFuY2UpID09PSAtMSkge1xyXG4gICAgICAgICAgICBwcmV2aW91c2x5UmVuZGVyZWQucHVzaChpbnN0YW5jZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgcGFyZW50Vk5vZGUsIGRub2RlIH0gPSBpbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICB1cGRhdGVEb20oZG5vZGUsIHRvSW50ZXJuYWxXTm9kZShpbnN0YW5jZSwgaW5zdGFuY2VEYXRhKSwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudFZOb2RlLCBpbnN0YW5jZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcnVuQWZ0ZXJSZW5kZXJDYWxsYmFja3MocHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgcnVuRGVmZXJyZWRSZW5kZXJDYWxsYmFja3MocHJvamVjdGlvbk9wdGlvbnMpO1xyXG59XHJcbmV4cG9ydCBjb25zdCBkb20gPSB7XHJcbiAgICBhcHBlbmQ6IGZ1bmN0aW9uIChwYXJlbnROb2RlLCBpbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldChpbnN0YW5jZSk7XHJcbiAgICAgICAgY29uc3QgZmluYWxQcm9qZWN0b3JPcHRpb25zID0gZ2V0UHJvamVjdGlvbk9wdGlvbnMocHJvamVjdGlvbk9wdGlvbnMsIGluc3RhbmNlKTtcclxuICAgICAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHtcclxuICAgICAgICAgICAgYWZ0ZXJSZW5kZXJDYWxsYmFja3M6IFtdLFxyXG4gICAgICAgICAgICBkZWZlcnJlZFJlbmRlckNhbGxiYWNrczogW10sXHJcbiAgICAgICAgICAgIG5vZGVNYXA6IG5ldyBXZWFrTWFwKCksXHJcbiAgICAgICAgICAgIHJlbmRlclNjaGVkdWxlZDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICByZW5kZXJRdWV1ZTogW10sXHJcbiAgICAgICAgICAgIG1lcmdlOiBwcm9qZWN0aW9uT3B0aW9ucy5tZXJnZSB8fCBmYWxzZSxcclxuICAgICAgICAgICAgbWVyZ2VFbGVtZW50OiBwcm9qZWN0aW9uT3B0aW9ucy5tZXJnZUVsZW1lbnRcclxuICAgICAgICB9O1xyXG4gICAgICAgIHByb2plY3RvclN0YXRlTWFwLnNldChpbnN0YW5jZSwgcHJvamVjdG9yU3RhdGUpO1xyXG4gICAgICAgIGZpbmFsUHJvamVjdG9yT3B0aW9ucy5yb290Tm9kZSA9IHBhcmVudE5vZGU7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Vk5vZGUgPSB0b1BhcmVudFZOb2RlKGZpbmFsUHJvamVjdG9yT3B0aW9ucy5yb290Tm9kZSk7XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRvSW50ZXJuYWxXTm9kZShpbnN0YW5jZSwgaW5zdGFuY2VEYXRhKTtcclxuICAgICAgICBpbnN0YW5jZU1hcC5zZXQoaW5zdGFuY2UsIHsgZG5vZGU6IG5vZGUsIHBhcmVudFZOb2RlIH0pO1xyXG4gICAgICAgIGluc3RhbmNlRGF0YS5pbnZhbGlkYXRlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpbnN0YW5jZURhdGEuZGlydHkgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHByb2plY3RvclN0YXRlLnJlbmRlclF1ZXVlLnB1c2goeyBpbnN0YW5jZSwgZGVwdGg6IGZpbmFsUHJvamVjdG9yT3B0aW9ucy5kZXB0aCB9KTtcclxuICAgICAgICAgICAgICAgIHNjaGVkdWxlUmVuZGVyKGZpbmFsUHJvamVjdG9yT3B0aW9ucyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHVwZGF0ZURvbShub2RlLCBub2RlLCBmaW5hbFByb2plY3Rvck9wdGlvbnMsIHBhcmVudFZOb2RlLCBpbnN0YW5jZSk7XHJcbiAgICAgICAgcHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MucHVzaCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5vbkF0dGFjaCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJ1bkRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzKGZpbmFsUHJvamVjdG9yT3B0aW9ucyk7XHJcbiAgICAgICAgcnVuQWZ0ZXJSZW5kZXJDYWxsYmFja3MoZmluYWxQcm9qZWN0b3JPcHRpb25zKTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBkb21Ob2RlOiBmaW5hbFByb2plY3Rvck9wdGlvbnMucm9vdE5vZGVcclxuICAgICAgICB9O1xyXG4gICAgfSxcclxuICAgIGNyZWF0ZTogZnVuY3Rpb24gKGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwgaW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgIH0sXHJcbiAgICBtZXJnZTogZnVuY3Rpb24gKGVsZW1lbnQsIGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyA9IHt9KSB7XHJcbiAgICAgICAgcHJvamVjdGlvbk9wdGlvbnMubWVyZ2UgPSB0cnVlO1xyXG4gICAgICAgIHByb2plY3Rpb25PcHRpb25zLm1lcmdlRWxlbWVudCA9IGVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbiA9IHRoaXMuYXBwZW5kKGVsZW1lbnQucGFyZW50Tm9kZSwgaW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChpbnN0YW5jZSk7XHJcbiAgICAgICAgcHJvamVjdG9yU3RhdGUubWVyZ2UgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gcHJvamVjdGlvbjtcclxuICAgIH1cclxufTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmRvbS5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvdmRvbS5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL3Zkb20ubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsIi8qKiogSU1QT1JUUyBGUk9NIGltcG9ydHMtbG9hZGVyICoqKi9cbnZhciB3aWRnZXRGYWN0b3J5ID0gcmVxdWlyZShcInNyYy9tZW51L01lbnVcIik7XG5cbnZhciByZWdpc3RlckN1c3RvbUVsZW1lbnQgPSByZXF1aXJlKCdAZG9qby93aWRnZXQtY29yZS9yZWdpc3RlckN1c3RvbUVsZW1lbnQnKS5kZWZhdWx0O1xyXG5cclxudmFyIGRlZmF1bHRFeHBvcnQgPSB3aWRnZXRGYWN0b3J5LmRlZmF1bHQ7XHJcbmRlZmF1bHRFeHBvcnQgJiYgcmVnaXN0ZXJDdXN0b21FbGVtZW50KGRlZmF1bHRFeHBvcnQpO1xyXG5cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2ltcG9ydHMtbG9hZGVyP3dpZGdldEZhY3Rvcnk9c3JjL21lbnUvTWVudSEuL25vZGVfbW9kdWxlcy9AZG9qby9jbGktYnVpbGQtd2lkZ2V0L3RlbXBsYXRlL2N1c3RvbS1lbGVtZW50LmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9pbXBvcnRzLWxvYWRlci9pbmRleC5qcz93aWRnZXRGYWN0b3J5PXNyYy9tZW51L01lbnUhLi9ub2RlX21vZHVsZXMvQGRvam8vY2xpLWJ1aWxkLXdpZGdldC90ZW1wbGF0ZS9jdXN0b20tZWxlbWVudC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcclxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcclxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuXHJcblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxyXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxyXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxyXG5cclxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXHJcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDApXHJcbiAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUocmVzdWx0LnZhbHVlKTsgfSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSB5W29wWzBdICYgMiA/IFwicmV0dXJuXCIgOiBvcFswXSA/IFwidGhyb3dcIiA6IFwibmV4dFwiXSkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbMCwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIGV4cG9ydHMpIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKCFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBleHBvcnRzW3BdID0gbVtwXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgIH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChvW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9OyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpIHx8ICgxLGV2YWwpKFwidGhpc1wiKTtcbn0gY2F0Y2goZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZih0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKVxuXHRcdGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vICh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvd2VicGFjay9idWlsZGluL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgeyB2IH0gZnJvbSAnQGRvam8vd2lkZ2V0LWNvcmUvZCc7XHJcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdAZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2N1c3RvbUVsZW1lbnQnO1xyXG5pbXBvcnQgeyBXaWRnZXRQcm9wZXJ0aWVzLCBXTm9kZSB9IGZyb20gJ0Bkb2pvL3dpZGdldC1jb3JlL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyB0aGVtZSwgVGhlbWVkTWl4aW4gfSBmcm9tICdAZG9qby93aWRnZXQtY29yZS9taXhpbnMvVGhlbWVkJztcclxuaW1wb3J0IHsgV2lkZ2V0QmFzZSB9IGZyb20gJ0Bkb2pvL3dpZGdldC1jb3JlL1dpZGdldEJhc2UnO1xyXG5pbXBvcnQgeyBNZW51SXRlbSwgTWVudUl0ZW1Qcm9wZXJ0aWVzIH0gZnJvbSAnLi4vbWVudS1pdGVtL01lbnVJdGVtJztcclxuXHJcbmltcG9ydCAqIGFzIGNzcyBmcm9tICcuL21lbnUubS5jc3MnO1xyXG5cclxuaW50ZXJmYWNlIE1lbnVQcm9wZXJ0aWVzIGV4dGVuZHMgV2lkZ2V0UHJvcGVydGllcyB7XHJcblx0b25TZWxlY3RlZDogKGRhdGE6IGFueSkgPT4gdm9pZDtcclxufVxyXG5cclxuQGN1c3RvbUVsZW1lbnQ8TWVudVByb3BlcnRpZXM+KHtcclxuXHR0YWc6ICdkZW1vLW1lbnUnLFxyXG5cdGV2ZW50czogWydvblNlbGVjdGVkJ11cclxufSlcclxuQHRoZW1lKGNzcylcclxuZXhwb3J0IGNsYXNzIE1lbnUgZXh0ZW5kcyBUaGVtZWRNaXhpbihXaWRnZXRCYXNlKTxNZW51UHJvcGVydGllcywgV05vZGU8TWVudUl0ZW0+PiB7XHJcblx0cHJpdmF0ZSBfc2VsZWN0ZWRJZDogbnVtYmVyO1xyXG5cclxuXHRwcml2YXRlIF9vblNlbGVjdGVkKGlkOiBudW1iZXIsIGRhdGE6IGFueSkge1xyXG5cdFx0dGhpcy5fc2VsZWN0ZWRJZCA9IGlkO1xyXG5cdFx0dGhpcy5wcm9wZXJ0aWVzLm9uU2VsZWN0ZWQoZGF0YSk7XHJcblx0XHR0aGlzLmludmFsaWRhdGUoKTtcclxuXHR9XHJcblxyXG5cdHByb3RlY3RlZCByZW5kZXIoKSB7XHJcblx0XHRjb25zdCBpdGVtcyA9IHRoaXMuY2hpbGRyZW4ubWFwKChjaGlsZCwgaW5kZXgpID0+IHtcclxuXHRcdFx0aWYgKGNoaWxkKSB7XHJcblx0XHRcdFx0Y29uc3QgcHJvcGVydGllczogUGFydGlhbDxNZW51SXRlbVByb3BlcnRpZXM+ID0ge1xyXG5cdFx0XHRcdFx0b25TZWxlY3RlZDogKGRhdGE6IGFueSkgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLl9vblNlbGVjdGVkKGluZGV4LCBkYXRhKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdGlmICh0aGlzLl9zZWxlY3RlZElkICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdHByb3BlcnRpZXMuc2VsZWN0ZWQgPSBpbmRleCA9PT0gdGhpcy5fc2VsZWN0ZWRJZDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y2hpbGQucHJvcGVydGllcyA9IHsgLi4uY2hpbGQucHJvcGVydGllcywgLi4ucHJvcGVydGllcyB9O1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBjaGlsZDtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHJldHVybiB2KCduYXYnLCB7IGNsYXNzZXM6IHRoaXMudGhlbWUoY3NzLnJvb3QpIH0sIFtcclxuXHRcdFx0dihcclxuXHRcdFx0XHQnb2wnLFxyXG5cdFx0XHRcdHtcclxuXHRcdFx0XHRcdGNsYXNzZXM6IHRoaXMudGhlbWUoY3NzLm1lbnVDb250YWluZXIpXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRpdGVtc1xyXG5cdFx0XHQpXHJcblx0XHRdKTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE1lbnU7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kdHMtbG9hZGVyP3R5cGU9dHMmaW5zdGFuY2VOYW1lPTBfbWVudSEuL3NyYy9tZW51L01lbnUudHMiLCIvLyByZW1vdmVkIGJ5IGV4dHJhY3QtdGV4dC13ZWJwYWNrLXBsdWdpblxubW9kdWxlLmV4cG9ydHMgPSB7XCIgX2tleVwiOlwidGVzdC1hcHAvbWVudVwiLFwicm9vdFwiOlwibWVudS1tX19yb290X18zYkE2alwiLFwibWVudUNvbnRhaW5lclwiOlwibWVudS1tX19tZW51Q29udGFpbmVyX18xZW9HZlwifTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9tZW51L21lbnUubS5jc3Ncbi8vIG1vZHVsZSBpZCA9IC4vc3JjL21lbnUvbWVudS5tLmNzc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgMDkxNTUyNjI2M2M4Yjc1MTFjZjIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9jb3JlL0Rlc3Ryb3lhYmxlLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL2NvcmUvRXZlbnRlZC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9jb3JlL2xhbmcubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvaGFzL2hhcy5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL01hcC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL1Byb21pc2UubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9TeW1ib2wubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9XZWFrTWFwLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vYXJyYXkubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9nbG9iYWwubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9pdGVyYXRvci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL251bWJlci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL29iamVjdC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL3N0cmluZy5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL3N1cHBvcnQvaGFzLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vc3VwcG9ydC9xdWV1ZS5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL3N1cHBvcnQvdXRpbC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9JbmplY3Rvci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9Ob2RlSGFuZGxlci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9SZWdpc3RyeS5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9SZWdpc3RyeUhhbmRsZXIubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvV2lkZ2V0QmFzZS5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9hbmltYXRpb25zL2Nzc1RyYW5zaXRpb25zLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2QubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9hZnRlclJlbmRlci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2Fsd2F5c1JlbmRlci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2JlZm9yZVByb3BlcnRpZXMubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9jdXN0b21FbGVtZW50Lm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvZGlmZlByb3BlcnR5Lm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaGFuZGxlRGVjb3JhdG9yLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaW5qZWN0Lm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RpZmYubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvbWl4aW5zL1Byb2plY3Rvci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9taXhpbnMvVGhlbWVkLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL3JlZ2lzdGVyQ3VzdG9tRWxlbWVudC5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS92ZG9tLm1qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vY2xpLWJ1aWxkLXdpZGdldC90ZW1wbGF0ZS9jdXN0b20tZWxlbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbWVudS9NZW51LnRzIiwid2VicGFjazovLy8uL3NyYy9tZW51L21lbnUubS5jc3M/ZWMxMSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUFzRCwrREFBK0Q7O0FBRXJIO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7QUM3RGdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEIsaUJBQWlCLE9BQU87QUFDeEI7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvQkFBb0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQSx3Qzs7Ozs7Ozs7Ozs7QUN2REE7QUFDc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsZ0NBQWdDO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2RWlCO0FBQ0E7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiwyQkFBMkI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLG9CQUFvQjtBQUMzQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsaUM7Ozs7Ozs7Ozs7OztBQ25NQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLE9BQU8saUJBQWlCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QixxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7Ozs7O0FDdE1BO0FBQ0E7QUFDNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsSUFBSTtBQUNwQixnQkFBZ0IsT0FBTztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxJQUFJO0FBQ2hCLFlBQVksVUFBVTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxtQzs7Ozs7Ozs7Ozs7OztBQ2hKQTtBQUNzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxxQkFBcUI7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGdDQUFnQztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlHQTtBQUNrQztBQUNQO0FBQzNCO0FBQ3FCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3RELG9EQUFvRDtBQUNwRCxpREFBaUQ7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRUFBcUU7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsc0JBQXNCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFlBQVk7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLFNBQVM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0M7Ozs7Ozs7O0FDdlBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG1DOzs7Ozs7Ozs7Ozs7Ozs7QUNqQkE7QUFDaUQ7QUFDakQsb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDOzs7Ozs7Ozs7Ozs7O0FDOUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyREE7QUFDQTtBQUNtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0Q7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLElBQUk7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlHQTtBQUNBO0FBQ3FCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELFlBQVk7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RkFBd0Y7QUFDeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DOzs7Ozs7Ozs7OztBQ3hTbUI7QUFDbkI7MEVBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsRUFBRTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCxFQUFFO0FBQ2pFLG1DQUFtQyxtQkFBbUI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxnQzs7Ozs7Ozs7Ozs7QUNyS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFBQTtBQUFBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4RUFBOEU7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFBQTtBQUFBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsZ0NBQWdDLG1CQUFtQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxrQzs7Ozs7Ozs7O0FDekxBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQzs7Ozs7Ozs7O0FDdEJrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQSxxQzs7Ozs7Ozs7Ozs7QUNwQmtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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O0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsc0JBQXNCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFVBQVU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2THRDO0FBQUE7QUFDQTtBQUNBLCtEQUErRDtBQUMvRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTSxnQkFBZ0Isc0NBQXNDLGlC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QU0sRUFBRSxDQUFDLFlBQVksQ0FBQztLQUN0QixDQUFDO0lBQ0QsZ0dBQUssQ0FBQyx5Q0FBRyxDQUFDO0dBQ0UsSUFBSSxDQW1DaEI7QUFuQ2dCO0FBcUNqQiwrREFBZSxJQUFJLEVBQUM7Ozs7Ozs7O0FDdkRwQjtBQUNBLGtCQUFrQixxRyIsImZpbGUiOiJtZW51LTEuMC4wLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgMDkxNTUyNjI2M2M4Yjc1MTFjZjIiLCJpbXBvcnQgeyBjcmVhdGVDb21wb3NpdGVIYW5kbGUgfSBmcm9tICcuL2xhbmcnO1xuaW1wb3J0IFByb21pc2UgZnJvbSAnLi4vc2hpbS9Qcm9taXNlJztcbi8qKlxuICogTm8gb3BlcmF0aW9uIGZ1bmN0aW9uIHRvIHJlcGxhY2Ugb3duIG9uY2UgaW5zdGFuY2UgaXMgZGVzdG9yeWVkXG4gKi9cbmZ1bmN0aW9uIG5vb3AoKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG59XG4vKipcbiAqIE5vIG9wIGZ1bmN0aW9uIHVzZWQgdG8gcmVwbGFjZSBvd24sIG9uY2UgaW5zdGFuY2UgaGFzIGJlZW4gZGVzdG9yeWVkXG4gKi9cbmZ1bmN0aW9uIGRlc3Ryb3llZCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbGwgbWFkZSB0byBkZXN0cm95ZWQgbWV0aG9kJyk7XG59XG5leHBvcnQgY2xhc3MgRGVzdHJveWFibGUge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmhhbmRsZXMgPSBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgaGFuZGxlcyBmb3IgdGhlIGluc3RhbmNlIHRoYXQgd2lsbCBiZSBkZXN0cm95ZWQgd2hlbiBgdGhpcy5kZXN0cm95YCBpcyBjYWxsZWRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SGFuZGxlfSBoYW5kbGUgVGhlIGhhbmRsZSB0byBhZGQgZm9yIHRoZSBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtIYW5kbGV9IGEgaGFuZGxlIGZvciB0aGUgaGFuZGxlLCByZW1vdmVzIHRoZSBoYW5kbGUgZm9yIHRoZSBpbnN0YW5jZSBhbmQgY2FsbHMgZGVzdHJveVxuICAgICAqL1xuICAgIG93bihoYW5kbGVzKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZSA9IEFycmF5LmlzQXJyYXkoaGFuZGxlcykgPyBjcmVhdGVDb21wb3NpdGVIYW5kbGUoLi4uaGFuZGxlcykgOiBoYW5kbGVzO1xuICAgICAgICBjb25zdCB7IGhhbmRsZXM6IF9oYW5kbGVzIH0gPSB0aGlzO1xuICAgICAgICBfaGFuZGxlcy5wdXNoKGhhbmRsZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZXN0cm95KCkge1xuICAgICAgICAgICAgICAgIF9oYW5kbGVzLnNwbGljZShfaGFuZGxlcy5pbmRleE9mKGhhbmRsZSkpO1xuICAgICAgICAgICAgICAgIGhhbmRsZS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlc3RycHlzIGFsbCBoYW5kZXJzIHJlZ2lzdGVyZWQgZm9yIHRoZSBpbnN0YW5jZVxuICAgICAqXG4gICAgICogQHJldHVybnMge1Byb21pc2U8YW55fSBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIGFsbCBoYW5kbGVzIGhhdmUgYmVlbiBkZXN0cm95ZWRcbiAgICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlcy5mb3JFYWNoKChoYW5kbGUpID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGUgJiYgaGFuZGxlLmRlc3Ryb3kgJiYgaGFuZGxlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95ID0gbm9vcDtcbiAgICAgICAgICAgIHRoaXMub3duID0gZGVzdHJveWVkO1xuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgRGVzdHJveWFibGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZXN0cm95YWJsZS5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL2NvcmUvRGVzdHJveWFibGUubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvY29yZS9EZXN0cm95YWJsZS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IE1hcCBmcm9tICcuLi9zaGltL01hcCc7XHJcbmltcG9ydCB7IERlc3Ryb3lhYmxlIH0gZnJvbSAnLi9EZXN0cm95YWJsZSc7XHJcbi8qKlxyXG4gKiBNYXAgb2YgY29tcHV0ZWQgcmVndWxhciBleHByZXNzaW9ucywga2V5ZWQgYnkgc3RyaW5nXHJcbiAqL1xyXG5jb25zdCByZWdleE1hcCA9IG5ldyBNYXAoKTtcclxuLyoqXHJcbiAqIERldGVybWluZXMgaXMgdGhlIGV2ZW50IHR5cGUgZ2xvYiBoYXMgYmVlbiBtYXRjaGVkXHJcbiAqXHJcbiAqIEByZXR1cm5zIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgaWYgdGhlIGdsb2IgaXMgbWF0Y2hlZFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzR2xvYk1hdGNoKGdsb2JTdHJpbmcsIHRhcmdldFN0cmluZykge1xyXG4gICAgaWYgKHR5cGVvZiB0YXJnZXRTdHJpbmcgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBnbG9iU3RyaW5nID09PSAnc3RyaW5nJyAmJiBnbG9iU3RyaW5nLmluZGV4T2YoJyonKSAhPT0gLTEpIHtcclxuICAgICAgICBsZXQgcmVnZXg7XHJcbiAgICAgICAgaWYgKHJlZ2V4TWFwLmhhcyhnbG9iU3RyaW5nKSkge1xyXG4gICAgICAgICAgICByZWdleCA9IHJlZ2V4TWFwLmdldChnbG9iU3RyaW5nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJlZ2V4ID0gbmV3IFJlZ0V4cChgXiR7Z2xvYlN0cmluZy5yZXBsYWNlKC9cXCovZywgJy4qJyl9JGApO1xyXG4gICAgICAgICAgICByZWdleE1hcC5zZXQoZ2xvYlN0cmluZywgcmVnZXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVnZXgudGVzdCh0YXJnZXRTdHJpbmcpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGdsb2JTdHJpbmcgPT09IHRhcmdldFN0cmluZztcclxuICAgIH1cclxufVxyXG4vKipcclxuICogRXZlbnQgQ2xhc3NcclxuICovXHJcbmV4cG9ydCBjbGFzcyBFdmVudGVkIGV4dGVuZHMgRGVzdHJveWFibGUge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBtYXAgb2YgbGlzdGVuZXJzIGtleWVkIGJ5IGV2ZW50IHR5cGVcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxpc3RlbmVyc01hcCA9IG5ldyBNYXAoKTtcclxuICAgIH1cclxuICAgIGVtaXQoZXZlbnQpIHtcclxuICAgICAgICB0aGlzLmxpc3RlbmVyc01hcC5mb3JFYWNoKChtZXRob2RzLCB0eXBlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChpc0dsb2JNYXRjaCh0eXBlLCBldmVudC50eXBlKSkge1xyXG4gICAgICAgICAgICAgICAgWy4uLm1ldGhvZHNdLmZvckVhY2goKG1ldGhvZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZC5jYWxsKHRoaXMsIGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBvbih0eXBlLCBsaXN0ZW5lcikge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxpc3RlbmVyKSkge1xyXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVzID0gbGlzdGVuZXIubWFwKChsaXN0ZW5lcikgPT4gdGhpcy5fYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpKTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcy5mb3JFYWNoKChoYW5kbGUpID0+IGhhbmRsZS5kZXN0cm95KCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpO1xyXG4gICAgfVxyXG4gICAgX2FkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XHJcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnNNYXAuZ2V0KHR5cGUpIHx8IFtdO1xyXG4gICAgICAgIGxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcclxuICAgICAgICB0aGlzLmxpc3RlbmVyc01hcC5zZXQodHlwZSwgbGlzdGVuZXJzKTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBkZXN0cm95OiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyc01hcC5nZXQodHlwZSkgfHwgW107XHJcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKSwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydCBkZWZhdWx0IEV2ZW50ZWQ7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV2ZW50ZWQubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9jb3JlL0V2ZW50ZWQubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvY29yZS9FdmVudGVkLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgeyBhc3NpZ24gfSBmcm9tICcuLi9zaGltL29iamVjdCc7XG5leHBvcnQgeyBhc3NpZ24gfSBmcm9tICcuLi9zaGltL29iamVjdCc7XG5jb25zdCBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbmNvbnN0IGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbi8qKlxuICogVHlwZSBndWFyZCB0aGF0IGVuc3VyZXMgdGhhdCB0aGUgdmFsdWUgY2FuIGJlIGNvZXJjZWQgdG8gT2JqZWN0XG4gKiB0byB3ZWVkIG91dCBob3N0IG9iamVjdHMgdGhhdCBkbyBub3QgZGVyaXZlIGZyb20gT2JqZWN0LlxuICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNoZWNrIGlmIHdlIHdhbnQgdG8gZGVlcCBjb3B5IGFuIG9iamVjdCBvciBub3QuXG4gKiBOb3RlOiBJbiBFUzYgaXQgaXMgcG9zc2libGUgdG8gbW9kaWZ5IGFuIG9iamVjdCdzIFN5bWJvbC50b1N0cmluZ1RhZyBwcm9wZXJ0eSwgd2hpY2ggd2lsbFxuICogY2hhbmdlIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBgdG9TdHJpbmdgLiBUaGlzIGlzIGEgcmFyZSBlZGdlIGNhc2UgdGhhdCBpcyBkaWZmaWN1bHQgdG8gaGFuZGxlLFxuICogc28gaXQgaXMgbm90IGhhbmRsZWQgaGVyZS5cbiAqIEBwYXJhbSAgdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJuICAgICAgIElmIHRoZSB2YWx1ZSBpcyBjb2VyY2libGUgaW50byBhbiBPYmplY3RcbiAqL1xuZnVuY3Rpb24gc2hvdWxkRGVlcENvcHlPYmplY3QodmFsdWUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG59XG5mdW5jdGlvbiBjb3B5QXJyYXkoYXJyYXksIGluaGVyaXRlZCkge1xuICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb3B5QXJyYXkoaXRlbSwgaW5oZXJpdGVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXNob3VsZERlZXBDb3B5T2JqZWN0KGl0ZW0pXG4gICAgICAgICAgICA/IGl0ZW1cbiAgICAgICAgICAgIDogX21peGluKHtcbiAgICAgICAgICAgICAgICBkZWVwOiB0cnVlLFxuICAgICAgICAgICAgICAgIGluaGVyaXRlZDogaW5oZXJpdGVkLFxuICAgICAgICAgICAgICAgIHNvdXJjZXM6IFtpdGVtXSxcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IHt9XG4gICAgICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIF9taXhpbihrd0FyZ3MpIHtcbiAgICBjb25zdCBkZWVwID0ga3dBcmdzLmRlZXA7XG4gICAgY29uc3QgaW5oZXJpdGVkID0ga3dBcmdzLmluaGVyaXRlZDtcbiAgICBjb25zdCB0YXJnZXQgPSBrd0FyZ3MudGFyZ2V0O1xuICAgIGNvbnN0IGNvcGllZCA9IGt3QXJncy5jb3BpZWQgfHwgW107XG4gICAgY29uc3QgY29waWVkQ2xvbmUgPSBbLi4uY29waWVkXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGt3QXJncy5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGt3QXJncy5zb3VyY2VzW2ldO1xuICAgICAgICBpZiAoc291cmNlID09PSBudWxsIHx8IHNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gc291cmNlW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKGNvcGllZENsb25lLmluZGV4T2YodmFsdWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRlZXApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvcHlBcnJheSh2YWx1ZSwgaW5oZXJpdGVkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzaG91bGREZWVwQ29weU9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldFZhbHVlID0gdGFyZ2V0W2tleV0gfHwge307XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWQucHVzaChzb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBfbWl4aW4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXA6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdGVkOiBpbmhlcml0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlczogW3ZhbHVlXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IHRhcmdldFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZShwcm90b3R5cGUsIC4uLm1peGlucykge1xuICAgIGlmICghbWl4aW5zLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignbGFuZy5jcmVhdGUgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIG1peGluIG9iamVjdC4nKTtcbiAgICB9XG4gICAgY29uc3QgYXJncyA9IG1peGlucy5zbGljZSgpO1xuICAgIGFyZ3MudW5zaGlmdChPYmplY3QuY3JlYXRlKHByb3RvdHlwZSkpO1xuICAgIHJldHVybiBhc3NpZ24uYXBwbHkobnVsbCwgYXJncyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVlcEFzc2lnbih0YXJnZXQsIC4uLnNvdXJjZXMpIHtcbiAgICByZXR1cm4gX21peGluKHtcbiAgICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgICAgaW5oZXJpdGVkOiBmYWxzZSxcbiAgICAgICAgc291cmNlczogc291cmNlcyxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWVwTWl4aW4odGFyZ2V0LCAuLi5zb3VyY2VzKSB7XG4gICAgcmV0dXJuIF9taXhpbih7XG4gICAgICAgIGRlZXA6IHRydWUsXG4gICAgICAgIGluaGVyaXRlZDogdHJ1ZSxcbiAgICAgICAgc291cmNlczogc291cmNlcyxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRcbiAgICB9KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3QgdXNpbmcgdGhlIHByb3ZpZGVkIHNvdXJjZSdzIHByb3RvdHlwZSBhcyB0aGUgcHJvdG90eXBlIGZvciB0aGUgbmV3IG9iamVjdCwgYW5kIHRoZW5cbiAqIGRlZXAgY29waWVzIHRoZSBwcm92aWRlZCBzb3VyY2UncyB2YWx1ZXMgaW50byB0aGUgbmV3IHRhcmdldC5cbiAqXG4gKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3QgdG8gZHVwbGljYXRlXG4gKiBAcmV0dXJuIFRoZSBuZXcgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkdXBsaWNhdGUoc291cmNlKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2Yoc291cmNlKSk7XG4gICAgcmV0dXJuIGRlZXBNaXhpbih0YXJnZXQsIHNvdXJjZSk7XG59XG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0d28gdmFsdWVzIGFyZSB0aGUgc2FtZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gYSBGaXJzdCB2YWx1ZSB0byBjb21wYXJlXG4gKiBAcGFyYW0gYiBTZWNvbmQgdmFsdWUgdG8gY29tcGFyZVxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZXMgYXJlIHRoZSBzYW1lOyBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSWRlbnRpY2FsKGEsIGIpIHtcbiAgICByZXR1cm4gKGEgPT09IGIgfHxcbiAgICAgICAgLyogYm90aCB2YWx1ZXMgYXJlIE5hTiAqL1xuICAgICAgICAoYSAhPT0gYSAmJiBiICE9PSBiKSk7XG59XG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGJpbmRzIGEgbWV0aG9kIHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGF0IHJ1bnRpbWUuIFRoaXMgaXMgc2ltaWxhciB0b1xuICogYEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kYCwgYnV0IGluc3RlYWQgb2YgYSBmdW5jdGlvbiBpdCB0YWtlcyB0aGUgbmFtZSBvZiBhIG1ldGhvZCBvbiBhbiBvYmplY3QuXG4gKiBBcyBhIHJlc3VsdCwgdGhlIGZ1bmN0aW9uIHJldHVybmVkIGJ5IGBsYXRlQmluZGAgd2lsbCBhbHdheXMgY2FsbCB0aGUgZnVuY3Rpb24gY3VycmVudGx5IGFzc2lnbmVkIHRvXG4gKiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG9uIHRoZSBvYmplY3QgYXMgb2YgdGhlIG1vbWVudCB0aGUgZnVuY3Rpb24gaXQgcmV0dXJucyBpcyBjYWxsZWQuXG4gKlxuICogQHBhcmFtIGluc3RhbmNlIFRoZSBjb250ZXh0IG9iamVjdFxuICogQHBhcmFtIG1ldGhvZCBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIG9uIHRoZSBjb250ZXh0IG9iamVjdCB0byBiaW5kIHRvIGl0c2VsZlxuICogQHBhcmFtIHN1cHBsaWVkQXJncyBBbiBvcHRpb25hbCBhcnJheSBvZiB2YWx1ZXMgdG8gcHJlcGVuZCB0byB0aGUgYGluc3RhbmNlW21ldGhvZF1gIGFyZ3VtZW50cyBsaXN0XG4gKiBAcmV0dXJuIFRoZSBib3VuZCBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gbGF0ZUJpbmQoaW5zdGFuY2UsIG1ldGhvZCwgLi4uc3VwcGxpZWRBcmdzKSB7XG4gICAgcmV0dXJuIHN1cHBsaWVkQXJncy5sZW5ndGhcbiAgICAgICAgPyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBhcmdzID0gYXJndW1lbnRzLmxlbmd0aCA/IHN1cHBsaWVkQXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKSA6IHN1cHBsaWVkQXJncztcbiAgICAgICAgICAgIC8vIFRTNzAxN1xuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlW21ldGhvZF0uYXBwbHkoaW5zdGFuY2UsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gVFM3MDE3XG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VbbWV0aG9kXS5hcHBseShpbnN0YW5jZSwgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtaXhpbih0YXJnZXQsIC4uLnNvdXJjZXMpIHtcbiAgICByZXR1cm4gX21peGluKHtcbiAgICAgICAgZGVlcDogZmFsc2UsXG4gICAgICAgIGluaGVyaXRlZDogdHJ1ZSxcbiAgICAgICAgc291cmNlczogc291cmNlcyxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRcbiAgICB9KTtcbn1cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHdoaWNoIGludm9rZXMgdGhlIGdpdmVuIGZ1bmN0aW9uIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cyBwcmVwZW5kZWQgdG8gaXRzIGFyZ3VtZW50IGxpc3QuXG4gKiBMaWtlIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAsIGJ1dCBkb2VzIG5vdCBhbHRlciBleGVjdXRpb24gY29udGV4dC5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0RnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRoYXQgbmVlZHMgdG8gYmUgYm91bmRcbiAqIEBwYXJhbSBzdXBwbGllZEFyZ3MgQW4gb3B0aW9uYWwgYXJyYXkgb2YgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhlIGB0YXJnZXRGdW5jdGlvbmAgYXJndW1lbnRzIGxpc3RcbiAqIEByZXR1cm4gVGhlIGJvdW5kIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJ0aWFsKHRhcmdldEZ1bmN0aW9uLCAuLi5zdXBwbGllZEFyZ3MpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBhcmdzID0gYXJndW1lbnRzLmxlbmd0aCA/IHN1cHBsaWVkQXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKSA6IHN1cHBsaWVkQXJncztcbiAgICAgICAgcmV0dXJuIHRhcmdldEZ1bmN0aW9uLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG59XG4vKipcbiAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBkZXN0cm95IG1ldGhvZCB0aGF0LCB3aGVuIGNhbGxlZCwgY2FsbHMgdGhlIHBhc3NlZC1pbiBkZXN0cnVjdG9yLlxuICogVGhpcyBpcyBpbnRlbmRlZCB0byBwcm92aWRlIGEgdW5pZmllZCBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIFwicmVtb3ZlXCIgLyBcImRlc3Ryb3lcIiBoYW5kbGVycyBmb3JcbiAqIGV2ZW50IGxpc3RlbmVycywgdGltZXJzLCBldGMuXG4gKlxuICogQHBhcmFtIGRlc3RydWN0b3IgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGhhbmRsZSdzIGBkZXN0cm95YCBtZXRob2QgaXMgaW52b2tlZFxuICogQHJldHVybiBUaGUgaGFuZGxlIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSGFuZGxlKGRlc3RydWN0b3IpIHtcbiAgICBsZXQgY2FsbGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFjYWxsZWQpIHtcbiAgICAgICAgICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGRlc3RydWN0b3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG4vKipcbiAqIFJldHVybnMgYSBzaW5nbGUgaGFuZGxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVzdHJveSBtdWx0aXBsZSBoYW5kbGVzIHNpbXVsdGFuZW91c2x5LlxuICpcbiAqIEBwYXJhbSBoYW5kbGVzIEFuIGFycmF5IG9mIGhhbmRsZXMgd2l0aCBgZGVzdHJveWAgbWV0aG9kc1xuICogQHJldHVybiBUaGUgaGFuZGxlIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29tcG9zaXRlSGFuZGxlKC4uLmhhbmRsZXMpIHtcbiAgICByZXR1cm4gY3JlYXRlSGFuZGxlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoYW5kbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBoYW5kbGVzW2ldLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGFuZy5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL2NvcmUvbGFuZy5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9jb3JlL2xhbmcubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImZ1bmN0aW9uIGlzRmVhdHVyZVRlc3RUaGVuYWJsZSh2YWx1ZSkge1xyXG4gICAgcmV0dXJuIHZhbHVlICYmIHZhbHVlLnRoZW47XHJcbn1cclxuLyoqXHJcbiAqIEEgY2FjaGUgb2YgcmVzdWx0cyBvZiBmZWF0dXJlIHRlc3RzXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdGVzdENhY2hlID0ge307XHJcbi8qKlxyXG4gKiBBIGNhY2hlIG9mIHRoZSB1bi1yZXNvbHZlZCBmZWF0dXJlIHRlc3RzXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdGVzdEZ1bmN0aW9ucyA9IHt9O1xyXG4vKipcclxuICogQSBjYWNoZSBvZiB1bnJlc29sdmVkIHRoZW5hYmxlcyAocHJvYmFibHkgcHJvbWlzZXMpXHJcbiAqIEB0eXBlIHt7fX1cclxuICovXHJcbmNvbnN0IHRlc3RUaGVuYWJsZXMgPSB7fTtcclxuLyoqXHJcbiAqIEEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgc2NvcGUgKGB3aW5kb3dgIGluIGEgYnJvd3NlciwgYGdsb2JhbGAgaW4gTm9kZUpTKVxyXG4gKi9cclxuY29uc3QgZ2xvYmFsU2NvcGUgPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cclxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIC8vIEJyb3dzZXJzXHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdztcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgLy8gTm9kZVxyXG4gICAgICAgIHJldHVybiBnbG9iYWw7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAvLyBXZWIgd29ya2Vyc1xyXG4gICAgICAgIHJldHVybiBzZWxmO1xyXG4gICAgfVxyXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cclxuICAgIHJldHVybiB7fTtcclxufSkoKTtcclxuLyogR3JhYiB0aGUgc3RhdGljRmVhdHVyZXMgaWYgdGhlcmUgYXJlIGF2YWlsYWJsZSAqL1xyXG5jb25zdCB7IHN0YXRpY0ZlYXR1cmVzIH0gPSBnbG9iYWxTY29wZS5Eb2pvSGFzRW52aXJvbm1lbnQgfHwge307XHJcbi8qIENsZWFuaW5nIHVwIHRoZSBEb2pvSGFzRW52aW9ybm1lbnQgKi9cclxuaWYgKCdEb2pvSGFzRW52aXJvbm1lbnQnIGluIGdsb2JhbFNjb3BlKSB7XHJcbiAgICBkZWxldGUgZ2xvYmFsU2NvcGUuRG9qb0hhc0Vudmlyb25tZW50O1xyXG59XHJcbi8qKlxyXG4gKiBDdXN0b20gdHlwZSBndWFyZCB0byBuYXJyb3cgdGhlIGBzdGF0aWNGZWF0dXJlc2AgdG8gZWl0aGVyIGEgbWFwIG9yIGEgZnVuY3Rpb24gdGhhdFxyXG4gKiByZXR1cm5zIGEgbWFwLlxyXG4gKlxyXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGd1YXJkIGZvclxyXG4gKi9cclxuZnVuY3Rpb24gaXNTdGF0aWNGZWF0dXJlRnVuY3Rpb24odmFsdWUpIHtcclxuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XHJcbn1cclxuLyoqXHJcbiAqIFRoZSBjYWNoZSBvZiBhc3NlcnRlZCBmZWF0dXJlcyB0aGF0IHdlcmUgYXZhaWxhYmxlIGluIHRoZSBnbG9iYWwgc2NvcGUgd2hlbiB0aGVcclxuICogbW9kdWxlIGxvYWRlZFxyXG4gKi9cclxuY29uc3Qgc3RhdGljQ2FjaGUgPSBzdGF0aWNGZWF0dXJlc1xyXG4gICAgPyBpc1N0YXRpY0ZlYXR1cmVGdW5jdGlvbihzdGF0aWNGZWF0dXJlcykgPyBzdGF0aWNGZWF0dXJlcy5hcHBseShnbG9iYWxTY29wZSkgOiBzdGF0aWNGZWF0dXJlc1xyXG4gICAgOiB7fTsgLyogUHJvdmlkaW5nIGFuIGVtcHR5IGNhY2hlLCBpZiBub25lIHdhcyBpbiB0aGUgZW52aXJvbm1lbnRcclxuXHJcbi8qKlxyXG4qIEFNRCBwbHVnaW4gZnVuY3Rpb24uXHJcbipcclxuKiBDb25kaXRpb25hbCBsb2FkcyBtb2R1bGVzIGJhc2VkIG9uIGEgaGFzIGZlYXR1cmUgdGVzdCB2YWx1ZS5cclxuKlxyXG4qIEBwYXJhbSByZXNvdXJjZUlkIEdpdmVzIHRoZSByZXNvbHZlZCBtb2R1bGUgaWQgdG8gbG9hZC5cclxuKiBAcGFyYW0gcmVxdWlyZSBUaGUgbG9hZGVyIHJlcXVpcmUgZnVuY3Rpb24gd2l0aCByZXNwZWN0IHRvIHRoZSBtb2R1bGUgdGhhdCBjb250YWluZWQgdGhlIHBsdWdpbiByZXNvdXJjZSBpbiBpdHNcclxuKiAgICAgICAgICAgICAgICBkZXBlbmRlbmN5IGxpc3QuXHJcbiogQHBhcmFtIGxvYWQgQ2FsbGJhY2sgdG8gbG9hZGVyIHRoYXQgY29uc3VtZXMgcmVzdWx0IG9mIHBsdWdpbiBkZW1hbmQuXHJcbiovXHJcbmV4cG9ydCBmdW5jdGlvbiBsb2FkKHJlc291cmNlSWQsIHJlcXVpcmUsIGxvYWQsIGNvbmZpZykge1xyXG4gICAgcmVzb3VyY2VJZCA/IHJlcXVpcmUoW3Jlc291cmNlSWRdLCBsb2FkKSA6IGxvYWQoKTtcclxufVxyXG4vKipcclxuICogQU1EIHBsdWdpbiBmdW5jdGlvbi5cclxuICpcclxuICogUmVzb2x2ZXMgcmVzb3VyY2VJZCBpbnRvIGEgbW9kdWxlIGlkIGJhc2VkIG9uIHBvc3NpYmx5LW5lc3RlZCB0ZW5hcnkgZXhwcmVzc2lvbiB0aGF0IGJyYW5jaGVzIG9uIGhhcyBmZWF0dXJlIHRlc3RcclxuICogdmFsdWUocykuXHJcbiAqXHJcbiAqIEBwYXJhbSByZXNvdXJjZUlkIFRoZSBpZCBvZiB0aGUgbW9kdWxlXHJcbiAqIEBwYXJhbSBub3JtYWxpemUgUmVzb2x2ZXMgYSByZWxhdGl2ZSBtb2R1bGUgaWQgaW50byBhbiBhYnNvbHV0ZSBtb2R1bGUgaWRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUocmVzb3VyY2VJZCwgbm9ybWFsaXplKSB7XHJcbiAgICBjb25zdCB0b2tlbnMgPSByZXNvdXJjZUlkLm1hdGNoKC9bXFw/Ol18W146XFw/XSovZykgfHwgW107XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBmdW5jdGlvbiBnZXQoc2tpcCkge1xyXG4gICAgICAgIGNvbnN0IHRlcm0gPSB0b2tlbnNbaSsrXTtcclxuICAgICAgICBpZiAodGVybSA9PT0gJzonKSB7XHJcbiAgICAgICAgICAgIC8vIGVtcHR5IHN0cmluZyBtb2R1bGUgbmFtZSwgcmVzb2x2ZXMgdG8gbnVsbFxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIHBvc3RmaXhlZCB3aXRoIGEgPyBtZWFucyBpdCBpcyBhIGZlYXR1cmUgdG8gYnJhbmNoIG9uLCB0aGUgdGVybSBpcyB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZVxyXG4gICAgICAgICAgICBpZiAodG9rZW5zW2krK10gPT09ICc/Jykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFza2lwICYmIGhhcyh0ZXJtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoZWQgdGhlIGZlYXR1cmUsIGdldCB0aGUgZmlyc3QgdmFsdWUgZnJvbSB0aGUgb3B0aW9uc1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGRpZCBub3QgbWF0Y2gsIGdldCB0aGUgc2Vjb25kIHZhbHVlLCBwYXNzaW5nIG92ZXIgdGhlIGZpcnN0XHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQoc2tpcCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gYSBtb2R1bGVcclxuICAgICAgICAgICAgcmV0dXJuIHRlcm07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29uc3QgaWQgPSBnZXQoKTtcclxuICAgIHJldHVybiBpZCAmJiBub3JtYWxpemUoaWQpO1xyXG59XHJcbi8qKlxyXG4gKiBDaGVjayBpZiBhIGZlYXR1cmUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkXHJcbiAqXHJcbiAqIEBwYXJhbSBmZWF0dXJlIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZXhpc3RzKGZlYXR1cmUpIHtcclxuICAgIGNvbnN0IG5vcm1hbGl6ZWRGZWF0dXJlID0gZmVhdHVyZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIEJvb2xlYW4obm9ybWFsaXplZEZlYXR1cmUgaW4gc3RhdGljQ2FjaGUgfHwgbm9ybWFsaXplZEZlYXR1cmUgaW4gdGVzdENhY2hlIHx8IHRlc3RGdW5jdGlvbnNbbm9ybWFsaXplZEZlYXR1cmVdKTtcclxufVxyXG4vKipcclxuICogUmVnaXN0ZXIgYSBuZXcgdGVzdCBmb3IgYSBuYW1lZCBmZWF0dXJlLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBoYXMuYWRkKCdkb20tYWRkZXZlbnRsaXN0ZW5lcicsICEhZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcik7XHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGhhcy5hZGQoJ3RvdWNoLWV2ZW50cycsIGZ1bmN0aW9uICgpIHtcclxuICogICAgcmV0dXJuICdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50XHJcbiAqIH0pO1xyXG4gKlxyXG4gKiBAcGFyYW0gZmVhdHVyZSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZVxyXG4gKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHJlcG9ydGVkIG9mIHRoZSBmZWF0dXJlLCBvciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBvbmNlIG9uIGZpcnN0IHRlc3RcclxuICogQHBhcmFtIG92ZXJ3cml0ZSBpZiBhbiBleGlzdGluZyB2YWx1ZSBzaG91bGQgYmUgb3ZlcndyaXR0ZW4uIERlZmF1bHRzIHRvIGZhbHNlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZChmZWF0dXJlLCB2YWx1ZSwgb3ZlcndyaXRlID0gZmFsc2UpIHtcclxuICAgIGNvbnN0IG5vcm1hbGl6ZWRGZWF0dXJlID0gZmVhdHVyZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgaWYgKGV4aXN0cyhub3JtYWxpemVkRmVhdHVyZSkgJiYgIW92ZXJ3cml0ZSAmJiAhKG5vcm1hbGl6ZWRGZWF0dXJlIGluIHN0YXRpY0NhY2hlKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEZlYXR1cmUgXCIke2ZlYXR1cmV9XCIgZXhpc3RzIGFuZCBvdmVyd3JpdGUgbm90IHRydWUuYCk7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgdGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV0gPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGlzRmVhdHVyZVRlc3RUaGVuYWJsZSh2YWx1ZSkpIHtcclxuICAgICAgICB0ZXN0VGhlbmFibGVzW2ZlYXR1cmVdID0gdmFsdWUudGhlbigocmVzb2x2ZWRWYWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0ZXN0Q2FjaGVbZmVhdHVyZV0gPSByZXNvbHZlZFZhbHVlO1xyXG4gICAgICAgICAgICBkZWxldGUgdGVzdFRoZW5hYmxlc1tmZWF0dXJlXTtcclxuICAgICAgICB9LCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0ZXN0VGhlbmFibGVzW2ZlYXR1cmVdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdGVzdENhY2hlW25vcm1hbGl6ZWRGZWF0dXJlXSA9IHZhbHVlO1xyXG4gICAgICAgIGRlbGV0ZSB0ZXN0RnVuY3Rpb25zW25vcm1hbGl6ZWRGZWF0dXJlXTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIGEgbmFtZWQgZmVhdHVyZS5cclxuICpcclxuICogQHBhcmFtIGZlYXR1cmUgVGhlIG5hbWUgKGlmIGEgc3RyaW5nKSBvciBpZGVudGlmaWVyIChpZiBhbiBpbnRlZ2VyKSBvZiB0aGUgZmVhdHVyZSB0byB0ZXN0LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaGFzKGZlYXR1cmUpIHtcclxuICAgIGxldCByZXN1bHQ7XHJcbiAgICBjb25zdCBub3JtYWxpemVkRmVhdHVyZSA9IGZlYXR1cmUudG9Mb3dlckNhc2UoKTtcclxuICAgIGlmIChub3JtYWxpemVkRmVhdHVyZSBpbiBzdGF0aWNDYWNoZSkge1xyXG4gICAgICAgIHJlc3VsdCA9IHN0YXRpY0NhY2hlW25vcm1hbGl6ZWRGZWF0dXJlXTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRlc3RGdW5jdGlvbnNbbm9ybWFsaXplZEZlYXR1cmVdKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gdGVzdENhY2hlW25vcm1hbGl6ZWRGZWF0dXJlXSA9IHRlc3RGdW5jdGlvbnNbbm9ybWFsaXplZEZlYXR1cmVdLmNhbGwobnVsbCk7XHJcbiAgICAgICAgZGVsZXRlIHRlc3RGdW5jdGlvbnNbbm9ybWFsaXplZEZlYXR1cmVdO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAobm9ybWFsaXplZEZlYXR1cmUgaW4gdGVzdENhY2hlKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gdGVzdENhY2hlW25vcm1hbGl6ZWRGZWF0dXJlXTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGZlYXR1cmUgaW4gdGVzdFRoZW5hYmxlcykge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEF0dGVtcHQgdG8gZGV0ZWN0IHVucmVnaXN0ZXJlZCBoYXMgZmVhdHVyZSBcIiR7ZmVhdHVyZX1cImApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG4vKlxyXG4gKiBPdXQgb2YgdGhlIGJveCBmZWF0dXJlIHRlc3RzXHJcbiAqL1xyXG4vKiBFbnZpcm9ubWVudHMgKi9cclxuLyogVXNlZCBhcyBhIHZhbHVlIHRvIHByb3ZpZGUgYSBkZWJ1ZyBvbmx5IGNvZGUgcGF0aCAqL1xyXG5hZGQoJ2RlYnVnJywgdHJ1ZSk7XHJcbi8qIERldGVjdHMgaWYgdGhlIGVudmlyb25tZW50IGlzIFwiYnJvd3NlciBsaWtlXCIgKi9cclxuYWRkKCdob3N0LWJyb3dzZXInLCB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBsb2NhdGlvbiAhPT0gJ3VuZGVmaW5lZCcpO1xyXG4vKiBEZXRlY3RzIGlmIHRoZSBlbnZpcm9ubWVudCBhcHBlYXJzIHRvIGJlIE5vZGVKUyAqL1xyXG5hZGQoJ2hvc3Qtbm9kZScsIGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgcHJvY2Vzcy52ZXJzaW9ucyAmJiBwcm9jZXNzLnZlcnNpb25zLm5vZGUpIHtcclxuICAgICAgICByZXR1cm4gcHJvY2Vzcy52ZXJzaW9ucy5ub2RlO1xyXG4gICAgfVxyXG59KTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFzLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvaGFzL2hhcy5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9oYXMvaGFzLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgeyBpc0FycmF5TGlrZSwgU2hpbUl0ZXJhdG9yIH0gZnJvbSAnLi9pdGVyYXRvcic7XHJcbmltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xyXG5pbXBvcnQgeyBpcyBhcyBvYmplY3RJcyB9IGZyb20gJy4vb2JqZWN0JztcclxuaW1wb3J0IGhhcyBmcm9tICcuL3N1cHBvcnQvaGFzJztcclxuaW1wb3J0ICcuL1N5bWJvbCc7XHJcbmV4cG9ydCBsZXQgTWFwID0gZ2xvYmFsLk1hcDtcclxuaWYgKCF0cnVlKSB7XHJcbiAgICBNYXAgPSAoX2EgPSBjbGFzcyBNYXAge1xyXG4gICAgICAgICAgICBjb25zdHJ1Y3RvcihpdGVyYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gW107XHJcbiAgICAgICAgICAgICAgICB0aGlzW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnTWFwJztcclxuICAgICAgICAgICAgICAgIGlmIChpdGVyYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5TGlrZShpdGVyYWJsZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVyYWJsZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBpdGVyYWJsZVtpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KHZhbHVlWzBdLCB2YWx1ZVsxXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KHZhbHVlWzBdLCB2YWx1ZVsxXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEFuIGFsdGVybmF0aXZlIHRvIEFycmF5LnByb3RvdHlwZS5pbmRleE9mIHVzaW5nIE9iamVjdC5pc1xyXG4gICAgICAgICAgICAgKiB0byBjaGVjayBmb3IgZXF1YWxpdHkuIFNlZSBodHRwOi8vbXpsLmxhLzF6dUtPMlZcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIF9pbmRleE9mS2V5KGtleXMsIGtleSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0SXMoa2V5c1tpXSwga2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZ2V0IHNpemUoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fa2V5cy5sZW5ndGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2xlYXIoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9rZXlzLmxlbmd0aCA9IHRoaXMuX3ZhbHVlcy5sZW5ndGggPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRlbGV0ZShrZXkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5faW5kZXhPZktleSh0aGlzLl9rZXlzLCBrZXkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuX2tleXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZW50cmllcygpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuX2tleXMubWFwKChrZXksIGkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgdGhpcy5fdmFsdWVzW2ldXTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaGltSXRlcmF0b3IodmFsdWVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3JFYWNoKGNhbGxiYWNrLCBjb250ZXh0KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gdGhpcy5fa2V5cztcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuX3ZhbHVlcztcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCB2YWx1ZXNbaV0sIGtleXNbaV0sIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGdldChrZXkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5faW5kZXhPZktleSh0aGlzLl9rZXlzLCBrZXkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4IDwgMCA/IHVuZGVmaW5lZCA6IHRoaXMuX3ZhbHVlc1tpbmRleF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaGFzKGtleSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luZGV4T2ZLZXkodGhpcy5fa2V5cywga2V5KSA+IC0xO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGtleXMoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNoaW1JdGVyYXRvcih0aGlzLl9rZXlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXQoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5faW5kZXhPZktleSh0aGlzLl9rZXlzLCBrZXkpO1xyXG4gICAgICAgICAgICAgICAgaW5kZXggPSBpbmRleCA8IDAgPyB0aGlzLl9rZXlzLmxlbmd0aCA6IGluZGV4O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fa2V5c1tpbmRleF0gPSBrZXk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNbaW5kZXhdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YWx1ZXMoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNoaW1JdGVyYXRvcih0aGlzLl92YWx1ZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBfYVtTeW1ib2wuc3BlY2llc10gPSBfYSxcclxuICAgICAgICBfYSk7XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgTWFwO1xyXG52YXIgX2E7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1hcC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vTWFwLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vTWFwLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4vZ2xvYmFsJztcclxuaW1wb3J0IHsgcXVldWVNaWNyb1Rhc2sgfSBmcm9tICcuL3N1cHBvcnQvcXVldWUnO1xyXG5pbXBvcnQgJy4vU3ltYm9sJztcclxuaW1wb3J0IGhhcyBmcm9tICcuL3N1cHBvcnQvaGFzJztcclxuZXhwb3J0IGxldCBTaGltUHJvbWlzZSA9IGdsb2JhbC5Qcm9taXNlO1xyXG5leHBvcnQgY29uc3QgaXNUaGVuYWJsZSA9IGZ1bmN0aW9uIGlzVGhlbmFibGUodmFsdWUpIHtcclxuICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJztcclxufTtcclxuaWYgKCF0cnVlKSB7XHJcbiAgICBnbG9iYWwuUHJvbWlzZSA9IFNoaW1Qcm9taXNlID0gKF9hID0gY2xhc3MgUHJvbWlzZSB7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IFByb21pc2UuXHJcbiAgICAgICAgICAgICAqXHJcbiAgICAgICAgICAgICAqIEBjb25zdHJ1Y3RvclxyXG4gICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAgKiBAcGFyYW0gZXhlY3V0b3JcclxuICAgICAgICAgICAgICogVGhlIGV4ZWN1dG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbW1lZGlhdGVseSB3aGVuIHRoZSBQcm9taXNlIGlzIGluc3RhbnRpYXRlZC4gSXQgaXMgcmVzcG9uc2libGUgZm9yXHJcbiAgICAgICAgICAgICAqIHN0YXJ0aW5nIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoZW4gaXQgaXMgaW52b2tlZC5cclxuICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgICogVGhlIGV4ZWN1dG9yIG11c3QgY2FsbCBlaXRoZXIgdGhlIHBhc3NlZCBgcmVzb2x2ZWAgZnVuY3Rpb24gd2hlbiB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkXHJcbiAgICAgICAgICAgICAqIHN1Y2Nlc3NmdWxseSwgb3IgdGhlIGByZWplY3RgIGZ1bmN0aW9uIHdoZW4gdGhlIG9wZXJhdGlvbiBmYWlscy5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKGV4ZWN1dG9yKSB7XHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoaXMgcHJvbWlzZS5cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IDEgLyogUGVuZGluZyAqLztcclxuICAgICAgICAgICAgICAgIHRoaXNbU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdQcm9taXNlJztcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogSWYgdHJ1ZSwgdGhlIHJlc29sdXRpb24gb2YgdGhpcyBwcm9taXNlIGlzIGNoYWluZWQgKFwibG9ja2VkIGluXCIpIHRvIGFub3RoZXIgcHJvbWlzZS5cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgbGV0IGlzQ2hhaW5lZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGlzIHByb21pc2UgaXMgaW4gYSByZXNvbHZlZCBzdGF0ZS5cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXNSZXNvbHZlZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZSAhPT0gMSAvKiBQZW5kaW5nICovIHx8IGlzQ2hhaW5lZDtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIENhbGxiYWNrcyB0aGF0IHNob3VsZCBiZSBpbnZva2VkIG9uY2UgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC5cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgbGV0IGNhbGxiYWNrcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBJbml0aWFsbHkgcHVzaGVzIGNhbGxiYWNrcyBvbnRvIGEgcXVldWUgZm9yIGV4ZWN1dGlvbiBvbmNlIHRoaXMgcHJvbWlzZSBzZXR0bGVzLiBBZnRlciB0aGUgcHJvbWlzZSBzZXR0bGVzLFxyXG4gICAgICAgICAgICAgICAgICogZW5xdWV1ZXMgY2FsbGJhY2tzIGZvciBleGVjdXRpb24gb24gdGhlIG5leHQgZXZlbnQgbG9vcCB0dXJuLlxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBsZXQgd2hlbkZpbmlzaGVkID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MucHVzaChjYWxsYmFjayk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogU2V0dGxlcyB0aGlzIHByb21pc2UuXHJcbiAgICAgICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIG5ld1N0YXRlIFRoZSByZXNvbHZlZCBzdGF0ZSBmb3IgdGhpcyBwcm9taXNlLlxyXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIHtUfGFueX0gdmFsdWUgVGhlIHJlc29sdmVkIHZhbHVlIGZvciB0aGlzIHByb21pc2UuXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGNvbnN0IHNldHRsZSA9IChuZXdTdGF0ZSwgdmFsdWUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBBIHByb21pc2UgY2FuIG9ubHkgYmUgc2V0dGxlZCBvbmNlLlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlICE9PSAxIC8qIFBlbmRpbmcgKi8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gbmV3U3RhdGU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlZFZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgd2hlbkZpbmlzaGVkID0gcXVldWVNaWNyb1Rhc2s7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gT25seSBlbnF1ZXVlIGEgY2FsbGJhY2sgcnVubmVyIGlmIHRoZXJlIGFyZSBjYWxsYmFja3Mgc28gdGhhdCBpbml0aWFsbHkgZnVsZmlsbGVkIFByb21pc2VzIGRvbid0IGhhdmUgdG9cclxuICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGFuIGV4dHJhIHR1cm4uXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrcyAmJiBjYWxsYmFja3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZU1pY3JvVGFzayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvdW50ID0gY2FsbGJhY2tzLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzW2ldLmNhbGwobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcyA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIFJlc29sdmVzIHRoaXMgcHJvbWlzZS5cclxuICAgICAgICAgICAgICAgICAqXHJcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gbmV3U3RhdGUgVGhlIHJlc29sdmVkIHN0YXRlIGZvciB0aGlzIHByb21pc2UuXHJcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0ge1R8YW55fSB2YWx1ZSBUaGUgcmVzb2x2ZWQgdmFsdWUgZm9yIHRoaXMgcHJvbWlzZS5cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZSA9IChuZXdTdGF0ZSwgdmFsdWUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNSZXNvbHZlZCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVGhlbmFibGUodmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnRoZW4oc2V0dGxlLmJpbmQobnVsbCwgMCAvKiBGdWxmaWxsZWQgKi8pLCBzZXR0bGUuYmluZChudWxsLCAyIC8qIFJlamVjdGVkICovKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2hhaW5lZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXR0bGUobmV3U3RhdGUsIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgdGhpcy50aGVuID0gKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbkZpbmlzaGVkIGluaXRpYWxseSBxdWV1ZXMgdXAgY2FsbGJhY2tzIGZvciBleGVjdXRpb24gYWZ0ZXIgdGhlIHByb21pc2UgaGFzIHNldHRsZWQuIE9uY2UgdGhlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb21pc2UgaGFzIHNldHRsZWQsIHdoZW5GaW5pc2hlZCB3aWxsIHNjaGVkdWxlIGNhbGxiYWNrcyBmb3IgZXhlY3V0aW9uIG9uIHRoZSBuZXh0IHR1cm4gdGhyb3VnaCB0aGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgbG9vcC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlbkZpbmlzaGVkKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy5zdGF0ZSA9PT0gMiAvKiBSZWplY3RlZCAqLyA/IG9uUmVqZWN0ZWQgOiBvbkZ1bGZpbGxlZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNhbGxiYWNrKHRoaXMucmVzb2x2ZWRWYWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnN0YXRlID09PSAyIC8qIFJlamVjdGVkICovKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHRoaXMucmVzb2x2ZWRWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMucmVzb2x2ZWRWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3IocmVzb2x2ZS5iaW5kKG51bGwsIDAgLyogRnVsZmlsbGVkICovKSwgcmVzb2x2ZS5iaW5kKG51bGwsIDIgLyogUmVqZWN0ZWQgKi8pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldHRsZSgyIC8qIFJlamVjdGVkICovLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3RhdGljIGFsbChpdGVyYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY29tcGxldGUgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvcHVsYXRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGwoaW5kZXgsIHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc1tpbmRleF0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKytjb21wbGV0ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZpbmlzaCgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcHVsYXRpbmcgfHwgY29tcGxldGUgPCB0b3RhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWVzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcHJvY2Vzc0l0ZW0oaW5kZXgsIGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKyt0b3RhbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzVGhlbmFibGUoaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGFuIGl0ZW0gUHJvbWlzZSByZWplY3RzLCB0aGlzIFByb21pc2UgaXMgaW1tZWRpYXRlbHkgcmVqZWN0ZWQgd2l0aCB0aGUgaXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvbWlzZSdzIHJlamVjdGlvbiBlcnJvci5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0udGhlbihmdWxmaWxsLmJpbmQobnVsbCwgaW5kZXgpLCByZWplY3QpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKGl0ZW0pLnRoZW4oZnVsZmlsbC5iaW5kKG51bGwsIGluZGV4KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0l0ZW0oaSwgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHBvcHVsYXRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBmaW5pc2goKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHN0YXRpYyByYWNlKGl0ZXJhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVyYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGEgUHJvbWlzZSBpdGVtIHJlamVjdHMsIHRoaXMgUHJvbWlzZSBpcyBpbW1lZGlhdGVseSByZWplY3RlZCB3aXRoIHRoZSBpdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9taXNlJ3MgcmVqZWN0aW9uIGVycm9yLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS50aGVuKHJlc29sdmUsIHJlamVjdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoaXRlbSkudGhlbihyZXNvbHZlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHN0YXRpYyByZWplY3QocmVhc29uKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3RhdGljIHJlc29sdmUodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcyhmdW5jdGlvbiAocmVzb2x2ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2gob25SZWplY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBfYVtTeW1ib2wuc3BlY2llc10gPSBTaGltUHJvbWlzZSxcclxuICAgICAgICBfYSk7XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgU2hpbVByb21pc2U7XHJcbnZhciBfYTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJvbWlzZS5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vUHJvbWlzZS5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL1Byb21pc2UubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XHJcbmltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xyXG5pbXBvcnQgeyBnZXRWYWx1ZURlc2NyaXB0b3IgfSBmcm9tICcuL3N1cHBvcnQvdXRpbCc7XHJcbmV4cG9ydCBsZXQgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcclxuaWYgKCF0cnVlKSB7XHJcbiAgICAvKipcclxuICAgICAqIFRocm93cyBpZiB0aGUgdmFsdWUgaXMgbm90IGEgc3ltYm9sLCB1c2VkIGludGVybmFsbHkgd2l0aGluIHRoZSBTaGltXHJcbiAgICAgKiBAcGFyYW0gIHthbnl9ICAgIHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVja1xyXG4gICAgICogQHJldHVybiB7c3ltYm9sfSAgICAgICBSZXR1cm5zIHRoZSBzeW1ib2wgb3IgdGhyb3dzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHZhbGlkYXRlU3ltYm9sID0gZnVuY3Rpb24gdmFsaWRhdGVTeW1ib2wodmFsdWUpIHtcclxuICAgICAgICBpZiAoIWlzU3ltYm9sKHZhbHVlKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHZhbHVlICsgJyBpcyBub3QgYSBzeW1ib2wnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfTtcclxuICAgIGNvbnN0IGRlZmluZVByb3BlcnRpZXMgPSBPYmplY3QuZGVmaW5lUHJvcGVydGllcztcclxuICAgIGNvbnN0IGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xyXG4gICAgY29uc3QgY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcclxuICAgIGNvbnN0IG9ialByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XHJcbiAgICBjb25zdCBnbG9iYWxTeW1ib2xzID0ge307XHJcbiAgICBjb25zdCBnZXRTeW1ib2xOYW1lID0gKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBjb25zdCBjcmVhdGVkID0gY3JlYXRlKG51bGwpO1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZGVzYykge1xyXG4gICAgICAgICAgICBsZXQgcG9zdGZpeCA9IDA7XHJcbiAgICAgICAgICAgIGxldCBuYW1lO1xyXG4gICAgICAgICAgICB3aGlsZSAoY3JlYXRlZFtTdHJpbmcoZGVzYykgKyAocG9zdGZpeCB8fCAnJyldKSB7XHJcbiAgICAgICAgICAgICAgICArK3Bvc3RmaXg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGVzYyArPSBTdHJpbmcocG9zdGZpeCB8fCAnJyk7XHJcbiAgICAgICAgICAgIGNyZWF0ZWRbZGVzY10gPSB0cnVlO1xyXG4gICAgICAgICAgICBuYW1lID0gJ0BAJyArIGRlc2M7XHJcbiAgICAgICAgICAgIC8vIEZJWE1FOiBUZW1wb3JhcnkgZ3VhcmQgdW50aWwgdGhlIGR1cGxpY2F0ZSBleGVjdXRpb24gd2hlbiB0ZXN0aW5nIGNhbiBiZVxyXG4gICAgICAgICAgICAvLyBwaW5uZWQgZG93bi5cclxuICAgICAgICAgICAgaWYgKCFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9ialByb3RvdHlwZSwgbmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIGRlZmluZVByb3BlcnR5KG9ialByb3RvdHlwZSwgbmFtZSwge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZVByb3BlcnR5KHRoaXMsIG5hbWUsIGdldFZhbHVlRGVzY3JpcHRvcih2YWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuYW1lO1xyXG4gICAgICAgIH07XHJcbiAgICB9KSgpO1xyXG4gICAgY29uc3QgSW50ZXJuYWxTeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woZGVzY3JpcHRpb24pIHtcclxuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEludGVybmFsU3ltYm9sKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1R5cGVFcnJvcjogU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBTeW1ib2woZGVzY3JpcHRpb24pO1xyXG4gICAgfTtcclxuICAgIFN5bWJvbCA9IGdsb2JhbC5TeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woZGVzY3JpcHRpb24pIHtcclxuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFN5bWJvbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUeXBlRXJyb3I6IFN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzeW0gPSBPYmplY3QuY3JlYXRlKEludGVybmFsU3ltYm9sLnByb3RvdHlwZSk7XHJcbiAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkID8gJycgOiBTdHJpbmcoZGVzY3JpcHRpb24pO1xyXG4gICAgICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0aWVzKHN5bSwge1xyXG4gICAgICAgICAgICBfX2Rlc2NyaXB0aW9uX186IGdldFZhbHVlRGVzY3JpcHRvcihkZXNjcmlwdGlvbiksXHJcbiAgICAgICAgICAgIF9fbmFtZV9fOiBnZXRWYWx1ZURlc2NyaXB0b3IoZ2V0U3ltYm9sTmFtZShkZXNjcmlwdGlvbikpXHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgLyogRGVjb3JhdGUgdGhlIFN5bWJvbCBmdW5jdGlvbiB3aXRoIHRoZSBhcHByb3ByaWF0ZSBwcm9wZXJ0aWVzICovXHJcbiAgICBkZWZpbmVQcm9wZXJ0eShTeW1ib2wsICdmb3InLCBnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgIGlmIChnbG9iYWxTeW1ib2xzW2tleV0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGdsb2JhbFN5bWJvbHNba2V5XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIChnbG9iYWxTeW1ib2xzW2tleV0gPSBTeW1ib2woU3RyaW5nKGtleSkpKTtcclxuICAgIH0pKTtcclxuICAgIGRlZmluZVByb3BlcnRpZXMoU3ltYm9sLCB7XHJcbiAgICAgICAga2V5Rm9yOiBnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKHN5bSkge1xyXG4gICAgICAgICAgICBsZXQga2V5O1xyXG4gICAgICAgICAgICB2YWxpZGF0ZVN5bWJvbChzeW0pO1xyXG4gICAgICAgICAgICBmb3IgKGtleSBpbiBnbG9iYWxTeW1ib2xzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsU3ltYm9sc1trZXldID09PSBzeW0pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgaGFzSW5zdGFuY2U6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdoYXNJbnN0YW5jZScpLCBmYWxzZSwgZmFsc2UpLFxyXG4gICAgICAgIGlzQ29uY2F0U3ByZWFkYWJsZTogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ2lzQ29uY2F0U3ByZWFkYWJsZScpLCBmYWxzZSwgZmFsc2UpLFxyXG4gICAgICAgIGl0ZXJhdG9yOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcignaXRlcmF0b3InKSwgZmFsc2UsIGZhbHNlKSxcclxuICAgICAgICBtYXRjaDogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ21hdGNoJyksIGZhbHNlLCBmYWxzZSksXHJcbiAgICAgICAgb2JzZXJ2YWJsZTogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ29ic2VydmFibGUnKSwgZmFsc2UsIGZhbHNlKSxcclxuICAgICAgICByZXBsYWNlOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcigncmVwbGFjZScpLCBmYWxzZSwgZmFsc2UpLFxyXG4gICAgICAgIHNlYXJjaDogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3NlYXJjaCcpLCBmYWxzZSwgZmFsc2UpLFxyXG4gICAgICAgIHNwZWNpZXM6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdzcGVjaWVzJyksIGZhbHNlLCBmYWxzZSksXHJcbiAgICAgICAgc3BsaXQ6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCdzcGxpdCcpLCBmYWxzZSwgZmFsc2UpLFxyXG4gICAgICAgIHRvUHJpbWl0aXZlOiBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcigndG9QcmltaXRpdmUnKSwgZmFsc2UsIGZhbHNlKSxcclxuICAgICAgICB0b1N0cmluZ1RhZzogZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5mb3IoJ3RvU3RyaW5nVGFnJyksIGZhbHNlLCBmYWxzZSksXHJcbiAgICAgICAgdW5zY29wYWJsZXM6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wuZm9yKCd1bnNjb3BhYmxlcycpLCBmYWxzZSwgZmFsc2UpXHJcbiAgICB9KTtcclxuICAgIC8qIERlY29yYXRlIHRoZSBJbnRlcm5hbFN5bWJvbCBvYmplY3QgKi9cclxuICAgIGRlZmluZVByb3BlcnRpZXMoSW50ZXJuYWxTeW1ib2wucHJvdG90eXBlLCB7XHJcbiAgICAgICAgY29uc3RydWN0b3I6IGdldFZhbHVlRGVzY3JpcHRvcihTeW1ib2wpLFxyXG4gICAgICAgIHRvU3RyaW5nOiBnZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fX25hbWVfXztcclxuICAgICAgICB9LCBmYWxzZSwgZmFsc2UpXHJcbiAgICB9KTtcclxuICAgIC8qIERlY29yYXRlIHRoZSBTeW1ib2wucHJvdG90eXBlICovXHJcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKFN5bWJvbC5wcm90b3R5cGUsIHtcclxuICAgICAgICB0b1N0cmluZzogZ2V0VmFsdWVEZXNjcmlwdG9yKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdTeW1ib2wgKCcgKyB2YWxpZGF0ZVN5bWJvbCh0aGlzKS5fX2Rlc2NyaXB0aW9uX18gKyAnKSc7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdmFsdWVPZjogZ2V0VmFsdWVEZXNjcmlwdG9yKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlU3ltYm9sKHRoaXMpO1xyXG4gICAgICAgIH0pXHJcbiAgICB9KTtcclxuICAgIGRlZmluZVByb3BlcnR5KFN5bWJvbC5wcm90b3R5cGUsIFN5bWJvbC50b1ByaW1pdGl2ZSwgZ2V0VmFsdWVEZXNjcmlwdG9yKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gdmFsaWRhdGVTeW1ib2wodGhpcyk7XHJcbiAgICB9KSk7XHJcbiAgICBkZWZpbmVQcm9wZXJ0eShTeW1ib2wucHJvdG90eXBlLCBTeW1ib2wudG9TdHJpbmdUYWcsIGdldFZhbHVlRGVzY3JpcHRvcignU3ltYm9sJywgZmFsc2UsIGZhbHNlLCB0cnVlKSk7XHJcbiAgICBkZWZpbmVQcm9wZXJ0eShJbnRlcm5hbFN5bWJvbC5wcm90b3R5cGUsIFN5bWJvbC50b1ByaW1pdGl2ZSwgZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5wcm90b3R5cGVbU3ltYm9sLnRvUHJpbWl0aXZlXSwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7XHJcbiAgICBkZWZpbmVQcm9wZXJ0eShJbnRlcm5hbFN5bWJvbC5wcm90b3R5cGUsIFN5bWJvbC50b1N0cmluZ1RhZywgZ2V0VmFsdWVEZXNjcmlwdG9yKFN5bWJvbC5wcm90b3R5cGVbU3ltYm9sLnRvU3RyaW5nVGFnXSwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7XHJcbn1cclxuLyoqXHJcbiAqIEEgY3VzdG9tIGd1YXJkIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyBpZiBhbiBvYmplY3QgaXMgYSBzeW1ib2wgb3Igbm90XHJcbiAqIEBwYXJhbSAge2FueX0gICAgICAgdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrIHRvIHNlZSBpZiBpdCBpcyBhIHN5bWJvbCBvciBub3RcclxuICogQHJldHVybiB7aXMgc3ltYm9sfSAgICAgICBSZXR1cm5zIHRydWUgaWYgYSBzeW1ib2wgb3Igbm90IChhbmQgbmFycm93cyB0aGUgdHlwZSBndWFyZClcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xyXG4gICAgcmV0dXJuICh2YWx1ZSAmJiAodHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJyB8fCB2YWx1ZVsnQEB0b1N0cmluZ1RhZyddID09PSAnU3ltYm9sJykpIHx8IGZhbHNlO1xyXG59XHJcbi8qKlxyXG4gKiBGaWxsIGFueSBtaXNzaW5nIHdlbGwga25vd24gc3ltYm9scyBpZiB0aGUgbmF0aXZlIFN5bWJvbCBpcyBtaXNzaW5nIHRoZW1cclxuICovXHJcbltcclxuICAgICdoYXNJbnN0YW5jZScsXHJcbiAgICAnaXNDb25jYXRTcHJlYWRhYmxlJyxcclxuICAgICdpdGVyYXRvcicsXHJcbiAgICAnc3BlY2llcycsXHJcbiAgICAncmVwbGFjZScsXHJcbiAgICAnc2VhcmNoJyxcclxuICAgICdzcGxpdCcsXHJcbiAgICAnbWF0Y2gnLFxyXG4gICAgJ3RvUHJpbWl0aXZlJyxcclxuICAgICd0b1N0cmluZ1RhZycsXHJcbiAgICAndW5zY29wYWJsZXMnLFxyXG4gICAgJ29ic2VydmFibGUnXHJcbl0uZm9yRWFjaCgod2VsbEtub3duKSA9PiB7XHJcbiAgICBpZiAoIVN5bWJvbFt3ZWxsS25vd25dKSB7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN5bWJvbCwgd2VsbEtub3duLCBnZXRWYWx1ZURlc2NyaXB0b3IoU3ltYm9sLmZvcih3ZWxsS25vd24pLCBmYWxzZSwgZmFsc2UpKTtcclxuICAgIH1cclxufSk7XHJcbmV4cG9ydCBkZWZhdWx0IFN5bWJvbDtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3ltYm9sLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9TeW1ib2wubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9TeW1ib2wubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xyXG5pbXBvcnQgeyBpc0FycmF5TGlrZSB9IGZyb20gJy4vaXRlcmF0b3InO1xyXG5pbXBvcnQgaGFzIGZyb20gJy4vc3VwcG9ydC9oYXMnO1xyXG5pbXBvcnQgJy4vU3ltYm9sJztcclxuZXhwb3J0IGxldCBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7XHJcbmlmICghdHJ1ZSkge1xyXG4gICAgY29uc3QgREVMRVRFRCA9IHt9O1xyXG4gICAgY29uc3QgZ2V0VUlEID0gZnVuY3Rpb24gZ2V0VUlEKCkge1xyXG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwMDApO1xyXG4gICAgfTtcclxuICAgIGNvbnN0IGdlbmVyYXRlTmFtZSA9IChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IHN0YXJ0SWQgPSBNYXRoLmZsb29yKERhdGUubm93KCkgJSAxMDAwMDAwMDApO1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBnZW5lcmF0ZU5hbWUoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnX193bScgKyBnZXRVSUQoKSArIChzdGFydElkKysgKyAnX18nKTtcclxuICAgICAgICB9O1xyXG4gICAgfSkoKTtcclxuICAgIFdlYWtNYXAgPSBjbGFzcyBXZWFrTWFwIHtcclxuICAgICAgICBjb25zdHJ1Y3RvcihpdGVyYWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnV2Vha01hcCc7XHJcbiAgICAgICAgICAgIHRoaXMuX25hbWUgPSBnZW5lcmF0ZU5hbWUoKTtcclxuICAgICAgICAgICAgdGhpcy5fZnJvemVuRW50cmllcyA9IFtdO1xyXG4gICAgICAgICAgICBpZiAoaXRlcmFibGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc0FycmF5TGlrZShpdGVyYWJsZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZXJhYmxlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVyYWJsZVtpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoaXRlbVswXSwgaXRlbVsxXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaXRlcmFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIF9nZXRGcm96ZW5FbnRyeUluZGV4KGtleSkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2Zyb3plbkVudHJpZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9mcm96ZW5FbnRyaWVzW2ldLmtleSA9PT0ga2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZWxldGUoa2V5KSB7XHJcbiAgICAgICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IGtleVt0aGlzLl9uYW1lXTtcclxuICAgICAgICAgICAgaWYgKGVudHJ5ICYmIGVudHJ5LmtleSA9PT0ga2V5ICYmIGVudHJ5LnZhbHVlICE9PSBERUxFVEVEKSB7XHJcbiAgICAgICAgICAgICAgICBlbnRyeS52YWx1ZSA9IERFTEVURUQ7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBmcm96ZW5JbmRleCA9IHRoaXMuX2dldEZyb3plbkVudHJ5SW5kZXgoa2V5KTtcclxuICAgICAgICAgICAgaWYgKGZyb3plbkluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Zyb3plbkVudHJpZXMuc3BsaWNlKGZyb3plbkluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZ2V0KGtleSkge1xyXG4gICAgICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwga2V5ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0ga2V5W3RoaXMuX25hbWVdO1xyXG4gICAgICAgICAgICBpZiAoZW50cnkgJiYgZW50cnkua2V5ID09PSBrZXkgJiYgZW50cnkudmFsdWUgIT09IERFTEVURUQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS52YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBmcm96ZW5JbmRleCA9IHRoaXMuX2dldEZyb3plbkVudHJ5SW5kZXgoa2V5KTtcclxuICAgICAgICAgICAgaWYgKGZyb3plbkluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mcm96ZW5FbnRyaWVzW2Zyb3plbkluZGV4XS52YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBoYXMoa2V5KSB7XHJcbiAgICAgICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IGtleVt0aGlzLl9uYW1lXTtcclxuICAgICAgICAgICAgaWYgKEJvb2xlYW4oZW50cnkgJiYgZW50cnkua2V5ID09PSBrZXkgJiYgZW50cnkudmFsdWUgIT09IERFTEVURUQpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBmcm96ZW5JbmRleCA9IHRoaXMuX2dldEZyb3plbkVudHJ5SW5kZXgoa2V5KTtcclxuICAgICAgICAgICAgaWYgKGZyb3plbkluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0KGtleSwgdmFsdWUpIHtcclxuICAgICAgICAgICAgaWYgKCFrZXkgfHwgKHR5cGVvZiBrZXkgIT09ICdvYmplY3QnICYmIHR5cGVvZiBrZXkgIT09ICdmdW5jdGlvbicpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHZhbHVlIHVzZWQgYXMgd2VhayBtYXAga2V5Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGVudHJ5ID0ga2V5W3RoaXMuX25hbWVdO1xyXG4gICAgICAgICAgICBpZiAoIWVudHJ5IHx8IGVudHJ5LmtleSAhPT0ga2V5KSB7XHJcbiAgICAgICAgICAgICAgICBlbnRyeSA9IE9iamVjdC5jcmVhdGUobnVsbCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogeyB2YWx1ZToga2V5IH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5pc0Zyb3plbihrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZnJvemVuRW50cmllcy5wdXNoKGVudHJ5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShrZXksIHRoaXMuX25hbWUsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVudHJ5XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZW50cnkudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5leHBvcnQgZGVmYXVsdCBXZWFrTWFwO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XZWFrTWFwLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9XZWFrTWFwLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vV2Vha01hcC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IGdsb2JhbCBmcm9tICcuL2dsb2JhbCc7XHJcbmltcG9ydCB7IGlzQXJyYXlMaWtlLCBpc0l0ZXJhYmxlIH0gZnJvbSAnLi9pdGVyYXRvcic7XHJcbmltcG9ydCB7IE1BWF9TQUZFX0lOVEVHRVIgfSBmcm9tICcuL251bWJlcic7XHJcbmltcG9ydCBoYXMgZnJvbSAnLi9zdXBwb3J0L2hhcyc7XHJcbmltcG9ydCB7IHdyYXBOYXRpdmUgfSBmcm9tICcuL3N1cHBvcnQvdXRpbCc7XHJcbmV4cG9ydCBsZXQgZnJvbTtcclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgYXJyYXkgZnJvbSB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycy5cclxuICpcclxuICogQHBhcmFtIGFyZ3VtZW50cyBBbnkgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgdGhlIGFycmF5XHJcbiAqIEByZXR1cm4gQW4gYXJyYXkgZnJvbSB0aGUgZ2l2ZW4gYXJndW1lbnRzXHJcbiAqL1xyXG5leHBvcnQgbGV0IG9mO1xyXG4vKiBFUzYgQXJyYXkgaW5zdGFuY2UgbWV0aG9kcyAqL1xyXG4vKipcclxuICogQ29waWVzIGRhdGEgaW50ZXJuYWxseSB3aXRoaW4gYW4gYXJyYXkgb3IgYXJyYXktbGlrZSBvYmplY3QuXHJcbiAqXHJcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBhcnJheS1saWtlIG9iamVjdFxyXG4gKiBAcGFyYW0gb2Zmc2V0IFRoZSBpbmRleCB0byBzdGFydCBjb3B5aW5nIHZhbHVlcyB0bzsgaWYgbmVnYXRpdmUsIGl0IGNvdW50cyBiYWNrd2FyZHMgZnJvbSBsZW5ndGhcclxuICogQHBhcmFtIHN0YXJ0IFRoZSBmaXJzdCAoaW5jbHVzaXZlKSBpbmRleCB0byBjb3B5OyBpZiBuZWdhdGl2ZSwgaXQgY291bnRzIGJhY2t3YXJkcyBmcm9tIGxlbmd0aFxyXG4gKiBAcGFyYW0gZW5kIFRoZSBsYXN0IChleGNsdXNpdmUpIGluZGV4IHRvIGNvcHk7IGlmIG5lZ2F0aXZlLCBpdCBjb3VudHMgYmFja3dhcmRzIGZyb20gbGVuZ3RoXHJcbiAqIEByZXR1cm4gVGhlIHRhcmdldFxyXG4gKi9cclxuZXhwb3J0IGxldCBjb3B5V2l0aGluO1xyXG4vKipcclxuICogRmlsbHMgZWxlbWVudHMgb2YgYW4gYXJyYXktbGlrZSBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLlxyXG4gKlxyXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgdG8gZmlsbFxyXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGZpbGwgZWFjaCBlbGVtZW50IG9mIHRoZSB0YXJnZXQgd2l0aFxyXG4gKiBAcGFyYW0gc3RhcnQgVGhlIGZpcnN0IGluZGV4IHRvIGZpbGxcclxuICogQHBhcmFtIGVuZCBUaGUgKGV4Y2x1c2l2ZSkgaW5kZXggYXQgd2hpY2ggdG8gc3RvcCBmaWxsaW5nXHJcbiAqIEByZXR1cm4gVGhlIGZpbGxlZCB0YXJnZXRcclxuICovXHJcbmV4cG9ydCBsZXQgZmlsbDtcclxuLyoqXHJcbiAqIEZpbmRzIGFuZCByZXR1cm5zIHRoZSBmaXJzdCBpbnN0YW5jZSBtYXRjaGluZyB0aGUgY2FsbGJhY2sgb3IgdW5kZWZpbmVkIGlmIG9uZSBpcyBub3QgZm91bmQuXHJcbiAqXHJcbiAqIEBwYXJhbSB0YXJnZXQgQW4gYXJyYXktbGlrZSBvYmplY3RcclxuICogQHBhcmFtIGNhbGxiYWNrIEEgZnVuY3Rpb24gcmV0dXJuaW5nIGlmIHRoZSBjdXJyZW50IHZhbHVlIG1hdGNoZXMgYSBjcml0ZXJpYVxyXG4gKiBAcGFyYW0gdGhpc0FyZyBUaGUgZXhlY3V0aW9uIGNvbnRleHQgZm9yIHRoZSBmaW5kIGZ1bmN0aW9uXHJcbiAqIEByZXR1cm4gVGhlIGZpcnN0IGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGNhbGxiYWNrLCBvciB1bmRlZmluZWQgaWYgb25lIGRvZXMgbm90IGV4aXN0XHJcbiAqL1xyXG5leHBvcnQgbGV0IGZpbmQ7XHJcbi8qKlxyXG4gKiBQZXJmb3JtcyBhIGxpbmVhciBzZWFyY2ggYW5kIHJldHVybnMgdGhlIGZpcnN0IGluZGV4IHdob3NlIHZhbHVlIHNhdGlzZmllcyB0aGUgcGFzc2VkIGNhbGxiYWNrLFxyXG4gKiBvciAtMSBpZiBubyB2YWx1ZXMgc2F0aXNmeSBpdC5cclxuICpcclxuICogQHBhcmFtIHRhcmdldCBBbiBhcnJheS1saWtlIG9iamVjdFxyXG4gKiBAcGFyYW0gY2FsbGJhY2sgQSBmdW5jdGlvbiByZXR1cm5pbmcgdHJ1ZSBpZiB0aGUgY3VycmVudCB2YWx1ZSBzYXRpc2ZpZXMgaXRzIGNyaXRlcmlhXHJcbiAqIEBwYXJhbSB0aGlzQXJnIFRoZSBleGVjdXRpb24gY29udGV4dCBmb3IgdGhlIGZpbmQgZnVuY3Rpb25cclxuICogQHJldHVybiBUaGUgZmlyc3QgaW5kZXggd2hvc2UgdmFsdWUgc2F0aXNmaWVzIHRoZSBwYXNzZWQgY2FsbGJhY2ssIG9yIC0xIGlmIG5vIHZhbHVlcyBzYXRpc2Z5IGl0XHJcbiAqL1xyXG5leHBvcnQgbGV0IGZpbmRJbmRleDtcclxuLyogRVM3IEFycmF5IGluc3RhbmNlIG1ldGhvZHMgKi9cclxuLyoqXHJcbiAqIERldGVybWluZXMgd2hldGhlciBhbiBhcnJheSBpbmNsdWRlcyBhIGdpdmVuIHZhbHVlXHJcbiAqXHJcbiAqIEBwYXJhbSB0YXJnZXQgdGhlIHRhcmdldCBhcnJheS1saWtlIG9iamVjdFxyXG4gKiBAcGFyYW0gc2VhcmNoRWxlbWVudCB0aGUgaXRlbSB0byBzZWFyY2ggZm9yXHJcbiAqIEBwYXJhbSBmcm9tSW5kZXggdGhlIHN0YXJ0aW5nIGluZGV4IHRvIHNlYXJjaCBmcm9tXHJcbiAqIEByZXR1cm4gYHRydWVgIGlmIHRoZSBhcnJheSBpbmNsdWRlcyB0aGUgZWxlbWVudCwgb3RoZXJ3aXNlIGBmYWxzZWBcclxuICovXHJcbmV4cG9ydCBsZXQgaW5jbHVkZXM7XHJcbmlmICh0cnVlICYmIHRydWUpIHtcclxuICAgIGZyb20gPSBnbG9iYWwuQXJyYXkuZnJvbTtcclxuICAgIG9mID0gZ2xvYmFsLkFycmF5Lm9mO1xyXG4gICAgY29weVdpdGhpbiA9IHdyYXBOYXRpdmUoZ2xvYmFsLkFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluKTtcclxuICAgIGZpbGwgPSB3cmFwTmF0aXZlKGdsb2JhbC5BcnJheS5wcm90b3R5cGUuZmlsbCk7XHJcbiAgICBmaW5kID0gd3JhcE5hdGl2ZShnbG9iYWwuQXJyYXkucHJvdG90eXBlLmZpbmQpO1xyXG4gICAgZmluZEluZGV4ID0gd3JhcE5hdGl2ZShnbG9iYWwuQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleCk7XHJcbn1cclxuZWxzZSB7XHJcbiAgICAvLyBJdCBpcyBvbmx5IG9sZGVyIHZlcnNpb25zIG9mIFNhZmFyaS9pT1MgdGhhdCBoYXZlIGEgYmFkIGZpbGwgaW1wbGVtZW50YXRpb24gYW5kIHNvIGFyZW4ndCBpbiB0aGUgd2lsZFxyXG4gICAgLy8gVG8gbWFrZSB0aGluZ3MgZWFzaWVyLCBpZiB0aGVyZSBpcyBhIGJhZCBmaWxsIGltcGxlbWVudGF0aW9uLCB0aGUgd2hvbGUgc2V0IG9mIGZ1bmN0aW9ucyB3aWxsIGJlIGZpbGxlZFxyXG4gICAgLyoqXHJcbiAgICAgKiBFbnN1cmVzIGEgbm9uLW5lZ2F0aXZlLCBub24taW5maW5pdGUsIHNhZmUgaW50ZWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgdG8gdmFsaWRhdGVcclxuICAgICAqIEByZXR1cm4gQSBwcm9wZXIgbGVuZ3RoXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHRvTGVuZ3RoID0gZnVuY3Rpb24gdG9MZW5ndGgobGVuZ3RoKSB7XHJcbiAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpO1xyXG4gICAgICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XHJcbiAgICAgICAgICAgIGxlbmd0aCA9IE1hdGguZmxvb3IobGVuZ3RoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRW5zdXJlIGEgbm9uLW5lZ2F0aXZlLCByZWFsLCBzYWZlIGludGVnZXJcclxuICAgICAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobGVuZ3RoLCAwKSwgTUFYX1NBRkVfSU5URUdFUik7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBGcm9tIEVTNiA3LjEuNCBUb0ludGVnZXIoKVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB2YWx1ZSBBIHZhbHVlIHRvIGNvbnZlcnRcclxuICAgICAqIEByZXR1cm4gQW4gaW50ZWdlclxyXG4gICAgICovXHJcbiAgICBjb25zdCB0b0ludGVnZXIgPSBmdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcclxuICAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XHJcbiAgICAgICAgaWYgKGlzTmFOKHZhbHVlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlID09PSAwIHx8ICFpc0Zpbml0ZSh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKHZhbHVlID4gMCA/IDEgOiAtMSkgKiBNYXRoLmZsb29yKE1hdGguYWJzKHZhbHVlKSk7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBOb3JtYWxpemVzIGFuIG9mZnNldCBhZ2FpbnN0IGEgZ2l2ZW4gbGVuZ3RoLCB3cmFwcGluZyBpdCBpZiBuZWdhdGl2ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG9yaWdpbmFsIG9mZnNldFxyXG4gICAgICogQHBhcmFtIGxlbmd0aCBUaGUgdG90YWwgbGVuZ3RoIHRvIG5vcm1hbGl6ZSBhZ2FpbnN0XHJcbiAgICAgKiBAcmV0dXJuIElmIG5lZ2F0aXZlLCBwcm92aWRlIGEgZGlzdGFuY2UgZnJvbSB0aGUgZW5kIChsZW5ndGgpOyBvdGhlcndpc2UgcHJvdmlkZSBhIGRpc3RhbmNlIGZyb20gMFxyXG4gICAgICovXHJcbiAgICBjb25zdCBub3JtYWxpemVPZmZzZXQgPSBmdW5jdGlvbiBub3JtYWxpemVPZmZzZXQodmFsdWUsIGxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZSA8IDAgPyBNYXRoLm1heChsZW5ndGggKyB2YWx1ZSwgMCkgOiBNYXRoLm1pbih2YWx1ZSwgbGVuZ3RoKTtcclxuICAgIH07XHJcbiAgICBmcm9tID0gZnVuY3Rpb24gZnJvbShhcnJheUxpa2UsIG1hcEZ1bmN0aW9uLCB0aGlzQXJnKSB7XHJcbiAgICAgICAgaWYgKGFycmF5TGlrZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2Zyb206IHJlcXVpcmVzIGFuIGFycmF5LWxpa2Ugb2JqZWN0Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtYXBGdW5jdGlvbiAmJiB0aGlzQXJnKSB7XHJcbiAgICAgICAgICAgIG1hcEZ1bmN0aW9uID0gbWFwRnVuY3Rpb24uYmluZCh0aGlzQXJnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWUgKi9cclxuICAgICAgICBjb25zdCBDb25zdHJ1Y3RvciA9IHRoaXM7XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdG9MZW5ndGgoYXJyYXlMaWtlLmxlbmd0aCk7XHJcbiAgICAgICAgLy8gU3VwcG9ydCBleHRlbnNpb25cclxuICAgICAgICBjb25zdCBhcnJheSA9IHR5cGVvZiBDb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyA/IE9iamVjdChuZXcgQ29uc3RydWN0b3IobGVuZ3RoKSkgOiBuZXcgQXJyYXkobGVuZ3RoKTtcclxuICAgICAgICBpZiAoIWlzQXJyYXlMaWtlKGFycmF5TGlrZSkgJiYgIWlzSXRlcmFibGUoYXJyYXlMaWtlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYXJyYXk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmIHRoaXMgaXMgYW4gYXJyYXkgYW5kIHRoZSBub3JtYWxpemVkIGxlbmd0aCBpcyAwLCBqdXN0IHJldHVybiBhbiBlbXB0eSBhcnJheS4gdGhpcyBwcmV2ZW50cyBhIHByb2JsZW1cclxuICAgICAgICAvLyB3aXRoIHRoZSBpdGVyYXRpb24gb24gSUUgd2hlbiB1c2luZyBhIE5hTiBhcnJheSBsZW5ndGguXHJcbiAgICAgICAgaWYgKGlzQXJyYXlMaWtlKGFycmF5TGlrZSkpIHtcclxuICAgICAgICAgICAgaWYgKGxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXlMaWtlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IG1hcEZ1bmN0aW9uID8gbWFwRnVuY3Rpb24oYXJyYXlMaWtlW2ldLCBpKSA6IGFycmF5TGlrZVtpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGkgPSAwO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGFycmF5TGlrZSkge1xyXG4gICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBtYXBGdW5jdGlvbiA/IG1hcEZ1bmN0aW9uKHZhbHVlLCBpKSA6IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhcnJheUxpa2UubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgYXJyYXkubGVuZ3RoID0gbGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXJyYXk7XHJcbiAgICB9O1xyXG4gICAgb2YgPSBmdW5jdGlvbiBvZiguLi5pdGVtcykge1xyXG4gICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChpdGVtcyk7XHJcbiAgICB9O1xyXG4gICAgY29weVdpdGhpbiA9IGZ1bmN0aW9uIGNvcHlXaXRoaW4odGFyZ2V0LCBvZmZzZXQsIHN0YXJ0LCBlbmQpIHtcclxuICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY29weVdpdGhpbjogdGFyZ2V0IG11c3QgYmUgYW4gYXJyYXktbGlrZSBvYmplY3QnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdG9MZW5ndGgodGFyZ2V0Lmxlbmd0aCk7XHJcbiAgICAgICAgb2Zmc2V0ID0gbm9ybWFsaXplT2Zmc2V0KHRvSW50ZWdlcihvZmZzZXQpLCBsZW5ndGgpO1xyXG4gICAgICAgIHN0YXJ0ID0gbm9ybWFsaXplT2Zmc2V0KHRvSW50ZWdlcihzdGFydCksIGxlbmd0aCk7XHJcbiAgICAgICAgZW5kID0gbm9ybWFsaXplT2Zmc2V0KGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9JbnRlZ2VyKGVuZCksIGxlbmd0aCk7XHJcbiAgICAgICAgbGV0IGNvdW50ID0gTWF0aC5taW4oZW5kIC0gc3RhcnQsIGxlbmd0aCAtIG9mZnNldCk7XHJcbiAgICAgICAgbGV0IGRpcmVjdGlvbiA9IDE7XHJcbiAgICAgICAgaWYgKG9mZnNldCA+IHN0YXJ0ICYmIG9mZnNldCA8IHN0YXJ0ICsgY291bnQpIHtcclxuICAgICAgICAgICAgZGlyZWN0aW9uID0gLTE7XHJcbiAgICAgICAgICAgIHN0YXJ0ICs9IGNvdW50IC0gMTtcclxuICAgICAgICAgICAgb2Zmc2V0ICs9IGNvdW50IC0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgd2hpbGUgKGNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICBpZiAoc3RhcnQgaW4gdGFyZ2V0KSB7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRbb2Zmc2V0XSA9IHRhcmdldFtzdGFydF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgdGFyZ2V0W29mZnNldF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb2Zmc2V0ICs9IGRpcmVjdGlvbjtcclxuICAgICAgICAgICAgc3RhcnQgKz0gZGlyZWN0aW9uO1xyXG4gICAgICAgICAgICBjb3VudC0tO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xyXG4gICAgfTtcclxuICAgIGZpbGwgPSBmdW5jdGlvbiBmaWxsKHRhcmdldCwgdmFsdWUsIHN0YXJ0LCBlbmQpIHtcclxuICAgICAgICBjb25zdCBsZW5ndGggPSB0b0xlbmd0aCh0YXJnZXQubGVuZ3RoKTtcclxuICAgICAgICBsZXQgaSA9IG5vcm1hbGl6ZU9mZnNldCh0b0ludGVnZXIoc3RhcnQpLCBsZW5ndGgpO1xyXG4gICAgICAgIGVuZCA9IG5vcm1hbGl6ZU9mZnNldChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvSW50ZWdlcihlbmQpLCBsZW5ndGgpO1xyXG4gICAgICAgIHdoaWxlIChpIDwgZW5kKSB7XHJcbiAgICAgICAgICAgIHRhcmdldFtpKytdID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XHJcbiAgICB9O1xyXG4gICAgZmluZCA9IGZ1bmN0aW9uIGZpbmQodGFyZ2V0LCBjYWxsYmFjaywgdGhpc0FyZykge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gZmluZEluZGV4KHRhcmdldCwgY2FsbGJhY2ssIHRoaXNBcmcpO1xyXG4gICAgICAgIHJldHVybiBpbmRleCAhPT0gLTEgPyB0YXJnZXRbaW5kZXhdIDogdW5kZWZpbmVkO1xyXG4gICAgfTtcclxuICAgIGZpbmRJbmRleCA9IGZ1bmN0aW9uIGZpbmRJbmRleCh0YXJnZXQsIGNhbGxiYWNrLCB0aGlzQXJnKSB7XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdG9MZW5ndGgodGFyZ2V0Lmxlbmd0aCk7XHJcbiAgICAgICAgaWYgKCFjYWxsYmFjaykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdmaW5kOiBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzQXJnKSB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2suYmluZCh0aGlzQXJnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2sodGFyZ2V0W2ldLCBpLCB0YXJnZXQpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICB9O1xyXG59XHJcbmlmICh0cnVlKSB7XHJcbiAgICBpbmNsdWRlcyA9IHdyYXBOYXRpdmUoZ2xvYmFsLkFycmF5LnByb3RvdHlwZS5pbmNsdWRlcyk7XHJcbn1cclxuZWxzZSB7XHJcbiAgICAvKipcclxuICAgICAqIEVuc3VyZXMgYSBub24tbmVnYXRpdmUsIG5vbi1pbmZpbml0ZSwgc2FmZSBpbnRlZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciB0byB2YWxpZGF0ZVxyXG4gICAgICogQHJldHVybiBBIHByb3BlciBsZW5ndGhcclxuICAgICAqL1xyXG4gICAgY29uc3QgdG9MZW5ndGggPSBmdW5jdGlvbiB0b0xlbmd0aChsZW5ndGgpIHtcclxuICAgICAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKTtcclxuICAgICAgICBpZiAoaXNOYU4obGVuZ3RoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcclxuICAgICAgICAgICAgbGVuZ3RoID0gTWF0aC5mbG9vcihsZW5ndGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBFbnN1cmUgYSBub24tbmVnYXRpdmUsIHJlYWwsIHNhZmUgaW50ZWdlclxyXG4gICAgICAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heChsZW5ndGgsIDApLCBNQVhfU0FGRV9JTlRFR0VSKTtcclxuICAgIH07XHJcbiAgICBpbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzKHRhcmdldCwgc2VhcmNoRWxlbWVudCwgZnJvbUluZGV4ID0gMCkge1xyXG4gICAgICAgIGxldCBsZW4gPSB0b0xlbmd0aCh0YXJnZXQubGVuZ3RoKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gZnJvbUluZGV4OyBpIDwgbGVuOyArK2kpIHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudEVsZW1lbnQgPSB0YXJnZXRbaV07XHJcbiAgICAgICAgICAgIGlmIChzZWFyY2hFbGVtZW50ID09PSBjdXJyZW50RWxlbWVudCB8fFxyXG4gICAgICAgICAgICAgICAgKHNlYXJjaEVsZW1lbnQgIT09IHNlYXJjaEVsZW1lbnQgJiYgY3VycmVudEVsZW1lbnQgIT09IGN1cnJlbnRFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfTtcclxufVxyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcnJheS5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vYXJyYXkubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9hcnJheS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiY29uc3QgZ2xvYmFsT2JqZWN0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gZ2xvYmFsIHNwZWMgZGVmaW5lcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdCBjYWxsZWQgJ2dsb2JhbCdcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZ2xvYmFsXG4gICAgICAgIC8vIGBnbG9iYWxgIGlzIGFsc28gZGVmaW5lZCBpbiBOb2RlSlNcbiAgICAgICAgcmV0dXJuIGdsb2JhbDtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gd2luZG93IGlzIGRlZmluZWQgaW4gYnJvd3NlcnNcbiAgICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIHNlbGYgaXMgZGVmaW5lZCBpbiBXZWJXb3JrZXJzXG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cbn0pKCk7XG5leHBvcnQgZGVmYXVsdCBnbG9iYWxPYmplY3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nbG9iYWwubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL2dsb2JhbC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL2dsb2JhbC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0ICcuL1N5bWJvbCc7XG5pbXBvcnQgeyBISUdIX1NVUlJPR0FURV9NQVgsIEhJR0hfU1VSUk9HQVRFX01JTiB9IGZyb20gJy4vc3RyaW5nJztcbmNvbnN0IHN0YXRpY0RvbmUgPSB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbi8qKlxuICogQSBjbGFzcyB0aGF0IF9zaGltc18gYW4gaXRlcmF0b3IgaW50ZXJmYWNlIG9uIGFycmF5IGxpa2Ugb2JqZWN0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNoaW1JdGVyYXRvciB7XG4gICAgY29uc3RydWN0b3IobGlzdCkge1xuICAgICAgICB0aGlzLl9uZXh0SW5kZXggPSAtMTtcbiAgICAgICAgaWYgKGlzSXRlcmFibGUobGlzdCkpIHtcbiAgICAgICAgICAgIHRoaXMuX25hdGl2ZUl0ZXJhdG9yID0gbGlzdFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9saXN0ID0gbGlzdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIG5leHQgaXRlcmF0aW9uIHJlc3VsdCBmb3IgdGhlIEl0ZXJhdG9yXG4gICAgICovXG4gICAgbmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX25hdGl2ZUl0ZXJhdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbmF0aXZlSXRlcmF0b3IubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fbGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRpY0RvbmU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCsrdGhpcy5fbmV4dEluZGV4IDwgdGhpcy5fbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZG9uZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuX2xpc3RbdGhpcy5fbmV4dEluZGV4XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdGljRG9uZTtcbiAgICB9XG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbi8qKlxuICogQSB0eXBlIGd1YXJkIGZvciBjaGVja2luZyBpZiBzb21ldGhpbmcgaGFzIGFuIEl0ZXJhYmxlIGludGVyZmFjZVxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdHlwZSBndWFyZCBhZ2FpbnN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0l0ZXJhYmxlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZVtTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nO1xufVxuLyoqXG4gKiBBIHR5cGUgZ3VhcmQgZm9yIGNoZWNraW5nIGlmIHNvbWV0aGluZyBpcyBBcnJheUxpa2VcbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHR5cGUgZ3VhcmQgYWdhaW5zdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLmxlbmd0aCA9PT0gJ251bWJlcic7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGl0ZXJhdG9yIGZvciBhbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0gaXRlcmFibGUgVGhlIGl0ZXJhYmxlIG9iamVjdCB0byByZXR1cm4gdGhlIGl0ZXJhdG9yIGZvclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0KGl0ZXJhYmxlKSB7XG4gICAgaWYgKGlzSXRlcmFibGUoaXRlcmFibGUpKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzQXJyYXlMaWtlKGl0ZXJhYmxlKSkge1xuICAgICAgICByZXR1cm4gbmV3IFNoaW1JdGVyYXRvcihpdGVyYWJsZSk7XG4gICAgfVxufVxuLyoqXG4gKiBTaGltcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBgZm9yIC4uLiBvZmAgYmxvY2tzXG4gKlxuICogQHBhcmFtIGl0ZXJhYmxlIFRoZSBvYmplY3QgdGhlIHByb3ZpZGVzIGFuIGludGVyYXRvciBpbnRlcmZhY2VcbiAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2ggaXRlbSBvZiB0aGUgaXRlcmFibGVcbiAqIEBwYXJhbSB0aGlzQXJnIE9wdGlvbmFsIHNjb3BlIHRvIHBhc3MgdGhlIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JPZihpdGVyYWJsZSwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICBsZXQgYnJva2VuID0gZmFsc2U7XG4gICAgZnVuY3Rpb24gZG9CcmVhaygpIHtcbiAgICAgICAgYnJva2VuID0gdHJ1ZTtcbiAgICB9XG4gICAgLyogV2UgbmVlZCB0byBoYW5kbGUgaXRlcmF0aW9uIG9mIGRvdWJsZSBieXRlIHN0cmluZ3MgcHJvcGVybHkgKi9cbiAgICBpZiAoaXNBcnJheUxpa2UoaXRlcmFibGUpICYmIHR5cGVvZiBpdGVyYWJsZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgbCA9IGl0ZXJhYmxlLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBjaGFyID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICBpZiAoaSArIDEgPCBsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSA+PSBISUdIX1NVUlJPR0FURV9NSU4gJiYgY29kZSA8PSBISUdIX1NVUlJPR0FURV9NQVgpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhciArPSBpdGVyYWJsZVsrK2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgY2hhciwgaXRlcmFibGUsIGRvQnJlYWspO1xuICAgICAgICAgICAgaWYgKGJyb2tlbikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSBnZXQoaXRlcmFibGUpO1xuICAgICAgICBpZiAoaXRlcmF0b3IpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICB3aGlsZSAoIXJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzQXJnLCByZXN1bHQudmFsdWUsIGl0ZXJhYmxlLCBkb0JyZWFrKTtcbiAgICAgICAgICAgICAgICBpZiAoYnJva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXRlcmF0b3IubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL2l0ZXJhdG9yLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vaXRlcmF0b3IubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xuLyoqXG4gKiBUaGUgc21hbGxlc3QgaW50ZXJ2YWwgYmV0d2VlbiB0d28gcmVwcmVzZW50YWJsZSBudW1iZXJzLlxuICovXG5leHBvcnQgY29uc3QgRVBTSUxPTiA9IDE7XG4vKipcbiAqIFRoZSBtYXhpbXVtIHNhZmUgaW50ZWdlciBpbiBKYXZhU2NyaXB0XG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfU0FGRV9JTlRFR0VSID0gTWF0aC5wb3coMiwgNTMpIC0gMTtcbi8qKlxuICogVGhlIG1pbmltdW0gc2FmZSBpbnRlZ2VyIGluIEphdmFTY3JpcHRcbiAqL1xuZXhwb3J0IGNvbnN0IE1JTl9TQUZFX0lOVEVHRVIgPSAtTUFYX1NBRkVfSU5URUdFUjtcbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXNzZWQgdmFsdWUgaXMgTmFOIHdpdGhvdXQgY29lcnNpb24uXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIE5hTiwgZmFsc2UgaWYgaXQgaXMgbm90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05hTih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGdsb2JhbC5pc05hTih2YWx1ZSk7XG59XG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGFzc2VkIHZhbHVlIGlzIGEgZmluaXRlIG51bWJlciB3aXRob3V0IGNvZXJzaW9uLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBmaW5pdGUsIGZhbHNlIGlmIGl0IGlzIG5vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNGaW5pdGUodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBnbG9iYWwuaXNGaW5pdGUodmFsdWUpO1xufVxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhc3NlZCB2YWx1ZSBpcyBhbiBpbnRlZ2VyLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLCBmYWxzZSBpZiBpdCBpcyBub3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW50ZWdlcih2YWx1ZSkge1xuICAgIHJldHVybiBpc0Zpbml0ZSh2YWx1ZSkgJiYgTWF0aC5mbG9vcih2YWx1ZSkgPT09IHZhbHVlO1xufVxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhc3NlZCB2YWx1ZSBpcyBhbiBpbnRlZ2VyIHRoYXQgaXMgJ3NhZmUsJyBtZWFuaW5nOlxuICogICAxLiBpdCBjYW4gYmUgZXhwcmVzc2VkIGFzIGFuIElFRUUtNzU0IGRvdWJsZSBwcmVjaXNpb24gbnVtYmVyXG4gKiAgIDIuIGl0IGhhcyBhIG9uZS10by1vbmUgbWFwcGluZyB0byBhIG1hdGhlbWF0aWNhbCBpbnRlZ2VyLCBtZWFuaW5nIGl0c1xuICogICAgICBJRUVFLTc1NCByZXByZXNlbnRhdGlvbiBjYW5ub3QgYmUgdGhlIHJlc3VsdCBvZiByb3VuZGluZyBhbnkgb3RoZXJcbiAqICAgICAgaW50ZWdlciB0byBmaXQgdGhlIElFRUUtNzU0IHJlcHJlc2VudGF0aW9uXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGFuIGludGVnZXIsIGZhbHNlIGlmIGl0IGlzIG5vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTYWZlSW50ZWdlcih2YWx1ZSkge1xuICAgIHJldHVybiBpc0ludGVnZXIodmFsdWUpICYmIE1hdGguYWJzKHZhbHVlKSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bnVtYmVyLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9udW1iZXIubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9udW1iZXIubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCBnbG9iYWwgZnJvbSAnLi9nbG9iYWwnO1xyXG5pbXBvcnQgaGFzIGZyb20gJy4vc3VwcG9ydC9oYXMnO1xyXG5pbXBvcnQgeyBpc1N5bWJvbCB9IGZyb20gJy4vU3ltYm9sJztcclxuZXhwb3J0IGxldCBhc3NpZ247XHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBvd24gcHJvcGVydHkgZGVzY3JpcHRvciBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC5cclxuICogQW4gb3duIHByb3BlcnR5IGRlc2NyaXB0b3IgaXMgb25lIHRoYXQgaXMgZGVmaW5lZCBkaXJlY3RseSBvbiB0aGUgb2JqZWN0IGFuZCBpcyBub3RcclxuICogaW5oZXJpdGVkIGZyb20gdGhlIG9iamVjdCdzIHByb3RvdHlwZS5cclxuICogQHBhcmFtIG8gT2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHByb3BlcnR5LlxyXG4gKiBAcGFyYW0gcCBOYW1lIG9mIHRoZSBwcm9wZXJ0eS5cclxuICovXHJcbmV4cG9ydCBsZXQgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xyXG4vKipcclxuICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIG93biBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdC4gVGhlIG93biBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdCBhcmUgdGhvc2UgdGhhdCBhcmUgZGVmaW5lZCBkaXJlY3RseVxyXG4gKiBvbiB0aGF0IG9iamVjdCwgYW5kIGFyZSBub3QgaW5oZXJpdGVkIGZyb20gdGhlIG9iamVjdCdzIHByb3RvdHlwZS4gVGhlIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IGluY2x1ZGUgYm90aCBmaWVsZHMgKG9iamVjdHMpIGFuZCBmdW5jdGlvbnMuXHJcbiAqIEBwYXJhbSBvIE9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBvd24gcHJvcGVydGllcy5cclxuICovXHJcbmV4cG9ydCBsZXQgZ2V0T3duUHJvcGVydHlOYW1lcztcclxuLyoqXHJcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHN5bWJvbCBwcm9wZXJ0aWVzIGZvdW5kIGRpcmVjdGx5IG9uIG9iamVjdCBvLlxyXG4gKiBAcGFyYW0gbyBPYmplY3QgdG8gcmV0cmlldmUgdGhlIHN5bWJvbHMgZnJvbS5cclxuICovXHJcbmV4cG9ydCBsZXQgZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xyXG4vKipcclxuICogUmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZXMgYXJlIHRoZSBzYW1lIHZhbHVlLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqIEBwYXJhbSB2YWx1ZTEgVGhlIGZpcnN0IHZhbHVlLlxyXG4gKiBAcGFyYW0gdmFsdWUyIFRoZSBzZWNvbmQgdmFsdWUuXHJcbiAqL1xyXG5leHBvcnQgbGV0IGlzO1xyXG4vKipcclxuICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydGllcyBhbmQgbWV0aG9kcyBvZiBhbiBvYmplY3QuXHJcbiAqIEBwYXJhbSBvIE9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzLiBUaGlzIGNhbiBiZSBhbiBvYmplY3QgdGhhdCB5b3UgY3JlYXRlZCBvciBhbiBleGlzdGluZyBEb2N1bWVudCBPYmplY3QgTW9kZWwgKERPTSkgb2JqZWN0LlxyXG4gKi9cclxuZXhwb3J0IGxldCBrZXlzO1xyXG4vKiBFUzcgT2JqZWN0IHN0YXRpYyBtZXRob2RzICovXHJcbmV4cG9ydCBsZXQgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycztcclxuZXhwb3J0IGxldCBlbnRyaWVzO1xyXG5leHBvcnQgbGV0IHZhbHVlcztcclxuaWYgKHRydWUpIHtcclxuICAgIGNvbnN0IGdsb2JhbE9iamVjdCA9IGdsb2JhbC5PYmplY3Q7XHJcbiAgICBhc3NpZ24gPSBnbG9iYWxPYmplY3QuYXNzaWduO1xyXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2xvYmFsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcclxuICAgIGdldE93blByb3BlcnR5TmFtZXMgPSBnbG9iYWxPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcclxuICAgIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdsb2JhbE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XHJcbiAgICBpcyA9IGdsb2JhbE9iamVjdC5pcztcclxuICAgIGtleXMgPSBnbG9iYWxPYmplY3Qua2V5cztcclxufVxyXG5lbHNlIHtcclxuICAgIGtleXMgPSBmdW5jdGlvbiBzeW1ib2xBd2FyZUtleXMobykge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvKS5maWx0ZXIoKGtleSkgPT4gIUJvb2xlYW4oa2V5Lm1hdGNoKC9eQEAuKy8pKSk7XHJcbiAgICB9O1xyXG4gICAgYXNzaWduID0gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgLi4uc291cmNlcykge1xyXG4gICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAvLyBUeXBlRXJyb3IgaWYgdW5kZWZpbmVkIG9yIG51bGxcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRvID0gT2JqZWN0KHRhcmdldCk7XHJcbiAgICAgICAgc291cmNlcy5mb3JFYWNoKChuZXh0U291cmNlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChuZXh0U291cmNlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBTa2lwIG92ZXIgaWYgdW5kZWZpbmVkIG9yIG51bGxcclxuICAgICAgICAgICAgICAgIGtleXMobmV4dFNvdXJjZSkuZm9yRWFjaCgobmV4dEtleSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvW25leHRLZXldID0gbmV4dFNvdXJjZVtuZXh0S2V5XTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRvO1xyXG4gICAgfTtcclxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihvLCBwcm9wKSB7XHJcbiAgICAgICAgaWYgKGlzU3ltYm9sKHByb3ApKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8sIHByb3ApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobywgcHJvcCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIGdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKG8pIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobykuZmlsdGVyKChrZXkpID0+ICFCb29sZWFuKGtleS5tYXRjaCgvXkBALisvKSkpO1xyXG4gICAgfTtcclxuICAgIGdldE93blByb3BlcnR5U3ltYm9scyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhvKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG8pXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKGtleSkgPT4gQm9vbGVhbihrZXkubWF0Y2goL15AQC4rLykpKVxyXG4gICAgICAgICAgICAubWFwKChrZXkpID0+IFN5bWJvbC5mb3Ioa2V5LnN1YnN0cmluZygyKSkpO1xyXG4gICAgfTtcclxuICAgIGlzID0gZnVuY3Rpb24gaXModmFsdWUxLCB2YWx1ZTIpIHtcclxuICAgICAgICBpZiAodmFsdWUxID09PSB2YWx1ZTIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlMSAhPT0gMCB8fCAxIC8gdmFsdWUxID09PSAxIC8gdmFsdWUyOyAvLyAtMFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsdWUxICE9PSB2YWx1ZTEgJiYgdmFsdWUyICE9PSB2YWx1ZTI7IC8vIE5hTlxyXG4gICAgfTtcclxufVxyXG5pZiAodHJ1ZSkge1xyXG4gICAgY29uc3QgZ2xvYmFsT2JqZWN0ID0gZ2xvYmFsLk9iamVjdDtcclxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPSBnbG9iYWxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycztcclxuICAgIGVudHJpZXMgPSBnbG9iYWxPYmplY3QuZW50cmllcztcclxuICAgIHZhbHVlcyA9IGdsb2JhbE9iamVjdC52YWx1ZXM7XHJcbn1cclxuZWxzZSB7XHJcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvKSB7XHJcbiAgICAgICAgcmV0dXJuIGdldE93blByb3BlcnR5TmFtZXMobykucmVkdWNlKChwcmV2aW91cywga2V5KSA9PiB7XHJcbiAgICAgICAgICAgIHByZXZpb3VzW2tleV0gPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobywga2V5KTtcclxuICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzO1xyXG4gICAgICAgIH0sIHt9KTtcclxuICAgIH07XHJcbiAgICBlbnRyaWVzID0gZnVuY3Rpb24gZW50cmllcyhvKSB7XHJcbiAgICAgICAgcmV0dXJuIGtleXMobykubWFwKChrZXkpID0+IFtrZXksIG9ba2V5XV0pO1xyXG4gICAgfTtcclxuICAgIHZhbHVlcyA9IGZ1bmN0aW9uIHZhbHVlcyhvKSB7XHJcbiAgICAgICAgcmV0dXJuIGtleXMobykubWFwKChrZXkpID0+IG9ba2V5XSk7XHJcbiAgICB9O1xyXG59XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9iamVjdC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vb2JqZWN0Lm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vb2JqZWN0Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgZ2xvYmFsIGZyb20gJy4vZ2xvYmFsJztcclxuaW1wb3J0IGhhcyBmcm9tICcuL3N1cHBvcnQvaGFzJztcclxuaW1wb3J0IHsgd3JhcE5hdGl2ZSB9IGZyb20gJy4vc3VwcG9ydC91dGlsJztcclxuLyoqXHJcbiAqIFRoZSBtaW5pbXVtIGxvY2F0aW9uIG9mIGhpZ2ggc3Vycm9nYXRlc1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEhJR0hfU1VSUk9HQVRFX01JTiA9IDB4ZDgwMDtcclxuLyoqXHJcbiAqIFRoZSBtYXhpbXVtIGxvY2F0aW9uIG9mIGhpZ2ggc3Vycm9nYXRlc1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEhJR0hfU1VSUk9HQVRFX01BWCA9IDB4ZGJmZjtcclxuLyoqXHJcbiAqIFRoZSBtaW5pbXVtIGxvY2F0aW9uIG9mIGxvdyBzdXJyb2dhdGVzXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTE9XX1NVUlJPR0FURV9NSU4gPSAweGRjMDA7XHJcbi8qKlxyXG4gKiBUaGUgbWF4aW11bSBsb2NhdGlvbiBvZiBsb3cgc3Vycm9nYXRlc1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IExPV19TVVJST0dBVEVfTUFYID0gMHhkZmZmO1xyXG4vKiBFUzYgc3RhdGljIG1ldGhvZHMgKi9cclxuLyoqXHJcbiAqIFJldHVybiB0aGUgU3RyaW5nIHZhbHVlIHdob3NlIGVsZW1lbnRzIGFyZSwgaW4gb3JkZXIsIHRoZSBlbGVtZW50cyBpbiB0aGUgTGlzdCBlbGVtZW50cy5cclxuICogSWYgbGVuZ3RoIGlzIDAsIHRoZSBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuXHJcbiAqIEBwYXJhbSBjb2RlUG9pbnRzIFRoZSBjb2RlIHBvaW50cyB0byBnZW5lcmF0ZSB0aGUgc3RyaW5nXHJcbiAqL1xyXG5leHBvcnQgbGV0IGZyb21Db2RlUG9pbnQ7XHJcbi8qKlxyXG4gKiBgcmF3YCBpcyBpbnRlbmRlZCBmb3IgdXNlIGFzIGEgdGFnIGZ1bmN0aW9uIG9mIGEgVGFnZ2VkIFRlbXBsYXRlIFN0cmluZy4gV2hlbiBjYWxsZWRcclxuICogYXMgc3VjaCB0aGUgZmlyc3QgYXJndW1lbnQgd2lsbCBiZSBhIHdlbGwgZm9ybWVkIHRlbXBsYXRlIGNhbGwgc2l0ZSBvYmplY3QgYW5kIHRoZSByZXN0XHJcbiAqIHBhcmFtZXRlciB3aWxsIGNvbnRhaW4gdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMuXHJcbiAqIEBwYXJhbSB0ZW1wbGF0ZSBBIHdlbGwtZm9ybWVkIHRlbXBsYXRlIHN0cmluZyBjYWxsIHNpdGUgcmVwcmVzZW50YXRpb24uXHJcbiAqIEBwYXJhbSBzdWJzdGl0dXRpb25zIEEgc2V0IG9mIHN1YnN0aXR1dGlvbiB2YWx1ZXMuXHJcbiAqL1xyXG5leHBvcnQgbGV0IHJhdztcclxuLyogRVM2IGluc3RhbmNlIG1ldGhvZHMgKi9cclxuLyoqXHJcbiAqIFJldHVybnMgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIE51bWJlciBsZXNzIHRoYW4gMTExNDExMiAoMHgxMTAwMDApIHRoYXQgaXMgdGhlIGNvZGUgcG9pbnRcclxuICogdmFsdWUgb2YgdGhlIFVURi0xNiBlbmNvZGVkIGNvZGUgcG9pbnQgc3RhcnRpbmcgYXQgdGhlIHN0cmluZyBlbGVtZW50IGF0IHBvc2l0aW9uIHBvcyBpblxyXG4gKiB0aGUgU3RyaW5nIHJlc3VsdGluZyBmcm9tIGNvbnZlcnRpbmcgdGhpcyBvYmplY3QgdG8gYSBTdHJpbmcuXHJcbiAqIElmIHRoZXJlIGlzIG5vIGVsZW1lbnQgYXQgdGhhdCBwb3NpdGlvbiwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuXHJcbiAqIElmIGEgdmFsaWQgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlyIGRvZXMgbm90IGJlZ2luIGF0IHBvcywgdGhlIHJlc3VsdCBpcyB0aGUgY29kZSB1bml0IGF0IHBvcy5cclxuICovXHJcbmV4cG9ydCBsZXQgY29kZVBvaW50QXQ7XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcXVlbmNlIG9mIGVsZW1lbnRzIG9mIHNlYXJjaFN0cmluZyBjb252ZXJ0ZWQgdG8gYSBTdHJpbmcgaXMgdGhlXHJcbiAqIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgdGhpcyBvYmplY3QgKGNvbnZlcnRlZCB0byBhIFN0cmluZykgc3RhcnRpbmcgYXRcclxuICogZW5kUG9zaXRpb24g4oCTIGxlbmd0aCh0aGlzKS4gT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuXHJcbiAqL1xyXG5leHBvcnQgbGV0IGVuZHNXaXRoO1xyXG4vKipcclxuICogUmV0dXJucyB0cnVlIGlmIHNlYXJjaFN0cmluZyBhcHBlYXJzIGFzIGEgc3Vic3RyaW5nIG9mIHRoZSByZXN1bHQgb2YgY29udmVydGluZyB0aGlzXHJcbiAqIG9iamVjdCB0byBhIFN0cmluZywgYXQgb25lIG9yIG1vcmUgcG9zaXRpb25zIHRoYXQgYXJlXHJcbiAqIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBwb3NpdGlvbjsgb3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlLlxyXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgc3RyaW5nXHJcbiAqIEBwYXJhbSBzZWFyY2hTdHJpbmcgc2VhcmNoIHN0cmluZ1xyXG4gKiBAcGFyYW0gcG9zaXRpb24gSWYgcG9zaXRpb24gaXMgdW5kZWZpbmVkLCAwIGlzIGFzc3VtZWQsIHNvIGFzIHRvIHNlYXJjaCBhbGwgb2YgdGhlIFN0cmluZy5cclxuICovXHJcbmV4cG9ydCBsZXQgaW5jbHVkZXM7XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBTdHJpbmcgdmFsdWUgcmVzdWx0IG9mIG5vcm1hbGl6aW5nIHRoZSBzdHJpbmcgaW50byB0aGUgbm9ybWFsaXphdGlvbiBmb3JtXHJcbiAqIG5hbWVkIGJ5IGZvcm0gYXMgc3BlY2lmaWVkIGluIFVuaWNvZGUgU3RhbmRhcmQgQW5uZXggIzE1LCBVbmljb2RlIE5vcm1hbGl6YXRpb24gRm9ybXMuXHJcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBzdHJpbmdcclxuICogQHBhcmFtIGZvcm0gQXBwbGljYWJsZSB2YWx1ZXM6IFwiTkZDXCIsIFwiTkZEXCIsIFwiTkZLQ1wiLCBvciBcIk5GS0RcIiwgSWYgbm90IHNwZWNpZmllZCBkZWZhdWx0XHJcbiAqIGlzIFwiTkZDXCJcclxuICovXHJcbmV4cG9ydCBsZXQgbm9ybWFsaXplO1xyXG4vKipcclxuICogUmV0dXJucyBhIFN0cmluZyB2YWx1ZSB0aGF0IGlzIG1hZGUgZnJvbSBjb3VudCBjb3BpZXMgYXBwZW5kZWQgdG9nZXRoZXIuIElmIGNvdW50IGlzIDAsXHJcbiAqIFQgaXMgdGhlIGVtcHR5IFN0cmluZyBpcyByZXR1cm5lZC5cclxuICogQHBhcmFtIGNvdW50IG51bWJlciBvZiBjb3BpZXMgdG8gYXBwZW5kXHJcbiAqL1xyXG5leHBvcnQgbGV0IHJlcGVhdDtcclxuLyoqXHJcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VxdWVuY2Ugb2YgZWxlbWVudHMgb2Ygc2VhcmNoU3RyaW5nIGNvbnZlcnRlZCB0byBhIFN0cmluZyBpcyB0aGVcclxuICogc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiB0aGlzIG9iamVjdCAoY29udmVydGVkIHRvIGEgU3RyaW5nKSBzdGFydGluZyBhdFxyXG4gKiBwb3NpdGlvbi4gT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuXHJcbiAqL1xyXG5leHBvcnQgbGV0IHN0YXJ0c1dpdGg7XHJcbi8qIEVTNyBpbnN0YW5jZSBtZXRob2RzICovXHJcbi8qKlxyXG4gKiBQYWRzIHRoZSBjdXJyZW50IHN0cmluZyB3aXRoIGEgZ2l2ZW4gc3RyaW5nIChwb3NzaWJseSByZXBlYXRlZCkgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHN0cmluZyByZWFjaGVzIGEgZ2l2ZW4gbGVuZ3RoLlxyXG4gKiBUaGUgcGFkZGluZyBpcyBhcHBsaWVkIGZyb20gdGhlIGVuZCAocmlnaHQpIG9mIHRoZSBjdXJyZW50IHN0cmluZy5cclxuICpcclxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHN0cmluZ1xyXG4gKiBAcGFyYW0gbWF4TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcgb25jZSB0aGUgY3VycmVudCBzdHJpbmcgaGFzIGJlZW4gcGFkZGVkLlxyXG4gKiAgICAgICAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgc21hbGxlciB0aGFuIHRoZSBjdXJyZW50IHN0cmluZydzIGxlbmd0aCwgdGhlIGN1cnJlbnQgc3RyaW5nIHdpbGwgYmUgcmV0dXJuZWQgYXMgaXQgaXMuXHJcbiAqXHJcbiAqIEBwYXJhbSBmaWxsU3RyaW5nIFRoZSBzdHJpbmcgdG8gcGFkIHRoZSBjdXJyZW50IHN0cmluZyB3aXRoLlxyXG4gKiAgICAgICAgSWYgdGhpcyBzdHJpbmcgaXMgdG9vIGxvbmcsIGl0IHdpbGwgYmUgdHJ1bmNhdGVkIGFuZCB0aGUgbGVmdC1tb3N0IHBhcnQgd2lsbCBiZSBhcHBsaWVkLlxyXG4gKiAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlzIFwiIFwiIChVKzAwMjApLlxyXG4gKi9cclxuZXhwb3J0IGxldCBwYWRFbmQ7XHJcbi8qKlxyXG4gKiBQYWRzIHRoZSBjdXJyZW50IHN0cmluZyB3aXRoIGEgZ2l2ZW4gc3RyaW5nIChwb3NzaWJseSByZXBlYXRlZCkgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHN0cmluZyByZWFjaGVzIGEgZ2l2ZW4gbGVuZ3RoLlxyXG4gKiBUaGUgcGFkZGluZyBpcyBhcHBsaWVkIGZyb20gdGhlIHN0YXJ0IChsZWZ0KSBvZiB0aGUgY3VycmVudCBzdHJpbmcuXHJcbiAqXHJcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBzdHJpbmdcclxuICogQHBhcmFtIG1heExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nIG9uY2UgdGhlIGN1cnJlbnQgc3RyaW5nIGhhcyBiZWVuIHBhZGRlZC5cclxuICogICAgICAgIElmIHRoaXMgcGFyYW1ldGVyIGlzIHNtYWxsZXIgdGhhbiB0aGUgY3VycmVudCBzdHJpbmcncyBsZW5ndGgsIHRoZSBjdXJyZW50IHN0cmluZyB3aWxsIGJlIHJldHVybmVkIGFzIGl0IGlzLlxyXG4gKlxyXG4gKiBAcGFyYW0gZmlsbFN0cmluZyBUaGUgc3RyaW5nIHRvIHBhZCB0aGUgY3VycmVudCBzdHJpbmcgd2l0aC5cclxuICogICAgICAgIElmIHRoaXMgc3RyaW5nIGlzIHRvbyBsb25nLCBpdCB3aWxsIGJlIHRydW5jYXRlZCBhbmQgdGhlIGxlZnQtbW9zdCBwYXJ0IHdpbGwgYmUgYXBwbGllZC5cclxuICogICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciBpcyBcIiBcIiAoVSswMDIwKS5cclxuICovXHJcbmV4cG9ydCBsZXQgcGFkU3RhcnQ7XHJcbmlmICh0cnVlICYmIHRydWUpIHtcclxuICAgIGZyb21Db2RlUG9pbnQgPSBnbG9iYWwuU3RyaW5nLmZyb21Db2RlUG9pbnQ7XHJcbiAgICByYXcgPSBnbG9iYWwuU3RyaW5nLnJhdztcclxuICAgIGNvZGVQb2ludEF0ID0gd3JhcE5hdGl2ZShnbG9iYWwuU3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdCk7XHJcbiAgICBlbmRzV2l0aCA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUuZW5kc1dpdGgpO1xyXG4gICAgaW5jbHVkZXMgPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzKTtcclxuICAgIG5vcm1hbGl6ZSA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUubm9ybWFsaXplKTtcclxuICAgIHJlcGVhdCA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUucmVwZWF0KTtcclxuICAgIHN0YXJ0c1dpdGggPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGgpO1xyXG59XHJcbmVsc2Uge1xyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGF0ZXMgdGhhdCB0ZXh0IGlzIGRlZmluZWQsIGFuZCBub3JtYWxpemVzIHBvc2l0aW9uIChiYXNlZCBvbiB0aGUgZ2l2ZW4gZGVmYXVsdCBpZiB0aGUgaW5wdXQgaXMgTmFOKS5cclxuICAgICAqIFVzZWQgYnkgc3RhcnRzV2l0aCwgaW5jbHVkZXMsIGFuZCBlbmRzV2l0aC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIE5vcm1hbGl6ZWQgcG9zaXRpb24uXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IG5vcm1hbGl6ZVN1YnN0cmluZ0FyZ3MgPSBmdW5jdGlvbiAobmFtZSwgdGV4dCwgc2VhcmNoLCBwb3NpdGlvbiwgaXNFbmQgPSBmYWxzZSkge1xyXG4gICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RyaW5nLicgKyBuYW1lICsgJyByZXF1aXJlcyBhIHZhbGlkIHN0cmluZyB0byBzZWFyY2ggYWdhaW5zdC4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGV4dC5sZW5ndGg7XHJcbiAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiAhPT0gcG9zaXRpb24gPyAoaXNFbmQgPyBsZW5ndGggOiAwKSA6IHBvc2l0aW9uO1xyXG4gICAgICAgIHJldHVybiBbdGV4dCwgU3RyaW5nKHNlYXJjaCksIE1hdGgubWluKE1hdGgubWF4KHBvc2l0aW9uLCAwKSwgbGVuZ3RoKV07XHJcbiAgICB9O1xyXG4gICAgZnJvbUNvZGVQb2ludCA9IGZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoLi4uY29kZVBvaW50cykge1xyXG4gICAgICAgIC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcuZnJvbUNvZGVQb2ludFxyXG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKCFsZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBmcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xyXG4gICAgICAgIGNvbnN0IE1BWF9TSVpFID0gMHg0MDAwO1xyXG4gICAgICAgIGxldCBjb2RlVW5pdHMgPSBbXTtcclxuICAgICAgICBsZXQgaW5kZXggPSAtMTtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gJyc7XHJcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcclxuICAgICAgICAgICAgbGV0IGNvZGVQb2ludCA9IE51bWJlcihhcmd1bWVudHNbaW5kZXhdKTtcclxuICAgICAgICAgICAgLy8gQ29kZSBwb2ludHMgbXVzdCBiZSBmaW5pdGUgaW50ZWdlcnMgd2l0aGluIHRoZSB2YWxpZCByYW5nZVxyXG4gICAgICAgICAgICBsZXQgaXNWYWxpZCA9IGlzRmluaXRlKGNvZGVQb2ludCkgJiYgTWF0aC5mbG9vcihjb2RlUG9pbnQpID09PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50ID49IDAgJiYgY29kZVBvaW50IDw9IDB4MTBmZmZmO1xyXG4gICAgICAgICAgICBpZiAoIWlzVmFsaWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoJ3N0cmluZy5mcm9tQ29kZVBvaW50OiBJbnZhbGlkIGNvZGUgcG9pbnQgJyArIGNvZGVQb2ludCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA8PSAweGZmZmYpIHtcclxuICAgICAgICAgICAgICAgIC8vIEJNUCBjb2RlIHBvaW50XHJcbiAgICAgICAgICAgICAgICBjb2RlVW5pdHMucHVzaChjb2RlUG9pbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gQXN0cmFsIGNvZGUgcG9pbnQ7IHNwbGl0IGluIHN1cnJvZ2F0ZSBoYWx2ZXNcclxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nI3N1cnJvZ2F0ZS1mb3JtdWxhZVxyXG4gICAgICAgICAgICAgICAgY29kZVBvaW50IC09IDB4MTAwMDA7XHJcbiAgICAgICAgICAgICAgICBsZXQgaGlnaFN1cnJvZ2F0ZSA9IChjb2RlUG9pbnQgPj4gMTApICsgSElHSF9TVVJST0dBVEVfTUlOO1xyXG4gICAgICAgICAgICAgICAgbGV0IGxvd1N1cnJvZ2F0ZSA9IGNvZGVQb2ludCAlIDB4NDAwICsgTE9XX1NVUlJPR0FURV9NSU47XHJcbiAgICAgICAgICAgICAgICBjb2RlVW5pdHMucHVzaChoaWdoU3Vycm9nYXRlLCBsb3dTdXJyb2dhdGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpbmRleCArIDEgPT09IGxlbmd0aCB8fCBjb2RlVW5pdHMubGVuZ3RoID4gTUFYX1NJWkUpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBmcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgY29kZVVuaXRzKTtcclxuICAgICAgICAgICAgICAgIGNvZGVVbml0cy5sZW5ndGggPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9O1xyXG4gICAgcmF3ID0gZnVuY3Rpb24gcmF3KGNhbGxTaXRlLCAuLi5zdWJzdGl0dXRpb25zKSB7XHJcbiAgICAgICAgbGV0IHJhd1N0cmluZ3MgPSBjYWxsU2l0ZS5yYXc7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xyXG4gICAgICAgIGxldCBudW1TdWJzdGl0dXRpb25zID0gc3Vic3RpdHV0aW9ucy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGNhbGxTaXRlID09IG51bGwgfHwgY2FsbFNpdGUucmF3ID09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RyaW5nLnJhdyByZXF1aXJlcyBhIHZhbGlkIGNhbGxTaXRlIG9iamVjdCB3aXRoIGEgcmF3IHZhbHVlJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSByYXdTdHJpbmdzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCArPSByYXdTdHJpbmdzW2ldICsgKGkgPCBudW1TdWJzdGl0dXRpb25zICYmIGkgPCBsZW5ndGggLSAxID8gc3Vic3RpdHV0aW9uc1tpXSA6ICcnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcbiAgICBjb2RlUG9pbnRBdCA9IGZ1bmN0aW9uIGNvZGVQb2ludEF0KHRleHQsIHBvc2l0aW9uID0gMCkge1xyXG4gICAgICAgIC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0XHJcbiAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJpbmcuY29kZVBvaW50QXQgcmVxdXJpZXMgYSB2YWxpZCBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRleHQubGVuZ3RoO1xyXG4gICAgICAgIGlmIChwb3NpdGlvbiAhPT0gcG9zaXRpb24pIHtcclxuICAgICAgICAgICAgcG9zaXRpb24gPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID49IGxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBHZXQgdGhlIGZpcnN0IGNvZGUgdW5pdFxyXG4gICAgICAgIGNvbnN0IGZpcnN0ID0gdGV4dC5jaGFyQ29kZUF0KHBvc2l0aW9uKTtcclxuICAgICAgICBpZiAoZmlyc3QgPj0gSElHSF9TVVJST0dBVEVfTUlOICYmIGZpcnN0IDw9IEhJR0hfU1VSUk9HQVRFX01BWCAmJiBsZW5ndGggPiBwb3NpdGlvbiArIDEpIHtcclxuICAgICAgICAgICAgLy8gU3RhcnQgb2YgYSBzdXJyb2dhdGUgcGFpciAoaGlnaCBzdXJyb2dhdGUgYW5kIHRoZXJlIGlzIGEgbmV4dCBjb2RlIHVuaXQpOyBjaGVjayBmb3IgbG93IHN1cnJvZ2F0ZVxyXG4gICAgICAgICAgICAvLyBodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZyNzdXJyb2dhdGUtZm9ybXVsYWVcclxuICAgICAgICAgICAgY29uc3Qgc2Vjb25kID0gdGV4dC5jaGFyQ29kZUF0KHBvc2l0aW9uICsgMSk7XHJcbiAgICAgICAgICAgIGlmIChzZWNvbmQgPj0gTE9XX1NVUlJPR0FURV9NSU4gJiYgc2Vjb25kIDw9IExPV19TVVJST0dBVEVfTUFYKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKGZpcnN0IC0gSElHSF9TVVJST0dBVEVfTUlOKSAqIDB4NDAwICsgc2Vjb25kIC0gTE9XX1NVUlJPR0FURV9NSU4gKyAweDEwMDAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmaXJzdDtcclxuICAgIH07XHJcbiAgICBlbmRzV2l0aCA9IGZ1bmN0aW9uIGVuZHNXaXRoKHRleHQsIHNlYXJjaCwgZW5kUG9zaXRpb24pIHtcclxuICAgICAgICBpZiAoZW5kUG9zaXRpb24gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBlbmRQb3NpdGlvbiA9IHRleHQubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBbdGV4dCwgc2VhcmNoLCBlbmRQb3NpdGlvbl0gPSBub3JtYWxpemVTdWJzdHJpbmdBcmdzKCdlbmRzV2l0aCcsIHRleHQsIHNlYXJjaCwgZW5kUG9zaXRpb24sIHRydWUpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gZW5kUG9zaXRpb24gLSBzZWFyY2gubGVuZ3RoO1xyXG4gICAgICAgIGlmIChzdGFydCA8IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGV4dC5zbGljZShzdGFydCwgZW5kUG9zaXRpb24pID09PSBzZWFyY2g7XHJcbiAgICB9O1xyXG4gICAgaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyh0ZXh0LCBzZWFyY2gsIHBvc2l0aW9uID0gMCkge1xyXG4gICAgICAgIFt0ZXh0LCBzZWFyY2gsIHBvc2l0aW9uXSA9IG5vcm1hbGl6ZVN1YnN0cmluZ0FyZ3MoJ2luY2x1ZGVzJywgdGV4dCwgc2VhcmNoLCBwb3NpdGlvbik7XHJcbiAgICAgICAgcmV0dXJuIHRleHQuaW5kZXhPZihzZWFyY2gsIHBvc2l0aW9uKSAhPT0gLTE7XHJcbiAgICB9O1xyXG4gICAgcmVwZWF0ID0gZnVuY3Rpb24gcmVwZWF0KHRleHQsIGNvdW50ID0gMCkge1xyXG4gICAgICAgIC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcucHJvdG90eXBlLnJlcGVhdFxyXG4gICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RyaW5nLnJlcGVhdCByZXF1aXJlcyBhIHZhbGlkIHN0cmluZy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvdW50ICE9PSBjb3VudCkge1xyXG4gICAgICAgICAgICBjb3VudCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb3VudCA8IDAgfHwgY291bnQgPT09IEluZmluaXR5KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdzdHJpbmcucmVwZWF0IHJlcXVpcmVzIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSBjb3VudC4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xyXG4gICAgICAgIHdoaWxlIChjb3VudCkge1xyXG4gICAgICAgICAgICBpZiAoY291bnQgJSAyKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gdGV4dDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY291bnQgPiAxKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ICs9IHRleHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY291bnQgPj49IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9O1xyXG4gICAgc3RhcnRzV2l0aCA9IGZ1bmN0aW9uIHN0YXJ0c1dpdGgodGV4dCwgc2VhcmNoLCBwb3NpdGlvbiA9IDApIHtcclxuICAgICAgICBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoKTtcclxuICAgICAgICBbdGV4dCwgc2VhcmNoLCBwb3NpdGlvbl0gPSBub3JtYWxpemVTdWJzdHJpbmdBcmdzKCdzdGFydHNXaXRoJywgdGV4dCwgc2VhcmNoLCBwb3NpdGlvbik7XHJcbiAgICAgICAgY29uc3QgZW5kID0gcG9zaXRpb24gKyBzZWFyY2gubGVuZ3RoO1xyXG4gICAgICAgIGlmIChlbmQgPiB0ZXh0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKHBvc2l0aW9uLCBlbmQpID09PSBzZWFyY2g7XHJcbiAgICB9O1xyXG59XHJcbmlmICh0cnVlKSB7XHJcbiAgICBwYWRFbmQgPSB3cmFwTmF0aXZlKGdsb2JhbC5TdHJpbmcucHJvdG90eXBlLnBhZEVuZCk7XHJcbiAgICBwYWRTdGFydCA9IHdyYXBOYXRpdmUoZ2xvYmFsLlN0cmluZy5wcm90b3R5cGUucGFkU3RhcnQpO1xyXG59XHJcbmVsc2Uge1xyXG4gICAgcGFkRW5kID0gZnVuY3Rpb24gcGFkRW5kKHRleHQsIG1heExlbmd0aCwgZmlsbFN0cmluZyA9ICcgJykge1xyXG4gICAgICAgIGlmICh0ZXh0ID09PSBudWxsIHx8IHRleHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJpbmcucmVwZWF0IHJlcXVpcmVzIGEgdmFsaWQgc3RyaW5nLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobWF4TGVuZ3RoID09PSBJbmZpbml0eSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc3RyaW5nLnBhZEVuZCByZXF1aXJlcyBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgY291bnQuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtYXhMZW5ndGggPT09IG51bGwgfHwgbWF4TGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbWF4TGVuZ3RoIDwgMCkge1xyXG4gICAgICAgICAgICBtYXhMZW5ndGggPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgc3RyVGV4dCA9IFN0cmluZyh0ZXh0KTtcclxuICAgICAgICBjb25zdCBwYWRkaW5nID0gbWF4TGVuZ3RoIC0gc3RyVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgaWYgKHBhZGRpbmcgPiAwKSB7XHJcbiAgICAgICAgICAgIHN0clRleHQgKz1cclxuICAgICAgICAgICAgICAgIHJlcGVhdChmaWxsU3RyaW5nLCBNYXRoLmZsb29yKHBhZGRpbmcgLyBmaWxsU3RyaW5nLmxlbmd0aCkpICtcclxuICAgICAgICAgICAgICAgICAgICBmaWxsU3RyaW5nLnNsaWNlKDAsIHBhZGRpbmcgJSBmaWxsU3RyaW5nLmxlbmd0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdHJUZXh0O1xyXG4gICAgfTtcclxuICAgIHBhZFN0YXJ0ID0gZnVuY3Rpb24gcGFkU3RhcnQodGV4dCwgbWF4TGVuZ3RoLCBmaWxsU3RyaW5nID0gJyAnKSB7XHJcbiAgICAgICAgaWYgKHRleHQgPT09IG51bGwgfHwgdGV4dCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmluZy5yZXBlYXQgcmVxdWlyZXMgYSB2YWxpZCBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtYXhMZW5ndGggPT09IEluZmluaXR5KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdzdHJpbmcucGFkU3RhcnQgcmVxdWlyZXMgYSBub24tbmVnYXRpdmUgZmluaXRlIGNvdW50LicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobWF4TGVuZ3RoID09PSBudWxsIHx8IG1heExlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IG1heExlbmd0aCA8IDApIHtcclxuICAgICAgICAgICAgbWF4TGVuZ3RoID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHN0clRleHQgPSBTdHJpbmcodGV4dCk7XHJcbiAgICAgICAgY29uc3QgcGFkZGluZyA9IG1heExlbmd0aCAtIHN0clRleHQubGVuZ3RoO1xyXG4gICAgICAgIGlmIChwYWRkaW5nID4gMCkge1xyXG4gICAgICAgICAgICBzdHJUZXh0ID1cclxuICAgICAgICAgICAgICAgIHJlcGVhdChmaWxsU3RyaW5nLCBNYXRoLmZsb29yKHBhZGRpbmcgLyBmaWxsU3RyaW5nLmxlbmd0aCkpICtcclxuICAgICAgICAgICAgICAgICAgICBmaWxsU3RyaW5nLnNsaWNlKDAsIHBhZGRpbmcgJSBmaWxsU3RyaW5nLmxlbmd0aCkgK1xyXG4gICAgICAgICAgICAgICAgICAgIHN0clRleHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdHJUZXh0O1xyXG4gICAgfTtcclxufVxyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmcubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL3N0cmluZy5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL3N0cmluZy5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IGhhcywgeyBhZGQgfSBmcm9tICcuLi8uLi9oYXMvaGFzJztcclxuaW1wb3J0IGdsb2JhbCBmcm9tICcuLi9nbG9iYWwnO1xyXG5leHBvcnQgZGVmYXVsdCBoYXM7XHJcbmV4cG9ydCAqIGZyb20gJy4uLy4uL2hhcy9oYXMnO1xyXG4vKiBFQ01BU2NyaXB0IDYgYW5kIDcgRmVhdHVyZXMgKi9cclxuLyogQXJyYXkgKi9cclxuYWRkKCdlczYtYXJyYXknLCAoKSA9PiB7XHJcbiAgICByZXR1cm4gKFsnZnJvbScsICdvZiddLmV2ZXJ5KChrZXkpID0+IGtleSBpbiBnbG9iYWwuQXJyYXkpICYmXHJcbiAgICAgICAgWydmaW5kSW5kZXgnLCAnZmluZCcsICdjb3B5V2l0aGluJ10uZXZlcnkoKGtleSkgPT4ga2V5IGluIGdsb2JhbC5BcnJheS5wcm90b3R5cGUpKTtcclxufSwgdHJ1ZSk7XHJcbmFkZCgnZXM2LWFycmF5LWZpbGwnLCAoKSA9PiB7XHJcbiAgICBpZiAoJ2ZpbGwnIGluIGdsb2JhbC5BcnJheS5wcm90b3R5cGUpIHtcclxuICAgICAgICAvKiBTb21lIHZlcnNpb25zIG9mIFNhZmFyaSBkbyBub3QgcHJvcGVybHkgaW1wbGVtZW50IHRoaXMgKi9cclxuICAgICAgICByZXR1cm4gWzFdLmZpbGwoOSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKVswXSA9PT0gMTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxufSwgdHJ1ZSk7XHJcbmFkZCgnZXM3LWFycmF5JywgKCkgPT4gJ2luY2x1ZGVzJyBpbiBnbG9iYWwuQXJyYXkucHJvdG90eXBlLCB0cnVlKTtcclxuLyogTWFwICovXHJcbmFkZCgnZXM2LW1hcCcsICgpID0+IHtcclxuICAgIGlmICh0eXBlb2YgZ2xvYmFsLk1hcCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIC8qXHJcbiAgICBJRTExIGFuZCBvbGRlciB2ZXJzaW9ucyBvZiBTYWZhcmkgYXJlIG1pc3NpbmcgY3JpdGljYWwgRVM2IE1hcCBmdW5jdGlvbmFsaXR5XHJcbiAgICBXZSB3cmFwIHRoaXMgaW4gYSB0cnkvY2F0Y2ggYmVjYXVzZSBzb21ldGltZXMgdGhlIE1hcCBjb25zdHJ1Y3RvciBleGlzdHMsIGJ1dCBkb2VzIG5vdFxyXG4gICAgdGFrZSBhcmd1bWVudHMgKGlPUyA4LjQpXHJcbiAgICAgKi9cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBtYXAgPSBuZXcgZ2xvYmFsLk1hcChbWzAsIDFdXSk7XHJcbiAgICAgICAgICAgIHJldHVybiBtYXAuaGFzKDApICYmXHJcbiAgICAgICAgICAgICAgICB0eXBlb2YgbWFwLmtleXMgPT09ICdmdW5jdGlvbicgJiZcclxuICAgICAgICAgICAgICAgIHRydWUgJiZcclxuICAgICAgICAgICAgICAgIHR5cGVvZiBtYXAudmFsdWVzID09PSAnZnVuY3Rpb24nICYmXHJcbiAgICAgICAgICAgICAgICB0eXBlb2YgbWFwLmVudHJpZXMgPT09ICdmdW5jdGlvbic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBub3QgdGVzdGluZyBvbiBpT1MgYXQgdGhlIG1vbWVudCAqL1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59LCB0cnVlKTtcclxuLyogTWF0aCAqL1xyXG5hZGQoJ2VzNi1tYXRoJywgKCkgPT4ge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgICAnY2x6MzInLFxyXG4gICAgICAgICdzaWduJyxcclxuICAgICAgICAnbG9nMTAnLFxyXG4gICAgICAgICdsb2cyJyxcclxuICAgICAgICAnbG9nMXAnLFxyXG4gICAgICAgICdleHBtMScsXHJcbiAgICAgICAgJ2Nvc2gnLFxyXG4gICAgICAgICdzaW5oJyxcclxuICAgICAgICAndGFuaCcsXHJcbiAgICAgICAgJ2Fjb3NoJyxcclxuICAgICAgICAnYXNpbmgnLFxyXG4gICAgICAgICdhdGFuaCcsXHJcbiAgICAgICAgJ3RydW5jJyxcclxuICAgICAgICAnZnJvdW5kJyxcclxuICAgICAgICAnY2JydCcsXHJcbiAgICAgICAgJ2h5cG90J1xyXG4gICAgXS5ldmVyeSgobmFtZSkgPT4gdHlwZW9mIGdsb2JhbC5NYXRoW25hbWVdID09PSAnZnVuY3Rpb24nKTtcclxufSwgdHJ1ZSk7XHJcbmFkZCgnZXM2LW1hdGgtaW11bCcsICgpID0+IHtcclxuICAgIGlmICgnaW11bCcgaW4gZ2xvYmFsLk1hdGgpIHtcclxuICAgICAgICAvKiBTb21lIHZlcnNpb25zIG9mIFNhZmFyaSBvbiBpb3MgZG8gbm90IHByb3Blcmx5IGltcGxlbWVudCB0aGlzICovXHJcbiAgICAgICAgcmV0dXJuIE1hdGguaW11bCgweGZmZmZmZmZmLCA1KSA9PT0gLTU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn0sIHRydWUpO1xyXG4vKiBPYmplY3QgKi9cclxuYWRkKCdlczYtb2JqZWN0JywgKCkgPT4ge1xyXG4gICAgcmV0dXJuIHRydWUgJiZcclxuICAgICAgICBbJ2Fzc2lnbicsICdpcycsICdnZXRPd25Qcm9wZXJ0eVN5bWJvbHMnLCAnc2V0UHJvdG90eXBlT2YnXS5ldmVyeSgobmFtZSkgPT4gdHlwZW9mIGdsb2JhbC5PYmplY3RbbmFtZV0gPT09ICdmdW5jdGlvbicpO1xyXG59LCB0cnVlKTtcclxuYWRkKCdlczIwMTctb2JqZWN0JywgKCkgPT4ge1xyXG4gICAgcmV0dXJuIFsndmFsdWVzJywgJ2VudHJpZXMnLCAnZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyddLmV2ZXJ5KChuYW1lKSA9PiB0eXBlb2YgZ2xvYmFsLk9iamVjdFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJyk7XHJcbn0sIHRydWUpO1xyXG4vKiBPYnNlcnZhYmxlICovXHJcbmFkZCgnZXMtb2JzZXJ2YWJsZScsICgpID0+IHR5cGVvZiBnbG9iYWwuT2JzZXJ2YWJsZSAhPT0gJ3VuZGVmaW5lZCcsIHRydWUpO1xyXG4vKiBQcm9taXNlICovXHJcbmFkZCgnZXM2LXByb21pc2UnLCAoKSA9PiB0eXBlb2YgZ2xvYmFsLlByb21pc2UgIT09ICd1bmRlZmluZWQnICYmIHRydWUsIHRydWUpO1xyXG4vKiBTZXQgKi9cclxuYWRkKCdlczYtc2V0JywgKCkgPT4ge1xyXG4gICAgaWYgKHR5cGVvZiBnbG9iYWwuU2V0ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgLyogSUUxMSBhbmQgb2xkZXIgdmVyc2lvbnMgb2YgU2FmYXJpIGFyZSBtaXNzaW5nIGNyaXRpY2FsIEVTNiBTZXQgZnVuY3Rpb25hbGl0eSAqL1xyXG4gICAgICAgIGNvbnN0IHNldCA9IG5ldyBnbG9iYWwuU2V0KFsxXSk7XHJcbiAgICAgICAgcmV0dXJuIHNldC5oYXMoMSkgJiYgJ2tleXMnIGluIHNldCAmJiB0eXBlb2Ygc2V0LmtleXMgPT09ICdmdW5jdGlvbicgJiYgdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxufSwgdHJ1ZSk7XHJcbi8qIFN0cmluZyAqL1xyXG5hZGQoJ2VzNi1zdHJpbmcnLCAoKSA9PiB7XHJcbiAgICByZXR1cm4gKFtcclxuICAgICAgICAvKiBzdGF0aWMgbWV0aG9kcyAqL1xyXG4gICAgICAgICdmcm9tQ29kZVBvaW50J1xyXG4gICAgXS5ldmVyeSgoa2V5KSA9PiB0eXBlb2YgZ2xvYmFsLlN0cmluZ1trZXldID09PSAnZnVuY3Rpb24nKSAmJlxyXG4gICAgICAgIFtcclxuICAgICAgICAgICAgLyogaW5zdGFuY2UgbWV0aG9kcyAqL1xyXG4gICAgICAgICAgICAnY29kZVBvaW50QXQnLFxyXG4gICAgICAgICAgICAnbm9ybWFsaXplJyxcclxuICAgICAgICAgICAgJ3JlcGVhdCcsXHJcbiAgICAgICAgICAgICdzdGFydHNXaXRoJyxcclxuICAgICAgICAgICAgJ2VuZHNXaXRoJyxcclxuICAgICAgICAgICAgJ2luY2x1ZGVzJ1xyXG4gICAgICAgIF0uZXZlcnkoKGtleSkgPT4gdHlwZW9mIGdsb2JhbC5TdHJpbmcucHJvdG90eXBlW2tleV0gPT09ICdmdW5jdGlvbicpKTtcclxufSwgdHJ1ZSk7XHJcbmFkZCgnZXM2LXN0cmluZy1yYXcnLCAoKSA9PiB7XHJcbiAgICBmdW5jdGlvbiBnZXRDYWxsU2l0ZShjYWxsU2l0ZSwgLi4uc3Vic3RpdHV0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5jYWxsU2l0ZV07XHJcbiAgICAgICAgcmVzdWx0LnJhdyA9IGNhbGxTaXRlLnJhdztcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgaWYgKCdyYXcnIGluIGdsb2JhbC5TdHJpbmcpIHtcclxuICAgICAgICBsZXQgYiA9IDE7XHJcbiAgICAgICAgbGV0IGNhbGxTaXRlID0gZ2V0Q2FsbFNpdGUgYGFcXG4ke2J9YDtcclxuICAgICAgICBjYWxsU2l0ZS5yYXcgPSBbJ2FcXFxcbiddO1xyXG4gICAgICAgIGNvbnN0IHN1cHBvcnRzVHJ1bmMgPSBnbG9iYWwuU3RyaW5nLnJhdyhjYWxsU2l0ZSwgNDIpID09PSAnYTpcXFxcbic7XHJcbiAgICAgICAgcmV0dXJuIHN1cHBvcnRzVHJ1bmM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn0sIHRydWUpO1xyXG5hZGQoJ2VzMjAxNy1zdHJpbmcnLCAoKSA9PiB7XHJcbiAgICByZXR1cm4gWydwYWRTdGFydCcsICdwYWRFbmQnXS5ldmVyeSgoa2V5KSA9PiB0eXBlb2YgZ2xvYmFsLlN0cmluZy5wcm90b3R5cGVba2V5XSA9PT0gJ2Z1bmN0aW9uJyk7XHJcbn0sIHRydWUpO1xyXG4vKiBTeW1ib2wgKi9cclxuYWRkKCdlczYtc3ltYm9sJywgKCkgPT4gdHlwZW9mIGdsb2JhbC5TeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBTeW1ib2woKSA9PT0gJ3N5bWJvbCcsIHRydWUpO1xyXG4vKiBXZWFrTWFwICovXHJcbmFkZCgnZXM2LXdlYWttYXAnLCAoKSA9PiB7XHJcbiAgICBpZiAodHlwZW9mIGdsb2JhbC5XZWFrTWFwICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIC8qIElFMTEgYW5kIG9sZGVyIHZlcnNpb25zIG9mIFNhZmFyaSBhcmUgbWlzc2luZyBjcml0aWNhbCBFUzYgTWFwIGZ1bmN0aW9uYWxpdHkgKi9cclxuICAgICAgICBjb25zdCBrZXkxID0ge307XHJcbiAgICAgICAgY29uc3Qga2V5MiA9IHt9O1xyXG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBnbG9iYWwuV2Vha01hcChbW2tleTEsIDFdXSk7XHJcbiAgICAgICAgT2JqZWN0LmZyZWV6ZShrZXkxKTtcclxuICAgICAgICByZXR1cm4gbWFwLmdldChrZXkxKSA9PT0gMSAmJiBtYXAuc2V0KGtleTIsIDIpID09PSBtYXAgJiYgdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxufSwgdHJ1ZSk7XHJcbi8qIE1pc2NlbGxhbmVvdXMgZmVhdHVyZXMgKi9cclxuYWRkKCdtaWNyb3Rhc2tzJywgKCkgPT4gdHJ1ZSB8fCBmYWxzZSB8fCB0cnVlLCB0cnVlKTtcclxuYWRkKCdwb3N0bWVzc2FnZScsICgpID0+IHtcclxuICAgIC8vIElmIHdpbmRvdyBpcyB1bmRlZmluZWQsIGFuZCB3ZSBoYXZlIHBvc3RNZXNzYWdlLCBpdCBwcm9iYWJseSBtZWFucyB3ZSdyZSBpbiBhIHdlYiB3b3JrZXIuIFdlYiB3b3JrZXJzIGhhdmVcclxuICAgIC8vIHBvc3QgbWVzc2FnZSBidXQgaXQgZG9lc24ndCB3b3JrIGhvdyB3ZSBleHBlY3QgaXQgdG8sIHNvIGl0J3MgYmVzdCBqdXN0IHRvIHByZXRlbmQgaXQgZG9lc24ndCBleGlzdC5cclxuICAgIHJldHVybiB0eXBlb2YgZ2xvYmFsLndpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGdsb2JhbC5wb3N0TWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJztcclxufSwgdHJ1ZSk7XHJcbmFkZCgncmFmJywgKCkgPT4gdHlwZW9mIGdsb2JhbC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbicsIHRydWUpO1xyXG5hZGQoJ3NldGltbWVkaWF0ZScsICgpID0+IHR5cGVvZiBnbG9iYWwuc2V0SW1tZWRpYXRlICE9PSAndW5kZWZpbmVkJywgdHJ1ZSk7XHJcbi8qIERPTSBGZWF0dXJlcyAqL1xyXG5hZGQoJ2RvbS1tdXRhdGlvbm9ic2VydmVyJywgKCkgPT4ge1xyXG4gICAgaWYgKHRydWUgJiYgQm9vbGVhbihnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcikpIHtcclxuICAgICAgICAvLyBJRTExIGhhcyBhbiB1bnJlbGlhYmxlIE11dGF0aW9uT2JzZXJ2ZXIgaW1wbGVtZW50YXRpb24gd2hlcmUgc2V0UHJvcGVydHkoKSBkb2VzIG5vdFxyXG4gICAgICAgIC8vIGdlbmVyYXRlIGEgbXV0YXRpb24gZXZlbnQsIG9ic2VydmVycyBjYW4gY3Jhc2gsIGFuZCB0aGUgcXVldWUgZG9lcyBub3QgZHJhaW5cclxuICAgICAgICAvLyByZWxpYWJseS4gVGhlIGZvbGxvd2luZyBmZWF0dXJlIHRlc3Qgd2FzIGFkYXB0ZWQgZnJvbVxyXG4gICAgICAgIC8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3QxMGtvLzRhY2ViOGM3MTY4MWZkYjI3NWUzM2VmZTVlNTc2YjE0XHJcbiAgICAgICAgY29uc3QgZXhhbXBsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lICovXHJcbiAgICAgICAgY29uc3QgSG9zdE11dGF0aW9uT2JzZXJ2ZXIgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcclxuICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBIb3N0TXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAoKSB7IH0pO1xyXG4gICAgICAgIG9ic2VydmVyLm9ic2VydmUoZXhhbXBsZSwgeyBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xyXG4gICAgICAgIGV4YW1wbGUuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCAnYmxvY2snKTtcclxuICAgICAgICByZXR1cm4gQm9vbGVhbihvYnNlcnZlci50YWtlUmVjb3JkcygpLmxlbmd0aCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn0sIHRydWUpO1xyXG5hZGQoJ2RvbS13ZWJhbmltYXRpb24nLCAoKSA9PiB0cnVlICYmIGdsb2JhbC5BbmltYXRpb24gIT09IHVuZGVmaW5lZCAmJiBnbG9iYWwuS2V5ZnJhbWVFZmZlY3QgIT09IHVuZGVmaW5lZCwgdHJ1ZSk7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhcy5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vc3VwcG9ydC9oYXMubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9zdXBwb3J0L2hhcy5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IGdsb2JhbCBmcm9tICcuLi9nbG9iYWwnO1xyXG5pbXBvcnQgaGFzIGZyb20gJy4vaGFzJztcclxuZnVuY3Rpb24gZXhlY3V0ZVRhc2soaXRlbSkge1xyXG4gICAgaWYgKGl0ZW0gJiYgaXRlbS5pc0FjdGl2ZSAmJiBpdGVtLmNhbGxiYWNrKSB7XHJcbiAgICAgICAgaXRlbS5jYWxsYmFjaygpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGdldFF1ZXVlSGFuZGxlKGl0ZW0sIGRlc3RydWN0b3IpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7IH07XHJcbiAgICAgICAgICAgIGl0ZW0uaXNBY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgaXRlbS5jYWxsYmFjayA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmIChkZXN0cnVjdG9yKSB7XHJcbiAgICAgICAgICAgICAgICBkZXN0cnVjdG9yKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcbmxldCBjaGVja01pY3JvVGFza1F1ZXVlO1xyXG5sZXQgbWljcm9UYXNrcztcclxuLyoqXHJcbiAqIFNjaGVkdWxlcyBhIGNhbGxiYWNrIHRvIHRoZSBtYWNyb3Rhc2sgcXVldWUuXHJcbiAqXHJcbiAqIEBwYXJhbSBjYWxsYmFjayB0aGUgZnVuY3Rpb24gdG8gYmUgcXVldWVkIGFuZCBsYXRlciBleGVjdXRlZC5cclxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggYSBgZGVzdHJveWAgbWV0aG9kIHRoYXQsIHdoZW4gY2FsbGVkLCBwcmV2ZW50cyB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmcm9tIGV4ZWN1dGluZy5cclxuICovXHJcbmV4cG9ydCBjb25zdCBxdWV1ZVRhc2sgPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgbGV0IGRlc3RydWN0b3I7XHJcbiAgICBsZXQgZW5xdWV1ZTtcclxuICAgIC8vIFNpbmNlIHRoZSBJRSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0SW1tZWRpYXRlYCBpcyBub3QgZmxhd2xlc3MsIHdlIHdpbGwgdGVzdCBmb3IgYHBvc3RNZXNzYWdlYCBmaXJzdC5cclxuICAgIGlmICh0cnVlKSB7XHJcbiAgICAgICAgY29uc3QgcXVldWUgPSBbXTtcclxuICAgICAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAvLyBDb25maXJtIHRoYXQgdGhlIGV2ZW50IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIGN1cnJlbnQgd2luZG93IGFuZCBieSB0aGlzIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24uXHJcbiAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2UgPT09IGdsb2JhbCAmJiBldmVudC5kYXRhID09PSAnZG9qby1xdWV1ZS1tZXNzYWdlJykge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocXVldWUubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVRhc2socXVldWUuc2hpZnQoKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBlbnF1ZXVlID0gZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgcXVldWUucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKCdkb2pvLXF1ZXVlLW1lc3NhZ2UnLCAnKicpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChmYWxzZSkge1xyXG4gICAgICAgIGRlc3RydWN0b3IgPSBnbG9iYWwuY2xlYXJJbW1lZGlhdGU7XHJcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzZXRJbW1lZGlhdGUoZXhlY3V0ZVRhc2suYmluZChudWxsLCBpdGVtKSk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGRlc3RydWN0b3IgPSBnbG9iYWwuY2xlYXJUaW1lb3V0O1xyXG4gICAgICAgIGVucXVldWUgPSBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gc2V0VGltZW91dChleGVjdXRlVGFzay5iaW5kKG51bGwsIGl0ZW0pLCAwKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcXVldWVUYXNrKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHtcclxuICAgICAgICAgICAgaXNBY3RpdmU6IHRydWUsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgaWQgPSBlbnF1ZXVlKGl0ZW0pO1xyXG4gICAgICAgIHJldHVybiBnZXRRdWV1ZUhhbmRsZShpdGVtLCBkZXN0cnVjdG9yICYmXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGRlc3RydWN0b3IoaWQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vIFRPRE86IFVzZSBhc3BlY3QuYmVmb3JlIHdoZW4gaXQgaXMgYXZhaWxhYmxlLlxyXG4gICAgcmV0dXJuIHRydWVcclxuICAgICAgICA/IHF1ZXVlVGFza1xyXG4gICAgICAgIDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIGNoZWNrTWljcm9UYXNrUXVldWUoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlVGFzayhjYWxsYmFjayk7XHJcbiAgICAgICAgfTtcclxufSkoKTtcclxuLy8gV2hlbiBubyBtZWNoYW5pc20gZm9yIHJlZ2lzdGVyaW5nIG1pY3JvdGFza3MgaXMgZXhwb3NlZCBieSB0aGUgZW52aXJvbm1lbnQsIG1pY3JvdGFza3Mgd2lsbFxyXG4vLyBiZSBxdWV1ZWQgYW5kIHRoZW4gZXhlY3V0ZWQgaW4gYSBzaW5nbGUgbWFjcm90YXNrIGJlZm9yZSB0aGUgb3RoZXIgbWFjcm90YXNrcyBhcmUgZXhlY3V0ZWQuXHJcbmlmICghdHJ1ZSkge1xyXG4gICAgbGV0IGlzTWljcm9UYXNrUXVldWVkID0gZmFsc2U7XHJcbiAgICBtaWNyb1Rhc2tzID0gW107XHJcbiAgICBjaGVja01pY3JvVGFza1F1ZXVlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICghaXNNaWNyb1Rhc2tRdWV1ZWQpIHtcclxuICAgICAgICAgICAgaXNNaWNyb1Rhc2tRdWV1ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBxdWV1ZVRhc2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaXNNaWNyb1Rhc2tRdWV1ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGlmIChtaWNyb1Rhc2tzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICgoaXRlbSA9IG1pY3JvVGFza3Muc2hpZnQoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVRhc2soaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcbi8qKlxyXG4gKiBTY2hlZHVsZXMgYW4gYW5pbWF0aW9uIHRhc2sgd2l0aCBgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZWAgaWYgaXQgZXhpc3RzLCBvciB3aXRoIGBxdWV1ZVRhc2tgIG90aGVyd2lzZS5cclxuICpcclxuICogU2luY2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lJ3MgYmVoYXZpb3IgZG9lcyBub3QgbWF0Y2ggdGhhdCBleHBlY3RlZCBmcm9tIGBxdWV1ZVRhc2tgLCBpdCBpcyBub3QgdXNlZCB0aGVyZS5cclxuICogSG93ZXZlciwgYXQgdGltZXMgaXQgbWFrZXMgbW9yZSBzZW5zZSB0byBkZWxlZ2F0ZSB0byByZXF1ZXN0QW5pbWF0aW9uRnJhbWU7IGhlbmNlIHRoZSBmb2xsb3dpbmcgbWV0aG9kLlxyXG4gKlxyXG4gKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGJlIHF1ZXVlZCBhbmQgbGF0ZXIgZXhlY3V0ZWQuXHJcbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIGEgYGRlc3Ryb3lgIG1ldGhvZCB0aGF0LCB3aGVuIGNhbGxlZCwgcHJldmVudHMgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnJvbSBleGVjdXRpbmcuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcXVldWVBbmltYXRpb25UYXNrID0gKGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICghdHJ1ZSkge1xyXG4gICAgICAgIHJldHVybiBxdWV1ZVRhc2s7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBxdWV1ZUFuaW1hdGlvblRhc2soY2FsbGJhY2spIHtcclxuICAgICAgICBjb25zdCBpdGVtID0ge1xyXG4gICAgICAgICAgICBpc0FjdGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCByYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShleGVjdXRlVGFzay5iaW5kKG51bGwsIGl0ZW0pKTtcclxuICAgICAgICByZXR1cm4gZ2V0UXVldWVIYW5kbGUoaXRlbSwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShyYWZJZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvLyBUT0RPOiBVc2UgYXNwZWN0LmJlZm9yZSB3aGVuIGl0IGlzIGF2YWlsYWJsZS5cclxuICAgIHJldHVybiB0cnVlXHJcbiAgICAgICAgPyBxdWV1ZUFuaW1hdGlvblRhc2tcclxuICAgICAgICA6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xyXG4gICAgICAgICAgICBjaGVja01pY3JvVGFza1F1ZXVlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZUFuaW1hdGlvblRhc2soY2FsbGJhY2spO1xyXG4gICAgICAgIH07XHJcbn0pKCk7XHJcbi8qKlxyXG4gKiBTY2hlZHVsZXMgYSBjYWxsYmFjayB0byB0aGUgbWljcm90YXNrIHF1ZXVlLlxyXG4gKlxyXG4gKiBBbnkgY2FsbGJhY2tzIHJlZ2lzdGVyZWQgd2l0aCBgcXVldWVNaWNyb1Rhc2tgIHdpbGwgYmUgZXhlY3V0ZWQgYmVmb3JlIHRoZSBuZXh0IG1hY3JvdGFzay4gSWYgbm8gbmF0aXZlXHJcbiAqIG1lY2hhbmlzbSBmb3Igc2NoZWR1bGluZyBtYWNyb3Rhc2tzIGlzIGV4cG9zZWQsIHRoZW4gYW55IGNhbGxiYWNrcyB3aWxsIGJlIGZpcmVkIGJlZm9yZSBhbnkgbWFjcm90YXNrXHJcbiAqIHJlZ2lzdGVyZWQgd2l0aCBgcXVldWVUYXNrYCBvciBgcXVldWVBbmltYXRpb25UYXNrYC5cclxuICpcclxuICogQHBhcmFtIGNhbGxiYWNrIHRoZSBmdW5jdGlvbiB0byBiZSBxdWV1ZWQgYW5kIGxhdGVyIGV4ZWN1dGVkLlxyXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBhIGBkZXN0cm95YCBtZXRob2QgdGhhdCwgd2hlbiBjYWxsZWQsIHByZXZlbnRzIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZyb20gZXhlY3V0aW5nLlxyXG4gKi9cclxuZXhwb3J0IGxldCBxdWV1ZU1pY3JvVGFzayA9IChmdW5jdGlvbiAoKSB7XHJcbiAgICBsZXQgZW5xdWV1ZTtcclxuICAgIGlmIChmYWxzZSkge1xyXG4gICAgICAgIGVucXVldWUgPSBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICBnbG9iYWwucHJvY2Vzcy5uZXh0VGljayhleGVjdXRlVGFzay5iaW5kKG51bGwsIGl0ZW0pKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodHJ1ZSkge1xyXG4gICAgICAgIGVucXVldWUgPSBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICBnbG9iYWwuUHJvbWlzZS5yZXNvbHZlKGl0ZW0pLnRoZW4oZXhlY3V0ZVRhc2spO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0cnVlKSB7XHJcbiAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWUgKi9cclxuICAgICAgICBjb25zdCBIb3N0TXV0YXRpb25PYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xyXG4gICAgICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBjb25zdCBxdWV1ZSA9IFtdO1xyXG4gICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEhvc3RNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBxdWV1ZS5zaGlmdCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5pc0FjdGl2ZSAmJiBpdGVtLmNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5jYWxsYmFjaygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShub2RlLCB7IGF0dHJpYnV0ZXM6IHRydWUgfSk7XHJcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgIHF1ZXVlLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCdxdWV1ZVN0YXR1cycsICcxJyk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGVucXVldWUgPSBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICBjaGVja01pY3JvVGFza1F1ZXVlKCk7XHJcbiAgICAgICAgICAgIG1pY3JvVGFza3MucHVzaChpdGVtKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChjYWxsYmFjaykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB7XHJcbiAgICAgICAgICAgIGlzQWN0aXZlOiB0cnVlLFxyXG4gICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2tcclxuICAgICAgICB9O1xyXG4gICAgICAgIGVucXVldWUoaXRlbSk7XHJcbiAgICAgICAgcmV0dXJuIGdldFF1ZXVlSGFuZGxlKGl0ZW0pO1xyXG4gICAgfTtcclxufSkoKTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVldWUubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL3N1cHBvcnQvcXVldWUubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9zdXBwb3J0L3F1ZXVlLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCIvKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBnZW5lcmF0ZSBhIHZhbHVlIHByb3BlcnR5IGRlc2NyaXB0b3JcbiAqXG4gKiBAcGFyYW0gdmFsdWUgICAgICAgIFRoZSB2YWx1ZSB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciBzaG91bGQgYmUgc2V0IHRvXG4gKiBAcGFyYW0gZW51bWVyYWJsZSAgIElmIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgZW51bWJlcmFibGUsIGRlZmF1bHRzIHRvIGZhbHNlXG4gKiBAcGFyYW0gd3JpdGFibGUgICAgIElmIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgd3JpdGFibGUsIGRlZmF1bHRzIHRvIHRydWVcbiAqIEBwYXJhbSBjb25maWd1cmFibGUgSWYgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBjb25maWd1cmFibGUsIGRlZmF1bHRzIHRvIHRydWVcbiAqIEByZXR1cm4gICAgICAgICAgICAgVGhlIHByb3BlcnR5IGRlc2NyaXB0b3Igb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZURlc2NyaXB0b3IodmFsdWUsIGVudW1lcmFibGUgPSBmYWxzZSwgd3JpdGFibGUgPSB0cnVlLCBjb25maWd1cmFibGUgPSB0cnVlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBlbnVtZXJhYmxlOiBlbnVtZXJhYmxlLFxuICAgICAgICB3cml0YWJsZTogd3JpdGFibGUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogY29uZmlndXJhYmxlXG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3cmFwTmF0aXZlKG5hdGl2ZUZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZUZ1bmN0aW9uLmFwcGx5KHRhcmdldCwgYXJncyk7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWwubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL3N1cHBvcnQvdXRpbC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL3N1cHBvcnQvdXRpbC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IHsgRXZlbnRlZCB9IGZyb20gJy4uL2NvcmUvRXZlbnRlZCc7XG5leHBvcnQgY2xhc3MgSW5qZWN0b3IgZXh0ZW5kcyBFdmVudGVkIHtcbiAgICBjb25zdHJ1Y3RvcihwYXlsb2FkKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX3BheWxvYWQgPSBwYXlsb2FkO1xuICAgIH1cbiAgICBzZXRJbnZhbGlkYXRvcihpbnZhbGlkYXRvcikge1xuICAgICAgICB0aGlzLl9pbnZhbGlkYXRvciA9IGludmFsaWRhdG9yO1xuICAgIH1cbiAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXlsb2FkO1xuICAgIH1cbiAgICBzZXQocGF5bG9hZCkge1xuICAgICAgICB0aGlzLl9wYXlsb2FkID0gcGF5bG9hZDtcbiAgICAgICAgaWYgKHRoaXMuX2ludmFsaWRhdG9yKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRvcigpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgSW5qZWN0b3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JbmplY3Rvci5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL0luamVjdG9yLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL0luamVjdG9yLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgeyBFdmVudGVkIH0gZnJvbSAnLi4vY29yZS9FdmVudGVkJztcclxuaW1wb3J0IE1hcCBmcm9tICcuLi9zaGltL01hcCc7XHJcbi8qKlxyXG4gKiBFbnVtIHRvIGlkZW50aWZ5IHRoZSB0eXBlIG9mIGV2ZW50LlxyXG4gKiBMaXN0ZW5pbmcgdG8gJ1Byb2plY3Rvcicgd2lsbCBub3RpZnkgd2hlbiBwcm9qZWN0b3IgaXMgY3JlYXRlZCBvciB1cGRhdGVkXHJcbiAqIExpc3RlbmluZyB0byAnV2lkZ2V0JyB3aWxsIG5vdGlmeSB3aGVuIHdpZGdldCByb290IGlzIGNyZWF0ZWQgb3IgdXBkYXRlZFxyXG4gKi9cclxuZXhwb3J0IHZhciBOb2RlRXZlbnRUeXBlO1xyXG4oZnVuY3Rpb24gKE5vZGVFdmVudFR5cGUpIHtcclxuICAgIE5vZGVFdmVudFR5cGVbXCJQcm9qZWN0b3JcIl0gPSBcIlByb2plY3RvclwiO1xyXG4gICAgTm9kZUV2ZW50VHlwZVtcIldpZGdldFwiXSA9IFwiV2lkZ2V0XCI7XHJcbn0pKE5vZGVFdmVudFR5cGUgfHwgKE5vZGVFdmVudFR5cGUgPSB7fSkpO1xyXG5leHBvcnQgY2xhc3MgTm9kZUhhbmRsZXIgZXh0ZW5kcyBFdmVudGVkIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5fbm9kZU1hcCA9IG5ldyBNYXAoKTtcclxuICAgIH1cclxuICAgIGdldChrZXkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbm9kZU1hcC5nZXQoa2V5KTtcclxuICAgIH1cclxuICAgIGhhcyhrZXkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbm9kZU1hcC5oYXMoa2V5KTtcclxuICAgIH1cclxuICAgIGFkZChlbGVtZW50LCBrZXkpIHtcclxuICAgICAgICB0aGlzLl9ub2RlTWFwLnNldChrZXksIGVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuZW1pdCh7IHR5cGU6IGtleSB9KTtcclxuICAgIH1cclxuICAgIGFkZFJvb3QoKSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KHsgdHlwZTogTm9kZUV2ZW50VHlwZS5XaWRnZXQgfSk7XHJcbiAgICB9XHJcbiAgICBhZGRQcm9qZWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KHsgdHlwZTogTm9kZUV2ZW50VHlwZS5Qcm9qZWN0b3IgfSk7XHJcbiAgICB9XHJcbiAgICBjbGVhcigpIHtcclxuICAgICAgICB0aGlzLl9ub2RlTWFwLmNsZWFyKCk7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgTm9kZUhhbmRsZXI7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vZGVIYW5kbGVyLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvTm9kZUhhbmRsZXIubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvTm9kZUhhbmRsZXIubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCBQcm9taXNlIGZyb20gJy4uL3NoaW0vUHJvbWlzZSc7XHJcbmltcG9ydCBNYXAgZnJvbSAnLi4vc2hpbS9NYXAnO1xyXG5pbXBvcnQgU3ltYm9sIGZyb20gJy4uL3NoaW0vU3ltYm9sJztcclxuaW1wb3J0IHsgRXZlbnRlZCB9IGZyb20gJy4uL2NvcmUvRXZlbnRlZCc7XHJcbi8qKlxyXG4gKiBXaWRnZXQgYmFzZSBzeW1ib2wgdHlwZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFdJREdFVF9CQVNFX1RZUEUgPSBTeW1ib2woJ1dpZGdldCBCYXNlJyk7XHJcbi8qKlxyXG4gKiBDaGVja3MgaXMgdGhlIGl0ZW0gaXMgYSBzdWJjbGFzcyBvZiBXaWRnZXRCYXNlIChvciBhIFdpZGdldEJhc2UpXHJcbiAqXHJcbiAqIEBwYXJhbSBpdGVtIHRoZSBpdGVtIHRvIGNoZWNrXHJcbiAqIEByZXR1cm5zIHRydWUvZmFsc2UgaW5kaWNhdGluZyBpZiB0aGUgaXRlbSBpcyBhIFdpZGdldEJhc2VDb25zdHJ1Y3RvclxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yKGl0ZW0pIHtcclxuICAgIHJldHVybiBCb29sZWFuKGl0ZW0gJiYgaXRlbS5fdHlwZSA9PT0gV0lER0VUX0JBU0VfVFlQRSk7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGlzV2lkZ2V0Q29uc3RydWN0b3JEZWZhdWx0RXhwb3J0KGl0ZW0pIHtcclxuICAgIHJldHVybiBCb29sZWFuKGl0ZW0gJiZcclxuICAgICAgICBpdGVtLmhhc093blByb3BlcnR5KCdfX2VzTW9kdWxlJykgJiZcclxuICAgICAgICBpdGVtLmhhc093blByb3BlcnR5KCdkZWZhdWx0JykgJiZcclxuICAgICAgICBpc1dpZGdldEJhc2VDb25zdHJ1Y3RvcihpdGVtLmRlZmF1bHQpKTtcclxufVxyXG4vKipcclxuICogVGhlIFJlZ2lzdHJ5IGltcGxlbWVudGF0aW9uXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUmVnaXN0cnkgZXh0ZW5kcyBFdmVudGVkIHtcclxuICAgIC8qKlxyXG4gICAgICogRW1pdCBsb2FkZWQgZXZlbnQgZm9yIHJlZ2lzdHJ5IGxhYmVsXHJcbiAgICAgKi9cclxuICAgIGVtaXRMb2FkZWRFdmVudCh3aWRnZXRMYWJlbCwgaXRlbSkge1xyXG4gICAgICAgIHRoaXMuZW1pdCh7XHJcbiAgICAgICAgICAgIHR5cGU6IHdpZGdldExhYmVsLFxyXG4gICAgICAgICAgICBhY3Rpb246ICdsb2FkZWQnLFxyXG4gICAgICAgICAgICBpdGVtXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBkZWZpbmUobGFiZWwsIGl0ZW0pIHtcclxuICAgICAgICBpZiAodGhpcy5fd2lkZ2V0UmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLl93aWRnZXRSZWdpc3RyeSA9IG5ldyBNYXAoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX3dpZGdldFJlZ2lzdHJ5LmhhcyhsYWJlbCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB3aWRnZXQgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIGZvciAnJHtsYWJlbC50b1N0cmluZygpfSdgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fd2lkZ2V0UmVnaXN0cnkuc2V0KGxhYmVsLCBpdGVtKTtcclxuICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgICAgaXRlbS50aGVuKCh3aWRnZXRDdG9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl93aWRnZXRSZWdpc3RyeS5zZXQobGFiZWwsIHdpZGdldEN0b3IpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0TG9hZGVkRXZlbnQobGFiZWwsIHdpZGdldEN0b3IpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpZGdldEN0b3I7XHJcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChpc1dpZGdldEJhc2VDb25zdHJ1Y3RvcihpdGVtKSkge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRMb2FkZWRFdmVudChsYWJlbCwgaXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZGVmaW5lSW5qZWN0b3IobGFiZWwsIGluamVjdG9yRmFjdG9yeSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9pbmplY3RvclJlZ2lzdHJ5ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5faW5qZWN0b3JSZWdpc3RyeSA9IG5ldyBNYXAoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2luamVjdG9yUmVnaXN0cnkuaGFzKGxhYmVsKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGluamVjdG9yIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBmb3IgJyR7bGFiZWwudG9TdHJpbmcoKX0nYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGludmFsaWRhdG9yID0gbmV3IEV2ZW50ZWQoKTtcclxuICAgICAgICBjb25zdCBpbmplY3Rvckl0ZW0gPSB7XHJcbiAgICAgICAgICAgIGluamVjdG9yOiBpbmplY3RvckZhY3RvcnkoKCkgPT4gaW52YWxpZGF0b3IuZW1pdCh7IHR5cGU6ICdpbnZhbGlkYXRlJyB9KSksXHJcbiAgICAgICAgICAgIGludmFsaWRhdG9yXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9pbmplY3RvclJlZ2lzdHJ5LnNldChsYWJlbCwgaW5qZWN0b3JJdGVtKTtcclxuICAgICAgICB0aGlzLmVtaXRMb2FkZWRFdmVudChsYWJlbCwgaW5qZWN0b3JJdGVtKTtcclxuICAgIH1cclxuICAgIGdldChsYWJlbCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fd2lkZ2V0UmVnaXN0cnkgfHwgIXRoaXMuaGFzKGxhYmVsKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX3dpZGdldFJlZ2lzdHJ5LmdldChsYWJlbCk7XHJcbiAgICAgICAgaWYgKGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBpdGVtKCk7XHJcbiAgICAgICAgdGhpcy5fd2lkZ2V0UmVnaXN0cnkuc2V0KGxhYmVsLCBwcm9taXNlKTtcclxuICAgICAgICBwcm9taXNlLnRoZW4oKHdpZGdldEN0b3IpID0+IHtcclxuICAgICAgICAgICAgaWYgKGlzV2lkZ2V0Q29uc3RydWN0b3JEZWZhdWx0RXhwb3J0KHdpZGdldEN0b3IpKSB7XHJcbiAgICAgICAgICAgICAgICB3aWRnZXRDdG9yID0gd2lkZ2V0Q3Rvci5kZWZhdWx0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3dpZGdldFJlZ2lzdHJ5LnNldChsYWJlbCwgd2lkZ2V0Q3Rvcik7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdExvYWRlZEV2ZW50KGxhYmVsLCB3aWRnZXRDdG9yKTtcclxuICAgICAgICAgICAgcmV0dXJuIHdpZGdldEN0b3I7XHJcbiAgICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgZ2V0SW5qZWN0b3IobGFiZWwpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2luamVjdG9yUmVnaXN0cnkgfHwgIXRoaXMuaGFzSW5qZWN0b3IobGFiZWwpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5faW5qZWN0b3JSZWdpc3RyeS5nZXQobGFiZWwpO1xyXG4gICAgfVxyXG4gICAgaGFzKGxhYmVsKSB7XHJcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5fd2lkZ2V0UmVnaXN0cnkgJiYgdGhpcy5fd2lkZ2V0UmVnaXN0cnkuaGFzKGxhYmVsKSk7XHJcbiAgICB9XHJcbiAgICBoYXNJbmplY3RvcihsYWJlbCkge1xyXG4gICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuX2luamVjdG9yUmVnaXN0cnkgJiYgdGhpcy5faW5qZWN0b3JSZWdpc3RyeS5oYXMobGFiZWwpKTtcclxuICAgIH1cclxufVxyXG5leHBvcnQgZGVmYXVsdCBSZWdpc3RyeTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVnaXN0cnkubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9SZWdpc3RyeS5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9SZWdpc3RyeS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IHsgTWFwIH0gZnJvbSAnLi4vc2hpbS9NYXAnO1xyXG5pbXBvcnQgeyBFdmVudGVkIH0gZnJvbSAnLi4vY29yZS9FdmVudGVkJztcclxuaW1wb3J0IHsgUmVnaXN0cnkgfSBmcm9tICcuL1JlZ2lzdHJ5JztcclxuZXhwb3J0IGNsYXNzIFJlZ2lzdHJ5SGFuZGxlciBleHRlbmRzIEV2ZW50ZWQge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLl9yZWdpc3RyeSA9IG5ldyBSZWdpc3RyeSgpO1xyXG4gICAgICAgIHRoaXMuX3JlZ2lzdHJ5V2lkZ2V0TGFiZWxNYXAgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgdGhpcy5fcmVnaXN0cnlJbmplY3RvckxhYmVsTWFwID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIHRoaXMub3duKHRoaXMuX3JlZ2lzdHJ5KTtcclxuICAgICAgICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5iYXNlUmVnaXN0cnkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5V2lkZ2V0TGFiZWxNYXAuZGVsZXRlKHRoaXMuYmFzZVJlZ2lzdHJ5KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5SW5qZWN0b3JMYWJlbE1hcC5kZWxldGUodGhpcy5iYXNlUmVnaXN0cnkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlUmVnaXN0cnkgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMub3duKHsgZGVzdHJveSB9KTtcclxuICAgIH1cclxuICAgIHNldCBiYXNlKGJhc2VSZWdpc3RyeSkge1xyXG4gICAgICAgIGlmICh0aGlzLmJhc2VSZWdpc3RyeSkge1xyXG4gICAgICAgICAgICB0aGlzLl9yZWdpc3RyeVdpZGdldExhYmVsTWFwLmRlbGV0ZSh0aGlzLmJhc2VSZWdpc3RyeSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5SW5qZWN0b3JMYWJlbE1hcC5kZWxldGUodGhpcy5iYXNlUmVnaXN0cnkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmJhc2VSZWdpc3RyeSA9IGJhc2VSZWdpc3RyeTtcclxuICAgIH1cclxuICAgIGRlZmluZShsYWJlbCwgd2lkZ2V0KSB7XHJcbiAgICAgICAgdGhpcy5fcmVnaXN0cnkuZGVmaW5lKGxhYmVsLCB3aWRnZXQpO1xyXG4gICAgfVxyXG4gICAgZGVmaW5lSW5qZWN0b3IobGFiZWwsIGluamVjdG9yKSB7XHJcbiAgICAgICAgdGhpcy5fcmVnaXN0cnkuZGVmaW5lSW5qZWN0b3IobGFiZWwsIGluamVjdG9yKTtcclxuICAgIH1cclxuICAgIGhhcyhsYWJlbCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9yZWdpc3RyeS5oYXMobGFiZWwpIHx8IEJvb2xlYW4odGhpcy5iYXNlUmVnaXN0cnkgJiYgdGhpcy5iYXNlUmVnaXN0cnkuaGFzKGxhYmVsKSk7XHJcbiAgICB9XHJcbiAgICBoYXNJbmplY3RvcihsYWJlbCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9yZWdpc3RyeS5oYXNJbmplY3RvcihsYWJlbCkgfHwgQm9vbGVhbih0aGlzLmJhc2VSZWdpc3RyeSAmJiB0aGlzLmJhc2VSZWdpc3RyeS5oYXNJbmplY3RvcihsYWJlbCkpO1xyXG4gICAgfVxyXG4gICAgZ2V0KGxhYmVsLCBnbG9iYWxQcmVjZWRlbmNlID0gZmFsc2UpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0KGxhYmVsLCBnbG9iYWxQcmVjZWRlbmNlLCAnZ2V0JywgdGhpcy5fcmVnaXN0cnlXaWRnZXRMYWJlbE1hcCk7XHJcbiAgICB9XHJcbiAgICBnZXRJbmplY3RvcihsYWJlbCwgZ2xvYmFsUHJlY2VkZW5jZSA9IGZhbHNlKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldChsYWJlbCwgZ2xvYmFsUHJlY2VkZW5jZSwgJ2dldEluamVjdG9yJywgdGhpcy5fcmVnaXN0cnlJbmplY3RvckxhYmVsTWFwKTtcclxuICAgIH1cclxuICAgIF9nZXQobGFiZWwsIGdsb2JhbFByZWNlZGVuY2UsIGdldEZ1bmN0aW9uTmFtZSwgbGFiZWxNYXApIHtcclxuICAgICAgICBjb25zdCByZWdpc3RyaWVzID0gZ2xvYmFsUHJlY2VkZW5jZSA/IFt0aGlzLmJhc2VSZWdpc3RyeSwgdGhpcy5fcmVnaXN0cnldIDogW3RoaXMuX3JlZ2lzdHJ5LCB0aGlzLmJhc2VSZWdpc3RyeV07XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWdpc3RyaWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gcmVnaXN0cmllc1tpXTtcclxuICAgICAgICAgICAgaWYgKCFyZWdpc3RyeSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHJlZ2lzdHJ5W2dldEZ1bmN0aW9uTmFtZV0obGFiZWwpO1xyXG4gICAgICAgICAgICBjb25zdCByZWdpc3RlcmVkTGFiZWxzID0gbGFiZWxNYXAuZ2V0KHJlZ2lzdHJ5KSB8fCBbXTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHJlZ2lzdGVyZWRMYWJlbHMuaW5kZXhPZihsYWJlbCkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSByZWdpc3RyeS5vbihsYWJlbCwgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmFjdGlvbiA9PT0gJ2xvYWRlZCcgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tnZXRGdW5jdGlvbk5hbWVdKGxhYmVsLCBnbG9iYWxQcmVjZWRlbmNlKSA9PT0gZXZlbnQuaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoeyB0eXBlOiAnaW52YWxpZGF0ZScgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm93bihoYW5kbGUpO1xyXG4gICAgICAgICAgICAgICAgbGFiZWxNYXAuc2V0KHJlZ2lzdHJ5LCBbLi4ucmVnaXN0ZXJlZExhYmVscywgbGFiZWxdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufVxyXG5leHBvcnQgZGVmYXVsdCBSZWdpc3RyeUhhbmRsZXI7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlZ2lzdHJ5SGFuZGxlci5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL1JlZ2lzdHJ5SGFuZGxlci5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9SZWdpc3RyeUhhbmRsZXIubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCBNYXAgZnJvbSAnLi4vc2hpbS9NYXAnO1xuaW1wb3J0IFdlYWtNYXAgZnJvbSAnLi4vc2hpbS9XZWFrTWFwJztcbmltcG9ydCBTeW1ib2wgZnJvbSAnLi4vc2hpbS9TeW1ib2wnO1xuaW1wb3J0IHsgdiB9IGZyb20gJy4vZCc7XG5pbXBvcnQgeyBhdXRvIH0gZnJvbSAnLi9kaWZmJztcbmltcG9ydCBSZWdpc3RyeUhhbmRsZXIgZnJvbSAnLi9SZWdpc3RyeUhhbmRsZXInO1xuaW1wb3J0IE5vZGVIYW5kbGVyIGZyb20gJy4vTm9kZUhhbmRsZXInO1xuaW1wb3J0IHsgd2lkZ2V0SW5zdGFuY2VNYXAgfSBmcm9tICcuL3Zkb20nO1xuaW1wb3J0IHsgaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IsIFdJREdFVF9CQVNFX1RZUEUgfSBmcm9tICcuL1JlZ2lzdHJ5JztcbmNvbnN0IGRlY29yYXRvck1hcCA9IG5ldyBNYXAoKTtcbmNvbnN0IGJvdW5kQXV0byA9IGF1dG8uYmluZChudWxsKTtcbmV4cG9ydCBjb25zdCBub0JpbmQgPSBTeW1ib2wuZm9yKCdkb2pvTm9CaW5kJyk7XG4vKipcbiAqIE1haW4gd2lkZ2V0IGJhc2UgZm9yIGFsbCB3aWRnZXRzIHRvIGV4dGVuZFxuICovXG5leHBvcnQgY2xhc3MgV2lkZ2V0QmFzZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgaXQgaXMgdGhlIGluaXRpYWwgc2V0IHByb3BlcnRpZXMgY3ljbGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2luaXRpYWxQcm9wZXJ0aWVzID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFycmF5IG9mIHByb3BlcnR5IGtleXMgY29uc2lkZXJlZCBjaGFuZ2VkIGZyb20gdGhlIHByZXZpb3VzIHNldCBwcm9wZXJ0aWVzXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9jaGFuZ2VkUHJvcGVydHlLZXlzID0gW107XG4gICAgICAgIHRoaXMuX25vZGVIYW5kbGVyID0gbmV3IE5vZGVIYW5kbGVyKCk7XG4gICAgICAgIHRoaXMuX2hhbmRsZXMgPSBbXTtcbiAgICAgICAgdGhpcy5fY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgdGhpcy5fZGVjb3JhdG9yQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgdGhpcy5fYm91bmRSZW5kZXJGdW5jID0gdGhpcy5yZW5kZXIuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5fYm91bmRJbnZhbGlkYXRlID0gdGhpcy5pbnZhbGlkYXRlLmJpbmQodGhpcyk7XG4gICAgICAgIHdpZGdldEluc3RhbmNlTWFwLnNldCh0aGlzLCB7XG4gICAgICAgICAgICBkaXJ0eTogdHJ1ZSxcbiAgICAgICAgICAgIG9uQXR0YWNoOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkF0dGFjaCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uRGV0YWNoOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkRldGFjaCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5vZGVIYW5kbGVyOiB0aGlzLl9ub2RlSGFuZGxlcixcbiAgICAgICAgICAgIHJlZ2lzdHJ5OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0cnk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29yZVByb3BlcnRpZXM6IHt9LFxuICAgICAgICAgICAgcmVuZGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGlucHV0UHJvcGVydGllczoge31cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3J1bkFmdGVyQ29uc3RydWN0b3JzKCk7XG4gICAgfVxuICAgIG1ldGEoTWV0YVR5cGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX21ldGFNYXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fbWV0YU1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2FjaGVkID0gdGhpcy5fbWV0YU1hcC5nZXQoTWV0YVR5cGUpO1xuICAgICAgICBpZiAoIWNhY2hlZCkge1xuICAgICAgICAgICAgY2FjaGVkID0gbmV3IE1ldGFUeXBlKHtcbiAgICAgICAgICAgICAgICBpbnZhbGlkYXRlOiB0aGlzLl9ib3VuZEludmFsaWRhdGUsXG4gICAgICAgICAgICAgICAgbm9kZUhhbmRsZXI6IHRoaXMuX25vZGVIYW5kbGVyLFxuICAgICAgICAgICAgICAgIGJpbmQ6IHRoaXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5vd24oY2FjaGVkKTtcbiAgICAgICAgICAgIHRoaXMuX21ldGFNYXAuc2V0KE1ldGFUeXBlLCBjYWNoZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIG9uQXR0YWNoKCkge1xuICAgICAgICAvLyBEbyBub3RoaW5nIGJ5IGRlZmF1bHQuXG4gICAgfVxuICAgIG9uRGV0YWNoKCkge1xuICAgICAgICAvLyBEbyBub3RoaW5nIGJ5IGRlZmF1bHQuXG4gICAgfVxuICAgIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvcGVydGllcztcbiAgICB9XG4gICAgZ2V0IGNoYW5nZWRQcm9wZXJ0eUtleXMoKSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy5fY2hhbmdlZFByb3BlcnR5S2V5c107XG4gICAgfVxuICAgIF9fc2V0Q29yZVByb3BlcnRpZXNfXyhjb3JlUHJvcGVydGllcykge1xuICAgICAgICBjb25zdCB7IGJhc2VSZWdpc3RyeSB9ID0gY29yZVByb3BlcnRpZXM7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldCh0aGlzKTtcbiAgICAgICAgaWYgKGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcy5iYXNlUmVnaXN0cnkgIT09IGJhc2VSZWdpc3RyeSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JlZ2lzdHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RyeSA9IG5ldyBSZWdpc3RyeUhhbmRsZXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeSk7XG4gICAgICAgICAgICAgICAgdGhpcy5vd24odGhpcy5fcmVnaXN0cnkub24oJ2ludmFsaWRhdGUnLCB0aGlzLl9ib3VuZEludmFsaWRhdGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5LmJhc2UgPSBiYXNlUmVnaXN0cnk7XG4gICAgICAgICAgICB0aGlzLmludmFsaWRhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZURhdGEuY29yZVByb3BlcnRpZXMgPSBjb3JlUHJvcGVydGllcztcbiAgICB9XG4gICAgX19zZXRQcm9wZXJ0aWVzX18ob3JpZ2luYWxQcm9wZXJ0aWVzKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldCh0aGlzKTtcbiAgICAgICAgaW5zdGFuY2VEYXRhLmlucHV0UHJvcGVydGllcyA9IG9yaWdpbmFsUHJvcGVydGllcztcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMuX3J1bkJlZm9yZVByb3BlcnRpZXMob3JpZ2luYWxQcm9wZXJ0aWVzKTtcbiAgICAgICAgY29uc3QgcmVnaXN0ZXJlZERpZmZQcm9wZXJ0eU5hbWVzID0gdGhpcy5nZXREZWNvcmF0b3IoJ3JlZ2lzdGVyZWREaWZmUHJvcGVydHknKTtcbiAgICAgICAgY29uc3QgY2hhbmdlZFByb3BlcnR5S2V5cyA9IFtdO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWVzID0gT2JqZWN0LmtleXMocHJvcGVydGllcyk7XG4gICAgICAgIGlmICh0aGlzLl9pbml0aWFsUHJvcGVydGllcyA9PT0gZmFsc2UgfHwgcmVnaXN0ZXJlZERpZmZQcm9wZXJ0eU5hbWVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgY29uc3QgYWxsUHJvcGVydGllcyA9IFsuLi5wcm9wZXJ0eU5hbWVzLCAuLi5PYmplY3Qua2V5cyh0aGlzLl9wcm9wZXJ0aWVzKV07XG4gICAgICAgICAgICBjb25zdCBjaGVja2VkUHJvcGVydGllcyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgZGlmZlByb3BlcnR5UmVzdWx0cyA9IHt9O1xuICAgICAgICAgICAgbGV0IHJ1blJlYWN0aW9ucyA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gYWxsUHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZFByb3BlcnRpZXMuaW5kZXhPZihwcm9wZXJ0eU5hbWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hlY2tlZFByb3BlcnRpZXMucHVzaChwcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzUHJvcGVydHkgPSB0aGlzLl9wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3UHJvcGVydHkgPSB0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eShwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0sIGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcy5iaW5kKTtcbiAgICAgICAgICAgICAgICBpZiAocmVnaXN0ZXJlZERpZmZQcm9wZXJ0eU5hbWVzLmluZGV4T2YocHJvcGVydHlOYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVuUmVhY3Rpb25zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlmZkZ1bmN0aW9ucyA9IHRoaXMuZ2V0RGVjb3JhdG9yKGBkaWZmUHJvcGVydHk6JHtwcm9wZXJ0eU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZkZ1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGlmZkZ1bmN0aW9uc1tpXShwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmNoYW5nZWQgJiYgY2hhbmdlZFByb3BlcnR5S2V5cy5pbmRleE9mKHByb3BlcnR5TmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFByb3BlcnR5S2V5cy5wdXNoKHByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lIGluIHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmUHJvcGVydHlSZXN1bHRzW3Byb3BlcnR5TmFtZV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGJvdW5kQXV0byhwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuY2hhbmdlZCAmJiBjaGFuZ2VkUHJvcGVydHlLZXlzLmluZGV4T2YocHJvcGVydHlOYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRQcm9wZXJ0eUtleXMucHVzaChwcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlmZlByb3BlcnR5UmVzdWx0c1twcm9wZXJ0eU5hbWVdID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1blJlYWN0aW9ucykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWN0aW9uRnVuY3Rpb25zID0gdGhpcy5nZXREZWNvcmF0b3IoJ2RpZmZSZWFjdGlvbicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVkUmVhY3Rpb25zID0gW107XG4gICAgICAgICAgICAgICAgcmVhY3Rpb25GdW5jdGlvbnMuZm9yRWFjaCgoeyByZWFjdGlvbiwgcHJvcGVydHlOYW1lIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHlDaGFuZ2VkID0gY2hhbmdlZFByb3BlcnR5S2V5cy5pbmRleE9mKHByb3BlcnR5TmFtZSkgIT09IC0xO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFjdGlvblJ1biA9IGV4ZWN1dGVkUmVhY3Rpb25zLmluZGV4T2YocmVhY3Rpb24pICE9PSAtMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Q2hhbmdlZCAmJiAhcmVhY3Rpb25SdW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWN0aW9uLmNhbGwodGhpcywgdGhpcy5fcHJvcGVydGllcywgZGlmZlByb3BlcnR5UmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZFJlYWN0aW9ucy5wdXNoKHJlYWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IGRpZmZQcm9wZXJ0eVJlc3VsdHM7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VkUHJvcGVydHlLZXlzID0gY2hhbmdlZFByb3BlcnR5S2V5cztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxQcm9wZXJ0aWVzID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWVzW2ldO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5KHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSwgaW5zdGFuY2VEYXRhLmNvcmVQcm9wZXJ0aWVzLmJpbmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFByb3BlcnR5S2V5cy5wdXNoKHByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fY2hhbmdlZFByb3BlcnR5S2V5cyA9IGNoYW5nZWRQcm9wZXJ0eUtleXM7XG4gICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2NoYW5nZWRQcm9wZXJ0eUtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGNoaWxkcmVuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW47XG4gICAgfVxuICAgIF9fc2V0Q2hpbGRyZW5fXyhjaGlsZHJlbikge1xuICAgICAgICBpZiAodGhpcy5fY2hpbGRyZW4ubGVuZ3RoID4gMCB8fCBjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX19yZW5kZXJfXygpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHRoaXMpO1xuICAgICAgICBpbnN0YW5jZURhdGEuZGlydHkgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVuZGVyID0gdGhpcy5fcnVuQmVmb3JlUmVuZGVycygpO1xuICAgICAgICBsZXQgZE5vZGUgPSByZW5kZXIoKTtcbiAgICAgICAgZE5vZGUgPSB0aGlzLnJ1bkFmdGVyUmVuZGVycyhkTm9kZSk7XG4gICAgICAgIHRoaXMuX25vZGVIYW5kbGVyLmNsZWFyKCk7XG4gICAgICAgIHJldHVybiBkTm9kZTtcbiAgICB9XG4gICAgaW52YWxpZGF0ZSgpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHRoaXMpO1xuICAgICAgICBpZiAoaW5zdGFuY2VEYXRhLmludmFsaWRhdGUpIHtcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5pbnZhbGlkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gdignZGl2Jywge30sIHRoaXMuY2hpbGRyZW4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB0byBhZGQgZGVjb3JhdG9ycyB0byBXaWRnZXRCYXNlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVjb3JhdG9yS2V5IFRoZSBrZXkgb2YgdGhlIGRlY29yYXRvclxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGRlY29yYXRvclxuICAgICAqL1xuICAgIGFkZERlY29yYXRvcihkZWNvcmF0b3JLZXksIHZhbHVlKSB7XG4gICAgICAgIHZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KCdjb25zdHJ1Y3RvcicpKSB7XG4gICAgICAgICAgICBsZXQgZGVjb3JhdG9yTGlzdCA9IGRlY29yYXRvck1hcC5nZXQodGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgICAgICAgICBpZiAoIWRlY29yYXRvckxpc3QpIHtcbiAgICAgICAgICAgICAgICBkZWNvcmF0b3JMaXN0ID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgICAgIGRlY29yYXRvck1hcC5zZXQodGhpcy5jb25zdHJ1Y3RvciwgZGVjb3JhdG9yTGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc3BlY2lmaWNEZWNvcmF0b3JMaXN0ID0gZGVjb3JhdG9yTGlzdC5nZXQoZGVjb3JhdG9yS2V5KTtcbiAgICAgICAgICAgIGlmICghc3BlY2lmaWNEZWNvcmF0b3JMaXN0KSB7XG4gICAgICAgICAgICAgICAgc3BlY2lmaWNEZWNvcmF0b3JMaXN0ID0gW107XG4gICAgICAgICAgICAgICAgZGVjb3JhdG9yTGlzdC5zZXQoZGVjb3JhdG9yS2V5LCBzcGVjaWZpY0RlY29yYXRvckxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3BlY2lmaWNEZWNvcmF0b3JMaXN0LnB1c2goLi4udmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IHRoaXMuZ2V0RGVjb3JhdG9yKGRlY29yYXRvcktleSk7XG4gICAgICAgICAgICB0aGlzLl9kZWNvcmF0b3JDYWNoZS5zZXQoZGVjb3JhdG9yS2V5LCBbLi4uZGVjb3JhdG9ycywgLi4udmFsdWVdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB0byBidWlsZCB0aGUgbGlzdCBvZiBkZWNvcmF0b3JzIGZyb20gdGhlIGdsb2JhbCBkZWNvcmF0b3IgbWFwLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRlY29yYXRvcktleSAgVGhlIGtleSBvZiB0aGUgZGVjb3JhdG9yXG4gICAgICogQHJldHVybiBBbiBhcnJheSBvZiBkZWNvcmF0b3IgdmFsdWVzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfYnVpbGREZWNvcmF0b3JMaXN0KGRlY29yYXRvcktleSkge1xuICAgICAgICBjb25zdCBhbGxEZWNvcmF0b3JzID0gW107XG4gICAgICAgIGxldCBjb25zdHJ1Y3RvciA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgICAgIHdoaWxlIChjb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VNYXAgPSBkZWNvcmF0b3JNYXAuZ2V0KGNvbnN0cnVjdG9yKTtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZU1hcCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBpbnN0YW5jZU1hcC5nZXQoZGVjb3JhdG9yS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9ycykge1xuICAgICAgICAgICAgICAgICAgICBhbGxEZWNvcmF0b3JzLnVuc2hpZnQoLi4uZGVjb3JhdG9ycyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3RydWN0b3IgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY29uc3RydWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhbGxEZWNvcmF0b3JzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB0byByZXRyaWV2ZSBkZWNvcmF0b3IgdmFsdWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVjb3JhdG9yS2V5IFRoZSBrZXkgb2YgdGhlIGRlY29yYXRvclxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGRlY29yYXRvciB2YWx1ZXNcbiAgICAgKi9cbiAgICBnZXREZWNvcmF0b3IoZGVjb3JhdG9yS2V5KSB7XG4gICAgICAgIGxldCBhbGxEZWNvcmF0b3JzID0gdGhpcy5fZGVjb3JhdG9yQ2FjaGUuZ2V0KGRlY29yYXRvcktleSk7XG4gICAgICAgIGlmIChhbGxEZWNvcmF0b3JzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhbGxEZWNvcmF0b3JzO1xuICAgICAgICB9XG4gICAgICAgIGFsbERlY29yYXRvcnMgPSB0aGlzLl9idWlsZERlY29yYXRvckxpc3QoZGVjb3JhdG9yS2V5KTtcbiAgICAgICAgdGhpcy5fZGVjb3JhdG9yQ2FjaGUuc2V0KGRlY29yYXRvcktleSwgYWxsRGVjb3JhdG9ycyk7XG4gICAgICAgIHJldHVybiBhbGxEZWNvcmF0b3JzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCaW5kcyB1bmJvdW5kIHByb3BlcnR5IGZ1bmN0aW9ucyB0byB0aGUgc3BlY2lmaWVkIGBiaW5kYCBwcm9wZXJ0eVxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgcHJvcGVydGllcyB0byBjaGVjayBmb3IgZnVuY3Rpb25zXG4gICAgICovXG4gICAgX2JpbmRGdW5jdGlvblByb3BlcnR5KHByb3BlcnR5LCBiaW5kKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkgPT09ICdmdW5jdGlvbicgJiYgIXByb3BlcnR5W25vQmluZF0gJiYgaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IocHJvcGVydHkpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5TWFwID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eU1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBiaW5kSW5mbyA9IHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5TWFwLmdldChwcm9wZXJ0eSkgfHwge307XG4gICAgICAgICAgICBsZXQgeyBib3VuZEZ1bmMsIHNjb3BlIH0gPSBiaW5kSW5mbztcbiAgICAgICAgICAgIGlmIChib3VuZEZ1bmMgPT09IHVuZGVmaW5lZCB8fCBzY29wZSAhPT0gYmluZCkge1xuICAgICAgICAgICAgICAgIGJvdW5kRnVuYyA9IHByb3BlcnR5LmJpbmQoYmluZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fYmluZEZ1bmN0aW9uUHJvcGVydHlNYXAuc2V0KHByb3BlcnR5LCB7IGJvdW5kRnVuYywgc2NvcGU6IGJpbmQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYm91bmRGdW5jO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eTtcbiAgICB9XG4gICAgZ2V0IHJlZ2lzdHJ5KCkge1xuICAgICAgICBpZiAodGhpcy5fcmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnlIYW5kbGVyKCk7XG4gICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeSk7XG4gICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeS5vbignaW52YWxpZGF0ZScsIHRoaXMuX2JvdW5kSW52YWxpZGF0ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWdpc3RyeTtcbiAgICB9XG4gICAgX3J1bkJlZm9yZVByb3BlcnRpZXMocHJvcGVydGllcykge1xuICAgICAgICBjb25zdCBiZWZvcmVQcm9wZXJ0aWVzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2JlZm9yZVByb3BlcnRpZXMnKTtcbiAgICAgICAgaWYgKGJlZm9yZVByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJlZm9yZVByb3BlcnRpZXMucmVkdWNlKChwcm9wZXJ0aWVzLCBiZWZvcmVQcm9wZXJ0aWVzRnVuY3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcHJvcGVydGllcywgYmVmb3JlUHJvcGVydGllc0Z1bmN0aW9uLmNhbGwodGhpcywgcHJvcGVydGllcykpO1xuICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcGVydGllcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSdW4gYWxsIHJlZ2lzdGVyZWQgYmVmb3JlIHJlbmRlcnMgYW5kIHJldHVybiB0aGUgdXBkYXRlZCByZW5kZXIgbWV0aG9kXG4gICAgICovXG4gICAgX3J1bkJlZm9yZVJlbmRlcnMoKSB7XG4gICAgICAgIGNvbnN0IGJlZm9yZVJlbmRlcnMgPSB0aGlzLmdldERlY29yYXRvcignYmVmb3JlUmVuZGVyJyk7XG4gICAgICAgIGlmIChiZWZvcmVSZW5kZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBiZWZvcmVSZW5kZXJzLnJlZHVjZSgocmVuZGVyLCBiZWZvcmVSZW5kZXJGdW5jdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRSZW5kZXIgPSBiZWZvcmVSZW5kZXJGdW5jdGlvbi5jYWxsKHRoaXMsIHJlbmRlciwgdGhpcy5fcHJvcGVydGllcywgdGhpcy5fY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIGlmICghdXBkYXRlZFJlbmRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlbmRlciBmdW5jdGlvbiBub3QgcmV0dXJuZWQgZnJvbSBiZWZvcmVSZW5kZXIsIHVzaW5nIHByZXZpb3VzIHJlbmRlcicpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlZFJlbmRlcjtcbiAgICAgICAgICAgIH0sIHRoaXMuX2JvdW5kUmVuZGVyRnVuYyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2JvdW5kUmVuZGVyRnVuYztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUnVuIGFsbCByZWdpc3RlcmVkIGFmdGVyIHJlbmRlcnMgYW5kIHJldHVybiB0aGUgZGVjb3JhdGVkIEROb2Rlc1xuICAgICAqXG4gICAgICogQHBhcmFtIGROb2RlIFRoZSBETm9kZXMgdG8gcnVuIHRocm91Z2ggdGhlIGFmdGVyIHJlbmRlcnNcbiAgICAgKi9cbiAgICBydW5BZnRlclJlbmRlcnMoZE5vZGUpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJSZW5kZXJzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2FmdGVyUmVuZGVyJyk7XG4gICAgICAgIGlmIChhZnRlclJlbmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZE5vZGUgPSBhZnRlclJlbmRlcnMucmVkdWNlKChkTm9kZSwgYWZ0ZXJSZW5kZXJGdW5jdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhZnRlclJlbmRlckZ1bmN0aW9uLmNhbGwodGhpcywgZE5vZGUpO1xuICAgICAgICAgICAgfSwgZE5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9tZXRhTWFwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX21ldGFNYXAuZm9yRWFjaCgobWV0YSkgPT4ge1xuICAgICAgICAgICAgICAgIG1ldGEuYWZ0ZXJSZW5kZXIoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkTm9kZTtcbiAgICB9XG4gICAgX3J1bkFmdGVyQ29uc3RydWN0b3JzKCkge1xuICAgICAgICBjb25zdCBhZnRlckNvbnN0cnVjdG9ycyA9IHRoaXMuZ2V0RGVjb3JhdG9yKCdhZnRlckNvbnN0cnVjdG9yJyk7XG4gICAgICAgIGlmIChhZnRlckNvbnN0cnVjdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhZnRlckNvbnN0cnVjdG9ycy5mb3JFYWNoKChhZnRlckNvbnN0cnVjdG9yKSA9PiBhZnRlckNvbnN0cnVjdG9yLmNhbGwodGhpcykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG93bihoYW5kbGUpIHtcbiAgICAgICAgdGhpcy5faGFuZGxlcy5wdXNoKGhhbmRsZSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLl9oYW5kbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMuX2hhbmRsZXMucG9wKCk7XG4gICAgICAgICAgICBpZiAoaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogc3RhdGljIGlkZW50aWZpZXJcbiAqL1xuV2lkZ2V0QmFzZS5fdHlwZSA9IFdJREdFVF9CQVNFX1RZUEU7XG5leHBvcnQgZGVmYXVsdCBXaWRnZXRCYXNlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2lkZ2V0QmFzZS5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL1dpZGdldEJhc2UubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvV2lkZ2V0QmFzZS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwibGV0IGJyb3dzZXJTcGVjaWZpY1RyYW5zaXRpb25FbmRFdmVudE5hbWUgPSAnJztcbmxldCBicm93c2VyU3BlY2lmaWNBbmltYXRpb25FbmRFdmVudE5hbWUgPSAnJztcbmZ1bmN0aW9uIGRldGVybWluZUJyb3dzZXJTdHlsZU5hbWVzKGVsZW1lbnQpIHtcbiAgICBpZiAoJ1dlYmtpdFRyYW5zaXRpb24nIGluIGVsZW1lbnQuc3R5bGUpIHtcbiAgICAgICAgYnJvd3NlclNwZWNpZmljVHJhbnNpdGlvbkVuZEV2ZW50TmFtZSA9ICd3ZWJraXRUcmFuc2l0aW9uRW5kJztcbiAgICAgICAgYnJvd3NlclNwZWNpZmljQW5pbWF0aW9uRW5kRXZlbnROYW1lID0gJ3dlYmtpdEFuaW1hdGlvbkVuZCc7XG4gICAgfVxuICAgIGVsc2UgaWYgKCd0cmFuc2l0aW9uJyBpbiBlbGVtZW50LnN0eWxlIHx8ICdNb3pUcmFuc2l0aW9uJyBpbiBlbGVtZW50LnN0eWxlKSB7XG4gICAgICAgIGJyb3dzZXJTcGVjaWZpY1RyYW5zaXRpb25FbmRFdmVudE5hbWUgPSAndHJhbnNpdGlvbmVuZCc7XG4gICAgICAgIGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSA9ICdhbmltYXRpb25lbmQnO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3VyIGJyb3dzZXIgaXMgbm90IHN1cHBvcnRlZCcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGluaXRpYWxpemUoZWxlbWVudCkge1xuICAgIGlmIChicm93c2VyU3BlY2lmaWNBbmltYXRpb25FbmRFdmVudE5hbWUgPT09ICcnKSB7XG4gICAgICAgIGRldGVybWluZUJyb3dzZXJTdHlsZU5hbWVzKGVsZW1lbnQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJ1bkFuZENsZWFuVXAoZWxlbWVudCwgc3RhcnRBbmltYXRpb24sIGZpbmlzaEFuaW1hdGlvbikge1xuICAgIGluaXRpYWxpemUoZWxlbWVudCk7XG4gICAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG4gICAgbGV0IHRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghZmluaXNoZWQpIHtcbiAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihicm93c2VyU3BlY2lmaWNUcmFuc2l0aW9uRW5kRXZlbnROYW1lLCB0cmFuc2l0aW9uRW5kKTtcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihicm93c2VyU3BlY2lmaWNBbmltYXRpb25FbmRFdmVudE5hbWUsIHRyYW5zaXRpb25FbmQpO1xuICAgICAgICAgICAgZmluaXNoQW5pbWF0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHN0YXJ0QW5pbWF0aW9uKCk7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSwgdHJhbnNpdGlvbkVuZCk7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGJyb3dzZXJTcGVjaWZpY1RyYW5zaXRpb25FbmRFdmVudE5hbWUsIHRyYW5zaXRpb25FbmQpO1xufVxuZnVuY3Rpb24gZXhpdChub2RlLCBwcm9wZXJ0aWVzLCBleGl0QW5pbWF0aW9uLCByZW1vdmVOb2RlKSB7XG4gICAgY29uc3QgYWN0aXZlQ2xhc3MgPSBwcm9wZXJ0aWVzLmV4aXRBbmltYXRpb25BY3RpdmUgfHwgYCR7ZXhpdEFuaW1hdGlvbn0tYWN0aXZlYDtcbiAgICBydW5BbmRDbGVhblVwKG5vZGUsICgpID0+IHtcbiAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKGV4aXRBbmltYXRpb24pO1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKGFjdGl2ZUNsYXNzKTtcbiAgICAgICAgfSk7XG4gICAgfSwgKCkgPT4ge1xuICAgICAgICByZW1vdmVOb2RlKCk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBlbnRlcihub2RlLCBwcm9wZXJ0aWVzLCBlbnRlckFuaW1hdGlvbikge1xuICAgIGNvbnN0IGFjdGl2ZUNsYXNzID0gcHJvcGVydGllcy5lbnRlckFuaW1hdGlvbkFjdGl2ZSB8fCBgJHtlbnRlckFuaW1hdGlvbn0tYWN0aXZlYDtcbiAgICBydW5BbmRDbGVhblVwKG5vZGUsICgpID0+IHtcbiAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKGVudGVyQW5pbWF0aW9uKTtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZChhY3RpdmVDbGFzcyk7XG4gICAgICAgIH0pO1xuICAgIH0sICgpID0+IHtcbiAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKGVudGVyQW5pbWF0aW9uKTtcbiAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKGFjdGl2ZUNsYXNzKTtcbiAgICB9KTtcbn1cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBlbnRlcixcbiAgICBleGl0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3NzVHJhbnNpdGlvbnMubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9hbmltYXRpb25zL2Nzc1RyYW5zaXRpb25zLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2FuaW1hdGlvbnMvY3NzVHJhbnNpdGlvbnMubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCBTeW1ib2wgZnJvbSAnLi4vc2hpbS9TeW1ib2wnO1xuLyoqXG4gKiBUaGUgc3ltYm9sIGlkZW50aWZpZXIgZm9yIGEgV05vZGUgdHlwZVxuICovXG5leHBvcnQgY29uc3QgV05PREUgPSBTeW1ib2woJ0lkZW50aWZpZXIgZm9yIGEgV05vZGUuJyk7XG4vKipcbiAqIFRoZSBzeW1ib2wgaWRlbnRpZmllciBmb3IgYSBWTm9kZSB0eXBlXG4gKi9cbmV4cG9ydCBjb25zdCBWTk9ERSA9IFN5bWJvbCgnSWRlbnRpZmllciBmb3IgYSBWTm9kZS4nKTtcbi8qKlxuICogVGhlIHN5bWJvbCBpZGVudGlmaWVyIGZvciBhIFZOb2RlIHR5cGUgY3JlYXRlZCB1c2luZyBkb20oKVxuICovXG5leHBvcnQgY29uc3QgRE9NVk5PREUgPSBTeW1ib2woJ0lkZW50aWZpZXIgZm9yIGEgVk5vZGUgY3JlYXRlZCB1c2luZyBleGlzdGluZyBkb20uJyk7XG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgYEROb2RlYCBpcyBhIGBXTm9kZWAgdXNpbmcgdGhlIGB0eXBlYCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNXTm9kZShjaGlsZCkge1xuICAgIHJldHVybiBCb29sZWFuKGNoaWxkICYmIHR5cGVvZiBjaGlsZCAhPT0gJ3N0cmluZycgJiYgY2hpbGQudHlwZSA9PT0gV05PREUpO1xufVxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIGBETm9kZWAgaXMgYSBgVk5vZGVgIHVzaW5nIHRoZSBgdHlwZWAgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVk5vZGUoY2hpbGQpIHtcbiAgICByZXR1cm4gQm9vbGVhbihjaGlsZCAmJiB0eXBlb2YgY2hpbGQgIT09ICdzdHJpbmcnICYmIChjaGlsZC50eXBlID09PSBWTk9ERSB8fCBjaGlsZC50eXBlID09PSBET01WTk9ERSkpO1xufVxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIGBETm9kZWAgaXMgYSBgVk5vZGVgIGNyZWF0ZWQgd2l0aCBgZG9tKClgIHVzaW5nIHRoZSBgdHlwZWAgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRG9tVk5vZGUoY2hpbGQpIHtcbiAgICByZXR1cm4gQm9vbGVhbihjaGlsZCAmJiB0eXBlb2YgY2hpbGQgIT09ICdzdHJpbmcnICYmIGNoaWxkLnR5cGUgPT09IERPTVZOT0RFKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0VsZW1lbnROb2RlKHZhbHVlKSB7XG4gICAgcmV0dXJuICEhdmFsdWUudGFnTmFtZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNvcmF0ZShkTm9kZXMsIG9wdGlvbnNPck1vZGlmaWVyLCBwcmVkaWNhdGUpIHtcbiAgICBsZXQgc2hhbGxvdyA9IGZhbHNlO1xuICAgIGxldCBtb2RpZmllcjtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnNPck1vZGlmaWVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG1vZGlmaWVyID0gb3B0aW9uc09yTW9kaWZpZXI7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBtb2RpZmllciA9IG9wdGlvbnNPck1vZGlmaWVyLm1vZGlmaWVyO1xuICAgICAgICBwcmVkaWNhdGUgPSBvcHRpb25zT3JNb2RpZmllci5wcmVkaWNhdGU7XG4gICAgICAgIHNoYWxsb3cgPSBvcHRpb25zT3JNb2RpZmllci5zaGFsbG93IHx8IGZhbHNlO1xuICAgIH1cbiAgICBsZXQgbm9kZXMgPSBBcnJheS5pc0FycmF5KGROb2RlcykgPyBbLi4uZE5vZGVzXSA6IFtkTm9kZXNdO1xuICAgIGZ1bmN0aW9uIGJyZWFrZXIoKSB7XG4gICAgICAgIG5vZGVzID0gW107XG4gICAgfVxuICAgIHdoaWxlIChub2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzLnNoaWZ0KCk7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBpZiAoIXNoYWxsb3cgJiYgKGlzV05vZGUobm9kZSkgfHwgaXNWTm9kZShub2RlKSkgJiYgbm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIG5vZGVzID0gWy4uLm5vZGVzLCAuLi5ub2RlLmNoaWxkcmVuXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcHJlZGljYXRlIHx8IHByZWRpY2F0ZShub2RlKSkge1xuICAgICAgICAgICAgICAgIG1vZGlmaWVyKG5vZGUsIGJyZWFrZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkTm9kZXM7XG59XG4vKipcbiAqIFdyYXBwZXIgZnVuY3Rpb24gZm9yIGNhbGxzIHRvIGNyZWF0ZSBhIHdpZGdldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHcod2lkZ2V0Q29uc3RydWN0b3IsIHByb3BlcnRpZXMsIGNoaWxkcmVuID0gW10pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgd2lkZ2V0Q29uc3RydWN0b3IsXG4gICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgIHR5cGU6IFdOT0RFXG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB2KHRhZywgcHJvcGVydGllc09yQ2hpbGRyZW4gPSB7fSwgY2hpbGRyZW4gPSB1bmRlZmluZWQpIHtcbiAgICBsZXQgcHJvcGVydGllcyA9IHByb3BlcnRpZXNPckNoaWxkcmVuO1xuICAgIGxldCBkZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjaztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wZXJ0aWVzT3JDaGlsZHJlbikpIHtcbiAgICAgICAgY2hpbGRyZW4gPSBwcm9wZXJ0aWVzT3JDaGlsZHJlbjtcbiAgICAgICAgcHJvcGVydGllcyA9IHt9O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHByb3BlcnRpZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2sgPSBwcm9wZXJ0aWVzO1xuICAgICAgICBwcm9wZXJ0aWVzID0ge307XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHRhZyxcbiAgICAgICAgZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2ssXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICB0eXBlOiBWTk9ERVxuICAgIH07XG59XG4vKipcbiAqIENyZWF0ZSBhIFZOb2RlIGZvciBhbiBleGlzdGluZyBET00gTm9kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvbSh7IG5vZGUsIGF0dHJzID0ge30sIHByb3BzID0ge30sIG9uID0ge30sIGRpZmZUeXBlID0gJ25vbmUnIH0sIGNoaWxkcmVuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGFnOiBpc0VsZW1lbnROb2RlKG5vZGUpID8gbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgOiAnJyxcbiAgICAgICAgcHJvcGVydGllczogcHJvcHMsXG4gICAgICAgIGF0dHJpYnV0ZXM6IGF0dHJzLFxuICAgICAgICBldmVudHM6IG9uLFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgdHlwZTogRE9NVk5PREUsXG4gICAgICAgIGRvbU5vZGU6IG5vZGUsXG4gICAgICAgIHRleHQ6IGlzRWxlbWVudE5vZGUobm9kZSkgPyB1bmRlZmluZWQgOiBub2RlLmRhdGEsXG4gICAgICAgIGRpZmZUeXBlXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWQubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2QubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCB7IGhhbmRsZURlY29yYXRvciB9IGZyb20gJy4vaGFuZGxlRGVjb3JhdG9yJztcbmV4cG9ydCBmdW5jdGlvbiBhZnRlclJlbmRlcihtZXRob2QpIHtcbiAgICByZXR1cm4gaGFuZGxlRGVjb3JhdG9yKCh0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICAgIHRhcmdldC5hZGREZWNvcmF0b3IoJ2FmdGVyUmVuZGVyJywgcHJvcGVydHlLZXkgPyB0YXJnZXRbcHJvcGVydHlLZXldIDogbWV0aG9kKTtcbiAgICB9KTtcbn1cbmV4cG9ydCBkZWZhdWx0IGFmdGVyUmVuZGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWZ0ZXJSZW5kZXIubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2FmdGVyUmVuZGVyLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYWZ0ZXJSZW5kZXIubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCB7IGhhbmRsZURlY29yYXRvciB9IGZyb20gJy4vaGFuZGxlRGVjb3JhdG9yJztcbmltcG9ydCB7IGJlZm9yZVByb3BlcnRpZXMgfSBmcm9tICcuL2JlZm9yZVByb3BlcnRpZXMnO1xuZXhwb3J0IGZ1bmN0aW9uIGFsd2F5c1JlbmRlcigpIHtcbiAgICByZXR1cm4gaGFuZGxlRGVjb3JhdG9yKCh0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICAgIGJlZm9yZVByb3BlcnRpZXMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgICAgIH0pKHRhcmdldCk7XG4gICAgfSk7XG59XG5leHBvcnQgZGVmYXVsdCBhbHdheXNSZW5kZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hbHdheXNSZW5kZXIubWpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2Fsd2F5c1JlbmRlci5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2Fsd2F5c1JlbmRlci5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi9oYW5kbGVEZWNvcmF0b3InO1xuZXhwb3J0IGZ1bmN0aW9uIGJlZm9yZVByb3BlcnRpZXMobWV0aG9kKSB7XG4gICAgcmV0dXJuIGhhbmRsZURlY29yYXRvcigodGFyZ2V0LCBwcm9wZXJ0eUtleSkgPT4ge1xuICAgICAgICB0YXJnZXQuYWRkRGVjb3JhdG9yKCdiZWZvcmVQcm9wZXJ0aWVzJywgcHJvcGVydHlLZXkgPyB0YXJnZXRbcHJvcGVydHlLZXldIDogbWV0aG9kKTtcbiAgICB9KTtcbn1cbmV4cG9ydCBkZWZhdWx0IGJlZm9yZVByb3BlcnRpZXM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iZWZvcmVQcm9wZXJ0aWVzLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9iZWZvcmVQcm9wZXJ0aWVzLm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYmVmb3JlUHJvcGVydGllcy5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IHsgQ3VzdG9tRWxlbWVudENoaWxkVHlwZSB9IGZyb20gJy4uL3JlZ2lzdGVyQ3VzdG9tRWxlbWVudCc7XG5pbXBvcnQgUmVnaXN0cnkgZnJvbSAnLi4vUmVnaXN0cnknO1xuLyoqXG4gKiBUaGlzIERlY29yYXRvciBpcyBwcm92aWRlZCBwcm9wZXJ0aWVzIHRoYXQgZGVmaW5lIHRoZSBiZWhhdmlvciBvZiBhIGN1c3RvbSBlbGVtZW50LCBhbmRcbiAqIHJlZ2lzdGVycyB0aGF0IGN1c3RvbSBlbGVtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3VzdG9tRWxlbWVudCh7IHRhZywgcHJvcGVydGllcyA9IFtdLCBhdHRyaWJ1dGVzID0gW10sIGV2ZW50cyA9IFtdLCBjaGlsZFR5cGUgPSBDdXN0b21FbGVtZW50Q2hpbGRUeXBlLkRPSk8sIHJlZ2lzdHJ5RmFjdG9yeSA9ICgpID0+IG5ldyBSZWdpc3RyeSgpIH0pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICB0YXJnZXQucHJvdG90eXBlLl9fY3VzdG9tRWxlbWVudERlc2NyaXB0b3IgPSB7XG4gICAgICAgICAgICB0YWdOYW1lOiB0YWcsXG4gICAgICAgICAgICBhdHRyaWJ1dGVzLFxuICAgICAgICAgICAgcHJvcGVydGllcyxcbiAgICAgICAgICAgIGV2ZW50cyxcbiAgICAgICAgICAgIGNoaWxkVHlwZSxcbiAgICAgICAgICAgIHJlZ2lzdHJ5RmFjdG9yeVxuICAgICAgICB9O1xuICAgIH07XG59XG5leHBvcnQgZGVmYXVsdCBjdXN0b21FbGVtZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3VzdG9tRWxlbWVudC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvY3VzdG9tRWxlbWVudC5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2N1c3RvbUVsZW1lbnQubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCB7IGhhbmRsZURlY29yYXRvciB9IGZyb20gJy4vaGFuZGxlRGVjb3JhdG9yJztcbmltcG9ydCB7IGF1dG8gfSBmcm9tICcuLy4uL2RpZmYnO1xuLyoqXG4gKiBEZWNvcmF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byByZWdpc3RlciBhIGZ1bmN0aW9uIGFzIGEgc3BlY2lmaWMgcHJvcGVydHkgZGlmZlxuICpcbiAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvZiB3aGljaCB0aGUgZGlmZiBmdW5jdGlvbiBpcyBhcHBsaWVkXG4gKiBAcGFyYW0gZGlmZlR5cGUgICAgICBUaGUgZGlmZiB0eXBlLCBkZWZhdWx0IGlzIERpZmZUeXBlLkFVVE8uXG4gKiBAcGFyYW0gZGlmZkZ1bmN0aW9uICBBIGRpZmYgZnVuY3Rpb24gdG8gcnVuIGlmIGRpZmZUeXBlIGlmIERpZmZUeXBlLkNVU1RPTVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZlByb3BlcnR5KHByb3BlcnR5TmFtZSwgZGlmZkZ1bmN0aW9uID0gYXV0bywgcmVhY3Rpb25GdW5jdGlvbikge1xuICAgIHJldHVybiBoYW5kbGVEZWNvcmF0b3IoKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcihgZGlmZlByb3BlcnR5OiR7cHJvcGVydHlOYW1lfWAsIGRpZmZGdW5jdGlvbi5iaW5kKG51bGwpKTtcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcigncmVnaXN0ZXJlZERpZmZQcm9wZXJ0eScsIHByb3BlcnR5TmFtZSk7XG4gICAgICAgIGlmIChyZWFjdGlvbkZ1bmN0aW9uIHx8IHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICB0YXJnZXQuYWRkRGVjb3JhdG9yKCdkaWZmUmVhY3Rpb24nLCB7XG4gICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgICAgIHJlYWN0aW9uOiBwcm9wZXJ0eUtleSA/IHRhcmdldFtwcm9wZXJ0eUtleV0gOiByZWFjdGlvbkZ1bmN0aW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQgZGlmZlByb3BlcnR5O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGlmZlByb3BlcnR5Lm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9kaWZmUHJvcGVydHkubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9kaWZmUHJvcGVydHkubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsIi8qKlxuICogR2VuZXJpYyBkZWNvcmF0b3IgaGFuZGxlciB0byB0YWtlIGNhcmUgb2Ygd2hldGhlciBvciBub3QgdGhlIGRlY29yYXRvciB3YXMgY2FsbGVkIGF0IHRoZSBjbGFzcyBsZXZlbFxuICogb3IgdGhlIG1ldGhvZCBsZXZlbC5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlclxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRGVjb3JhdG9yKGhhbmRsZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGhhbmRsZXIodGFyZ2V0LnByb3RvdHlwZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhhbmRsZXIodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0IGRlZmF1bHQgaGFuZGxlRGVjb3JhdG9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFuZGxlRGVjb3JhdG9yLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9oYW5kbGVEZWNvcmF0b3IubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9oYW5kbGVEZWNvcmF0b3IubWpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsImltcG9ydCBXZWFrTWFwIGZyb20gJy4uLy4uL3NoaW0vV2Vha01hcCc7XG5pbXBvcnQgeyBoYW5kbGVEZWNvcmF0b3IgfSBmcm9tICcuL2hhbmRsZURlY29yYXRvcic7XG5pbXBvcnQgeyBiZWZvcmVQcm9wZXJ0aWVzIH0gZnJvbSAnLi9iZWZvcmVQcm9wZXJ0aWVzJztcbi8qKlxuICogTWFwIG9mIGluc3RhbmNlcyBhZ2FpbnN0IHJlZ2lzdGVyZWQgaW5qZWN0b3JzLlxuICovXG5jb25zdCByZWdpc3RlcmVkSW5qZWN0b3JzTWFwID0gbmV3IFdlYWtNYXAoKTtcbi8qKlxuICogRGVjb3JhdG9yIHJldHJpZXZlcyBhbiBpbmplY3RvciBmcm9tIGFuIGF2YWlsYWJsZSByZWdpc3RyeSB1c2luZyB0aGUgbmFtZSBhbmRcbiAqIGNhbGxzIHRoZSBgZ2V0UHJvcGVydGllc2AgZnVuY3Rpb24gd2l0aCB0aGUgcGF5bG9hZCBmcm9tIHRoZSBpbmplY3RvclxuICogYW5kIGN1cnJlbnQgcHJvcGVydGllcyB3aXRoIHRoZSB0aGUgaW5qZWN0ZWQgcHJvcGVydGllcyByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gSW5qZWN0Q29uZmlnIHRoZSBpbmplY3QgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KHsgbmFtZSwgZ2V0UHJvcGVydGllcyB9KSB7XG4gICAgcmV0dXJuIGhhbmRsZURlY29yYXRvcigodGFyZ2V0LCBwcm9wZXJ0eUtleSkgPT4ge1xuICAgICAgICBiZWZvcmVQcm9wZXJ0aWVzKGZ1bmN0aW9uIChwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBjb25zdCBpbmplY3Rvckl0ZW0gPSB0aGlzLnJlZ2lzdHJ5LmdldEluamVjdG9yKG5hbWUpO1xuICAgICAgICAgICAgaWYgKGluamVjdG9ySXRlbSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgaW5qZWN0b3IsIGludmFsaWRhdG9yIH0gPSBpbmplY3Rvckl0ZW07XG4gICAgICAgICAgICAgICAgY29uc3QgcmVnaXN0ZXJlZEluamVjdG9ycyA9IHJlZ2lzdGVyZWRJbmplY3RvcnNNYXAuZ2V0KHRoaXMpIHx8IFtdO1xuICAgICAgICAgICAgICAgIGlmIChyZWdpc3RlcmVkSW5qZWN0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZWdpc3RlcmVkSW5qZWN0b3JzTWFwLnNldCh0aGlzLCByZWdpc3RlcmVkSW5qZWN0b3JzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlZ2lzdGVyZWRJbmplY3RvcnMuaW5kZXhPZihpbmplY3Rvckl0ZW0pID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm93bihpbnZhbGlkYXRvci5vbignaW52YWxpZGF0ZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWRJbmplY3RvcnMucHVzaChpbmplY3Rvckl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJvcGVydGllcyhpbmplY3RvcigpLCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkodGFyZ2V0KTtcbiAgICB9KTtcbn1cbmV4cG9ydCBkZWZhdWx0IGluamVjdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluamVjdC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaW5qZWN0Lm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaW5qZWN0Lm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgeyBXSURHRVRfQkFTRV9UWVBFIH0gZnJvbSAnLi9SZWdpc3RyeSc7XG5mdW5jdGlvbiBpc09iamVjdE9yQXJyYXkodmFsdWUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYWx3YXlzKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2hhbmdlZDogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IG5ld1Byb3BlcnR5XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmUocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjaGFuZ2VkOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IG5ld1Byb3BlcnR5XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWZlcmVuY2UocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjaGFuZ2VkOiBwcmV2aW91c1Byb3BlcnR5ICE9PSBuZXdQcm9wZXJ0eSxcbiAgICAgICAgdmFsdWU6IG5ld1Byb3BlcnR5XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzaGFsbG93KHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KSB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBjb25zdCB2YWxpZE9sZFByb3BlcnR5ID0gcHJldmlvdXNQcm9wZXJ0eSAmJiBpc09iamVjdE9yQXJyYXkocHJldmlvdXNQcm9wZXJ0eSk7XG4gICAgY29uc3QgdmFsaWROZXdQcm9wZXJ0eSA9IG5ld1Byb3BlcnR5ICYmIGlzT2JqZWN0T3JBcnJheShuZXdQcm9wZXJ0eSk7XG4gICAgaWYgKCF2YWxpZE9sZFByb3BlcnR5IHx8ICF2YWxpZE5ld1Byb3BlcnR5KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjaGFuZ2VkOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ld1Byb3BlcnR5XG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHByZXZpb3VzS2V5cyA9IE9iamVjdC5rZXlzKHByZXZpb3VzUHJvcGVydHkpO1xuICAgIGNvbnN0IG5ld0tleXMgPSBPYmplY3Qua2V5cyhuZXdQcm9wZXJ0eSk7XG4gICAgaWYgKHByZXZpb3VzS2V5cy5sZW5ndGggIT09IG5ld0tleXMubGVuZ3RoKSB7XG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2hhbmdlZCA9IG5ld0tleXMuc29tZSgoa2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3UHJvcGVydHlba2V5XSAhPT0gcHJldmlvdXNQcm9wZXJ0eVtrZXldO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2hhbmdlZCxcbiAgICAgICAgdmFsdWU6IG5ld1Byb3BlcnR5XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhdXRvKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KSB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAodHlwZW9mIG5ld1Byb3BlcnR5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGlmIChuZXdQcm9wZXJ0eS5fdHlwZSA9PT0gV0lER0VUX0JBU0VfVFlQRSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVmZXJlbmNlKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGlnbm9yZShwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoaXNPYmplY3RPckFycmF5KG5ld1Byb3BlcnR5KSkge1xuICAgICAgICByZXN1bHQgPSBzaGFsbG93KHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHJlZmVyZW5jZShwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWZmLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGlmZi5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kaWZmLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgYXNzaWduIH0gZnJvbSAnLi4vLi4vY29yZS9sYW5nJztcbmltcG9ydCBjc3NUcmFuc2l0aW9ucyBmcm9tICcuLi9hbmltYXRpb25zL2Nzc1RyYW5zaXRpb25zJztcbmltcG9ydCB7IGFmdGVyUmVuZGVyIH0gZnJvbSAnLi8uLi9kZWNvcmF0b3JzL2FmdGVyUmVuZGVyJztcbmltcG9ydCB7IHYgfSBmcm9tICcuLy4uL2QnO1xuaW1wb3J0IHsgZG9tIH0gZnJvbSAnLi8uLi92ZG9tJztcbi8qKlxuICogUmVwcmVzZW50cyB0aGUgYXR0YWNoIHN0YXRlIG9mIHRoZSBwcm9qZWN0b3JcbiAqL1xuZXhwb3J0IHZhciBQcm9qZWN0b3JBdHRhY2hTdGF0ZTtcbihmdW5jdGlvbiAoUHJvamVjdG9yQXR0YWNoU3RhdGUpIHtcbiAgICBQcm9qZWN0b3JBdHRhY2hTdGF0ZVtQcm9qZWN0b3JBdHRhY2hTdGF0ZVtcIkF0dGFjaGVkXCJdID0gMV0gPSBcIkF0dGFjaGVkXCI7XG4gICAgUHJvamVjdG9yQXR0YWNoU3RhdGVbUHJvamVjdG9yQXR0YWNoU3RhdGVbXCJEZXRhY2hlZFwiXSA9IDJdID0gXCJEZXRhY2hlZFwiO1xufSkoUHJvamVjdG9yQXR0YWNoU3RhdGUgfHwgKFByb2plY3RvckF0dGFjaFN0YXRlID0ge30pKTtcbi8qKlxuICogQXR0YWNoIHR5cGUgZm9yIHRoZSBwcm9qZWN0b3JcbiAqL1xuZXhwb3J0IHZhciBBdHRhY2hUeXBlO1xuKGZ1bmN0aW9uIChBdHRhY2hUeXBlKSB7XG4gICAgQXR0YWNoVHlwZVtBdHRhY2hUeXBlW1wiQXBwZW5kXCJdID0gMV0gPSBcIkFwcGVuZFwiO1xuICAgIEF0dGFjaFR5cGVbQXR0YWNoVHlwZVtcIk1lcmdlXCJdID0gMl0gPSBcIk1lcmdlXCI7XG59KShBdHRhY2hUeXBlIHx8IChBdHRhY2hUeXBlID0ge30pKTtcbmV4cG9ydCBmdW5jdGlvbiBQcm9qZWN0b3JNaXhpbihCYXNlKSB7XG4gICAgY2xhc3MgUHJvamVjdG9yIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdCA9IGRvY3VtZW50LmJvZHk7XG4gICAgICAgICAgICB0aGlzLl9hc3luYyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9wcm9qZWN0b3JQcm9wZXJ0aWVzID0ge307XG4gICAgICAgICAgICB0aGlzLl9wcm9qZWN0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uczogY3NzVHJhbnNpdGlvbnNcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgICAgICAgdGhpcy5wcm9qZWN0b3JTdGF0ZSA9IFByb2plY3RvckF0dGFjaFN0YXRlLkRldGFjaGVkO1xuICAgICAgICB9XG4gICAgICAgIGFwcGVuZChyb290KSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IEF0dGFjaFR5cGUuQXBwZW5kLFxuICAgICAgICAgICAgICAgIHJvb3RcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXR0YWNoKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIG1lcmdlKHJvb3QpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogQXR0YWNoVHlwZS5NZXJnZSxcbiAgICAgICAgICAgICAgICByb290XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2F0dGFjaChvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBzZXQgcm9vdChyb290KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9qZWN0b3JTdGF0ZSA9PT0gUHJvamVjdG9yQXR0YWNoU3RhdGUuQXR0YWNoZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2plY3RvciBhbHJlYWR5IGF0dGFjaGVkLCBjYW5ub3QgY2hhbmdlIHJvb3QgZWxlbWVudCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcm9vdCA9IHJvb3Q7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHJvb3QoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcm9vdDtcbiAgICAgICAgfVxuICAgICAgICBnZXQgYXN5bmMoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXN5bmM7XG4gICAgICAgIH1cbiAgICAgICAgc2V0IGFzeW5jKGFzeW5jKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9qZWN0b3JTdGF0ZSA9PT0gUHJvamVjdG9yQXR0YWNoU3RhdGUuQXR0YWNoZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2plY3RvciBhbHJlYWR5IGF0dGFjaGVkLCBjYW5ub3QgY2hhbmdlIGFzeW5jIG1vZGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2FzeW5jID0gYXN5bmM7XG4gICAgICAgIH1cbiAgICAgICAgc2FuZGJveChkb2MgPSBkb2N1bWVudCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvamVjdG9yU3RhdGUgPT09IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9qZWN0b3IgYWxyZWFkeSBhdHRhY2hlZCwgY2Fubm90IGNyZWF0ZSBzYW5kYm94Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9hc3luYyA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNSb290ID0gdGhpcy5yb290O1xuICAgICAgICAgICAgLyogZnJlZSB1cCB0aGUgZG9jdW1lbnQgZnJhZ21lbnQgZm9yIEdDICovXG4gICAgICAgICAgICB0aGlzLm93bih7XG4gICAgICAgICAgICAgICAgZGVzdHJveTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yb290ID0gcHJldmlvdXNSb290O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fYXR0YWNoKHtcbiAgICAgICAgICAgICAgICAvKiBEb2N1bWVudEZyYWdtZW50IGlzIG5vdCBhc3NpZ25hYmxlIHRvIEVsZW1lbnQsIGJ1dCBwcm92aWRlcyBldmVyeXRoaW5nIG5lZWRlZCB0byB3b3JrICovXG4gICAgICAgICAgICAgICAgcm9vdDogZG9jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBBdHRhY2hUeXBlLkFwcGVuZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0Q2hpbGRyZW4oY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX19zZXRDaGlsZHJlbl9fKGNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX19zZXRQcm9wZXJ0aWVzX18ocHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICAgICAgX19zZXRQcm9wZXJ0aWVzX18ocHJvcGVydGllcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Byb2plY3RvclByb3BlcnRpZXMgJiYgdGhpcy5fcHJvamVjdG9yUHJvcGVydGllcy5yZWdpc3RyeSAhPT0gcHJvcGVydGllcy5yZWdpc3RyeSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9qZWN0b3JQcm9wZXJ0aWVzLnJlZ2lzdHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2plY3RvclByb3BlcnRpZXMucmVnaXN0cnkuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3Byb2plY3RvclByb3BlcnRpZXMgPSBhc3NpZ24oe30sIHByb3BlcnRpZXMpO1xuICAgICAgICAgICAgc3VwZXIuX19zZXRDb3JlUHJvcGVydGllc19fKHsgYmluZDogdGhpcywgYmFzZVJlZ2lzdHJ5OiBwcm9wZXJ0aWVzLnJlZ2lzdHJ5IH0pO1xuICAgICAgICAgICAgc3VwZXIuX19zZXRQcm9wZXJ0aWVzX18ocHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICAgICAgdG9IdG1sKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvamVjdG9yU3RhdGUgIT09IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkIHx8ICF0aGlzLl9wcm9qZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9qZWN0b3IgaXMgbm90IGF0dGFjaGVkLCBjYW5ub3QgcmV0dXJuIGFuIEhUTUwgc3RyaW5nIG9mIHByb2plY3Rpb24uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvamVjdGlvbi5kb21Ob2RlLmNoaWxkTm9kZXNbMF0ub3V0ZXJIVE1MO1xuICAgICAgICB9XG4gICAgICAgIGFmdGVyUmVuZGVyKHJlc3VsdCkge1xuICAgICAgICAgICAgbGV0IG5vZGUgPSByZXN1bHQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgfHwgcmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IHYoJ3NwYW4nLCB7fSwgW3Jlc3VsdF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICBfYXR0YWNoKHsgdHlwZSwgcm9vdCB9KSB7XG4gICAgICAgICAgICBpZiAocm9vdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucm9vdCA9IHJvb3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fYXR0YWNoSGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2F0dGFjaEhhbmRsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHJvamVjdG9yU3RhdGUgPSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5BdHRhY2hlZDtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHtcbiAgICAgICAgICAgICAgICBkZXN0cm95OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb2plY3RvclN0YXRlID09PSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5BdHRhY2hlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvamVjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdG9yU3RhdGUgPSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5EZXRhY2hlZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLm93bihoYW5kbGUpO1xuICAgICAgICAgICAgdGhpcy5fYXR0YWNoSGFuZGxlID0gaGFuZGxlO1xuICAgICAgICAgICAgdGhpcy5fcHJvamVjdGlvbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9wcm9qZWN0aW9uT3B0aW9ucywgeyBzeW5jOiAhdGhpcy5fYXN5bmMgfSk7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEF0dGFjaFR5cGUuQXBwZW5kOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm9qZWN0aW9uID0gZG9tLmFwcGVuZCh0aGlzLnJvb3QsIHRoaXMsIHRoaXMuX3Byb2plY3Rpb25PcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBBdHRhY2hUeXBlLk1lcmdlOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm9qZWN0aW9uID0gZG9tLm1lcmdlKHRoaXMucm9vdCwgdGhpcywgdGhpcy5fcHJvamVjdGlvbk9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdHRhY2hIYW5kbGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdHNsaWJfMS5fX2RlY29yYXRlKFtcbiAgICAgICAgYWZ0ZXJSZW5kZXIoKVxuICAgIF0sIFByb2plY3Rvci5wcm90b3R5cGUsIFwiYWZ0ZXJSZW5kZXJcIiwgbnVsbCk7XG4gICAgcmV0dXJuIFByb2plY3Rvcjtcbn1cbmV4cG9ydCBkZWZhdWx0IFByb2plY3Rvck1peGluO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJvamVjdG9yLm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvbWl4aW5zL1Byb2plY3Rvci5tanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9taXhpbnMvUHJvamVjdG9yLm1qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgSW5qZWN0b3IgfSBmcm9tICcuLy4uL0luamVjdG9yJztcbmltcG9ydCB7IGluamVjdCB9IGZyb20gJy4vLi4vZGVjb3JhdG9ycy9pbmplY3QnO1xuaW1wb3J0IHsgaGFuZGxlRGVjb3JhdG9yIH0gZnJvbSAnLi8uLi9kZWNvcmF0b3JzL2hhbmRsZURlY29yYXRvcic7XG5pbXBvcnQgeyBkaWZmUHJvcGVydHkgfSBmcm9tICcuLy4uL2RlY29yYXRvcnMvZGlmZlByb3BlcnR5JztcbmltcG9ydCB7IHNoYWxsb3cgfSBmcm9tICcuLy4uL2RpZmYnO1xuY29uc3QgVEhFTUVfS0VZID0gJyBfa2V5JztcbmV4cG9ydCBjb25zdCBJTkpFQ1RFRF9USEVNRV9LRVkgPSBTeW1ib2woJ3RoZW1lJyk7XG4vKipcbiAqIERlY29yYXRvciBmb3IgYmFzZSBjc3MgY2xhc3Nlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGhlbWUodGhlbWUpIHtcbiAgICByZXR1cm4gaGFuZGxlRGVjb3JhdG9yKCh0YXJnZXQpID0+IHtcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcignYmFzZVRoZW1lQ2xhc3NlcycsIHRoZW1lKTtcbiAgICB9KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIHJldmVyc2UgbG9va3VwIGZvciB0aGUgY2xhc3NlcyBwYXNzZWQgaW4gdmlhIHRoZSBgdGhlbWVgIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBjbGFzc2VzIFRoZSBiYXNlQ2xhc3NlcyBvYmplY3RcbiAqIEByZXF1aXJlc1xuICovXG5mdW5jdGlvbiBjcmVhdGVUaGVtZUNsYXNzZXNMb29rdXAoY2xhc3Nlcykge1xuICAgIHJldHVybiBjbGFzc2VzLnJlZHVjZSgoY3VycmVudENsYXNzTmFtZXMsIGJhc2VDbGFzcykgPT4ge1xuICAgICAgICBPYmplY3Qua2V5cyhiYXNlQ2xhc3MpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgY3VycmVudENsYXNzTmFtZXNbYmFzZUNsYXNzW2tleV1dID0ga2V5O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzc05hbWVzO1xuICAgIH0sIHt9KTtcbn1cbi8qKlxuICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBpcyBnaXZlbiBhIHRoZW1lIGFuZCBhbiBvcHRpb25hbCByZWdpc3RyeSwgdGhlIHRoZW1lXG4gKiBpbmplY3RvciBpcyBkZWZpbmVkIGFnYWluc3QgdGhlIHJlZ2lzdHJ5LCByZXR1cm5pbmcgdGhlIHRoZW1lLlxuICpcbiAqIEBwYXJhbSB0aGVtZSB0aGUgdGhlbWUgdG8gc2V0XG4gKiBAcGFyYW0gdGhlbWVSZWdpc3RyeSByZWdpc3RyeSB0byBkZWZpbmUgdGhlIHRoZW1lIGluamVjdG9yIGFnYWluc3QuIERlZmF1bHRzXG4gKiB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5XG4gKlxuICogQHJldHVybnMgdGhlIHRoZW1lIGluamVjdG9yIHVzZWQgdG8gc2V0IHRoZSB0aGVtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJUaGVtZUluamVjdG9yKHRoZW1lLCB0aGVtZVJlZ2lzdHJ5KSB7XG4gICAgY29uc3QgdGhlbWVJbmplY3RvciA9IG5ldyBJbmplY3Rvcih0aGVtZSk7XG4gICAgdGhlbWVSZWdpc3RyeS5kZWZpbmVJbmplY3RvcihJTkpFQ1RFRF9USEVNRV9LRVksIChpbnZhbGlkYXRvcikgPT4ge1xuICAgICAgICB0aGVtZUluamVjdG9yLnNldEludmFsaWRhdG9yKGludmFsaWRhdG9yKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHRoZW1lSW5qZWN0b3IuZ2V0KCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoZW1lSW5qZWN0b3I7XG59XG4vKipcbiAqIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGNsYXNzIGRlY29yYXRlZCB3aXRoIHdpdGggVGhlbWVkIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFRoZW1lZE1peGluKEJhc2UpIHtcbiAgICBsZXQgVGhlbWVkID0gY2xhc3MgVGhlbWVkIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogUmVnaXN0ZXJlZCBiYXNlIHRoZW1lIGtleXNcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZEJhc2VUaGVtZUtleXMgPSBbXTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogSW5kaWNhdGVzIGlmIGNsYXNzZXMgbWV0YSBkYXRhIG5lZWQgdG8gYmUgY2FsY3VsYXRlZC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy5fcmVjYWxjdWxhdGVDbGFzc2VzID0gdHJ1ZTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogTG9hZGVkIHRoZW1lXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXMuX3RoZW1lID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhlbWUoY2xhc3Nlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JlY2FsY3VsYXRlQ2xhc3Nlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlY2FsY3VsYXRlVGhlbWVDbGFzc2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjbGFzc2VzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc2VzLm1hcCgoY2xhc3NOYW1lKSA9PiB0aGlzLl9nZXRUaGVtZUNsYXNzKGNsYXNzTmFtZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFRoZW1lQ2xhc3MoY2xhc3Nlcyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZ1bmN0aW9uIGZpcmVkIHdoZW4gYHRoZW1lYCBvciBgZXh0cmFDbGFzc2VzYCBhcmUgY2hhbmdlZC5cbiAgICAgICAgICovXG4gICAgICAgIG9uUHJvcGVydGllc0NoYW5nZWQoKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWNhbGN1bGF0ZUNsYXNzZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIF9nZXRUaGVtZUNsYXNzKGNsYXNzTmFtZSkge1xuICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PT0gdW5kZWZpbmVkIHx8IGNsYXNzTmFtZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBleHRyYUNsYXNzZXMgPSB0aGlzLnByb3BlcnRpZXMuZXh0cmFDbGFzc2VzIHx8IHt9O1xuICAgICAgICAgICAgY29uc3QgdGhlbWVDbGFzc05hbWUgPSB0aGlzLl9iYXNlVGhlbWVDbGFzc2VzUmV2ZXJzZUxvb2t1cFtjbGFzc05hbWVdO1xuICAgICAgICAgICAgbGV0IHJlc3VsdENsYXNzTmFtZXMgPSBbXTtcbiAgICAgICAgICAgIGlmICghdGhlbWVDbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYENsYXNzIG5hbWU6ICcke2NsYXNzTmFtZX0nIG5vdCBmb3VuZCBpbiB0aGVtZWApO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4dHJhQ2xhc3Nlc1t0aGVtZUNsYXNzTmFtZV0pIHtcbiAgICAgICAgICAgICAgICByZXN1bHRDbGFzc05hbWVzLnB1c2goZXh0cmFDbGFzc2VzW3RoZW1lQ2xhc3NOYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fdGhlbWVbdGhlbWVDbGFzc05hbWVdKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0Q2xhc3NOYW1lcy5wdXNoKHRoaXMuX3RoZW1lW3RoZW1lQ2xhc3NOYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHRDbGFzc05hbWVzLnB1c2godGhpcy5fcmVnaXN0ZXJlZEJhc2VUaGVtZVt0aGVtZUNsYXNzTmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENsYXNzTmFtZXMuam9pbignICcpO1xuICAgICAgICB9XG4gICAgICAgIF9yZWNhbGN1bGF0ZVRoZW1lQ2xhc3NlcygpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGhlbWUgPSB7fSB9ID0gdGhpcy5wcm9wZXJ0aWVzO1xuICAgICAgICAgICAgY29uc3QgYmFzZVRoZW1lcyA9IHRoaXMuZ2V0RGVjb3JhdG9yKCdiYXNlVGhlbWVDbGFzc2VzJyk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3JlZ2lzdGVyZWRCYXNlVGhlbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lID0gYmFzZVRoZW1lcy5yZWR1Y2UoKGZpbmFsQmFzZVRoZW1lLCBiYXNlVGhlbWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX2EgPSBUSEVNRV9LRVksIGtleSA9IGJhc2VUaGVtZVtfYV0sIGNsYXNzZXMgPSB0c2xpYl8xLl9fcmVzdChiYXNlVGhlbWUsIFt0eXBlb2YgX2EgPT09IFwic3ltYm9sXCIgPyBfYSA6IF9hICsgXCJcIl0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lS2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBmaW5hbEJhc2VUaGVtZSwgY2xhc3Nlcyk7XG4gICAgICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Jhc2VUaGVtZUNsYXNzZXNSZXZlcnNlTG9va3VwID0gY3JlYXRlVGhlbWVDbGFzc2VzTG9va3VwKGJhc2VUaGVtZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdGhlbWUgPSB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lS2V5cy5yZWR1Y2UoKGJhc2VUaGVtZSwgdGhlbWVLZXkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgYmFzZVRoZW1lLCB0aGVtZVt0aGVtZUtleV0pO1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgdGhpcy5fcmVjYWxjdWxhdGVDbGFzc2VzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHRzbGliXzEuX19kZWNvcmF0ZShbXG4gICAgICAgIGRpZmZQcm9wZXJ0eSgndGhlbWUnLCBzaGFsbG93KSxcbiAgICAgICAgZGlmZlByb3BlcnR5KCdleHRyYUNsYXNzZXMnLCBzaGFsbG93KVxuICAgIF0sIFRoZW1lZC5wcm90b3R5cGUsIFwib25Qcm9wZXJ0aWVzQ2hhbmdlZFwiLCBudWxsKTtcbiAgICBUaGVtZWQgPSB0c2xpYl8xLl9fZGVjb3JhdGUoW1xuICAgICAgICBpbmplY3Qoe1xuICAgICAgICAgICAgbmFtZTogSU5KRUNURURfVEhFTUVfS0VZLFxuICAgICAgICAgICAgZ2V0UHJvcGVydGllczogKHRoZW1lLCBwcm9wZXJ0aWVzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFwcm9wZXJ0aWVzLnRoZW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHRoZW1lIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICBdLCBUaGVtZWQpO1xuICAgIHJldHVybiBUaGVtZWQ7XG59XG5leHBvcnQgZGVmYXVsdCBUaGVtZWRNaXhpbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRoZW1lZC5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL21peGlucy9UaGVtZWQubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvbWl4aW5zL1RoZW1lZC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFdpZGdldEJhc2UsIG5vQmluZCB9IGZyb20gJy4vV2lkZ2V0QmFzZSc7XG5pbXBvcnQgeyBQcm9qZWN0b3JNaXhpbiB9IGZyb20gJy4vbWl4aW5zL1Byb2plY3Rvcic7XG5pbXBvcnQgeyBmcm9tIH0gZnJvbSAnLi4vc2hpbS9hcnJheSc7XG5pbXBvcnQgeyB3LCBkb20gfSBmcm9tICcuL2QnO1xuaW1wb3J0IGdsb2JhbCBmcm9tICcuLi9zaGltL2dsb2JhbCc7XG5pbXBvcnQgeyByZWdpc3RlclRoZW1lSW5qZWN0b3IgfSBmcm9tICcuL21peGlucy9UaGVtZWQnO1xuaW1wb3J0IHsgYWx3YXlzUmVuZGVyIH0gZnJvbSAnLi9kZWNvcmF0b3JzL2Fsd2F5c1JlbmRlcic7XG5leHBvcnQgdmFyIEN1c3RvbUVsZW1lbnRDaGlsZFR5cGU7XG4oZnVuY3Rpb24gKEN1c3RvbUVsZW1lbnRDaGlsZFR5cGUpIHtcbiAgICBDdXN0b21FbGVtZW50Q2hpbGRUeXBlW1wiRE9KT1wiXSA9IFwiRE9KT1wiO1xuICAgIEN1c3RvbUVsZW1lbnRDaGlsZFR5cGVbXCJOT0RFXCJdID0gXCJOT0RFXCI7XG4gICAgQ3VzdG9tRWxlbWVudENoaWxkVHlwZVtcIlRFWFRcIl0gPSBcIlRFWFRcIjtcbn0pKEN1c3RvbUVsZW1lbnRDaGlsZFR5cGUgfHwgKEN1c3RvbUVsZW1lbnRDaGlsZFR5cGUgPSB7fSkpO1xuZXhwb3J0IGZ1bmN0aW9uIERvbVRvV2lkZ2V0V3JhcHBlcihkb21Ob2RlKSB7XG4gICAgbGV0IERvbVRvV2lkZ2V0V3JhcHBlciA9IGNsYXNzIERvbVRvV2lkZ2V0V3JhcHBlciBleHRlbmRzIFdpZGdldEJhc2Uge1xuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gT2JqZWN0LmtleXModGhpcy5wcm9wZXJ0aWVzKS5yZWR1Y2UoKHByb3BzLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMucHJvcGVydGllc1trZXldO1xuICAgICAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZignb24nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBgX18ke2tleX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcm9wc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3BzO1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgcmV0dXJuIGRvbSh7IG5vZGU6IGRvbU5vZGUsIHByb3BzOiBwcm9wZXJ0aWVzLCBkaWZmVHlwZTogJ2RvbScgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGdldCBkb21Ob2RlKCkge1xuICAgICAgICAgICAgcmV0dXJuIGRvbU5vZGU7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIERvbVRvV2lkZ2V0V3JhcHBlciA9IHRzbGliXzEuX19kZWNvcmF0ZShbXG4gICAgICAgIGFsd2F5c1JlbmRlcigpXG4gICAgXSwgRG9tVG9XaWRnZXRXcmFwcGVyKTtcbiAgICByZXR1cm4gRG9tVG9XaWRnZXRXcmFwcGVyO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZShkZXNjcmlwdG9yLCBXaWRnZXRDb25zdHJ1Y3Rvcikge1xuICAgIGNvbnN0IHsgYXR0cmlidXRlcywgY2hpbGRUeXBlLCByZWdpc3RyeUZhY3RvcnkgfSA9IGRlc2NyaXB0b3I7XG4gICAgY29uc3QgYXR0cmlidXRlTWFwID0ge307XG4gICAgYXR0cmlidXRlcy5mb3JFYWNoKChwcm9wZXJ0eU5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IHByb3BlcnR5TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBhdHRyaWJ1dGVNYXBbYXR0cmlidXRlTmFtZV0gPSBwcm9wZXJ0eU5hbWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0ge307XG4gICAgICAgICAgICB0aGlzLl9jaGlsZHJlbiA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fZXZlbnRQcm9wZXJ0aWVzID0ge307XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsaXNlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxpc2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZG9tUHJvcGVydGllcyA9IHt9O1xuICAgICAgICAgICAgY29uc3QgeyBhdHRyaWJ1dGVzLCBwcm9wZXJ0aWVzLCBldmVudHMgfSA9IGRlc2NyaXB0b3I7XG4gICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcHJvcGVydGllcywgdGhpcy5fYXR0cmlidXRlc1RvUHJvcGVydGllcyhhdHRyaWJ1dGVzKSk7XG4gICAgICAgICAgICBbLi4uYXR0cmlidXRlcywgLi4ucHJvcGVydGllc10uZm9yRWFjaCgocHJvcGVydHlOYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzW3Byb3BlcnR5TmFtZV07XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRQcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUucmVwbGFjZSgvXm9uLywgJ19fJyk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJlZFByb3BlcnR5TmFtZSAhPT0gcHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbVByb3BlcnRpZXNbZmlsdGVyZWRQcm9wZXJ0eU5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiAoKSA9PiB0aGlzLl9nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiAodmFsdWUpID0+IHRoaXMuX3NldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRvbVByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiAoKSA9PiB0aGlzLl9nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpLFxuICAgICAgICAgICAgICAgICAgICBzZXQ6ICh2YWx1ZSkgPT4gdGhpcy5fc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBldmVudHMuZm9yRWFjaCgocHJvcGVydHlOYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0gcHJvcGVydHlOYW1lLnJlcGxhY2UoL15vbi8sICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkUHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lLnJlcGxhY2UoL15vbi8sICdfX29uJyk7XG4gICAgICAgICAgICAgICAgZG9tUHJvcGVydGllc1tmaWx0ZXJlZFByb3BlcnR5TmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogKCkgPT4gdGhpcy5fZ2V0RXZlbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpLFxuICAgICAgICAgICAgICAgICAgICBzZXQ6ICh2YWx1ZSkgPT4gdGhpcy5fc2V0RXZlbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnRDYWxsYmFjayA9IHRoaXMuX2dldEV2ZW50UHJvcGVydHkocHJvcGVydHlOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBldmVudENhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudENhbGxiYWNrKC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWJibGVzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDogYXJnc1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywgZG9tUHJvcGVydGllcyk7XG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkVHlwZSA9PT0gQ3VzdG9tRWxlbWVudENoaWxkVHlwZS5URVhUID8gdGhpcy5jaGlsZE5vZGVzIDogdGhpcy5jaGlsZHJlbjtcbiAgICAgICAgICAgIGZyb20oY2hpbGRyZW4pLmZvckVhY2goKGNoaWxkTm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZFR5cGUgPT09IEN1c3RvbUVsZW1lbnRDaGlsZFR5cGUuRE9KTykge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZE5vZGUuYWRkRXZlbnRMaXN0ZW5lcignZG9qby1jZS1yZW5kZXInLCAoKSA9PiB0aGlzLl9yZW5kZXIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkTm9kZS5hZGRFdmVudExpc3RlbmVyKCdkb2pvLWNlLWNvbm5lY3RlZCcsICgpID0+IHRoaXMuX3JlbmRlcigpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hpbGRyZW4ucHVzaChEb21Ub1dpZGdldFdyYXBwZXIoY2hpbGROb2RlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGlsZHJlbi5wdXNoKGRvbSh7IG5vZGU6IGNoaWxkTm9kZSwgZGlmZlR5cGU6ICdkb20nIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZG9qby1jZS1jb25uZWN0ZWQnLCAoZSkgPT4gdGhpcy5fY2hpbGRDb25uZWN0ZWQoZSkpO1xuICAgICAgICAgICAgY29uc3Qgd2lkZ2V0UHJvcGVydGllcyA9IHRoaXMuX3Byb3BlcnRpZXM7XG4gICAgICAgICAgICBjb25zdCByZW5kZXJDaGlsZHJlbiA9ICgpID0+IHRoaXMuX19jaGlsZHJlbl9fKCk7XG4gICAgICAgICAgICBjb25zdCBXcmFwcGVyID0gY2xhc3MgZXh0ZW5kcyBXaWRnZXRCYXNlIHtcbiAgICAgICAgICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3KFdpZGdldENvbnN0cnVjdG9yLCB3aWRnZXRQcm9wZXJ0aWVzLCByZW5kZXJDaGlsZHJlbigpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgcmVnaXN0cnkgPSByZWdpc3RyeUZhY3RvcnkoKTtcbiAgICAgICAgICAgIGNvbnN0IHRoZW1lQ29udGV4dCA9IHJlZ2lzdGVyVGhlbWVJbmplY3Rvcih0aGlzLl9nZXRUaGVtZSgpLCByZWdpc3RyeSk7XG4gICAgICAgICAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignZG9qby10aGVtZS1zZXQnLCAoKSA9PiB0aGVtZUNvbnRleHQuc2V0KHRoaXMuX2dldFRoZW1lKCkpKTtcbiAgICAgICAgICAgIGNvbnN0IFByb2plY3RvciA9IFByb2plY3Rvck1peGluKFdyYXBwZXIpO1xuICAgICAgICAgICAgdGhpcy5fcHJvamVjdG9yID0gbmV3IFByb2plY3RvcigpO1xuICAgICAgICAgICAgdGhpcy5fcHJvamVjdG9yLnNldFByb3BlcnRpZXMoeyByZWdpc3RyeSB9KTtcbiAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rvci5hcHBlbmQodGhpcyk7XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsaXNlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdkb2pvLWNlLWNvbm5lY3RlZCcsIHtcbiAgICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgIGRldGFpbDogdGhpc1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIF9nZXRUaGVtZSgpIHtcbiAgICAgICAgICAgIGlmIChnbG9iYWwgJiYgZ2xvYmFsLmRvam9jZSAmJiBnbG9iYWwuZG9qb2NlLnRoZW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdsb2JhbC5kb2pvY2UudGhlbWVzW2dsb2JhbC5kb2pvY2UudGhlbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9jaGlsZENvbm5lY3RlZChlKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gZS5kZXRhaWw7XG4gICAgICAgICAgICBpZiAobm9kZS5wYXJlbnROb2RlID09PSB0aGlzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RzID0gdGhpcy5fY2hpbGRyZW4uc29tZSgoY2hpbGQpID0+IGNoaWxkLmRvbU5vZGUgPT09IG5vZGUpO1xuICAgICAgICAgICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignZG9qby1jZS1yZW5kZXInLCAoKSA9PiB0aGlzLl9yZW5kZXIoKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoaWxkcmVuLnB1c2goRG9tVG9XaWRnZXRXcmFwcGVyKG5vZGUpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9yZW5kZXIoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcHJvamVjdG9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvamVjdG9yLmludmFsaWRhdGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdkb2pvLWNlLXJlbmRlcicsIHtcbiAgICAgICAgICAgICAgICAgICAgYnViYmxlczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDogdGhpc1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfX3Byb3BlcnRpZXNfXygpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9wcm9wZXJ0aWVzLCB0aGlzLl9ldmVudFByb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgICAgIF9fY2hpbGRyZW5fXygpIHtcbiAgICAgICAgICAgIGlmIChjaGlsZFR5cGUgPT09IEN1c3RvbUVsZW1lbnRDaGlsZFR5cGUuRE9KTykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jaGlsZHJlbi5maWx0ZXIoKENoaWxkKSA9PiBDaGlsZC5kb21Ob2RlLmlzV2lkZ2V0KS5tYXAoKENoaWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZG9tTm9kZSB9ID0gQ2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3KENoaWxkLCBPYmplY3QuYXNzaWduKHt9LCBkb21Ob2RlLl9fcHJvcGVydGllc19fKCkpLCBbLi4uZG9tTm9kZS5fX2NoaWxkcmVuX18oKV0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGRWYWx1ZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9IGF0dHJpYnV0ZU1hcFtuYW1lXTtcbiAgICAgICAgICAgIHRoaXMuX3NldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIF9zZXRFdmVudFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50UHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgX2dldEV2ZW50UHJvcGVydHkocHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgX3NldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZVtub0JpbmRdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgX2dldFByb3BlcnR5KHByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBfYXR0cmlidXRlc1RvUHJvcGVydGllcyhhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlcy5yZWR1Y2UoKHByb3BlcnRpZXMsIHByb3BlcnR5TmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoYXR0cmlidXRlTWFwKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgaXNXaWRnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXIoV2lkZ2V0Q29uc3RydWN0b3IpIHtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gV2lkZ2V0Q29uc3RydWN0b3IucHJvdG90eXBlICYmIFdpZGdldENvbnN0cnVjdG9yLnByb3RvdHlwZS5fX2N1c3RvbUVsZW1lbnREZXNjcmlwdG9yO1xuICAgIGlmICghZGVzY3JpcHRvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgZGVzY3JpcHRvciBmb3IgQ3VzdG9tIEVsZW1lbnQsIGhhdmUgeW91IGFkZGVkIHRoZSBAY3VzdG9tRWxlbWVudCBkZWNvcmF0b3IgdG8geW91ciBXaWRnZXQ/Jyk7XG4gICAgfVxuICAgIGdsb2JhbC5jdXN0b21FbGVtZW50cy5kZWZpbmUoZGVzY3JpcHRvci50YWdOYW1lLCBjcmVhdGUoZGVzY3JpcHRvciwgV2lkZ2V0Q29uc3RydWN0b3IpKTtcbn1cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVnaXN0ZXJDdXN0b21FbGVtZW50Lm1qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvcmVnaXN0ZXJDdXN0b21FbGVtZW50Lm1qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL3JlZ2lzdGVyQ3VzdG9tRWxlbWVudC5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiaW1wb3J0IGdsb2JhbCBmcm9tICcuLi9zaGltL2dsb2JhbCc7XHJcbmltcG9ydCB7IGZyb20gYXMgYXJyYXlGcm9tIH0gZnJvbSAnLi4vc2hpbS9hcnJheSc7XHJcbmltcG9ydCB7IGlzV05vZGUsIGlzVk5vZGUsIGlzRG9tVk5vZGUsIFZOT0RFLCBXTk9ERSB9IGZyb20gJy4vZCc7XHJcbmltcG9ydCB7IGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yIH0gZnJvbSAnLi9SZWdpc3RyeSc7XHJcbmltcG9ydCBXZWFrTWFwIGZyb20gJy4uL3NoaW0vV2Vha01hcCc7XHJcbmNvbnN0IE5BTUVTUEFDRV9XMyA9ICdodHRwOi8vd3d3LnczLm9yZy8nO1xyXG5jb25zdCBOQU1FU1BBQ0VfU1ZHID0gTkFNRVNQQUNFX1czICsgJzIwMDAvc3ZnJztcclxuY29uc3QgTkFNRVNQQUNFX1hMSU5LID0gTkFNRVNQQUNFX1czICsgJzE5OTkveGxpbmsnO1xyXG5jb25zdCBlbXB0eUFycmF5ID0gW107XHJcbmNvbnN0IG5vZGVPcGVyYXRpb25zID0gWydmb2N1cycsICdibHVyJywgJ3Njcm9sbEludG9WaWV3JywgJ2NsaWNrJ107XHJcbmV4cG9ydCBjb25zdCB3aWRnZXRJbnN0YW5jZU1hcCA9IG5ldyBXZWFrTWFwKCk7XHJcbmNvbnN0IGluc3RhbmNlTWFwID0gbmV3IFdlYWtNYXAoKTtcclxuY29uc3QgbmV4dFNpYmxpbmdNYXAgPSBuZXcgV2Vha01hcCgpO1xyXG5jb25zdCBwcm9qZWN0b3JTdGF0ZU1hcCA9IG5ldyBXZWFrTWFwKCk7XHJcbmZ1bmN0aW9uIHNhbWUoZG5vZGUxLCBkbm9kZTIpIHtcclxuICAgIGlmIChpc1ZOb2RlKGRub2RlMSkgJiYgaXNWTm9kZShkbm9kZTIpKSB7XHJcbiAgICAgICAgaWYgKGlzRG9tVk5vZGUoZG5vZGUxKSB8fCBpc0RvbVZOb2RlKGRub2RlMikpIHtcclxuICAgICAgICAgICAgaWYgKGRub2RlMS5kb21Ob2RlICE9PSBkbm9kZTIuZG9tTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkbm9kZTEudGFnICE9PSBkbm9kZTIudGFnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRub2RlMS5wcm9wZXJ0aWVzLmtleSAhPT0gZG5vZGUyLnByb3BlcnRpZXMua2V5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChpc1dOb2RlKGRub2RlMSkgJiYgaXNXTm9kZShkbm9kZTIpKSB7XHJcbiAgICAgICAgaWYgKGRub2RlMS5pbnN0YW5jZSA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBkbm9kZTIud2lkZ2V0Q29uc3RydWN0b3IgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRub2RlMS53aWRnZXRDb25zdHJ1Y3RvciAhPT0gZG5vZGUyLndpZGdldENvbnN0cnVjdG9yKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRub2RlMS5wcm9wZXJ0aWVzLmtleSAhPT0gZG5vZGUyLnByb3BlcnRpZXMua2V5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn1cclxuY29uc3QgbWlzc2luZ1RyYW5zaXRpb24gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb3ZpZGUgYSB0cmFuc2l0aW9ucyBvYmplY3QgdG8gdGhlIHByb2plY3Rpb25PcHRpb25zIHRvIGRvIGFuaW1hdGlvbnMnKTtcclxufTtcclxuZnVuY3Rpb24gZ2V0UHJvamVjdGlvbk9wdGlvbnMocHJvamVjdG9yT3B0aW9ucywgcHJvamVjdG9ySW5zdGFuY2UpIHtcclxuICAgIGNvbnN0IGRlZmF1bHRzID0ge1xyXG4gICAgICAgIG5hbWVzcGFjZTogdW5kZWZpbmVkLFxyXG4gICAgICAgIHN0eWxlQXBwbHllcjogZnVuY3Rpb24gKGRvbU5vZGUsIHN0eWxlTmFtZSwgdmFsdWUpIHtcclxuICAgICAgICAgICAgZG9tTm9kZS5zdHlsZVtzdHlsZU5hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgfSxcclxuICAgICAgICB0cmFuc2l0aW9uczoge1xyXG4gICAgICAgICAgICBlbnRlcjogbWlzc2luZ1RyYW5zaXRpb24sXHJcbiAgICAgICAgICAgIGV4aXQ6IG1pc3NpbmdUcmFuc2l0aW9uXHJcbiAgICAgICAgfSxcclxuICAgICAgICBkZXB0aDogMCxcclxuICAgICAgICBtZXJnZTogZmFsc2UsXHJcbiAgICAgICAgc3luYzogZmFsc2UsXHJcbiAgICAgICAgcHJvamVjdG9ySW5zdGFuY2VcclxuICAgIH07XHJcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHMsIHByb2plY3Rvck9wdGlvbnMpO1xyXG59XHJcbmZ1bmN0aW9uIGNoZWNrU3R5bGVWYWx1ZShzdHlsZVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIHN0eWxlVmFsdWUgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdHlsZSB2YWx1ZXMgbXVzdCBiZSBzdHJpbmdzJyk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gdXBkYXRlRXZlbnQoZG9tTm9kZSwgZXZlbnROYW1lLCBjdXJyZW50VmFsdWUsIHByb2plY3Rpb25PcHRpb25zLCBiaW5kLCBwcmV2aW91c1ZhbHVlKSB7XHJcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XHJcbiAgICBjb25zdCBldmVudE1hcCA9IHByb2plY3RvclN0YXRlLm5vZGVNYXAuZ2V0KGRvbU5vZGUpIHx8IG5ldyBXZWFrTWFwKCk7XHJcbiAgICBpZiAocHJldmlvdXNWYWx1ZSkge1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzRXZlbnQgPSBldmVudE1hcC5nZXQocHJldmlvdXNWYWx1ZSk7XHJcbiAgICAgICAgZG9tTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgcHJldmlvdXNFdmVudCk7XHJcbiAgICB9XHJcbiAgICBsZXQgY2FsbGJhY2sgPSBjdXJyZW50VmFsdWUuYmluZChiaW5kKTtcclxuICAgIGlmIChldmVudE5hbWUgPT09ICdpbnB1dCcpIHtcclxuICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uIChldnQpIHtcclxuICAgICAgICAgICAgY3VycmVudFZhbHVlLmNhbGwodGhpcywgZXZ0KTtcclxuICAgICAgICAgICAgZXZ0LnRhcmdldFsnb25pbnB1dC12YWx1ZSddID0gZXZ0LnRhcmdldC52YWx1ZTtcclxuICAgICAgICB9LmJpbmQoYmluZCk7XHJcbiAgICB9XHJcbiAgICBkb21Ob2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBjYWxsYmFjayk7XHJcbiAgICBldmVudE1hcC5zZXQoY3VycmVudFZhbHVlLCBjYWxsYmFjayk7XHJcbiAgICBwcm9qZWN0b3JTdGF0ZS5ub2RlTWFwLnNldChkb21Ob2RlLCBldmVudE1hcCk7XHJcbn1cclxuZnVuY3Rpb24gYWRkQ2xhc3Nlcyhkb21Ob2RlLCBjbGFzc2VzKSB7XHJcbiAgICBpZiAoY2xhc3Nlcykge1xyXG4gICAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBjbGFzc2VzLnNwbGl0KCcgJyk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGFzc05hbWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGRvbU5vZGUuY2xhc3NMaXN0LmFkZChjbGFzc05hbWVzW2ldKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gcmVtb3ZlQ2xhc3Nlcyhkb21Ob2RlLCBjbGFzc2VzKSB7XHJcbiAgICBpZiAoY2xhc3Nlcykge1xyXG4gICAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBjbGFzc2VzLnNwbGl0KCcgJyk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGFzc05hbWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGRvbU5vZGUuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWVzW2ldKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gYnVpbGRQcmV2aW91c1Byb3BlcnRpZXMoZG9tTm9kZSwgcHJldmlvdXMsIGN1cnJlbnQpIHtcclxuICAgIGNvbnN0IHsgZGlmZlR5cGUsIHByb3BlcnRpZXMsIGF0dHJpYnV0ZXMgfSA9IGN1cnJlbnQ7XHJcbiAgICBpZiAoIWRpZmZUeXBlIHx8IGRpZmZUeXBlID09PSAndmRvbScpIHtcclxuICAgICAgICByZXR1cm4geyBwcm9wZXJ0aWVzOiBwcmV2aW91cy5wcm9wZXJ0aWVzLCBhdHRyaWJ1dGVzOiBwcmV2aW91cy5hdHRyaWJ1dGVzLCBldmVudHM6IHByZXZpb3VzLmV2ZW50cyB9O1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZGlmZlR5cGUgPT09ICdub25lJykge1xyXG4gICAgICAgIHJldHVybiB7IHByb3BlcnRpZXM6IHt9LCBhdHRyaWJ1dGVzOiBwcmV2aW91cy5hdHRyaWJ1dGVzID8ge30gOiB1bmRlZmluZWQsIGV2ZW50czogcHJldmlvdXMuZXZlbnRzIH07XHJcbiAgICB9XHJcbiAgICBsZXQgbmV3UHJvcGVydGllcyA9IHtcclxuICAgICAgICBwcm9wZXJ0aWVzOiB7fVxyXG4gICAgfTtcclxuICAgIGlmIChhdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgbmV3UHJvcGVydGllcy5hdHRyaWJ1dGVzID0ge307XHJcbiAgICAgICAgbmV3UHJvcGVydGllcy5ldmVudHMgPSBwcmV2aW91cy5ldmVudHM7XHJcbiAgICAgICAgT2JqZWN0LmtleXMocHJvcGVydGllcykuZm9yRWFjaCgocHJvcE5hbWUpID0+IHtcclxuICAgICAgICAgICAgbmV3UHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BOYW1lXSA9IGRvbU5vZGVbcHJvcE5hbWVdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goKGF0dHJOYW1lKSA9PiB7XHJcbiAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMuYXR0cmlidXRlc1thdHRyTmFtZV0gPSBkb21Ob2RlLmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG5ld1Byb3BlcnRpZXM7XHJcbiAgICB9XHJcbiAgICBuZXdQcm9wZXJ0aWVzLnByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5yZWR1Y2UoKHByb3BzLCBwcm9wZXJ0eSkgPT4ge1xyXG4gICAgICAgIHByb3BzW3Byb3BlcnR5XSA9IGRvbU5vZGUuZ2V0QXR0cmlidXRlKHByb3BlcnR5KSB8fCBkb21Ob2RlW3Byb3BlcnR5XTtcclxuICAgICAgICByZXR1cm4gcHJvcHM7XHJcbiAgICB9LCB7fSk7XHJcbiAgICByZXR1cm4gbmV3UHJvcGVydGllcztcclxufVxyXG5mdW5jdGlvbiBub2RlT3BlcmF0aW9uKHByb3BOYW1lLCBwcm9wVmFsdWUsIHByZXZpb3VzVmFsdWUsIGRvbU5vZGUsIHByb2plY3Rpb25PcHRpb25zKSB7XHJcbiAgICBsZXQgcmVzdWx0O1xyXG4gICAgaWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICByZXN1bHQgPSBwcm9wVmFsdWUoKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHJlc3VsdCA9IHByb3BWYWx1ZSAmJiAhcHJldmlvdXNWYWx1ZTtcclxuICAgIH1cclxuICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHtcclxuICAgICAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XHJcbiAgICAgICAgcHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3MucHVzaCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGRvbU5vZGVbcHJvcE5hbWVdKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gcmVtb3ZlT3JwaGFuZWRFdmVudHMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucywgb25seUV2ZW50cyA9IGZhbHNlKSB7XHJcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XHJcbiAgICBjb25zdCBldmVudE1hcCA9IHByb2plY3RvclN0YXRlLm5vZGVNYXAuZ2V0KGRvbU5vZGUpO1xyXG4gICAgaWYgKGV2ZW50TWFwKSB7XHJcbiAgICAgICAgT2JqZWN0LmtleXMocHJldmlvdXNQcm9wZXJ0aWVzKS5mb3JFYWNoKChwcm9wTmFtZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpc0V2ZW50ID0gcHJvcE5hbWUuc3Vic3RyKDAsIDIpID09PSAnb24nIHx8IG9ubHlFdmVudHM7XHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IG9ubHlFdmVudHMgPyBwcm9wTmFtZSA6IHByb3BOYW1lLnN1YnN0cigyKTtcclxuICAgICAgICAgICAgaWYgKGlzRXZlbnQgJiYgIXByb3BlcnRpZXNbcHJvcE5hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudENhbGxiYWNrID0gZXZlbnRNYXAuZ2V0KHByZXZpb3VzUHJvcGVydGllc1twcm9wTmFtZV0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50Q2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICBkb21Ob2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBldmVudENhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHVwZGF0ZUF0dHJpYnV0ZShkb21Ob2RlLCBhdHRyTmFtZSwgYXR0clZhbHVlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgaWYgKHByb2plY3Rpb25PcHRpb25zLm5hbWVzcGFjZSA9PT0gTkFNRVNQQUNFX1NWRyAmJiBhdHRyTmFtZSA9PT0gJ2hyZWYnKSB7XHJcbiAgICAgICAgZG9tTm9kZS5zZXRBdHRyaWJ1dGVOUyhOQU1FU1BBQ0VfWExJTkssIGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoKGF0dHJOYW1lID09PSAncm9sZScgJiYgYXR0clZhbHVlID09PSAnJykgfHwgYXR0clZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBkb21Ob2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyTmFtZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBkb21Ob2RlLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0clZhbHVlKTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiB1cGRhdGVBdHRyaWJ1dGVzKGRvbU5vZGUsIHByZXZpb3VzQXR0cmlidXRlcywgYXR0cmlidXRlcywgcHJvamVjdGlvbk9wdGlvbnMpIHtcclxuICAgIGNvbnN0IGF0dHJOYW1lcyA9IE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpO1xyXG4gICAgY29uc3QgYXR0ckNvdW50ID0gYXR0ck5hbWVzLmxlbmd0aDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0ckNvdW50OyBpKyspIHtcclxuICAgICAgICBjb25zdCBhdHRyTmFtZSA9IGF0dHJOYW1lc1tpXTtcclxuICAgICAgICBjb25zdCBhdHRyVmFsdWUgPSBhdHRyaWJ1dGVzW2F0dHJOYW1lXTtcclxuICAgICAgICBjb25zdCBwcmV2aW91c0F0dHJWYWx1ZSA9IHByZXZpb3VzQXR0cmlidXRlc1thdHRyTmFtZV07XHJcbiAgICAgICAgaWYgKGF0dHJWYWx1ZSAhPT0gcHJldmlvdXNBdHRyVmFsdWUpIHtcclxuICAgICAgICAgICAgdXBkYXRlQXR0cmlidXRlKGRvbU5vZGUsIGF0dHJOYW1lLCBhdHRyVmFsdWUsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gdXBkYXRlUHJvcGVydGllcyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMsIHByb3BlcnRpZXMsIHByb2plY3Rpb25PcHRpb25zLCBpbmNsdWRlc0V2ZW50c0FuZEF0dHJpYnV0ZXMgPSB0cnVlKSB7XHJcbiAgICBsZXQgcHJvcGVydGllc1VwZGF0ZWQgPSBmYWxzZTtcclxuICAgIGNvbnN0IHByb3BOYW1lcyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpO1xyXG4gICAgY29uc3QgcHJvcENvdW50ID0gcHJvcE5hbWVzLmxlbmd0aDtcclxuICAgIGlmIChwcm9wTmFtZXMuaW5kZXhPZignY2xhc3NlcycpID09PSAtMSAmJiBwcmV2aW91c1Byb3BlcnRpZXMuY2xhc3Nlcykge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByZXZpb3VzUHJvcGVydGllcy5jbGFzc2VzKSkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZpb3VzUHJvcGVydGllcy5jbGFzc2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICByZW1vdmVDbGFzc2VzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcy5jbGFzc2VzW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmVtb3ZlQ2xhc3Nlcyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMuY2xhc3Nlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaW5jbHVkZXNFdmVudHNBbmRBdHRyaWJ1dGVzICYmIHJlbW92ZU9ycGhhbmVkRXZlbnRzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcywgcHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wQ291bnQ7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHByb3BOYW1lID0gcHJvcE5hbWVzW2ldO1xyXG4gICAgICAgIGxldCBwcm9wVmFsdWUgPSBwcm9wZXJ0aWVzW3Byb3BOYW1lXTtcclxuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gcHJldmlvdXNQcm9wZXJ0aWVzW3Byb3BOYW1lXTtcclxuICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdjbGFzc2VzJykge1xyXG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c0NsYXNzZXMgPSBBcnJheS5pc0FycmF5KHByZXZpb3VzVmFsdWUpID8gcHJldmlvdXNWYWx1ZSA6IFtwcmV2aW91c1ZhbHVlXTtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudENsYXNzZXMgPSBBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkgPyBwcm9wVmFsdWUgOiBbcHJvcFZhbHVlXTtcclxuICAgICAgICAgICAgaWYgKHByZXZpb3VzQ2xhc3NlcyAmJiBwcmV2aW91c0NsYXNzZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFwcm9wVmFsdWUgfHwgcHJvcFZhbHVlLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldmlvdXNDbGFzc2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzZXMoZG9tTm9kZSwgcHJldmlvdXNDbGFzc2VzW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdDbGFzc2VzID0gWy4uLmN1cnJlbnRDbGFzc2VzXTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZpb3VzQ2xhc3Nlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c0NsYXNzTmFtZSA9IHByZXZpb3VzQ2xhc3Nlc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzQ2xhc3NOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGFzc0luZGV4ID0gbmV3Q2xhc3Nlcy5pbmRleE9mKHByZXZpb3VzQ2xhc3NOYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc0luZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzZXMoZG9tTm9kZSwgcHJldmlvdXNDbGFzc05hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2xhc3Nlcy5zcGxpY2UoY2xhc3NJbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdDbGFzc2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZENsYXNzZXMoZG9tTm9kZSwgbmV3Q2xhc3Nlc1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50Q2xhc3Nlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGFkZENsYXNzZXMoZG9tTm9kZSwgY3VycmVudENsYXNzZXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKG5vZGVPcGVyYXRpb25zLmluZGV4T2YocHJvcE5hbWUpICE9PSAtMSkge1xyXG4gICAgICAgICAgICBub2RlT3BlcmF0aW9uKHByb3BOYW1lLCBwcm9wVmFsdWUsIHByZXZpb3VzVmFsdWUsIGRvbU5vZGUsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocHJvcE5hbWUgPT09ICdzdHlsZXMnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlTmFtZXMgPSBPYmplY3Qua2V5cyhwcm9wVmFsdWUpO1xyXG4gICAgICAgICAgICBjb25zdCBzdHlsZUNvdW50ID0gc3R5bGVOYW1lcy5sZW5ndGg7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc3R5bGVDb3VudDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZU5hbWUgPSBzdHlsZU5hbWVzW2pdO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3U3R5bGVWYWx1ZSA9IHByb3BWYWx1ZVtzdHlsZU5hbWVdO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2xkU3R5bGVWYWx1ZSA9IHByZXZpb3VzVmFsdWUgJiYgcHJldmlvdXNWYWx1ZVtzdHlsZU5hbWVdO1xyXG4gICAgICAgICAgICAgICAgaWYgKG5ld1N0eWxlVmFsdWUgPT09IG9sZFN0eWxlVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXNVcGRhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChuZXdTdHlsZVZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tTdHlsZVZhbHVlKG5ld1N0eWxlVmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb25PcHRpb25zLnN0eWxlQXBwbHllcihkb21Ob2RlLCBzdHlsZU5hbWUsIG5ld1N0eWxlVmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbk9wdGlvbnMuc3R5bGVBcHBseWVyKGRvbU5vZGUsIHN0eWxlTmFtZSwgJycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIXByb3BWYWx1ZSAmJiB0eXBlb2YgcHJldmlvdXNWYWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgIHByb3BWYWx1ZSA9ICcnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ3ZhbHVlJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZG9tVmFsdWUgPSBkb21Ob2RlW3Byb3BOYW1lXTtcclxuICAgICAgICAgICAgICAgIGlmIChkb21WYWx1ZSAhPT0gcHJvcFZhbHVlICYmXHJcbiAgICAgICAgICAgICAgICAgICAgKGRvbU5vZGVbJ29uaW5wdXQtdmFsdWUnXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGRvbVZhbHVlID09PSBkb21Ob2RlWydvbmlucHV0LXZhbHVlJ11cclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBwcm9wVmFsdWUgIT09IHByZXZpb3VzVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9tTm9kZVtwcm9wTmFtZV0gPSBwcm9wVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9tTm9kZVsnb25pbnB1dC12YWx1ZSddID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHByb3BWYWx1ZSAhPT0gcHJldmlvdXNWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNVcGRhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChwcm9wTmFtZSAhPT0gJ2tleScgJiYgcHJvcFZhbHVlICE9PSBwcmV2aW91c1ZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gdHlwZW9mIHByb3BWYWx1ZTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnZnVuY3Rpb24nICYmIHByb3BOYW1lLmxhc3RJbmRleE9mKCdvbicsIDApID09PSAwICYmIGluY2x1ZGVzRXZlbnRzQW5kQXR0cmlidXRlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUV2ZW50KGRvbU5vZGUsIHByb3BOYW1lLnN1YnN0cigyKSwgcHJvcFZhbHVlLCBwcm9qZWN0aW9uT3B0aW9ucywgcHJvcGVydGllcy5iaW5kLCBwcmV2aW91c1ZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHByb3BOYW1lICE9PSAnaW5uZXJIVE1MJyAmJiBpbmNsdWRlc0V2ZW50c0FuZEF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVBdHRyaWJ1dGUoZG9tTm9kZSwgcHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvcE5hbWUgPT09ICdzY3JvbGxMZWZ0JyB8fCBwcm9wTmFtZSA9PT0gJ3Njcm9sbFRvcCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZG9tTm9kZVtwcm9wTmFtZV0gIT09IHByb3BWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb21Ob2RlW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBkb21Ob2RlW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXNVcGRhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBwcm9wZXJ0aWVzVXBkYXRlZDtcclxufVxyXG5mdW5jdGlvbiBmaW5kSW5kZXhPZkNoaWxkKGNoaWxkcmVuLCBzYW1lQXMsIHN0YXJ0KSB7XHJcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmIChzYW1lKGNoaWxkcmVuW2ldLCBzYW1lQXMpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAtMTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gdG9QYXJlbnRWTm9kZShkb21Ob2RlKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHRhZzogJycsXHJcbiAgICAgICAgcHJvcGVydGllczoge30sXHJcbiAgICAgICAgY2hpbGRyZW46IHVuZGVmaW5lZCxcclxuICAgICAgICBkb21Ob2RlLFxyXG4gICAgICAgIHR5cGU6IFZOT0RFXHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiB0b1RleHRWTm9kZShkYXRhKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHRhZzogJycsXHJcbiAgICAgICAgcHJvcGVydGllczoge30sXHJcbiAgICAgICAgY2hpbGRyZW46IHVuZGVmaW5lZCxcclxuICAgICAgICB0ZXh0OiBgJHtkYXRhfWAsXHJcbiAgICAgICAgZG9tTm9kZTogdW5kZWZpbmVkLFxyXG4gICAgICAgIHR5cGU6IFZOT0RFXHJcbiAgICB9O1xyXG59XHJcbmZ1bmN0aW9uIHRvSW50ZXJuYWxXTm9kZShpbnN0YW5jZSwgaW5zdGFuY2VEYXRhKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGluc3RhbmNlLFxyXG4gICAgICAgIHJlbmRlcmVkOiBbXSxcclxuICAgICAgICBjb3JlUHJvcGVydGllczogaW5zdGFuY2VEYXRhLmNvcmVQcm9wZXJ0aWVzLFxyXG4gICAgICAgIGNoaWxkcmVuOiBpbnN0YW5jZS5jaGlsZHJlbixcclxuICAgICAgICB3aWRnZXRDb25zdHJ1Y3RvcjogaW5zdGFuY2UuY29uc3RydWN0b3IsXHJcbiAgICAgICAgcHJvcGVydGllczogaW5zdGFuY2VEYXRhLmlucHV0UHJvcGVydGllcyxcclxuICAgICAgICB0eXBlOiBXTk9ERVxyXG4gICAgfTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihjaGlsZHJlbiwgaW5zdGFuY2UpIHtcclxuICAgIGlmIChjaGlsZHJlbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuIGVtcHR5QXJyYXk7XHJcbiAgICB9XHJcbiAgICBjaGlsZHJlbiA9IEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pID8gY2hpbGRyZW4gOiBbY2hpbGRyZW5dO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7KSB7XHJcbiAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcclxuICAgICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCB8fCBjaGlsZCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGNoaWxkcmVuW2ldID0gdG9UZXh0Vk5vZGUoY2hpbGQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGlzVk5vZGUoY2hpbGQpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQucHJvcGVydGllcy5iaW5kID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZC5wcm9wZXJ0aWVzLmJpbmQgPSBpbnN0YW5jZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuY2hpbGRyZW4gJiYgY2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJBbmREZWNvcmF0ZUNoaWxkcmVuKGNoaWxkLmNoaWxkcmVuLCBpbnN0YW5jZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjaGlsZC5jb3JlUHJvcGVydGllcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldChpbnN0YW5jZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuY29yZVByb3BlcnRpZXMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQ6IGluc3RhbmNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXNlUmVnaXN0cnk6IGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcy5iYXNlUmVnaXN0cnlcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuICYmIGNoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJBbmREZWNvcmF0ZUNoaWxkcmVuKGNoaWxkLmNoaWxkcmVuLCBpbnN0YW5jZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaSsrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNoaWxkcmVuO1xyXG59XHJcbmZ1bmN0aW9uIG5vZGVBZGRlZChkbm9kZSwgdHJhbnNpdGlvbnMpIHtcclxuICAgIGlmIChpc1ZOb2RlKGRub2RlKSAmJiBkbm9kZS5wcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgY29uc3QgZW50ZXJBbmltYXRpb24gPSBkbm9kZS5wcm9wZXJ0aWVzLmVudGVyQW5pbWF0aW9uO1xyXG4gICAgICAgIGlmIChlbnRlckFuaW1hdGlvbikge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGVudGVyQW5pbWF0aW9uID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICBlbnRlckFuaW1hdGlvbihkbm9kZS5kb21Ob2RlLCBkbm9kZS5wcm9wZXJ0aWVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25zLmVudGVyKGRub2RlLmRvbU5vZGUsIGRub2RlLnByb3BlcnRpZXMsIGVudGVyQW5pbWF0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBub2RlVG9SZW1vdmUoZG5vZGUsIHRyYW5zaXRpb25zLCBwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgaWYgKGlzV05vZGUoZG5vZGUpKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IGluc3RhbmNlTWFwLmdldChkbm9kZS5pbnN0YW5jZSk7XHJcbiAgICAgICAgY29uc3QgcmVuZGVyZWQgPSAoaXRlbSA/IGl0ZW0uZG5vZGUucmVuZGVyZWQgOiBkbm9kZS5yZW5kZXJlZCkgfHwgZW1wdHlBcnJheTtcclxuICAgICAgICBpZiAoZG5vZGUuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VEYXRhID0gd2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGRub2RlLmluc3RhbmNlKTtcclxuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLm9uRGV0YWNoKCk7XHJcbiAgICAgICAgICAgIGluc3RhbmNlTWFwLmRlbGV0ZShkbm9kZS5pbnN0YW5jZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVuZGVyZWQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbm9kZVRvUmVtb3ZlKHJlbmRlcmVkW2ldLCB0cmFuc2l0aW9ucywgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlO1xyXG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBkbm9kZS5wcm9wZXJ0aWVzO1xyXG4gICAgICAgIGlmIChkbm9kZS5jaGlsZHJlbiAmJiBkbm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIG5vZGVUb1JlbW92ZShkbm9kZS5jaGlsZHJlbltpXSwgdHJhbnNpdGlvbnMsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBleGl0QW5pbWF0aW9uID0gcHJvcGVydGllcy5leGl0QW5pbWF0aW9uO1xyXG4gICAgICAgIGlmIChwcm9wZXJ0aWVzICYmIGV4aXRBbmltYXRpb24pIHtcclxuICAgICAgICAgICAgZG9tTm9kZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xyXG4gICAgICAgICAgICBjb25zdCByZW1vdmVEb21Ob2RlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgZG9tTm9kZSAmJiBkb21Ob2RlLnBhcmVudE5vZGUgJiYgZG9tTm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRvbU5vZGUpO1xyXG4gICAgICAgICAgICAgICAgZG5vZGUuZG9tTm9kZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBleGl0QW5pbWF0aW9uID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICBleGl0QW5pbWF0aW9uKGRvbU5vZGUsIHJlbW92ZURvbU5vZGUsIHByb3BlcnRpZXMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbnMuZXhpdChkbm9kZS5kb21Ob2RlLCBwcm9wZXJ0aWVzLCBleGl0QW5pbWF0aW9uLCByZW1vdmVEb21Ob2RlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBkb21Ob2RlICYmIGRvbU5vZGUucGFyZW50Tm9kZSAmJiBkb21Ob2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZG9tTm9kZSk7XHJcbiAgICAgICAgZG5vZGUuZG9tTm9kZSA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBjaGVja0Rpc3Rpbmd1aXNoYWJsZShjaGlsZE5vZGVzLCBpbmRleFRvQ2hlY2ssIHBhcmVudEluc3RhbmNlKSB7XHJcbiAgICBjb25zdCBjaGlsZE5vZGUgPSBjaGlsZE5vZGVzW2luZGV4VG9DaGVja107XHJcbiAgICBpZiAoaXNWTm9kZShjaGlsZE5vZGUpICYmICFjaGlsZE5vZGUudGFnKSB7XHJcbiAgICAgICAgcmV0dXJuOyAvLyBUZXh0IG5vZGVzIG5lZWQgbm90IGJlIGRpc3Rpbmd1aXNoYWJsZVxyXG4gICAgfVxyXG4gICAgY29uc3QgeyBrZXkgfSA9IGNoaWxkTm9kZS5wcm9wZXJ0aWVzO1xyXG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gbnVsbCkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoaSAhPT0gaW5kZXhUb0NoZWNrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gY2hpbGROb2Rlc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChzYW1lKG5vZGUsIGNoaWxkTm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZUlkZW50aWZpZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50TmFtZSA9IHBhcmVudEluc3RhbmNlLmNvbnN0cnVjdG9yLm5hbWUgfHwgJ3Vua25vd24nO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1dOb2RlKGNoaWxkTm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUlkZW50aWZpZXIgPSBjaGlsZE5vZGUud2lkZ2V0Q29uc3RydWN0b3IubmFtZSB8fCAndW5rbm93bic7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlSWRlbnRpZmllciA9IGNoaWxkTm9kZS50YWc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgQSB3aWRnZXQgKCR7cGFyZW50TmFtZX0pIGhhcyBoYWQgYSBjaGlsZCBhZGRkZWQgb3IgcmVtb3ZlZCwgYnV0IHRoZXkgd2VyZSBub3QgYWJsZSB0byB1bmlxdWVseSBpZGVudGlmaWVkLiBJdCBpcyByZWNvbW1lbmRlZCB0byBwcm92aWRlIGEgdW5pcXVlICdrZXknIHByb3BlcnR5IHdoZW4gdXNpbmcgdGhlIHNhbWUgd2lkZ2V0IG9yIGVsZW1lbnQgKCR7bm9kZUlkZW50aWZpZXJ9KSBtdWx0aXBsZSB0aW1lcyBhcyBzaWJsaW5nc2ApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHVwZGF0ZUNoaWxkcmVuKHBhcmVudFZOb2RlLCBzaWJsaW5ncywgb2xkQ2hpbGRyZW4sIG5ld0NoaWxkcmVuLCBwYXJlbnRJbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpIHtcclxuICAgIG9sZENoaWxkcmVuID0gb2xkQ2hpbGRyZW4gfHwgZW1wdHlBcnJheTtcclxuICAgIG5ld0NoaWxkcmVuID0gbmV3Q2hpbGRyZW47XHJcbiAgICBjb25zdCBvbGRDaGlsZHJlbkxlbmd0aCA9IG9sZENoaWxkcmVuLmxlbmd0aDtcclxuICAgIGNvbnN0IG5ld0NoaWxkcmVuTGVuZ3RoID0gbmV3Q2hpbGRyZW4ubGVuZ3RoO1xyXG4gICAgY29uc3QgdHJhbnNpdGlvbnMgPSBwcm9qZWN0aW9uT3B0aW9ucy50cmFuc2l0aW9ucztcclxuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgIHByb2plY3Rpb25PcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvamVjdGlvbk9wdGlvbnMsIHsgZGVwdGg6IHByb2plY3Rpb25PcHRpb25zLmRlcHRoICsgMSB9KTtcclxuICAgIGxldCBvbGRJbmRleCA9IDA7XHJcbiAgICBsZXQgbmV3SW5kZXggPSAwO1xyXG4gICAgbGV0IGk7XHJcbiAgICBsZXQgdGV4dFVwZGF0ZWQgPSBmYWxzZTtcclxuICAgIHdoaWxlIChuZXdJbmRleCA8IG5ld0NoaWxkcmVuTGVuZ3RoKSB7XHJcbiAgICAgICAgbGV0IG9sZENoaWxkID0gb2xkSW5kZXggPCBvbGRDaGlsZHJlbkxlbmd0aCA/IG9sZENoaWxkcmVuW29sZEluZGV4XSA6IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCBuZXdDaGlsZCA9IG5ld0NoaWxkcmVuW25ld0luZGV4XTtcclxuICAgICAgICBpZiAoaXNWTm9kZShuZXdDaGlsZCkgJiYgdHlwZW9mIG5ld0NoaWxkLmRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIG5ld0NoaWxkLmluc2VydGVkID0gaXNWTm9kZShvbGRDaGlsZCkgJiYgb2xkQ2hpbGQuaW5zZXJ0ZWQ7XHJcbiAgICAgICAgICAgIGFkZERlZmVycmVkUHJvcGVydGllcyhuZXdDaGlsZCwgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob2xkQ2hpbGQgIT09IHVuZGVmaW5lZCAmJiBzYW1lKG9sZENoaWxkLCBuZXdDaGlsZCkpIHtcclxuICAgICAgICAgICAgb2xkSW5kZXgrKztcclxuICAgICAgICAgICAgbmV3SW5kZXgrKztcclxuICAgICAgICAgICAgdGV4dFVwZGF0ZWQgPVxyXG4gICAgICAgICAgICAgICAgdXBkYXRlRG9tKG9sZENoaWxkLCBuZXdDaGlsZCwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudFZOb2RlLCBwYXJlbnRJbnN0YW5jZSwgb2xkQ2hpbGRyZW4uc2xpY2Uob2xkSW5kZXgpLCBuZXdDaGlsZHJlbi5zbGljZShuZXdJbmRleCkpIHx8IHRleHRVcGRhdGVkO1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZmluZE9sZEluZGV4ID0gZmluZEluZGV4T2ZDaGlsZChvbGRDaGlsZHJlbiwgbmV3Q2hpbGQsIG9sZEluZGV4ICsgMSk7XHJcbiAgICAgICAgY29uc3QgYWRkQ2hpbGQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBpbnNlcnRCZWZvcmVEb21Ob2RlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBsZXQgY2hpbGRyZW5BcnJheSA9IG9sZENoaWxkcmVuO1xyXG4gICAgICAgICAgICBsZXQgbmV4dEluZGV4ID0gb2xkSW5kZXggKyAxO1xyXG4gICAgICAgICAgICBsZXQgY2hpbGQgPSBvbGRDaGlsZHJlbltvbGRJbmRleF07XHJcbiAgICAgICAgICAgIGlmICghY2hpbGQpIHtcclxuICAgICAgICAgICAgICAgIGNoaWxkID0gc2libGluZ3NbMF07XHJcbiAgICAgICAgICAgICAgICBuZXh0SW5kZXggPSAxO1xyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW5BcnJheSA9IHNpYmxpbmdzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjaGlsZCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGluc2VydEJlZm9yZUNoaWxkcmVuID0gW2NoaWxkXTtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChpbnNlcnRCZWZvcmVDaGlsZHJlbi5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnNlcnRCZWZvcmUgPSBpbnNlcnRCZWZvcmVDaGlsZHJlbi5zaGlmdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1dOb2RlKGluc2VydEJlZm9yZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGluc3RhbmNlTWFwLmdldChpbnNlcnRCZWZvcmUuaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLmRub2RlLnJlbmRlcmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRCZWZvcmVDaGlsZHJlbi5wdXNoKC4uLml0ZW0uZG5vZGUucmVuZGVyZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlLmRvbU5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRCZWZvcmUuZG9tTm9kZS5wYXJlbnRFbGVtZW50ICE9PSBwYXJlbnRWTm9kZS5kb21Ob2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRCZWZvcmVEb21Ob2RlID0gaW5zZXJ0QmVmb3JlLmRvbU5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlQ2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIGNoaWxkcmVuQXJyYXlbbmV4dEluZGV4XSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRCZWZvcmVDaGlsZHJlbi5wdXNoKGNoaWxkcmVuQXJyYXlbbmV4dEluZGV4XSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRJbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjcmVhdGVEb20obmV3Q2hpbGQsIHBhcmVudFZOb2RlLCBuZXdDaGlsZHJlbi5zbGljZShuZXdJbmRleCArIDEpLCBpbnNlcnRCZWZvcmVEb21Ob2RlLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UpO1xyXG4gICAgICAgICAgICBub2RlQWRkZWQobmV3Q2hpbGQsIHRyYW5zaXRpb25zKTtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXhUb0NoZWNrID0gbmV3SW5kZXg7XHJcbiAgICAgICAgICAgIHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2hlY2tEaXN0aW5ndWlzaGFibGUobmV3Q2hpbGRyZW4sIGluZGV4VG9DaGVjaywgcGFyZW50SW5zdGFuY2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmICghb2xkQ2hpbGQgfHwgZmluZE9sZEluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICBhZGRDaGlsZCgpO1xyXG4gICAgICAgICAgICBuZXdJbmRleCsrO1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVtb3ZlQ2hpbGQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4VG9DaGVjayA9IG9sZEluZGV4O1xyXG4gICAgICAgICAgICBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNoZWNrRGlzdGluZ3Vpc2hhYmxlKG9sZENoaWxkcmVuLCBpbmRleFRvQ2hlY2ssIHBhcmVudEluc3RhbmNlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChpc1dOb2RlKG9sZENoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGluc3RhbmNlTWFwLmdldChvbGRDaGlsZC5pbnN0YW5jZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9sZENoaWxkID0gaXRlbS5kbm9kZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBub2RlVG9SZW1vdmUob2xkQ2hpbGQsIHRyYW5zaXRpb25zLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBmaW5kTmV3SW5kZXggPSBmaW5kSW5kZXhPZkNoaWxkKG5ld0NoaWxkcmVuLCBvbGRDaGlsZCwgbmV3SW5kZXggKyAxKTtcclxuICAgICAgICBpZiAoZmluZE5ld0luZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICByZW1vdmVDaGlsZCgpO1xyXG4gICAgICAgICAgICBvbGRJbmRleCsrO1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYWRkQ2hpbGQoKTtcclxuICAgICAgICByZW1vdmVDaGlsZCgpO1xyXG4gICAgICAgIG9sZEluZGV4Kys7XHJcbiAgICAgICAgbmV3SW5kZXgrKztcclxuICAgIH1cclxuICAgIGlmIChvbGRDaGlsZHJlbkxlbmd0aCA+IG9sZEluZGV4KSB7XHJcbiAgICAgICAgLy8gUmVtb3ZlIGNoaWxkIGZyYWdtZW50c1xyXG4gICAgICAgIGZvciAoaSA9IG9sZEluZGV4OyBpIDwgb2xkQ2hpbGRyZW5MZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleFRvQ2hlY2sgPSBpO1xyXG4gICAgICAgICAgICBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNoZWNrRGlzdGluZ3Vpc2hhYmxlKG9sZENoaWxkcmVuLCBpbmRleFRvQ2hlY2ssIHBhcmVudEluc3RhbmNlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGxldCBjaGlsZFRvUmVtb3ZlID0gb2xkQ2hpbGRyZW5baV07XHJcbiAgICAgICAgICAgIGlmIChpc1dOb2RlKGNoaWxkVG9SZW1vdmUpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gaW5zdGFuY2VNYXAuZ2V0KGNoaWxkVG9SZW1vdmUuaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZFRvUmVtb3ZlID0gaXRlbS5kbm9kZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBub2RlVG9SZW1vdmUoY2hpbGRUb1JlbW92ZSwgdHJhbnNpdGlvbnMsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGV4dFVwZGF0ZWQ7XHJcbn1cclxuZnVuY3Rpb24gYWRkQ2hpbGRyZW4ocGFyZW50Vk5vZGUsIGNoaWxkcmVuLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UsIGluc2VydEJlZm9yZSA9IHVuZGVmaW5lZCwgY2hpbGROb2Rlcykge1xyXG4gICAgaWYgKGNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XHJcbiAgICBpZiAocHJvamVjdG9yU3RhdGUubWVyZ2UgJiYgY2hpbGROb2RlcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgY2hpbGROb2RlcyA9IGFycmF5RnJvbShwYXJlbnRWTm9kZS5kb21Ob2RlLmNoaWxkTm9kZXMpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdHJhbnNpdGlvbnMgPSBwcm9qZWN0aW9uT3B0aW9ucy50cmFuc2l0aW9ucztcclxuICAgIHByb2plY3Rpb25PcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvamVjdGlvbk9wdGlvbnMsIHsgZGVwdGg6IHByb2plY3Rpb25PcHRpb25zLmRlcHRoICsgMSB9KTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xyXG4gICAgICAgIGNvbnN0IG5leHRTaWJsaW5ncyA9IGNoaWxkcmVuLnNsaWNlKGkgKyAxKTtcclxuICAgICAgICBpZiAoaXNWTm9kZShjaGlsZCkpIHtcclxuICAgICAgICAgICAgaWYgKHByb2plY3RvclN0YXRlLm1lcmdlICYmIGNoaWxkTm9kZXMpIHtcclxuICAgICAgICAgICAgICAgIGxldCBkb21FbGVtZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGNoaWxkLmRvbU5vZGUgPT09IHVuZGVmaW5lZCAmJiBjaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50ID0gY2hpbGROb2Rlcy5zaGlmdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkb21FbGVtZW50ICYmIGRvbUVsZW1lbnQudGFnTmFtZSA9PT0gKGNoaWxkLnRhZy50b1VwcGVyQ2FzZSgpIHx8IHVuZGVmaW5lZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZG9tTm9kZSA9IGRvbUVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNyZWF0ZURvbShjaGlsZCwgcGFyZW50Vk5vZGUsIG5leHRTaWJsaW5ncywgaW5zZXJ0QmVmb3JlLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY3JlYXRlRG9tKGNoaWxkLCBwYXJlbnRWTm9kZSwgbmV4dFNpYmxpbmdzLCBpbnNlcnRCZWZvcmUsIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRJbnN0YW5jZSwgY2hpbGROb2Rlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG5vZGVBZGRlZChjaGlsZCwgdHJhbnNpdGlvbnMpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGluaXRQcm9wZXJ0aWVzQW5kQ2hpbGRyZW4oZG9tTm9kZSwgZG5vZGUsIHBhcmVudEluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgYWRkQ2hpbGRyZW4oZG5vZGUsIGRub2RlLmNoaWxkcmVuLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UsIHVuZGVmaW5lZCk7XHJcbiAgICBpZiAodHlwZW9mIGRub2RlLmRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrID09PSAnZnVuY3Rpb24nICYmIGRub2RlLmluc2VydGVkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBhZGREZWZlcnJlZFByb3BlcnRpZXMoZG5vZGUsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgIH1cclxuICAgIGlmIChkbm9kZS5hdHRyaWJ1dGVzICYmIGRub2RlLmV2ZW50cykge1xyXG4gICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXMoZG9tTm9kZSwge30sIGRub2RlLmF0dHJpYnV0ZXMsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICB1cGRhdGVQcm9wZXJ0aWVzKGRvbU5vZGUsIHt9LCBkbm9kZS5wcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucywgZmFsc2UpO1xyXG4gICAgICAgIHJlbW92ZU9ycGhhbmVkRXZlbnRzKGRvbU5vZGUsIHt9LCBkbm9kZS5ldmVudHMsIHByb2plY3Rpb25PcHRpb25zLCB0cnVlKTtcclxuICAgICAgICBjb25zdCBldmVudHMgPSBkbm9kZS5ldmVudHM7XHJcbiAgICAgICAgT2JqZWN0LmtleXMoZXZlbnRzKS5mb3JFYWNoKChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICB1cGRhdGVFdmVudChkb21Ob2RlLCBldmVudCwgZXZlbnRzW2V2ZW50XSwgcHJvamVjdGlvbk9wdGlvbnMsIGRub2RlLnByb3BlcnRpZXMuYmluZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICB1cGRhdGVQcm9wZXJ0aWVzKGRvbU5vZGUsIHt9LCBkbm9kZS5wcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgICBpZiAoZG5vZGUucHJvcGVydGllcy5rZXkgIT09IG51bGwgJiYgZG5vZGUucHJvcGVydGllcy5rZXkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldChwYXJlbnRJbnN0YW5jZSk7XHJcbiAgICAgICAgaW5zdGFuY2VEYXRhLm5vZGVIYW5kbGVyLmFkZChkb21Ob2RlLCBgJHtkbm9kZS5wcm9wZXJ0aWVzLmtleX1gKTtcclxuICAgIH1cclxuICAgIGRub2RlLmluc2VydGVkID0gdHJ1ZTtcclxufVxyXG5mdW5jdGlvbiBjcmVhdGVEb20oZG5vZGUsIHBhcmVudFZOb2RlLCBuZXh0U2libGluZ3MsIGluc2VydEJlZm9yZSwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudEluc3RhbmNlLCBjaGlsZE5vZGVzKSB7XHJcbiAgICBsZXQgZG9tTm9kZTtcclxuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgIGlmIChpc1dOb2RlKGRub2RlKSkge1xyXG4gICAgICAgIGxldCB7IHdpZGdldENvbnN0cnVjdG9yIH0gPSBkbm9kZTtcclxuICAgICAgICBjb25zdCBwYXJlbnRJbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQocGFyZW50SW5zdGFuY2UpO1xyXG4gICAgICAgIGlmICghaXNXaWRnZXRCYXNlQ29uc3RydWN0b3Iod2lkZ2V0Q29uc3RydWN0b3IpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBwYXJlbnRJbnN0YW5jZURhdGEucmVnaXN0cnkoKS5nZXQod2lkZ2V0Q29uc3RydWN0b3IpO1xyXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHdpZGdldENvbnN0cnVjdG9yID0gaXRlbTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgd2lkZ2V0Q29uc3RydWN0b3IoKTtcclxuICAgICAgICBkbm9kZS5pbnN0YW5jZSA9IGluc3RhbmNlO1xyXG4gICAgICAgIG5leHRTaWJsaW5nTWFwLnNldChpbnN0YW5jZSwgbmV4dFNpYmxpbmdzKTtcclxuICAgICAgICBjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpO1xyXG4gICAgICAgIGluc3RhbmNlRGF0YS5pbnZhbGlkYXRlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpbnN0YW5jZURhdGEuZGlydHkgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHByb2plY3RvclN0YXRlLnJlbmRlclF1ZXVlLnB1c2goeyBpbnN0YW5jZSwgZGVwdGg6IHByb2plY3Rpb25PcHRpb25zLmRlcHRoIH0pO1xyXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVSZW5kZXIocHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICBpbnN0YW5jZURhdGEucmVuZGVyaW5nID0gdHJ1ZTtcclxuICAgICAgICBpbnN0YW5jZS5fX3NldENvcmVQcm9wZXJ0aWVzX18oZG5vZGUuY29yZVByb3BlcnRpZXMpO1xyXG4gICAgICAgIGluc3RhbmNlLl9fc2V0Q2hpbGRyZW5fXyhkbm9kZS5jaGlsZHJlbik7XHJcbiAgICAgICAgaW5zdGFuY2UuX19zZXRQcm9wZXJ0aWVzX18oZG5vZGUucHJvcGVydGllcyk7XHJcbiAgICAgICAgY29uc3QgcmVuZGVyZWQgPSBpbnN0YW5jZS5fX3JlbmRlcl9fKCk7XHJcbiAgICAgICAgaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChyZW5kZXJlZCkge1xyXG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJlZFJlbmRlcmVkID0gZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihyZW5kZXJlZCwgaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICBkbm9kZS5yZW5kZXJlZCA9IGZpbHRlcmVkUmVuZGVyZWQ7XHJcbiAgICAgICAgICAgIGFkZENoaWxkcmVuKHBhcmVudFZOb2RlLCBmaWx0ZXJlZFJlbmRlcmVkLCBwcm9qZWN0aW9uT3B0aW9ucywgaW5zdGFuY2UsIGluc2VydEJlZm9yZSwgY2hpbGROb2Rlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGluc3RhbmNlTWFwLnNldChpbnN0YW5jZSwgeyBkbm9kZSwgcGFyZW50Vk5vZGUgfSk7XHJcbiAgICAgICAgaW5zdGFuY2VEYXRhLm5vZGVIYW5kbGVyLmFkZFJvb3QoKTtcclxuICAgICAgICBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcclxuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLm9uQXR0YWNoKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBpZiAocHJvamVjdG9yU3RhdGUubWVyZ2UgJiYgcHJvamVjdG9yU3RhdGUubWVyZ2VFbGVtZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgZG9tTm9kZSA9IGRub2RlLmRvbU5vZGUgPSBwcm9qZWN0aW9uT3B0aW9ucy5tZXJnZUVsZW1lbnQ7XHJcbiAgICAgICAgICAgIHByb2plY3RvclN0YXRlLm1lcmdlRWxlbWVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgaW5pdFByb3BlcnRpZXNBbmRDaGlsZHJlbihkb21Ob2RlLCBkbm9kZSwgcGFyZW50SW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkb2MgPSBwYXJlbnRWTm9kZS5kb21Ob2RlLm93bmVyRG9jdW1lbnQ7XHJcbiAgICAgICAgaWYgKCFkbm9kZS50YWcgJiYgdHlwZW9mIGRub2RlLnRleHQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGlmIChkbm9kZS5kb21Ob2RlICE9PSB1bmRlZmluZWQgJiYgcGFyZW50Vk5vZGUuZG9tTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3RG9tTm9kZSA9IGRub2RlLmRvbU5vZGUub3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkbm9kZS50ZXh0KTtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRWTm9kZS5kb21Ob2RlID09PSBkbm9kZS5kb21Ob2RlLnBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRWTm9kZS5kb21Ob2RlLnJlcGxhY2VDaGlsZChuZXdEb21Ob2RlLCBkbm9kZS5kb21Ob2RlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFZOb2RlLmRvbU5vZGUuYXBwZW5kQ2hpbGQobmV3RG9tTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZG5vZGUuZG9tTm9kZS5wYXJlbnROb2RlICYmIGRub2RlLmRvbU5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkbm9kZS5kb21Ob2RlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGRub2RlLmRvbU5vZGUgPSBuZXdEb21Ob2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZG9tTm9kZSA9IGRub2RlLmRvbU5vZGUgPSBkb2MuY3JlYXRlVGV4dE5vZGUoZG5vZGUudGV4dCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRWTm9kZS5kb21Ob2RlLmluc2VydEJlZm9yZShkb21Ob2RlLCBpbnNlcnRCZWZvcmUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Vk5vZGUuZG9tTm9kZS5hcHBlbmRDaGlsZChkb21Ob2RlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGRub2RlLmRvbU5vZGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRub2RlLnRhZyA9PT0gJ3N2ZycpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHByb2plY3Rpb25PcHRpb25zLCB7IG5hbWVzcGFjZTogTkFNRVNQQUNFX1NWRyB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0aW9uT3B0aW9ucy5uYW1lc3BhY2UgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhwcm9qZWN0aW9uT3B0aW9ucy5uYW1lc3BhY2UsIGRub2RlLnRhZyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBkb21Ob2RlID0gZG5vZGUuZG9tTm9kZSA9IGRub2RlLmRvbU5vZGUgfHwgZG9jLmNyZWF0ZUVsZW1lbnQoZG5vZGUudGFnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGluaXRQcm9wZXJ0aWVzQW5kQ2hpbGRyZW4oZG9tTm9kZSwgZG5vZGUsIHBhcmVudEluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgICAgIGlmIChpbnNlcnRCZWZvcmUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50Vk5vZGUuZG9tTm9kZS5pbnNlcnRCZWZvcmUoZG9tTm9kZSwgaW5zZXJ0QmVmb3JlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChkb21Ob2RlLnBhcmVudE5vZGUgIT09IHBhcmVudFZOb2RlLmRvbU5vZGUpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudFZOb2RlLmRvbU5vZGUuYXBwZW5kQ2hpbGQoZG9tTm9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gdXBkYXRlRG9tKHByZXZpb3VzLCBkbm9kZSwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudFZOb2RlLCBwYXJlbnRJbnN0YW5jZSwgb2xkTmV4dFNpYmxpbmdzLCBuZXh0U2libGluZ3MpIHtcclxuICAgIGlmIChpc1dOb2RlKGRub2RlKSkge1xyXG4gICAgICAgIGNvbnN0IHsgaW5zdGFuY2UgfSA9IHByZXZpb3VzO1xyXG4gICAgICAgIGNvbnN0IHsgcGFyZW50Vk5vZGUsIGRub2RlOiBub2RlIH0gPSBpbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpO1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzUmVuZGVyZWQgPSBub2RlID8gbm9kZS5yZW5kZXJlZCA6IHByZXZpb3VzLnJlbmRlcmVkO1xyXG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGF0YSA9IHdpZGdldEluc3RhbmNlTWFwLmdldChpbnN0YW5jZSk7XHJcbiAgICAgICAgaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9IHRydWU7XHJcbiAgICAgICAgaW5zdGFuY2UuX19zZXRDb3JlUHJvcGVydGllc19fKGRub2RlLmNvcmVQcm9wZXJ0aWVzKTtcclxuICAgICAgICBpbnN0YW5jZS5fX3NldENoaWxkcmVuX18oZG5vZGUuY2hpbGRyZW4pO1xyXG4gICAgICAgIGluc3RhbmNlLl9fc2V0UHJvcGVydGllc19fKGRub2RlLnByb3BlcnRpZXMpO1xyXG4gICAgICAgIG5leHRTaWJsaW5nTWFwLnNldChpbnN0YW5jZSwgbmV4dFNpYmxpbmdzKTtcclxuICAgICAgICBkbm9kZS5pbnN0YW5jZSA9IGluc3RhbmNlO1xyXG4gICAgICAgIGlmIChpbnN0YW5jZURhdGEuZGlydHkgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVuZGVyZWQgPSBpbnN0YW5jZS5fX3JlbmRlcl9fKCk7XHJcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgZG5vZGUucmVuZGVyZWQgPSBmaWx0ZXJBbmREZWNvcmF0ZUNoaWxkcmVuKHJlbmRlcmVkLCBpbnN0YW5jZSk7XHJcbiAgICAgICAgICAgIHVwZGF0ZUNoaWxkcmVuKHBhcmVudFZOb2RlLCBvbGROZXh0U2libGluZ3MsIHByZXZpb3VzUmVuZGVyZWQsIGRub2RlLnJlbmRlcmVkLCBpbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBkbm9kZS5yZW5kZXJlZCA9IHByZXZpb3VzUmVuZGVyZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGluc3RhbmNlTWFwLnNldChpbnN0YW5jZSwgeyBkbm9kZSwgcGFyZW50Vk5vZGUgfSk7XHJcbiAgICAgICAgaW5zdGFuY2VEYXRhLm5vZGVIYW5kbGVyLmFkZFJvb3QoKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChwcmV2aW91cyA9PT0gZG5vZGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkb21Ob2RlID0gKGRub2RlLmRvbU5vZGUgPSBwcmV2aW91cy5kb21Ob2RlKTtcclxuICAgICAgICBsZXQgdGV4dFVwZGF0ZWQgPSBmYWxzZTtcclxuICAgICAgICBsZXQgdXBkYXRlZCA9IGZhbHNlO1xyXG4gICAgICAgIGlmICghZG5vZGUudGFnICYmIHR5cGVvZiBkbm9kZS50ZXh0ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBpZiAoZG5vZGUudGV4dCAhPT0gcHJldmlvdXMudGV4dCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3RG9tTm9kZSA9IGRvbU5vZGUub3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkbm9kZS50ZXh0KTtcclxuICAgICAgICAgICAgICAgIGRvbU5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobmV3RG9tTm9kZSwgZG9tTm9kZSk7XHJcbiAgICAgICAgICAgICAgICBkbm9kZS5kb21Ob2RlID0gbmV3RG9tTm9kZTtcclxuICAgICAgICAgICAgICAgIHRleHRVcGRhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0VXBkYXRlZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGRub2RlLnRhZyAmJiBkbm9kZS50YWcubGFzdEluZGV4T2YoJ3N2ZycsIDApID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9qZWN0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHByb2plY3Rpb25PcHRpb25zLCB7IG5hbWVzcGFjZTogTkFNRVNQQUNFX1NWRyB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocHJldmlvdXMuY2hpbGRyZW4gIT09IGRub2RlLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGZpbHRlckFuZERlY29yYXRlQ2hpbGRyZW4oZG5vZGUuY2hpbGRyZW4sIHBhcmVudEluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgIGRub2RlLmNoaWxkcmVuID0gY2hpbGRyZW47XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVkID1cclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlbihkbm9kZSwgb2xkTmV4dFNpYmxpbmdzLCBwcmV2aW91cy5jaGlsZHJlbiwgY2hpbGRyZW4sIHBhcmVudEluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucykgfHwgdXBkYXRlZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c1Byb3BlcnRpZXMgPSBidWlsZFByZXZpb3VzUHJvcGVydGllcyhkb21Ob2RlLCBwcmV2aW91cywgZG5vZGUpO1xyXG4gICAgICAgICAgICBpZiAoZG5vZGUuYXR0cmlidXRlcyAmJiBkbm9kZS5ldmVudHMpIHtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLmF0dHJpYnV0ZXMsIGRub2RlLmF0dHJpYnV0ZXMsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZWQgPVxyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVByb3BlcnRpZXMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLnByb3BlcnRpZXMsIGRub2RlLnByb3BlcnRpZXMsIHByb2plY3Rpb25PcHRpb25zLCBmYWxzZSkgfHwgdXBkYXRlZDtcclxuICAgICAgICAgICAgICAgIHJlbW92ZU9ycGhhbmVkRXZlbnRzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcy5ldmVudHMsIGRub2RlLmV2ZW50cywgcHJvamVjdGlvbk9wdGlvbnMsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRzID0gZG5vZGUuZXZlbnRzO1xyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZXZlbnRzKS5mb3JFYWNoKChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUV2ZW50KGRvbU5vZGUsIGV2ZW50LCBldmVudHNbZXZlbnRdLCBwcm9qZWN0aW9uT3B0aW9ucywgZG5vZGUucHJvcGVydGllcy5iaW5kLCBwcmV2aW91c1Byb3BlcnRpZXMuZXZlbnRzW2V2ZW50XSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZWQgPVxyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVByb3BlcnRpZXMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLnByb3BlcnRpZXMsIGRub2RlLnByb3BlcnRpZXMsIHByb2plY3Rpb25PcHRpb25zKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChkbm9kZS5wcm9wZXJ0aWVzLmtleSAhPT0gbnVsbCAmJiBkbm9kZS5wcm9wZXJ0aWVzLmtleSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQocGFyZW50SW5zdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VEYXRhLm5vZGVIYW5kbGVyLmFkZChkb21Ob2RlLCBgJHtkbm9kZS5wcm9wZXJ0aWVzLmtleX1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodXBkYXRlZCAmJiBkbm9kZS5wcm9wZXJ0aWVzICYmIGRub2RlLnByb3BlcnRpZXMudXBkYXRlQW5pbWF0aW9uKSB7XHJcbiAgICAgICAgICAgIGRub2RlLnByb3BlcnRpZXMudXBkYXRlQW5pbWF0aW9uKGRvbU5vZGUsIGRub2RlLnByb3BlcnRpZXMsIHByZXZpb3VzLnByb3BlcnRpZXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBhZGREZWZlcnJlZFByb3BlcnRpZXModm5vZGUsIHByb2plY3Rpb25PcHRpb25zKSB7XHJcbiAgICAvLyB0cmFuc2ZlciBhbnkgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBwYXNzZWQgLSBhcyB0aGVzZSBtdXN0IGJlIGRlY29yYXRlZCBwcm9wZXJ0aWVzXHJcbiAgICB2bm9kZS5kZWNvcmF0ZWREZWZlcnJlZFByb3BlcnRpZXMgPSB2bm9kZS5wcm9wZXJ0aWVzO1xyXG4gICAgY29uc3QgcHJvcGVydGllcyA9IHZub2RlLmRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrKCEhdm5vZGUuaW5zZXJ0ZWQpO1xyXG4gICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xyXG4gICAgdm5vZGUucHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oe30sIHByb3BlcnRpZXMsIHZub2RlLmRlY29yYXRlZERlZmVycmVkUHJvcGVydGllcyk7XHJcbiAgICBwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcclxuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbih7fSwgdm5vZGUuZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2soISF2bm9kZS5pbnNlcnRlZCksIHZub2RlLmRlY29yYXRlZERlZmVycmVkUHJvcGVydGllcyk7XHJcbiAgICAgICAgdXBkYXRlUHJvcGVydGllcyh2bm9kZS5kb21Ob2RlLCB2bm9kZS5wcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgdm5vZGUucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XHJcbiAgICB9KTtcclxufVxyXG5mdW5jdGlvbiBydW5EZWZlcnJlZFJlbmRlckNhbGxiYWNrcyhwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xyXG4gICAgaWYgKHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLmxlbmd0aCkge1xyXG4gICAgICAgIGlmIChwcm9qZWN0aW9uT3B0aW9ucy5zeW5jKSB7XHJcbiAgICAgICAgICAgIHdoaWxlIChwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gcHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3Muc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gcHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3Muc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gcnVuQWZ0ZXJSZW5kZXJDYWxsYmFja3MocHJvamVjdGlvbk9wdGlvbnMpIHtcclxuICAgIGNvbnN0IHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgIGlmIChwcm9qZWN0aW9uT3B0aW9ucy5zeW5jKSB7XHJcbiAgICAgICAgd2hpbGUgKHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKGdsb2JhbC5yZXF1ZXN0SWRsZUNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5yZXF1ZXN0SWRsZUNhbGxiYWNrKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHNjaGVkdWxlUmVuZGVyKHByb2plY3Rpb25PcHRpb25zKSB7XHJcbiAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XHJcbiAgICBpZiAocHJvamVjdGlvbk9wdGlvbnMuc3luYykge1xyXG4gICAgICAgIHJlbmRlcihwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChwcm9qZWN0b3JTdGF0ZS5yZW5kZXJTY2hlZHVsZWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHByb2plY3RvclN0YXRlLnJlbmRlclNjaGVkdWxlZCA9IGdsb2JhbC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICByZW5kZXIocHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHJlbmRlcihwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xyXG4gICAgcHJvamVjdG9yU3RhdGUucmVuZGVyU2NoZWR1bGVkID0gdW5kZWZpbmVkO1xyXG4gICAgY29uc3QgcmVuZGVyUXVldWUgPSBwcm9qZWN0b3JTdGF0ZS5yZW5kZXJRdWV1ZTtcclxuICAgIGNvbnN0IHJlbmRlcnMgPSBbLi4ucmVuZGVyUXVldWVdO1xyXG4gICAgcHJvamVjdG9yU3RhdGUucmVuZGVyUXVldWUgPSBbXTtcclxuICAgIHJlbmRlcnMuc29ydCgoYSwgYikgPT4gYS5kZXB0aCAtIGIuZGVwdGgpO1xyXG4gICAgY29uc3QgcHJldmlvdXNseVJlbmRlcmVkID0gW107XHJcbiAgICB3aGlsZSAocmVuZGVycy5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCB7IGluc3RhbmNlIH0gPSByZW5kZXJzLnNoaWZ0KCk7XHJcbiAgICAgICAgaWYgKGluc3RhbmNlTWFwLmhhcyhpbnN0YW5jZSkgJiYgcHJldmlvdXNseVJlbmRlcmVkLmluZGV4T2YoaW5zdGFuY2UpID09PSAtMSkge1xyXG4gICAgICAgICAgICBwcmV2aW91c2x5UmVuZGVyZWQucHVzaChpbnN0YW5jZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgcGFyZW50Vk5vZGUsIGRub2RlIH0gPSBpbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICBjb25zdCBuZXh0U2libGluZ3MgPSBuZXh0U2libGluZ01hcC5nZXQoaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICB1cGRhdGVEb20oZG5vZGUsIHRvSW50ZXJuYWxXTm9kZShpbnN0YW5jZSwgaW5zdGFuY2VEYXRhKSwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudFZOb2RlLCBpbnN0YW5jZSwgbmV4dFNpYmxpbmdzLCBuZXh0U2libGluZ3MpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJ1bkFmdGVyUmVuZGVyQ2FsbGJhY2tzKHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgIHJ1bkRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzKHByb2plY3Rpb25PcHRpb25zKTtcclxufVxyXG5leHBvcnQgY29uc3QgZG9tID0ge1xyXG4gICAgYXBwZW5kOiBmdW5jdGlvbiAocGFyZW50Tm9kZSwgaW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zID0ge30pIHtcclxuICAgICAgICBjb25zdCBpbnN0YW5jZURhdGEgPSB3aWRnZXRJbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpO1xyXG4gICAgICAgIGNvbnN0IGZpbmFsUHJvamVjdG9yT3B0aW9ucyA9IGdldFByb2plY3Rpb25PcHRpb25zKHByb2plY3Rpb25PcHRpb25zLCBpbnN0YW5jZSk7XHJcbiAgICAgICAgY29uc3QgcHJvamVjdG9yU3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGFmdGVyUmVuZGVyQ2FsbGJhY2tzOiBbXSxcclxuICAgICAgICAgICAgZGVmZXJyZWRSZW5kZXJDYWxsYmFja3M6IFtdLFxyXG4gICAgICAgICAgICBub2RlTWFwOiBuZXcgV2Vha01hcCgpLFxyXG4gICAgICAgICAgICByZW5kZXJTY2hlZHVsZWQ6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgcmVuZGVyUXVldWU6IFtdLFxyXG4gICAgICAgICAgICBtZXJnZTogcHJvamVjdGlvbk9wdGlvbnMubWVyZ2UgfHwgZmFsc2UsXHJcbiAgICAgICAgICAgIG1lcmdlRWxlbWVudDogcHJvamVjdGlvbk9wdGlvbnMubWVyZ2VFbGVtZW50XHJcbiAgICAgICAgfTtcclxuICAgICAgICBwcm9qZWN0b3JTdGF0ZU1hcC5zZXQoaW5zdGFuY2UsIHByb2plY3RvclN0YXRlKTtcclxuICAgICAgICBmaW5hbFByb2plY3Rvck9wdGlvbnMucm9vdE5vZGUgPSBwYXJlbnROb2RlO1xyXG4gICAgICAgIGNvbnN0IHBhcmVudFZOb2RlID0gdG9QYXJlbnRWTm9kZShmaW5hbFByb2plY3Rvck9wdGlvbnMucm9vdE5vZGUpO1xyXG4gICAgICAgIGNvbnN0IG5vZGUgPSB0b0ludGVybmFsV05vZGUoaW5zdGFuY2UsIGluc3RhbmNlRGF0YSk7XHJcbiAgICAgICAgaW5zdGFuY2VNYXAuc2V0KGluc3RhbmNlLCB7IGRub2RlOiBub2RlLCBwYXJlbnRWTm9kZSB9KTtcclxuICAgICAgICBpbnN0YW5jZURhdGEuaW52YWxpZGF0ZSA9ICgpID0+IHtcclxuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLmRpcnR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9qZWN0b3JTdGF0ZS5yZW5kZXJRdWV1ZS5wdXNoKHsgaW5zdGFuY2UsIGRlcHRoOiBmaW5hbFByb2plY3Rvck9wdGlvbnMuZGVwdGggfSk7XHJcbiAgICAgICAgICAgICAgICBzY2hlZHVsZVJlbmRlcihmaW5hbFByb2plY3Rvck9wdGlvbnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB1cGRhdGVEb20obm9kZSwgbm9kZSwgZmluYWxQcm9qZWN0b3JPcHRpb25zLCBwYXJlbnRWTm9kZSwgaW5zdGFuY2UsIFtdLCBbXSk7XHJcbiAgICAgICAgcHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MucHVzaCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5vbkF0dGFjaCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJ1bkRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzKGZpbmFsUHJvamVjdG9yT3B0aW9ucyk7XHJcbiAgICAgICAgcnVuQWZ0ZXJSZW5kZXJDYWxsYmFja3MoZmluYWxQcm9qZWN0b3JPcHRpb25zKTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBkb21Ob2RlOiBmaW5hbFByb2plY3Rvck9wdGlvbnMucm9vdE5vZGVcclxuICAgICAgICB9O1xyXG4gICAgfSxcclxuICAgIGNyZWF0ZTogZnVuY3Rpb24gKGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwgaW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgIH0sXHJcbiAgICBtZXJnZTogZnVuY3Rpb24gKGVsZW1lbnQsIGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyA9IHt9KSB7XHJcbiAgICAgICAgcHJvamVjdGlvbk9wdGlvbnMubWVyZ2UgPSB0cnVlO1xyXG4gICAgICAgIHByb2plY3Rpb25PcHRpb25zLm1lcmdlRWxlbWVudCA9IGVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbiA9IHRoaXMuYXBwZW5kKGVsZW1lbnQucGFyZW50Tm9kZSwgaW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICBjb25zdCBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChpbnN0YW5jZSk7XHJcbiAgICAgICAgcHJvamVjdG9yU3RhdGUubWVyZ2UgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gcHJvamVjdGlvbjtcclxuICAgIH1cclxufTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmRvbS5tanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL3Zkb20ubWpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvdmRvbS5tanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiLyoqKiBJTVBPUlRTIEZST00gaW1wb3J0cy1sb2FkZXIgKioqL1xudmFyIHdpZGdldEZhY3RvcnkgPSByZXF1aXJlKFwic3JjL21lbnUvTWVudVwiKTtcblxudmFyIHJlZ2lzdGVyQ3VzdG9tRWxlbWVudCA9IHJlcXVpcmUoJ0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9yZWdpc3RlckN1c3RvbUVsZW1lbnQnKS5kZWZhdWx0O1xyXG5cclxudmFyIGRlZmF1bHRFeHBvcnQgPSB3aWRnZXRGYWN0b3J5LmRlZmF1bHQ7XHJcbmRlZmF1bHRFeHBvcnQgJiYgcmVnaXN0ZXJDdXN0b21FbGVtZW50KGRlZmF1bHRFeHBvcnQpO1xyXG5cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2ltcG9ydHMtbG9hZGVyP3dpZGdldEZhY3Rvcnk9c3JjL21lbnUvTWVudSEuL25vZGVfbW9kdWxlcy9AZG9qby9jbGktYnVpbGQtd2lkZ2V0L3RlbXBsYXRlL2N1c3RvbS1lbGVtZW50LmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9pbXBvcnRzLWxvYWRlci9pbmRleC5qcz93aWRnZXRGYWN0b3J5PXNyYy9tZW51L01lbnUhLi9ub2RlX21vZHVsZXMvQGRvam8vY2xpLWJ1aWxkLXdpZGdldC90ZW1wbGF0ZS9jdXN0b20tZWxlbWVudC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanNcbi8vIG1vZHVsZSBjaHVua3MgPSBtZW51IiwiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcclxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcclxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuXHJcblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxyXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxyXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxyXG5cclxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXHJcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDApXHJcbiAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUocmVzdWx0LnZhbHVlKTsgfSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSB5W29wWzBdICYgMiA/IFwicmV0dXJuXCIgOiBvcFswXSA/IFwidGhyb3dcIiA6IFwibmV4dFwiXSkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbMCwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIGV4cG9ydHMpIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKCFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBleHBvcnRzW3BdID0gbVtwXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgIH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChvW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9OyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpIHx8ICgxLGV2YWwpKFwidGhpc1wiKTtcbn0gY2F0Y2goZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZih0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKVxuXHRcdGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vICh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvd2VicGFjay9idWlsZGluL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IG1lbnUiLCJpbXBvcnQgeyB2IH0gZnJvbSAnQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2QnO1xyXG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvY3VzdG9tRWxlbWVudCc7XHJcbmltcG9ydCB7IFdpZGdldFByb3BlcnRpZXMsIFdOb2RlIH0gZnJvbSAnQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyB0aGVtZSwgVGhlbWVkTWl4aW4gfSBmcm9tICdAZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvbWl4aW5zL1RoZW1lZCc7XHJcbmltcG9ydCB7IFdpZGdldEJhc2UgfSBmcm9tICdAZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvV2lkZ2V0QmFzZSc7XHJcbmltcG9ydCB7IE1lbnVJdGVtLCBNZW51SXRlbVByb3BlcnRpZXMgfSBmcm9tICcuLi9tZW51LWl0ZW0vTWVudUl0ZW0nO1xyXG5cclxuaW1wb3J0ICogYXMgY3NzIGZyb20gJy4vbWVudS5tLmNzcyc7XHJcblxyXG5pbnRlcmZhY2UgTWVudVByb3BlcnRpZXMgZXh0ZW5kcyBXaWRnZXRQcm9wZXJ0aWVzIHtcclxuXHRvblNlbGVjdGVkOiAoZGF0YTogYW55KSA9PiB2b2lkO1xyXG59XHJcblxyXG5AY3VzdG9tRWxlbWVudDxNZW51UHJvcGVydGllcz4oe1xyXG5cdHRhZzogJ2RlbW8tbWVudScsXHJcblx0ZXZlbnRzOiBbJ29uU2VsZWN0ZWQnXVxyXG59KVxyXG5AdGhlbWUoY3NzKVxyXG5leHBvcnQgY2xhc3MgTWVudSBleHRlbmRzIFRoZW1lZE1peGluKFdpZGdldEJhc2UpPE1lbnVQcm9wZXJ0aWVzLCBXTm9kZTxNZW51SXRlbT4+IHtcclxuXHRwcml2YXRlIF9zZWxlY3RlZElkOiBudW1iZXI7XHJcblxyXG5cdHByaXZhdGUgX29uU2VsZWN0ZWQoaWQ6IG51bWJlciwgZGF0YTogYW55KSB7XHJcblx0XHR0aGlzLl9zZWxlY3RlZElkID0gaWQ7XHJcblx0XHR0aGlzLnByb3BlcnRpZXMub25TZWxlY3RlZChkYXRhKTtcclxuXHRcdHRoaXMuaW52YWxpZGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0cHJvdGVjdGVkIHJlbmRlcigpIHtcclxuXHRcdGNvbnN0IGl0ZW1zID0gdGhpcy5jaGlsZHJlbi5tYXAoKGNoaWxkLCBpbmRleCkgPT4ge1xyXG5cdFx0XHRpZiAoY2hpbGQpIHtcclxuXHRcdFx0XHRjb25zdCBwcm9wZXJ0aWVzOiBQYXJ0aWFsPE1lbnVJdGVtUHJvcGVydGllcz4gPSB7XHJcblx0XHRcdFx0XHRvblNlbGVjdGVkOiAoZGF0YTogYW55KSA9PiB7XHJcblx0XHRcdFx0XHRcdHRoaXMuX29uU2VsZWN0ZWQoaW5kZXgsIGRhdGEpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH07XHJcblx0XHRcdFx0aWYgKHRoaXMuX3NlbGVjdGVkSWQgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0cHJvcGVydGllcy5zZWxlY3RlZCA9IGluZGV4ID09PSB0aGlzLl9zZWxlY3RlZElkO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRjaGlsZC5wcm9wZXJ0aWVzID0geyAuLi5jaGlsZC5wcm9wZXJ0aWVzLCAuLi5wcm9wZXJ0aWVzIH07XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGNoaWxkO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0cmV0dXJuIHYoJ25hdicsIHsgY2xhc3NlczogdGhpcy50aGVtZShjc3Mucm9vdCkgfSwgW1xyXG5cdFx0XHR2KFxyXG5cdFx0XHRcdCdvbCcsXHJcblx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0Y2xhc3NlczogdGhpcy50aGVtZShjc3MubWVudUNvbnRhaW5lcilcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGl0ZW1zXHJcblx0XHRcdClcclxuXHRcdF0pO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWVudTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWR0cy1sb2FkZXI/dHlwZT10cyZpbnN0YW5jZU5hbWU9MF9tZW51IS4vc3JjL21lbnUvTWVudS50cyIsIi8vIHJlbW92ZWQgYnkgZXh0cmFjdC10ZXh0LXdlYnBhY2stcGx1Z2luXG5tb2R1bGUuZXhwb3J0cyA9IHtcIiBfa2V5XCI6XCJ0ZXN0LWFwcC9tZW51XCIsXCJyb290XCI6XCJtZW51LW1fX3Jvb3RfXzNiQTZqXCIsXCJtZW51Q29udGFpbmVyXCI6XCJtZW51LW1fX21lbnVDb250YWluZXJfXzFlb0dmXCJ9O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL21lbnUvbWVudS5tLmNzc1xuLy8gbW9kdWxlIGlkID0gLi9zcmMvbWVudS9tZW51Lm0uY3NzXG4vLyBtb2R1bGUgY2h1bmtzID0gbWVudSJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/test-app/fixtures/windows/dist/menu-item/menu-item-1.0.0.js b/test-app/fixtures/windows/dist/menu-item/menu-item-1.0.0.js index f805ed0..3e1453e 100644 --- a/test-app/fixtures/windows/dist/menu-item/menu-item-1.0.0.js +++ b/test-app/fixtures/windows/dist/menu-item/menu-item-1.0.0.js @@ -6,7 +6,7 @@ * All rights reserved * */ -!function(e){var t={};function o(r){if(t[r])return t[r].exports;var s=t[r]={i:r,l:!1,exports:{}};return e[r].call(s.exports,s,s.exports,o),s.l=!0,s.exports}o.m=e,o.c=t,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}({"./node_modules/@dojo/core/Destroyable.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/core/lang.mjs"),s=o("./node_modules/@dojo/shim/Promise.mjs");function n(){return s.a.resolve(!1)}function i(){throw new Error("Call made to destroyed method")}class d{constructor(){this.handles=[]}own(e){const t=Array.isArray(e)?Object(r.b)(...e):e,{handles:o}=this;return o.push(t),{destroy(){o.splice(o.indexOf(t)),t.destroy()}}}destroy(){return new s.a(e=>{this.handles.forEach(e=>{e&&e.destroy&&e.destroy()}),this.destroy=n,this.own=i,e(!0)})}}t.a=d},"./node_modules/@dojo/core/Evented.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/Map.mjs"),s=o("./node_modules/@dojo/core/Destroyable.mjs");const n=new r.b;class i extends s.a{constructor(){super(...arguments),this.listenersMap=new r.b}emit(e){this.listenersMap.forEach((t,o)=>{(function(e,t){if("string"==typeof t&&"string"==typeof e&&-1!==e.indexOf("*")){let o;return n.has(e)?o=n.get(e):(o=new RegExp(`^${e.replace(/\*/g,".*")}$`),n.set(e,o)),o.test(t)}return e===t})(o,e.type)&&t.forEach(t=>{t.call(this,e)})})}on(e,t){if(Array.isArray(t)){const o=t.map(t=>this._addListener(e,t));return{destroy(){o.forEach(e=>e.destroy())}}}return this._addListener(e,t)}_addListener(e,t){const o=this.listenersMap.get(e)||[];return o.push(t),this.listenersMap.set(e,o),{destroy:()=>{const o=this.listenersMap.get(e)||[];o.splice(o.indexOf(t),1)}}}}t.a=i},"./node_modules/@dojo/core/lang.mjs":function(e,t,o){"use strict";t.b=function(...e){return function(e){let t=!1;return{destroy:function(){t||(t=!0,e())}}}(function(){for(let t=0;t{r[e]=t,delete n[e]},()=>{delete n[e]})}function l(e){let t;const o=e.toLowerCase();if(o in a)t=a[o];else if(s[o])t=r[o]=s[o].call(null),delete s[o];else{if(!(o in r)){if(e in n)return!1;throw new TypeError(`Attempt to detect unregistered has feature "${e}"`)}t=r[o]}return t}c("debug",!0),c("host-browser","undefined"!=typeof document&&"undefined"!=typeof location),c("host-node",function(){if("object"==typeof o&&o.versions&&o.versions.node)return o.versions.node})}).call(t,o("./node_modules/webpack/buildin/global.js"),o("./node_modules/process/browser.js"))},"./node_modules/@dojo/shim/Map.mjs":function(e,t,o){"use strict";o.d(t,"a",function(){return s});o("./node_modules/@dojo/shim/iterator.mjs");var r=o("./node_modules/@dojo/shim/global.mjs");o("./node_modules/@dojo/shim/object.mjs"),o("./node_modules/@dojo/shim/support/has.mjs"),o("./node_modules/@dojo/shim/Symbol.mjs");let s=r.a.Map;t.b=s},"./node_modules/@dojo/shim/Promise.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/global.mjs");o("./node_modules/@dojo/shim/support/queue.mjs"),o("./node_modules/@dojo/shim/Symbol.mjs"),o("./node_modules/@dojo/shim/support/has.mjs");let s=r.a.Promise;t.a=s},"./node_modules/@dojo/shim/Symbol.mjs":function(e,t,o){"use strict";o("./node_modules/@dojo/shim/support/has.mjs");var r=o("./node_modules/@dojo/shim/global.mjs"),s=o("./node_modules/@dojo/shim/support/util.mjs");let n=r.a.Symbol;["hasInstance","isConcatSpreadable","iterator","species","replace","search","split","match","toPrimitive","toStringTag","unscopables","observable"].forEach(e=>{n[e]||Object.defineProperty(n,e,Object(s.a)(n.for(e),!1,!1))}),t.a=n},"./node_modules/@dojo/shim/WeakMap.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/global.mjs");o("./node_modules/@dojo/shim/iterator.mjs"),o("./node_modules/@dojo/shim/support/has.mjs"),o("./node_modules/@dojo/shim/Symbol.mjs");let s=r.a.WeakMap;t.a=s},"./node_modules/@dojo/shim/array.mjs":function(e,t,o){"use strict";o.d(t,"a",function(){return n});var r=o("./node_modules/@dojo/shim/global.mjs"),s=(o("./node_modules/@dojo/shim/iterator.mjs"),o("./node_modules/@dojo/shim/number.mjs"),o("./node_modules/@dojo/shim/support/has.mjs"),o("./node_modules/@dojo/shim/support/util.mjs"));let n,i,d,a,c,l,u;n=r.a.Array.from,i=r.a.Array.of,d=Object(s.b)(r.a.Array.prototype.copyWithin),a=Object(s.b)(r.a.Array.prototype.fill),c=Object(s.b)(r.a.Array.prototype.find),l=Object(s.b)(r.a.Array.prototype.findIndex),u=Object(s.b)(r.a.Array.prototype.includes)},"./node_modules/@dojo/shim/global.mjs":function(e,t,o){"use strict";(function(e){const o=void 0!==e?e:"undefined"!=typeof window?window:"undefined"!=typeof self?self:void 0;t.a=o}).call(t,o("./node_modules/webpack/buildin/global.js"))},"./node_modules/@dojo/shim/iterator.mjs":function(e,t,o){"use strict";o("./node_modules/@dojo/shim/Symbol.mjs"),o("./node_modules/@dojo/shim/string.mjs")},"./node_modules/@dojo/shim/number.mjs":function(e,t,o){"use strict";o("./node_modules/@dojo/shim/global.mjs");Math.pow(2,53)},"./node_modules/@dojo/shim/object.mjs":function(e,t,o){"use strict";o.d(t,"a",function(){return s});var r=o("./node_modules/@dojo/shim/global.mjs");o("./node_modules/@dojo/shim/support/has.mjs"),o("./node_modules/@dojo/shim/Symbol.mjs");let s,n,i,d,a,c,l,u,h;{const e=r.a.Object;s=e.assign,n=e.getOwnPropertyDescriptor,i=e.getOwnPropertyNames,d=e.getOwnPropertySymbols,a=e.is,c=e.keys}{const e=r.a.Object;l=e.getOwnPropertyDescriptors,u=e.entries,h=e.values}},"./node_modules/@dojo/shim/string.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/global.mjs"),s=(o("./node_modules/@dojo/shim/support/has.mjs"),o("./node_modules/@dojo/shim/support/util.mjs"));t.b=55296;t.a=56319;let n,i,d,a,c,l,u,h,p,m;n=r.a.String.fromCodePoint,i=r.a.String.raw,d=Object(s.b)(r.a.String.prototype.codePointAt),a=Object(s.b)(r.a.String.prototype.endsWith),c=Object(s.b)(r.a.String.prototype.includes),l=Object(s.b)(r.a.String.prototype.normalize),u=Object(s.b)(r.a.String.prototype.repeat),h=Object(s.b)(r.a.String.prototype.startsWith),p=Object(s.b)(r.a.String.prototype.padEnd),m=Object(s.b)(r.a.String.prototype.padStart)},"./node_modules/@dojo/shim/support/has.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/has/has.mjs"),s=o("./node_modules/@dojo/shim/global.mjs");r.b;Object(r.a)("es6-array",()=>["from","of"].every(e=>e in s.a.Array)&&["findIndex","find","copyWithin"].every(e=>e in s.a.Array.prototype),!0),Object(r.a)("es6-array-fill",()=>"fill"in s.a.Array.prototype&&1===[1].fill(9,Number.POSITIVE_INFINITY)[0],!0),Object(r.a)("es7-array",()=>"includes"in s.a.Array.prototype,!0),Object(r.a)("es6-map",()=>{if("function"==typeof s.a.Map)try{const e=new s.a.Map([[0,1]]);return e.has(0)&&"function"==typeof e.keys&&"function"==typeof e.values&&"function"==typeof e.entries}catch(e){return!1}return!1},!0),Object(r.a)("es6-math",()=>["clz32","sign","log10","log2","log1p","expm1","cosh","sinh","tanh","acosh","asinh","atanh","trunc","fround","cbrt","hypot"].every(e=>"function"==typeof s.a.Math[e]),!0),Object(r.a)("es6-math-imul",()=>"imul"in s.a.Math&&-5===Math.imul(4294967295,5),!0),Object(r.a)("es6-object",()=>["assign","is","getOwnPropertySymbols","setPrototypeOf"].every(e=>"function"==typeof s.a.Object[e]),!0),Object(r.a)("es2017-object",()=>["values","entries","getOwnPropertyDescriptors"].every(e=>"function"==typeof s.a.Object[e]),!0),Object(r.a)("es-observable",()=>void 0!==s.a.Observable,!0),Object(r.a)("es6-promise",()=>void 0!==s.a.Promise&&!0,!0),Object(r.a)("es6-set",()=>{if("function"==typeof s.a.Set){const e=new s.a.Set([1]);return e.has(1)&&"keys"in e&&"function"==typeof e.keys&&!0}return!1},!0),Object(r.a)("es6-string",()=>["fromCodePoint"].every(e=>"function"==typeof s.a.String[e])&&["codePointAt","normalize","repeat","startsWith","endsWith","includes"].every(e=>"function"==typeof s.a.String.prototype[e]),!0),Object(r.a)("es6-string-raw",()=>{function e(e,...t){const o=[...e];return o.raw=e.raw,o}if("raw"in s.a.String){let t=e`a\n${1}`;return t.raw=["a\\n"],"a:\\n"===s.a.String.raw(t,42)}return!1},!0),Object(r.a)("es2017-string",()=>["padStart","padEnd"].every(e=>"function"==typeof s.a.String.prototype[e]),!0),Object(r.a)("es6-symbol",()=>void 0!==s.a.Symbol&&"symbol"==typeof Symbol(),!0),Object(r.a)("es6-weakmap",()=>{if(void 0!==s.a.WeakMap){const e={},t={},o=new s.a.WeakMap([[e,1]]);return Object.freeze(e),1===o.get(e)&&o.set(t,2)===o&&!0}return!1},!0),Object(r.a)("microtasks",()=>!0,!0),Object(r.a)("postmessage",()=>void 0!==s.a.window&&"function"==typeof s.a.postMessage,!0),Object(r.a)("raf",()=>"function"==typeof s.a.requestAnimationFrame,!0),Object(r.a)("setimmediate",()=>void 0!==s.a.setImmediate,!0),Object(r.a)("dom-mutationobserver",()=>{if(Boolean(s.a.MutationObserver||s.a.WebKitMutationObserver)){const e=document.createElement("div"),t=new(s.a.MutationObserver||s.a.WebKitMutationObserver)(function(){});return t.observe(e,{attributes:!0}),e.style.setProperty("display","block"),Boolean(t.takeRecords().length)}return!1},!0),Object(r.a)("dom-webanimation",()=>void 0!==s.a.Animation&&void 0!==s.a.KeyframeEffect,!0)},"./node_modules/@dojo/shim/support/queue.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/global.mjs");o("./node_modules/@dojo/shim/support/has.mjs");function s(e){e&&e.isActive&&e.callback&&e.callback()}function n(e,t){return{destroy:function(){this.destroy=function(){},e.isActive=!1,e.callback=null,t&&t()}}}!function(){let e,t;{const e=[];r.a.addEventListener("message",function(t){t.source===r.a&&"dojo-queue-message"===t.data&&(t.stopPropagation(),e.length&&s(e.shift()))}),t=function(t){e.push(t),r.a.postMessage("dojo-queue-message","*")}}function o(o){const r={isActive:!0,callback:o},s=t(r);return n(r,e&&function(){e(s)})}}();!function(){function e(e){const t={isActive:!0,callback:e},o=requestAnimationFrame(s.bind(null,t));return n(t,function(){cancelAnimationFrame(o)})}}();!function(){let e;e=function(e){r.a.Promise.resolve(e).then(s)}}()},"./node_modules/@dojo/shim/support/util.mjs":function(e,t,o){"use strict";t.a=function(e,t=!1,o=!0,r=!0){return{value:e,enumerable:t,writable:o,configurable:r}},t.b=function(e){return function(t,...o){return e.apply(t,o)}}},"./node_modules/@dojo/widget-core/Injector.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/core/Evented.mjs");class s extends r.a{constructor(e){super(),this._payload=e}setInvalidator(e){this._invalidator=e}get(){return this._payload}set(e){this._payload=e,this._invalidator&&this._invalidator()}}t.a=s},"./node_modules/@dojo/widget-core/NodeHandler.mjs":function(e,t,o){"use strict";var r,s=o("./node_modules/@dojo/core/Evented.mjs"),n=o("./node_modules/@dojo/shim/Map.mjs");!function(e){e.Projector="Projector",e.Widget="Widget"}(r||(r={}));t.a=class extends s.a{constructor(){super(...arguments),this._nodeMap=new n.b}get(e){return this._nodeMap.get(e)}has(e){return this._nodeMap.has(e)}add(e,t){this._nodeMap.set(t,e),this.emit({type:t})}addRoot(){this.emit({type:r.Widget})}addProjector(){this.emit({type:r.Projector})}clear(){this._nodeMap.clear()}}},"./node_modules/@dojo/widget-core/Registry.mjs":function(e,t,o){"use strict";t.d=a;var r=o("./node_modules/@dojo/shim/Promise.mjs"),s=o("./node_modules/@dojo/shim/Map.mjs"),n=o("./node_modules/@dojo/shim/Symbol.mjs"),i=o("./node_modules/@dojo/core/Evented.mjs");const d=Object(n.a)("Widget Base");function a(e){return Boolean(e&&e._type===d)}t.b=d;class c extends i.a{emitLoadedEvent(e,t){this.emit({type:e,action:"loaded",item:t})}define(e,t){if(void 0===this._widgetRegistry&&(this._widgetRegistry=new s.b),this._widgetRegistry.has(e))throw new Error(`widget has already been registered for '${e.toString()}'`);this._widgetRegistry.set(e,t),t instanceof r.a?t.then(t=>(this._widgetRegistry.set(e,t),this.emitLoadedEvent(e,t),t),e=>{throw e}):a(t)&&this.emitLoadedEvent(e,t)}defineInjector(e,t){if(void 0===this._injectorRegistry&&(this._injectorRegistry=new s.b),this._injectorRegistry.has(e))throw new Error(`injector has already been registered for '${e.toString()}'`);const o=new i.a,r={injector:t(()=>o.emit({type:"invalidate"})),invalidator:o};this._injectorRegistry.set(e,r),this.emitLoadedEvent(e,r)}get(e){if(!this._widgetRegistry||!this.has(e))return null;const t=this._widgetRegistry.get(e);if(a(t))return t;if(t instanceof r.a)return null;const o=t();return this._widgetRegistry.set(e,o),o.then(t=>((function(e){return Boolean(e&&e.hasOwnProperty("__esModule")&&e.hasOwnProperty("default")&&a(e.default))})(t)&&(t=t.default),this._widgetRegistry.set(e,t),this.emitLoadedEvent(e,t),t),e=>{throw e}),null}getInjector(e){return this._injectorRegistry&&this.hasInjector(e)?this._injectorRegistry.get(e):null}has(e){return Boolean(this._widgetRegistry&&this._widgetRegistry.has(e))}hasInjector(e){return Boolean(this._injectorRegistry&&this._injectorRegistry.has(e))}}t.a=c,t.c=c},"./node_modules/@dojo/widget-core/RegistryHandler.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/Map.mjs"),s=o("./node_modules/@dojo/core/Evented.mjs"),n=o("./node_modules/@dojo/widget-core/Registry.mjs");t.a=class extends s.a{constructor(){super(),this._registry=new n.a,this._registryWidgetLabelMap=new r.a,this._registryInjectorLabelMap=new r.a,this.own(this._registry),this.own({destroy:()=>{this.baseRegistry&&(this._registryWidgetLabelMap.delete(this.baseRegistry),this._registryInjectorLabelMap.delete(this.baseRegistry),this.baseRegistry=void 0)}})}set base(e){this.baseRegistry&&(this._registryWidgetLabelMap.delete(this.baseRegistry),this._registryInjectorLabelMap.delete(this.baseRegistry)),this.baseRegistry=e}define(e,t){this._registry.define(e,t)}defineInjector(e,t){this._registry.defineInjector(e,t)}has(e){return this._registry.has(e)||Boolean(this.baseRegistry&&this.baseRegistry.has(e))}hasInjector(e){return this._registry.hasInjector(e)||Boolean(this.baseRegistry&&this.baseRegistry.hasInjector(e))}get(e,t=!1){return this._get(e,t,"get",this._registryWidgetLabelMap)}getInjector(e,t=!1){return this._get(e,t,"getInjector",this._registryInjectorLabelMap)}_get(e,t,o,r){const s=t?[this.baseRegistry,this._registry]:[this._registry,this.baseRegistry];for(let n=0;n{"loaded"===r.action&&this[o](e,t)===r.item&&this.emit({type:"invalidate"})});this.own(s),r.set(i,[...a,e])}}return null}}},"./node_modules/@dojo/widget-core/WidgetBase.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/Map.mjs"),s=o("./node_modules/@dojo/shim/WeakMap.mjs"),n=o("./node_modules/@dojo/shim/Symbol.mjs"),i=o("./node_modules/@dojo/widget-core/d.mjs"),d=o("./node_modules/@dojo/widget-core/diff.mjs"),a=o("./node_modules/@dojo/widget-core/RegistryHandler.mjs"),c=o("./node_modules/@dojo/widget-core/NodeHandler.mjs"),l=o("./node_modules/@dojo/widget-core/vdom.mjs"),u=o("./node_modules/@dojo/widget-core/Registry.mjs");const h=new r.b,p=d.a.bind(null),m=n.a.for("dojoNoBind");t.b=m;class f{constructor(){this._initialProperties=!0,this._changedPropertyKeys=[],this._nodeHandler=new c.a,this._handles=[],this._children=[],this._decoratorCache=new r.b,this._properties={},this._boundRenderFunc=this.render.bind(this),this._boundInvalidate=this.invalidate.bind(this),l.b.set(this,{dirty:!0,onAttach:()=>{this.onAttach()},onDetach:()=>{this.onDetach(),this.destroy()},nodeHandler:this._nodeHandler,registry:()=>this.registry,coreProperties:{},rendering:!1,inputProperties:{}}),this._runAfterConstructors()}meta(e){void 0===this._metaMap&&(this._metaMap=new r.b);let t=this._metaMap.get(e);return t||(t=new e({invalidate:this._boundInvalidate,nodeHandler:this._nodeHandler,bind:this}),this.own(t),this._metaMap.set(e,t)),t}onAttach(){}onDetach(){}get properties(){return this._properties}get changedPropertyKeys(){return[...this._changedPropertyKeys]}__setCoreProperties__(e){const{baseRegistry:t}=e,o=l.b.get(this);o.coreProperties.baseRegistry!==t&&(void 0===this._registry&&(this._registry=new a.a,this.own(this._registry),this.own(this._registry.on("invalidate",this._boundInvalidate))),this._registry.base=t,this.invalidate()),o.coreProperties=e}__setProperties__(e){const t=l.b.get(this);t.inputProperties=e;const o=this._runBeforeProperties(e),r=this.getDecorator("registeredDiffProperty"),s=[],n=Object.keys(o);if(!1===this._initialProperties||0!==r.length){const e=[...n,...Object.keys(this._properties)],i=[],d={};let a=!1;for(let n=0;n{e.changed&&t.call(this,e.previousProperties,e.newProperties)}),this._properties=d,this._changedPropertyKeys=s}else{this._initialProperties=!1;for(let e=0;e0&&this.invalidate()}get children(){return this._children}__setChildren__(e){(this._children.length>0||e.length>0)&&(this._children=e,this.invalidate())}__render__(){l.b.get(this).dirty=!1;let e=this._runBeforeRenders()();return e=this.runAfterRenders(e),this._nodeHandler.clear(),e}invalidate(){const e=l.b.get(this);e.invalidate&&e.invalidate()}render(){return Object(i.g)("div",{},this.children)}addDecorator(e,t){if(t=Array.isArray(t)?t:[t],this.hasOwnProperty("constructor")){let o=h.get(this.constructor);o||(o=new r.b,h.set(this.constructor,o));let s=o.get(e);s||(s=[],o.set(e,s)),s.push(...t)}else{const o=this.getDecorator(e);this._decoratorCache.set(e,[...o,...t])}}_buildDecoratorList(e){const t=[];let o=this.constructor;for(;o;){const r=h.get(o);if(r){const o=r.get(e);o&&t.unshift(...o)}o=Object.getPrototypeOf(o)}return t}getDecorator(e){let t=this._decoratorCache.get(e);return void 0!==t?t:(t=this._buildDecoratorList(e),this._decoratorCache.set(e,t),t)}_mapDiffPropertyReactions(e,t){return this.getDecorator("diffReaction").reduce((o,{reaction:r,propertyName:s})=>{let n=o.get(r);return void 0===n&&(n={previousProperties:{},newProperties:{},changed:!1}),n.previousProperties[s]=this._properties[s],n.newProperties[s]=e[s],-1!==t.indexOf(s)&&(n.changed=!0),o.set(r,n),o},new r.b)}_bindFunctionProperty(e,t){if("function"==typeof e&&!e[m]&&!1===Object(u.d)(e)){void 0===this._bindFunctionPropertyMap&&(this._bindFunctionPropertyMap=new s.a);const o=this._bindFunctionPropertyMap.get(e)||{};let{boundFunc:r,scope:n}=o;return void 0!==r&&n===t||(r=e.bind(t),this._bindFunctionPropertyMap.set(e,{boundFunc:r,scope:t})),r}return e}get registry(){return void 0===this._registry&&(this._registry=new a.a,this.own(this._registry),this.own(this._registry.on("invalidate",this._boundInvalidate))),this._registry}_runBeforeProperties(e){const t=this.getDecorator("beforeProperties");return t.length>0?t.reduce((e,t)=>Object.assign({},e,t.call(this,e)),Object.assign({},e)):e}_runBeforeRenders(){const e=this.getDecorator("beforeRender");return e.length>0?e.reduce((e,t)=>{const o=t.call(this,e,this._properties,this._children);return o||(console.warn("Render function not returned from beforeRender, using previous render"),e)},this._boundRenderFunc):this._boundRenderFunc}runAfterRenders(e){const t=this.getDecorator("afterRender");return t.length>0?t.reduce((e,t)=>t.call(this,e),e):(void 0!==this._metaMap&&this._metaMap.forEach(e=>{e.afterRender()}),e)}_runAfterConstructors(){const e=this.getDecorator("afterConstructor");e.length>0&&e.forEach(e=>e.call(this))}own(e){this._handles.push(e)}destroy(){for(;this._handles.length>0;){const e=this._handles.pop();e&&e.destroy()}}}t.a=f,f._type=u.b},"./node_modules/@dojo/widget-core/animations/cssTransitions.mjs":function(e,t,o){"use strict";let r="",s="";function n(e){""===s&&function(e){if("WebkitTransition"in e.style)r="webkitTransitionEnd",s="webkitAnimationEnd";else{if(!("transition"in e.style||"MozTransition"in e.style))throw new Error("Your browser is not supported");r="transitionend",s="animationend"}}(e)}function i(e,t,o){n(e);let i=!1,d=function(){i||(i=!0,e.removeEventListener(r,d),e.removeEventListener(s,d),o())};t(),e.addEventListener(s,d),e.addEventListener(r,d)}t.a={enter:function(e,t,o){const r=t.enterAnimationActive||`${o}-active`;i(e,()=>{e.classList.add(o),requestAnimationFrame(function(){e.classList.add(r)})},()=>{e.classList.remove(o),e.classList.remove(r)})},exit:function(e,t,o,r){const s=t.exitAnimationActive||`${o}-active`;i(e,()=>{e.classList.add(o),requestAnimationFrame(function(){e.classList.add(s)})},()=>{r()})}}},"./node_modules/@dojo/widget-core/d.mjs":function(e,t,o){"use strict";t.f=d,t.e=a,t.d=function(e){return Boolean(e&&"string"!=typeof e&&e.type===i)},t.h=function(e,t,o=[]){return{children:o,widgetConstructor:e,properties:t,type:s}},t.g=function(e,t={},o){let r,s=t;Array.isArray(t)&&(o=t,s={});"function"==typeof s&&(r=s,s={});return{tag:e,deferredPropertiesCallback:r,children:o,properties:s,type:n}},t.c=function({node:e,attrs:t={},props:o={},on:r={},diffType:s="none"},n){return{tag:c(e)?e.tagName.toLowerCase():"",properties:o,attributes:t,events:r,children:n,type:i,domNode:e,text:c(e)?void 0:e.data,diffType:s}};var r=o("./node_modules/@dojo/shim/Symbol.mjs");const s=Object(r.a)("Identifier for a WNode.");t.b=s;const n=Object(r.a)("Identifier for a VNode.");t.a=n;const i=Object(r.a)("Identifier for a VNode created using existing dom.");function d(e){return Boolean(e&&"string"!=typeof e&&e.type===s)}function a(e){return Boolean(e&&"string"!=typeof e&&(e.type===n||e.type===i))}function c(e){return!!e.tagName}},"./node_modules/@dojo/widget-core/decorators/afterRender.mjs":function(e,t,o){"use strict";t.a=s;var r=o("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs");function s(e){return Object(r.a)((t,o)=>{t.addDecorator("afterRender",o?t[o]:e)})}},"./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs":function(e,t,o){"use strict";t.a=n;var r=o("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"),s=o("./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs");function n(){return Object(r.a)((e,t)=>{Object(s.a)(function(){this.invalidate()})(e)})}},"./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs":function(e,t,o){"use strict";t.a=s;var r=o("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs");function s(e){return Object(r.a)((t,o)=>{t.addDecorator("beforeProperties",o?t[o]:e)})}},"./node_modules/@dojo/widget-core/decorators/customElement.mjs":function(e,t,o){"use strict";t.a=n;var r=o("./node_modules/@dojo/widget-core/registerCustomElement.mjs"),s=o("./node_modules/@dojo/widget-core/Registry.mjs");function n({tag:e,properties:t=[],attributes:o=[],events:n=[],childType:i=r.CustomElementChildType.DOJO,registryFactory:d=(()=>new s.c)}){return function(r){r.prototype.__customElementDescriptor={tagName:e,attributes:o,properties:t,events:n,childType:i,registryFactory:d}}}},"./node_modules/@dojo/widget-core/decorators/diffProperty.mjs":function(e,t,o){"use strict";t.a=s;var r=o("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs");function s(e,t,o){return Object(r.a)((r,s)=>{r.addDecorator(`diffProperty:${e}`,t.bind(null)),r.addDecorator("registeredDiffProperty",e),(o||s)&&r.addDecorator("diffReaction",{propertyName:e,reaction:s?r[s]:o})})}},"./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs":function(e,t,o){"use strict";function r(e){return function(t,o,r){"function"==typeof t?e(t.prototype,void 0):e(t,o)}}t.a=r},"./node_modules/@dojo/widget-core/decorators/inject.mjs":function(e,t,o){"use strict";t.a=d;var r=o("./node_modules/@dojo/shim/WeakMap.mjs"),s=o("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"),n=o("./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs");const i=new r.a;function d({name:e,getProperties:t}){return Object(s.a)((o,r)=>{Object(n.a)(function(o){const r=this.registry.getInjector(e);if(r){const{injector:e,invalidator:s}=r,n=i.get(this)||[];return 0===n.length&&i.set(this,n),-1===n.indexOf(r)&&(this.own(s.on("invalidate",()=>{this.invalidate()})),n.push(r)),t(e(),o)}})(o)})}},"./node_modules/@dojo/widget-core/diff.mjs":function(e,t,o){"use strict";t.b=i,t.a=function(e,t){let o;o="function"==typeof t?t._type===r.b?n(e,t):function(e,t){return{changed:!1,value:t}}(0,t):s(t)?i(e,t):n(e,t);return o};var r=o("./node_modules/@dojo/widget-core/Registry.mjs");function s(e){return"[object Object]"===Object.prototype.toString.call(e)||Array.isArray(e)}function n(e,t){return{changed:e!==t,value:t}}function i(e,t){let o=!1;const r=e&&s(e),n=t&&s(t);if(!r||!n)return{changed:!0,value:t};const i=Object.keys(e),d=Object.keys(t);return{changed:o=i.length!==d.length||d.some(o=>t[o]!==e[o]),value:t}}},"./node_modules/@dojo/widget-core/mixins/Projector.mjs":function(e,t,o){"use strict";t.a=u;var r,s,n=o("./node_modules/tslib/tslib.es6.js"),i=o("./node_modules/@dojo/core/lang.mjs"),d=o("./node_modules/@dojo/widget-core/animations/cssTransitions.mjs"),a=o("./node_modules/@dojo/widget-core/decorators/afterRender.mjs"),c=o("./node_modules/@dojo/widget-core/d.mjs"),l=o("./node_modules/@dojo/widget-core/vdom.mjs");function u(e){class t extends e{constructor(...e){super(...e),this._root=document.body,this._async=!0,this._projectorProperties={},this._projectionOptions={transitions:d.a},this.root=document.body,this.projectorState=r.Detached}append(e){const t={type:s.Append,root:e};return this._attach(t)}merge(e){const t={type:s.Merge,root:e};return this._attach(t)}set root(e){if(this.projectorState===r.Attached)throw new Error("Projector already attached, cannot change root element");this._root=e}get root(){return this._root}get async(){return this._async}set async(e){if(this.projectorState===r.Attached)throw new Error("Projector already attached, cannot change async mode");this._async=e}sandbox(e=document){if(this.projectorState===r.Attached)throw new Error("Projector already attached, cannot create sandbox");this._async=!1;const t=this.root;this.own({destroy:()=>{this._root=t}}),this._attach({root:e.createDocumentFragment(),type:s.Append})}setChildren(e){this.__setChildren__(e)}setProperties(e){this.__setProperties__(e)}__setProperties__(e){this._projectorProperties&&this._projectorProperties.registry!==e.registry&&this._projectorProperties.registry&&this._projectorProperties.registry.destroy(),this._projectorProperties=Object(i.a)({},e),super.__setCoreProperties__({bind:this,baseRegistry:e.registry}),super.__setProperties__(e)}toHtml(){if(this.projectorState!==r.Attached||!this._projection)throw new Error("Projector is not attached, cannot return an HTML string of projection.");return this._projection.domNode.childNodes[0].outerHTML}afterRender(e){let t=e;return"string"!=typeof e&&null!==e&&void 0!==e||(t=Object(c.g)("span",{},[e])),t}destroy(){super.destroy()}_attach({type:e,root:t}){if(t&&(this.root=t),this._attachHandle)return this._attachHandle;this.projectorState=r.Attached;const o={destroy:()=>{this.projectorState===r.Attached&&(this._projection=void 0,this.projectorState=r.Detached)}};switch(this.own(o),this._attachHandle=o,this._projectionOptions=Object.assign({},this._projectionOptions,{sync:!this._async}),e){case s.Append:this._projection=l.a.append(this.root,this,this._projectionOptions);break;case s.Merge:this._projection=l.a.merge(this.root,this,this._projectionOptions)}return this._attachHandle}}return n.a([Object(a.a)(),n.b("design:type",Function),n.b("design:paramtypes",[Object]),n.b("design:returntype",void 0)],t.prototype,"afterRender",null),t}!function(e){e[e.Attached=1]="Attached",e[e.Detached=2]="Detached"}(r||(r={})),function(e){e[e.Append=1]="Append",e[e.Merge=2]="Merge"}(s||(s={}))},"./node_modules/@dojo/widget-core/mixins/Themed.mjs":function(e,t,o){"use strict";t.c=function(e){return Object(i.a)(t=>{t.addDecorator("baseThemeClasses",e)})},t.b=function(e,t){const o=new s.a(e);return t.defineInjector(l,e=>(o.setInvalidator(e),()=>o.get())),o},t.a=u;var r=o("./node_modules/tslib/tslib.es6.js"),s=o("./node_modules/@dojo/widget-core/Injector.mjs"),n=o("./node_modules/@dojo/widget-core/decorators/inject.mjs"),i=o("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"),d=o("./node_modules/@dojo/widget-core/decorators/diffProperty.mjs"),a=o("./node_modules/@dojo/widget-core/diff.mjs");const c=" _key",l=Symbol("theme");function u(e){let t=class extends e{constructor(){super(...arguments),this._registeredBaseThemeKeys=[],this._recalculateClasses=!0,this._theme={}}theme(e){return this._recalculateClasses&&this._recalculateThemeClasses(),Array.isArray(e)?e.map(e=>this._getThemeClass(e)):this._getThemeClass(e)}onPropertiesChanged(){this._recalculateClasses=!0}_getThemeClass(e){if(void 0===e||null===e)return e;const t=this.properties.extraClasses||{},o=this._baseThemeClassesReverseLookup[e];let r=[];return o?(t[o]&&r.push(t[o]),this._theme[o]?r.push(this._theme[o]):r.push(this._registeredBaseTheme[o]),r.join(" ")):(console.warn(`Class name: '${e}' not found in theme`),null)}_recalculateThemeClasses(){const{theme:e={}}=this.properties,t=this.getDecorator("baseThemeClasses");this._registeredBaseTheme||(this._registeredBaseTheme=t.reduce((e,t)=>{const o=c,s=t[o],n=r.c(t,["symbol"==typeof o?o:o+""]);return this._registeredBaseThemeKeys.push(s),Object.assign({},e,n)},{}),this._baseThemeClassesReverseLookup=t.reduce((e,t)=>(Object.keys(t).forEach(o=>{e[t[o]]=o}),e),{})),this._theme=this._registeredBaseThemeKeys.reduce((t,o)=>Object.assign({},t,e[o]),{}),this._recalculateClasses=!1}};return r.a([Object(d.a)("theme",a.b),Object(d.a)("extraClasses",a.b),r.b("design:type",Function),r.b("design:paramtypes",[]),r.b("design:returntype",void 0)],t.prototype,"onPropertiesChanged",null),t=r.a([Object(n.a)({name:l,getProperties:(e,t)=>t.theme?{}:{theme:e}})],t)}},"./node_modules/@dojo/widget-core/registerCustomElement.mjs":function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),o.d(t,"CustomElementChildType",function(){return r}),t.DomToWidgetWrapper=h,t.create=p,t.register=m;var r,s=o("./node_modules/tslib/tslib.es6.js"),n=o("./node_modules/@dojo/widget-core/WidgetBase.mjs"),i=o("./node_modules/@dojo/widget-core/mixins/Projector.mjs"),d=o("./node_modules/@dojo/shim/array.mjs"),a=o("./node_modules/@dojo/widget-core/d.mjs"),c=o("./node_modules/@dojo/shim/global.mjs"),l=o("./node_modules/@dojo/widget-core/mixins/Themed.mjs"),u=o("./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs");function h(e){let t=class extends n.a{render(){const t=Object.keys(this.properties).reduce((e,t)=>{const o=this.properties[t];return 0===t.indexOf("on")&&(t=`__${t}`),e[t]=o,e},{});return Object(a.c)({node:e,props:t,diffType:"dom"})}static get domNode(){return e}};return t=s.a([Object(u.a)()],t)}function p(e,t){const{attributes:o,childType:s,registryFactory:u}=e,p={};return o.forEach(e=>{const t=e.toLowerCase();p[t]=e}),class extends HTMLElement{constructor(){super(...arguments),this._properties={},this._children=[],this._eventProperties={},this._initialised=!1}connectedCallback(){if(this._initialised)return;const o={},{attributes:p,properties:m,events:f}=e;this._properties=Object.assign({},this._properties,this._attributesToProperties(p)),[...p,...m].forEach(e=>{const t=this[e],r=e.replace(/^on/,"__");void 0!==t&&(this._properties[e]=t),r!==e&&(o[r]={get:()=>this._getProperty(e),set:t=>this._setProperty(e,t)}),o[e]={get:()=>this._getProperty(e),set:t=>this._setProperty(e,t)}}),f.forEach(e=>{const t=e.replace(/^on/,"").toLowerCase(),r=e.replace(/^on/,"__on");o[r]={get:()=>this._getEventProperty(e),set:t=>this._setEventProperty(e,t)},this._eventProperties[e]=void 0,this._properties[e]=((...o)=>{const r=this._getEventProperty(e);"function"==typeof r&&r(...o),this.dispatchEvent(new CustomEvent(t,{bubbles:!1,detail:o}))})}),Object.defineProperties(this,o);const g=s===r.TEXT?this.childNodes:this.children;Object(d.a)(g).forEach(e=>{s===r.DOJO?(e.addEventListener("dojo-ce-render",()=>this._render()),e.addEventListener("dojo-ce-connected",()=>this._render()),this._children.push(h(e))):this._children.push(Object(a.c)({node:e,diffType:"dom"}))}),this.addEventListener("dojo-ce-connected",e=>this._childConnected(e));const j=this._properties,_=()=>this.__children__(),y=u(),b=Object(l.b)(this._getTheme(),y);c.a.addEventListener("dojo-theme-set",()=>b.set(this._getTheme()));const v=Object(i.a)(class extends n.a{render(){return Object(a.h)(t,j,_())}});this._projector=new v,this._projector.setProperties({registry:y}),this._projector.append(this),this._initialised=!0,this.dispatchEvent(new CustomEvent("dojo-ce-connected",{bubbles:!0,detail:this}))}_getTheme(){if(c.a&&c.a.dojoce&&c.a.dojoce.theme)return c.a.dojoce.themes[c.a.dojoce.theme]}_childConnected(e){const t=e.detail;if(t.parentNode===this){this._children.some(e=>e.domNode===t)||(t.addEventListener("dojo-ce-render",()=>this._render()),this._children.push(h(t)),this._render())}}_render(){this._projector&&(this._projector.invalidate(),this.dispatchEvent(new CustomEvent("dojo-ce-render",{bubbles:!1,detail:this})))}__properties__(){return Object.assign({},this._properties,this._eventProperties)}__children__(){return s===r.DOJO?this._children.filter(e=>e.domNode.isWidget).map(e=>{const{domNode:t}=e;return Object(a.h)(e,Object.assign({},t.__properties__()),[...t.__children__()])}):this._children}attributeChangedCallback(e,t,o){const r=p[e];this._setProperty(r,o)}_setEventProperty(e,t){this._eventProperties[e]=t}_getEventProperty(e){return this._eventProperties[e]}_setProperty(e,t){"function"==typeof t&&(t[n.b]=!0),this._properties[e]=t,this._render()}_getProperty(e){return this._properties[e]}_attributesToProperties(e){return e.reduce((e,t)=>{const o=t.toLowerCase(),r=this.getAttribute(o);return null!==r&&(e[t]=r),e},{})}static get observedAttributes(){return Object.keys(p)}get isWidget(){return!0}}}function m(e){const t=e.prototype&&e.prototype.__customElementDescriptor;if(!t)throw new Error("Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?");c.a.customElements.define(t.tagName,p(t,e))}!function(e){e.DOJO="DOJO",e.NODE="NODE",e.TEXT="TEXT"}(r||(r={})),t.default=m},"./node_modules/@dojo/widget-core/vdom.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/global.mjs"),s=o("./node_modules/@dojo/shim/array.mjs"),n=o("./node_modules/@dojo/widget-core/d.mjs"),i=o("./node_modules/@dojo/widget-core/Registry.mjs"),d=o("./node_modules/@dojo/shim/WeakMap.mjs");const a="http://www.w3.org/2000/svg",c="http://www.w3.org/1999/xlink",l=[],u=new d.a;t.b=u;const h=new d.a,p=new d.a;function m(e,t){return Object(n.e)(e)&&Object(n.e)(t)?(!Object(n.d)(e)&&!Object(n.d)(t)||e.domNode===t.domNode)&&(e.tag===t.tag&&e.properties.key===t.properties.key):!(!Object(n.f)(e)||!Object(n.f)(t))&&((void 0!==e.instance||"string"!=typeof t.widgetConstructor)&&(e.widgetConstructor===t.widgetConstructor&&e.properties.key===t.properties.key))}const f=function(){throw new Error("Provide a transitions object to the projectionOptions to do animations")};function g(e){if("string"!=typeof e)throw new Error("Style values must be strings")}function j(e,t,o,r,s,n){const i=p.get(r.projectorInstance),a=i.nodeMap.get(e)||new d.a;if(n){const o=a.get(n);e.removeEventListener(t,o)}let c=o.bind(s);"input"===t&&(c=function(e){o.call(this,e),e.target["oninput-value"]=e.target.value}.bind(s)),e.addEventListener(t,c),a.set(o,c),i.nodeMap.set(e,a)}function _(e,t){if(t){const o=t.split(" ");for(let t=0;t{o.focus()})}}function v(e,t,o,r,s=!1){const n=p.get(r.projectorInstance).nodeMap.get(e);n&&Object.keys(t).forEach(r=>{const i="on"===r.substr(0,2)||s,d=s?r:r.substr(2);if(i&&!o[r]){const o=n.get(t[r]);o&&e.removeEventListener(d,o)}})}function w(e,t,o,r){r.namespace===a&&"href"===t?e.setAttributeNS(c,t,o):"role"===t&&""===o||void 0===o?e.removeAttribute(t):e.setAttribute(t,o)}function O(e,t,o,r){const s=Object.keys(o),n=s.length;for(let i=0;i0)if(c&&0!==c.length){const r=[...o];for(let o=0;o0&&R(r.children,t));else{if(!r.coreProperties){const e=u.get(t);r.coreProperties={bind:t,baseRegistry:e.coreProperties.baseRegistry}}r.children&&r.children.length>0&&R(r.children,t)}o++}else e.splice(o,1)}return e}function k(e,t){if(Object(n.e)(e)&&e.properties){const o=e.properties.enterAnimation;o&&("function"==typeof o?o(e.domNode,e.properties):t.enter(e.domNode,e.properties,o))}}function N(e,t,o){if(Object(n.f)(e)){const r=e.rendered||l;if(e.instance){u.get(e.instance).onDetach(),h.delete(e.instance)}for(let e=0;e0)for(let r=0;r{let i=void 0,d=t[f];if(d){let e=f+1,o=[d];for(;o.length;){const r=o.shift();if(Object(n.f)(r))r.rendered&&o.push(...r.rendered);else if(r.domNode){i=r.domNode;break}0===o.length&&t[e]&&(o.push(t[e]),e++)}}D(l,e,i,s,r),k(l,a);const u=g;c.afterRenderCallbacks.push(()=>{A(o,u,r)})};if(!d||-1===u){p(),g++;continue}const _=()=>{const e=f;if(c.afterRenderCallbacks.push(()=>{A(t,e,r)}),Object(n.f)(d)){const e=h.get(d.instance);e&&(d=e.dnode)}N(d,a,s)};-1!==E(o,d,g+1)?(p(),_(),f++,g++):(_(),f++)}if(i>f)for(u=f;u{A(t,e,r)});let o=t[u];if(Object(n.f)(o)){const e=h.get(o.instance);e&&(o=e.dnode)}N(o,a,s)}return j}function T(e,t,o,r,i,d){if(void 0===t)return;const a=p.get(o.projectorInstance);a.merge&&void 0===d&&(d=Object(s.a)(e.domNode.childNodes));const c=o.transitions;o=Object.assign({},o,{depth:o.depth+1});for(let s=0;s0;)(e=d.shift())&&e.tagName===(l.tag.toUpperCase()||void 0)&&(l.domNode=e)}D(l,e,i,o,r)}else D(l,e,i,o,r,d);k(l,c)}}function x(e,t,o,r){if(T(t,t.children,r,o,void 0),"function"==typeof t.deferredPropertiesCallback&&void 0===t.inserted&&S(t,r),t.attributes&&t.events){O(e,{},t.attributes,r),P(e,{},t.properties,r,!1),v(e,{},t.events,r,!0);const o=t.events;Object.keys(o).forEach(s=>{j(e,s,o[s],r,t.properties.bind)})}else P(e,{},t.properties,r);if(null!==t.properties.key&&void 0!==t.properties.key){u.get(o).nodeHandler.add(e,`${t.properties.key}`)}t.inserted=!0}function D(e,t,o,r,s,d){let c;const l=p.get(r.projectorInstance);if(Object(n.f)(e)){let{widgetConstructor:n}=e;const a=u.get(s);if(!Object(i.d)(n)){const e=a.registry().get(n);if(null===e)return;n=e}const c=new n;e.instance=c;const p=u.get(c);p.invalidate=(()=>{p.dirty=!0,!1===p.rendering&&(l.renderQueue.push({instance:c,depth:r.depth}),F(r))}),p.rendering=!0,c.__setCoreProperties__(e.coreProperties),c.__setChildren__(e.children),c.__setProperties__(e.properties);const m=c.__render__();if(p.rendering=!1,m){const s=R(m,c);e.rendered=s,T(t,s,r,c,o,d)}h.set(c,{dnode:e,parentVNode:t}),p.nodeHandler.addRoot(),l.afterRenderCallbacks.push(()=>{p.onAttach()})}else{if(l.merge&&void 0!==l.mergeElement)return c=e.domNode=r.mergeElement,l.mergeElement=void 0,void x(c,e,s,r);const n=t.domNode.ownerDocument;if(e.tag||"string"!=typeof e.text)void 0===e.domNode?("svg"===e.tag&&(r=Object.assign({},r,{namespace:a})),c=void 0!==r.namespace?e.domNode=n.createElementNS(r.namespace,e.tag):e.domNode=e.domNode||n.createElement(e.tag)):c=e.domNode,x(c,e,s,r),void 0!==o?t.domNode.insertBefore(c,o):c.parentNode!==t.domNode&&t.domNode.appendChild(c);else if(void 0!==e.domNode&&t.domNode){const o=e.domNode.ownerDocument.createTextNode(e.text);t.domNode===e.domNode.parentNode?t.domNode.replaceChild(o,e.domNode):(t.domNode.appendChild(o),e.domNode.parentNode&&e.domNode.parentNode.removeChild(e.domNode)),e.domNode=o}else c=e.domNode=n.createTextNode(e.text),void 0!==o?t.domNode.insertBefore(c,o):t.domNode.appendChild(c)}}function I(e,t,o,r,s){if(Object(n.f)(t)){const{instance:r}=e,{parentVNode:s,dnode:n}=h.get(r),i=n?n.rendered:e.rendered,d=u.get(r);if(d.rendering=!0,r.__setCoreProperties__(t.coreProperties),r.__setChildren__(t.children),r.__setProperties__(t.properties),t.instance=r,!0===d.dirty){const e=r.__render__();d.rendering=!1,t.rendered=R(e,r),M(s,i,t.rendered,r,o)}else d.rendering=!1,t.rendered=i;h.set(r,{dnode:t,parentVNode:s}),d.nodeHandler.addRoot()}else{if(e===t)return!1;const r=t.domNode=e.domNode;let n=!1,i=!1;if(t.tag||"string"!=typeof t.text){if(t.tag&&0===t.tag.lastIndexOf("svg",0)&&(o=Object.assign({},o,{namespace:a})),e.children!==t.children){const r=R(t.children,s);t.children=r,i=M(t,e.children,r,s,o)||i}const n=function(e,t,o){const{diffType:r,properties:s,attributes:n}=o;if(!r||"vdom"===r)return{properties:t.properties,attributes:t.attributes,events:t.events};if("none"===r)return{properties:{},attributes:t.attributes?{}:void 0,events:t.events};let i={properties:{}};return n?(i.attributes={},i.events=t.events,Object.keys(s).forEach(t=>{i.properties[t]=e[t]}),Object.keys(n).forEach(t=>{i.attributes[t]=e.getAttribute(t)}),i):(i.properties=Object.keys(s).reduce((t,o)=>(t[o]=e.getAttribute(o)||e[o],t),{}),i)}(r,e,t);if(t.attributes&&t.events){O(r,n.attributes,t.attributes,o),i=P(r,n.properties,t.properties,o,!1)||i,v(r,n.events,t.events,o,!0);const e=t.events;Object.keys(e).forEach(s=>{j(r,s,e[s],o,t.properties.bind,n.events[s])})}else i=P(r,n.properties,t.properties,o)||i;if(null!==t.properties.key&&void 0!==t.properties.key){u.get(s).nodeHandler.add(r,`${t.properties.key}`)}}else if(t.text!==e.text){const e=r.ownerDocument.createTextNode(t.text);return r.parentNode.replaceChild(e,r),t.domNode=e,n=!0}i&&t.properties&&t.properties.updateAnimation&&t.properties.updateAnimation(r,t.properties,e.properties)}}function S(e,t){e.decoratedDeferredProperties=e.properties;const o=e.deferredPropertiesCallback(!!e.inserted),r=p.get(t.projectorInstance);e.properties=Object.assign({},o,e.decoratedDeferredProperties),r.deferredRenderCallbacks.push(()=>{const o=Object.assign({},e.deferredPropertiesCallback(!!e.inserted),e.decoratedDeferredProperties);P(e.domNode,e.properties,o,t),e.properties=o})}function L(e){const t=p.get(e.projectorInstance);if(t.deferredRenderCallbacks.length)if(e.sync)for(;t.deferredRenderCallbacks.length;){const e=t.deferredRenderCallbacks.shift();e&&e()}else r.a.requestAnimationFrame(()=>{for(;t.deferredRenderCallbacks.length;){const e=t.deferredRenderCallbacks.shift();e&&e()}})}function W(e){const t=p.get(e.projectorInstance);if(e.sync)for(;t.afterRenderCallbacks.length;){const e=t.afterRenderCallbacks.shift();e&&e()}else r.a.requestIdleCallback?r.a.requestIdleCallback(()=>{for(;t.afterRenderCallbacks.length;){const e=t.afterRenderCallbacks.shift();e&&e()}}):setTimeout(()=>{for(;t.afterRenderCallbacks.length;){const e=t.afterRenderCallbacks.shift();e&&e()}})}function F(e){const t=p.get(e.projectorInstance);e.sync?B(e):void 0===t.renderScheduled&&(t.renderScheduled=r.a.requestAnimationFrame(()=>{B(e)}))}function B(e){const t=p.get(e.projectorInstance);t.renderScheduled=void 0;const o=[...t.renderQueue];t.renderQueue=[],o.sort((e,t)=>e.depth-t.depth);const r=[];for(;o.length;){const{instance:t}=o.shift();if(h.has(t)&&-1===r.indexOf(t)){r.push(t);const{parentVNode:o,dnode:s}=h.get(t);I(s,C(t,u.get(t)),e,0,t)}}W(e),L(e)}const H={append:function(e,t,o={}){const r=u.get(t),s=function(e,t){const o={namespace:void 0,styleApplyer:function(e,t,o){e.style[t]=o},transitions:{enter:f,exit:f},depth:0,merge:!1,sync:!1,projectorInstance:t};return Object.assign({},o,e)}(o,t),i={afterRenderCallbacks:[],deferredRenderCallbacks:[],nodeMap:new d.a,renderScheduled:void 0,renderQueue:[],merge:o.merge||!1,mergeElement:o.mergeElement};p.set(t,i),s.rootNode=e;const a={tag:"",properties:{},children:void 0,domNode:s.rootNode,type:n.a};const c=C(t,r);return h.set(t,{dnode:c,parentVNode:a}),r.invalidate=(()=>{r.dirty=!0,!1===r.rendering&&(i.renderQueue.push({instance:t,depth:s.depth}),F(s))}),I(c,c,s,0,t),i.afterRenderCallbacks.push(()=>{r.onAttach()}),L(s),W(s),{domNode:s.rootNode}},create:function(e,t){return this.append(document.createElement("div"),e,t)},merge:function(e,t,o={}){o.merge=!0,o.mergeElement=e;const r=this.append(e.parentNode,t,o);return p.get(t).merge=!1,r}};t.a=H},"./node_modules/imports-loader/index.js?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js":function(e,t,o){var r=o("./src/menu-item/MenuItem.ts"),s=o("./node_modules/@dojo/widget-core/registerCustomElement.mjs").default,n=r.default;n&&s(n)},"./node_modules/process/browser.js":function(e,t){var o,r,s=e.exports={};function n(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function d(e){if(o===setTimeout)return setTimeout(e,0);if((o===n||!o)&&setTimeout)return o=setTimeout,setTimeout(e,0);try{return o(e,0)}catch(t){try{return o.call(null,e,0)}catch(t){return o.call(this,e,0)}}}!function(){try{o="function"==typeof setTimeout?setTimeout:n}catch(e){o=n}try{r="function"==typeof clearTimeout?clearTimeout:i}catch(e){r=i}}();var a,c=[],l=!1,u=-1;function h(){l&&a&&(l=!1,a.length?c=a.concat(c):u=-1,c.length&&p())}function p(){if(!l){var e=d(h);l=!0;for(var t=c.length;t;){for(a=c,c=[];++u1)for(var o=1;o=0;d--)(s=e[d])&&(i=(n<3?s(i):n>3?s(t,o,i):s(t,o))||i);return n>3&&i&&Object.defineProperty(t,o,i),i},t.b=function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}; +!function(e){var t={};function o(r){if(t[r])return t[r].exports;var s=t[r]={i:r,l:!1,exports:{}};return e[r].call(s.exports,s,s.exports,o),s.l=!0,s.exports}o.m=e,o.c=t,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}({"./node_modules/@dojo/framework/core/Destroyable.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/core/lang.mjs"),s=o("./node_modules/@dojo/framework/shim/Promise.mjs");function n(){return s.a.resolve(!1)}function i(){throw new Error("Call made to destroyed method")}class d{constructor(){this.handles=[]}own(e){const t=Array.isArray(e)?Object(r.b)(...e):e,{handles:o}=this;return o.push(t),{destroy(){o.splice(o.indexOf(t)),t.destroy()}}}destroy(){return new s.a(e=>{this.handles.forEach(e=>{e&&e.destroy&&e.destroy()}),this.destroy=n,this.own=i,e(!0)})}}t.a=d},"./node_modules/@dojo/framework/core/Evented.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/Map.mjs"),s=o("./node_modules/@dojo/framework/core/Destroyable.mjs");const n=new r.b;class i extends s.a{constructor(){super(...arguments),this.listenersMap=new r.b}emit(e){this.listenersMap.forEach((t,o)=>{(function(e,t){if("string"==typeof t&&"string"==typeof e&&-1!==e.indexOf("*")){let o;return n.has(e)?o=n.get(e):(o=new RegExp(`^${e.replace(/\*/g,".*")}$`),n.set(e,o)),o.test(t)}return e===t})(o,e.type)&&[...t].forEach(t=>{t.call(this,e)})})}on(e,t){if(Array.isArray(t)){const o=t.map(t=>this._addListener(e,t));return{destroy(){o.forEach(e=>e.destroy())}}}return this._addListener(e,t)}_addListener(e,t){const o=this.listenersMap.get(e)||[];return o.push(t),this.listenersMap.set(e,o),{destroy:()=>{const o=this.listenersMap.get(e)||[];o.splice(o.indexOf(t),1)}}}}t.a=i},"./node_modules/@dojo/framework/core/lang.mjs":function(e,t,o){"use strict";t.b=function(...e){return function(e){let t=!1;return{destroy:function(){t||(t=!0,e())}}}(function(){for(let t=0;t{r[e]=t,delete n[e]},()=>{delete n[e]})}function l(e){let t;const o=e.toLowerCase();if(o in a)t=a[o];else if(s[o])t=r[o]=s[o].call(null),delete s[o];else{if(!(o in r)){if(e in n)return!1;throw new TypeError(`Attempt to detect unregistered has feature "${e}"`)}t=r[o]}return t}c("debug",!0),c("host-browser","undefined"!=typeof document&&"undefined"!=typeof location),c("host-node",function(){if("object"==typeof o&&o.versions&&o.versions.node)return o.versions.node})}).call(t,o("./node_modules/webpack/buildin/global.js"),o("./node_modules/process/browser.js"))},"./node_modules/@dojo/framework/shim/Map.mjs":function(e,t,o){"use strict";o.d(t,"a",function(){return s});o("./node_modules/@dojo/framework/shim/iterator.mjs");var r=o("./node_modules/@dojo/framework/shim/global.mjs");o("./node_modules/@dojo/framework/shim/object.mjs"),o("./node_modules/@dojo/framework/shim/support/has.mjs"),o("./node_modules/@dojo/framework/shim/Symbol.mjs");let s=r.a.Map;t.b=s},"./node_modules/@dojo/framework/shim/Promise.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/global.mjs");o("./node_modules/@dojo/framework/shim/support/queue.mjs"),o("./node_modules/@dojo/framework/shim/Symbol.mjs"),o("./node_modules/@dojo/framework/shim/support/has.mjs");let s=r.a.Promise;t.a=s},"./node_modules/@dojo/framework/shim/Symbol.mjs":function(e,t,o){"use strict";o("./node_modules/@dojo/framework/shim/support/has.mjs");var r=o("./node_modules/@dojo/framework/shim/global.mjs"),s=o("./node_modules/@dojo/framework/shim/support/util.mjs");let n=r.a.Symbol;["hasInstance","isConcatSpreadable","iterator","species","replace","search","split","match","toPrimitive","toStringTag","unscopables","observable"].forEach(e=>{n[e]||Object.defineProperty(n,e,Object(s.a)(n.for(e),!1,!1))}),t.a=n},"./node_modules/@dojo/framework/shim/WeakMap.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/global.mjs");o("./node_modules/@dojo/framework/shim/iterator.mjs"),o("./node_modules/@dojo/framework/shim/support/has.mjs"),o("./node_modules/@dojo/framework/shim/Symbol.mjs");let s=r.a.WeakMap;t.a=s},"./node_modules/@dojo/framework/shim/array.mjs":function(e,t,o){"use strict";o.d(t,"a",function(){return n});var r=o("./node_modules/@dojo/framework/shim/global.mjs"),s=(o("./node_modules/@dojo/framework/shim/iterator.mjs"),o("./node_modules/@dojo/framework/shim/number.mjs"),o("./node_modules/@dojo/framework/shim/support/has.mjs"),o("./node_modules/@dojo/framework/shim/support/util.mjs"));let n,i,d,a,c,l,u;n=r.a.Array.from,i=r.a.Array.of,d=Object(s.b)(r.a.Array.prototype.copyWithin),a=Object(s.b)(r.a.Array.prototype.fill),c=Object(s.b)(r.a.Array.prototype.find),l=Object(s.b)(r.a.Array.prototype.findIndex),u=Object(s.b)(r.a.Array.prototype.includes)},"./node_modules/@dojo/framework/shim/global.mjs":function(e,t,o){"use strict";(function(e){const o=void 0!==e?e:"undefined"!=typeof window?window:"undefined"!=typeof self?self:void 0;t.a=o}).call(t,o("./node_modules/webpack/buildin/global.js"))},"./node_modules/@dojo/framework/shim/iterator.mjs":function(e,t,o){"use strict";o("./node_modules/@dojo/framework/shim/Symbol.mjs"),o("./node_modules/@dojo/framework/shim/string.mjs")},"./node_modules/@dojo/framework/shim/number.mjs":function(e,t,o){"use strict";o("./node_modules/@dojo/framework/shim/global.mjs");Math.pow(2,53)},"./node_modules/@dojo/framework/shim/object.mjs":function(e,t,o){"use strict";o.d(t,"a",function(){return s});var r=o("./node_modules/@dojo/framework/shim/global.mjs");o("./node_modules/@dojo/framework/shim/support/has.mjs"),o("./node_modules/@dojo/framework/shim/Symbol.mjs");let s,n,i,d,a,c,l,u,m;{const e=r.a.Object;s=e.assign,n=e.getOwnPropertyDescriptor,i=e.getOwnPropertyNames,d=e.getOwnPropertySymbols,a=e.is,c=e.keys}{const e=r.a.Object;l=e.getOwnPropertyDescriptors,u=e.entries,m=e.values}},"./node_modules/@dojo/framework/shim/string.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/global.mjs"),s=(o("./node_modules/@dojo/framework/shim/support/has.mjs"),o("./node_modules/@dojo/framework/shim/support/util.mjs"));t.b=55296;t.a=56319;let n,i,d,a,c,l,u,m,h,p;n=r.a.String.fromCodePoint,i=r.a.String.raw,d=Object(s.b)(r.a.String.prototype.codePointAt),a=Object(s.b)(r.a.String.prototype.endsWith),c=Object(s.b)(r.a.String.prototype.includes),l=Object(s.b)(r.a.String.prototype.normalize),u=Object(s.b)(r.a.String.prototype.repeat),m=Object(s.b)(r.a.String.prototype.startsWith),h=Object(s.b)(r.a.String.prototype.padEnd),p=Object(s.b)(r.a.String.prototype.padStart)},"./node_modules/@dojo/framework/shim/support/has.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/has/has.mjs"),s=o("./node_modules/@dojo/framework/shim/global.mjs");r.b;Object(r.a)("es6-array",()=>["from","of"].every(e=>e in s.a.Array)&&["findIndex","find","copyWithin"].every(e=>e in s.a.Array.prototype),!0),Object(r.a)("es6-array-fill",()=>"fill"in s.a.Array.prototype&&1===[1].fill(9,Number.POSITIVE_INFINITY)[0],!0),Object(r.a)("es7-array",()=>"includes"in s.a.Array.prototype,!0),Object(r.a)("es6-map",()=>{if("function"==typeof s.a.Map)try{const e=new s.a.Map([[0,1]]);return e.has(0)&&"function"==typeof e.keys&&"function"==typeof e.values&&"function"==typeof e.entries}catch(e){return!1}return!1},!0),Object(r.a)("es6-math",()=>["clz32","sign","log10","log2","log1p","expm1","cosh","sinh","tanh","acosh","asinh","atanh","trunc","fround","cbrt","hypot"].every(e=>"function"==typeof s.a.Math[e]),!0),Object(r.a)("es6-math-imul",()=>"imul"in s.a.Math&&-5===Math.imul(4294967295,5),!0),Object(r.a)("es6-object",()=>["assign","is","getOwnPropertySymbols","setPrototypeOf"].every(e=>"function"==typeof s.a.Object[e]),!0),Object(r.a)("es2017-object",()=>["values","entries","getOwnPropertyDescriptors"].every(e=>"function"==typeof s.a.Object[e]),!0),Object(r.a)("es-observable",()=>void 0!==s.a.Observable,!0),Object(r.a)("es6-promise",()=>void 0!==s.a.Promise&&!0,!0),Object(r.a)("es6-set",()=>{if("function"==typeof s.a.Set){const e=new s.a.Set([1]);return e.has(1)&&"keys"in e&&"function"==typeof e.keys&&!0}return!1},!0),Object(r.a)("es6-string",()=>["fromCodePoint"].every(e=>"function"==typeof s.a.String[e])&&["codePointAt","normalize","repeat","startsWith","endsWith","includes"].every(e=>"function"==typeof s.a.String.prototype[e]),!0),Object(r.a)("es6-string-raw",()=>{function e(e,...t){const o=[...e];return o.raw=e.raw,o}if("raw"in s.a.String){let t=e`a\n${1}`;return t.raw=["a\\n"],"a:\\n"===s.a.String.raw(t,42)}return!1},!0),Object(r.a)("es2017-string",()=>["padStart","padEnd"].every(e=>"function"==typeof s.a.String.prototype[e]),!0),Object(r.a)("es6-symbol",()=>void 0!==s.a.Symbol&&"symbol"==typeof Symbol(),!0),Object(r.a)("es6-weakmap",()=>{if(void 0!==s.a.WeakMap){const e={},t={},o=new s.a.WeakMap([[e,1]]);return Object.freeze(e),1===o.get(e)&&o.set(t,2)===o&&!0}return!1},!0),Object(r.a)("microtasks",()=>!0,!0),Object(r.a)("postmessage",()=>void 0!==s.a.window&&"function"==typeof s.a.postMessage,!0),Object(r.a)("raf",()=>"function"==typeof s.a.requestAnimationFrame,!0),Object(r.a)("setimmediate",()=>void 0!==s.a.setImmediate,!0),Object(r.a)("dom-mutationobserver",()=>{if(Boolean(s.a.MutationObserver||s.a.WebKitMutationObserver)){const e=document.createElement("div"),t=new(s.a.MutationObserver||s.a.WebKitMutationObserver)(function(){});return t.observe(e,{attributes:!0}),e.style.setProperty("display","block"),Boolean(t.takeRecords().length)}return!1},!0),Object(r.a)("dom-webanimation",()=>void 0!==s.a.Animation&&void 0!==s.a.KeyframeEffect,!0)},"./node_modules/@dojo/framework/shim/support/queue.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/global.mjs");o("./node_modules/@dojo/framework/shim/support/has.mjs");function s(e){e&&e.isActive&&e.callback&&e.callback()}function n(e,t){return{destroy:function(){this.destroy=function(){},e.isActive=!1,e.callback=null,t&&t()}}}!function(){let e,t;{const e=[];r.a.addEventListener("message",function(t){t.source===r.a&&"dojo-queue-message"===t.data&&(t.stopPropagation(),e.length&&s(e.shift()))}),t=function(t){e.push(t),r.a.postMessage("dojo-queue-message","*")}}function o(o){const r={isActive:!0,callback:o},s=t(r);return n(r,e&&function(){e(s)})}}();!function(){function e(e){const t={isActive:!0,callback:e},o=requestAnimationFrame(s.bind(null,t));return n(t,function(){cancelAnimationFrame(o)})}}();!function(){let e;e=function(e){r.a.Promise.resolve(e).then(s)}}()},"./node_modules/@dojo/framework/shim/support/util.mjs":function(e,t,o){"use strict";t.a=function(e,t=!1,o=!0,r=!0){return{value:e,enumerable:t,writable:o,configurable:r}},t.b=function(e){return function(t,...o){return e.apply(t,o)}}},"./node_modules/@dojo/framework/widget-core/Injector.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/core/Evented.mjs");class s extends r.a{constructor(e){super(),this._payload=e}setInvalidator(e){this._invalidator=e}get(){return this._payload}set(e){this._payload=e,this._invalidator&&this._invalidator()}}t.a=s},"./node_modules/@dojo/framework/widget-core/NodeHandler.mjs":function(e,t,o){"use strict";var r,s=o("./node_modules/@dojo/framework/core/Evented.mjs"),n=o("./node_modules/@dojo/framework/shim/Map.mjs");!function(e){e.Projector="Projector",e.Widget="Widget"}(r||(r={}));t.a=class extends s.a{constructor(){super(...arguments),this._nodeMap=new n.b}get(e){return this._nodeMap.get(e)}has(e){return this._nodeMap.has(e)}add(e,t){this._nodeMap.set(t,e),this.emit({type:t})}addRoot(){this.emit({type:r.Widget})}addProjector(){this.emit({type:r.Projector})}clear(){this._nodeMap.clear()}}},"./node_modules/@dojo/framework/widget-core/Registry.mjs":function(e,t,o){"use strict";t.d=a;var r=o("./node_modules/@dojo/framework/shim/Promise.mjs"),s=o("./node_modules/@dojo/framework/shim/Map.mjs"),n=o("./node_modules/@dojo/framework/shim/Symbol.mjs"),i=o("./node_modules/@dojo/framework/core/Evented.mjs");const d=Object(n.a)("Widget Base");function a(e){return Boolean(e&&e._type===d)}t.b=d;class c extends i.a{emitLoadedEvent(e,t){this.emit({type:e,action:"loaded",item:t})}define(e,t){if(void 0===this._widgetRegistry&&(this._widgetRegistry=new s.b),this._widgetRegistry.has(e))throw new Error(`widget has already been registered for '${e.toString()}'`);this._widgetRegistry.set(e,t),t instanceof r.a?t.then(t=>(this._widgetRegistry.set(e,t),this.emitLoadedEvent(e,t),t),e=>{throw e}):a(t)&&this.emitLoadedEvent(e,t)}defineInjector(e,t){if(void 0===this._injectorRegistry&&(this._injectorRegistry=new s.b),this._injectorRegistry.has(e))throw new Error(`injector has already been registered for '${e.toString()}'`);const o=new i.a,r={injector:t(()=>o.emit({type:"invalidate"})),invalidator:o};this._injectorRegistry.set(e,r),this.emitLoadedEvent(e,r)}get(e){if(!this._widgetRegistry||!this.has(e))return null;const t=this._widgetRegistry.get(e);if(a(t))return t;if(t instanceof r.a)return null;const o=t();return this._widgetRegistry.set(e,o),o.then(t=>((function(e){return Boolean(e&&e.hasOwnProperty("__esModule")&&e.hasOwnProperty("default")&&a(e.default))})(t)&&(t=t.default),this._widgetRegistry.set(e,t),this.emitLoadedEvent(e,t),t),e=>{throw e}),null}getInjector(e){return this._injectorRegistry&&this.hasInjector(e)?this._injectorRegistry.get(e):null}has(e){return Boolean(this._widgetRegistry&&this._widgetRegistry.has(e))}hasInjector(e){return Boolean(this._injectorRegistry&&this._injectorRegistry.has(e))}}t.a=c,t.c=c},"./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/Map.mjs"),s=o("./node_modules/@dojo/framework/core/Evented.mjs"),n=o("./node_modules/@dojo/framework/widget-core/Registry.mjs");t.a=class extends s.a{constructor(){super(),this._registry=new n.a,this._registryWidgetLabelMap=new r.a,this._registryInjectorLabelMap=new r.a,this.own(this._registry),this.own({destroy:()=>{this.baseRegistry&&(this._registryWidgetLabelMap.delete(this.baseRegistry),this._registryInjectorLabelMap.delete(this.baseRegistry),this.baseRegistry=void 0)}})}set base(e){this.baseRegistry&&(this._registryWidgetLabelMap.delete(this.baseRegistry),this._registryInjectorLabelMap.delete(this.baseRegistry)),this.baseRegistry=e}define(e,t){this._registry.define(e,t)}defineInjector(e,t){this._registry.defineInjector(e,t)}has(e){return this._registry.has(e)||Boolean(this.baseRegistry&&this.baseRegistry.has(e))}hasInjector(e){return this._registry.hasInjector(e)||Boolean(this.baseRegistry&&this.baseRegistry.hasInjector(e))}get(e,t=!1){return this._get(e,t,"get",this._registryWidgetLabelMap)}getInjector(e,t=!1){return this._get(e,t,"getInjector",this._registryInjectorLabelMap)}_get(e,t,o,r){const s=t?[this.baseRegistry,this._registry]:[this._registry,this.baseRegistry];for(let n=0;n{"loaded"===r.action&&this[o](e,t)===r.item&&this.emit({type:"invalidate"})});this.own(s),r.set(i,[...a,e])}}return null}}},"./node_modules/@dojo/framework/widget-core/WidgetBase.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/Map.mjs"),s=o("./node_modules/@dojo/framework/shim/WeakMap.mjs"),n=o("./node_modules/@dojo/framework/shim/Symbol.mjs"),i=o("./node_modules/@dojo/framework/widget-core/d.mjs"),d=o("./node_modules/@dojo/framework/widget-core/diff.mjs"),a=o("./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs"),c=o("./node_modules/@dojo/framework/widget-core/NodeHandler.mjs"),l=o("./node_modules/@dojo/framework/widget-core/vdom.mjs"),u=o("./node_modules/@dojo/framework/widget-core/Registry.mjs");const m=new r.b,h=d.a.bind(null),p=n.a.for("dojoNoBind");t.b=p;class f{constructor(){this._initialProperties=!0,this._changedPropertyKeys=[],this._nodeHandler=new c.a,this._handles=[],this._children=[],this._decoratorCache=new r.b,this._properties={},this._boundRenderFunc=this.render.bind(this),this._boundInvalidate=this.invalidate.bind(this),l.b.set(this,{dirty:!0,onAttach:()=>{this.onAttach()},onDetach:()=>{this.onDetach(),this.destroy()},nodeHandler:this._nodeHandler,registry:()=>this.registry,coreProperties:{},rendering:!1,inputProperties:{}}),this._runAfterConstructors()}meta(e){void 0===this._metaMap&&(this._metaMap=new r.b);let t=this._metaMap.get(e);return t||(t=new e({invalidate:this._boundInvalidate,nodeHandler:this._nodeHandler,bind:this}),this.own(t),this._metaMap.set(e,t)),t}onAttach(){}onDetach(){}get properties(){return this._properties}get changedPropertyKeys(){return[...this._changedPropertyKeys]}__setCoreProperties__(e){const{baseRegistry:t}=e,o=l.b.get(this);o.coreProperties.baseRegistry!==t&&(void 0===this._registry&&(this._registry=new a.a,this.own(this._registry),this.own(this._registry.on("invalidate",this._boundInvalidate))),this._registry.base=t,this.invalidate()),o.coreProperties=e}__setProperties__(e){const t=l.b.get(this);t.inputProperties=e;const o=this._runBeforeProperties(e),r=this.getDecorator("registeredDiffProperty"),s=[],n=Object.keys(o);if(!1===this._initialProperties||0!==r.length){const e=[...n,...Object.keys(this._properties)],i=[],d={};let a=!1;for(let n=0;n{const r=-1!==s.indexOf(o),n=-1!==e.indexOf(t);r&&!n&&(t.call(this,this._properties,d),e.push(t))})}this._properties=d,this._changedPropertyKeys=s}else{this._initialProperties=!1;for(let e=0;e0&&this.invalidate()}get children(){return this._children}__setChildren__(e){(this._children.length>0||e.length>0)&&(this._children=e,this.invalidate())}__render__(){l.b.get(this).dirty=!1;let e=this._runBeforeRenders()();return e=this.runAfterRenders(e),this._nodeHandler.clear(),e}invalidate(){const e=l.b.get(this);e.invalidate&&e.invalidate()}render(){return Object(i.g)("div",{},this.children)}addDecorator(e,t){if(t=Array.isArray(t)?t:[t],this.hasOwnProperty("constructor")){let o=m.get(this.constructor);o||(o=new r.b,m.set(this.constructor,o));let s=o.get(e);s||(s=[],o.set(e,s)),s.push(...t)}else{const o=this.getDecorator(e);this._decoratorCache.set(e,[...o,...t])}}_buildDecoratorList(e){const t=[];let o=this.constructor;for(;o;){const r=m.get(o);if(r){const o=r.get(e);o&&t.unshift(...o)}o=Object.getPrototypeOf(o)}return t}getDecorator(e){let t=this._decoratorCache.get(e);return void 0!==t?t:(t=this._buildDecoratorList(e),this._decoratorCache.set(e,t),t)}_bindFunctionProperty(e,t){if("function"==typeof e&&!e[p]&&!1===Object(u.d)(e)){void 0===this._bindFunctionPropertyMap&&(this._bindFunctionPropertyMap=new s.a);const o=this._bindFunctionPropertyMap.get(e)||{};let{boundFunc:r,scope:n}=o;return void 0!==r&&n===t||(r=e.bind(t),this._bindFunctionPropertyMap.set(e,{boundFunc:r,scope:t})),r}return e}get registry(){return void 0===this._registry&&(this._registry=new a.a,this.own(this._registry),this.own(this._registry.on("invalidate",this._boundInvalidate))),this._registry}_runBeforeProperties(e){const t=this.getDecorator("beforeProperties");return t.length>0?t.reduce((e,t)=>Object.assign({},e,t.call(this,e)),Object.assign({},e)):e}_runBeforeRenders(){const e=this.getDecorator("beforeRender");return e.length>0?e.reduce((e,t)=>{const o=t.call(this,e,this._properties,this._children);return o||(console.warn("Render function not returned from beforeRender, using previous render"),e)},this._boundRenderFunc):this._boundRenderFunc}runAfterRenders(e){const t=this.getDecorator("afterRender");return t.length>0&&(e=t.reduce((e,t)=>t.call(this,e),e)),void 0!==this._metaMap&&this._metaMap.forEach(e=>{e.afterRender()}),e}_runAfterConstructors(){const e=this.getDecorator("afterConstructor");e.length>0&&e.forEach(e=>e.call(this))}own(e){this._handles.push(e)}destroy(){for(;this._handles.length>0;){const e=this._handles.pop();e&&e.destroy()}}}t.a=f,f._type=u.b},"./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs":function(e,t,o){"use strict";let r="",s="";function n(e){""===s&&function(e){if("WebkitTransition"in e.style)r="webkitTransitionEnd",s="webkitAnimationEnd";else{if(!("transition"in e.style||"MozTransition"in e.style))throw new Error("Your browser is not supported");r="transitionend",s="animationend"}}(e)}function i(e,t,o){n(e);let i=!1,d=function(){i||(i=!0,e.removeEventListener(r,d),e.removeEventListener(s,d),o())};t(),e.addEventListener(s,d),e.addEventListener(r,d)}t.a={enter:function(e,t,o){const r=t.enterAnimationActive||`${o}-active`;i(e,()=>{e.classList.add(o),requestAnimationFrame(function(){e.classList.add(r)})},()=>{e.classList.remove(o),e.classList.remove(r)})},exit:function(e,t,o,r){const s=t.exitAnimationActive||`${o}-active`;i(e,()=>{e.classList.add(o),requestAnimationFrame(function(){e.classList.add(s)})},()=>{r()})}}},"./node_modules/@dojo/framework/widget-core/d.mjs":function(e,t,o){"use strict";t.f=d,t.e=a,t.d=function(e){return Boolean(e&&"string"!=typeof e&&e.type===i)},t.h=function(e,t,o=[]){return{children:o,widgetConstructor:e,properties:t,type:s}},t.g=function(e,t={},o){let r,s=t;Array.isArray(t)&&(o=t,s={});"function"==typeof s&&(r=s,s={});return{tag:e,deferredPropertiesCallback:r,children:o,properties:s,type:n}},t.c=function({node:e,attrs:t={},props:o={},on:r={},diffType:s="none"},n){return{tag:c(e)?e.tagName.toLowerCase():"",properties:o,attributes:t,events:r,children:n,type:i,domNode:e,text:c(e)?void 0:e.data,diffType:s}};var r=o("./node_modules/@dojo/framework/shim/Symbol.mjs");const s=Object(r.a)("Identifier for a WNode.");t.b=s;const n=Object(r.a)("Identifier for a VNode.");t.a=n;const i=Object(r.a)("Identifier for a VNode created using existing dom.");function d(e){return Boolean(e&&"string"!=typeof e&&e.type===s)}function a(e){return Boolean(e&&"string"!=typeof e&&(e.type===n||e.type===i))}function c(e){return!!e.tagName}},"./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs":function(e,t,o){"use strict";t.a=s;var r=o("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs");function s(e){return Object(r.a)((t,o)=>{t.addDecorator("afterRender",o?t[o]:e)})}},"./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs":function(e,t,o){"use strict";t.a=n;var r=o("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"),s=o("./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs");function n(){return Object(r.a)((e,t)=>{Object(s.a)(function(){this.invalidate()})(e)})}},"./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs":function(e,t,o){"use strict";t.a=s;var r=o("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs");function s(e){return Object(r.a)((t,o)=>{t.addDecorator("beforeProperties",o?t[o]:e)})}},"./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs":function(e,t,o){"use strict";t.a=n;var r=o("./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs"),s=o("./node_modules/@dojo/framework/widget-core/Registry.mjs");function n({tag:e,properties:t=[],attributes:o=[],events:n=[],childType:i=r.CustomElementChildType.DOJO,registryFactory:d=(()=>new s.c)}){return function(r){r.prototype.__customElementDescriptor={tagName:e,attributes:o,properties:t,events:n,childType:i,registryFactory:d}}}},"./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs":function(e,t,o){"use strict";t.a=n;var r=o("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"),s=o("./node_modules/@dojo/framework/widget-core/diff.mjs");function n(e,t=s.a,o){return Object(r.a)((r,s)=>{r.addDecorator(`diffProperty:${e}`,t.bind(null)),r.addDecorator("registeredDiffProperty",e),(o||s)&&r.addDecorator("diffReaction",{propertyName:e,reaction:s?r[s]:o})})}},"./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs":function(e,t,o){"use strict";function r(e){return function(t,o,r){"function"==typeof t?e(t.prototype,void 0):e(t,o)}}t.a=r},"./node_modules/@dojo/framework/widget-core/decorators/inject.mjs":function(e,t,o){"use strict";t.a=d;var r=o("./node_modules/@dojo/framework/shim/WeakMap.mjs"),s=o("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"),n=o("./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs");const i=new r.a;function d({name:e,getProperties:t}){return Object(s.a)((o,r)=>{Object(n.a)(function(o){const r=this.registry.getInjector(e);if(r){const{injector:e,invalidator:s}=r,n=i.get(this)||[];return 0===n.length&&i.set(this,n),-1===n.indexOf(r)&&(this.own(s.on("invalidate",()=>{this.invalidate()})),n.push(r)),t(e(),o)}})(o)})}},"./node_modules/@dojo/framework/widget-core/diff.mjs":function(e,t,o){"use strict";t.b=i,t.a=function(e,t){let o;o="function"==typeof t?t._type===r.b?n(e,t):function(e,t){return{changed:!1,value:t}}(0,t):s(t)?i(e,t):n(e,t);return o};var r=o("./node_modules/@dojo/framework/widget-core/Registry.mjs");function s(e){return"[object Object]"===Object.prototype.toString.call(e)||Array.isArray(e)}function n(e,t){return{changed:e!==t,value:t}}function i(e,t){let o=!1;const r=e&&s(e),n=t&&s(t);if(!r||!n)return{changed:!0,value:t};const i=Object.keys(e),d=Object.keys(t);return{changed:o=i.length!==d.length||d.some(o=>t[o]!==e[o]),value:t}}},"./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs":function(e,t,o){"use strict";t.a=u;var r,s,n=o("./node_modules/tslib/tslib.es6.js"),i=o("./node_modules/@dojo/framework/core/lang.mjs"),d=o("./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs"),a=o("./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs"),c=o("./node_modules/@dojo/framework/widget-core/d.mjs"),l=o("./node_modules/@dojo/framework/widget-core/vdom.mjs");function u(e){class t extends e{constructor(...e){super(...e),this._root=document.body,this._async=!0,this._projectorProperties={},this._projectionOptions={transitions:d.a},this.root=document.body,this.projectorState=r.Detached}append(e){const t={type:s.Append,root:e};return this._attach(t)}merge(e){const t={type:s.Merge,root:e};return this._attach(t)}set root(e){if(this.projectorState===r.Attached)throw new Error("Projector already attached, cannot change root element");this._root=e}get root(){return this._root}get async(){return this._async}set async(e){if(this.projectorState===r.Attached)throw new Error("Projector already attached, cannot change async mode");this._async=e}sandbox(e=document){if(this.projectorState===r.Attached)throw new Error("Projector already attached, cannot create sandbox");this._async=!1;const t=this.root;this.own({destroy:()=>{this._root=t}}),this._attach({root:e.createDocumentFragment(),type:s.Append})}setChildren(e){this.__setChildren__(e)}setProperties(e){this.__setProperties__(e)}__setProperties__(e){this._projectorProperties&&this._projectorProperties.registry!==e.registry&&this._projectorProperties.registry&&this._projectorProperties.registry.destroy(),this._projectorProperties=Object(i.a)({},e),super.__setCoreProperties__({bind:this,baseRegistry:e.registry}),super.__setProperties__(e)}toHtml(){if(this.projectorState!==r.Attached||!this._projection)throw new Error("Projector is not attached, cannot return an HTML string of projection.");return this._projection.domNode.childNodes[0].outerHTML}afterRender(e){let t=e;return"string"!=typeof e&&null!==e&&void 0!==e||(t=Object(c.g)("span",{},[e])),t}destroy(){super.destroy()}_attach({type:e,root:t}){if(t&&(this.root=t),this._attachHandle)return this._attachHandle;this.projectorState=r.Attached;const o={destroy:()=>{this.projectorState===r.Attached&&(this._projection=void 0,this.projectorState=r.Detached)}};switch(this.own(o),this._attachHandle=o,this._projectionOptions=Object.assign({},this._projectionOptions,{sync:!this._async}),e){case s.Append:this._projection=l.a.append(this.root,this,this._projectionOptions);break;case s.Merge:this._projection=l.a.merge(this.root,this,this._projectionOptions)}return this._attachHandle}}return n.a([Object(a.a)()],t.prototype,"afterRender",null),t}!function(e){e[e.Attached=1]="Attached",e[e.Detached=2]="Detached"}(r||(r={})),function(e){e[e.Append=1]="Append",e[e.Merge=2]="Merge"}(s||(s={}))},"./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs":function(e,t,o){"use strict";t.c=function(e){return Object(i.a)(t=>{t.addDecorator("baseThemeClasses",e)})},t.b=function(e,t){const o=new s.a(e);return t.defineInjector(l,e=>(o.setInvalidator(e),()=>o.get())),o},t.a=u;var r=o("./node_modules/tslib/tslib.es6.js"),s=o("./node_modules/@dojo/framework/widget-core/Injector.mjs"),n=o("./node_modules/@dojo/framework/widget-core/decorators/inject.mjs"),i=o("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"),d=o("./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs"),a=o("./node_modules/@dojo/framework/widget-core/diff.mjs");const c=" _key",l=Symbol("theme");function u(e){let t=class extends e{constructor(){super(...arguments),this._registeredBaseThemeKeys=[],this._recalculateClasses=!0,this._theme={}}theme(e){return this._recalculateClasses&&this._recalculateThemeClasses(),Array.isArray(e)?e.map(e=>this._getThemeClass(e)):this._getThemeClass(e)}onPropertiesChanged(){this._recalculateClasses=!0}_getThemeClass(e){if(void 0===e||null===e)return e;const t=this.properties.extraClasses||{},o=this._baseThemeClassesReverseLookup[e];let r=[];return o?(t[o]&&r.push(t[o]),this._theme[o]?r.push(this._theme[o]):r.push(this._registeredBaseTheme[o]),r.join(" ")):(console.warn(`Class name: '${e}' not found in theme`),null)}_recalculateThemeClasses(){const{theme:e={}}=this.properties,t=this.getDecorator("baseThemeClasses");this._registeredBaseTheme||(this._registeredBaseTheme=t.reduce((e,t)=>{const o=c,s=t[o],n=r.b(t,["symbol"==typeof o?o:o+""]);return this._registeredBaseThemeKeys.push(s),Object.assign({},e,n)},{}),this._baseThemeClassesReverseLookup=t.reduce((e,t)=>(Object.keys(t).forEach(o=>{e[t[o]]=o}),e),{})),this._theme=this._registeredBaseThemeKeys.reduce((t,o)=>Object.assign({},t,e[o]),{}),this._recalculateClasses=!1}};return r.a([Object(d.a)("theme",a.b),Object(d.a)("extraClasses",a.b)],t.prototype,"onPropertiesChanged",null),t=r.a([Object(n.a)({name:l,getProperties:(e,t)=>t.theme?{}:{theme:e}})],t)}},"./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs":function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),o.d(t,"CustomElementChildType",function(){return r}),t.DomToWidgetWrapper=m,t.create=h,t.register=p;var r,s=o("./node_modules/tslib/tslib.es6.js"),n=o("./node_modules/@dojo/framework/widget-core/WidgetBase.mjs"),i=o("./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs"),d=o("./node_modules/@dojo/framework/shim/array.mjs"),a=o("./node_modules/@dojo/framework/widget-core/d.mjs"),c=o("./node_modules/@dojo/framework/shim/global.mjs"),l=o("./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs"),u=o("./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs");function m(e){let t=class extends n.a{render(){const t=Object.keys(this.properties).reduce((e,t)=>{const o=this.properties[t];return 0===t.indexOf("on")&&(t=`__${t}`),e[t]=o,e},{});return Object(a.c)({node:e,props:t,diffType:"dom"})}static get domNode(){return e}};return t=s.a([Object(u.a)()],t)}function h(e,t){const{attributes:o,childType:s,registryFactory:u}=e,h={};return o.forEach(e=>{const t=e.toLowerCase();h[t]=e}),class extends HTMLElement{constructor(){super(...arguments),this._properties={},this._children=[],this._eventProperties={},this._initialised=!1}connectedCallback(){if(this._initialised)return;const o={},{attributes:h,properties:p,events:f}=e;this._properties=Object.assign({},this._properties,this._attributesToProperties(h)),[...h,...p].forEach(e=>{const t=this[e],r=e.replace(/^on/,"__");void 0!==t&&(this._properties[e]=t),r!==e&&(o[r]={get:()=>this._getProperty(e),set:t=>this._setProperty(e,t)}),o[e]={get:()=>this._getProperty(e),set:t=>this._setProperty(e,t)}}),f.forEach(e=>{const t=e.replace(/^on/,"").toLowerCase(),r=e.replace(/^on/,"__on");o[r]={get:()=>this._getEventProperty(e),set:t=>this._setEventProperty(e,t)},this._eventProperties[e]=void 0,this._properties[e]=((...o)=>{const r=this._getEventProperty(e);"function"==typeof r&&r(...o),this.dispatchEvent(new CustomEvent(t,{bubbles:!1,detail:o}))})}),Object.defineProperties(this,o);const g=s===r.TEXT?this.childNodes:this.children;Object(d.a)(g).forEach(e=>{s===r.DOJO?(e.addEventListener("dojo-ce-render",()=>this._render()),e.addEventListener("dojo-ce-connected",()=>this._render()),this._children.push(m(e))):this._children.push(Object(a.c)({node:e,diffType:"dom"}))}),this.addEventListener("dojo-ce-connected",e=>this._childConnected(e));const j=this._properties,_=()=>this.__children__(),y=u(),b=Object(l.b)(this._getTheme(),y);c.a.addEventListener("dojo-theme-set",()=>b.set(this._getTheme()));const w=Object(i.a)(class extends n.a{render(){return Object(a.h)(t,j,_())}});this._projector=new w,this._projector.setProperties({registry:y}),this._projector.append(this),this._initialised=!0,this.dispatchEvent(new CustomEvent("dojo-ce-connected",{bubbles:!0,detail:this}))}_getTheme(){if(c.a&&c.a.dojoce&&c.a.dojoce.theme)return c.a.dojoce.themes[c.a.dojoce.theme]}_childConnected(e){const t=e.detail;if(t.parentNode===this){this._children.some(e=>e.domNode===t)||(t.addEventListener("dojo-ce-render",()=>this._render()),this._children.push(m(t)),this._render())}}_render(){this._projector&&(this._projector.invalidate(),this.dispatchEvent(new CustomEvent("dojo-ce-render",{bubbles:!1,detail:this})))}__properties__(){return Object.assign({},this._properties,this._eventProperties)}__children__(){return s===r.DOJO?this._children.filter(e=>e.domNode.isWidget).map(e=>{const{domNode:t}=e;return Object(a.h)(e,Object.assign({},t.__properties__()),[...t.__children__()])}):this._children}attributeChangedCallback(e,t,o){const r=h[e];this._setProperty(r,o)}_setEventProperty(e,t){this._eventProperties[e]=t}_getEventProperty(e){return this._eventProperties[e]}_setProperty(e,t){"function"==typeof t&&(t[n.b]=!0),this._properties[e]=t,this._render()}_getProperty(e){return this._properties[e]}_attributesToProperties(e){return e.reduce((e,t)=>{const o=t.toLowerCase(),r=this.getAttribute(o);return null!==r&&(e[t]=r),e},{})}static get observedAttributes(){return Object.keys(h)}get isWidget(){return!0}}}function p(e){const t=e.prototype&&e.prototype.__customElementDescriptor;if(!t)throw new Error("Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?");c.a.customElements.define(t.tagName,h(t,e))}!function(e){e.DOJO="DOJO",e.NODE="NODE",e.TEXT="TEXT"}(r||(r={})),t.default=p},"./node_modules/@dojo/framework/widget-core/vdom.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/global.mjs"),s=o("./node_modules/@dojo/framework/shim/array.mjs"),n=o("./node_modules/@dojo/framework/widget-core/d.mjs"),i=o("./node_modules/@dojo/framework/widget-core/Registry.mjs"),d=o("./node_modules/@dojo/framework/shim/WeakMap.mjs");const a="http://www.w3.org/2000/svg",c="http://www.w3.org/1999/xlink",l=[],u=["focus","blur","scrollIntoView","click"],m=new d.a;t.b=m;const h=new d.a,p=new d.a,f=new d.a;function g(e,t){return Object(n.e)(e)&&Object(n.e)(t)?(!Object(n.d)(e)&&!Object(n.d)(t)||e.domNode===t.domNode)&&(e.tag===t.tag&&e.properties.key===t.properties.key):!(!Object(n.f)(e)||!Object(n.f)(t))&&((void 0!==e.instance||"string"!=typeof t.widgetConstructor)&&(e.widgetConstructor===t.widgetConstructor&&e.properties.key===t.properties.key))}const j=function(){throw new Error("Provide a transitions object to the projectionOptions to do animations")};function _(e){if("string"!=typeof e)throw new Error("Style values must be strings")}function y(e,t,o,r,s,n){const i=f.get(r.projectorInstance),a=i.nodeMap.get(e)||new d.a;if(n){const o=a.get(n);e.removeEventListener(t,o)}let c=o.bind(s);"input"===t&&(c=function(e){o.call(this,e),e.target["oninput-value"]=e.target.value}.bind(s)),e.addEventListener(t,c),a.set(o,c),i.nodeMap.set(e,a)}function b(e,t){if(t){const o=t.split(" ");for(let t=0;t{r[e]()})}}function k(e,t,o,r,s=!1){const n=f.get(r.projectorInstance).nodeMap.get(e);n&&Object.keys(t).forEach(r=>{const i="on"===r.substr(0,2)||s,d=s?r:r.substr(2);if(i&&!o[r]){const o=n.get(t[r]);o&&e.removeEventListener(d,o)}})}function O(e,t,o,r){r.namespace===a&&"href"===t?e.setAttributeNS(c,t,o):"role"===t&&""===o||void 0===o?e.removeAttribute(t):e.setAttribute(t,o)}function P(e,t,o,r){const s=Object.keys(o),n=s.length;for(let i=0;i0)if(c&&0!==c.length){const r=[...o];for(let o=0;o0&&R(r.children,t));else{if(!r.coreProperties){const e=m.get(t);r.coreProperties={bind:t,baseRegistry:e.coreProperties.baseRegistry}}r.children&&r.children.length>0&&R(r.children,t)}o++}else e.splice(o,1)}return e}function A(e,t){if(Object(n.e)(e)&&e.properties){const o=e.properties.enterAnimation;o&&("function"==typeof o?o(e.domNode,e.properties):t.enter(e.domNode,e.properties,o))}}function M(e,t,o){if(Object(n.f)(e)){const r=h.get(e.instance),s=(r?r.dnode.rendered:e.rendered)||l;if(e.instance){m.get(e.instance).onDetach(),h.delete(e.instance)}for(let e=0;e0)for(let r=0;r{let d=void 0,a=o,m=p+1,f=o[p];if(f||(f=t[0],m=1,a=t),f){let t=[f];for(;t.length;){const o=t.shift();if(Object(n.f)(o)){const e=h.get(o.instance);e&&e.dnode.rendered&&t.push(...e.dnode.rendered)}else if(o.domNode){if(o.domNode.parentElement!==e.domNode)break;d=o.domNode;break}0===t.length&&a[m]&&(t.push(a[m]),m++)}}S(l,e,r.slice(j+1),d,i,s),A(l,c);const g=j;u.afterRenderCallbacks.push(()=>{x(r,g,s)})};if(!a||-1===m){f(),j++;continue}const y=()=>{const e=p;if(u.afterRenderCallbacks.push(()=>{x(o,e,s)}),Object(n.f)(a)){const e=h.get(a.instance);e&&(a=e.dnode)}M(a,c,i)};-1!==C(r,a,j+1)?(f(),y(),p++,j++):(y(),p++)}if(d>p)for(m=p;m{x(o,e,s)});let t=o[m];if(Object(n.f)(t)){const e=h.get(t.instance);e&&(t=e.dnode)}M(t,c,i)}return _}function I(e,t,o,r,i,d){if(void 0===t)return;const a=f.get(o.projectorInstance);a.merge&&void 0===d&&(d=Object(s.a)(e.domNode.childNodes));const c=o.transitions;o=Object.assign({},o,{depth:o.depth+1});for(let s=0;s0;)(e=d.shift())&&e.tagName===(l.tag.toUpperCase()||void 0)&&(l.domNode=e)}S(l,e,u,i,o,r)}else S(l,e,u,i,o,r,d);A(l,c)}}function D(e,t,o,r){if(I(t,t.children,r,o,void 0),"function"==typeof t.deferredPropertiesCallback&&void 0===t.inserted&&W(t,r),t.attributes&&t.events){P(e,{},t.attributes,r),E(e,{},t.properties,r,!1),k(e,{},t.events,r,!0);const o=t.events;Object.keys(o).forEach(s=>{y(e,s,o[s],r,t.properties.bind)})}else E(e,{},t.properties,r);if(null!==t.properties.key&&void 0!==t.properties.key){m.get(o).nodeHandler.add(e,`${t.properties.key}`)}t.inserted=!0}function S(e,t,o,r,s,d,c){let l;const u=f.get(s.projectorInstance);if(Object(n.f)(e)){let{widgetConstructor:n}=e;const a=m.get(d);if(!Object(i.d)(n)){const e=a.registry().get(n);if(null===e)return;n=e}const l=new n;e.instance=l,p.set(l,o);const f=m.get(l);f.invalidate=(()=>{f.dirty=!0,!1===f.rendering&&(u.renderQueue.push({instance:l,depth:s.depth}),H(s))}),f.rendering=!0,l.__setCoreProperties__(e.coreProperties),l.__setChildren__(e.children),l.__setProperties__(e.properties);const g=l.__render__();if(f.rendering=!1,g){const o=R(g,l);e.rendered=o,I(t,o,s,l,r,c)}h.set(l,{dnode:e,parentVNode:t}),f.nodeHandler.addRoot(),u.afterRenderCallbacks.push(()=>{f.onAttach()})}else{if(u.merge&&void 0!==u.mergeElement)return l=e.domNode=s.mergeElement,u.mergeElement=void 0,void D(l,e,d,s);const o=t.domNode.ownerDocument;if(e.tag||"string"!=typeof e.text)void 0===e.domNode?("svg"===e.tag&&(s=Object.assign({},s,{namespace:a})),l=void 0!==s.namespace?e.domNode=o.createElementNS(s.namespace,e.tag):e.domNode=e.domNode||o.createElement(e.tag)):l=e.domNode,D(l,e,d,s),void 0!==r?t.domNode.insertBefore(l,r):l.parentNode!==t.domNode&&t.domNode.appendChild(l);else if(void 0!==e.domNode&&t.domNode){const o=e.domNode.ownerDocument.createTextNode(e.text);t.domNode===e.domNode.parentNode?t.domNode.replaceChild(o,e.domNode):(t.domNode.appendChild(o),e.domNode.parentNode&&e.domNode.parentNode.removeChild(e.domNode)),e.domNode=o}else l=e.domNode=o.createTextNode(e.text),void 0!==r?t.domNode.insertBefore(l,r):t.domNode.appendChild(l)}}function L(e,t,o,r,s,i,d){if(Object(n.f)(t)){const{instance:r}=e,{parentVNode:s,dnode:n}=h.get(r),a=n?n.rendered:e.rendered,c=m.get(r);if(c.rendering=!0,r.__setCoreProperties__(t.coreProperties),r.__setChildren__(t.children),r.__setProperties__(t.properties),p.set(r,d),t.instance=r,!0===c.dirty){const e=r.__render__();c.rendering=!1,t.rendered=R(e,r),T(s,i,a,t.rendered,r,o)}else c.rendering=!1,t.rendered=a;h.set(r,{dnode:t,parentVNode:s}),c.nodeHandler.addRoot()}else{if(e===t)return!1;const r=t.domNode=e.domNode;let n=!1,d=!1;if(t.tag||"string"!=typeof t.text){if(t.tag&&0===t.tag.lastIndexOf("svg",0)&&(o=Object.assign({},o,{namespace:a})),e.children!==t.children){const r=R(t.children,s);t.children=r,d=T(t,i,e.children,r,s,o)||d}const n=function(e,t,o){const{diffType:r,properties:s,attributes:n}=o;if(!r||"vdom"===r)return{properties:t.properties,attributes:t.attributes,events:t.events};if("none"===r)return{properties:{},attributes:t.attributes?{}:void 0,events:t.events};let i={properties:{}};return n?(i.attributes={},i.events=t.events,Object.keys(s).forEach(t=>{i.properties[t]=e[t]}),Object.keys(n).forEach(t=>{i.attributes[t]=e.getAttribute(t)}),i):(i.properties=Object.keys(s).reduce((t,o)=>(t[o]=e.getAttribute(o)||e[o],t),{}),i)}(r,e,t);if(t.attributes&&t.events){P(r,n.attributes,t.attributes,o),d=E(r,n.properties,t.properties,o,!1)||d,k(r,n.events,t.events,o,!0);const e=t.events;Object.keys(e).forEach(s=>{y(r,s,e[s],o,t.properties.bind,n.events[s])})}else d=E(r,n.properties,t.properties,o)||d;if(null!==t.properties.key&&void 0!==t.properties.key){m.get(s).nodeHandler.add(r,`${t.properties.key}`)}}else if(t.text!==e.text){const e=r.ownerDocument.createTextNode(t.text);return r.parentNode.replaceChild(e,r),t.domNode=e,n=!0}d&&t.properties&&t.properties.updateAnimation&&t.properties.updateAnimation(r,t.properties,e.properties)}}function W(e,t){e.decoratedDeferredProperties=e.properties;const o=e.deferredPropertiesCallback(!!e.inserted),r=f.get(t.projectorInstance);e.properties=Object.assign({},o,e.decoratedDeferredProperties),r.deferredRenderCallbacks.push(()=>{const o=Object.assign({},e.deferredPropertiesCallback(!!e.inserted),e.decoratedDeferredProperties);E(e.domNode,e.properties,o,t),e.properties=o})}function B(e){const t=f.get(e.projectorInstance);if(t.deferredRenderCallbacks.length)if(e.sync)for(;t.deferredRenderCallbacks.length;){const e=t.deferredRenderCallbacks.shift();e&&e()}else r.a.requestAnimationFrame(()=>{for(;t.deferredRenderCallbacks.length;){const e=t.deferredRenderCallbacks.shift();e&&e()}})}function F(e){const t=f.get(e.projectorInstance);if(e.sync)for(;t.afterRenderCallbacks.length;){const e=t.afterRenderCallbacks.shift();e&&e()}else r.a.requestIdleCallback?r.a.requestIdleCallback(()=>{for(;t.afterRenderCallbacks.length;){const e=t.afterRenderCallbacks.shift();e&&e()}}):setTimeout(()=>{for(;t.afterRenderCallbacks.length;){const e=t.afterRenderCallbacks.shift();e&&e()}})}function H(e){const t=f.get(e.projectorInstance);e.sync?$(e):void 0===t.renderScheduled&&(t.renderScheduled=r.a.requestAnimationFrame(()=>{$(e)}))}function $(e){const t=f.get(e.projectorInstance);t.renderScheduled=void 0;const o=[...t.renderQueue];t.renderQueue=[],o.sort((e,t)=>e.depth-t.depth);const r=[];for(;o.length;){const{instance:t}=o.shift();if(h.has(t)&&-1===r.indexOf(t)){r.push(t);const{parentVNode:o,dnode:s}=h.get(t),n=m.get(t),i=p.get(t);L(s,N(t,n),e,0,t,i,i)}}F(e),B(e)}const q={append:function(e,t,o={}){const r=m.get(t),s=function(e,t){const o={namespace:void 0,styleApplyer:function(e,t,o){e.style[t]=o},transitions:{enter:j,exit:j},depth:0,merge:!1,sync:!1,projectorInstance:t};return Object.assign({},o,e)}(o,t),i={afterRenderCallbacks:[],deferredRenderCallbacks:[],nodeMap:new d.a,renderScheduled:void 0,renderQueue:[],merge:o.merge||!1,mergeElement:o.mergeElement};f.set(t,i),s.rootNode=e;const a={tag:"",properties:{},children:void 0,domNode:s.rootNode,type:n.a};const c=N(t,r);return h.set(t,{dnode:c,parentVNode:a}),r.invalidate=(()=>{r.dirty=!0,!1===r.rendering&&(i.renderQueue.push({instance:t,depth:s.depth}),H(s))}),L(c,c,s,0,t,[],[]),i.afterRenderCallbacks.push(()=>{r.onAttach()}),B(s),F(s),{domNode:s.rootNode}},create:function(e,t){return this.append(document.createElement("div"),e,t)},merge:function(e,t,o={}){o.merge=!0,o.mergeElement=e;const r=this.append(e.parentNode,t,o);return f.get(t).merge=!1,r}};t.a=q},"./node_modules/imports-loader/index.js?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js":function(e,t,o){var r=o("./src/menu-item/MenuItem.ts"),s=o("./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs").default,n=r.default;n&&s(n)},"./node_modules/process/browser.js":function(e,t){var o,r,s=e.exports={};function n(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function d(e){if(o===setTimeout)return setTimeout(e,0);if((o===n||!o)&&setTimeout)return o=setTimeout,setTimeout(e,0);try{return o(e,0)}catch(t){try{return o.call(null,e,0)}catch(t){return o.call(this,e,0)}}}!function(){try{o="function"==typeof setTimeout?setTimeout:n}catch(e){o=n}try{r="function"==typeof clearTimeout?clearTimeout:i}catch(e){r=i}}();var a,c=[],l=!1,u=-1;function m(){l&&a&&(l=!1,a.length?c=a.concat(c):u=-1,c.length&&h())}function h(){if(!l){var e=d(m);l=!0;for(var t=c.length;t;){for(a=c,c=[];++u1)for(var o=1;o=0;d--)(s=e[d])&&(i=(n<3?s(i):n>3?s(t,o,i):s(t,o))||i);return n>3&&i&&Object.defineProperty(t,o,i),i}; /*! ***************************************************************************** Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use @@ -21,5 +21,5 @@ MERCHANTABLITY OR NON-INFRINGEMENT. See the Apache Version 2.0 License for specific language governing permissions and limitations under the License. ***************************************************************************** */ -Object.setPrototypeOf||Array;Object.assign},"./node_modules/webpack/buildin/global.js":function(e,t){var o;o=function(){return this}();try{o=o||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(o=window)}e.exports=o},"./src/menu-item/MenuItem.ts":function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),o.d(t,"MenuItem",function(){return c});var r=o("./node_modules/tslib/tslib.es6.js"),s=o("./node_modules/@dojo/widget-core/d.mjs"),n=o("./node_modules/@dojo/widget-core/decorators/customElement.mjs"),i=o("./node_modules/@dojo/widget-core/mixins/Themed.mjs"),d=o("./node_modules/@dojo/widget-core/WidgetBase.mjs"),a=o("./src/menu-item/menuItem.m.css");o.n(a);let c=class extends(Object(i.a)(d.a)){_onClick(){this.properties.onSelected&&this.properties.onSelected(this.properties.data)}render(){const{title:e,selected:t}=this.properties;return Object(s.g)("li",{classes:this.theme(a.root)},[Object(s.g)("span",{classes:this.theme([a.item,t?a.selected:null]),onclick:this._onClick},[e])])}};c=r.a([Object(n.a)({tag:"demo-menu-item",attributes:["title","selected"],events:["onSelected"],properties:["data","selected"]}),Object(i.c)(a)],c),t.default=c},"./src/menu-item/menuItem.m.css":function(e,t){e.exports={" _key":"test-app/menuItem",root:"sUmUi4Sh",item:"_2Mk6Rdqa",selected:"_1-f3ItOh"}},0:function(e,t,o){e.exports=o("./node_modules/imports-loader/index.js?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js")}}); +Object.setPrototypeOf||Array;Object.assign},"./node_modules/webpack/buildin/global.js":function(e,t){var o;o=function(){return this}();try{o=o||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(o=window)}e.exports=o},"./src/menu-item/MenuItem.ts":function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),o.d(t,"MenuItem",function(){return c});var r=o("./node_modules/tslib/tslib.es6.js"),s=o("./node_modules/@dojo/framework/widget-core/d.mjs"),n=o("./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs"),i=o("./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs"),d=o("./node_modules/@dojo/framework/widget-core/WidgetBase.mjs"),a=o("./src/menu-item/menuItem.m.css");o.n(a);let c=class extends(Object(i.a)(d.a)){_onClick(){this.properties.onSelected&&this.properties.onSelected(this.properties.data)}render(){const{title:e,selected:t}=this.properties;return Object(s.g)("li",{classes:this.theme(a.root)},[Object(s.g)("span",{classes:this.theme([a.item,t?a.selected:null]),onclick:this._onClick},[e])])}};c=r.a([Object(n.a)({tag:"demo-menu-item",attributes:["title","selected"],events:["onSelected"],properties:["data","selected"]}),Object(i.c)(a)],c),t.default=c},"./src/menu-item/menuItem.m.css":function(e,t){e.exports={" _key":"test-app/menuItem",root:"sUmUi4Sh",item:"_2Mk6Rdqa",selected:"_1-f3ItOh"}},0:function(e,t,o){e.exports=o("./node_modules/imports-loader/index.js?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js")}}); //# sourceMappingURL=menu-item-1.0.0.js.map \ No newline at end of file diff --git a/test-app/fixtures/windows/dist/menu-item/menu-item-1.0.0.js.map b/test-app/fixtures/windows/dist/menu-item/menu-item-1.0.0.js.map index 3f50624..b171fd9 100644 --- a/test-app/fixtures/windows/dist/menu-item/menu-item-1.0.0.js.map +++ b/test-app/fixtures/windows/dist/menu-item/menu-item-1.0.0.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 569730b4d721e461702a","webpack:///./node_modules/@dojo/core/Destroyable.mjs","webpack:///./node_modules/@dojo/core/Evented.mjs","webpack:///./node_modules/@dojo/core/lang.mjs","webpack:///./node_modules/@dojo/has/has.mjs","webpack:///./node_modules/@dojo/shim/Map.mjs","webpack:///./node_modules/@dojo/shim/Promise.mjs","webpack:///./node_modules/@dojo/shim/Symbol.mjs","webpack:///./node_modules/@dojo/shim/WeakMap.mjs","webpack:///./node_modules/@dojo/shim/array.mjs","webpack:///./node_modules/@dojo/shim/global.mjs","webpack:///./node_modules/@dojo/shim/number.mjs","webpack:///./node_modules/@dojo/shim/object.mjs","webpack:///./node_modules/@dojo/shim/string.mjs","webpack:///./node_modules/@dojo/shim/support/has.mjs","webpack:///./node_modules/@dojo/shim/support/queue.mjs","webpack:///./node_modules/@dojo/shim/support/util.mjs","webpack:///./node_modules/@dojo/widget-core/Injector.mjs","webpack:///./node_modules/@dojo/widget-core/NodeHandler.mjs","webpack:///./node_modules/@dojo/widget-core/Registry.mjs","webpack:///./node_modules/@dojo/widget-core/RegistryHandler.mjs","webpack:///./node_modules/@dojo/widget-core/WidgetBase.mjs","webpack:///./node_modules/@dojo/widget-core/animations/cssTransitions.mjs","webpack:///./node_modules/@dojo/widget-core/d.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/afterRender.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/customElement.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/diffProperty.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/inject.mjs","webpack:///./node_modules/@dojo/widget-core/diff.mjs","webpack:///./node_modules/@dojo/widget-core/mixins/Projector.mjs","webpack:///./node_modules/@dojo/widget-core/mixins/Themed.mjs","webpack:///./node_modules/@dojo/widget-core/registerCustomElement.mjs","webpack:///./node_modules/@dojo/widget-core/vdom.mjs","webpack:///./node_modules/@dojo/cli-build-widget/template/custom-element.js","webpack:///./node_modules/process/browser.js","webpack:///./node_modules/tslib/tslib.es6.js","webpack:///(webpack)/buildin/global.js","webpack:///./src/menu-item/MenuItem.ts","webpack:///./src/menu-item/menuItem.m.css?6a95"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","noop","__WEBPACK_IMPORTED_MODULE_1__dojo_shim_Promise__","resolve","destroyed","Error","Destroyable","[object Object]","this","handles","handle","Array","isArray","__WEBPACK_IMPORTED_MODULE_0__lang__","_handles","push","splice","indexOf","destroy","forEach","own","__webpack_exports__","regexMap","__WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__","Evented","__WEBPACK_IMPORTED_MODULE_1__Destroyable__","super","arguments","listenersMap","event","methods","type","globString","targetString","regex","has","RegExp","replace","set","test","isGlobMatch","method","listener","map","_addListener","listeners","destructor","called","createHandle","length","slice","testCache","testFunctions","testThenables","globalScope","window","global","self","staticFeatures","DojoHasEnvironment","staticCache","apply","add","feature","value","overwrite","normalizedFeature","toLowerCase","Boolean","exists","TypeError","then","isFeatureTestThenable","resolvedValue","result","document","location","process","versions","node","Map","__WEBPACK_IMPORTED_MODULE_1__global__","ShimPromise","__WEBPACK_IMPORTED_MODULE_0__global__","Promise","Symbol","wellKnown","__WEBPACK_IMPORTED_MODULE_2__support_util__","for","WeakMap","from","of","copyWithin","fill","find","findIndex","includes","__WEBPACK_IMPORTED_MODULE_4__support_util__","globalObject","Math","pow","assign","getOwnPropertyDescriptor","getOwnPropertyNames","getOwnPropertySymbols","is","keys","getOwnPropertyDescriptors","entries","values","fromCodePoint","raw","codePointAt","endsWith","normalize","repeat","startsWith","padEnd","padStart","String","__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__","every","key","Number","POSITIVE_INFINITY","e","imul","Observable","Set","getCallSite","callSite","substitutions","key1","key2","freeze","postMessage","requestAnimationFrame","setImmediate","MutationObserver","WebKitMutationObserver","example","createElement","observer","observe","attributes","style","setProperty","takeRecords","undefined","Animation","KeyframeEffect","executeTask","item","isActive","callback","getQueueHandle","enqueue","queue","addEventListener","source","data","stopPropagation","shift","queueTask","id","queueAnimationTask","rafId","bind","cancelAnimationFrame","writable","nativeFunction","target","args","Injector","__WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__","payload","_payload","invalidator","_invalidator","NodeEventType","_nodeMap","__WEBPACK_IMPORTED_MODULE_1__dojo_shim_Map__","element","emit","Widget","Projector","clear","WIDGET_BASE_TYPE","__WEBPACK_IMPORTED_MODULE_2__dojo_shim_Symbol__","isWidgetBaseConstructor","_type","Registry","__WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__","widgetLabel","action","label","_widgetRegistry","toString","__WEBPACK_IMPORTED_MODULE_0__dojo_shim_Promise__","widgetCtor","emitLoadedEvent","error","injectorFactory","_injectorRegistry","injectorItem","injector","promise","default","isWidgetConstructorDefaultExport","hasInjector","__WEBPACK_IMPORTED_MODULE_1__dojo_core_Evented__","_registry","__WEBPACK_IMPORTED_MODULE_2__Registry__","_registryWidgetLabelMap","_registryInjectorLabelMap","baseRegistry","delete","base","widget","define","defineInjector","globalPrecedence","_get","getFunctionName","labelMap","registries","registry","registeredLabels","on","decoratorMap","boundAuto","__WEBPACK_IMPORTED_MODULE_4__diff__","noBind","WidgetBase","_initialProperties","_changedPropertyKeys","_nodeHandler","__WEBPACK_IMPORTED_MODULE_6__NodeHandler__","_children","_decoratorCache","_properties","_boundRenderFunc","render","_boundInvalidate","invalidate","__WEBPACK_IMPORTED_MODULE_7__vdom__","dirty","onAttach","onDetach","nodeHandler","coreProperties","rendering","inputProperties","_runAfterConstructors","MetaType","_metaMap","cached","properties","changedPropertyKeys","instanceData","__WEBPACK_IMPORTED_MODULE_5__RegistryHandler__","originalProperties","_runBeforeProperties","registeredDiffPropertyNames","getDecorator","propertyNames","allProperties","checkedProperties","diffPropertyResults","runReactions","propertyName","previousProperty","newProperty","_bindFunctionProperty","diffFunctions","changed","_mapDiffPropertyReactions","reaction","previousProperties","newProperties","children","dNode","_runBeforeRenders","runAfterRenders","__WEBPACK_IMPORTED_MODULE_3__d__","decoratorKey","decoratorList","constructor","specificDecoratorList","decorators","allDecorators","instanceMap","unshift","getPrototypeOf","_buildDecoratorList","reduce","reactionPropertyMap","reactionArguments","__WEBPACK_IMPORTED_MODULE_8__Registry__","_bindFunctionPropertyMap","__WEBPACK_IMPORTED_MODULE_1__dojo_shim_WeakMap__","bindInfo","boundFunc","scope","beforeProperties","beforePropertiesFunction","beforeRenders","beforeRenderFunction","updatedRender","console","warn","afterRenders","afterRenderFunction","meta","afterRender","afterConstructors","afterConstructor","pop","browserSpecificTransitionEndEventName","browserSpecificAnimationEndEventName","initialize","determineBrowserStyleNames","runAndCleanUp","startAnimation","finishAnimation","finished","transitionEnd","removeEventListener","enter","enterAnimation","activeClass","enterAnimationActive","classList","remove","exit","exitAnimation","removeNode","exitAnimationActive","child","DOMVNODE","widgetConstructor","WNODE","tag","propertiesOrChildren","deferredPropertiesCallback","VNODE","attrs","props","diffType","isElementNode","tagName","events","domNode","text","__WEBPACK_IMPORTED_MODULE_0__dojo_shim_Symbol__","isWNode","isVNode","__WEBPACK_IMPORTED_MODULE_0__handleDecorator__","propertyKey","addDecorator","alwaysRender","__WEBPACK_IMPORTED_MODULE_1__beforeProperties__","customElement","childType","__WEBPACK_IMPORTED_MODULE_0__registerCustomElement__","DOJO","registryFactory","__WEBPACK_IMPORTED_MODULE_1__Registry__","__customElementDescriptor","diffProperty","diffFunction","reactionFunction","handleDecorator","handler","descriptor","registeredInjectorsMap","__WEBPACK_IMPORTED_MODULE_0__dojo_shim_WeakMap__","inject","getProperties","__WEBPACK_IMPORTED_MODULE_1__handleDecorator__","__WEBPACK_IMPORTED_MODULE_2__beforeProperties__","getInjector","registeredInjectors","__WEBPACK_IMPORTED_MODULE_0__Registry__","reference","ignore","isObjectOrArray","shallow","validOldProperty","validNewProperty","previousKeys","newKeys","some","ProjectorAttachState","AttachType","ProjectorMixin","Base","_root","body","_async","_projectorProperties","_projectionOptions","transitions","__WEBPACK_IMPORTED_MODULE_2__animations_cssTransitions__","root","projectorState","Detached","options","Append","_attach","Merge","Attached","async","doc","previousRoot","createDocumentFragment","__setChildren__","__setProperties__","__WEBPACK_IMPORTED_MODULE_1__dojo_core_lang__","__setCoreProperties__","_projection","childNodes","outerHTML","__WEBPACK_IMPORTED_MODULE_4__d__","_attachHandle","sync","__WEBPACK_IMPORTED_MODULE_5__vdom__","append","merge","__WEBPACK_IMPORTED_MODULE_0_tslib__","__WEBPACK_IMPORTED_MODULE_3__decorators_afterRender__","Function","theme","__WEBPACK_IMPORTED_MODULE_3__decorators_handleDecorator__","themeRegistry","themeInjector","__WEBPACK_IMPORTED_MODULE_1__Injector__","INJECTED_THEME_KEY","setInvalidator","THEME_KEY","ThemedMixin","Themed","_registeredBaseThemeKeys","_recalculateClasses","_theme","classes","_recalculateThemeClasses","className","_getThemeClass","extraClasses","themeClassName","_baseThemeClassesReverseLookup","resultClassNames","_registeredBaseTheme","join","baseThemes","finalBaseTheme","baseTheme","_a","currentClassNames","baseClass","themeKey","__WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__","__WEBPACK_IMPORTED_MODULE_5__diff__","__WEBPACK_IMPORTED_MODULE_2__decorators_inject__","CustomElementChildType","DomToWidgetWrapper","__WEBPACK_IMPORTED_MODULE_1__WidgetBase__","__WEBPACK_IMPORTED_MODULE_7__decorators_alwaysRender__","create","WidgetConstructor","attributeMap","attributeName","HTMLElement","_eventProperties","_initialised","domProperties","_attributesToProperties","filteredPropertyName","_getProperty","_setProperty","eventName","_getEventProperty","_setEventProperty","eventCallback","dispatchEvent","CustomEvent","bubbles","detail","defineProperties","TEXT","__WEBPACK_IMPORTED_MODULE_3__dojo_shim_array__","childNode","_render","_childConnected","widgetProperties","renderChildren","__children__","themeContext","__WEBPACK_IMPORTED_MODULE_6__mixins_Themed__","_getTheme","__WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__","__WEBPACK_IMPORTED_MODULE_2__mixins_Projector__","_projector","setProperties","dojoce","themes","parentNode","filter","Child","isWidget","__properties__","oldValue","getAttribute","observedAttributes","register","customElements","NAMESPACE_SVG","NAMESPACE_W3","NAMESPACE_XLINK","emptyArray","widgetInstanceMap","__WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__","projectorStateMap","same","dnode1","dnode2","__WEBPACK_IMPORTED_MODULE_2__d__","instance","missingTransition","checkStyleValue","styleValue","updateEvent","currentValue","projectionOptions","previousValue","projectorInstance","eventMap","nodeMap","previousEvent","evt","addClasses","classNames","split","removeClasses","focusNode","propValue","deferredRenderCallbacks","focus","removeOrphanedEvents","onlyEvents","propName","isEvent","substr","updateAttribute","attrName","attrValue","namespace","setAttributeNS","removeAttribute","setAttribute","updateAttributes","previousAttributes","attrNames","attrCount","updateProperties","includesEventsAndAttributes","propertiesUpdated","propNames","propCount","previousClasses","currentClasses","newClasses","previousClassName","classIndex","styleNames","styleCount","j","styleName","newStyleValue","styleApplyer","domValue","lastIndexOf","findIndexOfChild","sameAs","start","toInternalWNode","rendered","filterAndDecorateChildren","nodeAdded","dnode","nodeToRemove","pointerEvents","removeDomNode","removeChild","checkDistinguishable","indexToCheck","parentInstance","nodeIdentifier","parentName","updateChildren","parentVNode","oldChildren","newChildren","oldChildrenLength","newChildrenLength","depth","oldIndex","newIndex","textUpdated","oldChild","newChild","inserted","addDeferredProperties","updateDom","findOldIndex","addChild","insertBeforeDomNode","nextIndex","insertBeforeChildren","insertBefore","createDom","afterRenderCallbacks","childToRemove","addChildren","__WEBPACK_IMPORTED_MODULE_1__dojo_shim_array__","domElement","toUpperCase","initPropertiesAndChildren","parentInstanceData","__WEBPACK_IMPORTED_MODULE_3__Registry__","renderQueue","scheduleRender","__render__","filteredRendered","addRoot","mergeElement","ownerDocument","createElementNS","appendChild","newDomNode","createTextNode","replaceChild","previous","previousRendered","updated","current","buildPreviousProperties","updateAnimation","vnode","decoratedDeferredProperties","runDeferredRenderCallbacks","__WEBPACK_IMPORTED_MODULE_0__dojo_shim_global__","runAfterRenderCallbacks","requestIdleCallback","setTimeout","renderScheduled","renders","sort","a","b","previouslyRendered","dom","finalProjectorOptions","projectorOptions","defaults","getProjectionOptions","rootNode","projection","widgetFactory","registerCustomElement","defaultExport","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","fun","clearTimeout","currentQueue","draining","queueIndex","cleanUpNextTick","concat","drainQueue","timeout","len","run","marker","runClearTimeout","Item","array","nextTick","title","browser","env","argv","version","addListener","once","off","removeListener","removeAllListeners","prependListener","prependOnceListener","binding","cwd","chdir","dir","umask","t","desc","r","Reflect","decorate","metadataKey","metadataValue","metadata","setPrototypeOf","g","eval","MenuItem","__WEBPACK_IMPORTED_MODULE_3__dojo_widget_core_mixins_Themed__","__WEBPACK_IMPORTED_MODULE_4__dojo_widget_core_WidgetBase__","onSelected","selected","__WEBPACK_IMPORTED_MODULE_1__dojo_widget_core_d__","__WEBPACK_IMPORTED_MODULE_5__menuItem_m_css__","onclick","_onClick","__WEBPACK_IMPORTED_MODULE_2__dojo_widget_core_decorators_customElement__"," _key"],"mappings":"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","file":"menu-item-1.0.0.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 569730b4d721e461702a","import { createCompositeHandle } from './lang';\nimport Promise from '@dojo/shim/Promise';\n/**\n * No operation function to replace own once instance is destoryed\n */\nfunction noop() {\n return Promise.resolve(false);\n}\n/**\n * No op function used to replace own, once instance has been destoryed\n */\nfunction destroyed() {\n throw new Error('Call made to destroyed method');\n}\nexport class Destroyable {\n /**\n * @constructor\n */\n constructor() {\n this.handles = [];\n }\n /**\n * Register handles for the instance that will be destroyed when `this.destroy` is called\n *\n * @param {Handle} handle The handle to add for the instance\n * @returns {Handle} a handle for the handle, removes the handle for the instance and calls destroy\n */\n own(handles) {\n const handle = Array.isArray(handles) ? createCompositeHandle(...handles) : handles;\n const { handles: _handles } = this;\n _handles.push(handle);\n return {\n destroy() {\n _handles.splice(_handles.indexOf(handle));\n handle.destroy();\n }\n };\n }\n /**\n * Destrpys all handers registered for the instance\n *\n * @returns {Promise {\n this.handles.forEach((handle) => {\n handle && handle.destroy && handle.destroy();\n });\n this.destroy = noop;\n this.own = destroyed;\n resolve(true);\n });\n }\n}\nexport default Destroyable;\n//# sourceMappingURL=Destroyable.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/core/Destroyable.mjs\n// module id = ./node_modules/@dojo/core/Destroyable.mjs\n// module chunks = menu-item","import Map from '@dojo/shim/Map';\r\nimport { Destroyable } from './Destroyable';\r\n/**\r\n * Map of computed regular expressions, keyed by string\r\n */\r\nconst regexMap = new Map();\r\n/**\r\n * Determines is the event type glob has been matched\r\n *\r\n * @returns boolean that indicates if the glob is matched\r\n */\r\nexport function isGlobMatch(globString, targetString) {\r\n if (typeof targetString === 'string' && typeof globString === 'string' && globString.indexOf('*') !== -1) {\r\n let regex;\r\n if (regexMap.has(globString)) {\r\n regex = regexMap.get(globString);\r\n }\r\n else {\r\n regex = new RegExp(`^${globString.replace(/\\*/g, '.*')}$`);\r\n regexMap.set(globString, regex);\r\n }\r\n return regex.test(targetString);\r\n }\r\n else {\r\n return globString === targetString;\r\n }\r\n}\r\n/**\r\n * Event Class\r\n */\r\nexport class Evented extends Destroyable {\r\n constructor() {\r\n super(...arguments);\r\n /**\r\n * map of listeners keyed by event type\r\n */\r\n this.listenersMap = new Map();\r\n }\r\n emit(event) {\r\n this.listenersMap.forEach((methods, type) => {\r\n if (isGlobMatch(type, event.type)) {\r\n methods.forEach((method) => {\r\n method.call(this, event);\r\n });\r\n }\r\n });\r\n }\r\n on(type, listener) {\r\n if (Array.isArray(listener)) {\r\n const handles = listener.map((listener) => this._addListener(type, listener));\r\n return {\r\n destroy() {\r\n handles.forEach((handle) => handle.destroy());\r\n }\r\n };\r\n }\r\n return this._addListener(type, listener);\r\n }\r\n _addListener(type, listener) {\r\n const listeners = this.listenersMap.get(type) || [];\r\n listeners.push(listener);\r\n this.listenersMap.set(type, listeners);\r\n return {\r\n destroy: () => {\r\n const listeners = this.listenersMap.get(type) || [];\r\n listeners.splice(listeners.indexOf(listener), 1);\r\n }\r\n };\r\n }\r\n}\r\nexport default Evented;\r\n//# sourceMappingURL=Evented.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/core/Evented.mjs\n// module id = ./node_modules/@dojo/core/Evented.mjs\n// module chunks = menu-item","import { assign } from '@dojo/shim/object';\nexport { assign } from '@dojo/shim/object';\nconst slice = Array.prototype.slice;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Type guard that ensures that the value can be coerced to Object\n * to weed out host objects that do not derive from Object.\n * This function is used to check if we want to deep copy an object or not.\n * Note: In ES6 it is possible to modify an object's Symbol.toStringTag property, which will\n * change the value returned by `toString`. This is a rare edge case that is difficult to handle,\n * so it is not handled here.\n * @param value The value to check\n * @return If the value is coercible into an Object\n */\nfunction shouldDeepCopyObject(value) {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\nfunction copyArray(array, inherited) {\n return array.map(function (item) {\n if (Array.isArray(item)) {\n return copyArray(item, inherited);\n }\n return !shouldDeepCopyObject(item)\n ? item\n : _mixin({\n deep: true,\n inherited: inherited,\n sources: [item],\n target: {}\n });\n });\n}\nfunction _mixin(kwArgs) {\n const deep = kwArgs.deep;\n const inherited = kwArgs.inherited;\n const target = kwArgs.target;\n const copied = kwArgs.copied || [];\n const copiedClone = [...copied];\n for (let i = 0; i < kwArgs.sources.length; i++) {\n const source = kwArgs.sources[i];\n if (source === null || source === undefined) {\n continue;\n }\n for (let key in source) {\n if (inherited || hasOwnProperty.call(source, key)) {\n let value = source[key];\n if (copiedClone.indexOf(value) !== -1) {\n continue;\n }\n if (deep) {\n if (Array.isArray(value)) {\n value = copyArray(value, inherited);\n }\n else if (shouldDeepCopyObject(value)) {\n const targetValue = target[key] || {};\n copied.push(source);\n value = _mixin({\n deep: true,\n inherited: inherited,\n sources: [value],\n target: targetValue,\n copied\n });\n }\n }\n target[key] = value;\n }\n }\n }\n return target;\n}\nexport function create(prototype, ...mixins) {\n if (!mixins.length) {\n throw new RangeError('lang.create requires at least one mixin object.');\n }\n const args = mixins.slice();\n args.unshift(Object.create(prototype));\n return assign.apply(null, args);\n}\nexport function deepAssign(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: false,\n sources: sources,\n target: target\n });\n}\nexport function deepMixin(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Creates a new object using the provided source's prototype as the prototype for the new object, and then\n * deep copies the provided source's values into the new target.\n *\n * @param source The object to duplicate\n * @return The new object\n */\nexport function duplicate(source) {\n const target = Object.create(Object.getPrototypeOf(source));\n return deepMixin(target, source);\n}\n/**\n * Determines whether two values are the same value.\n *\n * @param a First value to compare\n * @param b Second value to compare\n * @return true if the values are the same; false otherwise\n */\nexport function isIdentical(a, b) {\n return (a === b ||\n /* both values are NaN */\n (a !== a && b !== b));\n}\n/**\n * Returns a function that binds a method to the specified object at runtime. This is similar to\n * `Function.prototype.bind`, but instead of a function it takes the name of a method on an object.\n * As a result, the function returned by `lateBind` will always call the function currently assigned to\n * the specified property on the object as of the moment the function it returns is called.\n *\n * @param instance The context object\n * @param method The name of the method on the context object to bind to itself\n * @param suppliedArgs An optional array of values to prepend to the `instance[method]` arguments list\n * @return The bound function\n */\nexport function lateBind(instance, method, ...suppliedArgs) {\n return suppliedArgs.length\n ? function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n // TS7017\n return instance[method].apply(instance, args);\n }\n : function () {\n // TS7017\n return instance[method].apply(instance, arguments);\n };\n}\nexport function mixin(target, ...sources) {\n return _mixin({\n deep: false,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Returns a function which invokes the given function with the given arguments prepended to its argument list.\n * Like `Function.prototype.bind`, but does not alter execution context.\n *\n * @param targetFunction The function that needs to be bound\n * @param suppliedArgs An optional array of arguments to prepend to the `targetFunction` arguments list\n * @return The bound function\n */\nexport function partial(targetFunction, ...suppliedArgs) {\n return function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n return targetFunction.apply(this, args);\n };\n}\n/**\n * Returns an object with a destroy method that, when called, calls the passed-in destructor.\n * This is intended to provide a unified interface for creating \"remove\" / \"destroy\" handlers for\n * event listeners, timers, etc.\n *\n * @param destructor A function that will be called when the handle's `destroy` method is invoked\n * @return The handle object\n */\nexport function createHandle(destructor) {\n let called = false;\n return {\n destroy: function () {\n if (!called) {\n called = true;\n destructor();\n }\n }\n };\n}\n/**\n * Returns a single handle that can be used to destroy multiple handles simultaneously.\n *\n * @param handles An array of handles with `destroy` methods\n * @return The handle object\n */\nexport function createCompositeHandle(...handles) {\n return createHandle(function () {\n for (let i = 0; i < handles.length; i++) {\n handles[i].destroy();\n }\n });\n}\n//# sourceMappingURL=lang.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/core/lang.mjs\n// module id = ./node_modules/@dojo/core/lang.mjs\n// module chunks = menu-item","function isFeatureTestThenable(value) {\r\n return value && value.then;\r\n}\r\n/**\r\n * A cache of results of feature tests\r\n */\r\nexport const testCache = {};\r\n/**\r\n * A cache of the un-resolved feature tests\r\n */\r\nexport const testFunctions = {};\r\n/**\r\n * A cache of unresolved thenables (probably promises)\r\n * @type {{}}\r\n */\r\nconst testThenables = {};\r\n/**\r\n * A reference to the global scope (`window` in a browser, `global` in NodeJS)\r\n */\r\nconst globalScope = (function () {\r\n /* istanbul ignore else */\r\n if (typeof window !== 'undefined') {\r\n // Browsers\r\n return window;\r\n }\r\n else if (typeof global !== 'undefined') {\r\n // Node\r\n return global;\r\n }\r\n else if (typeof self !== 'undefined') {\r\n // Web workers\r\n return self;\r\n }\r\n /* istanbul ignore next */\r\n return {};\r\n})();\r\n/* Grab the staticFeatures if there are available */\r\nconst { staticFeatures } = globalScope.DojoHasEnvironment || {};\r\n/* Cleaning up the DojoHasEnviornment */\r\nif ('DojoHasEnvironment' in globalScope) {\r\n delete globalScope.DojoHasEnvironment;\r\n}\r\n/**\r\n * Custom type guard to narrow the `staticFeatures` to either a map or a function that\r\n * returns a map.\r\n *\r\n * @param value The value to guard for\r\n */\r\nfunction isStaticFeatureFunction(value) {\r\n return typeof value === 'function';\r\n}\r\n/**\r\n * The cache of asserted features that were available in the global scope when the\r\n * module loaded\r\n */\r\nconst staticCache = staticFeatures\r\n ? isStaticFeatureFunction(staticFeatures) ? staticFeatures.apply(globalScope) : staticFeatures\r\n : {}; /* Providing an empty cache, if none was in the environment\r\n\r\n/**\r\n* AMD plugin function.\r\n*\r\n* Conditional loads modules based on a has feature test value.\r\n*\r\n* @param resourceId Gives the resolved module id to load.\r\n* @param require The loader require function with respect to the module that contained the plugin resource in its\r\n* dependency list.\r\n* @param load Callback to loader that consumes result of plugin demand.\r\n*/\r\nexport function load(resourceId, require, load, config) {\r\n resourceId ? require([resourceId], load) : load();\r\n}\r\n/**\r\n * AMD plugin function.\r\n *\r\n * Resolves resourceId into a module id based on possibly-nested tenary expression that branches on has feature test\r\n * value(s).\r\n *\r\n * @param resourceId The id of the module\r\n * @param normalize Resolves a relative module id into an absolute module id\r\n */\r\nexport function normalize(resourceId, normalize) {\r\n const tokens = resourceId.match(/[\\?:]|[^:\\?]*/g) || [];\r\n let i = 0;\r\n function get(skip) {\r\n const term = tokens[i++];\r\n if (term === ':') {\r\n // empty string module name, resolves to null\r\n return null;\r\n }\r\n else {\r\n // postfixed with a ? means it is a feature to branch on, the term is the name of the feature\r\n if (tokens[i++] === '?') {\r\n if (!skip && has(term)) {\r\n // matched the feature, get the first value from the options\r\n return get();\r\n }\r\n else {\r\n // did not match, get the second value, passing over the first\r\n get(true);\r\n return get(skip);\r\n }\r\n }\r\n // a module\r\n return term;\r\n }\r\n }\r\n const id = get();\r\n return id && normalize(id);\r\n}\r\n/**\r\n * Check if a feature has already been registered\r\n *\r\n * @param feature the name of the feature\r\n */\r\nexport function exists(feature) {\r\n const normalizedFeature = feature.toLowerCase();\r\n return Boolean(normalizedFeature in staticCache || normalizedFeature in testCache || testFunctions[normalizedFeature]);\r\n}\r\n/**\r\n * Register a new test for a named feature.\r\n *\r\n * @example\r\n * has.add('dom-addeventlistener', !!document.addEventListener);\r\n *\r\n * @example\r\n * has.add('touch-events', function () {\r\n * return 'ontouchstart' in document\r\n * });\r\n *\r\n * @param feature the name of the feature\r\n * @param value the value reported of the feature, or a function that will be executed once on first test\r\n * @param overwrite if an existing value should be overwritten. Defaults to false.\r\n */\r\nexport function add(feature, value, overwrite = false) {\r\n const normalizedFeature = feature.toLowerCase();\r\n if (exists(normalizedFeature) && !overwrite && !(normalizedFeature in staticCache)) {\r\n throw new TypeError(`Feature \"${feature}\" exists and overwrite not true.`);\r\n }\r\n if (typeof value === 'function') {\r\n testFunctions[normalizedFeature] = value;\r\n }\r\n else if (isFeatureTestThenable(value)) {\r\n testThenables[feature] = value.then((resolvedValue) => {\r\n testCache[feature] = resolvedValue;\r\n delete testThenables[feature];\r\n }, () => {\r\n delete testThenables[feature];\r\n });\r\n }\r\n else {\r\n testCache[normalizedFeature] = value;\r\n delete testFunctions[normalizedFeature];\r\n }\r\n}\r\n/**\r\n * Return the current value of a named feature.\r\n *\r\n * @param feature The name (if a string) or identifier (if an integer) of the feature to test.\r\n */\r\nexport default function has(feature) {\r\n let result;\r\n const normalizedFeature = feature.toLowerCase();\r\n if (normalizedFeature in staticCache) {\r\n result = staticCache[normalizedFeature];\r\n }\r\n else if (testFunctions[normalizedFeature]) {\r\n result = testCache[normalizedFeature] = testFunctions[normalizedFeature].call(null);\r\n delete testFunctions[normalizedFeature];\r\n }\r\n else if (normalizedFeature in testCache) {\r\n result = testCache[normalizedFeature];\r\n }\r\n else if (feature in testThenables) {\r\n return false;\r\n }\r\n else {\r\n throw new TypeError(`Attempt to detect unregistered has feature \"${feature}\"`);\r\n }\r\n return result;\r\n}\r\n/*\r\n * Out of the box feature tests\r\n */\r\n/* Environments */\r\n/* Used as a value to provide a debug only code path */\r\nadd('debug', true);\r\n/* Detects if the environment is \"browser like\" */\r\nadd('host-browser', typeof document !== 'undefined' && typeof location !== 'undefined');\r\n/* Detects if the environment appears to be NodeJS */\r\nadd('host-node', function () {\r\n if (typeof process === 'object' && process.versions && process.versions.node) {\r\n return process.versions.node;\r\n }\r\n});\r\n//# sourceMappingURL=has.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/has/has.mjs\n// module id = ./node_modules/@dojo/has/has.mjs\n// module chunks = menu-item","import { isArrayLike, ShimIterator } from './iterator';\r\nimport global from './global';\r\nimport { is as objectIs } from './object';\r\nimport has from './support/has';\r\nimport './Symbol';\r\nexport let Map = global.Map;\r\nif (!true) {\r\n Map = (_a = class Map {\r\n constructor(iterable) {\r\n this._keys = [];\r\n this._values = [];\r\n this[Symbol.toStringTag] = 'Map';\r\n if (iterable) {\r\n if (isArrayLike(iterable)) {\r\n for (let i = 0; i < iterable.length; i++) {\r\n const value = iterable[i];\r\n this.set(value[0], value[1]);\r\n }\r\n }\r\n else {\r\n for (const value of iterable) {\r\n this.set(value[0], value[1]);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * An alternative to Array.prototype.indexOf using Object.is\r\n * to check for equality. See http://mzl.la/1zuKO2V\r\n */\r\n _indexOfKey(keys, key) {\r\n for (let i = 0, length = keys.length; i < length; i++) {\r\n if (objectIs(keys[i], key)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n get size() {\r\n return this._keys.length;\r\n }\r\n clear() {\r\n this._keys.length = this._values.length = 0;\r\n }\r\n delete(key) {\r\n const index = this._indexOfKey(this._keys, key);\r\n if (index < 0) {\r\n return false;\r\n }\r\n this._keys.splice(index, 1);\r\n this._values.splice(index, 1);\r\n return true;\r\n }\r\n entries() {\r\n const values = this._keys.map((key, i) => {\r\n return [key, this._values[i]];\r\n });\r\n return new ShimIterator(values);\r\n }\r\n forEach(callback, context) {\r\n const keys = this._keys;\r\n const values = this._values;\r\n for (let i = 0, length = keys.length; i < length; i++) {\r\n callback.call(context, values[i], keys[i], this);\r\n }\r\n }\r\n get(key) {\r\n const index = this._indexOfKey(this._keys, key);\r\n return index < 0 ? undefined : this._values[index];\r\n }\r\n has(key) {\r\n return this._indexOfKey(this._keys, key) > -1;\r\n }\r\n keys() {\r\n return new ShimIterator(this._keys);\r\n }\r\n set(key, value) {\r\n let index = this._indexOfKey(this._keys, key);\r\n index = index < 0 ? this._keys.length : index;\r\n this._keys[index] = key;\r\n this._values[index] = value;\r\n return this;\r\n }\r\n values() {\r\n return new ShimIterator(this._values);\r\n }\r\n [Symbol.iterator]() {\r\n return this.entries();\r\n }\r\n },\r\n _a[Symbol.species] = _a,\r\n _a);\r\n}\r\nexport default Map;\r\nvar _a;\r\n//# sourceMappingURL=Map.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/Map.mjs\n// module id = ./node_modules/@dojo/shim/Map.mjs\n// module chunks = menu-item","import global from './global';\r\nimport { queueMicroTask } from './support/queue';\r\nimport './Symbol';\r\nimport has from './support/has';\r\nexport let ShimPromise = global.Promise;\r\nexport const isThenable = function isThenable(value) {\r\n return value && typeof value.then === 'function';\r\n};\r\nif (!true) {\r\n global.Promise = ShimPromise = (_a = class Promise {\r\n /**\r\n * Creates a new Promise.\r\n *\r\n * @constructor\r\n *\r\n * @param executor\r\n * The executor function is called immediately when the Promise is instantiated. It is responsible for\r\n * starting the asynchronous operation when it is invoked.\r\n *\r\n * The executor must call either the passed `resolve` function when the asynchronous operation has completed\r\n * successfully, or the `reject` function when the operation fails.\r\n */\r\n constructor(executor) {\r\n /**\r\n * The current state of this promise.\r\n */\r\n this.state = 1 /* Pending */;\r\n this[Symbol.toStringTag] = 'Promise';\r\n /**\r\n * If true, the resolution of this promise is chained (\"locked in\") to another promise.\r\n */\r\n let isChained = false;\r\n /**\r\n * Whether or not this promise is in a resolved state.\r\n */\r\n const isResolved = () => {\r\n return this.state !== 1 /* Pending */ || isChained;\r\n };\r\n /**\r\n * Callbacks that should be invoked once the asynchronous operation has completed.\r\n */\r\n let callbacks = [];\r\n /**\r\n * Initially pushes callbacks onto a queue for execution once this promise settles. After the promise settles,\r\n * enqueues callbacks for execution on the next event loop turn.\r\n */\r\n let whenFinished = function (callback) {\r\n if (callbacks) {\r\n callbacks.push(callback);\r\n }\r\n };\r\n /**\r\n * Settles this promise.\r\n *\r\n * @param newState The resolved state for this promise.\r\n * @param {T|any} value The resolved value for this promise.\r\n */\r\n const settle = (newState, value) => {\r\n // A promise can only be settled once.\r\n if (this.state !== 1 /* Pending */) {\r\n return;\r\n }\r\n this.state = newState;\r\n this.resolvedValue = value;\r\n whenFinished = queueMicroTask;\r\n // Only enqueue a callback runner if there are callbacks so that initially fulfilled Promises don't have to\r\n // wait an extra turn.\r\n if (callbacks && callbacks.length > 0) {\r\n queueMicroTask(function () {\r\n if (callbacks) {\r\n let count = callbacks.length;\r\n for (let i = 0; i < count; ++i) {\r\n callbacks[i].call(null);\r\n }\r\n callbacks = null;\r\n }\r\n });\r\n }\r\n };\r\n /**\r\n * Resolves this promise.\r\n *\r\n * @param newState The resolved state for this promise.\r\n * @param {T|any} value The resolved value for this promise.\r\n */\r\n const resolve = (newState, value) => {\r\n if (isResolved()) {\r\n return;\r\n }\r\n if (isThenable(value)) {\r\n value.then(settle.bind(null, 0 /* Fulfilled */), settle.bind(null, 2 /* Rejected */));\r\n isChained = true;\r\n }\r\n else {\r\n settle(newState, value);\r\n }\r\n };\r\n this.then = (onFulfilled, onRejected) => {\r\n return new Promise((resolve, reject) => {\r\n // whenFinished initially queues up callbacks for execution after the promise has settled. Once the\r\n // promise has settled, whenFinished will schedule callbacks for execution on the next turn through the\r\n // event loop.\r\n whenFinished(() => {\r\n const callback = this.state === 2 /* Rejected */ ? onRejected : onFulfilled;\r\n if (typeof callback === 'function') {\r\n try {\r\n resolve(callback(this.resolvedValue));\r\n }\r\n catch (error) {\r\n reject(error);\r\n }\r\n }\r\n else if (this.state === 2 /* Rejected */) {\r\n reject(this.resolvedValue);\r\n }\r\n else {\r\n resolve(this.resolvedValue);\r\n }\r\n });\r\n });\r\n };\r\n try {\r\n executor(resolve.bind(null, 0 /* Fulfilled */), resolve.bind(null, 2 /* Rejected */));\r\n }\r\n catch (error) {\r\n settle(2 /* Rejected */, error);\r\n }\r\n }\r\n static all(iterable) {\r\n return new this(function (resolve, reject) {\r\n const values = [];\r\n let complete = 0;\r\n let total = 0;\r\n let populating = true;\r\n function fulfill(index, value) {\r\n values[index] = value;\r\n ++complete;\r\n finish();\r\n }\r\n function finish() {\r\n if (populating || complete < total) {\r\n return;\r\n }\r\n resolve(values);\r\n }\r\n function processItem(index, item) {\r\n ++total;\r\n if (isThenable(item)) {\r\n // If an item Promise rejects, this Promise is immediately rejected with the item\r\n // Promise's rejection error.\r\n item.then(fulfill.bind(null, index), reject);\r\n }\r\n else {\r\n Promise.resolve(item).then(fulfill.bind(null, index));\r\n }\r\n }\r\n let i = 0;\r\n for (const value of iterable) {\r\n processItem(i, value);\r\n i++;\r\n }\r\n populating = false;\r\n finish();\r\n });\r\n }\r\n static race(iterable) {\r\n return new this(function (resolve, reject) {\r\n for (const item of iterable) {\r\n if (item instanceof Promise) {\r\n // If a Promise item rejects, this Promise is immediately rejected with the item\r\n // Promise's rejection error.\r\n item.then(resolve, reject);\r\n }\r\n else {\r\n Promise.resolve(item).then(resolve);\r\n }\r\n }\r\n });\r\n }\r\n static reject(reason) {\r\n return new this(function (resolve, reject) {\r\n reject(reason);\r\n });\r\n }\r\n static resolve(value) {\r\n return new this(function (resolve) {\r\n resolve(value);\r\n });\r\n }\r\n catch(onRejected) {\r\n return this.then(undefined, onRejected);\r\n }\r\n },\r\n _a[Symbol.species] = ShimPromise,\r\n _a);\r\n}\r\nexport default ShimPromise;\r\nvar _a;\r\n//# sourceMappingURL=Promise.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/Promise.mjs\n// module id = ./node_modules/@dojo/shim/Promise.mjs\n// module chunks = menu-item","import has from './support/has';\r\nimport global from './global';\r\nimport { getValueDescriptor } from './support/util';\r\nexport let Symbol = global.Symbol;\r\nif (!true) {\r\n /**\r\n * Throws if the value is not a symbol, used internally within the Shim\r\n * @param {any} value The value to check\r\n * @return {symbol} Returns the symbol or throws\r\n */\r\n const validateSymbol = function validateSymbol(value) {\r\n if (!isSymbol(value)) {\r\n throw new TypeError(value + ' is not a symbol');\r\n }\r\n return value;\r\n };\r\n const defineProperties = Object.defineProperties;\r\n const defineProperty = Object.defineProperty;\r\n const create = Object.create;\r\n const objPrototype = Object.prototype;\r\n const globalSymbols = {};\r\n const getSymbolName = (function () {\r\n const created = create(null);\r\n return function (desc) {\r\n let postfix = 0;\r\n let name;\r\n while (created[String(desc) + (postfix || '')]) {\r\n ++postfix;\r\n }\r\n desc += String(postfix || '');\r\n created[desc] = true;\r\n name = '@@' + desc;\r\n // FIXME: Temporary guard until the duplicate execution when testing can be\r\n // pinned down.\r\n if (!Object.getOwnPropertyDescriptor(objPrototype, name)) {\r\n defineProperty(objPrototype, name, {\r\n set: function (value) {\r\n defineProperty(this, name, getValueDescriptor(value));\r\n }\r\n });\r\n }\r\n return name;\r\n };\r\n })();\r\n const InternalSymbol = function Symbol(description) {\r\n if (this instanceof InternalSymbol) {\r\n throw new TypeError('TypeError: Symbol is not a constructor');\r\n }\r\n return Symbol(description);\r\n };\r\n Symbol = global.Symbol = function Symbol(description) {\r\n if (this instanceof Symbol) {\r\n throw new TypeError('TypeError: Symbol is not a constructor');\r\n }\r\n const sym = Object.create(InternalSymbol.prototype);\r\n description = description === undefined ? '' : String(description);\r\n return defineProperties(sym, {\r\n __description__: getValueDescriptor(description),\r\n __name__: getValueDescriptor(getSymbolName(description))\r\n });\r\n };\r\n /* Decorate the Symbol function with the appropriate properties */\r\n defineProperty(Symbol, 'for', getValueDescriptor(function (key) {\r\n if (globalSymbols[key]) {\r\n return globalSymbols[key];\r\n }\r\n return (globalSymbols[key] = Symbol(String(key)));\r\n }));\r\n defineProperties(Symbol, {\r\n keyFor: getValueDescriptor(function (sym) {\r\n let key;\r\n validateSymbol(sym);\r\n for (key in globalSymbols) {\r\n if (globalSymbols[key] === sym) {\r\n return key;\r\n }\r\n }\r\n }),\r\n hasInstance: getValueDescriptor(Symbol.for('hasInstance'), false, false),\r\n isConcatSpreadable: getValueDescriptor(Symbol.for('isConcatSpreadable'), false, false),\r\n iterator: getValueDescriptor(Symbol.for('iterator'), false, false),\r\n match: getValueDescriptor(Symbol.for('match'), false, false),\r\n observable: getValueDescriptor(Symbol.for('observable'), false, false),\r\n replace: getValueDescriptor(Symbol.for('replace'), false, false),\r\n search: getValueDescriptor(Symbol.for('search'), false, false),\r\n species: getValueDescriptor(Symbol.for('species'), false, false),\r\n split: getValueDescriptor(Symbol.for('split'), false, false),\r\n toPrimitive: getValueDescriptor(Symbol.for('toPrimitive'), false, false),\r\n toStringTag: getValueDescriptor(Symbol.for('toStringTag'), false, false),\r\n unscopables: getValueDescriptor(Symbol.for('unscopables'), false, false)\r\n });\r\n /* Decorate the InternalSymbol object */\r\n defineProperties(InternalSymbol.prototype, {\r\n constructor: getValueDescriptor(Symbol),\r\n toString: getValueDescriptor(function () {\r\n return this.__name__;\r\n }, false, false)\r\n });\r\n /* Decorate the Symbol.prototype */\r\n defineProperties(Symbol.prototype, {\r\n toString: getValueDescriptor(function () {\r\n return 'Symbol (' + validateSymbol(this).__description__ + ')';\r\n }),\r\n valueOf: getValueDescriptor(function () {\r\n return validateSymbol(this);\r\n })\r\n });\r\n defineProperty(Symbol.prototype, Symbol.toPrimitive, getValueDescriptor(function () {\r\n return validateSymbol(this);\r\n }));\r\n defineProperty(Symbol.prototype, Symbol.toStringTag, getValueDescriptor('Symbol', false, false, true));\r\n defineProperty(InternalSymbol.prototype, Symbol.toPrimitive, getValueDescriptor(Symbol.prototype[Symbol.toPrimitive], false, false, true));\r\n defineProperty(InternalSymbol.prototype, Symbol.toStringTag, getValueDescriptor(Symbol.prototype[Symbol.toStringTag], false, false, true));\r\n}\r\n/**\r\n * A custom guard function that determines if an object is a symbol or not\r\n * @param {any} value The value to check to see if it is a symbol or not\r\n * @return {is symbol} Returns true if a symbol or not (and narrows the type guard)\r\n */\r\nexport function isSymbol(value) {\r\n return (value && (typeof value === 'symbol' || value['@@toStringTag'] === 'Symbol')) || false;\r\n}\r\n/**\r\n * Fill any missing well known symbols if the native Symbol is missing them\r\n */\r\n[\r\n 'hasInstance',\r\n 'isConcatSpreadable',\r\n 'iterator',\r\n 'species',\r\n 'replace',\r\n 'search',\r\n 'split',\r\n 'match',\r\n 'toPrimitive',\r\n 'toStringTag',\r\n 'unscopables',\r\n 'observable'\r\n].forEach((wellKnown) => {\r\n if (!Symbol[wellKnown]) {\r\n Object.defineProperty(Symbol, wellKnown, getValueDescriptor(Symbol.for(wellKnown), false, false));\r\n }\r\n});\r\nexport default Symbol;\r\n//# sourceMappingURL=Symbol.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/Symbol.mjs\n// module id = ./node_modules/@dojo/shim/Symbol.mjs\n// module chunks = menu-item","import global from './global';\r\nimport { isArrayLike } from './iterator';\r\nimport has from './support/has';\r\nimport './Symbol';\r\nexport let WeakMap = global.WeakMap;\r\nif (!true) {\r\n const DELETED = {};\r\n const getUID = function getUID() {\r\n return Math.floor(Math.random() * 100000000);\r\n };\r\n const generateName = (function () {\r\n let startId = Math.floor(Date.now() % 100000000);\r\n return function generateName() {\r\n return '__wm' + getUID() + (startId++ + '__');\r\n };\r\n })();\r\n WeakMap = class WeakMap {\r\n constructor(iterable) {\r\n this[Symbol.toStringTag] = 'WeakMap';\r\n this._name = generateName();\r\n this._frozenEntries = [];\r\n if (iterable) {\r\n if (isArrayLike(iterable)) {\r\n for (let i = 0; i < iterable.length; i++) {\r\n const item = iterable[i];\r\n this.set(item[0], item[1]);\r\n }\r\n }\r\n else {\r\n for (const [key, value] of iterable) {\r\n this.set(key, value);\r\n }\r\n }\r\n }\r\n }\r\n _getFrozenEntryIndex(key) {\r\n for (let i = 0; i < this._frozenEntries.length; i++) {\r\n if (this._frozenEntries[i].key === key) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n delete(key) {\r\n if (key === undefined || key === null) {\r\n return false;\r\n }\r\n const entry = key[this._name];\r\n if (entry && entry.key === key && entry.value !== DELETED) {\r\n entry.value = DELETED;\r\n return true;\r\n }\r\n const frozenIndex = this._getFrozenEntryIndex(key);\r\n if (frozenIndex >= 0) {\r\n this._frozenEntries.splice(frozenIndex, 1);\r\n return true;\r\n }\r\n return false;\r\n }\r\n get(key) {\r\n if (key === undefined || key === null) {\r\n return undefined;\r\n }\r\n const entry = key[this._name];\r\n if (entry && entry.key === key && entry.value !== DELETED) {\r\n return entry.value;\r\n }\r\n const frozenIndex = this._getFrozenEntryIndex(key);\r\n if (frozenIndex >= 0) {\r\n return this._frozenEntries[frozenIndex].value;\r\n }\r\n }\r\n has(key) {\r\n if (key === undefined || key === null) {\r\n return false;\r\n }\r\n const entry = key[this._name];\r\n if (Boolean(entry && entry.key === key && entry.value !== DELETED)) {\r\n return true;\r\n }\r\n const frozenIndex = this._getFrozenEntryIndex(key);\r\n if (frozenIndex >= 0) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n set(key, value) {\r\n if (!key || (typeof key !== 'object' && typeof key !== 'function')) {\r\n throw new TypeError('Invalid value used as weak map key');\r\n }\r\n let entry = key[this._name];\r\n if (!entry || entry.key !== key) {\r\n entry = Object.create(null, {\r\n key: { value: key }\r\n });\r\n if (Object.isFrozen(key)) {\r\n this._frozenEntries.push(entry);\r\n }\r\n else {\r\n Object.defineProperty(key, this._name, {\r\n value: entry\r\n });\r\n }\r\n }\r\n entry.value = value;\r\n return this;\r\n }\r\n };\r\n}\r\nexport default WeakMap;\r\n//# sourceMappingURL=WeakMap.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/WeakMap.mjs\n// module id = ./node_modules/@dojo/shim/WeakMap.mjs\n// module chunks = menu-item","import global from './global';\r\nimport { isArrayLike, isIterable } from './iterator';\r\nimport { MAX_SAFE_INTEGER } from './number';\r\nimport has from './support/has';\r\nimport { wrapNative } from './support/util';\r\nexport let from;\r\n/**\r\n * Creates a new array from the function parameters.\r\n *\r\n * @param arguments Any number of arguments for the array\r\n * @return An array from the given arguments\r\n */\r\nexport let of;\r\n/* ES6 Array instance methods */\r\n/**\r\n * Copies data internally within an array or array-like object.\r\n *\r\n * @param target The target array-like object\r\n * @param offset The index to start copying values to; if negative, it counts backwards from length\r\n * @param start The first (inclusive) index to copy; if negative, it counts backwards from length\r\n * @param end The last (exclusive) index to copy; if negative, it counts backwards from length\r\n * @return The target\r\n */\r\nexport let copyWithin;\r\n/**\r\n * Fills elements of an array-like object with the specified value.\r\n *\r\n * @param target The target to fill\r\n * @param value The value to fill each element of the target with\r\n * @param start The first index to fill\r\n * @param end The (exclusive) index at which to stop filling\r\n * @return The filled target\r\n */\r\nexport let fill;\r\n/**\r\n * Finds and returns the first instance matching the callback or undefined if one is not found.\r\n *\r\n * @param target An array-like object\r\n * @param callback A function returning if the current value matches a criteria\r\n * @param thisArg The execution context for the find function\r\n * @return The first element matching the callback, or undefined if one does not exist\r\n */\r\nexport let find;\r\n/**\r\n * Performs a linear search and returns the first index whose value satisfies the passed callback,\r\n * or -1 if no values satisfy it.\r\n *\r\n * @param target An array-like object\r\n * @param callback A function returning true if the current value satisfies its criteria\r\n * @param thisArg The execution context for the find function\r\n * @return The first index whose value satisfies the passed callback, or -1 if no values satisfy it\r\n */\r\nexport let findIndex;\r\n/* ES7 Array instance methods */\r\n/**\r\n * Determines whether an array includes a given value\r\n *\r\n * @param target the target array-like object\r\n * @param searchElement the item to search for\r\n * @param fromIndex the starting index to search from\r\n * @return `true` if the array includes the element, otherwise `false`\r\n */\r\nexport let includes;\r\nif (true && true) {\r\n from = global.Array.from;\r\n of = global.Array.of;\r\n copyWithin = wrapNative(global.Array.prototype.copyWithin);\r\n fill = wrapNative(global.Array.prototype.fill);\r\n find = wrapNative(global.Array.prototype.find);\r\n findIndex = wrapNative(global.Array.prototype.findIndex);\r\n}\r\nelse {\r\n // It is only older versions of Safari/iOS that have a bad fill implementation and so aren't in the wild\r\n // To make things easier, if there is a bad fill implementation, the whole set of functions will be filled\r\n /**\r\n * Ensures a non-negative, non-infinite, safe integer.\r\n *\r\n * @param length The number to validate\r\n * @return A proper length\r\n */\r\n const toLength = function toLength(length) {\r\n if (isNaN(length)) {\r\n return 0;\r\n }\r\n length = Number(length);\r\n if (isFinite(length)) {\r\n length = Math.floor(length);\r\n }\r\n // Ensure a non-negative, real, safe integer\r\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\r\n };\r\n /**\r\n * From ES6 7.1.4 ToInteger()\r\n *\r\n * @param value A value to convert\r\n * @return An integer\r\n */\r\n const toInteger = function toInteger(value) {\r\n value = Number(value);\r\n if (isNaN(value)) {\r\n return 0;\r\n }\r\n if (value === 0 || !isFinite(value)) {\r\n return value;\r\n }\r\n return (value > 0 ? 1 : -1) * Math.floor(Math.abs(value));\r\n };\r\n /**\r\n * Normalizes an offset against a given length, wrapping it if negative.\r\n *\r\n * @param value The original offset\r\n * @param length The total length to normalize against\r\n * @return If negative, provide a distance from the end (length); otherwise provide a distance from 0\r\n */\r\n const normalizeOffset = function normalizeOffset(value, length) {\r\n return value < 0 ? Math.max(length + value, 0) : Math.min(value, length);\r\n };\r\n from = function from(arrayLike, mapFunction, thisArg) {\r\n if (arrayLike == null) {\r\n throw new TypeError('from: requires an array-like object');\r\n }\r\n if (mapFunction && thisArg) {\r\n mapFunction = mapFunction.bind(thisArg);\r\n }\r\n /* tslint:disable-next-line:variable-name */\r\n const Constructor = this;\r\n const length = toLength(arrayLike.length);\r\n // Support extension\r\n const array = typeof Constructor === 'function' ? Object(new Constructor(length)) : new Array(length);\r\n if (!isArrayLike(arrayLike) && !isIterable(arrayLike)) {\r\n return array;\r\n }\r\n // if this is an array and the normalized length is 0, just return an empty array. this prevents a problem\r\n // with the iteration on IE when using a NaN array length.\r\n if (isArrayLike(arrayLike)) {\r\n if (length === 0) {\r\n return [];\r\n }\r\n for (let i = 0; i < arrayLike.length; i++) {\r\n array[i] = mapFunction ? mapFunction(arrayLike[i], i) : arrayLike[i];\r\n }\r\n }\r\n else {\r\n let i = 0;\r\n for (const value of arrayLike) {\r\n array[i] = mapFunction ? mapFunction(value, i) : value;\r\n i++;\r\n }\r\n }\r\n if (arrayLike.length !== undefined) {\r\n array.length = length;\r\n }\r\n return array;\r\n };\r\n of = function of(...items) {\r\n return Array.prototype.slice.call(items);\r\n };\r\n copyWithin = function copyWithin(target, offset, start, end) {\r\n if (target == null) {\r\n throw new TypeError('copyWithin: target must be an array-like object');\r\n }\r\n const length = toLength(target.length);\r\n offset = normalizeOffset(toInteger(offset), length);\r\n start = normalizeOffset(toInteger(start), length);\r\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\r\n let count = Math.min(end - start, length - offset);\r\n let direction = 1;\r\n if (offset > start && offset < start + count) {\r\n direction = -1;\r\n start += count - 1;\r\n offset += count - 1;\r\n }\r\n while (count > 0) {\r\n if (start in target) {\r\n target[offset] = target[start];\r\n }\r\n else {\r\n delete target[offset];\r\n }\r\n offset += direction;\r\n start += direction;\r\n count--;\r\n }\r\n return target;\r\n };\r\n fill = function fill(target, value, start, end) {\r\n const length = toLength(target.length);\r\n let i = normalizeOffset(toInteger(start), length);\r\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\r\n while (i < end) {\r\n target[i++] = value;\r\n }\r\n return target;\r\n };\r\n find = function find(target, callback, thisArg) {\r\n const index = findIndex(target, callback, thisArg);\r\n return index !== -1 ? target[index] : undefined;\r\n };\r\n findIndex = function findIndex(target, callback, thisArg) {\r\n const length = toLength(target.length);\r\n if (!callback) {\r\n throw new TypeError('find: second argument must be a function');\r\n }\r\n if (thisArg) {\r\n callback = callback.bind(thisArg);\r\n }\r\n for (let i = 0; i < length; i++) {\r\n if (callback(target[i], i, target)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n };\r\n}\r\nif (true) {\r\n includes = wrapNative(global.Array.prototype.includes);\r\n}\r\nelse {\r\n /**\r\n * Ensures a non-negative, non-infinite, safe integer.\r\n *\r\n * @param length The number to validate\r\n * @return A proper length\r\n */\r\n const toLength = function toLength(length) {\r\n length = Number(length);\r\n if (isNaN(length)) {\r\n return 0;\r\n }\r\n if (isFinite(length)) {\r\n length = Math.floor(length);\r\n }\r\n // Ensure a non-negative, real, safe integer\r\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\r\n };\r\n includes = function includes(target, searchElement, fromIndex = 0) {\r\n let len = toLength(target.length);\r\n for (let i = fromIndex; i < len; ++i) {\r\n const currentElement = target[i];\r\n if (searchElement === currentElement ||\r\n (searchElement !== searchElement && currentElement !== currentElement)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n}\r\n//# sourceMappingURL=array.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/array.mjs\n// module id = ./node_modules/@dojo/shim/array.mjs\n// module chunks = menu-item","const globalObject = (function () {\n if (typeof global !== 'undefined') {\n // global spec defines a reference to the global object called 'global'\n // https://github.com/tc39/proposal-global\n // `global` is also defined in NodeJS\n return global;\n }\n else if (typeof window !== 'undefined') {\n // window is defined in browsers\n return window;\n }\n else if (typeof self !== 'undefined') {\n // self is defined in WebWorkers\n return self;\n }\n})();\nexport default globalObject;\n//# sourceMappingURL=global.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/global.mjs\n// module id = ./node_modules/@dojo/shim/global.mjs\n// module chunks = menu-item","import global from './global';\n/**\n * The smallest interval between two representable numbers.\n */\nexport const EPSILON = 1;\n/**\n * The maximum safe integer in JavaScript\n */\nexport const MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n/**\n * The minimum safe integer in JavaScript\n */\nexport const MIN_SAFE_INTEGER = -MAX_SAFE_INTEGER;\n/**\n * Determines whether the passed value is NaN without coersion.\n *\n * @param value The value to test\n * @return true if the value is NaN, false if it is not\n */\nexport function isNaN(value) {\n return typeof value === 'number' && global.isNaN(value);\n}\n/**\n * Determines whether the passed value is a finite number without coersion.\n *\n * @param value The value to test\n * @return true if the value is finite, false if it is not\n */\nexport function isFinite(value) {\n return typeof value === 'number' && global.isFinite(value);\n}\n/**\n * Determines whether the passed value is an integer.\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isInteger(value) {\n return isFinite(value) && Math.floor(value) === value;\n}\n/**\n * Determines whether the passed value is an integer that is 'safe,' meaning:\n * 1. it can be expressed as an IEEE-754 double precision number\n * 2. it has a one-to-one mapping to a mathematical integer, meaning its\n * IEEE-754 representation cannot be the result of rounding any other\n * integer to fit the IEEE-754 representation\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isSafeInteger(value) {\n return isInteger(value) && Math.abs(value) <= MAX_SAFE_INTEGER;\n}\n//# sourceMappingURL=number.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/number.mjs\n// module id = ./node_modules/@dojo/shim/number.mjs\n// module chunks = menu-item","import global from './global';\r\nimport has from './support/has';\r\nimport { isSymbol } from './Symbol';\r\nexport let assign;\r\n/**\r\n * Gets the own property descriptor of the specified object.\r\n * An own property descriptor is one that is defined directly on the object and is not\r\n * inherited from the object's prototype.\r\n * @param o Object that contains the property.\r\n * @param p Name of the property.\r\n */\r\nexport let getOwnPropertyDescriptor;\r\n/**\r\n * Returns the names of the own properties of an object. The own properties of an object are those that are defined directly\r\n * on that object, and are not inherited from the object's prototype. The properties of an object include both fields (objects) and functions.\r\n * @param o Object that contains the own properties.\r\n */\r\nexport let getOwnPropertyNames;\r\n/**\r\n * Returns an array of all symbol properties found directly on object o.\r\n * @param o Object to retrieve the symbols from.\r\n */\r\nexport let getOwnPropertySymbols;\r\n/**\r\n * Returns true if the values are the same value, false otherwise.\r\n * @param value1 The first value.\r\n * @param value2 The second value.\r\n */\r\nexport let is;\r\n/**\r\n * Returns the names of the enumerable properties and methods of an object.\r\n * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.\r\n */\r\nexport let keys;\r\n/* ES7 Object static methods */\r\nexport let getOwnPropertyDescriptors;\r\nexport let entries;\r\nexport let values;\r\nif (true) {\r\n const globalObject = global.Object;\r\n assign = globalObject.assign;\r\n getOwnPropertyDescriptor = globalObject.getOwnPropertyDescriptor;\r\n getOwnPropertyNames = globalObject.getOwnPropertyNames;\r\n getOwnPropertySymbols = globalObject.getOwnPropertySymbols;\r\n is = globalObject.is;\r\n keys = globalObject.keys;\r\n}\r\nelse {\r\n keys = function symbolAwareKeys(o) {\r\n return Object.keys(o).filter((key) => !Boolean(key.match(/^@@.+/)));\r\n };\r\n assign = function assign(target, ...sources) {\r\n if (target == null) {\r\n // TypeError if undefined or null\r\n throw new TypeError('Cannot convert undefined or null to object');\r\n }\r\n const to = Object(target);\r\n sources.forEach((nextSource) => {\r\n if (nextSource) {\r\n // Skip over if undefined or null\r\n keys(nextSource).forEach((nextKey) => {\r\n to[nextKey] = nextSource[nextKey];\r\n });\r\n }\r\n });\r\n return to;\r\n };\r\n getOwnPropertyDescriptor = function getOwnPropertyDescriptor(o, prop) {\r\n if (isSymbol(prop)) {\r\n return Object.getOwnPropertyDescriptor(o, prop);\r\n }\r\n else {\r\n return Object.getOwnPropertyDescriptor(o, prop);\r\n }\r\n };\r\n getOwnPropertyNames = function getOwnPropertyNames(o) {\r\n return Object.getOwnPropertyNames(o).filter((key) => !Boolean(key.match(/^@@.+/)));\r\n };\r\n getOwnPropertySymbols = function getOwnPropertySymbols(o) {\r\n return Object.getOwnPropertyNames(o)\r\n .filter((key) => Boolean(key.match(/^@@.+/)))\r\n .map((key) => Symbol.for(key.substring(2)));\r\n };\r\n is = function is(value1, value2) {\r\n if (value1 === value2) {\r\n return value1 !== 0 || 1 / value1 === 1 / value2; // -0\r\n }\r\n return value1 !== value1 && value2 !== value2; // NaN\r\n };\r\n}\r\nif (true) {\r\n const globalObject = global.Object;\r\n getOwnPropertyDescriptors = globalObject.getOwnPropertyDescriptors;\r\n entries = globalObject.entries;\r\n values = globalObject.values;\r\n}\r\nelse {\r\n getOwnPropertyDescriptors = function getOwnPropertyDescriptors(o) {\r\n return getOwnPropertyNames(o).reduce((previous, key) => {\r\n previous[key] = getOwnPropertyDescriptor(o, key);\r\n return previous;\r\n }, {});\r\n };\r\n entries = function entries(o) {\r\n return keys(o).map((key) => [key, o[key]]);\r\n };\r\n values = function values(o) {\r\n return keys(o).map((key) => o[key]);\r\n };\r\n}\r\n//# sourceMappingURL=object.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/object.mjs\n// module id = ./node_modules/@dojo/shim/object.mjs\n// module chunks = menu-item","import global from './global';\r\nimport has from './support/has';\r\nimport { wrapNative } from './support/util';\r\n/**\r\n * The minimum location of high surrogates\r\n */\r\nexport const HIGH_SURROGATE_MIN = 0xd800;\r\n/**\r\n * The maximum location of high surrogates\r\n */\r\nexport const HIGH_SURROGATE_MAX = 0xdbff;\r\n/**\r\n * The minimum location of low surrogates\r\n */\r\nexport const LOW_SURROGATE_MIN = 0xdc00;\r\n/**\r\n * The maximum location of low surrogates\r\n */\r\nexport const LOW_SURROGATE_MAX = 0xdfff;\r\n/* ES6 static methods */\r\n/**\r\n * Return the String value whose elements are, in order, the elements in the List elements.\r\n * If length is 0, the empty string is returned.\r\n * @param codePoints The code points to generate the string\r\n */\r\nexport let fromCodePoint;\r\n/**\r\n * `raw` is intended for use as a tag function of a Tagged Template String. When called\r\n * as such the first argument will be a well formed template call site object and the rest\r\n * parameter will contain the substitution values.\r\n * @param template A well-formed template string call site representation.\r\n * @param substitutions A set of substitution values.\r\n */\r\nexport let raw;\r\n/* ES6 instance methods */\r\n/**\r\n * Returns a nonnegative integer Number less than 1114112 (0x110000) that is the code point\r\n * value of the UTF-16 encoded code point starting at the string element at position pos in\r\n * the String resulting from converting this object to a String.\r\n * If there is no element at that position, the result is undefined.\r\n * If a valid UTF-16 surrogate pair does not begin at pos, the result is the code unit at pos.\r\n */\r\nexport let codePointAt;\r\n/**\r\n * Returns true if the sequence of elements of searchString converted to a String is the\r\n * same as the corresponding elements of this object (converted to a String) starting at\r\n * endPosition – length(this). Otherwise returns false.\r\n */\r\nexport let endsWith;\r\n/**\r\n * Returns true if searchString appears as a substring of the result of converting this\r\n * object to a String, at one or more positions that are\r\n * greater than or equal to position; otherwise, returns false.\r\n * @param target The target string\r\n * @param searchString search string\r\n * @param position If position is undefined, 0 is assumed, so as to search all of the String.\r\n */\r\nexport let includes;\r\n/**\r\n * Returns the String value result of normalizing the string into the normalization form\r\n * named by form as specified in Unicode Standard Annex #15, Unicode Normalization Forms.\r\n * @param target The target string\r\n * @param form Applicable values: \"NFC\", \"NFD\", \"NFKC\", or \"NFKD\", If not specified default\r\n * is \"NFC\"\r\n */\r\nexport let normalize;\r\n/**\r\n * Returns a String value that is made from count copies appended together. If count is 0,\r\n * T is the empty String is returned.\r\n * @param count number of copies to append\r\n */\r\nexport let repeat;\r\n/**\r\n * Returns true if the sequence of elements of searchString converted to a String is the\r\n * same as the corresponding elements of this object (converted to a String) starting at\r\n * position. Otherwise returns false.\r\n */\r\nexport let startsWith;\r\n/* ES7 instance methods */\r\n/**\r\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\r\n * The padding is applied from the end (right) of the current string.\r\n *\r\n * @param target The target string\r\n * @param maxLength The length of the resulting string once the current string has been padded.\r\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\r\n *\r\n * @param fillString The string to pad the current string with.\r\n * If this string is too long, it will be truncated and the left-most part will be applied.\r\n * The default value for this parameter is \" \" (U+0020).\r\n */\r\nexport let padEnd;\r\n/**\r\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\r\n * The padding is applied from the start (left) of the current string.\r\n *\r\n * @param target The target string\r\n * @param maxLength The length of the resulting string once the current string has been padded.\r\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\r\n *\r\n * @param fillString The string to pad the current string with.\r\n * If this string is too long, it will be truncated and the left-most part will be applied.\r\n * The default value for this parameter is \" \" (U+0020).\r\n */\r\nexport let padStart;\r\nif (true && true) {\r\n fromCodePoint = global.String.fromCodePoint;\r\n raw = global.String.raw;\r\n codePointAt = wrapNative(global.String.prototype.codePointAt);\r\n endsWith = wrapNative(global.String.prototype.endsWith);\r\n includes = wrapNative(global.String.prototype.includes);\r\n normalize = wrapNative(global.String.prototype.normalize);\r\n repeat = wrapNative(global.String.prototype.repeat);\r\n startsWith = wrapNative(global.String.prototype.startsWith);\r\n}\r\nelse {\r\n /**\r\n * Validates that text is defined, and normalizes position (based on the given default if the input is NaN).\r\n * Used by startsWith, includes, and endsWith.\r\n *\r\n * @return Normalized position.\r\n */\r\n const normalizeSubstringArgs = function (name, text, search, position, isEnd = false) {\r\n if (text == null) {\r\n throw new TypeError('string.' + name + ' requires a valid string to search against.');\r\n }\r\n const length = text.length;\r\n position = position !== position ? (isEnd ? length : 0) : position;\r\n return [text, String(search), Math.min(Math.max(position, 0), length)];\r\n };\r\n fromCodePoint = function fromCodePoint(...codePoints) {\r\n // Adapted from https://github.com/mathiasbynens/String.fromCodePoint\r\n const length = arguments.length;\r\n if (!length) {\r\n return '';\r\n }\r\n const fromCharCode = String.fromCharCode;\r\n const MAX_SIZE = 0x4000;\r\n let codeUnits = [];\r\n let index = -1;\r\n let result = '';\r\n while (++index < length) {\r\n let codePoint = Number(arguments[index]);\r\n // Code points must be finite integers within the valid range\r\n let isValid = isFinite(codePoint) && Math.floor(codePoint) === codePoint && codePoint >= 0 && codePoint <= 0x10ffff;\r\n if (!isValid) {\r\n throw RangeError('string.fromCodePoint: Invalid code point ' + codePoint);\r\n }\r\n if (codePoint <= 0xffff) {\r\n // BMP code point\r\n codeUnits.push(codePoint);\r\n }\r\n else {\r\n // Astral code point; split in surrogate halves\r\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\r\n codePoint -= 0x10000;\r\n let highSurrogate = (codePoint >> 10) + HIGH_SURROGATE_MIN;\r\n let lowSurrogate = codePoint % 0x400 + LOW_SURROGATE_MIN;\r\n codeUnits.push(highSurrogate, lowSurrogate);\r\n }\r\n if (index + 1 === length || codeUnits.length > MAX_SIZE) {\r\n result += fromCharCode.apply(null, codeUnits);\r\n codeUnits.length = 0;\r\n }\r\n }\r\n return result;\r\n };\r\n raw = function raw(callSite, ...substitutions) {\r\n let rawStrings = callSite.raw;\r\n let result = '';\r\n let numSubstitutions = substitutions.length;\r\n if (callSite == null || callSite.raw == null) {\r\n throw new TypeError('string.raw requires a valid callSite object with a raw value');\r\n }\r\n for (let i = 0, length = rawStrings.length; i < length; i++) {\r\n result += rawStrings[i] + (i < numSubstitutions && i < length - 1 ? substitutions[i] : '');\r\n }\r\n return result;\r\n };\r\n codePointAt = function codePointAt(text, position = 0) {\r\n // Adapted from https://github.com/mathiasbynens/String.prototype.codePointAt\r\n if (text == null) {\r\n throw new TypeError('string.codePointAt requries a valid string.');\r\n }\r\n const length = text.length;\r\n if (position !== position) {\r\n position = 0;\r\n }\r\n if (position < 0 || position >= length) {\r\n return undefined;\r\n }\r\n // Get the first code unit\r\n const first = text.charCodeAt(position);\r\n if (first >= HIGH_SURROGATE_MIN && first <= HIGH_SURROGATE_MAX && length > position + 1) {\r\n // Start of a surrogate pair (high surrogate and there is a next code unit); check for low surrogate\r\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\r\n const second = text.charCodeAt(position + 1);\r\n if (second >= LOW_SURROGATE_MIN && second <= LOW_SURROGATE_MAX) {\r\n return (first - HIGH_SURROGATE_MIN) * 0x400 + second - LOW_SURROGATE_MIN + 0x10000;\r\n }\r\n }\r\n return first;\r\n };\r\n endsWith = function endsWith(text, search, endPosition) {\r\n if (endPosition == null) {\r\n endPosition = text.length;\r\n }\r\n [text, search, endPosition] = normalizeSubstringArgs('endsWith', text, search, endPosition, true);\r\n const start = endPosition - search.length;\r\n if (start < 0) {\r\n return false;\r\n }\r\n return text.slice(start, endPosition) === search;\r\n };\r\n includes = function includes(text, search, position = 0) {\r\n [text, search, position] = normalizeSubstringArgs('includes', text, search, position);\r\n return text.indexOf(search, position) !== -1;\r\n };\r\n repeat = function repeat(text, count = 0) {\r\n // Adapted from https://github.com/mathiasbynens/String.prototype.repeat\r\n if (text == null) {\r\n throw new TypeError('string.repeat requires a valid string.');\r\n }\r\n if (count !== count) {\r\n count = 0;\r\n }\r\n if (count < 0 || count === Infinity) {\r\n throw new RangeError('string.repeat requires a non-negative finite count.');\r\n }\r\n let result = '';\r\n while (count) {\r\n if (count % 2) {\r\n result += text;\r\n }\r\n if (count > 1) {\r\n text += text;\r\n }\r\n count >>= 1;\r\n }\r\n return result;\r\n };\r\n startsWith = function startsWith(text, search, position = 0) {\r\n search = String(search);\r\n [text, search, position] = normalizeSubstringArgs('startsWith', text, search, position);\r\n const end = position + search.length;\r\n if (end > text.length) {\r\n return false;\r\n }\r\n return text.slice(position, end) === search;\r\n };\r\n}\r\nif (true) {\r\n padEnd = wrapNative(global.String.prototype.padEnd);\r\n padStart = wrapNative(global.String.prototype.padStart);\r\n}\r\nelse {\r\n padEnd = function padEnd(text, maxLength, fillString = ' ') {\r\n if (text === null || text === undefined) {\r\n throw new TypeError('string.repeat requires a valid string.');\r\n }\r\n if (maxLength === Infinity) {\r\n throw new RangeError('string.padEnd requires a non-negative finite count.');\r\n }\r\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\r\n maxLength = 0;\r\n }\r\n let strText = String(text);\r\n const padding = maxLength - strText.length;\r\n if (padding > 0) {\r\n strText +=\r\n repeat(fillString, Math.floor(padding / fillString.length)) +\r\n fillString.slice(0, padding % fillString.length);\r\n }\r\n return strText;\r\n };\r\n padStart = function padStart(text, maxLength, fillString = ' ') {\r\n if (text === null || text === undefined) {\r\n throw new TypeError('string.repeat requires a valid string.');\r\n }\r\n if (maxLength === Infinity) {\r\n throw new RangeError('string.padStart requires a non-negative finite count.');\r\n }\r\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\r\n maxLength = 0;\r\n }\r\n let strText = String(text);\r\n const padding = maxLength - strText.length;\r\n if (padding > 0) {\r\n strText =\r\n repeat(fillString, Math.floor(padding / fillString.length)) +\r\n fillString.slice(0, padding % fillString.length) +\r\n strText;\r\n }\r\n return strText;\r\n };\r\n}\r\n//# sourceMappingURL=string.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/string.mjs\n// module id = ./node_modules/@dojo/shim/string.mjs\n// module chunks = menu-item","import has, { add } from '@dojo/has/has';\r\nimport global from '../global';\r\nexport default has;\r\nexport * from '@dojo/has/has';\r\n/* ECMAScript 6 and 7 Features */\r\n/* Array */\r\nadd('es6-array', () => {\r\n return (['from', 'of'].every((key) => key in global.Array) &&\r\n ['findIndex', 'find', 'copyWithin'].every((key) => key in global.Array.prototype));\r\n}, true);\r\nadd('es6-array-fill', () => {\r\n if ('fill' in global.Array.prototype) {\r\n /* Some versions of Safari do not properly implement this */\r\n return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1;\r\n }\r\n return false;\r\n}, true);\r\nadd('es7-array', () => 'includes' in global.Array.prototype, true);\r\n/* Map */\r\nadd('es6-map', () => {\r\n if (typeof global.Map === 'function') {\r\n /*\r\n IE11 and older versions of Safari are missing critical ES6 Map functionality\r\n We wrap this in a try/catch because sometimes the Map constructor exists, but does not\r\n take arguments (iOS 8.4)\r\n */\r\n try {\r\n const map = new global.Map([[0, 1]]);\r\n return map.has(0) &&\r\n typeof map.keys === 'function' &&\r\n true &&\r\n typeof map.values === 'function' &&\r\n typeof map.entries === 'function';\r\n }\r\n catch (e) {\r\n /* istanbul ignore next: not testing on iOS at the moment */\r\n return false;\r\n }\r\n }\r\n return false;\r\n}, true);\r\n/* Math */\r\nadd('es6-math', () => {\r\n return [\r\n 'clz32',\r\n 'sign',\r\n 'log10',\r\n 'log2',\r\n 'log1p',\r\n 'expm1',\r\n 'cosh',\r\n 'sinh',\r\n 'tanh',\r\n 'acosh',\r\n 'asinh',\r\n 'atanh',\r\n 'trunc',\r\n 'fround',\r\n 'cbrt',\r\n 'hypot'\r\n ].every((name) => typeof global.Math[name] === 'function');\r\n}, true);\r\nadd('es6-math-imul', () => {\r\n if ('imul' in global.Math) {\r\n /* Some versions of Safari on ios do not properly implement this */\r\n return Math.imul(0xffffffff, 5) === -5;\r\n }\r\n return false;\r\n}, true);\r\n/* Object */\r\nadd('es6-object', () => {\r\n return true &&\r\n ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof global.Object[name] === 'function');\r\n}, true);\r\nadd('es2017-object', () => {\r\n return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof global.Object[name] === 'function');\r\n}, true);\r\n/* Observable */\r\nadd('es-observable', () => typeof global.Observable !== 'undefined', true);\r\n/* Promise */\r\nadd('es6-promise', () => typeof global.Promise !== 'undefined' && true, true);\r\n/* Set */\r\nadd('es6-set', () => {\r\n if (typeof global.Set === 'function') {\r\n /* IE11 and older versions of Safari are missing critical ES6 Set functionality */\r\n const set = new global.Set([1]);\r\n return set.has(1) && 'keys' in set && typeof set.keys === 'function' && true;\r\n }\r\n return false;\r\n}, true);\r\n/* String */\r\nadd('es6-string', () => {\r\n return ([\r\n /* static methods */\r\n 'fromCodePoint'\r\n ].every((key) => typeof global.String[key] === 'function') &&\r\n [\r\n /* instance methods */\r\n 'codePointAt',\r\n 'normalize',\r\n 'repeat',\r\n 'startsWith',\r\n 'endsWith',\r\n 'includes'\r\n ].every((key) => typeof global.String.prototype[key] === 'function'));\r\n}, true);\r\nadd('es6-string-raw', () => {\r\n function getCallSite(callSite, ...substitutions) {\r\n const result = [...callSite];\r\n result.raw = callSite.raw;\r\n return result;\r\n }\r\n if ('raw' in global.String) {\r\n let b = 1;\r\n let callSite = getCallSite `a\\n${b}`;\r\n callSite.raw = ['a\\\\n'];\r\n const supportsTrunc = global.String.raw(callSite, 42) === 'a:\\\\n';\r\n return supportsTrunc;\r\n }\r\n return false;\r\n}, true);\r\nadd('es2017-string', () => {\r\n return ['padStart', 'padEnd'].every((key) => typeof global.String.prototype[key] === 'function');\r\n}, true);\r\n/* Symbol */\r\nadd('es6-symbol', () => typeof global.Symbol !== 'undefined' && typeof Symbol() === 'symbol', true);\r\n/* WeakMap */\r\nadd('es6-weakmap', () => {\r\n if (typeof global.WeakMap !== 'undefined') {\r\n /* IE11 and older versions of Safari are missing critical ES6 Map functionality */\r\n const key1 = {};\r\n const key2 = {};\r\n const map = new global.WeakMap([[key1, 1]]);\r\n Object.freeze(key1);\r\n return map.get(key1) === 1 && map.set(key2, 2) === map && true;\r\n }\r\n return false;\r\n}, true);\r\n/* Miscellaneous features */\r\nadd('microtasks', () => true || false || true, true);\r\nadd('postmessage', () => {\r\n // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have\r\n // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist.\r\n return typeof global.window !== 'undefined' && typeof global.postMessage === 'function';\r\n}, true);\r\nadd('raf', () => typeof global.requestAnimationFrame === 'function', true);\r\nadd('setimmediate', () => typeof global.setImmediate !== 'undefined', true);\r\n/* DOM Features */\r\nadd('dom-mutationobserver', () => {\r\n if (true && Boolean(global.MutationObserver || global.WebKitMutationObserver)) {\r\n // IE11 has an unreliable MutationObserver implementation where setProperty() does not\r\n // generate a mutation event, observers can crash, and the queue does not drain\r\n // reliably. The following feature test was adapted from\r\n // https://gist.github.com/t10ko/4aceb8c71681fdb275e33efe5e576b14\r\n const example = document.createElement('div');\r\n /* tslint:disable-next-line:variable-name */\r\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\r\n const observer = new HostMutationObserver(function () { });\r\n observer.observe(example, { attributes: true });\r\n example.style.setProperty('display', 'block');\r\n return Boolean(observer.takeRecords().length);\r\n }\r\n return false;\r\n}, true);\r\nadd('dom-webanimation', () => true && global.Animation !== undefined && global.KeyframeEffect !== undefined, true);\r\n//# sourceMappingURL=has.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/support/has.mjs\n// module id = ./node_modules/@dojo/shim/support/has.mjs\n// module chunks = menu-item","import global from '../global';\r\nimport has from './has';\r\nfunction executeTask(item) {\r\n if (item && item.isActive && item.callback) {\r\n item.callback();\r\n }\r\n}\r\nfunction getQueueHandle(item, destructor) {\r\n return {\r\n destroy: function () {\r\n this.destroy = function () { };\r\n item.isActive = false;\r\n item.callback = null;\r\n if (destructor) {\r\n destructor();\r\n }\r\n }\r\n };\r\n}\r\nlet checkMicroTaskQueue;\r\nlet microTasks;\r\n/**\r\n * Schedules a callback to the macrotask queue.\r\n *\r\n * @param callback the function to be queued and later executed.\r\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\r\n */\r\nexport const queueTask = (function () {\r\n let destructor;\r\n let enqueue;\r\n // Since the IE implementation of `setImmediate` is not flawless, we will test for `postMessage` first.\r\n if (true) {\r\n const queue = [];\r\n global.addEventListener('message', function (event) {\r\n // Confirm that the event was triggered by the current window and by this particular implementation.\r\n if (event.source === global && event.data === 'dojo-queue-message') {\r\n event.stopPropagation();\r\n if (queue.length) {\r\n executeTask(queue.shift());\r\n }\r\n }\r\n });\r\n enqueue = function (item) {\r\n queue.push(item);\r\n global.postMessage('dojo-queue-message', '*');\r\n };\r\n }\r\n else if (false) {\r\n destructor = global.clearImmediate;\r\n enqueue = function (item) {\r\n return setImmediate(executeTask.bind(null, item));\r\n };\r\n }\r\n else {\r\n destructor = global.clearTimeout;\r\n enqueue = function (item) {\r\n return setTimeout(executeTask.bind(null, item), 0);\r\n };\r\n }\r\n function queueTask(callback) {\r\n const item = {\r\n isActive: true,\r\n callback: callback\r\n };\r\n const id = enqueue(item);\r\n return getQueueHandle(item, destructor &&\r\n function () {\r\n destructor(id);\r\n });\r\n }\r\n // TODO: Use aspect.before when it is available.\r\n return true\r\n ? queueTask\r\n : function (callback) {\r\n checkMicroTaskQueue();\r\n return queueTask(callback);\r\n };\r\n})();\r\n// When no mechanism for registering microtasks is exposed by the environment, microtasks will\r\n// be queued and then executed in a single macrotask before the other macrotasks are executed.\r\nif (!true) {\r\n let isMicroTaskQueued = false;\r\n microTasks = [];\r\n checkMicroTaskQueue = function () {\r\n if (!isMicroTaskQueued) {\r\n isMicroTaskQueued = true;\r\n queueTask(function () {\r\n isMicroTaskQueued = false;\r\n if (microTasks.length) {\r\n let item;\r\n while ((item = microTasks.shift())) {\r\n executeTask(item);\r\n }\r\n }\r\n });\r\n }\r\n };\r\n}\r\n/**\r\n * Schedules an animation task with `window.requestAnimationFrame` if it exists, or with `queueTask` otherwise.\r\n *\r\n * Since requestAnimationFrame's behavior does not match that expected from `queueTask`, it is not used there.\r\n * However, at times it makes more sense to delegate to requestAnimationFrame; hence the following method.\r\n *\r\n * @param callback the function to be queued and later executed.\r\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\r\n */\r\nexport const queueAnimationTask = (function () {\r\n if (!true) {\r\n return queueTask;\r\n }\r\n function queueAnimationTask(callback) {\r\n const item = {\r\n isActive: true,\r\n callback: callback\r\n };\r\n const rafId = requestAnimationFrame(executeTask.bind(null, item));\r\n return getQueueHandle(item, function () {\r\n cancelAnimationFrame(rafId);\r\n });\r\n }\r\n // TODO: Use aspect.before when it is available.\r\n return true\r\n ? queueAnimationTask\r\n : function (callback) {\r\n checkMicroTaskQueue();\r\n return queueAnimationTask(callback);\r\n };\r\n})();\r\n/**\r\n * Schedules a callback to the microtask queue.\r\n *\r\n * Any callbacks registered with `queueMicroTask` will be executed before the next macrotask. If no native\r\n * mechanism for scheduling macrotasks is exposed, then any callbacks will be fired before any macrotask\r\n * registered with `queueTask` or `queueAnimationTask`.\r\n *\r\n * @param callback the function to be queued and later executed.\r\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\r\n */\r\nexport let queueMicroTask = (function () {\r\n let enqueue;\r\n if (false) {\r\n enqueue = function (item) {\r\n global.process.nextTick(executeTask.bind(null, item));\r\n };\r\n }\r\n else if (true) {\r\n enqueue = function (item) {\r\n global.Promise.resolve(item).then(executeTask);\r\n };\r\n }\r\n else if (true) {\r\n /* tslint:disable-next-line:variable-name */\r\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\r\n const node = document.createElement('div');\r\n const queue = [];\r\n const observer = new HostMutationObserver(function () {\r\n while (queue.length > 0) {\r\n const item = queue.shift();\r\n if (item && item.isActive && item.callback) {\r\n item.callback();\r\n }\r\n }\r\n });\r\n observer.observe(node, { attributes: true });\r\n enqueue = function (item) {\r\n queue.push(item);\r\n node.setAttribute('queueStatus', '1');\r\n };\r\n }\r\n else {\r\n enqueue = function (item) {\r\n checkMicroTaskQueue();\r\n microTasks.push(item);\r\n };\r\n }\r\n return function (callback) {\r\n const item = {\r\n isActive: true,\r\n callback: callback\r\n };\r\n enqueue(item);\r\n return getQueueHandle(item);\r\n };\r\n})();\r\n//# sourceMappingURL=queue.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/support/queue.mjs\n// module id = ./node_modules/@dojo/shim/support/queue.mjs\n// module chunks = menu-item","/**\n * Helper function to generate a value property descriptor\n *\n * @param value The value the property descriptor should be set to\n * @param enumerable If the property should be enumberable, defaults to false\n * @param writable If the property should be writable, defaults to true\n * @param configurable If the property should be configurable, defaults to true\n * @return The property descriptor object\n */\nexport function getValueDescriptor(value, enumerable = false, writable = true, configurable = true) {\n return {\n value: value,\n enumerable: enumerable,\n writable: writable,\n configurable: configurable\n };\n}\nexport function wrapNative(nativeFunction) {\n return function (target, ...args) {\n return nativeFunction.apply(target, args);\n };\n}\n//# sourceMappingURL=util.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/support/util.mjs\n// module id = ./node_modules/@dojo/shim/support/util.mjs\n// module chunks = menu-item","import { Evented } from '@dojo/core/Evented';\nexport class Injector extends Evented {\n constructor(payload) {\n super();\n this._payload = payload;\n }\n setInvalidator(invalidator) {\n this._invalidator = invalidator;\n }\n get() {\n return this._payload;\n }\n set(payload) {\n this._payload = payload;\n if (this._invalidator) {\n this._invalidator();\n }\n }\n}\nexport default Injector;\n//# sourceMappingURL=Injector.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/Injector.mjs\n// module id = ./node_modules/@dojo/widget-core/Injector.mjs\n// module chunks = menu-item","import { Evented } from '@dojo/core/Evented';\r\nimport Map from '@dojo/shim/Map';\r\n/**\r\n * Enum to identify the type of event.\r\n * Listening to 'Projector' will notify when projector is created or updated\r\n * Listening to 'Widget' will notify when widget root is created or updated\r\n */\r\nexport var NodeEventType;\r\n(function (NodeEventType) {\r\n NodeEventType[\"Projector\"] = \"Projector\";\r\n NodeEventType[\"Widget\"] = \"Widget\";\r\n})(NodeEventType || (NodeEventType = {}));\r\nexport class NodeHandler extends Evented {\r\n constructor() {\r\n super(...arguments);\r\n this._nodeMap = new Map();\r\n }\r\n get(key) {\r\n return this._nodeMap.get(key);\r\n }\r\n has(key) {\r\n return this._nodeMap.has(key);\r\n }\r\n add(element, key) {\r\n this._nodeMap.set(key, element);\r\n this.emit({ type: key });\r\n }\r\n addRoot() {\r\n this.emit({ type: NodeEventType.Widget });\r\n }\r\n addProjector() {\r\n this.emit({ type: NodeEventType.Projector });\r\n }\r\n clear() {\r\n this._nodeMap.clear();\r\n }\r\n}\r\nexport default NodeHandler;\r\n//# sourceMappingURL=NodeHandler.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/NodeHandler.mjs\n// module id = ./node_modules/@dojo/widget-core/NodeHandler.mjs\n// module chunks = menu-item","import Promise from '@dojo/shim/Promise';\r\nimport Map from '@dojo/shim/Map';\r\nimport Symbol from '@dojo/shim/Symbol';\r\nimport { Evented } from '@dojo/core/Evented';\r\n/**\r\n * Widget base symbol type\r\n */\r\nexport const WIDGET_BASE_TYPE = Symbol('Widget Base');\r\n/**\r\n * Checks is the item is a subclass of WidgetBase (or a WidgetBase)\r\n *\r\n * @param item the item to check\r\n * @returns true/false indicating if the item is a WidgetBaseConstructor\r\n */\r\nexport function isWidgetBaseConstructor(item) {\r\n return Boolean(item && item._type === WIDGET_BASE_TYPE);\r\n}\r\nexport function isWidgetConstructorDefaultExport(item) {\r\n return Boolean(item &&\r\n item.hasOwnProperty('__esModule') &&\r\n item.hasOwnProperty('default') &&\r\n isWidgetBaseConstructor(item.default));\r\n}\r\n/**\r\n * The Registry implementation\r\n */\r\nexport class Registry extends Evented {\r\n /**\r\n * Emit loaded event for registry label\r\n */\r\n emitLoadedEvent(widgetLabel, item) {\r\n this.emit({\r\n type: widgetLabel,\r\n action: 'loaded',\r\n item\r\n });\r\n }\r\n define(label, item) {\r\n if (this._widgetRegistry === undefined) {\r\n this._widgetRegistry = new Map();\r\n }\r\n if (this._widgetRegistry.has(label)) {\r\n throw new Error(`widget has already been registered for '${label.toString()}'`);\r\n }\r\n this._widgetRegistry.set(label, item);\r\n if (item instanceof Promise) {\r\n item.then((widgetCtor) => {\r\n this._widgetRegistry.set(label, widgetCtor);\r\n this.emitLoadedEvent(label, widgetCtor);\r\n return widgetCtor;\r\n }, (error) => {\r\n throw error;\r\n });\r\n }\r\n else if (isWidgetBaseConstructor(item)) {\r\n this.emitLoadedEvent(label, item);\r\n }\r\n }\r\n defineInjector(label, injectorFactory) {\r\n if (this._injectorRegistry === undefined) {\r\n this._injectorRegistry = new Map();\r\n }\r\n if (this._injectorRegistry.has(label)) {\r\n throw new Error(`injector has already been registered for '${label.toString()}'`);\r\n }\r\n const invalidator = new Evented();\r\n const injectorItem = {\r\n injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })),\r\n invalidator\r\n };\r\n this._injectorRegistry.set(label, injectorItem);\r\n this.emitLoadedEvent(label, injectorItem);\r\n }\r\n get(label) {\r\n if (!this._widgetRegistry || !this.has(label)) {\r\n return null;\r\n }\r\n const item = this._widgetRegistry.get(label);\r\n if (isWidgetBaseConstructor(item)) {\r\n return item;\r\n }\r\n if (item instanceof Promise) {\r\n return null;\r\n }\r\n const promise = item();\r\n this._widgetRegistry.set(label, promise);\r\n promise.then((widgetCtor) => {\r\n if (isWidgetConstructorDefaultExport(widgetCtor)) {\r\n widgetCtor = widgetCtor.default;\r\n }\r\n this._widgetRegistry.set(label, widgetCtor);\r\n this.emitLoadedEvent(label, widgetCtor);\r\n return widgetCtor;\r\n }, (error) => {\r\n throw error;\r\n });\r\n return null;\r\n }\r\n getInjector(label) {\r\n if (!this._injectorRegistry || !this.hasInjector(label)) {\r\n return null;\r\n }\r\n return this._injectorRegistry.get(label);\r\n }\r\n has(label) {\r\n return Boolean(this._widgetRegistry && this._widgetRegistry.has(label));\r\n }\r\n hasInjector(label) {\r\n return Boolean(this._injectorRegistry && this._injectorRegistry.has(label));\r\n }\r\n}\r\nexport default Registry;\r\n//# sourceMappingURL=Registry.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/Registry.mjs\n// module id = ./node_modules/@dojo/widget-core/Registry.mjs\n// module chunks = menu-item","import { Map } from '@dojo/shim/Map';\r\nimport { Evented } from '@dojo/core/Evented';\r\nimport { Registry } from './Registry';\r\nexport class RegistryHandler extends Evented {\r\n constructor() {\r\n super();\r\n this._registry = new Registry();\r\n this._registryWidgetLabelMap = new Map();\r\n this._registryInjectorLabelMap = new Map();\r\n this.own(this._registry);\r\n const destroy = () => {\r\n if (this.baseRegistry) {\r\n this._registryWidgetLabelMap.delete(this.baseRegistry);\r\n this._registryInjectorLabelMap.delete(this.baseRegistry);\r\n this.baseRegistry = undefined;\r\n }\r\n };\r\n this.own({ destroy });\r\n }\r\n set base(baseRegistry) {\r\n if (this.baseRegistry) {\r\n this._registryWidgetLabelMap.delete(this.baseRegistry);\r\n this._registryInjectorLabelMap.delete(this.baseRegistry);\r\n }\r\n this.baseRegistry = baseRegistry;\r\n }\r\n define(label, widget) {\r\n this._registry.define(label, widget);\r\n }\r\n defineInjector(label, injector) {\r\n this._registry.defineInjector(label, injector);\r\n }\r\n has(label) {\r\n return this._registry.has(label) || Boolean(this.baseRegistry && this.baseRegistry.has(label));\r\n }\r\n hasInjector(label) {\r\n return this._registry.hasInjector(label) || Boolean(this.baseRegistry && this.baseRegistry.hasInjector(label));\r\n }\r\n get(label, globalPrecedence = false) {\r\n return this._get(label, globalPrecedence, 'get', this._registryWidgetLabelMap);\r\n }\r\n getInjector(label, globalPrecedence = false) {\r\n return this._get(label, globalPrecedence, 'getInjector', this._registryInjectorLabelMap);\r\n }\r\n _get(label, globalPrecedence, getFunctionName, labelMap) {\r\n const registries = globalPrecedence ? [this.baseRegistry, this._registry] : [this._registry, this.baseRegistry];\r\n for (let i = 0; i < registries.length; i++) {\r\n const registry = registries[i];\r\n if (!registry) {\r\n continue;\r\n }\r\n const item = registry[getFunctionName](label);\r\n const registeredLabels = labelMap.get(registry) || [];\r\n if (item) {\r\n return item;\r\n }\r\n else if (registeredLabels.indexOf(label) === -1) {\r\n const handle = registry.on(label, (event) => {\r\n if (event.action === 'loaded' &&\r\n this[getFunctionName](label, globalPrecedence) === event.item) {\r\n this.emit({ type: 'invalidate' });\r\n }\r\n });\r\n this.own(handle);\r\n labelMap.set(registry, [...registeredLabels, label]);\r\n }\r\n }\r\n return null;\r\n }\r\n}\r\nexport default RegistryHandler;\r\n//# sourceMappingURL=RegistryHandler.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/RegistryHandler.mjs\n// module id = ./node_modules/@dojo/widget-core/RegistryHandler.mjs\n// module chunks = menu-item","import Map from '@dojo/shim/Map';\nimport WeakMap from '@dojo/shim/WeakMap';\nimport Symbol from '@dojo/shim/Symbol';\nimport { v } from './d';\nimport { auto } from './diff';\nimport RegistryHandler from './RegistryHandler';\nimport NodeHandler from './NodeHandler';\nimport { widgetInstanceMap } from './vdom';\nimport { isWidgetBaseConstructor, WIDGET_BASE_TYPE } from './Registry';\nconst decoratorMap = new Map();\nconst boundAuto = auto.bind(null);\nexport const noBind = Symbol.for('dojoNoBind');\n/**\n * Main widget base for all widgets to extend\n */\nexport class WidgetBase {\n /**\n * @constructor\n */\n constructor() {\n /**\n * Indicates if it is the initial set properties cycle\n */\n this._initialProperties = true;\n /**\n * Array of property keys considered changed from the previous set properties\n */\n this._changedPropertyKeys = [];\n this._nodeHandler = new NodeHandler();\n this._handles = [];\n this._children = [];\n this._decoratorCache = new Map();\n this._properties = {};\n this._boundRenderFunc = this.render.bind(this);\n this._boundInvalidate = this.invalidate.bind(this);\n widgetInstanceMap.set(this, {\n dirty: true,\n onAttach: () => {\n this.onAttach();\n },\n onDetach: () => {\n this.onDetach();\n this.destroy();\n },\n nodeHandler: this._nodeHandler,\n registry: () => {\n return this.registry;\n },\n coreProperties: {},\n rendering: false,\n inputProperties: {}\n });\n this._runAfterConstructors();\n }\n meta(MetaType) {\n if (this._metaMap === undefined) {\n this._metaMap = new Map();\n }\n let cached = this._metaMap.get(MetaType);\n if (!cached) {\n cached = new MetaType({\n invalidate: this._boundInvalidate,\n nodeHandler: this._nodeHandler,\n bind: this\n });\n this.own(cached);\n this._metaMap.set(MetaType, cached);\n }\n return cached;\n }\n onAttach() {\n // Do nothing by default.\n }\n onDetach() {\n // Do nothing by default.\n }\n get properties() {\n return this._properties;\n }\n get changedPropertyKeys() {\n return [...this._changedPropertyKeys];\n }\n __setCoreProperties__(coreProperties) {\n const { baseRegistry } = coreProperties;\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.coreProperties.baseRegistry !== baseRegistry) {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n this._registry.base = baseRegistry;\n this.invalidate();\n }\n instanceData.coreProperties = coreProperties;\n }\n __setProperties__(originalProperties) {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.inputProperties = originalProperties;\n const properties = this._runBeforeProperties(originalProperties);\n const registeredDiffPropertyNames = this.getDecorator('registeredDiffProperty');\n const changedPropertyKeys = [];\n const propertyNames = Object.keys(properties);\n if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) {\n const allProperties = [...propertyNames, ...Object.keys(this._properties)];\n const checkedProperties = [];\n const diffPropertyResults = {};\n let runReactions = false;\n for (let i = 0; i < allProperties.length; i++) {\n const propertyName = allProperties[i];\n if (checkedProperties.indexOf(propertyName) !== -1) {\n continue;\n }\n checkedProperties.push(propertyName);\n const previousProperty = this._properties[propertyName];\n const newProperty = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n if (registeredDiffPropertyNames.indexOf(propertyName) !== -1) {\n runReactions = true;\n const diffFunctions = this.getDecorator(`diffProperty:${propertyName}`);\n for (let i = 0; i < diffFunctions.length; i++) {\n const result = diffFunctions[i](previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n else {\n const result = boundAuto(previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n if (runReactions) {\n this._mapDiffPropertyReactions(properties, changedPropertyKeys).forEach((args, reaction) => {\n if (args.changed) {\n reaction.call(this, args.previousProperties, args.newProperties);\n }\n });\n }\n this._properties = diffPropertyResults;\n this._changedPropertyKeys = changedPropertyKeys;\n }\n else {\n this._initialProperties = false;\n for (let i = 0; i < propertyNames.length; i++) {\n const propertyName = propertyNames[i];\n if (typeof properties[propertyName] === 'function') {\n properties[propertyName] = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n }\n else {\n changedPropertyKeys.push(propertyName);\n }\n }\n this._changedPropertyKeys = changedPropertyKeys;\n this._properties = Object.assign({}, properties);\n }\n if (this._changedPropertyKeys.length > 0) {\n this.invalidate();\n }\n }\n get children() {\n return this._children;\n }\n __setChildren__(children) {\n if (this._children.length > 0 || children.length > 0) {\n this._children = children;\n this.invalidate();\n }\n }\n __render__() {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.dirty = false;\n const render = this._runBeforeRenders();\n let dNode = render();\n dNode = this.runAfterRenders(dNode);\n this._nodeHandler.clear();\n return dNode;\n }\n invalidate() {\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.invalidate) {\n instanceData.invalidate();\n }\n }\n render() {\n return v('div', {}, this.children);\n }\n /**\n * Function to add decorators to WidgetBase\n *\n * @param decoratorKey The key of the decorator\n * @param value The value of the decorator\n */\n addDecorator(decoratorKey, value) {\n value = Array.isArray(value) ? value : [value];\n if (this.hasOwnProperty('constructor')) {\n let decoratorList = decoratorMap.get(this.constructor);\n if (!decoratorList) {\n decoratorList = new Map();\n decoratorMap.set(this.constructor, decoratorList);\n }\n let specificDecoratorList = decoratorList.get(decoratorKey);\n if (!specificDecoratorList) {\n specificDecoratorList = [];\n decoratorList.set(decoratorKey, specificDecoratorList);\n }\n specificDecoratorList.push(...value);\n }\n else {\n const decorators = this.getDecorator(decoratorKey);\n this._decoratorCache.set(decoratorKey, [...decorators, ...value]);\n }\n }\n /**\n * Function to build the list of decorators from the global decorator map.\n *\n * @param decoratorKey The key of the decorator\n * @return An array of decorator values\n * @private\n */\n _buildDecoratorList(decoratorKey) {\n const allDecorators = [];\n let constructor = this.constructor;\n while (constructor) {\n const instanceMap = decoratorMap.get(constructor);\n if (instanceMap) {\n const decorators = instanceMap.get(decoratorKey);\n if (decorators) {\n allDecorators.unshift(...decorators);\n }\n }\n constructor = Object.getPrototypeOf(constructor);\n }\n return allDecorators;\n }\n /**\n * Function to retrieve decorator values\n *\n * @param decoratorKey The key of the decorator\n * @returns An array of decorator values\n */\n getDecorator(decoratorKey) {\n let allDecorators = this._decoratorCache.get(decoratorKey);\n if (allDecorators !== undefined) {\n return allDecorators;\n }\n allDecorators = this._buildDecoratorList(decoratorKey);\n this._decoratorCache.set(decoratorKey, allDecorators);\n return allDecorators;\n }\n _mapDiffPropertyReactions(newProperties, changedPropertyKeys) {\n const reactionFunctions = this.getDecorator('diffReaction');\n return reactionFunctions.reduce((reactionPropertyMap, { reaction, propertyName }) => {\n let reactionArguments = reactionPropertyMap.get(reaction);\n if (reactionArguments === undefined) {\n reactionArguments = {\n previousProperties: {},\n newProperties: {},\n changed: false\n };\n }\n reactionArguments.previousProperties[propertyName] = this._properties[propertyName];\n reactionArguments.newProperties[propertyName] = newProperties[propertyName];\n if (changedPropertyKeys.indexOf(propertyName) !== -1) {\n reactionArguments.changed = true;\n }\n reactionPropertyMap.set(reaction, reactionArguments);\n return reactionPropertyMap;\n }, new Map());\n }\n /**\n * Binds unbound property functions to the specified `bind` property\n *\n * @param properties properties to check for functions\n */\n _bindFunctionProperty(property, bind) {\n if (typeof property === 'function' && !property[noBind] && isWidgetBaseConstructor(property) === false) {\n if (this._bindFunctionPropertyMap === undefined) {\n this._bindFunctionPropertyMap = new WeakMap();\n }\n const bindInfo = this._bindFunctionPropertyMap.get(property) || {};\n let { boundFunc, scope } = bindInfo;\n if (boundFunc === undefined || scope !== bind) {\n boundFunc = property.bind(bind);\n this._bindFunctionPropertyMap.set(property, { boundFunc, scope: bind });\n }\n return boundFunc;\n }\n return property;\n }\n get registry() {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n return this._registry;\n }\n _runBeforeProperties(properties) {\n const beforeProperties = this.getDecorator('beforeProperties');\n if (beforeProperties.length > 0) {\n return beforeProperties.reduce((properties, beforePropertiesFunction) => {\n return Object.assign({}, properties, beforePropertiesFunction.call(this, properties));\n }, Object.assign({}, properties));\n }\n return properties;\n }\n /**\n * Run all registered before renders and return the updated render method\n */\n _runBeforeRenders() {\n const beforeRenders = this.getDecorator('beforeRender');\n if (beforeRenders.length > 0) {\n return beforeRenders.reduce((render, beforeRenderFunction) => {\n const updatedRender = beforeRenderFunction.call(this, render, this._properties, this._children);\n if (!updatedRender) {\n console.warn('Render function not returned from beforeRender, using previous render');\n return render;\n }\n return updatedRender;\n }, this._boundRenderFunc);\n }\n return this._boundRenderFunc;\n }\n /**\n * Run all registered after renders and return the decorated DNodes\n *\n * @param dNode The DNodes to run through the after renders\n */\n runAfterRenders(dNode) {\n const afterRenders = this.getDecorator('afterRender');\n if (afterRenders.length > 0) {\n return afterRenders.reduce((dNode, afterRenderFunction) => {\n return afterRenderFunction.call(this, dNode);\n }, dNode);\n }\n if (this._metaMap !== undefined) {\n this._metaMap.forEach((meta) => {\n meta.afterRender();\n });\n }\n return dNode;\n }\n _runAfterConstructors() {\n const afterConstructors = this.getDecorator('afterConstructor');\n if (afterConstructors.length > 0) {\n afterConstructors.forEach((afterConstructor) => afterConstructor.call(this));\n }\n }\n own(handle) {\n this._handles.push(handle);\n }\n destroy() {\n while (this._handles.length > 0) {\n const handle = this._handles.pop();\n if (handle) {\n handle.destroy();\n }\n }\n }\n}\n/**\n * static identifier\n */\nWidgetBase._type = WIDGET_BASE_TYPE;\nexport default WidgetBase;\n//# sourceMappingURL=WidgetBase.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/WidgetBase.mjs\n// module id = ./node_modules/@dojo/widget-core/WidgetBase.mjs\n// module chunks = menu-item","let browserSpecificTransitionEndEventName = '';\nlet browserSpecificAnimationEndEventName = '';\nfunction determineBrowserStyleNames(element) {\n if ('WebkitTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'webkitTransitionEnd';\n browserSpecificAnimationEndEventName = 'webkitAnimationEnd';\n }\n else if ('transition' in element.style || 'MozTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'transitionend';\n browserSpecificAnimationEndEventName = 'animationend';\n }\n else {\n throw new Error('Your browser is not supported');\n }\n}\nfunction initialize(element) {\n if (browserSpecificAnimationEndEventName === '') {\n determineBrowserStyleNames(element);\n }\n}\nfunction runAndCleanUp(element, startAnimation, finishAnimation) {\n initialize(element);\n let finished = false;\n let transitionEnd = function () {\n if (!finished) {\n finished = true;\n element.removeEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n element.removeEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n finishAnimation();\n }\n };\n startAnimation();\n element.addEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n element.addEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n}\nfunction exit(node, properties, exitAnimation, removeNode) {\n const activeClass = properties.exitAnimationActive || `${exitAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(exitAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n removeNode();\n });\n}\nfunction enter(node, properties, enterAnimation) {\n const activeClass = properties.enterAnimationActive || `${enterAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(enterAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n node.classList.remove(enterAnimation);\n node.classList.remove(activeClass);\n });\n}\nexport default {\n enter,\n exit\n};\n//# sourceMappingURL=cssTransitions.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/animations/cssTransitions.mjs\n// module id = ./node_modules/@dojo/widget-core/animations/cssTransitions.mjs\n// module chunks = menu-item","import Symbol from '@dojo/shim/Symbol';\n/**\n * The symbol identifier for a WNode type\n */\nexport const WNODE = Symbol('Identifier for a WNode.');\n/**\n * The symbol identifier for a VNode type\n */\nexport const VNODE = Symbol('Identifier for a VNode.');\n/**\n * The symbol identifier for a VNode type created using dom()\n */\nexport const DOMVNODE = Symbol('Identifier for a VNode created using existing dom.');\n/**\n * Helper function that returns true if the `DNode` is a `WNode` using the `type` property\n */\nexport function isWNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === WNODE);\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` using the `type` property\n */\nexport function isVNode(child) {\n return Boolean(child && typeof child !== 'string' && (child.type === VNODE || child.type === DOMVNODE));\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` created with `dom()` using the `type` property\n */\nexport function isDomVNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === DOMVNODE);\n}\nexport function isElementNode(value) {\n return !!value.tagName;\n}\nexport function decorate(dNodes, optionsOrModifier, predicate) {\n let shallow = false;\n let modifier;\n if (typeof optionsOrModifier === 'function') {\n modifier = optionsOrModifier;\n }\n else {\n modifier = optionsOrModifier.modifier;\n predicate = optionsOrModifier.predicate;\n shallow = optionsOrModifier.shallow || false;\n }\n let nodes = Array.isArray(dNodes) ? [...dNodes] : [dNodes];\n function breaker() {\n nodes = [];\n }\n while (nodes.length) {\n const node = nodes.shift();\n if (node) {\n if (!shallow && (isWNode(node) || isVNode(node)) && node.children) {\n nodes = [...nodes, ...node.children];\n }\n if (!predicate || predicate(node)) {\n modifier(node, breaker);\n }\n }\n }\n return dNodes;\n}\n/**\n * Wrapper function for calls to create a widget.\n */\nexport function w(widgetConstructor, properties, children = []) {\n return {\n children,\n widgetConstructor,\n properties,\n type: WNODE\n };\n}\nexport function v(tag, propertiesOrChildren = {}, children = undefined) {\n let properties = propertiesOrChildren;\n let deferredPropertiesCallback;\n if (Array.isArray(propertiesOrChildren)) {\n children = propertiesOrChildren;\n properties = {};\n }\n if (typeof properties === 'function') {\n deferredPropertiesCallback = properties;\n properties = {};\n }\n return {\n tag,\n deferredPropertiesCallback,\n children,\n properties,\n type: VNODE\n };\n}\n/**\n * Create a VNode for an existing DOM Node.\n */\nexport function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, children) {\n return {\n tag: isElementNode(node) ? node.tagName.toLowerCase() : '',\n properties: props,\n attributes: attrs,\n events: on,\n children,\n type: DOMVNODE,\n domNode: node,\n text: isElementNode(node) ? undefined : node.data,\n diffType\n };\n}\n//# sourceMappingURL=d.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/d.mjs\n// module id = ./node_modules/@dojo/widget-core/d.mjs\n// module chunks = menu-item","import { handleDecorator } from './handleDecorator';\nexport function afterRender(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('afterRender', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default afterRender;\n//# sourceMappingURL=afterRender.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/afterRender.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/afterRender.mjs\n// module chunks = menu-item","import { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\nexport function alwaysRender() {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function () {\n this.invalidate();\n })(target);\n });\n}\nexport default alwaysRender;\n//# sourceMappingURL=alwaysRender.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs\n// module chunks = menu-item","import { handleDecorator } from './handleDecorator';\nexport function beforeProperties(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('beforeProperties', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default beforeProperties;\n//# sourceMappingURL=beforeProperties.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs\n// module chunks = menu-item","import { CustomElementChildType } from '../registerCustomElement';\nimport Registry from '../Registry';\n/**\n * This Decorator is provided properties that define the behavior of a custom element, and\n * registers that custom element.\n */\nexport function customElement({ tag, properties = [], attributes = [], events = [], childType = CustomElementChildType.DOJO, registryFactory = () => new Registry() }) {\n return function (target) {\n target.prototype.__customElementDescriptor = {\n tagName: tag,\n attributes,\n properties,\n events,\n childType,\n registryFactory\n };\n };\n}\nexport default customElement;\n//# sourceMappingURL=customElement.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/customElement.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/customElement.mjs\n// module chunks = menu-item","import { handleDecorator } from './handleDecorator';\n/**\n * Decorator that can be used to register a function as a specific property diff\n *\n * @param propertyName The name of the property of which the diff function is applied\n * @param diffType The diff type, default is DiffType.AUTO.\n * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM\n */\nexport function diffProperty(propertyName, diffFunction, reactionFunction) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null));\n target.addDecorator('registeredDiffProperty', propertyName);\n if (reactionFunction || propertyKey) {\n target.addDecorator('diffReaction', {\n propertyName,\n reaction: propertyKey ? target[propertyKey] : reactionFunction\n });\n }\n });\n}\nexport default diffProperty;\n//# sourceMappingURL=diffProperty.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/diffProperty.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/diffProperty.mjs\n// module chunks = menu-item","/**\n * Generic decorator handler to take care of whether or not the decorator was called at the class level\n * or the method level.\n *\n * @param handler\n */\nexport function handleDecorator(handler) {\n return function (target, propertyKey, descriptor) {\n if (typeof target === 'function') {\n handler(target.prototype, undefined);\n }\n else {\n handler(target, propertyKey);\n }\n };\n}\nexport default handleDecorator;\n//# sourceMappingURL=handleDecorator.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs\n// module chunks = menu-item","import WeakMap from '@dojo/shim/WeakMap';\nimport { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\n/**\n * Map of instances against registered injectors.\n */\nconst registeredInjectorsMap = new WeakMap();\n/**\n * Decorator retrieves an injector from an available registry using the name and\n * calls the `getProperties` function with the payload from the injector\n * and current properties with the the injected properties returned.\n *\n * @param InjectConfig the inject configuration\n */\nexport function inject({ name, getProperties }) {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function (properties) {\n const injectorItem = this.registry.getInjector(name);\n if (injectorItem) {\n const { injector, invalidator } = injectorItem;\n const registeredInjectors = registeredInjectorsMap.get(this) || [];\n if (registeredInjectors.length === 0) {\n registeredInjectorsMap.set(this, registeredInjectors);\n }\n if (registeredInjectors.indexOf(injectorItem) === -1) {\n this.own(invalidator.on('invalidate', () => {\n this.invalidate();\n }));\n registeredInjectors.push(injectorItem);\n }\n return getProperties(injector(), properties);\n }\n })(target);\n });\n}\nexport default inject;\n//# sourceMappingURL=inject.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/inject.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/inject.mjs\n// module chunks = menu-item","import { WIDGET_BASE_TYPE } from './Registry';\nfunction isObjectOrArray(value) {\n return Object.prototype.toString.call(value) === '[object Object]' || Array.isArray(value);\n}\nexport function always(previousProperty, newProperty) {\n return {\n changed: true,\n value: newProperty\n };\n}\nexport function ignore(previousProperty, newProperty) {\n return {\n changed: false,\n value: newProperty\n };\n}\nexport function reference(previousProperty, newProperty) {\n return {\n changed: previousProperty !== newProperty,\n value: newProperty\n };\n}\nexport function shallow(previousProperty, newProperty) {\n let changed = false;\n const validOldProperty = previousProperty && isObjectOrArray(previousProperty);\n const validNewProperty = newProperty && isObjectOrArray(newProperty);\n if (!validOldProperty || !validNewProperty) {\n return {\n changed: true,\n value: newProperty\n };\n }\n const previousKeys = Object.keys(previousProperty);\n const newKeys = Object.keys(newProperty);\n if (previousKeys.length !== newKeys.length) {\n changed = true;\n }\n else {\n changed = newKeys.some((key) => {\n return newProperty[key] !== previousProperty[key];\n });\n }\n return {\n changed,\n value: newProperty\n };\n}\nexport function auto(previousProperty, newProperty) {\n let result;\n if (typeof newProperty === 'function') {\n if (newProperty._type === WIDGET_BASE_TYPE) {\n result = reference(previousProperty, newProperty);\n }\n else {\n result = ignore(previousProperty, newProperty);\n }\n }\n else if (isObjectOrArray(newProperty)) {\n result = shallow(previousProperty, newProperty);\n }\n else {\n result = reference(previousProperty, newProperty);\n }\n return result;\n}\n//# sourceMappingURL=diff.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/diff.mjs\n// module id = ./node_modules/@dojo/widget-core/diff.mjs\n// module chunks = menu-item","import * as tslib_1 from \"tslib\";\nimport { assign } from '@dojo/core/lang';\nimport cssTransitions from '../animations/cssTransitions';\nimport { afterRender } from './../decorators/afterRender';\nimport { v } from './../d';\nimport { dom } from './../vdom';\n/**\n * Represents the attach state of the projector\n */\nexport var ProjectorAttachState;\n(function (ProjectorAttachState) {\n ProjectorAttachState[ProjectorAttachState[\"Attached\"] = 1] = \"Attached\";\n ProjectorAttachState[ProjectorAttachState[\"Detached\"] = 2] = \"Detached\";\n})(ProjectorAttachState || (ProjectorAttachState = {}));\n/**\n * Attach type for the projector\n */\nexport var AttachType;\n(function (AttachType) {\n AttachType[AttachType[\"Append\"] = 1] = \"Append\";\n AttachType[AttachType[\"Merge\"] = 2] = \"Merge\";\n})(AttachType || (AttachType = {}));\nexport function ProjectorMixin(Base) {\n class Projector extends Base {\n constructor(...args) {\n super(...args);\n this._root = document.body;\n this._async = true;\n this._projectorProperties = {};\n this._projectionOptions = {\n transitions: cssTransitions\n };\n this.root = document.body;\n this.projectorState = ProjectorAttachState.Detached;\n }\n append(root) {\n const options = {\n type: AttachType.Append,\n root\n };\n return this._attach(options);\n }\n merge(root) {\n const options = {\n type: AttachType.Merge,\n root\n };\n return this._attach(options);\n }\n set root(root) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change root element');\n }\n this._root = root;\n }\n get root() {\n return this._root;\n }\n get async() {\n return this._async;\n }\n set async(async) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change async mode');\n }\n this._async = async;\n }\n sandbox(doc = document) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot create sandbox');\n }\n this._async = false;\n const previousRoot = this.root;\n /* free up the document fragment for GC */\n this.own({\n destroy: () => {\n this._root = previousRoot;\n }\n });\n this._attach({\n /* DocumentFragment is not assignable to Element, but provides everything needed to work */\n root: doc.createDocumentFragment(),\n type: AttachType.Append\n });\n }\n setChildren(children) {\n this.__setChildren__(children);\n }\n setProperties(properties) {\n this.__setProperties__(properties);\n }\n __setProperties__(properties) {\n if (this._projectorProperties && this._projectorProperties.registry !== properties.registry) {\n if (this._projectorProperties.registry) {\n this._projectorProperties.registry.destroy();\n }\n }\n this._projectorProperties = assign({}, properties);\n super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry });\n super.__setProperties__(properties);\n }\n toHtml() {\n if (this.projectorState !== ProjectorAttachState.Attached || !this._projection) {\n throw new Error('Projector is not attached, cannot return an HTML string of projection.');\n }\n return this._projection.domNode.childNodes[0].outerHTML;\n }\n afterRender(result) {\n let node = result;\n if (typeof result === 'string' || result === null || result === undefined) {\n node = v('span', {}, [result]);\n }\n return node;\n }\n destroy() {\n super.destroy();\n }\n _attach({ type, root }) {\n if (root) {\n this.root = root;\n }\n if (this._attachHandle) {\n return this._attachHandle;\n }\n this.projectorState = ProjectorAttachState.Attached;\n const handle = {\n destroy: () => {\n if (this.projectorState === ProjectorAttachState.Attached) {\n this._projection = undefined;\n this.projectorState = ProjectorAttachState.Detached;\n }\n }\n };\n this.own(handle);\n this._attachHandle = handle;\n this._projectionOptions = Object.assign({}, this._projectionOptions, { sync: !this._async });\n switch (type) {\n case AttachType.Append:\n this._projection = dom.append(this.root, this, this._projectionOptions);\n break;\n case AttachType.Merge:\n this._projection = dom.merge(this.root, this, this._projectionOptions);\n break;\n }\n return this._attachHandle;\n }\n }\n tslib_1.__decorate([\n afterRender(),\n tslib_1.__metadata(\"design:type\", Function),\n tslib_1.__metadata(\"design:paramtypes\", [Object]),\n tslib_1.__metadata(\"design:returntype\", void 0)\n ], Projector.prototype, \"afterRender\", null);\n return Projector;\n}\nexport default ProjectorMixin;\n//# sourceMappingURL=Projector.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/mixins/Projector.mjs\n// module id = ./node_modules/@dojo/widget-core/mixins/Projector.mjs\n// module chunks = menu-item","import * as tslib_1 from \"tslib\";\nimport { Injector } from './../Injector';\nimport { inject } from './../decorators/inject';\nimport { handleDecorator } from './../decorators/handleDecorator';\nimport { diffProperty } from './../decorators/diffProperty';\nimport { shallow } from './../diff';\nconst THEME_KEY = ' _key';\nexport const INJECTED_THEME_KEY = Symbol('theme');\n/**\n * Decorator for base css classes\n */\nexport function theme(theme) {\n return handleDecorator((target) => {\n target.addDecorator('baseThemeClasses', theme);\n });\n}\n/**\n * Creates a reverse lookup for the classes passed in via the `theme` function.\n *\n * @param classes The baseClasses object\n * @requires\n */\nfunction createThemeClassesLookup(classes) {\n return classes.reduce((currentClassNames, baseClass) => {\n Object.keys(baseClass).forEach((key) => {\n currentClassNames[baseClass[key]] = key;\n });\n return currentClassNames;\n }, {});\n}\n/**\n * Convenience function that is given a theme and an optional registry, the theme\n * injector is defined against the registry, returning the theme.\n *\n * @param theme the theme to set\n * @param themeRegistry registry to define the theme injector against. Defaults\n * to the global registry\n *\n * @returns the theme injector used to set the theme\n */\nexport function registerThemeInjector(theme, themeRegistry) {\n const themeInjector = new Injector(theme);\n themeRegistry.defineInjector(INJECTED_THEME_KEY, (invalidator) => {\n themeInjector.setInvalidator(invalidator);\n return () => themeInjector.get();\n });\n return themeInjector;\n}\n/**\n * Function that returns a class decorated with with Themed functionality\n */\nexport function ThemedMixin(Base) {\n let Themed = class Themed extends Base {\n constructor() {\n super(...arguments);\n /**\n * Registered base theme keys\n */\n this._registeredBaseThemeKeys = [];\n /**\n * Indicates if classes meta data need to be calculated.\n */\n this._recalculateClasses = true;\n /**\n * Loaded theme\n */\n this._theme = {};\n }\n theme(classes) {\n if (this._recalculateClasses) {\n this._recalculateThemeClasses();\n }\n if (Array.isArray(classes)) {\n return classes.map((className) => this._getThemeClass(className));\n }\n return this._getThemeClass(classes);\n }\n /**\n * Function fired when `theme` or `extraClasses` are changed.\n */\n onPropertiesChanged() {\n this._recalculateClasses = true;\n }\n _getThemeClass(className) {\n if (className === undefined || className === null) {\n return className;\n }\n const extraClasses = this.properties.extraClasses || {};\n const themeClassName = this._baseThemeClassesReverseLookup[className];\n let resultClassNames = [];\n if (!themeClassName) {\n console.warn(`Class name: '${className}' not found in theme`);\n return null;\n }\n if (extraClasses[themeClassName]) {\n resultClassNames.push(extraClasses[themeClassName]);\n }\n if (this._theme[themeClassName]) {\n resultClassNames.push(this._theme[themeClassName]);\n }\n else {\n resultClassNames.push(this._registeredBaseTheme[themeClassName]);\n }\n return resultClassNames.join(' ');\n }\n _recalculateThemeClasses() {\n const { theme = {} } = this.properties;\n const baseThemes = this.getDecorator('baseThemeClasses');\n if (!this._registeredBaseTheme) {\n this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => {\n const _a = THEME_KEY, key = baseTheme[_a], classes = tslib_1.__rest(baseTheme, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n this._registeredBaseThemeKeys.push(key);\n return Object.assign({}, finalBaseTheme, classes);\n }, {});\n this._baseThemeClassesReverseLookup = createThemeClassesLookup(baseThemes);\n }\n this._theme = this._registeredBaseThemeKeys.reduce((baseTheme, themeKey) => {\n return Object.assign({}, baseTheme, theme[themeKey]);\n }, {});\n this._recalculateClasses = false;\n }\n };\n tslib_1.__decorate([\n diffProperty('theme', shallow),\n diffProperty('extraClasses', shallow),\n tslib_1.__metadata(\"design:type\", Function),\n tslib_1.__metadata(\"design:paramtypes\", []),\n tslib_1.__metadata(\"design:returntype\", void 0)\n ], Themed.prototype, \"onPropertiesChanged\", null);\n Themed = tslib_1.__decorate([\n inject({\n name: INJECTED_THEME_KEY,\n getProperties: (theme, properties) => {\n if (!properties.theme) {\n return { theme };\n }\n return {};\n }\n })\n ], Themed);\n return Themed;\n}\nexport default ThemedMixin;\n//# sourceMappingURL=Themed.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/mixins/Themed.mjs\n// module id = ./node_modules/@dojo/widget-core/mixins/Themed.mjs\n// module chunks = menu-item","import * as tslib_1 from \"tslib\";\nimport { WidgetBase, noBind } from './WidgetBase';\nimport { ProjectorMixin } from './mixins/Projector';\nimport { from } from '@dojo/shim/array';\nimport { w, dom } from './d';\nimport global from '@dojo/shim/global';\nimport { registerThemeInjector } from './mixins/Themed';\nimport { alwaysRender } from './decorators/alwaysRender';\nexport var CustomElementChildType;\n(function (CustomElementChildType) {\n CustomElementChildType[\"DOJO\"] = \"DOJO\";\n CustomElementChildType[\"NODE\"] = \"NODE\";\n CustomElementChildType[\"TEXT\"] = \"TEXT\";\n})(CustomElementChildType || (CustomElementChildType = {}));\nexport function DomToWidgetWrapper(domNode) {\n let DomToWidgetWrapper = class DomToWidgetWrapper extends WidgetBase {\n render() {\n const properties = Object.keys(this.properties).reduce((props, key) => {\n const value = this.properties[key];\n if (key.indexOf('on') === 0) {\n key = `__${key}`;\n }\n props[key] = value;\n return props;\n }, {});\n return dom({ node: domNode, props: properties, diffType: 'dom' });\n }\n static get domNode() {\n return domNode;\n }\n };\n DomToWidgetWrapper = tslib_1.__decorate([\n alwaysRender()\n ], DomToWidgetWrapper);\n return DomToWidgetWrapper;\n}\nexport function create(descriptor, WidgetConstructor) {\n const { attributes, childType, registryFactory } = descriptor;\n const attributeMap = {};\n attributes.forEach((propertyName) => {\n const attributeName = propertyName.toLowerCase();\n attributeMap[attributeName] = propertyName;\n });\n return class extends HTMLElement {\n constructor() {\n super(...arguments);\n this._properties = {};\n this._children = [];\n this._eventProperties = {};\n this._initialised = false;\n }\n connectedCallback() {\n if (this._initialised) {\n return;\n }\n const domProperties = {};\n const { attributes, properties, events } = descriptor;\n this._properties = Object.assign({}, this._properties, this._attributesToProperties(attributes));\n [...attributes, ...properties].forEach((propertyName) => {\n const value = this[propertyName];\n const filteredPropertyName = propertyName.replace(/^on/, '__');\n if (value !== undefined) {\n this._properties[propertyName] = value;\n }\n if (filteredPropertyName !== propertyName) {\n domProperties[filteredPropertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n }\n domProperties[propertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n });\n events.forEach((propertyName) => {\n const eventName = propertyName.replace(/^on/, '').toLowerCase();\n const filteredPropertyName = propertyName.replace(/^on/, '__on');\n domProperties[filteredPropertyName] = {\n get: () => this._getEventProperty(propertyName),\n set: (value) => this._setEventProperty(propertyName, value)\n };\n this._eventProperties[propertyName] = undefined;\n this._properties[propertyName] = (...args) => {\n const eventCallback = this._getEventProperty(propertyName);\n if (typeof eventCallback === 'function') {\n eventCallback(...args);\n }\n this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: false,\n detail: args\n }));\n };\n });\n Object.defineProperties(this, domProperties);\n const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children;\n from(children).forEach((childNode) => {\n if (childType === CustomElementChildType.DOJO) {\n childNode.addEventListener('dojo-ce-render', () => this._render());\n childNode.addEventListener('dojo-ce-connected', () => this._render());\n this._children.push(DomToWidgetWrapper(childNode));\n }\n else {\n this._children.push(dom({ node: childNode, diffType: 'dom' }));\n }\n });\n this.addEventListener('dojo-ce-connected', (e) => this._childConnected(e));\n const widgetProperties = this._properties;\n const renderChildren = () => this.__children__();\n const Wrapper = class extends WidgetBase {\n render() {\n return w(WidgetConstructor, widgetProperties, renderChildren());\n }\n };\n const registry = registryFactory();\n const themeContext = registerThemeInjector(this._getTheme(), registry);\n global.addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme()));\n const Projector = ProjectorMixin(Wrapper);\n this._projector = new Projector();\n this._projector.setProperties({ registry });\n this._projector.append(this);\n this._initialised = true;\n this.dispatchEvent(new CustomEvent('dojo-ce-connected', {\n bubbles: true,\n detail: this\n }));\n }\n _getTheme() {\n if (global && global.dojoce && global.dojoce.theme) {\n return global.dojoce.themes[global.dojoce.theme];\n }\n }\n _childConnected(e) {\n const node = e.detail;\n if (node.parentNode === this) {\n const exists = this._children.some((child) => child.domNode === node);\n if (!exists) {\n node.addEventListener('dojo-ce-render', () => this._render());\n this._children.push(DomToWidgetWrapper(node));\n this._render();\n }\n }\n }\n _render() {\n if (this._projector) {\n this._projector.invalidate();\n this.dispatchEvent(new CustomEvent('dojo-ce-render', {\n bubbles: false,\n detail: this\n }));\n }\n }\n __properties__() {\n return Object.assign({}, this._properties, this._eventProperties);\n }\n __children__() {\n if (childType === CustomElementChildType.DOJO) {\n return this._children.filter((Child) => Child.domNode.isWidget).map((Child) => {\n const { domNode } = Child;\n return w(Child, Object.assign({}, domNode.__properties__()), [...domNode.__children__()]);\n });\n }\n else {\n return this._children;\n }\n }\n attributeChangedCallback(name, oldValue, value) {\n const propertyName = attributeMap[name];\n this._setProperty(propertyName, value);\n }\n _setEventProperty(propertyName, value) {\n this._eventProperties[propertyName] = value;\n }\n _getEventProperty(propertyName) {\n return this._eventProperties[propertyName];\n }\n _setProperty(propertyName, value) {\n if (typeof value === 'function') {\n value[noBind] = true;\n }\n this._properties[propertyName] = value;\n this._render();\n }\n _getProperty(propertyName) {\n return this._properties[propertyName];\n }\n _attributesToProperties(attributes) {\n return attributes.reduce((properties, propertyName) => {\n const attributeName = propertyName.toLowerCase();\n const value = this.getAttribute(attributeName);\n if (value !== null) {\n properties[propertyName] = value;\n }\n return properties;\n }, {});\n }\n static get observedAttributes() {\n return Object.keys(attributeMap);\n }\n get isWidget() {\n return true;\n }\n };\n}\nexport function register(WidgetConstructor) {\n const descriptor = WidgetConstructor.prototype && WidgetConstructor.prototype.__customElementDescriptor;\n if (!descriptor) {\n throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?');\n }\n global.customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor));\n}\nexport default register;\n//# sourceMappingURL=registerCustomElement.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/registerCustomElement.mjs\n// module id = ./node_modules/@dojo/widget-core/registerCustomElement.mjs\n// module chunks = menu-item","import global from '@dojo/shim/global';\r\nimport { from as arrayFrom } from '@dojo/shim/array';\r\nimport { isWNode, isVNode, isDomVNode, VNODE, WNODE } from './d';\r\nimport { isWidgetBaseConstructor } from './Registry';\r\nimport WeakMap from '@dojo/shim/WeakMap';\r\nconst NAMESPACE_W3 = 'http://www.w3.org/';\r\nconst NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg';\r\nconst NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink';\r\nconst emptyArray = [];\r\nexport const widgetInstanceMap = new WeakMap();\r\nconst instanceMap = new WeakMap();\r\nconst projectorStateMap = new WeakMap();\r\nfunction same(dnode1, dnode2) {\r\n if (isVNode(dnode1) && isVNode(dnode2)) {\r\n if (isDomVNode(dnode1) || isDomVNode(dnode2)) {\r\n if (dnode1.domNode !== dnode2.domNode) {\r\n return false;\r\n }\r\n }\r\n if (dnode1.tag !== dnode2.tag) {\r\n return false;\r\n }\r\n if (dnode1.properties.key !== dnode2.properties.key) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n else if (isWNode(dnode1) && isWNode(dnode2)) {\r\n if (dnode1.instance === undefined && typeof dnode2.widgetConstructor === 'string') {\r\n return false;\r\n }\r\n if (dnode1.widgetConstructor !== dnode2.widgetConstructor) {\r\n return false;\r\n }\r\n if (dnode1.properties.key !== dnode2.properties.key) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n return false;\r\n}\r\nconst missingTransition = function () {\r\n throw new Error('Provide a transitions object to the projectionOptions to do animations');\r\n};\r\nfunction getProjectionOptions(projectorOptions, projectorInstance) {\r\n const defaults = {\r\n namespace: undefined,\r\n styleApplyer: function (domNode, styleName, value) {\r\n domNode.style[styleName] = value;\r\n },\r\n transitions: {\r\n enter: missingTransition,\r\n exit: missingTransition\r\n },\r\n depth: 0,\r\n merge: false,\r\n sync: false,\r\n projectorInstance\r\n };\r\n return Object.assign({}, defaults, projectorOptions);\r\n}\r\nfunction checkStyleValue(styleValue) {\r\n if (typeof styleValue !== 'string') {\r\n throw new Error('Style values must be strings');\r\n }\r\n}\r\nfunction updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n const eventMap = projectorState.nodeMap.get(domNode) || new WeakMap();\r\n if (previousValue) {\r\n const previousEvent = eventMap.get(previousValue);\r\n domNode.removeEventListener(eventName, previousEvent);\r\n }\r\n let callback = currentValue.bind(bind);\r\n if (eventName === 'input') {\r\n callback = function (evt) {\r\n currentValue.call(this, evt);\r\n evt.target['oninput-value'] = evt.target.value;\r\n }.bind(bind);\r\n }\r\n domNode.addEventListener(eventName, callback);\r\n eventMap.set(currentValue, callback);\r\n projectorState.nodeMap.set(domNode, eventMap);\r\n}\r\nfunction addClasses(domNode, classes) {\r\n if (classes) {\r\n const classNames = classes.split(' ');\r\n for (let i = 0; i < classNames.length; i++) {\r\n domNode.classList.add(classNames[i]);\r\n }\r\n }\r\n}\r\nfunction removeClasses(domNode, classes) {\r\n if (classes) {\r\n const classNames = classes.split(' ');\r\n for (let i = 0; i < classNames.length; i++) {\r\n domNode.classList.remove(classNames[i]);\r\n }\r\n }\r\n}\r\nfunction buildPreviousProperties(domNode, previous, current) {\r\n const { diffType, properties, attributes } = current;\r\n if (!diffType || diffType === 'vdom') {\r\n return { properties: previous.properties, attributes: previous.attributes, events: previous.events };\r\n }\r\n else if (diffType === 'none') {\r\n return { properties: {}, attributes: previous.attributes ? {} : undefined, events: previous.events };\r\n }\r\n let newProperties = {\r\n properties: {}\r\n };\r\n if (attributes) {\r\n newProperties.attributes = {};\r\n newProperties.events = previous.events;\r\n Object.keys(properties).forEach((propName) => {\r\n newProperties.properties[propName] = domNode[propName];\r\n });\r\n Object.keys(attributes).forEach((attrName) => {\r\n newProperties.attributes[attrName] = domNode.getAttribute(attrName);\r\n });\r\n return newProperties;\r\n }\r\n newProperties.properties = Object.keys(properties).reduce((props, property) => {\r\n props[property] = domNode.getAttribute(property) || domNode[property];\r\n return props;\r\n }, {});\r\n return newProperties;\r\n}\r\nfunction focusNode(propValue, previousValue, domNode, projectionOptions) {\r\n let result;\r\n if (typeof propValue === 'function') {\r\n result = propValue();\r\n }\r\n else {\r\n result = propValue && !previousValue;\r\n }\r\n if (result === true) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectorState.deferredRenderCallbacks.push(() => {\r\n domNode.focus();\r\n });\r\n }\r\n}\r\nfunction removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions, onlyEvents = false) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n const eventMap = projectorState.nodeMap.get(domNode);\r\n if (eventMap) {\r\n Object.keys(previousProperties).forEach((propName) => {\r\n const isEvent = propName.substr(0, 2) === 'on' || onlyEvents;\r\n const eventName = onlyEvents ? propName : propName.substr(2);\r\n if (isEvent && !properties[propName]) {\r\n const eventCallback = eventMap.get(previousProperties[propName]);\r\n if (eventCallback) {\r\n domNode.removeEventListener(eventName, eventCallback);\r\n }\r\n }\r\n });\r\n }\r\n}\r\nfunction updateAttribute(domNode, attrName, attrValue, projectionOptions) {\r\n if (projectionOptions.namespace === NAMESPACE_SVG && attrName === 'href') {\r\n domNode.setAttributeNS(NAMESPACE_XLINK, attrName, attrValue);\r\n }\r\n else if ((attrName === 'role' && attrValue === '') || attrValue === undefined) {\r\n domNode.removeAttribute(attrName);\r\n }\r\n else {\r\n domNode.setAttribute(attrName, attrValue);\r\n }\r\n}\r\nfunction updateAttributes(domNode, previousAttributes, attributes, projectionOptions) {\r\n const attrNames = Object.keys(attributes);\r\n const attrCount = attrNames.length;\r\n for (let i = 0; i < attrCount; i++) {\r\n const attrName = attrNames[i];\r\n const attrValue = attributes[attrName];\r\n const previousAttrValue = previousAttributes[attrName];\r\n if (attrValue !== previousAttrValue) {\r\n updateAttribute(domNode, attrName, attrValue, projectionOptions);\r\n }\r\n }\r\n}\r\nfunction updateProperties(domNode, previousProperties, properties, projectionOptions, includesEventsAndAttributes = true) {\r\n let propertiesUpdated = false;\r\n const propNames = Object.keys(properties);\r\n const propCount = propNames.length;\r\n if (propNames.indexOf('classes') === -1 && previousProperties.classes) {\r\n if (Array.isArray(previousProperties.classes)) {\r\n for (let i = 0; i < previousProperties.classes.length; i++) {\r\n removeClasses(domNode, previousProperties.classes[i]);\r\n }\r\n }\r\n else {\r\n removeClasses(domNode, previousProperties.classes);\r\n }\r\n }\r\n includesEventsAndAttributes && removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions);\r\n for (let i = 0; i < propCount; i++) {\r\n const propName = propNames[i];\r\n let propValue = properties[propName];\r\n const previousValue = previousProperties[propName];\r\n if (propName === 'classes') {\r\n const previousClasses = Array.isArray(previousValue) ? previousValue : [previousValue];\r\n const currentClasses = Array.isArray(propValue) ? propValue : [propValue];\r\n if (previousClasses && previousClasses.length > 0) {\r\n if (!propValue || propValue.length === 0) {\r\n for (let i = 0; i < previousClasses.length; i++) {\r\n removeClasses(domNode, previousClasses[i]);\r\n }\r\n }\r\n else {\r\n const newClasses = [...currentClasses];\r\n for (let i = 0; i < previousClasses.length; i++) {\r\n const previousClassName = previousClasses[i];\r\n if (previousClassName) {\r\n const classIndex = newClasses.indexOf(previousClassName);\r\n if (classIndex === -1) {\r\n removeClasses(domNode, previousClassName);\r\n }\r\n else {\r\n newClasses.splice(classIndex, 1);\r\n }\r\n }\r\n }\r\n for (let i = 0; i < newClasses.length; i++) {\r\n addClasses(domNode, newClasses[i]);\r\n }\r\n }\r\n }\r\n else {\r\n for (let i = 0; i < currentClasses.length; i++) {\r\n addClasses(domNode, currentClasses[i]);\r\n }\r\n }\r\n }\r\n else if (propName === 'focus') {\r\n focusNode(propValue, previousValue, domNode, projectionOptions);\r\n }\r\n else if (propName === 'styles') {\r\n const styleNames = Object.keys(propValue);\r\n const styleCount = styleNames.length;\r\n for (let j = 0; j < styleCount; j++) {\r\n const styleName = styleNames[j];\r\n const newStyleValue = propValue[styleName];\r\n const oldStyleValue = previousValue && previousValue[styleName];\r\n if (newStyleValue === oldStyleValue) {\r\n continue;\r\n }\r\n propertiesUpdated = true;\r\n if (newStyleValue) {\r\n checkStyleValue(newStyleValue);\r\n projectionOptions.styleApplyer(domNode, styleName, newStyleValue);\r\n }\r\n else {\r\n projectionOptions.styleApplyer(domNode, styleName, '');\r\n }\r\n }\r\n }\r\n else {\r\n if (!propValue && typeof previousValue === 'string') {\r\n propValue = '';\r\n }\r\n if (propName === 'value') {\r\n const domValue = domNode[propName];\r\n if (domValue !== propValue &&\r\n (domNode['oninput-value']\r\n ? domValue === domNode['oninput-value']\r\n : propValue !== previousValue)) {\r\n domNode[propName] = propValue;\r\n domNode['oninput-value'] = undefined;\r\n }\r\n if (propValue !== previousValue) {\r\n propertiesUpdated = true;\r\n }\r\n }\r\n else if (propName !== 'key' && propValue !== previousValue) {\r\n const type = typeof propValue;\r\n if (type === 'function' && propName.lastIndexOf('on', 0) === 0 && includesEventsAndAttributes) {\r\n updateEvent(domNode, propName.substr(2), propValue, projectionOptions, properties.bind, previousValue);\r\n }\r\n else if (type === 'string' && propName !== 'innerHTML' && includesEventsAndAttributes) {\r\n updateAttribute(domNode, propName, propValue, projectionOptions);\r\n }\r\n else if (propName === 'scrollLeft' || propName === 'scrollTop') {\r\n if (domNode[propName] !== propValue) {\r\n domNode[propName] = propValue;\r\n }\r\n }\r\n else {\r\n domNode[propName] = propValue;\r\n }\r\n propertiesUpdated = true;\r\n }\r\n }\r\n }\r\n return propertiesUpdated;\r\n}\r\nfunction findIndexOfChild(children, sameAs, start) {\r\n for (let i = start; i < children.length; i++) {\r\n if (same(children[i], sameAs)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\nexport function toParentVNode(domNode) {\r\n return {\r\n tag: '',\r\n properties: {},\r\n children: undefined,\r\n domNode,\r\n type: VNODE\r\n };\r\n}\r\nexport function toTextVNode(data) {\r\n return {\r\n tag: '',\r\n properties: {},\r\n children: undefined,\r\n text: `${data}`,\r\n domNode: undefined,\r\n type: VNODE\r\n };\r\n}\r\nfunction toInternalWNode(instance, instanceData) {\r\n return {\r\n instance,\r\n rendered: [],\r\n coreProperties: instanceData.coreProperties,\r\n children: instance.children,\r\n widgetConstructor: instance.constructor,\r\n properties: instanceData.inputProperties,\r\n type: WNODE\r\n };\r\n}\r\nexport function filterAndDecorateChildren(children, instance) {\r\n if (children === undefined) {\r\n return emptyArray;\r\n }\r\n children = Array.isArray(children) ? children : [children];\r\n for (let i = 0; i < children.length;) {\r\n const child = children[i];\r\n if (child === undefined || child === null) {\r\n children.splice(i, 1);\r\n continue;\r\n }\r\n else if (typeof child === 'string') {\r\n children[i] = toTextVNode(child);\r\n }\r\n else {\r\n if (isVNode(child)) {\r\n if (child.properties.bind === undefined) {\r\n child.properties.bind = instance;\r\n if (child.children && child.children.length > 0) {\r\n filterAndDecorateChildren(child.children, instance);\r\n }\r\n }\r\n }\r\n else {\r\n if (!child.coreProperties) {\r\n const instanceData = widgetInstanceMap.get(instance);\r\n child.coreProperties = {\r\n bind: instance,\r\n baseRegistry: instanceData.coreProperties.baseRegistry\r\n };\r\n }\r\n if (child.children && child.children.length > 0) {\r\n filterAndDecorateChildren(child.children, instance);\r\n }\r\n }\r\n }\r\n i++;\r\n }\r\n return children;\r\n}\r\nfunction nodeAdded(dnode, transitions) {\r\n if (isVNode(dnode) && dnode.properties) {\r\n const enterAnimation = dnode.properties.enterAnimation;\r\n if (enterAnimation) {\r\n if (typeof enterAnimation === 'function') {\r\n enterAnimation(dnode.domNode, dnode.properties);\r\n }\r\n else {\r\n transitions.enter(dnode.domNode, dnode.properties, enterAnimation);\r\n }\r\n }\r\n }\r\n}\r\nfunction nodeToRemove(dnode, transitions, projectionOptions) {\r\n if (isWNode(dnode)) {\r\n const rendered = dnode.rendered || emptyArray;\r\n if (dnode.instance) {\r\n const instanceData = widgetInstanceMap.get(dnode.instance);\r\n instanceData.onDetach();\r\n instanceMap.delete(dnode.instance);\r\n }\r\n for (let i = 0; i < rendered.length; i++) {\r\n nodeToRemove(rendered[i], transitions, projectionOptions);\r\n }\r\n }\r\n else {\r\n const domNode = dnode.domNode;\r\n const properties = dnode.properties;\r\n if (dnode.children && dnode.children.length > 0) {\r\n for (let i = 0; i < dnode.children.length; i++) {\r\n nodeToRemove(dnode.children[i], transitions, projectionOptions);\r\n }\r\n }\r\n const exitAnimation = properties.exitAnimation;\r\n if (properties && exitAnimation) {\r\n domNode.style.pointerEvents = 'none';\r\n const removeDomNode = function () {\r\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\r\n dnode.domNode = undefined;\r\n };\r\n if (typeof exitAnimation === 'function') {\r\n exitAnimation(domNode, removeDomNode, properties);\r\n return;\r\n }\r\n else {\r\n transitions.exit(dnode.domNode, properties, exitAnimation, removeDomNode);\r\n return;\r\n }\r\n }\r\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\r\n dnode.domNode = undefined;\r\n }\r\n}\r\nfunction checkDistinguishable(childNodes, indexToCheck, parentInstance) {\r\n const childNode = childNodes[indexToCheck];\r\n if (isVNode(childNode) && !childNode.tag) {\r\n return; // Text nodes need not be distinguishable\r\n }\r\n const { key } = childNode.properties;\r\n if (key === undefined || key === null) {\r\n for (let i = 0; i < childNodes.length; i++) {\r\n if (i !== indexToCheck) {\r\n const node = childNodes[i];\r\n if (same(node, childNode)) {\r\n let nodeIdentifier;\r\n const parentName = parentInstance.constructor.name || 'unknown';\r\n if (isWNode(childNode)) {\r\n nodeIdentifier = childNode.widgetConstructor.name || 'unknown';\r\n }\r\n else {\r\n nodeIdentifier = childNode.tag;\r\n }\r\n console.warn(`A widget (${parentName}) has had a child addded or removed, but they were not able to uniquely identified. It is recommended to provide a unique 'key' property when using the same widget or element (${nodeIdentifier}) multiple times as siblings`);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\nfunction updateChildren(parentVNode, oldChildren, newChildren, parentInstance, projectionOptions) {\r\n oldChildren = oldChildren || emptyArray;\r\n newChildren = newChildren;\r\n const oldChildrenLength = oldChildren.length;\r\n const newChildrenLength = newChildren.length;\r\n const transitions = projectionOptions.transitions;\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\r\n let oldIndex = 0;\r\n let newIndex = 0;\r\n let i;\r\n let textUpdated = false;\r\n while (newIndex < newChildrenLength) {\r\n let oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : undefined;\r\n const newChild = newChildren[newIndex];\r\n if (isVNode(newChild) && typeof newChild.deferredPropertiesCallback === 'function') {\r\n newChild.inserted = isVNode(oldChild) && oldChild.inserted;\r\n addDeferredProperties(newChild, projectionOptions);\r\n }\r\n if (oldChild !== undefined && same(oldChild, newChild)) {\r\n textUpdated = updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance) || textUpdated;\r\n oldIndex++;\r\n newIndex++;\r\n continue;\r\n }\r\n const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);\r\n const addChild = () => {\r\n let insertBeforeDomNode = undefined;\r\n let child = oldChildren[oldIndex];\r\n if (child) {\r\n let nextIndex = oldIndex + 1;\r\n let insertBeforeChildren = [child];\r\n while (insertBeforeChildren.length) {\r\n const insertBefore = insertBeforeChildren.shift();\r\n if (isWNode(insertBefore)) {\r\n if (insertBefore.rendered) {\r\n insertBeforeChildren.push(...insertBefore.rendered);\r\n }\r\n }\r\n else {\r\n if (insertBefore.domNode) {\r\n insertBeforeDomNode = insertBefore.domNode;\r\n break;\r\n }\r\n }\r\n if (insertBeforeChildren.length === 0 && oldChildren[nextIndex]) {\r\n insertBeforeChildren.push(oldChildren[nextIndex]);\r\n nextIndex++;\r\n }\r\n }\r\n }\r\n createDom(newChild, parentVNode, insertBeforeDomNode, projectionOptions, parentInstance);\r\n nodeAdded(newChild, transitions);\r\n const indexToCheck = newIndex;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(newChildren, indexToCheck, parentInstance);\r\n });\r\n };\r\n if (!oldChild || findOldIndex === -1) {\r\n addChild();\r\n newIndex++;\r\n continue;\r\n }\r\n const removeChild = () => {\r\n const indexToCheck = oldIndex;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\r\n });\r\n if (isWNode(oldChild)) {\r\n const item = instanceMap.get(oldChild.instance);\r\n if (item) {\r\n oldChild = item.dnode;\r\n }\r\n }\r\n nodeToRemove(oldChild, transitions, projectionOptions);\r\n };\r\n const findNewIndex = findIndexOfChild(newChildren, oldChild, newIndex + 1);\r\n if (findNewIndex === -1) {\r\n removeChild();\r\n oldIndex++;\r\n continue;\r\n }\r\n addChild();\r\n removeChild();\r\n oldIndex++;\r\n newIndex++;\r\n }\r\n if (oldChildrenLength > oldIndex) {\r\n // Remove child fragments\r\n for (i = oldIndex; i < oldChildrenLength; i++) {\r\n const indexToCheck = i;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\r\n });\r\n let childToRemove = oldChildren[i];\r\n if (isWNode(childToRemove)) {\r\n const item = instanceMap.get(childToRemove.instance);\r\n if (item) {\r\n childToRemove = item.dnode;\r\n }\r\n }\r\n nodeToRemove(childToRemove, transitions, projectionOptions);\r\n }\r\n }\r\n return textUpdated;\r\n}\r\nfunction addChildren(parentVNode, children, projectionOptions, parentInstance, insertBefore = undefined, childNodes) {\r\n if (children === undefined) {\r\n return;\r\n }\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectorState.merge && childNodes === undefined) {\r\n childNodes = arrayFrom(parentVNode.domNode.childNodes);\r\n }\r\n const transitions = projectionOptions.transitions;\r\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n if (isVNode(child)) {\r\n if (projectorState.merge && childNodes) {\r\n let domElement = undefined;\r\n while (child.domNode === undefined && childNodes.length > 0) {\r\n domElement = childNodes.shift();\r\n if (domElement && domElement.tagName === (child.tag.toUpperCase() || undefined)) {\r\n child.domNode = domElement;\r\n }\r\n }\r\n }\r\n createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance);\r\n }\r\n else {\r\n createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes);\r\n }\r\n nodeAdded(child, transitions);\r\n }\r\n}\r\nfunction initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions) {\r\n addChildren(dnode, dnode.children, projectionOptions, parentInstance, undefined);\r\n if (typeof dnode.deferredPropertiesCallback === 'function' && dnode.inserted === undefined) {\r\n addDeferredProperties(dnode, projectionOptions);\r\n }\r\n if (dnode.attributes && dnode.events) {\r\n updateAttributes(domNode, {}, dnode.attributes, projectionOptions);\r\n updateProperties(domNode, {}, dnode.properties, projectionOptions, false);\r\n removeOrphanedEvents(domNode, {}, dnode.events, projectionOptions, true);\r\n const events = dnode.events;\r\n Object.keys(events).forEach((event) => {\r\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind);\r\n });\r\n }\r\n else {\r\n updateProperties(domNode, {}, dnode.properties, projectionOptions);\r\n }\r\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\r\n const instanceData = widgetInstanceMap.get(parentInstance);\r\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\r\n }\r\n dnode.inserted = true;\r\n}\r\nfunction createDom(dnode, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes) {\r\n let domNode;\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (isWNode(dnode)) {\r\n let { widgetConstructor } = dnode;\r\n const parentInstanceData = widgetInstanceMap.get(parentInstance);\r\n if (!isWidgetBaseConstructor(widgetConstructor)) {\r\n const item = parentInstanceData.registry().get(widgetConstructor);\r\n if (item === null) {\r\n return;\r\n }\r\n widgetConstructor = item;\r\n }\r\n const instance = new widgetConstructor();\r\n dnode.instance = instance;\r\n const instanceData = widgetInstanceMap.get(instance);\r\n instanceData.invalidate = () => {\r\n instanceData.dirty = true;\r\n if (instanceData.rendering === false) {\r\n projectorState.renderQueue.push({ instance, depth: projectionOptions.depth });\r\n scheduleRender(projectionOptions);\r\n }\r\n };\r\n instanceData.rendering = true;\r\n instance.__setCoreProperties__(dnode.coreProperties);\r\n instance.__setChildren__(dnode.children);\r\n instance.__setProperties__(dnode.properties);\r\n const rendered = instance.__render__();\r\n instanceData.rendering = false;\r\n if (rendered) {\r\n const filteredRendered = filterAndDecorateChildren(rendered, instance);\r\n dnode.rendered = filteredRendered;\r\n addChildren(parentVNode, filteredRendered, projectionOptions, instance, insertBefore, childNodes);\r\n }\r\n instanceMap.set(instance, { dnode, parentVNode });\r\n instanceData.nodeHandler.addRoot();\r\n projectorState.afterRenderCallbacks.push(() => {\r\n instanceData.onAttach();\r\n });\r\n }\r\n else {\r\n if (projectorState.merge && projectorState.mergeElement !== undefined) {\r\n domNode = dnode.domNode = projectionOptions.mergeElement;\r\n projectorState.mergeElement = undefined;\r\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\r\n return;\r\n }\r\n const doc = parentVNode.domNode.ownerDocument;\r\n if (!dnode.tag && typeof dnode.text === 'string') {\r\n if (dnode.domNode !== undefined && parentVNode.domNode) {\r\n const newDomNode = dnode.domNode.ownerDocument.createTextNode(dnode.text);\r\n if (parentVNode.domNode === dnode.domNode.parentNode) {\r\n parentVNode.domNode.replaceChild(newDomNode, dnode.domNode);\r\n }\r\n else {\r\n parentVNode.domNode.appendChild(newDomNode);\r\n dnode.domNode.parentNode && dnode.domNode.parentNode.removeChild(dnode.domNode);\r\n }\r\n dnode.domNode = newDomNode;\r\n }\r\n else {\r\n domNode = dnode.domNode = doc.createTextNode(dnode.text);\r\n if (insertBefore !== undefined) {\r\n parentVNode.domNode.insertBefore(domNode, insertBefore);\r\n }\r\n else {\r\n parentVNode.domNode.appendChild(domNode);\r\n }\r\n }\r\n }\r\n else {\r\n if (dnode.domNode === undefined) {\r\n if (dnode.tag === 'svg') {\r\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\r\n }\r\n if (projectionOptions.namespace !== undefined) {\r\n domNode = dnode.domNode = doc.createElementNS(projectionOptions.namespace, dnode.tag);\r\n }\r\n else {\r\n domNode = dnode.domNode = dnode.domNode || doc.createElement(dnode.tag);\r\n }\r\n }\r\n else {\r\n domNode = dnode.domNode;\r\n }\r\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\r\n if (insertBefore !== undefined) {\r\n parentVNode.domNode.insertBefore(domNode, insertBefore);\r\n }\r\n else if (domNode.parentNode !== parentVNode.domNode) {\r\n parentVNode.domNode.appendChild(domNode);\r\n }\r\n }\r\n }\r\n}\r\nfunction updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance) {\r\n if (isWNode(dnode)) {\r\n const { instance } = previous;\r\n const { parentVNode, dnode: node } = instanceMap.get(instance);\r\n const previousRendered = node ? node.rendered : previous.rendered;\r\n const instanceData = widgetInstanceMap.get(instance);\r\n instanceData.rendering = true;\r\n instance.__setCoreProperties__(dnode.coreProperties);\r\n instance.__setChildren__(dnode.children);\r\n instance.__setProperties__(dnode.properties);\r\n dnode.instance = instance;\r\n if (instanceData.dirty === true) {\r\n const rendered = instance.__render__();\r\n instanceData.rendering = false;\r\n dnode.rendered = filterAndDecorateChildren(rendered, instance);\r\n updateChildren(parentVNode, previousRendered, dnode.rendered, instance, projectionOptions);\r\n }\r\n else {\r\n instanceData.rendering = false;\r\n dnode.rendered = previousRendered;\r\n }\r\n instanceMap.set(instance, { dnode, parentVNode });\r\n instanceData.nodeHandler.addRoot();\r\n }\r\n else {\r\n if (previous === dnode) {\r\n return false;\r\n }\r\n const domNode = (dnode.domNode = previous.domNode);\r\n let textUpdated = false;\r\n let updated = false;\r\n if (!dnode.tag && typeof dnode.text === 'string') {\r\n if (dnode.text !== previous.text) {\r\n const newDomNode = domNode.ownerDocument.createTextNode(dnode.text);\r\n domNode.parentNode.replaceChild(newDomNode, domNode);\r\n dnode.domNode = newDomNode;\r\n textUpdated = true;\r\n return textUpdated;\r\n }\r\n }\r\n else {\r\n if (dnode.tag && dnode.tag.lastIndexOf('svg', 0) === 0) {\r\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\r\n }\r\n if (previous.children !== dnode.children) {\r\n const children = filterAndDecorateChildren(dnode.children, parentInstance);\r\n dnode.children = children;\r\n updated =\r\n updateChildren(dnode, previous.children, children, parentInstance, projectionOptions) || updated;\r\n }\r\n const previousProperties = buildPreviousProperties(domNode, previous, dnode);\r\n if (dnode.attributes && dnode.events) {\r\n updateAttributes(domNode, previousProperties.attributes, dnode.attributes, projectionOptions);\r\n updated =\r\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions, false) || updated;\r\n removeOrphanedEvents(domNode, previousProperties.events, dnode.events, projectionOptions, true);\r\n const events = dnode.events;\r\n Object.keys(events).forEach((event) => {\r\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind, previousProperties.events[event]);\r\n });\r\n }\r\n else {\r\n updated =\r\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions) ||\r\n updated;\r\n }\r\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\r\n const instanceData = widgetInstanceMap.get(parentInstance);\r\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\r\n }\r\n }\r\n if (updated && dnode.properties && dnode.properties.updateAnimation) {\r\n dnode.properties.updateAnimation(domNode, dnode.properties, previous.properties);\r\n }\r\n }\r\n}\r\nfunction addDeferredProperties(vnode, projectionOptions) {\r\n // transfer any properties that have been passed - as these must be decorated properties\r\n vnode.decoratedDeferredProperties = vnode.properties;\r\n const properties = vnode.deferredPropertiesCallback(!!vnode.inserted);\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n vnode.properties = Object.assign({}, properties, vnode.decoratedDeferredProperties);\r\n projectorState.deferredRenderCallbacks.push(() => {\r\n const properties = Object.assign({}, vnode.deferredPropertiesCallback(!!vnode.inserted), vnode.decoratedDeferredProperties);\r\n updateProperties(vnode.domNode, vnode.properties, properties, projectionOptions);\r\n vnode.properties = properties;\r\n });\r\n}\r\nfunction runDeferredRenderCallbacks(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectorState.deferredRenderCallbacks.length) {\r\n if (projectionOptions.sync) {\r\n while (projectorState.deferredRenderCallbacks.length) {\r\n const callback = projectorState.deferredRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n }\r\n else {\r\n global.requestAnimationFrame(() => {\r\n while (projectorState.deferredRenderCallbacks.length) {\r\n const callback = projectorState.deferredRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n }\r\n}\r\nfunction runAfterRenderCallbacks(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectionOptions.sync) {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n }\r\n else {\r\n if (global.requestIdleCallback) {\r\n global.requestIdleCallback(() => {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n else {\r\n setTimeout(() => {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n }\r\n}\r\nfunction scheduleRender(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectionOptions.sync) {\r\n render(projectionOptions);\r\n }\r\n else if (projectorState.renderScheduled === undefined) {\r\n projectorState.renderScheduled = global.requestAnimationFrame(() => {\r\n render(projectionOptions);\r\n });\r\n }\r\n}\r\nfunction render(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectorState.renderScheduled = undefined;\r\n const renderQueue = projectorState.renderQueue;\r\n const renders = [...renderQueue];\r\n projectorState.renderQueue = [];\r\n renders.sort((a, b) => a.depth - b.depth);\r\n const previouslyRendered = [];\r\n while (renders.length) {\r\n const { instance } = renders.shift();\r\n if (instanceMap.has(instance) && previouslyRendered.indexOf(instance) === -1) {\r\n previouslyRendered.push(instance);\r\n const { parentVNode, dnode } = instanceMap.get(instance);\r\n const instanceData = widgetInstanceMap.get(instance);\r\n updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance);\r\n }\r\n }\r\n runAfterRenderCallbacks(projectionOptions);\r\n runDeferredRenderCallbacks(projectionOptions);\r\n}\r\nexport const dom = {\r\n append: function (parentNode, instance, projectionOptions = {}) {\r\n const instanceData = widgetInstanceMap.get(instance);\r\n const finalProjectorOptions = getProjectionOptions(projectionOptions, instance);\r\n const projectorState = {\r\n afterRenderCallbacks: [],\r\n deferredRenderCallbacks: [],\r\n nodeMap: new WeakMap(),\r\n renderScheduled: undefined,\r\n renderQueue: [],\r\n merge: projectionOptions.merge || false,\r\n mergeElement: projectionOptions.mergeElement\r\n };\r\n projectorStateMap.set(instance, projectorState);\r\n finalProjectorOptions.rootNode = parentNode;\r\n const parentVNode = toParentVNode(finalProjectorOptions.rootNode);\r\n const node = toInternalWNode(instance, instanceData);\r\n instanceMap.set(instance, { dnode: node, parentVNode });\r\n instanceData.invalidate = () => {\r\n instanceData.dirty = true;\r\n if (instanceData.rendering === false) {\r\n projectorState.renderQueue.push({ instance, depth: finalProjectorOptions.depth });\r\n scheduleRender(finalProjectorOptions);\r\n }\r\n };\r\n updateDom(node, node, finalProjectorOptions, parentVNode, instance);\r\n projectorState.afterRenderCallbacks.push(() => {\r\n instanceData.onAttach();\r\n });\r\n runDeferredRenderCallbacks(finalProjectorOptions);\r\n runAfterRenderCallbacks(finalProjectorOptions);\r\n return {\r\n domNode: finalProjectorOptions.rootNode\r\n };\r\n },\r\n create: function (instance, projectionOptions) {\r\n return this.append(document.createElement('div'), instance, projectionOptions);\r\n },\r\n merge: function (element, instance, projectionOptions = {}) {\r\n projectionOptions.merge = true;\r\n projectionOptions.mergeElement = element;\r\n const projection = this.append(element.parentNode, instance, projectionOptions);\r\n const projectorState = projectorStateMap.get(instance);\r\n projectorState.merge = false;\r\n return projection;\r\n }\r\n};\r\n//# sourceMappingURL=vdom.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/vdom.mjs\n// module id = ./node_modules/@dojo/widget-core/vdom.mjs\n// module chunks = menu-item","/*** IMPORTS FROM imports-loader ***/\nvar widgetFactory = require(\"src/menu-item/MenuItem\");\n\nvar registerCustomElement = require('@dojo/widget-core/registerCustomElement').default;\r\n\r\nvar defaultExport = widgetFactory.default;\r\ndefaultExport && registerCustomElement(defaultExport);\r\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/imports-loader?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js\n// module id = ./node_modules/imports-loader/index.js?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js\n// module chunks = menu-item","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/process/browser.js\n// module id = ./node_modules/process/browser.js\n// module chunks = menu-item","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)\r\n t[p[i]] = s[p[i]];\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = y[op[0] & 2 ? \"return\" : op[0] ? \"throw\" : \"next\"]) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [0, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { if (o[n]) i[n] = function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; }; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator];\r\n return m ? m.call(o) : typeof __values === \"function\" ? __values(o) : o[Symbol.iterator]();\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/tslib/tslib.es6.js\n// module id = ./node_modules/tslib/tslib.es6.js\n// module chunks = menu-item","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\n} catch(e) {\n\t// This works if the window reference is available\n\tif(typeof window === \"object\")\n\t\tg = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = ./node_modules/webpack/buildin/global.js\n// module chunks = menu-item","import { v } from '@dojo/widget-core/d';\r\nimport { customElement } from '@dojo/widget-core/decorators/customElement';\r\nimport { WidgetProperties } from '@dojo/widget-core/interfaces';\r\nimport { theme, ThemedMixin } from '@dojo/widget-core/mixins/Themed';\r\nimport { WidgetBase } from '@dojo/widget-core/WidgetBase';\r\n\r\nimport * as css from './menuItem.m.css';\r\n\r\nexport interface MenuItemProperties extends WidgetProperties {\r\n\ttitle: string;\r\n\tselected?: boolean;\r\n\tdata?: any;\r\n\tonSelected?: (data: any) => void;\r\n}\r\n\r\n@customElement({\r\n\ttag: 'demo-menu-item',\r\n\tattributes: ['title', 'selected'],\r\n\tevents: ['onSelected'],\r\n\tproperties: ['data', 'selected']\r\n})\r\n@theme(css)\r\nexport class MenuItem extends ThemedMixin(WidgetBase) {\r\n\tprivate _onClick() {\r\n\t\tthis.properties.onSelected && this.properties.onSelected(this.properties.data);\r\n\t}\r\n\r\n\tprotected render() {\r\n\t\tconst { title, selected } = this.properties;\r\n\r\n\t\treturn v('li', { classes: this.theme(css.root) }, [\r\n\t\t\tv(\r\n\t\t\t\t'span',\r\n\t\t\t\t{\r\n\t\t\t\t\tclasses: this.theme([css.item, selected ? css.selected : null]),\r\n\t\t\t\t\tonclick: this._onClick\r\n\t\t\t\t},\r\n\t\t\t\t[title]\r\n\t\t\t)\r\n\t\t]);\r\n\t}\r\n}\r\n\r\nexport default MenuItem;\r\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@dojo/webpack-contrib/css-module-dts-loader?type=ts&instanceName=0_menu-item!./src/menu-item/MenuItem.ts","// removed by extract-text-webpack-plugin\nmodule.exports = {\" _key\":\"test-app/menuItem\",\"root\":\"sUmUi4Sh\",\"item\":\"_2Mk6Rdqa\",\"selected\":\"_1-f3ItOh\"};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/menu-item/menuItem.m.css\n// module id = ./src/menu-item/menuItem.m.css\n// module chunks = menu-item"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 0f998ebbc6b593fa2700","webpack:///./node_modules/@dojo/framework/core/Destroyable.mjs","webpack:///./node_modules/@dojo/framework/core/Evented.mjs","webpack:///./node_modules/@dojo/framework/core/lang.mjs","webpack:///./node_modules/@dojo/framework/has/has.mjs","webpack:///./node_modules/@dojo/framework/shim/Map.mjs","webpack:///./node_modules/@dojo/framework/shim/Promise.mjs","webpack:///./node_modules/@dojo/framework/shim/Symbol.mjs","webpack:///./node_modules/@dojo/framework/shim/WeakMap.mjs","webpack:///./node_modules/@dojo/framework/shim/array.mjs","webpack:///./node_modules/@dojo/framework/shim/global.mjs","webpack:///./node_modules/@dojo/framework/shim/number.mjs","webpack:///./node_modules/@dojo/framework/shim/object.mjs","webpack:///./node_modules/@dojo/framework/shim/string.mjs","webpack:///./node_modules/@dojo/framework/shim/support/has.mjs","webpack:///./node_modules/@dojo/framework/shim/support/queue.mjs","webpack:///./node_modules/@dojo/framework/shim/support/util.mjs","webpack:///./node_modules/@dojo/framework/widget-core/Injector.mjs","webpack:///./node_modules/@dojo/framework/widget-core/NodeHandler.mjs","webpack:///./node_modules/@dojo/framework/widget-core/Registry.mjs","webpack:///./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs","webpack:///./node_modules/@dojo/framework/widget-core/WidgetBase.mjs","webpack:///./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs","webpack:///./node_modules/@dojo/framework/widget-core/d.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/inject.mjs","webpack:///./node_modules/@dojo/framework/widget-core/diff.mjs","webpack:///./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs","webpack:///./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs","webpack:///./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs","webpack:///./node_modules/@dojo/framework/widget-core/vdom.mjs","webpack:///./node_modules/@dojo/cli-build-widget/template/custom-element.js","webpack:///./node_modules/process/browser.js","webpack:///./node_modules/tslib/tslib.es6.js","webpack:///(webpack)/buildin/global.js","webpack:///./src/menu-item/MenuItem.ts","webpack:///./src/menu-item/menuItem.m.css?6a95"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","noop","__WEBPACK_IMPORTED_MODULE_1__shim_Promise__","resolve","destroyed","Error","Destroyable","[object Object]","this","handles","handle","Array","isArray","__WEBPACK_IMPORTED_MODULE_0__lang__","_handles","push","splice","indexOf","destroy","forEach","own","__webpack_exports__","regexMap","__WEBPACK_IMPORTED_MODULE_0__shim_Map__","Evented","__WEBPACK_IMPORTED_MODULE_1__Destroyable__","super","arguments","listenersMap","event","methods","type","globString","targetString","regex","has","RegExp","replace","set","test","isGlobMatch","method","listener","map","_addListener","listeners","destructor","called","createHandle","length","slice","testCache","testFunctions","testThenables","globalScope","window","global","self","staticFeatures","DojoHasEnvironment","staticCache","apply","add","feature","value","overwrite","normalizedFeature","toLowerCase","Boolean","exists","TypeError","then","isFeatureTestThenable","resolvedValue","result","document","location","process","versions","node","Map","__WEBPACK_IMPORTED_MODULE_1__global__","ShimPromise","__WEBPACK_IMPORTED_MODULE_0__global__","Promise","Symbol","wellKnown","__WEBPACK_IMPORTED_MODULE_2__support_util__","for","WeakMap","from","of","copyWithin","fill","find","findIndex","includes","__WEBPACK_IMPORTED_MODULE_4__support_util__","globalObject","Math","pow","assign","getOwnPropertyDescriptor","getOwnPropertyNames","getOwnPropertySymbols","is","keys","getOwnPropertyDescriptors","entries","values","fromCodePoint","raw","codePointAt","endsWith","normalize","repeat","startsWith","padEnd","padStart","String","__WEBPACK_IMPORTED_MODULE_0__has_has__","every","key","Number","POSITIVE_INFINITY","e","imul","Observable","Set","getCallSite","callSite","substitutions","key1","key2","freeze","postMessage","requestAnimationFrame","setImmediate","MutationObserver","WebKitMutationObserver","example","createElement","observer","observe","attributes","style","setProperty","takeRecords","undefined","Animation","KeyframeEffect","executeTask","item","isActive","callback","getQueueHandle","enqueue","queue","addEventListener","source","data","stopPropagation","shift","queueTask","id","queueAnimationTask","rafId","bind","cancelAnimationFrame","writable","nativeFunction","target","args","Injector","__WEBPACK_IMPORTED_MODULE_0__core_Evented__","payload","_payload","invalidator","_invalidator","NodeEventType","_nodeMap","__WEBPACK_IMPORTED_MODULE_1__shim_Map__","element","emit","Widget","Projector","clear","WIDGET_BASE_TYPE","__WEBPACK_IMPORTED_MODULE_2__shim_Symbol__","isWidgetBaseConstructor","_type","Registry","__WEBPACK_IMPORTED_MODULE_3__core_Evented__","widgetLabel","action","label","_widgetRegistry","toString","__WEBPACK_IMPORTED_MODULE_0__shim_Promise__","widgetCtor","emitLoadedEvent","error","injectorFactory","_injectorRegistry","injectorItem","injector","promise","default","isWidgetConstructorDefaultExport","hasInjector","__WEBPACK_IMPORTED_MODULE_1__core_Evented__","_registry","__WEBPACK_IMPORTED_MODULE_2__Registry__","_registryWidgetLabelMap","_registryInjectorLabelMap","baseRegistry","delete","base","widget","define","defineInjector","globalPrecedence","_get","getFunctionName","labelMap","registries","registry","registeredLabels","on","decoratorMap","boundAuto","__WEBPACK_IMPORTED_MODULE_4__diff__","noBind","WidgetBase","_initialProperties","_changedPropertyKeys","_nodeHandler","__WEBPACK_IMPORTED_MODULE_6__NodeHandler__","_children","_decoratorCache","_properties","_boundRenderFunc","render","_boundInvalidate","invalidate","__WEBPACK_IMPORTED_MODULE_7__vdom__","dirty","onAttach","onDetach","nodeHandler","coreProperties","rendering","inputProperties","_runAfterConstructors","MetaType","_metaMap","cached","properties","changedPropertyKeys","instanceData","__WEBPACK_IMPORTED_MODULE_5__RegistryHandler__","originalProperties","_runBeforeProperties","registeredDiffPropertyNames","getDecorator","propertyNames","allProperties","checkedProperties","diffPropertyResults","runReactions","propertyName","previousProperty","newProperty","_bindFunctionProperty","diffFunctions","changed","executedReactions","reaction","propertyChanged","reactionRun","children","dNode","_runBeforeRenders","runAfterRenders","__WEBPACK_IMPORTED_MODULE_3__d__","decoratorKey","decoratorList","constructor","specificDecoratorList","decorators","allDecorators","instanceMap","unshift","getPrototypeOf","_buildDecoratorList","__WEBPACK_IMPORTED_MODULE_8__Registry__","_bindFunctionPropertyMap","__WEBPACK_IMPORTED_MODULE_1__shim_WeakMap__","bindInfo","boundFunc","scope","beforeProperties","reduce","beforePropertiesFunction","beforeRenders","beforeRenderFunction","updatedRender","console","warn","afterRenders","afterRenderFunction","meta","afterRender","afterConstructors","afterConstructor","pop","browserSpecificTransitionEndEventName","browserSpecificAnimationEndEventName","initialize","determineBrowserStyleNames","runAndCleanUp","startAnimation","finishAnimation","finished","transitionEnd","removeEventListener","enter","enterAnimation","activeClass","enterAnimationActive","classList","remove","exit","exitAnimation","removeNode","exitAnimationActive","child","DOMVNODE","widgetConstructor","WNODE","tag","propertiesOrChildren","deferredPropertiesCallback","VNODE","attrs","props","diffType","isElementNode","tagName","events","domNode","text","__WEBPACK_IMPORTED_MODULE_0__shim_Symbol__","isWNode","isVNode","__WEBPACK_IMPORTED_MODULE_0__handleDecorator__","propertyKey","addDecorator","alwaysRender","__WEBPACK_IMPORTED_MODULE_1__beforeProperties__","customElement","childType","__WEBPACK_IMPORTED_MODULE_0__registerCustomElement__","DOJO","registryFactory","__WEBPACK_IMPORTED_MODULE_1__Registry__","__customElementDescriptor","diffProperty","diffFunction","__WEBPACK_IMPORTED_MODULE_1__diff__","reactionFunction","handleDecorator","handler","descriptor","registeredInjectorsMap","__WEBPACK_IMPORTED_MODULE_0__shim_WeakMap__","inject","getProperties","__WEBPACK_IMPORTED_MODULE_1__handleDecorator__","__WEBPACK_IMPORTED_MODULE_2__beforeProperties__","getInjector","registeredInjectors","__WEBPACK_IMPORTED_MODULE_0__Registry__","reference","ignore","isObjectOrArray","shallow","validOldProperty","validNewProperty","previousKeys","newKeys","some","ProjectorAttachState","AttachType","ProjectorMixin","Base","_root","body","_async","_projectorProperties","_projectionOptions","transitions","__WEBPACK_IMPORTED_MODULE_2__animations_cssTransitions__","root","projectorState","Detached","options","Append","_attach","Merge","Attached","async","doc","previousRoot","createDocumentFragment","__setChildren__","__setProperties__","__WEBPACK_IMPORTED_MODULE_1__core_lang__","__setCoreProperties__","_projection","childNodes","outerHTML","__WEBPACK_IMPORTED_MODULE_4__d__","_attachHandle","sync","__WEBPACK_IMPORTED_MODULE_5__vdom__","append","merge","__WEBPACK_IMPORTED_MODULE_0_tslib__","__WEBPACK_IMPORTED_MODULE_3__decorators_afterRender__","theme","__WEBPACK_IMPORTED_MODULE_3__decorators_handleDecorator__","themeRegistry","themeInjector","__WEBPACK_IMPORTED_MODULE_1__Injector__","INJECTED_THEME_KEY","setInvalidator","THEME_KEY","ThemedMixin","Themed","_registeredBaseThemeKeys","_recalculateClasses","_theme","classes","_recalculateThemeClasses","className","_getThemeClass","extraClasses","themeClassName","_baseThemeClassesReverseLookup","resultClassNames","_registeredBaseTheme","join","baseThemes","finalBaseTheme","baseTheme","_a","currentClassNames","baseClass","themeKey","__WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__","__WEBPACK_IMPORTED_MODULE_5__diff__","__WEBPACK_IMPORTED_MODULE_2__decorators_inject__","CustomElementChildType","DomToWidgetWrapper","__WEBPACK_IMPORTED_MODULE_1__WidgetBase__","__WEBPACK_IMPORTED_MODULE_7__decorators_alwaysRender__","create","WidgetConstructor","attributeMap","attributeName","HTMLElement","_eventProperties","_initialised","domProperties","_attributesToProperties","filteredPropertyName","_getProperty","_setProperty","eventName","_getEventProperty","_setEventProperty","eventCallback","dispatchEvent","CustomEvent","bubbles","detail","defineProperties","TEXT","__WEBPACK_IMPORTED_MODULE_3__shim_array__","childNode","_render","_childConnected","widgetProperties","renderChildren","__children__","themeContext","__WEBPACK_IMPORTED_MODULE_6__mixins_Themed__","_getTheme","__WEBPACK_IMPORTED_MODULE_5__shim_global__","__WEBPACK_IMPORTED_MODULE_2__mixins_Projector__","_projector","setProperties","dojoce","themes","parentNode","filter","Child","isWidget","__properties__","oldValue","getAttribute","observedAttributes","register","customElements","NAMESPACE_SVG","NAMESPACE_W3","NAMESPACE_XLINK","emptyArray","nodeOperations","widgetInstanceMap","__WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__","nextSiblingMap","projectorStateMap","same","dnode1","dnode2","__WEBPACK_IMPORTED_MODULE_2__d__","instance","missingTransition","checkStyleValue","styleValue","updateEvent","currentValue","projectionOptions","previousValue","projectorInstance","eventMap","nodeMap","previousEvent","evt","addClasses","classNames","split","removeClasses","nodeOperation","propName","propValue","deferredRenderCallbacks","removeOrphanedEvents","previousProperties","onlyEvents","isEvent","substr","updateAttribute","attrName","attrValue","namespace","setAttributeNS","removeAttribute","setAttribute","updateAttributes","previousAttributes","attrNames","attrCount","updateProperties","includesEventsAndAttributes","propertiesUpdated","propNames","propCount","previousClasses","currentClasses","newClasses","previousClassName","classIndex","styleNames","styleCount","j","styleName","newStyleValue","styleApplyer","domValue","lastIndexOf","findIndexOfChild","sameAs","start","toInternalWNode","rendered","filterAndDecorateChildren","nodeAdded","dnode","nodeToRemove","pointerEvents","removeDomNode","removeChild","checkDistinguishable","indexToCheck","parentInstance","nodeIdentifier","parentName","updateChildren","parentVNode","siblings","oldChildren","newChildren","oldChildrenLength","newChildrenLength","depth","oldIndex","newIndex","textUpdated","oldChild","newChild","inserted","addDeferredProperties","updateDom","findOldIndex","addChild","insertBeforeDomNode","childrenArray","nextIndex","insertBeforeChildren","insertBefore","parentElement","createDom","afterRenderCallbacks","childToRemove","addChildren","__WEBPACK_IMPORTED_MODULE_1__shim_array__","nextSiblings","domElement","toUpperCase","initPropertiesAndChildren","parentInstanceData","__WEBPACK_IMPORTED_MODULE_3__Registry__","renderQueue","scheduleRender","__render__","filteredRendered","addRoot","mergeElement","ownerDocument","createElementNS","appendChild","newDomNode","createTextNode","replaceChild","previous","oldNextSiblings","previousRendered","updated","current","newProperties","buildPreviousProperties","updateAnimation","vnode","decoratedDeferredProperties","runDeferredRenderCallbacks","__WEBPACK_IMPORTED_MODULE_0__shim_global__","runAfterRenderCallbacks","requestIdleCallback","setTimeout","renderScheduled","renders","sort","a","b","previouslyRendered","dom","finalProjectorOptions","projectorOptions","defaults","getProjectionOptions","rootNode","projection","widgetFactory","registerCustomElement","defaultExport","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","fun","clearTimeout","currentQueue","draining","queueIndex","cleanUpNextTick","concat","drainQueue","timeout","len","run","marker","runClearTimeout","Item","array","nextTick","title","browser","env","argv","version","addListener","once","off","removeListener","removeAllListeners","prependListener","prependOnceListener","binding","cwd","chdir","dir","umask","t","desc","r","Reflect","decorate","setPrototypeOf","g","Function","eval","MenuItem","__WEBPACK_IMPORTED_MODULE_3__dojo_framework_widget_core_mixins_Themed__","__WEBPACK_IMPORTED_MODULE_4__dojo_framework_widget_core_WidgetBase__","onSelected","selected","__WEBPACK_IMPORTED_MODULE_1__dojo_framework_widget_core_d__","__WEBPACK_IMPORTED_MODULE_5__menuItem_m_css__","onclick","_onClick","__WEBPACK_IMPORTED_MODULE_2__dojo_framework_widget_core_decorators_customElement__"," _key"],"mappings":"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","file":"menu-item-1.0.0.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 0f998ebbc6b593fa2700","import { createCompositeHandle } from './lang';\nimport Promise from '../shim/Promise';\n/**\n * No operation function to replace own once instance is destoryed\n */\nfunction noop() {\n return Promise.resolve(false);\n}\n/**\n * No op function used to replace own, once instance has been destoryed\n */\nfunction destroyed() {\n throw new Error('Call made to destroyed method');\n}\nexport class Destroyable {\n /**\n * @constructor\n */\n constructor() {\n this.handles = [];\n }\n /**\n * Register handles for the instance that will be destroyed when `this.destroy` is called\n *\n * @param {Handle} handle The handle to add for the instance\n * @returns {Handle} a handle for the handle, removes the handle for the instance and calls destroy\n */\n own(handles) {\n const handle = Array.isArray(handles) ? createCompositeHandle(...handles) : handles;\n const { handles: _handles } = this;\n _handles.push(handle);\n return {\n destroy() {\n _handles.splice(_handles.indexOf(handle));\n handle.destroy();\n }\n };\n }\n /**\n * Destrpys all handers registered for the instance\n *\n * @returns {Promise {\n this.handles.forEach((handle) => {\n handle && handle.destroy && handle.destroy();\n });\n this.destroy = noop;\n this.own = destroyed;\n resolve(true);\n });\n }\n}\nexport default Destroyable;\n//# sourceMappingURL=Destroyable.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/core/Destroyable.mjs\n// module id = ./node_modules/@dojo/framework/core/Destroyable.mjs\n// module chunks = menu-item","import Map from '../shim/Map';\r\nimport { Destroyable } from './Destroyable';\r\n/**\r\n * Map of computed regular expressions, keyed by string\r\n */\r\nconst regexMap = new Map();\r\n/**\r\n * Determines is the event type glob has been matched\r\n *\r\n * @returns boolean that indicates if the glob is matched\r\n */\r\nexport function isGlobMatch(globString, targetString) {\r\n if (typeof targetString === 'string' && typeof globString === 'string' && globString.indexOf('*') !== -1) {\r\n let regex;\r\n if (regexMap.has(globString)) {\r\n regex = regexMap.get(globString);\r\n }\r\n else {\r\n regex = new RegExp(`^${globString.replace(/\\*/g, '.*')}$`);\r\n regexMap.set(globString, regex);\r\n }\r\n return regex.test(targetString);\r\n }\r\n else {\r\n return globString === targetString;\r\n }\r\n}\r\n/**\r\n * Event Class\r\n */\r\nexport class Evented extends Destroyable {\r\n constructor() {\r\n super(...arguments);\r\n /**\r\n * map of listeners keyed by event type\r\n */\r\n this.listenersMap = new Map();\r\n }\r\n emit(event) {\r\n this.listenersMap.forEach((methods, type) => {\r\n if (isGlobMatch(type, event.type)) {\r\n [...methods].forEach((method) => {\r\n method.call(this, event);\r\n });\r\n }\r\n });\r\n }\r\n on(type, listener) {\r\n if (Array.isArray(listener)) {\r\n const handles = listener.map((listener) => this._addListener(type, listener));\r\n return {\r\n destroy() {\r\n handles.forEach((handle) => handle.destroy());\r\n }\r\n };\r\n }\r\n return this._addListener(type, listener);\r\n }\r\n _addListener(type, listener) {\r\n const listeners = this.listenersMap.get(type) || [];\r\n listeners.push(listener);\r\n this.listenersMap.set(type, listeners);\r\n return {\r\n destroy: () => {\r\n const listeners = this.listenersMap.get(type) || [];\r\n listeners.splice(listeners.indexOf(listener), 1);\r\n }\r\n };\r\n }\r\n}\r\nexport default Evented;\r\n//# sourceMappingURL=Evented.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/core/Evented.mjs\n// module id = ./node_modules/@dojo/framework/core/Evented.mjs\n// module chunks = menu-item","import { assign } from '../shim/object';\nexport { assign } from '../shim/object';\nconst slice = Array.prototype.slice;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Type guard that ensures that the value can be coerced to Object\n * to weed out host objects that do not derive from Object.\n * This function is used to check if we want to deep copy an object or not.\n * Note: In ES6 it is possible to modify an object's Symbol.toStringTag property, which will\n * change the value returned by `toString`. This is a rare edge case that is difficult to handle,\n * so it is not handled here.\n * @param value The value to check\n * @return If the value is coercible into an Object\n */\nfunction shouldDeepCopyObject(value) {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\nfunction copyArray(array, inherited) {\n return array.map(function (item) {\n if (Array.isArray(item)) {\n return copyArray(item, inherited);\n }\n return !shouldDeepCopyObject(item)\n ? item\n : _mixin({\n deep: true,\n inherited: inherited,\n sources: [item],\n target: {}\n });\n });\n}\nfunction _mixin(kwArgs) {\n const deep = kwArgs.deep;\n const inherited = kwArgs.inherited;\n const target = kwArgs.target;\n const copied = kwArgs.copied || [];\n const copiedClone = [...copied];\n for (let i = 0; i < kwArgs.sources.length; i++) {\n const source = kwArgs.sources[i];\n if (source === null || source === undefined) {\n continue;\n }\n for (let key in source) {\n if (inherited || hasOwnProperty.call(source, key)) {\n let value = source[key];\n if (copiedClone.indexOf(value) !== -1) {\n continue;\n }\n if (deep) {\n if (Array.isArray(value)) {\n value = copyArray(value, inherited);\n }\n else if (shouldDeepCopyObject(value)) {\n const targetValue = target[key] || {};\n copied.push(source);\n value = _mixin({\n deep: true,\n inherited: inherited,\n sources: [value],\n target: targetValue,\n copied\n });\n }\n }\n target[key] = value;\n }\n }\n }\n return target;\n}\nexport function create(prototype, ...mixins) {\n if (!mixins.length) {\n throw new RangeError('lang.create requires at least one mixin object.');\n }\n const args = mixins.slice();\n args.unshift(Object.create(prototype));\n return assign.apply(null, args);\n}\nexport function deepAssign(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: false,\n sources: sources,\n target: target\n });\n}\nexport function deepMixin(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Creates a new object using the provided source's prototype as the prototype for the new object, and then\n * deep copies the provided source's values into the new target.\n *\n * @param source The object to duplicate\n * @return The new object\n */\nexport function duplicate(source) {\n const target = Object.create(Object.getPrototypeOf(source));\n return deepMixin(target, source);\n}\n/**\n * Determines whether two values are the same value.\n *\n * @param a First value to compare\n * @param b Second value to compare\n * @return true if the values are the same; false otherwise\n */\nexport function isIdentical(a, b) {\n return (a === b ||\n /* both values are NaN */\n (a !== a && b !== b));\n}\n/**\n * Returns a function that binds a method to the specified object at runtime. This is similar to\n * `Function.prototype.bind`, but instead of a function it takes the name of a method on an object.\n * As a result, the function returned by `lateBind` will always call the function currently assigned to\n * the specified property on the object as of the moment the function it returns is called.\n *\n * @param instance The context object\n * @param method The name of the method on the context object to bind to itself\n * @param suppliedArgs An optional array of values to prepend to the `instance[method]` arguments list\n * @return The bound function\n */\nexport function lateBind(instance, method, ...suppliedArgs) {\n return suppliedArgs.length\n ? function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n // TS7017\n return instance[method].apply(instance, args);\n }\n : function () {\n // TS7017\n return instance[method].apply(instance, arguments);\n };\n}\nexport function mixin(target, ...sources) {\n return _mixin({\n deep: false,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Returns a function which invokes the given function with the given arguments prepended to its argument list.\n * Like `Function.prototype.bind`, but does not alter execution context.\n *\n * @param targetFunction The function that needs to be bound\n * @param suppliedArgs An optional array of arguments to prepend to the `targetFunction` arguments list\n * @return The bound function\n */\nexport function partial(targetFunction, ...suppliedArgs) {\n return function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n return targetFunction.apply(this, args);\n };\n}\n/**\n * Returns an object with a destroy method that, when called, calls the passed-in destructor.\n * This is intended to provide a unified interface for creating \"remove\" / \"destroy\" handlers for\n * event listeners, timers, etc.\n *\n * @param destructor A function that will be called when the handle's `destroy` method is invoked\n * @return The handle object\n */\nexport function createHandle(destructor) {\n let called = false;\n return {\n destroy: function () {\n if (!called) {\n called = true;\n destructor();\n }\n }\n };\n}\n/**\n * Returns a single handle that can be used to destroy multiple handles simultaneously.\n *\n * @param handles An array of handles with `destroy` methods\n * @return The handle object\n */\nexport function createCompositeHandle(...handles) {\n return createHandle(function () {\n for (let i = 0; i < handles.length; i++) {\n handles[i].destroy();\n }\n });\n}\n//# sourceMappingURL=lang.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/core/lang.mjs\n// module id = ./node_modules/@dojo/framework/core/lang.mjs\n// module chunks = menu-item","function isFeatureTestThenable(value) {\r\n return value && value.then;\r\n}\r\n/**\r\n * A cache of results of feature tests\r\n */\r\nexport const testCache = {};\r\n/**\r\n * A cache of the un-resolved feature tests\r\n */\r\nexport const testFunctions = {};\r\n/**\r\n * A cache of unresolved thenables (probably promises)\r\n * @type {{}}\r\n */\r\nconst testThenables = {};\r\n/**\r\n * A reference to the global scope (`window` in a browser, `global` in NodeJS)\r\n */\r\nconst globalScope = (function () {\r\n /* istanbul ignore else */\r\n if (typeof window !== 'undefined') {\r\n // Browsers\r\n return window;\r\n }\r\n else if (typeof global !== 'undefined') {\r\n // Node\r\n return global;\r\n }\r\n else if (typeof self !== 'undefined') {\r\n // Web workers\r\n return self;\r\n }\r\n /* istanbul ignore next */\r\n return {};\r\n})();\r\n/* Grab the staticFeatures if there are available */\r\nconst { staticFeatures } = globalScope.DojoHasEnvironment || {};\r\n/* Cleaning up the DojoHasEnviornment */\r\nif ('DojoHasEnvironment' in globalScope) {\r\n delete globalScope.DojoHasEnvironment;\r\n}\r\n/**\r\n * Custom type guard to narrow the `staticFeatures` to either a map or a function that\r\n * returns a map.\r\n *\r\n * @param value The value to guard for\r\n */\r\nfunction isStaticFeatureFunction(value) {\r\n return typeof value === 'function';\r\n}\r\n/**\r\n * The cache of asserted features that were available in the global scope when the\r\n * module loaded\r\n */\r\nconst staticCache = staticFeatures\r\n ? isStaticFeatureFunction(staticFeatures) ? staticFeatures.apply(globalScope) : staticFeatures\r\n : {}; /* Providing an empty cache, if none was in the environment\r\n\r\n/**\r\n* AMD plugin function.\r\n*\r\n* Conditional loads modules based on a has feature test value.\r\n*\r\n* @param resourceId Gives the resolved module id to load.\r\n* @param require The loader require function with respect to the module that contained the plugin resource in its\r\n* dependency list.\r\n* @param load Callback to loader that consumes result of plugin demand.\r\n*/\r\nexport function load(resourceId, require, load, config) {\r\n resourceId ? require([resourceId], load) : load();\r\n}\r\n/**\r\n * AMD plugin function.\r\n *\r\n * Resolves resourceId into a module id based on possibly-nested tenary expression that branches on has feature test\r\n * value(s).\r\n *\r\n * @param resourceId The id of the module\r\n * @param normalize Resolves a relative module id into an absolute module id\r\n */\r\nexport function normalize(resourceId, normalize) {\r\n const tokens = resourceId.match(/[\\?:]|[^:\\?]*/g) || [];\r\n let i = 0;\r\n function get(skip) {\r\n const term = tokens[i++];\r\n if (term === ':') {\r\n // empty string module name, resolves to null\r\n return null;\r\n }\r\n else {\r\n // postfixed with a ? means it is a feature to branch on, the term is the name of the feature\r\n if (tokens[i++] === '?') {\r\n if (!skip && has(term)) {\r\n // matched the feature, get the first value from the options\r\n return get();\r\n }\r\n else {\r\n // did not match, get the second value, passing over the first\r\n get(true);\r\n return get(skip);\r\n }\r\n }\r\n // a module\r\n return term;\r\n }\r\n }\r\n const id = get();\r\n return id && normalize(id);\r\n}\r\n/**\r\n * Check if a feature has already been registered\r\n *\r\n * @param feature the name of the feature\r\n */\r\nexport function exists(feature) {\r\n const normalizedFeature = feature.toLowerCase();\r\n return Boolean(normalizedFeature in staticCache || normalizedFeature in testCache || testFunctions[normalizedFeature]);\r\n}\r\n/**\r\n * Register a new test for a named feature.\r\n *\r\n * @example\r\n * has.add('dom-addeventlistener', !!document.addEventListener);\r\n *\r\n * @example\r\n * has.add('touch-events', function () {\r\n * return 'ontouchstart' in document\r\n * });\r\n *\r\n * @param feature the name of the feature\r\n * @param value the value reported of the feature, or a function that will be executed once on first test\r\n * @param overwrite if an existing value should be overwritten. Defaults to false.\r\n */\r\nexport function add(feature, value, overwrite = false) {\r\n const normalizedFeature = feature.toLowerCase();\r\n if (exists(normalizedFeature) && !overwrite && !(normalizedFeature in staticCache)) {\r\n throw new TypeError(`Feature \"${feature}\" exists and overwrite not true.`);\r\n }\r\n if (typeof value === 'function') {\r\n testFunctions[normalizedFeature] = value;\r\n }\r\n else if (isFeatureTestThenable(value)) {\r\n testThenables[feature] = value.then((resolvedValue) => {\r\n testCache[feature] = resolvedValue;\r\n delete testThenables[feature];\r\n }, () => {\r\n delete testThenables[feature];\r\n });\r\n }\r\n else {\r\n testCache[normalizedFeature] = value;\r\n delete testFunctions[normalizedFeature];\r\n }\r\n}\r\n/**\r\n * Return the current value of a named feature.\r\n *\r\n * @param feature The name (if a string) or identifier (if an integer) of the feature to test.\r\n */\r\nexport default function has(feature) {\r\n let result;\r\n const normalizedFeature = feature.toLowerCase();\r\n if (normalizedFeature in staticCache) {\r\n result = staticCache[normalizedFeature];\r\n }\r\n else if (testFunctions[normalizedFeature]) {\r\n result = testCache[normalizedFeature] = testFunctions[normalizedFeature].call(null);\r\n delete testFunctions[normalizedFeature];\r\n }\r\n else if (normalizedFeature in testCache) {\r\n result = testCache[normalizedFeature];\r\n }\r\n else if (feature in testThenables) {\r\n return false;\r\n }\r\n else {\r\n throw new TypeError(`Attempt to detect unregistered has feature \"${feature}\"`);\r\n }\r\n return result;\r\n}\r\n/*\r\n * Out of the box feature tests\r\n */\r\n/* Environments */\r\n/* Used as a value to provide a debug only code path */\r\nadd('debug', true);\r\n/* Detects if the environment is \"browser like\" */\r\nadd('host-browser', typeof document !== 'undefined' && typeof location !== 'undefined');\r\n/* Detects if the environment appears to be NodeJS */\r\nadd('host-node', function () {\r\n if (typeof process === 'object' && process.versions && process.versions.node) {\r\n return process.versions.node;\r\n }\r\n});\r\n//# sourceMappingURL=has.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/has/has.mjs\n// module id = ./node_modules/@dojo/framework/has/has.mjs\n// module chunks = menu-item","import { isArrayLike, ShimIterator } from './iterator';\r\nimport global from './global';\r\nimport { is as objectIs } from './object';\r\nimport has from './support/has';\r\nimport './Symbol';\r\nexport let Map = global.Map;\r\nif (!true) {\r\n Map = (_a = class Map {\r\n constructor(iterable) {\r\n this._keys = [];\r\n this._values = [];\r\n this[Symbol.toStringTag] = 'Map';\r\n if (iterable) {\r\n if (isArrayLike(iterable)) {\r\n for (let i = 0; i < iterable.length; i++) {\r\n const value = iterable[i];\r\n this.set(value[0], value[1]);\r\n }\r\n }\r\n else {\r\n for (const value of iterable) {\r\n this.set(value[0], value[1]);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * An alternative to Array.prototype.indexOf using Object.is\r\n * to check for equality. See http://mzl.la/1zuKO2V\r\n */\r\n _indexOfKey(keys, key) {\r\n for (let i = 0, length = keys.length; i < length; i++) {\r\n if (objectIs(keys[i], key)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n get size() {\r\n return this._keys.length;\r\n }\r\n clear() {\r\n this._keys.length = this._values.length = 0;\r\n }\r\n delete(key) {\r\n const index = this._indexOfKey(this._keys, key);\r\n if (index < 0) {\r\n return false;\r\n }\r\n this._keys.splice(index, 1);\r\n this._values.splice(index, 1);\r\n return true;\r\n }\r\n entries() {\r\n const values = this._keys.map((key, i) => {\r\n return [key, this._values[i]];\r\n });\r\n return new ShimIterator(values);\r\n }\r\n forEach(callback, context) {\r\n const keys = this._keys;\r\n const values = this._values;\r\n for (let i = 0, length = keys.length; i < length; i++) {\r\n callback.call(context, values[i], keys[i], this);\r\n }\r\n }\r\n get(key) {\r\n const index = this._indexOfKey(this._keys, key);\r\n return index < 0 ? undefined : this._values[index];\r\n }\r\n has(key) {\r\n return this._indexOfKey(this._keys, key) > -1;\r\n }\r\n keys() {\r\n return new ShimIterator(this._keys);\r\n }\r\n set(key, value) {\r\n let index = this._indexOfKey(this._keys, key);\r\n index = index < 0 ? this._keys.length : index;\r\n this._keys[index] = key;\r\n this._values[index] = value;\r\n return this;\r\n }\r\n values() {\r\n return new ShimIterator(this._values);\r\n }\r\n [Symbol.iterator]() {\r\n return this.entries();\r\n }\r\n },\r\n _a[Symbol.species] = _a,\r\n _a);\r\n}\r\nexport default Map;\r\nvar _a;\r\n//# sourceMappingURL=Map.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/Map.mjs\n// module id = ./node_modules/@dojo/framework/shim/Map.mjs\n// module chunks = menu-item","import global from './global';\r\nimport { queueMicroTask } from './support/queue';\r\nimport './Symbol';\r\nimport has from './support/has';\r\nexport let ShimPromise = global.Promise;\r\nexport const isThenable = function isThenable(value) {\r\n return value && typeof value.then === 'function';\r\n};\r\nif (!true) {\r\n global.Promise = ShimPromise = (_a = class Promise {\r\n /**\r\n * Creates a new Promise.\r\n *\r\n * @constructor\r\n *\r\n * @param executor\r\n * The executor function is called immediately when the Promise is instantiated. It is responsible for\r\n * starting the asynchronous operation when it is invoked.\r\n *\r\n * The executor must call either the passed `resolve` function when the asynchronous operation has completed\r\n * successfully, or the `reject` function when the operation fails.\r\n */\r\n constructor(executor) {\r\n /**\r\n * The current state of this promise.\r\n */\r\n this.state = 1 /* Pending */;\r\n this[Symbol.toStringTag] = 'Promise';\r\n /**\r\n * If true, the resolution of this promise is chained (\"locked in\") to another promise.\r\n */\r\n let isChained = false;\r\n /**\r\n * Whether or not this promise is in a resolved state.\r\n */\r\n const isResolved = () => {\r\n return this.state !== 1 /* Pending */ || isChained;\r\n };\r\n /**\r\n * Callbacks that should be invoked once the asynchronous operation has completed.\r\n */\r\n let callbacks = [];\r\n /**\r\n * Initially pushes callbacks onto a queue for execution once this promise settles. After the promise settles,\r\n * enqueues callbacks for execution on the next event loop turn.\r\n */\r\n let whenFinished = function (callback) {\r\n if (callbacks) {\r\n callbacks.push(callback);\r\n }\r\n };\r\n /**\r\n * Settles this promise.\r\n *\r\n * @param newState The resolved state for this promise.\r\n * @param {T|any} value The resolved value for this promise.\r\n */\r\n const settle = (newState, value) => {\r\n // A promise can only be settled once.\r\n if (this.state !== 1 /* Pending */) {\r\n return;\r\n }\r\n this.state = newState;\r\n this.resolvedValue = value;\r\n whenFinished = queueMicroTask;\r\n // Only enqueue a callback runner if there are callbacks so that initially fulfilled Promises don't have to\r\n // wait an extra turn.\r\n if (callbacks && callbacks.length > 0) {\r\n queueMicroTask(function () {\r\n if (callbacks) {\r\n let count = callbacks.length;\r\n for (let i = 0; i < count; ++i) {\r\n callbacks[i].call(null);\r\n }\r\n callbacks = null;\r\n }\r\n });\r\n }\r\n };\r\n /**\r\n * Resolves this promise.\r\n *\r\n * @param newState The resolved state for this promise.\r\n * @param {T|any} value The resolved value for this promise.\r\n */\r\n const resolve = (newState, value) => {\r\n if (isResolved()) {\r\n return;\r\n }\r\n if (isThenable(value)) {\r\n value.then(settle.bind(null, 0 /* Fulfilled */), settle.bind(null, 2 /* Rejected */));\r\n isChained = true;\r\n }\r\n else {\r\n settle(newState, value);\r\n }\r\n };\r\n this.then = (onFulfilled, onRejected) => {\r\n return new Promise((resolve, reject) => {\r\n // whenFinished initially queues up callbacks for execution after the promise has settled. Once the\r\n // promise has settled, whenFinished will schedule callbacks for execution on the next turn through the\r\n // event loop.\r\n whenFinished(() => {\r\n const callback = this.state === 2 /* Rejected */ ? onRejected : onFulfilled;\r\n if (typeof callback === 'function') {\r\n try {\r\n resolve(callback(this.resolvedValue));\r\n }\r\n catch (error) {\r\n reject(error);\r\n }\r\n }\r\n else if (this.state === 2 /* Rejected */) {\r\n reject(this.resolvedValue);\r\n }\r\n else {\r\n resolve(this.resolvedValue);\r\n }\r\n });\r\n });\r\n };\r\n try {\r\n executor(resolve.bind(null, 0 /* Fulfilled */), resolve.bind(null, 2 /* Rejected */));\r\n }\r\n catch (error) {\r\n settle(2 /* Rejected */, error);\r\n }\r\n }\r\n static all(iterable) {\r\n return new this(function (resolve, reject) {\r\n const values = [];\r\n let complete = 0;\r\n let total = 0;\r\n let populating = true;\r\n function fulfill(index, value) {\r\n values[index] = value;\r\n ++complete;\r\n finish();\r\n }\r\n function finish() {\r\n if (populating || complete < total) {\r\n return;\r\n }\r\n resolve(values);\r\n }\r\n function processItem(index, item) {\r\n ++total;\r\n if (isThenable(item)) {\r\n // If an item Promise rejects, this Promise is immediately rejected with the item\r\n // Promise's rejection error.\r\n item.then(fulfill.bind(null, index), reject);\r\n }\r\n else {\r\n Promise.resolve(item).then(fulfill.bind(null, index));\r\n }\r\n }\r\n let i = 0;\r\n for (const value of iterable) {\r\n processItem(i, value);\r\n i++;\r\n }\r\n populating = false;\r\n finish();\r\n });\r\n }\r\n static race(iterable) {\r\n return new this(function (resolve, reject) {\r\n for (const item of iterable) {\r\n if (item instanceof Promise) {\r\n // If a Promise item rejects, this Promise is immediately rejected with the item\r\n // Promise's rejection error.\r\n item.then(resolve, reject);\r\n }\r\n else {\r\n Promise.resolve(item).then(resolve);\r\n }\r\n }\r\n });\r\n }\r\n static reject(reason) {\r\n return new this(function (resolve, reject) {\r\n reject(reason);\r\n });\r\n }\r\n static resolve(value) {\r\n return new this(function (resolve) {\r\n resolve(value);\r\n });\r\n }\r\n catch(onRejected) {\r\n return this.then(undefined, onRejected);\r\n }\r\n },\r\n _a[Symbol.species] = ShimPromise,\r\n _a);\r\n}\r\nexport default ShimPromise;\r\nvar _a;\r\n//# sourceMappingURL=Promise.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/Promise.mjs\n// module id = ./node_modules/@dojo/framework/shim/Promise.mjs\n// module chunks = menu-item","import has from './support/has';\r\nimport global from './global';\r\nimport { getValueDescriptor } from './support/util';\r\nexport let Symbol = global.Symbol;\r\nif (!true) {\r\n /**\r\n * Throws if the value is not a symbol, used internally within the Shim\r\n * @param {any} value The value to check\r\n * @return {symbol} Returns the symbol or throws\r\n */\r\n const validateSymbol = function validateSymbol(value) {\r\n if (!isSymbol(value)) {\r\n throw new TypeError(value + ' is not a symbol');\r\n }\r\n return value;\r\n };\r\n const defineProperties = Object.defineProperties;\r\n const defineProperty = Object.defineProperty;\r\n const create = Object.create;\r\n const objPrototype = Object.prototype;\r\n const globalSymbols = {};\r\n const getSymbolName = (function () {\r\n const created = create(null);\r\n return function (desc) {\r\n let postfix = 0;\r\n let name;\r\n while (created[String(desc) + (postfix || '')]) {\r\n ++postfix;\r\n }\r\n desc += String(postfix || '');\r\n created[desc] = true;\r\n name = '@@' + desc;\r\n // FIXME: Temporary guard until the duplicate execution when testing can be\r\n // pinned down.\r\n if (!Object.getOwnPropertyDescriptor(objPrototype, name)) {\r\n defineProperty(objPrototype, name, {\r\n set: function (value) {\r\n defineProperty(this, name, getValueDescriptor(value));\r\n }\r\n });\r\n }\r\n return name;\r\n };\r\n })();\r\n const InternalSymbol = function Symbol(description) {\r\n if (this instanceof InternalSymbol) {\r\n throw new TypeError('TypeError: Symbol is not a constructor');\r\n }\r\n return Symbol(description);\r\n };\r\n Symbol = global.Symbol = function Symbol(description) {\r\n if (this instanceof Symbol) {\r\n throw new TypeError('TypeError: Symbol is not a constructor');\r\n }\r\n const sym = Object.create(InternalSymbol.prototype);\r\n description = description === undefined ? '' : String(description);\r\n return defineProperties(sym, {\r\n __description__: getValueDescriptor(description),\r\n __name__: getValueDescriptor(getSymbolName(description))\r\n });\r\n };\r\n /* Decorate the Symbol function with the appropriate properties */\r\n defineProperty(Symbol, 'for', getValueDescriptor(function (key) {\r\n if (globalSymbols[key]) {\r\n return globalSymbols[key];\r\n }\r\n return (globalSymbols[key] = Symbol(String(key)));\r\n }));\r\n defineProperties(Symbol, {\r\n keyFor: getValueDescriptor(function (sym) {\r\n let key;\r\n validateSymbol(sym);\r\n for (key in globalSymbols) {\r\n if (globalSymbols[key] === sym) {\r\n return key;\r\n }\r\n }\r\n }),\r\n hasInstance: getValueDescriptor(Symbol.for('hasInstance'), false, false),\r\n isConcatSpreadable: getValueDescriptor(Symbol.for('isConcatSpreadable'), false, false),\r\n iterator: getValueDescriptor(Symbol.for('iterator'), false, false),\r\n match: getValueDescriptor(Symbol.for('match'), false, false),\r\n observable: getValueDescriptor(Symbol.for('observable'), false, false),\r\n replace: getValueDescriptor(Symbol.for('replace'), false, false),\r\n search: getValueDescriptor(Symbol.for('search'), false, false),\r\n species: getValueDescriptor(Symbol.for('species'), false, false),\r\n split: getValueDescriptor(Symbol.for('split'), false, false),\r\n toPrimitive: getValueDescriptor(Symbol.for('toPrimitive'), false, false),\r\n toStringTag: getValueDescriptor(Symbol.for('toStringTag'), false, false),\r\n unscopables: getValueDescriptor(Symbol.for('unscopables'), false, false)\r\n });\r\n /* Decorate the InternalSymbol object */\r\n defineProperties(InternalSymbol.prototype, {\r\n constructor: getValueDescriptor(Symbol),\r\n toString: getValueDescriptor(function () {\r\n return this.__name__;\r\n }, false, false)\r\n });\r\n /* Decorate the Symbol.prototype */\r\n defineProperties(Symbol.prototype, {\r\n toString: getValueDescriptor(function () {\r\n return 'Symbol (' + validateSymbol(this).__description__ + ')';\r\n }),\r\n valueOf: getValueDescriptor(function () {\r\n return validateSymbol(this);\r\n })\r\n });\r\n defineProperty(Symbol.prototype, Symbol.toPrimitive, getValueDescriptor(function () {\r\n return validateSymbol(this);\r\n }));\r\n defineProperty(Symbol.prototype, Symbol.toStringTag, getValueDescriptor('Symbol', false, false, true));\r\n defineProperty(InternalSymbol.prototype, Symbol.toPrimitive, getValueDescriptor(Symbol.prototype[Symbol.toPrimitive], false, false, true));\r\n defineProperty(InternalSymbol.prototype, Symbol.toStringTag, getValueDescriptor(Symbol.prototype[Symbol.toStringTag], false, false, true));\r\n}\r\n/**\r\n * A custom guard function that determines if an object is a symbol or not\r\n * @param {any} value The value to check to see if it is a symbol or not\r\n * @return {is symbol} Returns true if a symbol or not (and narrows the type guard)\r\n */\r\nexport function isSymbol(value) {\r\n return (value && (typeof value === 'symbol' || value['@@toStringTag'] === 'Symbol')) || false;\r\n}\r\n/**\r\n * Fill any missing well known symbols if the native Symbol is missing them\r\n */\r\n[\r\n 'hasInstance',\r\n 'isConcatSpreadable',\r\n 'iterator',\r\n 'species',\r\n 'replace',\r\n 'search',\r\n 'split',\r\n 'match',\r\n 'toPrimitive',\r\n 'toStringTag',\r\n 'unscopables',\r\n 'observable'\r\n].forEach((wellKnown) => {\r\n if (!Symbol[wellKnown]) {\r\n Object.defineProperty(Symbol, wellKnown, getValueDescriptor(Symbol.for(wellKnown), false, false));\r\n }\r\n});\r\nexport default Symbol;\r\n//# sourceMappingURL=Symbol.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/Symbol.mjs\n// module id = ./node_modules/@dojo/framework/shim/Symbol.mjs\n// module chunks = menu-item","import global from './global';\r\nimport { isArrayLike } from './iterator';\r\nimport has from './support/has';\r\nimport './Symbol';\r\nexport let WeakMap = global.WeakMap;\r\nif (!true) {\r\n const DELETED = {};\r\n const getUID = function getUID() {\r\n return Math.floor(Math.random() * 100000000);\r\n };\r\n const generateName = (function () {\r\n let startId = Math.floor(Date.now() % 100000000);\r\n return function generateName() {\r\n return '__wm' + getUID() + (startId++ + '__');\r\n };\r\n })();\r\n WeakMap = class WeakMap {\r\n constructor(iterable) {\r\n this[Symbol.toStringTag] = 'WeakMap';\r\n this._name = generateName();\r\n this._frozenEntries = [];\r\n if (iterable) {\r\n if (isArrayLike(iterable)) {\r\n for (let i = 0; i < iterable.length; i++) {\r\n const item = iterable[i];\r\n this.set(item[0], item[1]);\r\n }\r\n }\r\n else {\r\n for (const [key, value] of iterable) {\r\n this.set(key, value);\r\n }\r\n }\r\n }\r\n }\r\n _getFrozenEntryIndex(key) {\r\n for (let i = 0; i < this._frozenEntries.length; i++) {\r\n if (this._frozenEntries[i].key === key) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n delete(key) {\r\n if (key === undefined || key === null) {\r\n return false;\r\n }\r\n const entry = key[this._name];\r\n if (entry && entry.key === key && entry.value !== DELETED) {\r\n entry.value = DELETED;\r\n return true;\r\n }\r\n const frozenIndex = this._getFrozenEntryIndex(key);\r\n if (frozenIndex >= 0) {\r\n this._frozenEntries.splice(frozenIndex, 1);\r\n return true;\r\n }\r\n return false;\r\n }\r\n get(key) {\r\n if (key === undefined || key === null) {\r\n return undefined;\r\n }\r\n const entry = key[this._name];\r\n if (entry && entry.key === key && entry.value !== DELETED) {\r\n return entry.value;\r\n }\r\n const frozenIndex = this._getFrozenEntryIndex(key);\r\n if (frozenIndex >= 0) {\r\n return this._frozenEntries[frozenIndex].value;\r\n }\r\n }\r\n has(key) {\r\n if (key === undefined || key === null) {\r\n return false;\r\n }\r\n const entry = key[this._name];\r\n if (Boolean(entry && entry.key === key && entry.value !== DELETED)) {\r\n return true;\r\n }\r\n const frozenIndex = this._getFrozenEntryIndex(key);\r\n if (frozenIndex >= 0) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n set(key, value) {\r\n if (!key || (typeof key !== 'object' && typeof key !== 'function')) {\r\n throw new TypeError('Invalid value used as weak map key');\r\n }\r\n let entry = key[this._name];\r\n if (!entry || entry.key !== key) {\r\n entry = Object.create(null, {\r\n key: { value: key }\r\n });\r\n if (Object.isFrozen(key)) {\r\n this._frozenEntries.push(entry);\r\n }\r\n else {\r\n Object.defineProperty(key, this._name, {\r\n value: entry\r\n });\r\n }\r\n }\r\n entry.value = value;\r\n return this;\r\n }\r\n };\r\n}\r\nexport default WeakMap;\r\n//# sourceMappingURL=WeakMap.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/WeakMap.mjs\n// module id = ./node_modules/@dojo/framework/shim/WeakMap.mjs\n// module chunks = menu-item","import global from './global';\r\nimport { isArrayLike, isIterable } from './iterator';\r\nimport { MAX_SAFE_INTEGER } from './number';\r\nimport has from './support/has';\r\nimport { wrapNative } from './support/util';\r\nexport let from;\r\n/**\r\n * Creates a new array from the function parameters.\r\n *\r\n * @param arguments Any number of arguments for the array\r\n * @return An array from the given arguments\r\n */\r\nexport let of;\r\n/* ES6 Array instance methods */\r\n/**\r\n * Copies data internally within an array or array-like object.\r\n *\r\n * @param target The target array-like object\r\n * @param offset The index to start copying values to; if negative, it counts backwards from length\r\n * @param start The first (inclusive) index to copy; if negative, it counts backwards from length\r\n * @param end The last (exclusive) index to copy; if negative, it counts backwards from length\r\n * @return The target\r\n */\r\nexport let copyWithin;\r\n/**\r\n * Fills elements of an array-like object with the specified value.\r\n *\r\n * @param target The target to fill\r\n * @param value The value to fill each element of the target with\r\n * @param start The first index to fill\r\n * @param end The (exclusive) index at which to stop filling\r\n * @return The filled target\r\n */\r\nexport let fill;\r\n/**\r\n * Finds and returns the first instance matching the callback or undefined if one is not found.\r\n *\r\n * @param target An array-like object\r\n * @param callback A function returning if the current value matches a criteria\r\n * @param thisArg The execution context for the find function\r\n * @return The first element matching the callback, or undefined if one does not exist\r\n */\r\nexport let find;\r\n/**\r\n * Performs a linear search and returns the first index whose value satisfies the passed callback,\r\n * or -1 if no values satisfy it.\r\n *\r\n * @param target An array-like object\r\n * @param callback A function returning true if the current value satisfies its criteria\r\n * @param thisArg The execution context for the find function\r\n * @return The first index whose value satisfies the passed callback, or -1 if no values satisfy it\r\n */\r\nexport let findIndex;\r\n/* ES7 Array instance methods */\r\n/**\r\n * Determines whether an array includes a given value\r\n *\r\n * @param target the target array-like object\r\n * @param searchElement the item to search for\r\n * @param fromIndex the starting index to search from\r\n * @return `true` if the array includes the element, otherwise `false`\r\n */\r\nexport let includes;\r\nif (true && true) {\r\n from = global.Array.from;\r\n of = global.Array.of;\r\n copyWithin = wrapNative(global.Array.prototype.copyWithin);\r\n fill = wrapNative(global.Array.prototype.fill);\r\n find = wrapNative(global.Array.prototype.find);\r\n findIndex = wrapNative(global.Array.prototype.findIndex);\r\n}\r\nelse {\r\n // It is only older versions of Safari/iOS that have a bad fill implementation and so aren't in the wild\r\n // To make things easier, if there is a bad fill implementation, the whole set of functions will be filled\r\n /**\r\n * Ensures a non-negative, non-infinite, safe integer.\r\n *\r\n * @param length The number to validate\r\n * @return A proper length\r\n */\r\n const toLength = function toLength(length) {\r\n if (isNaN(length)) {\r\n return 0;\r\n }\r\n length = Number(length);\r\n if (isFinite(length)) {\r\n length = Math.floor(length);\r\n }\r\n // Ensure a non-negative, real, safe integer\r\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\r\n };\r\n /**\r\n * From ES6 7.1.4 ToInteger()\r\n *\r\n * @param value A value to convert\r\n * @return An integer\r\n */\r\n const toInteger = function toInteger(value) {\r\n value = Number(value);\r\n if (isNaN(value)) {\r\n return 0;\r\n }\r\n if (value === 0 || !isFinite(value)) {\r\n return value;\r\n }\r\n return (value > 0 ? 1 : -1) * Math.floor(Math.abs(value));\r\n };\r\n /**\r\n * Normalizes an offset against a given length, wrapping it if negative.\r\n *\r\n * @param value The original offset\r\n * @param length The total length to normalize against\r\n * @return If negative, provide a distance from the end (length); otherwise provide a distance from 0\r\n */\r\n const normalizeOffset = function normalizeOffset(value, length) {\r\n return value < 0 ? Math.max(length + value, 0) : Math.min(value, length);\r\n };\r\n from = function from(arrayLike, mapFunction, thisArg) {\r\n if (arrayLike == null) {\r\n throw new TypeError('from: requires an array-like object');\r\n }\r\n if (mapFunction && thisArg) {\r\n mapFunction = mapFunction.bind(thisArg);\r\n }\r\n /* tslint:disable-next-line:variable-name */\r\n const Constructor = this;\r\n const length = toLength(arrayLike.length);\r\n // Support extension\r\n const array = typeof Constructor === 'function' ? Object(new Constructor(length)) : new Array(length);\r\n if (!isArrayLike(arrayLike) && !isIterable(arrayLike)) {\r\n return array;\r\n }\r\n // if this is an array and the normalized length is 0, just return an empty array. this prevents a problem\r\n // with the iteration on IE when using a NaN array length.\r\n if (isArrayLike(arrayLike)) {\r\n if (length === 0) {\r\n return [];\r\n }\r\n for (let i = 0; i < arrayLike.length; i++) {\r\n array[i] = mapFunction ? mapFunction(arrayLike[i], i) : arrayLike[i];\r\n }\r\n }\r\n else {\r\n let i = 0;\r\n for (const value of arrayLike) {\r\n array[i] = mapFunction ? mapFunction(value, i) : value;\r\n i++;\r\n }\r\n }\r\n if (arrayLike.length !== undefined) {\r\n array.length = length;\r\n }\r\n return array;\r\n };\r\n of = function of(...items) {\r\n return Array.prototype.slice.call(items);\r\n };\r\n copyWithin = function copyWithin(target, offset, start, end) {\r\n if (target == null) {\r\n throw new TypeError('copyWithin: target must be an array-like object');\r\n }\r\n const length = toLength(target.length);\r\n offset = normalizeOffset(toInteger(offset), length);\r\n start = normalizeOffset(toInteger(start), length);\r\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\r\n let count = Math.min(end - start, length - offset);\r\n let direction = 1;\r\n if (offset > start && offset < start + count) {\r\n direction = -1;\r\n start += count - 1;\r\n offset += count - 1;\r\n }\r\n while (count > 0) {\r\n if (start in target) {\r\n target[offset] = target[start];\r\n }\r\n else {\r\n delete target[offset];\r\n }\r\n offset += direction;\r\n start += direction;\r\n count--;\r\n }\r\n return target;\r\n };\r\n fill = function fill(target, value, start, end) {\r\n const length = toLength(target.length);\r\n let i = normalizeOffset(toInteger(start), length);\r\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\r\n while (i < end) {\r\n target[i++] = value;\r\n }\r\n return target;\r\n };\r\n find = function find(target, callback, thisArg) {\r\n const index = findIndex(target, callback, thisArg);\r\n return index !== -1 ? target[index] : undefined;\r\n };\r\n findIndex = function findIndex(target, callback, thisArg) {\r\n const length = toLength(target.length);\r\n if (!callback) {\r\n throw new TypeError('find: second argument must be a function');\r\n }\r\n if (thisArg) {\r\n callback = callback.bind(thisArg);\r\n }\r\n for (let i = 0; i < length; i++) {\r\n if (callback(target[i], i, target)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n };\r\n}\r\nif (true) {\r\n includes = wrapNative(global.Array.prototype.includes);\r\n}\r\nelse {\r\n /**\r\n * Ensures a non-negative, non-infinite, safe integer.\r\n *\r\n * @param length The number to validate\r\n * @return A proper length\r\n */\r\n const toLength = function toLength(length) {\r\n length = Number(length);\r\n if (isNaN(length)) {\r\n return 0;\r\n }\r\n if (isFinite(length)) {\r\n length = Math.floor(length);\r\n }\r\n // Ensure a non-negative, real, safe integer\r\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\r\n };\r\n includes = function includes(target, searchElement, fromIndex = 0) {\r\n let len = toLength(target.length);\r\n for (let i = fromIndex; i < len; ++i) {\r\n const currentElement = target[i];\r\n if (searchElement === currentElement ||\r\n (searchElement !== searchElement && currentElement !== currentElement)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n}\r\n//# sourceMappingURL=array.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/array.mjs\n// module id = ./node_modules/@dojo/framework/shim/array.mjs\n// module chunks = menu-item","const globalObject = (function () {\n if (typeof global !== 'undefined') {\n // global spec defines a reference to the global object called 'global'\n // https://github.com/tc39/proposal-global\n // `global` is also defined in NodeJS\n return global;\n }\n else if (typeof window !== 'undefined') {\n // window is defined in browsers\n return window;\n }\n else if (typeof self !== 'undefined') {\n // self is defined in WebWorkers\n return self;\n }\n})();\nexport default globalObject;\n//# sourceMappingURL=global.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/global.mjs\n// module id = ./node_modules/@dojo/framework/shim/global.mjs\n// module chunks = menu-item","import global from './global';\n/**\n * The smallest interval between two representable numbers.\n */\nexport const EPSILON = 1;\n/**\n * The maximum safe integer in JavaScript\n */\nexport const MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n/**\n * The minimum safe integer in JavaScript\n */\nexport const MIN_SAFE_INTEGER = -MAX_SAFE_INTEGER;\n/**\n * Determines whether the passed value is NaN without coersion.\n *\n * @param value The value to test\n * @return true if the value is NaN, false if it is not\n */\nexport function isNaN(value) {\n return typeof value === 'number' && global.isNaN(value);\n}\n/**\n * Determines whether the passed value is a finite number without coersion.\n *\n * @param value The value to test\n * @return true if the value is finite, false if it is not\n */\nexport function isFinite(value) {\n return typeof value === 'number' && global.isFinite(value);\n}\n/**\n * Determines whether the passed value is an integer.\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isInteger(value) {\n return isFinite(value) && Math.floor(value) === value;\n}\n/**\n * Determines whether the passed value is an integer that is 'safe,' meaning:\n * 1. it can be expressed as an IEEE-754 double precision number\n * 2. it has a one-to-one mapping to a mathematical integer, meaning its\n * IEEE-754 representation cannot be the result of rounding any other\n * integer to fit the IEEE-754 representation\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isSafeInteger(value) {\n return isInteger(value) && Math.abs(value) <= MAX_SAFE_INTEGER;\n}\n//# sourceMappingURL=number.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/number.mjs\n// module id = ./node_modules/@dojo/framework/shim/number.mjs\n// module chunks = menu-item","import global from './global';\r\nimport has from './support/has';\r\nimport { isSymbol } from './Symbol';\r\nexport let assign;\r\n/**\r\n * Gets the own property descriptor of the specified object.\r\n * An own property descriptor is one that is defined directly on the object and is not\r\n * inherited from the object's prototype.\r\n * @param o Object that contains the property.\r\n * @param p Name of the property.\r\n */\r\nexport let getOwnPropertyDescriptor;\r\n/**\r\n * Returns the names of the own properties of an object. The own properties of an object are those that are defined directly\r\n * on that object, and are not inherited from the object's prototype. The properties of an object include both fields (objects) and functions.\r\n * @param o Object that contains the own properties.\r\n */\r\nexport let getOwnPropertyNames;\r\n/**\r\n * Returns an array of all symbol properties found directly on object o.\r\n * @param o Object to retrieve the symbols from.\r\n */\r\nexport let getOwnPropertySymbols;\r\n/**\r\n * Returns true if the values are the same value, false otherwise.\r\n * @param value1 The first value.\r\n * @param value2 The second value.\r\n */\r\nexport let is;\r\n/**\r\n * Returns the names of the enumerable properties and methods of an object.\r\n * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.\r\n */\r\nexport let keys;\r\n/* ES7 Object static methods */\r\nexport let getOwnPropertyDescriptors;\r\nexport let entries;\r\nexport let values;\r\nif (true) {\r\n const globalObject = global.Object;\r\n assign = globalObject.assign;\r\n getOwnPropertyDescriptor = globalObject.getOwnPropertyDescriptor;\r\n getOwnPropertyNames = globalObject.getOwnPropertyNames;\r\n getOwnPropertySymbols = globalObject.getOwnPropertySymbols;\r\n is = globalObject.is;\r\n keys = globalObject.keys;\r\n}\r\nelse {\r\n keys = function symbolAwareKeys(o) {\r\n return Object.keys(o).filter((key) => !Boolean(key.match(/^@@.+/)));\r\n };\r\n assign = function assign(target, ...sources) {\r\n if (target == null) {\r\n // TypeError if undefined or null\r\n throw new TypeError('Cannot convert undefined or null to object');\r\n }\r\n const to = Object(target);\r\n sources.forEach((nextSource) => {\r\n if (nextSource) {\r\n // Skip over if undefined or null\r\n keys(nextSource).forEach((nextKey) => {\r\n to[nextKey] = nextSource[nextKey];\r\n });\r\n }\r\n });\r\n return to;\r\n };\r\n getOwnPropertyDescriptor = function getOwnPropertyDescriptor(o, prop) {\r\n if (isSymbol(prop)) {\r\n return Object.getOwnPropertyDescriptor(o, prop);\r\n }\r\n else {\r\n return Object.getOwnPropertyDescriptor(o, prop);\r\n }\r\n };\r\n getOwnPropertyNames = function getOwnPropertyNames(o) {\r\n return Object.getOwnPropertyNames(o).filter((key) => !Boolean(key.match(/^@@.+/)));\r\n };\r\n getOwnPropertySymbols = function getOwnPropertySymbols(o) {\r\n return Object.getOwnPropertyNames(o)\r\n .filter((key) => Boolean(key.match(/^@@.+/)))\r\n .map((key) => Symbol.for(key.substring(2)));\r\n };\r\n is = function is(value1, value2) {\r\n if (value1 === value2) {\r\n return value1 !== 0 || 1 / value1 === 1 / value2; // -0\r\n }\r\n return value1 !== value1 && value2 !== value2; // NaN\r\n };\r\n}\r\nif (true) {\r\n const globalObject = global.Object;\r\n getOwnPropertyDescriptors = globalObject.getOwnPropertyDescriptors;\r\n entries = globalObject.entries;\r\n values = globalObject.values;\r\n}\r\nelse {\r\n getOwnPropertyDescriptors = function getOwnPropertyDescriptors(o) {\r\n return getOwnPropertyNames(o).reduce((previous, key) => {\r\n previous[key] = getOwnPropertyDescriptor(o, key);\r\n return previous;\r\n }, {});\r\n };\r\n entries = function entries(o) {\r\n return keys(o).map((key) => [key, o[key]]);\r\n };\r\n values = function values(o) {\r\n return keys(o).map((key) => o[key]);\r\n };\r\n}\r\n//# sourceMappingURL=object.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/object.mjs\n// module id = ./node_modules/@dojo/framework/shim/object.mjs\n// module chunks = menu-item","import global from './global';\r\nimport has from './support/has';\r\nimport { wrapNative } from './support/util';\r\n/**\r\n * The minimum location of high surrogates\r\n */\r\nexport const HIGH_SURROGATE_MIN = 0xd800;\r\n/**\r\n * The maximum location of high surrogates\r\n */\r\nexport const HIGH_SURROGATE_MAX = 0xdbff;\r\n/**\r\n * The minimum location of low surrogates\r\n */\r\nexport const LOW_SURROGATE_MIN = 0xdc00;\r\n/**\r\n * The maximum location of low surrogates\r\n */\r\nexport const LOW_SURROGATE_MAX = 0xdfff;\r\n/* ES6 static methods */\r\n/**\r\n * Return the String value whose elements are, in order, the elements in the List elements.\r\n * If length is 0, the empty string is returned.\r\n * @param codePoints The code points to generate the string\r\n */\r\nexport let fromCodePoint;\r\n/**\r\n * `raw` is intended for use as a tag function of a Tagged Template String. When called\r\n * as such the first argument will be a well formed template call site object and the rest\r\n * parameter will contain the substitution values.\r\n * @param template A well-formed template string call site representation.\r\n * @param substitutions A set of substitution values.\r\n */\r\nexport let raw;\r\n/* ES6 instance methods */\r\n/**\r\n * Returns a nonnegative integer Number less than 1114112 (0x110000) that is the code point\r\n * value of the UTF-16 encoded code point starting at the string element at position pos in\r\n * the String resulting from converting this object to a String.\r\n * If there is no element at that position, the result is undefined.\r\n * If a valid UTF-16 surrogate pair does not begin at pos, the result is the code unit at pos.\r\n */\r\nexport let codePointAt;\r\n/**\r\n * Returns true if the sequence of elements of searchString converted to a String is the\r\n * same as the corresponding elements of this object (converted to a String) starting at\r\n * endPosition – length(this). Otherwise returns false.\r\n */\r\nexport let endsWith;\r\n/**\r\n * Returns true if searchString appears as a substring of the result of converting this\r\n * object to a String, at one or more positions that are\r\n * greater than or equal to position; otherwise, returns false.\r\n * @param target The target string\r\n * @param searchString search string\r\n * @param position If position is undefined, 0 is assumed, so as to search all of the String.\r\n */\r\nexport let includes;\r\n/**\r\n * Returns the String value result of normalizing the string into the normalization form\r\n * named by form as specified in Unicode Standard Annex #15, Unicode Normalization Forms.\r\n * @param target The target string\r\n * @param form Applicable values: \"NFC\", \"NFD\", \"NFKC\", or \"NFKD\", If not specified default\r\n * is \"NFC\"\r\n */\r\nexport let normalize;\r\n/**\r\n * Returns a String value that is made from count copies appended together. If count is 0,\r\n * T is the empty String is returned.\r\n * @param count number of copies to append\r\n */\r\nexport let repeat;\r\n/**\r\n * Returns true if the sequence of elements of searchString converted to a String is the\r\n * same as the corresponding elements of this object (converted to a String) starting at\r\n * position. Otherwise returns false.\r\n */\r\nexport let startsWith;\r\n/* ES7 instance methods */\r\n/**\r\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\r\n * The padding is applied from the end (right) of the current string.\r\n *\r\n * @param target The target string\r\n * @param maxLength The length of the resulting string once the current string has been padded.\r\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\r\n *\r\n * @param fillString The string to pad the current string with.\r\n * If this string is too long, it will be truncated and the left-most part will be applied.\r\n * The default value for this parameter is \" \" (U+0020).\r\n */\r\nexport let padEnd;\r\n/**\r\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\r\n * The padding is applied from the start (left) of the current string.\r\n *\r\n * @param target The target string\r\n * @param maxLength The length of the resulting string once the current string has been padded.\r\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\r\n *\r\n * @param fillString The string to pad the current string with.\r\n * If this string is too long, it will be truncated and the left-most part will be applied.\r\n * The default value for this parameter is \" \" (U+0020).\r\n */\r\nexport let padStart;\r\nif (true && true) {\r\n fromCodePoint = global.String.fromCodePoint;\r\n raw = global.String.raw;\r\n codePointAt = wrapNative(global.String.prototype.codePointAt);\r\n endsWith = wrapNative(global.String.prototype.endsWith);\r\n includes = wrapNative(global.String.prototype.includes);\r\n normalize = wrapNative(global.String.prototype.normalize);\r\n repeat = wrapNative(global.String.prototype.repeat);\r\n startsWith = wrapNative(global.String.prototype.startsWith);\r\n}\r\nelse {\r\n /**\r\n * Validates that text is defined, and normalizes position (based on the given default if the input is NaN).\r\n * Used by startsWith, includes, and endsWith.\r\n *\r\n * @return Normalized position.\r\n */\r\n const normalizeSubstringArgs = function (name, text, search, position, isEnd = false) {\r\n if (text == null) {\r\n throw new TypeError('string.' + name + ' requires a valid string to search against.');\r\n }\r\n const length = text.length;\r\n position = position !== position ? (isEnd ? length : 0) : position;\r\n return [text, String(search), Math.min(Math.max(position, 0), length)];\r\n };\r\n fromCodePoint = function fromCodePoint(...codePoints) {\r\n // Adapted from https://github.com/mathiasbynens/String.fromCodePoint\r\n const length = arguments.length;\r\n if (!length) {\r\n return '';\r\n }\r\n const fromCharCode = String.fromCharCode;\r\n const MAX_SIZE = 0x4000;\r\n let codeUnits = [];\r\n let index = -1;\r\n let result = '';\r\n while (++index < length) {\r\n let codePoint = Number(arguments[index]);\r\n // Code points must be finite integers within the valid range\r\n let isValid = isFinite(codePoint) && Math.floor(codePoint) === codePoint && codePoint >= 0 && codePoint <= 0x10ffff;\r\n if (!isValid) {\r\n throw RangeError('string.fromCodePoint: Invalid code point ' + codePoint);\r\n }\r\n if (codePoint <= 0xffff) {\r\n // BMP code point\r\n codeUnits.push(codePoint);\r\n }\r\n else {\r\n // Astral code point; split in surrogate halves\r\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\r\n codePoint -= 0x10000;\r\n let highSurrogate = (codePoint >> 10) + HIGH_SURROGATE_MIN;\r\n let lowSurrogate = codePoint % 0x400 + LOW_SURROGATE_MIN;\r\n codeUnits.push(highSurrogate, lowSurrogate);\r\n }\r\n if (index + 1 === length || codeUnits.length > MAX_SIZE) {\r\n result += fromCharCode.apply(null, codeUnits);\r\n codeUnits.length = 0;\r\n }\r\n }\r\n return result;\r\n };\r\n raw = function raw(callSite, ...substitutions) {\r\n let rawStrings = callSite.raw;\r\n let result = '';\r\n let numSubstitutions = substitutions.length;\r\n if (callSite == null || callSite.raw == null) {\r\n throw new TypeError('string.raw requires a valid callSite object with a raw value');\r\n }\r\n for (let i = 0, length = rawStrings.length; i < length; i++) {\r\n result += rawStrings[i] + (i < numSubstitutions && i < length - 1 ? substitutions[i] : '');\r\n }\r\n return result;\r\n };\r\n codePointAt = function codePointAt(text, position = 0) {\r\n // Adapted from https://github.com/mathiasbynens/String.prototype.codePointAt\r\n if (text == null) {\r\n throw new TypeError('string.codePointAt requries a valid string.');\r\n }\r\n const length = text.length;\r\n if (position !== position) {\r\n position = 0;\r\n }\r\n if (position < 0 || position >= length) {\r\n return undefined;\r\n }\r\n // Get the first code unit\r\n const first = text.charCodeAt(position);\r\n if (first >= HIGH_SURROGATE_MIN && first <= HIGH_SURROGATE_MAX && length > position + 1) {\r\n // Start of a surrogate pair (high surrogate and there is a next code unit); check for low surrogate\r\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\r\n const second = text.charCodeAt(position + 1);\r\n if (second >= LOW_SURROGATE_MIN && second <= LOW_SURROGATE_MAX) {\r\n return (first - HIGH_SURROGATE_MIN) * 0x400 + second - LOW_SURROGATE_MIN + 0x10000;\r\n }\r\n }\r\n return first;\r\n };\r\n endsWith = function endsWith(text, search, endPosition) {\r\n if (endPosition == null) {\r\n endPosition = text.length;\r\n }\r\n [text, search, endPosition] = normalizeSubstringArgs('endsWith', text, search, endPosition, true);\r\n const start = endPosition - search.length;\r\n if (start < 0) {\r\n return false;\r\n }\r\n return text.slice(start, endPosition) === search;\r\n };\r\n includes = function includes(text, search, position = 0) {\r\n [text, search, position] = normalizeSubstringArgs('includes', text, search, position);\r\n return text.indexOf(search, position) !== -1;\r\n };\r\n repeat = function repeat(text, count = 0) {\r\n // Adapted from https://github.com/mathiasbynens/String.prototype.repeat\r\n if (text == null) {\r\n throw new TypeError('string.repeat requires a valid string.');\r\n }\r\n if (count !== count) {\r\n count = 0;\r\n }\r\n if (count < 0 || count === Infinity) {\r\n throw new RangeError('string.repeat requires a non-negative finite count.');\r\n }\r\n let result = '';\r\n while (count) {\r\n if (count % 2) {\r\n result += text;\r\n }\r\n if (count > 1) {\r\n text += text;\r\n }\r\n count >>= 1;\r\n }\r\n return result;\r\n };\r\n startsWith = function startsWith(text, search, position = 0) {\r\n search = String(search);\r\n [text, search, position] = normalizeSubstringArgs('startsWith', text, search, position);\r\n const end = position + search.length;\r\n if (end > text.length) {\r\n return false;\r\n }\r\n return text.slice(position, end) === search;\r\n };\r\n}\r\nif (true) {\r\n padEnd = wrapNative(global.String.prototype.padEnd);\r\n padStart = wrapNative(global.String.prototype.padStart);\r\n}\r\nelse {\r\n padEnd = function padEnd(text, maxLength, fillString = ' ') {\r\n if (text === null || text === undefined) {\r\n throw new TypeError('string.repeat requires a valid string.');\r\n }\r\n if (maxLength === Infinity) {\r\n throw new RangeError('string.padEnd requires a non-negative finite count.');\r\n }\r\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\r\n maxLength = 0;\r\n }\r\n let strText = String(text);\r\n const padding = maxLength - strText.length;\r\n if (padding > 0) {\r\n strText +=\r\n repeat(fillString, Math.floor(padding / fillString.length)) +\r\n fillString.slice(0, padding % fillString.length);\r\n }\r\n return strText;\r\n };\r\n padStart = function padStart(text, maxLength, fillString = ' ') {\r\n if (text === null || text === undefined) {\r\n throw new TypeError('string.repeat requires a valid string.');\r\n }\r\n if (maxLength === Infinity) {\r\n throw new RangeError('string.padStart requires a non-negative finite count.');\r\n }\r\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\r\n maxLength = 0;\r\n }\r\n let strText = String(text);\r\n const padding = maxLength - strText.length;\r\n if (padding > 0) {\r\n strText =\r\n repeat(fillString, Math.floor(padding / fillString.length)) +\r\n fillString.slice(0, padding % fillString.length) +\r\n strText;\r\n }\r\n return strText;\r\n };\r\n}\r\n//# sourceMappingURL=string.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/string.mjs\n// module id = ./node_modules/@dojo/framework/shim/string.mjs\n// module chunks = menu-item","import has, { add } from '../../has/has';\r\nimport global from '../global';\r\nexport default has;\r\nexport * from '../../has/has';\r\n/* ECMAScript 6 and 7 Features */\r\n/* Array */\r\nadd('es6-array', () => {\r\n return (['from', 'of'].every((key) => key in global.Array) &&\r\n ['findIndex', 'find', 'copyWithin'].every((key) => key in global.Array.prototype));\r\n}, true);\r\nadd('es6-array-fill', () => {\r\n if ('fill' in global.Array.prototype) {\r\n /* Some versions of Safari do not properly implement this */\r\n return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1;\r\n }\r\n return false;\r\n}, true);\r\nadd('es7-array', () => 'includes' in global.Array.prototype, true);\r\n/* Map */\r\nadd('es6-map', () => {\r\n if (typeof global.Map === 'function') {\r\n /*\r\n IE11 and older versions of Safari are missing critical ES6 Map functionality\r\n We wrap this in a try/catch because sometimes the Map constructor exists, but does not\r\n take arguments (iOS 8.4)\r\n */\r\n try {\r\n const map = new global.Map([[0, 1]]);\r\n return map.has(0) &&\r\n typeof map.keys === 'function' &&\r\n true &&\r\n typeof map.values === 'function' &&\r\n typeof map.entries === 'function';\r\n }\r\n catch (e) {\r\n /* istanbul ignore next: not testing on iOS at the moment */\r\n return false;\r\n }\r\n }\r\n return false;\r\n}, true);\r\n/* Math */\r\nadd('es6-math', () => {\r\n return [\r\n 'clz32',\r\n 'sign',\r\n 'log10',\r\n 'log2',\r\n 'log1p',\r\n 'expm1',\r\n 'cosh',\r\n 'sinh',\r\n 'tanh',\r\n 'acosh',\r\n 'asinh',\r\n 'atanh',\r\n 'trunc',\r\n 'fround',\r\n 'cbrt',\r\n 'hypot'\r\n ].every((name) => typeof global.Math[name] === 'function');\r\n}, true);\r\nadd('es6-math-imul', () => {\r\n if ('imul' in global.Math) {\r\n /* Some versions of Safari on ios do not properly implement this */\r\n return Math.imul(0xffffffff, 5) === -5;\r\n }\r\n return false;\r\n}, true);\r\n/* Object */\r\nadd('es6-object', () => {\r\n return true &&\r\n ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof global.Object[name] === 'function');\r\n}, true);\r\nadd('es2017-object', () => {\r\n return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof global.Object[name] === 'function');\r\n}, true);\r\n/* Observable */\r\nadd('es-observable', () => typeof global.Observable !== 'undefined', true);\r\n/* Promise */\r\nadd('es6-promise', () => typeof global.Promise !== 'undefined' && true, true);\r\n/* Set */\r\nadd('es6-set', () => {\r\n if (typeof global.Set === 'function') {\r\n /* IE11 and older versions of Safari are missing critical ES6 Set functionality */\r\n const set = new global.Set([1]);\r\n return set.has(1) && 'keys' in set && typeof set.keys === 'function' && true;\r\n }\r\n return false;\r\n}, true);\r\n/* String */\r\nadd('es6-string', () => {\r\n return ([\r\n /* static methods */\r\n 'fromCodePoint'\r\n ].every((key) => typeof global.String[key] === 'function') &&\r\n [\r\n /* instance methods */\r\n 'codePointAt',\r\n 'normalize',\r\n 'repeat',\r\n 'startsWith',\r\n 'endsWith',\r\n 'includes'\r\n ].every((key) => typeof global.String.prototype[key] === 'function'));\r\n}, true);\r\nadd('es6-string-raw', () => {\r\n function getCallSite(callSite, ...substitutions) {\r\n const result = [...callSite];\r\n result.raw = callSite.raw;\r\n return result;\r\n }\r\n if ('raw' in global.String) {\r\n let b = 1;\r\n let callSite = getCallSite `a\\n${b}`;\r\n callSite.raw = ['a\\\\n'];\r\n const supportsTrunc = global.String.raw(callSite, 42) === 'a:\\\\n';\r\n return supportsTrunc;\r\n }\r\n return false;\r\n}, true);\r\nadd('es2017-string', () => {\r\n return ['padStart', 'padEnd'].every((key) => typeof global.String.prototype[key] === 'function');\r\n}, true);\r\n/* Symbol */\r\nadd('es6-symbol', () => typeof global.Symbol !== 'undefined' && typeof Symbol() === 'symbol', true);\r\n/* WeakMap */\r\nadd('es6-weakmap', () => {\r\n if (typeof global.WeakMap !== 'undefined') {\r\n /* IE11 and older versions of Safari are missing critical ES6 Map functionality */\r\n const key1 = {};\r\n const key2 = {};\r\n const map = new global.WeakMap([[key1, 1]]);\r\n Object.freeze(key1);\r\n return map.get(key1) === 1 && map.set(key2, 2) === map && true;\r\n }\r\n return false;\r\n}, true);\r\n/* Miscellaneous features */\r\nadd('microtasks', () => true || false || true, true);\r\nadd('postmessage', () => {\r\n // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have\r\n // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist.\r\n return typeof global.window !== 'undefined' && typeof global.postMessage === 'function';\r\n}, true);\r\nadd('raf', () => typeof global.requestAnimationFrame === 'function', true);\r\nadd('setimmediate', () => typeof global.setImmediate !== 'undefined', true);\r\n/* DOM Features */\r\nadd('dom-mutationobserver', () => {\r\n if (true && Boolean(global.MutationObserver || global.WebKitMutationObserver)) {\r\n // IE11 has an unreliable MutationObserver implementation where setProperty() does not\r\n // generate a mutation event, observers can crash, and the queue does not drain\r\n // reliably. The following feature test was adapted from\r\n // https://gist.github.com/t10ko/4aceb8c71681fdb275e33efe5e576b14\r\n const example = document.createElement('div');\r\n /* tslint:disable-next-line:variable-name */\r\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\r\n const observer = new HostMutationObserver(function () { });\r\n observer.observe(example, { attributes: true });\r\n example.style.setProperty('display', 'block');\r\n return Boolean(observer.takeRecords().length);\r\n }\r\n return false;\r\n}, true);\r\nadd('dom-webanimation', () => true && global.Animation !== undefined && global.KeyframeEffect !== undefined, true);\r\n//# sourceMappingURL=has.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/support/has.mjs\n// module id = ./node_modules/@dojo/framework/shim/support/has.mjs\n// module chunks = menu-item","import global from '../global';\r\nimport has from './has';\r\nfunction executeTask(item) {\r\n if (item && item.isActive && item.callback) {\r\n item.callback();\r\n }\r\n}\r\nfunction getQueueHandle(item, destructor) {\r\n return {\r\n destroy: function () {\r\n this.destroy = function () { };\r\n item.isActive = false;\r\n item.callback = null;\r\n if (destructor) {\r\n destructor();\r\n }\r\n }\r\n };\r\n}\r\nlet checkMicroTaskQueue;\r\nlet microTasks;\r\n/**\r\n * Schedules a callback to the macrotask queue.\r\n *\r\n * @param callback the function to be queued and later executed.\r\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\r\n */\r\nexport const queueTask = (function () {\r\n let destructor;\r\n let enqueue;\r\n // Since the IE implementation of `setImmediate` is not flawless, we will test for `postMessage` first.\r\n if (true) {\r\n const queue = [];\r\n global.addEventListener('message', function (event) {\r\n // Confirm that the event was triggered by the current window and by this particular implementation.\r\n if (event.source === global && event.data === 'dojo-queue-message') {\r\n event.stopPropagation();\r\n if (queue.length) {\r\n executeTask(queue.shift());\r\n }\r\n }\r\n });\r\n enqueue = function (item) {\r\n queue.push(item);\r\n global.postMessage('dojo-queue-message', '*');\r\n };\r\n }\r\n else if (false) {\r\n destructor = global.clearImmediate;\r\n enqueue = function (item) {\r\n return setImmediate(executeTask.bind(null, item));\r\n };\r\n }\r\n else {\r\n destructor = global.clearTimeout;\r\n enqueue = function (item) {\r\n return setTimeout(executeTask.bind(null, item), 0);\r\n };\r\n }\r\n function queueTask(callback) {\r\n const item = {\r\n isActive: true,\r\n callback: callback\r\n };\r\n const id = enqueue(item);\r\n return getQueueHandle(item, destructor &&\r\n function () {\r\n destructor(id);\r\n });\r\n }\r\n // TODO: Use aspect.before when it is available.\r\n return true\r\n ? queueTask\r\n : function (callback) {\r\n checkMicroTaskQueue();\r\n return queueTask(callback);\r\n };\r\n})();\r\n// When no mechanism for registering microtasks is exposed by the environment, microtasks will\r\n// be queued and then executed in a single macrotask before the other macrotasks are executed.\r\nif (!true) {\r\n let isMicroTaskQueued = false;\r\n microTasks = [];\r\n checkMicroTaskQueue = function () {\r\n if (!isMicroTaskQueued) {\r\n isMicroTaskQueued = true;\r\n queueTask(function () {\r\n isMicroTaskQueued = false;\r\n if (microTasks.length) {\r\n let item;\r\n while ((item = microTasks.shift())) {\r\n executeTask(item);\r\n }\r\n }\r\n });\r\n }\r\n };\r\n}\r\n/**\r\n * Schedules an animation task with `window.requestAnimationFrame` if it exists, or with `queueTask` otherwise.\r\n *\r\n * Since requestAnimationFrame's behavior does not match that expected from `queueTask`, it is not used there.\r\n * However, at times it makes more sense to delegate to requestAnimationFrame; hence the following method.\r\n *\r\n * @param callback the function to be queued and later executed.\r\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\r\n */\r\nexport const queueAnimationTask = (function () {\r\n if (!true) {\r\n return queueTask;\r\n }\r\n function queueAnimationTask(callback) {\r\n const item = {\r\n isActive: true,\r\n callback: callback\r\n };\r\n const rafId = requestAnimationFrame(executeTask.bind(null, item));\r\n return getQueueHandle(item, function () {\r\n cancelAnimationFrame(rafId);\r\n });\r\n }\r\n // TODO: Use aspect.before when it is available.\r\n return true\r\n ? queueAnimationTask\r\n : function (callback) {\r\n checkMicroTaskQueue();\r\n return queueAnimationTask(callback);\r\n };\r\n})();\r\n/**\r\n * Schedules a callback to the microtask queue.\r\n *\r\n * Any callbacks registered with `queueMicroTask` will be executed before the next macrotask. If no native\r\n * mechanism for scheduling macrotasks is exposed, then any callbacks will be fired before any macrotask\r\n * registered with `queueTask` or `queueAnimationTask`.\r\n *\r\n * @param callback the function to be queued and later executed.\r\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\r\n */\r\nexport let queueMicroTask = (function () {\r\n let enqueue;\r\n if (false) {\r\n enqueue = function (item) {\r\n global.process.nextTick(executeTask.bind(null, item));\r\n };\r\n }\r\n else if (true) {\r\n enqueue = function (item) {\r\n global.Promise.resolve(item).then(executeTask);\r\n };\r\n }\r\n else if (true) {\r\n /* tslint:disable-next-line:variable-name */\r\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\r\n const node = document.createElement('div');\r\n const queue = [];\r\n const observer = new HostMutationObserver(function () {\r\n while (queue.length > 0) {\r\n const item = queue.shift();\r\n if (item && item.isActive && item.callback) {\r\n item.callback();\r\n }\r\n }\r\n });\r\n observer.observe(node, { attributes: true });\r\n enqueue = function (item) {\r\n queue.push(item);\r\n node.setAttribute('queueStatus', '1');\r\n };\r\n }\r\n else {\r\n enqueue = function (item) {\r\n checkMicroTaskQueue();\r\n microTasks.push(item);\r\n };\r\n }\r\n return function (callback) {\r\n const item = {\r\n isActive: true,\r\n callback: callback\r\n };\r\n enqueue(item);\r\n return getQueueHandle(item);\r\n };\r\n})();\r\n//# sourceMappingURL=queue.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/support/queue.mjs\n// module id = ./node_modules/@dojo/framework/shim/support/queue.mjs\n// module chunks = menu-item","/**\n * Helper function to generate a value property descriptor\n *\n * @param value The value the property descriptor should be set to\n * @param enumerable If the property should be enumberable, defaults to false\n * @param writable If the property should be writable, defaults to true\n * @param configurable If the property should be configurable, defaults to true\n * @return The property descriptor object\n */\nexport function getValueDescriptor(value, enumerable = false, writable = true, configurable = true) {\n return {\n value: value,\n enumerable: enumerable,\n writable: writable,\n configurable: configurable\n };\n}\nexport function wrapNative(nativeFunction) {\n return function (target, ...args) {\n return nativeFunction.apply(target, args);\n };\n}\n//# sourceMappingURL=util.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/support/util.mjs\n// module id = ./node_modules/@dojo/framework/shim/support/util.mjs\n// module chunks = menu-item","import { Evented } from '../core/Evented';\nexport class Injector extends Evented {\n constructor(payload) {\n super();\n this._payload = payload;\n }\n setInvalidator(invalidator) {\n this._invalidator = invalidator;\n }\n get() {\n return this._payload;\n }\n set(payload) {\n this._payload = payload;\n if (this._invalidator) {\n this._invalidator();\n }\n }\n}\nexport default Injector;\n//# sourceMappingURL=Injector.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/Injector.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/Injector.mjs\n// module chunks = menu-item","import { Evented } from '../core/Evented';\r\nimport Map from '../shim/Map';\r\n/**\r\n * Enum to identify the type of event.\r\n * Listening to 'Projector' will notify when projector is created or updated\r\n * Listening to 'Widget' will notify when widget root is created or updated\r\n */\r\nexport var NodeEventType;\r\n(function (NodeEventType) {\r\n NodeEventType[\"Projector\"] = \"Projector\";\r\n NodeEventType[\"Widget\"] = \"Widget\";\r\n})(NodeEventType || (NodeEventType = {}));\r\nexport class NodeHandler extends Evented {\r\n constructor() {\r\n super(...arguments);\r\n this._nodeMap = new Map();\r\n }\r\n get(key) {\r\n return this._nodeMap.get(key);\r\n }\r\n has(key) {\r\n return this._nodeMap.has(key);\r\n }\r\n add(element, key) {\r\n this._nodeMap.set(key, element);\r\n this.emit({ type: key });\r\n }\r\n addRoot() {\r\n this.emit({ type: NodeEventType.Widget });\r\n }\r\n addProjector() {\r\n this.emit({ type: NodeEventType.Projector });\r\n }\r\n clear() {\r\n this._nodeMap.clear();\r\n }\r\n}\r\nexport default NodeHandler;\r\n//# sourceMappingURL=NodeHandler.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/NodeHandler.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/NodeHandler.mjs\n// module chunks = menu-item","import Promise from '../shim/Promise';\r\nimport Map from '../shim/Map';\r\nimport Symbol from '../shim/Symbol';\r\nimport { Evented } from '../core/Evented';\r\n/**\r\n * Widget base symbol type\r\n */\r\nexport const WIDGET_BASE_TYPE = Symbol('Widget Base');\r\n/**\r\n * Checks is the item is a subclass of WidgetBase (or a WidgetBase)\r\n *\r\n * @param item the item to check\r\n * @returns true/false indicating if the item is a WidgetBaseConstructor\r\n */\r\nexport function isWidgetBaseConstructor(item) {\r\n return Boolean(item && item._type === WIDGET_BASE_TYPE);\r\n}\r\nexport function isWidgetConstructorDefaultExport(item) {\r\n return Boolean(item &&\r\n item.hasOwnProperty('__esModule') &&\r\n item.hasOwnProperty('default') &&\r\n isWidgetBaseConstructor(item.default));\r\n}\r\n/**\r\n * The Registry implementation\r\n */\r\nexport class Registry extends Evented {\r\n /**\r\n * Emit loaded event for registry label\r\n */\r\n emitLoadedEvent(widgetLabel, item) {\r\n this.emit({\r\n type: widgetLabel,\r\n action: 'loaded',\r\n item\r\n });\r\n }\r\n define(label, item) {\r\n if (this._widgetRegistry === undefined) {\r\n this._widgetRegistry = new Map();\r\n }\r\n if (this._widgetRegistry.has(label)) {\r\n throw new Error(`widget has already been registered for '${label.toString()}'`);\r\n }\r\n this._widgetRegistry.set(label, item);\r\n if (item instanceof Promise) {\r\n item.then((widgetCtor) => {\r\n this._widgetRegistry.set(label, widgetCtor);\r\n this.emitLoadedEvent(label, widgetCtor);\r\n return widgetCtor;\r\n }, (error) => {\r\n throw error;\r\n });\r\n }\r\n else if (isWidgetBaseConstructor(item)) {\r\n this.emitLoadedEvent(label, item);\r\n }\r\n }\r\n defineInjector(label, injectorFactory) {\r\n if (this._injectorRegistry === undefined) {\r\n this._injectorRegistry = new Map();\r\n }\r\n if (this._injectorRegistry.has(label)) {\r\n throw new Error(`injector has already been registered for '${label.toString()}'`);\r\n }\r\n const invalidator = new Evented();\r\n const injectorItem = {\r\n injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })),\r\n invalidator\r\n };\r\n this._injectorRegistry.set(label, injectorItem);\r\n this.emitLoadedEvent(label, injectorItem);\r\n }\r\n get(label) {\r\n if (!this._widgetRegistry || !this.has(label)) {\r\n return null;\r\n }\r\n const item = this._widgetRegistry.get(label);\r\n if (isWidgetBaseConstructor(item)) {\r\n return item;\r\n }\r\n if (item instanceof Promise) {\r\n return null;\r\n }\r\n const promise = item();\r\n this._widgetRegistry.set(label, promise);\r\n promise.then((widgetCtor) => {\r\n if (isWidgetConstructorDefaultExport(widgetCtor)) {\r\n widgetCtor = widgetCtor.default;\r\n }\r\n this._widgetRegistry.set(label, widgetCtor);\r\n this.emitLoadedEvent(label, widgetCtor);\r\n return widgetCtor;\r\n }, (error) => {\r\n throw error;\r\n });\r\n return null;\r\n }\r\n getInjector(label) {\r\n if (!this._injectorRegistry || !this.hasInjector(label)) {\r\n return null;\r\n }\r\n return this._injectorRegistry.get(label);\r\n }\r\n has(label) {\r\n return Boolean(this._widgetRegistry && this._widgetRegistry.has(label));\r\n }\r\n hasInjector(label) {\r\n return Boolean(this._injectorRegistry && this._injectorRegistry.has(label));\r\n }\r\n}\r\nexport default Registry;\r\n//# sourceMappingURL=Registry.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/Registry.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/Registry.mjs\n// module chunks = menu-item","import { Map } from '../shim/Map';\r\nimport { Evented } from '../core/Evented';\r\nimport { Registry } from './Registry';\r\nexport class RegistryHandler extends Evented {\r\n constructor() {\r\n super();\r\n this._registry = new Registry();\r\n this._registryWidgetLabelMap = new Map();\r\n this._registryInjectorLabelMap = new Map();\r\n this.own(this._registry);\r\n const destroy = () => {\r\n if (this.baseRegistry) {\r\n this._registryWidgetLabelMap.delete(this.baseRegistry);\r\n this._registryInjectorLabelMap.delete(this.baseRegistry);\r\n this.baseRegistry = undefined;\r\n }\r\n };\r\n this.own({ destroy });\r\n }\r\n set base(baseRegistry) {\r\n if (this.baseRegistry) {\r\n this._registryWidgetLabelMap.delete(this.baseRegistry);\r\n this._registryInjectorLabelMap.delete(this.baseRegistry);\r\n }\r\n this.baseRegistry = baseRegistry;\r\n }\r\n define(label, widget) {\r\n this._registry.define(label, widget);\r\n }\r\n defineInjector(label, injector) {\r\n this._registry.defineInjector(label, injector);\r\n }\r\n has(label) {\r\n return this._registry.has(label) || Boolean(this.baseRegistry && this.baseRegistry.has(label));\r\n }\r\n hasInjector(label) {\r\n return this._registry.hasInjector(label) || Boolean(this.baseRegistry && this.baseRegistry.hasInjector(label));\r\n }\r\n get(label, globalPrecedence = false) {\r\n return this._get(label, globalPrecedence, 'get', this._registryWidgetLabelMap);\r\n }\r\n getInjector(label, globalPrecedence = false) {\r\n return this._get(label, globalPrecedence, 'getInjector', this._registryInjectorLabelMap);\r\n }\r\n _get(label, globalPrecedence, getFunctionName, labelMap) {\r\n const registries = globalPrecedence ? [this.baseRegistry, this._registry] : [this._registry, this.baseRegistry];\r\n for (let i = 0; i < registries.length; i++) {\r\n const registry = registries[i];\r\n if (!registry) {\r\n continue;\r\n }\r\n const item = registry[getFunctionName](label);\r\n const registeredLabels = labelMap.get(registry) || [];\r\n if (item) {\r\n return item;\r\n }\r\n else if (registeredLabels.indexOf(label) === -1) {\r\n const handle = registry.on(label, (event) => {\r\n if (event.action === 'loaded' &&\r\n this[getFunctionName](label, globalPrecedence) === event.item) {\r\n this.emit({ type: 'invalidate' });\r\n }\r\n });\r\n this.own(handle);\r\n labelMap.set(registry, [...registeredLabels, label]);\r\n }\r\n }\r\n return null;\r\n }\r\n}\r\nexport default RegistryHandler;\r\n//# sourceMappingURL=RegistryHandler.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs\n// module chunks = menu-item","import Map from '../shim/Map';\nimport WeakMap from '../shim/WeakMap';\nimport Symbol from '../shim/Symbol';\nimport { v } from './d';\nimport { auto } from './diff';\nimport RegistryHandler from './RegistryHandler';\nimport NodeHandler from './NodeHandler';\nimport { widgetInstanceMap } from './vdom';\nimport { isWidgetBaseConstructor, WIDGET_BASE_TYPE } from './Registry';\nconst decoratorMap = new Map();\nconst boundAuto = auto.bind(null);\nexport const noBind = Symbol.for('dojoNoBind');\n/**\n * Main widget base for all widgets to extend\n */\nexport class WidgetBase {\n /**\n * @constructor\n */\n constructor() {\n /**\n * Indicates if it is the initial set properties cycle\n */\n this._initialProperties = true;\n /**\n * Array of property keys considered changed from the previous set properties\n */\n this._changedPropertyKeys = [];\n this._nodeHandler = new NodeHandler();\n this._handles = [];\n this._children = [];\n this._decoratorCache = new Map();\n this._properties = {};\n this._boundRenderFunc = this.render.bind(this);\n this._boundInvalidate = this.invalidate.bind(this);\n widgetInstanceMap.set(this, {\n dirty: true,\n onAttach: () => {\n this.onAttach();\n },\n onDetach: () => {\n this.onDetach();\n this.destroy();\n },\n nodeHandler: this._nodeHandler,\n registry: () => {\n return this.registry;\n },\n coreProperties: {},\n rendering: false,\n inputProperties: {}\n });\n this._runAfterConstructors();\n }\n meta(MetaType) {\n if (this._metaMap === undefined) {\n this._metaMap = new Map();\n }\n let cached = this._metaMap.get(MetaType);\n if (!cached) {\n cached = new MetaType({\n invalidate: this._boundInvalidate,\n nodeHandler: this._nodeHandler,\n bind: this\n });\n this.own(cached);\n this._metaMap.set(MetaType, cached);\n }\n return cached;\n }\n onAttach() {\n // Do nothing by default.\n }\n onDetach() {\n // Do nothing by default.\n }\n get properties() {\n return this._properties;\n }\n get changedPropertyKeys() {\n return [...this._changedPropertyKeys];\n }\n __setCoreProperties__(coreProperties) {\n const { baseRegistry } = coreProperties;\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.coreProperties.baseRegistry !== baseRegistry) {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n this._registry.base = baseRegistry;\n this.invalidate();\n }\n instanceData.coreProperties = coreProperties;\n }\n __setProperties__(originalProperties) {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.inputProperties = originalProperties;\n const properties = this._runBeforeProperties(originalProperties);\n const registeredDiffPropertyNames = this.getDecorator('registeredDiffProperty');\n const changedPropertyKeys = [];\n const propertyNames = Object.keys(properties);\n if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) {\n const allProperties = [...propertyNames, ...Object.keys(this._properties)];\n const checkedProperties = [];\n const diffPropertyResults = {};\n let runReactions = false;\n for (let i = 0; i < allProperties.length; i++) {\n const propertyName = allProperties[i];\n if (checkedProperties.indexOf(propertyName) !== -1) {\n continue;\n }\n checkedProperties.push(propertyName);\n const previousProperty = this._properties[propertyName];\n const newProperty = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n if (registeredDiffPropertyNames.indexOf(propertyName) !== -1) {\n runReactions = true;\n const diffFunctions = this.getDecorator(`diffProperty:${propertyName}`);\n for (let i = 0; i < diffFunctions.length; i++) {\n const result = diffFunctions[i](previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n else {\n const result = boundAuto(previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n if (runReactions) {\n const reactionFunctions = this.getDecorator('diffReaction');\n const executedReactions = [];\n reactionFunctions.forEach(({ reaction, propertyName }) => {\n const propertyChanged = changedPropertyKeys.indexOf(propertyName) !== -1;\n const reactionRun = executedReactions.indexOf(reaction) !== -1;\n if (propertyChanged && !reactionRun) {\n reaction.call(this, this._properties, diffPropertyResults);\n executedReactions.push(reaction);\n }\n });\n }\n this._properties = diffPropertyResults;\n this._changedPropertyKeys = changedPropertyKeys;\n }\n else {\n this._initialProperties = false;\n for (let i = 0; i < propertyNames.length; i++) {\n const propertyName = propertyNames[i];\n if (typeof properties[propertyName] === 'function') {\n properties[propertyName] = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n }\n else {\n changedPropertyKeys.push(propertyName);\n }\n }\n this._changedPropertyKeys = changedPropertyKeys;\n this._properties = Object.assign({}, properties);\n }\n if (this._changedPropertyKeys.length > 0) {\n this.invalidate();\n }\n }\n get children() {\n return this._children;\n }\n __setChildren__(children) {\n if (this._children.length > 0 || children.length > 0) {\n this._children = children;\n this.invalidate();\n }\n }\n __render__() {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.dirty = false;\n const render = this._runBeforeRenders();\n let dNode = render();\n dNode = this.runAfterRenders(dNode);\n this._nodeHandler.clear();\n return dNode;\n }\n invalidate() {\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.invalidate) {\n instanceData.invalidate();\n }\n }\n render() {\n return v('div', {}, this.children);\n }\n /**\n * Function to add decorators to WidgetBase\n *\n * @param decoratorKey The key of the decorator\n * @param value The value of the decorator\n */\n addDecorator(decoratorKey, value) {\n value = Array.isArray(value) ? value : [value];\n if (this.hasOwnProperty('constructor')) {\n let decoratorList = decoratorMap.get(this.constructor);\n if (!decoratorList) {\n decoratorList = new Map();\n decoratorMap.set(this.constructor, decoratorList);\n }\n let specificDecoratorList = decoratorList.get(decoratorKey);\n if (!specificDecoratorList) {\n specificDecoratorList = [];\n decoratorList.set(decoratorKey, specificDecoratorList);\n }\n specificDecoratorList.push(...value);\n }\n else {\n const decorators = this.getDecorator(decoratorKey);\n this._decoratorCache.set(decoratorKey, [...decorators, ...value]);\n }\n }\n /**\n * Function to build the list of decorators from the global decorator map.\n *\n * @param decoratorKey The key of the decorator\n * @return An array of decorator values\n * @private\n */\n _buildDecoratorList(decoratorKey) {\n const allDecorators = [];\n let constructor = this.constructor;\n while (constructor) {\n const instanceMap = decoratorMap.get(constructor);\n if (instanceMap) {\n const decorators = instanceMap.get(decoratorKey);\n if (decorators) {\n allDecorators.unshift(...decorators);\n }\n }\n constructor = Object.getPrototypeOf(constructor);\n }\n return allDecorators;\n }\n /**\n * Function to retrieve decorator values\n *\n * @param decoratorKey The key of the decorator\n * @returns An array of decorator values\n */\n getDecorator(decoratorKey) {\n let allDecorators = this._decoratorCache.get(decoratorKey);\n if (allDecorators !== undefined) {\n return allDecorators;\n }\n allDecorators = this._buildDecoratorList(decoratorKey);\n this._decoratorCache.set(decoratorKey, allDecorators);\n return allDecorators;\n }\n /**\n * Binds unbound property functions to the specified `bind` property\n *\n * @param properties properties to check for functions\n */\n _bindFunctionProperty(property, bind) {\n if (typeof property === 'function' && !property[noBind] && isWidgetBaseConstructor(property) === false) {\n if (this._bindFunctionPropertyMap === undefined) {\n this._bindFunctionPropertyMap = new WeakMap();\n }\n const bindInfo = this._bindFunctionPropertyMap.get(property) || {};\n let { boundFunc, scope } = bindInfo;\n if (boundFunc === undefined || scope !== bind) {\n boundFunc = property.bind(bind);\n this._bindFunctionPropertyMap.set(property, { boundFunc, scope: bind });\n }\n return boundFunc;\n }\n return property;\n }\n get registry() {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n return this._registry;\n }\n _runBeforeProperties(properties) {\n const beforeProperties = this.getDecorator('beforeProperties');\n if (beforeProperties.length > 0) {\n return beforeProperties.reduce((properties, beforePropertiesFunction) => {\n return Object.assign({}, properties, beforePropertiesFunction.call(this, properties));\n }, Object.assign({}, properties));\n }\n return properties;\n }\n /**\n * Run all registered before renders and return the updated render method\n */\n _runBeforeRenders() {\n const beforeRenders = this.getDecorator('beforeRender');\n if (beforeRenders.length > 0) {\n return beforeRenders.reduce((render, beforeRenderFunction) => {\n const updatedRender = beforeRenderFunction.call(this, render, this._properties, this._children);\n if (!updatedRender) {\n console.warn('Render function not returned from beforeRender, using previous render');\n return render;\n }\n return updatedRender;\n }, this._boundRenderFunc);\n }\n return this._boundRenderFunc;\n }\n /**\n * Run all registered after renders and return the decorated DNodes\n *\n * @param dNode The DNodes to run through the after renders\n */\n runAfterRenders(dNode) {\n const afterRenders = this.getDecorator('afterRender');\n if (afterRenders.length > 0) {\n dNode = afterRenders.reduce((dNode, afterRenderFunction) => {\n return afterRenderFunction.call(this, dNode);\n }, dNode);\n }\n if (this._metaMap !== undefined) {\n this._metaMap.forEach((meta) => {\n meta.afterRender();\n });\n }\n return dNode;\n }\n _runAfterConstructors() {\n const afterConstructors = this.getDecorator('afterConstructor');\n if (afterConstructors.length > 0) {\n afterConstructors.forEach((afterConstructor) => afterConstructor.call(this));\n }\n }\n own(handle) {\n this._handles.push(handle);\n }\n destroy() {\n while (this._handles.length > 0) {\n const handle = this._handles.pop();\n if (handle) {\n handle.destroy();\n }\n }\n }\n}\n/**\n * static identifier\n */\nWidgetBase._type = WIDGET_BASE_TYPE;\nexport default WidgetBase;\n//# sourceMappingURL=WidgetBase.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/WidgetBase.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/WidgetBase.mjs\n// module chunks = menu-item","let browserSpecificTransitionEndEventName = '';\nlet browserSpecificAnimationEndEventName = '';\nfunction determineBrowserStyleNames(element) {\n if ('WebkitTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'webkitTransitionEnd';\n browserSpecificAnimationEndEventName = 'webkitAnimationEnd';\n }\n else if ('transition' in element.style || 'MozTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'transitionend';\n browserSpecificAnimationEndEventName = 'animationend';\n }\n else {\n throw new Error('Your browser is not supported');\n }\n}\nfunction initialize(element) {\n if (browserSpecificAnimationEndEventName === '') {\n determineBrowserStyleNames(element);\n }\n}\nfunction runAndCleanUp(element, startAnimation, finishAnimation) {\n initialize(element);\n let finished = false;\n let transitionEnd = function () {\n if (!finished) {\n finished = true;\n element.removeEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n element.removeEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n finishAnimation();\n }\n };\n startAnimation();\n element.addEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n element.addEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n}\nfunction exit(node, properties, exitAnimation, removeNode) {\n const activeClass = properties.exitAnimationActive || `${exitAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(exitAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n removeNode();\n });\n}\nfunction enter(node, properties, enterAnimation) {\n const activeClass = properties.enterAnimationActive || `${enterAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(enterAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n node.classList.remove(enterAnimation);\n node.classList.remove(activeClass);\n });\n}\nexport default {\n enter,\n exit\n};\n//# sourceMappingURL=cssTransitions.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs\n// module chunks = menu-item","import Symbol from '../shim/Symbol';\n/**\n * The symbol identifier for a WNode type\n */\nexport const WNODE = Symbol('Identifier for a WNode.');\n/**\n * The symbol identifier for a VNode type\n */\nexport const VNODE = Symbol('Identifier for a VNode.');\n/**\n * The symbol identifier for a VNode type created using dom()\n */\nexport const DOMVNODE = Symbol('Identifier for a VNode created using existing dom.');\n/**\n * Helper function that returns true if the `DNode` is a `WNode` using the `type` property\n */\nexport function isWNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === WNODE);\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` using the `type` property\n */\nexport function isVNode(child) {\n return Boolean(child && typeof child !== 'string' && (child.type === VNODE || child.type === DOMVNODE));\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` created with `dom()` using the `type` property\n */\nexport function isDomVNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === DOMVNODE);\n}\nexport function isElementNode(value) {\n return !!value.tagName;\n}\nexport function decorate(dNodes, optionsOrModifier, predicate) {\n let shallow = false;\n let modifier;\n if (typeof optionsOrModifier === 'function') {\n modifier = optionsOrModifier;\n }\n else {\n modifier = optionsOrModifier.modifier;\n predicate = optionsOrModifier.predicate;\n shallow = optionsOrModifier.shallow || false;\n }\n let nodes = Array.isArray(dNodes) ? [...dNodes] : [dNodes];\n function breaker() {\n nodes = [];\n }\n while (nodes.length) {\n const node = nodes.shift();\n if (node) {\n if (!shallow && (isWNode(node) || isVNode(node)) && node.children) {\n nodes = [...nodes, ...node.children];\n }\n if (!predicate || predicate(node)) {\n modifier(node, breaker);\n }\n }\n }\n return dNodes;\n}\n/**\n * Wrapper function for calls to create a widget.\n */\nexport function w(widgetConstructor, properties, children = []) {\n return {\n children,\n widgetConstructor,\n properties,\n type: WNODE\n };\n}\nexport function v(tag, propertiesOrChildren = {}, children = undefined) {\n let properties = propertiesOrChildren;\n let deferredPropertiesCallback;\n if (Array.isArray(propertiesOrChildren)) {\n children = propertiesOrChildren;\n properties = {};\n }\n if (typeof properties === 'function') {\n deferredPropertiesCallback = properties;\n properties = {};\n }\n return {\n tag,\n deferredPropertiesCallback,\n children,\n properties,\n type: VNODE\n };\n}\n/**\n * Create a VNode for an existing DOM Node.\n */\nexport function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, children) {\n return {\n tag: isElementNode(node) ? node.tagName.toLowerCase() : '',\n properties: props,\n attributes: attrs,\n events: on,\n children,\n type: DOMVNODE,\n domNode: node,\n text: isElementNode(node) ? undefined : node.data,\n diffType\n };\n}\n//# sourceMappingURL=d.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/d.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/d.mjs\n// module chunks = menu-item","import { handleDecorator } from './handleDecorator';\nexport function afterRender(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('afterRender', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default afterRender;\n//# sourceMappingURL=afterRender.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs\n// module chunks = menu-item","import { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\nexport function alwaysRender() {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function () {\n this.invalidate();\n })(target);\n });\n}\nexport default alwaysRender;\n//# sourceMappingURL=alwaysRender.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs\n// module chunks = menu-item","import { handleDecorator } from './handleDecorator';\nexport function beforeProperties(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('beforeProperties', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default beforeProperties;\n//# sourceMappingURL=beforeProperties.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs\n// module chunks = menu-item","import { CustomElementChildType } from '../registerCustomElement';\nimport Registry from '../Registry';\n/**\n * This Decorator is provided properties that define the behavior of a custom element, and\n * registers that custom element.\n */\nexport function customElement({ tag, properties = [], attributes = [], events = [], childType = CustomElementChildType.DOJO, registryFactory = () => new Registry() }) {\n return function (target) {\n target.prototype.__customElementDescriptor = {\n tagName: tag,\n attributes,\n properties,\n events,\n childType,\n registryFactory\n };\n };\n}\nexport default customElement;\n//# sourceMappingURL=customElement.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs\n// module chunks = menu-item","import { handleDecorator } from './handleDecorator';\nimport { auto } from './../diff';\n/**\n * Decorator that can be used to register a function as a specific property diff\n *\n * @param propertyName The name of the property of which the diff function is applied\n * @param diffType The diff type, default is DiffType.AUTO.\n * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM\n */\nexport function diffProperty(propertyName, diffFunction = auto, reactionFunction) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null));\n target.addDecorator('registeredDiffProperty', propertyName);\n if (reactionFunction || propertyKey) {\n target.addDecorator('diffReaction', {\n propertyName,\n reaction: propertyKey ? target[propertyKey] : reactionFunction\n });\n }\n });\n}\nexport default diffProperty;\n//# sourceMappingURL=diffProperty.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs\n// module chunks = menu-item","/**\n * Generic decorator handler to take care of whether or not the decorator was called at the class level\n * or the method level.\n *\n * @param handler\n */\nexport function handleDecorator(handler) {\n return function (target, propertyKey, descriptor) {\n if (typeof target === 'function') {\n handler(target.prototype, undefined);\n }\n else {\n handler(target, propertyKey);\n }\n };\n}\nexport default handleDecorator;\n//# sourceMappingURL=handleDecorator.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs\n// module chunks = menu-item","import WeakMap from '../../shim/WeakMap';\nimport { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\n/**\n * Map of instances against registered injectors.\n */\nconst registeredInjectorsMap = new WeakMap();\n/**\n * Decorator retrieves an injector from an available registry using the name and\n * calls the `getProperties` function with the payload from the injector\n * and current properties with the the injected properties returned.\n *\n * @param InjectConfig the inject configuration\n */\nexport function inject({ name, getProperties }) {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function (properties) {\n const injectorItem = this.registry.getInjector(name);\n if (injectorItem) {\n const { injector, invalidator } = injectorItem;\n const registeredInjectors = registeredInjectorsMap.get(this) || [];\n if (registeredInjectors.length === 0) {\n registeredInjectorsMap.set(this, registeredInjectors);\n }\n if (registeredInjectors.indexOf(injectorItem) === -1) {\n this.own(invalidator.on('invalidate', () => {\n this.invalidate();\n }));\n registeredInjectors.push(injectorItem);\n }\n return getProperties(injector(), properties);\n }\n })(target);\n });\n}\nexport default inject;\n//# sourceMappingURL=inject.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/inject.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/inject.mjs\n// module chunks = menu-item","import { WIDGET_BASE_TYPE } from './Registry';\nfunction isObjectOrArray(value) {\n return Object.prototype.toString.call(value) === '[object Object]' || Array.isArray(value);\n}\nexport function always(previousProperty, newProperty) {\n return {\n changed: true,\n value: newProperty\n };\n}\nexport function ignore(previousProperty, newProperty) {\n return {\n changed: false,\n value: newProperty\n };\n}\nexport function reference(previousProperty, newProperty) {\n return {\n changed: previousProperty !== newProperty,\n value: newProperty\n };\n}\nexport function shallow(previousProperty, newProperty) {\n let changed = false;\n const validOldProperty = previousProperty && isObjectOrArray(previousProperty);\n const validNewProperty = newProperty && isObjectOrArray(newProperty);\n if (!validOldProperty || !validNewProperty) {\n return {\n changed: true,\n value: newProperty\n };\n }\n const previousKeys = Object.keys(previousProperty);\n const newKeys = Object.keys(newProperty);\n if (previousKeys.length !== newKeys.length) {\n changed = true;\n }\n else {\n changed = newKeys.some((key) => {\n return newProperty[key] !== previousProperty[key];\n });\n }\n return {\n changed,\n value: newProperty\n };\n}\nexport function auto(previousProperty, newProperty) {\n let result;\n if (typeof newProperty === 'function') {\n if (newProperty._type === WIDGET_BASE_TYPE) {\n result = reference(previousProperty, newProperty);\n }\n else {\n result = ignore(previousProperty, newProperty);\n }\n }\n else if (isObjectOrArray(newProperty)) {\n result = shallow(previousProperty, newProperty);\n }\n else {\n result = reference(previousProperty, newProperty);\n }\n return result;\n}\n//# sourceMappingURL=diff.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/diff.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/diff.mjs\n// module chunks = menu-item","import * as tslib_1 from \"tslib\";\nimport { assign } from '../../core/lang';\nimport cssTransitions from '../animations/cssTransitions';\nimport { afterRender } from './../decorators/afterRender';\nimport { v } from './../d';\nimport { dom } from './../vdom';\n/**\n * Represents the attach state of the projector\n */\nexport var ProjectorAttachState;\n(function (ProjectorAttachState) {\n ProjectorAttachState[ProjectorAttachState[\"Attached\"] = 1] = \"Attached\";\n ProjectorAttachState[ProjectorAttachState[\"Detached\"] = 2] = \"Detached\";\n})(ProjectorAttachState || (ProjectorAttachState = {}));\n/**\n * Attach type for the projector\n */\nexport var AttachType;\n(function (AttachType) {\n AttachType[AttachType[\"Append\"] = 1] = \"Append\";\n AttachType[AttachType[\"Merge\"] = 2] = \"Merge\";\n})(AttachType || (AttachType = {}));\nexport function ProjectorMixin(Base) {\n class Projector extends Base {\n constructor(...args) {\n super(...args);\n this._root = document.body;\n this._async = true;\n this._projectorProperties = {};\n this._projectionOptions = {\n transitions: cssTransitions\n };\n this.root = document.body;\n this.projectorState = ProjectorAttachState.Detached;\n }\n append(root) {\n const options = {\n type: AttachType.Append,\n root\n };\n return this._attach(options);\n }\n merge(root) {\n const options = {\n type: AttachType.Merge,\n root\n };\n return this._attach(options);\n }\n set root(root) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change root element');\n }\n this._root = root;\n }\n get root() {\n return this._root;\n }\n get async() {\n return this._async;\n }\n set async(async) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change async mode');\n }\n this._async = async;\n }\n sandbox(doc = document) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot create sandbox');\n }\n this._async = false;\n const previousRoot = this.root;\n /* free up the document fragment for GC */\n this.own({\n destroy: () => {\n this._root = previousRoot;\n }\n });\n this._attach({\n /* DocumentFragment is not assignable to Element, but provides everything needed to work */\n root: doc.createDocumentFragment(),\n type: AttachType.Append\n });\n }\n setChildren(children) {\n this.__setChildren__(children);\n }\n setProperties(properties) {\n this.__setProperties__(properties);\n }\n __setProperties__(properties) {\n if (this._projectorProperties && this._projectorProperties.registry !== properties.registry) {\n if (this._projectorProperties.registry) {\n this._projectorProperties.registry.destroy();\n }\n }\n this._projectorProperties = assign({}, properties);\n super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry });\n super.__setProperties__(properties);\n }\n toHtml() {\n if (this.projectorState !== ProjectorAttachState.Attached || !this._projection) {\n throw new Error('Projector is not attached, cannot return an HTML string of projection.');\n }\n return this._projection.domNode.childNodes[0].outerHTML;\n }\n afterRender(result) {\n let node = result;\n if (typeof result === 'string' || result === null || result === undefined) {\n node = v('span', {}, [result]);\n }\n return node;\n }\n destroy() {\n super.destroy();\n }\n _attach({ type, root }) {\n if (root) {\n this.root = root;\n }\n if (this._attachHandle) {\n return this._attachHandle;\n }\n this.projectorState = ProjectorAttachState.Attached;\n const handle = {\n destroy: () => {\n if (this.projectorState === ProjectorAttachState.Attached) {\n this._projection = undefined;\n this.projectorState = ProjectorAttachState.Detached;\n }\n }\n };\n this.own(handle);\n this._attachHandle = handle;\n this._projectionOptions = Object.assign({}, this._projectionOptions, { sync: !this._async });\n switch (type) {\n case AttachType.Append:\n this._projection = dom.append(this.root, this, this._projectionOptions);\n break;\n case AttachType.Merge:\n this._projection = dom.merge(this.root, this, this._projectionOptions);\n break;\n }\n return this._attachHandle;\n }\n }\n tslib_1.__decorate([\n afterRender()\n ], Projector.prototype, \"afterRender\", null);\n return Projector;\n}\nexport default ProjectorMixin;\n//# sourceMappingURL=Projector.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs\n// module chunks = menu-item","import * as tslib_1 from \"tslib\";\nimport { Injector } from './../Injector';\nimport { inject } from './../decorators/inject';\nimport { handleDecorator } from './../decorators/handleDecorator';\nimport { diffProperty } from './../decorators/diffProperty';\nimport { shallow } from './../diff';\nconst THEME_KEY = ' _key';\nexport const INJECTED_THEME_KEY = Symbol('theme');\n/**\n * Decorator for base css classes\n */\nexport function theme(theme) {\n return handleDecorator((target) => {\n target.addDecorator('baseThemeClasses', theme);\n });\n}\n/**\n * Creates a reverse lookup for the classes passed in via the `theme` function.\n *\n * @param classes The baseClasses object\n * @requires\n */\nfunction createThemeClassesLookup(classes) {\n return classes.reduce((currentClassNames, baseClass) => {\n Object.keys(baseClass).forEach((key) => {\n currentClassNames[baseClass[key]] = key;\n });\n return currentClassNames;\n }, {});\n}\n/**\n * Convenience function that is given a theme and an optional registry, the theme\n * injector is defined against the registry, returning the theme.\n *\n * @param theme the theme to set\n * @param themeRegistry registry to define the theme injector against. Defaults\n * to the global registry\n *\n * @returns the theme injector used to set the theme\n */\nexport function registerThemeInjector(theme, themeRegistry) {\n const themeInjector = new Injector(theme);\n themeRegistry.defineInjector(INJECTED_THEME_KEY, (invalidator) => {\n themeInjector.setInvalidator(invalidator);\n return () => themeInjector.get();\n });\n return themeInjector;\n}\n/**\n * Function that returns a class decorated with with Themed functionality\n */\nexport function ThemedMixin(Base) {\n let Themed = class Themed extends Base {\n constructor() {\n super(...arguments);\n /**\n * Registered base theme keys\n */\n this._registeredBaseThemeKeys = [];\n /**\n * Indicates if classes meta data need to be calculated.\n */\n this._recalculateClasses = true;\n /**\n * Loaded theme\n */\n this._theme = {};\n }\n theme(classes) {\n if (this._recalculateClasses) {\n this._recalculateThemeClasses();\n }\n if (Array.isArray(classes)) {\n return classes.map((className) => this._getThemeClass(className));\n }\n return this._getThemeClass(classes);\n }\n /**\n * Function fired when `theme` or `extraClasses` are changed.\n */\n onPropertiesChanged() {\n this._recalculateClasses = true;\n }\n _getThemeClass(className) {\n if (className === undefined || className === null) {\n return className;\n }\n const extraClasses = this.properties.extraClasses || {};\n const themeClassName = this._baseThemeClassesReverseLookup[className];\n let resultClassNames = [];\n if (!themeClassName) {\n console.warn(`Class name: '${className}' not found in theme`);\n return null;\n }\n if (extraClasses[themeClassName]) {\n resultClassNames.push(extraClasses[themeClassName]);\n }\n if (this._theme[themeClassName]) {\n resultClassNames.push(this._theme[themeClassName]);\n }\n else {\n resultClassNames.push(this._registeredBaseTheme[themeClassName]);\n }\n return resultClassNames.join(' ');\n }\n _recalculateThemeClasses() {\n const { theme = {} } = this.properties;\n const baseThemes = this.getDecorator('baseThemeClasses');\n if (!this._registeredBaseTheme) {\n this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => {\n const _a = THEME_KEY, key = baseTheme[_a], classes = tslib_1.__rest(baseTheme, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n this._registeredBaseThemeKeys.push(key);\n return Object.assign({}, finalBaseTheme, classes);\n }, {});\n this._baseThemeClassesReverseLookup = createThemeClassesLookup(baseThemes);\n }\n this._theme = this._registeredBaseThemeKeys.reduce((baseTheme, themeKey) => {\n return Object.assign({}, baseTheme, theme[themeKey]);\n }, {});\n this._recalculateClasses = false;\n }\n };\n tslib_1.__decorate([\n diffProperty('theme', shallow),\n diffProperty('extraClasses', shallow)\n ], Themed.prototype, \"onPropertiesChanged\", null);\n Themed = tslib_1.__decorate([\n inject({\n name: INJECTED_THEME_KEY,\n getProperties: (theme, properties) => {\n if (!properties.theme) {\n return { theme };\n }\n return {};\n }\n })\n ], Themed);\n return Themed;\n}\nexport default ThemedMixin;\n//# sourceMappingURL=Themed.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs\n// module chunks = menu-item","import * as tslib_1 from \"tslib\";\nimport { WidgetBase, noBind } from './WidgetBase';\nimport { ProjectorMixin } from './mixins/Projector';\nimport { from } from '../shim/array';\nimport { w, dom } from './d';\nimport global from '../shim/global';\nimport { registerThemeInjector } from './mixins/Themed';\nimport { alwaysRender } from './decorators/alwaysRender';\nexport var CustomElementChildType;\n(function (CustomElementChildType) {\n CustomElementChildType[\"DOJO\"] = \"DOJO\";\n CustomElementChildType[\"NODE\"] = \"NODE\";\n CustomElementChildType[\"TEXT\"] = \"TEXT\";\n})(CustomElementChildType || (CustomElementChildType = {}));\nexport function DomToWidgetWrapper(domNode) {\n let DomToWidgetWrapper = class DomToWidgetWrapper extends WidgetBase {\n render() {\n const properties = Object.keys(this.properties).reduce((props, key) => {\n const value = this.properties[key];\n if (key.indexOf('on') === 0) {\n key = `__${key}`;\n }\n props[key] = value;\n return props;\n }, {});\n return dom({ node: domNode, props: properties, diffType: 'dom' });\n }\n static get domNode() {\n return domNode;\n }\n };\n DomToWidgetWrapper = tslib_1.__decorate([\n alwaysRender()\n ], DomToWidgetWrapper);\n return DomToWidgetWrapper;\n}\nexport function create(descriptor, WidgetConstructor) {\n const { attributes, childType, registryFactory } = descriptor;\n const attributeMap = {};\n attributes.forEach((propertyName) => {\n const attributeName = propertyName.toLowerCase();\n attributeMap[attributeName] = propertyName;\n });\n return class extends HTMLElement {\n constructor() {\n super(...arguments);\n this._properties = {};\n this._children = [];\n this._eventProperties = {};\n this._initialised = false;\n }\n connectedCallback() {\n if (this._initialised) {\n return;\n }\n const domProperties = {};\n const { attributes, properties, events } = descriptor;\n this._properties = Object.assign({}, this._properties, this._attributesToProperties(attributes));\n [...attributes, ...properties].forEach((propertyName) => {\n const value = this[propertyName];\n const filteredPropertyName = propertyName.replace(/^on/, '__');\n if (value !== undefined) {\n this._properties[propertyName] = value;\n }\n if (filteredPropertyName !== propertyName) {\n domProperties[filteredPropertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n }\n domProperties[propertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n });\n events.forEach((propertyName) => {\n const eventName = propertyName.replace(/^on/, '').toLowerCase();\n const filteredPropertyName = propertyName.replace(/^on/, '__on');\n domProperties[filteredPropertyName] = {\n get: () => this._getEventProperty(propertyName),\n set: (value) => this._setEventProperty(propertyName, value)\n };\n this._eventProperties[propertyName] = undefined;\n this._properties[propertyName] = (...args) => {\n const eventCallback = this._getEventProperty(propertyName);\n if (typeof eventCallback === 'function') {\n eventCallback(...args);\n }\n this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: false,\n detail: args\n }));\n };\n });\n Object.defineProperties(this, domProperties);\n const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children;\n from(children).forEach((childNode) => {\n if (childType === CustomElementChildType.DOJO) {\n childNode.addEventListener('dojo-ce-render', () => this._render());\n childNode.addEventListener('dojo-ce-connected', () => this._render());\n this._children.push(DomToWidgetWrapper(childNode));\n }\n else {\n this._children.push(dom({ node: childNode, diffType: 'dom' }));\n }\n });\n this.addEventListener('dojo-ce-connected', (e) => this._childConnected(e));\n const widgetProperties = this._properties;\n const renderChildren = () => this.__children__();\n const Wrapper = class extends WidgetBase {\n render() {\n return w(WidgetConstructor, widgetProperties, renderChildren());\n }\n };\n const registry = registryFactory();\n const themeContext = registerThemeInjector(this._getTheme(), registry);\n global.addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme()));\n const Projector = ProjectorMixin(Wrapper);\n this._projector = new Projector();\n this._projector.setProperties({ registry });\n this._projector.append(this);\n this._initialised = true;\n this.dispatchEvent(new CustomEvent('dojo-ce-connected', {\n bubbles: true,\n detail: this\n }));\n }\n _getTheme() {\n if (global && global.dojoce && global.dojoce.theme) {\n return global.dojoce.themes[global.dojoce.theme];\n }\n }\n _childConnected(e) {\n const node = e.detail;\n if (node.parentNode === this) {\n const exists = this._children.some((child) => child.domNode === node);\n if (!exists) {\n node.addEventListener('dojo-ce-render', () => this._render());\n this._children.push(DomToWidgetWrapper(node));\n this._render();\n }\n }\n }\n _render() {\n if (this._projector) {\n this._projector.invalidate();\n this.dispatchEvent(new CustomEvent('dojo-ce-render', {\n bubbles: false,\n detail: this\n }));\n }\n }\n __properties__() {\n return Object.assign({}, this._properties, this._eventProperties);\n }\n __children__() {\n if (childType === CustomElementChildType.DOJO) {\n return this._children.filter((Child) => Child.domNode.isWidget).map((Child) => {\n const { domNode } = Child;\n return w(Child, Object.assign({}, domNode.__properties__()), [...domNode.__children__()]);\n });\n }\n else {\n return this._children;\n }\n }\n attributeChangedCallback(name, oldValue, value) {\n const propertyName = attributeMap[name];\n this._setProperty(propertyName, value);\n }\n _setEventProperty(propertyName, value) {\n this._eventProperties[propertyName] = value;\n }\n _getEventProperty(propertyName) {\n return this._eventProperties[propertyName];\n }\n _setProperty(propertyName, value) {\n if (typeof value === 'function') {\n value[noBind] = true;\n }\n this._properties[propertyName] = value;\n this._render();\n }\n _getProperty(propertyName) {\n return this._properties[propertyName];\n }\n _attributesToProperties(attributes) {\n return attributes.reduce((properties, propertyName) => {\n const attributeName = propertyName.toLowerCase();\n const value = this.getAttribute(attributeName);\n if (value !== null) {\n properties[propertyName] = value;\n }\n return properties;\n }, {});\n }\n static get observedAttributes() {\n return Object.keys(attributeMap);\n }\n get isWidget() {\n return true;\n }\n };\n}\nexport function register(WidgetConstructor) {\n const descriptor = WidgetConstructor.prototype && WidgetConstructor.prototype.__customElementDescriptor;\n if (!descriptor) {\n throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?');\n }\n global.customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor));\n}\nexport default register;\n//# sourceMappingURL=registerCustomElement.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs\n// module chunks = menu-item","import global from '../shim/global';\r\nimport { from as arrayFrom } from '../shim/array';\r\nimport { isWNode, isVNode, isDomVNode, VNODE, WNODE } from './d';\r\nimport { isWidgetBaseConstructor } from './Registry';\r\nimport WeakMap from '../shim/WeakMap';\r\nconst NAMESPACE_W3 = 'http://www.w3.org/';\r\nconst NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg';\r\nconst NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink';\r\nconst emptyArray = [];\r\nconst nodeOperations = ['focus', 'blur', 'scrollIntoView', 'click'];\r\nexport const widgetInstanceMap = new WeakMap();\r\nconst instanceMap = new WeakMap();\r\nconst nextSiblingMap = new WeakMap();\r\nconst projectorStateMap = new WeakMap();\r\nfunction same(dnode1, dnode2) {\r\n if (isVNode(dnode1) && isVNode(dnode2)) {\r\n if (isDomVNode(dnode1) || isDomVNode(dnode2)) {\r\n if (dnode1.domNode !== dnode2.domNode) {\r\n return false;\r\n }\r\n }\r\n if (dnode1.tag !== dnode2.tag) {\r\n return false;\r\n }\r\n if (dnode1.properties.key !== dnode2.properties.key) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n else if (isWNode(dnode1) && isWNode(dnode2)) {\r\n if (dnode1.instance === undefined && typeof dnode2.widgetConstructor === 'string') {\r\n return false;\r\n }\r\n if (dnode1.widgetConstructor !== dnode2.widgetConstructor) {\r\n return false;\r\n }\r\n if (dnode1.properties.key !== dnode2.properties.key) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n return false;\r\n}\r\nconst missingTransition = function () {\r\n throw new Error('Provide a transitions object to the projectionOptions to do animations');\r\n};\r\nfunction getProjectionOptions(projectorOptions, projectorInstance) {\r\n const defaults = {\r\n namespace: undefined,\r\n styleApplyer: function (domNode, styleName, value) {\r\n domNode.style[styleName] = value;\r\n },\r\n transitions: {\r\n enter: missingTransition,\r\n exit: missingTransition\r\n },\r\n depth: 0,\r\n merge: false,\r\n sync: false,\r\n projectorInstance\r\n };\r\n return Object.assign({}, defaults, projectorOptions);\r\n}\r\nfunction checkStyleValue(styleValue) {\r\n if (typeof styleValue !== 'string') {\r\n throw new Error('Style values must be strings');\r\n }\r\n}\r\nfunction updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n const eventMap = projectorState.nodeMap.get(domNode) || new WeakMap();\r\n if (previousValue) {\r\n const previousEvent = eventMap.get(previousValue);\r\n domNode.removeEventListener(eventName, previousEvent);\r\n }\r\n let callback = currentValue.bind(bind);\r\n if (eventName === 'input') {\r\n callback = function (evt) {\r\n currentValue.call(this, evt);\r\n evt.target['oninput-value'] = evt.target.value;\r\n }.bind(bind);\r\n }\r\n domNode.addEventListener(eventName, callback);\r\n eventMap.set(currentValue, callback);\r\n projectorState.nodeMap.set(domNode, eventMap);\r\n}\r\nfunction addClasses(domNode, classes) {\r\n if (classes) {\r\n const classNames = classes.split(' ');\r\n for (let i = 0; i < classNames.length; i++) {\r\n domNode.classList.add(classNames[i]);\r\n }\r\n }\r\n}\r\nfunction removeClasses(domNode, classes) {\r\n if (classes) {\r\n const classNames = classes.split(' ');\r\n for (let i = 0; i < classNames.length; i++) {\r\n domNode.classList.remove(classNames[i]);\r\n }\r\n }\r\n}\r\nfunction buildPreviousProperties(domNode, previous, current) {\r\n const { diffType, properties, attributes } = current;\r\n if (!diffType || diffType === 'vdom') {\r\n return { properties: previous.properties, attributes: previous.attributes, events: previous.events };\r\n }\r\n else if (diffType === 'none') {\r\n return { properties: {}, attributes: previous.attributes ? {} : undefined, events: previous.events };\r\n }\r\n let newProperties = {\r\n properties: {}\r\n };\r\n if (attributes) {\r\n newProperties.attributes = {};\r\n newProperties.events = previous.events;\r\n Object.keys(properties).forEach((propName) => {\r\n newProperties.properties[propName] = domNode[propName];\r\n });\r\n Object.keys(attributes).forEach((attrName) => {\r\n newProperties.attributes[attrName] = domNode.getAttribute(attrName);\r\n });\r\n return newProperties;\r\n }\r\n newProperties.properties = Object.keys(properties).reduce((props, property) => {\r\n props[property] = domNode.getAttribute(property) || domNode[property];\r\n return props;\r\n }, {});\r\n return newProperties;\r\n}\r\nfunction nodeOperation(propName, propValue, previousValue, domNode, projectionOptions) {\r\n let result;\r\n if (typeof propValue === 'function') {\r\n result = propValue();\r\n }\r\n else {\r\n result = propValue && !previousValue;\r\n }\r\n if (result === true) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectorState.deferredRenderCallbacks.push(() => {\r\n domNode[propName]();\r\n });\r\n }\r\n}\r\nfunction removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions, onlyEvents = false) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n const eventMap = projectorState.nodeMap.get(domNode);\r\n if (eventMap) {\r\n Object.keys(previousProperties).forEach((propName) => {\r\n const isEvent = propName.substr(0, 2) === 'on' || onlyEvents;\r\n const eventName = onlyEvents ? propName : propName.substr(2);\r\n if (isEvent && !properties[propName]) {\r\n const eventCallback = eventMap.get(previousProperties[propName]);\r\n if (eventCallback) {\r\n domNode.removeEventListener(eventName, eventCallback);\r\n }\r\n }\r\n });\r\n }\r\n}\r\nfunction updateAttribute(domNode, attrName, attrValue, projectionOptions) {\r\n if (projectionOptions.namespace === NAMESPACE_SVG && attrName === 'href') {\r\n domNode.setAttributeNS(NAMESPACE_XLINK, attrName, attrValue);\r\n }\r\n else if ((attrName === 'role' && attrValue === '') || attrValue === undefined) {\r\n domNode.removeAttribute(attrName);\r\n }\r\n else {\r\n domNode.setAttribute(attrName, attrValue);\r\n }\r\n}\r\nfunction updateAttributes(domNode, previousAttributes, attributes, projectionOptions) {\r\n const attrNames = Object.keys(attributes);\r\n const attrCount = attrNames.length;\r\n for (let i = 0; i < attrCount; i++) {\r\n const attrName = attrNames[i];\r\n const attrValue = attributes[attrName];\r\n const previousAttrValue = previousAttributes[attrName];\r\n if (attrValue !== previousAttrValue) {\r\n updateAttribute(domNode, attrName, attrValue, projectionOptions);\r\n }\r\n }\r\n}\r\nfunction updateProperties(domNode, previousProperties, properties, projectionOptions, includesEventsAndAttributes = true) {\r\n let propertiesUpdated = false;\r\n const propNames = Object.keys(properties);\r\n const propCount = propNames.length;\r\n if (propNames.indexOf('classes') === -1 && previousProperties.classes) {\r\n if (Array.isArray(previousProperties.classes)) {\r\n for (let i = 0; i < previousProperties.classes.length; i++) {\r\n removeClasses(domNode, previousProperties.classes[i]);\r\n }\r\n }\r\n else {\r\n removeClasses(domNode, previousProperties.classes);\r\n }\r\n }\r\n includesEventsAndAttributes && removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions);\r\n for (let i = 0; i < propCount; i++) {\r\n const propName = propNames[i];\r\n let propValue = properties[propName];\r\n const previousValue = previousProperties[propName];\r\n if (propName === 'classes') {\r\n const previousClasses = Array.isArray(previousValue) ? previousValue : [previousValue];\r\n const currentClasses = Array.isArray(propValue) ? propValue : [propValue];\r\n if (previousClasses && previousClasses.length > 0) {\r\n if (!propValue || propValue.length === 0) {\r\n for (let i = 0; i < previousClasses.length; i++) {\r\n removeClasses(domNode, previousClasses[i]);\r\n }\r\n }\r\n else {\r\n const newClasses = [...currentClasses];\r\n for (let i = 0; i < previousClasses.length; i++) {\r\n const previousClassName = previousClasses[i];\r\n if (previousClassName) {\r\n const classIndex = newClasses.indexOf(previousClassName);\r\n if (classIndex === -1) {\r\n removeClasses(domNode, previousClassName);\r\n }\r\n else {\r\n newClasses.splice(classIndex, 1);\r\n }\r\n }\r\n }\r\n for (let i = 0; i < newClasses.length; i++) {\r\n addClasses(domNode, newClasses[i]);\r\n }\r\n }\r\n }\r\n else {\r\n for (let i = 0; i < currentClasses.length; i++) {\r\n addClasses(domNode, currentClasses[i]);\r\n }\r\n }\r\n }\r\n else if (nodeOperations.indexOf(propName) !== -1) {\r\n nodeOperation(propName, propValue, previousValue, domNode, projectionOptions);\r\n }\r\n else if (propName === 'styles') {\r\n const styleNames = Object.keys(propValue);\r\n const styleCount = styleNames.length;\r\n for (let j = 0; j < styleCount; j++) {\r\n const styleName = styleNames[j];\r\n const newStyleValue = propValue[styleName];\r\n const oldStyleValue = previousValue && previousValue[styleName];\r\n if (newStyleValue === oldStyleValue) {\r\n continue;\r\n }\r\n propertiesUpdated = true;\r\n if (newStyleValue) {\r\n checkStyleValue(newStyleValue);\r\n projectionOptions.styleApplyer(domNode, styleName, newStyleValue);\r\n }\r\n else {\r\n projectionOptions.styleApplyer(domNode, styleName, '');\r\n }\r\n }\r\n }\r\n else {\r\n if (!propValue && typeof previousValue === 'string') {\r\n propValue = '';\r\n }\r\n if (propName === 'value') {\r\n const domValue = domNode[propName];\r\n if (domValue !== propValue &&\r\n (domNode['oninput-value']\r\n ? domValue === domNode['oninput-value']\r\n : propValue !== previousValue)) {\r\n domNode[propName] = propValue;\r\n domNode['oninput-value'] = undefined;\r\n }\r\n if (propValue !== previousValue) {\r\n propertiesUpdated = true;\r\n }\r\n }\r\n else if (propName !== 'key' && propValue !== previousValue) {\r\n const type = typeof propValue;\r\n if (type === 'function' && propName.lastIndexOf('on', 0) === 0 && includesEventsAndAttributes) {\r\n updateEvent(domNode, propName.substr(2), propValue, projectionOptions, properties.bind, previousValue);\r\n }\r\n else if (type === 'string' && propName !== 'innerHTML' && includesEventsAndAttributes) {\r\n updateAttribute(domNode, propName, propValue, projectionOptions);\r\n }\r\n else if (propName === 'scrollLeft' || propName === 'scrollTop') {\r\n if (domNode[propName] !== propValue) {\r\n domNode[propName] = propValue;\r\n }\r\n }\r\n else {\r\n domNode[propName] = propValue;\r\n }\r\n propertiesUpdated = true;\r\n }\r\n }\r\n }\r\n return propertiesUpdated;\r\n}\r\nfunction findIndexOfChild(children, sameAs, start) {\r\n for (let i = start; i < children.length; i++) {\r\n if (same(children[i], sameAs)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\nexport function toParentVNode(domNode) {\r\n return {\r\n tag: '',\r\n properties: {},\r\n children: undefined,\r\n domNode,\r\n type: VNODE\r\n };\r\n}\r\nexport function toTextVNode(data) {\r\n return {\r\n tag: '',\r\n properties: {},\r\n children: undefined,\r\n text: `${data}`,\r\n domNode: undefined,\r\n type: VNODE\r\n };\r\n}\r\nfunction toInternalWNode(instance, instanceData) {\r\n return {\r\n instance,\r\n rendered: [],\r\n coreProperties: instanceData.coreProperties,\r\n children: instance.children,\r\n widgetConstructor: instance.constructor,\r\n properties: instanceData.inputProperties,\r\n type: WNODE\r\n };\r\n}\r\nexport function filterAndDecorateChildren(children, instance) {\r\n if (children === undefined) {\r\n return emptyArray;\r\n }\r\n children = Array.isArray(children) ? children : [children];\r\n for (let i = 0; i < children.length;) {\r\n const child = children[i];\r\n if (child === undefined || child === null) {\r\n children.splice(i, 1);\r\n continue;\r\n }\r\n else if (typeof child === 'string') {\r\n children[i] = toTextVNode(child);\r\n }\r\n else {\r\n if (isVNode(child)) {\r\n if (child.properties.bind === undefined) {\r\n child.properties.bind = instance;\r\n if (child.children && child.children.length > 0) {\r\n filterAndDecorateChildren(child.children, instance);\r\n }\r\n }\r\n }\r\n else {\r\n if (!child.coreProperties) {\r\n const instanceData = widgetInstanceMap.get(instance);\r\n child.coreProperties = {\r\n bind: instance,\r\n baseRegistry: instanceData.coreProperties.baseRegistry\r\n };\r\n }\r\n if (child.children && child.children.length > 0) {\r\n filterAndDecorateChildren(child.children, instance);\r\n }\r\n }\r\n }\r\n i++;\r\n }\r\n return children;\r\n}\r\nfunction nodeAdded(dnode, transitions) {\r\n if (isVNode(dnode) && dnode.properties) {\r\n const enterAnimation = dnode.properties.enterAnimation;\r\n if (enterAnimation) {\r\n if (typeof enterAnimation === 'function') {\r\n enterAnimation(dnode.domNode, dnode.properties);\r\n }\r\n else {\r\n transitions.enter(dnode.domNode, dnode.properties, enterAnimation);\r\n }\r\n }\r\n }\r\n}\r\nfunction nodeToRemove(dnode, transitions, projectionOptions) {\r\n if (isWNode(dnode)) {\r\n const item = instanceMap.get(dnode.instance);\r\n const rendered = (item ? item.dnode.rendered : dnode.rendered) || emptyArray;\r\n if (dnode.instance) {\r\n const instanceData = widgetInstanceMap.get(dnode.instance);\r\n instanceData.onDetach();\r\n instanceMap.delete(dnode.instance);\r\n }\r\n for (let i = 0; i < rendered.length; i++) {\r\n nodeToRemove(rendered[i], transitions, projectionOptions);\r\n }\r\n }\r\n else {\r\n const domNode = dnode.domNode;\r\n const properties = dnode.properties;\r\n if (dnode.children && dnode.children.length > 0) {\r\n for (let i = 0; i < dnode.children.length; i++) {\r\n nodeToRemove(dnode.children[i], transitions, projectionOptions);\r\n }\r\n }\r\n const exitAnimation = properties.exitAnimation;\r\n if (properties && exitAnimation) {\r\n domNode.style.pointerEvents = 'none';\r\n const removeDomNode = function () {\r\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\r\n dnode.domNode = undefined;\r\n };\r\n if (typeof exitAnimation === 'function') {\r\n exitAnimation(domNode, removeDomNode, properties);\r\n return;\r\n }\r\n else {\r\n transitions.exit(dnode.domNode, properties, exitAnimation, removeDomNode);\r\n return;\r\n }\r\n }\r\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\r\n dnode.domNode = undefined;\r\n }\r\n}\r\nfunction checkDistinguishable(childNodes, indexToCheck, parentInstance) {\r\n const childNode = childNodes[indexToCheck];\r\n if (isVNode(childNode) && !childNode.tag) {\r\n return; // Text nodes need not be distinguishable\r\n }\r\n const { key } = childNode.properties;\r\n if (key === undefined || key === null) {\r\n for (let i = 0; i < childNodes.length; i++) {\r\n if (i !== indexToCheck) {\r\n const node = childNodes[i];\r\n if (same(node, childNode)) {\r\n let nodeIdentifier;\r\n const parentName = parentInstance.constructor.name || 'unknown';\r\n if (isWNode(childNode)) {\r\n nodeIdentifier = childNode.widgetConstructor.name || 'unknown';\r\n }\r\n else {\r\n nodeIdentifier = childNode.tag;\r\n }\r\n console.warn(`A widget (${parentName}) has had a child addded or removed, but they were not able to uniquely identified. It is recommended to provide a unique 'key' property when using the same widget or element (${nodeIdentifier}) multiple times as siblings`);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\nfunction updateChildren(parentVNode, siblings, oldChildren, newChildren, parentInstance, projectionOptions) {\r\n oldChildren = oldChildren || emptyArray;\r\n newChildren = newChildren;\r\n const oldChildrenLength = oldChildren.length;\r\n const newChildrenLength = newChildren.length;\r\n const transitions = projectionOptions.transitions;\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\r\n let oldIndex = 0;\r\n let newIndex = 0;\r\n let i;\r\n let textUpdated = false;\r\n while (newIndex < newChildrenLength) {\r\n let oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : undefined;\r\n const newChild = newChildren[newIndex];\r\n if (isVNode(newChild) && typeof newChild.deferredPropertiesCallback === 'function') {\r\n newChild.inserted = isVNode(oldChild) && oldChild.inserted;\r\n addDeferredProperties(newChild, projectionOptions);\r\n }\r\n if (oldChild !== undefined && same(oldChild, newChild)) {\r\n oldIndex++;\r\n newIndex++;\r\n textUpdated =\r\n updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance, oldChildren.slice(oldIndex), newChildren.slice(newIndex)) || textUpdated;\r\n continue;\r\n }\r\n const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);\r\n const addChild = () => {\r\n let insertBeforeDomNode = undefined;\r\n let childrenArray = oldChildren;\r\n let nextIndex = oldIndex + 1;\r\n let child = oldChildren[oldIndex];\r\n if (!child) {\r\n child = siblings[0];\r\n nextIndex = 1;\r\n childrenArray = siblings;\r\n }\r\n if (child) {\r\n let insertBeforeChildren = [child];\r\n while (insertBeforeChildren.length) {\r\n const insertBefore = insertBeforeChildren.shift();\r\n if (isWNode(insertBefore)) {\r\n const item = instanceMap.get(insertBefore.instance);\r\n if (item && item.dnode.rendered) {\r\n insertBeforeChildren.push(...item.dnode.rendered);\r\n }\r\n }\r\n else {\r\n if (insertBefore.domNode) {\r\n if (insertBefore.domNode.parentElement !== parentVNode.domNode) {\r\n break;\r\n }\r\n insertBeforeDomNode = insertBefore.domNode;\r\n break;\r\n }\r\n }\r\n if (insertBeforeChildren.length === 0 && childrenArray[nextIndex]) {\r\n insertBeforeChildren.push(childrenArray[nextIndex]);\r\n nextIndex++;\r\n }\r\n }\r\n }\r\n createDom(newChild, parentVNode, newChildren.slice(newIndex + 1), insertBeforeDomNode, projectionOptions, parentInstance);\r\n nodeAdded(newChild, transitions);\r\n const indexToCheck = newIndex;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(newChildren, indexToCheck, parentInstance);\r\n });\r\n };\r\n if (!oldChild || findOldIndex === -1) {\r\n addChild();\r\n newIndex++;\r\n continue;\r\n }\r\n const removeChild = () => {\r\n const indexToCheck = oldIndex;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\r\n });\r\n if (isWNode(oldChild)) {\r\n const item = instanceMap.get(oldChild.instance);\r\n if (item) {\r\n oldChild = item.dnode;\r\n }\r\n }\r\n nodeToRemove(oldChild, transitions, projectionOptions);\r\n };\r\n const findNewIndex = findIndexOfChild(newChildren, oldChild, newIndex + 1);\r\n if (findNewIndex === -1) {\r\n removeChild();\r\n oldIndex++;\r\n continue;\r\n }\r\n addChild();\r\n removeChild();\r\n oldIndex++;\r\n newIndex++;\r\n }\r\n if (oldChildrenLength > oldIndex) {\r\n // Remove child fragments\r\n for (i = oldIndex; i < oldChildrenLength; i++) {\r\n const indexToCheck = i;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\r\n });\r\n let childToRemove = oldChildren[i];\r\n if (isWNode(childToRemove)) {\r\n const item = instanceMap.get(childToRemove.instance);\r\n if (item) {\r\n childToRemove = item.dnode;\r\n }\r\n }\r\n nodeToRemove(childToRemove, transitions, projectionOptions);\r\n }\r\n }\r\n return textUpdated;\r\n}\r\nfunction addChildren(parentVNode, children, projectionOptions, parentInstance, insertBefore = undefined, childNodes) {\r\n if (children === undefined) {\r\n return;\r\n }\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectorState.merge && childNodes === undefined) {\r\n childNodes = arrayFrom(parentVNode.domNode.childNodes);\r\n }\r\n const transitions = projectionOptions.transitions;\r\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n const nextSiblings = children.slice(i + 1);\r\n if (isVNode(child)) {\r\n if (projectorState.merge && childNodes) {\r\n let domElement = undefined;\r\n while (child.domNode === undefined && childNodes.length > 0) {\r\n domElement = childNodes.shift();\r\n if (domElement && domElement.tagName === (child.tag.toUpperCase() || undefined)) {\r\n child.domNode = domElement;\r\n }\r\n }\r\n }\r\n createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance);\r\n }\r\n else {\r\n createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes);\r\n }\r\n nodeAdded(child, transitions);\r\n }\r\n}\r\nfunction initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions) {\r\n addChildren(dnode, dnode.children, projectionOptions, parentInstance, undefined);\r\n if (typeof dnode.deferredPropertiesCallback === 'function' && dnode.inserted === undefined) {\r\n addDeferredProperties(dnode, projectionOptions);\r\n }\r\n if (dnode.attributes && dnode.events) {\r\n updateAttributes(domNode, {}, dnode.attributes, projectionOptions);\r\n updateProperties(domNode, {}, dnode.properties, projectionOptions, false);\r\n removeOrphanedEvents(domNode, {}, dnode.events, projectionOptions, true);\r\n const events = dnode.events;\r\n Object.keys(events).forEach((event) => {\r\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind);\r\n });\r\n }\r\n else {\r\n updateProperties(domNode, {}, dnode.properties, projectionOptions);\r\n }\r\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\r\n const instanceData = widgetInstanceMap.get(parentInstance);\r\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\r\n }\r\n dnode.inserted = true;\r\n}\r\nfunction createDom(dnode, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes) {\r\n let domNode;\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (isWNode(dnode)) {\r\n let { widgetConstructor } = dnode;\r\n const parentInstanceData = widgetInstanceMap.get(parentInstance);\r\n if (!isWidgetBaseConstructor(widgetConstructor)) {\r\n const item = parentInstanceData.registry().get(widgetConstructor);\r\n if (item === null) {\r\n return;\r\n }\r\n widgetConstructor = item;\r\n }\r\n const instance = new widgetConstructor();\r\n dnode.instance = instance;\r\n nextSiblingMap.set(instance, nextSiblings);\r\n const instanceData = widgetInstanceMap.get(instance);\r\n instanceData.invalidate = () => {\r\n instanceData.dirty = true;\r\n if (instanceData.rendering === false) {\r\n projectorState.renderQueue.push({ instance, depth: projectionOptions.depth });\r\n scheduleRender(projectionOptions);\r\n }\r\n };\r\n instanceData.rendering = true;\r\n instance.__setCoreProperties__(dnode.coreProperties);\r\n instance.__setChildren__(dnode.children);\r\n instance.__setProperties__(dnode.properties);\r\n const rendered = instance.__render__();\r\n instanceData.rendering = false;\r\n if (rendered) {\r\n const filteredRendered = filterAndDecorateChildren(rendered, instance);\r\n dnode.rendered = filteredRendered;\r\n addChildren(parentVNode, filteredRendered, projectionOptions, instance, insertBefore, childNodes);\r\n }\r\n instanceMap.set(instance, { dnode, parentVNode });\r\n instanceData.nodeHandler.addRoot();\r\n projectorState.afterRenderCallbacks.push(() => {\r\n instanceData.onAttach();\r\n });\r\n }\r\n else {\r\n if (projectorState.merge && projectorState.mergeElement !== undefined) {\r\n domNode = dnode.domNode = projectionOptions.mergeElement;\r\n projectorState.mergeElement = undefined;\r\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\r\n return;\r\n }\r\n const doc = parentVNode.domNode.ownerDocument;\r\n if (!dnode.tag && typeof dnode.text === 'string') {\r\n if (dnode.domNode !== undefined && parentVNode.domNode) {\r\n const newDomNode = dnode.domNode.ownerDocument.createTextNode(dnode.text);\r\n if (parentVNode.domNode === dnode.domNode.parentNode) {\r\n parentVNode.domNode.replaceChild(newDomNode, dnode.domNode);\r\n }\r\n else {\r\n parentVNode.domNode.appendChild(newDomNode);\r\n dnode.domNode.parentNode && dnode.domNode.parentNode.removeChild(dnode.domNode);\r\n }\r\n dnode.domNode = newDomNode;\r\n }\r\n else {\r\n domNode = dnode.domNode = doc.createTextNode(dnode.text);\r\n if (insertBefore !== undefined) {\r\n parentVNode.domNode.insertBefore(domNode, insertBefore);\r\n }\r\n else {\r\n parentVNode.domNode.appendChild(domNode);\r\n }\r\n }\r\n }\r\n else {\r\n if (dnode.domNode === undefined) {\r\n if (dnode.tag === 'svg') {\r\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\r\n }\r\n if (projectionOptions.namespace !== undefined) {\r\n domNode = dnode.domNode = doc.createElementNS(projectionOptions.namespace, dnode.tag);\r\n }\r\n else {\r\n domNode = dnode.domNode = dnode.domNode || doc.createElement(dnode.tag);\r\n }\r\n }\r\n else {\r\n domNode = dnode.domNode;\r\n }\r\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\r\n if (insertBefore !== undefined) {\r\n parentVNode.domNode.insertBefore(domNode, insertBefore);\r\n }\r\n else if (domNode.parentNode !== parentVNode.domNode) {\r\n parentVNode.domNode.appendChild(domNode);\r\n }\r\n }\r\n }\r\n}\r\nfunction updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance, oldNextSiblings, nextSiblings) {\r\n if (isWNode(dnode)) {\r\n const { instance } = previous;\r\n const { parentVNode, dnode: node } = instanceMap.get(instance);\r\n const previousRendered = node ? node.rendered : previous.rendered;\r\n const instanceData = widgetInstanceMap.get(instance);\r\n instanceData.rendering = true;\r\n instance.__setCoreProperties__(dnode.coreProperties);\r\n instance.__setChildren__(dnode.children);\r\n instance.__setProperties__(dnode.properties);\r\n nextSiblingMap.set(instance, nextSiblings);\r\n dnode.instance = instance;\r\n if (instanceData.dirty === true) {\r\n const rendered = instance.__render__();\r\n instanceData.rendering = false;\r\n dnode.rendered = filterAndDecorateChildren(rendered, instance);\r\n updateChildren(parentVNode, oldNextSiblings, previousRendered, dnode.rendered, instance, projectionOptions);\r\n }\r\n else {\r\n instanceData.rendering = false;\r\n dnode.rendered = previousRendered;\r\n }\r\n instanceMap.set(instance, { dnode, parentVNode });\r\n instanceData.nodeHandler.addRoot();\r\n }\r\n else {\r\n if (previous === dnode) {\r\n return false;\r\n }\r\n const domNode = (dnode.domNode = previous.domNode);\r\n let textUpdated = false;\r\n let updated = false;\r\n if (!dnode.tag && typeof dnode.text === 'string') {\r\n if (dnode.text !== previous.text) {\r\n const newDomNode = domNode.ownerDocument.createTextNode(dnode.text);\r\n domNode.parentNode.replaceChild(newDomNode, domNode);\r\n dnode.domNode = newDomNode;\r\n textUpdated = true;\r\n return textUpdated;\r\n }\r\n }\r\n else {\r\n if (dnode.tag && dnode.tag.lastIndexOf('svg', 0) === 0) {\r\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\r\n }\r\n if (previous.children !== dnode.children) {\r\n const children = filterAndDecorateChildren(dnode.children, parentInstance);\r\n dnode.children = children;\r\n updated =\r\n updateChildren(dnode, oldNextSiblings, previous.children, children, parentInstance, projectionOptions) || updated;\r\n }\r\n const previousProperties = buildPreviousProperties(domNode, previous, dnode);\r\n if (dnode.attributes && dnode.events) {\r\n updateAttributes(domNode, previousProperties.attributes, dnode.attributes, projectionOptions);\r\n updated =\r\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions, false) || updated;\r\n removeOrphanedEvents(domNode, previousProperties.events, dnode.events, projectionOptions, true);\r\n const events = dnode.events;\r\n Object.keys(events).forEach((event) => {\r\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind, previousProperties.events[event]);\r\n });\r\n }\r\n else {\r\n updated =\r\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions) ||\r\n updated;\r\n }\r\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\r\n const instanceData = widgetInstanceMap.get(parentInstance);\r\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\r\n }\r\n }\r\n if (updated && dnode.properties && dnode.properties.updateAnimation) {\r\n dnode.properties.updateAnimation(domNode, dnode.properties, previous.properties);\r\n }\r\n }\r\n}\r\nfunction addDeferredProperties(vnode, projectionOptions) {\r\n // transfer any properties that have been passed - as these must be decorated properties\r\n vnode.decoratedDeferredProperties = vnode.properties;\r\n const properties = vnode.deferredPropertiesCallback(!!vnode.inserted);\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n vnode.properties = Object.assign({}, properties, vnode.decoratedDeferredProperties);\r\n projectorState.deferredRenderCallbacks.push(() => {\r\n const properties = Object.assign({}, vnode.deferredPropertiesCallback(!!vnode.inserted), vnode.decoratedDeferredProperties);\r\n updateProperties(vnode.domNode, vnode.properties, properties, projectionOptions);\r\n vnode.properties = properties;\r\n });\r\n}\r\nfunction runDeferredRenderCallbacks(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectorState.deferredRenderCallbacks.length) {\r\n if (projectionOptions.sync) {\r\n while (projectorState.deferredRenderCallbacks.length) {\r\n const callback = projectorState.deferredRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n }\r\n else {\r\n global.requestAnimationFrame(() => {\r\n while (projectorState.deferredRenderCallbacks.length) {\r\n const callback = projectorState.deferredRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n }\r\n}\r\nfunction runAfterRenderCallbacks(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectionOptions.sync) {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n }\r\n else {\r\n if (global.requestIdleCallback) {\r\n global.requestIdleCallback(() => {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n else {\r\n setTimeout(() => {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n }\r\n}\r\nfunction scheduleRender(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectionOptions.sync) {\r\n render(projectionOptions);\r\n }\r\n else if (projectorState.renderScheduled === undefined) {\r\n projectorState.renderScheduled = global.requestAnimationFrame(() => {\r\n render(projectionOptions);\r\n });\r\n }\r\n}\r\nfunction render(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectorState.renderScheduled = undefined;\r\n const renderQueue = projectorState.renderQueue;\r\n const renders = [...renderQueue];\r\n projectorState.renderQueue = [];\r\n renders.sort((a, b) => a.depth - b.depth);\r\n const previouslyRendered = [];\r\n while (renders.length) {\r\n const { instance } = renders.shift();\r\n if (instanceMap.has(instance) && previouslyRendered.indexOf(instance) === -1) {\r\n previouslyRendered.push(instance);\r\n const { parentVNode, dnode } = instanceMap.get(instance);\r\n const instanceData = widgetInstanceMap.get(instance);\r\n const nextSiblings = nextSiblingMap.get(instance);\r\n updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance, nextSiblings, nextSiblings);\r\n }\r\n }\r\n runAfterRenderCallbacks(projectionOptions);\r\n runDeferredRenderCallbacks(projectionOptions);\r\n}\r\nexport const dom = {\r\n append: function (parentNode, instance, projectionOptions = {}) {\r\n const instanceData = widgetInstanceMap.get(instance);\r\n const finalProjectorOptions = getProjectionOptions(projectionOptions, instance);\r\n const projectorState = {\r\n afterRenderCallbacks: [],\r\n deferredRenderCallbacks: [],\r\n nodeMap: new WeakMap(),\r\n renderScheduled: undefined,\r\n renderQueue: [],\r\n merge: projectionOptions.merge || false,\r\n mergeElement: projectionOptions.mergeElement\r\n };\r\n projectorStateMap.set(instance, projectorState);\r\n finalProjectorOptions.rootNode = parentNode;\r\n const parentVNode = toParentVNode(finalProjectorOptions.rootNode);\r\n const node = toInternalWNode(instance, instanceData);\r\n instanceMap.set(instance, { dnode: node, parentVNode });\r\n instanceData.invalidate = () => {\r\n instanceData.dirty = true;\r\n if (instanceData.rendering === false) {\r\n projectorState.renderQueue.push({ instance, depth: finalProjectorOptions.depth });\r\n scheduleRender(finalProjectorOptions);\r\n }\r\n };\r\n updateDom(node, node, finalProjectorOptions, parentVNode, instance, [], []);\r\n projectorState.afterRenderCallbacks.push(() => {\r\n instanceData.onAttach();\r\n });\r\n runDeferredRenderCallbacks(finalProjectorOptions);\r\n runAfterRenderCallbacks(finalProjectorOptions);\r\n return {\r\n domNode: finalProjectorOptions.rootNode\r\n };\r\n },\r\n create: function (instance, projectionOptions) {\r\n return this.append(document.createElement('div'), instance, projectionOptions);\r\n },\r\n merge: function (element, instance, projectionOptions = {}) {\r\n projectionOptions.merge = true;\r\n projectionOptions.mergeElement = element;\r\n const projection = this.append(element.parentNode, instance, projectionOptions);\r\n const projectorState = projectorStateMap.get(instance);\r\n projectorState.merge = false;\r\n return projection;\r\n }\r\n};\r\n//# sourceMappingURL=vdom.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/vdom.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/vdom.mjs\n// module chunks = menu-item","/*** IMPORTS FROM imports-loader ***/\nvar widgetFactory = require(\"src/menu-item/MenuItem\");\n\nvar registerCustomElement = require('@dojo/framework/widget-core/registerCustomElement').default;\r\n\r\nvar defaultExport = widgetFactory.default;\r\ndefaultExport && registerCustomElement(defaultExport);\r\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/imports-loader?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js\n// module id = ./node_modules/imports-loader/index.js?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js\n// module chunks = menu-item","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/process/browser.js\n// module id = ./node_modules/process/browser.js\n// module chunks = menu-item","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)\r\n t[p[i]] = s[p[i]];\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = y[op[0] & 2 ? \"return\" : op[0] ? \"throw\" : \"next\"]) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [0, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { if (o[n]) i[n] = function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; }; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator];\r\n return m ? m.call(o) : typeof __values === \"function\" ? __values(o) : o[Symbol.iterator]();\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/tslib/tslib.es6.js\n// module id = ./node_modules/tslib/tslib.es6.js\n// module chunks = menu-item","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\n} catch(e) {\n\t// This works if the window reference is available\n\tif(typeof window === \"object\")\n\t\tg = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = ./node_modules/webpack/buildin/global.js\n// module chunks = menu-item","import { v } from '@dojo/framework/widget-core/d';\r\nimport { customElement } from '@dojo/framework/widget-core/decorators/customElement';\r\nimport { WidgetProperties } from '@dojo/framework/widget-core/interfaces';\r\nimport { theme, ThemedMixin } from '@dojo/framework/widget-core/mixins/Themed';\r\nimport { WidgetBase } from '@dojo/framework/widget-core/WidgetBase';\r\n\r\nimport * as css from './menuItem.m.css';\r\n\r\nexport interface MenuItemProperties extends WidgetProperties {\r\n\ttitle: string;\r\n\tselected?: boolean;\r\n\tdata?: any;\r\n\tonSelected?: (data: any) => void;\r\n}\r\n\r\n@customElement({\r\n\ttag: 'demo-menu-item',\r\n\tattributes: ['title', 'selected'],\r\n\tevents: ['onSelected'],\r\n\tproperties: ['data', 'selected']\r\n})\r\n@theme(css)\r\nexport class MenuItem extends ThemedMixin(WidgetBase) {\r\n\tprivate _onClick() {\r\n\t\tthis.properties.onSelected && this.properties.onSelected(this.properties.data);\r\n\t}\r\n\r\n\tprotected render() {\r\n\t\tconst { title, selected } = this.properties;\r\n\r\n\t\treturn v('li', { classes: this.theme(css.root) }, [\r\n\t\t\tv(\r\n\t\t\t\t'span',\r\n\t\t\t\t{\r\n\t\t\t\t\tclasses: this.theme([css.item, selected ? css.selected : null]),\r\n\t\t\t\t\tonclick: this._onClick\r\n\t\t\t\t},\r\n\t\t\t\t[title]\r\n\t\t\t)\r\n\t\t]);\r\n\t}\r\n}\r\n\r\nexport default MenuItem;\r\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@dojo/webpack-contrib/css-module-dts-loader?type=ts&instanceName=0_menu-item!./src/menu-item/MenuItem.ts","// removed by extract-text-webpack-plugin\nmodule.exports = {\" _key\":\"test-app/menuItem\",\"root\":\"sUmUi4Sh\",\"item\":\"_2Mk6Rdqa\",\"selected\":\"_1-f3ItOh\"};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/menu-item/menuItem.m.css\n// module id = ./src/menu-item/menuItem.m.css\n// module chunks = menu-item"],"sourceRoot":""} \ No newline at end of file diff --git a/test-app/fixtures/windows/dist/menu/menu-1.0.0.js b/test-app/fixtures/windows/dist/menu/menu-1.0.0.js index 7d7e6dc..56bbb6d 100644 --- a/test-app/fixtures/windows/dist/menu/menu-1.0.0.js +++ b/test-app/fixtures/windows/dist/menu/menu-1.0.0.js @@ -6,7 +6,7 @@ * All rights reserved * */ -!function(e){var t={};function o(r){if(t[r])return t[r].exports;var s=t[r]={i:r,l:!1,exports:{}};return e[r].call(s.exports,s,s.exports,o),s.l=!0,s.exports}o.m=e,o.c=t,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}({"./node_modules/@dojo/core/Destroyable.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/core/lang.mjs"),s=o("./node_modules/@dojo/shim/Promise.mjs");function n(){return s.a.resolve(!1)}function i(){throw new Error("Call made to destroyed method")}class d{constructor(){this.handles=[]}own(e){const t=Array.isArray(e)?Object(r.b)(...e):e,{handles:o}=this;return o.push(t),{destroy(){o.splice(o.indexOf(t)),t.destroy()}}}destroy(){return new s.a(e=>{this.handles.forEach(e=>{e&&e.destroy&&e.destroy()}),this.destroy=n,this.own=i,e(!0)})}}t.a=d},"./node_modules/@dojo/core/Evented.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/Map.mjs"),s=o("./node_modules/@dojo/core/Destroyable.mjs");const n=new r.b;class i extends s.a{constructor(){super(...arguments),this.listenersMap=new r.b}emit(e){this.listenersMap.forEach((t,o)=>{(function(e,t){if("string"==typeof t&&"string"==typeof e&&-1!==e.indexOf("*")){let o;return n.has(e)?o=n.get(e):(o=new RegExp(`^${e.replace(/\*/g,".*")}$`),n.set(e,o)),o.test(t)}return e===t})(o,e.type)&&t.forEach(t=>{t.call(this,e)})})}on(e,t){if(Array.isArray(t)){const o=t.map(t=>this._addListener(e,t));return{destroy(){o.forEach(e=>e.destroy())}}}return this._addListener(e,t)}_addListener(e,t){const o=this.listenersMap.get(e)||[];return o.push(t),this.listenersMap.set(e,o),{destroy:()=>{const o=this.listenersMap.get(e)||[];o.splice(o.indexOf(t),1)}}}}t.a=i},"./node_modules/@dojo/core/lang.mjs":function(e,t,o){"use strict";t.b=function(...e){return function(e){let t=!1;return{destroy:function(){t||(t=!0,e())}}}(function(){for(let t=0;t{r[e]=t,delete n[e]},()=>{delete n[e]})}function u(e){let t;const o=e.toLowerCase();if(o in a)t=a[o];else if(s[o])t=r[o]=s[o].call(null),delete s[o];else{if(!(o in r)){if(e in n)return!1;throw new TypeError(`Attempt to detect unregistered has feature "${e}"`)}t=r[o]}return t}c("debug",!0),c("host-browser","undefined"!=typeof document&&"undefined"!=typeof location),c("host-node",function(){if("object"==typeof o&&o.versions&&o.versions.node)return o.versions.node})}).call(t,o("./node_modules/webpack/buildin/global.js"),o("./node_modules/process/browser.js"))},"./node_modules/@dojo/shim/Map.mjs":function(e,t,o){"use strict";o.d(t,"a",function(){return s});o("./node_modules/@dojo/shim/iterator.mjs");var r=o("./node_modules/@dojo/shim/global.mjs");o("./node_modules/@dojo/shim/object.mjs"),o("./node_modules/@dojo/shim/support/has.mjs"),o("./node_modules/@dojo/shim/Symbol.mjs");let s=r.a.Map;t.b=s},"./node_modules/@dojo/shim/Promise.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/global.mjs");o("./node_modules/@dojo/shim/support/queue.mjs"),o("./node_modules/@dojo/shim/Symbol.mjs"),o("./node_modules/@dojo/shim/support/has.mjs");let s=r.a.Promise;t.a=s},"./node_modules/@dojo/shim/Symbol.mjs":function(e,t,o){"use strict";o("./node_modules/@dojo/shim/support/has.mjs");var r=o("./node_modules/@dojo/shim/global.mjs"),s=o("./node_modules/@dojo/shim/support/util.mjs");let n=r.a.Symbol;["hasInstance","isConcatSpreadable","iterator","species","replace","search","split","match","toPrimitive","toStringTag","unscopables","observable"].forEach(e=>{n[e]||Object.defineProperty(n,e,Object(s.a)(n.for(e),!1,!1))}),t.a=n},"./node_modules/@dojo/shim/WeakMap.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/global.mjs");o("./node_modules/@dojo/shim/iterator.mjs"),o("./node_modules/@dojo/shim/support/has.mjs"),o("./node_modules/@dojo/shim/Symbol.mjs");let s=r.a.WeakMap;t.a=s},"./node_modules/@dojo/shim/array.mjs":function(e,t,o){"use strict";o.d(t,"a",function(){return n});var r=o("./node_modules/@dojo/shim/global.mjs"),s=(o("./node_modules/@dojo/shim/iterator.mjs"),o("./node_modules/@dojo/shim/number.mjs"),o("./node_modules/@dojo/shim/support/has.mjs"),o("./node_modules/@dojo/shim/support/util.mjs"));let n,i,d,a,c,u,l;n=r.a.Array.from,i=r.a.Array.of,d=Object(s.b)(r.a.Array.prototype.copyWithin),a=Object(s.b)(r.a.Array.prototype.fill),c=Object(s.b)(r.a.Array.prototype.find),u=Object(s.b)(r.a.Array.prototype.findIndex),l=Object(s.b)(r.a.Array.prototype.includes)},"./node_modules/@dojo/shim/global.mjs":function(e,t,o){"use strict";(function(e){const o=void 0!==e?e:"undefined"!=typeof window?window:"undefined"!=typeof self?self:void 0;t.a=o}).call(t,o("./node_modules/webpack/buildin/global.js"))},"./node_modules/@dojo/shim/iterator.mjs":function(e,t,o){"use strict";o("./node_modules/@dojo/shim/Symbol.mjs"),o("./node_modules/@dojo/shim/string.mjs")},"./node_modules/@dojo/shim/number.mjs":function(e,t,o){"use strict";o("./node_modules/@dojo/shim/global.mjs");Math.pow(2,53)},"./node_modules/@dojo/shim/object.mjs":function(e,t,o){"use strict";o.d(t,"a",function(){return s});var r=o("./node_modules/@dojo/shim/global.mjs");o("./node_modules/@dojo/shim/support/has.mjs"),o("./node_modules/@dojo/shim/Symbol.mjs");let s,n,i,d,a,c,u,l,h;{const e=r.a.Object;s=e.assign,n=e.getOwnPropertyDescriptor,i=e.getOwnPropertyNames,d=e.getOwnPropertySymbols,a=e.is,c=e.keys}{const e=r.a.Object;u=e.getOwnPropertyDescriptors,l=e.entries,h=e.values}},"./node_modules/@dojo/shim/string.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/global.mjs"),s=(o("./node_modules/@dojo/shim/support/has.mjs"),o("./node_modules/@dojo/shim/support/util.mjs"));t.b=55296;t.a=56319;let n,i,d,a,c,u,l,h,p,m;n=r.a.String.fromCodePoint,i=r.a.String.raw,d=Object(s.b)(r.a.String.prototype.codePointAt),a=Object(s.b)(r.a.String.prototype.endsWith),c=Object(s.b)(r.a.String.prototype.includes),u=Object(s.b)(r.a.String.prototype.normalize),l=Object(s.b)(r.a.String.prototype.repeat),h=Object(s.b)(r.a.String.prototype.startsWith),p=Object(s.b)(r.a.String.prototype.padEnd),m=Object(s.b)(r.a.String.prototype.padStart)},"./node_modules/@dojo/shim/support/has.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/has/has.mjs"),s=o("./node_modules/@dojo/shim/global.mjs");r.b;Object(r.a)("es6-array",()=>["from","of"].every(e=>e in s.a.Array)&&["findIndex","find","copyWithin"].every(e=>e in s.a.Array.prototype),!0),Object(r.a)("es6-array-fill",()=>"fill"in s.a.Array.prototype&&1===[1].fill(9,Number.POSITIVE_INFINITY)[0],!0),Object(r.a)("es7-array",()=>"includes"in s.a.Array.prototype,!0),Object(r.a)("es6-map",()=>{if("function"==typeof s.a.Map)try{const e=new s.a.Map([[0,1]]);return e.has(0)&&"function"==typeof e.keys&&"function"==typeof e.values&&"function"==typeof e.entries}catch(e){return!1}return!1},!0),Object(r.a)("es6-math",()=>["clz32","sign","log10","log2","log1p","expm1","cosh","sinh","tanh","acosh","asinh","atanh","trunc","fround","cbrt","hypot"].every(e=>"function"==typeof s.a.Math[e]),!0),Object(r.a)("es6-math-imul",()=>"imul"in s.a.Math&&-5===Math.imul(4294967295,5),!0),Object(r.a)("es6-object",()=>["assign","is","getOwnPropertySymbols","setPrototypeOf"].every(e=>"function"==typeof s.a.Object[e]),!0),Object(r.a)("es2017-object",()=>["values","entries","getOwnPropertyDescriptors"].every(e=>"function"==typeof s.a.Object[e]),!0),Object(r.a)("es-observable",()=>void 0!==s.a.Observable,!0),Object(r.a)("es6-promise",()=>void 0!==s.a.Promise&&!0,!0),Object(r.a)("es6-set",()=>{if("function"==typeof s.a.Set){const e=new s.a.Set([1]);return e.has(1)&&"keys"in e&&"function"==typeof e.keys&&!0}return!1},!0),Object(r.a)("es6-string",()=>["fromCodePoint"].every(e=>"function"==typeof s.a.String[e])&&["codePointAt","normalize","repeat","startsWith","endsWith","includes"].every(e=>"function"==typeof s.a.String.prototype[e]),!0),Object(r.a)("es6-string-raw",()=>{function e(e,...t){const o=[...e];return o.raw=e.raw,o}if("raw"in s.a.String){let t=e`a\n${1}`;return t.raw=["a\\n"],"a:\\n"===s.a.String.raw(t,42)}return!1},!0),Object(r.a)("es2017-string",()=>["padStart","padEnd"].every(e=>"function"==typeof s.a.String.prototype[e]),!0),Object(r.a)("es6-symbol",()=>void 0!==s.a.Symbol&&"symbol"==typeof Symbol(),!0),Object(r.a)("es6-weakmap",()=>{if(void 0!==s.a.WeakMap){const e={},t={},o=new s.a.WeakMap([[e,1]]);return Object.freeze(e),1===o.get(e)&&o.set(t,2)===o&&!0}return!1},!0),Object(r.a)("microtasks",()=>!0,!0),Object(r.a)("postmessage",()=>void 0!==s.a.window&&"function"==typeof s.a.postMessage,!0),Object(r.a)("raf",()=>"function"==typeof s.a.requestAnimationFrame,!0),Object(r.a)("setimmediate",()=>void 0!==s.a.setImmediate,!0),Object(r.a)("dom-mutationobserver",()=>{if(Boolean(s.a.MutationObserver||s.a.WebKitMutationObserver)){const e=document.createElement("div"),t=new(s.a.MutationObserver||s.a.WebKitMutationObserver)(function(){});return t.observe(e,{attributes:!0}),e.style.setProperty("display","block"),Boolean(t.takeRecords().length)}return!1},!0),Object(r.a)("dom-webanimation",()=>void 0!==s.a.Animation&&void 0!==s.a.KeyframeEffect,!0)},"./node_modules/@dojo/shim/support/queue.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/global.mjs");o("./node_modules/@dojo/shim/support/has.mjs");function s(e){e&&e.isActive&&e.callback&&e.callback()}function n(e,t){return{destroy:function(){this.destroy=function(){},e.isActive=!1,e.callback=null,t&&t()}}}!function(){let e,t;{const e=[];r.a.addEventListener("message",function(t){t.source===r.a&&"dojo-queue-message"===t.data&&(t.stopPropagation(),e.length&&s(e.shift()))}),t=function(t){e.push(t),r.a.postMessage("dojo-queue-message","*")}}function o(o){const r={isActive:!0,callback:o},s=t(r);return n(r,e&&function(){e(s)})}}();!function(){function e(e){const t={isActive:!0,callback:e},o=requestAnimationFrame(s.bind(null,t));return n(t,function(){cancelAnimationFrame(o)})}}();!function(){let e;e=function(e){r.a.Promise.resolve(e).then(s)}}()},"./node_modules/@dojo/shim/support/util.mjs":function(e,t,o){"use strict";t.a=function(e,t=!1,o=!0,r=!0){return{value:e,enumerable:t,writable:o,configurable:r}},t.b=function(e){return function(t,...o){return e.apply(t,o)}}},"./node_modules/@dojo/widget-core/Injector.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/core/Evented.mjs");class s extends r.a{constructor(e){super(),this._payload=e}setInvalidator(e){this._invalidator=e}get(){return this._payload}set(e){this._payload=e,this._invalidator&&this._invalidator()}}t.a=s},"./node_modules/@dojo/widget-core/NodeHandler.mjs":function(e,t,o){"use strict";var r,s=o("./node_modules/@dojo/core/Evented.mjs"),n=o("./node_modules/@dojo/shim/Map.mjs");!function(e){e.Projector="Projector",e.Widget="Widget"}(r||(r={}));t.a=class extends s.a{constructor(){super(...arguments),this._nodeMap=new n.b}get(e){return this._nodeMap.get(e)}has(e){return this._nodeMap.has(e)}add(e,t){this._nodeMap.set(t,e),this.emit({type:t})}addRoot(){this.emit({type:r.Widget})}addProjector(){this.emit({type:r.Projector})}clear(){this._nodeMap.clear()}}},"./node_modules/@dojo/widget-core/Registry.mjs":function(e,t,o){"use strict";t.d=a;var r=o("./node_modules/@dojo/shim/Promise.mjs"),s=o("./node_modules/@dojo/shim/Map.mjs"),n=o("./node_modules/@dojo/shim/Symbol.mjs"),i=o("./node_modules/@dojo/core/Evented.mjs");const d=Object(n.a)("Widget Base");function a(e){return Boolean(e&&e._type===d)}t.b=d;class c extends i.a{emitLoadedEvent(e,t){this.emit({type:e,action:"loaded",item:t})}define(e,t){if(void 0===this._widgetRegistry&&(this._widgetRegistry=new s.b),this._widgetRegistry.has(e))throw new Error(`widget has already been registered for '${e.toString()}'`);this._widgetRegistry.set(e,t),t instanceof r.a?t.then(t=>(this._widgetRegistry.set(e,t),this.emitLoadedEvent(e,t),t),e=>{throw e}):a(t)&&this.emitLoadedEvent(e,t)}defineInjector(e,t){if(void 0===this._injectorRegistry&&(this._injectorRegistry=new s.b),this._injectorRegistry.has(e))throw new Error(`injector has already been registered for '${e.toString()}'`);const o=new i.a,r={injector:t(()=>o.emit({type:"invalidate"})),invalidator:o};this._injectorRegistry.set(e,r),this.emitLoadedEvent(e,r)}get(e){if(!this._widgetRegistry||!this.has(e))return null;const t=this._widgetRegistry.get(e);if(a(t))return t;if(t instanceof r.a)return null;const o=t();return this._widgetRegistry.set(e,o),o.then(t=>((function(e){return Boolean(e&&e.hasOwnProperty("__esModule")&&e.hasOwnProperty("default")&&a(e.default))})(t)&&(t=t.default),this._widgetRegistry.set(e,t),this.emitLoadedEvent(e,t),t),e=>{throw e}),null}getInjector(e){return this._injectorRegistry&&this.hasInjector(e)?this._injectorRegistry.get(e):null}has(e){return Boolean(this._widgetRegistry&&this._widgetRegistry.has(e))}hasInjector(e){return Boolean(this._injectorRegistry&&this._injectorRegistry.has(e))}}t.a=c,t.c=c},"./node_modules/@dojo/widget-core/RegistryHandler.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/Map.mjs"),s=o("./node_modules/@dojo/core/Evented.mjs"),n=o("./node_modules/@dojo/widget-core/Registry.mjs");t.a=class extends s.a{constructor(){super(),this._registry=new n.a,this._registryWidgetLabelMap=new r.a,this._registryInjectorLabelMap=new r.a,this.own(this._registry),this.own({destroy:()=>{this.baseRegistry&&(this._registryWidgetLabelMap.delete(this.baseRegistry),this._registryInjectorLabelMap.delete(this.baseRegistry),this.baseRegistry=void 0)}})}set base(e){this.baseRegistry&&(this._registryWidgetLabelMap.delete(this.baseRegistry),this._registryInjectorLabelMap.delete(this.baseRegistry)),this.baseRegistry=e}define(e,t){this._registry.define(e,t)}defineInjector(e,t){this._registry.defineInjector(e,t)}has(e){return this._registry.has(e)||Boolean(this.baseRegistry&&this.baseRegistry.has(e))}hasInjector(e){return this._registry.hasInjector(e)||Boolean(this.baseRegistry&&this.baseRegistry.hasInjector(e))}get(e,t=!1){return this._get(e,t,"get",this._registryWidgetLabelMap)}getInjector(e,t=!1){return this._get(e,t,"getInjector",this._registryInjectorLabelMap)}_get(e,t,o,r){const s=t?[this.baseRegistry,this._registry]:[this._registry,this.baseRegistry];for(let n=0;n{"loaded"===r.action&&this[o](e,t)===r.item&&this.emit({type:"invalidate"})});this.own(s),r.set(i,[...a,e])}}return null}}},"./node_modules/@dojo/widget-core/WidgetBase.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/Map.mjs"),s=o("./node_modules/@dojo/shim/WeakMap.mjs"),n=o("./node_modules/@dojo/shim/Symbol.mjs"),i=o("./node_modules/@dojo/widget-core/d.mjs"),d=o("./node_modules/@dojo/widget-core/diff.mjs"),a=o("./node_modules/@dojo/widget-core/RegistryHandler.mjs"),c=o("./node_modules/@dojo/widget-core/NodeHandler.mjs"),u=o("./node_modules/@dojo/widget-core/vdom.mjs"),l=o("./node_modules/@dojo/widget-core/Registry.mjs");const h=new r.b,p=d.a.bind(null),m=n.a.for("dojoNoBind");t.b=m;class f{constructor(){this._initialProperties=!0,this._changedPropertyKeys=[],this._nodeHandler=new c.a,this._handles=[],this._children=[],this._decoratorCache=new r.b,this._properties={},this._boundRenderFunc=this.render.bind(this),this._boundInvalidate=this.invalidate.bind(this),u.b.set(this,{dirty:!0,onAttach:()=>{this.onAttach()},onDetach:()=>{this.onDetach(),this.destroy()},nodeHandler:this._nodeHandler,registry:()=>this.registry,coreProperties:{},rendering:!1,inputProperties:{}}),this._runAfterConstructors()}meta(e){void 0===this._metaMap&&(this._metaMap=new r.b);let t=this._metaMap.get(e);return t||(t=new e({invalidate:this._boundInvalidate,nodeHandler:this._nodeHandler,bind:this}),this.own(t),this._metaMap.set(e,t)),t}onAttach(){}onDetach(){}get properties(){return this._properties}get changedPropertyKeys(){return[...this._changedPropertyKeys]}__setCoreProperties__(e){const{baseRegistry:t}=e,o=u.b.get(this);o.coreProperties.baseRegistry!==t&&(void 0===this._registry&&(this._registry=new a.a,this.own(this._registry),this.own(this._registry.on("invalidate",this._boundInvalidate))),this._registry.base=t,this.invalidate()),o.coreProperties=e}__setProperties__(e){const t=u.b.get(this);t.inputProperties=e;const o=this._runBeforeProperties(e),r=this.getDecorator("registeredDiffProperty"),s=[],n=Object.keys(o);if(!1===this._initialProperties||0!==r.length){const e=[...n,...Object.keys(this._properties)],i=[],d={};let a=!1;for(let n=0;n{e.changed&&t.call(this,e.previousProperties,e.newProperties)}),this._properties=d,this._changedPropertyKeys=s}else{this._initialProperties=!1;for(let e=0;e0&&this.invalidate()}get children(){return this._children}__setChildren__(e){(this._children.length>0||e.length>0)&&(this._children=e,this.invalidate())}__render__(){u.b.get(this).dirty=!1;let e=this._runBeforeRenders()();return e=this.runAfterRenders(e),this._nodeHandler.clear(),e}invalidate(){const e=u.b.get(this);e.invalidate&&e.invalidate()}render(){return Object(i.g)("div",{},this.children)}addDecorator(e,t){if(t=Array.isArray(t)?t:[t],this.hasOwnProperty("constructor")){let o=h.get(this.constructor);o||(o=new r.b,h.set(this.constructor,o));let s=o.get(e);s||(s=[],o.set(e,s)),s.push(...t)}else{const o=this.getDecorator(e);this._decoratorCache.set(e,[...o,...t])}}_buildDecoratorList(e){const t=[];let o=this.constructor;for(;o;){const r=h.get(o);if(r){const o=r.get(e);o&&t.unshift(...o)}o=Object.getPrototypeOf(o)}return t}getDecorator(e){let t=this._decoratorCache.get(e);return void 0!==t?t:(t=this._buildDecoratorList(e),this._decoratorCache.set(e,t),t)}_mapDiffPropertyReactions(e,t){return this.getDecorator("diffReaction").reduce((o,{reaction:r,propertyName:s})=>{let n=o.get(r);return void 0===n&&(n={previousProperties:{},newProperties:{},changed:!1}),n.previousProperties[s]=this._properties[s],n.newProperties[s]=e[s],-1!==t.indexOf(s)&&(n.changed=!0),o.set(r,n),o},new r.b)}_bindFunctionProperty(e,t){if("function"==typeof e&&!e[m]&&!1===Object(l.d)(e)){void 0===this._bindFunctionPropertyMap&&(this._bindFunctionPropertyMap=new s.a);const o=this._bindFunctionPropertyMap.get(e)||{};let{boundFunc:r,scope:n}=o;return void 0!==r&&n===t||(r=e.bind(t),this._bindFunctionPropertyMap.set(e,{boundFunc:r,scope:t})),r}return e}get registry(){return void 0===this._registry&&(this._registry=new a.a,this.own(this._registry),this.own(this._registry.on("invalidate",this._boundInvalidate))),this._registry}_runBeforeProperties(e){const t=this.getDecorator("beforeProperties");return t.length>0?t.reduce((e,t)=>Object.assign({},e,t.call(this,e)),Object.assign({},e)):e}_runBeforeRenders(){const e=this.getDecorator("beforeRender");return e.length>0?e.reduce((e,t)=>{const o=t.call(this,e,this._properties,this._children);return o||(console.warn("Render function not returned from beforeRender, using previous render"),e)},this._boundRenderFunc):this._boundRenderFunc}runAfterRenders(e){const t=this.getDecorator("afterRender");return t.length>0?t.reduce((e,t)=>t.call(this,e),e):(void 0!==this._metaMap&&this._metaMap.forEach(e=>{e.afterRender()}),e)}_runAfterConstructors(){const e=this.getDecorator("afterConstructor");e.length>0&&e.forEach(e=>e.call(this))}own(e){this._handles.push(e)}destroy(){for(;this._handles.length>0;){const e=this._handles.pop();e&&e.destroy()}}}t.a=f,f._type=l.b},"./node_modules/@dojo/widget-core/animations/cssTransitions.mjs":function(e,t,o){"use strict";let r="",s="";function n(e){""===s&&function(e){if("WebkitTransition"in e.style)r="webkitTransitionEnd",s="webkitAnimationEnd";else{if(!("transition"in e.style||"MozTransition"in e.style))throw new Error("Your browser is not supported");r="transitionend",s="animationend"}}(e)}function i(e,t,o){n(e);let i=!1,d=function(){i||(i=!0,e.removeEventListener(r,d),e.removeEventListener(s,d),o())};t(),e.addEventListener(s,d),e.addEventListener(r,d)}t.a={enter:function(e,t,o){const r=t.enterAnimationActive||`${o}-active`;i(e,()=>{e.classList.add(o),requestAnimationFrame(function(){e.classList.add(r)})},()=>{e.classList.remove(o),e.classList.remove(r)})},exit:function(e,t,o,r){const s=t.exitAnimationActive||`${o}-active`;i(e,()=>{e.classList.add(o),requestAnimationFrame(function(){e.classList.add(s)})},()=>{r()})}}},"./node_modules/@dojo/widget-core/d.mjs":function(e,t,o){"use strict";t.f=d,t.e=a,t.d=function(e){return Boolean(e&&"string"!=typeof e&&e.type===i)},t.h=function(e,t,o=[]){return{children:o,widgetConstructor:e,properties:t,type:s}},t.g=function(e,t={},o){let r,s=t;Array.isArray(t)&&(o=t,s={});"function"==typeof s&&(r=s,s={});return{tag:e,deferredPropertiesCallback:r,children:o,properties:s,type:n}},t.c=function({node:e,attrs:t={},props:o={},on:r={},diffType:s="none"},n){return{tag:c(e)?e.tagName.toLowerCase():"",properties:o,attributes:t,events:r,children:n,type:i,domNode:e,text:c(e)?void 0:e.data,diffType:s}};var r=o("./node_modules/@dojo/shim/Symbol.mjs");const s=Object(r.a)("Identifier for a WNode.");t.b=s;const n=Object(r.a)("Identifier for a VNode.");t.a=n;const i=Object(r.a)("Identifier for a VNode created using existing dom.");function d(e){return Boolean(e&&"string"!=typeof e&&e.type===s)}function a(e){return Boolean(e&&"string"!=typeof e&&(e.type===n||e.type===i))}function c(e){return!!e.tagName}},"./node_modules/@dojo/widget-core/decorators/afterRender.mjs":function(e,t,o){"use strict";t.a=s;var r=o("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs");function s(e){return Object(r.a)((t,o)=>{t.addDecorator("afterRender",o?t[o]:e)})}},"./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs":function(e,t,o){"use strict";t.a=n;var r=o("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"),s=o("./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs");function n(){return Object(r.a)((e,t)=>{Object(s.a)(function(){this.invalidate()})(e)})}},"./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs":function(e,t,o){"use strict";t.a=s;var r=o("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs");function s(e){return Object(r.a)((t,o)=>{t.addDecorator("beforeProperties",o?t[o]:e)})}},"./node_modules/@dojo/widget-core/decorators/customElement.mjs":function(e,t,o){"use strict";t.a=n;var r=o("./node_modules/@dojo/widget-core/registerCustomElement.mjs"),s=o("./node_modules/@dojo/widget-core/Registry.mjs");function n({tag:e,properties:t=[],attributes:o=[],events:n=[],childType:i=r.CustomElementChildType.DOJO,registryFactory:d=(()=>new s.c)}){return function(r){r.prototype.__customElementDescriptor={tagName:e,attributes:o,properties:t,events:n,childType:i,registryFactory:d}}}},"./node_modules/@dojo/widget-core/decorators/diffProperty.mjs":function(e,t,o){"use strict";t.a=s;var r=o("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs");function s(e,t,o){return Object(r.a)((r,s)=>{r.addDecorator(`diffProperty:${e}`,t.bind(null)),r.addDecorator("registeredDiffProperty",e),(o||s)&&r.addDecorator("diffReaction",{propertyName:e,reaction:s?r[s]:o})})}},"./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs":function(e,t,o){"use strict";function r(e){return function(t,o,r){"function"==typeof t?e(t.prototype,void 0):e(t,o)}}t.a=r},"./node_modules/@dojo/widget-core/decorators/inject.mjs":function(e,t,o){"use strict";t.a=d;var r=o("./node_modules/@dojo/shim/WeakMap.mjs"),s=o("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"),n=o("./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs");const i=new r.a;function d({name:e,getProperties:t}){return Object(s.a)((o,r)=>{Object(n.a)(function(o){const r=this.registry.getInjector(e);if(r){const{injector:e,invalidator:s}=r,n=i.get(this)||[];return 0===n.length&&i.set(this,n),-1===n.indexOf(r)&&(this.own(s.on("invalidate",()=>{this.invalidate()})),n.push(r)),t(e(),o)}})(o)})}},"./node_modules/@dojo/widget-core/diff.mjs":function(e,t,o){"use strict";t.b=i,t.a=function(e,t){let o;o="function"==typeof t?t._type===r.b?n(e,t):function(e,t){return{changed:!1,value:t}}(0,t):s(t)?i(e,t):n(e,t);return o};var r=o("./node_modules/@dojo/widget-core/Registry.mjs");function s(e){return"[object Object]"===Object.prototype.toString.call(e)||Array.isArray(e)}function n(e,t){return{changed:e!==t,value:t}}function i(e,t){let o=!1;const r=e&&s(e),n=t&&s(t);if(!r||!n)return{changed:!0,value:t};const i=Object.keys(e),d=Object.keys(t);return{changed:o=i.length!==d.length||d.some(o=>t[o]!==e[o]),value:t}}},"./node_modules/@dojo/widget-core/mixins/Projector.mjs":function(e,t,o){"use strict";t.a=l;var r,s,n=o("./node_modules/tslib/tslib.es6.js"),i=o("./node_modules/@dojo/core/lang.mjs"),d=o("./node_modules/@dojo/widget-core/animations/cssTransitions.mjs"),a=o("./node_modules/@dojo/widget-core/decorators/afterRender.mjs"),c=o("./node_modules/@dojo/widget-core/d.mjs"),u=o("./node_modules/@dojo/widget-core/vdom.mjs");function l(e){class t extends e{constructor(...e){super(...e),this._root=document.body,this._async=!0,this._projectorProperties={},this._projectionOptions={transitions:d.a},this.root=document.body,this.projectorState=r.Detached}append(e){const t={type:s.Append,root:e};return this._attach(t)}merge(e){const t={type:s.Merge,root:e};return this._attach(t)}set root(e){if(this.projectorState===r.Attached)throw new Error("Projector already attached, cannot change root element");this._root=e}get root(){return this._root}get async(){return this._async}set async(e){if(this.projectorState===r.Attached)throw new Error("Projector already attached, cannot change async mode");this._async=e}sandbox(e=document){if(this.projectorState===r.Attached)throw new Error("Projector already attached, cannot create sandbox");this._async=!1;const t=this.root;this.own({destroy:()=>{this._root=t}}),this._attach({root:e.createDocumentFragment(),type:s.Append})}setChildren(e){this.__setChildren__(e)}setProperties(e){this.__setProperties__(e)}__setProperties__(e){this._projectorProperties&&this._projectorProperties.registry!==e.registry&&this._projectorProperties.registry&&this._projectorProperties.registry.destroy(),this._projectorProperties=Object(i.a)({},e),super.__setCoreProperties__({bind:this,baseRegistry:e.registry}),super.__setProperties__(e)}toHtml(){if(this.projectorState!==r.Attached||!this._projection)throw new Error("Projector is not attached, cannot return an HTML string of projection.");return this._projection.domNode.childNodes[0].outerHTML}afterRender(e){let t=e;return"string"!=typeof e&&null!==e&&void 0!==e||(t=Object(c.g)("span",{},[e])),t}destroy(){super.destroy()}_attach({type:e,root:t}){if(t&&(this.root=t),this._attachHandle)return this._attachHandle;this.projectorState=r.Attached;const o={destroy:()=>{this.projectorState===r.Attached&&(this._projection=void 0,this.projectorState=r.Detached)}};switch(this.own(o),this._attachHandle=o,this._projectionOptions=Object.assign({},this._projectionOptions,{sync:!this._async}),e){case s.Append:this._projection=u.a.append(this.root,this,this._projectionOptions);break;case s.Merge:this._projection=u.a.merge(this.root,this,this._projectionOptions)}return this._attachHandle}}return n.a([Object(a.a)(),n.b("design:type",Function),n.b("design:paramtypes",[Object]),n.b("design:returntype",void 0)],t.prototype,"afterRender",null),t}!function(e){e[e.Attached=1]="Attached",e[e.Detached=2]="Detached"}(r||(r={})),function(e){e[e.Append=1]="Append",e[e.Merge=2]="Merge"}(s||(s={}))},"./node_modules/@dojo/widget-core/mixins/Themed.mjs":function(e,t,o){"use strict";t.c=function(e){return Object(i.a)(t=>{t.addDecorator("baseThemeClasses",e)})},t.b=function(e,t){const o=new s.a(e);return t.defineInjector(u,e=>(o.setInvalidator(e),()=>o.get())),o},t.a=l;var r=o("./node_modules/tslib/tslib.es6.js"),s=o("./node_modules/@dojo/widget-core/Injector.mjs"),n=o("./node_modules/@dojo/widget-core/decorators/inject.mjs"),i=o("./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs"),d=o("./node_modules/@dojo/widget-core/decorators/diffProperty.mjs"),a=o("./node_modules/@dojo/widget-core/diff.mjs");const c=" _key",u=Symbol("theme");function l(e){let t=class extends e{constructor(){super(...arguments),this._registeredBaseThemeKeys=[],this._recalculateClasses=!0,this._theme={}}theme(e){return this._recalculateClasses&&this._recalculateThemeClasses(),Array.isArray(e)?e.map(e=>this._getThemeClass(e)):this._getThemeClass(e)}onPropertiesChanged(){this._recalculateClasses=!0}_getThemeClass(e){if(void 0===e||null===e)return e;const t=this.properties.extraClasses||{},o=this._baseThemeClassesReverseLookup[e];let r=[];return o?(t[o]&&r.push(t[o]),this._theme[o]?r.push(this._theme[o]):r.push(this._registeredBaseTheme[o]),r.join(" ")):(console.warn(`Class name: '${e}' not found in theme`),null)}_recalculateThemeClasses(){const{theme:e={}}=this.properties,t=this.getDecorator("baseThemeClasses");this._registeredBaseTheme||(this._registeredBaseTheme=t.reduce((e,t)=>{const o=c,s=t[o],n=r.c(t,["symbol"==typeof o?o:o+""]);return this._registeredBaseThemeKeys.push(s),Object.assign({},e,n)},{}),this._baseThemeClassesReverseLookup=t.reduce((e,t)=>(Object.keys(t).forEach(o=>{e[t[o]]=o}),e),{})),this._theme=this._registeredBaseThemeKeys.reduce((t,o)=>Object.assign({},t,e[o]),{}),this._recalculateClasses=!1}};return r.a([Object(d.a)("theme",a.b),Object(d.a)("extraClasses",a.b),r.b("design:type",Function),r.b("design:paramtypes",[]),r.b("design:returntype",void 0)],t.prototype,"onPropertiesChanged",null),t=r.a([Object(n.a)({name:u,getProperties:(e,t)=>t.theme?{}:{theme:e}})],t)}},"./node_modules/@dojo/widget-core/registerCustomElement.mjs":function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),o.d(t,"CustomElementChildType",function(){return r}),t.DomToWidgetWrapper=h,t.create=p,t.register=m;var r,s=o("./node_modules/tslib/tslib.es6.js"),n=o("./node_modules/@dojo/widget-core/WidgetBase.mjs"),i=o("./node_modules/@dojo/widget-core/mixins/Projector.mjs"),d=o("./node_modules/@dojo/shim/array.mjs"),a=o("./node_modules/@dojo/widget-core/d.mjs"),c=o("./node_modules/@dojo/shim/global.mjs"),u=o("./node_modules/@dojo/widget-core/mixins/Themed.mjs"),l=o("./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs");function h(e){let t=class extends n.a{render(){const t=Object.keys(this.properties).reduce((e,t)=>{const o=this.properties[t];return 0===t.indexOf("on")&&(t=`__${t}`),e[t]=o,e},{});return Object(a.c)({node:e,props:t,diffType:"dom"})}static get domNode(){return e}};return t=s.a([Object(l.a)()],t)}function p(e,t){const{attributes:o,childType:s,registryFactory:l}=e,p={};return o.forEach(e=>{const t=e.toLowerCase();p[t]=e}),class extends HTMLElement{constructor(){super(...arguments),this._properties={},this._children=[],this._eventProperties={},this._initialised=!1}connectedCallback(){if(this._initialised)return;const o={},{attributes:p,properties:m,events:f}=e;this._properties=Object.assign({},this._properties,this._attributesToProperties(p)),[...p,...m].forEach(e=>{const t=this[e],r=e.replace(/^on/,"__");void 0!==t&&(this._properties[e]=t),r!==e&&(o[r]={get:()=>this._getProperty(e),set:t=>this._setProperty(e,t)}),o[e]={get:()=>this._getProperty(e),set:t=>this._setProperty(e,t)}}),f.forEach(e=>{const t=e.replace(/^on/,"").toLowerCase(),r=e.replace(/^on/,"__on");o[r]={get:()=>this._getEventProperty(e),set:t=>this._setEventProperty(e,t)},this._eventProperties[e]=void 0,this._properties[e]=((...o)=>{const r=this._getEventProperty(e);"function"==typeof r&&r(...o),this.dispatchEvent(new CustomEvent(t,{bubbles:!1,detail:o}))})}),Object.defineProperties(this,o);const g=s===r.TEXT?this.childNodes:this.children;Object(d.a)(g).forEach(e=>{s===r.DOJO?(e.addEventListener("dojo-ce-render",()=>this._render()),e.addEventListener("dojo-ce-connected",()=>this._render()),this._children.push(h(e))):this._children.push(Object(a.c)({node:e,diffType:"dom"}))}),this.addEventListener("dojo-ce-connected",e=>this._childConnected(e));const j=this._properties,_=()=>this.__children__(),y=l(),b=Object(u.b)(this._getTheme(),y);c.a.addEventListener("dojo-theme-set",()=>b.set(this._getTheme()));const v=Object(i.a)(class extends n.a{render(){return Object(a.h)(t,j,_())}});this._projector=new v,this._projector.setProperties({registry:y}),this._projector.append(this),this._initialised=!0,this.dispatchEvent(new CustomEvent("dojo-ce-connected",{bubbles:!0,detail:this}))}_getTheme(){if(c.a&&c.a.dojoce&&c.a.dojoce.theme)return c.a.dojoce.themes[c.a.dojoce.theme]}_childConnected(e){const t=e.detail;if(t.parentNode===this){this._children.some(e=>e.domNode===t)||(t.addEventListener("dojo-ce-render",()=>this._render()),this._children.push(h(t)),this._render())}}_render(){this._projector&&(this._projector.invalidate(),this.dispatchEvent(new CustomEvent("dojo-ce-render",{bubbles:!1,detail:this})))}__properties__(){return Object.assign({},this._properties,this._eventProperties)}__children__(){return s===r.DOJO?this._children.filter(e=>e.domNode.isWidget).map(e=>{const{domNode:t}=e;return Object(a.h)(e,Object.assign({},t.__properties__()),[...t.__children__()])}):this._children}attributeChangedCallback(e,t,o){const r=p[e];this._setProperty(r,o)}_setEventProperty(e,t){this._eventProperties[e]=t}_getEventProperty(e){return this._eventProperties[e]}_setProperty(e,t){"function"==typeof t&&(t[n.b]=!0),this._properties[e]=t,this._render()}_getProperty(e){return this._properties[e]}_attributesToProperties(e){return e.reduce((e,t)=>{const o=t.toLowerCase(),r=this.getAttribute(o);return null!==r&&(e[t]=r),e},{})}static get observedAttributes(){return Object.keys(p)}get isWidget(){return!0}}}function m(e){const t=e.prototype&&e.prototype.__customElementDescriptor;if(!t)throw new Error("Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?");c.a.customElements.define(t.tagName,p(t,e))}!function(e){e.DOJO="DOJO",e.NODE="NODE",e.TEXT="TEXT"}(r||(r={})),t.default=m},"./node_modules/@dojo/widget-core/vdom.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/shim/global.mjs"),s=o("./node_modules/@dojo/shim/array.mjs"),n=o("./node_modules/@dojo/widget-core/d.mjs"),i=o("./node_modules/@dojo/widget-core/Registry.mjs"),d=o("./node_modules/@dojo/shim/WeakMap.mjs");const a="http://www.w3.org/2000/svg",c="http://www.w3.org/1999/xlink",u=[],l=new d.a;t.b=l;const h=new d.a,p=new d.a;function m(e,t){return Object(n.e)(e)&&Object(n.e)(t)?(!Object(n.d)(e)&&!Object(n.d)(t)||e.domNode===t.domNode)&&(e.tag===t.tag&&e.properties.key===t.properties.key):!(!Object(n.f)(e)||!Object(n.f)(t))&&((void 0!==e.instance||"string"!=typeof t.widgetConstructor)&&(e.widgetConstructor===t.widgetConstructor&&e.properties.key===t.properties.key))}const f=function(){throw new Error("Provide a transitions object to the projectionOptions to do animations")};function g(e){if("string"!=typeof e)throw new Error("Style values must be strings")}function j(e,t,o,r,s,n){const i=p.get(r.projectorInstance),a=i.nodeMap.get(e)||new d.a;if(n){const o=a.get(n);e.removeEventListener(t,o)}let c=o.bind(s);"input"===t&&(c=function(e){o.call(this,e),e.target["oninput-value"]=e.target.value}.bind(s)),e.addEventListener(t,c),a.set(o,c),i.nodeMap.set(e,a)}function _(e,t){if(t){const o=t.split(" ");for(let t=0;t{o.focus()})}}function v(e,t,o,r,s=!1){const n=p.get(r.projectorInstance).nodeMap.get(e);n&&Object.keys(t).forEach(r=>{const i="on"===r.substr(0,2)||s,d=s?r:r.substr(2);if(i&&!o[r]){const o=n.get(t[r]);o&&e.removeEventListener(d,o)}})}function w(e,t,o,r){r.namespace===a&&"href"===t?e.setAttributeNS(c,t,o):"role"===t&&""===o||void 0===o?e.removeAttribute(t):e.setAttribute(t,o)}function O(e,t,o,r){const s=Object.keys(o),n=s.length;for(let i=0;i0)if(c&&0!==c.length){const r=[...o];for(let o=0;o0&&R(r.children,t));else{if(!r.coreProperties){const e=l.get(t);r.coreProperties={bind:t,baseRegistry:e.coreProperties.baseRegistry}}r.children&&r.children.length>0&&R(r.children,t)}o++}else e.splice(o,1)}return e}function k(e,t){if(Object(n.e)(e)&&e.properties){const o=e.properties.enterAnimation;o&&("function"==typeof o?o(e.domNode,e.properties):t.enter(e.domNode,e.properties,o))}}function N(e,t,o){if(Object(n.f)(e)){const r=e.rendered||u;if(e.instance){l.get(e.instance).onDetach(),h.delete(e.instance)}for(let e=0;e0)for(let r=0;r{let i=void 0,d=t[f];if(d){let e=f+1,o=[d];for(;o.length;){const r=o.shift();if(Object(n.f)(r))r.rendered&&o.push(...r.rendered);else if(r.domNode){i=r.domNode;break}0===o.length&&t[e]&&(o.push(t[e]),e++)}}D(u,e,i,s,r),k(u,a);const l=g;c.afterRenderCallbacks.push(()=>{A(o,l,r)})};if(!d||-1===l){p(),g++;continue}const _=()=>{const e=f;if(c.afterRenderCallbacks.push(()=>{A(t,e,r)}),Object(n.f)(d)){const e=h.get(d.instance);e&&(d=e.dnode)}N(d,a,s)};-1!==E(o,d,g+1)?(p(),_(),f++,g++):(_(),f++)}if(i>f)for(l=f;l{A(t,e,r)});let o=t[l];if(Object(n.f)(o)){const e=h.get(o.instance);e&&(o=e.dnode)}N(o,a,s)}return j}function T(e,t,o,r,i,d){if(void 0===t)return;const a=p.get(o.projectorInstance);a.merge&&void 0===d&&(d=Object(s.a)(e.domNode.childNodes));const c=o.transitions;o=Object.assign({},o,{depth:o.depth+1});for(let s=0;s0;)(e=d.shift())&&e.tagName===(u.tag.toUpperCase()||void 0)&&(u.domNode=e)}D(u,e,i,o,r)}else D(u,e,i,o,r,d);k(u,c)}}function x(e,t,o,r){if(T(t,t.children,r,o,void 0),"function"==typeof t.deferredPropertiesCallback&&void 0===t.inserted&&L(t,r),t.attributes&&t.events){O(e,{},t.attributes,r),P(e,{},t.properties,r,!1),v(e,{},t.events,r,!0);const o=t.events;Object.keys(o).forEach(s=>{j(e,s,o[s],r,t.properties.bind)})}else P(e,{},t.properties,r);if(null!==t.properties.key&&void 0!==t.properties.key){l.get(o).nodeHandler.add(e,`${t.properties.key}`)}t.inserted=!0}function D(e,t,o,r,s,d){let c;const u=p.get(r.projectorInstance);if(Object(n.f)(e)){let{widgetConstructor:n}=e;const a=l.get(s);if(!Object(i.d)(n)){const e=a.registry().get(n);if(null===e)return;n=e}const c=new n;e.instance=c;const p=l.get(c);p.invalidate=(()=>{p.dirty=!0,!1===p.rendering&&(u.renderQueue.push({instance:c,depth:r.depth}),F(r))}),p.rendering=!0,c.__setCoreProperties__(e.coreProperties),c.__setChildren__(e.children),c.__setProperties__(e.properties);const m=c.__render__();if(p.rendering=!1,m){const s=R(m,c);e.rendered=s,T(t,s,r,c,o,d)}h.set(c,{dnode:e,parentVNode:t}),p.nodeHandler.addRoot(),u.afterRenderCallbacks.push(()=>{p.onAttach()})}else{if(u.merge&&void 0!==u.mergeElement)return c=e.domNode=r.mergeElement,u.mergeElement=void 0,void x(c,e,s,r);const n=t.domNode.ownerDocument;if(e.tag||"string"!=typeof e.text)void 0===e.domNode?("svg"===e.tag&&(r=Object.assign({},r,{namespace:a})),c=void 0!==r.namespace?e.domNode=n.createElementNS(r.namespace,e.tag):e.domNode=e.domNode||n.createElement(e.tag)):c=e.domNode,x(c,e,s,r),void 0!==o?t.domNode.insertBefore(c,o):c.parentNode!==t.domNode&&t.domNode.appendChild(c);else if(void 0!==e.domNode&&t.domNode){const o=e.domNode.ownerDocument.createTextNode(e.text);t.domNode===e.domNode.parentNode?t.domNode.replaceChild(o,e.domNode):(t.domNode.appendChild(o),e.domNode.parentNode&&e.domNode.parentNode.removeChild(e.domNode)),e.domNode=o}else c=e.domNode=n.createTextNode(e.text),void 0!==o?t.domNode.insertBefore(c,o):t.domNode.appendChild(c)}}function S(e,t,o,r,s){if(Object(n.f)(t)){const{instance:r}=e,{parentVNode:s,dnode:n}=h.get(r),i=n?n.rendered:e.rendered,d=l.get(r);if(d.rendering=!0,r.__setCoreProperties__(t.coreProperties),r.__setChildren__(t.children),r.__setProperties__(t.properties),t.instance=r,!0===d.dirty){const e=r.__render__();d.rendering=!1,t.rendered=R(e,r),M(s,i,t.rendered,r,o)}else d.rendering=!1,t.rendered=i;h.set(r,{dnode:t,parentVNode:s}),d.nodeHandler.addRoot()}else{if(e===t)return!1;const r=t.domNode=e.domNode;let n=!1,i=!1;if(t.tag||"string"!=typeof t.text){if(t.tag&&0===t.tag.lastIndexOf("svg",0)&&(o=Object.assign({},o,{namespace:a})),e.children!==t.children){const r=R(t.children,s);t.children=r,i=M(t,e.children,r,s,o)||i}const n=function(e,t,o){const{diffType:r,properties:s,attributes:n}=o;if(!r||"vdom"===r)return{properties:t.properties,attributes:t.attributes,events:t.events};if("none"===r)return{properties:{},attributes:t.attributes?{}:void 0,events:t.events};let i={properties:{}};return n?(i.attributes={},i.events=t.events,Object.keys(s).forEach(t=>{i.properties[t]=e[t]}),Object.keys(n).forEach(t=>{i.attributes[t]=e.getAttribute(t)}),i):(i.properties=Object.keys(s).reduce((t,o)=>(t[o]=e.getAttribute(o)||e[o],t),{}),i)}(r,e,t);if(t.attributes&&t.events){O(r,n.attributes,t.attributes,o),i=P(r,n.properties,t.properties,o,!1)||i,v(r,n.events,t.events,o,!0);const e=t.events;Object.keys(e).forEach(s=>{j(r,s,e[s],o,t.properties.bind,n.events[s])})}else i=P(r,n.properties,t.properties,o)||i;if(null!==t.properties.key&&void 0!==t.properties.key){l.get(s).nodeHandler.add(r,`${t.properties.key}`)}}else if(t.text!==e.text){const e=r.ownerDocument.createTextNode(t.text);return r.parentNode.replaceChild(e,r),t.domNode=e,n=!0}i&&t.properties&&t.properties.updateAnimation&&t.properties.updateAnimation(r,t.properties,e.properties)}}function L(e,t){e.decoratedDeferredProperties=e.properties;const o=e.deferredPropertiesCallback(!!e.inserted),r=p.get(t.projectorInstance);e.properties=Object.assign({},o,e.decoratedDeferredProperties),r.deferredRenderCallbacks.push(()=>{const o=Object.assign({},e.deferredPropertiesCallback(!!e.inserted),e.decoratedDeferredProperties);P(e.domNode,e.properties,o,t),e.properties=o})}function I(e){const t=p.get(e.projectorInstance);if(t.deferredRenderCallbacks.length)if(e.sync)for(;t.deferredRenderCallbacks.length;){const e=t.deferredRenderCallbacks.shift();e&&e()}else r.a.requestAnimationFrame(()=>{for(;t.deferredRenderCallbacks.length;){const e=t.deferredRenderCallbacks.shift();e&&e()}})}function W(e){const t=p.get(e.projectorInstance);if(e.sync)for(;t.afterRenderCallbacks.length;){const e=t.afterRenderCallbacks.shift();e&&e()}else r.a.requestIdleCallback?r.a.requestIdleCallback(()=>{for(;t.afterRenderCallbacks.length;){const e=t.afterRenderCallbacks.shift();e&&e()}}):setTimeout(()=>{for(;t.afterRenderCallbacks.length;){const e=t.afterRenderCallbacks.shift();e&&e()}})}function F(e){const t=p.get(e.projectorInstance);e.sync?B(e):void 0===t.renderScheduled&&(t.renderScheduled=r.a.requestAnimationFrame(()=>{B(e)}))}function B(e){const t=p.get(e.projectorInstance);t.renderScheduled=void 0;const o=[...t.renderQueue];t.renderQueue=[],o.sort((e,t)=>e.depth-t.depth);const r=[];for(;o.length;){const{instance:t}=o.shift();if(h.has(t)&&-1===r.indexOf(t)){r.push(t);const{parentVNode:o,dnode:s}=h.get(t);S(s,C(t,l.get(t)),e,0,t)}}W(e),I(e)}const H={append:function(e,t,o={}){const r=l.get(t),s=function(e,t){const o={namespace:void 0,styleApplyer:function(e,t,o){e.style[t]=o},transitions:{enter:f,exit:f},depth:0,merge:!1,sync:!1,projectorInstance:t};return Object.assign({},o,e)}(o,t),i={afterRenderCallbacks:[],deferredRenderCallbacks:[],nodeMap:new d.a,renderScheduled:void 0,renderQueue:[],merge:o.merge||!1,mergeElement:o.mergeElement};p.set(t,i),s.rootNode=e;const a={tag:"",properties:{},children:void 0,domNode:s.rootNode,type:n.a};const c=C(t,r);return h.set(t,{dnode:c,parentVNode:a}),r.invalidate=(()=>{r.dirty=!0,!1===r.rendering&&(i.renderQueue.push({instance:t,depth:s.depth}),F(s))}),S(c,c,s,0,t),i.afterRenderCallbacks.push(()=>{r.onAttach()}),I(s),W(s),{domNode:s.rootNode}},create:function(e,t){return this.append(document.createElement("div"),e,t)},merge:function(e,t,o={}){o.merge=!0,o.mergeElement=e;const r=this.append(e.parentNode,t,o);return p.get(t).merge=!1,r}};t.a=H},"./node_modules/imports-loader/index.js?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js":function(e,t,o){var r=o("./src/menu/Menu.ts"),s=o("./node_modules/@dojo/widget-core/registerCustomElement.mjs").default,n=r.default;n&&s(n)},"./node_modules/process/browser.js":function(e,t){var o,r,s=e.exports={};function n(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function d(e){if(o===setTimeout)return setTimeout(e,0);if((o===n||!o)&&setTimeout)return o=setTimeout,setTimeout(e,0);try{return o(e,0)}catch(t){try{return o.call(null,e,0)}catch(t){return o.call(this,e,0)}}}!function(){try{o="function"==typeof setTimeout?setTimeout:n}catch(e){o=n}try{r="function"==typeof clearTimeout?clearTimeout:i}catch(e){r=i}}();var a,c=[],u=!1,l=-1;function h(){u&&a&&(u=!1,a.length?c=a.concat(c):l=-1,c.length&&p())}function p(){if(!u){var e=d(h);u=!0;for(var t=c.length;t;){for(a=c,c=[];++l1)for(var o=1;o=0;d--)(s=e[d])&&(i=(n<3?s(i):n>3?s(t,o,i):s(t,o))||i);return n>3&&i&&Object.defineProperty(t,o,i),i},t.b=function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}; +!function(e){var t={};function o(r){if(t[r])return t[r].exports;var s=t[r]={i:r,l:!1,exports:{}};return e[r].call(s.exports,s,s.exports,o),s.l=!0,s.exports}o.m=e,o.c=t,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}({"./node_modules/@dojo/framework/core/Destroyable.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/core/lang.mjs"),s=o("./node_modules/@dojo/framework/shim/Promise.mjs");function n(){return s.a.resolve(!1)}function i(){throw new Error("Call made to destroyed method")}class d{constructor(){this.handles=[]}own(e){const t=Array.isArray(e)?Object(r.b)(...e):e,{handles:o}=this;return o.push(t),{destroy(){o.splice(o.indexOf(t)),t.destroy()}}}destroy(){return new s.a(e=>{this.handles.forEach(e=>{e&&e.destroy&&e.destroy()}),this.destroy=n,this.own=i,e(!0)})}}t.a=d},"./node_modules/@dojo/framework/core/Evented.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/Map.mjs"),s=o("./node_modules/@dojo/framework/core/Destroyable.mjs");const n=new r.b;class i extends s.a{constructor(){super(...arguments),this.listenersMap=new r.b}emit(e){this.listenersMap.forEach((t,o)=>{(function(e,t){if("string"==typeof t&&"string"==typeof e&&-1!==e.indexOf("*")){let o;return n.has(e)?o=n.get(e):(o=new RegExp(`^${e.replace(/\*/g,".*")}$`),n.set(e,o)),o.test(t)}return e===t})(o,e.type)&&[...t].forEach(t=>{t.call(this,e)})})}on(e,t){if(Array.isArray(t)){const o=t.map(t=>this._addListener(e,t));return{destroy(){o.forEach(e=>e.destroy())}}}return this._addListener(e,t)}_addListener(e,t){const o=this.listenersMap.get(e)||[];return o.push(t),this.listenersMap.set(e,o),{destroy:()=>{const o=this.listenersMap.get(e)||[];o.splice(o.indexOf(t),1)}}}}t.a=i},"./node_modules/@dojo/framework/core/lang.mjs":function(e,t,o){"use strict";t.b=function(...e){return function(e){let t=!1;return{destroy:function(){t||(t=!0,e())}}}(function(){for(let t=0;t{r[e]=t,delete n[e]},()=>{delete n[e]})}function l(e){let t;const o=e.toLowerCase();if(o in a)t=a[o];else if(s[o])t=r[o]=s[o].call(null),delete s[o];else{if(!(o in r)){if(e in n)return!1;throw new TypeError(`Attempt to detect unregistered has feature "${e}"`)}t=r[o]}return t}c("debug",!0),c("host-browser","undefined"!=typeof document&&"undefined"!=typeof location),c("host-node",function(){if("object"==typeof o&&o.versions&&o.versions.node)return o.versions.node})}).call(t,o("./node_modules/webpack/buildin/global.js"),o("./node_modules/process/browser.js"))},"./node_modules/@dojo/framework/shim/Map.mjs":function(e,t,o){"use strict";o.d(t,"a",function(){return s});o("./node_modules/@dojo/framework/shim/iterator.mjs");var r=o("./node_modules/@dojo/framework/shim/global.mjs");o("./node_modules/@dojo/framework/shim/object.mjs"),o("./node_modules/@dojo/framework/shim/support/has.mjs"),o("./node_modules/@dojo/framework/shim/Symbol.mjs");let s=r.a.Map;t.b=s},"./node_modules/@dojo/framework/shim/Promise.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/global.mjs");o("./node_modules/@dojo/framework/shim/support/queue.mjs"),o("./node_modules/@dojo/framework/shim/Symbol.mjs"),o("./node_modules/@dojo/framework/shim/support/has.mjs");let s=r.a.Promise;t.a=s},"./node_modules/@dojo/framework/shim/Symbol.mjs":function(e,t,o){"use strict";o("./node_modules/@dojo/framework/shim/support/has.mjs");var r=o("./node_modules/@dojo/framework/shim/global.mjs"),s=o("./node_modules/@dojo/framework/shim/support/util.mjs");let n=r.a.Symbol;["hasInstance","isConcatSpreadable","iterator","species","replace","search","split","match","toPrimitive","toStringTag","unscopables","observable"].forEach(e=>{n[e]||Object.defineProperty(n,e,Object(s.a)(n.for(e),!1,!1))}),t.a=n},"./node_modules/@dojo/framework/shim/WeakMap.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/global.mjs");o("./node_modules/@dojo/framework/shim/iterator.mjs"),o("./node_modules/@dojo/framework/shim/support/has.mjs"),o("./node_modules/@dojo/framework/shim/Symbol.mjs");let s=r.a.WeakMap;t.a=s},"./node_modules/@dojo/framework/shim/array.mjs":function(e,t,o){"use strict";o.d(t,"a",function(){return n});var r=o("./node_modules/@dojo/framework/shim/global.mjs"),s=(o("./node_modules/@dojo/framework/shim/iterator.mjs"),o("./node_modules/@dojo/framework/shim/number.mjs"),o("./node_modules/@dojo/framework/shim/support/has.mjs"),o("./node_modules/@dojo/framework/shim/support/util.mjs"));let n,i,d,a,c,l,u;n=r.a.Array.from,i=r.a.Array.of,d=Object(s.b)(r.a.Array.prototype.copyWithin),a=Object(s.b)(r.a.Array.prototype.fill),c=Object(s.b)(r.a.Array.prototype.find),l=Object(s.b)(r.a.Array.prototype.findIndex),u=Object(s.b)(r.a.Array.prototype.includes)},"./node_modules/@dojo/framework/shim/global.mjs":function(e,t,o){"use strict";(function(e){const o=void 0!==e?e:"undefined"!=typeof window?window:"undefined"!=typeof self?self:void 0;t.a=o}).call(t,o("./node_modules/webpack/buildin/global.js"))},"./node_modules/@dojo/framework/shim/iterator.mjs":function(e,t,o){"use strict";o("./node_modules/@dojo/framework/shim/Symbol.mjs"),o("./node_modules/@dojo/framework/shim/string.mjs")},"./node_modules/@dojo/framework/shim/number.mjs":function(e,t,o){"use strict";o("./node_modules/@dojo/framework/shim/global.mjs");Math.pow(2,53)},"./node_modules/@dojo/framework/shim/object.mjs":function(e,t,o){"use strict";o.d(t,"a",function(){return s});var r=o("./node_modules/@dojo/framework/shim/global.mjs");o("./node_modules/@dojo/framework/shim/support/has.mjs"),o("./node_modules/@dojo/framework/shim/Symbol.mjs");let s,n,i,d,a,c,l,u,m;{const e=r.a.Object;s=e.assign,n=e.getOwnPropertyDescriptor,i=e.getOwnPropertyNames,d=e.getOwnPropertySymbols,a=e.is,c=e.keys}{const e=r.a.Object;l=e.getOwnPropertyDescriptors,u=e.entries,m=e.values}},"./node_modules/@dojo/framework/shim/string.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/global.mjs"),s=(o("./node_modules/@dojo/framework/shim/support/has.mjs"),o("./node_modules/@dojo/framework/shim/support/util.mjs"));t.b=55296;t.a=56319;let n,i,d,a,c,l,u,m,h,f;n=r.a.String.fromCodePoint,i=r.a.String.raw,d=Object(s.b)(r.a.String.prototype.codePointAt),a=Object(s.b)(r.a.String.prototype.endsWith),c=Object(s.b)(r.a.String.prototype.includes),l=Object(s.b)(r.a.String.prototype.normalize),u=Object(s.b)(r.a.String.prototype.repeat),m=Object(s.b)(r.a.String.prototype.startsWith),h=Object(s.b)(r.a.String.prototype.padEnd),f=Object(s.b)(r.a.String.prototype.padStart)},"./node_modules/@dojo/framework/shim/support/has.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/has/has.mjs"),s=o("./node_modules/@dojo/framework/shim/global.mjs");r.b;Object(r.a)("es6-array",()=>["from","of"].every(e=>e in s.a.Array)&&["findIndex","find","copyWithin"].every(e=>e in s.a.Array.prototype),!0),Object(r.a)("es6-array-fill",()=>"fill"in s.a.Array.prototype&&1===[1].fill(9,Number.POSITIVE_INFINITY)[0],!0),Object(r.a)("es7-array",()=>"includes"in s.a.Array.prototype,!0),Object(r.a)("es6-map",()=>{if("function"==typeof s.a.Map)try{const e=new s.a.Map([[0,1]]);return e.has(0)&&"function"==typeof e.keys&&"function"==typeof e.values&&"function"==typeof e.entries}catch(e){return!1}return!1},!0),Object(r.a)("es6-math",()=>["clz32","sign","log10","log2","log1p","expm1","cosh","sinh","tanh","acosh","asinh","atanh","trunc","fround","cbrt","hypot"].every(e=>"function"==typeof s.a.Math[e]),!0),Object(r.a)("es6-math-imul",()=>"imul"in s.a.Math&&-5===Math.imul(4294967295,5),!0),Object(r.a)("es6-object",()=>["assign","is","getOwnPropertySymbols","setPrototypeOf"].every(e=>"function"==typeof s.a.Object[e]),!0),Object(r.a)("es2017-object",()=>["values","entries","getOwnPropertyDescriptors"].every(e=>"function"==typeof s.a.Object[e]),!0),Object(r.a)("es-observable",()=>void 0!==s.a.Observable,!0),Object(r.a)("es6-promise",()=>void 0!==s.a.Promise&&!0,!0),Object(r.a)("es6-set",()=>{if("function"==typeof s.a.Set){const e=new s.a.Set([1]);return e.has(1)&&"keys"in e&&"function"==typeof e.keys&&!0}return!1},!0),Object(r.a)("es6-string",()=>["fromCodePoint"].every(e=>"function"==typeof s.a.String[e])&&["codePointAt","normalize","repeat","startsWith","endsWith","includes"].every(e=>"function"==typeof s.a.String.prototype[e]),!0),Object(r.a)("es6-string-raw",()=>{function e(e,...t){const o=[...e];return o.raw=e.raw,o}if("raw"in s.a.String){let t=e`a\n${1}`;return t.raw=["a\\n"],"a:\\n"===s.a.String.raw(t,42)}return!1},!0),Object(r.a)("es2017-string",()=>["padStart","padEnd"].every(e=>"function"==typeof s.a.String.prototype[e]),!0),Object(r.a)("es6-symbol",()=>void 0!==s.a.Symbol&&"symbol"==typeof Symbol(),!0),Object(r.a)("es6-weakmap",()=>{if(void 0!==s.a.WeakMap){const e={},t={},o=new s.a.WeakMap([[e,1]]);return Object.freeze(e),1===o.get(e)&&o.set(t,2)===o&&!0}return!1},!0),Object(r.a)("microtasks",()=>!0,!0),Object(r.a)("postmessage",()=>void 0!==s.a.window&&"function"==typeof s.a.postMessage,!0),Object(r.a)("raf",()=>"function"==typeof s.a.requestAnimationFrame,!0),Object(r.a)("setimmediate",()=>void 0!==s.a.setImmediate,!0),Object(r.a)("dom-mutationobserver",()=>{if(Boolean(s.a.MutationObserver||s.a.WebKitMutationObserver)){const e=document.createElement("div"),t=new(s.a.MutationObserver||s.a.WebKitMutationObserver)(function(){});return t.observe(e,{attributes:!0}),e.style.setProperty("display","block"),Boolean(t.takeRecords().length)}return!1},!0),Object(r.a)("dom-webanimation",()=>void 0!==s.a.Animation&&void 0!==s.a.KeyframeEffect,!0)},"./node_modules/@dojo/framework/shim/support/queue.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/global.mjs");o("./node_modules/@dojo/framework/shim/support/has.mjs");function s(e){e&&e.isActive&&e.callback&&e.callback()}function n(e,t){return{destroy:function(){this.destroy=function(){},e.isActive=!1,e.callback=null,t&&t()}}}!function(){let e,t;{const e=[];r.a.addEventListener("message",function(t){t.source===r.a&&"dojo-queue-message"===t.data&&(t.stopPropagation(),e.length&&s(e.shift()))}),t=function(t){e.push(t),r.a.postMessage("dojo-queue-message","*")}}function o(o){const r={isActive:!0,callback:o},s=t(r);return n(r,e&&function(){e(s)})}}();!function(){function e(e){const t={isActive:!0,callback:e},o=requestAnimationFrame(s.bind(null,t));return n(t,function(){cancelAnimationFrame(o)})}}();!function(){let e;e=function(e){r.a.Promise.resolve(e).then(s)}}()},"./node_modules/@dojo/framework/shim/support/util.mjs":function(e,t,o){"use strict";t.a=function(e,t=!1,o=!0,r=!0){return{value:e,enumerable:t,writable:o,configurable:r}},t.b=function(e){return function(t,...o){return e.apply(t,o)}}},"./node_modules/@dojo/framework/widget-core/Injector.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/core/Evented.mjs");class s extends r.a{constructor(e){super(),this._payload=e}setInvalidator(e){this._invalidator=e}get(){return this._payload}set(e){this._payload=e,this._invalidator&&this._invalidator()}}t.a=s},"./node_modules/@dojo/framework/widget-core/NodeHandler.mjs":function(e,t,o){"use strict";var r,s=o("./node_modules/@dojo/framework/core/Evented.mjs"),n=o("./node_modules/@dojo/framework/shim/Map.mjs");!function(e){e.Projector="Projector",e.Widget="Widget"}(r||(r={}));t.a=class extends s.a{constructor(){super(...arguments),this._nodeMap=new n.b}get(e){return this._nodeMap.get(e)}has(e){return this._nodeMap.has(e)}add(e,t){this._nodeMap.set(t,e),this.emit({type:t})}addRoot(){this.emit({type:r.Widget})}addProjector(){this.emit({type:r.Projector})}clear(){this._nodeMap.clear()}}},"./node_modules/@dojo/framework/widget-core/Registry.mjs":function(e,t,o){"use strict";t.d=a;var r=o("./node_modules/@dojo/framework/shim/Promise.mjs"),s=o("./node_modules/@dojo/framework/shim/Map.mjs"),n=o("./node_modules/@dojo/framework/shim/Symbol.mjs"),i=o("./node_modules/@dojo/framework/core/Evented.mjs");const d=Object(n.a)("Widget Base");function a(e){return Boolean(e&&e._type===d)}t.b=d;class c extends i.a{emitLoadedEvent(e,t){this.emit({type:e,action:"loaded",item:t})}define(e,t){if(void 0===this._widgetRegistry&&(this._widgetRegistry=new s.b),this._widgetRegistry.has(e))throw new Error(`widget has already been registered for '${e.toString()}'`);this._widgetRegistry.set(e,t),t instanceof r.a?t.then(t=>(this._widgetRegistry.set(e,t),this.emitLoadedEvent(e,t),t),e=>{throw e}):a(t)&&this.emitLoadedEvent(e,t)}defineInjector(e,t){if(void 0===this._injectorRegistry&&(this._injectorRegistry=new s.b),this._injectorRegistry.has(e))throw new Error(`injector has already been registered for '${e.toString()}'`);const o=new i.a,r={injector:t(()=>o.emit({type:"invalidate"})),invalidator:o};this._injectorRegistry.set(e,r),this.emitLoadedEvent(e,r)}get(e){if(!this._widgetRegistry||!this.has(e))return null;const t=this._widgetRegistry.get(e);if(a(t))return t;if(t instanceof r.a)return null;const o=t();return this._widgetRegistry.set(e,o),o.then(t=>((function(e){return Boolean(e&&e.hasOwnProperty("__esModule")&&e.hasOwnProperty("default")&&a(e.default))})(t)&&(t=t.default),this._widgetRegistry.set(e,t),this.emitLoadedEvent(e,t),t),e=>{throw e}),null}getInjector(e){return this._injectorRegistry&&this.hasInjector(e)?this._injectorRegistry.get(e):null}has(e){return Boolean(this._widgetRegistry&&this._widgetRegistry.has(e))}hasInjector(e){return Boolean(this._injectorRegistry&&this._injectorRegistry.has(e))}}t.a=c,t.c=c},"./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/Map.mjs"),s=o("./node_modules/@dojo/framework/core/Evented.mjs"),n=o("./node_modules/@dojo/framework/widget-core/Registry.mjs");t.a=class extends s.a{constructor(){super(),this._registry=new n.a,this._registryWidgetLabelMap=new r.a,this._registryInjectorLabelMap=new r.a,this.own(this._registry),this.own({destroy:()=>{this.baseRegistry&&(this._registryWidgetLabelMap.delete(this.baseRegistry),this._registryInjectorLabelMap.delete(this.baseRegistry),this.baseRegistry=void 0)}})}set base(e){this.baseRegistry&&(this._registryWidgetLabelMap.delete(this.baseRegistry),this._registryInjectorLabelMap.delete(this.baseRegistry)),this.baseRegistry=e}define(e,t){this._registry.define(e,t)}defineInjector(e,t){this._registry.defineInjector(e,t)}has(e){return this._registry.has(e)||Boolean(this.baseRegistry&&this.baseRegistry.has(e))}hasInjector(e){return this._registry.hasInjector(e)||Boolean(this.baseRegistry&&this.baseRegistry.hasInjector(e))}get(e,t=!1){return this._get(e,t,"get",this._registryWidgetLabelMap)}getInjector(e,t=!1){return this._get(e,t,"getInjector",this._registryInjectorLabelMap)}_get(e,t,o,r){const s=t?[this.baseRegistry,this._registry]:[this._registry,this.baseRegistry];for(let n=0;n{"loaded"===r.action&&this[o](e,t)===r.item&&this.emit({type:"invalidate"})});this.own(s),r.set(i,[...a,e])}}return null}}},"./node_modules/@dojo/framework/widget-core/WidgetBase.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/Map.mjs"),s=o("./node_modules/@dojo/framework/shim/WeakMap.mjs"),n=o("./node_modules/@dojo/framework/shim/Symbol.mjs"),i=o("./node_modules/@dojo/framework/widget-core/d.mjs"),d=o("./node_modules/@dojo/framework/widget-core/diff.mjs"),a=o("./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs"),c=o("./node_modules/@dojo/framework/widget-core/NodeHandler.mjs"),l=o("./node_modules/@dojo/framework/widget-core/vdom.mjs"),u=o("./node_modules/@dojo/framework/widget-core/Registry.mjs");const m=new r.b,h=d.a.bind(null),f=n.a.for("dojoNoBind");t.b=f;class p{constructor(){this._initialProperties=!0,this._changedPropertyKeys=[],this._nodeHandler=new c.a,this._handles=[],this._children=[],this._decoratorCache=new r.b,this._properties={},this._boundRenderFunc=this.render.bind(this),this._boundInvalidate=this.invalidate.bind(this),l.b.set(this,{dirty:!0,onAttach:()=>{this.onAttach()},onDetach:()=>{this.onDetach(),this.destroy()},nodeHandler:this._nodeHandler,registry:()=>this.registry,coreProperties:{},rendering:!1,inputProperties:{}}),this._runAfterConstructors()}meta(e){void 0===this._metaMap&&(this._metaMap=new r.b);let t=this._metaMap.get(e);return t||(t=new e({invalidate:this._boundInvalidate,nodeHandler:this._nodeHandler,bind:this}),this.own(t),this._metaMap.set(e,t)),t}onAttach(){}onDetach(){}get properties(){return this._properties}get changedPropertyKeys(){return[...this._changedPropertyKeys]}__setCoreProperties__(e){const{baseRegistry:t}=e,o=l.b.get(this);o.coreProperties.baseRegistry!==t&&(void 0===this._registry&&(this._registry=new a.a,this.own(this._registry),this.own(this._registry.on("invalidate",this._boundInvalidate))),this._registry.base=t,this.invalidate()),o.coreProperties=e}__setProperties__(e){const t=l.b.get(this);t.inputProperties=e;const o=this._runBeforeProperties(e),r=this.getDecorator("registeredDiffProperty"),s=[],n=Object.keys(o);if(!1===this._initialProperties||0!==r.length){const e=[...n,...Object.keys(this._properties)],i=[],d={};let a=!1;for(let n=0;n{const r=-1!==s.indexOf(o),n=-1!==e.indexOf(t);r&&!n&&(t.call(this,this._properties,d),e.push(t))})}this._properties=d,this._changedPropertyKeys=s}else{this._initialProperties=!1;for(let e=0;e0&&this.invalidate()}get children(){return this._children}__setChildren__(e){(this._children.length>0||e.length>0)&&(this._children=e,this.invalidate())}__render__(){l.b.get(this).dirty=!1;let e=this._runBeforeRenders()();return e=this.runAfterRenders(e),this._nodeHandler.clear(),e}invalidate(){const e=l.b.get(this);e.invalidate&&e.invalidate()}render(){return Object(i.g)("div",{},this.children)}addDecorator(e,t){if(t=Array.isArray(t)?t:[t],this.hasOwnProperty("constructor")){let o=m.get(this.constructor);o||(o=new r.b,m.set(this.constructor,o));let s=o.get(e);s||(s=[],o.set(e,s)),s.push(...t)}else{const o=this.getDecorator(e);this._decoratorCache.set(e,[...o,...t])}}_buildDecoratorList(e){const t=[];let o=this.constructor;for(;o;){const r=m.get(o);if(r){const o=r.get(e);o&&t.unshift(...o)}o=Object.getPrototypeOf(o)}return t}getDecorator(e){let t=this._decoratorCache.get(e);return void 0!==t?t:(t=this._buildDecoratorList(e),this._decoratorCache.set(e,t),t)}_bindFunctionProperty(e,t){if("function"==typeof e&&!e[f]&&!1===Object(u.d)(e)){void 0===this._bindFunctionPropertyMap&&(this._bindFunctionPropertyMap=new s.a);const o=this._bindFunctionPropertyMap.get(e)||{};let{boundFunc:r,scope:n}=o;return void 0!==r&&n===t||(r=e.bind(t),this._bindFunctionPropertyMap.set(e,{boundFunc:r,scope:t})),r}return e}get registry(){return void 0===this._registry&&(this._registry=new a.a,this.own(this._registry),this.own(this._registry.on("invalidate",this._boundInvalidate))),this._registry}_runBeforeProperties(e){const t=this.getDecorator("beforeProperties");return t.length>0?t.reduce((e,t)=>Object.assign({},e,t.call(this,e)),Object.assign({},e)):e}_runBeforeRenders(){const e=this.getDecorator("beforeRender");return e.length>0?e.reduce((e,t)=>{const o=t.call(this,e,this._properties,this._children);return o||(console.warn("Render function not returned from beforeRender, using previous render"),e)},this._boundRenderFunc):this._boundRenderFunc}runAfterRenders(e){const t=this.getDecorator("afterRender");return t.length>0&&(e=t.reduce((e,t)=>t.call(this,e),e)),void 0!==this._metaMap&&this._metaMap.forEach(e=>{e.afterRender()}),e}_runAfterConstructors(){const e=this.getDecorator("afterConstructor");e.length>0&&e.forEach(e=>e.call(this))}own(e){this._handles.push(e)}destroy(){for(;this._handles.length>0;){const e=this._handles.pop();e&&e.destroy()}}}t.a=p,p._type=u.b},"./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs":function(e,t,o){"use strict";let r="",s="";function n(e){""===s&&function(e){if("WebkitTransition"in e.style)r="webkitTransitionEnd",s="webkitAnimationEnd";else{if(!("transition"in e.style||"MozTransition"in e.style))throw new Error("Your browser is not supported");r="transitionend",s="animationend"}}(e)}function i(e,t,o){n(e);let i=!1,d=function(){i||(i=!0,e.removeEventListener(r,d),e.removeEventListener(s,d),o())};t(),e.addEventListener(s,d),e.addEventListener(r,d)}t.a={enter:function(e,t,o){const r=t.enterAnimationActive||`${o}-active`;i(e,()=>{e.classList.add(o),requestAnimationFrame(function(){e.classList.add(r)})},()=>{e.classList.remove(o),e.classList.remove(r)})},exit:function(e,t,o,r){const s=t.exitAnimationActive||`${o}-active`;i(e,()=>{e.classList.add(o),requestAnimationFrame(function(){e.classList.add(s)})},()=>{r()})}}},"./node_modules/@dojo/framework/widget-core/d.mjs":function(e,t,o){"use strict";t.f=d,t.e=a,t.d=function(e){return Boolean(e&&"string"!=typeof e&&e.type===i)},t.h=function(e,t,o=[]){return{children:o,widgetConstructor:e,properties:t,type:s}},t.g=function(e,t={},o){let r,s=t;Array.isArray(t)&&(o=t,s={});"function"==typeof s&&(r=s,s={});return{tag:e,deferredPropertiesCallback:r,children:o,properties:s,type:n}},t.c=function({node:e,attrs:t={},props:o={},on:r={},diffType:s="none"},n){return{tag:c(e)?e.tagName.toLowerCase():"",properties:o,attributes:t,events:r,children:n,type:i,domNode:e,text:c(e)?void 0:e.data,diffType:s}};var r=o("./node_modules/@dojo/framework/shim/Symbol.mjs");const s=Object(r.a)("Identifier for a WNode.");t.b=s;const n=Object(r.a)("Identifier for a VNode.");t.a=n;const i=Object(r.a)("Identifier for a VNode created using existing dom.");function d(e){return Boolean(e&&"string"!=typeof e&&e.type===s)}function a(e){return Boolean(e&&"string"!=typeof e&&(e.type===n||e.type===i))}function c(e){return!!e.tagName}},"./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs":function(e,t,o){"use strict";t.a=s;var r=o("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs");function s(e){return Object(r.a)((t,o)=>{t.addDecorator("afterRender",o?t[o]:e)})}},"./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs":function(e,t,o){"use strict";t.a=n;var r=o("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"),s=o("./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs");function n(){return Object(r.a)((e,t)=>{Object(s.a)(function(){this.invalidate()})(e)})}},"./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs":function(e,t,o){"use strict";t.a=s;var r=o("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs");function s(e){return Object(r.a)((t,o)=>{t.addDecorator("beforeProperties",o?t[o]:e)})}},"./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs":function(e,t,o){"use strict";t.a=n;var r=o("./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs"),s=o("./node_modules/@dojo/framework/widget-core/Registry.mjs");function n({tag:e,properties:t=[],attributes:o=[],events:n=[],childType:i=r.CustomElementChildType.DOJO,registryFactory:d=(()=>new s.c)}){return function(r){r.prototype.__customElementDescriptor={tagName:e,attributes:o,properties:t,events:n,childType:i,registryFactory:d}}}},"./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs":function(e,t,o){"use strict";t.a=n;var r=o("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"),s=o("./node_modules/@dojo/framework/widget-core/diff.mjs");function n(e,t=s.a,o){return Object(r.a)((r,s)=>{r.addDecorator(`diffProperty:${e}`,t.bind(null)),r.addDecorator("registeredDiffProperty",e),(o||s)&&r.addDecorator("diffReaction",{propertyName:e,reaction:s?r[s]:o})})}},"./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs":function(e,t,o){"use strict";function r(e){return function(t,o,r){"function"==typeof t?e(t.prototype,void 0):e(t,o)}}t.a=r},"./node_modules/@dojo/framework/widget-core/decorators/inject.mjs":function(e,t,o){"use strict";t.a=d;var r=o("./node_modules/@dojo/framework/shim/WeakMap.mjs"),s=o("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"),n=o("./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs");const i=new r.a;function d({name:e,getProperties:t}){return Object(s.a)((o,r)=>{Object(n.a)(function(o){const r=this.registry.getInjector(e);if(r){const{injector:e,invalidator:s}=r,n=i.get(this)||[];return 0===n.length&&i.set(this,n),-1===n.indexOf(r)&&(this.own(s.on("invalidate",()=>{this.invalidate()})),n.push(r)),t(e(),o)}})(o)})}},"./node_modules/@dojo/framework/widget-core/diff.mjs":function(e,t,o){"use strict";t.b=i,t.a=function(e,t){let o;o="function"==typeof t?t._type===r.b?n(e,t):function(e,t){return{changed:!1,value:t}}(0,t):s(t)?i(e,t):n(e,t);return o};var r=o("./node_modules/@dojo/framework/widget-core/Registry.mjs");function s(e){return"[object Object]"===Object.prototype.toString.call(e)||Array.isArray(e)}function n(e,t){return{changed:e!==t,value:t}}function i(e,t){let o=!1;const r=e&&s(e),n=t&&s(t);if(!r||!n)return{changed:!0,value:t};const i=Object.keys(e),d=Object.keys(t);return{changed:o=i.length!==d.length||d.some(o=>t[o]!==e[o]),value:t}}},"./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs":function(e,t,o){"use strict";t.a=u;var r,s,n=o("./node_modules/tslib/tslib.es6.js"),i=o("./node_modules/@dojo/framework/core/lang.mjs"),d=o("./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs"),a=o("./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs"),c=o("./node_modules/@dojo/framework/widget-core/d.mjs"),l=o("./node_modules/@dojo/framework/widget-core/vdom.mjs");function u(e){class t extends e{constructor(...e){super(...e),this._root=document.body,this._async=!0,this._projectorProperties={},this._projectionOptions={transitions:d.a},this.root=document.body,this.projectorState=r.Detached}append(e){const t={type:s.Append,root:e};return this._attach(t)}merge(e){const t={type:s.Merge,root:e};return this._attach(t)}set root(e){if(this.projectorState===r.Attached)throw new Error("Projector already attached, cannot change root element");this._root=e}get root(){return this._root}get async(){return this._async}set async(e){if(this.projectorState===r.Attached)throw new Error("Projector already attached, cannot change async mode");this._async=e}sandbox(e=document){if(this.projectorState===r.Attached)throw new Error("Projector already attached, cannot create sandbox");this._async=!1;const t=this.root;this.own({destroy:()=>{this._root=t}}),this._attach({root:e.createDocumentFragment(),type:s.Append})}setChildren(e){this.__setChildren__(e)}setProperties(e){this.__setProperties__(e)}__setProperties__(e){this._projectorProperties&&this._projectorProperties.registry!==e.registry&&this._projectorProperties.registry&&this._projectorProperties.registry.destroy(),this._projectorProperties=Object(i.a)({},e),super.__setCoreProperties__({bind:this,baseRegistry:e.registry}),super.__setProperties__(e)}toHtml(){if(this.projectorState!==r.Attached||!this._projection)throw new Error("Projector is not attached, cannot return an HTML string of projection.");return this._projection.domNode.childNodes[0].outerHTML}afterRender(e){let t=e;return"string"!=typeof e&&null!==e&&void 0!==e||(t=Object(c.g)("span",{},[e])),t}destroy(){super.destroy()}_attach({type:e,root:t}){if(t&&(this.root=t),this._attachHandle)return this._attachHandle;this.projectorState=r.Attached;const o={destroy:()=>{this.projectorState===r.Attached&&(this._projection=void 0,this.projectorState=r.Detached)}};switch(this.own(o),this._attachHandle=o,this._projectionOptions=Object.assign({},this._projectionOptions,{sync:!this._async}),e){case s.Append:this._projection=l.a.append(this.root,this,this._projectionOptions);break;case s.Merge:this._projection=l.a.merge(this.root,this,this._projectionOptions)}return this._attachHandle}}return n.a([Object(a.a)()],t.prototype,"afterRender",null),t}!function(e){e[e.Attached=1]="Attached",e[e.Detached=2]="Detached"}(r||(r={})),function(e){e[e.Append=1]="Append",e[e.Merge=2]="Merge"}(s||(s={}))},"./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs":function(e,t,o){"use strict";t.c=function(e){return Object(i.a)(t=>{t.addDecorator("baseThemeClasses",e)})},t.b=function(e,t){const o=new s.a(e);return t.defineInjector(l,e=>(o.setInvalidator(e),()=>o.get())),o},t.a=u;var r=o("./node_modules/tslib/tslib.es6.js"),s=o("./node_modules/@dojo/framework/widget-core/Injector.mjs"),n=o("./node_modules/@dojo/framework/widget-core/decorators/inject.mjs"),i=o("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs"),d=o("./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs"),a=o("./node_modules/@dojo/framework/widget-core/diff.mjs");const c=" _key",l=Symbol("theme");function u(e){let t=class extends e{constructor(){super(...arguments),this._registeredBaseThemeKeys=[],this._recalculateClasses=!0,this._theme={}}theme(e){return this._recalculateClasses&&this._recalculateThemeClasses(),Array.isArray(e)?e.map(e=>this._getThemeClass(e)):this._getThemeClass(e)}onPropertiesChanged(){this._recalculateClasses=!0}_getThemeClass(e){if(void 0===e||null===e)return e;const t=this.properties.extraClasses||{},o=this._baseThemeClassesReverseLookup[e];let r=[];return o?(t[o]&&r.push(t[o]),this._theme[o]?r.push(this._theme[o]):r.push(this._registeredBaseTheme[o]),r.join(" ")):(console.warn(`Class name: '${e}' not found in theme`),null)}_recalculateThemeClasses(){const{theme:e={}}=this.properties,t=this.getDecorator("baseThemeClasses");this._registeredBaseTheme||(this._registeredBaseTheme=t.reduce((e,t)=>{const o=c,s=t[o],n=r.b(t,["symbol"==typeof o?o:o+""]);return this._registeredBaseThemeKeys.push(s),Object.assign({},e,n)},{}),this._baseThemeClassesReverseLookup=t.reduce((e,t)=>(Object.keys(t).forEach(o=>{e[t[o]]=o}),e),{})),this._theme=this._registeredBaseThemeKeys.reduce((t,o)=>Object.assign({},t,e[o]),{}),this._recalculateClasses=!1}};return r.a([Object(d.a)("theme",a.b),Object(d.a)("extraClasses",a.b)],t.prototype,"onPropertiesChanged",null),t=r.a([Object(n.a)({name:l,getProperties:(e,t)=>t.theme?{}:{theme:e}})],t)}},"./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs":function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),o.d(t,"CustomElementChildType",function(){return r}),t.DomToWidgetWrapper=m,t.create=h,t.register=f;var r,s=o("./node_modules/tslib/tslib.es6.js"),n=o("./node_modules/@dojo/framework/widget-core/WidgetBase.mjs"),i=o("./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs"),d=o("./node_modules/@dojo/framework/shim/array.mjs"),a=o("./node_modules/@dojo/framework/widget-core/d.mjs"),c=o("./node_modules/@dojo/framework/shim/global.mjs"),l=o("./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs"),u=o("./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs");function m(e){let t=class extends n.a{render(){const t=Object.keys(this.properties).reduce((e,t)=>{const o=this.properties[t];return 0===t.indexOf("on")&&(t=`__${t}`),e[t]=o,e},{});return Object(a.c)({node:e,props:t,diffType:"dom"})}static get domNode(){return e}};return t=s.a([Object(u.a)()],t)}function h(e,t){const{attributes:o,childType:s,registryFactory:u}=e,h={};return o.forEach(e=>{const t=e.toLowerCase();h[t]=e}),class extends HTMLElement{constructor(){super(...arguments),this._properties={},this._children=[],this._eventProperties={},this._initialised=!1}connectedCallback(){if(this._initialised)return;const o={},{attributes:h,properties:f,events:p}=e;this._properties=Object.assign({},this._properties,this._attributesToProperties(h)),[...h,...f].forEach(e=>{const t=this[e],r=e.replace(/^on/,"__");void 0!==t&&(this._properties[e]=t),r!==e&&(o[r]={get:()=>this._getProperty(e),set:t=>this._setProperty(e,t)}),o[e]={get:()=>this._getProperty(e),set:t=>this._setProperty(e,t)}}),p.forEach(e=>{const t=e.replace(/^on/,"").toLowerCase(),r=e.replace(/^on/,"__on");o[r]={get:()=>this._getEventProperty(e),set:t=>this._setEventProperty(e,t)},this._eventProperties[e]=void 0,this._properties[e]=((...o)=>{const r=this._getEventProperty(e);"function"==typeof r&&r(...o),this.dispatchEvent(new CustomEvent(t,{bubbles:!1,detail:o}))})}),Object.defineProperties(this,o);const g=s===r.TEXT?this.childNodes:this.children;Object(d.a)(g).forEach(e=>{s===r.DOJO?(e.addEventListener("dojo-ce-render",()=>this._render()),e.addEventListener("dojo-ce-connected",()=>this._render()),this._children.push(m(e))):this._children.push(Object(a.c)({node:e,diffType:"dom"}))}),this.addEventListener("dojo-ce-connected",e=>this._childConnected(e));const j=this._properties,_=()=>this.__children__(),y=u(),b=Object(l.b)(this._getTheme(),y);c.a.addEventListener("dojo-theme-set",()=>b.set(this._getTheme()));const w=Object(i.a)(class extends n.a{render(){return Object(a.h)(t,j,_())}});this._projector=new w,this._projector.setProperties({registry:y}),this._projector.append(this),this._initialised=!0,this.dispatchEvent(new CustomEvent("dojo-ce-connected",{bubbles:!0,detail:this}))}_getTheme(){if(c.a&&c.a.dojoce&&c.a.dojoce.theme)return c.a.dojoce.themes[c.a.dojoce.theme]}_childConnected(e){const t=e.detail;if(t.parentNode===this){this._children.some(e=>e.domNode===t)||(t.addEventListener("dojo-ce-render",()=>this._render()),this._children.push(m(t)),this._render())}}_render(){this._projector&&(this._projector.invalidate(),this.dispatchEvent(new CustomEvent("dojo-ce-render",{bubbles:!1,detail:this})))}__properties__(){return Object.assign({},this._properties,this._eventProperties)}__children__(){return s===r.DOJO?this._children.filter(e=>e.domNode.isWidget).map(e=>{const{domNode:t}=e;return Object(a.h)(e,Object.assign({},t.__properties__()),[...t.__children__()])}):this._children}attributeChangedCallback(e,t,o){const r=h[e];this._setProperty(r,o)}_setEventProperty(e,t){this._eventProperties[e]=t}_getEventProperty(e){return this._eventProperties[e]}_setProperty(e,t){"function"==typeof t&&(t[n.b]=!0),this._properties[e]=t,this._render()}_getProperty(e){return this._properties[e]}_attributesToProperties(e){return e.reduce((e,t)=>{const o=t.toLowerCase(),r=this.getAttribute(o);return null!==r&&(e[t]=r),e},{})}static get observedAttributes(){return Object.keys(h)}get isWidget(){return!0}}}function f(e){const t=e.prototype&&e.prototype.__customElementDescriptor;if(!t)throw new Error("Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?");c.a.customElements.define(t.tagName,h(t,e))}!function(e){e.DOJO="DOJO",e.NODE="NODE",e.TEXT="TEXT"}(r||(r={})),t.default=f},"./node_modules/@dojo/framework/widget-core/vdom.mjs":function(e,t,o){"use strict";var r=o("./node_modules/@dojo/framework/shim/global.mjs"),s=o("./node_modules/@dojo/framework/shim/array.mjs"),n=o("./node_modules/@dojo/framework/widget-core/d.mjs"),i=o("./node_modules/@dojo/framework/widget-core/Registry.mjs"),d=o("./node_modules/@dojo/framework/shim/WeakMap.mjs");const a="http://www.w3.org/2000/svg",c="http://www.w3.org/1999/xlink",l=[],u=["focus","blur","scrollIntoView","click"],m=new d.a;t.b=m;const h=new d.a,f=new d.a,p=new d.a;function g(e,t){return Object(n.e)(e)&&Object(n.e)(t)?(!Object(n.d)(e)&&!Object(n.d)(t)||e.domNode===t.domNode)&&(e.tag===t.tag&&e.properties.key===t.properties.key):!(!Object(n.f)(e)||!Object(n.f)(t))&&((void 0!==e.instance||"string"!=typeof t.widgetConstructor)&&(e.widgetConstructor===t.widgetConstructor&&e.properties.key===t.properties.key))}const j=function(){throw new Error("Provide a transitions object to the projectionOptions to do animations")};function _(e){if("string"!=typeof e)throw new Error("Style values must be strings")}function y(e,t,o,r,s,n){const i=p.get(r.projectorInstance),a=i.nodeMap.get(e)||new d.a;if(n){const o=a.get(n);e.removeEventListener(t,o)}let c=o.bind(s);"input"===t&&(c=function(e){o.call(this,e),e.target["oninput-value"]=e.target.value}.bind(s)),e.addEventListener(t,c),a.set(o,c),i.nodeMap.set(e,a)}function b(e,t){if(t){const o=t.split(" ");for(let t=0;t{r[e]()})}}function k(e,t,o,r,s=!1){const n=p.get(r.projectorInstance).nodeMap.get(e);n&&Object.keys(t).forEach(r=>{const i="on"===r.substr(0,2)||s,d=s?r:r.substr(2);if(i&&!o[r]){const o=n.get(t[r]);o&&e.removeEventListener(d,o)}})}function O(e,t,o,r){r.namespace===a&&"href"===t?e.setAttributeNS(c,t,o):"role"===t&&""===o||void 0===o?e.removeAttribute(t):e.setAttribute(t,o)}function P(e,t,o,r){const s=Object.keys(o),n=s.length;for(let i=0;i0)if(c&&0!==c.length){const r=[...o];for(let o=0;o0&&R(r.children,t));else{if(!r.coreProperties){const e=m.get(t);r.coreProperties={bind:t,baseRegistry:e.coreProperties.baseRegistry}}r.children&&r.children.length>0&&R(r.children,t)}o++}else e.splice(o,1)}return e}function A(e,t){if(Object(n.e)(e)&&e.properties){const o=e.properties.enterAnimation;o&&("function"==typeof o?o(e.domNode,e.properties):t.enter(e.domNode,e.properties,o))}}function x(e,t,o){if(Object(n.f)(e)){const r=h.get(e.instance),s=(r?r.dnode.rendered:e.rendered)||l;if(e.instance){m.get(e.instance).onDetach(),h.delete(e.instance)}for(let e=0;e0)for(let r=0;r{let d=void 0,a=o,m=f+1,p=o[f];if(p||(p=t[0],m=1,a=t),p){let t=[p];for(;t.length;){const o=t.shift();if(Object(n.f)(o)){const e=h.get(o.instance);e&&e.dnode.rendered&&t.push(...e.dnode.rendered)}else if(o.domNode){if(o.domNode.parentElement!==e.domNode)break;d=o.domNode;break}0===t.length&&a[m]&&(t.push(a[m]),m++)}}I(l,e,r.slice(j+1),d,i,s),A(l,c);const g=j;u.afterRenderCallbacks.push(()=>{M(r,g,s)})};if(!a||-1===m){p(),j++;continue}const y=()=>{const e=f;if(u.afterRenderCallbacks.push(()=>{M(o,e,s)}),Object(n.f)(a)){const e=h.get(a.instance);e&&(a=e.dnode)}x(a,c,i)};-1!==C(r,a,j+1)?(p(),y(),f++,j++):(y(),f++)}if(d>f)for(m=f;m{M(o,e,s)});let t=o[m];if(Object(n.f)(t)){const e=h.get(t.instance);e&&(t=e.dnode)}x(t,c,i)}return _}function S(e,t,o,r,i,d){if(void 0===t)return;const a=p.get(o.projectorInstance);a.merge&&void 0===d&&(d=Object(s.a)(e.domNode.childNodes));const c=o.transitions;o=Object.assign({},o,{depth:o.depth+1});for(let s=0;s0;)(e=d.shift())&&e.tagName===(l.tag.toUpperCase()||void 0)&&(l.domNode=e)}I(l,e,u,i,o,r)}else I(l,e,u,i,o,r,d);A(l,c)}}function D(e,t,o,r){if(S(t,t.children,r,o,void 0),"function"==typeof t.deferredPropertiesCallback&&void 0===t.inserted&&W(t,r),t.attributes&&t.events){P(e,{},t.attributes,r),E(e,{},t.properties,r,!1),k(e,{},t.events,r,!0);const o=t.events;Object.keys(o).forEach(s=>{y(e,s,o[s],r,t.properties.bind)})}else E(e,{},t.properties,r);if(null!==t.properties.key&&void 0!==t.properties.key){m.get(o).nodeHandler.add(e,`${t.properties.key}`)}t.inserted=!0}function I(e,t,o,r,s,d,c){let l;const u=p.get(s.projectorInstance);if(Object(n.f)(e)){let{widgetConstructor:n}=e;const a=m.get(d);if(!Object(i.d)(n)){const e=a.registry().get(n);if(null===e)return;n=e}const l=new n;e.instance=l,f.set(l,o);const p=m.get(l);p.invalidate=(()=>{p.dirty=!0,!1===p.rendering&&(u.renderQueue.push({instance:l,depth:s.depth}),H(s))}),p.rendering=!0,l.__setCoreProperties__(e.coreProperties),l.__setChildren__(e.children),l.__setProperties__(e.properties);const g=l.__render__();if(p.rendering=!1,g){const o=R(g,l);e.rendered=o,S(t,o,s,l,r,c)}h.set(l,{dnode:e,parentVNode:t}),p.nodeHandler.addRoot(),u.afterRenderCallbacks.push(()=>{p.onAttach()})}else{if(u.merge&&void 0!==u.mergeElement)return l=e.domNode=s.mergeElement,u.mergeElement=void 0,void D(l,e,d,s);const o=t.domNode.ownerDocument;if(e.tag||"string"!=typeof e.text)void 0===e.domNode?("svg"===e.tag&&(s=Object.assign({},s,{namespace:a})),l=void 0!==s.namespace?e.domNode=o.createElementNS(s.namespace,e.tag):e.domNode=e.domNode||o.createElement(e.tag)):l=e.domNode,D(l,e,d,s),void 0!==r?t.domNode.insertBefore(l,r):l.parentNode!==t.domNode&&t.domNode.appendChild(l);else if(void 0!==e.domNode&&t.domNode){const o=e.domNode.ownerDocument.createTextNode(e.text);t.domNode===e.domNode.parentNode?t.domNode.replaceChild(o,e.domNode):(t.domNode.appendChild(o),e.domNode.parentNode&&e.domNode.parentNode.removeChild(e.domNode)),e.domNode=o}else l=e.domNode=o.createTextNode(e.text),void 0!==r?t.domNode.insertBefore(l,r):t.domNode.appendChild(l)}}function L(e,t,o,r,s,i,d){if(Object(n.f)(t)){const{instance:r}=e,{parentVNode:s,dnode:n}=h.get(r),a=n?n.rendered:e.rendered,c=m.get(r);if(c.rendering=!0,r.__setCoreProperties__(t.coreProperties),r.__setChildren__(t.children),r.__setProperties__(t.properties),f.set(r,d),t.instance=r,!0===c.dirty){const e=r.__render__();c.rendering=!1,t.rendered=R(e,r),T(s,i,a,t.rendered,r,o)}else c.rendering=!1,t.rendered=a;h.set(r,{dnode:t,parentVNode:s}),c.nodeHandler.addRoot()}else{if(e===t)return!1;const r=t.domNode=e.domNode;let n=!1,d=!1;if(t.tag||"string"!=typeof t.text){if(t.tag&&0===t.tag.lastIndexOf("svg",0)&&(o=Object.assign({},o,{namespace:a})),e.children!==t.children){const r=R(t.children,s);t.children=r,d=T(t,i,e.children,r,s,o)||d}const n=function(e,t,o){const{diffType:r,properties:s,attributes:n}=o;if(!r||"vdom"===r)return{properties:t.properties,attributes:t.attributes,events:t.events};if("none"===r)return{properties:{},attributes:t.attributes?{}:void 0,events:t.events};let i={properties:{}};return n?(i.attributes={},i.events=t.events,Object.keys(s).forEach(t=>{i.properties[t]=e[t]}),Object.keys(n).forEach(t=>{i.attributes[t]=e.getAttribute(t)}),i):(i.properties=Object.keys(s).reduce((t,o)=>(t[o]=e.getAttribute(o)||e[o],t),{}),i)}(r,e,t);if(t.attributes&&t.events){P(r,n.attributes,t.attributes,o),d=E(r,n.properties,t.properties,o,!1)||d,k(r,n.events,t.events,o,!0);const e=t.events;Object.keys(e).forEach(s=>{y(r,s,e[s],o,t.properties.bind,n.events[s])})}else d=E(r,n.properties,t.properties,o)||d;if(null!==t.properties.key&&void 0!==t.properties.key){m.get(s).nodeHandler.add(r,`${t.properties.key}`)}}else if(t.text!==e.text){const e=r.ownerDocument.createTextNode(t.text);return r.parentNode.replaceChild(e,r),t.domNode=e,n=!0}d&&t.properties&&t.properties.updateAnimation&&t.properties.updateAnimation(r,t.properties,e.properties)}}function W(e,t){e.decoratedDeferredProperties=e.properties;const o=e.deferredPropertiesCallback(!!e.inserted),r=p.get(t.projectorInstance);e.properties=Object.assign({},o,e.decoratedDeferredProperties),r.deferredRenderCallbacks.push(()=>{const o=Object.assign({},e.deferredPropertiesCallback(!!e.inserted),e.decoratedDeferredProperties);E(e.domNode,e.properties,o,t),e.properties=o})}function B(e){const t=p.get(e.projectorInstance);if(t.deferredRenderCallbacks.length)if(e.sync)for(;t.deferredRenderCallbacks.length;){const e=t.deferredRenderCallbacks.shift();e&&e()}else r.a.requestAnimationFrame(()=>{for(;t.deferredRenderCallbacks.length;){const e=t.deferredRenderCallbacks.shift();e&&e()}})}function F(e){const t=p.get(e.projectorInstance);if(e.sync)for(;t.afterRenderCallbacks.length;){const e=t.afterRenderCallbacks.shift();e&&e()}else r.a.requestIdleCallback?r.a.requestIdleCallback(()=>{for(;t.afterRenderCallbacks.length;){const e=t.afterRenderCallbacks.shift();e&&e()}}):setTimeout(()=>{for(;t.afterRenderCallbacks.length;){const e=t.afterRenderCallbacks.shift();e&&e()}})}function H(e){const t=p.get(e.projectorInstance);e.sync?$(e):void 0===t.renderScheduled&&(t.renderScheduled=r.a.requestAnimationFrame(()=>{$(e)}))}function $(e){const t=p.get(e.projectorInstance);t.renderScheduled=void 0;const o=[...t.renderQueue];t.renderQueue=[],o.sort((e,t)=>e.depth-t.depth);const r=[];for(;o.length;){const{instance:t}=o.shift();if(h.has(t)&&-1===r.indexOf(t)){r.push(t);const{parentVNode:o,dnode:s}=h.get(t),n=m.get(t),i=f.get(t);L(s,N(t,n),e,0,t,i,i)}}F(e),B(e)}const q={append:function(e,t,o={}){const r=m.get(t),s=function(e,t){const o={namespace:void 0,styleApplyer:function(e,t,o){e.style[t]=o},transitions:{enter:j,exit:j},depth:0,merge:!1,sync:!1,projectorInstance:t};return Object.assign({},o,e)}(o,t),i={afterRenderCallbacks:[],deferredRenderCallbacks:[],nodeMap:new d.a,renderScheduled:void 0,renderQueue:[],merge:o.merge||!1,mergeElement:o.mergeElement};p.set(t,i),s.rootNode=e;const a={tag:"",properties:{},children:void 0,domNode:s.rootNode,type:n.a};const c=N(t,r);return h.set(t,{dnode:c,parentVNode:a}),r.invalidate=(()=>{r.dirty=!0,!1===r.rendering&&(i.renderQueue.push({instance:t,depth:s.depth}),H(s))}),L(c,c,s,0,t,[],[]),i.afterRenderCallbacks.push(()=>{r.onAttach()}),B(s),F(s),{domNode:s.rootNode}},create:function(e,t){return this.append(document.createElement("div"),e,t)},merge:function(e,t,o={}){o.merge=!0,o.mergeElement=e;const r=this.append(e.parentNode,t,o);return p.get(t).merge=!1,r}};t.a=q},"./node_modules/imports-loader/index.js?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js":function(e,t,o){var r=o("./src/menu/Menu.ts"),s=o("./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs").default,n=r.default;n&&s(n)},"./node_modules/process/browser.js":function(e,t){var o,r,s=e.exports={};function n(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function d(e){if(o===setTimeout)return setTimeout(e,0);if((o===n||!o)&&setTimeout)return o=setTimeout,setTimeout(e,0);try{return o(e,0)}catch(t){try{return o.call(null,e,0)}catch(t){return o.call(this,e,0)}}}!function(){try{o="function"==typeof setTimeout?setTimeout:n}catch(e){o=n}try{r="function"==typeof clearTimeout?clearTimeout:i}catch(e){r=i}}();var a,c=[],l=!1,u=-1;function m(){l&&a&&(l=!1,a.length?c=a.concat(c):u=-1,c.length&&h())}function h(){if(!l){var e=d(m);l=!0;for(var t=c.length;t;){for(a=c,c=[];++u1)for(var o=1;o=0;d--)(s=e[d])&&(i=(n<3?s(i):n>3?s(t,o,i):s(t,o))||i);return n>3&&i&&Object.defineProperty(t,o,i),i}; /*! ***************************************************************************** Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use @@ -21,5 +21,5 @@ MERCHANTABLITY OR NON-INFRINGEMENT. See the Apache Version 2.0 License for specific language governing permissions and limitations under the License. ***************************************************************************** */ -Object.setPrototypeOf||Array;Object.assign},"./node_modules/webpack/buildin/global.js":function(e,t){var o;o=function(){return this}();try{o=o||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(o=window)}e.exports=o},"./src/menu/Menu.ts":function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),o.d(t,"Menu",function(){return c});var r=o("./node_modules/tslib/tslib.es6.js"),s=o("./node_modules/@dojo/widget-core/d.mjs"),n=o("./node_modules/@dojo/widget-core/decorators/customElement.mjs"),i=o("./node_modules/@dojo/widget-core/mixins/Themed.mjs"),d=o("./node_modules/@dojo/widget-core/WidgetBase.mjs"),a=o("./src/menu/menu.m.css");o.n(a);let c=class extends(Object(i.a)(d.a)){_onSelected(e,t){this._selectedId=e,this.properties.onSelected(t),this.invalidate()}render(){const e=this.children.map((e,t)=>{if(e){const o={onSelected:e=>{this._onSelected(t,e)}};void 0!==this._selectedId&&(o.selected=t===this._selectedId),e.properties=Object.assign({},e.properties,o)}return e});return Object(s.g)("nav",{classes:this.theme(a.root)},[Object(s.g)("ol",{classes:this.theme(a.menuContainer)},e)])}};c=r.a([Object(n.a)({tag:"demo-menu",events:["onSelected"]}),Object(i.c)(a)],c),t.default=c},"./src/menu/menu.m.css":function(e,t){e.exports={" _key":"test-app/menu",root:"_3bA6jdSn",menuContainer:"_1eoGfqku"}},0:function(e,t,o){e.exports=o("./node_modules/imports-loader/index.js?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js")}}); +Object.setPrototypeOf||Array;Object.assign},"./node_modules/webpack/buildin/global.js":function(e,t){var o;o=function(){return this}();try{o=o||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(o=window)}e.exports=o},"./src/menu/Menu.ts":function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),o.d(t,"Menu",function(){return c});var r=o("./node_modules/tslib/tslib.es6.js"),s=o("./node_modules/@dojo/framework/widget-core/d.mjs"),n=o("./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs"),i=o("./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs"),d=o("./node_modules/@dojo/framework/widget-core/WidgetBase.mjs"),a=o("./src/menu/menu.m.css");o.n(a);let c=class extends(Object(i.a)(d.a)){_onSelected(e,t){this._selectedId=e,this.properties.onSelected(t),this.invalidate()}render(){const e=this.children.map((e,t)=>{if(e){const o={onSelected:e=>{this._onSelected(t,e)}};void 0!==this._selectedId&&(o.selected=t===this._selectedId),e.properties=Object.assign({},e.properties,o)}return e});return Object(s.g)("nav",{classes:this.theme(a.root)},[Object(s.g)("ol",{classes:this.theme(a.menuContainer)},e)])}};c=r.a([Object(n.a)({tag:"demo-menu",events:["onSelected"]}),Object(i.c)(a)],c),t.default=c},"./src/menu/menu.m.css":function(e,t){e.exports={" _key":"test-app/menu",root:"_3bA6jdSn",menuContainer:"_1eoGfqku"}},0:function(e,t,o){e.exports=o("./node_modules/imports-loader/index.js?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js")}}); //# sourceMappingURL=menu-1.0.0.js.map \ No newline at end of file diff --git a/test-app/fixtures/windows/dist/menu/menu-1.0.0.js.map b/test-app/fixtures/windows/dist/menu/menu-1.0.0.js.map index 6765c9b..ee6d512 100644 --- a/test-app/fixtures/windows/dist/menu/menu-1.0.0.js.map +++ b/test-app/fixtures/windows/dist/menu/menu-1.0.0.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 3e984433321e15a3bb9b","webpack:///./node_modules/@dojo/core/Destroyable.mjs","webpack:///./node_modules/@dojo/core/Evented.mjs","webpack:///./node_modules/@dojo/core/lang.mjs","webpack:///./node_modules/@dojo/has/has.mjs","webpack:///./node_modules/@dojo/shim/Map.mjs","webpack:///./node_modules/@dojo/shim/Promise.mjs","webpack:///./node_modules/@dojo/shim/Symbol.mjs","webpack:///./node_modules/@dojo/shim/WeakMap.mjs","webpack:///./node_modules/@dojo/shim/array.mjs","webpack:///./node_modules/@dojo/shim/global.mjs","webpack:///./node_modules/@dojo/shim/number.mjs","webpack:///./node_modules/@dojo/shim/object.mjs","webpack:///./node_modules/@dojo/shim/string.mjs","webpack:///./node_modules/@dojo/shim/support/has.mjs","webpack:///./node_modules/@dojo/shim/support/queue.mjs","webpack:///./node_modules/@dojo/shim/support/util.mjs","webpack:///./node_modules/@dojo/widget-core/Injector.mjs","webpack:///./node_modules/@dojo/widget-core/NodeHandler.mjs","webpack:///./node_modules/@dojo/widget-core/Registry.mjs","webpack:///./node_modules/@dojo/widget-core/RegistryHandler.mjs","webpack:///./node_modules/@dojo/widget-core/WidgetBase.mjs","webpack:///./node_modules/@dojo/widget-core/animations/cssTransitions.mjs","webpack:///./node_modules/@dojo/widget-core/d.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/afterRender.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/customElement.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/diffProperty.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs","webpack:///./node_modules/@dojo/widget-core/decorators/inject.mjs","webpack:///./node_modules/@dojo/widget-core/diff.mjs","webpack:///./node_modules/@dojo/widget-core/mixins/Projector.mjs","webpack:///./node_modules/@dojo/widget-core/mixins/Themed.mjs","webpack:///./node_modules/@dojo/widget-core/registerCustomElement.mjs","webpack:///./node_modules/@dojo/widget-core/vdom.mjs","webpack:///./node_modules/@dojo/cli-build-widget/template/custom-element.js","webpack:///./node_modules/process/browser.js","webpack:///./node_modules/tslib/tslib.es6.js","webpack:///(webpack)/buildin/global.js","webpack:///./src/menu/Menu.ts","webpack:///./src/menu/menu.m.css?ec11"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","noop","__WEBPACK_IMPORTED_MODULE_1__dojo_shim_Promise__","resolve","destroyed","Error","Destroyable","[object Object]","this","handles","handle","Array","isArray","__WEBPACK_IMPORTED_MODULE_0__lang__","_handles","push","splice","indexOf","destroy","forEach","own","__webpack_exports__","regexMap","__WEBPACK_IMPORTED_MODULE_0__dojo_shim_Map__","Evented","__WEBPACK_IMPORTED_MODULE_1__Destroyable__","super","arguments","listenersMap","event","methods","type","globString","targetString","regex","has","RegExp","replace","set","test","isGlobMatch","method","listener","map","_addListener","listeners","destructor","called","createHandle","length","slice","testCache","testFunctions","testThenables","globalScope","window","global","self","staticFeatures","DojoHasEnvironment","staticCache","apply","add","feature","value","overwrite","normalizedFeature","toLowerCase","Boolean","exists","TypeError","then","isFeatureTestThenable","resolvedValue","result","document","location","process","versions","node","Map","__WEBPACK_IMPORTED_MODULE_1__global__","ShimPromise","__WEBPACK_IMPORTED_MODULE_0__global__","Promise","Symbol","wellKnown","__WEBPACK_IMPORTED_MODULE_2__support_util__","for","WeakMap","from","of","copyWithin","fill","find","findIndex","includes","__WEBPACK_IMPORTED_MODULE_4__support_util__","globalObject","Math","pow","assign","getOwnPropertyDescriptor","getOwnPropertyNames","getOwnPropertySymbols","is","keys","getOwnPropertyDescriptors","entries","values","fromCodePoint","raw","codePointAt","endsWith","normalize","repeat","startsWith","padEnd","padStart","String","__WEBPACK_IMPORTED_MODULE_0__dojo_has_has__","every","key","Number","POSITIVE_INFINITY","e","imul","Observable","Set","getCallSite","callSite","substitutions","key1","key2","freeze","postMessage","requestAnimationFrame","setImmediate","MutationObserver","WebKitMutationObserver","example","createElement","observer","observe","attributes","style","setProperty","takeRecords","undefined","Animation","KeyframeEffect","executeTask","item","isActive","callback","getQueueHandle","enqueue","queue","addEventListener","source","data","stopPropagation","shift","queueTask","id","queueAnimationTask","rafId","bind","cancelAnimationFrame","writable","nativeFunction","target","args","Injector","__WEBPACK_IMPORTED_MODULE_0__dojo_core_Evented__","payload","_payload","invalidator","_invalidator","NodeEventType","_nodeMap","__WEBPACK_IMPORTED_MODULE_1__dojo_shim_Map__","element","emit","Widget","Projector","clear","WIDGET_BASE_TYPE","__WEBPACK_IMPORTED_MODULE_2__dojo_shim_Symbol__","isWidgetBaseConstructor","_type","Registry","__WEBPACK_IMPORTED_MODULE_3__dojo_core_Evented__","widgetLabel","action","label","_widgetRegistry","toString","__WEBPACK_IMPORTED_MODULE_0__dojo_shim_Promise__","widgetCtor","emitLoadedEvent","error","injectorFactory","_injectorRegistry","injectorItem","injector","promise","default","isWidgetConstructorDefaultExport","hasInjector","__WEBPACK_IMPORTED_MODULE_1__dojo_core_Evented__","_registry","__WEBPACK_IMPORTED_MODULE_2__Registry__","_registryWidgetLabelMap","_registryInjectorLabelMap","baseRegistry","delete","base","widget","define","defineInjector","globalPrecedence","_get","getFunctionName","labelMap","registries","registry","registeredLabels","on","decoratorMap","boundAuto","__WEBPACK_IMPORTED_MODULE_4__diff__","noBind","WidgetBase","_initialProperties","_changedPropertyKeys","_nodeHandler","__WEBPACK_IMPORTED_MODULE_6__NodeHandler__","_children","_decoratorCache","_properties","_boundRenderFunc","render","_boundInvalidate","invalidate","__WEBPACK_IMPORTED_MODULE_7__vdom__","dirty","onAttach","onDetach","nodeHandler","coreProperties","rendering","inputProperties","_runAfterConstructors","MetaType","_metaMap","cached","properties","changedPropertyKeys","instanceData","__WEBPACK_IMPORTED_MODULE_5__RegistryHandler__","originalProperties","_runBeforeProperties","registeredDiffPropertyNames","getDecorator","propertyNames","allProperties","checkedProperties","diffPropertyResults","runReactions","propertyName","previousProperty","newProperty","_bindFunctionProperty","diffFunctions","changed","_mapDiffPropertyReactions","reaction","previousProperties","newProperties","children","dNode","_runBeforeRenders","runAfterRenders","__WEBPACK_IMPORTED_MODULE_3__d__","decoratorKey","decoratorList","constructor","specificDecoratorList","decorators","allDecorators","instanceMap","unshift","getPrototypeOf","_buildDecoratorList","reduce","reactionPropertyMap","reactionArguments","__WEBPACK_IMPORTED_MODULE_8__Registry__","_bindFunctionPropertyMap","__WEBPACK_IMPORTED_MODULE_1__dojo_shim_WeakMap__","bindInfo","boundFunc","scope","beforeProperties","beforePropertiesFunction","beforeRenders","beforeRenderFunction","updatedRender","console","warn","afterRenders","afterRenderFunction","meta","afterRender","afterConstructors","afterConstructor","pop","browserSpecificTransitionEndEventName","browserSpecificAnimationEndEventName","initialize","determineBrowserStyleNames","runAndCleanUp","startAnimation","finishAnimation","finished","transitionEnd","removeEventListener","enter","enterAnimation","activeClass","enterAnimationActive","classList","remove","exit","exitAnimation","removeNode","exitAnimationActive","child","DOMVNODE","widgetConstructor","WNODE","tag","propertiesOrChildren","deferredPropertiesCallback","VNODE","attrs","props","diffType","isElementNode","tagName","events","domNode","text","__WEBPACK_IMPORTED_MODULE_0__dojo_shim_Symbol__","isWNode","isVNode","__WEBPACK_IMPORTED_MODULE_0__handleDecorator__","propertyKey","addDecorator","alwaysRender","__WEBPACK_IMPORTED_MODULE_1__beforeProperties__","customElement","childType","__WEBPACK_IMPORTED_MODULE_0__registerCustomElement__","DOJO","registryFactory","__WEBPACK_IMPORTED_MODULE_1__Registry__","__customElementDescriptor","diffProperty","diffFunction","reactionFunction","handleDecorator","handler","descriptor","registeredInjectorsMap","__WEBPACK_IMPORTED_MODULE_0__dojo_shim_WeakMap__","inject","getProperties","__WEBPACK_IMPORTED_MODULE_1__handleDecorator__","__WEBPACK_IMPORTED_MODULE_2__beforeProperties__","getInjector","registeredInjectors","__WEBPACK_IMPORTED_MODULE_0__Registry__","reference","ignore","isObjectOrArray","shallow","validOldProperty","validNewProperty","previousKeys","newKeys","some","ProjectorAttachState","AttachType","ProjectorMixin","Base","_root","body","_async","_projectorProperties","_projectionOptions","transitions","__WEBPACK_IMPORTED_MODULE_2__animations_cssTransitions__","root","projectorState","Detached","options","Append","_attach","Merge","Attached","async","doc","previousRoot","createDocumentFragment","__setChildren__","__setProperties__","__WEBPACK_IMPORTED_MODULE_1__dojo_core_lang__","__setCoreProperties__","_projection","childNodes","outerHTML","__WEBPACK_IMPORTED_MODULE_4__d__","_attachHandle","sync","__WEBPACK_IMPORTED_MODULE_5__vdom__","append","merge","__WEBPACK_IMPORTED_MODULE_0_tslib__","__WEBPACK_IMPORTED_MODULE_3__decorators_afterRender__","Function","theme","__WEBPACK_IMPORTED_MODULE_3__decorators_handleDecorator__","themeRegistry","themeInjector","__WEBPACK_IMPORTED_MODULE_1__Injector__","INJECTED_THEME_KEY","setInvalidator","THEME_KEY","ThemedMixin","Themed","_registeredBaseThemeKeys","_recalculateClasses","_theme","classes","_recalculateThemeClasses","className","_getThemeClass","extraClasses","themeClassName","_baseThemeClassesReverseLookup","resultClassNames","_registeredBaseTheme","join","baseThemes","finalBaseTheme","baseTheme","_a","currentClassNames","baseClass","themeKey","__WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__","__WEBPACK_IMPORTED_MODULE_5__diff__","__WEBPACK_IMPORTED_MODULE_2__decorators_inject__","CustomElementChildType","DomToWidgetWrapper","__WEBPACK_IMPORTED_MODULE_1__WidgetBase__","__WEBPACK_IMPORTED_MODULE_7__decorators_alwaysRender__","create","WidgetConstructor","attributeMap","attributeName","HTMLElement","_eventProperties","_initialised","domProperties","_attributesToProperties","filteredPropertyName","_getProperty","_setProperty","eventName","_getEventProperty","_setEventProperty","eventCallback","dispatchEvent","CustomEvent","bubbles","detail","defineProperties","TEXT","__WEBPACK_IMPORTED_MODULE_3__dojo_shim_array__","childNode","_render","_childConnected","widgetProperties","renderChildren","__children__","themeContext","__WEBPACK_IMPORTED_MODULE_6__mixins_Themed__","_getTheme","__WEBPACK_IMPORTED_MODULE_5__dojo_shim_global__","__WEBPACK_IMPORTED_MODULE_2__mixins_Projector__","_projector","setProperties","dojoce","themes","parentNode","filter","Child","isWidget","__properties__","oldValue","getAttribute","observedAttributes","register","customElements","NAMESPACE_SVG","NAMESPACE_W3","NAMESPACE_XLINK","emptyArray","widgetInstanceMap","__WEBPACK_IMPORTED_MODULE_4__dojo_shim_WeakMap__","projectorStateMap","same","dnode1","dnode2","__WEBPACK_IMPORTED_MODULE_2__d__","instance","missingTransition","checkStyleValue","styleValue","updateEvent","currentValue","projectionOptions","previousValue","projectorInstance","eventMap","nodeMap","previousEvent","evt","addClasses","classNames","split","removeClasses","focusNode","propValue","deferredRenderCallbacks","focus","removeOrphanedEvents","onlyEvents","propName","isEvent","substr","updateAttribute","attrName","attrValue","namespace","setAttributeNS","removeAttribute","setAttribute","updateAttributes","previousAttributes","attrNames","attrCount","updateProperties","includesEventsAndAttributes","propertiesUpdated","propNames","propCount","previousClasses","currentClasses","newClasses","previousClassName","classIndex","styleNames","styleCount","j","styleName","newStyleValue","styleApplyer","domValue","lastIndexOf","findIndexOfChild","sameAs","start","toInternalWNode","rendered","filterAndDecorateChildren","nodeAdded","dnode","nodeToRemove","pointerEvents","removeDomNode","removeChild","checkDistinguishable","indexToCheck","parentInstance","nodeIdentifier","parentName","updateChildren","parentVNode","oldChildren","newChildren","oldChildrenLength","newChildrenLength","depth","oldIndex","newIndex","textUpdated","oldChild","newChild","inserted","addDeferredProperties","updateDom","findOldIndex","addChild","insertBeforeDomNode","nextIndex","insertBeforeChildren","insertBefore","createDom","afterRenderCallbacks","childToRemove","addChildren","__WEBPACK_IMPORTED_MODULE_1__dojo_shim_array__","domElement","toUpperCase","initPropertiesAndChildren","parentInstanceData","__WEBPACK_IMPORTED_MODULE_3__Registry__","renderQueue","scheduleRender","__render__","filteredRendered","addRoot","mergeElement","ownerDocument","createElementNS","appendChild","newDomNode","createTextNode","replaceChild","previous","previousRendered","updated","current","buildPreviousProperties","updateAnimation","vnode","decoratedDeferredProperties","runDeferredRenderCallbacks","__WEBPACK_IMPORTED_MODULE_0__dojo_shim_global__","runAfterRenderCallbacks","requestIdleCallback","setTimeout","renderScheduled","renders","sort","a","b","previouslyRendered","dom","finalProjectorOptions","projectorOptions","defaults","getProjectionOptions","rootNode","projection","widgetFactory","registerCustomElement","defaultExport","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","fun","clearTimeout","currentQueue","draining","queueIndex","cleanUpNextTick","concat","drainQueue","timeout","len","run","marker","runClearTimeout","Item","array","nextTick","title","browser","env","argv","version","addListener","once","off","removeListener","removeAllListeners","prependListener","prependOnceListener","binding","cwd","chdir","dir","umask","t","desc","r","Reflect","decorate","metadataKey","metadataValue","metadata","setPrototypeOf","g","eval","Menu","__WEBPACK_IMPORTED_MODULE_3__dojo_widget_core_mixins_Themed__","__WEBPACK_IMPORTED_MODULE_4__dojo_widget_core_WidgetBase__","_selectedId","onSelected","items","index","_onSelected","selected","__WEBPACK_IMPORTED_MODULE_1__dojo_widget_core_d__","__WEBPACK_IMPORTED_MODULE_5__menu_m_css__","__WEBPACK_IMPORTED_MODULE_2__dojo_widget_core_decorators_customElement__"," _key","menuContainer"],"mappings":"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","file":"menu-1.0.0.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 3e984433321e15a3bb9b","import { createCompositeHandle } from './lang';\nimport Promise from '@dojo/shim/Promise';\n/**\n * No operation function to replace own once instance is destoryed\n */\nfunction noop() {\n return Promise.resolve(false);\n}\n/**\n * No op function used to replace own, once instance has been destoryed\n */\nfunction destroyed() {\n throw new Error('Call made to destroyed method');\n}\nexport class Destroyable {\n /**\n * @constructor\n */\n constructor() {\n this.handles = [];\n }\n /**\n * Register handles for the instance that will be destroyed when `this.destroy` is called\n *\n * @param {Handle} handle The handle to add for the instance\n * @returns {Handle} a handle for the handle, removes the handle for the instance and calls destroy\n */\n own(handles) {\n const handle = Array.isArray(handles) ? createCompositeHandle(...handles) : handles;\n const { handles: _handles } = this;\n _handles.push(handle);\n return {\n destroy() {\n _handles.splice(_handles.indexOf(handle));\n handle.destroy();\n }\n };\n }\n /**\n * Destrpys all handers registered for the instance\n *\n * @returns {Promise {\n this.handles.forEach((handle) => {\n handle && handle.destroy && handle.destroy();\n });\n this.destroy = noop;\n this.own = destroyed;\n resolve(true);\n });\n }\n}\nexport default Destroyable;\n//# sourceMappingURL=Destroyable.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/core/Destroyable.mjs\n// module id = ./node_modules/@dojo/core/Destroyable.mjs\n// module chunks = menu","import Map from '@dojo/shim/Map';\r\nimport { Destroyable } from './Destroyable';\r\n/**\r\n * Map of computed regular expressions, keyed by string\r\n */\r\nconst regexMap = new Map();\r\n/**\r\n * Determines is the event type glob has been matched\r\n *\r\n * @returns boolean that indicates if the glob is matched\r\n */\r\nexport function isGlobMatch(globString, targetString) {\r\n if (typeof targetString === 'string' && typeof globString === 'string' && globString.indexOf('*') !== -1) {\r\n let regex;\r\n if (regexMap.has(globString)) {\r\n regex = regexMap.get(globString);\r\n }\r\n else {\r\n regex = new RegExp(`^${globString.replace(/\\*/g, '.*')}$`);\r\n regexMap.set(globString, regex);\r\n }\r\n return regex.test(targetString);\r\n }\r\n else {\r\n return globString === targetString;\r\n }\r\n}\r\n/**\r\n * Event Class\r\n */\r\nexport class Evented extends Destroyable {\r\n constructor() {\r\n super(...arguments);\r\n /**\r\n * map of listeners keyed by event type\r\n */\r\n this.listenersMap = new Map();\r\n }\r\n emit(event) {\r\n this.listenersMap.forEach((methods, type) => {\r\n if (isGlobMatch(type, event.type)) {\r\n methods.forEach((method) => {\r\n method.call(this, event);\r\n });\r\n }\r\n });\r\n }\r\n on(type, listener) {\r\n if (Array.isArray(listener)) {\r\n const handles = listener.map((listener) => this._addListener(type, listener));\r\n return {\r\n destroy() {\r\n handles.forEach((handle) => handle.destroy());\r\n }\r\n };\r\n }\r\n return this._addListener(type, listener);\r\n }\r\n _addListener(type, listener) {\r\n const listeners = this.listenersMap.get(type) || [];\r\n listeners.push(listener);\r\n this.listenersMap.set(type, listeners);\r\n return {\r\n destroy: () => {\r\n const listeners = this.listenersMap.get(type) || [];\r\n listeners.splice(listeners.indexOf(listener), 1);\r\n }\r\n };\r\n }\r\n}\r\nexport default Evented;\r\n//# sourceMappingURL=Evented.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/core/Evented.mjs\n// module id = ./node_modules/@dojo/core/Evented.mjs\n// module chunks = menu","import { assign } from '@dojo/shim/object';\nexport { assign } from '@dojo/shim/object';\nconst slice = Array.prototype.slice;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Type guard that ensures that the value can be coerced to Object\n * to weed out host objects that do not derive from Object.\n * This function is used to check if we want to deep copy an object or not.\n * Note: In ES6 it is possible to modify an object's Symbol.toStringTag property, which will\n * change the value returned by `toString`. This is a rare edge case that is difficult to handle,\n * so it is not handled here.\n * @param value The value to check\n * @return If the value is coercible into an Object\n */\nfunction shouldDeepCopyObject(value) {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\nfunction copyArray(array, inherited) {\n return array.map(function (item) {\n if (Array.isArray(item)) {\n return copyArray(item, inherited);\n }\n return !shouldDeepCopyObject(item)\n ? item\n : _mixin({\n deep: true,\n inherited: inherited,\n sources: [item],\n target: {}\n });\n });\n}\nfunction _mixin(kwArgs) {\n const deep = kwArgs.deep;\n const inherited = kwArgs.inherited;\n const target = kwArgs.target;\n const copied = kwArgs.copied || [];\n const copiedClone = [...copied];\n for (let i = 0; i < kwArgs.sources.length; i++) {\n const source = kwArgs.sources[i];\n if (source === null || source === undefined) {\n continue;\n }\n for (let key in source) {\n if (inherited || hasOwnProperty.call(source, key)) {\n let value = source[key];\n if (copiedClone.indexOf(value) !== -1) {\n continue;\n }\n if (deep) {\n if (Array.isArray(value)) {\n value = copyArray(value, inherited);\n }\n else if (shouldDeepCopyObject(value)) {\n const targetValue = target[key] || {};\n copied.push(source);\n value = _mixin({\n deep: true,\n inherited: inherited,\n sources: [value],\n target: targetValue,\n copied\n });\n }\n }\n target[key] = value;\n }\n }\n }\n return target;\n}\nexport function create(prototype, ...mixins) {\n if (!mixins.length) {\n throw new RangeError('lang.create requires at least one mixin object.');\n }\n const args = mixins.slice();\n args.unshift(Object.create(prototype));\n return assign.apply(null, args);\n}\nexport function deepAssign(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: false,\n sources: sources,\n target: target\n });\n}\nexport function deepMixin(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Creates a new object using the provided source's prototype as the prototype for the new object, and then\n * deep copies the provided source's values into the new target.\n *\n * @param source The object to duplicate\n * @return The new object\n */\nexport function duplicate(source) {\n const target = Object.create(Object.getPrototypeOf(source));\n return deepMixin(target, source);\n}\n/**\n * Determines whether two values are the same value.\n *\n * @param a First value to compare\n * @param b Second value to compare\n * @return true if the values are the same; false otherwise\n */\nexport function isIdentical(a, b) {\n return (a === b ||\n /* both values are NaN */\n (a !== a && b !== b));\n}\n/**\n * Returns a function that binds a method to the specified object at runtime. This is similar to\n * `Function.prototype.bind`, but instead of a function it takes the name of a method on an object.\n * As a result, the function returned by `lateBind` will always call the function currently assigned to\n * the specified property on the object as of the moment the function it returns is called.\n *\n * @param instance The context object\n * @param method The name of the method on the context object to bind to itself\n * @param suppliedArgs An optional array of values to prepend to the `instance[method]` arguments list\n * @return The bound function\n */\nexport function lateBind(instance, method, ...suppliedArgs) {\n return suppliedArgs.length\n ? function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n // TS7017\n return instance[method].apply(instance, args);\n }\n : function () {\n // TS7017\n return instance[method].apply(instance, arguments);\n };\n}\nexport function mixin(target, ...sources) {\n return _mixin({\n deep: false,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Returns a function which invokes the given function with the given arguments prepended to its argument list.\n * Like `Function.prototype.bind`, but does not alter execution context.\n *\n * @param targetFunction The function that needs to be bound\n * @param suppliedArgs An optional array of arguments to prepend to the `targetFunction` arguments list\n * @return The bound function\n */\nexport function partial(targetFunction, ...suppliedArgs) {\n return function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n return targetFunction.apply(this, args);\n };\n}\n/**\n * Returns an object with a destroy method that, when called, calls the passed-in destructor.\n * This is intended to provide a unified interface for creating \"remove\" / \"destroy\" handlers for\n * event listeners, timers, etc.\n *\n * @param destructor A function that will be called when the handle's `destroy` method is invoked\n * @return The handle object\n */\nexport function createHandle(destructor) {\n let called = false;\n return {\n destroy: function () {\n if (!called) {\n called = true;\n destructor();\n }\n }\n };\n}\n/**\n * Returns a single handle that can be used to destroy multiple handles simultaneously.\n *\n * @param handles An array of handles with `destroy` methods\n * @return The handle object\n */\nexport function createCompositeHandle(...handles) {\n return createHandle(function () {\n for (let i = 0; i < handles.length; i++) {\n handles[i].destroy();\n }\n });\n}\n//# sourceMappingURL=lang.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/core/lang.mjs\n// module id = ./node_modules/@dojo/core/lang.mjs\n// module chunks = menu","function isFeatureTestThenable(value) {\r\n return value && value.then;\r\n}\r\n/**\r\n * A cache of results of feature tests\r\n */\r\nexport const testCache = {};\r\n/**\r\n * A cache of the un-resolved feature tests\r\n */\r\nexport const testFunctions = {};\r\n/**\r\n * A cache of unresolved thenables (probably promises)\r\n * @type {{}}\r\n */\r\nconst testThenables = {};\r\n/**\r\n * A reference to the global scope (`window` in a browser, `global` in NodeJS)\r\n */\r\nconst globalScope = (function () {\r\n /* istanbul ignore else */\r\n if (typeof window !== 'undefined') {\r\n // Browsers\r\n return window;\r\n }\r\n else if (typeof global !== 'undefined') {\r\n // Node\r\n return global;\r\n }\r\n else if (typeof self !== 'undefined') {\r\n // Web workers\r\n return self;\r\n }\r\n /* istanbul ignore next */\r\n return {};\r\n})();\r\n/* Grab the staticFeatures if there are available */\r\nconst { staticFeatures } = globalScope.DojoHasEnvironment || {};\r\n/* Cleaning up the DojoHasEnviornment */\r\nif ('DojoHasEnvironment' in globalScope) {\r\n delete globalScope.DojoHasEnvironment;\r\n}\r\n/**\r\n * Custom type guard to narrow the `staticFeatures` to either a map or a function that\r\n * returns a map.\r\n *\r\n * @param value The value to guard for\r\n */\r\nfunction isStaticFeatureFunction(value) {\r\n return typeof value === 'function';\r\n}\r\n/**\r\n * The cache of asserted features that were available in the global scope when the\r\n * module loaded\r\n */\r\nconst staticCache = staticFeatures\r\n ? isStaticFeatureFunction(staticFeatures) ? staticFeatures.apply(globalScope) : staticFeatures\r\n : {}; /* Providing an empty cache, if none was in the environment\r\n\r\n/**\r\n* AMD plugin function.\r\n*\r\n* Conditional loads modules based on a has feature test value.\r\n*\r\n* @param resourceId Gives the resolved module id to load.\r\n* @param require The loader require function with respect to the module that contained the plugin resource in its\r\n* dependency list.\r\n* @param load Callback to loader that consumes result of plugin demand.\r\n*/\r\nexport function load(resourceId, require, load, config) {\r\n resourceId ? require([resourceId], load) : load();\r\n}\r\n/**\r\n * AMD plugin function.\r\n *\r\n * Resolves resourceId into a module id based on possibly-nested tenary expression that branches on has feature test\r\n * value(s).\r\n *\r\n * @param resourceId The id of the module\r\n * @param normalize Resolves a relative module id into an absolute module id\r\n */\r\nexport function normalize(resourceId, normalize) {\r\n const tokens = resourceId.match(/[\\?:]|[^:\\?]*/g) || [];\r\n let i = 0;\r\n function get(skip) {\r\n const term = tokens[i++];\r\n if (term === ':') {\r\n // empty string module name, resolves to null\r\n return null;\r\n }\r\n else {\r\n // postfixed with a ? means it is a feature to branch on, the term is the name of the feature\r\n if (tokens[i++] === '?') {\r\n if (!skip && has(term)) {\r\n // matched the feature, get the first value from the options\r\n return get();\r\n }\r\n else {\r\n // did not match, get the second value, passing over the first\r\n get(true);\r\n return get(skip);\r\n }\r\n }\r\n // a module\r\n return term;\r\n }\r\n }\r\n const id = get();\r\n return id && normalize(id);\r\n}\r\n/**\r\n * Check if a feature has already been registered\r\n *\r\n * @param feature the name of the feature\r\n */\r\nexport function exists(feature) {\r\n const normalizedFeature = feature.toLowerCase();\r\n return Boolean(normalizedFeature in staticCache || normalizedFeature in testCache || testFunctions[normalizedFeature]);\r\n}\r\n/**\r\n * Register a new test for a named feature.\r\n *\r\n * @example\r\n * has.add('dom-addeventlistener', !!document.addEventListener);\r\n *\r\n * @example\r\n * has.add('touch-events', function () {\r\n * return 'ontouchstart' in document\r\n * });\r\n *\r\n * @param feature the name of the feature\r\n * @param value the value reported of the feature, or a function that will be executed once on first test\r\n * @param overwrite if an existing value should be overwritten. Defaults to false.\r\n */\r\nexport function add(feature, value, overwrite = false) {\r\n const normalizedFeature = feature.toLowerCase();\r\n if (exists(normalizedFeature) && !overwrite && !(normalizedFeature in staticCache)) {\r\n throw new TypeError(`Feature \"${feature}\" exists and overwrite not true.`);\r\n }\r\n if (typeof value === 'function') {\r\n testFunctions[normalizedFeature] = value;\r\n }\r\n else if (isFeatureTestThenable(value)) {\r\n testThenables[feature] = value.then((resolvedValue) => {\r\n testCache[feature] = resolvedValue;\r\n delete testThenables[feature];\r\n }, () => {\r\n delete testThenables[feature];\r\n });\r\n }\r\n else {\r\n testCache[normalizedFeature] = value;\r\n delete testFunctions[normalizedFeature];\r\n }\r\n}\r\n/**\r\n * Return the current value of a named feature.\r\n *\r\n * @param feature The name (if a string) or identifier (if an integer) of the feature to test.\r\n */\r\nexport default function has(feature) {\r\n let result;\r\n const normalizedFeature = feature.toLowerCase();\r\n if (normalizedFeature in staticCache) {\r\n result = staticCache[normalizedFeature];\r\n }\r\n else if (testFunctions[normalizedFeature]) {\r\n result = testCache[normalizedFeature] = testFunctions[normalizedFeature].call(null);\r\n delete testFunctions[normalizedFeature];\r\n }\r\n else if (normalizedFeature in testCache) {\r\n result = testCache[normalizedFeature];\r\n }\r\n else if (feature in testThenables) {\r\n return false;\r\n }\r\n else {\r\n throw new TypeError(`Attempt to detect unregistered has feature \"${feature}\"`);\r\n }\r\n return result;\r\n}\r\n/*\r\n * Out of the box feature tests\r\n */\r\n/* Environments */\r\n/* Used as a value to provide a debug only code path */\r\nadd('debug', true);\r\n/* Detects if the environment is \"browser like\" */\r\nadd('host-browser', typeof document !== 'undefined' && typeof location !== 'undefined');\r\n/* Detects if the environment appears to be NodeJS */\r\nadd('host-node', function () {\r\n if (typeof process === 'object' && process.versions && process.versions.node) {\r\n return process.versions.node;\r\n }\r\n});\r\n//# sourceMappingURL=has.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/has/has.mjs\n// module id = ./node_modules/@dojo/has/has.mjs\n// module chunks = menu","import { isArrayLike, ShimIterator } from './iterator';\r\nimport global from './global';\r\nimport { is as objectIs } from './object';\r\nimport has from './support/has';\r\nimport './Symbol';\r\nexport let Map = global.Map;\r\nif (!true) {\r\n Map = (_a = class Map {\r\n constructor(iterable) {\r\n this._keys = [];\r\n this._values = [];\r\n this[Symbol.toStringTag] = 'Map';\r\n if (iterable) {\r\n if (isArrayLike(iterable)) {\r\n for (let i = 0; i < iterable.length; i++) {\r\n const value = iterable[i];\r\n this.set(value[0], value[1]);\r\n }\r\n }\r\n else {\r\n for (const value of iterable) {\r\n this.set(value[0], value[1]);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * An alternative to Array.prototype.indexOf using Object.is\r\n * to check for equality. See http://mzl.la/1zuKO2V\r\n */\r\n _indexOfKey(keys, key) {\r\n for (let i = 0, length = keys.length; i < length; i++) {\r\n if (objectIs(keys[i], key)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n get size() {\r\n return this._keys.length;\r\n }\r\n clear() {\r\n this._keys.length = this._values.length = 0;\r\n }\r\n delete(key) {\r\n const index = this._indexOfKey(this._keys, key);\r\n if (index < 0) {\r\n return false;\r\n }\r\n this._keys.splice(index, 1);\r\n this._values.splice(index, 1);\r\n return true;\r\n }\r\n entries() {\r\n const values = this._keys.map((key, i) => {\r\n return [key, this._values[i]];\r\n });\r\n return new ShimIterator(values);\r\n }\r\n forEach(callback, context) {\r\n const keys = this._keys;\r\n const values = this._values;\r\n for (let i = 0, length = keys.length; i < length; i++) {\r\n callback.call(context, values[i], keys[i], this);\r\n }\r\n }\r\n get(key) {\r\n const index = this._indexOfKey(this._keys, key);\r\n return index < 0 ? undefined : this._values[index];\r\n }\r\n has(key) {\r\n return this._indexOfKey(this._keys, key) > -1;\r\n }\r\n keys() {\r\n return new ShimIterator(this._keys);\r\n }\r\n set(key, value) {\r\n let index = this._indexOfKey(this._keys, key);\r\n index = index < 0 ? this._keys.length : index;\r\n this._keys[index] = key;\r\n this._values[index] = value;\r\n return this;\r\n }\r\n values() {\r\n return new ShimIterator(this._values);\r\n }\r\n [Symbol.iterator]() {\r\n return this.entries();\r\n }\r\n },\r\n _a[Symbol.species] = _a,\r\n _a);\r\n}\r\nexport default Map;\r\nvar _a;\r\n//# sourceMappingURL=Map.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/Map.mjs\n// module id = ./node_modules/@dojo/shim/Map.mjs\n// module chunks = menu","import global from './global';\r\nimport { queueMicroTask } from './support/queue';\r\nimport './Symbol';\r\nimport has from './support/has';\r\nexport let ShimPromise = global.Promise;\r\nexport const isThenable = function isThenable(value) {\r\n return value && typeof value.then === 'function';\r\n};\r\nif (!true) {\r\n global.Promise = ShimPromise = (_a = class Promise {\r\n /**\r\n * Creates a new Promise.\r\n *\r\n * @constructor\r\n *\r\n * @param executor\r\n * The executor function is called immediately when the Promise is instantiated. It is responsible for\r\n * starting the asynchronous operation when it is invoked.\r\n *\r\n * The executor must call either the passed `resolve` function when the asynchronous operation has completed\r\n * successfully, or the `reject` function when the operation fails.\r\n */\r\n constructor(executor) {\r\n /**\r\n * The current state of this promise.\r\n */\r\n this.state = 1 /* Pending */;\r\n this[Symbol.toStringTag] = 'Promise';\r\n /**\r\n * If true, the resolution of this promise is chained (\"locked in\") to another promise.\r\n */\r\n let isChained = false;\r\n /**\r\n * Whether or not this promise is in a resolved state.\r\n */\r\n const isResolved = () => {\r\n return this.state !== 1 /* Pending */ || isChained;\r\n };\r\n /**\r\n * Callbacks that should be invoked once the asynchronous operation has completed.\r\n */\r\n let callbacks = [];\r\n /**\r\n * Initially pushes callbacks onto a queue for execution once this promise settles. After the promise settles,\r\n * enqueues callbacks for execution on the next event loop turn.\r\n */\r\n let whenFinished = function (callback) {\r\n if (callbacks) {\r\n callbacks.push(callback);\r\n }\r\n };\r\n /**\r\n * Settles this promise.\r\n *\r\n * @param newState The resolved state for this promise.\r\n * @param {T|any} value The resolved value for this promise.\r\n */\r\n const settle = (newState, value) => {\r\n // A promise can only be settled once.\r\n if (this.state !== 1 /* Pending */) {\r\n return;\r\n }\r\n this.state = newState;\r\n this.resolvedValue = value;\r\n whenFinished = queueMicroTask;\r\n // Only enqueue a callback runner if there are callbacks so that initially fulfilled Promises don't have to\r\n // wait an extra turn.\r\n if (callbacks && callbacks.length > 0) {\r\n queueMicroTask(function () {\r\n if (callbacks) {\r\n let count = callbacks.length;\r\n for (let i = 0; i < count; ++i) {\r\n callbacks[i].call(null);\r\n }\r\n callbacks = null;\r\n }\r\n });\r\n }\r\n };\r\n /**\r\n * Resolves this promise.\r\n *\r\n * @param newState The resolved state for this promise.\r\n * @param {T|any} value The resolved value for this promise.\r\n */\r\n const resolve = (newState, value) => {\r\n if (isResolved()) {\r\n return;\r\n }\r\n if (isThenable(value)) {\r\n value.then(settle.bind(null, 0 /* Fulfilled */), settle.bind(null, 2 /* Rejected */));\r\n isChained = true;\r\n }\r\n else {\r\n settle(newState, value);\r\n }\r\n };\r\n this.then = (onFulfilled, onRejected) => {\r\n return new Promise((resolve, reject) => {\r\n // whenFinished initially queues up callbacks for execution after the promise has settled. Once the\r\n // promise has settled, whenFinished will schedule callbacks for execution on the next turn through the\r\n // event loop.\r\n whenFinished(() => {\r\n const callback = this.state === 2 /* Rejected */ ? onRejected : onFulfilled;\r\n if (typeof callback === 'function') {\r\n try {\r\n resolve(callback(this.resolvedValue));\r\n }\r\n catch (error) {\r\n reject(error);\r\n }\r\n }\r\n else if (this.state === 2 /* Rejected */) {\r\n reject(this.resolvedValue);\r\n }\r\n else {\r\n resolve(this.resolvedValue);\r\n }\r\n });\r\n });\r\n };\r\n try {\r\n executor(resolve.bind(null, 0 /* Fulfilled */), resolve.bind(null, 2 /* Rejected */));\r\n }\r\n catch (error) {\r\n settle(2 /* Rejected */, error);\r\n }\r\n }\r\n static all(iterable) {\r\n return new this(function (resolve, reject) {\r\n const values = [];\r\n let complete = 0;\r\n let total = 0;\r\n let populating = true;\r\n function fulfill(index, value) {\r\n values[index] = value;\r\n ++complete;\r\n finish();\r\n }\r\n function finish() {\r\n if (populating || complete < total) {\r\n return;\r\n }\r\n resolve(values);\r\n }\r\n function processItem(index, item) {\r\n ++total;\r\n if (isThenable(item)) {\r\n // If an item Promise rejects, this Promise is immediately rejected with the item\r\n // Promise's rejection error.\r\n item.then(fulfill.bind(null, index), reject);\r\n }\r\n else {\r\n Promise.resolve(item).then(fulfill.bind(null, index));\r\n }\r\n }\r\n let i = 0;\r\n for (const value of iterable) {\r\n processItem(i, value);\r\n i++;\r\n }\r\n populating = false;\r\n finish();\r\n });\r\n }\r\n static race(iterable) {\r\n return new this(function (resolve, reject) {\r\n for (const item of iterable) {\r\n if (item instanceof Promise) {\r\n // If a Promise item rejects, this Promise is immediately rejected with the item\r\n // Promise's rejection error.\r\n item.then(resolve, reject);\r\n }\r\n else {\r\n Promise.resolve(item).then(resolve);\r\n }\r\n }\r\n });\r\n }\r\n static reject(reason) {\r\n return new this(function (resolve, reject) {\r\n reject(reason);\r\n });\r\n }\r\n static resolve(value) {\r\n return new this(function (resolve) {\r\n resolve(value);\r\n });\r\n }\r\n catch(onRejected) {\r\n return this.then(undefined, onRejected);\r\n }\r\n },\r\n _a[Symbol.species] = ShimPromise,\r\n _a);\r\n}\r\nexport default ShimPromise;\r\nvar _a;\r\n//# sourceMappingURL=Promise.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/Promise.mjs\n// module id = ./node_modules/@dojo/shim/Promise.mjs\n// module chunks = menu","import has from './support/has';\r\nimport global from './global';\r\nimport { getValueDescriptor } from './support/util';\r\nexport let Symbol = global.Symbol;\r\nif (!true) {\r\n /**\r\n * Throws if the value is not a symbol, used internally within the Shim\r\n * @param {any} value The value to check\r\n * @return {symbol} Returns the symbol or throws\r\n */\r\n const validateSymbol = function validateSymbol(value) {\r\n if (!isSymbol(value)) {\r\n throw new TypeError(value + ' is not a symbol');\r\n }\r\n return value;\r\n };\r\n const defineProperties = Object.defineProperties;\r\n const defineProperty = Object.defineProperty;\r\n const create = Object.create;\r\n const objPrototype = Object.prototype;\r\n const globalSymbols = {};\r\n const getSymbolName = (function () {\r\n const created = create(null);\r\n return function (desc) {\r\n let postfix = 0;\r\n let name;\r\n while (created[String(desc) + (postfix || '')]) {\r\n ++postfix;\r\n }\r\n desc += String(postfix || '');\r\n created[desc] = true;\r\n name = '@@' + desc;\r\n // FIXME: Temporary guard until the duplicate execution when testing can be\r\n // pinned down.\r\n if (!Object.getOwnPropertyDescriptor(objPrototype, name)) {\r\n defineProperty(objPrototype, name, {\r\n set: function (value) {\r\n defineProperty(this, name, getValueDescriptor(value));\r\n }\r\n });\r\n }\r\n return name;\r\n };\r\n })();\r\n const InternalSymbol = function Symbol(description) {\r\n if (this instanceof InternalSymbol) {\r\n throw new TypeError('TypeError: Symbol is not a constructor');\r\n }\r\n return Symbol(description);\r\n };\r\n Symbol = global.Symbol = function Symbol(description) {\r\n if (this instanceof Symbol) {\r\n throw new TypeError('TypeError: Symbol is not a constructor');\r\n }\r\n const sym = Object.create(InternalSymbol.prototype);\r\n description = description === undefined ? '' : String(description);\r\n return defineProperties(sym, {\r\n __description__: getValueDescriptor(description),\r\n __name__: getValueDescriptor(getSymbolName(description))\r\n });\r\n };\r\n /* Decorate the Symbol function with the appropriate properties */\r\n defineProperty(Symbol, 'for', getValueDescriptor(function (key) {\r\n if (globalSymbols[key]) {\r\n return globalSymbols[key];\r\n }\r\n return (globalSymbols[key] = Symbol(String(key)));\r\n }));\r\n defineProperties(Symbol, {\r\n keyFor: getValueDescriptor(function (sym) {\r\n let key;\r\n validateSymbol(sym);\r\n for (key in globalSymbols) {\r\n if (globalSymbols[key] === sym) {\r\n return key;\r\n }\r\n }\r\n }),\r\n hasInstance: getValueDescriptor(Symbol.for('hasInstance'), false, false),\r\n isConcatSpreadable: getValueDescriptor(Symbol.for('isConcatSpreadable'), false, false),\r\n iterator: getValueDescriptor(Symbol.for('iterator'), false, false),\r\n match: getValueDescriptor(Symbol.for('match'), false, false),\r\n observable: getValueDescriptor(Symbol.for('observable'), false, false),\r\n replace: getValueDescriptor(Symbol.for('replace'), false, false),\r\n search: getValueDescriptor(Symbol.for('search'), false, false),\r\n species: getValueDescriptor(Symbol.for('species'), false, false),\r\n split: getValueDescriptor(Symbol.for('split'), false, false),\r\n toPrimitive: getValueDescriptor(Symbol.for('toPrimitive'), false, false),\r\n toStringTag: getValueDescriptor(Symbol.for('toStringTag'), false, false),\r\n unscopables: getValueDescriptor(Symbol.for('unscopables'), false, false)\r\n });\r\n /* Decorate the InternalSymbol object */\r\n defineProperties(InternalSymbol.prototype, {\r\n constructor: getValueDescriptor(Symbol),\r\n toString: getValueDescriptor(function () {\r\n return this.__name__;\r\n }, false, false)\r\n });\r\n /* Decorate the Symbol.prototype */\r\n defineProperties(Symbol.prototype, {\r\n toString: getValueDescriptor(function () {\r\n return 'Symbol (' + validateSymbol(this).__description__ + ')';\r\n }),\r\n valueOf: getValueDescriptor(function () {\r\n return validateSymbol(this);\r\n })\r\n });\r\n defineProperty(Symbol.prototype, Symbol.toPrimitive, getValueDescriptor(function () {\r\n return validateSymbol(this);\r\n }));\r\n defineProperty(Symbol.prototype, Symbol.toStringTag, getValueDescriptor('Symbol', false, false, true));\r\n defineProperty(InternalSymbol.prototype, Symbol.toPrimitive, getValueDescriptor(Symbol.prototype[Symbol.toPrimitive], false, false, true));\r\n defineProperty(InternalSymbol.prototype, Symbol.toStringTag, getValueDescriptor(Symbol.prototype[Symbol.toStringTag], false, false, true));\r\n}\r\n/**\r\n * A custom guard function that determines if an object is a symbol or not\r\n * @param {any} value The value to check to see if it is a symbol or not\r\n * @return {is symbol} Returns true if a symbol or not (and narrows the type guard)\r\n */\r\nexport function isSymbol(value) {\r\n return (value && (typeof value === 'symbol' || value['@@toStringTag'] === 'Symbol')) || false;\r\n}\r\n/**\r\n * Fill any missing well known symbols if the native Symbol is missing them\r\n */\r\n[\r\n 'hasInstance',\r\n 'isConcatSpreadable',\r\n 'iterator',\r\n 'species',\r\n 'replace',\r\n 'search',\r\n 'split',\r\n 'match',\r\n 'toPrimitive',\r\n 'toStringTag',\r\n 'unscopables',\r\n 'observable'\r\n].forEach((wellKnown) => {\r\n if (!Symbol[wellKnown]) {\r\n Object.defineProperty(Symbol, wellKnown, getValueDescriptor(Symbol.for(wellKnown), false, false));\r\n }\r\n});\r\nexport default Symbol;\r\n//# sourceMappingURL=Symbol.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/Symbol.mjs\n// module id = ./node_modules/@dojo/shim/Symbol.mjs\n// module chunks = menu","import global from './global';\r\nimport { isArrayLike } from './iterator';\r\nimport has from './support/has';\r\nimport './Symbol';\r\nexport let WeakMap = global.WeakMap;\r\nif (!true) {\r\n const DELETED = {};\r\n const getUID = function getUID() {\r\n return Math.floor(Math.random() * 100000000);\r\n };\r\n const generateName = (function () {\r\n let startId = Math.floor(Date.now() % 100000000);\r\n return function generateName() {\r\n return '__wm' + getUID() + (startId++ + '__');\r\n };\r\n })();\r\n WeakMap = class WeakMap {\r\n constructor(iterable) {\r\n this[Symbol.toStringTag] = 'WeakMap';\r\n this._name = generateName();\r\n this._frozenEntries = [];\r\n if (iterable) {\r\n if (isArrayLike(iterable)) {\r\n for (let i = 0; i < iterable.length; i++) {\r\n const item = iterable[i];\r\n this.set(item[0], item[1]);\r\n }\r\n }\r\n else {\r\n for (const [key, value] of iterable) {\r\n this.set(key, value);\r\n }\r\n }\r\n }\r\n }\r\n _getFrozenEntryIndex(key) {\r\n for (let i = 0; i < this._frozenEntries.length; i++) {\r\n if (this._frozenEntries[i].key === key) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n delete(key) {\r\n if (key === undefined || key === null) {\r\n return false;\r\n }\r\n const entry = key[this._name];\r\n if (entry && entry.key === key && entry.value !== DELETED) {\r\n entry.value = DELETED;\r\n return true;\r\n }\r\n const frozenIndex = this._getFrozenEntryIndex(key);\r\n if (frozenIndex >= 0) {\r\n this._frozenEntries.splice(frozenIndex, 1);\r\n return true;\r\n }\r\n return false;\r\n }\r\n get(key) {\r\n if (key === undefined || key === null) {\r\n return undefined;\r\n }\r\n const entry = key[this._name];\r\n if (entry && entry.key === key && entry.value !== DELETED) {\r\n return entry.value;\r\n }\r\n const frozenIndex = this._getFrozenEntryIndex(key);\r\n if (frozenIndex >= 0) {\r\n return this._frozenEntries[frozenIndex].value;\r\n }\r\n }\r\n has(key) {\r\n if (key === undefined || key === null) {\r\n return false;\r\n }\r\n const entry = key[this._name];\r\n if (Boolean(entry && entry.key === key && entry.value !== DELETED)) {\r\n return true;\r\n }\r\n const frozenIndex = this._getFrozenEntryIndex(key);\r\n if (frozenIndex >= 0) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n set(key, value) {\r\n if (!key || (typeof key !== 'object' && typeof key !== 'function')) {\r\n throw new TypeError('Invalid value used as weak map key');\r\n }\r\n let entry = key[this._name];\r\n if (!entry || entry.key !== key) {\r\n entry = Object.create(null, {\r\n key: { value: key }\r\n });\r\n if (Object.isFrozen(key)) {\r\n this._frozenEntries.push(entry);\r\n }\r\n else {\r\n Object.defineProperty(key, this._name, {\r\n value: entry\r\n });\r\n }\r\n }\r\n entry.value = value;\r\n return this;\r\n }\r\n };\r\n}\r\nexport default WeakMap;\r\n//# sourceMappingURL=WeakMap.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/WeakMap.mjs\n// module id = ./node_modules/@dojo/shim/WeakMap.mjs\n// module chunks = menu","import global from './global';\r\nimport { isArrayLike, isIterable } from './iterator';\r\nimport { MAX_SAFE_INTEGER } from './number';\r\nimport has from './support/has';\r\nimport { wrapNative } from './support/util';\r\nexport let from;\r\n/**\r\n * Creates a new array from the function parameters.\r\n *\r\n * @param arguments Any number of arguments for the array\r\n * @return An array from the given arguments\r\n */\r\nexport let of;\r\n/* ES6 Array instance methods */\r\n/**\r\n * Copies data internally within an array or array-like object.\r\n *\r\n * @param target The target array-like object\r\n * @param offset The index to start copying values to; if negative, it counts backwards from length\r\n * @param start The first (inclusive) index to copy; if negative, it counts backwards from length\r\n * @param end The last (exclusive) index to copy; if negative, it counts backwards from length\r\n * @return The target\r\n */\r\nexport let copyWithin;\r\n/**\r\n * Fills elements of an array-like object with the specified value.\r\n *\r\n * @param target The target to fill\r\n * @param value The value to fill each element of the target with\r\n * @param start The first index to fill\r\n * @param end The (exclusive) index at which to stop filling\r\n * @return The filled target\r\n */\r\nexport let fill;\r\n/**\r\n * Finds and returns the first instance matching the callback or undefined if one is not found.\r\n *\r\n * @param target An array-like object\r\n * @param callback A function returning if the current value matches a criteria\r\n * @param thisArg The execution context for the find function\r\n * @return The first element matching the callback, or undefined if one does not exist\r\n */\r\nexport let find;\r\n/**\r\n * Performs a linear search and returns the first index whose value satisfies the passed callback,\r\n * or -1 if no values satisfy it.\r\n *\r\n * @param target An array-like object\r\n * @param callback A function returning true if the current value satisfies its criteria\r\n * @param thisArg The execution context for the find function\r\n * @return The first index whose value satisfies the passed callback, or -1 if no values satisfy it\r\n */\r\nexport let findIndex;\r\n/* ES7 Array instance methods */\r\n/**\r\n * Determines whether an array includes a given value\r\n *\r\n * @param target the target array-like object\r\n * @param searchElement the item to search for\r\n * @param fromIndex the starting index to search from\r\n * @return `true` if the array includes the element, otherwise `false`\r\n */\r\nexport let includes;\r\nif (true && true) {\r\n from = global.Array.from;\r\n of = global.Array.of;\r\n copyWithin = wrapNative(global.Array.prototype.copyWithin);\r\n fill = wrapNative(global.Array.prototype.fill);\r\n find = wrapNative(global.Array.prototype.find);\r\n findIndex = wrapNative(global.Array.prototype.findIndex);\r\n}\r\nelse {\r\n // It is only older versions of Safari/iOS that have a bad fill implementation and so aren't in the wild\r\n // To make things easier, if there is a bad fill implementation, the whole set of functions will be filled\r\n /**\r\n * Ensures a non-negative, non-infinite, safe integer.\r\n *\r\n * @param length The number to validate\r\n * @return A proper length\r\n */\r\n const toLength = function toLength(length) {\r\n if (isNaN(length)) {\r\n return 0;\r\n }\r\n length = Number(length);\r\n if (isFinite(length)) {\r\n length = Math.floor(length);\r\n }\r\n // Ensure a non-negative, real, safe integer\r\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\r\n };\r\n /**\r\n * From ES6 7.1.4 ToInteger()\r\n *\r\n * @param value A value to convert\r\n * @return An integer\r\n */\r\n const toInteger = function toInteger(value) {\r\n value = Number(value);\r\n if (isNaN(value)) {\r\n return 0;\r\n }\r\n if (value === 0 || !isFinite(value)) {\r\n return value;\r\n }\r\n return (value > 0 ? 1 : -1) * Math.floor(Math.abs(value));\r\n };\r\n /**\r\n * Normalizes an offset against a given length, wrapping it if negative.\r\n *\r\n * @param value The original offset\r\n * @param length The total length to normalize against\r\n * @return If negative, provide a distance from the end (length); otherwise provide a distance from 0\r\n */\r\n const normalizeOffset = function normalizeOffset(value, length) {\r\n return value < 0 ? Math.max(length + value, 0) : Math.min(value, length);\r\n };\r\n from = function from(arrayLike, mapFunction, thisArg) {\r\n if (arrayLike == null) {\r\n throw new TypeError('from: requires an array-like object');\r\n }\r\n if (mapFunction && thisArg) {\r\n mapFunction = mapFunction.bind(thisArg);\r\n }\r\n /* tslint:disable-next-line:variable-name */\r\n const Constructor = this;\r\n const length = toLength(arrayLike.length);\r\n // Support extension\r\n const array = typeof Constructor === 'function' ? Object(new Constructor(length)) : new Array(length);\r\n if (!isArrayLike(arrayLike) && !isIterable(arrayLike)) {\r\n return array;\r\n }\r\n // if this is an array and the normalized length is 0, just return an empty array. this prevents a problem\r\n // with the iteration on IE when using a NaN array length.\r\n if (isArrayLike(arrayLike)) {\r\n if (length === 0) {\r\n return [];\r\n }\r\n for (let i = 0; i < arrayLike.length; i++) {\r\n array[i] = mapFunction ? mapFunction(arrayLike[i], i) : arrayLike[i];\r\n }\r\n }\r\n else {\r\n let i = 0;\r\n for (const value of arrayLike) {\r\n array[i] = mapFunction ? mapFunction(value, i) : value;\r\n i++;\r\n }\r\n }\r\n if (arrayLike.length !== undefined) {\r\n array.length = length;\r\n }\r\n return array;\r\n };\r\n of = function of(...items) {\r\n return Array.prototype.slice.call(items);\r\n };\r\n copyWithin = function copyWithin(target, offset, start, end) {\r\n if (target == null) {\r\n throw new TypeError('copyWithin: target must be an array-like object');\r\n }\r\n const length = toLength(target.length);\r\n offset = normalizeOffset(toInteger(offset), length);\r\n start = normalizeOffset(toInteger(start), length);\r\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\r\n let count = Math.min(end - start, length - offset);\r\n let direction = 1;\r\n if (offset > start && offset < start + count) {\r\n direction = -1;\r\n start += count - 1;\r\n offset += count - 1;\r\n }\r\n while (count > 0) {\r\n if (start in target) {\r\n target[offset] = target[start];\r\n }\r\n else {\r\n delete target[offset];\r\n }\r\n offset += direction;\r\n start += direction;\r\n count--;\r\n }\r\n return target;\r\n };\r\n fill = function fill(target, value, start, end) {\r\n const length = toLength(target.length);\r\n let i = normalizeOffset(toInteger(start), length);\r\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\r\n while (i < end) {\r\n target[i++] = value;\r\n }\r\n return target;\r\n };\r\n find = function find(target, callback, thisArg) {\r\n const index = findIndex(target, callback, thisArg);\r\n return index !== -1 ? target[index] : undefined;\r\n };\r\n findIndex = function findIndex(target, callback, thisArg) {\r\n const length = toLength(target.length);\r\n if (!callback) {\r\n throw new TypeError('find: second argument must be a function');\r\n }\r\n if (thisArg) {\r\n callback = callback.bind(thisArg);\r\n }\r\n for (let i = 0; i < length; i++) {\r\n if (callback(target[i], i, target)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n };\r\n}\r\nif (true) {\r\n includes = wrapNative(global.Array.prototype.includes);\r\n}\r\nelse {\r\n /**\r\n * Ensures a non-negative, non-infinite, safe integer.\r\n *\r\n * @param length The number to validate\r\n * @return A proper length\r\n */\r\n const toLength = function toLength(length) {\r\n length = Number(length);\r\n if (isNaN(length)) {\r\n return 0;\r\n }\r\n if (isFinite(length)) {\r\n length = Math.floor(length);\r\n }\r\n // Ensure a non-negative, real, safe integer\r\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\r\n };\r\n includes = function includes(target, searchElement, fromIndex = 0) {\r\n let len = toLength(target.length);\r\n for (let i = fromIndex; i < len; ++i) {\r\n const currentElement = target[i];\r\n if (searchElement === currentElement ||\r\n (searchElement !== searchElement && currentElement !== currentElement)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n}\r\n//# sourceMappingURL=array.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/array.mjs\n// module id = ./node_modules/@dojo/shim/array.mjs\n// module chunks = menu","const globalObject = (function () {\n if (typeof global !== 'undefined') {\n // global spec defines a reference to the global object called 'global'\n // https://github.com/tc39/proposal-global\n // `global` is also defined in NodeJS\n return global;\n }\n else if (typeof window !== 'undefined') {\n // window is defined in browsers\n return window;\n }\n else if (typeof self !== 'undefined') {\n // self is defined in WebWorkers\n return self;\n }\n})();\nexport default globalObject;\n//# sourceMappingURL=global.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/global.mjs\n// module id = ./node_modules/@dojo/shim/global.mjs\n// module chunks = menu","import global from './global';\n/**\n * The smallest interval between two representable numbers.\n */\nexport const EPSILON = 1;\n/**\n * The maximum safe integer in JavaScript\n */\nexport const MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n/**\n * The minimum safe integer in JavaScript\n */\nexport const MIN_SAFE_INTEGER = -MAX_SAFE_INTEGER;\n/**\n * Determines whether the passed value is NaN without coersion.\n *\n * @param value The value to test\n * @return true if the value is NaN, false if it is not\n */\nexport function isNaN(value) {\n return typeof value === 'number' && global.isNaN(value);\n}\n/**\n * Determines whether the passed value is a finite number without coersion.\n *\n * @param value The value to test\n * @return true if the value is finite, false if it is not\n */\nexport function isFinite(value) {\n return typeof value === 'number' && global.isFinite(value);\n}\n/**\n * Determines whether the passed value is an integer.\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isInteger(value) {\n return isFinite(value) && Math.floor(value) === value;\n}\n/**\n * Determines whether the passed value is an integer that is 'safe,' meaning:\n * 1. it can be expressed as an IEEE-754 double precision number\n * 2. it has a one-to-one mapping to a mathematical integer, meaning its\n * IEEE-754 representation cannot be the result of rounding any other\n * integer to fit the IEEE-754 representation\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isSafeInteger(value) {\n return isInteger(value) && Math.abs(value) <= MAX_SAFE_INTEGER;\n}\n//# sourceMappingURL=number.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/number.mjs\n// module id = ./node_modules/@dojo/shim/number.mjs\n// module chunks = menu","import global from './global';\r\nimport has from './support/has';\r\nimport { isSymbol } from './Symbol';\r\nexport let assign;\r\n/**\r\n * Gets the own property descriptor of the specified object.\r\n * An own property descriptor is one that is defined directly on the object and is not\r\n * inherited from the object's prototype.\r\n * @param o Object that contains the property.\r\n * @param p Name of the property.\r\n */\r\nexport let getOwnPropertyDescriptor;\r\n/**\r\n * Returns the names of the own properties of an object. The own properties of an object are those that are defined directly\r\n * on that object, and are not inherited from the object's prototype. The properties of an object include both fields (objects) and functions.\r\n * @param o Object that contains the own properties.\r\n */\r\nexport let getOwnPropertyNames;\r\n/**\r\n * Returns an array of all symbol properties found directly on object o.\r\n * @param o Object to retrieve the symbols from.\r\n */\r\nexport let getOwnPropertySymbols;\r\n/**\r\n * Returns true if the values are the same value, false otherwise.\r\n * @param value1 The first value.\r\n * @param value2 The second value.\r\n */\r\nexport let is;\r\n/**\r\n * Returns the names of the enumerable properties and methods of an object.\r\n * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.\r\n */\r\nexport let keys;\r\n/* ES7 Object static methods */\r\nexport let getOwnPropertyDescriptors;\r\nexport let entries;\r\nexport let values;\r\nif (true) {\r\n const globalObject = global.Object;\r\n assign = globalObject.assign;\r\n getOwnPropertyDescriptor = globalObject.getOwnPropertyDescriptor;\r\n getOwnPropertyNames = globalObject.getOwnPropertyNames;\r\n getOwnPropertySymbols = globalObject.getOwnPropertySymbols;\r\n is = globalObject.is;\r\n keys = globalObject.keys;\r\n}\r\nelse {\r\n keys = function symbolAwareKeys(o) {\r\n return Object.keys(o).filter((key) => !Boolean(key.match(/^@@.+/)));\r\n };\r\n assign = function assign(target, ...sources) {\r\n if (target == null) {\r\n // TypeError if undefined or null\r\n throw new TypeError('Cannot convert undefined or null to object');\r\n }\r\n const to = Object(target);\r\n sources.forEach((nextSource) => {\r\n if (nextSource) {\r\n // Skip over if undefined or null\r\n keys(nextSource).forEach((nextKey) => {\r\n to[nextKey] = nextSource[nextKey];\r\n });\r\n }\r\n });\r\n return to;\r\n };\r\n getOwnPropertyDescriptor = function getOwnPropertyDescriptor(o, prop) {\r\n if (isSymbol(prop)) {\r\n return Object.getOwnPropertyDescriptor(o, prop);\r\n }\r\n else {\r\n return Object.getOwnPropertyDescriptor(o, prop);\r\n }\r\n };\r\n getOwnPropertyNames = function getOwnPropertyNames(o) {\r\n return Object.getOwnPropertyNames(o).filter((key) => !Boolean(key.match(/^@@.+/)));\r\n };\r\n getOwnPropertySymbols = function getOwnPropertySymbols(o) {\r\n return Object.getOwnPropertyNames(o)\r\n .filter((key) => Boolean(key.match(/^@@.+/)))\r\n .map((key) => Symbol.for(key.substring(2)));\r\n };\r\n is = function is(value1, value2) {\r\n if (value1 === value2) {\r\n return value1 !== 0 || 1 / value1 === 1 / value2; // -0\r\n }\r\n return value1 !== value1 && value2 !== value2; // NaN\r\n };\r\n}\r\nif (true) {\r\n const globalObject = global.Object;\r\n getOwnPropertyDescriptors = globalObject.getOwnPropertyDescriptors;\r\n entries = globalObject.entries;\r\n values = globalObject.values;\r\n}\r\nelse {\r\n getOwnPropertyDescriptors = function getOwnPropertyDescriptors(o) {\r\n return getOwnPropertyNames(o).reduce((previous, key) => {\r\n previous[key] = getOwnPropertyDescriptor(o, key);\r\n return previous;\r\n }, {});\r\n };\r\n entries = function entries(o) {\r\n return keys(o).map((key) => [key, o[key]]);\r\n };\r\n values = function values(o) {\r\n return keys(o).map((key) => o[key]);\r\n };\r\n}\r\n//# sourceMappingURL=object.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/object.mjs\n// module id = ./node_modules/@dojo/shim/object.mjs\n// module chunks = menu","import global from './global';\r\nimport has from './support/has';\r\nimport { wrapNative } from './support/util';\r\n/**\r\n * The minimum location of high surrogates\r\n */\r\nexport const HIGH_SURROGATE_MIN = 0xd800;\r\n/**\r\n * The maximum location of high surrogates\r\n */\r\nexport const HIGH_SURROGATE_MAX = 0xdbff;\r\n/**\r\n * The minimum location of low surrogates\r\n */\r\nexport const LOW_SURROGATE_MIN = 0xdc00;\r\n/**\r\n * The maximum location of low surrogates\r\n */\r\nexport const LOW_SURROGATE_MAX = 0xdfff;\r\n/* ES6 static methods */\r\n/**\r\n * Return the String value whose elements are, in order, the elements in the List elements.\r\n * If length is 0, the empty string is returned.\r\n * @param codePoints The code points to generate the string\r\n */\r\nexport let fromCodePoint;\r\n/**\r\n * `raw` is intended for use as a tag function of a Tagged Template String. When called\r\n * as such the first argument will be a well formed template call site object and the rest\r\n * parameter will contain the substitution values.\r\n * @param template A well-formed template string call site representation.\r\n * @param substitutions A set of substitution values.\r\n */\r\nexport let raw;\r\n/* ES6 instance methods */\r\n/**\r\n * Returns a nonnegative integer Number less than 1114112 (0x110000) that is the code point\r\n * value of the UTF-16 encoded code point starting at the string element at position pos in\r\n * the String resulting from converting this object to a String.\r\n * If there is no element at that position, the result is undefined.\r\n * If a valid UTF-16 surrogate pair does not begin at pos, the result is the code unit at pos.\r\n */\r\nexport let codePointAt;\r\n/**\r\n * Returns true if the sequence of elements of searchString converted to a String is the\r\n * same as the corresponding elements of this object (converted to a String) starting at\r\n * endPosition – length(this). Otherwise returns false.\r\n */\r\nexport let endsWith;\r\n/**\r\n * Returns true if searchString appears as a substring of the result of converting this\r\n * object to a String, at one or more positions that are\r\n * greater than or equal to position; otherwise, returns false.\r\n * @param target The target string\r\n * @param searchString search string\r\n * @param position If position is undefined, 0 is assumed, so as to search all of the String.\r\n */\r\nexport let includes;\r\n/**\r\n * Returns the String value result of normalizing the string into the normalization form\r\n * named by form as specified in Unicode Standard Annex #15, Unicode Normalization Forms.\r\n * @param target The target string\r\n * @param form Applicable values: \"NFC\", \"NFD\", \"NFKC\", or \"NFKD\", If not specified default\r\n * is \"NFC\"\r\n */\r\nexport let normalize;\r\n/**\r\n * Returns a String value that is made from count copies appended together. If count is 0,\r\n * T is the empty String is returned.\r\n * @param count number of copies to append\r\n */\r\nexport let repeat;\r\n/**\r\n * Returns true if the sequence of elements of searchString converted to a String is the\r\n * same as the corresponding elements of this object (converted to a String) starting at\r\n * position. Otherwise returns false.\r\n */\r\nexport let startsWith;\r\n/* ES7 instance methods */\r\n/**\r\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\r\n * The padding is applied from the end (right) of the current string.\r\n *\r\n * @param target The target string\r\n * @param maxLength The length of the resulting string once the current string has been padded.\r\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\r\n *\r\n * @param fillString The string to pad the current string with.\r\n * If this string is too long, it will be truncated and the left-most part will be applied.\r\n * The default value for this parameter is \" \" (U+0020).\r\n */\r\nexport let padEnd;\r\n/**\r\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\r\n * The padding is applied from the start (left) of the current string.\r\n *\r\n * @param target The target string\r\n * @param maxLength The length of the resulting string once the current string has been padded.\r\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\r\n *\r\n * @param fillString The string to pad the current string with.\r\n * If this string is too long, it will be truncated and the left-most part will be applied.\r\n * The default value for this parameter is \" \" (U+0020).\r\n */\r\nexport let padStart;\r\nif (true && true) {\r\n fromCodePoint = global.String.fromCodePoint;\r\n raw = global.String.raw;\r\n codePointAt = wrapNative(global.String.prototype.codePointAt);\r\n endsWith = wrapNative(global.String.prototype.endsWith);\r\n includes = wrapNative(global.String.prototype.includes);\r\n normalize = wrapNative(global.String.prototype.normalize);\r\n repeat = wrapNative(global.String.prototype.repeat);\r\n startsWith = wrapNative(global.String.prototype.startsWith);\r\n}\r\nelse {\r\n /**\r\n * Validates that text is defined, and normalizes position (based on the given default if the input is NaN).\r\n * Used by startsWith, includes, and endsWith.\r\n *\r\n * @return Normalized position.\r\n */\r\n const normalizeSubstringArgs = function (name, text, search, position, isEnd = false) {\r\n if (text == null) {\r\n throw new TypeError('string.' + name + ' requires a valid string to search against.');\r\n }\r\n const length = text.length;\r\n position = position !== position ? (isEnd ? length : 0) : position;\r\n return [text, String(search), Math.min(Math.max(position, 0), length)];\r\n };\r\n fromCodePoint = function fromCodePoint(...codePoints) {\r\n // Adapted from https://github.com/mathiasbynens/String.fromCodePoint\r\n const length = arguments.length;\r\n if (!length) {\r\n return '';\r\n }\r\n const fromCharCode = String.fromCharCode;\r\n const MAX_SIZE = 0x4000;\r\n let codeUnits = [];\r\n let index = -1;\r\n let result = '';\r\n while (++index < length) {\r\n let codePoint = Number(arguments[index]);\r\n // Code points must be finite integers within the valid range\r\n let isValid = isFinite(codePoint) && Math.floor(codePoint) === codePoint && codePoint >= 0 && codePoint <= 0x10ffff;\r\n if (!isValid) {\r\n throw RangeError('string.fromCodePoint: Invalid code point ' + codePoint);\r\n }\r\n if (codePoint <= 0xffff) {\r\n // BMP code point\r\n codeUnits.push(codePoint);\r\n }\r\n else {\r\n // Astral code point; split in surrogate halves\r\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\r\n codePoint -= 0x10000;\r\n let highSurrogate = (codePoint >> 10) + HIGH_SURROGATE_MIN;\r\n let lowSurrogate = codePoint % 0x400 + LOW_SURROGATE_MIN;\r\n codeUnits.push(highSurrogate, lowSurrogate);\r\n }\r\n if (index + 1 === length || codeUnits.length > MAX_SIZE) {\r\n result += fromCharCode.apply(null, codeUnits);\r\n codeUnits.length = 0;\r\n }\r\n }\r\n return result;\r\n };\r\n raw = function raw(callSite, ...substitutions) {\r\n let rawStrings = callSite.raw;\r\n let result = '';\r\n let numSubstitutions = substitutions.length;\r\n if (callSite == null || callSite.raw == null) {\r\n throw new TypeError('string.raw requires a valid callSite object with a raw value');\r\n }\r\n for (let i = 0, length = rawStrings.length; i < length; i++) {\r\n result += rawStrings[i] + (i < numSubstitutions && i < length - 1 ? substitutions[i] : '');\r\n }\r\n return result;\r\n };\r\n codePointAt = function codePointAt(text, position = 0) {\r\n // Adapted from https://github.com/mathiasbynens/String.prototype.codePointAt\r\n if (text == null) {\r\n throw new TypeError('string.codePointAt requries a valid string.');\r\n }\r\n const length = text.length;\r\n if (position !== position) {\r\n position = 0;\r\n }\r\n if (position < 0 || position >= length) {\r\n return undefined;\r\n }\r\n // Get the first code unit\r\n const first = text.charCodeAt(position);\r\n if (first >= HIGH_SURROGATE_MIN && first <= HIGH_SURROGATE_MAX && length > position + 1) {\r\n // Start of a surrogate pair (high surrogate and there is a next code unit); check for low surrogate\r\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\r\n const second = text.charCodeAt(position + 1);\r\n if (second >= LOW_SURROGATE_MIN && second <= LOW_SURROGATE_MAX) {\r\n return (first - HIGH_SURROGATE_MIN) * 0x400 + second - LOW_SURROGATE_MIN + 0x10000;\r\n }\r\n }\r\n return first;\r\n };\r\n endsWith = function endsWith(text, search, endPosition) {\r\n if (endPosition == null) {\r\n endPosition = text.length;\r\n }\r\n [text, search, endPosition] = normalizeSubstringArgs('endsWith', text, search, endPosition, true);\r\n const start = endPosition - search.length;\r\n if (start < 0) {\r\n return false;\r\n }\r\n return text.slice(start, endPosition) === search;\r\n };\r\n includes = function includes(text, search, position = 0) {\r\n [text, search, position] = normalizeSubstringArgs('includes', text, search, position);\r\n return text.indexOf(search, position) !== -1;\r\n };\r\n repeat = function repeat(text, count = 0) {\r\n // Adapted from https://github.com/mathiasbynens/String.prototype.repeat\r\n if (text == null) {\r\n throw new TypeError('string.repeat requires a valid string.');\r\n }\r\n if (count !== count) {\r\n count = 0;\r\n }\r\n if (count < 0 || count === Infinity) {\r\n throw new RangeError('string.repeat requires a non-negative finite count.');\r\n }\r\n let result = '';\r\n while (count) {\r\n if (count % 2) {\r\n result += text;\r\n }\r\n if (count > 1) {\r\n text += text;\r\n }\r\n count >>= 1;\r\n }\r\n return result;\r\n };\r\n startsWith = function startsWith(text, search, position = 0) {\r\n search = String(search);\r\n [text, search, position] = normalizeSubstringArgs('startsWith', text, search, position);\r\n const end = position + search.length;\r\n if (end > text.length) {\r\n return false;\r\n }\r\n return text.slice(position, end) === search;\r\n };\r\n}\r\nif (true) {\r\n padEnd = wrapNative(global.String.prototype.padEnd);\r\n padStart = wrapNative(global.String.prototype.padStart);\r\n}\r\nelse {\r\n padEnd = function padEnd(text, maxLength, fillString = ' ') {\r\n if (text === null || text === undefined) {\r\n throw new TypeError('string.repeat requires a valid string.');\r\n }\r\n if (maxLength === Infinity) {\r\n throw new RangeError('string.padEnd requires a non-negative finite count.');\r\n }\r\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\r\n maxLength = 0;\r\n }\r\n let strText = String(text);\r\n const padding = maxLength - strText.length;\r\n if (padding > 0) {\r\n strText +=\r\n repeat(fillString, Math.floor(padding / fillString.length)) +\r\n fillString.slice(0, padding % fillString.length);\r\n }\r\n return strText;\r\n };\r\n padStart = function padStart(text, maxLength, fillString = ' ') {\r\n if (text === null || text === undefined) {\r\n throw new TypeError('string.repeat requires a valid string.');\r\n }\r\n if (maxLength === Infinity) {\r\n throw new RangeError('string.padStart requires a non-negative finite count.');\r\n }\r\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\r\n maxLength = 0;\r\n }\r\n let strText = String(text);\r\n const padding = maxLength - strText.length;\r\n if (padding > 0) {\r\n strText =\r\n repeat(fillString, Math.floor(padding / fillString.length)) +\r\n fillString.slice(0, padding % fillString.length) +\r\n strText;\r\n }\r\n return strText;\r\n };\r\n}\r\n//# sourceMappingURL=string.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/string.mjs\n// module id = ./node_modules/@dojo/shim/string.mjs\n// module chunks = menu","import has, { add } from '@dojo/has/has';\r\nimport global from '../global';\r\nexport default has;\r\nexport * from '@dojo/has/has';\r\n/* ECMAScript 6 and 7 Features */\r\n/* Array */\r\nadd('es6-array', () => {\r\n return (['from', 'of'].every((key) => key in global.Array) &&\r\n ['findIndex', 'find', 'copyWithin'].every((key) => key in global.Array.prototype));\r\n}, true);\r\nadd('es6-array-fill', () => {\r\n if ('fill' in global.Array.prototype) {\r\n /* Some versions of Safari do not properly implement this */\r\n return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1;\r\n }\r\n return false;\r\n}, true);\r\nadd('es7-array', () => 'includes' in global.Array.prototype, true);\r\n/* Map */\r\nadd('es6-map', () => {\r\n if (typeof global.Map === 'function') {\r\n /*\r\n IE11 and older versions of Safari are missing critical ES6 Map functionality\r\n We wrap this in a try/catch because sometimes the Map constructor exists, but does not\r\n take arguments (iOS 8.4)\r\n */\r\n try {\r\n const map = new global.Map([[0, 1]]);\r\n return map.has(0) &&\r\n typeof map.keys === 'function' &&\r\n true &&\r\n typeof map.values === 'function' &&\r\n typeof map.entries === 'function';\r\n }\r\n catch (e) {\r\n /* istanbul ignore next: not testing on iOS at the moment */\r\n return false;\r\n }\r\n }\r\n return false;\r\n}, true);\r\n/* Math */\r\nadd('es6-math', () => {\r\n return [\r\n 'clz32',\r\n 'sign',\r\n 'log10',\r\n 'log2',\r\n 'log1p',\r\n 'expm1',\r\n 'cosh',\r\n 'sinh',\r\n 'tanh',\r\n 'acosh',\r\n 'asinh',\r\n 'atanh',\r\n 'trunc',\r\n 'fround',\r\n 'cbrt',\r\n 'hypot'\r\n ].every((name) => typeof global.Math[name] === 'function');\r\n}, true);\r\nadd('es6-math-imul', () => {\r\n if ('imul' in global.Math) {\r\n /* Some versions of Safari on ios do not properly implement this */\r\n return Math.imul(0xffffffff, 5) === -5;\r\n }\r\n return false;\r\n}, true);\r\n/* Object */\r\nadd('es6-object', () => {\r\n return true &&\r\n ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof global.Object[name] === 'function');\r\n}, true);\r\nadd('es2017-object', () => {\r\n return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof global.Object[name] === 'function');\r\n}, true);\r\n/* Observable */\r\nadd('es-observable', () => typeof global.Observable !== 'undefined', true);\r\n/* Promise */\r\nadd('es6-promise', () => typeof global.Promise !== 'undefined' && true, true);\r\n/* Set */\r\nadd('es6-set', () => {\r\n if (typeof global.Set === 'function') {\r\n /* IE11 and older versions of Safari are missing critical ES6 Set functionality */\r\n const set = new global.Set([1]);\r\n return set.has(1) && 'keys' in set && typeof set.keys === 'function' && true;\r\n }\r\n return false;\r\n}, true);\r\n/* String */\r\nadd('es6-string', () => {\r\n return ([\r\n /* static methods */\r\n 'fromCodePoint'\r\n ].every((key) => typeof global.String[key] === 'function') &&\r\n [\r\n /* instance methods */\r\n 'codePointAt',\r\n 'normalize',\r\n 'repeat',\r\n 'startsWith',\r\n 'endsWith',\r\n 'includes'\r\n ].every((key) => typeof global.String.prototype[key] === 'function'));\r\n}, true);\r\nadd('es6-string-raw', () => {\r\n function getCallSite(callSite, ...substitutions) {\r\n const result = [...callSite];\r\n result.raw = callSite.raw;\r\n return result;\r\n }\r\n if ('raw' in global.String) {\r\n let b = 1;\r\n let callSite = getCallSite `a\\n${b}`;\r\n callSite.raw = ['a\\\\n'];\r\n const supportsTrunc = global.String.raw(callSite, 42) === 'a:\\\\n';\r\n return supportsTrunc;\r\n }\r\n return false;\r\n}, true);\r\nadd('es2017-string', () => {\r\n return ['padStart', 'padEnd'].every((key) => typeof global.String.prototype[key] === 'function');\r\n}, true);\r\n/* Symbol */\r\nadd('es6-symbol', () => typeof global.Symbol !== 'undefined' && typeof Symbol() === 'symbol', true);\r\n/* WeakMap */\r\nadd('es6-weakmap', () => {\r\n if (typeof global.WeakMap !== 'undefined') {\r\n /* IE11 and older versions of Safari are missing critical ES6 Map functionality */\r\n const key1 = {};\r\n const key2 = {};\r\n const map = new global.WeakMap([[key1, 1]]);\r\n Object.freeze(key1);\r\n return map.get(key1) === 1 && map.set(key2, 2) === map && true;\r\n }\r\n return false;\r\n}, true);\r\n/* Miscellaneous features */\r\nadd('microtasks', () => true || false || true, true);\r\nadd('postmessage', () => {\r\n // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have\r\n // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist.\r\n return typeof global.window !== 'undefined' && typeof global.postMessage === 'function';\r\n}, true);\r\nadd('raf', () => typeof global.requestAnimationFrame === 'function', true);\r\nadd('setimmediate', () => typeof global.setImmediate !== 'undefined', true);\r\n/* DOM Features */\r\nadd('dom-mutationobserver', () => {\r\n if (true && Boolean(global.MutationObserver || global.WebKitMutationObserver)) {\r\n // IE11 has an unreliable MutationObserver implementation where setProperty() does not\r\n // generate a mutation event, observers can crash, and the queue does not drain\r\n // reliably. The following feature test was adapted from\r\n // https://gist.github.com/t10ko/4aceb8c71681fdb275e33efe5e576b14\r\n const example = document.createElement('div');\r\n /* tslint:disable-next-line:variable-name */\r\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\r\n const observer = new HostMutationObserver(function () { });\r\n observer.observe(example, { attributes: true });\r\n example.style.setProperty('display', 'block');\r\n return Boolean(observer.takeRecords().length);\r\n }\r\n return false;\r\n}, true);\r\nadd('dom-webanimation', () => true && global.Animation !== undefined && global.KeyframeEffect !== undefined, true);\r\n//# sourceMappingURL=has.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/support/has.mjs\n// module id = ./node_modules/@dojo/shim/support/has.mjs\n// module chunks = menu","import global from '../global';\r\nimport has from './has';\r\nfunction executeTask(item) {\r\n if (item && item.isActive && item.callback) {\r\n item.callback();\r\n }\r\n}\r\nfunction getQueueHandle(item, destructor) {\r\n return {\r\n destroy: function () {\r\n this.destroy = function () { };\r\n item.isActive = false;\r\n item.callback = null;\r\n if (destructor) {\r\n destructor();\r\n }\r\n }\r\n };\r\n}\r\nlet checkMicroTaskQueue;\r\nlet microTasks;\r\n/**\r\n * Schedules a callback to the macrotask queue.\r\n *\r\n * @param callback the function to be queued and later executed.\r\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\r\n */\r\nexport const queueTask = (function () {\r\n let destructor;\r\n let enqueue;\r\n // Since the IE implementation of `setImmediate` is not flawless, we will test for `postMessage` first.\r\n if (true) {\r\n const queue = [];\r\n global.addEventListener('message', function (event) {\r\n // Confirm that the event was triggered by the current window and by this particular implementation.\r\n if (event.source === global && event.data === 'dojo-queue-message') {\r\n event.stopPropagation();\r\n if (queue.length) {\r\n executeTask(queue.shift());\r\n }\r\n }\r\n });\r\n enqueue = function (item) {\r\n queue.push(item);\r\n global.postMessage('dojo-queue-message', '*');\r\n };\r\n }\r\n else if (false) {\r\n destructor = global.clearImmediate;\r\n enqueue = function (item) {\r\n return setImmediate(executeTask.bind(null, item));\r\n };\r\n }\r\n else {\r\n destructor = global.clearTimeout;\r\n enqueue = function (item) {\r\n return setTimeout(executeTask.bind(null, item), 0);\r\n };\r\n }\r\n function queueTask(callback) {\r\n const item = {\r\n isActive: true,\r\n callback: callback\r\n };\r\n const id = enqueue(item);\r\n return getQueueHandle(item, destructor &&\r\n function () {\r\n destructor(id);\r\n });\r\n }\r\n // TODO: Use aspect.before when it is available.\r\n return true\r\n ? queueTask\r\n : function (callback) {\r\n checkMicroTaskQueue();\r\n return queueTask(callback);\r\n };\r\n})();\r\n// When no mechanism for registering microtasks is exposed by the environment, microtasks will\r\n// be queued and then executed in a single macrotask before the other macrotasks are executed.\r\nif (!true) {\r\n let isMicroTaskQueued = false;\r\n microTasks = [];\r\n checkMicroTaskQueue = function () {\r\n if (!isMicroTaskQueued) {\r\n isMicroTaskQueued = true;\r\n queueTask(function () {\r\n isMicroTaskQueued = false;\r\n if (microTasks.length) {\r\n let item;\r\n while ((item = microTasks.shift())) {\r\n executeTask(item);\r\n }\r\n }\r\n });\r\n }\r\n };\r\n}\r\n/**\r\n * Schedules an animation task with `window.requestAnimationFrame` if it exists, or with `queueTask` otherwise.\r\n *\r\n * Since requestAnimationFrame's behavior does not match that expected from `queueTask`, it is not used there.\r\n * However, at times it makes more sense to delegate to requestAnimationFrame; hence the following method.\r\n *\r\n * @param callback the function to be queued and later executed.\r\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\r\n */\r\nexport const queueAnimationTask = (function () {\r\n if (!true) {\r\n return queueTask;\r\n }\r\n function queueAnimationTask(callback) {\r\n const item = {\r\n isActive: true,\r\n callback: callback\r\n };\r\n const rafId = requestAnimationFrame(executeTask.bind(null, item));\r\n return getQueueHandle(item, function () {\r\n cancelAnimationFrame(rafId);\r\n });\r\n }\r\n // TODO: Use aspect.before when it is available.\r\n return true\r\n ? queueAnimationTask\r\n : function (callback) {\r\n checkMicroTaskQueue();\r\n return queueAnimationTask(callback);\r\n };\r\n})();\r\n/**\r\n * Schedules a callback to the microtask queue.\r\n *\r\n * Any callbacks registered with `queueMicroTask` will be executed before the next macrotask. If no native\r\n * mechanism for scheduling macrotasks is exposed, then any callbacks will be fired before any macrotask\r\n * registered with `queueTask` or `queueAnimationTask`.\r\n *\r\n * @param callback the function to be queued and later executed.\r\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\r\n */\r\nexport let queueMicroTask = (function () {\r\n let enqueue;\r\n if (false) {\r\n enqueue = function (item) {\r\n global.process.nextTick(executeTask.bind(null, item));\r\n };\r\n }\r\n else if (true) {\r\n enqueue = function (item) {\r\n global.Promise.resolve(item).then(executeTask);\r\n };\r\n }\r\n else if (true) {\r\n /* tslint:disable-next-line:variable-name */\r\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\r\n const node = document.createElement('div');\r\n const queue = [];\r\n const observer = new HostMutationObserver(function () {\r\n while (queue.length > 0) {\r\n const item = queue.shift();\r\n if (item && item.isActive && item.callback) {\r\n item.callback();\r\n }\r\n }\r\n });\r\n observer.observe(node, { attributes: true });\r\n enqueue = function (item) {\r\n queue.push(item);\r\n node.setAttribute('queueStatus', '1');\r\n };\r\n }\r\n else {\r\n enqueue = function (item) {\r\n checkMicroTaskQueue();\r\n microTasks.push(item);\r\n };\r\n }\r\n return function (callback) {\r\n const item = {\r\n isActive: true,\r\n callback: callback\r\n };\r\n enqueue(item);\r\n return getQueueHandle(item);\r\n };\r\n})();\r\n//# sourceMappingURL=queue.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/support/queue.mjs\n// module id = ./node_modules/@dojo/shim/support/queue.mjs\n// module chunks = menu","/**\n * Helper function to generate a value property descriptor\n *\n * @param value The value the property descriptor should be set to\n * @param enumerable If the property should be enumberable, defaults to false\n * @param writable If the property should be writable, defaults to true\n * @param configurable If the property should be configurable, defaults to true\n * @return The property descriptor object\n */\nexport function getValueDescriptor(value, enumerable = false, writable = true, configurable = true) {\n return {\n value: value,\n enumerable: enumerable,\n writable: writable,\n configurable: configurable\n };\n}\nexport function wrapNative(nativeFunction) {\n return function (target, ...args) {\n return nativeFunction.apply(target, args);\n };\n}\n//# sourceMappingURL=util.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/shim/support/util.mjs\n// module id = ./node_modules/@dojo/shim/support/util.mjs\n// module chunks = menu","import { Evented } from '@dojo/core/Evented';\nexport class Injector extends Evented {\n constructor(payload) {\n super();\n this._payload = payload;\n }\n setInvalidator(invalidator) {\n this._invalidator = invalidator;\n }\n get() {\n return this._payload;\n }\n set(payload) {\n this._payload = payload;\n if (this._invalidator) {\n this._invalidator();\n }\n }\n}\nexport default Injector;\n//# sourceMappingURL=Injector.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/Injector.mjs\n// module id = ./node_modules/@dojo/widget-core/Injector.mjs\n// module chunks = menu","import { Evented } from '@dojo/core/Evented';\r\nimport Map from '@dojo/shim/Map';\r\n/**\r\n * Enum to identify the type of event.\r\n * Listening to 'Projector' will notify when projector is created or updated\r\n * Listening to 'Widget' will notify when widget root is created or updated\r\n */\r\nexport var NodeEventType;\r\n(function (NodeEventType) {\r\n NodeEventType[\"Projector\"] = \"Projector\";\r\n NodeEventType[\"Widget\"] = \"Widget\";\r\n})(NodeEventType || (NodeEventType = {}));\r\nexport class NodeHandler extends Evented {\r\n constructor() {\r\n super(...arguments);\r\n this._nodeMap = new Map();\r\n }\r\n get(key) {\r\n return this._nodeMap.get(key);\r\n }\r\n has(key) {\r\n return this._nodeMap.has(key);\r\n }\r\n add(element, key) {\r\n this._nodeMap.set(key, element);\r\n this.emit({ type: key });\r\n }\r\n addRoot() {\r\n this.emit({ type: NodeEventType.Widget });\r\n }\r\n addProjector() {\r\n this.emit({ type: NodeEventType.Projector });\r\n }\r\n clear() {\r\n this._nodeMap.clear();\r\n }\r\n}\r\nexport default NodeHandler;\r\n//# sourceMappingURL=NodeHandler.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/NodeHandler.mjs\n// module id = ./node_modules/@dojo/widget-core/NodeHandler.mjs\n// module chunks = menu","import Promise from '@dojo/shim/Promise';\r\nimport Map from '@dojo/shim/Map';\r\nimport Symbol from '@dojo/shim/Symbol';\r\nimport { Evented } from '@dojo/core/Evented';\r\n/**\r\n * Widget base symbol type\r\n */\r\nexport const WIDGET_BASE_TYPE = Symbol('Widget Base');\r\n/**\r\n * Checks is the item is a subclass of WidgetBase (or a WidgetBase)\r\n *\r\n * @param item the item to check\r\n * @returns true/false indicating if the item is a WidgetBaseConstructor\r\n */\r\nexport function isWidgetBaseConstructor(item) {\r\n return Boolean(item && item._type === WIDGET_BASE_TYPE);\r\n}\r\nexport function isWidgetConstructorDefaultExport(item) {\r\n return Boolean(item &&\r\n item.hasOwnProperty('__esModule') &&\r\n item.hasOwnProperty('default') &&\r\n isWidgetBaseConstructor(item.default));\r\n}\r\n/**\r\n * The Registry implementation\r\n */\r\nexport class Registry extends Evented {\r\n /**\r\n * Emit loaded event for registry label\r\n */\r\n emitLoadedEvent(widgetLabel, item) {\r\n this.emit({\r\n type: widgetLabel,\r\n action: 'loaded',\r\n item\r\n });\r\n }\r\n define(label, item) {\r\n if (this._widgetRegistry === undefined) {\r\n this._widgetRegistry = new Map();\r\n }\r\n if (this._widgetRegistry.has(label)) {\r\n throw new Error(`widget has already been registered for '${label.toString()}'`);\r\n }\r\n this._widgetRegistry.set(label, item);\r\n if (item instanceof Promise) {\r\n item.then((widgetCtor) => {\r\n this._widgetRegistry.set(label, widgetCtor);\r\n this.emitLoadedEvent(label, widgetCtor);\r\n return widgetCtor;\r\n }, (error) => {\r\n throw error;\r\n });\r\n }\r\n else if (isWidgetBaseConstructor(item)) {\r\n this.emitLoadedEvent(label, item);\r\n }\r\n }\r\n defineInjector(label, injectorFactory) {\r\n if (this._injectorRegistry === undefined) {\r\n this._injectorRegistry = new Map();\r\n }\r\n if (this._injectorRegistry.has(label)) {\r\n throw new Error(`injector has already been registered for '${label.toString()}'`);\r\n }\r\n const invalidator = new Evented();\r\n const injectorItem = {\r\n injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })),\r\n invalidator\r\n };\r\n this._injectorRegistry.set(label, injectorItem);\r\n this.emitLoadedEvent(label, injectorItem);\r\n }\r\n get(label) {\r\n if (!this._widgetRegistry || !this.has(label)) {\r\n return null;\r\n }\r\n const item = this._widgetRegistry.get(label);\r\n if (isWidgetBaseConstructor(item)) {\r\n return item;\r\n }\r\n if (item instanceof Promise) {\r\n return null;\r\n }\r\n const promise = item();\r\n this._widgetRegistry.set(label, promise);\r\n promise.then((widgetCtor) => {\r\n if (isWidgetConstructorDefaultExport(widgetCtor)) {\r\n widgetCtor = widgetCtor.default;\r\n }\r\n this._widgetRegistry.set(label, widgetCtor);\r\n this.emitLoadedEvent(label, widgetCtor);\r\n return widgetCtor;\r\n }, (error) => {\r\n throw error;\r\n });\r\n return null;\r\n }\r\n getInjector(label) {\r\n if (!this._injectorRegistry || !this.hasInjector(label)) {\r\n return null;\r\n }\r\n return this._injectorRegistry.get(label);\r\n }\r\n has(label) {\r\n return Boolean(this._widgetRegistry && this._widgetRegistry.has(label));\r\n }\r\n hasInjector(label) {\r\n return Boolean(this._injectorRegistry && this._injectorRegistry.has(label));\r\n }\r\n}\r\nexport default Registry;\r\n//# sourceMappingURL=Registry.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/Registry.mjs\n// module id = ./node_modules/@dojo/widget-core/Registry.mjs\n// module chunks = menu","import { Map } from '@dojo/shim/Map';\r\nimport { Evented } from '@dojo/core/Evented';\r\nimport { Registry } from './Registry';\r\nexport class RegistryHandler extends Evented {\r\n constructor() {\r\n super();\r\n this._registry = new Registry();\r\n this._registryWidgetLabelMap = new Map();\r\n this._registryInjectorLabelMap = new Map();\r\n this.own(this._registry);\r\n const destroy = () => {\r\n if (this.baseRegistry) {\r\n this._registryWidgetLabelMap.delete(this.baseRegistry);\r\n this._registryInjectorLabelMap.delete(this.baseRegistry);\r\n this.baseRegistry = undefined;\r\n }\r\n };\r\n this.own({ destroy });\r\n }\r\n set base(baseRegistry) {\r\n if (this.baseRegistry) {\r\n this._registryWidgetLabelMap.delete(this.baseRegistry);\r\n this._registryInjectorLabelMap.delete(this.baseRegistry);\r\n }\r\n this.baseRegistry = baseRegistry;\r\n }\r\n define(label, widget) {\r\n this._registry.define(label, widget);\r\n }\r\n defineInjector(label, injector) {\r\n this._registry.defineInjector(label, injector);\r\n }\r\n has(label) {\r\n return this._registry.has(label) || Boolean(this.baseRegistry && this.baseRegistry.has(label));\r\n }\r\n hasInjector(label) {\r\n return this._registry.hasInjector(label) || Boolean(this.baseRegistry && this.baseRegistry.hasInjector(label));\r\n }\r\n get(label, globalPrecedence = false) {\r\n return this._get(label, globalPrecedence, 'get', this._registryWidgetLabelMap);\r\n }\r\n getInjector(label, globalPrecedence = false) {\r\n return this._get(label, globalPrecedence, 'getInjector', this._registryInjectorLabelMap);\r\n }\r\n _get(label, globalPrecedence, getFunctionName, labelMap) {\r\n const registries = globalPrecedence ? [this.baseRegistry, this._registry] : [this._registry, this.baseRegistry];\r\n for (let i = 0; i < registries.length; i++) {\r\n const registry = registries[i];\r\n if (!registry) {\r\n continue;\r\n }\r\n const item = registry[getFunctionName](label);\r\n const registeredLabels = labelMap.get(registry) || [];\r\n if (item) {\r\n return item;\r\n }\r\n else if (registeredLabels.indexOf(label) === -1) {\r\n const handle = registry.on(label, (event) => {\r\n if (event.action === 'loaded' &&\r\n this[getFunctionName](label, globalPrecedence) === event.item) {\r\n this.emit({ type: 'invalidate' });\r\n }\r\n });\r\n this.own(handle);\r\n labelMap.set(registry, [...registeredLabels, label]);\r\n }\r\n }\r\n return null;\r\n }\r\n}\r\nexport default RegistryHandler;\r\n//# sourceMappingURL=RegistryHandler.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/RegistryHandler.mjs\n// module id = ./node_modules/@dojo/widget-core/RegistryHandler.mjs\n// module chunks = menu","import Map from '@dojo/shim/Map';\nimport WeakMap from '@dojo/shim/WeakMap';\nimport Symbol from '@dojo/shim/Symbol';\nimport { v } from './d';\nimport { auto } from './diff';\nimport RegistryHandler from './RegistryHandler';\nimport NodeHandler from './NodeHandler';\nimport { widgetInstanceMap } from './vdom';\nimport { isWidgetBaseConstructor, WIDGET_BASE_TYPE } from './Registry';\nconst decoratorMap = new Map();\nconst boundAuto = auto.bind(null);\nexport const noBind = Symbol.for('dojoNoBind');\n/**\n * Main widget base for all widgets to extend\n */\nexport class WidgetBase {\n /**\n * @constructor\n */\n constructor() {\n /**\n * Indicates if it is the initial set properties cycle\n */\n this._initialProperties = true;\n /**\n * Array of property keys considered changed from the previous set properties\n */\n this._changedPropertyKeys = [];\n this._nodeHandler = new NodeHandler();\n this._handles = [];\n this._children = [];\n this._decoratorCache = new Map();\n this._properties = {};\n this._boundRenderFunc = this.render.bind(this);\n this._boundInvalidate = this.invalidate.bind(this);\n widgetInstanceMap.set(this, {\n dirty: true,\n onAttach: () => {\n this.onAttach();\n },\n onDetach: () => {\n this.onDetach();\n this.destroy();\n },\n nodeHandler: this._nodeHandler,\n registry: () => {\n return this.registry;\n },\n coreProperties: {},\n rendering: false,\n inputProperties: {}\n });\n this._runAfterConstructors();\n }\n meta(MetaType) {\n if (this._metaMap === undefined) {\n this._metaMap = new Map();\n }\n let cached = this._metaMap.get(MetaType);\n if (!cached) {\n cached = new MetaType({\n invalidate: this._boundInvalidate,\n nodeHandler: this._nodeHandler,\n bind: this\n });\n this.own(cached);\n this._metaMap.set(MetaType, cached);\n }\n return cached;\n }\n onAttach() {\n // Do nothing by default.\n }\n onDetach() {\n // Do nothing by default.\n }\n get properties() {\n return this._properties;\n }\n get changedPropertyKeys() {\n return [...this._changedPropertyKeys];\n }\n __setCoreProperties__(coreProperties) {\n const { baseRegistry } = coreProperties;\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.coreProperties.baseRegistry !== baseRegistry) {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n this._registry.base = baseRegistry;\n this.invalidate();\n }\n instanceData.coreProperties = coreProperties;\n }\n __setProperties__(originalProperties) {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.inputProperties = originalProperties;\n const properties = this._runBeforeProperties(originalProperties);\n const registeredDiffPropertyNames = this.getDecorator('registeredDiffProperty');\n const changedPropertyKeys = [];\n const propertyNames = Object.keys(properties);\n if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) {\n const allProperties = [...propertyNames, ...Object.keys(this._properties)];\n const checkedProperties = [];\n const diffPropertyResults = {};\n let runReactions = false;\n for (let i = 0; i < allProperties.length; i++) {\n const propertyName = allProperties[i];\n if (checkedProperties.indexOf(propertyName) !== -1) {\n continue;\n }\n checkedProperties.push(propertyName);\n const previousProperty = this._properties[propertyName];\n const newProperty = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n if (registeredDiffPropertyNames.indexOf(propertyName) !== -1) {\n runReactions = true;\n const diffFunctions = this.getDecorator(`diffProperty:${propertyName}`);\n for (let i = 0; i < diffFunctions.length; i++) {\n const result = diffFunctions[i](previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n else {\n const result = boundAuto(previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n if (runReactions) {\n this._mapDiffPropertyReactions(properties, changedPropertyKeys).forEach((args, reaction) => {\n if (args.changed) {\n reaction.call(this, args.previousProperties, args.newProperties);\n }\n });\n }\n this._properties = diffPropertyResults;\n this._changedPropertyKeys = changedPropertyKeys;\n }\n else {\n this._initialProperties = false;\n for (let i = 0; i < propertyNames.length; i++) {\n const propertyName = propertyNames[i];\n if (typeof properties[propertyName] === 'function') {\n properties[propertyName] = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n }\n else {\n changedPropertyKeys.push(propertyName);\n }\n }\n this._changedPropertyKeys = changedPropertyKeys;\n this._properties = Object.assign({}, properties);\n }\n if (this._changedPropertyKeys.length > 0) {\n this.invalidate();\n }\n }\n get children() {\n return this._children;\n }\n __setChildren__(children) {\n if (this._children.length > 0 || children.length > 0) {\n this._children = children;\n this.invalidate();\n }\n }\n __render__() {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.dirty = false;\n const render = this._runBeforeRenders();\n let dNode = render();\n dNode = this.runAfterRenders(dNode);\n this._nodeHandler.clear();\n return dNode;\n }\n invalidate() {\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.invalidate) {\n instanceData.invalidate();\n }\n }\n render() {\n return v('div', {}, this.children);\n }\n /**\n * Function to add decorators to WidgetBase\n *\n * @param decoratorKey The key of the decorator\n * @param value The value of the decorator\n */\n addDecorator(decoratorKey, value) {\n value = Array.isArray(value) ? value : [value];\n if (this.hasOwnProperty('constructor')) {\n let decoratorList = decoratorMap.get(this.constructor);\n if (!decoratorList) {\n decoratorList = new Map();\n decoratorMap.set(this.constructor, decoratorList);\n }\n let specificDecoratorList = decoratorList.get(decoratorKey);\n if (!specificDecoratorList) {\n specificDecoratorList = [];\n decoratorList.set(decoratorKey, specificDecoratorList);\n }\n specificDecoratorList.push(...value);\n }\n else {\n const decorators = this.getDecorator(decoratorKey);\n this._decoratorCache.set(decoratorKey, [...decorators, ...value]);\n }\n }\n /**\n * Function to build the list of decorators from the global decorator map.\n *\n * @param decoratorKey The key of the decorator\n * @return An array of decorator values\n * @private\n */\n _buildDecoratorList(decoratorKey) {\n const allDecorators = [];\n let constructor = this.constructor;\n while (constructor) {\n const instanceMap = decoratorMap.get(constructor);\n if (instanceMap) {\n const decorators = instanceMap.get(decoratorKey);\n if (decorators) {\n allDecorators.unshift(...decorators);\n }\n }\n constructor = Object.getPrototypeOf(constructor);\n }\n return allDecorators;\n }\n /**\n * Function to retrieve decorator values\n *\n * @param decoratorKey The key of the decorator\n * @returns An array of decorator values\n */\n getDecorator(decoratorKey) {\n let allDecorators = this._decoratorCache.get(decoratorKey);\n if (allDecorators !== undefined) {\n return allDecorators;\n }\n allDecorators = this._buildDecoratorList(decoratorKey);\n this._decoratorCache.set(decoratorKey, allDecorators);\n return allDecorators;\n }\n _mapDiffPropertyReactions(newProperties, changedPropertyKeys) {\n const reactionFunctions = this.getDecorator('diffReaction');\n return reactionFunctions.reduce((reactionPropertyMap, { reaction, propertyName }) => {\n let reactionArguments = reactionPropertyMap.get(reaction);\n if (reactionArguments === undefined) {\n reactionArguments = {\n previousProperties: {},\n newProperties: {},\n changed: false\n };\n }\n reactionArguments.previousProperties[propertyName] = this._properties[propertyName];\n reactionArguments.newProperties[propertyName] = newProperties[propertyName];\n if (changedPropertyKeys.indexOf(propertyName) !== -1) {\n reactionArguments.changed = true;\n }\n reactionPropertyMap.set(reaction, reactionArguments);\n return reactionPropertyMap;\n }, new Map());\n }\n /**\n * Binds unbound property functions to the specified `bind` property\n *\n * @param properties properties to check for functions\n */\n _bindFunctionProperty(property, bind) {\n if (typeof property === 'function' && !property[noBind] && isWidgetBaseConstructor(property) === false) {\n if (this._bindFunctionPropertyMap === undefined) {\n this._bindFunctionPropertyMap = new WeakMap();\n }\n const bindInfo = this._bindFunctionPropertyMap.get(property) || {};\n let { boundFunc, scope } = bindInfo;\n if (boundFunc === undefined || scope !== bind) {\n boundFunc = property.bind(bind);\n this._bindFunctionPropertyMap.set(property, { boundFunc, scope: bind });\n }\n return boundFunc;\n }\n return property;\n }\n get registry() {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n return this._registry;\n }\n _runBeforeProperties(properties) {\n const beforeProperties = this.getDecorator('beforeProperties');\n if (beforeProperties.length > 0) {\n return beforeProperties.reduce((properties, beforePropertiesFunction) => {\n return Object.assign({}, properties, beforePropertiesFunction.call(this, properties));\n }, Object.assign({}, properties));\n }\n return properties;\n }\n /**\n * Run all registered before renders and return the updated render method\n */\n _runBeforeRenders() {\n const beforeRenders = this.getDecorator('beforeRender');\n if (beforeRenders.length > 0) {\n return beforeRenders.reduce((render, beforeRenderFunction) => {\n const updatedRender = beforeRenderFunction.call(this, render, this._properties, this._children);\n if (!updatedRender) {\n console.warn('Render function not returned from beforeRender, using previous render');\n return render;\n }\n return updatedRender;\n }, this._boundRenderFunc);\n }\n return this._boundRenderFunc;\n }\n /**\n * Run all registered after renders and return the decorated DNodes\n *\n * @param dNode The DNodes to run through the after renders\n */\n runAfterRenders(dNode) {\n const afterRenders = this.getDecorator('afterRender');\n if (afterRenders.length > 0) {\n return afterRenders.reduce((dNode, afterRenderFunction) => {\n return afterRenderFunction.call(this, dNode);\n }, dNode);\n }\n if (this._metaMap !== undefined) {\n this._metaMap.forEach((meta) => {\n meta.afterRender();\n });\n }\n return dNode;\n }\n _runAfterConstructors() {\n const afterConstructors = this.getDecorator('afterConstructor');\n if (afterConstructors.length > 0) {\n afterConstructors.forEach((afterConstructor) => afterConstructor.call(this));\n }\n }\n own(handle) {\n this._handles.push(handle);\n }\n destroy() {\n while (this._handles.length > 0) {\n const handle = this._handles.pop();\n if (handle) {\n handle.destroy();\n }\n }\n }\n}\n/**\n * static identifier\n */\nWidgetBase._type = WIDGET_BASE_TYPE;\nexport default WidgetBase;\n//# sourceMappingURL=WidgetBase.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/WidgetBase.mjs\n// module id = ./node_modules/@dojo/widget-core/WidgetBase.mjs\n// module chunks = menu","let browserSpecificTransitionEndEventName = '';\nlet browserSpecificAnimationEndEventName = '';\nfunction determineBrowserStyleNames(element) {\n if ('WebkitTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'webkitTransitionEnd';\n browserSpecificAnimationEndEventName = 'webkitAnimationEnd';\n }\n else if ('transition' in element.style || 'MozTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'transitionend';\n browserSpecificAnimationEndEventName = 'animationend';\n }\n else {\n throw new Error('Your browser is not supported');\n }\n}\nfunction initialize(element) {\n if (browserSpecificAnimationEndEventName === '') {\n determineBrowserStyleNames(element);\n }\n}\nfunction runAndCleanUp(element, startAnimation, finishAnimation) {\n initialize(element);\n let finished = false;\n let transitionEnd = function () {\n if (!finished) {\n finished = true;\n element.removeEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n element.removeEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n finishAnimation();\n }\n };\n startAnimation();\n element.addEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n element.addEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n}\nfunction exit(node, properties, exitAnimation, removeNode) {\n const activeClass = properties.exitAnimationActive || `${exitAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(exitAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n removeNode();\n });\n}\nfunction enter(node, properties, enterAnimation) {\n const activeClass = properties.enterAnimationActive || `${enterAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(enterAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n node.classList.remove(enterAnimation);\n node.classList.remove(activeClass);\n });\n}\nexport default {\n enter,\n exit\n};\n//# sourceMappingURL=cssTransitions.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/animations/cssTransitions.mjs\n// module id = ./node_modules/@dojo/widget-core/animations/cssTransitions.mjs\n// module chunks = menu","import Symbol from '@dojo/shim/Symbol';\n/**\n * The symbol identifier for a WNode type\n */\nexport const WNODE = Symbol('Identifier for a WNode.');\n/**\n * The symbol identifier for a VNode type\n */\nexport const VNODE = Symbol('Identifier for a VNode.');\n/**\n * The symbol identifier for a VNode type created using dom()\n */\nexport const DOMVNODE = Symbol('Identifier for a VNode created using existing dom.');\n/**\n * Helper function that returns true if the `DNode` is a `WNode` using the `type` property\n */\nexport function isWNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === WNODE);\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` using the `type` property\n */\nexport function isVNode(child) {\n return Boolean(child && typeof child !== 'string' && (child.type === VNODE || child.type === DOMVNODE));\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` created with `dom()` using the `type` property\n */\nexport function isDomVNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === DOMVNODE);\n}\nexport function isElementNode(value) {\n return !!value.tagName;\n}\nexport function decorate(dNodes, optionsOrModifier, predicate) {\n let shallow = false;\n let modifier;\n if (typeof optionsOrModifier === 'function') {\n modifier = optionsOrModifier;\n }\n else {\n modifier = optionsOrModifier.modifier;\n predicate = optionsOrModifier.predicate;\n shallow = optionsOrModifier.shallow || false;\n }\n let nodes = Array.isArray(dNodes) ? [...dNodes] : [dNodes];\n function breaker() {\n nodes = [];\n }\n while (nodes.length) {\n const node = nodes.shift();\n if (node) {\n if (!shallow && (isWNode(node) || isVNode(node)) && node.children) {\n nodes = [...nodes, ...node.children];\n }\n if (!predicate || predicate(node)) {\n modifier(node, breaker);\n }\n }\n }\n return dNodes;\n}\n/**\n * Wrapper function for calls to create a widget.\n */\nexport function w(widgetConstructor, properties, children = []) {\n return {\n children,\n widgetConstructor,\n properties,\n type: WNODE\n };\n}\nexport function v(tag, propertiesOrChildren = {}, children = undefined) {\n let properties = propertiesOrChildren;\n let deferredPropertiesCallback;\n if (Array.isArray(propertiesOrChildren)) {\n children = propertiesOrChildren;\n properties = {};\n }\n if (typeof properties === 'function') {\n deferredPropertiesCallback = properties;\n properties = {};\n }\n return {\n tag,\n deferredPropertiesCallback,\n children,\n properties,\n type: VNODE\n };\n}\n/**\n * Create a VNode for an existing DOM Node.\n */\nexport function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, children) {\n return {\n tag: isElementNode(node) ? node.tagName.toLowerCase() : '',\n properties: props,\n attributes: attrs,\n events: on,\n children,\n type: DOMVNODE,\n domNode: node,\n text: isElementNode(node) ? undefined : node.data,\n diffType\n };\n}\n//# sourceMappingURL=d.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/d.mjs\n// module id = ./node_modules/@dojo/widget-core/d.mjs\n// module chunks = menu","import { handleDecorator } from './handleDecorator';\nexport function afterRender(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('afterRender', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default afterRender;\n//# sourceMappingURL=afterRender.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/afterRender.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/afterRender.mjs\n// module chunks = menu","import { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\nexport function alwaysRender() {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function () {\n this.invalidate();\n })(target);\n });\n}\nexport default alwaysRender;\n//# sourceMappingURL=alwaysRender.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs\n// module chunks = menu","import { handleDecorator } from './handleDecorator';\nexport function beforeProperties(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('beforeProperties', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default beforeProperties;\n//# sourceMappingURL=beforeProperties.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs\n// module chunks = menu","import { CustomElementChildType } from '../registerCustomElement';\nimport Registry from '../Registry';\n/**\n * This Decorator is provided properties that define the behavior of a custom element, and\n * registers that custom element.\n */\nexport function customElement({ tag, properties = [], attributes = [], events = [], childType = CustomElementChildType.DOJO, registryFactory = () => new Registry() }) {\n return function (target) {\n target.prototype.__customElementDescriptor = {\n tagName: tag,\n attributes,\n properties,\n events,\n childType,\n registryFactory\n };\n };\n}\nexport default customElement;\n//# sourceMappingURL=customElement.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/customElement.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/customElement.mjs\n// module chunks = menu","import { handleDecorator } from './handleDecorator';\n/**\n * Decorator that can be used to register a function as a specific property diff\n *\n * @param propertyName The name of the property of which the diff function is applied\n * @param diffType The diff type, default is DiffType.AUTO.\n * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM\n */\nexport function diffProperty(propertyName, diffFunction, reactionFunction) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null));\n target.addDecorator('registeredDiffProperty', propertyName);\n if (reactionFunction || propertyKey) {\n target.addDecorator('diffReaction', {\n propertyName,\n reaction: propertyKey ? target[propertyKey] : reactionFunction\n });\n }\n });\n}\nexport default diffProperty;\n//# sourceMappingURL=diffProperty.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/diffProperty.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/diffProperty.mjs\n// module chunks = menu","/**\n * Generic decorator handler to take care of whether or not the decorator was called at the class level\n * or the method level.\n *\n * @param handler\n */\nexport function handleDecorator(handler) {\n return function (target, propertyKey, descriptor) {\n if (typeof target === 'function') {\n handler(target.prototype, undefined);\n }\n else {\n handler(target, propertyKey);\n }\n };\n}\nexport default handleDecorator;\n//# sourceMappingURL=handleDecorator.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs\n// module chunks = menu","import WeakMap from '@dojo/shim/WeakMap';\nimport { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\n/**\n * Map of instances against registered injectors.\n */\nconst registeredInjectorsMap = new WeakMap();\n/**\n * Decorator retrieves an injector from an available registry using the name and\n * calls the `getProperties` function with the payload from the injector\n * and current properties with the the injected properties returned.\n *\n * @param InjectConfig the inject configuration\n */\nexport function inject({ name, getProperties }) {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function (properties) {\n const injectorItem = this.registry.getInjector(name);\n if (injectorItem) {\n const { injector, invalidator } = injectorItem;\n const registeredInjectors = registeredInjectorsMap.get(this) || [];\n if (registeredInjectors.length === 0) {\n registeredInjectorsMap.set(this, registeredInjectors);\n }\n if (registeredInjectors.indexOf(injectorItem) === -1) {\n this.own(invalidator.on('invalidate', () => {\n this.invalidate();\n }));\n registeredInjectors.push(injectorItem);\n }\n return getProperties(injector(), properties);\n }\n })(target);\n });\n}\nexport default inject;\n//# sourceMappingURL=inject.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/decorators/inject.mjs\n// module id = ./node_modules/@dojo/widget-core/decorators/inject.mjs\n// module chunks = menu","import { WIDGET_BASE_TYPE } from './Registry';\nfunction isObjectOrArray(value) {\n return Object.prototype.toString.call(value) === '[object Object]' || Array.isArray(value);\n}\nexport function always(previousProperty, newProperty) {\n return {\n changed: true,\n value: newProperty\n };\n}\nexport function ignore(previousProperty, newProperty) {\n return {\n changed: false,\n value: newProperty\n };\n}\nexport function reference(previousProperty, newProperty) {\n return {\n changed: previousProperty !== newProperty,\n value: newProperty\n };\n}\nexport function shallow(previousProperty, newProperty) {\n let changed = false;\n const validOldProperty = previousProperty && isObjectOrArray(previousProperty);\n const validNewProperty = newProperty && isObjectOrArray(newProperty);\n if (!validOldProperty || !validNewProperty) {\n return {\n changed: true,\n value: newProperty\n };\n }\n const previousKeys = Object.keys(previousProperty);\n const newKeys = Object.keys(newProperty);\n if (previousKeys.length !== newKeys.length) {\n changed = true;\n }\n else {\n changed = newKeys.some((key) => {\n return newProperty[key] !== previousProperty[key];\n });\n }\n return {\n changed,\n value: newProperty\n };\n}\nexport function auto(previousProperty, newProperty) {\n let result;\n if (typeof newProperty === 'function') {\n if (newProperty._type === WIDGET_BASE_TYPE) {\n result = reference(previousProperty, newProperty);\n }\n else {\n result = ignore(previousProperty, newProperty);\n }\n }\n else if (isObjectOrArray(newProperty)) {\n result = shallow(previousProperty, newProperty);\n }\n else {\n result = reference(previousProperty, newProperty);\n }\n return result;\n}\n//# sourceMappingURL=diff.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/diff.mjs\n// module id = ./node_modules/@dojo/widget-core/diff.mjs\n// module chunks = menu","import * as tslib_1 from \"tslib\";\nimport { assign } from '@dojo/core/lang';\nimport cssTransitions from '../animations/cssTransitions';\nimport { afterRender } from './../decorators/afterRender';\nimport { v } from './../d';\nimport { dom } from './../vdom';\n/**\n * Represents the attach state of the projector\n */\nexport var ProjectorAttachState;\n(function (ProjectorAttachState) {\n ProjectorAttachState[ProjectorAttachState[\"Attached\"] = 1] = \"Attached\";\n ProjectorAttachState[ProjectorAttachState[\"Detached\"] = 2] = \"Detached\";\n})(ProjectorAttachState || (ProjectorAttachState = {}));\n/**\n * Attach type for the projector\n */\nexport var AttachType;\n(function (AttachType) {\n AttachType[AttachType[\"Append\"] = 1] = \"Append\";\n AttachType[AttachType[\"Merge\"] = 2] = \"Merge\";\n})(AttachType || (AttachType = {}));\nexport function ProjectorMixin(Base) {\n class Projector extends Base {\n constructor(...args) {\n super(...args);\n this._root = document.body;\n this._async = true;\n this._projectorProperties = {};\n this._projectionOptions = {\n transitions: cssTransitions\n };\n this.root = document.body;\n this.projectorState = ProjectorAttachState.Detached;\n }\n append(root) {\n const options = {\n type: AttachType.Append,\n root\n };\n return this._attach(options);\n }\n merge(root) {\n const options = {\n type: AttachType.Merge,\n root\n };\n return this._attach(options);\n }\n set root(root) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change root element');\n }\n this._root = root;\n }\n get root() {\n return this._root;\n }\n get async() {\n return this._async;\n }\n set async(async) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change async mode');\n }\n this._async = async;\n }\n sandbox(doc = document) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot create sandbox');\n }\n this._async = false;\n const previousRoot = this.root;\n /* free up the document fragment for GC */\n this.own({\n destroy: () => {\n this._root = previousRoot;\n }\n });\n this._attach({\n /* DocumentFragment is not assignable to Element, but provides everything needed to work */\n root: doc.createDocumentFragment(),\n type: AttachType.Append\n });\n }\n setChildren(children) {\n this.__setChildren__(children);\n }\n setProperties(properties) {\n this.__setProperties__(properties);\n }\n __setProperties__(properties) {\n if (this._projectorProperties && this._projectorProperties.registry !== properties.registry) {\n if (this._projectorProperties.registry) {\n this._projectorProperties.registry.destroy();\n }\n }\n this._projectorProperties = assign({}, properties);\n super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry });\n super.__setProperties__(properties);\n }\n toHtml() {\n if (this.projectorState !== ProjectorAttachState.Attached || !this._projection) {\n throw new Error('Projector is not attached, cannot return an HTML string of projection.');\n }\n return this._projection.domNode.childNodes[0].outerHTML;\n }\n afterRender(result) {\n let node = result;\n if (typeof result === 'string' || result === null || result === undefined) {\n node = v('span', {}, [result]);\n }\n return node;\n }\n destroy() {\n super.destroy();\n }\n _attach({ type, root }) {\n if (root) {\n this.root = root;\n }\n if (this._attachHandle) {\n return this._attachHandle;\n }\n this.projectorState = ProjectorAttachState.Attached;\n const handle = {\n destroy: () => {\n if (this.projectorState === ProjectorAttachState.Attached) {\n this._projection = undefined;\n this.projectorState = ProjectorAttachState.Detached;\n }\n }\n };\n this.own(handle);\n this._attachHandle = handle;\n this._projectionOptions = Object.assign({}, this._projectionOptions, { sync: !this._async });\n switch (type) {\n case AttachType.Append:\n this._projection = dom.append(this.root, this, this._projectionOptions);\n break;\n case AttachType.Merge:\n this._projection = dom.merge(this.root, this, this._projectionOptions);\n break;\n }\n return this._attachHandle;\n }\n }\n tslib_1.__decorate([\n afterRender(),\n tslib_1.__metadata(\"design:type\", Function),\n tslib_1.__metadata(\"design:paramtypes\", [Object]),\n tslib_1.__metadata(\"design:returntype\", void 0)\n ], Projector.prototype, \"afterRender\", null);\n return Projector;\n}\nexport default ProjectorMixin;\n//# sourceMappingURL=Projector.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/mixins/Projector.mjs\n// module id = ./node_modules/@dojo/widget-core/mixins/Projector.mjs\n// module chunks = menu","import * as tslib_1 from \"tslib\";\nimport { Injector } from './../Injector';\nimport { inject } from './../decorators/inject';\nimport { handleDecorator } from './../decorators/handleDecorator';\nimport { diffProperty } from './../decorators/diffProperty';\nimport { shallow } from './../diff';\nconst THEME_KEY = ' _key';\nexport const INJECTED_THEME_KEY = Symbol('theme');\n/**\n * Decorator for base css classes\n */\nexport function theme(theme) {\n return handleDecorator((target) => {\n target.addDecorator('baseThemeClasses', theme);\n });\n}\n/**\n * Creates a reverse lookup for the classes passed in via the `theme` function.\n *\n * @param classes The baseClasses object\n * @requires\n */\nfunction createThemeClassesLookup(classes) {\n return classes.reduce((currentClassNames, baseClass) => {\n Object.keys(baseClass).forEach((key) => {\n currentClassNames[baseClass[key]] = key;\n });\n return currentClassNames;\n }, {});\n}\n/**\n * Convenience function that is given a theme and an optional registry, the theme\n * injector is defined against the registry, returning the theme.\n *\n * @param theme the theme to set\n * @param themeRegistry registry to define the theme injector against. Defaults\n * to the global registry\n *\n * @returns the theme injector used to set the theme\n */\nexport function registerThemeInjector(theme, themeRegistry) {\n const themeInjector = new Injector(theme);\n themeRegistry.defineInjector(INJECTED_THEME_KEY, (invalidator) => {\n themeInjector.setInvalidator(invalidator);\n return () => themeInjector.get();\n });\n return themeInjector;\n}\n/**\n * Function that returns a class decorated with with Themed functionality\n */\nexport function ThemedMixin(Base) {\n let Themed = class Themed extends Base {\n constructor() {\n super(...arguments);\n /**\n * Registered base theme keys\n */\n this._registeredBaseThemeKeys = [];\n /**\n * Indicates if classes meta data need to be calculated.\n */\n this._recalculateClasses = true;\n /**\n * Loaded theme\n */\n this._theme = {};\n }\n theme(classes) {\n if (this._recalculateClasses) {\n this._recalculateThemeClasses();\n }\n if (Array.isArray(classes)) {\n return classes.map((className) => this._getThemeClass(className));\n }\n return this._getThemeClass(classes);\n }\n /**\n * Function fired when `theme` or `extraClasses` are changed.\n */\n onPropertiesChanged() {\n this._recalculateClasses = true;\n }\n _getThemeClass(className) {\n if (className === undefined || className === null) {\n return className;\n }\n const extraClasses = this.properties.extraClasses || {};\n const themeClassName = this._baseThemeClassesReverseLookup[className];\n let resultClassNames = [];\n if (!themeClassName) {\n console.warn(`Class name: '${className}' not found in theme`);\n return null;\n }\n if (extraClasses[themeClassName]) {\n resultClassNames.push(extraClasses[themeClassName]);\n }\n if (this._theme[themeClassName]) {\n resultClassNames.push(this._theme[themeClassName]);\n }\n else {\n resultClassNames.push(this._registeredBaseTheme[themeClassName]);\n }\n return resultClassNames.join(' ');\n }\n _recalculateThemeClasses() {\n const { theme = {} } = this.properties;\n const baseThemes = this.getDecorator('baseThemeClasses');\n if (!this._registeredBaseTheme) {\n this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => {\n const _a = THEME_KEY, key = baseTheme[_a], classes = tslib_1.__rest(baseTheme, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n this._registeredBaseThemeKeys.push(key);\n return Object.assign({}, finalBaseTheme, classes);\n }, {});\n this._baseThemeClassesReverseLookup = createThemeClassesLookup(baseThemes);\n }\n this._theme = this._registeredBaseThemeKeys.reduce((baseTheme, themeKey) => {\n return Object.assign({}, baseTheme, theme[themeKey]);\n }, {});\n this._recalculateClasses = false;\n }\n };\n tslib_1.__decorate([\n diffProperty('theme', shallow),\n diffProperty('extraClasses', shallow),\n tslib_1.__metadata(\"design:type\", Function),\n tslib_1.__metadata(\"design:paramtypes\", []),\n tslib_1.__metadata(\"design:returntype\", void 0)\n ], Themed.prototype, \"onPropertiesChanged\", null);\n Themed = tslib_1.__decorate([\n inject({\n name: INJECTED_THEME_KEY,\n getProperties: (theme, properties) => {\n if (!properties.theme) {\n return { theme };\n }\n return {};\n }\n })\n ], Themed);\n return Themed;\n}\nexport default ThemedMixin;\n//# sourceMappingURL=Themed.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/mixins/Themed.mjs\n// module id = ./node_modules/@dojo/widget-core/mixins/Themed.mjs\n// module chunks = menu","import * as tslib_1 from \"tslib\";\nimport { WidgetBase, noBind } from './WidgetBase';\nimport { ProjectorMixin } from './mixins/Projector';\nimport { from } from '@dojo/shim/array';\nimport { w, dom } from './d';\nimport global from '@dojo/shim/global';\nimport { registerThemeInjector } from './mixins/Themed';\nimport { alwaysRender } from './decorators/alwaysRender';\nexport var CustomElementChildType;\n(function (CustomElementChildType) {\n CustomElementChildType[\"DOJO\"] = \"DOJO\";\n CustomElementChildType[\"NODE\"] = \"NODE\";\n CustomElementChildType[\"TEXT\"] = \"TEXT\";\n})(CustomElementChildType || (CustomElementChildType = {}));\nexport function DomToWidgetWrapper(domNode) {\n let DomToWidgetWrapper = class DomToWidgetWrapper extends WidgetBase {\n render() {\n const properties = Object.keys(this.properties).reduce((props, key) => {\n const value = this.properties[key];\n if (key.indexOf('on') === 0) {\n key = `__${key}`;\n }\n props[key] = value;\n return props;\n }, {});\n return dom({ node: domNode, props: properties, diffType: 'dom' });\n }\n static get domNode() {\n return domNode;\n }\n };\n DomToWidgetWrapper = tslib_1.__decorate([\n alwaysRender()\n ], DomToWidgetWrapper);\n return DomToWidgetWrapper;\n}\nexport function create(descriptor, WidgetConstructor) {\n const { attributes, childType, registryFactory } = descriptor;\n const attributeMap = {};\n attributes.forEach((propertyName) => {\n const attributeName = propertyName.toLowerCase();\n attributeMap[attributeName] = propertyName;\n });\n return class extends HTMLElement {\n constructor() {\n super(...arguments);\n this._properties = {};\n this._children = [];\n this._eventProperties = {};\n this._initialised = false;\n }\n connectedCallback() {\n if (this._initialised) {\n return;\n }\n const domProperties = {};\n const { attributes, properties, events } = descriptor;\n this._properties = Object.assign({}, this._properties, this._attributesToProperties(attributes));\n [...attributes, ...properties].forEach((propertyName) => {\n const value = this[propertyName];\n const filteredPropertyName = propertyName.replace(/^on/, '__');\n if (value !== undefined) {\n this._properties[propertyName] = value;\n }\n if (filteredPropertyName !== propertyName) {\n domProperties[filteredPropertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n }\n domProperties[propertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n });\n events.forEach((propertyName) => {\n const eventName = propertyName.replace(/^on/, '').toLowerCase();\n const filteredPropertyName = propertyName.replace(/^on/, '__on');\n domProperties[filteredPropertyName] = {\n get: () => this._getEventProperty(propertyName),\n set: (value) => this._setEventProperty(propertyName, value)\n };\n this._eventProperties[propertyName] = undefined;\n this._properties[propertyName] = (...args) => {\n const eventCallback = this._getEventProperty(propertyName);\n if (typeof eventCallback === 'function') {\n eventCallback(...args);\n }\n this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: false,\n detail: args\n }));\n };\n });\n Object.defineProperties(this, domProperties);\n const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children;\n from(children).forEach((childNode) => {\n if (childType === CustomElementChildType.DOJO) {\n childNode.addEventListener('dojo-ce-render', () => this._render());\n childNode.addEventListener('dojo-ce-connected', () => this._render());\n this._children.push(DomToWidgetWrapper(childNode));\n }\n else {\n this._children.push(dom({ node: childNode, diffType: 'dom' }));\n }\n });\n this.addEventListener('dojo-ce-connected', (e) => this._childConnected(e));\n const widgetProperties = this._properties;\n const renderChildren = () => this.__children__();\n const Wrapper = class extends WidgetBase {\n render() {\n return w(WidgetConstructor, widgetProperties, renderChildren());\n }\n };\n const registry = registryFactory();\n const themeContext = registerThemeInjector(this._getTheme(), registry);\n global.addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme()));\n const Projector = ProjectorMixin(Wrapper);\n this._projector = new Projector();\n this._projector.setProperties({ registry });\n this._projector.append(this);\n this._initialised = true;\n this.dispatchEvent(new CustomEvent('dojo-ce-connected', {\n bubbles: true,\n detail: this\n }));\n }\n _getTheme() {\n if (global && global.dojoce && global.dojoce.theme) {\n return global.dojoce.themes[global.dojoce.theme];\n }\n }\n _childConnected(e) {\n const node = e.detail;\n if (node.parentNode === this) {\n const exists = this._children.some((child) => child.domNode === node);\n if (!exists) {\n node.addEventListener('dojo-ce-render', () => this._render());\n this._children.push(DomToWidgetWrapper(node));\n this._render();\n }\n }\n }\n _render() {\n if (this._projector) {\n this._projector.invalidate();\n this.dispatchEvent(new CustomEvent('dojo-ce-render', {\n bubbles: false,\n detail: this\n }));\n }\n }\n __properties__() {\n return Object.assign({}, this._properties, this._eventProperties);\n }\n __children__() {\n if (childType === CustomElementChildType.DOJO) {\n return this._children.filter((Child) => Child.domNode.isWidget).map((Child) => {\n const { domNode } = Child;\n return w(Child, Object.assign({}, domNode.__properties__()), [...domNode.__children__()]);\n });\n }\n else {\n return this._children;\n }\n }\n attributeChangedCallback(name, oldValue, value) {\n const propertyName = attributeMap[name];\n this._setProperty(propertyName, value);\n }\n _setEventProperty(propertyName, value) {\n this._eventProperties[propertyName] = value;\n }\n _getEventProperty(propertyName) {\n return this._eventProperties[propertyName];\n }\n _setProperty(propertyName, value) {\n if (typeof value === 'function') {\n value[noBind] = true;\n }\n this._properties[propertyName] = value;\n this._render();\n }\n _getProperty(propertyName) {\n return this._properties[propertyName];\n }\n _attributesToProperties(attributes) {\n return attributes.reduce((properties, propertyName) => {\n const attributeName = propertyName.toLowerCase();\n const value = this.getAttribute(attributeName);\n if (value !== null) {\n properties[propertyName] = value;\n }\n return properties;\n }, {});\n }\n static get observedAttributes() {\n return Object.keys(attributeMap);\n }\n get isWidget() {\n return true;\n }\n };\n}\nexport function register(WidgetConstructor) {\n const descriptor = WidgetConstructor.prototype && WidgetConstructor.prototype.__customElementDescriptor;\n if (!descriptor) {\n throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?');\n }\n global.customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor));\n}\nexport default register;\n//# sourceMappingURL=registerCustomElement.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/registerCustomElement.mjs\n// module id = ./node_modules/@dojo/widget-core/registerCustomElement.mjs\n// module chunks = menu","import global from '@dojo/shim/global';\r\nimport { from as arrayFrom } from '@dojo/shim/array';\r\nimport { isWNode, isVNode, isDomVNode, VNODE, WNODE } from './d';\r\nimport { isWidgetBaseConstructor } from './Registry';\r\nimport WeakMap from '@dojo/shim/WeakMap';\r\nconst NAMESPACE_W3 = 'http://www.w3.org/';\r\nconst NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg';\r\nconst NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink';\r\nconst emptyArray = [];\r\nexport const widgetInstanceMap = new WeakMap();\r\nconst instanceMap = new WeakMap();\r\nconst projectorStateMap = new WeakMap();\r\nfunction same(dnode1, dnode2) {\r\n if (isVNode(dnode1) && isVNode(dnode2)) {\r\n if (isDomVNode(dnode1) || isDomVNode(dnode2)) {\r\n if (dnode1.domNode !== dnode2.domNode) {\r\n return false;\r\n }\r\n }\r\n if (dnode1.tag !== dnode2.tag) {\r\n return false;\r\n }\r\n if (dnode1.properties.key !== dnode2.properties.key) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n else if (isWNode(dnode1) && isWNode(dnode2)) {\r\n if (dnode1.instance === undefined && typeof dnode2.widgetConstructor === 'string') {\r\n return false;\r\n }\r\n if (dnode1.widgetConstructor !== dnode2.widgetConstructor) {\r\n return false;\r\n }\r\n if (dnode1.properties.key !== dnode2.properties.key) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n return false;\r\n}\r\nconst missingTransition = function () {\r\n throw new Error('Provide a transitions object to the projectionOptions to do animations');\r\n};\r\nfunction getProjectionOptions(projectorOptions, projectorInstance) {\r\n const defaults = {\r\n namespace: undefined,\r\n styleApplyer: function (domNode, styleName, value) {\r\n domNode.style[styleName] = value;\r\n },\r\n transitions: {\r\n enter: missingTransition,\r\n exit: missingTransition\r\n },\r\n depth: 0,\r\n merge: false,\r\n sync: false,\r\n projectorInstance\r\n };\r\n return Object.assign({}, defaults, projectorOptions);\r\n}\r\nfunction checkStyleValue(styleValue) {\r\n if (typeof styleValue !== 'string') {\r\n throw new Error('Style values must be strings');\r\n }\r\n}\r\nfunction updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n const eventMap = projectorState.nodeMap.get(domNode) || new WeakMap();\r\n if (previousValue) {\r\n const previousEvent = eventMap.get(previousValue);\r\n domNode.removeEventListener(eventName, previousEvent);\r\n }\r\n let callback = currentValue.bind(bind);\r\n if (eventName === 'input') {\r\n callback = function (evt) {\r\n currentValue.call(this, evt);\r\n evt.target['oninput-value'] = evt.target.value;\r\n }.bind(bind);\r\n }\r\n domNode.addEventListener(eventName, callback);\r\n eventMap.set(currentValue, callback);\r\n projectorState.nodeMap.set(domNode, eventMap);\r\n}\r\nfunction addClasses(domNode, classes) {\r\n if (classes) {\r\n const classNames = classes.split(' ');\r\n for (let i = 0; i < classNames.length; i++) {\r\n domNode.classList.add(classNames[i]);\r\n }\r\n }\r\n}\r\nfunction removeClasses(domNode, classes) {\r\n if (classes) {\r\n const classNames = classes.split(' ');\r\n for (let i = 0; i < classNames.length; i++) {\r\n domNode.classList.remove(classNames[i]);\r\n }\r\n }\r\n}\r\nfunction buildPreviousProperties(domNode, previous, current) {\r\n const { diffType, properties, attributes } = current;\r\n if (!diffType || diffType === 'vdom') {\r\n return { properties: previous.properties, attributes: previous.attributes, events: previous.events };\r\n }\r\n else if (diffType === 'none') {\r\n return { properties: {}, attributes: previous.attributes ? {} : undefined, events: previous.events };\r\n }\r\n let newProperties = {\r\n properties: {}\r\n };\r\n if (attributes) {\r\n newProperties.attributes = {};\r\n newProperties.events = previous.events;\r\n Object.keys(properties).forEach((propName) => {\r\n newProperties.properties[propName] = domNode[propName];\r\n });\r\n Object.keys(attributes).forEach((attrName) => {\r\n newProperties.attributes[attrName] = domNode.getAttribute(attrName);\r\n });\r\n return newProperties;\r\n }\r\n newProperties.properties = Object.keys(properties).reduce((props, property) => {\r\n props[property] = domNode.getAttribute(property) || domNode[property];\r\n return props;\r\n }, {});\r\n return newProperties;\r\n}\r\nfunction focusNode(propValue, previousValue, domNode, projectionOptions) {\r\n let result;\r\n if (typeof propValue === 'function') {\r\n result = propValue();\r\n }\r\n else {\r\n result = propValue && !previousValue;\r\n }\r\n if (result === true) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectorState.deferredRenderCallbacks.push(() => {\r\n domNode.focus();\r\n });\r\n }\r\n}\r\nfunction removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions, onlyEvents = false) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n const eventMap = projectorState.nodeMap.get(domNode);\r\n if (eventMap) {\r\n Object.keys(previousProperties).forEach((propName) => {\r\n const isEvent = propName.substr(0, 2) === 'on' || onlyEvents;\r\n const eventName = onlyEvents ? propName : propName.substr(2);\r\n if (isEvent && !properties[propName]) {\r\n const eventCallback = eventMap.get(previousProperties[propName]);\r\n if (eventCallback) {\r\n domNode.removeEventListener(eventName, eventCallback);\r\n }\r\n }\r\n });\r\n }\r\n}\r\nfunction updateAttribute(domNode, attrName, attrValue, projectionOptions) {\r\n if (projectionOptions.namespace === NAMESPACE_SVG && attrName === 'href') {\r\n domNode.setAttributeNS(NAMESPACE_XLINK, attrName, attrValue);\r\n }\r\n else if ((attrName === 'role' && attrValue === '') || attrValue === undefined) {\r\n domNode.removeAttribute(attrName);\r\n }\r\n else {\r\n domNode.setAttribute(attrName, attrValue);\r\n }\r\n}\r\nfunction updateAttributes(domNode, previousAttributes, attributes, projectionOptions) {\r\n const attrNames = Object.keys(attributes);\r\n const attrCount = attrNames.length;\r\n for (let i = 0; i < attrCount; i++) {\r\n const attrName = attrNames[i];\r\n const attrValue = attributes[attrName];\r\n const previousAttrValue = previousAttributes[attrName];\r\n if (attrValue !== previousAttrValue) {\r\n updateAttribute(domNode, attrName, attrValue, projectionOptions);\r\n }\r\n }\r\n}\r\nfunction updateProperties(domNode, previousProperties, properties, projectionOptions, includesEventsAndAttributes = true) {\r\n let propertiesUpdated = false;\r\n const propNames = Object.keys(properties);\r\n const propCount = propNames.length;\r\n if (propNames.indexOf('classes') === -1 && previousProperties.classes) {\r\n if (Array.isArray(previousProperties.classes)) {\r\n for (let i = 0; i < previousProperties.classes.length; i++) {\r\n removeClasses(domNode, previousProperties.classes[i]);\r\n }\r\n }\r\n else {\r\n removeClasses(domNode, previousProperties.classes);\r\n }\r\n }\r\n includesEventsAndAttributes && removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions);\r\n for (let i = 0; i < propCount; i++) {\r\n const propName = propNames[i];\r\n let propValue = properties[propName];\r\n const previousValue = previousProperties[propName];\r\n if (propName === 'classes') {\r\n const previousClasses = Array.isArray(previousValue) ? previousValue : [previousValue];\r\n const currentClasses = Array.isArray(propValue) ? propValue : [propValue];\r\n if (previousClasses && previousClasses.length > 0) {\r\n if (!propValue || propValue.length === 0) {\r\n for (let i = 0; i < previousClasses.length; i++) {\r\n removeClasses(domNode, previousClasses[i]);\r\n }\r\n }\r\n else {\r\n const newClasses = [...currentClasses];\r\n for (let i = 0; i < previousClasses.length; i++) {\r\n const previousClassName = previousClasses[i];\r\n if (previousClassName) {\r\n const classIndex = newClasses.indexOf(previousClassName);\r\n if (classIndex === -1) {\r\n removeClasses(domNode, previousClassName);\r\n }\r\n else {\r\n newClasses.splice(classIndex, 1);\r\n }\r\n }\r\n }\r\n for (let i = 0; i < newClasses.length; i++) {\r\n addClasses(domNode, newClasses[i]);\r\n }\r\n }\r\n }\r\n else {\r\n for (let i = 0; i < currentClasses.length; i++) {\r\n addClasses(domNode, currentClasses[i]);\r\n }\r\n }\r\n }\r\n else if (propName === 'focus') {\r\n focusNode(propValue, previousValue, domNode, projectionOptions);\r\n }\r\n else if (propName === 'styles') {\r\n const styleNames = Object.keys(propValue);\r\n const styleCount = styleNames.length;\r\n for (let j = 0; j < styleCount; j++) {\r\n const styleName = styleNames[j];\r\n const newStyleValue = propValue[styleName];\r\n const oldStyleValue = previousValue && previousValue[styleName];\r\n if (newStyleValue === oldStyleValue) {\r\n continue;\r\n }\r\n propertiesUpdated = true;\r\n if (newStyleValue) {\r\n checkStyleValue(newStyleValue);\r\n projectionOptions.styleApplyer(domNode, styleName, newStyleValue);\r\n }\r\n else {\r\n projectionOptions.styleApplyer(domNode, styleName, '');\r\n }\r\n }\r\n }\r\n else {\r\n if (!propValue && typeof previousValue === 'string') {\r\n propValue = '';\r\n }\r\n if (propName === 'value') {\r\n const domValue = domNode[propName];\r\n if (domValue !== propValue &&\r\n (domNode['oninput-value']\r\n ? domValue === domNode['oninput-value']\r\n : propValue !== previousValue)) {\r\n domNode[propName] = propValue;\r\n domNode['oninput-value'] = undefined;\r\n }\r\n if (propValue !== previousValue) {\r\n propertiesUpdated = true;\r\n }\r\n }\r\n else if (propName !== 'key' && propValue !== previousValue) {\r\n const type = typeof propValue;\r\n if (type === 'function' && propName.lastIndexOf('on', 0) === 0 && includesEventsAndAttributes) {\r\n updateEvent(domNode, propName.substr(2), propValue, projectionOptions, properties.bind, previousValue);\r\n }\r\n else if (type === 'string' && propName !== 'innerHTML' && includesEventsAndAttributes) {\r\n updateAttribute(domNode, propName, propValue, projectionOptions);\r\n }\r\n else if (propName === 'scrollLeft' || propName === 'scrollTop') {\r\n if (domNode[propName] !== propValue) {\r\n domNode[propName] = propValue;\r\n }\r\n }\r\n else {\r\n domNode[propName] = propValue;\r\n }\r\n propertiesUpdated = true;\r\n }\r\n }\r\n }\r\n return propertiesUpdated;\r\n}\r\nfunction findIndexOfChild(children, sameAs, start) {\r\n for (let i = start; i < children.length; i++) {\r\n if (same(children[i], sameAs)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\nexport function toParentVNode(domNode) {\r\n return {\r\n tag: '',\r\n properties: {},\r\n children: undefined,\r\n domNode,\r\n type: VNODE\r\n };\r\n}\r\nexport function toTextVNode(data) {\r\n return {\r\n tag: '',\r\n properties: {},\r\n children: undefined,\r\n text: `${data}`,\r\n domNode: undefined,\r\n type: VNODE\r\n };\r\n}\r\nfunction toInternalWNode(instance, instanceData) {\r\n return {\r\n instance,\r\n rendered: [],\r\n coreProperties: instanceData.coreProperties,\r\n children: instance.children,\r\n widgetConstructor: instance.constructor,\r\n properties: instanceData.inputProperties,\r\n type: WNODE\r\n };\r\n}\r\nexport function filterAndDecorateChildren(children, instance) {\r\n if (children === undefined) {\r\n return emptyArray;\r\n }\r\n children = Array.isArray(children) ? children : [children];\r\n for (let i = 0; i < children.length;) {\r\n const child = children[i];\r\n if (child === undefined || child === null) {\r\n children.splice(i, 1);\r\n continue;\r\n }\r\n else if (typeof child === 'string') {\r\n children[i] = toTextVNode(child);\r\n }\r\n else {\r\n if (isVNode(child)) {\r\n if (child.properties.bind === undefined) {\r\n child.properties.bind = instance;\r\n if (child.children && child.children.length > 0) {\r\n filterAndDecorateChildren(child.children, instance);\r\n }\r\n }\r\n }\r\n else {\r\n if (!child.coreProperties) {\r\n const instanceData = widgetInstanceMap.get(instance);\r\n child.coreProperties = {\r\n bind: instance,\r\n baseRegistry: instanceData.coreProperties.baseRegistry\r\n };\r\n }\r\n if (child.children && child.children.length > 0) {\r\n filterAndDecorateChildren(child.children, instance);\r\n }\r\n }\r\n }\r\n i++;\r\n }\r\n return children;\r\n}\r\nfunction nodeAdded(dnode, transitions) {\r\n if (isVNode(dnode) && dnode.properties) {\r\n const enterAnimation = dnode.properties.enterAnimation;\r\n if (enterAnimation) {\r\n if (typeof enterAnimation === 'function') {\r\n enterAnimation(dnode.domNode, dnode.properties);\r\n }\r\n else {\r\n transitions.enter(dnode.domNode, dnode.properties, enterAnimation);\r\n }\r\n }\r\n }\r\n}\r\nfunction nodeToRemove(dnode, transitions, projectionOptions) {\r\n if (isWNode(dnode)) {\r\n const rendered = dnode.rendered || emptyArray;\r\n if (dnode.instance) {\r\n const instanceData = widgetInstanceMap.get(dnode.instance);\r\n instanceData.onDetach();\r\n instanceMap.delete(dnode.instance);\r\n }\r\n for (let i = 0; i < rendered.length; i++) {\r\n nodeToRemove(rendered[i], transitions, projectionOptions);\r\n }\r\n }\r\n else {\r\n const domNode = dnode.domNode;\r\n const properties = dnode.properties;\r\n if (dnode.children && dnode.children.length > 0) {\r\n for (let i = 0; i < dnode.children.length; i++) {\r\n nodeToRemove(dnode.children[i], transitions, projectionOptions);\r\n }\r\n }\r\n const exitAnimation = properties.exitAnimation;\r\n if (properties && exitAnimation) {\r\n domNode.style.pointerEvents = 'none';\r\n const removeDomNode = function () {\r\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\r\n dnode.domNode = undefined;\r\n };\r\n if (typeof exitAnimation === 'function') {\r\n exitAnimation(domNode, removeDomNode, properties);\r\n return;\r\n }\r\n else {\r\n transitions.exit(dnode.domNode, properties, exitAnimation, removeDomNode);\r\n return;\r\n }\r\n }\r\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\r\n dnode.domNode = undefined;\r\n }\r\n}\r\nfunction checkDistinguishable(childNodes, indexToCheck, parentInstance) {\r\n const childNode = childNodes[indexToCheck];\r\n if (isVNode(childNode) && !childNode.tag) {\r\n return; // Text nodes need not be distinguishable\r\n }\r\n const { key } = childNode.properties;\r\n if (key === undefined || key === null) {\r\n for (let i = 0; i < childNodes.length; i++) {\r\n if (i !== indexToCheck) {\r\n const node = childNodes[i];\r\n if (same(node, childNode)) {\r\n let nodeIdentifier;\r\n const parentName = parentInstance.constructor.name || 'unknown';\r\n if (isWNode(childNode)) {\r\n nodeIdentifier = childNode.widgetConstructor.name || 'unknown';\r\n }\r\n else {\r\n nodeIdentifier = childNode.tag;\r\n }\r\n console.warn(`A widget (${parentName}) has had a child addded or removed, but they were not able to uniquely identified. It is recommended to provide a unique 'key' property when using the same widget or element (${nodeIdentifier}) multiple times as siblings`);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\nfunction updateChildren(parentVNode, oldChildren, newChildren, parentInstance, projectionOptions) {\r\n oldChildren = oldChildren || emptyArray;\r\n newChildren = newChildren;\r\n const oldChildrenLength = oldChildren.length;\r\n const newChildrenLength = newChildren.length;\r\n const transitions = projectionOptions.transitions;\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\r\n let oldIndex = 0;\r\n let newIndex = 0;\r\n let i;\r\n let textUpdated = false;\r\n while (newIndex < newChildrenLength) {\r\n let oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : undefined;\r\n const newChild = newChildren[newIndex];\r\n if (isVNode(newChild) && typeof newChild.deferredPropertiesCallback === 'function') {\r\n newChild.inserted = isVNode(oldChild) && oldChild.inserted;\r\n addDeferredProperties(newChild, projectionOptions);\r\n }\r\n if (oldChild !== undefined && same(oldChild, newChild)) {\r\n textUpdated = updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance) || textUpdated;\r\n oldIndex++;\r\n newIndex++;\r\n continue;\r\n }\r\n const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);\r\n const addChild = () => {\r\n let insertBeforeDomNode = undefined;\r\n let child = oldChildren[oldIndex];\r\n if (child) {\r\n let nextIndex = oldIndex + 1;\r\n let insertBeforeChildren = [child];\r\n while (insertBeforeChildren.length) {\r\n const insertBefore = insertBeforeChildren.shift();\r\n if (isWNode(insertBefore)) {\r\n if (insertBefore.rendered) {\r\n insertBeforeChildren.push(...insertBefore.rendered);\r\n }\r\n }\r\n else {\r\n if (insertBefore.domNode) {\r\n insertBeforeDomNode = insertBefore.domNode;\r\n break;\r\n }\r\n }\r\n if (insertBeforeChildren.length === 0 && oldChildren[nextIndex]) {\r\n insertBeforeChildren.push(oldChildren[nextIndex]);\r\n nextIndex++;\r\n }\r\n }\r\n }\r\n createDom(newChild, parentVNode, insertBeforeDomNode, projectionOptions, parentInstance);\r\n nodeAdded(newChild, transitions);\r\n const indexToCheck = newIndex;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(newChildren, indexToCheck, parentInstance);\r\n });\r\n };\r\n if (!oldChild || findOldIndex === -1) {\r\n addChild();\r\n newIndex++;\r\n continue;\r\n }\r\n const removeChild = () => {\r\n const indexToCheck = oldIndex;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\r\n });\r\n if (isWNode(oldChild)) {\r\n const item = instanceMap.get(oldChild.instance);\r\n if (item) {\r\n oldChild = item.dnode;\r\n }\r\n }\r\n nodeToRemove(oldChild, transitions, projectionOptions);\r\n };\r\n const findNewIndex = findIndexOfChild(newChildren, oldChild, newIndex + 1);\r\n if (findNewIndex === -1) {\r\n removeChild();\r\n oldIndex++;\r\n continue;\r\n }\r\n addChild();\r\n removeChild();\r\n oldIndex++;\r\n newIndex++;\r\n }\r\n if (oldChildrenLength > oldIndex) {\r\n // Remove child fragments\r\n for (i = oldIndex; i < oldChildrenLength; i++) {\r\n const indexToCheck = i;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\r\n });\r\n let childToRemove = oldChildren[i];\r\n if (isWNode(childToRemove)) {\r\n const item = instanceMap.get(childToRemove.instance);\r\n if (item) {\r\n childToRemove = item.dnode;\r\n }\r\n }\r\n nodeToRemove(childToRemove, transitions, projectionOptions);\r\n }\r\n }\r\n return textUpdated;\r\n}\r\nfunction addChildren(parentVNode, children, projectionOptions, parentInstance, insertBefore = undefined, childNodes) {\r\n if (children === undefined) {\r\n return;\r\n }\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectorState.merge && childNodes === undefined) {\r\n childNodes = arrayFrom(parentVNode.domNode.childNodes);\r\n }\r\n const transitions = projectionOptions.transitions;\r\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n if (isVNode(child)) {\r\n if (projectorState.merge && childNodes) {\r\n let domElement = undefined;\r\n while (child.domNode === undefined && childNodes.length > 0) {\r\n domElement = childNodes.shift();\r\n if (domElement && domElement.tagName === (child.tag.toUpperCase() || undefined)) {\r\n child.domNode = domElement;\r\n }\r\n }\r\n }\r\n createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance);\r\n }\r\n else {\r\n createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes);\r\n }\r\n nodeAdded(child, transitions);\r\n }\r\n}\r\nfunction initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions) {\r\n addChildren(dnode, dnode.children, projectionOptions, parentInstance, undefined);\r\n if (typeof dnode.deferredPropertiesCallback === 'function' && dnode.inserted === undefined) {\r\n addDeferredProperties(dnode, projectionOptions);\r\n }\r\n if (dnode.attributes && dnode.events) {\r\n updateAttributes(domNode, {}, dnode.attributes, projectionOptions);\r\n updateProperties(domNode, {}, dnode.properties, projectionOptions, false);\r\n removeOrphanedEvents(domNode, {}, dnode.events, projectionOptions, true);\r\n const events = dnode.events;\r\n Object.keys(events).forEach((event) => {\r\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind);\r\n });\r\n }\r\n else {\r\n updateProperties(domNode, {}, dnode.properties, projectionOptions);\r\n }\r\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\r\n const instanceData = widgetInstanceMap.get(parentInstance);\r\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\r\n }\r\n dnode.inserted = true;\r\n}\r\nfunction createDom(dnode, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes) {\r\n let domNode;\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (isWNode(dnode)) {\r\n let { widgetConstructor } = dnode;\r\n const parentInstanceData = widgetInstanceMap.get(parentInstance);\r\n if (!isWidgetBaseConstructor(widgetConstructor)) {\r\n const item = parentInstanceData.registry().get(widgetConstructor);\r\n if (item === null) {\r\n return;\r\n }\r\n widgetConstructor = item;\r\n }\r\n const instance = new widgetConstructor();\r\n dnode.instance = instance;\r\n const instanceData = widgetInstanceMap.get(instance);\r\n instanceData.invalidate = () => {\r\n instanceData.dirty = true;\r\n if (instanceData.rendering === false) {\r\n projectorState.renderQueue.push({ instance, depth: projectionOptions.depth });\r\n scheduleRender(projectionOptions);\r\n }\r\n };\r\n instanceData.rendering = true;\r\n instance.__setCoreProperties__(dnode.coreProperties);\r\n instance.__setChildren__(dnode.children);\r\n instance.__setProperties__(dnode.properties);\r\n const rendered = instance.__render__();\r\n instanceData.rendering = false;\r\n if (rendered) {\r\n const filteredRendered = filterAndDecorateChildren(rendered, instance);\r\n dnode.rendered = filteredRendered;\r\n addChildren(parentVNode, filteredRendered, projectionOptions, instance, insertBefore, childNodes);\r\n }\r\n instanceMap.set(instance, { dnode, parentVNode });\r\n instanceData.nodeHandler.addRoot();\r\n projectorState.afterRenderCallbacks.push(() => {\r\n instanceData.onAttach();\r\n });\r\n }\r\n else {\r\n if (projectorState.merge && projectorState.mergeElement !== undefined) {\r\n domNode = dnode.domNode = projectionOptions.mergeElement;\r\n projectorState.mergeElement = undefined;\r\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\r\n return;\r\n }\r\n const doc = parentVNode.domNode.ownerDocument;\r\n if (!dnode.tag && typeof dnode.text === 'string') {\r\n if (dnode.domNode !== undefined && parentVNode.domNode) {\r\n const newDomNode = dnode.domNode.ownerDocument.createTextNode(dnode.text);\r\n if (parentVNode.domNode === dnode.domNode.parentNode) {\r\n parentVNode.domNode.replaceChild(newDomNode, dnode.domNode);\r\n }\r\n else {\r\n parentVNode.domNode.appendChild(newDomNode);\r\n dnode.domNode.parentNode && dnode.domNode.parentNode.removeChild(dnode.domNode);\r\n }\r\n dnode.domNode = newDomNode;\r\n }\r\n else {\r\n domNode = dnode.domNode = doc.createTextNode(dnode.text);\r\n if (insertBefore !== undefined) {\r\n parentVNode.domNode.insertBefore(domNode, insertBefore);\r\n }\r\n else {\r\n parentVNode.domNode.appendChild(domNode);\r\n }\r\n }\r\n }\r\n else {\r\n if (dnode.domNode === undefined) {\r\n if (dnode.tag === 'svg') {\r\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\r\n }\r\n if (projectionOptions.namespace !== undefined) {\r\n domNode = dnode.domNode = doc.createElementNS(projectionOptions.namespace, dnode.tag);\r\n }\r\n else {\r\n domNode = dnode.domNode = dnode.domNode || doc.createElement(dnode.tag);\r\n }\r\n }\r\n else {\r\n domNode = dnode.domNode;\r\n }\r\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\r\n if (insertBefore !== undefined) {\r\n parentVNode.domNode.insertBefore(domNode, insertBefore);\r\n }\r\n else if (domNode.parentNode !== parentVNode.domNode) {\r\n parentVNode.domNode.appendChild(domNode);\r\n }\r\n }\r\n }\r\n}\r\nfunction updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance) {\r\n if (isWNode(dnode)) {\r\n const { instance } = previous;\r\n const { parentVNode, dnode: node } = instanceMap.get(instance);\r\n const previousRendered = node ? node.rendered : previous.rendered;\r\n const instanceData = widgetInstanceMap.get(instance);\r\n instanceData.rendering = true;\r\n instance.__setCoreProperties__(dnode.coreProperties);\r\n instance.__setChildren__(dnode.children);\r\n instance.__setProperties__(dnode.properties);\r\n dnode.instance = instance;\r\n if (instanceData.dirty === true) {\r\n const rendered = instance.__render__();\r\n instanceData.rendering = false;\r\n dnode.rendered = filterAndDecorateChildren(rendered, instance);\r\n updateChildren(parentVNode, previousRendered, dnode.rendered, instance, projectionOptions);\r\n }\r\n else {\r\n instanceData.rendering = false;\r\n dnode.rendered = previousRendered;\r\n }\r\n instanceMap.set(instance, { dnode, parentVNode });\r\n instanceData.nodeHandler.addRoot();\r\n }\r\n else {\r\n if (previous === dnode) {\r\n return false;\r\n }\r\n const domNode = (dnode.domNode = previous.domNode);\r\n let textUpdated = false;\r\n let updated = false;\r\n if (!dnode.tag && typeof dnode.text === 'string') {\r\n if (dnode.text !== previous.text) {\r\n const newDomNode = domNode.ownerDocument.createTextNode(dnode.text);\r\n domNode.parentNode.replaceChild(newDomNode, domNode);\r\n dnode.domNode = newDomNode;\r\n textUpdated = true;\r\n return textUpdated;\r\n }\r\n }\r\n else {\r\n if (dnode.tag && dnode.tag.lastIndexOf('svg', 0) === 0) {\r\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\r\n }\r\n if (previous.children !== dnode.children) {\r\n const children = filterAndDecorateChildren(dnode.children, parentInstance);\r\n dnode.children = children;\r\n updated =\r\n updateChildren(dnode, previous.children, children, parentInstance, projectionOptions) || updated;\r\n }\r\n const previousProperties = buildPreviousProperties(domNode, previous, dnode);\r\n if (dnode.attributes && dnode.events) {\r\n updateAttributes(domNode, previousProperties.attributes, dnode.attributes, projectionOptions);\r\n updated =\r\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions, false) || updated;\r\n removeOrphanedEvents(domNode, previousProperties.events, dnode.events, projectionOptions, true);\r\n const events = dnode.events;\r\n Object.keys(events).forEach((event) => {\r\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind, previousProperties.events[event]);\r\n });\r\n }\r\n else {\r\n updated =\r\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions) ||\r\n updated;\r\n }\r\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\r\n const instanceData = widgetInstanceMap.get(parentInstance);\r\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\r\n }\r\n }\r\n if (updated && dnode.properties && dnode.properties.updateAnimation) {\r\n dnode.properties.updateAnimation(domNode, dnode.properties, previous.properties);\r\n }\r\n }\r\n}\r\nfunction addDeferredProperties(vnode, projectionOptions) {\r\n // transfer any properties that have been passed - as these must be decorated properties\r\n vnode.decoratedDeferredProperties = vnode.properties;\r\n const properties = vnode.deferredPropertiesCallback(!!vnode.inserted);\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n vnode.properties = Object.assign({}, properties, vnode.decoratedDeferredProperties);\r\n projectorState.deferredRenderCallbacks.push(() => {\r\n const properties = Object.assign({}, vnode.deferredPropertiesCallback(!!vnode.inserted), vnode.decoratedDeferredProperties);\r\n updateProperties(vnode.domNode, vnode.properties, properties, projectionOptions);\r\n vnode.properties = properties;\r\n });\r\n}\r\nfunction runDeferredRenderCallbacks(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectorState.deferredRenderCallbacks.length) {\r\n if (projectionOptions.sync) {\r\n while (projectorState.deferredRenderCallbacks.length) {\r\n const callback = projectorState.deferredRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n }\r\n else {\r\n global.requestAnimationFrame(() => {\r\n while (projectorState.deferredRenderCallbacks.length) {\r\n const callback = projectorState.deferredRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n }\r\n}\r\nfunction runAfterRenderCallbacks(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectionOptions.sync) {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n }\r\n else {\r\n if (global.requestIdleCallback) {\r\n global.requestIdleCallback(() => {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n else {\r\n setTimeout(() => {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n }\r\n}\r\nfunction scheduleRender(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectionOptions.sync) {\r\n render(projectionOptions);\r\n }\r\n else if (projectorState.renderScheduled === undefined) {\r\n projectorState.renderScheduled = global.requestAnimationFrame(() => {\r\n render(projectionOptions);\r\n });\r\n }\r\n}\r\nfunction render(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectorState.renderScheduled = undefined;\r\n const renderQueue = projectorState.renderQueue;\r\n const renders = [...renderQueue];\r\n projectorState.renderQueue = [];\r\n renders.sort((a, b) => a.depth - b.depth);\r\n const previouslyRendered = [];\r\n while (renders.length) {\r\n const { instance } = renders.shift();\r\n if (instanceMap.has(instance) && previouslyRendered.indexOf(instance) === -1) {\r\n previouslyRendered.push(instance);\r\n const { parentVNode, dnode } = instanceMap.get(instance);\r\n const instanceData = widgetInstanceMap.get(instance);\r\n updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance);\r\n }\r\n }\r\n runAfterRenderCallbacks(projectionOptions);\r\n runDeferredRenderCallbacks(projectionOptions);\r\n}\r\nexport const dom = {\r\n append: function (parentNode, instance, projectionOptions = {}) {\r\n const instanceData = widgetInstanceMap.get(instance);\r\n const finalProjectorOptions = getProjectionOptions(projectionOptions, instance);\r\n const projectorState = {\r\n afterRenderCallbacks: [],\r\n deferredRenderCallbacks: [],\r\n nodeMap: new WeakMap(),\r\n renderScheduled: undefined,\r\n renderQueue: [],\r\n merge: projectionOptions.merge || false,\r\n mergeElement: projectionOptions.mergeElement\r\n };\r\n projectorStateMap.set(instance, projectorState);\r\n finalProjectorOptions.rootNode = parentNode;\r\n const parentVNode = toParentVNode(finalProjectorOptions.rootNode);\r\n const node = toInternalWNode(instance, instanceData);\r\n instanceMap.set(instance, { dnode: node, parentVNode });\r\n instanceData.invalidate = () => {\r\n instanceData.dirty = true;\r\n if (instanceData.rendering === false) {\r\n projectorState.renderQueue.push({ instance, depth: finalProjectorOptions.depth });\r\n scheduleRender(finalProjectorOptions);\r\n }\r\n };\r\n updateDom(node, node, finalProjectorOptions, parentVNode, instance);\r\n projectorState.afterRenderCallbacks.push(() => {\r\n instanceData.onAttach();\r\n });\r\n runDeferredRenderCallbacks(finalProjectorOptions);\r\n runAfterRenderCallbacks(finalProjectorOptions);\r\n return {\r\n domNode: finalProjectorOptions.rootNode\r\n };\r\n },\r\n create: function (instance, projectionOptions) {\r\n return this.append(document.createElement('div'), instance, projectionOptions);\r\n },\r\n merge: function (element, instance, projectionOptions = {}) {\r\n projectionOptions.merge = true;\r\n projectionOptions.mergeElement = element;\r\n const projection = this.append(element.parentNode, instance, projectionOptions);\r\n const projectorState = projectorStateMap.get(instance);\r\n projectorState.merge = false;\r\n return projection;\r\n }\r\n};\r\n//# sourceMappingURL=vdom.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/widget-core/vdom.mjs\n// module id = ./node_modules/@dojo/widget-core/vdom.mjs\n// module chunks = menu","/*** IMPORTS FROM imports-loader ***/\nvar widgetFactory = require(\"src/menu/Menu\");\n\nvar registerCustomElement = require('@dojo/widget-core/registerCustomElement').default;\r\n\r\nvar defaultExport = widgetFactory.default;\r\ndefaultExport && registerCustomElement(defaultExport);\r\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/imports-loader?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js\n// module id = ./node_modules/imports-loader/index.js?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js\n// module chunks = menu","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/process/browser.js\n// module id = ./node_modules/process/browser.js\n// module chunks = menu","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)\r\n t[p[i]] = s[p[i]];\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = y[op[0] & 2 ? \"return\" : op[0] ? \"throw\" : \"next\"]) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [0, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { if (o[n]) i[n] = function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; }; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator];\r\n return m ? m.call(o) : typeof __values === \"function\" ? __values(o) : o[Symbol.iterator]();\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/tslib/tslib.es6.js\n// module id = ./node_modules/tslib/tslib.es6.js\n// module chunks = menu","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\n} catch(e) {\n\t// This works if the window reference is available\n\tif(typeof window === \"object\")\n\t\tg = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = ./node_modules/webpack/buildin/global.js\n// module chunks = menu","import { v } from '@dojo/widget-core/d';\r\nimport { customElement } from '@dojo/widget-core/decorators/customElement';\r\nimport { WidgetProperties, WNode } from '@dojo/widget-core/interfaces';\r\nimport { theme, ThemedMixin } from '@dojo/widget-core/mixins/Themed';\r\nimport { WidgetBase } from '@dojo/widget-core/WidgetBase';\r\nimport { MenuItem, MenuItemProperties } from '../menu-item/MenuItem';\r\n\r\nimport * as css from './menu.m.css';\r\n\r\ninterface MenuProperties extends WidgetProperties {\r\n\tonSelected: (data: any) => void;\r\n}\r\n\r\n@customElement({\r\n\ttag: 'demo-menu',\r\n\tevents: ['onSelected']\r\n})\r\n@theme(css)\r\nexport class Menu extends ThemedMixin(WidgetBase)> {\r\n\tprivate _selectedId: number;\r\n\r\n\tprivate _onSelected(id: number, data: any) {\r\n\t\tthis._selectedId = id;\r\n\t\tthis.properties.onSelected(data);\r\n\t\tthis.invalidate();\r\n\t}\r\n\r\n\tprotected render() {\r\n\t\tconst items = this.children.map((child, index) => {\r\n\t\t\tif (child) {\r\n\t\t\t\tconst properties: Partial = {\r\n\t\t\t\t\tonSelected: (data: any) => {\r\n\t\t\t\t\t\tthis._onSelected(index, data);\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\tif (this._selectedId !== undefined) {\r\n\t\t\t\t\tproperties.selected = index === this._selectedId;\r\n\t\t\t\t}\r\n\t\t\t\tchild.properties = { ...child.properties, ...properties };\r\n\t\t\t}\r\n\t\t\treturn child;\r\n\t\t});\r\n\r\n\t\treturn v('nav', { classes: this.theme(css.root) }, [\r\n\t\t\tv(\r\n\t\t\t\t'ol',\r\n\t\t\t\t{\r\n\t\t\t\t\tclasses: this.theme(css.menuContainer)\r\n\t\t\t\t},\r\n\t\t\t\titems\r\n\t\t\t)\r\n\t\t]);\r\n\t}\r\n}\r\n\r\nexport default Menu;\r\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@dojo/webpack-contrib/css-module-dts-loader?type=ts&instanceName=0_menu!./src/menu/Menu.ts","// removed by extract-text-webpack-plugin\nmodule.exports = {\" _key\":\"test-app/menu\",\"root\":\"_3bA6jdSn\",\"menuContainer\":\"_1eoGfqku\"};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/menu/menu.m.css\n// module id = ./src/menu/menu.m.css\n// module chunks = menu"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap b1d790cff3d2b119c671","webpack:///./node_modules/@dojo/framework/core/Destroyable.mjs","webpack:///./node_modules/@dojo/framework/core/Evented.mjs","webpack:///./node_modules/@dojo/framework/core/lang.mjs","webpack:///./node_modules/@dojo/framework/has/has.mjs","webpack:///./node_modules/@dojo/framework/shim/Map.mjs","webpack:///./node_modules/@dojo/framework/shim/Promise.mjs","webpack:///./node_modules/@dojo/framework/shim/Symbol.mjs","webpack:///./node_modules/@dojo/framework/shim/WeakMap.mjs","webpack:///./node_modules/@dojo/framework/shim/array.mjs","webpack:///./node_modules/@dojo/framework/shim/global.mjs","webpack:///./node_modules/@dojo/framework/shim/number.mjs","webpack:///./node_modules/@dojo/framework/shim/object.mjs","webpack:///./node_modules/@dojo/framework/shim/string.mjs","webpack:///./node_modules/@dojo/framework/shim/support/has.mjs","webpack:///./node_modules/@dojo/framework/shim/support/queue.mjs","webpack:///./node_modules/@dojo/framework/shim/support/util.mjs","webpack:///./node_modules/@dojo/framework/widget-core/Injector.mjs","webpack:///./node_modules/@dojo/framework/widget-core/NodeHandler.mjs","webpack:///./node_modules/@dojo/framework/widget-core/Registry.mjs","webpack:///./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs","webpack:///./node_modules/@dojo/framework/widget-core/WidgetBase.mjs","webpack:///./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs","webpack:///./node_modules/@dojo/framework/widget-core/d.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs","webpack:///./node_modules/@dojo/framework/widget-core/decorators/inject.mjs","webpack:///./node_modules/@dojo/framework/widget-core/diff.mjs","webpack:///./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs","webpack:///./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs","webpack:///./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs","webpack:///./node_modules/@dojo/framework/widget-core/vdom.mjs","webpack:///./node_modules/@dojo/cli-build-widget/template/custom-element.js","webpack:///./node_modules/process/browser.js","webpack:///./node_modules/tslib/tslib.es6.js","webpack:///(webpack)/buildin/global.js","webpack:///./src/menu/Menu.ts","webpack:///./src/menu/menu.m.css?ec11"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","noop","__WEBPACK_IMPORTED_MODULE_1__shim_Promise__","resolve","destroyed","Error","Destroyable","[object Object]","this","handles","handle","Array","isArray","__WEBPACK_IMPORTED_MODULE_0__lang__","_handles","push","splice","indexOf","destroy","forEach","own","__webpack_exports__","regexMap","__WEBPACK_IMPORTED_MODULE_0__shim_Map__","Evented","__WEBPACK_IMPORTED_MODULE_1__Destroyable__","super","arguments","listenersMap","event","methods","type","globString","targetString","regex","has","RegExp","replace","set","test","isGlobMatch","method","listener","map","_addListener","listeners","destructor","called","createHandle","length","slice","testCache","testFunctions","testThenables","globalScope","window","global","self","staticFeatures","DojoHasEnvironment","staticCache","apply","add","feature","value","overwrite","normalizedFeature","toLowerCase","Boolean","exists","TypeError","then","isFeatureTestThenable","resolvedValue","result","document","location","process","versions","node","Map","__WEBPACK_IMPORTED_MODULE_1__global__","ShimPromise","__WEBPACK_IMPORTED_MODULE_0__global__","Promise","Symbol","wellKnown","__WEBPACK_IMPORTED_MODULE_2__support_util__","for","WeakMap","from","of","copyWithin","fill","find","findIndex","includes","__WEBPACK_IMPORTED_MODULE_4__support_util__","globalObject","Math","pow","assign","getOwnPropertyDescriptor","getOwnPropertyNames","getOwnPropertySymbols","is","keys","getOwnPropertyDescriptors","entries","values","fromCodePoint","raw","codePointAt","endsWith","normalize","repeat","startsWith","padEnd","padStart","String","__WEBPACK_IMPORTED_MODULE_0__has_has__","every","key","Number","POSITIVE_INFINITY","e","imul","Observable","Set","getCallSite","callSite","substitutions","key1","key2","freeze","postMessage","requestAnimationFrame","setImmediate","MutationObserver","WebKitMutationObserver","example","createElement","observer","observe","attributes","style","setProperty","takeRecords","undefined","Animation","KeyframeEffect","executeTask","item","isActive","callback","getQueueHandle","enqueue","queue","addEventListener","source","data","stopPropagation","shift","queueTask","id","queueAnimationTask","rafId","bind","cancelAnimationFrame","writable","nativeFunction","target","args","Injector","__WEBPACK_IMPORTED_MODULE_0__core_Evented__","payload","_payload","invalidator","_invalidator","NodeEventType","_nodeMap","__WEBPACK_IMPORTED_MODULE_1__shim_Map__","element","emit","Widget","Projector","clear","WIDGET_BASE_TYPE","__WEBPACK_IMPORTED_MODULE_2__shim_Symbol__","isWidgetBaseConstructor","_type","Registry","__WEBPACK_IMPORTED_MODULE_3__core_Evented__","widgetLabel","action","label","_widgetRegistry","toString","__WEBPACK_IMPORTED_MODULE_0__shim_Promise__","widgetCtor","emitLoadedEvent","error","injectorFactory","_injectorRegistry","injectorItem","injector","promise","default","isWidgetConstructorDefaultExport","hasInjector","__WEBPACK_IMPORTED_MODULE_1__core_Evented__","_registry","__WEBPACK_IMPORTED_MODULE_2__Registry__","_registryWidgetLabelMap","_registryInjectorLabelMap","baseRegistry","delete","base","widget","define","defineInjector","globalPrecedence","_get","getFunctionName","labelMap","registries","registry","registeredLabels","on","decoratorMap","boundAuto","__WEBPACK_IMPORTED_MODULE_4__diff__","noBind","WidgetBase","_initialProperties","_changedPropertyKeys","_nodeHandler","__WEBPACK_IMPORTED_MODULE_6__NodeHandler__","_children","_decoratorCache","_properties","_boundRenderFunc","render","_boundInvalidate","invalidate","__WEBPACK_IMPORTED_MODULE_7__vdom__","dirty","onAttach","onDetach","nodeHandler","coreProperties","rendering","inputProperties","_runAfterConstructors","MetaType","_metaMap","cached","properties","changedPropertyKeys","instanceData","__WEBPACK_IMPORTED_MODULE_5__RegistryHandler__","originalProperties","_runBeforeProperties","registeredDiffPropertyNames","getDecorator","propertyNames","allProperties","checkedProperties","diffPropertyResults","runReactions","propertyName","previousProperty","newProperty","_bindFunctionProperty","diffFunctions","changed","executedReactions","reaction","propertyChanged","reactionRun","children","dNode","_runBeforeRenders","runAfterRenders","__WEBPACK_IMPORTED_MODULE_3__d__","decoratorKey","decoratorList","constructor","specificDecoratorList","decorators","allDecorators","instanceMap","unshift","getPrototypeOf","_buildDecoratorList","__WEBPACK_IMPORTED_MODULE_8__Registry__","_bindFunctionPropertyMap","__WEBPACK_IMPORTED_MODULE_1__shim_WeakMap__","bindInfo","boundFunc","scope","beforeProperties","reduce","beforePropertiesFunction","beforeRenders","beforeRenderFunction","updatedRender","console","warn","afterRenders","afterRenderFunction","meta","afterRender","afterConstructors","afterConstructor","pop","browserSpecificTransitionEndEventName","browserSpecificAnimationEndEventName","initialize","determineBrowserStyleNames","runAndCleanUp","startAnimation","finishAnimation","finished","transitionEnd","removeEventListener","enter","enterAnimation","activeClass","enterAnimationActive","classList","remove","exit","exitAnimation","removeNode","exitAnimationActive","child","DOMVNODE","widgetConstructor","WNODE","tag","propertiesOrChildren","deferredPropertiesCallback","VNODE","attrs","props","diffType","isElementNode","tagName","events","domNode","text","__WEBPACK_IMPORTED_MODULE_0__shim_Symbol__","isWNode","isVNode","__WEBPACK_IMPORTED_MODULE_0__handleDecorator__","propertyKey","addDecorator","alwaysRender","__WEBPACK_IMPORTED_MODULE_1__beforeProperties__","customElement","childType","__WEBPACK_IMPORTED_MODULE_0__registerCustomElement__","DOJO","registryFactory","__WEBPACK_IMPORTED_MODULE_1__Registry__","__customElementDescriptor","diffProperty","diffFunction","__WEBPACK_IMPORTED_MODULE_1__diff__","reactionFunction","handleDecorator","handler","descriptor","registeredInjectorsMap","__WEBPACK_IMPORTED_MODULE_0__shim_WeakMap__","inject","getProperties","__WEBPACK_IMPORTED_MODULE_1__handleDecorator__","__WEBPACK_IMPORTED_MODULE_2__beforeProperties__","getInjector","registeredInjectors","__WEBPACK_IMPORTED_MODULE_0__Registry__","reference","ignore","isObjectOrArray","shallow","validOldProperty","validNewProperty","previousKeys","newKeys","some","ProjectorAttachState","AttachType","ProjectorMixin","Base","_root","body","_async","_projectorProperties","_projectionOptions","transitions","__WEBPACK_IMPORTED_MODULE_2__animations_cssTransitions__","root","projectorState","Detached","options","Append","_attach","Merge","Attached","async","doc","previousRoot","createDocumentFragment","__setChildren__","__setProperties__","__WEBPACK_IMPORTED_MODULE_1__core_lang__","__setCoreProperties__","_projection","childNodes","outerHTML","__WEBPACK_IMPORTED_MODULE_4__d__","_attachHandle","sync","__WEBPACK_IMPORTED_MODULE_5__vdom__","append","merge","__WEBPACK_IMPORTED_MODULE_0_tslib__","__WEBPACK_IMPORTED_MODULE_3__decorators_afterRender__","theme","__WEBPACK_IMPORTED_MODULE_3__decorators_handleDecorator__","themeRegistry","themeInjector","__WEBPACK_IMPORTED_MODULE_1__Injector__","INJECTED_THEME_KEY","setInvalidator","THEME_KEY","ThemedMixin","Themed","_registeredBaseThemeKeys","_recalculateClasses","_theme","classes","_recalculateThemeClasses","className","_getThemeClass","extraClasses","themeClassName","_baseThemeClassesReverseLookup","resultClassNames","_registeredBaseTheme","join","baseThemes","finalBaseTheme","baseTheme","_a","currentClassNames","baseClass","themeKey","__WEBPACK_IMPORTED_MODULE_4__decorators_diffProperty__","__WEBPACK_IMPORTED_MODULE_5__diff__","__WEBPACK_IMPORTED_MODULE_2__decorators_inject__","CustomElementChildType","DomToWidgetWrapper","__WEBPACK_IMPORTED_MODULE_1__WidgetBase__","__WEBPACK_IMPORTED_MODULE_7__decorators_alwaysRender__","create","WidgetConstructor","attributeMap","attributeName","HTMLElement","_eventProperties","_initialised","domProperties","_attributesToProperties","filteredPropertyName","_getProperty","_setProperty","eventName","_getEventProperty","_setEventProperty","eventCallback","dispatchEvent","CustomEvent","bubbles","detail","defineProperties","TEXT","__WEBPACK_IMPORTED_MODULE_3__shim_array__","childNode","_render","_childConnected","widgetProperties","renderChildren","__children__","themeContext","__WEBPACK_IMPORTED_MODULE_6__mixins_Themed__","_getTheme","__WEBPACK_IMPORTED_MODULE_5__shim_global__","__WEBPACK_IMPORTED_MODULE_2__mixins_Projector__","_projector","setProperties","dojoce","themes","parentNode","filter","Child","isWidget","__properties__","oldValue","getAttribute","observedAttributes","register","customElements","NAMESPACE_SVG","NAMESPACE_W3","NAMESPACE_XLINK","emptyArray","nodeOperations","widgetInstanceMap","__WEBPACK_IMPORTED_MODULE_4__shim_WeakMap__","nextSiblingMap","projectorStateMap","same","dnode1","dnode2","__WEBPACK_IMPORTED_MODULE_2__d__","instance","missingTransition","checkStyleValue","styleValue","updateEvent","currentValue","projectionOptions","previousValue","projectorInstance","eventMap","nodeMap","previousEvent","evt","addClasses","classNames","split","removeClasses","nodeOperation","propName","propValue","deferredRenderCallbacks","removeOrphanedEvents","previousProperties","onlyEvents","isEvent","substr","updateAttribute","attrName","attrValue","namespace","setAttributeNS","removeAttribute","setAttribute","updateAttributes","previousAttributes","attrNames","attrCount","updateProperties","includesEventsAndAttributes","propertiesUpdated","propNames","propCount","previousClasses","currentClasses","newClasses","previousClassName","classIndex","styleNames","styleCount","j","styleName","newStyleValue","styleApplyer","domValue","lastIndexOf","findIndexOfChild","sameAs","start","toInternalWNode","rendered","filterAndDecorateChildren","nodeAdded","dnode","nodeToRemove","pointerEvents","removeDomNode","removeChild","checkDistinguishable","indexToCheck","parentInstance","nodeIdentifier","parentName","updateChildren","parentVNode","siblings","oldChildren","newChildren","oldChildrenLength","newChildrenLength","depth","oldIndex","newIndex","textUpdated","oldChild","newChild","inserted","addDeferredProperties","updateDom","findOldIndex","addChild","insertBeforeDomNode","childrenArray","nextIndex","insertBeforeChildren","insertBefore","parentElement","createDom","afterRenderCallbacks","childToRemove","addChildren","__WEBPACK_IMPORTED_MODULE_1__shim_array__","nextSiblings","domElement","toUpperCase","initPropertiesAndChildren","parentInstanceData","__WEBPACK_IMPORTED_MODULE_3__Registry__","renderQueue","scheduleRender","__render__","filteredRendered","addRoot","mergeElement","ownerDocument","createElementNS","appendChild","newDomNode","createTextNode","replaceChild","previous","oldNextSiblings","previousRendered","updated","current","newProperties","buildPreviousProperties","updateAnimation","vnode","decoratedDeferredProperties","runDeferredRenderCallbacks","__WEBPACK_IMPORTED_MODULE_0__shim_global__","runAfterRenderCallbacks","requestIdleCallback","setTimeout","renderScheduled","renders","sort","a","b","previouslyRendered","dom","finalProjectorOptions","projectorOptions","defaults","getProjectionOptions","rootNode","projection","widgetFactory","registerCustomElement","defaultExport","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","fun","clearTimeout","currentQueue","draining","queueIndex","cleanUpNextTick","concat","drainQueue","timeout","len","run","marker","runClearTimeout","Item","array","nextTick","title","browser","env","argv","version","addListener","once","off","removeListener","removeAllListeners","prependListener","prependOnceListener","binding","cwd","chdir","dir","umask","t","desc","r","Reflect","decorate","setPrototypeOf","g","Function","eval","Menu","__WEBPACK_IMPORTED_MODULE_3__dojo_framework_widget_core_mixins_Themed__","__WEBPACK_IMPORTED_MODULE_4__dojo_framework_widget_core_WidgetBase__","_selectedId","onSelected","items","index","_onSelected","selected","__WEBPACK_IMPORTED_MODULE_1__dojo_framework_widget_core_d__","__WEBPACK_IMPORTED_MODULE_5__menu_m_css__","__WEBPACK_IMPORTED_MODULE_2__dojo_framework_widget_core_decorators_customElement__"," _key","menuContainer"],"mappings":"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","file":"menu-1.0.0.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap b1d790cff3d2b119c671","import { createCompositeHandle } from './lang';\nimport Promise from '../shim/Promise';\n/**\n * No operation function to replace own once instance is destoryed\n */\nfunction noop() {\n return Promise.resolve(false);\n}\n/**\n * No op function used to replace own, once instance has been destoryed\n */\nfunction destroyed() {\n throw new Error('Call made to destroyed method');\n}\nexport class Destroyable {\n /**\n * @constructor\n */\n constructor() {\n this.handles = [];\n }\n /**\n * Register handles for the instance that will be destroyed when `this.destroy` is called\n *\n * @param {Handle} handle The handle to add for the instance\n * @returns {Handle} a handle for the handle, removes the handle for the instance and calls destroy\n */\n own(handles) {\n const handle = Array.isArray(handles) ? createCompositeHandle(...handles) : handles;\n const { handles: _handles } = this;\n _handles.push(handle);\n return {\n destroy() {\n _handles.splice(_handles.indexOf(handle));\n handle.destroy();\n }\n };\n }\n /**\n * Destrpys all handers registered for the instance\n *\n * @returns {Promise {\n this.handles.forEach((handle) => {\n handle && handle.destroy && handle.destroy();\n });\n this.destroy = noop;\n this.own = destroyed;\n resolve(true);\n });\n }\n}\nexport default Destroyable;\n//# sourceMappingURL=Destroyable.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/core/Destroyable.mjs\n// module id = ./node_modules/@dojo/framework/core/Destroyable.mjs\n// module chunks = menu","import Map from '../shim/Map';\r\nimport { Destroyable } from './Destroyable';\r\n/**\r\n * Map of computed regular expressions, keyed by string\r\n */\r\nconst regexMap = new Map();\r\n/**\r\n * Determines is the event type glob has been matched\r\n *\r\n * @returns boolean that indicates if the glob is matched\r\n */\r\nexport function isGlobMatch(globString, targetString) {\r\n if (typeof targetString === 'string' && typeof globString === 'string' && globString.indexOf('*') !== -1) {\r\n let regex;\r\n if (regexMap.has(globString)) {\r\n regex = regexMap.get(globString);\r\n }\r\n else {\r\n regex = new RegExp(`^${globString.replace(/\\*/g, '.*')}$`);\r\n regexMap.set(globString, regex);\r\n }\r\n return regex.test(targetString);\r\n }\r\n else {\r\n return globString === targetString;\r\n }\r\n}\r\n/**\r\n * Event Class\r\n */\r\nexport class Evented extends Destroyable {\r\n constructor() {\r\n super(...arguments);\r\n /**\r\n * map of listeners keyed by event type\r\n */\r\n this.listenersMap = new Map();\r\n }\r\n emit(event) {\r\n this.listenersMap.forEach((methods, type) => {\r\n if (isGlobMatch(type, event.type)) {\r\n [...methods].forEach((method) => {\r\n method.call(this, event);\r\n });\r\n }\r\n });\r\n }\r\n on(type, listener) {\r\n if (Array.isArray(listener)) {\r\n const handles = listener.map((listener) => this._addListener(type, listener));\r\n return {\r\n destroy() {\r\n handles.forEach((handle) => handle.destroy());\r\n }\r\n };\r\n }\r\n return this._addListener(type, listener);\r\n }\r\n _addListener(type, listener) {\r\n const listeners = this.listenersMap.get(type) || [];\r\n listeners.push(listener);\r\n this.listenersMap.set(type, listeners);\r\n return {\r\n destroy: () => {\r\n const listeners = this.listenersMap.get(type) || [];\r\n listeners.splice(listeners.indexOf(listener), 1);\r\n }\r\n };\r\n }\r\n}\r\nexport default Evented;\r\n//# sourceMappingURL=Evented.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/core/Evented.mjs\n// module id = ./node_modules/@dojo/framework/core/Evented.mjs\n// module chunks = menu","import { assign } from '../shim/object';\nexport { assign } from '../shim/object';\nconst slice = Array.prototype.slice;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Type guard that ensures that the value can be coerced to Object\n * to weed out host objects that do not derive from Object.\n * This function is used to check if we want to deep copy an object or not.\n * Note: In ES6 it is possible to modify an object's Symbol.toStringTag property, which will\n * change the value returned by `toString`. This is a rare edge case that is difficult to handle,\n * so it is not handled here.\n * @param value The value to check\n * @return If the value is coercible into an Object\n */\nfunction shouldDeepCopyObject(value) {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\nfunction copyArray(array, inherited) {\n return array.map(function (item) {\n if (Array.isArray(item)) {\n return copyArray(item, inherited);\n }\n return !shouldDeepCopyObject(item)\n ? item\n : _mixin({\n deep: true,\n inherited: inherited,\n sources: [item],\n target: {}\n });\n });\n}\nfunction _mixin(kwArgs) {\n const deep = kwArgs.deep;\n const inherited = kwArgs.inherited;\n const target = kwArgs.target;\n const copied = kwArgs.copied || [];\n const copiedClone = [...copied];\n for (let i = 0; i < kwArgs.sources.length; i++) {\n const source = kwArgs.sources[i];\n if (source === null || source === undefined) {\n continue;\n }\n for (let key in source) {\n if (inherited || hasOwnProperty.call(source, key)) {\n let value = source[key];\n if (copiedClone.indexOf(value) !== -1) {\n continue;\n }\n if (deep) {\n if (Array.isArray(value)) {\n value = copyArray(value, inherited);\n }\n else if (shouldDeepCopyObject(value)) {\n const targetValue = target[key] || {};\n copied.push(source);\n value = _mixin({\n deep: true,\n inherited: inherited,\n sources: [value],\n target: targetValue,\n copied\n });\n }\n }\n target[key] = value;\n }\n }\n }\n return target;\n}\nexport function create(prototype, ...mixins) {\n if (!mixins.length) {\n throw new RangeError('lang.create requires at least one mixin object.');\n }\n const args = mixins.slice();\n args.unshift(Object.create(prototype));\n return assign.apply(null, args);\n}\nexport function deepAssign(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: false,\n sources: sources,\n target: target\n });\n}\nexport function deepMixin(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Creates a new object using the provided source's prototype as the prototype for the new object, and then\n * deep copies the provided source's values into the new target.\n *\n * @param source The object to duplicate\n * @return The new object\n */\nexport function duplicate(source) {\n const target = Object.create(Object.getPrototypeOf(source));\n return deepMixin(target, source);\n}\n/**\n * Determines whether two values are the same value.\n *\n * @param a First value to compare\n * @param b Second value to compare\n * @return true if the values are the same; false otherwise\n */\nexport function isIdentical(a, b) {\n return (a === b ||\n /* both values are NaN */\n (a !== a && b !== b));\n}\n/**\n * Returns a function that binds a method to the specified object at runtime. This is similar to\n * `Function.prototype.bind`, but instead of a function it takes the name of a method on an object.\n * As a result, the function returned by `lateBind` will always call the function currently assigned to\n * the specified property on the object as of the moment the function it returns is called.\n *\n * @param instance The context object\n * @param method The name of the method on the context object to bind to itself\n * @param suppliedArgs An optional array of values to prepend to the `instance[method]` arguments list\n * @return The bound function\n */\nexport function lateBind(instance, method, ...suppliedArgs) {\n return suppliedArgs.length\n ? function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n // TS7017\n return instance[method].apply(instance, args);\n }\n : function () {\n // TS7017\n return instance[method].apply(instance, arguments);\n };\n}\nexport function mixin(target, ...sources) {\n return _mixin({\n deep: false,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Returns a function which invokes the given function with the given arguments prepended to its argument list.\n * Like `Function.prototype.bind`, but does not alter execution context.\n *\n * @param targetFunction The function that needs to be bound\n * @param suppliedArgs An optional array of arguments to prepend to the `targetFunction` arguments list\n * @return The bound function\n */\nexport function partial(targetFunction, ...suppliedArgs) {\n return function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n return targetFunction.apply(this, args);\n };\n}\n/**\n * Returns an object with a destroy method that, when called, calls the passed-in destructor.\n * This is intended to provide a unified interface for creating \"remove\" / \"destroy\" handlers for\n * event listeners, timers, etc.\n *\n * @param destructor A function that will be called when the handle's `destroy` method is invoked\n * @return The handle object\n */\nexport function createHandle(destructor) {\n let called = false;\n return {\n destroy: function () {\n if (!called) {\n called = true;\n destructor();\n }\n }\n };\n}\n/**\n * Returns a single handle that can be used to destroy multiple handles simultaneously.\n *\n * @param handles An array of handles with `destroy` methods\n * @return The handle object\n */\nexport function createCompositeHandle(...handles) {\n return createHandle(function () {\n for (let i = 0; i < handles.length; i++) {\n handles[i].destroy();\n }\n });\n}\n//# sourceMappingURL=lang.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/core/lang.mjs\n// module id = ./node_modules/@dojo/framework/core/lang.mjs\n// module chunks = menu","function isFeatureTestThenable(value) {\r\n return value && value.then;\r\n}\r\n/**\r\n * A cache of results of feature tests\r\n */\r\nexport const testCache = {};\r\n/**\r\n * A cache of the un-resolved feature tests\r\n */\r\nexport const testFunctions = {};\r\n/**\r\n * A cache of unresolved thenables (probably promises)\r\n * @type {{}}\r\n */\r\nconst testThenables = {};\r\n/**\r\n * A reference to the global scope (`window` in a browser, `global` in NodeJS)\r\n */\r\nconst globalScope = (function () {\r\n /* istanbul ignore else */\r\n if (typeof window !== 'undefined') {\r\n // Browsers\r\n return window;\r\n }\r\n else if (typeof global !== 'undefined') {\r\n // Node\r\n return global;\r\n }\r\n else if (typeof self !== 'undefined') {\r\n // Web workers\r\n return self;\r\n }\r\n /* istanbul ignore next */\r\n return {};\r\n})();\r\n/* Grab the staticFeatures if there are available */\r\nconst { staticFeatures } = globalScope.DojoHasEnvironment || {};\r\n/* Cleaning up the DojoHasEnviornment */\r\nif ('DojoHasEnvironment' in globalScope) {\r\n delete globalScope.DojoHasEnvironment;\r\n}\r\n/**\r\n * Custom type guard to narrow the `staticFeatures` to either a map or a function that\r\n * returns a map.\r\n *\r\n * @param value The value to guard for\r\n */\r\nfunction isStaticFeatureFunction(value) {\r\n return typeof value === 'function';\r\n}\r\n/**\r\n * The cache of asserted features that were available in the global scope when the\r\n * module loaded\r\n */\r\nconst staticCache = staticFeatures\r\n ? isStaticFeatureFunction(staticFeatures) ? staticFeatures.apply(globalScope) : staticFeatures\r\n : {}; /* Providing an empty cache, if none was in the environment\r\n\r\n/**\r\n* AMD plugin function.\r\n*\r\n* Conditional loads modules based on a has feature test value.\r\n*\r\n* @param resourceId Gives the resolved module id to load.\r\n* @param require The loader require function with respect to the module that contained the plugin resource in its\r\n* dependency list.\r\n* @param load Callback to loader that consumes result of plugin demand.\r\n*/\r\nexport function load(resourceId, require, load, config) {\r\n resourceId ? require([resourceId], load) : load();\r\n}\r\n/**\r\n * AMD plugin function.\r\n *\r\n * Resolves resourceId into a module id based on possibly-nested tenary expression that branches on has feature test\r\n * value(s).\r\n *\r\n * @param resourceId The id of the module\r\n * @param normalize Resolves a relative module id into an absolute module id\r\n */\r\nexport function normalize(resourceId, normalize) {\r\n const tokens = resourceId.match(/[\\?:]|[^:\\?]*/g) || [];\r\n let i = 0;\r\n function get(skip) {\r\n const term = tokens[i++];\r\n if (term === ':') {\r\n // empty string module name, resolves to null\r\n return null;\r\n }\r\n else {\r\n // postfixed with a ? means it is a feature to branch on, the term is the name of the feature\r\n if (tokens[i++] === '?') {\r\n if (!skip && has(term)) {\r\n // matched the feature, get the first value from the options\r\n return get();\r\n }\r\n else {\r\n // did not match, get the second value, passing over the first\r\n get(true);\r\n return get(skip);\r\n }\r\n }\r\n // a module\r\n return term;\r\n }\r\n }\r\n const id = get();\r\n return id && normalize(id);\r\n}\r\n/**\r\n * Check if a feature has already been registered\r\n *\r\n * @param feature the name of the feature\r\n */\r\nexport function exists(feature) {\r\n const normalizedFeature = feature.toLowerCase();\r\n return Boolean(normalizedFeature in staticCache || normalizedFeature in testCache || testFunctions[normalizedFeature]);\r\n}\r\n/**\r\n * Register a new test for a named feature.\r\n *\r\n * @example\r\n * has.add('dom-addeventlistener', !!document.addEventListener);\r\n *\r\n * @example\r\n * has.add('touch-events', function () {\r\n * return 'ontouchstart' in document\r\n * });\r\n *\r\n * @param feature the name of the feature\r\n * @param value the value reported of the feature, or a function that will be executed once on first test\r\n * @param overwrite if an existing value should be overwritten. Defaults to false.\r\n */\r\nexport function add(feature, value, overwrite = false) {\r\n const normalizedFeature = feature.toLowerCase();\r\n if (exists(normalizedFeature) && !overwrite && !(normalizedFeature in staticCache)) {\r\n throw new TypeError(`Feature \"${feature}\" exists and overwrite not true.`);\r\n }\r\n if (typeof value === 'function') {\r\n testFunctions[normalizedFeature] = value;\r\n }\r\n else if (isFeatureTestThenable(value)) {\r\n testThenables[feature] = value.then((resolvedValue) => {\r\n testCache[feature] = resolvedValue;\r\n delete testThenables[feature];\r\n }, () => {\r\n delete testThenables[feature];\r\n });\r\n }\r\n else {\r\n testCache[normalizedFeature] = value;\r\n delete testFunctions[normalizedFeature];\r\n }\r\n}\r\n/**\r\n * Return the current value of a named feature.\r\n *\r\n * @param feature The name (if a string) or identifier (if an integer) of the feature to test.\r\n */\r\nexport default function has(feature) {\r\n let result;\r\n const normalizedFeature = feature.toLowerCase();\r\n if (normalizedFeature in staticCache) {\r\n result = staticCache[normalizedFeature];\r\n }\r\n else if (testFunctions[normalizedFeature]) {\r\n result = testCache[normalizedFeature] = testFunctions[normalizedFeature].call(null);\r\n delete testFunctions[normalizedFeature];\r\n }\r\n else if (normalizedFeature in testCache) {\r\n result = testCache[normalizedFeature];\r\n }\r\n else if (feature in testThenables) {\r\n return false;\r\n }\r\n else {\r\n throw new TypeError(`Attempt to detect unregistered has feature \"${feature}\"`);\r\n }\r\n return result;\r\n}\r\n/*\r\n * Out of the box feature tests\r\n */\r\n/* Environments */\r\n/* Used as a value to provide a debug only code path */\r\nadd('debug', true);\r\n/* Detects if the environment is \"browser like\" */\r\nadd('host-browser', typeof document !== 'undefined' && typeof location !== 'undefined');\r\n/* Detects if the environment appears to be NodeJS */\r\nadd('host-node', function () {\r\n if (typeof process === 'object' && process.versions && process.versions.node) {\r\n return process.versions.node;\r\n }\r\n});\r\n//# sourceMappingURL=has.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/has/has.mjs\n// module id = ./node_modules/@dojo/framework/has/has.mjs\n// module chunks = menu","import { isArrayLike, ShimIterator } from './iterator';\r\nimport global from './global';\r\nimport { is as objectIs } from './object';\r\nimport has from './support/has';\r\nimport './Symbol';\r\nexport let Map = global.Map;\r\nif (!true) {\r\n Map = (_a = class Map {\r\n constructor(iterable) {\r\n this._keys = [];\r\n this._values = [];\r\n this[Symbol.toStringTag] = 'Map';\r\n if (iterable) {\r\n if (isArrayLike(iterable)) {\r\n for (let i = 0; i < iterable.length; i++) {\r\n const value = iterable[i];\r\n this.set(value[0], value[1]);\r\n }\r\n }\r\n else {\r\n for (const value of iterable) {\r\n this.set(value[0], value[1]);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * An alternative to Array.prototype.indexOf using Object.is\r\n * to check for equality. See http://mzl.la/1zuKO2V\r\n */\r\n _indexOfKey(keys, key) {\r\n for (let i = 0, length = keys.length; i < length; i++) {\r\n if (objectIs(keys[i], key)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n get size() {\r\n return this._keys.length;\r\n }\r\n clear() {\r\n this._keys.length = this._values.length = 0;\r\n }\r\n delete(key) {\r\n const index = this._indexOfKey(this._keys, key);\r\n if (index < 0) {\r\n return false;\r\n }\r\n this._keys.splice(index, 1);\r\n this._values.splice(index, 1);\r\n return true;\r\n }\r\n entries() {\r\n const values = this._keys.map((key, i) => {\r\n return [key, this._values[i]];\r\n });\r\n return new ShimIterator(values);\r\n }\r\n forEach(callback, context) {\r\n const keys = this._keys;\r\n const values = this._values;\r\n for (let i = 0, length = keys.length; i < length; i++) {\r\n callback.call(context, values[i], keys[i], this);\r\n }\r\n }\r\n get(key) {\r\n const index = this._indexOfKey(this._keys, key);\r\n return index < 0 ? undefined : this._values[index];\r\n }\r\n has(key) {\r\n return this._indexOfKey(this._keys, key) > -1;\r\n }\r\n keys() {\r\n return new ShimIterator(this._keys);\r\n }\r\n set(key, value) {\r\n let index = this._indexOfKey(this._keys, key);\r\n index = index < 0 ? this._keys.length : index;\r\n this._keys[index] = key;\r\n this._values[index] = value;\r\n return this;\r\n }\r\n values() {\r\n return new ShimIterator(this._values);\r\n }\r\n [Symbol.iterator]() {\r\n return this.entries();\r\n }\r\n },\r\n _a[Symbol.species] = _a,\r\n _a);\r\n}\r\nexport default Map;\r\nvar _a;\r\n//# sourceMappingURL=Map.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/Map.mjs\n// module id = ./node_modules/@dojo/framework/shim/Map.mjs\n// module chunks = menu","import global from './global';\r\nimport { queueMicroTask } from './support/queue';\r\nimport './Symbol';\r\nimport has from './support/has';\r\nexport let ShimPromise = global.Promise;\r\nexport const isThenable = function isThenable(value) {\r\n return value && typeof value.then === 'function';\r\n};\r\nif (!true) {\r\n global.Promise = ShimPromise = (_a = class Promise {\r\n /**\r\n * Creates a new Promise.\r\n *\r\n * @constructor\r\n *\r\n * @param executor\r\n * The executor function is called immediately when the Promise is instantiated. It is responsible for\r\n * starting the asynchronous operation when it is invoked.\r\n *\r\n * The executor must call either the passed `resolve` function when the asynchronous operation has completed\r\n * successfully, or the `reject` function when the operation fails.\r\n */\r\n constructor(executor) {\r\n /**\r\n * The current state of this promise.\r\n */\r\n this.state = 1 /* Pending */;\r\n this[Symbol.toStringTag] = 'Promise';\r\n /**\r\n * If true, the resolution of this promise is chained (\"locked in\") to another promise.\r\n */\r\n let isChained = false;\r\n /**\r\n * Whether or not this promise is in a resolved state.\r\n */\r\n const isResolved = () => {\r\n return this.state !== 1 /* Pending */ || isChained;\r\n };\r\n /**\r\n * Callbacks that should be invoked once the asynchronous operation has completed.\r\n */\r\n let callbacks = [];\r\n /**\r\n * Initially pushes callbacks onto a queue for execution once this promise settles. After the promise settles,\r\n * enqueues callbacks for execution on the next event loop turn.\r\n */\r\n let whenFinished = function (callback) {\r\n if (callbacks) {\r\n callbacks.push(callback);\r\n }\r\n };\r\n /**\r\n * Settles this promise.\r\n *\r\n * @param newState The resolved state for this promise.\r\n * @param {T|any} value The resolved value for this promise.\r\n */\r\n const settle = (newState, value) => {\r\n // A promise can only be settled once.\r\n if (this.state !== 1 /* Pending */) {\r\n return;\r\n }\r\n this.state = newState;\r\n this.resolvedValue = value;\r\n whenFinished = queueMicroTask;\r\n // Only enqueue a callback runner if there are callbacks so that initially fulfilled Promises don't have to\r\n // wait an extra turn.\r\n if (callbacks && callbacks.length > 0) {\r\n queueMicroTask(function () {\r\n if (callbacks) {\r\n let count = callbacks.length;\r\n for (let i = 0; i < count; ++i) {\r\n callbacks[i].call(null);\r\n }\r\n callbacks = null;\r\n }\r\n });\r\n }\r\n };\r\n /**\r\n * Resolves this promise.\r\n *\r\n * @param newState The resolved state for this promise.\r\n * @param {T|any} value The resolved value for this promise.\r\n */\r\n const resolve = (newState, value) => {\r\n if (isResolved()) {\r\n return;\r\n }\r\n if (isThenable(value)) {\r\n value.then(settle.bind(null, 0 /* Fulfilled */), settle.bind(null, 2 /* Rejected */));\r\n isChained = true;\r\n }\r\n else {\r\n settle(newState, value);\r\n }\r\n };\r\n this.then = (onFulfilled, onRejected) => {\r\n return new Promise((resolve, reject) => {\r\n // whenFinished initially queues up callbacks for execution after the promise has settled. Once the\r\n // promise has settled, whenFinished will schedule callbacks for execution on the next turn through the\r\n // event loop.\r\n whenFinished(() => {\r\n const callback = this.state === 2 /* Rejected */ ? onRejected : onFulfilled;\r\n if (typeof callback === 'function') {\r\n try {\r\n resolve(callback(this.resolvedValue));\r\n }\r\n catch (error) {\r\n reject(error);\r\n }\r\n }\r\n else if (this.state === 2 /* Rejected */) {\r\n reject(this.resolvedValue);\r\n }\r\n else {\r\n resolve(this.resolvedValue);\r\n }\r\n });\r\n });\r\n };\r\n try {\r\n executor(resolve.bind(null, 0 /* Fulfilled */), resolve.bind(null, 2 /* Rejected */));\r\n }\r\n catch (error) {\r\n settle(2 /* Rejected */, error);\r\n }\r\n }\r\n static all(iterable) {\r\n return new this(function (resolve, reject) {\r\n const values = [];\r\n let complete = 0;\r\n let total = 0;\r\n let populating = true;\r\n function fulfill(index, value) {\r\n values[index] = value;\r\n ++complete;\r\n finish();\r\n }\r\n function finish() {\r\n if (populating || complete < total) {\r\n return;\r\n }\r\n resolve(values);\r\n }\r\n function processItem(index, item) {\r\n ++total;\r\n if (isThenable(item)) {\r\n // If an item Promise rejects, this Promise is immediately rejected with the item\r\n // Promise's rejection error.\r\n item.then(fulfill.bind(null, index), reject);\r\n }\r\n else {\r\n Promise.resolve(item).then(fulfill.bind(null, index));\r\n }\r\n }\r\n let i = 0;\r\n for (const value of iterable) {\r\n processItem(i, value);\r\n i++;\r\n }\r\n populating = false;\r\n finish();\r\n });\r\n }\r\n static race(iterable) {\r\n return new this(function (resolve, reject) {\r\n for (const item of iterable) {\r\n if (item instanceof Promise) {\r\n // If a Promise item rejects, this Promise is immediately rejected with the item\r\n // Promise's rejection error.\r\n item.then(resolve, reject);\r\n }\r\n else {\r\n Promise.resolve(item).then(resolve);\r\n }\r\n }\r\n });\r\n }\r\n static reject(reason) {\r\n return new this(function (resolve, reject) {\r\n reject(reason);\r\n });\r\n }\r\n static resolve(value) {\r\n return new this(function (resolve) {\r\n resolve(value);\r\n });\r\n }\r\n catch(onRejected) {\r\n return this.then(undefined, onRejected);\r\n }\r\n },\r\n _a[Symbol.species] = ShimPromise,\r\n _a);\r\n}\r\nexport default ShimPromise;\r\nvar _a;\r\n//# sourceMappingURL=Promise.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/Promise.mjs\n// module id = ./node_modules/@dojo/framework/shim/Promise.mjs\n// module chunks = menu","import has from './support/has';\r\nimport global from './global';\r\nimport { getValueDescriptor } from './support/util';\r\nexport let Symbol = global.Symbol;\r\nif (!true) {\r\n /**\r\n * Throws if the value is not a symbol, used internally within the Shim\r\n * @param {any} value The value to check\r\n * @return {symbol} Returns the symbol or throws\r\n */\r\n const validateSymbol = function validateSymbol(value) {\r\n if (!isSymbol(value)) {\r\n throw new TypeError(value + ' is not a symbol');\r\n }\r\n return value;\r\n };\r\n const defineProperties = Object.defineProperties;\r\n const defineProperty = Object.defineProperty;\r\n const create = Object.create;\r\n const objPrototype = Object.prototype;\r\n const globalSymbols = {};\r\n const getSymbolName = (function () {\r\n const created = create(null);\r\n return function (desc) {\r\n let postfix = 0;\r\n let name;\r\n while (created[String(desc) + (postfix || '')]) {\r\n ++postfix;\r\n }\r\n desc += String(postfix || '');\r\n created[desc] = true;\r\n name = '@@' + desc;\r\n // FIXME: Temporary guard until the duplicate execution when testing can be\r\n // pinned down.\r\n if (!Object.getOwnPropertyDescriptor(objPrototype, name)) {\r\n defineProperty(objPrototype, name, {\r\n set: function (value) {\r\n defineProperty(this, name, getValueDescriptor(value));\r\n }\r\n });\r\n }\r\n return name;\r\n };\r\n })();\r\n const InternalSymbol = function Symbol(description) {\r\n if (this instanceof InternalSymbol) {\r\n throw new TypeError('TypeError: Symbol is not a constructor');\r\n }\r\n return Symbol(description);\r\n };\r\n Symbol = global.Symbol = function Symbol(description) {\r\n if (this instanceof Symbol) {\r\n throw new TypeError('TypeError: Symbol is not a constructor');\r\n }\r\n const sym = Object.create(InternalSymbol.prototype);\r\n description = description === undefined ? '' : String(description);\r\n return defineProperties(sym, {\r\n __description__: getValueDescriptor(description),\r\n __name__: getValueDescriptor(getSymbolName(description))\r\n });\r\n };\r\n /* Decorate the Symbol function with the appropriate properties */\r\n defineProperty(Symbol, 'for', getValueDescriptor(function (key) {\r\n if (globalSymbols[key]) {\r\n return globalSymbols[key];\r\n }\r\n return (globalSymbols[key] = Symbol(String(key)));\r\n }));\r\n defineProperties(Symbol, {\r\n keyFor: getValueDescriptor(function (sym) {\r\n let key;\r\n validateSymbol(sym);\r\n for (key in globalSymbols) {\r\n if (globalSymbols[key] === sym) {\r\n return key;\r\n }\r\n }\r\n }),\r\n hasInstance: getValueDescriptor(Symbol.for('hasInstance'), false, false),\r\n isConcatSpreadable: getValueDescriptor(Symbol.for('isConcatSpreadable'), false, false),\r\n iterator: getValueDescriptor(Symbol.for('iterator'), false, false),\r\n match: getValueDescriptor(Symbol.for('match'), false, false),\r\n observable: getValueDescriptor(Symbol.for('observable'), false, false),\r\n replace: getValueDescriptor(Symbol.for('replace'), false, false),\r\n search: getValueDescriptor(Symbol.for('search'), false, false),\r\n species: getValueDescriptor(Symbol.for('species'), false, false),\r\n split: getValueDescriptor(Symbol.for('split'), false, false),\r\n toPrimitive: getValueDescriptor(Symbol.for('toPrimitive'), false, false),\r\n toStringTag: getValueDescriptor(Symbol.for('toStringTag'), false, false),\r\n unscopables: getValueDescriptor(Symbol.for('unscopables'), false, false)\r\n });\r\n /* Decorate the InternalSymbol object */\r\n defineProperties(InternalSymbol.prototype, {\r\n constructor: getValueDescriptor(Symbol),\r\n toString: getValueDescriptor(function () {\r\n return this.__name__;\r\n }, false, false)\r\n });\r\n /* Decorate the Symbol.prototype */\r\n defineProperties(Symbol.prototype, {\r\n toString: getValueDescriptor(function () {\r\n return 'Symbol (' + validateSymbol(this).__description__ + ')';\r\n }),\r\n valueOf: getValueDescriptor(function () {\r\n return validateSymbol(this);\r\n })\r\n });\r\n defineProperty(Symbol.prototype, Symbol.toPrimitive, getValueDescriptor(function () {\r\n return validateSymbol(this);\r\n }));\r\n defineProperty(Symbol.prototype, Symbol.toStringTag, getValueDescriptor('Symbol', false, false, true));\r\n defineProperty(InternalSymbol.prototype, Symbol.toPrimitive, getValueDescriptor(Symbol.prototype[Symbol.toPrimitive], false, false, true));\r\n defineProperty(InternalSymbol.prototype, Symbol.toStringTag, getValueDescriptor(Symbol.prototype[Symbol.toStringTag], false, false, true));\r\n}\r\n/**\r\n * A custom guard function that determines if an object is a symbol or not\r\n * @param {any} value The value to check to see if it is a symbol or not\r\n * @return {is symbol} Returns true if a symbol or not (and narrows the type guard)\r\n */\r\nexport function isSymbol(value) {\r\n return (value && (typeof value === 'symbol' || value['@@toStringTag'] === 'Symbol')) || false;\r\n}\r\n/**\r\n * Fill any missing well known symbols if the native Symbol is missing them\r\n */\r\n[\r\n 'hasInstance',\r\n 'isConcatSpreadable',\r\n 'iterator',\r\n 'species',\r\n 'replace',\r\n 'search',\r\n 'split',\r\n 'match',\r\n 'toPrimitive',\r\n 'toStringTag',\r\n 'unscopables',\r\n 'observable'\r\n].forEach((wellKnown) => {\r\n if (!Symbol[wellKnown]) {\r\n Object.defineProperty(Symbol, wellKnown, getValueDescriptor(Symbol.for(wellKnown), false, false));\r\n }\r\n});\r\nexport default Symbol;\r\n//# sourceMappingURL=Symbol.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/Symbol.mjs\n// module id = ./node_modules/@dojo/framework/shim/Symbol.mjs\n// module chunks = menu","import global from './global';\r\nimport { isArrayLike } from './iterator';\r\nimport has from './support/has';\r\nimport './Symbol';\r\nexport let WeakMap = global.WeakMap;\r\nif (!true) {\r\n const DELETED = {};\r\n const getUID = function getUID() {\r\n return Math.floor(Math.random() * 100000000);\r\n };\r\n const generateName = (function () {\r\n let startId = Math.floor(Date.now() % 100000000);\r\n return function generateName() {\r\n return '__wm' + getUID() + (startId++ + '__');\r\n };\r\n })();\r\n WeakMap = class WeakMap {\r\n constructor(iterable) {\r\n this[Symbol.toStringTag] = 'WeakMap';\r\n this._name = generateName();\r\n this._frozenEntries = [];\r\n if (iterable) {\r\n if (isArrayLike(iterable)) {\r\n for (let i = 0; i < iterable.length; i++) {\r\n const item = iterable[i];\r\n this.set(item[0], item[1]);\r\n }\r\n }\r\n else {\r\n for (const [key, value] of iterable) {\r\n this.set(key, value);\r\n }\r\n }\r\n }\r\n }\r\n _getFrozenEntryIndex(key) {\r\n for (let i = 0; i < this._frozenEntries.length; i++) {\r\n if (this._frozenEntries[i].key === key) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n delete(key) {\r\n if (key === undefined || key === null) {\r\n return false;\r\n }\r\n const entry = key[this._name];\r\n if (entry && entry.key === key && entry.value !== DELETED) {\r\n entry.value = DELETED;\r\n return true;\r\n }\r\n const frozenIndex = this._getFrozenEntryIndex(key);\r\n if (frozenIndex >= 0) {\r\n this._frozenEntries.splice(frozenIndex, 1);\r\n return true;\r\n }\r\n return false;\r\n }\r\n get(key) {\r\n if (key === undefined || key === null) {\r\n return undefined;\r\n }\r\n const entry = key[this._name];\r\n if (entry && entry.key === key && entry.value !== DELETED) {\r\n return entry.value;\r\n }\r\n const frozenIndex = this._getFrozenEntryIndex(key);\r\n if (frozenIndex >= 0) {\r\n return this._frozenEntries[frozenIndex].value;\r\n }\r\n }\r\n has(key) {\r\n if (key === undefined || key === null) {\r\n return false;\r\n }\r\n const entry = key[this._name];\r\n if (Boolean(entry && entry.key === key && entry.value !== DELETED)) {\r\n return true;\r\n }\r\n const frozenIndex = this._getFrozenEntryIndex(key);\r\n if (frozenIndex >= 0) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n set(key, value) {\r\n if (!key || (typeof key !== 'object' && typeof key !== 'function')) {\r\n throw new TypeError('Invalid value used as weak map key');\r\n }\r\n let entry = key[this._name];\r\n if (!entry || entry.key !== key) {\r\n entry = Object.create(null, {\r\n key: { value: key }\r\n });\r\n if (Object.isFrozen(key)) {\r\n this._frozenEntries.push(entry);\r\n }\r\n else {\r\n Object.defineProperty(key, this._name, {\r\n value: entry\r\n });\r\n }\r\n }\r\n entry.value = value;\r\n return this;\r\n }\r\n };\r\n}\r\nexport default WeakMap;\r\n//# sourceMappingURL=WeakMap.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/WeakMap.mjs\n// module id = ./node_modules/@dojo/framework/shim/WeakMap.mjs\n// module chunks = menu","import global from './global';\r\nimport { isArrayLike, isIterable } from './iterator';\r\nimport { MAX_SAFE_INTEGER } from './number';\r\nimport has from './support/has';\r\nimport { wrapNative } from './support/util';\r\nexport let from;\r\n/**\r\n * Creates a new array from the function parameters.\r\n *\r\n * @param arguments Any number of arguments for the array\r\n * @return An array from the given arguments\r\n */\r\nexport let of;\r\n/* ES6 Array instance methods */\r\n/**\r\n * Copies data internally within an array or array-like object.\r\n *\r\n * @param target The target array-like object\r\n * @param offset The index to start copying values to; if negative, it counts backwards from length\r\n * @param start The first (inclusive) index to copy; if negative, it counts backwards from length\r\n * @param end The last (exclusive) index to copy; if negative, it counts backwards from length\r\n * @return The target\r\n */\r\nexport let copyWithin;\r\n/**\r\n * Fills elements of an array-like object with the specified value.\r\n *\r\n * @param target The target to fill\r\n * @param value The value to fill each element of the target with\r\n * @param start The first index to fill\r\n * @param end The (exclusive) index at which to stop filling\r\n * @return The filled target\r\n */\r\nexport let fill;\r\n/**\r\n * Finds and returns the first instance matching the callback or undefined if one is not found.\r\n *\r\n * @param target An array-like object\r\n * @param callback A function returning if the current value matches a criteria\r\n * @param thisArg The execution context for the find function\r\n * @return The first element matching the callback, or undefined if one does not exist\r\n */\r\nexport let find;\r\n/**\r\n * Performs a linear search and returns the first index whose value satisfies the passed callback,\r\n * or -1 if no values satisfy it.\r\n *\r\n * @param target An array-like object\r\n * @param callback A function returning true if the current value satisfies its criteria\r\n * @param thisArg The execution context for the find function\r\n * @return The first index whose value satisfies the passed callback, or -1 if no values satisfy it\r\n */\r\nexport let findIndex;\r\n/* ES7 Array instance methods */\r\n/**\r\n * Determines whether an array includes a given value\r\n *\r\n * @param target the target array-like object\r\n * @param searchElement the item to search for\r\n * @param fromIndex the starting index to search from\r\n * @return `true` if the array includes the element, otherwise `false`\r\n */\r\nexport let includes;\r\nif (true && true) {\r\n from = global.Array.from;\r\n of = global.Array.of;\r\n copyWithin = wrapNative(global.Array.prototype.copyWithin);\r\n fill = wrapNative(global.Array.prototype.fill);\r\n find = wrapNative(global.Array.prototype.find);\r\n findIndex = wrapNative(global.Array.prototype.findIndex);\r\n}\r\nelse {\r\n // It is only older versions of Safari/iOS that have a bad fill implementation and so aren't in the wild\r\n // To make things easier, if there is a bad fill implementation, the whole set of functions will be filled\r\n /**\r\n * Ensures a non-negative, non-infinite, safe integer.\r\n *\r\n * @param length The number to validate\r\n * @return A proper length\r\n */\r\n const toLength = function toLength(length) {\r\n if (isNaN(length)) {\r\n return 0;\r\n }\r\n length = Number(length);\r\n if (isFinite(length)) {\r\n length = Math.floor(length);\r\n }\r\n // Ensure a non-negative, real, safe integer\r\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\r\n };\r\n /**\r\n * From ES6 7.1.4 ToInteger()\r\n *\r\n * @param value A value to convert\r\n * @return An integer\r\n */\r\n const toInteger = function toInteger(value) {\r\n value = Number(value);\r\n if (isNaN(value)) {\r\n return 0;\r\n }\r\n if (value === 0 || !isFinite(value)) {\r\n return value;\r\n }\r\n return (value > 0 ? 1 : -1) * Math.floor(Math.abs(value));\r\n };\r\n /**\r\n * Normalizes an offset against a given length, wrapping it if negative.\r\n *\r\n * @param value The original offset\r\n * @param length The total length to normalize against\r\n * @return If negative, provide a distance from the end (length); otherwise provide a distance from 0\r\n */\r\n const normalizeOffset = function normalizeOffset(value, length) {\r\n return value < 0 ? Math.max(length + value, 0) : Math.min(value, length);\r\n };\r\n from = function from(arrayLike, mapFunction, thisArg) {\r\n if (arrayLike == null) {\r\n throw new TypeError('from: requires an array-like object');\r\n }\r\n if (mapFunction && thisArg) {\r\n mapFunction = mapFunction.bind(thisArg);\r\n }\r\n /* tslint:disable-next-line:variable-name */\r\n const Constructor = this;\r\n const length = toLength(arrayLike.length);\r\n // Support extension\r\n const array = typeof Constructor === 'function' ? Object(new Constructor(length)) : new Array(length);\r\n if (!isArrayLike(arrayLike) && !isIterable(arrayLike)) {\r\n return array;\r\n }\r\n // if this is an array and the normalized length is 0, just return an empty array. this prevents a problem\r\n // with the iteration on IE when using a NaN array length.\r\n if (isArrayLike(arrayLike)) {\r\n if (length === 0) {\r\n return [];\r\n }\r\n for (let i = 0; i < arrayLike.length; i++) {\r\n array[i] = mapFunction ? mapFunction(arrayLike[i], i) : arrayLike[i];\r\n }\r\n }\r\n else {\r\n let i = 0;\r\n for (const value of arrayLike) {\r\n array[i] = mapFunction ? mapFunction(value, i) : value;\r\n i++;\r\n }\r\n }\r\n if (arrayLike.length !== undefined) {\r\n array.length = length;\r\n }\r\n return array;\r\n };\r\n of = function of(...items) {\r\n return Array.prototype.slice.call(items);\r\n };\r\n copyWithin = function copyWithin(target, offset, start, end) {\r\n if (target == null) {\r\n throw new TypeError('copyWithin: target must be an array-like object');\r\n }\r\n const length = toLength(target.length);\r\n offset = normalizeOffset(toInteger(offset), length);\r\n start = normalizeOffset(toInteger(start), length);\r\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\r\n let count = Math.min(end - start, length - offset);\r\n let direction = 1;\r\n if (offset > start && offset < start + count) {\r\n direction = -1;\r\n start += count - 1;\r\n offset += count - 1;\r\n }\r\n while (count > 0) {\r\n if (start in target) {\r\n target[offset] = target[start];\r\n }\r\n else {\r\n delete target[offset];\r\n }\r\n offset += direction;\r\n start += direction;\r\n count--;\r\n }\r\n return target;\r\n };\r\n fill = function fill(target, value, start, end) {\r\n const length = toLength(target.length);\r\n let i = normalizeOffset(toInteger(start), length);\r\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\r\n while (i < end) {\r\n target[i++] = value;\r\n }\r\n return target;\r\n };\r\n find = function find(target, callback, thisArg) {\r\n const index = findIndex(target, callback, thisArg);\r\n return index !== -1 ? target[index] : undefined;\r\n };\r\n findIndex = function findIndex(target, callback, thisArg) {\r\n const length = toLength(target.length);\r\n if (!callback) {\r\n throw new TypeError('find: second argument must be a function');\r\n }\r\n if (thisArg) {\r\n callback = callback.bind(thisArg);\r\n }\r\n for (let i = 0; i < length; i++) {\r\n if (callback(target[i], i, target)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n };\r\n}\r\nif (true) {\r\n includes = wrapNative(global.Array.prototype.includes);\r\n}\r\nelse {\r\n /**\r\n * Ensures a non-negative, non-infinite, safe integer.\r\n *\r\n * @param length The number to validate\r\n * @return A proper length\r\n */\r\n const toLength = function toLength(length) {\r\n length = Number(length);\r\n if (isNaN(length)) {\r\n return 0;\r\n }\r\n if (isFinite(length)) {\r\n length = Math.floor(length);\r\n }\r\n // Ensure a non-negative, real, safe integer\r\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\r\n };\r\n includes = function includes(target, searchElement, fromIndex = 0) {\r\n let len = toLength(target.length);\r\n for (let i = fromIndex; i < len; ++i) {\r\n const currentElement = target[i];\r\n if (searchElement === currentElement ||\r\n (searchElement !== searchElement && currentElement !== currentElement)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n}\r\n//# sourceMappingURL=array.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/array.mjs\n// module id = ./node_modules/@dojo/framework/shim/array.mjs\n// module chunks = menu","const globalObject = (function () {\n if (typeof global !== 'undefined') {\n // global spec defines a reference to the global object called 'global'\n // https://github.com/tc39/proposal-global\n // `global` is also defined in NodeJS\n return global;\n }\n else if (typeof window !== 'undefined') {\n // window is defined in browsers\n return window;\n }\n else if (typeof self !== 'undefined') {\n // self is defined in WebWorkers\n return self;\n }\n})();\nexport default globalObject;\n//# sourceMappingURL=global.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/global.mjs\n// module id = ./node_modules/@dojo/framework/shim/global.mjs\n// module chunks = menu","import global from './global';\n/**\n * The smallest interval between two representable numbers.\n */\nexport const EPSILON = 1;\n/**\n * The maximum safe integer in JavaScript\n */\nexport const MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n/**\n * The minimum safe integer in JavaScript\n */\nexport const MIN_SAFE_INTEGER = -MAX_SAFE_INTEGER;\n/**\n * Determines whether the passed value is NaN without coersion.\n *\n * @param value The value to test\n * @return true if the value is NaN, false if it is not\n */\nexport function isNaN(value) {\n return typeof value === 'number' && global.isNaN(value);\n}\n/**\n * Determines whether the passed value is a finite number without coersion.\n *\n * @param value The value to test\n * @return true if the value is finite, false if it is not\n */\nexport function isFinite(value) {\n return typeof value === 'number' && global.isFinite(value);\n}\n/**\n * Determines whether the passed value is an integer.\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isInteger(value) {\n return isFinite(value) && Math.floor(value) === value;\n}\n/**\n * Determines whether the passed value is an integer that is 'safe,' meaning:\n * 1. it can be expressed as an IEEE-754 double precision number\n * 2. it has a one-to-one mapping to a mathematical integer, meaning its\n * IEEE-754 representation cannot be the result of rounding any other\n * integer to fit the IEEE-754 representation\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isSafeInteger(value) {\n return isInteger(value) && Math.abs(value) <= MAX_SAFE_INTEGER;\n}\n//# sourceMappingURL=number.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/number.mjs\n// module id = ./node_modules/@dojo/framework/shim/number.mjs\n// module chunks = menu","import global from './global';\r\nimport has from './support/has';\r\nimport { isSymbol } from './Symbol';\r\nexport let assign;\r\n/**\r\n * Gets the own property descriptor of the specified object.\r\n * An own property descriptor is one that is defined directly on the object and is not\r\n * inherited from the object's prototype.\r\n * @param o Object that contains the property.\r\n * @param p Name of the property.\r\n */\r\nexport let getOwnPropertyDescriptor;\r\n/**\r\n * Returns the names of the own properties of an object. The own properties of an object are those that are defined directly\r\n * on that object, and are not inherited from the object's prototype. The properties of an object include both fields (objects) and functions.\r\n * @param o Object that contains the own properties.\r\n */\r\nexport let getOwnPropertyNames;\r\n/**\r\n * Returns an array of all symbol properties found directly on object o.\r\n * @param o Object to retrieve the symbols from.\r\n */\r\nexport let getOwnPropertySymbols;\r\n/**\r\n * Returns true if the values are the same value, false otherwise.\r\n * @param value1 The first value.\r\n * @param value2 The second value.\r\n */\r\nexport let is;\r\n/**\r\n * Returns the names of the enumerable properties and methods of an object.\r\n * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.\r\n */\r\nexport let keys;\r\n/* ES7 Object static methods */\r\nexport let getOwnPropertyDescriptors;\r\nexport let entries;\r\nexport let values;\r\nif (true) {\r\n const globalObject = global.Object;\r\n assign = globalObject.assign;\r\n getOwnPropertyDescriptor = globalObject.getOwnPropertyDescriptor;\r\n getOwnPropertyNames = globalObject.getOwnPropertyNames;\r\n getOwnPropertySymbols = globalObject.getOwnPropertySymbols;\r\n is = globalObject.is;\r\n keys = globalObject.keys;\r\n}\r\nelse {\r\n keys = function symbolAwareKeys(o) {\r\n return Object.keys(o).filter((key) => !Boolean(key.match(/^@@.+/)));\r\n };\r\n assign = function assign(target, ...sources) {\r\n if (target == null) {\r\n // TypeError if undefined or null\r\n throw new TypeError('Cannot convert undefined or null to object');\r\n }\r\n const to = Object(target);\r\n sources.forEach((nextSource) => {\r\n if (nextSource) {\r\n // Skip over if undefined or null\r\n keys(nextSource).forEach((nextKey) => {\r\n to[nextKey] = nextSource[nextKey];\r\n });\r\n }\r\n });\r\n return to;\r\n };\r\n getOwnPropertyDescriptor = function getOwnPropertyDescriptor(o, prop) {\r\n if (isSymbol(prop)) {\r\n return Object.getOwnPropertyDescriptor(o, prop);\r\n }\r\n else {\r\n return Object.getOwnPropertyDescriptor(o, prop);\r\n }\r\n };\r\n getOwnPropertyNames = function getOwnPropertyNames(o) {\r\n return Object.getOwnPropertyNames(o).filter((key) => !Boolean(key.match(/^@@.+/)));\r\n };\r\n getOwnPropertySymbols = function getOwnPropertySymbols(o) {\r\n return Object.getOwnPropertyNames(o)\r\n .filter((key) => Boolean(key.match(/^@@.+/)))\r\n .map((key) => Symbol.for(key.substring(2)));\r\n };\r\n is = function is(value1, value2) {\r\n if (value1 === value2) {\r\n return value1 !== 0 || 1 / value1 === 1 / value2; // -0\r\n }\r\n return value1 !== value1 && value2 !== value2; // NaN\r\n };\r\n}\r\nif (true) {\r\n const globalObject = global.Object;\r\n getOwnPropertyDescriptors = globalObject.getOwnPropertyDescriptors;\r\n entries = globalObject.entries;\r\n values = globalObject.values;\r\n}\r\nelse {\r\n getOwnPropertyDescriptors = function getOwnPropertyDescriptors(o) {\r\n return getOwnPropertyNames(o).reduce((previous, key) => {\r\n previous[key] = getOwnPropertyDescriptor(o, key);\r\n return previous;\r\n }, {});\r\n };\r\n entries = function entries(o) {\r\n return keys(o).map((key) => [key, o[key]]);\r\n };\r\n values = function values(o) {\r\n return keys(o).map((key) => o[key]);\r\n };\r\n}\r\n//# sourceMappingURL=object.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/object.mjs\n// module id = ./node_modules/@dojo/framework/shim/object.mjs\n// module chunks = menu","import global from './global';\r\nimport has from './support/has';\r\nimport { wrapNative } from './support/util';\r\n/**\r\n * The minimum location of high surrogates\r\n */\r\nexport const HIGH_SURROGATE_MIN = 0xd800;\r\n/**\r\n * The maximum location of high surrogates\r\n */\r\nexport const HIGH_SURROGATE_MAX = 0xdbff;\r\n/**\r\n * The minimum location of low surrogates\r\n */\r\nexport const LOW_SURROGATE_MIN = 0xdc00;\r\n/**\r\n * The maximum location of low surrogates\r\n */\r\nexport const LOW_SURROGATE_MAX = 0xdfff;\r\n/* ES6 static methods */\r\n/**\r\n * Return the String value whose elements are, in order, the elements in the List elements.\r\n * If length is 0, the empty string is returned.\r\n * @param codePoints The code points to generate the string\r\n */\r\nexport let fromCodePoint;\r\n/**\r\n * `raw` is intended for use as a tag function of a Tagged Template String. When called\r\n * as such the first argument will be a well formed template call site object and the rest\r\n * parameter will contain the substitution values.\r\n * @param template A well-formed template string call site representation.\r\n * @param substitutions A set of substitution values.\r\n */\r\nexport let raw;\r\n/* ES6 instance methods */\r\n/**\r\n * Returns a nonnegative integer Number less than 1114112 (0x110000) that is the code point\r\n * value of the UTF-16 encoded code point starting at the string element at position pos in\r\n * the String resulting from converting this object to a String.\r\n * If there is no element at that position, the result is undefined.\r\n * If a valid UTF-16 surrogate pair does not begin at pos, the result is the code unit at pos.\r\n */\r\nexport let codePointAt;\r\n/**\r\n * Returns true if the sequence of elements of searchString converted to a String is the\r\n * same as the corresponding elements of this object (converted to a String) starting at\r\n * endPosition – length(this). Otherwise returns false.\r\n */\r\nexport let endsWith;\r\n/**\r\n * Returns true if searchString appears as a substring of the result of converting this\r\n * object to a String, at one or more positions that are\r\n * greater than or equal to position; otherwise, returns false.\r\n * @param target The target string\r\n * @param searchString search string\r\n * @param position If position is undefined, 0 is assumed, so as to search all of the String.\r\n */\r\nexport let includes;\r\n/**\r\n * Returns the String value result of normalizing the string into the normalization form\r\n * named by form as specified in Unicode Standard Annex #15, Unicode Normalization Forms.\r\n * @param target The target string\r\n * @param form Applicable values: \"NFC\", \"NFD\", \"NFKC\", or \"NFKD\", If not specified default\r\n * is \"NFC\"\r\n */\r\nexport let normalize;\r\n/**\r\n * Returns a String value that is made from count copies appended together. If count is 0,\r\n * T is the empty String is returned.\r\n * @param count number of copies to append\r\n */\r\nexport let repeat;\r\n/**\r\n * Returns true if the sequence of elements of searchString converted to a String is the\r\n * same as the corresponding elements of this object (converted to a String) starting at\r\n * position. Otherwise returns false.\r\n */\r\nexport let startsWith;\r\n/* ES7 instance methods */\r\n/**\r\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\r\n * The padding is applied from the end (right) of the current string.\r\n *\r\n * @param target The target string\r\n * @param maxLength The length of the resulting string once the current string has been padded.\r\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\r\n *\r\n * @param fillString The string to pad the current string with.\r\n * If this string is too long, it will be truncated and the left-most part will be applied.\r\n * The default value for this parameter is \" \" (U+0020).\r\n */\r\nexport let padEnd;\r\n/**\r\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\r\n * The padding is applied from the start (left) of the current string.\r\n *\r\n * @param target The target string\r\n * @param maxLength The length of the resulting string once the current string has been padded.\r\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\r\n *\r\n * @param fillString The string to pad the current string with.\r\n * If this string is too long, it will be truncated and the left-most part will be applied.\r\n * The default value for this parameter is \" \" (U+0020).\r\n */\r\nexport let padStart;\r\nif (true && true) {\r\n fromCodePoint = global.String.fromCodePoint;\r\n raw = global.String.raw;\r\n codePointAt = wrapNative(global.String.prototype.codePointAt);\r\n endsWith = wrapNative(global.String.prototype.endsWith);\r\n includes = wrapNative(global.String.prototype.includes);\r\n normalize = wrapNative(global.String.prototype.normalize);\r\n repeat = wrapNative(global.String.prototype.repeat);\r\n startsWith = wrapNative(global.String.prototype.startsWith);\r\n}\r\nelse {\r\n /**\r\n * Validates that text is defined, and normalizes position (based on the given default if the input is NaN).\r\n * Used by startsWith, includes, and endsWith.\r\n *\r\n * @return Normalized position.\r\n */\r\n const normalizeSubstringArgs = function (name, text, search, position, isEnd = false) {\r\n if (text == null) {\r\n throw new TypeError('string.' + name + ' requires a valid string to search against.');\r\n }\r\n const length = text.length;\r\n position = position !== position ? (isEnd ? length : 0) : position;\r\n return [text, String(search), Math.min(Math.max(position, 0), length)];\r\n };\r\n fromCodePoint = function fromCodePoint(...codePoints) {\r\n // Adapted from https://github.com/mathiasbynens/String.fromCodePoint\r\n const length = arguments.length;\r\n if (!length) {\r\n return '';\r\n }\r\n const fromCharCode = String.fromCharCode;\r\n const MAX_SIZE = 0x4000;\r\n let codeUnits = [];\r\n let index = -1;\r\n let result = '';\r\n while (++index < length) {\r\n let codePoint = Number(arguments[index]);\r\n // Code points must be finite integers within the valid range\r\n let isValid = isFinite(codePoint) && Math.floor(codePoint) === codePoint && codePoint >= 0 && codePoint <= 0x10ffff;\r\n if (!isValid) {\r\n throw RangeError('string.fromCodePoint: Invalid code point ' + codePoint);\r\n }\r\n if (codePoint <= 0xffff) {\r\n // BMP code point\r\n codeUnits.push(codePoint);\r\n }\r\n else {\r\n // Astral code point; split in surrogate halves\r\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\r\n codePoint -= 0x10000;\r\n let highSurrogate = (codePoint >> 10) + HIGH_SURROGATE_MIN;\r\n let lowSurrogate = codePoint % 0x400 + LOW_SURROGATE_MIN;\r\n codeUnits.push(highSurrogate, lowSurrogate);\r\n }\r\n if (index + 1 === length || codeUnits.length > MAX_SIZE) {\r\n result += fromCharCode.apply(null, codeUnits);\r\n codeUnits.length = 0;\r\n }\r\n }\r\n return result;\r\n };\r\n raw = function raw(callSite, ...substitutions) {\r\n let rawStrings = callSite.raw;\r\n let result = '';\r\n let numSubstitutions = substitutions.length;\r\n if (callSite == null || callSite.raw == null) {\r\n throw new TypeError('string.raw requires a valid callSite object with a raw value');\r\n }\r\n for (let i = 0, length = rawStrings.length; i < length; i++) {\r\n result += rawStrings[i] + (i < numSubstitutions && i < length - 1 ? substitutions[i] : '');\r\n }\r\n return result;\r\n };\r\n codePointAt = function codePointAt(text, position = 0) {\r\n // Adapted from https://github.com/mathiasbynens/String.prototype.codePointAt\r\n if (text == null) {\r\n throw new TypeError('string.codePointAt requries a valid string.');\r\n }\r\n const length = text.length;\r\n if (position !== position) {\r\n position = 0;\r\n }\r\n if (position < 0 || position >= length) {\r\n return undefined;\r\n }\r\n // Get the first code unit\r\n const first = text.charCodeAt(position);\r\n if (first >= HIGH_SURROGATE_MIN && first <= HIGH_SURROGATE_MAX && length > position + 1) {\r\n // Start of a surrogate pair (high surrogate and there is a next code unit); check for low surrogate\r\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\r\n const second = text.charCodeAt(position + 1);\r\n if (second >= LOW_SURROGATE_MIN && second <= LOW_SURROGATE_MAX) {\r\n return (first - HIGH_SURROGATE_MIN) * 0x400 + second - LOW_SURROGATE_MIN + 0x10000;\r\n }\r\n }\r\n return first;\r\n };\r\n endsWith = function endsWith(text, search, endPosition) {\r\n if (endPosition == null) {\r\n endPosition = text.length;\r\n }\r\n [text, search, endPosition] = normalizeSubstringArgs('endsWith', text, search, endPosition, true);\r\n const start = endPosition - search.length;\r\n if (start < 0) {\r\n return false;\r\n }\r\n return text.slice(start, endPosition) === search;\r\n };\r\n includes = function includes(text, search, position = 0) {\r\n [text, search, position] = normalizeSubstringArgs('includes', text, search, position);\r\n return text.indexOf(search, position) !== -1;\r\n };\r\n repeat = function repeat(text, count = 0) {\r\n // Adapted from https://github.com/mathiasbynens/String.prototype.repeat\r\n if (text == null) {\r\n throw new TypeError('string.repeat requires a valid string.');\r\n }\r\n if (count !== count) {\r\n count = 0;\r\n }\r\n if (count < 0 || count === Infinity) {\r\n throw new RangeError('string.repeat requires a non-negative finite count.');\r\n }\r\n let result = '';\r\n while (count) {\r\n if (count % 2) {\r\n result += text;\r\n }\r\n if (count > 1) {\r\n text += text;\r\n }\r\n count >>= 1;\r\n }\r\n return result;\r\n };\r\n startsWith = function startsWith(text, search, position = 0) {\r\n search = String(search);\r\n [text, search, position] = normalizeSubstringArgs('startsWith', text, search, position);\r\n const end = position + search.length;\r\n if (end > text.length) {\r\n return false;\r\n }\r\n return text.slice(position, end) === search;\r\n };\r\n}\r\nif (true) {\r\n padEnd = wrapNative(global.String.prototype.padEnd);\r\n padStart = wrapNative(global.String.prototype.padStart);\r\n}\r\nelse {\r\n padEnd = function padEnd(text, maxLength, fillString = ' ') {\r\n if (text === null || text === undefined) {\r\n throw new TypeError('string.repeat requires a valid string.');\r\n }\r\n if (maxLength === Infinity) {\r\n throw new RangeError('string.padEnd requires a non-negative finite count.');\r\n }\r\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\r\n maxLength = 0;\r\n }\r\n let strText = String(text);\r\n const padding = maxLength - strText.length;\r\n if (padding > 0) {\r\n strText +=\r\n repeat(fillString, Math.floor(padding / fillString.length)) +\r\n fillString.slice(0, padding % fillString.length);\r\n }\r\n return strText;\r\n };\r\n padStart = function padStart(text, maxLength, fillString = ' ') {\r\n if (text === null || text === undefined) {\r\n throw new TypeError('string.repeat requires a valid string.');\r\n }\r\n if (maxLength === Infinity) {\r\n throw new RangeError('string.padStart requires a non-negative finite count.');\r\n }\r\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\r\n maxLength = 0;\r\n }\r\n let strText = String(text);\r\n const padding = maxLength - strText.length;\r\n if (padding > 0) {\r\n strText =\r\n repeat(fillString, Math.floor(padding / fillString.length)) +\r\n fillString.slice(0, padding % fillString.length) +\r\n strText;\r\n }\r\n return strText;\r\n };\r\n}\r\n//# sourceMappingURL=string.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/string.mjs\n// module id = ./node_modules/@dojo/framework/shim/string.mjs\n// module chunks = menu","import has, { add } from '../../has/has';\r\nimport global from '../global';\r\nexport default has;\r\nexport * from '../../has/has';\r\n/* ECMAScript 6 and 7 Features */\r\n/* Array */\r\nadd('es6-array', () => {\r\n return (['from', 'of'].every((key) => key in global.Array) &&\r\n ['findIndex', 'find', 'copyWithin'].every((key) => key in global.Array.prototype));\r\n}, true);\r\nadd('es6-array-fill', () => {\r\n if ('fill' in global.Array.prototype) {\r\n /* Some versions of Safari do not properly implement this */\r\n return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1;\r\n }\r\n return false;\r\n}, true);\r\nadd('es7-array', () => 'includes' in global.Array.prototype, true);\r\n/* Map */\r\nadd('es6-map', () => {\r\n if (typeof global.Map === 'function') {\r\n /*\r\n IE11 and older versions of Safari are missing critical ES6 Map functionality\r\n We wrap this in a try/catch because sometimes the Map constructor exists, but does not\r\n take arguments (iOS 8.4)\r\n */\r\n try {\r\n const map = new global.Map([[0, 1]]);\r\n return map.has(0) &&\r\n typeof map.keys === 'function' &&\r\n true &&\r\n typeof map.values === 'function' &&\r\n typeof map.entries === 'function';\r\n }\r\n catch (e) {\r\n /* istanbul ignore next: not testing on iOS at the moment */\r\n return false;\r\n }\r\n }\r\n return false;\r\n}, true);\r\n/* Math */\r\nadd('es6-math', () => {\r\n return [\r\n 'clz32',\r\n 'sign',\r\n 'log10',\r\n 'log2',\r\n 'log1p',\r\n 'expm1',\r\n 'cosh',\r\n 'sinh',\r\n 'tanh',\r\n 'acosh',\r\n 'asinh',\r\n 'atanh',\r\n 'trunc',\r\n 'fround',\r\n 'cbrt',\r\n 'hypot'\r\n ].every((name) => typeof global.Math[name] === 'function');\r\n}, true);\r\nadd('es6-math-imul', () => {\r\n if ('imul' in global.Math) {\r\n /* Some versions of Safari on ios do not properly implement this */\r\n return Math.imul(0xffffffff, 5) === -5;\r\n }\r\n return false;\r\n}, true);\r\n/* Object */\r\nadd('es6-object', () => {\r\n return true &&\r\n ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof global.Object[name] === 'function');\r\n}, true);\r\nadd('es2017-object', () => {\r\n return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof global.Object[name] === 'function');\r\n}, true);\r\n/* Observable */\r\nadd('es-observable', () => typeof global.Observable !== 'undefined', true);\r\n/* Promise */\r\nadd('es6-promise', () => typeof global.Promise !== 'undefined' && true, true);\r\n/* Set */\r\nadd('es6-set', () => {\r\n if (typeof global.Set === 'function') {\r\n /* IE11 and older versions of Safari are missing critical ES6 Set functionality */\r\n const set = new global.Set([1]);\r\n return set.has(1) && 'keys' in set && typeof set.keys === 'function' && true;\r\n }\r\n return false;\r\n}, true);\r\n/* String */\r\nadd('es6-string', () => {\r\n return ([\r\n /* static methods */\r\n 'fromCodePoint'\r\n ].every((key) => typeof global.String[key] === 'function') &&\r\n [\r\n /* instance methods */\r\n 'codePointAt',\r\n 'normalize',\r\n 'repeat',\r\n 'startsWith',\r\n 'endsWith',\r\n 'includes'\r\n ].every((key) => typeof global.String.prototype[key] === 'function'));\r\n}, true);\r\nadd('es6-string-raw', () => {\r\n function getCallSite(callSite, ...substitutions) {\r\n const result = [...callSite];\r\n result.raw = callSite.raw;\r\n return result;\r\n }\r\n if ('raw' in global.String) {\r\n let b = 1;\r\n let callSite = getCallSite `a\\n${b}`;\r\n callSite.raw = ['a\\\\n'];\r\n const supportsTrunc = global.String.raw(callSite, 42) === 'a:\\\\n';\r\n return supportsTrunc;\r\n }\r\n return false;\r\n}, true);\r\nadd('es2017-string', () => {\r\n return ['padStart', 'padEnd'].every((key) => typeof global.String.prototype[key] === 'function');\r\n}, true);\r\n/* Symbol */\r\nadd('es6-symbol', () => typeof global.Symbol !== 'undefined' && typeof Symbol() === 'symbol', true);\r\n/* WeakMap */\r\nadd('es6-weakmap', () => {\r\n if (typeof global.WeakMap !== 'undefined') {\r\n /* IE11 and older versions of Safari are missing critical ES6 Map functionality */\r\n const key1 = {};\r\n const key2 = {};\r\n const map = new global.WeakMap([[key1, 1]]);\r\n Object.freeze(key1);\r\n return map.get(key1) === 1 && map.set(key2, 2) === map && true;\r\n }\r\n return false;\r\n}, true);\r\n/* Miscellaneous features */\r\nadd('microtasks', () => true || false || true, true);\r\nadd('postmessage', () => {\r\n // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have\r\n // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist.\r\n return typeof global.window !== 'undefined' && typeof global.postMessage === 'function';\r\n}, true);\r\nadd('raf', () => typeof global.requestAnimationFrame === 'function', true);\r\nadd('setimmediate', () => typeof global.setImmediate !== 'undefined', true);\r\n/* DOM Features */\r\nadd('dom-mutationobserver', () => {\r\n if (true && Boolean(global.MutationObserver || global.WebKitMutationObserver)) {\r\n // IE11 has an unreliable MutationObserver implementation where setProperty() does not\r\n // generate a mutation event, observers can crash, and the queue does not drain\r\n // reliably. The following feature test was adapted from\r\n // https://gist.github.com/t10ko/4aceb8c71681fdb275e33efe5e576b14\r\n const example = document.createElement('div');\r\n /* tslint:disable-next-line:variable-name */\r\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\r\n const observer = new HostMutationObserver(function () { });\r\n observer.observe(example, { attributes: true });\r\n example.style.setProperty('display', 'block');\r\n return Boolean(observer.takeRecords().length);\r\n }\r\n return false;\r\n}, true);\r\nadd('dom-webanimation', () => true && global.Animation !== undefined && global.KeyframeEffect !== undefined, true);\r\n//# sourceMappingURL=has.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/support/has.mjs\n// module id = ./node_modules/@dojo/framework/shim/support/has.mjs\n// module chunks = menu","import global from '../global';\r\nimport has from './has';\r\nfunction executeTask(item) {\r\n if (item && item.isActive && item.callback) {\r\n item.callback();\r\n }\r\n}\r\nfunction getQueueHandle(item, destructor) {\r\n return {\r\n destroy: function () {\r\n this.destroy = function () { };\r\n item.isActive = false;\r\n item.callback = null;\r\n if (destructor) {\r\n destructor();\r\n }\r\n }\r\n };\r\n}\r\nlet checkMicroTaskQueue;\r\nlet microTasks;\r\n/**\r\n * Schedules a callback to the macrotask queue.\r\n *\r\n * @param callback the function to be queued and later executed.\r\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\r\n */\r\nexport const queueTask = (function () {\r\n let destructor;\r\n let enqueue;\r\n // Since the IE implementation of `setImmediate` is not flawless, we will test for `postMessage` first.\r\n if (true) {\r\n const queue = [];\r\n global.addEventListener('message', function (event) {\r\n // Confirm that the event was triggered by the current window and by this particular implementation.\r\n if (event.source === global && event.data === 'dojo-queue-message') {\r\n event.stopPropagation();\r\n if (queue.length) {\r\n executeTask(queue.shift());\r\n }\r\n }\r\n });\r\n enqueue = function (item) {\r\n queue.push(item);\r\n global.postMessage('dojo-queue-message', '*');\r\n };\r\n }\r\n else if (false) {\r\n destructor = global.clearImmediate;\r\n enqueue = function (item) {\r\n return setImmediate(executeTask.bind(null, item));\r\n };\r\n }\r\n else {\r\n destructor = global.clearTimeout;\r\n enqueue = function (item) {\r\n return setTimeout(executeTask.bind(null, item), 0);\r\n };\r\n }\r\n function queueTask(callback) {\r\n const item = {\r\n isActive: true,\r\n callback: callback\r\n };\r\n const id = enqueue(item);\r\n return getQueueHandle(item, destructor &&\r\n function () {\r\n destructor(id);\r\n });\r\n }\r\n // TODO: Use aspect.before when it is available.\r\n return true\r\n ? queueTask\r\n : function (callback) {\r\n checkMicroTaskQueue();\r\n return queueTask(callback);\r\n };\r\n})();\r\n// When no mechanism for registering microtasks is exposed by the environment, microtasks will\r\n// be queued and then executed in a single macrotask before the other macrotasks are executed.\r\nif (!true) {\r\n let isMicroTaskQueued = false;\r\n microTasks = [];\r\n checkMicroTaskQueue = function () {\r\n if (!isMicroTaskQueued) {\r\n isMicroTaskQueued = true;\r\n queueTask(function () {\r\n isMicroTaskQueued = false;\r\n if (microTasks.length) {\r\n let item;\r\n while ((item = microTasks.shift())) {\r\n executeTask(item);\r\n }\r\n }\r\n });\r\n }\r\n };\r\n}\r\n/**\r\n * Schedules an animation task with `window.requestAnimationFrame` if it exists, or with `queueTask` otherwise.\r\n *\r\n * Since requestAnimationFrame's behavior does not match that expected from `queueTask`, it is not used there.\r\n * However, at times it makes more sense to delegate to requestAnimationFrame; hence the following method.\r\n *\r\n * @param callback the function to be queued and later executed.\r\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\r\n */\r\nexport const queueAnimationTask = (function () {\r\n if (!true) {\r\n return queueTask;\r\n }\r\n function queueAnimationTask(callback) {\r\n const item = {\r\n isActive: true,\r\n callback: callback\r\n };\r\n const rafId = requestAnimationFrame(executeTask.bind(null, item));\r\n return getQueueHandle(item, function () {\r\n cancelAnimationFrame(rafId);\r\n });\r\n }\r\n // TODO: Use aspect.before when it is available.\r\n return true\r\n ? queueAnimationTask\r\n : function (callback) {\r\n checkMicroTaskQueue();\r\n return queueAnimationTask(callback);\r\n };\r\n})();\r\n/**\r\n * Schedules a callback to the microtask queue.\r\n *\r\n * Any callbacks registered with `queueMicroTask` will be executed before the next macrotask. If no native\r\n * mechanism for scheduling macrotasks is exposed, then any callbacks will be fired before any macrotask\r\n * registered with `queueTask` or `queueAnimationTask`.\r\n *\r\n * @param callback the function to be queued and later executed.\r\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\r\n */\r\nexport let queueMicroTask = (function () {\r\n let enqueue;\r\n if (false) {\r\n enqueue = function (item) {\r\n global.process.nextTick(executeTask.bind(null, item));\r\n };\r\n }\r\n else if (true) {\r\n enqueue = function (item) {\r\n global.Promise.resolve(item).then(executeTask);\r\n };\r\n }\r\n else if (true) {\r\n /* tslint:disable-next-line:variable-name */\r\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\r\n const node = document.createElement('div');\r\n const queue = [];\r\n const observer = new HostMutationObserver(function () {\r\n while (queue.length > 0) {\r\n const item = queue.shift();\r\n if (item && item.isActive && item.callback) {\r\n item.callback();\r\n }\r\n }\r\n });\r\n observer.observe(node, { attributes: true });\r\n enqueue = function (item) {\r\n queue.push(item);\r\n node.setAttribute('queueStatus', '1');\r\n };\r\n }\r\n else {\r\n enqueue = function (item) {\r\n checkMicroTaskQueue();\r\n microTasks.push(item);\r\n };\r\n }\r\n return function (callback) {\r\n const item = {\r\n isActive: true,\r\n callback: callback\r\n };\r\n enqueue(item);\r\n return getQueueHandle(item);\r\n };\r\n})();\r\n//# sourceMappingURL=queue.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/support/queue.mjs\n// module id = ./node_modules/@dojo/framework/shim/support/queue.mjs\n// module chunks = menu","/**\n * Helper function to generate a value property descriptor\n *\n * @param value The value the property descriptor should be set to\n * @param enumerable If the property should be enumberable, defaults to false\n * @param writable If the property should be writable, defaults to true\n * @param configurable If the property should be configurable, defaults to true\n * @return The property descriptor object\n */\nexport function getValueDescriptor(value, enumerable = false, writable = true, configurable = true) {\n return {\n value: value,\n enumerable: enumerable,\n writable: writable,\n configurable: configurable\n };\n}\nexport function wrapNative(nativeFunction) {\n return function (target, ...args) {\n return nativeFunction.apply(target, args);\n };\n}\n//# sourceMappingURL=util.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/shim/support/util.mjs\n// module id = ./node_modules/@dojo/framework/shim/support/util.mjs\n// module chunks = menu","import { Evented } from '../core/Evented';\nexport class Injector extends Evented {\n constructor(payload) {\n super();\n this._payload = payload;\n }\n setInvalidator(invalidator) {\n this._invalidator = invalidator;\n }\n get() {\n return this._payload;\n }\n set(payload) {\n this._payload = payload;\n if (this._invalidator) {\n this._invalidator();\n }\n }\n}\nexport default Injector;\n//# sourceMappingURL=Injector.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/Injector.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/Injector.mjs\n// module chunks = menu","import { Evented } from '../core/Evented';\r\nimport Map from '../shim/Map';\r\n/**\r\n * Enum to identify the type of event.\r\n * Listening to 'Projector' will notify when projector is created or updated\r\n * Listening to 'Widget' will notify when widget root is created or updated\r\n */\r\nexport var NodeEventType;\r\n(function (NodeEventType) {\r\n NodeEventType[\"Projector\"] = \"Projector\";\r\n NodeEventType[\"Widget\"] = \"Widget\";\r\n})(NodeEventType || (NodeEventType = {}));\r\nexport class NodeHandler extends Evented {\r\n constructor() {\r\n super(...arguments);\r\n this._nodeMap = new Map();\r\n }\r\n get(key) {\r\n return this._nodeMap.get(key);\r\n }\r\n has(key) {\r\n return this._nodeMap.has(key);\r\n }\r\n add(element, key) {\r\n this._nodeMap.set(key, element);\r\n this.emit({ type: key });\r\n }\r\n addRoot() {\r\n this.emit({ type: NodeEventType.Widget });\r\n }\r\n addProjector() {\r\n this.emit({ type: NodeEventType.Projector });\r\n }\r\n clear() {\r\n this._nodeMap.clear();\r\n }\r\n}\r\nexport default NodeHandler;\r\n//# sourceMappingURL=NodeHandler.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/NodeHandler.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/NodeHandler.mjs\n// module chunks = menu","import Promise from '../shim/Promise';\r\nimport Map from '../shim/Map';\r\nimport Symbol from '../shim/Symbol';\r\nimport { Evented } from '../core/Evented';\r\n/**\r\n * Widget base symbol type\r\n */\r\nexport const WIDGET_BASE_TYPE = Symbol('Widget Base');\r\n/**\r\n * Checks is the item is a subclass of WidgetBase (or a WidgetBase)\r\n *\r\n * @param item the item to check\r\n * @returns true/false indicating if the item is a WidgetBaseConstructor\r\n */\r\nexport function isWidgetBaseConstructor(item) {\r\n return Boolean(item && item._type === WIDGET_BASE_TYPE);\r\n}\r\nexport function isWidgetConstructorDefaultExport(item) {\r\n return Boolean(item &&\r\n item.hasOwnProperty('__esModule') &&\r\n item.hasOwnProperty('default') &&\r\n isWidgetBaseConstructor(item.default));\r\n}\r\n/**\r\n * The Registry implementation\r\n */\r\nexport class Registry extends Evented {\r\n /**\r\n * Emit loaded event for registry label\r\n */\r\n emitLoadedEvent(widgetLabel, item) {\r\n this.emit({\r\n type: widgetLabel,\r\n action: 'loaded',\r\n item\r\n });\r\n }\r\n define(label, item) {\r\n if (this._widgetRegistry === undefined) {\r\n this._widgetRegistry = new Map();\r\n }\r\n if (this._widgetRegistry.has(label)) {\r\n throw new Error(`widget has already been registered for '${label.toString()}'`);\r\n }\r\n this._widgetRegistry.set(label, item);\r\n if (item instanceof Promise) {\r\n item.then((widgetCtor) => {\r\n this._widgetRegistry.set(label, widgetCtor);\r\n this.emitLoadedEvent(label, widgetCtor);\r\n return widgetCtor;\r\n }, (error) => {\r\n throw error;\r\n });\r\n }\r\n else if (isWidgetBaseConstructor(item)) {\r\n this.emitLoadedEvent(label, item);\r\n }\r\n }\r\n defineInjector(label, injectorFactory) {\r\n if (this._injectorRegistry === undefined) {\r\n this._injectorRegistry = new Map();\r\n }\r\n if (this._injectorRegistry.has(label)) {\r\n throw new Error(`injector has already been registered for '${label.toString()}'`);\r\n }\r\n const invalidator = new Evented();\r\n const injectorItem = {\r\n injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })),\r\n invalidator\r\n };\r\n this._injectorRegistry.set(label, injectorItem);\r\n this.emitLoadedEvent(label, injectorItem);\r\n }\r\n get(label) {\r\n if (!this._widgetRegistry || !this.has(label)) {\r\n return null;\r\n }\r\n const item = this._widgetRegistry.get(label);\r\n if (isWidgetBaseConstructor(item)) {\r\n return item;\r\n }\r\n if (item instanceof Promise) {\r\n return null;\r\n }\r\n const promise = item();\r\n this._widgetRegistry.set(label, promise);\r\n promise.then((widgetCtor) => {\r\n if (isWidgetConstructorDefaultExport(widgetCtor)) {\r\n widgetCtor = widgetCtor.default;\r\n }\r\n this._widgetRegistry.set(label, widgetCtor);\r\n this.emitLoadedEvent(label, widgetCtor);\r\n return widgetCtor;\r\n }, (error) => {\r\n throw error;\r\n });\r\n return null;\r\n }\r\n getInjector(label) {\r\n if (!this._injectorRegistry || !this.hasInjector(label)) {\r\n return null;\r\n }\r\n return this._injectorRegistry.get(label);\r\n }\r\n has(label) {\r\n return Boolean(this._widgetRegistry && this._widgetRegistry.has(label));\r\n }\r\n hasInjector(label) {\r\n return Boolean(this._injectorRegistry && this._injectorRegistry.has(label));\r\n }\r\n}\r\nexport default Registry;\r\n//# sourceMappingURL=Registry.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/Registry.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/Registry.mjs\n// module chunks = menu","import { Map } from '../shim/Map';\r\nimport { Evented } from '../core/Evented';\r\nimport { Registry } from './Registry';\r\nexport class RegistryHandler extends Evented {\r\n constructor() {\r\n super();\r\n this._registry = new Registry();\r\n this._registryWidgetLabelMap = new Map();\r\n this._registryInjectorLabelMap = new Map();\r\n this.own(this._registry);\r\n const destroy = () => {\r\n if (this.baseRegistry) {\r\n this._registryWidgetLabelMap.delete(this.baseRegistry);\r\n this._registryInjectorLabelMap.delete(this.baseRegistry);\r\n this.baseRegistry = undefined;\r\n }\r\n };\r\n this.own({ destroy });\r\n }\r\n set base(baseRegistry) {\r\n if (this.baseRegistry) {\r\n this._registryWidgetLabelMap.delete(this.baseRegistry);\r\n this._registryInjectorLabelMap.delete(this.baseRegistry);\r\n }\r\n this.baseRegistry = baseRegistry;\r\n }\r\n define(label, widget) {\r\n this._registry.define(label, widget);\r\n }\r\n defineInjector(label, injector) {\r\n this._registry.defineInjector(label, injector);\r\n }\r\n has(label) {\r\n return this._registry.has(label) || Boolean(this.baseRegistry && this.baseRegistry.has(label));\r\n }\r\n hasInjector(label) {\r\n return this._registry.hasInjector(label) || Boolean(this.baseRegistry && this.baseRegistry.hasInjector(label));\r\n }\r\n get(label, globalPrecedence = false) {\r\n return this._get(label, globalPrecedence, 'get', this._registryWidgetLabelMap);\r\n }\r\n getInjector(label, globalPrecedence = false) {\r\n return this._get(label, globalPrecedence, 'getInjector', this._registryInjectorLabelMap);\r\n }\r\n _get(label, globalPrecedence, getFunctionName, labelMap) {\r\n const registries = globalPrecedence ? [this.baseRegistry, this._registry] : [this._registry, this.baseRegistry];\r\n for (let i = 0; i < registries.length; i++) {\r\n const registry = registries[i];\r\n if (!registry) {\r\n continue;\r\n }\r\n const item = registry[getFunctionName](label);\r\n const registeredLabels = labelMap.get(registry) || [];\r\n if (item) {\r\n return item;\r\n }\r\n else if (registeredLabels.indexOf(label) === -1) {\r\n const handle = registry.on(label, (event) => {\r\n if (event.action === 'loaded' &&\r\n this[getFunctionName](label, globalPrecedence) === event.item) {\r\n this.emit({ type: 'invalidate' });\r\n }\r\n });\r\n this.own(handle);\r\n labelMap.set(registry, [...registeredLabels, label]);\r\n }\r\n }\r\n return null;\r\n }\r\n}\r\nexport default RegistryHandler;\r\n//# sourceMappingURL=RegistryHandler.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs\n// module chunks = menu","import Map from '../shim/Map';\nimport WeakMap from '../shim/WeakMap';\nimport Symbol from '../shim/Symbol';\nimport { v } from './d';\nimport { auto } from './diff';\nimport RegistryHandler from './RegistryHandler';\nimport NodeHandler from './NodeHandler';\nimport { widgetInstanceMap } from './vdom';\nimport { isWidgetBaseConstructor, WIDGET_BASE_TYPE } from './Registry';\nconst decoratorMap = new Map();\nconst boundAuto = auto.bind(null);\nexport const noBind = Symbol.for('dojoNoBind');\n/**\n * Main widget base for all widgets to extend\n */\nexport class WidgetBase {\n /**\n * @constructor\n */\n constructor() {\n /**\n * Indicates if it is the initial set properties cycle\n */\n this._initialProperties = true;\n /**\n * Array of property keys considered changed from the previous set properties\n */\n this._changedPropertyKeys = [];\n this._nodeHandler = new NodeHandler();\n this._handles = [];\n this._children = [];\n this._decoratorCache = new Map();\n this._properties = {};\n this._boundRenderFunc = this.render.bind(this);\n this._boundInvalidate = this.invalidate.bind(this);\n widgetInstanceMap.set(this, {\n dirty: true,\n onAttach: () => {\n this.onAttach();\n },\n onDetach: () => {\n this.onDetach();\n this.destroy();\n },\n nodeHandler: this._nodeHandler,\n registry: () => {\n return this.registry;\n },\n coreProperties: {},\n rendering: false,\n inputProperties: {}\n });\n this._runAfterConstructors();\n }\n meta(MetaType) {\n if (this._metaMap === undefined) {\n this._metaMap = new Map();\n }\n let cached = this._metaMap.get(MetaType);\n if (!cached) {\n cached = new MetaType({\n invalidate: this._boundInvalidate,\n nodeHandler: this._nodeHandler,\n bind: this\n });\n this.own(cached);\n this._metaMap.set(MetaType, cached);\n }\n return cached;\n }\n onAttach() {\n // Do nothing by default.\n }\n onDetach() {\n // Do nothing by default.\n }\n get properties() {\n return this._properties;\n }\n get changedPropertyKeys() {\n return [...this._changedPropertyKeys];\n }\n __setCoreProperties__(coreProperties) {\n const { baseRegistry } = coreProperties;\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.coreProperties.baseRegistry !== baseRegistry) {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n this._registry.base = baseRegistry;\n this.invalidate();\n }\n instanceData.coreProperties = coreProperties;\n }\n __setProperties__(originalProperties) {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.inputProperties = originalProperties;\n const properties = this._runBeforeProperties(originalProperties);\n const registeredDiffPropertyNames = this.getDecorator('registeredDiffProperty');\n const changedPropertyKeys = [];\n const propertyNames = Object.keys(properties);\n if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) {\n const allProperties = [...propertyNames, ...Object.keys(this._properties)];\n const checkedProperties = [];\n const diffPropertyResults = {};\n let runReactions = false;\n for (let i = 0; i < allProperties.length; i++) {\n const propertyName = allProperties[i];\n if (checkedProperties.indexOf(propertyName) !== -1) {\n continue;\n }\n checkedProperties.push(propertyName);\n const previousProperty = this._properties[propertyName];\n const newProperty = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n if (registeredDiffPropertyNames.indexOf(propertyName) !== -1) {\n runReactions = true;\n const diffFunctions = this.getDecorator(`diffProperty:${propertyName}`);\n for (let i = 0; i < diffFunctions.length; i++) {\n const result = diffFunctions[i](previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n else {\n const result = boundAuto(previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n if (runReactions) {\n const reactionFunctions = this.getDecorator('diffReaction');\n const executedReactions = [];\n reactionFunctions.forEach(({ reaction, propertyName }) => {\n const propertyChanged = changedPropertyKeys.indexOf(propertyName) !== -1;\n const reactionRun = executedReactions.indexOf(reaction) !== -1;\n if (propertyChanged && !reactionRun) {\n reaction.call(this, this._properties, diffPropertyResults);\n executedReactions.push(reaction);\n }\n });\n }\n this._properties = diffPropertyResults;\n this._changedPropertyKeys = changedPropertyKeys;\n }\n else {\n this._initialProperties = false;\n for (let i = 0; i < propertyNames.length; i++) {\n const propertyName = propertyNames[i];\n if (typeof properties[propertyName] === 'function') {\n properties[propertyName] = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n }\n else {\n changedPropertyKeys.push(propertyName);\n }\n }\n this._changedPropertyKeys = changedPropertyKeys;\n this._properties = Object.assign({}, properties);\n }\n if (this._changedPropertyKeys.length > 0) {\n this.invalidate();\n }\n }\n get children() {\n return this._children;\n }\n __setChildren__(children) {\n if (this._children.length > 0 || children.length > 0) {\n this._children = children;\n this.invalidate();\n }\n }\n __render__() {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.dirty = false;\n const render = this._runBeforeRenders();\n let dNode = render();\n dNode = this.runAfterRenders(dNode);\n this._nodeHandler.clear();\n return dNode;\n }\n invalidate() {\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.invalidate) {\n instanceData.invalidate();\n }\n }\n render() {\n return v('div', {}, this.children);\n }\n /**\n * Function to add decorators to WidgetBase\n *\n * @param decoratorKey The key of the decorator\n * @param value The value of the decorator\n */\n addDecorator(decoratorKey, value) {\n value = Array.isArray(value) ? value : [value];\n if (this.hasOwnProperty('constructor')) {\n let decoratorList = decoratorMap.get(this.constructor);\n if (!decoratorList) {\n decoratorList = new Map();\n decoratorMap.set(this.constructor, decoratorList);\n }\n let specificDecoratorList = decoratorList.get(decoratorKey);\n if (!specificDecoratorList) {\n specificDecoratorList = [];\n decoratorList.set(decoratorKey, specificDecoratorList);\n }\n specificDecoratorList.push(...value);\n }\n else {\n const decorators = this.getDecorator(decoratorKey);\n this._decoratorCache.set(decoratorKey, [...decorators, ...value]);\n }\n }\n /**\n * Function to build the list of decorators from the global decorator map.\n *\n * @param decoratorKey The key of the decorator\n * @return An array of decorator values\n * @private\n */\n _buildDecoratorList(decoratorKey) {\n const allDecorators = [];\n let constructor = this.constructor;\n while (constructor) {\n const instanceMap = decoratorMap.get(constructor);\n if (instanceMap) {\n const decorators = instanceMap.get(decoratorKey);\n if (decorators) {\n allDecorators.unshift(...decorators);\n }\n }\n constructor = Object.getPrototypeOf(constructor);\n }\n return allDecorators;\n }\n /**\n * Function to retrieve decorator values\n *\n * @param decoratorKey The key of the decorator\n * @returns An array of decorator values\n */\n getDecorator(decoratorKey) {\n let allDecorators = this._decoratorCache.get(decoratorKey);\n if (allDecorators !== undefined) {\n return allDecorators;\n }\n allDecorators = this._buildDecoratorList(decoratorKey);\n this._decoratorCache.set(decoratorKey, allDecorators);\n return allDecorators;\n }\n /**\n * Binds unbound property functions to the specified `bind` property\n *\n * @param properties properties to check for functions\n */\n _bindFunctionProperty(property, bind) {\n if (typeof property === 'function' && !property[noBind] && isWidgetBaseConstructor(property) === false) {\n if (this._bindFunctionPropertyMap === undefined) {\n this._bindFunctionPropertyMap = new WeakMap();\n }\n const bindInfo = this._bindFunctionPropertyMap.get(property) || {};\n let { boundFunc, scope } = bindInfo;\n if (boundFunc === undefined || scope !== bind) {\n boundFunc = property.bind(bind);\n this._bindFunctionPropertyMap.set(property, { boundFunc, scope: bind });\n }\n return boundFunc;\n }\n return property;\n }\n get registry() {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n return this._registry;\n }\n _runBeforeProperties(properties) {\n const beforeProperties = this.getDecorator('beforeProperties');\n if (beforeProperties.length > 0) {\n return beforeProperties.reduce((properties, beforePropertiesFunction) => {\n return Object.assign({}, properties, beforePropertiesFunction.call(this, properties));\n }, Object.assign({}, properties));\n }\n return properties;\n }\n /**\n * Run all registered before renders and return the updated render method\n */\n _runBeforeRenders() {\n const beforeRenders = this.getDecorator('beforeRender');\n if (beforeRenders.length > 0) {\n return beforeRenders.reduce((render, beforeRenderFunction) => {\n const updatedRender = beforeRenderFunction.call(this, render, this._properties, this._children);\n if (!updatedRender) {\n console.warn('Render function not returned from beforeRender, using previous render');\n return render;\n }\n return updatedRender;\n }, this._boundRenderFunc);\n }\n return this._boundRenderFunc;\n }\n /**\n * Run all registered after renders and return the decorated DNodes\n *\n * @param dNode The DNodes to run through the after renders\n */\n runAfterRenders(dNode) {\n const afterRenders = this.getDecorator('afterRender');\n if (afterRenders.length > 0) {\n dNode = afterRenders.reduce((dNode, afterRenderFunction) => {\n return afterRenderFunction.call(this, dNode);\n }, dNode);\n }\n if (this._metaMap !== undefined) {\n this._metaMap.forEach((meta) => {\n meta.afterRender();\n });\n }\n return dNode;\n }\n _runAfterConstructors() {\n const afterConstructors = this.getDecorator('afterConstructor');\n if (afterConstructors.length > 0) {\n afterConstructors.forEach((afterConstructor) => afterConstructor.call(this));\n }\n }\n own(handle) {\n this._handles.push(handle);\n }\n destroy() {\n while (this._handles.length > 0) {\n const handle = this._handles.pop();\n if (handle) {\n handle.destroy();\n }\n }\n }\n}\n/**\n * static identifier\n */\nWidgetBase._type = WIDGET_BASE_TYPE;\nexport default WidgetBase;\n//# sourceMappingURL=WidgetBase.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/WidgetBase.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/WidgetBase.mjs\n// module chunks = menu","let browserSpecificTransitionEndEventName = '';\nlet browserSpecificAnimationEndEventName = '';\nfunction determineBrowserStyleNames(element) {\n if ('WebkitTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'webkitTransitionEnd';\n browserSpecificAnimationEndEventName = 'webkitAnimationEnd';\n }\n else if ('transition' in element.style || 'MozTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'transitionend';\n browserSpecificAnimationEndEventName = 'animationend';\n }\n else {\n throw new Error('Your browser is not supported');\n }\n}\nfunction initialize(element) {\n if (browserSpecificAnimationEndEventName === '') {\n determineBrowserStyleNames(element);\n }\n}\nfunction runAndCleanUp(element, startAnimation, finishAnimation) {\n initialize(element);\n let finished = false;\n let transitionEnd = function () {\n if (!finished) {\n finished = true;\n element.removeEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n element.removeEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n finishAnimation();\n }\n };\n startAnimation();\n element.addEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n element.addEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n}\nfunction exit(node, properties, exitAnimation, removeNode) {\n const activeClass = properties.exitAnimationActive || `${exitAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(exitAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n removeNode();\n });\n}\nfunction enter(node, properties, enterAnimation) {\n const activeClass = properties.enterAnimationActive || `${enterAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(enterAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n node.classList.remove(enterAnimation);\n node.classList.remove(activeClass);\n });\n}\nexport default {\n enter,\n exit\n};\n//# sourceMappingURL=cssTransitions.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs\n// module chunks = menu","import Symbol from '../shim/Symbol';\n/**\n * The symbol identifier for a WNode type\n */\nexport const WNODE = Symbol('Identifier for a WNode.');\n/**\n * The symbol identifier for a VNode type\n */\nexport const VNODE = Symbol('Identifier for a VNode.');\n/**\n * The symbol identifier for a VNode type created using dom()\n */\nexport const DOMVNODE = Symbol('Identifier for a VNode created using existing dom.');\n/**\n * Helper function that returns true if the `DNode` is a `WNode` using the `type` property\n */\nexport function isWNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === WNODE);\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` using the `type` property\n */\nexport function isVNode(child) {\n return Boolean(child && typeof child !== 'string' && (child.type === VNODE || child.type === DOMVNODE));\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` created with `dom()` using the `type` property\n */\nexport function isDomVNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === DOMVNODE);\n}\nexport function isElementNode(value) {\n return !!value.tagName;\n}\nexport function decorate(dNodes, optionsOrModifier, predicate) {\n let shallow = false;\n let modifier;\n if (typeof optionsOrModifier === 'function') {\n modifier = optionsOrModifier;\n }\n else {\n modifier = optionsOrModifier.modifier;\n predicate = optionsOrModifier.predicate;\n shallow = optionsOrModifier.shallow || false;\n }\n let nodes = Array.isArray(dNodes) ? [...dNodes] : [dNodes];\n function breaker() {\n nodes = [];\n }\n while (nodes.length) {\n const node = nodes.shift();\n if (node) {\n if (!shallow && (isWNode(node) || isVNode(node)) && node.children) {\n nodes = [...nodes, ...node.children];\n }\n if (!predicate || predicate(node)) {\n modifier(node, breaker);\n }\n }\n }\n return dNodes;\n}\n/**\n * Wrapper function for calls to create a widget.\n */\nexport function w(widgetConstructor, properties, children = []) {\n return {\n children,\n widgetConstructor,\n properties,\n type: WNODE\n };\n}\nexport function v(tag, propertiesOrChildren = {}, children = undefined) {\n let properties = propertiesOrChildren;\n let deferredPropertiesCallback;\n if (Array.isArray(propertiesOrChildren)) {\n children = propertiesOrChildren;\n properties = {};\n }\n if (typeof properties === 'function') {\n deferredPropertiesCallback = properties;\n properties = {};\n }\n return {\n tag,\n deferredPropertiesCallback,\n children,\n properties,\n type: VNODE\n };\n}\n/**\n * Create a VNode for an existing DOM Node.\n */\nexport function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, children) {\n return {\n tag: isElementNode(node) ? node.tagName.toLowerCase() : '',\n properties: props,\n attributes: attrs,\n events: on,\n children,\n type: DOMVNODE,\n domNode: node,\n text: isElementNode(node) ? undefined : node.data,\n diffType\n };\n}\n//# sourceMappingURL=d.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/d.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/d.mjs\n// module chunks = menu","import { handleDecorator } from './handleDecorator';\nexport function afterRender(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('afterRender', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default afterRender;\n//# sourceMappingURL=afterRender.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs\n// module chunks = menu","import { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\nexport function alwaysRender() {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function () {\n this.invalidate();\n })(target);\n });\n}\nexport default alwaysRender;\n//# sourceMappingURL=alwaysRender.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs\n// module chunks = menu","import { handleDecorator } from './handleDecorator';\nexport function beforeProperties(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('beforeProperties', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default beforeProperties;\n//# sourceMappingURL=beforeProperties.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs\n// module chunks = menu","import { CustomElementChildType } from '../registerCustomElement';\nimport Registry from '../Registry';\n/**\n * This Decorator is provided properties that define the behavior of a custom element, and\n * registers that custom element.\n */\nexport function customElement({ tag, properties = [], attributes = [], events = [], childType = CustomElementChildType.DOJO, registryFactory = () => new Registry() }) {\n return function (target) {\n target.prototype.__customElementDescriptor = {\n tagName: tag,\n attributes,\n properties,\n events,\n childType,\n registryFactory\n };\n };\n}\nexport default customElement;\n//# sourceMappingURL=customElement.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs\n// module chunks = menu","import { handleDecorator } from './handleDecorator';\nimport { auto } from './../diff';\n/**\n * Decorator that can be used to register a function as a specific property diff\n *\n * @param propertyName The name of the property of which the diff function is applied\n * @param diffType The diff type, default is DiffType.AUTO.\n * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM\n */\nexport function diffProperty(propertyName, diffFunction = auto, reactionFunction) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null));\n target.addDecorator('registeredDiffProperty', propertyName);\n if (reactionFunction || propertyKey) {\n target.addDecorator('diffReaction', {\n propertyName,\n reaction: propertyKey ? target[propertyKey] : reactionFunction\n });\n }\n });\n}\nexport default diffProperty;\n//# sourceMappingURL=diffProperty.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs\n// module chunks = menu","/**\n * Generic decorator handler to take care of whether or not the decorator was called at the class level\n * or the method level.\n *\n * @param handler\n */\nexport function handleDecorator(handler) {\n return function (target, propertyKey, descriptor) {\n if (typeof target === 'function') {\n handler(target.prototype, undefined);\n }\n else {\n handler(target, propertyKey);\n }\n };\n}\nexport default handleDecorator;\n//# sourceMappingURL=handleDecorator.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs\n// module chunks = menu","import WeakMap from '../../shim/WeakMap';\nimport { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\n/**\n * Map of instances against registered injectors.\n */\nconst registeredInjectorsMap = new WeakMap();\n/**\n * Decorator retrieves an injector from an available registry using the name and\n * calls the `getProperties` function with the payload from the injector\n * and current properties with the the injected properties returned.\n *\n * @param InjectConfig the inject configuration\n */\nexport function inject({ name, getProperties }) {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function (properties) {\n const injectorItem = this.registry.getInjector(name);\n if (injectorItem) {\n const { injector, invalidator } = injectorItem;\n const registeredInjectors = registeredInjectorsMap.get(this) || [];\n if (registeredInjectors.length === 0) {\n registeredInjectorsMap.set(this, registeredInjectors);\n }\n if (registeredInjectors.indexOf(injectorItem) === -1) {\n this.own(invalidator.on('invalidate', () => {\n this.invalidate();\n }));\n registeredInjectors.push(injectorItem);\n }\n return getProperties(injector(), properties);\n }\n })(target);\n });\n}\nexport default inject;\n//# sourceMappingURL=inject.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/decorators/inject.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/decorators/inject.mjs\n// module chunks = menu","import { WIDGET_BASE_TYPE } from './Registry';\nfunction isObjectOrArray(value) {\n return Object.prototype.toString.call(value) === '[object Object]' || Array.isArray(value);\n}\nexport function always(previousProperty, newProperty) {\n return {\n changed: true,\n value: newProperty\n };\n}\nexport function ignore(previousProperty, newProperty) {\n return {\n changed: false,\n value: newProperty\n };\n}\nexport function reference(previousProperty, newProperty) {\n return {\n changed: previousProperty !== newProperty,\n value: newProperty\n };\n}\nexport function shallow(previousProperty, newProperty) {\n let changed = false;\n const validOldProperty = previousProperty && isObjectOrArray(previousProperty);\n const validNewProperty = newProperty && isObjectOrArray(newProperty);\n if (!validOldProperty || !validNewProperty) {\n return {\n changed: true,\n value: newProperty\n };\n }\n const previousKeys = Object.keys(previousProperty);\n const newKeys = Object.keys(newProperty);\n if (previousKeys.length !== newKeys.length) {\n changed = true;\n }\n else {\n changed = newKeys.some((key) => {\n return newProperty[key] !== previousProperty[key];\n });\n }\n return {\n changed,\n value: newProperty\n };\n}\nexport function auto(previousProperty, newProperty) {\n let result;\n if (typeof newProperty === 'function') {\n if (newProperty._type === WIDGET_BASE_TYPE) {\n result = reference(previousProperty, newProperty);\n }\n else {\n result = ignore(previousProperty, newProperty);\n }\n }\n else if (isObjectOrArray(newProperty)) {\n result = shallow(previousProperty, newProperty);\n }\n else {\n result = reference(previousProperty, newProperty);\n }\n return result;\n}\n//# sourceMappingURL=diff.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/diff.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/diff.mjs\n// module chunks = menu","import * as tslib_1 from \"tslib\";\nimport { assign } from '../../core/lang';\nimport cssTransitions from '../animations/cssTransitions';\nimport { afterRender } from './../decorators/afterRender';\nimport { v } from './../d';\nimport { dom } from './../vdom';\n/**\n * Represents the attach state of the projector\n */\nexport var ProjectorAttachState;\n(function (ProjectorAttachState) {\n ProjectorAttachState[ProjectorAttachState[\"Attached\"] = 1] = \"Attached\";\n ProjectorAttachState[ProjectorAttachState[\"Detached\"] = 2] = \"Detached\";\n})(ProjectorAttachState || (ProjectorAttachState = {}));\n/**\n * Attach type for the projector\n */\nexport var AttachType;\n(function (AttachType) {\n AttachType[AttachType[\"Append\"] = 1] = \"Append\";\n AttachType[AttachType[\"Merge\"] = 2] = \"Merge\";\n})(AttachType || (AttachType = {}));\nexport function ProjectorMixin(Base) {\n class Projector extends Base {\n constructor(...args) {\n super(...args);\n this._root = document.body;\n this._async = true;\n this._projectorProperties = {};\n this._projectionOptions = {\n transitions: cssTransitions\n };\n this.root = document.body;\n this.projectorState = ProjectorAttachState.Detached;\n }\n append(root) {\n const options = {\n type: AttachType.Append,\n root\n };\n return this._attach(options);\n }\n merge(root) {\n const options = {\n type: AttachType.Merge,\n root\n };\n return this._attach(options);\n }\n set root(root) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change root element');\n }\n this._root = root;\n }\n get root() {\n return this._root;\n }\n get async() {\n return this._async;\n }\n set async(async) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change async mode');\n }\n this._async = async;\n }\n sandbox(doc = document) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot create sandbox');\n }\n this._async = false;\n const previousRoot = this.root;\n /* free up the document fragment for GC */\n this.own({\n destroy: () => {\n this._root = previousRoot;\n }\n });\n this._attach({\n /* DocumentFragment is not assignable to Element, but provides everything needed to work */\n root: doc.createDocumentFragment(),\n type: AttachType.Append\n });\n }\n setChildren(children) {\n this.__setChildren__(children);\n }\n setProperties(properties) {\n this.__setProperties__(properties);\n }\n __setProperties__(properties) {\n if (this._projectorProperties && this._projectorProperties.registry !== properties.registry) {\n if (this._projectorProperties.registry) {\n this._projectorProperties.registry.destroy();\n }\n }\n this._projectorProperties = assign({}, properties);\n super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry });\n super.__setProperties__(properties);\n }\n toHtml() {\n if (this.projectorState !== ProjectorAttachState.Attached || !this._projection) {\n throw new Error('Projector is not attached, cannot return an HTML string of projection.');\n }\n return this._projection.domNode.childNodes[0].outerHTML;\n }\n afterRender(result) {\n let node = result;\n if (typeof result === 'string' || result === null || result === undefined) {\n node = v('span', {}, [result]);\n }\n return node;\n }\n destroy() {\n super.destroy();\n }\n _attach({ type, root }) {\n if (root) {\n this.root = root;\n }\n if (this._attachHandle) {\n return this._attachHandle;\n }\n this.projectorState = ProjectorAttachState.Attached;\n const handle = {\n destroy: () => {\n if (this.projectorState === ProjectorAttachState.Attached) {\n this._projection = undefined;\n this.projectorState = ProjectorAttachState.Detached;\n }\n }\n };\n this.own(handle);\n this._attachHandle = handle;\n this._projectionOptions = Object.assign({}, this._projectionOptions, { sync: !this._async });\n switch (type) {\n case AttachType.Append:\n this._projection = dom.append(this.root, this, this._projectionOptions);\n break;\n case AttachType.Merge:\n this._projection = dom.merge(this.root, this, this._projectionOptions);\n break;\n }\n return this._attachHandle;\n }\n }\n tslib_1.__decorate([\n afterRender()\n ], Projector.prototype, \"afterRender\", null);\n return Projector;\n}\nexport default ProjectorMixin;\n//# sourceMappingURL=Projector.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs\n// module chunks = menu","import * as tslib_1 from \"tslib\";\nimport { Injector } from './../Injector';\nimport { inject } from './../decorators/inject';\nimport { handleDecorator } from './../decorators/handleDecorator';\nimport { diffProperty } from './../decorators/diffProperty';\nimport { shallow } from './../diff';\nconst THEME_KEY = ' _key';\nexport const INJECTED_THEME_KEY = Symbol('theme');\n/**\n * Decorator for base css classes\n */\nexport function theme(theme) {\n return handleDecorator((target) => {\n target.addDecorator('baseThemeClasses', theme);\n });\n}\n/**\n * Creates a reverse lookup for the classes passed in via the `theme` function.\n *\n * @param classes The baseClasses object\n * @requires\n */\nfunction createThemeClassesLookup(classes) {\n return classes.reduce((currentClassNames, baseClass) => {\n Object.keys(baseClass).forEach((key) => {\n currentClassNames[baseClass[key]] = key;\n });\n return currentClassNames;\n }, {});\n}\n/**\n * Convenience function that is given a theme and an optional registry, the theme\n * injector is defined against the registry, returning the theme.\n *\n * @param theme the theme to set\n * @param themeRegistry registry to define the theme injector against. Defaults\n * to the global registry\n *\n * @returns the theme injector used to set the theme\n */\nexport function registerThemeInjector(theme, themeRegistry) {\n const themeInjector = new Injector(theme);\n themeRegistry.defineInjector(INJECTED_THEME_KEY, (invalidator) => {\n themeInjector.setInvalidator(invalidator);\n return () => themeInjector.get();\n });\n return themeInjector;\n}\n/**\n * Function that returns a class decorated with with Themed functionality\n */\nexport function ThemedMixin(Base) {\n let Themed = class Themed extends Base {\n constructor() {\n super(...arguments);\n /**\n * Registered base theme keys\n */\n this._registeredBaseThemeKeys = [];\n /**\n * Indicates if classes meta data need to be calculated.\n */\n this._recalculateClasses = true;\n /**\n * Loaded theme\n */\n this._theme = {};\n }\n theme(classes) {\n if (this._recalculateClasses) {\n this._recalculateThemeClasses();\n }\n if (Array.isArray(classes)) {\n return classes.map((className) => this._getThemeClass(className));\n }\n return this._getThemeClass(classes);\n }\n /**\n * Function fired when `theme` or `extraClasses` are changed.\n */\n onPropertiesChanged() {\n this._recalculateClasses = true;\n }\n _getThemeClass(className) {\n if (className === undefined || className === null) {\n return className;\n }\n const extraClasses = this.properties.extraClasses || {};\n const themeClassName = this._baseThemeClassesReverseLookup[className];\n let resultClassNames = [];\n if (!themeClassName) {\n console.warn(`Class name: '${className}' not found in theme`);\n return null;\n }\n if (extraClasses[themeClassName]) {\n resultClassNames.push(extraClasses[themeClassName]);\n }\n if (this._theme[themeClassName]) {\n resultClassNames.push(this._theme[themeClassName]);\n }\n else {\n resultClassNames.push(this._registeredBaseTheme[themeClassName]);\n }\n return resultClassNames.join(' ');\n }\n _recalculateThemeClasses() {\n const { theme = {} } = this.properties;\n const baseThemes = this.getDecorator('baseThemeClasses');\n if (!this._registeredBaseTheme) {\n this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => {\n const _a = THEME_KEY, key = baseTheme[_a], classes = tslib_1.__rest(baseTheme, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n this._registeredBaseThemeKeys.push(key);\n return Object.assign({}, finalBaseTheme, classes);\n }, {});\n this._baseThemeClassesReverseLookup = createThemeClassesLookup(baseThemes);\n }\n this._theme = this._registeredBaseThemeKeys.reduce((baseTheme, themeKey) => {\n return Object.assign({}, baseTheme, theme[themeKey]);\n }, {});\n this._recalculateClasses = false;\n }\n };\n tslib_1.__decorate([\n diffProperty('theme', shallow),\n diffProperty('extraClasses', shallow)\n ], Themed.prototype, \"onPropertiesChanged\", null);\n Themed = tslib_1.__decorate([\n inject({\n name: INJECTED_THEME_KEY,\n getProperties: (theme, properties) => {\n if (!properties.theme) {\n return { theme };\n }\n return {};\n }\n })\n ], Themed);\n return Themed;\n}\nexport default ThemedMixin;\n//# sourceMappingURL=Themed.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs\n// module chunks = menu","import * as tslib_1 from \"tslib\";\nimport { WidgetBase, noBind } from './WidgetBase';\nimport { ProjectorMixin } from './mixins/Projector';\nimport { from } from '../shim/array';\nimport { w, dom } from './d';\nimport global from '../shim/global';\nimport { registerThemeInjector } from './mixins/Themed';\nimport { alwaysRender } from './decorators/alwaysRender';\nexport var CustomElementChildType;\n(function (CustomElementChildType) {\n CustomElementChildType[\"DOJO\"] = \"DOJO\";\n CustomElementChildType[\"NODE\"] = \"NODE\";\n CustomElementChildType[\"TEXT\"] = \"TEXT\";\n})(CustomElementChildType || (CustomElementChildType = {}));\nexport function DomToWidgetWrapper(domNode) {\n let DomToWidgetWrapper = class DomToWidgetWrapper extends WidgetBase {\n render() {\n const properties = Object.keys(this.properties).reduce((props, key) => {\n const value = this.properties[key];\n if (key.indexOf('on') === 0) {\n key = `__${key}`;\n }\n props[key] = value;\n return props;\n }, {});\n return dom({ node: domNode, props: properties, diffType: 'dom' });\n }\n static get domNode() {\n return domNode;\n }\n };\n DomToWidgetWrapper = tslib_1.__decorate([\n alwaysRender()\n ], DomToWidgetWrapper);\n return DomToWidgetWrapper;\n}\nexport function create(descriptor, WidgetConstructor) {\n const { attributes, childType, registryFactory } = descriptor;\n const attributeMap = {};\n attributes.forEach((propertyName) => {\n const attributeName = propertyName.toLowerCase();\n attributeMap[attributeName] = propertyName;\n });\n return class extends HTMLElement {\n constructor() {\n super(...arguments);\n this._properties = {};\n this._children = [];\n this._eventProperties = {};\n this._initialised = false;\n }\n connectedCallback() {\n if (this._initialised) {\n return;\n }\n const domProperties = {};\n const { attributes, properties, events } = descriptor;\n this._properties = Object.assign({}, this._properties, this._attributesToProperties(attributes));\n [...attributes, ...properties].forEach((propertyName) => {\n const value = this[propertyName];\n const filteredPropertyName = propertyName.replace(/^on/, '__');\n if (value !== undefined) {\n this._properties[propertyName] = value;\n }\n if (filteredPropertyName !== propertyName) {\n domProperties[filteredPropertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n }\n domProperties[propertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n });\n events.forEach((propertyName) => {\n const eventName = propertyName.replace(/^on/, '').toLowerCase();\n const filteredPropertyName = propertyName.replace(/^on/, '__on');\n domProperties[filteredPropertyName] = {\n get: () => this._getEventProperty(propertyName),\n set: (value) => this._setEventProperty(propertyName, value)\n };\n this._eventProperties[propertyName] = undefined;\n this._properties[propertyName] = (...args) => {\n const eventCallback = this._getEventProperty(propertyName);\n if (typeof eventCallback === 'function') {\n eventCallback(...args);\n }\n this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: false,\n detail: args\n }));\n };\n });\n Object.defineProperties(this, domProperties);\n const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children;\n from(children).forEach((childNode) => {\n if (childType === CustomElementChildType.DOJO) {\n childNode.addEventListener('dojo-ce-render', () => this._render());\n childNode.addEventListener('dojo-ce-connected', () => this._render());\n this._children.push(DomToWidgetWrapper(childNode));\n }\n else {\n this._children.push(dom({ node: childNode, diffType: 'dom' }));\n }\n });\n this.addEventListener('dojo-ce-connected', (e) => this._childConnected(e));\n const widgetProperties = this._properties;\n const renderChildren = () => this.__children__();\n const Wrapper = class extends WidgetBase {\n render() {\n return w(WidgetConstructor, widgetProperties, renderChildren());\n }\n };\n const registry = registryFactory();\n const themeContext = registerThemeInjector(this._getTheme(), registry);\n global.addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme()));\n const Projector = ProjectorMixin(Wrapper);\n this._projector = new Projector();\n this._projector.setProperties({ registry });\n this._projector.append(this);\n this._initialised = true;\n this.dispatchEvent(new CustomEvent('dojo-ce-connected', {\n bubbles: true,\n detail: this\n }));\n }\n _getTheme() {\n if (global && global.dojoce && global.dojoce.theme) {\n return global.dojoce.themes[global.dojoce.theme];\n }\n }\n _childConnected(e) {\n const node = e.detail;\n if (node.parentNode === this) {\n const exists = this._children.some((child) => child.domNode === node);\n if (!exists) {\n node.addEventListener('dojo-ce-render', () => this._render());\n this._children.push(DomToWidgetWrapper(node));\n this._render();\n }\n }\n }\n _render() {\n if (this._projector) {\n this._projector.invalidate();\n this.dispatchEvent(new CustomEvent('dojo-ce-render', {\n bubbles: false,\n detail: this\n }));\n }\n }\n __properties__() {\n return Object.assign({}, this._properties, this._eventProperties);\n }\n __children__() {\n if (childType === CustomElementChildType.DOJO) {\n return this._children.filter((Child) => Child.domNode.isWidget).map((Child) => {\n const { domNode } = Child;\n return w(Child, Object.assign({}, domNode.__properties__()), [...domNode.__children__()]);\n });\n }\n else {\n return this._children;\n }\n }\n attributeChangedCallback(name, oldValue, value) {\n const propertyName = attributeMap[name];\n this._setProperty(propertyName, value);\n }\n _setEventProperty(propertyName, value) {\n this._eventProperties[propertyName] = value;\n }\n _getEventProperty(propertyName) {\n return this._eventProperties[propertyName];\n }\n _setProperty(propertyName, value) {\n if (typeof value === 'function') {\n value[noBind] = true;\n }\n this._properties[propertyName] = value;\n this._render();\n }\n _getProperty(propertyName) {\n return this._properties[propertyName];\n }\n _attributesToProperties(attributes) {\n return attributes.reduce((properties, propertyName) => {\n const attributeName = propertyName.toLowerCase();\n const value = this.getAttribute(attributeName);\n if (value !== null) {\n properties[propertyName] = value;\n }\n return properties;\n }, {});\n }\n static get observedAttributes() {\n return Object.keys(attributeMap);\n }\n get isWidget() {\n return true;\n }\n };\n}\nexport function register(WidgetConstructor) {\n const descriptor = WidgetConstructor.prototype && WidgetConstructor.prototype.__customElementDescriptor;\n if (!descriptor) {\n throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?');\n }\n global.customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor));\n}\nexport default register;\n//# sourceMappingURL=registerCustomElement.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs\n// module chunks = menu","import global from '../shim/global';\r\nimport { from as arrayFrom } from '../shim/array';\r\nimport { isWNode, isVNode, isDomVNode, VNODE, WNODE } from './d';\r\nimport { isWidgetBaseConstructor } from './Registry';\r\nimport WeakMap from '../shim/WeakMap';\r\nconst NAMESPACE_W3 = 'http://www.w3.org/';\r\nconst NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg';\r\nconst NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink';\r\nconst emptyArray = [];\r\nconst nodeOperations = ['focus', 'blur', 'scrollIntoView', 'click'];\r\nexport const widgetInstanceMap = new WeakMap();\r\nconst instanceMap = new WeakMap();\r\nconst nextSiblingMap = new WeakMap();\r\nconst projectorStateMap = new WeakMap();\r\nfunction same(dnode1, dnode2) {\r\n if (isVNode(dnode1) && isVNode(dnode2)) {\r\n if (isDomVNode(dnode1) || isDomVNode(dnode2)) {\r\n if (dnode1.domNode !== dnode2.domNode) {\r\n return false;\r\n }\r\n }\r\n if (dnode1.tag !== dnode2.tag) {\r\n return false;\r\n }\r\n if (dnode1.properties.key !== dnode2.properties.key) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n else if (isWNode(dnode1) && isWNode(dnode2)) {\r\n if (dnode1.instance === undefined && typeof dnode2.widgetConstructor === 'string') {\r\n return false;\r\n }\r\n if (dnode1.widgetConstructor !== dnode2.widgetConstructor) {\r\n return false;\r\n }\r\n if (dnode1.properties.key !== dnode2.properties.key) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n return false;\r\n}\r\nconst missingTransition = function () {\r\n throw new Error('Provide a transitions object to the projectionOptions to do animations');\r\n};\r\nfunction getProjectionOptions(projectorOptions, projectorInstance) {\r\n const defaults = {\r\n namespace: undefined,\r\n styleApplyer: function (domNode, styleName, value) {\r\n domNode.style[styleName] = value;\r\n },\r\n transitions: {\r\n enter: missingTransition,\r\n exit: missingTransition\r\n },\r\n depth: 0,\r\n merge: false,\r\n sync: false,\r\n projectorInstance\r\n };\r\n return Object.assign({}, defaults, projectorOptions);\r\n}\r\nfunction checkStyleValue(styleValue) {\r\n if (typeof styleValue !== 'string') {\r\n throw new Error('Style values must be strings');\r\n }\r\n}\r\nfunction updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n const eventMap = projectorState.nodeMap.get(domNode) || new WeakMap();\r\n if (previousValue) {\r\n const previousEvent = eventMap.get(previousValue);\r\n domNode.removeEventListener(eventName, previousEvent);\r\n }\r\n let callback = currentValue.bind(bind);\r\n if (eventName === 'input') {\r\n callback = function (evt) {\r\n currentValue.call(this, evt);\r\n evt.target['oninput-value'] = evt.target.value;\r\n }.bind(bind);\r\n }\r\n domNode.addEventListener(eventName, callback);\r\n eventMap.set(currentValue, callback);\r\n projectorState.nodeMap.set(domNode, eventMap);\r\n}\r\nfunction addClasses(domNode, classes) {\r\n if (classes) {\r\n const classNames = classes.split(' ');\r\n for (let i = 0; i < classNames.length; i++) {\r\n domNode.classList.add(classNames[i]);\r\n }\r\n }\r\n}\r\nfunction removeClasses(domNode, classes) {\r\n if (classes) {\r\n const classNames = classes.split(' ');\r\n for (let i = 0; i < classNames.length; i++) {\r\n domNode.classList.remove(classNames[i]);\r\n }\r\n }\r\n}\r\nfunction buildPreviousProperties(domNode, previous, current) {\r\n const { diffType, properties, attributes } = current;\r\n if (!diffType || diffType === 'vdom') {\r\n return { properties: previous.properties, attributes: previous.attributes, events: previous.events };\r\n }\r\n else if (diffType === 'none') {\r\n return { properties: {}, attributes: previous.attributes ? {} : undefined, events: previous.events };\r\n }\r\n let newProperties = {\r\n properties: {}\r\n };\r\n if (attributes) {\r\n newProperties.attributes = {};\r\n newProperties.events = previous.events;\r\n Object.keys(properties).forEach((propName) => {\r\n newProperties.properties[propName] = domNode[propName];\r\n });\r\n Object.keys(attributes).forEach((attrName) => {\r\n newProperties.attributes[attrName] = domNode.getAttribute(attrName);\r\n });\r\n return newProperties;\r\n }\r\n newProperties.properties = Object.keys(properties).reduce((props, property) => {\r\n props[property] = domNode.getAttribute(property) || domNode[property];\r\n return props;\r\n }, {});\r\n return newProperties;\r\n}\r\nfunction nodeOperation(propName, propValue, previousValue, domNode, projectionOptions) {\r\n let result;\r\n if (typeof propValue === 'function') {\r\n result = propValue();\r\n }\r\n else {\r\n result = propValue && !previousValue;\r\n }\r\n if (result === true) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectorState.deferredRenderCallbacks.push(() => {\r\n domNode[propName]();\r\n });\r\n }\r\n}\r\nfunction removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions, onlyEvents = false) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n const eventMap = projectorState.nodeMap.get(domNode);\r\n if (eventMap) {\r\n Object.keys(previousProperties).forEach((propName) => {\r\n const isEvent = propName.substr(0, 2) === 'on' || onlyEvents;\r\n const eventName = onlyEvents ? propName : propName.substr(2);\r\n if (isEvent && !properties[propName]) {\r\n const eventCallback = eventMap.get(previousProperties[propName]);\r\n if (eventCallback) {\r\n domNode.removeEventListener(eventName, eventCallback);\r\n }\r\n }\r\n });\r\n }\r\n}\r\nfunction updateAttribute(domNode, attrName, attrValue, projectionOptions) {\r\n if (projectionOptions.namespace === NAMESPACE_SVG && attrName === 'href') {\r\n domNode.setAttributeNS(NAMESPACE_XLINK, attrName, attrValue);\r\n }\r\n else if ((attrName === 'role' && attrValue === '') || attrValue === undefined) {\r\n domNode.removeAttribute(attrName);\r\n }\r\n else {\r\n domNode.setAttribute(attrName, attrValue);\r\n }\r\n}\r\nfunction updateAttributes(domNode, previousAttributes, attributes, projectionOptions) {\r\n const attrNames = Object.keys(attributes);\r\n const attrCount = attrNames.length;\r\n for (let i = 0; i < attrCount; i++) {\r\n const attrName = attrNames[i];\r\n const attrValue = attributes[attrName];\r\n const previousAttrValue = previousAttributes[attrName];\r\n if (attrValue !== previousAttrValue) {\r\n updateAttribute(domNode, attrName, attrValue, projectionOptions);\r\n }\r\n }\r\n}\r\nfunction updateProperties(domNode, previousProperties, properties, projectionOptions, includesEventsAndAttributes = true) {\r\n let propertiesUpdated = false;\r\n const propNames = Object.keys(properties);\r\n const propCount = propNames.length;\r\n if (propNames.indexOf('classes') === -1 && previousProperties.classes) {\r\n if (Array.isArray(previousProperties.classes)) {\r\n for (let i = 0; i < previousProperties.classes.length; i++) {\r\n removeClasses(domNode, previousProperties.classes[i]);\r\n }\r\n }\r\n else {\r\n removeClasses(domNode, previousProperties.classes);\r\n }\r\n }\r\n includesEventsAndAttributes && removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions);\r\n for (let i = 0; i < propCount; i++) {\r\n const propName = propNames[i];\r\n let propValue = properties[propName];\r\n const previousValue = previousProperties[propName];\r\n if (propName === 'classes') {\r\n const previousClasses = Array.isArray(previousValue) ? previousValue : [previousValue];\r\n const currentClasses = Array.isArray(propValue) ? propValue : [propValue];\r\n if (previousClasses && previousClasses.length > 0) {\r\n if (!propValue || propValue.length === 0) {\r\n for (let i = 0; i < previousClasses.length; i++) {\r\n removeClasses(domNode, previousClasses[i]);\r\n }\r\n }\r\n else {\r\n const newClasses = [...currentClasses];\r\n for (let i = 0; i < previousClasses.length; i++) {\r\n const previousClassName = previousClasses[i];\r\n if (previousClassName) {\r\n const classIndex = newClasses.indexOf(previousClassName);\r\n if (classIndex === -1) {\r\n removeClasses(domNode, previousClassName);\r\n }\r\n else {\r\n newClasses.splice(classIndex, 1);\r\n }\r\n }\r\n }\r\n for (let i = 0; i < newClasses.length; i++) {\r\n addClasses(domNode, newClasses[i]);\r\n }\r\n }\r\n }\r\n else {\r\n for (let i = 0; i < currentClasses.length; i++) {\r\n addClasses(domNode, currentClasses[i]);\r\n }\r\n }\r\n }\r\n else if (nodeOperations.indexOf(propName) !== -1) {\r\n nodeOperation(propName, propValue, previousValue, domNode, projectionOptions);\r\n }\r\n else if (propName === 'styles') {\r\n const styleNames = Object.keys(propValue);\r\n const styleCount = styleNames.length;\r\n for (let j = 0; j < styleCount; j++) {\r\n const styleName = styleNames[j];\r\n const newStyleValue = propValue[styleName];\r\n const oldStyleValue = previousValue && previousValue[styleName];\r\n if (newStyleValue === oldStyleValue) {\r\n continue;\r\n }\r\n propertiesUpdated = true;\r\n if (newStyleValue) {\r\n checkStyleValue(newStyleValue);\r\n projectionOptions.styleApplyer(domNode, styleName, newStyleValue);\r\n }\r\n else {\r\n projectionOptions.styleApplyer(domNode, styleName, '');\r\n }\r\n }\r\n }\r\n else {\r\n if (!propValue && typeof previousValue === 'string') {\r\n propValue = '';\r\n }\r\n if (propName === 'value') {\r\n const domValue = domNode[propName];\r\n if (domValue !== propValue &&\r\n (domNode['oninput-value']\r\n ? domValue === domNode['oninput-value']\r\n : propValue !== previousValue)) {\r\n domNode[propName] = propValue;\r\n domNode['oninput-value'] = undefined;\r\n }\r\n if (propValue !== previousValue) {\r\n propertiesUpdated = true;\r\n }\r\n }\r\n else if (propName !== 'key' && propValue !== previousValue) {\r\n const type = typeof propValue;\r\n if (type === 'function' && propName.lastIndexOf('on', 0) === 0 && includesEventsAndAttributes) {\r\n updateEvent(domNode, propName.substr(2), propValue, projectionOptions, properties.bind, previousValue);\r\n }\r\n else if (type === 'string' && propName !== 'innerHTML' && includesEventsAndAttributes) {\r\n updateAttribute(domNode, propName, propValue, projectionOptions);\r\n }\r\n else if (propName === 'scrollLeft' || propName === 'scrollTop') {\r\n if (domNode[propName] !== propValue) {\r\n domNode[propName] = propValue;\r\n }\r\n }\r\n else {\r\n domNode[propName] = propValue;\r\n }\r\n propertiesUpdated = true;\r\n }\r\n }\r\n }\r\n return propertiesUpdated;\r\n}\r\nfunction findIndexOfChild(children, sameAs, start) {\r\n for (let i = start; i < children.length; i++) {\r\n if (same(children[i], sameAs)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\nexport function toParentVNode(domNode) {\r\n return {\r\n tag: '',\r\n properties: {},\r\n children: undefined,\r\n domNode,\r\n type: VNODE\r\n };\r\n}\r\nexport function toTextVNode(data) {\r\n return {\r\n tag: '',\r\n properties: {},\r\n children: undefined,\r\n text: `${data}`,\r\n domNode: undefined,\r\n type: VNODE\r\n };\r\n}\r\nfunction toInternalWNode(instance, instanceData) {\r\n return {\r\n instance,\r\n rendered: [],\r\n coreProperties: instanceData.coreProperties,\r\n children: instance.children,\r\n widgetConstructor: instance.constructor,\r\n properties: instanceData.inputProperties,\r\n type: WNODE\r\n };\r\n}\r\nexport function filterAndDecorateChildren(children, instance) {\r\n if (children === undefined) {\r\n return emptyArray;\r\n }\r\n children = Array.isArray(children) ? children : [children];\r\n for (let i = 0; i < children.length;) {\r\n const child = children[i];\r\n if (child === undefined || child === null) {\r\n children.splice(i, 1);\r\n continue;\r\n }\r\n else if (typeof child === 'string') {\r\n children[i] = toTextVNode(child);\r\n }\r\n else {\r\n if (isVNode(child)) {\r\n if (child.properties.bind === undefined) {\r\n child.properties.bind = instance;\r\n if (child.children && child.children.length > 0) {\r\n filterAndDecorateChildren(child.children, instance);\r\n }\r\n }\r\n }\r\n else {\r\n if (!child.coreProperties) {\r\n const instanceData = widgetInstanceMap.get(instance);\r\n child.coreProperties = {\r\n bind: instance,\r\n baseRegistry: instanceData.coreProperties.baseRegistry\r\n };\r\n }\r\n if (child.children && child.children.length > 0) {\r\n filterAndDecorateChildren(child.children, instance);\r\n }\r\n }\r\n }\r\n i++;\r\n }\r\n return children;\r\n}\r\nfunction nodeAdded(dnode, transitions) {\r\n if (isVNode(dnode) && dnode.properties) {\r\n const enterAnimation = dnode.properties.enterAnimation;\r\n if (enterAnimation) {\r\n if (typeof enterAnimation === 'function') {\r\n enterAnimation(dnode.domNode, dnode.properties);\r\n }\r\n else {\r\n transitions.enter(dnode.domNode, dnode.properties, enterAnimation);\r\n }\r\n }\r\n }\r\n}\r\nfunction nodeToRemove(dnode, transitions, projectionOptions) {\r\n if (isWNode(dnode)) {\r\n const item = instanceMap.get(dnode.instance);\r\n const rendered = (item ? item.dnode.rendered : dnode.rendered) || emptyArray;\r\n if (dnode.instance) {\r\n const instanceData = widgetInstanceMap.get(dnode.instance);\r\n instanceData.onDetach();\r\n instanceMap.delete(dnode.instance);\r\n }\r\n for (let i = 0; i < rendered.length; i++) {\r\n nodeToRemove(rendered[i], transitions, projectionOptions);\r\n }\r\n }\r\n else {\r\n const domNode = dnode.domNode;\r\n const properties = dnode.properties;\r\n if (dnode.children && dnode.children.length > 0) {\r\n for (let i = 0; i < dnode.children.length; i++) {\r\n nodeToRemove(dnode.children[i], transitions, projectionOptions);\r\n }\r\n }\r\n const exitAnimation = properties.exitAnimation;\r\n if (properties && exitAnimation) {\r\n domNode.style.pointerEvents = 'none';\r\n const removeDomNode = function () {\r\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\r\n dnode.domNode = undefined;\r\n };\r\n if (typeof exitAnimation === 'function') {\r\n exitAnimation(domNode, removeDomNode, properties);\r\n return;\r\n }\r\n else {\r\n transitions.exit(dnode.domNode, properties, exitAnimation, removeDomNode);\r\n return;\r\n }\r\n }\r\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\r\n dnode.domNode = undefined;\r\n }\r\n}\r\nfunction checkDistinguishable(childNodes, indexToCheck, parentInstance) {\r\n const childNode = childNodes[indexToCheck];\r\n if (isVNode(childNode) && !childNode.tag) {\r\n return; // Text nodes need not be distinguishable\r\n }\r\n const { key } = childNode.properties;\r\n if (key === undefined || key === null) {\r\n for (let i = 0; i < childNodes.length; i++) {\r\n if (i !== indexToCheck) {\r\n const node = childNodes[i];\r\n if (same(node, childNode)) {\r\n let nodeIdentifier;\r\n const parentName = parentInstance.constructor.name || 'unknown';\r\n if (isWNode(childNode)) {\r\n nodeIdentifier = childNode.widgetConstructor.name || 'unknown';\r\n }\r\n else {\r\n nodeIdentifier = childNode.tag;\r\n }\r\n console.warn(`A widget (${parentName}) has had a child addded or removed, but they were not able to uniquely identified. It is recommended to provide a unique 'key' property when using the same widget or element (${nodeIdentifier}) multiple times as siblings`);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\nfunction updateChildren(parentVNode, siblings, oldChildren, newChildren, parentInstance, projectionOptions) {\r\n oldChildren = oldChildren || emptyArray;\r\n newChildren = newChildren;\r\n const oldChildrenLength = oldChildren.length;\r\n const newChildrenLength = newChildren.length;\r\n const transitions = projectionOptions.transitions;\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\r\n let oldIndex = 0;\r\n let newIndex = 0;\r\n let i;\r\n let textUpdated = false;\r\n while (newIndex < newChildrenLength) {\r\n let oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : undefined;\r\n const newChild = newChildren[newIndex];\r\n if (isVNode(newChild) && typeof newChild.deferredPropertiesCallback === 'function') {\r\n newChild.inserted = isVNode(oldChild) && oldChild.inserted;\r\n addDeferredProperties(newChild, projectionOptions);\r\n }\r\n if (oldChild !== undefined && same(oldChild, newChild)) {\r\n oldIndex++;\r\n newIndex++;\r\n textUpdated =\r\n updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance, oldChildren.slice(oldIndex), newChildren.slice(newIndex)) || textUpdated;\r\n continue;\r\n }\r\n const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);\r\n const addChild = () => {\r\n let insertBeforeDomNode = undefined;\r\n let childrenArray = oldChildren;\r\n let nextIndex = oldIndex + 1;\r\n let child = oldChildren[oldIndex];\r\n if (!child) {\r\n child = siblings[0];\r\n nextIndex = 1;\r\n childrenArray = siblings;\r\n }\r\n if (child) {\r\n let insertBeforeChildren = [child];\r\n while (insertBeforeChildren.length) {\r\n const insertBefore = insertBeforeChildren.shift();\r\n if (isWNode(insertBefore)) {\r\n const item = instanceMap.get(insertBefore.instance);\r\n if (item && item.dnode.rendered) {\r\n insertBeforeChildren.push(...item.dnode.rendered);\r\n }\r\n }\r\n else {\r\n if (insertBefore.domNode) {\r\n if (insertBefore.domNode.parentElement !== parentVNode.domNode) {\r\n break;\r\n }\r\n insertBeforeDomNode = insertBefore.domNode;\r\n break;\r\n }\r\n }\r\n if (insertBeforeChildren.length === 0 && childrenArray[nextIndex]) {\r\n insertBeforeChildren.push(childrenArray[nextIndex]);\r\n nextIndex++;\r\n }\r\n }\r\n }\r\n createDom(newChild, parentVNode, newChildren.slice(newIndex + 1), insertBeforeDomNode, projectionOptions, parentInstance);\r\n nodeAdded(newChild, transitions);\r\n const indexToCheck = newIndex;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(newChildren, indexToCheck, parentInstance);\r\n });\r\n };\r\n if (!oldChild || findOldIndex === -1) {\r\n addChild();\r\n newIndex++;\r\n continue;\r\n }\r\n const removeChild = () => {\r\n const indexToCheck = oldIndex;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\r\n });\r\n if (isWNode(oldChild)) {\r\n const item = instanceMap.get(oldChild.instance);\r\n if (item) {\r\n oldChild = item.dnode;\r\n }\r\n }\r\n nodeToRemove(oldChild, transitions, projectionOptions);\r\n };\r\n const findNewIndex = findIndexOfChild(newChildren, oldChild, newIndex + 1);\r\n if (findNewIndex === -1) {\r\n removeChild();\r\n oldIndex++;\r\n continue;\r\n }\r\n addChild();\r\n removeChild();\r\n oldIndex++;\r\n newIndex++;\r\n }\r\n if (oldChildrenLength > oldIndex) {\r\n // Remove child fragments\r\n for (i = oldIndex; i < oldChildrenLength; i++) {\r\n const indexToCheck = i;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\r\n });\r\n let childToRemove = oldChildren[i];\r\n if (isWNode(childToRemove)) {\r\n const item = instanceMap.get(childToRemove.instance);\r\n if (item) {\r\n childToRemove = item.dnode;\r\n }\r\n }\r\n nodeToRemove(childToRemove, transitions, projectionOptions);\r\n }\r\n }\r\n return textUpdated;\r\n}\r\nfunction addChildren(parentVNode, children, projectionOptions, parentInstance, insertBefore = undefined, childNodes) {\r\n if (children === undefined) {\r\n return;\r\n }\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectorState.merge && childNodes === undefined) {\r\n childNodes = arrayFrom(parentVNode.domNode.childNodes);\r\n }\r\n const transitions = projectionOptions.transitions;\r\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n const nextSiblings = children.slice(i + 1);\r\n if (isVNode(child)) {\r\n if (projectorState.merge && childNodes) {\r\n let domElement = undefined;\r\n while (child.domNode === undefined && childNodes.length > 0) {\r\n domElement = childNodes.shift();\r\n if (domElement && domElement.tagName === (child.tag.toUpperCase() || undefined)) {\r\n child.domNode = domElement;\r\n }\r\n }\r\n }\r\n createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance);\r\n }\r\n else {\r\n createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes);\r\n }\r\n nodeAdded(child, transitions);\r\n }\r\n}\r\nfunction initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions) {\r\n addChildren(dnode, dnode.children, projectionOptions, parentInstance, undefined);\r\n if (typeof dnode.deferredPropertiesCallback === 'function' && dnode.inserted === undefined) {\r\n addDeferredProperties(dnode, projectionOptions);\r\n }\r\n if (dnode.attributes && dnode.events) {\r\n updateAttributes(domNode, {}, dnode.attributes, projectionOptions);\r\n updateProperties(domNode, {}, dnode.properties, projectionOptions, false);\r\n removeOrphanedEvents(domNode, {}, dnode.events, projectionOptions, true);\r\n const events = dnode.events;\r\n Object.keys(events).forEach((event) => {\r\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind);\r\n });\r\n }\r\n else {\r\n updateProperties(domNode, {}, dnode.properties, projectionOptions);\r\n }\r\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\r\n const instanceData = widgetInstanceMap.get(parentInstance);\r\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\r\n }\r\n dnode.inserted = true;\r\n}\r\nfunction createDom(dnode, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes) {\r\n let domNode;\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (isWNode(dnode)) {\r\n let { widgetConstructor } = dnode;\r\n const parentInstanceData = widgetInstanceMap.get(parentInstance);\r\n if (!isWidgetBaseConstructor(widgetConstructor)) {\r\n const item = parentInstanceData.registry().get(widgetConstructor);\r\n if (item === null) {\r\n return;\r\n }\r\n widgetConstructor = item;\r\n }\r\n const instance = new widgetConstructor();\r\n dnode.instance = instance;\r\n nextSiblingMap.set(instance, nextSiblings);\r\n const instanceData = widgetInstanceMap.get(instance);\r\n instanceData.invalidate = () => {\r\n instanceData.dirty = true;\r\n if (instanceData.rendering === false) {\r\n projectorState.renderQueue.push({ instance, depth: projectionOptions.depth });\r\n scheduleRender(projectionOptions);\r\n }\r\n };\r\n instanceData.rendering = true;\r\n instance.__setCoreProperties__(dnode.coreProperties);\r\n instance.__setChildren__(dnode.children);\r\n instance.__setProperties__(dnode.properties);\r\n const rendered = instance.__render__();\r\n instanceData.rendering = false;\r\n if (rendered) {\r\n const filteredRendered = filterAndDecorateChildren(rendered, instance);\r\n dnode.rendered = filteredRendered;\r\n addChildren(parentVNode, filteredRendered, projectionOptions, instance, insertBefore, childNodes);\r\n }\r\n instanceMap.set(instance, { dnode, parentVNode });\r\n instanceData.nodeHandler.addRoot();\r\n projectorState.afterRenderCallbacks.push(() => {\r\n instanceData.onAttach();\r\n });\r\n }\r\n else {\r\n if (projectorState.merge && projectorState.mergeElement !== undefined) {\r\n domNode = dnode.domNode = projectionOptions.mergeElement;\r\n projectorState.mergeElement = undefined;\r\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\r\n return;\r\n }\r\n const doc = parentVNode.domNode.ownerDocument;\r\n if (!dnode.tag && typeof dnode.text === 'string') {\r\n if (dnode.domNode !== undefined && parentVNode.domNode) {\r\n const newDomNode = dnode.domNode.ownerDocument.createTextNode(dnode.text);\r\n if (parentVNode.domNode === dnode.domNode.parentNode) {\r\n parentVNode.domNode.replaceChild(newDomNode, dnode.domNode);\r\n }\r\n else {\r\n parentVNode.domNode.appendChild(newDomNode);\r\n dnode.domNode.parentNode && dnode.domNode.parentNode.removeChild(dnode.domNode);\r\n }\r\n dnode.domNode = newDomNode;\r\n }\r\n else {\r\n domNode = dnode.domNode = doc.createTextNode(dnode.text);\r\n if (insertBefore !== undefined) {\r\n parentVNode.domNode.insertBefore(domNode, insertBefore);\r\n }\r\n else {\r\n parentVNode.domNode.appendChild(domNode);\r\n }\r\n }\r\n }\r\n else {\r\n if (dnode.domNode === undefined) {\r\n if (dnode.tag === 'svg') {\r\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\r\n }\r\n if (projectionOptions.namespace !== undefined) {\r\n domNode = dnode.domNode = doc.createElementNS(projectionOptions.namespace, dnode.tag);\r\n }\r\n else {\r\n domNode = dnode.domNode = dnode.domNode || doc.createElement(dnode.tag);\r\n }\r\n }\r\n else {\r\n domNode = dnode.domNode;\r\n }\r\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\r\n if (insertBefore !== undefined) {\r\n parentVNode.domNode.insertBefore(domNode, insertBefore);\r\n }\r\n else if (domNode.parentNode !== parentVNode.domNode) {\r\n parentVNode.domNode.appendChild(domNode);\r\n }\r\n }\r\n }\r\n}\r\nfunction updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance, oldNextSiblings, nextSiblings) {\r\n if (isWNode(dnode)) {\r\n const { instance } = previous;\r\n const { parentVNode, dnode: node } = instanceMap.get(instance);\r\n const previousRendered = node ? node.rendered : previous.rendered;\r\n const instanceData = widgetInstanceMap.get(instance);\r\n instanceData.rendering = true;\r\n instance.__setCoreProperties__(dnode.coreProperties);\r\n instance.__setChildren__(dnode.children);\r\n instance.__setProperties__(dnode.properties);\r\n nextSiblingMap.set(instance, nextSiblings);\r\n dnode.instance = instance;\r\n if (instanceData.dirty === true) {\r\n const rendered = instance.__render__();\r\n instanceData.rendering = false;\r\n dnode.rendered = filterAndDecorateChildren(rendered, instance);\r\n updateChildren(parentVNode, oldNextSiblings, previousRendered, dnode.rendered, instance, projectionOptions);\r\n }\r\n else {\r\n instanceData.rendering = false;\r\n dnode.rendered = previousRendered;\r\n }\r\n instanceMap.set(instance, { dnode, parentVNode });\r\n instanceData.nodeHandler.addRoot();\r\n }\r\n else {\r\n if (previous === dnode) {\r\n return false;\r\n }\r\n const domNode = (dnode.domNode = previous.domNode);\r\n let textUpdated = false;\r\n let updated = false;\r\n if (!dnode.tag && typeof dnode.text === 'string') {\r\n if (dnode.text !== previous.text) {\r\n const newDomNode = domNode.ownerDocument.createTextNode(dnode.text);\r\n domNode.parentNode.replaceChild(newDomNode, domNode);\r\n dnode.domNode = newDomNode;\r\n textUpdated = true;\r\n return textUpdated;\r\n }\r\n }\r\n else {\r\n if (dnode.tag && dnode.tag.lastIndexOf('svg', 0) === 0) {\r\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\r\n }\r\n if (previous.children !== dnode.children) {\r\n const children = filterAndDecorateChildren(dnode.children, parentInstance);\r\n dnode.children = children;\r\n updated =\r\n updateChildren(dnode, oldNextSiblings, previous.children, children, parentInstance, projectionOptions) || updated;\r\n }\r\n const previousProperties = buildPreviousProperties(domNode, previous, dnode);\r\n if (dnode.attributes && dnode.events) {\r\n updateAttributes(domNode, previousProperties.attributes, dnode.attributes, projectionOptions);\r\n updated =\r\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions, false) || updated;\r\n removeOrphanedEvents(domNode, previousProperties.events, dnode.events, projectionOptions, true);\r\n const events = dnode.events;\r\n Object.keys(events).forEach((event) => {\r\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind, previousProperties.events[event]);\r\n });\r\n }\r\n else {\r\n updated =\r\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions) ||\r\n updated;\r\n }\r\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\r\n const instanceData = widgetInstanceMap.get(parentInstance);\r\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\r\n }\r\n }\r\n if (updated && dnode.properties && dnode.properties.updateAnimation) {\r\n dnode.properties.updateAnimation(domNode, dnode.properties, previous.properties);\r\n }\r\n }\r\n}\r\nfunction addDeferredProperties(vnode, projectionOptions) {\r\n // transfer any properties that have been passed - as these must be decorated properties\r\n vnode.decoratedDeferredProperties = vnode.properties;\r\n const properties = vnode.deferredPropertiesCallback(!!vnode.inserted);\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n vnode.properties = Object.assign({}, properties, vnode.decoratedDeferredProperties);\r\n projectorState.deferredRenderCallbacks.push(() => {\r\n const properties = Object.assign({}, vnode.deferredPropertiesCallback(!!vnode.inserted), vnode.decoratedDeferredProperties);\r\n updateProperties(vnode.domNode, vnode.properties, properties, projectionOptions);\r\n vnode.properties = properties;\r\n });\r\n}\r\nfunction runDeferredRenderCallbacks(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectorState.deferredRenderCallbacks.length) {\r\n if (projectionOptions.sync) {\r\n while (projectorState.deferredRenderCallbacks.length) {\r\n const callback = projectorState.deferredRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n }\r\n else {\r\n global.requestAnimationFrame(() => {\r\n while (projectorState.deferredRenderCallbacks.length) {\r\n const callback = projectorState.deferredRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n }\r\n}\r\nfunction runAfterRenderCallbacks(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectionOptions.sync) {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n }\r\n else {\r\n if (global.requestIdleCallback) {\r\n global.requestIdleCallback(() => {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n else {\r\n setTimeout(() => {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n }\r\n}\r\nfunction scheduleRender(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectionOptions.sync) {\r\n render(projectionOptions);\r\n }\r\n else if (projectorState.renderScheduled === undefined) {\r\n projectorState.renderScheduled = global.requestAnimationFrame(() => {\r\n render(projectionOptions);\r\n });\r\n }\r\n}\r\nfunction render(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectorState.renderScheduled = undefined;\r\n const renderQueue = projectorState.renderQueue;\r\n const renders = [...renderQueue];\r\n projectorState.renderQueue = [];\r\n renders.sort((a, b) => a.depth - b.depth);\r\n const previouslyRendered = [];\r\n while (renders.length) {\r\n const { instance } = renders.shift();\r\n if (instanceMap.has(instance) && previouslyRendered.indexOf(instance) === -1) {\r\n previouslyRendered.push(instance);\r\n const { parentVNode, dnode } = instanceMap.get(instance);\r\n const instanceData = widgetInstanceMap.get(instance);\r\n const nextSiblings = nextSiblingMap.get(instance);\r\n updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance, nextSiblings, nextSiblings);\r\n }\r\n }\r\n runAfterRenderCallbacks(projectionOptions);\r\n runDeferredRenderCallbacks(projectionOptions);\r\n}\r\nexport const dom = {\r\n append: function (parentNode, instance, projectionOptions = {}) {\r\n const instanceData = widgetInstanceMap.get(instance);\r\n const finalProjectorOptions = getProjectionOptions(projectionOptions, instance);\r\n const projectorState = {\r\n afterRenderCallbacks: [],\r\n deferredRenderCallbacks: [],\r\n nodeMap: new WeakMap(),\r\n renderScheduled: undefined,\r\n renderQueue: [],\r\n merge: projectionOptions.merge || false,\r\n mergeElement: projectionOptions.mergeElement\r\n };\r\n projectorStateMap.set(instance, projectorState);\r\n finalProjectorOptions.rootNode = parentNode;\r\n const parentVNode = toParentVNode(finalProjectorOptions.rootNode);\r\n const node = toInternalWNode(instance, instanceData);\r\n instanceMap.set(instance, { dnode: node, parentVNode });\r\n instanceData.invalidate = () => {\r\n instanceData.dirty = true;\r\n if (instanceData.rendering === false) {\r\n projectorState.renderQueue.push({ instance, depth: finalProjectorOptions.depth });\r\n scheduleRender(finalProjectorOptions);\r\n }\r\n };\r\n updateDom(node, node, finalProjectorOptions, parentVNode, instance, [], []);\r\n projectorState.afterRenderCallbacks.push(() => {\r\n instanceData.onAttach();\r\n });\r\n runDeferredRenderCallbacks(finalProjectorOptions);\r\n runAfterRenderCallbacks(finalProjectorOptions);\r\n return {\r\n domNode: finalProjectorOptions.rootNode\r\n };\r\n },\r\n create: function (instance, projectionOptions) {\r\n return this.append(document.createElement('div'), instance, projectionOptions);\r\n },\r\n merge: function (element, instance, projectionOptions = {}) {\r\n projectionOptions.merge = true;\r\n projectionOptions.mergeElement = element;\r\n const projection = this.append(element.parentNode, instance, projectionOptions);\r\n const projectorState = projectorStateMap.get(instance);\r\n projectorState.merge = false;\r\n return projection;\r\n }\r\n};\r\n//# sourceMappingURL=vdom.mjs.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@dojo/framework/widget-core/vdom.mjs\n// module id = ./node_modules/@dojo/framework/widget-core/vdom.mjs\n// module chunks = menu","/*** IMPORTS FROM imports-loader ***/\nvar widgetFactory = require(\"src/menu/Menu\");\n\nvar registerCustomElement = require('@dojo/framework/widget-core/registerCustomElement').default;\r\n\r\nvar defaultExport = widgetFactory.default;\r\ndefaultExport && registerCustomElement(defaultExport);\r\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/imports-loader?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js\n// module id = ./node_modules/imports-loader/index.js?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js\n// module chunks = menu","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/process/browser.js\n// module id = ./node_modules/process/browser.js\n// module chunks = menu","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)\r\n t[p[i]] = s[p[i]];\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = y[op[0] & 2 ? \"return\" : op[0] ? \"throw\" : \"next\"]) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [0, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { if (o[n]) i[n] = function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; }; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator];\r\n return m ? m.call(o) : typeof __values === \"function\" ? __values(o) : o[Symbol.iterator]();\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/tslib/tslib.es6.js\n// module id = ./node_modules/tslib/tslib.es6.js\n// module chunks = menu","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\n} catch(e) {\n\t// This works if the window reference is available\n\tif(typeof window === \"object\")\n\t\tg = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = ./node_modules/webpack/buildin/global.js\n// module chunks = menu","import { v } from '@dojo/framework/widget-core/d';\r\nimport { customElement } from '@dojo/framework/widget-core/decorators/customElement';\r\nimport { WidgetProperties, WNode } from '@dojo/framework/widget-core/interfaces';\r\nimport { theme, ThemedMixin } from '@dojo/framework/widget-core/mixins/Themed';\r\nimport { WidgetBase } from '@dojo/framework/widget-core/WidgetBase';\r\nimport { MenuItem, MenuItemProperties } from '../menu-item/MenuItem';\r\n\r\nimport * as css from './menu.m.css';\r\n\r\ninterface MenuProperties extends WidgetProperties {\r\n\tonSelected: (data: any) => void;\r\n}\r\n\r\n@customElement({\r\n\ttag: 'demo-menu',\r\n\tevents: ['onSelected']\r\n})\r\n@theme(css)\r\nexport class Menu extends ThemedMixin(WidgetBase)> {\r\n\tprivate _selectedId: number;\r\n\r\n\tprivate _onSelected(id: number, data: any) {\r\n\t\tthis._selectedId = id;\r\n\t\tthis.properties.onSelected(data);\r\n\t\tthis.invalidate();\r\n\t}\r\n\r\n\tprotected render() {\r\n\t\tconst items = this.children.map((child, index) => {\r\n\t\t\tif (child) {\r\n\t\t\t\tconst properties: Partial = {\r\n\t\t\t\t\tonSelected: (data: any) => {\r\n\t\t\t\t\t\tthis._onSelected(index, data);\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\tif (this._selectedId !== undefined) {\r\n\t\t\t\t\tproperties.selected = index === this._selectedId;\r\n\t\t\t\t}\r\n\t\t\t\tchild.properties = { ...child.properties, ...properties };\r\n\t\t\t}\r\n\t\t\treturn child;\r\n\t\t});\r\n\r\n\t\treturn v('nav', { classes: this.theme(css.root) }, [\r\n\t\t\tv(\r\n\t\t\t\t'ol',\r\n\t\t\t\t{\r\n\t\t\t\t\tclasses: this.theme(css.menuContainer)\r\n\t\t\t\t},\r\n\t\t\t\titems\r\n\t\t\t)\r\n\t\t]);\r\n\t}\r\n}\r\n\r\nexport default Menu;\r\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@dojo/webpack-contrib/css-module-dts-loader?type=ts&instanceName=0_menu!./src/menu/Menu.ts","// removed by extract-text-webpack-plugin\nmodule.exports = {\" _key\":\"test-app/menu\",\"root\":\"_3bA6jdSn\",\"menuContainer\":\"_1eoGfqku\"};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/menu/menu.m.css\n// module id = ./src/menu/menu.m.css\n// module chunks = menu"],"sourceRoot":""} \ No newline at end of file diff --git a/test-app/fixtures/windows/info/menu-item/report.html b/test-app/fixtures/windows/info/menu-item/report.html index dc2cc77..603d1c2 100644 --- a/test-app/fixtures/windows/info/menu-item/report.html +++ b/test-app/fixtures/windows/info/menu-item/report.html @@ -4,7 +4,7 @@ Webpack Bundle Analyzer diff --git a/test-app/fixtures/windows/info/menu-item/stats.json b/test-app/fixtures/windows/info/menu-item/stats.json index e789e33..b83ca73 100644 --- a/test-app/fixtures/windows/info/menu-item/stats.json +++ b/test-app/fixtures/windows/info/menu-item/stats.json @@ -2,8 +2,8 @@ "errors": [], "warnings": [], "version": "3.8.1", - "hash": "569730b4d721e461702a", - "time": 7360, + "hash": "0f998ebbc6b593fa2700", + "time": 8734, "publicPath": "", "assetsByChunkName": { "menu-item": [ @@ -16,7 +16,7 @@ "assets": [ { "name": "menu-item-1.0.0.js", - "size": 54046, + "size": 55222, "chunks": [ "menu-item" ], @@ -38,7 +38,7 @@ }, { "name": "menu-item-1.0.0.js.map", - "size": 273747, + "size": 275213, "chunks": [ "menu-item" ], @@ -80,7 +80,7 @@ "initial": true, "entry": true, "extraAsync": false, - "size": 194939, + "size": 195159, "names": [ "menu-item" ], @@ -90,16 +90,16 @@ "menu-item-1.0.0.js.map", "menu-item-1.0.0.css.map" ], - "hash": "86233aac98ae5e5258fe", + "hash": "343c518bbb7c58eef0ae", "parents": [], "modules": [ { - "id": "./node_modules/@dojo/core/Destroyable.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Destroyable.mjs", - "name": "./node_modules/@dojo/core/Destroyable.mjs", + "id": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Destroyable.mjs", + "name": "./node_modules/@dojo/framework/core/Destroyable.mjs", "index": 25, "index2": 17, - "size": 1668, + "size": 1665, "cacheable": true, "built": true, "optional": false, @@ -108,18 +108,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Evented.mjs", - "issuerId": "./node_modules/@dojo/core/Evented.mjs", - "issuerName": "./node_modules/@dojo/core/Evented.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Evented.mjs", + "issuerId": "./node_modules/@dojo/framework/core/Evented.mjs", + "issuerName": "./node_modules/@dojo/framework/core/Evented.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/core/Evented.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Evented.mjs", - "module": "./node_modules/@dojo/core/Evented.mjs", - "moduleName": "./node_modules/@dojo/core/Evented.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Evented.mjs", + "module": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Evented.mjs", "type": "harmony import", "userRequest": "./Destroyable", "loc": "2:0-44" @@ -134,15 +134,15 @@ ], "optimizationBailout": [], "depth": 6, - "source": "import { createCompositeHandle } from './lang';\nimport Promise from '@dojo/shim/Promise';\n/**\n * No operation function to replace own once instance is destoryed\n */\nfunction noop() {\n return Promise.resolve(false);\n}\n/**\n * No op function used to replace own, once instance has been destoryed\n */\nfunction destroyed() {\n throw new Error('Call made to destroyed method');\n}\nexport class Destroyable {\n /**\n * @constructor\n */\n constructor() {\n this.handles = [];\n }\n /**\n * Register handles for the instance that will be destroyed when `this.destroy` is called\n *\n * @param {Handle} handle The handle to add for the instance\n * @returns {Handle} a handle for the handle, removes the handle for the instance and calls destroy\n */\n own(handles) {\n const handle = Array.isArray(handles) ? createCompositeHandle(...handles) : handles;\n const { handles: _handles } = this;\n _handles.push(handle);\n return {\n destroy() {\n _handles.splice(_handles.indexOf(handle));\n handle.destroy();\n }\n };\n }\n /**\n * Destrpys all handers registered for the instance\n *\n * @returns {Promise {\n this.handles.forEach((handle) => {\n handle && handle.destroy && handle.destroy();\n });\n this.destroy = noop;\n this.own = destroyed;\n resolve(true);\n });\n }\n}\nexport default Destroyable;\n//# sourceMappingURL=Destroyable.mjs.map" + "source": "import { createCompositeHandle } from './lang';\nimport Promise from '../shim/Promise';\n/**\n * No operation function to replace own once instance is destoryed\n */\nfunction noop() {\n return Promise.resolve(false);\n}\n/**\n * No op function used to replace own, once instance has been destoryed\n */\nfunction destroyed() {\n throw new Error('Call made to destroyed method');\n}\nexport class Destroyable {\n /**\n * @constructor\n */\n constructor() {\n this.handles = [];\n }\n /**\n * Register handles for the instance that will be destroyed when `this.destroy` is called\n *\n * @param {Handle} handle The handle to add for the instance\n * @returns {Handle} a handle for the handle, removes the handle for the instance and calls destroy\n */\n own(handles) {\n const handle = Array.isArray(handles) ? createCompositeHandle(...handles) : handles;\n const { handles: _handles } = this;\n _handles.push(handle);\n return {\n destroy() {\n _handles.splice(_handles.indexOf(handle));\n handle.destroy();\n }\n };\n }\n /**\n * Destrpys all handers registered for the instance\n *\n * @returns {Promise {\n this.handles.forEach((handle) => {\n handle && handle.destroy && handle.destroy();\n });\n this.destroy = noop;\n this.own = destroyed;\n resolve(true);\n });\n }\n}\nexport default Destroyable;\n//# sourceMappingURL=Destroyable.mjs.map" }, { - "id": "./node_modules/@dojo/core/Evented.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Evented.mjs", - "name": "./node_modules/@dojo/core/Evented.mjs", + "id": "./node_modules/@dojo/framework/core/Evented.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Evented.mjs", + "name": "./node_modules/@dojo/framework/core/Evented.mjs", "index": 24, "index2": 18, - "size": 2220, + "size": 2222, "cacheable": true, "built": true, "optional": false, @@ -151,48 +151,48 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\RegistryHandler.mjs", - "issuerId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "issuerName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\RegistryHandler.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\RegistryHandler.mjs", - "module": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\RegistryHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "2:0-45" + "userRequest": "../core/Evented", + "loc": "2:0-42" }, { - "moduleId": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\NodeHandler.mjs", - "module": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "1:0-45" + "userRequest": "../core/Evented", + "loc": "4:0-42" }, { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Injector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Injector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Injector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Injector.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "4:0-45" + "userRequest": "../core/Evented", + "loc": "1:0-42" }, { - "moduleId": "./node_modules/@dojo/widget-core/Injector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Injector.mjs", - "module": "./node_modules/@dojo/widget-core/Injector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Injector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\NodeHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "1:0-45" + "userRequest": "../core/Evented", + "loc": "1:0-42" } ], "usedExports": [ @@ -205,15 +205,15 @@ ], "optimizationBailout": [], "depth": 5, - "source": "import Map from '@dojo/shim/Map';\r\nimport { Destroyable } from './Destroyable';\r\n/**\r\n * Map of computed regular expressions, keyed by string\r\n */\r\nconst regexMap = new Map();\r\n/**\r\n * Determines is the event type glob has been matched\r\n *\r\n * @returns boolean that indicates if the glob is matched\r\n */\r\nexport function isGlobMatch(globString, targetString) {\r\n if (typeof targetString === 'string' && typeof globString === 'string' && globString.indexOf('*') !== -1) {\r\n let regex;\r\n if (regexMap.has(globString)) {\r\n regex = regexMap.get(globString);\r\n }\r\n else {\r\n regex = new RegExp(`^${globString.replace(/\\*/g, '.*')}$`);\r\n regexMap.set(globString, regex);\r\n }\r\n return regex.test(targetString);\r\n }\r\n else {\r\n return globString === targetString;\r\n }\r\n}\r\n/**\r\n * Event Class\r\n */\r\nexport class Evented extends Destroyable {\r\n constructor() {\r\n super(...arguments);\r\n /**\r\n * map of listeners keyed by event type\r\n */\r\n this.listenersMap = new Map();\r\n }\r\n emit(event) {\r\n this.listenersMap.forEach((methods, type) => {\r\n if (isGlobMatch(type, event.type)) {\r\n methods.forEach((method) => {\r\n method.call(this, event);\r\n });\r\n }\r\n });\r\n }\r\n on(type, listener) {\r\n if (Array.isArray(listener)) {\r\n const handles = listener.map((listener) => this._addListener(type, listener));\r\n return {\r\n destroy() {\r\n handles.forEach((handle) => handle.destroy());\r\n }\r\n };\r\n }\r\n return this._addListener(type, listener);\r\n }\r\n _addListener(type, listener) {\r\n const listeners = this.listenersMap.get(type) || [];\r\n listeners.push(listener);\r\n this.listenersMap.set(type, listeners);\r\n return {\r\n destroy: () => {\r\n const listeners = this.listenersMap.get(type) || [];\r\n listeners.splice(listeners.indexOf(listener), 1);\r\n }\r\n };\r\n }\r\n}\r\nexport default Evented;\r\n//# sourceMappingURL=Evented.mjs.map" + "source": "import Map from '../shim/Map';\r\nimport { Destroyable } from './Destroyable';\r\n/**\r\n * Map of computed regular expressions, keyed by string\r\n */\r\nconst regexMap = new Map();\r\n/**\r\n * Determines is the event type glob has been matched\r\n *\r\n * @returns boolean that indicates if the glob is matched\r\n */\r\nexport function isGlobMatch(globString, targetString) {\r\n if (typeof targetString === 'string' && typeof globString === 'string' && globString.indexOf('*') !== -1) {\r\n let regex;\r\n if (regexMap.has(globString)) {\r\n regex = regexMap.get(globString);\r\n }\r\n else {\r\n regex = new RegExp(`^${globString.replace(/\\*/g, '.*')}$`);\r\n regexMap.set(globString, regex);\r\n }\r\n return regex.test(targetString);\r\n }\r\n else {\r\n return globString === targetString;\r\n }\r\n}\r\n/**\r\n * Event Class\r\n */\r\nexport class Evented extends Destroyable {\r\n constructor() {\r\n super(...arguments);\r\n /**\r\n * map of listeners keyed by event type\r\n */\r\n this.listenersMap = new Map();\r\n }\r\n emit(event) {\r\n this.listenersMap.forEach((methods, type) => {\r\n if (isGlobMatch(type, event.type)) {\r\n [...methods].forEach((method) => {\r\n method.call(this, event);\r\n });\r\n }\r\n });\r\n }\r\n on(type, listener) {\r\n if (Array.isArray(listener)) {\r\n const handles = listener.map((listener) => this._addListener(type, listener));\r\n return {\r\n destroy() {\r\n handles.forEach((handle) => handle.destroy());\r\n }\r\n };\r\n }\r\n return this._addListener(type, listener);\r\n }\r\n _addListener(type, listener) {\r\n const listeners = this.listenersMap.get(type) || [];\r\n listeners.push(listener);\r\n this.listenersMap.set(type, listeners);\r\n return {\r\n destroy: () => {\r\n const listeners = this.listenersMap.get(type) || [];\r\n listeners.splice(listeners.indexOf(listener), 1);\r\n }\r\n };\r\n }\r\n}\r\nexport default Evented;\r\n//# sourceMappingURL=Evented.mjs.map" }, { - "id": "./node_modules/@dojo/core/lang.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\lang.mjs", - "name": "./node_modules/@dojo/core/lang.mjs", + "id": "./node_modules/@dojo/framework/core/lang.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\lang.mjs", + "name": "./node_modules/@dojo/framework/core/lang.mjs", "index": 26, "index2": 16, - "size": 6843, + "size": 6837, "cacheable": true, "built": true, "optional": false, @@ -222,27 +222,27 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", - "userRequest": "@dojo/core/lang", + "userRequest": "../../core/lang", "loc": "2:0-41" }, { - "moduleId": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Destroyable.mjs", - "module": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleName": "./node_modules/@dojo/core/Destroyable.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Destroyable.mjs", + "module": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Destroyable.mjs", "type": "harmony import", "userRequest": "./lang", "loc": "1:0-47" @@ -267,12 +267,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { assign } from '@dojo/shim/object';\nexport { assign } from '@dojo/shim/object';\nconst slice = Array.prototype.slice;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Type guard that ensures that the value can be coerced to Object\n * to weed out host objects that do not derive from Object.\n * This function is used to check if we want to deep copy an object or not.\n * Note: In ES6 it is possible to modify an object's Symbol.toStringTag property, which will\n * change the value returned by `toString`. This is a rare edge case that is difficult to handle,\n * so it is not handled here.\n * @param value The value to check\n * @return If the value is coercible into an Object\n */\nfunction shouldDeepCopyObject(value) {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\nfunction copyArray(array, inherited) {\n return array.map(function (item) {\n if (Array.isArray(item)) {\n return copyArray(item, inherited);\n }\n return !shouldDeepCopyObject(item)\n ? item\n : _mixin({\n deep: true,\n inherited: inherited,\n sources: [item],\n target: {}\n });\n });\n}\nfunction _mixin(kwArgs) {\n const deep = kwArgs.deep;\n const inherited = kwArgs.inherited;\n const target = kwArgs.target;\n const copied = kwArgs.copied || [];\n const copiedClone = [...copied];\n for (let i = 0; i < kwArgs.sources.length; i++) {\n const source = kwArgs.sources[i];\n if (source === null || source === undefined) {\n continue;\n }\n for (let key in source) {\n if (inherited || hasOwnProperty.call(source, key)) {\n let value = source[key];\n if (copiedClone.indexOf(value) !== -1) {\n continue;\n }\n if (deep) {\n if (Array.isArray(value)) {\n value = copyArray(value, inherited);\n }\n else if (shouldDeepCopyObject(value)) {\n const targetValue = target[key] || {};\n copied.push(source);\n value = _mixin({\n deep: true,\n inherited: inherited,\n sources: [value],\n target: targetValue,\n copied\n });\n }\n }\n target[key] = value;\n }\n }\n }\n return target;\n}\nexport function create(prototype, ...mixins) {\n if (!mixins.length) {\n throw new RangeError('lang.create requires at least one mixin object.');\n }\n const args = mixins.slice();\n args.unshift(Object.create(prototype));\n return assign.apply(null, args);\n}\nexport function deepAssign(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: false,\n sources: sources,\n target: target\n });\n}\nexport function deepMixin(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Creates a new object using the provided source's prototype as the prototype for the new object, and then\n * deep copies the provided source's values into the new target.\n *\n * @param source The object to duplicate\n * @return The new object\n */\nexport function duplicate(source) {\n const target = Object.create(Object.getPrototypeOf(source));\n return deepMixin(target, source);\n}\n/**\n * Determines whether two values are the same value.\n *\n * @param a First value to compare\n * @param b Second value to compare\n * @return true if the values are the same; false otherwise\n */\nexport function isIdentical(a, b) {\n return (a === b ||\n /* both values are NaN */\n (a !== a && b !== b));\n}\n/**\n * Returns a function that binds a method to the specified object at runtime. This is similar to\n * `Function.prototype.bind`, but instead of a function it takes the name of a method on an object.\n * As a result, the function returned by `lateBind` will always call the function currently assigned to\n * the specified property on the object as of the moment the function it returns is called.\n *\n * @param instance The context object\n * @param method The name of the method on the context object to bind to itself\n * @param suppliedArgs An optional array of values to prepend to the `instance[method]` arguments list\n * @return The bound function\n */\nexport function lateBind(instance, method, ...suppliedArgs) {\n return suppliedArgs.length\n ? function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n // TS7017\n return instance[method].apply(instance, args);\n }\n : function () {\n // TS7017\n return instance[method].apply(instance, arguments);\n };\n}\nexport function mixin(target, ...sources) {\n return _mixin({\n deep: false,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Returns a function which invokes the given function with the given arguments prepended to its argument list.\n * Like `Function.prototype.bind`, but does not alter execution context.\n *\n * @param targetFunction The function that needs to be bound\n * @param suppliedArgs An optional array of arguments to prepend to the `targetFunction` arguments list\n * @return The bound function\n */\nexport function partial(targetFunction, ...suppliedArgs) {\n return function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n return targetFunction.apply(this, args);\n };\n}\n/**\n * Returns an object with a destroy method that, when called, calls the passed-in destructor.\n * This is intended to provide a unified interface for creating \"remove\" / \"destroy\" handlers for\n * event listeners, timers, etc.\n *\n * @param destructor A function that will be called when the handle's `destroy` method is invoked\n * @return The handle object\n */\nexport function createHandle(destructor) {\n let called = false;\n return {\n destroy: function () {\n if (!called) {\n called = true;\n destructor();\n }\n }\n };\n}\n/**\n * Returns a single handle that can be used to destroy multiple handles simultaneously.\n *\n * @param handles An array of handles with `destroy` methods\n * @return The handle object\n */\nexport function createCompositeHandle(...handles) {\n return createHandle(function () {\n for (let i = 0; i < handles.length; i++) {\n handles[i].destroy();\n }\n });\n}\n//# sourceMappingURL=lang.mjs.map" + "source": "import { assign } from '../shim/object';\nexport { assign } from '../shim/object';\nconst slice = Array.prototype.slice;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Type guard that ensures that the value can be coerced to Object\n * to weed out host objects that do not derive from Object.\n * This function is used to check if we want to deep copy an object or not.\n * Note: In ES6 it is possible to modify an object's Symbol.toStringTag property, which will\n * change the value returned by `toString`. This is a rare edge case that is difficult to handle,\n * so it is not handled here.\n * @param value The value to check\n * @return If the value is coercible into an Object\n */\nfunction shouldDeepCopyObject(value) {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\nfunction copyArray(array, inherited) {\n return array.map(function (item) {\n if (Array.isArray(item)) {\n return copyArray(item, inherited);\n }\n return !shouldDeepCopyObject(item)\n ? item\n : _mixin({\n deep: true,\n inherited: inherited,\n sources: [item],\n target: {}\n });\n });\n}\nfunction _mixin(kwArgs) {\n const deep = kwArgs.deep;\n const inherited = kwArgs.inherited;\n const target = kwArgs.target;\n const copied = kwArgs.copied || [];\n const copiedClone = [...copied];\n for (let i = 0; i < kwArgs.sources.length; i++) {\n const source = kwArgs.sources[i];\n if (source === null || source === undefined) {\n continue;\n }\n for (let key in source) {\n if (inherited || hasOwnProperty.call(source, key)) {\n let value = source[key];\n if (copiedClone.indexOf(value) !== -1) {\n continue;\n }\n if (deep) {\n if (Array.isArray(value)) {\n value = copyArray(value, inherited);\n }\n else if (shouldDeepCopyObject(value)) {\n const targetValue = target[key] || {};\n copied.push(source);\n value = _mixin({\n deep: true,\n inherited: inherited,\n sources: [value],\n target: targetValue,\n copied\n });\n }\n }\n target[key] = value;\n }\n }\n }\n return target;\n}\nexport function create(prototype, ...mixins) {\n if (!mixins.length) {\n throw new RangeError('lang.create requires at least one mixin object.');\n }\n const args = mixins.slice();\n args.unshift(Object.create(prototype));\n return assign.apply(null, args);\n}\nexport function deepAssign(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: false,\n sources: sources,\n target: target\n });\n}\nexport function deepMixin(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Creates a new object using the provided source's prototype as the prototype for the new object, and then\n * deep copies the provided source's values into the new target.\n *\n * @param source The object to duplicate\n * @return The new object\n */\nexport function duplicate(source) {\n const target = Object.create(Object.getPrototypeOf(source));\n return deepMixin(target, source);\n}\n/**\n * Determines whether two values are the same value.\n *\n * @param a First value to compare\n * @param b Second value to compare\n * @return true if the values are the same; false otherwise\n */\nexport function isIdentical(a, b) {\n return (a === b ||\n /* both values are NaN */\n (a !== a && b !== b));\n}\n/**\n * Returns a function that binds a method to the specified object at runtime. This is similar to\n * `Function.prototype.bind`, but instead of a function it takes the name of a method on an object.\n * As a result, the function returned by `lateBind` will always call the function currently assigned to\n * the specified property on the object as of the moment the function it returns is called.\n *\n * @param instance The context object\n * @param method The name of the method on the context object to bind to itself\n * @param suppliedArgs An optional array of values to prepend to the `instance[method]` arguments list\n * @return The bound function\n */\nexport function lateBind(instance, method, ...suppliedArgs) {\n return suppliedArgs.length\n ? function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n // TS7017\n return instance[method].apply(instance, args);\n }\n : function () {\n // TS7017\n return instance[method].apply(instance, arguments);\n };\n}\nexport function mixin(target, ...sources) {\n return _mixin({\n deep: false,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Returns a function which invokes the given function with the given arguments prepended to its argument list.\n * Like `Function.prototype.bind`, but does not alter execution context.\n *\n * @param targetFunction The function that needs to be bound\n * @param suppliedArgs An optional array of arguments to prepend to the `targetFunction` arguments list\n * @return The bound function\n */\nexport function partial(targetFunction, ...suppliedArgs) {\n return function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n return targetFunction.apply(this, args);\n };\n}\n/**\n * Returns an object with a destroy method that, when called, calls the passed-in destructor.\n * This is intended to provide a unified interface for creating \"remove\" / \"destroy\" handlers for\n * event listeners, timers, etc.\n *\n * @param destructor A function that will be called when the handle's `destroy` method is invoked\n * @return The handle object\n */\nexport function createHandle(destructor) {\n let called = false;\n return {\n destroy: function () {\n if (!called) {\n called = true;\n destructor();\n }\n }\n };\n}\n/**\n * Returns a single handle that can be used to destroy multiple handles simultaneously.\n *\n * @param handles An array of handles with `destroy` methods\n * @return The handle object\n */\nexport function createCompositeHandle(...handles) {\n return createHandle(function () {\n for (let i = 0; i < handles.length; i++) {\n handles[i].destroy();\n }\n });\n}\n//# sourceMappingURL=lang.mjs.map" }, { - "id": "./node_modules/@dojo/has/has.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\has\\has.mjs", - "name": "./node_modules/@dojo/has/has.mjs", + "id": "./node_modules/@dojo/framework/has/has.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\has\\has.mjs", + "name": "./node_modules/@dojo/framework/has/has.mjs", "index": 7, "index2": 3, "size": 6500, @@ -284,29 +284,29 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\has.mjs", - "issuerId": "./node_modules/@dojo/shim/support/has.mjs", - "issuerName": "./node_modules/@dojo/shim/support/has.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\has.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/support/has.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/support/has.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\has.mjs", - "module": "./node_modules/@dojo/shim/support/has.mjs", - "moduleName": "./node_modules/@dojo/shim/support/has.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\has.mjs", + "module": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/has.mjs", "type": "harmony import", - "userRequest": "@dojo/has/has", + "userRequest": "../../has/has", "loc": "1:0-41" }, { - "moduleId": "./node_modules/@dojo/shim/support/has.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\has.mjs", - "module": "./node_modules/@dojo/shim/support/has.mjs", - "moduleName": "./node_modules/@dojo/shim/support/has.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\has.mjs", + "module": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/has.mjs", "type": "harmony import", - "userRequest": "@dojo/has/has", + "userRequest": "../../has/has", "loc": "4:0-30" } ], @@ -328,9 +328,9 @@ "source": "function isFeatureTestThenable(value) {\r\n return value && value.then;\r\n}\r\n/**\r\n * A cache of results of feature tests\r\n */\r\nexport const testCache = {};\r\n/**\r\n * A cache of the un-resolved feature tests\r\n */\r\nexport const testFunctions = {};\r\n/**\r\n * A cache of unresolved thenables (probably promises)\r\n * @type {{}}\r\n */\r\nconst testThenables = {};\r\n/**\r\n * A reference to the global scope (`window` in a browser, `global` in NodeJS)\r\n */\r\nconst globalScope = (function () {\r\n /* istanbul ignore else */\r\n if (typeof window !== 'undefined') {\r\n // Browsers\r\n return window;\r\n }\r\n else if (typeof global !== 'undefined') {\r\n // Node\r\n return global;\r\n }\r\n else if (typeof self !== 'undefined') {\r\n // Web workers\r\n return self;\r\n }\r\n /* istanbul ignore next */\r\n return {};\r\n})();\r\n/* Grab the staticFeatures if there are available */\r\nconst { staticFeatures } = globalScope.DojoHasEnvironment || {};\r\n/* Cleaning up the DojoHasEnviornment */\r\nif ('DojoHasEnvironment' in globalScope) {\r\n delete globalScope.DojoHasEnvironment;\r\n}\r\n/**\r\n * Custom type guard to narrow the `staticFeatures` to either a map or a function that\r\n * returns a map.\r\n *\r\n * @param value The value to guard for\r\n */\r\nfunction isStaticFeatureFunction(value) {\r\n return typeof value === 'function';\r\n}\r\n/**\r\n * The cache of asserted features that were available in the global scope when the\r\n * module loaded\r\n */\r\nconst staticCache = staticFeatures\r\n ? isStaticFeatureFunction(staticFeatures) ? staticFeatures.apply(globalScope) : staticFeatures\r\n : {}; /* Providing an empty cache, if none was in the environment\r\n\r\n/**\r\n* AMD plugin function.\r\n*\r\n* Conditional loads modules based on a has feature test value.\r\n*\r\n* @param resourceId Gives the resolved module id to load.\r\n* @param require The loader require function with respect to the module that contained the plugin resource in its\r\n* dependency list.\r\n* @param load Callback to loader that consumes result of plugin demand.\r\n*/\r\nexport function load(resourceId, require, load, config) {\r\n resourceId ? require([resourceId], load) : load();\r\n}\r\n/**\r\n * AMD plugin function.\r\n *\r\n * Resolves resourceId into a module id based on possibly-nested tenary expression that branches on has feature test\r\n * value(s).\r\n *\r\n * @param resourceId The id of the module\r\n * @param normalize Resolves a relative module id into an absolute module id\r\n */\r\nexport function normalize(resourceId, normalize) {\r\n const tokens = resourceId.match(/[\\?:]|[^:\\?]*/g) || [];\r\n let i = 0;\r\n function get(skip) {\r\n const term = tokens[i++];\r\n if (term === ':') {\r\n // empty string module name, resolves to null\r\n return null;\r\n }\r\n else {\r\n // postfixed with a ? means it is a feature to branch on, the term is the name of the feature\r\n if (tokens[i++] === '?') {\r\n if (!skip && has(term)) {\r\n // matched the feature, get the first value from the options\r\n return get();\r\n }\r\n else {\r\n // did not match, get the second value, passing over the first\r\n get(true);\r\n return get(skip);\r\n }\r\n }\r\n // a module\r\n return term;\r\n }\r\n }\r\n const id = get();\r\n return id && normalize(id);\r\n}\r\n/**\r\n * Check if a feature has already been registered\r\n *\r\n * @param feature the name of the feature\r\n */\r\nexport function exists(feature) {\r\n const normalizedFeature = feature.toLowerCase();\r\n return Boolean(normalizedFeature in staticCache || normalizedFeature in testCache || testFunctions[normalizedFeature]);\r\n}\r\n/**\r\n * Register a new test for a named feature.\r\n *\r\n * @example\r\n * has.add('dom-addeventlistener', !!document.addEventListener);\r\n *\r\n * @example\r\n * has.add('touch-events', function () {\r\n * return 'ontouchstart' in document\r\n * });\r\n *\r\n * @param feature the name of the feature\r\n * @param value the value reported of the feature, or a function that will be executed once on first test\r\n * @param overwrite if an existing value should be overwritten. Defaults to false.\r\n */\r\nexport function add(feature, value, overwrite = false) {\r\n const normalizedFeature = feature.toLowerCase();\r\n if (exists(normalizedFeature) && !overwrite && !(normalizedFeature in staticCache)) {\r\n throw new TypeError(`Feature \"${feature}\" exists and overwrite not true.`);\r\n }\r\n if (typeof value === 'function') {\r\n testFunctions[normalizedFeature] = value;\r\n }\r\n else if (isFeatureTestThenable(value)) {\r\n testThenables[feature] = value.then((resolvedValue) => {\r\n testCache[feature] = resolvedValue;\r\n delete testThenables[feature];\r\n }, () => {\r\n delete testThenables[feature];\r\n });\r\n }\r\n else {\r\n testCache[normalizedFeature] = value;\r\n delete testFunctions[normalizedFeature];\r\n }\r\n}\r\n/**\r\n * Return the current value of a named feature.\r\n *\r\n * @param feature The name (if a string) or identifier (if an integer) of the feature to test.\r\n */\r\nexport default function has(feature) {\r\n let result;\r\n const normalizedFeature = feature.toLowerCase();\r\n if (normalizedFeature in staticCache) {\r\n result = staticCache[normalizedFeature];\r\n }\r\n else if (testFunctions[normalizedFeature]) {\r\n result = testCache[normalizedFeature] = testFunctions[normalizedFeature].call(null);\r\n delete testFunctions[normalizedFeature];\r\n }\r\n else if (normalizedFeature in testCache) {\r\n result = testCache[normalizedFeature];\r\n }\r\n else if (feature in testThenables) {\r\n return false;\r\n }\r\n else {\r\n throw new TypeError(`Attempt to detect unregistered has feature \"${feature}\"`);\r\n }\r\n return result;\r\n}\r\n/*\r\n * Out of the box feature tests\r\n */\r\n/* Environments */\r\n/* Used as a value to provide a debug only code path */\r\nadd('debug', true);\r\n/* Detects if the environment is \"browser like\" */\r\nadd('host-browser', typeof document !== 'undefined' && typeof location !== 'undefined');\r\n/* Detects if the environment appears to be NodeJS */\r\nadd('host-node', function () {\r\n if (typeof process === 'object' && process.versions && process.versions.node) {\r\n return process.versions.node;\r\n }\r\n});\r\n//# sourceMappingURL=has.mjs.map" }, { - "id": "./node_modules/@dojo/shim/Map.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "name": "./node_modules/@dojo/shim/Map.mjs", + "id": "./node_modules/@dojo/framework/shim/Map.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "name": "./node_modules/@dojo/framework/shim/Map.mjs", "index": 15, "index2": 12, "size": 3426, @@ -342,57 +342,57 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "1:0-33" + "userRequest": "../shim/Map", + "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\RegistryHandler.mjs", - "module": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\RegistryHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "1:0-37" + "userRequest": "../shim/Map", + "loc": "1:0-34" }, { - "moduleId": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\NodeHandler.mjs", - "module": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "2:0-33" + "userRequest": "../shim/Map", + "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\NodeHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "2:0-33" + "userRequest": "../shim/Map", + "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/core/Evented.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Evented.mjs", - "module": "./node_modules/@dojo/core/Evented.mjs", - "moduleName": "./node_modules/@dojo/core/Evented.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Evented.mjs", + "module": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Evented.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "1:0-33" + "userRequest": "../shim/Map", + "loc": "1:0-30" } ], "usedExports": [ @@ -408,9 +408,9 @@ "source": "import { isArrayLike, ShimIterator } from './iterator';\r\nimport global from './global';\r\nimport { is as objectIs } from './object';\r\nimport has from './support/has';\r\nimport './Symbol';\r\nexport let Map = global.Map;\r\nif (!true) {\r\n Map = (_a = class Map {\r\n constructor(iterable) {\r\n this._keys = [];\r\n this._values = [];\r\n this[Symbol.toStringTag] = 'Map';\r\n if (iterable) {\r\n if (isArrayLike(iterable)) {\r\n for (let i = 0; i < iterable.length; i++) {\r\n const value = iterable[i];\r\n this.set(value[0], value[1]);\r\n }\r\n }\r\n else {\r\n for (const value of iterable) {\r\n this.set(value[0], value[1]);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * An alternative to Array.prototype.indexOf using Object.is\r\n * to check for equality. See http://mzl.la/1zuKO2V\r\n */\r\n _indexOfKey(keys, key) {\r\n for (let i = 0, length = keys.length; i < length; i++) {\r\n if (objectIs(keys[i], key)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n get size() {\r\n return this._keys.length;\r\n }\r\n clear() {\r\n this._keys.length = this._values.length = 0;\r\n }\r\n delete(key) {\r\n const index = this._indexOfKey(this._keys, key);\r\n if (index < 0) {\r\n return false;\r\n }\r\n this._keys.splice(index, 1);\r\n this._values.splice(index, 1);\r\n return true;\r\n }\r\n entries() {\r\n const values = this._keys.map((key, i) => {\r\n return [key, this._values[i]];\r\n });\r\n return new ShimIterator(values);\r\n }\r\n forEach(callback, context) {\r\n const keys = this._keys;\r\n const values = this._values;\r\n for (let i = 0, length = keys.length; i < length; i++) {\r\n callback.call(context, values[i], keys[i], this);\r\n }\r\n }\r\n get(key) {\r\n const index = this._indexOfKey(this._keys, key);\r\n return index < 0 ? undefined : this._values[index];\r\n }\r\n has(key) {\r\n return this._indexOfKey(this._keys, key) > -1;\r\n }\r\n keys() {\r\n return new ShimIterator(this._keys);\r\n }\r\n set(key, value) {\r\n let index = this._indexOfKey(this._keys, key);\r\n index = index < 0 ? this._keys.length : index;\r\n this._keys[index] = key;\r\n this._values[index] = value;\r\n return this;\r\n }\r\n values() {\r\n return new ShimIterator(this._values);\r\n }\r\n [Symbol.iterator]() {\r\n return this.entries();\r\n }\r\n },\r\n _a[Symbol.species] = _a,\r\n _a);\r\n}\r\nexport default Map;\r\nvar _a;\r\n//# sourceMappingURL=Map.mjs.map" }, { - "id": "./node_modules/@dojo/shim/Promise.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Promise.mjs", - "name": "./node_modules/@dojo/shim/Promise.mjs", + "id": "./node_modules/@dojo/framework/shim/Promise.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Promise.mjs", + "name": "./node_modules/@dojo/framework/shim/Promise.mjs", "index": 22, "index2": 15, "size": 8717, @@ -422,30 +422,30 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Registry.mjs", - "issuerId": "./node_modules/@dojo/widget-core/Registry.mjs", - "issuerName": "./node_modules/@dojo/widget-core/Registry.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Registry.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Promise", - "loc": "1:0-41" + "userRequest": "../shim/Promise", + "loc": "1:0-38" }, { - "moduleId": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Destroyable.mjs", - "module": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleName": "./node_modules/@dojo/core/Destroyable.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Destroyable.mjs", + "module": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Destroyable.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Promise", - "loc": "2:0-41" + "userRequest": "../shim/Promise", + "loc": "2:0-38" } ], "usedExports": [ @@ -461,9 +461,9 @@ "source": "import global from './global';\r\nimport { queueMicroTask } from './support/queue';\r\nimport './Symbol';\r\nimport has from './support/has';\r\nexport let ShimPromise = global.Promise;\r\nexport const isThenable = function isThenable(value) {\r\n return value && typeof value.then === 'function';\r\n};\r\nif (!true) {\r\n global.Promise = ShimPromise = (_a = class Promise {\r\n /**\r\n * Creates a new Promise.\r\n *\r\n * @constructor\r\n *\r\n * @param executor\r\n * The executor function is called immediately when the Promise is instantiated. It is responsible for\r\n * starting the asynchronous operation when it is invoked.\r\n *\r\n * The executor must call either the passed `resolve` function when the asynchronous operation has completed\r\n * successfully, or the `reject` function when the operation fails.\r\n */\r\n constructor(executor) {\r\n /**\r\n * The current state of this promise.\r\n */\r\n this.state = 1 /* Pending */;\r\n this[Symbol.toStringTag] = 'Promise';\r\n /**\r\n * If true, the resolution of this promise is chained (\"locked in\") to another promise.\r\n */\r\n let isChained = false;\r\n /**\r\n * Whether or not this promise is in a resolved state.\r\n */\r\n const isResolved = () => {\r\n return this.state !== 1 /* Pending */ || isChained;\r\n };\r\n /**\r\n * Callbacks that should be invoked once the asynchronous operation has completed.\r\n */\r\n let callbacks = [];\r\n /**\r\n * Initially pushes callbacks onto a queue for execution once this promise settles. After the promise settles,\r\n * enqueues callbacks for execution on the next event loop turn.\r\n */\r\n let whenFinished = function (callback) {\r\n if (callbacks) {\r\n callbacks.push(callback);\r\n }\r\n };\r\n /**\r\n * Settles this promise.\r\n *\r\n * @param newState The resolved state for this promise.\r\n * @param {T|any} value The resolved value for this promise.\r\n */\r\n const settle = (newState, value) => {\r\n // A promise can only be settled once.\r\n if (this.state !== 1 /* Pending */) {\r\n return;\r\n }\r\n this.state = newState;\r\n this.resolvedValue = value;\r\n whenFinished = queueMicroTask;\r\n // Only enqueue a callback runner if there are callbacks so that initially fulfilled Promises don't have to\r\n // wait an extra turn.\r\n if (callbacks && callbacks.length > 0) {\r\n queueMicroTask(function () {\r\n if (callbacks) {\r\n let count = callbacks.length;\r\n for (let i = 0; i < count; ++i) {\r\n callbacks[i].call(null);\r\n }\r\n callbacks = null;\r\n }\r\n });\r\n }\r\n };\r\n /**\r\n * Resolves this promise.\r\n *\r\n * @param newState The resolved state for this promise.\r\n * @param {T|any} value The resolved value for this promise.\r\n */\r\n const resolve = (newState, value) => {\r\n if (isResolved()) {\r\n return;\r\n }\r\n if (isThenable(value)) {\r\n value.then(settle.bind(null, 0 /* Fulfilled */), settle.bind(null, 2 /* Rejected */));\r\n isChained = true;\r\n }\r\n else {\r\n settle(newState, value);\r\n }\r\n };\r\n this.then = (onFulfilled, onRejected) => {\r\n return new Promise((resolve, reject) => {\r\n // whenFinished initially queues up callbacks for execution after the promise has settled. Once the\r\n // promise has settled, whenFinished will schedule callbacks for execution on the next turn through the\r\n // event loop.\r\n whenFinished(() => {\r\n const callback = this.state === 2 /* Rejected */ ? onRejected : onFulfilled;\r\n if (typeof callback === 'function') {\r\n try {\r\n resolve(callback(this.resolvedValue));\r\n }\r\n catch (error) {\r\n reject(error);\r\n }\r\n }\r\n else if (this.state === 2 /* Rejected */) {\r\n reject(this.resolvedValue);\r\n }\r\n else {\r\n resolve(this.resolvedValue);\r\n }\r\n });\r\n });\r\n };\r\n try {\r\n executor(resolve.bind(null, 0 /* Fulfilled */), resolve.bind(null, 2 /* Rejected */));\r\n }\r\n catch (error) {\r\n settle(2 /* Rejected */, error);\r\n }\r\n }\r\n static all(iterable) {\r\n return new this(function (resolve, reject) {\r\n const values = [];\r\n let complete = 0;\r\n let total = 0;\r\n let populating = true;\r\n function fulfill(index, value) {\r\n values[index] = value;\r\n ++complete;\r\n finish();\r\n }\r\n function finish() {\r\n if (populating || complete < total) {\r\n return;\r\n }\r\n resolve(values);\r\n }\r\n function processItem(index, item) {\r\n ++total;\r\n if (isThenable(item)) {\r\n // If an item Promise rejects, this Promise is immediately rejected with the item\r\n // Promise's rejection error.\r\n item.then(fulfill.bind(null, index), reject);\r\n }\r\n else {\r\n Promise.resolve(item).then(fulfill.bind(null, index));\r\n }\r\n }\r\n let i = 0;\r\n for (const value of iterable) {\r\n processItem(i, value);\r\n i++;\r\n }\r\n populating = false;\r\n finish();\r\n });\r\n }\r\n static race(iterable) {\r\n return new this(function (resolve, reject) {\r\n for (const item of iterable) {\r\n if (item instanceof Promise) {\r\n // If a Promise item rejects, this Promise is immediately rejected with the item\r\n // Promise's rejection error.\r\n item.then(resolve, reject);\r\n }\r\n else {\r\n Promise.resolve(item).then(resolve);\r\n }\r\n }\r\n });\r\n }\r\n static reject(reason) {\r\n return new this(function (resolve, reject) {\r\n reject(reason);\r\n });\r\n }\r\n static resolve(value) {\r\n return new this(function (resolve) {\r\n resolve(value);\r\n });\r\n }\r\n catch(onRejected) {\r\n return this.then(undefined, onRejected);\r\n }\r\n },\r\n _a[Symbol.species] = ShimPromise,\r\n _a);\r\n}\r\nexport default ShimPromise;\r\nvar _a;\r\n//# sourceMappingURL=Promise.mjs.map" }, { - "id": "./node_modules/@dojo/shim/Symbol.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Symbol.mjs", - "name": "./node_modules/@dojo/shim/Symbol.mjs", + "id": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Symbol.mjs", + "name": "./node_modules/@dojo/framework/shim/Symbol.mjs", "index": 5, "index2": 7, "size": 6073, @@ -475,81 +475,81 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Symbol", - "loc": "3:0-39" - }, - { - "moduleId": "./node_modules/@dojo/widget-core/d.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\d.mjs", - "module": "./node_modules/@dojo/widget-core/d.mjs", - "moduleName": "./node_modules/@dojo/widget-core/d.mjs", - "type": "harmony import", - "userRequest": "@dojo/shim/Symbol", - "loc": "1:0-39" + "userRequest": "../shim/Symbol", + "loc": "3:0-36" }, { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/d.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\d.mjs", + "module": "./node_modules/@dojo/framework/widget-core/d.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/d.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Symbol", - "loc": "3:0-39" + "userRequest": "../shim/Symbol", + "loc": "1:0-36" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "5:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "4:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/iterator.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\iterator.mjs", - "module": "./node_modules/@dojo/shim/iterator.mjs", - "moduleName": "./node_modules/@dojo/shim/iterator.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "type": "harmony import", + "userRequest": "../shim/Symbol", + "loc": "3:0-36" + }, + { + "moduleId": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\iterator.mjs", + "module": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/iterator.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "1:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "3:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/object.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\object.mjs", - "module": "./node_modules/@dojo/shim/object.mjs", - "moduleName": "./node_modules/@dojo/shim/object.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\object.mjs", + "module": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/object.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "3:0-36" @@ -568,9 +568,9 @@ "source": "import has from './support/has';\r\nimport global from './global';\r\nimport { getValueDescriptor } from './support/util';\r\nexport let Symbol = global.Symbol;\r\nif (!true) {\r\n /**\r\n * Throws if the value is not a symbol, used internally within the Shim\r\n * @param {any} value The value to check\r\n * @return {symbol} Returns the symbol or throws\r\n */\r\n const validateSymbol = function validateSymbol(value) {\r\n if (!isSymbol(value)) {\r\n throw new TypeError(value + ' is not a symbol');\r\n }\r\n return value;\r\n };\r\n const defineProperties = Object.defineProperties;\r\n const defineProperty = Object.defineProperty;\r\n const create = Object.create;\r\n const objPrototype = Object.prototype;\r\n const globalSymbols = {};\r\n const getSymbolName = (function () {\r\n const created = create(null);\r\n return function (desc) {\r\n let postfix = 0;\r\n let name;\r\n while (created[String(desc) + (postfix || '')]) {\r\n ++postfix;\r\n }\r\n desc += String(postfix || '');\r\n created[desc] = true;\r\n name = '@@' + desc;\r\n // FIXME: Temporary guard until the duplicate execution when testing can be\r\n // pinned down.\r\n if (!Object.getOwnPropertyDescriptor(objPrototype, name)) {\r\n defineProperty(objPrototype, name, {\r\n set: function (value) {\r\n defineProperty(this, name, getValueDescriptor(value));\r\n }\r\n });\r\n }\r\n return name;\r\n };\r\n })();\r\n const InternalSymbol = function Symbol(description) {\r\n if (this instanceof InternalSymbol) {\r\n throw new TypeError('TypeError: Symbol is not a constructor');\r\n }\r\n return Symbol(description);\r\n };\r\n Symbol = global.Symbol = function Symbol(description) {\r\n if (this instanceof Symbol) {\r\n throw new TypeError('TypeError: Symbol is not a constructor');\r\n }\r\n const sym = Object.create(InternalSymbol.prototype);\r\n description = description === undefined ? '' : String(description);\r\n return defineProperties(sym, {\r\n __description__: getValueDescriptor(description),\r\n __name__: getValueDescriptor(getSymbolName(description))\r\n });\r\n };\r\n /* Decorate the Symbol function with the appropriate properties */\r\n defineProperty(Symbol, 'for', getValueDescriptor(function (key) {\r\n if (globalSymbols[key]) {\r\n return globalSymbols[key];\r\n }\r\n return (globalSymbols[key] = Symbol(String(key)));\r\n }));\r\n defineProperties(Symbol, {\r\n keyFor: getValueDescriptor(function (sym) {\r\n let key;\r\n validateSymbol(sym);\r\n for (key in globalSymbols) {\r\n if (globalSymbols[key] === sym) {\r\n return key;\r\n }\r\n }\r\n }),\r\n hasInstance: getValueDescriptor(Symbol.for('hasInstance'), false, false),\r\n isConcatSpreadable: getValueDescriptor(Symbol.for('isConcatSpreadable'), false, false),\r\n iterator: getValueDescriptor(Symbol.for('iterator'), false, false),\r\n match: getValueDescriptor(Symbol.for('match'), false, false),\r\n observable: getValueDescriptor(Symbol.for('observable'), false, false),\r\n replace: getValueDescriptor(Symbol.for('replace'), false, false),\r\n search: getValueDescriptor(Symbol.for('search'), false, false),\r\n species: getValueDescriptor(Symbol.for('species'), false, false),\r\n split: getValueDescriptor(Symbol.for('split'), false, false),\r\n toPrimitive: getValueDescriptor(Symbol.for('toPrimitive'), false, false),\r\n toStringTag: getValueDescriptor(Symbol.for('toStringTag'), false, false),\r\n unscopables: getValueDescriptor(Symbol.for('unscopables'), false, false)\r\n });\r\n /* Decorate the InternalSymbol object */\r\n defineProperties(InternalSymbol.prototype, {\r\n constructor: getValueDescriptor(Symbol),\r\n toString: getValueDescriptor(function () {\r\n return this.__name__;\r\n }, false, false)\r\n });\r\n /* Decorate the Symbol.prototype */\r\n defineProperties(Symbol.prototype, {\r\n toString: getValueDescriptor(function () {\r\n return 'Symbol (' + validateSymbol(this).__description__ + ')';\r\n }),\r\n valueOf: getValueDescriptor(function () {\r\n return validateSymbol(this);\r\n })\r\n });\r\n defineProperty(Symbol.prototype, Symbol.toPrimitive, getValueDescriptor(function () {\r\n return validateSymbol(this);\r\n }));\r\n defineProperty(Symbol.prototype, Symbol.toStringTag, getValueDescriptor('Symbol', false, false, true));\r\n defineProperty(InternalSymbol.prototype, Symbol.toPrimitive, getValueDescriptor(Symbol.prototype[Symbol.toPrimitive], false, false, true));\r\n defineProperty(InternalSymbol.prototype, Symbol.toStringTag, getValueDescriptor(Symbol.prototype[Symbol.toStringTag], false, false, true));\r\n}\r\n/**\r\n * A custom guard function that determines if an object is a symbol or not\r\n * @param {any} value The value to check to see if it is a symbol or not\r\n * @return {is symbol} Returns true if a symbol or not (and narrows the type guard)\r\n */\r\nexport function isSymbol(value) {\r\n return (value && (typeof value === 'symbol' || value['@@toStringTag'] === 'Symbol')) || false;\r\n}\r\n/**\r\n * Fill any missing well known symbols if the native Symbol is missing them\r\n */\r\n[\r\n 'hasInstance',\r\n 'isConcatSpreadable',\r\n 'iterator',\r\n 'species',\r\n 'replace',\r\n 'search',\r\n 'split',\r\n 'match',\r\n 'toPrimitive',\r\n 'toStringTag',\r\n 'unscopables',\r\n 'observable'\r\n].forEach((wellKnown) => {\r\n if (!Symbol[wellKnown]) {\r\n Object.defineProperty(Symbol, wellKnown, getValueDescriptor(Symbol.for(wellKnown), false, false));\r\n }\r\n});\r\nexport default Symbol;\r\n//# sourceMappingURL=Symbol.mjs.map" }, { - "id": "./node_modules/@dojo/shim/WeakMap.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\WeakMap.mjs", - "name": "./node_modules/@dojo/shim/WeakMap.mjs", + "id": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\WeakMap.mjs", + "name": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "index": 19, "index2": 13, "size": 3858, @@ -582,39 +582,39 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/WeakMap", - "loc": "2:0-41" + "userRequest": "../shim/WeakMap", + "loc": "2:0-38" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\inject.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/WeakMap", - "loc": "5:0-41" + "userRequest": "../../shim/WeakMap", + "loc": "1:0-41" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\inject.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/WeakMap", - "loc": "1:0-41" + "userRequest": "../shim/WeakMap", + "loc": "5:0-38" } ], "usedExports": [ @@ -629,9 +629,9 @@ "source": "import global from './global';\r\nimport { isArrayLike } from './iterator';\r\nimport has from './support/has';\r\nimport './Symbol';\r\nexport let WeakMap = global.WeakMap;\r\nif (!true) {\r\n const DELETED = {};\r\n const getUID = function getUID() {\r\n return Math.floor(Math.random() * 100000000);\r\n };\r\n const generateName = (function () {\r\n let startId = Math.floor(Date.now() % 100000000);\r\n return function generateName() {\r\n return '__wm' + getUID() + (startId++ + '__');\r\n };\r\n })();\r\n WeakMap = class WeakMap {\r\n constructor(iterable) {\r\n this[Symbol.toStringTag] = 'WeakMap';\r\n this._name = generateName();\r\n this._frozenEntries = [];\r\n if (iterable) {\r\n if (isArrayLike(iterable)) {\r\n for (let i = 0; i < iterable.length; i++) {\r\n const item = iterable[i];\r\n this.set(item[0], item[1]);\r\n }\r\n }\r\n else {\r\n for (const [key, value] of iterable) {\r\n this.set(key, value);\r\n }\r\n }\r\n }\r\n }\r\n _getFrozenEntryIndex(key) {\r\n for (let i = 0; i < this._frozenEntries.length; i++) {\r\n if (this._frozenEntries[i].key === key) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n delete(key) {\r\n if (key === undefined || key === null) {\r\n return false;\r\n }\r\n const entry = key[this._name];\r\n if (entry && entry.key === key && entry.value !== DELETED) {\r\n entry.value = DELETED;\r\n return true;\r\n }\r\n const frozenIndex = this._getFrozenEntryIndex(key);\r\n if (frozenIndex >= 0) {\r\n this._frozenEntries.splice(frozenIndex, 1);\r\n return true;\r\n }\r\n return false;\r\n }\r\n get(key) {\r\n if (key === undefined || key === null) {\r\n return undefined;\r\n }\r\n const entry = key[this._name];\r\n if (entry && entry.key === key && entry.value !== DELETED) {\r\n return entry.value;\r\n }\r\n const frozenIndex = this._getFrozenEntryIndex(key);\r\n if (frozenIndex >= 0) {\r\n return this._frozenEntries[frozenIndex].value;\r\n }\r\n }\r\n has(key) {\r\n if (key === undefined || key === null) {\r\n return false;\r\n }\r\n const entry = key[this._name];\r\n if (Boolean(entry && entry.key === key && entry.value !== DELETED)) {\r\n return true;\r\n }\r\n const frozenIndex = this._getFrozenEntryIndex(key);\r\n if (frozenIndex >= 0) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n set(key, value) {\r\n if (!key || (typeof key !== 'object' && typeof key !== 'function')) {\r\n throw new TypeError('Invalid value used as weak map key');\r\n }\r\n let entry = key[this._name];\r\n if (!entry || entry.key !== key) {\r\n entry = Object.create(null, {\r\n key: { value: key }\r\n });\r\n if (Object.isFrozen(key)) {\r\n this._frozenEntries.push(entry);\r\n }\r\n else {\r\n Object.defineProperty(key, this._name, {\r\n value: entry\r\n });\r\n }\r\n }\r\n entry.value = value;\r\n return this;\r\n }\r\n };\r\n}\r\nexport default WeakMap;\r\n//# sourceMappingURL=WeakMap.mjs.map" }, { - "id": "./node_modules/@dojo/shim/array.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "name": "./node_modules/@dojo/shim/array.mjs", + "id": "./node_modules/@dojo/framework/shim/array.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "name": "./node_modules/@dojo/framework/shim/array.mjs", "index": 30, "index2": 24, "size": 9175, @@ -643,30 +643,30 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/array", - "loc": "4:0-40" + "userRequest": "../shim/array", + "loc": "4:0-37" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/array", - "loc": "2:0-53" + "userRequest": "../shim/array", + "loc": "2:0-50" } ], "usedExports": [ @@ -686,9 +686,9 @@ "source": "import global from './global';\r\nimport { isArrayLike, isIterable } from './iterator';\r\nimport { MAX_SAFE_INTEGER } from './number';\r\nimport has from './support/has';\r\nimport { wrapNative } from './support/util';\r\nexport let from;\r\n/**\r\n * Creates a new array from the function parameters.\r\n *\r\n * @param arguments Any number of arguments for the array\r\n * @return An array from the given arguments\r\n */\r\nexport let of;\r\n/* ES6 Array instance methods */\r\n/**\r\n * Copies data internally within an array or array-like object.\r\n *\r\n * @param target The target array-like object\r\n * @param offset The index to start copying values to; if negative, it counts backwards from length\r\n * @param start The first (inclusive) index to copy; if negative, it counts backwards from length\r\n * @param end The last (exclusive) index to copy; if negative, it counts backwards from length\r\n * @return The target\r\n */\r\nexport let copyWithin;\r\n/**\r\n * Fills elements of an array-like object with the specified value.\r\n *\r\n * @param target The target to fill\r\n * @param value The value to fill each element of the target with\r\n * @param start The first index to fill\r\n * @param end The (exclusive) index at which to stop filling\r\n * @return The filled target\r\n */\r\nexport let fill;\r\n/**\r\n * Finds and returns the first instance matching the callback or undefined if one is not found.\r\n *\r\n * @param target An array-like object\r\n * @param callback A function returning if the current value matches a criteria\r\n * @param thisArg The execution context for the find function\r\n * @return The first element matching the callback, or undefined if one does not exist\r\n */\r\nexport let find;\r\n/**\r\n * Performs a linear search and returns the first index whose value satisfies the passed callback,\r\n * or -1 if no values satisfy it.\r\n *\r\n * @param target An array-like object\r\n * @param callback A function returning true if the current value satisfies its criteria\r\n * @param thisArg The execution context for the find function\r\n * @return The first index whose value satisfies the passed callback, or -1 if no values satisfy it\r\n */\r\nexport let findIndex;\r\n/* ES7 Array instance methods */\r\n/**\r\n * Determines whether an array includes a given value\r\n *\r\n * @param target the target array-like object\r\n * @param searchElement the item to search for\r\n * @param fromIndex the starting index to search from\r\n * @return `true` if the array includes the element, otherwise `false`\r\n */\r\nexport let includes;\r\nif (true && true) {\r\n from = global.Array.from;\r\n of = global.Array.of;\r\n copyWithin = wrapNative(global.Array.prototype.copyWithin);\r\n fill = wrapNative(global.Array.prototype.fill);\r\n find = wrapNative(global.Array.prototype.find);\r\n findIndex = wrapNative(global.Array.prototype.findIndex);\r\n}\r\nelse {\r\n // It is only older versions of Safari/iOS that have a bad fill implementation and so aren't in the wild\r\n // To make things easier, if there is a bad fill implementation, the whole set of functions will be filled\r\n /**\r\n * Ensures a non-negative, non-infinite, safe integer.\r\n *\r\n * @param length The number to validate\r\n * @return A proper length\r\n */\r\n const toLength = function toLength(length) {\r\n if (isNaN(length)) {\r\n return 0;\r\n }\r\n length = Number(length);\r\n if (isFinite(length)) {\r\n length = Math.floor(length);\r\n }\r\n // Ensure a non-negative, real, safe integer\r\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\r\n };\r\n /**\r\n * From ES6 7.1.4 ToInteger()\r\n *\r\n * @param value A value to convert\r\n * @return An integer\r\n */\r\n const toInteger = function toInteger(value) {\r\n value = Number(value);\r\n if (isNaN(value)) {\r\n return 0;\r\n }\r\n if (value === 0 || !isFinite(value)) {\r\n return value;\r\n }\r\n return (value > 0 ? 1 : -1) * Math.floor(Math.abs(value));\r\n };\r\n /**\r\n * Normalizes an offset against a given length, wrapping it if negative.\r\n *\r\n * @param value The original offset\r\n * @param length The total length to normalize against\r\n * @return If negative, provide a distance from the end (length); otherwise provide a distance from 0\r\n */\r\n const normalizeOffset = function normalizeOffset(value, length) {\r\n return value < 0 ? Math.max(length + value, 0) : Math.min(value, length);\r\n };\r\n from = function from(arrayLike, mapFunction, thisArg) {\r\n if (arrayLike == null) {\r\n throw new TypeError('from: requires an array-like object');\r\n }\r\n if (mapFunction && thisArg) {\r\n mapFunction = mapFunction.bind(thisArg);\r\n }\r\n /* tslint:disable-next-line:variable-name */\r\n const Constructor = this;\r\n const length = toLength(arrayLike.length);\r\n // Support extension\r\n const array = typeof Constructor === 'function' ? Object(new Constructor(length)) : new Array(length);\r\n if (!isArrayLike(arrayLike) && !isIterable(arrayLike)) {\r\n return array;\r\n }\r\n // if this is an array and the normalized length is 0, just return an empty array. this prevents a problem\r\n // with the iteration on IE when using a NaN array length.\r\n if (isArrayLike(arrayLike)) {\r\n if (length === 0) {\r\n return [];\r\n }\r\n for (let i = 0; i < arrayLike.length; i++) {\r\n array[i] = mapFunction ? mapFunction(arrayLike[i], i) : arrayLike[i];\r\n }\r\n }\r\n else {\r\n let i = 0;\r\n for (const value of arrayLike) {\r\n array[i] = mapFunction ? mapFunction(value, i) : value;\r\n i++;\r\n }\r\n }\r\n if (arrayLike.length !== undefined) {\r\n array.length = length;\r\n }\r\n return array;\r\n };\r\n of = function of(...items) {\r\n return Array.prototype.slice.call(items);\r\n };\r\n copyWithin = function copyWithin(target, offset, start, end) {\r\n if (target == null) {\r\n throw new TypeError('copyWithin: target must be an array-like object');\r\n }\r\n const length = toLength(target.length);\r\n offset = normalizeOffset(toInteger(offset), length);\r\n start = normalizeOffset(toInteger(start), length);\r\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\r\n let count = Math.min(end - start, length - offset);\r\n let direction = 1;\r\n if (offset > start && offset < start + count) {\r\n direction = -1;\r\n start += count - 1;\r\n offset += count - 1;\r\n }\r\n while (count > 0) {\r\n if (start in target) {\r\n target[offset] = target[start];\r\n }\r\n else {\r\n delete target[offset];\r\n }\r\n offset += direction;\r\n start += direction;\r\n count--;\r\n }\r\n return target;\r\n };\r\n fill = function fill(target, value, start, end) {\r\n const length = toLength(target.length);\r\n let i = normalizeOffset(toInteger(start), length);\r\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\r\n while (i < end) {\r\n target[i++] = value;\r\n }\r\n return target;\r\n };\r\n find = function find(target, callback, thisArg) {\r\n const index = findIndex(target, callback, thisArg);\r\n return index !== -1 ? target[index] : undefined;\r\n };\r\n findIndex = function findIndex(target, callback, thisArg) {\r\n const length = toLength(target.length);\r\n if (!callback) {\r\n throw new TypeError('find: second argument must be a function');\r\n }\r\n if (thisArg) {\r\n callback = callback.bind(thisArg);\r\n }\r\n for (let i = 0; i < length; i++) {\r\n if (callback(target[i], i, target)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n };\r\n}\r\nif (true) {\r\n includes = wrapNative(global.Array.prototype.includes);\r\n}\r\nelse {\r\n /**\r\n * Ensures a non-negative, non-infinite, safe integer.\r\n *\r\n * @param length The number to validate\r\n * @return A proper length\r\n */\r\n const toLength = function toLength(length) {\r\n length = Number(length);\r\n if (isNaN(length)) {\r\n return 0;\r\n }\r\n if (isFinite(length)) {\r\n length = Math.floor(length);\r\n }\r\n // Ensure a non-negative, real, safe integer\r\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\r\n };\r\n includes = function includes(target, searchElement, fromIndex = 0) {\r\n let len = toLength(target.length);\r\n for (let i = fromIndex; i < len; ++i) {\r\n const currentElement = target[i];\r\n if (searchElement === currentElement ||\r\n (searchElement !== searchElement && currentElement !== currentElement)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n}\r\n//# sourceMappingURL=array.mjs.map" }, { - "id": "./node_modules/@dojo/shim/global.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\global.mjs", - "name": "./node_modules/@dojo/shim/global.mjs", + "id": "./node_modules/@dojo/framework/shim/global.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\global.mjs", + "name": "./node_modules/@dojo/framework/shim/global.mjs", "index": 10, "index2": 4, "size": 581, @@ -700,117 +700,117 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/global", - "loc": "6:0-39" - }, - { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", - "type": "harmony import", - "userRequest": "@dojo/shim/global", - "loc": "1:0-39" + "userRequest": "../shim/global", + "loc": "6:0-36" }, { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./global", "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Symbol.mjs", - "module": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleName": "./node_modules/@dojo/shim/Symbol.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Symbol.mjs", + "module": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Symbol.mjs", "type": "harmony import", "userRequest": "./global", "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/number.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\number.mjs", - "module": "./node_modules/@dojo/shim/number.mjs", - "moduleName": "./node_modules/@dojo/shim/number.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/number.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\number.mjs", + "module": "./node_modules/@dojo/framework/shim/number.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/number.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/support/has.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\has.mjs", - "module": "./node_modules/@dojo/shim/support/has.mjs", - "moduleName": "./node_modules/@dojo/shim/support/has.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "type": "harmony import", + "userRequest": "../shim/global", + "loc": "1:0-36" + }, + { + "moduleId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\has.mjs", + "module": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/has.mjs", "type": "harmony import", "userRequest": "../global", "loc": "2:0-31" }, { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/object.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\object.mjs", - "module": "./node_modules/@dojo/shim/object.mjs", - "moduleName": "./node_modules/@dojo/shim/object.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\object.mjs", + "module": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/object.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/string.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\string.mjs", - "module": "./node_modules/@dojo/shim/string.mjs", - "moduleName": "./node_modules/@dojo/shim/string.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\string.mjs", + "module": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/string.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\queue.mjs", - "module": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleName": "./node_modules/@dojo/shim/support/queue.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\queue.mjs", + "module": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/queue.mjs", "type": "harmony import", "userRequest": "../global", "loc": "1:0-31" @@ -827,9 +827,9 @@ "source": "const globalObject = (function () {\n if (typeof global !== 'undefined') {\n // global spec defines a reference to the global object called 'global'\n // https://github.com/tc39/proposal-global\n // `global` is also defined in NodeJS\n return global;\n }\n else if (typeof window !== 'undefined') {\n // window is defined in browsers\n return window;\n }\n else if (typeof self !== 'undefined') {\n // self is defined in WebWorkers\n return self;\n }\n})();\nexport default globalObject;\n//# sourceMappingURL=global.mjs.map" }, { - "id": "./node_modules/@dojo/shim/iterator.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\iterator.mjs", - "name": "./node_modules/@dojo/shim/iterator.mjs", + "id": "./node_modules/@dojo/framework/shim/iterator.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\iterator.mjs", + "name": "./node_modules/@dojo/framework/shim/iterator.mjs", "index": 16, "index2": 10, "size": 3158, @@ -841,36 +841,36 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./iterator", "loc": "2:0-53" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./iterator", "loc": "1:0-55" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./iterator", "loc": "2:0-41" @@ -889,9 +889,9 @@ "source": "import './Symbol';\nimport { HIGH_SURROGATE_MAX, HIGH_SURROGATE_MIN } from './string';\nconst staticDone = { done: true, value: undefined };\n/**\n * A class that _shims_ an iterator interface on array like objects.\n */\nexport class ShimIterator {\n constructor(list) {\n this._nextIndex = -1;\n if (isIterable(list)) {\n this._nativeIterator = list[Symbol.iterator]();\n }\n else {\n this._list = list;\n }\n }\n /**\n * Return the next iteration result for the Iterator\n */\n next() {\n if (this._nativeIterator) {\n return this._nativeIterator.next();\n }\n if (!this._list) {\n return staticDone;\n }\n if (++this._nextIndex < this._list.length) {\n return {\n done: false,\n value: this._list[this._nextIndex]\n };\n }\n return staticDone;\n }\n [Symbol.iterator]() {\n return this;\n }\n}\n/**\n * A type guard for checking if something has an Iterable interface\n *\n * @param value The value to type guard against\n */\nexport function isIterable(value) {\n return value && typeof value[Symbol.iterator] === 'function';\n}\n/**\n * A type guard for checking if something is ArrayLike\n *\n * @param value The value to type guard against\n */\nexport function isArrayLike(value) {\n return value && typeof value.length === 'number';\n}\n/**\n * Returns the iterator for an object\n *\n * @param iterable The iterable object to return the iterator for\n */\nexport function get(iterable) {\n if (isIterable(iterable)) {\n return iterable[Symbol.iterator]();\n }\n else if (isArrayLike(iterable)) {\n return new ShimIterator(iterable);\n }\n}\n/**\n * Shims the functionality of `for ... of` blocks\n *\n * @param iterable The object the provides an interator interface\n * @param callback The callback which will be called for each item of the iterable\n * @param thisArg Optional scope to pass the callback\n */\nexport function forOf(iterable, callback, thisArg) {\n let broken = false;\n function doBreak() {\n broken = true;\n }\n /* We need to handle iteration of double byte strings properly */\n if (isArrayLike(iterable) && typeof iterable === 'string') {\n const l = iterable.length;\n for (let i = 0; i < l; ++i) {\n let char = iterable[i];\n if (i + 1 < l) {\n const code = char.charCodeAt(0);\n if (code >= HIGH_SURROGATE_MIN && code <= HIGH_SURROGATE_MAX) {\n char += iterable[++i];\n }\n }\n callback.call(thisArg, char, iterable, doBreak);\n if (broken) {\n return;\n }\n }\n }\n else {\n const iterator = get(iterable);\n if (iterator) {\n let result = iterator.next();\n while (!result.done) {\n callback.call(thisArg, result.value, iterable, doBreak);\n if (broken) {\n return;\n }\n result = iterator.next();\n }\n }\n }\n}\n//# sourceMappingURL=iterator.mjs.map" }, { - "id": "./node_modules/@dojo/shim/number.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\number.mjs", - "name": "./node_modules/@dojo/shim/number.mjs", + "id": "./node_modules/@dojo/framework/shim/number.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\number.mjs", + "name": "./node_modules/@dojo/framework/shim/number.mjs", "index": 31, "index2": 23, "size": 1724, @@ -903,18 +903,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./number", "loc": "3:0-44" @@ -935,9 +935,9 @@ "source": "import global from './global';\n/**\n * The smallest interval between two representable numbers.\n */\nexport const EPSILON = 1;\n/**\n * The maximum safe integer in JavaScript\n */\nexport const MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n/**\n * The minimum safe integer in JavaScript\n */\nexport const MIN_SAFE_INTEGER = -MAX_SAFE_INTEGER;\n/**\n * Determines whether the passed value is NaN without coersion.\n *\n * @param value The value to test\n * @return true if the value is NaN, false if it is not\n */\nexport function isNaN(value) {\n return typeof value === 'number' && global.isNaN(value);\n}\n/**\n * Determines whether the passed value is a finite number without coersion.\n *\n * @param value The value to test\n * @return true if the value is finite, false if it is not\n */\nexport function isFinite(value) {\n return typeof value === 'number' && global.isFinite(value);\n}\n/**\n * Determines whether the passed value is an integer.\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isInteger(value) {\n return isFinite(value) && Math.floor(value) === value;\n}\n/**\n * Determines whether the passed value is an integer that is 'safe,' meaning:\n * 1. it can be expressed as an IEEE-754 double precision number\n * 2. it has a one-to-one mapping to a mathematical integer, meaning its\n * IEEE-754 representation cannot be the result of rounding any other\n * integer to fit the IEEE-754 representation\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isSafeInteger(value) {\n return isInteger(value) && Math.abs(value) <= MAX_SAFE_INTEGER;\n}\n//# sourceMappingURL=number.mjs.map" }, { - "id": "./node_modules/@dojo/shim/object.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\object.mjs", - "name": "./node_modules/@dojo/shim/object.mjs", + "id": "./node_modules/@dojo/framework/shim/object.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\object.mjs", + "name": "./node_modules/@dojo/framework/shim/object.mjs", "index": 18, "index2": 11, "size": 4171, @@ -949,39 +949,39 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "issuerId": "./node_modules/@dojo/shim/Map.mjs", - "issuerName": "./node_modules/@dojo/shim/Map.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/Map.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/Map.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./object", "loc": "3:0-42" }, { - "moduleId": "./node_modules/@dojo/core/lang.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\lang.mjs", - "module": "./node_modules/@dojo/core/lang.mjs", - "moduleName": "./node_modules/@dojo/core/lang.mjs", + "moduleId": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\lang.mjs", + "module": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleName": "./node_modules/@dojo/framework/core/lang.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/object", - "loc": "1:0-43" + "userRequest": "../shim/object", + "loc": "1:0-40" }, { - "moduleId": "./node_modules/@dojo/core/lang.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\lang.mjs", - "module": "./node_modules/@dojo/core/lang.mjs", - "moduleName": "./node_modules/@dojo/core/lang.mjs", + "moduleId": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\lang.mjs", + "module": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleName": "./node_modules/@dojo/framework/core/lang.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/object", - "loc": "2:0-43" + "userRequest": "../shim/object", + "loc": "2:0-40" } ], "usedExports": [ @@ -1003,9 +1003,9 @@ "source": "import global from './global';\r\nimport has from './support/has';\r\nimport { isSymbol } from './Symbol';\r\nexport let assign;\r\n/**\r\n * Gets the own property descriptor of the specified object.\r\n * An own property descriptor is one that is defined directly on the object and is not\r\n * inherited from the object's prototype.\r\n * @param o Object that contains the property.\r\n * @param p Name of the property.\r\n */\r\nexport let getOwnPropertyDescriptor;\r\n/**\r\n * Returns the names of the own properties of an object. The own properties of an object are those that are defined directly\r\n * on that object, and are not inherited from the object's prototype. The properties of an object include both fields (objects) and functions.\r\n * @param o Object that contains the own properties.\r\n */\r\nexport let getOwnPropertyNames;\r\n/**\r\n * Returns an array of all symbol properties found directly on object o.\r\n * @param o Object to retrieve the symbols from.\r\n */\r\nexport let getOwnPropertySymbols;\r\n/**\r\n * Returns true if the values are the same value, false otherwise.\r\n * @param value1 The first value.\r\n * @param value2 The second value.\r\n */\r\nexport let is;\r\n/**\r\n * Returns the names of the enumerable properties and methods of an object.\r\n * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.\r\n */\r\nexport let keys;\r\n/* ES7 Object static methods */\r\nexport let getOwnPropertyDescriptors;\r\nexport let entries;\r\nexport let values;\r\nif (true) {\r\n const globalObject = global.Object;\r\n assign = globalObject.assign;\r\n getOwnPropertyDescriptor = globalObject.getOwnPropertyDescriptor;\r\n getOwnPropertyNames = globalObject.getOwnPropertyNames;\r\n getOwnPropertySymbols = globalObject.getOwnPropertySymbols;\r\n is = globalObject.is;\r\n keys = globalObject.keys;\r\n}\r\nelse {\r\n keys = function symbolAwareKeys(o) {\r\n return Object.keys(o).filter((key) => !Boolean(key.match(/^@@.+/)));\r\n };\r\n assign = function assign(target, ...sources) {\r\n if (target == null) {\r\n // TypeError if undefined or null\r\n throw new TypeError('Cannot convert undefined or null to object');\r\n }\r\n const to = Object(target);\r\n sources.forEach((nextSource) => {\r\n if (nextSource) {\r\n // Skip over if undefined or null\r\n keys(nextSource).forEach((nextKey) => {\r\n to[nextKey] = nextSource[nextKey];\r\n });\r\n }\r\n });\r\n return to;\r\n };\r\n getOwnPropertyDescriptor = function getOwnPropertyDescriptor(o, prop) {\r\n if (isSymbol(prop)) {\r\n return Object.getOwnPropertyDescriptor(o, prop);\r\n }\r\n else {\r\n return Object.getOwnPropertyDescriptor(o, prop);\r\n }\r\n };\r\n getOwnPropertyNames = function getOwnPropertyNames(o) {\r\n return Object.getOwnPropertyNames(o).filter((key) => !Boolean(key.match(/^@@.+/)));\r\n };\r\n getOwnPropertySymbols = function getOwnPropertySymbols(o) {\r\n return Object.getOwnPropertyNames(o)\r\n .filter((key) => Boolean(key.match(/^@@.+/)))\r\n .map((key) => Symbol.for(key.substring(2)));\r\n };\r\n is = function is(value1, value2) {\r\n if (value1 === value2) {\r\n return value1 !== 0 || 1 / value1 === 1 / value2; // -0\r\n }\r\n return value1 !== value1 && value2 !== value2; // NaN\r\n };\r\n}\r\nif (true) {\r\n const globalObject = global.Object;\r\n getOwnPropertyDescriptors = globalObject.getOwnPropertyDescriptors;\r\n entries = globalObject.entries;\r\n values = globalObject.values;\r\n}\r\nelse {\r\n getOwnPropertyDescriptors = function getOwnPropertyDescriptors(o) {\r\n return getOwnPropertyNames(o).reduce((previous, key) => {\r\n previous[key] = getOwnPropertyDescriptor(o, key);\r\n return previous;\r\n }, {});\r\n };\r\n entries = function entries(o) {\r\n return keys(o).map((key) => [key, o[key]]);\r\n };\r\n values = function values(o) {\r\n return keys(o).map((key) => o[key]);\r\n };\r\n}\r\n//# sourceMappingURL=object.mjs.map" }, { - "id": "./node_modules/@dojo/shim/string.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\string.mjs", - "name": "./node_modules/@dojo/shim/string.mjs", + "id": "./node_modules/@dojo/framework/shim/string.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\string.mjs", + "name": "./node_modules/@dojo/framework/shim/string.mjs", "index": 17, "index2": 9, "size": 12714, @@ -1017,18 +1017,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\iterator.mjs", - "issuerId": "./node_modules/@dojo/shim/iterator.mjs", - "issuerName": "./node_modules/@dojo/shim/iterator.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\iterator.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/iterator.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/iterator.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/iterator.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\iterator.mjs", - "module": "./node_modules/@dojo/shim/iterator.mjs", - "moduleName": "./node_modules/@dojo/shim/iterator.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\iterator.mjs", + "module": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/iterator.mjs", "type": "harmony import", "userRequest": "./string", "loc": "2:0-66" @@ -1059,9 +1059,9 @@ "source": "import global from './global';\r\nimport has from './support/has';\r\nimport { wrapNative } from './support/util';\r\n/**\r\n * The minimum location of high surrogates\r\n */\r\nexport const HIGH_SURROGATE_MIN = 0xd800;\r\n/**\r\n * The maximum location of high surrogates\r\n */\r\nexport const HIGH_SURROGATE_MAX = 0xdbff;\r\n/**\r\n * The minimum location of low surrogates\r\n */\r\nexport const LOW_SURROGATE_MIN = 0xdc00;\r\n/**\r\n * The maximum location of low surrogates\r\n */\r\nexport const LOW_SURROGATE_MAX = 0xdfff;\r\n/* ES6 static methods */\r\n/**\r\n * Return the String value whose elements are, in order, the elements in the List elements.\r\n * If length is 0, the empty string is returned.\r\n * @param codePoints The code points to generate the string\r\n */\r\nexport let fromCodePoint;\r\n/**\r\n * `raw` is intended for use as a tag function of a Tagged Template String. When called\r\n * as such the first argument will be a well formed template call site object and the rest\r\n * parameter will contain the substitution values.\r\n * @param template A well-formed template string call site representation.\r\n * @param substitutions A set of substitution values.\r\n */\r\nexport let raw;\r\n/* ES6 instance methods */\r\n/**\r\n * Returns a nonnegative integer Number less than 1114112 (0x110000) that is the code point\r\n * value of the UTF-16 encoded code point starting at the string element at position pos in\r\n * the String resulting from converting this object to a String.\r\n * If there is no element at that position, the result is undefined.\r\n * If a valid UTF-16 surrogate pair does not begin at pos, the result is the code unit at pos.\r\n */\r\nexport let codePointAt;\r\n/**\r\n * Returns true if the sequence of elements of searchString converted to a String is the\r\n * same as the corresponding elements of this object (converted to a String) starting at\r\n * endPosition – length(this). Otherwise returns false.\r\n */\r\nexport let endsWith;\r\n/**\r\n * Returns true if searchString appears as a substring of the result of converting this\r\n * object to a String, at one or more positions that are\r\n * greater than or equal to position; otherwise, returns false.\r\n * @param target The target string\r\n * @param searchString search string\r\n * @param position If position is undefined, 0 is assumed, so as to search all of the String.\r\n */\r\nexport let includes;\r\n/**\r\n * Returns the String value result of normalizing the string into the normalization form\r\n * named by form as specified in Unicode Standard Annex #15, Unicode Normalization Forms.\r\n * @param target The target string\r\n * @param form Applicable values: \"NFC\", \"NFD\", \"NFKC\", or \"NFKD\", If not specified default\r\n * is \"NFC\"\r\n */\r\nexport let normalize;\r\n/**\r\n * Returns a String value that is made from count copies appended together. If count is 0,\r\n * T is the empty String is returned.\r\n * @param count number of copies to append\r\n */\r\nexport let repeat;\r\n/**\r\n * Returns true if the sequence of elements of searchString converted to a String is the\r\n * same as the corresponding elements of this object (converted to a String) starting at\r\n * position. Otherwise returns false.\r\n */\r\nexport let startsWith;\r\n/* ES7 instance methods */\r\n/**\r\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\r\n * The padding is applied from the end (right) of the current string.\r\n *\r\n * @param target The target string\r\n * @param maxLength The length of the resulting string once the current string has been padded.\r\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\r\n *\r\n * @param fillString The string to pad the current string with.\r\n * If this string is too long, it will be truncated and the left-most part will be applied.\r\n * The default value for this parameter is \" \" (U+0020).\r\n */\r\nexport let padEnd;\r\n/**\r\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\r\n * The padding is applied from the start (left) of the current string.\r\n *\r\n * @param target The target string\r\n * @param maxLength The length of the resulting string once the current string has been padded.\r\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\r\n *\r\n * @param fillString The string to pad the current string with.\r\n * If this string is too long, it will be truncated and the left-most part will be applied.\r\n * The default value for this parameter is \" \" (U+0020).\r\n */\r\nexport let padStart;\r\nif (true && true) {\r\n fromCodePoint = global.String.fromCodePoint;\r\n raw = global.String.raw;\r\n codePointAt = wrapNative(global.String.prototype.codePointAt);\r\n endsWith = wrapNative(global.String.prototype.endsWith);\r\n includes = wrapNative(global.String.prototype.includes);\r\n normalize = wrapNative(global.String.prototype.normalize);\r\n repeat = wrapNative(global.String.prototype.repeat);\r\n startsWith = wrapNative(global.String.prototype.startsWith);\r\n}\r\nelse {\r\n /**\r\n * Validates that text is defined, and normalizes position (based on the given default if the input is NaN).\r\n * Used by startsWith, includes, and endsWith.\r\n *\r\n * @return Normalized position.\r\n */\r\n const normalizeSubstringArgs = function (name, text, search, position, isEnd = false) {\r\n if (text == null) {\r\n throw new TypeError('string.' + name + ' requires a valid string to search against.');\r\n }\r\n const length = text.length;\r\n position = position !== position ? (isEnd ? length : 0) : position;\r\n return [text, String(search), Math.min(Math.max(position, 0), length)];\r\n };\r\n fromCodePoint = function fromCodePoint(...codePoints) {\r\n // Adapted from https://github.com/mathiasbynens/String.fromCodePoint\r\n const length = arguments.length;\r\n if (!length) {\r\n return '';\r\n }\r\n const fromCharCode = String.fromCharCode;\r\n const MAX_SIZE = 0x4000;\r\n let codeUnits = [];\r\n let index = -1;\r\n let result = '';\r\n while (++index < length) {\r\n let codePoint = Number(arguments[index]);\r\n // Code points must be finite integers within the valid range\r\n let isValid = isFinite(codePoint) && Math.floor(codePoint) === codePoint && codePoint >= 0 && codePoint <= 0x10ffff;\r\n if (!isValid) {\r\n throw RangeError('string.fromCodePoint: Invalid code point ' + codePoint);\r\n }\r\n if (codePoint <= 0xffff) {\r\n // BMP code point\r\n codeUnits.push(codePoint);\r\n }\r\n else {\r\n // Astral code point; split in surrogate halves\r\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\r\n codePoint -= 0x10000;\r\n let highSurrogate = (codePoint >> 10) + HIGH_SURROGATE_MIN;\r\n let lowSurrogate = codePoint % 0x400 + LOW_SURROGATE_MIN;\r\n codeUnits.push(highSurrogate, lowSurrogate);\r\n }\r\n if (index + 1 === length || codeUnits.length > MAX_SIZE) {\r\n result += fromCharCode.apply(null, codeUnits);\r\n codeUnits.length = 0;\r\n }\r\n }\r\n return result;\r\n };\r\n raw = function raw(callSite, ...substitutions) {\r\n let rawStrings = callSite.raw;\r\n let result = '';\r\n let numSubstitutions = substitutions.length;\r\n if (callSite == null || callSite.raw == null) {\r\n throw new TypeError('string.raw requires a valid callSite object with a raw value');\r\n }\r\n for (let i = 0, length = rawStrings.length; i < length; i++) {\r\n result += rawStrings[i] + (i < numSubstitutions && i < length - 1 ? substitutions[i] : '');\r\n }\r\n return result;\r\n };\r\n codePointAt = function codePointAt(text, position = 0) {\r\n // Adapted from https://github.com/mathiasbynens/String.prototype.codePointAt\r\n if (text == null) {\r\n throw new TypeError('string.codePointAt requries a valid string.');\r\n }\r\n const length = text.length;\r\n if (position !== position) {\r\n position = 0;\r\n }\r\n if (position < 0 || position >= length) {\r\n return undefined;\r\n }\r\n // Get the first code unit\r\n const first = text.charCodeAt(position);\r\n if (first >= HIGH_SURROGATE_MIN && first <= HIGH_SURROGATE_MAX && length > position + 1) {\r\n // Start of a surrogate pair (high surrogate and there is a next code unit); check for low surrogate\r\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\r\n const second = text.charCodeAt(position + 1);\r\n if (second >= LOW_SURROGATE_MIN && second <= LOW_SURROGATE_MAX) {\r\n return (first - HIGH_SURROGATE_MIN) * 0x400 + second - LOW_SURROGATE_MIN + 0x10000;\r\n }\r\n }\r\n return first;\r\n };\r\n endsWith = function endsWith(text, search, endPosition) {\r\n if (endPosition == null) {\r\n endPosition = text.length;\r\n }\r\n [text, search, endPosition] = normalizeSubstringArgs('endsWith', text, search, endPosition, true);\r\n const start = endPosition - search.length;\r\n if (start < 0) {\r\n return false;\r\n }\r\n return text.slice(start, endPosition) === search;\r\n };\r\n includes = function includes(text, search, position = 0) {\r\n [text, search, position] = normalizeSubstringArgs('includes', text, search, position);\r\n return text.indexOf(search, position) !== -1;\r\n };\r\n repeat = function repeat(text, count = 0) {\r\n // Adapted from https://github.com/mathiasbynens/String.prototype.repeat\r\n if (text == null) {\r\n throw new TypeError('string.repeat requires a valid string.');\r\n }\r\n if (count !== count) {\r\n count = 0;\r\n }\r\n if (count < 0 || count === Infinity) {\r\n throw new RangeError('string.repeat requires a non-negative finite count.');\r\n }\r\n let result = '';\r\n while (count) {\r\n if (count % 2) {\r\n result += text;\r\n }\r\n if (count > 1) {\r\n text += text;\r\n }\r\n count >>= 1;\r\n }\r\n return result;\r\n };\r\n startsWith = function startsWith(text, search, position = 0) {\r\n search = String(search);\r\n [text, search, position] = normalizeSubstringArgs('startsWith', text, search, position);\r\n const end = position + search.length;\r\n if (end > text.length) {\r\n return false;\r\n }\r\n return text.slice(position, end) === search;\r\n };\r\n}\r\nif (true) {\r\n padEnd = wrapNative(global.String.prototype.padEnd);\r\n padStart = wrapNative(global.String.prototype.padStart);\r\n}\r\nelse {\r\n padEnd = function padEnd(text, maxLength, fillString = ' ') {\r\n if (text === null || text === undefined) {\r\n throw new TypeError('string.repeat requires a valid string.');\r\n }\r\n if (maxLength === Infinity) {\r\n throw new RangeError('string.padEnd requires a non-negative finite count.');\r\n }\r\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\r\n maxLength = 0;\r\n }\r\n let strText = String(text);\r\n const padding = maxLength - strText.length;\r\n if (padding > 0) {\r\n strText +=\r\n repeat(fillString, Math.floor(padding / fillString.length)) +\r\n fillString.slice(0, padding % fillString.length);\r\n }\r\n return strText;\r\n };\r\n padStart = function padStart(text, maxLength, fillString = ' ') {\r\n if (text === null || text === undefined) {\r\n throw new TypeError('string.repeat requires a valid string.');\r\n }\r\n if (maxLength === Infinity) {\r\n throw new RangeError('string.padStart requires a non-negative finite count.');\r\n }\r\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\r\n maxLength = 0;\r\n }\r\n let strText = String(text);\r\n const padding = maxLength - strText.length;\r\n if (padding > 0) {\r\n strText =\r\n repeat(fillString, Math.floor(padding / fillString.length)) +\r\n fillString.slice(0, padding % fillString.length) +\r\n strText;\r\n }\r\n return strText;\r\n };\r\n}\r\n//# sourceMappingURL=string.mjs.map" }, { - "id": "./node_modules/@dojo/shim/support/has.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\has.mjs", - "name": "./node_modules/@dojo/shim/support/has.mjs", + "id": "./node_modules/@dojo/framework/shim/support/has.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\has.mjs", + "name": "./node_modules/@dojo/framework/shim/support/has.mjs", "index": 6, "index2": 5, "size": 6316, @@ -1073,81 +1073,81 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "4:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "4:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "3:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Symbol.mjs", - "module": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleName": "./node_modules/@dojo/shim/Symbol.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Symbol.mjs", + "module": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Symbol.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "1:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "4:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/object.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\object.mjs", - "module": "./node_modules/@dojo/shim/object.mjs", - "moduleName": "./node_modules/@dojo/shim/object.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\object.mjs", + "module": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/object.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "2:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/string.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\string.mjs", - "module": "./node_modules/@dojo/shim/string.mjs", - "moduleName": "./node_modules/@dojo/shim/string.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\string.mjs", + "module": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/string.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "2:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\queue.mjs", - "module": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleName": "./node_modules/@dojo/shim/support/queue.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\queue.mjs", + "module": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/queue.mjs", "type": "harmony import", "userRequest": "./has", "loc": "2:0-24" @@ -1165,12 +1165,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import has, { add } from '@dojo/has/has';\r\nimport global from '../global';\r\nexport default has;\r\nexport * from '@dojo/has/has';\r\n/* ECMAScript 6 and 7 Features */\r\n/* Array */\r\nadd('es6-array', () => {\r\n return (['from', 'of'].every((key) => key in global.Array) &&\r\n ['findIndex', 'find', 'copyWithin'].every((key) => key in global.Array.prototype));\r\n}, true);\r\nadd('es6-array-fill', () => {\r\n if ('fill' in global.Array.prototype) {\r\n /* Some versions of Safari do not properly implement this */\r\n return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1;\r\n }\r\n return false;\r\n}, true);\r\nadd('es7-array', () => 'includes' in global.Array.prototype, true);\r\n/* Map */\r\nadd('es6-map', () => {\r\n if (typeof global.Map === 'function') {\r\n /*\r\n IE11 and older versions of Safari are missing critical ES6 Map functionality\r\n We wrap this in a try/catch because sometimes the Map constructor exists, but does not\r\n take arguments (iOS 8.4)\r\n */\r\n try {\r\n const map = new global.Map([[0, 1]]);\r\n return map.has(0) &&\r\n typeof map.keys === 'function' &&\r\n true &&\r\n typeof map.values === 'function' &&\r\n typeof map.entries === 'function';\r\n }\r\n catch (e) {\r\n /* istanbul ignore next: not testing on iOS at the moment */\r\n return false;\r\n }\r\n }\r\n return false;\r\n}, true);\r\n/* Math */\r\nadd('es6-math', () => {\r\n return [\r\n 'clz32',\r\n 'sign',\r\n 'log10',\r\n 'log2',\r\n 'log1p',\r\n 'expm1',\r\n 'cosh',\r\n 'sinh',\r\n 'tanh',\r\n 'acosh',\r\n 'asinh',\r\n 'atanh',\r\n 'trunc',\r\n 'fround',\r\n 'cbrt',\r\n 'hypot'\r\n ].every((name) => typeof global.Math[name] === 'function');\r\n}, true);\r\nadd('es6-math-imul', () => {\r\n if ('imul' in global.Math) {\r\n /* Some versions of Safari on ios do not properly implement this */\r\n return Math.imul(0xffffffff, 5) === -5;\r\n }\r\n return false;\r\n}, true);\r\n/* Object */\r\nadd('es6-object', () => {\r\n return true &&\r\n ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof global.Object[name] === 'function');\r\n}, true);\r\nadd('es2017-object', () => {\r\n return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof global.Object[name] === 'function');\r\n}, true);\r\n/* Observable */\r\nadd('es-observable', () => typeof global.Observable !== 'undefined', true);\r\n/* Promise */\r\nadd('es6-promise', () => typeof global.Promise !== 'undefined' && true, true);\r\n/* Set */\r\nadd('es6-set', () => {\r\n if (typeof global.Set === 'function') {\r\n /* IE11 and older versions of Safari are missing critical ES6 Set functionality */\r\n const set = new global.Set([1]);\r\n return set.has(1) && 'keys' in set && typeof set.keys === 'function' && true;\r\n }\r\n return false;\r\n}, true);\r\n/* String */\r\nadd('es6-string', () => {\r\n return ([\r\n /* static methods */\r\n 'fromCodePoint'\r\n ].every((key) => typeof global.String[key] === 'function') &&\r\n [\r\n /* instance methods */\r\n 'codePointAt',\r\n 'normalize',\r\n 'repeat',\r\n 'startsWith',\r\n 'endsWith',\r\n 'includes'\r\n ].every((key) => typeof global.String.prototype[key] === 'function'));\r\n}, true);\r\nadd('es6-string-raw', () => {\r\n function getCallSite(callSite, ...substitutions) {\r\n const result = [...callSite];\r\n result.raw = callSite.raw;\r\n return result;\r\n }\r\n if ('raw' in global.String) {\r\n let b = 1;\r\n let callSite = getCallSite `a\\n${b}`;\r\n callSite.raw = ['a\\\\n'];\r\n const supportsTrunc = global.String.raw(callSite, 42) === 'a:\\\\n';\r\n return supportsTrunc;\r\n }\r\n return false;\r\n}, true);\r\nadd('es2017-string', () => {\r\n return ['padStart', 'padEnd'].every((key) => typeof global.String.prototype[key] === 'function');\r\n}, true);\r\n/* Symbol */\r\nadd('es6-symbol', () => typeof global.Symbol !== 'undefined' && typeof Symbol() === 'symbol', true);\r\n/* WeakMap */\r\nadd('es6-weakmap', () => {\r\n if (typeof global.WeakMap !== 'undefined') {\r\n /* IE11 and older versions of Safari are missing critical ES6 Map functionality */\r\n const key1 = {};\r\n const key2 = {};\r\n const map = new global.WeakMap([[key1, 1]]);\r\n Object.freeze(key1);\r\n return map.get(key1) === 1 && map.set(key2, 2) === map && true;\r\n }\r\n return false;\r\n}, true);\r\n/* Miscellaneous features */\r\nadd('microtasks', () => true || false || true, true);\r\nadd('postmessage', () => {\r\n // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have\r\n // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist.\r\n return typeof global.window !== 'undefined' && typeof global.postMessage === 'function';\r\n}, true);\r\nadd('raf', () => typeof global.requestAnimationFrame === 'function', true);\r\nadd('setimmediate', () => typeof global.setImmediate !== 'undefined', true);\r\n/* DOM Features */\r\nadd('dom-mutationobserver', () => {\r\n if (true && Boolean(global.MutationObserver || global.WebKitMutationObserver)) {\r\n // IE11 has an unreliable MutationObserver implementation where setProperty() does not\r\n // generate a mutation event, observers can crash, and the queue does not drain\r\n // reliably. The following feature test was adapted from\r\n // https://gist.github.com/t10ko/4aceb8c71681fdb275e33efe5e576b14\r\n const example = document.createElement('div');\r\n /* tslint:disable-next-line:variable-name */\r\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\r\n const observer = new HostMutationObserver(function () { });\r\n observer.observe(example, { attributes: true });\r\n example.style.setProperty('display', 'block');\r\n return Boolean(observer.takeRecords().length);\r\n }\r\n return false;\r\n}, true);\r\nadd('dom-webanimation', () => true && global.Animation !== undefined && global.KeyframeEffect !== undefined, true);\r\n//# sourceMappingURL=has.mjs.map" + "source": "import has, { add } from '../../has/has';\r\nimport global from '../global';\r\nexport default has;\r\nexport * from '../../has/has';\r\n/* ECMAScript 6 and 7 Features */\r\n/* Array */\r\nadd('es6-array', () => {\r\n return (['from', 'of'].every((key) => key in global.Array) &&\r\n ['findIndex', 'find', 'copyWithin'].every((key) => key in global.Array.prototype));\r\n}, true);\r\nadd('es6-array-fill', () => {\r\n if ('fill' in global.Array.prototype) {\r\n /* Some versions of Safari do not properly implement this */\r\n return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1;\r\n }\r\n return false;\r\n}, true);\r\nadd('es7-array', () => 'includes' in global.Array.prototype, true);\r\n/* Map */\r\nadd('es6-map', () => {\r\n if (typeof global.Map === 'function') {\r\n /*\r\n IE11 and older versions of Safari are missing critical ES6 Map functionality\r\n We wrap this in a try/catch because sometimes the Map constructor exists, but does not\r\n take arguments (iOS 8.4)\r\n */\r\n try {\r\n const map = new global.Map([[0, 1]]);\r\n return map.has(0) &&\r\n typeof map.keys === 'function' &&\r\n true &&\r\n typeof map.values === 'function' &&\r\n typeof map.entries === 'function';\r\n }\r\n catch (e) {\r\n /* istanbul ignore next: not testing on iOS at the moment */\r\n return false;\r\n }\r\n }\r\n return false;\r\n}, true);\r\n/* Math */\r\nadd('es6-math', () => {\r\n return [\r\n 'clz32',\r\n 'sign',\r\n 'log10',\r\n 'log2',\r\n 'log1p',\r\n 'expm1',\r\n 'cosh',\r\n 'sinh',\r\n 'tanh',\r\n 'acosh',\r\n 'asinh',\r\n 'atanh',\r\n 'trunc',\r\n 'fround',\r\n 'cbrt',\r\n 'hypot'\r\n ].every((name) => typeof global.Math[name] === 'function');\r\n}, true);\r\nadd('es6-math-imul', () => {\r\n if ('imul' in global.Math) {\r\n /* Some versions of Safari on ios do not properly implement this */\r\n return Math.imul(0xffffffff, 5) === -5;\r\n }\r\n return false;\r\n}, true);\r\n/* Object */\r\nadd('es6-object', () => {\r\n return true &&\r\n ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof global.Object[name] === 'function');\r\n}, true);\r\nadd('es2017-object', () => {\r\n return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof global.Object[name] === 'function');\r\n}, true);\r\n/* Observable */\r\nadd('es-observable', () => typeof global.Observable !== 'undefined', true);\r\n/* Promise */\r\nadd('es6-promise', () => typeof global.Promise !== 'undefined' && true, true);\r\n/* Set */\r\nadd('es6-set', () => {\r\n if (typeof global.Set === 'function') {\r\n /* IE11 and older versions of Safari are missing critical ES6 Set functionality */\r\n const set = new global.Set([1]);\r\n return set.has(1) && 'keys' in set && typeof set.keys === 'function' && true;\r\n }\r\n return false;\r\n}, true);\r\n/* String */\r\nadd('es6-string', () => {\r\n return ([\r\n /* static methods */\r\n 'fromCodePoint'\r\n ].every((key) => typeof global.String[key] === 'function') &&\r\n [\r\n /* instance methods */\r\n 'codePointAt',\r\n 'normalize',\r\n 'repeat',\r\n 'startsWith',\r\n 'endsWith',\r\n 'includes'\r\n ].every((key) => typeof global.String.prototype[key] === 'function'));\r\n}, true);\r\nadd('es6-string-raw', () => {\r\n function getCallSite(callSite, ...substitutions) {\r\n const result = [...callSite];\r\n result.raw = callSite.raw;\r\n return result;\r\n }\r\n if ('raw' in global.String) {\r\n let b = 1;\r\n let callSite = getCallSite `a\\n${b}`;\r\n callSite.raw = ['a\\\\n'];\r\n const supportsTrunc = global.String.raw(callSite, 42) === 'a:\\\\n';\r\n return supportsTrunc;\r\n }\r\n return false;\r\n}, true);\r\nadd('es2017-string', () => {\r\n return ['padStart', 'padEnd'].every((key) => typeof global.String.prototype[key] === 'function');\r\n}, true);\r\n/* Symbol */\r\nadd('es6-symbol', () => typeof global.Symbol !== 'undefined' && typeof Symbol() === 'symbol', true);\r\n/* WeakMap */\r\nadd('es6-weakmap', () => {\r\n if (typeof global.WeakMap !== 'undefined') {\r\n /* IE11 and older versions of Safari are missing critical ES6 Map functionality */\r\n const key1 = {};\r\n const key2 = {};\r\n const map = new global.WeakMap([[key1, 1]]);\r\n Object.freeze(key1);\r\n return map.get(key1) === 1 && map.set(key2, 2) === map && true;\r\n }\r\n return false;\r\n}, true);\r\n/* Miscellaneous features */\r\nadd('microtasks', () => true || false || true, true);\r\nadd('postmessage', () => {\r\n // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have\r\n // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist.\r\n return typeof global.window !== 'undefined' && typeof global.postMessage === 'function';\r\n}, true);\r\nadd('raf', () => typeof global.requestAnimationFrame === 'function', true);\r\nadd('setimmediate', () => typeof global.setImmediate !== 'undefined', true);\r\n/* DOM Features */\r\nadd('dom-mutationobserver', () => {\r\n if (true && Boolean(global.MutationObserver || global.WebKitMutationObserver)) {\r\n // IE11 has an unreliable MutationObserver implementation where setProperty() does not\r\n // generate a mutation event, observers can crash, and the queue does not drain\r\n // reliably. The following feature test was adapted from\r\n // https://gist.github.com/t10ko/4aceb8c71681fdb275e33efe5e576b14\r\n const example = document.createElement('div');\r\n /* tslint:disable-next-line:variable-name */\r\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\r\n const observer = new HostMutationObserver(function () { });\r\n observer.observe(example, { attributes: true });\r\n example.style.setProperty('display', 'block');\r\n return Boolean(observer.takeRecords().length);\r\n }\r\n return false;\r\n}, true);\r\nadd('dom-webanimation', () => true && global.Animation !== undefined && global.KeyframeEffect !== undefined, true);\r\n//# sourceMappingURL=has.mjs.map" }, { - "id": "./node_modules/@dojo/shim/support/queue.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\queue.mjs", - "name": "./node_modules/@dojo/shim/support/queue.mjs", + "id": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\queue.mjs", + "name": "./node_modules/@dojo/framework/shim/support/queue.mjs", "index": 23, "index2": 14, "size": 6381, @@ -1182,18 +1182,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Promise.mjs", - "issuerId": "./node_modules/@dojo/shim/Promise.mjs", - "issuerName": "./node_modules/@dojo/shim/Promise.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Promise.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/Promise.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./support/queue", "loc": "2:0-49" @@ -1210,9 +1210,9 @@ "source": "import global from '../global';\r\nimport has from './has';\r\nfunction executeTask(item) {\r\n if (item && item.isActive && item.callback) {\r\n item.callback();\r\n }\r\n}\r\nfunction getQueueHandle(item, destructor) {\r\n return {\r\n destroy: function () {\r\n this.destroy = function () { };\r\n item.isActive = false;\r\n item.callback = null;\r\n if (destructor) {\r\n destructor();\r\n }\r\n }\r\n };\r\n}\r\nlet checkMicroTaskQueue;\r\nlet microTasks;\r\n/**\r\n * Schedules a callback to the macrotask queue.\r\n *\r\n * @param callback the function to be queued and later executed.\r\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\r\n */\r\nexport const queueTask = (function () {\r\n let destructor;\r\n let enqueue;\r\n // Since the IE implementation of `setImmediate` is not flawless, we will test for `postMessage` first.\r\n if (true) {\r\n const queue = [];\r\n global.addEventListener('message', function (event) {\r\n // Confirm that the event was triggered by the current window and by this particular implementation.\r\n if (event.source === global && event.data === 'dojo-queue-message') {\r\n event.stopPropagation();\r\n if (queue.length) {\r\n executeTask(queue.shift());\r\n }\r\n }\r\n });\r\n enqueue = function (item) {\r\n queue.push(item);\r\n global.postMessage('dojo-queue-message', '*');\r\n };\r\n }\r\n else if (false) {\r\n destructor = global.clearImmediate;\r\n enqueue = function (item) {\r\n return setImmediate(executeTask.bind(null, item));\r\n };\r\n }\r\n else {\r\n destructor = global.clearTimeout;\r\n enqueue = function (item) {\r\n return setTimeout(executeTask.bind(null, item), 0);\r\n };\r\n }\r\n function queueTask(callback) {\r\n const item = {\r\n isActive: true,\r\n callback: callback\r\n };\r\n const id = enqueue(item);\r\n return getQueueHandle(item, destructor &&\r\n function () {\r\n destructor(id);\r\n });\r\n }\r\n // TODO: Use aspect.before when it is available.\r\n return true\r\n ? queueTask\r\n : function (callback) {\r\n checkMicroTaskQueue();\r\n return queueTask(callback);\r\n };\r\n})();\r\n// When no mechanism for registering microtasks is exposed by the environment, microtasks will\r\n// be queued and then executed in a single macrotask before the other macrotasks are executed.\r\nif (!true) {\r\n let isMicroTaskQueued = false;\r\n microTasks = [];\r\n checkMicroTaskQueue = function () {\r\n if (!isMicroTaskQueued) {\r\n isMicroTaskQueued = true;\r\n queueTask(function () {\r\n isMicroTaskQueued = false;\r\n if (microTasks.length) {\r\n let item;\r\n while ((item = microTasks.shift())) {\r\n executeTask(item);\r\n }\r\n }\r\n });\r\n }\r\n };\r\n}\r\n/**\r\n * Schedules an animation task with `window.requestAnimationFrame` if it exists, or with `queueTask` otherwise.\r\n *\r\n * Since requestAnimationFrame's behavior does not match that expected from `queueTask`, it is not used there.\r\n * However, at times it makes more sense to delegate to requestAnimationFrame; hence the following method.\r\n *\r\n * @param callback the function to be queued and later executed.\r\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\r\n */\r\nexport const queueAnimationTask = (function () {\r\n if (!true) {\r\n return queueTask;\r\n }\r\n function queueAnimationTask(callback) {\r\n const item = {\r\n isActive: true,\r\n callback: callback\r\n };\r\n const rafId = requestAnimationFrame(executeTask.bind(null, item));\r\n return getQueueHandle(item, function () {\r\n cancelAnimationFrame(rafId);\r\n });\r\n }\r\n // TODO: Use aspect.before when it is available.\r\n return true\r\n ? queueAnimationTask\r\n : function (callback) {\r\n checkMicroTaskQueue();\r\n return queueAnimationTask(callback);\r\n };\r\n})();\r\n/**\r\n * Schedules a callback to the microtask queue.\r\n *\r\n * Any callbacks registered with `queueMicroTask` will be executed before the next macrotask. If no native\r\n * mechanism for scheduling macrotasks is exposed, then any callbacks will be fired before any macrotask\r\n * registered with `queueTask` or `queueAnimationTask`.\r\n *\r\n * @param callback the function to be queued and later executed.\r\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\r\n */\r\nexport let queueMicroTask = (function () {\r\n let enqueue;\r\n if (false) {\r\n enqueue = function (item) {\r\n global.process.nextTick(executeTask.bind(null, item));\r\n };\r\n }\r\n else if (true) {\r\n enqueue = function (item) {\r\n global.Promise.resolve(item).then(executeTask);\r\n };\r\n }\r\n else if (true) {\r\n /* tslint:disable-next-line:variable-name */\r\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\r\n const node = document.createElement('div');\r\n const queue = [];\r\n const observer = new HostMutationObserver(function () {\r\n while (queue.length > 0) {\r\n const item = queue.shift();\r\n if (item && item.isActive && item.callback) {\r\n item.callback();\r\n }\r\n }\r\n });\r\n observer.observe(node, { attributes: true });\r\n enqueue = function (item) {\r\n queue.push(item);\r\n node.setAttribute('queueStatus', '1');\r\n };\r\n }\r\n else {\r\n enqueue = function (item) {\r\n checkMicroTaskQueue();\r\n microTasks.push(item);\r\n };\r\n }\r\n return function (callback) {\r\n const item = {\r\n isActive: true,\r\n callback: callback\r\n };\r\n enqueue(item);\r\n return getQueueHandle(item);\r\n };\r\n})();\r\n//# sourceMappingURL=queue.mjs.map" }, { - "id": "./node_modules/@dojo/shim/support/util.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\util.mjs", - "name": "./node_modules/@dojo/shim/support/util.mjs", + "id": "./node_modules/@dojo/framework/shim/support/util.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\util.mjs", + "name": "./node_modules/@dojo/framework/shim/support/util.mjs", "index": 11, "index2": 6, "size": 853, @@ -1224,36 +1224,36 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./support/util", "loc": "5:0-44" }, { - "moduleId": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Symbol.mjs", - "module": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleName": "./node_modules/@dojo/shim/Symbol.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Symbol.mjs", + "module": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Symbol.mjs", "type": "harmony import", "userRequest": "./support/util", "loc": "3:0-52" }, { - "moduleId": "./node_modules/@dojo/shim/string.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\string.mjs", - "module": "./node_modules/@dojo/shim/string.mjs", - "moduleName": "./node_modules/@dojo/shim/string.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\string.mjs", + "module": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/string.mjs", "type": "harmony import", "userRequest": "./support/util", "loc": "3:0-44" @@ -1272,12 +1272,12 @@ "source": "/**\n * Helper function to generate a value property descriptor\n *\n * @param value The value the property descriptor should be set to\n * @param enumerable If the property should be enumberable, defaults to false\n * @param writable If the property should be writable, defaults to true\n * @param configurable If the property should be configurable, defaults to true\n * @return The property descriptor object\n */\nexport function getValueDescriptor(value, enumerable = false, writable = true, configurable = true) {\n return {\n value: value,\n enumerable: enumerable,\n writable: writable,\n configurable: configurable\n };\n}\nexport function wrapNative(nativeFunction) {\n return function (target, ...args) {\n return nativeFunction.apply(target, args);\n };\n}\n//# sourceMappingURL=util.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/Injector.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Injector.mjs", - "name": "./node_modules/@dojo/widget-core/Injector.mjs", + "id": "./node_modules/@dojo/framework/widget-core/Injector.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Injector.mjs", + "name": "./node_modules/@dojo/framework/widget-core/Injector.mjs", "index": 37, "index2": 31, - "size": 496, + "size": 493, "cacheable": true, "built": true, "optional": false, @@ -1286,18 +1286,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../Injector", "loc": "2:0-41" @@ -1312,15 +1312,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { Evented } from '@dojo/core/Evented';\nexport class Injector extends Evented {\n constructor(payload) {\n super();\n this._payload = payload;\n }\n setInvalidator(invalidator) {\n this._invalidator = invalidator;\n }\n get() {\n return this._payload;\n }\n set(payload) {\n this._payload = payload;\n if (this._invalidator) {\n this._invalidator();\n }\n }\n}\nexport default Injector;\n//# sourceMappingURL=Injector.mjs.map" + "source": "import { Evented } from '../core/Evented';\nexport class Injector extends Evented {\n constructor(payload) {\n super();\n this._payload = payload;\n }\n setInvalidator(invalidator) {\n this._invalidator = invalidator;\n }\n get() {\n return this._payload;\n }\n set(payload) {\n this._payload = payload;\n if (this._invalidator) {\n this._invalidator();\n }\n }\n}\nexport default Injector;\n//# sourceMappingURL=Injector.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\NodeHandler.mjs", - "name": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "id": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\NodeHandler.mjs", + "name": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", "index": 28, "index2": 22, - "size": 1134, + "size": 1128, "cacheable": true, "built": true, "optional": false, @@ -1329,18 +1329,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./NodeHandler", "loc": "7:0-40" @@ -1356,15 +1356,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { Evented } from '@dojo/core/Evented';\r\nimport Map from '@dojo/shim/Map';\r\n/**\r\n * Enum to identify the type of event.\r\n * Listening to 'Projector' will notify when projector is created or updated\r\n * Listening to 'Widget' will notify when widget root is created or updated\r\n */\r\nexport var NodeEventType;\r\n(function (NodeEventType) {\r\n NodeEventType[\"Projector\"] = \"Projector\";\r\n NodeEventType[\"Widget\"] = \"Widget\";\r\n})(NodeEventType || (NodeEventType = {}));\r\nexport class NodeHandler extends Evented {\r\n constructor() {\r\n super(...arguments);\r\n this._nodeMap = new Map();\r\n }\r\n get(key) {\r\n return this._nodeMap.get(key);\r\n }\r\n has(key) {\r\n return this._nodeMap.has(key);\r\n }\r\n add(element, key) {\r\n this._nodeMap.set(key, element);\r\n this.emit({ type: key });\r\n }\r\n addRoot() {\r\n this.emit({ type: NodeEventType.Widget });\r\n }\r\n addProjector() {\r\n this.emit({ type: NodeEventType.Projector });\r\n }\r\n clear() {\r\n this._nodeMap.clear();\r\n }\r\n}\r\nexport default NodeHandler;\r\n//# sourceMappingURL=NodeHandler.mjs.map" + "source": "import { Evented } from '../core/Evented';\r\nimport Map from '../shim/Map';\r\n/**\r\n * Enum to identify the type of event.\r\n * Listening to 'Projector' will notify when projector is created or updated\r\n * Listening to 'Widget' will notify when widget root is created or updated\r\n */\r\nexport var NodeEventType;\r\n(function (NodeEventType) {\r\n NodeEventType[\"Projector\"] = \"Projector\";\r\n NodeEventType[\"Widget\"] = \"Widget\";\r\n})(NodeEventType || (NodeEventType = {}));\r\nexport class NodeHandler extends Evented {\r\n constructor() {\r\n super(...arguments);\r\n this._nodeMap = new Map();\r\n }\r\n get(key) {\r\n return this._nodeMap.get(key);\r\n }\r\n has(key) {\r\n return this._nodeMap.has(key);\r\n }\r\n add(element, key) {\r\n this._nodeMap.set(key, element);\r\n this.emit({ type: key });\r\n }\r\n addRoot() {\r\n this.emit({ type: NodeEventType.Widget });\r\n }\r\n addProjector() {\r\n this.emit({ type: NodeEventType.Projector });\r\n }\r\n clear() {\r\n this._nodeMap.clear();\r\n }\r\n}\r\nexport default NodeHandler;\r\n//# sourceMappingURL=NodeHandler.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/Registry.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Registry.mjs", - "name": "./node_modules/@dojo/widget-core/Registry.mjs", + "id": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Registry.mjs", + "name": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "index": 21, "index2": 19, - "size": 3814, + "size": 3802, "cacheable": true, "built": true, "optional": false, @@ -1373,54 +1373,54 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./Registry", "loc": "9:0-71" }, { - "moduleId": "./node_modules/@dojo/widget-core/diff.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\diff.mjs", - "module": "./node_modules/@dojo/widget-core/diff.mjs", - "moduleName": "./node_modules/@dojo/widget-core/diff.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\RegistryHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "type": "harmony import", "userRequest": "./Registry", - "loc": "1:0-46" + "loc": "3:0-38" }, { - "moduleId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\RegistryHandler.mjs", - "module": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/diff.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\diff.mjs", + "module": "./node_modules/@dojo/framework/widget-core/diff.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/diff.mjs", "type": "harmony import", "userRequest": "./Registry", - "loc": "3:0-38" + "loc": "1:0-46" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", "userRequest": "./Registry", "loc": "4:0-53" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\customElement.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\customElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", "type": "harmony import", "userRequest": "../Registry", "loc": "2:0-35" @@ -1441,15 +1441,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import Promise from '@dojo/shim/Promise';\r\nimport Map from '@dojo/shim/Map';\r\nimport Symbol from '@dojo/shim/Symbol';\r\nimport { Evented } from '@dojo/core/Evented';\r\n/**\r\n * Widget base symbol type\r\n */\r\nexport const WIDGET_BASE_TYPE = Symbol('Widget Base');\r\n/**\r\n * Checks is the item is a subclass of WidgetBase (or a WidgetBase)\r\n *\r\n * @param item the item to check\r\n * @returns true/false indicating if the item is a WidgetBaseConstructor\r\n */\r\nexport function isWidgetBaseConstructor(item) {\r\n return Boolean(item && item._type === WIDGET_BASE_TYPE);\r\n}\r\nexport function isWidgetConstructorDefaultExport(item) {\r\n return Boolean(item &&\r\n item.hasOwnProperty('__esModule') &&\r\n item.hasOwnProperty('default') &&\r\n isWidgetBaseConstructor(item.default));\r\n}\r\n/**\r\n * The Registry implementation\r\n */\r\nexport class Registry extends Evented {\r\n /**\r\n * Emit loaded event for registry label\r\n */\r\n emitLoadedEvent(widgetLabel, item) {\r\n this.emit({\r\n type: widgetLabel,\r\n action: 'loaded',\r\n item\r\n });\r\n }\r\n define(label, item) {\r\n if (this._widgetRegistry === undefined) {\r\n this._widgetRegistry = new Map();\r\n }\r\n if (this._widgetRegistry.has(label)) {\r\n throw new Error(`widget has already been registered for '${label.toString()}'`);\r\n }\r\n this._widgetRegistry.set(label, item);\r\n if (item instanceof Promise) {\r\n item.then((widgetCtor) => {\r\n this._widgetRegistry.set(label, widgetCtor);\r\n this.emitLoadedEvent(label, widgetCtor);\r\n return widgetCtor;\r\n }, (error) => {\r\n throw error;\r\n });\r\n }\r\n else if (isWidgetBaseConstructor(item)) {\r\n this.emitLoadedEvent(label, item);\r\n }\r\n }\r\n defineInjector(label, injectorFactory) {\r\n if (this._injectorRegistry === undefined) {\r\n this._injectorRegistry = new Map();\r\n }\r\n if (this._injectorRegistry.has(label)) {\r\n throw new Error(`injector has already been registered for '${label.toString()}'`);\r\n }\r\n const invalidator = new Evented();\r\n const injectorItem = {\r\n injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })),\r\n invalidator\r\n };\r\n this._injectorRegistry.set(label, injectorItem);\r\n this.emitLoadedEvent(label, injectorItem);\r\n }\r\n get(label) {\r\n if (!this._widgetRegistry || !this.has(label)) {\r\n return null;\r\n }\r\n const item = this._widgetRegistry.get(label);\r\n if (isWidgetBaseConstructor(item)) {\r\n return item;\r\n }\r\n if (item instanceof Promise) {\r\n return null;\r\n }\r\n const promise = item();\r\n this._widgetRegistry.set(label, promise);\r\n promise.then((widgetCtor) => {\r\n if (isWidgetConstructorDefaultExport(widgetCtor)) {\r\n widgetCtor = widgetCtor.default;\r\n }\r\n this._widgetRegistry.set(label, widgetCtor);\r\n this.emitLoadedEvent(label, widgetCtor);\r\n return widgetCtor;\r\n }, (error) => {\r\n throw error;\r\n });\r\n return null;\r\n }\r\n getInjector(label) {\r\n if (!this._injectorRegistry || !this.hasInjector(label)) {\r\n return null;\r\n }\r\n return this._injectorRegistry.get(label);\r\n }\r\n has(label) {\r\n return Boolean(this._widgetRegistry && this._widgetRegistry.has(label));\r\n }\r\n hasInjector(label) {\r\n return Boolean(this._injectorRegistry && this._injectorRegistry.has(label));\r\n }\r\n}\r\nexport default Registry;\r\n//# sourceMappingURL=Registry.mjs.map" + "source": "import Promise from '../shim/Promise';\r\nimport Map from '../shim/Map';\r\nimport Symbol from '../shim/Symbol';\r\nimport { Evented } from '../core/Evented';\r\n/**\r\n * Widget base symbol type\r\n */\r\nexport const WIDGET_BASE_TYPE = Symbol('Widget Base');\r\n/**\r\n * Checks is the item is a subclass of WidgetBase (or a WidgetBase)\r\n *\r\n * @param item the item to check\r\n * @returns true/false indicating if the item is a WidgetBaseConstructor\r\n */\r\nexport function isWidgetBaseConstructor(item) {\r\n return Boolean(item && item._type === WIDGET_BASE_TYPE);\r\n}\r\nexport function isWidgetConstructorDefaultExport(item) {\r\n return Boolean(item &&\r\n item.hasOwnProperty('__esModule') &&\r\n item.hasOwnProperty('default') &&\r\n isWidgetBaseConstructor(item.default));\r\n}\r\n/**\r\n * The Registry implementation\r\n */\r\nexport class Registry extends Evented {\r\n /**\r\n * Emit loaded event for registry label\r\n */\r\n emitLoadedEvent(widgetLabel, item) {\r\n this.emit({\r\n type: widgetLabel,\r\n action: 'loaded',\r\n item\r\n });\r\n }\r\n define(label, item) {\r\n if (this._widgetRegistry === undefined) {\r\n this._widgetRegistry = new Map();\r\n }\r\n if (this._widgetRegistry.has(label)) {\r\n throw new Error(`widget has already been registered for '${label.toString()}'`);\r\n }\r\n this._widgetRegistry.set(label, item);\r\n if (item instanceof Promise) {\r\n item.then((widgetCtor) => {\r\n this._widgetRegistry.set(label, widgetCtor);\r\n this.emitLoadedEvent(label, widgetCtor);\r\n return widgetCtor;\r\n }, (error) => {\r\n throw error;\r\n });\r\n }\r\n else if (isWidgetBaseConstructor(item)) {\r\n this.emitLoadedEvent(label, item);\r\n }\r\n }\r\n defineInjector(label, injectorFactory) {\r\n if (this._injectorRegistry === undefined) {\r\n this._injectorRegistry = new Map();\r\n }\r\n if (this._injectorRegistry.has(label)) {\r\n throw new Error(`injector has already been registered for '${label.toString()}'`);\r\n }\r\n const invalidator = new Evented();\r\n const injectorItem = {\r\n injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })),\r\n invalidator\r\n };\r\n this._injectorRegistry.set(label, injectorItem);\r\n this.emitLoadedEvent(label, injectorItem);\r\n }\r\n get(label) {\r\n if (!this._widgetRegistry || !this.has(label)) {\r\n return null;\r\n }\r\n const item = this._widgetRegistry.get(label);\r\n if (isWidgetBaseConstructor(item)) {\r\n return item;\r\n }\r\n if (item instanceof Promise) {\r\n return null;\r\n }\r\n const promise = item();\r\n this._widgetRegistry.set(label, promise);\r\n promise.then((widgetCtor) => {\r\n if (isWidgetConstructorDefaultExport(widgetCtor)) {\r\n widgetCtor = widgetCtor.default;\r\n }\r\n this._widgetRegistry.set(label, widgetCtor);\r\n this.emitLoadedEvent(label, widgetCtor);\r\n return widgetCtor;\r\n }, (error) => {\r\n throw error;\r\n });\r\n return null;\r\n }\r\n getInjector(label) {\r\n if (!this._injectorRegistry || !this.hasInjector(label)) {\r\n return null;\r\n }\r\n return this._injectorRegistry.get(label);\r\n }\r\n has(label) {\r\n return Boolean(this._widgetRegistry && this._widgetRegistry.has(label));\r\n }\r\n hasInjector(label) {\r\n return Boolean(this._injectorRegistry && this._injectorRegistry.has(label));\r\n }\r\n}\r\nexport default Registry;\r\n//# sourceMappingURL=Registry.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\RegistryHandler.mjs", - "name": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "id": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\RegistryHandler.mjs", + "name": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "index": 27, "index2": 21, - "size": 2933, + "size": 2927, "cacheable": true, "built": true, "optional": false, @@ -1458,18 +1458,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./RegistryHandler", "loc": "6:0-48" @@ -1484,15 +1484,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { Map } from '@dojo/shim/Map';\r\nimport { Evented } from '@dojo/core/Evented';\r\nimport { Registry } from './Registry';\r\nexport class RegistryHandler extends Evented {\r\n constructor() {\r\n super();\r\n this._registry = new Registry();\r\n this._registryWidgetLabelMap = new Map();\r\n this._registryInjectorLabelMap = new Map();\r\n this.own(this._registry);\r\n const destroy = () => {\r\n if (this.baseRegistry) {\r\n this._registryWidgetLabelMap.delete(this.baseRegistry);\r\n this._registryInjectorLabelMap.delete(this.baseRegistry);\r\n this.baseRegistry = undefined;\r\n }\r\n };\r\n this.own({ destroy });\r\n }\r\n set base(baseRegistry) {\r\n if (this.baseRegistry) {\r\n this._registryWidgetLabelMap.delete(this.baseRegistry);\r\n this._registryInjectorLabelMap.delete(this.baseRegistry);\r\n }\r\n this.baseRegistry = baseRegistry;\r\n }\r\n define(label, widget) {\r\n this._registry.define(label, widget);\r\n }\r\n defineInjector(label, injector) {\r\n this._registry.defineInjector(label, injector);\r\n }\r\n has(label) {\r\n return this._registry.has(label) || Boolean(this.baseRegistry && this.baseRegistry.has(label));\r\n }\r\n hasInjector(label) {\r\n return this._registry.hasInjector(label) || Boolean(this.baseRegistry && this.baseRegistry.hasInjector(label));\r\n }\r\n get(label, globalPrecedence = false) {\r\n return this._get(label, globalPrecedence, 'get', this._registryWidgetLabelMap);\r\n }\r\n getInjector(label, globalPrecedence = false) {\r\n return this._get(label, globalPrecedence, 'getInjector', this._registryInjectorLabelMap);\r\n }\r\n _get(label, globalPrecedence, getFunctionName, labelMap) {\r\n const registries = globalPrecedence ? [this.baseRegistry, this._registry] : [this._registry, this.baseRegistry];\r\n for (let i = 0; i < registries.length; i++) {\r\n const registry = registries[i];\r\n if (!registry) {\r\n continue;\r\n }\r\n const item = registry[getFunctionName](label);\r\n const registeredLabels = labelMap.get(registry) || [];\r\n if (item) {\r\n return item;\r\n }\r\n else if (registeredLabels.indexOf(label) === -1) {\r\n const handle = registry.on(label, (event) => {\r\n if (event.action === 'loaded' &&\r\n this[getFunctionName](label, globalPrecedence) === event.item) {\r\n this.emit({ type: 'invalidate' });\r\n }\r\n });\r\n this.own(handle);\r\n labelMap.set(registry, [...registeredLabels, label]);\r\n }\r\n }\r\n return null;\r\n }\r\n}\r\nexport default RegistryHandler;\r\n//# sourceMappingURL=RegistryHandler.mjs.map" + "source": "import { Map } from '../shim/Map';\r\nimport { Evented } from '../core/Evented';\r\nimport { Registry } from './Registry';\r\nexport class RegistryHandler extends Evented {\r\n constructor() {\r\n super();\r\n this._registry = new Registry();\r\n this._registryWidgetLabelMap = new Map();\r\n this._registryInjectorLabelMap = new Map();\r\n this.own(this._registry);\r\n const destroy = () => {\r\n if (this.baseRegistry) {\r\n this._registryWidgetLabelMap.delete(this.baseRegistry);\r\n this._registryInjectorLabelMap.delete(this.baseRegistry);\r\n this.baseRegistry = undefined;\r\n }\r\n };\r\n this.own({ destroy });\r\n }\r\n set base(baseRegistry) {\r\n if (this.baseRegistry) {\r\n this._registryWidgetLabelMap.delete(this.baseRegistry);\r\n this._registryInjectorLabelMap.delete(this.baseRegistry);\r\n }\r\n this.baseRegistry = baseRegistry;\r\n }\r\n define(label, widget) {\r\n this._registry.define(label, widget);\r\n }\r\n defineInjector(label, injector) {\r\n this._registry.defineInjector(label, injector);\r\n }\r\n has(label) {\r\n return this._registry.has(label) || Boolean(this.baseRegistry && this.baseRegistry.has(label));\r\n }\r\n hasInjector(label) {\r\n return this._registry.hasInjector(label) || Boolean(this.baseRegistry && this.baseRegistry.hasInjector(label));\r\n }\r\n get(label, globalPrecedence = false) {\r\n return this._get(label, globalPrecedence, 'get', this._registryWidgetLabelMap);\r\n }\r\n getInjector(label, globalPrecedence = false) {\r\n return this._get(label, globalPrecedence, 'getInjector', this._registryInjectorLabelMap);\r\n }\r\n _get(label, globalPrecedence, getFunctionName, labelMap) {\r\n const registries = globalPrecedence ? [this.baseRegistry, this._registry] : [this._registry, this.baseRegistry];\r\n for (let i = 0; i < registries.length; i++) {\r\n const registry = registries[i];\r\n if (!registry) {\r\n continue;\r\n }\r\n const item = registry[getFunctionName](label);\r\n const registeredLabels = labelMap.get(registry) || [];\r\n if (item) {\r\n return item;\r\n }\r\n else if (registeredLabels.indexOf(label) === -1) {\r\n const handle = registry.on(label, (event) => {\r\n if (event.action === 'loaded' &&\r\n this[getFunctionName](label, globalPrecedence) === event.item) {\r\n this.emit({ type: 'invalidate' });\r\n }\r\n });\r\n this.own(handle);\r\n labelMap.set(registry, [...registeredLabels, label]);\r\n }\r\n }\r\n return null;\r\n }\r\n}\r\nexport default RegistryHandler;\r\n//# sourceMappingURL=RegistryHandler.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "name": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "id": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "name": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "index": 14, "index2": 26, - "size": 14386, + "size": 13720, "cacheable": true, "built": true, "optional": false, @@ -1501,18 +1501,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./WidgetBase", "loc": "2:0-50" @@ -1523,8 +1523,8 @@ "module": "./src/menu-item/MenuItem.ts", "moduleName": "./src/menu-item/MenuItem.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/WidgetBase", - "loc": "5:0-58" + "userRequest": "@dojo/framework/widget-core/WidgetBase", + "loc": "5:0-68" } ], "usedExports": [ @@ -1538,12 +1538,12 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import Map from '@dojo/shim/Map';\nimport WeakMap from '@dojo/shim/WeakMap';\nimport Symbol from '@dojo/shim/Symbol';\nimport { v } from './d';\nimport { auto } from './diff';\nimport RegistryHandler from './RegistryHandler';\nimport NodeHandler from './NodeHandler';\nimport { widgetInstanceMap } from './vdom';\nimport { isWidgetBaseConstructor, WIDGET_BASE_TYPE } from './Registry';\nconst decoratorMap = new Map();\nconst boundAuto = auto.bind(null);\nexport const noBind = Symbol.for('dojoNoBind');\n/**\n * Main widget base for all widgets to extend\n */\nexport class WidgetBase {\n /**\n * @constructor\n */\n constructor() {\n /**\n * Indicates if it is the initial set properties cycle\n */\n this._initialProperties = true;\n /**\n * Array of property keys considered changed from the previous set properties\n */\n this._changedPropertyKeys = [];\n this._nodeHandler = new NodeHandler();\n this._handles = [];\n this._children = [];\n this._decoratorCache = new Map();\n this._properties = {};\n this._boundRenderFunc = this.render.bind(this);\n this._boundInvalidate = this.invalidate.bind(this);\n widgetInstanceMap.set(this, {\n dirty: true,\n onAttach: () => {\n this.onAttach();\n },\n onDetach: () => {\n this.onDetach();\n this.destroy();\n },\n nodeHandler: this._nodeHandler,\n registry: () => {\n return this.registry;\n },\n coreProperties: {},\n rendering: false,\n inputProperties: {}\n });\n this._runAfterConstructors();\n }\n meta(MetaType) {\n if (this._metaMap === undefined) {\n this._metaMap = new Map();\n }\n let cached = this._metaMap.get(MetaType);\n if (!cached) {\n cached = new MetaType({\n invalidate: this._boundInvalidate,\n nodeHandler: this._nodeHandler,\n bind: this\n });\n this.own(cached);\n this._metaMap.set(MetaType, cached);\n }\n return cached;\n }\n onAttach() {\n // Do nothing by default.\n }\n onDetach() {\n // Do nothing by default.\n }\n get properties() {\n return this._properties;\n }\n get changedPropertyKeys() {\n return [...this._changedPropertyKeys];\n }\n __setCoreProperties__(coreProperties) {\n const { baseRegistry } = coreProperties;\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.coreProperties.baseRegistry !== baseRegistry) {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n this._registry.base = baseRegistry;\n this.invalidate();\n }\n instanceData.coreProperties = coreProperties;\n }\n __setProperties__(originalProperties) {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.inputProperties = originalProperties;\n const properties = this._runBeforeProperties(originalProperties);\n const registeredDiffPropertyNames = this.getDecorator('registeredDiffProperty');\n const changedPropertyKeys = [];\n const propertyNames = Object.keys(properties);\n if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) {\n const allProperties = [...propertyNames, ...Object.keys(this._properties)];\n const checkedProperties = [];\n const diffPropertyResults = {};\n let runReactions = false;\n for (let i = 0; i < allProperties.length; i++) {\n const propertyName = allProperties[i];\n if (checkedProperties.indexOf(propertyName) !== -1) {\n continue;\n }\n checkedProperties.push(propertyName);\n const previousProperty = this._properties[propertyName];\n const newProperty = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n if (registeredDiffPropertyNames.indexOf(propertyName) !== -1) {\n runReactions = true;\n const diffFunctions = this.getDecorator(`diffProperty:${propertyName}`);\n for (let i = 0; i < diffFunctions.length; i++) {\n const result = diffFunctions[i](previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n else {\n const result = boundAuto(previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n if (runReactions) {\n this._mapDiffPropertyReactions(properties, changedPropertyKeys).forEach((args, reaction) => {\n if (args.changed) {\n reaction.call(this, args.previousProperties, args.newProperties);\n }\n });\n }\n this._properties = diffPropertyResults;\n this._changedPropertyKeys = changedPropertyKeys;\n }\n else {\n this._initialProperties = false;\n for (let i = 0; i < propertyNames.length; i++) {\n const propertyName = propertyNames[i];\n if (typeof properties[propertyName] === 'function') {\n properties[propertyName] = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n }\n else {\n changedPropertyKeys.push(propertyName);\n }\n }\n this._changedPropertyKeys = changedPropertyKeys;\n this._properties = Object.assign({}, properties);\n }\n if (this._changedPropertyKeys.length > 0) {\n this.invalidate();\n }\n }\n get children() {\n return this._children;\n }\n __setChildren__(children) {\n if (this._children.length > 0 || children.length > 0) {\n this._children = children;\n this.invalidate();\n }\n }\n __render__() {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.dirty = false;\n const render = this._runBeforeRenders();\n let dNode = render();\n dNode = this.runAfterRenders(dNode);\n this._nodeHandler.clear();\n return dNode;\n }\n invalidate() {\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.invalidate) {\n instanceData.invalidate();\n }\n }\n render() {\n return v('div', {}, this.children);\n }\n /**\n * Function to add decorators to WidgetBase\n *\n * @param decoratorKey The key of the decorator\n * @param value The value of the decorator\n */\n addDecorator(decoratorKey, value) {\n value = Array.isArray(value) ? value : [value];\n if (this.hasOwnProperty('constructor')) {\n let decoratorList = decoratorMap.get(this.constructor);\n if (!decoratorList) {\n decoratorList = new Map();\n decoratorMap.set(this.constructor, decoratorList);\n }\n let specificDecoratorList = decoratorList.get(decoratorKey);\n if (!specificDecoratorList) {\n specificDecoratorList = [];\n decoratorList.set(decoratorKey, specificDecoratorList);\n }\n specificDecoratorList.push(...value);\n }\n else {\n const decorators = this.getDecorator(decoratorKey);\n this._decoratorCache.set(decoratorKey, [...decorators, ...value]);\n }\n }\n /**\n * Function to build the list of decorators from the global decorator map.\n *\n * @param decoratorKey The key of the decorator\n * @return An array of decorator values\n * @private\n */\n _buildDecoratorList(decoratorKey) {\n const allDecorators = [];\n let constructor = this.constructor;\n while (constructor) {\n const instanceMap = decoratorMap.get(constructor);\n if (instanceMap) {\n const decorators = instanceMap.get(decoratorKey);\n if (decorators) {\n allDecorators.unshift(...decorators);\n }\n }\n constructor = Object.getPrototypeOf(constructor);\n }\n return allDecorators;\n }\n /**\n * Function to retrieve decorator values\n *\n * @param decoratorKey The key of the decorator\n * @returns An array of decorator values\n */\n getDecorator(decoratorKey) {\n let allDecorators = this._decoratorCache.get(decoratorKey);\n if (allDecorators !== undefined) {\n return allDecorators;\n }\n allDecorators = this._buildDecoratorList(decoratorKey);\n this._decoratorCache.set(decoratorKey, allDecorators);\n return allDecorators;\n }\n _mapDiffPropertyReactions(newProperties, changedPropertyKeys) {\n const reactionFunctions = this.getDecorator('diffReaction');\n return reactionFunctions.reduce((reactionPropertyMap, { reaction, propertyName }) => {\n let reactionArguments = reactionPropertyMap.get(reaction);\n if (reactionArguments === undefined) {\n reactionArguments = {\n previousProperties: {},\n newProperties: {},\n changed: false\n };\n }\n reactionArguments.previousProperties[propertyName] = this._properties[propertyName];\n reactionArguments.newProperties[propertyName] = newProperties[propertyName];\n if (changedPropertyKeys.indexOf(propertyName) !== -1) {\n reactionArguments.changed = true;\n }\n reactionPropertyMap.set(reaction, reactionArguments);\n return reactionPropertyMap;\n }, new Map());\n }\n /**\n * Binds unbound property functions to the specified `bind` property\n *\n * @param properties properties to check for functions\n */\n _bindFunctionProperty(property, bind) {\n if (typeof property === 'function' && !property[noBind] && isWidgetBaseConstructor(property) === false) {\n if (this._bindFunctionPropertyMap === undefined) {\n this._bindFunctionPropertyMap = new WeakMap();\n }\n const bindInfo = this._bindFunctionPropertyMap.get(property) || {};\n let { boundFunc, scope } = bindInfo;\n if (boundFunc === undefined || scope !== bind) {\n boundFunc = property.bind(bind);\n this._bindFunctionPropertyMap.set(property, { boundFunc, scope: bind });\n }\n return boundFunc;\n }\n return property;\n }\n get registry() {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n return this._registry;\n }\n _runBeforeProperties(properties) {\n const beforeProperties = this.getDecorator('beforeProperties');\n if (beforeProperties.length > 0) {\n return beforeProperties.reduce((properties, beforePropertiesFunction) => {\n return Object.assign({}, properties, beforePropertiesFunction.call(this, properties));\n }, Object.assign({}, properties));\n }\n return properties;\n }\n /**\n * Run all registered before renders and return the updated render method\n */\n _runBeforeRenders() {\n const beforeRenders = this.getDecorator('beforeRender');\n if (beforeRenders.length > 0) {\n return beforeRenders.reduce((render, beforeRenderFunction) => {\n const updatedRender = beforeRenderFunction.call(this, render, this._properties, this._children);\n if (!updatedRender) {\n console.warn('Render function not returned from beforeRender, using previous render');\n return render;\n }\n return updatedRender;\n }, this._boundRenderFunc);\n }\n return this._boundRenderFunc;\n }\n /**\n * Run all registered after renders and return the decorated DNodes\n *\n * @param dNode The DNodes to run through the after renders\n */\n runAfterRenders(dNode) {\n const afterRenders = this.getDecorator('afterRender');\n if (afterRenders.length > 0) {\n return afterRenders.reduce((dNode, afterRenderFunction) => {\n return afterRenderFunction.call(this, dNode);\n }, dNode);\n }\n if (this._metaMap !== undefined) {\n this._metaMap.forEach((meta) => {\n meta.afterRender();\n });\n }\n return dNode;\n }\n _runAfterConstructors() {\n const afterConstructors = this.getDecorator('afterConstructor');\n if (afterConstructors.length > 0) {\n afterConstructors.forEach((afterConstructor) => afterConstructor.call(this));\n }\n }\n own(handle) {\n this._handles.push(handle);\n }\n destroy() {\n while (this._handles.length > 0) {\n const handle = this._handles.pop();\n if (handle) {\n handle.destroy();\n }\n }\n }\n}\n/**\n * static identifier\n */\nWidgetBase._type = WIDGET_BASE_TYPE;\nexport default WidgetBase;\n//# sourceMappingURL=WidgetBase.mjs.map" + "source": "import Map from '../shim/Map';\nimport WeakMap from '../shim/WeakMap';\nimport Symbol from '../shim/Symbol';\nimport { v } from './d';\nimport { auto } from './diff';\nimport RegistryHandler from './RegistryHandler';\nimport NodeHandler from './NodeHandler';\nimport { widgetInstanceMap } from './vdom';\nimport { isWidgetBaseConstructor, WIDGET_BASE_TYPE } from './Registry';\nconst decoratorMap = new Map();\nconst boundAuto = auto.bind(null);\nexport const noBind = Symbol.for('dojoNoBind');\n/**\n * Main widget base for all widgets to extend\n */\nexport class WidgetBase {\n /**\n * @constructor\n */\n constructor() {\n /**\n * Indicates if it is the initial set properties cycle\n */\n this._initialProperties = true;\n /**\n * Array of property keys considered changed from the previous set properties\n */\n this._changedPropertyKeys = [];\n this._nodeHandler = new NodeHandler();\n this._handles = [];\n this._children = [];\n this._decoratorCache = new Map();\n this._properties = {};\n this._boundRenderFunc = this.render.bind(this);\n this._boundInvalidate = this.invalidate.bind(this);\n widgetInstanceMap.set(this, {\n dirty: true,\n onAttach: () => {\n this.onAttach();\n },\n onDetach: () => {\n this.onDetach();\n this.destroy();\n },\n nodeHandler: this._nodeHandler,\n registry: () => {\n return this.registry;\n },\n coreProperties: {},\n rendering: false,\n inputProperties: {}\n });\n this._runAfterConstructors();\n }\n meta(MetaType) {\n if (this._metaMap === undefined) {\n this._metaMap = new Map();\n }\n let cached = this._metaMap.get(MetaType);\n if (!cached) {\n cached = new MetaType({\n invalidate: this._boundInvalidate,\n nodeHandler: this._nodeHandler,\n bind: this\n });\n this.own(cached);\n this._metaMap.set(MetaType, cached);\n }\n return cached;\n }\n onAttach() {\n // Do nothing by default.\n }\n onDetach() {\n // Do nothing by default.\n }\n get properties() {\n return this._properties;\n }\n get changedPropertyKeys() {\n return [...this._changedPropertyKeys];\n }\n __setCoreProperties__(coreProperties) {\n const { baseRegistry } = coreProperties;\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.coreProperties.baseRegistry !== baseRegistry) {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n this._registry.base = baseRegistry;\n this.invalidate();\n }\n instanceData.coreProperties = coreProperties;\n }\n __setProperties__(originalProperties) {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.inputProperties = originalProperties;\n const properties = this._runBeforeProperties(originalProperties);\n const registeredDiffPropertyNames = this.getDecorator('registeredDiffProperty');\n const changedPropertyKeys = [];\n const propertyNames = Object.keys(properties);\n if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) {\n const allProperties = [...propertyNames, ...Object.keys(this._properties)];\n const checkedProperties = [];\n const diffPropertyResults = {};\n let runReactions = false;\n for (let i = 0; i < allProperties.length; i++) {\n const propertyName = allProperties[i];\n if (checkedProperties.indexOf(propertyName) !== -1) {\n continue;\n }\n checkedProperties.push(propertyName);\n const previousProperty = this._properties[propertyName];\n const newProperty = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n if (registeredDiffPropertyNames.indexOf(propertyName) !== -1) {\n runReactions = true;\n const diffFunctions = this.getDecorator(`diffProperty:${propertyName}`);\n for (let i = 0; i < diffFunctions.length; i++) {\n const result = diffFunctions[i](previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n else {\n const result = boundAuto(previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n if (runReactions) {\n const reactionFunctions = this.getDecorator('diffReaction');\n const executedReactions = [];\n reactionFunctions.forEach(({ reaction, propertyName }) => {\n const propertyChanged = changedPropertyKeys.indexOf(propertyName) !== -1;\n const reactionRun = executedReactions.indexOf(reaction) !== -1;\n if (propertyChanged && !reactionRun) {\n reaction.call(this, this._properties, diffPropertyResults);\n executedReactions.push(reaction);\n }\n });\n }\n this._properties = diffPropertyResults;\n this._changedPropertyKeys = changedPropertyKeys;\n }\n else {\n this._initialProperties = false;\n for (let i = 0; i < propertyNames.length; i++) {\n const propertyName = propertyNames[i];\n if (typeof properties[propertyName] === 'function') {\n properties[propertyName] = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n }\n else {\n changedPropertyKeys.push(propertyName);\n }\n }\n this._changedPropertyKeys = changedPropertyKeys;\n this._properties = Object.assign({}, properties);\n }\n if (this._changedPropertyKeys.length > 0) {\n this.invalidate();\n }\n }\n get children() {\n return this._children;\n }\n __setChildren__(children) {\n if (this._children.length > 0 || children.length > 0) {\n this._children = children;\n this.invalidate();\n }\n }\n __render__() {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.dirty = false;\n const render = this._runBeforeRenders();\n let dNode = render();\n dNode = this.runAfterRenders(dNode);\n this._nodeHandler.clear();\n return dNode;\n }\n invalidate() {\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.invalidate) {\n instanceData.invalidate();\n }\n }\n render() {\n return v('div', {}, this.children);\n }\n /**\n * Function to add decorators to WidgetBase\n *\n * @param decoratorKey The key of the decorator\n * @param value The value of the decorator\n */\n addDecorator(decoratorKey, value) {\n value = Array.isArray(value) ? value : [value];\n if (this.hasOwnProperty('constructor')) {\n let decoratorList = decoratorMap.get(this.constructor);\n if (!decoratorList) {\n decoratorList = new Map();\n decoratorMap.set(this.constructor, decoratorList);\n }\n let specificDecoratorList = decoratorList.get(decoratorKey);\n if (!specificDecoratorList) {\n specificDecoratorList = [];\n decoratorList.set(decoratorKey, specificDecoratorList);\n }\n specificDecoratorList.push(...value);\n }\n else {\n const decorators = this.getDecorator(decoratorKey);\n this._decoratorCache.set(decoratorKey, [...decorators, ...value]);\n }\n }\n /**\n * Function to build the list of decorators from the global decorator map.\n *\n * @param decoratorKey The key of the decorator\n * @return An array of decorator values\n * @private\n */\n _buildDecoratorList(decoratorKey) {\n const allDecorators = [];\n let constructor = this.constructor;\n while (constructor) {\n const instanceMap = decoratorMap.get(constructor);\n if (instanceMap) {\n const decorators = instanceMap.get(decoratorKey);\n if (decorators) {\n allDecorators.unshift(...decorators);\n }\n }\n constructor = Object.getPrototypeOf(constructor);\n }\n return allDecorators;\n }\n /**\n * Function to retrieve decorator values\n *\n * @param decoratorKey The key of the decorator\n * @returns An array of decorator values\n */\n getDecorator(decoratorKey) {\n let allDecorators = this._decoratorCache.get(decoratorKey);\n if (allDecorators !== undefined) {\n return allDecorators;\n }\n allDecorators = this._buildDecoratorList(decoratorKey);\n this._decoratorCache.set(decoratorKey, allDecorators);\n return allDecorators;\n }\n /**\n * Binds unbound property functions to the specified `bind` property\n *\n * @param properties properties to check for functions\n */\n _bindFunctionProperty(property, bind) {\n if (typeof property === 'function' && !property[noBind] && isWidgetBaseConstructor(property) === false) {\n if (this._bindFunctionPropertyMap === undefined) {\n this._bindFunctionPropertyMap = new WeakMap();\n }\n const bindInfo = this._bindFunctionPropertyMap.get(property) || {};\n let { boundFunc, scope } = bindInfo;\n if (boundFunc === undefined || scope !== bind) {\n boundFunc = property.bind(bind);\n this._bindFunctionPropertyMap.set(property, { boundFunc, scope: bind });\n }\n return boundFunc;\n }\n return property;\n }\n get registry() {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n return this._registry;\n }\n _runBeforeProperties(properties) {\n const beforeProperties = this.getDecorator('beforeProperties');\n if (beforeProperties.length > 0) {\n return beforeProperties.reduce((properties, beforePropertiesFunction) => {\n return Object.assign({}, properties, beforePropertiesFunction.call(this, properties));\n }, Object.assign({}, properties));\n }\n return properties;\n }\n /**\n * Run all registered before renders and return the updated render method\n */\n _runBeforeRenders() {\n const beforeRenders = this.getDecorator('beforeRender');\n if (beforeRenders.length > 0) {\n return beforeRenders.reduce((render, beforeRenderFunction) => {\n const updatedRender = beforeRenderFunction.call(this, render, this._properties, this._children);\n if (!updatedRender) {\n console.warn('Render function not returned from beforeRender, using previous render');\n return render;\n }\n return updatedRender;\n }, this._boundRenderFunc);\n }\n return this._boundRenderFunc;\n }\n /**\n * Run all registered after renders and return the decorated DNodes\n *\n * @param dNode The DNodes to run through the after renders\n */\n runAfterRenders(dNode) {\n const afterRenders = this.getDecorator('afterRender');\n if (afterRenders.length > 0) {\n dNode = afterRenders.reduce((dNode, afterRenderFunction) => {\n return afterRenderFunction.call(this, dNode);\n }, dNode);\n }\n if (this._metaMap !== undefined) {\n this._metaMap.forEach((meta) => {\n meta.afterRender();\n });\n }\n return dNode;\n }\n _runAfterConstructors() {\n const afterConstructors = this.getDecorator('afterConstructor');\n if (afterConstructors.length > 0) {\n afterConstructors.forEach((afterConstructor) => afterConstructor.call(this));\n }\n }\n own(handle) {\n this._handles.push(handle);\n }\n destroy() {\n while (this._handles.length > 0) {\n const handle = this._handles.pop();\n if (handle) {\n handle.destroy();\n }\n }\n }\n}\n/**\n * static identifier\n */\nWidgetBase._type = WIDGET_BASE_TYPE;\nexport default WidgetBase;\n//# sourceMappingURL=WidgetBase.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/animations/cssTransitions.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\animations\\cssTransitions.mjs", - "name": "./node_modules/@dojo/widget-core/animations/cssTransitions.mjs", + "id": "./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\animations\\cssTransitions.mjs", + "name": "./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs", "index": 33, "index2": 27, "size": 2288, @@ -1555,18 +1555,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "../animations/cssTransitions", "loc": "3:0-58" @@ -1583,12 +1583,12 @@ "source": "let browserSpecificTransitionEndEventName = '';\nlet browserSpecificAnimationEndEventName = '';\nfunction determineBrowserStyleNames(element) {\n if ('WebkitTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'webkitTransitionEnd';\n browserSpecificAnimationEndEventName = 'webkitAnimationEnd';\n }\n else if ('transition' in element.style || 'MozTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'transitionend';\n browserSpecificAnimationEndEventName = 'animationend';\n }\n else {\n throw new Error('Your browser is not supported');\n }\n}\nfunction initialize(element) {\n if (browserSpecificAnimationEndEventName === '') {\n determineBrowserStyleNames(element);\n }\n}\nfunction runAndCleanUp(element, startAnimation, finishAnimation) {\n initialize(element);\n let finished = false;\n let transitionEnd = function () {\n if (!finished) {\n finished = true;\n element.removeEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n element.removeEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n finishAnimation();\n }\n };\n startAnimation();\n element.addEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n element.addEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n}\nfunction exit(node, properties, exitAnimation, removeNode) {\n const activeClass = properties.exitAnimationActive || `${exitAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(exitAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n removeNode();\n });\n}\nfunction enter(node, properties, enterAnimation) {\n const activeClass = properties.enterAnimationActive || `${enterAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(enterAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n node.classList.remove(enterAnimation);\n node.classList.remove(activeClass);\n });\n}\nexport default {\n enter,\n exit\n};\n//# sourceMappingURL=cssTransitions.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/d.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\d.mjs", - "name": "./node_modules/@dojo/widget-core/d.mjs", + "id": "./node_modules/@dojo/framework/widget-core/d.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\d.mjs", + "name": "./node_modules/@dojo/framework/widget-core/d.mjs", "index": 4, "index2": 8, - "size": 3270, + "size": 3267, "cacheable": true, "built": true, "optional": false, @@ -1597,54 +1597,54 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./d", "loc": "5:0-29" }, { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./d", "loc": "4:0-24" }, + { + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "type": "harmony import", + "userRequest": "./../d", + "loc": "5:0-27" + }, { "moduleId": "./src/menu-item/MenuItem.ts", "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--3-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\umd-compat-loader\\index.js??ref--3-1!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\ts-loader\\index.js??ref--3-2!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\css-module-dts-loader\\index.js?type=ts&instanceName=0_menu-item!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\src\\menu-item\\MenuItem.ts", "module": "./src/menu-item/MenuItem.ts", "moduleName": "./src/menu-item/MenuItem.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/d", - "loc": "2:0-40" - }, - { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "type": "harmony import", - "userRequest": "./../d", - "loc": "5:0-27" + "userRequest": "@dojo/framework/widget-core/d", + "loc": "2:0-50" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", "userRequest": "./d", "loc": "3:0-65" @@ -1675,12 +1675,12 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import Symbol from '@dojo/shim/Symbol';\n/**\n * The symbol identifier for a WNode type\n */\nexport const WNODE = Symbol('Identifier for a WNode.');\n/**\n * The symbol identifier for a VNode type\n */\nexport const VNODE = Symbol('Identifier for a VNode.');\n/**\n * The symbol identifier for a VNode type created using dom()\n */\nexport const DOMVNODE = Symbol('Identifier for a VNode created using existing dom.');\n/**\n * Helper function that returns true if the `DNode` is a `WNode` using the `type` property\n */\nexport function isWNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === WNODE);\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` using the `type` property\n */\nexport function isVNode(child) {\n return Boolean(child && typeof child !== 'string' && (child.type === VNODE || child.type === DOMVNODE));\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` created with `dom()` using the `type` property\n */\nexport function isDomVNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === DOMVNODE);\n}\nexport function isElementNode(value) {\n return !!value.tagName;\n}\nexport function decorate(dNodes, optionsOrModifier, predicate) {\n let shallow = false;\n let modifier;\n if (typeof optionsOrModifier === 'function') {\n modifier = optionsOrModifier;\n }\n else {\n modifier = optionsOrModifier.modifier;\n predicate = optionsOrModifier.predicate;\n shallow = optionsOrModifier.shallow || false;\n }\n let nodes = Array.isArray(dNodes) ? [...dNodes] : [dNodes];\n function breaker() {\n nodes = [];\n }\n while (nodes.length) {\n const node = nodes.shift();\n if (node) {\n if (!shallow && (isWNode(node) || isVNode(node)) && node.children) {\n nodes = [...nodes, ...node.children];\n }\n if (!predicate || predicate(node)) {\n modifier(node, breaker);\n }\n }\n }\n return dNodes;\n}\n/**\n * Wrapper function for calls to create a widget.\n */\nexport function w(widgetConstructor, properties, children = []) {\n return {\n children,\n widgetConstructor,\n properties,\n type: WNODE\n };\n}\nexport function v(tag, propertiesOrChildren = {}, children = undefined) {\n let properties = propertiesOrChildren;\n let deferredPropertiesCallback;\n if (Array.isArray(propertiesOrChildren)) {\n children = propertiesOrChildren;\n properties = {};\n }\n if (typeof properties === 'function') {\n deferredPropertiesCallback = properties;\n properties = {};\n }\n return {\n tag,\n deferredPropertiesCallback,\n children,\n properties,\n type: VNODE\n };\n}\n/**\n * Create a VNode for an existing DOM Node.\n */\nexport function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, children) {\n return {\n tag: isElementNode(node) ? node.tagName.toLowerCase() : '',\n properties: props,\n attributes: attrs,\n events: on,\n children,\n type: DOMVNODE,\n domNode: node,\n text: isElementNode(node) ? undefined : node.data,\n diffType\n };\n}\n//# sourceMappingURL=d.mjs.map" + "source": "import Symbol from '../shim/Symbol';\n/**\n * The symbol identifier for a WNode type\n */\nexport const WNODE = Symbol('Identifier for a WNode.');\n/**\n * The symbol identifier for a VNode type\n */\nexport const VNODE = Symbol('Identifier for a VNode.');\n/**\n * The symbol identifier for a VNode type created using dom()\n */\nexport const DOMVNODE = Symbol('Identifier for a VNode created using existing dom.');\n/**\n * Helper function that returns true if the `DNode` is a `WNode` using the `type` property\n */\nexport function isWNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === WNODE);\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` using the `type` property\n */\nexport function isVNode(child) {\n return Boolean(child && typeof child !== 'string' && (child.type === VNODE || child.type === DOMVNODE));\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` created with `dom()` using the `type` property\n */\nexport function isDomVNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === DOMVNODE);\n}\nexport function isElementNode(value) {\n return !!value.tagName;\n}\nexport function decorate(dNodes, optionsOrModifier, predicate) {\n let shallow = false;\n let modifier;\n if (typeof optionsOrModifier === 'function') {\n modifier = optionsOrModifier;\n }\n else {\n modifier = optionsOrModifier.modifier;\n predicate = optionsOrModifier.predicate;\n shallow = optionsOrModifier.shallow || false;\n }\n let nodes = Array.isArray(dNodes) ? [...dNodes] : [dNodes];\n function breaker() {\n nodes = [];\n }\n while (nodes.length) {\n const node = nodes.shift();\n if (node) {\n if (!shallow && (isWNode(node) || isVNode(node)) && node.children) {\n nodes = [...nodes, ...node.children];\n }\n if (!predicate || predicate(node)) {\n modifier(node, breaker);\n }\n }\n }\n return dNodes;\n}\n/**\n * Wrapper function for calls to create a widget.\n */\nexport function w(widgetConstructor, properties, children = []) {\n return {\n children,\n widgetConstructor,\n properties,\n type: WNODE\n };\n}\nexport function v(tag, propertiesOrChildren = {}, children = undefined) {\n let properties = propertiesOrChildren;\n let deferredPropertiesCallback;\n if (Array.isArray(propertiesOrChildren)) {\n children = propertiesOrChildren;\n properties = {};\n }\n if (typeof properties === 'function') {\n deferredPropertiesCallback = properties;\n properties = {};\n }\n return {\n tag,\n deferredPropertiesCallback,\n children,\n properties,\n type: VNODE\n };\n}\n/**\n * Create a VNode for an existing DOM Node.\n */\nexport function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, children) {\n return {\n tag: isElementNode(node) ? node.tagName.toLowerCase() : '',\n properties: props,\n attributes: attrs,\n events: on,\n children,\n type: DOMVNODE,\n domNode: node,\n text: isElementNode(node) ? undefined : node.data,\n diffType\n };\n}\n//# sourceMappingURL=d.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\afterRender.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\afterRender.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", "index": 34, "index2": 29, "size": 311, @@ -1692,18 +1692,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "./../decorators/afterRender", "loc": "4:0-58" @@ -1721,9 +1721,9 @@ "source": "import { handleDecorator } from './handleDecorator';\nexport function afterRender(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('afterRender', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default afterRender;\n//# sourceMappingURL=afterRender.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\alwaysRender.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\alwaysRender.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "index": 41, "index2": 36, "size": 365, @@ -1735,18 +1735,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./decorators/alwaysRender", "loc": "8:0-57" @@ -1764,9 +1764,9 @@ "source": "import { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\nexport function alwaysRender() {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function () {\n this.invalidate();\n })(target);\n });\n}\nexport default alwaysRender;\n//# sourceMappingURL=alwaysRender.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\beforeProperties.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\beforeProperties.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", "index": 39, "index2": 32, "size": 331, @@ -1778,27 +1778,27 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\alwaysRender.mjs", - "issuerId": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "issuerName": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\alwaysRender.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\alwaysRender.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\alwaysRender.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "type": "harmony import", "userRequest": "./beforeProperties", "loc": "2:0-54" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\inject.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\inject.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "type": "harmony import", "userRequest": "./beforeProperties", "loc": "3:0-54" @@ -1816,9 +1816,9 @@ "source": "import { handleDecorator } from './handleDecorator';\nexport function beforeProperties(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('beforeProperties', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default beforeProperties;\n//# sourceMappingURL=beforeProperties.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\customElement.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\customElement.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", "index": 12, "index2": 38, "size": 728, @@ -1843,8 +1843,8 @@ "module": "./src/menu-item/MenuItem.ts", "moduleName": "./src/menu-item/MenuItem.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/decorators/customElement", - "loc": "3:0-75" + "userRequest": "@dojo/framework/widget-core/decorators/customElement", + "loc": "3:0-85" } ], "usedExports": [ @@ -1886,12 +1886,12 @@ "depth": 0 }, { - "id": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\diffProperty.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\diffProperty.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", "index": 40, "index2": 34, - "size": 973, + "size": 1014, "cacheable": true, "built": true, "optional": false, @@ -1900,18 +1900,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../decorators/diffProperty", "loc": "5:0-60" @@ -1926,12 +1926,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { handleDecorator } from './handleDecorator';\n/**\n * Decorator that can be used to register a function as a specific property diff\n *\n * @param propertyName The name of the property of which the diff function is applied\n * @param diffType The diff type, default is DiffType.AUTO.\n * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM\n */\nexport function diffProperty(propertyName, diffFunction, reactionFunction) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null));\n target.addDecorator('registeredDiffProperty', propertyName);\n if (reactionFunction || propertyKey) {\n target.addDecorator('diffReaction', {\n propertyName,\n reaction: propertyKey ? target[propertyKey] : reactionFunction\n });\n }\n });\n}\nexport default diffProperty;\n//# sourceMappingURL=diffProperty.mjs.map" + "source": "import { handleDecorator } from './handleDecorator';\nimport { auto } from './../diff';\n/**\n * Decorator that can be used to register a function as a specific property diff\n *\n * @param propertyName The name of the property of which the diff function is applied\n * @param diffType The diff type, default is DiffType.AUTO.\n * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM\n */\nexport function diffProperty(propertyName, diffFunction = auto, reactionFunction) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null));\n target.addDecorator('registeredDiffProperty', propertyName);\n if (reactionFunction || propertyKey) {\n target.addDecorator('diffReaction', {\n propertyName,\n reaction: propertyKey ? target[propertyKey] : reactionFunction\n });\n }\n });\n}\nexport default diffProperty;\n//# sourceMappingURL=diffProperty.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\handleDecorator.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\handleDecorator.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs", "index": 35, "index2": 28, "size": 512, @@ -1943,63 +1943,63 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../decorators/handleDecorator", "loc": "4:0-66" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\alwaysRender.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\alwaysRender.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\afterRender.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\afterRender.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\inject.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\inject.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "2:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\diffProperty.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\diffProperty.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\beforeProperties.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\beforeProperties.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" @@ -2017,9 +2017,9 @@ "source": "/**\n * Generic decorator handler to take care of whether or not the decorator was called at the class level\n * or the method level.\n *\n * @param handler\n */\nexport function handleDecorator(handler) {\n return function (target, propertyKey, descriptor) {\n if (typeof target === 'function') {\n handler(target.prototype, undefined);\n }\n else {\n handler(target, propertyKey);\n }\n };\n}\nexport default handleDecorator;\n//# sourceMappingURL=handleDecorator.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\inject.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\inject.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "index": 38, "index2": 33, "size": 1532, @@ -2031,18 +2031,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../decorators/inject", "loc": "3:0-48" @@ -2057,12 +2057,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import WeakMap from '@dojo/shim/WeakMap';\nimport { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\n/**\n * Map of instances against registered injectors.\n */\nconst registeredInjectorsMap = new WeakMap();\n/**\n * Decorator retrieves an injector from an available registry using the name and\n * calls the `getProperties` function with the payload from the injector\n * and current properties with the the injected properties returned.\n *\n * @param InjectConfig the inject configuration\n */\nexport function inject({ name, getProperties }) {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function (properties) {\n const injectorItem = this.registry.getInjector(name);\n if (injectorItem) {\n const { injector, invalidator } = injectorItem;\n const registeredInjectors = registeredInjectorsMap.get(this) || [];\n if (registeredInjectors.length === 0) {\n registeredInjectorsMap.set(this, registeredInjectors);\n }\n if (registeredInjectors.indexOf(injectorItem) === -1) {\n this.own(invalidator.on('invalidate', () => {\n this.invalidate();\n }));\n registeredInjectors.push(injectorItem);\n }\n return getProperties(injector(), properties);\n }\n })(target);\n });\n}\nexport default inject;\n//# sourceMappingURL=inject.mjs.map" + "source": "import WeakMap from '../../shim/WeakMap';\nimport { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\n/**\n * Map of instances against registered injectors.\n */\nconst registeredInjectorsMap = new WeakMap();\n/**\n * Decorator retrieves an injector from an available registry using the name and\n * calls the `getProperties` function with the payload from the injector\n * and current properties with the the injected properties returned.\n *\n * @param InjectConfig the inject configuration\n */\nexport function inject({ name, getProperties }) {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function (properties) {\n const injectorItem = this.registry.getInjector(name);\n if (injectorItem) {\n const { injector, invalidator } = injectorItem;\n const registeredInjectors = registeredInjectorsMap.get(this) || [];\n if (registeredInjectors.length === 0) {\n registeredInjectorsMap.set(this, registeredInjectors);\n }\n if (registeredInjectors.indexOf(injectorItem) === -1) {\n this.own(invalidator.on('invalidate', () => {\n this.invalidate();\n }));\n registeredInjectors.push(injectorItem);\n }\n return getProperties(injector(), properties);\n }\n })(target);\n });\n}\nexport default inject;\n//# sourceMappingURL=inject.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/diff.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\diff.mjs", - "name": "./node_modules/@dojo/widget-core/diff.mjs", + "id": "./node_modules/@dojo/framework/widget-core/diff.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\diff.mjs", + "name": "./node_modules/@dojo/framework/widget-core/diff.mjs", "index": 20, "index2": 20, "size": 1930, @@ -2074,30 +2074,39 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./diff", "loc": "5:0-30" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../diff", "loc": "6:0-36" + }, + { + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\diffProperty.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "type": "harmony import", + "userRequest": "./../diff", + "loc": "2:0-33" } ], "usedExports": [ @@ -2116,12 +2125,12 @@ "source": "import { WIDGET_BASE_TYPE } from './Registry';\nfunction isObjectOrArray(value) {\n return Object.prototype.toString.call(value) === '[object Object]' || Array.isArray(value);\n}\nexport function always(previousProperty, newProperty) {\n return {\n changed: true,\n value: newProperty\n };\n}\nexport function ignore(previousProperty, newProperty) {\n return {\n changed: false,\n value: newProperty\n };\n}\nexport function reference(previousProperty, newProperty) {\n return {\n changed: previousProperty !== newProperty,\n value: newProperty\n };\n}\nexport function shallow(previousProperty, newProperty) {\n let changed = false;\n const validOldProperty = previousProperty && isObjectOrArray(previousProperty);\n const validNewProperty = newProperty && isObjectOrArray(newProperty);\n if (!validOldProperty || !validNewProperty) {\n return {\n changed: true,\n value: newProperty\n };\n }\n const previousKeys = Object.keys(previousProperty);\n const newKeys = Object.keys(newProperty);\n if (previousKeys.length !== newKeys.length) {\n changed = true;\n }\n else {\n changed = newKeys.some((key) => {\n return newProperty[key] !== previousProperty[key];\n });\n }\n return {\n changed,\n value: newProperty\n };\n}\nexport function auto(previousProperty, newProperty) {\n let result;\n if (typeof newProperty === 'function') {\n if (newProperty._type === WIDGET_BASE_TYPE) {\n result = reference(previousProperty, newProperty);\n }\n else {\n result = ignore(previousProperty, newProperty);\n }\n }\n else if (isObjectOrArray(newProperty)) {\n result = shallow(previousProperty, newProperty);\n }\n else {\n result = reference(previousProperty, newProperty);\n }\n return result;\n}\n//# sourceMappingURL=diff.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "name": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "id": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "name": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "index": 32, "index2": 30, - "size": 5852, + "size": 5683, "cacheable": true, "built": true, "optional": false, @@ -2130,18 +2139,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./mixins/Projector", "loc": "3:0-52" @@ -2158,15 +2167,15 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import * as tslib_1 from \"tslib\";\nimport { assign } from '@dojo/core/lang';\nimport cssTransitions from '../animations/cssTransitions';\nimport { afterRender } from './../decorators/afterRender';\nimport { v } from './../d';\nimport { dom } from './../vdom';\n/**\n * Represents the attach state of the projector\n */\nexport var ProjectorAttachState;\n(function (ProjectorAttachState) {\n ProjectorAttachState[ProjectorAttachState[\"Attached\"] = 1] = \"Attached\";\n ProjectorAttachState[ProjectorAttachState[\"Detached\"] = 2] = \"Detached\";\n})(ProjectorAttachState || (ProjectorAttachState = {}));\n/**\n * Attach type for the projector\n */\nexport var AttachType;\n(function (AttachType) {\n AttachType[AttachType[\"Append\"] = 1] = \"Append\";\n AttachType[AttachType[\"Merge\"] = 2] = \"Merge\";\n})(AttachType || (AttachType = {}));\nexport function ProjectorMixin(Base) {\n class Projector extends Base {\n constructor(...args) {\n super(...args);\n this._root = document.body;\n this._async = true;\n this._projectorProperties = {};\n this._projectionOptions = {\n transitions: cssTransitions\n };\n this.root = document.body;\n this.projectorState = ProjectorAttachState.Detached;\n }\n append(root) {\n const options = {\n type: AttachType.Append,\n root\n };\n return this._attach(options);\n }\n merge(root) {\n const options = {\n type: AttachType.Merge,\n root\n };\n return this._attach(options);\n }\n set root(root) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change root element');\n }\n this._root = root;\n }\n get root() {\n return this._root;\n }\n get async() {\n return this._async;\n }\n set async(async) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change async mode');\n }\n this._async = async;\n }\n sandbox(doc = document) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot create sandbox');\n }\n this._async = false;\n const previousRoot = this.root;\n /* free up the document fragment for GC */\n this.own({\n destroy: () => {\n this._root = previousRoot;\n }\n });\n this._attach({\n /* DocumentFragment is not assignable to Element, but provides everything needed to work */\n root: doc.createDocumentFragment(),\n type: AttachType.Append\n });\n }\n setChildren(children) {\n this.__setChildren__(children);\n }\n setProperties(properties) {\n this.__setProperties__(properties);\n }\n __setProperties__(properties) {\n if (this._projectorProperties && this._projectorProperties.registry !== properties.registry) {\n if (this._projectorProperties.registry) {\n this._projectorProperties.registry.destroy();\n }\n }\n this._projectorProperties = assign({}, properties);\n super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry });\n super.__setProperties__(properties);\n }\n toHtml() {\n if (this.projectorState !== ProjectorAttachState.Attached || !this._projection) {\n throw new Error('Projector is not attached, cannot return an HTML string of projection.');\n }\n return this._projection.domNode.childNodes[0].outerHTML;\n }\n afterRender(result) {\n let node = result;\n if (typeof result === 'string' || result === null || result === undefined) {\n node = v('span', {}, [result]);\n }\n return node;\n }\n destroy() {\n super.destroy();\n }\n _attach({ type, root }) {\n if (root) {\n this.root = root;\n }\n if (this._attachHandle) {\n return this._attachHandle;\n }\n this.projectorState = ProjectorAttachState.Attached;\n const handle = {\n destroy: () => {\n if (this.projectorState === ProjectorAttachState.Attached) {\n this._projection = undefined;\n this.projectorState = ProjectorAttachState.Detached;\n }\n }\n };\n this.own(handle);\n this._attachHandle = handle;\n this._projectionOptions = Object.assign({}, this._projectionOptions, { sync: !this._async });\n switch (type) {\n case AttachType.Append:\n this._projection = dom.append(this.root, this, this._projectionOptions);\n break;\n case AttachType.Merge:\n this._projection = dom.merge(this.root, this, this._projectionOptions);\n break;\n }\n return this._attachHandle;\n }\n }\n tslib_1.__decorate([\n afterRender(),\n tslib_1.__metadata(\"design:type\", Function),\n tslib_1.__metadata(\"design:paramtypes\", [Object]),\n tslib_1.__metadata(\"design:returntype\", void 0)\n ], Projector.prototype, \"afterRender\", null);\n return Projector;\n}\nexport default ProjectorMixin;\n//# sourceMappingURL=Projector.mjs.map" + "source": "import * as tslib_1 from \"tslib\";\nimport { assign } from '../../core/lang';\nimport cssTransitions from '../animations/cssTransitions';\nimport { afterRender } from './../decorators/afterRender';\nimport { v } from './../d';\nimport { dom } from './../vdom';\n/**\n * Represents the attach state of the projector\n */\nexport var ProjectorAttachState;\n(function (ProjectorAttachState) {\n ProjectorAttachState[ProjectorAttachState[\"Attached\"] = 1] = \"Attached\";\n ProjectorAttachState[ProjectorAttachState[\"Detached\"] = 2] = \"Detached\";\n})(ProjectorAttachState || (ProjectorAttachState = {}));\n/**\n * Attach type for the projector\n */\nexport var AttachType;\n(function (AttachType) {\n AttachType[AttachType[\"Append\"] = 1] = \"Append\";\n AttachType[AttachType[\"Merge\"] = 2] = \"Merge\";\n})(AttachType || (AttachType = {}));\nexport function ProjectorMixin(Base) {\n class Projector extends Base {\n constructor(...args) {\n super(...args);\n this._root = document.body;\n this._async = true;\n this._projectorProperties = {};\n this._projectionOptions = {\n transitions: cssTransitions\n };\n this.root = document.body;\n this.projectorState = ProjectorAttachState.Detached;\n }\n append(root) {\n const options = {\n type: AttachType.Append,\n root\n };\n return this._attach(options);\n }\n merge(root) {\n const options = {\n type: AttachType.Merge,\n root\n };\n return this._attach(options);\n }\n set root(root) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change root element');\n }\n this._root = root;\n }\n get root() {\n return this._root;\n }\n get async() {\n return this._async;\n }\n set async(async) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change async mode');\n }\n this._async = async;\n }\n sandbox(doc = document) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot create sandbox');\n }\n this._async = false;\n const previousRoot = this.root;\n /* free up the document fragment for GC */\n this.own({\n destroy: () => {\n this._root = previousRoot;\n }\n });\n this._attach({\n /* DocumentFragment is not assignable to Element, but provides everything needed to work */\n root: doc.createDocumentFragment(),\n type: AttachType.Append\n });\n }\n setChildren(children) {\n this.__setChildren__(children);\n }\n setProperties(properties) {\n this.__setProperties__(properties);\n }\n __setProperties__(properties) {\n if (this._projectorProperties && this._projectorProperties.registry !== properties.registry) {\n if (this._projectorProperties.registry) {\n this._projectorProperties.registry.destroy();\n }\n }\n this._projectorProperties = assign({}, properties);\n super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry });\n super.__setProperties__(properties);\n }\n toHtml() {\n if (this.projectorState !== ProjectorAttachState.Attached || !this._projection) {\n throw new Error('Projector is not attached, cannot return an HTML string of projection.');\n }\n return this._projection.domNode.childNodes[0].outerHTML;\n }\n afterRender(result) {\n let node = result;\n if (typeof result === 'string' || result === null || result === undefined) {\n node = v('span', {}, [result]);\n }\n return node;\n }\n destroy() {\n super.destroy();\n }\n _attach({ type, root }) {\n if (root) {\n this.root = root;\n }\n if (this._attachHandle) {\n return this._attachHandle;\n }\n this.projectorState = ProjectorAttachState.Attached;\n const handle = {\n destroy: () => {\n if (this.projectorState === ProjectorAttachState.Attached) {\n this._projection = undefined;\n this.projectorState = ProjectorAttachState.Detached;\n }\n }\n };\n this.own(handle);\n this._attachHandle = handle;\n this._projectionOptions = Object.assign({}, this._projectionOptions, { sync: !this._async });\n switch (type) {\n case AttachType.Append:\n this._projection = dom.append(this.root, this, this._projectionOptions);\n break;\n case AttachType.Merge:\n this._projection = dom.merge(this.root, this, this._projectionOptions);\n break;\n }\n return this._attachHandle;\n }\n }\n tslib_1.__decorate([\n afterRender()\n ], Projector.prototype, \"afterRender\", null);\n return Projector;\n}\nexport default ProjectorMixin;\n//# sourceMappingURL=Projector.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "name": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "id": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "name": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "index": 36, "index2": 35, - "size": 5320, + "size": 5157, "cacheable": true, "built": true, "optional": false, @@ -2175,18 +2184,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./mixins/Themed", "loc": "7:0-56" @@ -2197,8 +2206,8 @@ "module": "./src/menu-item/MenuItem.ts", "moduleName": "./src/menu-item/MenuItem.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/mixins/Themed", - "loc": "4:0-69" + "userRequest": "@dojo/framework/widget-core/mixins/Themed", + "loc": "4:0-79" } ], "usedExports": [ @@ -2215,15 +2224,15 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import * as tslib_1 from \"tslib\";\nimport { Injector } from './../Injector';\nimport { inject } from './../decorators/inject';\nimport { handleDecorator } from './../decorators/handleDecorator';\nimport { diffProperty } from './../decorators/diffProperty';\nimport { shallow } from './../diff';\nconst THEME_KEY = ' _key';\nexport const INJECTED_THEME_KEY = Symbol('theme');\n/**\n * Decorator for base css classes\n */\nexport function theme(theme) {\n return handleDecorator((target) => {\n target.addDecorator('baseThemeClasses', theme);\n });\n}\n/**\n * Creates a reverse lookup for the classes passed in via the `theme` function.\n *\n * @param classes The baseClasses object\n * @requires\n */\nfunction createThemeClassesLookup(classes) {\n return classes.reduce((currentClassNames, baseClass) => {\n Object.keys(baseClass).forEach((key) => {\n currentClassNames[baseClass[key]] = key;\n });\n return currentClassNames;\n }, {});\n}\n/**\n * Convenience function that is given a theme and an optional registry, the theme\n * injector is defined against the registry, returning the theme.\n *\n * @param theme the theme to set\n * @param themeRegistry registry to define the theme injector against. Defaults\n * to the global registry\n *\n * @returns the theme injector used to set the theme\n */\nexport function registerThemeInjector(theme, themeRegistry) {\n const themeInjector = new Injector(theme);\n themeRegistry.defineInjector(INJECTED_THEME_KEY, (invalidator) => {\n themeInjector.setInvalidator(invalidator);\n return () => themeInjector.get();\n });\n return themeInjector;\n}\n/**\n * Function that returns a class decorated with with Themed functionality\n */\nexport function ThemedMixin(Base) {\n let Themed = class Themed extends Base {\n constructor() {\n super(...arguments);\n /**\n * Registered base theme keys\n */\n this._registeredBaseThemeKeys = [];\n /**\n * Indicates if classes meta data need to be calculated.\n */\n this._recalculateClasses = true;\n /**\n * Loaded theme\n */\n this._theme = {};\n }\n theme(classes) {\n if (this._recalculateClasses) {\n this._recalculateThemeClasses();\n }\n if (Array.isArray(classes)) {\n return classes.map((className) => this._getThemeClass(className));\n }\n return this._getThemeClass(classes);\n }\n /**\n * Function fired when `theme` or `extraClasses` are changed.\n */\n onPropertiesChanged() {\n this._recalculateClasses = true;\n }\n _getThemeClass(className) {\n if (className === undefined || className === null) {\n return className;\n }\n const extraClasses = this.properties.extraClasses || {};\n const themeClassName = this._baseThemeClassesReverseLookup[className];\n let resultClassNames = [];\n if (!themeClassName) {\n console.warn(`Class name: '${className}' not found in theme`);\n return null;\n }\n if (extraClasses[themeClassName]) {\n resultClassNames.push(extraClasses[themeClassName]);\n }\n if (this._theme[themeClassName]) {\n resultClassNames.push(this._theme[themeClassName]);\n }\n else {\n resultClassNames.push(this._registeredBaseTheme[themeClassName]);\n }\n return resultClassNames.join(' ');\n }\n _recalculateThemeClasses() {\n const { theme = {} } = this.properties;\n const baseThemes = this.getDecorator('baseThemeClasses');\n if (!this._registeredBaseTheme) {\n this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => {\n const _a = THEME_KEY, key = baseTheme[_a], classes = tslib_1.__rest(baseTheme, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n this._registeredBaseThemeKeys.push(key);\n return Object.assign({}, finalBaseTheme, classes);\n }, {});\n this._baseThemeClassesReverseLookup = createThemeClassesLookup(baseThemes);\n }\n this._theme = this._registeredBaseThemeKeys.reduce((baseTheme, themeKey) => {\n return Object.assign({}, baseTheme, theme[themeKey]);\n }, {});\n this._recalculateClasses = false;\n }\n };\n tslib_1.__decorate([\n diffProperty('theme', shallow),\n diffProperty('extraClasses', shallow),\n tslib_1.__metadata(\"design:type\", Function),\n tslib_1.__metadata(\"design:paramtypes\", []),\n tslib_1.__metadata(\"design:returntype\", void 0)\n ], Themed.prototype, \"onPropertiesChanged\", null);\n Themed = tslib_1.__decorate([\n inject({\n name: INJECTED_THEME_KEY,\n getProperties: (theme, properties) => {\n if (!properties.theme) {\n return { theme };\n }\n return {};\n }\n })\n ], Themed);\n return Themed;\n}\nexport default ThemedMixin;\n//# sourceMappingURL=Themed.mjs.map" + "source": "import * as tslib_1 from \"tslib\";\nimport { Injector } from './../Injector';\nimport { inject } from './../decorators/inject';\nimport { handleDecorator } from './../decorators/handleDecorator';\nimport { diffProperty } from './../decorators/diffProperty';\nimport { shallow } from './../diff';\nconst THEME_KEY = ' _key';\nexport const INJECTED_THEME_KEY = Symbol('theme');\n/**\n * Decorator for base css classes\n */\nexport function theme(theme) {\n return handleDecorator((target) => {\n target.addDecorator('baseThemeClasses', theme);\n });\n}\n/**\n * Creates a reverse lookup for the classes passed in via the `theme` function.\n *\n * @param classes The baseClasses object\n * @requires\n */\nfunction createThemeClassesLookup(classes) {\n return classes.reduce((currentClassNames, baseClass) => {\n Object.keys(baseClass).forEach((key) => {\n currentClassNames[baseClass[key]] = key;\n });\n return currentClassNames;\n }, {});\n}\n/**\n * Convenience function that is given a theme and an optional registry, the theme\n * injector is defined against the registry, returning the theme.\n *\n * @param theme the theme to set\n * @param themeRegistry registry to define the theme injector against. Defaults\n * to the global registry\n *\n * @returns the theme injector used to set the theme\n */\nexport function registerThemeInjector(theme, themeRegistry) {\n const themeInjector = new Injector(theme);\n themeRegistry.defineInjector(INJECTED_THEME_KEY, (invalidator) => {\n themeInjector.setInvalidator(invalidator);\n return () => themeInjector.get();\n });\n return themeInjector;\n}\n/**\n * Function that returns a class decorated with with Themed functionality\n */\nexport function ThemedMixin(Base) {\n let Themed = class Themed extends Base {\n constructor() {\n super(...arguments);\n /**\n * Registered base theme keys\n */\n this._registeredBaseThemeKeys = [];\n /**\n * Indicates if classes meta data need to be calculated.\n */\n this._recalculateClasses = true;\n /**\n * Loaded theme\n */\n this._theme = {};\n }\n theme(classes) {\n if (this._recalculateClasses) {\n this._recalculateThemeClasses();\n }\n if (Array.isArray(classes)) {\n return classes.map((className) => this._getThemeClass(className));\n }\n return this._getThemeClass(classes);\n }\n /**\n * Function fired when `theme` or `extraClasses` are changed.\n */\n onPropertiesChanged() {\n this._recalculateClasses = true;\n }\n _getThemeClass(className) {\n if (className === undefined || className === null) {\n return className;\n }\n const extraClasses = this.properties.extraClasses || {};\n const themeClassName = this._baseThemeClassesReverseLookup[className];\n let resultClassNames = [];\n if (!themeClassName) {\n console.warn(`Class name: '${className}' not found in theme`);\n return null;\n }\n if (extraClasses[themeClassName]) {\n resultClassNames.push(extraClasses[themeClassName]);\n }\n if (this._theme[themeClassName]) {\n resultClassNames.push(this._theme[themeClassName]);\n }\n else {\n resultClassNames.push(this._registeredBaseTheme[themeClassName]);\n }\n return resultClassNames.join(' ');\n }\n _recalculateThemeClasses() {\n const { theme = {} } = this.properties;\n const baseThemes = this.getDecorator('baseThemeClasses');\n if (!this._registeredBaseTheme) {\n this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => {\n const _a = THEME_KEY, key = baseTheme[_a], classes = tslib_1.__rest(baseTheme, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n this._registeredBaseThemeKeys.push(key);\n return Object.assign({}, finalBaseTheme, classes);\n }, {});\n this._baseThemeClassesReverseLookup = createThemeClassesLookup(baseThemes);\n }\n this._theme = this._registeredBaseThemeKeys.reduce((baseTheme, themeKey) => {\n return Object.assign({}, baseTheme, theme[themeKey]);\n }, {});\n this._recalculateClasses = false;\n }\n };\n tslib_1.__decorate([\n diffProperty('theme', shallow),\n diffProperty('extraClasses', shallow)\n ], Themed.prototype, \"onPropertiesChanged\", null);\n Themed = tslib_1.__decorate([\n inject({\n name: INJECTED_THEME_KEY,\n getProperties: (theme, properties) => {\n if (!properties.theme) {\n return { theme };\n }\n return {};\n }\n })\n ], Themed);\n return Themed;\n}\nexport default ThemedMixin;\n//# sourceMappingURL=Themed.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "name": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "id": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "name": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "index": 13, "index2": 37, - "size": 9124, + "size": 9118, "cacheable": true, "built": true, "optional": false, @@ -2245,14 +2254,14 @@ "module": "./node_modules/imports-loader?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js", "moduleName": "./node_modules/imports-loader?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js", "type": "cjs require", - "userRequest": "@dojo/widget-core/registerCustomElement", - "loc": "4:28-78" + "userRequest": "@dojo/framework/widget-core/registerCustomElement", + "loc": "4:28-88" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\customElement.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\customElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", "type": "harmony import", "userRequest": "../registerCustomElement", "loc": "1:0-66" @@ -2268,15 +2277,15 @@ ], "optimizationBailout": [], "depth": 2, - "source": "import * as tslib_1 from \"tslib\";\nimport { WidgetBase, noBind } from './WidgetBase';\nimport { ProjectorMixin } from './mixins/Projector';\nimport { from } from '@dojo/shim/array';\nimport { w, dom } from './d';\nimport global from '@dojo/shim/global';\nimport { registerThemeInjector } from './mixins/Themed';\nimport { alwaysRender } from './decorators/alwaysRender';\nexport var CustomElementChildType;\n(function (CustomElementChildType) {\n CustomElementChildType[\"DOJO\"] = \"DOJO\";\n CustomElementChildType[\"NODE\"] = \"NODE\";\n CustomElementChildType[\"TEXT\"] = \"TEXT\";\n})(CustomElementChildType || (CustomElementChildType = {}));\nexport function DomToWidgetWrapper(domNode) {\n let DomToWidgetWrapper = class DomToWidgetWrapper extends WidgetBase {\n render() {\n const properties = Object.keys(this.properties).reduce((props, key) => {\n const value = this.properties[key];\n if (key.indexOf('on') === 0) {\n key = `__${key}`;\n }\n props[key] = value;\n return props;\n }, {});\n return dom({ node: domNode, props: properties, diffType: 'dom' });\n }\n static get domNode() {\n return domNode;\n }\n };\n DomToWidgetWrapper = tslib_1.__decorate([\n alwaysRender()\n ], DomToWidgetWrapper);\n return DomToWidgetWrapper;\n}\nexport function create(descriptor, WidgetConstructor) {\n const { attributes, childType, registryFactory } = descriptor;\n const attributeMap = {};\n attributes.forEach((propertyName) => {\n const attributeName = propertyName.toLowerCase();\n attributeMap[attributeName] = propertyName;\n });\n return class extends HTMLElement {\n constructor() {\n super(...arguments);\n this._properties = {};\n this._children = [];\n this._eventProperties = {};\n this._initialised = false;\n }\n connectedCallback() {\n if (this._initialised) {\n return;\n }\n const domProperties = {};\n const { attributes, properties, events } = descriptor;\n this._properties = Object.assign({}, this._properties, this._attributesToProperties(attributes));\n [...attributes, ...properties].forEach((propertyName) => {\n const value = this[propertyName];\n const filteredPropertyName = propertyName.replace(/^on/, '__');\n if (value !== undefined) {\n this._properties[propertyName] = value;\n }\n if (filteredPropertyName !== propertyName) {\n domProperties[filteredPropertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n }\n domProperties[propertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n });\n events.forEach((propertyName) => {\n const eventName = propertyName.replace(/^on/, '').toLowerCase();\n const filteredPropertyName = propertyName.replace(/^on/, '__on');\n domProperties[filteredPropertyName] = {\n get: () => this._getEventProperty(propertyName),\n set: (value) => this._setEventProperty(propertyName, value)\n };\n this._eventProperties[propertyName] = undefined;\n this._properties[propertyName] = (...args) => {\n const eventCallback = this._getEventProperty(propertyName);\n if (typeof eventCallback === 'function') {\n eventCallback(...args);\n }\n this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: false,\n detail: args\n }));\n };\n });\n Object.defineProperties(this, domProperties);\n const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children;\n from(children).forEach((childNode) => {\n if (childType === CustomElementChildType.DOJO) {\n childNode.addEventListener('dojo-ce-render', () => this._render());\n childNode.addEventListener('dojo-ce-connected', () => this._render());\n this._children.push(DomToWidgetWrapper(childNode));\n }\n else {\n this._children.push(dom({ node: childNode, diffType: 'dom' }));\n }\n });\n this.addEventListener('dojo-ce-connected', (e) => this._childConnected(e));\n const widgetProperties = this._properties;\n const renderChildren = () => this.__children__();\n const Wrapper = class extends WidgetBase {\n render() {\n return w(WidgetConstructor, widgetProperties, renderChildren());\n }\n };\n const registry = registryFactory();\n const themeContext = registerThemeInjector(this._getTheme(), registry);\n global.addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme()));\n const Projector = ProjectorMixin(Wrapper);\n this._projector = new Projector();\n this._projector.setProperties({ registry });\n this._projector.append(this);\n this._initialised = true;\n this.dispatchEvent(new CustomEvent('dojo-ce-connected', {\n bubbles: true,\n detail: this\n }));\n }\n _getTheme() {\n if (global && global.dojoce && global.dojoce.theme) {\n return global.dojoce.themes[global.dojoce.theme];\n }\n }\n _childConnected(e) {\n const node = e.detail;\n if (node.parentNode === this) {\n const exists = this._children.some((child) => child.domNode === node);\n if (!exists) {\n node.addEventListener('dojo-ce-render', () => this._render());\n this._children.push(DomToWidgetWrapper(node));\n this._render();\n }\n }\n }\n _render() {\n if (this._projector) {\n this._projector.invalidate();\n this.dispatchEvent(new CustomEvent('dojo-ce-render', {\n bubbles: false,\n detail: this\n }));\n }\n }\n __properties__() {\n return Object.assign({}, this._properties, this._eventProperties);\n }\n __children__() {\n if (childType === CustomElementChildType.DOJO) {\n return this._children.filter((Child) => Child.domNode.isWidget).map((Child) => {\n const { domNode } = Child;\n return w(Child, Object.assign({}, domNode.__properties__()), [...domNode.__children__()]);\n });\n }\n else {\n return this._children;\n }\n }\n attributeChangedCallback(name, oldValue, value) {\n const propertyName = attributeMap[name];\n this._setProperty(propertyName, value);\n }\n _setEventProperty(propertyName, value) {\n this._eventProperties[propertyName] = value;\n }\n _getEventProperty(propertyName) {\n return this._eventProperties[propertyName];\n }\n _setProperty(propertyName, value) {\n if (typeof value === 'function') {\n value[noBind] = true;\n }\n this._properties[propertyName] = value;\n this._render();\n }\n _getProperty(propertyName) {\n return this._properties[propertyName];\n }\n _attributesToProperties(attributes) {\n return attributes.reduce((properties, propertyName) => {\n const attributeName = propertyName.toLowerCase();\n const value = this.getAttribute(attributeName);\n if (value !== null) {\n properties[propertyName] = value;\n }\n return properties;\n }, {});\n }\n static get observedAttributes() {\n return Object.keys(attributeMap);\n }\n get isWidget() {\n return true;\n }\n };\n}\nexport function register(WidgetConstructor) {\n const descriptor = WidgetConstructor.prototype && WidgetConstructor.prototype.__customElementDescriptor;\n if (!descriptor) {\n throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?');\n }\n global.customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor));\n}\nexport default register;\n//# sourceMappingURL=registerCustomElement.mjs.map" + "source": "import * as tslib_1 from \"tslib\";\nimport { WidgetBase, noBind } from './WidgetBase';\nimport { ProjectorMixin } from './mixins/Projector';\nimport { from } from '../shim/array';\nimport { w, dom } from './d';\nimport global from '../shim/global';\nimport { registerThemeInjector } from './mixins/Themed';\nimport { alwaysRender } from './decorators/alwaysRender';\nexport var CustomElementChildType;\n(function (CustomElementChildType) {\n CustomElementChildType[\"DOJO\"] = \"DOJO\";\n CustomElementChildType[\"NODE\"] = \"NODE\";\n CustomElementChildType[\"TEXT\"] = \"TEXT\";\n})(CustomElementChildType || (CustomElementChildType = {}));\nexport function DomToWidgetWrapper(domNode) {\n let DomToWidgetWrapper = class DomToWidgetWrapper extends WidgetBase {\n render() {\n const properties = Object.keys(this.properties).reduce((props, key) => {\n const value = this.properties[key];\n if (key.indexOf('on') === 0) {\n key = `__${key}`;\n }\n props[key] = value;\n return props;\n }, {});\n return dom({ node: domNode, props: properties, diffType: 'dom' });\n }\n static get domNode() {\n return domNode;\n }\n };\n DomToWidgetWrapper = tslib_1.__decorate([\n alwaysRender()\n ], DomToWidgetWrapper);\n return DomToWidgetWrapper;\n}\nexport function create(descriptor, WidgetConstructor) {\n const { attributes, childType, registryFactory } = descriptor;\n const attributeMap = {};\n attributes.forEach((propertyName) => {\n const attributeName = propertyName.toLowerCase();\n attributeMap[attributeName] = propertyName;\n });\n return class extends HTMLElement {\n constructor() {\n super(...arguments);\n this._properties = {};\n this._children = [];\n this._eventProperties = {};\n this._initialised = false;\n }\n connectedCallback() {\n if (this._initialised) {\n return;\n }\n const domProperties = {};\n const { attributes, properties, events } = descriptor;\n this._properties = Object.assign({}, this._properties, this._attributesToProperties(attributes));\n [...attributes, ...properties].forEach((propertyName) => {\n const value = this[propertyName];\n const filteredPropertyName = propertyName.replace(/^on/, '__');\n if (value !== undefined) {\n this._properties[propertyName] = value;\n }\n if (filteredPropertyName !== propertyName) {\n domProperties[filteredPropertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n }\n domProperties[propertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n });\n events.forEach((propertyName) => {\n const eventName = propertyName.replace(/^on/, '').toLowerCase();\n const filteredPropertyName = propertyName.replace(/^on/, '__on');\n domProperties[filteredPropertyName] = {\n get: () => this._getEventProperty(propertyName),\n set: (value) => this._setEventProperty(propertyName, value)\n };\n this._eventProperties[propertyName] = undefined;\n this._properties[propertyName] = (...args) => {\n const eventCallback = this._getEventProperty(propertyName);\n if (typeof eventCallback === 'function') {\n eventCallback(...args);\n }\n this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: false,\n detail: args\n }));\n };\n });\n Object.defineProperties(this, domProperties);\n const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children;\n from(children).forEach((childNode) => {\n if (childType === CustomElementChildType.DOJO) {\n childNode.addEventListener('dojo-ce-render', () => this._render());\n childNode.addEventListener('dojo-ce-connected', () => this._render());\n this._children.push(DomToWidgetWrapper(childNode));\n }\n else {\n this._children.push(dom({ node: childNode, diffType: 'dom' }));\n }\n });\n this.addEventListener('dojo-ce-connected', (e) => this._childConnected(e));\n const widgetProperties = this._properties;\n const renderChildren = () => this.__children__();\n const Wrapper = class extends WidgetBase {\n render() {\n return w(WidgetConstructor, widgetProperties, renderChildren());\n }\n };\n const registry = registryFactory();\n const themeContext = registerThemeInjector(this._getTheme(), registry);\n global.addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme()));\n const Projector = ProjectorMixin(Wrapper);\n this._projector = new Projector();\n this._projector.setProperties({ registry });\n this._projector.append(this);\n this._initialised = true;\n this.dispatchEvent(new CustomEvent('dojo-ce-connected', {\n bubbles: true,\n detail: this\n }));\n }\n _getTheme() {\n if (global && global.dojoce && global.dojoce.theme) {\n return global.dojoce.themes[global.dojoce.theme];\n }\n }\n _childConnected(e) {\n const node = e.detail;\n if (node.parentNode === this) {\n const exists = this._children.some((child) => child.domNode === node);\n if (!exists) {\n node.addEventListener('dojo-ce-render', () => this._render());\n this._children.push(DomToWidgetWrapper(node));\n this._render();\n }\n }\n }\n _render() {\n if (this._projector) {\n this._projector.invalidate();\n this.dispatchEvent(new CustomEvent('dojo-ce-render', {\n bubbles: false,\n detail: this\n }));\n }\n }\n __properties__() {\n return Object.assign({}, this._properties, this._eventProperties);\n }\n __children__() {\n if (childType === CustomElementChildType.DOJO) {\n return this._children.filter((Child) => Child.domNode.isWidget).map((Child) => {\n const { domNode } = Child;\n return w(Child, Object.assign({}, domNode.__properties__()), [...domNode.__children__()]);\n });\n }\n else {\n return this._children;\n }\n }\n attributeChangedCallback(name, oldValue, value) {\n const propertyName = attributeMap[name];\n this._setProperty(propertyName, value);\n }\n _setEventProperty(propertyName, value) {\n this._eventProperties[propertyName] = value;\n }\n _getEventProperty(propertyName) {\n return this._eventProperties[propertyName];\n }\n _setProperty(propertyName, value) {\n if (typeof value === 'function') {\n value[noBind] = true;\n }\n this._properties[propertyName] = value;\n this._render();\n }\n _getProperty(propertyName) {\n return this._properties[propertyName];\n }\n _attributesToProperties(attributes) {\n return attributes.reduce((properties, propertyName) => {\n const attributeName = propertyName.toLowerCase();\n const value = this.getAttribute(attributeName);\n if (value !== null) {\n properties[propertyName] = value;\n }\n return properties;\n }, {});\n }\n static get observedAttributes() {\n return Object.keys(attributeMap);\n }\n get isWidget() {\n return true;\n }\n };\n}\nexport function register(WidgetConstructor) {\n const descriptor = WidgetConstructor.prototype && WidgetConstructor.prototype.__customElementDescriptor;\n if (!descriptor) {\n throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?');\n }\n global.customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor));\n}\nexport default register;\n//# sourceMappingURL=registerCustomElement.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/vdom.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\vdom.mjs", - "name": "./node_modules/@dojo/widget-core/vdom.mjs", + "id": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\vdom.mjs", + "name": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "index": 29, "index2": 25, - "size": 39734, + "size": 40904, "cacheable": true, "built": true, "optional": false, @@ -2285,27 +2294,27 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./vdom", "loc": "8:0-43" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "./../vdom", "loc": "6:0-32" @@ -2324,7 +2333,7 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import global from '@dojo/shim/global';\r\nimport { from as arrayFrom } from '@dojo/shim/array';\r\nimport { isWNode, isVNode, isDomVNode, VNODE, WNODE } from './d';\r\nimport { isWidgetBaseConstructor } from './Registry';\r\nimport WeakMap from '@dojo/shim/WeakMap';\r\nconst NAMESPACE_W3 = 'http://www.w3.org/';\r\nconst NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg';\r\nconst NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink';\r\nconst emptyArray = [];\r\nexport const widgetInstanceMap = new WeakMap();\r\nconst instanceMap = new WeakMap();\r\nconst projectorStateMap = new WeakMap();\r\nfunction same(dnode1, dnode2) {\r\n if (isVNode(dnode1) && isVNode(dnode2)) {\r\n if (isDomVNode(dnode1) || isDomVNode(dnode2)) {\r\n if (dnode1.domNode !== dnode2.domNode) {\r\n return false;\r\n }\r\n }\r\n if (dnode1.tag !== dnode2.tag) {\r\n return false;\r\n }\r\n if (dnode1.properties.key !== dnode2.properties.key) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n else if (isWNode(dnode1) && isWNode(dnode2)) {\r\n if (dnode1.instance === undefined && typeof dnode2.widgetConstructor === 'string') {\r\n return false;\r\n }\r\n if (dnode1.widgetConstructor !== dnode2.widgetConstructor) {\r\n return false;\r\n }\r\n if (dnode1.properties.key !== dnode2.properties.key) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n return false;\r\n}\r\nconst missingTransition = function () {\r\n throw new Error('Provide a transitions object to the projectionOptions to do animations');\r\n};\r\nfunction getProjectionOptions(projectorOptions, projectorInstance) {\r\n const defaults = {\r\n namespace: undefined,\r\n styleApplyer: function (domNode, styleName, value) {\r\n domNode.style[styleName] = value;\r\n },\r\n transitions: {\r\n enter: missingTransition,\r\n exit: missingTransition\r\n },\r\n depth: 0,\r\n merge: false,\r\n sync: false,\r\n projectorInstance\r\n };\r\n return Object.assign({}, defaults, projectorOptions);\r\n}\r\nfunction checkStyleValue(styleValue) {\r\n if (typeof styleValue !== 'string') {\r\n throw new Error('Style values must be strings');\r\n }\r\n}\r\nfunction updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n const eventMap = projectorState.nodeMap.get(domNode) || new WeakMap();\r\n if (previousValue) {\r\n const previousEvent = eventMap.get(previousValue);\r\n domNode.removeEventListener(eventName, previousEvent);\r\n }\r\n let callback = currentValue.bind(bind);\r\n if (eventName === 'input') {\r\n callback = function (evt) {\r\n currentValue.call(this, evt);\r\n evt.target['oninput-value'] = evt.target.value;\r\n }.bind(bind);\r\n }\r\n domNode.addEventListener(eventName, callback);\r\n eventMap.set(currentValue, callback);\r\n projectorState.nodeMap.set(domNode, eventMap);\r\n}\r\nfunction addClasses(domNode, classes) {\r\n if (classes) {\r\n const classNames = classes.split(' ');\r\n for (let i = 0; i < classNames.length; i++) {\r\n domNode.classList.add(classNames[i]);\r\n }\r\n }\r\n}\r\nfunction removeClasses(domNode, classes) {\r\n if (classes) {\r\n const classNames = classes.split(' ');\r\n for (let i = 0; i < classNames.length; i++) {\r\n domNode.classList.remove(classNames[i]);\r\n }\r\n }\r\n}\r\nfunction buildPreviousProperties(domNode, previous, current) {\r\n const { diffType, properties, attributes } = current;\r\n if (!diffType || diffType === 'vdom') {\r\n return { properties: previous.properties, attributes: previous.attributes, events: previous.events };\r\n }\r\n else if (diffType === 'none') {\r\n return { properties: {}, attributes: previous.attributes ? {} : undefined, events: previous.events };\r\n }\r\n let newProperties = {\r\n properties: {}\r\n };\r\n if (attributes) {\r\n newProperties.attributes = {};\r\n newProperties.events = previous.events;\r\n Object.keys(properties).forEach((propName) => {\r\n newProperties.properties[propName] = domNode[propName];\r\n });\r\n Object.keys(attributes).forEach((attrName) => {\r\n newProperties.attributes[attrName] = domNode.getAttribute(attrName);\r\n });\r\n return newProperties;\r\n }\r\n newProperties.properties = Object.keys(properties).reduce((props, property) => {\r\n props[property] = domNode.getAttribute(property) || domNode[property];\r\n return props;\r\n }, {});\r\n return newProperties;\r\n}\r\nfunction focusNode(propValue, previousValue, domNode, projectionOptions) {\r\n let result;\r\n if (typeof propValue === 'function') {\r\n result = propValue();\r\n }\r\n else {\r\n result = propValue && !previousValue;\r\n }\r\n if (result === true) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectorState.deferredRenderCallbacks.push(() => {\r\n domNode.focus();\r\n });\r\n }\r\n}\r\nfunction removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions, onlyEvents = false) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n const eventMap = projectorState.nodeMap.get(domNode);\r\n if (eventMap) {\r\n Object.keys(previousProperties).forEach((propName) => {\r\n const isEvent = propName.substr(0, 2) === 'on' || onlyEvents;\r\n const eventName = onlyEvents ? propName : propName.substr(2);\r\n if (isEvent && !properties[propName]) {\r\n const eventCallback = eventMap.get(previousProperties[propName]);\r\n if (eventCallback) {\r\n domNode.removeEventListener(eventName, eventCallback);\r\n }\r\n }\r\n });\r\n }\r\n}\r\nfunction updateAttribute(domNode, attrName, attrValue, projectionOptions) {\r\n if (projectionOptions.namespace === NAMESPACE_SVG && attrName === 'href') {\r\n domNode.setAttributeNS(NAMESPACE_XLINK, attrName, attrValue);\r\n }\r\n else if ((attrName === 'role' && attrValue === '') || attrValue === undefined) {\r\n domNode.removeAttribute(attrName);\r\n }\r\n else {\r\n domNode.setAttribute(attrName, attrValue);\r\n }\r\n}\r\nfunction updateAttributes(domNode, previousAttributes, attributes, projectionOptions) {\r\n const attrNames = Object.keys(attributes);\r\n const attrCount = attrNames.length;\r\n for (let i = 0; i < attrCount; i++) {\r\n const attrName = attrNames[i];\r\n const attrValue = attributes[attrName];\r\n const previousAttrValue = previousAttributes[attrName];\r\n if (attrValue !== previousAttrValue) {\r\n updateAttribute(domNode, attrName, attrValue, projectionOptions);\r\n }\r\n }\r\n}\r\nfunction updateProperties(domNode, previousProperties, properties, projectionOptions, includesEventsAndAttributes = true) {\r\n let propertiesUpdated = false;\r\n const propNames = Object.keys(properties);\r\n const propCount = propNames.length;\r\n if (propNames.indexOf('classes') === -1 && previousProperties.classes) {\r\n if (Array.isArray(previousProperties.classes)) {\r\n for (let i = 0; i < previousProperties.classes.length; i++) {\r\n removeClasses(domNode, previousProperties.classes[i]);\r\n }\r\n }\r\n else {\r\n removeClasses(domNode, previousProperties.classes);\r\n }\r\n }\r\n includesEventsAndAttributes && removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions);\r\n for (let i = 0; i < propCount; i++) {\r\n const propName = propNames[i];\r\n let propValue = properties[propName];\r\n const previousValue = previousProperties[propName];\r\n if (propName === 'classes') {\r\n const previousClasses = Array.isArray(previousValue) ? previousValue : [previousValue];\r\n const currentClasses = Array.isArray(propValue) ? propValue : [propValue];\r\n if (previousClasses && previousClasses.length > 0) {\r\n if (!propValue || propValue.length === 0) {\r\n for (let i = 0; i < previousClasses.length; i++) {\r\n removeClasses(domNode, previousClasses[i]);\r\n }\r\n }\r\n else {\r\n const newClasses = [...currentClasses];\r\n for (let i = 0; i < previousClasses.length; i++) {\r\n const previousClassName = previousClasses[i];\r\n if (previousClassName) {\r\n const classIndex = newClasses.indexOf(previousClassName);\r\n if (classIndex === -1) {\r\n removeClasses(domNode, previousClassName);\r\n }\r\n else {\r\n newClasses.splice(classIndex, 1);\r\n }\r\n }\r\n }\r\n for (let i = 0; i < newClasses.length; i++) {\r\n addClasses(domNode, newClasses[i]);\r\n }\r\n }\r\n }\r\n else {\r\n for (let i = 0; i < currentClasses.length; i++) {\r\n addClasses(domNode, currentClasses[i]);\r\n }\r\n }\r\n }\r\n else if (propName === 'focus') {\r\n focusNode(propValue, previousValue, domNode, projectionOptions);\r\n }\r\n else if (propName === 'styles') {\r\n const styleNames = Object.keys(propValue);\r\n const styleCount = styleNames.length;\r\n for (let j = 0; j < styleCount; j++) {\r\n const styleName = styleNames[j];\r\n const newStyleValue = propValue[styleName];\r\n const oldStyleValue = previousValue && previousValue[styleName];\r\n if (newStyleValue === oldStyleValue) {\r\n continue;\r\n }\r\n propertiesUpdated = true;\r\n if (newStyleValue) {\r\n checkStyleValue(newStyleValue);\r\n projectionOptions.styleApplyer(domNode, styleName, newStyleValue);\r\n }\r\n else {\r\n projectionOptions.styleApplyer(domNode, styleName, '');\r\n }\r\n }\r\n }\r\n else {\r\n if (!propValue && typeof previousValue === 'string') {\r\n propValue = '';\r\n }\r\n if (propName === 'value') {\r\n const domValue = domNode[propName];\r\n if (domValue !== propValue &&\r\n (domNode['oninput-value']\r\n ? domValue === domNode['oninput-value']\r\n : propValue !== previousValue)) {\r\n domNode[propName] = propValue;\r\n domNode['oninput-value'] = undefined;\r\n }\r\n if (propValue !== previousValue) {\r\n propertiesUpdated = true;\r\n }\r\n }\r\n else if (propName !== 'key' && propValue !== previousValue) {\r\n const type = typeof propValue;\r\n if (type === 'function' && propName.lastIndexOf('on', 0) === 0 && includesEventsAndAttributes) {\r\n updateEvent(domNode, propName.substr(2), propValue, projectionOptions, properties.bind, previousValue);\r\n }\r\n else if (type === 'string' && propName !== 'innerHTML' && includesEventsAndAttributes) {\r\n updateAttribute(domNode, propName, propValue, projectionOptions);\r\n }\r\n else if (propName === 'scrollLeft' || propName === 'scrollTop') {\r\n if (domNode[propName] !== propValue) {\r\n domNode[propName] = propValue;\r\n }\r\n }\r\n else {\r\n domNode[propName] = propValue;\r\n }\r\n propertiesUpdated = true;\r\n }\r\n }\r\n }\r\n return propertiesUpdated;\r\n}\r\nfunction findIndexOfChild(children, sameAs, start) {\r\n for (let i = start; i < children.length; i++) {\r\n if (same(children[i], sameAs)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\nexport function toParentVNode(domNode) {\r\n return {\r\n tag: '',\r\n properties: {},\r\n children: undefined,\r\n domNode,\r\n type: VNODE\r\n };\r\n}\r\nexport function toTextVNode(data) {\r\n return {\r\n tag: '',\r\n properties: {},\r\n children: undefined,\r\n text: `${data}`,\r\n domNode: undefined,\r\n type: VNODE\r\n };\r\n}\r\nfunction toInternalWNode(instance, instanceData) {\r\n return {\r\n instance,\r\n rendered: [],\r\n coreProperties: instanceData.coreProperties,\r\n children: instance.children,\r\n widgetConstructor: instance.constructor,\r\n properties: instanceData.inputProperties,\r\n type: WNODE\r\n };\r\n}\r\nexport function filterAndDecorateChildren(children, instance) {\r\n if (children === undefined) {\r\n return emptyArray;\r\n }\r\n children = Array.isArray(children) ? children : [children];\r\n for (let i = 0; i < children.length;) {\r\n const child = children[i];\r\n if (child === undefined || child === null) {\r\n children.splice(i, 1);\r\n continue;\r\n }\r\n else if (typeof child === 'string') {\r\n children[i] = toTextVNode(child);\r\n }\r\n else {\r\n if (isVNode(child)) {\r\n if (child.properties.bind === undefined) {\r\n child.properties.bind = instance;\r\n if (child.children && child.children.length > 0) {\r\n filterAndDecorateChildren(child.children, instance);\r\n }\r\n }\r\n }\r\n else {\r\n if (!child.coreProperties) {\r\n const instanceData = widgetInstanceMap.get(instance);\r\n child.coreProperties = {\r\n bind: instance,\r\n baseRegistry: instanceData.coreProperties.baseRegistry\r\n };\r\n }\r\n if (child.children && child.children.length > 0) {\r\n filterAndDecorateChildren(child.children, instance);\r\n }\r\n }\r\n }\r\n i++;\r\n }\r\n return children;\r\n}\r\nfunction nodeAdded(dnode, transitions) {\r\n if (isVNode(dnode) && dnode.properties) {\r\n const enterAnimation = dnode.properties.enterAnimation;\r\n if (enterAnimation) {\r\n if (typeof enterAnimation === 'function') {\r\n enterAnimation(dnode.domNode, dnode.properties);\r\n }\r\n else {\r\n transitions.enter(dnode.domNode, dnode.properties, enterAnimation);\r\n }\r\n }\r\n }\r\n}\r\nfunction nodeToRemove(dnode, transitions, projectionOptions) {\r\n if (isWNode(dnode)) {\r\n const rendered = dnode.rendered || emptyArray;\r\n if (dnode.instance) {\r\n const instanceData = widgetInstanceMap.get(dnode.instance);\r\n instanceData.onDetach();\r\n instanceMap.delete(dnode.instance);\r\n }\r\n for (let i = 0; i < rendered.length; i++) {\r\n nodeToRemove(rendered[i], transitions, projectionOptions);\r\n }\r\n }\r\n else {\r\n const domNode = dnode.domNode;\r\n const properties = dnode.properties;\r\n if (dnode.children && dnode.children.length > 0) {\r\n for (let i = 0; i < dnode.children.length; i++) {\r\n nodeToRemove(dnode.children[i], transitions, projectionOptions);\r\n }\r\n }\r\n const exitAnimation = properties.exitAnimation;\r\n if (properties && exitAnimation) {\r\n domNode.style.pointerEvents = 'none';\r\n const removeDomNode = function () {\r\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\r\n dnode.domNode = undefined;\r\n };\r\n if (typeof exitAnimation === 'function') {\r\n exitAnimation(domNode, removeDomNode, properties);\r\n return;\r\n }\r\n else {\r\n transitions.exit(dnode.domNode, properties, exitAnimation, removeDomNode);\r\n return;\r\n }\r\n }\r\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\r\n dnode.domNode = undefined;\r\n }\r\n}\r\nfunction checkDistinguishable(childNodes, indexToCheck, parentInstance) {\r\n const childNode = childNodes[indexToCheck];\r\n if (isVNode(childNode) && !childNode.tag) {\r\n return; // Text nodes need not be distinguishable\r\n }\r\n const { key } = childNode.properties;\r\n if (key === undefined || key === null) {\r\n for (let i = 0; i < childNodes.length; i++) {\r\n if (i !== indexToCheck) {\r\n const node = childNodes[i];\r\n if (same(node, childNode)) {\r\n let nodeIdentifier;\r\n const parentName = parentInstance.constructor.name || 'unknown';\r\n if (isWNode(childNode)) {\r\n nodeIdentifier = childNode.widgetConstructor.name || 'unknown';\r\n }\r\n else {\r\n nodeIdentifier = childNode.tag;\r\n }\r\n console.warn(`A widget (${parentName}) has had a child addded or removed, but they were not able to uniquely identified. It is recommended to provide a unique 'key' property when using the same widget or element (${nodeIdentifier}) multiple times as siblings`);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\nfunction updateChildren(parentVNode, oldChildren, newChildren, parentInstance, projectionOptions) {\r\n oldChildren = oldChildren || emptyArray;\r\n newChildren = newChildren;\r\n const oldChildrenLength = oldChildren.length;\r\n const newChildrenLength = newChildren.length;\r\n const transitions = projectionOptions.transitions;\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\r\n let oldIndex = 0;\r\n let newIndex = 0;\r\n let i;\r\n let textUpdated = false;\r\n while (newIndex < newChildrenLength) {\r\n let oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : undefined;\r\n const newChild = newChildren[newIndex];\r\n if (isVNode(newChild) && typeof newChild.deferredPropertiesCallback === 'function') {\r\n newChild.inserted = isVNode(oldChild) && oldChild.inserted;\r\n addDeferredProperties(newChild, projectionOptions);\r\n }\r\n if (oldChild !== undefined && same(oldChild, newChild)) {\r\n textUpdated = updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance) || textUpdated;\r\n oldIndex++;\r\n newIndex++;\r\n continue;\r\n }\r\n const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);\r\n const addChild = () => {\r\n let insertBeforeDomNode = undefined;\r\n let child = oldChildren[oldIndex];\r\n if (child) {\r\n let nextIndex = oldIndex + 1;\r\n let insertBeforeChildren = [child];\r\n while (insertBeforeChildren.length) {\r\n const insertBefore = insertBeforeChildren.shift();\r\n if (isWNode(insertBefore)) {\r\n if (insertBefore.rendered) {\r\n insertBeforeChildren.push(...insertBefore.rendered);\r\n }\r\n }\r\n else {\r\n if (insertBefore.domNode) {\r\n insertBeforeDomNode = insertBefore.domNode;\r\n break;\r\n }\r\n }\r\n if (insertBeforeChildren.length === 0 && oldChildren[nextIndex]) {\r\n insertBeforeChildren.push(oldChildren[nextIndex]);\r\n nextIndex++;\r\n }\r\n }\r\n }\r\n createDom(newChild, parentVNode, insertBeforeDomNode, projectionOptions, parentInstance);\r\n nodeAdded(newChild, transitions);\r\n const indexToCheck = newIndex;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(newChildren, indexToCheck, parentInstance);\r\n });\r\n };\r\n if (!oldChild || findOldIndex === -1) {\r\n addChild();\r\n newIndex++;\r\n continue;\r\n }\r\n const removeChild = () => {\r\n const indexToCheck = oldIndex;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\r\n });\r\n if (isWNode(oldChild)) {\r\n const item = instanceMap.get(oldChild.instance);\r\n if (item) {\r\n oldChild = item.dnode;\r\n }\r\n }\r\n nodeToRemove(oldChild, transitions, projectionOptions);\r\n };\r\n const findNewIndex = findIndexOfChild(newChildren, oldChild, newIndex + 1);\r\n if (findNewIndex === -1) {\r\n removeChild();\r\n oldIndex++;\r\n continue;\r\n }\r\n addChild();\r\n removeChild();\r\n oldIndex++;\r\n newIndex++;\r\n }\r\n if (oldChildrenLength > oldIndex) {\r\n // Remove child fragments\r\n for (i = oldIndex; i < oldChildrenLength; i++) {\r\n const indexToCheck = i;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\r\n });\r\n let childToRemove = oldChildren[i];\r\n if (isWNode(childToRemove)) {\r\n const item = instanceMap.get(childToRemove.instance);\r\n if (item) {\r\n childToRemove = item.dnode;\r\n }\r\n }\r\n nodeToRemove(childToRemove, transitions, projectionOptions);\r\n }\r\n }\r\n return textUpdated;\r\n}\r\nfunction addChildren(parentVNode, children, projectionOptions, parentInstance, insertBefore = undefined, childNodes) {\r\n if (children === undefined) {\r\n return;\r\n }\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectorState.merge && childNodes === undefined) {\r\n childNodes = arrayFrom(parentVNode.domNode.childNodes);\r\n }\r\n const transitions = projectionOptions.transitions;\r\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n if (isVNode(child)) {\r\n if (projectorState.merge && childNodes) {\r\n let domElement = undefined;\r\n while (child.domNode === undefined && childNodes.length > 0) {\r\n domElement = childNodes.shift();\r\n if (domElement && domElement.tagName === (child.tag.toUpperCase() || undefined)) {\r\n child.domNode = domElement;\r\n }\r\n }\r\n }\r\n createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance);\r\n }\r\n else {\r\n createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes);\r\n }\r\n nodeAdded(child, transitions);\r\n }\r\n}\r\nfunction initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions) {\r\n addChildren(dnode, dnode.children, projectionOptions, parentInstance, undefined);\r\n if (typeof dnode.deferredPropertiesCallback === 'function' && dnode.inserted === undefined) {\r\n addDeferredProperties(dnode, projectionOptions);\r\n }\r\n if (dnode.attributes && dnode.events) {\r\n updateAttributes(domNode, {}, dnode.attributes, projectionOptions);\r\n updateProperties(domNode, {}, dnode.properties, projectionOptions, false);\r\n removeOrphanedEvents(domNode, {}, dnode.events, projectionOptions, true);\r\n const events = dnode.events;\r\n Object.keys(events).forEach((event) => {\r\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind);\r\n });\r\n }\r\n else {\r\n updateProperties(domNode, {}, dnode.properties, projectionOptions);\r\n }\r\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\r\n const instanceData = widgetInstanceMap.get(parentInstance);\r\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\r\n }\r\n dnode.inserted = true;\r\n}\r\nfunction createDom(dnode, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes) {\r\n let domNode;\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (isWNode(dnode)) {\r\n let { widgetConstructor } = dnode;\r\n const parentInstanceData = widgetInstanceMap.get(parentInstance);\r\n if (!isWidgetBaseConstructor(widgetConstructor)) {\r\n const item = parentInstanceData.registry().get(widgetConstructor);\r\n if (item === null) {\r\n return;\r\n }\r\n widgetConstructor = item;\r\n }\r\n const instance = new widgetConstructor();\r\n dnode.instance = instance;\r\n const instanceData = widgetInstanceMap.get(instance);\r\n instanceData.invalidate = () => {\r\n instanceData.dirty = true;\r\n if (instanceData.rendering === false) {\r\n projectorState.renderQueue.push({ instance, depth: projectionOptions.depth });\r\n scheduleRender(projectionOptions);\r\n }\r\n };\r\n instanceData.rendering = true;\r\n instance.__setCoreProperties__(dnode.coreProperties);\r\n instance.__setChildren__(dnode.children);\r\n instance.__setProperties__(dnode.properties);\r\n const rendered = instance.__render__();\r\n instanceData.rendering = false;\r\n if (rendered) {\r\n const filteredRendered = filterAndDecorateChildren(rendered, instance);\r\n dnode.rendered = filteredRendered;\r\n addChildren(parentVNode, filteredRendered, projectionOptions, instance, insertBefore, childNodes);\r\n }\r\n instanceMap.set(instance, { dnode, parentVNode });\r\n instanceData.nodeHandler.addRoot();\r\n projectorState.afterRenderCallbacks.push(() => {\r\n instanceData.onAttach();\r\n });\r\n }\r\n else {\r\n if (projectorState.merge && projectorState.mergeElement !== undefined) {\r\n domNode = dnode.domNode = projectionOptions.mergeElement;\r\n projectorState.mergeElement = undefined;\r\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\r\n return;\r\n }\r\n const doc = parentVNode.domNode.ownerDocument;\r\n if (!dnode.tag && typeof dnode.text === 'string') {\r\n if (dnode.domNode !== undefined && parentVNode.domNode) {\r\n const newDomNode = dnode.domNode.ownerDocument.createTextNode(dnode.text);\r\n if (parentVNode.domNode === dnode.domNode.parentNode) {\r\n parentVNode.domNode.replaceChild(newDomNode, dnode.domNode);\r\n }\r\n else {\r\n parentVNode.domNode.appendChild(newDomNode);\r\n dnode.domNode.parentNode && dnode.domNode.parentNode.removeChild(dnode.domNode);\r\n }\r\n dnode.domNode = newDomNode;\r\n }\r\n else {\r\n domNode = dnode.domNode = doc.createTextNode(dnode.text);\r\n if (insertBefore !== undefined) {\r\n parentVNode.domNode.insertBefore(domNode, insertBefore);\r\n }\r\n else {\r\n parentVNode.domNode.appendChild(domNode);\r\n }\r\n }\r\n }\r\n else {\r\n if (dnode.domNode === undefined) {\r\n if (dnode.tag === 'svg') {\r\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\r\n }\r\n if (projectionOptions.namespace !== undefined) {\r\n domNode = dnode.domNode = doc.createElementNS(projectionOptions.namespace, dnode.tag);\r\n }\r\n else {\r\n domNode = dnode.domNode = dnode.domNode || doc.createElement(dnode.tag);\r\n }\r\n }\r\n else {\r\n domNode = dnode.domNode;\r\n }\r\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\r\n if (insertBefore !== undefined) {\r\n parentVNode.domNode.insertBefore(domNode, insertBefore);\r\n }\r\n else if (domNode.parentNode !== parentVNode.domNode) {\r\n parentVNode.domNode.appendChild(domNode);\r\n }\r\n }\r\n }\r\n}\r\nfunction updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance) {\r\n if (isWNode(dnode)) {\r\n const { instance } = previous;\r\n const { parentVNode, dnode: node } = instanceMap.get(instance);\r\n const previousRendered = node ? node.rendered : previous.rendered;\r\n const instanceData = widgetInstanceMap.get(instance);\r\n instanceData.rendering = true;\r\n instance.__setCoreProperties__(dnode.coreProperties);\r\n instance.__setChildren__(dnode.children);\r\n instance.__setProperties__(dnode.properties);\r\n dnode.instance = instance;\r\n if (instanceData.dirty === true) {\r\n const rendered = instance.__render__();\r\n instanceData.rendering = false;\r\n dnode.rendered = filterAndDecorateChildren(rendered, instance);\r\n updateChildren(parentVNode, previousRendered, dnode.rendered, instance, projectionOptions);\r\n }\r\n else {\r\n instanceData.rendering = false;\r\n dnode.rendered = previousRendered;\r\n }\r\n instanceMap.set(instance, { dnode, parentVNode });\r\n instanceData.nodeHandler.addRoot();\r\n }\r\n else {\r\n if (previous === dnode) {\r\n return false;\r\n }\r\n const domNode = (dnode.domNode = previous.domNode);\r\n let textUpdated = false;\r\n let updated = false;\r\n if (!dnode.tag && typeof dnode.text === 'string') {\r\n if (dnode.text !== previous.text) {\r\n const newDomNode = domNode.ownerDocument.createTextNode(dnode.text);\r\n domNode.parentNode.replaceChild(newDomNode, domNode);\r\n dnode.domNode = newDomNode;\r\n textUpdated = true;\r\n return textUpdated;\r\n }\r\n }\r\n else {\r\n if (dnode.tag && dnode.tag.lastIndexOf('svg', 0) === 0) {\r\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\r\n }\r\n if (previous.children !== dnode.children) {\r\n const children = filterAndDecorateChildren(dnode.children, parentInstance);\r\n dnode.children = children;\r\n updated =\r\n updateChildren(dnode, previous.children, children, parentInstance, projectionOptions) || updated;\r\n }\r\n const previousProperties = buildPreviousProperties(domNode, previous, dnode);\r\n if (dnode.attributes && dnode.events) {\r\n updateAttributes(domNode, previousProperties.attributes, dnode.attributes, projectionOptions);\r\n updated =\r\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions, false) || updated;\r\n removeOrphanedEvents(domNode, previousProperties.events, dnode.events, projectionOptions, true);\r\n const events = dnode.events;\r\n Object.keys(events).forEach((event) => {\r\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind, previousProperties.events[event]);\r\n });\r\n }\r\n else {\r\n updated =\r\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions) ||\r\n updated;\r\n }\r\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\r\n const instanceData = widgetInstanceMap.get(parentInstance);\r\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\r\n }\r\n }\r\n if (updated && dnode.properties && dnode.properties.updateAnimation) {\r\n dnode.properties.updateAnimation(domNode, dnode.properties, previous.properties);\r\n }\r\n }\r\n}\r\nfunction addDeferredProperties(vnode, projectionOptions) {\r\n // transfer any properties that have been passed - as these must be decorated properties\r\n vnode.decoratedDeferredProperties = vnode.properties;\r\n const properties = vnode.deferredPropertiesCallback(!!vnode.inserted);\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n vnode.properties = Object.assign({}, properties, vnode.decoratedDeferredProperties);\r\n projectorState.deferredRenderCallbacks.push(() => {\r\n const properties = Object.assign({}, vnode.deferredPropertiesCallback(!!vnode.inserted), vnode.decoratedDeferredProperties);\r\n updateProperties(vnode.domNode, vnode.properties, properties, projectionOptions);\r\n vnode.properties = properties;\r\n });\r\n}\r\nfunction runDeferredRenderCallbacks(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectorState.deferredRenderCallbacks.length) {\r\n if (projectionOptions.sync) {\r\n while (projectorState.deferredRenderCallbacks.length) {\r\n const callback = projectorState.deferredRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n }\r\n else {\r\n global.requestAnimationFrame(() => {\r\n while (projectorState.deferredRenderCallbacks.length) {\r\n const callback = projectorState.deferredRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n }\r\n}\r\nfunction runAfterRenderCallbacks(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectionOptions.sync) {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n }\r\n else {\r\n if (global.requestIdleCallback) {\r\n global.requestIdleCallback(() => {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n else {\r\n setTimeout(() => {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n }\r\n}\r\nfunction scheduleRender(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectionOptions.sync) {\r\n render(projectionOptions);\r\n }\r\n else if (projectorState.renderScheduled === undefined) {\r\n projectorState.renderScheduled = global.requestAnimationFrame(() => {\r\n render(projectionOptions);\r\n });\r\n }\r\n}\r\nfunction render(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectorState.renderScheduled = undefined;\r\n const renderQueue = projectorState.renderQueue;\r\n const renders = [...renderQueue];\r\n projectorState.renderQueue = [];\r\n renders.sort((a, b) => a.depth - b.depth);\r\n const previouslyRendered = [];\r\n while (renders.length) {\r\n const { instance } = renders.shift();\r\n if (instanceMap.has(instance) && previouslyRendered.indexOf(instance) === -1) {\r\n previouslyRendered.push(instance);\r\n const { parentVNode, dnode } = instanceMap.get(instance);\r\n const instanceData = widgetInstanceMap.get(instance);\r\n updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance);\r\n }\r\n }\r\n runAfterRenderCallbacks(projectionOptions);\r\n runDeferredRenderCallbacks(projectionOptions);\r\n}\r\nexport const dom = {\r\n append: function (parentNode, instance, projectionOptions = {}) {\r\n const instanceData = widgetInstanceMap.get(instance);\r\n const finalProjectorOptions = getProjectionOptions(projectionOptions, instance);\r\n const projectorState = {\r\n afterRenderCallbacks: [],\r\n deferredRenderCallbacks: [],\r\n nodeMap: new WeakMap(),\r\n renderScheduled: undefined,\r\n renderQueue: [],\r\n merge: projectionOptions.merge || false,\r\n mergeElement: projectionOptions.mergeElement\r\n };\r\n projectorStateMap.set(instance, projectorState);\r\n finalProjectorOptions.rootNode = parentNode;\r\n const parentVNode = toParentVNode(finalProjectorOptions.rootNode);\r\n const node = toInternalWNode(instance, instanceData);\r\n instanceMap.set(instance, { dnode: node, parentVNode });\r\n instanceData.invalidate = () => {\r\n instanceData.dirty = true;\r\n if (instanceData.rendering === false) {\r\n projectorState.renderQueue.push({ instance, depth: finalProjectorOptions.depth });\r\n scheduleRender(finalProjectorOptions);\r\n }\r\n };\r\n updateDom(node, node, finalProjectorOptions, parentVNode, instance);\r\n projectorState.afterRenderCallbacks.push(() => {\r\n instanceData.onAttach();\r\n });\r\n runDeferredRenderCallbacks(finalProjectorOptions);\r\n runAfterRenderCallbacks(finalProjectorOptions);\r\n return {\r\n domNode: finalProjectorOptions.rootNode\r\n };\r\n },\r\n create: function (instance, projectionOptions) {\r\n return this.append(document.createElement('div'), instance, projectionOptions);\r\n },\r\n merge: function (element, instance, projectionOptions = {}) {\r\n projectionOptions.merge = true;\r\n projectionOptions.mergeElement = element;\r\n const projection = this.append(element.parentNode, instance, projectionOptions);\r\n const projectorState = projectorStateMap.get(instance);\r\n projectorState.merge = false;\r\n return projection;\r\n }\r\n};\r\n//# sourceMappingURL=vdom.mjs.map" + "source": "import global from '../shim/global';\r\nimport { from as arrayFrom } from '../shim/array';\r\nimport { isWNode, isVNode, isDomVNode, VNODE, WNODE } from './d';\r\nimport { isWidgetBaseConstructor } from './Registry';\r\nimport WeakMap from '../shim/WeakMap';\r\nconst NAMESPACE_W3 = 'http://www.w3.org/';\r\nconst NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg';\r\nconst NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink';\r\nconst emptyArray = [];\r\nconst nodeOperations = ['focus', 'blur', 'scrollIntoView', 'click'];\r\nexport const widgetInstanceMap = new WeakMap();\r\nconst instanceMap = new WeakMap();\r\nconst nextSiblingMap = new WeakMap();\r\nconst projectorStateMap = new WeakMap();\r\nfunction same(dnode1, dnode2) {\r\n if (isVNode(dnode1) && isVNode(dnode2)) {\r\n if (isDomVNode(dnode1) || isDomVNode(dnode2)) {\r\n if (dnode1.domNode !== dnode2.domNode) {\r\n return false;\r\n }\r\n }\r\n if (dnode1.tag !== dnode2.tag) {\r\n return false;\r\n }\r\n if (dnode1.properties.key !== dnode2.properties.key) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n else if (isWNode(dnode1) && isWNode(dnode2)) {\r\n if (dnode1.instance === undefined && typeof dnode2.widgetConstructor === 'string') {\r\n return false;\r\n }\r\n if (dnode1.widgetConstructor !== dnode2.widgetConstructor) {\r\n return false;\r\n }\r\n if (dnode1.properties.key !== dnode2.properties.key) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n return false;\r\n}\r\nconst missingTransition = function () {\r\n throw new Error('Provide a transitions object to the projectionOptions to do animations');\r\n};\r\nfunction getProjectionOptions(projectorOptions, projectorInstance) {\r\n const defaults = {\r\n namespace: undefined,\r\n styleApplyer: function (domNode, styleName, value) {\r\n domNode.style[styleName] = value;\r\n },\r\n transitions: {\r\n enter: missingTransition,\r\n exit: missingTransition\r\n },\r\n depth: 0,\r\n merge: false,\r\n sync: false,\r\n projectorInstance\r\n };\r\n return Object.assign({}, defaults, projectorOptions);\r\n}\r\nfunction checkStyleValue(styleValue) {\r\n if (typeof styleValue !== 'string') {\r\n throw new Error('Style values must be strings');\r\n }\r\n}\r\nfunction updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n const eventMap = projectorState.nodeMap.get(domNode) || new WeakMap();\r\n if (previousValue) {\r\n const previousEvent = eventMap.get(previousValue);\r\n domNode.removeEventListener(eventName, previousEvent);\r\n }\r\n let callback = currentValue.bind(bind);\r\n if (eventName === 'input') {\r\n callback = function (evt) {\r\n currentValue.call(this, evt);\r\n evt.target['oninput-value'] = evt.target.value;\r\n }.bind(bind);\r\n }\r\n domNode.addEventListener(eventName, callback);\r\n eventMap.set(currentValue, callback);\r\n projectorState.nodeMap.set(domNode, eventMap);\r\n}\r\nfunction addClasses(domNode, classes) {\r\n if (classes) {\r\n const classNames = classes.split(' ');\r\n for (let i = 0; i < classNames.length; i++) {\r\n domNode.classList.add(classNames[i]);\r\n }\r\n }\r\n}\r\nfunction removeClasses(domNode, classes) {\r\n if (classes) {\r\n const classNames = classes.split(' ');\r\n for (let i = 0; i < classNames.length; i++) {\r\n domNode.classList.remove(classNames[i]);\r\n }\r\n }\r\n}\r\nfunction buildPreviousProperties(domNode, previous, current) {\r\n const { diffType, properties, attributes } = current;\r\n if (!diffType || diffType === 'vdom') {\r\n return { properties: previous.properties, attributes: previous.attributes, events: previous.events };\r\n }\r\n else if (diffType === 'none') {\r\n return { properties: {}, attributes: previous.attributes ? {} : undefined, events: previous.events };\r\n }\r\n let newProperties = {\r\n properties: {}\r\n };\r\n if (attributes) {\r\n newProperties.attributes = {};\r\n newProperties.events = previous.events;\r\n Object.keys(properties).forEach((propName) => {\r\n newProperties.properties[propName] = domNode[propName];\r\n });\r\n Object.keys(attributes).forEach((attrName) => {\r\n newProperties.attributes[attrName] = domNode.getAttribute(attrName);\r\n });\r\n return newProperties;\r\n }\r\n newProperties.properties = Object.keys(properties).reduce((props, property) => {\r\n props[property] = domNode.getAttribute(property) || domNode[property];\r\n return props;\r\n }, {});\r\n return newProperties;\r\n}\r\nfunction nodeOperation(propName, propValue, previousValue, domNode, projectionOptions) {\r\n let result;\r\n if (typeof propValue === 'function') {\r\n result = propValue();\r\n }\r\n else {\r\n result = propValue && !previousValue;\r\n }\r\n if (result === true) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectorState.deferredRenderCallbacks.push(() => {\r\n domNode[propName]();\r\n });\r\n }\r\n}\r\nfunction removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions, onlyEvents = false) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n const eventMap = projectorState.nodeMap.get(domNode);\r\n if (eventMap) {\r\n Object.keys(previousProperties).forEach((propName) => {\r\n const isEvent = propName.substr(0, 2) === 'on' || onlyEvents;\r\n const eventName = onlyEvents ? propName : propName.substr(2);\r\n if (isEvent && !properties[propName]) {\r\n const eventCallback = eventMap.get(previousProperties[propName]);\r\n if (eventCallback) {\r\n domNode.removeEventListener(eventName, eventCallback);\r\n }\r\n }\r\n });\r\n }\r\n}\r\nfunction updateAttribute(domNode, attrName, attrValue, projectionOptions) {\r\n if (projectionOptions.namespace === NAMESPACE_SVG && attrName === 'href') {\r\n domNode.setAttributeNS(NAMESPACE_XLINK, attrName, attrValue);\r\n }\r\n else if ((attrName === 'role' && attrValue === '') || attrValue === undefined) {\r\n domNode.removeAttribute(attrName);\r\n }\r\n else {\r\n domNode.setAttribute(attrName, attrValue);\r\n }\r\n}\r\nfunction updateAttributes(domNode, previousAttributes, attributes, projectionOptions) {\r\n const attrNames = Object.keys(attributes);\r\n const attrCount = attrNames.length;\r\n for (let i = 0; i < attrCount; i++) {\r\n const attrName = attrNames[i];\r\n const attrValue = attributes[attrName];\r\n const previousAttrValue = previousAttributes[attrName];\r\n if (attrValue !== previousAttrValue) {\r\n updateAttribute(domNode, attrName, attrValue, projectionOptions);\r\n }\r\n }\r\n}\r\nfunction updateProperties(domNode, previousProperties, properties, projectionOptions, includesEventsAndAttributes = true) {\r\n let propertiesUpdated = false;\r\n const propNames = Object.keys(properties);\r\n const propCount = propNames.length;\r\n if (propNames.indexOf('classes') === -1 && previousProperties.classes) {\r\n if (Array.isArray(previousProperties.classes)) {\r\n for (let i = 0; i < previousProperties.classes.length; i++) {\r\n removeClasses(domNode, previousProperties.classes[i]);\r\n }\r\n }\r\n else {\r\n removeClasses(domNode, previousProperties.classes);\r\n }\r\n }\r\n includesEventsAndAttributes && removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions);\r\n for (let i = 0; i < propCount; i++) {\r\n const propName = propNames[i];\r\n let propValue = properties[propName];\r\n const previousValue = previousProperties[propName];\r\n if (propName === 'classes') {\r\n const previousClasses = Array.isArray(previousValue) ? previousValue : [previousValue];\r\n const currentClasses = Array.isArray(propValue) ? propValue : [propValue];\r\n if (previousClasses && previousClasses.length > 0) {\r\n if (!propValue || propValue.length === 0) {\r\n for (let i = 0; i < previousClasses.length; i++) {\r\n removeClasses(domNode, previousClasses[i]);\r\n }\r\n }\r\n else {\r\n const newClasses = [...currentClasses];\r\n for (let i = 0; i < previousClasses.length; i++) {\r\n const previousClassName = previousClasses[i];\r\n if (previousClassName) {\r\n const classIndex = newClasses.indexOf(previousClassName);\r\n if (classIndex === -1) {\r\n removeClasses(domNode, previousClassName);\r\n }\r\n else {\r\n newClasses.splice(classIndex, 1);\r\n }\r\n }\r\n }\r\n for (let i = 0; i < newClasses.length; i++) {\r\n addClasses(domNode, newClasses[i]);\r\n }\r\n }\r\n }\r\n else {\r\n for (let i = 0; i < currentClasses.length; i++) {\r\n addClasses(domNode, currentClasses[i]);\r\n }\r\n }\r\n }\r\n else if (nodeOperations.indexOf(propName) !== -1) {\r\n nodeOperation(propName, propValue, previousValue, domNode, projectionOptions);\r\n }\r\n else if (propName === 'styles') {\r\n const styleNames = Object.keys(propValue);\r\n const styleCount = styleNames.length;\r\n for (let j = 0; j < styleCount; j++) {\r\n const styleName = styleNames[j];\r\n const newStyleValue = propValue[styleName];\r\n const oldStyleValue = previousValue && previousValue[styleName];\r\n if (newStyleValue === oldStyleValue) {\r\n continue;\r\n }\r\n propertiesUpdated = true;\r\n if (newStyleValue) {\r\n checkStyleValue(newStyleValue);\r\n projectionOptions.styleApplyer(domNode, styleName, newStyleValue);\r\n }\r\n else {\r\n projectionOptions.styleApplyer(domNode, styleName, '');\r\n }\r\n }\r\n }\r\n else {\r\n if (!propValue && typeof previousValue === 'string') {\r\n propValue = '';\r\n }\r\n if (propName === 'value') {\r\n const domValue = domNode[propName];\r\n if (domValue !== propValue &&\r\n (domNode['oninput-value']\r\n ? domValue === domNode['oninput-value']\r\n : propValue !== previousValue)) {\r\n domNode[propName] = propValue;\r\n domNode['oninput-value'] = undefined;\r\n }\r\n if (propValue !== previousValue) {\r\n propertiesUpdated = true;\r\n }\r\n }\r\n else if (propName !== 'key' && propValue !== previousValue) {\r\n const type = typeof propValue;\r\n if (type === 'function' && propName.lastIndexOf('on', 0) === 0 && includesEventsAndAttributes) {\r\n updateEvent(domNode, propName.substr(2), propValue, projectionOptions, properties.bind, previousValue);\r\n }\r\n else if (type === 'string' && propName !== 'innerHTML' && includesEventsAndAttributes) {\r\n updateAttribute(domNode, propName, propValue, projectionOptions);\r\n }\r\n else if (propName === 'scrollLeft' || propName === 'scrollTop') {\r\n if (domNode[propName] !== propValue) {\r\n domNode[propName] = propValue;\r\n }\r\n }\r\n else {\r\n domNode[propName] = propValue;\r\n }\r\n propertiesUpdated = true;\r\n }\r\n }\r\n }\r\n return propertiesUpdated;\r\n}\r\nfunction findIndexOfChild(children, sameAs, start) {\r\n for (let i = start; i < children.length; i++) {\r\n if (same(children[i], sameAs)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\nexport function toParentVNode(domNode) {\r\n return {\r\n tag: '',\r\n properties: {},\r\n children: undefined,\r\n domNode,\r\n type: VNODE\r\n };\r\n}\r\nexport function toTextVNode(data) {\r\n return {\r\n tag: '',\r\n properties: {},\r\n children: undefined,\r\n text: `${data}`,\r\n domNode: undefined,\r\n type: VNODE\r\n };\r\n}\r\nfunction toInternalWNode(instance, instanceData) {\r\n return {\r\n instance,\r\n rendered: [],\r\n coreProperties: instanceData.coreProperties,\r\n children: instance.children,\r\n widgetConstructor: instance.constructor,\r\n properties: instanceData.inputProperties,\r\n type: WNODE\r\n };\r\n}\r\nexport function filterAndDecorateChildren(children, instance) {\r\n if (children === undefined) {\r\n return emptyArray;\r\n }\r\n children = Array.isArray(children) ? children : [children];\r\n for (let i = 0; i < children.length;) {\r\n const child = children[i];\r\n if (child === undefined || child === null) {\r\n children.splice(i, 1);\r\n continue;\r\n }\r\n else if (typeof child === 'string') {\r\n children[i] = toTextVNode(child);\r\n }\r\n else {\r\n if (isVNode(child)) {\r\n if (child.properties.bind === undefined) {\r\n child.properties.bind = instance;\r\n if (child.children && child.children.length > 0) {\r\n filterAndDecorateChildren(child.children, instance);\r\n }\r\n }\r\n }\r\n else {\r\n if (!child.coreProperties) {\r\n const instanceData = widgetInstanceMap.get(instance);\r\n child.coreProperties = {\r\n bind: instance,\r\n baseRegistry: instanceData.coreProperties.baseRegistry\r\n };\r\n }\r\n if (child.children && child.children.length > 0) {\r\n filterAndDecorateChildren(child.children, instance);\r\n }\r\n }\r\n }\r\n i++;\r\n }\r\n return children;\r\n}\r\nfunction nodeAdded(dnode, transitions) {\r\n if (isVNode(dnode) && dnode.properties) {\r\n const enterAnimation = dnode.properties.enterAnimation;\r\n if (enterAnimation) {\r\n if (typeof enterAnimation === 'function') {\r\n enterAnimation(dnode.domNode, dnode.properties);\r\n }\r\n else {\r\n transitions.enter(dnode.domNode, dnode.properties, enterAnimation);\r\n }\r\n }\r\n }\r\n}\r\nfunction nodeToRemove(dnode, transitions, projectionOptions) {\r\n if (isWNode(dnode)) {\r\n const item = instanceMap.get(dnode.instance);\r\n const rendered = (item ? item.dnode.rendered : dnode.rendered) || emptyArray;\r\n if (dnode.instance) {\r\n const instanceData = widgetInstanceMap.get(dnode.instance);\r\n instanceData.onDetach();\r\n instanceMap.delete(dnode.instance);\r\n }\r\n for (let i = 0; i < rendered.length; i++) {\r\n nodeToRemove(rendered[i], transitions, projectionOptions);\r\n }\r\n }\r\n else {\r\n const domNode = dnode.domNode;\r\n const properties = dnode.properties;\r\n if (dnode.children && dnode.children.length > 0) {\r\n for (let i = 0; i < dnode.children.length; i++) {\r\n nodeToRemove(dnode.children[i], transitions, projectionOptions);\r\n }\r\n }\r\n const exitAnimation = properties.exitAnimation;\r\n if (properties && exitAnimation) {\r\n domNode.style.pointerEvents = 'none';\r\n const removeDomNode = function () {\r\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\r\n dnode.domNode = undefined;\r\n };\r\n if (typeof exitAnimation === 'function') {\r\n exitAnimation(domNode, removeDomNode, properties);\r\n return;\r\n }\r\n else {\r\n transitions.exit(dnode.domNode, properties, exitAnimation, removeDomNode);\r\n return;\r\n }\r\n }\r\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\r\n dnode.domNode = undefined;\r\n }\r\n}\r\nfunction checkDistinguishable(childNodes, indexToCheck, parentInstance) {\r\n const childNode = childNodes[indexToCheck];\r\n if (isVNode(childNode) && !childNode.tag) {\r\n return; // Text nodes need not be distinguishable\r\n }\r\n const { key } = childNode.properties;\r\n if (key === undefined || key === null) {\r\n for (let i = 0; i < childNodes.length; i++) {\r\n if (i !== indexToCheck) {\r\n const node = childNodes[i];\r\n if (same(node, childNode)) {\r\n let nodeIdentifier;\r\n const parentName = parentInstance.constructor.name || 'unknown';\r\n if (isWNode(childNode)) {\r\n nodeIdentifier = childNode.widgetConstructor.name || 'unknown';\r\n }\r\n else {\r\n nodeIdentifier = childNode.tag;\r\n }\r\n console.warn(`A widget (${parentName}) has had a child addded or removed, but they were not able to uniquely identified. It is recommended to provide a unique 'key' property when using the same widget or element (${nodeIdentifier}) multiple times as siblings`);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\nfunction updateChildren(parentVNode, siblings, oldChildren, newChildren, parentInstance, projectionOptions) {\r\n oldChildren = oldChildren || emptyArray;\r\n newChildren = newChildren;\r\n const oldChildrenLength = oldChildren.length;\r\n const newChildrenLength = newChildren.length;\r\n const transitions = projectionOptions.transitions;\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\r\n let oldIndex = 0;\r\n let newIndex = 0;\r\n let i;\r\n let textUpdated = false;\r\n while (newIndex < newChildrenLength) {\r\n let oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : undefined;\r\n const newChild = newChildren[newIndex];\r\n if (isVNode(newChild) && typeof newChild.deferredPropertiesCallback === 'function') {\r\n newChild.inserted = isVNode(oldChild) && oldChild.inserted;\r\n addDeferredProperties(newChild, projectionOptions);\r\n }\r\n if (oldChild !== undefined && same(oldChild, newChild)) {\r\n oldIndex++;\r\n newIndex++;\r\n textUpdated =\r\n updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance, oldChildren.slice(oldIndex), newChildren.slice(newIndex)) || textUpdated;\r\n continue;\r\n }\r\n const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);\r\n const addChild = () => {\r\n let insertBeforeDomNode = undefined;\r\n let childrenArray = oldChildren;\r\n let nextIndex = oldIndex + 1;\r\n let child = oldChildren[oldIndex];\r\n if (!child) {\r\n child = siblings[0];\r\n nextIndex = 1;\r\n childrenArray = siblings;\r\n }\r\n if (child) {\r\n let insertBeforeChildren = [child];\r\n while (insertBeforeChildren.length) {\r\n const insertBefore = insertBeforeChildren.shift();\r\n if (isWNode(insertBefore)) {\r\n const item = instanceMap.get(insertBefore.instance);\r\n if (item && item.dnode.rendered) {\r\n insertBeforeChildren.push(...item.dnode.rendered);\r\n }\r\n }\r\n else {\r\n if (insertBefore.domNode) {\r\n if (insertBefore.domNode.parentElement !== parentVNode.domNode) {\r\n break;\r\n }\r\n insertBeforeDomNode = insertBefore.domNode;\r\n break;\r\n }\r\n }\r\n if (insertBeforeChildren.length === 0 && childrenArray[nextIndex]) {\r\n insertBeforeChildren.push(childrenArray[nextIndex]);\r\n nextIndex++;\r\n }\r\n }\r\n }\r\n createDom(newChild, parentVNode, newChildren.slice(newIndex + 1), insertBeforeDomNode, projectionOptions, parentInstance);\r\n nodeAdded(newChild, transitions);\r\n const indexToCheck = newIndex;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(newChildren, indexToCheck, parentInstance);\r\n });\r\n };\r\n if (!oldChild || findOldIndex === -1) {\r\n addChild();\r\n newIndex++;\r\n continue;\r\n }\r\n const removeChild = () => {\r\n const indexToCheck = oldIndex;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\r\n });\r\n if (isWNode(oldChild)) {\r\n const item = instanceMap.get(oldChild.instance);\r\n if (item) {\r\n oldChild = item.dnode;\r\n }\r\n }\r\n nodeToRemove(oldChild, transitions, projectionOptions);\r\n };\r\n const findNewIndex = findIndexOfChild(newChildren, oldChild, newIndex + 1);\r\n if (findNewIndex === -1) {\r\n removeChild();\r\n oldIndex++;\r\n continue;\r\n }\r\n addChild();\r\n removeChild();\r\n oldIndex++;\r\n newIndex++;\r\n }\r\n if (oldChildrenLength > oldIndex) {\r\n // Remove child fragments\r\n for (i = oldIndex; i < oldChildrenLength; i++) {\r\n const indexToCheck = i;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\r\n });\r\n let childToRemove = oldChildren[i];\r\n if (isWNode(childToRemove)) {\r\n const item = instanceMap.get(childToRemove.instance);\r\n if (item) {\r\n childToRemove = item.dnode;\r\n }\r\n }\r\n nodeToRemove(childToRemove, transitions, projectionOptions);\r\n }\r\n }\r\n return textUpdated;\r\n}\r\nfunction addChildren(parentVNode, children, projectionOptions, parentInstance, insertBefore = undefined, childNodes) {\r\n if (children === undefined) {\r\n return;\r\n }\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectorState.merge && childNodes === undefined) {\r\n childNodes = arrayFrom(parentVNode.domNode.childNodes);\r\n }\r\n const transitions = projectionOptions.transitions;\r\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n const nextSiblings = children.slice(i + 1);\r\n if (isVNode(child)) {\r\n if (projectorState.merge && childNodes) {\r\n let domElement = undefined;\r\n while (child.domNode === undefined && childNodes.length > 0) {\r\n domElement = childNodes.shift();\r\n if (domElement && domElement.tagName === (child.tag.toUpperCase() || undefined)) {\r\n child.domNode = domElement;\r\n }\r\n }\r\n }\r\n createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance);\r\n }\r\n else {\r\n createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes);\r\n }\r\n nodeAdded(child, transitions);\r\n }\r\n}\r\nfunction initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions) {\r\n addChildren(dnode, dnode.children, projectionOptions, parentInstance, undefined);\r\n if (typeof dnode.deferredPropertiesCallback === 'function' && dnode.inserted === undefined) {\r\n addDeferredProperties(dnode, projectionOptions);\r\n }\r\n if (dnode.attributes && dnode.events) {\r\n updateAttributes(domNode, {}, dnode.attributes, projectionOptions);\r\n updateProperties(domNode, {}, dnode.properties, projectionOptions, false);\r\n removeOrphanedEvents(domNode, {}, dnode.events, projectionOptions, true);\r\n const events = dnode.events;\r\n Object.keys(events).forEach((event) => {\r\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind);\r\n });\r\n }\r\n else {\r\n updateProperties(domNode, {}, dnode.properties, projectionOptions);\r\n }\r\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\r\n const instanceData = widgetInstanceMap.get(parentInstance);\r\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\r\n }\r\n dnode.inserted = true;\r\n}\r\nfunction createDom(dnode, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes) {\r\n let domNode;\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (isWNode(dnode)) {\r\n let { widgetConstructor } = dnode;\r\n const parentInstanceData = widgetInstanceMap.get(parentInstance);\r\n if (!isWidgetBaseConstructor(widgetConstructor)) {\r\n const item = parentInstanceData.registry().get(widgetConstructor);\r\n if (item === null) {\r\n return;\r\n }\r\n widgetConstructor = item;\r\n }\r\n const instance = new widgetConstructor();\r\n dnode.instance = instance;\r\n nextSiblingMap.set(instance, nextSiblings);\r\n const instanceData = widgetInstanceMap.get(instance);\r\n instanceData.invalidate = () => {\r\n instanceData.dirty = true;\r\n if (instanceData.rendering === false) {\r\n projectorState.renderQueue.push({ instance, depth: projectionOptions.depth });\r\n scheduleRender(projectionOptions);\r\n }\r\n };\r\n instanceData.rendering = true;\r\n instance.__setCoreProperties__(dnode.coreProperties);\r\n instance.__setChildren__(dnode.children);\r\n instance.__setProperties__(dnode.properties);\r\n const rendered = instance.__render__();\r\n instanceData.rendering = false;\r\n if (rendered) {\r\n const filteredRendered = filterAndDecorateChildren(rendered, instance);\r\n dnode.rendered = filteredRendered;\r\n addChildren(parentVNode, filteredRendered, projectionOptions, instance, insertBefore, childNodes);\r\n }\r\n instanceMap.set(instance, { dnode, parentVNode });\r\n instanceData.nodeHandler.addRoot();\r\n projectorState.afterRenderCallbacks.push(() => {\r\n instanceData.onAttach();\r\n });\r\n }\r\n else {\r\n if (projectorState.merge && projectorState.mergeElement !== undefined) {\r\n domNode = dnode.domNode = projectionOptions.mergeElement;\r\n projectorState.mergeElement = undefined;\r\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\r\n return;\r\n }\r\n const doc = parentVNode.domNode.ownerDocument;\r\n if (!dnode.tag && typeof dnode.text === 'string') {\r\n if (dnode.domNode !== undefined && parentVNode.domNode) {\r\n const newDomNode = dnode.domNode.ownerDocument.createTextNode(dnode.text);\r\n if (parentVNode.domNode === dnode.domNode.parentNode) {\r\n parentVNode.domNode.replaceChild(newDomNode, dnode.domNode);\r\n }\r\n else {\r\n parentVNode.domNode.appendChild(newDomNode);\r\n dnode.domNode.parentNode && dnode.domNode.parentNode.removeChild(dnode.domNode);\r\n }\r\n dnode.domNode = newDomNode;\r\n }\r\n else {\r\n domNode = dnode.domNode = doc.createTextNode(dnode.text);\r\n if (insertBefore !== undefined) {\r\n parentVNode.domNode.insertBefore(domNode, insertBefore);\r\n }\r\n else {\r\n parentVNode.domNode.appendChild(domNode);\r\n }\r\n }\r\n }\r\n else {\r\n if (dnode.domNode === undefined) {\r\n if (dnode.tag === 'svg') {\r\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\r\n }\r\n if (projectionOptions.namespace !== undefined) {\r\n domNode = dnode.domNode = doc.createElementNS(projectionOptions.namespace, dnode.tag);\r\n }\r\n else {\r\n domNode = dnode.domNode = dnode.domNode || doc.createElement(dnode.tag);\r\n }\r\n }\r\n else {\r\n domNode = dnode.domNode;\r\n }\r\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\r\n if (insertBefore !== undefined) {\r\n parentVNode.domNode.insertBefore(domNode, insertBefore);\r\n }\r\n else if (domNode.parentNode !== parentVNode.domNode) {\r\n parentVNode.domNode.appendChild(domNode);\r\n }\r\n }\r\n }\r\n}\r\nfunction updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance, oldNextSiblings, nextSiblings) {\r\n if (isWNode(dnode)) {\r\n const { instance } = previous;\r\n const { parentVNode, dnode: node } = instanceMap.get(instance);\r\n const previousRendered = node ? node.rendered : previous.rendered;\r\n const instanceData = widgetInstanceMap.get(instance);\r\n instanceData.rendering = true;\r\n instance.__setCoreProperties__(dnode.coreProperties);\r\n instance.__setChildren__(dnode.children);\r\n instance.__setProperties__(dnode.properties);\r\n nextSiblingMap.set(instance, nextSiblings);\r\n dnode.instance = instance;\r\n if (instanceData.dirty === true) {\r\n const rendered = instance.__render__();\r\n instanceData.rendering = false;\r\n dnode.rendered = filterAndDecorateChildren(rendered, instance);\r\n updateChildren(parentVNode, oldNextSiblings, previousRendered, dnode.rendered, instance, projectionOptions);\r\n }\r\n else {\r\n instanceData.rendering = false;\r\n dnode.rendered = previousRendered;\r\n }\r\n instanceMap.set(instance, { dnode, parentVNode });\r\n instanceData.nodeHandler.addRoot();\r\n }\r\n else {\r\n if (previous === dnode) {\r\n return false;\r\n }\r\n const domNode = (dnode.domNode = previous.domNode);\r\n let textUpdated = false;\r\n let updated = false;\r\n if (!dnode.tag && typeof dnode.text === 'string') {\r\n if (dnode.text !== previous.text) {\r\n const newDomNode = domNode.ownerDocument.createTextNode(dnode.text);\r\n domNode.parentNode.replaceChild(newDomNode, domNode);\r\n dnode.domNode = newDomNode;\r\n textUpdated = true;\r\n return textUpdated;\r\n }\r\n }\r\n else {\r\n if (dnode.tag && dnode.tag.lastIndexOf('svg', 0) === 0) {\r\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\r\n }\r\n if (previous.children !== dnode.children) {\r\n const children = filterAndDecorateChildren(dnode.children, parentInstance);\r\n dnode.children = children;\r\n updated =\r\n updateChildren(dnode, oldNextSiblings, previous.children, children, parentInstance, projectionOptions) || updated;\r\n }\r\n const previousProperties = buildPreviousProperties(domNode, previous, dnode);\r\n if (dnode.attributes && dnode.events) {\r\n updateAttributes(domNode, previousProperties.attributes, dnode.attributes, projectionOptions);\r\n updated =\r\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions, false) || updated;\r\n removeOrphanedEvents(domNode, previousProperties.events, dnode.events, projectionOptions, true);\r\n const events = dnode.events;\r\n Object.keys(events).forEach((event) => {\r\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind, previousProperties.events[event]);\r\n });\r\n }\r\n else {\r\n updated =\r\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions) ||\r\n updated;\r\n }\r\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\r\n const instanceData = widgetInstanceMap.get(parentInstance);\r\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\r\n }\r\n }\r\n if (updated && dnode.properties && dnode.properties.updateAnimation) {\r\n dnode.properties.updateAnimation(domNode, dnode.properties, previous.properties);\r\n }\r\n }\r\n}\r\nfunction addDeferredProperties(vnode, projectionOptions) {\r\n // transfer any properties that have been passed - as these must be decorated properties\r\n vnode.decoratedDeferredProperties = vnode.properties;\r\n const properties = vnode.deferredPropertiesCallback(!!vnode.inserted);\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n vnode.properties = Object.assign({}, properties, vnode.decoratedDeferredProperties);\r\n projectorState.deferredRenderCallbacks.push(() => {\r\n const properties = Object.assign({}, vnode.deferredPropertiesCallback(!!vnode.inserted), vnode.decoratedDeferredProperties);\r\n updateProperties(vnode.domNode, vnode.properties, properties, projectionOptions);\r\n vnode.properties = properties;\r\n });\r\n}\r\nfunction runDeferredRenderCallbacks(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectorState.deferredRenderCallbacks.length) {\r\n if (projectionOptions.sync) {\r\n while (projectorState.deferredRenderCallbacks.length) {\r\n const callback = projectorState.deferredRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n }\r\n else {\r\n global.requestAnimationFrame(() => {\r\n while (projectorState.deferredRenderCallbacks.length) {\r\n const callback = projectorState.deferredRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n }\r\n}\r\nfunction runAfterRenderCallbacks(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectionOptions.sync) {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n }\r\n else {\r\n if (global.requestIdleCallback) {\r\n global.requestIdleCallback(() => {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n else {\r\n setTimeout(() => {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n }\r\n}\r\nfunction scheduleRender(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectionOptions.sync) {\r\n render(projectionOptions);\r\n }\r\n else if (projectorState.renderScheduled === undefined) {\r\n projectorState.renderScheduled = global.requestAnimationFrame(() => {\r\n render(projectionOptions);\r\n });\r\n }\r\n}\r\nfunction render(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectorState.renderScheduled = undefined;\r\n const renderQueue = projectorState.renderQueue;\r\n const renders = [...renderQueue];\r\n projectorState.renderQueue = [];\r\n renders.sort((a, b) => a.depth - b.depth);\r\n const previouslyRendered = [];\r\n while (renders.length) {\r\n const { instance } = renders.shift();\r\n if (instanceMap.has(instance) && previouslyRendered.indexOf(instance) === -1) {\r\n previouslyRendered.push(instance);\r\n const { parentVNode, dnode } = instanceMap.get(instance);\r\n const instanceData = widgetInstanceMap.get(instance);\r\n const nextSiblings = nextSiblingMap.get(instance);\r\n updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance, nextSiblings, nextSiblings);\r\n }\r\n }\r\n runAfterRenderCallbacks(projectionOptions);\r\n runDeferredRenderCallbacks(projectionOptions);\r\n}\r\nexport const dom = {\r\n append: function (parentNode, instance, projectionOptions = {}) {\r\n const instanceData = widgetInstanceMap.get(instance);\r\n const finalProjectorOptions = getProjectionOptions(projectionOptions, instance);\r\n const projectorState = {\r\n afterRenderCallbacks: [],\r\n deferredRenderCallbacks: [],\r\n nodeMap: new WeakMap(),\r\n renderScheduled: undefined,\r\n renderQueue: [],\r\n merge: projectionOptions.merge || false,\r\n mergeElement: projectionOptions.mergeElement\r\n };\r\n projectorStateMap.set(instance, projectorState);\r\n finalProjectorOptions.rootNode = parentNode;\r\n const parentVNode = toParentVNode(finalProjectorOptions.rootNode);\r\n const node = toInternalWNode(instance, instanceData);\r\n instanceMap.set(instance, { dnode: node, parentVNode });\r\n instanceData.invalidate = () => {\r\n instanceData.dirty = true;\r\n if (instanceData.rendering === false) {\r\n projectorState.renderQueue.push({ instance, depth: finalProjectorOptions.depth });\r\n scheduleRender(finalProjectorOptions);\r\n }\r\n };\r\n updateDom(node, node, finalProjectorOptions, parentVNode, instance, [], []);\r\n projectorState.afterRenderCallbacks.push(() => {\r\n instanceData.onAttach();\r\n });\r\n runDeferredRenderCallbacks(finalProjectorOptions);\r\n runAfterRenderCallbacks(finalProjectorOptions);\r\n return {\r\n domNode: finalProjectorOptions.rootNode\r\n };\r\n },\r\n create: function (instance, projectionOptions) {\r\n return this.append(document.createElement('div'), instance, projectionOptions);\r\n },\r\n merge: function (element, instance, projectionOptions = {}) {\r\n projectionOptions.merge = true;\r\n projectionOptions.mergeElement = element;\r\n const projection = this.append(element.parentNode, instance, projectionOptions);\r\n const projectorState = projectorStateMap.get(instance);\r\n projectorState.merge = false;\r\n return projection;\r\n }\r\n};\r\n//# sourceMappingURL=vdom.mjs.map" }, { "id": "./node_modules/imports-loader/index.js?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js", @@ -2332,7 +2341,7 @@ "name": "./node_modules/imports-loader?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js", "index": 1, "index2": 41, - "size": 286, + "size": 296, "cacheable": true, "built": true, "optional": false, @@ -2362,7 +2371,7 @@ "providedExports": null, "optimizationBailout": [], "depth": 1, - "source": "/*** IMPORTS FROM imports-loader ***/\nvar widgetFactory = require(\"src/menu-item/MenuItem\");\n\nvar registerCustomElement = require('@dojo/widget-core/registerCustomElement').default;\r\n\r\nvar defaultExport = widgetFactory.default;\r\ndefaultExport && registerCustomElement(defaultExport);\r\n\n" + "source": "/*** IMPORTS FROM imports-loader ***/\nvar widgetFactory = require(\"src/menu-item/MenuItem\");\n\nvar registerCustomElement = require('@dojo/framework/widget-core/registerCustomElement').default;\r\n\r\nvar defaultExport = widgetFactory.default;\r\ndefaultExport && registerCustomElement(defaultExport);\r\n\n" }, { "id": "./node_modules/process/browser.js", @@ -2379,21 +2388,21 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\has\\has.mjs", - "issuerId": "./node_modules/@dojo/has/has.mjs", - "issuerName": "./node_modules/@dojo/has/has.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\has\\has.mjs", + "issuerId": "./node_modules/@dojo/framework/has/has.mjs", + "issuerName": "./node_modules/@dojo/framework/has/has.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/has/has.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\has\\has.mjs", - "module": "./node_modules/@dojo/has/has.mjs", - "moduleName": "./node_modules/@dojo/has/has.mjs", + "moduleId": "./node_modules/@dojo/framework/has/has.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\has\\has.mjs", + "module": "./node_modules/@dojo/framework/has/has.mjs", + "moduleName": "./node_modules/@dojo/framework/has/has.mjs", "type": "cjs require", "userRequest": "process", - "loc": "1:0-37" + "loc": "1:0-40" } ], "usedExports": true, @@ -2417,18 +2426,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "tslib", "loc": "1:0-33" @@ -2443,19 +2452,19 @@ "loc": "1:0-33" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "tslib", "loc": "1:0-33" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "tslib", "loc": "1:0-33" @@ -2463,7 +2472,6 @@ ], "usedExports": [ "__decorate", - "__metadata", "__rest" ], "providedExports": [ @@ -2504,30 +2512,30 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\global.mjs", - "issuerId": "./node_modules/@dojo/shim/global.mjs", - "issuerName": "./node_modules/@dojo/shim/global.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\global.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/global.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/global.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/global.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\global.mjs", - "module": "./node_modules/@dojo/shim/global.mjs", - "moduleName": "./node_modules/@dojo/shim/global.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/global.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\global.mjs", + "module": "./node_modules/@dojo/framework/shim/global.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/global.mjs", "type": "cjs require", "userRequest": "global", - "loc": "1:0-44" + "loc": "1:0-47" }, { - "moduleId": "./node_modules/@dojo/has/has.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\has\\has.mjs", - "module": "./node_modules/@dojo/has/has.mjs", - "moduleName": "./node_modules/@dojo/has/has.mjs", + "moduleId": "./node_modules/@dojo/framework/has/has.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\has\\has.mjs", + "module": "./node_modules/@dojo/framework/has/has.mjs", + "moduleName": "./node_modules/@dojo/framework/has/has.mjs", "type": "cjs require", "userRequest": "global", - "loc": "1:0-44" + "loc": "1:0-47" } ], "usedExports": true, @@ -2542,7 +2550,7 @@ "name": "./src/menu-item/MenuItem.ts", "index": 2, "index2": 40, - "size": 1126, + "size": 1166, "cacheable": true, "built": true, "optional": false, @@ -2575,7 +2583,7 @@ ], "optimizationBailout": [], "depth": 2, - "source": "import * as tslib_1 from \"tslib\";\r\nimport { v } from '@dojo/widget-core/d';\r\nimport { customElement } from '@dojo/widget-core/decorators/customElement';\r\nimport { theme, ThemedMixin } from '@dojo/widget-core/mixins/Themed';\r\nimport { WidgetBase } from '@dojo/widget-core/WidgetBase';\r\nimport * as css from './menuItem.m.css';\r\nlet MenuItem = class MenuItem extends ThemedMixin(WidgetBase) {\r\n _onClick() {\r\n this.properties.onSelected && this.properties.onSelected(this.properties.data);\r\n }\r\n render() {\r\n const { title, selected } = this.properties;\r\n return v('li', { classes: this.theme(css.root) }, [\r\n v('span', {\r\n classes: this.theme([css.item, selected ? css.selected : null]),\r\n onclick: this._onClick\r\n }, [title])\r\n ]);\r\n }\r\n};\r\nMenuItem = tslib_1.__decorate([\r\n customElement({\r\n tag: 'demo-menu-item',\r\n attributes: ['title', 'selected'],\r\n events: ['onSelected'],\r\n properties: ['data', 'selected']\r\n }),\r\n theme(css)\r\n], MenuItem);\r\nexport { MenuItem };\r\nexport default MenuItem;\r\n" + "source": "import * as tslib_1 from \"tslib\";\r\nimport { v } from '@dojo/framework/widget-core/d';\r\nimport { customElement } from '@dojo/framework/widget-core/decorators/customElement';\r\nimport { theme, ThemedMixin } from '@dojo/framework/widget-core/mixins/Themed';\r\nimport { WidgetBase } from '@dojo/framework/widget-core/WidgetBase';\r\nimport * as css from './menuItem.m.css';\r\nlet MenuItem = class MenuItem extends ThemedMixin(WidgetBase) {\r\n _onClick() {\r\n this.properties.onSelected && this.properties.onSelected(this.properties.data);\r\n }\r\n render() {\r\n const { title, selected } = this.properties;\r\n return v('li', { classes: this.theme(css.root) }, [\r\n v('span', {\r\n classes: this.theme([css.item, selected ? css.selected : null]),\r\n onclick: this._onClick\r\n }, [title])\r\n ]);\r\n }\r\n};\r\nMenuItem = tslib_1.__decorate([\r\n customElement({\r\n tag: 'demo-menu-item',\r\n attributes: ['title', 'selected'],\r\n events: ['onSelected'],\r\n properties: ['data', 'selected']\r\n }),\r\n theme(css)\r\n], MenuItem);\r\nexport { MenuItem };\r\nexport default MenuItem;\r\n" }, { "id": "./src/menu-item/menuItem.m.css", @@ -2632,12 +2640,12 @@ ], "modules": [ { - "id": "./node_modules/@dojo/core/Destroyable.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Destroyable.mjs", - "name": "./node_modules/@dojo/core/Destroyable.mjs", + "id": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Destroyable.mjs", + "name": "./node_modules/@dojo/framework/core/Destroyable.mjs", "index": 25, "index2": 17, - "size": 1668, + "size": 1665, "cacheable": true, "built": true, "optional": false, @@ -2646,18 +2654,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Evented.mjs", - "issuerId": "./node_modules/@dojo/core/Evented.mjs", - "issuerName": "./node_modules/@dojo/core/Evented.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Evented.mjs", + "issuerId": "./node_modules/@dojo/framework/core/Evented.mjs", + "issuerName": "./node_modules/@dojo/framework/core/Evented.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/core/Evented.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Evented.mjs", - "module": "./node_modules/@dojo/core/Evented.mjs", - "moduleName": "./node_modules/@dojo/core/Evented.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Evented.mjs", + "module": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Evented.mjs", "type": "harmony import", "userRequest": "./Destroyable", "loc": "2:0-44" @@ -2672,15 +2680,15 @@ ], "optimizationBailout": [], "depth": 6, - "source": "import { createCompositeHandle } from './lang';\nimport Promise from '@dojo/shim/Promise';\n/**\n * No operation function to replace own once instance is destoryed\n */\nfunction noop() {\n return Promise.resolve(false);\n}\n/**\n * No op function used to replace own, once instance has been destoryed\n */\nfunction destroyed() {\n throw new Error('Call made to destroyed method');\n}\nexport class Destroyable {\n /**\n * @constructor\n */\n constructor() {\n this.handles = [];\n }\n /**\n * Register handles for the instance that will be destroyed when `this.destroy` is called\n *\n * @param {Handle} handle The handle to add for the instance\n * @returns {Handle} a handle for the handle, removes the handle for the instance and calls destroy\n */\n own(handles) {\n const handle = Array.isArray(handles) ? createCompositeHandle(...handles) : handles;\n const { handles: _handles } = this;\n _handles.push(handle);\n return {\n destroy() {\n _handles.splice(_handles.indexOf(handle));\n handle.destroy();\n }\n };\n }\n /**\n * Destrpys all handers registered for the instance\n *\n * @returns {Promise {\n this.handles.forEach((handle) => {\n handle && handle.destroy && handle.destroy();\n });\n this.destroy = noop;\n this.own = destroyed;\n resolve(true);\n });\n }\n}\nexport default Destroyable;\n//# sourceMappingURL=Destroyable.mjs.map" + "source": "import { createCompositeHandle } from './lang';\nimport Promise from '../shim/Promise';\n/**\n * No operation function to replace own once instance is destoryed\n */\nfunction noop() {\n return Promise.resolve(false);\n}\n/**\n * No op function used to replace own, once instance has been destoryed\n */\nfunction destroyed() {\n throw new Error('Call made to destroyed method');\n}\nexport class Destroyable {\n /**\n * @constructor\n */\n constructor() {\n this.handles = [];\n }\n /**\n * Register handles for the instance that will be destroyed when `this.destroy` is called\n *\n * @param {Handle} handle The handle to add for the instance\n * @returns {Handle} a handle for the handle, removes the handle for the instance and calls destroy\n */\n own(handles) {\n const handle = Array.isArray(handles) ? createCompositeHandle(...handles) : handles;\n const { handles: _handles } = this;\n _handles.push(handle);\n return {\n destroy() {\n _handles.splice(_handles.indexOf(handle));\n handle.destroy();\n }\n };\n }\n /**\n * Destrpys all handers registered for the instance\n *\n * @returns {Promise {\n this.handles.forEach((handle) => {\n handle && handle.destroy && handle.destroy();\n });\n this.destroy = noop;\n this.own = destroyed;\n resolve(true);\n });\n }\n}\nexport default Destroyable;\n//# sourceMappingURL=Destroyable.mjs.map" }, { - "id": "./node_modules/@dojo/core/Evented.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Evented.mjs", - "name": "./node_modules/@dojo/core/Evented.mjs", + "id": "./node_modules/@dojo/framework/core/Evented.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Evented.mjs", + "name": "./node_modules/@dojo/framework/core/Evented.mjs", "index": 24, "index2": 18, - "size": 2220, + "size": 2222, "cacheable": true, "built": true, "optional": false, @@ -2689,48 +2697,48 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\RegistryHandler.mjs", - "issuerId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "issuerName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\RegistryHandler.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\RegistryHandler.mjs", - "module": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\RegistryHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "2:0-45" + "userRequest": "../core/Evented", + "loc": "2:0-42" }, { - "moduleId": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\NodeHandler.mjs", - "module": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "1:0-45" + "userRequest": "../core/Evented", + "loc": "4:0-42" }, { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Injector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Injector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Injector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Injector.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "4:0-45" + "userRequest": "../core/Evented", + "loc": "1:0-42" }, { - "moduleId": "./node_modules/@dojo/widget-core/Injector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Injector.mjs", - "module": "./node_modules/@dojo/widget-core/Injector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Injector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\NodeHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "1:0-45" + "userRequest": "../core/Evented", + "loc": "1:0-42" } ], "usedExports": [ @@ -2743,15 +2751,15 @@ ], "optimizationBailout": [], "depth": 5, - "source": "import Map from '@dojo/shim/Map';\r\nimport { Destroyable } from './Destroyable';\r\n/**\r\n * Map of computed regular expressions, keyed by string\r\n */\r\nconst regexMap = new Map();\r\n/**\r\n * Determines is the event type glob has been matched\r\n *\r\n * @returns boolean that indicates if the glob is matched\r\n */\r\nexport function isGlobMatch(globString, targetString) {\r\n if (typeof targetString === 'string' && typeof globString === 'string' && globString.indexOf('*') !== -1) {\r\n let regex;\r\n if (regexMap.has(globString)) {\r\n regex = regexMap.get(globString);\r\n }\r\n else {\r\n regex = new RegExp(`^${globString.replace(/\\*/g, '.*')}$`);\r\n regexMap.set(globString, regex);\r\n }\r\n return regex.test(targetString);\r\n }\r\n else {\r\n return globString === targetString;\r\n }\r\n}\r\n/**\r\n * Event Class\r\n */\r\nexport class Evented extends Destroyable {\r\n constructor() {\r\n super(...arguments);\r\n /**\r\n * map of listeners keyed by event type\r\n */\r\n this.listenersMap = new Map();\r\n }\r\n emit(event) {\r\n this.listenersMap.forEach((methods, type) => {\r\n if (isGlobMatch(type, event.type)) {\r\n methods.forEach((method) => {\r\n method.call(this, event);\r\n });\r\n }\r\n });\r\n }\r\n on(type, listener) {\r\n if (Array.isArray(listener)) {\r\n const handles = listener.map((listener) => this._addListener(type, listener));\r\n return {\r\n destroy() {\r\n handles.forEach((handle) => handle.destroy());\r\n }\r\n };\r\n }\r\n return this._addListener(type, listener);\r\n }\r\n _addListener(type, listener) {\r\n const listeners = this.listenersMap.get(type) || [];\r\n listeners.push(listener);\r\n this.listenersMap.set(type, listeners);\r\n return {\r\n destroy: () => {\r\n const listeners = this.listenersMap.get(type) || [];\r\n listeners.splice(listeners.indexOf(listener), 1);\r\n }\r\n };\r\n }\r\n}\r\nexport default Evented;\r\n//# sourceMappingURL=Evented.mjs.map" + "source": "import Map from '../shim/Map';\r\nimport { Destroyable } from './Destroyable';\r\n/**\r\n * Map of computed regular expressions, keyed by string\r\n */\r\nconst regexMap = new Map();\r\n/**\r\n * Determines is the event type glob has been matched\r\n *\r\n * @returns boolean that indicates if the glob is matched\r\n */\r\nexport function isGlobMatch(globString, targetString) {\r\n if (typeof targetString === 'string' && typeof globString === 'string' && globString.indexOf('*') !== -1) {\r\n let regex;\r\n if (regexMap.has(globString)) {\r\n regex = regexMap.get(globString);\r\n }\r\n else {\r\n regex = new RegExp(`^${globString.replace(/\\*/g, '.*')}$`);\r\n regexMap.set(globString, regex);\r\n }\r\n return regex.test(targetString);\r\n }\r\n else {\r\n return globString === targetString;\r\n }\r\n}\r\n/**\r\n * Event Class\r\n */\r\nexport class Evented extends Destroyable {\r\n constructor() {\r\n super(...arguments);\r\n /**\r\n * map of listeners keyed by event type\r\n */\r\n this.listenersMap = new Map();\r\n }\r\n emit(event) {\r\n this.listenersMap.forEach((methods, type) => {\r\n if (isGlobMatch(type, event.type)) {\r\n [...methods].forEach((method) => {\r\n method.call(this, event);\r\n });\r\n }\r\n });\r\n }\r\n on(type, listener) {\r\n if (Array.isArray(listener)) {\r\n const handles = listener.map((listener) => this._addListener(type, listener));\r\n return {\r\n destroy() {\r\n handles.forEach((handle) => handle.destroy());\r\n }\r\n };\r\n }\r\n return this._addListener(type, listener);\r\n }\r\n _addListener(type, listener) {\r\n const listeners = this.listenersMap.get(type) || [];\r\n listeners.push(listener);\r\n this.listenersMap.set(type, listeners);\r\n return {\r\n destroy: () => {\r\n const listeners = this.listenersMap.get(type) || [];\r\n listeners.splice(listeners.indexOf(listener), 1);\r\n }\r\n };\r\n }\r\n}\r\nexport default Evented;\r\n//# sourceMappingURL=Evented.mjs.map" }, { - "id": "./node_modules/@dojo/core/lang.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\lang.mjs", - "name": "./node_modules/@dojo/core/lang.mjs", + "id": "./node_modules/@dojo/framework/core/lang.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\lang.mjs", + "name": "./node_modules/@dojo/framework/core/lang.mjs", "index": 26, "index2": 16, - "size": 6843, + "size": 6837, "cacheable": true, "built": true, "optional": false, @@ -2760,27 +2768,27 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", - "userRequest": "@dojo/core/lang", + "userRequest": "../../core/lang", "loc": "2:0-41" }, { - "moduleId": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Destroyable.mjs", - "module": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleName": "./node_modules/@dojo/core/Destroyable.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Destroyable.mjs", + "module": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Destroyable.mjs", "type": "harmony import", "userRequest": "./lang", "loc": "1:0-47" @@ -2805,12 +2813,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { assign } from '@dojo/shim/object';\nexport { assign } from '@dojo/shim/object';\nconst slice = Array.prototype.slice;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Type guard that ensures that the value can be coerced to Object\n * to weed out host objects that do not derive from Object.\n * This function is used to check if we want to deep copy an object or not.\n * Note: In ES6 it is possible to modify an object's Symbol.toStringTag property, which will\n * change the value returned by `toString`. This is a rare edge case that is difficult to handle,\n * so it is not handled here.\n * @param value The value to check\n * @return If the value is coercible into an Object\n */\nfunction shouldDeepCopyObject(value) {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\nfunction copyArray(array, inherited) {\n return array.map(function (item) {\n if (Array.isArray(item)) {\n return copyArray(item, inherited);\n }\n return !shouldDeepCopyObject(item)\n ? item\n : _mixin({\n deep: true,\n inherited: inherited,\n sources: [item],\n target: {}\n });\n });\n}\nfunction _mixin(kwArgs) {\n const deep = kwArgs.deep;\n const inherited = kwArgs.inherited;\n const target = kwArgs.target;\n const copied = kwArgs.copied || [];\n const copiedClone = [...copied];\n for (let i = 0; i < kwArgs.sources.length; i++) {\n const source = kwArgs.sources[i];\n if (source === null || source === undefined) {\n continue;\n }\n for (let key in source) {\n if (inherited || hasOwnProperty.call(source, key)) {\n let value = source[key];\n if (copiedClone.indexOf(value) !== -1) {\n continue;\n }\n if (deep) {\n if (Array.isArray(value)) {\n value = copyArray(value, inherited);\n }\n else if (shouldDeepCopyObject(value)) {\n const targetValue = target[key] || {};\n copied.push(source);\n value = _mixin({\n deep: true,\n inherited: inherited,\n sources: [value],\n target: targetValue,\n copied\n });\n }\n }\n target[key] = value;\n }\n }\n }\n return target;\n}\nexport function create(prototype, ...mixins) {\n if (!mixins.length) {\n throw new RangeError('lang.create requires at least one mixin object.');\n }\n const args = mixins.slice();\n args.unshift(Object.create(prototype));\n return assign.apply(null, args);\n}\nexport function deepAssign(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: false,\n sources: sources,\n target: target\n });\n}\nexport function deepMixin(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Creates a new object using the provided source's prototype as the prototype for the new object, and then\n * deep copies the provided source's values into the new target.\n *\n * @param source The object to duplicate\n * @return The new object\n */\nexport function duplicate(source) {\n const target = Object.create(Object.getPrototypeOf(source));\n return deepMixin(target, source);\n}\n/**\n * Determines whether two values are the same value.\n *\n * @param a First value to compare\n * @param b Second value to compare\n * @return true if the values are the same; false otherwise\n */\nexport function isIdentical(a, b) {\n return (a === b ||\n /* both values are NaN */\n (a !== a && b !== b));\n}\n/**\n * Returns a function that binds a method to the specified object at runtime. This is similar to\n * `Function.prototype.bind`, but instead of a function it takes the name of a method on an object.\n * As a result, the function returned by `lateBind` will always call the function currently assigned to\n * the specified property on the object as of the moment the function it returns is called.\n *\n * @param instance The context object\n * @param method The name of the method on the context object to bind to itself\n * @param suppliedArgs An optional array of values to prepend to the `instance[method]` arguments list\n * @return The bound function\n */\nexport function lateBind(instance, method, ...suppliedArgs) {\n return suppliedArgs.length\n ? function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n // TS7017\n return instance[method].apply(instance, args);\n }\n : function () {\n // TS7017\n return instance[method].apply(instance, arguments);\n };\n}\nexport function mixin(target, ...sources) {\n return _mixin({\n deep: false,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Returns a function which invokes the given function with the given arguments prepended to its argument list.\n * Like `Function.prototype.bind`, but does not alter execution context.\n *\n * @param targetFunction The function that needs to be bound\n * @param suppliedArgs An optional array of arguments to prepend to the `targetFunction` arguments list\n * @return The bound function\n */\nexport function partial(targetFunction, ...suppliedArgs) {\n return function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n return targetFunction.apply(this, args);\n };\n}\n/**\n * Returns an object with a destroy method that, when called, calls the passed-in destructor.\n * This is intended to provide a unified interface for creating \"remove\" / \"destroy\" handlers for\n * event listeners, timers, etc.\n *\n * @param destructor A function that will be called when the handle's `destroy` method is invoked\n * @return The handle object\n */\nexport function createHandle(destructor) {\n let called = false;\n return {\n destroy: function () {\n if (!called) {\n called = true;\n destructor();\n }\n }\n };\n}\n/**\n * Returns a single handle that can be used to destroy multiple handles simultaneously.\n *\n * @param handles An array of handles with `destroy` methods\n * @return The handle object\n */\nexport function createCompositeHandle(...handles) {\n return createHandle(function () {\n for (let i = 0; i < handles.length; i++) {\n handles[i].destroy();\n }\n });\n}\n//# sourceMappingURL=lang.mjs.map" + "source": "import { assign } from '../shim/object';\nexport { assign } from '../shim/object';\nconst slice = Array.prototype.slice;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Type guard that ensures that the value can be coerced to Object\n * to weed out host objects that do not derive from Object.\n * This function is used to check if we want to deep copy an object or not.\n * Note: In ES6 it is possible to modify an object's Symbol.toStringTag property, which will\n * change the value returned by `toString`. This is a rare edge case that is difficult to handle,\n * so it is not handled here.\n * @param value The value to check\n * @return If the value is coercible into an Object\n */\nfunction shouldDeepCopyObject(value) {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\nfunction copyArray(array, inherited) {\n return array.map(function (item) {\n if (Array.isArray(item)) {\n return copyArray(item, inherited);\n }\n return !shouldDeepCopyObject(item)\n ? item\n : _mixin({\n deep: true,\n inherited: inherited,\n sources: [item],\n target: {}\n });\n });\n}\nfunction _mixin(kwArgs) {\n const deep = kwArgs.deep;\n const inherited = kwArgs.inherited;\n const target = kwArgs.target;\n const copied = kwArgs.copied || [];\n const copiedClone = [...copied];\n for (let i = 0; i < kwArgs.sources.length; i++) {\n const source = kwArgs.sources[i];\n if (source === null || source === undefined) {\n continue;\n }\n for (let key in source) {\n if (inherited || hasOwnProperty.call(source, key)) {\n let value = source[key];\n if (copiedClone.indexOf(value) !== -1) {\n continue;\n }\n if (deep) {\n if (Array.isArray(value)) {\n value = copyArray(value, inherited);\n }\n else if (shouldDeepCopyObject(value)) {\n const targetValue = target[key] || {};\n copied.push(source);\n value = _mixin({\n deep: true,\n inherited: inherited,\n sources: [value],\n target: targetValue,\n copied\n });\n }\n }\n target[key] = value;\n }\n }\n }\n return target;\n}\nexport function create(prototype, ...mixins) {\n if (!mixins.length) {\n throw new RangeError('lang.create requires at least one mixin object.');\n }\n const args = mixins.slice();\n args.unshift(Object.create(prototype));\n return assign.apply(null, args);\n}\nexport function deepAssign(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: false,\n sources: sources,\n target: target\n });\n}\nexport function deepMixin(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Creates a new object using the provided source's prototype as the prototype for the new object, and then\n * deep copies the provided source's values into the new target.\n *\n * @param source The object to duplicate\n * @return The new object\n */\nexport function duplicate(source) {\n const target = Object.create(Object.getPrototypeOf(source));\n return deepMixin(target, source);\n}\n/**\n * Determines whether two values are the same value.\n *\n * @param a First value to compare\n * @param b Second value to compare\n * @return true if the values are the same; false otherwise\n */\nexport function isIdentical(a, b) {\n return (a === b ||\n /* both values are NaN */\n (a !== a && b !== b));\n}\n/**\n * Returns a function that binds a method to the specified object at runtime. This is similar to\n * `Function.prototype.bind`, but instead of a function it takes the name of a method on an object.\n * As a result, the function returned by `lateBind` will always call the function currently assigned to\n * the specified property on the object as of the moment the function it returns is called.\n *\n * @param instance The context object\n * @param method The name of the method on the context object to bind to itself\n * @param suppliedArgs An optional array of values to prepend to the `instance[method]` arguments list\n * @return The bound function\n */\nexport function lateBind(instance, method, ...suppliedArgs) {\n return suppliedArgs.length\n ? function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n // TS7017\n return instance[method].apply(instance, args);\n }\n : function () {\n // TS7017\n return instance[method].apply(instance, arguments);\n };\n}\nexport function mixin(target, ...sources) {\n return _mixin({\n deep: false,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Returns a function which invokes the given function with the given arguments prepended to its argument list.\n * Like `Function.prototype.bind`, but does not alter execution context.\n *\n * @param targetFunction The function that needs to be bound\n * @param suppliedArgs An optional array of arguments to prepend to the `targetFunction` arguments list\n * @return The bound function\n */\nexport function partial(targetFunction, ...suppliedArgs) {\n return function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n return targetFunction.apply(this, args);\n };\n}\n/**\n * Returns an object with a destroy method that, when called, calls the passed-in destructor.\n * This is intended to provide a unified interface for creating \"remove\" / \"destroy\" handlers for\n * event listeners, timers, etc.\n *\n * @param destructor A function that will be called when the handle's `destroy` method is invoked\n * @return The handle object\n */\nexport function createHandle(destructor) {\n let called = false;\n return {\n destroy: function () {\n if (!called) {\n called = true;\n destructor();\n }\n }\n };\n}\n/**\n * Returns a single handle that can be used to destroy multiple handles simultaneously.\n *\n * @param handles An array of handles with `destroy` methods\n * @return The handle object\n */\nexport function createCompositeHandle(...handles) {\n return createHandle(function () {\n for (let i = 0; i < handles.length; i++) {\n handles[i].destroy();\n }\n });\n}\n//# sourceMappingURL=lang.mjs.map" }, { - "id": "./node_modules/@dojo/has/has.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\has\\has.mjs", - "name": "./node_modules/@dojo/has/has.mjs", + "id": "./node_modules/@dojo/framework/has/has.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\has\\has.mjs", + "name": "./node_modules/@dojo/framework/has/has.mjs", "index": 7, "index2": 3, "size": 6500, @@ -2822,29 +2830,29 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\has.mjs", - "issuerId": "./node_modules/@dojo/shim/support/has.mjs", - "issuerName": "./node_modules/@dojo/shim/support/has.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\has.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/support/has.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/support/has.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\has.mjs", - "module": "./node_modules/@dojo/shim/support/has.mjs", - "moduleName": "./node_modules/@dojo/shim/support/has.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\has.mjs", + "module": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/has.mjs", "type": "harmony import", - "userRequest": "@dojo/has/has", + "userRequest": "../../has/has", "loc": "1:0-41" }, { - "moduleId": "./node_modules/@dojo/shim/support/has.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\has.mjs", - "module": "./node_modules/@dojo/shim/support/has.mjs", - "moduleName": "./node_modules/@dojo/shim/support/has.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\has.mjs", + "module": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/has.mjs", "type": "harmony import", - "userRequest": "@dojo/has/has", + "userRequest": "../../has/has", "loc": "4:0-30" } ], @@ -2866,9 +2874,9 @@ "source": "function isFeatureTestThenable(value) {\r\n return value && value.then;\r\n}\r\n/**\r\n * A cache of results of feature tests\r\n */\r\nexport const testCache = {};\r\n/**\r\n * A cache of the un-resolved feature tests\r\n */\r\nexport const testFunctions = {};\r\n/**\r\n * A cache of unresolved thenables (probably promises)\r\n * @type {{}}\r\n */\r\nconst testThenables = {};\r\n/**\r\n * A reference to the global scope (`window` in a browser, `global` in NodeJS)\r\n */\r\nconst globalScope = (function () {\r\n /* istanbul ignore else */\r\n if (typeof window !== 'undefined') {\r\n // Browsers\r\n return window;\r\n }\r\n else if (typeof global !== 'undefined') {\r\n // Node\r\n return global;\r\n }\r\n else if (typeof self !== 'undefined') {\r\n // Web workers\r\n return self;\r\n }\r\n /* istanbul ignore next */\r\n return {};\r\n})();\r\n/* Grab the staticFeatures if there are available */\r\nconst { staticFeatures } = globalScope.DojoHasEnvironment || {};\r\n/* Cleaning up the DojoHasEnviornment */\r\nif ('DojoHasEnvironment' in globalScope) {\r\n delete globalScope.DojoHasEnvironment;\r\n}\r\n/**\r\n * Custom type guard to narrow the `staticFeatures` to either a map or a function that\r\n * returns a map.\r\n *\r\n * @param value The value to guard for\r\n */\r\nfunction isStaticFeatureFunction(value) {\r\n return typeof value === 'function';\r\n}\r\n/**\r\n * The cache of asserted features that were available in the global scope when the\r\n * module loaded\r\n */\r\nconst staticCache = staticFeatures\r\n ? isStaticFeatureFunction(staticFeatures) ? staticFeatures.apply(globalScope) : staticFeatures\r\n : {}; /* Providing an empty cache, if none was in the environment\r\n\r\n/**\r\n* AMD plugin function.\r\n*\r\n* Conditional loads modules based on a has feature test value.\r\n*\r\n* @param resourceId Gives the resolved module id to load.\r\n* @param require The loader require function with respect to the module that contained the plugin resource in its\r\n* dependency list.\r\n* @param load Callback to loader that consumes result of plugin demand.\r\n*/\r\nexport function load(resourceId, require, load, config) {\r\n resourceId ? require([resourceId], load) : load();\r\n}\r\n/**\r\n * AMD plugin function.\r\n *\r\n * Resolves resourceId into a module id based on possibly-nested tenary expression that branches on has feature test\r\n * value(s).\r\n *\r\n * @param resourceId The id of the module\r\n * @param normalize Resolves a relative module id into an absolute module id\r\n */\r\nexport function normalize(resourceId, normalize) {\r\n const tokens = resourceId.match(/[\\?:]|[^:\\?]*/g) || [];\r\n let i = 0;\r\n function get(skip) {\r\n const term = tokens[i++];\r\n if (term === ':') {\r\n // empty string module name, resolves to null\r\n return null;\r\n }\r\n else {\r\n // postfixed with a ? means it is a feature to branch on, the term is the name of the feature\r\n if (tokens[i++] === '?') {\r\n if (!skip && has(term)) {\r\n // matched the feature, get the first value from the options\r\n return get();\r\n }\r\n else {\r\n // did not match, get the second value, passing over the first\r\n get(true);\r\n return get(skip);\r\n }\r\n }\r\n // a module\r\n return term;\r\n }\r\n }\r\n const id = get();\r\n return id && normalize(id);\r\n}\r\n/**\r\n * Check if a feature has already been registered\r\n *\r\n * @param feature the name of the feature\r\n */\r\nexport function exists(feature) {\r\n const normalizedFeature = feature.toLowerCase();\r\n return Boolean(normalizedFeature in staticCache || normalizedFeature in testCache || testFunctions[normalizedFeature]);\r\n}\r\n/**\r\n * Register a new test for a named feature.\r\n *\r\n * @example\r\n * has.add('dom-addeventlistener', !!document.addEventListener);\r\n *\r\n * @example\r\n * has.add('touch-events', function () {\r\n * return 'ontouchstart' in document\r\n * });\r\n *\r\n * @param feature the name of the feature\r\n * @param value the value reported of the feature, or a function that will be executed once on first test\r\n * @param overwrite if an existing value should be overwritten. Defaults to false.\r\n */\r\nexport function add(feature, value, overwrite = false) {\r\n const normalizedFeature = feature.toLowerCase();\r\n if (exists(normalizedFeature) && !overwrite && !(normalizedFeature in staticCache)) {\r\n throw new TypeError(`Feature \"${feature}\" exists and overwrite not true.`);\r\n }\r\n if (typeof value === 'function') {\r\n testFunctions[normalizedFeature] = value;\r\n }\r\n else if (isFeatureTestThenable(value)) {\r\n testThenables[feature] = value.then((resolvedValue) => {\r\n testCache[feature] = resolvedValue;\r\n delete testThenables[feature];\r\n }, () => {\r\n delete testThenables[feature];\r\n });\r\n }\r\n else {\r\n testCache[normalizedFeature] = value;\r\n delete testFunctions[normalizedFeature];\r\n }\r\n}\r\n/**\r\n * Return the current value of a named feature.\r\n *\r\n * @param feature The name (if a string) or identifier (if an integer) of the feature to test.\r\n */\r\nexport default function has(feature) {\r\n let result;\r\n const normalizedFeature = feature.toLowerCase();\r\n if (normalizedFeature in staticCache) {\r\n result = staticCache[normalizedFeature];\r\n }\r\n else if (testFunctions[normalizedFeature]) {\r\n result = testCache[normalizedFeature] = testFunctions[normalizedFeature].call(null);\r\n delete testFunctions[normalizedFeature];\r\n }\r\n else if (normalizedFeature in testCache) {\r\n result = testCache[normalizedFeature];\r\n }\r\n else if (feature in testThenables) {\r\n return false;\r\n }\r\n else {\r\n throw new TypeError(`Attempt to detect unregistered has feature \"${feature}\"`);\r\n }\r\n return result;\r\n}\r\n/*\r\n * Out of the box feature tests\r\n */\r\n/* Environments */\r\n/* Used as a value to provide a debug only code path */\r\nadd('debug', true);\r\n/* Detects if the environment is \"browser like\" */\r\nadd('host-browser', typeof document !== 'undefined' && typeof location !== 'undefined');\r\n/* Detects if the environment appears to be NodeJS */\r\nadd('host-node', function () {\r\n if (typeof process === 'object' && process.versions && process.versions.node) {\r\n return process.versions.node;\r\n }\r\n});\r\n//# sourceMappingURL=has.mjs.map" }, { - "id": "./node_modules/@dojo/shim/Map.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "name": "./node_modules/@dojo/shim/Map.mjs", + "id": "./node_modules/@dojo/framework/shim/Map.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "name": "./node_modules/@dojo/framework/shim/Map.mjs", "index": 15, "index2": 12, "size": 3426, @@ -2880,57 +2888,57 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "1:0-33" + "userRequest": "../shim/Map", + "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\RegistryHandler.mjs", - "module": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\RegistryHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "1:0-37" + "userRequest": "../shim/Map", + "loc": "1:0-34" }, { - "moduleId": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\NodeHandler.mjs", - "module": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "2:0-33" + "userRequest": "../shim/Map", + "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\NodeHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "2:0-33" + "userRequest": "../shim/Map", + "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/core/Evented.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Evented.mjs", - "module": "./node_modules/@dojo/core/Evented.mjs", - "moduleName": "./node_modules/@dojo/core/Evented.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Evented.mjs", + "module": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Evented.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "1:0-33" + "userRequest": "../shim/Map", + "loc": "1:0-30" } ], "usedExports": [ @@ -2946,9 +2954,9 @@ "source": "import { isArrayLike, ShimIterator } from './iterator';\r\nimport global from './global';\r\nimport { is as objectIs } from './object';\r\nimport has from './support/has';\r\nimport './Symbol';\r\nexport let Map = global.Map;\r\nif (!true) {\r\n Map = (_a = class Map {\r\n constructor(iterable) {\r\n this._keys = [];\r\n this._values = [];\r\n this[Symbol.toStringTag] = 'Map';\r\n if (iterable) {\r\n if (isArrayLike(iterable)) {\r\n for (let i = 0; i < iterable.length; i++) {\r\n const value = iterable[i];\r\n this.set(value[0], value[1]);\r\n }\r\n }\r\n else {\r\n for (const value of iterable) {\r\n this.set(value[0], value[1]);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * An alternative to Array.prototype.indexOf using Object.is\r\n * to check for equality. See http://mzl.la/1zuKO2V\r\n */\r\n _indexOfKey(keys, key) {\r\n for (let i = 0, length = keys.length; i < length; i++) {\r\n if (objectIs(keys[i], key)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n get size() {\r\n return this._keys.length;\r\n }\r\n clear() {\r\n this._keys.length = this._values.length = 0;\r\n }\r\n delete(key) {\r\n const index = this._indexOfKey(this._keys, key);\r\n if (index < 0) {\r\n return false;\r\n }\r\n this._keys.splice(index, 1);\r\n this._values.splice(index, 1);\r\n return true;\r\n }\r\n entries() {\r\n const values = this._keys.map((key, i) => {\r\n return [key, this._values[i]];\r\n });\r\n return new ShimIterator(values);\r\n }\r\n forEach(callback, context) {\r\n const keys = this._keys;\r\n const values = this._values;\r\n for (let i = 0, length = keys.length; i < length; i++) {\r\n callback.call(context, values[i], keys[i], this);\r\n }\r\n }\r\n get(key) {\r\n const index = this._indexOfKey(this._keys, key);\r\n return index < 0 ? undefined : this._values[index];\r\n }\r\n has(key) {\r\n return this._indexOfKey(this._keys, key) > -1;\r\n }\r\n keys() {\r\n return new ShimIterator(this._keys);\r\n }\r\n set(key, value) {\r\n let index = this._indexOfKey(this._keys, key);\r\n index = index < 0 ? this._keys.length : index;\r\n this._keys[index] = key;\r\n this._values[index] = value;\r\n return this;\r\n }\r\n values() {\r\n return new ShimIterator(this._values);\r\n }\r\n [Symbol.iterator]() {\r\n return this.entries();\r\n }\r\n },\r\n _a[Symbol.species] = _a,\r\n _a);\r\n}\r\nexport default Map;\r\nvar _a;\r\n//# sourceMappingURL=Map.mjs.map" }, { - "id": "./node_modules/@dojo/shim/Promise.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Promise.mjs", - "name": "./node_modules/@dojo/shim/Promise.mjs", + "id": "./node_modules/@dojo/framework/shim/Promise.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Promise.mjs", + "name": "./node_modules/@dojo/framework/shim/Promise.mjs", "index": 22, "index2": 15, "size": 8717, @@ -2960,30 +2968,30 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Registry.mjs", - "issuerId": "./node_modules/@dojo/widget-core/Registry.mjs", - "issuerName": "./node_modules/@dojo/widget-core/Registry.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Registry.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Promise", - "loc": "1:0-41" + "userRequest": "../shim/Promise", + "loc": "1:0-38" }, { - "moduleId": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Destroyable.mjs", - "module": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleName": "./node_modules/@dojo/core/Destroyable.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Destroyable.mjs", + "module": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Destroyable.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Promise", - "loc": "2:0-41" + "userRequest": "../shim/Promise", + "loc": "2:0-38" } ], "usedExports": [ @@ -2999,9 +3007,9 @@ "source": "import global from './global';\r\nimport { queueMicroTask } from './support/queue';\r\nimport './Symbol';\r\nimport has from './support/has';\r\nexport let ShimPromise = global.Promise;\r\nexport const isThenable = function isThenable(value) {\r\n return value && typeof value.then === 'function';\r\n};\r\nif (!true) {\r\n global.Promise = ShimPromise = (_a = class Promise {\r\n /**\r\n * Creates a new Promise.\r\n *\r\n * @constructor\r\n *\r\n * @param executor\r\n * The executor function is called immediately when the Promise is instantiated. It is responsible for\r\n * starting the asynchronous operation when it is invoked.\r\n *\r\n * The executor must call either the passed `resolve` function when the asynchronous operation has completed\r\n * successfully, or the `reject` function when the operation fails.\r\n */\r\n constructor(executor) {\r\n /**\r\n * The current state of this promise.\r\n */\r\n this.state = 1 /* Pending */;\r\n this[Symbol.toStringTag] = 'Promise';\r\n /**\r\n * If true, the resolution of this promise is chained (\"locked in\") to another promise.\r\n */\r\n let isChained = false;\r\n /**\r\n * Whether or not this promise is in a resolved state.\r\n */\r\n const isResolved = () => {\r\n return this.state !== 1 /* Pending */ || isChained;\r\n };\r\n /**\r\n * Callbacks that should be invoked once the asynchronous operation has completed.\r\n */\r\n let callbacks = [];\r\n /**\r\n * Initially pushes callbacks onto a queue for execution once this promise settles. After the promise settles,\r\n * enqueues callbacks for execution on the next event loop turn.\r\n */\r\n let whenFinished = function (callback) {\r\n if (callbacks) {\r\n callbacks.push(callback);\r\n }\r\n };\r\n /**\r\n * Settles this promise.\r\n *\r\n * @param newState The resolved state for this promise.\r\n * @param {T|any} value The resolved value for this promise.\r\n */\r\n const settle = (newState, value) => {\r\n // A promise can only be settled once.\r\n if (this.state !== 1 /* Pending */) {\r\n return;\r\n }\r\n this.state = newState;\r\n this.resolvedValue = value;\r\n whenFinished = queueMicroTask;\r\n // Only enqueue a callback runner if there are callbacks so that initially fulfilled Promises don't have to\r\n // wait an extra turn.\r\n if (callbacks && callbacks.length > 0) {\r\n queueMicroTask(function () {\r\n if (callbacks) {\r\n let count = callbacks.length;\r\n for (let i = 0; i < count; ++i) {\r\n callbacks[i].call(null);\r\n }\r\n callbacks = null;\r\n }\r\n });\r\n }\r\n };\r\n /**\r\n * Resolves this promise.\r\n *\r\n * @param newState The resolved state for this promise.\r\n * @param {T|any} value The resolved value for this promise.\r\n */\r\n const resolve = (newState, value) => {\r\n if (isResolved()) {\r\n return;\r\n }\r\n if (isThenable(value)) {\r\n value.then(settle.bind(null, 0 /* Fulfilled */), settle.bind(null, 2 /* Rejected */));\r\n isChained = true;\r\n }\r\n else {\r\n settle(newState, value);\r\n }\r\n };\r\n this.then = (onFulfilled, onRejected) => {\r\n return new Promise((resolve, reject) => {\r\n // whenFinished initially queues up callbacks for execution after the promise has settled. Once the\r\n // promise has settled, whenFinished will schedule callbacks for execution on the next turn through the\r\n // event loop.\r\n whenFinished(() => {\r\n const callback = this.state === 2 /* Rejected */ ? onRejected : onFulfilled;\r\n if (typeof callback === 'function') {\r\n try {\r\n resolve(callback(this.resolvedValue));\r\n }\r\n catch (error) {\r\n reject(error);\r\n }\r\n }\r\n else if (this.state === 2 /* Rejected */) {\r\n reject(this.resolvedValue);\r\n }\r\n else {\r\n resolve(this.resolvedValue);\r\n }\r\n });\r\n });\r\n };\r\n try {\r\n executor(resolve.bind(null, 0 /* Fulfilled */), resolve.bind(null, 2 /* Rejected */));\r\n }\r\n catch (error) {\r\n settle(2 /* Rejected */, error);\r\n }\r\n }\r\n static all(iterable) {\r\n return new this(function (resolve, reject) {\r\n const values = [];\r\n let complete = 0;\r\n let total = 0;\r\n let populating = true;\r\n function fulfill(index, value) {\r\n values[index] = value;\r\n ++complete;\r\n finish();\r\n }\r\n function finish() {\r\n if (populating || complete < total) {\r\n return;\r\n }\r\n resolve(values);\r\n }\r\n function processItem(index, item) {\r\n ++total;\r\n if (isThenable(item)) {\r\n // If an item Promise rejects, this Promise is immediately rejected with the item\r\n // Promise's rejection error.\r\n item.then(fulfill.bind(null, index), reject);\r\n }\r\n else {\r\n Promise.resolve(item).then(fulfill.bind(null, index));\r\n }\r\n }\r\n let i = 0;\r\n for (const value of iterable) {\r\n processItem(i, value);\r\n i++;\r\n }\r\n populating = false;\r\n finish();\r\n });\r\n }\r\n static race(iterable) {\r\n return new this(function (resolve, reject) {\r\n for (const item of iterable) {\r\n if (item instanceof Promise) {\r\n // If a Promise item rejects, this Promise is immediately rejected with the item\r\n // Promise's rejection error.\r\n item.then(resolve, reject);\r\n }\r\n else {\r\n Promise.resolve(item).then(resolve);\r\n }\r\n }\r\n });\r\n }\r\n static reject(reason) {\r\n return new this(function (resolve, reject) {\r\n reject(reason);\r\n });\r\n }\r\n static resolve(value) {\r\n return new this(function (resolve) {\r\n resolve(value);\r\n });\r\n }\r\n catch(onRejected) {\r\n return this.then(undefined, onRejected);\r\n }\r\n },\r\n _a[Symbol.species] = ShimPromise,\r\n _a);\r\n}\r\nexport default ShimPromise;\r\nvar _a;\r\n//# sourceMappingURL=Promise.mjs.map" }, { - "id": "./node_modules/@dojo/shim/Symbol.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Symbol.mjs", - "name": "./node_modules/@dojo/shim/Symbol.mjs", + "id": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Symbol.mjs", + "name": "./node_modules/@dojo/framework/shim/Symbol.mjs", "index": 5, "index2": 7, "size": 6073, @@ -3013,81 +3021,81 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Symbol", - "loc": "3:0-39" - }, - { - "moduleId": "./node_modules/@dojo/widget-core/d.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\d.mjs", - "module": "./node_modules/@dojo/widget-core/d.mjs", - "moduleName": "./node_modules/@dojo/widget-core/d.mjs", - "type": "harmony import", - "userRequest": "@dojo/shim/Symbol", - "loc": "1:0-39" + "userRequest": "../shim/Symbol", + "loc": "3:0-36" }, { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/d.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\d.mjs", + "module": "./node_modules/@dojo/framework/widget-core/d.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/d.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Symbol", - "loc": "3:0-39" + "userRequest": "../shim/Symbol", + "loc": "1:0-36" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "5:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "4:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/iterator.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\iterator.mjs", - "module": "./node_modules/@dojo/shim/iterator.mjs", - "moduleName": "./node_modules/@dojo/shim/iterator.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "type": "harmony import", + "userRequest": "../shim/Symbol", + "loc": "3:0-36" + }, + { + "moduleId": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\iterator.mjs", + "module": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/iterator.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "1:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "3:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/object.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\object.mjs", - "module": "./node_modules/@dojo/shim/object.mjs", - "moduleName": "./node_modules/@dojo/shim/object.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\object.mjs", + "module": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/object.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "3:0-36" @@ -3106,9 +3114,9 @@ "source": "import has from './support/has';\r\nimport global from './global';\r\nimport { getValueDescriptor } from './support/util';\r\nexport let Symbol = global.Symbol;\r\nif (!true) {\r\n /**\r\n * Throws if the value is not a symbol, used internally within the Shim\r\n * @param {any} value The value to check\r\n * @return {symbol} Returns the symbol or throws\r\n */\r\n const validateSymbol = function validateSymbol(value) {\r\n if (!isSymbol(value)) {\r\n throw new TypeError(value + ' is not a symbol');\r\n }\r\n return value;\r\n };\r\n const defineProperties = Object.defineProperties;\r\n const defineProperty = Object.defineProperty;\r\n const create = Object.create;\r\n const objPrototype = Object.prototype;\r\n const globalSymbols = {};\r\n const getSymbolName = (function () {\r\n const created = create(null);\r\n return function (desc) {\r\n let postfix = 0;\r\n let name;\r\n while (created[String(desc) + (postfix || '')]) {\r\n ++postfix;\r\n }\r\n desc += String(postfix || '');\r\n created[desc] = true;\r\n name = '@@' + desc;\r\n // FIXME: Temporary guard until the duplicate execution when testing can be\r\n // pinned down.\r\n if (!Object.getOwnPropertyDescriptor(objPrototype, name)) {\r\n defineProperty(objPrototype, name, {\r\n set: function (value) {\r\n defineProperty(this, name, getValueDescriptor(value));\r\n }\r\n });\r\n }\r\n return name;\r\n };\r\n })();\r\n const InternalSymbol = function Symbol(description) {\r\n if (this instanceof InternalSymbol) {\r\n throw new TypeError('TypeError: Symbol is not a constructor');\r\n }\r\n return Symbol(description);\r\n };\r\n Symbol = global.Symbol = function Symbol(description) {\r\n if (this instanceof Symbol) {\r\n throw new TypeError('TypeError: Symbol is not a constructor');\r\n }\r\n const sym = Object.create(InternalSymbol.prototype);\r\n description = description === undefined ? '' : String(description);\r\n return defineProperties(sym, {\r\n __description__: getValueDescriptor(description),\r\n __name__: getValueDescriptor(getSymbolName(description))\r\n });\r\n };\r\n /* Decorate the Symbol function with the appropriate properties */\r\n defineProperty(Symbol, 'for', getValueDescriptor(function (key) {\r\n if (globalSymbols[key]) {\r\n return globalSymbols[key];\r\n }\r\n return (globalSymbols[key] = Symbol(String(key)));\r\n }));\r\n defineProperties(Symbol, {\r\n keyFor: getValueDescriptor(function (sym) {\r\n let key;\r\n validateSymbol(sym);\r\n for (key in globalSymbols) {\r\n if (globalSymbols[key] === sym) {\r\n return key;\r\n }\r\n }\r\n }),\r\n hasInstance: getValueDescriptor(Symbol.for('hasInstance'), false, false),\r\n isConcatSpreadable: getValueDescriptor(Symbol.for('isConcatSpreadable'), false, false),\r\n iterator: getValueDescriptor(Symbol.for('iterator'), false, false),\r\n match: getValueDescriptor(Symbol.for('match'), false, false),\r\n observable: getValueDescriptor(Symbol.for('observable'), false, false),\r\n replace: getValueDescriptor(Symbol.for('replace'), false, false),\r\n search: getValueDescriptor(Symbol.for('search'), false, false),\r\n species: getValueDescriptor(Symbol.for('species'), false, false),\r\n split: getValueDescriptor(Symbol.for('split'), false, false),\r\n toPrimitive: getValueDescriptor(Symbol.for('toPrimitive'), false, false),\r\n toStringTag: getValueDescriptor(Symbol.for('toStringTag'), false, false),\r\n unscopables: getValueDescriptor(Symbol.for('unscopables'), false, false)\r\n });\r\n /* Decorate the InternalSymbol object */\r\n defineProperties(InternalSymbol.prototype, {\r\n constructor: getValueDescriptor(Symbol),\r\n toString: getValueDescriptor(function () {\r\n return this.__name__;\r\n }, false, false)\r\n });\r\n /* Decorate the Symbol.prototype */\r\n defineProperties(Symbol.prototype, {\r\n toString: getValueDescriptor(function () {\r\n return 'Symbol (' + validateSymbol(this).__description__ + ')';\r\n }),\r\n valueOf: getValueDescriptor(function () {\r\n return validateSymbol(this);\r\n })\r\n });\r\n defineProperty(Symbol.prototype, Symbol.toPrimitive, getValueDescriptor(function () {\r\n return validateSymbol(this);\r\n }));\r\n defineProperty(Symbol.prototype, Symbol.toStringTag, getValueDescriptor('Symbol', false, false, true));\r\n defineProperty(InternalSymbol.prototype, Symbol.toPrimitive, getValueDescriptor(Symbol.prototype[Symbol.toPrimitive], false, false, true));\r\n defineProperty(InternalSymbol.prototype, Symbol.toStringTag, getValueDescriptor(Symbol.prototype[Symbol.toStringTag], false, false, true));\r\n}\r\n/**\r\n * A custom guard function that determines if an object is a symbol or not\r\n * @param {any} value The value to check to see if it is a symbol or not\r\n * @return {is symbol} Returns true if a symbol or not (and narrows the type guard)\r\n */\r\nexport function isSymbol(value) {\r\n return (value && (typeof value === 'symbol' || value['@@toStringTag'] === 'Symbol')) || false;\r\n}\r\n/**\r\n * Fill any missing well known symbols if the native Symbol is missing them\r\n */\r\n[\r\n 'hasInstance',\r\n 'isConcatSpreadable',\r\n 'iterator',\r\n 'species',\r\n 'replace',\r\n 'search',\r\n 'split',\r\n 'match',\r\n 'toPrimitive',\r\n 'toStringTag',\r\n 'unscopables',\r\n 'observable'\r\n].forEach((wellKnown) => {\r\n if (!Symbol[wellKnown]) {\r\n Object.defineProperty(Symbol, wellKnown, getValueDescriptor(Symbol.for(wellKnown), false, false));\r\n }\r\n});\r\nexport default Symbol;\r\n//# sourceMappingURL=Symbol.mjs.map" }, { - "id": "./node_modules/@dojo/shim/WeakMap.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\WeakMap.mjs", - "name": "./node_modules/@dojo/shim/WeakMap.mjs", + "id": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\WeakMap.mjs", + "name": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "index": 19, "index2": 13, "size": 3858, @@ -3120,39 +3128,39 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/WeakMap", - "loc": "2:0-41" + "userRequest": "../shim/WeakMap", + "loc": "2:0-38" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\inject.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/WeakMap", - "loc": "5:0-41" + "userRequest": "../../shim/WeakMap", + "loc": "1:0-41" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\inject.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/WeakMap", - "loc": "1:0-41" + "userRequest": "../shim/WeakMap", + "loc": "5:0-38" } ], "usedExports": [ @@ -3167,9 +3175,9 @@ "source": "import global from './global';\r\nimport { isArrayLike } from './iterator';\r\nimport has from './support/has';\r\nimport './Symbol';\r\nexport let WeakMap = global.WeakMap;\r\nif (!true) {\r\n const DELETED = {};\r\n const getUID = function getUID() {\r\n return Math.floor(Math.random() * 100000000);\r\n };\r\n const generateName = (function () {\r\n let startId = Math.floor(Date.now() % 100000000);\r\n return function generateName() {\r\n return '__wm' + getUID() + (startId++ + '__');\r\n };\r\n })();\r\n WeakMap = class WeakMap {\r\n constructor(iterable) {\r\n this[Symbol.toStringTag] = 'WeakMap';\r\n this._name = generateName();\r\n this._frozenEntries = [];\r\n if (iterable) {\r\n if (isArrayLike(iterable)) {\r\n for (let i = 0; i < iterable.length; i++) {\r\n const item = iterable[i];\r\n this.set(item[0], item[1]);\r\n }\r\n }\r\n else {\r\n for (const [key, value] of iterable) {\r\n this.set(key, value);\r\n }\r\n }\r\n }\r\n }\r\n _getFrozenEntryIndex(key) {\r\n for (let i = 0; i < this._frozenEntries.length; i++) {\r\n if (this._frozenEntries[i].key === key) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n delete(key) {\r\n if (key === undefined || key === null) {\r\n return false;\r\n }\r\n const entry = key[this._name];\r\n if (entry && entry.key === key && entry.value !== DELETED) {\r\n entry.value = DELETED;\r\n return true;\r\n }\r\n const frozenIndex = this._getFrozenEntryIndex(key);\r\n if (frozenIndex >= 0) {\r\n this._frozenEntries.splice(frozenIndex, 1);\r\n return true;\r\n }\r\n return false;\r\n }\r\n get(key) {\r\n if (key === undefined || key === null) {\r\n return undefined;\r\n }\r\n const entry = key[this._name];\r\n if (entry && entry.key === key && entry.value !== DELETED) {\r\n return entry.value;\r\n }\r\n const frozenIndex = this._getFrozenEntryIndex(key);\r\n if (frozenIndex >= 0) {\r\n return this._frozenEntries[frozenIndex].value;\r\n }\r\n }\r\n has(key) {\r\n if (key === undefined || key === null) {\r\n return false;\r\n }\r\n const entry = key[this._name];\r\n if (Boolean(entry && entry.key === key && entry.value !== DELETED)) {\r\n return true;\r\n }\r\n const frozenIndex = this._getFrozenEntryIndex(key);\r\n if (frozenIndex >= 0) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n set(key, value) {\r\n if (!key || (typeof key !== 'object' && typeof key !== 'function')) {\r\n throw new TypeError('Invalid value used as weak map key');\r\n }\r\n let entry = key[this._name];\r\n if (!entry || entry.key !== key) {\r\n entry = Object.create(null, {\r\n key: { value: key }\r\n });\r\n if (Object.isFrozen(key)) {\r\n this._frozenEntries.push(entry);\r\n }\r\n else {\r\n Object.defineProperty(key, this._name, {\r\n value: entry\r\n });\r\n }\r\n }\r\n entry.value = value;\r\n return this;\r\n }\r\n };\r\n}\r\nexport default WeakMap;\r\n//# sourceMappingURL=WeakMap.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\afterRender.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\afterRender.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", "index": 34, "index2": 29, "size": 311, @@ -3181,18 +3189,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "./../decorators/afterRender", "loc": "4:0-58" @@ -3237,9 +3245,9 @@ "depth": 0 }, { - "id": "./node_modules/@dojo/shim/array.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "name": "./node_modules/@dojo/shim/array.mjs", + "id": "./node_modules/@dojo/framework/shim/array.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "name": "./node_modules/@dojo/framework/shim/array.mjs", "index": 30, "index2": 24, "size": 9175, @@ -3251,30 +3259,30 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/array", - "loc": "4:0-40" + "userRequest": "../shim/array", + "loc": "4:0-37" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/array", - "loc": "2:0-53" + "userRequest": "../shim/array", + "loc": "2:0-50" } ], "usedExports": [ @@ -3294,9 +3302,9 @@ "source": "import global from './global';\r\nimport { isArrayLike, isIterable } from './iterator';\r\nimport { MAX_SAFE_INTEGER } from './number';\r\nimport has from './support/has';\r\nimport { wrapNative } from './support/util';\r\nexport let from;\r\n/**\r\n * Creates a new array from the function parameters.\r\n *\r\n * @param arguments Any number of arguments for the array\r\n * @return An array from the given arguments\r\n */\r\nexport let of;\r\n/* ES6 Array instance methods */\r\n/**\r\n * Copies data internally within an array or array-like object.\r\n *\r\n * @param target The target array-like object\r\n * @param offset The index to start copying values to; if negative, it counts backwards from length\r\n * @param start The first (inclusive) index to copy; if negative, it counts backwards from length\r\n * @param end The last (exclusive) index to copy; if negative, it counts backwards from length\r\n * @return The target\r\n */\r\nexport let copyWithin;\r\n/**\r\n * Fills elements of an array-like object with the specified value.\r\n *\r\n * @param target The target to fill\r\n * @param value The value to fill each element of the target with\r\n * @param start The first index to fill\r\n * @param end The (exclusive) index at which to stop filling\r\n * @return The filled target\r\n */\r\nexport let fill;\r\n/**\r\n * Finds and returns the first instance matching the callback or undefined if one is not found.\r\n *\r\n * @param target An array-like object\r\n * @param callback A function returning if the current value matches a criteria\r\n * @param thisArg The execution context for the find function\r\n * @return The first element matching the callback, or undefined if one does not exist\r\n */\r\nexport let find;\r\n/**\r\n * Performs a linear search and returns the first index whose value satisfies the passed callback,\r\n * or -1 if no values satisfy it.\r\n *\r\n * @param target An array-like object\r\n * @param callback A function returning true if the current value satisfies its criteria\r\n * @param thisArg The execution context for the find function\r\n * @return The first index whose value satisfies the passed callback, or -1 if no values satisfy it\r\n */\r\nexport let findIndex;\r\n/* ES7 Array instance methods */\r\n/**\r\n * Determines whether an array includes a given value\r\n *\r\n * @param target the target array-like object\r\n * @param searchElement the item to search for\r\n * @param fromIndex the starting index to search from\r\n * @return `true` if the array includes the element, otherwise `false`\r\n */\r\nexport let includes;\r\nif (true && true) {\r\n from = global.Array.from;\r\n of = global.Array.of;\r\n copyWithin = wrapNative(global.Array.prototype.copyWithin);\r\n fill = wrapNative(global.Array.prototype.fill);\r\n find = wrapNative(global.Array.prototype.find);\r\n findIndex = wrapNative(global.Array.prototype.findIndex);\r\n}\r\nelse {\r\n // It is only older versions of Safari/iOS that have a bad fill implementation and so aren't in the wild\r\n // To make things easier, if there is a bad fill implementation, the whole set of functions will be filled\r\n /**\r\n * Ensures a non-negative, non-infinite, safe integer.\r\n *\r\n * @param length The number to validate\r\n * @return A proper length\r\n */\r\n const toLength = function toLength(length) {\r\n if (isNaN(length)) {\r\n return 0;\r\n }\r\n length = Number(length);\r\n if (isFinite(length)) {\r\n length = Math.floor(length);\r\n }\r\n // Ensure a non-negative, real, safe integer\r\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\r\n };\r\n /**\r\n * From ES6 7.1.4 ToInteger()\r\n *\r\n * @param value A value to convert\r\n * @return An integer\r\n */\r\n const toInteger = function toInteger(value) {\r\n value = Number(value);\r\n if (isNaN(value)) {\r\n return 0;\r\n }\r\n if (value === 0 || !isFinite(value)) {\r\n return value;\r\n }\r\n return (value > 0 ? 1 : -1) * Math.floor(Math.abs(value));\r\n };\r\n /**\r\n * Normalizes an offset against a given length, wrapping it if negative.\r\n *\r\n * @param value The original offset\r\n * @param length The total length to normalize against\r\n * @return If negative, provide a distance from the end (length); otherwise provide a distance from 0\r\n */\r\n const normalizeOffset = function normalizeOffset(value, length) {\r\n return value < 0 ? Math.max(length + value, 0) : Math.min(value, length);\r\n };\r\n from = function from(arrayLike, mapFunction, thisArg) {\r\n if (arrayLike == null) {\r\n throw new TypeError('from: requires an array-like object');\r\n }\r\n if (mapFunction && thisArg) {\r\n mapFunction = mapFunction.bind(thisArg);\r\n }\r\n /* tslint:disable-next-line:variable-name */\r\n const Constructor = this;\r\n const length = toLength(arrayLike.length);\r\n // Support extension\r\n const array = typeof Constructor === 'function' ? Object(new Constructor(length)) : new Array(length);\r\n if (!isArrayLike(arrayLike) && !isIterable(arrayLike)) {\r\n return array;\r\n }\r\n // if this is an array and the normalized length is 0, just return an empty array. this prevents a problem\r\n // with the iteration on IE when using a NaN array length.\r\n if (isArrayLike(arrayLike)) {\r\n if (length === 0) {\r\n return [];\r\n }\r\n for (let i = 0; i < arrayLike.length; i++) {\r\n array[i] = mapFunction ? mapFunction(arrayLike[i], i) : arrayLike[i];\r\n }\r\n }\r\n else {\r\n let i = 0;\r\n for (const value of arrayLike) {\r\n array[i] = mapFunction ? mapFunction(value, i) : value;\r\n i++;\r\n }\r\n }\r\n if (arrayLike.length !== undefined) {\r\n array.length = length;\r\n }\r\n return array;\r\n };\r\n of = function of(...items) {\r\n return Array.prototype.slice.call(items);\r\n };\r\n copyWithin = function copyWithin(target, offset, start, end) {\r\n if (target == null) {\r\n throw new TypeError('copyWithin: target must be an array-like object');\r\n }\r\n const length = toLength(target.length);\r\n offset = normalizeOffset(toInteger(offset), length);\r\n start = normalizeOffset(toInteger(start), length);\r\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\r\n let count = Math.min(end - start, length - offset);\r\n let direction = 1;\r\n if (offset > start && offset < start + count) {\r\n direction = -1;\r\n start += count - 1;\r\n offset += count - 1;\r\n }\r\n while (count > 0) {\r\n if (start in target) {\r\n target[offset] = target[start];\r\n }\r\n else {\r\n delete target[offset];\r\n }\r\n offset += direction;\r\n start += direction;\r\n count--;\r\n }\r\n return target;\r\n };\r\n fill = function fill(target, value, start, end) {\r\n const length = toLength(target.length);\r\n let i = normalizeOffset(toInteger(start), length);\r\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\r\n while (i < end) {\r\n target[i++] = value;\r\n }\r\n return target;\r\n };\r\n find = function find(target, callback, thisArg) {\r\n const index = findIndex(target, callback, thisArg);\r\n return index !== -1 ? target[index] : undefined;\r\n };\r\n findIndex = function findIndex(target, callback, thisArg) {\r\n const length = toLength(target.length);\r\n if (!callback) {\r\n throw new TypeError('find: second argument must be a function');\r\n }\r\n if (thisArg) {\r\n callback = callback.bind(thisArg);\r\n }\r\n for (let i = 0; i < length; i++) {\r\n if (callback(target[i], i, target)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n };\r\n}\r\nif (true) {\r\n includes = wrapNative(global.Array.prototype.includes);\r\n}\r\nelse {\r\n /**\r\n * Ensures a non-negative, non-infinite, safe integer.\r\n *\r\n * @param length The number to validate\r\n * @return A proper length\r\n */\r\n const toLength = function toLength(length) {\r\n length = Number(length);\r\n if (isNaN(length)) {\r\n return 0;\r\n }\r\n if (isFinite(length)) {\r\n length = Math.floor(length);\r\n }\r\n // Ensure a non-negative, real, safe integer\r\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\r\n };\r\n includes = function includes(target, searchElement, fromIndex = 0) {\r\n let len = toLength(target.length);\r\n for (let i = fromIndex; i < len; ++i) {\r\n const currentElement = target[i];\r\n if (searchElement === currentElement ||\r\n (searchElement !== searchElement && currentElement !== currentElement)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n}\r\n//# sourceMappingURL=array.mjs.map" }, { - "id": "./node_modules/@dojo/shim/global.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\global.mjs", - "name": "./node_modules/@dojo/shim/global.mjs", + "id": "./node_modules/@dojo/framework/shim/global.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\global.mjs", + "name": "./node_modules/@dojo/framework/shim/global.mjs", "index": 10, "index2": 4, "size": 581, @@ -3308,117 +3316,117 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/global", - "loc": "6:0-39" - }, - { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", - "type": "harmony import", - "userRequest": "@dojo/shim/global", - "loc": "1:0-39" + "userRequest": "../shim/global", + "loc": "6:0-36" }, { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./global", "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Symbol.mjs", - "module": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleName": "./node_modules/@dojo/shim/Symbol.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Symbol.mjs", + "module": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Symbol.mjs", "type": "harmony import", "userRequest": "./global", "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/number.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\number.mjs", - "module": "./node_modules/@dojo/shim/number.mjs", - "moduleName": "./node_modules/@dojo/shim/number.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/number.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\number.mjs", + "module": "./node_modules/@dojo/framework/shim/number.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/number.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/support/has.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\has.mjs", - "module": "./node_modules/@dojo/shim/support/has.mjs", - "moduleName": "./node_modules/@dojo/shim/support/has.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "type": "harmony import", + "userRequest": "../shim/global", + "loc": "1:0-36" + }, + { + "moduleId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\has.mjs", + "module": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/has.mjs", "type": "harmony import", "userRequest": "../global", "loc": "2:0-31" }, { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/object.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\object.mjs", - "module": "./node_modules/@dojo/shim/object.mjs", - "moduleName": "./node_modules/@dojo/shim/object.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\object.mjs", + "module": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/object.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/string.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\string.mjs", - "module": "./node_modules/@dojo/shim/string.mjs", - "moduleName": "./node_modules/@dojo/shim/string.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\string.mjs", + "module": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/string.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\queue.mjs", - "module": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleName": "./node_modules/@dojo/shim/support/queue.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\queue.mjs", + "module": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/queue.mjs", "type": "harmony import", "userRequest": "../global", "loc": "1:0-31" @@ -3435,9 +3443,9 @@ "source": "const globalObject = (function () {\n if (typeof global !== 'undefined') {\n // global spec defines a reference to the global object called 'global'\n // https://github.com/tc39/proposal-global\n // `global` is also defined in NodeJS\n return global;\n }\n else if (typeof window !== 'undefined') {\n // window is defined in browsers\n return window;\n }\n else if (typeof self !== 'undefined') {\n // self is defined in WebWorkers\n return self;\n }\n})();\nexport default globalObject;\n//# sourceMappingURL=global.mjs.map" }, { - "id": "./node_modules/@dojo/shim/iterator.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\iterator.mjs", - "name": "./node_modules/@dojo/shim/iterator.mjs", + "id": "./node_modules/@dojo/framework/shim/iterator.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\iterator.mjs", + "name": "./node_modules/@dojo/framework/shim/iterator.mjs", "index": 16, "index2": 10, "size": 3158, @@ -3449,36 +3457,36 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./iterator", "loc": "2:0-53" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./iterator", "loc": "1:0-55" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./iterator", "loc": "2:0-41" @@ -3497,9 +3505,9 @@ "source": "import './Symbol';\nimport { HIGH_SURROGATE_MAX, HIGH_SURROGATE_MIN } from './string';\nconst staticDone = { done: true, value: undefined };\n/**\n * A class that _shims_ an iterator interface on array like objects.\n */\nexport class ShimIterator {\n constructor(list) {\n this._nextIndex = -1;\n if (isIterable(list)) {\n this._nativeIterator = list[Symbol.iterator]();\n }\n else {\n this._list = list;\n }\n }\n /**\n * Return the next iteration result for the Iterator\n */\n next() {\n if (this._nativeIterator) {\n return this._nativeIterator.next();\n }\n if (!this._list) {\n return staticDone;\n }\n if (++this._nextIndex < this._list.length) {\n return {\n done: false,\n value: this._list[this._nextIndex]\n };\n }\n return staticDone;\n }\n [Symbol.iterator]() {\n return this;\n }\n}\n/**\n * A type guard for checking if something has an Iterable interface\n *\n * @param value The value to type guard against\n */\nexport function isIterable(value) {\n return value && typeof value[Symbol.iterator] === 'function';\n}\n/**\n * A type guard for checking if something is ArrayLike\n *\n * @param value The value to type guard against\n */\nexport function isArrayLike(value) {\n return value && typeof value.length === 'number';\n}\n/**\n * Returns the iterator for an object\n *\n * @param iterable The iterable object to return the iterator for\n */\nexport function get(iterable) {\n if (isIterable(iterable)) {\n return iterable[Symbol.iterator]();\n }\n else if (isArrayLike(iterable)) {\n return new ShimIterator(iterable);\n }\n}\n/**\n * Shims the functionality of `for ... of` blocks\n *\n * @param iterable The object the provides an interator interface\n * @param callback The callback which will be called for each item of the iterable\n * @param thisArg Optional scope to pass the callback\n */\nexport function forOf(iterable, callback, thisArg) {\n let broken = false;\n function doBreak() {\n broken = true;\n }\n /* We need to handle iteration of double byte strings properly */\n if (isArrayLike(iterable) && typeof iterable === 'string') {\n const l = iterable.length;\n for (let i = 0; i < l; ++i) {\n let char = iterable[i];\n if (i + 1 < l) {\n const code = char.charCodeAt(0);\n if (code >= HIGH_SURROGATE_MIN && code <= HIGH_SURROGATE_MAX) {\n char += iterable[++i];\n }\n }\n callback.call(thisArg, char, iterable, doBreak);\n if (broken) {\n return;\n }\n }\n }\n else {\n const iterator = get(iterable);\n if (iterator) {\n let result = iterator.next();\n while (!result.done) {\n callback.call(thisArg, result.value, iterable, doBreak);\n if (broken) {\n return;\n }\n result = iterator.next();\n }\n }\n }\n}\n//# sourceMappingURL=iterator.mjs.map" }, { - "id": "./node_modules/@dojo/shim/number.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\number.mjs", - "name": "./node_modules/@dojo/shim/number.mjs", + "id": "./node_modules/@dojo/framework/shim/number.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\number.mjs", + "name": "./node_modules/@dojo/framework/shim/number.mjs", "index": 31, "index2": 23, "size": 1724, @@ -3511,18 +3519,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./number", "loc": "3:0-44" @@ -3543,9 +3551,9 @@ "source": "import global from './global';\n/**\n * The smallest interval between two representable numbers.\n */\nexport const EPSILON = 1;\n/**\n * The maximum safe integer in JavaScript\n */\nexport const MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n/**\n * The minimum safe integer in JavaScript\n */\nexport const MIN_SAFE_INTEGER = -MAX_SAFE_INTEGER;\n/**\n * Determines whether the passed value is NaN without coersion.\n *\n * @param value The value to test\n * @return true if the value is NaN, false if it is not\n */\nexport function isNaN(value) {\n return typeof value === 'number' && global.isNaN(value);\n}\n/**\n * Determines whether the passed value is a finite number without coersion.\n *\n * @param value The value to test\n * @return true if the value is finite, false if it is not\n */\nexport function isFinite(value) {\n return typeof value === 'number' && global.isFinite(value);\n}\n/**\n * Determines whether the passed value is an integer.\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isInteger(value) {\n return isFinite(value) && Math.floor(value) === value;\n}\n/**\n * Determines whether the passed value is an integer that is 'safe,' meaning:\n * 1. it can be expressed as an IEEE-754 double precision number\n * 2. it has a one-to-one mapping to a mathematical integer, meaning its\n * IEEE-754 representation cannot be the result of rounding any other\n * integer to fit the IEEE-754 representation\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isSafeInteger(value) {\n return isInteger(value) && Math.abs(value) <= MAX_SAFE_INTEGER;\n}\n//# sourceMappingURL=number.mjs.map" }, { - "id": "./node_modules/@dojo/shim/object.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\object.mjs", - "name": "./node_modules/@dojo/shim/object.mjs", + "id": "./node_modules/@dojo/framework/shim/object.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\object.mjs", + "name": "./node_modules/@dojo/framework/shim/object.mjs", "index": 18, "index2": 11, "size": 4171, @@ -3557,39 +3565,39 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "issuerId": "./node_modules/@dojo/shim/Map.mjs", - "issuerName": "./node_modules/@dojo/shim/Map.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/Map.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/Map.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./object", "loc": "3:0-42" }, { - "moduleId": "./node_modules/@dojo/core/lang.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\lang.mjs", - "module": "./node_modules/@dojo/core/lang.mjs", - "moduleName": "./node_modules/@dojo/core/lang.mjs", + "moduleId": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\lang.mjs", + "module": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleName": "./node_modules/@dojo/framework/core/lang.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/object", - "loc": "1:0-43" + "userRequest": "../shim/object", + "loc": "1:0-40" }, { - "moduleId": "./node_modules/@dojo/core/lang.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\lang.mjs", - "module": "./node_modules/@dojo/core/lang.mjs", - "moduleName": "./node_modules/@dojo/core/lang.mjs", + "moduleId": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\lang.mjs", + "module": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleName": "./node_modules/@dojo/framework/core/lang.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/object", - "loc": "2:0-43" + "userRequest": "../shim/object", + "loc": "2:0-40" } ], "usedExports": [ @@ -3611,9 +3619,9 @@ "source": "import global from './global';\r\nimport has from './support/has';\r\nimport { isSymbol } from './Symbol';\r\nexport let assign;\r\n/**\r\n * Gets the own property descriptor of the specified object.\r\n * An own property descriptor is one that is defined directly on the object and is not\r\n * inherited from the object's prototype.\r\n * @param o Object that contains the property.\r\n * @param p Name of the property.\r\n */\r\nexport let getOwnPropertyDescriptor;\r\n/**\r\n * Returns the names of the own properties of an object. The own properties of an object are those that are defined directly\r\n * on that object, and are not inherited from the object's prototype. The properties of an object include both fields (objects) and functions.\r\n * @param o Object that contains the own properties.\r\n */\r\nexport let getOwnPropertyNames;\r\n/**\r\n * Returns an array of all symbol properties found directly on object o.\r\n * @param o Object to retrieve the symbols from.\r\n */\r\nexport let getOwnPropertySymbols;\r\n/**\r\n * Returns true if the values are the same value, false otherwise.\r\n * @param value1 The first value.\r\n * @param value2 The second value.\r\n */\r\nexport let is;\r\n/**\r\n * Returns the names of the enumerable properties and methods of an object.\r\n * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.\r\n */\r\nexport let keys;\r\n/* ES7 Object static methods */\r\nexport let getOwnPropertyDescriptors;\r\nexport let entries;\r\nexport let values;\r\nif (true) {\r\n const globalObject = global.Object;\r\n assign = globalObject.assign;\r\n getOwnPropertyDescriptor = globalObject.getOwnPropertyDescriptor;\r\n getOwnPropertyNames = globalObject.getOwnPropertyNames;\r\n getOwnPropertySymbols = globalObject.getOwnPropertySymbols;\r\n is = globalObject.is;\r\n keys = globalObject.keys;\r\n}\r\nelse {\r\n keys = function symbolAwareKeys(o) {\r\n return Object.keys(o).filter((key) => !Boolean(key.match(/^@@.+/)));\r\n };\r\n assign = function assign(target, ...sources) {\r\n if (target == null) {\r\n // TypeError if undefined or null\r\n throw new TypeError('Cannot convert undefined or null to object');\r\n }\r\n const to = Object(target);\r\n sources.forEach((nextSource) => {\r\n if (nextSource) {\r\n // Skip over if undefined or null\r\n keys(nextSource).forEach((nextKey) => {\r\n to[nextKey] = nextSource[nextKey];\r\n });\r\n }\r\n });\r\n return to;\r\n };\r\n getOwnPropertyDescriptor = function getOwnPropertyDescriptor(o, prop) {\r\n if (isSymbol(prop)) {\r\n return Object.getOwnPropertyDescriptor(o, prop);\r\n }\r\n else {\r\n return Object.getOwnPropertyDescriptor(o, prop);\r\n }\r\n };\r\n getOwnPropertyNames = function getOwnPropertyNames(o) {\r\n return Object.getOwnPropertyNames(o).filter((key) => !Boolean(key.match(/^@@.+/)));\r\n };\r\n getOwnPropertySymbols = function getOwnPropertySymbols(o) {\r\n return Object.getOwnPropertyNames(o)\r\n .filter((key) => Boolean(key.match(/^@@.+/)))\r\n .map((key) => Symbol.for(key.substring(2)));\r\n };\r\n is = function is(value1, value2) {\r\n if (value1 === value2) {\r\n return value1 !== 0 || 1 / value1 === 1 / value2; // -0\r\n }\r\n return value1 !== value1 && value2 !== value2; // NaN\r\n };\r\n}\r\nif (true) {\r\n const globalObject = global.Object;\r\n getOwnPropertyDescriptors = globalObject.getOwnPropertyDescriptors;\r\n entries = globalObject.entries;\r\n values = globalObject.values;\r\n}\r\nelse {\r\n getOwnPropertyDescriptors = function getOwnPropertyDescriptors(o) {\r\n return getOwnPropertyNames(o).reduce((previous, key) => {\r\n previous[key] = getOwnPropertyDescriptor(o, key);\r\n return previous;\r\n }, {});\r\n };\r\n entries = function entries(o) {\r\n return keys(o).map((key) => [key, o[key]]);\r\n };\r\n values = function values(o) {\r\n return keys(o).map((key) => o[key]);\r\n };\r\n}\r\n//# sourceMappingURL=object.mjs.map" }, { - "id": "./node_modules/@dojo/shim/string.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\string.mjs", - "name": "./node_modules/@dojo/shim/string.mjs", + "id": "./node_modules/@dojo/framework/shim/string.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\string.mjs", + "name": "./node_modules/@dojo/framework/shim/string.mjs", "index": 17, "index2": 9, "size": 12714, @@ -3625,18 +3633,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\iterator.mjs", - "issuerId": "./node_modules/@dojo/shim/iterator.mjs", - "issuerName": "./node_modules/@dojo/shim/iterator.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\iterator.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/iterator.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/iterator.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/iterator.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\iterator.mjs", - "module": "./node_modules/@dojo/shim/iterator.mjs", - "moduleName": "./node_modules/@dojo/shim/iterator.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\iterator.mjs", + "module": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/iterator.mjs", "type": "harmony import", "userRequest": "./string", "loc": "2:0-66" @@ -3667,9 +3675,9 @@ "source": "import global from './global';\r\nimport has from './support/has';\r\nimport { wrapNative } from './support/util';\r\n/**\r\n * The minimum location of high surrogates\r\n */\r\nexport const HIGH_SURROGATE_MIN = 0xd800;\r\n/**\r\n * The maximum location of high surrogates\r\n */\r\nexport const HIGH_SURROGATE_MAX = 0xdbff;\r\n/**\r\n * The minimum location of low surrogates\r\n */\r\nexport const LOW_SURROGATE_MIN = 0xdc00;\r\n/**\r\n * The maximum location of low surrogates\r\n */\r\nexport const LOW_SURROGATE_MAX = 0xdfff;\r\n/* ES6 static methods */\r\n/**\r\n * Return the String value whose elements are, in order, the elements in the List elements.\r\n * If length is 0, the empty string is returned.\r\n * @param codePoints The code points to generate the string\r\n */\r\nexport let fromCodePoint;\r\n/**\r\n * `raw` is intended for use as a tag function of a Tagged Template String. When called\r\n * as such the first argument will be a well formed template call site object and the rest\r\n * parameter will contain the substitution values.\r\n * @param template A well-formed template string call site representation.\r\n * @param substitutions A set of substitution values.\r\n */\r\nexport let raw;\r\n/* ES6 instance methods */\r\n/**\r\n * Returns a nonnegative integer Number less than 1114112 (0x110000) that is the code point\r\n * value of the UTF-16 encoded code point starting at the string element at position pos in\r\n * the String resulting from converting this object to a String.\r\n * If there is no element at that position, the result is undefined.\r\n * If a valid UTF-16 surrogate pair does not begin at pos, the result is the code unit at pos.\r\n */\r\nexport let codePointAt;\r\n/**\r\n * Returns true if the sequence of elements of searchString converted to a String is the\r\n * same as the corresponding elements of this object (converted to a String) starting at\r\n * endPosition – length(this). Otherwise returns false.\r\n */\r\nexport let endsWith;\r\n/**\r\n * Returns true if searchString appears as a substring of the result of converting this\r\n * object to a String, at one or more positions that are\r\n * greater than or equal to position; otherwise, returns false.\r\n * @param target The target string\r\n * @param searchString search string\r\n * @param position If position is undefined, 0 is assumed, so as to search all of the String.\r\n */\r\nexport let includes;\r\n/**\r\n * Returns the String value result of normalizing the string into the normalization form\r\n * named by form as specified in Unicode Standard Annex #15, Unicode Normalization Forms.\r\n * @param target The target string\r\n * @param form Applicable values: \"NFC\", \"NFD\", \"NFKC\", or \"NFKD\", If not specified default\r\n * is \"NFC\"\r\n */\r\nexport let normalize;\r\n/**\r\n * Returns a String value that is made from count copies appended together. If count is 0,\r\n * T is the empty String is returned.\r\n * @param count number of copies to append\r\n */\r\nexport let repeat;\r\n/**\r\n * Returns true if the sequence of elements of searchString converted to a String is the\r\n * same as the corresponding elements of this object (converted to a String) starting at\r\n * position. Otherwise returns false.\r\n */\r\nexport let startsWith;\r\n/* ES7 instance methods */\r\n/**\r\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\r\n * The padding is applied from the end (right) of the current string.\r\n *\r\n * @param target The target string\r\n * @param maxLength The length of the resulting string once the current string has been padded.\r\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\r\n *\r\n * @param fillString The string to pad the current string with.\r\n * If this string is too long, it will be truncated and the left-most part will be applied.\r\n * The default value for this parameter is \" \" (U+0020).\r\n */\r\nexport let padEnd;\r\n/**\r\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\r\n * The padding is applied from the start (left) of the current string.\r\n *\r\n * @param target The target string\r\n * @param maxLength The length of the resulting string once the current string has been padded.\r\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\r\n *\r\n * @param fillString The string to pad the current string with.\r\n * If this string is too long, it will be truncated and the left-most part will be applied.\r\n * The default value for this parameter is \" \" (U+0020).\r\n */\r\nexport let padStart;\r\nif (true && true) {\r\n fromCodePoint = global.String.fromCodePoint;\r\n raw = global.String.raw;\r\n codePointAt = wrapNative(global.String.prototype.codePointAt);\r\n endsWith = wrapNative(global.String.prototype.endsWith);\r\n includes = wrapNative(global.String.prototype.includes);\r\n normalize = wrapNative(global.String.prototype.normalize);\r\n repeat = wrapNative(global.String.prototype.repeat);\r\n startsWith = wrapNative(global.String.prototype.startsWith);\r\n}\r\nelse {\r\n /**\r\n * Validates that text is defined, and normalizes position (based on the given default if the input is NaN).\r\n * Used by startsWith, includes, and endsWith.\r\n *\r\n * @return Normalized position.\r\n */\r\n const normalizeSubstringArgs = function (name, text, search, position, isEnd = false) {\r\n if (text == null) {\r\n throw new TypeError('string.' + name + ' requires a valid string to search against.');\r\n }\r\n const length = text.length;\r\n position = position !== position ? (isEnd ? length : 0) : position;\r\n return [text, String(search), Math.min(Math.max(position, 0), length)];\r\n };\r\n fromCodePoint = function fromCodePoint(...codePoints) {\r\n // Adapted from https://github.com/mathiasbynens/String.fromCodePoint\r\n const length = arguments.length;\r\n if (!length) {\r\n return '';\r\n }\r\n const fromCharCode = String.fromCharCode;\r\n const MAX_SIZE = 0x4000;\r\n let codeUnits = [];\r\n let index = -1;\r\n let result = '';\r\n while (++index < length) {\r\n let codePoint = Number(arguments[index]);\r\n // Code points must be finite integers within the valid range\r\n let isValid = isFinite(codePoint) && Math.floor(codePoint) === codePoint && codePoint >= 0 && codePoint <= 0x10ffff;\r\n if (!isValid) {\r\n throw RangeError('string.fromCodePoint: Invalid code point ' + codePoint);\r\n }\r\n if (codePoint <= 0xffff) {\r\n // BMP code point\r\n codeUnits.push(codePoint);\r\n }\r\n else {\r\n // Astral code point; split in surrogate halves\r\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\r\n codePoint -= 0x10000;\r\n let highSurrogate = (codePoint >> 10) + HIGH_SURROGATE_MIN;\r\n let lowSurrogate = codePoint % 0x400 + LOW_SURROGATE_MIN;\r\n codeUnits.push(highSurrogate, lowSurrogate);\r\n }\r\n if (index + 1 === length || codeUnits.length > MAX_SIZE) {\r\n result += fromCharCode.apply(null, codeUnits);\r\n codeUnits.length = 0;\r\n }\r\n }\r\n return result;\r\n };\r\n raw = function raw(callSite, ...substitutions) {\r\n let rawStrings = callSite.raw;\r\n let result = '';\r\n let numSubstitutions = substitutions.length;\r\n if (callSite == null || callSite.raw == null) {\r\n throw new TypeError('string.raw requires a valid callSite object with a raw value');\r\n }\r\n for (let i = 0, length = rawStrings.length; i < length; i++) {\r\n result += rawStrings[i] + (i < numSubstitutions && i < length - 1 ? substitutions[i] : '');\r\n }\r\n return result;\r\n };\r\n codePointAt = function codePointAt(text, position = 0) {\r\n // Adapted from https://github.com/mathiasbynens/String.prototype.codePointAt\r\n if (text == null) {\r\n throw new TypeError('string.codePointAt requries a valid string.');\r\n }\r\n const length = text.length;\r\n if (position !== position) {\r\n position = 0;\r\n }\r\n if (position < 0 || position >= length) {\r\n return undefined;\r\n }\r\n // Get the first code unit\r\n const first = text.charCodeAt(position);\r\n if (first >= HIGH_SURROGATE_MIN && first <= HIGH_SURROGATE_MAX && length > position + 1) {\r\n // Start of a surrogate pair (high surrogate and there is a next code unit); check for low surrogate\r\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\r\n const second = text.charCodeAt(position + 1);\r\n if (second >= LOW_SURROGATE_MIN && second <= LOW_SURROGATE_MAX) {\r\n return (first - HIGH_SURROGATE_MIN) * 0x400 + second - LOW_SURROGATE_MIN + 0x10000;\r\n }\r\n }\r\n return first;\r\n };\r\n endsWith = function endsWith(text, search, endPosition) {\r\n if (endPosition == null) {\r\n endPosition = text.length;\r\n }\r\n [text, search, endPosition] = normalizeSubstringArgs('endsWith', text, search, endPosition, true);\r\n const start = endPosition - search.length;\r\n if (start < 0) {\r\n return false;\r\n }\r\n return text.slice(start, endPosition) === search;\r\n };\r\n includes = function includes(text, search, position = 0) {\r\n [text, search, position] = normalizeSubstringArgs('includes', text, search, position);\r\n return text.indexOf(search, position) !== -1;\r\n };\r\n repeat = function repeat(text, count = 0) {\r\n // Adapted from https://github.com/mathiasbynens/String.prototype.repeat\r\n if (text == null) {\r\n throw new TypeError('string.repeat requires a valid string.');\r\n }\r\n if (count !== count) {\r\n count = 0;\r\n }\r\n if (count < 0 || count === Infinity) {\r\n throw new RangeError('string.repeat requires a non-negative finite count.');\r\n }\r\n let result = '';\r\n while (count) {\r\n if (count % 2) {\r\n result += text;\r\n }\r\n if (count > 1) {\r\n text += text;\r\n }\r\n count >>= 1;\r\n }\r\n return result;\r\n };\r\n startsWith = function startsWith(text, search, position = 0) {\r\n search = String(search);\r\n [text, search, position] = normalizeSubstringArgs('startsWith', text, search, position);\r\n const end = position + search.length;\r\n if (end > text.length) {\r\n return false;\r\n }\r\n return text.slice(position, end) === search;\r\n };\r\n}\r\nif (true) {\r\n padEnd = wrapNative(global.String.prototype.padEnd);\r\n padStart = wrapNative(global.String.prototype.padStart);\r\n}\r\nelse {\r\n padEnd = function padEnd(text, maxLength, fillString = ' ') {\r\n if (text === null || text === undefined) {\r\n throw new TypeError('string.repeat requires a valid string.');\r\n }\r\n if (maxLength === Infinity) {\r\n throw new RangeError('string.padEnd requires a non-negative finite count.');\r\n }\r\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\r\n maxLength = 0;\r\n }\r\n let strText = String(text);\r\n const padding = maxLength - strText.length;\r\n if (padding > 0) {\r\n strText +=\r\n repeat(fillString, Math.floor(padding / fillString.length)) +\r\n fillString.slice(0, padding % fillString.length);\r\n }\r\n return strText;\r\n };\r\n padStart = function padStart(text, maxLength, fillString = ' ') {\r\n if (text === null || text === undefined) {\r\n throw new TypeError('string.repeat requires a valid string.');\r\n }\r\n if (maxLength === Infinity) {\r\n throw new RangeError('string.padStart requires a non-negative finite count.');\r\n }\r\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\r\n maxLength = 0;\r\n }\r\n let strText = String(text);\r\n const padding = maxLength - strText.length;\r\n if (padding > 0) {\r\n strText =\r\n repeat(fillString, Math.floor(padding / fillString.length)) +\r\n fillString.slice(0, padding % fillString.length) +\r\n strText;\r\n }\r\n return strText;\r\n };\r\n}\r\n//# sourceMappingURL=string.mjs.map" }, { - "id": "./node_modules/@dojo/shim/support/has.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\has.mjs", - "name": "./node_modules/@dojo/shim/support/has.mjs", + "id": "./node_modules/@dojo/framework/shim/support/has.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\has.mjs", + "name": "./node_modules/@dojo/framework/shim/support/has.mjs", "index": 6, "index2": 5, "size": 6316, @@ -3681,81 +3689,81 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "4:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "4:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "3:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Symbol.mjs", - "module": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleName": "./node_modules/@dojo/shim/Symbol.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Symbol.mjs", + "module": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Symbol.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "1:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "4:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/object.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\object.mjs", - "module": "./node_modules/@dojo/shim/object.mjs", - "moduleName": "./node_modules/@dojo/shim/object.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\object.mjs", + "module": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/object.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "2:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/string.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\string.mjs", - "module": "./node_modules/@dojo/shim/string.mjs", - "moduleName": "./node_modules/@dojo/shim/string.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\string.mjs", + "module": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/string.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "2:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\queue.mjs", - "module": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleName": "./node_modules/@dojo/shim/support/queue.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\queue.mjs", + "module": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/queue.mjs", "type": "harmony import", "userRequest": "./has", "loc": "2:0-24" @@ -3773,12 +3781,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import has, { add } from '@dojo/has/has';\r\nimport global from '../global';\r\nexport default has;\r\nexport * from '@dojo/has/has';\r\n/* ECMAScript 6 and 7 Features */\r\n/* Array */\r\nadd('es6-array', () => {\r\n return (['from', 'of'].every((key) => key in global.Array) &&\r\n ['findIndex', 'find', 'copyWithin'].every((key) => key in global.Array.prototype));\r\n}, true);\r\nadd('es6-array-fill', () => {\r\n if ('fill' in global.Array.prototype) {\r\n /* Some versions of Safari do not properly implement this */\r\n return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1;\r\n }\r\n return false;\r\n}, true);\r\nadd('es7-array', () => 'includes' in global.Array.prototype, true);\r\n/* Map */\r\nadd('es6-map', () => {\r\n if (typeof global.Map === 'function') {\r\n /*\r\n IE11 and older versions of Safari are missing critical ES6 Map functionality\r\n We wrap this in a try/catch because sometimes the Map constructor exists, but does not\r\n take arguments (iOS 8.4)\r\n */\r\n try {\r\n const map = new global.Map([[0, 1]]);\r\n return map.has(0) &&\r\n typeof map.keys === 'function' &&\r\n true &&\r\n typeof map.values === 'function' &&\r\n typeof map.entries === 'function';\r\n }\r\n catch (e) {\r\n /* istanbul ignore next: not testing on iOS at the moment */\r\n return false;\r\n }\r\n }\r\n return false;\r\n}, true);\r\n/* Math */\r\nadd('es6-math', () => {\r\n return [\r\n 'clz32',\r\n 'sign',\r\n 'log10',\r\n 'log2',\r\n 'log1p',\r\n 'expm1',\r\n 'cosh',\r\n 'sinh',\r\n 'tanh',\r\n 'acosh',\r\n 'asinh',\r\n 'atanh',\r\n 'trunc',\r\n 'fround',\r\n 'cbrt',\r\n 'hypot'\r\n ].every((name) => typeof global.Math[name] === 'function');\r\n}, true);\r\nadd('es6-math-imul', () => {\r\n if ('imul' in global.Math) {\r\n /* Some versions of Safari on ios do not properly implement this */\r\n return Math.imul(0xffffffff, 5) === -5;\r\n }\r\n return false;\r\n}, true);\r\n/* Object */\r\nadd('es6-object', () => {\r\n return true &&\r\n ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof global.Object[name] === 'function');\r\n}, true);\r\nadd('es2017-object', () => {\r\n return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof global.Object[name] === 'function');\r\n}, true);\r\n/* Observable */\r\nadd('es-observable', () => typeof global.Observable !== 'undefined', true);\r\n/* Promise */\r\nadd('es6-promise', () => typeof global.Promise !== 'undefined' && true, true);\r\n/* Set */\r\nadd('es6-set', () => {\r\n if (typeof global.Set === 'function') {\r\n /* IE11 and older versions of Safari are missing critical ES6 Set functionality */\r\n const set = new global.Set([1]);\r\n return set.has(1) && 'keys' in set && typeof set.keys === 'function' && true;\r\n }\r\n return false;\r\n}, true);\r\n/* String */\r\nadd('es6-string', () => {\r\n return ([\r\n /* static methods */\r\n 'fromCodePoint'\r\n ].every((key) => typeof global.String[key] === 'function') &&\r\n [\r\n /* instance methods */\r\n 'codePointAt',\r\n 'normalize',\r\n 'repeat',\r\n 'startsWith',\r\n 'endsWith',\r\n 'includes'\r\n ].every((key) => typeof global.String.prototype[key] === 'function'));\r\n}, true);\r\nadd('es6-string-raw', () => {\r\n function getCallSite(callSite, ...substitutions) {\r\n const result = [...callSite];\r\n result.raw = callSite.raw;\r\n return result;\r\n }\r\n if ('raw' in global.String) {\r\n let b = 1;\r\n let callSite = getCallSite `a\\n${b}`;\r\n callSite.raw = ['a\\\\n'];\r\n const supportsTrunc = global.String.raw(callSite, 42) === 'a:\\\\n';\r\n return supportsTrunc;\r\n }\r\n return false;\r\n}, true);\r\nadd('es2017-string', () => {\r\n return ['padStart', 'padEnd'].every((key) => typeof global.String.prototype[key] === 'function');\r\n}, true);\r\n/* Symbol */\r\nadd('es6-symbol', () => typeof global.Symbol !== 'undefined' && typeof Symbol() === 'symbol', true);\r\n/* WeakMap */\r\nadd('es6-weakmap', () => {\r\n if (typeof global.WeakMap !== 'undefined') {\r\n /* IE11 and older versions of Safari are missing critical ES6 Map functionality */\r\n const key1 = {};\r\n const key2 = {};\r\n const map = new global.WeakMap([[key1, 1]]);\r\n Object.freeze(key1);\r\n return map.get(key1) === 1 && map.set(key2, 2) === map && true;\r\n }\r\n return false;\r\n}, true);\r\n/* Miscellaneous features */\r\nadd('microtasks', () => true || false || true, true);\r\nadd('postmessage', () => {\r\n // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have\r\n // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist.\r\n return typeof global.window !== 'undefined' && typeof global.postMessage === 'function';\r\n}, true);\r\nadd('raf', () => typeof global.requestAnimationFrame === 'function', true);\r\nadd('setimmediate', () => typeof global.setImmediate !== 'undefined', true);\r\n/* DOM Features */\r\nadd('dom-mutationobserver', () => {\r\n if (true && Boolean(global.MutationObserver || global.WebKitMutationObserver)) {\r\n // IE11 has an unreliable MutationObserver implementation where setProperty() does not\r\n // generate a mutation event, observers can crash, and the queue does not drain\r\n // reliably. The following feature test was adapted from\r\n // https://gist.github.com/t10ko/4aceb8c71681fdb275e33efe5e576b14\r\n const example = document.createElement('div');\r\n /* tslint:disable-next-line:variable-name */\r\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\r\n const observer = new HostMutationObserver(function () { });\r\n observer.observe(example, { attributes: true });\r\n example.style.setProperty('display', 'block');\r\n return Boolean(observer.takeRecords().length);\r\n }\r\n return false;\r\n}, true);\r\nadd('dom-webanimation', () => true && global.Animation !== undefined && global.KeyframeEffect !== undefined, true);\r\n//# sourceMappingURL=has.mjs.map" + "source": "import has, { add } from '../../has/has';\r\nimport global from '../global';\r\nexport default has;\r\nexport * from '../../has/has';\r\n/* ECMAScript 6 and 7 Features */\r\n/* Array */\r\nadd('es6-array', () => {\r\n return (['from', 'of'].every((key) => key in global.Array) &&\r\n ['findIndex', 'find', 'copyWithin'].every((key) => key in global.Array.prototype));\r\n}, true);\r\nadd('es6-array-fill', () => {\r\n if ('fill' in global.Array.prototype) {\r\n /* Some versions of Safari do not properly implement this */\r\n return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1;\r\n }\r\n return false;\r\n}, true);\r\nadd('es7-array', () => 'includes' in global.Array.prototype, true);\r\n/* Map */\r\nadd('es6-map', () => {\r\n if (typeof global.Map === 'function') {\r\n /*\r\n IE11 and older versions of Safari are missing critical ES6 Map functionality\r\n We wrap this in a try/catch because sometimes the Map constructor exists, but does not\r\n take arguments (iOS 8.4)\r\n */\r\n try {\r\n const map = new global.Map([[0, 1]]);\r\n return map.has(0) &&\r\n typeof map.keys === 'function' &&\r\n true &&\r\n typeof map.values === 'function' &&\r\n typeof map.entries === 'function';\r\n }\r\n catch (e) {\r\n /* istanbul ignore next: not testing on iOS at the moment */\r\n return false;\r\n }\r\n }\r\n return false;\r\n}, true);\r\n/* Math */\r\nadd('es6-math', () => {\r\n return [\r\n 'clz32',\r\n 'sign',\r\n 'log10',\r\n 'log2',\r\n 'log1p',\r\n 'expm1',\r\n 'cosh',\r\n 'sinh',\r\n 'tanh',\r\n 'acosh',\r\n 'asinh',\r\n 'atanh',\r\n 'trunc',\r\n 'fround',\r\n 'cbrt',\r\n 'hypot'\r\n ].every((name) => typeof global.Math[name] === 'function');\r\n}, true);\r\nadd('es6-math-imul', () => {\r\n if ('imul' in global.Math) {\r\n /* Some versions of Safari on ios do not properly implement this */\r\n return Math.imul(0xffffffff, 5) === -5;\r\n }\r\n return false;\r\n}, true);\r\n/* Object */\r\nadd('es6-object', () => {\r\n return true &&\r\n ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof global.Object[name] === 'function');\r\n}, true);\r\nadd('es2017-object', () => {\r\n return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof global.Object[name] === 'function');\r\n}, true);\r\n/* Observable */\r\nadd('es-observable', () => typeof global.Observable !== 'undefined', true);\r\n/* Promise */\r\nadd('es6-promise', () => typeof global.Promise !== 'undefined' && true, true);\r\n/* Set */\r\nadd('es6-set', () => {\r\n if (typeof global.Set === 'function') {\r\n /* IE11 and older versions of Safari are missing critical ES6 Set functionality */\r\n const set = new global.Set([1]);\r\n return set.has(1) && 'keys' in set && typeof set.keys === 'function' && true;\r\n }\r\n return false;\r\n}, true);\r\n/* String */\r\nadd('es6-string', () => {\r\n return ([\r\n /* static methods */\r\n 'fromCodePoint'\r\n ].every((key) => typeof global.String[key] === 'function') &&\r\n [\r\n /* instance methods */\r\n 'codePointAt',\r\n 'normalize',\r\n 'repeat',\r\n 'startsWith',\r\n 'endsWith',\r\n 'includes'\r\n ].every((key) => typeof global.String.prototype[key] === 'function'));\r\n}, true);\r\nadd('es6-string-raw', () => {\r\n function getCallSite(callSite, ...substitutions) {\r\n const result = [...callSite];\r\n result.raw = callSite.raw;\r\n return result;\r\n }\r\n if ('raw' in global.String) {\r\n let b = 1;\r\n let callSite = getCallSite `a\\n${b}`;\r\n callSite.raw = ['a\\\\n'];\r\n const supportsTrunc = global.String.raw(callSite, 42) === 'a:\\\\n';\r\n return supportsTrunc;\r\n }\r\n return false;\r\n}, true);\r\nadd('es2017-string', () => {\r\n return ['padStart', 'padEnd'].every((key) => typeof global.String.prototype[key] === 'function');\r\n}, true);\r\n/* Symbol */\r\nadd('es6-symbol', () => typeof global.Symbol !== 'undefined' && typeof Symbol() === 'symbol', true);\r\n/* WeakMap */\r\nadd('es6-weakmap', () => {\r\n if (typeof global.WeakMap !== 'undefined') {\r\n /* IE11 and older versions of Safari are missing critical ES6 Map functionality */\r\n const key1 = {};\r\n const key2 = {};\r\n const map = new global.WeakMap([[key1, 1]]);\r\n Object.freeze(key1);\r\n return map.get(key1) === 1 && map.set(key2, 2) === map && true;\r\n }\r\n return false;\r\n}, true);\r\n/* Miscellaneous features */\r\nadd('microtasks', () => true || false || true, true);\r\nadd('postmessage', () => {\r\n // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have\r\n // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist.\r\n return typeof global.window !== 'undefined' && typeof global.postMessage === 'function';\r\n}, true);\r\nadd('raf', () => typeof global.requestAnimationFrame === 'function', true);\r\nadd('setimmediate', () => typeof global.setImmediate !== 'undefined', true);\r\n/* DOM Features */\r\nadd('dom-mutationobserver', () => {\r\n if (true && Boolean(global.MutationObserver || global.WebKitMutationObserver)) {\r\n // IE11 has an unreliable MutationObserver implementation where setProperty() does not\r\n // generate a mutation event, observers can crash, and the queue does not drain\r\n // reliably. The following feature test was adapted from\r\n // https://gist.github.com/t10ko/4aceb8c71681fdb275e33efe5e576b14\r\n const example = document.createElement('div');\r\n /* tslint:disable-next-line:variable-name */\r\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\r\n const observer = new HostMutationObserver(function () { });\r\n observer.observe(example, { attributes: true });\r\n example.style.setProperty('display', 'block');\r\n return Boolean(observer.takeRecords().length);\r\n }\r\n return false;\r\n}, true);\r\nadd('dom-webanimation', () => true && global.Animation !== undefined && global.KeyframeEffect !== undefined, true);\r\n//# sourceMappingURL=has.mjs.map" }, { - "id": "./node_modules/@dojo/shim/support/queue.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\queue.mjs", - "name": "./node_modules/@dojo/shim/support/queue.mjs", + "id": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\queue.mjs", + "name": "./node_modules/@dojo/framework/shim/support/queue.mjs", "index": 23, "index2": 14, "size": 6381, @@ -3790,18 +3798,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Promise.mjs", - "issuerId": "./node_modules/@dojo/shim/Promise.mjs", - "issuerName": "./node_modules/@dojo/shim/Promise.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Promise.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/Promise.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./support/queue", "loc": "2:0-49" @@ -3818,9 +3826,9 @@ "source": "import global from '../global';\r\nimport has from './has';\r\nfunction executeTask(item) {\r\n if (item && item.isActive && item.callback) {\r\n item.callback();\r\n }\r\n}\r\nfunction getQueueHandle(item, destructor) {\r\n return {\r\n destroy: function () {\r\n this.destroy = function () { };\r\n item.isActive = false;\r\n item.callback = null;\r\n if (destructor) {\r\n destructor();\r\n }\r\n }\r\n };\r\n}\r\nlet checkMicroTaskQueue;\r\nlet microTasks;\r\n/**\r\n * Schedules a callback to the macrotask queue.\r\n *\r\n * @param callback the function to be queued and later executed.\r\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\r\n */\r\nexport const queueTask = (function () {\r\n let destructor;\r\n let enqueue;\r\n // Since the IE implementation of `setImmediate` is not flawless, we will test for `postMessage` first.\r\n if (true) {\r\n const queue = [];\r\n global.addEventListener('message', function (event) {\r\n // Confirm that the event was triggered by the current window and by this particular implementation.\r\n if (event.source === global && event.data === 'dojo-queue-message') {\r\n event.stopPropagation();\r\n if (queue.length) {\r\n executeTask(queue.shift());\r\n }\r\n }\r\n });\r\n enqueue = function (item) {\r\n queue.push(item);\r\n global.postMessage('dojo-queue-message', '*');\r\n };\r\n }\r\n else if (false) {\r\n destructor = global.clearImmediate;\r\n enqueue = function (item) {\r\n return setImmediate(executeTask.bind(null, item));\r\n };\r\n }\r\n else {\r\n destructor = global.clearTimeout;\r\n enqueue = function (item) {\r\n return setTimeout(executeTask.bind(null, item), 0);\r\n };\r\n }\r\n function queueTask(callback) {\r\n const item = {\r\n isActive: true,\r\n callback: callback\r\n };\r\n const id = enqueue(item);\r\n return getQueueHandle(item, destructor &&\r\n function () {\r\n destructor(id);\r\n });\r\n }\r\n // TODO: Use aspect.before when it is available.\r\n return true\r\n ? queueTask\r\n : function (callback) {\r\n checkMicroTaskQueue();\r\n return queueTask(callback);\r\n };\r\n})();\r\n// When no mechanism for registering microtasks is exposed by the environment, microtasks will\r\n// be queued and then executed in a single macrotask before the other macrotasks are executed.\r\nif (!true) {\r\n let isMicroTaskQueued = false;\r\n microTasks = [];\r\n checkMicroTaskQueue = function () {\r\n if (!isMicroTaskQueued) {\r\n isMicroTaskQueued = true;\r\n queueTask(function () {\r\n isMicroTaskQueued = false;\r\n if (microTasks.length) {\r\n let item;\r\n while ((item = microTasks.shift())) {\r\n executeTask(item);\r\n }\r\n }\r\n });\r\n }\r\n };\r\n}\r\n/**\r\n * Schedules an animation task with `window.requestAnimationFrame` if it exists, or with `queueTask` otherwise.\r\n *\r\n * Since requestAnimationFrame's behavior does not match that expected from `queueTask`, it is not used there.\r\n * However, at times it makes more sense to delegate to requestAnimationFrame; hence the following method.\r\n *\r\n * @param callback the function to be queued and later executed.\r\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\r\n */\r\nexport const queueAnimationTask = (function () {\r\n if (!true) {\r\n return queueTask;\r\n }\r\n function queueAnimationTask(callback) {\r\n const item = {\r\n isActive: true,\r\n callback: callback\r\n };\r\n const rafId = requestAnimationFrame(executeTask.bind(null, item));\r\n return getQueueHandle(item, function () {\r\n cancelAnimationFrame(rafId);\r\n });\r\n }\r\n // TODO: Use aspect.before when it is available.\r\n return true\r\n ? queueAnimationTask\r\n : function (callback) {\r\n checkMicroTaskQueue();\r\n return queueAnimationTask(callback);\r\n };\r\n})();\r\n/**\r\n * Schedules a callback to the microtask queue.\r\n *\r\n * Any callbacks registered with `queueMicroTask` will be executed before the next macrotask. If no native\r\n * mechanism for scheduling macrotasks is exposed, then any callbacks will be fired before any macrotask\r\n * registered with `queueTask` or `queueAnimationTask`.\r\n *\r\n * @param callback the function to be queued and later executed.\r\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\r\n */\r\nexport let queueMicroTask = (function () {\r\n let enqueue;\r\n if (false) {\r\n enqueue = function (item) {\r\n global.process.nextTick(executeTask.bind(null, item));\r\n };\r\n }\r\n else if (true) {\r\n enqueue = function (item) {\r\n global.Promise.resolve(item).then(executeTask);\r\n };\r\n }\r\n else if (true) {\r\n /* tslint:disable-next-line:variable-name */\r\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\r\n const node = document.createElement('div');\r\n const queue = [];\r\n const observer = new HostMutationObserver(function () {\r\n while (queue.length > 0) {\r\n const item = queue.shift();\r\n if (item && item.isActive && item.callback) {\r\n item.callback();\r\n }\r\n }\r\n });\r\n observer.observe(node, { attributes: true });\r\n enqueue = function (item) {\r\n queue.push(item);\r\n node.setAttribute('queueStatus', '1');\r\n };\r\n }\r\n else {\r\n enqueue = function (item) {\r\n checkMicroTaskQueue();\r\n microTasks.push(item);\r\n };\r\n }\r\n return function (callback) {\r\n const item = {\r\n isActive: true,\r\n callback: callback\r\n };\r\n enqueue(item);\r\n return getQueueHandle(item);\r\n };\r\n})();\r\n//# sourceMappingURL=queue.mjs.map" }, { - "id": "./node_modules/@dojo/shim/support/util.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\util.mjs", - "name": "./node_modules/@dojo/shim/support/util.mjs", + "id": "./node_modules/@dojo/framework/shim/support/util.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\util.mjs", + "name": "./node_modules/@dojo/framework/shim/support/util.mjs", "index": 11, "index2": 6, "size": 853, @@ -3832,36 +3840,36 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./support/util", "loc": "5:0-44" }, { - "moduleId": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Symbol.mjs", - "module": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleName": "./node_modules/@dojo/shim/Symbol.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Symbol.mjs", + "module": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Symbol.mjs", "type": "harmony import", "userRequest": "./support/util", "loc": "3:0-52" }, { - "moduleId": "./node_modules/@dojo/shim/string.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\string.mjs", - "module": "./node_modules/@dojo/shim/string.mjs", - "moduleName": "./node_modules/@dojo/shim/string.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\string.mjs", + "module": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/string.mjs", "type": "harmony import", "userRequest": "./support/util", "loc": "3:0-44" @@ -3880,12 +3888,12 @@ "source": "/**\n * Helper function to generate a value property descriptor\n *\n * @param value The value the property descriptor should be set to\n * @param enumerable If the property should be enumberable, defaults to false\n * @param writable If the property should be writable, defaults to true\n * @param configurable If the property should be configurable, defaults to true\n * @return The property descriptor object\n */\nexport function getValueDescriptor(value, enumerable = false, writable = true, configurable = true) {\n return {\n value: value,\n enumerable: enumerable,\n writable: writable,\n configurable: configurable\n };\n}\nexport function wrapNative(nativeFunction) {\n return function (target, ...args) {\n return nativeFunction.apply(target, args);\n };\n}\n//# sourceMappingURL=util.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/Injector.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Injector.mjs", - "name": "./node_modules/@dojo/widget-core/Injector.mjs", + "id": "./node_modules/@dojo/framework/widget-core/Injector.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Injector.mjs", + "name": "./node_modules/@dojo/framework/widget-core/Injector.mjs", "index": 37, "index2": 31, - "size": 496, + "size": 493, "cacheable": true, "built": true, "optional": false, @@ -3894,18 +3902,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../Injector", "loc": "2:0-41" @@ -3920,15 +3928,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { Evented } from '@dojo/core/Evented';\nexport class Injector extends Evented {\n constructor(payload) {\n super();\n this._payload = payload;\n }\n setInvalidator(invalidator) {\n this._invalidator = invalidator;\n }\n get() {\n return this._payload;\n }\n set(payload) {\n this._payload = payload;\n if (this._invalidator) {\n this._invalidator();\n }\n }\n}\nexport default Injector;\n//# sourceMappingURL=Injector.mjs.map" + "source": "import { Evented } from '../core/Evented';\nexport class Injector extends Evented {\n constructor(payload) {\n super();\n this._payload = payload;\n }\n setInvalidator(invalidator) {\n this._invalidator = invalidator;\n }\n get() {\n return this._payload;\n }\n set(payload) {\n this._payload = payload;\n if (this._invalidator) {\n this._invalidator();\n }\n }\n}\nexport default Injector;\n//# sourceMappingURL=Injector.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\NodeHandler.mjs", - "name": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "id": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\NodeHandler.mjs", + "name": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", "index": 28, "index2": 22, - "size": 1134, + "size": 1128, "cacheable": true, "built": true, "optional": false, @@ -3937,18 +3945,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./NodeHandler", "loc": "7:0-40" @@ -3964,15 +3972,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { Evented } from '@dojo/core/Evented';\r\nimport Map from '@dojo/shim/Map';\r\n/**\r\n * Enum to identify the type of event.\r\n * Listening to 'Projector' will notify when projector is created or updated\r\n * Listening to 'Widget' will notify when widget root is created or updated\r\n */\r\nexport var NodeEventType;\r\n(function (NodeEventType) {\r\n NodeEventType[\"Projector\"] = \"Projector\";\r\n NodeEventType[\"Widget\"] = \"Widget\";\r\n})(NodeEventType || (NodeEventType = {}));\r\nexport class NodeHandler extends Evented {\r\n constructor() {\r\n super(...arguments);\r\n this._nodeMap = new Map();\r\n }\r\n get(key) {\r\n return this._nodeMap.get(key);\r\n }\r\n has(key) {\r\n return this._nodeMap.has(key);\r\n }\r\n add(element, key) {\r\n this._nodeMap.set(key, element);\r\n this.emit({ type: key });\r\n }\r\n addRoot() {\r\n this.emit({ type: NodeEventType.Widget });\r\n }\r\n addProjector() {\r\n this.emit({ type: NodeEventType.Projector });\r\n }\r\n clear() {\r\n this._nodeMap.clear();\r\n }\r\n}\r\nexport default NodeHandler;\r\n//# sourceMappingURL=NodeHandler.mjs.map" + "source": "import { Evented } from '../core/Evented';\r\nimport Map from '../shim/Map';\r\n/**\r\n * Enum to identify the type of event.\r\n * Listening to 'Projector' will notify when projector is created or updated\r\n * Listening to 'Widget' will notify when widget root is created or updated\r\n */\r\nexport var NodeEventType;\r\n(function (NodeEventType) {\r\n NodeEventType[\"Projector\"] = \"Projector\";\r\n NodeEventType[\"Widget\"] = \"Widget\";\r\n})(NodeEventType || (NodeEventType = {}));\r\nexport class NodeHandler extends Evented {\r\n constructor() {\r\n super(...arguments);\r\n this._nodeMap = new Map();\r\n }\r\n get(key) {\r\n return this._nodeMap.get(key);\r\n }\r\n has(key) {\r\n return this._nodeMap.has(key);\r\n }\r\n add(element, key) {\r\n this._nodeMap.set(key, element);\r\n this.emit({ type: key });\r\n }\r\n addRoot() {\r\n this.emit({ type: NodeEventType.Widget });\r\n }\r\n addProjector() {\r\n this.emit({ type: NodeEventType.Projector });\r\n }\r\n clear() {\r\n this._nodeMap.clear();\r\n }\r\n}\r\nexport default NodeHandler;\r\n//# sourceMappingURL=NodeHandler.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/Registry.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Registry.mjs", - "name": "./node_modules/@dojo/widget-core/Registry.mjs", + "id": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Registry.mjs", + "name": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "index": 21, "index2": 19, - "size": 3814, + "size": 3802, "cacheable": true, "built": true, "optional": false, @@ -3981,54 +3989,54 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./Registry", "loc": "9:0-71" }, { - "moduleId": "./node_modules/@dojo/widget-core/diff.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\diff.mjs", - "module": "./node_modules/@dojo/widget-core/diff.mjs", - "moduleName": "./node_modules/@dojo/widget-core/diff.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\RegistryHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "type": "harmony import", "userRequest": "./Registry", - "loc": "1:0-46" + "loc": "3:0-38" }, { - "moduleId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\RegistryHandler.mjs", - "module": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/diff.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\diff.mjs", + "module": "./node_modules/@dojo/framework/widget-core/diff.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/diff.mjs", "type": "harmony import", "userRequest": "./Registry", - "loc": "3:0-38" + "loc": "1:0-46" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", "userRequest": "./Registry", "loc": "4:0-53" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\customElement.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\customElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", "type": "harmony import", "userRequest": "../Registry", "loc": "2:0-35" @@ -4049,15 +4057,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import Promise from '@dojo/shim/Promise';\r\nimport Map from '@dojo/shim/Map';\r\nimport Symbol from '@dojo/shim/Symbol';\r\nimport { Evented } from '@dojo/core/Evented';\r\n/**\r\n * Widget base symbol type\r\n */\r\nexport const WIDGET_BASE_TYPE = Symbol('Widget Base');\r\n/**\r\n * Checks is the item is a subclass of WidgetBase (or a WidgetBase)\r\n *\r\n * @param item the item to check\r\n * @returns true/false indicating if the item is a WidgetBaseConstructor\r\n */\r\nexport function isWidgetBaseConstructor(item) {\r\n return Boolean(item && item._type === WIDGET_BASE_TYPE);\r\n}\r\nexport function isWidgetConstructorDefaultExport(item) {\r\n return Boolean(item &&\r\n item.hasOwnProperty('__esModule') &&\r\n item.hasOwnProperty('default') &&\r\n isWidgetBaseConstructor(item.default));\r\n}\r\n/**\r\n * The Registry implementation\r\n */\r\nexport class Registry extends Evented {\r\n /**\r\n * Emit loaded event for registry label\r\n */\r\n emitLoadedEvent(widgetLabel, item) {\r\n this.emit({\r\n type: widgetLabel,\r\n action: 'loaded',\r\n item\r\n });\r\n }\r\n define(label, item) {\r\n if (this._widgetRegistry === undefined) {\r\n this._widgetRegistry = new Map();\r\n }\r\n if (this._widgetRegistry.has(label)) {\r\n throw new Error(`widget has already been registered for '${label.toString()}'`);\r\n }\r\n this._widgetRegistry.set(label, item);\r\n if (item instanceof Promise) {\r\n item.then((widgetCtor) => {\r\n this._widgetRegistry.set(label, widgetCtor);\r\n this.emitLoadedEvent(label, widgetCtor);\r\n return widgetCtor;\r\n }, (error) => {\r\n throw error;\r\n });\r\n }\r\n else if (isWidgetBaseConstructor(item)) {\r\n this.emitLoadedEvent(label, item);\r\n }\r\n }\r\n defineInjector(label, injectorFactory) {\r\n if (this._injectorRegistry === undefined) {\r\n this._injectorRegistry = new Map();\r\n }\r\n if (this._injectorRegistry.has(label)) {\r\n throw new Error(`injector has already been registered for '${label.toString()}'`);\r\n }\r\n const invalidator = new Evented();\r\n const injectorItem = {\r\n injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })),\r\n invalidator\r\n };\r\n this._injectorRegistry.set(label, injectorItem);\r\n this.emitLoadedEvent(label, injectorItem);\r\n }\r\n get(label) {\r\n if (!this._widgetRegistry || !this.has(label)) {\r\n return null;\r\n }\r\n const item = this._widgetRegistry.get(label);\r\n if (isWidgetBaseConstructor(item)) {\r\n return item;\r\n }\r\n if (item instanceof Promise) {\r\n return null;\r\n }\r\n const promise = item();\r\n this._widgetRegistry.set(label, promise);\r\n promise.then((widgetCtor) => {\r\n if (isWidgetConstructorDefaultExport(widgetCtor)) {\r\n widgetCtor = widgetCtor.default;\r\n }\r\n this._widgetRegistry.set(label, widgetCtor);\r\n this.emitLoadedEvent(label, widgetCtor);\r\n return widgetCtor;\r\n }, (error) => {\r\n throw error;\r\n });\r\n return null;\r\n }\r\n getInjector(label) {\r\n if (!this._injectorRegistry || !this.hasInjector(label)) {\r\n return null;\r\n }\r\n return this._injectorRegistry.get(label);\r\n }\r\n has(label) {\r\n return Boolean(this._widgetRegistry && this._widgetRegistry.has(label));\r\n }\r\n hasInjector(label) {\r\n return Boolean(this._injectorRegistry && this._injectorRegistry.has(label));\r\n }\r\n}\r\nexport default Registry;\r\n//# sourceMappingURL=Registry.mjs.map" + "source": "import Promise from '../shim/Promise';\r\nimport Map from '../shim/Map';\r\nimport Symbol from '../shim/Symbol';\r\nimport { Evented } from '../core/Evented';\r\n/**\r\n * Widget base symbol type\r\n */\r\nexport const WIDGET_BASE_TYPE = Symbol('Widget Base');\r\n/**\r\n * Checks is the item is a subclass of WidgetBase (or a WidgetBase)\r\n *\r\n * @param item the item to check\r\n * @returns true/false indicating if the item is a WidgetBaseConstructor\r\n */\r\nexport function isWidgetBaseConstructor(item) {\r\n return Boolean(item && item._type === WIDGET_BASE_TYPE);\r\n}\r\nexport function isWidgetConstructorDefaultExport(item) {\r\n return Boolean(item &&\r\n item.hasOwnProperty('__esModule') &&\r\n item.hasOwnProperty('default') &&\r\n isWidgetBaseConstructor(item.default));\r\n}\r\n/**\r\n * The Registry implementation\r\n */\r\nexport class Registry extends Evented {\r\n /**\r\n * Emit loaded event for registry label\r\n */\r\n emitLoadedEvent(widgetLabel, item) {\r\n this.emit({\r\n type: widgetLabel,\r\n action: 'loaded',\r\n item\r\n });\r\n }\r\n define(label, item) {\r\n if (this._widgetRegistry === undefined) {\r\n this._widgetRegistry = new Map();\r\n }\r\n if (this._widgetRegistry.has(label)) {\r\n throw new Error(`widget has already been registered for '${label.toString()}'`);\r\n }\r\n this._widgetRegistry.set(label, item);\r\n if (item instanceof Promise) {\r\n item.then((widgetCtor) => {\r\n this._widgetRegistry.set(label, widgetCtor);\r\n this.emitLoadedEvent(label, widgetCtor);\r\n return widgetCtor;\r\n }, (error) => {\r\n throw error;\r\n });\r\n }\r\n else if (isWidgetBaseConstructor(item)) {\r\n this.emitLoadedEvent(label, item);\r\n }\r\n }\r\n defineInjector(label, injectorFactory) {\r\n if (this._injectorRegistry === undefined) {\r\n this._injectorRegistry = new Map();\r\n }\r\n if (this._injectorRegistry.has(label)) {\r\n throw new Error(`injector has already been registered for '${label.toString()}'`);\r\n }\r\n const invalidator = new Evented();\r\n const injectorItem = {\r\n injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })),\r\n invalidator\r\n };\r\n this._injectorRegistry.set(label, injectorItem);\r\n this.emitLoadedEvent(label, injectorItem);\r\n }\r\n get(label) {\r\n if (!this._widgetRegistry || !this.has(label)) {\r\n return null;\r\n }\r\n const item = this._widgetRegistry.get(label);\r\n if (isWidgetBaseConstructor(item)) {\r\n return item;\r\n }\r\n if (item instanceof Promise) {\r\n return null;\r\n }\r\n const promise = item();\r\n this._widgetRegistry.set(label, promise);\r\n promise.then((widgetCtor) => {\r\n if (isWidgetConstructorDefaultExport(widgetCtor)) {\r\n widgetCtor = widgetCtor.default;\r\n }\r\n this._widgetRegistry.set(label, widgetCtor);\r\n this.emitLoadedEvent(label, widgetCtor);\r\n return widgetCtor;\r\n }, (error) => {\r\n throw error;\r\n });\r\n return null;\r\n }\r\n getInjector(label) {\r\n if (!this._injectorRegistry || !this.hasInjector(label)) {\r\n return null;\r\n }\r\n return this._injectorRegistry.get(label);\r\n }\r\n has(label) {\r\n return Boolean(this._widgetRegistry && this._widgetRegistry.has(label));\r\n }\r\n hasInjector(label) {\r\n return Boolean(this._injectorRegistry && this._injectorRegistry.has(label));\r\n }\r\n}\r\nexport default Registry;\r\n//# sourceMappingURL=Registry.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\RegistryHandler.mjs", - "name": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "id": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\RegistryHandler.mjs", + "name": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "index": 27, "index2": 21, - "size": 2933, + "size": 2927, "cacheable": true, "built": true, "optional": false, @@ -4066,18 +4074,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./RegistryHandler", "loc": "6:0-48" @@ -4092,15 +4100,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { Map } from '@dojo/shim/Map';\r\nimport { Evented } from '@dojo/core/Evented';\r\nimport { Registry } from './Registry';\r\nexport class RegistryHandler extends Evented {\r\n constructor() {\r\n super();\r\n this._registry = new Registry();\r\n this._registryWidgetLabelMap = new Map();\r\n this._registryInjectorLabelMap = new Map();\r\n this.own(this._registry);\r\n const destroy = () => {\r\n if (this.baseRegistry) {\r\n this._registryWidgetLabelMap.delete(this.baseRegistry);\r\n this._registryInjectorLabelMap.delete(this.baseRegistry);\r\n this.baseRegistry = undefined;\r\n }\r\n };\r\n this.own({ destroy });\r\n }\r\n set base(baseRegistry) {\r\n if (this.baseRegistry) {\r\n this._registryWidgetLabelMap.delete(this.baseRegistry);\r\n this._registryInjectorLabelMap.delete(this.baseRegistry);\r\n }\r\n this.baseRegistry = baseRegistry;\r\n }\r\n define(label, widget) {\r\n this._registry.define(label, widget);\r\n }\r\n defineInjector(label, injector) {\r\n this._registry.defineInjector(label, injector);\r\n }\r\n has(label) {\r\n return this._registry.has(label) || Boolean(this.baseRegistry && this.baseRegistry.has(label));\r\n }\r\n hasInjector(label) {\r\n return this._registry.hasInjector(label) || Boolean(this.baseRegistry && this.baseRegistry.hasInjector(label));\r\n }\r\n get(label, globalPrecedence = false) {\r\n return this._get(label, globalPrecedence, 'get', this._registryWidgetLabelMap);\r\n }\r\n getInjector(label, globalPrecedence = false) {\r\n return this._get(label, globalPrecedence, 'getInjector', this._registryInjectorLabelMap);\r\n }\r\n _get(label, globalPrecedence, getFunctionName, labelMap) {\r\n const registries = globalPrecedence ? [this.baseRegistry, this._registry] : [this._registry, this.baseRegistry];\r\n for (let i = 0; i < registries.length; i++) {\r\n const registry = registries[i];\r\n if (!registry) {\r\n continue;\r\n }\r\n const item = registry[getFunctionName](label);\r\n const registeredLabels = labelMap.get(registry) || [];\r\n if (item) {\r\n return item;\r\n }\r\n else if (registeredLabels.indexOf(label) === -1) {\r\n const handle = registry.on(label, (event) => {\r\n if (event.action === 'loaded' &&\r\n this[getFunctionName](label, globalPrecedence) === event.item) {\r\n this.emit({ type: 'invalidate' });\r\n }\r\n });\r\n this.own(handle);\r\n labelMap.set(registry, [...registeredLabels, label]);\r\n }\r\n }\r\n return null;\r\n }\r\n}\r\nexport default RegistryHandler;\r\n//# sourceMappingURL=RegistryHandler.mjs.map" + "source": "import { Map } from '../shim/Map';\r\nimport { Evented } from '../core/Evented';\r\nimport { Registry } from './Registry';\r\nexport class RegistryHandler extends Evented {\r\n constructor() {\r\n super();\r\n this._registry = new Registry();\r\n this._registryWidgetLabelMap = new Map();\r\n this._registryInjectorLabelMap = new Map();\r\n this.own(this._registry);\r\n const destroy = () => {\r\n if (this.baseRegistry) {\r\n this._registryWidgetLabelMap.delete(this.baseRegistry);\r\n this._registryInjectorLabelMap.delete(this.baseRegistry);\r\n this.baseRegistry = undefined;\r\n }\r\n };\r\n this.own({ destroy });\r\n }\r\n set base(baseRegistry) {\r\n if (this.baseRegistry) {\r\n this._registryWidgetLabelMap.delete(this.baseRegistry);\r\n this._registryInjectorLabelMap.delete(this.baseRegistry);\r\n }\r\n this.baseRegistry = baseRegistry;\r\n }\r\n define(label, widget) {\r\n this._registry.define(label, widget);\r\n }\r\n defineInjector(label, injector) {\r\n this._registry.defineInjector(label, injector);\r\n }\r\n has(label) {\r\n return this._registry.has(label) || Boolean(this.baseRegistry && this.baseRegistry.has(label));\r\n }\r\n hasInjector(label) {\r\n return this._registry.hasInjector(label) || Boolean(this.baseRegistry && this.baseRegistry.hasInjector(label));\r\n }\r\n get(label, globalPrecedence = false) {\r\n return this._get(label, globalPrecedence, 'get', this._registryWidgetLabelMap);\r\n }\r\n getInjector(label, globalPrecedence = false) {\r\n return this._get(label, globalPrecedence, 'getInjector', this._registryInjectorLabelMap);\r\n }\r\n _get(label, globalPrecedence, getFunctionName, labelMap) {\r\n const registries = globalPrecedence ? [this.baseRegistry, this._registry] : [this._registry, this.baseRegistry];\r\n for (let i = 0; i < registries.length; i++) {\r\n const registry = registries[i];\r\n if (!registry) {\r\n continue;\r\n }\r\n const item = registry[getFunctionName](label);\r\n const registeredLabels = labelMap.get(registry) || [];\r\n if (item) {\r\n return item;\r\n }\r\n else if (registeredLabels.indexOf(label) === -1) {\r\n const handle = registry.on(label, (event) => {\r\n if (event.action === 'loaded' &&\r\n this[getFunctionName](label, globalPrecedence) === event.item) {\r\n this.emit({ type: 'invalidate' });\r\n }\r\n });\r\n this.own(handle);\r\n labelMap.set(registry, [...registeredLabels, label]);\r\n }\r\n }\r\n return null;\r\n }\r\n}\r\nexport default RegistryHandler;\r\n//# sourceMappingURL=RegistryHandler.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "name": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "id": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "name": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "index": 14, "index2": 26, - "size": 14386, + "size": 13720, "cacheable": true, "built": true, "optional": false, @@ -4109,18 +4117,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./WidgetBase", "loc": "2:0-50" @@ -4131,8 +4139,8 @@ "module": "./src/menu-item/MenuItem.ts", "moduleName": "./src/menu-item/MenuItem.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/WidgetBase", - "loc": "5:0-58" + "userRequest": "@dojo/framework/widget-core/WidgetBase", + "loc": "5:0-68" } ], "usedExports": [ @@ -4146,12 +4154,12 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import Map from '@dojo/shim/Map';\nimport WeakMap from '@dojo/shim/WeakMap';\nimport Symbol from '@dojo/shim/Symbol';\nimport { v } from './d';\nimport { auto } from './diff';\nimport RegistryHandler from './RegistryHandler';\nimport NodeHandler from './NodeHandler';\nimport { widgetInstanceMap } from './vdom';\nimport { isWidgetBaseConstructor, WIDGET_BASE_TYPE } from './Registry';\nconst decoratorMap = new Map();\nconst boundAuto = auto.bind(null);\nexport const noBind = Symbol.for('dojoNoBind');\n/**\n * Main widget base for all widgets to extend\n */\nexport class WidgetBase {\n /**\n * @constructor\n */\n constructor() {\n /**\n * Indicates if it is the initial set properties cycle\n */\n this._initialProperties = true;\n /**\n * Array of property keys considered changed from the previous set properties\n */\n this._changedPropertyKeys = [];\n this._nodeHandler = new NodeHandler();\n this._handles = [];\n this._children = [];\n this._decoratorCache = new Map();\n this._properties = {};\n this._boundRenderFunc = this.render.bind(this);\n this._boundInvalidate = this.invalidate.bind(this);\n widgetInstanceMap.set(this, {\n dirty: true,\n onAttach: () => {\n this.onAttach();\n },\n onDetach: () => {\n this.onDetach();\n this.destroy();\n },\n nodeHandler: this._nodeHandler,\n registry: () => {\n return this.registry;\n },\n coreProperties: {},\n rendering: false,\n inputProperties: {}\n });\n this._runAfterConstructors();\n }\n meta(MetaType) {\n if (this._metaMap === undefined) {\n this._metaMap = new Map();\n }\n let cached = this._metaMap.get(MetaType);\n if (!cached) {\n cached = new MetaType({\n invalidate: this._boundInvalidate,\n nodeHandler: this._nodeHandler,\n bind: this\n });\n this.own(cached);\n this._metaMap.set(MetaType, cached);\n }\n return cached;\n }\n onAttach() {\n // Do nothing by default.\n }\n onDetach() {\n // Do nothing by default.\n }\n get properties() {\n return this._properties;\n }\n get changedPropertyKeys() {\n return [...this._changedPropertyKeys];\n }\n __setCoreProperties__(coreProperties) {\n const { baseRegistry } = coreProperties;\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.coreProperties.baseRegistry !== baseRegistry) {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n this._registry.base = baseRegistry;\n this.invalidate();\n }\n instanceData.coreProperties = coreProperties;\n }\n __setProperties__(originalProperties) {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.inputProperties = originalProperties;\n const properties = this._runBeforeProperties(originalProperties);\n const registeredDiffPropertyNames = this.getDecorator('registeredDiffProperty');\n const changedPropertyKeys = [];\n const propertyNames = Object.keys(properties);\n if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) {\n const allProperties = [...propertyNames, ...Object.keys(this._properties)];\n const checkedProperties = [];\n const diffPropertyResults = {};\n let runReactions = false;\n for (let i = 0; i < allProperties.length; i++) {\n const propertyName = allProperties[i];\n if (checkedProperties.indexOf(propertyName) !== -1) {\n continue;\n }\n checkedProperties.push(propertyName);\n const previousProperty = this._properties[propertyName];\n const newProperty = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n if (registeredDiffPropertyNames.indexOf(propertyName) !== -1) {\n runReactions = true;\n const diffFunctions = this.getDecorator(`diffProperty:${propertyName}`);\n for (let i = 0; i < diffFunctions.length; i++) {\n const result = diffFunctions[i](previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n else {\n const result = boundAuto(previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n if (runReactions) {\n this._mapDiffPropertyReactions(properties, changedPropertyKeys).forEach((args, reaction) => {\n if (args.changed) {\n reaction.call(this, args.previousProperties, args.newProperties);\n }\n });\n }\n this._properties = diffPropertyResults;\n this._changedPropertyKeys = changedPropertyKeys;\n }\n else {\n this._initialProperties = false;\n for (let i = 0; i < propertyNames.length; i++) {\n const propertyName = propertyNames[i];\n if (typeof properties[propertyName] === 'function') {\n properties[propertyName] = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n }\n else {\n changedPropertyKeys.push(propertyName);\n }\n }\n this._changedPropertyKeys = changedPropertyKeys;\n this._properties = Object.assign({}, properties);\n }\n if (this._changedPropertyKeys.length > 0) {\n this.invalidate();\n }\n }\n get children() {\n return this._children;\n }\n __setChildren__(children) {\n if (this._children.length > 0 || children.length > 0) {\n this._children = children;\n this.invalidate();\n }\n }\n __render__() {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.dirty = false;\n const render = this._runBeforeRenders();\n let dNode = render();\n dNode = this.runAfterRenders(dNode);\n this._nodeHandler.clear();\n return dNode;\n }\n invalidate() {\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.invalidate) {\n instanceData.invalidate();\n }\n }\n render() {\n return v('div', {}, this.children);\n }\n /**\n * Function to add decorators to WidgetBase\n *\n * @param decoratorKey The key of the decorator\n * @param value The value of the decorator\n */\n addDecorator(decoratorKey, value) {\n value = Array.isArray(value) ? value : [value];\n if (this.hasOwnProperty('constructor')) {\n let decoratorList = decoratorMap.get(this.constructor);\n if (!decoratorList) {\n decoratorList = new Map();\n decoratorMap.set(this.constructor, decoratorList);\n }\n let specificDecoratorList = decoratorList.get(decoratorKey);\n if (!specificDecoratorList) {\n specificDecoratorList = [];\n decoratorList.set(decoratorKey, specificDecoratorList);\n }\n specificDecoratorList.push(...value);\n }\n else {\n const decorators = this.getDecorator(decoratorKey);\n this._decoratorCache.set(decoratorKey, [...decorators, ...value]);\n }\n }\n /**\n * Function to build the list of decorators from the global decorator map.\n *\n * @param decoratorKey The key of the decorator\n * @return An array of decorator values\n * @private\n */\n _buildDecoratorList(decoratorKey) {\n const allDecorators = [];\n let constructor = this.constructor;\n while (constructor) {\n const instanceMap = decoratorMap.get(constructor);\n if (instanceMap) {\n const decorators = instanceMap.get(decoratorKey);\n if (decorators) {\n allDecorators.unshift(...decorators);\n }\n }\n constructor = Object.getPrototypeOf(constructor);\n }\n return allDecorators;\n }\n /**\n * Function to retrieve decorator values\n *\n * @param decoratorKey The key of the decorator\n * @returns An array of decorator values\n */\n getDecorator(decoratorKey) {\n let allDecorators = this._decoratorCache.get(decoratorKey);\n if (allDecorators !== undefined) {\n return allDecorators;\n }\n allDecorators = this._buildDecoratorList(decoratorKey);\n this._decoratorCache.set(decoratorKey, allDecorators);\n return allDecorators;\n }\n _mapDiffPropertyReactions(newProperties, changedPropertyKeys) {\n const reactionFunctions = this.getDecorator('diffReaction');\n return reactionFunctions.reduce((reactionPropertyMap, { reaction, propertyName }) => {\n let reactionArguments = reactionPropertyMap.get(reaction);\n if (reactionArguments === undefined) {\n reactionArguments = {\n previousProperties: {},\n newProperties: {},\n changed: false\n };\n }\n reactionArguments.previousProperties[propertyName] = this._properties[propertyName];\n reactionArguments.newProperties[propertyName] = newProperties[propertyName];\n if (changedPropertyKeys.indexOf(propertyName) !== -1) {\n reactionArguments.changed = true;\n }\n reactionPropertyMap.set(reaction, reactionArguments);\n return reactionPropertyMap;\n }, new Map());\n }\n /**\n * Binds unbound property functions to the specified `bind` property\n *\n * @param properties properties to check for functions\n */\n _bindFunctionProperty(property, bind) {\n if (typeof property === 'function' && !property[noBind] && isWidgetBaseConstructor(property) === false) {\n if (this._bindFunctionPropertyMap === undefined) {\n this._bindFunctionPropertyMap = new WeakMap();\n }\n const bindInfo = this._bindFunctionPropertyMap.get(property) || {};\n let { boundFunc, scope } = bindInfo;\n if (boundFunc === undefined || scope !== bind) {\n boundFunc = property.bind(bind);\n this._bindFunctionPropertyMap.set(property, { boundFunc, scope: bind });\n }\n return boundFunc;\n }\n return property;\n }\n get registry() {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n return this._registry;\n }\n _runBeforeProperties(properties) {\n const beforeProperties = this.getDecorator('beforeProperties');\n if (beforeProperties.length > 0) {\n return beforeProperties.reduce((properties, beforePropertiesFunction) => {\n return Object.assign({}, properties, beforePropertiesFunction.call(this, properties));\n }, Object.assign({}, properties));\n }\n return properties;\n }\n /**\n * Run all registered before renders and return the updated render method\n */\n _runBeforeRenders() {\n const beforeRenders = this.getDecorator('beforeRender');\n if (beforeRenders.length > 0) {\n return beforeRenders.reduce((render, beforeRenderFunction) => {\n const updatedRender = beforeRenderFunction.call(this, render, this._properties, this._children);\n if (!updatedRender) {\n console.warn('Render function not returned from beforeRender, using previous render');\n return render;\n }\n return updatedRender;\n }, this._boundRenderFunc);\n }\n return this._boundRenderFunc;\n }\n /**\n * Run all registered after renders and return the decorated DNodes\n *\n * @param dNode The DNodes to run through the after renders\n */\n runAfterRenders(dNode) {\n const afterRenders = this.getDecorator('afterRender');\n if (afterRenders.length > 0) {\n return afterRenders.reduce((dNode, afterRenderFunction) => {\n return afterRenderFunction.call(this, dNode);\n }, dNode);\n }\n if (this._metaMap !== undefined) {\n this._metaMap.forEach((meta) => {\n meta.afterRender();\n });\n }\n return dNode;\n }\n _runAfterConstructors() {\n const afterConstructors = this.getDecorator('afterConstructor');\n if (afterConstructors.length > 0) {\n afterConstructors.forEach((afterConstructor) => afterConstructor.call(this));\n }\n }\n own(handle) {\n this._handles.push(handle);\n }\n destroy() {\n while (this._handles.length > 0) {\n const handle = this._handles.pop();\n if (handle) {\n handle.destroy();\n }\n }\n }\n}\n/**\n * static identifier\n */\nWidgetBase._type = WIDGET_BASE_TYPE;\nexport default WidgetBase;\n//# sourceMappingURL=WidgetBase.mjs.map" + "source": "import Map from '../shim/Map';\nimport WeakMap from '../shim/WeakMap';\nimport Symbol from '../shim/Symbol';\nimport { v } from './d';\nimport { auto } from './diff';\nimport RegistryHandler from './RegistryHandler';\nimport NodeHandler from './NodeHandler';\nimport { widgetInstanceMap } from './vdom';\nimport { isWidgetBaseConstructor, WIDGET_BASE_TYPE } from './Registry';\nconst decoratorMap = new Map();\nconst boundAuto = auto.bind(null);\nexport const noBind = Symbol.for('dojoNoBind');\n/**\n * Main widget base for all widgets to extend\n */\nexport class WidgetBase {\n /**\n * @constructor\n */\n constructor() {\n /**\n * Indicates if it is the initial set properties cycle\n */\n this._initialProperties = true;\n /**\n * Array of property keys considered changed from the previous set properties\n */\n this._changedPropertyKeys = [];\n this._nodeHandler = new NodeHandler();\n this._handles = [];\n this._children = [];\n this._decoratorCache = new Map();\n this._properties = {};\n this._boundRenderFunc = this.render.bind(this);\n this._boundInvalidate = this.invalidate.bind(this);\n widgetInstanceMap.set(this, {\n dirty: true,\n onAttach: () => {\n this.onAttach();\n },\n onDetach: () => {\n this.onDetach();\n this.destroy();\n },\n nodeHandler: this._nodeHandler,\n registry: () => {\n return this.registry;\n },\n coreProperties: {},\n rendering: false,\n inputProperties: {}\n });\n this._runAfterConstructors();\n }\n meta(MetaType) {\n if (this._metaMap === undefined) {\n this._metaMap = new Map();\n }\n let cached = this._metaMap.get(MetaType);\n if (!cached) {\n cached = new MetaType({\n invalidate: this._boundInvalidate,\n nodeHandler: this._nodeHandler,\n bind: this\n });\n this.own(cached);\n this._metaMap.set(MetaType, cached);\n }\n return cached;\n }\n onAttach() {\n // Do nothing by default.\n }\n onDetach() {\n // Do nothing by default.\n }\n get properties() {\n return this._properties;\n }\n get changedPropertyKeys() {\n return [...this._changedPropertyKeys];\n }\n __setCoreProperties__(coreProperties) {\n const { baseRegistry } = coreProperties;\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.coreProperties.baseRegistry !== baseRegistry) {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n this._registry.base = baseRegistry;\n this.invalidate();\n }\n instanceData.coreProperties = coreProperties;\n }\n __setProperties__(originalProperties) {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.inputProperties = originalProperties;\n const properties = this._runBeforeProperties(originalProperties);\n const registeredDiffPropertyNames = this.getDecorator('registeredDiffProperty');\n const changedPropertyKeys = [];\n const propertyNames = Object.keys(properties);\n if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) {\n const allProperties = [...propertyNames, ...Object.keys(this._properties)];\n const checkedProperties = [];\n const diffPropertyResults = {};\n let runReactions = false;\n for (let i = 0; i < allProperties.length; i++) {\n const propertyName = allProperties[i];\n if (checkedProperties.indexOf(propertyName) !== -1) {\n continue;\n }\n checkedProperties.push(propertyName);\n const previousProperty = this._properties[propertyName];\n const newProperty = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n if (registeredDiffPropertyNames.indexOf(propertyName) !== -1) {\n runReactions = true;\n const diffFunctions = this.getDecorator(`diffProperty:${propertyName}`);\n for (let i = 0; i < diffFunctions.length; i++) {\n const result = diffFunctions[i](previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n else {\n const result = boundAuto(previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n if (runReactions) {\n const reactionFunctions = this.getDecorator('diffReaction');\n const executedReactions = [];\n reactionFunctions.forEach(({ reaction, propertyName }) => {\n const propertyChanged = changedPropertyKeys.indexOf(propertyName) !== -1;\n const reactionRun = executedReactions.indexOf(reaction) !== -1;\n if (propertyChanged && !reactionRun) {\n reaction.call(this, this._properties, diffPropertyResults);\n executedReactions.push(reaction);\n }\n });\n }\n this._properties = diffPropertyResults;\n this._changedPropertyKeys = changedPropertyKeys;\n }\n else {\n this._initialProperties = false;\n for (let i = 0; i < propertyNames.length; i++) {\n const propertyName = propertyNames[i];\n if (typeof properties[propertyName] === 'function') {\n properties[propertyName] = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n }\n else {\n changedPropertyKeys.push(propertyName);\n }\n }\n this._changedPropertyKeys = changedPropertyKeys;\n this._properties = Object.assign({}, properties);\n }\n if (this._changedPropertyKeys.length > 0) {\n this.invalidate();\n }\n }\n get children() {\n return this._children;\n }\n __setChildren__(children) {\n if (this._children.length > 0 || children.length > 0) {\n this._children = children;\n this.invalidate();\n }\n }\n __render__() {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.dirty = false;\n const render = this._runBeforeRenders();\n let dNode = render();\n dNode = this.runAfterRenders(dNode);\n this._nodeHandler.clear();\n return dNode;\n }\n invalidate() {\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.invalidate) {\n instanceData.invalidate();\n }\n }\n render() {\n return v('div', {}, this.children);\n }\n /**\n * Function to add decorators to WidgetBase\n *\n * @param decoratorKey The key of the decorator\n * @param value The value of the decorator\n */\n addDecorator(decoratorKey, value) {\n value = Array.isArray(value) ? value : [value];\n if (this.hasOwnProperty('constructor')) {\n let decoratorList = decoratorMap.get(this.constructor);\n if (!decoratorList) {\n decoratorList = new Map();\n decoratorMap.set(this.constructor, decoratorList);\n }\n let specificDecoratorList = decoratorList.get(decoratorKey);\n if (!specificDecoratorList) {\n specificDecoratorList = [];\n decoratorList.set(decoratorKey, specificDecoratorList);\n }\n specificDecoratorList.push(...value);\n }\n else {\n const decorators = this.getDecorator(decoratorKey);\n this._decoratorCache.set(decoratorKey, [...decorators, ...value]);\n }\n }\n /**\n * Function to build the list of decorators from the global decorator map.\n *\n * @param decoratorKey The key of the decorator\n * @return An array of decorator values\n * @private\n */\n _buildDecoratorList(decoratorKey) {\n const allDecorators = [];\n let constructor = this.constructor;\n while (constructor) {\n const instanceMap = decoratorMap.get(constructor);\n if (instanceMap) {\n const decorators = instanceMap.get(decoratorKey);\n if (decorators) {\n allDecorators.unshift(...decorators);\n }\n }\n constructor = Object.getPrototypeOf(constructor);\n }\n return allDecorators;\n }\n /**\n * Function to retrieve decorator values\n *\n * @param decoratorKey The key of the decorator\n * @returns An array of decorator values\n */\n getDecorator(decoratorKey) {\n let allDecorators = this._decoratorCache.get(decoratorKey);\n if (allDecorators !== undefined) {\n return allDecorators;\n }\n allDecorators = this._buildDecoratorList(decoratorKey);\n this._decoratorCache.set(decoratorKey, allDecorators);\n return allDecorators;\n }\n /**\n * Binds unbound property functions to the specified `bind` property\n *\n * @param properties properties to check for functions\n */\n _bindFunctionProperty(property, bind) {\n if (typeof property === 'function' && !property[noBind] && isWidgetBaseConstructor(property) === false) {\n if (this._bindFunctionPropertyMap === undefined) {\n this._bindFunctionPropertyMap = new WeakMap();\n }\n const bindInfo = this._bindFunctionPropertyMap.get(property) || {};\n let { boundFunc, scope } = bindInfo;\n if (boundFunc === undefined || scope !== bind) {\n boundFunc = property.bind(bind);\n this._bindFunctionPropertyMap.set(property, { boundFunc, scope: bind });\n }\n return boundFunc;\n }\n return property;\n }\n get registry() {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n return this._registry;\n }\n _runBeforeProperties(properties) {\n const beforeProperties = this.getDecorator('beforeProperties');\n if (beforeProperties.length > 0) {\n return beforeProperties.reduce((properties, beforePropertiesFunction) => {\n return Object.assign({}, properties, beforePropertiesFunction.call(this, properties));\n }, Object.assign({}, properties));\n }\n return properties;\n }\n /**\n * Run all registered before renders and return the updated render method\n */\n _runBeforeRenders() {\n const beforeRenders = this.getDecorator('beforeRender');\n if (beforeRenders.length > 0) {\n return beforeRenders.reduce((render, beforeRenderFunction) => {\n const updatedRender = beforeRenderFunction.call(this, render, this._properties, this._children);\n if (!updatedRender) {\n console.warn('Render function not returned from beforeRender, using previous render');\n return render;\n }\n return updatedRender;\n }, this._boundRenderFunc);\n }\n return this._boundRenderFunc;\n }\n /**\n * Run all registered after renders and return the decorated DNodes\n *\n * @param dNode The DNodes to run through the after renders\n */\n runAfterRenders(dNode) {\n const afterRenders = this.getDecorator('afterRender');\n if (afterRenders.length > 0) {\n dNode = afterRenders.reduce((dNode, afterRenderFunction) => {\n return afterRenderFunction.call(this, dNode);\n }, dNode);\n }\n if (this._metaMap !== undefined) {\n this._metaMap.forEach((meta) => {\n meta.afterRender();\n });\n }\n return dNode;\n }\n _runAfterConstructors() {\n const afterConstructors = this.getDecorator('afterConstructor');\n if (afterConstructors.length > 0) {\n afterConstructors.forEach((afterConstructor) => afterConstructor.call(this));\n }\n }\n own(handle) {\n this._handles.push(handle);\n }\n destroy() {\n while (this._handles.length > 0) {\n const handle = this._handles.pop();\n if (handle) {\n handle.destroy();\n }\n }\n }\n}\n/**\n * static identifier\n */\nWidgetBase._type = WIDGET_BASE_TYPE;\nexport default WidgetBase;\n//# sourceMappingURL=WidgetBase.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/animations/cssTransitions.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\animations\\cssTransitions.mjs", - "name": "./node_modules/@dojo/widget-core/animations/cssTransitions.mjs", + "id": "./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\animations\\cssTransitions.mjs", + "name": "./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs", "index": 33, "index2": 27, "size": 2288, @@ -4163,18 +4171,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "../animations/cssTransitions", "loc": "3:0-58" @@ -4191,12 +4199,12 @@ "source": "let browserSpecificTransitionEndEventName = '';\nlet browserSpecificAnimationEndEventName = '';\nfunction determineBrowserStyleNames(element) {\n if ('WebkitTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'webkitTransitionEnd';\n browserSpecificAnimationEndEventName = 'webkitAnimationEnd';\n }\n else if ('transition' in element.style || 'MozTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'transitionend';\n browserSpecificAnimationEndEventName = 'animationend';\n }\n else {\n throw new Error('Your browser is not supported');\n }\n}\nfunction initialize(element) {\n if (browserSpecificAnimationEndEventName === '') {\n determineBrowserStyleNames(element);\n }\n}\nfunction runAndCleanUp(element, startAnimation, finishAnimation) {\n initialize(element);\n let finished = false;\n let transitionEnd = function () {\n if (!finished) {\n finished = true;\n element.removeEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n element.removeEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n finishAnimation();\n }\n };\n startAnimation();\n element.addEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n element.addEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n}\nfunction exit(node, properties, exitAnimation, removeNode) {\n const activeClass = properties.exitAnimationActive || `${exitAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(exitAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n removeNode();\n });\n}\nfunction enter(node, properties, enterAnimation) {\n const activeClass = properties.enterAnimationActive || `${enterAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(enterAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n node.classList.remove(enterAnimation);\n node.classList.remove(activeClass);\n });\n}\nexport default {\n enter,\n exit\n};\n//# sourceMappingURL=cssTransitions.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/d.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\d.mjs", - "name": "./node_modules/@dojo/widget-core/d.mjs", + "id": "./node_modules/@dojo/framework/widget-core/d.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\d.mjs", + "name": "./node_modules/@dojo/framework/widget-core/d.mjs", "index": 4, "index2": 8, - "size": 3270, + "size": 3267, "cacheable": true, "built": true, "optional": false, @@ -4205,54 +4213,54 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./d", "loc": "5:0-29" }, { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./d", "loc": "4:0-24" }, + { + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "type": "harmony import", + "userRequest": "./../d", + "loc": "5:0-27" + }, { "moduleId": "./src/menu-item/MenuItem.ts", "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--3-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\umd-compat-loader\\index.js??ref--3-1!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\ts-loader\\index.js??ref--3-2!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\css-module-dts-loader\\index.js?type=ts&instanceName=0_menu-item!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\src\\menu-item\\MenuItem.ts", "module": "./src/menu-item/MenuItem.ts", "moduleName": "./src/menu-item/MenuItem.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/d", - "loc": "2:0-40" - }, - { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "type": "harmony import", - "userRequest": "./../d", - "loc": "5:0-27" + "userRequest": "@dojo/framework/widget-core/d", + "loc": "2:0-50" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", "userRequest": "./d", "loc": "3:0-65" @@ -4283,12 +4291,12 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import Symbol from '@dojo/shim/Symbol';\n/**\n * The symbol identifier for a WNode type\n */\nexport const WNODE = Symbol('Identifier for a WNode.');\n/**\n * The symbol identifier for a VNode type\n */\nexport const VNODE = Symbol('Identifier for a VNode.');\n/**\n * The symbol identifier for a VNode type created using dom()\n */\nexport const DOMVNODE = Symbol('Identifier for a VNode created using existing dom.');\n/**\n * Helper function that returns true if the `DNode` is a `WNode` using the `type` property\n */\nexport function isWNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === WNODE);\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` using the `type` property\n */\nexport function isVNode(child) {\n return Boolean(child && typeof child !== 'string' && (child.type === VNODE || child.type === DOMVNODE));\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` created with `dom()` using the `type` property\n */\nexport function isDomVNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === DOMVNODE);\n}\nexport function isElementNode(value) {\n return !!value.tagName;\n}\nexport function decorate(dNodes, optionsOrModifier, predicate) {\n let shallow = false;\n let modifier;\n if (typeof optionsOrModifier === 'function') {\n modifier = optionsOrModifier;\n }\n else {\n modifier = optionsOrModifier.modifier;\n predicate = optionsOrModifier.predicate;\n shallow = optionsOrModifier.shallow || false;\n }\n let nodes = Array.isArray(dNodes) ? [...dNodes] : [dNodes];\n function breaker() {\n nodes = [];\n }\n while (nodes.length) {\n const node = nodes.shift();\n if (node) {\n if (!shallow && (isWNode(node) || isVNode(node)) && node.children) {\n nodes = [...nodes, ...node.children];\n }\n if (!predicate || predicate(node)) {\n modifier(node, breaker);\n }\n }\n }\n return dNodes;\n}\n/**\n * Wrapper function for calls to create a widget.\n */\nexport function w(widgetConstructor, properties, children = []) {\n return {\n children,\n widgetConstructor,\n properties,\n type: WNODE\n };\n}\nexport function v(tag, propertiesOrChildren = {}, children = undefined) {\n let properties = propertiesOrChildren;\n let deferredPropertiesCallback;\n if (Array.isArray(propertiesOrChildren)) {\n children = propertiesOrChildren;\n properties = {};\n }\n if (typeof properties === 'function') {\n deferredPropertiesCallback = properties;\n properties = {};\n }\n return {\n tag,\n deferredPropertiesCallback,\n children,\n properties,\n type: VNODE\n };\n}\n/**\n * Create a VNode for an existing DOM Node.\n */\nexport function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, children) {\n return {\n tag: isElementNode(node) ? node.tagName.toLowerCase() : '',\n properties: props,\n attributes: attrs,\n events: on,\n children,\n type: DOMVNODE,\n domNode: node,\n text: isElementNode(node) ? undefined : node.data,\n diffType\n };\n}\n//# sourceMappingURL=d.mjs.map" + "source": "import Symbol from '../shim/Symbol';\n/**\n * The symbol identifier for a WNode type\n */\nexport const WNODE = Symbol('Identifier for a WNode.');\n/**\n * The symbol identifier for a VNode type\n */\nexport const VNODE = Symbol('Identifier for a VNode.');\n/**\n * The symbol identifier for a VNode type created using dom()\n */\nexport const DOMVNODE = Symbol('Identifier for a VNode created using existing dom.');\n/**\n * Helper function that returns true if the `DNode` is a `WNode` using the `type` property\n */\nexport function isWNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === WNODE);\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` using the `type` property\n */\nexport function isVNode(child) {\n return Boolean(child && typeof child !== 'string' && (child.type === VNODE || child.type === DOMVNODE));\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` created with `dom()` using the `type` property\n */\nexport function isDomVNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === DOMVNODE);\n}\nexport function isElementNode(value) {\n return !!value.tagName;\n}\nexport function decorate(dNodes, optionsOrModifier, predicate) {\n let shallow = false;\n let modifier;\n if (typeof optionsOrModifier === 'function') {\n modifier = optionsOrModifier;\n }\n else {\n modifier = optionsOrModifier.modifier;\n predicate = optionsOrModifier.predicate;\n shallow = optionsOrModifier.shallow || false;\n }\n let nodes = Array.isArray(dNodes) ? [...dNodes] : [dNodes];\n function breaker() {\n nodes = [];\n }\n while (nodes.length) {\n const node = nodes.shift();\n if (node) {\n if (!shallow && (isWNode(node) || isVNode(node)) && node.children) {\n nodes = [...nodes, ...node.children];\n }\n if (!predicate || predicate(node)) {\n modifier(node, breaker);\n }\n }\n }\n return dNodes;\n}\n/**\n * Wrapper function for calls to create a widget.\n */\nexport function w(widgetConstructor, properties, children = []) {\n return {\n children,\n widgetConstructor,\n properties,\n type: WNODE\n };\n}\nexport function v(tag, propertiesOrChildren = {}, children = undefined) {\n let properties = propertiesOrChildren;\n let deferredPropertiesCallback;\n if (Array.isArray(propertiesOrChildren)) {\n children = propertiesOrChildren;\n properties = {};\n }\n if (typeof properties === 'function') {\n deferredPropertiesCallback = properties;\n properties = {};\n }\n return {\n tag,\n deferredPropertiesCallback,\n children,\n properties,\n type: VNODE\n };\n}\n/**\n * Create a VNode for an existing DOM Node.\n */\nexport function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, children) {\n return {\n tag: isElementNode(node) ? node.tagName.toLowerCase() : '',\n properties: props,\n attributes: attrs,\n events: on,\n children,\n type: DOMVNODE,\n domNode: node,\n text: isElementNode(node) ? undefined : node.data,\n diffType\n };\n}\n//# sourceMappingURL=d.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\alwaysRender.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\alwaysRender.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "index": 41, "index2": 36, "size": 365, @@ -4300,18 +4308,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./decorators/alwaysRender", "loc": "8:0-57" @@ -4329,9 +4337,9 @@ "source": "import { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\nexport function alwaysRender() {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function () {\n this.invalidate();\n })(target);\n });\n}\nexport default alwaysRender;\n//# sourceMappingURL=alwaysRender.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\beforeProperties.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\beforeProperties.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", "index": 39, "index2": 32, "size": 331, @@ -4343,27 +4351,27 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\alwaysRender.mjs", - "issuerId": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "issuerName": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\alwaysRender.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\alwaysRender.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\alwaysRender.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "type": "harmony import", "userRequest": "./beforeProperties", "loc": "2:0-54" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\inject.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\inject.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "type": "harmony import", "userRequest": "./beforeProperties", "loc": "3:0-54" @@ -4381,9 +4389,9 @@ "source": "import { handleDecorator } from './handleDecorator';\nexport function beforeProperties(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('beforeProperties', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default beforeProperties;\n//# sourceMappingURL=beforeProperties.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\customElement.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\customElement.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", "index": 12, "index2": 38, "size": 728, @@ -4408,8 +4416,8 @@ "module": "./src/menu-item/MenuItem.ts", "moduleName": "./src/menu-item/MenuItem.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/decorators/customElement", - "loc": "3:0-75" + "userRequest": "@dojo/framework/widget-core/decorators/customElement", + "loc": "3:0-85" } ], "usedExports": [ @@ -4424,12 +4432,12 @@ "source": "import { CustomElementChildType } from '../registerCustomElement';\nimport Registry from '../Registry';\n/**\n * This Decorator is provided properties that define the behavior of a custom element, and\n * registers that custom element.\n */\nexport function customElement({ tag, properties = [], attributes = [], events = [], childType = CustomElementChildType.DOJO, registryFactory = () => new Registry() }) {\n return function (target) {\n target.prototype.__customElementDescriptor = {\n tagName: tag,\n attributes,\n properties,\n events,\n childType,\n registryFactory\n };\n };\n}\nexport default customElement;\n//# sourceMappingURL=customElement.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\diffProperty.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\diffProperty.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", "index": 40, "index2": 34, - "size": 973, + "size": 1014, "cacheable": true, "built": true, "optional": false, @@ -4438,18 +4446,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../decorators/diffProperty", "loc": "5:0-60" @@ -4464,12 +4472,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { handleDecorator } from './handleDecorator';\n/**\n * Decorator that can be used to register a function as a specific property diff\n *\n * @param propertyName The name of the property of which the diff function is applied\n * @param diffType The diff type, default is DiffType.AUTO.\n * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM\n */\nexport function diffProperty(propertyName, diffFunction, reactionFunction) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null));\n target.addDecorator('registeredDiffProperty', propertyName);\n if (reactionFunction || propertyKey) {\n target.addDecorator('diffReaction', {\n propertyName,\n reaction: propertyKey ? target[propertyKey] : reactionFunction\n });\n }\n });\n}\nexport default diffProperty;\n//# sourceMappingURL=diffProperty.mjs.map" + "source": "import { handleDecorator } from './handleDecorator';\nimport { auto } from './../diff';\n/**\n * Decorator that can be used to register a function as a specific property diff\n *\n * @param propertyName The name of the property of which the diff function is applied\n * @param diffType The diff type, default is DiffType.AUTO.\n * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM\n */\nexport function diffProperty(propertyName, diffFunction = auto, reactionFunction) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null));\n target.addDecorator('registeredDiffProperty', propertyName);\n if (reactionFunction || propertyKey) {\n target.addDecorator('diffReaction', {\n propertyName,\n reaction: propertyKey ? target[propertyKey] : reactionFunction\n });\n }\n });\n}\nexport default diffProperty;\n//# sourceMappingURL=diffProperty.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\handleDecorator.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\handleDecorator.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs", "index": 35, "index2": 28, "size": 512, @@ -4481,63 +4489,63 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../decorators/handleDecorator", "loc": "4:0-66" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\alwaysRender.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\alwaysRender.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\afterRender.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\afterRender.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\inject.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\inject.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "2:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\diffProperty.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\diffProperty.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\beforeProperties.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\beforeProperties.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" @@ -4555,9 +4563,9 @@ "source": "/**\n * Generic decorator handler to take care of whether or not the decorator was called at the class level\n * or the method level.\n *\n * @param handler\n */\nexport function handleDecorator(handler) {\n return function (target, propertyKey, descriptor) {\n if (typeof target === 'function') {\n handler(target.prototype, undefined);\n }\n else {\n handler(target, propertyKey);\n }\n };\n}\nexport default handleDecorator;\n//# sourceMappingURL=handleDecorator.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\inject.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\inject.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "index": 38, "index2": 33, "size": 1532, @@ -4569,18 +4577,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../decorators/inject", "loc": "3:0-48" @@ -4595,12 +4603,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import WeakMap from '@dojo/shim/WeakMap';\nimport { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\n/**\n * Map of instances against registered injectors.\n */\nconst registeredInjectorsMap = new WeakMap();\n/**\n * Decorator retrieves an injector from an available registry using the name and\n * calls the `getProperties` function with the payload from the injector\n * and current properties with the the injected properties returned.\n *\n * @param InjectConfig the inject configuration\n */\nexport function inject({ name, getProperties }) {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function (properties) {\n const injectorItem = this.registry.getInjector(name);\n if (injectorItem) {\n const { injector, invalidator } = injectorItem;\n const registeredInjectors = registeredInjectorsMap.get(this) || [];\n if (registeredInjectors.length === 0) {\n registeredInjectorsMap.set(this, registeredInjectors);\n }\n if (registeredInjectors.indexOf(injectorItem) === -1) {\n this.own(invalidator.on('invalidate', () => {\n this.invalidate();\n }));\n registeredInjectors.push(injectorItem);\n }\n return getProperties(injector(), properties);\n }\n })(target);\n });\n}\nexport default inject;\n//# sourceMappingURL=inject.mjs.map" + "source": "import WeakMap from '../../shim/WeakMap';\nimport { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\n/**\n * Map of instances against registered injectors.\n */\nconst registeredInjectorsMap = new WeakMap();\n/**\n * Decorator retrieves an injector from an available registry using the name and\n * calls the `getProperties` function with the payload from the injector\n * and current properties with the the injected properties returned.\n *\n * @param InjectConfig the inject configuration\n */\nexport function inject({ name, getProperties }) {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function (properties) {\n const injectorItem = this.registry.getInjector(name);\n if (injectorItem) {\n const { injector, invalidator } = injectorItem;\n const registeredInjectors = registeredInjectorsMap.get(this) || [];\n if (registeredInjectors.length === 0) {\n registeredInjectorsMap.set(this, registeredInjectors);\n }\n if (registeredInjectors.indexOf(injectorItem) === -1) {\n this.own(invalidator.on('invalidate', () => {\n this.invalidate();\n }));\n registeredInjectors.push(injectorItem);\n }\n return getProperties(injector(), properties);\n }\n })(target);\n });\n}\nexport default inject;\n//# sourceMappingURL=inject.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/diff.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\diff.mjs", - "name": "./node_modules/@dojo/widget-core/diff.mjs", + "id": "./node_modules/@dojo/framework/widget-core/diff.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\diff.mjs", + "name": "./node_modules/@dojo/framework/widget-core/diff.mjs", "index": 20, "index2": 20, "size": 1930, @@ -4612,30 +4620,39 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./diff", "loc": "5:0-30" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../diff", "loc": "6:0-36" + }, + { + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\diffProperty.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "type": "harmony import", + "userRequest": "./../diff", + "loc": "2:0-33" } ], "usedExports": [ @@ -4654,12 +4671,12 @@ "source": "import { WIDGET_BASE_TYPE } from './Registry';\nfunction isObjectOrArray(value) {\n return Object.prototype.toString.call(value) === '[object Object]' || Array.isArray(value);\n}\nexport function always(previousProperty, newProperty) {\n return {\n changed: true,\n value: newProperty\n };\n}\nexport function ignore(previousProperty, newProperty) {\n return {\n changed: false,\n value: newProperty\n };\n}\nexport function reference(previousProperty, newProperty) {\n return {\n changed: previousProperty !== newProperty,\n value: newProperty\n };\n}\nexport function shallow(previousProperty, newProperty) {\n let changed = false;\n const validOldProperty = previousProperty && isObjectOrArray(previousProperty);\n const validNewProperty = newProperty && isObjectOrArray(newProperty);\n if (!validOldProperty || !validNewProperty) {\n return {\n changed: true,\n value: newProperty\n };\n }\n const previousKeys = Object.keys(previousProperty);\n const newKeys = Object.keys(newProperty);\n if (previousKeys.length !== newKeys.length) {\n changed = true;\n }\n else {\n changed = newKeys.some((key) => {\n return newProperty[key] !== previousProperty[key];\n });\n }\n return {\n changed,\n value: newProperty\n };\n}\nexport function auto(previousProperty, newProperty) {\n let result;\n if (typeof newProperty === 'function') {\n if (newProperty._type === WIDGET_BASE_TYPE) {\n result = reference(previousProperty, newProperty);\n }\n else {\n result = ignore(previousProperty, newProperty);\n }\n }\n else if (isObjectOrArray(newProperty)) {\n result = shallow(previousProperty, newProperty);\n }\n else {\n result = reference(previousProperty, newProperty);\n }\n return result;\n}\n//# sourceMappingURL=diff.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "name": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "id": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "name": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "index": 32, "index2": 30, - "size": 5852, + "size": 5683, "cacheable": true, "built": true, "optional": false, @@ -4668,18 +4685,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./mixins/Projector", "loc": "3:0-52" @@ -4696,15 +4713,15 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import * as tslib_1 from \"tslib\";\nimport { assign } from '@dojo/core/lang';\nimport cssTransitions from '../animations/cssTransitions';\nimport { afterRender } from './../decorators/afterRender';\nimport { v } from './../d';\nimport { dom } from './../vdom';\n/**\n * Represents the attach state of the projector\n */\nexport var ProjectorAttachState;\n(function (ProjectorAttachState) {\n ProjectorAttachState[ProjectorAttachState[\"Attached\"] = 1] = \"Attached\";\n ProjectorAttachState[ProjectorAttachState[\"Detached\"] = 2] = \"Detached\";\n})(ProjectorAttachState || (ProjectorAttachState = {}));\n/**\n * Attach type for the projector\n */\nexport var AttachType;\n(function (AttachType) {\n AttachType[AttachType[\"Append\"] = 1] = \"Append\";\n AttachType[AttachType[\"Merge\"] = 2] = \"Merge\";\n})(AttachType || (AttachType = {}));\nexport function ProjectorMixin(Base) {\n class Projector extends Base {\n constructor(...args) {\n super(...args);\n this._root = document.body;\n this._async = true;\n this._projectorProperties = {};\n this._projectionOptions = {\n transitions: cssTransitions\n };\n this.root = document.body;\n this.projectorState = ProjectorAttachState.Detached;\n }\n append(root) {\n const options = {\n type: AttachType.Append,\n root\n };\n return this._attach(options);\n }\n merge(root) {\n const options = {\n type: AttachType.Merge,\n root\n };\n return this._attach(options);\n }\n set root(root) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change root element');\n }\n this._root = root;\n }\n get root() {\n return this._root;\n }\n get async() {\n return this._async;\n }\n set async(async) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change async mode');\n }\n this._async = async;\n }\n sandbox(doc = document) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot create sandbox');\n }\n this._async = false;\n const previousRoot = this.root;\n /* free up the document fragment for GC */\n this.own({\n destroy: () => {\n this._root = previousRoot;\n }\n });\n this._attach({\n /* DocumentFragment is not assignable to Element, but provides everything needed to work */\n root: doc.createDocumentFragment(),\n type: AttachType.Append\n });\n }\n setChildren(children) {\n this.__setChildren__(children);\n }\n setProperties(properties) {\n this.__setProperties__(properties);\n }\n __setProperties__(properties) {\n if (this._projectorProperties && this._projectorProperties.registry !== properties.registry) {\n if (this._projectorProperties.registry) {\n this._projectorProperties.registry.destroy();\n }\n }\n this._projectorProperties = assign({}, properties);\n super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry });\n super.__setProperties__(properties);\n }\n toHtml() {\n if (this.projectorState !== ProjectorAttachState.Attached || !this._projection) {\n throw new Error('Projector is not attached, cannot return an HTML string of projection.');\n }\n return this._projection.domNode.childNodes[0].outerHTML;\n }\n afterRender(result) {\n let node = result;\n if (typeof result === 'string' || result === null || result === undefined) {\n node = v('span', {}, [result]);\n }\n return node;\n }\n destroy() {\n super.destroy();\n }\n _attach({ type, root }) {\n if (root) {\n this.root = root;\n }\n if (this._attachHandle) {\n return this._attachHandle;\n }\n this.projectorState = ProjectorAttachState.Attached;\n const handle = {\n destroy: () => {\n if (this.projectorState === ProjectorAttachState.Attached) {\n this._projection = undefined;\n this.projectorState = ProjectorAttachState.Detached;\n }\n }\n };\n this.own(handle);\n this._attachHandle = handle;\n this._projectionOptions = Object.assign({}, this._projectionOptions, { sync: !this._async });\n switch (type) {\n case AttachType.Append:\n this._projection = dom.append(this.root, this, this._projectionOptions);\n break;\n case AttachType.Merge:\n this._projection = dom.merge(this.root, this, this._projectionOptions);\n break;\n }\n return this._attachHandle;\n }\n }\n tslib_1.__decorate([\n afterRender(),\n tslib_1.__metadata(\"design:type\", Function),\n tslib_1.__metadata(\"design:paramtypes\", [Object]),\n tslib_1.__metadata(\"design:returntype\", void 0)\n ], Projector.prototype, \"afterRender\", null);\n return Projector;\n}\nexport default ProjectorMixin;\n//# sourceMappingURL=Projector.mjs.map" + "source": "import * as tslib_1 from \"tslib\";\nimport { assign } from '../../core/lang';\nimport cssTransitions from '../animations/cssTransitions';\nimport { afterRender } from './../decorators/afterRender';\nimport { v } from './../d';\nimport { dom } from './../vdom';\n/**\n * Represents the attach state of the projector\n */\nexport var ProjectorAttachState;\n(function (ProjectorAttachState) {\n ProjectorAttachState[ProjectorAttachState[\"Attached\"] = 1] = \"Attached\";\n ProjectorAttachState[ProjectorAttachState[\"Detached\"] = 2] = \"Detached\";\n})(ProjectorAttachState || (ProjectorAttachState = {}));\n/**\n * Attach type for the projector\n */\nexport var AttachType;\n(function (AttachType) {\n AttachType[AttachType[\"Append\"] = 1] = \"Append\";\n AttachType[AttachType[\"Merge\"] = 2] = \"Merge\";\n})(AttachType || (AttachType = {}));\nexport function ProjectorMixin(Base) {\n class Projector extends Base {\n constructor(...args) {\n super(...args);\n this._root = document.body;\n this._async = true;\n this._projectorProperties = {};\n this._projectionOptions = {\n transitions: cssTransitions\n };\n this.root = document.body;\n this.projectorState = ProjectorAttachState.Detached;\n }\n append(root) {\n const options = {\n type: AttachType.Append,\n root\n };\n return this._attach(options);\n }\n merge(root) {\n const options = {\n type: AttachType.Merge,\n root\n };\n return this._attach(options);\n }\n set root(root) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change root element');\n }\n this._root = root;\n }\n get root() {\n return this._root;\n }\n get async() {\n return this._async;\n }\n set async(async) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change async mode');\n }\n this._async = async;\n }\n sandbox(doc = document) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot create sandbox');\n }\n this._async = false;\n const previousRoot = this.root;\n /* free up the document fragment for GC */\n this.own({\n destroy: () => {\n this._root = previousRoot;\n }\n });\n this._attach({\n /* DocumentFragment is not assignable to Element, but provides everything needed to work */\n root: doc.createDocumentFragment(),\n type: AttachType.Append\n });\n }\n setChildren(children) {\n this.__setChildren__(children);\n }\n setProperties(properties) {\n this.__setProperties__(properties);\n }\n __setProperties__(properties) {\n if (this._projectorProperties && this._projectorProperties.registry !== properties.registry) {\n if (this._projectorProperties.registry) {\n this._projectorProperties.registry.destroy();\n }\n }\n this._projectorProperties = assign({}, properties);\n super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry });\n super.__setProperties__(properties);\n }\n toHtml() {\n if (this.projectorState !== ProjectorAttachState.Attached || !this._projection) {\n throw new Error('Projector is not attached, cannot return an HTML string of projection.');\n }\n return this._projection.domNode.childNodes[0].outerHTML;\n }\n afterRender(result) {\n let node = result;\n if (typeof result === 'string' || result === null || result === undefined) {\n node = v('span', {}, [result]);\n }\n return node;\n }\n destroy() {\n super.destroy();\n }\n _attach({ type, root }) {\n if (root) {\n this.root = root;\n }\n if (this._attachHandle) {\n return this._attachHandle;\n }\n this.projectorState = ProjectorAttachState.Attached;\n const handle = {\n destroy: () => {\n if (this.projectorState === ProjectorAttachState.Attached) {\n this._projection = undefined;\n this.projectorState = ProjectorAttachState.Detached;\n }\n }\n };\n this.own(handle);\n this._attachHandle = handle;\n this._projectionOptions = Object.assign({}, this._projectionOptions, { sync: !this._async });\n switch (type) {\n case AttachType.Append:\n this._projection = dom.append(this.root, this, this._projectionOptions);\n break;\n case AttachType.Merge:\n this._projection = dom.merge(this.root, this, this._projectionOptions);\n break;\n }\n return this._attachHandle;\n }\n }\n tslib_1.__decorate([\n afterRender()\n ], Projector.prototype, \"afterRender\", null);\n return Projector;\n}\nexport default ProjectorMixin;\n//# sourceMappingURL=Projector.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "name": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "id": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "name": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "index": 36, "index2": 35, - "size": 5320, + "size": 5157, "cacheable": true, "built": true, "optional": false, @@ -4713,18 +4730,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./mixins/Themed", "loc": "7:0-56" @@ -4735,8 +4752,8 @@ "module": "./src/menu-item/MenuItem.ts", "moduleName": "./src/menu-item/MenuItem.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/mixins/Themed", - "loc": "4:0-69" + "userRequest": "@dojo/framework/widget-core/mixins/Themed", + "loc": "4:0-79" } ], "usedExports": [ @@ -4753,15 +4770,15 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import * as tslib_1 from \"tslib\";\nimport { Injector } from './../Injector';\nimport { inject } from './../decorators/inject';\nimport { handleDecorator } from './../decorators/handleDecorator';\nimport { diffProperty } from './../decorators/diffProperty';\nimport { shallow } from './../diff';\nconst THEME_KEY = ' _key';\nexport const INJECTED_THEME_KEY = Symbol('theme');\n/**\n * Decorator for base css classes\n */\nexport function theme(theme) {\n return handleDecorator((target) => {\n target.addDecorator('baseThemeClasses', theme);\n });\n}\n/**\n * Creates a reverse lookup for the classes passed in via the `theme` function.\n *\n * @param classes The baseClasses object\n * @requires\n */\nfunction createThemeClassesLookup(classes) {\n return classes.reduce((currentClassNames, baseClass) => {\n Object.keys(baseClass).forEach((key) => {\n currentClassNames[baseClass[key]] = key;\n });\n return currentClassNames;\n }, {});\n}\n/**\n * Convenience function that is given a theme and an optional registry, the theme\n * injector is defined against the registry, returning the theme.\n *\n * @param theme the theme to set\n * @param themeRegistry registry to define the theme injector against. Defaults\n * to the global registry\n *\n * @returns the theme injector used to set the theme\n */\nexport function registerThemeInjector(theme, themeRegistry) {\n const themeInjector = new Injector(theme);\n themeRegistry.defineInjector(INJECTED_THEME_KEY, (invalidator) => {\n themeInjector.setInvalidator(invalidator);\n return () => themeInjector.get();\n });\n return themeInjector;\n}\n/**\n * Function that returns a class decorated with with Themed functionality\n */\nexport function ThemedMixin(Base) {\n let Themed = class Themed extends Base {\n constructor() {\n super(...arguments);\n /**\n * Registered base theme keys\n */\n this._registeredBaseThemeKeys = [];\n /**\n * Indicates if classes meta data need to be calculated.\n */\n this._recalculateClasses = true;\n /**\n * Loaded theme\n */\n this._theme = {};\n }\n theme(classes) {\n if (this._recalculateClasses) {\n this._recalculateThemeClasses();\n }\n if (Array.isArray(classes)) {\n return classes.map((className) => this._getThemeClass(className));\n }\n return this._getThemeClass(classes);\n }\n /**\n * Function fired when `theme` or `extraClasses` are changed.\n */\n onPropertiesChanged() {\n this._recalculateClasses = true;\n }\n _getThemeClass(className) {\n if (className === undefined || className === null) {\n return className;\n }\n const extraClasses = this.properties.extraClasses || {};\n const themeClassName = this._baseThemeClassesReverseLookup[className];\n let resultClassNames = [];\n if (!themeClassName) {\n console.warn(`Class name: '${className}' not found in theme`);\n return null;\n }\n if (extraClasses[themeClassName]) {\n resultClassNames.push(extraClasses[themeClassName]);\n }\n if (this._theme[themeClassName]) {\n resultClassNames.push(this._theme[themeClassName]);\n }\n else {\n resultClassNames.push(this._registeredBaseTheme[themeClassName]);\n }\n return resultClassNames.join(' ');\n }\n _recalculateThemeClasses() {\n const { theme = {} } = this.properties;\n const baseThemes = this.getDecorator('baseThemeClasses');\n if (!this._registeredBaseTheme) {\n this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => {\n const _a = THEME_KEY, key = baseTheme[_a], classes = tslib_1.__rest(baseTheme, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n this._registeredBaseThemeKeys.push(key);\n return Object.assign({}, finalBaseTheme, classes);\n }, {});\n this._baseThemeClassesReverseLookup = createThemeClassesLookup(baseThemes);\n }\n this._theme = this._registeredBaseThemeKeys.reduce((baseTheme, themeKey) => {\n return Object.assign({}, baseTheme, theme[themeKey]);\n }, {});\n this._recalculateClasses = false;\n }\n };\n tslib_1.__decorate([\n diffProperty('theme', shallow),\n diffProperty('extraClasses', shallow),\n tslib_1.__metadata(\"design:type\", Function),\n tslib_1.__metadata(\"design:paramtypes\", []),\n tslib_1.__metadata(\"design:returntype\", void 0)\n ], Themed.prototype, \"onPropertiesChanged\", null);\n Themed = tslib_1.__decorate([\n inject({\n name: INJECTED_THEME_KEY,\n getProperties: (theme, properties) => {\n if (!properties.theme) {\n return { theme };\n }\n return {};\n }\n })\n ], Themed);\n return Themed;\n}\nexport default ThemedMixin;\n//# sourceMappingURL=Themed.mjs.map" + "source": "import * as tslib_1 from \"tslib\";\nimport { Injector } from './../Injector';\nimport { inject } from './../decorators/inject';\nimport { handleDecorator } from './../decorators/handleDecorator';\nimport { diffProperty } from './../decorators/diffProperty';\nimport { shallow } from './../diff';\nconst THEME_KEY = ' _key';\nexport const INJECTED_THEME_KEY = Symbol('theme');\n/**\n * Decorator for base css classes\n */\nexport function theme(theme) {\n return handleDecorator((target) => {\n target.addDecorator('baseThemeClasses', theme);\n });\n}\n/**\n * Creates a reverse lookup for the classes passed in via the `theme` function.\n *\n * @param classes The baseClasses object\n * @requires\n */\nfunction createThemeClassesLookup(classes) {\n return classes.reduce((currentClassNames, baseClass) => {\n Object.keys(baseClass).forEach((key) => {\n currentClassNames[baseClass[key]] = key;\n });\n return currentClassNames;\n }, {});\n}\n/**\n * Convenience function that is given a theme and an optional registry, the theme\n * injector is defined against the registry, returning the theme.\n *\n * @param theme the theme to set\n * @param themeRegistry registry to define the theme injector against. Defaults\n * to the global registry\n *\n * @returns the theme injector used to set the theme\n */\nexport function registerThemeInjector(theme, themeRegistry) {\n const themeInjector = new Injector(theme);\n themeRegistry.defineInjector(INJECTED_THEME_KEY, (invalidator) => {\n themeInjector.setInvalidator(invalidator);\n return () => themeInjector.get();\n });\n return themeInjector;\n}\n/**\n * Function that returns a class decorated with with Themed functionality\n */\nexport function ThemedMixin(Base) {\n let Themed = class Themed extends Base {\n constructor() {\n super(...arguments);\n /**\n * Registered base theme keys\n */\n this._registeredBaseThemeKeys = [];\n /**\n * Indicates if classes meta data need to be calculated.\n */\n this._recalculateClasses = true;\n /**\n * Loaded theme\n */\n this._theme = {};\n }\n theme(classes) {\n if (this._recalculateClasses) {\n this._recalculateThemeClasses();\n }\n if (Array.isArray(classes)) {\n return classes.map((className) => this._getThemeClass(className));\n }\n return this._getThemeClass(classes);\n }\n /**\n * Function fired when `theme` or `extraClasses` are changed.\n */\n onPropertiesChanged() {\n this._recalculateClasses = true;\n }\n _getThemeClass(className) {\n if (className === undefined || className === null) {\n return className;\n }\n const extraClasses = this.properties.extraClasses || {};\n const themeClassName = this._baseThemeClassesReverseLookup[className];\n let resultClassNames = [];\n if (!themeClassName) {\n console.warn(`Class name: '${className}' not found in theme`);\n return null;\n }\n if (extraClasses[themeClassName]) {\n resultClassNames.push(extraClasses[themeClassName]);\n }\n if (this._theme[themeClassName]) {\n resultClassNames.push(this._theme[themeClassName]);\n }\n else {\n resultClassNames.push(this._registeredBaseTheme[themeClassName]);\n }\n return resultClassNames.join(' ');\n }\n _recalculateThemeClasses() {\n const { theme = {} } = this.properties;\n const baseThemes = this.getDecorator('baseThemeClasses');\n if (!this._registeredBaseTheme) {\n this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => {\n const _a = THEME_KEY, key = baseTheme[_a], classes = tslib_1.__rest(baseTheme, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n this._registeredBaseThemeKeys.push(key);\n return Object.assign({}, finalBaseTheme, classes);\n }, {});\n this._baseThemeClassesReverseLookup = createThemeClassesLookup(baseThemes);\n }\n this._theme = this._registeredBaseThemeKeys.reduce((baseTheme, themeKey) => {\n return Object.assign({}, baseTheme, theme[themeKey]);\n }, {});\n this._recalculateClasses = false;\n }\n };\n tslib_1.__decorate([\n diffProperty('theme', shallow),\n diffProperty('extraClasses', shallow)\n ], Themed.prototype, \"onPropertiesChanged\", null);\n Themed = tslib_1.__decorate([\n inject({\n name: INJECTED_THEME_KEY,\n getProperties: (theme, properties) => {\n if (!properties.theme) {\n return { theme };\n }\n return {};\n }\n })\n ], Themed);\n return Themed;\n}\nexport default ThemedMixin;\n//# sourceMappingURL=Themed.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "name": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "id": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "name": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "index": 13, "index2": 37, - "size": 9124, + "size": 9118, "cacheable": true, "built": true, "optional": false, @@ -4783,14 +4800,14 @@ "module": "./node_modules/imports-loader?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js", "moduleName": "./node_modules/imports-loader?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js", "type": "cjs require", - "userRequest": "@dojo/widget-core/registerCustomElement", - "loc": "4:28-78" + "userRequest": "@dojo/framework/widget-core/registerCustomElement", + "loc": "4:28-88" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\customElement.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\customElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", "type": "harmony import", "userRequest": "../registerCustomElement", "loc": "1:0-66" @@ -4806,15 +4823,15 @@ ], "optimizationBailout": [], "depth": 2, - "source": "import * as tslib_1 from \"tslib\";\nimport { WidgetBase, noBind } from './WidgetBase';\nimport { ProjectorMixin } from './mixins/Projector';\nimport { from } from '@dojo/shim/array';\nimport { w, dom } from './d';\nimport global from '@dojo/shim/global';\nimport { registerThemeInjector } from './mixins/Themed';\nimport { alwaysRender } from './decorators/alwaysRender';\nexport var CustomElementChildType;\n(function (CustomElementChildType) {\n CustomElementChildType[\"DOJO\"] = \"DOJO\";\n CustomElementChildType[\"NODE\"] = \"NODE\";\n CustomElementChildType[\"TEXT\"] = \"TEXT\";\n})(CustomElementChildType || (CustomElementChildType = {}));\nexport function DomToWidgetWrapper(domNode) {\n let DomToWidgetWrapper = class DomToWidgetWrapper extends WidgetBase {\n render() {\n const properties = Object.keys(this.properties).reduce((props, key) => {\n const value = this.properties[key];\n if (key.indexOf('on') === 0) {\n key = `__${key}`;\n }\n props[key] = value;\n return props;\n }, {});\n return dom({ node: domNode, props: properties, diffType: 'dom' });\n }\n static get domNode() {\n return domNode;\n }\n };\n DomToWidgetWrapper = tslib_1.__decorate([\n alwaysRender()\n ], DomToWidgetWrapper);\n return DomToWidgetWrapper;\n}\nexport function create(descriptor, WidgetConstructor) {\n const { attributes, childType, registryFactory } = descriptor;\n const attributeMap = {};\n attributes.forEach((propertyName) => {\n const attributeName = propertyName.toLowerCase();\n attributeMap[attributeName] = propertyName;\n });\n return class extends HTMLElement {\n constructor() {\n super(...arguments);\n this._properties = {};\n this._children = [];\n this._eventProperties = {};\n this._initialised = false;\n }\n connectedCallback() {\n if (this._initialised) {\n return;\n }\n const domProperties = {};\n const { attributes, properties, events } = descriptor;\n this._properties = Object.assign({}, this._properties, this._attributesToProperties(attributes));\n [...attributes, ...properties].forEach((propertyName) => {\n const value = this[propertyName];\n const filteredPropertyName = propertyName.replace(/^on/, '__');\n if (value !== undefined) {\n this._properties[propertyName] = value;\n }\n if (filteredPropertyName !== propertyName) {\n domProperties[filteredPropertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n }\n domProperties[propertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n });\n events.forEach((propertyName) => {\n const eventName = propertyName.replace(/^on/, '').toLowerCase();\n const filteredPropertyName = propertyName.replace(/^on/, '__on');\n domProperties[filteredPropertyName] = {\n get: () => this._getEventProperty(propertyName),\n set: (value) => this._setEventProperty(propertyName, value)\n };\n this._eventProperties[propertyName] = undefined;\n this._properties[propertyName] = (...args) => {\n const eventCallback = this._getEventProperty(propertyName);\n if (typeof eventCallback === 'function') {\n eventCallback(...args);\n }\n this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: false,\n detail: args\n }));\n };\n });\n Object.defineProperties(this, domProperties);\n const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children;\n from(children).forEach((childNode) => {\n if (childType === CustomElementChildType.DOJO) {\n childNode.addEventListener('dojo-ce-render', () => this._render());\n childNode.addEventListener('dojo-ce-connected', () => this._render());\n this._children.push(DomToWidgetWrapper(childNode));\n }\n else {\n this._children.push(dom({ node: childNode, diffType: 'dom' }));\n }\n });\n this.addEventListener('dojo-ce-connected', (e) => this._childConnected(e));\n const widgetProperties = this._properties;\n const renderChildren = () => this.__children__();\n const Wrapper = class extends WidgetBase {\n render() {\n return w(WidgetConstructor, widgetProperties, renderChildren());\n }\n };\n const registry = registryFactory();\n const themeContext = registerThemeInjector(this._getTheme(), registry);\n global.addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme()));\n const Projector = ProjectorMixin(Wrapper);\n this._projector = new Projector();\n this._projector.setProperties({ registry });\n this._projector.append(this);\n this._initialised = true;\n this.dispatchEvent(new CustomEvent('dojo-ce-connected', {\n bubbles: true,\n detail: this\n }));\n }\n _getTheme() {\n if (global && global.dojoce && global.dojoce.theme) {\n return global.dojoce.themes[global.dojoce.theme];\n }\n }\n _childConnected(e) {\n const node = e.detail;\n if (node.parentNode === this) {\n const exists = this._children.some((child) => child.domNode === node);\n if (!exists) {\n node.addEventListener('dojo-ce-render', () => this._render());\n this._children.push(DomToWidgetWrapper(node));\n this._render();\n }\n }\n }\n _render() {\n if (this._projector) {\n this._projector.invalidate();\n this.dispatchEvent(new CustomEvent('dojo-ce-render', {\n bubbles: false,\n detail: this\n }));\n }\n }\n __properties__() {\n return Object.assign({}, this._properties, this._eventProperties);\n }\n __children__() {\n if (childType === CustomElementChildType.DOJO) {\n return this._children.filter((Child) => Child.domNode.isWidget).map((Child) => {\n const { domNode } = Child;\n return w(Child, Object.assign({}, domNode.__properties__()), [...domNode.__children__()]);\n });\n }\n else {\n return this._children;\n }\n }\n attributeChangedCallback(name, oldValue, value) {\n const propertyName = attributeMap[name];\n this._setProperty(propertyName, value);\n }\n _setEventProperty(propertyName, value) {\n this._eventProperties[propertyName] = value;\n }\n _getEventProperty(propertyName) {\n return this._eventProperties[propertyName];\n }\n _setProperty(propertyName, value) {\n if (typeof value === 'function') {\n value[noBind] = true;\n }\n this._properties[propertyName] = value;\n this._render();\n }\n _getProperty(propertyName) {\n return this._properties[propertyName];\n }\n _attributesToProperties(attributes) {\n return attributes.reduce((properties, propertyName) => {\n const attributeName = propertyName.toLowerCase();\n const value = this.getAttribute(attributeName);\n if (value !== null) {\n properties[propertyName] = value;\n }\n return properties;\n }, {});\n }\n static get observedAttributes() {\n return Object.keys(attributeMap);\n }\n get isWidget() {\n return true;\n }\n };\n}\nexport function register(WidgetConstructor) {\n const descriptor = WidgetConstructor.prototype && WidgetConstructor.prototype.__customElementDescriptor;\n if (!descriptor) {\n throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?');\n }\n global.customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor));\n}\nexport default register;\n//# sourceMappingURL=registerCustomElement.mjs.map" + "source": "import * as tslib_1 from \"tslib\";\nimport { WidgetBase, noBind } from './WidgetBase';\nimport { ProjectorMixin } from './mixins/Projector';\nimport { from } from '../shim/array';\nimport { w, dom } from './d';\nimport global from '../shim/global';\nimport { registerThemeInjector } from './mixins/Themed';\nimport { alwaysRender } from './decorators/alwaysRender';\nexport var CustomElementChildType;\n(function (CustomElementChildType) {\n CustomElementChildType[\"DOJO\"] = \"DOJO\";\n CustomElementChildType[\"NODE\"] = \"NODE\";\n CustomElementChildType[\"TEXT\"] = \"TEXT\";\n})(CustomElementChildType || (CustomElementChildType = {}));\nexport function DomToWidgetWrapper(domNode) {\n let DomToWidgetWrapper = class DomToWidgetWrapper extends WidgetBase {\n render() {\n const properties = Object.keys(this.properties).reduce((props, key) => {\n const value = this.properties[key];\n if (key.indexOf('on') === 0) {\n key = `__${key}`;\n }\n props[key] = value;\n return props;\n }, {});\n return dom({ node: domNode, props: properties, diffType: 'dom' });\n }\n static get domNode() {\n return domNode;\n }\n };\n DomToWidgetWrapper = tslib_1.__decorate([\n alwaysRender()\n ], DomToWidgetWrapper);\n return DomToWidgetWrapper;\n}\nexport function create(descriptor, WidgetConstructor) {\n const { attributes, childType, registryFactory } = descriptor;\n const attributeMap = {};\n attributes.forEach((propertyName) => {\n const attributeName = propertyName.toLowerCase();\n attributeMap[attributeName] = propertyName;\n });\n return class extends HTMLElement {\n constructor() {\n super(...arguments);\n this._properties = {};\n this._children = [];\n this._eventProperties = {};\n this._initialised = false;\n }\n connectedCallback() {\n if (this._initialised) {\n return;\n }\n const domProperties = {};\n const { attributes, properties, events } = descriptor;\n this._properties = Object.assign({}, this._properties, this._attributesToProperties(attributes));\n [...attributes, ...properties].forEach((propertyName) => {\n const value = this[propertyName];\n const filteredPropertyName = propertyName.replace(/^on/, '__');\n if (value !== undefined) {\n this._properties[propertyName] = value;\n }\n if (filteredPropertyName !== propertyName) {\n domProperties[filteredPropertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n }\n domProperties[propertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n });\n events.forEach((propertyName) => {\n const eventName = propertyName.replace(/^on/, '').toLowerCase();\n const filteredPropertyName = propertyName.replace(/^on/, '__on');\n domProperties[filteredPropertyName] = {\n get: () => this._getEventProperty(propertyName),\n set: (value) => this._setEventProperty(propertyName, value)\n };\n this._eventProperties[propertyName] = undefined;\n this._properties[propertyName] = (...args) => {\n const eventCallback = this._getEventProperty(propertyName);\n if (typeof eventCallback === 'function') {\n eventCallback(...args);\n }\n this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: false,\n detail: args\n }));\n };\n });\n Object.defineProperties(this, domProperties);\n const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children;\n from(children).forEach((childNode) => {\n if (childType === CustomElementChildType.DOJO) {\n childNode.addEventListener('dojo-ce-render', () => this._render());\n childNode.addEventListener('dojo-ce-connected', () => this._render());\n this._children.push(DomToWidgetWrapper(childNode));\n }\n else {\n this._children.push(dom({ node: childNode, diffType: 'dom' }));\n }\n });\n this.addEventListener('dojo-ce-connected', (e) => this._childConnected(e));\n const widgetProperties = this._properties;\n const renderChildren = () => this.__children__();\n const Wrapper = class extends WidgetBase {\n render() {\n return w(WidgetConstructor, widgetProperties, renderChildren());\n }\n };\n const registry = registryFactory();\n const themeContext = registerThemeInjector(this._getTheme(), registry);\n global.addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme()));\n const Projector = ProjectorMixin(Wrapper);\n this._projector = new Projector();\n this._projector.setProperties({ registry });\n this._projector.append(this);\n this._initialised = true;\n this.dispatchEvent(new CustomEvent('dojo-ce-connected', {\n bubbles: true,\n detail: this\n }));\n }\n _getTheme() {\n if (global && global.dojoce && global.dojoce.theme) {\n return global.dojoce.themes[global.dojoce.theme];\n }\n }\n _childConnected(e) {\n const node = e.detail;\n if (node.parentNode === this) {\n const exists = this._children.some((child) => child.domNode === node);\n if (!exists) {\n node.addEventListener('dojo-ce-render', () => this._render());\n this._children.push(DomToWidgetWrapper(node));\n this._render();\n }\n }\n }\n _render() {\n if (this._projector) {\n this._projector.invalidate();\n this.dispatchEvent(new CustomEvent('dojo-ce-render', {\n bubbles: false,\n detail: this\n }));\n }\n }\n __properties__() {\n return Object.assign({}, this._properties, this._eventProperties);\n }\n __children__() {\n if (childType === CustomElementChildType.DOJO) {\n return this._children.filter((Child) => Child.domNode.isWidget).map((Child) => {\n const { domNode } = Child;\n return w(Child, Object.assign({}, domNode.__properties__()), [...domNode.__children__()]);\n });\n }\n else {\n return this._children;\n }\n }\n attributeChangedCallback(name, oldValue, value) {\n const propertyName = attributeMap[name];\n this._setProperty(propertyName, value);\n }\n _setEventProperty(propertyName, value) {\n this._eventProperties[propertyName] = value;\n }\n _getEventProperty(propertyName) {\n return this._eventProperties[propertyName];\n }\n _setProperty(propertyName, value) {\n if (typeof value === 'function') {\n value[noBind] = true;\n }\n this._properties[propertyName] = value;\n this._render();\n }\n _getProperty(propertyName) {\n return this._properties[propertyName];\n }\n _attributesToProperties(attributes) {\n return attributes.reduce((properties, propertyName) => {\n const attributeName = propertyName.toLowerCase();\n const value = this.getAttribute(attributeName);\n if (value !== null) {\n properties[propertyName] = value;\n }\n return properties;\n }, {});\n }\n static get observedAttributes() {\n return Object.keys(attributeMap);\n }\n get isWidget() {\n return true;\n }\n };\n}\nexport function register(WidgetConstructor) {\n const descriptor = WidgetConstructor.prototype && WidgetConstructor.prototype.__customElementDescriptor;\n if (!descriptor) {\n throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?');\n }\n global.customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor));\n}\nexport default register;\n//# sourceMappingURL=registerCustomElement.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/vdom.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\vdom.mjs", - "name": "./node_modules/@dojo/widget-core/vdom.mjs", + "id": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\vdom.mjs", + "name": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "index": 29, "index2": 25, - "size": 39734, + "size": 40904, "cacheable": true, "built": true, "optional": false, @@ -4823,27 +4840,27 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./vdom", "loc": "8:0-43" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "./../vdom", "loc": "6:0-32" @@ -4862,7 +4879,7 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import global from '@dojo/shim/global';\r\nimport { from as arrayFrom } from '@dojo/shim/array';\r\nimport { isWNode, isVNode, isDomVNode, VNODE, WNODE } from './d';\r\nimport { isWidgetBaseConstructor } from './Registry';\r\nimport WeakMap from '@dojo/shim/WeakMap';\r\nconst NAMESPACE_W3 = 'http://www.w3.org/';\r\nconst NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg';\r\nconst NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink';\r\nconst emptyArray = [];\r\nexport const widgetInstanceMap = new WeakMap();\r\nconst instanceMap = new WeakMap();\r\nconst projectorStateMap = new WeakMap();\r\nfunction same(dnode1, dnode2) {\r\n if (isVNode(dnode1) && isVNode(dnode2)) {\r\n if (isDomVNode(dnode1) || isDomVNode(dnode2)) {\r\n if (dnode1.domNode !== dnode2.domNode) {\r\n return false;\r\n }\r\n }\r\n if (dnode1.tag !== dnode2.tag) {\r\n return false;\r\n }\r\n if (dnode1.properties.key !== dnode2.properties.key) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n else if (isWNode(dnode1) && isWNode(dnode2)) {\r\n if (dnode1.instance === undefined && typeof dnode2.widgetConstructor === 'string') {\r\n return false;\r\n }\r\n if (dnode1.widgetConstructor !== dnode2.widgetConstructor) {\r\n return false;\r\n }\r\n if (dnode1.properties.key !== dnode2.properties.key) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n return false;\r\n}\r\nconst missingTransition = function () {\r\n throw new Error('Provide a transitions object to the projectionOptions to do animations');\r\n};\r\nfunction getProjectionOptions(projectorOptions, projectorInstance) {\r\n const defaults = {\r\n namespace: undefined,\r\n styleApplyer: function (domNode, styleName, value) {\r\n domNode.style[styleName] = value;\r\n },\r\n transitions: {\r\n enter: missingTransition,\r\n exit: missingTransition\r\n },\r\n depth: 0,\r\n merge: false,\r\n sync: false,\r\n projectorInstance\r\n };\r\n return Object.assign({}, defaults, projectorOptions);\r\n}\r\nfunction checkStyleValue(styleValue) {\r\n if (typeof styleValue !== 'string') {\r\n throw new Error('Style values must be strings');\r\n }\r\n}\r\nfunction updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n const eventMap = projectorState.nodeMap.get(domNode) || new WeakMap();\r\n if (previousValue) {\r\n const previousEvent = eventMap.get(previousValue);\r\n domNode.removeEventListener(eventName, previousEvent);\r\n }\r\n let callback = currentValue.bind(bind);\r\n if (eventName === 'input') {\r\n callback = function (evt) {\r\n currentValue.call(this, evt);\r\n evt.target['oninput-value'] = evt.target.value;\r\n }.bind(bind);\r\n }\r\n domNode.addEventListener(eventName, callback);\r\n eventMap.set(currentValue, callback);\r\n projectorState.nodeMap.set(domNode, eventMap);\r\n}\r\nfunction addClasses(domNode, classes) {\r\n if (classes) {\r\n const classNames = classes.split(' ');\r\n for (let i = 0; i < classNames.length; i++) {\r\n domNode.classList.add(classNames[i]);\r\n }\r\n }\r\n}\r\nfunction removeClasses(domNode, classes) {\r\n if (classes) {\r\n const classNames = classes.split(' ');\r\n for (let i = 0; i < classNames.length; i++) {\r\n domNode.classList.remove(classNames[i]);\r\n }\r\n }\r\n}\r\nfunction buildPreviousProperties(domNode, previous, current) {\r\n const { diffType, properties, attributes } = current;\r\n if (!diffType || diffType === 'vdom') {\r\n return { properties: previous.properties, attributes: previous.attributes, events: previous.events };\r\n }\r\n else if (diffType === 'none') {\r\n return { properties: {}, attributes: previous.attributes ? {} : undefined, events: previous.events };\r\n }\r\n let newProperties = {\r\n properties: {}\r\n };\r\n if (attributes) {\r\n newProperties.attributes = {};\r\n newProperties.events = previous.events;\r\n Object.keys(properties).forEach((propName) => {\r\n newProperties.properties[propName] = domNode[propName];\r\n });\r\n Object.keys(attributes).forEach((attrName) => {\r\n newProperties.attributes[attrName] = domNode.getAttribute(attrName);\r\n });\r\n return newProperties;\r\n }\r\n newProperties.properties = Object.keys(properties).reduce((props, property) => {\r\n props[property] = domNode.getAttribute(property) || domNode[property];\r\n return props;\r\n }, {});\r\n return newProperties;\r\n}\r\nfunction focusNode(propValue, previousValue, domNode, projectionOptions) {\r\n let result;\r\n if (typeof propValue === 'function') {\r\n result = propValue();\r\n }\r\n else {\r\n result = propValue && !previousValue;\r\n }\r\n if (result === true) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectorState.deferredRenderCallbacks.push(() => {\r\n domNode.focus();\r\n });\r\n }\r\n}\r\nfunction removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions, onlyEvents = false) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n const eventMap = projectorState.nodeMap.get(domNode);\r\n if (eventMap) {\r\n Object.keys(previousProperties).forEach((propName) => {\r\n const isEvent = propName.substr(0, 2) === 'on' || onlyEvents;\r\n const eventName = onlyEvents ? propName : propName.substr(2);\r\n if (isEvent && !properties[propName]) {\r\n const eventCallback = eventMap.get(previousProperties[propName]);\r\n if (eventCallback) {\r\n domNode.removeEventListener(eventName, eventCallback);\r\n }\r\n }\r\n });\r\n }\r\n}\r\nfunction updateAttribute(domNode, attrName, attrValue, projectionOptions) {\r\n if (projectionOptions.namespace === NAMESPACE_SVG && attrName === 'href') {\r\n domNode.setAttributeNS(NAMESPACE_XLINK, attrName, attrValue);\r\n }\r\n else if ((attrName === 'role' && attrValue === '') || attrValue === undefined) {\r\n domNode.removeAttribute(attrName);\r\n }\r\n else {\r\n domNode.setAttribute(attrName, attrValue);\r\n }\r\n}\r\nfunction updateAttributes(domNode, previousAttributes, attributes, projectionOptions) {\r\n const attrNames = Object.keys(attributes);\r\n const attrCount = attrNames.length;\r\n for (let i = 0; i < attrCount; i++) {\r\n const attrName = attrNames[i];\r\n const attrValue = attributes[attrName];\r\n const previousAttrValue = previousAttributes[attrName];\r\n if (attrValue !== previousAttrValue) {\r\n updateAttribute(domNode, attrName, attrValue, projectionOptions);\r\n }\r\n }\r\n}\r\nfunction updateProperties(domNode, previousProperties, properties, projectionOptions, includesEventsAndAttributes = true) {\r\n let propertiesUpdated = false;\r\n const propNames = Object.keys(properties);\r\n const propCount = propNames.length;\r\n if (propNames.indexOf('classes') === -1 && previousProperties.classes) {\r\n if (Array.isArray(previousProperties.classes)) {\r\n for (let i = 0; i < previousProperties.classes.length; i++) {\r\n removeClasses(domNode, previousProperties.classes[i]);\r\n }\r\n }\r\n else {\r\n removeClasses(domNode, previousProperties.classes);\r\n }\r\n }\r\n includesEventsAndAttributes && removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions);\r\n for (let i = 0; i < propCount; i++) {\r\n const propName = propNames[i];\r\n let propValue = properties[propName];\r\n const previousValue = previousProperties[propName];\r\n if (propName === 'classes') {\r\n const previousClasses = Array.isArray(previousValue) ? previousValue : [previousValue];\r\n const currentClasses = Array.isArray(propValue) ? propValue : [propValue];\r\n if (previousClasses && previousClasses.length > 0) {\r\n if (!propValue || propValue.length === 0) {\r\n for (let i = 0; i < previousClasses.length; i++) {\r\n removeClasses(domNode, previousClasses[i]);\r\n }\r\n }\r\n else {\r\n const newClasses = [...currentClasses];\r\n for (let i = 0; i < previousClasses.length; i++) {\r\n const previousClassName = previousClasses[i];\r\n if (previousClassName) {\r\n const classIndex = newClasses.indexOf(previousClassName);\r\n if (classIndex === -1) {\r\n removeClasses(domNode, previousClassName);\r\n }\r\n else {\r\n newClasses.splice(classIndex, 1);\r\n }\r\n }\r\n }\r\n for (let i = 0; i < newClasses.length; i++) {\r\n addClasses(domNode, newClasses[i]);\r\n }\r\n }\r\n }\r\n else {\r\n for (let i = 0; i < currentClasses.length; i++) {\r\n addClasses(domNode, currentClasses[i]);\r\n }\r\n }\r\n }\r\n else if (propName === 'focus') {\r\n focusNode(propValue, previousValue, domNode, projectionOptions);\r\n }\r\n else if (propName === 'styles') {\r\n const styleNames = Object.keys(propValue);\r\n const styleCount = styleNames.length;\r\n for (let j = 0; j < styleCount; j++) {\r\n const styleName = styleNames[j];\r\n const newStyleValue = propValue[styleName];\r\n const oldStyleValue = previousValue && previousValue[styleName];\r\n if (newStyleValue === oldStyleValue) {\r\n continue;\r\n }\r\n propertiesUpdated = true;\r\n if (newStyleValue) {\r\n checkStyleValue(newStyleValue);\r\n projectionOptions.styleApplyer(domNode, styleName, newStyleValue);\r\n }\r\n else {\r\n projectionOptions.styleApplyer(domNode, styleName, '');\r\n }\r\n }\r\n }\r\n else {\r\n if (!propValue && typeof previousValue === 'string') {\r\n propValue = '';\r\n }\r\n if (propName === 'value') {\r\n const domValue = domNode[propName];\r\n if (domValue !== propValue &&\r\n (domNode['oninput-value']\r\n ? domValue === domNode['oninput-value']\r\n : propValue !== previousValue)) {\r\n domNode[propName] = propValue;\r\n domNode['oninput-value'] = undefined;\r\n }\r\n if (propValue !== previousValue) {\r\n propertiesUpdated = true;\r\n }\r\n }\r\n else if (propName !== 'key' && propValue !== previousValue) {\r\n const type = typeof propValue;\r\n if (type === 'function' && propName.lastIndexOf('on', 0) === 0 && includesEventsAndAttributes) {\r\n updateEvent(domNode, propName.substr(2), propValue, projectionOptions, properties.bind, previousValue);\r\n }\r\n else if (type === 'string' && propName !== 'innerHTML' && includesEventsAndAttributes) {\r\n updateAttribute(domNode, propName, propValue, projectionOptions);\r\n }\r\n else if (propName === 'scrollLeft' || propName === 'scrollTop') {\r\n if (domNode[propName] !== propValue) {\r\n domNode[propName] = propValue;\r\n }\r\n }\r\n else {\r\n domNode[propName] = propValue;\r\n }\r\n propertiesUpdated = true;\r\n }\r\n }\r\n }\r\n return propertiesUpdated;\r\n}\r\nfunction findIndexOfChild(children, sameAs, start) {\r\n for (let i = start; i < children.length; i++) {\r\n if (same(children[i], sameAs)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\nexport function toParentVNode(domNode) {\r\n return {\r\n tag: '',\r\n properties: {},\r\n children: undefined,\r\n domNode,\r\n type: VNODE\r\n };\r\n}\r\nexport function toTextVNode(data) {\r\n return {\r\n tag: '',\r\n properties: {},\r\n children: undefined,\r\n text: `${data}`,\r\n domNode: undefined,\r\n type: VNODE\r\n };\r\n}\r\nfunction toInternalWNode(instance, instanceData) {\r\n return {\r\n instance,\r\n rendered: [],\r\n coreProperties: instanceData.coreProperties,\r\n children: instance.children,\r\n widgetConstructor: instance.constructor,\r\n properties: instanceData.inputProperties,\r\n type: WNODE\r\n };\r\n}\r\nexport function filterAndDecorateChildren(children, instance) {\r\n if (children === undefined) {\r\n return emptyArray;\r\n }\r\n children = Array.isArray(children) ? children : [children];\r\n for (let i = 0; i < children.length;) {\r\n const child = children[i];\r\n if (child === undefined || child === null) {\r\n children.splice(i, 1);\r\n continue;\r\n }\r\n else if (typeof child === 'string') {\r\n children[i] = toTextVNode(child);\r\n }\r\n else {\r\n if (isVNode(child)) {\r\n if (child.properties.bind === undefined) {\r\n child.properties.bind = instance;\r\n if (child.children && child.children.length > 0) {\r\n filterAndDecorateChildren(child.children, instance);\r\n }\r\n }\r\n }\r\n else {\r\n if (!child.coreProperties) {\r\n const instanceData = widgetInstanceMap.get(instance);\r\n child.coreProperties = {\r\n bind: instance,\r\n baseRegistry: instanceData.coreProperties.baseRegistry\r\n };\r\n }\r\n if (child.children && child.children.length > 0) {\r\n filterAndDecorateChildren(child.children, instance);\r\n }\r\n }\r\n }\r\n i++;\r\n }\r\n return children;\r\n}\r\nfunction nodeAdded(dnode, transitions) {\r\n if (isVNode(dnode) && dnode.properties) {\r\n const enterAnimation = dnode.properties.enterAnimation;\r\n if (enterAnimation) {\r\n if (typeof enterAnimation === 'function') {\r\n enterAnimation(dnode.domNode, dnode.properties);\r\n }\r\n else {\r\n transitions.enter(dnode.domNode, dnode.properties, enterAnimation);\r\n }\r\n }\r\n }\r\n}\r\nfunction nodeToRemove(dnode, transitions, projectionOptions) {\r\n if (isWNode(dnode)) {\r\n const rendered = dnode.rendered || emptyArray;\r\n if (dnode.instance) {\r\n const instanceData = widgetInstanceMap.get(dnode.instance);\r\n instanceData.onDetach();\r\n instanceMap.delete(dnode.instance);\r\n }\r\n for (let i = 0; i < rendered.length; i++) {\r\n nodeToRemove(rendered[i], transitions, projectionOptions);\r\n }\r\n }\r\n else {\r\n const domNode = dnode.domNode;\r\n const properties = dnode.properties;\r\n if (dnode.children && dnode.children.length > 0) {\r\n for (let i = 0; i < dnode.children.length; i++) {\r\n nodeToRemove(dnode.children[i], transitions, projectionOptions);\r\n }\r\n }\r\n const exitAnimation = properties.exitAnimation;\r\n if (properties && exitAnimation) {\r\n domNode.style.pointerEvents = 'none';\r\n const removeDomNode = function () {\r\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\r\n dnode.domNode = undefined;\r\n };\r\n if (typeof exitAnimation === 'function') {\r\n exitAnimation(domNode, removeDomNode, properties);\r\n return;\r\n }\r\n else {\r\n transitions.exit(dnode.domNode, properties, exitAnimation, removeDomNode);\r\n return;\r\n }\r\n }\r\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\r\n dnode.domNode = undefined;\r\n }\r\n}\r\nfunction checkDistinguishable(childNodes, indexToCheck, parentInstance) {\r\n const childNode = childNodes[indexToCheck];\r\n if (isVNode(childNode) && !childNode.tag) {\r\n return; // Text nodes need not be distinguishable\r\n }\r\n const { key } = childNode.properties;\r\n if (key === undefined || key === null) {\r\n for (let i = 0; i < childNodes.length; i++) {\r\n if (i !== indexToCheck) {\r\n const node = childNodes[i];\r\n if (same(node, childNode)) {\r\n let nodeIdentifier;\r\n const parentName = parentInstance.constructor.name || 'unknown';\r\n if (isWNode(childNode)) {\r\n nodeIdentifier = childNode.widgetConstructor.name || 'unknown';\r\n }\r\n else {\r\n nodeIdentifier = childNode.tag;\r\n }\r\n console.warn(`A widget (${parentName}) has had a child addded or removed, but they were not able to uniquely identified. It is recommended to provide a unique 'key' property when using the same widget or element (${nodeIdentifier}) multiple times as siblings`);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\nfunction updateChildren(parentVNode, oldChildren, newChildren, parentInstance, projectionOptions) {\r\n oldChildren = oldChildren || emptyArray;\r\n newChildren = newChildren;\r\n const oldChildrenLength = oldChildren.length;\r\n const newChildrenLength = newChildren.length;\r\n const transitions = projectionOptions.transitions;\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\r\n let oldIndex = 0;\r\n let newIndex = 0;\r\n let i;\r\n let textUpdated = false;\r\n while (newIndex < newChildrenLength) {\r\n let oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : undefined;\r\n const newChild = newChildren[newIndex];\r\n if (isVNode(newChild) && typeof newChild.deferredPropertiesCallback === 'function') {\r\n newChild.inserted = isVNode(oldChild) && oldChild.inserted;\r\n addDeferredProperties(newChild, projectionOptions);\r\n }\r\n if (oldChild !== undefined && same(oldChild, newChild)) {\r\n textUpdated = updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance) || textUpdated;\r\n oldIndex++;\r\n newIndex++;\r\n continue;\r\n }\r\n const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);\r\n const addChild = () => {\r\n let insertBeforeDomNode = undefined;\r\n let child = oldChildren[oldIndex];\r\n if (child) {\r\n let nextIndex = oldIndex + 1;\r\n let insertBeforeChildren = [child];\r\n while (insertBeforeChildren.length) {\r\n const insertBefore = insertBeforeChildren.shift();\r\n if (isWNode(insertBefore)) {\r\n if (insertBefore.rendered) {\r\n insertBeforeChildren.push(...insertBefore.rendered);\r\n }\r\n }\r\n else {\r\n if (insertBefore.domNode) {\r\n insertBeforeDomNode = insertBefore.domNode;\r\n break;\r\n }\r\n }\r\n if (insertBeforeChildren.length === 0 && oldChildren[nextIndex]) {\r\n insertBeforeChildren.push(oldChildren[nextIndex]);\r\n nextIndex++;\r\n }\r\n }\r\n }\r\n createDom(newChild, parentVNode, insertBeforeDomNode, projectionOptions, parentInstance);\r\n nodeAdded(newChild, transitions);\r\n const indexToCheck = newIndex;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(newChildren, indexToCheck, parentInstance);\r\n });\r\n };\r\n if (!oldChild || findOldIndex === -1) {\r\n addChild();\r\n newIndex++;\r\n continue;\r\n }\r\n const removeChild = () => {\r\n const indexToCheck = oldIndex;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\r\n });\r\n if (isWNode(oldChild)) {\r\n const item = instanceMap.get(oldChild.instance);\r\n if (item) {\r\n oldChild = item.dnode;\r\n }\r\n }\r\n nodeToRemove(oldChild, transitions, projectionOptions);\r\n };\r\n const findNewIndex = findIndexOfChild(newChildren, oldChild, newIndex + 1);\r\n if (findNewIndex === -1) {\r\n removeChild();\r\n oldIndex++;\r\n continue;\r\n }\r\n addChild();\r\n removeChild();\r\n oldIndex++;\r\n newIndex++;\r\n }\r\n if (oldChildrenLength > oldIndex) {\r\n // Remove child fragments\r\n for (i = oldIndex; i < oldChildrenLength; i++) {\r\n const indexToCheck = i;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\r\n });\r\n let childToRemove = oldChildren[i];\r\n if (isWNode(childToRemove)) {\r\n const item = instanceMap.get(childToRemove.instance);\r\n if (item) {\r\n childToRemove = item.dnode;\r\n }\r\n }\r\n nodeToRemove(childToRemove, transitions, projectionOptions);\r\n }\r\n }\r\n return textUpdated;\r\n}\r\nfunction addChildren(parentVNode, children, projectionOptions, parentInstance, insertBefore = undefined, childNodes) {\r\n if (children === undefined) {\r\n return;\r\n }\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectorState.merge && childNodes === undefined) {\r\n childNodes = arrayFrom(parentVNode.domNode.childNodes);\r\n }\r\n const transitions = projectionOptions.transitions;\r\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n if (isVNode(child)) {\r\n if (projectorState.merge && childNodes) {\r\n let domElement = undefined;\r\n while (child.domNode === undefined && childNodes.length > 0) {\r\n domElement = childNodes.shift();\r\n if (domElement && domElement.tagName === (child.tag.toUpperCase() || undefined)) {\r\n child.domNode = domElement;\r\n }\r\n }\r\n }\r\n createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance);\r\n }\r\n else {\r\n createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes);\r\n }\r\n nodeAdded(child, transitions);\r\n }\r\n}\r\nfunction initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions) {\r\n addChildren(dnode, dnode.children, projectionOptions, parentInstance, undefined);\r\n if (typeof dnode.deferredPropertiesCallback === 'function' && dnode.inserted === undefined) {\r\n addDeferredProperties(dnode, projectionOptions);\r\n }\r\n if (dnode.attributes && dnode.events) {\r\n updateAttributes(domNode, {}, dnode.attributes, projectionOptions);\r\n updateProperties(domNode, {}, dnode.properties, projectionOptions, false);\r\n removeOrphanedEvents(domNode, {}, dnode.events, projectionOptions, true);\r\n const events = dnode.events;\r\n Object.keys(events).forEach((event) => {\r\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind);\r\n });\r\n }\r\n else {\r\n updateProperties(domNode, {}, dnode.properties, projectionOptions);\r\n }\r\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\r\n const instanceData = widgetInstanceMap.get(parentInstance);\r\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\r\n }\r\n dnode.inserted = true;\r\n}\r\nfunction createDom(dnode, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes) {\r\n let domNode;\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (isWNode(dnode)) {\r\n let { widgetConstructor } = dnode;\r\n const parentInstanceData = widgetInstanceMap.get(parentInstance);\r\n if (!isWidgetBaseConstructor(widgetConstructor)) {\r\n const item = parentInstanceData.registry().get(widgetConstructor);\r\n if (item === null) {\r\n return;\r\n }\r\n widgetConstructor = item;\r\n }\r\n const instance = new widgetConstructor();\r\n dnode.instance = instance;\r\n const instanceData = widgetInstanceMap.get(instance);\r\n instanceData.invalidate = () => {\r\n instanceData.dirty = true;\r\n if (instanceData.rendering === false) {\r\n projectorState.renderQueue.push({ instance, depth: projectionOptions.depth });\r\n scheduleRender(projectionOptions);\r\n }\r\n };\r\n instanceData.rendering = true;\r\n instance.__setCoreProperties__(dnode.coreProperties);\r\n instance.__setChildren__(dnode.children);\r\n instance.__setProperties__(dnode.properties);\r\n const rendered = instance.__render__();\r\n instanceData.rendering = false;\r\n if (rendered) {\r\n const filteredRendered = filterAndDecorateChildren(rendered, instance);\r\n dnode.rendered = filteredRendered;\r\n addChildren(parentVNode, filteredRendered, projectionOptions, instance, insertBefore, childNodes);\r\n }\r\n instanceMap.set(instance, { dnode, parentVNode });\r\n instanceData.nodeHandler.addRoot();\r\n projectorState.afterRenderCallbacks.push(() => {\r\n instanceData.onAttach();\r\n });\r\n }\r\n else {\r\n if (projectorState.merge && projectorState.mergeElement !== undefined) {\r\n domNode = dnode.domNode = projectionOptions.mergeElement;\r\n projectorState.mergeElement = undefined;\r\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\r\n return;\r\n }\r\n const doc = parentVNode.domNode.ownerDocument;\r\n if (!dnode.tag && typeof dnode.text === 'string') {\r\n if (dnode.domNode !== undefined && parentVNode.domNode) {\r\n const newDomNode = dnode.domNode.ownerDocument.createTextNode(dnode.text);\r\n if (parentVNode.domNode === dnode.domNode.parentNode) {\r\n parentVNode.domNode.replaceChild(newDomNode, dnode.domNode);\r\n }\r\n else {\r\n parentVNode.domNode.appendChild(newDomNode);\r\n dnode.domNode.parentNode && dnode.domNode.parentNode.removeChild(dnode.domNode);\r\n }\r\n dnode.domNode = newDomNode;\r\n }\r\n else {\r\n domNode = dnode.domNode = doc.createTextNode(dnode.text);\r\n if (insertBefore !== undefined) {\r\n parentVNode.domNode.insertBefore(domNode, insertBefore);\r\n }\r\n else {\r\n parentVNode.domNode.appendChild(domNode);\r\n }\r\n }\r\n }\r\n else {\r\n if (dnode.domNode === undefined) {\r\n if (dnode.tag === 'svg') {\r\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\r\n }\r\n if (projectionOptions.namespace !== undefined) {\r\n domNode = dnode.domNode = doc.createElementNS(projectionOptions.namespace, dnode.tag);\r\n }\r\n else {\r\n domNode = dnode.domNode = dnode.domNode || doc.createElement(dnode.tag);\r\n }\r\n }\r\n else {\r\n domNode = dnode.domNode;\r\n }\r\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\r\n if (insertBefore !== undefined) {\r\n parentVNode.domNode.insertBefore(domNode, insertBefore);\r\n }\r\n else if (domNode.parentNode !== parentVNode.domNode) {\r\n parentVNode.domNode.appendChild(domNode);\r\n }\r\n }\r\n }\r\n}\r\nfunction updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance) {\r\n if (isWNode(dnode)) {\r\n const { instance } = previous;\r\n const { parentVNode, dnode: node } = instanceMap.get(instance);\r\n const previousRendered = node ? node.rendered : previous.rendered;\r\n const instanceData = widgetInstanceMap.get(instance);\r\n instanceData.rendering = true;\r\n instance.__setCoreProperties__(dnode.coreProperties);\r\n instance.__setChildren__(dnode.children);\r\n instance.__setProperties__(dnode.properties);\r\n dnode.instance = instance;\r\n if (instanceData.dirty === true) {\r\n const rendered = instance.__render__();\r\n instanceData.rendering = false;\r\n dnode.rendered = filterAndDecorateChildren(rendered, instance);\r\n updateChildren(parentVNode, previousRendered, dnode.rendered, instance, projectionOptions);\r\n }\r\n else {\r\n instanceData.rendering = false;\r\n dnode.rendered = previousRendered;\r\n }\r\n instanceMap.set(instance, { dnode, parentVNode });\r\n instanceData.nodeHandler.addRoot();\r\n }\r\n else {\r\n if (previous === dnode) {\r\n return false;\r\n }\r\n const domNode = (dnode.domNode = previous.domNode);\r\n let textUpdated = false;\r\n let updated = false;\r\n if (!dnode.tag && typeof dnode.text === 'string') {\r\n if (dnode.text !== previous.text) {\r\n const newDomNode = domNode.ownerDocument.createTextNode(dnode.text);\r\n domNode.parentNode.replaceChild(newDomNode, domNode);\r\n dnode.domNode = newDomNode;\r\n textUpdated = true;\r\n return textUpdated;\r\n }\r\n }\r\n else {\r\n if (dnode.tag && dnode.tag.lastIndexOf('svg', 0) === 0) {\r\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\r\n }\r\n if (previous.children !== dnode.children) {\r\n const children = filterAndDecorateChildren(dnode.children, parentInstance);\r\n dnode.children = children;\r\n updated =\r\n updateChildren(dnode, previous.children, children, parentInstance, projectionOptions) || updated;\r\n }\r\n const previousProperties = buildPreviousProperties(domNode, previous, dnode);\r\n if (dnode.attributes && dnode.events) {\r\n updateAttributes(domNode, previousProperties.attributes, dnode.attributes, projectionOptions);\r\n updated =\r\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions, false) || updated;\r\n removeOrphanedEvents(domNode, previousProperties.events, dnode.events, projectionOptions, true);\r\n const events = dnode.events;\r\n Object.keys(events).forEach((event) => {\r\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind, previousProperties.events[event]);\r\n });\r\n }\r\n else {\r\n updated =\r\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions) ||\r\n updated;\r\n }\r\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\r\n const instanceData = widgetInstanceMap.get(parentInstance);\r\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\r\n }\r\n }\r\n if (updated && dnode.properties && dnode.properties.updateAnimation) {\r\n dnode.properties.updateAnimation(domNode, dnode.properties, previous.properties);\r\n }\r\n }\r\n}\r\nfunction addDeferredProperties(vnode, projectionOptions) {\r\n // transfer any properties that have been passed - as these must be decorated properties\r\n vnode.decoratedDeferredProperties = vnode.properties;\r\n const properties = vnode.deferredPropertiesCallback(!!vnode.inserted);\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n vnode.properties = Object.assign({}, properties, vnode.decoratedDeferredProperties);\r\n projectorState.deferredRenderCallbacks.push(() => {\r\n const properties = Object.assign({}, vnode.deferredPropertiesCallback(!!vnode.inserted), vnode.decoratedDeferredProperties);\r\n updateProperties(vnode.domNode, vnode.properties, properties, projectionOptions);\r\n vnode.properties = properties;\r\n });\r\n}\r\nfunction runDeferredRenderCallbacks(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectorState.deferredRenderCallbacks.length) {\r\n if (projectionOptions.sync) {\r\n while (projectorState.deferredRenderCallbacks.length) {\r\n const callback = projectorState.deferredRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n }\r\n else {\r\n global.requestAnimationFrame(() => {\r\n while (projectorState.deferredRenderCallbacks.length) {\r\n const callback = projectorState.deferredRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n }\r\n}\r\nfunction runAfterRenderCallbacks(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectionOptions.sync) {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n }\r\n else {\r\n if (global.requestIdleCallback) {\r\n global.requestIdleCallback(() => {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n else {\r\n setTimeout(() => {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n }\r\n}\r\nfunction scheduleRender(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectionOptions.sync) {\r\n render(projectionOptions);\r\n }\r\n else if (projectorState.renderScheduled === undefined) {\r\n projectorState.renderScheduled = global.requestAnimationFrame(() => {\r\n render(projectionOptions);\r\n });\r\n }\r\n}\r\nfunction render(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectorState.renderScheduled = undefined;\r\n const renderQueue = projectorState.renderQueue;\r\n const renders = [...renderQueue];\r\n projectorState.renderQueue = [];\r\n renders.sort((a, b) => a.depth - b.depth);\r\n const previouslyRendered = [];\r\n while (renders.length) {\r\n const { instance } = renders.shift();\r\n if (instanceMap.has(instance) && previouslyRendered.indexOf(instance) === -1) {\r\n previouslyRendered.push(instance);\r\n const { parentVNode, dnode } = instanceMap.get(instance);\r\n const instanceData = widgetInstanceMap.get(instance);\r\n updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance);\r\n }\r\n }\r\n runAfterRenderCallbacks(projectionOptions);\r\n runDeferredRenderCallbacks(projectionOptions);\r\n}\r\nexport const dom = {\r\n append: function (parentNode, instance, projectionOptions = {}) {\r\n const instanceData = widgetInstanceMap.get(instance);\r\n const finalProjectorOptions = getProjectionOptions(projectionOptions, instance);\r\n const projectorState = {\r\n afterRenderCallbacks: [],\r\n deferredRenderCallbacks: [],\r\n nodeMap: new WeakMap(),\r\n renderScheduled: undefined,\r\n renderQueue: [],\r\n merge: projectionOptions.merge || false,\r\n mergeElement: projectionOptions.mergeElement\r\n };\r\n projectorStateMap.set(instance, projectorState);\r\n finalProjectorOptions.rootNode = parentNode;\r\n const parentVNode = toParentVNode(finalProjectorOptions.rootNode);\r\n const node = toInternalWNode(instance, instanceData);\r\n instanceMap.set(instance, { dnode: node, parentVNode });\r\n instanceData.invalidate = () => {\r\n instanceData.dirty = true;\r\n if (instanceData.rendering === false) {\r\n projectorState.renderQueue.push({ instance, depth: finalProjectorOptions.depth });\r\n scheduleRender(finalProjectorOptions);\r\n }\r\n };\r\n updateDom(node, node, finalProjectorOptions, parentVNode, instance);\r\n projectorState.afterRenderCallbacks.push(() => {\r\n instanceData.onAttach();\r\n });\r\n runDeferredRenderCallbacks(finalProjectorOptions);\r\n runAfterRenderCallbacks(finalProjectorOptions);\r\n return {\r\n domNode: finalProjectorOptions.rootNode\r\n };\r\n },\r\n create: function (instance, projectionOptions) {\r\n return this.append(document.createElement('div'), instance, projectionOptions);\r\n },\r\n merge: function (element, instance, projectionOptions = {}) {\r\n projectionOptions.merge = true;\r\n projectionOptions.mergeElement = element;\r\n const projection = this.append(element.parentNode, instance, projectionOptions);\r\n const projectorState = projectorStateMap.get(instance);\r\n projectorState.merge = false;\r\n return projection;\r\n }\r\n};\r\n//# sourceMappingURL=vdom.mjs.map" + "source": "import global from '../shim/global';\r\nimport { from as arrayFrom } from '../shim/array';\r\nimport { isWNode, isVNode, isDomVNode, VNODE, WNODE } from './d';\r\nimport { isWidgetBaseConstructor } from './Registry';\r\nimport WeakMap from '../shim/WeakMap';\r\nconst NAMESPACE_W3 = 'http://www.w3.org/';\r\nconst NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg';\r\nconst NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink';\r\nconst emptyArray = [];\r\nconst nodeOperations = ['focus', 'blur', 'scrollIntoView', 'click'];\r\nexport const widgetInstanceMap = new WeakMap();\r\nconst instanceMap = new WeakMap();\r\nconst nextSiblingMap = new WeakMap();\r\nconst projectorStateMap = new WeakMap();\r\nfunction same(dnode1, dnode2) {\r\n if (isVNode(dnode1) && isVNode(dnode2)) {\r\n if (isDomVNode(dnode1) || isDomVNode(dnode2)) {\r\n if (dnode1.domNode !== dnode2.domNode) {\r\n return false;\r\n }\r\n }\r\n if (dnode1.tag !== dnode2.tag) {\r\n return false;\r\n }\r\n if (dnode1.properties.key !== dnode2.properties.key) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n else if (isWNode(dnode1) && isWNode(dnode2)) {\r\n if (dnode1.instance === undefined && typeof dnode2.widgetConstructor === 'string') {\r\n return false;\r\n }\r\n if (dnode1.widgetConstructor !== dnode2.widgetConstructor) {\r\n return false;\r\n }\r\n if (dnode1.properties.key !== dnode2.properties.key) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n return false;\r\n}\r\nconst missingTransition = function () {\r\n throw new Error('Provide a transitions object to the projectionOptions to do animations');\r\n};\r\nfunction getProjectionOptions(projectorOptions, projectorInstance) {\r\n const defaults = {\r\n namespace: undefined,\r\n styleApplyer: function (domNode, styleName, value) {\r\n domNode.style[styleName] = value;\r\n },\r\n transitions: {\r\n enter: missingTransition,\r\n exit: missingTransition\r\n },\r\n depth: 0,\r\n merge: false,\r\n sync: false,\r\n projectorInstance\r\n };\r\n return Object.assign({}, defaults, projectorOptions);\r\n}\r\nfunction checkStyleValue(styleValue) {\r\n if (typeof styleValue !== 'string') {\r\n throw new Error('Style values must be strings');\r\n }\r\n}\r\nfunction updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n const eventMap = projectorState.nodeMap.get(domNode) || new WeakMap();\r\n if (previousValue) {\r\n const previousEvent = eventMap.get(previousValue);\r\n domNode.removeEventListener(eventName, previousEvent);\r\n }\r\n let callback = currentValue.bind(bind);\r\n if (eventName === 'input') {\r\n callback = function (evt) {\r\n currentValue.call(this, evt);\r\n evt.target['oninput-value'] = evt.target.value;\r\n }.bind(bind);\r\n }\r\n domNode.addEventListener(eventName, callback);\r\n eventMap.set(currentValue, callback);\r\n projectorState.nodeMap.set(domNode, eventMap);\r\n}\r\nfunction addClasses(domNode, classes) {\r\n if (classes) {\r\n const classNames = classes.split(' ');\r\n for (let i = 0; i < classNames.length; i++) {\r\n domNode.classList.add(classNames[i]);\r\n }\r\n }\r\n}\r\nfunction removeClasses(domNode, classes) {\r\n if (classes) {\r\n const classNames = classes.split(' ');\r\n for (let i = 0; i < classNames.length; i++) {\r\n domNode.classList.remove(classNames[i]);\r\n }\r\n }\r\n}\r\nfunction buildPreviousProperties(domNode, previous, current) {\r\n const { diffType, properties, attributes } = current;\r\n if (!diffType || diffType === 'vdom') {\r\n return { properties: previous.properties, attributes: previous.attributes, events: previous.events };\r\n }\r\n else if (diffType === 'none') {\r\n return { properties: {}, attributes: previous.attributes ? {} : undefined, events: previous.events };\r\n }\r\n let newProperties = {\r\n properties: {}\r\n };\r\n if (attributes) {\r\n newProperties.attributes = {};\r\n newProperties.events = previous.events;\r\n Object.keys(properties).forEach((propName) => {\r\n newProperties.properties[propName] = domNode[propName];\r\n });\r\n Object.keys(attributes).forEach((attrName) => {\r\n newProperties.attributes[attrName] = domNode.getAttribute(attrName);\r\n });\r\n return newProperties;\r\n }\r\n newProperties.properties = Object.keys(properties).reduce((props, property) => {\r\n props[property] = domNode.getAttribute(property) || domNode[property];\r\n return props;\r\n }, {});\r\n return newProperties;\r\n}\r\nfunction nodeOperation(propName, propValue, previousValue, domNode, projectionOptions) {\r\n let result;\r\n if (typeof propValue === 'function') {\r\n result = propValue();\r\n }\r\n else {\r\n result = propValue && !previousValue;\r\n }\r\n if (result === true) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectorState.deferredRenderCallbacks.push(() => {\r\n domNode[propName]();\r\n });\r\n }\r\n}\r\nfunction removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions, onlyEvents = false) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n const eventMap = projectorState.nodeMap.get(domNode);\r\n if (eventMap) {\r\n Object.keys(previousProperties).forEach((propName) => {\r\n const isEvent = propName.substr(0, 2) === 'on' || onlyEvents;\r\n const eventName = onlyEvents ? propName : propName.substr(2);\r\n if (isEvent && !properties[propName]) {\r\n const eventCallback = eventMap.get(previousProperties[propName]);\r\n if (eventCallback) {\r\n domNode.removeEventListener(eventName, eventCallback);\r\n }\r\n }\r\n });\r\n }\r\n}\r\nfunction updateAttribute(domNode, attrName, attrValue, projectionOptions) {\r\n if (projectionOptions.namespace === NAMESPACE_SVG && attrName === 'href') {\r\n domNode.setAttributeNS(NAMESPACE_XLINK, attrName, attrValue);\r\n }\r\n else if ((attrName === 'role' && attrValue === '') || attrValue === undefined) {\r\n domNode.removeAttribute(attrName);\r\n }\r\n else {\r\n domNode.setAttribute(attrName, attrValue);\r\n }\r\n}\r\nfunction updateAttributes(domNode, previousAttributes, attributes, projectionOptions) {\r\n const attrNames = Object.keys(attributes);\r\n const attrCount = attrNames.length;\r\n for (let i = 0; i < attrCount; i++) {\r\n const attrName = attrNames[i];\r\n const attrValue = attributes[attrName];\r\n const previousAttrValue = previousAttributes[attrName];\r\n if (attrValue !== previousAttrValue) {\r\n updateAttribute(domNode, attrName, attrValue, projectionOptions);\r\n }\r\n }\r\n}\r\nfunction updateProperties(domNode, previousProperties, properties, projectionOptions, includesEventsAndAttributes = true) {\r\n let propertiesUpdated = false;\r\n const propNames = Object.keys(properties);\r\n const propCount = propNames.length;\r\n if (propNames.indexOf('classes') === -1 && previousProperties.classes) {\r\n if (Array.isArray(previousProperties.classes)) {\r\n for (let i = 0; i < previousProperties.classes.length; i++) {\r\n removeClasses(domNode, previousProperties.classes[i]);\r\n }\r\n }\r\n else {\r\n removeClasses(domNode, previousProperties.classes);\r\n }\r\n }\r\n includesEventsAndAttributes && removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions);\r\n for (let i = 0; i < propCount; i++) {\r\n const propName = propNames[i];\r\n let propValue = properties[propName];\r\n const previousValue = previousProperties[propName];\r\n if (propName === 'classes') {\r\n const previousClasses = Array.isArray(previousValue) ? previousValue : [previousValue];\r\n const currentClasses = Array.isArray(propValue) ? propValue : [propValue];\r\n if (previousClasses && previousClasses.length > 0) {\r\n if (!propValue || propValue.length === 0) {\r\n for (let i = 0; i < previousClasses.length; i++) {\r\n removeClasses(domNode, previousClasses[i]);\r\n }\r\n }\r\n else {\r\n const newClasses = [...currentClasses];\r\n for (let i = 0; i < previousClasses.length; i++) {\r\n const previousClassName = previousClasses[i];\r\n if (previousClassName) {\r\n const classIndex = newClasses.indexOf(previousClassName);\r\n if (classIndex === -1) {\r\n removeClasses(domNode, previousClassName);\r\n }\r\n else {\r\n newClasses.splice(classIndex, 1);\r\n }\r\n }\r\n }\r\n for (let i = 0; i < newClasses.length; i++) {\r\n addClasses(domNode, newClasses[i]);\r\n }\r\n }\r\n }\r\n else {\r\n for (let i = 0; i < currentClasses.length; i++) {\r\n addClasses(domNode, currentClasses[i]);\r\n }\r\n }\r\n }\r\n else if (nodeOperations.indexOf(propName) !== -1) {\r\n nodeOperation(propName, propValue, previousValue, domNode, projectionOptions);\r\n }\r\n else if (propName === 'styles') {\r\n const styleNames = Object.keys(propValue);\r\n const styleCount = styleNames.length;\r\n for (let j = 0; j < styleCount; j++) {\r\n const styleName = styleNames[j];\r\n const newStyleValue = propValue[styleName];\r\n const oldStyleValue = previousValue && previousValue[styleName];\r\n if (newStyleValue === oldStyleValue) {\r\n continue;\r\n }\r\n propertiesUpdated = true;\r\n if (newStyleValue) {\r\n checkStyleValue(newStyleValue);\r\n projectionOptions.styleApplyer(domNode, styleName, newStyleValue);\r\n }\r\n else {\r\n projectionOptions.styleApplyer(domNode, styleName, '');\r\n }\r\n }\r\n }\r\n else {\r\n if (!propValue && typeof previousValue === 'string') {\r\n propValue = '';\r\n }\r\n if (propName === 'value') {\r\n const domValue = domNode[propName];\r\n if (domValue !== propValue &&\r\n (domNode['oninput-value']\r\n ? domValue === domNode['oninput-value']\r\n : propValue !== previousValue)) {\r\n domNode[propName] = propValue;\r\n domNode['oninput-value'] = undefined;\r\n }\r\n if (propValue !== previousValue) {\r\n propertiesUpdated = true;\r\n }\r\n }\r\n else if (propName !== 'key' && propValue !== previousValue) {\r\n const type = typeof propValue;\r\n if (type === 'function' && propName.lastIndexOf('on', 0) === 0 && includesEventsAndAttributes) {\r\n updateEvent(domNode, propName.substr(2), propValue, projectionOptions, properties.bind, previousValue);\r\n }\r\n else if (type === 'string' && propName !== 'innerHTML' && includesEventsAndAttributes) {\r\n updateAttribute(domNode, propName, propValue, projectionOptions);\r\n }\r\n else if (propName === 'scrollLeft' || propName === 'scrollTop') {\r\n if (domNode[propName] !== propValue) {\r\n domNode[propName] = propValue;\r\n }\r\n }\r\n else {\r\n domNode[propName] = propValue;\r\n }\r\n propertiesUpdated = true;\r\n }\r\n }\r\n }\r\n return propertiesUpdated;\r\n}\r\nfunction findIndexOfChild(children, sameAs, start) {\r\n for (let i = start; i < children.length; i++) {\r\n if (same(children[i], sameAs)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\nexport function toParentVNode(domNode) {\r\n return {\r\n tag: '',\r\n properties: {},\r\n children: undefined,\r\n domNode,\r\n type: VNODE\r\n };\r\n}\r\nexport function toTextVNode(data) {\r\n return {\r\n tag: '',\r\n properties: {},\r\n children: undefined,\r\n text: `${data}`,\r\n domNode: undefined,\r\n type: VNODE\r\n };\r\n}\r\nfunction toInternalWNode(instance, instanceData) {\r\n return {\r\n instance,\r\n rendered: [],\r\n coreProperties: instanceData.coreProperties,\r\n children: instance.children,\r\n widgetConstructor: instance.constructor,\r\n properties: instanceData.inputProperties,\r\n type: WNODE\r\n };\r\n}\r\nexport function filterAndDecorateChildren(children, instance) {\r\n if (children === undefined) {\r\n return emptyArray;\r\n }\r\n children = Array.isArray(children) ? children : [children];\r\n for (let i = 0; i < children.length;) {\r\n const child = children[i];\r\n if (child === undefined || child === null) {\r\n children.splice(i, 1);\r\n continue;\r\n }\r\n else if (typeof child === 'string') {\r\n children[i] = toTextVNode(child);\r\n }\r\n else {\r\n if (isVNode(child)) {\r\n if (child.properties.bind === undefined) {\r\n child.properties.bind = instance;\r\n if (child.children && child.children.length > 0) {\r\n filterAndDecorateChildren(child.children, instance);\r\n }\r\n }\r\n }\r\n else {\r\n if (!child.coreProperties) {\r\n const instanceData = widgetInstanceMap.get(instance);\r\n child.coreProperties = {\r\n bind: instance,\r\n baseRegistry: instanceData.coreProperties.baseRegistry\r\n };\r\n }\r\n if (child.children && child.children.length > 0) {\r\n filterAndDecorateChildren(child.children, instance);\r\n }\r\n }\r\n }\r\n i++;\r\n }\r\n return children;\r\n}\r\nfunction nodeAdded(dnode, transitions) {\r\n if (isVNode(dnode) && dnode.properties) {\r\n const enterAnimation = dnode.properties.enterAnimation;\r\n if (enterAnimation) {\r\n if (typeof enterAnimation === 'function') {\r\n enterAnimation(dnode.domNode, dnode.properties);\r\n }\r\n else {\r\n transitions.enter(dnode.domNode, dnode.properties, enterAnimation);\r\n }\r\n }\r\n }\r\n}\r\nfunction nodeToRemove(dnode, transitions, projectionOptions) {\r\n if (isWNode(dnode)) {\r\n const item = instanceMap.get(dnode.instance);\r\n const rendered = (item ? item.dnode.rendered : dnode.rendered) || emptyArray;\r\n if (dnode.instance) {\r\n const instanceData = widgetInstanceMap.get(dnode.instance);\r\n instanceData.onDetach();\r\n instanceMap.delete(dnode.instance);\r\n }\r\n for (let i = 0; i < rendered.length; i++) {\r\n nodeToRemove(rendered[i], transitions, projectionOptions);\r\n }\r\n }\r\n else {\r\n const domNode = dnode.domNode;\r\n const properties = dnode.properties;\r\n if (dnode.children && dnode.children.length > 0) {\r\n for (let i = 0; i < dnode.children.length; i++) {\r\n nodeToRemove(dnode.children[i], transitions, projectionOptions);\r\n }\r\n }\r\n const exitAnimation = properties.exitAnimation;\r\n if (properties && exitAnimation) {\r\n domNode.style.pointerEvents = 'none';\r\n const removeDomNode = function () {\r\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\r\n dnode.domNode = undefined;\r\n };\r\n if (typeof exitAnimation === 'function') {\r\n exitAnimation(domNode, removeDomNode, properties);\r\n return;\r\n }\r\n else {\r\n transitions.exit(dnode.domNode, properties, exitAnimation, removeDomNode);\r\n return;\r\n }\r\n }\r\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\r\n dnode.domNode = undefined;\r\n }\r\n}\r\nfunction checkDistinguishable(childNodes, indexToCheck, parentInstance) {\r\n const childNode = childNodes[indexToCheck];\r\n if (isVNode(childNode) && !childNode.tag) {\r\n return; // Text nodes need not be distinguishable\r\n }\r\n const { key } = childNode.properties;\r\n if (key === undefined || key === null) {\r\n for (let i = 0; i < childNodes.length; i++) {\r\n if (i !== indexToCheck) {\r\n const node = childNodes[i];\r\n if (same(node, childNode)) {\r\n let nodeIdentifier;\r\n const parentName = parentInstance.constructor.name || 'unknown';\r\n if (isWNode(childNode)) {\r\n nodeIdentifier = childNode.widgetConstructor.name || 'unknown';\r\n }\r\n else {\r\n nodeIdentifier = childNode.tag;\r\n }\r\n console.warn(`A widget (${parentName}) has had a child addded or removed, but they were not able to uniquely identified. It is recommended to provide a unique 'key' property when using the same widget or element (${nodeIdentifier}) multiple times as siblings`);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\nfunction updateChildren(parentVNode, siblings, oldChildren, newChildren, parentInstance, projectionOptions) {\r\n oldChildren = oldChildren || emptyArray;\r\n newChildren = newChildren;\r\n const oldChildrenLength = oldChildren.length;\r\n const newChildrenLength = newChildren.length;\r\n const transitions = projectionOptions.transitions;\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\r\n let oldIndex = 0;\r\n let newIndex = 0;\r\n let i;\r\n let textUpdated = false;\r\n while (newIndex < newChildrenLength) {\r\n let oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : undefined;\r\n const newChild = newChildren[newIndex];\r\n if (isVNode(newChild) && typeof newChild.deferredPropertiesCallback === 'function') {\r\n newChild.inserted = isVNode(oldChild) && oldChild.inserted;\r\n addDeferredProperties(newChild, projectionOptions);\r\n }\r\n if (oldChild !== undefined && same(oldChild, newChild)) {\r\n oldIndex++;\r\n newIndex++;\r\n textUpdated =\r\n updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance, oldChildren.slice(oldIndex), newChildren.slice(newIndex)) || textUpdated;\r\n continue;\r\n }\r\n const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);\r\n const addChild = () => {\r\n let insertBeforeDomNode = undefined;\r\n let childrenArray = oldChildren;\r\n let nextIndex = oldIndex + 1;\r\n let child = oldChildren[oldIndex];\r\n if (!child) {\r\n child = siblings[0];\r\n nextIndex = 1;\r\n childrenArray = siblings;\r\n }\r\n if (child) {\r\n let insertBeforeChildren = [child];\r\n while (insertBeforeChildren.length) {\r\n const insertBefore = insertBeforeChildren.shift();\r\n if (isWNode(insertBefore)) {\r\n const item = instanceMap.get(insertBefore.instance);\r\n if (item && item.dnode.rendered) {\r\n insertBeforeChildren.push(...item.dnode.rendered);\r\n }\r\n }\r\n else {\r\n if (insertBefore.domNode) {\r\n if (insertBefore.domNode.parentElement !== parentVNode.domNode) {\r\n break;\r\n }\r\n insertBeforeDomNode = insertBefore.domNode;\r\n break;\r\n }\r\n }\r\n if (insertBeforeChildren.length === 0 && childrenArray[nextIndex]) {\r\n insertBeforeChildren.push(childrenArray[nextIndex]);\r\n nextIndex++;\r\n }\r\n }\r\n }\r\n createDom(newChild, parentVNode, newChildren.slice(newIndex + 1), insertBeforeDomNode, projectionOptions, parentInstance);\r\n nodeAdded(newChild, transitions);\r\n const indexToCheck = newIndex;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(newChildren, indexToCheck, parentInstance);\r\n });\r\n };\r\n if (!oldChild || findOldIndex === -1) {\r\n addChild();\r\n newIndex++;\r\n continue;\r\n }\r\n const removeChild = () => {\r\n const indexToCheck = oldIndex;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\r\n });\r\n if (isWNode(oldChild)) {\r\n const item = instanceMap.get(oldChild.instance);\r\n if (item) {\r\n oldChild = item.dnode;\r\n }\r\n }\r\n nodeToRemove(oldChild, transitions, projectionOptions);\r\n };\r\n const findNewIndex = findIndexOfChild(newChildren, oldChild, newIndex + 1);\r\n if (findNewIndex === -1) {\r\n removeChild();\r\n oldIndex++;\r\n continue;\r\n }\r\n addChild();\r\n removeChild();\r\n oldIndex++;\r\n newIndex++;\r\n }\r\n if (oldChildrenLength > oldIndex) {\r\n // Remove child fragments\r\n for (i = oldIndex; i < oldChildrenLength; i++) {\r\n const indexToCheck = i;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\r\n });\r\n let childToRemove = oldChildren[i];\r\n if (isWNode(childToRemove)) {\r\n const item = instanceMap.get(childToRemove.instance);\r\n if (item) {\r\n childToRemove = item.dnode;\r\n }\r\n }\r\n nodeToRemove(childToRemove, transitions, projectionOptions);\r\n }\r\n }\r\n return textUpdated;\r\n}\r\nfunction addChildren(parentVNode, children, projectionOptions, parentInstance, insertBefore = undefined, childNodes) {\r\n if (children === undefined) {\r\n return;\r\n }\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectorState.merge && childNodes === undefined) {\r\n childNodes = arrayFrom(parentVNode.domNode.childNodes);\r\n }\r\n const transitions = projectionOptions.transitions;\r\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n const nextSiblings = children.slice(i + 1);\r\n if (isVNode(child)) {\r\n if (projectorState.merge && childNodes) {\r\n let domElement = undefined;\r\n while (child.domNode === undefined && childNodes.length > 0) {\r\n domElement = childNodes.shift();\r\n if (domElement && domElement.tagName === (child.tag.toUpperCase() || undefined)) {\r\n child.domNode = domElement;\r\n }\r\n }\r\n }\r\n createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance);\r\n }\r\n else {\r\n createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes);\r\n }\r\n nodeAdded(child, transitions);\r\n }\r\n}\r\nfunction initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions) {\r\n addChildren(dnode, dnode.children, projectionOptions, parentInstance, undefined);\r\n if (typeof dnode.deferredPropertiesCallback === 'function' && dnode.inserted === undefined) {\r\n addDeferredProperties(dnode, projectionOptions);\r\n }\r\n if (dnode.attributes && dnode.events) {\r\n updateAttributes(domNode, {}, dnode.attributes, projectionOptions);\r\n updateProperties(domNode, {}, dnode.properties, projectionOptions, false);\r\n removeOrphanedEvents(domNode, {}, dnode.events, projectionOptions, true);\r\n const events = dnode.events;\r\n Object.keys(events).forEach((event) => {\r\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind);\r\n });\r\n }\r\n else {\r\n updateProperties(domNode, {}, dnode.properties, projectionOptions);\r\n }\r\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\r\n const instanceData = widgetInstanceMap.get(parentInstance);\r\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\r\n }\r\n dnode.inserted = true;\r\n}\r\nfunction createDom(dnode, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes) {\r\n let domNode;\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (isWNode(dnode)) {\r\n let { widgetConstructor } = dnode;\r\n const parentInstanceData = widgetInstanceMap.get(parentInstance);\r\n if (!isWidgetBaseConstructor(widgetConstructor)) {\r\n const item = parentInstanceData.registry().get(widgetConstructor);\r\n if (item === null) {\r\n return;\r\n }\r\n widgetConstructor = item;\r\n }\r\n const instance = new widgetConstructor();\r\n dnode.instance = instance;\r\n nextSiblingMap.set(instance, nextSiblings);\r\n const instanceData = widgetInstanceMap.get(instance);\r\n instanceData.invalidate = () => {\r\n instanceData.dirty = true;\r\n if (instanceData.rendering === false) {\r\n projectorState.renderQueue.push({ instance, depth: projectionOptions.depth });\r\n scheduleRender(projectionOptions);\r\n }\r\n };\r\n instanceData.rendering = true;\r\n instance.__setCoreProperties__(dnode.coreProperties);\r\n instance.__setChildren__(dnode.children);\r\n instance.__setProperties__(dnode.properties);\r\n const rendered = instance.__render__();\r\n instanceData.rendering = false;\r\n if (rendered) {\r\n const filteredRendered = filterAndDecorateChildren(rendered, instance);\r\n dnode.rendered = filteredRendered;\r\n addChildren(parentVNode, filteredRendered, projectionOptions, instance, insertBefore, childNodes);\r\n }\r\n instanceMap.set(instance, { dnode, parentVNode });\r\n instanceData.nodeHandler.addRoot();\r\n projectorState.afterRenderCallbacks.push(() => {\r\n instanceData.onAttach();\r\n });\r\n }\r\n else {\r\n if (projectorState.merge && projectorState.mergeElement !== undefined) {\r\n domNode = dnode.domNode = projectionOptions.mergeElement;\r\n projectorState.mergeElement = undefined;\r\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\r\n return;\r\n }\r\n const doc = parentVNode.domNode.ownerDocument;\r\n if (!dnode.tag && typeof dnode.text === 'string') {\r\n if (dnode.domNode !== undefined && parentVNode.domNode) {\r\n const newDomNode = dnode.domNode.ownerDocument.createTextNode(dnode.text);\r\n if (parentVNode.domNode === dnode.domNode.parentNode) {\r\n parentVNode.domNode.replaceChild(newDomNode, dnode.domNode);\r\n }\r\n else {\r\n parentVNode.domNode.appendChild(newDomNode);\r\n dnode.domNode.parentNode && dnode.domNode.parentNode.removeChild(dnode.domNode);\r\n }\r\n dnode.domNode = newDomNode;\r\n }\r\n else {\r\n domNode = dnode.domNode = doc.createTextNode(dnode.text);\r\n if (insertBefore !== undefined) {\r\n parentVNode.domNode.insertBefore(domNode, insertBefore);\r\n }\r\n else {\r\n parentVNode.domNode.appendChild(domNode);\r\n }\r\n }\r\n }\r\n else {\r\n if (dnode.domNode === undefined) {\r\n if (dnode.tag === 'svg') {\r\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\r\n }\r\n if (projectionOptions.namespace !== undefined) {\r\n domNode = dnode.domNode = doc.createElementNS(projectionOptions.namespace, dnode.tag);\r\n }\r\n else {\r\n domNode = dnode.domNode = dnode.domNode || doc.createElement(dnode.tag);\r\n }\r\n }\r\n else {\r\n domNode = dnode.domNode;\r\n }\r\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\r\n if (insertBefore !== undefined) {\r\n parentVNode.domNode.insertBefore(domNode, insertBefore);\r\n }\r\n else if (domNode.parentNode !== parentVNode.domNode) {\r\n parentVNode.domNode.appendChild(domNode);\r\n }\r\n }\r\n }\r\n}\r\nfunction updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance, oldNextSiblings, nextSiblings) {\r\n if (isWNode(dnode)) {\r\n const { instance } = previous;\r\n const { parentVNode, dnode: node } = instanceMap.get(instance);\r\n const previousRendered = node ? node.rendered : previous.rendered;\r\n const instanceData = widgetInstanceMap.get(instance);\r\n instanceData.rendering = true;\r\n instance.__setCoreProperties__(dnode.coreProperties);\r\n instance.__setChildren__(dnode.children);\r\n instance.__setProperties__(dnode.properties);\r\n nextSiblingMap.set(instance, nextSiblings);\r\n dnode.instance = instance;\r\n if (instanceData.dirty === true) {\r\n const rendered = instance.__render__();\r\n instanceData.rendering = false;\r\n dnode.rendered = filterAndDecorateChildren(rendered, instance);\r\n updateChildren(parentVNode, oldNextSiblings, previousRendered, dnode.rendered, instance, projectionOptions);\r\n }\r\n else {\r\n instanceData.rendering = false;\r\n dnode.rendered = previousRendered;\r\n }\r\n instanceMap.set(instance, { dnode, parentVNode });\r\n instanceData.nodeHandler.addRoot();\r\n }\r\n else {\r\n if (previous === dnode) {\r\n return false;\r\n }\r\n const domNode = (dnode.domNode = previous.domNode);\r\n let textUpdated = false;\r\n let updated = false;\r\n if (!dnode.tag && typeof dnode.text === 'string') {\r\n if (dnode.text !== previous.text) {\r\n const newDomNode = domNode.ownerDocument.createTextNode(dnode.text);\r\n domNode.parentNode.replaceChild(newDomNode, domNode);\r\n dnode.domNode = newDomNode;\r\n textUpdated = true;\r\n return textUpdated;\r\n }\r\n }\r\n else {\r\n if (dnode.tag && dnode.tag.lastIndexOf('svg', 0) === 0) {\r\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\r\n }\r\n if (previous.children !== dnode.children) {\r\n const children = filterAndDecorateChildren(dnode.children, parentInstance);\r\n dnode.children = children;\r\n updated =\r\n updateChildren(dnode, oldNextSiblings, previous.children, children, parentInstance, projectionOptions) || updated;\r\n }\r\n const previousProperties = buildPreviousProperties(domNode, previous, dnode);\r\n if (dnode.attributes && dnode.events) {\r\n updateAttributes(domNode, previousProperties.attributes, dnode.attributes, projectionOptions);\r\n updated =\r\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions, false) || updated;\r\n removeOrphanedEvents(domNode, previousProperties.events, dnode.events, projectionOptions, true);\r\n const events = dnode.events;\r\n Object.keys(events).forEach((event) => {\r\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind, previousProperties.events[event]);\r\n });\r\n }\r\n else {\r\n updated =\r\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions) ||\r\n updated;\r\n }\r\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\r\n const instanceData = widgetInstanceMap.get(parentInstance);\r\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\r\n }\r\n }\r\n if (updated && dnode.properties && dnode.properties.updateAnimation) {\r\n dnode.properties.updateAnimation(domNode, dnode.properties, previous.properties);\r\n }\r\n }\r\n}\r\nfunction addDeferredProperties(vnode, projectionOptions) {\r\n // transfer any properties that have been passed - as these must be decorated properties\r\n vnode.decoratedDeferredProperties = vnode.properties;\r\n const properties = vnode.deferredPropertiesCallback(!!vnode.inserted);\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n vnode.properties = Object.assign({}, properties, vnode.decoratedDeferredProperties);\r\n projectorState.deferredRenderCallbacks.push(() => {\r\n const properties = Object.assign({}, vnode.deferredPropertiesCallback(!!vnode.inserted), vnode.decoratedDeferredProperties);\r\n updateProperties(vnode.domNode, vnode.properties, properties, projectionOptions);\r\n vnode.properties = properties;\r\n });\r\n}\r\nfunction runDeferredRenderCallbacks(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectorState.deferredRenderCallbacks.length) {\r\n if (projectionOptions.sync) {\r\n while (projectorState.deferredRenderCallbacks.length) {\r\n const callback = projectorState.deferredRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n }\r\n else {\r\n global.requestAnimationFrame(() => {\r\n while (projectorState.deferredRenderCallbacks.length) {\r\n const callback = projectorState.deferredRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n }\r\n}\r\nfunction runAfterRenderCallbacks(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectionOptions.sync) {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n }\r\n else {\r\n if (global.requestIdleCallback) {\r\n global.requestIdleCallback(() => {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n else {\r\n setTimeout(() => {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n }\r\n}\r\nfunction scheduleRender(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectionOptions.sync) {\r\n render(projectionOptions);\r\n }\r\n else if (projectorState.renderScheduled === undefined) {\r\n projectorState.renderScheduled = global.requestAnimationFrame(() => {\r\n render(projectionOptions);\r\n });\r\n }\r\n}\r\nfunction render(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectorState.renderScheduled = undefined;\r\n const renderQueue = projectorState.renderQueue;\r\n const renders = [...renderQueue];\r\n projectorState.renderQueue = [];\r\n renders.sort((a, b) => a.depth - b.depth);\r\n const previouslyRendered = [];\r\n while (renders.length) {\r\n const { instance } = renders.shift();\r\n if (instanceMap.has(instance) && previouslyRendered.indexOf(instance) === -1) {\r\n previouslyRendered.push(instance);\r\n const { parentVNode, dnode } = instanceMap.get(instance);\r\n const instanceData = widgetInstanceMap.get(instance);\r\n const nextSiblings = nextSiblingMap.get(instance);\r\n updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance, nextSiblings, nextSiblings);\r\n }\r\n }\r\n runAfterRenderCallbacks(projectionOptions);\r\n runDeferredRenderCallbacks(projectionOptions);\r\n}\r\nexport const dom = {\r\n append: function (parentNode, instance, projectionOptions = {}) {\r\n const instanceData = widgetInstanceMap.get(instance);\r\n const finalProjectorOptions = getProjectionOptions(projectionOptions, instance);\r\n const projectorState = {\r\n afterRenderCallbacks: [],\r\n deferredRenderCallbacks: [],\r\n nodeMap: new WeakMap(),\r\n renderScheduled: undefined,\r\n renderQueue: [],\r\n merge: projectionOptions.merge || false,\r\n mergeElement: projectionOptions.mergeElement\r\n };\r\n projectorStateMap.set(instance, projectorState);\r\n finalProjectorOptions.rootNode = parentNode;\r\n const parentVNode = toParentVNode(finalProjectorOptions.rootNode);\r\n const node = toInternalWNode(instance, instanceData);\r\n instanceMap.set(instance, { dnode: node, parentVNode });\r\n instanceData.invalidate = () => {\r\n instanceData.dirty = true;\r\n if (instanceData.rendering === false) {\r\n projectorState.renderQueue.push({ instance, depth: finalProjectorOptions.depth });\r\n scheduleRender(finalProjectorOptions);\r\n }\r\n };\r\n updateDom(node, node, finalProjectorOptions, parentVNode, instance, [], []);\r\n projectorState.afterRenderCallbacks.push(() => {\r\n instanceData.onAttach();\r\n });\r\n runDeferredRenderCallbacks(finalProjectorOptions);\r\n runAfterRenderCallbacks(finalProjectorOptions);\r\n return {\r\n domNode: finalProjectorOptions.rootNode\r\n };\r\n },\r\n create: function (instance, projectionOptions) {\r\n return this.append(document.createElement('div'), instance, projectionOptions);\r\n },\r\n merge: function (element, instance, projectionOptions = {}) {\r\n projectionOptions.merge = true;\r\n projectionOptions.mergeElement = element;\r\n const projection = this.append(element.parentNode, instance, projectionOptions);\r\n const projectorState = projectorStateMap.get(instance);\r\n projectorState.merge = false;\r\n return projection;\r\n }\r\n};\r\n//# sourceMappingURL=vdom.mjs.map" }, { "id": "./node_modules/imports-loader/index.js?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js", @@ -4870,7 +4887,7 @@ "name": "./node_modules/imports-loader?widgetFactory=src/menu-item/MenuItem!./node_modules/@dojo/cli-build-widget/template/custom-element.js", "index": 1, "index2": 41, - "size": 286, + "size": 296, "cacheable": true, "built": true, "optional": false, @@ -4900,7 +4917,7 @@ "providedExports": null, "optimizationBailout": [], "depth": 1, - "source": "/*** IMPORTS FROM imports-loader ***/\nvar widgetFactory = require(\"src/menu-item/MenuItem\");\n\nvar registerCustomElement = require('@dojo/widget-core/registerCustomElement').default;\r\n\r\nvar defaultExport = widgetFactory.default;\r\ndefaultExport && registerCustomElement(defaultExport);\r\n\n" + "source": "/*** IMPORTS FROM imports-loader ***/\nvar widgetFactory = require(\"src/menu-item/MenuItem\");\n\nvar registerCustomElement = require('@dojo/framework/widget-core/registerCustomElement').default;\r\n\r\nvar defaultExport = widgetFactory.default;\r\ndefaultExport && registerCustomElement(defaultExport);\r\n\n" }, { "id": "./node_modules/process/browser.js", @@ -4917,21 +4934,21 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\has\\has.mjs", - "issuerId": "./node_modules/@dojo/has/has.mjs", - "issuerName": "./node_modules/@dojo/has/has.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\has\\has.mjs", + "issuerId": "./node_modules/@dojo/framework/has/has.mjs", + "issuerName": "./node_modules/@dojo/framework/has/has.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/has/has.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\has\\has.mjs", - "module": "./node_modules/@dojo/has/has.mjs", - "moduleName": "./node_modules/@dojo/has/has.mjs", + "moduleId": "./node_modules/@dojo/framework/has/has.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\has\\has.mjs", + "module": "./node_modules/@dojo/framework/has/has.mjs", + "moduleName": "./node_modules/@dojo/framework/has/has.mjs", "type": "cjs require", "userRequest": "process", - "loc": "1:0-37" + "loc": "1:0-40" } ], "usedExports": true, @@ -4955,18 +4972,18 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "tslib", "loc": "1:0-33" @@ -4981,19 +4998,19 @@ "loc": "1:0-33" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "tslib", "loc": "1:0-33" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "tslib", "loc": "1:0-33" @@ -5001,7 +5018,6 @@ ], "usedExports": [ "__decorate", - "__metadata", "__rest" ], "providedExports": [ @@ -5042,30 +5058,30 @@ "menu-item" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\global.mjs", - "issuerId": "./node_modules/@dojo/shim/global.mjs", - "issuerName": "./node_modules/@dojo/shim/global.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\global.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/global.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/global.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/global.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\global.mjs", - "module": "./node_modules/@dojo/shim/global.mjs", - "moduleName": "./node_modules/@dojo/shim/global.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/global.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\global.mjs", + "module": "./node_modules/@dojo/framework/shim/global.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/global.mjs", "type": "cjs require", "userRequest": "global", - "loc": "1:0-44" + "loc": "1:0-47" }, { - "moduleId": "./node_modules/@dojo/has/has.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\has\\has.mjs", - "module": "./node_modules/@dojo/has/has.mjs", - "moduleName": "./node_modules/@dojo/has/has.mjs", + "moduleId": "./node_modules/@dojo/framework/has/has.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\has\\has.mjs", + "module": "./node_modules/@dojo/framework/has/has.mjs", + "moduleName": "./node_modules/@dojo/framework/has/has.mjs", "type": "cjs require", "userRequest": "global", - "loc": "1:0-44" + "loc": "1:0-47" } ], "usedExports": true, @@ -5080,7 +5096,7 @@ "name": "./src/menu-item/MenuItem.ts", "index": 2, "index2": 40, - "size": 1126, + "size": 1166, "cacheable": true, "built": true, "optional": false, @@ -5113,7 +5129,7 @@ ], "optimizationBailout": [], "depth": 2, - "source": "import * as tslib_1 from \"tslib\";\r\nimport { v } from '@dojo/widget-core/d';\r\nimport { customElement } from '@dojo/widget-core/decorators/customElement';\r\nimport { theme, ThemedMixin } from '@dojo/widget-core/mixins/Themed';\r\nimport { WidgetBase } from '@dojo/widget-core/WidgetBase';\r\nimport * as css from './menuItem.m.css';\r\nlet MenuItem = class MenuItem extends ThemedMixin(WidgetBase) {\r\n _onClick() {\r\n this.properties.onSelected && this.properties.onSelected(this.properties.data);\r\n }\r\n render() {\r\n const { title, selected } = this.properties;\r\n return v('li', { classes: this.theme(css.root) }, [\r\n v('span', {\r\n classes: this.theme([css.item, selected ? css.selected : null]),\r\n onclick: this._onClick\r\n }, [title])\r\n ]);\r\n }\r\n};\r\nMenuItem = tslib_1.__decorate([\r\n customElement({\r\n tag: 'demo-menu-item',\r\n attributes: ['title', 'selected'],\r\n events: ['onSelected'],\r\n properties: ['data', 'selected']\r\n }),\r\n theme(css)\r\n], MenuItem);\r\nexport { MenuItem };\r\nexport default MenuItem;\r\n" + "source": "import * as tslib_1 from \"tslib\";\r\nimport { v } from '@dojo/framework/widget-core/d';\r\nimport { customElement } from '@dojo/framework/widget-core/decorators/customElement';\r\nimport { theme, ThemedMixin } from '@dojo/framework/widget-core/mixins/Themed';\r\nimport { WidgetBase } from '@dojo/framework/widget-core/WidgetBase';\r\nimport * as css from './menuItem.m.css';\r\nlet MenuItem = class MenuItem extends ThemedMixin(WidgetBase) {\r\n _onClick() {\r\n this.properties.onSelected && this.properties.onSelected(this.properties.data);\r\n }\r\n render() {\r\n const { title, selected } = this.properties;\r\n return v('li', { classes: this.theme(css.root) }, [\r\n v('span', {\r\n classes: this.theme([css.item, selected ? css.selected : null]),\r\n onclick: this._onClick\r\n }, [title])\r\n ]);\r\n }\r\n};\r\nMenuItem = tslib_1.__decorate([\r\n customElement({\r\n tag: 'demo-menu-item',\r\n attributes: ['title', 'selected'],\r\n events: ['onSelected'],\r\n properties: ['data', 'selected']\r\n }),\r\n theme(css)\r\n], MenuItem);\r\nexport { MenuItem };\r\nexport default MenuItem;\r\n" }, { "id": "./src/menu-item/menuItem.m.css", diff --git a/test-app/fixtures/windows/info/menu/report.html b/test-app/fixtures/windows/info/menu/report.html index c8532d6..e5d5f8a 100644 --- a/test-app/fixtures/windows/info/menu/report.html +++ b/test-app/fixtures/windows/info/menu/report.html @@ -4,7 +4,7 @@ Webpack Bundle Analyzer diff --git a/test-app/fixtures/windows/info/menu/stats.json b/test-app/fixtures/windows/info/menu/stats.json index f3ebc2f..04d8d1b 100644 --- a/test-app/fixtures/windows/info/menu/stats.json +++ b/test-app/fixtures/windows/info/menu/stats.json @@ -2,8 +2,8 @@ "errors": [], "warnings": [], "version": "3.8.1", - "hash": "3e984433321e15a3bb9b", - "time": 7204, + "hash": "b1d790cff3d2b119c671", + "time": 8609, "publicPath": "", "assetsByChunkName": { "menu": [ @@ -16,7 +16,7 @@ "assets": [ { "name": "menu-1.0.0.js", - "size": 54024, + "size": 55200, "chunks": [ "menu" ], @@ -38,7 +38,7 @@ }, { "name": "menu-1.0.0.js.map", - "size": 273970, + "size": 275436, "chunks": [ "menu" ], @@ -80,7 +80,7 @@ "initial": true, "entry": true, "extraAsync": false, - "size": 195249, + "size": 195469, "names": [ "menu" ], @@ -90,16 +90,16 @@ "menu-1.0.0.js.map", "menu-1.0.0.css.map" ], - "hash": "d18869be4d8257c205ea", + "hash": "6bc5a4dfa19a710d3acf", "parents": [], "modules": [ { - "id": "./node_modules/@dojo/core/Destroyable.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Destroyable.mjs", - "name": "./node_modules/@dojo/core/Destroyable.mjs", + "id": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Destroyable.mjs", + "name": "./node_modules/@dojo/framework/core/Destroyable.mjs", "index": 25, "index2": 17, - "size": 1668, + "size": 1665, "cacheable": true, "built": true, "optional": false, @@ -108,18 +108,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Evented.mjs", - "issuerId": "./node_modules/@dojo/core/Evented.mjs", - "issuerName": "./node_modules/@dojo/core/Evented.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Evented.mjs", + "issuerId": "./node_modules/@dojo/framework/core/Evented.mjs", + "issuerName": "./node_modules/@dojo/framework/core/Evented.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/core/Evented.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Evented.mjs", - "module": "./node_modules/@dojo/core/Evented.mjs", - "moduleName": "./node_modules/@dojo/core/Evented.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Evented.mjs", + "module": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Evented.mjs", "type": "harmony import", "userRequest": "./Destroyable", "loc": "2:0-44" @@ -134,15 +134,15 @@ ], "optimizationBailout": [], "depth": 6, - "source": "import { createCompositeHandle } from './lang';\nimport Promise from '@dojo/shim/Promise';\n/**\n * No operation function to replace own once instance is destoryed\n */\nfunction noop() {\n return Promise.resolve(false);\n}\n/**\n * No op function used to replace own, once instance has been destoryed\n */\nfunction destroyed() {\n throw new Error('Call made to destroyed method');\n}\nexport class Destroyable {\n /**\n * @constructor\n */\n constructor() {\n this.handles = [];\n }\n /**\n * Register handles for the instance that will be destroyed when `this.destroy` is called\n *\n * @param {Handle} handle The handle to add for the instance\n * @returns {Handle} a handle for the handle, removes the handle for the instance and calls destroy\n */\n own(handles) {\n const handle = Array.isArray(handles) ? createCompositeHandle(...handles) : handles;\n const { handles: _handles } = this;\n _handles.push(handle);\n return {\n destroy() {\n _handles.splice(_handles.indexOf(handle));\n handle.destroy();\n }\n };\n }\n /**\n * Destrpys all handers registered for the instance\n *\n * @returns {Promise {\n this.handles.forEach((handle) => {\n handle && handle.destroy && handle.destroy();\n });\n this.destroy = noop;\n this.own = destroyed;\n resolve(true);\n });\n }\n}\nexport default Destroyable;\n//# sourceMappingURL=Destroyable.mjs.map" + "source": "import { createCompositeHandle } from './lang';\nimport Promise from '../shim/Promise';\n/**\n * No operation function to replace own once instance is destoryed\n */\nfunction noop() {\n return Promise.resolve(false);\n}\n/**\n * No op function used to replace own, once instance has been destoryed\n */\nfunction destroyed() {\n throw new Error('Call made to destroyed method');\n}\nexport class Destroyable {\n /**\n * @constructor\n */\n constructor() {\n this.handles = [];\n }\n /**\n * Register handles for the instance that will be destroyed when `this.destroy` is called\n *\n * @param {Handle} handle The handle to add for the instance\n * @returns {Handle} a handle for the handle, removes the handle for the instance and calls destroy\n */\n own(handles) {\n const handle = Array.isArray(handles) ? createCompositeHandle(...handles) : handles;\n const { handles: _handles } = this;\n _handles.push(handle);\n return {\n destroy() {\n _handles.splice(_handles.indexOf(handle));\n handle.destroy();\n }\n };\n }\n /**\n * Destrpys all handers registered for the instance\n *\n * @returns {Promise {\n this.handles.forEach((handle) => {\n handle && handle.destroy && handle.destroy();\n });\n this.destroy = noop;\n this.own = destroyed;\n resolve(true);\n });\n }\n}\nexport default Destroyable;\n//# sourceMappingURL=Destroyable.mjs.map" }, { - "id": "./node_modules/@dojo/core/Evented.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Evented.mjs", - "name": "./node_modules/@dojo/core/Evented.mjs", + "id": "./node_modules/@dojo/framework/core/Evented.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Evented.mjs", + "name": "./node_modules/@dojo/framework/core/Evented.mjs", "index": 24, "index2": 18, - "size": 2220, + "size": 2222, "cacheable": true, "built": true, "optional": false, @@ -151,48 +151,48 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\RegistryHandler.mjs", - "issuerId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "issuerName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\RegistryHandler.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\RegistryHandler.mjs", - "module": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\RegistryHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "2:0-45" + "userRequest": "../core/Evented", + "loc": "2:0-42" }, { - "moduleId": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\NodeHandler.mjs", - "module": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "1:0-45" + "userRequest": "../core/Evented", + "loc": "4:0-42" }, { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\NodeHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "4:0-45" + "userRequest": "../core/Evented", + "loc": "1:0-42" }, { - "moduleId": "./node_modules/@dojo/widget-core/Injector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Injector.mjs", - "module": "./node_modules/@dojo/widget-core/Injector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Injector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Injector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Injector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Injector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Injector.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "1:0-45" + "userRequest": "../core/Evented", + "loc": "1:0-42" } ], "usedExports": [ @@ -205,15 +205,15 @@ ], "optimizationBailout": [], "depth": 5, - "source": "import Map from '@dojo/shim/Map';\r\nimport { Destroyable } from './Destroyable';\r\n/**\r\n * Map of computed regular expressions, keyed by string\r\n */\r\nconst regexMap = new Map();\r\n/**\r\n * Determines is the event type glob has been matched\r\n *\r\n * @returns boolean that indicates if the glob is matched\r\n */\r\nexport function isGlobMatch(globString, targetString) {\r\n if (typeof targetString === 'string' && typeof globString === 'string' && globString.indexOf('*') !== -1) {\r\n let regex;\r\n if (regexMap.has(globString)) {\r\n regex = regexMap.get(globString);\r\n }\r\n else {\r\n regex = new RegExp(`^${globString.replace(/\\*/g, '.*')}$`);\r\n regexMap.set(globString, regex);\r\n }\r\n return regex.test(targetString);\r\n }\r\n else {\r\n return globString === targetString;\r\n }\r\n}\r\n/**\r\n * Event Class\r\n */\r\nexport class Evented extends Destroyable {\r\n constructor() {\r\n super(...arguments);\r\n /**\r\n * map of listeners keyed by event type\r\n */\r\n this.listenersMap = new Map();\r\n }\r\n emit(event) {\r\n this.listenersMap.forEach((methods, type) => {\r\n if (isGlobMatch(type, event.type)) {\r\n methods.forEach((method) => {\r\n method.call(this, event);\r\n });\r\n }\r\n });\r\n }\r\n on(type, listener) {\r\n if (Array.isArray(listener)) {\r\n const handles = listener.map((listener) => this._addListener(type, listener));\r\n return {\r\n destroy() {\r\n handles.forEach((handle) => handle.destroy());\r\n }\r\n };\r\n }\r\n return this._addListener(type, listener);\r\n }\r\n _addListener(type, listener) {\r\n const listeners = this.listenersMap.get(type) || [];\r\n listeners.push(listener);\r\n this.listenersMap.set(type, listeners);\r\n return {\r\n destroy: () => {\r\n const listeners = this.listenersMap.get(type) || [];\r\n listeners.splice(listeners.indexOf(listener), 1);\r\n }\r\n };\r\n }\r\n}\r\nexport default Evented;\r\n//# sourceMappingURL=Evented.mjs.map" + "source": "import Map from '../shim/Map';\r\nimport { Destroyable } from './Destroyable';\r\n/**\r\n * Map of computed regular expressions, keyed by string\r\n */\r\nconst regexMap = new Map();\r\n/**\r\n * Determines is the event type glob has been matched\r\n *\r\n * @returns boolean that indicates if the glob is matched\r\n */\r\nexport function isGlobMatch(globString, targetString) {\r\n if (typeof targetString === 'string' && typeof globString === 'string' && globString.indexOf('*') !== -1) {\r\n let regex;\r\n if (regexMap.has(globString)) {\r\n regex = regexMap.get(globString);\r\n }\r\n else {\r\n regex = new RegExp(`^${globString.replace(/\\*/g, '.*')}$`);\r\n regexMap.set(globString, regex);\r\n }\r\n return regex.test(targetString);\r\n }\r\n else {\r\n return globString === targetString;\r\n }\r\n}\r\n/**\r\n * Event Class\r\n */\r\nexport class Evented extends Destroyable {\r\n constructor() {\r\n super(...arguments);\r\n /**\r\n * map of listeners keyed by event type\r\n */\r\n this.listenersMap = new Map();\r\n }\r\n emit(event) {\r\n this.listenersMap.forEach((methods, type) => {\r\n if (isGlobMatch(type, event.type)) {\r\n [...methods].forEach((method) => {\r\n method.call(this, event);\r\n });\r\n }\r\n });\r\n }\r\n on(type, listener) {\r\n if (Array.isArray(listener)) {\r\n const handles = listener.map((listener) => this._addListener(type, listener));\r\n return {\r\n destroy() {\r\n handles.forEach((handle) => handle.destroy());\r\n }\r\n };\r\n }\r\n return this._addListener(type, listener);\r\n }\r\n _addListener(type, listener) {\r\n const listeners = this.listenersMap.get(type) || [];\r\n listeners.push(listener);\r\n this.listenersMap.set(type, listeners);\r\n return {\r\n destroy: () => {\r\n const listeners = this.listenersMap.get(type) || [];\r\n listeners.splice(listeners.indexOf(listener), 1);\r\n }\r\n };\r\n }\r\n}\r\nexport default Evented;\r\n//# sourceMappingURL=Evented.mjs.map" }, { - "id": "./node_modules/@dojo/core/lang.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\lang.mjs", - "name": "./node_modules/@dojo/core/lang.mjs", + "id": "./node_modules/@dojo/framework/core/lang.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\lang.mjs", + "name": "./node_modules/@dojo/framework/core/lang.mjs", "index": 26, "index2": 16, - "size": 6843, + "size": 6837, "cacheable": true, "built": true, "optional": false, @@ -222,27 +222,27 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", - "userRequest": "@dojo/core/lang", + "userRequest": "../../core/lang", "loc": "2:0-41" }, { - "moduleId": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Destroyable.mjs", - "module": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleName": "./node_modules/@dojo/core/Destroyable.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Destroyable.mjs", + "module": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Destroyable.mjs", "type": "harmony import", "userRequest": "./lang", "loc": "1:0-47" @@ -267,12 +267,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { assign } from '@dojo/shim/object';\nexport { assign } from '@dojo/shim/object';\nconst slice = Array.prototype.slice;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Type guard that ensures that the value can be coerced to Object\n * to weed out host objects that do not derive from Object.\n * This function is used to check if we want to deep copy an object or not.\n * Note: In ES6 it is possible to modify an object's Symbol.toStringTag property, which will\n * change the value returned by `toString`. This is a rare edge case that is difficult to handle,\n * so it is not handled here.\n * @param value The value to check\n * @return If the value is coercible into an Object\n */\nfunction shouldDeepCopyObject(value) {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\nfunction copyArray(array, inherited) {\n return array.map(function (item) {\n if (Array.isArray(item)) {\n return copyArray(item, inherited);\n }\n return !shouldDeepCopyObject(item)\n ? item\n : _mixin({\n deep: true,\n inherited: inherited,\n sources: [item],\n target: {}\n });\n });\n}\nfunction _mixin(kwArgs) {\n const deep = kwArgs.deep;\n const inherited = kwArgs.inherited;\n const target = kwArgs.target;\n const copied = kwArgs.copied || [];\n const copiedClone = [...copied];\n for (let i = 0; i < kwArgs.sources.length; i++) {\n const source = kwArgs.sources[i];\n if (source === null || source === undefined) {\n continue;\n }\n for (let key in source) {\n if (inherited || hasOwnProperty.call(source, key)) {\n let value = source[key];\n if (copiedClone.indexOf(value) !== -1) {\n continue;\n }\n if (deep) {\n if (Array.isArray(value)) {\n value = copyArray(value, inherited);\n }\n else if (shouldDeepCopyObject(value)) {\n const targetValue = target[key] || {};\n copied.push(source);\n value = _mixin({\n deep: true,\n inherited: inherited,\n sources: [value],\n target: targetValue,\n copied\n });\n }\n }\n target[key] = value;\n }\n }\n }\n return target;\n}\nexport function create(prototype, ...mixins) {\n if (!mixins.length) {\n throw new RangeError('lang.create requires at least one mixin object.');\n }\n const args = mixins.slice();\n args.unshift(Object.create(prototype));\n return assign.apply(null, args);\n}\nexport function deepAssign(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: false,\n sources: sources,\n target: target\n });\n}\nexport function deepMixin(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Creates a new object using the provided source's prototype as the prototype for the new object, and then\n * deep copies the provided source's values into the new target.\n *\n * @param source The object to duplicate\n * @return The new object\n */\nexport function duplicate(source) {\n const target = Object.create(Object.getPrototypeOf(source));\n return deepMixin(target, source);\n}\n/**\n * Determines whether two values are the same value.\n *\n * @param a First value to compare\n * @param b Second value to compare\n * @return true if the values are the same; false otherwise\n */\nexport function isIdentical(a, b) {\n return (a === b ||\n /* both values are NaN */\n (a !== a && b !== b));\n}\n/**\n * Returns a function that binds a method to the specified object at runtime. This is similar to\n * `Function.prototype.bind`, but instead of a function it takes the name of a method on an object.\n * As a result, the function returned by `lateBind` will always call the function currently assigned to\n * the specified property on the object as of the moment the function it returns is called.\n *\n * @param instance The context object\n * @param method The name of the method on the context object to bind to itself\n * @param suppliedArgs An optional array of values to prepend to the `instance[method]` arguments list\n * @return The bound function\n */\nexport function lateBind(instance, method, ...suppliedArgs) {\n return suppliedArgs.length\n ? function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n // TS7017\n return instance[method].apply(instance, args);\n }\n : function () {\n // TS7017\n return instance[method].apply(instance, arguments);\n };\n}\nexport function mixin(target, ...sources) {\n return _mixin({\n deep: false,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Returns a function which invokes the given function with the given arguments prepended to its argument list.\n * Like `Function.prototype.bind`, but does not alter execution context.\n *\n * @param targetFunction The function that needs to be bound\n * @param suppliedArgs An optional array of arguments to prepend to the `targetFunction` arguments list\n * @return The bound function\n */\nexport function partial(targetFunction, ...suppliedArgs) {\n return function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n return targetFunction.apply(this, args);\n };\n}\n/**\n * Returns an object with a destroy method that, when called, calls the passed-in destructor.\n * This is intended to provide a unified interface for creating \"remove\" / \"destroy\" handlers for\n * event listeners, timers, etc.\n *\n * @param destructor A function that will be called when the handle's `destroy` method is invoked\n * @return The handle object\n */\nexport function createHandle(destructor) {\n let called = false;\n return {\n destroy: function () {\n if (!called) {\n called = true;\n destructor();\n }\n }\n };\n}\n/**\n * Returns a single handle that can be used to destroy multiple handles simultaneously.\n *\n * @param handles An array of handles with `destroy` methods\n * @return The handle object\n */\nexport function createCompositeHandle(...handles) {\n return createHandle(function () {\n for (let i = 0; i < handles.length; i++) {\n handles[i].destroy();\n }\n });\n}\n//# sourceMappingURL=lang.mjs.map" + "source": "import { assign } from '../shim/object';\nexport { assign } from '../shim/object';\nconst slice = Array.prototype.slice;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Type guard that ensures that the value can be coerced to Object\n * to weed out host objects that do not derive from Object.\n * This function is used to check if we want to deep copy an object or not.\n * Note: In ES6 it is possible to modify an object's Symbol.toStringTag property, which will\n * change the value returned by `toString`. This is a rare edge case that is difficult to handle,\n * so it is not handled here.\n * @param value The value to check\n * @return If the value is coercible into an Object\n */\nfunction shouldDeepCopyObject(value) {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\nfunction copyArray(array, inherited) {\n return array.map(function (item) {\n if (Array.isArray(item)) {\n return copyArray(item, inherited);\n }\n return !shouldDeepCopyObject(item)\n ? item\n : _mixin({\n deep: true,\n inherited: inherited,\n sources: [item],\n target: {}\n });\n });\n}\nfunction _mixin(kwArgs) {\n const deep = kwArgs.deep;\n const inherited = kwArgs.inherited;\n const target = kwArgs.target;\n const copied = kwArgs.copied || [];\n const copiedClone = [...copied];\n for (let i = 0; i < kwArgs.sources.length; i++) {\n const source = kwArgs.sources[i];\n if (source === null || source === undefined) {\n continue;\n }\n for (let key in source) {\n if (inherited || hasOwnProperty.call(source, key)) {\n let value = source[key];\n if (copiedClone.indexOf(value) !== -1) {\n continue;\n }\n if (deep) {\n if (Array.isArray(value)) {\n value = copyArray(value, inherited);\n }\n else if (shouldDeepCopyObject(value)) {\n const targetValue = target[key] || {};\n copied.push(source);\n value = _mixin({\n deep: true,\n inherited: inherited,\n sources: [value],\n target: targetValue,\n copied\n });\n }\n }\n target[key] = value;\n }\n }\n }\n return target;\n}\nexport function create(prototype, ...mixins) {\n if (!mixins.length) {\n throw new RangeError('lang.create requires at least one mixin object.');\n }\n const args = mixins.slice();\n args.unshift(Object.create(prototype));\n return assign.apply(null, args);\n}\nexport function deepAssign(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: false,\n sources: sources,\n target: target\n });\n}\nexport function deepMixin(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Creates a new object using the provided source's prototype as the prototype for the new object, and then\n * deep copies the provided source's values into the new target.\n *\n * @param source The object to duplicate\n * @return The new object\n */\nexport function duplicate(source) {\n const target = Object.create(Object.getPrototypeOf(source));\n return deepMixin(target, source);\n}\n/**\n * Determines whether two values are the same value.\n *\n * @param a First value to compare\n * @param b Second value to compare\n * @return true if the values are the same; false otherwise\n */\nexport function isIdentical(a, b) {\n return (a === b ||\n /* both values are NaN */\n (a !== a && b !== b));\n}\n/**\n * Returns a function that binds a method to the specified object at runtime. This is similar to\n * `Function.prototype.bind`, but instead of a function it takes the name of a method on an object.\n * As a result, the function returned by `lateBind` will always call the function currently assigned to\n * the specified property on the object as of the moment the function it returns is called.\n *\n * @param instance The context object\n * @param method The name of the method on the context object to bind to itself\n * @param suppliedArgs An optional array of values to prepend to the `instance[method]` arguments list\n * @return The bound function\n */\nexport function lateBind(instance, method, ...suppliedArgs) {\n return suppliedArgs.length\n ? function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n // TS7017\n return instance[method].apply(instance, args);\n }\n : function () {\n // TS7017\n return instance[method].apply(instance, arguments);\n };\n}\nexport function mixin(target, ...sources) {\n return _mixin({\n deep: false,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Returns a function which invokes the given function with the given arguments prepended to its argument list.\n * Like `Function.prototype.bind`, but does not alter execution context.\n *\n * @param targetFunction The function that needs to be bound\n * @param suppliedArgs An optional array of arguments to prepend to the `targetFunction` arguments list\n * @return The bound function\n */\nexport function partial(targetFunction, ...suppliedArgs) {\n return function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n return targetFunction.apply(this, args);\n };\n}\n/**\n * Returns an object with a destroy method that, when called, calls the passed-in destructor.\n * This is intended to provide a unified interface for creating \"remove\" / \"destroy\" handlers for\n * event listeners, timers, etc.\n *\n * @param destructor A function that will be called when the handle's `destroy` method is invoked\n * @return The handle object\n */\nexport function createHandle(destructor) {\n let called = false;\n return {\n destroy: function () {\n if (!called) {\n called = true;\n destructor();\n }\n }\n };\n}\n/**\n * Returns a single handle that can be used to destroy multiple handles simultaneously.\n *\n * @param handles An array of handles with `destroy` methods\n * @return The handle object\n */\nexport function createCompositeHandle(...handles) {\n return createHandle(function () {\n for (let i = 0; i < handles.length; i++) {\n handles[i].destroy();\n }\n });\n}\n//# sourceMappingURL=lang.mjs.map" }, { - "id": "./node_modules/@dojo/has/has.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\has\\has.mjs", - "name": "./node_modules/@dojo/has/has.mjs", + "id": "./node_modules/@dojo/framework/has/has.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\has\\has.mjs", + "name": "./node_modules/@dojo/framework/has/has.mjs", "index": 7, "index2": 3, "size": 6500, @@ -284,29 +284,29 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\has.mjs", - "issuerId": "./node_modules/@dojo/shim/support/has.mjs", - "issuerName": "./node_modules/@dojo/shim/support/has.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\has.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/support/has.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/support/has.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\has.mjs", - "module": "./node_modules/@dojo/shim/support/has.mjs", - "moduleName": "./node_modules/@dojo/shim/support/has.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\has.mjs", + "module": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/has.mjs", "type": "harmony import", - "userRequest": "@dojo/has/has", + "userRequest": "../../has/has", "loc": "1:0-41" }, { - "moduleId": "./node_modules/@dojo/shim/support/has.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\has.mjs", - "module": "./node_modules/@dojo/shim/support/has.mjs", - "moduleName": "./node_modules/@dojo/shim/support/has.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\has.mjs", + "module": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/has.mjs", "type": "harmony import", - "userRequest": "@dojo/has/has", + "userRequest": "../../has/has", "loc": "4:0-30" } ], @@ -328,9 +328,9 @@ "source": "function isFeatureTestThenable(value) {\r\n return value && value.then;\r\n}\r\n/**\r\n * A cache of results of feature tests\r\n */\r\nexport const testCache = {};\r\n/**\r\n * A cache of the un-resolved feature tests\r\n */\r\nexport const testFunctions = {};\r\n/**\r\n * A cache of unresolved thenables (probably promises)\r\n * @type {{}}\r\n */\r\nconst testThenables = {};\r\n/**\r\n * A reference to the global scope (`window` in a browser, `global` in NodeJS)\r\n */\r\nconst globalScope = (function () {\r\n /* istanbul ignore else */\r\n if (typeof window !== 'undefined') {\r\n // Browsers\r\n return window;\r\n }\r\n else if (typeof global !== 'undefined') {\r\n // Node\r\n return global;\r\n }\r\n else if (typeof self !== 'undefined') {\r\n // Web workers\r\n return self;\r\n }\r\n /* istanbul ignore next */\r\n return {};\r\n})();\r\n/* Grab the staticFeatures if there are available */\r\nconst { staticFeatures } = globalScope.DojoHasEnvironment || {};\r\n/* Cleaning up the DojoHasEnviornment */\r\nif ('DojoHasEnvironment' in globalScope) {\r\n delete globalScope.DojoHasEnvironment;\r\n}\r\n/**\r\n * Custom type guard to narrow the `staticFeatures` to either a map or a function that\r\n * returns a map.\r\n *\r\n * @param value The value to guard for\r\n */\r\nfunction isStaticFeatureFunction(value) {\r\n return typeof value === 'function';\r\n}\r\n/**\r\n * The cache of asserted features that were available in the global scope when the\r\n * module loaded\r\n */\r\nconst staticCache = staticFeatures\r\n ? isStaticFeatureFunction(staticFeatures) ? staticFeatures.apply(globalScope) : staticFeatures\r\n : {}; /* Providing an empty cache, if none was in the environment\r\n\r\n/**\r\n* AMD plugin function.\r\n*\r\n* Conditional loads modules based on a has feature test value.\r\n*\r\n* @param resourceId Gives the resolved module id to load.\r\n* @param require The loader require function with respect to the module that contained the plugin resource in its\r\n* dependency list.\r\n* @param load Callback to loader that consumes result of plugin demand.\r\n*/\r\nexport function load(resourceId, require, load, config) {\r\n resourceId ? require([resourceId], load) : load();\r\n}\r\n/**\r\n * AMD plugin function.\r\n *\r\n * Resolves resourceId into a module id based on possibly-nested tenary expression that branches on has feature test\r\n * value(s).\r\n *\r\n * @param resourceId The id of the module\r\n * @param normalize Resolves a relative module id into an absolute module id\r\n */\r\nexport function normalize(resourceId, normalize) {\r\n const tokens = resourceId.match(/[\\?:]|[^:\\?]*/g) || [];\r\n let i = 0;\r\n function get(skip) {\r\n const term = tokens[i++];\r\n if (term === ':') {\r\n // empty string module name, resolves to null\r\n return null;\r\n }\r\n else {\r\n // postfixed with a ? means it is a feature to branch on, the term is the name of the feature\r\n if (tokens[i++] === '?') {\r\n if (!skip && has(term)) {\r\n // matched the feature, get the first value from the options\r\n return get();\r\n }\r\n else {\r\n // did not match, get the second value, passing over the first\r\n get(true);\r\n return get(skip);\r\n }\r\n }\r\n // a module\r\n return term;\r\n }\r\n }\r\n const id = get();\r\n return id && normalize(id);\r\n}\r\n/**\r\n * Check if a feature has already been registered\r\n *\r\n * @param feature the name of the feature\r\n */\r\nexport function exists(feature) {\r\n const normalizedFeature = feature.toLowerCase();\r\n return Boolean(normalizedFeature in staticCache || normalizedFeature in testCache || testFunctions[normalizedFeature]);\r\n}\r\n/**\r\n * Register a new test for a named feature.\r\n *\r\n * @example\r\n * has.add('dom-addeventlistener', !!document.addEventListener);\r\n *\r\n * @example\r\n * has.add('touch-events', function () {\r\n * return 'ontouchstart' in document\r\n * });\r\n *\r\n * @param feature the name of the feature\r\n * @param value the value reported of the feature, or a function that will be executed once on first test\r\n * @param overwrite if an existing value should be overwritten. Defaults to false.\r\n */\r\nexport function add(feature, value, overwrite = false) {\r\n const normalizedFeature = feature.toLowerCase();\r\n if (exists(normalizedFeature) && !overwrite && !(normalizedFeature in staticCache)) {\r\n throw new TypeError(`Feature \"${feature}\" exists and overwrite not true.`);\r\n }\r\n if (typeof value === 'function') {\r\n testFunctions[normalizedFeature] = value;\r\n }\r\n else if (isFeatureTestThenable(value)) {\r\n testThenables[feature] = value.then((resolvedValue) => {\r\n testCache[feature] = resolvedValue;\r\n delete testThenables[feature];\r\n }, () => {\r\n delete testThenables[feature];\r\n });\r\n }\r\n else {\r\n testCache[normalizedFeature] = value;\r\n delete testFunctions[normalizedFeature];\r\n }\r\n}\r\n/**\r\n * Return the current value of a named feature.\r\n *\r\n * @param feature The name (if a string) or identifier (if an integer) of the feature to test.\r\n */\r\nexport default function has(feature) {\r\n let result;\r\n const normalizedFeature = feature.toLowerCase();\r\n if (normalizedFeature in staticCache) {\r\n result = staticCache[normalizedFeature];\r\n }\r\n else if (testFunctions[normalizedFeature]) {\r\n result = testCache[normalizedFeature] = testFunctions[normalizedFeature].call(null);\r\n delete testFunctions[normalizedFeature];\r\n }\r\n else if (normalizedFeature in testCache) {\r\n result = testCache[normalizedFeature];\r\n }\r\n else if (feature in testThenables) {\r\n return false;\r\n }\r\n else {\r\n throw new TypeError(`Attempt to detect unregistered has feature \"${feature}\"`);\r\n }\r\n return result;\r\n}\r\n/*\r\n * Out of the box feature tests\r\n */\r\n/* Environments */\r\n/* Used as a value to provide a debug only code path */\r\nadd('debug', true);\r\n/* Detects if the environment is \"browser like\" */\r\nadd('host-browser', typeof document !== 'undefined' && typeof location !== 'undefined');\r\n/* Detects if the environment appears to be NodeJS */\r\nadd('host-node', function () {\r\n if (typeof process === 'object' && process.versions && process.versions.node) {\r\n return process.versions.node;\r\n }\r\n});\r\n//# sourceMappingURL=has.mjs.map" }, { - "id": "./node_modules/@dojo/shim/Map.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "name": "./node_modules/@dojo/shim/Map.mjs", + "id": "./node_modules/@dojo/framework/shim/Map.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "name": "./node_modules/@dojo/framework/shim/Map.mjs", "index": 15, "index2": 12, "size": 3426, @@ -342,57 +342,57 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "1:0-33" + "userRequest": "../shim/Map", + "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\RegistryHandler.mjs", - "module": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\RegistryHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "1:0-37" + "userRequest": "../shim/Map", + "loc": "1:0-34" }, { - "moduleId": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\NodeHandler.mjs", - "module": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "2:0-33" + "userRequest": "../shim/Map", + "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\NodeHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "2:0-33" + "userRequest": "../shim/Map", + "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/core/Evented.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Evented.mjs", - "module": "./node_modules/@dojo/core/Evented.mjs", - "moduleName": "./node_modules/@dojo/core/Evented.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Evented.mjs", + "module": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Evented.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "1:0-33" + "userRequest": "../shim/Map", + "loc": "1:0-30" } ], "usedExports": [ @@ -408,9 +408,9 @@ "source": "import { isArrayLike, ShimIterator } from './iterator';\r\nimport global from './global';\r\nimport { is as objectIs } from './object';\r\nimport has from './support/has';\r\nimport './Symbol';\r\nexport let Map = global.Map;\r\nif (!true) {\r\n Map = (_a = class Map {\r\n constructor(iterable) {\r\n this._keys = [];\r\n this._values = [];\r\n this[Symbol.toStringTag] = 'Map';\r\n if (iterable) {\r\n if (isArrayLike(iterable)) {\r\n for (let i = 0; i < iterable.length; i++) {\r\n const value = iterable[i];\r\n this.set(value[0], value[1]);\r\n }\r\n }\r\n else {\r\n for (const value of iterable) {\r\n this.set(value[0], value[1]);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * An alternative to Array.prototype.indexOf using Object.is\r\n * to check for equality. See http://mzl.la/1zuKO2V\r\n */\r\n _indexOfKey(keys, key) {\r\n for (let i = 0, length = keys.length; i < length; i++) {\r\n if (objectIs(keys[i], key)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n get size() {\r\n return this._keys.length;\r\n }\r\n clear() {\r\n this._keys.length = this._values.length = 0;\r\n }\r\n delete(key) {\r\n const index = this._indexOfKey(this._keys, key);\r\n if (index < 0) {\r\n return false;\r\n }\r\n this._keys.splice(index, 1);\r\n this._values.splice(index, 1);\r\n return true;\r\n }\r\n entries() {\r\n const values = this._keys.map((key, i) => {\r\n return [key, this._values[i]];\r\n });\r\n return new ShimIterator(values);\r\n }\r\n forEach(callback, context) {\r\n const keys = this._keys;\r\n const values = this._values;\r\n for (let i = 0, length = keys.length; i < length; i++) {\r\n callback.call(context, values[i], keys[i], this);\r\n }\r\n }\r\n get(key) {\r\n const index = this._indexOfKey(this._keys, key);\r\n return index < 0 ? undefined : this._values[index];\r\n }\r\n has(key) {\r\n return this._indexOfKey(this._keys, key) > -1;\r\n }\r\n keys() {\r\n return new ShimIterator(this._keys);\r\n }\r\n set(key, value) {\r\n let index = this._indexOfKey(this._keys, key);\r\n index = index < 0 ? this._keys.length : index;\r\n this._keys[index] = key;\r\n this._values[index] = value;\r\n return this;\r\n }\r\n values() {\r\n return new ShimIterator(this._values);\r\n }\r\n [Symbol.iterator]() {\r\n return this.entries();\r\n }\r\n },\r\n _a[Symbol.species] = _a,\r\n _a);\r\n}\r\nexport default Map;\r\nvar _a;\r\n//# sourceMappingURL=Map.mjs.map" }, { - "id": "./node_modules/@dojo/shim/Promise.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Promise.mjs", - "name": "./node_modules/@dojo/shim/Promise.mjs", + "id": "./node_modules/@dojo/framework/shim/Promise.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Promise.mjs", + "name": "./node_modules/@dojo/framework/shim/Promise.mjs", "index": 22, "index2": 15, "size": 8717, @@ -422,30 +422,30 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Registry.mjs", - "issuerId": "./node_modules/@dojo/widget-core/Registry.mjs", - "issuerName": "./node_modules/@dojo/widget-core/Registry.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Registry.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Promise", - "loc": "1:0-41" + "userRequest": "../shim/Promise", + "loc": "1:0-38" }, { - "moduleId": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Destroyable.mjs", - "module": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleName": "./node_modules/@dojo/core/Destroyable.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Destroyable.mjs", + "module": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Destroyable.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Promise", - "loc": "2:0-41" + "userRequest": "../shim/Promise", + "loc": "2:0-38" } ], "usedExports": [ @@ -461,9 +461,9 @@ "source": "import global from './global';\r\nimport { queueMicroTask } from './support/queue';\r\nimport './Symbol';\r\nimport has from './support/has';\r\nexport let ShimPromise = global.Promise;\r\nexport const isThenable = function isThenable(value) {\r\n return value && typeof value.then === 'function';\r\n};\r\nif (!true) {\r\n global.Promise = ShimPromise = (_a = class Promise {\r\n /**\r\n * Creates a new Promise.\r\n *\r\n * @constructor\r\n *\r\n * @param executor\r\n * The executor function is called immediately when the Promise is instantiated. It is responsible for\r\n * starting the asynchronous operation when it is invoked.\r\n *\r\n * The executor must call either the passed `resolve` function when the asynchronous operation has completed\r\n * successfully, or the `reject` function when the operation fails.\r\n */\r\n constructor(executor) {\r\n /**\r\n * The current state of this promise.\r\n */\r\n this.state = 1 /* Pending */;\r\n this[Symbol.toStringTag] = 'Promise';\r\n /**\r\n * If true, the resolution of this promise is chained (\"locked in\") to another promise.\r\n */\r\n let isChained = false;\r\n /**\r\n * Whether or not this promise is in a resolved state.\r\n */\r\n const isResolved = () => {\r\n return this.state !== 1 /* Pending */ || isChained;\r\n };\r\n /**\r\n * Callbacks that should be invoked once the asynchronous operation has completed.\r\n */\r\n let callbacks = [];\r\n /**\r\n * Initially pushes callbacks onto a queue for execution once this promise settles. After the promise settles,\r\n * enqueues callbacks for execution on the next event loop turn.\r\n */\r\n let whenFinished = function (callback) {\r\n if (callbacks) {\r\n callbacks.push(callback);\r\n }\r\n };\r\n /**\r\n * Settles this promise.\r\n *\r\n * @param newState The resolved state for this promise.\r\n * @param {T|any} value The resolved value for this promise.\r\n */\r\n const settle = (newState, value) => {\r\n // A promise can only be settled once.\r\n if (this.state !== 1 /* Pending */) {\r\n return;\r\n }\r\n this.state = newState;\r\n this.resolvedValue = value;\r\n whenFinished = queueMicroTask;\r\n // Only enqueue a callback runner if there are callbacks so that initially fulfilled Promises don't have to\r\n // wait an extra turn.\r\n if (callbacks && callbacks.length > 0) {\r\n queueMicroTask(function () {\r\n if (callbacks) {\r\n let count = callbacks.length;\r\n for (let i = 0; i < count; ++i) {\r\n callbacks[i].call(null);\r\n }\r\n callbacks = null;\r\n }\r\n });\r\n }\r\n };\r\n /**\r\n * Resolves this promise.\r\n *\r\n * @param newState The resolved state for this promise.\r\n * @param {T|any} value The resolved value for this promise.\r\n */\r\n const resolve = (newState, value) => {\r\n if (isResolved()) {\r\n return;\r\n }\r\n if (isThenable(value)) {\r\n value.then(settle.bind(null, 0 /* Fulfilled */), settle.bind(null, 2 /* Rejected */));\r\n isChained = true;\r\n }\r\n else {\r\n settle(newState, value);\r\n }\r\n };\r\n this.then = (onFulfilled, onRejected) => {\r\n return new Promise((resolve, reject) => {\r\n // whenFinished initially queues up callbacks for execution after the promise has settled. Once the\r\n // promise has settled, whenFinished will schedule callbacks for execution on the next turn through the\r\n // event loop.\r\n whenFinished(() => {\r\n const callback = this.state === 2 /* Rejected */ ? onRejected : onFulfilled;\r\n if (typeof callback === 'function') {\r\n try {\r\n resolve(callback(this.resolvedValue));\r\n }\r\n catch (error) {\r\n reject(error);\r\n }\r\n }\r\n else if (this.state === 2 /* Rejected */) {\r\n reject(this.resolvedValue);\r\n }\r\n else {\r\n resolve(this.resolvedValue);\r\n }\r\n });\r\n });\r\n };\r\n try {\r\n executor(resolve.bind(null, 0 /* Fulfilled */), resolve.bind(null, 2 /* Rejected */));\r\n }\r\n catch (error) {\r\n settle(2 /* Rejected */, error);\r\n }\r\n }\r\n static all(iterable) {\r\n return new this(function (resolve, reject) {\r\n const values = [];\r\n let complete = 0;\r\n let total = 0;\r\n let populating = true;\r\n function fulfill(index, value) {\r\n values[index] = value;\r\n ++complete;\r\n finish();\r\n }\r\n function finish() {\r\n if (populating || complete < total) {\r\n return;\r\n }\r\n resolve(values);\r\n }\r\n function processItem(index, item) {\r\n ++total;\r\n if (isThenable(item)) {\r\n // If an item Promise rejects, this Promise is immediately rejected with the item\r\n // Promise's rejection error.\r\n item.then(fulfill.bind(null, index), reject);\r\n }\r\n else {\r\n Promise.resolve(item).then(fulfill.bind(null, index));\r\n }\r\n }\r\n let i = 0;\r\n for (const value of iterable) {\r\n processItem(i, value);\r\n i++;\r\n }\r\n populating = false;\r\n finish();\r\n });\r\n }\r\n static race(iterable) {\r\n return new this(function (resolve, reject) {\r\n for (const item of iterable) {\r\n if (item instanceof Promise) {\r\n // If a Promise item rejects, this Promise is immediately rejected with the item\r\n // Promise's rejection error.\r\n item.then(resolve, reject);\r\n }\r\n else {\r\n Promise.resolve(item).then(resolve);\r\n }\r\n }\r\n });\r\n }\r\n static reject(reason) {\r\n return new this(function (resolve, reject) {\r\n reject(reason);\r\n });\r\n }\r\n static resolve(value) {\r\n return new this(function (resolve) {\r\n resolve(value);\r\n });\r\n }\r\n catch(onRejected) {\r\n return this.then(undefined, onRejected);\r\n }\r\n },\r\n _a[Symbol.species] = ShimPromise,\r\n _a);\r\n}\r\nexport default ShimPromise;\r\nvar _a;\r\n//# sourceMappingURL=Promise.mjs.map" }, { - "id": "./node_modules/@dojo/shim/Symbol.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Symbol.mjs", - "name": "./node_modules/@dojo/shim/Symbol.mjs", + "id": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Symbol.mjs", + "name": "./node_modules/@dojo/framework/shim/Symbol.mjs", "index": 5, "index2": 7, "size": 6073, @@ -475,81 +475,81 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Symbol", - "loc": "3:0-39" - }, - { - "moduleId": "./node_modules/@dojo/widget-core/d.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\d.mjs", - "module": "./node_modules/@dojo/widget-core/d.mjs", - "moduleName": "./node_modules/@dojo/widget-core/d.mjs", - "type": "harmony import", - "userRequest": "@dojo/shim/Symbol", - "loc": "1:0-39" + "userRequest": "../shim/Symbol", + "loc": "3:0-36" }, { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/d.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\d.mjs", + "module": "./node_modules/@dojo/framework/widget-core/d.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/d.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Symbol", - "loc": "3:0-39" + "userRequest": "../shim/Symbol", + "loc": "1:0-36" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "5:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "4:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/iterator.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\iterator.mjs", - "module": "./node_modules/@dojo/shim/iterator.mjs", - "moduleName": "./node_modules/@dojo/shim/iterator.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "type": "harmony import", + "userRequest": "../shim/Symbol", + "loc": "3:0-36" + }, + { + "moduleId": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\iterator.mjs", + "module": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/iterator.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "1:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "3:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/object.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\object.mjs", - "module": "./node_modules/@dojo/shim/object.mjs", - "moduleName": "./node_modules/@dojo/shim/object.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\object.mjs", + "module": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/object.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "3:0-36" @@ -568,9 +568,9 @@ "source": "import has from './support/has';\r\nimport global from './global';\r\nimport { getValueDescriptor } from './support/util';\r\nexport let Symbol = global.Symbol;\r\nif (!true) {\r\n /**\r\n * Throws if the value is not a symbol, used internally within the Shim\r\n * @param {any} value The value to check\r\n * @return {symbol} Returns the symbol or throws\r\n */\r\n const validateSymbol = function validateSymbol(value) {\r\n if (!isSymbol(value)) {\r\n throw new TypeError(value + ' is not a symbol');\r\n }\r\n return value;\r\n };\r\n const defineProperties = Object.defineProperties;\r\n const defineProperty = Object.defineProperty;\r\n const create = Object.create;\r\n const objPrototype = Object.prototype;\r\n const globalSymbols = {};\r\n const getSymbolName = (function () {\r\n const created = create(null);\r\n return function (desc) {\r\n let postfix = 0;\r\n let name;\r\n while (created[String(desc) + (postfix || '')]) {\r\n ++postfix;\r\n }\r\n desc += String(postfix || '');\r\n created[desc] = true;\r\n name = '@@' + desc;\r\n // FIXME: Temporary guard until the duplicate execution when testing can be\r\n // pinned down.\r\n if (!Object.getOwnPropertyDescriptor(objPrototype, name)) {\r\n defineProperty(objPrototype, name, {\r\n set: function (value) {\r\n defineProperty(this, name, getValueDescriptor(value));\r\n }\r\n });\r\n }\r\n return name;\r\n };\r\n })();\r\n const InternalSymbol = function Symbol(description) {\r\n if (this instanceof InternalSymbol) {\r\n throw new TypeError('TypeError: Symbol is not a constructor');\r\n }\r\n return Symbol(description);\r\n };\r\n Symbol = global.Symbol = function Symbol(description) {\r\n if (this instanceof Symbol) {\r\n throw new TypeError('TypeError: Symbol is not a constructor');\r\n }\r\n const sym = Object.create(InternalSymbol.prototype);\r\n description = description === undefined ? '' : String(description);\r\n return defineProperties(sym, {\r\n __description__: getValueDescriptor(description),\r\n __name__: getValueDescriptor(getSymbolName(description))\r\n });\r\n };\r\n /* Decorate the Symbol function with the appropriate properties */\r\n defineProperty(Symbol, 'for', getValueDescriptor(function (key) {\r\n if (globalSymbols[key]) {\r\n return globalSymbols[key];\r\n }\r\n return (globalSymbols[key] = Symbol(String(key)));\r\n }));\r\n defineProperties(Symbol, {\r\n keyFor: getValueDescriptor(function (sym) {\r\n let key;\r\n validateSymbol(sym);\r\n for (key in globalSymbols) {\r\n if (globalSymbols[key] === sym) {\r\n return key;\r\n }\r\n }\r\n }),\r\n hasInstance: getValueDescriptor(Symbol.for('hasInstance'), false, false),\r\n isConcatSpreadable: getValueDescriptor(Symbol.for('isConcatSpreadable'), false, false),\r\n iterator: getValueDescriptor(Symbol.for('iterator'), false, false),\r\n match: getValueDescriptor(Symbol.for('match'), false, false),\r\n observable: getValueDescriptor(Symbol.for('observable'), false, false),\r\n replace: getValueDescriptor(Symbol.for('replace'), false, false),\r\n search: getValueDescriptor(Symbol.for('search'), false, false),\r\n species: getValueDescriptor(Symbol.for('species'), false, false),\r\n split: getValueDescriptor(Symbol.for('split'), false, false),\r\n toPrimitive: getValueDescriptor(Symbol.for('toPrimitive'), false, false),\r\n toStringTag: getValueDescriptor(Symbol.for('toStringTag'), false, false),\r\n unscopables: getValueDescriptor(Symbol.for('unscopables'), false, false)\r\n });\r\n /* Decorate the InternalSymbol object */\r\n defineProperties(InternalSymbol.prototype, {\r\n constructor: getValueDescriptor(Symbol),\r\n toString: getValueDescriptor(function () {\r\n return this.__name__;\r\n }, false, false)\r\n });\r\n /* Decorate the Symbol.prototype */\r\n defineProperties(Symbol.prototype, {\r\n toString: getValueDescriptor(function () {\r\n return 'Symbol (' + validateSymbol(this).__description__ + ')';\r\n }),\r\n valueOf: getValueDescriptor(function () {\r\n return validateSymbol(this);\r\n })\r\n });\r\n defineProperty(Symbol.prototype, Symbol.toPrimitive, getValueDescriptor(function () {\r\n return validateSymbol(this);\r\n }));\r\n defineProperty(Symbol.prototype, Symbol.toStringTag, getValueDescriptor('Symbol', false, false, true));\r\n defineProperty(InternalSymbol.prototype, Symbol.toPrimitive, getValueDescriptor(Symbol.prototype[Symbol.toPrimitive], false, false, true));\r\n defineProperty(InternalSymbol.prototype, Symbol.toStringTag, getValueDescriptor(Symbol.prototype[Symbol.toStringTag], false, false, true));\r\n}\r\n/**\r\n * A custom guard function that determines if an object is a symbol or not\r\n * @param {any} value The value to check to see if it is a symbol or not\r\n * @return {is symbol} Returns true if a symbol or not (and narrows the type guard)\r\n */\r\nexport function isSymbol(value) {\r\n return (value && (typeof value === 'symbol' || value['@@toStringTag'] === 'Symbol')) || false;\r\n}\r\n/**\r\n * Fill any missing well known symbols if the native Symbol is missing them\r\n */\r\n[\r\n 'hasInstance',\r\n 'isConcatSpreadable',\r\n 'iterator',\r\n 'species',\r\n 'replace',\r\n 'search',\r\n 'split',\r\n 'match',\r\n 'toPrimitive',\r\n 'toStringTag',\r\n 'unscopables',\r\n 'observable'\r\n].forEach((wellKnown) => {\r\n if (!Symbol[wellKnown]) {\r\n Object.defineProperty(Symbol, wellKnown, getValueDescriptor(Symbol.for(wellKnown), false, false));\r\n }\r\n});\r\nexport default Symbol;\r\n//# sourceMappingURL=Symbol.mjs.map" }, { - "id": "./node_modules/@dojo/shim/WeakMap.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\WeakMap.mjs", - "name": "./node_modules/@dojo/shim/WeakMap.mjs", + "id": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\WeakMap.mjs", + "name": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "index": 19, "index2": 13, "size": 3858, @@ -582,39 +582,39 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/WeakMap", - "loc": "2:0-41" + "userRequest": "../shim/WeakMap", + "loc": "2:0-38" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\inject.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/WeakMap", - "loc": "5:0-41" + "userRequest": "../../shim/WeakMap", + "loc": "1:0-41" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\inject.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/WeakMap", - "loc": "1:0-41" + "userRequest": "../shim/WeakMap", + "loc": "5:0-38" } ], "usedExports": [ @@ -629,9 +629,9 @@ "source": "import global from './global';\r\nimport { isArrayLike } from './iterator';\r\nimport has from './support/has';\r\nimport './Symbol';\r\nexport let WeakMap = global.WeakMap;\r\nif (!true) {\r\n const DELETED = {};\r\n const getUID = function getUID() {\r\n return Math.floor(Math.random() * 100000000);\r\n };\r\n const generateName = (function () {\r\n let startId = Math.floor(Date.now() % 100000000);\r\n return function generateName() {\r\n return '__wm' + getUID() + (startId++ + '__');\r\n };\r\n })();\r\n WeakMap = class WeakMap {\r\n constructor(iterable) {\r\n this[Symbol.toStringTag] = 'WeakMap';\r\n this._name = generateName();\r\n this._frozenEntries = [];\r\n if (iterable) {\r\n if (isArrayLike(iterable)) {\r\n for (let i = 0; i < iterable.length; i++) {\r\n const item = iterable[i];\r\n this.set(item[0], item[1]);\r\n }\r\n }\r\n else {\r\n for (const [key, value] of iterable) {\r\n this.set(key, value);\r\n }\r\n }\r\n }\r\n }\r\n _getFrozenEntryIndex(key) {\r\n for (let i = 0; i < this._frozenEntries.length; i++) {\r\n if (this._frozenEntries[i].key === key) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n delete(key) {\r\n if (key === undefined || key === null) {\r\n return false;\r\n }\r\n const entry = key[this._name];\r\n if (entry && entry.key === key && entry.value !== DELETED) {\r\n entry.value = DELETED;\r\n return true;\r\n }\r\n const frozenIndex = this._getFrozenEntryIndex(key);\r\n if (frozenIndex >= 0) {\r\n this._frozenEntries.splice(frozenIndex, 1);\r\n return true;\r\n }\r\n return false;\r\n }\r\n get(key) {\r\n if (key === undefined || key === null) {\r\n return undefined;\r\n }\r\n const entry = key[this._name];\r\n if (entry && entry.key === key && entry.value !== DELETED) {\r\n return entry.value;\r\n }\r\n const frozenIndex = this._getFrozenEntryIndex(key);\r\n if (frozenIndex >= 0) {\r\n return this._frozenEntries[frozenIndex].value;\r\n }\r\n }\r\n has(key) {\r\n if (key === undefined || key === null) {\r\n return false;\r\n }\r\n const entry = key[this._name];\r\n if (Boolean(entry && entry.key === key && entry.value !== DELETED)) {\r\n return true;\r\n }\r\n const frozenIndex = this._getFrozenEntryIndex(key);\r\n if (frozenIndex >= 0) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n set(key, value) {\r\n if (!key || (typeof key !== 'object' && typeof key !== 'function')) {\r\n throw new TypeError('Invalid value used as weak map key');\r\n }\r\n let entry = key[this._name];\r\n if (!entry || entry.key !== key) {\r\n entry = Object.create(null, {\r\n key: { value: key }\r\n });\r\n if (Object.isFrozen(key)) {\r\n this._frozenEntries.push(entry);\r\n }\r\n else {\r\n Object.defineProperty(key, this._name, {\r\n value: entry\r\n });\r\n }\r\n }\r\n entry.value = value;\r\n return this;\r\n }\r\n };\r\n}\r\nexport default WeakMap;\r\n//# sourceMappingURL=WeakMap.mjs.map" }, { - "id": "./node_modules/@dojo/shim/array.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "name": "./node_modules/@dojo/shim/array.mjs", + "id": "./node_modules/@dojo/framework/shim/array.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "name": "./node_modules/@dojo/framework/shim/array.mjs", "index": 30, "index2": 24, "size": 9175, @@ -643,30 +643,30 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/array", - "loc": "4:0-40" + "userRequest": "../shim/array", + "loc": "4:0-37" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/array", - "loc": "2:0-53" + "userRequest": "../shim/array", + "loc": "2:0-50" } ], "usedExports": [ @@ -686,9 +686,9 @@ "source": "import global from './global';\r\nimport { isArrayLike, isIterable } from './iterator';\r\nimport { MAX_SAFE_INTEGER } from './number';\r\nimport has from './support/has';\r\nimport { wrapNative } from './support/util';\r\nexport let from;\r\n/**\r\n * Creates a new array from the function parameters.\r\n *\r\n * @param arguments Any number of arguments for the array\r\n * @return An array from the given arguments\r\n */\r\nexport let of;\r\n/* ES6 Array instance methods */\r\n/**\r\n * Copies data internally within an array or array-like object.\r\n *\r\n * @param target The target array-like object\r\n * @param offset The index to start copying values to; if negative, it counts backwards from length\r\n * @param start The first (inclusive) index to copy; if negative, it counts backwards from length\r\n * @param end The last (exclusive) index to copy; if negative, it counts backwards from length\r\n * @return The target\r\n */\r\nexport let copyWithin;\r\n/**\r\n * Fills elements of an array-like object with the specified value.\r\n *\r\n * @param target The target to fill\r\n * @param value The value to fill each element of the target with\r\n * @param start The first index to fill\r\n * @param end The (exclusive) index at which to stop filling\r\n * @return The filled target\r\n */\r\nexport let fill;\r\n/**\r\n * Finds and returns the first instance matching the callback or undefined if one is not found.\r\n *\r\n * @param target An array-like object\r\n * @param callback A function returning if the current value matches a criteria\r\n * @param thisArg The execution context for the find function\r\n * @return The first element matching the callback, or undefined if one does not exist\r\n */\r\nexport let find;\r\n/**\r\n * Performs a linear search and returns the first index whose value satisfies the passed callback,\r\n * or -1 if no values satisfy it.\r\n *\r\n * @param target An array-like object\r\n * @param callback A function returning true if the current value satisfies its criteria\r\n * @param thisArg The execution context for the find function\r\n * @return The first index whose value satisfies the passed callback, or -1 if no values satisfy it\r\n */\r\nexport let findIndex;\r\n/* ES7 Array instance methods */\r\n/**\r\n * Determines whether an array includes a given value\r\n *\r\n * @param target the target array-like object\r\n * @param searchElement the item to search for\r\n * @param fromIndex the starting index to search from\r\n * @return `true` if the array includes the element, otherwise `false`\r\n */\r\nexport let includes;\r\nif (true && true) {\r\n from = global.Array.from;\r\n of = global.Array.of;\r\n copyWithin = wrapNative(global.Array.prototype.copyWithin);\r\n fill = wrapNative(global.Array.prototype.fill);\r\n find = wrapNative(global.Array.prototype.find);\r\n findIndex = wrapNative(global.Array.prototype.findIndex);\r\n}\r\nelse {\r\n // It is only older versions of Safari/iOS that have a bad fill implementation and so aren't in the wild\r\n // To make things easier, if there is a bad fill implementation, the whole set of functions will be filled\r\n /**\r\n * Ensures a non-negative, non-infinite, safe integer.\r\n *\r\n * @param length The number to validate\r\n * @return A proper length\r\n */\r\n const toLength = function toLength(length) {\r\n if (isNaN(length)) {\r\n return 0;\r\n }\r\n length = Number(length);\r\n if (isFinite(length)) {\r\n length = Math.floor(length);\r\n }\r\n // Ensure a non-negative, real, safe integer\r\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\r\n };\r\n /**\r\n * From ES6 7.1.4 ToInteger()\r\n *\r\n * @param value A value to convert\r\n * @return An integer\r\n */\r\n const toInteger = function toInteger(value) {\r\n value = Number(value);\r\n if (isNaN(value)) {\r\n return 0;\r\n }\r\n if (value === 0 || !isFinite(value)) {\r\n return value;\r\n }\r\n return (value > 0 ? 1 : -1) * Math.floor(Math.abs(value));\r\n };\r\n /**\r\n * Normalizes an offset against a given length, wrapping it if negative.\r\n *\r\n * @param value The original offset\r\n * @param length The total length to normalize against\r\n * @return If negative, provide a distance from the end (length); otherwise provide a distance from 0\r\n */\r\n const normalizeOffset = function normalizeOffset(value, length) {\r\n return value < 0 ? Math.max(length + value, 0) : Math.min(value, length);\r\n };\r\n from = function from(arrayLike, mapFunction, thisArg) {\r\n if (arrayLike == null) {\r\n throw new TypeError('from: requires an array-like object');\r\n }\r\n if (mapFunction && thisArg) {\r\n mapFunction = mapFunction.bind(thisArg);\r\n }\r\n /* tslint:disable-next-line:variable-name */\r\n const Constructor = this;\r\n const length = toLength(arrayLike.length);\r\n // Support extension\r\n const array = typeof Constructor === 'function' ? Object(new Constructor(length)) : new Array(length);\r\n if (!isArrayLike(arrayLike) && !isIterable(arrayLike)) {\r\n return array;\r\n }\r\n // if this is an array and the normalized length is 0, just return an empty array. this prevents a problem\r\n // with the iteration on IE when using a NaN array length.\r\n if (isArrayLike(arrayLike)) {\r\n if (length === 0) {\r\n return [];\r\n }\r\n for (let i = 0; i < arrayLike.length; i++) {\r\n array[i] = mapFunction ? mapFunction(arrayLike[i], i) : arrayLike[i];\r\n }\r\n }\r\n else {\r\n let i = 0;\r\n for (const value of arrayLike) {\r\n array[i] = mapFunction ? mapFunction(value, i) : value;\r\n i++;\r\n }\r\n }\r\n if (arrayLike.length !== undefined) {\r\n array.length = length;\r\n }\r\n return array;\r\n };\r\n of = function of(...items) {\r\n return Array.prototype.slice.call(items);\r\n };\r\n copyWithin = function copyWithin(target, offset, start, end) {\r\n if (target == null) {\r\n throw new TypeError('copyWithin: target must be an array-like object');\r\n }\r\n const length = toLength(target.length);\r\n offset = normalizeOffset(toInteger(offset), length);\r\n start = normalizeOffset(toInteger(start), length);\r\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\r\n let count = Math.min(end - start, length - offset);\r\n let direction = 1;\r\n if (offset > start && offset < start + count) {\r\n direction = -1;\r\n start += count - 1;\r\n offset += count - 1;\r\n }\r\n while (count > 0) {\r\n if (start in target) {\r\n target[offset] = target[start];\r\n }\r\n else {\r\n delete target[offset];\r\n }\r\n offset += direction;\r\n start += direction;\r\n count--;\r\n }\r\n return target;\r\n };\r\n fill = function fill(target, value, start, end) {\r\n const length = toLength(target.length);\r\n let i = normalizeOffset(toInteger(start), length);\r\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\r\n while (i < end) {\r\n target[i++] = value;\r\n }\r\n return target;\r\n };\r\n find = function find(target, callback, thisArg) {\r\n const index = findIndex(target, callback, thisArg);\r\n return index !== -1 ? target[index] : undefined;\r\n };\r\n findIndex = function findIndex(target, callback, thisArg) {\r\n const length = toLength(target.length);\r\n if (!callback) {\r\n throw new TypeError('find: second argument must be a function');\r\n }\r\n if (thisArg) {\r\n callback = callback.bind(thisArg);\r\n }\r\n for (let i = 0; i < length; i++) {\r\n if (callback(target[i], i, target)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n };\r\n}\r\nif (true) {\r\n includes = wrapNative(global.Array.prototype.includes);\r\n}\r\nelse {\r\n /**\r\n * Ensures a non-negative, non-infinite, safe integer.\r\n *\r\n * @param length The number to validate\r\n * @return A proper length\r\n */\r\n const toLength = function toLength(length) {\r\n length = Number(length);\r\n if (isNaN(length)) {\r\n return 0;\r\n }\r\n if (isFinite(length)) {\r\n length = Math.floor(length);\r\n }\r\n // Ensure a non-negative, real, safe integer\r\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\r\n };\r\n includes = function includes(target, searchElement, fromIndex = 0) {\r\n let len = toLength(target.length);\r\n for (let i = fromIndex; i < len; ++i) {\r\n const currentElement = target[i];\r\n if (searchElement === currentElement ||\r\n (searchElement !== searchElement && currentElement !== currentElement)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n}\r\n//# sourceMappingURL=array.mjs.map" }, { - "id": "./node_modules/@dojo/shim/global.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\global.mjs", - "name": "./node_modules/@dojo/shim/global.mjs", + "id": "./node_modules/@dojo/framework/shim/global.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\global.mjs", + "name": "./node_modules/@dojo/framework/shim/global.mjs", "index": 10, "index2": 4, "size": 581, @@ -700,117 +700,117 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/global", - "loc": "6:0-39" - }, - { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", - "type": "harmony import", - "userRequest": "@dojo/shim/global", - "loc": "1:0-39" + "userRequest": "../shim/global", + "loc": "6:0-36" }, { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./global", "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Symbol.mjs", - "module": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleName": "./node_modules/@dojo/shim/Symbol.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Symbol.mjs", + "module": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Symbol.mjs", "type": "harmony import", "userRequest": "./global", "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/number.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\number.mjs", - "module": "./node_modules/@dojo/shim/number.mjs", - "moduleName": "./node_modules/@dojo/shim/number.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/number.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\number.mjs", + "module": "./node_modules/@dojo/framework/shim/number.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/number.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/support/has.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\has.mjs", - "module": "./node_modules/@dojo/shim/support/has.mjs", - "moduleName": "./node_modules/@dojo/shim/support/has.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "type": "harmony import", + "userRequest": "../shim/global", + "loc": "1:0-36" + }, + { + "moduleId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\has.mjs", + "module": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/has.mjs", "type": "harmony import", "userRequest": "../global", "loc": "2:0-31" }, { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/object.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\object.mjs", - "module": "./node_modules/@dojo/shim/object.mjs", - "moduleName": "./node_modules/@dojo/shim/object.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\object.mjs", + "module": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/object.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/string.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\string.mjs", - "module": "./node_modules/@dojo/shim/string.mjs", - "moduleName": "./node_modules/@dojo/shim/string.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\string.mjs", + "module": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/string.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\queue.mjs", - "module": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleName": "./node_modules/@dojo/shim/support/queue.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\queue.mjs", + "module": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/queue.mjs", "type": "harmony import", "userRequest": "../global", "loc": "1:0-31" @@ -827,9 +827,9 @@ "source": "const globalObject = (function () {\n if (typeof global !== 'undefined') {\n // global spec defines a reference to the global object called 'global'\n // https://github.com/tc39/proposal-global\n // `global` is also defined in NodeJS\n return global;\n }\n else if (typeof window !== 'undefined') {\n // window is defined in browsers\n return window;\n }\n else if (typeof self !== 'undefined') {\n // self is defined in WebWorkers\n return self;\n }\n})();\nexport default globalObject;\n//# sourceMappingURL=global.mjs.map" }, { - "id": "./node_modules/@dojo/shim/iterator.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\iterator.mjs", - "name": "./node_modules/@dojo/shim/iterator.mjs", + "id": "./node_modules/@dojo/framework/shim/iterator.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\iterator.mjs", + "name": "./node_modules/@dojo/framework/shim/iterator.mjs", "index": 16, "index2": 10, "size": 3158, @@ -841,36 +841,36 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./iterator", "loc": "2:0-53" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./iterator", "loc": "1:0-55" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./iterator", "loc": "2:0-41" @@ -889,9 +889,9 @@ "source": "import './Symbol';\nimport { HIGH_SURROGATE_MAX, HIGH_SURROGATE_MIN } from './string';\nconst staticDone = { done: true, value: undefined };\n/**\n * A class that _shims_ an iterator interface on array like objects.\n */\nexport class ShimIterator {\n constructor(list) {\n this._nextIndex = -1;\n if (isIterable(list)) {\n this._nativeIterator = list[Symbol.iterator]();\n }\n else {\n this._list = list;\n }\n }\n /**\n * Return the next iteration result for the Iterator\n */\n next() {\n if (this._nativeIterator) {\n return this._nativeIterator.next();\n }\n if (!this._list) {\n return staticDone;\n }\n if (++this._nextIndex < this._list.length) {\n return {\n done: false,\n value: this._list[this._nextIndex]\n };\n }\n return staticDone;\n }\n [Symbol.iterator]() {\n return this;\n }\n}\n/**\n * A type guard for checking if something has an Iterable interface\n *\n * @param value The value to type guard against\n */\nexport function isIterable(value) {\n return value && typeof value[Symbol.iterator] === 'function';\n}\n/**\n * A type guard for checking if something is ArrayLike\n *\n * @param value The value to type guard against\n */\nexport function isArrayLike(value) {\n return value && typeof value.length === 'number';\n}\n/**\n * Returns the iterator for an object\n *\n * @param iterable The iterable object to return the iterator for\n */\nexport function get(iterable) {\n if (isIterable(iterable)) {\n return iterable[Symbol.iterator]();\n }\n else if (isArrayLike(iterable)) {\n return new ShimIterator(iterable);\n }\n}\n/**\n * Shims the functionality of `for ... of` blocks\n *\n * @param iterable The object the provides an interator interface\n * @param callback The callback which will be called for each item of the iterable\n * @param thisArg Optional scope to pass the callback\n */\nexport function forOf(iterable, callback, thisArg) {\n let broken = false;\n function doBreak() {\n broken = true;\n }\n /* We need to handle iteration of double byte strings properly */\n if (isArrayLike(iterable) && typeof iterable === 'string') {\n const l = iterable.length;\n for (let i = 0; i < l; ++i) {\n let char = iterable[i];\n if (i + 1 < l) {\n const code = char.charCodeAt(0);\n if (code >= HIGH_SURROGATE_MIN && code <= HIGH_SURROGATE_MAX) {\n char += iterable[++i];\n }\n }\n callback.call(thisArg, char, iterable, doBreak);\n if (broken) {\n return;\n }\n }\n }\n else {\n const iterator = get(iterable);\n if (iterator) {\n let result = iterator.next();\n while (!result.done) {\n callback.call(thisArg, result.value, iterable, doBreak);\n if (broken) {\n return;\n }\n result = iterator.next();\n }\n }\n }\n}\n//# sourceMappingURL=iterator.mjs.map" }, { - "id": "./node_modules/@dojo/shim/number.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\number.mjs", - "name": "./node_modules/@dojo/shim/number.mjs", + "id": "./node_modules/@dojo/framework/shim/number.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\number.mjs", + "name": "./node_modules/@dojo/framework/shim/number.mjs", "index": 31, "index2": 23, "size": 1724, @@ -903,18 +903,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./number", "loc": "3:0-44" @@ -935,9 +935,9 @@ "source": "import global from './global';\n/**\n * The smallest interval between two representable numbers.\n */\nexport const EPSILON = 1;\n/**\n * The maximum safe integer in JavaScript\n */\nexport const MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n/**\n * The minimum safe integer in JavaScript\n */\nexport const MIN_SAFE_INTEGER = -MAX_SAFE_INTEGER;\n/**\n * Determines whether the passed value is NaN without coersion.\n *\n * @param value The value to test\n * @return true if the value is NaN, false if it is not\n */\nexport function isNaN(value) {\n return typeof value === 'number' && global.isNaN(value);\n}\n/**\n * Determines whether the passed value is a finite number without coersion.\n *\n * @param value The value to test\n * @return true if the value is finite, false if it is not\n */\nexport function isFinite(value) {\n return typeof value === 'number' && global.isFinite(value);\n}\n/**\n * Determines whether the passed value is an integer.\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isInteger(value) {\n return isFinite(value) && Math.floor(value) === value;\n}\n/**\n * Determines whether the passed value is an integer that is 'safe,' meaning:\n * 1. it can be expressed as an IEEE-754 double precision number\n * 2. it has a one-to-one mapping to a mathematical integer, meaning its\n * IEEE-754 representation cannot be the result of rounding any other\n * integer to fit the IEEE-754 representation\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isSafeInteger(value) {\n return isInteger(value) && Math.abs(value) <= MAX_SAFE_INTEGER;\n}\n//# sourceMappingURL=number.mjs.map" }, { - "id": "./node_modules/@dojo/shim/object.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\object.mjs", - "name": "./node_modules/@dojo/shim/object.mjs", + "id": "./node_modules/@dojo/framework/shim/object.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\object.mjs", + "name": "./node_modules/@dojo/framework/shim/object.mjs", "index": 18, "index2": 11, "size": 4171, @@ -949,39 +949,39 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "issuerId": "./node_modules/@dojo/shim/Map.mjs", - "issuerName": "./node_modules/@dojo/shim/Map.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/Map.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/Map.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./object", "loc": "3:0-42" }, { - "moduleId": "./node_modules/@dojo/core/lang.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\lang.mjs", - "module": "./node_modules/@dojo/core/lang.mjs", - "moduleName": "./node_modules/@dojo/core/lang.mjs", + "moduleId": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\lang.mjs", + "module": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleName": "./node_modules/@dojo/framework/core/lang.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/object", - "loc": "1:0-43" + "userRequest": "../shim/object", + "loc": "1:0-40" }, { - "moduleId": "./node_modules/@dojo/core/lang.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\lang.mjs", - "module": "./node_modules/@dojo/core/lang.mjs", - "moduleName": "./node_modules/@dojo/core/lang.mjs", + "moduleId": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\lang.mjs", + "module": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleName": "./node_modules/@dojo/framework/core/lang.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/object", - "loc": "2:0-43" + "userRequest": "../shim/object", + "loc": "2:0-40" } ], "usedExports": [ @@ -1003,9 +1003,9 @@ "source": "import global from './global';\r\nimport has from './support/has';\r\nimport { isSymbol } from './Symbol';\r\nexport let assign;\r\n/**\r\n * Gets the own property descriptor of the specified object.\r\n * An own property descriptor is one that is defined directly on the object and is not\r\n * inherited from the object's prototype.\r\n * @param o Object that contains the property.\r\n * @param p Name of the property.\r\n */\r\nexport let getOwnPropertyDescriptor;\r\n/**\r\n * Returns the names of the own properties of an object. The own properties of an object are those that are defined directly\r\n * on that object, and are not inherited from the object's prototype. The properties of an object include both fields (objects) and functions.\r\n * @param o Object that contains the own properties.\r\n */\r\nexport let getOwnPropertyNames;\r\n/**\r\n * Returns an array of all symbol properties found directly on object o.\r\n * @param o Object to retrieve the symbols from.\r\n */\r\nexport let getOwnPropertySymbols;\r\n/**\r\n * Returns true if the values are the same value, false otherwise.\r\n * @param value1 The first value.\r\n * @param value2 The second value.\r\n */\r\nexport let is;\r\n/**\r\n * Returns the names of the enumerable properties and methods of an object.\r\n * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.\r\n */\r\nexport let keys;\r\n/* ES7 Object static methods */\r\nexport let getOwnPropertyDescriptors;\r\nexport let entries;\r\nexport let values;\r\nif (true) {\r\n const globalObject = global.Object;\r\n assign = globalObject.assign;\r\n getOwnPropertyDescriptor = globalObject.getOwnPropertyDescriptor;\r\n getOwnPropertyNames = globalObject.getOwnPropertyNames;\r\n getOwnPropertySymbols = globalObject.getOwnPropertySymbols;\r\n is = globalObject.is;\r\n keys = globalObject.keys;\r\n}\r\nelse {\r\n keys = function symbolAwareKeys(o) {\r\n return Object.keys(o).filter((key) => !Boolean(key.match(/^@@.+/)));\r\n };\r\n assign = function assign(target, ...sources) {\r\n if (target == null) {\r\n // TypeError if undefined or null\r\n throw new TypeError('Cannot convert undefined or null to object');\r\n }\r\n const to = Object(target);\r\n sources.forEach((nextSource) => {\r\n if (nextSource) {\r\n // Skip over if undefined or null\r\n keys(nextSource).forEach((nextKey) => {\r\n to[nextKey] = nextSource[nextKey];\r\n });\r\n }\r\n });\r\n return to;\r\n };\r\n getOwnPropertyDescriptor = function getOwnPropertyDescriptor(o, prop) {\r\n if (isSymbol(prop)) {\r\n return Object.getOwnPropertyDescriptor(o, prop);\r\n }\r\n else {\r\n return Object.getOwnPropertyDescriptor(o, prop);\r\n }\r\n };\r\n getOwnPropertyNames = function getOwnPropertyNames(o) {\r\n return Object.getOwnPropertyNames(o).filter((key) => !Boolean(key.match(/^@@.+/)));\r\n };\r\n getOwnPropertySymbols = function getOwnPropertySymbols(o) {\r\n return Object.getOwnPropertyNames(o)\r\n .filter((key) => Boolean(key.match(/^@@.+/)))\r\n .map((key) => Symbol.for(key.substring(2)));\r\n };\r\n is = function is(value1, value2) {\r\n if (value1 === value2) {\r\n return value1 !== 0 || 1 / value1 === 1 / value2; // -0\r\n }\r\n return value1 !== value1 && value2 !== value2; // NaN\r\n };\r\n}\r\nif (true) {\r\n const globalObject = global.Object;\r\n getOwnPropertyDescriptors = globalObject.getOwnPropertyDescriptors;\r\n entries = globalObject.entries;\r\n values = globalObject.values;\r\n}\r\nelse {\r\n getOwnPropertyDescriptors = function getOwnPropertyDescriptors(o) {\r\n return getOwnPropertyNames(o).reduce((previous, key) => {\r\n previous[key] = getOwnPropertyDescriptor(o, key);\r\n return previous;\r\n }, {});\r\n };\r\n entries = function entries(o) {\r\n return keys(o).map((key) => [key, o[key]]);\r\n };\r\n values = function values(o) {\r\n return keys(o).map((key) => o[key]);\r\n };\r\n}\r\n//# sourceMappingURL=object.mjs.map" }, { - "id": "./node_modules/@dojo/shim/string.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\string.mjs", - "name": "./node_modules/@dojo/shim/string.mjs", + "id": "./node_modules/@dojo/framework/shim/string.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\string.mjs", + "name": "./node_modules/@dojo/framework/shim/string.mjs", "index": 17, "index2": 9, "size": 12714, @@ -1017,18 +1017,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\iterator.mjs", - "issuerId": "./node_modules/@dojo/shim/iterator.mjs", - "issuerName": "./node_modules/@dojo/shim/iterator.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\iterator.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/iterator.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/iterator.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/iterator.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\iterator.mjs", - "module": "./node_modules/@dojo/shim/iterator.mjs", - "moduleName": "./node_modules/@dojo/shim/iterator.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\iterator.mjs", + "module": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/iterator.mjs", "type": "harmony import", "userRequest": "./string", "loc": "2:0-66" @@ -1059,9 +1059,9 @@ "source": "import global from './global';\r\nimport has from './support/has';\r\nimport { wrapNative } from './support/util';\r\n/**\r\n * The minimum location of high surrogates\r\n */\r\nexport const HIGH_SURROGATE_MIN = 0xd800;\r\n/**\r\n * The maximum location of high surrogates\r\n */\r\nexport const HIGH_SURROGATE_MAX = 0xdbff;\r\n/**\r\n * The minimum location of low surrogates\r\n */\r\nexport const LOW_SURROGATE_MIN = 0xdc00;\r\n/**\r\n * The maximum location of low surrogates\r\n */\r\nexport const LOW_SURROGATE_MAX = 0xdfff;\r\n/* ES6 static methods */\r\n/**\r\n * Return the String value whose elements are, in order, the elements in the List elements.\r\n * If length is 0, the empty string is returned.\r\n * @param codePoints The code points to generate the string\r\n */\r\nexport let fromCodePoint;\r\n/**\r\n * `raw` is intended for use as a tag function of a Tagged Template String. When called\r\n * as such the first argument will be a well formed template call site object and the rest\r\n * parameter will contain the substitution values.\r\n * @param template A well-formed template string call site representation.\r\n * @param substitutions A set of substitution values.\r\n */\r\nexport let raw;\r\n/* ES6 instance methods */\r\n/**\r\n * Returns a nonnegative integer Number less than 1114112 (0x110000) that is the code point\r\n * value of the UTF-16 encoded code point starting at the string element at position pos in\r\n * the String resulting from converting this object to a String.\r\n * If there is no element at that position, the result is undefined.\r\n * If a valid UTF-16 surrogate pair does not begin at pos, the result is the code unit at pos.\r\n */\r\nexport let codePointAt;\r\n/**\r\n * Returns true if the sequence of elements of searchString converted to a String is the\r\n * same as the corresponding elements of this object (converted to a String) starting at\r\n * endPosition – length(this). Otherwise returns false.\r\n */\r\nexport let endsWith;\r\n/**\r\n * Returns true if searchString appears as a substring of the result of converting this\r\n * object to a String, at one or more positions that are\r\n * greater than or equal to position; otherwise, returns false.\r\n * @param target The target string\r\n * @param searchString search string\r\n * @param position If position is undefined, 0 is assumed, so as to search all of the String.\r\n */\r\nexport let includes;\r\n/**\r\n * Returns the String value result of normalizing the string into the normalization form\r\n * named by form as specified in Unicode Standard Annex #15, Unicode Normalization Forms.\r\n * @param target The target string\r\n * @param form Applicable values: \"NFC\", \"NFD\", \"NFKC\", or \"NFKD\", If not specified default\r\n * is \"NFC\"\r\n */\r\nexport let normalize;\r\n/**\r\n * Returns a String value that is made from count copies appended together. If count is 0,\r\n * T is the empty String is returned.\r\n * @param count number of copies to append\r\n */\r\nexport let repeat;\r\n/**\r\n * Returns true if the sequence of elements of searchString converted to a String is the\r\n * same as the corresponding elements of this object (converted to a String) starting at\r\n * position. Otherwise returns false.\r\n */\r\nexport let startsWith;\r\n/* ES7 instance methods */\r\n/**\r\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\r\n * The padding is applied from the end (right) of the current string.\r\n *\r\n * @param target The target string\r\n * @param maxLength The length of the resulting string once the current string has been padded.\r\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\r\n *\r\n * @param fillString The string to pad the current string with.\r\n * If this string is too long, it will be truncated and the left-most part will be applied.\r\n * The default value for this parameter is \" \" (U+0020).\r\n */\r\nexport let padEnd;\r\n/**\r\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\r\n * The padding is applied from the start (left) of the current string.\r\n *\r\n * @param target The target string\r\n * @param maxLength The length of the resulting string once the current string has been padded.\r\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\r\n *\r\n * @param fillString The string to pad the current string with.\r\n * If this string is too long, it will be truncated and the left-most part will be applied.\r\n * The default value for this parameter is \" \" (U+0020).\r\n */\r\nexport let padStart;\r\nif (true && true) {\r\n fromCodePoint = global.String.fromCodePoint;\r\n raw = global.String.raw;\r\n codePointAt = wrapNative(global.String.prototype.codePointAt);\r\n endsWith = wrapNative(global.String.prototype.endsWith);\r\n includes = wrapNative(global.String.prototype.includes);\r\n normalize = wrapNative(global.String.prototype.normalize);\r\n repeat = wrapNative(global.String.prototype.repeat);\r\n startsWith = wrapNative(global.String.prototype.startsWith);\r\n}\r\nelse {\r\n /**\r\n * Validates that text is defined, and normalizes position (based on the given default if the input is NaN).\r\n * Used by startsWith, includes, and endsWith.\r\n *\r\n * @return Normalized position.\r\n */\r\n const normalizeSubstringArgs = function (name, text, search, position, isEnd = false) {\r\n if (text == null) {\r\n throw new TypeError('string.' + name + ' requires a valid string to search against.');\r\n }\r\n const length = text.length;\r\n position = position !== position ? (isEnd ? length : 0) : position;\r\n return [text, String(search), Math.min(Math.max(position, 0), length)];\r\n };\r\n fromCodePoint = function fromCodePoint(...codePoints) {\r\n // Adapted from https://github.com/mathiasbynens/String.fromCodePoint\r\n const length = arguments.length;\r\n if (!length) {\r\n return '';\r\n }\r\n const fromCharCode = String.fromCharCode;\r\n const MAX_SIZE = 0x4000;\r\n let codeUnits = [];\r\n let index = -1;\r\n let result = '';\r\n while (++index < length) {\r\n let codePoint = Number(arguments[index]);\r\n // Code points must be finite integers within the valid range\r\n let isValid = isFinite(codePoint) && Math.floor(codePoint) === codePoint && codePoint >= 0 && codePoint <= 0x10ffff;\r\n if (!isValid) {\r\n throw RangeError('string.fromCodePoint: Invalid code point ' + codePoint);\r\n }\r\n if (codePoint <= 0xffff) {\r\n // BMP code point\r\n codeUnits.push(codePoint);\r\n }\r\n else {\r\n // Astral code point; split in surrogate halves\r\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\r\n codePoint -= 0x10000;\r\n let highSurrogate = (codePoint >> 10) + HIGH_SURROGATE_MIN;\r\n let lowSurrogate = codePoint % 0x400 + LOW_SURROGATE_MIN;\r\n codeUnits.push(highSurrogate, lowSurrogate);\r\n }\r\n if (index + 1 === length || codeUnits.length > MAX_SIZE) {\r\n result += fromCharCode.apply(null, codeUnits);\r\n codeUnits.length = 0;\r\n }\r\n }\r\n return result;\r\n };\r\n raw = function raw(callSite, ...substitutions) {\r\n let rawStrings = callSite.raw;\r\n let result = '';\r\n let numSubstitutions = substitutions.length;\r\n if (callSite == null || callSite.raw == null) {\r\n throw new TypeError('string.raw requires a valid callSite object with a raw value');\r\n }\r\n for (let i = 0, length = rawStrings.length; i < length; i++) {\r\n result += rawStrings[i] + (i < numSubstitutions && i < length - 1 ? substitutions[i] : '');\r\n }\r\n return result;\r\n };\r\n codePointAt = function codePointAt(text, position = 0) {\r\n // Adapted from https://github.com/mathiasbynens/String.prototype.codePointAt\r\n if (text == null) {\r\n throw new TypeError('string.codePointAt requries a valid string.');\r\n }\r\n const length = text.length;\r\n if (position !== position) {\r\n position = 0;\r\n }\r\n if (position < 0 || position >= length) {\r\n return undefined;\r\n }\r\n // Get the first code unit\r\n const first = text.charCodeAt(position);\r\n if (first >= HIGH_SURROGATE_MIN && first <= HIGH_SURROGATE_MAX && length > position + 1) {\r\n // Start of a surrogate pair (high surrogate and there is a next code unit); check for low surrogate\r\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\r\n const second = text.charCodeAt(position + 1);\r\n if (second >= LOW_SURROGATE_MIN && second <= LOW_SURROGATE_MAX) {\r\n return (first - HIGH_SURROGATE_MIN) * 0x400 + second - LOW_SURROGATE_MIN + 0x10000;\r\n }\r\n }\r\n return first;\r\n };\r\n endsWith = function endsWith(text, search, endPosition) {\r\n if (endPosition == null) {\r\n endPosition = text.length;\r\n }\r\n [text, search, endPosition] = normalizeSubstringArgs('endsWith', text, search, endPosition, true);\r\n const start = endPosition - search.length;\r\n if (start < 0) {\r\n return false;\r\n }\r\n return text.slice(start, endPosition) === search;\r\n };\r\n includes = function includes(text, search, position = 0) {\r\n [text, search, position] = normalizeSubstringArgs('includes', text, search, position);\r\n return text.indexOf(search, position) !== -1;\r\n };\r\n repeat = function repeat(text, count = 0) {\r\n // Adapted from https://github.com/mathiasbynens/String.prototype.repeat\r\n if (text == null) {\r\n throw new TypeError('string.repeat requires a valid string.');\r\n }\r\n if (count !== count) {\r\n count = 0;\r\n }\r\n if (count < 0 || count === Infinity) {\r\n throw new RangeError('string.repeat requires a non-negative finite count.');\r\n }\r\n let result = '';\r\n while (count) {\r\n if (count % 2) {\r\n result += text;\r\n }\r\n if (count > 1) {\r\n text += text;\r\n }\r\n count >>= 1;\r\n }\r\n return result;\r\n };\r\n startsWith = function startsWith(text, search, position = 0) {\r\n search = String(search);\r\n [text, search, position] = normalizeSubstringArgs('startsWith', text, search, position);\r\n const end = position + search.length;\r\n if (end > text.length) {\r\n return false;\r\n }\r\n return text.slice(position, end) === search;\r\n };\r\n}\r\nif (true) {\r\n padEnd = wrapNative(global.String.prototype.padEnd);\r\n padStart = wrapNative(global.String.prototype.padStart);\r\n}\r\nelse {\r\n padEnd = function padEnd(text, maxLength, fillString = ' ') {\r\n if (text === null || text === undefined) {\r\n throw new TypeError('string.repeat requires a valid string.');\r\n }\r\n if (maxLength === Infinity) {\r\n throw new RangeError('string.padEnd requires a non-negative finite count.');\r\n }\r\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\r\n maxLength = 0;\r\n }\r\n let strText = String(text);\r\n const padding = maxLength - strText.length;\r\n if (padding > 0) {\r\n strText +=\r\n repeat(fillString, Math.floor(padding / fillString.length)) +\r\n fillString.slice(0, padding % fillString.length);\r\n }\r\n return strText;\r\n };\r\n padStart = function padStart(text, maxLength, fillString = ' ') {\r\n if (text === null || text === undefined) {\r\n throw new TypeError('string.repeat requires a valid string.');\r\n }\r\n if (maxLength === Infinity) {\r\n throw new RangeError('string.padStart requires a non-negative finite count.');\r\n }\r\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\r\n maxLength = 0;\r\n }\r\n let strText = String(text);\r\n const padding = maxLength - strText.length;\r\n if (padding > 0) {\r\n strText =\r\n repeat(fillString, Math.floor(padding / fillString.length)) +\r\n fillString.slice(0, padding % fillString.length) +\r\n strText;\r\n }\r\n return strText;\r\n };\r\n}\r\n//# sourceMappingURL=string.mjs.map" }, { - "id": "./node_modules/@dojo/shim/support/has.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\has.mjs", - "name": "./node_modules/@dojo/shim/support/has.mjs", + "id": "./node_modules/@dojo/framework/shim/support/has.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\has.mjs", + "name": "./node_modules/@dojo/framework/shim/support/has.mjs", "index": 6, "index2": 5, "size": 6316, @@ -1073,81 +1073,81 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "4:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "4:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "3:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Symbol.mjs", - "module": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleName": "./node_modules/@dojo/shim/Symbol.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Symbol.mjs", + "module": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Symbol.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "1:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "4:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/object.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\object.mjs", - "module": "./node_modules/@dojo/shim/object.mjs", - "moduleName": "./node_modules/@dojo/shim/object.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\object.mjs", + "module": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/object.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "2:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/string.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\string.mjs", - "module": "./node_modules/@dojo/shim/string.mjs", - "moduleName": "./node_modules/@dojo/shim/string.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\string.mjs", + "module": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/string.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "2:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\queue.mjs", - "module": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleName": "./node_modules/@dojo/shim/support/queue.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\queue.mjs", + "module": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/queue.mjs", "type": "harmony import", "userRequest": "./has", "loc": "2:0-24" @@ -1165,12 +1165,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import has, { add } from '@dojo/has/has';\r\nimport global from '../global';\r\nexport default has;\r\nexport * from '@dojo/has/has';\r\n/* ECMAScript 6 and 7 Features */\r\n/* Array */\r\nadd('es6-array', () => {\r\n return (['from', 'of'].every((key) => key in global.Array) &&\r\n ['findIndex', 'find', 'copyWithin'].every((key) => key in global.Array.prototype));\r\n}, true);\r\nadd('es6-array-fill', () => {\r\n if ('fill' in global.Array.prototype) {\r\n /* Some versions of Safari do not properly implement this */\r\n return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1;\r\n }\r\n return false;\r\n}, true);\r\nadd('es7-array', () => 'includes' in global.Array.prototype, true);\r\n/* Map */\r\nadd('es6-map', () => {\r\n if (typeof global.Map === 'function') {\r\n /*\r\n IE11 and older versions of Safari are missing critical ES6 Map functionality\r\n We wrap this in a try/catch because sometimes the Map constructor exists, but does not\r\n take arguments (iOS 8.4)\r\n */\r\n try {\r\n const map = new global.Map([[0, 1]]);\r\n return map.has(0) &&\r\n typeof map.keys === 'function' &&\r\n true &&\r\n typeof map.values === 'function' &&\r\n typeof map.entries === 'function';\r\n }\r\n catch (e) {\r\n /* istanbul ignore next: not testing on iOS at the moment */\r\n return false;\r\n }\r\n }\r\n return false;\r\n}, true);\r\n/* Math */\r\nadd('es6-math', () => {\r\n return [\r\n 'clz32',\r\n 'sign',\r\n 'log10',\r\n 'log2',\r\n 'log1p',\r\n 'expm1',\r\n 'cosh',\r\n 'sinh',\r\n 'tanh',\r\n 'acosh',\r\n 'asinh',\r\n 'atanh',\r\n 'trunc',\r\n 'fround',\r\n 'cbrt',\r\n 'hypot'\r\n ].every((name) => typeof global.Math[name] === 'function');\r\n}, true);\r\nadd('es6-math-imul', () => {\r\n if ('imul' in global.Math) {\r\n /* Some versions of Safari on ios do not properly implement this */\r\n return Math.imul(0xffffffff, 5) === -5;\r\n }\r\n return false;\r\n}, true);\r\n/* Object */\r\nadd('es6-object', () => {\r\n return true &&\r\n ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof global.Object[name] === 'function');\r\n}, true);\r\nadd('es2017-object', () => {\r\n return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof global.Object[name] === 'function');\r\n}, true);\r\n/* Observable */\r\nadd('es-observable', () => typeof global.Observable !== 'undefined', true);\r\n/* Promise */\r\nadd('es6-promise', () => typeof global.Promise !== 'undefined' && true, true);\r\n/* Set */\r\nadd('es6-set', () => {\r\n if (typeof global.Set === 'function') {\r\n /* IE11 and older versions of Safari are missing critical ES6 Set functionality */\r\n const set = new global.Set([1]);\r\n return set.has(1) && 'keys' in set && typeof set.keys === 'function' && true;\r\n }\r\n return false;\r\n}, true);\r\n/* String */\r\nadd('es6-string', () => {\r\n return ([\r\n /* static methods */\r\n 'fromCodePoint'\r\n ].every((key) => typeof global.String[key] === 'function') &&\r\n [\r\n /* instance methods */\r\n 'codePointAt',\r\n 'normalize',\r\n 'repeat',\r\n 'startsWith',\r\n 'endsWith',\r\n 'includes'\r\n ].every((key) => typeof global.String.prototype[key] === 'function'));\r\n}, true);\r\nadd('es6-string-raw', () => {\r\n function getCallSite(callSite, ...substitutions) {\r\n const result = [...callSite];\r\n result.raw = callSite.raw;\r\n return result;\r\n }\r\n if ('raw' in global.String) {\r\n let b = 1;\r\n let callSite = getCallSite `a\\n${b}`;\r\n callSite.raw = ['a\\\\n'];\r\n const supportsTrunc = global.String.raw(callSite, 42) === 'a:\\\\n';\r\n return supportsTrunc;\r\n }\r\n return false;\r\n}, true);\r\nadd('es2017-string', () => {\r\n return ['padStart', 'padEnd'].every((key) => typeof global.String.prototype[key] === 'function');\r\n}, true);\r\n/* Symbol */\r\nadd('es6-symbol', () => typeof global.Symbol !== 'undefined' && typeof Symbol() === 'symbol', true);\r\n/* WeakMap */\r\nadd('es6-weakmap', () => {\r\n if (typeof global.WeakMap !== 'undefined') {\r\n /* IE11 and older versions of Safari are missing critical ES6 Map functionality */\r\n const key1 = {};\r\n const key2 = {};\r\n const map = new global.WeakMap([[key1, 1]]);\r\n Object.freeze(key1);\r\n return map.get(key1) === 1 && map.set(key2, 2) === map && true;\r\n }\r\n return false;\r\n}, true);\r\n/* Miscellaneous features */\r\nadd('microtasks', () => true || false || true, true);\r\nadd('postmessage', () => {\r\n // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have\r\n // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist.\r\n return typeof global.window !== 'undefined' && typeof global.postMessage === 'function';\r\n}, true);\r\nadd('raf', () => typeof global.requestAnimationFrame === 'function', true);\r\nadd('setimmediate', () => typeof global.setImmediate !== 'undefined', true);\r\n/* DOM Features */\r\nadd('dom-mutationobserver', () => {\r\n if (true && Boolean(global.MutationObserver || global.WebKitMutationObserver)) {\r\n // IE11 has an unreliable MutationObserver implementation where setProperty() does not\r\n // generate a mutation event, observers can crash, and the queue does not drain\r\n // reliably. The following feature test was adapted from\r\n // https://gist.github.com/t10ko/4aceb8c71681fdb275e33efe5e576b14\r\n const example = document.createElement('div');\r\n /* tslint:disable-next-line:variable-name */\r\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\r\n const observer = new HostMutationObserver(function () { });\r\n observer.observe(example, { attributes: true });\r\n example.style.setProperty('display', 'block');\r\n return Boolean(observer.takeRecords().length);\r\n }\r\n return false;\r\n}, true);\r\nadd('dom-webanimation', () => true && global.Animation !== undefined && global.KeyframeEffect !== undefined, true);\r\n//# sourceMappingURL=has.mjs.map" + "source": "import has, { add } from '../../has/has';\r\nimport global from '../global';\r\nexport default has;\r\nexport * from '../../has/has';\r\n/* ECMAScript 6 and 7 Features */\r\n/* Array */\r\nadd('es6-array', () => {\r\n return (['from', 'of'].every((key) => key in global.Array) &&\r\n ['findIndex', 'find', 'copyWithin'].every((key) => key in global.Array.prototype));\r\n}, true);\r\nadd('es6-array-fill', () => {\r\n if ('fill' in global.Array.prototype) {\r\n /* Some versions of Safari do not properly implement this */\r\n return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1;\r\n }\r\n return false;\r\n}, true);\r\nadd('es7-array', () => 'includes' in global.Array.prototype, true);\r\n/* Map */\r\nadd('es6-map', () => {\r\n if (typeof global.Map === 'function') {\r\n /*\r\n IE11 and older versions of Safari are missing critical ES6 Map functionality\r\n We wrap this in a try/catch because sometimes the Map constructor exists, but does not\r\n take arguments (iOS 8.4)\r\n */\r\n try {\r\n const map = new global.Map([[0, 1]]);\r\n return map.has(0) &&\r\n typeof map.keys === 'function' &&\r\n true &&\r\n typeof map.values === 'function' &&\r\n typeof map.entries === 'function';\r\n }\r\n catch (e) {\r\n /* istanbul ignore next: not testing on iOS at the moment */\r\n return false;\r\n }\r\n }\r\n return false;\r\n}, true);\r\n/* Math */\r\nadd('es6-math', () => {\r\n return [\r\n 'clz32',\r\n 'sign',\r\n 'log10',\r\n 'log2',\r\n 'log1p',\r\n 'expm1',\r\n 'cosh',\r\n 'sinh',\r\n 'tanh',\r\n 'acosh',\r\n 'asinh',\r\n 'atanh',\r\n 'trunc',\r\n 'fround',\r\n 'cbrt',\r\n 'hypot'\r\n ].every((name) => typeof global.Math[name] === 'function');\r\n}, true);\r\nadd('es6-math-imul', () => {\r\n if ('imul' in global.Math) {\r\n /* Some versions of Safari on ios do not properly implement this */\r\n return Math.imul(0xffffffff, 5) === -5;\r\n }\r\n return false;\r\n}, true);\r\n/* Object */\r\nadd('es6-object', () => {\r\n return true &&\r\n ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof global.Object[name] === 'function');\r\n}, true);\r\nadd('es2017-object', () => {\r\n return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof global.Object[name] === 'function');\r\n}, true);\r\n/* Observable */\r\nadd('es-observable', () => typeof global.Observable !== 'undefined', true);\r\n/* Promise */\r\nadd('es6-promise', () => typeof global.Promise !== 'undefined' && true, true);\r\n/* Set */\r\nadd('es6-set', () => {\r\n if (typeof global.Set === 'function') {\r\n /* IE11 and older versions of Safari are missing critical ES6 Set functionality */\r\n const set = new global.Set([1]);\r\n return set.has(1) && 'keys' in set && typeof set.keys === 'function' && true;\r\n }\r\n return false;\r\n}, true);\r\n/* String */\r\nadd('es6-string', () => {\r\n return ([\r\n /* static methods */\r\n 'fromCodePoint'\r\n ].every((key) => typeof global.String[key] === 'function') &&\r\n [\r\n /* instance methods */\r\n 'codePointAt',\r\n 'normalize',\r\n 'repeat',\r\n 'startsWith',\r\n 'endsWith',\r\n 'includes'\r\n ].every((key) => typeof global.String.prototype[key] === 'function'));\r\n}, true);\r\nadd('es6-string-raw', () => {\r\n function getCallSite(callSite, ...substitutions) {\r\n const result = [...callSite];\r\n result.raw = callSite.raw;\r\n return result;\r\n }\r\n if ('raw' in global.String) {\r\n let b = 1;\r\n let callSite = getCallSite `a\\n${b}`;\r\n callSite.raw = ['a\\\\n'];\r\n const supportsTrunc = global.String.raw(callSite, 42) === 'a:\\\\n';\r\n return supportsTrunc;\r\n }\r\n return false;\r\n}, true);\r\nadd('es2017-string', () => {\r\n return ['padStart', 'padEnd'].every((key) => typeof global.String.prototype[key] === 'function');\r\n}, true);\r\n/* Symbol */\r\nadd('es6-symbol', () => typeof global.Symbol !== 'undefined' && typeof Symbol() === 'symbol', true);\r\n/* WeakMap */\r\nadd('es6-weakmap', () => {\r\n if (typeof global.WeakMap !== 'undefined') {\r\n /* IE11 and older versions of Safari are missing critical ES6 Map functionality */\r\n const key1 = {};\r\n const key2 = {};\r\n const map = new global.WeakMap([[key1, 1]]);\r\n Object.freeze(key1);\r\n return map.get(key1) === 1 && map.set(key2, 2) === map && true;\r\n }\r\n return false;\r\n}, true);\r\n/* Miscellaneous features */\r\nadd('microtasks', () => true || false || true, true);\r\nadd('postmessage', () => {\r\n // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have\r\n // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist.\r\n return typeof global.window !== 'undefined' && typeof global.postMessage === 'function';\r\n}, true);\r\nadd('raf', () => typeof global.requestAnimationFrame === 'function', true);\r\nadd('setimmediate', () => typeof global.setImmediate !== 'undefined', true);\r\n/* DOM Features */\r\nadd('dom-mutationobserver', () => {\r\n if (true && Boolean(global.MutationObserver || global.WebKitMutationObserver)) {\r\n // IE11 has an unreliable MutationObserver implementation where setProperty() does not\r\n // generate a mutation event, observers can crash, and the queue does not drain\r\n // reliably. The following feature test was adapted from\r\n // https://gist.github.com/t10ko/4aceb8c71681fdb275e33efe5e576b14\r\n const example = document.createElement('div');\r\n /* tslint:disable-next-line:variable-name */\r\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\r\n const observer = new HostMutationObserver(function () { });\r\n observer.observe(example, { attributes: true });\r\n example.style.setProperty('display', 'block');\r\n return Boolean(observer.takeRecords().length);\r\n }\r\n return false;\r\n}, true);\r\nadd('dom-webanimation', () => true && global.Animation !== undefined && global.KeyframeEffect !== undefined, true);\r\n//# sourceMappingURL=has.mjs.map" }, { - "id": "./node_modules/@dojo/shim/support/queue.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\queue.mjs", - "name": "./node_modules/@dojo/shim/support/queue.mjs", + "id": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\queue.mjs", + "name": "./node_modules/@dojo/framework/shim/support/queue.mjs", "index": 23, "index2": 14, "size": 6381, @@ -1182,18 +1182,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Promise.mjs", - "issuerId": "./node_modules/@dojo/shim/Promise.mjs", - "issuerName": "./node_modules/@dojo/shim/Promise.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Promise.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/Promise.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./support/queue", "loc": "2:0-49" @@ -1210,9 +1210,9 @@ "source": "import global from '../global';\r\nimport has from './has';\r\nfunction executeTask(item) {\r\n if (item && item.isActive && item.callback) {\r\n item.callback();\r\n }\r\n}\r\nfunction getQueueHandle(item, destructor) {\r\n return {\r\n destroy: function () {\r\n this.destroy = function () { };\r\n item.isActive = false;\r\n item.callback = null;\r\n if (destructor) {\r\n destructor();\r\n }\r\n }\r\n };\r\n}\r\nlet checkMicroTaskQueue;\r\nlet microTasks;\r\n/**\r\n * Schedules a callback to the macrotask queue.\r\n *\r\n * @param callback the function to be queued and later executed.\r\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\r\n */\r\nexport const queueTask = (function () {\r\n let destructor;\r\n let enqueue;\r\n // Since the IE implementation of `setImmediate` is not flawless, we will test for `postMessage` first.\r\n if (true) {\r\n const queue = [];\r\n global.addEventListener('message', function (event) {\r\n // Confirm that the event was triggered by the current window and by this particular implementation.\r\n if (event.source === global && event.data === 'dojo-queue-message') {\r\n event.stopPropagation();\r\n if (queue.length) {\r\n executeTask(queue.shift());\r\n }\r\n }\r\n });\r\n enqueue = function (item) {\r\n queue.push(item);\r\n global.postMessage('dojo-queue-message', '*');\r\n };\r\n }\r\n else if (false) {\r\n destructor = global.clearImmediate;\r\n enqueue = function (item) {\r\n return setImmediate(executeTask.bind(null, item));\r\n };\r\n }\r\n else {\r\n destructor = global.clearTimeout;\r\n enqueue = function (item) {\r\n return setTimeout(executeTask.bind(null, item), 0);\r\n };\r\n }\r\n function queueTask(callback) {\r\n const item = {\r\n isActive: true,\r\n callback: callback\r\n };\r\n const id = enqueue(item);\r\n return getQueueHandle(item, destructor &&\r\n function () {\r\n destructor(id);\r\n });\r\n }\r\n // TODO: Use aspect.before when it is available.\r\n return true\r\n ? queueTask\r\n : function (callback) {\r\n checkMicroTaskQueue();\r\n return queueTask(callback);\r\n };\r\n})();\r\n// When no mechanism for registering microtasks is exposed by the environment, microtasks will\r\n// be queued and then executed in a single macrotask before the other macrotasks are executed.\r\nif (!true) {\r\n let isMicroTaskQueued = false;\r\n microTasks = [];\r\n checkMicroTaskQueue = function () {\r\n if (!isMicroTaskQueued) {\r\n isMicroTaskQueued = true;\r\n queueTask(function () {\r\n isMicroTaskQueued = false;\r\n if (microTasks.length) {\r\n let item;\r\n while ((item = microTasks.shift())) {\r\n executeTask(item);\r\n }\r\n }\r\n });\r\n }\r\n };\r\n}\r\n/**\r\n * Schedules an animation task with `window.requestAnimationFrame` if it exists, or with `queueTask` otherwise.\r\n *\r\n * Since requestAnimationFrame's behavior does not match that expected from `queueTask`, it is not used there.\r\n * However, at times it makes more sense to delegate to requestAnimationFrame; hence the following method.\r\n *\r\n * @param callback the function to be queued and later executed.\r\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\r\n */\r\nexport const queueAnimationTask = (function () {\r\n if (!true) {\r\n return queueTask;\r\n }\r\n function queueAnimationTask(callback) {\r\n const item = {\r\n isActive: true,\r\n callback: callback\r\n };\r\n const rafId = requestAnimationFrame(executeTask.bind(null, item));\r\n return getQueueHandle(item, function () {\r\n cancelAnimationFrame(rafId);\r\n });\r\n }\r\n // TODO: Use aspect.before when it is available.\r\n return true\r\n ? queueAnimationTask\r\n : function (callback) {\r\n checkMicroTaskQueue();\r\n return queueAnimationTask(callback);\r\n };\r\n})();\r\n/**\r\n * Schedules a callback to the microtask queue.\r\n *\r\n * Any callbacks registered with `queueMicroTask` will be executed before the next macrotask. If no native\r\n * mechanism for scheduling macrotasks is exposed, then any callbacks will be fired before any macrotask\r\n * registered with `queueTask` or `queueAnimationTask`.\r\n *\r\n * @param callback the function to be queued and later executed.\r\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\r\n */\r\nexport let queueMicroTask = (function () {\r\n let enqueue;\r\n if (false) {\r\n enqueue = function (item) {\r\n global.process.nextTick(executeTask.bind(null, item));\r\n };\r\n }\r\n else if (true) {\r\n enqueue = function (item) {\r\n global.Promise.resolve(item).then(executeTask);\r\n };\r\n }\r\n else if (true) {\r\n /* tslint:disable-next-line:variable-name */\r\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\r\n const node = document.createElement('div');\r\n const queue = [];\r\n const observer = new HostMutationObserver(function () {\r\n while (queue.length > 0) {\r\n const item = queue.shift();\r\n if (item && item.isActive && item.callback) {\r\n item.callback();\r\n }\r\n }\r\n });\r\n observer.observe(node, { attributes: true });\r\n enqueue = function (item) {\r\n queue.push(item);\r\n node.setAttribute('queueStatus', '1');\r\n };\r\n }\r\n else {\r\n enqueue = function (item) {\r\n checkMicroTaskQueue();\r\n microTasks.push(item);\r\n };\r\n }\r\n return function (callback) {\r\n const item = {\r\n isActive: true,\r\n callback: callback\r\n };\r\n enqueue(item);\r\n return getQueueHandle(item);\r\n };\r\n})();\r\n//# sourceMappingURL=queue.mjs.map" }, { - "id": "./node_modules/@dojo/shim/support/util.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\util.mjs", - "name": "./node_modules/@dojo/shim/support/util.mjs", + "id": "./node_modules/@dojo/framework/shim/support/util.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\util.mjs", + "name": "./node_modules/@dojo/framework/shim/support/util.mjs", "index": 11, "index2": 6, "size": 853, @@ -1224,36 +1224,36 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./support/util", "loc": "5:0-44" }, { - "moduleId": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Symbol.mjs", - "module": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleName": "./node_modules/@dojo/shim/Symbol.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Symbol.mjs", + "module": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Symbol.mjs", "type": "harmony import", "userRequest": "./support/util", "loc": "3:0-52" }, { - "moduleId": "./node_modules/@dojo/shim/string.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\string.mjs", - "module": "./node_modules/@dojo/shim/string.mjs", - "moduleName": "./node_modules/@dojo/shim/string.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\string.mjs", + "module": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/string.mjs", "type": "harmony import", "userRequest": "./support/util", "loc": "3:0-44" @@ -1272,12 +1272,12 @@ "source": "/**\n * Helper function to generate a value property descriptor\n *\n * @param value The value the property descriptor should be set to\n * @param enumerable If the property should be enumberable, defaults to false\n * @param writable If the property should be writable, defaults to true\n * @param configurable If the property should be configurable, defaults to true\n * @return The property descriptor object\n */\nexport function getValueDescriptor(value, enumerable = false, writable = true, configurable = true) {\n return {\n value: value,\n enumerable: enumerable,\n writable: writable,\n configurable: configurable\n };\n}\nexport function wrapNative(nativeFunction) {\n return function (target, ...args) {\n return nativeFunction.apply(target, args);\n };\n}\n//# sourceMappingURL=util.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/Injector.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Injector.mjs", - "name": "./node_modules/@dojo/widget-core/Injector.mjs", + "id": "./node_modules/@dojo/framework/widget-core/Injector.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Injector.mjs", + "name": "./node_modules/@dojo/framework/widget-core/Injector.mjs", "index": 37, "index2": 31, - "size": 496, + "size": 493, "cacheable": true, "built": true, "optional": false, @@ -1286,18 +1286,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../Injector", "loc": "2:0-41" @@ -1312,15 +1312,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { Evented } from '@dojo/core/Evented';\nexport class Injector extends Evented {\n constructor(payload) {\n super();\n this._payload = payload;\n }\n setInvalidator(invalidator) {\n this._invalidator = invalidator;\n }\n get() {\n return this._payload;\n }\n set(payload) {\n this._payload = payload;\n if (this._invalidator) {\n this._invalidator();\n }\n }\n}\nexport default Injector;\n//# sourceMappingURL=Injector.mjs.map" + "source": "import { Evented } from '../core/Evented';\nexport class Injector extends Evented {\n constructor(payload) {\n super();\n this._payload = payload;\n }\n setInvalidator(invalidator) {\n this._invalidator = invalidator;\n }\n get() {\n return this._payload;\n }\n set(payload) {\n this._payload = payload;\n if (this._invalidator) {\n this._invalidator();\n }\n }\n}\nexport default Injector;\n//# sourceMappingURL=Injector.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\NodeHandler.mjs", - "name": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "id": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\NodeHandler.mjs", + "name": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", "index": 28, "index2": 22, - "size": 1134, + "size": 1128, "cacheable": true, "built": true, "optional": false, @@ -1329,18 +1329,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./NodeHandler", "loc": "7:0-40" @@ -1356,15 +1356,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { Evented } from '@dojo/core/Evented';\r\nimport Map from '@dojo/shim/Map';\r\n/**\r\n * Enum to identify the type of event.\r\n * Listening to 'Projector' will notify when projector is created or updated\r\n * Listening to 'Widget' will notify when widget root is created or updated\r\n */\r\nexport var NodeEventType;\r\n(function (NodeEventType) {\r\n NodeEventType[\"Projector\"] = \"Projector\";\r\n NodeEventType[\"Widget\"] = \"Widget\";\r\n})(NodeEventType || (NodeEventType = {}));\r\nexport class NodeHandler extends Evented {\r\n constructor() {\r\n super(...arguments);\r\n this._nodeMap = new Map();\r\n }\r\n get(key) {\r\n return this._nodeMap.get(key);\r\n }\r\n has(key) {\r\n return this._nodeMap.has(key);\r\n }\r\n add(element, key) {\r\n this._nodeMap.set(key, element);\r\n this.emit({ type: key });\r\n }\r\n addRoot() {\r\n this.emit({ type: NodeEventType.Widget });\r\n }\r\n addProjector() {\r\n this.emit({ type: NodeEventType.Projector });\r\n }\r\n clear() {\r\n this._nodeMap.clear();\r\n }\r\n}\r\nexport default NodeHandler;\r\n//# sourceMappingURL=NodeHandler.mjs.map" + "source": "import { Evented } from '../core/Evented';\r\nimport Map from '../shim/Map';\r\n/**\r\n * Enum to identify the type of event.\r\n * Listening to 'Projector' will notify when projector is created or updated\r\n * Listening to 'Widget' will notify when widget root is created or updated\r\n */\r\nexport var NodeEventType;\r\n(function (NodeEventType) {\r\n NodeEventType[\"Projector\"] = \"Projector\";\r\n NodeEventType[\"Widget\"] = \"Widget\";\r\n})(NodeEventType || (NodeEventType = {}));\r\nexport class NodeHandler extends Evented {\r\n constructor() {\r\n super(...arguments);\r\n this._nodeMap = new Map();\r\n }\r\n get(key) {\r\n return this._nodeMap.get(key);\r\n }\r\n has(key) {\r\n return this._nodeMap.has(key);\r\n }\r\n add(element, key) {\r\n this._nodeMap.set(key, element);\r\n this.emit({ type: key });\r\n }\r\n addRoot() {\r\n this.emit({ type: NodeEventType.Widget });\r\n }\r\n addProjector() {\r\n this.emit({ type: NodeEventType.Projector });\r\n }\r\n clear() {\r\n this._nodeMap.clear();\r\n }\r\n}\r\nexport default NodeHandler;\r\n//# sourceMappingURL=NodeHandler.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/Registry.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Registry.mjs", - "name": "./node_modules/@dojo/widget-core/Registry.mjs", + "id": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Registry.mjs", + "name": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "index": 21, "index2": 19, - "size": 3814, + "size": 3802, "cacheable": true, "built": true, "optional": false, @@ -1373,54 +1373,54 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./Registry", "loc": "9:0-71" }, { - "moduleId": "./node_modules/@dojo/widget-core/diff.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\diff.mjs", - "module": "./node_modules/@dojo/widget-core/diff.mjs", - "moduleName": "./node_modules/@dojo/widget-core/diff.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\RegistryHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "type": "harmony import", "userRequest": "./Registry", - "loc": "1:0-46" + "loc": "3:0-38" }, { - "moduleId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\RegistryHandler.mjs", - "module": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/diff.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\diff.mjs", + "module": "./node_modules/@dojo/framework/widget-core/diff.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/diff.mjs", "type": "harmony import", "userRequest": "./Registry", - "loc": "3:0-38" + "loc": "1:0-46" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", "userRequest": "./Registry", "loc": "4:0-53" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\customElement.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\customElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", "type": "harmony import", "userRequest": "../Registry", "loc": "2:0-35" @@ -1441,15 +1441,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import Promise from '@dojo/shim/Promise';\r\nimport Map from '@dojo/shim/Map';\r\nimport Symbol from '@dojo/shim/Symbol';\r\nimport { Evented } from '@dojo/core/Evented';\r\n/**\r\n * Widget base symbol type\r\n */\r\nexport const WIDGET_BASE_TYPE = Symbol('Widget Base');\r\n/**\r\n * Checks is the item is a subclass of WidgetBase (or a WidgetBase)\r\n *\r\n * @param item the item to check\r\n * @returns true/false indicating if the item is a WidgetBaseConstructor\r\n */\r\nexport function isWidgetBaseConstructor(item) {\r\n return Boolean(item && item._type === WIDGET_BASE_TYPE);\r\n}\r\nexport function isWidgetConstructorDefaultExport(item) {\r\n return Boolean(item &&\r\n item.hasOwnProperty('__esModule') &&\r\n item.hasOwnProperty('default') &&\r\n isWidgetBaseConstructor(item.default));\r\n}\r\n/**\r\n * The Registry implementation\r\n */\r\nexport class Registry extends Evented {\r\n /**\r\n * Emit loaded event for registry label\r\n */\r\n emitLoadedEvent(widgetLabel, item) {\r\n this.emit({\r\n type: widgetLabel,\r\n action: 'loaded',\r\n item\r\n });\r\n }\r\n define(label, item) {\r\n if (this._widgetRegistry === undefined) {\r\n this._widgetRegistry = new Map();\r\n }\r\n if (this._widgetRegistry.has(label)) {\r\n throw new Error(`widget has already been registered for '${label.toString()}'`);\r\n }\r\n this._widgetRegistry.set(label, item);\r\n if (item instanceof Promise) {\r\n item.then((widgetCtor) => {\r\n this._widgetRegistry.set(label, widgetCtor);\r\n this.emitLoadedEvent(label, widgetCtor);\r\n return widgetCtor;\r\n }, (error) => {\r\n throw error;\r\n });\r\n }\r\n else if (isWidgetBaseConstructor(item)) {\r\n this.emitLoadedEvent(label, item);\r\n }\r\n }\r\n defineInjector(label, injectorFactory) {\r\n if (this._injectorRegistry === undefined) {\r\n this._injectorRegistry = new Map();\r\n }\r\n if (this._injectorRegistry.has(label)) {\r\n throw new Error(`injector has already been registered for '${label.toString()}'`);\r\n }\r\n const invalidator = new Evented();\r\n const injectorItem = {\r\n injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })),\r\n invalidator\r\n };\r\n this._injectorRegistry.set(label, injectorItem);\r\n this.emitLoadedEvent(label, injectorItem);\r\n }\r\n get(label) {\r\n if (!this._widgetRegistry || !this.has(label)) {\r\n return null;\r\n }\r\n const item = this._widgetRegistry.get(label);\r\n if (isWidgetBaseConstructor(item)) {\r\n return item;\r\n }\r\n if (item instanceof Promise) {\r\n return null;\r\n }\r\n const promise = item();\r\n this._widgetRegistry.set(label, promise);\r\n promise.then((widgetCtor) => {\r\n if (isWidgetConstructorDefaultExport(widgetCtor)) {\r\n widgetCtor = widgetCtor.default;\r\n }\r\n this._widgetRegistry.set(label, widgetCtor);\r\n this.emitLoadedEvent(label, widgetCtor);\r\n return widgetCtor;\r\n }, (error) => {\r\n throw error;\r\n });\r\n return null;\r\n }\r\n getInjector(label) {\r\n if (!this._injectorRegistry || !this.hasInjector(label)) {\r\n return null;\r\n }\r\n return this._injectorRegistry.get(label);\r\n }\r\n has(label) {\r\n return Boolean(this._widgetRegistry && this._widgetRegistry.has(label));\r\n }\r\n hasInjector(label) {\r\n return Boolean(this._injectorRegistry && this._injectorRegistry.has(label));\r\n }\r\n}\r\nexport default Registry;\r\n//# sourceMappingURL=Registry.mjs.map" + "source": "import Promise from '../shim/Promise';\r\nimport Map from '../shim/Map';\r\nimport Symbol from '../shim/Symbol';\r\nimport { Evented } from '../core/Evented';\r\n/**\r\n * Widget base symbol type\r\n */\r\nexport const WIDGET_BASE_TYPE = Symbol('Widget Base');\r\n/**\r\n * Checks is the item is a subclass of WidgetBase (or a WidgetBase)\r\n *\r\n * @param item the item to check\r\n * @returns true/false indicating if the item is a WidgetBaseConstructor\r\n */\r\nexport function isWidgetBaseConstructor(item) {\r\n return Boolean(item && item._type === WIDGET_BASE_TYPE);\r\n}\r\nexport function isWidgetConstructorDefaultExport(item) {\r\n return Boolean(item &&\r\n item.hasOwnProperty('__esModule') &&\r\n item.hasOwnProperty('default') &&\r\n isWidgetBaseConstructor(item.default));\r\n}\r\n/**\r\n * The Registry implementation\r\n */\r\nexport class Registry extends Evented {\r\n /**\r\n * Emit loaded event for registry label\r\n */\r\n emitLoadedEvent(widgetLabel, item) {\r\n this.emit({\r\n type: widgetLabel,\r\n action: 'loaded',\r\n item\r\n });\r\n }\r\n define(label, item) {\r\n if (this._widgetRegistry === undefined) {\r\n this._widgetRegistry = new Map();\r\n }\r\n if (this._widgetRegistry.has(label)) {\r\n throw new Error(`widget has already been registered for '${label.toString()}'`);\r\n }\r\n this._widgetRegistry.set(label, item);\r\n if (item instanceof Promise) {\r\n item.then((widgetCtor) => {\r\n this._widgetRegistry.set(label, widgetCtor);\r\n this.emitLoadedEvent(label, widgetCtor);\r\n return widgetCtor;\r\n }, (error) => {\r\n throw error;\r\n });\r\n }\r\n else if (isWidgetBaseConstructor(item)) {\r\n this.emitLoadedEvent(label, item);\r\n }\r\n }\r\n defineInjector(label, injectorFactory) {\r\n if (this._injectorRegistry === undefined) {\r\n this._injectorRegistry = new Map();\r\n }\r\n if (this._injectorRegistry.has(label)) {\r\n throw new Error(`injector has already been registered for '${label.toString()}'`);\r\n }\r\n const invalidator = new Evented();\r\n const injectorItem = {\r\n injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })),\r\n invalidator\r\n };\r\n this._injectorRegistry.set(label, injectorItem);\r\n this.emitLoadedEvent(label, injectorItem);\r\n }\r\n get(label) {\r\n if (!this._widgetRegistry || !this.has(label)) {\r\n return null;\r\n }\r\n const item = this._widgetRegistry.get(label);\r\n if (isWidgetBaseConstructor(item)) {\r\n return item;\r\n }\r\n if (item instanceof Promise) {\r\n return null;\r\n }\r\n const promise = item();\r\n this._widgetRegistry.set(label, promise);\r\n promise.then((widgetCtor) => {\r\n if (isWidgetConstructorDefaultExport(widgetCtor)) {\r\n widgetCtor = widgetCtor.default;\r\n }\r\n this._widgetRegistry.set(label, widgetCtor);\r\n this.emitLoadedEvent(label, widgetCtor);\r\n return widgetCtor;\r\n }, (error) => {\r\n throw error;\r\n });\r\n return null;\r\n }\r\n getInjector(label) {\r\n if (!this._injectorRegistry || !this.hasInjector(label)) {\r\n return null;\r\n }\r\n return this._injectorRegistry.get(label);\r\n }\r\n has(label) {\r\n return Boolean(this._widgetRegistry && this._widgetRegistry.has(label));\r\n }\r\n hasInjector(label) {\r\n return Boolean(this._injectorRegistry && this._injectorRegistry.has(label));\r\n }\r\n}\r\nexport default Registry;\r\n//# sourceMappingURL=Registry.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\RegistryHandler.mjs", - "name": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "id": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\RegistryHandler.mjs", + "name": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "index": 27, "index2": 21, - "size": 2933, + "size": 2927, "cacheable": true, "built": true, "optional": false, @@ -1458,18 +1458,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./RegistryHandler", "loc": "6:0-48" @@ -1484,15 +1484,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { Map } from '@dojo/shim/Map';\r\nimport { Evented } from '@dojo/core/Evented';\r\nimport { Registry } from './Registry';\r\nexport class RegistryHandler extends Evented {\r\n constructor() {\r\n super();\r\n this._registry = new Registry();\r\n this._registryWidgetLabelMap = new Map();\r\n this._registryInjectorLabelMap = new Map();\r\n this.own(this._registry);\r\n const destroy = () => {\r\n if (this.baseRegistry) {\r\n this._registryWidgetLabelMap.delete(this.baseRegistry);\r\n this._registryInjectorLabelMap.delete(this.baseRegistry);\r\n this.baseRegistry = undefined;\r\n }\r\n };\r\n this.own({ destroy });\r\n }\r\n set base(baseRegistry) {\r\n if (this.baseRegistry) {\r\n this._registryWidgetLabelMap.delete(this.baseRegistry);\r\n this._registryInjectorLabelMap.delete(this.baseRegistry);\r\n }\r\n this.baseRegistry = baseRegistry;\r\n }\r\n define(label, widget) {\r\n this._registry.define(label, widget);\r\n }\r\n defineInjector(label, injector) {\r\n this._registry.defineInjector(label, injector);\r\n }\r\n has(label) {\r\n return this._registry.has(label) || Boolean(this.baseRegistry && this.baseRegistry.has(label));\r\n }\r\n hasInjector(label) {\r\n return this._registry.hasInjector(label) || Boolean(this.baseRegistry && this.baseRegistry.hasInjector(label));\r\n }\r\n get(label, globalPrecedence = false) {\r\n return this._get(label, globalPrecedence, 'get', this._registryWidgetLabelMap);\r\n }\r\n getInjector(label, globalPrecedence = false) {\r\n return this._get(label, globalPrecedence, 'getInjector', this._registryInjectorLabelMap);\r\n }\r\n _get(label, globalPrecedence, getFunctionName, labelMap) {\r\n const registries = globalPrecedence ? [this.baseRegistry, this._registry] : [this._registry, this.baseRegistry];\r\n for (let i = 0; i < registries.length; i++) {\r\n const registry = registries[i];\r\n if (!registry) {\r\n continue;\r\n }\r\n const item = registry[getFunctionName](label);\r\n const registeredLabels = labelMap.get(registry) || [];\r\n if (item) {\r\n return item;\r\n }\r\n else if (registeredLabels.indexOf(label) === -1) {\r\n const handle = registry.on(label, (event) => {\r\n if (event.action === 'loaded' &&\r\n this[getFunctionName](label, globalPrecedence) === event.item) {\r\n this.emit({ type: 'invalidate' });\r\n }\r\n });\r\n this.own(handle);\r\n labelMap.set(registry, [...registeredLabels, label]);\r\n }\r\n }\r\n return null;\r\n }\r\n}\r\nexport default RegistryHandler;\r\n//# sourceMappingURL=RegistryHandler.mjs.map" + "source": "import { Map } from '../shim/Map';\r\nimport { Evented } from '../core/Evented';\r\nimport { Registry } from './Registry';\r\nexport class RegistryHandler extends Evented {\r\n constructor() {\r\n super();\r\n this._registry = new Registry();\r\n this._registryWidgetLabelMap = new Map();\r\n this._registryInjectorLabelMap = new Map();\r\n this.own(this._registry);\r\n const destroy = () => {\r\n if (this.baseRegistry) {\r\n this._registryWidgetLabelMap.delete(this.baseRegistry);\r\n this._registryInjectorLabelMap.delete(this.baseRegistry);\r\n this.baseRegistry = undefined;\r\n }\r\n };\r\n this.own({ destroy });\r\n }\r\n set base(baseRegistry) {\r\n if (this.baseRegistry) {\r\n this._registryWidgetLabelMap.delete(this.baseRegistry);\r\n this._registryInjectorLabelMap.delete(this.baseRegistry);\r\n }\r\n this.baseRegistry = baseRegistry;\r\n }\r\n define(label, widget) {\r\n this._registry.define(label, widget);\r\n }\r\n defineInjector(label, injector) {\r\n this._registry.defineInjector(label, injector);\r\n }\r\n has(label) {\r\n return this._registry.has(label) || Boolean(this.baseRegistry && this.baseRegistry.has(label));\r\n }\r\n hasInjector(label) {\r\n return this._registry.hasInjector(label) || Boolean(this.baseRegistry && this.baseRegistry.hasInjector(label));\r\n }\r\n get(label, globalPrecedence = false) {\r\n return this._get(label, globalPrecedence, 'get', this._registryWidgetLabelMap);\r\n }\r\n getInjector(label, globalPrecedence = false) {\r\n return this._get(label, globalPrecedence, 'getInjector', this._registryInjectorLabelMap);\r\n }\r\n _get(label, globalPrecedence, getFunctionName, labelMap) {\r\n const registries = globalPrecedence ? [this.baseRegistry, this._registry] : [this._registry, this.baseRegistry];\r\n for (let i = 0; i < registries.length; i++) {\r\n const registry = registries[i];\r\n if (!registry) {\r\n continue;\r\n }\r\n const item = registry[getFunctionName](label);\r\n const registeredLabels = labelMap.get(registry) || [];\r\n if (item) {\r\n return item;\r\n }\r\n else if (registeredLabels.indexOf(label) === -1) {\r\n const handle = registry.on(label, (event) => {\r\n if (event.action === 'loaded' &&\r\n this[getFunctionName](label, globalPrecedence) === event.item) {\r\n this.emit({ type: 'invalidate' });\r\n }\r\n });\r\n this.own(handle);\r\n labelMap.set(registry, [...registeredLabels, label]);\r\n }\r\n }\r\n return null;\r\n }\r\n}\r\nexport default RegistryHandler;\r\n//# sourceMappingURL=RegistryHandler.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "name": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "id": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "name": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "index": 14, "index2": 26, - "size": 14386, + "size": 13720, "cacheable": true, "built": true, "optional": false, @@ -1501,18 +1501,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./WidgetBase", "loc": "2:0-50" @@ -1523,8 +1523,8 @@ "module": "./src/menu/Menu.ts", "moduleName": "./src/menu/Menu.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/WidgetBase", - "loc": "5:0-58" + "userRequest": "@dojo/framework/widget-core/WidgetBase", + "loc": "5:0-68" } ], "usedExports": [ @@ -1538,12 +1538,12 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import Map from '@dojo/shim/Map';\nimport WeakMap from '@dojo/shim/WeakMap';\nimport Symbol from '@dojo/shim/Symbol';\nimport { v } from './d';\nimport { auto } from './diff';\nimport RegistryHandler from './RegistryHandler';\nimport NodeHandler from './NodeHandler';\nimport { widgetInstanceMap } from './vdom';\nimport { isWidgetBaseConstructor, WIDGET_BASE_TYPE } from './Registry';\nconst decoratorMap = new Map();\nconst boundAuto = auto.bind(null);\nexport const noBind = Symbol.for('dojoNoBind');\n/**\n * Main widget base for all widgets to extend\n */\nexport class WidgetBase {\n /**\n * @constructor\n */\n constructor() {\n /**\n * Indicates if it is the initial set properties cycle\n */\n this._initialProperties = true;\n /**\n * Array of property keys considered changed from the previous set properties\n */\n this._changedPropertyKeys = [];\n this._nodeHandler = new NodeHandler();\n this._handles = [];\n this._children = [];\n this._decoratorCache = new Map();\n this._properties = {};\n this._boundRenderFunc = this.render.bind(this);\n this._boundInvalidate = this.invalidate.bind(this);\n widgetInstanceMap.set(this, {\n dirty: true,\n onAttach: () => {\n this.onAttach();\n },\n onDetach: () => {\n this.onDetach();\n this.destroy();\n },\n nodeHandler: this._nodeHandler,\n registry: () => {\n return this.registry;\n },\n coreProperties: {},\n rendering: false,\n inputProperties: {}\n });\n this._runAfterConstructors();\n }\n meta(MetaType) {\n if (this._metaMap === undefined) {\n this._metaMap = new Map();\n }\n let cached = this._metaMap.get(MetaType);\n if (!cached) {\n cached = new MetaType({\n invalidate: this._boundInvalidate,\n nodeHandler: this._nodeHandler,\n bind: this\n });\n this.own(cached);\n this._metaMap.set(MetaType, cached);\n }\n return cached;\n }\n onAttach() {\n // Do nothing by default.\n }\n onDetach() {\n // Do nothing by default.\n }\n get properties() {\n return this._properties;\n }\n get changedPropertyKeys() {\n return [...this._changedPropertyKeys];\n }\n __setCoreProperties__(coreProperties) {\n const { baseRegistry } = coreProperties;\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.coreProperties.baseRegistry !== baseRegistry) {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n this._registry.base = baseRegistry;\n this.invalidate();\n }\n instanceData.coreProperties = coreProperties;\n }\n __setProperties__(originalProperties) {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.inputProperties = originalProperties;\n const properties = this._runBeforeProperties(originalProperties);\n const registeredDiffPropertyNames = this.getDecorator('registeredDiffProperty');\n const changedPropertyKeys = [];\n const propertyNames = Object.keys(properties);\n if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) {\n const allProperties = [...propertyNames, ...Object.keys(this._properties)];\n const checkedProperties = [];\n const diffPropertyResults = {};\n let runReactions = false;\n for (let i = 0; i < allProperties.length; i++) {\n const propertyName = allProperties[i];\n if (checkedProperties.indexOf(propertyName) !== -1) {\n continue;\n }\n checkedProperties.push(propertyName);\n const previousProperty = this._properties[propertyName];\n const newProperty = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n if (registeredDiffPropertyNames.indexOf(propertyName) !== -1) {\n runReactions = true;\n const diffFunctions = this.getDecorator(`diffProperty:${propertyName}`);\n for (let i = 0; i < diffFunctions.length; i++) {\n const result = diffFunctions[i](previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n else {\n const result = boundAuto(previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n if (runReactions) {\n this._mapDiffPropertyReactions(properties, changedPropertyKeys).forEach((args, reaction) => {\n if (args.changed) {\n reaction.call(this, args.previousProperties, args.newProperties);\n }\n });\n }\n this._properties = diffPropertyResults;\n this._changedPropertyKeys = changedPropertyKeys;\n }\n else {\n this._initialProperties = false;\n for (let i = 0; i < propertyNames.length; i++) {\n const propertyName = propertyNames[i];\n if (typeof properties[propertyName] === 'function') {\n properties[propertyName] = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n }\n else {\n changedPropertyKeys.push(propertyName);\n }\n }\n this._changedPropertyKeys = changedPropertyKeys;\n this._properties = Object.assign({}, properties);\n }\n if (this._changedPropertyKeys.length > 0) {\n this.invalidate();\n }\n }\n get children() {\n return this._children;\n }\n __setChildren__(children) {\n if (this._children.length > 0 || children.length > 0) {\n this._children = children;\n this.invalidate();\n }\n }\n __render__() {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.dirty = false;\n const render = this._runBeforeRenders();\n let dNode = render();\n dNode = this.runAfterRenders(dNode);\n this._nodeHandler.clear();\n return dNode;\n }\n invalidate() {\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.invalidate) {\n instanceData.invalidate();\n }\n }\n render() {\n return v('div', {}, this.children);\n }\n /**\n * Function to add decorators to WidgetBase\n *\n * @param decoratorKey The key of the decorator\n * @param value The value of the decorator\n */\n addDecorator(decoratorKey, value) {\n value = Array.isArray(value) ? value : [value];\n if (this.hasOwnProperty('constructor')) {\n let decoratorList = decoratorMap.get(this.constructor);\n if (!decoratorList) {\n decoratorList = new Map();\n decoratorMap.set(this.constructor, decoratorList);\n }\n let specificDecoratorList = decoratorList.get(decoratorKey);\n if (!specificDecoratorList) {\n specificDecoratorList = [];\n decoratorList.set(decoratorKey, specificDecoratorList);\n }\n specificDecoratorList.push(...value);\n }\n else {\n const decorators = this.getDecorator(decoratorKey);\n this._decoratorCache.set(decoratorKey, [...decorators, ...value]);\n }\n }\n /**\n * Function to build the list of decorators from the global decorator map.\n *\n * @param decoratorKey The key of the decorator\n * @return An array of decorator values\n * @private\n */\n _buildDecoratorList(decoratorKey) {\n const allDecorators = [];\n let constructor = this.constructor;\n while (constructor) {\n const instanceMap = decoratorMap.get(constructor);\n if (instanceMap) {\n const decorators = instanceMap.get(decoratorKey);\n if (decorators) {\n allDecorators.unshift(...decorators);\n }\n }\n constructor = Object.getPrototypeOf(constructor);\n }\n return allDecorators;\n }\n /**\n * Function to retrieve decorator values\n *\n * @param decoratorKey The key of the decorator\n * @returns An array of decorator values\n */\n getDecorator(decoratorKey) {\n let allDecorators = this._decoratorCache.get(decoratorKey);\n if (allDecorators !== undefined) {\n return allDecorators;\n }\n allDecorators = this._buildDecoratorList(decoratorKey);\n this._decoratorCache.set(decoratorKey, allDecorators);\n return allDecorators;\n }\n _mapDiffPropertyReactions(newProperties, changedPropertyKeys) {\n const reactionFunctions = this.getDecorator('diffReaction');\n return reactionFunctions.reduce((reactionPropertyMap, { reaction, propertyName }) => {\n let reactionArguments = reactionPropertyMap.get(reaction);\n if (reactionArguments === undefined) {\n reactionArguments = {\n previousProperties: {},\n newProperties: {},\n changed: false\n };\n }\n reactionArguments.previousProperties[propertyName] = this._properties[propertyName];\n reactionArguments.newProperties[propertyName] = newProperties[propertyName];\n if (changedPropertyKeys.indexOf(propertyName) !== -1) {\n reactionArguments.changed = true;\n }\n reactionPropertyMap.set(reaction, reactionArguments);\n return reactionPropertyMap;\n }, new Map());\n }\n /**\n * Binds unbound property functions to the specified `bind` property\n *\n * @param properties properties to check for functions\n */\n _bindFunctionProperty(property, bind) {\n if (typeof property === 'function' && !property[noBind] && isWidgetBaseConstructor(property) === false) {\n if (this._bindFunctionPropertyMap === undefined) {\n this._bindFunctionPropertyMap = new WeakMap();\n }\n const bindInfo = this._bindFunctionPropertyMap.get(property) || {};\n let { boundFunc, scope } = bindInfo;\n if (boundFunc === undefined || scope !== bind) {\n boundFunc = property.bind(bind);\n this._bindFunctionPropertyMap.set(property, { boundFunc, scope: bind });\n }\n return boundFunc;\n }\n return property;\n }\n get registry() {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n return this._registry;\n }\n _runBeforeProperties(properties) {\n const beforeProperties = this.getDecorator('beforeProperties');\n if (beforeProperties.length > 0) {\n return beforeProperties.reduce((properties, beforePropertiesFunction) => {\n return Object.assign({}, properties, beforePropertiesFunction.call(this, properties));\n }, Object.assign({}, properties));\n }\n return properties;\n }\n /**\n * Run all registered before renders and return the updated render method\n */\n _runBeforeRenders() {\n const beforeRenders = this.getDecorator('beforeRender');\n if (beforeRenders.length > 0) {\n return beforeRenders.reduce((render, beforeRenderFunction) => {\n const updatedRender = beforeRenderFunction.call(this, render, this._properties, this._children);\n if (!updatedRender) {\n console.warn('Render function not returned from beforeRender, using previous render');\n return render;\n }\n return updatedRender;\n }, this._boundRenderFunc);\n }\n return this._boundRenderFunc;\n }\n /**\n * Run all registered after renders and return the decorated DNodes\n *\n * @param dNode The DNodes to run through the after renders\n */\n runAfterRenders(dNode) {\n const afterRenders = this.getDecorator('afterRender');\n if (afterRenders.length > 0) {\n return afterRenders.reduce((dNode, afterRenderFunction) => {\n return afterRenderFunction.call(this, dNode);\n }, dNode);\n }\n if (this._metaMap !== undefined) {\n this._metaMap.forEach((meta) => {\n meta.afterRender();\n });\n }\n return dNode;\n }\n _runAfterConstructors() {\n const afterConstructors = this.getDecorator('afterConstructor');\n if (afterConstructors.length > 0) {\n afterConstructors.forEach((afterConstructor) => afterConstructor.call(this));\n }\n }\n own(handle) {\n this._handles.push(handle);\n }\n destroy() {\n while (this._handles.length > 0) {\n const handle = this._handles.pop();\n if (handle) {\n handle.destroy();\n }\n }\n }\n}\n/**\n * static identifier\n */\nWidgetBase._type = WIDGET_BASE_TYPE;\nexport default WidgetBase;\n//# sourceMappingURL=WidgetBase.mjs.map" + "source": "import Map from '../shim/Map';\nimport WeakMap from '../shim/WeakMap';\nimport Symbol from '../shim/Symbol';\nimport { v } from './d';\nimport { auto } from './diff';\nimport RegistryHandler from './RegistryHandler';\nimport NodeHandler from './NodeHandler';\nimport { widgetInstanceMap } from './vdom';\nimport { isWidgetBaseConstructor, WIDGET_BASE_TYPE } from './Registry';\nconst decoratorMap = new Map();\nconst boundAuto = auto.bind(null);\nexport const noBind = Symbol.for('dojoNoBind');\n/**\n * Main widget base for all widgets to extend\n */\nexport class WidgetBase {\n /**\n * @constructor\n */\n constructor() {\n /**\n * Indicates if it is the initial set properties cycle\n */\n this._initialProperties = true;\n /**\n * Array of property keys considered changed from the previous set properties\n */\n this._changedPropertyKeys = [];\n this._nodeHandler = new NodeHandler();\n this._handles = [];\n this._children = [];\n this._decoratorCache = new Map();\n this._properties = {};\n this._boundRenderFunc = this.render.bind(this);\n this._boundInvalidate = this.invalidate.bind(this);\n widgetInstanceMap.set(this, {\n dirty: true,\n onAttach: () => {\n this.onAttach();\n },\n onDetach: () => {\n this.onDetach();\n this.destroy();\n },\n nodeHandler: this._nodeHandler,\n registry: () => {\n return this.registry;\n },\n coreProperties: {},\n rendering: false,\n inputProperties: {}\n });\n this._runAfterConstructors();\n }\n meta(MetaType) {\n if (this._metaMap === undefined) {\n this._metaMap = new Map();\n }\n let cached = this._metaMap.get(MetaType);\n if (!cached) {\n cached = new MetaType({\n invalidate: this._boundInvalidate,\n nodeHandler: this._nodeHandler,\n bind: this\n });\n this.own(cached);\n this._metaMap.set(MetaType, cached);\n }\n return cached;\n }\n onAttach() {\n // Do nothing by default.\n }\n onDetach() {\n // Do nothing by default.\n }\n get properties() {\n return this._properties;\n }\n get changedPropertyKeys() {\n return [...this._changedPropertyKeys];\n }\n __setCoreProperties__(coreProperties) {\n const { baseRegistry } = coreProperties;\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.coreProperties.baseRegistry !== baseRegistry) {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n this._registry.base = baseRegistry;\n this.invalidate();\n }\n instanceData.coreProperties = coreProperties;\n }\n __setProperties__(originalProperties) {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.inputProperties = originalProperties;\n const properties = this._runBeforeProperties(originalProperties);\n const registeredDiffPropertyNames = this.getDecorator('registeredDiffProperty');\n const changedPropertyKeys = [];\n const propertyNames = Object.keys(properties);\n if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) {\n const allProperties = [...propertyNames, ...Object.keys(this._properties)];\n const checkedProperties = [];\n const diffPropertyResults = {};\n let runReactions = false;\n for (let i = 0; i < allProperties.length; i++) {\n const propertyName = allProperties[i];\n if (checkedProperties.indexOf(propertyName) !== -1) {\n continue;\n }\n checkedProperties.push(propertyName);\n const previousProperty = this._properties[propertyName];\n const newProperty = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n if (registeredDiffPropertyNames.indexOf(propertyName) !== -1) {\n runReactions = true;\n const diffFunctions = this.getDecorator(`diffProperty:${propertyName}`);\n for (let i = 0; i < diffFunctions.length; i++) {\n const result = diffFunctions[i](previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n else {\n const result = boundAuto(previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n if (runReactions) {\n const reactionFunctions = this.getDecorator('diffReaction');\n const executedReactions = [];\n reactionFunctions.forEach(({ reaction, propertyName }) => {\n const propertyChanged = changedPropertyKeys.indexOf(propertyName) !== -1;\n const reactionRun = executedReactions.indexOf(reaction) !== -1;\n if (propertyChanged && !reactionRun) {\n reaction.call(this, this._properties, diffPropertyResults);\n executedReactions.push(reaction);\n }\n });\n }\n this._properties = diffPropertyResults;\n this._changedPropertyKeys = changedPropertyKeys;\n }\n else {\n this._initialProperties = false;\n for (let i = 0; i < propertyNames.length; i++) {\n const propertyName = propertyNames[i];\n if (typeof properties[propertyName] === 'function') {\n properties[propertyName] = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n }\n else {\n changedPropertyKeys.push(propertyName);\n }\n }\n this._changedPropertyKeys = changedPropertyKeys;\n this._properties = Object.assign({}, properties);\n }\n if (this._changedPropertyKeys.length > 0) {\n this.invalidate();\n }\n }\n get children() {\n return this._children;\n }\n __setChildren__(children) {\n if (this._children.length > 0 || children.length > 0) {\n this._children = children;\n this.invalidate();\n }\n }\n __render__() {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.dirty = false;\n const render = this._runBeforeRenders();\n let dNode = render();\n dNode = this.runAfterRenders(dNode);\n this._nodeHandler.clear();\n return dNode;\n }\n invalidate() {\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.invalidate) {\n instanceData.invalidate();\n }\n }\n render() {\n return v('div', {}, this.children);\n }\n /**\n * Function to add decorators to WidgetBase\n *\n * @param decoratorKey The key of the decorator\n * @param value The value of the decorator\n */\n addDecorator(decoratorKey, value) {\n value = Array.isArray(value) ? value : [value];\n if (this.hasOwnProperty('constructor')) {\n let decoratorList = decoratorMap.get(this.constructor);\n if (!decoratorList) {\n decoratorList = new Map();\n decoratorMap.set(this.constructor, decoratorList);\n }\n let specificDecoratorList = decoratorList.get(decoratorKey);\n if (!specificDecoratorList) {\n specificDecoratorList = [];\n decoratorList.set(decoratorKey, specificDecoratorList);\n }\n specificDecoratorList.push(...value);\n }\n else {\n const decorators = this.getDecorator(decoratorKey);\n this._decoratorCache.set(decoratorKey, [...decorators, ...value]);\n }\n }\n /**\n * Function to build the list of decorators from the global decorator map.\n *\n * @param decoratorKey The key of the decorator\n * @return An array of decorator values\n * @private\n */\n _buildDecoratorList(decoratorKey) {\n const allDecorators = [];\n let constructor = this.constructor;\n while (constructor) {\n const instanceMap = decoratorMap.get(constructor);\n if (instanceMap) {\n const decorators = instanceMap.get(decoratorKey);\n if (decorators) {\n allDecorators.unshift(...decorators);\n }\n }\n constructor = Object.getPrototypeOf(constructor);\n }\n return allDecorators;\n }\n /**\n * Function to retrieve decorator values\n *\n * @param decoratorKey The key of the decorator\n * @returns An array of decorator values\n */\n getDecorator(decoratorKey) {\n let allDecorators = this._decoratorCache.get(decoratorKey);\n if (allDecorators !== undefined) {\n return allDecorators;\n }\n allDecorators = this._buildDecoratorList(decoratorKey);\n this._decoratorCache.set(decoratorKey, allDecorators);\n return allDecorators;\n }\n /**\n * Binds unbound property functions to the specified `bind` property\n *\n * @param properties properties to check for functions\n */\n _bindFunctionProperty(property, bind) {\n if (typeof property === 'function' && !property[noBind] && isWidgetBaseConstructor(property) === false) {\n if (this._bindFunctionPropertyMap === undefined) {\n this._bindFunctionPropertyMap = new WeakMap();\n }\n const bindInfo = this._bindFunctionPropertyMap.get(property) || {};\n let { boundFunc, scope } = bindInfo;\n if (boundFunc === undefined || scope !== bind) {\n boundFunc = property.bind(bind);\n this._bindFunctionPropertyMap.set(property, { boundFunc, scope: bind });\n }\n return boundFunc;\n }\n return property;\n }\n get registry() {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n return this._registry;\n }\n _runBeforeProperties(properties) {\n const beforeProperties = this.getDecorator('beforeProperties');\n if (beforeProperties.length > 0) {\n return beforeProperties.reduce((properties, beforePropertiesFunction) => {\n return Object.assign({}, properties, beforePropertiesFunction.call(this, properties));\n }, Object.assign({}, properties));\n }\n return properties;\n }\n /**\n * Run all registered before renders and return the updated render method\n */\n _runBeforeRenders() {\n const beforeRenders = this.getDecorator('beforeRender');\n if (beforeRenders.length > 0) {\n return beforeRenders.reduce((render, beforeRenderFunction) => {\n const updatedRender = beforeRenderFunction.call(this, render, this._properties, this._children);\n if (!updatedRender) {\n console.warn('Render function not returned from beforeRender, using previous render');\n return render;\n }\n return updatedRender;\n }, this._boundRenderFunc);\n }\n return this._boundRenderFunc;\n }\n /**\n * Run all registered after renders and return the decorated DNodes\n *\n * @param dNode The DNodes to run through the after renders\n */\n runAfterRenders(dNode) {\n const afterRenders = this.getDecorator('afterRender');\n if (afterRenders.length > 0) {\n dNode = afterRenders.reduce((dNode, afterRenderFunction) => {\n return afterRenderFunction.call(this, dNode);\n }, dNode);\n }\n if (this._metaMap !== undefined) {\n this._metaMap.forEach((meta) => {\n meta.afterRender();\n });\n }\n return dNode;\n }\n _runAfterConstructors() {\n const afterConstructors = this.getDecorator('afterConstructor');\n if (afterConstructors.length > 0) {\n afterConstructors.forEach((afterConstructor) => afterConstructor.call(this));\n }\n }\n own(handle) {\n this._handles.push(handle);\n }\n destroy() {\n while (this._handles.length > 0) {\n const handle = this._handles.pop();\n if (handle) {\n handle.destroy();\n }\n }\n }\n}\n/**\n * static identifier\n */\nWidgetBase._type = WIDGET_BASE_TYPE;\nexport default WidgetBase;\n//# sourceMappingURL=WidgetBase.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/animations/cssTransitions.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\animations\\cssTransitions.mjs", - "name": "./node_modules/@dojo/widget-core/animations/cssTransitions.mjs", + "id": "./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\animations\\cssTransitions.mjs", + "name": "./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs", "index": 33, "index2": 27, "size": 2288, @@ -1555,18 +1555,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "../animations/cssTransitions", "loc": "3:0-58" @@ -1583,12 +1583,12 @@ "source": "let browserSpecificTransitionEndEventName = '';\nlet browserSpecificAnimationEndEventName = '';\nfunction determineBrowserStyleNames(element) {\n if ('WebkitTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'webkitTransitionEnd';\n browserSpecificAnimationEndEventName = 'webkitAnimationEnd';\n }\n else if ('transition' in element.style || 'MozTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'transitionend';\n browserSpecificAnimationEndEventName = 'animationend';\n }\n else {\n throw new Error('Your browser is not supported');\n }\n}\nfunction initialize(element) {\n if (browserSpecificAnimationEndEventName === '') {\n determineBrowserStyleNames(element);\n }\n}\nfunction runAndCleanUp(element, startAnimation, finishAnimation) {\n initialize(element);\n let finished = false;\n let transitionEnd = function () {\n if (!finished) {\n finished = true;\n element.removeEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n element.removeEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n finishAnimation();\n }\n };\n startAnimation();\n element.addEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n element.addEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n}\nfunction exit(node, properties, exitAnimation, removeNode) {\n const activeClass = properties.exitAnimationActive || `${exitAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(exitAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n removeNode();\n });\n}\nfunction enter(node, properties, enterAnimation) {\n const activeClass = properties.enterAnimationActive || `${enterAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(enterAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n node.classList.remove(enterAnimation);\n node.classList.remove(activeClass);\n });\n}\nexport default {\n enter,\n exit\n};\n//# sourceMappingURL=cssTransitions.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/d.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\d.mjs", - "name": "./node_modules/@dojo/widget-core/d.mjs", + "id": "./node_modules/@dojo/framework/widget-core/d.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\d.mjs", + "name": "./node_modules/@dojo/framework/widget-core/d.mjs", "index": 4, "index2": 8, - "size": 3270, + "size": 3267, "cacheable": true, "built": true, "optional": false, @@ -1597,54 +1597,54 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./d", "loc": "5:0-29" }, { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./d", "loc": "4:0-24" }, + { + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "type": "harmony import", + "userRequest": "./../d", + "loc": "5:0-27" + }, { "moduleId": "./src/menu/Menu.ts", "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--3-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\umd-compat-loader\\index.js??ref--3-1!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\ts-loader\\index.js??ref--3-2!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\css-module-dts-loader\\index.js?type=ts&instanceName=0_menu!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\src\\menu\\Menu.ts", "module": "./src/menu/Menu.ts", "moduleName": "./src/menu/Menu.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/d", - "loc": "2:0-40" - }, - { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "type": "harmony import", - "userRequest": "./../d", - "loc": "5:0-27" + "userRequest": "@dojo/framework/widget-core/d", + "loc": "2:0-50" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", "userRequest": "./d", "loc": "3:0-65" @@ -1675,12 +1675,12 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import Symbol from '@dojo/shim/Symbol';\n/**\n * The symbol identifier for a WNode type\n */\nexport const WNODE = Symbol('Identifier for a WNode.');\n/**\n * The symbol identifier for a VNode type\n */\nexport const VNODE = Symbol('Identifier for a VNode.');\n/**\n * The symbol identifier for a VNode type created using dom()\n */\nexport const DOMVNODE = Symbol('Identifier for a VNode created using existing dom.');\n/**\n * Helper function that returns true if the `DNode` is a `WNode` using the `type` property\n */\nexport function isWNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === WNODE);\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` using the `type` property\n */\nexport function isVNode(child) {\n return Boolean(child && typeof child !== 'string' && (child.type === VNODE || child.type === DOMVNODE));\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` created with `dom()` using the `type` property\n */\nexport function isDomVNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === DOMVNODE);\n}\nexport function isElementNode(value) {\n return !!value.tagName;\n}\nexport function decorate(dNodes, optionsOrModifier, predicate) {\n let shallow = false;\n let modifier;\n if (typeof optionsOrModifier === 'function') {\n modifier = optionsOrModifier;\n }\n else {\n modifier = optionsOrModifier.modifier;\n predicate = optionsOrModifier.predicate;\n shallow = optionsOrModifier.shallow || false;\n }\n let nodes = Array.isArray(dNodes) ? [...dNodes] : [dNodes];\n function breaker() {\n nodes = [];\n }\n while (nodes.length) {\n const node = nodes.shift();\n if (node) {\n if (!shallow && (isWNode(node) || isVNode(node)) && node.children) {\n nodes = [...nodes, ...node.children];\n }\n if (!predicate || predicate(node)) {\n modifier(node, breaker);\n }\n }\n }\n return dNodes;\n}\n/**\n * Wrapper function for calls to create a widget.\n */\nexport function w(widgetConstructor, properties, children = []) {\n return {\n children,\n widgetConstructor,\n properties,\n type: WNODE\n };\n}\nexport function v(tag, propertiesOrChildren = {}, children = undefined) {\n let properties = propertiesOrChildren;\n let deferredPropertiesCallback;\n if (Array.isArray(propertiesOrChildren)) {\n children = propertiesOrChildren;\n properties = {};\n }\n if (typeof properties === 'function') {\n deferredPropertiesCallback = properties;\n properties = {};\n }\n return {\n tag,\n deferredPropertiesCallback,\n children,\n properties,\n type: VNODE\n };\n}\n/**\n * Create a VNode for an existing DOM Node.\n */\nexport function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, children) {\n return {\n tag: isElementNode(node) ? node.tagName.toLowerCase() : '',\n properties: props,\n attributes: attrs,\n events: on,\n children,\n type: DOMVNODE,\n domNode: node,\n text: isElementNode(node) ? undefined : node.data,\n diffType\n };\n}\n//# sourceMappingURL=d.mjs.map" + "source": "import Symbol from '../shim/Symbol';\n/**\n * The symbol identifier for a WNode type\n */\nexport const WNODE = Symbol('Identifier for a WNode.');\n/**\n * The symbol identifier for a VNode type\n */\nexport const VNODE = Symbol('Identifier for a VNode.');\n/**\n * The symbol identifier for a VNode type created using dom()\n */\nexport const DOMVNODE = Symbol('Identifier for a VNode created using existing dom.');\n/**\n * Helper function that returns true if the `DNode` is a `WNode` using the `type` property\n */\nexport function isWNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === WNODE);\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` using the `type` property\n */\nexport function isVNode(child) {\n return Boolean(child && typeof child !== 'string' && (child.type === VNODE || child.type === DOMVNODE));\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` created with `dom()` using the `type` property\n */\nexport function isDomVNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === DOMVNODE);\n}\nexport function isElementNode(value) {\n return !!value.tagName;\n}\nexport function decorate(dNodes, optionsOrModifier, predicate) {\n let shallow = false;\n let modifier;\n if (typeof optionsOrModifier === 'function') {\n modifier = optionsOrModifier;\n }\n else {\n modifier = optionsOrModifier.modifier;\n predicate = optionsOrModifier.predicate;\n shallow = optionsOrModifier.shallow || false;\n }\n let nodes = Array.isArray(dNodes) ? [...dNodes] : [dNodes];\n function breaker() {\n nodes = [];\n }\n while (nodes.length) {\n const node = nodes.shift();\n if (node) {\n if (!shallow && (isWNode(node) || isVNode(node)) && node.children) {\n nodes = [...nodes, ...node.children];\n }\n if (!predicate || predicate(node)) {\n modifier(node, breaker);\n }\n }\n }\n return dNodes;\n}\n/**\n * Wrapper function for calls to create a widget.\n */\nexport function w(widgetConstructor, properties, children = []) {\n return {\n children,\n widgetConstructor,\n properties,\n type: WNODE\n };\n}\nexport function v(tag, propertiesOrChildren = {}, children = undefined) {\n let properties = propertiesOrChildren;\n let deferredPropertiesCallback;\n if (Array.isArray(propertiesOrChildren)) {\n children = propertiesOrChildren;\n properties = {};\n }\n if (typeof properties === 'function') {\n deferredPropertiesCallback = properties;\n properties = {};\n }\n return {\n tag,\n deferredPropertiesCallback,\n children,\n properties,\n type: VNODE\n };\n}\n/**\n * Create a VNode for an existing DOM Node.\n */\nexport function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, children) {\n return {\n tag: isElementNode(node) ? node.tagName.toLowerCase() : '',\n properties: props,\n attributes: attrs,\n events: on,\n children,\n type: DOMVNODE,\n domNode: node,\n text: isElementNode(node) ? undefined : node.data,\n diffType\n };\n}\n//# sourceMappingURL=d.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\afterRender.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\afterRender.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", "index": 34, "index2": 29, "size": 311, @@ -1692,18 +1692,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "./../decorators/afterRender", "loc": "4:0-58" @@ -1721,9 +1721,9 @@ "source": "import { handleDecorator } from './handleDecorator';\nexport function afterRender(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('afterRender', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default afterRender;\n//# sourceMappingURL=afterRender.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\alwaysRender.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\alwaysRender.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "index": 41, "index2": 36, "size": 365, @@ -1735,18 +1735,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./decorators/alwaysRender", "loc": "8:0-57" @@ -1764,9 +1764,9 @@ "source": "import { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\nexport function alwaysRender() {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function () {\n this.invalidate();\n })(target);\n });\n}\nexport default alwaysRender;\n//# sourceMappingURL=alwaysRender.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\beforeProperties.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\beforeProperties.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", "index": 39, "index2": 32, "size": 331, @@ -1778,27 +1778,27 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\alwaysRender.mjs", - "issuerId": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "issuerName": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\alwaysRender.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\alwaysRender.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\alwaysRender.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "type": "harmony import", "userRequest": "./beforeProperties", "loc": "2:0-54" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\inject.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\inject.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "type": "harmony import", "userRequest": "./beforeProperties", "loc": "3:0-54" @@ -1816,9 +1816,9 @@ "source": "import { handleDecorator } from './handleDecorator';\nexport function beforeProperties(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('beforeProperties', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default beforeProperties;\n//# sourceMappingURL=beforeProperties.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\customElement.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\customElement.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", "index": 12, "index2": 38, "size": 728, @@ -1843,8 +1843,8 @@ "module": "./src/menu/Menu.ts", "moduleName": "./src/menu/Menu.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/decorators/customElement", - "loc": "3:0-75" + "userRequest": "@dojo/framework/widget-core/decorators/customElement", + "loc": "3:0-85" } ], "usedExports": [ @@ -1886,12 +1886,12 @@ "depth": 0 }, { - "id": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\diffProperty.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\diffProperty.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", "index": 40, "index2": 34, - "size": 973, + "size": 1014, "cacheable": true, "built": true, "optional": false, @@ -1900,18 +1900,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../decorators/diffProperty", "loc": "5:0-60" @@ -1926,12 +1926,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { handleDecorator } from './handleDecorator';\n/**\n * Decorator that can be used to register a function as a specific property diff\n *\n * @param propertyName The name of the property of which the diff function is applied\n * @param diffType The diff type, default is DiffType.AUTO.\n * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM\n */\nexport function diffProperty(propertyName, diffFunction, reactionFunction) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null));\n target.addDecorator('registeredDiffProperty', propertyName);\n if (reactionFunction || propertyKey) {\n target.addDecorator('diffReaction', {\n propertyName,\n reaction: propertyKey ? target[propertyKey] : reactionFunction\n });\n }\n });\n}\nexport default diffProperty;\n//# sourceMappingURL=diffProperty.mjs.map" + "source": "import { handleDecorator } from './handleDecorator';\nimport { auto } from './../diff';\n/**\n * Decorator that can be used to register a function as a specific property diff\n *\n * @param propertyName The name of the property of which the diff function is applied\n * @param diffType The diff type, default is DiffType.AUTO.\n * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM\n */\nexport function diffProperty(propertyName, diffFunction = auto, reactionFunction) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null));\n target.addDecorator('registeredDiffProperty', propertyName);\n if (reactionFunction || propertyKey) {\n target.addDecorator('diffReaction', {\n propertyName,\n reaction: propertyKey ? target[propertyKey] : reactionFunction\n });\n }\n });\n}\nexport default diffProperty;\n//# sourceMappingURL=diffProperty.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\handleDecorator.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\handleDecorator.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs", "index": 35, "index2": 28, "size": 512, @@ -1943,63 +1943,63 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../decorators/handleDecorator", "loc": "4:0-66" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\alwaysRender.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\alwaysRender.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\afterRender.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\afterRender.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\inject.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\inject.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "2:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\diffProperty.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\diffProperty.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\beforeProperties.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\beforeProperties.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" @@ -2017,9 +2017,9 @@ "source": "/**\n * Generic decorator handler to take care of whether or not the decorator was called at the class level\n * or the method level.\n *\n * @param handler\n */\nexport function handleDecorator(handler) {\n return function (target, propertyKey, descriptor) {\n if (typeof target === 'function') {\n handler(target.prototype, undefined);\n }\n else {\n handler(target, propertyKey);\n }\n };\n}\nexport default handleDecorator;\n//# sourceMappingURL=handleDecorator.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\inject.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\inject.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "index": 38, "index2": 33, "size": 1532, @@ -2031,18 +2031,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../decorators/inject", "loc": "3:0-48" @@ -2057,12 +2057,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import WeakMap from '@dojo/shim/WeakMap';\nimport { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\n/**\n * Map of instances against registered injectors.\n */\nconst registeredInjectorsMap = new WeakMap();\n/**\n * Decorator retrieves an injector from an available registry using the name and\n * calls the `getProperties` function with the payload from the injector\n * and current properties with the the injected properties returned.\n *\n * @param InjectConfig the inject configuration\n */\nexport function inject({ name, getProperties }) {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function (properties) {\n const injectorItem = this.registry.getInjector(name);\n if (injectorItem) {\n const { injector, invalidator } = injectorItem;\n const registeredInjectors = registeredInjectorsMap.get(this) || [];\n if (registeredInjectors.length === 0) {\n registeredInjectorsMap.set(this, registeredInjectors);\n }\n if (registeredInjectors.indexOf(injectorItem) === -1) {\n this.own(invalidator.on('invalidate', () => {\n this.invalidate();\n }));\n registeredInjectors.push(injectorItem);\n }\n return getProperties(injector(), properties);\n }\n })(target);\n });\n}\nexport default inject;\n//# sourceMappingURL=inject.mjs.map" + "source": "import WeakMap from '../../shim/WeakMap';\nimport { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\n/**\n * Map of instances against registered injectors.\n */\nconst registeredInjectorsMap = new WeakMap();\n/**\n * Decorator retrieves an injector from an available registry using the name and\n * calls the `getProperties` function with the payload from the injector\n * and current properties with the the injected properties returned.\n *\n * @param InjectConfig the inject configuration\n */\nexport function inject({ name, getProperties }) {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function (properties) {\n const injectorItem = this.registry.getInjector(name);\n if (injectorItem) {\n const { injector, invalidator } = injectorItem;\n const registeredInjectors = registeredInjectorsMap.get(this) || [];\n if (registeredInjectors.length === 0) {\n registeredInjectorsMap.set(this, registeredInjectors);\n }\n if (registeredInjectors.indexOf(injectorItem) === -1) {\n this.own(invalidator.on('invalidate', () => {\n this.invalidate();\n }));\n registeredInjectors.push(injectorItem);\n }\n return getProperties(injector(), properties);\n }\n })(target);\n });\n}\nexport default inject;\n//# sourceMappingURL=inject.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/diff.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\diff.mjs", - "name": "./node_modules/@dojo/widget-core/diff.mjs", + "id": "./node_modules/@dojo/framework/widget-core/diff.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\diff.mjs", + "name": "./node_modules/@dojo/framework/widget-core/diff.mjs", "index": 20, "index2": 20, "size": 1930, @@ -2074,30 +2074,39 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./diff", "loc": "5:0-30" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../diff", "loc": "6:0-36" + }, + { + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\diffProperty.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "type": "harmony import", + "userRequest": "./../diff", + "loc": "2:0-33" } ], "usedExports": [ @@ -2116,12 +2125,12 @@ "source": "import { WIDGET_BASE_TYPE } from './Registry';\nfunction isObjectOrArray(value) {\n return Object.prototype.toString.call(value) === '[object Object]' || Array.isArray(value);\n}\nexport function always(previousProperty, newProperty) {\n return {\n changed: true,\n value: newProperty\n };\n}\nexport function ignore(previousProperty, newProperty) {\n return {\n changed: false,\n value: newProperty\n };\n}\nexport function reference(previousProperty, newProperty) {\n return {\n changed: previousProperty !== newProperty,\n value: newProperty\n };\n}\nexport function shallow(previousProperty, newProperty) {\n let changed = false;\n const validOldProperty = previousProperty && isObjectOrArray(previousProperty);\n const validNewProperty = newProperty && isObjectOrArray(newProperty);\n if (!validOldProperty || !validNewProperty) {\n return {\n changed: true,\n value: newProperty\n };\n }\n const previousKeys = Object.keys(previousProperty);\n const newKeys = Object.keys(newProperty);\n if (previousKeys.length !== newKeys.length) {\n changed = true;\n }\n else {\n changed = newKeys.some((key) => {\n return newProperty[key] !== previousProperty[key];\n });\n }\n return {\n changed,\n value: newProperty\n };\n}\nexport function auto(previousProperty, newProperty) {\n let result;\n if (typeof newProperty === 'function') {\n if (newProperty._type === WIDGET_BASE_TYPE) {\n result = reference(previousProperty, newProperty);\n }\n else {\n result = ignore(previousProperty, newProperty);\n }\n }\n else if (isObjectOrArray(newProperty)) {\n result = shallow(previousProperty, newProperty);\n }\n else {\n result = reference(previousProperty, newProperty);\n }\n return result;\n}\n//# sourceMappingURL=diff.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "name": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "id": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "name": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "index": 32, "index2": 30, - "size": 5852, + "size": 5683, "cacheable": true, "built": true, "optional": false, @@ -2130,18 +2139,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./mixins/Projector", "loc": "3:0-52" @@ -2158,15 +2167,15 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import * as tslib_1 from \"tslib\";\nimport { assign } from '@dojo/core/lang';\nimport cssTransitions from '../animations/cssTransitions';\nimport { afterRender } from './../decorators/afterRender';\nimport { v } from './../d';\nimport { dom } from './../vdom';\n/**\n * Represents the attach state of the projector\n */\nexport var ProjectorAttachState;\n(function (ProjectorAttachState) {\n ProjectorAttachState[ProjectorAttachState[\"Attached\"] = 1] = \"Attached\";\n ProjectorAttachState[ProjectorAttachState[\"Detached\"] = 2] = \"Detached\";\n})(ProjectorAttachState || (ProjectorAttachState = {}));\n/**\n * Attach type for the projector\n */\nexport var AttachType;\n(function (AttachType) {\n AttachType[AttachType[\"Append\"] = 1] = \"Append\";\n AttachType[AttachType[\"Merge\"] = 2] = \"Merge\";\n})(AttachType || (AttachType = {}));\nexport function ProjectorMixin(Base) {\n class Projector extends Base {\n constructor(...args) {\n super(...args);\n this._root = document.body;\n this._async = true;\n this._projectorProperties = {};\n this._projectionOptions = {\n transitions: cssTransitions\n };\n this.root = document.body;\n this.projectorState = ProjectorAttachState.Detached;\n }\n append(root) {\n const options = {\n type: AttachType.Append,\n root\n };\n return this._attach(options);\n }\n merge(root) {\n const options = {\n type: AttachType.Merge,\n root\n };\n return this._attach(options);\n }\n set root(root) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change root element');\n }\n this._root = root;\n }\n get root() {\n return this._root;\n }\n get async() {\n return this._async;\n }\n set async(async) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change async mode');\n }\n this._async = async;\n }\n sandbox(doc = document) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot create sandbox');\n }\n this._async = false;\n const previousRoot = this.root;\n /* free up the document fragment for GC */\n this.own({\n destroy: () => {\n this._root = previousRoot;\n }\n });\n this._attach({\n /* DocumentFragment is not assignable to Element, but provides everything needed to work */\n root: doc.createDocumentFragment(),\n type: AttachType.Append\n });\n }\n setChildren(children) {\n this.__setChildren__(children);\n }\n setProperties(properties) {\n this.__setProperties__(properties);\n }\n __setProperties__(properties) {\n if (this._projectorProperties && this._projectorProperties.registry !== properties.registry) {\n if (this._projectorProperties.registry) {\n this._projectorProperties.registry.destroy();\n }\n }\n this._projectorProperties = assign({}, properties);\n super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry });\n super.__setProperties__(properties);\n }\n toHtml() {\n if (this.projectorState !== ProjectorAttachState.Attached || !this._projection) {\n throw new Error('Projector is not attached, cannot return an HTML string of projection.');\n }\n return this._projection.domNode.childNodes[0].outerHTML;\n }\n afterRender(result) {\n let node = result;\n if (typeof result === 'string' || result === null || result === undefined) {\n node = v('span', {}, [result]);\n }\n return node;\n }\n destroy() {\n super.destroy();\n }\n _attach({ type, root }) {\n if (root) {\n this.root = root;\n }\n if (this._attachHandle) {\n return this._attachHandle;\n }\n this.projectorState = ProjectorAttachState.Attached;\n const handle = {\n destroy: () => {\n if (this.projectorState === ProjectorAttachState.Attached) {\n this._projection = undefined;\n this.projectorState = ProjectorAttachState.Detached;\n }\n }\n };\n this.own(handle);\n this._attachHandle = handle;\n this._projectionOptions = Object.assign({}, this._projectionOptions, { sync: !this._async });\n switch (type) {\n case AttachType.Append:\n this._projection = dom.append(this.root, this, this._projectionOptions);\n break;\n case AttachType.Merge:\n this._projection = dom.merge(this.root, this, this._projectionOptions);\n break;\n }\n return this._attachHandle;\n }\n }\n tslib_1.__decorate([\n afterRender(),\n tslib_1.__metadata(\"design:type\", Function),\n tslib_1.__metadata(\"design:paramtypes\", [Object]),\n tslib_1.__metadata(\"design:returntype\", void 0)\n ], Projector.prototype, \"afterRender\", null);\n return Projector;\n}\nexport default ProjectorMixin;\n//# sourceMappingURL=Projector.mjs.map" + "source": "import * as tslib_1 from \"tslib\";\nimport { assign } from '../../core/lang';\nimport cssTransitions from '../animations/cssTransitions';\nimport { afterRender } from './../decorators/afterRender';\nimport { v } from './../d';\nimport { dom } from './../vdom';\n/**\n * Represents the attach state of the projector\n */\nexport var ProjectorAttachState;\n(function (ProjectorAttachState) {\n ProjectorAttachState[ProjectorAttachState[\"Attached\"] = 1] = \"Attached\";\n ProjectorAttachState[ProjectorAttachState[\"Detached\"] = 2] = \"Detached\";\n})(ProjectorAttachState || (ProjectorAttachState = {}));\n/**\n * Attach type for the projector\n */\nexport var AttachType;\n(function (AttachType) {\n AttachType[AttachType[\"Append\"] = 1] = \"Append\";\n AttachType[AttachType[\"Merge\"] = 2] = \"Merge\";\n})(AttachType || (AttachType = {}));\nexport function ProjectorMixin(Base) {\n class Projector extends Base {\n constructor(...args) {\n super(...args);\n this._root = document.body;\n this._async = true;\n this._projectorProperties = {};\n this._projectionOptions = {\n transitions: cssTransitions\n };\n this.root = document.body;\n this.projectorState = ProjectorAttachState.Detached;\n }\n append(root) {\n const options = {\n type: AttachType.Append,\n root\n };\n return this._attach(options);\n }\n merge(root) {\n const options = {\n type: AttachType.Merge,\n root\n };\n return this._attach(options);\n }\n set root(root) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change root element');\n }\n this._root = root;\n }\n get root() {\n return this._root;\n }\n get async() {\n return this._async;\n }\n set async(async) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change async mode');\n }\n this._async = async;\n }\n sandbox(doc = document) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot create sandbox');\n }\n this._async = false;\n const previousRoot = this.root;\n /* free up the document fragment for GC */\n this.own({\n destroy: () => {\n this._root = previousRoot;\n }\n });\n this._attach({\n /* DocumentFragment is not assignable to Element, but provides everything needed to work */\n root: doc.createDocumentFragment(),\n type: AttachType.Append\n });\n }\n setChildren(children) {\n this.__setChildren__(children);\n }\n setProperties(properties) {\n this.__setProperties__(properties);\n }\n __setProperties__(properties) {\n if (this._projectorProperties && this._projectorProperties.registry !== properties.registry) {\n if (this._projectorProperties.registry) {\n this._projectorProperties.registry.destroy();\n }\n }\n this._projectorProperties = assign({}, properties);\n super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry });\n super.__setProperties__(properties);\n }\n toHtml() {\n if (this.projectorState !== ProjectorAttachState.Attached || !this._projection) {\n throw new Error('Projector is not attached, cannot return an HTML string of projection.');\n }\n return this._projection.domNode.childNodes[0].outerHTML;\n }\n afterRender(result) {\n let node = result;\n if (typeof result === 'string' || result === null || result === undefined) {\n node = v('span', {}, [result]);\n }\n return node;\n }\n destroy() {\n super.destroy();\n }\n _attach({ type, root }) {\n if (root) {\n this.root = root;\n }\n if (this._attachHandle) {\n return this._attachHandle;\n }\n this.projectorState = ProjectorAttachState.Attached;\n const handle = {\n destroy: () => {\n if (this.projectorState === ProjectorAttachState.Attached) {\n this._projection = undefined;\n this.projectorState = ProjectorAttachState.Detached;\n }\n }\n };\n this.own(handle);\n this._attachHandle = handle;\n this._projectionOptions = Object.assign({}, this._projectionOptions, { sync: !this._async });\n switch (type) {\n case AttachType.Append:\n this._projection = dom.append(this.root, this, this._projectionOptions);\n break;\n case AttachType.Merge:\n this._projection = dom.merge(this.root, this, this._projectionOptions);\n break;\n }\n return this._attachHandle;\n }\n }\n tslib_1.__decorate([\n afterRender()\n ], Projector.prototype, \"afterRender\", null);\n return Projector;\n}\nexport default ProjectorMixin;\n//# sourceMappingURL=Projector.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "name": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "id": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "name": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "index": 36, "index2": 35, - "size": 5320, + "size": 5157, "cacheable": true, "built": true, "optional": false, @@ -2175,18 +2184,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./mixins/Themed", "loc": "7:0-56" @@ -2197,8 +2206,8 @@ "module": "./src/menu/Menu.ts", "moduleName": "./src/menu/Menu.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/mixins/Themed", - "loc": "4:0-69" + "userRequest": "@dojo/framework/widget-core/mixins/Themed", + "loc": "4:0-79" } ], "usedExports": [ @@ -2215,15 +2224,15 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import * as tslib_1 from \"tslib\";\nimport { Injector } from './../Injector';\nimport { inject } from './../decorators/inject';\nimport { handleDecorator } from './../decorators/handleDecorator';\nimport { diffProperty } from './../decorators/diffProperty';\nimport { shallow } from './../diff';\nconst THEME_KEY = ' _key';\nexport const INJECTED_THEME_KEY = Symbol('theme');\n/**\n * Decorator for base css classes\n */\nexport function theme(theme) {\n return handleDecorator((target) => {\n target.addDecorator('baseThemeClasses', theme);\n });\n}\n/**\n * Creates a reverse lookup for the classes passed in via the `theme` function.\n *\n * @param classes The baseClasses object\n * @requires\n */\nfunction createThemeClassesLookup(classes) {\n return classes.reduce((currentClassNames, baseClass) => {\n Object.keys(baseClass).forEach((key) => {\n currentClassNames[baseClass[key]] = key;\n });\n return currentClassNames;\n }, {});\n}\n/**\n * Convenience function that is given a theme and an optional registry, the theme\n * injector is defined against the registry, returning the theme.\n *\n * @param theme the theme to set\n * @param themeRegistry registry to define the theme injector against. Defaults\n * to the global registry\n *\n * @returns the theme injector used to set the theme\n */\nexport function registerThemeInjector(theme, themeRegistry) {\n const themeInjector = new Injector(theme);\n themeRegistry.defineInjector(INJECTED_THEME_KEY, (invalidator) => {\n themeInjector.setInvalidator(invalidator);\n return () => themeInjector.get();\n });\n return themeInjector;\n}\n/**\n * Function that returns a class decorated with with Themed functionality\n */\nexport function ThemedMixin(Base) {\n let Themed = class Themed extends Base {\n constructor() {\n super(...arguments);\n /**\n * Registered base theme keys\n */\n this._registeredBaseThemeKeys = [];\n /**\n * Indicates if classes meta data need to be calculated.\n */\n this._recalculateClasses = true;\n /**\n * Loaded theme\n */\n this._theme = {};\n }\n theme(classes) {\n if (this._recalculateClasses) {\n this._recalculateThemeClasses();\n }\n if (Array.isArray(classes)) {\n return classes.map((className) => this._getThemeClass(className));\n }\n return this._getThemeClass(classes);\n }\n /**\n * Function fired when `theme` or `extraClasses` are changed.\n */\n onPropertiesChanged() {\n this._recalculateClasses = true;\n }\n _getThemeClass(className) {\n if (className === undefined || className === null) {\n return className;\n }\n const extraClasses = this.properties.extraClasses || {};\n const themeClassName = this._baseThemeClassesReverseLookup[className];\n let resultClassNames = [];\n if (!themeClassName) {\n console.warn(`Class name: '${className}' not found in theme`);\n return null;\n }\n if (extraClasses[themeClassName]) {\n resultClassNames.push(extraClasses[themeClassName]);\n }\n if (this._theme[themeClassName]) {\n resultClassNames.push(this._theme[themeClassName]);\n }\n else {\n resultClassNames.push(this._registeredBaseTheme[themeClassName]);\n }\n return resultClassNames.join(' ');\n }\n _recalculateThemeClasses() {\n const { theme = {} } = this.properties;\n const baseThemes = this.getDecorator('baseThemeClasses');\n if (!this._registeredBaseTheme) {\n this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => {\n const _a = THEME_KEY, key = baseTheme[_a], classes = tslib_1.__rest(baseTheme, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n this._registeredBaseThemeKeys.push(key);\n return Object.assign({}, finalBaseTheme, classes);\n }, {});\n this._baseThemeClassesReverseLookup = createThemeClassesLookup(baseThemes);\n }\n this._theme = this._registeredBaseThemeKeys.reduce((baseTheme, themeKey) => {\n return Object.assign({}, baseTheme, theme[themeKey]);\n }, {});\n this._recalculateClasses = false;\n }\n };\n tslib_1.__decorate([\n diffProperty('theme', shallow),\n diffProperty('extraClasses', shallow),\n tslib_1.__metadata(\"design:type\", Function),\n tslib_1.__metadata(\"design:paramtypes\", []),\n tslib_1.__metadata(\"design:returntype\", void 0)\n ], Themed.prototype, \"onPropertiesChanged\", null);\n Themed = tslib_1.__decorate([\n inject({\n name: INJECTED_THEME_KEY,\n getProperties: (theme, properties) => {\n if (!properties.theme) {\n return { theme };\n }\n return {};\n }\n })\n ], Themed);\n return Themed;\n}\nexport default ThemedMixin;\n//# sourceMappingURL=Themed.mjs.map" + "source": "import * as tslib_1 from \"tslib\";\nimport { Injector } from './../Injector';\nimport { inject } from './../decorators/inject';\nimport { handleDecorator } from './../decorators/handleDecorator';\nimport { diffProperty } from './../decorators/diffProperty';\nimport { shallow } from './../diff';\nconst THEME_KEY = ' _key';\nexport const INJECTED_THEME_KEY = Symbol('theme');\n/**\n * Decorator for base css classes\n */\nexport function theme(theme) {\n return handleDecorator((target) => {\n target.addDecorator('baseThemeClasses', theme);\n });\n}\n/**\n * Creates a reverse lookup for the classes passed in via the `theme` function.\n *\n * @param classes The baseClasses object\n * @requires\n */\nfunction createThemeClassesLookup(classes) {\n return classes.reduce((currentClassNames, baseClass) => {\n Object.keys(baseClass).forEach((key) => {\n currentClassNames[baseClass[key]] = key;\n });\n return currentClassNames;\n }, {});\n}\n/**\n * Convenience function that is given a theme and an optional registry, the theme\n * injector is defined against the registry, returning the theme.\n *\n * @param theme the theme to set\n * @param themeRegistry registry to define the theme injector against. Defaults\n * to the global registry\n *\n * @returns the theme injector used to set the theme\n */\nexport function registerThemeInjector(theme, themeRegistry) {\n const themeInjector = new Injector(theme);\n themeRegistry.defineInjector(INJECTED_THEME_KEY, (invalidator) => {\n themeInjector.setInvalidator(invalidator);\n return () => themeInjector.get();\n });\n return themeInjector;\n}\n/**\n * Function that returns a class decorated with with Themed functionality\n */\nexport function ThemedMixin(Base) {\n let Themed = class Themed extends Base {\n constructor() {\n super(...arguments);\n /**\n * Registered base theme keys\n */\n this._registeredBaseThemeKeys = [];\n /**\n * Indicates if classes meta data need to be calculated.\n */\n this._recalculateClasses = true;\n /**\n * Loaded theme\n */\n this._theme = {};\n }\n theme(classes) {\n if (this._recalculateClasses) {\n this._recalculateThemeClasses();\n }\n if (Array.isArray(classes)) {\n return classes.map((className) => this._getThemeClass(className));\n }\n return this._getThemeClass(classes);\n }\n /**\n * Function fired when `theme` or `extraClasses` are changed.\n */\n onPropertiesChanged() {\n this._recalculateClasses = true;\n }\n _getThemeClass(className) {\n if (className === undefined || className === null) {\n return className;\n }\n const extraClasses = this.properties.extraClasses || {};\n const themeClassName = this._baseThemeClassesReverseLookup[className];\n let resultClassNames = [];\n if (!themeClassName) {\n console.warn(`Class name: '${className}' not found in theme`);\n return null;\n }\n if (extraClasses[themeClassName]) {\n resultClassNames.push(extraClasses[themeClassName]);\n }\n if (this._theme[themeClassName]) {\n resultClassNames.push(this._theme[themeClassName]);\n }\n else {\n resultClassNames.push(this._registeredBaseTheme[themeClassName]);\n }\n return resultClassNames.join(' ');\n }\n _recalculateThemeClasses() {\n const { theme = {} } = this.properties;\n const baseThemes = this.getDecorator('baseThemeClasses');\n if (!this._registeredBaseTheme) {\n this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => {\n const _a = THEME_KEY, key = baseTheme[_a], classes = tslib_1.__rest(baseTheme, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n this._registeredBaseThemeKeys.push(key);\n return Object.assign({}, finalBaseTheme, classes);\n }, {});\n this._baseThemeClassesReverseLookup = createThemeClassesLookup(baseThemes);\n }\n this._theme = this._registeredBaseThemeKeys.reduce((baseTheme, themeKey) => {\n return Object.assign({}, baseTheme, theme[themeKey]);\n }, {});\n this._recalculateClasses = false;\n }\n };\n tslib_1.__decorate([\n diffProperty('theme', shallow),\n diffProperty('extraClasses', shallow)\n ], Themed.prototype, \"onPropertiesChanged\", null);\n Themed = tslib_1.__decorate([\n inject({\n name: INJECTED_THEME_KEY,\n getProperties: (theme, properties) => {\n if (!properties.theme) {\n return { theme };\n }\n return {};\n }\n })\n ], Themed);\n return Themed;\n}\nexport default ThemedMixin;\n//# sourceMappingURL=Themed.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "name": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "id": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "name": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "index": 13, "index2": 37, - "size": 9124, + "size": 9118, "cacheable": true, "built": true, "optional": false, @@ -2245,14 +2254,14 @@ "module": "./node_modules/imports-loader?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js", "moduleName": "./node_modules/imports-loader?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js", "type": "cjs require", - "userRequest": "@dojo/widget-core/registerCustomElement", - "loc": "4:28-78" + "userRequest": "@dojo/framework/widget-core/registerCustomElement", + "loc": "4:28-88" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\customElement.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\customElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", "type": "harmony import", "userRequest": "../registerCustomElement", "loc": "1:0-66" @@ -2268,15 +2277,15 @@ ], "optimizationBailout": [], "depth": 2, - "source": "import * as tslib_1 from \"tslib\";\nimport { WidgetBase, noBind } from './WidgetBase';\nimport { ProjectorMixin } from './mixins/Projector';\nimport { from } from '@dojo/shim/array';\nimport { w, dom } from './d';\nimport global from '@dojo/shim/global';\nimport { registerThemeInjector } from './mixins/Themed';\nimport { alwaysRender } from './decorators/alwaysRender';\nexport var CustomElementChildType;\n(function (CustomElementChildType) {\n CustomElementChildType[\"DOJO\"] = \"DOJO\";\n CustomElementChildType[\"NODE\"] = \"NODE\";\n CustomElementChildType[\"TEXT\"] = \"TEXT\";\n})(CustomElementChildType || (CustomElementChildType = {}));\nexport function DomToWidgetWrapper(domNode) {\n let DomToWidgetWrapper = class DomToWidgetWrapper extends WidgetBase {\n render() {\n const properties = Object.keys(this.properties).reduce((props, key) => {\n const value = this.properties[key];\n if (key.indexOf('on') === 0) {\n key = `__${key}`;\n }\n props[key] = value;\n return props;\n }, {});\n return dom({ node: domNode, props: properties, diffType: 'dom' });\n }\n static get domNode() {\n return domNode;\n }\n };\n DomToWidgetWrapper = tslib_1.__decorate([\n alwaysRender()\n ], DomToWidgetWrapper);\n return DomToWidgetWrapper;\n}\nexport function create(descriptor, WidgetConstructor) {\n const { attributes, childType, registryFactory } = descriptor;\n const attributeMap = {};\n attributes.forEach((propertyName) => {\n const attributeName = propertyName.toLowerCase();\n attributeMap[attributeName] = propertyName;\n });\n return class extends HTMLElement {\n constructor() {\n super(...arguments);\n this._properties = {};\n this._children = [];\n this._eventProperties = {};\n this._initialised = false;\n }\n connectedCallback() {\n if (this._initialised) {\n return;\n }\n const domProperties = {};\n const { attributes, properties, events } = descriptor;\n this._properties = Object.assign({}, this._properties, this._attributesToProperties(attributes));\n [...attributes, ...properties].forEach((propertyName) => {\n const value = this[propertyName];\n const filteredPropertyName = propertyName.replace(/^on/, '__');\n if (value !== undefined) {\n this._properties[propertyName] = value;\n }\n if (filteredPropertyName !== propertyName) {\n domProperties[filteredPropertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n }\n domProperties[propertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n });\n events.forEach((propertyName) => {\n const eventName = propertyName.replace(/^on/, '').toLowerCase();\n const filteredPropertyName = propertyName.replace(/^on/, '__on');\n domProperties[filteredPropertyName] = {\n get: () => this._getEventProperty(propertyName),\n set: (value) => this._setEventProperty(propertyName, value)\n };\n this._eventProperties[propertyName] = undefined;\n this._properties[propertyName] = (...args) => {\n const eventCallback = this._getEventProperty(propertyName);\n if (typeof eventCallback === 'function') {\n eventCallback(...args);\n }\n this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: false,\n detail: args\n }));\n };\n });\n Object.defineProperties(this, domProperties);\n const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children;\n from(children).forEach((childNode) => {\n if (childType === CustomElementChildType.DOJO) {\n childNode.addEventListener('dojo-ce-render', () => this._render());\n childNode.addEventListener('dojo-ce-connected', () => this._render());\n this._children.push(DomToWidgetWrapper(childNode));\n }\n else {\n this._children.push(dom({ node: childNode, diffType: 'dom' }));\n }\n });\n this.addEventListener('dojo-ce-connected', (e) => this._childConnected(e));\n const widgetProperties = this._properties;\n const renderChildren = () => this.__children__();\n const Wrapper = class extends WidgetBase {\n render() {\n return w(WidgetConstructor, widgetProperties, renderChildren());\n }\n };\n const registry = registryFactory();\n const themeContext = registerThemeInjector(this._getTheme(), registry);\n global.addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme()));\n const Projector = ProjectorMixin(Wrapper);\n this._projector = new Projector();\n this._projector.setProperties({ registry });\n this._projector.append(this);\n this._initialised = true;\n this.dispatchEvent(new CustomEvent('dojo-ce-connected', {\n bubbles: true,\n detail: this\n }));\n }\n _getTheme() {\n if (global && global.dojoce && global.dojoce.theme) {\n return global.dojoce.themes[global.dojoce.theme];\n }\n }\n _childConnected(e) {\n const node = e.detail;\n if (node.parentNode === this) {\n const exists = this._children.some((child) => child.domNode === node);\n if (!exists) {\n node.addEventListener('dojo-ce-render', () => this._render());\n this._children.push(DomToWidgetWrapper(node));\n this._render();\n }\n }\n }\n _render() {\n if (this._projector) {\n this._projector.invalidate();\n this.dispatchEvent(new CustomEvent('dojo-ce-render', {\n bubbles: false,\n detail: this\n }));\n }\n }\n __properties__() {\n return Object.assign({}, this._properties, this._eventProperties);\n }\n __children__() {\n if (childType === CustomElementChildType.DOJO) {\n return this._children.filter((Child) => Child.domNode.isWidget).map((Child) => {\n const { domNode } = Child;\n return w(Child, Object.assign({}, domNode.__properties__()), [...domNode.__children__()]);\n });\n }\n else {\n return this._children;\n }\n }\n attributeChangedCallback(name, oldValue, value) {\n const propertyName = attributeMap[name];\n this._setProperty(propertyName, value);\n }\n _setEventProperty(propertyName, value) {\n this._eventProperties[propertyName] = value;\n }\n _getEventProperty(propertyName) {\n return this._eventProperties[propertyName];\n }\n _setProperty(propertyName, value) {\n if (typeof value === 'function') {\n value[noBind] = true;\n }\n this._properties[propertyName] = value;\n this._render();\n }\n _getProperty(propertyName) {\n return this._properties[propertyName];\n }\n _attributesToProperties(attributes) {\n return attributes.reduce((properties, propertyName) => {\n const attributeName = propertyName.toLowerCase();\n const value = this.getAttribute(attributeName);\n if (value !== null) {\n properties[propertyName] = value;\n }\n return properties;\n }, {});\n }\n static get observedAttributes() {\n return Object.keys(attributeMap);\n }\n get isWidget() {\n return true;\n }\n };\n}\nexport function register(WidgetConstructor) {\n const descriptor = WidgetConstructor.prototype && WidgetConstructor.prototype.__customElementDescriptor;\n if (!descriptor) {\n throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?');\n }\n global.customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor));\n}\nexport default register;\n//# sourceMappingURL=registerCustomElement.mjs.map" + "source": "import * as tslib_1 from \"tslib\";\nimport { WidgetBase, noBind } from './WidgetBase';\nimport { ProjectorMixin } from './mixins/Projector';\nimport { from } from '../shim/array';\nimport { w, dom } from './d';\nimport global from '../shim/global';\nimport { registerThemeInjector } from './mixins/Themed';\nimport { alwaysRender } from './decorators/alwaysRender';\nexport var CustomElementChildType;\n(function (CustomElementChildType) {\n CustomElementChildType[\"DOJO\"] = \"DOJO\";\n CustomElementChildType[\"NODE\"] = \"NODE\";\n CustomElementChildType[\"TEXT\"] = \"TEXT\";\n})(CustomElementChildType || (CustomElementChildType = {}));\nexport function DomToWidgetWrapper(domNode) {\n let DomToWidgetWrapper = class DomToWidgetWrapper extends WidgetBase {\n render() {\n const properties = Object.keys(this.properties).reduce((props, key) => {\n const value = this.properties[key];\n if (key.indexOf('on') === 0) {\n key = `__${key}`;\n }\n props[key] = value;\n return props;\n }, {});\n return dom({ node: domNode, props: properties, diffType: 'dom' });\n }\n static get domNode() {\n return domNode;\n }\n };\n DomToWidgetWrapper = tslib_1.__decorate([\n alwaysRender()\n ], DomToWidgetWrapper);\n return DomToWidgetWrapper;\n}\nexport function create(descriptor, WidgetConstructor) {\n const { attributes, childType, registryFactory } = descriptor;\n const attributeMap = {};\n attributes.forEach((propertyName) => {\n const attributeName = propertyName.toLowerCase();\n attributeMap[attributeName] = propertyName;\n });\n return class extends HTMLElement {\n constructor() {\n super(...arguments);\n this._properties = {};\n this._children = [];\n this._eventProperties = {};\n this._initialised = false;\n }\n connectedCallback() {\n if (this._initialised) {\n return;\n }\n const domProperties = {};\n const { attributes, properties, events } = descriptor;\n this._properties = Object.assign({}, this._properties, this._attributesToProperties(attributes));\n [...attributes, ...properties].forEach((propertyName) => {\n const value = this[propertyName];\n const filteredPropertyName = propertyName.replace(/^on/, '__');\n if (value !== undefined) {\n this._properties[propertyName] = value;\n }\n if (filteredPropertyName !== propertyName) {\n domProperties[filteredPropertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n }\n domProperties[propertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n });\n events.forEach((propertyName) => {\n const eventName = propertyName.replace(/^on/, '').toLowerCase();\n const filteredPropertyName = propertyName.replace(/^on/, '__on');\n domProperties[filteredPropertyName] = {\n get: () => this._getEventProperty(propertyName),\n set: (value) => this._setEventProperty(propertyName, value)\n };\n this._eventProperties[propertyName] = undefined;\n this._properties[propertyName] = (...args) => {\n const eventCallback = this._getEventProperty(propertyName);\n if (typeof eventCallback === 'function') {\n eventCallback(...args);\n }\n this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: false,\n detail: args\n }));\n };\n });\n Object.defineProperties(this, domProperties);\n const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children;\n from(children).forEach((childNode) => {\n if (childType === CustomElementChildType.DOJO) {\n childNode.addEventListener('dojo-ce-render', () => this._render());\n childNode.addEventListener('dojo-ce-connected', () => this._render());\n this._children.push(DomToWidgetWrapper(childNode));\n }\n else {\n this._children.push(dom({ node: childNode, diffType: 'dom' }));\n }\n });\n this.addEventListener('dojo-ce-connected', (e) => this._childConnected(e));\n const widgetProperties = this._properties;\n const renderChildren = () => this.__children__();\n const Wrapper = class extends WidgetBase {\n render() {\n return w(WidgetConstructor, widgetProperties, renderChildren());\n }\n };\n const registry = registryFactory();\n const themeContext = registerThemeInjector(this._getTheme(), registry);\n global.addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme()));\n const Projector = ProjectorMixin(Wrapper);\n this._projector = new Projector();\n this._projector.setProperties({ registry });\n this._projector.append(this);\n this._initialised = true;\n this.dispatchEvent(new CustomEvent('dojo-ce-connected', {\n bubbles: true,\n detail: this\n }));\n }\n _getTheme() {\n if (global && global.dojoce && global.dojoce.theme) {\n return global.dojoce.themes[global.dojoce.theme];\n }\n }\n _childConnected(e) {\n const node = e.detail;\n if (node.parentNode === this) {\n const exists = this._children.some((child) => child.domNode === node);\n if (!exists) {\n node.addEventListener('dojo-ce-render', () => this._render());\n this._children.push(DomToWidgetWrapper(node));\n this._render();\n }\n }\n }\n _render() {\n if (this._projector) {\n this._projector.invalidate();\n this.dispatchEvent(new CustomEvent('dojo-ce-render', {\n bubbles: false,\n detail: this\n }));\n }\n }\n __properties__() {\n return Object.assign({}, this._properties, this._eventProperties);\n }\n __children__() {\n if (childType === CustomElementChildType.DOJO) {\n return this._children.filter((Child) => Child.domNode.isWidget).map((Child) => {\n const { domNode } = Child;\n return w(Child, Object.assign({}, domNode.__properties__()), [...domNode.__children__()]);\n });\n }\n else {\n return this._children;\n }\n }\n attributeChangedCallback(name, oldValue, value) {\n const propertyName = attributeMap[name];\n this._setProperty(propertyName, value);\n }\n _setEventProperty(propertyName, value) {\n this._eventProperties[propertyName] = value;\n }\n _getEventProperty(propertyName) {\n return this._eventProperties[propertyName];\n }\n _setProperty(propertyName, value) {\n if (typeof value === 'function') {\n value[noBind] = true;\n }\n this._properties[propertyName] = value;\n this._render();\n }\n _getProperty(propertyName) {\n return this._properties[propertyName];\n }\n _attributesToProperties(attributes) {\n return attributes.reduce((properties, propertyName) => {\n const attributeName = propertyName.toLowerCase();\n const value = this.getAttribute(attributeName);\n if (value !== null) {\n properties[propertyName] = value;\n }\n return properties;\n }, {});\n }\n static get observedAttributes() {\n return Object.keys(attributeMap);\n }\n get isWidget() {\n return true;\n }\n };\n}\nexport function register(WidgetConstructor) {\n const descriptor = WidgetConstructor.prototype && WidgetConstructor.prototype.__customElementDescriptor;\n if (!descriptor) {\n throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?');\n }\n global.customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor));\n}\nexport default register;\n//# sourceMappingURL=registerCustomElement.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/vdom.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\vdom.mjs", - "name": "./node_modules/@dojo/widget-core/vdom.mjs", + "id": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\vdom.mjs", + "name": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "index": 29, "index2": 25, - "size": 39734, + "size": 40904, "cacheable": true, "built": true, "optional": false, @@ -2285,27 +2294,27 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./vdom", "loc": "8:0-43" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "./../vdom", "loc": "6:0-32" @@ -2324,7 +2333,7 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import global from '@dojo/shim/global';\r\nimport { from as arrayFrom } from '@dojo/shim/array';\r\nimport { isWNode, isVNode, isDomVNode, VNODE, WNODE } from './d';\r\nimport { isWidgetBaseConstructor } from './Registry';\r\nimport WeakMap from '@dojo/shim/WeakMap';\r\nconst NAMESPACE_W3 = 'http://www.w3.org/';\r\nconst NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg';\r\nconst NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink';\r\nconst emptyArray = [];\r\nexport const widgetInstanceMap = new WeakMap();\r\nconst instanceMap = new WeakMap();\r\nconst projectorStateMap = new WeakMap();\r\nfunction same(dnode1, dnode2) {\r\n if (isVNode(dnode1) && isVNode(dnode2)) {\r\n if (isDomVNode(dnode1) || isDomVNode(dnode2)) {\r\n if (dnode1.domNode !== dnode2.domNode) {\r\n return false;\r\n }\r\n }\r\n if (dnode1.tag !== dnode2.tag) {\r\n return false;\r\n }\r\n if (dnode1.properties.key !== dnode2.properties.key) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n else if (isWNode(dnode1) && isWNode(dnode2)) {\r\n if (dnode1.instance === undefined && typeof dnode2.widgetConstructor === 'string') {\r\n return false;\r\n }\r\n if (dnode1.widgetConstructor !== dnode2.widgetConstructor) {\r\n return false;\r\n }\r\n if (dnode1.properties.key !== dnode2.properties.key) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n return false;\r\n}\r\nconst missingTransition = function () {\r\n throw new Error('Provide a transitions object to the projectionOptions to do animations');\r\n};\r\nfunction getProjectionOptions(projectorOptions, projectorInstance) {\r\n const defaults = {\r\n namespace: undefined,\r\n styleApplyer: function (domNode, styleName, value) {\r\n domNode.style[styleName] = value;\r\n },\r\n transitions: {\r\n enter: missingTransition,\r\n exit: missingTransition\r\n },\r\n depth: 0,\r\n merge: false,\r\n sync: false,\r\n projectorInstance\r\n };\r\n return Object.assign({}, defaults, projectorOptions);\r\n}\r\nfunction checkStyleValue(styleValue) {\r\n if (typeof styleValue !== 'string') {\r\n throw new Error('Style values must be strings');\r\n }\r\n}\r\nfunction updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n const eventMap = projectorState.nodeMap.get(domNode) || new WeakMap();\r\n if (previousValue) {\r\n const previousEvent = eventMap.get(previousValue);\r\n domNode.removeEventListener(eventName, previousEvent);\r\n }\r\n let callback = currentValue.bind(bind);\r\n if (eventName === 'input') {\r\n callback = function (evt) {\r\n currentValue.call(this, evt);\r\n evt.target['oninput-value'] = evt.target.value;\r\n }.bind(bind);\r\n }\r\n domNode.addEventListener(eventName, callback);\r\n eventMap.set(currentValue, callback);\r\n projectorState.nodeMap.set(domNode, eventMap);\r\n}\r\nfunction addClasses(domNode, classes) {\r\n if (classes) {\r\n const classNames = classes.split(' ');\r\n for (let i = 0; i < classNames.length; i++) {\r\n domNode.classList.add(classNames[i]);\r\n }\r\n }\r\n}\r\nfunction removeClasses(domNode, classes) {\r\n if (classes) {\r\n const classNames = classes.split(' ');\r\n for (let i = 0; i < classNames.length; i++) {\r\n domNode.classList.remove(classNames[i]);\r\n }\r\n }\r\n}\r\nfunction buildPreviousProperties(domNode, previous, current) {\r\n const { diffType, properties, attributes } = current;\r\n if (!diffType || diffType === 'vdom') {\r\n return { properties: previous.properties, attributes: previous.attributes, events: previous.events };\r\n }\r\n else if (diffType === 'none') {\r\n return { properties: {}, attributes: previous.attributes ? {} : undefined, events: previous.events };\r\n }\r\n let newProperties = {\r\n properties: {}\r\n };\r\n if (attributes) {\r\n newProperties.attributes = {};\r\n newProperties.events = previous.events;\r\n Object.keys(properties).forEach((propName) => {\r\n newProperties.properties[propName] = domNode[propName];\r\n });\r\n Object.keys(attributes).forEach((attrName) => {\r\n newProperties.attributes[attrName] = domNode.getAttribute(attrName);\r\n });\r\n return newProperties;\r\n }\r\n newProperties.properties = Object.keys(properties).reduce((props, property) => {\r\n props[property] = domNode.getAttribute(property) || domNode[property];\r\n return props;\r\n }, {});\r\n return newProperties;\r\n}\r\nfunction focusNode(propValue, previousValue, domNode, projectionOptions) {\r\n let result;\r\n if (typeof propValue === 'function') {\r\n result = propValue();\r\n }\r\n else {\r\n result = propValue && !previousValue;\r\n }\r\n if (result === true) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectorState.deferredRenderCallbacks.push(() => {\r\n domNode.focus();\r\n });\r\n }\r\n}\r\nfunction removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions, onlyEvents = false) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n const eventMap = projectorState.nodeMap.get(domNode);\r\n if (eventMap) {\r\n Object.keys(previousProperties).forEach((propName) => {\r\n const isEvent = propName.substr(0, 2) === 'on' || onlyEvents;\r\n const eventName = onlyEvents ? propName : propName.substr(2);\r\n if (isEvent && !properties[propName]) {\r\n const eventCallback = eventMap.get(previousProperties[propName]);\r\n if (eventCallback) {\r\n domNode.removeEventListener(eventName, eventCallback);\r\n }\r\n }\r\n });\r\n }\r\n}\r\nfunction updateAttribute(domNode, attrName, attrValue, projectionOptions) {\r\n if (projectionOptions.namespace === NAMESPACE_SVG && attrName === 'href') {\r\n domNode.setAttributeNS(NAMESPACE_XLINK, attrName, attrValue);\r\n }\r\n else if ((attrName === 'role' && attrValue === '') || attrValue === undefined) {\r\n domNode.removeAttribute(attrName);\r\n }\r\n else {\r\n domNode.setAttribute(attrName, attrValue);\r\n }\r\n}\r\nfunction updateAttributes(domNode, previousAttributes, attributes, projectionOptions) {\r\n const attrNames = Object.keys(attributes);\r\n const attrCount = attrNames.length;\r\n for (let i = 0; i < attrCount; i++) {\r\n const attrName = attrNames[i];\r\n const attrValue = attributes[attrName];\r\n const previousAttrValue = previousAttributes[attrName];\r\n if (attrValue !== previousAttrValue) {\r\n updateAttribute(domNode, attrName, attrValue, projectionOptions);\r\n }\r\n }\r\n}\r\nfunction updateProperties(domNode, previousProperties, properties, projectionOptions, includesEventsAndAttributes = true) {\r\n let propertiesUpdated = false;\r\n const propNames = Object.keys(properties);\r\n const propCount = propNames.length;\r\n if (propNames.indexOf('classes') === -1 && previousProperties.classes) {\r\n if (Array.isArray(previousProperties.classes)) {\r\n for (let i = 0; i < previousProperties.classes.length; i++) {\r\n removeClasses(domNode, previousProperties.classes[i]);\r\n }\r\n }\r\n else {\r\n removeClasses(domNode, previousProperties.classes);\r\n }\r\n }\r\n includesEventsAndAttributes && removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions);\r\n for (let i = 0; i < propCount; i++) {\r\n const propName = propNames[i];\r\n let propValue = properties[propName];\r\n const previousValue = previousProperties[propName];\r\n if (propName === 'classes') {\r\n const previousClasses = Array.isArray(previousValue) ? previousValue : [previousValue];\r\n const currentClasses = Array.isArray(propValue) ? propValue : [propValue];\r\n if (previousClasses && previousClasses.length > 0) {\r\n if (!propValue || propValue.length === 0) {\r\n for (let i = 0; i < previousClasses.length; i++) {\r\n removeClasses(domNode, previousClasses[i]);\r\n }\r\n }\r\n else {\r\n const newClasses = [...currentClasses];\r\n for (let i = 0; i < previousClasses.length; i++) {\r\n const previousClassName = previousClasses[i];\r\n if (previousClassName) {\r\n const classIndex = newClasses.indexOf(previousClassName);\r\n if (classIndex === -1) {\r\n removeClasses(domNode, previousClassName);\r\n }\r\n else {\r\n newClasses.splice(classIndex, 1);\r\n }\r\n }\r\n }\r\n for (let i = 0; i < newClasses.length; i++) {\r\n addClasses(domNode, newClasses[i]);\r\n }\r\n }\r\n }\r\n else {\r\n for (let i = 0; i < currentClasses.length; i++) {\r\n addClasses(domNode, currentClasses[i]);\r\n }\r\n }\r\n }\r\n else if (propName === 'focus') {\r\n focusNode(propValue, previousValue, domNode, projectionOptions);\r\n }\r\n else if (propName === 'styles') {\r\n const styleNames = Object.keys(propValue);\r\n const styleCount = styleNames.length;\r\n for (let j = 0; j < styleCount; j++) {\r\n const styleName = styleNames[j];\r\n const newStyleValue = propValue[styleName];\r\n const oldStyleValue = previousValue && previousValue[styleName];\r\n if (newStyleValue === oldStyleValue) {\r\n continue;\r\n }\r\n propertiesUpdated = true;\r\n if (newStyleValue) {\r\n checkStyleValue(newStyleValue);\r\n projectionOptions.styleApplyer(domNode, styleName, newStyleValue);\r\n }\r\n else {\r\n projectionOptions.styleApplyer(domNode, styleName, '');\r\n }\r\n }\r\n }\r\n else {\r\n if (!propValue && typeof previousValue === 'string') {\r\n propValue = '';\r\n }\r\n if (propName === 'value') {\r\n const domValue = domNode[propName];\r\n if (domValue !== propValue &&\r\n (domNode['oninput-value']\r\n ? domValue === domNode['oninput-value']\r\n : propValue !== previousValue)) {\r\n domNode[propName] = propValue;\r\n domNode['oninput-value'] = undefined;\r\n }\r\n if (propValue !== previousValue) {\r\n propertiesUpdated = true;\r\n }\r\n }\r\n else if (propName !== 'key' && propValue !== previousValue) {\r\n const type = typeof propValue;\r\n if (type === 'function' && propName.lastIndexOf('on', 0) === 0 && includesEventsAndAttributes) {\r\n updateEvent(domNode, propName.substr(2), propValue, projectionOptions, properties.bind, previousValue);\r\n }\r\n else if (type === 'string' && propName !== 'innerHTML' && includesEventsAndAttributes) {\r\n updateAttribute(domNode, propName, propValue, projectionOptions);\r\n }\r\n else if (propName === 'scrollLeft' || propName === 'scrollTop') {\r\n if (domNode[propName] !== propValue) {\r\n domNode[propName] = propValue;\r\n }\r\n }\r\n else {\r\n domNode[propName] = propValue;\r\n }\r\n propertiesUpdated = true;\r\n }\r\n }\r\n }\r\n return propertiesUpdated;\r\n}\r\nfunction findIndexOfChild(children, sameAs, start) {\r\n for (let i = start; i < children.length; i++) {\r\n if (same(children[i], sameAs)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\nexport function toParentVNode(domNode) {\r\n return {\r\n tag: '',\r\n properties: {},\r\n children: undefined,\r\n domNode,\r\n type: VNODE\r\n };\r\n}\r\nexport function toTextVNode(data) {\r\n return {\r\n tag: '',\r\n properties: {},\r\n children: undefined,\r\n text: `${data}`,\r\n domNode: undefined,\r\n type: VNODE\r\n };\r\n}\r\nfunction toInternalWNode(instance, instanceData) {\r\n return {\r\n instance,\r\n rendered: [],\r\n coreProperties: instanceData.coreProperties,\r\n children: instance.children,\r\n widgetConstructor: instance.constructor,\r\n properties: instanceData.inputProperties,\r\n type: WNODE\r\n };\r\n}\r\nexport function filterAndDecorateChildren(children, instance) {\r\n if (children === undefined) {\r\n return emptyArray;\r\n }\r\n children = Array.isArray(children) ? children : [children];\r\n for (let i = 0; i < children.length;) {\r\n const child = children[i];\r\n if (child === undefined || child === null) {\r\n children.splice(i, 1);\r\n continue;\r\n }\r\n else if (typeof child === 'string') {\r\n children[i] = toTextVNode(child);\r\n }\r\n else {\r\n if (isVNode(child)) {\r\n if (child.properties.bind === undefined) {\r\n child.properties.bind = instance;\r\n if (child.children && child.children.length > 0) {\r\n filterAndDecorateChildren(child.children, instance);\r\n }\r\n }\r\n }\r\n else {\r\n if (!child.coreProperties) {\r\n const instanceData = widgetInstanceMap.get(instance);\r\n child.coreProperties = {\r\n bind: instance,\r\n baseRegistry: instanceData.coreProperties.baseRegistry\r\n };\r\n }\r\n if (child.children && child.children.length > 0) {\r\n filterAndDecorateChildren(child.children, instance);\r\n }\r\n }\r\n }\r\n i++;\r\n }\r\n return children;\r\n}\r\nfunction nodeAdded(dnode, transitions) {\r\n if (isVNode(dnode) && dnode.properties) {\r\n const enterAnimation = dnode.properties.enterAnimation;\r\n if (enterAnimation) {\r\n if (typeof enterAnimation === 'function') {\r\n enterAnimation(dnode.domNode, dnode.properties);\r\n }\r\n else {\r\n transitions.enter(dnode.domNode, dnode.properties, enterAnimation);\r\n }\r\n }\r\n }\r\n}\r\nfunction nodeToRemove(dnode, transitions, projectionOptions) {\r\n if (isWNode(dnode)) {\r\n const rendered = dnode.rendered || emptyArray;\r\n if (dnode.instance) {\r\n const instanceData = widgetInstanceMap.get(dnode.instance);\r\n instanceData.onDetach();\r\n instanceMap.delete(dnode.instance);\r\n }\r\n for (let i = 0; i < rendered.length; i++) {\r\n nodeToRemove(rendered[i], transitions, projectionOptions);\r\n }\r\n }\r\n else {\r\n const domNode = dnode.domNode;\r\n const properties = dnode.properties;\r\n if (dnode.children && dnode.children.length > 0) {\r\n for (let i = 0; i < dnode.children.length; i++) {\r\n nodeToRemove(dnode.children[i], transitions, projectionOptions);\r\n }\r\n }\r\n const exitAnimation = properties.exitAnimation;\r\n if (properties && exitAnimation) {\r\n domNode.style.pointerEvents = 'none';\r\n const removeDomNode = function () {\r\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\r\n dnode.domNode = undefined;\r\n };\r\n if (typeof exitAnimation === 'function') {\r\n exitAnimation(domNode, removeDomNode, properties);\r\n return;\r\n }\r\n else {\r\n transitions.exit(dnode.domNode, properties, exitAnimation, removeDomNode);\r\n return;\r\n }\r\n }\r\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\r\n dnode.domNode = undefined;\r\n }\r\n}\r\nfunction checkDistinguishable(childNodes, indexToCheck, parentInstance) {\r\n const childNode = childNodes[indexToCheck];\r\n if (isVNode(childNode) && !childNode.tag) {\r\n return; // Text nodes need not be distinguishable\r\n }\r\n const { key } = childNode.properties;\r\n if (key === undefined || key === null) {\r\n for (let i = 0; i < childNodes.length; i++) {\r\n if (i !== indexToCheck) {\r\n const node = childNodes[i];\r\n if (same(node, childNode)) {\r\n let nodeIdentifier;\r\n const parentName = parentInstance.constructor.name || 'unknown';\r\n if (isWNode(childNode)) {\r\n nodeIdentifier = childNode.widgetConstructor.name || 'unknown';\r\n }\r\n else {\r\n nodeIdentifier = childNode.tag;\r\n }\r\n console.warn(`A widget (${parentName}) has had a child addded or removed, but they were not able to uniquely identified. It is recommended to provide a unique 'key' property when using the same widget or element (${nodeIdentifier}) multiple times as siblings`);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\nfunction updateChildren(parentVNode, oldChildren, newChildren, parentInstance, projectionOptions) {\r\n oldChildren = oldChildren || emptyArray;\r\n newChildren = newChildren;\r\n const oldChildrenLength = oldChildren.length;\r\n const newChildrenLength = newChildren.length;\r\n const transitions = projectionOptions.transitions;\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\r\n let oldIndex = 0;\r\n let newIndex = 0;\r\n let i;\r\n let textUpdated = false;\r\n while (newIndex < newChildrenLength) {\r\n let oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : undefined;\r\n const newChild = newChildren[newIndex];\r\n if (isVNode(newChild) && typeof newChild.deferredPropertiesCallback === 'function') {\r\n newChild.inserted = isVNode(oldChild) && oldChild.inserted;\r\n addDeferredProperties(newChild, projectionOptions);\r\n }\r\n if (oldChild !== undefined && same(oldChild, newChild)) {\r\n textUpdated = updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance) || textUpdated;\r\n oldIndex++;\r\n newIndex++;\r\n continue;\r\n }\r\n const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);\r\n const addChild = () => {\r\n let insertBeforeDomNode = undefined;\r\n let child = oldChildren[oldIndex];\r\n if (child) {\r\n let nextIndex = oldIndex + 1;\r\n let insertBeforeChildren = [child];\r\n while (insertBeforeChildren.length) {\r\n const insertBefore = insertBeforeChildren.shift();\r\n if (isWNode(insertBefore)) {\r\n if (insertBefore.rendered) {\r\n insertBeforeChildren.push(...insertBefore.rendered);\r\n }\r\n }\r\n else {\r\n if (insertBefore.domNode) {\r\n insertBeforeDomNode = insertBefore.domNode;\r\n break;\r\n }\r\n }\r\n if (insertBeforeChildren.length === 0 && oldChildren[nextIndex]) {\r\n insertBeforeChildren.push(oldChildren[nextIndex]);\r\n nextIndex++;\r\n }\r\n }\r\n }\r\n createDom(newChild, parentVNode, insertBeforeDomNode, projectionOptions, parentInstance);\r\n nodeAdded(newChild, transitions);\r\n const indexToCheck = newIndex;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(newChildren, indexToCheck, parentInstance);\r\n });\r\n };\r\n if (!oldChild || findOldIndex === -1) {\r\n addChild();\r\n newIndex++;\r\n continue;\r\n }\r\n const removeChild = () => {\r\n const indexToCheck = oldIndex;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\r\n });\r\n if (isWNode(oldChild)) {\r\n const item = instanceMap.get(oldChild.instance);\r\n if (item) {\r\n oldChild = item.dnode;\r\n }\r\n }\r\n nodeToRemove(oldChild, transitions, projectionOptions);\r\n };\r\n const findNewIndex = findIndexOfChild(newChildren, oldChild, newIndex + 1);\r\n if (findNewIndex === -1) {\r\n removeChild();\r\n oldIndex++;\r\n continue;\r\n }\r\n addChild();\r\n removeChild();\r\n oldIndex++;\r\n newIndex++;\r\n }\r\n if (oldChildrenLength > oldIndex) {\r\n // Remove child fragments\r\n for (i = oldIndex; i < oldChildrenLength; i++) {\r\n const indexToCheck = i;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\r\n });\r\n let childToRemove = oldChildren[i];\r\n if (isWNode(childToRemove)) {\r\n const item = instanceMap.get(childToRemove.instance);\r\n if (item) {\r\n childToRemove = item.dnode;\r\n }\r\n }\r\n nodeToRemove(childToRemove, transitions, projectionOptions);\r\n }\r\n }\r\n return textUpdated;\r\n}\r\nfunction addChildren(parentVNode, children, projectionOptions, parentInstance, insertBefore = undefined, childNodes) {\r\n if (children === undefined) {\r\n return;\r\n }\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectorState.merge && childNodes === undefined) {\r\n childNodes = arrayFrom(parentVNode.domNode.childNodes);\r\n }\r\n const transitions = projectionOptions.transitions;\r\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n if (isVNode(child)) {\r\n if (projectorState.merge && childNodes) {\r\n let domElement = undefined;\r\n while (child.domNode === undefined && childNodes.length > 0) {\r\n domElement = childNodes.shift();\r\n if (domElement && domElement.tagName === (child.tag.toUpperCase() || undefined)) {\r\n child.domNode = domElement;\r\n }\r\n }\r\n }\r\n createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance);\r\n }\r\n else {\r\n createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes);\r\n }\r\n nodeAdded(child, transitions);\r\n }\r\n}\r\nfunction initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions) {\r\n addChildren(dnode, dnode.children, projectionOptions, parentInstance, undefined);\r\n if (typeof dnode.deferredPropertiesCallback === 'function' && dnode.inserted === undefined) {\r\n addDeferredProperties(dnode, projectionOptions);\r\n }\r\n if (dnode.attributes && dnode.events) {\r\n updateAttributes(domNode, {}, dnode.attributes, projectionOptions);\r\n updateProperties(domNode, {}, dnode.properties, projectionOptions, false);\r\n removeOrphanedEvents(domNode, {}, dnode.events, projectionOptions, true);\r\n const events = dnode.events;\r\n Object.keys(events).forEach((event) => {\r\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind);\r\n });\r\n }\r\n else {\r\n updateProperties(domNode, {}, dnode.properties, projectionOptions);\r\n }\r\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\r\n const instanceData = widgetInstanceMap.get(parentInstance);\r\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\r\n }\r\n dnode.inserted = true;\r\n}\r\nfunction createDom(dnode, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes) {\r\n let domNode;\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (isWNode(dnode)) {\r\n let { widgetConstructor } = dnode;\r\n const parentInstanceData = widgetInstanceMap.get(parentInstance);\r\n if (!isWidgetBaseConstructor(widgetConstructor)) {\r\n const item = parentInstanceData.registry().get(widgetConstructor);\r\n if (item === null) {\r\n return;\r\n }\r\n widgetConstructor = item;\r\n }\r\n const instance = new widgetConstructor();\r\n dnode.instance = instance;\r\n const instanceData = widgetInstanceMap.get(instance);\r\n instanceData.invalidate = () => {\r\n instanceData.dirty = true;\r\n if (instanceData.rendering === false) {\r\n projectorState.renderQueue.push({ instance, depth: projectionOptions.depth });\r\n scheduleRender(projectionOptions);\r\n }\r\n };\r\n instanceData.rendering = true;\r\n instance.__setCoreProperties__(dnode.coreProperties);\r\n instance.__setChildren__(dnode.children);\r\n instance.__setProperties__(dnode.properties);\r\n const rendered = instance.__render__();\r\n instanceData.rendering = false;\r\n if (rendered) {\r\n const filteredRendered = filterAndDecorateChildren(rendered, instance);\r\n dnode.rendered = filteredRendered;\r\n addChildren(parentVNode, filteredRendered, projectionOptions, instance, insertBefore, childNodes);\r\n }\r\n instanceMap.set(instance, { dnode, parentVNode });\r\n instanceData.nodeHandler.addRoot();\r\n projectorState.afterRenderCallbacks.push(() => {\r\n instanceData.onAttach();\r\n });\r\n }\r\n else {\r\n if (projectorState.merge && projectorState.mergeElement !== undefined) {\r\n domNode = dnode.domNode = projectionOptions.mergeElement;\r\n projectorState.mergeElement = undefined;\r\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\r\n return;\r\n }\r\n const doc = parentVNode.domNode.ownerDocument;\r\n if (!dnode.tag && typeof dnode.text === 'string') {\r\n if (dnode.domNode !== undefined && parentVNode.domNode) {\r\n const newDomNode = dnode.domNode.ownerDocument.createTextNode(dnode.text);\r\n if (parentVNode.domNode === dnode.domNode.parentNode) {\r\n parentVNode.domNode.replaceChild(newDomNode, dnode.domNode);\r\n }\r\n else {\r\n parentVNode.domNode.appendChild(newDomNode);\r\n dnode.domNode.parentNode && dnode.domNode.parentNode.removeChild(dnode.domNode);\r\n }\r\n dnode.domNode = newDomNode;\r\n }\r\n else {\r\n domNode = dnode.domNode = doc.createTextNode(dnode.text);\r\n if (insertBefore !== undefined) {\r\n parentVNode.domNode.insertBefore(domNode, insertBefore);\r\n }\r\n else {\r\n parentVNode.domNode.appendChild(domNode);\r\n }\r\n }\r\n }\r\n else {\r\n if (dnode.domNode === undefined) {\r\n if (dnode.tag === 'svg') {\r\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\r\n }\r\n if (projectionOptions.namespace !== undefined) {\r\n domNode = dnode.domNode = doc.createElementNS(projectionOptions.namespace, dnode.tag);\r\n }\r\n else {\r\n domNode = dnode.domNode = dnode.domNode || doc.createElement(dnode.tag);\r\n }\r\n }\r\n else {\r\n domNode = dnode.domNode;\r\n }\r\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\r\n if (insertBefore !== undefined) {\r\n parentVNode.domNode.insertBefore(domNode, insertBefore);\r\n }\r\n else if (domNode.parentNode !== parentVNode.domNode) {\r\n parentVNode.domNode.appendChild(domNode);\r\n }\r\n }\r\n }\r\n}\r\nfunction updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance) {\r\n if (isWNode(dnode)) {\r\n const { instance } = previous;\r\n const { parentVNode, dnode: node } = instanceMap.get(instance);\r\n const previousRendered = node ? node.rendered : previous.rendered;\r\n const instanceData = widgetInstanceMap.get(instance);\r\n instanceData.rendering = true;\r\n instance.__setCoreProperties__(dnode.coreProperties);\r\n instance.__setChildren__(dnode.children);\r\n instance.__setProperties__(dnode.properties);\r\n dnode.instance = instance;\r\n if (instanceData.dirty === true) {\r\n const rendered = instance.__render__();\r\n instanceData.rendering = false;\r\n dnode.rendered = filterAndDecorateChildren(rendered, instance);\r\n updateChildren(parentVNode, previousRendered, dnode.rendered, instance, projectionOptions);\r\n }\r\n else {\r\n instanceData.rendering = false;\r\n dnode.rendered = previousRendered;\r\n }\r\n instanceMap.set(instance, { dnode, parentVNode });\r\n instanceData.nodeHandler.addRoot();\r\n }\r\n else {\r\n if (previous === dnode) {\r\n return false;\r\n }\r\n const domNode = (dnode.domNode = previous.domNode);\r\n let textUpdated = false;\r\n let updated = false;\r\n if (!dnode.tag && typeof dnode.text === 'string') {\r\n if (dnode.text !== previous.text) {\r\n const newDomNode = domNode.ownerDocument.createTextNode(dnode.text);\r\n domNode.parentNode.replaceChild(newDomNode, domNode);\r\n dnode.domNode = newDomNode;\r\n textUpdated = true;\r\n return textUpdated;\r\n }\r\n }\r\n else {\r\n if (dnode.tag && dnode.tag.lastIndexOf('svg', 0) === 0) {\r\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\r\n }\r\n if (previous.children !== dnode.children) {\r\n const children = filterAndDecorateChildren(dnode.children, parentInstance);\r\n dnode.children = children;\r\n updated =\r\n updateChildren(dnode, previous.children, children, parentInstance, projectionOptions) || updated;\r\n }\r\n const previousProperties = buildPreviousProperties(domNode, previous, dnode);\r\n if (dnode.attributes && dnode.events) {\r\n updateAttributes(domNode, previousProperties.attributes, dnode.attributes, projectionOptions);\r\n updated =\r\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions, false) || updated;\r\n removeOrphanedEvents(domNode, previousProperties.events, dnode.events, projectionOptions, true);\r\n const events = dnode.events;\r\n Object.keys(events).forEach((event) => {\r\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind, previousProperties.events[event]);\r\n });\r\n }\r\n else {\r\n updated =\r\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions) ||\r\n updated;\r\n }\r\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\r\n const instanceData = widgetInstanceMap.get(parentInstance);\r\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\r\n }\r\n }\r\n if (updated && dnode.properties && dnode.properties.updateAnimation) {\r\n dnode.properties.updateAnimation(domNode, dnode.properties, previous.properties);\r\n }\r\n }\r\n}\r\nfunction addDeferredProperties(vnode, projectionOptions) {\r\n // transfer any properties that have been passed - as these must be decorated properties\r\n vnode.decoratedDeferredProperties = vnode.properties;\r\n const properties = vnode.deferredPropertiesCallback(!!vnode.inserted);\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n vnode.properties = Object.assign({}, properties, vnode.decoratedDeferredProperties);\r\n projectorState.deferredRenderCallbacks.push(() => {\r\n const properties = Object.assign({}, vnode.deferredPropertiesCallback(!!vnode.inserted), vnode.decoratedDeferredProperties);\r\n updateProperties(vnode.domNode, vnode.properties, properties, projectionOptions);\r\n vnode.properties = properties;\r\n });\r\n}\r\nfunction runDeferredRenderCallbacks(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectorState.deferredRenderCallbacks.length) {\r\n if (projectionOptions.sync) {\r\n while (projectorState.deferredRenderCallbacks.length) {\r\n const callback = projectorState.deferredRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n }\r\n else {\r\n global.requestAnimationFrame(() => {\r\n while (projectorState.deferredRenderCallbacks.length) {\r\n const callback = projectorState.deferredRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n }\r\n}\r\nfunction runAfterRenderCallbacks(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectionOptions.sync) {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n }\r\n else {\r\n if (global.requestIdleCallback) {\r\n global.requestIdleCallback(() => {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n else {\r\n setTimeout(() => {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n }\r\n}\r\nfunction scheduleRender(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectionOptions.sync) {\r\n render(projectionOptions);\r\n }\r\n else if (projectorState.renderScheduled === undefined) {\r\n projectorState.renderScheduled = global.requestAnimationFrame(() => {\r\n render(projectionOptions);\r\n });\r\n }\r\n}\r\nfunction render(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectorState.renderScheduled = undefined;\r\n const renderQueue = projectorState.renderQueue;\r\n const renders = [...renderQueue];\r\n projectorState.renderQueue = [];\r\n renders.sort((a, b) => a.depth - b.depth);\r\n const previouslyRendered = [];\r\n while (renders.length) {\r\n const { instance } = renders.shift();\r\n if (instanceMap.has(instance) && previouslyRendered.indexOf(instance) === -1) {\r\n previouslyRendered.push(instance);\r\n const { parentVNode, dnode } = instanceMap.get(instance);\r\n const instanceData = widgetInstanceMap.get(instance);\r\n updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance);\r\n }\r\n }\r\n runAfterRenderCallbacks(projectionOptions);\r\n runDeferredRenderCallbacks(projectionOptions);\r\n}\r\nexport const dom = {\r\n append: function (parentNode, instance, projectionOptions = {}) {\r\n const instanceData = widgetInstanceMap.get(instance);\r\n const finalProjectorOptions = getProjectionOptions(projectionOptions, instance);\r\n const projectorState = {\r\n afterRenderCallbacks: [],\r\n deferredRenderCallbacks: [],\r\n nodeMap: new WeakMap(),\r\n renderScheduled: undefined,\r\n renderQueue: [],\r\n merge: projectionOptions.merge || false,\r\n mergeElement: projectionOptions.mergeElement\r\n };\r\n projectorStateMap.set(instance, projectorState);\r\n finalProjectorOptions.rootNode = parentNode;\r\n const parentVNode = toParentVNode(finalProjectorOptions.rootNode);\r\n const node = toInternalWNode(instance, instanceData);\r\n instanceMap.set(instance, { dnode: node, parentVNode });\r\n instanceData.invalidate = () => {\r\n instanceData.dirty = true;\r\n if (instanceData.rendering === false) {\r\n projectorState.renderQueue.push({ instance, depth: finalProjectorOptions.depth });\r\n scheduleRender(finalProjectorOptions);\r\n }\r\n };\r\n updateDom(node, node, finalProjectorOptions, parentVNode, instance);\r\n projectorState.afterRenderCallbacks.push(() => {\r\n instanceData.onAttach();\r\n });\r\n runDeferredRenderCallbacks(finalProjectorOptions);\r\n runAfterRenderCallbacks(finalProjectorOptions);\r\n return {\r\n domNode: finalProjectorOptions.rootNode\r\n };\r\n },\r\n create: function (instance, projectionOptions) {\r\n return this.append(document.createElement('div'), instance, projectionOptions);\r\n },\r\n merge: function (element, instance, projectionOptions = {}) {\r\n projectionOptions.merge = true;\r\n projectionOptions.mergeElement = element;\r\n const projection = this.append(element.parentNode, instance, projectionOptions);\r\n const projectorState = projectorStateMap.get(instance);\r\n projectorState.merge = false;\r\n return projection;\r\n }\r\n};\r\n//# sourceMappingURL=vdom.mjs.map" + "source": "import global from '../shim/global';\r\nimport { from as arrayFrom } from '../shim/array';\r\nimport { isWNode, isVNode, isDomVNode, VNODE, WNODE } from './d';\r\nimport { isWidgetBaseConstructor } from './Registry';\r\nimport WeakMap from '../shim/WeakMap';\r\nconst NAMESPACE_W3 = 'http://www.w3.org/';\r\nconst NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg';\r\nconst NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink';\r\nconst emptyArray = [];\r\nconst nodeOperations = ['focus', 'blur', 'scrollIntoView', 'click'];\r\nexport const widgetInstanceMap = new WeakMap();\r\nconst instanceMap = new WeakMap();\r\nconst nextSiblingMap = new WeakMap();\r\nconst projectorStateMap = new WeakMap();\r\nfunction same(dnode1, dnode2) {\r\n if (isVNode(dnode1) && isVNode(dnode2)) {\r\n if (isDomVNode(dnode1) || isDomVNode(dnode2)) {\r\n if (dnode1.domNode !== dnode2.domNode) {\r\n return false;\r\n }\r\n }\r\n if (dnode1.tag !== dnode2.tag) {\r\n return false;\r\n }\r\n if (dnode1.properties.key !== dnode2.properties.key) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n else if (isWNode(dnode1) && isWNode(dnode2)) {\r\n if (dnode1.instance === undefined && typeof dnode2.widgetConstructor === 'string') {\r\n return false;\r\n }\r\n if (dnode1.widgetConstructor !== dnode2.widgetConstructor) {\r\n return false;\r\n }\r\n if (dnode1.properties.key !== dnode2.properties.key) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n return false;\r\n}\r\nconst missingTransition = function () {\r\n throw new Error('Provide a transitions object to the projectionOptions to do animations');\r\n};\r\nfunction getProjectionOptions(projectorOptions, projectorInstance) {\r\n const defaults = {\r\n namespace: undefined,\r\n styleApplyer: function (domNode, styleName, value) {\r\n domNode.style[styleName] = value;\r\n },\r\n transitions: {\r\n enter: missingTransition,\r\n exit: missingTransition\r\n },\r\n depth: 0,\r\n merge: false,\r\n sync: false,\r\n projectorInstance\r\n };\r\n return Object.assign({}, defaults, projectorOptions);\r\n}\r\nfunction checkStyleValue(styleValue) {\r\n if (typeof styleValue !== 'string') {\r\n throw new Error('Style values must be strings');\r\n }\r\n}\r\nfunction updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n const eventMap = projectorState.nodeMap.get(domNode) || new WeakMap();\r\n if (previousValue) {\r\n const previousEvent = eventMap.get(previousValue);\r\n domNode.removeEventListener(eventName, previousEvent);\r\n }\r\n let callback = currentValue.bind(bind);\r\n if (eventName === 'input') {\r\n callback = function (evt) {\r\n currentValue.call(this, evt);\r\n evt.target['oninput-value'] = evt.target.value;\r\n }.bind(bind);\r\n }\r\n domNode.addEventListener(eventName, callback);\r\n eventMap.set(currentValue, callback);\r\n projectorState.nodeMap.set(domNode, eventMap);\r\n}\r\nfunction addClasses(domNode, classes) {\r\n if (classes) {\r\n const classNames = classes.split(' ');\r\n for (let i = 0; i < classNames.length; i++) {\r\n domNode.classList.add(classNames[i]);\r\n }\r\n }\r\n}\r\nfunction removeClasses(domNode, classes) {\r\n if (classes) {\r\n const classNames = classes.split(' ');\r\n for (let i = 0; i < classNames.length; i++) {\r\n domNode.classList.remove(classNames[i]);\r\n }\r\n }\r\n}\r\nfunction buildPreviousProperties(domNode, previous, current) {\r\n const { diffType, properties, attributes } = current;\r\n if (!diffType || diffType === 'vdom') {\r\n return { properties: previous.properties, attributes: previous.attributes, events: previous.events };\r\n }\r\n else if (diffType === 'none') {\r\n return { properties: {}, attributes: previous.attributes ? {} : undefined, events: previous.events };\r\n }\r\n let newProperties = {\r\n properties: {}\r\n };\r\n if (attributes) {\r\n newProperties.attributes = {};\r\n newProperties.events = previous.events;\r\n Object.keys(properties).forEach((propName) => {\r\n newProperties.properties[propName] = domNode[propName];\r\n });\r\n Object.keys(attributes).forEach((attrName) => {\r\n newProperties.attributes[attrName] = domNode.getAttribute(attrName);\r\n });\r\n return newProperties;\r\n }\r\n newProperties.properties = Object.keys(properties).reduce((props, property) => {\r\n props[property] = domNode.getAttribute(property) || domNode[property];\r\n return props;\r\n }, {});\r\n return newProperties;\r\n}\r\nfunction nodeOperation(propName, propValue, previousValue, domNode, projectionOptions) {\r\n let result;\r\n if (typeof propValue === 'function') {\r\n result = propValue();\r\n }\r\n else {\r\n result = propValue && !previousValue;\r\n }\r\n if (result === true) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectorState.deferredRenderCallbacks.push(() => {\r\n domNode[propName]();\r\n });\r\n }\r\n}\r\nfunction removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions, onlyEvents = false) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n const eventMap = projectorState.nodeMap.get(domNode);\r\n if (eventMap) {\r\n Object.keys(previousProperties).forEach((propName) => {\r\n const isEvent = propName.substr(0, 2) === 'on' || onlyEvents;\r\n const eventName = onlyEvents ? propName : propName.substr(2);\r\n if (isEvent && !properties[propName]) {\r\n const eventCallback = eventMap.get(previousProperties[propName]);\r\n if (eventCallback) {\r\n domNode.removeEventListener(eventName, eventCallback);\r\n }\r\n }\r\n });\r\n }\r\n}\r\nfunction updateAttribute(domNode, attrName, attrValue, projectionOptions) {\r\n if (projectionOptions.namespace === NAMESPACE_SVG && attrName === 'href') {\r\n domNode.setAttributeNS(NAMESPACE_XLINK, attrName, attrValue);\r\n }\r\n else if ((attrName === 'role' && attrValue === '') || attrValue === undefined) {\r\n domNode.removeAttribute(attrName);\r\n }\r\n else {\r\n domNode.setAttribute(attrName, attrValue);\r\n }\r\n}\r\nfunction updateAttributes(domNode, previousAttributes, attributes, projectionOptions) {\r\n const attrNames = Object.keys(attributes);\r\n const attrCount = attrNames.length;\r\n for (let i = 0; i < attrCount; i++) {\r\n const attrName = attrNames[i];\r\n const attrValue = attributes[attrName];\r\n const previousAttrValue = previousAttributes[attrName];\r\n if (attrValue !== previousAttrValue) {\r\n updateAttribute(domNode, attrName, attrValue, projectionOptions);\r\n }\r\n }\r\n}\r\nfunction updateProperties(domNode, previousProperties, properties, projectionOptions, includesEventsAndAttributes = true) {\r\n let propertiesUpdated = false;\r\n const propNames = Object.keys(properties);\r\n const propCount = propNames.length;\r\n if (propNames.indexOf('classes') === -1 && previousProperties.classes) {\r\n if (Array.isArray(previousProperties.classes)) {\r\n for (let i = 0; i < previousProperties.classes.length; i++) {\r\n removeClasses(domNode, previousProperties.classes[i]);\r\n }\r\n }\r\n else {\r\n removeClasses(domNode, previousProperties.classes);\r\n }\r\n }\r\n includesEventsAndAttributes && removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions);\r\n for (let i = 0; i < propCount; i++) {\r\n const propName = propNames[i];\r\n let propValue = properties[propName];\r\n const previousValue = previousProperties[propName];\r\n if (propName === 'classes') {\r\n const previousClasses = Array.isArray(previousValue) ? previousValue : [previousValue];\r\n const currentClasses = Array.isArray(propValue) ? propValue : [propValue];\r\n if (previousClasses && previousClasses.length > 0) {\r\n if (!propValue || propValue.length === 0) {\r\n for (let i = 0; i < previousClasses.length; i++) {\r\n removeClasses(domNode, previousClasses[i]);\r\n }\r\n }\r\n else {\r\n const newClasses = [...currentClasses];\r\n for (let i = 0; i < previousClasses.length; i++) {\r\n const previousClassName = previousClasses[i];\r\n if (previousClassName) {\r\n const classIndex = newClasses.indexOf(previousClassName);\r\n if (classIndex === -1) {\r\n removeClasses(domNode, previousClassName);\r\n }\r\n else {\r\n newClasses.splice(classIndex, 1);\r\n }\r\n }\r\n }\r\n for (let i = 0; i < newClasses.length; i++) {\r\n addClasses(domNode, newClasses[i]);\r\n }\r\n }\r\n }\r\n else {\r\n for (let i = 0; i < currentClasses.length; i++) {\r\n addClasses(domNode, currentClasses[i]);\r\n }\r\n }\r\n }\r\n else if (nodeOperations.indexOf(propName) !== -1) {\r\n nodeOperation(propName, propValue, previousValue, domNode, projectionOptions);\r\n }\r\n else if (propName === 'styles') {\r\n const styleNames = Object.keys(propValue);\r\n const styleCount = styleNames.length;\r\n for (let j = 0; j < styleCount; j++) {\r\n const styleName = styleNames[j];\r\n const newStyleValue = propValue[styleName];\r\n const oldStyleValue = previousValue && previousValue[styleName];\r\n if (newStyleValue === oldStyleValue) {\r\n continue;\r\n }\r\n propertiesUpdated = true;\r\n if (newStyleValue) {\r\n checkStyleValue(newStyleValue);\r\n projectionOptions.styleApplyer(domNode, styleName, newStyleValue);\r\n }\r\n else {\r\n projectionOptions.styleApplyer(domNode, styleName, '');\r\n }\r\n }\r\n }\r\n else {\r\n if (!propValue && typeof previousValue === 'string') {\r\n propValue = '';\r\n }\r\n if (propName === 'value') {\r\n const domValue = domNode[propName];\r\n if (domValue !== propValue &&\r\n (domNode['oninput-value']\r\n ? domValue === domNode['oninput-value']\r\n : propValue !== previousValue)) {\r\n domNode[propName] = propValue;\r\n domNode['oninput-value'] = undefined;\r\n }\r\n if (propValue !== previousValue) {\r\n propertiesUpdated = true;\r\n }\r\n }\r\n else if (propName !== 'key' && propValue !== previousValue) {\r\n const type = typeof propValue;\r\n if (type === 'function' && propName.lastIndexOf('on', 0) === 0 && includesEventsAndAttributes) {\r\n updateEvent(domNode, propName.substr(2), propValue, projectionOptions, properties.bind, previousValue);\r\n }\r\n else if (type === 'string' && propName !== 'innerHTML' && includesEventsAndAttributes) {\r\n updateAttribute(domNode, propName, propValue, projectionOptions);\r\n }\r\n else if (propName === 'scrollLeft' || propName === 'scrollTop') {\r\n if (domNode[propName] !== propValue) {\r\n domNode[propName] = propValue;\r\n }\r\n }\r\n else {\r\n domNode[propName] = propValue;\r\n }\r\n propertiesUpdated = true;\r\n }\r\n }\r\n }\r\n return propertiesUpdated;\r\n}\r\nfunction findIndexOfChild(children, sameAs, start) {\r\n for (let i = start; i < children.length; i++) {\r\n if (same(children[i], sameAs)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\nexport function toParentVNode(domNode) {\r\n return {\r\n tag: '',\r\n properties: {},\r\n children: undefined,\r\n domNode,\r\n type: VNODE\r\n };\r\n}\r\nexport function toTextVNode(data) {\r\n return {\r\n tag: '',\r\n properties: {},\r\n children: undefined,\r\n text: `${data}`,\r\n domNode: undefined,\r\n type: VNODE\r\n };\r\n}\r\nfunction toInternalWNode(instance, instanceData) {\r\n return {\r\n instance,\r\n rendered: [],\r\n coreProperties: instanceData.coreProperties,\r\n children: instance.children,\r\n widgetConstructor: instance.constructor,\r\n properties: instanceData.inputProperties,\r\n type: WNODE\r\n };\r\n}\r\nexport function filterAndDecorateChildren(children, instance) {\r\n if (children === undefined) {\r\n return emptyArray;\r\n }\r\n children = Array.isArray(children) ? children : [children];\r\n for (let i = 0; i < children.length;) {\r\n const child = children[i];\r\n if (child === undefined || child === null) {\r\n children.splice(i, 1);\r\n continue;\r\n }\r\n else if (typeof child === 'string') {\r\n children[i] = toTextVNode(child);\r\n }\r\n else {\r\n if (isVNode(child)) {\r\n if (child.properties.bind === undefined) {\r\n child.properties.bind = instance;\r\n if (child.children && child.children.length > 0) {\r\n filterAndDecorateChildren(child.children, instance);\r\n }\r\n }\r\n }\r\n else {\r\n if (!child.coreProperties) {\r\n const instanceData = widgetInstanceMap.get(instance);\r\n child.coreProperties = {\r\n bind: instance,\r\n baseRegistry: instanceData.coreProperties.baseRegistry\r\n };\r\n }\r\n if (child.children && child.children.length > 0) {\r\n filterAndDecorateChildren(child.children, instance);\r\n }\r\n }\r\n }\r\n i++;\r\n }\r\n return children;\r\n}\r\nfunction nodeAdded(dnode, transitions) {\r\n if (isVNode(dnode) && dnode.properties) {\r\n const enterAnimation = dnode.properties.enterAnimation;\r\n if (enterAnimation) {\r\n if (typeof enterAnimation === 'function') {\r\n enterAnimation(dnode.domNode, dnode.properties);\r\n }\r\n else {\r\n transitions.enter(dnode.domNode, dnode.properties, enterAnimation);\r\n }\r\n }\r\n }\r\n}\r\nfunction nodeToRemove(dnode, transitions, projectionOptions) {\r\n if (isWNode(dnode)) {\r\n const item = instanceMap.get(dnode.instance);\r\n const rendered = (item ? item.dnode.rendered : dnode.rendered) || emptyArray;\r\n if (dnode.instance) {\r\n const instanceData = widgetInstanceMap.get(dnode.instance);\r\n instanceData.onDetach();\r\n instanceMap.delete(dnode.instance);\r\n }\r\n for (let i = 0; i < rendered.length; i++) {\r\n nodeToRemove(rendered[i], transitions, projectionOptions);\r\n }\r\n }\r\n else {\r\n const domNode = dnode.domNode;\r\n const properties = dnode.properties;\r\n if (dnode.children && dnode.children.length > 0) {\r\n for (let i = 0; i < dnode.children.length; i++) {\r\n nodeToRemove(dnode.children[i], transitions, projectionOptions);\r\n }\r\n }\r\n const exitAnimation = properties.exitAnimation;\r\n if (properties && exitAnimation) {\r\n domNode.style.pointerEvents = 'none';\r\n const removeDomNode = function () {\r\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\r\n dnode.domNode = undefined;\r\n };\r\n if (typeof exitAnimation === 'function') {\r\n exitAnimation(domNode, removeDomNode, properties);\r\n return;\r\n }\r\n else {\r\n transitions.exit(dnode.domNode, properties, exitAnimation, removeDomNode);\r\n return;\r\n }\r\n }\r\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\r\n dnode.domNode = undefined;\r\n }\r\n}\r\nfunction checkDistinguishable(childNodes, indexToCheck, parentInstance) {\r\n const childNode = childNodes[indexToCheck];\r\n if (isVNode(childNode) && !childNode.tag) {\r\n return; // Text nodes need not be distinguishable\r\n }\r\n const { key } = childNode.properties;\r\n if (key === undefined || key === null) {\r\n for (let i = 0; i < childNodes.length; i++) {\r\n if (i !== indexToCheck) {\r\n const node = childNodes[i];\r\n if (same(node, childNode)) {\r\n let nodeIdentifier;\r\n const parentName = parentInstance.constructor.name || 'unknown';\r\n if (isWNode(childNode)) {\r\n nodeIdentifier = childNode.widgetConstructor.name || 'unknown';\r\n }\r\n else {\r\n nodeIdentifier = childNode.tag;\r\n }\r\n console.warn(`A widget (${parentName}) has had a child addded or removed, but they were not able to uniquely identified. It is recommended to provide a unique 'key' property when using the same widget or element (${nodeIdentifier}) multiple times as siblings`);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\nfunction updateChildren(parentVNode, siblings, oldChildren, newChildren, parentInstance, projectionOptions) {\r\n oldChildren = oldChildren || emptyArray;\r\n newChildren = newChildren;\r\n const oldChildrenLength = oldChildren.length;\r\n const newChildrenLength = newChildren.length;\r\n const transitions = projectionOptions.transitions;\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\r\n let oldIndex = 0;\r\n let newIndex = 0;\r\n let i;\r\n let textUpdated = false;\r\n while (newIndex < newChildrenLength) {\r\n let oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : undefined;\r\n const newChild = newChildren[newIndex];\r\n if (isVNode(newChild) && typeof newChild.deferredPropertiesCallback === 'function') {\r\n newChild.inserted = isVNode(oldChild) && oldChild.inserted;\r\n addDeferredProperties(newChild, projectionOptions);\r\n }\r\n if (oldChild !== undefined && same(oldChild, newChild)) {\r\n oldIndex++;\r\n newIndex++;\r\n textUpdated =\r\n updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance, oldChildren.slice(oldIndex), newChildren.slice(newIndex)) || textUpdated;\r\n continue;\r\n }\r\n const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);\r\n const addChild = () => {\r\n let insertBeforeDomNode = undefined;\r\n let childrenArray = oldChildren;\r\n let nextIndex = oldIndex + 1;\r\n let child = oldChildren[oldIndex];\r\n if (!child) {\r\n child = siblings[0];\r\n nextIndex = 1;\r\n childrenArray = siblings;\r\n }\r\n if (child) {\r\n let insertBeforeChildren = [child];\r\n while (insertBeforeChildren.length) {\r\n const insertBefore = insertBeforeChildren.shift();\r\n if (isWNode(insertBefore)) {\r\n const item = instanceMap.get(insertBefore.instance);\r\n if (item && item.dnode.rendered) {\r\n insertBeforeChildren.push(...item.dnode.rendered);\r\n }\r\n }\r\n else {\r\n if (insertBefore.domNode) {\r\n if (insertBefore.domNode.parentElement !== parentVNode.domNode) {\r\n break;\r\n }\r\n insertBeforeDomNode = insertBefore.domNode;\r\n break;\r\n }\r\n }\r\n if (insertBeforeChildren.length === 0 && childrenArray[nextIndex]) {\r\n insertBeforeChildren.push(childrenArray[nextIndex]);\r\n nextIndex++;\r\n }\r\n }\r\n }\r\n createDom(newChild, parentVNode, newChildren.slice(newIndex + 1), insertBeforeDomNode, projectionOptions, parentInstance);\r\n nodeAdded(newChild, transitions);\r\n const indexToCheck = newIndex;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(newChildren, indexToCheck, parentInstance);\r\n });\r\n };\r\n if (!oldChild || findOldIndex === -1) {\r\n addChild();\r\n newIndex++;\r\n continue;\r\n }\r\n const removeChild = () => {\r\n const indexToCheck = oldIndex;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\r\n });\r\n if (isWNode(oldChild)) {\r\n const item = instanceMap.get(oldChild.instance);\r\n if (item) {\r\n oldChild = item.dnode;\r\n }\r\n }\r\n nodeToRemove(oldChild, transitions, projectionOptions);\r\n };\r\n const findNewIndex = findIndexOfChild(newChildren, oldChild, newIndex + 1);\r\n if (findNewIndex === -1) {\r\n removeChild();\r\n oldIndex++;\r\n continue;\r\n }\r\n addChild();\r\n removeChild();\r\n oldIndex++;\r\n newIndex++;\r\n }\r\n if (oldChildrenLength > oldIndex) {\r\n // Remove child fragments\r\n for (i = oldIndex; i < oldChildrenLength; i++) {\r\n const indexToCheck = i;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\r\n });\r\n let childToRemove = oldChildren[i];\r\n if (isWNode(childToRemove)) {\r\n const item = instanceMap.get(childToRemove.instance);\r\n if (item) {\r\n childToRemove = item.dnode;\r\n }\r\n }\r\n nodeToRemove(childToRemove, transitions, projectionOptions);\r\n }\r\n }\r\n return textUpdated;\r\n}\r\nfunction addChildren(parentVNode, children, projectionOptions, parentInstance, insertBefore = undefined, childNodes) {\r\n if (children === undefined) {\r\n return;\r\n }\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectorState.merge && childNodes === undefined) {\r\n childNodes = arrayFrom(parentVNode.domNode.childNodes);\r\n }\r\n const transitions = projectionOptions.transitions;\r\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n const nextSiblings = children.slice(i + 1);\r\n if (isVNode(child)) {\r\n if (projectorState.merge && childNodes) {\r\n let domElement = undefined;\r\n while (child.domNode === undefined && childNodes.length > 0) {\r\n domElement = childNodes.shift();\r\n if (domElement && domElement.tagName === (child.tag.toUpperCase() || undefined)) {\r\n child.domNode = domElement;\r\n }\r\n }\r\n }\r\n createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance);\r\n }\r\n else {\r\n createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes);\r\n }\r\n nodeAdded(child, transitions);\r\n }\r\n}\r\nfunction initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions) {\r\n addChildren(dnode, dnode.children, projectionOptions, parentInstance, undefined);\r\n if (typeof dnode.deferredPropertiesCallback === 'function' && dnode.inserted === undefined) {\r\n addDeferredProperties(dnode, projectionOptions);\r\n }\r\n if (dnode.attributes && dnode.events) {\r\n updateAttributes(domNode, {}, dnode.attributes, projectionOptions);\r\n updateProperties(domNode, {}, dnode.properties, projectionOptions, false);\r\n removeOrphanedEvents(domNode, {}, dnode.events, projectionOptions, true);\r\n const events = dnode.events;\r\n Object.keys(events).forEach((event) => {\r\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind);\r\n });\r\n }\r\n else {\r\n updateProperties(domNode, {}, dnode.properties, projectionOptions);\r\n }\r\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\r\n const instanceData = widgetInstanceMap.get(parentInstance);\r\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\r\n }\r\n dnode.inserted = true;\r\n}\r\nfunction createDom(dnode, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes) {\r\n let domNode;\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (isWNode(dnode)) {\r\n let { widgetConstructor } = dnode;\r\n const parentInstanceData = widgetInstanceMap.get(parentInstance);\r\n if (!isWidgetBaseConstructor(widgetConstructor)) {\r\n const item = parentInstanceData.registry().get(widgetConstructor);\r\n if (item === null) {\r\n return;\r\n }\r\n widgetConstructor = item;\r\n }\r\n const instance = new widgetConstructor();\r\n dnode.instance = instance;\r\n nextSiblingMap.set(instance, nextSiblings);\r\n const instanceData = widgetInstanceMap.get(instance);\r\n instanceData.invalidate = () => {\r\n instanceData.dirty = true;\r\n if (instanceData.rendering === false) {\r\n projectorState.renderQueue.push({ instance, depth: projectionOptions.depth });\r\n scheduleRender(projectionOptions);\r\n }\r\n };\r\n instanceData.rendering = true;\r\n instance.__setCoreProperties__(dnode.coreProperties);\r\n instance.__setChildren__(dnode.children);\r\n instance.__setProperties__(dnode.properties);\r\n const rendered = instance.__render__();\r\n instanceData.rendering = false;\r\n if (rendered) {\r\n const filteredRendered = filterAndDecorateChildren(rendered, instance);\r\n dnode.rendered = filteredRendered;\r\n addChildren(parentVNode, filteredRendered, projectionOptions, instance, insertBefore, childNodes);\r\n }\r\n instanceMap.set(instance, { dnode, parentVNode });\r\n instanceData.nodeHandler.addRoot();\r\n projectorState.afterRenderCallbacks.push(() => {\r\n instanceData.onAttach();\r\n });\r\n }\r\n else {\r\n if (projectorState.merge && projectorState.mergeElement !== undefined) {\r\n domNode = dnode.domNode = projectionOptions.mergeElement;\r\n projectorState.mergeElement = undefined;\r\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\r\n return;\r\n }\r\n const doc = parentVNode.domNode.ownerDocument;\r\n if (!dnode.tag && typeof dnode.text === 'string') {\r\n if (dnode.domNode !== undefined && parentVNode.domNode) {\r\n const newDomNode = dnode.domNode.ownerDocument.createTextNode(dnode.text);\r\n if (parentVNode.domNode === dnode.domNode.parentNode) {\r\n parentVNode.domNode.replaceChild(newDomNode, dnode.domNode);\r\n }\r\n else {\r\n parentVNode.domNode.appendChild(newDomNode);\r\n dnode.domNode.parentNode && dnode.domNode.parentNode.removeChild(dnode.domNode);\r\n }\r\n dnode.domNode = newDomNode;\r\n }\r\n else {\r\n domNode = dnode.domNode = doc.createTextNode(dnode.text);\r\n if (insertBefore !== undefined) {\r\n parentVNode.domNode.insertBefore(domNode, insertBefore);\r\n }\r\n else {\r\n parentVNode.domNode.appendChild(domNode);\r\n }\r\n }\r\n }\r\n else {\r\n if (dnode.domNode === undefined) {\r\n if (dnode.tag === 'svg') {\r\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\r\n }\r\n if (projectionOptions.namespace !== undefined) {\r\n domNode = dnode.domNode = doc.createElementNS(projectionOptions.namespace, dnode.tag);\r\n }\r\n else {\r\n domNode = dnode.domNode = dnode.domNode || doc.createElement(dnode.tag);\r\n }\r\n }\r\n else {\r\n domNode = dnode.domNode;\r\n }\r\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\r\n if (insertBefore !== undefined) {\r\n parentVNode.domNode.insertBefore(domNode, insertBefore);\r\n }\r\n else if (domNode.parentNode !== parentVNode.domNode) {\r\n parentVNode.domNode.appendChild(domNode);\r\n }\r\n }\r\n }\r\n}\r\nfunction updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance, oldNextSiblings, nextSiblings) {\r\n if (isWNode(dnode)) {\r\n const { instance } = previous;\r\n const { parentVNode, dnode: node } = instanceMap.get(instance);\r\n const previousRendered = node ? node.rendered : previous.rendered;\r\n const instanceData = widgetInstanceMap.get(instance);\r\n instanceData.rendering = true;\r\n instance.__setCoreProperties__(dnode.coreProperties);\r\n instance.__setChildren__(dnode.children);\r\n instance.__setProperties__(dnode.properties);\r\n nextSiblingMap.set(instance, nextSiblings);\r\n dnode.instance = instance;\r\n if (instanceData.dirty === true) {\r\n const rendered = instance.__render__();\r\n instanceData.rendering = false;\r\n dnode.rendered = filterAndDecorateChildren(rendered, instance);\r\n updateChildren(parentVNode, oldNextSiblings, previousRendered, dnode.rendered, instance, projectionOptions);\r\n }\r\n else {\r\n instanceData.rendering = false;\r\n dnode.rendered = previousRendered;\r\n }\r\n instanceMap.set(instance, { dnode, parentVNode });\r\n instanceData.nodeHandler.addRoot();\r\n }\r\n else {\r\n if (previous === dnode) {\r\n return false;\r\n }\r\n const domNode = (dnode.domNode = previous.domNode);\r\n let textUpdated = false;\r\n let updated = false;\r\n if (!dnode.tag && typeof dnode.text === 'string') {\r\n if (dnode.text !== previous.text) {\r\n const newDomNode = domNode.ownerDocument.createTextNode(dnode.text);\r\n domNode.parentNode.replaceChild(newDomNode, domNode);\r\n dnode.domNode = newDomNode;\r\n textUpdated = true;\r\n return textUpdated;\r\n }\r\n }\r\n else {\r\n if (dnode.tag && dnode.tag.lastIndexOf('svg', 0) === 0) {\r\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\r\n }\r\n if (previous.children !== dnode.children) {\r\n const children = filterAndDecorateChildren(dnode.children, parentInstance);\r\n dnode.children = children;\r\n updated =\r\n updateChildren(dnode, oldNextSiblings, previous.children, children, parentInstance, projectionOptions) || updated;\r\n }\r\n const previousProperties = buildPreviousProperties(domNode, previous, dnode);\r\n if (dnode.attributes && dnode.events) {\r\n updateAttributes(domNode, previousProperties.attributes, dnode.attributes, projectionOptions);\r\n updated =\r\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions, false) || updated;\r\n removeOrphanedEvents(domNode, previousProperties.events, dnode.events, projectionOptions, true);\r\n const events = dnode.events;\r\n Object.keys(events).forEach((event) => {\r\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind, previousProperties.events[event]);\r\n });\r\n }\r\n else {\r\n updated =\r\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions) ||\r\n updated;\r\n }\r\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\r\n const instanceData = widgetInstanceMap.get(parentInstance);\r\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\r\n }\r\n }\r\n if (updated && dnode.properties && dnode.properties.updateAnimation) {\r\n dnode.properties.updateAnimation(domNode, dnode.properties, previous.properties);\r\n }\r\n }\r\n}\r\nfunction addDeferredProperties(vnode, projectionOptions) {\r\n // transfer any properties that have been passed - as these must be decorated properties\r\n vnode.decoratedDeferredProperties = vnode.properties;\r\n const properties = vnode.deferredPropertiesCallback(!!vnode.inserted);\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n vnode.properties = Object.assign({}, properties, vnode.decoratedDeferredProperties);\r\n projectorState.deferredRenderCallbacks.push(() => {\r\n const properties = Object.assign({}, vnode.deferredPropertiesCallback(!!vnode.inserted), vnode.decoratedDeferredProperties);\r\n updateProperties(vnode.domNode, vnode.properties, properties, projectionOptions);\r\n vnode.properties = properties;\r\n });\r\n}\r\nfunction runDeferredRenderCallbacks(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectorState.deferredRenderCallbacks.length) {\r\n if (projectionOptions.sync) {\r\n while (projectorState.deferredRenderCallbacks.length) {\r\n const callback = projectorState.deferredRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n }\r\n else {\r\n global.requestAnimationFrame(() => {\r\n while (projectorState.deferredRenderCallbacks.length) {\r\n const callback = projectorState.deferredRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n }\r\n}\r\nfunction runAfterRenderCallbacks(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectionOptions.sync) {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n }\r\n else {\r\n if (global.requestIdleCallback) {\r\n global.requestIdleCallback(() => {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n else {\r\n setTimeout(() => {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n }\r\n}\r\nfunction scheduleRender(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectionOptions.sync) {\r\n render(projectionOptions);\r\n }\r\n else if (projectorState.renderScheduled === undefined) {\r\n projectorState.renderScheduled = global.requestAnimationFrame(() => {\r\n render(projectionOptions);\r\n });\r\n }\r\n}\r\nfunction render(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectorState.renderScheduled = undefined;\r\n const renderQueue = projectorState.renderQueue;\r\n const renders = [...renderQueue];\r\n projectorState.renderQueue = [];\r\n renders.sort((a, b) => a.depth - b.depth);\r\n const previouslyRendered = [];\r\n while (renders.length) {\r\n const { instance } = renders.shift();\r\n if (instanceMap.has(instance) && previouslyRendered.indexOf(instance) === -1) {\r\n previouslyRendered.push(instance);\r\n const { parentVNode, dnode } = instanceMap.get(instance);\r\n const instanceData = widgetInstanceMap.get(instance);\r\n const nextSiblings = nextSiblingMap.get(instance);\r\n updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance, nextSiblings, nextSiblings);\r\n }\r\n }\r\n runAfterRenderCallbacks(projectionOptions);\r\n runDeferredRenderCallbacks(projectionOptions);\r\n}\r\nexport const dom = {\r\n append: function (parentNode, instance, projectionOptions = {}) {\r\n const instanceData = widgetInstanceMap.get(instance);\r\n const finalProjectorOptions = getProjectionOptions(projectionOptions, instance);\r\n const projectorState = {\r\n afterRenderCallbacks: [],\r\n deferredRenderCallbacks: [],\r\n nodeMap: new WeakMap(),\r\n renderScheduled: undefined,\r\n renderQueue: [],\r\n merge: projectionOptions.merge || false,\r\n mergeElement: projectionOptions.mergeElement\r\n };\r\n projectorStateMap.set(instance, projectorState);\r\n finalProjectorOptions.rootNode = parentNode;\r\n const parentVNode = toParentVNode(finalProjectorOptions.rootNode);\r\n const node = toInternalWNode(instance, instanceData);\r\n instanceMap.set(instance, { dnode: node, parentVNode });\r\n instanceData.invalidate = () => {\r\n instanceData.dirty = true;\r\n if (instanceData.rendering === false) {\r\n projectorState.renderQueue.push({ instance, depth: finalProjectorOptions.depth });\r\n scheduleRender(finalProjectorOptions);\r\n }\r\n };\r\n updateDom(node, node, finalProjectorOptions, parentVNode, instance, [], []);\r\n projectorState.afterRenderCallbacks.push(() => {\r\n instanceData.onAttach();\r\n });\r\n runDeferredRenderCallbacks(finalProjectorOptions);\r\n runAfterRenderCallbacks(finalProjectorOptions);\r\n return {\r\n domNode: finalProjectorOptions.rootNode\r\n };\r\n },\r\n create: function (instance, projectionOptions) {\r\n return this.append(document.createElement('div'), instance, projectionOptions);\r\n },\r\n merge: function (element, instance, projectionOptions = {}) {\r\n projectionOptions.merge = true;\r\n projectionOptions.mergeElement = element;\r\n const projection = this.append(element.parentNode, instance, projectionOptions);\r\n const projectorState = projectorStateMap.get(instance);\r\n projectorState.merge = false;\r\n return projection;\r\n }\r\n};\r\n//# sourceMappingURL=vdom.mjs.map" }, { "id": "./node_modules/imports-loader/index.js?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js", @@ -2332,7 +2341,7 @@ "name": "./node_modules/imports-loader?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js", "index": 1, "index2": 41, - "size": 277, + "size": 287, "cacheable": true, "built": true, "optional": false, @@ -2362,7 +2371,7 @@ "providedExports": null, "optimizationBailout": [], "depth": 1, - "source": "/*** IMPORTS FROM imports-loader ***/\nvar widgetFactory = require(\"src/menu/Menu\");\n\nvar registerCustomElement = require('@dojo/widget-core/registerCustomElement').default;\r\n\r\nvar defaultExport = widgetFactory.default;\r\ndefaultExport && registerCustomElement(defaultExport);\r\n\n" + "source": "/*** IMPORTS FROM imports-loader ***/\nvar widgetFactory = require(\"src/menu/Menu\");\n\nvar registerCustomElement = require('@dojo/framework/widget-core/registerCustomElement').default;\r\n\r\nvar defaultExport = widgetFactory.default;\r\ndefaultExport && registerCustomElement(defaultExport);\r\n\n" }, { "id": "./node_modules/process/browser.js", @@ -2379,21 +2388,21 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\has\\has.mjs", - "issuerId": "./node_modules/@dojo/has/has.mjs", - "issuerName": "./node_modules/@dojo/has/has.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\has\\has.mjs", + "issuerId": "./node_modules/@dojo/framework/has/has.mjs", + "issuerName": "./node_modules/@dojo/framework/has/has.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/has/has.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\has\\has.mjs", - "module": "./node_modules/@dojo/has/has.mjs", - "moduleName": "./node_modules/@dojo/has/has.mjs", + "moduleId": "./node_modules/@dojo/framework/has/has.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\has\\has.mjs", + "module": "./node_modules/@dojo/framework/has/has.mjs", + "moduleName": "./node_modules/@dojo/framework/has/has.mjs", "type": "cjs require", "userRequest": "process", - "loc": "1:0-37" + "loc": "1:0-40" } ], "usedExports": true, @@ -2417,18 +2426,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "tslib", "loc": "1:0-33" @@ -2443,19 +2452,19 @@ "loc": "1:0-33" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "tslib", "loc": "1:0-33" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "tslib", "loc": "1:0-33" @@ -2463,7 +2472,6 @@ ], "usedExports": [ "__decorate", - "__metadata", "__rest" ], "providedExports": [ @@ -2504,30 +2512,30 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\global.mjs", - "issuerId": "./node_modules/@dojo/shim/global.mjs", - "issuerName": "./node_modules/@dojo/shim/global.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\global.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/global.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/global.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/global.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\global.mjs", - "module": "./node_modules/@dojo/shim/global.mjs", - "moduleName": "./node_modules/@dojo/shim/global.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/global.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\global.mjs", + "module": "./node_modules/@dojo/framework/shim/global.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/global.mjs", "type": "cjs require", "userRequest": "global", - "loc": "1:0-44" + "loc": "1:0-47" }, { - "moduleId": "./node_modules/@dojo/has/has.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\has\\has.mjs", - "module": "./node_modules/@dojo/has/has.mjs", - "moduleName": "./node_modules/@dojo/has/has.mjs", + "moduleId": "./node_modules/@dojo/framework/has/has.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\has\\has.mjs", + "module": "./node_modules/@dojo/framework/has/has.mjs", + "moduleName": "./node_modules/@dojo/framework/has/has.mjs", "type": "cjs require", "userRequest": "global", - "loc": "1:0-44" + "loc": "1:0-47" } ], "usedExports": true, @@ -2542,7 +2550,7 @@ "name": "./src/menu/Menu.ts", "index": 2, "index2": 40, - "size": 1462, + "size": 1502, "cacheable": true, "built": true, "optional": false, @@ -2575,7 +2583,7 @@ ], "optimizationBailout": [], "depth": 2, - "source": "import * as tslib_1 from \"tslib\";\r\nimport { v } from '@dojo/widget-core/d';\r\nimport { customElement } from '@dojo/widget-core/decorators/customElement';\r\nimport { theme, ThemedMixin } from '@dojo/widget-core/mixins/Themed';\r\nimport { WidgetBase } from '@dojo/widget-core/WidgetBase';\r\nimport * as css from './menu.m.css';\r\nlet Menu = class Menu extends ThemedMixin(WidgetBase) {\r\n _onSelected(id, data) {\r\n this._selectedId = id;\r\n this.properties.onSelected(data);\r\n this.invalidate();\r\n }\r\n render() {\r\n const items = this.children.map((child, index) => {\r\n if (child) {\r\n const properties = {\r\n onSelected: (data) => {\r\n this._onSelected(index, data);\r\n }\r\n };\r\n if (this._selectedId !== undefined) {\r\n properties.selected = index === this._selectedId;\r\n }\r\n child.properties = Object.assign({}, child.properties, properties);\r\n }\r\n return child;\r\n });\r\n return v('nav', { classes: this.theme(css.root) }, [\r\n v('ol', {\r\n classes: this.theme(css.menuContainer)\r\n }, items)\r\n ]);\r\n }\r\n};\r\nMenu = tslib_1.__decorate([\r\n customElement({\r\n tag: 'demo-menu',\r\n events: ['onSelected']\r\n }),\r\n theme(css)\r\n], Menu);\r\nexport { Menu };\r\nexport default Menu;\r\n" + "source": "import * as tslib_1 from \"tslib\";\r\nimport { v } from '@dojo/framework/widget-core/d';\r\nimport { customElement } from '@dojo/framework/widget-core/decorators/customElement';\r\nimport { theme, ThemedMixin } from '@dojo/framework/widget-core/mixins/Themed';\r\nimport { WidgetBase } from '@dojo/framework/widget-core/WidgetBase';\r\nimport * as css from './menu.m.css';\r\nlet Menu = class Menu extends ThemedMixin(WidgetBase) {\r\n _onSelected(id, data) {\r\n this._selectedId = id;\r\n this.properties.onSelected(data);\r\n this.invalidate();\r\n }\r\n render() {\r\n const items = this.children.map((child, index) => {\r\n if (child) {\r\n const properties = {\r\n onSelected: (data) => {\r\n this._onSelected(index, data);\r\n }\r\n };\r\n if (this._selectedId !== undefined) {\r\n properties.selected = index === this._selectedId;\r\n }\r\n child.properties = Object.assign({}, child.properties, properties);\r\n }\r\n return child;\r\n });\r\n return v('nav', { classes: this.theme(css.root) }, [\r\n v('ol', {\r\n classes: this.theme(css.menuContainer)\r\n }, items)\r\n ]);\r\n }\r\n};\r\nMenu = tslib_1.__decorate([\r\n customElement({\r\n tag: 'demo-menu',\r\n events: ['onSelected']\r\n }),\r\n theme(css)\r\n], Menu);\r\nexport { Menu };\r\nexport default Menu;\r\n" }, { "id": "./src/menu/menu.m.css", @@ -2632,12 +2640,12 @@ ], "modules": [ { - "id": "./node_modules/@dojo/core/Destroyable.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Destroyable.mjs", - "name": "./node_modules/@dojo/core/Destroyable.mjs", + "id": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Destroyable.mjs", + "name": "./node_modules/@dojo/framework/core/Destroyable.mjs", "index": 25, "index2": 17, - "size": 1668, + "size": 1665, "cacheable": true, "built": true, "optional": false, @@ -2646,18 +2654,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Evented.mjs", - "issuerId": "./node_modules/@dojo/core/Evented.mjs", - "issuerName": "./node_modules/@dojo/core/Evented.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Evented.mjs", + "issuerId": "./node_modules/@dojo/framework/core/Evented.mjs", + "issuerName": "./node_modules/@dojo/framework/core/Evented.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/core/Evented.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Evented.mjs", - "module": "./node_modules/@dojo/core/Evented.mjs", - "moduleName": "./node_modules/@dojo/core/Evented.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Evented.mjs", + "module": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Evented.mjs", "type": "harmony import", "userRequest": "./Destroyable", "loc": "2:0-44" @@ -2672,15 +2680,15 @@ ], "optimizationBailout": [], "depth": 6, - "source": "import { createCompositeHandle } from './lang';\nimport Promise from '@dojo/shim/Promise';\n/**\n * No operation function to replace own once instance is destoryed\n */\nfunction noop() {\n return Promise.resolve(false);\n}\n/**\n * No op function used to replace own, once instance has been destoryed\n */\nfunction destroyed() {\n throw new Error('Call made to destroyed method');\n}\nexport class Destroyable {\n /**\n * @constructor\n */\n constructor() {\n this.handles = [];\n }\n /**\n * Register handles for the instance that will be destroyed when `this.destroy` is called\n *\n * @param {Handle} handle The handle to add for the instance\n * @returns {Handle} a handle for the handle, removes the handle for the instance and calls destroy\n */\n own(handles) {\n const handle = Array.isArray(handles) ? createCompositeHandle(...handles) : handles;\n const { handles: _handles } = this;\n _handles.push(handle);\n return {\n destroy() {\n _handles.splice(_handles.indexOf(handle));\n handle.destroy();\n }\n };\n }\n /**\n * Destrpys all handers registered for the instance\n *\n * @returns {Promise {\n this.handles.forEach((handle) => {\n handle && handle.destroy && handle.destroy();\n });\n this.destroy = noop;\n this.own = destroyed;\n resolve(true);\n });\n }\n}\nexport default Destroyable;\n//# sourceMappingURL=Destroyable.mjs.map" + "source": "import { createCompositeHandle } from './lang';\nimport Promise from '../shim/Promise';\n/**\n * No operation function to replace own once instance is destoryed\n */\nfunction noop() {\n return Promise.resolve(false);\n}\n/**\n * No op function used to replace own, once instance has been destoryed\n */\nfunction destroyed() {\n throw new Error('Call made to destroyed method');\n}\nexport class Destroyable {\n /**\n * @constructor\n */\n constructor() {\n this.handles = [];\n }\n /**\n * Register handles for the instance that will be destroyed when `this.destroy` is called\n *\n * @param {Handle} handle The handle to add for the instance\n * @returns {Handle} a handle for the handle, removes the handle for the instance and calls destroy\n */\n own(handles) {\n const handle = Array.isArray(handles) ? createCompositeHandle(...handles) : handles;\n const { handles: _handles } = this;\n _handles.push(handle);\n return {\n destroy() {\n _handles.splice(_handles.indexOf(handle));\n handle.destroy();\n }\n };\n }\n /**\n * Destrpys all handers registered for the instance\n *\n * @returns {Promise {\n this.handles.forEach((handle) => {\n handle && handle.destroy && handle.destroy();\n });\n this.destroy = noop;\n this.own = destroyed;\n resolve(true);\n });\n }\n}\nexport default Destroyable;\n//# sourceMappingURL=Destroyable.mjs.map" }, { - "id": "./node_modules/@dojo/core/Evented.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Evented.mjs", - "name": "./node_modules/@dojo/core/Evented.mjs", + "id": "./node_modules/@dojo/framework/core/Evented.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Evented.mjs", + "name": "./node_modules/@dojo/framework/core/Evented.mjs", "index": 24, "index2": 18, - "size": 2220, + "size": 2222, "cacheable": true, "built": true, "optional": false, @@ -2689,48 +2697,48 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\RegistryHandler.mjs", - "issuerId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "issuerName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\RegistryHandler.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\RegistryHandler.mjs", - "module": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\RegistryHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "2:0-45" + "userRequest": "../core/Evented", + "loc": "2:0-42" }, { - "moduleId": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\NodeHandler.mjs", - "module": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "1:0-45" + "userRequest": "../core/Evented", + "loc": "4:0-42" }, { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\NodeHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "4:0-45" + "userRequest": "../core/Evented", + "loc": "1:0-42" }, { - "moduleId": "./node_modules/@dojo/widget-core/Injector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Injector.mjs", - "module": "./node_modules/@dojo/widget-core/Injector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Injector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Injector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Injector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Injector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Injector.mjs", "type": "harmony import", - "userRequest": "@dojo/core/Evented", - "loc": "1:0-45" + "userRequest": "../core/Evented", + "loc": "1:0-42" } ], "usedExports": [ @@ -2743,15 +2751,15 @@ ], "optimizationBailout": [], "depth": 5, - "source": "import Map from '@dojo/shim/Map';\r\nimport { Destroyable } from './Destroyable';\r\n/**\r\n * Map of computed regular expressions, keyed by string\r\n */\r\nconst regexMap = new Map();\r\n/**\r\n * Determines is the event type glob has been matched\r\n *\r\n * @returns boolean that indicates if the glob is matched\r\n */\r\nexport function isGlobMatch(globString, targetString) {\r\n if (typeof targetString === 'string' && typeof globString === 'string' && globString.indexOf('*') !== -1) {\r\n let regex;\r\n if (regexMap.has(globString)) {\r\n regex = regexMap.get(globString);\r\n }\r\n else {\r\n regex = new RegExp(`^${globString.replace(/\\*/g, '.*')}$`);\r\n regexMap.set(globString, regex);\r\n }\r\n return regex.test(targetString);\r\n }\r\n else {\r\n return globString === targetString;\r\n }\r\n}\r\n/**\r\n * Event Class\r\n */\r\nexport class Evented extends Destroyable {\r\n constructor() {\r\n super(...arguments);\r\n /**\r\n * map of listeners keyed by event type\r\n */\r\n this.listenersMap = new Map();\r\n }\r\n emit(event) {\r\n this.listenersMap.forEach((methods, type) => {\r\n if (isGlobMatch(type, event.type)) {\r\n methods.forEach((method) => {\r\n method.call(this, event);\r\n });\r\n }\r\n });\r\n }\r\n on(type, listener) {\r\n if (Array.isArray(listener)) {\r\n const handles = listener.map((listener) => this._addListener(type, listener));\r\n return {\r\n destroy() {\r\n handles.forEach((handle) => handle.destroy());\r\n }\r\n };\r\n }\r\n return this._addListener(type, listener);\r\n }\r\n _addListener(type, listener) {\r\n const listeners = this.listenersMap.get(type) || [];\r\n listeners.push(listener);\r\n this.listenersMap.set(type, listeners);\r\n return {\r\n destroy: () => {\r\n const listeners = this.listenersMap.get(type) || [];\r\n listeners.splice(listeners.indexOf(listener), 1);\r\n }\r\n };\r\n }\r\n}\r\nexport default Evented;\r\n//# sourceMappingURL=Evented.mjs.map" + "source": "import Map from '../shim/Map';\r\nimport { Destroyable } from './Destroyable';\r\n/**\r\n * Map of computed regular expressions, keyed by string\r\n */\r\nconst regexMap = new Map();\r\n/**\r\n * Determines is the event type glob has been matched\r\n *\r\n * @returns boolean that indicates if the glob is matched\r\n */\r\nexport function isGlobMatch(globString, targetString) {\r\n if (typeof targetString === 'string' && typeof globString === 'string' && globString.indexOf('*') !== -1) {\r\n let regex;\r\n if (regexMap.has(globString)) {\r\n regex = regexMap.get(globString);\r\n }\r\n else {\r\n regex = new RegExp(`^${globString.replace(/\\*/g, '.*')}$`);\r\n regexMap.set(globString, regex);\r\n }\r\n return regex.test(targetString);\r\n }\r\n else {\r\n return globString === targetString;\r\n }\r\n}\r\n/**\r\n * Event Class\r\n */\r\nexport class Evented extends Destroyable {\r\n constructor() {\r\n super(...arguments);\r\n /**\r\n * map of listeners keyed by event type\r\n */\r\n this.listenersMap = new Map();\r\n }\r\n emit(event) {\r\n this.listenersMap.forEach((methods, type) => {\r\n if (isGlobMatch(type, event.type)) {\r\n [...methods].forEach((method) => {\r\n method.call(this, event);\r\n });\r\n }\r\n });\r\n }\r\n on(type, listener) {\r\n if (Array.isArray(listener)) {\r\n const handles = listener.map((listener) => this._addListener(type, listener));\r\n return {\r\n destroy() {\r\n handles.forEach((handle) => handle.destroy());\r\n }\r\n };\r\n }\r\n return this._addListener(type, listener);\r\n }\r\n _addListener(type, listener) {\r\n const listeners = this.listenersMap.get(type) || [];\r\n listeners.push(listener);\r\n this.listenersMap.set(type, listeners);\r\n return {\r\n destroy: () => {\r\n const listeners = this.listenersMap.get(type) || [];\r\n listeners.splice(listeners.indexOf(listener), 1);\r\n }\r\n };\r\n }\r\n}\r\nexport default Evented;\r\n//# sourceMappingURL=Evented.mjs.map" }, { - "id": "./node_modules/@dojo/core/lang.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\lang.mjs", - "name": "./node_modules/@dojo/core/lang.mjs", + "id": "./node_modules/@dojo/framework/core/lang.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\lang.mjs", + "name": "./node_modules/@dojo/framework/core/lang.mjs", "index": 26, "index2": 16, - "size": 6843, + "size": 6837, "cacheable": true, "built": true, "optional": false, @@ -2760,27 +2768,27 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", - "userRequest": "@dojo/core/lang", + "userRequest": "../../core/lang", "loc": "2:0-41" }, { - "moduleId": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Destroyable.mjs", - "module": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleName": "./node_modules/@dojo/core/Destroyable.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Destroyable.mjs", + "module": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Destroyable.mjs", "type": "harmony import", "userRequest": "./lang", "loc": "1:0-47" @@ -2805,12 +2813,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { assign } from '@dojo/shim/object';\nexport { assign } from '@dojo/shim/object';\nconst slice = Array.prototype.slice;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Type guard that ensures that the value can be coerced to Object\n * to weed out host objects that do not derive from Object.\n * This function is used to check if we want to deep copy an object or not.\n * Note: In ES6 it is possible to modify an object's Symbol.toStringTag property, which will\n * change the value returned by `toString`. This is a rare edge case that is difficult to handle,\n * so it is not handled here.\n * @param value The value to check\n * @return If the value is coercible into an Object\n */\nfunction shouldDeepCopyObject(value) {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\nfunction copyArray(array, inherited) {\n return array.map(function (item) {\n if (Array.isArray(item)) {\n return copyArray(item, inherited);\n }\n return !shouldDeepCopyObject(item)\n ? item\n : _mixin({\n deep: true,\n inherited: inherited,\n sources: [item],\n target: {}\n });\n });\n}\nfunction _mixin(kwArgs) {\n const deep = kwArgs.deep;\n const inherited = kwArgs.inherited;\n const target = kwArgs.target;\n const copied = kwArgs.copied || [];\n const copiedClone = [...copied];\n for (let i = 0; i < kwArgs.sources.length; i++) {\n const source = kwArgs.sources[i];\n if (source === null || source === undefined) {\n continue;\n }\n for (let key in source) {\n if (inherited || hasOwnProperty.call(source, key)) {\n let value = source[key];\n if (copiedClone.indexOf(value) !== -1) {\n continue;\n }\n if (deep) {\n if (Array.isArray(value)) {\n value = copyArray(value, inherited);\n }\n else if (shouldDeepCopyObject(value)) {\n const targetValue = target[key] || {};\n copied.push(source);\n value = _mixin({\n deep: true,\n inherited: inherited,\n sources: [value],\n target: targetValue,\n copied\n });\n }\n }\n target[key] = value;\n }\n }\n }\n return target;\n}\nexport function create(prototype, ...mixins) {\n if (!mixins.length) {\n throw new RangeError('lang.create requires at least one mixin object.');\n }\n const args = mixins.slice();\n args.unshift(Object.create(prototype));\n return assign.apply(null, args);\n}\nexport function deepAssign(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: false,\n sources: sources,\n target: target\n });\n}\nexport function deepMixin(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Creates a new object using the provided source's prototype as the prototype for the new object, and then\n * deep copies the provided source's values into the new target.\n *\n * @param source The object to duplicate\n * @return The new object\n */\nexport function duplicate(source) {\n const target = Object.create(Object.getPrototypeOf(source));\n return deepMixin(target, source);\n}\n/**\n * Determines whether two values are the same value.\n *\n * @param a First value to compare\n * @param b Second value to compare\n * @return true if the values are the same; false otherwise\n */\nexport function isIdentical(a, b) {\n return (a === b ||\n /* both values are NaN */\n (a !== a && b !== b));\n}\n/**\n * Returns a function that binds a method to the specified object at runtime. This is similar to\n * `Function.prototype.bind`, but instead of a function it takes the name of a method on an object.\n * As a result, the function returned by `lateBind` will always call the function currently assigned to\n * the specified property on the object as of the moment the function it returns is called.\n *\n * @param instance The context object\n * @param method The name of the method on the context object to bind to itself\n * @param suppliedArgs An optional array of values to prepend to the `instance[method]` arguments list\n * @return The bound function\n */\nexport function lateBind(instance, method, ...suppliedArgs) {\n return suppliedArgs.length\n ? function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n // TS7017\n return instance[method].apply(instance, args);\n }\n : function () {\n // TS7017\n return instance[method].apply(instance, arguments);\n };\n}\nexport function mixin(target, ...sources) {\n return _mixin({\n deep: false,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Returns a function which invokes the given function with the given arguments prepended to its argument list.\n * Like `Function.prototype.bind`, but does not alter execution context.\n *\n * @param targetFunction The function that needs to be bound\n * @param suppliedArgs An optional array of arguments to prepend to the `targetFunction` arguments list\n * @return The bound function\n */\nexport function partial(targetFunction, ...suppliedArgs) {\n return function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n return targetFunction.apply(this, args);\n };\n}\n/**\n * Returns an object with a destroy method that, when called, calls the passed-in destructor.\n * This is intended to provide a unified interface for creating \"remove\" / \"destroy\" handlers for\n * event listeners, timers, etc.\n *\n * @param destructor A function that will be called when the handle's `destroy` method is invoked\n * @return The handle object\n */\nexport function createHandle(destructor) {\n let called = false;\n return {\n destroy: function () {\n if (!called) {\n called = true;\n destructor();\n }\n }\n };\n}\n/**\n * Returns a single handle that can be used to destroy multiple handles simultaneously.\n *\n * @param handles An array of handles with `destroy` methods\n * @return The handle object\n */\nexport function createCompositeHandle(...handles) {\n return createHandle(function () {\n for (let i = 0; i < handles.length; i++) {\n handles[i].destroy();\n }\n });\n}\n//# sourceMappingURL=lang.mjs.map" + "source": "import { assign } from '../shim/object';\nexport { assign } from '../shim/object';\nconst slice = Array.prototype.slice;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Type guard that ensures that the value can be coerced to Object\n * to weed out host objects that do not derive from Object.\n * This function is used to check if we want to deep copy an object or not.\n * Note: In ES6 it is possible to modify an object's Symbol.toStringTag property, which will\n * change the value returned by `toString`. This is a rare edge case that is difficult to handle,\n * so it is not handled here.\n * @param value The value to check\n * @return If the value is coercible into an Object\n */\nfunction shouldDeepCopyObject(value) {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\nfunction copyArray(array, inherited) {\n return array.map(function (item) {\n if (Array.isArray(item)) {\n return copyArray(item, inherited);\n }\n return !shouldDeepCopyObject(item)\n ? item\n : _mixin({\n deep: true,\n inherited: inherited,\n sources: [item],\n target: {}\n });\n });\n}\nfunction _mixin(kwArgs) {\n const deep = kwArgs.deep;\n const inherited = kwArgs.inherited;\n const target = kwArgs.target;\n const copied = kwArgs.copied || [];\n const copiedClone = [...copied];\n for (let i = 0; i < kwArgs.sources.length; i++) {\n const source = kwArgs.sources[i];\n if (source === null || source === undefined) {\n continue;\n }\n for (let key in source) {\n if (inherited || hasOwnProperty.call(source, key)) {\n let value = source[key];\n if (copiedClone.indexOf(value) !== -1) {\n continue;\n }\n if (deep) {\n if (Array.isArray(value)) {\n value = copyArray(value, inherited);\n }\n else if (shouldDeepCopyObject(value)) {\n const targetValue = target[key] || {};\n copied.push(source);\n value = _mixin({\n deep: true,\n inherited: inherited,\n sources: [value],\n target: targetValue,\n copied\n });\n }\n }\n target[key] = value;\n }\n }\n }\n return target;\n}\nexport function create(prototype, ...mixins) {\n if (!mixins.length) {\n throw new RangeError('lang.create requires at least one mixin object.');\n }\n const args = mixins.slice();\n args.unshift(Object.create(prototype));\n return assign.apply(null, args);\n}\nexport function deepAssign(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: false,\n sources: sources,\n target: target\n });\n}\nexport function deepMixin(target, ...sources) {\n return _mixin({\n deep: true,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Creates a new object using the provided source's prototype as the prototype for the new object, and then\n * deep copies the provided source's values into the new target.\n *\n * @param source The object to duplicate\n * @return The new object\n */\nexport function duplicate(source) {\n const target = Object.create(Object.getPrototypeOf(source));\n return deepMixin(target, source);\n}\n/**\n * Determines whether two values are the same value.\n *\n * @param a First value to compare\n * @param b Second value to compare\n * @return true if the values are the same; false otherwise\n */\nexport function isIdentical(a, b) {\n return (a === b ||\n /* both values are NaN */\n (a !== a && b !== b));\n}\n/**\n * Returns a function that binds a method to the specified object at runtime. This is similar to\n * `Function.prototype.bind`, but instead of a function it takes the name of a method on an object.\n * As a result, the function returned by `lateBind` will always call the function currently assigned to\n * the specified property on the object as of the moment the function it returns is called.\n *\n * @param instance The context object\n * @param method The name of the method on the context object to bind to itself\n * @param suppliedArgs An optional array of values to prepend to the `instance[method]` arguments list\n * @return The bound function\n */\nexport function lateBind(instance, method, ...suppliedArgs) {\n return suppliedArgs.length\n ? function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n // TS7017\n return instance[method].apply(instance, args);\n }\n : function () {\n // TS7017\n return instance[method].apply(instance, arguments);\n };\n}\nexport function mixin(target, ...sources) {\n return _mixin({\n deep: false,\n inherited: true,\n sources: sources,\n target: target\n });\n}\n/**\n * Returns a function which invokes the given function with the given arguments prepended to its argument list.\n * Like `Function.prototype.bind`, but does not alter execution context.\n *\n * @param targetFunction The function that needs to be bound\n * @param suppliedArgs An optional array of arguments to prepend to the `targetFunction` arguments list\n * @return The bound function\n */\nexport function partial(targetFunction, ...suppliedArgs) {\n return function () {\n const args = arguments.length ? suppliedArgs.concat(slice.call(arguments)) : suppliedArgs;\n return targetFunction.apply(this, args);\n };\n}\n/**\n * Returns an object with a destroy method that, when called, calls the passed-in destructor.\n * This is intended to provide a unified interface for creating \"remove\" / \"destroy\" handlers for\n * event listeners, timers, etc.\n *\n * @param destructor A function that will be called when the handle's `destroy` method is invoked\n * @return The handle object\n */\nexport function createHandle(destructor) {\n let called = false;\n return {\n destroy: function () {\n if (!called) {\n called = true;\n destructor();\n }\n }\n };\n}\n/**\n * Returns a single handle that can be used to destroy multiple handles simultaneously.\n *\n * @param handles An array of handles with `destroy` methods\n * @return The handle object\n */\nexport function createCompositeHandle(...handles) {\n return createHandle(function () {\n for (let i = 0; i < handles.length; i++) {\n handles[i].destroy();\n }\n });\n}\n//# sourceMappingURL=lang.mjs.map" }, { - "id": "./node_modules/@dojo/has/has.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\has\\has.mjs", - "name": "./node_modules/@dojo/has/has.mjs", + "id": "./node_modules/@dojo/framework/has/has.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\has\\has.mjs", + "name": "./node_modules/@dojo/framework/has/has.mjs", "index": 7, "index2": 3, "size": 6500, @@ -2822,29 +2830,29 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\has.mjs", - "issuerId": "./node_modules/@dojo/shim/support/has.mjs", - "issuerName": "./node_modules/@dojo/shim/support/has.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\has.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/support/has.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/support/has.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\has.mjs", - "module": "./node_modules/@dojo/shim/support/has.mjs", - "moduleName": "./node_modules/@dojo/shim/support/has.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\has.mjs", + "module": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/has.mjs", "type": "harmony import", - "userRequest": "@dojo/has/has", + "userRequest": "../../has/has", "loc": "1:0-41" }, { - "moduleId": "./node_modules/@dojo/shim/support/has.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\has.mjs", - "module": "./node_modules/@dojo/shim/support/has.mjs", - "moduleName": "./node_modules/@dojo/shim/support/has.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\has.mjs", + "module": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/has.mjs", "type": "harmony import", - "userRequest": "@dojo/has/has", + "userRequest": "../../has/has", "loc": "4:0-30" } ], @@ -2866,9 +2874,9 @@ "source": "function isFeatureTestThenable(value) {\r\n return value && value.then;\r\n}\r\n/**\r\n * A cache of results of feature tests\r\n */\r\nexport const testCache = {};\r\n/**\r\n * A cache of the un-resolved feature tests\r\n */\r\nexport const testFunctions = {};\r\n/**\r\n * A cache of unresolved thenables (probably promises)\r\n * @type {{}}\r\n */\r\nconst testThenables = {};\r\n/**\r\n * A reference to the global scope (`window` in a browser, `global` in NodeJS)\r\n */\r\nconst globalScope = (function () {\r\n /* istanbul ignore else */\r\n if (typeof window !== 'undefined') {\r\n // Browsers\r\n return window;\r\n }\r\n else if (typeof global !== 'undefined') {\r\n // Node\r\n return global;\r\n }\r\n else if (typeof self !== 'undefined') {\r\n // Web workers\r\n return self;\r\n }\r\n /* istanbul ignore next */\r\n return {};\r\n})();\r\n/* Grab the staticFeatures if there are available */\r\nconst { staticFeatures } = globalScope.DojoHasEnvironment || {};\r\n/* Cleaning up the DojoHasEnviornment */\r\nif ('DojoHasEnvironment' in globalScope) {\r\n delete globalScope.DojoHasEnvironment;\r\n}\r\n/**\r\n * Custom type guard to narrow the `staticFeatures` to either a map or a function that\r\n * returns a map.\r\n *\r\n * @param value The value to guard for\r\n */\r\nfunction isStaticFeatureFunction(value) {\r\n return typeof value === 'function';\r\n}\r\n/**\r\n * The cache of asserted features that were available in the global scope when the\r\n * module loaded\r\n */\r\nconst staticCache = staticFeatures\r\n ? isStaticFeatureFunction(staticFeatures) ? staticFeatures.apply(globalScope) : staticFeatures\r\n : {}; /* Providing an empty cache, if none was in the environment\r\n\r\n/**\r\n* AMD plugin function.\r\n*\r\n* Conditional loads modules based on a has feature test value.\r\n*\r\n* @param resourceId Gives the resolved module id to load.\r\n* @param require The loader require function with respect to the module that contained the plugin resource in its\r\n* dependency list.\r\n* @param load Callback to loader that consumes result of plugin demand.\r\n*/\r\nexport function load(resourceId, require, load, config) {\r\n resourceId ? require([resourceId], load) : load();\r\n}\r\n/**\r\n * AMD plugin function.\r\n *\r\n * Resolves resourceId into a module id based on possibly-nested tenary expression that branches on has feature test\r\n * value(s).\r\n *\r\n * @param resourceId The id of the module\r\n * @param normalize Resolves a relative module id into an absolute module id\r\n */\r\nexport function normalize(resourceId, normalize) {\r\n const tokens = resourceId.match(/[\\?:]|[^:\\?]*/g) || [];\r\n let i = 0;\r\n function get(skip) {\r\n const term = tokens[i++];\r\n if (term === ':') {\r\n // empty string module name, resolves to null\r\n return null;\r\n }\r\n else {\r\n // postfixed with a ? means it is a feature to branch on, the term is the name of the feature\r\n if (tokens[i++] === '?') {\r\n if (!skip && has(term)) {\r\n // matched the feature, get the first value from the options\r\n return get();\r\n }\r\n else {\r\n // did not match, get the second value, passing over the first\r\n get(true);\r\n return get(skip);\r\n }\r\n }\r\n // a module\r\n return term;\r\n }\r\n }\r\n const id = get();\r\n return id && normalize(id);\r\n}\r\n/**\r\n * Check if a feature has already been registered\r\n *\r\n * @param feature the name of the feature\r\n */\r\nexport function exists(feature) {\r\n const normalizedFeature = feature.toLowerCase();\r\n return Boolean(normalizedFeature in staticCache || normalizedFeature in testCache || testFunctions[normalizedFeature]);\r\n}\r\n/**\r\n * Register a new test for a named feature.\r\n *\r\n * @example\r\n * has.add('dom-addeventlistener', !!document.addEventListener);\r\n *\r\n * @example\r\n * has.add('touch-events', function () {\r\n * return 'ontouchstart' in document\r\n * });\r\n *\r\n * @param feature the name of the feature\r\n * @param value the value reported of the feature, or a function that will be executed once on first test\r\n * @param overwrite if an existing value should be overwritten. Defaults to false.\r\n */\r\nexport function add(feature, value, overwrite = false) {\r\n const normalizedFeature = feature.toLowerCase();\r\n if (exists(normalizedFeature) && !overwrite && !(normalizedFeature in staticCache)) {\r\n throw new TypeError(`Feature \"${feature}\" exists and overwrite not true.`);\r\n }\r\n if (typeof value === 'function') {\r\n testFunctions[normalizedFeature] = value;\r\n }\r\n else if (isFeatureTestThenable(value)) {\r\n testThenables[feature] = value.then((resolvedValue) => {\r\n testCache[feature] = resolvedValue;\r\n delete testThenables[feature];\r\n }, () => {\r\n delete testThenables[feature];\r\n });\r\n }\r\n else {\r\n testCache[normalizedFeature] = value;\r\n delete testFunctions[normalizedFeature];\r\n }\r\n}\r\n/**\r\n * Return the current value of a named feature.\r\n *\r\n * @param feature The name (if a string) or identifier (if an integer) of the feature to test.\r\n */\r\nexport default function has(feature) {\r\n let result;\r\n const normalizedFeature = feature.toLowerCase();\r\n if (normalizedFeature in staticCache) {\r\n result = staticCache[normalizedFeature];\r\n }\r\n else if (testFunctions[normalizedFeature]) {\r\n result = testCache[normalizedFeature] = testFunctions[normalizedFeature].call(null);\r\n delete testFunctions[normalizedFeature];\r\n }\r\n else if (normalizedFeature in testCache) {\r\n result = testCache[normalizedFeature];\r\n }\r\n else if (feature in testThenables) {\r\n return false;\r\n }\r\n else {\r\n throw new TypeError(`Attempt to detect unregistered has feature \"${feature}\"`);\r\n }\r\n return result;\r\n}\r\n/*\r\n * Out of the box feature tests\r\n */\r\n/* Environments */\r\n/* Used as a value to provide a debug only code path */\r\nadd('debug', true);\r\n/* Detects if the environment is \"browser like\" */\r\nadd('host-browser', typeof document !== 'undefined' && typeof location !== 'undefined');\r\n/* Detects if the environment appears to be NodeJS */\r\nadd('host-node', function () {\r\n if (typeof process === 'object' && process.versions && process.versions.node) {\r\n return process.versions.node;\r\n }\r\n});\r\n//# sourceMappingURL=has.mjs.map" }, { - "id": "./node_modules/@dojo/shim/Map.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "name": "./node_modules/@dojo/shim/Map.mjs", + "id": "./node_modules/@dojo/framework/shim/Map.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "name": "./node_modules/@dojo/framework/shim/Map.mjs", "index": 15, "index2": 12, "size": 3426, @@ -2880,57 +2888,57 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "1:0-33" + "userRequest": "../shim/Map", + "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\RegistryHandler.mjs", - "module": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\RegistryHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "1:0-37" + "userRequest": "../shim/Map", + "loc": "1:0-34" }, { - "moduleId": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\NodeHandler.mjs", - "module": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "2:0-33" + "userRequest": "../shim/Map", + "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\NodeHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "2:0-33" + "userRequest": "../shim/Map", + "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/core/Evented.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Evented.mjs", - "module": "./node_modules/@dojo/core/Evented.mjs", - "moduleName": "./node_modules/@dojo/core/Evented.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Evented.mjs", + "module": "./node_modules/@dojo/framework/core/Evented.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Evented.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Map", - "loc": "1:0-33" + "userRequest": "../shim/Map", + "loc": "1:0-30" } ], "usedExports": [ @@ -2946,9 +2954,9 @@ "source": "import { isArrayLike, ShimIterator } from './iterator';\r\nimport global from './global';\r\nimport { is as objectIs } from './object';\r\nimport has from './support/has';\r\nimport './Symbol';\r\nexport let Map = global.Map;\r\nif (!true) {\r\n Map = (_a = class Map {\r\n constructor(iterable) {\r\n this._keys = [];\r\n this._values = [];\r\n this[Symbol.toStringTag] = 'Map';\r\n if (iterable) {\r\n if (isArrayLike(iterable)) {\r\n for (let i = 0; i < iterable.length; i++) {\r\n const value = iterable[i];\r\n this.set(value[0], value[1]);\r\n }\r\n }\r\n else {\r\n for (const value of iterable) {\r\n this.set(value[0], value[1]);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * An alternative to Array.prototype.indexOf using Object.is\r\n * to check for equality. See http://mzl.la/1zuKO2V\r\n */\r\n _indexOfKey(keys, key) {\r\n for (let i = 0, length = keys.length; i < length; i++) {\r\n if (objectIs(keys[i], key)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n get size() {\r\n return this._keys.length;\r\n }\r\n clear() {\r\n this._keys.length = this._values.length = 0;\r\n }\r\n delete(key) {\r\n const index = this._indexOfKey(this._keys, key);\r\n if (index < 0) {\r\n return false;\r\n }\r\n this._keys.splice(index, 1);\r\n this._values.splice(index, 1);\r\n return true;\r\n }\r\n entries() {\r\n const values = this._keys.map((key, i) => {\r\n return [key, this._values[i]];\r\n });\r\n return new ShimIterator(values);\r\n }\r\n forEach(callback, context) {\r\n const keys = this._keys;\r\n const values = this._values;\r\n for (let i = 0, length = keys.length; i < length; i++) {\r\n callback.call(context, values[i], keys[i], this);\r\n }\r\n }\r\n get(key) {\r\n const index = this._indexOfKey(this._keys, key);\r\n return index < 0 ? undefined : this._values[index];\r\n }\r\n has(key) {\r\n return this._indexOfKey(this._keys, key) > -1;\r\n }\r\n keys() {\r\n return new ShimIterator(this._keys);\r\n }\r\n set(key, value) {\r\n let index = this._indexOfKey(this._keys, key);\r\n index = index < 0 ? this._keys.length : index;\r\n this._keys[index] = key;\r\n this._values[index] = value;\r\n return this;\r\n }\r\n values() {\r\n return new ShimIterator(this._values);\r\n }\r\n [Symbol.iterator]() {\r\n return this.entries();\r\n }\r\n },\r\n _a[Symbol.species] = _a,\r\n _a);\r\n}\r\nexport default Map;\r\nvar _a;\r\n//# sourceMappingURL=Map.mjs.map" }, { - "id": "./node_modules/@dojo/shim/Promise.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Promise.mjs", - "name": "./node_modules/@dojo/shim/Promise.mjs", + "id": "./node_modules/@dojo/framework/shim/Promise.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Promise.mjs", + "name": "./node_modules/@dojo/framework/shim/Promise.mjs", "index": 22, "index2": 15, "size": 8717, @@ -2960,30 +2968,30 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Registry.mjs", - "issuerId": "./node_modules/@dojo/widget-core/Registry.mjs", - "issuerName": "./node_modules/@dojo/widget-core/Registry.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Registry.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Promise", - "loc": "1:0-41" + "userRequest": "../shim/Promise", + "loc": "1:0-38" }, { - "moduleId": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\Destroyable.mjs", - "module": "./node_modules/@dojo/core/Destroyable.mjs", - "moduleName": "./node_modules/@dojo/core/Destroyable.mjs", + "moduleId": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\Destroyable.mjs", + "module": "./node_modules/@dojo/framework/core/Destroyable.mjs", + "moduleName": "./node_modules/@dojo/framework/core/Destroyable.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Promise", - "loc": "2:0-41" + "userRequest": "../shim/Promise", + "loc": "2:0-38" } ], "usedExports": [ @@ -2999,9 +3007,9 @@ "source": "import global from './global';\r\nimport { queueMicroTask } from './support/queue';\r\nimport './Symbol';\r\nimport has from './support/has';\r\nexport let ShimPromise = global.Promise;\r\nexport const isThenable = function isThenable(value) {\r\n return value && typeof value.then === 'function';\r\n};\r\nif (!true) {\r\n global.Promise = ShimPromise = (_a = class Promise {\r\n /**\r\n * Creates a new Promise.\r\n *\r\n * @constructor\r\n *\r\n * @param executor\r\n * The executor function is called immediately when the Promise is instantiated. It is responsible for\r\n * starting the asynchronous operation when it is invoked.\r\n *\r\n * The executor must call either the passed `resolve` function when the asynchronous operation has completed\r\n * successfully, or the `reject` function when the operation fails.\r\n */\r\n constructor(executor) {\r\n /**\r\n * The current state of this promise.\r\n */\r\n this.state = 1 /* Pending */;\r\n this[Symbol.toStringTag] = 'Promise';\r\n /**\r\n * If true, the resolution of this promise is chained (\"locked in\") to another promise.\r\n */\r\n let isChained = false;\r\n /**\r\n * Whether or not this promise is in a resolved state.\r\n */\r\n const isResolved = () => {\r\n return this.state !== 1 /* Pending */ || isChained;\r\n };\r\n /**\r\n * Callbacks that should be invoked once the asynchronous operation has completed.\r\n */\r\n let callbacks = [];\r\n /**\r\n * Initially pushes callbacks onto a queue for execution once this promise settles. After the promise settles,\r\n * enqueues callbacks for execution on the next event loop turn.\r\n */\r\n let whenFinished = function (callback) {\r\n if (callbacks) {\r\n callbacks.push(callback);\r\n }\r\n };\r\n /**\r\n * Settles this promise.\r\n *\r\n * @param newState The resolved state for this promise.\r\n * @param {T|any} value The resolved value for this promise.\r\n */\r\n const settle = (newState, value) => {\r\n // A promise can only be settled once.\r\n if (this.state !== 1 /* Pending */) {\r\n return;\r\n }\r\n this.state = newState;\r\n this.resolvedValue = value;\r\n whenFinished = queueMicroTask;\r\n // Only enqueue a callback runner if there are callbacks so that initially fulfilled Promises don't have to\r\n // wait an extra turn.\r\n if (callbacks && callbacks.length > 0) {\r\n queueMicroTask(function () {\r\n if (callbacks) {\r\n let count = callbacks.length;\r\n for (let i = 0; i < count; ++i) {\r\n callbacks[i].call(null);\r\n }\r\n callbacks = null;\r\n }\r\n });\r\n }\r\n };\r\n /**\r\n * Resolves this promise.\r\n *\r\n * @param newState The resolved state for this promise.\r\n * @param {T|any} value The resolved value for this promise.\r\n */\r\n const resolve = (newState, value) => {\r\n if (isResolved()) {\r\n return;\r\n }\r\n if (isThenable(value)) {\r\n value.then(settle.bind(null, 0 /* Fulfilled */), settle.bind(null, 2 /* Rejected */));\r\n isChained = true;\r\n }\r\n else {\r\n settle(newState, value);\r\n }\r\n };\r\n this.then = (onFulfilled, onRejected) => {\r\n return new Promise((resolve, reject) => {\r\n // whenFinished initially queues up callbacks for execution after the promise has settled. Once the\r\n // promise has settled, whenFinished will schedule callbacks for execution on the next turn through the\r\n // event loop.\r\n whenFinished(() => {\r\n const callback = this.state === 2 /* Rejected */ ? onRejected : onFulfilled;\r\n if (typeof callback === 'function') {\r\n try {\r\n resolve(callback(this.resolvedValue));\r\n }\r\n catch (error) {\r\n reject(error);\r\n }\r\n }\r\n else if (this.state === 2 /* Rejected */) {\r\n reject(this.resolvedValue);\r\n }\r\n else {\r\n resolve(this.resolvedValue);\r\n }\r\n });\r\n });\r\n };\r\n try {\r\n executor(resolve.bind(null, 0 /* Fulfilled */), resolve.bind(null, 2 /* Rejected */));\r\n }\r\n catch (error) {\r\n settle(2 /* Rejected */, error);\r\n }\r\n }\r\n static all(iterable) {\r\n return new this(function (resolve, reject) {\r\n const values = [];\r\n let complete = 0;\r\n let total = 0;\r\n let populating = true;\r\n function fulfill(index, value) {\r\n values[index] = value;\r\n ++complete;\r\n finish();\r\n }\r\n function finish() {\r\n if (populating || complete < total) {\r\n return;\r\n }\r\n resolve(values);\r\n }\r\n function processItem(index, item) {\r\n ++total;\r\n if (isThenable(item)) {\r\n // If an item Promise rejects, this Promise is immediately rejected with the item\r\n // Promise's rejection error.\r\n item.then(fulfill.bind(null, index), reject);\r\n }\r\n else {\r\n Promise.resolve(item).then(fulfill.bind(null, index));\r\n }\r\n }\r\n let i = 0;\r\n for (const value of iterable) {\r\n processItem(i, value);\r\n i++;\r\n }\r\n populating = false;\r\n finish();\r\n });\r\n }\r\n static race(iterable) {\r\n return new this(function (resolve, reject) {\r\n for (const item of iterable) {\r\n if (item instanceof Promise) {\r\n // If a Promise item rejects, this Promise is immediately rejected with the item\r\n // Promise's rejection error.\r\n item.then(resolve, reject);\r\n }\r\n else {\r\n Promise.resolve(item).then(resolve);\r\n }\r\n }\r\n });\r\n }\r\n static reject(reason) {\r\n return new this(function (resolve, reject) {\r\n reject(reason);\r\n });\r\n }\r\n static resolve(value) {\r\n return new this(function (resolve) {\r\n resolve(value);\r\n });\r\n }\r\n catch(onRejected) {\r\n return this.then(undefined, onRejected);\r\n }\r\n },\r\n _a[Symbol.species] = ShimPromise,\r\n _a);\r\n}\r\nexport default ShimPromise;\r\nvar _a;\r\n//# sourceMappingURL=Promise.mjs.map" }, { - "id": "./node_modules/@dojo/shim/Symbol.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Symbol.mjs", - "name": "./node_modules/@dojo/shim/Symbol.mjs", + "id": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Symbol.mjs", + "name": "./node_modules/@dojo/framework/shim/Symbol.mjs", "index": 5, "index2": 7, "size": 6073, @@ -3013,81 +3021,81 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Symbol", - "loc": "3:0-39" - }, - { - "moduleId": "./node_modules/@dojo/widget-core/d.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\d.mjs", - "module": "./node_modules/@dojo/widget-core/d.mjs", - "moduleName": "./node_modules/@dojo/widget-core/d.mjs", - "type": "harmony import", - "userRequest": "@dojo/shim/Symbol", - "loc": "1:0-39" + "userRequest": "../shim/Symbol", + "loc": "3:0-36" }, { - "moduleId": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Registry.mjs", - "module": "./node_modules/@dojo/widget-core/Registry.mjs", - "moduleName": "./node_modules/@dojo/widget-core/Registry.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/d.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\d.mjs", + "module": "./node_modules/@dojo/framework/widget-core/d.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/d.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/Symbol", - "loc": "3:0-39" + "userRequest": "../shim/Symbol", + "loc": "1:0-36" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "5:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "4:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/iterator.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\iterator.mjs", - "module": "./node_modules/@dojo/shim/iterator.mjs", - "moduleName": "./node_modules/@dojo/shim/iterator.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Registry.mjs", + "module": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "type": "harmony import", + "userRequest": "../shim/Symbol", + "loc": "3:0-36" + }, + { + "moduleId": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\iterator.mjs", + "module": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/iterator.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "1:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "3:0-18" }, { - "moduleId": "./node_modules/@dojo/shim/object.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\object.mjs", - "module": "./node_modules/@dojo/shim/object.mjs", - "moduleName": "./node_modules/@dojo/shim/object.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\object.mjs", + "module": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/object.mjs", "type": "harmony import", "userRequest": "./Symbol", "loc": "3:0-36" @@ -3106,9 +3114,9 @@ "source": "import has from './support/has';\r\nimport global from './global';\r\nimport { getValueDescriptor } from './support/util';\r\nexport let Symbol = global.Symbol;\r\nif (!true) {\r\n /**\r\n * Throws if the value is not a symbol, used internally within the Shim\r\n * @param {any} value The value to check\r\n * @return {symbol} Returns the symbol or throws\r\n */\r\n const validateSymbol = function validateSymbol(value) {\r\n if (!isSymbol(value)) {\r\n throw new TypeError(value + ' is not a symbol');\r\n }\r\n return value;\r\n };\r\n const defineProperties = Object.defineProperties;\r\n const defineProperty = Object.defineProperty;\r\n const create = Object.create;\r\n const objPrototype = Object.prototype;\r\n const globalSymbols = {};\r\n const getSymbolName = (function () {\r\n const created = create(null);\r\n return function (desc) {\r\n let postfix = 0;\r\n let name;\r\n while (created[String(desc) + (postfix || '')]) {\r\n ++postfix;\r\n }\r\n desc += String(postfix || '');\r\n created[desc] = true;\r\n name = '@@' + desc;\r\n // FIXME: Temporary guard until the duplicate execution when testing can be\r\n // pinned down.\r\n if (!Object.getOwnPropertyDescriptor(objPrototype, name)) {\r\n defineProperty(objPrototype, name, {\r\n set: function (value) {\r\n defineProperty(this, name, getValueDescriptor(value));\r\n }\r\n });\r\n }\r\n return name;\r\n };\r\n })();\r\n const InternalSymbol = function Symbol(description) {\r\n if (this instanceof InternalSymbol) {\r\n throw new TypeError('TypeError: Symbol is not a constructor');\r\n }\r\n return Symbol(description);\r\n };\r\n Symbol = global.Symbol = function Symbol(description) {\r\n if (this instanceof Symbol) {\r\n throw new TypeError('TypeError: Symbol is not a constructor');\r\n }\r\n const sym = Object.create(InternalSymbol.prototype);\r\n description = description === undefined ? '' : String(description);\r\n return defineProperties(sym, {\r\n __description__: getValueDescriptor(description),\r\n __name__: getValueDescriptor(getSymbolName(description))\r\n });\r\n };\r\n /* Decorate the Symbol function with the appropriate properties */\r\n defineProperty(Symbol, 'for', getValueDescriptor(function (key) {\r\n if (globalSymbols[key]) {\r\n return globalSymbols[key];\r\n }\r\n return (globalSymbols[key] = Symbol(String(key)));\r\n }));\r\n defineProperties(Symbol, {\r\n keyFor: getValueDescriptor(function (sym) {\r\n let key;\r\n validateSymbol(sym);\r\n for (key in globalSymbols) {\r\n if (globalSymbols[key] === sym) {\r\n return key;\r\n }\r\n }\r\n }),\r\n hasInstance: getValueDescriptor(Symbol.for('hasInstance'), false, false),\r\n isConcatSpreadable: getValueDescriptor(Symbol.for('isConcatSpreadable'), false, false),\r\n iterator: getValueDescriptor(Symbol.for('iterator'), false, false),\r\n match: getValueDescriptor(Symbol.for('match'), false, false),\r\n observable: getValueDescriptor(Symbol.for('observable'), false, false),\r\n replace: getValueDescriptor(Symbol.for('replace'), false, false),\r\n search: getValueDescriptor(Symbol.for('search'), false, false),\r\n species: getValueDescriptor(Symbol.for('species'), false, false),\r\n split: getValueDescriptor(Symbol.for('split'), false, false),\r\n toPrimitive: getValueDescriptor(Symbol.for('toPrimitive'), false, false),\r\n toStringTag: getValueDescriptor(Symbol.for('toStringTag'), false, false),\r\n unscopables: getValueDescriptor(Symbol.for('unscopables'), false, false)\r\n });\r\n /* Decorate the InternalSymbol object */\r\n defineProperties(InternalSymbol.prototype, {\r\n constructor: getValueDescriptor(Symbol),\r\n toString: getValueDescriptor(function () {\r\n return this.__name__;\r\n }, false, false)\r\n });\r\n /* Decorate the Symbol.prototype */\r\n defineProperties(Symbol.prototype, {\r\n toString: getValueDescriptor(function () {\r\n return 'Symbol (' + validateSymbol(this).__description__ + ')';\r\n }),\r\n valueOf: getValueDescriptor(function () {\r\n return validateSymbol(this);\r\n })\r\n });\r\n defineProperty(Symbol.prototype, Symbol.toPrimitive, getValueDescriptor(function () {\r\n return validateSymbol(this);\r\n }));\r\n defineProperty(Symbol.prototype, Symbol.toStringTag, getValueDescriptor('Symbol', false, false, true));\r\n defineProperty(InternalSymbol.prototype, Symbol.toPrimitive, getValueDescriptor(Symbol.prototype[Symbol.toPrimitive], false, false, true));\r\n defineProperty(InternalSymbol.prototype, Symbol.toStringTag, getValueDescriptor(Symbol.prototype[Symbol.toStringTag], false, false, true));\r\n}\r\n/**\r\n * A custom guard function that determines if an object is a symbol or not\r\n * @param {any} value The value to check to see if it is a symbol or not\r\n * @return {is symbol} Returns true if a symbol or not (and narrows the type guard)\r\n */\r\nexport function isSymbol(value) {\r\n return (value && (typeof value === 'symbol' || value['@@toStringTag'] === 'Symbol')) || false;\r\n}\r\n/**\r\n * Fill any missing well known symbols if the native Symbol is missing them\r\n */\r\n[\r\n 'hasInstance',\r\n 'isConcatSpreadable',\r\n 'iterator',\r\n 'species',\r\n 'replace',\r\n 'search',\r\n 'split',\r\n 'match',\r\n 'toPrimitive',\r\n 'toStringTag',\r\n 'unscopables',\r\n 'observable'\r\n].forEach((wellKnown) => {\r\n if (!Symbol[wellKnown]) {\r\n Object.defineProperty(Symbol, wellKnown, getValueDescriptor(Symbol.for(wellKnown), false, false));\r\n }\r\n});\r\nexport default Symbol;\r\n//# sourceMappingURL=Symbol.mjs.map" }, { - "id": "./node_modules/@dojo/shim/WeakMap.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\WeakMap.mjs", - "name": "./node_modules/@dojo/shim/WeakMap.mjs", + "id": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\WeakMap.mjs", + "name": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "index": 19, "index2": 13, "size": 3858, @@ -3120,39 +3128,39 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/WeakMap", - "loc": "2:0-41" + "userRequest": "../shim/WeakMap", + "loc": "2:0-38" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\inject.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/WeakMap", - "loc": "5:0-41" + "userRequest": "../../shim/WeakMap", + "loc": "1:0-41" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\inject.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/WeakMap", - "loc": "1:0-41" + "userRequest": "../shim/WeakMap", + "loc": "5:0-38" } ], "usedExports": [ @@ -3167,9 +3175,9 @@ "source": "import global from './global';\r\nimport { isArrayLike } from './iterator';\r\nimport has from './support/has';\r\nimport './Symbol';\r\nexport let WeakMap = global.WeakMap;\r\nif (!true) {\r\n const DELETED = {};\r\n const getUID = function getUID() {\r\n return Math.floor(Math.random() * 100000000);\r\n };\r\n const generateName = (function () {\r\n let startId = Math.floor(Date.now() % 100000000);\r\n return function generateName() {\r\n return '__wm' + getUID() + (startId++ + '__');\r\n };\r\n })();\r\n WeakMap = class WeakMap {\r\n constructor(iterable) {\r\n this[Symbol.toStringTag] = 'WeakMap';\r\n this._name = generateName();\r\n this._frozenEntries = [];\r\n if (iterable) {\r\n if (isArrayLike(iterable)) {\r\n for (let i = 0; i < iterable.length; i++) {\r\n const item = iterable[i];\r\n this.set(item[0], item[1]);\r\n }\r\n }\r\n else {\r\n for (const [key, value] of iterable) {\r\n this.set(key, value);\r\n }\r\n }\r\n }\r\n }\r\n _getFrozenEntryIndex(key) {\r\n for (let i = 0; i < this._frozenEntries.length; i++) {\r\n if (this._frozenEntries[i].key === key) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n delete(key) {\r\n if (key === undefined || key === null) {\r\n return false;\r\n }\r\n const entry = key[this._name];\r\n if (entry && entry.key === key && entry.value !== DELETED) {\r\n entry.value = DELETED;\r\n return true;\r\n }\r\n const frozenIndex = this._getFrozenEntryIndex(key);\r\n if (frozenIndex >= 0) {\r\n this._frozenEntries.splice(frozenIndex, 1);\r\n return true;\r\n }\r\n return false;\r\n }\r\n get(key) {\r\n if (key === undefined || key === null) {\r\n return undefined;\r\n }\r\n const entry = key[this._name];\r\n if (entry && entry.key === key && entry.value !== DELETED) {\r\n return entry.value;\r\n }\r\n const frozenIndex = this._getFrozenEntryIndex(key);\r\n if (frozenIndex >= 0) {\r\n return this._frozenEntries[frozenIndex].value;\r\n }\r\n }\r\n has(key) {\r\n if (key === undefined || key === null) {\r\n return false;\r\n }\r\n const entry = key[this._name];\r\n if (Boolean(entry && entry.key === key && entry.value !== DELETED)) {\r\n return true;\r\n }\r\n const frozenIndex = this._getFrozenEntryIndex(key);\r\n if (frozenIndex >= 0) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n set(key, value) {\r\n if (!key || (typeof key !== 'object' && typeof key !== 'function')) {\r\n throw new TypeError('Invalid value used as weak map key');\r\n }\r\n let entry = key[this._name];\r\n if (!entry || entry.key !== key) {\r\n entry = Object.create(null, {\r\n key: { value: key }\r\n });\r\n if (Object.isFrozen(key)) {\r\n this._frozenEntries.push(entry);\r\n }\r\n else {\r\n Object.defineProperty(key, this._name, {\r\n value: entry\r\n });\r\n }\r\n }\r\n entry.value = value;\r\n return this;\r\n }\r\n };\r\n}\r\nexport default WeakMap;\r\n//# sourceMappingURL=WeakMap.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\afterRender.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\afterRender.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", "index": 34, "index2": 29, "size": 311, @@ -3181,18 +3189,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "./../decorators/afterRender", "loc": "4:0-58" @@ -3237,9 +3245,9 @@ "depth": 0 }, { - "id": "./node_modules/@dojo/shim/array.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "name": "./node_modules/@dojo/shim/array.mjs", + "id": "./node_modules/@dojo/framework/shim/array.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "name": "./node_modules/@dojo/framework/shim/array.mjs", "index": 30, "index2": 24, "size": 9175, @@ -3251,30 +3259,30 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/array", - "loc": "4:0-40" + "userRequest": "../shim/array", + "loc": "4:0-37" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/array", - "loc": "2:0-53" + "userRequest": "../shim/array", + "loc": "2:0-50" } ], "usedExports": [ @@ -3294,9 +3302,9 @@ "source": "import global from './global';\r\nimport { isArrayLike, isIterable } from './iterator';\r\nimport { MAX_SAFE_INTEGER } from './number';\r\nimport has from './support/has';\r\nimport { wrapNative } from './support/util';\r\nexport let from;\r\n/**\r\n * Creates a new array from the function parameters.\r\n *\r\n * @param arguments Any number of arguments for the array\r\n * @return An array from the given arguments\r\n */\r\nexport let of;\r\n/* ES6 Array instance methods */\r\n/**\r\n * Copies data internally within an array or array-like object.\r\n *\r\n * @param target The target array-like object\r\n * @param offset The index to start copying values to; if negative, it counts backwards from length\r\n * @param start The first (inclusive) index to copy; if negative, it counts backwards from length\r\n * @param end The last (exclusive) index to copy; if negative, it counts backwards from length\r\n * @return The target\r\n */\r\nexport let copyWithin;\r\n/**\r\n * Fills elements of an array-like object with the specified value.\r\n *\r\n * @param target The target to fill\r\n * @param value The value to fill each element of the target with\r\n * @param start The first index to fill\r\n * @param end The (exclusive) index at which to stop filling\r\n * @return The filled target\r\n */\r\nexport let fill;\r\n/**\r\n * Finds and returns the first instance matching the callback or undefined if one is not found.\r\n *\r\n * @param target An array-like object\r\n * @param callback A function returning if the current value matches a criteria\r\n * @param thisArg The execution context for the find function\r\n * @return The first element matching the callback, or undefined if one does not exist\r\n */\r\nexport let find;\r\n/**\r\n * Performs a linear search and returns the first index whose value satisfies the passed callback,\r\n * or -1 if no values satisfy it.\r\n *\r\n * @param target An array-like object\r\n * @param callback A function returning true if the current value satisfies its criteria\r\n * @param thisArg The execution context for the find function\r\n * @return The first index whose value satisfies the passed callback, or -1 if no values satisfy it\r\n */\r\nexport let findIndex;\r\n/* ES7 Array instance methods */\r\n/**\r\n * Determines whether an array includes a given value\r\n *\r\n * @param target the target array-like object\r\n * @param searchElement the item to search for\r\n * @param fromIndex the starting index to search from\r\n * @return `true` if the array includes the element, otherwise `false`\r\n */\r\nexport let includes;\r\nif (true && true) {\r\n from = global.Array.from;\r\n of = global.Array.of;\r\n copyWithin = wrapNative(global.Array.prototype.copyWithin);\r\n fill = wrapNative(global.Array.prototype.fill);\r\n find = wrapNative(global.Array.prototype.find);\r\n findIndex = wrapNative(global.Array.prototype.findIndex);\r\n}\r\nelse {\r\n // It is only older versions of Safari/iOS that have a bad fill implementation and so aren't in the wild\r\n // To make things easier, if there is a bad fill implementation, the whole set of functions will be filled\r\n /**\r\n * Ensures a non-negative, non-infinite, safe integer.\r\n *\r\n * @param length The number to validate\r\n * @return A proper length\r\n */\r\n const toLength = function toLength(length) {\r\n if (isNaN(length)) {\r\n return 0;\r\n }\r\n length = Number(length);\r\n if (isFinite(length)) {\r\n length = Math.floor(length);\r\n }\r\n // Ensure a non-negative, real, safe integer\r\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\r\n };\r\n /**\r\n * From ES6 7.1.4 ToInteger()\r\n *\r\n * @param value A value to convert\r\n * @return An integer\r\n */\r\n const toInteger = function toInteger(value) {\r\n value = Number(value);\r\n if (isNaN(value)) {\r\n return 0;\r\n }\r\n if (value === 0 || !isFinite(value)) {\r\n return value;\r\n }\r\n return (value > 0 ? 1 : -1) * Math.floor(Math.abs(value));\r\n };\r\n /**\r\n * Normalizes an offset against a given length, wrapping it if negative.\r\n *\r\n * @param value The original offset\r\n * @param length The total length to normalize against\r\n * @return If negative, provide a distance from the end (length); otherwise provide a distance from 0\r\n */\r\n const normalizeOffset = function normalizeOffset(value, length) {\r\n return value < 0 ? Math.max(length + value, 0) : Math.min(value, length);\r\n };\r\n from = function from(arrayLike, mapFunction, thisArg) {\r\n if (arrayLike == null) {\r\n throw new TypeError('from: requires an array-like object');\r\n }\r\n if (mapFunction && thisArg) {\r\n mapFunction = mapFunction.bind(thisArg);\r\n }\r\n /* tslint:disable-next-line:variable-name */\r\n const Constructor = this;\r\n const length = toLength(arrayLike.length);\r\n // Support extension\r\n const array = typeof Constructor === 'function' ? Object(new Constructor(length)) : new Array(length);\r\n if (!isArrayLike(arrayLike) && !isIterable(arrayLike)) {\r\n return array;\r\n }\r\n // if this is an array and the normalized length is 0, just return an empty array. this prevents a problem\r\n // with the iteration on IE when using a NaN array length.\r\n if (isArrayLike(arrayLike)) {\r\n if (length === 0) {\r\n return [];\r\n }\r\n for (let i = 0; i < arrayLike.length; i++) {\r\n array[i] = mapFunction ? mapFunction(arrayLike[i], i) : arrayLike[i];\r\n }\r\n }\r\n else {\r\n let i = 0;\r\n for (const value of arrayLike) {\r\n array[i] = mapFunction ? mapFunction(value, i) : value;\r\n i++;\r\n }\r\n }\r\n if (arrayLike.length !== undefined) {\r\n array.length = length;\r\n }\r\n return array;\r\n };\r\n of = function of(...items) {\r\n return Array.prototype.slice.call(items);\r\n };\r\n copyWithin = function copyWithin(target, offset, start, end) {\r\n if (target == null) {\r\n throw new TypeError('copyWithin: target must be an array-like object');\r\n }\r\n const length = toLength(target.length);\r\n offset = normalizeOffset(toInteger(offset), length);\r\n start = normalizeOffset(toInteger(start), length);\r\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\r\n let count = Math.min(end - start, length - offset);\r\n let direction = 1;\r\n if (offset > start && offset < start + count) {\r\n direction = -1;\r\n start += count - 1;\r\n offset += count - 1;\r\n }\r\n while (count > 0) {\r\n if (start in target) {\r\n target[offset] = target[start];\r\n }\r\n else {\r\n delete target[offset];\r\n }\r\n offset += direction;\r\n start += direction;\r\n count--;\r\n }\r\n return target;\r\n };\r\n fill = function fill(target, value, start, end) {\r\n const length = toLength(target.length);\r\n let i = normalizeOffset(toInteger(start), length);\r\n end = normalizeOffset(end === undefined ? length : toInteger(end), length);\r\n while (i < end) {\r\n target[i++] = value;\r\n }\r\n return target;\r\n };\r\n find = function find(target, callback, thisArg) {\r\n const index = findIndex(target, callback, thisArg);\r\n return index !== -1 ? target[index] : undefined;\r\n };\r\n findIndex = function findIndex(target, callback, thisArg) {\r\n const length = toLength(target.length);\r\n if (!callback) {\r\n throw new TypeError('find: second argument must be a function');\r\n }\r\n if (thisArg) {\r\n callback = callback.bind(thisArg);\r\n }\r\n for (let i = 0; i < length; i++) {\r\n if (callback(target[i], i, target)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n };\r\n}\r\nif (true) {\r\n includes = wrapNative(global.Array.prototype.includes);\r\n}\r\nelse {\r\n /**\r\n * Ensures a non-negative, non-infinite, safe integer.\r\n *\r\n * @param length The number to validate\r\n * @return A proper length\r\n */\r\n const toLength = function toLength(length) {\r\n length = Number(length);\r\n if (isNaN(length)) {\r\n return 0;\r\n }\r\n if (isFinite(length)) {\r\n length = Math.floor(length);\r\n }\r\n // Ensure a non-negative, real, safe integer\r\n return Math.min(Math.max(length, 0), MAX_SAFE_INTEGER);\r\n };\r\n includes = function includes(target, searchElement, fromIndex = 0) {\r\n let len = toLength(target.length);\r\n for (let i = fromIndex; i < len; ++i) {\r\n const currentElement = target[i];\r\n if (searchElement === currentElement ||\r\n (searchElement !== searchElement && currentElement !== currentElement)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n}\r\n//# sourceMappingURL=array.mjs.map" }, { - "id": "./node_modules/@dojo/shim/global.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\global.mjs", - "name": "./node_modules/@dojo/shim/global.mjs", + "id": "./node_modules/@dojo/framework/shim/global.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\global.mjs", + "name": "./node_modules/@dojo/framework/shim/global.mjs", "index": 10, "index2": 4, "size": 581, @@ -3308,117 +3316,117 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/global", - "loc": "6:0-39" - }, - { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", - "type": "harmony import", - "userRequest": "@dojo/shim/global", - "loc": "1:0-39" + "userRequest": "../shim/global", + "loc": "6:0-36" }, { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./global", "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Symbol.mjs", - "module": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleName": "./node_modules/@dojo/shim/Symbol.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Symbol.mjs", + "module": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Symbol.mjs", "type": "harmony import", "userRequest": "./global", "loc": "2:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/number.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\number.mjs", - "module": "./node_modules/@dojo/shim/number.mjs", - "moduleName": "./node_modules/@dojo/shim/number.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/number.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\number.mjs", + "module": "./node_modules/@dojo/framework/shim/number.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/number.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/support/has.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\has.mjs", - "module": "./node_modules/@dojo/shim/support/has.mjs", - "moduleName": "./node_modules/@dojo/shim/support/has.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "type": "harmony import", + "userRequest": "../shim/global", + "loc": "1:0-36" + }, + { + "moduleId": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\has.mjs", + "module": "./node_modules/@dojo/framework/shim/support/has.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/has.mjs", "type": "harmony import", "userRequest": "../global", "loc": "2:0-31" }, { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/object.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\object.mjs", - "module": "./node_modules/@dojo/shim/object.mjs", - "moduleName": "./node_modules/@dojo/shim/object.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\object.mjs", + "module": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/object.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/string.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\string.mjs", - "module": "./node_modules/@dojo/shim/string.mjs", - "moduleName": "./node_modules/@dojo/shim/string.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\string.mjs", + "module": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/string.mjs", "type": "harmony import", "userRequest": "./global", "loc": "1:0-30" }, { - "moduleId": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\queue.mjs", - "module": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleName": "./node_modules/@dojo/shim/support/queue.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\queue.mjs", + "module": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/queue.mjs", "type": "harmony import", "userRequest": "../global", "loc": "1:0-31" @@ -3435,9 +3443,9 @@ "source": "const globalObject = (function () {\n if (typeof global !== 'undefined') {\n // global spec defines a reference to the global object called 'global'\n // https://github.com/tc39/proposal-global\n // `global` is also defined in NodeJS\n return global;\n }\n else if (typeof window !== 'undefined') {\n // window is defined in browsers\n return window;\n }\n else if (typeof self !== 'undefined') {\n // self is defined in WebWorkers\n return self;\n }\n})();\nexport default globalObject;\n//# sourceMappingURL=global.mjs.map" }, { - "id": "./node_modules/@dojo/shim/iterator.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\iterator.mjs", - "name": "./node_modules/@dojo/shim/iterator.mjs", + "id": "./node_modules/@dojo/framework/shim/iterator.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\iterator.mjs", + "name": "./node_modules/@dojo/framework/shim/iterator.mjs", "index": 16, "index2": 10, "size": 3158, @@ -3449,36 +3457,36 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./iterator", "loc": "2:0-53" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./iterator", "loc": "1:0-55" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./iterator", "loc": "2:0-41" @@ -3497,9 +3505,9 @@ "source": "import './Symbol';\nimport { HIGH_SURROGATE_MAX, HIGH_SURROGATE_MIN } from './string';\nconst staticDone = { done: true, value: undefined };\n/**\n * A class that _shims_ an iterator interface on array like objects.\n */\nexport class ShimIterator {\n constructor(list) {\n this._nextIndex = -1;\n if (isIterable(list)) {\n this._nativeIterator = list[Symbol.iterator]();\n }\n else {\n this._list = list;\n }\n }\n /**\n * Return the next iteration result for the Iterator\n */\n next() {\n if (this._nativeIterator) {\n return this._nativeIterator.next();\n }\n if (!this._list) {\n return staticDone;\n }\n if (++this._nextIndex < this._list.length) {\n return {\n done: false,\n value: this._list[this._nextIndex]\n };\n }\n return staticDone;\n }\n [Symbol.iterator]() {\n return this;\n }\n}\n/**\n * A type guard for checking if something has an Iterable interface\n *\n * @param value The value to type guard against\n */\nexport function isIterable(value) {\n return value && typeof value[Symbol.iterator] === 'function';\n}\n/**\n * A type guard for checking if something is ArrayLike\n *\n * @param value The value to type guard against\n */\nexport function isArrayLike(value) {\n return value && typeof value.length === 'number';\n}\n/**\n * Returns the iterator for an object\n *\n * @param iterable The iterable object to return the iterator for\n */\nexport function get(iterable) {\n if (isIterable(iterable)) {\n return iterable[Symbol.iterator]();\n }\n else if (isArrayLike(iterable)) {\n return new ShimIterator(iterable);\n }\n}\n/**\n * Shims the functionality of `for ... of` blocks\n *\n * @param iterable The object the provides an interator interface\n * @param callback The callback which will be called for each item of the iterable\n * @param thisArg Optional scope to pass the callback\n */\nexport function forOf(iterable, callback, thisArg) {\n let broken = false;\n function doBreak() {\n broken = true;\n }\n /* We need to handle iteration of double byte strings properly */\n if (isArrayLike(iterable) && typeof iterable === 'string') {\n const l = iterable.length;\n for (let i = 0; i < l; ++i) {\n let char = iterable[i];\n if (i + 1 < l) {\n const code = char.charCodeAt(0);\n if (code >= HIGH_SURROGATE_MIN && code <= HIGH_SURROGATE_MAX) {\n char += iterable[++i];\n }\n }\n callback.call(thisArg, char, iterable, doBreak);\n if (broken) {\n return;\n }\n }\n }\n else {\n const iterator = get(iterable);\n if (iterator) {\n let result = iterator.next();\n while (!result.done) {\n callback.call(thisArg, result.value, iterable, doBreak);\n if (broken) {\n return;\n }\n result = iterator.next();\n }\n }\n }\n}\n//# sourceMappingURL=iterator.mjs.map" }, { - "id": "./node_modules/@dojo/shim/number.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\number.mjs", - "name": "./node_modules/@dojo/shim/number.mjs", + "id": "./node_modules/@dojo/framework/shim/number.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\number.mjs", + "name": "./node_modules/@dojo/framework/shim/number.mjs", "index": 31, "index2": 23, "size": 1724, @@ -3511,18 +3519,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./number", "loc": "3:0-44" @@ -3543,9 +3551,9 @@ "source": "import global from './global';\n/**\n * The smallest interval between two representable numbers.\n */\nexport const EPSILON = 1;\n/**\n * The maximum safe integer in JavaScript\n */\nexport const MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n/**\n * The minimum safe integer in JavaScript\n */\nexport const MIN_SAFE_INTEGER = -MAX_SAFE_INTEGER;\n/**\n * Determines whether the passed value is NaN without coersion.\n *\n * @param value The value to test\n * @return true if the value is NaN, false if it is not\n */\nexport function isNaN(value) {\n return typeof value === 'number' && global.isNaN(value);\n}\n/**\n * Determines whether the passed value is a finite number without coersion.\n *\n * @param value The value to test\n * @return true if the value is finite, false if it is not\n */\nexport function isFinite(value) {\n return typeof value === 'number' && global.isFinite(value);\n}\n/**\n * Determines whether the passed value is an integer.\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isInteger(value) {\n return isFinite(value) && Math.floor(value) === value;\n}\n/**\n * Determines whether the passed value is an integer that is 'safe,' meaning:\n * 1. it can be expressed as an IEEE-754 double precision number\n * 2. it has a one-to-one mapping to a mathematical integer, meaning its\n * IEEE-754 representation cannot be the result of rounding any other\n * integer to fit the IEEE-754 representation\n *\n * @param value The value to test\n * @return true if the value is an integer, false if it is not\n */\nexport function isSafeInteger(value) {\n return isInteger(value) && Math.abs(value) <= MAX_SAFE_INTEGER;\n}\n//# sourceMappingURL=number.mjs.map" }, { - "id": "./node_modules/@dojo/shim/object.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\object.mjs", - "name": "./node_modules/@dojo/shim/object.mjs", + "id": "./node_modules/@dojo/framework/shim/object.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\object.mjs", + "name": "./node_modules/@dojo/framework/shim/object.mjs", "index": 18, "index2": 11, "size": 4171, @@ -3557,39 +3565,39 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "issuerId": "./node_modules/@dojo/shim/Map.mjs", - "issuerName": "./node_modules/@dojo/shim/Map.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/Map.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/Map.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./object", "loc": "3:0-42" }, { - "moduleId": "./node_modules/@dojo/core/lang.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\lang.mjs", - "module": "./node_modules/@dojo/core/lang.mjs", - "moduleName": "./node_modules/@dojo/core/lang.mjs", + "moduleId": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\lang.mjs", + "module": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleName": "./node_modules/@dojo/framework/core/lang.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/object", - "loc": "1:0-43" + "userRequest": "../shim/object", + "loc": "1:0-40" }, { - "moduleId": "./node_modules/@dojo/core/lang.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\core\\lang.mjs", - "module": "./node_modules/@dojo/core/lang.mjs", - "moduleName": "./node_modules/@dojo/core/lang.mjs", + "moduleId": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\core\\lang.mjs", + "module": "./node_modules/@dojo/framework/core/lang.mjs", + "moduleName": "./node_modules/@dojo/framework/core/lang.mjs", "type": "harmony import", - "userRequest": "@dojo/shim/object", - "loc": "2:0-43" + "userRequest": "../shim/object", + "loc": "2:0-40" } ], "usedExports": [ @@ -3611,9 +3619,9 @@ "source": "import global from './global';\r\nimport has from './support/has';\r\nimport { isSymbol } from './Symbol';\r\nexport let assign;\r\n/**\r\n * Gets the own property descriptor of the specified object.\r\n * An own property descriptor is one that is defined directly on the object and is not\r\n * inherited from the object's prototype.\r\n * @param o Object that contains the property.\r\n * @param p Name of the property.\r\n */\r\nexport let getOwnPropertyDescriptor;\r\n/**\r\n * Returns the names of the own properties of an object. The own properties of an object are those that are defined directly\r\n * on that object, and are not inherited from the object's prototype. The properties of an object include both fields (objects) and functions.\r\n * @param o Object that contains the own properties.\r\n */\r\nexport let getOwnPropertyNames;\r\n/**\r\n * Returns an array of all symbol properties found directly on object o.\r\n * @param o Object to retrieve the symbols from.\r\n */\r\nexport let getOwnPropertySymbols;\r\n/**\r\n * Returns true if the values are the same value, false otherwise.\r\n * @param value1 The first value.\r\n * @param value2 The second value.\r\n */\r\nexport let is;\r\n/**\r\n * Returns the names of the enumerable properties and methods of an object.\r\n * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.\r\n */\r\nexport let keys;\r\n/* ES7 Object static methods */\r\nexport let getOwnPropertyDescriptors;\r\nexport let entries;\r\nexport let values;\r\nif (true) {\r\n const globalObject = global.Object;\r\n assign = globalObject.assign;\r\n getOwnPropertyDescriptor = globalObject.getOwnPropertyDescriptor;\r\n getOwnPropertyNames = globalObject.getOwnPropertyNames;\r\n getOwnPropertySymbols = globalObject.getOwnPropertySymbols;\r\n is = globalObject.is;\r\n keys = globalObject.keys;\r\n}\r\nelse {\r\n keys = function symbolAwareKeys(o) {\r\n return Object.keys(o).filter((key) => !Boolean(key.match(/^@@.+/)));\r\n };\r\n assign = function assign(target, ...sources) {\r\n if (target == null) {\r\n // TypeError if undefined or null\r\n throw new TypeError('Cannot convert undefined or null to object');\r\n }\r\n const to = Object(target);\r\n sources.forEach((nextSource) => {\r\n if (nextSource) {\r\n // Skip over if undefined or null\r\n keys(nextSource).forEach((nextKey) => {\r\n to[nextKey] = nextSource[nextKey];\r\n });\r\n }\r\n });\r\n return to;\r\n };\r\n getOwnPropertyDescriptor = function getOwnPropertyDescriptor(o, prop) {\r\n if (isSymbol(prop)) {\r\n return Object.getOwnPropertyDescriptor(o, prop);\r\n }\r\n else {\r\n return Object.getOwnPropertyDescriptor(o, prop);\r\n }\r\n };\r\n getOwnPropertyNames = function getOwnPropertyNames(o) {\r\n return Object.getOwnPropertyNames(o).filter((key) => !Boolean(key.match(/^@@.+/)));\r\n };\r\n getOwnPropertySymbols = function getOwnPropertySymbols(o) {\r\n return Object.getOwnPropertyNames(o)\r\n .filter((key) => Boolean(key.match(/^@@.+/)))\r\n .map((key) => Symbol.for(key.substring(2)));\r\n };\r\n is = function is(value1, value2) {\r\n if (value1 === value2) {\r\n return value1 !== 0 || 1 / value1 === 1 / value2; // -0\r\n }\r\n return value1 !== value1 && value2 !== value2; // NaN\r\n };\r\n}\r\nif (true) {\r\n const globalObject = global.Object;\r\n getOwnPropertyDescriptors = globalObject.getOwnPropertyDescriptors;\r\n entries = globalObject.entries;\r\n values = globalObject.values;\r\n}\r\nelse {\r\n getOwnPropertyDescriptors = function getOwnPropertyDescriptors(o) {\r\n return getOwnPropertyNames(o).reduce((previous, key) => {\r\n previous[key] = getOwnPropertyDescriptor(o, key);\r\n return previous;\r\n }, {});\r\n };\r\n entries = function entries(o) {\r\n return keys(o).map((key) => [key, o[key]]);\r\n };\r\n values = function values(o) {\r\n return keys(o).map((key) => o[key]);\r\n };\r\n}\r\n//# sourceMappingURL=object.mjs.map" }, { - "id": "./node_modules/@dojo/shim/string.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\string.mjs", - "name": "./node_modules/@dojo/shim/string.mjs", + "id": "./node_modules/@dojo/framework/shim/string.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\string.mjs", + "name": "./node_modules/@dojo/framework/shim/string.mjs", "index": 17, "index2": 9, "size": 12714, @@ -3625,18 +3633,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\iterator.mjs", - "issuerId": "./node_modules/@dojo/shim/iterator.mjs", - "issuerName": "./node_modules/@dojo/shim/iterator.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\iterator.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/iterator.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/iterator.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/iterator.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\iterator.mjs", - "module": "./node_modules/@dojo/shim/iterator.mjs", - "moduleName": "./node_modules/@dojo/shim/iterator.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\iterator.mjs", + "module": "./node_modules/@dojo/framework/shim/iterator.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/iterator.mjs", "type": "harmony import", "userRequest": "./string", "loc": "2:0-66" @@ -3667,9 +3675,9 @@ "source": "import global from './global';\r\nimport has from './support/has';\r\nimport { wrapNative } from './support/util';\r\n/**\r\n * The minimum location of high surrogates\r\n */\r\nexport const HIGH_SURROGATE_MIN = 0xd800;\r\n/**\r\n * The maximum location of high surrogates\r\n */\r\nexport const HIGH_SURROGATE_MAX = 0xdbff;\r\n/**\r\n * The minimum location of low surrogates\r\n */\r\nexport const LOW_SURROGATE_MIN = 0xdc00;\r\n/**\r\n * The maximum location of low surrogates\r\n */\r\nexport const LOW_SURROGATE_MAX = 0xdfff;\r\n/* ES6 static methods */\r\n/**\r\n * Return the String value whose elements are, in order, the elements in the List elements.\r\n * If length is 0, the empty string is returned.\r\n * @param codePoints The code points to generate the string\r\n */\r\nexport let fromCodePoint;\r\n/**\r\n * `raw` is intended for use as a tag function of a Tagged Template String. When called\r\n * as such the first argument will be a well formed template call site object and the rest\r\n * parameter will contain the substitution values.\r\n * @param template A well-formed template string call site representation.\r\n * @param substitutions A set of substitution values.\r\n */\r\nexport let raw;\r\n/* ES6 instance methods */\r\n/**\r\n * Returns a nonnegative integer Number less than 1114112 (0x110000) that is the code point\r\n * value of the UTF-16 encoded code point starting at the string element at position pos in\r\n * the String resulting from converting this object to a String.\r\n * If there is no element at that position, the result is undefined.\r\n * If a valid UTF-16 surrogate pair does not begin at pos, the result is the code unit at pos.\r\n */\r\nexport let codePointAt;\r\n/**\r\n * Returns true if the sequence of elements of searchString converted to a String is the\r\n * same as the corresponding elements of this object (converted to a String) starting at\r\n * endPosition – length(this). Otherwise returns false.\r\n */\r\nexport let endsWith;\r\n/**\r\n * Returns true if searchString appears as a substring of the result of converting this\r\n * object to a String, at one or more positions that are\r\n * greater than or equal to position; otherwise, returns false.\r\n * @param target The target string\r\n * @param searchString search string\r\n * @param position If position is undefined, 0 is assumed, so as to search all of the String.\r\n */\r\nexport let includes;\r\n/**\r\n * Returns the String value result of normalizing the string into the normalization form\r\n * named by form as specified in Unicode Standard Annex #15, Unicode Normalization Forms.\r\n * @param target The target string\r\n * @param form Applicable values: \"NFC\", \"NFD\", \"NFKC\", or \"NFKD\", If not specified default\r\n * is \"NFC\"\r\n */\r\nexport let normalize;\r\n/**\r\n * Returns a String value that is made from count copies appended together. If count is 0,\r\n * T is the empty String is returned.\r\n * @param count number of copies to append\r\n */\r\nexport let repeat;\r\n/**\r\n * Returns true if the sequence of elements of searchString converted to a String is the\r\n * same as the corresponding elements of this object (converted to a String) starting at\r\n * position. Otherwise returns false.\r\n */\r\nexport let startsWith;\r\n/* ES7 instance methods */\r\n/**\r\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\r\n * The padding is applied from the end (right) of the current string.\r\n *\r\n * @param target The target string\r\n * @param maxLength The length of the resulting string once the current string has been padded.\r\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\r\n *\r\n * @param fillString The string to pad the current string with.\r\n * If this string is too long, it will be truncated and the left-most part will be applied.\r\n * The default value for this parameter is \" \" (U+0020).\r\n */\r\nexport let padEnd;\r\n/**\r\n * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.\r\n * The padding is applied from the start (left) of the current string.\r\n *\r\n * @param target The target string\r\n * @param maxLength The length of the resulting string once the current string has been padded.\r\n * If this parameter is smaller than the current string's length, the current string will be returned as it is.\r\n *\r\n * @param fillString The string to pad the current string with.\r\n * If this string is too long, it will be truncated and the left-most part will be applied.\r\n * The default value for this parameter is \" \" (U+0020).\r\n */\r\nexport let padStart;\r\nif (true && true) {\r\n fromCodePoint = global.String.fromCodePoint;\r\n raw = global.String.raw;\r\n codePointAt = wrapNative(global.String.prototype.codePointAt);\r\n endsWith = wrapNative(global.String.prototype.endsWith);\r\n includes = wrapNative(global.String.prototype.includes);\r\n normalize = wrapNative(global.String.prototype.normalize);\r\n repeat = wrapNative(global.String.prototype.repeat);\r\n startsWith = wrapNative(global.String.prototype.startsWith);\r\n}\r\nelse {\r\n /**\r\n * Validates that text is defined, and normalizes position (based on the given default if the input is NaN).\r\n * Used by startsWith, includes, and endsWith.\r\n *\r\n * @return Normalized position.\r\n */\r\n const normalizeSubstringArgs = function (name, text, search, position, isEnd = false) {\r\n if (text == null) {\r\n throw new TypeError('string.' + name + ' requires a valid string to search against.');\r\n }\r\n const length = text.length;\r\n position = position !== position ? (isEnd ? length : 0) : position;\r\n return [text, String(search), Math.min(Math.max(position, 0), length)];\r\n };\r\n fromCodePoint = function fromCodePoint(...codePoints) {\r\n // Adapted from https://github.com/mathiasbynens/String.fromCodePoint\r\n const length = arguments.length;\r\n if (!length) {\r\n return '';\r\n }\r\n const fromCharCode = String.fromCharCode;\r\n const MAX_SIZE = 0x4000;\r\n let codeUnits = [];\r\n let index = -1;\r\n let result = '';\r\n while (++index < length) {\r\n let codePoint = Number(arguments[index]);\r\n // Code points must be finite integers within the valid range\r\n let isValid = isFinite(codePoint) && Math.floor(codePoint) === codePoint && codePoint >= 0 && codePoint <= 0x10ffff;\r\n if (!isValid) {\r\n throw RangeError('string.fromCodePoint: Invalid code point ' + codePoint);\r\n }\r\n if (codePoint <= 0xffff) {\r\n // BMP code point\r\n codeUnits.push(codePoint);\r\n }\r\n else {\r\n // Astral code point; split in surrogate halves\r\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\r\n codePoint -= 0x10000;\r\n let highSurrogate = (codePoint >> 10) + HIGH_SURROGATE_MIN;\r\n let lowSurrogate = codePoint % 0x400 + LOW_SURROGATE_MIN;\r\n codeUnits.push(highSurrogate, lowSurrogate);\r\n }\r\n if (index + 1 === length || codeUnits.length > MAX_SIZE) {\r\n result += fromCharCode.apply(null, codeUnits);\r\n codeUnits.length = 0;\r\n }\r\n }\r\n return result;\r\n };\r\n raw = function raw(callSite, ...substitutions) {\r\n let rawStrings = callSite.raw;\r\n let result = '';\r\n let numSubstitutions = substitutions.length;\r\n if (callSite == null || callSite.raw == null) {\r\n throw new TypeError('string.raw requires a valid callSite object with a raw value');\r\n }\r\n for (let i = 0, length = rawStrings.length; i < length; i++) {\r\n result += rawStrings[i] + (i < numSubstitutions && i < length - 1 ? substitutions[i] : '');\r\n }\r\n return result;\r\n };\r\n codePointAt = function codePointAt(text, position = 0) {\r\n // Adapted from https://github.com/mathiasbynens/String.prototype.codePointAt\r\n if (text == null) {\r\n throw new TypeError('string.codePointAt requries a valid string.');\r\n }\r\n const length = text.length;\r\n if (position !== position) {\r\n position = 0;\r\n }\r\n if (position < 0 || position >= length) {\r\n return undefined;\r\n }\r\n // Get the first code unit\r\n const first = text.charCodeAt(position);\r\n if (first >= HIGH_SURROGATE_MIN && first <= HIGH_SURROGATE_MAX && length > position + 1) {\r\n // Start of a surrogate pair (high surrogate and there is a next code unit); check for low surrogate\r\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\r\n const second = text.charCodeAt(position + 1);\r\n if (second >= LOW_SURROGATE_MIN && second <= LOW_SURROGATE_MAX) {\r\n return (first - HIGH_SURROGATE_MIN) * 0x400 + second - LOW_SURROGATE_MIN + 0x10000;\r\n }\r\n }\r\n return first;\r\n };\r\n endsWith = function endsWith(text, search, endPosition) {\r\n if (endPosition == null) {\r\n endPosition = text.length;\r\n }\r\n [text, search, endPosition] = normalizeSubstringArgs('endsWith', text, search, endPosition, true);\r\n const start = endPosition - search.length;\r\n if (start < 0) {\r\n return false;\r\n }\r\n return text.slice(start, endPosition) === search;\r\n };\r\n includes = function includes(text, search, position = 0) {\r\n [text, search, position] = normalizeSubstringArgs('includes', text, search, position);\r\n return text.indexOf(search, position) !== -1;\r\n };\r\n repeat = function repeat(text, count = 0) {\r\n // Adapted from https://github.com/mathiasbynens/String.prototype.repeat\r\n if (text == null) {\r\n throw new TypeError('string.repeat requires a valid string.');\r\n }\r\n if (count !== count) {\r\n count = 0;\r\n }\r\n if (count < 0 || count === Infinity) {\r\n throw new RangeError('string.repeat requires a non-negative finite count.');\r\n }\r\n let result = '';\r\n while (count) {\r\n if (count % 2) {\r\n result += text;\r\n }\r\n if (count > 1) {\r\n text += text;\r\n }\r\n count >>= 1;\r\n }\r\n return result;\r\n };\r\n startsWith = function startsWith(text, search, position = 0) {\r\n search = String(search);\r\n [text, search, position] = normalizeSubstringArgs('startsWith', text, search, position);\r\n const end = position + search.length;\r\n if (end > text.length) {\r\n return false;\r\n }\r\n return text.slice(position, end) === search;\r\n };\r\n}\r\nif (true) {\r\n padEnd = wrapNative(global.String.prototype.padEnd);\r\n padStart = wrapNative(global.String.prototype.padStart);\r\n}\r\nelse {\r\n padEnd = function padEnd(text, maxLength, fillString = ' ') {\r\n if (text === null || text === undefined) {\r\n throw new TypeError('string.repeat requires a valid string.');\r\n }\r\n if (maxLength === Infinity) {\r\n throw new RangeError('string.padEnd requires a non-negative finite count.');\r\n }\r\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\r\n maxLength = 0;\r\n }\r\n let strText = String(text);\r\n const padding = maxLength - strText.length;\r\n if (padding > 0) {\r\n strText +=\r\n repeat(fillString, Math.floor(padding / fillString.length)) +\r\n fillString.slice(0, padding % fillString.length);\r\n }\r\n return strText;\r\n };\r\n padStart = function padStart(text, maxLength, fillString = ' ') {\r\n if (text === null || text === undefined) {\r\n throw new TypeError('string.repeat requires a valid string.');\r\n }\r\n if (maxLength === Infinity) {\r\n throw new RangeError('string.padStart requires a non-negative finite count.');\r\n }\r\n if (maxLength === null || maxLength === undefined || maxLength < 0) {\r\n maxLength = 0;\r\n }\r\n let strText = String(text);\r\n const padding = maxLength - strText.length;\r\n if (padding > 0) {\r\n strText =\r\n repeat(fillString, Math.floor(padding / fillString.length)) +\r\n fillString.slice(0, padding % fillString.length) +\r\n strText;\r\n }\r\n return strText;\r\n };\r\n}\r\n//# sourceMappingURL=string.mjs.map" }, { - "id": "./node_modules/@dojo/shim/support/has.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\has.mjs", - "name": "./node_modules/@dojo/shim/support/has.mjs", + "id": "./node_modules/@dojo/framework/shim/support/has.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\has.mjs", + "name": "./node_modules/@dojo/framework/shim/support/has.mjs", "index": 6, "index2": 5, "size": 6316, @@ -3681,81 +3689,81 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "4:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/Map.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Map.mjs", - "module": "./node_modules/@dojo/shim/Map.mjs", - "moduleName": "./node_modules/@dojo/shim/Map.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Map.mjs", + "module": "./node_modules/@dojo/framework/shim/Map.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Map.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "4:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\WeakMap.mjs", - "module": "./node_modules/@dojo/shim/WeakMap.mjs", - "moduleName": "./node_modules/@dojo/shim/WeakMap.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\WeakMap.mjs", + "module": "./node_modules/@dojo/framework/shim/WeakMap.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/WeakMap.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "3:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Symbol.mjs", - "module": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleName": "./node_modules/@dojo/shim/Symbol.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Symbol.mjs", + "module": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Symbol.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "1:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "4:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/object.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\object.mjs", - "module": "./node_modules/@dojo/shim/object.mjs", - "moduleName": "./node_modules/@dojo/shim/object.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\object.mjs", + "module": "./node_modules/@dojo/framework/shim/object.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/object.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "2:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/string.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\string.mjs", - "module": "./node_modules/@dojo/shim/string.mjs", - "moduleName": "./node_modules/@dojo/shim/string.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\string.mjs", + "module": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/string.mjs", "type": "harmony import", "userRequest": "./support/has", "loc": "2:0-32" }, { - "moduleId": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\queue.mjs", - "module": "./node_modules/@dojo/shim/support/queue.mjs", - "moduleName": "./node_modules/@dojo/shim/support/queue.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\queue.mjs", + "module": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/support/queue.mjs", "type": "harmony import", "userRequest": "./has", "loc": "2:0-24" @@ -3773,12 +3781,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import has, { add } from '@dojo/has/has';\r\nimport global from '../global';\r\nexport default has;\r\nexport * from '@dojo/has/has';\r\n/* ECMAScript 6 and 7 Features */\r\n/* Array */\r\nadd('es6-array', () => {\r\n return (['from', 'of'].every((key) => key in global.Array) &&\r\n ['findIndex', 'find', 'copyWithin'].every((key) => key in global.Array.prototype));\r\n}, true);\r\nadd('es6-array-fill', () => {\r\n if ('fill' in global.Array.prototype) {\r\n /* Some versions of Safari do not properly implement this */\r\n return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1;\r\n }\r\n return false;\r\n}, true);\r\nadd('es7-array', () => 'includes' in global.Array.prototype, true);\r\n/* Map */\r\nadd('es6-map', () => {\r\n if (typeof global.Map === 'function') {\r\n /*\r\n IE11 and older versions of Safari are missing critical ES6 Map functionality\r\n We wrap this in a try/catch because sometimes the Map constructor exists, but does not\r\n take arguments (iOS 8.4)\r\n */\r\n try {\r\n const map = new global.Map([[0, 1]]);\r\n return map.has(0) &&\r\n typeof map.keys === 'function' &&\r\n true &&\r\n typeof map.values === 'function' &&\r\n typeof map.entries === 'function';\r\n }\r\n catch (e) {\r\n /* istanbul ignore next: not testing on iOS at the moment */\r\n return false;\r\n }\r\n }\r\n return false;\r\n}, true);\r\n/* Math */\r\nadd('es6-math', () => {\r\n return [\r\n 'clz32',\r\n 'sign',\r\n 'log10',\r\n 'log2',\r\n 'log1p',\r\n 'expm1',\r\n 'cosh',\r\n 'sinh',\r\n 'tanh',\r\n 'acosh',\r\n 'asinh',\r\n 'atanh',\r\n 'trunc',\r\n 'fround',\r\n 'cbrt',\r\n 'hypot'\r\n ].every((name) => typeof global.Math[name] === 'function');\r\n}, true);\r\nadd('es6-math-imul', () => {\r\n if ('imul' in global.Math) {\r\n /* Some versions of Safari on ios do not properly implement this */\r\n return Math.imul(0xffffffff, 5) === -5;\r\n }\r\n return false;\r\n}, true);\r\n/* Object */\r\nadd('es6-object', () => {\r\n return true &&\r\n ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof global.Object[name] === 'function');\r\n}, true);\r\nadd('es2017-object', () => {\r\n return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof global.Object[name] === 'function');\r\n}, true);\r\n/* Observable */\r\nadd('es-observable', () => typeof global.Observable !== 'undefined', true);\r\n/* Promise */\r\nadd('es6-promise', () => typeof global.Promise !== 'undefined' && true, true);\r\n/* Set */\r\nadd('es6-set', () => {\r\n if (typeof global.Set === 'function') {\r\n /* IE11 and older versions of Safari are missing critical ES6 Set functionality */\r\n const set = new global.Set([1]);\r\n return set.has(1) && 'keys' in set && typeof set.keys === 'function' && true;\r\n }\r\n return false;\r\n}, true);\r\n/* String */\r\nadd('es6-string', () => {\r\n return ([\r\n /* static methods */\r\n 'fromCodePoint'\r\n ].every((key) => typeof global.String[key] === 'function') &&\r\n [\r\n /* instance methods */\r\n 'codePointAt',\r\n 'normalize',\r\n 'repeat',\r\n 'startsWith',\r\n 'endsWith',\r\n 'includes'\r\n ].every((key) => typeof global.String.prototype[key] === 'function'));\r\n}, true);\r\nadd('es6-string-raw', () => {\r\n function getCallSite(callSite, ...substitutions) {\r\n const result = [...callSite];\r\n result.raw = callSite.raw;\r\n return result;\r\n }\r\n if ('raw' in global.String) {\r\n let b = 1;\r\n let callSite = getCallSite `a\\n${b}`;\r\n callSite.raw = ['a\\\\n'];\r\n const supportsTrunc = global.String.raw(callSite, 42) === 'a:\\\\n';\r\n return supportsTrunc;\r\n }\r\n return false;\r\n}, true);\r\nadd('es2017-string', () => {\r\n return ['padStart', 'padEnd'].every((key) => typeof global.String.prototype[key] === 'function');\r\n}, true);\r\n/* Symbol */\r\nadd('es6-symbol', () => typeof global.Symbol !== 'undefined' && typeof Symbol() === 'symbol', true);\r\n/* WeakMap */\r\nadd('es6-weakmap', () => {\r\n if (typeof global.WeakMap !== 'undefined') {\r\n /* IE11 and older versions of Safari are missing critical ES6 Map functionality */\r\n const key1 = {};\r\n const key2 = {};\r\n const map = new global.WeakMap([[key1, 1]]);\r\n Object.freeze(key1);\r\n return map.get(key1) === 1 && map.set(key2, 2) === map && true;\r\n }\r\n return false;\r\n}, true);\r\n/* Miscellaneous features */\r\nadd('microtasks', () => true || false || true, true);\r\nadd('postmessage', () => {\r\n // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have\r\n // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist.\r\n return typeof global.window !== 'undefined' && typeof global.postMessage === 'function';\r\n}, true);\r\nadd('raf', () => typeof global.requestAnimationFrame === 'function', true);\r\nadd('setimmediate', () => typeof global.setImmediate !== 'undefined', true);\r\n/* DOM Features */\r\nadd('dom-mutationobserver', () => {\r\n if (true && Boolean(global.MutationObserver || global.WebKitMutationObserver)) {\r\n // IE11 has an unreliable MutationObserver implementation where setProperty() does not\r\n // generate a mutation event, observers can crash, and the queue does not drain\r\n // reliably. The following feature test was adapted from\r\n // https://gist.github.com/t10ko/4aceb8c71681fdb275e33efe5e576b14\r\n const example = document.createElement('div');\r\n /* tslint:disable-next-line:variable-name */\r\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\r\n const observer = new HostMutationObserver(function () { });\r\n observer.observe(example, { attributes: true });\r\n example.style.setProperty('display', 'block');\r\n return Boolean(observer.takeRecords().length);\r\n }\r\n return false;\r\n}, true);\r\nadd('dom-webanimation', () => true && global.Animation !== undefined && global.KeyframeEffect !== undefined, true);\r\n//# sourceMappingURL=has.mjs.map" + "source": "import has, { add } from '../../has/has';\r\nimport global from '../global';\r\nexport default has;\r\nexport * from '../../has/has';\r\n/* ECMAScript 6 and 7 Features */\r\n/* Array */\r\nadd('es6-array', () => {\r\n return (['from', 'of'].every((key) => key in global.Array) &&\r\n ['findIndex', 'find', 'copyWithin'].every((key) => key in global.Array.prototype));\r\n}, true);\r\nadd('es6-array-fill', () => {\r\n if ('fill' in global.Array.prototype) {\r\n /* Some versions of Safari do not properly implement this */\r\n return [1].fill(9, Number.POSITIVE_INFINITY)[0] === 1;\r\n }\r\n return false;\r\n}, true);\r\nadd('es7-array', () => 'includes' in global.Array.prototype, true);\r\n/* Map */\r\nadd('es6-map', () => {\r\n if (typeof global.Map === 'function') {\r\n /*\r\n IE11 and older versions of Safari are missing critical ES6 Map functionality\r\n We wrap this in a try/catch because sometimes the Map constructor exists, but does not\r\n take arguments (iOS 8.4)\r\n */\r\n try {\r\n const map = new global.Map([[0, 1]]);\r\n return map.has(0) &&\r\n typeof map.keys === 'function' &&\r\n true &&\r\n typeof map.values === 'function' &&\r\n typeof map.entries === 'function';\r\n }\r\n catch (e) {\r\n /* istanbul ignore next: not testing on iOS at the moment */\r\n return false;\r\n }\r\n }\r\n return false;\r\n}, true);\r\n/* Math */\r\nadd('es6-math', () => {\r\n return [\r\n 'clz32',\r\n 'sign',\r\n 'log10',\r\n 'log2',\r\n 'log1p',\r\n 'expm1',\r\n 'cosh',\r\n 'sinh',\r\n 'tanh',\r\n 'acosh',\r\n 'asinh',\r\n 'atanh',\r\n 'trunc',\r\n 'fround',\r\n 'cbrt',\r\n 'hypot'\r\n ].every((name) => typeof global.Math[name] === 'function');\r\n}, true);\r\nadd('es6-math-imul', () => {\r\n if ('imul' in global.Math) {\r\n /* Some versions of Safari on ios do not properly implement this */\r\n return Math.imul(0xffffffff, 5) === -5;\r\n }\r\n return false;\r\n}, true);\r\n/* Object */\r\nadd('es6-object', () => {\r\n return true &&\r\n ['assign', 'is', 'getOwnPropertySymbols', 'setPrototypeOf'].every((name) => typeof global.Object[name] === 'function');\r\n}, true);\r\nadd('es2017-object', () => {\r\n return ['values', 'entries', 'getOwnPropertyDescriptors'].every((name) => typeof global.Object[name] === 'function');\r\n}, true);\r\n/* Observable */\r\nadd('es-observable', () => typeof global.Observable !== 'undefined', true);\r\n/* Promise */\r\nadd('es6-promise', () => typeof global.Promise !== 'undefined' && true, true);\r\n/* Set */\r\nadd('es6-set', () => {\r\n if (typeof global.Set === 'function') {\r\n /* IE11 and older versions of Safari are missing critical ES6 Set functionality */\r\n const set = new global.Set([1]);\r\n return set.has(1) && 'keys' in set && typeof set.keys === 'function' && true;\r\n }\r\n return false;\r\n}, true);\r\n/* String */\r\nadd('es6-string', () => {\r\n return ([\r\n /* static methods */\r\n 'fromCodePoint'\r\n ].every((key) => typeof global.String[key] === 'function') &&\r\n [\r\n /* instance methods */\r\n 'codePointAt',\r\n 'normalize',\r\n 'repeat',\r\n 'startsWith',\r\n 'endsWith',\r\n 'includes'\r\n ].every((key) => typeof global.String.prototype[key] === 'function'));\r\n}, true);\r\nadd('es6-string-raw', () => {\r\n function getCallSite(callSite, ...substitutions) {\r\n const result = [...callSite];\r\n result.raw = callSite.raw;\r\n return result;\r\n }\r\n if ('raw' in global.String) {\r\n let b = 1;\r\n let callSite = getCallSite `a\\n${b}`;\r\n callSite.raw = ['a\\\\n'];\r\n const supportsTrunc = global.String.raw(callSite, 42) === 'a:\\\\n';\r\n return supportsTrunc;\r\n }\r\n return false;\r\n}, true);\r\nadd('es2017-string', () => {\r\n return ['padStart', 'padEnd'].every((key) => typeof global.String.prototype[key] === 'function');\r\n}, true);\r\n/* Symbol */\r\nadd('es6-symbol', () => typeof global.Symbol !== 'undefined' && typeof Symbol() === 'symbol', true);\r\n/* WeakMap */\r\nadd('es6-weakmap', () => {\r\n if (typeof global.WeakMap !== 'undefined') {\r\n /* IE11 and older versions of Safari are missing critical ES6 Map functionality */\r\n const key1 = {};\r\n const key2 = {};\r\n const map = new global.WeakMap([[key1, 1]]);\r\n Object.freeze(key1);\r\n return map.get(key1) === 1 && map.set(key2, 2) === map && true;\r\n }\r\n return false;\r\n}, true);\r\n/* Miscellaneous features */\r\nadd('microtasks', () => true || false || true, true);\r\nadd('postmessage', () => {\r\n // If window is undefined, and we have postMessage, it probably means we're in a web worker. Web workers have\r\n // post message but it doesn't work how we expect it to, so it's best just to pretend it doesn't exist.\r\n return typeof global.window !== 'undefined' && typeof global.postMessage === 'function';\r\n}, true);\r\nadd('raf', () => typeof global.requestAnimationFrame === 'function', true);\r\nadd('setimmediate', () => typeof global.setImmediate !== 'undefined', true);\r\n/* DOM Features */\r\nadd('dom-mutationobserver', () => {\r\n if (true && Boolean(global.MutationObserver || global.WebKitMutationObserver)) {\r\n // IE11 has an unreliable MutationObserver implementation where setProperty() does not\r\n // generate a mutation event, observers can crash, and the queue does not drain\r\n // reliably. The following feature test was adapted from\r\n // https://gist.github.com/t10ko/4aceb8c71681fdb275e33efe5e576b14\r\n const example = document.createElement('div');\r\n /* tslint:disable-next-line:variable-name */\r\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\r\n const observer = new HostMutationObserver(function () { });\r\n observer.observe(example, { attributes: true });\r\n example.style.setProperty('display', 'block');\r\n return Boolean(observer.takeRecords().length);\r\n }\r\n return false;\r\n}, true);\r\nadd('dom-webanimation', () => true && global.Animation !== undefined && global.KeyframeEffect !== undefined, true);\r\n//# sourceMappingURL=has.mjs.map" }, { - "id": "./node_modules/@dojo/shim/support/queue.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\queue.mjs", - "name": "./node_modules/@dojo/shim/support/queue.mjs", + "id": "./node_modules/@dojo/framework/shim/support/queue.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\queue.mjs", + "name": "./node_modules/@dojo/framework/shim/support/queue.mjs", "index": 23, "index2": 14, "size": 6381, @@ -3790,18 +3798,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Promise.mjs", - "issuerId": "./node_modules/@dojo/shim/Promise.mjs", - "issuerName": "./node_modules/@dojo/shim/Promise.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Promise.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/Promise.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/Promise.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Promise.mjs", - "module": "./node_modules/@dojo/shim/Promise.mjs", - "moduleName": "./node_modules/@dojo/shim/Promise.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Promise.mjs", + "module": "./node_modules/@dojo/framework/shim/Promise.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Promise.mjs", "type": "harmony import", "userRequest": "./support/queue", "loc": "2:0-49" @@ -3818,9 +3826,9 @@ "source": "import global from '../global';\r\nimport has from './has';\r\nfunction executeTask(item) {\r\n if (item && item.isActive && item.callback) {\r\n item.callback();\r\n }\r\n}\r\nfunction getQueueHandle(item, destructor) {\r\n return {\r\n destroy: function () {\r\n this.destroy = function () { };\r\n item.isActive = false;\r\n item.callback = null;\r\n if (destructor) {\r\n destructor();\r\n }\r\n }\r\n };\r\n}\r\nlet checkMicroTaskQueue;\r\nlet microTasks;\r\n/**\r\n * Schedules a callback to the macrotask queue.\r\n *\r\n * @param callback the function to be queued and later executed.\r\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\r\n */\r\nexport const queueTask = (function () {\r\n let destructor;\r\n let enqueue;\r\n // Since the IE implementation of `setImmediate` is not flawless, we will test for `postMessage` first.\r\n if (true) {\r\n const queue = [];\r\n global.addEventListener('message', function (event) {\r\n // Confirm that the event was triggered by the current window and by this particular implementation.\r\n if (event.source === global && event.data === 'dojo-queue-message') {\r\n event.stopPropagation();\r\n if (queue.length) {\r\n executeTask(queue.shift());\r\n }\r\n }\r\n });\r\n enqueue = function (item) {\r\n queue.push(item);\r\n global.postMessage('dojo-queue-message', '*');\r\n };\r\n }\r\n else if (false) {\r\n destructor = global.clearImmediate;\r\n enqueue = function (item) {\r\n return setImmediate(executeTask.bind(null, item));\r\n };\r\n }\r\n else {\r\n destructor = global.clearTimeout;\r\n enqueue = function (item) {\r\n return setTimeout(executeTask.bind(null, item), 0);\r\n };\r\n }\r\n function queueTask(callback) {\r\n const item = {\r\n isActive: true,\r\n callback: callback\r\n };\r\n const id = enqueue(item);\r\n return getQueueHandle(item, destructor &&\r\n function () {\r\n destructor(id);\r\n });\r\n }\r\n // TODO: Use aspect.before when it is available.\r\n return true\r\n ? queueTask\r\n : function (callback) {\r\n checkMicroTaskQueue();\r\n return queueTask(callback);\r\n };\r\n})();\r\n// When no mechanism for registering microtasks is exposed by the environment, microtasks will\r\n// be queued and then executed in a single macrotask before the other macrotasks are executed.\r\nif (!true) {\r\n let isMicroTaskQueued = false;\r\n microTasks = [];\r\n checkMicroTaskQueue = function () {\r\n if (!isMicroTaskQueued) {\r\n isMicroTaskQueued = true;\r\n queueTask(function () {\r\n isMicroTaskQueued = false;\r\n if (microTasks.length) {\r\n let item;\r\n while ((item = microTasks.shift())) {\r\n executeTask(item);\r\n }\r\n }\r\n });\r\n }\r\n };\r\n}\r\n/**\r\n * Schedules an animation task with `window.requestAnimationFrame` if it exists, or with `queueTask` otherwise.\r\n *\r\n * Since requestAnimationFrame's behavior does not match that expected from `queueTask`, it is not used there.\r\n * However, at times it makes more sense to delegate to requestAnimationFrame; hence the following method.\r\n *\r\n * @param callback the function to be queued and later executed.\r\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\r\n */\r\nexport const queueAnimationTask = (function () {\r\n if (!true) {\r\n return queueTask;\r\n }\r\n function queueAnimationTask(callback) {\r\n const item = {\r\n isActive: true,\r\n callback: callback\r\n };\r\n const rafId = requestAnimationFrame(executeTask.bind(null, item));\r\n return getQueueHandle(item, function () {\r\n cancelAnimationFrame(rafId);\r\n });\r\n }\r\n // TODO: Use aspect.before when it is available.\r\n return true\r\n ? queueAnimationTask\r\n : function (callback) {\r\n checkMicroTaskQueue();\r\n return queueAnimationTask(callback);\r\n };\r\n})();\r\n/**\r\n * Schedules a callback to the microtask queue.\r\n *\r\n * Any callbacks registered with `queueMicroTask` will be executed before the next macrotask. If no native\r\n * mechanism for scheduling macrotasks is exposed, then any callbacks will be fired before any macrotask\r\n * registered with `queueTask` or `queueAnimationTask`.\r\n *\r\n * @param callback the function to be queued and later executed.\r\n * @returns An object with a `destroy` method that, when called, prevents the registered callback from executing.\r\n */\r\nexport let queueMicroTask = (function () {\r\n let enqueue;\r\n if (false) {\r\n enqueue = function (item) {\r\n global.process.nextTick(executeTask.bind(null, item));\r\n };\r\n }\r\n else if (true) {\r\n enqueue = function (item) {\r\n global.Promise.resolve(item).then(executeTask);\r\n };\r\n }\r\n else if (true) {\r\n /* tslint:disable-next-line:variable-name */\r\n const HostMutationObserver = global.MutationObserver || global.WebKitMutationObserver;\r\n const node = document.createElement('div');\r\n const queue = [];\r\n const observer = new HostMutationObserver(function () {\r\n while (queue.length > 0) {\r\n const item = queue.shift();\r\n if (item && item.isActive && item.callback) {\r\n item.callback();\r\n }\r\n }\r\n });\r\n observer.observe(node, { attributes: true });\r\n enqueue = function (item) {\r\n queue.push(item);\r\n node.setAttribute('queueStatus', '1');\r\n };\r\n }\r\n else {\r\n enqueue = function (item) {\r\n checkMicroTaskQueue();\r\n microTasks.push(item);\r\n };\r\n }\r\n return function (callback) {\r\n const item = {\r\n isActive: true,\r\n callback: callback\r\n };\r\n enqueue(item);\r\n return getQueueHandle(item);\r\n };\r\n})();\r\n//# sourceMappingURL=queue.mjs.map" }, { - "id": "./node_modules/@dojo/shim/support/util.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\support\\util.mjs", - "name": "./node_modules/@dojo/shim/support/util.mjs", + "id": "./node_modules/@dojo/framework/shim/support/util.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\support\\util.mjs", + "name": "./node_modules/@dojo/framework/shim/support/util.mjs", "index": 11, "index2": 6, "size": 853, @@ -3832,36 +3840,36 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "issuerId": "./node_modules/@dojo/shim/array.mjs", - "issuerName": "./node_modules/@dojo/shim/array.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/array.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/array.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/array.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\array.mjs", - "module": "./node_modules/@dojo/shim/array.mjs", - "moduleName": "./node_modules/@dojo/shim/array.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\array.mjs", + "module": "./node_modules/@dojo/framework/shim/array.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/array.mjs", "type": "harmony import", "userRequest": "./support/util", "loc": "5:0-44" }, { - "moduleId": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\Symbol.mjs", - "module": "./node_modules/@dojo/shim/Symbol.mjs", - "moduleName": "./node_modules/@dojo/shim/Symbol.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\Symbol.mjs", + "module": "./node_modules/@dojo/framework/shim/Symbol.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/Symbol.mjs", "type": "harmony import", "userRequest": "./support/util", "loc": "3:0-52" }, { - "moduleId": "./node_modules/@dojo/shim/string.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\string.mjs", - "module": "./node_modules/@dojo/shim/string.mjs", - "moduleName": "./node_modules/@dojo/shim/string.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\string.mjs", + "module": "./node_modules/@dojo/framework/shim/string.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/string.mjs", "type": "harmony import", "userRequest": "./support/util", "loc": "3:0-44" @@ -3880,12 +3888,12 @@ "source": "/**\n * Helper function to generate a value property descriptor\n *\n * @param value The value the property descriptor should be set to\n * @param enumerable If the property should be enumberable, defaults to false\n * @param writable If the property should be writable, defaults to true\n * @param configurable If the property should be configurable, defaults to true\n * @return The property descriptor object\n */\nexport function getValueDescriptor(value, enumerable = false, writable = true, configurable = true) {\n return {\n value: value,\n enumerable: enumerable,\n writable: writable,\n configurable: configurable\n };\n}\nexport function wrapNative(nativeFunction) {\n return function (target, ...args) {\n return nativeFunction.apply(target, args);\n };\n}\n//# sourceMappingURL=util.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/Injector.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Injector.mjs", - "name": "./node_modules/@dojo/widget-core/Injector.mjs", + "id": "./node_modules/@dojo/framework/widget-core/Injector.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Injector.mjs", + "name": "./node_modules/@dojo/framework/widget-core/Injector.mjs", "index": 37, "index2": 31, - "size": 496, + "size": 493, "cacheable": true, "built": true, "optional": false, @@ -3894,18 +3902,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../Injector", "loc": "2:0-41" @@ -3920,15 +3928,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { Evented } from '@dojo/core/Evented';\nexport class Injector extends Evented {\n constructor(payload) {\n super();\n this._payload = payload;\n }\n setInvalidator(invalidator) {\n this._invalidator = invalidator;\n }\n get() {\n return this._payload;\n }\n set(payload) {\n this._payload = payload;\n if (this._invalidator) {\n this._invalidator();\n }\n }\n}\nexport default Injector;\n//# sourceMappingURL=Injector.mjs.map" + "source": "import { Evented } from '../core/Evented';\nexport class Injector extends Evented {\n constructor(payload) {\n super();\n this._payload = payload;\n }\n setInvalidator(invalidator) {\n this._invalidator = invalidator;\n }\n get() {\n return this._payload;\n }\n set(payload) {\n this._payload = payload;\n if (this._invalidator) {\n this._invalidator();\n }\n }\n}\nexport default Injector;\n//# sourceMappingURL=Injector.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/NodeHandler.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\NodeHandler.mjs", - "name": "./node_modules/@dojo/widget-core/NodeHandler.mjs", + "id": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\NodeHandler.mjs", + "name": "./node_modules/@dojo/framework/widget-core/NodeHandler.mjs", "index": 28, "index2": 22, - "size": 1134, + "size": 1128, "cacheable": true, "built": true, "optional": false, @@ -3937,18 +3945,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./NodeHandler", "loc": "7:0-40" @@ -3964,15 +3972,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { Evented } from '@dojo/core/Evented';\r\nimport Map from '@dojo/shim/Map';\r\n/**\r\n * Enum to identify the type of event.\r\n * Listening to 'Projector' will notify when projector is created or updated\r\n * Listening to 'Widget' will notify when widget root is created or updated\r\n */\r\nexport var NodeEventType;\r\n(function (NodeEventType) {\r\n NodeEventType[\"Projector\"] = \"Projector\";\r\n NodeEventType[\"Widget\"] = \"Widget\";\r\n})(NodeEventType || (NodeEventType = {}));\r\nexport class NodeHandler extends Evented {\r\n constructor() {\r\n super(...arguments);\r\n this._nodeMap = new Map();\r\n }\r\n get(key) {\r\n return this._nodeMap.get(key);\r\n }\r\n has(key) {\r\n return this._nodeMap.has(key);\r\n }\r\n add(element, key) {\r\n this._nodeMap.set(key, element);\r\n this.emit({ type: key });\r\n }\r\n addRoot() {\r\n this.emit({ type: NodeEventType.Widget });\r\n }\r\n addProjector() {\r\n this.emit({ type: NodeEventType.Projector });\r\n }\r\n clear() {\r\n this._nodeMap.clear();\r\n }\r\n}\r\nexport default NodeHandler;\r\n//# sourceMappingURL=NodeHandler.mjs.map" + "source": "import { Evented } from '../core/Evented';\r\nimport Map from '../shim/Map';\r\n/**\r\n * Enum to identify the type of event.\r\n * Listening to 'Projector' will notify when projector is created or updated\r\n * Listening to 'Widget' will notify when widget root is created or updated\r\n */\r\nexport var NodeEventType;\r\n(function (NodeEventType) {\r\n NodeEventType[\"Projector\"] = \"Projector\";\r\n NodeEventType[\"Widget\"] = \"Widget\";\r\n})(NodeEventType || (NodeEventType = {}));\r\nexport class NodeHandler extends Evented {\r\n constructor() {\r\n super(...arguments);\r\n this._nodeMap = new Map();\r\n }\r\n get(key) {\r\n return this._nodeMap.get(key);\r\n }\r\n has(key) {\r\n return this._nodeMap.has(key);\r\n }\r\n add(element, key) {\r\n this._nodeMap.set(key, element);\r\n this.emit({ type: key });\r\n }\r\n addRoot() {\r\n this.emit({ type: NodeEventType.Widget });\r\n }\r\n addProjector() {\r\n this.emit({ type: NodeEventType.Projector });\r\n }\r\n clear() {\r\n this._nodeMap.clear();\r\n }\r\n}\r\nexport default NodeHandler;\r\n//# sourceMappingURL=NodeHandler.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/Registry.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\Registry.mjs", - "name": "./node_modules/@dojo/widget-core/Registry.mjs", + "id": "./node_modules/@dojo/framework/widget-core/Registry.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\Registry.mjs", + "name": "./node_modules/@dojo/framework/widget-core/Registry.mjs", "index": 21, "index2": 19, - "size": 3814, + "size": 3802, "cacheable": true, "built": true, "optional": false, @@ -3981,54 +3989,54 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./Registry", "loc": "9:0-71" }, { - "moduleId": "./node_modules/@dojo/widget-core/diff.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\diff.mjs", - "module": "./node_modules/@dojo/widget-core/diff.mjs", - "moduleName": "./node_modules/@dojo/widget-core/diff.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\RegistryHandler.mjs", + "module": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "type": "harmony import", "userRequest": "./Registry", - "loc": "1:0-46" + "loc": "3:0-38" }, { - "moduleId": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\RegistryHandler.mjs", - "module": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "moduleName": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/diff.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\diff.mjs", + "module": "./node_modules/@dojo/framework/widget-core/diff.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/diff.mjs", "type": "harmony import", "userRequest": "./Registry", - "loc": "3:0-38" + "loc": "1:0-46" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", "userRequest": "./Registry", "loc": "4:0-53" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\customElement.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\customElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", "type": "harmony import", "userRequest": "../Registry", "loc": "2:0-35" @@ -4049,15 +4057,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import Promise from '@dojo/shim/Promise';\r\nimport Map from '@dojo/shim/Map';\r\nimport Symbol from '@dojo/shim/Symbol';\r\nimport { Evented } from '@dojo/core/Evented';\r\n/**\r\n * Widget base symbol type\r\n */\r\nexport const WIDGET_BASE_TYPE = Symbol('Widget Base');\r\n/**\r\n * Checks is the item is a subclass of WidgetBase (or a WidgetBase)\r\n *\r\n * @param item the item to check\r\n * @returns true/false indicating if the item is a WidgetBaseConstructor\r\n */\r\nexport function isWidgetBaseConstructor(item) {\r\n return Boolean(item && item._type === WIDGET_BASE_TYPE);\r\n}\r\nexport function isWidgetConstructorDefaultExport(item) {\r\n return Boolean(item &&\r\n item.hasOwnProperty('__esModule') &&\r\n item.hasOwnProperty('default') &&\r\n isWidgetBaseConstructor(item.default));\r\n}\r\n/**\r\n * The Registry implementation\r\n */\r\nexport class Registry extends Evented {\r\n /**\r\n * Emit loaded event for registry label\r\n */\r\n emitLoadedEvent(widgetLabel, item) {\r\n this.emit({\r\n type: widgetLabel,\r\n action: 'loaded',\r\n item\r\n });\r\n }\r\n define(label, item) {\r\n if (this._widgetRegistry === undefined) {\r\n this._widgetRegistry = new Map();\r\n }\r\n if (this._widgetRegistry.has(label)) {\r\n throw new Error(`widget has already been registered for '${label.toString()}'`);\r\n }\r\n this._widgetRegistry.set(label, item);\r\n if (item instanceof Promise) {\r\n item.then((widgetCtor) => {\r\n this._widgetRegistry.set(label, widgetCtor);\r\n this.emitLoadedEvent(label, widgetCtor);\r\n return widgetCtor;\r\n }, (error) => {\r\n throw error;\r\n });\r\n }\r\n else if (isWidgetBaseConstructor(item)) {\r\n this.emitLoadedEvent(label, item);\r\n }\r\n }\r\n defineInjector(label, injectorFactory) {\r\n if (this._injectorRegistry === undefined) {\r\n this._injectorRegistry = new Map();\r\n }\r\n if (this._injectorRegistry.has(label)) {\r\n throw new Error(`injector has already been registered for '${label.toString()}'`);\r\n }\r\n const invalidator = new Evented();\r\n const injectorItem = {\r\n injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })),\r\n invalidator\r\n };\r\n this._injectorRegistry.set(label, injectorItem);\r\n this.emitLoadedEvent(label, injectorItem);\r\n }\r\n get(label) {\r\n if (!this._widgetRegistry || !this.has(label)) {\r\n return null;\r\n }\r\n const item = this._widgetRegistry.get(label);\r\n if (isWidgetBaseConstructor(item)) {\r\n return item;\r\n }\r\n if (item instanceof Promise) {\r\n return null;\r\n }\r\n const promise = item();\r\n this._widgetRegistry.set(label, promise);\r\n promise.then((widgetCtor) => {\r\n if (isWidgetConstructorDefaultExport(widgetCtor)) {\r\n widgetCtor = widgetCtor.default;\r\n }\r\n this._widgetRegistry.set(label, widgetCtor);\r\n this.emitLoadedEvent(label, widgetCtor);\r\n return widgetCtor;\r\n }, (error) => {\r\n throw error;\r\n });\r\n return null;\r\n }\r\n getInjector(label) {\r\n if (!this._injectorRegistry || !this.hasInjector(label)) {\r\n return null;\r\n }\r\n return this._injectorRegistry.get(label);\r\n }\r\n has(label) {\r\n return Boolean(this._widgetRegistry && this._widgetRegistry.has(label));\r\n }\r\n hasInjector(label) {\r\n return Boolean(this._injectorRegistry && this._injectorRegistry.has(label));\r\n }\r\n}\r\nexport default Registry;\r\n//# sourceMappingURL=Registry.mjs.map" + "source": "import Promise from '../shim/Promise';\r\nimport Map from '../shim/Map';\r\nimport Symbol from '../shim/Symbol';\r\nimport { Evented } from '../core/Evented';\r\n/**\r\n * Widget base symbol type\r\n */\r\nexport const WIDGET_BASE_TYPE = Symbol('Widget Base');\r\n/**\r\n * Checks is the item is a subclass of WidgetBase (or a WidgetBase)\r\n *\r\n * @param item the item to check\r\n * @returns true/false indicating if the item is a WidgetBaseConstructor\r\n */\r\nexport function isWidgetBaseConstructor(item) {\r\n return Boolean(item && item._type === WIDGET_BASE_TYPE);\r\n}\r\nexport function isWidgetConstructorDefaultExport(item) {\r\n return Boolean(item &&\r\n item.hasOwnProperty('__esModule') &&\r\n item.hasOwnProperty('default') &&\r\n isWidgetBaseConstructor(item.default));\r\n}\r\n/**\r\n * The Registry implementation\r\n */\r\nexport class Registry extends Evented {\r\n /**\r\n * Emit loaded event for registry label\r\n */\r\n emitLoadedEvent(widgetLabel, item) {\r\n this.emit({\r\n type: widgetLabel,\r\n action: 'loaded',\r\n item\r\n });\r\n }\r\n define(label, item) {\r\n if (this._widgetRegistry === undefined) {\r\n this._widgetRegistry = new Map();\r\n }\r\n if (this._widgetRegistry.has(label)) {\r\n throw new Error(`widget has already been registered for '${label.toString()}'`);\r\n }\r\n this._widgetRegistry.set(label, item);\r\n if (item instanceof Promise) {\r\n item.then((widgetCtor) => {\r\n this._widgetRegistry.set(label, widgetCtor);\r\n this.emitLoadedEvent(label, widgetCtor);\r\n return widgetCtor;\r\n }, (error) => {\r\n throw error;\r\n });\r\n }\r\n else if (isWidgetBaseConstructor(item)) {\r\n this.emitLoadedEvent(label, item);\r\n }\r\n }\r\n defineInjector(label, injectorFactory) {\r\n if (this._injectorRegistry === undefined) {\r\n this._injectorRegistry = new Map();\r\n }\r\n if (this._injectorRegistry.has(label)) {\r\n throw new Error(`injector has already been registered for '${label.toString()}'`);\r\n }\r\n const invalidator = new Evented();\r\n const injectorItem = {\r\n injector: injectorFactory(() => invalidator.emit({ type: 'invalidate' })),\r\n invalidator\r\n };\r\n this._injectorRegistry.set(label, injectorItem);\r\n this.emitLoadedEvent(label, injectorItem);\r\n }\r\n get(label) {\r\n if (!this._widgetRegistry || !this.has(label)) {\r\n return null;\r\n }\r\n const item = this._widgetRegistry.get(label);\r\n if (isWidgetBaseConstructor(item)) {\r\n return item;\r\n }\r\n if (item instanceof Promise) {\r\n return null;\r\n }\r\n const promise = item();\r\n this._widgetRegistry.set(label, promise);\r\n promise.then((widgetCtor) => {\r\n if (isWidgetConstructorDefaultExport(widgetCtor)) {\r\n widgetCtor = widgetCtor.default;\r\n }\r\n this._widgetRegistry.set(label, widgetCtor);\r\n this.emitLoadedEvent(label, widgetCtor);\r\n return widgetCtor;\r\n }, (error) => {\r\n throw error;\r\n });\r\n return null;\r\n }\r\n getInjector(label) {\r\n if (!this._injectorRegistry || !this.hasInjector(label)) {\r\n return null;\r\n }\r\n return this._injectorRegistry.get(label);\r\n }\r\n has(label) {\r\n return Boolean(this._widgetRegistry && this._widgetRegistry.has(label));\r\n }\r\n hasInjector(label) {\r\n return Boolean(this._injectorRegistry && this._injectorRegistry.has(label));\r\n }\r\n}\r\nexport default Registry;\r\n//# sourceMappingURL=Registry.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\RegistryHandler.mjs", - "name": "./node_modules/@dojo/widget-core/RegistryHandler.mjs", + "id": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\RegistryHandler.mjs", + "name": "./node_modules/@dojo/framework/widget-core/RegistryHandler.mjs", "index": 27, "index2": 21, - "size": 2933, + "size": 2927, "cacheable": true, "built": true, "optional": false, @@ -4066,18 +4074,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./RegistryHandler", "loc": "6:0-48" @@ -4092,15 +4100,15 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { Map } from '@dojo/shim/Map';\r\nimport { Evented } from '@dojo/core/Evented';\r\nimport { Registry } from './Registry';\r\nexport class RegistryHandler extends Evented {\r\n constructor() {\r\n super();\r\n this._registry = new Registry();\r\n this._registryWidgetLabelMap = new Map();\r\n this._registryInjectorLabelMap = new Map();\r\n this.own(this._registry);\r\n const destroy = () => {\r\n if (this.baseRegistry) {\r\n this._registryWidgetLabelMap.delete(this.baseRegistry);\r\n this._registryInjectorLabelMap.delete(this.baseRegistry);\r\n this.baseRegistry = undefined;\r\n }\r\n };\r\n this.own({ destroy });\r\n }\r\n set base(baseRegistry) {\r\n if (this.baseRegistry) {\r\n this._registryWidgetLabelMap.delete(this.baseRegistry);\r\n this._registryInjectorLabelMap.delete(this.baseRegistry);\r\n }\r\n this.baseRegistry = baseRegistry;\r\n }\r\n define(label, widget) {\r\n this._registry.define(label, widget);\r\n }\r\n defineInjector(label, injector) {\r\n this._registry.defineInjector(label, injector);\r\n }\r\n has(label) {\r\n return this._registry.has(label) || Boolean(this.baseRegistry && this.baseRegistry.has(label));\r\n }\r\n hasInjector(label) {\r\n return this._registry.hasInjector(label) || Boolean(this.baseRegistry && this.baseRegistry.hasInjector(label));\r\n }\r\n get(label, globalPrecedence = false) {\r\n return this._get(label, globalPrecedence, 'get', this._registryWidgetLabelMap);\r\n }\r\n getInjector(label, globalPrecedence = false) {\r\n return this._get(label, globalPrecedence, 'getInjector', this._registryInjectorLabelMap);\r\n }\r\n _get(label, globalPrecedence, getFunctionName, labelMap) {\r\n const registries = globalPrecedence ? [this.baseRegistry, this._registry] : [this._registry, this.baseRegistry];\r\n for (let i = 0; i < registries.length; i++) {\r\n const registry = registries[i];\r\n if (!registry) {\r\n continue;\r\n }\r\n const item = registry[getFunctionName](label);\r\n const registeredLabels = labelMap.get(registry) || [];\r\n if (item) {\r\n return item;\r\n }\r\n else if (registeredLabels.indexOf(label) === -1) {\r\n const handle = registry.on(label, (event) => {\r\n if (event.action === 'loaded' &&\r\n this[getFunctionName](label, globalPrecedence) === event.item) {\r\n this.emit({ type: 'invalidate' });\r\n }\r\n });\r\n this.own(handle);\r\n labelMap.set(registry, [...registeredLabels, label]);\r\n }\r\n }\r\n return null;\r\n }\r\n}\r\nexport default RegistryHandler;\r\n//# sourceMappingURL=RegistryHandler.mjs.map" + "source": "import { Map } from '../shim/Map';\r\nimport { Evented } from '../core/Evented';\r\nimport { Registry } from './Registry';\r\nexport class RegistryHandler extends Evented {\r\n constructor() {\r\n super();\r\n this._registry = new Registry();\r\n this._registryWidgetLabelMap = new Map();\r\n this._registryInjectorLabelMap = new Map();\r\n this.own(this._registry);\r\n const destroy = () => {\r\n if (this.baseRegistry) {\r\n this._registryWidgetLabelMap.delete(this.baseRegistry);\r\n this._registryInjectorLabelMap.delete(this.baseRegistry);\r\n this.baseRegistry = undefined;\r\n }\r\n };\r\n this.own({ destroy });\r\n }\r\n set base(baseRegistry) {\r\n if (this.baseRegistry) {\r\n this._registryWidgetLabelMap.delete(this.baseRegistry);\r\n this._registryInjectorLabelMap.delete(this.baseRegistry);\r\n }\r\n this.baseRegistry = baseRegistry;\r\n }\r\n define(label, widget) {\r\n this._registry.define(label, widget);\r\n }\r\n defineInjector(label, injector) {\r\n this._registry.defineInjector(label, injector);\r\n }\r\n has(label) {\r\n return this._registry.has(label) || Boolean(this.baseRegistry && this.baseRegistry.has(label));\r\n }\r\n hasInjector(label) {\r\n return this._registry.hasInjector(label) || Boolean(this.baseRegistry && this.baseRegistry.hasInjector(label));\r\n }\r\n get(label, globalPrecedence = false) {\r\n return this._get(label, globalPrecedence, 'get', this._registryWidgetLabelMap);\r\n }\r\n getInjector(label, globalPrecedence = false) {\r\n return this._get(label, globalPrecedence, 'getInjector', this._registryInjectorLabelMap);\r\n }\r\n _get(label, globalPrecedence, getFunctionName, labelMap) {\r\n const registries = globalPrecedence ? [this.baseRegistry, this._registry] : [this._registry, this.baseRegistry];\r\n for (let i = 0; i < registries.length; i++) {\r\n const registry = registries[i];\r\n if (!registry) {\r\n continue;\r\n }\r\n const item = registry[getFunctionName](label);\r\n const registeredLabels = labelMap.get(registry) || [];\r\n if (item) {\r\n return item;\r\n }\r\n else if (registeredLabels.indexOf(label) === -1) {\r\n const handle = registry.on(label, (event) => {\r\n if (event.action === 'loaded' &&\r\n this[getFunctionName](label, globalPrecedence) === event.item) {\r\n this.emit({ type: 'invalidate' });\r\n }\r\n });\r\n this.own(handle);\r\n labelMap.set(registry, [...registeredLabels, label]);\r\n }\r\n }\r\n return null;\r\n }\r\n}\r\nexport default RegistryHandler;\r\n//# sourceMappingURL=RegistryHandler.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "name": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "id": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "name": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "index": 14, "index2": 26, - "size": 14386, + "size": 13720, "cacheable": true, "built": true, "optional": false, @@ -4109,18 +4117,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./WidgetBase", "loc": "2:0-50" @@ -4131,8 +4139,8 @@ "module": "./src/menu/Menu.ts", "moduleName": "./src/menu/Menu.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/WidgetBase", - "loc": "5:0-58" + "userRequest": "@dojo/framework/widget-core/WidgetBase", + "loc": "5:0-68" } ], "usedExports": [ @@ -4146,12 +4154,12 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import Map from '@dojo/shim/Map';\nimport WeakMap from '@dojo/shim/WeakMap';\nimport Symbol from '@dojo/shim/Symbol';\nimport { v } from './d';\nimport { auto } from './diff';\nimport RegistryHandler from './RegistryHandler';\nimport NodeHandler from './NodeHandler';\nimport { widgetInstanceMap } from './vdom';\nimport { isWidgetBaseConstructor, WIDGET_BASE_TYPE } from './Registry';\nconst decoratorMap = new Map();\nconst boundAuto = auto.bind(null);\nexport const noBind = Symbol.for('dojoNoBind');\n/**\n * Main widget base for all widgets to extend\n */\nexport class WidgetBase {\n /**\n * @constructor\n */\n constructor() {\n /**\n * Indicates if it is the initial set properties cycle\n */\n this._initialProperties = true;\n /**\n * Array of property keys considered changed from the previous set properties\n */\n this._changedPropertyKeys = [];\n this._nodeHandler = new NodeHandler();\n this._handles = [];\n this._children = [];\n this._decoratorCache = new Map();\n this._properties = {};\n this._boundRenderFunc = this.render.bind(this);\n this._boundInvalidate = this.invalidate.bind(this);\n widgetInstanceMap.set(this, {\n dirty: true,\n onAttach: () => {\n this.onAttach();\n },\n onDetach: () => {\n this.onDetach();\n this.destroy();\n },\n nodeHandler: this._nodeHandler,\n registry: () => {\n return this.registry;\n },\n coreProperties: {},\n rendering: false,\n inputProperties: {}\n });\n this._runAfterConstructors();\n }\n meta(MetaType) {\n if (this._metaMap === undefined) {\n this._metaMap = new Map();\n }\n let cached = this._metaMap.get(MetaType);\n if (!cached) {\n cached = new MetaType({\n invalidate: this._boundInvalidate,\n nodeHandler: this._nodeHandler,\n bind: this\n });\n this.own(cached);\n this._metaMap.set(MetaType, cached);\n }\n return cached;\n }\n onAttach() {\n // Do nothing by default.\n }\n onDetach() {\n // Do nothing by default.\n }\n get properties() {\n return this._properties;\n }\n get changedPropertyKeys() {\n return [...this._changedPropertyKeys];\n }\n __setCoreProperties__(coreProperties) {\n const { baseRegistry } = coreProperties;\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.coreProperties.baseRegistry !== baseRegistry) {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n this._registry.base = baseRegistry;\n this.invalidate();\n }\n instanceData.coreProperties = coreProperties;\n }\n __setProperties__(originalProperties) {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.inputProperties = originalProperties;\n const properties = this._runBeforeProperties(originalProperties);\n const registeredDiffPropertyNames = this.getDecorator('registeredDiffProperty');\n const changedPropertyKeys = [];\n const propertyNames = Object.keys(properties);\n if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) {\n const allProperties = [...propertyNames, ...Object.keys(this._properties)];\n const checkedProperties = [];\n const diffPropertyResults = {};\n let runReactions = false;\n for (let i = 0; i < allProperties.length; i++) {\n const propertyName = allProperties[i];\n if (checkedProperties.indexOf(propertyName) !== -1) {\n continue;\n }\n checkedProperties.push(propertyName);\n const previousProperty = this._properties[propertyName];\n const newProperty = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n if (registeredDiffPropertyNames.indexOf(propertyName) !== -1) {\n runReactions = true;\n const diffFunctions = this.getDecorator(`diffProperty:${propertyName}`);\n for (let i = 0; i < diffFunctions.length; i++) {\n const result = diffFunctions[i](previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n else {\n const result = boundAuto(previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n if (runReactions) {\n this._mapDiffPropertyReactions(properties, changedPropertyKeys).forEach((args, reaction) => {\n if (args.changed) {\n reaction.call(this, args.previousProperties, args.newProperties);\n }\n });\n }\n this._properties = diffPropertyResults;\n this._changedPropertyKeys = changedPropertyKeys;\n }\n else {\n this._initialProperties = false;\n for (let i = 0; i < propertyNames.length; i++) {\n const propertyName = propertyNames[i];\n if (typeof properties[propertyName] === 'function') {\n properties[propertyName] = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n }\n else {\n changedPropertyKeys.push(propertyName);\n }\n }\n this._changedPropertyKeys = changedPropertyKeys;\n this._properties = Object.assign({}, properties);\n }\n if (this._changedPropertyKeys.length > 0) {\n this.invalidate();\n }\n }\n get children() {\n return this._children;\n }\n __setChildren__(children) {\n if (this._children.length > 0 || children.length > 0) {\n this._children = children;\n this.invalidate();\n }\n }\n __render__() {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.dirty = false;\n const render = this._runBeforeRenders();\n let dNode = render();\n dNode = this.runAfterRenders(dNode);\n this._nodeHandler.clear();\n return dNode;\n }\n invalidate() {\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.invalidate) {\n instanceData.invalidate();\n }\n }\n render() {\n return v('div', {}, this.children);\n }\n /**\n * Function to add decorators to WidgetBase\n *\n * @param decoratorKey The key of the decorator\n * @param value The value of the decorator\n */\n addDecorator(decoratorKey, value) {\n value = Array.isArray(value) ? value : [value];\n if (this.hasOwnProperty('constructor')) {\n let decoratorList = decoratorMap.get(this.constructor);\n if (!decoratorList) {\n decoratorList = new Map();\n decoratorMap.set(this.constructor, decoratorList);\n }\n let specificDecoratorList = decoratorList.get(decoratorKey);\n if (!specificDecoratorList) {\n specificDecoratorList = [];\n decoratorList.set(decoratorKey, specificDecoratorList);\n }\n specificDecoratorList.push(...value);\n }\n else {\n const decorators = this.getDecorator(decoratorKey);\n this._decoratorCache.set(decoratorKey, [...decorators, ...value]);\n }\n }\n /**\n * Function to build the list of decorators from the global decorator map.\n *\n * @param decoratorKey The key of the decorator\n * @return An array of decorator values\n * @private\n */\n _buildDecoratorList(decoratorKey) {\n const allDecorators = [];\n let constructor = this.constructor;\n while (constructor) {\n const instanceMap = decoratorMap.get(constructor);\n if (instanceMap) {\n const decorators = instanceMap.get(decoratorKey);\n if (decorators) {\n allDecorators.unshift(...decorators);\n }\n }\n constructor = Object.getPrototypeOf(constructor);\n }\n return allDecorators;\n }\n /**\n * Function to retrieve decorator values\n *\n * @param decoratorKey The key of the decorator\n * @returns An array of decorator values\n */\n getDecorator(decoratorKey) {\n let allDecorators = this._decoratorCache.get(decoratorKey);\n if (allDecorators !== undefined) {\n return allDecorators;\n }\n allDecorators = this._buildDecoratorList(decoratorKey);\n this._decoratorCache.set(decoratorKey, allDecorators);\n return allDecorators;\n }\n _mapDiffPropertyReactions(newProperties, changedPropertyKeys) {\n const reactionFunctions = this.getDecorator('diffReaction');\n return reactionFunctions.reduce((reactionPropertyMap, { reaction, propertyName }) => {\n let reactionArguments = reactionPropertyMap.get(reaction);\n if (reactionArguments === undefined) {\n reactionArguments = {\n previousProperties: {},\n newProperties: {},\n changed: false\n };\n }\n reactionArguments.previousProperties[propertyName] = this._properties[propertyName];\n reactionArguments.newProperties[propertyName] = newProperties[propertyName];\n if (changedPropertyKeys.indexOf(propertyName) !== -1) {\n reactionArguments.changed = true;\n }\n reactionPropertyMap.set(reaction, reactionArguments);\n return reactionPropertyMap;\n }, new Map());\n }\n /**\n * Binds unbound property functions to the specified `bind` property\n *\n * @param properties properties to check for functions\n */\n _bindFunctionProperty(property, bind) {\n if (typeof property === 'function' && !property[noBind] && isWidgetBaseConstructor(property) === false) {\n if (this._bindFunctionPropertyMap === undefined) {\n this._bindFunctionPropertyMap = new WeakMap();\n }\n const bindInfo = this._bindFunctionPropertyMap.get(property) || {};\n let { boundFunc, scope } = bindInfo;\n if (boundFunc === undefined || scope !== bind) {\n boundFunc = property.bind(bind);\n this._bindFunctionPropertyMap.set(property, { boundFunc, scope: bind });\n }\n return boundFunc;\n }\n return property;\n }\n get registry() {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n return this._registry;\n }\n _runBeforeProperties(properties) {\n const beforeProperties = this.getDecorator('beforeProperties');\n if (beforeProperties.length > 0) {\n return beforeProperties.reduce((properties, beforePropertiesFunction) => {\n return Object.assign({}, properties, beforePropertiesFunction.call(this, properties));\n }, Object.assign({}, properties));\n }\n return properties;\n }\n /**\n * Run all registered before renders and return the updated render method\n */\n _runBeforeRenders() {\n const beforeRenders = this.getDecorator('beforeRender');\n if (beforeRenders.length > 0) {\n return beforeRenders.reduce((render, beforeRenderFunction) => {\n const updatedRender = beforeRenderFunction.call(this, render, this._properties, this._children);\n if (!updatedRender) {\n console.warn('Render function not returned from beforeRender, using previous render');\n return render;\n }\n return updatedRender;\n }, this._boundRenderFunc);\n }\n return this._boundRenderFunc;\n }\n /**\n * Run all registered after renders and return the decorated DNodes\n *\n * @param dNode The DNodes to run through the after renders\n */\n runAfterRenders(dNode) {\n const afterRenders = this.getDecorator('afterRender');\n if (afterRenders.length > 0) {\n return afterRenders.reduce((dNode, afterRenderFunction) => {\n return afterRenderFunction.call(this, dNode);\n }, dNode);\n }\n if (this._metaMap !== undefined) {\n this._metaMap.forEach((meta) => {\n meta.afterRender();\n });\n }\n return dNode;\n }\n _runAfterConstructors() {\n const afterConstructors = this.getDecorator('afterConstructor');\n if (afterConstructors.length > 0) {\n afterConstructors.forEach((afterConstructor) => afterConstructor.call(this));\n }\n }\n own(handle) {\n this._handles.push(handle);\n }\n destroy() {\n while (this._handles.length > 0) {\n const handle = this._handles.pop();\n if (handle) {\n handle.destroy();\n }\n }\n }\n}\n/**\n * static identifier\n */\nWidgetBase._type = WIDGET_BASE_TYPE;\nexport default WidgetBase;\n//# sourceMappingURL=WidgetBase.mjs.map" + "source": "import Map from '../shim/Map';\nimport WeakMap from '../shim/WeakMap';\nimport Symbol from '../shim/Symbol';\nimport { v } from './d';\nimport { auto } from './diff';\nimport RegistryHandler from './RegistryHandler';\nimport NodeHandler from './NodeHandler';\nimport { widgetInstanceMap } from './vdom';\nimport { isWidgetBaseConstructor, WIDGET_BASE_TYPE } from './Registry';\nconst decoratorMap = new Map();\nconst boundAuto = auto.bind(null);\nexport const noBind = Symbol.for('dojoNoBind');\n/**\n * Main widget base for all widgets to extend\n */\nexport class WidgetBase {\n /**\n * @constructor\n */\n constructor() {\n /**\n * Indicates if it is the initial set properties cycle\n */\n this._initialProperties = true;\n /**\n * Array of property keys considered changed from the previous set properties\n */\n this._changedPropertyKeys = [];\n this._nodeHandler = new NodeHandler();\n this._handles = [];\n this._children = [];\n this._decoratorCache = new Map();\n this._properties = {};\n this._boundRenderFunc = this.render.bind(this);\n this._boundInvalidate = this.invalidate.bind(this);\n widgetInstanceMap.set(this, {\n dirty: true,\n onAttach: () => {\n this.onAttach();\n },\n onDetach: () => {\n this.onDetach();\n this.destroy();\n },\n nodeHandler: this._nodeHandler,\n registry: () => {\n return this.registry;\n },\n coreProperties: {},\n rendering: false,\n inputProperties: {}\n });\n this._runAfterConstructors();\n }\n meta(MetaType) {\n if (this._metaMap === undefined) {\n this._metaMap = new Map();\n }\n let cached = this._metaMap.get(MetaType);\n if (!cached) {\n cached = new MetaType({\n invalidate: this._boundInvalidate,\n nodeHandler: this._nodeHandler,\n bind: this\n });\n this.own(cached);\n this._metaMap.set(MetaType, cached);\n }\n return cached;\n }\n onAttach() {\n // Do nothing by default.\n }\n onDetach() {\n // Do nothing by default.\n }\n get properties() {\n return this._properties;\n }\n get changedPropertyKeys() {\n return [...this._changedPropertyKeys];\n }\n __setCoreProperties__(coreProperties) {\n const { baseRegistry } = coreProperties;\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.coreProperties.baseRegistry !== baseRegistry) {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n this._registry.base = baseRegistry;\n this.invalidate();\n }\n instanceData.coreProperties = coreProperties;\n }\n __setProperties__(originalProperties) {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.inputProperties = originalProperties;\n const properties = this._runBeforeProperties(originalProperties);\n const registeredDiffPropertyNames = this.getDecorator('registeredDiffProperty');\n const changedPropertyKeys = [];\n const propertyNames = Object.keys(properties);\n if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) {\n const allProperties = [...propertyNames, ...Object.keys(this._properties)];\n const checkedProperties = [];\n const diffPropertyResults = {};\n let runReactions = false;\n for (let i = 0; i < allProperties.length; i++) {\n const propertyName = allProperties[i];\n if (checkedProperties.indexOf(propertyName) !== -1) {\n continue;\n }\n checkedProperties.push(propertyName);\n const previousProperty = this._properties[propertyName];\n const newProperty = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n if (registeredDiffPropertyNames.indexOf(propertyName) !== -1) {\n runReactions = true;\n const diffFunctions = this.getDecorator(`diffProperty:${propertyName}`);\n for (let i = 0; i < diffFunctions.length; i++) {\n const result = diffFunctions[i](previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n else {\n const result = boundAuto(previousProperty, newProperty);\n if (result.changed && changedPropertyKeys.indexOf(propertyName) === -1) {\n changedPropertyKeys.push(propertyName);\n }\n if (propertyName in properties) {\n diffPropertyResults[propertyName] = result.value;\n }\n }\n }\n if (runReactions) {\n const reactionFunctions = this.getDecorator('diffReaction');\n const executedReactions = [];\n reactionFunctions.forEach(({ reaction, propertyName }) => {\n const propertyChanged = changedPropertyKeys.indexOf(propertyName) !== -1;\n const reactionRun = executedReactions.indexOf(reaction) !== -1;\n if (propertyChanged && !reactionRun) {\n reaction.call(this, this._properties, diffPropertyResults);\n executedReactions.push(reaction);\n }\n });\n }\n this._properties = diffPropertyResults;\n this._changedPropertyKeys = changedPropertyKeys;\n }\n else {\n this._initialProperties = false;\n for (let i = 0; i < propertyNames.length; i++) {\n const propertyName = propertyNames[i];\n if (typeof properties[propertyName] === 'function') {\n properties[propertyName] = this._bindFunctionProperty(properties[propertyName], instanceData.coreProperties.bind);\n }\n else {\n changedPropertyKeys.push(propertyName);\n }\n }\n this._changedPropertyKeys = changedPropertyKeys;\n this._properties = Object.assign({}, properties);\n }\n if (this._changedPropertyKeys.length > 0) {\n this.invalidate();\n }\n }\n get children() {\n return this._children;\n }\n __setChildren__(children) {\n if (this._children.length > 0 || children.length > 0) {\n this._children = children;\n this.invalidate();\n }\n }\n __render__() {\n const instanceData = widgetInstanceMap.get(this);\n instanceData.dirty = false;\n const render = this._runBeforeRenders();\n let dNode = render();\n dNode = this.runAfterRenders(dNode);\n this._nodeHandler.clear();\n return dNode;\n }\n invalidate() {\n const instanceData = widgetInstanceMap.get(this);\n if (instanceData.invalidate) {\n instanceData.invalidate();\n }\n }\n render() {\n return v('div', {}, this.children);\n }\n /**\n * Function to add decorators to WidgetBase\n *\n * @param decoratorKey The key of the decorator\n * @param value The value of the decorator\n */\n addDecorator(decoratorKey, value) {\n value = Array.isArray(value) ? value : [value];\n if (this.hasOwnProperty('constructor')) {\n let decoratorList = decoratorMap.get(this.constructor);\n if (!decoratorList) {\n decoratorList = new Map();\n decoratorMap.set(this.constructor, decoratorList);\n }\n let specificDecoratorList = decoratorList.get(decoratorKey);\n if (!specificDecoratorList) {\n specificDecoratorList = [];\n decoratorList.set(decoratorKey, specificDecoratorList);\n }\n specificDecoratorList.push(...value);\n }\n else {\n const decorators = this.getDecorator(decoratorKey);\n this._decoratorCache.set(decoratorKey, [...decorators, ...value]);\n }\n }\n /**\n * Function to build the list of decorators from the global decorator map.\n *\n * @param decoratorKey The key of the decorator\n * @return An array of decorator values\n * @private\n */\n _buildDecoratorList(decoratorKey) {\n const allDecorators = [];\n let constructor = this.constructor;\n while (constructor) {\n const instanceMap = decoratorMap.get(constructor);\n if (instanceMap) {\n const decorators = instanceMap.get(decoratorKey);\n if (decorators) {\n allDecorators.unshift(...decorators);\n }\n }\n constructor = Object.getPrototypeOf(constructor);\n }\n return allDecorators;\n }\n /**\n * Function to retrieve decorator values\n *\n * @param decoratorKey The key of the decorator\n * @returns An array of decorator values\n */\n getDecorator(decoratorKey) {\n let allDecorators = this._decoratorCache.get(decoratorKey);\n if (allDecorators !== undefined) {\n return allDecorators;\n }\n allDecorators = this._buildDecoratorList(decoratorKey);\n this._decoratorCache.set(decoratorKey, allDecorators);\n return allDecorators;\n }\n /**\n * Binds unbound property functions to the specified `bind` property\n *\n * @param properties properties to check for functions\n */\n _bindFunctionProperty(property, bind) {\n if (typeof property === 'function' && !property[noBind] && isWidgetBaseConstructor(property) === false) {\n if (this._bindFunctionPropertyMap === undefined) {\n this._bindFunctionPropertyMap = new WeakMap();\n }\n const bindInfo = this._bindFunctionPropertyMap.get(property) || {};\n let { boundFunc, scope } = bindInfo;\n if (boundFunc === undefined || scope !== bind) {\n boundFunc = property.bind(bind);\n this._bindFunctionPropertyMap.set(property, { boundFunc, scope: bind });\n }\n return boundFunc;\n }\n return property;\n }\n get registry() {\n if (this._registry === undefined) {\n this._registry = new RegistryHandler();\n this.own(this._registry);\n this.own(this._registry.on('invalidate', this._boundInvalidate));\n }\n return this._registry;\n }\n _runBeforeProperties(properties) {\n const beforeProperties = this.getDecorator('beforeProperties');\n if (beforeProperties.length > 0) {\n return beforeProperties.reduce((properties, beforePropertiesFunction) => {\n return Object.assign({}, properties, beforePropertiesFunction.call(this, properties));\n }, Object.assign({}, properties));\n }\n return properties;\n }\n /**\n * Run all registered before renders and return the updated render method\n */\n _runBeforeRenders() {\n const beforeRenders = this.getDecorator('beforeRender');\n if (beforeRenders.length > 0) {\n return beforeRenders.reduce((render, beforeRenderFunction) => {\n const updatedRender = beforeRenderFunction.call(this, render, this._properties, this._children);\n if (!updatedRender) {\n console.warn('Render function not returned from beforeRender, using previous render');\n return render;\n }\n return updatedRender;\n }, this._boundRenderFunc);\n }\n return this._boundRenderFunc;\n }\n /**\n * Run all registered after renders and return the decorated DNodes\n *\n * @param dNode The DNodes to run through the after renders\n */\n runAfterRenders(dNode) {\n const afterRenders = this.getDecorator('afterRender');\n if (afterRenders.length > 0) {\n dNode = afterRenders.reduce((dNode, afterRenderFunction) => {\n return afterRenderFunction.call(this, dNode);\n }, dNode);\n }\n if (this._metaMap !== undefined) {\n this._metaMap.forEach((meta) => {\n meta.afterRender();\n });\n }\n return dNode;\n }\n _runAfterConstructors() {\n const afterConstructors = this.getDecorator('afterConstructor');\n if (afterConstructors.length > 0) {\n afterConstructors.forEach((afterConstructor) => afterConstructor.call(this));\n }\n }\n own(handle) {\n this._handles.push(handle);\n }\n destroy() {\n while (this._handles.length > 0) {\n const handle = this._handles.pop();\n if (handle) {\n handle.destroy();\n }\n }\n }\n}\n/**\n * static identifier\n */\nWidgetBase._type = WIDGET_BASE_TYPE;\nexport default WidgetBase;\n//# sourceMappingURL=WidgetBase.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/animations/cssTransitions.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\animations\\cssTransitions.mjs", - "name": "./node_modules/@dojo/widget-core/animations/cssTransitions.mjs", + "id": "./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\animations\\cssTransitions.mjs", + "name": "./node_modules/@dojo/framework/widget-core/animations/cssTransitions.mjs", "index": 33, "index2": 27, "size": 2288, @@ -4163,18 +4171,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "../animations/cssTransitions", "loc": "3:0-58" @@ -4191,12 +4199,12 @@ "source": "let browserSpecificTransitionEndEventName = '';\nlet browserSpecificAnimationEndEventName = '';\nfunction determineBrowserStyleNames(element) {\n if ('WebkitTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'webkitTransitionEnd';\n browserSpecificAnimationEndEventName = 'webkitAnimationEnd';\n }\n else if ('transition' in element.style || 'MozTransition' in element.style) {\n browserSpecificTransitionEndEventName = 'transitionend';\n browserSpecificAnimationEndEventName = 'animationend';\n }\n else {\n throw new Error('Your browser is not supported');\n }\n}\nfunction initialize(element) {\n if (browserSpecificAnimationEndEventName === '') {\n determineBrowserStyleNames(element);\n }\n}\nfunction runAndCleanUp(element, startAnimation, finishAnimation) {\n initialize(element);\n let finished = false;\n let transitionEnd = function () {\n if (!finished) {\n finished = true;\n element.removeEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n element.removeEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n finishAnimation();\n }\n };\n startAnimation();\n element.addEventListener(browserSpecificAnimationEndEventName, transitionEnd);\n element.addEventListener(browserSpecificTransitionEndEventName, transitionEnd);\n}\nfunction exit(node, properties, exitAnimation, removeNode) {\n const activeClass = properties.exitAnimationActive || `${exitAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(exitAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n removeNode();\n });\n}\nfunction enter(node, properties, enterAnimation) {\n const activeClass = properties.enterAnimationActive || `${enterAnimation}-active`;\n runAndCleanUp(node, () => {\n node.classList.add(enterAnimation);\n requestAnimationFrame(function () {\n node.classList.add(activeClass);\n });\n }, () => {\n node.classList.remove(enterAnimation);\n node.classList.remove(activeClass);\n });\n}\nexport default {\n enter,\n exit\n};\n//# sourceMappingURL=cssTransitions.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/d.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\d.mjs", - "name": "./node_modules/@dojo/widget-core/d.mjs", + "id": "./node_modules/@dojo/framework/widget-core/d.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\d.mjs", + "name": "./node_modules/@dojo/framework/widget-core/d.mjs", "index": 4, "index2": 8, - "size": 3270, + "size": 3267, "cacheable": true, "built": true, "optional": false, @@ -4205,54 +4213,54 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./d", "loc": "5:0-29" }, { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./d", "loc": "4:0-24" }, + { + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "type": "harmony import", + "userRequest": "./../d", + "loc": "5:0-27" + }, { "moduleId": "./src/menu/Menu.ts", "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--3-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\umd-compat-loader\\index.js??ref--3-1!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\ts-loader\\index.js??ref--3-2!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\css-module-dts-loader\\index.js?type=ts&instanceName=0_menu!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\src\\menu\\Menu.ts", "module": "./src/menu/Menu.ts", "moduleName": "./src/menu/Menu.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/d", - "loc": "2:0-40" - }, - { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "type": "harmony import", - "userRequest": "./../d", - "loc": "5:0-27" + "userRequest": "@dojo/framework/widget-core/d", + "loc": "2:0-50" }, { - "moduleId": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\vdom.mjs", - "module": "./node_modules/@dojo/widget-core/vdom.mjs", - "moduleName": "./node_modules/@dojo/widget-core/vdom.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\vdom.mjs", + "module": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "type": "harmony import", "userRequest": "./d", "loc": "3:0-65" @@ -4283,12 +4291,12 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import Symbol from '@dojo/shim/Symbol';\n/**\n * The symbol identifier for a WNode type\n */\nexport const WNODE = Symbol('Identifier for a WNode.');\n/**\n * The symbol identifier for a VNode type\n */\nexport const VNODE = Symbol('Identifier for a VNode.');\n/**\n * The symbol identifier for a VNode type created using dom()\n */\nexport const DOMVNODE = Symbol('Identifier for a VNode created using existing dom.');\n/**\n * Helper function that returns true if the `DNode` is a `WNode` using the `type` property\n */\nexport function isWNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === WNODE);\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` using the `type` property\n */\nexport function isVNode(child) {\n return Boolean(child && typeof child !== 'string' && (child.type === VNODE || child.type === DOMVNODE));\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` created with `dom()` using the `type` property\n */\nexport function isDomVNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === DOMVNODE);\n}\nexport function isElementNode(value) {\n return !!value.tagName;\n}\nexport function decorate(dNodes, optionsOrModifier, predicate) {\n let shallow = false;\n let modifier;\n if (typeof optionsOrModifier === 'function') {\n modifier = optionsOrModifier;\n }\n else {\n modifier = optionsOrModifier.modifier;\n predicate = optionsOrModifier.predicate;\n shallow = optionsOrModifier.shallow || false;\n }\n let nodes = Array.isArray(dNodes) ? [...dNodes] : [dNodes];\n function breaker() {\n nodes = [];\n }\n while (nodes.length) {\n const node = nodes.shift();\n if (node) {\n if (!shallow && (isWNode(node) || isVNode(node)) && node.children) {\n nodes = [...nodes, ...node.children];\n }\n if (!predicate || predicate(node)) {\n modifier(node, breaker);\n }\n }\n }\n return dNodes;\n}\n/**\n * Wrapper function for calls to create a widget.\n */\nexport function w(widgetConstructor, properties, children = []) {\n return {\n children,\n widgetConstructor,\n properties,\n type: WNODE\n };\n}\nexport function v(tag, propertiesOrChildren = {}, children = undefined) {\n let properties = propertiesOrChildren;\n let deferredPropertiesCallback;\n if (Array.isArray(propertiesOrChildren)) {\n children = propertiesOrChildren;\n properties = {};\n }\n if (typeof properties === 'function') {\n deferredPropertiesCallback = properties;\n properties = {};\n }\n return {\n tag,\n deferredPropertiesCallback,\n children,\n properties,\n type: VNODE\n };\n}\n/**\n * Create a VNode for an existing DOM Node.\n */\nexport function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, children) {\n return {\n tag: isElementNode(node) ? node.tagName.toLowerCase() : '',\n properties: props,\n attributes: attrs,\n events: on,\n children,\n type: DOMVNODE,\n domNode: node,\n text: isElementNode(node) ? undefined : node.data,\n diffType\n };\n}\n//# sourceMappingURL=d.mjs.map" + "source": "import Symbol from '../shim/Symbol';\n/**\n * The symbol identifier for a WNode type\n */\nexport const WNODE = Symbol('Identifier for a WNode.');\n/**\n * The symbol identifier for a VNode type\n */\nexport const VNODE = Symbol('Identifier for a VNode.');\n/**\n * The symbol identifier for a VNode type created using dom()\n */\nexport const DOMVNODE = Symbol('Identifier for a VNode created using existing dom.');\n/**\n * Helper function that returns true if the `DNode` is a `WNode` using the `type` property\n */\nexport function isWNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === WNODE);\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` using the `type` property\n */\nexport function isVNode(child) {\n return Boolean(child && typeof child !== 'string' && (child.type === VNODE || child.type === DOMVNODE));\n}\n/**\n * Helper function that returns true if the `DNode` is a `VNode` created with `dom()` using the `type` property\n */\nexport function isDomVNode(child) {\n return Boolean(child && typeof child !== 'string' && child.type === DOMVNODE);\n}\nexport function isElementNode(value) {\n return !!value.tagName;\n}\nexport function decorate(dNodes, optionsOrModifier, predicate) {\n let shallow = false;\n let modifier;\n if (typeof optionsOrModifier === 'function') {\n modifier = optionsOrModifier;\n }\n else {\n modifier = optionsOrModifier.modifier;\n predicate = optionsOrModifier.predicate;\n shallow = optionsOrModifier.shallow || false;\n }\n let nodes = Array.isArray(dNodes) ? [...dNodes] : [dNodes];\n function breaker() {\n nodes = [];\n }\n while (nodes.length) {\n const node = nodes.shift();\n if (node) {\n if (!shallow && (isWNode(node) || isVNode(node)) && node.children) {\n nodes = [...nodes, ...node.children];\n }\n if (!predicate || predicate(node)) {\n modifier(node, breaker);\n }\n }\n }\n return dNodes;\n}\n/**\n * Wrapper function for calls to create a widget.\n */\nexport function w(widgetConstructor, properties, children = []) {\n return {\n children,\n widgetConstructor,\n properties,\n type: WNODE\n };\n}\nexport function v(tag, propertiesOrChildren = {}, children = undefined) {\n let properties = propertiesOrChildren;\n let deferredPropertiesCallback;\n if (Array.isArray(propertiesOrChildren)) {\n children = propertiesOrChildren;\n properties = {};\n }\n if (typeof properties === 'function') {\n deferredPropertiesCallback = properties;\n properties = {};\n }\n return {\n tag,\n deferredPropertiesCallback,\n children,\n properties,\n type: VNODE\n };\n}\n/**\n * Create a VNode for an existing DOM Node.\n */\nexport function dom({ node, attrs = {}, props = {}, on = {}, diffType = 'none' }, children) {\n return {\n tag: isElementNode(node) ? node.tagName.toLowerCase() : '',\n properties: props,\n attributes: attrs,\n events: on,\n children,\n type: DOMVNODE,\n domNode: node,\n text: isElementNode(node) ? undefined : node.data,\n diffType\n };\n}\n//# sourceMappingURL=d.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\alwaysRender.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\alwaysRender.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "index": 41, "index2": 36, "size": 365, @@ -4300,18 +4308,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./decorators/alwaysRender", "loc": "8:0-57" @@ -4329,9 +4337,9 @@ "source": "import { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\nexport function alwaysRender() {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function () {\n this.invalidate();\n })(target);\n });\n}\nexport default alwaysRender;\n//# sourceMappingURL=alwaysRender.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\beforeProperties.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\beforeProperties.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", "index": 39, "index2": 32, "size": 331, @@ -4343,27 +4351,27 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\alwaysRender.mjs", - "issuerId": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "issuerName": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\alwaysRender.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\alwaysRender.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\alwaysRender.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "type": "harmony import", "userRequest": "./beforeProperties", "loc": "2:0-54" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\inject.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\inject.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "type": "harmony import", "userRequest": "./beforeProperties", "loc": "3:0-54" @@ -4381,9 +4389,9 @@ "source": "import { handleDecorator } from './handleDecorator';\nexport function beforeProperties(method) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator('beforeProperties', propertyKey ? target[propertyKey] : method);\n });\n}\nexport default beforeProperties;\n//# sourceMappingURL=beforeProperties.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\customElement.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\customElement.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", "index": 12, "index2": 38, "size": 728, @@ -4408,8 +4416,8 @@ "module": "./src/menu/Menu.ts", "moduleName": "./src/menu/Menu.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/decorators/customElement", - "loc": "3:0-75" + "userRequest": "@dojo/framework/widget-core/decorators/customElement", + "loc": "3:0-85" } ], "usedExports": [ @@ -4424,12 +4432,12 @@ "source": "import { CustomElementChildType } from '../registerCustomElement';\nimport Registry from '../Registry';\n/**\n * This Decorator is provided properties that define the behavior of a custom element, and\n * registers that custom element.\n */\nexport function customElement({ tag, properties = [], attributes = [], events = [], childType = CustomElementChildType.DOJO, registryFactory = () => new Registry() }) {\n return function (target) {\n target.prototype.__customElementDescriptor = {\n tagName: tag,\n attributes,\n properties,\n events,\n childType,\n registryFactory\n };\n };\n}\nexport default customElement;\n//# sourceMappingURL=customElement.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\diffProperty.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\diffProperty.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", "index": 40, "index2": 34, - "size": 973, + "size": 1014, "cacheable": true, "built": true, "optional": false, @@ -4438,18 +4446,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../decorators/diffProperty", "loc": "5:0-60" @@ -4464,12 +4472,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import { handleDecorator } from './handleDecorator';\n/**\n * Decorator that can be used to register a function as a specific property diff\n *\n * @param propertyName The name of the property of which the diff function is applied\n * @param diffType The diff type, default is DiffType.AUTO.\n * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM\n */\nexport function diffProperty(propertyName, diffFunction, reactionFunction) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null));\n target.addDecorator('registeredDiffProperty', propertyName);\n if (reactionFunction || propertyKey) {\n target.addDecorator('diffReaction', {\n propertyName,\n reaction: propertyKey ? target[propertyKey] : reactionFunction\n });\n }\n });\n}\nexport default diffProperty;\n//# sourceMappingURL=diffProperty.mjs.map" + "source": "import { handleDecorator } from './handleDecorator';\nimport { auto } from './../diff';\n/**\n * Decorator that can be used to register a function as a specific property diff\n *\n * @param propertyName The name of the property of which the diff function is applied\n * @param diffType The diff type, default is DiffType.AUTO.\n * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM\n */\nexport function diffProperty(propertyName, diffFunction = auto, reactionFunction) {\n return handleDecorator((target, propertyKey) => {\n target.addDecorator(`diffProperty:${propertyName}`, diffFunction.bind(null));\n target.addDecorator('registeredDiffProperty', propertyName);\n if (reactionFunction || propertyKey) {\n target.addDecorator('diffReaction', {\n propertyName,\n reaction: propertyKey ? target[propertyKey] : reactionFunction\n });\n }\n });\n}\nexport default diffProperty;\n//# sourceMappingURL=diffProperty.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\handleDecorator.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/handleDecorator.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\handleDecorator.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.mjs", "index": 35, "index2": 28, "size": 512, @@ -4481,63 +4489,63 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../decorators/handleDecorator", "loc": "4:0-66" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\alwaysRender.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/alwaysRender.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\alwaysRender.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\afterRender.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/afterRender.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\afterRender.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/afterRender.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\inject.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\inject.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "2:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\diffProperty.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/diffProperty.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\diffProperty.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\beforeProperties.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/beforeProperties.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\beforeProperties.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.mjs", "type": "harmony import", "userRequest": "./handleDecorator", "loc": "1:0-52" @@ -4555,9 +4563,9 @@ "source": "/**\n * Generic decorator handler to take care of whether or not the decorator was called at the class level\n * or the method level.\n *\n * @param handler\n */\nexport function handleDecorator(handler) {\n return function (target, propertyKey, descriptor) {\n if (typeof target === 'function') {\n handler(target.prototype, undefined);\n }\n else {\n handler(target, propertyKey);\n }\n };\n}\nexport default handleDecorator;\n//# sourceMappingURL=handleDecorator.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/decorators/inject.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\inject.mjs", - "name": "./node_modules/@dojo/widget-core/decorators/inject.mjs", + "id": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\inject.mjs", + "name": "./node_modules/@dojo/framework/widget-core/decorators/inject.mjs", "index": 38, "index2": 33, "size": 1532, @@ -4569,18 +4577,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "issuerId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "issuerName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../decorators/inject", "loc": "3:0-48" @@ -4595,12 +4603,12 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import WeakMap from '@dojo/shim/WeakMap';\nimport { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\n/**\n * Map of instances against registered injectors.\n */\nconst registeredInjectorsMap = new WeakMap();\n/**\n * Decorator retrieves an injector from an available registry using the name and\n * calls the `getProperties` function with the payload from the injector\n * and current properties with the the injected properties returned.\n *\n * @param InjectConfig the inject configuration\n */\nexport function inject({ name, getProperties }) {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function (properties) {\n const injectorItem = this.registry.getInjector(name);\n if (injectorItem) {\n const { injector, invalidator } = injectorItem;\n const registeredInjectors = registeredInjectorsMap.get(this) || [];\n if (registeredInjectors.length === 0) {\n registeredInjectorsMap.set(this, registeredInjectors);\n }\n if (registeredInjectors.indexOf(injectorItem) === -1) {\n this.own(invalidator.on('invalidate', () => {\n this.invalidate();\n }));\n registeredInjectors.push(injectorItem);\n }\n return getProperties(injector(), properties);\n }\n })(target);\n });\n}\nexport default inject;\n//# sourceMappingURL=inject.mjs.map" + "source": "import WeakMap from '../../shim/WeakMap';\nimport { handleDecorator } from './handleDecorator';\nimport { beforeProperties } from './beforeProperties';\n/**\n * Map of instances against registered injectors.\n */\nconst registeredInjectorsMap = new WeakMap();\n/**\n * Decorator retrieves an injector from an available registry using the name and\n * calls the `getProperties` function with the payload from the injector\n * and current properties with the the injected properties returned.\n *\n * @param InjectConfig the inject configuration\n */\nexport function inject({ name, getProperties }) {\n return handleDecorator((target, propertyKey) => {\n beforeProperties(function (properties) {\n const injectorItem = this.registry.getInjector(name);\n if (injectorItem) {\n const { injector, invalidator } = injectorItem;\n const registeredInjectors = registeredInjectorsMap.get(this) || [];\n if (registeredInjectors.length === 0) {\n registeredInjectorsMap.set(this, registeredInjectors);\n }\n if (registeredInjectors.indexOf(injectorItem) === -1) {\n this.own(invalidator.on('invalidate', () => {\n this.invalidate();\n }));\n registeredInjectors.push(injectorItem);\n }\n return getProperties(injector(), properties);\n }\n })(target);\n });\n}\nexport default inject;\n//# sourceMappingURL=inject.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/diff.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\diff.mjs", - "name": "./node_modules/@dojo/widget-core/diff.mjs", + "id": "./node_modules/@dojo/framework/widget-core/diff.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\diff.mjs", + "name": "./node_modules/@dojo/framework/widget-core/diff.mjs", "index": 20, "index2": 20, "size": 1930, @@ -4612,30 +4620,39 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./diff", "loc": "5:0-30" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "./../diff", "loc": "6:0-36" + }, + { + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\diffProperty.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.mjs", + "type": "harmony import", + "userRequest": "./../diff", + "loc": "2:0-33" } ], "usedExports": [ @@ -4654,12 +4671,12 @@ "source": "import { WIDGET_BASE_TYPE } from './Registry';\nfunction isObjectOrArray(value) {\n return Object.prototype.toString.call(value) === '[object Object]' || Array.isArray(value);\n}\nexport function always(previousProperty, newProperty) {\n return {\n changed: true,\n value: newProperty\n };\n}\nexport function ignore(previousProperty, newProperty) {\n return {\n changed: false,\n value: newProperty\n };\n}\nexport function reference(previousProperty, newProperty) {\n return {\n changed: previousProperty !== newProperty,\n value: newProperty\n };\n}\nexport function shallow(previousProperty, newProperty) {\n let changed = false;\n const validOldProperty = previousProperty && isObjectOrArray(previousProperty);\n const validNewProperty = newProperty && isObjectOrArray(newProperty);\n if (!validOldProperty || !validNewProperty) {\n return {\n changed: true,\n value: newProperty\n };\n }\n const previousKeys = Object.keys(previousProperty);\n const newKeys = Object.keys(newProperty);\n if (previousKeys.length !== newKeys.length) {\n changed = true;\n }\n else {\n changed = newKeys.some((key) => {\n return newProperty[key] !== previousProperty[key];\n });\n }\n return {\n changed,\n value: newProperty\n };\n}\nexport function auto(previousProperty, newProperty) {\n let result;\n if (typeof newProperty === 'function') {\n if (newProperty._type === WIDGET_BASE_TYPE) {\n result = reference(previousProperty, newProperty);\n }\n else {\n result = ignore(previousProperty, newProperty);\n }\n }\n else if (isObjectOrArray(newProperty)) {\n result = shallow(previousProperty, newProperty);\n }\n else {\n result = reference(previousProperty, newProperty);\n }\n return result;\n}\n//# sourceMappingURL=diff.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "name": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "id": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "name": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "index": 32, "index2": 30, - "size": 5852, + "size": 5683, "cacheable": true, "built": true, "optional": false, @@ -4668,18 +4685,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./mixins/Projector", "loc": "3:0-52" @@ -4696,15 +4713,15 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import * as tslib_1 from \"tslib\";\nimport { assign } from '@dojo/core/lang';\nimport cssTransitions from '../animations/cssTransitions';\nimport { afterRender } from './../decorators/afterRender';\nimport { v } from './../d';\nimport { dom } from './../vdom';\n/**\n * Represents the attach state of the projector\n */\nexport var ProjectorAttachState;\n(function (ProjectorAttachState) {\n ProjectorAttachState[ProjectorAttachState[\"Attached\"] = 1] = \"Attached\";\n ProjectorAttachState[ProjectorAttachState[\"Detached\"] = 2] = \"Detached\";\n})(ProjectorAttachState || (ProjectorAttachState = {}));\n/**\n * Attach type for the projector\n */\nexport var AttachType;\n(function (AttachType) {\n AttachType[AttachType[\"Append\"] = 1] = \"Append\";\n AttachType[AttachType[\"Merge\"] = 2] = \"Merge\";\n})(AttachType || (AttachType = {}));\nexport function ProjectorMixin(Base) {\n class Projector extends Base {\n constructor(...args) {\n super(...args);\n this._root = document.body;\n this._async = true;\n this._projectorProperties = {};\n this._projectionOptions = {\n transitions: cssTransitions\n };\n this.root = document.body;\n this.projectorState = ProjectorAttachState.Detached;\n }\n append(root) {\n const options = {\n type: AttachType.Append,\n root\n };\n return this._attach(options);\n }\n merge(root) {\n const options = {\n type: AttachType.Merge,\n root\n };\n return this._attach(options);\n }\n set root(root) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change root element');\n }\n this._root = root;\n }\n get root() {\n return this._root;\n }\n get async() {\n return this._async;\n }\n set async(async) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change async mode');\n }\n this._async = async;\n }\n sandbox(doc = document) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot create sandbox');\n }\n this._async = false;\n const previousRoot = this.root;\n /* free up the document fragment for GC */\n this.own({\n destroy: () => {\n this._root = previousRoot;\n }\n });\n this._attach({\n /* DocumentFragment is not assignable to Element, but provides everything needed to work */\n root: doc.createDocumentFragment(),\n type: AttachType.Append\n });\n }\n setChildren(children) {\n this.__setChildren__(children);\n }\n setProperties(properties) {\n this.__setProperties__(properties);\n }\n __setProperties__(properties) {\n if (this._projectorProperties && this._projectorProperties.registry !== properties.registry) {\n if (this._projectorProperties.registry) {\n this._projectorProperties.registry.destroy();\n }\n }\n this._projectorProperties = assign({}, properties);\n super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry });\n super.__setProperties__(properties);\n }\n toHtml() {\n if (this.projectorState !== ProjectorAttachState.Attached || !this._projection) {\n throw new Error('Projector is not attached, cannot return an HTML string of projection.');\n }\n return this._projection.domNode.childNodes[0].outerHTML;\n }\n afterRender(result) {\n let node = result;\n if (typeof result === 'string' || result === null || result === undefined) {\n node = v('span', {}, [result]);\n }\n return node;\n }\n destroy() {\n super.destroy();\n }\n _attach({ type, root }) {\n if (root) {\n this.root = root;\n }\n if (this._attachHandle) {\n return this._attachHandle;\n }\n this.projectorState = ProjectorAttachState.Attached;\n const handle = {\n destroy: () => {\n if (this.projectorState === ProjectorAttachState.Attached) {\n this._projection = undefined;\n this.projectorState = ProjectorAttachState.Detached;\n }\n }\n };\n this.own(handle);\n this._attachHandle = handle;\n this._projectionOptions = Object.assign({}, this._projectionOptions, { sync: !this._async });\n switch (type) {\n case AttachType.Append:\n this._projection = dom.append(this.root, this, this._projectionOptions);\n break;\n case AttachType.Merge:\n this._projection = dom.merge(this.root, this, this._projectionOptions);\n break;\n }\n return this._attachHandle;\n }\n }\n tslib_1.__decorate([\n afterRender(),\n tslib_1.__metadata(\"design:type\", Function),\n tslib_1.__metadata(\"design:paramtypes\", [Object]),\n tslib_1.__metadata(\"design:returntype\", void 0)\n ], Projector.prototype, \"afterRender\", null);\n return Projector;\n}\nexport default ProjectorMixin;\n//# sourceMappingURL=Projector.mjs.map" + "source": "import * as tslib_1 from \"tslib\";\nimport { assign } from '../../core/lang';\nimport cssTransitions from '../animations/cssTransitions';\nimport { afterRender } from './../decorators/afterRender';\nimport { v } from './../d';\nimport { dom } from './../vdom';\n/**\n * Represents the attach state of the projector\n */\nexport var ProjectorAttachState;\n(function (ProjectorAttachState) {\n ProjectorAttachState[ProjectorAttachState[\"Attached\"] = 1] = \"Attached\";\n ProjectorAttachState[ProjectorAttachState[\"Detached\"] = 2] = \"Detached\";\n})(ProjectorAttachState || (ProjectorAttachState = {}));\n/**\n * Attach type for the projector\n */\nexport var AttachType;\n(function (AttachType) {\n AttachType[AttachType[\"Append\"] = 1] = \"Append\";\n AttachType[AttachType[\"Merge\"] = 2] = \"Merge\";\n})(AttachType || (AttachType = {}));\nexport function ProjectorMixin(Base) {\n class Projector extends Base {\n constructor(...args) {\n super(...args);\n this._root = document.body;\n this._async = true;\n this._projectorProperties = {};\n this._projectionOptions = {\n transitions: cssTransitions\n };\n this.root = document.body;\n this.projectorState = ProjectorAttachState.Detached;\n }\n append(root) {\n const options = {\n type: AttachType.Append,\n root\n };\n return this._attach(options);\n }\n merge(root) {\n const options = {\n type: AttachType.Merge,\n root\n };\n return this._attach(options);\n }\n set root(root) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change root element');\n }\n this._root = root;\n }\n get root() {\n return this._root;\n }\n get async() {\n return this._async;\n }\n set async(async) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot change async mode');\n }\n this._async = async;\n }\n sandbox(doc = document) {\n if (this.projectorState === ProjectorAttachState.Attached) {\n throw new Error('Projector already attached, cannot create sandbox');\n }\n this._async = false;\n const previousRoot = this.root;\n /* free up the document fragment for GC */\n this.own({\n destroy: () => {\n this._root = previousRoot;\n }\n });\n this._attach({\n /* DocumentFragment is not assignable to Element, but provides everything needed to work */\n root: doc.createDocumentFragment(),\n type: AttachType.Append\n });\n }\n setChildren(children) {\n this.__setChildren__(children);\n }\n setProperties(properties) {\n this.__setProperties__(properties);\n }\n __setProperties__(properties) {\n if (this._projectorProperties && this._projectorProperties.registry !== properties.registry) {\n if (this._projectorProperties.registry) {\n this._projectorProperties.registry.destroy();\n }\n }\n this._projectorProperties = assign({}, properties);\n super.__setCoreProperties__({ bind: this, baseRegistry: properties.registry });\n super.__setProperties__(properties);\n }\n toHtml() {\n if (this.projectorState !== ProjectorAttachState.Attached || !this._projection) {\n throw new Error('Projector is not attached, cannot return an HTML string of projection.');\n }\n return this._projection.domNode.childNodes[0].outerHTML;\n }\n afterRender(result) {\n let node = result;\n if (typeof result === 'string' || result === null || result === undefined) {\n node = v('span', {}, [result]);\n }\n return node;\n }\n destroy() {\n super.destroy();\n }\n _attach({ type, root }) {\n if (root) {\n this.root = root;\n }\n if (this._attachHandle) {\n return this._attachHandle;\n }\n this.projectorState = ProjectorAttachState.Attached;\n const handle = {\n destroy: () => {\n if (this.projectorState === ProjectorAttachState.Attached) {\n this._projection = undefined;\n this.projectorState = ProjectorAttachState.Detached;\n }\n }\n };\n this.own(handle);\n this._attachHandle = handle;\n this._projectionOptions = Object.assign({}, this._projectionOptions, { sync: !this._async });\n switch (type) {\n case AttachType.Append:\n this._projection = dom.append(this.root, this, this._projectionOptions);\n break;\n case AttachType.Merge:\n this._projection = dom.merge(this.root, this, this._projectionOptions);\n break;\n }\n return this._attachHandle;\n }\n }\n tslib_1.__decorate([\n afterRender()\n ], Projector.prototype, \"afterRender\", null);\n return Projector;\n}\nexport default ProjectorMixin;\n//# sourceMappingURL=Projector.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "name": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "id": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "name": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "index": 36, "index2": 35, - "size": 5320, + "size": 5157, "cacheable": true, "built": true, "optional": false, @@ -4713,18 +4730,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "./mixins/Themed", "loc": "7:0-56" @@ -4735,8 +4752,8 @@ "module": "./src/menu/Menu.ts", "moduleName": "./src/menu/Menu.ts", "type": "harmony import", - "userRequest": "@dojo/widget-core/mixins/Themed", - "loc": "4:0-69" + "userRequest": "@dojo/framework/widget-core/mixins/Themed", + "loc": "4:0-79" } ], "usedExports": [ @@ -4753,15 +4770,15 @@ ], "optimizationBailout": [], "depth": 3, - "source": "import * as tslib_1 from \"tslib\";\nimport { Injector } from './../Injector';\nimport { inject } from './../decorators/inject';\nimport { handleDecorator } from './../decorators/handleDecorator';\nimport { diffProperty } from './../decorators/diffProperty';\nimport { shallow } from './../diff';\nconst THEME_KEY = ' _key';\nexport const INJECTED_THEME_KEY = Symbol('theme');\n/**\n * Decorator for base css classes\n */\nexport function theme(theme) {\n return handleDecorator((target) => {\n target.addDecorator('baseThemeClasses', theme);\n });\n}\n/**\n * Creates a reverse lookup for the classes passed in via the `theme` function.\n *\n * @param classes The baseClasses object\n * @requires\n */\nfunction createThemeClassesLookup(classes) {\n return classes.reduce((currentClassNames, baseClass) => {\n Object.keys(baseClass).forEach((key) => {\n currentClassNames[baseClass[key]] = key;\n });\n return currentClassNames;\n }, {});\n}\n/**\n * Convenience function that is given a theme and an optional registry, the theme\n * injector is defined against the registry, returning the theme.\n *\n * @param theme the theme to set\n * @param themeRegistry registry to define the theme injector against. Defaults\n * to the global registry\n *\n * @returns the theme injector used to set the theme\n */\nexport function registerThemeInjector(theme, themeRegistry) {\n const themeInjector = new Injector(theme);\n themeRegistry.defineInjector(INJECTED_THEME_KEY, (invalidator) => {\n themeInjector.setInvalidator(invalidator);\n return () => themeInjector.get();\n });\n return themeInjector;\n}\n/**\n * Function that returns a class decorated with with Themed functionality\n */\nexport function ThemedMixin(Base) {\n let Themed = class Themed extends Base {\n constructor() {\n super(...arguments);\n /**\n * Registered base theme keys\n */\n this._registeredBaseThemeKeys = [];\n /**\n * Indicates if classes meta data need to be calculated.\n */\n this._recalculateClasses = true;\n /**\n * Loaded theme\n */\n this._theme = {};\n }\n theme(classes) {\n if (this._recalculateClasses) {\n this._recalculateThemeClasses();\n }\n if (Array.isArray(classes)) {\n return classes.map((className) => this._getThemeClass(className));\n }\n return this._getThemeClass(classes);\n }\n /**\n * Function fired when `theme` or `extraClasses` are changed.\n */\n onPropertiesChanged() {\n this._recalculateClasses = true;\n }\n _getThemeClass(className) {\n if (className === undefined || className === null) {\n return className;\n }\n const extraClasses = this.properties.extraClasses || {};\n const themeClassName = this._baseThemeClassesReverseLookup[className];\n let resultClassNames = [];\n if (!themeClassName) {\n console.warn(`Class name: '${className}' not found in theme`);\n return null;\n }\n if (extraClasses[themeClassName]) {\n resultClassNames.push(extraClasses[themeClassName]);\n }\n if (this._theme[themeClassName]) {\n resultClassNames.push(this._theme[themeClassName]);\n }\n else {\n resultClassNames.push(this._registeredBaseTheme[themeClassName]);\n }\n return resultClassNames.join(' ');\n }\n _recalculateThemeClasses() {\n const { theme = {} } = this.properties;\n const baseThemes = this.getDecorator('baseThemeClasses');\n if (!this._registeredBaseTheme) {\n this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => {\n const _a = THEME_KEY, key = baseTheme[_a], classes = tslib_1.__rest(baseTheme, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n this._registeredBaseThemeKeys.push(key);\n return Object.assign({}, finalBaseTheme, classes);\n }, {});\n this._baseThemeClassesReverseLookup = createThemeClassesLookup(baseThemes);\n }\n this._theme = this._registeredBaseThemeKeys.reduce((baseTheme, themeKey) => {\n return Object.assign({}, baseTheme, theme[themeKey]);\n }, {});\n this._recalculateClasses = false;\n }\n };\n tslib_1.__decorate([\n diffProperty('theme', shallow),\n diffProperty('extraClasses', shallow),\n tslib_1.__metadata(\"design:type\", Function),\n tslib_1.__metadata(\"design:paramtypes\", []),\n tslib_1.__metadata(\"design:returntype\", void 0)\n ], Themed.prototype, \"onPropertiesChanged\", null);\n Themed = tslib_1.__decorate([\n inject({\n name: INJECTED_THEME_KEY,\n getProperties: (theme, properties) => {\n if (!properties.theme) {\n return { theme };\n }\n return {};\n }\n })\n ], Themed);\n return Themed;\n}\nexport default ThemedMixin;\n//# sourceMappingURL=Themed.mjs.map" + "source": "import * as tslib_1 from \"tslib\";\nimport { Injector } from './../Injector';\nimport { inject } from './../decorators/inject';\nimport { handleDecorator } from './../decorators/handleDecorator';\nimport { diffProperty } from './../decorators/diffProperty';\nimport { shallow } from './../diff';\nconst THEME_KEY = ' _key';\nexport const INJECTED_THEME_KEY = Symbol('theme');\n/**\n * Decorator for base css classes\n */\nexport function theme(theme) {\n return handleDecorator((target) => {\n target.addDecorator('baseThemeClasses', theme);\n });\n}\n/**\n * Creates a reverse lookup for the classes passed in via the `theme` function.\n *\n * @param classes The baseClasses object\n * @requires\n */\nfunction createThemeClassesLookup(classes) {\n return classes.reduce((currentClassNames, baseClass) => {\n Object.keys(baseClass).forEach((key) => {\n currentClassNames[baseClass[key]] = key;\n });\n return currentClassNames;\n }, {});\n}\n/**\n * Convenience function that is given a theme and an optional registry, the theme\n * injector is defined against the registry, returning the theme.\n *\n * @param theme the theme to set\n * @param themeRegistry registry to define the theme injector against. Defaults\n * to the global registry\n *\n * @returns the theme injector used to set the theme\n */\nexport function registerThemeInjector(theme, themeRegistry) {\n const themeInjector = new Injector(theme);\n themeRegistry.defineInjector(INJECTED_THEME_KEY, (invalidator) => {\n themeInjector.setInvalidator(invalidator);\n return () => themeInjector.get();\n });\n return themeInjector;\n}\n/**\n * Function that returns a class decorated with with Themed functionality\n */\nexport function ThemedMixin(Base) {\n let Themed = class Themed extends Base {\n constructor() {\n super(...arguments);\n /**\n * Registered base theme keys\n */\n this._registeredBaseThemeKeys = [];\n /**\n * Indicates if classes meta data need to be calculated.\n */\n this._recalculateClasses = true;\n /**\n * Loaded theme\n */\n this._theme = {};\n }\n theme(classes) {\n if (this._recalculateClasses) {\n this._recalculateThemeClasses();\n }\n if (Array.isArray(classes)) {\n return classes.map((className) => this._getThemeClass(className));\n }\n return this._getThemeClass(classes);\n }\n /**\n * Function fired when `theme` or `extraClasses` are changed.\n */\n onPropertiesChanged() {\n this._recalculateClasses = true;\n }\n _getThemeClass(className) {\n if (className === undefined || className === null) {\n return className;\n }\n const extraClasses = this.properties.extraClasses || {};\n const themeClassName = this._baseThemeClassesReverseLookup[className];\n let resultClassNames = [];\n if (!themeClassName) {\n console.warn(`Class name: '${className}' not found in theme`);\n return null;\n }\n if (extraClasses[themeClassName]) {\n resultClassNames.push(extraClasses[themeClassName]);\n }\n if (this._theme[themeClassName]) {\n resultClassNames.push(this._theme[themeClassName]);\n }\n else {\n resultClassNames.push(this._registeredBaseTheme[themeClassName]);\n }\n return resultClassNames.join(' ');\n }\n _recalculateThemeClasses() {\n const { theme = {} } = this.properties;\n const baseThemes = this.getDecorator('baseThemeClasses');\n if (!this._registeredBaseTheme) {\n this._registeredBaseTheme = baseThemes.reduce((finalBaseTheme, baseTheme) => {\n const _a = THEME_KEY, key = baseTheme[_a], classes = tslib_1.__rest(baseTheme, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n this._registeredBaseThemeKeys.push(key);\n return Object.assign({}, finalBaseTheme, classes);\n }, {});\n this._baseThemeClassesReverseLookup = createThemeClassesLookup(baseThemes);\n }\n this._theme = this._registeredBaseThemeKeys.reduce((baseTheme, themeKey) => {\n return Object.assign({}, baseTheme, theme[themeKey]);\n }, {});\n this._recalculateClasses = false;\n }\n };\n tslib_1.__decorate([\n diffProperty('theme', shallow),\n diffProperty('extraClasses', shallow)\n ], Themed.prototype, \"onPropertiesChanged\", null);\n Themed = tslib_1.__decorate([\n inject({\n name: INJECTED_THEME_KEY,\n getProperties: (theme, properties) => {\n if (!properties.theme) {\n return { theme };\n }\n return {};\n }\n })\n ], Themed);\n return Themed;\n}\nexport default ThemedMixin;\n//# sourceMappingURL=Themed.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "name": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "id": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "name": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "index": 13, "index2": 37, - "size": 9124, + "size": 9118, "cacheable": true, "built": true, "optional": false, @@ -4783,14 +4800,14 @@ "module": "./node_modules/imports-loader?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js", "moduleName": "./node_modules/imports-loader?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js", "type": "cjs require", - "userRequest": "@dojo/widget-core/registerCustomElement", - "loc": "4:28-78" + "userRequest": "@dojo/framework/widget-core/registerCustomElement", + "loc": "4:28-88" }, { - "moduleId": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\decorators\\customElement.mjs", - "module": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/decorators/customElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\decorators\\customElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/decorators/customElement.mjs", "type": "harmony import", "userRequest": "../registerCustomElement", "loc": "1:0-66" @@ -4806,15 +4823,15 @@ ], "optimizationBailout": [], "depth": 2, - "source": "import * as tslib_1 from \"tslib\";\nimport { WidgetBase, noBind } from './WidgetBase';\nimport { ProjectorMixin } from './mixins/Projector';\nimport { from } from '@dojo/shim/array';\nimport { w, dom } from './d';\nimport global from '@dojo/shim/global';\nimport { registerThemeInjector } from './mixins/Themed';\nimport { alwaysRender } from './decorators/alwaysRender';\nexport var CustomElementChildType;\n(function (CustomElementChildType) {\n CustomElementChildType[\"DOJO\"] = \"DOJO\";\n CustomElementChildType[\"NODE\"] = \"NODE\";\n CustomElementChildType[\"TEXT\"] = \"TEXT\";\n})(CustomElementChildType || (CustomElementChildType = {}));\nexport function DomToWidgetWrapper(domNode) {\n let DomToWidgetWrapper = class DomToWidgetWrapper extends WidgetBase {\n render() {\n const properties = Object.keys(this.properties).reduce((props, key) => {\n const value = this.properties[key];\n if (key.indexOf('on') === 0) {\n key = `__${key}`;\n }\n props[key] = value;\n return props;\n }, {});\n return dom({ node: domNode, props: properties, diffType: 'dom' });\n }\n static get domNode() {\n return domNode;\n }\n };\n DomToWidgetWrapper = tslib_1.__decorate([\n alwaysRender()\n ], DomToWidgetWrapper);\n return DomToWidgetWrapper;\n}\nexport function create(descriptor, WidgetConstructor) {\n const { attributes, childType, registryFactory } = descriptor;\n const attributeMap = {};\n attributes.forEach((propertyName) => {\n const attributeName = propertyName.toLowerCase();\n attributeMap[attributeName] = propertyName;\n });\n return class extends HTMLElement {\n constructor() {\n super(...arguments);\n this._properties = {};\n this._children = [];\n this._eventProperties = {};\n this._initialised = false;\n }\n connectedCallback() {\n if (this._initialised) {\n return;\n }\n const domProperties = {};\n const { attributes, properties, events } = descriptor;\n this._properties = Object.assign({}, this._properties, this._attributesToProperties(attributes));\n [...attributes, ...properties].forEach((propertyName) => {\n const value = this[propertyName];\n const filteredPropertyName = propertyName.replace(/^on/, '__');\n if (value !== undefined) {\n this._properties[propertyName] = value;\n }\n if (filteredPropertyName !== propertyName) {\n domProperties[filteredPropertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n }\n domProperties[propertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n });\n events.forEach((propertyName) => {\n const eventName = propertyName.replace(/^on/, '').toLowerCase();\n const filteredPropertyName = propertyName.replace(/^on/, '__on');\n domProperties[filteredPropertyName] = {\n get: () => this._getEventProperty(propertyName),\n set: (value) => this._setEventProperty(propertyName, value)\n };\n this._eventProperties[propertyName] = undefined;\n this._properties[propertyName] = (...args) => {\n const eventCallback = this._getEventProperty(propertyName);\n if (typeof eventCallback === 'function') {\n eventCallback(...args);\n }\n this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: false,\n detail: args\n }));\n };\n });\n Object.defineProperties(this, domProperties);\n const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children;\n from(children).forEach((childNode) => {\n if (childType === CustomElementChildType.DOJO) {\n childNode.addEventListener('dojo-ce-render', () => this._render());\n childNode.addEventListener('dojo-ce-connected', () => this._render());\n this._children.push(DomToWidgetWrapper(childNode));\n }\n else {\n this._children.push(dom({ node: childNode, diffType: 'dom' }));\n }\n });\n this.addEventListener('dojo-ce-connected', (e) => this._childConnected(e));\n const widgetProperties = this._properties;\n const renderChildren = () => this.__children__();\n const Wrapper = class extends WidgetBase {\n render() {\n return w(WidgetConstructor, widgetProperties, renderChildren());\n }\n };\n const registry = registryFactory();\n const themeContext = registerThemeInjector(this._getTheme(), registry);\n global.addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme()));\n const Projector = ProjectorMixin(Wrapper);\n this._projector = new Projector();\n this._projector.setProperties({ registry });\n this._projector.append(this);\n this._initialised = true;\n this.dispatchEvent(new CustomEvent('dojo-ce-connected', {\n bubbles: true,\n detail: this\n }));\n }\n _getTheme() {\n if (global && global.dojoce && global.dojoce.theme) {\n return global.dojoce.themes[global.dojoce.theme];\n }\n }\n _childConnected(e) {\n const node = e.detail;\n if (node.parentNode === this) {\n const exists = this._children.some((child) => child.domNode === node);\n if (!exists) {\n node.addEventListener('dojo-ce-render', () => this._render());\n this._children.push(DomToWidgetWrapper(node));\n this._render();\n }\n }\n }\n _render() {\n if (this._projector) {\n this._projector.invalidate();\n this.dispatchEvent(new CustomEvent('dojo-ce-render', {\n bubbles: false,\n detail: this\n }));\n }\n }\n __properties__() {\n return Object.assign({}, this._properties, this._eventProperties);\n }\n __children__() {\n if (childType === CustomElementChildType.DOJO) {\n return this._children.filter((Child) => Child.domNode.isWidget).map((Child) => {\n const { domNode } = Child;\n return w(Child, Object.assign({}, domNode.__properties__()), [...domNode.__children__()]);\n });\n }\n else {\n return this._children;\n }\n }\n attributeChangedCallback(name, oldValue, value) {\n const propertyName = attributeMap[name];\n this._setProperty(propertyName, value);\n }\n _setEventProperty(propertyName, value) {\n this._eventProperties[propertyName] = value;\n }\n _getEventProperty(propertyName) {\n return this._eventProperties[propertyName];\n }\n _setProperty(propertyName, value) {\n if (typeof value === 'function') {\n value[noBind] = true;\n }\n this._properties[propertyName] = value;\n this._render();\n }\n _getProperty(propertyName) {\n return this._properties[propertyName];\n }\n _attributesToProperties(attributes) {\n return attributes.reduce((properties, propertyName) => {\n const attributeName = propertyName.toLowerCase();\n const value = this.getAttribute(attributeName);\n if (value !== null) {\n properties[propertyName] = value;\n }\n return properties;\n }, {});\n }\n static get observedAttributes() {\n return Object.keys(attributeMap);\n }\n get isWidget() {\n return true;\n }\n };\n}\nexport function register(WidgetConstructor) {\n const descriptor = WidgetConstructor.prototype && WidgetConstructor.prototype.__customElementDescriptor;\n if (!descriptor) {\n throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?');\n }\n global.customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor));\n}\nexport default register;\n//# sourceMappingURL=registerCustomElement.mjs.map" + "source": "import * as tslib_1 from \"tslib\";\nimport { WidgetBase, noBind } from './WidgetBase';\nimport { ProjectorMixin } from './mixins/Projector';\nimport { from } from '../shim/array';\nimport { w, dom } from './d';\nimport global from '../shim/global';\nimport { registerThemeInjector } from './mixins/Themed';\nimport { alwaysRender } from './decorators/alwaysRender';\nexport var CustomElementChildType;\n(function (CustomElementChildType) {\n CustomElementChildType[\"DOJO\"] = \"DOJO\";\n CustomElementChildType[\"NODE\"] = \"NODE\";\n CustomElementChildType[\"TEXT\"] = \"TEXT\";\n})(CustomElementChildType || (CustomElementChildType = {}));\nexport function DomToWidgetWrapper(domNode) {\n let DomToWidgetWrapper = class DomToWidgetWrapper extends WidgetBase {\n render() {\n const properties = Object.keys(this.properties).reduce((props, key) => {\n const value = this.properties[key];\n if (key.indexOf('on') === 0) {\n key = `__${key}`;\n }\n props[key] = value;\n return props;\n }, {});\n return dom({ node: domNode, props: properties, diffType: 'dom' });\n }\n static get domNode() {\n return domNode;\n }\n };\n DomToWidgetWrapper = tslib_1.__decorate([\n alwaysRender()\n ], DomToWidgetWrapper);\n return DomToWidgetWrapper;\n}\nexport function create(descriptor, WidgetConstructor) {\n const { attributes, childType, registryFactory } = descriptor;\n const attributeMap = {};\n attributes.forEach((propertyName) => {\n const attributeName = propertyName.toLowerCase();\n attributeMap[attributeName] = propertyName;\n });\n return class extends HTMLElement {\n constructor() {\n super(...arguments);\n this._properties = {};\n this._children = [];\n this._eventProperties = {};\n this._initialised = false;\n }\n connectedCallback() {\n if (this._initialised) {\n return;\n }\n const domProperties = {};\n const { attributes, properties, events } = descriptor;\n this._properties = Object.assign({}, this._properties, this._attributesToProperties(attributes));\n [...attributes, ...properties].forEach((propertyName) => {\n const value = this[propertyName];\n const filteredPropertyName = propertyName.replace(/^on/, '__');\n if (value !== undefined) {\n this._properties[propertyName] = value;\n }\n if (filteredPropertyName !== propertyName) {\n domProperties[filteredPropertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n }\n domProperties[propertyName] = {\n get: () => this._getProperty(propertyName),\n set: (value) => this._setProperty(propertyName, value)\n };\n });\n events.forEach((propertyName) => {\n const eventName = propertyName.replace(/^on/, '').toLowerCase();\n const filteredPropertyName = propertyName.replace(/^on/, '__on');\n domProperties[filteredPropertyName] = {\n get: () => this._getEventProperty(propertyName),\n set: (value) => this._setEventProperty(propertyName, value)\n };\n this._eventProperties[propertyName] = undefined;\n this._properties[propertyName] = (...args) => {\n const eventCallback = this._getEventProperty(propertyName);\n if (typeof eventCallback === 'function') {\n eventCallback(...args);\n }\n this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: false,\n detail: args\n }));\n };\n });\n Object.defineProperties(this, domProperties);\n const children = childType === CustomElementChildType.TEXT ? this.childNodes : this.children;\n from(children).forEach((childNode) => {\n if (childType === CustomElementChildType.DOJO) {\n childNode.addEventListener('dojo-ce-render', () => this._render());\n childNode.addEventListener('dojo-ce-connected', () => this._render());\n this._children.push(DomToWidgetWrapper(childNode));\n }\n else {\n this._children.push(dom({ node: childNode, diffType: 'dom' }));\n }\n });\n this.addEventListener('dojo-ce-connected', (e) => this._childConnected(e));\n const widgetProperties = this._properties;\n const renderChildren = () => this.__children__();\n const Wrapper = class extends WidgetBase {\n render() {\n return w(WidgetConstructor, widgetProperties, renderChildren());\n }\n };\n const registry = registryFactory();\n const themeContext = registerThemeInjector(this._getTheme(), registry);\n global.addEventListener('dojo-theme-set', () => themeContext.set(this._getTheme()));\n const Projector = ProjectorMixin(Wrapper);\n this._projector = new Projector();\n this._projector.setProperties({ registry });\n this._projector.append(this);\n this._initialised = true;\n this.dispatchEvent(new CustomEvent('dojo-ce-connected', {\n bubbles: true,\n detail: this\n }));\n }\n _getTheme() {\n if (global && global.dojoce && global.dojoce.theme) {\n return global.dojoce.themes[global.dojoce.theme];\n }\n }\n _childConnected(e) {\n const node = e.detail;\n if (node.parentNode === this) {\n const exists = this._children.some((child) => child.domNode === node);\n if (!exists) {\n node.addEventListener('dojo-ce-render', () => this._render());\n this._children.push(DomToWidgetWrapper(node));\n this._render();\n }\n }\n }\n _render() {\n if (this._projector) {\n this._projector.invalidate();\n this.dispatchEvent(new CustomEvent('dojo-ce-render', {\n bubbles: false,\n detail: this\n }));\n }\n }\n __properties__() {\n return Object.assign({}, this._properties, this._eventProperties);\n }\n __children__() {\n if (childType === CustomElementChildType.DOJO) {\n return this._children.filter((Child) => Child.domNode.isWidget).map((Child) => {\n const { domNode } = Child;\n return w(Child, Object.assign({}, domNode.__properties__()), [...domNode.__children__()]);\n });\n }\n else {\n return this._children;\n }\n }\n attributeChangedCallback(name, oldValue, value) {\n const propertyName = attributeMap[name];\n this._setProperty(propertyName, value);\n }\n _setEventProperty(propertyName, value) {\n this._eventProperties[propertyName] = value;\n }\n _getEventProperty(propertyName) {\n return this._eventProperties[propertyName];\n }\n _setProperty(propertyName, value) {\n if (typeof value === 'function') {\n value[noBind] = true;\n }\n this._properties[propertyName] = value;\n this._render();\n }\n _getProperty(propertyName) {\n return this._properties[propertyName];\n }\n _attributesToProperties(attributes) {\n return attributes.reduce((properties, propertyName) => {\n const attributeName = propertyName.toLowerCase();\n const value = this.getAttribute(attributeName);\n if (value !== null) {\n properties[propertyName] = value;\n }\n return properties;\n }, {});\n }\n static get observedAttributes() {\n return Object.keys(attributeMap);\n }\n get isWidget() {\n return true;\n }\n };\n}\nexport function register(WidgetConstructor) {\n const descriptor = WidgetConstructor.prototype && WidgetConstructor.prototype.__customElementDescriptor;\n if (!descriptor) {\n throw new Error('Cannot get descriptor for Custom Element, have you added the @customElement decorator to your Widget?');\n }\n global.customElements.define(descriptor.tagName, create(descriptor, WidgetConstructor));\n}\nexport default register;\n//# sourceMappingURL=registerCustomElement.mjs.map" }, { - "id": "./node_modules/@dojo/widget-core/vdom.mjs", - "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\vdom.mjs", - "name": "./node_modules/@dojo/widget-core/vdom.mjs", + "id": "./node_modules/@dojo/framework/widget-core/vdom.mjs", + "identifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\vdom.mjs", + "name": "./node_modules/@dojo/framework/widget-core/vdom.mjs", "index": 29, "index2": 25, - "size": 39734, + "size": 40904, "cacheable": true, "built": true, "optional": false, @@ -4823,27 +4840,27 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "issuerId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "issuerName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\WidgetBase.mjs", - "module": "./node_modules/@dojo/widget-core/WidgetBase.mjs", - "moduleName": "./node_modules/@dojo/widget-core/WidgetBase.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\WidgetBase.mjs", + "module": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/WidgetBase.mjs", "type": "harmony import", "userRequest": "./vdom", "loc": "8:0-43" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "./../vdom", "loc": "6:0-32" @@ -4862,7 +4879,7 @@ ], "optimizationBailout": [], "depth": 4, - "source": "import global from '@dojo/shim/global';\r\nimport { from as arrayFrom } from '@dojo/shim/array';\r\nimport { isWNode, isVNode, isDomVNode, VNODE, WNODE } from './d';\r\nimport { isWidgetBaseConstructor } from './Registry';\r\nimport WeakMap from '@dojo/shim/WeakMap';\r\nconst NAMESPACE_W3 = 'http://www.w3.org/';\r\nconst NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg';\r\nconst NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink';\r\nconst emptyArray = [];\r\nexport const widgetInstanceMap = new WeakMap();\r\nconst instanceMap = new WeakMap();\r\nconst projectorStateMap = new WeakMap();\r\nfunction same(dnode1, dnode2) {\r\n if (isVNode(dnode1) && isVNode(dnode2)) {\r\n if (isDomVNode(dnode1) || isDomVNode(dnode2)) {\r\n if (dnode1.domNode !== dnode2.domNode) {\r\n return false;\r\n }\r\n }\r\n if (dnode1.tag !== dnode2.tag) {\r\n return false;\r\n }\r\n if (dnode1.properties.key !== dnode2.properties.key) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n else if (isWNode(dnode1) && isWNode(dnode2)) {\r\n if (dnode1.instance === undefined && typeof dnode2.widgetConstructor === 'string') {\r\n return false;\r\n }\r\n if (dnode1.widgetConstructor !== dnode2.widgetConstructor) {\r\n return false;\r\n }\r\n if (dnode1.properties.key !== dnode2.properties.key) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n return false;\r\n}\r\nconst missingTransition = function () {\r\n throw new Error('Provide a transitions object to the projectionOptions to do animations');\r\n};\r\nfunction getProjectionOptions(projectorOptions, projectorInstance) {\r\n const defaults = {\r\n namespace: undefined,\r\n styleApplyer: function (domNode, styleName, value) {\r\n domNode.style[styleName] = value;\r\n },\r\n transitions: {\r\n enter: missingTransition,\r\n exit: missingTransition\r\n },\r\n depth: 0,\r\n merge: false,\r\n sync: false,\r\n projectorInstance\r\n };\r\n return Object.assign({}, defaults, projectorOptions);\r\n}\r\nfunction checkStyleValue(styleValue) {\r\n if (typeof styleValue !== 'string') {\r\n throw new Error('Style values must be strings');\r\n }\r\n}\r\nfunction updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n const eventMap = projectorState.nodeMap.get(domNode) || new WeakMap();\r\n if (previousValue) {\r\n const previousEvent = eventMap.get(previousValue);\r\n domNode.removeEventListener(eventName, previousEvent);\r\n }\r\n let callback = currentValue.bind(bind);\r\n if (eventName === 'input') {\r\n callback = function (evt) {\r\n currentValue.call(this, evt);\r\n evt.target['oninput-value'] = evt.target.value;\r\n }.bind(bind);\r\n }\r\n domNode.addEventListener(eventName, callback);\r\n eventMap.set(currentValue, callback);\r\n projectorState.nodeMap.set(domNode, eventMap);\r\n}\r\nfunction addClasses(domNode, classes) {\r\n if (classes) {\r\n const classNames = classes.split(' ');\r\n for (let i = 0; i < classNames.length; i++) {\r\n domNode.classList.add(classNames[i]);\r\n }\r\n }\r\n}\r\nfunction removeClasses(domNode, classes) {\r\n if (classes) {\r\n const classNames = classes.split(' ');\r\n for (let i = 0; i < classNames.length; i++) {\r\n domNode.classList.remove(classNames[i]);\r\n }\r\n }\r\n}\r\nfunction buildPreviousProperties(domNode, previous, current) {\r\n const { diffType, properties, attributes } = current;\r\n if (!diffType || diffType === 'vdom') {\r\n return { properties: previous.properties, attributes: previous.attributes, events: previous.events };\r\n }\r\n else if (diffType === 'none') {\r\n return { properties: {}, attributes: previous.attributes ? {} : undefined, events: previous.events };\r\n }\r\n let newProperties = {\r\n properties: {}\r\n };\r\n if (attributes) {\r\n newProperties.attributes = {};\r\n newProperties.events = previous.events;\r\n Object.keys(properties).forEach((propName) => {\r\n newProperties.properties[propName] = domNode[propName];\r\n });\r\n Object.keys(attributes).forEach((attrName) => {\r\n newProperties.attributes[attrName] = domNode.getAttribute(attrName);\r\n });\r\n return newProperties;\r\n }\r\n newProperties.properties = Object.keys(properties).reduce((props, property) => {\r\n props[property] = domNode.getAttribute(property) || domNode[property];\r\n return props;\r\n }, {});\r\n return newProperties;\r\n}\r\nfunction focusNode(propValue, previousValue, domNode, projectionOptions) {\r\n let result;\r\n if (typeof propValue === 'function') {\r\n result = propValue();\r\n }\r\n else {\r\n result = propValue && !previousValue;\r\n }\r\n if (result === true) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectorState.deferredRenderCallbacks.push(() => {\r\n domNode.focus();\r\n });\r\n }\r\n}\r\nfunction removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions, onlyEvents = false) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n const eventMap = projectorState.nodeMap.get(domNode);\r\n if (eventMap) {\r\n Object.keys(previousProperties).forEach((propName) => {\r\n const isEvent = propName.substr(0, 2) === 'on' || onlyEvents;\r\n const eventName = onlyEvents ? propName : propName.substr(2);\r\n if (isEvent && !properties[propName]) {\r\n const eventCallback = eventMap.get(previousProperties[propName]);\r\n if (eventCallback) {\r\n domNode.removeEventListener(eventName, eventCallback);\r\n }\r\n }\r\n });\r\n }\r\n}\r\nfunction updateAttribute(domNode, attrName, attrValue, projectionOptions) {\r\n if (projectionOptions.namespace === NAMESPACE_SVG && attrName === 'href') {\r\n domNode.setAttributeNS(NAMESPACE_XLINK, attrName, attrValue);\r\n }\r\n else if ((attrName === 'role' && attrValue === '') || attrValue === undefined) {\r\n domNode.removeAttribute(attrName);\r\n }\r\n else {\r\n domNode.setAttribute(attrName, attrValue);\r\n }\r\n}\r\nfunction updateAttributes(domNode, previousAttributes, attributes, projectionOptions) {\r\n const attrNames = Object.keys(attributes);\r\n const attrCount = attrNames.length;\r\n for (let i = 0; i < attrCount; i++) {\r\n const attrName = attrNames[i];\r\n const attrValue = attributes[attrName];\r\n const previousAttrValue = previousAttributes[attrName];\r\n if (attrValue !== previousAttrValue) {\r\n updateAttribute(domNode, attrName, attrValue, projectionOptions);\r\n }\r\n }\r\n}\r\nfunction updateProperties(domNode, previousProperties, properties, projectionOptions, includesEventsAndAttributes = true) {\r\n let propertiesUpdated = false;\r\n const propNames = Object.keys(properties);\r\n const propCount = propNames.length;\r\n if (propNames.indexOf('classes') === -1 && previousProperties.classes) {\r\n if (Array.isArray(previousProperties.classes)) {\r\n for (let i = 0; i < previousProperties.classes.length; i++) {\r\n removeClasses(domNode, previousProperties.classes[i]);\r\n }\r\n }\r\n else {\r\n removeClasses(domNode, previousProperties.classes);\r\n }\r\n }\r\n includesEventsAndAttributes && removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions);\r\n for (let i = 0; i < propCount; i++) {\r\n const propName = propNames[i];\r\n let propValue = properties[propName];\r\n const previousValue = previousProperties[propName];\r\n if (propName === 'classes') {\r\n const previousClasses = Array.isArray(previousValue) ? previousValue : [previousValue];\r\n const currentClasses = Array.isArray(propValue) ? propValue : [propValue];\r\n if (previousClasses && previousClasses.length > 0) {\r\n if (!propValue || propValue.length === 0) {\r\n for (let i = 0; i < previousClasses.length; i++) {\r\n removeClasses(domNode, previousClasses[i]);\r\n }\r\n }\r\n else {\r\n const newClasses = [...currentClasses];\r\n for (let i = 0; i < previousClasses.length; i++) {\r\n const previousClassName = previousClasses[i];\r\n if (previousClassName) {\r\n const classIndex = newClasses.indexOf(previousClassName);\r\n if (classIndex === -1) {\r\n removeClasses(domNode, previousClassName);\r\n }\r\n else {\r\n newClasses.splice(classIndex, 1);\r\n }\r\n }\r\n }\r\n for (let i = 0; i < newClasses.length; i++) {\r\n addClasses(domNode, newClasses[i]);\r\n }\r\n }\r\n }\r\n else {\r\n for (let i = 0; i < currentClasses.length; i++) {\r\n addClasses(domNode, currentClasses[i]);\r\n }\r\n }\r\n }\r\n else if (propName === 'focus') {\r\n focusNode(propValue, previousValue, domNode, projectionOptions);\r\n }\r\n else if (propName === 'styles') {\r\n const styleNames = Object.keys(propValue);\r\n const styleCount = styleNames.length;\r\n for (let j = 0; j < styleCount; j++) {\r\n const styleName = styleNames[j];\r\n const newStyleValue = propValue[styleName];\r\n const oldStyleValue = previousValue && previousValue[styleName];\r\n if (newStyleValue === oldStyleValue) {\r\n continue;\r\n }\r\n propertiesUpdated = true;\r\n if (newStyleValue) {\r\n checkStyleValue(newStyleValue);\r\n projectionOptions.styleApplyer(domNode, styleName, newStyleValue);\r\n }\r\n else {\r\n projectionOptions.styleApplyer(domNode, styleName, '');\r\n }\r\n }\r\n }\r\n else {\r\n if (!propValue && typeof previousValue === 'string') {\r\n propValue = '';\r\n }\r\n if (propName === 'value') {\r\n const domValue = domNode[propName];\r\n if (domValue !== propValue &&\r\n (domNode['oninput-value']\r\n ? domValue === domNode['oninput-value']\r\n : propValue !== previousValue)) {\r\n domNode[propName] = propValue;\r\n domNode['oninput-value'] = undefined;\r\n }\r\n if (propValue !== previousValue) {\r\n propertiesUpdated = true;\r\n }\r\n }\r\n else if (propName !== 'key' && propValue !== previousValue) {\r\n const type = typeof propValue;\r\n if (type === 'function' && propName.lastIndexOf('on', 0) === 0 && includesEventsAndAttributes) {\r\n updateEvent(domNode, propName.substr(2), propValue, projectionOptions, properties.bind, previousValue);\r\n }\r\n else if (type === 'string' && propName !== 'innerHTML' && includesEventsAndAttributes) {\r\n updateAttribute(domNode, propName, propValue, projectionOptions);\r\n }\r\n else if (propName === 'scrollLeft' || propName === 'scrollTop') {\r\n if (domNode[propName] !== propValue) {\r\n domNode[propName] = propValue;\r\n }\r\n }\r\n else {\r\n domNode[propName] = propValue;\r\n }\r\n propertiesUpdated = true;\r\n }\r\n }\r\n }\r\n return propertiesUpdated;\r\n}\r\nfunction findIndexOfChild(children, sameAs, start) {\r\n for (let i = start; i < children.length; i++) {\r\n if (same(children[i], sameAs)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\nexport function toParentVNode(domNode) {\r\n return {\r\n tag: '',\r\n properties: {},\r\n children: undefined,\r\n domNode,\r\n type: VNODE\r\n };\r\n}\r\nexport function toTextVNode(data) {\r\n return {\r\n tag: '',\r\n properties: {},\r\n children: undefined,\r\n text: `${data}`,\r\n domNode: undefined,\r\n type: VNODE\r\n };\r\n}\r\nfunction toInternalWNode(instance, instanceData) {\r\n return {\r\n instance,\r\n rendered: [],\r\n coreProperties: instanceData.coreProperties,\r\n children: instance.children,\r\n widgetConstructor: instance.constructor,\r\n properties: instanceData.inputProperties,\r\n type: WNODE\r\n };\r\n}\r\nexport function filterAndDecorateChildren(children, instance) {\r\n if (children === undefined) {\r\n return emptyArray;\r\n }\r\n children = Array.isArray(children) ? children : [children];\r\n for (let i = 0; i < children.length;) {\r\n const child = children[i];\r\n if (child === undefined || child === null) {\r\n children.splice(i, 1);\r\n continue;\r\n }\r\n else if (typeof child === 'string') {\r\n children[i] = toTextVNode(child);\r\n }\r\n else {\r\n if (isVNode(child)) {\r\n if (child.properties.bind === undefined) {\r\n child.properties.bind = instance;\r\n if (child.children && child.children.length > 0) {\r\n filterAndDecorateChildren(child.children, instance);\r\n }\r\n }\r\n }\r\n else {\r\n if (!child.coreProperties) {\r\n const instanceData = widgetInstanceMap.get(instance);\r\n child.coreProperties = {\r\n bind: instance,\r\n baseRegistry: instanceData.coreProperties.baseRegistry\r\n };\r\n }\r\n if (child.children && child.children.length > 0) {\r\n filterAndDecorateChildren(child.children, instance);\r\n }\r\n }\r\n }\r\n i++;\r\n }\r\n return children;\r\n}\r\nfunction nodeAdded(dnode, transitions) {\r\n if (isVNode(dnode) && dnode.properties) {\r\n const enterAnimation = dnode.properties.enterAnimation;\r\n if (enterAnimation) {\r\n if (typeof enterAnimation === 'function') {\r\n enterAnimation(dnode.domNode, dnode.properties);\r\n }\r\n else {\r\n transitions.enter(dnode.domNode, dnode.properties, enterAnimation);\r\n }\r\n }\r\n }\r\n}\r\nfunction nodeToRemove(dnode, transitions, projectionOptions) {\r\n if (isWNode(dnode)) {\r\n const rendered = dnode.rendered || emptyArray;\r\n if (dnode.instance) {\r\n const instanceData = widgetInstanceMap.get(dnode.instance);\r\n instanceData.onDetach();\r\n instanceMap.delete(dnode.instance);\r\n }\r\n for (let i = 0; i < rendered.length; i++) {\r\n nodeToRemove(rendered[i], transitions, projectionOptions);\r\n }\r\n }\r\n else {\r\n const domNode = dnode.domNode;\r\n const properties = dnode.properties;\r\n if (dnode.children && dnode.children.length > 0) {\r\n for (let i = 0; i < dnode.children.length; i++) {\r\n nodeToRemove(dnode.children[i], transitions, projectionOptions);\r\n }\r\n }\r\n const exitAnimation = properties.exitAnimation;\r\n if (properties && exitAnimation) {\r\n domNode.style.pointerEvents = 'none';\r\n const removeDomNode = function () {\r\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\r\n dnode.domNode = undefined;\r\n };\r\n if (typeof exitAnimation === 'function') {\r\n exitAnimation(domNode, removeDomNode, properties);\r\n return;\r\n }\r\n else {\r\n transitions.exit(dnode.domNode, properties, exitAnimation, removeDomNode);\r\n return;\r\n }\r\n }\r\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\r\n dnode.domNode = undefined;\r\n }\r\n}\r\nfunction checkDistinguishable(childNodes, indexToCheck, parentInstance) {\r\n const childNode = childNodes[indexToCheck];\r\n if (isVNode(childNode) && !childNode.tag) {\r\n return; // Text nodes need not be distinguishable\r\n }\r\n const { key } = childNode.properties;\r\n if (key === undefined || key === null) {\r\n for (let i = 0; i < childNodes.length; i++) {\r\n if (i !== indexToCheck) {\r\n const node = childNodes[i];\r\n if (same(node, childNode)) {\r\n let nodeIdentifier;\r\n const parentName = parentInstance.constructor.name || 'unknown';\r\n if (isWNode(childNode)) {\r\n nodeIdentifier = childNode.widgetConstructor.name || 'unknown';\r\n }\r\n else {\r\n nodeIdentifier = childNode.tag;\r\n }\r\n console.warn(`A widget (${parentName}) has had a child addded or removed, but they were not able to uniquely identified. It is recommended to provide a unique 'key' property when using the same widget or element (${nodeIdentifier}) multiple times as siblings`);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\nfunction updateChildren(parentVNode, oldChildren, newChildren, parentInstance, projectionOptions) {\r\n oldChildren = oldChildren || emptyArray;\r\n newChildren = newChildren;\r\n const oldChildrenLength = oldChildren.length;\r\n const newChildrenLength = newChildren.length;\r\n const transitions = projectionOptions.transitions;\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\r\n let oldIndex = 0;\r\n let newIndex = 0;\r\n let i;\r\n let textUpdated = false;\r\n while (newIndex < newChildrenLength) {\r\n let oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : undefined;\r\n const newChild = newChildren[newIndex];\r\n if (isVNode(newChild) && typeof newChild.deferredPropertiesCallback === 'function') {\r\n newChild.inserted = isVNode(oldChild) && oldChild.inserted;\r\n addDeferredProperties(newChild, projectionOptions);\r\n }\r\n if (oldChild !== undefined && same(oldChild, newChild)) {\r\n textUpdated = updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance) || textUpdated;\r\n oldIndex++;\r\n newIndex++;\r\n continue;\r\n }\r\n const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);\r\n const addChild = () => {\r\n let insertBeforeDomNode = undefined;\r\n let child = oldChildren[oldIndex];\r\n if (child) {\r\n let nextIndex = oldIndex + 1;\r\n let insertBeforeChildren = [child];\r\n while (insertBeforeChildren.length) {\r\n const insertBefore = insertBeforeChildren.shift();\r\n if (isWNode(insertBefore)) {\r\n if (insertBefore.rendered) {\r\n insertBeforeChildren.push(...insertBefore.rendered);\r\n }\r\n }\r\n else {\r\n if (insertBefore.domNode) {\r\n insertBeforeDomNode = insertBefore.domNode;\r\n break;\r\n }\r\n }\r\n if (insertBeforeChildren.length === 0 && oldChildren[nextIndex]) {\r\n insertBeforeChildren.push(oldChildren[nextIndex]);\r\n nextIndex++;\r\n }\r\n }\r\n }\r\n createDom(newChild, parentVNode, insertBeforeDomNode, projectionOptions, parentInstance);\r\n nodeAdded(newChild, transitions);\r\n const indexToCheck = newIndex;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(newChildren, indexToCheck, parentInstance);\r\n });\r\n };\r\n if (!oldChild || findOldIndex === -1) {\r\n addChild();\r\n newIndex++;\r\n continue;\r\n }\r\n const removeChild = () => {\r\n const indexToCheck = oldIndex;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\r\n });\r\n if (isWNode(oldChild)) {\r\n const item = instanceMap.get(oldChild.instance);\r\n if (item) {\r\n oldChild = item.dnode;\r\n }\r\n }\r\n nodeToRemove(oldChild, transitions, projectionOptions);\r\n };\r\n const findNewIndex = findIndexOfChild(newChildren, oldChild, newIndex + 1);\r\n if (findNewIndex === -1) {\r\n removeChild();\r\n oldIndex++;\r\n continue;\r\n }\r\n addChild();\r\n removeChild();\r\n oldIndex++;\r\n newIndex++;\r\n }\r\n if (oldChildrenLength > oldIndex) {\r\n // Remove child fragments\r\n for (i = oldIndex; i < oldChildrenLength; i++) {\r\n const indexToCheck = i;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\r\n });\r\n let childToRemove = oldChildren[i];\r\n if (isWNode(childToRemove)) {\r\n const item = instanceMap.get(childToRemove.instance);\r\n if (item) {\r\n childToRemove = item.dnode;\r\n }\r\n }\r\n nodeToRemove(childToRemove, transitions, projectionOptions);\r\n }\r\n }\r\n return textUpdated;\r\n}\r\nfunction addChildren(parentVNode, children, projectionOptions, parentInstance, insertBefore = undefined, childNodes) {\r\n if (children === undefined) {\r\n return;\r\n }\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectorState.merge && childNodes === undefined) {\r\n childNodes = arrayFrom(parentVNode.domNode.childNodes);\r\n }\r\n const transitions = projectionOptions.transitions;\r\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n if (isVNode(child)) {\r\n if (projectorState.merge && childNodes) {\r\n let domElement = undefined;\r\n while (child.domNode === undefined && childNodes.length > 0) {\r\n domElement = childNodes.shift();\r\n if (domElement && domElement.tagName === (child.tag.toUpperCase() || undefined)) {\r\n child.domNode = domElement;\r\n }\r\n }\r\n }\r\n createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance);\r\n }\r\n else {\r\n createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes);\r\n }\r\n nodeAdded(child, transitions);\r\n }\r\n}\r\nfunction initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions) {\r\n addChildren(dnode, dnode.children, projectionOptions, parentInstance, undefined);\r\n if (typeof dnode.deferredPropertiesCallback === 'function' && dnode.inserted === undefined) {\r\n addDeferredProperties(dnode, projectionOptions);\r\n }\r\n if (dnode.attributes && dnode.events) {\r\n updateAttributes(domNode, {}, dnode.attributes, projectionOptions);\r\n updateProperties(domNode, {}, dnode.properties, projectionOptions, false);\r\n removeOrphanedEvents(domNode, {}, dnode.events, projectionOptions, true);\r\n const events = dnode.events;\r\n Object.keys(events).forEach((event) => {\r\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind);\r\n });\r\n }\r\n else {\r\n updateProperties(domNode, {}, dnode.properties, projectionOptions);\r\n }\r\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\r\n const instanceData = widgetInstanceMap.get(parentInstance);\r\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\r\n }\r\n dnode.inserted = true;\r\n}\r\nfunction createDom(dnode, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes) {\r\n let domNode;\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (isWNode(dnode)) {\r\n let { widgetConstructor } = dnode;\r\n const parentInstanceData = widgetInstanceMap.get(parentInstance);\r\n if (!isWidgetBaseConstructor(widgetConstructor)) {\r\n const item = parentInstanceData.registry().get(widgetConstructor);\r\n if (item === null) {\r\n return;\r\n }\r\n widgetConstructor = item;\r\n }\r\n const instance = new widgetConstructor();\r\n dnode.instance = instance;\r\n const instanceData = widgetInstanceMap.get(instance);\r\n instanceData.invalidate = () => {\r\n instanceData.dirty = true;\r\n if (instanceData.rendering === false) {\r\n projectorState.renderQueue.push({ instance, depth: projectionOptions.depth });\r\n scheduleRender(projectionOptions);\r\n }\r\n };\r\n instanceData.rendering = true;\r\n instance.__setCoreProperties__(dnode.coreProperties);\r\n instance.__setChildren__(dnode.children);\r\n instance.__setProperties__(dnode.properties);\r\n const rendered = instance.__render__();\r\n instanceData.rendering = false;\r\n if (rendered) {\r\n const filteredRendered = filterAndDecorateChildren(rendered, instance);\r\n dnode.rendered = filteredRendered;\r\n addChildren(parentVNode, filteredRendered, projectionOptions, instance, insertBefore, childNodes);\r\n }\r\n instanceMap.set(instance, { dnode, parentVNode });\r\n instanceData.nodeHandler.addRoot();\r\n projectorState.afterRenderCallbacks.push(() => {\r\n instanceData.onAttach();\r\n });\r\n }\r\n else {\r\n if (projectorState.merge && projectorState.mergeElement !== undefined) {\r\n domNode = dnode.domNode = projectionOptions.mergeElement;\r\n projectorState.mergeElement = undefined;\r\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\r\n return;\r\n }\r\n const doc = parentVNode.domNode.ownerDocument;\r\n if (!dnode.tag && typeof dnode.text === 'string') {\r\n if (dnode.domNode !== undefined && parentVNode.domNode) {\r\n const newDomNode = dnode.domNode.ownerDocument.createTextNode(dnode.text);\r\n if (parentVNode.domNode === dnode.domNode.parentNode) {\r\n parentVNode.domNode.replaceChild(newDomNode, dnode.domNode);\r\n }\r\n else {\r\n parentVNode.domNode.appendChild(newDomNode);\r\n dnode.domNode.parentNode && dnode.domNode.parentNode.removeChild(dnode.domNode);\r\n }\r\n dnode.domNode = newDomNode;\r\n }\r\n else {\r\n domNode = dnode.domNode = doc.createTextNode(dnode.text);\r\n if (insertBefore !== undefined) {\r\n parentVNode.domNode.insertBefore(domNode, insertBefore);\r\n }\r\n else {\r\n parentVNode.domNode.appendChild(domNode);\r\n }\r\n }\r\n }\r\n else {\r\n if (dnode.domNode === undefined) {\r\n if (dnode.tag === 'svg') {\r\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\r\n }\r\n if (projectionOptions.namespace !== undefined) {\r\n domNode = dnode.domNode = doc.createElementNS(projectionOptions.namespace, dnode.tag);\r\n }\r\n else {\r\n domNode = dnode.domNode = dnode.domNode || doc.createElement(dnode.tag);\r\n }\r\n }\r\n else {\r\n domNode = dnode.domNode;\r\n }\r\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\r\n if (insertBefore !== undefined) {\r\n parentVNode.domNode.insertBefore(domNode, insertBefore);\r\n }\r\n else if (domNode.parentNode !== parentVNode.domNode) {\r\n parentVNode.domNode.appendChild(domNode);\r\n }\r\n }\r\n }\r\n}\r\nfunction updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance) {\r\n if (isWNode(dnode)) {\r\n const { instance } = previous;\r\n const { parentVNode, dnode: node } = instanceMap.get(instance);\r\n const previousRendered = node ? node.rendered : previous.rendered;\r\n const instanceData = widgetInstanceMap.get(instance);\r\n instanceData.rendering = true;\r\n instance.__setCoreProperties__(dnode.coreProperties);\r\n instance.__setChildren__(dnode.children);\r\n instance.__setProperties__(dnode.properties);\r\n dnode.instance = instance;\r\n if (instanceData.dirty === true) {\r\n const rendered = instance.__render__();\r\n instanceData.rendering = false;\r\n dnode.rendered = filterAndDecorateChildren(rendered, instance);\r\n updateChildren(parentVNode, previousRendered, dnode.rendered, instance, projectionOptions);\r\n }\r\n else {\r\n instanceData.rendering = false;\r\n dnode.rendered = previousRendered;\r\n }\r\n instanceMap.set(instance, { dnode, parentVNode });\r\n instanceData.nodeHandler.addRoot();\r\n }\r\n else {\r\n if (previous === dnode) {\r\n return false;\r\n }\r\n const domNode = (dnode.domNode = previous.domNode);\r\n let textUpdated = false;\r\n let updated = false;\r\n if (!dnode.tag && typeof dnode.text === 'string') {\r\n if (dnode.text !== previous.text) {\r\n const newDomNode = domNode.ownerDocument.createTextNode(dnode.text);\r\n domNode.parentNode.replaceChild(newDomNode, domNode);\r\n dnode.domNode = newDomNode;\r\n textUpdated = true;\r\n return textUpdated;\r\n }\r\n }\r\n else {\r\n if (dnode.tag && dnode.tag.lastIndexOf('svg', 0) === 0) {\r\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\r\n }\r\n if (previous.children !== dnode.children) {\r\n const children = filterAndDecorateChildren(dnode.children, parentInstance);\r\n dnode.children = children;\r\n updated =\r\n updateChildren(dnode, previous.children, children, parentInstance, projectionOptions) || updated;\r\n }\r\n const previousProperties = buildPreviousProperties(domNode, previous, dnode);\r\n if (dnode.attributes && dnode.events) {\r\n updateAttributes(domNode, previousProperties.attributes, dnode.attributes, projectionOptions);\r\n updated =\r\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions, false) || updated;\r\n removeOrphanedEvents(domNode, previousProperties.events, dnode.events, projectionOptions, true);\r\n const events = dnode.events;\r\n Object.keys(events).forEach((event) => {\r\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind, previousProperties.events[event]);\r\n });\r\n }\r\n else {\r\n updated =\r\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions) ||\r\n updated;\r\n }\r\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\r\n const instanceData = widgetInstanceMap.get(parentInstance);\r\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\r\n }\r\n }\r\n if (updated && dnode.properties && dnode.properties.updateAnimation) {\r\n dnode.properties.updateAnimation(domNode, dnode.properties, previous.properties);\r\n }\r\n }\r\n}\r\nfunction addDeferredProperties(vnode, projectionOptions) {\r\n // transfer any properties that have been passed - as these must be decorated properties\r\n vnode.decoratedDeferredProperties = vnode.properties;\r\n const properties = vnode.deferredPropertiesCallback(!!vnode.inserted);\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n vnode.properties = Object.assign({}, properties, vnode.decoratedDeferredProperties);\r\n projectorState.deferredRenderCallbacks.push(() => {\r\n const properties = Object.assign({}, vnode.deferredPropertiesCallback(!!vnode.inserted), vnode.decoratedDeferredProperties);\r\n updateProperties(vnode.domNode, vnode.properties, properties, projectionOptions);\r\n vnode.properties = properties;\r\n });\r\n}\r\nfunction runDeferredRenderCallbacks(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectorState.deferredRenderCallbacks.length) {\r\n if (projectionOptions.sync) {\r\n while (projectorState.deferredRenderCallbacks.length) {\r\n const callback = projectorState.deferredRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n }\r\n else {\r\n global.requestAnimationFrame(() => {\r\n while (projectorState.deferredRenderCallbacks.length) {\r\n const callback = projectorState.deferredRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n }\r\n}\r\nfunction runAfterRenderCallbacks(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectionOptions.sync) {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n }\r\n else {\r\n if (global.requestIdleCallback) {\r\n global.requestIdleCallback(() => {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n else {\r\n setTimeout(() => {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n }\r\n}\r\nfunction scheduleRender(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectionOptions.sync) {\r\n render(projectionOptions);\r\n }\r\n else if (projectorState.renderScheduled === undefined) {\r\n projectorState.renderScheduled = global.requestAnimationFrame(() => {\r\n render(projectionOptions);\r\n });\r\n }\r\n}\r\nfunction render(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectorState.renderScheduled = undefined;\r\n const renderQueue = projectorState.renderQueue;\r\n const renders = [...renderQueue];\r\n projectorState.renderQueue = [];\r\n renders.sort((a, b) => a.depth - b.depth);\r\n const previouslyRendered = [];\r\n while (renders.length) {\r\n const { instance } = renders.shift();\r\n if (instanceMap.has(instance) && previouslyRendered.indexOf(instance) === -1) {\r\n previouslyRendered.push(instance);\r\n const { parentVNode, dnode } = instanceMap.get(instance);\r\n const instanceData = widgetInstanceMap.get(instance);\r\n updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance);\r\n }\r\n }\r\n runAfterRenderCallbacks(projectionOptions);\r\n runDeferredRenderCallbacks(projectionOptions);\r\n}\r\nexport const dom = {\r\n append: function (parentNode, instance, projectionOptions = {}) {\r\n const instanceData = widgetInstanceMap.get(instance);\r\n const finalProjectorOptions = getProjectionOptions(projectionOptions, instance);\r\n const projectorState = {\r\n afterRenderCallbacks: [],\r\n deferredRenderCallbacks: [],\r\n nodeMap: new WeakMap(),\r\n renderScheduled: undefined,\r\n renderQueue: [],\r\n merge: projectionOptions.merge || false,\r\n mergeElement: projectionOptions.mergeElement\r\n };\r\n projectorStateMap.set(instance, projectorState);\r\n finalProjectorOptions.rootNode = parentNode;\r\n const parentVNode = toParentVNode(finalProjectorOptions.rootNode);\r\n const node = toInternalWNode(instance, instanceData);\r\n instanceMap.set(instance, { dnode: node, parentVNode });\r\n instanceData.invalidate = () => {\r\n instanceData.dirty = true;\r\n if (instanceData.rendering === false) {\r\n projectorState.renderQueue.push({ instance, depth: finalProjectorOptions.depth });\r\n scheduleRender(finalProjectorOptions);\r\n }\r\n };\r\n updateDom(node, node, finalProjectorOptions, parentVNode, instance);\r\n projectorState.afterRenderCallbacks.push(() => {\r\n instanceData.onAttach();\r\n });\r\n runDeferredRenderCallbacks(finalProjectorOptions);\r\n runAfterRenderCallbacks(finalProjectorOptions);\r\n return {\r\n domNode: finalProjectorOptions.rootNode\r\n };\r\n },\r\n create: function (instance, projectionOptions) {\r\n return this.append(document.createElement('div'), instance, projectionOptions);\r\n },\r\n merge: function (element, instance, projectionOptions = {}) {\r\n projectionOptions.merge = true;\r\n projectionOptions.mergeElement = element;\r\n const projection = this.append(element.parentNode, instance, projectionOptions);\r\n const projectorState = projectorStateMap.get(instance);\r\n projectorState.merge = false;\r\n return projection;\r\n }\r\n};\r\n//# sourceMappingURL=vdom.mjs.map" + "source": "import global from '../shim/global';\r\nimport { from as arrayFrom } from '../shim/array';\r\nimport { isWNode, isVNode, isDomVNode, VNODE, WNODE } from './d';\r\nimport { isWidgetBaseConstructor } from './Registry';\r\nimport WeakMap from '../shim/WeakMap';\r\nconst NAMESPACE_W3 = 'http://www.w3.org/';\r\nconst NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg';\r\nconst NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink';\r\nconst emptyArray = [];\r\nconst nodeOperations = ['focus', 'blur', 'scrollIntoView', 'click'];\r\nexport const widgetInstanceMap = new WeakMap();\r\nconst instanceMap = new WeakMap();\r\nconst nextSiblingMap = new WeakMap();\r\nconst projectorStateMap = new WeakMap();\r\nfunction same(dnode1, dnode2) {\r\n if (isVNode(dnode1) && isVNode(dnode2)) {\r\n if (isDomVNode(dnode1) || isDomVNode(dnode2)) {\r\n if (dnode1.domNode !== dnode2.domNode) {\r\n return false;\r\n }\r\n }\r\n if (dnode1.tag !== dnode2.tag) {\r\n return false;\r\n }\r\n if (dnode1.properties.key !== dnode2.properties.key) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n else if (isWNode(dnode1) && isWNode(dnode2)) {\r\n if (dnode1.instance === undefined && typeof dnode2.widgetConstructor === 'string') {\r\n return false;\r\n }\r\n if (dnode1.widgetConstructor !== dnode2.widgetConstructor) {\r\n return false;\r\n }\r\n if (dnode1.properties.key !== dnode2.properties.key) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n return false;\r\n}\r\nconst missingTransition = function () {\r\n throw new Error('Provide a transitions object to the projectionOptions to do animations');\r\n};\r\nfunction getProjectionOptions(projectorOptions, projectorInstance) {\r\n const defaults = {\r\n namespace: undefined,\r\n styleApplyer: function (domNode, styleName, value) {\r\n domNode.style[styleName] = value;\r\n },\r\n transitions: {\r\n enter: missingTransition,\r\n exit: missingTransition\r\n },\r\n depth: 0,\r\n merge: false,\r\n sync: false,\r\n projectorInstance\r\n };\r\n return Object.assign({}, defaults, projectorOptions);\r\n}\r\nfunction checkStyleValue(styleValue) {\r\n if (typeof styleValue !== 'string') {\r\n throw new Error('Style values must be strings');\r\n }\r\n}\r\nfunction updateEvent(domNode, eventName, currentValue, projectionOptions, bind, previousValue) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n const eventMap = projectorState.nodeMap.get(domNode) || new WeakMap();\r\n if (previousValue) {\r\n const previousEvent = eventMap.get(previousValue);\r\n domNode.removeEventListener(eventName, previousEvent);\r\n }\r\n let callback = currentValue.bind(bind);\r\n if (eventName === 'input') {\r\n callback = function (evt) {\r\n currentValue.call(this, evt);\r\n evt.target['oninput-value'] = evt.target.value;\r\n }.bind(bind);\r\n }\r\n domNode.addEventListener(eventName, callback);\r\n eventMap.set(currentValue, callback);\r\n projectorState.nodeMap.set(domNode, eventMap);\r\n}\r\nfunction addClasses(domNode, classes) {\r\n if (classes) {\r\n const classNames = classes.split(' ');\r\n for (let i = 0; i < classNames.length; i++) {\r\n domNode.classList.add(classNames[i]);\r\n }\r\n }\r\n}\r\nfunction removeClasses(domNode, classes) {\r\n if (classes) {\r\n const classNames = classes.split(' ');\r\n for (let i = 0; i < classNames.length; i++) {\r\n domNode.classList.remove(classNames[i]);\r\n }\r\n }\r\n}\r\nfunction buildPreviousProperties(domNode, previous, current) {\r\n const { diffType, properties, attributes } = current;\r\n if (!diffType || diffType === 'vdom') {\r\n return { properties: previous.properties, attributes: previous.attributes, events: previous.events };\r\n }\r\n else if (diffType === 'none') {\r\n return { properties: {}, attributes: previous.attributes ? {} : undefined, events: previous.events };\r\n }\r\n let newProperties = {\r\n properties: {}\r\n };\r\n if (attributes) {\r\n newProperties.attributes = {};\r\n newProperties.events = previous.events;\r\n Object.keys(properties).forEach((propName) => {\r\n newProperties.properties[propName] = domNode[propName];\r\n });\r\n Object.keys(attributes).forEach((attrName) => {\r\n newProperties.attributes[attrName] = domNode.getAttribute(attrName);\r\n });\r\n return newProperties;\r\n }\r\n newProperties.properties = Object.keys(properties).reduce((props, property) => {\r\n props[property] = domNode.getAttribute(property) || domNode[property];\r\n return props;\r\n }, {});\r\n return newProperties;\r\n}\r\nfunction nodeOperation(propName, propValue, previousValue, domNode, projectionOptions) {\r\n let result;\r\n if (typeof propValue === 'function') {\r\n result = propValue();\r\n }\r\n else {\r\n result = propValue && !previousValue;\r\n }\r\n if (result === true) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectorState.deferredRenderCallbacks.push(() => {\r\n domNode[propName]();\r\n });\r\n }\r\n}\r\nfunction removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions, onlyEvents = false) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n const eventMap = projectorState.nodeMap.get(domNode);\r\n if (eventMap) {\r\n Object.keys(previousProperties).forEach((propName) => {\r\n const isEvent = propName.substr(0, 2) === 'on' || onlyEvents;\r\n const eventName = onlyEvents ? propName : propName.substr(2);\r\n if (isEvent && !properties[propName]) {\r\n const eventCallback = eventMap.get(previousProperties[propName]);\r\n if (eventCallback) {\r\n domNode.removeEventListener(eventName, eventCallback);\r\n }\r\n }\r\n });\r\n }\r\n}\r\nfunction updateAttribute(domNode, attrName, attrValue, projectionOptions) {\r\n if (projectionOptions.namespace === NAMESPACE_SVG && attrName === 'href') {\r\n domNode.setAttributeNS(NAMESPACE_XLINK, attrName, attrValue);\r\n }\r\n else if ((attrName === 'role' && attrValue === '') || attrValue === undefined) {\r\n domNode.removeAttribute(attrName);\r\n }\r\n else {\r\n domNode.setAttribute(attrName, attrValue);\r\n }\r\n}\r\nfunction updateAttributes(domNode, previousAttributes, attributes, projectionOptions) {\r\n const attrNames = Object.keys(attributes);\r\n const attrCount = attrNames.length;\r\n for (let i = 0; i < attrCount; i++) {\r\n const attrName = attrNames[i];\r\n const attrValue = attributes[attrName];\r\n const previousAttrValue = previousAttributes[attrName];\r\n if (attrValue !== previousAttrValue) {\r\n updateAttribute(domNode, attrName, attrValue, projectionOptions);\r\n }\r\n }\r\n}\r\nfunction updateProperties(domNode, previousProperties, properties, projectionOptions, includesEventsAndAttributes = true) {\r\n let propertiesUpdated = false;\r\n const propNames = Object.keys(properties);\r\n const propCount = propNames.length;\r\n if (propNames.indexOf('classes') === -1 && previousProperties.classes) {\r\n if (Array.isArray(previousProperties.classes)) {\r\n for (let i = 0; i < previousProperties.classes.length; i++) {\r\n removeClasses(domNode, previousProperties.classes[i]);\r\n }\r\n }\r\n else {\r\n removeClasses(domNode, previousProperties.classes);\r\n }\r\n }\r\n includesEventsAndAttributes && removeOrphanedEvents(domNode, previousProperties, properties, projectionOptions);\r\n for (let i = 0; i < propCount; i++) {\r\n const propName = propNames[i];\r\n let propValue = properties[propName];\r\n const previousValue = previousProperties[propName];\r\n if (propName === 'classes') {\r\n const previousClasses = Array.isArray(previousValue) ? previousValue : [previousValue];\r\n const currentClasses = Array.isArray(propValue) ? propValue : [propValue];\r\n if (previousClasses && previousClasses.length > 0) {\r\n if (!propValue || propValue.length === 0) {\r\n for (let i = 0; i < previousClasses.length; i++) {\r\n removeClasses(domNode, previousClasses[i]);\r\n }\r\n }\r\n else {\r\n const newClasses = [...currentClasses];\r\n for (let i = 0; i < previousClasses.length; i++) {\r\n const previousClassName = previousClasses[i];\r\n if (previousClassName) {\r\n const classIndex = newClasses.indexOf(previousClassName);\r\n if (classIndex === -1) {\r\n removeClasses(domNode, previousClassName);\r\n }\r\n else {\r\n newClasses.splice(classIndex, 1);\r\n }\r\n }\r\n }\r\n for (let i = 0; i < newClasses.length; i++) {\r\n addClasses(domNode, newClasses[i]);\r\n }\r\n }\r\n }\r\n else {\r\n for (let i = 0; i < currentClasses.length; i++) {\r\n addClasses(domNode, currentClasses[i]);\r\n }\r\n }\r\n }\r\n else if (nodeOperations.indexOf(propName) !== -1) {\r\n nodeOperation(propName, propValue, previousValue, domNode, projectionOptions);\r\n }\r\n else if (propName === 'styles') {\r\n const styleNames = Object.keys(propValue);\r\n const styleCount = styleNames.length;\r\n for (let j = 0; j < styleCount; j++) {\r\n const styleName = styleNames[j];\r\n const newStyleValue = propValue[styleName];\r\n const oldStyleValue = previousValue && previousValue[styleName];\r\n if (newStyleValue === oldStyleValue) {\r\n continue;\r\n }\r\n propertiesUpdated = true;\r\n if (newStyleValue) {\r\n checkStyleValue(newStyleValue);\r\n projectionOptions.styleApplyer(domNode, styleName, newStyleValue);\r\n }\r\n else {\r\n projectionOptions.styleApplyer(domNode, styleName, '');\r\n }\r\n }\r\n }\r\n else {\r\n if (!propValue && typeof previousValue === 'string') {\r\n propValue = '';\r\n }\r\n if (propName === 'value') {\r\n const domValue = domNode[propName];\r\n if (domValue !== propValue &&\r\n (domNode['oninput-value']\r\n ? domValue === domNode['oninput-value']\r\n : propValue !== previousValue)) {\r\n domNode[propName] = propValue;\r\n domNode['oninput-value'] = undefined;\r\n }\r\n if (propValue !== previousValue) {\r\n propertiesUpdated = true;\r\n }\r\n }\r\n else if (propName !== 'key' && propValue !== previousValue) {\r\n const type = typeof propValue;\r\n if (type === 'function' && propName.lastIndexOf('on', 0) === 0 && includesEventsAndAttributes) {\r\n updateEvent(domNode, propName.substr(2), propValue, projectionOptions, properties.bind, previousValue);\r\n }\r\n else if (type === 'string' && propName !== 'innerHTML' && includesEventsAndAttributes) {\r\n updateAttribute(domNode, propName, propValue, projectionOptions);\r\n }\r\n else if (propName === 'scrollLeft' || propName === 'scrollTop') {\r\n if (domNode[propName] !== propValue) {\r\n domNode[propName] = propValue;\r\n }\r\n }\r\n else {\r\n domNode[propName] = propValue;\r\n }\r\n propertiesUpdated = true;\r\n }\r\n }\r\n }\r\n return propertiesUpdated;\r\n}\r\nfunction findIndexOfChild(children, sameAs, start) {\r\n for (let i = start; i < children.length; i++) {\r\n if (same(children[i], sameAs)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\nexport function toParentVNode(domNode) {\r\n return {\r\n tag: '',\r\n properties: {},\r\n children: undefined,\r\n domNode,\r\n type: VNODE\r\n };\r\n}\r\nexport function toTextVNode(data) {\r\n return {\r\n tag: '',\r\n properties: {},\r\n children: undefined,\r\n text: `${data}`,\r\n domNode: undefined,\r\n type: VNODE\r\n };\r\n}\r\nfunction toInternalWNode(instance, instanceData) {\r\n return {\r\n instance,\r\n rendered: [],\r\n coreProperties: instanceData.coreProperties,\r\n children: instance.children,\r\n widgetConstructor: instance.constructor,\r\n properties: instanceData.inputProperties,\r\n type: WNODE\r\n };\r\n}\r\nexport function filterAndDecorateChildren(children, instance) {\r\n if (children === undefined) {\r\n return emptyArray;\r\n }\r\n children = Array.isArray(children) ? children : [children];\r\n for (let i = 0; i < children.length;) {\r\n const child = children[i];\r\n if (child === undefined || child === null) {\r\n children.splice(i, 1);\r\n continue;\r\n }\r\n else if (typeof child === 'string') {\r\n children[i] = toTextVNode(child);\r\n }\r\n else {\r\n if (isVNode(child)) {\r\n if (child.properties.bind === undefined) {\r\n child.properties.bind = instance;\r\n if (child.children && child.children.length > 0) {\r\n filterAndDecorateChildren(child.children, instance);\r\n }\r\n }\r\n }\r\n else {\r\n if (!child.coreProperties) {\r\n const instanceData = widgetInstanceMap.get(instance);\r\n child.coreProperties = {\r\n bind: instance,\r\n baseRegistry: instanceData.coreProperties.baseRegistry\r\n };\r\n }\r\n if (child.children && child.children.length > 0) {\r\n filterAndDecorateChildren(child.children, instance);\r\n }\r\n }\r\n }\r\n i++;\r\n }\r\n return children;\r\n}\r\nfunction nodeAdded(dnode, transitions) {\r\n if (isVNode(dnode) && dnode.properties) {\r\n const enterAnimation = dnode.properties.enterAnimation;\r\n if (enterAnimation) {\r\n if (typeof enterAnimation === 'function') {\r\n enterAnimation(dnode.domNode, dnode.properties);\r\n }\r\n else {\r\n transitions.enter(dnode.domNode, dnode.properties, enterAnimation);\r\n }\r\n }\r\n }\r\n}\r\nfunction nodeToRemove(dnode, transitions, projectionOptions) {\r\n if (isWNode(dnode)) {\r\n const item = instanceMap.get(dnode.instance);\r\n const rendered = (item ? item.dnode.rendered : dnode.rendered) || emptyArray;\r\n if (dnode.instance) {\r\n const instanceData = widgetInstanceMap.get(dnode.instance);\r\n instanceData.onDetach();\r\n instanceMap.delete(dnode.instance);\r\n }\r\n for (let i = 0; i < rendered.length; i++) {\r\n nodeToRemove(rendered[i], transitions, projectionOptions);\r\n }\r\n }\r\n else {\r\n const domNode = dnode.domNode;\r\n const properties = dnode.properties;\r\n if (dnode.children && dnode.children.length > 0) {\r\n for (let i = 0; i < dnode.children.length; i++) {\r\n nodeToRemove(dnode.children[i], transitions, projectionOptions);\r\n }\r\n }\r\n const exitAnimation = properties.exitAnimation;\r\n if (properties && exitAnimation) {\r\n domNode.style.pointerEvents = 'none';\r\n const removeDomNode = function () {\r\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\r\n dnode.domNode = undefined;\r\n };\r\n if (typeof exitAnimation === 'function') {\r\n exitAnimation(domNode, removeDomNode, properties);\r\n return;\r\n }\r\n else {\r\n transitions.exit(dnode.domNode, properties, exitAnimation, removeDomNode);\r\n return;\r\n }\r\n }\r\n domNode && domNode.parentNode && domNode.parentNode.removeChild(domNode);\r\n dnode.domNode = undefined;\r\n }\r\n}\r\nfunction checkDistinguishable(childNodes, indexToCheck, parentInstance) {\r\n const childNode = childNodes[indexToCheck];\r\n if (isVNode(childNode) && !childNode.tag) {\r\n return; // Text nodes need not be distinguishable\r\n }\r\n const { key } = childNode.properties;\r\n if (key === undefined || key === null) {\r\n for (let i = 0; i < childNodes.length; i++) {\r\n if (i !== indexToCheck) {\r\n const node = childNodes[i];\r\n if (same(node, childNode)) {\r\n let nodeIdentifier;\r\n const parentName = parentInstance.constructor.name || 'unknown';\r\n if (isWNode(childNode)) {\r\n nodeIdentifier = childNode.widgetConstructor.name || 'unknown';\r\n }\r\n else {\r\n nodeIdentifier = childNode.tag;\r\n }\r\n console.warn(`A widget (${parentName}) has had a child addded or removed, but they were not able to uniquely identified. It is recommended to provide a unique 'key' property when using the same widget or element (${nodeIdentifier}) multiple times as siblings`);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\nfunction updateChildren(parentVNode, siblings, oldChildren, newChildren, parentInstance, projectionOptions) {\r\n oldChildren = oldChildren || emptyArray;\r\n newChildren = newChildren;\r\n const oldChildrenLength = oldChildren.length;\r\n const newChildrenLength = newChildren.length;\r\n const transitions = projectionOptions.transitions;\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\r\n let oldIndex = 0;\r\n let newIndex = 0;\r\n let i;\r\n let textUpdated = false;\r\n while (newIndex < newChildrenLength) {\r\n let oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : undefined;\r\n const newChild = newChildren[newIndex];\r\n if (isVNode(newChild) && typeof newChild.deferredPropertiesCallback === 'function') {\r\n newChild.inserted = isVNode(oldChild) && oldChild.inserted;\r\n addDeferredProperties(newChild, projectionOptions);\r\n }\r\n if (oldChild !== undefined && same(oldChild, newChild)) {\r\n oldIndex++;\r\n newIndex++;\r\n textUpdated =\r\n updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance, oldChildren.slice(oldIndex), newChildren.slice(newIndex)) || textUpdated;\r\n continue;\r\n }\r\n const findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);\r\n const addChild = () => {\r\n let insertBeforeDomNode = undefined;\r\n let childrenArray = oldChildren;\r\n let nextIndex = oldIndex + 1;\r\n let child = oldChildren[oldIndex];\r\n if (!child) {\r\n child = siblings[0];\r\n nextIndex = 1;\r\n childrenArray = siblings;\r\n }\r\n if (child) {\r\n let insertBeforeChildren = [child];\r\n while (insertBeforeChildren.length) {\r\n const insertBefore = insertBeforeChildren.shift();\r\n if (isWNode(insertBefore)) {\r\n const item = instanceMap.get(insertBefore.instance);\r\n if (item && item.dnode.rendered) {\r\n insertBeforeChildren.push(...item.dnode.rendered);\r\n }\r\n }\r\n else {\r\n if (insertBefore.domNode) {\r\n if (insertBefore.domNode.parentElement !== parentVNode.domNode) {\r\n break;\r\n }\r\n insertBeforeDomNode = insertBefore.domNode;\r\n break;\r\n }\r\n }\r\n if (insertBeforeChildren.length === 0 && childrenArray[nextIndex]) {\r\n insertBeforeChildren.push(childrenArray[nextIndex]);\r\n nextIndex++;\r\n }\r\n }\r\n }\r\n createDom(newChild, parentVNode, newChildren.slice(newIndex + 1), insertBeforeDomNode, projectionOptions, parentInstance);\r\n nodeAdded(newChild, transitions);\r\n const indexToCheck = newIndex;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(newChildren, indexToCheck, parentInstance);\r\n });\r\n };\r\n if (!oldChild || findOldIndex === -1) {\r\n addChild();\r\n newIndex++;\r\n continue;\r\n }\r\n const removeChild = () => {\r\n const indexToCheck = oldIndex;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\r\n });\r\n if (isWNode(oldChild)) {\r\n const item = instanceMap.get(oldChild.instance);\r\n if (item) {\r\n oldChild = item.dnode;\r\n }\r\n }\r\n nodeToRemove(oldChild, transitions, projectionOptions);\r\n };\r\n const findNewIndex = findIndexOfChild(newChildren, oldChild, newIndex + 1);\r\n if (findNewIndex === -1) {\r\n removeChild();\r\n oldIndex++;\r\n continue;\r\n }\r\n addChild();\r\n removeChild();\r\n oldIndex++;\r\n newIndex++;\r\n }\r\n if (oldChildrenLength > oldIndex) {\r\n // Remove child fragments\r\n for (i = oldIndex; i < oldChildrenLength; i++) {\r\n const indexToCheck = i;\r\n projectorState.afterRenderCallbacks.push(() => {\r\n checkDistinguishable(oldChildren, indexToCheck, parentInstance);\r\n });\r\n let childToRemove = oldChildren[i];\r\n if (isWNode(childToRemove)) {\r\n const item = instanceMap.get(childToRemove.instance);\r\n if (item) {\r\n childToRemove = item.dnode;\r\n }\r\n }\r\n nodeToRemove(childToRemove, transitions, projectionOptions);\r\n }\r\n }\r\n return textUpdated;\r\n}\r\nfunction addChildren(parentVNode, children, projectionOptions, parentInstance, insertBefore = undefined, childNodes) {\r\n if (children === undefined) {\r\n return;\r\n }\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectorState.merge && childNodes === undefined) {\r\n childNodes = arrayFrom(parentVNode.domNode.childNodes);\r\n }\r\n const transitions = projectionOptions.transitions;\r\n projectionOptions = Object.assign({}, projectionOptions, { depth: projectionOptions.depth + 1 });\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n const nextSiblings = children.slice(i + 1);\r\n if (isVNode(child)) {\r\n if (projectorState.merge && childNodes) {\r\n let domElement = undefined;\r\n while (child.domNode === undefined && childNodes.length > 0) {\r\n domElement = childNodes.shift();\r\n if (domElement && domElement.tagName === (child.tag.toUpperCase() || undefined)) {\r\n child.domNode = domElement;\r\n }\r\n }\r\n }\r\n createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance);\r\n }\r\n else {\r\n createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes);\r\n }\r\n nodeAdded(child, transitions);\r\n }\r\n}\r\nfunction initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions) {\r\n addChildren(dnode, dnode.children, projectionOptions, parentInstance, undefined);\r\n if (typeof dnode.deferredPropertiesCallback === 'function' && dnode.inserted === undefined) {\r\n addDeferredProperties(dnode, projectionOptions);\r\n }\r\n if (dnode.attributes && dnode.events) {\r\n updateAttributes(domNode, {}, dnode.attributes, projectionOptions);\r\n updateProperties(domNode, {}, dnode.properties, projectionOptions, false);\r\n removeOrphanedEvents(domNode, {}, dnode.events, projectionOptions, true);\r\n const events = dnode.events;\r\n Object.keys(events).forEach((event) => {\r\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind);\r\n });\r\n }\r\n else {\r\n updateProperties(domNode, {}, dnode.properties, projectionOptions);\r\n }\r\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\r\n const instanceData = widgetInstanceMap.get(parentInstance);\r\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\r\n }\r\n dnode.inserted = true;\r\n}\r\nfunction createDom(dnode, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes) {\r\n let domNode;\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (isWNode(dnode)) {\r\n let { widgetConstructor } = dnode;\r\n const parentInstanceData = widgetInstanceMap.get(parentInstance);\r\n if (!isWidgetBaseConstructor(widgetConstructor)) {\r\n const item = parentInstanceData.registry().get(widgetConstructor);\r\n if (item === null) {\r\n return;\r\n }\r\n widgetConstructor = item;\r\n }\r\n const instance = new widgetConstructor();\r\n dnode.instance = instance;\r\n nextSiblingMap.set(instance, nextSiblings);\r\n const instanceData = widgetInstanceMap.get(instance);\r\n instanceData.invalidate = () => {\r\n instanceData.dirty = true;\r\n if (instanceData.rendering === false) {\r\n projectorState.renderQueue.push({ instance, depth: projectionOptions.depth });\r\n scheduleRender(projectionOptions);\r\n }\r\n };\r\n instanceData.rendering = true;\r\n instance.__setCoreProperties__(dnode.coreProperties);\r\n instance.__setChildren__(dnode.children);\r\n instance.__setProperties__(dnode.properties);\r\n const rendered = instance.__render__();\r\n instanceData.rendering = false;\r\n if (rendered) {\r\n const filteredRendered = filterAndDecorateChildren(rendered, instance);\r\n dnode.rendered = filteredRendered;\r\n addChildren(parentVNode, filteredRendered, projectionOptions, instance, insertBefore, childNodes);\r\n }\r\n instanceMap.set(instance, { dnode, parentVNode });\r\n instanceData.nodeHandler.addRoot();\r\n projectorState.afterRenderCallbacks.push(() => {\r\n instanceData.onAttach();\r\n });\r\n }\r\n else {\r\n if (projectorState.merge && projectorState.mergeElement !== undefined) {\r\n domNode = dnode.domNode = projectionOptions.mergeElement;\r\n projectorState.mergeElement = undefined;\r\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\r\n return;\r\n }\r\n const doc = parentVNode.domNode.ownerDocument;\r\n if (!dnode.tag && typeof dnode.text === 'string') {\r\n if (dnode.domNode !== undefined && parentVNode.domNode) {\r\n const newDomNode = dnode.domNode.ownerDocument.createTextNode(dnode.text);\r\n if (parentVNode.domNode === dnode.domNode.parentNode) {\r\n parentVNode.domNode.replaceChild(newDomNode, dnode.domNode);\r\n }\r\n else {\r\n parentVNode.domNode.appendChild(newDomNode);\r\n dnode.domNode.parentNode && dnode.domNode.parentNode.removeChild(dnode.domNode);\r\n }\r\n dnode.domNode = newDomNode;\r\n }\r\n else {\r\n domNode = dnode.domNode = doc.createTextNode(dnode.text);\r\n if (insertBefore !== undefined) {\r\n parentVNode.domNode.insertBefore(domNode, insertBefore);\r\n }\r\n else {\r\n parentVNode.domNode.appendChild(domNode);\r\n }\r\n }\r\n }\r\n else {\r\n if (dnode.domNode === undefined) {\r\n if (dnode.tag === 'svg') {\r\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\r\n }\r\n if (projectionOptions.namespace !== undefined) {\r\n domNode = dnode.domNode = doc.createElementNS(projectionOptions.namespace, dnode.tag);\r\n }\r\n else {\r\n domNode = dnode.domNode = dnode.domNode || doc.createElement(dnode.tag);\r\n }\r\n }\r\n else {\r\n domNode = dnode.domNode;\r\n }\r\n initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOptions);\r\n if (insertBefore !== undefined) {\r\n parentVNode.domNode.insertBefore(domNode, insertBefore);\r\n }\r\n else if (domNode.parentNode !== parentVNode.domNode) {\r\n parentVNode.domNode.appendChild(domNode);\r\n }\r\n }\r\n }\r\n}\r\nfunction updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance, oldNextSiblings, nextSiblings) {\r\n if (isWNode(dnode)) {\r\n const { instance } = previous;\r\n const { parentVNode, dnode: node } = instanceMap.get(instance);\r\n const previousRendered = node ? node.rendered : previous.rendered;\r\n const instanceData = widgetInstanceMap.get(instance);\r\n instanceData.rendering = true;\r\n instance.__setCoreProperties__(dnode.coreProperties);\r\n instance.__setChildren__(dnode.children);\r\n instance.__setProperties__(dnode.properties);\r\n nextSiblingMap.set(instance, nextSiblings);\r\n dnode.instance = instance;\r\n if (instanceData.dirty === true) {\r\n const rendered = instance.__render__();\r\n instanceData.rendering = false;\r\n dnode.rendered = filterAndDecorateChildren(rendered, instance);\r\n updateChildren(parentVNode, oldNextSiblings, previousRendered, dnode.rendered, instance, projectionOptions);\r\n }\r\n else {\r\n instanceData.rendering = false;\r\n dnode.rendered = previousRendered;\r\n }\r\n instanceMap.set(instance, { dnode, parentVNode });\r\n instanceData.nodeHandler.addRoot();\r\n }\r\n else {\r\n if (previous === dnode) {\r\n return false;\r\n }\r\n const domNode = (dnode.domNode = previous.domNode);\r\n let textUpdated = false;\r\n let updated = false;\r\n if (!dnode.tag && typeof dnode.text === 'string') {\r\n if (dnode.text !== previous.text) {\r\n const newDomNode = domNode.ownerDocument.createTextNode(dnode.text);\r\n domNode.parentNode.replaceChild(newDomNode, domNode);\r\n dnode.domNode = newDomNode;\r\n textUpdated = true;\r\n return textUpdated;\r\n }\r\n }\r\n else {\r\n if (dnode.tag && dnode.tag.lastIndexOf('svg', 0) === 0) {\r\n projectionOptions = Object.assign({}, projectionOptions, { namespace: NAMESPACE_SVG });\r\n }\r\n if (previous.children !== dnode.children) {\r\n const children = filterAndDecorateChildren(dnode.children, parentInstance);\r\n dnode.children = children;\r\n updated =\r\n updateChildren(dnode, oldNextSiblings, previous.children, children, parentInstance, projectionOptions) || updated;\r\n }\r\n const previousProperties = buildPreviousProperties(domNode, previous, dnode);\r\n if (dnode.attributes && dnode.events) {\r\n updateAttributes(domNode, previousProperties.attributes, dnode.attributes, projectionOptions);\r\n updated =\r\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions, false) || updated;\r\n removeOrphanedEvents(domNode, previousProperties.events, dnode.events, projectionOptions, true);\r\n const events = dnode.events;\r\n Object.keys(events).forEach((event) => {\r\n updateEvent(domNode, event, events[event], projectionOptions, dnode.properties.bind, previousProperties.events[event]);\r\n });\r\n }\r\n else {\r\n updated =\r\n updateProperties(domNode, previousProperties.properties, dnode.properties, projectionOptions) ||\r\n updated;\r\n }\r\n if (dnode.properties.key !== null && dnode.properties.key !== undefined) {\r\n const instanceData = widgetInstanceMap.get(parentInstance);\r\n instanceData.nodeHandler.add(domNode, `${dnode.properties.key}`);\r\n }\r\n }\r\n if (updated && dnode.properties && dnode.properties.updateAnimation) {\r\n dnode.properties.updateAnimation(domNode, dnode.properties, previous.properties);\r\n }\r\n }\r\n}\r\nfunction addDeferredProperties(vnode, projectionOptions) {\r\n // transfer any properties that have been passed - as these must be decorated properties\r\n vnode.decoratedDeferredProperties = vnode.properties;\r\n const properties = vnode.deferredPropertiesCallback(!!vnode.inserted);\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n vnode.properties = Object.assign({}, properties, vnode.decoratedDeferredProperties);\r\n projectorState.deferredRenderCallbacks.push(() => {\r\n const properties = Object.assign({}, vnode.deferredPropertiesCallback(!!vnode.inserted), vnode.decoratedDeferredProperties);\r\n updateProperties(vnode.domNode, vnode.properties, properties, projectionOptions);\r\n vnode.properties = properties;\r\n });\r\n}\r\nfunction runDeferredRenderCallbacks(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectorState.deferredRenderCallbacks.length) {\r\n if (projectionOptions.sync) {\r\n while (projectorState.deferredRenderCallbacks.length) {\r\n const callback = projectorState.deferredRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n }\r\n else {\r\n global.requestAnimationFrame(() => {\r\n while (projectorState.deferredRenderCallbacks.length) {\r\n const callback = projectorState.deferredRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n }\r\n}\r\nfunction runAfterRenderCallbacks(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectionOptions.sync) {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n }\r\n else {\r\n if (global.requestIdleCallback) {\r\n global.requestIdleCallback(() => {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n else {\r\n setTimeout(() => {\r\n while (projectorState.afterRenderCallbacks.length) {\r\n const callback = projectorState.afterRenderCallbacks.shift();\r\n callback && callback();\r\n }\r\n });\r\n }\r\n }\r\n}\r\nfunction scheduleRender(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n if (projectionOptions.sync) {\r\n render(projectionOptions);\r\n }\r\n else if (projectorState.renderScheduled === undefined) {\r\n projectorState.renderScheduled = global.requestAnimationFrame(() => {\r\n render(projectionOptions);\r\n });\r\n }\r\n}\r\nfunction render(projectionOptions) {\r\n const projectorState = projectorStateMap.get(projectionOptions.projectorInstance);\r\n projectorState.renderScheduled = undefined;\r\n const renderQueue = projectorState.renderQueue;\r\n const renders = [...renderQueue];\r\n projectorState.renderQueue = [];\r\n renders.sort((a, b) => a.depth - b.depth);\r\n const previouslyRendered = [];\r\n while (renders.length) {\r\n const { instance } = renders.shift();\r\n if (instanceMap.has(instance) && previouslyRendered.indexOf(instance) === -1) {\r\n previouslyRendered.push(instance);\r\n const { parentVNode, dnode } = instanceMap.get(instance);\r\n const instanceData = widgetInstanceMap.get(instance);\r\n const nextSiblings = nextSiblingMap.get(instance);\r\n updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance, nextSiblings, nextSiblings);\r\n }\r\n }\r\n runAfterRenderCallbacks(projectionOptions);\r\n runDeferredRenderCallbacks(projectionOptions);\r\n}\r\nexport const dom = {\r\n append: function (parentNode, instance, projectionOptions = {}) {\r\n const instanceData = widgetInstanceMap.get(instance);\r\n const finalProjectorOptions = getProjectionOptions(projectionOptions, instance);\r\n const projectorState = {\r\n afterRenderCallbacks: [],\r\n deferredRenderCallbacks: [],\r\n nodeMap: new WeakMap(),\r\n renderScheduled: undefined,\r\n renderQueue: [],\r\n merge: projectionOptions.merge || false,\r\n mergeElement: projectionOptions.mergeElement\r\n };\r\n projectorStateMap.set(instance, projectorState);\r\n finalProjectorOptions.rootNode = parentNode;\r\n const parentVNode = toParentVNode(finalProjectorOptions.rootNode);\r\n const node = toInternalWNode(instance, instanceData);\r\n instanceMap.set(instance, { dnode: node, parentVNode });\r\n instanceData.invalidate = () => {\r\n instanceData.dirty = true;\r\n if (instanceData.rendering === false) {\r\n projectorState.renderQueue.push({ instance, depth: finalProjectorOptions.depth });\r\n scheduleRender(finalProjectorOptions);\r\n }\r\n };\r\n updateDom(node, node, finalProjectorOptions, parentVNode, instance, [], []);\r\n projectorState.afterRenderCallbacks.push(() => {\r\n instanceData.onAttach();\r\n });\r\n runDeferredRenderCallbacks(finalProjectorOptions);\r\n runAfterRenderCallbacks(finalProjectorOptions);\r\n return {\r\n domNode: finalProjectorOptions.rootNode\r\n };\r\n },\r\n create: function (instance, projectionOptions) {\r\n return this.append(document.createElement('div'), instance, projectionOptions);\r\n },\r\n merge: function (element, instance, projectionOptions = {}) {\r\n projectionOptions.merge = true;\r\n projectionOptions.mergeElement = element;\r\n const projection = this.append(element.parentNode, instance, projectionOptions);\r\n const projectorState = projectorStateMap.get(instance);\r\n projectorState.merge = false;\r\n return projection;\r\n }\r\n};\r\n//# sourceMappingURL=vdom.mjs.map" }, { "id": "./node_modules/imports-loader/index.js?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js", @@ -4870,7 +4887,7 @@ "name": "./node_modules/imports-loader?widgetFactory=src/menu/Menu!./node_modules/@dojo/cli-build-widget/template/custom-element.js", "index": 1, "index2": 41, - "size": 277, + "size": 287, "cacheable": true, "built": true, "optional": false, @@ -4900,7 +4917,7 @@ "providedExports": null, "optimizationBailout": [], "depth": 1, - "source": "/*** IMPORTS FROM imports-loader ***/\nvar widgetFactory = require(\"src/menu/Menu\");\n\nvar registerCustomElement = require('@dojo/widget-core/registerCustomElement').default;\r\n\r\nvar defaultExport = widgetFactory.default;\r\ndefaultExport && registerCustomElement(defaultExport);\r\n\n" + "source": "/*** IMPORTS FROM imports-loader ***/\nvar widgetFactory = require(\"src/menu/Menu\");\n\nvar registerCustomElement = require('@dojo/framework/widget-core/registerCustomElement').default;\r\n\r\nvar defaultExport = widgetFactory.default;\r\ndefaultExport && registerCustomElement(defaultExport);\r\n\n" }, { "id": "./node_modules/process/browser.js", @@ -4917,21 +4934,21 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\has\\has.mjs", - "issuerId": "./node_modules/@dojo/has/has.mjs", - "issuerName": "./node_modules/@dojo/has/has.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\has\\has.mjs", + "issuerId": "./node_modules/@dojo/framework/has/has.mjs", + "issuerName": "./node_modules/@dojo/framework/has/has.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/has/has.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\has\\has.mjs", - "module": "./node_modules/@dojo/has/has.mjs", - "moduleName": "./node_modules/@dojo/has/has.mjs", + "moduleId": "./node_modules/@dojo/framework/has/has.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\has\\has.mjs", + "module": "./node_modules/@dojo/framework/has/has.mjs", + "moduleName": "./node_modules/@dojo/framework/has/has.mjs", "type": "cjs require", "userRequest": "process", - "loc": "1:0-37" + "loc": "1:0-40" } ], "usedExports": true, @@ -4955,18 +4972,18 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "issuerId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "issuerName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "issuerId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "issuerName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\registerCustomElement.mjs", - "module": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", - "moduleName": "./node_modules/@dojo/widget-core/registerCustomElement.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\registerCustomElement.mjs", + "module": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/registerCustomElement.mjs", "type": "harmony import", "userRequest": "tslib", "loc": "1:0-33" @@ -4981,19 +4998,19 @@ "loc": "1:0-33" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Projector.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Projector.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Projector.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Projector.mjs", "type": "harmony import", "userRequest": "tslib", "loc": "1:0-33" }, { - "moduleId": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\widget-core\\mixins\\Themed.mjs", - "module": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", - "moduleName": "./node_modules/@dojo/widget-core/mixins/Themed.mjs", + "moduleId": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\widget-core\\mixins\\Themed.mjs", + "module": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", + "moduleName": "./node_modules/@dojo/framework/widget-core/mixins/Themed.mjs", "type": "harmony import", "userRequest": "tslib", "loc": "1:0-33" @@ -5001,7 +5018,6 @@ ], "usedExports": [ "__decorate", - "__metadata", "__rest" ], "providedExports": [ @@ -5042,30 +5058,30 @@ "menu" ], "assets": [], - "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\global.mjs", - "issuerId": "./node_modules/@dojo/shim/global.mjs", - "issuerName": "./node_modules/@dojo/shim/global.mjs", + "issuer": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\global.mjs", + "issuerId": "./node_modules/@dojo/framework/shim/global.mjs", + "issuerName": "./node_modules/@dojo/framework/shim/global.mjs", "failed": false, "errors": 0, "warnings": 0, "reasons": [ { - "moduleId": "./node_modules/@dojo/shim/global.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\shim\\global.mjs", - "module": "./node_modules/@dojo/shim/global.mjs", - "moduleName": "./node_modules/@dojo/shim/global.mjs", + "moduleId": "./node_modules/@dojo/framework/shim/global.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\shim\\global.mjs", + "module": "./node_modules/@dojo/framework/shim/global.mjs", + "moduleName": "./node_modules/@dojo/framework/shim/global.mjs", "type": "cjs require", "userRequest": "global", - "loc": "1:0-44" + "loc": "1:0-47" }, { - "moduleId": "./node_modules/@dojo/has/has.mjs", - "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\has\\has.mjs", - "module": "./node_modules/@dojo/has/has.mjs", - "moduleName": "./node_modules/@dojo/has/has.mjs", + "moduleId": "./node_modules/@dojo/framework/has/has.mjs", + "moduleIdentifier": "C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\webpack-contrib\\static-build-loader\\index.js??ref--4-0!C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\node_modules\\@dojo\\framework\\has\\has.mjs", + "module": "./node_modules/@dojo/framework/has/has.mjs", + "moduleName": "./node_modules/@dojo/framework/has/has.mjs", "type": "cjs require", "userRequest": "global", - "loc": "1:0-44" + "loc": "1:0-47" } ], "usedExports": true, @@ -5080,7 +5096,7 @@ "name": "./src/menu/Menu.ts", "index": 2, "index2": 40, - "size": 1462, + "size": 1502, "cacheable": true, "built": true, "optional": false, @@ -5113,7 +5129,7 @@ ], "optimizationBailout": [], "depth": 2, - "source": "import * as tslib_1 from \"tslib\";\r\nimport { v } from '@dojo/widget-core/d';\r\nimport { customElement } from '@dojo/widget-core/decorators/customElement';\r\nimport { theme, ThemedMixin } from '@dojo/widget-core/mixins/Themed';\r\nimport { WidgetBase } from '@dojo/widget-core/WidgetBase';\r\nimport * as css from './menu.m.css';\r\nlet Menu = class Menu extends ThemedMixin(WidgetBase) {\r\n _onSelected(id, data) {\r\n this._selectedId = id;\r\n this.properties.onSelected(data);\r\n this.invalidate();\r\n }\r\n render() {\r\n const items = this.children.map((child, index) => {\r\n if (child) {\r\n const properties = {\r\n onSelected: (data) => {\r\n this._onSelected(index, data);\r\n }\r\n };\r\n if (this._selectedId !== undefined) {\r\n properties.selected = index === this._selectedId;\r\n }\r\n child.properties = Object.assign({}, child.properties, properties);\r\n }\r\n return child;\r\n });\r\n return v('nav', { classes: this.theme(css.root) }, [\r\n v('ol', {\r\n classes: this.theme(css.menuContainer)\r\n }, items)\r\n ]);\r\n }\r\n};\r\nMenu = tslib_1.__decorate([\r\n customElement({\r\n tag: 'demo-menu',\r\n events: ['onSelected']\r\n }),\r\n theme(css)\r\n], Menu);\r\nexport { Menu };\r\nexport default Menu;\r\n" + "source": "import * as tslib_1 from \"tslib\";\r\nimport { v } from '@dojo/framework/widget-core/d';\r\nimport { customElement } from '@dojo/framework/widget-core/decorators/customElement';\r\nimport { theme, ThemedMixin } from '@dojo/framework/widget-core/mixins/Themed';\r\nimport { WidgetBase } from '@dojo/framework/widget-core/WidgetBase';\r\nimport * as css from './menu.m.css';\r\nlet Menu = class Menu extends ThemedMixin(WidgetBase) {\r\n _onSelected(id, data) {\r\n this._selectedId = id;\r\n this.properties.onSelected(data);\r\n this.invalidate();\r\n }\r\n render() {\r\n const items = this.children.map((child, index) => {\r\n if (child) {\r\n const properties = {\r\n onSelected: (data) => {\r\n this._onSelected(index, data);\r\n }\r\n };\r\n if (this._selectedId !== undefined) {\r\n properties.selected = index === this._selectedId;\r\n }\r\n child.properties = Object.assign({}, child.properties, properties);\r\n }\r\n return child;\r\n });\r\n return v('nav', { classes: this.theme(css.root) }, [\r\n v('ol', {\r\n classes: this.theme(css.menuContainer)\r\n }, items)\r\n ]);\r\n }\r\n};\r\nMenu = tslib_1.__decorate([\r\n customElement({\r\n tag: 'demo-menu',\r\n events: ['onSelected']\r\n }),\r\n theme(css)\r\n], Menu);\r\nexport { Menu };\r\nexport default Menu;\r\n" }, { "id": "./src/menu/menu.m.css", diff --git a/test-app/fixtures/windows/test/functional.js b/test-app/fixtures/windows/test/functional.js index c4e70e3..75ee436 100644 --- a/test-app/fixtures/windows/test/functional.js +++ b/test-app/fixtures/windows/test/functional.js @@ -103,4 +103,4 @@ module.exports = __webpack_require__("./tests/functional/main.ts"); /***/ }) /******/ }));; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgZjdmNjg2Yjg2ZGU4MjZhN2QzMWQiLCJ3ZWJwYWNrOi8vLy4vdGVzdHMvZnVuY3Rpb25hbC9hbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7O0FDN0RBIiwiZmlsZSI6ImZ1bmN0aW9uYWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCBmN2Y2ODZiODZkZTgyNmE3ZDMxZCIsImltcG9ydCAnLi9tYWluJztcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWR0cy1sb2FkZXI/dHlwZT10cyZpbnN0YW5jZU5hbWU9MF9jdXN0b20tZWxlbWVudHMhLi90ZXN0cy9mdW5jdGlvbmFsL2FsbC50cyJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgNzMyODJlOTgxNzIzN2Q0NTUwMmMiLCJ3ZWJwYWNrOi8vLy4vdGVzdHMvZnVuY3Rpb25hbC9hbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7O0FDN0RBIiwiZmlsZSI6ImZ1bmN0aW9uYWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCA3MzI4MmU5ODE3MjM3ZDQ1NTAyYyIsImltcG9ydCAnLi9tYWluJztcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWR0cy1sb2FkZXI/dHlwZT10cyZpbnN0YW5jZU5hbWU9MF9jdXN0b20tZWxlbWVudHMhLi90ZXN0cy9mdW5jdGlvbmFsL2FsbC50cyJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/test-app/fixtures/windows/test/unit.js b/test-app/fixtures/windows/test/unit.js index a7831f5..58bef5b 100644 --- a/test-app/fixtures/windows/test/unit.js +++ b/test-app/fixtures/windows/test/unit.js @@ -73,15 +73,15 @@ /************************************************************************/ /******/ ({ -/***/ "./node_modules/@dojo/core/Destroyable.js": +/***/ "./node_modules/@dojo/framework/core/Destroyable.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var lang_1 = __webpack_require__("./node_modules/@dojo/core/lang.js"); -var Promise_1 = __webpack_require__("./node_modules/@dojo/shim/Promise.js"); +var lang_1 = __webpack_require__("./node_modules/@dojo/framework/core/lang.js"); +var Promise_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Promise.js"); /** * No operation function to replace own once instance is destoryed */ @@ -141,15 +141,15 @@ exports.default = Destroyable; /***/ }), -/***/ "./node_modules/@dojo/core/Evented.js": +/***/ "./node_modules/@dojo/framework/core/Evented.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var Map_1 = __webpack_require__("./node_modules/@dojo/shim/Map.js"); -var Destroyable_1 = __webpack_require__("./node_modules/@dojo/core/Destroyable.js"); +var Map_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Map.js"); +var Destroyable_1 = __webpack_require__("./node_modules/@dojo/framework/core/Destroyable.js"); /** * Map of computed regular expressions, keyed by string */ @@ -193,7 +193,7 @@ var Evented = /** @class */ (function (_super) { var _this = this; this.listenersMap.forEach(function (methods, type) { if (isGlobMatch(type, event.type)) { - methods.forEach(function (method) { + tslib_1.__spread(methods).forEach(function (method) { method.call(_this, event); }); } @@ -230,15 +230,15 @@ exports.default = Evented; /***/ }), -/***/ "./node_modules/@dojo/core/lang.js": +/***/ "./node_modules/@dojo/framework/core/lang.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var object_1 = __webpack_require__("./node_modules/@dojo/shim/object.js"); -var object_2 = __webpack_require__("./node_modules/@dojo/shim/object.js"); +var object_1 = __webpack_require__("./node_modules/@dojo/framework/shim/object.js"); +var object_2 = __webpack_require__("./node_modules/@dojo/framework/shim/object.js"); exports.assign = object_2.assign; var slice = Array.prototype.slice; var hasOwnProperty = Object.prototype.hasOwnProperty; @@ -474,7 +474,7 @@ exports.createCompositeHandle = createCompositeHandle; /***/ }), -/***/ "./node_modules/@dojo/has/has.js": +/***/ "./node_modules/@dojo/framework/has/has.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -685,18 +685,18 @@ add('host-node', function () { /***/ }), -/***/ "./node_modules/@dojo/shim/Map.js": +/***/ "./node_modules/@dojo/framework/shim/Map.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var iterator_1 = __webpack_require__("./node_modules/@dojo/shim/iterator.js"); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); -var object_1 = __webpack_require__("./node_modules/@dojo/shim/object.js"); -var has_1 = __webpack_require__("./node_modules/@dojo/shim/support/has.js"); -__webpack_require__("./node_modules/@dojo/shim/Symbol.js"); +var iterator_1 = __webpack_require__("./node_modules/@dojo/framework/shim/iterator.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); +var object_1 = __webpack_require__("./node_modules/@dojo/framework/shim/object.js"); +var has_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.js"); +__webpack_require__("./node_modules/@dojo/framework/shim/Symbol.js"); exports.Map = global_1.default.Map; if (!has_1.default('es6-map')) { exports.Map = (_a = /** @class */ (function () { @@ -807,17 +807,17 @@ var _a; /***/ }), -/***/ "./node_modules/@dojo/shim/Promise.js": +/***/ "./node_modules/@dojo/framework/shim/Promise.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); -var queue_1 = __webpack_require__("./node_modules/@dojo/shim/support/queue.js"); -__webpack_require__("./node_modules/@dojo/shim/Symbol.js"); -var has_1 = __webpack_require__("./node_modules/@dojo/shim/support/has.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); +var queue_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/queue.js"); +__webpack_require__("./node_modules/@dojo/framework/shim/Symbol.js"); +var has_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.js"); exports.ShimPromise = global_1.default.Promise; exports.isThenable = function isThenable(value) { return value && typeof value.then === 'function'; @@ -1039,17 +1039,17 @@ var _a; /***/ }), -/***/ "./node_modules/@dojo/shim/Set.js": +/***/ "./node_modules/@dojo/framework/shim/Set.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); -var iterator_1 = __webpack_require__("./node_modules/@dojo/shim/iterator.js"); -var has_1 = __webpack_require__("./node_modules/@dojo/shim/support/has.js"); -__webpack_require__("./node_modules/@dojo/shim/Symbol.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); +var iterator_1 = __webpack_require__("./node_modules/@dojo/framework/shim/iterator.js"); +var has_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.js"); +__webpack_require__("./node_modules/@dojo/framework/shim/Symbol.js"); exports.Set = global_1.default.Set; if (!has_1.default('es6-set')) { exports.Set = (_a = /** @class */ (function () { @@ -1138,15 +1138,15 @@ var _a; /***/ }), -/***/ "./node_modules/@dojo/shim/Symbol.js": +/***/ "./node_modules/@dojo/framework/shim/Symbol.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var has_1 = __webpack_require__("./node_modules/@dojo/shim/support/has.js"); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); -var util_1 = __webpack_require__("./node_modules/@dojo/shim/support/util.js"); +var has_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); +var util_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/util.js"); exports.Symbol = global_1.default.Symbol; if (!has_1.default('es6-symbol')) { /** @@ -1292,17 +1292,17 @@ exports.default = exports.Symbol; /***/ }), -/***/ "./node_modules/@dojo/shim/WeakMap.js": +/***/ "./node_modules/@dojo/framework/shim/WeakMap.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); -var iterator_1 = __webpack_require__("./node_modules/@dojo/shim/iterator.js"); -var has_1 = __webpack_require__("./node_modules/@dojo/shim/support/has.js"); -__webpack_require__("./node_modules/@dojo/shim/Symbol.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); +var iterator_1 = __webpack_require__("./node_modules/@dojo/framework/shim/iterator.js"); +var has_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.js"); +__webpack_require__("./node_modules/@dojo/framework/shim/Symbol.js"); exports.WeakMap = global_1.default.WeakMap; if (!has_1.default('es6-weakmap')) { var DELETED_1 = {}; @@ -1424,18 +1424,18 @@ exports.default = exports.WeakMap; /***/ }), -/***/ "./node_modules/@dojo/shim/array.js": +/***/ "./node_modules/@dojo/framework/shim/array.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); -var iterator_1 = __webpack_require__("./node_modules/@dojo/shim/iterator.js"); -var number_1 = __webpack_require__("./node_modules/@dojo/shim/number.js"); -var has_1 = __webpack_require__("./node_modules/@dojo/shim/support/has.js"); -var util_1 = __webpack_require__("./node_modules/@dojo/shim/support/util.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); +var iterator_1 = __webpack_require__("./node_modules/@dojo/framework/shim/iterator.js"); +var number_1 = __webpack_require__("./node_modules/@dojo/framework/shim/number.js"); +var has_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.js"); +var util_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/util.js"); if (has_1.default('es6-array') && has_1.default('es6-array-fill')) { exports.from = global_1.default.Array.from; exports.of = global_1.default.Array.of; @@ -1639,7 +1639,7 @@ else { /***/ }), -/***/ "./node_modules/@dojo/shim/global.js": +/***/ "./node_modules/@dojo/framework/shim/global.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1666,14 +1666,14 @@ exports.default = globalObject; /***/ }), -/***/ "./node_modules/@dojo/shim/iterator.js": +/***/ "./node_modules/@dojo/framework/shim/iterator.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -__webpack_require__("./node_modules/@dojo/shim/Symbol.js"); -var string_1 = __webpack_require__("./node_modules/@dojo/shim/string.js"); +__webpack_require__("./node_modules/@dojo/framework/shim/Symbol.js"); +var string_1 = __webpack_require__("./node_modules/@dojo/framework/shim/string.js"); var staticDone = { done: true, value: undefined }; /** * A class that _shims_ an iterator interface on array like objects. @@ -1791,13 +1791,13 @@ exports.forOf = forOf; /***/ }), -/***/ "./node_modules/@dojo/shim/number.js": +/***/ "./node_modules/@dojo/framework/shim/number.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); /** * The smallest interval between two representable numbers. */ @@ -1857,15 +1857,15 @@ exports.isSafeInteger = isSafeInteger; /***/ }), -/***/ "./node_modules/@dojo/shim/object.js": +/***/ "./node_modules/@dojo/framework/shim/object.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); -var has_1 = __webpack_require__("./node_modules/@dojo/shim/support/has.js"); -var Symbol_1 = __webpack_require__("./node_modules/@dojo/shim/Symbol.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); +var has_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.js"); +var Symbol_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.js"); if (has_1.default('es6-object')) { var globalObject = global_1.default.Object; exports.assign = globalObject.assign; @@ -1945,16 +1945,16 @@ else { /***/ }), -/***/ "./node_modules/@dojo/shim/string.js": +/***/ "./node_modules/@dojo/framework/shim/string.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); -var has_1 = __webpack_require__("./node_modules/@dojo/shim/support/has.js"); -var util_1 = __webpack_require__("./node_modules/@dojo/shim/support/util.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); +var has_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.js"); +var util_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/util.js"); /** * The minimum location of high surrogates */ @@ -2183,17 +2183,17 @@ else { /***/ }), -/***/ "./node_modules/@dojo/shim/support/has.js": +/***/ "./node_modules/@dojo/framework/shim/support/has.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var has_1 = __webpack_require__("./node_modules/@dojo/has/has.js"); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); +var has_1 = __webpack_require__("./node_modules/@dojo/framework/has/has.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); exports.default = has_1.default; -tslib_1.__exportStar(__webpack_require__("./node_modules/@dojo/has/has.js"), exports); +tslib_1.__exportStar(__webpack_require__("./node_modules/@dojo/framework/has/has.js"), exports); /* ECMAScript 6 and 7 Features */ /* Array */ has_1.add('es6-array', function () { @@ -2363,14 +2363,14 @@ var templateObject_1; /***/ }), -/***/ "./node_modules/@dojo/shim/support/queue.js": +/***/ "./node_modules/@dojo/framework/shim/support/queue.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(setImmediate) { Object.defineProperty(exports, "__esModule", { value: true }); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); -var has_1 = __webpack_require__("./node_modules/@dojo/shim/support/has.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); +var has_1 = __webpack_require__("./node_modules/@dojo/framework/shim/support/has.js"); function executeTask(item) { if (item && item.isActive && item.callback) { item.callback(); @@ -2558,7 +2558,7 @@ exports.queueMicroTask = (function () { /***/ }), -/***/ "./node_modules/@dojo/shim/support/util.js": +/***/ "./node_modules/@dojo/framework/shim/support/util.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2598,16 +2598,16 @@ exports.wrapNative = wrapNative; /***/ }), -/***/ "./node_modules/@dojo/test-extras/harness.js": +/***/ "./node_modules/@dojo/framework/testing/harness.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var assertRender_1 = __webpack_require__("./node_modules/@dojo/test-extras/support/assertRender.js"); -var selector_1 = __webpack_require__("./node_modules/@dojo/test-extras/support/selector.js"); -var d_1 = __webpack_require__("./node_modules/@dojo/widget-core/d.js"); +var assertRender_1 = __webpack_require__("./node_modules/@dojo/framework/testing/support/assertRender.js"); +var selector_1 = __webpack_require__("./node_modules/@dojo/framework/testing/support/selector.js"); +var d_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.js"); function decorateNodes(dNode) { var hasDeferredProperties = false; function addParent(parent) { @@ -2743,18 +2743,18 @@ exports.default = harness; /***/ }), -/***/ "./node_modules/@dojo/test-extras/support/assertRender.js": +/***/ "./node_modules/@dojo/framework/testing/support/assertRender.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var d_1 = __webpack_require__("./node_modules/@dojo/widget-core/d.js"); +var d_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.js"); var diff = __webpack_require__("./node_modules/diff/dist/diff.js"); -var WeakMap_1 = __webpack_require__("./node_modules/@dojo/shim/WeakMap.js"); -var Set_1 = __webpack_require__("./node_modules/@dojo/shim/Set.js"); -var Map_1 = __webpack_require__("./node_modules/@dojo/shim/Map.js"); -var array_1 = __webpack_require__("./node_modules/@dojo/shim/array.js"); +var WeakMap_1 = __webpack_require__("./node_modules/@dojo/framework/shim/WeakMap.js"); +var Set_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Set.js"); +var Map_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Map.js"); +var array_1 = __webpack_require__("./node_modules/@dojo/framework/shim/array.js"); var widgetClassCounter = 0; var widgetMap = new WeakMap_1.default(); function replacer(key, value) { @@ -2863,14 +2863,14 @@ exports.default = assertRender; /***/ }), -/***/ "./node_modules/@dojo/test-extras/support/selector.js": +/***/ "./node_modules/@dojo/framework/testing/support/selector.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var d_1 = __webpack_require__("./node_modules/@dojo/widget-core/d.js"); +var d_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.js"); var cssSelect = __webpack_require__("./node_modules/css-select-umd/dist/index.js"); exports.parseSelector = function (selector) { var selectors = selector.split(' '); @@ -2979,51 +2979,14 @@ exports.default = select; /***/ }), -/***/ "./node_modules/@dojo/webpack-contrib/css-module-decorator-loader/index.js!./node_modules/css-loader/index.js?{\"modules\":true,\"sourceMap\":true,\"importLoaders\":1,\"localIdentName\":\"[hash:base64:8]\"}!./node_modules/postcss-loader/lib/index.js?{\"ident\":\"postcss\",\"plugins\":[null,{\"version\":\"6.0.23\",\"plugins\":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],\"postcssPlugin\":\"postcss-cssnext\",\"postcssVersion\":\"6.0.23\"}]}!./node_modules/@dojo/webpack-contrib/css-module-dts-loader/index.js?type=css!./src/menu-item/menuItem.m.css": -/***/ (function(module, exports, __webpack_require__) { - -exports = module.exports = __webpack_require__("./node_modules/css-loader/lib/css-base.js")(true); -// imports - - -// module -exports.push([module.i, ".sUmUi4Sh {\r\n\theight: 100%;\r\n\tdisplay: inline-block;\r\n}\r\n\r\n._2Mk6Rdqa {\r\n\tcolor: #fff;\r\n\ttext-decoration: none;\r\n\tmargin: 0 6.4px;\r\n\tposition: relative;\r\n\tdisplay: -webkit-box;\r\n\tdisplay: -ms-flexbox;\r\n\tdisplay: flex;\r\n\t-webkit-box-orient: vertical;\r\n\t-webkit-box-direction: normal;\r\n\t -ms-flex-direction: column;\r\n\t flex-direction: column;\r\n\t-webkit-box-pack: center;\r\n\t -ms-flex-pack: center;\r\n\t justify-content: center;\r\n\theight: 48px;\r\n\tcursor: pointer;\r\n}\r\n\r\n._2Mk6Rdqa::after {\r\n\tdisplay: block;\r\n\tcontent: \"\";\r\n\tbackground: #fff;\r\n\theight: 2px;\r\n\tposition: absolute;\r\n\twidth: 100%;\r\n\tbottom: 0;\r\n\t-webkit-transition: -webkit-transform .3s ease-out;\r\n\ttransition: -webkit-transform .3s ease-out;\r\n\ttransition: transform .3s ease-out;\r\n\ttransition: transform .3s ease-out, -webkit-transform .3s ease-out;\r\n\t-webkit-transform: translateY(3px);\r\n\t transform: translateY(3px);\r\n}\r\n\r\n._1-f3ItOh::after {\r\n\t-webkit-transform: translateY(0);\r\n\t transform: translateY(0);\r\n}\r\n", "", {"version":3,"sources":["C:/Users/IEUser/Desktop/cli-build-widget/test-app/src/menu-item/menuItem.m.css"],"names":[],"mappings":"AAAA;CACC,aAAa;CACb,sBAAsB;CACtB;;AAED;CACC,YAAY;CACZ,sBAAsB;CACtB,gBAAgB;CAChB,mBAAmB;CACnB,qBAAqB;CACrB,qBAAqB;CACrB,cAAc;CACd,6BAA6B;CAC7B,8BAA8B;KAC1B,2BAA2B;SACvB,uBAAuB;CAC/B,yBAAyB;KACrB,sBAAsB;SAClB,wBAAwB;CAChC,aAAa;CACb,gBAAgB;CAChB;;AAED;CACC,eAAe;CACf,YAAY;CACZ,iBAAiB;CACjB,YAAY;CACZ,mBAAmB;CACnB,YAAY;CACZ,UAAU;CACV,mDAAmD;CACnD,2CAA2C;CAC3C,mCAAmC;CACnC,mEAAmE;CACnE,mCAAmC;SAC3B,2BAA2B;CACnC;;AAED;CACC,iCAAiC;SACzB,yBAAyB;CACjC","file":"menuItem.m.css","sourcesContent":[".root {\r\n\theight: 100%;\r\n\tdisplay: inline-block;\r\n}\r\n\r\n.item {\r\n\tcolor: #fff;\r\n\ttext-decoration: none;\r\n\tmargin: 0 6.4px;\r\n\tposition: relative;\r\n\tdisplay: -webkit-box;\r\n\tdisplay: -ms-flexbox;\r\n\tdisplay: flex;\r\n\t-webkit-box-orient: vertical;\r\n\t-webkit-box-direction: normal;\r\n\t -ms-flex-direction: column;\r\n\t flex-direction: column;\r\n\t-webkit-box-pack: center;\r\n\t -ms-flex-pack: center;\r\n\t justify-content: center;\r\n\theight: 48px;\r\n\tcursor: pointer;\r\n}\r\n\r\n.item::after {\r\n\tdisplay: block;\r\n\tcontent: \"\";\r\n\tbackground: #fff;\r\n\theight: 2px;\r\n\tposition: absolute;\r\n\twidth: 100%;\r\n\tbottom: 0;\r\n\t-webkit-transition: -webkit-transform .3s ease-out;\r\n\ttransition: -webkit-transform .3s ease-out;\r\n\ttransition: transform .3s ease-out;\r\n\ttransition: transform .3s ease-out, -webkit-transform .3s ease-out;\r\n\t-webkit-transform: translateY(3px);\r\n\t transform: translateY(3px);\r\n}\r\n\r\n.selected::after {\r\n\t-webkit-transform: translateY(0);\r\n\t transform: translateY(0);\r\n}\r\n"],"sourceRoot":""}]); - -// exports -exports.locals = {" _key": "test-app/menuItem", - "root": "sUmUi4Sh", - "item": "_2Mk6Rdqa", - "selected": "_1-f3ItOh" -}; - -/***/ }), - -/***/ "./node_modules/@dojo/webpack-contrib/css-module-decorator-loader/index.js!./node_modules/css-loader/index.js?{\"modules\":true,\"sourceMap\":true,\"importLoaders\":1,\"localIdentName\":\"[hash:base64:8]\"}!./node_modules/postcss-loader/lib/index.js?{\"ident\":\"postcss\",\"plugins\":[null,{\"version\":\"6.0.23\",\"plugins\":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],\"postcssPlugin\":\"postcss-cssnext\",\"postcssVersion\":\"6.0.23\"}]}!./node_modules/@dojo/webpack-contrib/css-module-dts-loader/index.js?type=css!./src/menu/menu.m.css": -/***/ (function(module, exports, __webpack_require__) { - -exports = module.exports = __webpack_require__("./node_modules/css-loader/lib/css-base.js")(true); -// imports - - -// module -exports.push([module.i, "._3bA6jdSn {\r\n\twidth: 100%;\r\n\ttop: 0;\r\n\theight: 48px;\r\n\tz-index: 100;\r\n\tbackground-color: #1d1f20;\r\n}\r\n\r\n._1eoGfqku {\r\n\theight: 100%;\r\n\tmargin: 0 auto;\r\n}\r\n", "", {"version":3,"sources":["C:/Users/IEUser/Desktop/cli-build-widget/test-app/src/menu/menu.m.css"],"names":[],"mappings":"AAAA;CACC,YAAY;CACZ,OAAO;CACP,aAAa;CACb,aAAa;CACb,0BAA0B;CAC1B;;AAED;CACC,aAAa;CACb,eAAe;CACf","file":"menu.m.css","sourcesContent":[".root {\r\n\twidth: 100%;\r\n\ttop: 0;\r\n\theight: 48px;\r\n\tz-index: 100;\r\n\tbackground-color: #1d1f20;\r\n}\r\n\r\n.menuContainer {\r\n\theight: 100%;\r\n\tmargin: 0 auto;\r\n}\r\n"],"sourceRoot":""}]); - -// exports -exports.locals = {" _key": "test-app/menu", - "root": "_3bA6jdSn", - "menuContainer": "_1eoGfqku" -}; - -/***/ }), - -/***/ "./node_modules/@dojo/widget-core/Injector.js": +/***/ "./node_modules/@dojo/framework/widget-core/Injector.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var Evented_1 = __webpack_require__("./node_modules/@dojo/core/Evented.js"); +var Evented_1 = __webpack_require__("./node_modules/@dojo/framework/core/Evented.js"); var Injector = /** @class */ (function (_super) { tslib_1.__extends(Injector, _super); function Injector(payload) { @@ -3050,15 +3013,15 @@ exports.default = Injector; /***/ }), -/***/ "./node_modules/@dojo/widget-core/NodeHandler.js": +/***/ "./node_modules/@dojo/framework/widget-core/NodeHandler.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var Evented_1 = __webpack_require__("./node_modules/@dojo/core/Evented.js"); -var Map_1 = __webpack_require__("./node_modules/@dojo/shim/Map.js"); +var Evented_1 = __webpack_require__("./node_modules/@dojo/framework/core/Evented.js"); +var Map_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Map.js"); /** * Enum to identify the type of event. * Listening to 'Projector' will notify when projector is created or updated @@ -3102,17 +3065,17 @@ exports.default = NodeHandler; /***/ }), -/***/ "./node_modules/@dojo/widget-core/Registry.js": +/***/ "./node_modules/@dojo/framework/widget-core/Registry.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var Promise_1 = __webpack_require__("./node_modules/@dojo/shim/Promise.js"); -var Map_1 = __webpack_require__("./node_modules/@dojo/shim/Map.js"); -var Symbol_1 = __webpack_require__("./node_modules/@dojo/shim/Symbol.js"); -var Evented_1 = __webpack_require__("./node_modules/@dojo/core/Evented.js"); +var Promise_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Promise.js"); +var Map_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Map.js"); +var Symbol_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.js"); +var Evented_1 = __webpack_require__("./node_modules/@dojo/framework/core/Evented.js"); /** * Widget base symbol type */ @@ -3234,16 +3197,16 @@ exports.default = Registry; /***/ }), -/***/ "./node_modules/@dojo/widget-core/RegistryHandler.js": +/***/ "./node_modules/@dojo/framework/widget-core/RegistryHandler.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var Map_1 = __webpack_require__("./node_modules/@dojo/shim/Map.js"); -var Evented_1 = __webpack_require__("./node_modules/@dojo/core/Evented.js"); -var Registry_1 = __webpack_require__("./node_modules/@dojo/widget-core/Registry.js"); +var Map_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Map.js"); +var Evented_1 = __webpack_require__("./node_modules/@dojo/framework/core/Evented.js"); +var Registry_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.js"); var RegistryHandler = /** @class */ (function (_super) { tslib_1.__extends(RegistryHandler, _super); function RegistryHandler() { @@ -3326,22 +3289,22 @@ exports.default = RegistryHandler; /***/ }), -/***/ "./node_modules/@dojo/widget-core/WidgetBase.js": +/***/ "./node_modules/@dojo/framework/widget-core/WidgetBase.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var Map_1 = __webpack_require__("./node_modules/@dojo/shim/Map.js"); -var WeakMap_1 = __webpack_require__("./node_modules/@dojo/shim/WeakMap.js"); -var Symbol_1 = __webpack_require__("./node_modules/@dojo/shim/Symbol.js"); -var d_1 = __webpack_require__("./node_modules/@dojo/widget-core/d.js"); -var diff_1 = __webpack_require__("./node_modules/@dojo/widget-core/diff.js"); -var RegistryHandler_1 = __webpack_require__("./node_modules/@dojo/widget-core/RegistryHandler.js"); -var NodeHandler_1 = __webpack_require__("./node_modules/@dojo/widget-core/NodeHandler.js"); -var vdom_1 = __webpack_require__("./node_modules/@dojo/widget-core/vdom.js"); -var Registry_1 = __webpack_require__("./node_modules/@dojo/widget-core/Registry.js"); +var Map_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Map.js"); +var WeakMap_1 = __webpack_require__("./node_modules/@dojo/framework/shim/WeakMap.js"); +var Symbol_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.js"); +var d_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.js"); +var diff_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/diff.js"); +var RegistryHandler_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/RegistryHandler.js"); +var NodeHandler_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/NodeHandler.js"); +var vdom_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/vdom.js"); +var Registry_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.js"); var decoratorMap = new Map_1.default(); var boundAuto = diff_1.auto.bind(null); exports.noBind = Symbol_1.default.for('dojoNoBind'); @@ -3449,7 +3412,7 @@ var WidgetBase = /** @class */ (function () { if (this._initialProperties === false || registeredDiffPropertyNames.length !== 0) { var allProperties = tslib_1.__spread(propertyNames, Object.keys(this._properties)); var checkedProperties = []; - var diffPropertyResults = {}; + var diffPropertyResults_1 = {}; var runReactions = false; for (var i = 0; i < allProperties.length; i++) { var propertyName = allProperties[i]; @@ -3468,7 +3431,7 @@ var WidgetBase = /** @class */ (function () { changedPropertyKeys.push(propertyName); } if (propertyName in properties) { - diffPropertyResults[propertyName] = result.value; + diffPropertyResults_1[propertyName] = result.value; } } } @@ -3478,18 +3441,24 @@ var WidgetBase = /** @class */ (function () { changedPropertyKeys.push(propertyName); } if (propertyName in properties) { - diffPropertyResults[propertyName] = result.value; + diffPropertyResults_1[propertyName] = result.value; } } } if (runReactions) { - this._mapDiffPropertyReactions(properties, changedPropertyKeys).forEach(function (args, reaction) { - if (args.changed) { - reaction.call(_this, args.previousProperties, args.newProperties); + var reactionFunctions = this.getDecorator('diffReaction'); + var executedReactions_1 = []; + reactionFunctions.forEach(function (_a) { + var reaction = _a.reaction, propertyName = _a.propertyName; + var propertyChanged = changedPropertyKeys.indexOf(propertyName) !== -1; + var reactionRun = executedReactions_1.indexOf(reaction) !== -1; + if (propertyChanged && !reactionRun) { + reaction.call(_this, _this._properties, diffPropertyResults_1); + executedReactions_1.push(reaction); } }); } - this._properties = diffPropertyResults; + this._properties = diffPropertyResults_1; this._changedPropertyKeys = changedPropertyKeys; } else { @@ -3604,28 +3573,6 @@ var WidgetBase = /** @class */ (function () { this._decoratorCache.set(decoratorKey, allDecorators); return allDecorators; }; - WidgetBase.prototype._mapDiffPropertyReactions = function (newProperties, changedPropertyKeys) { - var _this = this; - var reactionFunctions = this.getDecorator('diffReaction'); - return reactionFunctions.reduce(function (reactionPropertyMap, _a) { - var reaction = _a.reaction, propertyName = _a.propertyName; - var reactionArguments = reactionPropertyMap.get(reaction); - if (reactionArguments === undefined) { - reactionArguments = { - previousProperties: {}, - newProperties: {}, - changed: false - }; - } - reactionArguments.previousProperties[propertyName] = _this._properties[propertyName]; - reactionArguments.newProperties[propertyName] = newProperties[propertyName]; - if (changedPropertyKeys.indexOf(propertyName) !== -1) { - reactionArguments.changed = true; - } - reactionPropertyMap.set(reaction, reactionArguments); - return reactionPropertyMap; - }, new Map_1.default()); - }; /** * Binds unbound property functions to the specified `bind` property * @@ -3695,7 +3642,7 @@ var WidgetBase = /** @class */ (function () { var _this = this; var afterRenders = this.getDecorator('afterRender'); if (afterRenders.length > 0) { - return afterRenders.reduce(function (dNode, afterRenderFunction) { + dNode = afterRenders.reduce(function (dNode, afterRenderFunction) { return afterRenderFunction.call(_this, dNode); }, dNode); } @@ -3735,7 +3682,7 @@ exports.default = WidgetBase; /***/ }), -/***/ "./node_modules/@dojo/widget-core/animations/cssTransitions.js": +/***/ "./node_modules/@dojo/framework/widget-core/animations/cssTransitions.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3806,14 +3753,14 @@ exports.default = { /***/ }), -/***/ "./node_modules/@dojo/widget-core/d.js": +/***/ "./node_modules/@dojo/framework/widget-core/d.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var Symbol_1 = __webpack_require__("./node_modules/@dojo/shim/Symbol.js"); +var Symbol_1 = __webpack_require__("./node_modules/@dojo/framework/shim/Symbol.js"); /** * The symbol identifier for a WNode type */ @@ -3936,13 +3883,13 @@ exports.dom = dom; /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/afterRender.js": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/afterRender.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.js"); +var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.js"); function afterRender(method) { return handleDecorator_1.handleDecorator(function (target, propertyKey) { target.addDecorator('afterRender', propertyKey ? target[propertyKey] : method); @@ -3953,14 +3900,14 @@ exports.default = afterRender; /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/alwaysRender.js": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.js"); -var beforeProperties_1 = __webpack_require__("./node_modules/@dojo/widget-core/decorators/beforeProperties.js"); +var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.js"); +var beforeProperties_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.js"); function alwaysRender() { return handleDecorator_1.handleDecorator(function (target, propertyKey) { beforeProperties_1.beforeProperties(function () { @@ -3973,13 +3920,13 @@ exports.default = alwaysRender; /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/beforeProperties.js": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.js"); +var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.js"); function beforeProperties(method) { return handleDecorator_1.handleDecorator(function (target, propertyKey) { target.addDecorator('beforeProperties', propertyKey ? target[propertyKey] : method); @@ -3990,14 +3937,14 @@ exports.default = beforeProperties; /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/customElement.js": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/customElement.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var registerCustomElement_1 = __webpack_require__("./node_modules/@dojo/widget-core/registerCustomElement.js"); -var Registry_1 = __webpack_require__("./node_modules/@dojo/widget-core/Registry.js"); +var registerCustomElement_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/registerCustomElement.js"); +var Registry_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.js"); /** * This Decorator is provided properties that define the behavior of a custom element, and * registers that custom element. @@ -4020,13 +3967,14 @@ exports.default = customElement; /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/diffProperty.js": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/diffProperty.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.js"); +var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.js"); +var diff_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/diff.js"); /** * Decorator that can be used to register a function as a specific property diff * @@ -4035,6 +3983,7 @@ var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/widget-core/de * @param diffFunction A diff function to run if diffType if DiffType.CUSTOM */ function diffProperty(propertyName, diffFunction, reactionFunction) { + if (diffFunction === void 0) { diffFunction = diff_1.auto; } return handleDecorator_1.handleDecorator(function (target, propertyKey) { target.addDecorator("diffProperty:" + propertyName, diffFunction.bind(null)); target.addDecorator('registeredDiffProperty', propertyName); @@ -4051,7 +4000,7 @@ exports.default = diffProperty; /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/handleDecorator.js": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4078,15 +4027,15 @@ exports.default = handleDecorator; /***/ }), -/***/ "./node_modules/@dojo/widget-core/decorators/inject.js": +/***/ "./node_modules/@dojo/framework/widget-core/decorators/inject.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var WeakMap_1 = __webpack_require__("./node_modules/@dojo/shim/WeakMap.js"); -var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.js"); -var beforeProperties_1 = __webpack_require__("./node_modules/@dojo/widget-core/decorators/beforeProperties.js"); +var WeakMap_1 = __webpack_require__("./node_modules/@dojo/framework/shim/WeakMap.js"); +var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.js"); +var beforeProperties_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/beforeProperties.js"); /** * Map of instances against registered injectors. */ @@ -4126,13 +4075,13 @@ exports.default = inject; /***/ }), -/***/ "./node_modules/@dojo/widget-core/diff.js": +/***/ "./node_modules/@dojo/framework/widget-core/diff.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var Registry_1 = __webpack_require__("./node_modules/@dojo/widget-core/Registry.js"); +var Registry_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.js"); function isObjectOrArray(value) { return Object.prototype.toString.call(value) === '[object Object]' || Array.isArray(value); } @@ -4205,18 +4154,18 @@ exports.auto = auto; /***/ }), -/***/ "./node_modules/@dojo/widget-core/mixins/Projector.js": +/***/ "./node_modules/@dojo/framework/widget-core/mixins/Projector.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var lang_1 = __webpack_require__("./node_modules/@dojo/core/lang.js"); -var cssTransitions_1 = __webpack_require__("./node_modules/@dojo/widget-core/animations/cssTransitions.js"); -var afterRender_1 = __webpack_require__("./node_modules/@dojo/widget-core/decorators/afterRender.js"); -var d_1 = __webpack_require__("./node_modules/@dojo/widget-core/d.js"); -var vdom_1 = __webpack_require__("./node_modules/@dojo/widget-core/vdom.js"); +var lang_1 = __webpack_require__("./node_modules/@dojo/framework/core/lang.js"); +var cssTransitions_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/animations/cssTransitions.js"); +var afterRender_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/afterRender.js"); +var d_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.js"); +var vdom_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/vdom.js"); /** * Represents the attach state of the projector */ @@ -4376,10 +4325,7 @@ function ProjectorMixin(Base) { return this._attachHandle; }; tslib_1.__decorate([ - afterRender_1.afterRender(), - tslib_1.__metadata("design:type", Function), - tslib_1.__metadata("design:paramtypes", [Object]), - tslib_1.__metadata("design:returntype", void 0) + afterRender_1.afterRender() ], Projector.prototype, "afterRender", null); return Projector; }(Base)); @@ -4390,18 +4336,18 @@ exports.default = ProjectorMixin; /***/ }), -/***/ "./node_modules/@dojo/widget-core/mixins/Themed.js": +/***/ "./node_modules/@dojo/framework/widget-core/mixins/Themed.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var Injector_1 = __webpack_require__("./node_modules/@dojo/widget-core/Injector.js"); -var inject_1 = __webpack_require__("./node_modules/@dojo/widget-core/decorators/inject.js"); -var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/widget-core/decorators/handleDecorator.js"); -var diffProperty_1 = __webpack_require__("./node_modules/@dojo/widget-core/decorators/diffProperty.js"); -var diff_1 = __webpack_require__("./node_modules/@dojo/widget-core/diff.js"); +var Injector_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/Injector.js"); +var inject_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/inject.js"); +var handleDecorator_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/handleDecorator.js"); +var diffProperty_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/diffProperty.js"); +var diff_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/diff.js"); var THEME_KEY = ' _key'; exports.INJECTED_THEME_KEY = Symbol('theme'); /** @@ -4525,10 +4471,7 @@ function ThemedMixin(Base) { }; tslib_1.__decorate([ diffProperty_1.diffProperty('theme', diff_1.shallow), - diffProperty_1.diffProperty('extraClasses', diff_1.shallow), - tslib_1.__metadata("design:type", Function), - tslib_1.__metadata("design:paramtypes", []), - tslib_1.__metadata("design:returntype", void 0) + diffProperty_1.diffProperty('extraClasses', diff_1.shallow) ], Themed.prototype, "onPropertiesChanged", null); Themed = tslib_1.__decorate([ inject_1.inject({ @@ -4550,20 +4493,20 @@ exports.default = ThemedMixin; /***/ }), -/***/ "./node_modules/@dojo/widget-core/registerCustomElement.js": +/***/ "./node_modules/@dojo/framework/widget-core/registerCustomElement.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var WidgetBase_1 = __webpack_require__("./node_modules/@dojo/widget-core/WidgetBase.js"); -var Projector_1 = __webpack_require__("./node_modules/@dojo/widget-core/mixins/Projector.js"); -var array_1 = __webpack_require__("./node_modules/@dojo/shim/array.js"); -var d_1 = __webpack_require__("./node_modules/@dojo/widget-core/d.js"); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); -var Themed_1 = __webpack_require__("./node_modules/@dojo/widget-core/mixins/Themed.js"); -var alwaysRender_1 = __webpack_require__("./node_modules/@dojo/widget-core/decorators/alwaysRender.js"); +var WidgetBase_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/WidgetBase.js"); +var Projector_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/mixins/Projector.js"); +var array_1 = __webpack_require__("./node_modules/@dojo/framework/shim/array.js"); +var d_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); +var Themed_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/mixins/Themed.js"); +var alwaysRender_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/alwaysRender.js"); var CustomElementChildType; (function (CustomElementChildType) { CustomElementChildType["DOJO"] = "DOJO"; @@ -4807,24 +4750,26 @@ exports.default = register; /***/ }), -/***/ "./node_modules/@dojo/widget-core/vdom.js": +/***/ "./node_modules/@dojo/framework/widget-core/vdom.js": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = __webpack_require__("./node_modules/tslib/tslib.es6.js"); -var global_1 = __webpack_require__("./node_modules/@dojo/shim/global.js"); -var array_1 = __webpack_require__("./node_modules/@dojo/shim/array.js"); -var d_1 = __webpack_require__("./node_modules/@dojo/widget-core/d.js"); -var Registry_1 = __webpack_require__("./node_modules/@dojo/widget-core/Registry.js"); -var WeakMap_1 = __webpack_require__("./node_modules/@dojo/shim/WeakMap.js"); +var global_1 = __webpack_require__("./node_modules/@dojo/framework/shim/global.js"); +var array_1 = __webpack_require__("./node_modules/@dojo/framework/shim/array.js"); +var d_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.js"); +var Registry_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/Registry.js"); +var WeakMap_1 = __webpack_require__("./node_modules/@dojo/framework/shim/WeakMap.js"); var NAMESPACE_W3 = 'http://www.w3.org/'; var NAMESPACE_SVG = NAMESPACE_W3 + '2000/svg'; var NAMESPACE_XLINK = NAMESPACE_W3 + '1999/xlink'; var emptyArray = []; +var nodeOperations = ['focus', 'blur', 'scrollIntoView', 'click']; exports.widgetInstanceMap = new WeakMap_1.default(); var instanceMap = new WeakMap_1.default(); +var nextSiblingMap = new WeakMap_1.default(); var projectorStateMap = new WeakMap_1.default(); function same(dnode1, dnode2) { if (d_1.isVNode(dnode1) && d_1.isVNode(dnode2)) { @@ -4942,7 +4887,7 @@ function buildPreviousProperties(domNode, previous, current) { }, {}); return newProperties; } -function focusNode(propValue, previousValue, domNode, projectionOptions) { +function nodeOperation(propName, propValue, previousValue, domNode, projectionOptions) { var result; if (typeof propValue === 'function') { result = propValue(); @@ -4953,7 +4898,7 @@ function focusNode(propValue, previousValue, domNode, projectionOptions) { if (result === true) { var projectorState = projectorStateMap.get(projectionOptions.projectorInstance); projectorState.deferredRenderCallbacks.push(function () { - domNode.focus(); + domNode[propName](); }); } } @@ -5051,8 +4996,8 @@ function updateProperties(domNode, previousProperties, properties, projectionOpt } } } - else if (propName === 'focus') { - focusNode(propValue, previousValue, domNode, projectionOptions); + else if (nodeOperations.indexOf(propName) !== -1) { + nodeOperation(propName, propValue, previousValue, domNode, projectionOptions); } else if (propName === 'styles') { var styleNames = Object.keys(propValue); @@ -5209,7 +5154,8 @@ function nodeAdded(dnode, transitions) { } function nodeToRemove(dnode, transitions, projectionOptions) { if (d_1.isWNode(dnode)) { - var rendered = dnode.rendered || emptyArray; + var item = instanceMap.get(dnode.instance); + var rendered = (item ? item.dnode.rendered : dnode.rendered) || emptyArray; if (dnode.instance) { var instanceData = exports.widgetInstanceMap.get(dnode.instance); instanceData.onDetach(); @@ -5273,7 +5219,7 @@ function checkDistinguishable(childNodes, indexToCheck, parentInstance) { } } } -function updateChildren(parentVNode, oldChildren, newChildren, parentInstance, projectionOptions) { +function updateChildren(parentVNode, siblings, oldChildren, newChildren, parentInstance, projectionOptions) { oldChildren = oldChildren || emptyArray; newChildren = newChildren; var oldChildrenLength = oldChildren.length; @@ -5293,38 +5239,49 @@ function updateChildren(parentVNode, oldChildren, newChildren, parentInstance, p addDeferredProperties(newChild, projectionOptions); } if (oldChild !== undefined && same(oldChild, newChild)) { - textUpdated = updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance) || textUpdated; oldIndex++; newIndex++; + textUpdated = + updateDom(oldChild, newChild, projectionOptions, parentVNode, parentInstance, oldChildren.slice(oldIndex), newChildren.slice(newIndex)) || textUpdated; return "continue"; } var findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1); var addChild = function () { var insertBeforeDomNode = undefined; + var childrenArray = oldChildren; + var nextIndex = oldIndex + 1; var child = oldChildren[oldIndex]; + if (!child) { + child = siblings[0]; + nextIndex = 1; + childrenArray = siblings; + } if (child) { - var nextIndex = oldIndex + 1; var insertBeforeChildren = [child]; while (insertBeforeChildren.length) { var insertBefore = insertBeforeChildren.shift(); if (d_1.isWNode(insertBefore)) { - if (insertBefore.rendered) { - insertBeforeChildren.push.apply(insertBeforeChildren, tslib_1.__spread(insertBefore.rendered)); + var item = instanceMap.get(insertBefore.instance); + if (item && item.dnode.rendered) { + insertBeforeChildren.push.apply(insertBeforeChildren, tslib_1.__spread(item.dnode.rendered)); } } else { if (insertBefore.domNode) { + if (insertBefore.domNode.parentElement !== parentVNode.domNode) { + break; + } insertBeforeDomNode = insertBefore.domNode; break; } } - if (insertBeforeChildren.length === 0 && oldChildren[nextIndex]) { - insertBeforeChildren.push(oldChildren[nextIndex]); + if (insertBeforeChildren.length === 0 && childrenArray[nextIndex]) { + insertBeforeChildren.push(childrenArray[nextIndex]); nextIndex++; } } } - createDom(newChild, parentVNode, insertBeforeDomNode, projectionOptions, parentInstance); + createDom(newChild, parentVNode, newChildren.slice(newIndex + 1), insertBeforeDomNode, projectionOptions, parentInstance); nodeAdded(newChild, transitions); var indexToCheck = newIndex; projectorState.afterRenderCallbacks.push(function () { @@ -5398,6 +5355,7 @@ function addChildren(parentVNode, children, projectionOptions, parentInstance, i projectionOptions = tslib_1.__assign({}, projectionOptions, { depth: projectionOptions.depth + 1 }); for (var i = 0; i < children.length; i++) { var child = children[i]; + var nextSiblings = children.slice(i + 1); if (d_1.isVNode(child)) { if (projectorState.merge && childNodes) { var domElement = undefined; @@ -5408,10 +5366,10 @@ function addChildren(parentVNode, children, projectionOptions, parentInstance, i } } } - createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance); + createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance); } else { - createDom(child, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes); + createDom(child, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes); } nodeAdded(child, transitions); } @@ -5439,7 +5397,7 @@ function initPropertiesAndChildren(domNode, dnode, parentInstance, projectionOpt } dnode.inserted = true; } -function createDom(dnode, parentVNode, insertBefore, projectionOptions, parentInstance, childNodes) { +function createDom(dnode, parentVNode, nextSiblings, insertBefore, projectionOptions, parentInstance, childNodes) { var domNode; var projectorState = projectorStateMap.get(projectionOptions.projectorInstance); if (d_1.isWNode(dnode)) { @@ -5454,6 +5412,7 @@ function createDom(dnode, parentVNode, insertBefore, projectionOptions, parentIn } var instance_1 = new widgetConstructor(); dnode.instance = instance_1; + nextSiblingMap.set(instance_1, nextSiblings); var instanceData_1 = exports.widgetInstanceMap.get(instance_1); instanceData_1.invalidate = function () { instanceData_1.dirty = true; @@ -5534,7 +5493,7 @@ function createDom(dnode, parentVNode, insertBefore, projectionOptions, parentIn } } } -function updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance) { +function updateDom(previous, dnode, projectionOptions, parentVNode, parentInstance, oldNextSiblings, nextSiblings) { if (d_1.isWNode(dnode)) { var instance = previous.instance; var _a = instanceMap.get(instance), parentVNode_1 = _a.parentVNode, node = _a.dnode; @@ -5544,12 +5503,13 @@ function updateDom(previous, dnode, projectionOptions, parentVNode, parentInstan instance.__setCoreProperties__(dnode.coreProperties); instance.__setChildren__(dnode.children); instance.__setProperties__(dnode.properties); + nextSiblingMap.set(instance, nextSiblings); dnode.instance = instance; if (instanceData.dirty === true) { var rendered = instance.__render__(); instanceData.rendering = false; dnode.rendered = filterAndDecorateChildren(rendered, instance); - updateChildren(parentVNode_1, previousRendered, dnode.rendered, instance, projectionOptions); + updateChildren(parentVNode_1, oldNextSiblings, previousRendered, dnode.rendered, instance, projectionOptions); } else { instanceData.rendering = false; @@ -5582,7 +5542,7 @@ function updateDom(previous, dnode, projectionOptions, parentVNode, parentInstan var children = filterAndDecorateChildren(dnode.children, parentInstance); dnode.children = children; updated = - updateChildren(dnode, previous.children, children, parentInstance, projectionOptions) || updated; + updateChildren(dnode, oldNextSiblings, previous.children, children, parentInstance, projectionOptions) || updated; } var previousProperties_1 = buildPreviousProperties(domNode_2, previous, dnode); if (dnode.attributes && dnode.events) { @@ -5693,7 +5653,8 @@ function render(projectionOptions) { previouslyRendered.push(instance); var _a = instanceMap.get(instance), parentVNode = _a.parentVNode, dnode = _a.dnode; var instanceData = exports.widgetInstanceMap.get(instance); - updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance); + var nextSiblings = nextSiblingMap.get(instance); + updateDom(dnode, toInternalWNode(instance, instanceData), projectionOptions, parentVNode, instance, nextSiblings, nextSiblings); } } runAfterRenderCallbacks(projectionOptions); @@ -5725,7 +5686,7 @@ exports.dom = { scheduleRender(finalProjectorOptions); } }; - updateDom(node, node, finalProjectorOptions, parentVNode, instance); + updateDom(node, node, finalProjectorOptions, parentVNode, instance, [], []); projectorState.afterRenderCallbacks.push(function () { instanceData.onAttach(); }); @@ -5751,6 +5712,43 @@ exports.dom = { /***/ }), +/***/ "./node_modules/@dojo/webpack-contrib/css-module-decorator-loader/index.js!./node_modules/css-loader/index.js?{\"modules\":true,\"sourceMap\":true,\"importLoaders\":1,\"localIdentName\":\"[hash:base64:8]\"}!./node_modules/postcss-loader/lib/index.js?{\"ident\":\"postcss\",\"plugins\":[null,{\"version\":\"6.0.23\",\"plugins\":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],\"postcssPlugin\":\"postcss-cssnext\",\"postcssVersion\":\"6.0.23\"}]}!./node_modules/@dojo/webpack-contrib/css-module-dts-loader/index.js?type=css!./src/menu-item/menuItem.m.css": +/***/ (function(module, exports, __webpack_require__) { + +exports = module.exports = __webpack_require__("./node_modules/css-loader/lib/css-base.js")(true); +// imports + + +// module +exports.push([module.i, ".sUmUi4Sh {\r\n\theight: 100%;\r\n\tdisplay: inline-block;\r\n}\r\n\r\n._2Mk6Rdqa {\r\n\tcolor: #fff;\r\n\ttext-decoration: none;\r\n\tmargin: 0 6.4px;\r\n\tposition: relative;\r\n\tdisplay: -webkit-box;\r\n\tdisplay: -ms-flexbox;\r\n\tdisplay: flex;\r\n\t-webkit-box-orient: vertical;\r\n\t-webkit-box-direction: normal;\r\n\t -ms-flex-direction: column;\r\n\t flex-direction: column;\r\n\t-webkit-box-pack: center;\r\n\t -ms-flex-pack: center;\r\n\t justify-content: center;\r\n\theight: 48px;\r\n\tcursor: pointer;\r\n}\r\n\r\n._2Mk6Rdqa::after {\r\n\tdisplay: block;\r\n\tcontent: \"\";\r\n\tbackground: #fff;\r\n\theight: 2px;\r\n\tposition: absolute;\r\n\twidth: 100%;\r\n\tbottom: 0;\r\n\t-webkit-transition: -webkit-transform .3s ease-out;\r\n\ttransition: -webkit-transform .3s ease-out;\r\n\ttransition: transform .3s ease-out;\r\n\ttransition: transform .3s ease-out, -webkit-transform .3s ease-out;\r\n\t-webkit-transform: translateY(3px);\r\n\t transform: translateY(3px);\r\n}\r\n\r\n._1-f3ItOh::after {\r\n\t-webkit-transform: translateY(0);\r\n\t transform: translateY(0);\r\n}\r\n", "", {"version":3,"sources":["C:/Users/IEUser/Desktop/cli-build-widget/test-app/src/menu-item/menuItem.m.css"],"names":[],"mappings":"AAAA;CACC,aAAa;CACb,sBAAsB;CACtB;;AAED;CACC,YAAY;CACZ,sBAAsB;CACtB,gBAAgB;CAChB,mBAAmB;CACnB,qBAAqB;CACrB,qBAAqB;CACrB,cAAc;CACd,6BAA6B;CAC7B,8BAA8B;KAC1B,2BAA2B;SACvB,uBAAuB;CAC/B,yBAAyB;KACrB,sBAAsB;SAClB,wBAAwB;CAChC,aAAa;CACb,gBAAgB;CAChB;;AAED;CACC,eAAe;CACf,YAAY;CACZ,iBAAiB;CACjB,YAAY;CACZ,mBAAmB;CACnB,YAAY;CACZ,UAAU;CACV,mDAAmD;CACnD,2CAA2C;CAC3C,mCAAmC;CACnC,mEAAmE;CACnE,mCAAmC;SAC3B,2BAA2B;CACnC;;AAED;CACC,iCAAiC;SACzB,yBAAyB;CACjC","file":"menuItem.m.css","sourcesContent":[".root {\r\n\theight: 100%;\r\n\tdisplay: inline-block;\r\n}\r\n\r\n.item {\r\n\tcolor: #fff;\r\n\ttext-decoration: none;\r\n\tmargin: 0 6.4px;\r\n\tposition: relative;\r\n\tdisplay: -webkit-box;\r\n\tdisplay: -ms-flexbox;\r\n\tdisplay: flex;\r\n\t-webkit-box-orient: vertical;\r\n\t-webkit-box-direction: normal;\r\n\t -ms-flex-direction: column;\r\n\t flex-direction: column;\r\n\t-webkit-box-pack: center;\r\n\t -ms-flex-pack: center;\r\n\t justify-content: center;\r\n\theight: 48px;\r\n\tcursor: pointer;\r\n}\r\n\r\n.item::after {\r\n\tdisplay: block;\r\n\tcontent: \"\";\r\n\tbackground: #fff;\r\n\theight: 2px;\r\n\tposition: absolute;\r\n\twidth: 100%;\r\n\tbottom: 0;\r\n\t-webkit-transition: -webkit-transform .3s ease-out;\r\n\ttransition: -webkit-transform .3s ease-out;\r\n\ttransition: transform .3s ease-out;\r\n\ttransition: transform .3s ease-out, -webkit-transform .3s ease-out;\r\n\t-webkit-transform: translateY(3px);\r\n\t transform: translateY(3px);\r\n}\r\n\r\n.selected::after {\r\n\t-webkit-transform: translateY(0);\r\n\t transform: translateY(0);\r\n}\r\n"],"sourceRoot":""}]); + +// exports +exports.locals = {" _key": "test-app/menuItem", + "root": "sUmUi4Sh", + "item": "_2Mk6Rdqa", + "selected": "_1-f3ItOh" +}; + +/***/ }), + +/***/ "./node_modules/@dojo/webpack-contrib/css-module-decorator-loader/index.js!./node_modules/css-loader/index.js?{\"modules\":true,\"sourceMap\":true,\"importLoaders\":1,\"localIdentName\":\"[hash:base64:8]\"}!./node_modules/postcss-loader/lib/index.js?{\"ident\":\"postcss\",\"plugins\":[null,{\"version\":\"6.0.23\",\"plugins\":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],\"postcssPlugin\":\"postcss-cssnext\",\"postcssVersion\":\"6.0.23\"}]}!./node_modules/@dojo/webpack-contrib/css-module-dts-loader/index.js?type=css!./src/menu/menu.m.css": +/***/ (function(module, exports, __webpack_require__) { + +exports = module.exports = __webpack_require__("./node_modules/css-loader/lib/css-base.js")(true); +// imports + + +// module +exports.push([module.i, "._3bA6jdSn {\r\n\twidth: 100%;\r\n\ttop: 0;\r\n\theight: 48px;\r\n\tz-index: 100;\r\n\tbackground-color: #1d1f20;\r\n}\r\n\r\n._1eoGfqku {\r\n\theight: 100%;\r\n\tmargin: 0 auto;\r\n}\r\n", "", {"version":3,"sources":["C:/Users/IEUser/Desktop/cli-build-widget/test-app/src/menu/menu.m.css"],"names":[],"mappings":"AAAA;CACC,YAAY;CACZ,OAAO;CACP,aAAa;CACb,aAAa;CACb,0BAA0B;CAC1B;;AAED;CACC,aAAa;CACb,eAAe;CACf","file":"menu.m.css","sourcesContent":[".root {\r\n\twidth: 100%;\r\n\ttop: 0;\r\n\theight: 48px;\r\n\tz-index: 100;\r\n\tbackground-color: #1d1f20;\r\n}\r\n\r\n.menuContainer {\r\n\theight: 100%;\r\n\tmargin: 0 auto;\r\n}\r\n"],"sourceRoot":""}]); + +// exports +exports.locals = {" _key": "test-app/menu", + "root": "_3bA6jdSn", + "menuContainer": "_1eoGfqku" +}; + +/***/ }), + /***/ "./node_modules/css-loader/lib/css-base.js": /***/ (function(module, exports) { @@ -13220,7 +13218,7 @@ module.exports = g; /***/ (function(module, exports, __webpack_require__) { "use strict"; -var cov_2k23f93zom=function(){var path="C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\src\\menu-item\\MenuItem.ts",hash="e17f8dd631e603ffe41ae0ac2a2903f34de51c1a",global=new Function('return this')(),gcv="__coverage__",coverageData={path:"C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\src\\menu-item\\MenuItem.ts",statementMap:{"0":{start:{line:2,column:0},end:{line:2,column:62}},"1":{start:{line:3,column:14},end:{line:3,column:30}},"2":{start:{line:4,column:10},end:{line:4,column:40}},"3":{start:{line:5,column:22},end:{line:5,column:75}},"4":{start:{line:6,column:15},end:{line:6,column:57}},"5":{start:{line:7,column:19},end:{line:7,column:58}},"6":{start:{line:8,column:10},end:{line:8,column:37}},"7":{start:{line:9,column:30},end:{line:36,column:48}},"8":{start:{line:10,column:4},end:{line:10,column:40}},"9":{start:{line:12,column:8},end:{line:12,column:72}},"10":{start:{line:14,column:4},end:{line:16,column:6}},"11":{start:{line:15,column:8},end:{line:15,column:87}},"12":{start:{line:17,column:4},end:{line:25,column:6}},"13":{start:{line:18,column:17},end:{line:18,column:32}},"14":{start:{line:18,column:42},end:{line:18,column:50}},"15":{start:{line:18,column:63},end:{line:18,column:74}},"16":{start:{line:19,column:8},end:{line:24,column:11}},"17":{start:{line:26,column:4},end:{line:34,column:17}},"18":{start:{line:35,column:4},end:{line:35,column:20}},"19":{start:{line:37,column:0},end:{line:37,column:28}},"20":{start:{line:38,column:0},end:{line:38,column:27}}},fnMap:{"0":{name:"(anonymous_0)",decl:{start:{line:9,column:30},end:{line:9,column:31}},loc:{start:{line:9,column:48},end:{line:36,column:1}},line:9},"1":{name:"MenuItem",decl:{start:{line:11,column:13},end:{line:11,column:21}},loc:{start:{line:11,column:24},end:{line:13,column:5}},line:11},"2":{name:"(anonymous_2)",decl:{start:{line:14,column:34},end:{line:14,column:35}},loc:{start:{line:14,column:46},end:{line:16,column:5}},line:14},"3":{name:"(anonymous_3)",decl:{start:{line:17,column:32},end:{line:17,column:33}},loc:{start:{line:17,column:44},end:{line:25,column:5}},line:17}},branchMap:{"0":{loc:{start:{line:12,column:15},end:{line:12,column:71}},type:"binary-expr",locations:[{start:{line:12,column:15},end:{line:12,column:30}},{start:{line:12,column:34},end:{line:12,column:63}},{start:{line:12,column:67},end:{line:12,column:71}}],line:12},"1":{loc:{start:{line:15,column:8},end:{line:15,column:86}},type:"binary-expr",locations:[{start:{line:15,column:8},end:{line:15,column:34}},{start:{line:15,column:38},end:{line:15,column:86}}],line:15},"2":{loc:{start:{line:21,column:47},end:{line:21,column:77}},type:"cond-expr",locations:[{start:{line:21,column:58},end:{line:21,column:70}},{start:{line:21,column:73},end:{line:21,column:77}}],line:21}},s:{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0},f:{"0":0,"1":0,"2":0,"3":0},b:{"0":[0,0,0],"1":[0,0],"2":[0,0]},inputSourceMap:{version:3,sources:["C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\src\\menu-item\\MenuItem.ts"],names:[],mappings:";;;AAAA,CAAA,CAAA,EAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAEA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAEA,CAAA,CAAA,EAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CA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",file:"C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\src\\menu-item\\MenuItem.ts",sourcesContent:["import { v } from '@dojo/widget-core/d';\r\nimport { customElement } from '@dojo/widget-core/decorators/customElement';\r\nimport { WidgetProperties } from '@dojo/widget-core/interfaces';\r\nimport { theme, ThemedMixin } from '@dojo/widget-core/mixins/Themed';\r\nimport { WidgetBase } from '@dojo/widget-core/WidgetBase';\r\n\r\nimport * as css from './menuItem.m.css';\r\n\r\nexport interface MenuItemProperties extends WidgetProperties {\r\n\ttitle: string;\r\n\tselected?: boolean;\r\n\tdata?: any;\r\n\tonSelected?: (data: any) => void;\r\n}\r\n\r\n@customElement({\r\n\ttag: 'demo-menu-item',\r\n\tattributes: ['title', 'selected'],\r\n\tevents: ['onSelected'],\r\n\tproperties: ['data', 'selected']\r\n})\r\n@theme(css)\r\nexport class MenuItem extends ThemedMixin(WidgetBase) {\r\n\tprivate _onClick() {\r\n\t\tthis.properties.onSelected && this.properties.onSelected(this.properties.data);\r\n\t}\r\n\r\n\tprotected render() {\r\n\t\tconst { title, selected } = this.properties;\r\n\r\n\t\treturn v('li', { classes: this.theme(css.root) }, [\r\n\t\t\tv(\r\n\t\t\t\t'span',\r\n\t\t\t\t{\r\n\t\t\t\t\tclasses: this.theme([css.item, selected ? css.selected : null]),\r\n\t\t\t\t\tonclick: this._onClick\r\n\t\t\t\t},\r\n\t\t\t\t[title]\r\n\t\t\t)\r\n\t\t]);\r\n\t}\r\n}\r\n\r\nexport default MenuItem;\r\n"]},_coverageSchema:"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c"},coverage=global[gcv]||(global[gcv]={});if(coverage[path]&&coverage[path].hash===hash){return coverage[path];}coverageData.hash=hash;return coverage[path]=coverageData;}();cov_2k23f93zom.s[0]++;Object.defineProperty(exports,"__esModule",{value:true});var tslib_1=(cov_2k23f93zom.s[1]++,__webpack_require__("./node_modules/tslib/tslib.es6.js"));var d_1=(cov_2k23f93zom.s[2]++,__webpack_require__("./node_modules/@dojo/widget-core/d.js"));var customElement_1=(cov_2k23f93zom.s[3]++,__webpack_require__("./node_modules/@dojo/widget-core/decorators/customElement.js"));var Themed_1=(cov_2k23f93zom.s[4]++,__webpack_require__("./node_modules/@dojo/widget-core/mixins/Themed.js"));var WidgetBase_1=(cov_2k23f93zom.s[5]++,__webpack_require__("./node_modules/@dojo/widget-core/WidgetBase.js"));var css=(cov_2k23f93zom.s[6]++,__webpack_require__("./src/menu-item/menuItem.m.css"));var MenuItem=(/** @class */cov_2k23f93zom.s[7]++,function(_super){cov_2k23f93zom.f[0]++;cov_2k23f93zom.s[8]++;tslib_1.__extends(MenuItem,_super);function MenuItem(){cov_2k23f93zom.f[1]++;cov_2k23f93zom.s[9]++;return(cov_2k23f93zom.b[0][0]++,_super!==null)&&(cov_2k23f93zom.b[0][1]++,_super.apply(this,arguments))||(cov_2k23f93zom.b[0][2]++,this);}cov_2k23f93zom.s[10]++;MenuItem.prototype._onClick=function(){cov_2k23f93zom.f[2]++;cov_2k23f93zom.s[11]++;(cov_2k23f93zom.b[1][0]++,this.properties.onSelected)&&(cov_2k23f93zom.b[1][1]++,this.properties.onSelected(this.properties.data));};cov_2k23f93zom.s[12]++;MenuItem.prototype.render=function(){cov_2k23f93zom.f[3]++;var _a=(cov_2k23f93zom.s[13]++,this.properties),title=(cov_2k23f93zom.s[14]++,_a.title),selected=(cov_2k23f93zom.s[15]++,_a.selected);cov_2k23f93zom.s[16]++;return d_1.v('li',{classes:this.theme(css.root)},[d_1.v('span',{classes:this.theme([css.item,selected?(cov_2k23f93zom.b[2][0]++,css.selected):(cov_2k23f93zom.b[2][1]++,null)]),onclick:this._onClick},[title])]);};cov_2k23f93zom.s[17]++;MenuItem=tslib_1.__decorate([customElement_1.customElement({tag:'demo-menu-item',attributes:['title','selected'],events:['onSelected'],properties:['data','selected']}),Themed_1.theme(css)],MenuItem);cov_2k23f93zom.s[18]++;return MenuItem;}(Themed_1.ThemedMixin(WidgetBase_1.WidgetBase)));cov_2k23f93zom.s[19]++;exports.MenuItem=MenuItem;cov_2k23f93zom.s[20]++;exports.default=MenuItem; +var cov_2k23f93zom=function(){var path="C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\src\\menu-item\\MenuItem.ts",hash="cfaf6f318b70cece763698814f5c5e28a4aa65b6",Function=function(){}.constructor,global=new Function('return this')(),gcv="__coverage__",coverageData={path:"C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\src\\menu-item\\MenuItem.ts",statementMap:{"0":{start:{line:2,column:0},end:{line:2,column:62}},"1":{start:{line:3,column:14},end:{line:3,column:30}},"2":{start:{line:4,column:10},end:{line:4,column:50}},"3":{start:{line:5,column:22},end:{line:5,column:85}},"4":{start:{line:6,column:15},end:{line:6,column:67}},"5":{start:{line:7,column:19},end:{line:7,column:68}},"6":{start:{line:8,column:10},end:{line:8,column:37}},"7":{start:{line:9,column:30},end:{line:36,column:48}},"8":{start:{line:10,column:4},end:{line:10,column:40}},"9":{start:{line:12,column:8},end:{line:12,column:72}},"10":{start:{line:14,column:4},end:{line:16,column:6}},"11":{start:{line:15,column:8},end:{line:15,column:87}},"12":{start:{line:17,column:4},end:{line:25,column:6}},"13":{start:{line:18,column:17},end:{line:18,column:32}},"14":{start:{line:18,column:42},end:{line:18,column:50}},"15":{start:{line:18,column:63},end:{line:18,column:74}},"16":{start:{line:19,column:8},end:{line:24,column:11}},"17":{start:{line:26,column:4},end:{line:34,column:17}},"18":{start:{line:35,column:4},end:{line:35,column:20}},"19":{start:{line:37,column:0},end:{line:37,column:28}},"20":{start:{line:38,column:0},end:{line:38,column:27}}},fnMap:{"0":{name:"(anonymous_0)",decl:{start:{line:9,column:30},end:{line:9,column:31}},loc:{start:{line:9,column:48},end:{line:36,column:1}},line:9},"1":{name:"MenuItem",decl:{start:{line:11,column:13},end:{line:11,column:21}},loc:{start:{line:11,column:24},end:{line:13,column:5}},line:11},"2":{name:"(anonymous_2)",decl:{start:{line:14,column:34},end:{line:14,column:35}},loc:{start:{line:14,column:46},end:{line:16,column:5}},line:14},"3":{name:"(anonymous_3)",decl:{start:{line:17,column:32},end:{line:17,column:33}},loc:{start:{line:17,column:44},end:{line:25,column:5}},line:17}},branchMap:{"0":{loc:{start:{line:12,column:15},end:{line:12,column:71}},type:"binary-expr",locations:[{start:{line:12,column:15},end:{line:12,column:30}},{start:{line:12,column:34},end:{line:12,column:63}},{start:{line:12,column:67},end:{line:12,column:71}}],line:12},"1":{loc:{start:{line:15,column:8},end:{line:15,column:86}},type:"binary-expr",locations:[{start:{line:15,column:8},end:{line:15,column:34}},{start:{line:15,column:38},end:{line:15,column:86}}],line:15},"2":{loc:{start:{line:21,column:47},end:{line:21,column:77}},type:"cond-expr",locations:[{start:{line:21,column:58},end:{line:21,column:70}},{start:{line:21,column:73},end:{line:21,column:77}}],line:21}},s:{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0},f:{"0":0,"1":0,"2":0,"3":0},b:{"0":[0,0,0],"1":[0,0],"2":[0,0]},inputSourceMap:{version:3,sources:["C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\src\\menu-item\\MenuItem.ts"],names:[],mappings:";;;AAAA,CAAA,CAAA,EAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAEA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CA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",file:"C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\src\\menu-item\\MenuItem.ts",sourcesContent:["import { v } from '@dojo/framework/widget-core/d';\r\nimport { customElement } from '@dojo/framework/widget-core/decorators/customElement';\r\nimport { WidgetProperties } from '@dojo/framework/widget-core/interfaces';\r\nimport { theme, ThemedMixin } from '@dojo/framework/widget-core/mixins/Themed';\r\nimport { WidgetBase } from '@dojo/framework/widget-core/WidgetBase';\r\n\r\nimport * as css from './menuItem.m.css';\r\n\r\nexport interface MenuItemProperties extends WidgetProperties {\r\n\ttitle: string;\r\n\tselected?: boolean;\r\n\tdata?: any;\r\n\tonSelected?: (data: any) => void;\r\n}\r\n\r\n@customElement({\r\n\ttag: 'demo-menu-item',\r\n\tattributes: ['title', 'selected'],\r\n\tevents: ['onSelected'],\r\n\tproperties: ['data', 'selected']\r\n})\r\n@theme(css)\r\nexport class MenuItem extends ThemedMixin(WidgetBase) {\r\n\tprivate _onClick() {\r\n\t\tthis.properties.onSelected && this.properties.onSelected(this.properties.data);\r\n\t}\r\n\r\n\tprotected render() {\r\n\t\tconst { title, selected } = this.properties;\r\n\r\n\t\treturn v('li', { classes: this.theme(css.root) }, [\r\n\t\t\tv(\r\n\t\t\t\t'span',\r\n\t\t\t\t{\r\n\t\t\t\t\tclasses: this.theme([css.item, selected ? css.selected : null]),\r\n\t\t\t\t\tonclick: this._onClick\r\n\t\t\t\t},\r\n\t\t\t\t[title]\r\n\t\t\t)\r\n\t\t]);\r\n\t}\r\n}\r\n\r\nexport default MenuItem;\r\n"]},_coverageSchema:"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c"},coverage=global[gcv]||(global[gcv]={});if(coverage[path]&&coverage[path].hash===hash){return coverage[path];}coverageData.hash=hash;return coverage[path]=coverageData;}();cov_2k23f93zom.s[0]++;Object.defineProperty(exports,"__esModule",{value:true});var tslib_1=(cov_2k23f93zom.s[1]++,__webpack_require__("./node_modules/tslib/tslib.es6.js"));var d_1=(cov_2k23f93zom.s[2]++,__webpack_require__("./node_modules/@dojo/framework/widget-core/d.js"));var customElement_1=(cov_2k23f93zom.s[3]++,__webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/customElement.js"));var Themed_1=(cov_2k23f93zom.s[4]++,__webpack_require__("./node_modules/@dojo/framework/widget-core/mixins/Themed.js"));var WidgetBase_1=(cov_2k23f93zom.s[5]++,__webpack_require__("./node_modules/@dojo/framework/widget-core/WidgetBase.js"));var css=(cov_2k23f93zom.s[6]++,__webpack_require__("./src/menu-item/menuItem.m.css"));var MenuItem=(cov_2k23f93zom.s[7]++,function(_super){cov_2k23f93zom.f[0]++;cov_2k23f93zom.s[8]++;tslib_1.__extends(MenuItem,_super);function MenuItem(){cov_2k23f93zom.f[1]++;cov_2k23f93zom.s[9]++;return(cov_2k23f93zom.b[0][0]++,_super!==null)&&(cov_2k23f93zom.b[0][1]++,_super.apply(this,arguments))||(cov_2k23f93zom.b[0][2]++,this);}cov_2k23f93zom.s[10]++;MenuItem.prototype._onClick=function(){cov_2k23f93zom.f[2]++;cov_2k23f93zom.s[11]++;(cov_2k23f93zom.b[1][0]++,this.properties.onSelected)&&(cov_2k23f93zom.b[1][1]++,this.properties.onSelected(this.properties.data));};cov_2k23f93zom.s[12]++;MenuItem.prototype.render=function(){cov_2k23f93zom.f[3]++;var _a=(cov_2k23f93zom.s[13]++,this.properties),title=(cov_2k23f93zom.s[14]++,_a.title),selected=(cov_2k23f93zom.s[15]++,_a.selected);cov_2k23f93zom.s[16]++;return d_1.v('li',{classes:this.theme(css.root)},[d_1.v('span',{classes:this.theme([css.item,selected?(cov_2k23f93zom.b[2][0]++,css.selected):(cov_2k23f93zom.b[2][1]++,null)]),onclick:this._onClick},[title])]);};cov_2k23f93zom.s[17]++;MenuItem=tslib_1.__decorate([customElement_1.customElement({tag:'demo-menu-item',attributes:['title','selected'],events:['onSelected'],properties:['data','selected']}),Themed_1.theme(css)],MenuItem);cov_2k23f93zom.s[18]++;return MenuItem;}(Themed_1.ThemedMixin(WidgetBase_1.WidgetBase)));cov_2k23f93zom.s[19]++;exports.MenuItem=MenuItem;cov_2k23f93zom.s[20]++;exports.default=MenuItem; /***/ }), @@ -13260,7 +13258,7 @@ if(false) { /***/ (function(module, exports, __webpack_require__) { "use strict"; -var cov_1ag1n6vand=function(){var path="C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\src\\menu\\Menu.ts",hash="b63b28122b04d04c7c09819946a001d35d03d6bf",global=new Function('return this')(),gcv="__coverage__",coverageData={path:"C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\src\\menu\\Menu.ts",statementMap:{"0":{start:{line:2,column:0},end:{line:2,column:62}},"1":{start:{line:3,column:14},end:{line:3,column:30}},"2":{start:{line:4,column:10},end:{line:4,column:40}},"3":{start:{line:5,column:22},end:{line:5,column:75}},"4":{start:{line:6,column:15},end:{line:6,column:57}},"5":{start:{line:7,column:19},end:{line:7,column:58}},"6":{start:{line:8,column:10},end:{line:8,column:33}},"7":{start:{line:9,column:26},end:{line:49,column:48}},"8":{start:{line:10,column:4},end:{line:10,column:36}},"9":{start:{line:12,column:8},end:{line:12,column:72}},"10":{start:{line:14,column:4},end:{line:18,column:6}},"11":{start:{line:15,column:8},end:{line:15,column:30}},"12":{start:{line:16,column:8},end:{line:16,column:41}},"13":{start:{line:17,column:8},end:{line:17,column:26}},"14":{start:{line:19,column:4},end:{line:40,column:6}},"15":{start:{line:20,column:20},end:{line:20,column:24}},"16":{start:{line:21,column:20},end:{line:34,column:10}},"17":{start:{line:22,column:12},end:{line:32,column:13}},"18":{start:{line:23,column:33},end:{line:27,column:17}},"19":{start:{line:25,column:24},end:{line:25,column:55}},"20":{start:{line:28,column:16},end:{line:30,column:17}},"21":{start:{line:29,column:20},end:{line:29,column:70}},"22":{start:{line:31,column:16},end:{line:31,column:86}},"23":{start:{line:33,column:12},end:{line:33,column:25}},"24":{start:{line:35,column:8},end:{line:39,column:11}},"25":{start:{line:41,column:4},end:{line:47,column:13}},"26":{start:{line:48,column:4},end:{line:48,column:16}},"27":{start:{line:50,column:0},end:{line:50,column:20}},"28":{start:{line:51,column:0},end:{line:51,column:23}}},fnMap:{"0":{name:"(anonymous_0)",decl:{start:{line:9,column:26},end:{line:9,column:27}},loc:{start:{line:9,column:44},end:{line:49,column:1}},line:9},"1":{name:"Menu",decl:{start:{line:11,column:13},end:{line:11,column:17}},loc:{start:{line:11,column:20},end:{line:13,column:5}},line:11},"2":{name:"(anonymous_2)",decl:{start:{line:14,column:33},end:{line:14,column:34}},loc:{start:{line:14,column:53},end:{line:18,column:5}},line:14},"3":{name:"(anonymous_3)",decl:{start:{line:19,column:28},end:{line:19,column:29}},loc:{start:{line:19,column:40},end:{line:40,column:5}},line:19},"4":{name:"(anonymous_4)",decl:{start:{line:21,column:38},end:{line:21,column:39}},loc:{start:{line:21,column:62},end:{line:34,column:9}},line:21},"5":{name:"(anonymous_5)",decl:{start:{line:24,column:32},end:{line:24,column:33}},loc:{start:{line:24,column:48},end:{line:26,column:21}},line:24}},branchMap:{"0":{loc:{start:{line:12,column:15},end:{line:12,column:71}},type:"binary-expr",locations:[{start:{line:12,column:15},end:{line:12,column:30}},{start:{line:12,column:34},end:{line:12,column:63}},{start:{line:12,column:67},end:{line:12,column:71}}],line:12},"1":{loc:{start:{line:22,column:12},end:{line:32,column:13}},type:"if",locations:[{start:{line:22,column:12},end:{line:32,column:13}},{start:{line:22,column:12},end:{line:32,column:13}}],line:22},"2":{loc:{start:{line:28,column:16},end:{line:30,column:17}},type:"if",locations:[{start:{line:28,column:16},end:{line:30,column:17}},{start:{line:28,column:16},end:{line:30,column:17}}],line:28}},s:{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0},f:{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0},b:{"0":[0,0,0],"1":[0,0],"2":[0,0]},inputSourceMap:{version:3,sources:["C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\src\\menu\\Menu.ts"],names:[],mappings:";;;AAAA,CAAA,CAAA,EAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAEA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAGA,CAAA,CAAA,EAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CA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",file:"C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\src\\menu\\Menu.ts",sourcesContent:["import { v } from '@dojo/widget-core/d';\r\nimport { customElement } from '@dojo/widget-core/decorators/customElement';\r\nimport { WidgetProperties, WNode } from '@dojo/widget-core/interfaces';\r\nimport { theme, ThemedMixin } from '@dojo/widget-core/mixins/Themed';\r\nimport { WidgetBase } from '@dojo/widget-core/WidgetBase';\r\nimport { MenuItem, MenuItemProperties } from '../menu-item/MenuItem';\r\n\r\nimport * as css from './menu.m.css';\r\n\r\ninterface MenuProperties extends WidgetProperties {\r\n\tonSelected: (data: any) => void;\r\n}\r\n\r\n@customElement({\r\n\ttag: 'demo-menu',\r\n\tevents: ['onSelected']\r\n})\r\n@theme(css)\r\nexport class Menu extends ThemedMixin(WidgetBase)> {\r\n\tprivate _selectedId: number;\r\n\r\n\tprivate _onSelected(id: number, data: any) {\r\n\t\tthis._selectedId = id;\r\n\t\tthis.properties.onSelected(data);\r\n\t\tthis.invalidate();\r\n\t}\r\n\r\n\tprotected render() {\r\n\t\tconst items = this.children.map((child, index) => {\r\n\t\t\tif (child) {\r\n\t\t\t\tconst properties: Partial = {\r\n\t\t\t\t\tonSelected: (data: any) => {\r\n\t\t\t\t\t\tthis._onSelected(index, data);\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\tif (this._selectedId !== undefined) {\r\n\t\t\t\t\tproperties.selected = index === this._selectedId;\r\n\t\t\t\t}\r\n\t\t\t\tchild.properties = { ...child.properties, ...properties };\r\n\t\t\t}\r\n\t\t\treturn child;\r\n\t\t});\r\n\r\n\t\treturn v('nav', { classes: this.theme(css.root) }, [\r\n\t\t\tv(\r\n\t\t\t\t'ol',\r\n\t\t\t\t{\r\n\t\t\t\t\tclasses: this.theme(css.menuContainer)\r\n\t\t\t\t},\r\n\t\t\t\titems\r\n\t\t\t)\r\n\t\t]);\r\n\t}\r\n}\r\n\r\nexport default Menu;\r\n"]},_coverageSchema:"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c"},coverage=global[gcv]||(global[gcv]={});if(coverage[path]&&coverage[path].hash===hash){return coverage[path];}coverageData.hash=hash;return coverage[path]=coverageData;}();cov_1ag1n6vand.s[0]++;Object.defineProperty(exports,"__esModule",{value:true});var tslib_1=(cov_1ag1n6vand.s[1]++,__webpack_require__("./node_modules/tslib/tslib.es6.js"));var d_1=(cov_1ag1n6vand.s[2]++,__webpack_require__("./node_modules/@dojo/widget-core/d.js"));var customElement_1=(cov_1ag1n6vand.s[3]++,__webpack_require__("./node_modules/@dojo/widget-core/decorators/customElement.js"));var Themed_1=(cov_1ag1n6vand.s[4]++,__webpack_require__("./node_modules/@dojo/widget-core/mixins/Themed.js"));var WidgetBase_1=(cov_1ag1n6vand.s[5]++,__webpack_require__("./node_modules/@dojo/widget-core/WidgetBase.js"));var css=(cov_1ag1n6vand.s[6]++,__webpack_require__("./src/menu/menu.m.css"));var Menu=(/** @class */cov_1ag1n6vand.s[7]++,function(_super){cov_1ag1n6vand.f[0]++;cov_1ag1n6vand.s[8]++;tslib_1.__extends(Menu,_super);function Menu(){cov_1ag1n6vand.f[1]++;cov_1ag1n6vand.s[9]++;return(cov_1ag1n6vand.b[0][0]++,_super!==null)&&(cov_1ag1n6vand.b[0][1]++,_super.apply(this,arguments))||(cov_1ag1n6vand.b[0][2]++,this);}cov_1ag1n6vand.s[10]++;Menu.prototype._onSelected=function(id,data){cov_1ag1n6vand.f[2]++;cov_1ag1n6vand.s[11]++;this._selectedId=id;cov_1ag1n6vand.s[12]++;this.properties.onSelected(data);cov_1ag1n6vand.s[13]++;this.invalidate();};cov_1ag1n6vand.s[14]++;Menu.prototype.render=function(){cov_1ag1n6vand.f[3]++;var _this=(cov_1ag1n6vand.s[15]++,this);var items=(cov_1ag1n6vand.s[16]++,this.children.map(function(child,index){cov_1ag1n6vand.f[4]++;cov_1ag1n6vand.s[17]++;if(child){cov_1ag1n6vand.b[1][0]++;var properties=(cov_1ag1n6vand.s[18]++,{onSelected:function(data){cov_1ag1n6vand.f[5]++;cov_1ag1n6vand.s[19]++;_this._onSelected(index,data);}});cov_1ag1n6vand.s[20]++;if(_this._selectedId!==undefined){cov_1ag1n6vand.b[2][0]++;cov_1ag1n6vand.s[21]++;properties.selected=index===_this._selectedId;}else{cov_1ag1n6vand.b[2][1]++;}cov_1ag1n6vand.s[22]++;child.properties=tslib_1.__assign({},child.properties,properties);}else{cov_1ag1n6vand.b[1][1]++;}cov_1ag1n6vand.s[23]++;return child;}));cov_1ag1n6vand.s[24]++;return d_1.v('nav',{classes:this.theme(css.root)},[d_1.v('ol',{classes:this.theme(css.menuContainer)},items)]);};cov_1ag1n6vand.s[25]++;Menu=tslib_1.__decorate([customElement_1.customElement({tag:'demo-menu',events:['onSelected']}),Themed_1.theme(css)],Menu);cov_1ag1n6vand.s[26]++;return Menu;}(Themed_1.ThemedMixin(WidgetBase_1.WidgetBase)));cov_1ag1n6vand.s[27]++;exports.Menu=Menu;cov_1ag1n6vand.s[28]++;exports.default=Menu; +var cov_1ag1n6vand=function(){var path="C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\src\\menu\\Menu.ts",hash="67c7e74d5b4b89cb2d2c80d3fe5bba0331dc767f",Function=function(){}.constructor,global=new Function('return this')(),gcv="__coverage__",coverageData={path:"C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\src\\menu\\Menu.ts",statementMap:{"0":{start:{line:2,column:0},end:{line:2,column:62}},"1":{start:{line:3,column:14},end:{line:3,column:30}},"2":{start:{line:4,column:10},end:{line:4,column:50}},"3":{start:{line:5,column:22},end:{line:5,column:85}},"4":{start:{line:6,column:15},end:{line:6,column:67}},"5":{start:{line:7,column:19},end:{line:7,column:68}},"6":{start:{line:8,column:10},end:{line:8,column:33}},"7":{start:{line:9,column:26},end:{line:49,column:48}},"8":{start:{line:10,column:4},end:{line:10,column:36}},"9":{start:{line:12,column:8},end:{line:12,column:72}},"10":{start:{line:14,column:4},end:{line:18,column:6}},"11":{start:{line:15,column:8},end:{line:15,column:30}},"12":{start:{line:16,column:8},end:{line:16,column:41}},"13":{start:{line:17,column:8},end:{line:17,column:26}},"14":{start:{line:19,column:4},end:{line:40,column:6}},"15":{start:{line:20,column:20},end:{line:20,column:24}},"16":{start:{line:21,column:20},end:{line:34,column:10}},"17":{start:{line:22,column:12},end:{line:32,column:13}},"18":{start:{line:23,column:33},end:{line:27,column:17}},"19":{start:{line:25,column:24},end:{line:25,column:55}},"20":{start:{line:28,column:16},end:{line:30,column:17}},"21":{start:{line:29,column:20},end:{line:29,column:70}},"22":{start:{line:31,column:16},end:{line:31,column:86}},"23":{start:{line:33,column:12},end:{line:33,column:25}},"24":{start:{line:35,column:8},end:{line:39,column:11}},"25":{start:{line:41,column:4},end:{line:47,column:13}},"26":{start:{line:48,column:4},end:{line:48,column:16}},"27":{start:{line:50,column:0},end:{line:50,column:20}},"28":{start:{line:51,column:0},end:{line:51,column:23}}},fnMap:{"0":{name:"(anonymous_0)",decl:{start:{line:9,column:26},end:{line:9,column:27}},loc:{start:{line:9,column:44},end:{line:49,column:1}},line:9},"1":{name:"Menu",decl:{start:{line:11,column:13},end:{line:11,column:17}},loc:{start:{line:11,column:20},end:{line:13,column:5}},line:11},"2":{name:"(anonymous_2)",decl:{start:{line:14,column:33},end:{line:14,column:34}},loc:{start:{line:14,column:53},end:{line:18,column:5}},line:14},"3":{name:"(anonymous_3)",decl:{start:{line:19,column:28},end:{line:19,column:29}},loc:{start:{line:19,column:40},end:{line:40,column:5}},line:19},"4":{name:"(anonymous_4)",decl:{start:{line:21,column:38},end:{line:21,column:39}},loc:{start:{line:21,column:62},end:{line:34,column:9}},line:21},"5":{name:"(anonymous_5)",decl:{start:{line:24,column:32},end:{line:24,column:33}},loc:{start:{line:24,column:48},end:{line:26,column:21}},line:24}},branchMap:{"0":{loc:{start:{line:12,column:15},end:{line:12,column:71}},type:"binary-expr",locations:[{start:{line:12,column:15},end:{line:12,column:30}},{start:{line:12,column:34},end:{line:12,column:63}},{start:{line:12,column:67},end:{line:12,column:71}}],line:12},"1":{loc:{start:{line:22,column:12},end:{line:32,column:13}},type:"if",locations:[{start:{line:22,column:12},end:{line:32,column:13}},{start:{line:22,column:12},end:{line:32,column:13}}],line:22},"2":{loc:{start:{line:28,column:16},end:{line:30,column:17}},type:"if",locations:[{start:{line:28,column:16},end:{line:30,column:17}},{start:{line:28,column:16},end:{line:30,column:17}}],line:28}},s:{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0},f:{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0},b:{"0":[0,0,0],"1":[0,0],"2":[0,0]},inputSourceMap:{version:3,sources:["C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\src\\menu\\Menu.ts"],names:[],mappings:";;;AAAA,CAAA,CAAA,EAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAEA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAGA,CAAA,CAAA,EAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAWA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA;IAA0B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IAA1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA;;IAmCA;IAhCS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAW,EAAnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAoB,CAAA,CAAU,EAAE,CAAA,CAAA,CAAA,CAAS,EAAA;QACxC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAW,EAAG,CAAA,CAAE;QACrB,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC;QAChC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAE;IAClB,CAAC;IAES,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAM,EAAhB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,EAAA;QAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA;QACC,CAAA,CAAA,EAAM,CAAA,CAAA,CAAA,CAAA,EAAK,EAAG,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,EAAE,CAAA,CAAA,CAAA,CAAA,CAAK,EAAA;YAC5C,CAAA,EAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,EAAE;gBACV,CAAA,CAAA,EAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAU,EAAgC;oBAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAC,CAAA,CAAA,CAAA,CAAS,EAAA;wBACrB,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,EAAE,CAAA,CAAA,CAAA,CAAI,CAAC;oBAC9B;iBACA;gBACD,CAAA,EAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAW,CAAA,CAAA,EAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE;oBACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAQ,EAAG,CAAA,CAAA,CAAA,CAAA,EAAK,CAAA,CAAA,EAAK,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW;gBACjD;gBACA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAU,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAQ,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,EAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE;YAC1D;YACA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAO,CAAA,CAAA,CAAA,CAAA,CAAK;QACb,CAAC,CAAC;QAEF,CAAA,CAAA,CAAA,CAAA,CAAA,EAAO,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,EAAE,EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAI,EAAC,CAAE,EAAE;YAClD,CAAA,CAAA,CAAA,CAAA,CAAC,CACA,CAAA,CAAA,CAAA,CAAI,EACJ;gBACC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa;aACrC,EACD,CAAA,CAAA,CAAA,CAAA,CAAK;SAEN,CAAC;IACH,CAAC;IAlCW,CAAA,CAAA,CAAA,EAAI,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QALhB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAiB;YAC9B,CAAA,CAAA,CAAG,EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW;YAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY;SACrB,CAAC;QACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAG;OACG,CAAA,CAAA,CAAA,CAAI,CAmChB;IAAD,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAC;CAnCD,CAA0B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA;AAApC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA;AAqCb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAe,CAAA,CAAA,CAAA,CAAI",file:"C:\\Users\\IEUser\\Desktop\\cli-build-widget\\test-app\\src\\menu\\Menu.ts",sourcesContent:["import { v } from '@dojo/framework/widget-core/d';\r\nimport { customElement } from '@dojo/framework/widget-core/decorators/customElement';\r\nimport { WidgetProperties, WNode } from '@dojo/framework/widget-core/interfaces';\r\nimport { theme, ThemedMixin } from '@dojo/framework/widget-core/mixins/Themed';\r\nimport { WidgetBase } from '@dojo/framework/widget-core/WidgetBase';\r\nimport { MenuItem, MenuItemProperties } from '../menu-item/MenuItem';\r\n\r\nimport * as css from './menu.m.css';\r\n\r\ninterface MenuProperties extends WidgetProperties {\r\n\tonSelected: (data: any) => void;\r\n}\r\n\r\n@customElement({\r\n\ttag: 'demo-menu',\r\n\tevents: ['onSelected']\r\n})\r\n@theme(css)\r\nexport class Menu extends ThemedMixin(WidgetBase)> {\r\n\tprivate _selectedId: number;\r\n\r\n\tprivate _onSelected(id: number, data: any) {\r\n\t\tthis._selectedId = id;\r\n\t\tthis.properties.onSelected(data);\r\n\t\tthis.invalidate();\r\n\t}\r\n\r\n\tprotected render() {\r\n\t\tconst items = this.children.map((child, index) => {\r\n\t\t\tif (child) {\r\n\t\t\t\tconst properties: Partial = {\r\n\t\t\t\t\tonSelected: (data: any) => {\r\n\t\t\t\t\t\tthis._onSelected(index, data);\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\tif (this._selectedId !== undefined) {\r\n\t\t\t\t\tproperties.selected = index === this._selectedId;\r\n\t\t\t\t}\r\n\t\t\t\tchild.properties = { ...child.properties, ...properties };\r\n\t\t\t}\r\n\t\t\treturn child;\r\n\t\t});\r\n\r\n\t\treturn v('nav', { classes: this.theme(css.root) }, [\r\n\t\t\tv(\r\n\t\t\t\t'ol',\r\n\t\t\t\t{\r\n\t\t\t\t\tclasses: this.theme(css.menuContainer)\r\n\t\t\t\t},\r\n\t\t\t\titems\r\n\t\t\t)\r\n\t\t]);\r\n\t}\r\n}\r\n\r\nexport default Menu;\r\n"]},_coverageSchema:"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c"},coverage=global[gcv]||(global[gcv]={});if(coverage[path]&&coverage[path].hash===hash){return coverage[path];}coverageData.hash=hash;return coverage[path]=coverageData;}();cov_1ag1n6vand.s[0]++;Object.defineProperty(exports,"__esModule",{value:true});var tslib_1=(cov_1ag1n6vand.s[1]++,__webpack_require__("./node_modules/tslib/tslib.es6.js"));var d_1=(cov_1ag1n6vand.s[2]++,__webpack_require__("./node_modules/@dojo/framework/widget-core/d.js"));var customElement_1=(cov_1ag1n6vand.s[3]++,__webpack_require__("./node_modules/@dojo/framework/widget-core/decorators/customElement.js"));var Themed_1=(cov_1ag1n6vand.s[4]++,__webpack_require__("./node_modules/@dojo/framework/widget-core/mixins/Themed.js"));var WidgetBase_1=(cov_1ag1n6vand.s[5]++,__webpack_require__("./node_modules/@dojo/framework/widget-core/WidgetBase.js"));var css=(cov_1ag1n6vand.s[6]++,__webpack_require__("./src/menu/menu.m.css"));var Menu=(cov_1ag1n6vand.s[7]++,function(_super){cov_1ag1n6vand.f[0]++;cov_1ag1n6vand.s[8]++;tslib_1.__extends(Menu,_super);function Menu(){cov_1ag1n6vand.f[1]++;cov_1ag1n6vand.s[9]++;return(cov_1ag1n6vand.b[0][0]++,_super!==null)&&(cov_1ag1n6vand.b[0][1]++,_super.apply(this,arguments))||(cov_1ag1n6vand.b[0][2]++,this);}cov_1ag1n6vand.s[10]++;Menu.prototype._onSelected=function(id,data){cov_1ag1n6vand.f[2]++;cov_1ag1n6vand.s[11]++;this._selectedId=id;cov_1ag1n6vand.s[12]++;this.properties.onSelected(data);cov_1ag1n6vand.s[13]++;this.invalidate();};cov_1ag1n6vand.s[14]++;Menu.prototype.render=function(){cov_1ag1n6vand.f[3]++;var _this=(cov_1ag1n6vand.s[15]++,this);var items=(cov_1ag1n6vand.s[16]++,this.children.map(function(child,index){cov_1ag1n6vand.f[4]++;cov_1ag1n6vand.s[17]++;if(child){cov_1ag1n6vand.b[1][0]++;var properties=(cov_1ag1n6vand.s[18]++,{onSelected:function(data){cov_1ag1n6vand.f[5]++;cov_1ag1n6vand.s[19]++;_this._onSelected(index,data);}});cov_1ag1n6vand.s[20]++;if(_this._selectedId!==undefined){cov_1ag1n6vand.b[2][0]++;cov_1ag1n6vand.s[21]++;properties.selected=index===_this._selectedId;}else{cov_1ag1n6vand.b[2][1]++;}cov_1ag1n6vand.s[22]++;child.properties=tslib_1.__assign({},child.properties,properties);}else{cov_1ag1n6vand.b[1][1]++;}cov_1ag1n6vand.s[23]++;return child;}));cov_1ag1n6vand.s[24]++;return d_1.v('nav',{classes:this.theme(css.root)},[d_1.v('ol',{classes:this.theme(css.menuContainer)},items)]);};cov_1ag1n6vand.s[25]++;Menu=tslib_1.__decorate([customElement_1.customElement({tag:'demo-menu',events:['onSelected']}),Themed_1.theme(css)],Menu);cov_1ag1n6vand.s[26]++;return Menu;}(Themed_1.ThemedMixin(WidgetBase_1.WidgetBase)));cov_1ag1n6vand.s[27]++;exports.Menu=Menu;cov_1ag1n6vand.s[28]++;exports.default=Menu; /***/ }), @@ -13315,8 +13313,8 @@ __webpack_require__("./tests/unit/menu/Menu.ts"); Object.defineProperty(exports, "__esModule", { value: true }); var _a = intern.getInterface('bdd'), describe = _a.describe, it = _a.it; -var harness_1 = __webpack_require__("./node_modules/@dojo/test-extras/harness.js"); -var d_1 = __webpack_require__("./node_modules/@dojo/widget-core/d.js"); +var harness_1 = __webpack_require__("./node_modules/@dojo/framework/testing/harness.js"); +var d_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.js"); var MenuItem_1 = __webpack_require__("./src/menu-item/MenuItem.ts"); var css = __webpack_require__("./src/menu-item/menuItem.m.css"); describe('MenuItem', function () { @@ -13344,8 +13342,8 @@ describe('MenuItem', function () { Object.defineProperty(exports, "__esModule", { value: true }); var _a = intern.getInterface('bdd'), describe = _a.describe, it = _a.it; -var harness_1 = __webpack_require__("./node_modules/@dojo/test-extras/harness.js"); -var d_1 = __webpack_require__("./node_modules/@dojo/widget-core/d.js"); +var harness_1 = __webpack_require__("./node_modules/@dojo/framework/testing/harness.js"); +var d_1 = __webpack_require__("./node_modules/@dojo/framework/widget-core/d.js"); var Menu_1 = __webpack_require__("./src/menu/Menu.ts"); var css = __webpack_require__("./src/menu/menu.m.css"); describe('Menu', function () { @@ -13369,4 +13367,4 @@ module.exports = __webpack_require__("./tests/unit/menu/Menu.ts"); /***/ }) /******/ }));; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgZjdmNjg2Yjg2ZGU4MjZhN2QzMWQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2NvcmUvRGVzdHJveWFibGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2NvcmUvRXZlbnRlZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vY29yZS9sYW5nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9oYXMvaGFzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL01hcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9Qcm9taXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL1NldC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9TeW1ib2wuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vV2Vha01hcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vbnVtYmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL29iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vc3VwcG9ydC9oYXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vc3VwcG9ydC9xdWV1ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdXBwb3J0L3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3Rlc3QtZXh0cmFzL2hhcm5lc3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3Rlc3QtZXh0cmFzL3N1cHBvcnQvYXNzZXJ0UmVuZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby90ZXN0LWV4dHJhcy9zdXBwb3J0L3NlbGVjdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9tZW51LWl0ZW0vbWVudUl0ZW0ubS5jc3M/MmU1NiIsIndlYnBhY2s6Ly8vLi9zcmMvbWVudS9tZW51Lm0uY3NzPzQxY2IiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL0luamVjdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9Ob2RlSGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvUmVnaXN0cnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL1JlZ2lzdHJ5SGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvV2lkZ2V0QmFzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvYW5pbWF0aW9ucy9jc3NUcmFuc2l0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9hZnRlclJlbmRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9hbHdheXNSZW5kZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYmVmb3JlUHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9jdXN0b21FbGVtZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2RpZmZQcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9oYW5kbGVEZWNvcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaW5qZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kaWZmLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9taXhpbnMvUHJvamVjdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9taXhpbnMvVGhlbWVkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9yZWdpc3RlckN1c3RvbUVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL3Zkb20uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jc3Mtc2VsZWN0LXVtZC9kaXN0L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kaWZmL2Rpc3QvZGlmZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zZXRpbW1lZGlhdGUvc2V0SW1tZWRpYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvbGliL2FkZFN0eWxlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2xpYi91cmxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90aW1lcnMtYnJvd3NlcmlmeS9tYWluLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbWVudS1pdGVtL01lbnVJdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9tZW51LWl0ZW0vbWVudUl0ZW0ubS5jc3MiLCJ3ZWJwYWNrOi8vLy4vc3JjL21lbnUvTWVudS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbWVudS9tZW51Lm0uY3NzIiwid2VicGFjazovLy8uL3Rlc3RzL3VuaXQvYWxsLnRzIiwid2VicGFjazovLy8uL3Rlc3RzL3VuaXQvbWVudS1pdGVtL01lbnVJdGVtLnRzIiwid2VicGFjazovLy8uL3Rlc3RzL3VuaXQvbWVudS9NZW51LnRzIl0sIm5hbWVzIjpbImRfMSIsInJlcXVpcmUiLCJjdXN0b21FbGVtZW50XzEiLCJUaGVtZWRfMSIsIldpZGdldEJhc2VfMSIsImNzcyIsIk1lbnVJdGVtIiwiX3N1cGVyIiwidHNsaWJfMSIsIl9fZXh0ZW5kcyIsInByb3RvdHlwZSIsIl9vbkNsaWNrIiwicHJvcGVydGllcyIsIm9uU2VsZWN0ZWQiLCJkYXRhIiwicmVuZGVyIiwiX2EiLCJ0aXRsZSIsInNlbGVjdGVkIiwidiIsImNsYXNzZXMiLCJ0aGVtZSIsInJvb3QiLCJpdGVtIiwib25jbGljayIsIl9fZGVjb3JhdGUiLCJjdXN0b21FbGVtZW50IiwidGFnIiwiYXR0cmlidXRlcyIsImV2ZW50cyIsIlRoZW1lZE1peGluIiwiV2lkZ2V0QmFzZSIsImV4cG9ydHMiLCJkZWZhdWx0IiwiTWVudSIsIl9vblNlbGVjdGVkIiwiaWQiLCJfc2VsZWN0ZWRJZCIsImludmFsaWRhdGUiLCJfdGhpcyIsIml0ZW1zIiwiY2hpbGRyZW4iLCJtYXAiLCJjaGlsZCIsImluZGV4IiwidW5kZWZpbmVkIiwiX19hc3NpZ24iLCJtZW51Q29udGFpbmVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUFzRCwrREFBK0Q7O0FBRXJIO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7O0FDN0RBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEIsaUJBQWlCLE9BQU87QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFlBQVk7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsOEI7Ozs7Ozs7O0FDNURBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThELDJDQUEyQyxFQUFFO0FBQzNHO0FBQ0E7QUFDQSx5REFBeUQseUJBQXlCLEVBQUU7QUFDcEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsMEI7Ozs7Ozs7O0FDakZBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLDJCQUEyQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHVCQUF1QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsdUJBQXVCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHVCQUF1QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHVCQUF1QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQix1QkFBdUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHVCQUF1QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsdUJBQXVCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixvQkFBb0I7QUFDM0M7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLHNEOzs7Ozs7Ozt1REM1T0E7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsMERBQTBEO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLG1CQUFtQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEU7Ozs7Ozs7OztBQzFNRDtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxxQkFBcUI7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0dBQStHLG9CQUFvQjtBQUNuSTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxRQUFRLGdCQUFnQjtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQywwQkFBMEI7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsY0FBYztBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELGNBQWM7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTzs7Ozs7Ozs7QUNsSEE7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsTUFBTTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MsV0FBVztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsTUFBTTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QixxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCwwQkFBMEIscUJBQXFCLEVBQUUsRUFBRTtBQUN0RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDJCOzs7Ozs7OztBQzVIQTtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLG1CQUFtQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQywwQkFBMEI7QUFDcEU7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLDBCQUEwQjtBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHVCQUF1QjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxxQkFBcUI7QUFDekQ7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxrQzs7Ozs7Ozs7QUNwRkE7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsMEJBQTBCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLDRCQUE0QjtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLDBCQUEwQjtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQztBQUMxQyxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHFCQUFxQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiwyQkFBMkI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsdUJBQXVCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLHNCQUFzQixxQ0FBcUM7QUFDdEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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O0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBLFNBQVM7QUFDVDtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0EsMkNBQTJDOztBQUUzQztBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxpQ0FBaUM7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QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUMsU0FBUztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0YsQ0FBQzs7O0FBR0QsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLGdCQUFnQixnQkFBZ0I7QUFDaEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUNBQW1DOztBQUVuQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtB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QSxpQkFBaUIsdUJBQXVCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixxQkFBcUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixxQkFBcUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseURBQXlELDBCQUEwQjtBQUNuRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRix5QkFBeUIsd0NBQXdDLEVBQUU7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRixrQ0FBa0Msc0JBQXNCLEVBQUU7QUFDMUQseUJBQXlCLGdDQUFnQyxFQUFFO0FBQzNELHdCQUF3QiwyQkFBMkIsRUFBRTtBQUNyRCwwQkFBMEIsdUJBQXVCLEVBQUU7QUFDbkQsQ0FBQztBQUNEO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsWUFBWTtBQUNoQztBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBOztBQUVBLFdBQVc7O0FBRVg7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOzs7O0FBSUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBLENBQUM7OztBQUdELE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1IsY0FBYyxhQUFhLEdBQUcsZUFBZTtBQUM3QztBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxZQUFZLFlBQVk7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOzs7O0FBSUE7QUFD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Q0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsWUFBWTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRixDQUFDO0FBQ0Q7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxvQ0FBb0MsRUFBRTtBQUNoRjs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxZQUFZO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixZQUFZO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFlBQVk7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRixDQUFDO0FBQ0Q7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0YsMEJBQTBCLGdDQUFnQyxFQUFFO0FBQzVELENBQUM7QUFDRDs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7O0FBR0QsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDJCQUEyQixxQkFBcUI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDZDQUE2QyxRQUFRO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSwyQkFBMkIscUJBQXFCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSw2Q0FBNkMsUUFBUTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsMkJBQTJCO0FBQzNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBLG1DQUFtQyxRQUFRO0FBQzNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBLGlCQUFpQixxQkFBcUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBLG1DQUFtQyxRQUFRO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQSxzQ0FBc0MsT0FBTztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUEsaUJBQWlCLHFCQUFxQjtBQUN0QztBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlCQUFpQixxQkFBcUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQix1QkFBdUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUixNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsNENBQTRDLGNBQWM7OztBQUcxRCxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxvQkFBb0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0Q0FBNEMsY0FBYzs7O0FBRzFELE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsY0FBYzs7O0FBRzFELE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQSw0REFBNEQsMEJBQTBCLDBDQUEwQyxnQkFBZ0IsT0FBTyxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsT0FBTyx3QkFBd0IsRUFBRTs7QUFFM047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlEQUFpRCxxQkFBcUI7QUFDdEUsdURBQXVEOztBQUV2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxpREFBaUQ7QUFDaEUsZ0JBQWdCOztBQUVoQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FB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QjtBQUN0QztBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZCQUE2QjtBQUM3Qiw0QkFBNEI7QUFDNUIsNEJBQTRCO0FBQzVCLDhCQUE4Qjs7QUFFOUI7QUFDQTtBQUNBLDRDQUE0QyxjQUFjOzs7QUFHMUQsT0FBTztBQUNQO0FBQ0EsQ0FBQztBQUNELEM7Ozs7Ozs7QUM5eURBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsc0JBQXNCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFVBQVU7Ozs7Ozs7O0FDdkx0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsaUJBQWlCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwwQ0FBMEMsc0JBQXNCLEVBQUU7QUFDbEU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FB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Q047Z0JBQ0MsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDO2dCQUNqQyxPQUFPLEVBQUUsWUFBWSxDQUFDO2FBQ3RCLEVBQ0QsQ0FBQyxLQUFLLENBQUM7U0FFUixDQUFDLENBQ0Y7SUFDRixDQUFDLENBQUM7QUFDSCxDQUFDLENBQUM7Ozs7Ozs7Ozs7O0FDM0JJLG1DQUE2QyxFQUEzQyxzQkFBUSxFQUFFLFVBQUU7QUFDcEI7QUFFQTtBQUVBO0FBQ0E7QUFFQSxRQUFRLENBQUMsTUFBTSxFQUFFO0lBQ2hCLEVBQUUsQ0FBQyxzQkFBc0IsRUFBRTtRQUMxQixJQUFNLFNBQVEsRUFBRyxpQkFBTyxDQUFDLFdBQUksQ0FBQztRQUM5QixRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLEtBQUksQ0FBRSxFQUFFLENBQUMsS0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsY0FBYSxDQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEcsQ0FBQyxDQUFDO0FBQ0gsQ0FBQyxDQUFDIiwiZmlsZSI6InVuaXQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAwKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCBmN2Y2ODZiODZkZTgyNmE3ZDMxZCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xyXG52YXIgbGFuZ18xID0gcmVxdWlyZShcIi4vbGFuZ1wiKTtcclxudmFyIFByb21pc2VfMSA9IHJlcXVpcmUoXCJAZG9qby9zaGltL1Byb21pc2VcIik7XHJcbi8qKlxyXG4gKiBObyBvcGVyYXRpb24gZnVuY3Rpb24gdG8gcmVwbGFjZSBvd24gb25jZSBpbnN0YW5jZSBpcyBkZXN0b3J5ZWRcclxuICovXHJcbmZ1bmN0aW9uIG5vb3AoKSB7XHJcbiAgICByZXR1cm4gUHJvbWlzZV8xLmRlZmF1bHQucmVzb2x2ZShmYWxzZSk7XHJcbn1cclxuLyoqXHJcbiAqIE5vIG9wIGZ1bmN0aW9uIHVzZWQgdG8gcmVwbGFjZSBvd24sIG9uY2UgaW5zdGFuY2UgaGFzIGJlZW4gZGVzdG9yeWVkXHJcbiAqL1xyXG5mdW5jdGlvbiBkZXN0cm95ZWQoKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbGwgbWFkZSB0byBkZXN0cm95ZWQgbWV0aG9kJyk7XHJcbn1cclxudmFyIERlc3Ryb3lhYmxlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAY29uc3RydWN0b3JcclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gRGVzdHJveWFibGUoKSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVzID0gW107XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIGhhbmRsZXMgZm9yIHRoZSBpbnN0YW5jZSB0aGF0IHdpbGwgYmUgZGVzdHJveWVkIHdoZW4gYHRoaXMuZGVzdHJveWAgaXMgY2FsbGVkXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtIYW5kbGV9IGhhbmRsZSBUaGUgaGFuZGxlIHRvIGFkZCBmb3IgdGhlIGluc3RhbmNlXHJcbiAgICAgKiBAcmV0dXJucyB7SGFuZGxlfSBhIGhhbmRsZSBmb3IgdGhlIGhhbmRsZSwgcmVtb3ZlcyB0aGUgaGFuZGxlIGZvciB0aGUgaW5zdGFuY2UgYW5kIGNhbGxzIGRlc3Ryb3lcclxuICAgICAqL1xyXG4gICAgRGVzdHJveWFibGUucHJvdG90eXBlLm93biA9IGZ1bmN0aW9uIChoYW5kbGVzKSB7XHJcbiAgICAgICAgdmFyIGhhbmRsZSA9IEFycmF5LmlzQXJyYXkoaGFuZGxlcykgPyBsYW5nXzEuY3JlYXRlQ29tcG9zaXRlSGFuZGxlLmFwcGx5KHZvaWQgMCwgdHNsaWJfMS5fX3NwcmVhZChoYW5kbGVzKSkgOiBoYW5kbGVzO1xyXG4gICAgICAgIHZhciBfaGFuZGxlcyA9IHRoaXMuaGFuZGxlcztcclxuICAgICAgICBfaGFuZGxlcy5wdXNoKGhhbmRsZSk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgX2hhbmRsZXMuc3BsaWNlKF9oYW5kbGVzLmluZGV4T2YoaGFuZGxlKSk7XHJcbiAgICAgICAgICAgICAgICBoYW5kbGUuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIERlc3RycHlzIGFsbCBoYW5kZXJzIHJlZ2lzdGVyZWQgZm9yIHRoZSBpbnN0YW5jZVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPGFueX0gYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSBhbGwgaGFuZGxlcyBoYXZlIGJlZW4gZGVzdHJveWVkXHJcbiAgICAgKi9cclxuICAgIERlc3Ryb3lhYmxlLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlXzEuZGVmYXVsdChmdW5jdGlvbiAocmVzb2x2ZSkge1xyXG4gICAgICAgICAgICBfdGhpcy5oYW5kbGVzLmZvckVhY2goZnVuY3Rpb24gKGhhbmRsZSkge1xyXG4gICAgICAgICAgICAgICAgaGFuZGxlICYmIGhhbmRsZS5kZXN0cm95ICYmIGhhbmRsZS5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBfdGhpcy5kZXN0cm95ID0gbm9vcDtcclxuICAgICAgICAgICAgX3RoaXMub3duID0gZGVzdHJveWVkO1xyXG4gICAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBEZXN0cm95YWJsZTtcclxufSgpKTtcclxuZXhwb3J0cy5EZXN0cm95YWJsZSA9IERlc3Ryb3lhYmxlO1xyXG5leHBvcnRzLmRlZmF1bHQgPSBEZXN0cm95YWJsZTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9jb3JlL0Rlc3Ryb3lhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9jb3JlL0Rlc3Ryb3lhYmxlLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xyXG52YXIgTWFwXzEgPSByZXF1aXJlKFwiQGRvam8vc2hpbS9NYXBcIik7XHJcbnZhciBEZXN0cm95YWJsZV8xID0gcmVxdWlyZShcIi4vRGVzdHJveWFibGVcIik7XHJcbi8qKlxyXG4gKiBNYXAgb2YgY29tcHV0ZWQgcmVndWxhciBleHByZXNzaW9ucywga2V5ZWQgYnkgc3RyaW5nXHJcbiAqL1xyXG52YXIgcmVnZXhNYXAgPSBuZXcgTWFwXzEuZGVmYXVsdCgpO1xyXG4vKipcclxuICogRGV0ZXJtaW5lcyBpcyB0aGUgZXZlbnQgdHlwZSBnbG9iIGhhcyBiZWVuIG1hdGNoZWRcclxuICpcclxuICogQHJldHVybnMgYm9vbGVhbiB0aGF0IGluZGljYXRlcyBpZiB0aGUgZ2xvYiBpcyBtYXRjaGVkXHJcbiAqL1xyXG5mdW5jdGlvbiBpc0dsb2JNYXRjaChnbG9iU3RyaW5nLCB0YXJnZXRTdHJpbmcpIHtcclxuICAgIGlmICh0eXBlb2YgdGFyZ2V0U3RyaW5nID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgZ2xvYlN0cmluZyA9PT0gJ3N0cmluZycgJiYgZ2xvYlN0cmluZy5pbmRleE9mKCcqJykgIT09IC0xKSB7XHJcbiAgICAgICAgdmFyIHJlZ2V4ID0gdm9pZCAwO1xyXG4gICAgICAgIGlmIChyZWdleE1hcC5oYXMoZ2xvYlN0cmluZykpIHtcclxuICAgICAgICAgICAgcmVnZXggPSByZWdleE1hcC5nZXQoZ2xvYlN0cmluZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZWdleCA9IG5ldyBSZWdFeHAoXCJeXCIgKyBnbG9iU3RyaW5nLnJlcGxhY2UoL1xcKi9nLCAnLionKSArIFwiJFwiKTtcclxuICAgICAgICAgICAgcmVnZXhNYXAuc2V0KGdsb2JTdHJpbmcsIHJlZ2V4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodGFyZ2V0U3RyaW5nKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBnbG9iU3RyaW5nID09PSB0YXJnZXRTdHJpbmc7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cy5pc0dsb2JNYXRjaCA9IGlzR2xvYk1hdGNoO1xyXG4vKipcclxuICogRXZlbnQgQ2xhc3NcclxuICovXHJcbnZhciBFdmVudGVkID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xyXG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoRXZlbnRlZCwgX3N1cGVyKTtcclxuICAgIGZ1bmN0aW9uIEV2ZW50ZWQoKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogbWFwIG9mIGxpc3RlbmVycyBrZXllZCBieSBldmVudCB0eXBlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX3RoaXMubGlzdGVuZXJzTWFwID0gbmV3IE1hcF8xLmRlZmF1bHQoKTtcclxuICAgICAgICByZXR1cm4gX3RoaXM7XHJcbiAgICB9XHJcbiAgICBFdmVudGVkLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLmxpc3RlbmVyc01hcC5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2RzLCB0eXBlKSB7XHJcbiAgICAgICAgICAgIGlmIChpc0dsb2JNYXRjaCh0eXBlLCBldmVudC50eXBlKSkge1xyXG4gICAgICAgICAgICAgICAgbWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHtcclxuICAgICAgICAgICAgICAgICAgICBtZXRob2QuY2FsbChfdGhpcywgZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbiAgICBFdmVudGVkLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uICh0eXBlLCBsaXN0ZW5lcikge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGlzdGVuZXIpKSB7XHJcbiAgICAgICAgICAgIHZhciBoYW5kbGVzXzEgPSBsaXN0ZW5lci5tYXAoZnVuY3Rpb24gKGxpc3RlbmVyKSB7IHJldHVybiBfdGhpcy5fYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpOyB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVzXzEuZm9yRWFjaChmdW5jdGlvbiAoaGFuZGxlKSB7IHJldHVybiBoYW5kbGUuZGVzdHJveSgpOyB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKTtcclxuICAgIH07XHJcbiAgICBFdmVudGVkLnByb3RvdHlwZS5fYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiAodHlwZSwgbGlzdGVuZXIpIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyc01hcC5nZXQodHlwZSkgfHwgW107XHJcbiAgICAgICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xyXG4gICAgICAgIHRoaXMubGlzdGVuZXJzTWFwLnNldCh0eXBlLCBsaXN0ZW5lcnMpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZhciBsaXN0ZW5lcnMgPSBfdGhpcy5saXN0ZW5lcnNNYXAuZ2V0KHR5cGUpIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShsaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lciksIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gRXZlbnRlZDtcclxufShEZXN0cm95YWJsZV8xLkRlc3Ryb3lhYmxlKSk7XHJcbmV4cG9ydHMuRXZlbnRlZCA9IEV2ZW50ZWQ7XHJcbmV4cG9ydHMuZGVmYXVsdCA9IEV2ZW50ZWQ7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vY29yZS9FdmVudGVkLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9jb3JlL0V2ZW50ZWQuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XHJcbnZhciBvYmplY3RfMSA9IHJlcXVpcmUoXCJAZG9qby9zaGltL29iamVjdFwiKTtcclxudmFyIG9iamVjdF8yID0gcmVxdWlyZShcIkBkb2pvL3NoaW0vb2JqZWN0XCIpO1xyXG5leHBvcnRzLmFzc2lnbiA9IG9iamVjdF8yLmFzc2lnbjtcclxudmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xyXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xyXG4vKipcclxuICogVHlwZSBndWFyZCB0aGF0IGVuc3VyZXMgdGhhdCB0aGUgdmFsdWUgY2FuIGJlIGNvZXJjZWQgdG8gT2JqZWN0XHJcbiAqIHRvIHdlZWQgb3V0IGhvc3Qgb2JqZWN0cyB0aGF0IGRvIG5vdCBkZXJpdmUgZnJvbSBPYmplY3QuXHJcbiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjaGVjayBpZiB3ZSB3YW50IHRvIGRlZXAgY29weSBhbiBvYmplY3Qgb3Igbm90LlxyXG4gKiBOb3RlOiBJbiBFUzYgaXQgaXMgcG9zc2libGUgdG8gbW9kaWZ5IGFuIG9iamVjdCdzIFN5bWJvbC50b1N0cmluZ1RhZyBwcm9wZXJ0eSwgd2hpY2ggd2lsbFxyXG4gKiBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkIGJ5IGB0b1N0cmluZ2AuIFRoaXMgaXMgYSByYXJlIGVkZ2UgY2FzZSB0aGF0IGlzIGRpZmZpY3VsdCB0byBoYW5kbGUsXHJcbiAqIHNvIGl0IGlzIG5vdCBoYW5kbGVkIGhlcmUuXHJcbiAqIEBwYXJhbSAgdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrXHJcbiAqIEByZXR1cm4gICAgICAgSWYgdGhlIHZhbHVlIGlzIGNvZXJjaWJsZSBpbnRvIGFuIE9iamVjdFxyXG4gKi9cclxuZnVuY3Rpb24gc2hvdWxkRGVlcENvcHlPYmplY3QodmFsdWUpIHtcclxuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJztcclxufVxyXG5mdW5jdGlvbiBjb3B5QXJyYXkoYXJyYXksIGluaGVyaXRlZCkge1xyXG4gICAgcmV0dXJuIGFycmF5Lm1hcChmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb3B5QXJyYXkoaXRlbSwgaW5oZXJpdGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICFzaG91bGREZWVwQ29weU9iamVjdChpdGVtKVxyXG4gICAgICAgICAgICA/IGl0ZW1cclxuICAgICAgICAgICAgOiBfbWl4aW4oe1xyXG4gICAgICAgICAgICAgICAgZGVlcDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGluaGVyaXRlZDogaW5oZXJpdGVkLFxyXG4gICAgICAgICAgICAgICAgc291cmNlczogW2l0ZW1dLFxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0OiB7fVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcbmZ1bmN0aW9uIF9taXhpbihrd0FyZ3MpIHtcclxuICAgIHZhciBkZWVwID0ga3dBcmdzLmRlZXA7XHJcbiAgICB2YXIgaW5oZXJpdGVkID0ga3dBcmdzLmluaGVyaXRlZDtcclxuICAgIHZhciB0YXJnZXQgPSBrd0FyZ3MudGFyZ2V0O1xyXG4gICAgdmFyIGNvcGllZCA9IGt3QXJncy5jb3BpZWQgfHwgW107XHJcbiAgICB2YXIgY29waWVkQ2xvbmUgPSB0c2xpYl8xLl9fc3ByZWFkKGNvcGllZCk7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGt3QXJncy5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdmFyIHNvdXJjZSA9IGt3QXJncy5zb3VyY2VzW2ldO1xyXG4gICAgICAgIGlmIChzb3VyY2UgPT09IG51bGwgfHwgc291cmNlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcclxuICAgICAgICAgICAgaWYgKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gc291cmNlW2tleV07XHJcbiAgICAgICAgICAgICAgICBpZiAoY29waWVkQ2xvbmUuaW5kZXhPZih2YWx1ZSkgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZGVlcCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvcHlBcnJheSh2YWx1ZSwgaW5oZXJpdGVkKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2hvdWxkRGVlcENvcHlPYmplY3QodmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRWYWx1ZSA9IHRhcmdldFtrZXldIHx8IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWQucHVzaChzb3VyY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF9taXhpbih7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdGVkOiBpbmhlcml0ZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzOiBbdmFsdWVdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXRWYWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZDogY29waWVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG59XHJcbmZ1bmN0aW9uIGNyZWF0ZShwcm90b3R5cGUpIHtcclxuICAgIHZhciBtaXhpbnMgPSBbXTtcclxuICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgbWl4aW5zW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xyXG4gICAgfVxyXG4gICAgaWYgKCFtaXhpbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2xhbmcuY3JlYXRlIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBtaXhpbiBvYmplY3QuJyk7XHJcbiAgICB9XHJcbiAgICB2YXIgYXJncyA9IG1peGlucy5zbGljZSgpO1xyXG4gICAgYXJncy51bnNoaWZ0KE9iamVjdC5jcmVhdGUocHJvdG90eXBlKSk7XHJcbiAgICByZXR1cm4gb2JqZWN0XzEuYXNzaWduLmFwcGx5KG51bGwsIGFyZ3MpO1xyXG59XHJcbmV4cG9ydHMuY3JlYXRlID0gY3JlYXRlO1xyXG5mdW5jdGlvbiBkZWVwQXNzaWduKHRhcmdldCkge1xyXG4gICAgdmFyIHNvdXJjZXMgPSBbXTtcclxuICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgc291cmNlc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcclxuICAgIH1cclxuICAgIHJldHVybiBfbWl4aW4oe1xyXG4gICAgICAgIGRlZXA6IHRydWUsXHJcbiAgICAgICAgaW5oZXJpdGVkOiBmYWxzZSxcclxuICAgICAgICBzb3VyY2VzOiBzb3VyY2VzLFxyXG4gICAgICAgIHRhcmdldDogdGFyZ2V0XHJcbiAgICB9KTtcclxufVxyXG5leHBvcnRzLmRlZXBBc3NpZ24gPSBkZWVwQXNzaWduO1xyXG5mdW5jdGlvbiBkZWVwTWl4aW4odGFyZ2V0KSB7XHJcbiAgICB2YXIgc291cmNlcyA9IFtdO1xyXG4gICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICBzb3VyY2VzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9taXhpbih7XHJcbiAgICAgICAgZGVlcDogdHJ1ZSxcclxuICAgICAgICBpbmhlcml0ZWQ6IHRydWUsXHJcbiAgICAgICAgc291cmNlczogc291cmNlcyxcclxuICAgICAgICB0YXJnZXQ6IHRhcmdldFxyXG4gICAgfSk7XHJcbn1cclxuZXhwb3J0cy5kZWVwTWl4aW4gPSBkZWVwTWl4aW47XHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IG9iamVjdCB1c2luZyB0aGUgcHJvdmlkZWQgc291cmNlJ3MgcHJvdG90eXBlIGFzIHRoZSBwcm90b3R5cGUgZm9yIHRoZSBuZXcgb2JqZWN0LCBhbmQgdGhlblxyXG4gKiBkZWVwIGNvcGllcyB0aGUgcHJvdmlkZWQgc291cmNlJ3MgdmFsdWVzIGludG8gdGhlIG5ldyB0YXJnZXQuXHJcbiAqXHJcbiAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCB0byBkdXBsaWNhdGVcclxuICogQHJldHVybiBUaGUgbmV3IG9iamVjdFxyXG4gKi9cclxuZnVuY3Rpb24gZHVwbGljYXRlKHNvdXJjZSkge1xyXG4gICAgdmFyIHRhcmdldCA9IE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHNvdXJjZSkpO1xyXG4gICAgcmV0dXJuIGRlZXBNaXhpbih0YXJnZXQsIHNvdXJjZSk7XHJcbn1cclxuZXhwb3J0cy5kdXBsaWNhdGUgPSBkdXBsaWNhdGU7XHJcbi8qKlxyXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdHdvIHZhbHVlcyBhcmUgdGhlIHNhbWUgdmFsdWUuXHJcbiAqXHJcbiAqIEBwYXJhbSBhIEZpcnN0IHZhbHVlIHRvIGNvbXBhcmVcclxuICogQHBhcmFtIGIgU2Vjb25kIHZhbHVlIHRvIGNvbXBhcmVcclxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZXMgYXJlIHRoZSBzYW1lOyBmYWxzZSBvdGhlcndpc2VcclxuICovXHJcbmZ1bmN0aW9uIGlzSWRlbnRpY2FsKGEsIGIpIHtcclxuICAgIHJldHVybiAoYSA9PT0gYiB8fFxyXG4gICAgICAgIC8qIGJvdGggdmFsdWVzIGFyZSBOYU4gKi9cclxuICAgICAgICAoYSAhPT0gYSAmJiBiICE9PSBiKSk7XHJcbn1cclxuZXhwb3J0cy5pc0lkZW50aWNhbCA9IGlzSWRlbnRpY2FsO1xyXG4vKipcclxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgYmluZHMgYSBtZXRob2QgdG8gdGhlIHNwZWNpZmllZCBvYmplY3QgYXQgcnVudGltZS4gVGhpcyBpcyBzaW1pbGFyIHRvXHJcbiAqIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAsIGJ1dCBpbnN0ZWFkIG9mIGEgZnVuY3Rpb24gaXQgdGFrZXMgdGhlIG5hbWUgb2YgYSBtZXRob2Qgb24gYW4gb2JqZWN0LlxyXG4gKiBBcyBhIHJlc3VsdCwgdGhlIGZ1bmN0aW9uIHJldHVybmVkIGJ5IGBsYXRlQmluZGAgd2lsbCBhbHdheXMgY2FsbCB0aGUgZnVuY3Rpb24gY3VycmVudGx5IGFzc2lnbmVkIHRvXHJcbiAqIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgb24gdGhlIG9iamVjdCBhcyBvZiB0aGUgbW9tZW50IHRoZSBmdW5jdGlvbiBpdCByZXR1cm5zIGlzIGNhbGxlZC5cclxuICpcclxuICogQHBhcmFtIGluc3RhbmNlIFRoZSBjb250ZXh0IG9iamVjdFxyXG4gKiBAcGFyYW0gbWV0aG9kIFRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgb24gdGhlIGNvbnRleHQgb2JqZWN0IHRvIGJpbmQgdG8gaXRzZWxmXHJcbiAqIEBwYXJhbSBzdXBwbGllZEFyZ3MgQW4gb3B0aW9uYWwgYXJyYXkgb2YgdmFsdWVzIHRvIHByZXBlbmQgdG8gdGhlIGBpbnN0YW5jZVttZXRob2RdYCBhcmd1bWVudHMgbGlzdFxyXG4gKiBAcmV0dXJuIFRoZSBib3VuZCBmdW5jdGlvblxyXG4gKi9cclxuZnVuY3Rpb24gbGF0ZUJpbmQoaW5zdGFuY2UsIG1ldGhvZCkge1xyXG4gICAgdmFyIHN1cHBsaWVkQXJncyA9IFtdO1xyXG4gICAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICBzdXBwbGllZEFyZ3NbX2kgLSAyXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3VwcGxpZWRBcmdzLmxlbmd0aFxyXG4gICAgICAgID8gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cy5sZW5ndGggPyBzdXBwbGllZEFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkgOiBzdXBwbGllZEFyZ3M7XHJcbiAgICAgICAgICAgIC8vIFRTNzAxN1xyXG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VbbWV0aG9kXS5hcHBseShpbnN0YW5jZSwgYXJncyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAvLyBUUzcwMTdcclxuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlW21ldGhvZF0uYXBwbHkoaW5zdGFuY2UsIGFyZ3VtZW50cyk7XHJcbiAgICAgICAgfTtcclxufVxyXG5leHBvcnRzLmxhdGVCaW5kID0gbGF0ZUJpbmQ7XHJcbmZ1bmN0aW9uIG1peGluKHRhcmdldCkge1xyXG4gICAgdmFyIHNvdXJjZXMgPSBbXTtcclxuICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgc291cmNlc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcclxuICAgIH1cclxuICAgIHJldHVybiBfbWl4aW4oe1xyXG4gICAgICAgIGRlZXA6IGZhbHNlLFxyXG4gICAgICAgIGluaGVyaXRlZDogdHJ1ZSxcclxuICAgICAgICBzb3VyY2VzOiBzb3VyY2VzLFxyXG4gICAgICAgIHRhcmdldDogdGFyZ2V0XHJcbiAgICB9KTtcclxufVxyXG5leHBvcnRzLm1peGluID0gbWl4aW47XHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gd2hpY2ggaW52b2tlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzIHByZXBlbmRlZCB0byBpdHMgYXJndW1lbnQgbGlzdC5cclxuICogTGlrZSBgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRgLCBidXQgZG9lcyBub3QgYWx0ZXIgZXhlY3V0aW9uIGNvbnRleHQuXHJcbiAqXHJcbiAqIEBwYXJhbSB0YXJnZXRGdW5jdGlvbiBUaGUgZnVuY3Rpb24gdGhhdCBuZWVkcyB0byBiZSBib3VuZFxyXG4gKiBAcGFyYW0gc3VwcGxpZWRBcmdzIEFuIG9wdGlvbmFsIGFycmF5IG9mIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRoZSBgdGFyZ2V0RnVuY3Rpb25gIGFyZ3VtZW50cyBsaXN0XHJcbiAqIEByZXR1cm4gVGhlIGJvdW5kIGZ1bmN0aW9uXHJcbiAqL1xyXG5mdW5jdGlvbiBwYXJ0aWFsKHRhcmdldEZ1bmN0aW9uKSB7XHJcbiAgICB2YXIgc3VwcGxpZWRBcmdzID0gW107XHJcbiAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgIHN1cHBsaWVkQXJnc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcclxuICAgIH1cclxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID8gc3VwcGxpZWRBcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpIDogc3VwcGxpZWRBcmdzO1xyXG4gICAgICAgIHJldHVybiB0YXJnZXRGdW5jdGlvbi5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgIH07XHJcbn1cclxuZXhwb3J0cy5wYXJ0aWFsID0gcGFydGlhbDtcclxuLyoqXHJcbiAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBkZXN0cm95IG1ldGhvZCB0aGF0LCB3aGVuIGNhbGxlZCwgY2FsbHMgdGhlIHBhc3NlZC1pbiBkZXN0cnVjdG9yLlxyXG4gKiBUaGlzIGlzIGludGVuZGVkIHRvIHByb3ZpZGUgYSB1bmlmaWVkIGludGVyZmFjZSBmb3IgY3JlYXRpbmcgXCJyZW1vdmVcIiAvIFwiZGVzdHJveVwiIGhhbmRsZXJzIGZvclxyXG4gKiBldmVudCBsaXN0ZW5lcnMsIHRpbWVycywgZXRjLlxyXG4gKlxyXG4gKiBAcGFyYW0gZGVzdHJ1Y3RvciBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgaGFuZGxlJ3MgYGRlc3Ryb3lgIG1ldGhvZCBpcyBpbnZva2VkXHJcbiAqIEByZXR1cm4gVGhlIGhhbmRsZSBvYmplY3RcclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZUhhbmRsZShkZXN0cnVjdG9yKSB7XHJcbiAgICB2YXIgY2FsbGVkID0gZmFsc2U7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKCFjYWxsZWQpIHtcclxuICAgICAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBkZXN0cnVjdG9yKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydHMuY3JlYXRlSGFuZGxlID0gY3JlYXRlSGFuZGxlO1xyXG4vKipcclxuICogUmV0dXJucyBhIHNpbmdsZSBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCB0byBkZXN0cm95IG11bHRpcGxlIGhhbmRsZXMgc2ltdWx0YW5lb3VzbHkuXHJcbiAqXHJcbiAqIEBwYXJhbSBoYW5kbGVzIEFuIGFycmF5IG9mIGhhbmRsZXMgd2l0aCBgZGVzdHJveWAgbWV0aG9kc1xyXG4gKiBAcmV0dXJuIFRoZSBoYW5kbGUgb2JqZWN0XHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVDb21wb3NpdGVIYW5kbGUoKSB7XHJcbiAgICB2YXIgaGFuZGxlcyA9IFtdO1xyXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICBoYW5kbGVzW19pXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3JlYXRlSGFuZGxlKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaGFuZGxlc1tpXS5kZXN0cm95KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn1cclxuZXhwb3J0cy5jcmVhdGVDb21wb3NpdGVIYW5kbGUgPSBjcmVhdGVDb21wb3NpdGVIYW5kbGU7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vY29yZS9sYW5nLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9jb3JlL2xhbmcuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuZnVuY3Rpb24gaXNGZWF0dXJlVGVzdFRoZW5hYmxlKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gdmFsdWUgJiYgdmFsdWUudGhlbjtcclxufVxyXG4vKipcclxuICogQSBjYWNoZSBvZiByZXN1bHRzIG9mIGZlYXR1cmUgdGVzdHNcclxuICovXHJcbmV4cG9ydHMudGVzdENhY2hlID0ge307XHJcbi8qKlxyXG4gKiBBIGNhY2hlIG9mIHRoZSB1bi1yZXNvbHZlZCBmZWF0dXJlIHRlc3RzXHJcbiAqL1xyXG5leHBvcnRzLnRlc3RGdW5jdGlvbnMgPSB7fTtcclxuLyoqXHJcbiAqIEEgY2FjaGUgb2YgdW5yZXNvbHZlZCB0aGVuYWJsZXMgKHByb2JhYmx5IHByb21pc2VzKVxyXG4gKiBAdHlwZSB7e319XHJcbiAqL1xyXG52YXIgdGVzdFRoZW5hYmxlcyA9IHt9O1xyXG4vKipcclxuICogQSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBzY29wZSAoYHdpbmRvd2AgaW4gYSBicm93c2VyLCBgZ2xvYmFsYCBpbiBOb2RlSlMpXHJcbiAqL1xyXG52YXIgZ2xvYmFsU2NvcGUgPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cclxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIC8vIEJyb3dzZXJzXHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdztcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgLy8gTm9kZVxyXG4gICAgICAgIHJldHVybiBnbG9iYWw7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAvLyBXZWIgd29ya2Vyc1xyXG4gICAgICAgIHJldHVybiBzZWxmO1xyXG4gICAgfVxyXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cclxuICAgIHJldHVybiB7fTtcclxufSkoKTtcclxuLyogR3JhYiB0aGUgc3RhdGljRmVhdHVyZXMgaWYgdGhlcmUgYXJlIGF2YWlsYWJsZSAqL1xyXG52YXIgc3RhdGljRmVhdHVyZXMgPSAoZ2xvYmFsU2NvcGUuRG9qb0hhc0Vudmlyb25tZW50IHx8IHt9KS5zdGF0aWNGZWF0dXJlcztcclxuLyogQ2xlYW5pbmcgdXAgdGhlIERvam9IYXNFbnZpb3JubWVudCAqL1xyXG5pZiAoJ0Rvam9IYXNFbnZpcm9ubWVudCcgaW4gZ2xvYmFsU2NvcGUpIHtcclxuICAgIGRlbGV0ZSBnbG9iYWxTY29wZS5Eb2pvSGFzRW52aXJvbm1lbnQ7XHJcbn1cclxuLyoqXHJcbiAqIEN1c3RvbSB0eXBlIGd1YXJkIHRvIG5hcnJvdyB0aGUgYHN0YXRpY0ZlYXR1cmVzYCB0byBlaXRoZXIgYSBtYXAgb3IgYSBmdW5jdGlvbiB0aGF0XHJcbiAqIHJldHVybnMgYSBtYXAuXHJcbiAqXHJcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gZ3VhcmQgZm9yXHJcbiAqL1xyXG5mdW5jdGlvbiBpc1N0YXRpY0ZlYXR1cmVGdW5jdGlvbih2YWx1ZSkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcclxufVxyXG4vKipcclxuICogVGhlIGNhY2hlIG9mIGFzc2VydGVkIGZlYXR1cmVzIHRoYXQgd2VyZSBhdmFpbGFibGUgaW4gdGhlIGdsb2JhbCBzY29wZSB3aGVuIHRoZVxyXG4gKiBtb2R1bGUgbG9hZGVkXHJcbiAqL1xyXG52YXIgc3RhdGljQ2FjaGUgPSBzdGF0aWNGZWF0dXJlc1xyXG4gICAgPyBpc1N0YXRpY0ZlYXR1cmVGdW5jdGlvbihzdGF0aWNGZWF0dXJlcykgPyBzdGF0aWNGZWF0dXJlcy5hcHBseShnbG9iYWxTY29wZSkgOiBzdGF0aWNGZWF0dXJlc1xyXG4gICAgOiB7fTsvKiBQcm92aWRpbmcgYW4gZW1wdHkgY2FjaGUsIGlmIG5vbmUgd2FzIGluIHRoZSBlbnZpcm9ubWVudFxyXG5cclxuLyoqXHJcbiogQU1EIHBsdWdpbiBmdW5jdGlvbi5cclxuKlxyXG4qIENvbmRpdGlvbmFsIGxvYWRzIG1vZHVsZXMgYmFzZWQgb24gYSBoYXMgZmVhdHVyZSB0ZXN0IHZhbHVlLlxyXG4qXHJcbiogQHBhcmFtIHJlc291cmNlSWQgR2l2ZXMgdGhlIHJlc29sdmVkIG1vZHVsZSBpZCB0byBsb2FkLlxyXG4qIEBwYXJhbSByZXF1aXJlIFRoZSBsb2FkZXIgcmVxdWlyZSBmdW5jdGlvbiB3aXRoIHJlc3BlY3QgdG8gdGhlIG1vZHVsZSB0aGF0IGNvbnRhaW5lZCB0aGUgcGx1Z2luIHJlc291cmNlIGluIGl0c1xyXG4qICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kgbGlzdC5cclxuKiBAcGFyYW0gbG9hZCBDYWxsYmFjayB0byBsb2FkZXIgdGhhdCBjb25zdW1lcyByZXN1bHQgb2YgcGx1Z2luIGRlbWFuZC5cclxuKi9cclxuZnVuY3Rpb24gbG9hZChyZXNvdXJjZUlkLCByZXF1aXJlLCBsb2FkLCBjb25maWcpIHtcclxuICAgIHJlc291cmNlSWQgPyByZXF1aXJlKFtyZXNvdXJjZUlkXSwgbG9hZCkgOiBsb2FkKCk7XHJcbn1cclxuZXhwb3J0cy5sb2FkID0gbG9hZDtcclxuLyoqXHJcbiAqIEFNRCBwbHVnaW4gZnVuY3Rpb24uXHJcbiAqXHJcbiAqIFJlc29sdmVzIHJlc291cmNlSWQgaW50byBhIG1vZHVsZSBpZCBiYXNlZCBvbiBwb3NzaWJseS1uZXN0ZWQgdGVuYXJ5IGV4cHJlc3Npb24gdGhhdCBicmFuY2hlcyBvbiBoYXMgZmVhdHVyZSB0ZXN0XHJcbiAqIHZhbHVlKHMpLlxyXG4gKlxyXG4gKiBAcGFyYW0gcmVzb3VyY2VJZCBUaGUgaWQgb2YgdGhlIG1vZHVsZVxyXG4gKiBAcGFyYW0gbm9ybWFsaXplIFJlc29sdmVzIGEgcmVsYXRpdmUgbW9kdWxlIGlkIGludG8gYW4gYWJzb2x1dGUgbW9kdWxlIGlkXHJcbiAqL1xyXG5mdW5jdGlvbiBub3JtYWxpemUocmVzb3VyY2VJZCwgbm9ybWFsaXplKSB7XHJcbiAgICB2YXIgdG9rZW5zID0gcmVzb3VyY2VJZC5tYXRjaCgvW1xcPzpdfFteOlxcP10qL2cpIHx8IFtdO1xyXG4gICAgdmFyIGkgPSAwO1xyXG4gICAgZnVuY3Rpb24gZ2V0KHNraXApIHtcclxuICAgICAgICB2YXIgdGVybSA9IHRva2Vuc1tpKytdO1xyXG4gICAgICAgIGlmICh0ZXJtID09PSAnOicpIHtcclxuICAgICAgICAgICAgLy8gZW1wdHkgc3RyaW5nIG1vZHVsZSBuYW1lLCByZXNvbHZlcyB0byBudWxsXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gcG9zdGZpeGVkIHdpdGggYSA/IG1lYW5zIGl0IGlzIGEgZmVhdHVyZSB0byBicmFuY2ggb24sIHRoZSB0ZXJtIGlzIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlXHJcbiAgICAgICAgICAgIGlmICh0b2tlbnNbaSsrXSA9PT0gJz8nKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNraXAgJiYgaGFzKHRlcm0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hlZCB0aGUgZmVhdHVyZSwgZ2V0IHRoZSBmaXJzdCB2YWx1ZSBmcm9tIHRoZSBvcHRpb25zXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZGlkIG5vdCBtYXRjaCwgZ2V0IHRoZSBzZWNvbmQgdmFsdWUsIHBhc3Npbmcgb3ZlciB0aGUgZmlyc3RcclxuICAgICAgICAgICAgICAgICAgICBnZXQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChza2lwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBhIG1vZHVsZVxyXG4gICAgICAgICAgICByZXR1cm4gdGVybTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB2YXIgaWQgPSBnZXQoKTtcclxuICAgIHJldHVybiBpZCAmJiBub3JtYWxpemUoaWQpO1xyXG59XHJcbmV4cG9ydHMubm9ybWFsaXplID0gbm9ybWFsaXplO1xyXG4vKipcclxuICogQ2hlY2sgaWYgYSBmZWF0dXJlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZFxyXG4gKlxyXG4gKiBAcGFyYW0gZmVhdHVyZSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZVxyXG4gKi9cclxuZnVuY3Rpb24gZXhpc3RzKGZlYXR1cmUpIHtcclxuICAgIHZhciBub3JtYWxpemVkRmVhdHVyZSA9IGZlYXR1cmUudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiBCb29sZWFuKG5vcm1hbGl6ZWRGZWF0dXJlIGluIHN0YXRpY0NhY2hlIHx8IG5vcm1hbGl6ZWRGZWF0dXJlIGluIGV4cG9ydHMudGVzdENhY2hlIHx8IGV4cG9ydHMudGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV0pO1xyXG59XHJcbmV4cG9ydHMuZXhpc3RzID0gZXhpc3RzO1xyXG4vKipcclxuICogUmVnaXN0ZXIgYSBuZXcgdGVzdCBmb3IgYSBuYW1lZCBmZWF0dXJlLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBoYXMuYWRkKCdkb20tYWRkZXZlbnRsaXN0ZW5lcicsICEhZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcik7XHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGhhcy5hZGQoJ3RvdWNoLWV2ZW50cycsIGZ1bmN0aW9uICgpIHtcclxuICogICAgcmV0dXJuICdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50XHJcbiAqIH0pO1xyXG4gKlxyXG4gKiBAcGFyYW0gZmVhdHVyZSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZVxyXG4gKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHJlcG9ydGVkIG9mIHRoZSBmZWF0dXJlLCBvciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBvbmNlIG9uIGZpcnN0IHRlc3RcclxuICogQHBhcmFtIG92ZXJ3cml0ZSBpZiBhbiBleGlzdGluZyB2YWx1ZSBzaG91bGQgYmUgb3ZlcndyaXR0ZW4uIERlZmF1bHRzIHRvIGZhbHNlLlxyXG4gKi9cclxuZnVuY3Rpb24gYWRkKGZlYXR1cmUsIHZhbHVlLCBvdmVyd3JpdGUpIHtcclxuICAgIGlmIChvdmVyd3JpdGUgPT09IHZvaWQgMCkgeyBvdmVyd3JpdGUgPSBmYWxzZTsgfVxyXG4gICAgdmFyIG5vcm1hbGl6ZWRGZWF0dXJlID0gZmVhdHVyZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgaWYgKGV4aXN0cyhub3JtYWxpemVkRmVhdHVyZSkgJiYgIW92ZXJ3cml0ZSAmJiAhKG5vcm1hbGl6ZWRGZWF0dXJlIGluIHN0YXRpY0NhY2hlKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGZWF0dXJlIFxcXCJcIiArIGZlYXR1cmUgKyBcIlxcXCIgZXhpc3RzIGFuZCBvdmVyd3JpdGUgbm90IHRydWUuXCIpO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIGV4cG9ydHMudGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV0gPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGlzRmVhdHVyZVRlc3RUaGVuYWJsZSh2YWx1ZSkpIHtcclxuICAgICAgICB0ZXN0VGhlbmFibGVzW2ZlYXR1cmVdID0gdmFsdWUudGhlbihmdW5jdGlvbiAocmVzb2x2ZWRWYWx1ZSkge1xyXG4gICAgICAgICAgICBleHBvcnRzLnRlc3RDYWNoZVtmZWF0dXJlXSA9IHJlc29sdmVkVmFsdWU7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0ZXN0VGhlbmFibGVzW2ZlYXR1cmVdO1xyXG4gICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZGVsZXRlIHRlc3RUaGVuYWJsZXNbZmVhdHVyZV07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBleHBvcnRzLnRlc3RDYWNoZVtub3JtYWxpemVkRmVhdHVyZV0gPSB2YWx1ZTtcclxuICAgICAgICBkZWxldGUgZXhwb3J0cy50ZXN0RnVuY3Rpb25zW25vcm1hbGl6ZWRGZWF0dXJlXTtcclxuICAgIH1cclxufVxyXG5leHBvcnRzLmFkZCA9IGFkZDtcclxuLyoqXHJcbiAqIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBvZiBhIG5hbWVkIGZlYXR1cmUuXHJcbiAqXHJcbiAqIEBwYXJhbSBmZWF0dXJlIFRoZSBuYW1lIChpZiBhIHN0cmluZykgb3IgaWRlbnRpZmllciAoaWYgYW4gaW50ZWdlcikgb2YgdGhlIGZlYXR1cmUgdG8gdGVzdC5cclxuICovXHJcbmZ1bmN0aW9uIGhhcyhmZWF0dXJlKSB7XHJcbiAgICB2YXIgcmVzdWx0O1xyXG4gICAgdmFyIG5vcm1hbGl6ZWRGZWF0dXJlID0gZmVhdHVyZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgaWYgKG5vcm1hbGl6ZWRGZWF0dXJlIGluIHN0YXRpY0NhY2hlKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gc3RhdGljQ2FjaGVbbm9ybWFsaXplZEZlYXR1cmVdO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZXhwb3J0cy50ZXN0RnVuY3Rpb25zW25vcm1hbGl6ZWRGZWF0dXJlXSkge1xyXG4gICAgICAgIHJlc3VsdCA9IGV4cG9ydHMudGVzdENhY2hlW25vcm1hbGl6ZWRGZWF0dXJlXSA9IGV4cG9ydHMudGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV0uY2FsbChudWxsKTtcclxuICAgICAgICBkZWxldGUgZXhwb3J0cy50ZXN0RnVuY3Rpb25zW25vcm1hbGl6ZWRGZWF0dXJlXTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKG5vcm1hbGl6ZWRGZWF0dXJlIGluIGV4cG9ydHMudGVzdENhY2hlKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gZXhwb3J0cy50ZXN0Q2FjaGVbbm9ybWFsaXplZEZlYXR1cmVdO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZmVhdHVyZSBpbiB0ZXN0VGhlbmFibGVzKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkF0dGVtcHQgdG8gZGV0ZWN0IHVucmVnaXN0ZXJlZCBoYXMgZmVhdHVyZSBcXFwiXCIgKyBmZWF0dXJlICsgXCJcXFwiXCIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5leHBvcnRzLmRlZmF1bHQgPSBoYXM7XHJcbi8qXHJcbiAqIE91dCBvZiB0aGUgYm94IGZlYXR1cmUgdGVzdHNcclxuICovXHJcbi8qIEVudmlyb25tZW50cyAqL1xyXG4vKiBVc2VkIGFzIGEgdmFsdWUgdG8gcHJvdmlkZSBhIGRlYnVnIG9ubHkgY29kZSBwYXRoICovXHJcbmFkZCgnZGVidWcnLCB0cnVlKTtcclxuLyogRGV0ZWN0cyBpZiB0aGUgZW52aXJvbm1lbnQgaXMgXCJicm93c2VyIGxpa2VcIiAqL1xyXG5hZGQoJ2hvc3QtYnJvd3NlcicsIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGxvY2F0aW9uICE9PSAndW5kZWZpbmVkJyk7XHJcbi8qIERldGVjdHMgaWYgdGhlIGVudmlyb25tZW50IGFwcGVhcnMgdG8gYmUgTm9kZUpTICovXHJcbmFkZCgnaG9zdC1ub2RlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzLnZlcnNpb25zICYmIHByb2Nlc3MudmVyc2lvbnMubm9kZSkge1xyXG4gICAgICAgIHJldHVybiBwcm9jZXNzLnZlcnNpb25zLm5vZGU7XHJcbiAgICB9XHJcbn0pO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2hhcy9oYXMuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2hhcy9oYXMuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XHJcbnZhciBpdGVyYXRvcl8xID0gcmVxdWlyZShcIi4vaXRlcmF0b3JcIik7XHJcbnZhciBnbG9iYWxfMSA9IHJlcXVpcmUoXCIuL2dsb2JhbFwiKTtcclxudmFyIG9iamVjdF8xID0gcmVxdWlyZShcIi4vb2JqZWN0XCIpO1xyXG52YXIgaGFzXzEgPSByZXF1aXJlKFwiLi9zdXBwb3J0L2hhc1wiKTtcclxucmVxdWlyZShcIi4vU3ltYm9sXCIpO1xyXG5leHBvcnRzLk1hcCA9IGdsb2JhbF8xLmRlZmF1bHQuTWFwO1xyXG5pZiAoIWhhc18xLmRlZmF1bHQoJ2VzNi1tYXAnKSkge1xyXG4gICAgZXhwb3J0cy5NYXAgPSAoX2EgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIE1hcChpdGVyYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gW107XHJcbiAgICAgICAgICAgICAgICB0aGlzW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnTWFwJztcclxuICAgICAgICAgICAgICAgIGlmIChpdGVyYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVyYXRvcl8xLmlzQXJyYXlMaWtlKGl0ZXJhYmxlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZXJhYmxlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBpdGVyYWJsZVtpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KHZhbHVlWzBdLCB2YWx1ZVsxXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpdGVyYWJsZV8xID0gdHNsaWJfMS5fX3ZhbHVlcyhpdGVyYWJsZSksIGl0ZXJhYmxlXzFfMSA9IGl0ZXJhYmxlXzEubmV4dCgpOyAhaXRlcmFibGVfMV8xLmRvbmU7IGl0ZXJhYmxlXzFfMSA9IGl0ZXJhYmxlXzEubmV4dCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gaXRlcmFibGVfMV8xLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KHZhbHVlWzBdLCB2YWx1ZVsxXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVyYWJsZV8xXzEgJiYgIWl0ZXJhYmxlXzFfMS5kb25lICYmIChfYSA9IGl0ZXJhYmxlXzEucmV0dXJuKSkgX2EuY2FsbChpdGVyYWJsZV8xKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhciBlXzEsIF9hO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiB1c2luZyBPYmplY3QuaXNcclxuICAgICAgICAgICAgICogdG8gY2hlY2sgZm9yIGVxdWFsaXR5LiBTZWUgaHR0cDovL216bC5sYS8xenVLTzJWXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBNYXAucHJvdG90eXBlLl9pbmRleE9mS2V5ID0gZnVuY3Rpb24gKGtleXMsIGtleSkge1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aF8xID0ga2V5cy5sZW5ndGg7IGkgPCBsZW5ndGhfMTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdF8xLmlzKGtleXNbaV0sIGtleSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTWFwLnByb3RvdHlwZSwgXCJzaXplXCIsIHtcclxuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9rZXlzLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBNYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5sZW5ndGggPSB0aGlzLl92YWx1ZXMubGVuZ3RoID0gMDtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9pbmRleE9mS2V5KHRoaXMuX2tleXMsIGtleSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLl9rZXlzLm1hcChmdW5jdGlvbiAoa2V5LCBpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtrZXksIF90aGlzLl92YWx1ZXNbaV1dO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGl0ZXJhdG9yXzEuU2hpbUl0ZXJhdG9yKHZhbHVlcyk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGtleXMgPSB0aGlzLl9rZXlzO1xyXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuX3ZhbHVlcztcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGhfMiA9IGtleXMubGVuZ3RoOyBpIDwgbGVuZ3RoXzI7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgdmFsdWVzW2ldLCBrZXlzW2ldLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9pbmRleE9mS2V5KHRoaXMuX2tleXMsIGtleSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggPCAwID8gdW5kZWZpbmVkIDogdGhpcy5fdmFsdWVzW2luZGV4XTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faW5kZXhPZktleSh0aGlzLl9rZXlzLCBrZXkpID4gLTE7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIE1hcC5wcm90b3R5cGUua2V5cyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgaXRlcmF0b3JfMS5TaGltSXRlcmF0b3IodGhpcy5fa2V5cyk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2luZGV4T2ZLZXkodGhpcy5fa2V5cywga2V5KTtcclxuICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kZXggPCAwID8gdGhpcy5fa2V5cy5sZW5ndGggOiBpbmRleDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2tleXNbaW5kZXhdID0ga2V5O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzW2luZGV4XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIE1hcC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBpdGVyYXRvcl8xLlNoaW1JdGVyYXRvcih0aGlzLl92YWx1ZXMpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBNYXAucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzKCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJldHVybiBNYXA7XHJcbiAgICAgICAgfSgpKSxcclxuICAgICAgICBfYVtTeW1ib2wuc3BlY2llc10gPSBfYSxcclxuICAgICAgICBfYSk7XHJcbn1cclxuZXhwb3J0cy5kZWZhdWx0ID0gZXhwb3J0cy5NYXA7XHJcbnZhciBfYTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL01hcC5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9NYXAuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XHJcbnZhciBnbG9iYWxfMSA9IHJlcXVpcmUoXCIuL2dsb2JhbFwiKTtcclxudmFyIHF1ZXVlXzEgPSByZXF1aXJlKFwiLi9zdXBwb3J0L3F1ZXVlXCIpO1xyXG5yZXF1aXJlKFwiLi9TeW1ib2xcIik7XHJcbnZhciBoYXNfMSA9IHJlcXVpcmUoXCIuL3N1cHBvcnQvaGFzXCIpO1xyXG5leHBvcnRzLlNoaW1Qcm9taXNlID0gZ2xvYmFsXzEuZGVmYXVsdC5Qcm9taXNlO1xyXG5leHBvcnRzLmlzVGhlbmFibGUgPSBmdW5jdGlvbiBpc1RoZW5hYmxlKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbic7XHJcbn07XHJcbmlmICghaGFzXzEuZGVmYXVsdCgnZXM2LXByb21pc2UnKSkge1xyXG4gICAgZ2xvYmFsXzEuZGVmYXVsdC5Qcm9taXNlID0gZXhwb3J0cy5TaGltUHJvbWlzZSA9IChfYSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgUHJvbWlzZS5cclxuICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgICogQGNvbnN0cnVjdG9yXHJcbiAgICAgICAgICAgICAqXHJcbiAgICAgICAgICAgICAqIEBwYXJhbSBleGVjdXRvclxyXG4gICAgICAgICAgICAgKiBUaGUgZXhlY3V0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIFByb21pc2UgaXMgaW5zdGFudGlhdGVkLiBJdCBpcyByZXNwb25zaWJsZSBmb3JcclxuICAgICAgICAgICAgICogc3RhcnRpbmcgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gd2hlbiBpdCBpcyBpbnZva2VkLlxyXG4gICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAgKiBUaGUgZXhlY3V0b3IgbXVzdCBjYWxsIGVpdGhlciB0aGUgcGFzc2VkIGByZXNvbHZlYCBmdW5jdGlvbiB3aGVuIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWRcclxuICAgICAgICAgICAgICogc3VjY2Vzc2Z1bGx5LCBvciB0aGUgYHJlamVjdGAgZnVuY3Rpb24gd2hlbiB0aGUgb3BlcmF0aW9uIGZhaWxzLlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xyXG4gICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhpcyBwcm9taXNlLlxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gMSAvKiBQZW5kaW5nICovO1xyXG4gICAgICAgICAgICAgICAgdGhpc1tTeW1ib2wudG9TdHJpbmdUYWddID0gJ1Byb21pc2UnO1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBJZiB0cnVlLCB0aGUgcmVzb2x1dGlvbiBvZiB0aGlzIHByb21pc2UgaXMgY2hhaW5lZCAoXCJsb2NrZWQgaW5cIikgdG8gYW5vdGhlciBwcm9taXNlLlxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICB2YXIgaXNDaGFpbmVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIFdoZXRoZXIgb3Igbm90IHRoaXMgcHJvbWlzZSBpcyBpbiBhIHJlc29sdmVkIHN0YXRlLlxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICB2YXIgaXNSZXNvbHZlZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuc3RhdGUgIT09IDEgLyogUGVuZGluZyAqLyB8fCBpc0NoYWluZWQ7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBDYWxsYmFja3MgdGhhdCBzaG91bGQgYmUgaW52b2tlZCBvbmNlIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIHZhciBjYWxsYmFja3MgPSBbXTtcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogSW5pdGlhbGx5IHB1c2hlcyBjYWxsYmFja3Mgb250byBhIHF1ZXVlIGZvciBleGVjdXRpb24gb25jZSB0aGlzIHByb21pc2Ugc2V0dGxlcy4gQWZ0ZXIgdGhlIHByb21pc2Ugc2V0dGxlcyxcclxuICAgICAgICAgICAgICAgICAqIGVucXVldWVzIGNhbGxiYWNrcyBmb3IgZXhlY3V0aW9uIG9uIHRoZSBuZXh0IGV2ZW50IGxvb3AgdHVybi5cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgdmFyIHdoZW5GaW5pc2hlZCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIFNldHRsZXMgdGhpcyBwcm9taXNlLlxyXG4gICAgICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSBuZXdTdGF0ZSBUaGUgcmVzb2x2ZWQgc3RhdGUgZm9yIHRoaXMgcHJvbWlzZS5cclxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7VHxhbnl9IHZhbHVlIFRoZSByZXNvbHZlZCB2YWx1ZSBmb3IgdGhpcyBwcm9taXNlLlxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICB2YXIgc2V0dGxlID0gZnVuY3Rpb24gKG5ld1N0YXRlLCB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEEgcHJvbWlzZSBjYW4gb25seSBiZSBzZXR0bGVkIG9uY2UuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzLnN0YXRlICE9PSAxIC8qIFBlbmRpbmcgKi8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5zdGF0ZSA9IG5ld1N0YXRlO1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlc29sdmVkVmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB3aGVuRmluaXNoZWQgPSBxdWV1ZV8xLnF1ZXVlTWljcm9UYXNrO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgZW5xdWV1ZSBhIGNhbGxiYWNrIHJ1bm5lciBpZiB0aGVyZSBhcmUgY2FsbGJhY2tzIHNvIHRoYXQgaW5pdGlhbGx5IGZ1bGZpbGxlZCBQcm9taXNlcyBkb24ndCBoYXZlIHRvXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBhbiBleHRyYSB0dXJuLlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja3MgJiYgY2FsbGJhY2tzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVfMS5xdWV1ZU1pY3JvVGFzayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvdW50ID0gY2FsbGJhY2tzLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzW2ldLmNhbGwobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcyA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIFJlc29sdmVzIHRoaXMgcHJvbWlzZS5cclxuICAgICAgICAgICAgICAgICAqXHJcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gbmV3U3RhdGUgVGhlIHJlc29sdmVkIHN0YXRlIGZvciB0aGlzIHByb21pc2UuXHJcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0ge1R8YW55fSB2YWx1ZSBUaGUgcmVzb2x2ZWQgdmFsdWUgZm9yIHRoaXMgcHJvbWlzZS5cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc29sdmUgPSBmdW5jdGlvbiAobmV3U3RhdGUsIHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVzb2x2ZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChleHBvcnRzLmlzVGhlbmFibGUodmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnRoZW4oc2V0dGxlLmJpbmQobnVsbCwgMCAvKiBGdWxmaWxsZWQgKi8pLCBzZXR0bGUuYmluZChudWxsLCAyIC8qIFJlamVjdGVkICovKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2hhaW5lZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXR0bGUobmV3U3RhdGUsIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgdGhpcy50aGVuID0gZnVuY3Rpb24gKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbkZpbmlzaGVkIGluaXRpYWxseSBxdWV1ZXMgdXAgY2FsbGJhY2tzIGZvciBleGVjdXRpb24gYWZ0ZXIgdGhlIHByb21pc2UgaGFzIHNldHRsZWQuIE9uY2UgdGhlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb21pc2UgaGFzIHNldHRsZWQsIHdoZW5GaW5pc2hlZCB3aWxsIHNjaGVkdWxlIGNhbGxiYWNrcyBmb3IgZXhlY3V0aW9uIG9uIHRoZSBuZXh0IHR1cm4gdGhyb3VnaCB0aGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgbG9vcC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlbkZpbmlzaGVkKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IF90aGlzLnN0YXRlID09PSAyIC8qIFJlamVjdGVkICovID8gb25SZWplY3RlZCA6IG9uRnVsZmlsbGVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY2FsbGJhY2soX3RoaXMucmVzb2x2ZWRWYWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChfdGhpcy5zdGF0ZSA9PT0gMiAvKiBSZWplY3RlZCAqLykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChfdGhpcy5yZXNvbHZlZFZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoX3RoaXMucmVzb2x2ZWRWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3IocmVzb2x2ZS5iaW5kKG51bGwsIDAgLyogRnVsZmlsbGVkICovKSwgcmVzb2x2ZS5iaW5kKG51bGwsIDIgLyogUmVqZWN0ZWQgKi8pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldHRsZSgyIC8qIFJlamVjdGVkICovLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgUHJvbWlzZS5hbGwgPSBmdW5jdGlvbiAoaXRlcmFibGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcyhmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb21wbGV0ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRvdGFsID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcG9wdWxhdGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZnVsZmlsbChpbmRleCwgdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICArK2NvbXBsZXRlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2goKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZmluaXNoKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9wdWxhdGluZyB8fCBjb21wbGV0ZSA8IHRvdGFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwcm9jZXNzSXRlbShpbmRleCwgaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICArK3RvdGFsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwb3J0cy5pc1RoZW5hYmxlKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbiBpdGVtIFByb21pc2UgcmVqZWN0cywgdGhpcyBQcm9taXNlIGlzIGltbWVkaWF0ZWx5IHJlamVjdGVkIHdpdGggdGhlIGl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb21pc2UncyByZWplY3Rpb24gZXJyb3IuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnRoZW4oZnVsZmlsbC5iaW5kKG51bGwsIGluZGV4KSwgcmVqZWN0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShpdGVtKS50aGVuKGZ1bGZpbGwuYmluZChudWxsLCBpbmRleCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpdGVyYWJsZV8xID0gdHNsaWJfMS5fX3ZhbHVlcyhpdGVyYWJsZSksIGl0ZXJhYmxlXzFfMSA9IGl0ZXJhYmxlXzEubmV4dCgpOyAhaXRlcmFibGVfMV8xLmRvbmU7IGl0ZXJhYmxlXzFfMSA9IGl0ZXJhYmxlXzEubmV4dCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBpdGVyYWJsZV8xXzEudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzSXRlbShpLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cclxuICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVyYWJsZV8xXzEgJiYgIWl0ZXJhYmxlXzFfMS5kb25lICYmIChfYSA9IGl0ZXJhYmxlXzEucmV0dXJuKSkgX2EuY2FsbChpdGVyYWJsZV8xKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHBvcHVsYXRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBmaW5pc2goKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZV8xLCBfYTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBQcm9taXNlLnJhY2UgPSBmdW5jdGlvbiAoaXRlcmFibGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcyhmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaXRlcmFibGVfMiA9IHRzbGliXzEuX192YWx1ZXMoaXRlcmFibGUpLCBpdGVyYWJsZV8yXzEgPSBpdGVyYWJsZV8yLm5leHQoKTsgIWl0ZXJhYmxlXzJfMS5kb25lOyBpdGVyYWJsZV8yXzEgPSBpdGVyYWJsZV8yLm5leHQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBpdGVyYWJsZV8yXzEudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIFByb21pc2UgaXRlbSByZWplY3RzLCB0aGlzIFByb21pc2UgaXMgaW1tZWRpYXRlbHkgcmVqZWN0ZWQgd2l0aCB0aGUgaXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb21pc2UncyByZWplY3Rpb24gZXJyb3IuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS50aGVuKHJlc29sdmUsIHJlamVjdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoaXRlbSkudGhlbihyZXNvbHZlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZXJhYmxlXzJfMSAmJiAhaXRlcmFibGVfMl8xLmRvbmUgJiYgKF9hID0gaXRlcmFibGVfMi5yZXR1cm4pKSBfYS5jYWxsKGl0ZXJhYmxlXzIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7IH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVfMiwgX2E7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgUHJvbWlzZS5yZWplY3QgPSBmdW5jdGlvbiAocmVhc29uKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzKGZ1bmN0aW9uIChyZXNvbHZlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2ggPSBmdW5jdGlvbiAob25SZWplY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZTtcclxuICAgICAgICB9KCkpLFxyXG4gICAgICAgIF9hW1N5bWJvbC5zcGVjaWVzXSA9IGV4cG9ydHMuU2hpbVByb21pc2UsXHJcbiAgICAgICAgX2EpO1xyXG59XHJcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMuU2hpbVByb21pc2U7XHJcbnZhciBfYTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL1Byb21pc2UuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vUHJvbWlzZS5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcclxudmFyIGdsb2JhbF8xID0gcmVxdWlyZShcIi4vZ2xvYmFsXCIpO1xyXG52YXIgaXRlcmF0b3JfMSA9IHJlcXVpcmUoXCIuL2l0ZXJhdG9yXCIpO1xyXG52YXIgaGFzXzEgPSByZXF1aXJlKFwiLi9zdXBwb3J0L2hhc1wiKTtcclxucmVxdWlyZShcIi4vU3ltYm9sXCIpO1xyXG5leHBvcnRzLlNldCA9IGdsb2JhbF8xLmRlZmF1bHQuU2V0O1xyXG5pZiAoIWhhc18xLmRlZmF1bHQoJ2VzNi1zZXQnKSkge1xyXG4gICAgZXhwb3J0cy5TZXQgPSAoX2EgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIFNldChpdGVyYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0RGF0YSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgdGhpc1tTeW1ib2wudG9TdHJpbmdUYWddID0gJ1NldCc7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlcmFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlcmF0b3JfMS5pc0FycmF5TGlrZShpdGVyYWJsZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVyYWJsZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGQoaXRlcmFibGVbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaXRlcmFibGVfMSA9IHRzbGliXzEuX192YWx1ZXMoaXRlcmFibGUpLCBpdGVyYWJsZV8xXzEgPSBpdGVyYWJsZV8xLm5leHQoKTsgIWl0ZXJhYmxlXzFfMS5kb25lOyBpdGVyYWJsZV8xXzEgPSBpdGVyYWJsZV8xLm5leHQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGl0ZXJhYmxlXzFfMS52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZCh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVyYWJsZV8xXzEgJiYgIWl0ZXJhYmxlXzFfMS5kb25lICYmIChfYSA9IGl0ZXJhYmxlXzEucmV0dXJuKSkgX2EuY2FsbChpdGVyYWJsZV8xKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhciBlXzEsIF9hO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFNldC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXModmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXREYXRhLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIFNldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXREYXRhLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIFNldC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaWR4ID0gdGhpcy5fc2V0RGF0YS5pbmRleE9mKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGlmIChpZHggPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0RGF0YS5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBTZXQucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGl0ZXJhdG9yXzEuU2hpbUl0ZXJhdG9yKHRoaXMuX3NldERhdGEubWFwKGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gW3ZhbHVlLCB2YWx1ZV07IH0pKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrZm4sIHRoaXNBcmcpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IHRoaXMudmFsdWVzKCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKCFyZXN1bHQuZG9uZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4uY2FsbCh0aGlzQXJnLCByZXN1bHQudmFsdWUsIHJlc3VsdC52YWx1ZSwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBTZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NldERhdGEuaW5kZXhPZih2YWx1ZSkgPiAtMTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBpdGVyYXRvcl8xLlNoaW1JdGVyYXRvcih0aGlzLl9zZXREYXRhKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNldC5wcm90b3R5cGUsIFwic2l6ZVwiLCB7XHJcbiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2V0RGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgU2V0LnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGl0ZXJhdG9yXzEuU2hpbUl0ZXJhdG9yKHRoaXMuX3NldERhdGEpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBTZXQucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGl0ZXJhdG9yXzEuU2hpbUl0ZXJhdG9yKHRoaXMuX3NldERhdGEpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXR1cm4gU2V0O1xyXG4gICAgICAgIH0oKSksXHJcbiAgICAgICAgX2FbU3ltYm9sLnNwZWNpZXNdID0gX2EsXHJcbiAgICAgICAgX2EpO1xyXG59XHJcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMuU2V0O1xyXG52YXIgX2E7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9TZXQuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vU2V0LmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciBoYXNfMSA9IHJlcXVpcmUoXCIuL3N1cHBvcnQvaGFzXCIpO1xyXG52YXIgZ2xvYmFsXzEgPSByZXF1aXJlKFwiLi9nbG9iYWxcIik7XHJcbnZhciB1dGlsXzEgPSByZXF1aXJlKFwiLi9zdXBwb3J0L3V0aWxcIik7XHJcbmV4cG9ydHMuU3ltYm9sID0gZ2xvYmFsXzEuZGVmYXVsdC5TeW1ib2w7XHJcbmlmICghaGFzXzEuZGVmYXVsdCgnZXM2LXN5bWJvbCcpKSB7XHJcbiAgICAvKipcclxuICAgICAqIFRocm93cyBpZiB0aGUgdmFsdWUgaXMgbm90IGEgc3ltYm9sLCB1c2VkIGludGVybmFsbHkgd2l0aGluIHRoZSBTaGltXHJcbiAgICAgKiBAcGFyYW0gIHthbnl9ICAgIHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVja1xyXG4gICAgICogQHJldHVybiB7c3ltYm9sfSAgICAgICBSZXR1cm5zIHRoZSBzeW1ib2wgb3IgdGhyb3dzXHJcbiAgICAgKi9cclxuICAgIHZhciB2YWxpZGF0ZVN5bWJvbF8xID0gZnVuY3Rpb24gdmFsaWRhdGVTeW1ib2wodmFsdWUpIHtcclxuICAgICAgICBpZiAoIWlzU3ltYm9sKHZhbHVlKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHZhbHVlICsgJyBpcyBub3QgYSBzeW1ib2wnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfTtcclxuICAgIHZhciBkZWZpbmVQcm9wZXJ0aWVzXzEgPSBPYmplY3QuZGVmaW5lUHJvcGVydGllcztcclxuICAgIHZhciBkZWZpbmVQcm9wZXJ0eV8xID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xyXG4gICAgdmFyIGNyZWF0ZV8xID0gT2JqZWN0LmNyZWF0ZTtcclxuICAgIHZhciBvYmpQcm90b3R5cGVfMSA9IE9iamVjdC5wcm90b3R5cGU7XHJcbiAgICB2YXIgZ2xvYmFsU3ltYm9sc18xID0ge307XHJcbiAgICB2YXIgZ2V0U3ltYm9sTmFtZV8xID0gKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZV8xKG51bGwpO1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZGVzYykge1xyXG4gICAgICAgICAgICB2YXIgcG9zdGZpeCA9IDA7XHJcbiAgICAgICAgICAgIHZhciBuYW1lO1xyXG4gICAgICAgICAgICB3aGlsZSAoY3JlYXRlZFtTdHJpbmcoZGVzYykgKyAocG9zdGZpeCB8fCAnJyldKSB7XHJcbiAgICAgICAgICAgICAgICArK3Bvc3RmaXg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGVzYyArPSBTdHJpbmcocG9zdGZpeCB8fCAnJyk7XHJcbiAgICAgICAgICAgIGNyZWF0ZWRbZGVzY10gPSB0cnVlO1xyXG4gICAgICAgICAgICBuYW1lID0gJ0BAJyArIGRlc2M7XHJcbiAgICAgICAgICAgIC8vIEZJWE1FOiBUZW1wb3JhcnkgZ3VhcmQgdW50aWwgdGhlIGR1cGxpY2F0ZSBleGVjdXRpb24gd2hlbiB0ZXN0aW5nIGNhbiBiZVxyXG4gICAgICAgICAgICAvLyBwaW5uZWQgZG93bi5cclxuICAgICAgICAgICAgaWYgKCFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9ialByb3RvdHlwZV8xLCBuYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgZGVmaW5lUHJvcGVydHlfMShvYmpQcm90b3R5cGVfMSwgbmFtZSwge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZVByb3BlcnR5XzEodGhpcywgbmFtZSwgdXRpbF8xLmdldFZhbHVlRGVzY3JpcHRvcih2YWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuYW1lO1xyXG4gICAgICAgIH07XHJcbiAgICB9KSgpO1xyXG4gICAgdmFyIEludGVybmFsU3ltYm9sXzEgPSBmdW5jdGlvbiBTeW1ib2woZGVzY3JpcHRpb24pIHtcclxuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEludGVybmFsU3ltYm9sXzEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHlwZUVycm9yOiBTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3InKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFN5bWJvbChkZXNjcmlwdGlvbik7XHJcbiAgICB9O1xyXG4gICAgZXhwb3J0cy5TeW1ib2wgPSBnbG9iYWxfMS5kZWZhdWx0LlN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbChkZXNjcmlwdGlvbikge1xyXG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgU3ltYm9sKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1R5cGVFcnJvcjogU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBzeW0gPSBPYmplY3QuY3JlYXRlKEludGVybmFsU3ltYm9sXzEucHJvdG90eXBlKTtcclxuICAgICAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQgPyAnJyA6IFN0cmluZyhkZXNjcmlwdGlvbik7XHJcbiAgICAgICAgcmV0dXJuIGRlZmluZVByb3BlcnRpZXNfMShzeW0sIHtcclxuICAgICAgICAgICAgX19kZXNjcmlwdGlvbl9fOiB1dGlsXzEuZ2V0VmFsdWVEZXNjcmlwdG9yKGRlc2NyaXB0aW9uKSxcclxuICAgICAgICAgICAgX19uYW1lX186IHV0aWxfMS5nZXRWYWx1ZURlc2NyaXB0b3IoZ2V0U3ltYm9sTmFtZV8xKGRlc2NyaXB0aW9uKSlcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbiAgICAvKiBEZWNvcmF0ZSB0aGUgU3ltYm9sIGZ1bmN0aW9uIHdpdGggdGhlIGFwcHJvcHJpYXRlIHByb3BlcnRpZXMgKi9cclxuICAgIGRlZmluZVByb3BlcnR5XzEoZXhwb3J0cy5TeW1ib2wsICdmb3InLCB1dGlsXzEuZ2V0VmFsdWVEZXNjcmlwdG9yKGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICBpZiAoZ2xvYmFsU3ltYm9sc18xW2tleV0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGdsb2JhbFN5bWJvbHNfMVtrZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKGdsb2JhbFN5bWJvbHNfMVtrZXldID0gZXhwb3J0cy5TeW1ib2woU3RyaW5nKGtleSkpKTtcclxuICAgIH0pKTtcclxuICAgIGRlZmluZVByb3BlcnRpZXNfMShleHBvcnRzLlN5bWJvbCwge1xyXG4gICAgICAgIGtleUZvcjogdXRpbF8xLmdldFZhbHVlRGVzY3JpcHRvcihmdW5jdGlvbiAoc3ltKSB7XHJcbiAgICAgICAgICAgIHZhciBrZXk7XHJcbiAgICAgICAgICAgIHZhbGlkYXRlU3ltYm9sXzEoc3ltKTtcclxuICAgICAgICAgICAgZm9yIChrZXkgaW4gZ2xvYmFsU3ltYm9sc18xKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsU3ltYm9sc18xW2tleV0gPT09IHN5bSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICBoYXNJbnN0YW5jZTogdXRpbF8xLmdldFZhbHVlRGVzY3JpcHRvcihleHBvcnRzLlN5bWJvbC5mb3IoJ2hhc0luc3RhbmNlJyksIGZhbHNlLCBmYWxzZSksXHJcbiAgICAgICAgaXNDb25jYXRTcHJlYWRhYmxlOiB1dGlsXzEuZ2V0VmFsdWVEZXNjcmlwdG9yKGV4cG9ydHMuU3ltYm9sLmZvcignaXNDb25jYXRTcHJlYWRhYmxlJyksIGZhbHNlLCBmYWxzZSksXHJcbiAgICAgICAgaXRlcmF0b3I6IHV0aWxfMS5nZXRWYWx1ZURlc2NyaXB0b3IoZXhwb3J0cy5TeW1ib2wuZm9yKCdpdGVyYXRvcicpLCBmYWxzZSwgZmFsc2UpLFxyXG4gICAgICAgIG1hdGNoOiB1dGlsXzEuZ2V0VmFsdWVEZXNjcmlwdG9yKGV4cG9ydHMuU3ltYm9sLmZvcignbWF0Y2gnKSwgZmFsc2UsIGZhbHNlKSxcclxuICAgICAgICBvYnNlcnZhYmxlOiB1dGlsXzEuZ2V0VmFsdWVEZXNjcmlwdG9yKGV4cG9ydHMuU3ltYm9sLmZvcignb2JzZXJ2YWJsZScpLCBmYWxzZSwgZmFsc2UpLFxyXG4gICAgICAgIHJlcGxhY2U6IHV0aWxfMS5nZXRWYWx1ZURlc2NyaXB0b3IoZXhwb3J0cy5TeW1ib2wuZm9yKCdyZXBsYWNlJyksIGZhbHNlLCBmYWxzZSksXHJcbiAgICAgICAgc2VhcmNoOiB1dGlsXzEuZ2V0VmFsdWVEZXNjcmlwdG9yKGV4cG9ydHMuU3ltYm9sLmZvcignc2VhcmNoJyksIGZhbHNlLCBmYWxzZSksXHJcbiAgICAgICAgc3BlY2llczogdXRpbF8xLmdldFZhbHVlRGVzY3JpcHRvcihleHBvcnRzLlN5bWJvbC5mb3IoJ3NwZWNpZXMnKSwgZmFsc2UsIGZhbHNlKSxcclxuICAgICAgICBzcGxpdDogdXRpbF8xLmdldFZhbHVlRGVzY3JpcHRvcihleHBvcnRzLlN5bWJvbC5mb3IoJ3NwbGl0JyksIGZhbHNlLCBmYWxzZSksXHJcbiAgICAgICAgdG9QcmltaXRpdmU6IHV0aWxfMS5nZXRWYWx1ZURlc2NyaXB0b3IoZXhwb3J0cy5TeW1ib2wuZm9yKCd0b1ByaW1pdGl2ZScpLCBmYWxzZSwgZmFsc2UpLFxyXG4gICAgICAgIHRvU3RyaW5nVGFnOiB1dGlsXzEuZ2V0VmFsdWVEZXNjcmlwdG9yKGV4cG9ydHMuU3ltYm9sLmZvcigndG9TdHJpbmdUYWcnKSwgZmFsc2UsIGZhbHNlKSxcclxuICAgICAgICB1bnNjb3BhYmxlczogdXRpbF8xLmdldFZhbHVlRGVzY3JpcHRvcihleHBvcnRzLlN5bWJvbC5mb3IoJ3Vuc2NvcGFibGVzJyksIGZhbHNlLCBmYWxzZSlcclxuICAgIH0pO1xyXG4gICAgLyogRGVjb3JhdGUgdGhlIEludGVybmFsU3ltYm9sIG9iamVjdCAqL1xyXG4gICAgZGVmaW5lUHJvcGVydGllc18xKEludGVybmFsU3ltYm9sXzEucHJvdG90eXBlLCB7XHJcbiAgICAgICAgY29uc3RydWN0b3I6IHV0aWxfMS5nZXRWYWx1ZURlc2NyaXB0b3IoZXhwb3J0cy5TeW1ib2wpLFxyXG4gICAgICAgIHRvU3RyaW5nOiB1dGlsXzEuZ2V0VmFsdWVEZXNjcmlwdG9yKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX19uYW1lX187XHJcbiAgICAgICAgfSwgZmFsc2UsIGZhbHNlKVxyXG4gICAgfSk7XHJcbiAgICAvKiBEZWNvcmF0ZSB0aGUgU3ltYm9sLnByb3RvdHlwZSAqL1xyXG4gICAgZGVmaW5lUHJvcGVydGllc18xKGV4cG9ydHMuU3ltYm9sLnByb3RvdHlwZSwge1xyXG4gICAgICAgIHRvU3RyaW5nOiB1dGlsXzEuZ2V0VmFsdWVEZXNjcmlwdG9yKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdTeW1ib2wgKCcgKyB2YWxpZGF0ZVN5bWJvbF8xKHRoaXMpLl9fZGVzY3JpcHRpb25fXyArICcpJztcclxuICAgICAgICB9KSxcclxuICAgICAgICB2YWx1ZU9mOiB1dGlsXzEuZ2V0VmFsdWVEZXNjcmlwdG9yKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlU3ltYm9sXzEodGhpcyk7XHJcbiAgICAgICAgfSlcclxuICAgIH0pO1xyXG4gICAgZGVmaW5lUHJvcGVydHlfMShleHBvcnRzLlN5bWJvbC5wcm90b3R5cGUsIGV4cG9ydHMuU3ltYm9sLnRvUHJpbWl0aXZlLCB1dGlsXzEuZ2V0VmFsdWVEZXNjcmlwdG9yKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gdmFsaWRhdGVTeW1ib2xfMSh0aGlzKTtcclxuICAgIH0pKTtcclxuICAgIGRlZmluZVByb3BlcnR5XzEoZXhwb3J0cy5TeW1ib2wucHJvdG90eXBlLCBleHBvcnRzLlN5bWJvbC50b1N0cmluZ1RhZywgdXRpbF8xLmdldFZhbHVlRGVzY3JpcHRvcignU3ltYm9sJywgZmFsc2UsIGZhbHNlLCB0cnVlKSk7XHJcbiAgICBkZWZpbmVQcm9wZXJ0eV8xKEludGVybmFsU3ltYm9sXzEucHJvdG90eXBlLCBleHBvcnRzLlN5bWJvbC50b1ByaW1pdGl2ZSwgdXRpbF8xLmdldFZhbHVlRGVzY3JpcHRvcihleHBvcnRzLlN5bWJvbC5wcm90b3R5cGVbZXhwb3J0cy5TeW1ib2wudG9QcmltaXRpdmVdLCBmYWxzZSwgZmFsc2UsIHRydWUpKTtcclxuICAgIGRlZmluZVByb3BlcnR5XzEoSW50ZXJuYWxTeW1ib2xfMS5wcm90b3R5cGUsIGV4cG9ydHMuU3ltYm9sLnRvU3RyaW5nVGFnLCB1dGlsXzEuZ2V0VmFsdWVEZXNjcmlwdG9yKGV4cG9ydHMuU3ltYm9sLnByb3RvdHlwZVtleHBvcnRzLlN5bWJvbC50b1N0cmluZ1RhZ10sIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpO1xyXG59XHJcbi8qKlxyXG4gKiBBIGN1c3RvbSBndWFyZCBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgaWYgYW4gb2JqZWN0IGlzIGEgc3ltYm9sIG9yIG5vdFxyXG4gKiBAcGFyYW0gIHthbnl9ICAgICAgIHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjayB0byBzZWUgaWYgaXQgaXMgYSBzeW1ib2wgb3Igbm90XHJcbiAqIEByZXR1cm4ge2lzIHN5bWJvbH0gICAgICAgUmV0dXJucyB0cnVlIGlmIGEgc3ltYm9sIG9yIG5vdCAoYW5kIG5hcnJvd3MgdGhlIHR5cGUgZ3VhcmQpXHJcbiAqL1xyXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xyXG4gICAgcmV0dXJuICh2YWx1ZSAmJiAodHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJyB8fCB2YWx1ZVsnQEB0b1N0cmluZ1RhZyddID09PSAnU3ltYm9sJykpIHx8IGZhbHNlO1xyXG59XHJcbmV4cG9ydHMuaXNTeW1ib2wgPSBpc1N5bWJvbDtcclxuLyoqXHJcbiAqIEZpbGwgYW55IG1pc3Npbmcgd2VsbCBrbm93biBzeW1ib2xzIGlmIHRoZSBuYXRpdmUgU3ltYm9sIGlzIG1pc3NpbmcgdGhlbVxyXG4gKi9cclxuW1xyXG4gICAgJ2hhc0luc3RhbmNlJyxcclxuICAgICdpc0NvbmNhdFNwcmVhZGFibGUnLFxyXG4gICAgJ2l0ZXJhdG9yJyxcclxuICAgICdzcGVjaWVzJyxcclxuICAgICdyZXBsYWNlJyxcclxuICAgICdzZWFyY2gnLFxyXG4gICAgJ3NwbGl0JyxcclxuICAgICdtYXRjaCcsXHJcbiAgICAndG9QcmltaXRpdmUnLFxyXG4gICAgJ3RvU3RyaW5nVGFnJyxcclxuICAgICd1bnNjb3BhYmxlcycsXHJcbiAgICAnb2JzZXJ2YWJsZSdcclxuXS5mb3JFYWNoKGZ1bmN0aW9uICh3ZWxsS25vd24pIHtcclxuICAgIGlmICghZXhwb3J0cy5TeW1ib2xbd2VsbEtub3duXSkge1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLlN5bWJvbCwgd2VsbEtub3duLCB1dGlsXzEuZ2V0VmFsdWVEZXNjcmlwdG9yKGV4cG9ydHMuU3ltYm9sLmZvcih3ZWxsS25vd24pLCBmYWxzZSwgZmFsc2UpKTtcclxuICAgIH1cclxufSk7XHJcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMuU3ltYm9sO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vU3ltYm9sLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL1N5bWJvbC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcclxudmFyIGdsb2JhbF8xID0gcmVxdWlyZShcIi4vZ2xvYmFsXCIpO1xyXG52YXIgaXRlcmF0b3JfMSA9IHJlcXVpcmUoXCIuL2l0ZXJhdG9yXCIpO1xyXG52YXIgaGFzXzEgPSByZXF1aXJlKFwiLi9zdXBwb3J0L2hhc1wiKTtcclxucmVxdWlyZShcIi4vU3ltYm9sXCIpO1xyXG5leHBvcnRzLldlYWtNYXAgPSBnbG9iYWxfMS5kZWZhdWx0LldlYWtNYXA7XHJcbmlmICghaGFzXzEuZGVmYXVsdCgnZXM2LXdlYWttYXAnKSkge1xyXG4gICAgdmFyIERFTEVURURfMSA9IHt9O1xyXG4gICAgdmFyIGdldFVJRF8xID0gZnVuY3Rpb24gZ2V0VUlEKCkge1xyXG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwMDApO1xyXG4gICAgfTtcclxuICAgIHZhciBnZW5lcmF0ZU5hbWVfMSA9IChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHN0YXJ0SWQgPSBNYXRoLmZsb29yKERhdGUubm93KCkgJSAxMDAwMDAwMDApO1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBnZW5lcmF0ZU5hbWUoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnX193bScgKyBnZXRVSURfMSgpICsgKHN0YXJ0SWQrKyArICdfXycpO1xyXG4gICAgICAgIH07XHJcbiAgICB9KSgpO1xyXG4gICAgZXhwb3J0cy5XZWFrTWFwID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIFdlYWtNYXAoaXRlcmFibGUpIHtcclxuICAgICAgICAgICAgdGhpc1tTeW1ib2wudG9TdHJpbmdUYWddID0gJ1dlYWtNYXAnO1xyXG4gICAgICAgICAgICB0aGlzLl9uYW1lID0gZ2VuZXJhdGVOYW1lXzEoKTtcclxuICAgICAgICAgICAgdGhpcy5fZnJvemVuRW50cmllcyA9IFtdO1xyXG4gICAgICAgICAgICBpZiAoaXRlcmFibGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVyYXRvcl8xLmlzQXJyYXlMaWtlKGl0ZXJhYmxlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlcmFibGUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBpdGVyYWJsZVtpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoaXRlbVswXSwgaXRlbVsxXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaXRlcmFibGVfMSA9IHRzbGliXzEuX192YWx1ZXMoaXRlcmFibGUpLCBpdGVyYWJsZV8xXzEgPSBpdGVyYWJsZV8xLm5leHQoKTsgIWl0ZXJhYmxlXzFfMS5kb25lOyBpdGVyYWJsZV8xXzEgPSBpdGVyYWJsZV8xLm5leHQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hID0gdHNsaWJfMS5fX3JlYWQoaXRlcmFibGVfMV8xLnZhbHVlLCAyKSwga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZXJhYmxlXzFfMSAmJiAhaXRlcmFibGVfMV8xLmRvbmUgJiYgKF9iID0gaXRlcmFibGVfMS5yZXR1cm4pKSBfYi5jYWxsKGl0ZXJhYmxlXzEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGVfMSwgX2I7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFdlYWtNYXAucHJvdG90eXBlLl9nZXRGcm96ZW5FbnRyeUluZGV4ID0gZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2Zyb3plbkVudHJpZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9mcm96ZW5FbnRyaWVzW2ldLmtleSA9PT0ga2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwga2V5ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGVudHJ5ID0ga2V5W3RoaXMuX25hbWVdO1xyXG4gICAgICAgICAgICBpZiAoZW50cnkgJiYgZW50cnkua2V5ID09PSBrZXkgJiYgZW50cnkudmFsdWUgIT09IERFTEVURURfMSkge1xyXG4gICAgICAgICAgICAgICAgZW50cnkudmFsdWUgPSBERUxFVEVEXzE7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgZnJvemVuSW5kZXggPSB0aGlzLl9nZXRGcm96ZW5FbnRyeUluZGV4KGtleSk7XHJcbiAgICAgICAgICAgIGlmIChmcm96ZW5JbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9mcm96ZW5FbnRyaWVzLnNwbGljZShmcm96ZW5JbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XHJcbiAgICAgICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGVudHJ5ID0ga2V5W3RoaXMuX25hbWVdO1xyXG4gICAgICAgICAgICBpZiAoZW50cnkgJiYgZW50cnkua2V5ID09PSBrZXkgJiYgZW50cnkudmFsdWUgIT09IERFTEVURURfMSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBmcm96ZW5JbmRleCA9IHRoaXMuX2dldEZyb3plbkVudHJ5SW5kZXgoa2V5KTtcclxuICAgICAgICAgICAgaWYgKGZyb3plbkluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mcm96ZW5FbnRyaWVzW2Zyb3plbkluZGV4XS52YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwga2V5ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGVudHJ5ID0ga2V5W3RoaXMuX25hbWVdO1xyXG4gICAgICAgICAgICBpZiAoQm9vbGVhbihlbnRyeSAmJiBlbnRyeS5rZXkgPT09IGtleSAmJiBlbnRyeS52YWx1ZSAhPT0gREVMRVRFRF8xKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGZyb3plbkluZGV4ID0gdGhpcy5fZ2V0RnJvemVuRW50cnlJbmRleChrZXkpO1xyXG4gICAgICAgICAgICBpZiAoZnJvemVuSW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcclxuICAgICAgICAgICAgaWYgKCFrZXkgfHwgKHR5cGVvZiBrZXkgIT09ICdvYmplY3QnICYmIHR5cGVvZiBrZXkgIT09ICdmdW5jdGlvbicpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHZhbHVlIHVzZWQgYXMgd2VhayBtYXAga2V5Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGVudHJ5ID0ga2V5W3RoaXMuX25hbWVdO1xyXG4gICAgICAgICAgICBpZiAoIWVudHJ5IHx8IGVudHJ5LmtleSAhPT0ga2V5KSB7XHJcbiAgICAgICAgICAgICAgICBlbnRyeSA9IE9iamVjdC5jcmVhdGUobnVsbCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogeyB2YWx1ZToga2V5IH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5pc0Zyb3plbihrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZnJvemVuRW50cmllcy5wdXNoKGVudHJ5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShrZXksIHRoaXMuX25hbWUsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVudHJ5XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZW50cnkudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gV2Vha01hcDtcclxuICAgIH0oKSk7XHJcbn1cclxuZXhwb3J0cy5kZWZhdWx0ID0gZXhwb3J0cy5XZWFrTWFwO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vV2Vha01hcC5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9XZWFrTWFwLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xyXG52YXIgZ2xvYmFsXzEgPSByZXF1aXJlKFwiLi9nbG9iYWxcIik7XHJcbnZhciBpdGVyYXRvcl8xID0gcmVxdWlyZShcIi4vaXRlcmF0b3JcIik7XHJcbnZhciBudW1iZXJfMSA9IHJlcXVpcmUoXCIuL251bWJlclwiKTtcclxudmFyIGhhc18xID0gcmVxdWlyZShcIi4vc3VwcG9ydC9oYXNcIik7XHJcbnZhciB1dGlsXzEgPSByZXF1aXJlKFwiLi9zdXBwb3J0L3V0aWxcIik7XHJcbmlmIChoYXNfMS5kZWZhdWx0KCdlczYtYXJyYXknKSAmJiBoYXNfMS5kZWZhdWx0KCdlczYtYXJyYXktZmlsbCcpKSB7XHJcbiAgICBleHBvcnRzLmZyb20gPSBnbG9iYWxfMS5kZWZhdWx0LkFycmF5LmZyb207XHJcbiAgICBleHBvcnRzLm9mID0gZ2xvYmFsXzEuZGVmYXVsdC5BcnJheS5vZjtcclxuICAgIGV4cG9ydHMuY29weVdpdGhpbiA9IHV0aWxfMS53cmFwTmF0aXZlKGdsb2JhbF8xLmRlZmF1bHQuQXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4pO1xyXG4gICAgZXhwb3J0cy5maWxsID0gdXRpbF8xLndyYXBOYXRpdmUoZ2xvYmFsXzEuZGVmYXVsdC5BcnJheS5wcm90b3R5cGUuZmlsbCk7XHJcbiAgICBleHBvcnRzLmZpbmQgPSB1dGlsXzEud3JhcE5hdGl2ZShnbG9iYWxfMS5kZWZhdWx0LkFycmF5LnByb3RvdHlwZS5maW5kKTtcclxuICAgIGV4cG9ydHMuZmluZEluZGV4ID0gdXRpbF8xLndyYXBOYXRpdmUoZ2xvYmFsXzEuZGVmYXVsdC5BcnJheS5wcm90b3R5cGUuZmluZEluZGV4KTtcclxufVxyXG5lbHNlIHtcclxuICAgIC8vIEl0IGlzIG9ubHkgb2xkZXIgdmVyc2lvbnMgb2YgU2FmYXJpL2lPUyB0aGF0IGhhdmUgYSBiYWQgZmlsbCBpbXBsZW1lbnRhdGlvbiBhbmQgc28gYXJlbid0IGluIHRoZSB3aWxkXHJcbiAgICAvLyBUbyBtYWtlIHRoaW5ncyBlYXNpZXIsIGlmIHRoZXJlIGlzIGEgYmFkIGZpbGwgaW1wbGVtZW50YXRpb24sIHRoZSB3aG9sZSBzZXQgb2YgZnVuY3Rpb25zIHdpbGwgYmUgZmlsbGVkXHJcbiAgICAvKipcclxuICAgICAqIEVuc3VyZXMgYSBub24tbmVnYXRpdmUsIG5vbi1pbmZpbml0ZSwgc2FmZSBpbnRlZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciB0byB2YWxpZGF0ZVxyXG4gICAgICogQHJldHVybiBBIHByb3BlciBsZW5ndGhcclxuICAgICAqL1xyXG4gICAgdmFyIHRvTGVuZ3RoXzEgPSBmdW5jdGlvbiB0b0xlbmd0aChsZW5ndGgpIHtcclxuICAgICAgICBpZiAoaXNOYU4obGVuZ3RoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aCk7XHJcbiAgICAgICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcclxuICAgICAgICAgICAgbGVuZ3RoID0gTWF0aC5mbG9vcihsZW5ndGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBFbnN1cmUgYSBub24tbmVnYXRpdmUsIHJlYWwsIHNhZmUgaW50ZWdlclxyXG4gICAgICAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heChsZW5ndGgsIDApLCBudW1iZXJfMS5NQVhfU0FGRV9JTlRFR0VSKTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIEZyb20gRVM2IDcuMS40IFRvSW50ZWdlcigpXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHZhbHVlIEEgdmFsdWUgdG8gY29udmVydFxyXG4gICAgICogQHJldHVybiBBbiBpbnRlZ2VyXHJcbiAgICAgKi9cclxuICAgIHZhciB0b0ludGVnZXJfMSA9IGZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSkge1xyXG4gICAgICAgIHZhbHVlID0gTnVtYmVyKHZhbHVlKTtcclxuICAgICAgICBpZiAoaXNOYU4odmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsdWUgPT09IDAgfHwgIWlzRmluaXRlKHZhbHVlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAodmFsdWUgPiAwID8gMSA6IC0xKSAqIE1hdGguZmxvb3IoTWF0aC5hYnModmFsdWUpKTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIE5vcm1hbGl6ZXMgYW4gb2Zmc2V0IGFnYWluc3QgYSBnaXZlbiBsZW5ndGgsIHdyYXBwaW5nIGl0IGlmIG5lZ2F0aXZlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgb3JpZ2luYWwgb2Zmc2V0XHJcbiAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSB0b3RhbCBsZW5ndGggdG8gbm9ybWFsaXplIGFnYWluc3RcclxuICAgICAqIEByZXR1cm4gSWYgbmVnYXRpdmUsIHByb3ZpZGUgYSBkaXN0YW5jZSBmcm9tIHRoZSBlbmQgKGxlbmd0aCk7IG90aGVyd2lzZSBwcm92aWRlIGEgZGlzdGFuY2UgZnJvbSAwXHJcbiAgICAgKi9cclxuICAgIHZhciBub3JtYWxpemVPZmZzZXRfMSA9IGZ1bmN0aW9uIG5vcm1hbGl6ZU9mZnNldCh2YWx1ZSwgbGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlIDwgMCA/IE1hdGgubWF4KGxlbmd0aCArIHZhbHVlLCAwKSA6IE1hdGgubWluKHZhbHVlLCBsZW5ndGgpO1xyXG4gICAgfTtcclxuICAgIGV4cG9ydHMuZnJvbSA9IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlLCBtYXBGdW5jdGlvbiwgdGhpc0FyZykge1xyXG4gICAgICAgIGlmIChhcnJheUxpa2UgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdmcm9tOiByZXF1aXJlcyBhbiBhcnJheS1saWtlIG9iamVjdCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobWFwRnVuY3Rpb24gJiYgdGhpc0FyZykge1xyXG4gICAgICAgICAgICBtYXBGdW5jdGlvbiA9IG1hcEZ1bmN0aW9uLmJpbmQodGhpc0FyZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lICovXHJcbiAgICAgICAgdmFyIENvbnN0cnVjdG9yID0gdGhpcztcclxuICAgICAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGhfMShhcnJheUxpa2UubGVuZ3RoKTtcclxuICAgICAgICAvLyBTdXBwb3J0IGV4dGVuc2lvblxyXG4gICAgICAgIHZhciBhcnJheSA9IHR5cGVvZiBDb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyA/IE9iamVjdChuZXcgQ29uc3RydWN0b3IobGVuZ3RoKSkgOiBuZXcgQXJyYXkobGVuZ3RoKTtcclxuICAgICAgICBpZiAoIWl0ZXJhdG9yXzEuaXNBcnJheUxpa2UoYXJyYXlMaWtlKSAmJiAhaXRlcmF0b3JfMS5pc0l0ZXJhYmxlKGFycmF5TGlrZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFycmF5O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGFycmF5IGFuZCB0aGUgbm9ybWFsaXplZCBsZW5ndGggaXMgMCwganVzdCByZXR1cm4gYW4gZW1wdHkgYXJyYXkuIHRoaXMgcHJldmVudHMgYSBwcm9ibGVtXHJcbiAgICAgICAgLy8gd2l0aCB0aGUgaXRlcmF0aW9uIG9uIElFIHdoZW4gdXNpbmcgYSBOYU4gYXJyYXkgbGVuZ3RoLlxyXG4gICAgICAgIGlmIChpdGVyYXRvcl8xLmlzQXJyYXlMaWtlKGFycmF5TGlrZSkpIHtcclxuICAgICAgICAgICAgaWYgKGxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlMaWtlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IG1hcEZ1bmN0aW9uID8gbWFwRnVuY3Rpb24oYXJyYXlMaWtlW2ldLCBpKSA6IGFycmF5TGlrZVtpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIGkgPSAwO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgYXJyYXlMaWtlXzEgPSB0c2xpYl8xLl9fdmFsdWVzKGFycmF5TGlrZSksIGFycmF5TGlrZV8xXzEgPSBhcnJheUxpa2VfMS5uZXh0KCk7ICFhcnJheUxpa2VfMV8xLmRvbmU7IGFycmF5TGlrZV8xXzEgPSBhcnJheUxpa2VfMS5uZXh0KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBhcnJheUxpa2VfMV8xLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGFycmF5W2ldID0gbWFwRnVuY3Rpb24gPyBtYXBGdW5jdGlvbih2YWx1ZSwgaSkgOiB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cclxuICAgICAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhcnJheUxpa2VfMV8xICYmICFhcnJheUxpa2VfMV8xLmRvbmUgJiYgKF9hID0gYXJyYXlMaWtlXzEucmV0dXJuKSkgX2EuY2FsbChhcnJheUxpa2VfMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFycmF5TGlrZS5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBhcnJheS5sZW5ndGggPSBsZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhcnJheTtcclxuICAgICAgICB2YXIgZV8xLCBfYTtcclxuICAgIH07XHJcbiAgICBleHBvcnRzLm9mID0gZnVuY3Rpb24gb2YoKSB7XHJcbiAgICAgICAgdmFyIGl0ZW1zID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgaXRlbXNbX2ldID0gYXJndW1lbnRzW19pXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGl0ZW1zKTtcclxuICAgIH07XHJcbiAgICBleHBvcnRzLmNvcHlXaXRoaW4gPSBmdW5jdGlvbiBjb3B5V2l0aGluKHRhcmdldCwgb2Zmc2V0LCBzdGFydCwgZW5kKSB7XHJcbiAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NvcHlXaXRoaW46IHRhcmdldCBtdXN0IGJlIGFuIGFycmF5LWxpa2Ugb2JqZWN0Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aF8xKHRhcmdldC5sZW5ndGgpO1xyXG4gICAgICAgIG9mZnNldCA9IG5vcm1hbGl6ZU9mZnNldF8xKHRvSW50ZWdlcl8xKG9mZnNldCksIGxlbmd0aCk7XHJcbiAgICAgICAgc3RhcnQgPSBub3JtYWxpemVPZmZzZXRfMSh0b0ludGVnZXJfMShzdGFydCksIGxlbmd0aCk7XHJcbiAgICAgICAgZW5kID0gbm9ybWFsaXplT2Zmc2V0XzEoZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0ludGVnZXJfMShlbmQpLCBsZW5ndGgpO1xyXG4gICAgICAgIHZhciBjb3VudCA9IE1hdGgubWluKGVuZCAtIHN0YXJ0LCBsZW5ndGggLSBvZmZzZXQpO1xyXG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSAxO1xyXG4gICAgICAgIGlmIChvZmZzZXQgPiBzdGFydCAmJiBvZmZzZXQgPCBzdGFydCArIGNvdW50KSB7XHJcbiAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xO1xyXG4gICAgICAgICAgICBzdGFydCArPSBjb3VudCAtIDE7XHJcbiAgICAgICAgICAgIG9mZnNldCArPSBjb3VudCAtIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHdoaWxlIChjb3VudCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0IGluIHRhcmdldCkge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0W29mZnNldF0gPSB0YXJnZXRbc3RhcnRdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRhcmdldFtvZmZzZXRdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9mZnNldCArPSBkaXJlY3Rpb247XHJcbiAgICAgICAgICAgIHN0YXJ0ICs9IGRpcmVjdGlvbjtcclxuICAgICAgICAgICAgY291bnQtLTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcclxuICAgIH07XHJcbiAgICBleHBvcnRzLmZpbGwgPSBmdW5jdGlvbiBmaWxsKHRhcmdldCwgdmFsdWUsIHN0YXJ0LCBlbmQpIHtcclxuICAgICAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGhfMSh0YXJnZXQubGVuZ3RoKTtcclxuICAgICAgICB2YXIgaSA9IG5vcm1hbGl6ZU9mZnNldF8xKHRvSW50ZWdlcl8xKHN0YXJ0KSwgbGVuZ3RoKTtcclxuICAgICAgICBlbmQgPSBub3JtYWxpemVPZmZzZXRfMShlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvSW50ZWdlcl8xKGVuZCksIGxlbmd0aCk7XHJcbiAgICAgICAgd2hpbGUgKGkgPCBlbmQpIHtcclxuICAgICAgICAgICAgdGFyZ2V0W2krK10gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcclxuICAgIH07XHJcbiAgICBleHBvcnRzLmZpbmQgPSBmdW5jdGlvbiBmaW5kKHRhcmdldCwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcclxuICAgICAgICB2YXIgaW5kZXggPSBleHBvcnRzLmZpbmRJbmRleCh0YXJnZXQsIGNhbGxiYWNrLCB0aGlzQXJnKTtcclxuICAgICAgICByZXR1cm4gaW5kZXggIT09IC0xID8gdGFyZ2V0W2luZGV4XSA6IHVuZGVmaW5lZDtcclxuICAgIH07XHJcbiAgICBleHBvcnRzLmZpbmRJbmRleCA9IGZ1bmN0aW9uIGZpbmRJbmRleCh0YXJnZXQsIGNhbGxiYWNrLCB0aGlzQXJnKSB7XHJcbiAgICAgICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoXzEodGFyZ2V0Lmxlbmd0aCk7XHJcbiAgICAgICAgaWYgKCFjYWxsYmFjaykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdmaW5kOiBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzQXJnKSB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2suYmluZCh0aGlzQXJnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2sodGFyZ2V0W2ldLCBpLCB0YXJnZXQpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICB9O1xyXG59XHJcbmlmIChoYXNfMS5kZWZhdWx0KCdlczctYXJyYXknKSkge1xyXG4gICAgZXhwb3J0cy5pbmNsdWRlcyA9IHV0aWxfMS53cmFwTmF0aXZlKGdsb2JhbF8xLmRlZmF1bHQuQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzKTtcclxufVxyXG5lbHNlIHtcclxuICAgIC8qKlxyXG4gICAgICogRW5zdXJlcyBhIG5vbi1uZWdhdGl2ZSwgbm9uLWluZmluaXRlLCBzYWZlIGludGVnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIHRvIHZhbGlkYXRlXHJcbiAgICAgKiBAcmV0dXJuIEEgcHJvcGVyIGxlbmd0aFxyXG4gICAgICovXHJcbiAgICB2YXIgdG9MZW5ndGhfMiA9IGZ1bmN0aW9uIHRvTGVuZ3RoKGxlbmd0aCkge1xyXG4gICAgICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpO1xyXG4gICAgICAgIGlmIChpc05hTihsZW5ndGgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xyXG4gICAgICAgICAgICBsZW5ndGggPSBNYXRoLmZsb29yKGxlbmd0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEVuc3VyZSBhIG5vbi1uZWdhdGl2ZSwgcmVhbCwgc2FmZSBpbnRlZ2VyXHJcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KGxlbmd0aCwgMCksIG51bWJlcl8xLk1BWF9TQUZFX0lOVEVHRVIpO1xyXG4gICAgfTtcclxuICAgIGV4cG9ydHMuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyh0YXJnZXQsIHNlYXJjaEVsZW1lbnQsIGZyb21JbmRleCkge1xyXG4gICAgICAgIGlmIChmcm9tSW5kZXggPT09IHZvaWQgMCkgeyBmcm9tSW5kZXggPSAwOyB9XHJcbiAgICAgICAgdmFyIGxlbiA9IHRvTGVuZ3RoXzIodGFyZ2V0Lmxlbmd0aCk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IGZyb21JbmRleDsgaSA8IGxlbjsgKytpKSB7XHJcbiAgICAgICAgICAgIHZhciBjdXJyZW50RWxlbWVudCA9IHRhcmdldFtpXTtcclxuICAgICAgICAgICAgaWYgKHNlYXJjaEVsZW1lbnQgPT09IGN1cnJlbnRFbGVtZW50IHx8XHJcbiAgICAgICAgICAgICAgICAoc2VhcmNoRWxlbWVudCAhPT0gc2VhcmNoRWxlbWVudCAmJiBjdXJyZW50RWxlbWVudCAhPT0gY3VycmVudEVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9O1xyXG59XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9hcnJheS5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9hcnJheS5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgZ2xvYmFsT2JqZWN0ID0gKGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIC8vIGdsb2JhbCBzcGVjIGRlZmluZXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QgY2FsbGVkICdnbG9iYWwnXHJcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZ2xvYmFsXHJcbiAgICAgICAgLy8gYGdsb2JhbGAgaXMgYWxzbyBkZWZpbmVkIGluIE5vZGVKU1xyXG4gICAgICAgIHJldHVybiBnbG9iYWw7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIC8vIHdpbmRvdyBpcyBkZWZpbmVkIGluIGJyb3dzZXJzXHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdztcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIC8vIHNlbGYgaXMgZGVmaW5lZCBpbiBXZWJXb3JrZXJzXHJcbiAgICAgICAgcmV0dXJuIHNlbGY7XHJcbiAgICB9XHJcbn0pKCk7XHJcbmV4cG9ydHMuZGVmYXVsdCA9IGdsb2JhbE9iamVjdDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9nbG9iYWwuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxucmVxdWlyZShcIi4vU3ltYm9sXCIpO1xyXG52YXIgc3RyaW5nXzEgPSByZXF1aXJlKFwiLi9zdHJpbmdcIik7XHJcbnZhciBzdGF0aWNEb25lID0geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XHJcbi8qKlxyXG4gKiBBIGNsYXNzIHRoYXQgX3NoaW1zXyBhbiBpdGVyYXRvciBpbnRlcmZhY2Ugb24gYXJyYXkgbGlrZSBvYmplY3RzLlxyXG4gKi9cclxudmFyIFNoaW1JdGVyYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIFNoaW1JdGVyYXRvcihsaXN0KSB7XHJcbiAgICAgICAgdGhpcy5fbmV4dEluZGV4ID0gLTE7XHJcbiAgICAgICAgaWYgKGlzSXRlcmFibGUobGlzdCkpIHtcclxuICAgICAgICAgICAgdGhpcy5fbmF0aXZlSXRlcmF0b3IgPSBsaXN0W1N5bWJvbC5pdGVyYXRvcl0oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xpc3QgPSBsaXN0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRoZSBuZXh0IGl0ZXJhdGlvbiByZXN1bHQgZm9yIHRoZSBJdGVyYXRvclxyXG4gICAgICovXHJcbiAgICBTaGltSXRlcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX25hdGl2ZUl0ZXJhdG9yKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9uYXRpdmVJdGVyYXRvci5uZXh0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5fbGlzdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gc3RhdGljRG9uZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCsrdGhpcy5fbmV4dEluZGV4IDwgdGhpcy5fbGlzdC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuX2xpc3RbdGhpcy5fbmV4dEluZGV4XVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3RhdGljRG9uZTtcclxuICAgIH07XHJcbiAgICBTaGltSXRlcmF0b3IucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIFNoaW1JdGVyYXRvcjtcclxufSgpKTtcclxuZXhwb3J0cy5TaGltSXRlcmF0b3IgPSBTaGltSXRlcmF0b3I7XHJcbi8qKlxyXG4gKiBBIHR5cGUgZ3VhcmQgZm9yIGNoZWNraW5nIGlmIHNvbWV0aGluZyBoYXMgYW4gSXRlcmFibGUgaW50ZXJmYWNlXHJcbiAqXHJcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdHlwZSBndWFyZCBhZ2FpbnN0XHJcbiAqL1xyXG5mdW5jdGlvbiBpc0l0ZXJhYmxlKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlW1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbic7XHJcbn1cclxuZXhwb3J0cy5pc0l0ZXJhYmxlID0gaXNJdGVyYWJsZTtcclxuLyoqXHJcbiAqIEEgdHlwZSBndWFyZCBmb3IgY2hlY2tpbmcgaWYgc29tZXRoaW5nIGlzIEFycmF5TGlrZVxyXG4gKlxyXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHR5cGUgZ3VhcmQgYWdhaW5zdFxyXG4gKi9cclxuZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcclxuICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUubGVuZ3RoID09PSAnbnVtYmVyJztcclxufVxyXG5leHBvcnRzLmlzQXJyYXlMaWtlID0gaXNBcnJheUxpa2U7XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBpdGVyYXRvciBmb3IgYW4gb2JqZWN0XHJcbiAqXHJcbiAqIEBwYXJhbSBpdGVyYWJsZSBUaGUgaXRlcmFibGUgb2JqZWN0IHRvIHJldHVybiB0aGUgaXRlcmF0b3IgZm9yXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXQoaXRlcmFibGUpIHtcclxuICAgIGlmIChpc0l0ZXJhYmxlKGl0ZXJhYmxlKSkge1xyXG4gICAgICAgIHJldHVybiBpdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChpc0FycmF5TGlrZShpdGVyYWJsZSkpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFNoaW1JdGVyYXRvcihpdGVyYWJsZSk7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cy5nZXQgPSBnZXQ7XHJcbi8qKlxyXG4gKiBTaGltcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBgZm9yIC4uLiBvZmAgYmxvY2tzXHJcbiAqXHJcbiAqIEBwYXJhbSBpdGVyYWJsZSBUaGUgb2JqZWN0IHRoZSBwcm92aWRlcyBhbiBpbnRlcmF0b3IgaW50ZXJmYWNlXHJcbiAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2ggaXRlbSBvZiB0aGUgaXRlcmFibGVcclxuICogQHBhcmFtIHRoaXNBcmcgT3B0aW9uYWwgc2NvcGUgdG8gcGFzcyB0aGUgY2FsbGJhY2tcclxuICovXHJcbmZ1bmN0aW9uIGZvck9mKGl0ZXJhYmxlLCBjYWxsYmFjaywgdGhpc0FyZykge1xyXG4gICAgdmFyIGJyb2tlbiA9IGZhbHNlO1xyXG4gICAgZnVuY3Rpb24gZG9CcmVhaygpIHtcclxuICAgICAgICBicm9rZW4gPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgLyogV2UgbmVlZCB0byBoYW5kbGUgaXRlcmF0aW9uIG9mIGRvdWJsZSBieXRlIHN0cmluZ3MgcHJvcGVybHkgKi9cclxuICAgIGlmIChpc0FycmF5TGlrZShpdGVyYWJsZSkgJiYgdHlwZW9mIGl0ZXJhYmxlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHZhciBsID0gaXRlcmFibGUubGVuZ3RoO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgKytpKSB7XHJcbiAgICAgICAgICAgIHZhciBjaGFyID0gaXRlcmFibGVbaV07XHJcbiAgICAgICAgICAgIGlmIChpICsgMSA8IGwpIHtcclxuICAgICAgICAgICAgICAgIHZhciBjb2RlID0gY2hhci5jaGFyQ29kZUF0KDApO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvZGUgPj0gc3RyaW5nXzEuSElHSF9TVVJST0dBVEVfTUlOICYmIGNvZGUgPD0gc3RyaW5nXzEuSElHSF9TVVJST0dBVEVfTUFYKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hhciArPSBpdGVyYWJsZVsrK2ldO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgY2hhciwgaXRlcmFibGUsIGRvQnJlYWspO1xyXG4gICAgICAgICAgICBpZiAoYnJva2VuKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICB2YXIgaXRlcmF0b3IgPSBnZXQoaXRlcmFibGUpO1xyXG4gICAgICAgIGlmIChpdGVyYXRvcikge1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xyXG4gICAgICAgICAgICB3aGlsZSAoIXJlc3VsdC5kb25lKSB7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHJlc3VsdC52YWx1ZSwgaXRlcmFibGUsIGRvQnJlYWspO1xyXG4gICAgICAgICAgICAgICAgaWYgKGJyb2tlbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5leHBvcnRzLmZvck9mID0gZm9yT2Y7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9pdGVyYXRvci5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9pdGVyYXRvci5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgZ2xvYmFsXzEgPSByZXF1aXJlKFwiLi9nbG9iYWxcIik7XHJcbi8qKlxyXG4gKiBUaGUgc21hbGxlc3QgaW50ZXJ2YWwgYmV0d2VlbiB0d28gcmVwcmVzZW50YWJsZSBudW1iZXJzLlxyXG4gKi9cclxuZXhwb3J0cy5FUFNJTE9OID0gMTtcclxuLyoqXHJcbiAqIFRoZSBtYXhpbXVtIHNhZmUgaW50ZWdlciBpbiBKYXZhU2NyaXB0XHJcbiAqL1xyXG5leHBvcnRzLk1BWF9TQUZFX0lOVEVHRVIgPSBNYXRoLnBvdygyLCA1MykgLSAxO1xyXG4vKipcclxuICogVGhlIG1pbmltdW0gc2FmZSBpbnRlZ2VyIGluIEphdmFTY3JpcHRcclxuICovXHJcbmV4cG9ydHMuTUlOX1NBRkVfSU5URUdFUiA9IC1leHBvcnRzLk1BWF9TQUZFX0lOVEVHRVI7XHJcbi8qKlxyXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhc3NlZCB2YWx1ZSBpcyBOYU4gd2l0aG91dCBjb2Vyc2lvbi5cclxuICpcclxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB0ZXN0XHJcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgTmFOLCBmYWxzZSBpZiBpdCBpcyBub3RcclxuICovXHJcbmZ1bmN0aW9uIGlzTmFOKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBnbG9iYWxfMS5kZWZhdWx0LmlzTmFOKHZhbHVlKTtcclxufVxyXG5leHBvcnRzLmlzTmFOID0gaXNOYU47XHJcbi8qKlxyXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhc3NlZCB2YWx1ZSBpcyBhIGZpbml0ZSBudW1iZXIgd2l0aG91dCBjb2Vyc2lvbi5cclxuICpcclxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB0ZXN0XHJcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgZmluaXRlLCBmYWxzZSBpZiBpdCBpcyBub3RcclxuICovXHJcbmZ1bmN0aW9uIGlzRmluaXRlKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBnbG9iYWxfMS5kZWZhdWx0LmlzRmluaXRlKHZhbHVlKTtcclxufVxyXG5leHBvcnRzLmlzRmluaXRlID0gaXNGaW5pdGU7XHJcbi8qKlxyXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhc3NlZCB2YWx1ZSBpcyBhbiBpbnRlZ2VyLlxyXG4gKlxyXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3RcclxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLCBmYWxzZSBpZiBpdCBpcyBub3RcclxuICovXHJcbmZ1bmN0aW9uIGlzSW50ZWdlcih2YWx1ZSkge1xyXG4gICAgcmV0dXJuIGlzRmluaXRlKHZhbHVlKSAmJiBNYXRoLmZsb29yKHZhbHVlKSA9PT0gdmFsdWU7XHJcbn1cclxuZXhwb3J0cy5pc0ludGVnZXIgPSBpc0ludGVnZXI7XHJcbi8qKlxyXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhc3NlZCB2YWx1ZSBpcyBhbiBpbnRlZ2VyIHRoYXQgaXMgJ3NhZmUsJyBtZWFuaW5nOlxyXG4gKiAgIDEuIGl0IGNhbiBiZSBleHByZXNzZWQgYXMgYW4gSUVFRS03NTQgZG91YmxlIHByZWNpc2lvbiBudW1iZXJcclxuICogICAyLiBpdCBoYXMgYSBvbmUtdG8tb25lIG1hcHBpbmcgdG8gYSBtYXRoZW1hdGljYWwgaW50ZWdlciwgbWVhbmluZyBpdHNcclxuICogICAgICBJRUVFLTc1NCByZXByZXNlbnRhdGlvbiBjYW5ub3QgYmUgdGhlIHJlc3VsdCBvZiByb3VuZGluZyBhbnkgb3RoZXJcclxuICogICAgICBpbnRlZ2VyIHRvIGZpdCB0aGUgSUVFRS03NTQgcmVwcmVzZW50YXRpb25cclxuICpcclxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB0ZXN0XHJcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlciwgZmFsc2UgaWYgaXQgaXMgbm90XHJcbiAqL1xyXG5mdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSAmJiBNYXRoLmFicyh2YWx1ZSkgPD0gZXhwb3J0cy5NQVhfU0FGRV9JTlRFR0VSO1xyXG59XHJcbmV4cG9ydHMuaXNTYWZlSW50ZWdlciA9IGlzU2FmZUludGVnZXI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9udW1iZXIuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vbnVtYmVyLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciBnbG9iYWxfMSA9IHJlcXVpcmUoXCIuL2dsb2JhbFwiKTtcclxudmFyIGhhc18xID0gcmVxdWlyZShcIi4vc3VwcG9ydC9oYXNcIik7XHJcbnZhciBTeW1ib2xfMSA9IHJlcXVpcmUoXCIuL1N5bWJvbFwiKTtcclxuaWYgKGhhc18xLmRlZmF1bHQoJ2VzNi1vYmplY3QnKSkge1xyXG4gICAgdmFyIGdsb2JhbE9iamVjdCA9IGdsb2JhbF8xLmRlZmF1bHQuT2JqZWN0O1xyXG4gICAgZXhwb3J0cy5hc3NpZ24gPSBnbG9iYWxPYmplY3QuYXNzaWduO1xyXG4gICAgZXhwb3J0cy5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBnbG9iYWxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xyXG4gICAgZXhwb3J0cy5nZXRPd25Qcm9wZXJ0eU5hbWVzID0gZ2xvYmFsT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7XHJcbiAgICBleHBvcnRzLmdldE93blByb3BlcnR5U3ltYm9scyA9IGdsb2JhbE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XHJcbiAgICBleHBvcnRzLmlzID0gZ2xvYmFsT2JqZWN0LmlzO1xyXG4gICAgZXhwb3J0cy5rZXlzID0gZ2xvYmFsT2JqZWN0LmtleXM7XHJcbn1cclxuZWxzZSB7XHJcbiAgICBleHBvcnRzLmtleXMgPSBmdW5jdGlvbiBzeW1ib2xBd2FyZUtleXMobykge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gIUJvb2xlYW4oa2V5Lm1hdGNoKC9eQEAuKy8pKTsgfSk7XHJcbiAgICB9O1xyXG4gICAgZXhwb3J0cy5hc3NpZ24gPSBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0KSB7XHJcbiAgICAgICAgdmFyIHNvdXJjZXMgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICBzb3VyY2VzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHtcclxuICAgICAgICAgICAgLy8gVHlwZUVycm9yIGlmIHVuZGVmaW5lZCBvciBudWxsXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgdG8gPSBPYmplY3QodGFyZ2V0KTtcclxuICAgICAgICBzb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKG5leHRTb3VyY2UpIHtcclxuICAgICAgICAgICAgaWYgKG5leHRTb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgIC8vIFNraXAgb3ZlciBpZiB1bmRlZmluZWQgb3IgbnVsbFxyXG4gICAgICAgICAgICAgICAgZXhwb3J0cy5rZXlzKG5leHRTb3VyY2UpLmZvckVhY2goZnVuY3Rpb24gKG5leHRLZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0b1tuZXh0S2V5XSA9IG5leHRTb3VyY2VbbmV4dEtleV07XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0bztcclxuICAgIH07XHJcbiAgICBleHBvcnRzLmdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihvLCBwcm9wKSB7XHJcbiAgICAgICAgaWYgKFN5bWJvbF8xLmlzU3ltYm9sKHByb3ApKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8sIHByb3ApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobywgcHJvcCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIGV4cG9ydHMuZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMobykge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gIUJvb2xlYW4oa2V5Lm1hdGNoKC9eQEAuKy8pKTsgfSk7XHJcbiAgICB9O1xyXG4gICAgZXhwb3J0cy5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMobykge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvKVxyXG4gICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIEJvb2xlYW4oa2V5Lm1hdGNoKC9eQEAuKy8pKTsgfSlcclxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBTeW1ib2wuZm9yKGtleS5zdWJzdHJpbmcoMikpOyB9KTtcclxuICAgIH07XHJcbiAgICBleHBvcnRzLmlzID0gZnVuY3Rpb24gaXModmFsdWUxLCB2YWx1ZTIpIHtcclxuICAgICAgICBpZiAodmFsdWUxID09PSB2YWx1ZTIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlMSAhPT0gMCB8fCAxIC8gdmFsdWUxID09PSAxIC8gdmFsdWUyOyAvLyAtMFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsdWUxICE9PSB2YWx1ZTEgJiYgdmFsdWUyICE9PSB2YWx1ZTI7IC8vIE5hTlxyXG4gICAgfTtcclxufVxyXG5pZiAoaGFzXzEuZGVmYXVsdCgnZXMyMDE3LW9iamVjdCcpKSB7XHJcbiAgICB2YXIgZ2xvYmFsT2JqZWN0ID0gZ2xvYmFsXzEuZGVmYXVsdC5PYmplY3Q7XHJcbiAgICBleHBvcnRzLmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPSBnbG9iYWxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycztcclxuICAgIGV4cG9ydHMuZW50cmllcyA9IGdsb2JhbE9iamVjdC5lbnRyaWVzO1xyXG4gICAgZXhwb3J0cy52YWx1ZXMgPSBnbG9iYWxPYmplY3QudmFsdWVzO1xyXG59XHJcbmVsc2Uge1xyXG4gICAgZXhwb3J0cy5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvKSB7XHJcbiAgICAgICAgcmV0dXJuIGV4cG9ydHMuZ2V0T3duUHJvcGVydHlOYW1lcyhvKS5yZWR1Y2UoZnVuY3Rpb24gKHByZXZpb3VzLCBrZXkpIHtcclxuICAgICAgICAgICAgcHJldmlvdXNba2V5XSA9IGV4cG9ydHMuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8sIGtleSk7XHJcbiAgICAgICAgICAgIHJldHVybiBwcmV2aW91cztcclxuICAgICAgICB9LCB7fSk7XHJcbiAgICB9O1xyXG4gICAgZXhwb3J0cy5lbnRyaWVzID0gZnVuY3Rpb24gZW50cmllcyhvKSB7XHJcbiAgICAgICAgcmV0dXJuIGV4cG9ydHMua2V5cyhvKS5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gW2tleSwgb1trZXldXTsgfSk7XHJcbiAgICB9O1xyXG4gICAgZXhwb3J0cy52YWx1ZXMgPSBmdW5jdGlvbiB2YWx1ZXMobykge1xyXG4gICAgICAgIHJldHVybiBleHBvcnRzLmtleXMobykubWFwKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIG9ba2V5XTsgfSk7XHJcbiAgICB9O1xyXG59XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9vYmplY3QuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vb2JqZWN0LmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xyXG52YXIgZ2xvYmFsXzEgPSByZXF1aXJlKFwiLi9nbG9iYWxcIik7XHJcbnZhciBoYXNfMSA9IHJlcXVpcmUoXCIuL3N1cHBvcnQvaGFzXCIpO1xyXG52YXIgdXRpbF8xID0gcmVxdWlyZShcIi4vc3VwcG9ydC91dGlsXCIpO1xyXG4vKipcclxuICogVGhlIG1pbmltdW0gbG9jYXRpb24gb2YgaGlnaCBzdXJyb2dhdGVzXHJcbiAqL1xyXG5leHBvcnRzLkhJR0hfU1VSUk9HQVRFX01JTiA9IDB4ZDgwMDtcclxuLyoqXHJcbiAqIFRoZSBtYXhpbXVtIGxvY2F0aW9uIG9mIGhpZ2ggc3Vycm9nYXRlc1xyXG4gKi9cclxuZXhwb3J0cy5ISUdIX1NVUlJPR0FURV9NQVggPSAweGRiZmY7XHJcbi8qKlxyXG4gKiBUaGUgbWluaW11bSBsb2NhdGlvbiBvZiBsb3cgc3Vycm9nYXRlc1xyXG4gKi9cclxuZXhwb3J0cy5MT1dfU1VSUk9HQVRFX01JTiA9IDB4ZGMwMDtcclxuLyoqXHJcbiAqIFRoZSBtYXhpbXVtIGxvY2F0aW9uIG9mIGxvdyBzdXJyb2dhdGVzXHJcbiAqL1xyXG5leHBvcnRzLkxPV19TVVJST0dBVEVfTUFYID0gMHhkZmZmO1xyXG5pZiAoaGFzXzEuZGVmYXVsdCgnZXM2LXN0cmluZycpICYmIGhhc18xLmRlZmF1bHQoJ2VzNi1zdHJpbmctcmF3JykpIHtcclxuICAgIGV4cG9ydHMuZnJvbUNvZGVQb2ludCA9IGdsb2JhbF8xLmRlZmF1bHQuU3RyaW5nLmZyb21Db2RlUG9pbnQ7XHJcbiAgICBleHBvcnRzLnJhdyA9IGdsb2JhbF8xLmRlZmF1bHQuU3RyaW5nLnJhdztcclxuICAgIGV4cG9ydHMuY29kZVBvaW50QXQgPSB1dGlsXzEud3JhcE5hdGl2ZShnbG9iYWxfMS5kZWZhdWx0LlN0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXQpO1xyXG4gICAgZXhwb3J0cy5lbmRzV2l0aCA9IHV0aWxfMS53cmFwTmF0aXZlKGdsb2JhbF8xLmRlZmF1bHQuU3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aCk7XHJcbiAgICBleHBvcnRzLmluY2x1ZGVzID0gdXRpbF8xLndyYXBOYXRpdmUoZ2xvYmFsXzEuZGVmYXVsdC5TdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzKTtcclxuICAgIGV4cG9ydHMubm9ybWFsaXplID0gdXRpbF8xLndyYXBOYXRpdmUoZ2xvYmFsXzEuZGVmYXVsdC5TdHJpbmcucHJvdG90eXBlLm5vcm1hbGl6ZSk7XHJcbiAgICBleHBvcnRzLnJlcGVhdCA9IHV0aWxfMS53cmFwTmF0aXZlKGdsb2JhbF8xLmRlZmF1bHQuU3RyaW5nLnByb3RvdHlwZS5yZXBlYXQpO1xyXG4gICAgZXhwb3J0cy5zdGFydHNXaXRoID0gdXRpbF8xLndyYXBOYXRpdmUoZ2xvYmFsXzEuZGVmYXVsdC5TdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGgpO1xyXG59XHJcbmVsc2Uge1xyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGF0ZXMgdGhhdCB0ZXh0IGlzIGRlZmluZWQsIGFuZCBub3JtYWxpemVzIHBvc2l0aW9uIChiYXNlZCBvbiB0aGUgZ2l2ZW4gZGVmYXVsdCBpZiB0aGUgaW5wdXQgaXMgTmFOKS5cclxuICAgICAqIFVzZWQgYnkgc3RhcnRzV2l0aCwgaW5jbHVkZXMsIGFuZCBlbmRzV2l0aC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIE5vcm1hbGl6ZWQgcG9zaXRpb24uXHJcbiAgICAgKi9cclxuICAgIHZhciBub3JtYWxpemVTdWJzdHJpbmdBcmdzXzEgPSBmdW5jdGlvbiAobmFtZSwgdGV4dCwgc2VhcmNoLCBwb3NpdGlvbiwgaXNFbmQpIHtcclxuICAgICAgICBpZiAoaXNFbmQgPT09IHZvaWQgMCkgeyBpc0VuZCA9IGZhbHNlOyB9XHJcbiAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJpbmcuJyArIG5hbWUgKyAnIHJlcXVpcmVzIGEgdmFsaWQgc3RyaW5nIHRvIHNlYXJjaCBhZ2FpbnN0LicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbGVuZ3RoID0gdGV4dC5sZW5ndGg7XHJcbiAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiAhPT0gcG9zaXRpb24gPyAoaXNFbmQgPyBsZW5ndGggOiAwKSA6IHBvc2l0aW9uO1xyXG4gICAgICAgIHJldHVybiBbdGV4dCwgU3RyaW5nKHNlYXJjaCksIE1hdGgubWluKE1hdGgubWF4KHBvc2l0aW9uLCAwKSwgbGVuZ3RoKV07XHJcbiAgICB9O1xyXG4gICAgZXhwb3J0cy5mcm9tQ29kZVBvaW50ID0gZnVuY3Rpb24gZnJvbUNvZGVQb2ludCgpIHtcclxuICAgICAgICB2YXIgY29kZVBvaW50cyA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIGNvZGVQb2ludHNbX2ldID0gYXJndW1lbnRzW19pXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5mcm9tQ29kZVBvaW50XHJcbiAgICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKCFsZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgZnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcclxuICAgICAgICB2YXIgTUFYX1NJWkUgPSAweDQwMDA7XHJcbiAgICAgICAgdmFyIGNvZGVVbml0cyA9IFtdO1xyXG4gICAgICAgIHZhciBpbmRleCA9IC0xO1xyXG4gICAgICAgIHZhciByZXN1bHQgPSAnJztcclxuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xyXG4gICAgICAgICAgICB2YXIgY29kZVBvaW50ID0gTnVtYmVyKGFyZ3VtZW50c1tpbmRleF0pO1xyXG4gICAgICAgICAgICAvLyBDb2RlIHBvaW50cyBtdXN0IGJlIGZpbml0ZSBpbnRlZ2VycyB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlXHJcbiAgICAgICAgICAgIHZhciBpc1ZhbGlkID0gaXNGaW5pdGUoY29kZVBvaW50KSAmJiBNYXRoLmZsb29yKGNvZGVQb2ludCkgPT09IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPj0gMCAmJiBjb2RlUG9pbnQgPD0gMHgxMGZmZmY7XHJcbiAgICAgICAgICAgIGlmICghaXNWYWxpZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcignc3RyaW5nLmZyb21Db2RlUG9pbnQ6IEludmFsaWQgY29kZSBwb2ludCAnICsgY29kZVBvaW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY29kZVBvaW50IDw9IDB4ZmZmZikge1xyXG4gICAgICAgICAgICAgICAgLy8gQk1QIGNvZGUgcG9pbnRcclxuICAgICAgICAgICAgICAgIGNvZGVVbml0cy5wdXNoKGNvZGVQb2ludCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBBc3RyYWwgY29kZSBwb2ludDsgc3BsaXQgaW4gc3Vycm9nYXRlIGhhbHZlc1xyXG4gICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmcjc3Vycm9nYXRlLWZvcm11bGFlXHJcbiAgICAgICAgICAgICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMDtcclxuICAgICAgICAgICAgICAgIHZhciBoaWdoU3Vycm9nYXRlID0gKGNvZGVQb2ludCA+PiAxMCkgKyBleHBvcnRzLkhJR0hfU1VSUk9HQVRFX01JTjtcclxuICAgICAgICAgICAgICAgIHZhciBsb3dTdXJyb2dhdGUgPSBjb2RlUG9pbnQgJSAweDQwMCArIGV4cG9ydHMuTE9XX1NVUlJPR0FURV9NSU47XHJcbiAgICAgICAgICAgICAgICBjb2RlVW5pdHMucHVzaChoaWdoU3Vycm9nYXRlLCBsb3dTdXJyb2dhdGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpbmRleCArIDEgPT09IGxlbmd0aCB8fCBjb2RlVW5pdHMubGVuZ3RoID4gTUFYX1NJWkUpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBmcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgY29kZVVuaXRzKTtcclxuICAgICAgICAgICAgICAgIGNvZGVVbml0cy5sZW5ndGggPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9O1xyXG4gICAgZXhwb3J0cy5yYXcgPSBmdW5jdGlvbiByYXcoY2FsbFNpdGUpIHtcclxuICAgICAgICB2YXIgc3Vic3RpdHV0aW9ucyA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIHN1YnN0aXR1dGlvbnNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciByYXdTdHJpbmdzID0gY2FsbFNpdGUucmF3O1xyXG4gICAgICAgIHZhciByZXN1bHQgPSAnJztcclxuICAgICAgICB2YXIgbnVtU3Vic3RpdHV0aW9ucyA9IHN1YnN0aXR1dGlvbnMubGVuZ3RoO1xyXG4gICAgICAgIGlmIChjYWxsU2l0ZSA9PSBudWxsIHx8IGNhbGxTaXRlLnJhdyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmluZy5yYXcgcmVxdWlyZXMgYSB2YWxpZCBjYWxsU2l0ZSBvYmplY3Qgd2l0aCBhIHJhdyB2YWx1ZScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoXzEgPSByYXdTdHJpbmdzLmxlbmd0aDsgaSA8IGxlbmd0aF8xOyBpKyspIHtcclxuICAgICAgICAgICAgcmVzdWx0ICs9IHJhd1N0cmluZ3NbaV0gKyAoaSA8IG51bVN1YnN0aXR1dGlvbnMgJiYgaSA8IGxlbmd0aF8xIC0gMSA/IHN1YnN0aXR1dGlvbnNbaV0gOiAnJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9O1xyXG4gICAgZXhwb3J0cy5jb2RlUG9pbnRBdCA9IGZ1bmN0aW9uIGNvZGVQb2ludEF0KHRleHQsIHBvc2l0aW9uKSB7XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSB2b2lkIDApIHsgcG9zaXRpb24gPSAwOyB9XHJcbiAgICAgICAgLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXRcclxuICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmluZy5jb2RlUG9pbnRBdCByZXF1cmllcyBhIHZhbGlkIHN0cmluZy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGxlbmd0aCA9IHRleHQubGVuZ3RoO1xyXG4gICAgICAgIGlmIChwb3NpdGlvbiAhPT0gcG9zaXRpb24pIHtcclxuICAgICAgICAgICAgcG9zaXRpb24gPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID49IGxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBHZXQgdGhlIGZpcnN0IGNvZGUgdW5pdFxyXG4gICAgICAgIHZhciBmaXJzdCA9IHRleHQuY2hhckNvZGVBdChwb3NpdGlvbik7XHJcbiAgICAgICAgaWYgKGZpcnN0ID49IGV4cG9ydHMuSElHSF9TVVJST0dBVEVfTUlOICYmIGZpcnN0IDw9IGV4cG9ydHMuSElHSF9TVVJST0dBVEVfTUFYICYmIGxlbmd0aCA+IHBvc2l0aW9uICsgMSkge1xyXG4gICAgICAgICAgICAvLyBTdGFydCBvZiBhIHN1cnJvZ2F0ZSBwYWlyIChoaWdoIHN1cnJvZ2F0ZSBhbmQgdGhlcmUgaXMgYSBuZXh0IGNvZGUgdW5pdCk7IGNoZWNrIGZvciBsb3cgc3Vycm9nYXRlXHJcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nI3N1cnJvZ2F0ZS1mb3JtdWxhZVxyXG4gICAgICAgICAgICB2YXIgc2Vjb25kID0gdGV4dC5jaGFyQ29kZUF0KHBvc2l0aW9uICsgMSk7XHJcbiAgICAgICAgICAgIGlmIChzZWNvbmQgPj0gZXhwb3J0cy5MT1dfU1VSUk9HQVRFX01JTiAmJiBzZWNvbmQgPD0gZXhwb3J0cy5MT1dfU1VSUk9HQVRFX01BWCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChmaXJzdCAtIGV4cG9ydHMuSElHSF9TVVJST0dBVEVfTUlOKSAqIDB4NDAwICsgc2Vjb25kIC0gZXhwb3J0cy5MT1dfU1VSUk9HQVRFX01JTiArIDB4MTAwMDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZpcnN0O1xyXG4gICAgfTtcclxuICAgIGV4cG9ydHMuZW5kc1dpdGggPSBmdW5jdGlvbiBlbmRzV2l0aCh0ZXh0LCBzZWFyY2gsIGVuZFBvc2l0aW9uKSB7XHJcbiAgICAgICAgaWYgKGVuZFBvc2l0aW9uID09IG51bGwpIHtcclxuICAgICAgICAgICAgZW5kUG9zaXRpb24gPSB0ZXh0Lmxlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgX2EgPSB0c2xpYl8xLl9fcmVhZChub3JtYWxpemVTdWJzdHJpbmdBcmdzXzEoJ2VuZHNXaXRoJywgdGV4dCwgc2VhcmNoLCBlbmRQb3NpdGlvbiwgdHJ1ZSksIDMpLCB0ZXh0ID0gX2FbMF0sIHNlYXJjaCA9IF9hWzFdLCBlbmRQb3NpdGlvbiA9IF9hWzJdO1xyXG4gICAgICAgIHZhciBzdGFydCA9IGVuZFBvc2l0aW9uIC0gc2VhcmNoLmxlbmd0aDtcclxuICAgICAgICBpZiAoc3RhcnQgPCAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRleHQuc2xpY2Uoc3RhcnQsIGVuZFBvc2l0aW9uKSA9PT0gc2VhcmNoO1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgIH07XHJcbiAgICBleHBvcnRzLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXModGV4dCwgc2VhcmNoLCBwb3NpdGlvbikge1xyXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gdm9pZCAwKSB7IHBvc2l0aW9uID0gMDsgfVxyXG4gICAgICAgIF9hID0gdHNsaWJfMS5fX3JlYWQobm9ybWFsaXplU3Vic3RyaW5nQXJnc18xKCdpbmNsdWRlcycsIHRleHQsIHNlYXJjaCwgcG9zaXRpb24pLCAzKSwgdGV4dCA9IF9hWzBdLCBzZWFyY2ggPSBfYVsxXSwgcG9zaXRpb24gPSBfYVsyXTtcclxuICAgICAgICByZXR1cm4gdGV4dC5pbmRleE9mKHNlYXJjaCwgcG9zaXRpb24pICE9PSAtMTtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICB9O1xyXG4gICAgZXhwb3J0cy5yZXBlYXQgPSBmdW5jdGlvbiByZXBlYXQodGV4dCwgY291bnQpIHtcclxuICAgICAgICBpZiAoY291bnQgPT09IHZvaWQgMCkgeyBjb3VudCA9IDA7IH1cclxuICAgICAgICAvLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL21hdGhpYXNieW5lbnMvU3RyaW5nLnByb3RvdHlwZS5yZXBlYXRcclxuICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmluZy5yZXBlYXQgcmVxdWlyZXMgYSB2YWxpZCBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb3VudCAhPT0gY291bnQpIHtcclxuICAgICAgICAgICAgY291bnQgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY291bnQgPCAwIHx8IGNvdW50ID09PSBJbmZpbml0eSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc3RyaW5nLnJlcGVhdCByZXF1aXJlcyBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgY291bnQuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciByZXN1bHQgPSAnJztcclxuICAgICAgICB3aGlsZSAoY291bnQpIHtcclxuICAgICAgICAgICAgaWYgKGNvdW50ICUgMikge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IHRleHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNvdW50ID4gMSkge1xyXG4gICAgICAgICAgICAgICAgdGV4dCArPSB0ZXh0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvdW50ID4+PSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfTtcclxuICAgIGV4cG9ydHMuc3RhcnRzV2l0aCA9IGZ1bmN0aW9uIHN0YXJ0c1dpdGgodGV4dCwgc2VhcmNoLCBwb3NpdGlvbikge1xyXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gdm9pZCAwKSB7IHBvc2l0aW9uID0gMDsgfVxyXG4gICAgICAgIHNlYXJjaCA9IFN0cmluZyhzZWFyY2gpO1xyXG4gICAgICAgIF9hID0gdHNsaWJfMS5fX3JlYWQobm9ybWFsaXplU3Vic3RyaW5nQXJnc18xKCdzdGFydHNXaXRoJywgdGV4dCwgc2VhcmNoLCBwb3NpdGlvbiksIDMpLCB0ZXh0ID0gX2FbMF0sIHNlYXJjaCA9IF9hWzFdLCBwb3NpdGlvbiA9IF9hWzJdO1xyXG4gICAgICAgIHZhciBlbmQgPSBwb3NpdGlvbiArIHNlYXJjaC5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGVuZCA+IHRleHQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRleHQuc2xpY2UocG9zaXRpb24sIGVuZCkgPT09IHNlYXJjaDtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICB9O1xyXG59XHJcbmlmIChoYXNfMS5kZWZhdWx0KCdlczIwMTctc3RyaW5nJykpIHtcclxuICAgIGV4cG9ydHMucGFkRW5kID0gdXRpbF8xLndyYXBOYXRpdmUoZ2xvYmFsXzEuZGVmYXVsdC5TdHJpbmcucHJvdG90eXBlLnBhZEVuZCk7XHJcbiAgICBleHBvcnRzLnBhZFN0YXJ0ID0gdXRpbF8xLndyYXBOYXRpdmUoZ2xvYmFsXzEuZGVmYXVsdC5TdHJpbmcucHJvdG90eXBlLnBhZFN0YXJ0KTtcclxufVxyXG5lbHNlIHtcclxuICAgIGV4cG9ydHMucGFkRW5kID0gZnVuY3Rpb24gcGFkRW5kKHRleHQsIG1heExlbmd0aCwgZmlsbFN0cmluZykge1xyXG4gICAgICAgIGlmIChmaWxsU3RyaW5nID09PSB2b2lkIDApIHsgZmlsbFN0cmluZyA9ICcgJzsgfVxyXG4gICAgICAgIGlmICh0ZXh0ID09PSBudWxsIHx8IHRleHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJpbmcucmVwZWF0IHJlcXVpcmVzIGEgdmFsaWQgc3RyaW5nLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobWF4TGVuZ3RoID09PSBJbmZpbml0eSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc3RyaW5nLnBhZEVuZCByZXF1aXJlcyBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgY291bnQuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtYXhMZW5ndGggPT09IG51bGwgfHwgbWF4TGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbWF4TGVuZ3RoIDwgMCkge1xyXG4gICAgICAgICAgICBtYXhMZW5ndGggPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgc3RyVGV4dCA9IFN0cmluZyh0ZXh0KTtcclxuICAgICAgICB2YXIgcGFkZGluZyA9IG1heExlbmd0aCAtIHN0clRleHQubGVuZ3RoO1xyXG4gICAgICAgIGlmIChwYWRkaW5nID4gMCkge1xyXG4gICAgICAgICAgICBzdHJUZXh0ICs9XHJcbiAgICAgICAgICAgICAgICBleHBvcnRzLnJlcGVhdChmaWxsU3RyaW5nLCBNYXRoLmZsb29yKHBhZGRpbmcgLyBmaWxsU3RyaW5nLmxlbmd0aCkpICtcclxuICAgICAgICAgICAgICAgICAgICBmaWxsU3RyaW5nLnNsaWNlKDAsIHBhZGRpbmcgJSBmaWxsU3RyaW5nLmxlbmd0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdHJUZXh0O1xyXG4gICAgfTtcclxuICAgIGV4cG9ydHMucGFkU3RhcnQgPSBmdW5jdGlvbiBwYWRTdGFydCh0ZXh0LCBtYXhMZW5ndGgsIGZpbGxTdHJpbmcpIHtcclxuICAgICAgICBpZiAoZmlsbFN0cmluZyA9PT0gdm9pZCAwKSB7IGZpbGxTdHJpbmcgPSAnICc7IH1cclxuICAgICAgICBpZiAodGV4dCA9PT0gbnVsbCB8fCB0ZXh0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RyaW5nLnJlcGVhdCByZXF1aXJlcyBhIHZhbGlkIHN0cmluZy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1heExlbmd0aCA9PT0gSW5maW5pdHkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3N0cmluZy5wYWRTdGFydCByZXF1aXJlcyBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgY291bnQuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtYXhMZW5ndGggPT09IG51bGwgfHwgbWF4TGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbWF4TGVuZ3RoIDwgMCkge1xyXG4gICAgICAgICAgICBtYXhMZW5ndGggPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgc3RyVGV4dCA9IFN0cmluZyh0ZXh0KTtcclxuICAgICAgICB2YXIgcGFkZGluZyA9IG1heExlbmd0aCAtIHN0clRleHQubGVuZ3RoO1xyXG4gICAgICAgIGlmIChwYWRkaW5nID4gMCkge1xyXG4gICAgICAgICAgICBzdHJUZXh0ID1cclxuICAgICAgICAgICAgICAgIGV4cG9ydHMucmVwZWF0KGZpbGxTdHJpbmcsIE1hdGguZmxvb3IocGFkZGluZyAvIGZpbGxTdHJpbmcubGVuZ3RoKSkgK1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbGxTdHJpbmcuc2xpY2UoMCwgcGFkZGluZyAlIGZpbGxTdHJpbmcubGVuZ3RoKSArXHJcbiAgICAgICAgICAgICAgICAgICAgc3RyVGV4dDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0clRleHQ7XHJcbiAgICB9O1xyXG59XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdHJpbmcuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vc3RyaW5nLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xyXG52YXIgaGFzXzEgPSByZXF1aXJlKFwiQGRvam8vaGFzL2hhc1wiKTtcclxudmFyIGdsb2JhbF8xID0gcmVxdWlyZShcIi4uL2dsb2JhbFwiKTtcclxuZXhwb3J0cy5kZWZhdWx0ID0gaGFzXzEuZGVmYXVsdDtcclxudHNsaWJfMS5fX2V4cG9ydFN0YXIocmVxdWlyZShcIkBkb2pvL2hhcy9oYXNcIiksIGV4cG9ydHMpO1xyXG4vKiBFQ01BU2NyaXB0IDYgYW5kIDcgRmVhdHVyZXMgKi9cclxuLyogQXJyYXkgKi9cclxuaGFzXzEuYWRkKCdlczYtYXJyYXknLCBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gKFsnZnJvbScsICdvZiddLmV2ZXJ5KGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSBpbiBnbG9iYWxfMS5kZWZhdWx0LkFycmF5OyB9KSAmJlxyXG4gICAgICAgIFsnZmluZEluZGV4JywgJ2ZpbmQnLCAnY29weVdpdGhpbiddLmV2ZXJ5KGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSBpbiBnbG9iYWxfMS5kZWZhdWx0LkFycmF5LnByb3RvdHlwZTsgfSkpO1xyXG59LCB0cnVlKTtcclxuaGFzXzEuYWRkKCdlczYtYXJyYXktZmlsbCcsIGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICgnZmlsbCcgaW4gZ2xvYmFsXzEuZGVmYXVsdC5BcnJheS5wcm90b3R5cGUpIHtcclxuICAgICAgICAvKiBTb21lIHZlcnNpb25zIG9mIFNhZmFyaSBkbyBub3QgcHJvcGVybHkgaW1wbGVtZW50IHRoaXMgKi9cclxuICAgICAgICByZXR1cm4gWzFdLmZpbGwoOSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKVswXSA9PT0gMTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxufSwgdHJ1ZSk7XHJcbmhhc18xLmFkZCgnZXM3LWFycmF5JywgZnVuY3Rpb24gKCkgeyByZXR1cm4gJ2luY2x1ZGVzJyBpbiBnbG9iYWxfMS5kZWZhdWx0LkFycmF5LnByb3RvdHlwZTsgfSwgdHJ1ZSk7XHJcbi8qIE1hcCAqL1xyXG5oYXNfMS5hZGQoJ2VzNi1tYXAnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICBpZiAodHlwZW9mIGdsb2JhbF8xLmRlZmF1bHQuTWFwID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgLypcclxuICAgIElFMTEgYW5kIG9sZGVyIHZlcnNpb25zIG9mIFNhZmFyaSBhcmUgbWlzc2luZyBjcml0aWNhbCBFUzYgTWFwIGZ1bmN0aW9uYWxpdHlcclxuICAgIFdlIHdyYXAgdGhpcyBpbiBhIHRyeS9jYXRjaCBiZWNhdXNlIHNvbWV0aW1lcyB0aGUgTWFwIGNvbnN0cnVjdG9yIGV4aXN0cywgYnV0IGRvZXMgbm90XHJcbiAgICB0YWtlIGFyZ3VtZW50cyAoaU9TIDguNClcclxuICAgICAqL1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgZ2xvYmFsXzEuZGVmYXVsdC5NYXAoW1swLCAxXV0pO1xyXG4gICAgICAgICAgICByZXR1cm4gKG1hcC5oYXMoMCkgJiZcclxuICAgICAgICAgICAgICAgIHR5cGVvZiBtYXAua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJlxyXG4gICAgICAgICAgICAgICAgaGFzXzEuZGVmYXVsdCgnZXM2LXN5bWJvbCcpICYmXHJcbiAgICAgICAgICAgICAgICB0eXBlb2YgbWFwLnZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyAmJlxyXG4gICAgICAgICAgICAgICAgdHlwZW9mIG1hcC5lbnRyaWVzID09PSAnZnVuY3Rpb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IG5vdCB0ZXN0aW5nIG9uIGlPUyBhdCB0aGUgbW9tZW50ICovXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn0sIHRydWUpO1xyXG4vKiBNYXRoICovXHJcbmhhc18xLmFkZCgnZXM2LW1hdGgnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAgICdjbHozMicsXHJcbiAgICAgICAgJ3NpZ24nLFxyXG4gICAgICAgICdsb2cxMCcsXHJcbiAgICAgICAgJ2xvZzInLFxyXG4gICAgICAgICdsb2cxcCcsXHJcbiAgICAgICAgJ2V4cG0xJyxcclxuICAgICAgICAnY29zaCcsXHJcbiAgICAgICAgJ3NpbmgnLFxyXG4gICAgICAgICd0YW5oJyxcclxuICAgICAgICAnYWNvc2gnLFxyXG4gICAgICAgICdhc2luaCcsXHJcbiAgICAgICAgJ2F0YW5oJyxcclxuICAgICAgICAndHJ1bmMnLFxyXG4gICAgICAgICdmcm91bmQnLFxyXG4gICAgICAgICdjYnJ0JyxcclxuICAgICAgICAnaHlwb3QnXHJcbiAgICBdLmV2ZXJ5KGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiB0eXBlb2YgZ2xvYmFsXzEuZGVmYXVsdC5NYXRoW25hbWVdID09PSAnZnVuY3Rpb24nOyB9KTtcclxufSwgdHJ1ZSk7XHJcbmhhc18xLmFkZCgnZXM2LW1hdGgtaW11bCcsIGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICgnaW11bCcgaW4gZ2xvYmFsXzEuZGVmYXVsdC5NYXRoKSB7XHJcbiAgICAgICAgLyogU29tZSB2ZXJzaW9ucyBvZiBTYWZhcmkgb24gaW9zIGRvIG5vdCBwcm9wZXJseSBpbXBsZW1lbnQgdGhpcyAqL1xyXG4gICAgICAgIHJldHVybiBNYXRoLmltdWwoMHhmZmZmZmZmZiwgNSkgPT09IC01O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59LCB0cnVlKTtcclxuLyogT2JqZWN0ICovXHJcbmhhc18xLmFkZCgnZXM2LW9iamVjdCcsIGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiAoaGFzXzEuZGVmYXVsdCgnZXM2LXN5bWJvbCcpICYmXHJcbiAgICAgICAgWydhc3NpZ24nLCAnaXMnLCAnZ2V0T3duUHJvcGVydHlTeW1ib2xzJywgJ3NldFByb3RvdHlwZU9mJ10uZXZlcnkoZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIHR5cGVvZiBnbG9iYWxfMS5kZWZhdWx0Lk9iamVjdFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJzsgfSkpO1xyXG59LCB0cnVlKTtcclxuaGFzXzEuYWRkKCdlczIwMTctb2JqZWN0JywgZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIFsndmFsdWVzJywgJ2VudHJpZXMnLCAnZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyddLmV2ZXJ5KGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiB0eXBlb2YgZ2xvYmFsXzEuZGVmYXVsdC5PYmplY3RbbmFtZV0gPT09ICdmdW5jdGlvbic7IH0pO1xyXG59LCB0cnVlKTtcclxuLyogT2JzZXJ2YWJsZSAqL1xyXG5oYXNfMS5hZGQoJ2VzLW9ic2VydmFibGUnLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0eXBlb2YgZ2xvYmFsXzEuZGVmYXVsdC5PYnNlcnZhYmxlICE9PSAndW5kZWZpbmVkJzsgfSwgdHJ1ZSk7XHJcbi8qIFByb21pc2UgKi9cclxuaGFzXzEuYWRkKCdlczYtcHJvbWlzZScsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHR5cGVvZiBnbG9iYWxfMS5kZWZhdWx0LlByb21pc2UgIT09ICd1bmRlZmluZWQnICYmIGhhc18xLmRlZmF1bHQoJ2VzNi1zeW1ib2wnKTsgfSwgdHJ1ZSk7XHJcbi8qIFNldCAqL1xyXG5oYXNfMS5hZGQoJ2VzNi1zZXQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICBpZiAodHlwZW9mIGdsb2JhbF8xLmRlZmF1bHQuU2V0ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgLyogSUUxMSBhbmQgb2xkZXIgdmVyc2lvbnMgb2YgU2FmYXJpIGFyZSBtaXNzaW5nIGNyaXRpY2FsIEVTNiBTZXQgZnVuY3Rpb25hbGl0eSAqL1xyXG4gICAgICAgIHZhciBzZXQgPSBuZXcgZ2xvYmFsXzEuZGVmYXVsdC5TZXQoWzFdKTtcclxuICAgICAgICByZXR1cm4gc2V0LmhhcygxKSAmJiAna2V5cycgaW4gc2V0ICYmIHR5cGVvZiBzZXQua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJiBoYXNfMS5kZWZhdWx0KCdlczYtc3ltYm9sJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn0sIHRydWUpO1xyXG4vKiBTdHJpbmcgKi9cclxuaGFzXzEuYWRkKCdlczYtc3RyaW5nJywgZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIChbXHJcbiAgICAgICAgLyogc3RhdGljIG1ldGhvZHMgKi9cclxuICAgICAgICAnZnJvbUNvZGVQb2ludCdcclxuICAgIF0uZXZlcnkoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gdHlwZW9mIGdsb2JhbF8xLmRlZmF1bHQuU3RyaW5nW2tleV0gPT09ICdmdW5jdGlvbic7IH0pICYmXHJcbiAgICAgICAgW1xyXG4gICAgICAgICAgICAvKiBpbnN0YW5jZSBtZXRob2RzICovXHJcbiAgICAgICAgICAgICdjb2RlUG9pbnRBdCcsXHJcbiAgICAgICAgICAgICdub3JtYWxpemUnLFxyXG4gICAgICAgICAgICAncmVwZWF0JyxcclxuICAgICAgICAgICAgJ3N0YXJ0c1dpdGgnLFxyXG4gICAgICAgICAgICAnZW5kc1dpdGgnLFxyXG4gICAgICAgICAgICAnaW5jbHVkZXMnXHJcbiAgICAgICAgXS5ldmVyeShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiB0eXBlb2YgZ2xvYmFsXzEuZGVmYXVsdC5TdHJpbmcucHJvdG90eXBlW2tleV0gPT09ICdmdW5jdGlvbic7IH0pKTtcclxufSwgdHJ1ZSk7XHJcbmhhc18xLmFkZCgnZXM2LXN0cmluZy1yYXcnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBnZXRDYWxsU2l0ZShjYWxsU2l0ZSkge1xyXG4gICAgICAgIHZhciBzdWJzdGl0dXRpb25zID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgc3Vic3RpdHV0aW9uc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRzbGliXzEuX19zcHJlYWQoY2FsbFNpdGUpO1xyXG4gICAgICAgIHJlc3VsdC5yYXcgPSBjYWxsU2l0ZS5yYXc7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIGlmICgncmF3JyBpbiBnbG9iYWxfMS5kZWZhdWx0LlN0cmluZykge1xyXG4gICAgICAgIHZhciBiID0gMTtcclxuICAgICAgICB2YXIgY2FsbFNpdGUgPSBnZXRDYWxsU2l0ZSh0ZW1wbGF0ZU9iamVjdF8xIHx8ICh0ZW1wbGF0ZU9iamVjdF8xID0gdHNsaWJfMS5fX21ha2VUZW1wbGF0ZU9iamVjdChbXCJhXFxuXCIsIFwiXCJdLCBbXCJhXFxcXG5cIiwgXCJcIl0pKSwgYik7XHJcbiAgICAgICAgY2FsbFNpdGUucmF3ID0gWydhXFxcXG4nXTtcclxuICAgICAgICB2YXIgc3VwcG9ydHNUcnVuYyA9IGdsb2JhbF8xLmRlZmF1bHQuU3RyaW5nLnJhdyhjYWxsU2l0ZSwgNDIpID09PSAnYTpcXFxcbic7XHJcbiAgICAgICAgcmV0dXJuIHN1cHBvcnRzVHJ1bmM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn0sIHRydWUpO1xyXG5oYXNfMS5hZGQoJ2VzMjAxNy1zdHJpbmcnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gWydwYWRTdGFydCcsICdwYWRFbmQnXS5ldmVyeShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiB0eXBlb2YgZ2xvYmFsXzEuZGVmYXVsdC5TdHJpbmcucHJvdG90eXBlW2tleV0gPT09ICdmdW5jdGlvbic7IH0pO1xyXG59LCB0cnVlKTtcclxuLyogU3ltYm9sICovXHJcbmhhc18xLmFkZCgnZXM2LXN5bWJvbCcsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHR5cGVvZiBnbG9iYWxfMS5kZWZhdWx0LlN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIFN5bWJvbCgpID09PSAnc3ltYm9sJzsgfSwgdHJ1ZSk7XHJcbi8qIFdlYWtNYXAgKi9cclxuaGFzXzEuYWRkKCdlczYtd2Vha21hcCcsIGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICh0eXBlb2YgZ2xvYmFsXzEuZGVmYXVsdC5XZWFrTWFwICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIC8qIElFMTEgYW5kIG9sZGVyIHZlcnNpb25zIG9mIFNhZmFyaSBhcmUgbWlzc2luZyBjcml0aWNhbCBFUzYgTWFwIGZ1bmN0aW9uYWxpdHkgKi9cclxuICAgICAgICB2YXIga2V5MSA9IHt9O1xyXG4gICAgICAgIHZhciBrZXkyID0ge307XHJcbiAgICAgICAgdmFyIG1hcCA9IG5ldyBnbG9iYWxfMS5kZWZhdWx0LldlYWtNYXAoW1trZXkxLCAxXV0pO1xyXG4gICAgICAgIE9iamVjdC5mcmVlemUoa2V5MSk7XHJcbiAgICAgICAgcmV0dXJuIG1hcC5nZXQoa2V5MSkgPT09IDEgJiYgbWFwLnNldChrZXkyLCAyKSA9PT0gbWFwICYmIGhhc18xLmRlZmF1bHQoJ2VzNi1zeW1ib2wnKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxufSwgdHJ1ZSk7XHJcbi8qIE1pc2NlbGxhbmVvdXMgZmVhdHVyZXMgKi9cclxuaGFzXzEuYWRkKCdtaWNyb3Rhc2tzJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gaGFzXzEuZGVmYXVsdCgnZXM2LXByb21pc2UnKSB8fCBoYXNfMS5kZWZhdWx0KCdob3N0LW5vZGUnKSB8fCBoYXNfMS5kZWZhdWx0KCdkb20tbXV0YXRpb25vYnNlcnZlcicpOyB9LCB0cnVlKTtcclxuaGFzXzEuYWRkKCdwb3N0bWVzc2FnZScsIGZ1bmN0aW9uICgpIHtcclxuICAgIC8vIElmIHdpbmRvdyBpcyB1bmRlZmluZWQsIGFuZCB3ZSBoYXZlIHBvc3RNZXNzYWdlLCBpdCBwcm9iYWJseSBtZWFucyB3ZSdyZSBpbiBhIHdlYiB3b3JrZXIuIFdlYiB3b3JrZXJzIGhhdmVcclxuICAgIC8vIHBvc3QgbWVzc2FnZSBidXQgaXQgZG9lc24ndCB3b3JrIGhvdyB3ZSBleHBlY3QgaXQgdG8sIHNvIGl0J3MgYmVzdCBqdXN0IHRvIHByZXRlbmQgaXQgZG9lc24ndCBleGlzdC5cclxuICAgIHJldHVybiB0eXBlb2YgZ2xvYmFsXzEuZGVmYXVsdC53aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBnbG9iYWxfMS5kZWZhdWx0LnBvc3RNZXNzYWdlID09PSAnZnVuY3Rpb24nO1xyXG59LCB0cnVlKTtcclxuaGFzXzEuYWRkKCdyYWYnLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0eXBlb2YgZ2xvYmFsXzEuZGVmYXVsdC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbic7IH0sIHRydWUpO1xyXG5oYXNfMS5hZGQoJ3NldGltbWVkaWF0ZScsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHR5cGVvZiBnbG9iYWxfMS5kZWZhdWx0LnNldEltbWVkaWF0ZSAhPT0gJ3VuZGVmaW5lZCc7IH0sIHRydWUpO1xyXG4vKiBET00gRmVhdHVyZXMgKi9cclxuaGFzXzEuYWRkKCdkb20tbXV0YXRpb25vYnNlcnZlcicsIGZ1bmN0aW9uICgpIHtcclxuICAgIGlmIChoYXNfMS5kZWZhdWx0KCdob3N0LWJyb3dzZXInKSAmJiBCb29sZWFuKGdsb2JhbF8xLmRlZmF1bHQuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWxfMS5kZWZhdWx0LldlYktpdE11dGF0aW9uT2JzZXJ2ZXIpKSB7XHJcbiAgICAgICAgLy8gSUUxMSBoYXMgYW4gdW5yZWxpYWJsZSBNdXRhdGlvbk9ic2VydmVyIGltcGxlbWVudGF0aW9uIHdoZXJlIHNldFByb3BlcnR5KCkgZG9lcyBub3RcclxuICAgICAgICAvLyBnZW5lcmF0ZSBhIG11dGF0aW9uIGV2ZW50LCBvYnNlcnZlcnMgY2FuIGNyYXNoLCBhbmQgdGhlIHF1ZXVlIGRvZXMgbm90IGRyYWluXHJcbiAgICAgICAgLy8gcmVsaWFibHkuIFRoZSBmb2xsb3dpbmcgZmVhdHVyZSB0ZXN0IHdhcyBhZGFwdGVkIGZyb21cclxuICAgICAgICAvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS90MTBrby80YWNlYjhjNzE2ODFmZGIyNzVlMzNlZmU1ZTU3NmIxNFxyXG4gICAgICAgIHZhciBleGFtcGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWUgKi9cclxuICAgICAgICB2YXIgSG9zdE11dGF0aW9uT2JzZXJ2ZXIgPSBnbG9iYWxfMS5kZWZhdWx0Lk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsXzEuZGVmYXVsdC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xyXG4gICAgICAgIHZhciBvYnNlcnZlciA9IG5ldyBIb3N0TXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAoKSB7IH0pO1xyXG4gICAgICAgIG9ic2VydmVyLm9ic2VydmUoZXhhbXBsZSwgeyBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xyXG4gICAgICAgIGV4YW1wbGUuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCAnYmxvY2snKTtcclxuICAgICAgICByZXR1cm4gQm9vbGVhbihvYnNlcnZlci50YWtlUmVjb3JkcygpLmxlbmd0aCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn0sIHRydWUpO1xyXG5oYXNfMS5hZGQoJ2RvbS13ZWJhbmltYXRpb24nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBoYXNfMS5kZWZhdWx0KCdob3N0LWJyb3dzZXInKSAmJiBnbG9iYWxfMS5kZWZhdWx0LkFuaW1hdGlvbiAhPT0gdW5kZWZpbmVkICYmIGdsb2JhbF8xLmRlZmF1bHQuS2V5ZnJhbWVFZmZlY3QgIT09IHVuZGVmaW5lZDsgfSwgdHJ1ZSk7XHJcbnZhciB0ZW1wbGF0ZU9iamVjdF8xO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vc3VwcG9ydC9oYXMuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vc3VwcG9ydC9oYXMuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxudmFyIGdsb2JhbF8xID0gcmVxdWlyZShcIi4uL2dsb2JhbFwiKTtcclxudmFyIGhhc18xID0gcmVxdWlyZShcIi4vaGFzXCIpO1xyXG5mdW5jdGlvbiBleGVjdXRlVGFzayhpdGVtKSB7XHJcbiAgICBpZiAoaXRlbSAmJiBpdGVtLmlzQWN0aXZlICYmIGl0ZW0uY2FsbGJhY2spIHtcclxuICAgICAgICBpdGVtLmNhbGxiYWNrKCk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gZ2V0UXVldWVIYW5kbGUoaXRlbSwgZGVzdHJ1Y3Rvcikge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsgfTtcclxuICAgICAgICAgICAgaXRlbS5pc0FjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpdGVtLmNhbGxiYWNrID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKGRlc3RydWN0b3IpIHtcclxuICAgICAgICAgICAgICAgIGRlc3RydWN0b3IoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxudmFyIGNoZWNrTWljcm9UYXNrUXVldWU7XHJcbnZhciBtaWNyb1Rhc2tzO1xyXG4vKipcclxuICogU2NoZWR1bGVzIGEgY2FsbGJhY2sgdG8gdGhlIG1hY3JvdGFzayBxdWV1ZS5cclxuICpcclxuICogQHBhcmFtIGNhbGxiYWNrIHRoZSBmdW5jdGlvbiB0byBiZSBxdWV1ZWQgYW5kIGxhdGVyIGV4ZWN1dGVkLlxyXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBhIGBkZXN0cm95YCBtZXRob2QgdGhhdCwgd2hlbiBjYWxsZWQsIHByZXZlbnRzIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZyb20gZXhlY3V0aW5nLlxyXG4gKi9cclxuZXhwb3J0cy5xdWV1ZVRhc2sgPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIGRlc3RydWN0b3I7XHJcbiAgICB2YXIgZW5xdWV1ZTtcclxuICAgIC8vIFNpbmNlIHRoZSBJRSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0SW1tZWRpYXRlYCBpcyBub3QgZmxhd2xlc3MsIHdlIHdpbGwgdGVzdCBmb3IgYHBvc3RNZXNzYWdlYCBmaXJzdC5cclxuICAgIGlmIChoYXNfMS5kZWZhdWx0KCdwb3N0bWVzc2FnZScpKSB7XHJcbiAgICAgICAgdmFyIHF1ZXVlXzEgPSBbXTtcclxuICAgICAgICBnbG9iYWxfMS5kZWZhdWx0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgLy8gQ29uZmlybSB0aGF0IHRoZSBldmVudCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSBjdXJyZW50IHdpbmRvdyBhbmQgYnkgdGhpcyBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uLlxyXG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlID09PSBnbG9iYWxfMS5kZWZhdWx0ICYmIGV2ZW50LmRhdGEgPT09ICdkb2pvLXF1ZXVlLW1lc3NhZ2UnKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGlmIChxdWV1ZV8xLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVUYXNrKHF1ZXVlXzEuc2hpZnQoKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBlbnF1ZXVlID0gZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgcXVldWVfMS5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICBnbG9iYWxfMS5kZWZhdWx0LnBvc3RNZXNzYWdlKCdkb2pvLXF1ZXVlLW1lc3NhZ2UnLCAnKicpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChoYXNfMS5kZWZhdWx0KCdzZXRpbW1lZGlhdGUnKSkge1xyXG4gICAgICAgIGRlc3RydWN0b3IgPSBnbG9iYWxfMS5kZWZhdWx0LmNsZWFySW1tZWRpYXRlO1xyXG4gICAgICAgIGVucXVldWUgPSBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gc2V0SW1tZWRpYXRlKGV4ZWN1dGVUYXNrLmJpbmQobnVsbCwgaXRlbSkpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBkZXN0cnVjdG9yID0gZ2xvYmFsXzEuZGVmYXVsdC5jbGVhclRpbWVvdXQ7XHJcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGV4ZWN1dGVUYXNrLmJpbmQobnVsbCwgaXRlbSksIDApO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBxdWV1ZVRhc2soY2FsbGJhY2spIHtcclxuICAgICAgICB2YXIgaXRlbSA9IHtcclxuICAgICAgICAgICAgaXNBY3RpdmU6IHRydWUsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdmFyIGlkID0gZW5xdWV1ZShpdGVtKTtcclxuICAgICAgICByZXR1cm4gZ2V0UXVldWVIYW5kbGUoaXRlbSwgZGVzdHJ1Y3RvciAmJlxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBkZXN0cnVjdG9yKGlkKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvLyBUT0RPOiBVc2UgYXNwZWN0LmJlZm9yZSB3aGVuIGl0IGlzIGF2YWlsYWJsZS5cclxuICAgIHJldHVybiBoYXNfMS5kZWZhdWx0KCdtaWNyb3Rhc2tzJylcclxuICAgICAgICA/IHF1ZXVlVGFza1xyXG4gICAgICAgIDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIGNoZWNrTWljcm9UYXNrUXVldWUoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlVGFzayhjYWxsYmFjayk7XHJcbiAgICAgICAgfTtcclxufSkoKTtcclxuLy8gV2hlbiBubyBtZWNoYW5pc20gZm9yIHJlZ2lzdGVyaW5nIG1pY3JvdGFza3MgaXMgZXhwb3NlZCBieSB0aGUgZW52aXJvbm1lbnQsIG1pY3JvdGFza3Mgd2lsbFxyXG4vLyBiZSBxdWV1ZWQgYW5kIHRoZW4gZXhlY3V0ZWQgaW4gYSBzaW5nbGUgbWFjcm90YXNrIGJlZm9yZSB0aGUgb3RoZXIgbWFjcm90YXNrcyBhcmUgZXhlY3V0ZWQuXHJcbmlmICghaGFzXzEuZGVmYXVsdCgnbWljcm90YXNrcycpKSB7XHJcbiAgICB2YXIgaXNNaWNyb1Rhc2tRdWV1ZWRfMSA9IGZhbHNlO1xyXG4gICAgbWljcm9UYXNrcyA9IFtdO1xyXG4gICAgY2hlY2tNaWNyb1Rhc2tRdWV1ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAoIWlzTWljcm9UYXNrUXVldWVkXzEpIHtcclxuICAgICAgICAgICAgaXNNaWNyb1Rhc2tRdWV1ZWRfMSA9IHRydWU7XHJcbiAgICAgICAgICAgIGV4cG9ydHMucXVldWVUYXNrKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlzTWljcm9UYXNrUXVldWVkXzEgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGlmIChtaWNyb1Rhc2tzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gdm9pZCAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICgoaXRlbSA9IG1pY3JvVGFza3Muc2hpZnQoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVRhc2soaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcbi8qKlxyXG4gKiBTY2hlZHVsZXMgYW4gYW5pbWF0aW9uIHRhc2sgd2l0aCBgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZWAgaWYgaXQgZXhpc3RzLCBvciB3aXRoIGBxdWV1ZVRhc2tgIG90aGVyd2lzZS5cclxuICpcclxuICogU2luY2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lJ3MgYmVoYXZpb3IgZG9lcyBub3QgbWF0Y2ggdGhhdCBleHBlY3RlZCBmcm9tIGBxdWV1ZVRhc2tgLCBpdCBpcyBub3QgdXNlZCB0aGVyZS5cclxuICogSG93ZXZlciwgYXQgdGltZXMgaXQgbWFrZXMgbW9yZSBzZW5zZSB0byBkZWxlZ2F0ZSB0byByZXF1ZXN0QW5pbWF0aW9uRnJhbWU7IGhlbmNlIHRoZSBmb2xsb3dpbmcgbWV0aG9kLlxyXG4gKlxyXG4gKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGJlIHF1ZXVlZCBhbmQgbGF0ZXIgZXhlY3V0ZWQuXHJcbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIGEgYGRlc3Ryb3lgIG1ldGhvZCB0aGF0LCB3aGVuIGNhbGxlZCwgcHJldmVudHMgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnJvbSBleGVjdXRpbmcuXHJcbiAqL1xyXG5leHBvcnRzLnF1ZXVlQW5pbWF0aW9uVGFzayA9IChmdW5jdGlvbiAoKSB7XHJcbiAgICBpZiAoIWhhc18xLmRlZmF1bHQoJ3JhZicpKSB7XHJcbiAgICAgICAgcmV0dXJuIGV4cG9ydHMucXVldWVUYXNrO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcXVldWVBbmltYXRpb25UYXNrKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgdmFyIGl0ZW0gPSB7XHJcbiAgICAgICAgICAgIGlzQWN0aXZlOiB0cnVlLFxyXG4gICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2tcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZhciByYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShleGVjdXRlVGFzay5iaW5kKG51bGwsIGl0ZW0pKTtcclxuICAgICAgICByZXR1cm4gZ2V0UXVldWVIYW5kbGUoaXRlbSwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShyYWZJZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvLyBUT0RPOiBVc2UgYXNwZWN0LmJlZm9yZSB3aGVuIGl0IGlzIGF2YWlsYWJsZS5cclxuICAgIHJldHVybiBoYXNfMS5kZWZhdWx0KCdtaWNyb3Rhc2tzJylcclxuICAgICAgICA/IHF1ZXVlQW5pbWF0aW9uVGFza1xyXG4gICAgICAgIDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIGNoZWNrTWljcm9UYXNrUXVldWUoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlQW5pbWF0aW9uVGFzayhjYWxsYmFjayk7XHJcbiAgICAgICAgfTtcclxufSkoKTtcclxuLyoqXHJcbiAqIFNjaGVkdWxlcyBhIGNhbGxiYWNrIHRvIHRoZSBtaWNyb3Rhc2sgcXVldWUuXHJcbiAqXHJcbiAqIEFueSBjYWxsYmFja3MgcmVnaXN0ZXJlZCB3aXRoIGBxdWV1ZU1pY3JvVGFza2Agd2lsbCBiZSBleGVjdXRlZCBiZWZvcmUgdGhlIG5leHQgbWFjcm90YXNrLiBJZiBubyBuYXRpdmVcclxuICogbWVjaGFuaXNtIGZvciBzY2hlZHVsaW5nIG1hY3JvdGFza3MgaXMgZXhwb3NlZCwgdGhlbiBhbnkgY2FsbGJhY2tzIHdpbGwgYmUgZmlyZWQgYmVmb3JlIGFueSBtYWNyb3Rhc2tcclxuICogcmVnaXN0ZXJlZCB3aXRoIGBxdWV1ZVRhc2tgIG9yIGBxdWV1ZUFuaW1hdGlvblRhc2tgLlxyXG4gKlxyXG4gKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGJlIHF1ZXVlZCBhbmQgbGF0ZXIgZXhlY3V0ZWQuXHJcbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIGEgYGRlc3Ryb3lgIG1ldGhvZCB0aGF0LCB3aGVuIGNhbGxlZCwgcHJldmVudHMgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnJvbSBleGVjdXRpbmcuXHJcbiAqL1xyXG5leHBvcnRzLnF1ZXVlTWljcm9UYXNrID0gKGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciBlbnF1ZXVlO1xyXG4gICAgaWYgKGhhc18xLmRlZmF1bHQoJ2hvc3Qtbm9kZScpKSB7XHJcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbF8xLmRlZmF1bHQucHJvY2Vzcy5uZXh0VGljayhleGVjdXRlVGFzay5iaW5kKG51bGwsIGl0ZW0pKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoaGFzXzEuZGVmYXVsdCgnZXM2LXByb21pc2UnKSkge1xyXG4gICAgICAgIGVucXVldWUgPSBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICBnbG9iYWxfMS5kZWZhdWx0LlByb21pc2UucmVzb2x2ZShpdGVtKS50aGVuKGV4ZWN1dGVUYXNrKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoaGFzXzEuZGVmYXVsdCgnZG9tLW11dGF0aW9ub2JzZXJ2ZXInKSkge1xyXG4gICAgICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lICovXHJcbiAgICAgICAgdmFyIEhvc3RNdXRhdGlvbk9ic2VydmVyID0gZ2xvYmFsXzEuZGVmYXVsdC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbF8xLmRlZmF1bHQuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcclxuICAgICAgICB2YXIgbm9kZV8xID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdmFyIHF1ZXVlXzIgPSBbXTtcclxuICAgICAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgSG9zdE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB3aGlsZSAocXVldWVfMi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHF1ZXVlXzIuc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtICYmIGl0ZW0uaXNBY3RpdmUgJiYgaXRlbS5jYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9ic2VydmVyLm9ic2VydmUobm9kZV8xLCB7IGF0dHJpYnV0ZXM6IHRydWUgfSk7XHJcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgIHF1ZXVlXzIucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgbm9kZV8xLnNldEF0dHJpYnV0ZSgncXVldWVTdGF0dXMnLCAnMScpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBlbnF1ZXVlID0gZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgY2hlY2tNaWNyb1Rhc2tRdWV1ZSgpO1xyXG4gICAgICAgICAgICBtaWNyb1Rhc2tzLnB1c2goaXRlbSk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHJldHVybiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcclxuICAgICAgICB2YXIgaXRlbSA9IHtcclxuICAgICAgICAgICAgaXNBY3RpdmU6IHRydWUsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgZW5xdWV1ZShpdGVtKTtcclxuICAgICAgICByZXR1cm4gZ2V0UXVldWVIYW5kbGUoaXRlbSk7XHJcbiAgICB9O1xyXG59KSgpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3NoaW0vc3VwcG9ydC9xdWV1ZS5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdXBwb3J0L3F1ZXVlLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbi8qKlxyXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgYSB2YWx1ZSBwcm9wZXJ0eSBkZXNjcmlwdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB2YWx1ZSAgICAgICAgVGhlIHZhbHVlIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHNob3VsZCBiZSBzZXQgdG9cclxuICogQHBhcmFtIGVudW1lcmFibGUgICBJZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGVudW1iZXJhYmxlLCBkZWZhdWx0cyB0byBmYWxzZVxyXG4gKiBAcGFyYW0gd3JpdGFibGUgICAgIElmIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgd3JpdGFibGUsIGRlZmF1bHRzIHRvIHRydWVcclxuICogQHBhcmFtIGNvbmZpZ3VyYWJsZSBJZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGNvbmZpZ3VyYWJsZSwgZGVmYXVsdHMgdG8gdHJ1ZVxyXG4gKiBAcmV0dXJuICAgICAgICAgICAgIFRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIG9iamVjdFxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0VmFsdWVEZXNjcmlwdG9yKHZhbHVlLCBlbnVtZXJhYmxlLCB3cml0YWJsZSwgY29uZmlndXJhYmxlKSB7XHJcbiAgICBpZiAoZW51bWVyYWJsZSA9PT0gdm9pZCAwKSB7IGVudW1lcmFibGUgPSBmYWxzZTsgfVxyXG4gICAgaWYgKHdyaXRhYmxlID09PSB2b2lkIDApIHsgd3JpdGFibGUgPSB0cnVlOyB9XHJcbiAgICBpZiAoY29uZmlndXJhYmxlID09PSB2b2lkIDApIHsgY29uZmlndXJhYmxlID0gdHJ1ZTsgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB2YWx1ZTogdmFsdWUsXHJcbiAgICAgICAgZW51bWVyYWJsZTogZW51bWVyYWJsZSxcclxuICAgICAgICB3cml0YWJsZTogd3JpdGFibGUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiBjb25maWd1cmFibGVcclxuICAgIH07XHJcbn1cclxuZXhwb3J0cy5nZXRWYWx1ZURlc2NyaXB0b3IgPSBnZXRWYWx1ZURlc2NyaXB0b3I7XHJcbmZ1bmN0aW9uIHdyYXBOYXRpdmUobmF0aXZlRnVuY3Rpb24pIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XHJcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICBhcmdzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmF0aXZlRnVuY3Rpb24uYXBwbHkodGFyZ2V0LCBhcmdzKTtcclxuICAgIH07XHJcbn1cclxuZXhwb3J0cy53cmFwTmF0aXZlID0gd3JhcE5hdGl2ZTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9zaGltL3N1cHBvcnQvdXRpbC5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vc2hpbS9zdXBwb3J0L3V0aWwuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XHJcbnZhciBhc3NlcnRSZW5kZXJfMSA9IHJlcXVpcmUoXCIuL3N1cHBvcnQvYXNzZXJ0UmVuZGVyXCIpO1xyXG52YXIgc2VsZWN0b3JfMSA9IHJlcXVpcmUoXCIuL3N1cHBvcnQvc2VsZWN0b3JcIik7XHJcbnZhciBkXzEgPSByZXF1aXJlKFwiQGRvam8vd2lkZ2V0LWNvcmUvZFwiKTtcclxuZnVuY3Rpb24gZGVjb3JhdGVOb2RlcyhkTm9kZSkge1xyXG4gICAgdmFyIGhhc0RlZmVycmVkUHJvcGVydGllcyA9IGZhbHNlO1xyXG4gICAgZnVuY3Rpb24gYWRkUGFyZW50KHBhcmVudCkge1xyXG4gICAgICAgIChwYXJlbnQuY2hpbGRyZW4gfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XHJcbiAgICAgICAgICAgIGlmIChkXzEuaXNWTm9kZShjaGlsZCkgfHwgZF8xLmlzV05vZGUoY2hpbGQpKSB7XHJcbiAgICAgICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoZF8xLmlzVk5vZGUocGFyZW50KSAmJiB0eXBlb2YgcGFyZW50LmRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIGhhc0RlZmVycmVkUHJvcGVydGllcyA9IHRydWU7XHJcbiAgICAgICAgICAgIHBhcmVudC5wcm9wZXJ0aWVzID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgcGFyZW50LnByb3BlcnRpZXMsIHBhcmVudC5kZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayhmYWxzZSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHZhciBub2RlcyA9IGRfMS5kZWNvcmF0ZShkTm9kZSwgYWRkUGFyZW50LCBmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gZF8xLmlzV05vZGUobm9kZSkgfHwgZF8xLmlzVk5vZGUobm9kZSk7IH0pO1xyXG4gICAgcmV0dXJuIHsgaGFzRGVmZXJyZWRQcm9wZXJ0aWVzOiBoYXNEZWZlcnJlZFByb3BlcnRpZXMsIG5vZGVzOiBub2RlcyB9O1xyXG59XHJcbmZ1bmN0aW9uIGhhcm5lc3MocmVuZGVyRnVuYywgY3VzdG9tQ29tcGFyYXRvcikge1xyXG4gICAgaWYgKGN1c3RvbUNvbXBhcmF0b3IgPT09IHZvaWQgMCkgeyBjdXN0b21Db21wYXJhdG9yID0gW107IH1cclxuICAgIHZhciBpbnZhbGlkYXRlZCA9IHRydWU7XHJcbiAgICB2YXIgd05vZGUgPSByZW5kZXJGdW5jKCk7XHJcbiAgICB2YXIgd2lkZ2V0O1xyXG4gICAgdmFyIHJlbmRlclN0YWNrID0gW107XHJcbiAgICB2YXIgcHJvcGVydGllcyA9IHdOb2RlLnByb3BlcnRpZXMsIGNoaWxkcmVuID0gd05vZGUuY2hpbGRyZW47XHJcbiAgICB2YXIgd2lkZ2V0Q29uc3RydWN0b3IgPSB3Tm9kZS53aWRnZXRDb25zdHJ1Y3RvcjtcclxuICAgIGlmICh0eXBlb2Ygd2lkZ2V0Q29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICB3aWRnZXQgPSBuZXcgLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xyXG4gICAgICAgICAgICB0c2xpYl8xLl9fZXh0ZW5kcyhjbGFzc18xLCBfc3VwZXIpO1xyXG4gICAgICAgICAgICBmdW5jdGlvbiBjbGFzc18xKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNsYXNzXzEucHJvdG90eXBlLmludmFsaWRhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpbnZhbGlkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmludmFsaWRhdGUuY2FsbCh0aGlzKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmV0dXJuIGNsYXNzXzE7XHJcbiAgICAgICAgfSh3aWRnZXRDb25zdHJ1Y3RvcikpKCk7XHJcbiAgICAgICAgd2lkZ2V0Ll9fc2V0UHJvcGVydGllc19fKHByb3BlcnRpZXMpO1xyXG4gICAgICAgIHdpZGdldC5fX3NldENoaWxkcmVuX18oY2hpbGRyZW4pO1xyXG4gICAgICAgIF90cnlSZW5kZXIoKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSGFybmVzcyBkb2VzIG5vdCBzdXBwb3J0IHJlZ2lzdHJ5IGl0ZW1zJyk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBfZ2V0UmVuZGVyKGNvdW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGNvdW50ID8gcmVuZGVyU3RhY2tbY291bnRdIDogcmVuZGVyU3RhY2tbcmVuZGVyU3RhY2subGVuZ3RoIC0gMV07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBfcnVuQ29tcGFyZXMobm9kZXMsIGlzRXhwZWN0ZWQpIHtcclxuICAgICAgICBpZiAoaXNFeHBlY3RlZCA9PT0gdm9pZCAwKSB7IGlzRXhwZWN0ZWQgPSBmYWxzZTsgfVxyXG4gICAgICAgIGN1c3RvbUNvbXBhcmF0b3IuZm9yRWFjaChmdW5jdGlvbiAoX2EpIHtcclxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yID0gX2Euc2VsZWN0b3IsIHByb3BlcnR5ID0gX2EucHJvcGVydHksIGNvbXBhcmF0b3IgPSBfYS5jb21wYXJhdG9yO1xyXG4gICAgICAgICAgICB2YXIgaXRlbXMgPSBzZWxlY3Rvcl8xLnNlbGVjdChzZWxlY3Rvciwgbm9kZXMpO1xyXG4gICAgICAgICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvbXBhcmF0b3JOYW1lID0gXCJjb21wYXJhdG9yKHNlbGVjdG9yPVwiICsgc2VsZWN0b3IgKyBcIiwgXCIgKyBwcm9wZXJ0eSArIFwiKVwiO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5wcm9wZXJ0aWVzICYmIGl0ZW0ucHJvcGVydGllc1twcm9wZXJ0eV0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb21wYXJhdG9yUmVzdWx0ID0gY29tcGFyYXRvcihpdGVtLnByb3BlcnRpZXNbcHJvcGVydHldKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGNvbXBhcmF0b3JOYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogY29tcGFyYXRvck5hbWUgKyBcIiBGQUlMRURcIjtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLnByb3BlcnRpZXNbcHJvcGVydHldID0gaXNFeHBlY3RlZCA/IGNvbXBhcmF0b3JOYW1lIDogY29tcGFyYXRvclJlc3VsdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBfdHJ5UmVuZGVyKCkge1xyXG4gICAgICAgIHZhciBfYSA9IHJlbmRlckZ1bmMoKSwgcHJvcGVydGllcyA9IF9hLnByb3BlcnRpZXMsIGNoaWxkcmVuID0gX2EuY2hpbGRyZW47XHJcbiAgICAgICAgd2lkZ2V0Ll9fc2V0UHJvcGVydGllc19fKHByb3BlcnRpZXMpO1xyXG4gICAgICAgIHdpZGdldC5fX3NldENoaWxkcmVuX18oY2hpbGRyZW4pO1xyXG4gICAgICAgIGlmIChpbnZhbGlkYXRlZCkge1xyXG4gICAgICAgICAgICB2YXIgcmVuZGVyID0gd2lkZ2V0Ll9fcmVuZGVyX18oKTtcclxuICAgICAgICAgICAgdmFyIF9iID0gZGVjb3JhdGVOb2RlcyhyZW5kZXIpLCBoYXNEZWZlcnJlZFByb3BlcnRpZXMgPSBfYi5oYXNEZWZlcnJlZFByb3BlcnRpZXMsIG5vZGVzID0gX2Iubm9kZXM7XHJcbiAgICAgICAgICAgIF9ydW5Db21wYXJlcyhub2Rlcyk7XHJcbiAgICAgICAgICAgIHJlbmRlclN0YWNrLnB1c2gobm9kZXMpO1xyXG4gICAgICAgICAgICBpZiAoaGFzRGVmZXJyZWRQcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYWZ0ZXJEZWZlcnJlZFByb3BlcnRpZXNOb2RlcyA9IGRlY29yYXRlTm9kZXMocmVuZGVyKS5ub2RlcztcclxuICAgICAgICAgICAgICAgIF9ydW5Db21wYXJlcyhhZnRlckRlZmVycmVkUHJvcGVydGllc05vZGVzKTtcclxuICAgICAgICAgICAgICAgIHJlbmRlclN0YWNrLnB1c2goYWZ0ZXJEZWZlcnJlZFByb3BlcnRpZXNOb2Rlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaW52YWxpZGF0ZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBfZXhwZWN0KGV4cGVjdGVkUmVuZGVyRnVuYywgYWN0dWFsUmVuZGVyRnVuYywgc2VsZWN0b3IpIHtcclxuICAgICAgICB2YXIgcmVuZGVyUmVzdWx0O1xyXG4gICAgICAgIGlmIChhY3R1YWxSZW5kZXJGdW5jID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgX3RyeVJlbmRlcigpO1xyXG4gICAgICAgICAgICByZW5kZXJSZXN1bHQgPSBfZ2V0UmVuZGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZW5kZXJSZXN1bHQgPSBhY3R1YWxSZW5kZXJGdW5jKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBleHBlY3RlZFJlbmRlclJlc3VsdCA9IGRlY29yYXRlTm9kZXMoZXhwZWN0ZWRSZW5kZXJGdW5jKCkpLm5vZGVzO1xyXG4gICAgICAgIF9ydW5Db21wYXJlcyhleHBlY3RlZFJlbmRlclJlc3VsdCwgdHJ1ZSk7XHJcbiAgICAgICAgaWYgKHNlbGVjdG9yKSB7XHJcbiAgICAgICAgICAgIHZhciBfYSA9IHRzbGliXzEuX19yZWFkKHNlbGVjdG9yXzEuc2VsZWN0KHNlbGVjdG9yLCByZW5kZXJSZXN1bHQpLCAxKSwgZmlyc3RJdGVtID0gX2FbMF07XHJcbiAgICAgICAgICAgIGFzc2VydFJlbmRlcl8xLmRlZmF1bHQoZmlyc3RJdGVtLCBleHBlY3RlZFJlbmRlclJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBhc3NlcnRSZW5kZXJfMS5kZWZhdWx0KHJlbmRlclJlc3VsdCwgZXhwZWN0ZWRSZW5kZXJSZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgZXhwZWN0OiBmdW5jdGlvbiAoZXhwZWN0ZWRSZW5kZXJGdW5jLCBhY3R1YWxSZW5kZXJGdW5jKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfZXhwZWN0KGV4cGVjdGVkUmVuZGVyRnVuYywgYWN0dWFsUmVuZGVyRnVuYyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBleHBlY3RQYXJ0aWFsOiBmdW5jdGlvbiAoc2VsZWN0b3IsIGV4cGVjdGVkUmVuZGVyRnVuYywgYWN0dWFsUmVuZGVyRnVuYykge1xyXG4gICAgICAgICAgICByZXR1cm4gX2V4cGVjdChleHBlY3RlZFJlbmRlckZ1bmMsIGFjdHVhbFJlbmRlckZ1bmMsIHNlbGVjdG9yKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRyaWdnZXI6IGZ1bmN0aW9uIChzZWxlY3RvciwgZnVuY3Rpb25TZWxlY3Rvcikge1xyXG4gICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDI7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgYXJnc1tfaSAtIDJdID0gYXJndW1lbnRzW19pXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfdHJ5UmVuZGVyKCk7XHJcbiAgICAgICAgICAgIHZhciBfYSA9IHRzbGliXzEuX19yZWFkKHNlbGVjdG9yXzEuc2VsZWN0KHNlbGVjdG9yLCBfZ2V0UmVuZGVyKCkpLCAxKSwgZmlyc3RJdGVtID0gX2FbMF07XHJcbiAgICAgICAgICAgIGlmIChmaXJzdEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIHZhciB0cmlnZ2VyRnVuY3Rpb24gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZ1bmN0aW9uU2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckZ1bmN0aW9uID0gZmlyc3RJdGVtLnByb3BlcnRpZXNbZnVuY3Rpb25TZWxlY3Rvcl07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyRnVuY3Rpb24gPSBmdW5jdGlvblNlbGVjdG9yKGZpcnN0SXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodHJpZ2dlckZ1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyaWdnZXJGdW5jdGlvbi5hcHBseSh3aWRnZXQsIGFyZ3MpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBnZXRSZW5kZXI6IGZ1bmN0aW9uIChpbmRleCkge1xyXG4gICAgICAgICAgICByZXR1cm4gX2dldFJlbmRlcihpbmRleCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5leHBvcnRzLmhhcm5lc3MgPSBoYXJuZXNzO1xyXG5leHBvcnRzLmRlZmF1bHQgPSBoYXJuZXNzO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3Rlc3QtZXh0cmFzL2hhcm5lc3MuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3Rlc3QtZXh0cmFzL2hhcm5lc3MuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxudmFyIGRfMSA9IHJlcXVpcmUoXCJAZG9qby93aWRnZXQtY29yZS9kXCIpO1xyXG52YXIgZGlmZiA9IHJlcXVpcmUoXCJkaWZmXCIpO1xyXG52YXIgV2Vha01hcF8xID0gcmVxdWlyZShcIkBkb2pvL3NoaW0vV2Vha01hcFwiKTtcclxudmFyIFNldF8xID0gcmVxdWlyZShcIkBkb2pvL3NoaW0vU2V0XCIpO1xyXG52YXIgTWFwXzEgPSByZXF1aXJlKFwiQGRvam8vc2hpbS9NYXBcIik7XHJcbnZhciBhcnJheV8xID0gcmVxdWlyZShcIkBkb2pvL3NoaW0vYXJyYXlcIik7XHJcbnZhciB3aWRnZXRDbGFzc0NvdW50ZXIgPSAwO1xyXG52YXIgd2lkZ2V0TWFwID0gbmV3IFdlYWtNYXBfMS5kZWZhdWx0KCk7XHJcbmZ1bmN0aW9uIHJlcGxhY2VyKGtleSwgdmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICByZXR1cm4gJ2Z1bmN0aW9uJztcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNldF8xLmRlZmF1bHQgfHwgdmFsdWUgaW5zdGFuY2VvZiBNYXBfMS5kZWZhdWx0KSB7XHJcbiAgICAgICAgcmV0dXJuIGFycmF5XzEuZnJvbSh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbn1cclxuZnVuY3Rpb24gZm9ybWF0RE5vZGVzKG5vZGVzLCBkZXB0aCkge1xyXG4gICAgaWYgKGRlcHRoID09PSB2b2lkIDApIHsgZGVwdGggPSAwOyB9XHJcbiAgICB2YXIgaXNBcnJheUZyYWdtZW50ID0gQXJyYXkuaXNBcnJheShub2RlcykgJiYgZGVwdGggPT09IDA7XHJcbiAgICB2YXIgaW5pdGlhbCA9IGlzQXJyYXlGcmFnbWVudCA/ICdbXFxuJyA6ICcnO1xyXG4gICAgdmFyIHRhYnMgPSAnJztcclxuICAgIGRlcHRoID0gaXNBcnJheUZyYWdtZW50ID8gMSA6IGRlcHRoO1xyXG4gICAgbm9kZXMgPSBBcnJheS5pc0FycmF5KG5vZGVzKSA/IG5vZGVzIDogW25vZGVzXTtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVwdGg7IGkrKykge1xyXG4gICAgICAgIHRhYnMgPSB0YWJzICsgXCJcXHRcIjtcclxuICAgIH1cclxuICAgIHZhciBmb3JtYXR0ZWROb2RlID0gbm9kZXMucmVkdWNlKGZ1bmN0aW9uIChyZXN1bHQsIG5vZGUsIGluZGV4KSB7XHJcbiAgICAgICAgaWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpbmRleCA+IDApIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgXCJcXG5cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzdWx0ID0gXCJcIiArIHJlc3VsdCArIHRhYnM7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBub2RlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgXCJcXFwiXCIgKyBub2RlICsgXCJcXFwiXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3VsdCA9IFwiXCIgKyByZXN1bHQgKyBmb3JtYXROb2RlKG5vZGUsIHRhYnMpO1xyXG4gICAgICAgIGlmIChub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBcIiwgW1xcblwiICsgZm9ybWF0RE5vZGVzKG5vZGUuY2hpbGRyZW4sIGRlcHRoICsgMSkgKyBcIlxcblwiICsgdGFicyArIFwiXVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0ICsgXCIpXCI7XHJcbiAgICB9LCBpbml0aWFsKTtcclxuICAgIHJldHVybiBpc0FycmF5RnJhZ21lbnQgPyAoZm9ybWF0dGVkTm9kZSA9IGZvcm1hdHRlZE5vZGUgKyBcIlxcbl1cIikgOiBmb3JtYXR0ZWROb2RlO1xyXG59XHJcbmV4cG9ydHMuZm9ybWF0RE5vZGVzID0gZm9ybWF0RE5vZGVzO1xyXG5mdW5jdGlvbiBmb3JtYXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMsIHRhYnMpIHtcclxuICAgIHByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKVxyXG4gICAgICAgIC5zb3J0KClcclxuICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChwcm9wcywga2V5KSB7XHJcbiAgICAgICAgcHJvcHNba2V5XSA9IHByb3BlcnRpZXNba2V5XTtcclxuICAgICAgICByZXR1cm4gcHJvcHM7XHJcbiAgICB9LCB7fSk7XHJcbiAgICBwcm9wZXJ0aWVzID0gSlNPTi5zdHJpbmdpZnkocHJvcGVydGllcywgcmVwbGFjZXIsIHRhYnMgKyBcIlxcdFwiKS5zbGljZSgwLCAtMSk7XHJcbiAgICByZXR1cm4gXCJcIiArIHByb3BlcnRpZXMgKyB0YWJzICsgXCJ9XCI7XHJcbn1cclxuZnVuY3Rpb24gZ2V0V2lkZ2V0TmFtZSh3aWRnZXRDb25zdHJ1Y3Rvcikge1xyXG4gICAgdmFyIG5hbWU7XHJcbiAgICBpZiAodHlwZW9mIHdpZGdldENvbnN0cnVjdG9yID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygd2lkZ2V0Q29uc3RydWN0b3IgPT09ICdzeW1ib2wnKSB7XHJcbiAgICAgICAgbmFtZSA9IHdpZGdldENvbnN0cnVjdG9yLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBuYW1lID0gd2lkZ2V0Q29uc3RydWN0b3IubmFtZTtcclxuICAgICAgICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHZhciBpZCA9IHdpZGdldE1hcC5nZXQod2lkZ2V0Q29uc3RydWN0b3IpO1xyXG4gICAgICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaWQgPSArK3dpZGdldENsYXNzQ291bnRlcjtcclxuICAgICAgICAgICAgICAgIHdpZGdldE1hcC5zZXQod2lkZ2V0Q29uc3RydWN0b3IsIGlkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBuYW1lID0gXCJXaWRnZXQtXCIgKyBpZDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmFtZTtcclxufVxyXG5mdW5jdGlvbiBmb3JtYXROb2RlKG5vZGUsIHRhYnMpIHtcclxuICAgIHZhciBwcm9wZXJ0eUtleUNvdW50ID0gT2JqZWN0LmtleXMobm9kZS5wcm9wZXJ0aWVzKS5sZW5ndGg7XHJcbiAgICB2YXIgcHJvcGVydGllcyA9IHByb3BlcnR5S2V5Q291bnQgPiAwID8gZm9ybWF0UHJvcGVydGllcyhub2RlLnByb3BlcnRpZXMsIHRhYnMpIDogJ3t9JztcclxuICAgIGlmIChkXzEuaXNXTm9kZShub2RlKSkge1xyXG4gICAgICAgIHJldHVybiBcIncoXCIgKyBnZXRXaWRnZXROYW1lKG5vZGUud2lkZ2V0Q29uc3RydWN0b3IpICsgXCIsIFwiICsgcHJvcGVydGllcztcclxuICAgIH1cclxuICAgIHJldHVybiBcInYoXFxcIlwiICsgbm9kZS50YWcgKyBcIlxcXCIsIFwiICsgcHJvcGVydGllcztcclxufVxyXG5mdW5jdGlvbiBhc3NlcnRSZW5kZXIoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xyXG4gICAgdmFyIHBhcnNlZEFjdHVhbCA9IGZvcm1hdEROb2RlcyhhY3R1YWwpO1xyXG4gICAgdmFyIHBhcnNlZEV4cGVjdGVkID0gZm9ybWF0RE5vZGVzKGV4cGVjdGVkKTtcclxuICAgIHZhciBkaWZmUmVzdWx0ID0gZGlmZi5kaWZmTGluZXMocGFyc2VkQWN0dWFsLCBwYXJzZWRFeHBlY3RlZCk7XHJcbiAgICB2YXIgZGlmZkZvdW5kID0gZmFsc2U7XHJcbiAgICB2YXIgcGFyc2VkRGlmZiA9IGRpZmZSZXN1bHQucmVkdWNlKGZ1bmN0aW9uIChyZXN1bHQsIHBhcnQsIGluZGV4KSB7XHJcbiAgICAgICAgaWYgKHBhcnQuYWRkZWQpIHtcclxuICAgICAgICAgICAgZGlmZkZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgXCIoRSlcIiArIHBhcnQudmFsdWUucmVwbGFjZSgvXFxuXFx0L2csICdcXG4oRSlcXHQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocGFydC5yZW1vdmVkKSB7XHJcbiAgICAgICAgICAgIGRpZmZGb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIFwiKEEpXCIgKyBwYXJ0LnZhbHVlLnJlcGxhY2UoL1xcblxcdC9nLCAnXFxuKEEpXFx0Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXN1bHQgPSBcIlwiICsgcmVzdWx0ICsgcGFydC52YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH0sICdcXG4nKTtcclxuICAgIGlmIChkaWZmRm91bmQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocGFyc2VkRGlmZik7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cy5hc3NlcnRSZW5kZXIgPSBhc3NlcnRSZW5kZXI7XHJcbmV4cG9ydHMuZGVmYXVsdCA9IGFzc2VydFJlbmRlcjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby90ZXN0LWV4dHJhcy9zdXBwb3J0L2Fzc2VydFJlbmRlci5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vdGVzdC1leHRyYXMvc3VwcG9ydC9hc3NlcnRSZW5kZXIuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XHJcbnZhciBkXzEgPSByZXF1aXJlKFwiQGRvam8vd2lkZ2V0LWNvcmUvZFwiKTtcclxudmFyIGNzc1NlbGVjdCA9IHJlcXVpcmUoXCJjc3Mtc2VsZWN0LXVtZFwiKTtcclxuZXhwb3J0cy5wYXJzZVNlbGVjdG9yID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XHJcbiAgICB2YXIgc2VsZWN0b3JzID0gc2VsZWN0b3Iuc3BsaXQoJyAnKTtcclxuICAgIHJldHVybiBzZWxlY3RvcnNcclxuICAgICAgICAubWFwKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xyXG4gICAgICAgIHZhciBrZXlTaWdpbEluZGV4ID0gc2VsZWN0b3IuaW5kZXhPZignQCcpO1xyXG4gICAgICAgIGlmIChrZXlTaWdpbEluZGV4ID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIltrZXk9XFxcIlwiICsgc2VsZWN0b3Iuc3Vic3RyKDEpICsgXCJcXFwiXVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChrZXlTaWdpbEluZGV4ID4gMCkge1xyXG4gICAgICAgICAgICB2YXIga2V5ID0gc2VsZWN0b3Iuc3Vic3RyaW5nKGtleVNpZ2lsSW5kZXggKyAxKTtcclxuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yLnNsaWNlKDAsIGtleVNpZ2lsSW5kZXgpICsgXCJba2V5PVxcXCJcIiArIGtleSArIFwiXFxcIl1cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yO1xyXG4gICAgfSlcclxuICAgICAgICAuam9pbignICcpO1xyXG59O1xyXG5leHBvcnRzLmFkYXB0ZXIgPSB7XHJcbiAgICBpc1RhZzogZnVuY3Rpb24gKGVsZW0pIHtcclxuICAgICAgICByZXR1cm4gZF8xLmlzVk5vZGUoZWxlbSk7XHJcbiAgICB9LFxyXG4gICAgZ2V0VGV4dDogZnVuY3Rpb24gKGVsZW0pIHtcclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICB9LFxyXG4gICAgcmVtb3ZlU3Vic2V0czogZnVuY3Rpb24gKGVsZW1lbnRzKSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzO1xyXG4gICAgfSxcclxuICAgIGdldENoaWxkcmVuOiBmdW5jdGlvbiAoZWxlbSkge1xyXG4gICAgICAgIHJldHVybiBkXzEuaXNWTm9kZShlbGVtKSB8fCBkXzEuaXNXTm9kZShlbGVtKSA/IGVsZW0uY2hpbGRyZW4gOiBbXTtcclxuICAgIH0sXHJcbiAgICBnZXRBdHRyaWJ1dGVWYWx1ZTogZnVuY3Rpb24gKGVsZW0sIG5hbWUpIHtcclxuICAgICAgICBpZiAoZF8xLmlzVk5vZGUoZWxlbSkgfHwgZF8xLmlzV05vZGUoZWxlbSkpIHtcclxuICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdjbGFzcycpIHtcclxuICAgICAgICAgICAgICAgIHZhciBjbGFzc2VzID0gZWxlbS5wcm9wZXJ0aWVzLmNsYXNzZXM7XHJcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjbGFzc2VzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc2VzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBlbGVtLnByb3BlcnRpZXNbbmFtZV07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIGhhc0F0dHJpYjogZnVuY3Rpb24gKGVsZW0sIG5hbWUpIHtcclxuICAgICAgICBpZiAoZF8xLmlzVk5vZGUoZWxlbSkgfHwgZF8xLmlzV05vZGUoZWxlbSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5hbWUgaW4gZWxlbS5wcm9wZXJ0aWVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9LFxyXG4gICAgZXhpc3RzT25lOiBmdW5jdGlvbiAodGVzdCwgZWxlbWVudHMpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudHMuc29tZShmdW5jdGlvbiAoZWxlbSkgeyByZXR1cm4gdGVzdChlbGVtKTsgfSk7XHJcbiAgICB9LFxyXG4gICAgZ2V0TmFtZTogZnVuY3Rpb24gKGVsZW0pIHtcclxuICAgICAgICBpZiAoZF8xLmlzVk5vZGUoZWxlbSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGVsZW0udGFnO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICBnZXRQYXJlbnQ6IGZ1bmN0aW9uIChlbGVtKSB7XHJcbiAgICAgICAgaWYgKGRfMS5pc1ZOb2RlKGVsZW0pIHx8IGRfMS5pc1dOb2RlKGVsZW0pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbGVtLnBhcmVudDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgZ2V0U2libGluZ3M6IGZ1bmN0aW9uIChlbGVtKSB7XHJcbiAgICAgICAgaWYgKGRfMS5pc1ZOb2RlKGVsZW0pIHx8IGRfMS5pc1dOb2RlKGVsZW0pKSB7XHJcbiAgICAgICAgICAgIGlmIChlbGVtLnBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW0ucGFyZW50LmNoaWxkcmVuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBbZWxlbV07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIGZpbmRPbmU6IGZ1bmN0aW9uICh0ZXN0LCBhcnIpIHtcclxuICAgICAgICB2YXIgZWxlbSA9IG51bGw7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnIubGVuZ3RoOyBpIDwgbCAmJiAhZWxlbTsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0ZXN0KGFycltpXSkpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0gPSBhcnJbaV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBleHBvcnRzLmFkYXB0ZXIuZ2V0Q2hpbGRyZW4oYXJyW2ldKTtcclxuICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbSA9IGV4cG9ydHMuYWRhcHRlci5maW5kT25lKHRlc3QsIGNoaWxkcmVuKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZWxlbTtcclxuICAgIH0sXHJcbiAgICBmaW5kQWxsOiBmdW5jdGlvbiAodGVzdCwgZWxlbWVudHMpIHtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRlc3QoZWxlbWVudHNbaV0pKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChlbGVtZW50c1tpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gZXhwb3J0cy5hZGFwdGVyLmdldENoaWxkcmVuKGVsZW1lbnRzW2ldKTtcclxuICAgICAgICAgICAgaWYgKGNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0c2xpYl8xLl9fc3ByZWFkKHJlc3VsdCwgZXhwb3J0cy5hZGFwdGVyLmZpbmRBbGwodGVzdCwgY2hpbGRyZW4pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG59O1xyXG5mdW5jdGlvbiBzZWxlY3Qoc2VsZWN0b3IsIG5vZGVzKSB7XHJcbiAgICBub2RlcyA9IEFycmF5LmlzQXJyYXkobm9kZXMpID8gbm9kZXMgOiBbbm9kZXNdO1xyXG4gICAgc2VsZWN0b3IgPSBleHBvcnRzLnBhcnNlU2VsZWN0b3Ioc2VsZWN0b3IpO1xyXG4gICAgcmV0dXJuIGNzc1NlbGVjdChzZWxlY3Rvciwgbm9kZXMsIHsgYWRhcHRlcjogZXhwb3J0cy5hZGFwdGVyIH0pO1xyXG59XHJcbmV4cG9ydHMuc2VsZWN0ID0gc2VsZWN0O1xyXG5leHBvcnRzLmRlZmF1bHQgPSBzZWxlY3Q7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vdGVzdC1leHRyYXMvc3VwcG9ydC9zZWxlY3Rvci5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vdGVzdC1leHRyYXMvc3VwcG9ydC9zZWxlY3Rvci5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKHRydWUpO1xuLy8gaW1wb3J0c1xuXG5cbi8vIG1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiLnNVbVVpNFNoIHtcXHJcXG5cXHRoZWlnaHQ6IDEwMCU7XFxyXFxuXFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbn1cXHJcXG5cXHJcXG4uXzJNazZSZHFhIHtcXHJcXG5cXHRjb2xvcjogI2ZmZjtcXHJcXG5cXHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxyXFxuXFx0bWFyZ2luOiAwIDYuNHB4O1xcclxcblxcdHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG5cXHRkaXNwbGF5OiAtd2Via2l0LWJveDtcXHJcXG5cXHRkaXNwbGF5OiAtbXMtZmxleGJveDtcXHJcXG5cXHRkaXNwbGF5OiBmbGV4O1xcclxcblxcdC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7XFxyXFxuXFx0LXdlYmtpdC1ib3gtZGlyZWN0aW9uOiBub3JtYWw7XFxyXFxuXFx0ICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcclxcblxcdCAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXHJcXG5cXHQtd2Via2l0LWJveC1wYWNrOiBjZW50ZXI7XFxyXFxuXFx0ICAgIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjtcXHJcXG5cXHQgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcblxcdGhlaWdodDogNDhweDtcXHJcXG5cXHRjdXJzb3I6IHBvaW50ZXI7XFxyXFxufVxcclxcblxcclxcbi5fMk1rNlJkcWE6OmFmdGVyIHtcXHJcXG5cXHRkaXNwbGF5OiBibG9jaztcXHJcXG5cXHRjb250ZW50OiBcXFwiXFxcIjtcXHJcXG5cXHRiYWNrZ3JvdW5kOiAjZmZmO1xcclxcblxcdGhlaWdodDogMnB4O1xcclxcblxcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG5cXHR3aWR0aDogMTAwJTtcXHJcXG5cXHRib3R0b206IDA7XFxyXFxuXFx0LXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAuM3MgZWFzZS1vdXQ7XFxyXFxuXFx0dHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gLjNzIGVhc2Utb3V0O1xcclxcblxcdHRyYW5zaXRpb246IHRyYW5zZm9ybSAuM3MgZWFzZS1vdXQ7XFxyXFxuXFx0dHJhbnNpdGlvbjogdHJhbnNmb3JtIC4zcyBlYXNlLW91dCwgLXdlYmtpdC10cmFuc2Zvcm0gLjNzIGVhc2Utb3V0O1xcclxcblxcdC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDNweCk7XFxyXFxuXFx0ICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoM3B4KTtcXHJcXG59XFxyXFxuXFxyXFxuLl8xLWYzSXRPaDo6YWZ0ZXIge1xcclxcblxcdC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xcclxcblxcdCAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xcclxcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiQzovVXNlcnMvSUVVc2VyL0Rlc2t0b3AvY2xpLWJ1aWxkLXdpZGdldC90ZXN0LWFwcC9zcmMvbWVudS1pdGVtL21lbnVJdGVtLm0uY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0NBQ0MsYUFBYTtDQUNiLHNCQUFzQjtDQUN0Qjs7QUFFRDtDQUNDLFlBQVk7Q0FDWixzQkFBc0I7Q0FDdEIsZ0JBQWdCO0NBQ2hCLG1CQUFtQjtDQUNuQixxQkFBcUI7Q0FDckIscUJBQXFCO0NBQ3JCLGNBQWM7Q0FDZCw2QkFBNkI7Q0FDN0IsOEJBQThCO0tBQzFCLDJCQUEyQjtTQUN2Qix1QkFBdUI7Q0FDL0IseUJBQXlCO0tBQ3JCLHNCQUFzQjtTQUNsQix3QkFBd0I7Q0FDaEMsYUFBYTtDQUNiLGdCQUFnQjtDQUNoQjs7QUFFRDtDQUNDLGVBQWU7Q0FDZixZQUFZO0NBQ1osaUJBQWlCO0NBQ2pCLFlBQVk7Q0FDWixtQkFBbUI7Q0FDbkIsWUFBWTtDQUNaLFVBQVU7Q0FDVixtREFBbUQ7Q0FDbkQsMkNBQTJDO0NBQzNDLG1DQUFtQztDQUNuQyxtRUFBbUU7Q0FDbkUsbUNBQW1DO1NBQzNCLDJCQUEyQjtDQUNuQzs7QUFFRDtDQUNDLGlDQUFpQztTQUN6Qix5QkFBeUI7Q0FDakNcIixcImZpbGVcIjpcIm1lbnVJdGVtLm0uY3NzXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5yb290IHtcXHJcXG5cXHRoZWlnaHQ6IDEwMCU7XFxyXFxuXFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbn1cXHJcXG5cXHJcXG4uaXRlbSB7XFxyXFxuXFx0Y29sb3I6ICNmZmY7XFxyXFxuXFx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xcclxcblxcdG1hcmdpbjogMCA2LjRweDtcXHJcXG5cXHRwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuXFx0ZGlzcGxheTogLXdlYmtpdC1ib3g7XFxyXFxuXFx0ZGlzcGxheTogLW1zLWZsZXhib3g7XFxyXFxuXFx0ZGlzcGxheTogZmxleDtcXHJcXG5cXHQtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xcclxcblxcdC13ZWJraXQtYm94LWRpcmVjdGlvbjogbm9ybWFsO1xcclxcblxcdCAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXHJcXG5cXHQgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxyXFxuXFx0LXdlYmtpdC1ib3gtcGFjazogY2VudGVyO1xcclxcblxcdCAgICAtbXMtZmxleC1wYWNrOiBjZW50ZXI7XFxyXFxuXFx0ICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXHJcXG5cXHRoZWlnaHQ6IDQ4cHg7XFxyXFxuXFx0Y3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG5cXHJcXG4uaXRlbTo6YWZ0ZXIge1xcclxcblxcdGRpc3BsYXk6IGJsb2NrO1xcclxcblxcdGNvbnRlbnQ6IFxcXCJcXFwiO1xcclxcblxcdGJhY2tncm91bmQ6ICNmZmY7XFxyXFxuXFx0aGVpZ2h0OiAycHg7XFxyXFxuXFx0cG9zaXRpb246IGFic29sdXRlO1xcclxcblxcdHdpZHRoOiAxMDAlO1xcclxcblxcdGJvdHRvbTogMDtcXHJcXG5cXHQtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIC4zcyBlYXNlLW91dDtcXHJcXG5cXHR0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAuM3MgZWFzZS1vdXQ7XFxyXFxuXFx0dHJhbnNpdGlvbjogdHJhbnNmb3JtIC4zcyBlYXNlLW91dDtcXHJcXG5cXHR0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gLjNzIGVhc2Utb3V0LCAtd2Via2l0LXRyYW5zZm9ybSAuM3MgZWFzZS1vdXQ7XFxyXFxuXFx0LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoM3B4KTtcXHJcXG5cXHQgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgzcHgpO1xcclxcbn1cXHJcXG5cXHJcXG4uc2VsZWN0ZWQ6OmFmdGVyIHtcXHJcXG5cXHQtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcXHJcXG5cXHQgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcXHJcXG59XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG5cbi8vIGV4cG9ydHNcbmV4cG9ydHMubG9jYWxzID0ge1wiIF9rZXlcIjogXCJ0ZXN0LWFwcC9tZW51SXRlbVwiLFxuXHRcInJvb3RcIjogXCJzVW1VaTRTaFwiLFxuXHRcIml0ZW1cIjogXCJfMk1rNlJkcWFcIixcblx0XCJzZWxlY3RlZFwiOiBcIl8xLWYzSXRPaFwiXG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWRlY29yYXRvci1sb2FkZXIhLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlcj97XCJtb2R1bGVzXCI6dHJ1ZSxcInNvdXJjZU1hcFwiOnRydWUsXCJpbXBvcnRMb2FkZXJzXCI6MSxcImxvY2FsSWRlbnROYW1lXCI6XCJbaGFzaDpiYXNlNjQ6OF1cIn0hLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvbGliP3tcImlkZW50XCI6XCJwb3N0Y3NzXCIsXCJwbHVnaW5zXCI6W251bGwse1widmVyc2lvblwiOlwiNi4wLjIzXCIsXCJwbHVnaW5zXCI6W251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLFwicG9zdGNzc1BsdWdpblwiOlwicG9zdGNzcy1jc3NuZXh0XCIsXCJwb3N0Y3NzVmVyc2lvblwiOlwiNi4wLjIzXCJ9XX0hLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZHRzLWxvYWRlcj90eXBlPWNzcyEuL3NyYy9tZW51LWl0ZW0vbWVudUl0ZW0ubS5jc3Ncbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWRlY29yYXRvci1sb2FkZXIvaW5kZXguanMhLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz97XCJtb2R1bGVzXCI6dHJ1ZSxcInNvdXJjZU1hcFwiOnRydWUsXCJpbXBvcnRMb2FkZXJzXCI6MSxcImxvY2FsSWRlbnROYW1lXCI6XCJbaGFzaDpiYXNlNjQ6OF1cIn0hLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvbGliL2luZGV4LmpzP3tcImlkZW50XCI6XCJwb3N0Y3NzXCIsXCJwbHVnaW5zXCI6W251bGwse1widmVyc2lvblwiOlwiNi4wLjIzXCIsXCJwbHVnaW5zXCI6W251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLFwicG9zdGNzc1BsdWdpblwiOlwicG9zdGNzcy1jc3NuZXh0XCIsXCJwb3N0Y3NzVmVyc2lvblwiOlwiNi4wLjIzXCJ9XX0hLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZHRzLWxvYWRlci9pbmRleC5qcz90eXBlPWNzcyEuL3NyYy9tZW51LWl0ZW0vbWVudUl0ZW0ubS5jc3Ncbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKSh0cnVlKTtcbi8vIGltcG9ydHNcblxuXG4vLyBtb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIi5fM2JBNmpkU24ge1xcclxcblxcdHdpZHRoOiAxMDAlO1xcclxcblxcdHRvcDogMDtcXHJcXG5cXHRoZWlnaHQ6IDQ4cHg7XFxyXFxuXFx0ei1pbmRleDogMTAwO1xcclxcblxcdGJhY2tncm91bmQtY29sb3I6ICMxZDFmMjA7XFxyXFxufVxcclxcblxcclxcbi5fMWVvR2Zxa3Uge1xcclxcblxcdGhlaWdodDogMTAwJTtcXHJcXG5cXHRtYXJnaW46IDAgYXV0bztcXHJcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIkM6L1VzZXJzL0lFVXNlci9EZXNrdG9wL2NsaS1idWlsZC13aWRnZXQvdGVzdC1hcHAvc3JjL21lbnUvbWVudS5tLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtDQUNDLFlBQVk7Q0FDWixPQUFPO0NBQ1AsYUFBYTtDQUNiLGFBQWE7Q0FDYiwwQkFBMEI7Q0FDMUI7O0FBRUQ7Q0FDQyxhQUFhO0NBQ2IsZUFBZTtDQUNmXCIsXCJmaWxlXCI6XCJtZW51Lm0uY3NzXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5yb290IHtcXHJcXG5cXHR3aWR0aDogMTAwJTtcXHJcXG5cXHR0b3A6IDA7XFxyXFxuXFx0aGVpZ2h0OiA0OHB4O1xcclxcblxcdHotaW5kZXg6IDEwMDtcXHJcXG5cXHRiYWNrZ3JvdW5kLWNvbG9yOiAjMWQxZjIwO1xcclxcbn1cXHJcXG5cXHJcXG4ubWVudUNvbnRhaW5lciB7XFxyXFxuXFx0aGVpZ2h0OiAxMDAlO1xcclxcblxcdG1hcmdpbjogMCBhdXRvO1xcclxcbn1cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcblxuLy8gZXhwb3J0c1xuZXhwb3J0cy5sb2NhbHMgPSB7XCIgX2tleVwiOiBcInRlc3QtYXBwL21lbnVcIixcblx0XCJyb290XCI6IFwiXzNiQTZqZFNuXCIsXG5cdFwibWVudUNvbnRhaW5lclwiOiBcIl8xZW9HZnFrdVwiXG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWRlY29yYXRvci1sb2FkZXIhLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlcj97XCJtb2R1bGVzXCI6dHJ1ZSxcInNvdXJjZU1hcFwiOnRydWUsXCJpbXBvcnRMb2FkZXJzXCI6MSxcImxvY2FsSWRlbnROYW1lXCI6XCJbaGFzaDpiYXNlNjQ6OF1cIn0hLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvbGliP3tcImlkZW50XCI6XCJwb3N0Y3NzXCIsXCJwbHVnaW5zXCI6W251bGwse1widmVyc2lvblwiOlwiNi4wLjIzXCIsXCJwbHVnaW5zXCI6W251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLFwicG9zdGNzc1BsdWdpblwiOlwicG9zdGNzcy1jc3NuZXh0XCIsXCJwb3N0Y3NzVmVyc2lvblwiOlwiNi4wLjIzXCJ9XX0hLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZHRzLWxvYWRlcj90eXBlPWNzcyEuL3NyYy9tZW51L21lbnUubS5jc3Ncbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWRlY29yYXRvci1sb2FkZXIvaW5kZXguanMhLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz97XCJtb2R1bGVzXCI6dHJ1ZSxcInNvdXJjZU1hcFwiOnRydWUsXCJpbXBvcnRMb2FkZXJzXCI6MSxcImxvY2FsSWRlbnROYW1lXCI6XCJbaGFzaDpiYXNlNjQ6OF1cIn0hLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvbGliL2luZGV4LmpzP3tcImlkZW50XCI6XCJwb3N0Y3NzXCIsXCJwbHVnaW5zXCI6W251bGwse1widmVyc2lvblwiOlwiNi4wLjIzXCIsXCJwbHVnaW5zXCI6W251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLFwicG9zdGNzc1BsdWdpblwiOlwicG9zdGNzcy1jc3NuZXh0XCIsXCJwb3N0Y3NzVmVyc2lvblwiOlwiNi4wLjIzXCJ9XX0hLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZHRzLWxvYWRlci9pbmRleC5qcz90eXBlPWNzcyEuL3NyYy9tZW51L21lbnUubS5jc3Ncbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XHJcbnZhciBFdmVudGVkXzEgPSByZXF1aXJlKFwiQGRvam8vY29yZS9FdmVudGVkXCIpO1xyXG52YXIgSW5qZWN0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XHJcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhJbmplY3RvciwgX3N1cGVyKTtcclxuICAgIGZ1bmN0aW9uIEluamVjdG9yKHBheWxvYWQpIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xyXG4gICAgICAgIF90aGlzLl9wYXlsb2FkID0gcGF5bG9hZDtcclxuICAgICAgICByZXR1cm4gX3RoaXM7XHJcbiAgICB9XHJcbiAgICBJbmplY3Rvci5wcm90b3R5cGUuc2V0SW52YWxpZGF0b3IgPSBmdW5jdGlvbiAoaW52YWxpZGF0b3IpIHtcclxuICAgICAgICB0aGlzLl9pbnZhbGlkYXRvciA9IGludmFsaWRhdG9yO1xyXG4gICAgfTtcclxuICAgIEluamVjdG9yLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BheWxvYWQ7XHJcbiAgICB9O1xyXG4gICAgSW5qZWN0b3IucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChwYXlsb2FkKSB7XHJcbiAgICAgICAgdGhpcy5fcGF5bG9hZCA9IHBheWxvYWQ7XHJcbiAgICAgICAgaWYgKHRoaXMuX2ludmFsaWRhdG9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdG9yKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiBJbmplY3RvcjtcclxufShFdmVudGVkXzEuRXZlbnRlZCkpO1xyXG5leHBvcnRzLkluamVjdG9yID0gSW5qZWN0b3I7XHJcbmV4cG9ydHMuZGVmYXVsdCA9IEluamVjdG9yO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL0luamVjdG9yLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9JbmplY3Rvci5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcclxudmFyIEV2ZW50ZWRfMSA9IHJlcXVpcmUoXCJAZG9qby9jb3JlL0V2ZW50ZWRcIik7XHJcbnZhciBNYXBfMSA9IHJlcXVpcmUoXCJAZG9qby9zaGltL01hcFwiKTtcclxuLyoqXHJcbiAqIEVudW0gdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgZXZlbnQuXHJcbiAqIExpc3RlbmluZyB0byAnUHJvamVjdG9yJyB3aWxsIG5vdGlmeSB3aGVuIHByb2plY3RvciBpcyBjcmVhdGVkIG9yIHVwZGF0ZWRcclxuICogTGlzdGVuaW5nIHRvICdXaWRnZXQnIHdpbGwgbm90aWZ5IHdoZW4gd2lkZ2V0IHJvb3QgaXMgY3JlYXRlZCBvciB1cGRhdGVkXHJcbiAqL1xyXG52YXIgTm9kZUV2ZW50VHlwZTtcclxuKGZ1bmN0aW9uIChOb2RlRXZlbnRUeXBlKSB7XHJcbiAgICBOb2RlRXZlbnRUeXBlW1wiUHJvamVjdG9yXCJdID0gXCJQcm9qZWN0b3JcIjtcclxuICAgIE5vZGVFdmVudFR5cGVbXCJXaWRnZXRcIl0gPSBcIldpZGdldFwiO1xyXG59KShOb2RlRXZlbnRUeXBlID0gZXhwb3J0cy5Ob2RlRXZlbnRUeXBlIHx8IChleHBvcnRzLk5vZGVFdmVudFR5cGUgPSB7fSkpO1xyXG52YXIgTm9kZUhhbmRsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XHJcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhOb2RlSGFuZGxlciwgX3N1cGVyKTtcclxuICAgIGZ1bmN0aW9uIE5vZGVIYW5kbGVyKCkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xyXG4gICAgICAgIF90aGlzLl9ub2RlTWFwID0gbmV3IE1hcF8xLmRlZmF1bHQoKTtcclxuICAgICAgICByZXR1cm4gX3RoaXM7XHJcbiAgICB9XHJcbiAgICBOb2RlSGFuZGxlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ub2RlTWFwLmdldChrZXkpO1xyXG4gICAgfTtcclxuICAgIE5vZGVIYW5kbGVyLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vZGVNYXAuaGFzKGtleSk7XHJcbiAgICB9O1xyXG4gICAgTm9kZUhhbmRsZXIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChlbGVtZW50LCBrZXkpIHtcclxuICAgICAgICB0aGlzLl9ub2RlTWFwLnNldChrZXksIGVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuZW1pdCh7IHR5cGU6IGtleSB9KTtcclxuICAgIH07XHJcbiAgICBOb2RlSGFuZGxlci5wcm90b3R5cGUuYWRkUm9vdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLmVtaXQoeyB0eXBlOiBOb2RlRXZlbnRUeXBlLldpZGdldCB9KTtcclxuICAgIH07XHJcbiAgICBOb2RlSGFuZGxlci5wcm90b3R5cGUuYWRkUHJvamVjdG9yID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuZW1pdCh7IHR5cGU6IE5vZGVFdmVudFR5cGUuUHJvamVjdG9yIH0pO1xyXG4gICAgfTtcclxuICAgIE5vZGVIYW5kbGVyLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLl9ub2RlTWFwLmNsZWFyKCk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIE5vZGVIYW5kbGVyO1xyXG59KEV2ZW50ZWRfMS5FdmVudGVkKSk7XHJcbmV4cG9ydHMuTm9kZUhhbmRsZXIgPSBOb2RlSGFuZGxlcjtcclxuZXhwb3J0cy5kZWZhdWx0ID0gTm9kZUhhbmRsZXI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvTm9kZUhhbmRsZXIuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL05vZGVIYW5kbGVyLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xyXG52YXIgUHJvbWlzZV8xID0gcmVxdWlyZShcIkBkb2pvL3NoaW0vUHJvbWlzZVwiKTtcclxudmFyIE1hcF8xID0gcmVxdWlyZShcIkBkb2pvL3NoaW0vTWFwXCIpO1xyXG52YXIgU3ltYm9sXzEgPSByZXF1aXJlKFwiQGRvam8vc2hpbS9TeW1ib2xcIik7XHJcbnZhciBFdmVudGVkXzEgPSByZXF1aXJlKFwiQGRvam8vY29yZS9FdmVudGVkXCIpO1xyXG4vKipcclxuICogV2lkZ2V0IGJhc2Ugc3ltYm9sIHR5cGVcclxuICovXHJcbmV4cG9ydHMuV0lER0VUX0JBU0VfVFlQRSA9IFN5bWJvbF8xLmRlZmF1bHQoJ1dpZGdldCBCYXNlJyk7XHJcbi8qKlxyXG4gKiBDaGVja3MgaXMgdGhlIGl0ZW0gaXMgYSBzdWJjbGFzcyBvZiBXaWRnZXRCYXNlIChvciBhIFdpZGdldEJhc2UpXHJcbiAqXHJcbiAqIEBwYXJhbSBpdGVtIHRoZSBpdGVtIHRvIGNoZWNrXHJcbiAqIEByZXR1cm5zIHRydWUvZmFsc2UgaW5kaWNhdGluZyBpZiB0aGUgaXRlbSBpcyBhIFdpZGdldEJhc2VDb25zdHJ1Y3RvclxyXG4gKi9cclxuZnVuY3Rpb24gaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IoaXRlbSkge1xyXG4gICAgcmV0dXJuIEJvb2xlYW4oaXRlbSAmJiBpdGVtLl90eXBlID09PSBleHBvcnRzLldJREdFVF9CQVNFX1RZUEUpO1xyXG59XHJcbmV4cG9ydHMuaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IgPSBpc1dpZGdldEJhc2VDb25zdHJ1Y3RvcjtcclxuZnVuY3Rpb24gaXNXaWRnZXRDb25zdHJ1Y3RvckRlZmF1bHRFeHBvcnQoaXRlbSkge1xyXG4gICAgcmV0dXJuIEJvb2xlYW4oaXRlbSAmJlxyXG4gICAgICAgIGl0ZW0uaGFzT3duUHJvcGVydHkoJ19fZXNNb2R1bGUnKSAmJlxyXG4gICAgICAgIGl0ZW0uaGFzT3duUHJvcGVydHkoJ2RlZmF1bHQnKSAmJlxyXG4gICAgICAgIGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yKGl0ZW0uZGVmYXVsdCkpO1xyXG59XHJcbmV4cG9ydHMuaXNXaWRnZXRDb25zdHJ1Y3RvckRlZmF1bHRFeHBvcnQgPSBpc1dpZGdldENvbnN0cnVjdG9yRGVmYXVsdEV4cG9ydDtcclxuLyoqXHJcbiAqIFRoZSBSZWdpc3RyeSBpbXBsZW1lbnRhdGlvblxyXG4gKi9cclxudmFyIFJlZ2lzdHJ5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xyXG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoUmVnaXN0cnksIF9zdXBlcik7XHJcbiAgICBmdW5jdGlvbiBSZWdpc3RyeSgpIHtcclxuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEVtaXQgbG9hZGVkIGV2ZW50IGZvciByZWdpc3RyeSBsYWJlbFxyXG4gICAgICovXHJcbiAgICBSZWdpc3RyeS5wcm90b3R5cGUuZW1pdExvYWRlZEV2ZW50ID0gZnVuY3Rpb24gKHdpZGdldExhYmVsLCBpdGVtKSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KHtcclxuICAgICAgICAgICAgdHlwZTogd2lkZ2V0TGFiZWwsXHJcbiAgICAgICAgICAgIGFjdGlvbjogJ2xvYWRlZCcsXHJcbiAgICAgICAgICAgIGl0ZW06IGl0ZW1cclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbiAgICBSZWdpc3RyeS5wcm90b3R5cGUuZGVmaW5lID0gZnVuY3Rpb24gKGxhYmVsLCBpdGVtKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICBpZiAodGhpcy5fd2lkZ2V0UmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLl93aWRnZXRSZWdpc3RyeSA9IG5ldyBNYXBfMS5kZWZhdWx0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl93aWRnZXRSZWdpc3RyeS5oYXMobGFiZWwpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIndpZGdldCBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgZm9yICdcIiArIGxhYmVsLnRvU3RyaW5nKCkgKyBcIidcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3dpZGdldFJlZ2lzdHJ5LnNldChsYWJlbCwgaXRlbSk7XHJcbiAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQcm9taXNlXzEuZGVmYXVsdCkge1xyXG4gICAgICAgICAgICBpdGVtLnRoZW4oZnVuY3Rpb24gKHdpZGdldEN0b3IpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLl93aWRnZXRSZWdpc3RyeS5zZXQobGFiZWwsIHdpZGdldEN0b3IpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuZW1pdExvYWRlZEV2ZW50KGxhYmVsLCB3aWRnZXRDdG9yKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB3aWRnZXRDdG9yO1xyXG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IoaXRlbSkpIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0TG9hZGVkRXZlbnQobGFiZWwsIGl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBSZWdpc3RyeS5wcm90b3R5cGUuZGVmaW5lSW5qZWN0b3IgPSBmdW5jdGlvbiAobGFiZWwsIGluamVjdG9yRmFjdG9yeSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9pbmplY3RvclJlZ2lzdHJ5ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5faW5qZWN0b3JSZWdpc3RyeSA9IG5ldyBNYXBfMS5kZWZhdWx0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9pbmplY3RvclJlZ2lzdHJ5LmhhcyhsYWJlbCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW5qZWN0b3IgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIGZvciAnXCIgKyBsYWJlbC50b1N0cmluZygpICsgXCInXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgaW52YWxpZGF0b3IgPSBuZXcgRXZlbnRlZF8xLkV2ZW50ZWQoKTtcclxuICAgICAgICB2YXIgaW5qZWN0b3JJdGVtID0ge1xyXG4gICAgICAgICAgICBpbmplY3RvcjogaW5qZWN0b3JGYWN0b3J5KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGludmFsaWRhdG9yLmVtaXQoeyB0eXBlOiAnaW52YWxpZGF0ZScgfSk7IH0pLFxyXG4gICAgICAgICAgICBpbnZhbGlkYXRvcjogaW52YWxpZGF0b3JcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX2luamVjdG9yUmVnaXN0cnkuc2V0KGxhYmVsLCBpbmplY3Rvckl0ZW0pO1xyXG4gICAgICAgIHRoaXMuZW1pdExvYWRlZEV2ZW50KGxhYmVsLCBpbmplY3Rvckl0ZW0pO1xyXG4gICAgfTtcclxuICAgIFJlZ2lzdHJ5LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAobGFiZWwpIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGlmICghdGhpcy5fd2lkZ2V0UmVnaXN0cnkgfHwgIXRoaXMuaGFzKGxhYmVsKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLl93aWRnZXRSZWdpc3RyeS5nZXQobGFiZWwpO1xyXG4gICAgICAgIGlmIChpc1dpZGdldEJhc2VDb25zdHJ1Y3RvcihpdGVtKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQcm9taXNlXzEuZGVmYXVsdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHByb21pc2UgPSBpdGVtKCk7XHJcbiAgICAgICAgdGhpcy5fd2lkZ2V0UmVnaXN0cnkuc2V0KGxhYmVsLCBwcm9taXNlKTtcclxuICAgICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKHdpZGdldEN0b3IpIHtcclxuICAgICAgICAgICAgaWYgKGlzV2lkZ2V0Q29uc3RydWN0b3JEZWZhdWx0RXhwb3J0KHdpZGdldEN0b3IpKSB7XHJcbiAgICAgICAgICAgICAgICB3aWRnZXRDdG9yID0gd2lkZ2V0Q3Rvci5kZWZhdWx0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF90aGlzLl93aWRnZXRSZWdpc3RyeS5zZXQobGFiZWwsIHdpZGdldEN0b3IpO1xyXG4gICAgICAgICAgICBfdGhpcy5lbWl0TG9hZGVkRXZlbnQobGFiZWwsIHdpZGdldEN0b3IpO1xyXG4gICAgICAgICAgICByZXR1cm4gd2lkZ2V0Q3RvcjtcclxuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG4gICAgUmVnaXN0cnkucHJvdG90eXBlLmdldEluamVjdG9yID0gZnVuY3Rpb24gKGxhYmVsKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pbmplY3RvclJlZ2lzdHJ5IHx8ICF0aGlzLmhhc0luamVjdG9yKGxhYmVsKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luamVjdG9yUmVnaXN0cnkuZ2V0KGxhYmVsKTtcclxuICAgIH07XHJcbiAgICBSZWdpc3RyeS5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGxhYmVsKSB7XHJcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5fd2lkZ2V0UmVnaXN0cnkgJiYgdGhpcy5fd2lkZ2V0UmVnaXN0cnkuaGFzKGxhYmVsKSk7XHJcbiAgICB9O1xyXG4gICAgUmVnaXN0cnkucHJvdG90eXBlLmhhc0luamVjdG9yID0gZnVuY3Rpb24gKGxhYmVsKSB7XHJcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5faW5qZWN0b3JSZWdpc3RyeSAmJiB0aGlzLl9pbmplY3RvclJlZ2lzdHJ5LmhhcyhsYWJlbCkpO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBSZWdpc3RyeTtcclxufShFdmVudGVkXzEuRXZlbnRlZCkpO1xyXG5leHBvcnRzLlJlZ2lzdHJ5ID0gUmVnaXN0cnk7XHJcbmV4cG9ydHMuZGVmYXVsdCA9IFJlZ2lzdHJ5O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL1JlZ2lzdHJ5LmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9SZWdpc3RyeS5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcclxudmFyIE1hcF8xID0gcmVxdWlyZShcIkBkb2pvL3NoaW0vTWFwXCIpO1xyXG52YXIgRXZlbnRlZF8xID0gcmVxdWlyZShcIkBkb2pvL2NvcmUvRXZlbnRlZFwiKTtcclxudmFyIFJlZ2lzdHJ5XzEgPSByZXF1aXJlKFwiLi9SZWdpc3RyeVwiKTtcclxudmFyIFJlZ2lzdHJ5SGFuZGxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcclxuICAgIHRzbGliXzEuX19leHRlbmRzKFJlZ2lzdHJ5SGFuZGxlciwgX3N1cGVyKTtcclxuICAgIGZ1bmN0aW9uIFJlZ2lzdHJ5SGFuZGxlcigpIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xyXG4gICAgICAgIF90aGlzLl9yZWdpc3RyeSA9IG5ldyBSZWdpc3RyeV8xLlJlZ2lzdHJ5KCk7XHJcbiAgICAgICAgX3RoaXMuX3JlZ2lzdHJ5V2lkZ2V0TGFiZWxNYXAgPSBuZXcgTWFwXzEuTWFwKCk7XHJcbiAgICAgICAgX3RoaXMuX3JlZ2lzdHJ5SW5qZWN0b3JMYWJlbE1hcCA9IG5ldyBNYXBfMS5NYXAoKTtcclxuICAgICAgICBfdGhpcy5vd24oX3RoaXMuX3JlZ2lzdHJ5KTtcclxuICAgICAgICB2YXIgZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKF90aGlzLmJhc2VSZWdpc3RyeSkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuX3JlZ2lzdHJ5V2lkZ2V0TGFiZWxNYXAuZGVsZXRlKF90aGlzLmJhc2VSZWdpc3RyeSk7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fcmVnaXN0cnlJbmplY3RvckxhYmVsTWFwLmRlbGV0ZShfdGhpcy5iYXNlUmVnaXN0cnkpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuYmFzZVJlZ2lzdHJ5ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICBfdGhpcy5vd24oeyBkZXN0cm95OiBkZXN0cm95IH0pO1xyXG4gICAgICAgIHJldHVybiBfdGhpcztcclxuICAgIH1cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWdpc3RyeUhhbmRsZXIucHJvdG90eXBlLCBcImJhc2VcIiwge1xyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKGJhc2VSZWdpc3RyeSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5iYXNlUmVnaXN0cnkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5V2lkZ2V0TGFiZWxNYXAuZGVsZXRlKHRoaXMuYmFzZVJlZ2lzdHJ5KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5SW5qZWN0b3JMYWJlbE1hcC5kZWxldGUodGhpcy5iYXNlUmVnaXN0cnkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuYmFzZVJlZ2lzdHJ5ID0gYmFzZVJlZ2lzdHJ5O1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgUmVnaXN0cnlIYW5kbGVyLnByb3RvdHlwZS5kZWZpbmUgPSBmdW5jdGlvbiAobGFiZWwsIHdpZGdldCkge1xyXG4gICAgICAgIHRoaXMuX3JlZ2lzdHJ5LmRlZmluZShsYWJlbCwgd2lkZ2V0KTtcclxuICAgIH07XHJcbiAgICBSZWdpc3RyeUhhbmRsZXIucHJvdG90eXBlLmRlZmluZUluamVjdG9yID0gZnVuY3Rpb24gKGxhYmVsLCBpbmplY3Rvcikge1xyXG4gICAgICAgIHRoaXMuX3JlZ2lzdHJ5LmRlZmluZUluamVjdG9yKGxhYmVsLCBpbmplY3Rvcik7XHJcbiAgICB9O1xyXG4gICAgUmVnaXN0cnlIYW5kbGVyLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAobGFiZWwpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVnaXN0cnkuaGFzKGxhYmVsKSB8fCBCb29sZWFuKHRoaXMuYmFzZVJlZ2lzdHJ5ICYmIHRoaXMuYmFzZVJlZ2lzdHJ5LmhhcyhsYWJlbCkpO1xyXG4gICAgfTtcclxuICAgIFJlZ2lzdHJ5SGFuZGxlci5wcm90b3R5cGUuaGFzSW5qZWN0b3IgPSBmdW5jdGlvbiAobGFiZWwpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVnaXN0cnkuaGFzSW5qZWN0b3IobGFiZWwpIHx8IEJvb2xlYW4odGhpcy5iYXNlUmVnaXN0cnkgJiYgdGhpcy5iYXNlUmVnaXN0cnkuaGFzSW5qZWN0b3IobGFiZWwpKTtcclxuICAgIH07XHJcbiAgICBSZWdpc3RyeUhhbmRsZXIucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChsYWJlbCwgZ2xvYmFsUHJlY2VkZW5jZSkge1xyXG4gICAgICAgIGlmIChnbG9iYWxQcmVjZWRlbmNlID09PSB2b2lkIDApIHsgZ2xvYmFsUHJlY2VkZW5jZSA9IGZhbHNlOyB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldChsYWJlbCwgZ2xvYmFsUHJlY2VkZW5jZSwgJ2dldCcsIHRoaXMuX3JlZ2lzdHJ5V2lkZ2V0TGFiZWxNYXApO1xyXG4gICAgfTtcclxuICAgIFJlZ2lzdHJ5SGFuZGxlci5wcm90b3R5cGUuZ2V0SW5qZWN0b3IgPSBmdW5jdGlvbiAobGFiZWwsIGdsb2JhbFByZWNlZGVuY2UpIHtcclxuICAgICAgICBpZiAoZ2xvYmFsUHJlY2VkZW5jZSA9PT0gdm9pZCAwKSB7IGdsb2JhbFByZWNlZGVuY2UgPSBmYWxzZTsgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXQobGFiZWwsIGdsb2JhbFByZWNlZGVuY2UsICdnZXRJbmplY3RvcicsIHRoaXMuX3JlZ2lzdHJ5SW5qZWN0b3JMYWJlbE1hcCk7XHJcbiAgICB9O1xyXG4gICAgUmVnaXN0cnlIYW5kbGVyLnByb3RvdHlwZS5fZ2V0ID0gZnVuY3Rpb24gKGxhYmVsLCBnbG9iYWxQcmVjZWRlbmNlLCBnZXRGdW5jdGlvbk5hbWUsIGxhYmVsTWFwKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICB2YXIgcmVnaXN0cmllcyA9IGdsb2JhbFByZWNlZGVuY2UgPyBbdGhpcy5iYXNlUmVnaXN0cnksIHRoaXMuX3JlZ2lzdHJ5XSA6IFt0aGlzLl9yZWdpc3RyeSwgdGhpcy5iYXNlUmVnaXN0cnldO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVnaXN0cmllcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgcmVnaXN0cnkgPSByZWdpc3RyaWVzW2ldO1xyXG4gICAgICAgICAgICBpZiAoIXJlZ2lzdHJ5KSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgaXRlbSA9IHJlZ2lzdHJ5W2dldEZ1bmN0aW9uTmFtZV0obGFiZWwpO1xyXG4gICAgICAgICAgICB2YXIgcmVnaXN0ZXJlZExhYmVscyA9IGxhYmVsTWFwLmdldChyZWdpc3RyeSkgfHwgW107XHJcbiAgICAgICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChyZWdpc3RlcmVkTGFiZWxzLmluZGV4T2YobGFiZWwpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IHJlZ2lzdHJ5Lm9uKGxhYmVsLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuYWN0aW9uID09PSAnbG9hZGVkJyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpc1tnZXRGdW5jdGlvbk5hbWVdKGxhYmVsLCBnbG9iYWxQcmVjZWRlbmNlKSA9PT0gZXZlbnQuaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KHsgdHlwZTogJ2ludmFsaWRhdGUnIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vd24oaGFuZGxlKTtcclxuICAgICAgICAgICAgICAgIGxhYmVsTWFwLnNldChyZWdpc3RyeSwgdHNsaWJfMS5fX3NwcmVhZChyZWdpc3RlcmVkTGFiZWxzLCBbbGFiZWxdKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIFJlZ2lzdHJ5SGFuZGxlcjtcclxufShFdmVudGVkXzEuRXZlbnRlZCkpO1xyXG5leHBvcnRzLlJlZ2lzdHJ5SGFuZGxlciA9IFJlZ2lzdHJ5SGFuZGxlcjtcclxuZXhwb3J0cy5kZWZhdWx0ID0gUmVnaXN0cnlIYW5kbGVyO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL1JlZ2lzdHJ5SGFuZGxlci5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvUmVnaXN0cnlIYW5kbGVyLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xyXG52YXIgTWFwXzEgPSByZXF1aXJlKFwiQGRvam8vc2hpbS9NYXBcIik7XHJcbnZhciBXZWFrTWFwXzEgPSByZXF1aXJlKFwiQGRvam8vc2hpbS9XZWFrTWFwXCIpO1xyXG52YXIgU3ltYm9sXzEgPSByZXF1aXJlKFwiQGRvam8vc2hpbS9TeW1ib2xcIik7XHJcbnZhciBkXzEgPSByZXF1aXJlKFwiLi9kXCIpO1xyXG52YXIgZGlmZl8xID0gcmVxdWlyZShcIi4vZGlmZlwiKTtcclxudmFyIFJlZ2lzdHJ5SGFuZGxlcl8xID0gcmVxdWlyZShcIi4vUmVnaXN0cnlIYW5kbGVyXCIpO1xyXG52YXIgTm9kZUhhbmRsZXJfMSA9IHJlcXVpcmUoXCIuL05vZGVIYW5kbGVyXCIpO1xyXG52YXIgdmRvbV8xID0gcmVxdWlyZShcIi4vdmRvbVwiKTtcclxudmFyIFJlZ2lzdHJ5XzEgPSByZXF1aXJlKFwiLi9SZWdpc3RyeVwiKTtcclxudmFyIGRlY29yYXRvck1hcCA9IG5ldyBNYXBfMS5kZWZhdWx0KCk7XHJcbnZhciBib3VuZEF1dG8gPSBkaWZmXzEuYXV0by5iaW5kKG51bGwpO1xyXG5leHBvcnRzLm5vQmluZCA9IFN5bWJvbF8xLmRlZmF1bHQuZm9yKCdkb2pvTm9CaW5kJyk7XHJcbi8qKlxyXG4gKiBNYWluIHdpZGdldCBiYXNlIGZvciBhbGwgd2lkZ2V0cyB0byBleHRlbmRcclxuICovXHJcbnZhciBXaWRnZXRCYXNlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAY29uc3RydWN0b3JcclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gV2lkZ2V0QmFzZSgpIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEluZGljYXRlcyBpZiBpdCBpcyB0aGUgaW5pdGlhbCBzZXQgcHJvcGVydGllcyBjeWNsZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2luaXRpYWxQcm9wZXJ0aWVzID0gdHJ1ZTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBcnJheSBvZiBwcm9wZXJ0eSBrZXlzIGNvbnNpZGVyZWQgY2hhbmdlZCBmcm9tIHRoZSBwcmV2aW91cyBzZXQgcHJvcGVydGllc1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2NoYW5nZWRQcm9wZXJ0eUtleXMgPSBbXTtcclxuICAgICAgICB0aGlzLl9ub2RlSGFuZGxlciA9IG5ldyBOb2RlSGFuZGxlcl8xLmRlZmF1bHQoKTtcclxuICAgICAgICB0aGlzLl9oYW5kbGVzID0gW107XHJcbiAgICAgICAgdGhpcy5fY2hpbGRyZW4gPSBbXTtcclxuICAgICAgICB0aGlzLl9kZWNvcmF0b3JDYWNoZSA9IG5ldyBNYXBfMS5kZWZhdWx0KCk7XHJcbiAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX2JvdW5kUmVuZGVyRnVuYyA9IHRoaXMucmVuZGVyLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5fYm91bmRJbnZhbGlkYXRlID0gdGhpcy5pbnZhbGlkYXRlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdmRvbV8xLndpZGdldEluc3RhbmNlTWFwLnNldCh0aGlzLCB7XHJcbiAgICAgICAgICAgIGRpcnR5OiB0cnVlLFxyXG4gICAgICAgICAgICBvbkF0dGFjaDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMub25BdHRhY2goKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgb25EZXRhY2g6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLm9uRGV0YWNoKCk7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG5vZGVIYW5kbGVyOiB0aGlzLl9ub2RlSGFuZGxlcixcclxuICAgICAgICAgICAgcmVnaXN0cnk6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5yZWdpc3RyeTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgY29yZVByb3BlcnRpZXM6IHt9LFxyXG4gICAgICAgICAgICByZW5kZXJpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgICBpbnB1dFByb3BlcnRpZXM6IHt9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fcnVuQWZ0ZXJDb25zdHJ1Y3RvcnMoKTtcclxuICAgIH1cclxuICAgIFdpZGdldEJhc2UucHJvdG90eXBlLm1ldGEgPSBmdW5jdGlvbiAoTWV0YVR5cGUpIHtcclxuICAgICAgICBpZiAodGhpcy5fbWV0YU1hcCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21ldGFNYXAgPSBuZXcgTWFwXzEuZGVmYXVsdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgY2FjaGVkID0gdGhpcy5fbWV0YU1hcC5nZXQoTWV0YVR5cGUpO1xyXG4gICAgICAgIGlmICghY2FjaGVkKSB7XHJcbiAgICAgICAgICAgIGNhY2hlZCA9IG5ldyBNZXRhVHlwZSh7XHJcbiAgICAgICAgICAgICAgICBpbnZhbGlkYXRlOiB0aGlzLl9ib3VuZEludmFsaWRhdGUsXHJcbiAgICAgICAgICAgICAgICBub2RlSGFuZGxlcjogdGhpcy5fbm9kZUhhbmRsZXIsXHJcbiAgICAgICAgICAgICAgICBiaW5kOiB0aGlzXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLm93bihjYWNoZWQpO1xyXG4gICAgICAgICAgICB0aGlzLl9tZXRhTWFwLnNldChNZXRhVHlwZSwgY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNhY2hlZDtcclxuICAgIH07XHJcbiAgICBXaWRnZXRCYXNlLnByb3RvdHlwZS5vbkF0dGFjaCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAvLyBEbyBub3RoaW5nIGJ5IGRlZmF1bHQuXHJcbiAgICB9O1xyXG4gICAgV2lkZ2V0QmFzZS5wcm90b3R5cGUub25EZXRhY2ggPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gRG8gbm90aGluZyBieSBkZWZhdWx0LlxyXG4gICAgfTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXaWRnZXRCYXNlLnByb3RvdHlwZSwgXCJwcm9wZXJ0aWVzXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3BlcnRpZXM7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV2lkZ2V0QmFzZS5wcm90b3R5cGUsIFwiY2hhbmdlZFByb3BlcnR5S2V5c1wiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0c2xpYl8xLl9fc3ByZWFkKHRoaXMuX2NoYW5nZWRQcm9wZXJ0eUtleXMpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgV2lkZ2V0QmFzZS5wcm90b3R5cGUuX19zZXRDb3JlUHJvcGVydGllc19fID0gZnVuY3Rpb24gKGNvcmVQcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgdmFyIGJhc2VSZWdpc3RyeSA9IGNvcmVQcm9wZXJ0aWVzLmJhc2VSZWdpc3RyeTtcclxuICAgICAgICB2YXIgaW5zdGFuY2VEYXRhID0gdmRvbV8xLndpZGdldEluc3RhbmNlTWFwLmdldCh0aGlzKTtcclxuICAgICAgICBpZiAoaW5zdGFuY2VEYXRhLmNvcmVQcm9wZXJ0aWVzLmJhc2VSZWdpc3RyeSAhPT0gYmFzZVJlZ2lzdHJ5KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZWdpc3RyeSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RyeSA9IG5ldyBSZWdpc3RyeUhhbmRsZXJfMS5kZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeS5vbignaW52YWxpZGF0ZScsIHRoaXMuX2JvdW5kSW52YWxpZGF0ZSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5LmJhc2UgPSBiYXNlUmVnaXN0cnk7XHJcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpbnN0YW5jZURhdGEuY29yZVByb3BlcnRpZXMgPSBjb3JlUHJvcGVydGllcztcclxuICAgIH07XHJcbiAgICBXaWRnZXRCYXNlLnByb3RvdHlwZS5fX3NldFByb3BlcnRpZXNfXyA9IGZ1bmN0aW9uIChvcmlnaW5hbFByb3BlcnRpZXMpIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHZhciBpbnN0YW5jZURhdGEgPSB2ZG9tXzEud2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHRoaXMpO1xyXG4gICAgICAgIGluc3RhbmNlRGF0YS5pbnB1dFByb3BlcnRpZXMgPSBvcmlnaW5hbFByb3BlcnRpZXM7XHJcbiAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLl9ydW5CZWZvcmVQcm9wZXJ0aWVzKG9yaWdpbmFsUHJvcGVydGllcyk7XHJcbiAgICAgICAgdmFyIHJlZ2lzdGVyZWREaWZmUHJvcGVydHlOYW1lcyA9IHRoaXMuZ2V0RGVjb3JhdG9yKCdyZWdpc3RlcmVkRGlmZlByb3BlcnR5Jyk7XHJcbiAgICAgICAgdmFyIGNoYW5nZWRQcm9wZXJ0eUtleXMgPSBbXTtcclxuICAgICAgICB2YXIgcHJvcGVydHlOYW1lcyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpO1xyXG4gICAgICAgIGlmICh0aGlzLl9pbml0aWFsUHJvcGVydGllcyA9PT0gZmFsc2UgfHwgcmVnaXN0ZXJlZERpZmZQcm9wZXJ0eU5hbWVzLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICAgICAgICB2YXIgYWxsUHJvcGVydGllcyA9IHRzbGliXzEuX19zcHJlYWQocHJvcGVydHlOYW1lcywgT2JqZWN0LmtleXModGhpcy5fcHJvcGVydGllcykpO1xyXG4gICAgICAgICAgICB2YXIgY2hlY2tlZFByb3BlcnRpZXMgPSBbXTtcclxuICAgICAgICAgICAgdmFyIGRpZmZQcm9wZXJ0eVJlc3VsdHMgPSB7fTtcclxuICAgICAgICAgICAgdmFyIHJ1blJlYWN0aW9ucyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBhbGxQcm9wZXJ0aWVzW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrZWRQcm9wZXJ0aWVzLmluZGV4T2YocHJvcGVydHlOYW1lKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNoZWNrZWRQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHlOYW1lKTtcclxuICAgICAgICAgICAgICAgIHZhciBwcmV2aW91c1Byb3BlcnR5ID0gdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xyXG4gICAgICAgICAgICAgICAgdmFyIG5ld1Byb3BlcnR5ID0gdGhpcy5fYmluZEZ1bmN0aW9uUHJvcGVydHkocHJvcGVydGllc1twcm9wZXJ0eU5hbWVdLCBpbnN0YW5jZURhdGEuY29yZVByb3BlcnRpZXMuYmluZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVnaXN0ZXJlZERpZmZQcm9wZXJ0eU5hbWVzLmluZGV4T2YocHJvcGVydHlOYW1lKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBydW5SZWFjdGlvbnMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkaWZmRnVuY3Rpb25zID0gdGhpcy5nZXREZWNvcmF0b3IoXCJkaWZmUHJvcGVydHk6XCIgKyBwcm9wZXJ0eU5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGlfMSA9IDA7IGlfMSA8IGRpZmZGdW5jdGlvbnMubGVuZ3RoOyBpXzErKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZGlmZkZ1bmN0aW9uc1tpXzFdKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5jaGFuZ2VkICYmIGNoYW5nZWRQcm9wZXJ0eUtleXMuaW5kZXhPZihwcm9wZXJ0eU5hbWUpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFByb3BlcnR5S2V5cy5wdXNoKHByb3BlcnR5TmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZSBpbiBwcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmUHJvcGVydHlSZXN1bHRzW3Byb3BlcnR5TmFtZV0gPSByZXN1bHQudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gYm91bmRBdXRvKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmNoYW5nZWQgJiYgY2hhbmdlZFByb3BlcnR5S2V5cy5pbmRleE9mKHByb3BlcnR5TmFtZSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRQcm9wZXJ0eUtleXMucHVzaChwcm9wZXJ0eU5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lIGluIHByb3BlcnRpZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlmZlByb3BlcnR5UmVzdWx0c1twcm9wZXJ0eU5hbWVdID0gcmVzdWx0LnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocnVuUmVhY3Rpb25zKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXBEaWZmUHJvcGVydHlSZWFjdGlvbnMocHJvcGVydGllcywgY2hhbmdlZFByb3BlcnR5S2V5cykuZm9yRWFjaChmdW5jdGlvbiAoYXJncywgcmVhY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYXJncy5jaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWN0aW9uLmNhbGwoX3RoaXMsIGFyZ3MucHJldmlvdXNQcm9wZXJ0aWVzLCBhcmdzLm5ld1Byb3BlcnRpZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBkaWZmUHJvcGVydHlSZXN1bHRzO1xyXG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VkUHJvcGVydHlLZXlzID0gY2hhbmdlZFByb3BlcnR5S2V5cztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxQcm9wZXJ0aWVzID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZXNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5KHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSwgaW5zdGFuY2VEYXRhLmNvcmVQcm9wZXJ0aWVzLmJpbmQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFByb3BlcnR5S2V5cy5wdXNoKHByb3BlcnR5TmFtZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fY2hhbmdlZFByb3BlcnR5S2V5cyA9IGNoYW5nZWRQcm9wZXJ0eUtleXM7XHJcbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCBwcm9wZXJ0aWVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2NoYW5nZWRQcm9wZXJ0eUtleXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmludmFsaWRhdGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdpZGdldEJhc2UucHJvdG90eXBlLCBcImNoaWxkcmVuXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgV2lkZ2V0QmFzZS5wcm90b3R5cGUuX19zZXRDaGlsZHJlbl9fID0gZnVuY3Rpb24gKGNoaWxkcmVuKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NoaWxkcmVuLmxlbmd0aCA+IDAgfHwgY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGlsZHJlbiA9IGNoaWxkcmVuO1xyXG4gICAgICAgICAgICB0aGlzLmludmFsaWRhdGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgV2lkZ2V0QmFzZS5wcm90b3R5cGUuX19yZW5kZXJfXyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgaW5zdGFuY2VEYXRhID0gdmRvbV8xLndpZGdldEluc3RhbmNlTWFwLmdldCh0aGlzKTtcclxuICAgICAgICBpbnN0YW5jZURhdGEuZGlydHkgPSBmYWxzZTtcclxuICAgICAgICB2YXIgcmVuZGVyID0gdGhpcy5fcnVuQmVmb3JlUmVuZGVycygpO1xyXG4gICAgICAgIHZhciBkTm9kZSA9IHJlbmRlcigpO1xyXG4gICAgICAgIGROb2RlID0gdGhpcy5ydW5BZnRlclJlbmRlcnMoZE5vZGUpO1xyXG4gICAgICAgIHRoaXMuX25vZGVIYW5kbGVyLmNsZWFyKCk7XHJcbiAgICAgICAgcmV0dXJuIGROb2RlO1xyXG4gICAgfTtcclxuICAgIFdpZGdldEJhc2UucHJvdG90eXBlLmludmFsaWRhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGluc3RhbmNlRGF0YSA9IHZkb21fMS53aWRnZXRJbnN0YW5jZU1hcC5nZXQodGhpcyk7XHJcbiAgICAgICAgaWYgKGluc3RhbmNlRGF0YS5pbnZhbGlkYXRlKSB7XHJcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5pbnZhbGlkYXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFdpZGdldEJhc2UucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gZF8xLnYoJ2RpdicsIHt9LCB0aGlzLmNoaWxkcmVuKTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIEZ1bmN0aW9uIHRvIGFkZCBkZWNvcmF0b3JzIHRvIFdpZGdldEJhc2VcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZGVjb3JhdG9yS2V5IFRoZSBrZXkgb2YgdGhlIGRlY29yYXRvclxyXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgZGVjb3JhdG9yXHJcbiAgICAgKi9cclxuICAgIFdpZGdldEJhc2UucHJvdG90eXBlLmFkZERlY29yYXRvciA9IGZ1bmN0aW9uIChkZWNvcmF0b3JLZXksIHZhbHVlKSB7XHJcbiAgICAgICAgdmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcclxuICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eSgnY29uc3RydWN0b3InKSkge1xyXG4gICAgICAgICAgICB2YXIgZGVjb3JhdG9yTGlzdCA9IGRlY29yYXRvck1hcC5nZXQodGhpcy5jb25zdHJ1Y3Rvcik7XHJcbiAgICAgICAgICAgIGlmICghZGVjb3JhdG9yTGlzdCkge1xyXG4gICAgICAgICAgICAgICAgZGVjb3JhdG9yTGlzdCA9IG5ldyBNYXBfMS5kZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBkZWNvcmF0b3JNYXAuc2V0KHRoaXMuY29uc3RydWN0b3IsIGRlY29yYXRvckxpc3QpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBzcGVjaWZpY0RlY29yYXRvckxpc3QgPSBkZWNvcmF0b3JMaXN0LmdldChkZWNvcmF0b3JLZXkpO1xyXG4gICAgICAgICAgICBpZiAoIXNwZWNpZmljRGVjb3JhdG9yTGlzdCkge1xyXG4gICAgICAgICAgICAgICAgc3BlY2lmaWNEZWNvcmF0b3JMaXN0ID0gW107XHJcbiAgICAgICAgICAgICAgICBkZWNvcmF0b3JMaXN0LnNldChkZWNvcmF0b3JLZXksIHNwZWNpZmljRGVjb3JhdG9yTGlzdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3BlY2lmaWNEZWNvcmF0b3JMaXN0LnB1c2guYXBwbHkoc3BlY2lmaWNEZWNvcmF0b3JMaXN0LCB0c2xpYl8xLl9fc3ByZWFkKHZhbHVlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgZGVjb3JhdG9ycyA9IHRoaXMuZ2V0RGVjb3JhdG9yKGRlY29yYXRvcktleSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2RlY29yYXRvckNhY2hlLnNldChkZWNvcmF0b3JLZXksIHRzbGliXzEuX19zcHJlYWQoZGVjb3JhdG9ycywgdmFsdWUpKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBGdW5jdGlvbiB0byBidWlsZCB0aGUgbGlzdCBvZiBkZWNvcmF0b3JzIGZyb20gdGhlIGdsb2JhbCBkZWNvcmF0b3IgbWFwLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBkZWNvcmF0b3JLZXkgIFRoZSBrZXkgb2YgdGhlIGRlY29yYXRvclxyXG4gICAgICogQHJldHVybiBBbiBhcnJheSBvZiBkZWNvcmF0b3IgdmFsdWVzXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBXaWRnZXRCYXNlLnByb3RvdHlwZS5fYnVpbGREZWNvcmF0b3JMaXN0ID0gZnVuY3Rpb24gKGRlY29yYXRvcktleSkge1xyXG4gICAgICAgIHZhciBhbGxEZWNvcmF0b3JzID0gW107XHJcbiAgICAgICAgdmFyIGNvbnN0cnVjdG9yID0gdGhpcy5jb25zdHJ1Y3RvcjtcclxuICAgICAgICB3aGlsZSAoY29uc3RydWN0b3IpIHtcclxuICAgICAgICAgICAgdmFyIGluc3RhbmNlTWFwID0gZGVjb3JhdG9yTWFwLmdldChjb25zdHJ1Y3Rvcik7XHJcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZU1hcCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGRlY29yYXRvcnMgPSBpbnN0YW5jZU1hcC5nZXQoZGVjb3JhdG9yS2V5KTtcclxuICAgICAgICAgICAgICAgIGlmIChkZWNvcmF0b3JzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWxsRGVjb3JhdG9ycy51bnNoaWZ0LmFwcGx5KGFsbERlY29yYXRvcnMsIHRzbGliXzEuX19zcHJlYWQoZGVjb3JhdG9ycykpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNvbnN0cnVjdG9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFsbERlY29yYXRvcnM7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBGdW5jdGlvbiB0byByZXRyaWV2ZSBkZWNvcmF0b3IgdmFsdWVzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGRlY29yYXRvcktleSBUaGUga2V5IG9mIHRoZSBkZWNvcmF0b3JcclxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGRlY29yYXRvciB2YWx1ZXNcclxuICAgICAqL1xyXG4gICAgV2lkZ2V0QmFzZS5wcm90b3R5cGUuZ2V0RGVjb3JhdG9yID0gZnVuY3Rpb24gKGRlY29yYXRvcktleSkge1xyXG4gICAgICAgIHZhciBhbGxEZWNvcmF0b3JzID0gdGhpcy5fZGVjb3JhdG9yQ2FjaGUuZ2V0KGRlY29yYXRvcktleSk7XHJcbiAgICAgICAgaWYgKGFsbERlY29yYXRvcnMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYWxsRGVjb3JhdG9ycztcclxuICAgICAgICB9XHJcbiAgICAgICAgYWxsRGVjb3JhdG9ycyA9IHRoaXMuX2J1aWxkRGVjb3JhdG9yTGlzdChkZWNvcmF0b3JLZXkpO1xyXG4gICAgICAgIHRoaXMuX2RlY29yYXRvckNhY2hlLnNldChkZWNvcmF0b3JLZXksIGFsbERlY29yYXRvcnMpO1xyXG4gICAgICAgIHJldHVybiBhbGxEZWNvcmF0b3JzO1xyXG4gICAgfTtcclxuICAgIFdpZGdldEJhc2UucHJvdG90eXBlLl9tYXBEaWZmUHJvcGVydHlSZWFjdGlvbnMgPSBmdW5jdGlvbiAobmV3UHJvcGVydGllcywgY2hhbmdlZFByb3BlcnR5S2V5cykge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdmFyIHJlYWN0aW9uRnVuY3Rpb25zID0gdGhpcy5nZXREZWNvcmF0b3IoJ2RpZmZSZWFjdGlvbicpO1xyXG4gICAgICAgIHJldHVybiByZWFjdGlvbkZ1bmN0aW9ucy5yZWR1Y2UoZnVuY3Rpb24gKHJlYWN0aW9uUHJvcGVydHlNYXAsIF9hKSB7XHJcbiAgICAgICAgICAgIHZhciByZWFjdGlvbiA9IF9hLnJlYWN0aW9uLCBwcm9wZXJ0eU5hbWUgPSBfYS5wcm9wZXJ0eU5hbWU7XHJcbiAgICAgICAgICAgIHZhciByZWFjdGlvbkFyZ3VtZW50cyA9IHJlYWN0aW9uUHJvcGVydHlNYXAuZ2V0KHJlYWN0aW9uKTtcclxuICAgICAgICAgICAgaWYgKHJlYWN0aW9uQXJndW1lbnRzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJlYWN0aW9uQXJndW1lbnRzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzUHJvcGVydGllczoge30sXHJcbiAgICAgICAgICAgICAgICAgICAgbmV3UHJvcGVydGllczoge30sXHJcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZDogZmFsc2VcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVhY3Rpb25Bcmd1bWVudHMucHJldmlvdXNQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSBfdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xyXG4gICAgICAgICAgICByZWFjdGlvbkFyZ3VtZW50cy5uZXdQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSBuZXdQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XHJcbiAgICAgICAgICAgIGlmIChjaGFuZ2VkUHJvcGVydHlLZXlzLmluZGV4T2YocHJvcGVydHlOYW1lKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIHJlYWN0aW9uQXJndW1lbnRzLmNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlYWN0aW9uUHJvcGVydHlNYXAuc2V0KHJlYWN0aW9uLCByZWFjdGlvbkFyZ3VtZW50cyk7XHJcbiAgICAgICAgICAgIHJldHVybiByZWFjdGlvblByb3BlcnR5TWFwO1xyXG4gICAgICAgIH0sIG5ldyBNYXBfMS5kZWZhdWx0KCkpO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogQmluZHMgdW5ib3VuZCBwcm9wZXJ0eSBmdW5jdGlvbnMgdG8gdGhlIHNwZWNpZmllZCBgYmluZGAgcHJvcGVydHlcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gcHJvcGVydGllcyBwcm9wZXJ0aWVzIHRvIGNoZWNrIGZvciBmdW5jdGlvbnNcclxuICAgICAqL1xyXG4gICAgV2lkZ2V0QmFzZS5wcm90b3R5cGUuX2JpbmRGdW5jdGlvblByb3BlcnR5ID0gZnVuY3Rpb24gKHByb3BlcnR5LCBiaW5kKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJyAmJiAhcHJvcGVydHlbZXhwb3J0cy5ub0JpbmRdICYmIFJlZ2lzdHJ5XzEuaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IocHJvcGVydHkpID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fYmluZEZ1bmN0aW9uUHJvcGVydHlNYXAgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYmluZEZ1bmN0aW9uUHJvcGVydHlNYXAgPSBuZXcgV2Vha01hcF8xLmRlZmF1bHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgYmluZEluZm8gPSB0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eU1hcC5nZXQocHJvcGVydHkpIHx8IHt9O1xyXG4gICAgICAgICAgICB2YXIgYm91bmRGdW5jID0gYmluZEluZm8uYm91bmRGdW5jLCBzY29wZSA9IGJpbmRJbmZvLnNjb3BlO1xyXG4gICAgICAgICAgICBpZiAoYm91bmRGdW5jID09PSB1bmRlZmluZWQgfHwgc2NvcGUgIT09IGJpbmQpIHtcclxuICAgICAgICAgICAgICAgIGJvdW5kRnVuYyA9IHByb3BlcnR5LmJpbmQoYmluZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eU1hcC5zZXQocHJvcGVydHksIHsgYm91bmRGdW5jOiBib3VuZEZ1bmMsIHNjb3BlOiBiaW5kIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBib3VuZEZ1bmM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwcm9wZXJ0eTtcclxuICAgIH07XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV2lkZ2V0QmFzZS5wcm90b3R5cGUsIFwicmVnaXN0cnlcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fcmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnlIYW5kbGVyXzEuZGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vd24odGhpcy5fcmVnaXN0cnkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vd24odGhpcy5fcmVnaXN0cnkub24oJ2ludmFsaWRhdGUnLCB0aGlzLl9ib3VuZEludmFsaWRhdGUpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVnaXN0cnk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBXaWRnZXRCYXNlLnByb3RvdHlwZS5fcnVuQmVmb3JlUHJvcGVydGllcyA9IGZ1bmN0aW9uIChwcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICB2YXIgYmVmb3JlUHJvcGVydGllcyA9IHRoaXMuZ2V0RGVjb3JhdG9yKCdiZWZvcmVQcm9wZXJ0aWVzJyk7XHJcbiAgICAgICAgaWYgKGJlZm9yZVByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYmVmb3JlUHJvcGVydGllcy5yZWR1Y2UoZnVuY3Rpb24gKHByb3BlcnRpZXMsIGJlZm9yZVByb3BlcnRpZXNGdW5jdGlvbikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRzbGliXzEuX19hc3NpZ24oe30sIHByb3BlcnRpZXMsIGJlZm9yZVByb3BlcnRpZXNGdW5jdGlvbi5jYWxsKF90aGlzLCBwcm9wZXJ0aWVzKSk7XHJcbiAgICAgICAgICAgIH0sIHRzbGliXzEuX19hc3NpZ24oe30sIHByb3BlcnRpZXMpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBSdW4gYWxsIHJlZ2lzdGVyZWQgYmVmb3JlIHJlbmRlcnMgYW5kIHJldHVybiB0aGUgdXBkYXRlZCByZW5kZXIgbWV0aG9kXHJcbiAgICAgKi9cclxuICAgIFdpZGdldEJhc2UucHJvdG90eXBlLl9ydW5CZWZvcmVSZW5kZXJzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdmFyIGJlZm9yZVJlbmRlcnMgPSB0aGlzLmdldERlY29yYXRvcignYmVmb3JlUmVuZGVyJyk7XHJcbiAgICAgICAgaWYgKGJlZm9yZVJlbmRlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYmVmb3JlUmVuZGVycy5yZWR1Y2UoZnVuY3Rpb24gKHJlbmRlciwgYmVmb3JlUmVuZGVyRnVuY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIHZhciB1cGRhdGVkUmVuZGVyID0gYmVmb3JlUmVuZGVyRnVuY3Rpb24uY2FsbChfdGhpcywgcmVuZGVyLCBfdGhpcy5fcHJvcGVydGllcywgX3RoaXMuX2NoaWxkcmVuKTtcclxuICAgICAgICAgICAgICAgIGlmICghdXBkYXRlZFJlbmRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVuZGVyIGZ1bmN0aW9uIG5vdCByZXR1cm5lZCBmcm9tIGJlZm9yZVJlbmRlciwgdXNpbmcgcHJldmlvdXMgcmVuZGVyJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlbmRlcjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVkUmVuZGVyO1xyXG4gICAgICAgICAgICB9LCB0aGlzLl9ib3VuZFJlbmRlckZ1bmMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fYm91bmRSZW5kZXJGdW5jO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogUnVuIGFsbCByZWdpc3RlcmVkIGFmdGVyIHJlbmRlcnMgYW5kIHJldHVybiB0aGUgZGVjb3JhdGVkIEROb2Rlc1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBkTm9kZSBUaGUgRE5vZGVzIHRvIHJ1biB0aHJvdWdoIHRoZSBhZnRlciByZW5kZXJzXHJcbiAgICAgKi9cclxuICAgIFdpZGdldEJhc2UucHJvdG90eXBlLnJ1bkFmdGVyUmVuZGVycyA9IGZ1bmN0aW9uIChkTm9kZSkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdmFyIGFmdGVyUmVuZGVycyA9IHRoaXMuZ2V0RGVjb3JhdG9yKCdhZnRlclJlbmRlcicpO1xyXG4gICAgICAgIGlmIChhZnRlclJlbmRlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYWZ0ZXJSZW5kZXJzLnJlZHVjZShmdW5jdGlvbiAoZE5vZGUsIGFmdGVyUmVuZGVyRnVuY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhZnRlclJlbmRlckZ1bmN0aW9uLmNhbGwoX3RoaXMsIGROb2RlKTtcclxuICAgICAgICAgICAgfSwgZE5vZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fbWV0YU1hcCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21ldGFNYXAuZm9yRWFjaChmdW5jdGlvbiAobWV0YSkge1xyXG4gICAgICAgICAgICAgICAgbWV0YS5hZnRlclJlbmRlcigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGROb2RlO1xyXG4gICAgfTtcclxuICAgIFdpZGdldEJhc2UucHJvdG90eXBlLl9ydW5BZnRlckNvbnN0cnVjdG9ycyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHZhciBhZnRlckNvbnN0cnVjdG9ycyA9IHRoaXMuZ2V0RGVjb3JhdG9yKCdhZnRlckNvbnN0cnVjdG9yJyk7XHJcbiAgICAgICAgaWYgKGFmdGVyQ29uc3RydWN0b3JzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgYWZ0ZXJDb25zdHJ1Y3RvcnMuZm9yRWFjaChmdW5jdGlvbiAoYWZ0ZXJDb25zdHJ1Y3RvcikgeyByZXR1cm4gYWZ0ZXJDb25zdHJ1Y3Rvci5jYWxsKF90aGlzKTsgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFdpZGdldEJhc2UucHJvdG90eXBlLm93biA9IGZ1bmN0aW9uIChoYW5kbGUpIHtcclxuICAgICAgICB0aGlzLl9oYW5kbGVzLnB1c2goaGFuZGxlKTtcclxuICAgIH07XHJcbiAgICBXaWRnZXRCYXNlLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHdoaWxlICh0aGlzLl9oYW5kbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IHRoaXMuX2hhbmRsZXMucG9wKCk7XHJcbiAgICAgICAgICAgIGlmIChoYW5kbGUpIHtcclxuICAgICAgICAgICAgICAgIGhhbmRsZS5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBzdGF0aWMgaWRlbnRpZmllclxyXG4gICAgICovXHJcbiAgICBXaWRnZXRCYXNlLl90eXBlID0gUmVnaXN0cnlfMS5XSURHRVRfQkFTRV9UWVBFO1xyXG4gICAgcmV0dXJuIFdpZGdldEJhc2U7XHJcbn0oKSk7XHJcbmV4cG9ydHMuV2lkZ2V0QmFzZSA9IFdpZGdldEJhc2U7XHJcbmV4cG9ydHMuZGVmYXVsdCA9IFdpZGdldEJhc2U7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvV2lkZ2V0QmFzZS5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvV2lkZ2V0QmFzZS5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgYnJvd3NlclNwZWNpZmljVHJhbnNpdGlvbkVuZEV2ZW50TmFtZSA9ICcnO1xyXG52YXIgYnJvd3NlclNwZWNpZmljQW5pbWF0aW9uRW5kRXZlbnROYW1lID0gJyc7XHJcbmZ1bmN0aW9uIGRldGVybWluZUJyb3dzZXJTdHlsZU5hbWVzKGVsZW1lbnQpIHtcclxuICAgIGlmICgnV2Via2l0VHJhbnNpdGlvbicgaW4gZWxlbWVudC5zdHlsZSkge1xyXG4gICAgICAgIGJyb3dzZXJTcGVjaWZpY1RyYW5zaXRpb25FbmRFdmVudE5hbWUgPSAnd2Via2l0VHJhbnNpdGlvbkVuZCc7XHJcbiAgICAgICAgYnJvd3NlclNwZWNpZmljQW5pbWF0aW9uRW5kRXZlbnROYW1lID0gJ3dlYmtpdEFuaW1hdGlvbkVuZCc7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICgndHJhbnNpdGlvbicgaW4gZWxlbWVudC5zdHlsZSB8fCAnTW96VHJhbnNpdGlvbicgaW4gZWxlbWVudC5zdHlsZSkge1xyXG4gICAgICAgIGJyb3dzZXJTcGVjaWZpY1RyYW5zaXRpb25FbmRFdmVudE5hbWUgPSAndHJhbnNpdGlvbmVuZCc7XHJcbiAgICAgICAgYnJvd3NlclNwZWNpZmljQW5pbWF0aW9uRW5kRXZlbnROYW1lID0gJ2FuaW1hdGlvbmVuZCc7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdXIgYnJvd3NlciBpcyBub3Qgc3VwcG9ydGVkJyk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gaW5pdGlhbGl6ZShlbGVtZW50KSB7XHJcbiAgICBpZiAoYnJvd3NlclNwZWNpZmljQW5pbWF0aW9uRW5kRXZlbnROYW1lID09PSAnJykge1xyXG4gICAgICAgIGRldGVybWluZUJyb3dzZXJTdHlsZU5hbWVzKGVsZW1lbnQpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHJ1bkFuZENsZWFuVXAoZWxlbWVudCwgc3RhcnRBbmltYXRpb24sIGZpbmlzaEFuaW1hdGlvbikge1xyXG4gICAgaW5pdGlhbGl6ZShlbGVtZW50KTtcclxuICAgIHZhciBmaW5pc2hlZCA9IGZhbHNlO1xyXG4gICAgdmFyIHRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKCFmaW5pc2hlZCkge1xyXG4gICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihicm93c2VyU3BlY2lmaWNUcmFuc2l0aW9uRW5kRXZlbnROYW1lLCB0cmFuc2l0aW9uRW5kKTtcclxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSwgdHJhbnNpdGlvbkVuZCk7XHJcbiAgICAgICAgICAgIGZpbmlzaEFuaW1hdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBzdGFydEFuaW1hdGlvbigpO1xyXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGJyb3dzZXJTcGVjaWZpY0FuaW1hdGlvbkVuZEV2ZW50TmFtZSwgdHJhbnNpdGlvbkVuZCk7XHJcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoYnJvd3NlclNwZWNpZmljVHJhbnNpdGlvbkVuZEV2ZW50TmFtZSwgdHJhbnNpdGlvbkVuZCk7XHJcbn1cclxuZnVuY3Rpb24gZXhpdChub2RlLCBwcm9wZXJ0aWVzLCBleGl0QW5pbWF0aW9uLCByZW1vdmVOb2RlKSB7XHJcbiAgICB2YXIgYWN0aXZlQ2xhc3MgPSBwcm9wZXJ0aWVzLmV4aXRBbmltYXRpb25BY3RpdmUgfHwgZXhpdEFuaW1hdGlvbiArIFwiLWFjdGl2ZVwiO1xyXG4gICAgcnVuQW5kQ2xlYW5VcChub2RlLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKGV4aXRBbmltYXRpb24pO1xyXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZChhY3RpdmVDbGFzcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmVtb3ZlTm9kZSgpO1xyXG4gICAgfSk7XHJcbn1cclxuZnVuY3Rpb24gZW50ZXIobm9kZSwgcHJvcGVydGllcywgZW50ZXJBbmltYXRpb24pIHtcclxuICAgIHZhciBhY3RpdmVDbGFzcyA9IHByb3BlcnRpZXMuZW50ZXJBbmltYXRpb25BY3RpdmUgfHwgZW50ZXJBbmltYXRpb24gKyBcIi1hY3RpdmVcIjtcclxuICAgIHJ1bkFuZENsZWFuVXAobm9kZSwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZChlbnRlckFuaW1hdGlvbik7XHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKGFjdGl2ZUNsYXNzKTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBub2RlLmNsYXNzTGlzdC5yZW1vdmUoZW50ZXJBbmltYXRpb24pO1xyXG4gICAgICAgIG5vZGUuY2xhc3NMaXN0LnJlbW92ZShhY3RpdmVDbGFzcyk7XHJcbiAgICB9KTtcclxufVxyXG5leHBvcnRzLmRlZmF1bHQgPSB7XHJcbiAgICBlbnRlcjogZW50ZXIsXHJcbiAgICBleGl0OiBleGl0XHJcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvYW5pbWF0aW9ucy9jc3NUcmFuc2l0aW9ucy5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvYW5pbWF0aW9ucy9jc3NUcmFuc2l0aW9ucy5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcclxudmFyIFN5bWJvbF8xID0gcmVxdWlyZShcIkBkb2pvL3NoaW0vU3ltYm9sXCIpO1xyXG4vKipcclxuICogVGhlIHN5bWJvbCBpZGVudGlmaWVyIGZvciBhIFdOb2RlIHR5cGVcclxuICovXHJcbmV4cG9ydHMuV05PREUgPSBTeW1ib2xfMS5kZWZhdWx0KCdJZGVudGlmaWVyIGZvciBhIFdOb2RlLicpO1xyXG4vKipcclxuICogVGhlIHN5bWJvbCBpZGVudGlmaWVyIGZvciBhIFZOb2RlIHR5cGVcclxuICovXHJcbmV4cG9ydHMuVk5PREUgPSBTeW1ib2xfMS5kZWZhdWx0KCdJZGVudGlmaWVyIGZvciBhIFZOb2RlLicpO1xyXG4vKipcclxuICogVGhlIHN5bWJvbCBpZGVudGlmaWVyIGZvciBhIFZOb2RlIHR5cGUgY3JlYXRlZCB1c2luZyBkb20oKVxyXG4gKi9cclxuZXhwb3J0cy5ET01WTk9ERSA9IFN5bWJvbF8xLmRlZmF1bHQoJ0lkZW50aWZpZXIgZm9yIGEgVk5vZGUgY3JlYXRlZCB1c2luZyBleGlzdGluZyBkb20uJyk7XHJcbi8qKlxyXG4gKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIGBETm9kZWAgaXMgYSBgV05vZGVgIHVzaW5nIHRoZSBgdHlwZWAgcHJvcGVydHlcclxuICovXHJcbmZ1bmN0aW9uIGlzV05vZGUoY2hpbGQpIHtcclxuICAgIHJldHVybiBCb29sZWFuKGNoaWxkICYmIHR5cGVvZiBjaGlsZCAhPT0gJ3N0cmluZycgJiYgY2hpbGQudHlwZSA9PT0gZXhwb3J0cy5XTk9ERSk7XHJcbn1cclxuZXhwb3J0cy5pc1dOb2RlID0gaXNXTm9kZTtcclxuLyoqXHJcbiAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgYEROb2RlYCBpcyBhIGBWTm9kZWAgdXNpbmcgdGhlIGB0eXBlYCBwcm9wZXJ0eVxyXG4gKi9cclxuZnVuY3Rpb24gaXNWTm9kZShjaGlsZCkge1xyXG4gICAgcmV0dXJuIEJvb2xlYW4oY2hpbGQgJiYgdHlwZW9mIGNoaWxkICE9PSAnc3RyaW5nJyAmJiAoY2hpbGQudHlwZSA9PT0gZXhwb3J0cy5WTk9ERSB8fCBjaGlsZC50eXBlID09PSBleHBvcnRzLkRPTVZOT0RFKSk7XHJcbn1cclxuZXhwb3J0cy5pc1ZOb2RlID0gaXNWTm9kZTtcclxuLyoqXHJcbiAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgYEROb2RlYCBpcyBhIGBWTm9kZWAgY3JlYXRlZCB3aXRoIGBkb20oKWAgdXNpbmcgdGhlIGB0eXBlYCBwcm9wZXJ0eVxyXG4gKi9cclxuZnVuY3Rpb24gaXNEb21WTm9kZShjaGlsZCkge1xyXG4gICAgcmV0dXJuIEJvb2xlYW4oY2hpbGQgJiYgdHlwZW9mIGNoaWxkICE9PSAnc3RyaW5nJyAmJiBjaGlsZC50eXBlID09PSBleHBvcnRzLkRPTVZOT0RFKTtcclxufVxyXG5leHBvcnRzLmlzRG9tVk5vZGUgPSBpc0RvbVZOb2RlO1xyXG5mdW5jdGlvbiBpc0VsZW1lbnROb2RlKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gISF2YWx1ZS50YWdOYW1lO1xyXG59XHJcbmV4cG9ydHMuaXNFbGVtZW50Tm9kZSA9IGlzRWxlbWVudE5vZGU7XHJcbmZ1bmN0aW9uIGRlY29yYXRlKGROb2Rlcywgb3B0aW9uc09yTW9kaWZpZXIsIHByZWRpY2F0ZSkge1xyXG4gICAgdmFyIHNoYWxsb3cgPSBmYWxzZTtcclxuICAgIHZhciBtb2RpZmllcjtcclxuICAgIGlmICh0eXBlb2Ygb3B0aW9uc09yTW9kaWZpZXIgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICBtb2RpZmllciA9IG9wdGlvbnNPck1vZGlmaWVyO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgbW9kaWZpZXIgPSBvcHRpb25zT3JNb2RpZmllci5tb2RpZmllcjtcclxuICAgICAgICBwcmVkaWNhdGUgPSBvcHRpb25zT3JNb2RpZmllci5wcmVkaWNhdGU7XHJcbiAgICAgICAgc2hhbGxvdyA9IG9wdGlvbnNPck1vZGlmaWVyLnNoYWxsb3cgfHwgZmFsc2U7XHJcbiAgICB9XHJcbiAgICB2YXIgbm9kZXMgPSBBcnJheS5pc0FycmF5KGROb2RlcykgPyB0c2xpYl8xLl9fc3ByZWFkKGROb2RlcykgOiBbZE5vZGVzXTtcclxuICAgIGZ1bmN0aW9uIGJyZWFrZXIoKSB7XHJcbiAgICAgICAgbm9kZXMgPSBbXTtcclxuICAgIH1cclxuICAgIHdoaWxlIChub2Rlcy5sZW5ndGgpIHtcclxuICAgICAgICB2YXIgbm9kZSA9IG5vZGVzLnNoaWZ0KCk7XHJcbiAgICAgICAgaWYgKG5vZGUpIHtcclxuICAgICAgICAgICAgaWYgKCFzaGFsbG93ICYmIChpc1dOb2RlKG5vZGUpIHx8IGlzVk5vZGUobm9kZSkpICYmIG5vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgIG5vZGVzID0gdHNsaWJfMS5fX3NwcmVhZChub2Rlcywgbm9kZS5jaGlsZHJlbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFwcmVkaWNhdGUgfHwgcHJlZGljYXRlKG5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICBtb2RpZmllcihub2RlLCBicmVha2VyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBkTm9kZXM7XHJcbn1cclxuZXhwb3J0cy5kZWNvcmF0ZSA9IGRlY29yYXRlO1xyXG4vKipcclxuICogV3JhcHBlciBmdW5jdGlvbiBmb3IgY2FsbHMgdG8gY3JlYXRlIGEgd2lkZ2V0LlxyXG4gKi9cclxuZnVuY3Rpb24gdyh3aWRnZXRDb25zdHJ1Y3RvciwgcHJvcGVydGllcywgY2hpbGRyZW4pIHtcclxuICAgIGlmIChjaGlsZHJlbiA9PT0gdm9pZCAwKSB7IGNoaWxkcmVuID0gW107IH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuLFxyXG4gICAgICAgIHdpZGdldENvbnN0cnVjdG9yOiB3aWRnZXRDb25zdHJ1Y3RvcixcclxuICAgICAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLFxyXG4gICAgICAgIHR5cGU6IGV4cG9ydHMuV05PREVcclxuICAgIH07XHJcbn1cclxuZXhwb3J0cy53ID0gdztcclxuZnVuY3Rpb24gdih0YWcsIHByb3BlcnRpZXNPckNoaWxkcmVuLCBjaGlsZHJlbikge1xyXG4gICAgaWYgKHByb3BlcnRpZXNPckNoaWxkcmVuID09PSB2b2lkIDApIHsgcHJvcGVydGllc09yQ2hpbGRyZW4gPSB7fTsgfVxyXG4gICAgaWYgKGNoaWxkcmVuID09PSB2b2lkIDApIHsgY2hpbGRyZW4gPSB1bmRlZmluZWQ7IH1cclxuICAgIHZhciBwcm9wZXJ0aWVzID0gcHJvcGVydGllc09yQ2hpbGRyZW47XHJcbiAgICB2YXIgZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2s7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wZXJ0aWVzT3JDaGlsZHJlbikpIHtcclxuICAgICAgICBjaGlsZHJlbiA9IHByb3BlcnRpZXNPckNoaWxkcmVuO1xyXG4gICAgICAgIHByb3BlcnRpZXMgPSB7fTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgcHJvcGVydGllcyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIGRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrID0gcHJvcGVydGllcztcclxuICAgICAgICBwcm9wZXJ0aWVzID0ge307XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHRhZzogdGFnLFxyXG4gICAgICAgIGRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrOiBkZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayxcclxuICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW4sXHJcbiAgICAgICAgcHJvcGVydGllczogcHJvcGVydGllcyxcclxuICAgICAgICB0eXBlOiBleHBvcnRzLlZOT0RFXHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydHMudiA9IHY7XHJcbi8qKlxyXG4gKiBDcmVhdGUgYSBWTm9kZSBmb3IgYW4gZXhpc3RpbmcgRE9NIE5vZGUuXHJcbiAqL1xyXG5mdW5jdGlvbiBkb20oX2EsIGNoaWxkcmVuKSB7XHJcbiAgICB2YXIgbm9kZSA9IF9hLm5vZGUsIF9iID0gX2EuYXR0cnMsIGF0dHJzID0gX2IgPT09IHZvaWQgMCA/IHt9IDogX2IsIF9jID0gX2EucHJvcHMsIHByb3BzID0gX2MgPT09IHZvaWQgMCA/IHt9IDogX2MsIF9kID0gX2Eub24sIG9uID0gX2QgPT09IHZvaWQgMCA/IHt9IDogX2QsIF9lID0gX2EuZGlmZlR5cGUsIGRpZmZUeXBlID0gX2UgPT09IHZvaWQgMCA/ICdub25lJyA6IF9lO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB0YWc6IGlzRWxlbWVudE5vZGUobm9kZSkgPyBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA6ICcnLFxyXG4gICAgICAgIHByb3BlcnRpZXM6IHByb3BzLFxyXG4gICAgICAgIGF0dHJpYnV0ZXM6IGF0dHJzLFxyXG4gICAgICAgIGV2ZW50czogb24sXHJcbiAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuLFxyXG4gICAgICAgIHR5cGU6IGV4cG9ydHMuRE9NVk5PREUsXHJcbiAgICAgICAgZG9tTm9kZTogbm9kZSxcclxuICAgICAgICB0ZXh0OiBpc0VsZW1lbnROb2RlKG5vZGUpID8gdW5kZWZpbmVkIDogbm9kZS5kYXRhLFxyXG4gICAgICAgIGRpZmZUeXBlOiBkaWZmVHlwZVxyXG4gICAgfTtcclxufVxyXG5leHBvcnRzLmRvbSA9IGRvbTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciBoYW5kbGVEZWNvcmF0b3JfMSA9IHJlcXVpcmUoXCIuL2hhbmRsZURlY29yYXRvclwiKTtcclxuZnVuY3Rpb24gYWZ0ZXJSZW5kZXIobWV0aG9kKSB7XHJcbiAgICByZXR1cm4gaGFuZGxlRGVjb3JhdG9yXzEuaGFuZGxlRGVjb3JhdG9yKGZ1bmN0aW9uICh0YXJnZXQsIHByb3BlcnR5S2V5KSB7XHJcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcignYWZ0ZXJSZW5kZXInLCBwcm9wZXJ0eUtleSA/IHRhcmdldFtwcm9wZXJ0eUtleV0gOiBtZXRob2QpO1xyXG4gICAgfSk7XHJcbn1cclxuZXhwb3J0cy5hZnRlclJlbmRlciA9IGFmdGVyUmVuZGVyO1xyXG5leHBvcnRzLmRlZmF1bHQgPSBhZnRlclJlbmRlcjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2FmdGVyUmVuZGVyLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2FmdGVyUmVuZGVyLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciBoYW5kbGVEZWNvcmF0b3JfMSA9IHJlcXVpcmUoXCIuL2hhbmRsZURlY29yYXRvclwiKTtcclxudmFyIGJlZm9yZVByb3BlcnRpZXNfMSA9IHJlcXVpcmUoXCIuL2JlZm9yZVByb3BlcnRpZXNcIik7XHJcbmZ1bmN0aW9uIGFsd2F5c1JlbmRlcigpIHtcclxuICAgIHJldHVybiBoYW5kbGVEZWNvcmF0b3JfMS5oYW5kbGVEZWNvcmF0b3IoZnVuY3Rpb24gKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcclxuICAgICAgICBiZWZvcmVQcm9wZXJ0aWVzXzEuYmVmb3JlUHJvcGVydGllcyhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xyXG4gICAgICAgIH0pKHRhcmdldCk7XHJcbiAgICB9KTtcclxufVxyXG5leHBvcnRzLmFsd2F5c1JlbmRlciA9IGFsd2F5c1JlbmRlcjtcclxuZXhwb3J0cy5kZWZhdWx0ID0gYWx3YXlzUmVuZGVyO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYWx3YXlzUmVuZGVyLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2Fsd2F5c1JlbmRlci5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgaGFuZGxlRGVjb3JhdG9yXzEgPSByZXF1aXJlKFwiLi9oYW5kbGVEZWNvcmF0b3JcIik7XHJcbmZ1bmN0aW9uIGJlZm9yZVByb3BlcnRpZXMobWV0aG9kKSB7XHJcbiAgICByZXR1cm4gaGFuZGxlRGVjb3JhdG9yXzEuaGFuZGxlRGVjb3JhdG9yKGZ1bmN0aW9uICh0YXJnZXQsIHByb3BlcnR5S2V5KSB7XHJcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcignYmVmb3JlUHJvcGVydGllcycsIHByb3BlcnR5S2V5ID8gdGFyZ2V0W3Byb3BlcnR5S2V5XSA6IG1ldGhvZCk7XHJcbiAgICB9KTtcclxufVxyXG5leHBvcnRzLmJlZm9yZVByb3BlcnRpZXMgPSBiZWZvcmVQcm9wZXJ0aWVzO1xyXG5leHBvcnRzLmRlZmF1bHQgPSBiZWZvcmVQcm9wZXJ0aWVzO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYmVmb3JlUHJvcGVydGllcy5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9iZWZvcmVQcm9wZXJ0aWVzLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciByZWdpc3RlckN1c3RvbUVsZW1lbnRfMSA9IHJlcXVpcmUoXCIuLi9yZWdpc3RlckN1c3RvbUVsZW1lbnRcIik7XHJcbnZhciBSZWdpc3RyeV8xID0gcmVxdWlyZShcIi4uL1JlZ2lzdHJ5XCIpO1xyXG4vKipcclxuICogVGhpcyBEZWNvcmF0b3IgaXMgcHJvdmlkZWQgcHJvcGVydGllcyB0aGF0IGRlZmluZSB0aGUgYmVoYXZpb3Igb2YgYSBjdXN0b20gZWxlbWVudCwgYW5kXHJcbiAqIHJlZ2lzdGVycyB0aGF0IGN1c3RvbSBlbGVtZW50LlxyXG4gKi9cclxuZnVuY3Rpb24gY3VzdG9tRWxlbWVudChfYSkge1xyXG4gICAgdmFyIHRhZyA9IF9hLnRhZywgX2IgPSBfYS5wcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzID0gX2IgPT09IHZvaWQgMCA/IFtdIDogX2IsIF9jID0gX2EuYXR0cmlidXRlcywgYXR0cmlidXRlcyA9IF9jID09PSB2b2lkIDAgPyBbXSA6IF9jLCBfZCA9IF9hLmV2ZW50cywgZXZlbnRzID0gX2QgPT09IHZvaWQgMCA/IFtdIDogX2QsIF9lID0gX2EuY2hpbGRUeXBlLCBjaGlsZFR5cGUgPSBfZSA9PT0gdm9pZCAwID8gcmVnaXN0ZXJDdXN0b21FbGVtZW50XzEuQ3VzdG9tRWxlbWVudENoaWxkVHlwZS5ET0pPIDogX2UsIF9mID0gX2EucmVnaXN0cnlGYWN0b3J5LCByZWdpc3RyeUZhY3RvcnkgPSBfZiA9PT0gdm9pZCAwID8gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFJlZ2lzdHJ5XzEuZGVmYXVsdCgpOyB9IDogX2Y7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkge1xyXG4gICAgICAgIHRhcmdldC5wcm90b3R5cGUuX19jdXN0b21FbGVtZW50RGVzY3JpcHRvciA9IHtcclxuICAgICAgICAgICAgdGFnTmFtZTogdGFnLFxyXG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzLFxyXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLFxyXG4gICAgICAgICAgICBldmVudHM6IGV2ZW50cyxcclxuICAgICAgICAgICAgY2hpbGRUeXBlOiBjaGlsZFR5cGUsXHJcbiAgICAgICAgICAgIHJlZ2lzdHJ5RmFjdG9yeTogcmVnaXN0cnlGYWN0b3J5XHJcbiAgICAgICAgfTtcclxuICAgIH07XHJcbn1cclxuZXhwb3J0cy5jdXN0b21FbGVtZW50ID0gY3VzdG9tRWxlbWVudDtcclxuZXhwb3J0cy5kZWZhdWx0ID0gY3VzdG9tRWxlbWVudDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2N1c3RvbUVsZW1lbnQuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvY3VzdG9tRWxlbWVudC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgaGFuZGxlRGVjb3JhdG9yXzEgPSByZXF1aXJlKFwiLi9oYW5kbGVEZWNvcmF0b3JcIik7XHJcbi8qKlxyXG4gKiBEZWNvcmF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byByZWdpc3RlciBhIGZ1bmN0aW9uIGFzIGEgc3BlY2lmaWMgcHJvcGVydHkgZGlmZlxyXG4gKlxyXG4gKiBAcGFyYW0gcHJvcGVydHlOYW1lICBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb2Ygd2hpY2ggdGhlIGRpZmYgZnVuY3Rpb24gaXMgYXBwbGllZFxyXG4gKiBAcGFyYW0gZGlmZlR5cGUgICAgICBUaGUgZGlmZiB0eXBlLCBkZWZhdWx0IGlzIERpZmZUeXBlLkFVVE8uXHJcbiAqIEBwYXJhbSBkaWZmRnVuY3Rpb24gIEEgZGlmZiBmdW5jdGlvbiB0byBydW4gaWYgZGlmZlR5cGUgaWYgRGlmZlR5cGUuQ1VTVE9NXHJcbiAqL1xyXG5mdW5jdGlvbiBkaWZmUHJvcGVydHkocHJvcGVydHlOYW1lLCBkaWZmRnVuY3Rpb24sIHJlYWN0aW9uRnVuY3Rpb24pIHtcclxuICAgIHJldHVybiBoYW5kbGVEZWNvcmF0b3JfMS5oYW5kbGVEZWNvcmF0b3IoZnVuY3Rpb24gKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcclxuICAgICAgICB0YXJnZXQuYWRkRGVjb3JhdG9yKFwiZGlmZlByb3BlcnR5OlwiICsgcHJvcGVydHlOYW1lLCBkaWZmRnVuY3Rpb24uYmluZChudWxsKSk7XHJcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcigncmVnaXN0ZXJlZERpZmZQcm9wZXJ0eScsIHByb3BlcnR5TmFtZSk7XHJcbiAgICAgICAgaWYgKHJlYWN0aW9uRnVuY3Rpb24gfHwgcHJvcGVydHlLZXkpIHtcclxuICAgICAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcignZGlmZlJlYWN0aW9uJywge1xyXG4gICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXHJcbiAgICAgICAgICAgICAgICByZWFjdGlvbjogcHJvcGVydHlLZXkgPyB0YXJnZXRbcHJvcGVydHlLZXldIDogcmVhY3Rpb25GdW5jdGlvblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufVxyXG5leHBvcnRzLmRpZmZQcm9wZXJ0eSA9IGRpZmZQcm9wZXJ0eTtcclxuZXhwb3J0cy5kZWZhdWx0ID0gZGlmZlByb3BlcnR5O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvZGlmZlByb3BlcnR5LmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2RpZmZQcm9wZXJ0eS5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG4vKipcclxuICogR2VuZXJpYyBkZWNvcmF0b3IgaGFuZGxlciB0byB0YWtlIGNhcmUgb2Ygd2hldGhlciBvciBub3QgdGhlIGRlY29yYXRvciB3YXMgY2FsbGVkIGF0IHRoZSBjbGFzcyBsZXZlbFxyXG4gKiBvciB0aGUgbWV0aG9kIGxldmVsLlxyXG4gKlxyXG4gKiBAcGFyYW0gaGFuZGxlclxyXG4gKi9cclxuZnVuY3Rpb24gaGFuZGxlRGVjb3JhdG9yKGhhbmRsZXIpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIGhhbmRsZXIodGFyZ2V0LnByb3RvdHlwZSwgdW5kZWZpbmVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGhhbmRsZXIodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5leHBvcnRzLmhhbmRsZURlY29yYXRvciA9IGhhbmRsZURlY29yYXRvcjtcclxuZXhwb3J0cy5kZWZhdWx0ID0gaGFuZGxlRGVjb3JhdG9yO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaGFuZGxlRGVjb3JhdG9yLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2hhbmRsZURlY29yYXRvci5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgV2Vha01hcF8xID0gcmVxdWlyZShcIkBkb2pvL3NoaW0vV2Vha01hcFwiKTtcclxudmFyIGhhbmRsZURlY29yYXRvcl8xID0gcmVxdWlyZShcIi4vaGFuZGxlRGVjb3JhdG9yXCIpO1xyXG52YXIgYmVmb3JlUHJvcGVydGllc18xID0gcmVxdWlyZShcIi4vYmVmb3JlUHJvcGVydGllc1wiKTtcclxuLyoqXHJcbiAqIE1hcCBvZiBpbnN0YW5jZXMgYWdhaW5zdCByZWdpc3RlcmVkIGluamVjdG9ycy5cclxuICovXHJcbnZhciByZWdpc3RlcmVkSW5qZWN0b3JzTWFwID0gbmV3IFdlYWtNYXBfMS5kZWZhdWx0KCk7XHJcbi8qKlxyXG4gKiBEZWNvcmF0b3IgcmV0cmlldmVzIGFuIGluamVjdG9yIGZyb20gYW4gYXZhaWxhYmxlIHJlZ2lzdHJ5IHVzaW5nIHRoZSBuYW1lIGFuZFxyXG4gKiBjYWxscyB0aGUgYGdldFByb3BlcnRpZXNgIGZ1bmN0aW9uIHdpdGggdGhlIHBheWxvYWQgZnJvbSB0aGUgaW5qZWN0b3JcclxuICogYW5kIGN1cnJlbnQgcHJvcGVydGllcyB3aXRoIHRoZSB0aGUgaW5qZWN0ZWQgcHJvcGVydGllcyByZXR1cm5lZC5cclxuICpcclxuICogQHBhcmFtIEluamVjdENvbmZpZyB0aGUgaW5qZWN0IGNvbmZpZ3VyYXRpb25cclxuICovXHJcbmZ1bmN0aW9uIGluamVjdChfYSkge1xyXG4gICAgdmFyIG5hbWUgPSBfYS5uYW1lLCBnZXRQcm9wZXJ0aWVzID0gX2EuZ2V0UHJvcGVydGllcztcclxuICAgIHJldHVybiBoYW5kbGVEZWNvcmF0b3JfMS5oYW5kbGVEZWNvcmF0b3IoZnVuY3Rpb24gKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcclxuICAgICAgICBiZWZvcmVQcm9wZXJ0aWVzXzEuYmVmb3JlUHJvcGVydGllcyhmdW5jdGlvbiAocHJvcGVydGllcykge1xyXG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgICAgICB2YXIgaW5qZWN0b3JJdGVtID0gdGhpcy5yZWdpc3RyeS5nZXRJbmplY3RvcihuYW1lKTtcclxuICAgICAgICAgICAgaWYgKGluamVjdG9ySXRlbSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGluamVjdG9yID0gaW5qZWN0b3JJdGVtLmluamVjdG9yLCBpbnZhbGlkYXRvciA9IGluamVjdG9ySXRlbS5pbnZhbGlkYXRvcjtcclxuICAgICAgICAgICAgICAgIHZhciByZWdpc3RlcmVkSW5qZWN0b3JzID0gcmVnaXN0ZXJlZEluamVjdG9yc01hcC5nZXQodGhpcykgfHwgW107XHJcbiAgICAgICAgICAgICAgICBpZiAocmVnaXN0ZXJlZEluamVjdG9ycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICByZWdpc3RlcmVkSW5qZWN0b3JzTWFwLnNldCh0aGlzLCByZWdpc3RlcmVkSW5qZWN0b3JzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChyZWdpc3RlcmVkSW5qZWN0b3JzLmluZGV4T2YoaW5qZWN0b3JJdGVtKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm93bihpbnZhbGlkYXRvci5vbignaW52YWxpZGF0ZScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuaW52YWxpZGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICByZWdpc3RlcmVkSW5qZWN0b3JzLnB1c2goaW5qZWN0b3JJdGVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0aWVzKGluamVjdG9yKCksIHByb3BlcnRpZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkodGFyZ2V0KTtcclxuICAgIH0pO1xyXG59XHJcbmV4cG9ydHMuaW5qZWN0ID0gaW5qZWN0O1xyXG5leHBvcnRzLmRlZmF1bHQgPSBpbmplY3Q7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9pbmplY3QuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaW5qZWN0LmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciBSZWdpc3RyeV8xID0gcmVxdWlyZShcIi4vUmVnaXN0cnlcIik7XHJcbmZ1bmN0aW9uIGlzT2JqZWN0T3JBcnJheSh2YWx1ZSkge1xyXG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpO1xyXG59XHJcbmZ1bmN0aW9uIGFsd2F5cyhwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBjaGFuZ2VkOiB0cnVlLFxyXG4gICAgICAgIHZhbHVlOiBuZXdQcm9wZXJ0eVxyXG4gICAgfTtcclxufVxyXG5leHBvcnRzLmFsd2F5cyA9IGFsd2F5cztcclxuZnVuY3Rpb24gaWdub3JlKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGNoYW5nZWQ6IGZhbHNlLFxyXG4gICAgICAgIHZhbHVlOiBuZXdQcm9wZXJ0eVxyXG4gICAgfTtcclxufVxyXG5leHBvcnRzLmlnbm9yZSA9IGlnbm9yZTtcclxuZnVuY3Rpb24gcmVmZXJlbmNlKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGNoYW5nZWQ6IHByZXZpb3VzUHJvcGVydHkgIT09IG5ld1Byb3BlcnR5LFxyXG4gICAgICAgIHZhbHVlOiBuZXdQcm9wZXJ0eVxyXG4gICAgfTtcclxufVxyXG5leHBvcnRzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTtcclxuZnVuY3Rpb24gc2hhbGxvdyhwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSkge1xyXG4gICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcclxuICAgIHZhciB2YWxpZE9sZFByb3BlcnR5ID0gcHJldmlvdXNQcm9wZXJ0eSAmJiBpc09iamVjdE9yQXJyYXkocHJldmlvdXNQcm9wZXJ0eSk7XHJcbiAgICB2YXIgdmFsaWROZXdQcm9wZXJ0eSA9IG5ld1Byb3BlcnR5ICYmIGlzT2JqZWN0T3JBcnJheShuZXdQcm9wZXJ0eSk7XHJcbiAgICBpZiAoIXZhbGlkT2xkUHJvcGVydHkgfHwgIXZhbGlkTmV3UHJvcGVydHkpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBjaGFuZ2VkOiB0cnVlLFxyXG4gICAgICAgICAgICB2YWx1ZTogbmV3UHJvcGVydHlcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgdmFyIHByZXZpb3VzS2V5cyA9IE9iamVjdC5rZXlzKHByZXZpb3VzUHJvcGVydHkpO1xyXG4gICAgdmFyIG5ld0tleXMgPSBPYmplY3Qua2V5cyhuZXdQcm9wZXJ0eSk7XHJcbiAgICBpZiAocHJldmlvdXNLZXlzLmxlbmd0aCAhPT0gbmV3S2V5cy5sZW5ndGgpIHtcclxuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGNoYW5nZWQgPSBuZXdLZXlzLnNvbWUoZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3UHJvcGVydHlba2V5XSAhPT0gcHJldmlvdXNQcm9wZXJ0eVtrZXldO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBjaGFuZ2VkOiBjaGFuZ2VkLFxyXG4gICAgICAgIHZhbHVlOiBuZXdQcm9wZXJ0eVxyXG4gICAgfTtcclxufVxyXG5leHBvcnRzLnNoYWxsb3cgPSBzaGFsbG93O1xyXG5mdW5jdGlvbiBhdXRvKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KSB7XHJcbiAgICB2YXIgcmVzdWx0O1xyXG4gICAgaWYgKHR5cGVvZiBuZXdQcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIGlmIChuZXdQcm9wZXJ0eS5fdHlwZSA9PT0gUmVnaXN0cnlfMS5XSURHRVRfQkFTRV9UWVBFKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlZmVyZW5jZShwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXN1bHQgPSBpZ25vcmUocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGlzT2JqZWN0T3JBcnJheShuZXdQcm9wZXJ0eSkpIHtcclxuICAgICAgICByZXN1bHQgPSBzaGFsbG93KHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHJlc3VsdCA9IHJlZmVyZW5jZShwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcbmV4cG9ydHMuYXV0byA9IGF1dG87XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGlmZi5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvZGlmZi5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcclxudmFyIGxhbmdfMSA9IHJlcXVpcmUoXCJAZG9qby9jb3JlL2xhbmdcIik7XHJcbnZhciBjc3NUcmFuc2l0aW9uc18xID0gcmVxdWlyZShcIi4uL2FuaW1hdGlvbnMvY3NzVHJhbnNpdGlvbnNcIik7XHJcbnZhciBhZnRlclJlbmRlcl8xID0gcmVxdWlyZShcIi4vLi4vZGVjb3JhdG9ycy9hZnRlclJlbmRlclwiKTtcclxudmFyIGRfMSA9IHJlcXVpcmUoXCIuLy4uL2RcIik7XHJcbnZhciB2ZG9tXzEgPSByZXF1aXJlKFwiLi8uLi92ZG9tXCIpO1xyXG4vKipcclxuICogUmVwcmVzZW50cyB0aGUgYXR0YWNoIHN0YXRlIG9mIHRoZSBwcm9qZWN0b3JcclxuICovXHJcbnZhciBQcm9qZWN0b3JBdHRhY2hTdGF0ZTtcclxuKGZ1bmN0aW9uIChQcm9qZWN0b3JBdHRhY2hTdGF0ZSkge1xyXG4gICAgUHJvamVjdG9yQXR0YWNoU3RhdGVbUHJvamVjdG9yQXR0YWNoU3RhdGVbXCJBdHRhY2hlZFwiXSA9IDFdID0gXCJBdHRhY2hlZFwiO1xyXG4gICAgUHJvamVjdG9yQXR0YWNoU3RhdGVbUHJvamVjdG9yQXR0YWNoU3RhdGVbXCJEZXRhY2hlZFwiXSA9IDJdID0gXCJEZXRhY2hlZFwiO1xyXG59KShQcm9qZWN0b3JBdHRhY2hTdGF0ZSA9IGV4cG9ydHMuUHJvamVjdG9yQXR0YWNoU3RhdGUgfHwgKGV4cG9ydHMuUHJvamVjdG9yQXR0YWNoU3RhdGUgPSB7fSkpO1xyXG4vKipcclxuICogQXR0YWNoIHR5cGUgZm9yIHRoZSBwcm9qZWN0b3JcclxuICovXHJcbnZhciBBdHRhY2hUeXBlO1xyXG4oZnVuY3Rpb24gKEF0dGFjaFR5cGUpIHtcclxuICAgIEF0dGFjaFR5cGVbQXR0YWNoVHlwZVtcIkFwcGVuZFwiXSA9IDFdID0gXCJBcHBlbmRcIjtcclxuICAgIEF0dGFjaFR5cGVbQXR0YWNoVHlwZVtcIk1lcmdlXCJdID0gMl0gPSBcIk1lcmdlXCI7XHJcbn0pKEF0dGFjaFR5cGUgPSBleHBvcnRzLkF0dGFjaFR5cGUgfHwgKGV4cG9ydHMuQXR0YWNoVHlwZSA9IHt9KSk7XHJcbmZ1bmN0aW9uIFByb2plY3Rvck1peGluKEJhc2UpIHtcclxuICAgIHZhciBQcm9qZWN0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XHJcbiAgICAgICAgdHNsaWJfMS5fX2V4dGVuZHMoUHJvamVjdG9yLCBfc3VwZXIpO1xyXG4gICAgICAgIGZ1bmN0aW9uIFByb2plY3RvcigpIHtcclxuICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgdHNsaWJfMS5fX3NwcmVhZChhcmdzKSkgfHwgdGhpcztcclxuICAgICAgICAgICAgX3RoaXMuX3Jvb3QgPSBkb2N1bWVudC5ib2R5O1xyXG4gICAgICAgICAgICBfdGhpcy5fYXN5bmMgPSB0cnVlO1xyXG4gICAgICAgICAgICBfdGhpcy5fcHJvamVjdG9yUHJvcGVydGllcyA9IHt9O1xyXG4gICAgICAgICAgICBfdGhpcy5fcHJvamVjdGlvbk9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uczogY3NzVHJhbnNpdGlvbnNfMS5kZWZhdWx0XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIF90aGlzLnJvb3QgPSBkb2N1bWVudC5ib2R5O1xyXG4gICAgICAgICAgICBfdGhpcy5wcm9qZWN0b3JTdGF0ZSA9IFByb2plY3RvckF0dGFjaFN0YXRlLkRldGFjaGVkO1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFByb2plY3Rvci5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gKHJvb3QpIHtcclxuICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBBdHRhY2hUeXBlLkFwcGVuZCxcclxuICAgICAgICAgICAgICAgIHJvb3Q6IHJvb3RcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2F0dGFjaChvcHRpb25zKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIFByb2plY3Rvci5wcm90b3R5cGUubWVyZ2UgPSBmdW5jdGlvbiAocm9vdCkge1xyXG4gICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IEF0dGFjaFR5cGUuTWVyZ2UsXHJcbiAgICAgICAgICAgICAgICByb290OiByb290XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdHRhY2gob3B0aW9ucyk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUHJvamVjdG9yLnByb3RvdHlwZSwgXCJyb290XCIsIHtcclxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcm9vdDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAocm9vdCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvamVjdG9yU3RhdGUgPT09IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9qZWN0b3IgYWxyZWFkeSBhdHRhY2hlZCwgY2Fubm90IGNoYW5nZSByb290IGVsZW1lbnQnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuX3Jvb3QgPSByb290O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgICAgICB9KTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUHJvamVjdG9yLnByb3RvdHlwZSwgXCJhc3luY1wiLCB7XHJcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FzeW5jO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChhc3luYykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvamVjdG9yU3RhdGUgPT09IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9qZWN0b3IgYWxyZWFkeSBhdHRhY2hlZCwgY2Fubm90IGNoYW5nZSBhc3luYyBtb2RlJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hc3luYyA9IGFzeW5jO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgICAgICB9KTtcclxuICAgICAgICBQcm9qZWN0b3IucHJvdG90eXBlLnNhbmRib3ggPSBmdW5jdGlvbiAoZG9jKSB7XHJcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgICAgIGlmIChkb2MgPT09IHZvaWQgMCkgeyBkb2MgPSBkb2N1bWVudDsgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5wcm9qZWN0b3JTdGF0ZSA9PT0gUHJvamVjdG9yQXR0YWNoU3RhdGUuQXR0YWNoZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJvamVjdG9yIGFscmVhZHkgYXR0YWNoZWQsIGNhbm5vdCBjcmVhdGUgc2FuZGJveCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2FzeW5jID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHZhciBwcmV2aW91c1Jvb3QgPSB0aGlzLnJvb3Q7XHJcbiAgICAgICAgICAgIC8qIGZyZWUgdXAgdGhlIGRvY3VtZW50IGZyYWdtZW50IGZvciBHQyAqL1xyXG4gICAgICAgICAgICB0aGlzLm93bih7XHJcbiAgICAgICAgICAgICAgICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3Jvb3QgPSBwcmV2aW91c1Jvb3Q7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLl9hdHRhY2goe1xyXG4gICAgICAgICAgICAgICAgLyogRG9jdW1lbnRGcmFnbWVudCBpcyBub3QgYXNzaWduYWJsZSB0byBFbGVtZW50LCBidXQgcHJvdmlkZXMgZXZlcnl0aGluZyBuZWVkZWQgdG8gd29yayAqL1xyXG4gICAgICAgICAgICAgICAgcm9vdDogZG9jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcclxuICAgICAgICAgICAgICAgIHR5cGU6IEF0dGFjaFR5cGUuQXBwZW5kXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgUHJvamVjdG9yLnByb3RvdHlwZS5zZXRDaGlsZHJlbiA9IGZ1bmN0aW9uIChjaGlsZHJlbikge1xyXG4gICAgICAgICAgICB0aGlzLl9fc2V0Q2hpbGRyZW5fXyhjaGlsZHJlbik7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBQcm9qZWN0b3IucHJvdG90eXBlLnNldFByb3BlcnRpZXMgPSBmdW5jdGlvbiAocHJvcGVydGllcykge1xyXG4gICAgICAgICAgICB0aGlzLl9fc2V0UHJvcGVydGllc19fKHByb3BlcnRpZXMpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgUHJvamVjdG9yLnByb3RvdHlwZS5fX3NldFByb3BlcnRpZXNfXyA9IGZ1bmN0aW9uIChwcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9wcm9qZWN0b3JQcm9wZXJ0aWVzICYmIHRoaXMuX3Byb2plY3RvclByb3BlcnRpZXMucmVnaXN0cnkgIT09IHByb3BlcnRpZXMucmVnaXN0cnkpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9qZWN0b3JQcm9wZXJ0aWVzLnJlZ2lzdHJ5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvamVjdG9yUHJvcGVydGllcy5yZWdpc3RyeS5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcHJvamVjdG9yUHJvcGVydGllcyA9IGxhbmdfMS5hc3NpZ24oe30sIHByb3BlcnRpZXMpO1xyXG4gICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLl9fc2V0Q29yZVByb3BlcnRpZXNfXy5jYWxsKHRoaXMsIHsgYmluZDogdGhpcywgYmFzZVJlZ2lzdHJ5OiBwcm9wZXJ0aWVzLnJlZ2lzdHJ5IH0pO1xyXG4gICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLl9fc2V0UHJvcGVydGllc19fLmNhbGwodGhpcywgcHJvcGVydGllcyk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBQcm9qZWN0b3IucHJvdG90eXBlLnRvSHRtbCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucHJvamVjdG9yU3RhdGUgIT09IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkIHx8ICF0aGlzLl9wcm9qZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2plY3RvciBpcyBub3QgYXR0YWNoZWQsIGNhbm5vdCByZXR1cm4gYW4gSFRNTCBzdHJpbmcgb2YgcHJvamVjdGlvbi4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvamVjdGlvbi5kb21Ob2RlLmNoaWxkTm9kZXNbMF0ub3V0ZXJIVE1MO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgUHJvamVjdG9yLnByb3RvdHlwZS5hZnRlclJlbmRlciA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgdmFyIG5vZGUgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyB8fCByZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIG5vZGUgPSBkXzEudignc3BhbicsIHt9LCBbcmVzdWx0XSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBQcm9qZWN0b3IucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgUHJvamVjdG9yLnByb3RvdHlwZS5fYXR0YWNoID0gZnVuY3Rpb24gKF9hKSB7XHJcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgICAgIHZhciB0eXBlID0gX2EudHlwZSwgcm9vdCA9IF9hLnJvb3Q7XHJcbiAgICAgICAgICAgIGlmIChyb290KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3QgPSByb290O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9hdHRhY2hIYW5kbGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdHRhY2hIYW5kbGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5wcm9qZWN0b3JTdGF0ZSA9IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkO1xyXG4gICAgICAgICAgICB2YXIgaGFuZGxlID0ge1xyXG4gICAgICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5wcm9qZWN0b3JTdGF0ZSA9PT0gUHJvamVjdG9yQXR0YWNoU3RhdGUuQXR0YWNoZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3Byb2plY3Rpb24gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnByb2plY3RvclN0YXRlID0gUHJvamVjdG9yQXR0YWNoU3RhdGUuRGV0YWNoZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLm93bihoYW5kbGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9hdHRhY2hIYW5kbGUgPSBoYW5kbGU7XHJcbiAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rpb25PcHRpb25zID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgdGhpcy5fcHJvamVjdGlvbk9wdGlvbnMsIHsgc3luYzogIXRoaXMuX2FzeW5jIH0pO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgQXR0YWNoVHlwZS5BcHBlbmQ6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvamVjdGlvbiA9IHZkb21fMS5kb20uYXBwZW5kKHRoaXMucm9vdCwgdGhpcywgdGhpcy5fcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBBdHRhY2hUeXBlLk1lcmdlOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rpb24gPSB2ZG9tXzEuZG9tLm1lcmdlKHRoaXMucm9vdCwgdGhpcywgdGhpcy5fcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdHRhY2hIYW5kbGU7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0c2xpYl8xLl9fZGVjb3JhdGUoW1xyXG4gICAgICAgICAgICBhZnRlclJlbmRlcl8xLmFmdGVyUmVuZGVyKCksXHJcbiAgICAgICAgICAgIHRzbGliXzEuX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEZ1bmN0aW9uKSxcclxuICAgICAgICAgICAgdHNsaWJfMS5fX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW09iamVjdF0pLFxyXG4gICAgICAgICAgICB0c2xpYl8xLl9fbWV0YWRhdGEoXCJkZXNpZ246cmV0dXJudHlwZVwiLCB2b2lkIDApXHJcbiAgICAgICAgXSwgUHJvamVjdG9yLnByb3RvdHlwZSwgXCJhZnRlclJlbmRlclwiLCBudWxsKTtcclxuICAgICAgICByZXR1cm4gUHJvamVjdG9yO1xyXG4gICAgfShCYXNlKSk7XHJcbiAgICByZXR1cm4gUHJvamVjdG9yO1xyXG59XHJcbmV4cG9ydHMuUHJvamVjdG9yTWl4aW4gPSBQcm9qZWN0b3JNaXhpbjtcclxuZXhwb3J0cy5kZWZhdWx0ID0gUHJvamVjdG9yTWl4aW47XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvbWl4aW5zL1Byb2plY3Rvci5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvbWl4aW5zL1Byb2plY3Rvci5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcclxudmFyIEluamVjdG9yXzEgPSByZXF1aXJlKFwiLi8uLi9JbmplY3RvclwiKTtcclxudmFyIGluamVjdF8xID0gcmVxdWlyZShcIi4vLi4vZGVjb3JhdG9ycy9pbmplY3RcIik7XHJcbnZhciBoYW5kbGVEZWNvcmF0b3JfMSA9IHJlcXVpcmUoXCIuLy4uL2RlY29yYXRvcnMvaGFuZGxlRGVjb3JhdG9yXCIpO1xyXG52YXIgZGlmZlByb3BlcnR5XzEgPSByZXF1aXJlKFwiLi8uLi9kZWNvcmF0b3JzL2RpZmZQcm9wZXJ0eVwiKTtcclxudmFyIGRpZmZfMSA9IHJlcXVpcmUoXCIuLy4uL2RpZmZcIik7XHJcbnZhciBUSEVNRV9LRVkgPSAnIF9rZXknO1xyXG5leHBvcnRzLklOSkVDVEVEX1RIRU1FX0tFWSA9IFN5bWJvbCgndGhlbWUnKTtcclxuLyoqXHJcbiAqIERlY29yYXRvciBmb3IgYmFzZSBjc3MgY2xhc3Nlc1xyXG4gKi9cclxuZnVuY3Rpb24gdGhlbWUodGhlbWUpIHtcclxuICAgIHJldHVybiBoYW5kbGVEZWNvcmF0b3JfMS5oYW5kbGVEZWNvcmF0b3IoZnVuY3Rpb24gKHRhcmdldCkge1xyXG4gICAgICAgIHRhcmdldC5hZGREZWNvcmF0b3IoJ2Jhc2VUaGVtZUNsYXNzZXMnLCB0aGVtZSk7XHJcbiAgICB9KTtcclxufVxyXG5leHBvcnRzLnRoZW1lID0gdGhlbWU7XHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgcmV2ZXJzZSBsb29rdXAgZm9yIHRoZSBjbGFzc2VzIHBhc3NlZCBpbiB2aWEgdGhlIGB0aGVtZWAgZnVuY3Rpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSBjbGFzc2VzIFRoZSBiYXNlQ2xhc3NlcyBvYmplY3RcclxuICogQHJlcXVpcmVzXHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVUaGVtZUNsYXNzZXNMb29rdXAoY2xhc3Nlcykge1xyXG4gICAgcmV0dXJuIGNsYXNzZXMucmVkdWNlKGZ1bmN0aW9uIChjdXJyZW50Q2xhc3NOYW1lcywgYmFzZUNsYXNzKSB7XHJcbiAgICAgICAgT2JqZWN0LmtleXMoYmFzZUNsYXNzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAgICAgY3VycmVudENsYXNzTmFtZXNbYmFzZUNsYXNzW2tleV1dID0ga2V5O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBjdXJyZW50Q2xhc3NOYW1lcztcclxuICAgIH0sIHt9KTtcclxufVxyXG4vKipcclxuICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBpcyBnaXZlbiBhIHRoZW1lIGFuZCBhbiBvcHRpb25hbCByZWdpc3RyeSwgdGhlIHRoZW1lXHJcbiAqIGluamVjdG9yIGlzIGRlZmluZWQgYWdhaW5zdCB0aGUgcmVnaXN0cnksIHJldHVybmluZyB0aGUgdGhlbWUuXHJcbiAqXHJcbiAqIEBwYXJhbSB0aGVtZSB0aGUgdGhlbWUgdG8gc2V0XHJcbiAqIEBwYXJhbSB0aGVtZVJlZ2lzdHJ5IHJlZ2lzdHJ5IHRvIGRlZmluZSB0aGUgdGhlbWUgaW5qZWN0b3IgYWdhaW5zdC4gRGVmYXVsdHNcclxuICogdG8gdGhlIGdsb2JhbCByZWdpc3RyeVxyXG4gKlxyXG4gKiBAcmV0dXJucyB0aGUgdGhlbWUgaW5qZWN0b3IgdXNlZCB0byBzZXQgdGhlIHRoZW1lXHJcbiAqL1xyXG5mdW5jdGlvbiByZWdpc3RlclRoZW1lSW5qZWN0b3IodGhlbWUsIHRoZW1lUmVnaXN0cnkpIHtcclxuICAgIHZhciB0aGVtZUluamVjdG9yID0gbmV3IEluamVjdG9yXzEuSW5qZWN0b3IodGhlbWUpO1xyXG4gICAgdGhlbWVSZWdpc3RyeS5kZWZpbmVJbmplY3RvcihleHBvcnRzLklOSkVDVEVEX1RIRU1FX0tFWSwgZnVuY3Rpb24gKGludmFsaWRhdG9yKSB7XHJcbiAgICAgICAgdGhlbWVJbmplY3Rvci5zZXRJbnZhbGlkYXRvcihpbnZhbGlkYXRvcik7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoZW1lSW5qZWN0b3IuZ2V0KCk7IH07XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0aGVtZUluamVjdG9yO1xyXG59XHJcbmV4cG9ydHMucmVnaXN0ZXJUaGVtZUluamVjdG9yID0gcmVnaXN0ZXJUaGVtZUluamVjdG9yO1xyXG4vKipcclxuICogRnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgY2xhc3MgZGVjb3JhdGVkIHdpdGggd2l0aCBUaGVtZWQgZnVuY3Rpb25hbGl0eVxyXG4gKi9cclxuZnVuY3Rpb24gVGhlbWVkTWl4aW4oQmFzZSkge1xyXG4gICAgdmFyIFRoZW1lZCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcclxuICAgICAgICB0c2xpYl8xLl9fZXh0ZW5kcyhUaGVtZWQsIF9zdXBlcik7XHJcbiAgICAgICAgZnVuY3Rpb24gVGhlbWVkKCkge1xyXG4gICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIFJlZ2lzdGVyZWQgYmFzZSB0aGVtZSBrZXlzXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBfdGhpcy5fcmVnaXN0ZXJlZEJhc2VUaGVtZUtleXMgPSBbXTtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEluZGljYXRlcyBpZiBjbGFzc2VzIG1ldGEgZGF0YSBuZWVkIHRvIGJlIGNhbGN1bGF0ZWQuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBfdGhpcy5fcmVjYWxjdWxhdGVDbGFzc2VzID0gdHJ1ZTtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIExvYWRlZCB0aGVtZVxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgX3RoaXMuX3RoZW1lID0ge307XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgVGhlbWVkLnByb3RvdHlwZS50aGVtZSA9IGZ1bmN0aW9uIChjbGFzc2VzKSB7XHJcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZWNhbGN1bGF0ZUNsYXNzZXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlY2FsY3VsYXRlVGhlbWVDbGFzc2VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2xhc3NlcykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc2VzLm1hcChmdW5jdGlvbiAoY2xhc3NOYW1lKSB7IHJldHVybiBfdGhpcy5fZ2V0VGhlbWVDbGFzcyhjbGFzc05hbWUpOyB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0VGhlbWVDbGFzcyhjbGFzc2VzKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEZ1bmN0aW9uIGZpcmVkIHdoZW4gYHRoZW1lYCBvciBgZXh0cmFDbGFzc2VzYCBhcmUgY2hhbmdlZC5cclxuICAgICAgICAgKi9cclxuICAgICAgICBUaGVtZWQucHJvdG90eXBlLm9uUHJvcGVydGllc0NoYW5nZWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlY2FsY3VsYXRlQ2xhc3NlcyA9IHRydWU7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBUaGVtZWQucHJvdG90eXBlLl9nZXRUaGVtZUNsYXNzID0gZnVuY3Rpb24gKGNsYXNzTmFtZSkge1xyXG4gICAgICAgICAgICBpZiAoY2xhc3NOYW1lID09PSB1bmRlZmluZWQgfHwgY2xhc3NOYW1lID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBleHRyYUNsYXNzZXMgPSB0aGlzLnByb3BlcnRpZXMuZXh0cmFDbGFzc2VzIHx8IHt9O1xyXG4gICAgICAgICAgICB2YXIgdGhlbWVDbGFzc05hbWUgPSB0aGlzLl9iYXNlVGhlbWVDbGFzc2VzUmV2ZXJzZUxvb2t1cFtjbGFzc05hbWVdO1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0Q2xhc3NOYW1lcyA9IFtdO1xyXG4gICAgICAgICAgICBpZiAoIXRoZW1lQ2xhc3NOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJDbGFzcyBuYW1lOiAnXCIgKyBjbGFzc05hbWUgKyBcIicgbm90IGZvdW5kIGluIHRoZW1lXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGV4dHJhQ2xhc3Nlc1t0aGVtZUNsYXNzTmFtZV0pIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdENsYXNzTmFtZXMucHVzaChleHRyYUNsYXNzZXNbdGhlbWVDbGFzc05hbWVdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5fdGhlbWVbdGhlbWVDbGFzc05hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRDbGFzc05hbWVzLnB1c2godGhpcy5fdGhlbWVbdGhlbWVDbGFzc05hbWVdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdENsYXNzTmFtZXMucHVzaCh0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lW3RoZW1lQ2xhc3NOYW1lXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENsYXNzTmFtZXMuam9pbignICcpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgVGhlbWVkLnByb3RvdHlwZS5fcmVjYWxjdWxhdGVUaGVtZUNsYXNzZXMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgICAgIHZhciBfYSA9IHRoaXMucHJvcGVydGllcy50aGVtZSwgdGhlbWUgPSBfYSA9PT0gdm9pZCAwID8ge30gOiBfYTtcclxuICAgICAgICAgICAgdmFyIGJhc2VUaGVtZXMgPSB0aGlzLmdldERlY29yYXRvcignYmFzZVRoZW1lQ2xhc3NlcycpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3JlZ2lzdGVyZWRCYXNlVGhlbWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyZWRCYXNlVGhlbWUgPSBiYXNlVGhlbWVzLnJlZHVjZShmdW5jdGlvbiAoZmluYWxCYXNlVGhlbWUsIGJhc2VUaGVtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBfYSA9IFRIRU1FX0tFWSwga2V5ID0gYmFzZVRoZW1lW19hXSwgY2xhc3NlcyA9IHRzbGliXzEuX19yZXN0KGJhc2VUaGVtZSwgW3R5cGVvZiBfYSA9PT0gXCJzeW1ib2xcIiA/IF9hIDogX2EgKyBcIlwiXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3JlZ2lzdGVyZWRCYXNlVGhlbWVLZXlzLnB1c2goa2V5KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHNsaWJfMS5fX2Fzc2lnbih7fSwgZmluYWxCYXNlVGhlbWUsIGNsYXNzZXMpO1xyXG4gICAgICAgICAgICAgICAgfSwge30pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYmFzZVRoZW1lQ2xhc3Nlc1JldmVyc2VMb29rdXAgPSBjcmVhdGVUaGVtZUNsYXNzZXNMb29rdXAoYmFzZVRoZW1lcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fdGhlbWUgPSB0aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lS2V5cy5yZWR1Y2UoZnVuY3Rpb24gKGJhc2VUaGVtZSwgdGhlbWVLZXkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0c2xpYl8xLl9fYXNzaWduKHt9LCBiYXNlVGhlbWUsIHRoZW1lW3RoZW1lS2V5XSk7XHJcbiAgICAgICAgICAgIH0sIHt9KTtcclxuICAgICAgICAgICAgdGhpcy5fcmVjYWxjdWxhdGVDbGFzc2VzID0gZmFsc2U7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0c2xpYl8xLl9fZGVjb3JhdGUoW1xyXG4gICAgICAgICAgICBkaWZmUHJvcGVydHlfMS5kaWZmUHJvcGVydHkoJ3RoZW1lJywgZGlmZl8xLnNoYWxsb3cpLFxyXG4gICAgICAgICAgICBkaWZmUHJvcGVydHlfMS5kaWZmUHJvcGVydHkoJ2V4dHJhQ2xhc3NlcycsIGRpZmZfMS5zaGFsbG93KSxcclxuICAgICAgICAgICAgdHNsaWJfMS5fX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxyXG4gICAgICAgICAgICB0c2xpYl8xLl9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbXSksXHJcbiAgICAgICAgICAgIHRzbGliXzEuX19tZXRhZGF0YShcImRlc2lnbjpyZXR1cm50eXBlXCIsIHZvaWQgMClcclxuICAgICAgICBdLCBUaGVtZWQucHJvdG90eXBlLCBcIm9uUHJvcGVydGllc0NoYW5nZWRcIiwgbnVsbCk7XHJcbiAgICAgICAgVGhlbWVkID0gdHNsaWJfMS5fX2RlY29yYXRlKFtcclxuICAgICAgICAgICAgaW5qZWN0XzEuaW5qZWN0KHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGV4cG9ydHMuSU5KRUNURURfVEhFTUVfS0VZLFxyXG4gICAgICAgICAgICAgICAgZ2V0UHJvcGVydGllczogZnVuY3Rpb24gKHRoZW1lLCBwcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9wZXJ0aWVzLnRoZW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHRoZW1lOiB0aGVtZSB9O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgXSwgVGhlbWVkKTtcclxuICAgICAgICByZXR1cm4gVGhlbWVkO1xyXG4gICAgfShCYXNlKSk7XHJcbiAgICByZXR1cm4gVGhlbWVkO1xyXG59XHJcbmV4cG9ydHMuVGhlbWVkTWl4aW4gPSBUaGVtZWRNaXhpbjtcclxuZXhwb3J0cy5kZWZhdWx0ID0gVGhlbWVkTWl4aW47XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvbWl4aW5zL1RoZW1lZC5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvbWl4aW5zL1RoZW1lZC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcclxudmFyIFdpZGdldEJhc2VfMSA9IHJlcXVpcmUoXCIuL1dpZGdldEJhc2VcIik7XHJcbnZhciBQcm9qZWN0b3JfMSA9IHJlcXVpcmUoXCIuL21peGlucy9Qcm9qZWN0b3JcIik7XHJcbnZhciBhcnJheV8xID0gcmVxdWlyZShcIkBkb2pvL3NoaW0vYXJyYXlcIik7XHJcbnZhciBkXzEgPSByZXF1aXJlKFwiLi9kXCIpO1xyXG52YXIgZ2xvYmFsXzEgPSByZXF1aXJlKFwiQGRvam8vc2hpbS9nbG9iYWxcIik7XHJcbnZhciBUaGVtZWRfMSA9IHJlcXVpcmUoXCIuL21peGlucy9UaGVtZWRcIik7XHJcbnZhciBhbHdheXNSZW5kZXJfMSA9IHJlcXVpcmUoXCIuL2RlY29yYXRvcnMvYWx3YXlzUmVuZGVyXCIpO1xyXG52YXIgQ3VzdG9tRWxlbWVudENoaWxkVHlwZTtcclxuKGZ1bmN0aW9uIChDdXN0b21FbGVtZW50Q2hpbGRUeXBlKSB7XHJcbiAgICBDdXN0b21FbGVtZW50Q2hpbGRUeXBlW1wiRE9KT1wiXSA9IFwiRE9KT1wiO1xyXG4gICAgQ3VzdG9tRWxlbWVudENoaWxkVHlwZVtcIk5PREVcIl0gPSBcIk5PREVcIjtcclxuICAgIEN1c3RvbUVsZW1lbnRDaGlsZFR5cGVbXCJURVhUXCJdID0gXCJURVhUXCI7XHJcbn0pKEN1c3RvbUVsZW1lbnRDaGlsZFR5cGUgPSBleHBvcnRzLkN1c3RvbUVsZW1lbnRDaGlsZFR5cGUgfHwgKGV4cG9ydHMuQ3VzdG9tRWxlbWVudENoaWxkVHlwZSA9IHt9KSk7XHJcbmZ1bmN0aW9uIERvbVRvV2lkZ2V0V3JhcHBlcihkb21Ob2RlKSB7XHJcbiAgICB2YXIgRG9tVG9XaWRnZXRXcmFwcGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xyXG4gICAgICAgIHRzbGliXzEuX19leHRlbmRzKERvbVRvV2lkZ2V0V3JhcHBlciwgX3N1cGVyKTtcclxuICAgICAgICBmdW5jdGlvbiBEb21Ub1dpZGdldFdyYXBwZXIoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgRG9tVG9XaWRnZXRXcmFwcGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gT2JqZWN0LmtleXModGhpcy5wcm9wZXJ0aWVzKS5yZWR1Y2UoZnVuY3Rpb24gKHByb3BzLCBrZXkpIHtcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IF90aGlzLnByb3BlcnRpZXNba2V5XTtcclxuICAgICAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZignb24nKSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9IFwiX19cIiArIGtleTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHByb3BzW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwcm9wcztcclxuICAgICAgICAgICAgfSwge30pO1xyXG4gICAgICAgICAgICByZXR1cm4gZF8xLmRvbSh7IG5vZGU6IGRvbU5vZGUsIHByb3BzOiBwcm9wZXJ0aWVzLCBkaWZmVHlwZTogJ2RvbScgfSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9tVG9XaWRnZXRXcmFwcGVyLCBcImRvbU5vZGVcIiwge1xyXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkb21Ob2RlO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgICAgICB9KTtcclxuICAgICAgICBEb21Ub1dpZGdldFdyYXBwZXIgPSB0c2xpYl8xLl9fZGVjb3JhdGUoW1xyXG4gICAgICAgICAgICBhbHdheXNSZW5kZXJfMS5hbHdheXNSZW5kZXIoKVxyXG4gICAgICAgIF0sIERvbVRvV2lkZ2V0V3JhcHBlcik7XHJcbiAgICAgICAgcmV0dXJuIERvbVRvV2lkZ2V0V3JhcHBlcjtcclxuICAgIH0oV2lkZ2V0QmFzZV8xLldpZGdldEJhc2UpKTtcclxuICAgIHJldHVybiBEb21Ub1dpZGdldFdyYXBwZXI7XHJcbn1cclxuZXhwb3J0cy5Eb21Ub1dpZGdldFdyYXBwZXIgPSBEb21Ub1dpZGdldFdyYXBwZXI7XHJcbmZ1bmN0aW9uIGNyZWF0ZShkZXNjcmlwdG9yLCBXaWRnZXRDb25zdHJ1Y3Rvcikge1xyXG4gICAgdmFyIGF0dHJpYnV0ZXMgPSBkZXNjcmlwdG9yLmF0dHJpYnV0ZXMsIGNoaWxkVHlwZSA9IGRlc2NyaXB0b3IuY2hpbGRUeXBlLCByZWdpc3RyeUZhY3RvcnkgPSBkZXNjcmlwdG9yLnJlZ2lzdHJ5RmFjdG9yeTtcclxuICAgIHZhciBhdHRyaWJ1dGVNYXAgPSB7fTtcclxuICAgIGF0dHJpYnV0ZXMuZm9yRWFjaChmdW5jdGlvbiAocHJvcGVydHlOYW1lKSB7XHJcbiAgICAgICAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eU5hbWUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBhdHRyaWJ1dGVNYXBbYXR0cmlidXRlTmFtZV0gPSBwcm9wZXJ0eU5hbWU7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XHJcbiAgICAgICAgdHNsaWJfMS5fX2V4dGVuZHMoY2xhc3NfMSwgX3N1cGVyKTtcclxuICAgICAgICBmdW5jdGlvbiBjbGFzc18xKCkge1xyXG4gICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcclxuICAgICAgICAgICAgX3RoaXMuX3Byb3BlcnRpZXMgPSB7fTtcclxuICAgICAgICAgICAgX3RoaXMuX2NoaWxkcmVuID0gW107XHJcbiAgICAgICAgICAgIF90aGlzLl9ldmVudFByb3BlcnRpZXMgPSB7fTtcclxuICAgICAgICAgICAgX3RoaXMuX2luaXRpYWxpc2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgY2xhc3NfMS5wcm90b3R5cGUuY29ubmVjdGVkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9pbml0aWFsaXNlZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBkb21Qcm9wZXJ0aWVzID0ge307XHJcbiAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVzID0gZGVzY3JpcHRvci5hdHRyaWJ1dGVzLCBwcm9wZXJ0aWVzID0gZGVzY3JpcHRvci5wcm9wZXJ0aWVzLCBldmVudHMgPSBkZXNjcmlwdG9yLmV2ZW50cztcclxuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHRzbGliXzEuX19hc3NpZ24oe30sIHRoaXMuX3Byb3BlcnRpZXMsIHRoaXMuX2F0dHJpYnV0ZXNUb1Byb3BlcnRpZXMoYXR0cmlidXRlcykpO1xyXG4gICAgICAgICAgICB0c2xpYl8xLl9fc3ByZWFkKGF0dHJpYnV0ZXMsIHByb3BlcnRpZXMpLmZvckVhY2goZnVuY3Rpb24gKHByb3BlcnR5TmFtZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gX3RoaXNbcHJvcGVydHlOYW1lXTtcclxuICAgICAgICAgICAgICAgIHZhciBmaWx0ZXJlZFByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZS5yZXBsYWNlKC9eb24vLCAnX18nKTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlcmVkUHJvcGVydHlOYW1lICE9PSBwcm9wZXJ0eU5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBkb21Qcm9wZXJ0aWVzW2ZpbHRlcmVkUHJvcGVydHlOYW1lXSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5fZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIF90aGlzLl9zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkb21Qcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5fZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsgfSxcclxuICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gX3RoaXMuX3NldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUpOyB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKHByb3BlcnR5TmFtZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGV2ZW50TmFtZSA9IHByb3BlcnR5TmFtZS5yZXBsYWNlKC9eb24vLCAnJykudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgIHZhciBmaWx0ZXJlZFByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZS5yZXBsYWNlKC9eb24vLCAnX19vbicpO1xyXG4gICAgICAgICAgICAgICAgZG9tUHJvcGVydGllc1tmaWx0ZXJlZFByb3BlcnR5TmFtZV0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5fZ2V0RXZlbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOyB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBfdGhpcy5fc2V0RXZlbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKTsgfVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9ldmVudFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBldmVudENhbGxiYWNrID0gX3RoaXMuX2dldEV2ZW50UHJvcGVydHkocHJvcGVydHlOYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV2ZW50Q2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRDYWxsYmFjay5hcHBseSh2b2lkIDAsIHRzbGliXzEuX19zcHJlYWQoYXJncykpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlczogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDogYXJnc1xyXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCBkb21Qcm9wZXJ0aWVzKTtcclxuICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gY2hpbGRUeXBlID09PSBDdXN0b21FbGVtZW50Q2hpbGRUeXBlLlRFWFQgPyB0aGlzLmNoaWxkTm9kZXMgOiB0aGlzLmNoaWxkcmVuO1xyXG4gICAgICAgICAgICBhcnJheV8xLmZyb20oY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkVHlwZSA9PT0gQ3VzdG9tRWxlbWVudENoaWxkVHlwZS5ET0pPKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGROb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2Rvam8tY2UtcmVuZGVyJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuX3JlbmRlcigpOyB9KTtcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZE5vZGUuYWRkRXZlbnRMaXN0ZW5lcignZG9qby1jZS1jb25uZWN0ZWQnLCBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5fcmVuZGVyKCk7IH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9jaGlsZHJlbi5wdXNoKERvbVRvV2lkZ2V0V3JhcHBlcihjaGlsZE5vZGUpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9jaGlsZHJlbi5wdXNoKGRfMS5kb20oeyBub2RlOiBjaGlsZE5vZGUsIGRpZmZUeXBlOiAnZG9tJyB9KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2Rvam8tY2UtY29ubmVjdGVkJywgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIF90aGlzLl9jaGlsZENvbm5lY3RlZChlKTsgfSk7XHJcbiAgICAgICAgICAgIHZhciB3aWRnZXRQcm9wZXJ0aWVzID0gdGhpcy5fcHJvcGVydGllcztcclxuICAgICAgICAgICAgdmFyIHJlbmRlckNoaWxkcmVuID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuX19jaGlsZHJlbl9fKCk7IH07XHJcbiAgICAgICAgICAgIHZhciBXcmFwcGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xyXG4gICAgICAgICAgICAgICAgdHNsaWJfMS5fX2V4dGVuZHMoY2xhc3NfMiwgX3N1cGVyKTtcclxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNsYXNzXzIoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2xhc3NfMi5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkXzEudyhXaWRnZXRDb25zdHJ1Y3Rvciwgd2lkZ2V0UHJvcGVydGllcywgcmVuZGVyQ2hpbGRyZW4oKSk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzXzI7XHJcbiAgICAgICAgICAgIH0oV2lkZ2V0QmFzZV8xLldpZGdldEJhc2UpKTtcclxuICAgICAgICAgICAgdmFyIHJlZ2lzdHJ5ID0gcmVnaXN0cnlGYWN0b3J5KCk7XHJcbiAgICAgICAgICAgIHZhciB0aGVtZUNvbnRleHQgPSBUaGVtZWRfMS5yZWdpc3RlclRoZW1lSW5qZWN0b3IodGhpcy5fZ2V0VGhlbWUoKSwgcmVnaXN0cnkpO1xyXG4gICAgICAgICAgICBnbG9iYWxfMS5kZWZhdWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2Rvam8tdGhlbWUtc2V0JywgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhlbWVDb250ZXh0LnNldChfdGhpcy5fZ2V0VGhlbWUoKSk7IH0pO1xyXG4gICAgICAgICAgICB2YXIgUHJvamVjdG9yID0gUHJvamVjdG9yXzEuUHJvamVjdG9yTWl4aW4oV3JhcHBlcik7XHJcbiAgICAgICAgICAgIHRoaXMuX3Byb2plY3RvciA9IG5ldyBQcm9qZWN0b3IoKTtcclxuICAgICAgICAgICAgdGhpcy5fcHJvamVjdG9yLnNldFByb3BlcnRpZXMoeyByZWdpc3RyeTogcmVnaXN0cnkgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rvci5hcHBlbmQodGhpcyk7XHJcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxpc2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnZG9qby1jZS1jb25uZWN0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgZGV0YWlsOiB0aGlzXHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNsYXNzXzEucHJvdG90eXBlLl9nZXRUaGVtZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKGdsb2JhbF8xLmRlZmF1bHQgJiYgZ2xvYmFsXzEuZGVmYXVsdC5kb2pvY2UgJiYgZ2xvYmFsXzEuZGVmYXVsdC5kb2pvY2UudGhlbWUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBnbG9iYWxfMS5kZWZhdWx0LmRvam9jZS50aGVtZXNbZ2xvYmFsXzEuZGVmYXVsdC5kb2pvY2UudGhlbWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICBjbGFzc18xLnByb3RvdHlwZS5fY2hpbGRDb25uZWN0ZWQgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgICAgICB2YXIgbm9kZSA9IGUuZGV0YWlsO1xyXG4gICAgICAgICAgICBpZiAobm9kZS5wYXJlbnROb2RlID09PSB0aGlzKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZXhpc3RzID0gdGhpcy5fY2hpbGRyZW4uc29tZShmdW5jdGlvbiAoY2hpbGQpIHsgcmV0dXJuIGNoaWxkLmRvbU5vZGUgPT09IG5vZGU7IH0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFleGlzdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2Rvam8tY2UtcmVuZGVyJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuX3JlbmRlcigpOyB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGlsZHJlbi5wdXNoKERvbVRvV2lkZ2V0V3JhcHBlcihub2RlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIGNsYXNzXzEucHJvdG90eXBlLl9yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9wcm9qZWN0b3IpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rvci5pbnZhbGlkYXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdkb2pvLWNlLXJlbmRlcicsIHtcclxuICAgICAgICAgICAgICAgICAgICBidWJibGVzOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHRoaXNcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY2xhc3NfMS5wcm90b3R5cGUuX19wcm9wZXJ0aWVzX18gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl9wcm9wZXJ0aWVzLCB0aGlzLl9ldmVudFByb3BlcnRpZXMpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgY2xhc3NfMS5wcm90b3R5cGUuX19jaGlsZHJlbl9fID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoY2hpbGRUeXBlID09PSBDdXN0b21FbGVtZW50Q2hpbGRUeXBlLkRPSk8pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jaGlsZHJlbi5maWx0ZXIoZnVuY3Rpb24gKENoaWxkKSB7IHJldHVybiBDaGlsZC5kb21Ob2RlLmlzV2lkZ2V0OyB9KS5tYXAoZnVuY3Rpb24gKENoaWxkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRvbU5vZGUgPSBDaGlsZC5kb21Ob2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkXzEudyhDaGlsZCwgdHNsaWJfMS5fX2Fzc2lnbih7fSwgZG9tTm9kZS5fX3Byb3BlcnRpZXNfXygpKSwgdHNsaWJfMS5fX3NwcmVhZChkb21Ob2RlLl9fY2hpbGRyZW5fXygpKSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jaGlsZHJlbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY2xhc3NfMS5wcm90b3R5cGUuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24gKG5hbWUsIG9sZFZhbHVlLCB2YWx1ZSkge1xyXG4gICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gYXR0cmlidXRlTWFwW25hbWVdO1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNsYXNzXzEucHJvdG90eXBlLl9zZXRFdmVudFByb3BlcnR5ID0gZnVuY3Rpb24gKHByb3BlcnR5TmFtZSwgdmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fZXZlbnRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNsYXNzXzEucHJvdG90eXBlLl9nZXRFdmVudFByb3BlcnR5ID0gZnVuY3Rpb24gKHByb3BlcnR5TmFtZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XHJcbiAgICAgICAgfTtcclxuICAgICAgICBjbGFzc18xLnByb3RvdHlwZS5fc2V0UHJvcGVydHkgPSBmdW5jdGlvbiAocHJvcGVydHlOYW1lLCB2YWx1ZSkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZVtXaWRnZXRCYXNlXzEubm9CaW5kXSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcigpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgY2xhc3NfMS5wcm90b3R5cGUuX2dldFByb3BlcnR5ID0gZnVuY3Rpb24gKHByb3BlcnR5TmFtZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgY2xhc3NfMS5wcm90b3R5cGUuX2F0dHJpYnV0ZXNUb1Byb3BlcnRpZXMgPSBmdW5jdGlvbiAoYXR0cmlidXRlcykge1xyXG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlcy5yZWR1Y2UoZnVuY3Rpb24gKHByb3BlcnRpZXMsIHByb3BlcnR5TmFtZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eU5hbWUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IF90aGlzLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7XHJcbiAgICAgICAgICAgIH0sIHt9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGFzc18xLCBcIm9ic2VydmVkQXR0cmlidXRlc1wiLCB7XHJcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGF0dHJpYnV0ZU1hcCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGFzc18xLnByb3RvdHlwZSwgXCJpc1dpZGdldFwiLCB7XHJcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBjbGFzc18xO1xyXG4gICAgfShIVE1MRWxlbWVudCkpO1xyXG59XHJcbmV4cG9ydHMuY3JlYXRlID0gY3JlYXRlO1xyXG5mdW5jdGlvbiByZWdpc3RlcihXaWRnZXRDb25zdHJ1Y3Rvcikge1xyXG4gICAgdmFyIGRlc2NyaXB0b3IgPSBXaWRnZXRDb25zdHJ1Y3Rvci5wcm90b3R5cGUgJiYgV2lkZ2V0Q29uc3RydWN0b3IucHJvdG90eXBlLl9fY3VzdG9tRWxlbWVudERlc2NyaXB0b3I7XHJcbiAgICBpZiAoIWRlc2NyaXB0b3IpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgZGVzY3JpcHRvciBmb3IgQ3VzdG9tIEVsZW1lbnQsIGhhdmUgeW91IGFkZGVkIHRoZSBAY3VzdG9tRWxlbWVudCBkZWNvcmF0b3IgdG8geW91ciBXaWRnZXQ/Jyk7XHJcbiAgICB9XHJcbiAgICBnbG9iYWxfMS5kZWZhdWx0LmN1c3RvbUVsZW1lbnRzLmRlZmluZShkZXNjcmlwdG9yLnRhZ05hbWUsIGNyZWF0ZShkZXNjcmlwdG9yLCBXaWRnZXRDb25zdHJ1Y3RvcikpO1xyXG59XHJcbmV4cG9ydHMucmVnaXN0ZXIgPSByZWdpc3RlcjtcclxuZXhwb3J0cy5kZWZhdWx0ID0gcmVnaXN0ZXI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2lkZ2V0LWNvcmUvcmVnaXN0ZXJDdXN0b21FbGVtZW50LmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS9yZWdpc3RlckN1c3RvbUVsZW1lbnQuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XHJcbnZhciBnbG9iYWxfMSA9IHJlcXVpcmUoXCJAZG9qby9zaGltL2dsb2JhbFwiKTtcclxudmFyIGFycmF5XzEgPSByZXF1aXJlKFwiQGRvam8vc2hpbS9hcnJheVwiKTtcclxudmFyIGRfMSA9IHJlcXVpcmUoXCIuL2RcIik7XHJcbnZhciBSZWdpc3RyeV8xID0gcmVxdWlyZShcIi4vUmVnaXN0cnlcIik7XHJcbnZhciBXZWFrTWFwXzEgPSByZXF1aXJlKFwiQGRvam8vc2hpbS9XZWFrTWFwXCIpO1xyXG52YXIgTkFNRVNQQUNFX1czID0gJ2h0dHA6Ly93d3cudzMub3JnLyc7XHJcbnZhciBOQU1FU1BBQ0VfU1ZHID0gTkFNRVNQQUNFX1czICsgJzIwMDAvc3ZnJztcclxudmFyIE5BTUVTUEFDRV9YTElOSyA9IE5BTUVTUEFDRV9XMyArICcxOTk5L3hsaW5rJztcclxudmFyIGVtcHR5QXJyYXkgPSBbXTtcclxuZXhwb3J0cy53aWRnZXRJbnN0YW5jZU1hcCA9IG5ldyBXZWFrTWFwXzEuZGVmYXVsdCgpO1xyXG52YXIgaW5zdGFuY2VNYXAgPSBuZXcgV2Vha01hcF8xLmRlZmF1bHQoKTtcclxudmFyIHByb2plY3RvclN0YXRlTWFwID0gbmV3IFdlYWtNYXBfMS5kZWZhdWx0KCk7XHJcbmZ1bmN0aW9uIHNhbWUoZG5vZGUxLCBkbm9kZTIpIHtcclxuICAgIGlmIChkXzEuaXNWTm9kZShkbm9kZTEpICYmIGRfMS5pc1ZOb2RlKGRub2RlMikpIHtcclxuICAgICAgICBpZiAoZF8xLmlzRG9tVk5vZGUoZG5vZGUxKSB8fCBkXzEuaXNEb21WTm9kZShkbm9kZTIpKSB7XHJcbiAgICAgICAgICAgIGlmIChkbm9kZTEuZG9tTm9kZSAhPT0gZG5vZGUyLmRvbU5vZGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZG5vZGUxLnRhZyAhPT0gZG5vZGUyLnRhZykge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkbm9kZTEucHJvcGVydGllcy5rZXkgIT09IGRub2RlMi5wcm9wZXJ0aWVzLmtleSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZF8xLmlzV05vZGUoZG5vZGUxKSAmJiBkXzEuaXNXTm9kZShkbm9kZTIpKSB7XHJcbiAgICAgICAgaWYgKGRub2RlMS5pbnN0YW5jZSA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBkbm9kZTIud2lkZ2V0Q29uc3RydWN0b3IgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRub2RlMS53aWRnZXRDb25zdHJ1Y3RvciAhPT0gZG5vZGUyLndpZGdldENvbnN0cnVjdG9yKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRub2RlMS5wcm9wZXJ0aWVzLmtleSAhPT0gZG5vZGUyLnByb3BlcnRpZXMua2V5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn1cclxudmFyIG1pc3NpbmdUcmFuc2l0aW9uID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdQcm92aWRlIGEgdHJhbnNpdGlvbnMgb2JqZWN0IHRvIHRoZSBwcm9qZWN0aW9uT3B0aW9ucyB0byBkbyBhbmltYXRpb25zJyk7XHJcbn07XHJcbmZ1bmN0aW9uIGdldFByb2plY3Rpb25PcHRpb25zKHByb2plY3Rvck9wdGlvbnMsIHByb2plY3Rvckluc3RhbmNlKSB7XHJcbiAgICB2YXIgZGVmYXVsdHMgPSB7XHJcbiAgICAgICAgbmFtZXNwYWNlOiB1bmRlZmluZWQsXHJcbiAgICAgICAgc3R5bGVBcHBseWVyOiBmdW5jdGlvbiAoZG9tTm9kZSwgc3R5bGVOYW1lLCB2YWx1ZSkge1xyXG4gICAgICAgICAgICBkb21Ob2RlLnN0eWxlW3N0eWxlTmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRyYW5zaXRpb25zOiB7XHJcbiAgICAgICAgICAgIGVudGVyOiBtaXNzaW5nVHJhbnNpdGlvbixcclxuICAgICAgICAgICAgZXhpdDogbWlzc2luZ1RyYW5zaXRpb25cclxuICAgICAgICB9LFxyXG4gICAgICAgIGRlcHRoOiAwLFxyXG4gICAgICAgIG1lcmdlOiBmYWxzZSxcclxuICAgICAgICBzeW5jOiBmYWxzZSxcclxuICAgICAgICBwcm9qZWN0b3JJbnN0YW5jZTogcHJvamVjdG9ySW5zdGFuY2VcclxuICAgIH07XHJcbiAgICByZXR1cm4gdHNsaWJfMS5fX2Fzc2lnbih7fSwgZGVmYXVsdHMsIHByb2plY3Rvck9wdGlvbnMpO1xyXG59XHJcbmZ1bmN0aW9uIGNoZWNrU3R5bGVWYWx1ZShzdHlsZVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIHN0eWxlVmFsdWUgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdHlsZSB2YWx1ZXMgbXVzdCBiZSBzdHJpbmdzJyk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gdXBkYXRlRXZlbnQoZG9tTm9kZSwgZXZlbnROYW1lLCBjdXJyZW50VmFsdWUsIHByb2plY3Rpb25PcHRpb25zLCBiaW5kLCBwcmV2aW91c1ZhbHVlKSB7XHJcbiAgICB2YXIgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xyXG4gICAgdmFyIGV2ZW50TWFwID0gcHJvamVjdG9yU3RhdGUubm9kZU1hcC5nZXQoZG9tTm9kZSkgfHwgbmV3IFdlYWtNYXBfMS5kZWZhdWx0KCk7XHJcbiAgICBpZiAocHJldmlvdXNWYWx1ZSkge1xyXG4gICAgICAgIHZhciBwcmV2aW91c0V2ZW50ID0gZXZlbnRNYXAuZ2V0KHByZXZpb3VzVmFsdWUpO1xyXG4gICAgICAgIGRvbU5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHByZXZpb3VzRXZlbnQpO1xyXG4gICAgfVxyXG4gICAgdmFyIGNhbGxiYWNrID0gY3VycmVudFZhbHVlLmJpbmQoYmluZCk7XHJcbiAgICBpZiAoZXZlbnROYW1lID09PSAnaW5wdXQnKSB7XHJcbiAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoZXZ0KSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZS5jYWxsKHRoaXMsIGV2dCk7XHJcbiAgICAgICAgICAgIGV2dC50YXJnZXRbJ29uaW5wdXQtdmFsdWUnXSA9IGV2dC50YXJnZXQudmFsdWU7XHJcbiAgICAgICAgfS5iaW5kKGJpbmQpO1xyXG4gICAgfVxyXG4gICAgZG9tTm9kZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgY2FsbGJhY2spO1xyXG4gICAgZXZlbnRNYXAuc2V0KGN1cnJlbnRWYWx1ZSwgY2FsbGJhY2spO1xyXG4gICAgcHJvamVjdG9yU3RhdGUubm9kZU1hcC5zZXQoZG9tTm9kZSwgZXZlbnRNYXApO1xyXG59XHJcbmZ1bmN0aW9uIGFkZENsYXNzZXMoZG9tTm9kZSwgY2xhc3Nlcykge1xyXG4gICAgaWYgKGNsYXNzZXMpIHtcclxuICAgICAgICB2YXIgY2xhc3NOYW1lcyA9IGNsYXNzZXMuc3BsaXQoJyAnKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNsYXNzTmFtZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZG9tTm9kZS5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZXNbaV0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiByZW1vdmVDbGFzc2VzKGRvbU5vZGUsIGNsYXNzZXMpIHtcclxuICAgIGlmIChjbGFzc2VzKSB7XHJcbiAgICAgICAgdmFyIGNsYXNzTmFtZXMgPSBjbGFzc2VzLnNwbGl0KCcgJyk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGFzc05hbWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGRvbU5vZGUuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWVzW2ldKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gYnVpbGRQcmV2aW91c1Byb3BlcnRpZXMoZG9tTm9kZSwgcHJldmlvdXMsIGN1cnJlbnQpIHtcclxuICAgIHZhciBkaWZmVHlwZSA9IGN1cnJlbnQuZGlmZlR5cGUsIHByb3BlcnRpZXMgPSBjdXJyZW50LnByb3BlcnRpZXMsIGF0dHJpYnV0ZXMgPSBjdXJyZW50LmF0dHJpYnV0ZXM7XHJcbiAgICBpZiAoIWRpZmZUeXBlIHx8IGRpZmZUeXBlID09PSAndmRvbScpIHtcclxuICAgICAgICByZXR1cm4geyBwcm9wZXJ0aWVzOiBwcmV2aW91cy5wcm9wZXJ0aWVzLCBhdHRyaWJ1dGVzOiBwcmV2aW91cy5hdHRyaWJ1dGVzLCBldmVudHM6IHByZXZpb3VzLmV2ZW50cyB9O1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZGlmZlR5cGUgPT09ICdub25lJykge1xyXG4gICAgICAgIHJldHVybiB7IHByb3BlcnRpZXM6IHt9LCBhdHRyaWJ1dGVzOiBwcmV2aW91cy5hdHRyaWJ1dGVzID8ge30gOiB1bmRlZmluZWQsIGV2ZW50czogcHJldmlvdXMuZXZlbnRzIH07XHJcbiAgICB9XHJcbiAgICB2YXIgbmV3UHJvcGVydGllcyA9IHtcclxuICAgICAgICBwcm9wZXJ0aWVzOiB7fVxyXG4gICAgfTtcclxuICAgIGlmIChhdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgbmV3UHJvcGVydGllcy5hdHRyaWJ1dGVzID0ge307XHJcbiAgICAgICAgbmV3UHJvcGVydGllcy5ldmVudHMgPSBwcmV2aW91cy5ldmVudHM7XHJcbiAgICAgICAgT2JqZWN0LmtleXMocHJvcGVydGllcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcE5hbWUpIHtcclxuICAgICAgICAgICAgbmV3UHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BOYW1lXSA9IGRvbU5vZGVbcHJvcE5hbWVdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKGF0dHJOYW1lKSB7XHJcbiAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMuYXR0cmlidXRlc1thdHRyTmFtZV0gPSBkb21Ob2RlLmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG5ld1Byb3BlcnRpZXM7XHJcbiAgICB9XHJcbiAgICBuZXdQcm9wZXJ0aWVzLnByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5yZWR1Y2UoZnVuY3Rpb24gKHByb3BzLCBwcm9wZXJ0eSkge1xyXG4gICAgICAgIHByb3BzW3Byb3BlcnR5XSA9IGRvbU5vZGUuZ2V0QXR0cmlidXRlKHByb3BlcnR5KSB8fCBkb21Ob2RlW3Byb3BlcnR5XTtcclxuICAgICAgICByZXR1cm4gcHJvcHM7XHJcbiAgICB9LCB7fSk7XHJcbiAgICByZXR1cm4gbmV3UHJvcGVydGllcztcclxufVxyXG5mdW5jdGlvbiBmb2N1c05vZGUocHJvcFZhbHVlLCBwcmV2aW91c1ZhbHVlLCBkb21Ob2RlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgdmFyIHJlc3VsdDtcclxuICAgIGlmICh0eXBlb2YgcHJvcFZhbHVlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gcHJvcFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICByZXN1bHQgPSBwcm9wVmFsdWUgJiYgIXByZXZpb3VzVmFsdWU7XHJcbiAgICB9XHJcbiAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XHJcbiAgICAgICAgdmFyIHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgICAgICBwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5wdXNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZG9tTm9kZS5mb2N1cygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHJlbW92ZU9ycGhhbmVkRXZlbnRzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcywgcHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMsIG9ubHlFdmVudHMpIHtcclxuICAgIGlmIChvbmx5RXZlbnRzID09PSB2b2lkIDApIHsgb25seUV2ZW50cyA9IGZhbHNlOyB9XHJcbiAgICB2YXIgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xyXG4gICAgdmFyIGV2ZW50TWFwID0gcHJvamVjdG9yU3RhdGUubm9kZU1hcC5nZXQoZG9tTm9kZSk7XHJcbiAgICBpZiAoZXZlbnRNYXApIHtcclxuICAgICAgICBPYmplY3Qua2V5cyhwcmV2aW91c1Byb3BlcnRpZXMpLmZvckVhY2goZnVuY3Rpb24gKHByb3BOYW1lKSB7XHJcbiAgICAgICAgICAgIHZhciBpc0V2ZW50ID0gcHJvcE5hbWUuc3Vic3RyKDAsIDIpID09PSAnb24nIHx8IG9ubHlFdmVudHM7XHJcbiAgICAgICAgICAgIHZhciBldmVudE5hbWUgPSBvbmx5RXZlbnRzID8gcHJvcE5hbWUgOiBwcm9wTmFtZS5zdWJzdHIoMik7XHJcbiAgICAgICAgICAgIGlmIChpc0V2ZW50ICYmICFwcm9wZXJ0aWVzW3Byb3BOYW1lXSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGV2ZW50Q2FsbGJhY2sgPSBldmVudE1hcC5nZXQocHJldmlvdXNQcm9wZXJ0aWVzW3Byb3BOYW1lXSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRDYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgIGRvbU5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGV2ZW50Q2FsbGJhY2spO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gdXBkYXRlQXR0cmlidXRlKGRvbU5vZGUsIGF0dHJOYW1lLCBhdHRyVmFsdWUsIHByb2plY3Rpb25PcHRpb25zKSB7XHJcbiAgICBpZiAocHJvamVjdGlvbk9wdGlvbnMubmFtZXNwYWNlID09PSBOQU1FU1BBQ0VfU1ZHICYmIGF0dHJOYW1lID09PSAnaHJlZicpIHtcclxuICAgICAgICBkb21Ob2RlLnNldEF0dHJpYnV0ZU5TKE5BTUVTUEFDRV9YTElOSywgYXR0ck5hbWUsIGF0dHJWYWx1ZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICgoYXR0ck5hbWUgPT09ICdyb2xlJyAmJiBhdHRyVmFsdWUgPT09ICcnKSB8fCBhdHRyVmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGRvbU5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGRvbU5vZGUuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHVwZGF0ZUF0dHJpYnV0ZXMoZG9tTm9kZSwgcHJldmlvdXNBdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzLCBwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgdmFyIGF0dHJOYW1lcyA9IE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpO1xyXG4gICAgdmFyIGF0dHJDb3VudCA9IGF0dHJOYW1lcy5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgdmFyIGF0dHJOYW1lID0gYXR0ck5hbWVzW2ldO1xyXG4gICAgICAgIHZhciBhdHRyVmFsdWUgPSBhdHRyaWJ1dGVzW2F0dHJOYW1lXTtcclxuICAgICAgICB2YXIgcHJldmlvdXNBdHRyVmFsdWUgPSBwcmV2aW91c0F0dHJpYnV0ZXNbYXR0ck5hbWVdO1xyXG4gICAgICAgIGlmIChhdHRyVmFsdWUgIT09IHByZXZpb3VzQXR0clZhbHVlKSB7XHJcbiAgICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZShkb21Ob2RlLCBhdHRyTmFtZSwgYXR0clZhbHVlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHVwZGF0ZVByb3BlcnRpZXMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucywgaW5jbHVkZXNFdmVudHNBbmRBdHRyaWJ1dGVzKSB7XHJcbiAgICBpZiAoaW5jbHVkZXNFdmVudHNBbmRBdHRyaWJ1dGVzID09PSB2b2lkIDApIHsgaW5jbHVkZXNFdmVudHNBbmRBdHRyaWJ1dGVzID0gdHJ1ZTsgfVxyXG4gICAgdmFyIHByb3BlcnRpZXNVcGRhdGVkID0gZmFsc2U7XHJcbiAgICB2YXIgcHJvcE5hbWVzID0gT2JqZWN0LmtleXMocHJvcGVydGllcyk7XHJcbiAgICB2YXIgcHJvcENvdW50ID0gcHJvcE5hbWVzLmxlbmd0aDtcclxuICAgIGlmIChwcm9wTmFtZXMuaW5kZXhPZignY2xhc3NlcycpID09PSAtMSAmJiBwcmV2aW91c1Byb3BlcnRpZXMuY2xhc3Nlcykge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByZXZpb3VzUHJvcGVydGllcy5jbGFzc2VzKSkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByZXZpb3VzUHJvcGVydGllcy5jbGFzc2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICByZW1vdmVDbGFzc2VzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcy5jbGFzc2VzW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmVtb3ZlQ2xhc3Nlcyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMuY2xhc3Nlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaW5jbHVkZXNFdmVudHNBbmRBdHRyaWJ1dGVzICYmIHJlbW92ZU9ycGhhbmVkRXZlbnRzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcywgcHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wQ291bnQ7IGkrKykge1xyXG4gICAgICAgIHZhciBwcm9wTmFtZSA9IHByb3BOYW1lc1tpXTtcclxuICAgICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcGVydGllc1twcm9wTmFtZV07XHJcbiAgICAgICAgdmFyIHByZXZpb3VzVmFsdWUgPSBwcmV2aW91c1Byb3BlcnRpZXNbcHJvcE5hbWVdO1xyXG4gICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ2NsYXNzZXMnKSB7XHJcbiAgICAgICAgICAgIHZhciBwcmV2aW91c0NsYXNzZXMgPSBBcnJheS5pc0FycmF5KHByZXZpb3VzVmFsdWUpID8gcHJldmlvdXNWYWx1ZSA6IFtwcmV2aW91c1ZhbHVlXTtcclxuICAgICAgICAgICAgdmFyIGN1cnJlbnRDbGFzc2VzID0gQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpID8gcHJvcFZhbHVlIDogW3Byb3BWYWx1ZV07XHJcbiAgICAgICAgICAgIGlmIChwcmV2aW91c0NsYXNzZXMgJiYgcHJldmlvdXNDbGFzc2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGlmICghcHJvcFZhbHVlIHx8IHByb3BWYWx1ZS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpXzEgPSAwOyBpXzEgPCBwcmV2aW91c0NsYXNzZXMubGVuZ3RoOyBpXzErKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDbGFzc2VzKGRvbU5vZGUsIHByZXZpb3VzQ2xhc3Nlc1tpXzFdKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbmV3Q2xhc3NlcyA9IHRzbGliXzEuX19zcHJlYWQoY3VycmVudENsYXNzZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGlfMiA9IDA7IGlfMiA8IHByZXZpb3VzQ2xhc3Nlcy5sZW5ndGg7IGlfMisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcmV2aW91c0NsYXNzTmFtZSA9IHByZXZpb3VzQ2xhc3Nlc1tpXzJdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNDbGFzc05hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbGFzc0luZGV4ID0gbmV3Q2xhc3Nlcy5pbmRleE9mKHByZXZpb3VzQ2xhc3NOYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc0luZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzZXMoZG9tTm9kZSwgcHJldmlvdXNDbGFzc05hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2xhc3Nlcy5zcGxpY2UoY2xhc3NJbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaV8zID0gMDsgaV8zIDwgbmV3Q2xhc3Nlcy5sZW5ndGg7IGlfMysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZENsYXNzZXMoZG9tTm9kZSwgbmV3Q2xhc3Nlc1tpXzNdKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpXzQgPSAwOyBpXzQgPCBjdXJyZW50Q2xhc3Nlcy5sZW5ndGg7IGlfNCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWRkQ2xhc3Nlcyhkb21Ob2RlLCBjdXJyZW50Q2xhc3Nlc1tpXzRdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChwcm9wTmFtZSA9PT0gJ2ZvY3VzJykge1xyXG4gICAgICAgICAgICBmb2N1c05vZGUocHJvcFZhbHVlLCBwcmV2aW91c1ZhbHVlLCBkb21Ob2RlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHByb3BOYW1lID09PSAnc3R5bGVzJykge1xyXG4gICAgICAgICAgICB2YXIgc3R5bGVOYW1lcyA9IE9iamVjdC5rZXlzKHByb3BWYWx1ZSk7XHJcbiAgICAgICAgICAgIHZhciBzdHlsZUNvdW50ID0gc3R5bGVOYW1lcy5sZW5ndGg7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3R5bGVDb3VudDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc3R5bGVOYW1lID0gc3R5bGVOYW1lc1tqXTtcclxuICAgICAgICAgICAgICAgIHZhciBuZXdTdHlsZVZhbHVlID0gcHJvcFZhbHVlW3N0eWxlTmFtZV07XHJcbiAgICAgICAgICAgICAgICB2YXIgb2xkU3R5bGVWYWx1ZSA9IHByZXZpb3VzVmFsdWUgJiYgcHJldmlvdXNWYWx1ZVtzdHlsZU5hbWVdO1xyXG4gICAgICAgICAgICAgICAgaWYgKG5ld1N0eWxlVmFsdWUgPT09IG9sZFN0eWxlVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXNVcGRhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChuZXdTdHlsZVZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tTdHlsZVZhbHVlKG5ld1N0eWxlVmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb25PcHRpb25zLnN0eWxlQXBwbHllcihkb21Ob2RlLCBzdHlsZU5hbWUsIG5ld1N0eWxlVmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbk9wdGlvbnMuc3R5bGVBcHBseWVyKGRvbU5vZGUsIHN0eWxlTmFtZSwgJycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIXByb3BWYWx1ZSAmJiB0eXBlb2YgcHJldmlvdXNWYWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgIHByb3BWYWx1ZSA9ICcnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ3ZhbHVlJykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGRvbVZhbHVlID0gZG9tTm9kZVtwcm9wTmFtZV07XHJcbiAgICAgICAgICAgICAgICBpZiAoZG9tVmFsdWUgIT09IHByb3BWYWx1ZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIChkb21Ob2RlWydvbmlucHV0LXZhbHVlJ11cclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBkb21WYWx1ZSA9PT0gZG9tTm9kZVsnb25pbnB1dC12YWx1ZSddXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogcHJvcFZhbHVlICE9PSBwcmV2aW91c1ZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRvbU5vZGVbcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGRvbU5vZGVbJ29uaW5wdXQtdmFsdWUnXSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChwcm9wVmFsdWUgIT09IHByZXZpb3VzVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAocHJvcE5hbWUgIT09ICdrZXknICYmIHByb3BWYWx1ZSAhPT0gcHJldmlvdXNWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgcHJvcFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdmdW5jdGlvbicgJiYgcHJvcE5hbWUubGFzdEluZGV4T2YoJ29uJywgMCkgPT09IDAgJiYgaW5jbHVkZXNFdmVudHNBbmRBdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlRXZlbnQoZG9tTm9kZSwgcHJvcE5hbWUuc3Vic3RyKDIpLCBwcm9wVmFsdWUsIHByb2plY3Rpb25PcHRpb25zLCBwcm9wZXJ0aWVzLmJpbmQsIHByZXZpb3VzVmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgcHJvcE5hbWUgIT09ICdpbm5lckhUTUwnICYmIGluY2x1ZGVzRXZlbnRzQW5kQXR0cmlidXRlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZShkb21Ob2RlLCBwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9wTmFtZSA9PT0gJ3Njcm9sbExlZnQnIHx8IHByb3BOYW1lID09PSAnc2Nyb2xsVG9wJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkb21Ob2RlW3Byb3BOYW1lXSAhPT0gcHJvcFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbU5vZGVbcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGRvbU5vZGVbcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcHJvcGVydGllc1VwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHByb3BlcnRpZXNVcGRhdGVkO1xyXG59XHJcbmZ1bmN0aW9uIGZpbmRJbmRleE9mQ2hpbGQoY2hpbGRyZW4sIHNhbWVBcywgc3RhcnQpIHtcclxuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHNhbWUoY2hpbGRyZW5baV0sIHNhbWVBcykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIC0xO1xyXG59XHJcbmZ1bmN0aW9uIHRvUGFyZW50Vk5vZGUoZG9tTm9kZSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB0YWc6ICcnLFxyXG4gICAgICAgIHByb3BlcnRpZXM6IHt9LFxyXG4gICAgICAgIGNoaWxkcmVuOiB1bmRlZmluZWQsXHJcbiAgICAgICAgZG9tTm9kZTogZG9tTm9kZSxcclxuICAgICAgICB0eXBlOiBkXzEuVk5PREVcclxuICAgIH07XHJcbn1cclxuZXhwb3J0cy50b1BhcmVudFZOb2RlID0gdG9QYXJlbnRWTm9kZTtcclxuZnVuY3Rpb24gdG9UZXh0Vk5vZGUoZGF0YSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB0YWc6ICcnLFxyXG4gICAgICAgIHByb3BlcnRpZXM6IHt9LFxyXG4gICAgICAgIGNoaWxkcmVuOiB1bmRlZmluZWQsXHJcbiAgICAgICAgdGV4dDogXCJcIiArIGRhdGEsXHJcbiAgICAgICAgZG9tTm9kZTogdW5kZWZpbmVkLFxyXG4gICAgICAgIHR5cGU6IGRfMS5WTk9ERVxyXG4gICAgfTtcclxufVxyXG5leHBvcnRzLnRvVGV4dFZOb2RlID0gdG9UZXh0Vk5vZGU7XHJcbmZ1bmN0aW9uIHRvSW50ZXJuYWxXTm9kZShpbnN0YW5jZSwgaW5zdGFuY2VEYXRhKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZSxcclxuICAgICAgICByZW5kZXJlZDogW10sXHJcbiAgICAgICAgY29yZVByb3BlcnRpZXM6IGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcyxcclxuICAgICAgICBjaGlsZHJlbjogaW5zdGFuY2UuY2hpbGRyZW4sXHJcbiAgICAgICAgd2lkZ2V0Q29uc3RydWN0b3I6IGluc3RhbmNlLmNvbnN0cnVjdG9yLFxyXG4gICAgICAgIHByb3BlcnRpZXM6IGluc3RhbmNlRGF0YS5pbnB1dFByb3BlcnRpZXMsXHJcbiAgICAgICAgdHlwZTogZF8xLldOT0RFXHJcbiAgICB9O1xyXG59XHJcbmZ1bmN0aW9uIGZpbHRlckFuZERlY29yYXRlQ2hpbGRyZW4oY2hpbGRyZW4sIGluc3RhbmNlKSB7XHJcbiAgICBpZiAoY2hpbGRyZW4gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiBlbXB0eUFycmF5O1xyXG4gICAgfVxyXG4gICAgY2hpbGRyZW4gPSBBcnJheS5pc0FycmF5KGNoaWxkcmVuKSA/IGNoaWxkcmVuIDogW2NoaWxkcmVuXTtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOykge1xyXG4gICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xyXG4gICAgICAgIGlmIChjaGlsZCA9PT0gdW5kZWZpbmVkIHx8IGNoaWxkID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNoaWxkcmVuLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgY2hpbGRyZW5baV0gPSB0b1RleHRWTm9kZShjaGlsZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoZF8xLmlzVk5vZGUoY2hpbGQpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQucHJvcGVydGllcy5iaW5kID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZC5wcm9wZXJ0aWVzLmJpbmQgPSBpbnN0YW5jZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuY2hpbGRyZW4gJiYgY2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJBbmREZWNvcmF0ZUNoaWxkcmVuKGNoaWxkLmNoaWxkcmVuLCBpbnN0YW5jZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjaGlsZC5jb3JlUHJvcGVydGllcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbnN0YW5jZURhdGEgPSBleHBvcnRzLndpZGdldEluc3RhbmNlTWFwLmdldChpbnN0YW5jZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuY29yZVByb3BlcnRpZXMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQ6IGluc3RhbmNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXNlUmVnaXN0cnk6IGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcy5iYXNlUmVnaXN0cnlcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuICYmIGNoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJBbmREZWNvcmF0ZUNoaWxkcmVuKGNoaWxkLmNoaWxkcmVuLCBpbnN0YW5jZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaSsrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNoaWxkcmVuO1xyXG59XHJcbmV4cG9ydHMuZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbiA9IGZpbHRlckFuZERlY29yYXRlQ2hpbGRyZW47XHJcbmZ1bmN0aW9uIG5vZGVBZGRlZChkbm9kZSwgdHJhbnNpdGlvbnMpIHtcclxuICAgIGlmIChkXzEuaXNWTm9kZShkbm9kZSkgJiYgZG5vZGUucHJvcGVydGllcykge1xyXG4gICAgICAgIHZhciBlbnRlckFuaW1hdGlvbiA9IGRub2RlLnByb3BlcnRpZXMuZW50ZXJBbmltYXRpb247XHJcbiAgICAgICAgaWYgKGVudGVyQW5pbWF0aW9uKSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZW50ZXJBbmltYXRpb24gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIGVudGVyQW5pbWF0aW9uKGRub2RlLmRvbU5vZGUsIGRub2RlLnByb3BlcnRpZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbnMuZW50ZXIoZG5vZGUuZG9tTm9kZSwgZG5vZGUucHJvcGVydGllcywgZW50ZXJBbmltYXRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIG5vZGVUb1JlbW92ZShkbm9kZSwgdHJhbnNpdGlvbnMsIHByb2plY3Rpb25PcHRpb25zKSB7XHJcbiAgICBpZiAoZF8xLmlzV05vZGUoZG5vZGUpKSB7XHJcbiAgICAgICAgdmFyIHJlbmRlcmVkID0gZG5vZGUucmVuZGVyZWQgfHwgZW1wdHlBcnJheTtcclxuICAgICAgICBpZiAoZG5vZGUuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdmFyIGluc3RhbmNlRGF0YSA9IGV4cG9ydHMud2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGRub2RlLmluc3RhbmNlKTtcclxuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLm9uRGV0YWNoKCk7XHJcbiAgICAgICAgICAgIGluc3RhbmNlTWFwLmRlbGV0ZShkbm9kZS5pbnN0YW5jZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVuZGVyZWQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbm9kZVRvUmVtb3ZlKHJlbmRlcmVkW2ldLCB0cmFuc2l0aW9ucywgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHZhciBkb21Ob2RlXzEgPSBkbm9kZS5kb21Ob2RlO1xyXG4gICAgICAgIHZhciBwcm9wZXJ0aWVzID0gZG5vZGUucHJvcGVydGllcztcclxuICAgICAgICBpZiAoZG5vZGUuY2hpbGRyZW4gJiYgZG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBub2RlVG9SZW1vdmUoZG5vZGUuY2hpbGRyZW5baV0sIHRyYW5zaXRpb25zLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGV4aXRBbmltYXRpb24gPSBwcm9wZXJ0aWVzLmV4aXRBbmltYXRpb247XHJcbiAgICAgICAgaWYgKHByb3BlcnRpZXMgJiYgZXhpdEFuaW1hdGlvbikge1xyXG4gICAgICAgICAgICBkb21Ob2RlXzEuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcclxuICAgICAgICAgICAgdmFyIHJlbW92ZURvbU5vZGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBkb21Ob2RlXzEgJiYgZG9tTm9kZV8xLnBhcmVudE5vZGUgJiYgZG9tTm9kZV8xLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZG9tTm9kZV8xKTtcclxuICAgICAgICAgICAgICAgIGRub2RlLmRvbU5vZGUgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXhpdEFuaW1hdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgZXhpdEFuaW1hdGlvbihkb21Ob2RlXzEsIHJlbW92ZURvbU5vZGUsIHByb3BlcnRpZXMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbnMuZXhpdChkbm9kZS5kb21Ob2RlLCBwcm9wZXJ0aWVzLCBleGl0QW5pbWF0aW9uLCByZW1vdmVEb21Ob2RlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBkb21Ob2RlXzEgJiYgZG9tTm9kZV8xLnBhcmVudE5vZGUgJiYgZG9tTm9kZV8xLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZG9tTm9kZV8xKTtcclxuICAgICAgICBkbm9kZS5kb21Ob2RlID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGNoZWNrRGlzdGluZ3Vpc2hhYmxlKGNoaWxkTm9kZXMsIGluZGV4VG9DaGVjaywgcGFyZW50SW5zdGFuY2UpIHtcclxuICAgIHZhciBjaGlsZE5vZGUgPSBjaGlsZE5vZGVzW2luZGV4VG9DaGVja107XHJcbiAgICBpZiAoZF8xLmlzVk5vZGUoY2hpbGROb2RlKSAmJiAhY2hpbGROb2RlLnRhZykge1xyXG4gICAgICAgIHJldHVybjsgLy8gVGV4dCBub2RlcyBuZWVkIG5vdCBiZSBkaXN0aW5ndWlzaGFibGVcclxuICAgIH1cclxuICAgIHZhciBrZXkgPSBjaGlsZE5vZGUucHJvcGVydGllcy5rZXk7XHJcbiAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwga2V5ID09PSBudWxsKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChpICE9PSBpbmRleFRvQ2hlY2spIHtcclxuICAgICAgICAgICAgICAgIHZhciBub2RlID0gY2hpbGROb2Rlc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChzYW1lKG5vZGUsIGNoaWxkTm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZUlkZW50aWZpZXIgPSB2b2lkIDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmVudE5hbWUgPSBwYXJlbnRJbnN0YW5jZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICd1bmtub3duJztcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZF8xLmlzV05vZGUoY2hpbGROb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlSWRlbnRpZmllciA9IGNoaWxkTm9kZS53aWRnZXRDb25zdHJ1Y3Rvci5uYW1lIHx8ICd1bmtub3duJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVJZGVudGlmaWVyID0gY2hpbGROb2RlLnRhZztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiQSB3aWRnZXQgKFwiICsgcGFyZW50TmFtZSArIFwiKSBoYXMgaGFkIGEgY2hpbGQgYWRkZGVkIG9yIHJlbW92ZWQsIGJ1dCB0aGV5IHdlcmUgbm90IGFibGUgdG8gdW5pcXVlbHkgaWRlbnRpZmllZC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gcHJvdmlkZSBhIHVuaXF1ZSAna2V5JyBwcm9wZXJ0eSB3aGVuIHVzaW5nIHRoZSBzYW1lIHdpZGdldCBvciBlbGVtZW50IChcIiArIG5vZGVJZGVudGlmaWVyICsgXCIpIG11bHRpcGxlIHRpbWVzIGFzIHNpYmxpbmdzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHVwZGF0ZUNoaWxkcmVuKHBhcmVudFZOb2RlLCBvbGRDaGlsZHJlbiwgbmV3Q2hpbGRyZW4sIHBhcmVudEluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgb2xkQ2hpbGRyZW4gPSBvbGRDaGlsZHJlbiB8fCBlbXB0eUFycmF5O1xyXG4gICAgbmV3Q2hpbGRyZW4gPSBuZXdDaGlsZHJlbjtcclxuICAgIHZhciBvbGRDaGlsZHJlbkxlbmd0aCA9IG9sZENoaWxkcmVuLmxlbmd0aDtcclxuICAgIHZhciBuZXdDaGlsZHJlbkxlbmd0aCA9IG5ld0NoaWxkcmVuLmxlbmd0aDtcclxuICAgIHZhciB0cmFuc2l0aW9ucyA9IHByb2plY3Rpb25PcHRpb25zLnRyYW5zaXRpb25zO1xyXG4gICAgdmFyIHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgIHByb2plY3Rpb25PcHRpb25zID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgcHJvamVjdGlvbk9wdGlvbnMsIHsgZGVwdGg6IHByb2plY3Rpb25PcHRpb25zLmRlcHRoICsgMSB9KTtcclxuICAgIHZhciBvbGRJbmRleCA9IDA7XHJcbiAgICB2YXIgbmV3SW5kZXggPSAwO1xyXG4gICAgdmFyIGk7XHJcbiAgICB2YXIgdGV4dFVwZGF0ZWQgPSBmYWxzZTtcclxuICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBvbGRDaGlsZCA9IG9sZEluZGV4IDwgb2xkQ2hpbGRyZW5MZW5ndGggPyBvbGRDaGlsZHJlbltvbGRJbmRleF0gOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgdmFyIG5ld0NoaWxkID0gbmV3Q2hpbGRyZW5bbmV3SW5kZXhdO1xyXG4gICAgICAgIGlmIChkXzEuaXNWTm9kZShuZXdDaGlsZCkgJiYgdHlwZW9mIG5ld0NoaWxkLmRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIG5ld0NoaWxkLmluc2VydGVkID0gZF8xLmlzVk5vZGUob2xkQ2hpbGQpICYmIG9sZENoaWxkLmluc2VydGVkO1xyXG4gICAgICAgICAgICBhZGREZWZlcnJlZFByb3BlcnRpZXMobmV3Q2hpbGQsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9sZENoaWxkICE9PSB1bmRlZmluZWQgJiYgc2FtZShvbGRDaGlsZCwgbmV3Q2hpbGQpKSB7XHJcbiAgICAgICAgICAgIHRleHRVcGRhdGVkID0gdXBkYXRlRG9tKG9sZENoaWxkLCBuZXdDaGlsZCwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudFZOb2RlLCBwYXJlbnRJbnN0YW5jZSkgfHwgdGV4dFVwZGF0ZWQ7XHJcbiAgICAgICAgICAgIG9sZEluZGV4Kys7XHJcbiAgICAgICAgICAgIG5ld0luZGV4Kys7XHJcbiAgICAgICAgICAgIHJldHVybiBcImNvbnRpbnVlXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBmaW5kT2xkSW5kZXggPSBmaW5kSW5kZXhPZkNoaWxkKG9sZENoaWxkcmVuLCBuZXdDaGlsZCwgb2xkSW5kZXggKyAxKTtcclxuICAgICAgICB2YXIgYWRkQ2hpbGQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBpbnNlcnRCZWZvcmVEb21Ob2RlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBvbGRDaGlsZHJlbltvbGRJbmRleF07XHJcbiAgICAgICAgICAgIGlmIChjaGlsZCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG5leHRJbmRleCA9IG9sZEluZGV4ICsgMTtcclxuICAgICAgICAgICAgICAgIHZhciBpbnNlcnRCZWZvcmVDaGlsZHJlbiA9IFtjaGlsZF07XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoaW5zZXJ0QmVmb3JlQ2hpbGRyZW4ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluc2VydEJlZm9yZSA9IGluc2VydEJlZm9yZUNoaWxkcmVuLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRfMS5pc1dOb2RlKGluc2VydEJlZm9yZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydEJlZm9yZS5yZW5kZXJlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ2hpbGRyZW4ucHVzaC5hcHBseShpbnNlcnRCZWZvcmVDaGlsZHJlbiwgdHNsaWJfMS5fX3NwcmVhZChpbnNlcnRCZWZvcmUucmVuZGVyZWQpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydEJlZm9yZS5kb21Ob2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRCZWZvcmVEb21Ob2RlID0gaW5zZXJ0QmVmb3JlLmRvbU5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlQ2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIG9sZENoaWxkcmVuW25leHRJbmRleF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ2hpbGRyZW4ucHVzaChvbGRDaGlsZHJlbltuZXh0SW5kZXhdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEluZGV4Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNyZWF0ZURvbShuZXdDaGlsZCwgcGFyZW50Vk5vZGUsIGluc2VydEJlZm9yZURvbU5vZGUsIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRJbnN0YW5jZSk7XHJcbiAgICAgICAgICAgIG5vZGVBZGRlZChuZXdDaGlsZCwgdHJhbnNpdGlvbnMpO1xyXG4gICAgICAgICAgICB2YXIgaW5kZXhUb0NoZWNrID0gbmV3SW5kZXg7XHJcbiAgICAgICAgICAgIHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnB1c2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgY2hlY2tEaXN0aW5ndWlzaGFibGUobmV3Q2hpbGRyZW4sIGluZGV4VG9DaGVjaywgcGFyZW50SW5zdGFuY2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmICghb2xkQ2hpbGQgfHwgZmluZE9sZEluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICBhZGRDaGlsZCgpO1xyXG4gICAgICAgICAgICBuZXdJbmRleCsrO1xyXG4gICAgICAgICAgICByZXR1cm4gXCJjb250aW51ZVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgcmVtb3ZlQ2hpbGQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBpbmRleFRvQ2hlY2sgPSBvbGRJbmRleDtcclxuICAgICAgICAgICAgcHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MucHVzaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBjaGVja0Rpc3Rpbmd1aXNoYWJsZShvbGRDaGlsZHJlbiwgaW5kZXhUb0NoZWNrLCBwYXJlbnRJbnN0YW5jZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoZF8xLmlzV05vZGUob2xkQ2hpbGQpKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGluc3RhbmNlTWFwLmdldChvbGRDaGlsZC5pbnN0YW5jZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9sZENoaWxkID0gaXRlbS5kbm9kZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBub2RlVG9SZW1vdmUob2xkQ2hpbGQsIHRyYW5zaXRpb25zLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2YXIgZmluZE5ld0luZGV4ID0gZmluZEluZGV4T2ZDaGlsZChuZXdDaGlsZHJlbiwgb2xkQ2hpbGQsIG5ld0luZGV4ICsgMSk7XHJcbiAgICAgICAgaWYgKGZpbmROZXdJbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgcmVtb3ZlQ2hpbGQoKTtcclxuICAgICAgICAgICAgb2xkSW5kZXgrKztcclxuICAgICAgICAgICAgcmV0dXJuIFwiY29udGludWVcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgYWRkQ2hpbGQoKTtcclxuICAgICAgICByZW1vdmVDaGlsZCgpO1xyXG4gICAgICAgIG9sZEluZGV4Kys7XHJcbiAgICAgICAgbmV3SW5kZXgrKztcclxuICAgIH07XHJcbiAgICB3aGlsZSAobmV3SW5kZXggPCBuZXdDaGlsZHJlbkxlbmd0aCkge1xyXG4gICAgICAgIF9sb29wXzEoKTtcclxuICAgIH1cclxuICAgIGlmIChvbGRDaGlsZHJlbkxlbmd0aCA+IG9sZEluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9sb29wXzIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBpbmRleFRvQ2hlY2sgPSBpO1xyXG4gICAgICAgICAgICBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5wdXNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGNoZWNrRGlzdGluZ3Vpc2hhYmxlKG9sZENoaWxkcmVuLCBpbmRleFRvQ2hlY2ssIHBhcmVudEluc3RhbmNlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHZhciBjaGlsZFRvUmVtb3ZlID0gb2xkQ2hpbGRyZW5baV07XHJcbiAgICAgICAgICAgIGlmIChkXzEuaXNXTm9kZShjaGlsZFRvUmVtb3ZlKSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBpbnN0YW5jZU1hcC5nZXQoY2hpbGRUb1JlbW92ZS5pbnN0YW5jZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkVG9SZW1vdmUgPSBpdGVtLmRub2RlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5vZGVUb1JlbW92ZShjaGlsZFRvUmVtb3ZlLCB0cmFuc2l0aW9ucywgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gUmVtb3ZlIGNoaWxkIGZyYWdtZW50c1xyXG4gICAgICAgIGZvciAoaSA9IG9sZEluZGV4OyBpIDwgb2xkQ2hpbGRyZW5MZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBfbG9vcF8yKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRleHRVcGRhdGVkO1xyXG59XHJcbmZ1bmN0aW9uIGFkZENoaWxkcmVuKHBhcmVudFZOb2RlLCBjaGlsZHJlbiwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudEluc3RhbmNlLCBpbnNlcnRCZWZvcmUsIGNoaWxkTm9kZXMpIHtcclxuICAgIGlmIChpbnNlcnRCZWZvcmUgPT09IHZvaWQgMCkgeyBpbnNlcnRCZWZvcmUgPSB1bmRlZmluZWQ7IH1cclxuICAgIGlmIChjaGlsZHJlbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdmFyIHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgIGlmIChwcm9qZWN0b3JTdGF0ZS5tZXJnZSAmJiBjaGlsZE5vZGVzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjaGlsZE5vZGVzID0gYXJyYXlfMS5mcm9tKHBhcmVudFZOb2RlLmRvbU5vZGUuY2hpbGROb2Rlcyk7XHJcbiAgICB9XHJcbiAgICB2YXIgdHJhbnNpdGlvbnMgPSBwcm9qZWN0aW9uT3B0aW9ucy50cmFuc2l0aW9ucztcclxuICAgIHByb2plY3Rpb25PcHRpb25zID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgcHJvamVjdGlvbk9wdGlvbnMsIHsgZGVwdGg6IHByb2plY3Rpb25PcHRpb25zLmRlcHRoICsgMSB9KTtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcclxuICAgICAgICBpZiAoZF8xLmlzVk5vZGUoY2hpbGQpKSB7XHJcbiAgICAgICAgICAgIGlmIChwcm9qZWN0b3JTdGF0ZS5tZXJnZSAmJiBjaGlsZE5vZGVzKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZG9tRWxlbWVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChjaGlsZC5kb21Ob2RlID09PSB1bmRlZmluZWQgJiYgY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCA9IGNoaWxkTm9kZXMuc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZG9tRWxlbWVudCAmJiBkb21FbGVtZW50LnRhZ05hbWUgPT09IChjaGlsZC50YWcudG9VcHBlckNhc2UoKSB8fCB1bmRlZmluZWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmRvbU5vZGUgPSBkb21FbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjcmVhdGVEb20oY2hpbGQsIHBhcmVudFZOb2RlLCBpbnNlcnRCZWZvcmUsIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRJbnN0YW5jZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjcmVhdGVEb20oY2hpbGQsIHBhcmVudFZOb2RlLCBpbnNlcnRCZWZvcmUsIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRJbnN0YW5jZSwgY2hpbGROb2Rlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG5vZGVBZGRlZChjaGlsZCwgdHJhbnNpdGlvbnMpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGluaXRQcm9wZXJ0aWVzQW5kQ2hpbGRyZW4oZG9tTm9kZSwgZG5vZGUsIHBhcmVudEluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgYWRkQ2hpbGRyZW4oZG5vZGUsIGRub2RlLmNoaWxkcmVuLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UsIHVuZGVmaW5lZCk7XHJcbiAgICBpZiAodHlwZW9mIGRub2RlLmRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrID09PSAnZnVuY3Rpb24nICYmIGRub2RlLmluc2VydGVkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBhZGREZWZlcnJlZFByb3BlcnRpZXMoZG5vZGUsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgIH1cclxuICAgIGlmIChkbm9kZS5hdHRyaWJ1dGVzICYmIGRub2RlLmV2ZW50cykge1xyXG4gICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXMoZG9tTm9kZSwge30sIGRub2RlLmF0dHJpYnV0ZXMsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICB1cGRhdGVQcm9wZXJ0aWVzKGRvbU5vZGUsIHt9LCBkbm9kZS5wcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucywgZmFsc2UpO1xyXG4gICAgICAgIHJlbW92ZU9ycGhhbmVkRXZlbnRzKGRvbU5vZGUsIHt9LCBkbm9kZS5ldmVudHMsIHByb2plY3Rpb25PcHRpb25zLCB0cnVlKTtcclxuICAgICAgICB2YXIgZXZlbnRzXzEgPSBkbm9kZS5ldmVudHM7XHJcbiAgICAgICAgT2JqZWN0LmtleXMoZXZlbnRzXzEpLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIHVwZGF0ZUV2ZW50KGRvbU5vZGUsIGV2ZW50LCBldmVudHNfMVtldmVudF0sIHByb2plY3Rpb25PcHRpb25zLCBkbm9kZS5wcm9wZXJ0aWVzLmJpbmQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdXBkYXRlUHJvcGVydGllcyhkb21Ob2RlLCB7fSwgZG5vZGUucHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgfVxyXG4gICAgaWYgKGRub2RlLnByb3BlcnRpZXMua2V5ICE9PSBudWxsICYmIGRub2RlLnByb3BlcnRpZXMua2V5ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB2YXIgaW5zdGFuY2VEYXRhID0gZXhwb3J0cy53aWRnZXRJbnN0YW5jZU1hcC5nZXQocGFyZW50SW5zdGFuY2UpO1xyXG4gICAgICAgIGluc3RhbmNlRGF0YS5ub2RlSGFuZGxlci5hZGQoZG9tTm9kZSwgXCJcIiArIGRub2RlLnByb3BlcnRpZXMua2V5KTtcclxuICAgIH1cclxuICAgIGRub2RlLmluc2VydGVkID0gdHJ1ZTtcclxufVxyXG5mdW5jdGlvbiBjcmVhdGVEb20oZG5vZGUsIHBhcmVudFZOb2RlLCBpbnNlcnRCZWZvcmUsIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRJbnN0YW5jZSwgY2hpbGROb2Rlcykge1xyXG4gICAgdmFyIGRvbU5vZGU7XHJcbiAgICB2YXIgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xyXG4gICAgaWYgKGRfMS5pc1dOb2RlKGRub2RlKSkge1xyXG4gICAgICAgIHZhciB3aWRnZXRDb25zdHJ1Y3RvciA9IGRub2RlLndpZGdldENvbnN0cnVjdG9yO1xyXG4gICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZURhdGEgPSBleHBvcnRzLndpZGdldEluc3RhbmNlTWFwLmdldChwYXJlbnRJbnN0YW5jZSk7XHJcbiAgICAgICAgaWYgKCFSZWdpc3RyeV8xLmlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yKHdpZGdldENvbnN0cnVjdG9yKSkge1xyXG4gICAgICAgICAgICB2YXIgaXRlbSA9IHBhcmVudEluc3RhbmNlRGF0YS5yZWdpc3RyeSgpLmdldCh3aWRnZXRDb25zdHJ1Y3Rvcik7XHJcbiAgICAgICAgICAgIGlmIChpdGVtID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgd2lkZ2V0Q29uc3RydWN0b3IgPSBpdGVtO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgaW5zdGFuY2VfMSA9IG5ldyB3aWRnZXRDb25zdHJ1Y3RvcigpO1xyXG4gICAgICAgIGRub2RlLmluc3RhbmNlID0gaW5zdGFuY2VfMTtcclxuICAgICAgICB2YXIgaW5zdGFuY2VEYXRhXzEgPSBleHBvcnRzLndpZGdldEluc3RhbmNlTWFwLmdldChpbnN0YW5jZV8xKTtcclxuICAgICAgICBpbnN0YW5jZURhdGFfMS5pbnZhbGlkYXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpbnN0YW5jZURhdGFfMS5kaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZURhdGFfMS5yZW5kZXJpbmcgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9qZWN0b3JTdGF0ZS5yZW5kZXJRdWV1ZS5wdXNoKHsgaW5zdGFuY2U6IGluc3RhbmNlXzEsIGRlcHRoOiBwcm9qZWN0aW9uT3B0aW9ucy5kZXB0aCB9KTtcclxuICAgICAgICAgICAgICAgIHNjaGVkdWxlUmVuZGVyKHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaW5zdGFuY2VEYXRhXzEucmVuZGVyaW5nID0gdHJ1ZTtcclxuICAgICAgICBpbnN0YW5jZV8xLl9fc2V0Q29yZVByb3BlcnRpZXNfXyhkbm9kZS5jb3JlUHJvcGVydGllcyk7XHJcbiAgICAgICAgaW5zdGFuY2VfMS5fX3NldENoaWxkcmVuX18oZG5vZGUuY2hpbGRyZW4pO1xyXG4gICAgICAgIGluc3RhbmNlXzEuX19zZXRQcm9wZXJ0aWVzX18oZG5vZGUucHJvcGVydGllcyk7XHJcbiAgICAgICAgdmFyIHJlbmRlcmVkID0gaW5zdGFuY2VfMS5fX3JlbmRlcl9fKCk7XHJcbiAgICAgICAgaW5zdGFuY2VEYXRhXzEucmVuZGVyaW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHJlbmRlcmVkKSB7XHJcbiAgICAgICAgICAgIHZhciBmaWx0ZXJlZFJlbmRlcmVkID0gZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihyZW5kZXJlZCwgaW5zdGFuY2VfMSk7XHJcbiAgICAgICAgICAgIGRub2RlLnJlbmRlcmVkID0gZmlsdGVyZWRSZW5kZXJlZDtcclxuICAgICAgICAgICAgYWRkQ2hpbGRyZW4ocGFyZW50Vk5vZGUsIGZpbHRlcmVkUmVuZGVyZWQsIHByb2plY3Rpb25PcHRpb25zLCBpbnN0YW5jZV8xLCBpbnNlcnRCZWZvcmUsIGNoaWxkTm9kZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpbnN0YW5jZU1hcC5zZXQoaW5zdGFuY2VfMSwgeyBkbm9kZTogZG5vZGUsIHBhcmVudFZOb2RlOiBwYXJlbnRWTm9kZSB9KTtcclxuICAgICAgICBpbnN0YW5jZURhdGFfMS5ub2RlSGFuZGxlci5hZGRSb290KCk7XHJcbiAgICAgICAgcHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MucHVzaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YV8xLm9uQXR0YWNoKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBpZiAocHJvamVjdG9yU3RhdGUubWVyZ2UgJiYgcHJvamVjdG9yU3RhdGUubWVyZ2VFbGVtZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgZG9tTm9kZSA9IGRub2RlLmRvbU5vZGUgPSBwcm9qZWN0aW9uT3B0aW9ucy5tZXJnZUVsZW1lbnQ7XHJcbiAgICAgICAgICAgIHByb2plY3RvclN0YXRlLm1lcmdlRWxlbWVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgaW5pdFByb3BlcnRpZXNBbmRDaGlsZHJlbihkb21Ob2RlLCBkbm9kZSwgcGFyZW50SW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgZG9jID0gcGFyZW50Vk5vZGUuZG9tTm9kZS5vd25lckRvY3VtZW50O1xyXG4gICAgICAgIGlmICghZG5vZGUudGFnICYmIHR5cGVvZiBkbm9kZS50ZXh0ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBpZiAoZG5vZGUuZG9tTm9kZSAhPT0gdW5kZWZpbmVkICYmIHBhcmVudFZOb2RlLmRvbU5vZGUpIHtcclxuICAgICAgICAgICAgICAgIHZhciBuZXdEb21Ob2RlID0gZG5vZGUuZG9tTm9kZS5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRub2RlLnRleHQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudFZOb2RlLmRvbU5vZGUgPT09IGRub2RlLmRvbU5vZGUucGFyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFZOb2RlLmRvbU5vZGUucmVwbGFjZUNoaWxkKG5ld0RvbU5vZGUsIGRub2RlLmRvbU5vZGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Vk5vZGUuZG9tTm9kZS5hcHBlbmRDaGlsZChuZXdEb21Ob2RlKTtcclxuICAgICAgICAgICAgICAgICAgICBkbm9kZS5kb21Ob2RlLnBhcmVudE5vZGUgJiYgZG5vZGUuZG9tTm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRub2RlLmRvbU5vZGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZG5vZGUuZG9tTm9kZSA9IG5ld0RvbU5vZGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkb21Ob2RlID0gZG5vZGUuZG9tTm9kZSA9IGRvYy5jcmVhdGVUZXh0Tm9kZShkbm9kZS50ZXh0KTtcclxuICAgICAgICAgICAgICAgIGlmIChpbnNlcnRCZWZvcmUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFZOb2RlLmRvbU5vZGUuaW5zZXJ0QmVmb3JlKGRvbU5vZGUsIGluc2VydEJlZm9yZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRWTm9kZS5kb21Ob2RlLmFwcGVuZENoaWxkKGRvbU5vZGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoZG5vZGUuZG9tTm9kZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZG5vZGUudGFnID09PSAnc3ZnJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb25PcHRpb25zID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgcHJvamVjdGlvbk9wdGlvbnMsIHsgbmFtZXNwYWNlOiBOQU1FU1BBQ0VfU1ZHIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHByb2plY3Rpb25PcHRpb25zLm5hbWVzcGFjZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9tTm9kZSA9IGRub2RlLmRvbU5vZGUgPSBkb2MuY3JlYXRlRWxlbWVudE5TKHByb2plY3Rpb25PcHRpb25zLm5hbWVzcGFjZSwgZG5vZGUudGFnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlID0gZG5vZGUuZG9tTm9kZSB8fCBkb2MuY3JlYXRlRWxlbWVudChkbm9kZS50YWcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZG9tTm9kZSA9IGRub2RlLmRvbU5vZGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaW5pdFByb3BlcnRpZXNBbmRDaGlsZHJlbihkb21Ob2RlLCBkbm9kZSwgcGFyZW50SW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICAgICAgaWYgKGluc2VydEJlZm9yZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRWTm9kZS5kb21Ob2RlLmluc2VydEJlZm9yZShkb21Ob2RlLCBpbnNlcnRCZWZvcmUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGRvbU5vZGUucGFyZW50Tm9kZSAhPT0gcGFyZW50Vk5vZGUuZG9tTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50Vk5vZGUuZG9tTm9kZS5hcHBlbmRDaGlsZChkb21Ob2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiB1cGRhdGVEb20ocHJldmlvdXMsIGRub2RlLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50Vk5vZGUsIHBhcmVudEluc3RhbmNlKSB7XHJcbiAgICBpZiAoZF8xLmlzV05vZGUoZG5vZGUpKSB7XHJcbiAgICAgICAgdmFyIGluc3RhbmNlID0gcHJldmlvdXMuaW5zdGFuY2U7XHJcbiAgICAgICAgdmFyIF9hID0gaW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKSwgcGFyZW50Vk5vZGVfMSA9IF9hLnBhcmVudFZOb2RlLCBub2RlID0gX2EuZG5vZGU7XHJcbiAgICAgICAgdmFyIHByZXZpb3VzUmVuZGVyZWQgPSBub2RlID8gbm9kZS5yZW5kZXJlZCA6IHByZXZpb3VzLnJlbmRlcmVkO1xyXG4gICAgICAgIHZhciBpbnN0YW5jZURhdGEgPSBleHBvcnRzLndpZGdldEluc3RhbmNlTWFwLmdldChpbnN0YW5jZSk7XHJcbiAgICAgICAgaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9IHRydWU7XHJcbiAgICAgICAgaW5zdGFuY2UuX19zZXRDb3JlUHJvcGVydGllc19fKGRub2RlLmNvcmVQcm9wZXJ0aWVzKTtcclxuICAgICAgICBpbnN0YW5jZS5fX3NldENoaWxkcmVuX18oZG5vZGUuY2hpbGRyZW4pO1xyXG4gICAgICAgIGluc3RhbmNlLl9fc2V0UHJvcGVydGllc19fKGRub2RlLnByb3BlcnRpZXMpO1xyXG4gICAgICAgIGRub2RlLmluc3RhbmNlID0gaW5zdGFuY2U7XHJcbiAgICAgICAgaWYgKGluc3RhbmNlRGF0YS5kaXJ0eSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB2YXIgcmVuZGVyZWQgPSBpbnN0YW5jZS5fX3JlbmRlcl9fKCk7XHJcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgZG5vZGUucmVuZGVyZWQgPSBmaWx0ZXJBbmREZWNvcmF0ZUNoaWxkcmVuKHJlbmRlcmVkLCBpbnN0YW5jZSk7XHJcbiAgICAgICAgICAgIHVwZGF0ZUNoaWxkcmVuKHBhcmVudFZOb2RlXzEsIHByZXZpb3VzUmVuZGVyZWQsIGRub2RlLnJlbmRlcmVkLCBpbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLnJlbmRlcmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBkbm9kZS5yZW5kZXJlZCA9IHByZXZpb3VzUmVuZGVyZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGluc3RhbmNlTWFwLnNldChpbnN0YW5jZSwgeyBkbm9kZTogZG5vZGUsIHBhcmVudFZOb2RlOiBwYXJlbnRWTm9kZV8xIH0pO1xyXG4gICAgICAgIGluc3RhbmNlRGF0YS5ub2RlSGFuZGxlci5hZGRSb290KCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBpZiAocHJldmlvdXMgPT09IGRub2RlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGRvbU5vZGVfMiA9IChkbm9kZS5kb21Ob2RlID0gcHJldmlvdXMuZG9tTm9kZSk7XHJcbiAgICAgICAgdmFyIHRleHRVcGRhdGVkID0gZmFsc2U7XHJcbiAgICAgICAgdmFyIHVwZGF0ZWQgPSBmYWxzZTtcclxuICAgICAgICBpZiAoIWRub2RlLnRhZyAmJiB0eXBlb2YgZG5vZGUudGV4dCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgaWYgKGRub2RlLnRleHQgIT09IHByZXZpb3VzLnRleHQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBuZXdEb21Ob2RlID0gZG9tTm9kZV8yLm93bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZG5vZGUudGV4dCk7XHJcbiAgICAgICAgICAgICAgICBkb21Ob2RlXzIucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobmV3RG9tTm9kZSwgZG9tTm9kZV8yKTtcclxuICAgICAgICAgICAgICAgIGRub2RlLmRvbU5vZGUgPSBuZXdEb21Ob2RlO1xyXG4gICAgICAgICAgICAgICAgdGV4dFVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRleHRVcGRhdGVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoZG5vZGUudGFnICYmIGRub2RlLnRhZy5sYXN0SW5kZXhPZignc3ZnJywgMCkgPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHByb2plY3Rpb25PcHRpb25zID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgcHJvamVjdGlvbk9wdGlvbnMsIHsgbmFtZXNwYWNlOiBOQU1FU1BBQ0VfU1ZHIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwcmV2aW91cy5jaGlsZHJlbiAhPT0gZG5vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IGZpbHRlckFuZERlY29yYXRlQ2hpbGRyZW4oZG5vZGUuY2hpbGRyZW4sIHBhcmVudEluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgIGRub2RlLmNoaWxkcmVuID0gY2hpbGRyZW47XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVkID1cclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlbihkbm9kZSwgcHJldmlvdXMuY2hpbGRyZW4sIGNoaWxkcmVuLCBwYXJlbnRJbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpIHx8IHVwZGF0ZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHByZXZpb3VzUHJvcGVydGllc18xID0gYnVpbGRQcmV2aW91c1Byb3BlcnRpZXMoZG9tTm9kZV8yLCBwcmV2aW91cywgZG5vZGUpO1xyXG4gICAgICAgICAgICBpZiAoZG5vZGUuYXR0cmlidXRlcyAmJiBkbm9kZS5ldmVudHMpIHtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXMoZG9tTm9kZV8yLCBwcmV2aW91c1Byb3BlcnRpZXNfMS5hdHRyaWJ1dGVzLCBkbm9kZS5hdHRyaWJ1dGVzLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVkID1cclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVQcm9wZXJ0aWVzKGRvbU5vZGVfMiwgcHJldmlvdXNQcm9wZXJ0aWVzXzEucHJvcGVydGllcywgZG5vZGUucHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMsIGZhbHNlKSB8fCB1cGRhdGVkO1xyXG4gICAgICAgICAgICAgICAgcmVtb3ZlT3JwaGFuZWRFdmVudHMoZG9tTm9kZV8yLCBwcmV2aW91c1Byb3BlcnRpZXNfMS5ldmVudHMsIGRub2RlLmV2ZW50cywgcHJvamVjdGlvbk9wdGlvbnMsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGV2ZW50c18yID0gZG5vZGUuZXZlbnRzO1xyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZXZlbnRzXzIpLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlRXZlbnQoZG9tTm9kZV8yLCBldmVudCwgZXZlbnRzXzJbZXZlbnRdLCBwcm9qZWN0aW9uT3B0aW9ucywgZG5vZGUucHJvcGVydGllcy5iaW5kLCBwcmV2aW91c1Byb3BlcnRpZXNfMS5ldmVudHNbZXZlbnRdKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdXBkYXRlZCA9XHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlUHJvcGVydGllcyhkb21Ob2RlXzIsIHByZXZpb3VzUHJvcGVydGllc18xLnByb3BlcnRpZXMsIGRub2RlLnByb3BlcnRpZXMsIHByb2plY3Rpb25PcHRpb25zKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChkbm9kZS5wcm9wZXJ0aWVzLmtleSAhPT0gbnVsbCAmJiBkbm9kZS5wcm9wZXJ0aWVzLmtleSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaW5zdGFuY2VEYXRhID0gZXhwb3J0cy53aWRnZXRJbnN0YW5jZU1hcC5nZXQocGFyZW50SW5zdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VEYXRhLm5vZGVIYW5kbGVyLmFkZChkb21Ob2RlXzIsIFwiXCIgKyBkbm9kZS5wcm9wZXJ0aWVzLmtleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHVwZGF0ZWQgJiYgZG5vZGUucHJvcGVydGllcyAmJiBkbm9kZS5wcm9wZXJ0aWVzLnVwZGF0ZUFuaW1hdGlvbikge1xyXG4gICAgICAgICAgICBkbm9kZS5wcm9wZXJ0aWVzLnVwZGF0ZUFuaW1hdGlvbihkb21Ob2RlXzIsIGRub2RlLnByb3BlcnRpZXMsIHByZXZpb3VzLnByb3BlcnRpZXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBhZGREZWZlcnJlZFByb3BlcnRpZXModm5vZGUsIHByb2plY3Rpb25PcHRpb25zKSB7XHJcbiAgICAvLyB0cmFuc2ZlciBhbnkgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBwYXNzZWQgLSBhcyB0aGVzZSBtdXN0IGJlIGRlY29yYXRlZCBwcm9wZXJ0aWVzXHJcbiAgICB2bm9kZS5kZWNvcmF0ZWREZWZlcnJlZFByb3BlcnRpZXMgPSB2bm9kZS5wcm9wZXJ0aWVzO1xyXG4gICAgdmFyIHByb3BlcnRpZXMgPSB2bm9kZS5kZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayghIXZub2RlLmluc2VydGVkKTtcclxuICAgIHZhciBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XHJcbiAgICB2bm9kZS5wcm9wZXJ0aWVzID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgcHJvcGVydGllcywgdm5vZGUuZGVjb3JhdGVkRGVmZXJyZWRQcm9wZXJ0aWVzKTtcclxuICAgIHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLnB1c2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBwcm9wZXJ0aWVzID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgdm5vZGUuZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2soISF2bm9kZS5pbnNlcnRlZCksIHZub2RlLmRlY29yYXRlZERlZmVycmVkUHJvcGVydGllcyk7XHJcbiAgICAgICAgdXBkYXRlUHJvcGVydGllcyh2bm9kZS5kb21Ob2RlLCB2bm9kZS5wcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgdm5vZGUucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XHJcbiAgICB9KTtcclxufVxyXG5mdW5jdGlvbiBydW5EZWZlcnJlZFJlbmRlckNhbGxiYWNrcyhwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgdmFyIHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgIGlmIChwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcclxuICAgICAgICBpZiAocHJvamVjdGlvbk9wdGlvbnMuc3luYykge1xyXG4gICAgICAgICAgICB3aGlsZSAocHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5zaGlmdCgpO1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZ2xvYmFsXzEuZGVmYXVsdC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHJ1bkFmdGVyUmVuZGVyQ2FsbGJhY2tzKHByb2plY3Rpb25PcHRpb25zKSB7XHJcbiAgICB2YXIgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xyXG4gICAgaWYgKHByb2plY3Rpb25PcHRpb25zLnN5bmMpIHtcclxuICAgICAgICB3aGlsZSAocHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKGdsb2JhbF8xLmRlZmF1bHQucmVxdWVzdElkbGVDYWxsYmFjaykge1xyXG4gICAgICAgICAgICBnbG9iYWxfMS5kZWZhdWx0LnJlcXVlc3RJZGxlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5zaGlmdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBzY2hlZHVsZVJlbmRlcihwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgdmFyIHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgIGlmIChwcm9qZWN0aW9uT3B0aW9ucy5zeW5jKSB7XHJcbiAgICAgICAgcmVuZGVyKHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHByb2plY3RvclN0YXRlLnJlbmRlclNjaGVkdWxlZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcHJvamVjdG9yU3RhdGUucmVuZGVyU2NoZWR1bGVkID0gZ2xvYmFsXzEuZGVmYXVsdC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZW5kZXIocHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHJlbmRlcihwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgdmFyIHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgIHByb2plY3RvclN0YXRlLnJlbmRlclNjaGVkdWxlZCA9IHVuZGVmaW5lZDtcclxuICAgIHZhciByZW5kZXJRdWV1ZSA9IHByb2plY3RvclN0YXRlLnJlbmRlclF1ZXVlO1xyXG4gICAgdmFyIHJlbmRlcnMgPSB0c2xpYl8xLl9fc3ByZWFkKHJlbmRlclF1ZXVlKTtcclxuICAgIHByb2plY3RvclN0YXRlLnJlbmRlclF1ZXVlID0gW107XHJcbiAgICByZW5kZXJzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEuZGVwdGggLSBiLmRlcHRoOyB9KTtcclxuICAgIHZhciBwcmV2aW91c2x5UmVuZGVyZWQgPSBbXTtcclxuICAgIHdoaWxlIChyZW5kZXJzLmxlbmd0aCkge1xyXG4gICAgICAgIHZhciBpbnN0YW5jZSA9IHJlbmRlcnMuc2hpZnQoKS5pbnN0YW5jZTtcclxuICAgICAgICBpZiAoaW5zdGFuY2VNYXAuaGFzKGluc3RhbmNlKSAmJiBwcmV2aW91c2x5UmVuZGVyZWQuaW5kZXhPZihpbnN0YW5jZSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHByZXZpb3VzbHlSZW5kZXJlZC5wdXNoKGluc3RhbmNlKTtcclxuICAgICAgICAgICAgdmFyIF9hID0gaW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKSwgcGFyZW50Vk5vZGUgPSBfYS5wYXJlbnRWTm9kZSwgZG5vZGUgPSBfYS5kbm9kZTtcclxuICAgICAgICAgICAgdmFyIGluc3RhbmNlRGF0YSA9IGV4cG9ydHMud2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKTtcclxuICAgICAgICAgICAgdXBkYXRlRG9tKGRub2RlLCB0b0ludGVybmFsV05vZGUoaW5zdGFuY2UsIGluc3RhbmNlRGF0YSksIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRWTm9kZSwgaW5zdGFuY2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJ1bkFmdGVyUmVuZGVyQ2FsbGJhY2tzKHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgIHJ1bkRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzKHByb2plY3Rpb25PcHRpb25zKTtcclxufVxyXG5leHBvcnRzLmRvbSA9IHtcclxuICAgIGFwcGVuZDogZnVuY3Rpb24gKHBhcmVudE5vZGUsIGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgICAgIGlmIChwcm9qZWN0aW9uT3B0aW9ucyA9PT0gdm9pZCAwKSB7IHByb2plY3Rpb25PcHRpb25zID0ge307IH1cclxuICAgICAgICB2YXIgaW5zdGFuY2VEYXRhID0gZXhwb3J0cy53aWRnZXRJbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpO1xyXG4gICAgICAgIHZhciBmaW5hbFByb2plY3Rvck9wdGlvbnMgPSBnZXRQcm9qZWN0aW9uT3B0aW9ucyhwcm9qZWN0aW9uT3B0aW9ucywgaW5zdGFuY2UpO1xyXG4gICAgICAgIHZhciBwcm9qZWN0b3JTdGF0ZSA9IHtcclxuICAgICAgICAgICAgYWZ0ZXJSZW5kZXJDYWxsYmFja3M6IFtdLFxyXG4gICAgICAgICAgICBkZWZlcnJlZFJlbmRlckNhbGxiYWNrczogW10sXHJcbiAgICAgICAgICAgIG5vZGVNYXA6IG5ldyBXZWFrTWFwXzEuZGVmYXVsdCgpLFxyXG4gICAgICAgICAgICByZW5kZXJTY2hlZHVsZWQ6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgcmVuZGVyUXVldWU6IFtdLFxyXG4gICAgICAgICAgICBtZXJnZTogcHJvamVjdGlvbk9wdGlvbnMubWVyZ2UgfHwgZmFsc2UsXHJcbiAgICAgICAgICAgIG1lcmdlRWxlbWVudDogcHJvamVjdGlvbk9wdGlvbnMubWVyZ2VFbGVtZW50XHJcbiAgICAgICAgfTtcclxuICAgICAgICBwcm9qZWN0b3JTdGF0ZU1hcC5zZXQoaW5zdGFuY2UsIHByb2plY3RvclN0YXRlKTtcclxuICAgICAgICBmaW5hbFByb2plY3Rvck9wdGlvbnMucm9vdE5vZGUgPSBwYXJlbnROb2RlO1xyXG4gICAgICAgIHZhciBwYXJlbnRWTm9kZSA9IHRvUGFyZW50Vk5vZGUoZmluYWxQcm9qZWN0b3JPcHRpb25zLnJvb3ROb2RlKTtcclxuICAgICAgICB2YXIgbm9kZSA9IHRvSW50ZXJuYWxXTm9kZShpbnN0YW5jZSwgaW5zdGFuY2VEYXRhKTtcclxuICAgICAgICBpbnN0YW5jZU1hcC5zZXQoaW5zdGFuY2UsIHsgZG5vZGU6IG5vZGUsIHBhcmVudFZOb2RlOiBwYXJlbnRWTm9kZSB9KTtcclxuICAgICAgICBpbnN0YW5jZURhdGEuaW52YWxpZGF0ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLmRpcnR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9qZWN0b3JTdGF0ZS5yZW5kZXJRdWV1ZS5wdXNoKHsgaW5zdGFuY2U6IGluc3RhbmNlLCBkZXB0aDogZmluYWxQcm9qZWN0b3JPcHRpb25zLmRlcHRoIH0pO1xyXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVSZW5kZXIoZmluYWxQcm9qZWN0b3JPcHRpb25zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdXBkYXRlRG9tKG5vZGUsIG5vZGUsIGZpbmFsUHJvamVjdG9yT3B0aW9ucywgcGFyZW50Vk5vZGUsIGluc3RhbmNlKTtcclxuICAgICAgICBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5wdXNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLm9uQXR0YWNoKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcnVuRGVmZXJyZWRSZW5kZXJDYWxsYmFja3MoZmluYWxQcm9qZWN0b3JPcHRpb25zKTtcclxuICAgICAgICBydW5BZnRlclJlbmRlckNhbGxiYWNrcyhmaW5hbFByb2plY3Rvck9wdGlvbnMpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGRvbU5vZGU6IGZpbmFsUHJvamVjdG9yT3B0aW9ucy5yb290Tm9kZVxyXG4gICAgICAgIH07XHJcbiAgICB9LFxyXG4gICAgY3JlYXRlOiBmdW5jdGlvbiAoaW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLCBpbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgfSxcclxuICAgIG1lcmdlOiBmdW5jdGlvbiAoZWxlbWVudCwgaW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKSB7XHJcbiAgICAgICAgaWYgKHByb2plY3Rpb25PcHRpb25zID09PSB2b2lkIDApIHsgcHJvamVjdGlvbk9wdGlvbnMgPSB7fTsgfVxyXG4gICAgICAgIHByb2plY3Rpb25PcHRpb25zLm1lcmdlID0gdHJ1ZTtcclxuICAgICAgICBwcm9qZWN0aW9uT3B0aW9ucy5tZXJnZUVsZW1lbnQgPSBlbGVtZW50O1xyXG4gICAgICAgIHZhciBwcm9qZWN0aW9uID0gdGhpcy5hcHBlbmQoZWxlbWVudC5wYXJlbnROb2RlLCBpbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIHZhciBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChpbnN0YW5jZSk7XHJcbiAgICAgICAgcHJvamVjdG9yU3RhdGUubWVyZ2UgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gcHJvamVjdGlvbjtcclxuICAgIH1cclxufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS92ZG9tLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby93aWRnZXQtY29yZS92ZG9tLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIi8qXG5cdE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG5cdEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcbiovXG4vLyBjc3MgYmFzZSBjb2RlLCBpbmplY3RlZCBieSB0aGUgY3NzLWxvYWRlclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih1c2VTb3VyY2VNYXApIHtcblx0dmFyIGxpc3QgPSBbXTtcblxuXHQvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXG5cdGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcblx0XHRcdHZhciBjb250ZW50ID0gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtLCB1c2VTb3VyY2VNYXApO1xuXHRcdFx0aWYoaXRlbVsyXSkge1xuXHRcdFx0XHRyZXR1cm4gXCJAbWVkaWEgXCIgKyBpdGVtWzJdICsgXCJ7XCIgKyBjb250ZW50ICsgXCJ9XCI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gY29udGVudDtcblx0XHRcdH1cblx0XHR9KS5qb2luKFwiXCIpO1xuXHR9O1xuXG5cdC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG5cdGxpc3QuaSA9IGZ1bmN0aW9uKG1vZHVsZXMsIG1lZGlhUXVlcnkpIHtcblx0XHRpZih0eXBlb2YgbW9kdWxlcyA9PT0gXCJzdHJpbmdcIilcblx0XHRcdG1vZHVsZXMgPSBbW251bGwsIG1vZHVsZXMsIFwiXCJdXTtcblx0XHR2YXIgYWxyZWFkeUltcG9ydGVkTW9kdWxlcyA9IHt9O1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgaWQgPSB0aGlzW2ldWzBdO1xuXHRcdFx0aWYodHlwZW9mIGlkID09PSBcIm51bWJlclwiKVxuXHRcdFx0XHRhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG5cdFx0fVxuXHRcdGZvcihpID0gMDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBpdGVtID0gbW9kdWxlc1tpXTtcblx0XHRcdC8vIHNraXAgYWxyZWFkeSBpbXBvcnRlZCBtb2R1bGVcblx0XHRcdC8vIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IDEwMCUgcGVyZmVjdCBmb3Igd2VpcmQgbWVkaWEgcXVlcnkgY29tYmluYXRpb25zXG5cdFx0XHQvLyAgd2hlbiBhIG1vZHVsZSBpcyBpbXBvcnRlZCBtdWx0aXBsZSB0aW1lcyB3aXRoIGRpZmZlcmVudCBtZWRpYSBxdWVyaWVzLlxuXHRcdFx0Ly8gIEkgaG9wZSB0aGlzIHdpbGwgbmV2ZXIgb2NjdXIgKEhleSB0aGlzIHdheSB3ZSBoYXZlIHNtYWxsZXIgYnVuZGxlcylcblx0XHRcdGlmKHR5cGVvZiBpdGVtWzBdICE9PSBcIm51bWJlclwiIHx8ICFhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XG5cdFx0XHRcdGlmKG1lZGlhUXVlcnkgJiYgIWl0ZW1bMl0pIHtcblx0XHRcdFx0XHRpdGVtWzJdID0gbWVkaWFRdWVyeTtcblx0XHRcdFx0fSBlbHNlIGlmKG1lZGlhUXVlcnkpIHtcblx0XHRcdFx0XHRpdGVtWzJdID0gXCIoXCIgKyBpdGVtWzJdICsgXCIpIGFuZCAoXCIgKyBtZWRpYVF1ZXJ5ICsgXCIpXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0bGlzdC5wdXNoKGl0ZW0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0cmV0dXJuIGxpc3Q7XG59O1xuXG5mdW5jdGlvbiBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0sIHVzZVNvdXJjZU1hcCkge1xuXHR2YXIgY29udGVudCA9IGl0ZW1bMV0gfHwgJyc7XG5cdHZhciBjc3NNYXBwaW5nID0gaXRlbVszXTtcblx0aWYgKCFjc3NNYXBwaW5nKSB7XG5cdFx0cmV0dXJuIGNvbnRlbnQ7XG5cdH1cblxuXHRpZiAodXNlU291cmNlTWFwICYmIHR5cGVvZiBidG9hID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0dmFyIHNvdXJjZU1hcHBpbmcgPSB0b0NvbW1lbnQoY3NzTWFwcGluZyk7XG5cdFx0dmFyIHNvdXJjZVVSTHMgPSBjc3NNYXBwaW5nLnNvdXJjZXMubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcblx0XHRcdHJldHVybiAnLyojIHNvdXJjZVVSTD0nICsgY3NzTWFwcGluZy5zb3VyY2VSb290ICsgc291cmNlICsgJyAqLydcblx0XHR9KTtcblxuXHRcdHJldHVybiBbY29udGVudF0uY29uY2F0KHNvdXJjZVVSTHMpLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oJ1xcbicpO1xuXHR9XG5cblx0cmV0dXJuIFtjb250ZW50XS5qb2luKCdcXG4nKTtcbn1cblxuLy8gQWRhcHRlZCBmcm9tIGNvbnZlcnQtc291cmNlLW1hcCAoTUlUKVxuZnVuY3Rpb24gdG9Db21tZW50KHNvdXJjZU1hcCkge1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcblx0dmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCkpKSk7XG5cdHZhciBkYXRhID0gJ3NvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LCcgKyBiYXNlNjQ7XG5cblx0cmV0dXJuICcvKiMgJyArIGRhdGEgKyAnICovJztcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJjc3NTZWxlY3RcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiY3NzU2VsZWN0XCJdID0gZmFjdG9yeSgpO1xufSkodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAyNCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBpc1ZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0aWYgKCFpc1ZhbHVlKHZhbHVlKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgbnVsbCBvciB1bmRlZmluZWRcIik7XG5cdHJldHVybiB2YWx1ZTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuKSB7XG5cdGlmICh0eXBlb2YgZm4gIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihmbiArIFwiIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO1xuXHRyZXR1cm4gZm47XG59O1xuXG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNjYpKCkgPyBTeW1ib2wgOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDY3KTtcblxuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGFzc2lnbiAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKVxuICAsIG5vcm1hbGl6ZU9wdHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKVxuICAsIGlzQ2FsbGFibGUgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYyKVxuICAsIGNvbnRhaW5zICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKVxuXG4gICwgZDtcblxuZCA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGRzY3IsIHZhbHVlLyosIG9wdGlvbnMqLykge1xuXHR2YXIgYywgZSwgdywgb3B0aW9ucywgZGVzYztcblx0aWYgKChhcmd1bWVudHMubGVuZ3RoIDwgMikgfHwgKHR5cGVvZiBkc2NyICE9PSAnc3RyaW5nJykpIHtcblx0XHRvcHRpb25zID0gdmFsdWU7XG5cdFx0dmFsdWUgPSBkc2NyO1xuXHRcdGRzY3IgPSBudWxsO1xuXHR9IGVsc2Uge1xuXHRcdG9wdGlvbnMgPSBhcmd1bWVudHNbMl07XG5cdH1cblx0aWYgKGRzY3IgPT0gbnVsbCkge1xuXHRcdGMgPSB3ID0gdHJ1ZTtcblx0XHRlID0gZmFsc2U7XG5cdH0gZWxzZSB7XG5cdFx0YyA9IGNvbnRhaW5zLmNhbGwoZHNjciwgJ2MnKTtcblx0XHRlID0gY29udGFpbnMuY2FsbChkc2NyLCAnZScpO1xuXHRcdHcgPSBjb250YWlucy5jYWxsKGRzY3IsICd3Jyk7XG5cdH1cblxuXHRkZXNjID0geyB2YWx1ZTogdmFsdWUsIGNvbmZpZ3VyYWJsZTogYywgZW51bWVyYWJsZTogZSwgd3JpdGFibGU6IHcgfTtcblx0cmV0dXJuICFvcHRpb25zID8gZGVzYyA6IGFzc2lnbihub3JtYWxpemVPcHRzKG9wdGlvbnMpLCBkZXNjKTtcbn07XG5cbmQuZ3MgPSBmdW5jdGlvbiAoZHNjciwgZ2V0LCBzZXQvKiwgb3B0aW9ucyovKSB7XG5cdHZhciBjLCBlLCBvcHRpb25zLCBkZXNjO1xuXHRpZiAodHlwZW9mIGRzY3IgIT09ICdzdHJpbmcnKSB7XG5cdFx0b3B0aW9ucyA9IHNldDtcblx0XHRzZXQgPSBnZXQ7XG5cdFx0Z2V0ID0gZHNjcjtcblx0XHRkc2NyID0gbnVsbDtcblx0fSBlbHNlIHtcblx0XHRvcHRpb25zID0gYXJndW1lbnRzWzNdO1xuXHR9XG5cdGlmIChnZXQgPT0gbnVsbCkge1xuXHRcdGdldCA9IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmICghaXNDYWxsYWJsZShnZXQpKSB7XG5cdFx0b3B0aW9ucyA9IGdldDtcblx0XHRnZXQgPSBzZXQgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoc2V0ID09IG51bGwpIHtcblx0XHRzZXQgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoIWlzQ2FsbGFibGUoc2V0KSkge1xuXHRcdG9wdGlvbnMgPSBzZXQ7XG5cdFx0c2V0ID0gdW5kZWZpbmVkO1xuXHR9XG5cdGlmIChkc2NyID09IG51bGwpIHtcblx0XHRjID0gdHJ1ZTtcblx0XHRlID0gZmFsc2U7XG5cdH0gZWxzZSB7XG5cdFx0YyA9IGNvbnRhaW5zLmNhbGwoZHNjciwgJ2MnKTtcblx0XHRlID0gY29udGFpbnMuY2FsbChkc2NyLCAnZScpO1xuXHR9XG5cblx0ZGVzYyA9IHsgZ2V0OiBnZXQsIHNldDogc2V0LCBjb25maWd1cmFibGU6IGMsIGVudW1lcmFibGU6IGUgfTtcblx0cmV0dXJuICFvcHRpb25zID8gZGVzYyA6IGFzc2lnbihub3JtYWxpemVPcHRzKG9wdGlvbnMpLCBkZXNjKTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBfdW5kZWZpbmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNykoKTsgLy8gU3VwcG9ydCBFUzMgZW5naW5lc1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWwpIHtcbiByZXR1cm4gKHZhbCAhPT0gX3VuZGVmaW5lZCkgJiYgKHZhbCAhPT0gbnVsbCk7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0dHJ1ZUZ1bmM6IGZ1bmN0aW9uIHRydWVGdW5jKCl7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cdGZhbHNlRnVuYzogZnVuY3Rpb24gZmFsc2VGdW5jKCl7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xuXG4vKioqLyB9KSxcbi8qIDYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KSgpXG5cdD8gT2JqZWN0LnNldFByb3RvdHlwZU9mXG5cdDogX193ZWJwYWNrX3JlcXVpcmVfXygyMCk7XG5cblxuLyoqKi8gfSksXG4vKiA3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBvYmpUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdcbiAgLCBpZCA9IG9ialRvU3RyaW5nLmNhbGwoXG5cdChmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIGFyZ3VtZW50cztcblx0fSkoKVxuKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0cmV0dXJuIG9ialRvU3RyaW5nLmNhbGwodmFsdWUpID09PSBpZDtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBvYmpUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsIGlkID0gb2JqVG9TdHJpbmcuY2FsbChcIlwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0cmV0dXJuIChcblx0XHR0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHxcblx0XHQodmFsdWUgJiZcblx0XHRcdHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuXHRcdFx0KHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nIHx8IG9ialRvU3RyaW5nLmNhbGwodmFsdWUpID09PSBpZCkpIHx8XG5cdFx0ZmFsc2Vcblx0KTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbi8vVHlwZXMgb2YgZWxlbWVudHMgZm91bmQgaW4gdGhlIERPTVxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdFRleHQ6IFwidGV4dFwiLCAvL1RleHRcblx0RGlyZWN0aXZlOiBcImRpcmVjdGl2ZVwiLCAvLzw/IC4uLiA/PlxuXHRDb21tZW50OiBcImNvbW1lbnRcIiwgLy88IS0tIC4uLiAtLT5cblx0U2NyaXB0OiBcInNjcmlwdFwiLCAvLzxzY3JpcHQ+IHRhZ3Ncblx0U3R5bGU6IFwic3R5bGVcIiwgLy88c3R5bGU+IHRhZ3Ncblx0VGFnOiBcInRhZ1wiLCAvL0FueSB0YWdcblx0Q0RBVEE6IFwiY2RhdGFcIiwgLy88IVtDREFUQVsgLi4uIF1dPlxuXHREb2N0eXBlOiBcImRvY3R5cGVcIixcblxuXHRpc1RhZzogZnVuY3Rpb24oZWxlbSl7XG5cdFx0cmV0dXJuIGVsZW0udHlwZSA9PT0gXCJ0YWdcIiB8fCBlbGVtLnR5cGUgPT09IFwic2NyaXB0XCIgfHwgZWxlbS50eXBlID09PSBcInN0eWxlXCI7XG5cdH1cbn07XG5cblxuLyoqKi8gfSksXG4vKiAxMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNTcpKClcblx0PyBPYmplY3QuYXNzaWduXG5cdDogX193ZWJwYWNrX3JlcXVpcmVfXyg1OCk7XG5cblxuLyoqKi8gfSksXG4vKiAxMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNjMpKClcblx0PyBTdHJpbmcucHJvdG90eXBlLmNvbnRhaW5zXG5cdDogX193ZWJwYWNrX3JlcXVpcmVfXyg2NCk7XG5cblxuLyoqKi8gfSksXG4vKiAxMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgY2xlYXIgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KVxuICAsIGFzc2lnbiAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMClcbiAgLCBjYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSlcbiAgLCB2YWx1ZSAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMClcbiAgLCBkICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMylcbiAgLCBhdXRvQmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oNzQpXG4gICwgU3ltYm9sICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHksIGRlZmluZVByb3BlcnRpZXMgPSBPYmplY3QuZGVmaW5lUHJvcGVydGllcywgSXRlcmF0b3I7XG5cbm1vZHVsZS5leHBvcnRzID0gSXRlcmF0b3IgPSBmdW5jdGlvbiAobGlzdCwgY29udGV4dCkge1xuXHRpZiAoISh0aGlzIGluc3RhbmNlb2YgSXRlcmF0b3IpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ29uc3RydWN0b3IgcmVxdWlyZXMgJ25ldydcIik7XG5cdGRlZmluZVByb3BlcnRpZXModGhpcywge1xuXHRcdF9fbGlzdF9fOiBkKFwid1wiLCB2YWx1ZShsaXN0KSksXG5cdFx0X19jb250ZXh0X186IGQoXCJ3XCIsIGNvbnRleHQpLFxuXHRcdF9fbmV4dEluZGV4X186IGQoXCJ3XCIsIDApXG5cdH0pO1xuXHRpZiAoIWNvbnRleHQpIHJldHVybjtcblx0Y2FsbGFibGUoY29udGV4dC5vbik7XG5cdGNvbnRleHQub24oXCJfYWRkXCIsIHRoaXMuX29uQWRkKTtcblx0Y29udGV4dC5vbihcIl9kZWxldGVcIiwgdGhpcy5fb25EZWxldGUpO1xuXHRjb250ZXh0Lm9uKFwiX2NsZWFyXCIsIHRoaXMuX29uQ2xlYXIpO1xufTtcblxuLy8gSW50ZXJuYWwgJUl0ZXJhdG9yUHJvdG90eXBlJSBkb2Vzbid0IGV4cG9zZSBpdHMgY29uc3RydWN0b3JcbmRlbGV0ZSBJdGVyYXRvci5wcm90b3R5cGUuY29uc3RydWN0b3I7XG5cbmRlZmluZVByb3BlcnRpZXMoXG5cdEl0ZXJhdG9yLnByb3RvdHlwZSxcblx0YXNzaWduKFxuXHRcdHtcblx0XHRcdF9uZXh0OiBkKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dmFyIGk7XG5cdFx0XHRcdGlmICghdGhpcy5fX2xpc3RfXykgcmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKHRoaXMuX19yZWRvX18pIHtcblx0XHRcdFx0XHRpID0gdGhpcy5fX3JlZG9fXy5zaGlmdCgpO1xuXHRcdFx0XHRcdGlmIChpICE9PSB1bmRlZmluZWQpIHJldHVybiBpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0aGlzLl9fbmV4dEluZGV4X18gPCB0aGlzLl9fbGlzdF9fLmxlbmd0aCkgcmV0dXJuIHRoaXMuX19uZXh0SW5kZXhfXysrO1xuXHRcdFx0XHR0aGlzLl91bkJpbmQoKTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH0pLFxuXHRcdFx0bmV4dDogZChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9jcmVhdGVSZXN1bHQodGhpcy5fbmV4dCgpKTtcblx0XHRcdH0pLFxuXHRcdFx0X2NyZWF0ZVJlc3VsdDogZChmdW5jdGlvbiAoaSkge1xuXHRcdFx0XHRpZiAoaSA9PT0gdW5kZWZpbmVkKSByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG5cdFx0XHRcdHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogdGhpcy5fcmVzb2x2ZShpKSB9O1xuXHRcdFx0fSksXG5cdFx0XHRfcmVzb2x2ZTogZChmdW5jdGlvbiAoaSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fX2xpc3RfX1tpXTtcblx0XHRcdH0pLFxuXHRcdFx0X3VuQmluZDogZChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHRoaXMuX19saXN0X18gPSBudWxsO1xuXHRcdFx0XHRkZWxldGUgdGhpcy5fX3JlZG9fXztcblx0XHRcdFx0aWYgKCF0aGlzLl9fY29udGV4dF9fKSByZXR1cm47XG5cdFx0XHRcdHRoaXMuX19jb250ZXh0X18ub2ZmKFwiX2FkZFwiLCB0aGlzLl9vbkFkZCk7XG5cdFx0XHRcdHRoaXMuX19jb250ZXh0X18ub2ZmKFwiX2RlbGV0ZVwiLCB0aGlzLl9vbkRlbGV0ZSk7XG5cdFx0XHRcdHRoaXMuX19jb250ZXh0X18ub2ZmKFwiX2NsZWFyXCIsIHRoaXMuX29uQ2xlYXIpO1xuXHRcdFx0XHR0aGlzLl9fY29udGV4dF9fID0gbnVsbDtcblx0XHRcdH0pLFxuXHRcdFx0dG9TdHJpbmc6IGQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gXCJbb2JqZWN0IFwiICsgKHRoaXNbU3ltYm9sLnRvU3RyaW5nVGFnXSB8fCBcIk9iamVjdFwiKSArIFwiXVwiO1xuXHRcdFx0fSlcblx0XHR9LFxuXHRcdGF1dG9CaW5kKHtcblx0XHRcdF9vbkFkZDogZChmdW5jdGlvbiAoaW5kZXgpIHtcblx0XHRcdFx0aWYgKGluZGV4ID49IHRoaXMuX19uZXh0SW5kZXhfXykgcmV0dXJuO1xuXHRcdFx0XHQrK3RoaXMuX19uZXh0SW5kZXhfXztcblx0XHRcdFx0aWYgKCF0aGlzLl9fcmVkb19fKSB7XG5cdFx0XHRcdFx0ZGVmaW5lUHJvcGVydHkodGhpcywgXCJfX3JlZG9fX1wiLCBkKFwiY1wiLCBbaW5kZXhdKSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX19yZWRvX18uZm9yRWFjaChmdW5jdGlvbiAocmVkbywgaSkge1xuXHRcdFx0XHRcdGlmIChyZWRvID49IGluZGV4KSB0aGlzLl9fcmVkb19fW2ldID0gKytyZWRvO1xuXHRcdFx0XHR9LCB0aGlzKTtcblx0XHRcdFx0dGhpcy5fX3JlZG9fXy5wdXNoKGluZGV4KTtcblx0XHRcdH0pLFxuXHRcdFx0X29uRGVsZXRlOiBkKGZ1bmN0aW9uIChpbmRleCkge1xuXHRcdFx0XHR2YXIgaTtcblx0XHRcdFx0aWYgKGluZGV4ID49IHRoaXMuX19uZXh0SW5kZXhfXykgcmV0dXJuO1xuXHRcdFx0XHQtLXRoaXMuX19uZXh0SW5kZXhfXztcblx0XHRcdFx0aWYgKCF0aGlzLl9fcmVkb19fKSByZXR1cm47XG5cdFx0XHRcdGkgPSB0aGlzLl9fcmVkb19fLmluZGV4T2YoaW5kZXgpO1xuXHRcdFx0XHRpZiAoaSAhPT0gLTEpIHRoaXMuX19yZWRvX18uc3BsaWNlKGksIDEpO1xuXHRcdFx0XHR0aGlzLl9fcmVkb19fLmZvckVhY2goZnVuY3Rpb24gKHJlZG8sIGopIHtcblx0XHRcdFx0XHRpZiAocmVkbyA+IGluZGV4KSB0aGlzLl9fcmVkb19fW2pdID0gLS1yZWRvO1xuXHRcdFx0XHR9LCB0aGlzKTtcblx0XHRcdH0pLFxuXHRcdFx0X29uQ2xlYXI6IGQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRpZiAodGhpcy5fX3JlZG9fXykgY2xlYXIuY2FsbCh0aGlzLl9fcmVkb19fKTtcblx0XHRcdFx0dGhpcy5fX25leHRJbmRleF9fID0gMDtcblx0XHRcdH0pXG5cdFx0fSlcblx0KVxuKTtcblxuZGVmaW5lUHJvcGVydHkoXG5cdEl0ZXJhdG9yLnByb3RvdHlwZSxcblx0U3ltYm9sLml0ZXJhdG9yLFxuXHRkKGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcztcblx0fSlcbik7XG5cblxuLyoqKi8gfSksXG4vKiAxMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcImFtcFwiOlwiJlwiLFwiYXBvc1wiOlwiJ1wiLFwiZ3RcIjpcIj5cIixcImx0XCI6XCI8XCIsXCJxdW90XCI6XCJcXFwiXCJ9XG5cbi8qKiovIH0pLFxuLyogMTQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSB7XCJBYWN1dGVcIjpcIsOBXCIsXCJhYWN1dGVcIjpcIsOhXCIsXCJBYnJldmVcIjpcIsSCXCIsXCJhYnJldmVcIjpcIsSDXCIsXCJhY1wiOlwi4oi+XCIsXCJhY2RcIjpcIuKIv1wiLFwiYWNFXCI6XCLiiL7Ms1wiLFwiQWNpcmNcIjpcIsOCXCIsXCJhY2lyY1wiOlwiw6JcIixcImFjdXRlXCI6XCLCtFwiLFwiQWN5XCI6XCLQkFwiLFwiYWN5XCI6XCLQsFwiLFwiQUVsaWdcIjpcIsOGXCIsXCJhZWxpZ1wiOlwiw6ZcIixcImFmXCI6XCLigaFcIixcIkFmclwiOlwi8J2UhFwiLFwiYWZyXCI6XCLwnZSeXCIsXCJBZ3JhdmVcIjpcIsOAXCIsXCJhZ3JhdmVcIjpcIsOgXCIsXCJhbGVmc3ltXCI6XCLihLVcIixcImFsZXBoXCI6XCLihLVcIixcIkFscGhhXCI6XCLOkVwiLFwiYWxwaGFcIjpcIs6xXCIsXCJBbWFjclwiOlwixIBcIixcImFtYWNyXCI6XCLEgVwiLFwiYW1hbGdcIjpcIuKov1wiLFwiYW1wXCI6XCImXCIsXCJBTVBcIjpcIiZcIixcImFuZGFuZFwiOlwi4qmVXCIsXCJBbmRcIjpcIuKpk1wiLFwiYW5kXCI6XCLiiKdcIixcImFuZGRcIjpcIuKpnFwiLFwiYW5kc2xvcGVcIjpcIuKpmFwiLFwiYW5kdlwiOlwi4qmaXCIsXCJhbmdcIjpcIuKIoFwiLFwiYW5nZVwiOlwi4qakXCIsXCJhbmdsZVwiOlwi4oigXCIsXCJhbmdtc2RhYVwiOlwi4qaoXCIsXCJhbmdtc2RhYlwiOlwi4qapXCIsXCJhbmdtc2RhY1wiOlwi4qaqXCIsXCJhbmdtc2RhZFwiOlwi4qarXCIsXCJhbmdtc2RhZVwiOlwi4qasXCIsXCJhbmdtc2RhZlwiOlwi4qatXCIsXCJhbmdtc2RhZ1wiOlwi4qauXCIsXCJhbmdtc2RhaFwiOlwi4qavXCIsXCJhbmdtc2RcIjpcIuKIoVwiLFwiYW5ncnRcIjpcIuKIn1wiLFwiYW5ncnR2YlwiOlwi4oq+XCIsXCJhbmdydHZiZFwiOlwi4qadXCIsXCJhbmdzcGhcIjpcIuKIolwiLFwiYW5nc3RcIjpcIsOFXCIsXCJhbmd6YXJyXCI6XCLijbxcIixcIkFvZ29uXCI6XCLEhFwiLFwiYW9nb25cIjpcIsSFXCIsXCJBb3BmXCI6XCLwnZS4XCIsXCJhb3BmXCI6XCLwnZWSXCIsXCJhcGFjaXJcIjpcIuKpr1wiLFwiYXBcIjpcIuKJiFwiLFwiYXBFXCI6XCLiqbBcIixcImFwZVwiOlwi4omKXCIsXCJhcGlkXCI6XCLiiYtcIixcImFwb3NcIjpcIidcIixcIkFwcGx5RnVuY3Rpb25cIjpcIuKBoVwiLFwiYXBwcm94XCI6XCLiiYhcIixcImFwcHJveGVxXCI6XCLiiYpcIixcIkFyaW5nXCI6XCLDhVwiLFwiYXJpbmdcIjpcIsOlXCIsXCJBc2NyXCI6XCLwnZKcXCIsXCJhc2NyXCI6XCLwnZK2XCIsXCJBc3NpZ25cIjpcIuKJlFwiLFwiYXN0XCI6XCIqXCIsXCJhc3ltcFwiOlwi4omIXCIsXCJhc3ltcGVxXCI6XCLiiY1cIixcIkF0aWxkZVwiOlwiw4NcIixcImF0aWxkZVwiOlwiw6NcIixcIkF1bWxcIjpcIsOEXCIsXCJhdW1sXCI6XCLDpFwiLFwiYXdjb25pbnRcIjpcIuKIs1wiLFwiYXdpbnRcIjpcIuKokVwiLFwiYmFja2NvbmdcIjpcIuKJjFwiLFwiYmFja2Vwc2lsb25cIjpcIs+2XCIsXCJiYWNrcHJpbWVcIjpcIuKAtVwiLFwiYmFja3NpbVwiOlwi4oi9XCIsXCJiYWNrc2ltZXFcIjpcIuKLjVwiLFwiQmFja3NsYXNoXCI6XCLiiJZcIixcIkJhcnZcIjpcIuKrp1wiLFwiYmFydmVlXCI6XCLiir1cIixcImJhcndlZFwiOlwi4oyFXCIsXCJCYXJ3ZWRcIjpcIuKMhlwiLFwiYmFyd2VkZ2VcIjpcIuKMhVwiLFwiYmJya1wiOlwi4o61XCIsXCJiYnJrdGJya1wiOlwi4o62XCIsXCJiY29uZ1wiOlwi4omMXCIsXCJCY3lcIjpcItCRXCIsXCJiY3lcIjpcItCxXCIsXCJiZHF1b1wiOlwi4oCeXCIsXCJiZWNhdXNcIjpcIuKItVwiLFwiYmVjYXVzZVwiOlwi4oi1XCIsXCJCZWNhdXNlXCI6XCLiiLVcIixcImJlbXB0eXZcIjpcIuKmsFwiLFwiYmVwc2lcIjpcIs+2XCIsXCJiZXJub3VcIjpcIuKErFwiLFwiQmVybm91bGxpc1wiOlwi4oSsXCIsXCJCZXRhXCI6XCLOklwiLFwiYmV0YVwiOlwizrJcIixcImJldGhcIjpcIuKEtlwiLFwiYmV0d2VlblwiOlwi4omsXCIsXCJCZnJcIjpcIvCdlIVcIixcImJmclwiOlwi8J2Un1wiLFwiYmlnY2FwXCI6XCLii4JcIixcImJpZ2NpcmNcIjpcIuKXr1wiLFwiYmlnY3VwXCI6XCLii4NcIixcImJpZ29kb3RcIjpcIuKogFwiLFwiYmlnb3BsdXNcIjpcIuKogVwiLFwiYmlnb3RpbWVzXCI6XCLiqIJcIixcImJpZ3NxY3VwXCI6XCLiqIZcIixcImJpZ3N0YXJcIjpcIuKYhVwiLFwiYmlndHJpYW5nbGVkb3duXCI6XCLilr1cIixcImJpZ3RyaWFuZ2xldXBcIjpcIuKWs1wiLFwiYmlndXBsdXNcIjpcIuKohFwiLFwiYmlndmVlXCI6XCLii4FcIixcImJpZ3dlZGdlXCI6XCLii4BcIixcImJrYXJvd1wiOlwi4qSNXCIsXCJibGFja2xvemVuZ2VcIjpcIuKnq1wiLFwiYmxhY2tzcXVhcmVcIjpcIuKWqlwiLFwiYmxhY2t0cmlhbmdsZVwiOlwi4pa0XCIsXCJibGFja3RyaWFuZ2xlZG93blwiOlwi4pa+XCIsXCJibGFja3RyaWFuZ2xlbGVmdFwiOlwi4peCXCIsXCJibGFja3RyaWFuZ2xlcmlnaHRcIjpcIuKWuFwiLFwiYmxhbmtcIjpcIuKQo1wiLFwiYmxrMTJcIjpcIuKWklwiLFwiYmxrMTRcIjpcIuKWkVwiLFwiYmxrMzRcIjpcIuKWk1wiLFwiYmxvY2tcIjpcIuKWiFwiLFwiYm5lXCI6XCI94oOlXCIsXCJibmVxdWl2XCI6XCLiiaHig6VcIixcImJOb3RcIjpcIuKrrVwiLFwiYm5vdFwiOlwi4oyQXCIsXCJCb3BmXCI6XCLwnZS5XCIsXCJib3BmXCI6XCLwnZWTXCIsXCJib3RcIjpcIuKKpVwiLFwiYm90dG9tXCI6XCLiiqVcIixcImJvd3RpZVwiOlwi4ouIXCIsXCJib3hib3hcIjpcIuKniVwiLFwiYm94ZGxcIjpcIuKUkFwiLFwiYm94ZExcIjpcIuKVlVwiLFwiYm94RGxcIjpcIuKVllwiLFwiYm94RExcIjpcIuKVl1wiLFwiYm94ZHJcIjpcIuKUjFwiLFwiYm94ZFJcIjpcIuKVklwiLFwiYm94RHJcIjpcIuKVk1wiLFwiYm94RFJcIjpcIuKVlFwiLFwiYm94aFwiOlwi4pSAXCIsXCJib3hIXCI6XCLilZBcIixcImJveGhkXCI6XCLilKxcIixcImJveEhkXCI6XCLilaRcIixcImJveGhEXCI6XCLilaVcIixcImJveEhEXCI6XCLilaZcIixcImJveGh1XCI6XCLilLRcIixcImJveEh1XCI6XCLiladcIixcImJveGhVXCI6XCLilahcIixcImJveEhVXCI6XCLilalcIixcImJveG1pbnVzXCI6XCLiip9cIixcImJveHBsdXNcIjpcIuKKnlwiLFwiYm94dGltZXNcIjpcIuKKoFwiLFwiYm94dWxcIjpcIuKUmFwiLFwiYm94dUxcIjpcIuKVm1wiLFwiYm94VWxcIjpcIuKVnFwiLFwiYm94VUxcIjpcIuKVnVwiLFwiYm94dXJcIjpcIuKUlFwiLFwiYm94dVJcIjpcIuKVmFwiLFwiYm94VXJcIjpcIuKVmVwiLFwiYm94VVJcIjpcIuKVmlwiLFwiYm94dlwiOlwi4pSCXCIsXCJib3hWXCI6XCLilZFcIixcImJveHZoXCI6XCLilLxcIixcImJveHZIXCI6XCLilapcIixcImJveFZoXCI6XCLilatcIixcImJveFZIXCI6XCLilaxcIixcImJveHZsXCI6XCLilKRcIixcImJveHZMXCI6XCLilaFcIixcImJveFZsXCI6XCLilaJcIixcImJveFZMXCI6XCLilaNcIixcImJveHZyXCI6XCLilJxcIixcImJveHZSXCI6XCLilZ5cIixcImJveFZyXCI6XCLilZ9cIixcImJveFZSXCI6XCLilaBcIixcImJwcmltZVwiOlwi4oC1XCIsXCJicmV2ZVwiOlwiy5hcIixcIkJyZXZlXCI6XCLLmFwiLFwiYnJ2YmFyXCI6XCLCplwiLFwiYnNjclwiOlwi8J2St1wiLFwiQnNjclwiOlwi4oSsXCIsXCJic2VtaVwiOlwi4oGPXCIsXCJic2ltXCI6XCLiiL1cIixcImJzaW1lXCI6XCLii41cIixcImJzb2xiXCI6XCLip4VcIixcImJzb2xcIjpcIlxcXFxcIixcImJzb2xoc3ViXCI6XCLin4hcIixcImJ1bGxcIjpcIuKAolwiLFwiYnVsbGV0XCI6XCLigKJcIixcImJ1bXBcIjpcIuKJjlwiLFwiYnVtcEVcIjpcIuKqrlwiLFwiYnVtcGVcIjpcIuKJj1wiLFwiQnVtcGVxXCI6XCLiiY5cIixcImJ1bXBlcVwiOlwi4omPXCIsXCJDYWN1dGVcIjpcIsSGXCIsXCJjYWN1dGVcIjpcIsSHXCIsXCJjYXBhbmRcIjpcIuKphFwiLFwiY2FwYnJjdXBcIjpcIuKpiVwiLFwiY2FwY2FwXCI6XCLiqYtcIixcImNhcFwiOlwi4oipXCIsXCJDYXBcIjpcIuKLklwiLFwiY2FwY3VwXCI6XCLiqYdcIixcImNhcGRvdFwiOlwi4qmAXCIsXCJDYXBpdGFsRGlmZmVyZW50aWFsRFwiOlwi4oWFXCIsXCJjYXBzXCI6XCLiiKnvuIBcIixcImNhcmV0XCI6XCLigYFcIixcImNhcm9uXCI6XCLLh1wiLFwiQ2F5bGV5c1wiOlwi4oStXCIsXCJjY2Fwc1wiOlwi4qmNXCIsXCJDY2Fyb25cIjpcIsSMXCIsXCJjY2Fyb25cIjpcIsSNXCIsXCJDY2VkaWxcIjpcIsOHXCIsXCJjY2VkaWxcIjpcIsOnXCIsXCJDY2lyY1wiOlwixIhcIixcImNjaXJjXCI6XCLEiVwiLFwiQ2NvbmludFwiOlwi4oiwXCIsXCJjY3Vwc1wiOlwi4qmMXCIsXCJjY3Vwc3NtXCI6XCLiqZBcIixcIkNkb3RcIjpcIsSKXCIsXCJjZG90XCI6XCLEi1wiLFwiY2VkaWxcIjpcIsK4XCIsXCJDZWRpbGxhXCI6XCLCuFwiLFwiY2VtcHR5dlwiOlwi4qayXCIsXCJjZW50XCI6XCLColwiLFwiY2VudGVyZG90XCI6XCLCt1wiLFwiQ2VudGVyRG90XCI6XCLCt1wiLFwiY2ZyXCI6XCLwnZSgXCIsXCJDZnJcIjpcIuKErVwiLFwiQ0hjeVwiOlwi0KdcIixcImNoY3lcIjpcItGHXCIsXCJjaGVja1wiOlwi4pyTXCIsXCJjaGVja21hcmtcIjpcIuKck1wiLFwiQ2hpXCI6XCLOp1wiLFwiY2hpXCI6XCLPh1wiLFwiY2lyY1wiOlwiy4ZcIixcImNpcmNlcVwiOlwi4omXXCIsXCJjaXJjbGVhcnJvd2xlZnRcIjpcIuKGulwiLFwiY2lyY2xlYXJyb3dyaWdodFwiOlwi4oa7XCIsXCJjaXJjbGVkYXN0XCI6XCLiiptcIixcImNpcmNsZWRjaXJjXCI6XCLiippcIixcImNpcmNsZWRkYXNoXCI6XCLiip1cIixcIkNpcmNsZURvdFwiOlwi4oqZXCIsXCJjaXJjbGVkUlwiOlwiwq5cIixcImNpcmNsZWRTXCI6XCLik4hcIixcIkNpcmNsZU1pbnVzXCI6XCLiipZcIixcIkNpcmNsZVBsdXNcIjpcIuKKlVwiLFwiQ2lyY2xlVGltZXNcIjpcIuKKl1wiLFwiY2lyXCI6XCLil4tcIixcImNpckVcIjpcIuKng1wiLFwiY2lyZVwiOlwi4omXXCIsXCJjaXJmbmludFwiOlwi4qiQXCIsXCJjaXJtaWRcIjpcIuKrr1wiLFwiY2lyc2NpclwiOlwi4qeCXCIsXCJDbG9ja3dpc2VDb250b3VySW50ZWdyYWxcIjpcIuKIslwiLFwiQ2xvc2VDdXJseURvdWJsZVF1b3RlXCI6XCLigJ1cIixcIkNsb3NlQ3VybHlRdW90ZVwiOlwi4oCZXCIsXCJjbHVic1wiOlwi4pmjXCIsXCJjbHVic3VpdFwiOlwi4pmjXCIsXCJjb2xvblwiOlwiOlwiLFwiQ29sb25cIjpcIuKIt1wiLFwiQ29sb25lXCI6XCLiqbRcIixcImNvbG9uZVwiOlwi4omUXCIsXCJjb2xvbmVxXCI6XCLiiZRcIixcImNvbW1hXCI6XCIsXCIsXCJjb21tYXRcIjpcIkBcIixcImNvbXBcIjpcIuKIgVwiLFwiY29tcGZuXCI6XCLiiJhcIixcImNvbXBsZW1lbnRcIjpcIuKIgVwiLFwiY29tcGxleGVzXCI6XCLihIJcIixcImNvbmdcIjpcIuKJhVwiLFwiY29uZ2RvdFwiOlwi4qmtXCIsXCJDb25ncnVlbnRcIjpcIuKJoVwiLFwiY29uaW50XCI6XCLiiK5cIixcIkNvbmludFwiOlwi4oivXCIsXCJDb250b3VySW50ZWdyYWxcIjpcIuKIrlwiLFwiY29wZlwiOlwi8J2VlFwiLFwiQ29wZlwiOlwi4oSCXCIsXCJjb3Byb2RcIjpcIuKIkFwiLFwiQ29wcm9kdWN0XCI6XCLiiJBcIixcImNvcHlcIjpcIsKpXCIsXCJDT1BZXCI6XCLCqVwiLFwiY29weXNyXCI6XCLihJdcIixcIkNvdW50ZXJDbG9ja3dpc2VDb250b3VySW50ZWdyYWxcIjpcIuKIs1wiLFwiY3JhcnJcIjpcIuKGtVwiLFwiY3Jvc3NcIjpcIuKcl1wiLFwiQ3Jvc3NcIjpcIuKor1wiLFwiQ3NjclwiOlwi8J2SnlwiLFwiY3NjclwiOlwi8J2SuFwiLFwiY3N1YlwiOlwi4quPXCIsXCJjc3ViZVwiOlwi4quRXCIsXCJjc3VwXCI6XCLiq5BcIixcImNzdXBlXCI6XCLiq5JcIixcImN0ZG90XCI6XCLii69cIixcImN1ZGFycmxcIjpcIuKkuFwiLFwiY3VkYXJyclwiOlwi4qS1XCIsXCJjdWVwclwiOlwi4oueXCIsXCJjdWVzY1wiOlwi4oufXCIsXCJjdWxhcnJcIjpcIuKGtlwiLFwiY3VsYXJycFwiOlwi4qS9XCIsXCJjdXBicmNhcFwiOlwi4qmIXCIsXCJjdXBjYXBcIjpcIuKphlwiLFwiQ3VwQ2FwXCI6XCLiiY1cIixcImN1cFwiOlwi4oiqXCIsXCJDdXBcIjpcIuKLk1wiLFwiY3VwY3VwXCI6XCLiqYpcIixcImN1cGRvdFwiOlwi4oqNXCIsXCJjdXBvclwiOlwi4qmFXCIsXCJjdXBzXCI6XCLiiKrvuIBcIixcImN1cmFyclwiOlwi4oa3XCIsXCJjdXJhcnJtXCI6XCLipLxcIixcImN1cmx5ZXFwcmVjXCI6XCLii55cIixcImN1cmx5ZXFzdWNjXCI6XCLii59cIixcImN1cmx5dmVlXCI6XCLii45cIixcImN1cmx5d2VkZ2VcIjpcIuKLj1wiLFwiY3VycmVuXCI6XCLCpFwiLFwiY3VydmVhcnJvd2xlZnRcIjpcIuKGtlwiLFwiY3VydmVhcnJvd3JpZ2h0XCI6XCLihrdcIixcImN1dmVlXCI6XCLii45cIixcImN1d2VkXCI6XCLii49cIixcImN3Y29uaW50XCI6XCLiiLJcIixcImN3aW50XCI6XCLiiLFcIixcImN5bGN0eVwiOlwi4oytXCIsXCJkYWdnZXJcIjpcIuKAoFwiLFwiRGFnZ2VyXCI6XCLigKFcIixcImRhbGV0aFwiOlwi4oS4XCIsXCJkYXJyXCI6XCLihpNcIixcIkRhcnJcIjpcIuKGoVwiLFwiZEFyclwiOlwi4oeTXCIsXCJkYXNoXCI6XCLigJBcIixcIkRhc2h2XCI6XCLiq6RcIixcImRhc2h2XCI6XCLiiqNcIixcImRia2Fyb3dcIjpcIuKkj1wiLFwiZGJsYWNcIjpcIsudXCIsXCJEY2Fyb25cIjpcIsSOXCIsXCJkY2Fyb25cIjpcIsSPXCIsXCJEY3lcIjpcItCUXCIsXCJkY3lcIjpcItC0XCIsXCJkZGFnZ2VyXCI6XCLigKFcIixcImRkYXJyXCI6XCLih4pcIixcIkREXCI6XCLihYVcIixcImRkXCI6XCLihYZcIixcIkREb3RyYWhkXCI6XCLipJFcIixcImRkb3RzZXFcIjpcIuKpt1wiLFwiZGVnXCI6XCLCsFwiLFwiRGVsXCI6XCLiiIdcIixcIkRlbHRhXCI6XCLOlFwiLFwiZGVsdGFcIjpcIs60XCIsXCJkZW1wdHl2XCI6XCLiprFcIixcImRmaXNodFwiOlwi4qW/XCIsXCJEZnJcIjpcIvCdlIdcIixcImRmclwiOlwi8J2UoVwiLFwiZEhhclwiOlwi4qWlXCIsXCJkaGFybFwiOlwi4oeDXCIsXCJkaGFyclwiOlwi4oeCXCIsXCJEaWFjcml0aWNhbEFjdXRlXCI6XCLCtFwiLFwiRGlhY3JpdGljYWxEb3RcIjpcIsuZXCIsXCJEaWFjcml0aWNhbERvdWJsZUFjdXRlXCI6XCLLnVwiLFwiRGlhY3JpdGljYWxHcmF2ZVwiOlwiYFwiLFwiRGlhY3JpdGljYWxUaWxkZVwiOlwiy5xcIixcImRpYW1cIjpcIuKLhFwiLFwiZGlhbW9uZFwiOlwi4ouEXCIsXCJEaWFtb25kXCI6XCLii4RcIixcImRpYW1vbmRzdWl0XCI6XCLimaZcIixcImRpYW1zXCI6XCLimaZcIixcImRpZVwiOlwiwqhcIixcIkRpZmZlcmVudGlhbERcIjpcIuKFhlwiLFwiZGlnYW1tYVwiOlwiz51cIixcImRpc2luXCI6XCLii7JcIixcImRpdlwiOlwiw7dcIixcImRpdmlkZVwiOlwiw7dcIixcImRpdmlkZW9udGltZXNcIjpcIuKLh1wiLFwiZGl2b254XCI6XCLii4dcIixcIkRKY3lcIjpcItCCXCIsXCJkamN5XCI6XCLRklwiLFwiZGxjb3JuXCI6XCLijJ5cIixcImRsY3JvcFwiOlwi4oyNXCIsXCJkb2xsYXJcIjpcIiRcIixcIkRvcGZcIjpcIvCdlLtcIixcImRvcGZcIjpcIvCdlZVcIixcIkRvdFwiOlwiwqhcIixcImRvdFwiOlwiy5lcIixcIkRvdERvdFwiOlwi4oOcXCIsXCJkb3RlcVwiOlwi4omQXCIsXCJkb3RlcWRvdFwiOlwi4omRXCIsXCJEb3RFcXVhbFwiOlwi4omQXCIsXCJkb3RtaW51c1wiOlwi4oi4XCIsXCJkb3RwbHVzXCI6XCLiiJRcIixcImRvdHNxdWFyZVwiOlwi4oqhXCIsXCJkb3VibGViYXJ3ZWRnZVwiOlwi4oyGXCIsXCJEb3VibGVDb250b3VySW50ZWdyYWxcIjpcIuKIr1wiLFwiRG91YmxlRG90XCI6XCLCqFwiLFwiRG91YmxlRG93bkFycm93XCI6XCLih5NcIixcIkRvdWJsZUxlZnRBcnJvd1wiOlwi4oeQXCIsXCJEb3VibGVMZWZ0UmlnaHRBcnJvd1wiOlwi4oeUXCIsXCJEb3VibGVMZWZ0VGVlXCI6XCLiq6RcIixcIkRvdWJsZUxvbmdMZWZ0QXJyb3dcIjpcIuKfuFwiLFwiRG91YmxlTG9uZ0xlZnRSaWdodEFycm93XCI6XCLin7pcIixcIkRvdWJsZUxvbmdSaWdodEFycm93XCI6XCLin7lcIixcIkRvdWJsZVJpZ2h0QXJyb3dcIjpcIuKHklwiLFwiRG91YmxlUmlnaHRUZWVcIjpcIuKKqFwiLFwiRG91YmxlVXBBcnJvd1wiOlwi4oeRXCIsXCJEb3VibGVVcERvd25BcnJvd1wiOlwi4oeVXCIsXCJEb3VibGVWZXJ0aWNhbEJhclwiOlwi4oilXCIsXCJEb3duQXJyb3dCYXJcIjpcIuKkk1wiLFwiZG93bmFycm93XCI6XCLihpNcIixcIkRvd25BcnJvd1wiOlwi4oaTXCIsXCJEb3duYXJyb3dcIjpcIuKHk1wiLFwiRG93bkFycm93VXBBcnJvd1wiOlwi4oe1XCIsXCJEb3duQnJldmVcIjpcIsyRXCIsXCJkb3duZG93bmFycm93c1wiOlwi4oeKXCIsXCJkb3duaGFycG9vbmxlZnRcIjpcIuKHg1wiLFwiZG93bmhhcnBvb25yaWdodFwiOlwi4oeCXCIsXCJEb3duTGVmdFJpZ2h0VmVjdG9yXCI6XCLipZBcIixcIkRvd25MZWZ0VGVlVmVjdG9yXCI6XCLipZ5cIixcIkRvd25MZWZ0VmVjdG9yQmFyXCI6XCLipZZcIixcIkRvd25MZWZ0VmVjdG9yXCI6XCLihr1cIixcIkRvd25SaWdodFRlZVZlY3RvclwiOlwi4qWfXCIsXCJEb3duUmlnaHRWZWN0b3JCYXJcIjpcIuKll1wiLFwiRG93blJpZ2h0VmVjdG9yXCI6XCLih4FcIixcIkRvd25UZWVBcnJvd1wiOlwi4oanXCIsXCJEb3duVGVlXCI6XCLiiqRcIixcImRyYmthcm93XCI6XCLipJBcIixcImRyY29yblwiOlwi4oyfXCIsXCJkcmNyb3BcIjpcIuKMjFwiLFwiRHNjclwiOlwi8J2Sn1wiLFwiZHNjclwiOlwi8J2SuVwiLFwiRFNjeVwiOlwi0IVcIixcImRzY3lcIjpcItGVXCIsXCJkc29sXCI6XCLip7ZcIixcIkRzdHJva1wiOlwixJBcIixcImRzdHJva1wiOlwixJFcIixcImR0ZG90XCI6XCLii7FcIixcImR0cmlcIjpcIuKWv1wiLFwiZHRyaWZcIjpcIuKWvlwiLFwiZHVhcnJcIjpcIuKHtVwiLFwiZHVoYXJcIjpcIuKlr1wiLFwiZHdhbmdsZVwiOlwi4qamXCIsXCJEWmN5XCI6XCLQj1wiLFwiZHpjeVwiOlwi0Z9cIixcImR6aWdyYXJyXCI6XCLin79cIixcIkVhY3V0ZVwiOlwiw4lcIixcImVhY3V0ZVwiOlwiw6lcIixcImVhc3RlclwiOlwi4qmuXCIsXCJFY2Fyb25cIjpcIsSaXCIsXCJlY2Fyb25cIjpcIsSbXCIsXCJFY2lyY1wiOlwiw4pcIixcImVjaXJjXCI6XCLDqlwiLFwiZWNpclwiOlwi4omWXCIsXCJlY29sb25cIjpcIuKJlVwiLFwiRWN5XCI6XCLQrVwiLFwiZWN5XCI6XCLRjVwiLFwiZUREb3RcIjpcIuKpt1wiLFwiRWRvdFwiOlwixJZcIixcImVkb3RcIjpcIsSXXCIsXCJlRG90XCI6XCLiiZFcIixcImVlXCI6XCLihYdcIixcImVmRG90XCI6XCLiiZJcIixcIkVmclwiOlwi8J2UiFwiLFwiZWZyXCI6XCLwnZSiXCIsXCJlZ1wiOlwi4qqaXCIsXCJFZ3JhdmVcIjpcIsOIXCIsXCJlZ3JhdmVcIjpcIsOoXCIsXCJlZ3NcIjpcIuKqllwiLFwiZWdzZG90XCI6XCLiqphcIixcImVsXCI6XCLiqplcIixcIkVsZW1lbnRcIjpcIuKIiFwiLFwiZWxpbnRlcnNcIjpcIuKPp1wiLFwiZWxsXCI6XCLihJNcIixcImVsc1wiOlwi4qqVXCIsXCJlbHNkb3RcIjpcIuKql1wiLFwiRW1hY3JcIjpcIsSSXCIsXCJlbWFjclwiOlwixJNcIixcImVtcHR5XCI6XCLiiIVcIixcImVtcHR5c2V0XCI6XCLiiIVcIixcIkVtcHR5U21hbGxTcXVhcmVcIjpcIuKXu1wiLFwiZW1wdHl2XCI6XCLiiIVcIixcIkVtcHR5VmVyeVNtYWxsU3F1YXJlXCI6XCLilqtcIixcImVtc3AxM1wiOlwi4oCEXCIsXCJlbXNwMTRcIjpcIuKAhVwiLFwiZW1zcFwiOlwi4oCDXCIsXCJFTkdcIjpcIsWKXCIsXCJlbmdcIjpcIsWLXCIsXCJlbnNwXCI6XCLigIJcIixcIkVvZ29uXCI6XCLEmFwiLFwiZW9nb25cIjpcIsSZXCIsXCJFb3BmXCI6XCLwnZS8XCIsXCJlb3BmXCI6XCLwnZWWXCIsXCJlcGFyXCI6XCLii5VcIixcImVwYXJzbFwiOlwi4qejXCIsXCJlcGx1c1wiOlwi4qmxXCIsXCJlcHNpXCI6XCLOtVwiLFwiRXBzaWxvblwiOlwizpVcIixcImVwc2lsb25cIjpcIs61XCIsXCJlcHNpdlwiOlwiz7VcIixcImVxY2lyY1wiOlwi4omWXCIsXCJlcWNvbG9uXCI6XCLiiZVcIixcImVxc2ltXCI6XCLiiYJcIixcImVxc2xhbnRndHJcIjpcIuKqllwiLFwiZXFzbGFudGxlc3NcIjpcIuKqlVwiLFwiRXF1YWxcIjpcIuKptVwiLFwiZXF1YWxzXCI6XCI9XCIsXCJFcXVhbFRpbGRlXCI6XCLiiYJcIixcImVxdWVzdFwiOlwi4omfXCIsXCJFcXVpbGlicml1bVwiOlwi4oeMXCIsXCJlcXVpdlwiOlwi4omhXCIsXCJlcXVpdkREXCI6XCLiqbhcIixcImVxdnBhcnNsXCI6XCLip6VcIixcImVyYXJyXCI6XCLipbFcIixcImVyRG90XCI6XCLiiZNcIixcImVzY3JcIjpcIuKEr1wiLFwiRXNjclwiOlwi4oSwXCIsXCJlc2RvdFwiOlwi4omQXCIsXCJFc2ltXCI6XCLiqbNcIixcImVzaW1cIjpcIuKJglwiLFwiRXRhXCI6XCLOl1wiLFwiZXRhXCI6XCLOt1wiLFwiRVRIXCI6XCLDkFwiLFwiZXRoXCI6XCLDsFwiLFwiRXVtbFwiOlwiw4tcIixcImV1bWxcIjpcIsOrXCIsXCJldXJvXCI6XCLigqxcIixcImV4Y2xcIjpcIiFcIixcImV4aXN0XCI6XCLiiINcIixcIkV4aXN0c1wiOlwi4oiDXCIsXCJleHBlY3RhdGlvblwiOlwi4oSwXCIsXCJleHBvbmVudGlhbGVcIjpcIuKFh1wiLFwiRXhwb25lbnRpYWxFXCI6XCLihYdcIixcImZhbGxpbmdkb3RzZXFcIjpcIuKJklwiLFwiRmN5XCI6XCLQpFwiLFwiZmN5XCI6XCLRhFwiLFwiZmVtYWxlXCI6XCLimYBcIixcImZmaWxpZ1wiOlwi76yDXCIsXCJmZmxpZ1wiOlwi76yAXCIsXCJmZmxsaWdcIjpcIu+shFwiLFwiRmZyXCI6XCLwnZSJXCIsXCJmZnJcIjpcIvCdlKNcIixcImZpbGlnXCI6XCLvrIFcIixcIkZpbGxlZFNtYWxsU3F1YXJlXCI6XCLil7xcIixcIkZpbGxlZFZlcnlTbWFsbFNxdWFyZVwiOlwi4paqXCIsXCJmamxpZ1wiOlwiZmpcIixcImZsYXRcIjpcIuKZrVwiLFwiZmxsaWdcIjpcIu+sglwiLFwiZmx0bnNcIjpcIuKWsVwiLFwiZm5vZlwiOlwixpJcIixcIkZvcGZcIjpcIvCdlL1cIixcImZvcGZcIjpcIvCdlZdcIixcImZvcmFsbFwiOlwi4oiAXCIsXCJGb3JBbGxcIjpcIuKIgFwiLFwiZm9ya1wiOlwi4ouUXCIsXCJmb3JrdlwiOlwi4quZXCIsXCJGb3VyaWVydHJmXCI6XCLihLFcIixcImZwYXJ0aW50XCI6XCLiqI1cIixcImZyYWMxMlwiOlwiwr1cIixcImZyYWMxM1wiOlwi4oWTXCIsXCJmcmFjMTRcIjpcIsK8XCIsXCJmcmFjMTVcIjpcIuKFlVwiLFwiZnJhYzE2XCI6XCLihZlcIixcImZyYWMxOFwiOlwi4oWbXCIsXCJmcmFjMjNcIjpcIuKFlFwiLFwiZnJhYzI1XCI6XCLihZZcIixcImZyYWMzNFwiOlwiwr5cIixcImZyYWMzNVwiOlwi4oWXXCIsXCJmcmFjMzhcIjpcIuKFnFwiLFwiZnJhYzQ1XCI6XCLihZhcIixcImZyYWM1NlwiOlwi4oWaXCIsXCJmcmFjNThcIjpcIuKFnVwiLFwiZnJhYzc4XCI6XCLihZ5cIixcImZyYXNsXCI6XCLigYRcIixcImZyb3duXCI6XCLijKJcIixcImZzY3JcIjpcIvCdkrtcIixcIkZzY3JcIjpcIuKEsVwiLFwiZ2FjdXRlXCI6XCLHtVwiLFwiR2FtbWFcIjpcIs6TXCIsXCJnYW1tYVwiOlwizrNcIixcIkdhbW1hZFwiOlwiz5xcIixcImdhbW1hZFwiOlwiz51cIixcImdhcFwiOlwi4qqGXCIsXCJHYnJldmVcIjpcIsSeXCIsXCJnYnJldmVcIjpcIsSfXCIsXCJHY2VkaWxcIjpcIsSiXCIsXCJHY2lyY1wiOlwixJxcIixcImdjaXJjXCI6XCLEnVwiLFwiR2N5XCI6XCLQk1wiLFwiZ2N5XCI6XCLQs1wiLFwiR2RvdFwiOlwixKBcIixcImdkb3RcIjpcIsShXCIsXCJnZVwiOlwi4omlXCIsXCJnRVwiOlwi4omnXCIsXCJnRWxcIjpcIuKqjFwiLFwiZ2VsXCI6XCLii5tcIixcImdlcVwiOlwi4omlXCIsXCJnZXFxXCI6XCLiiadcIixcImdlcXNsYW50XCI6XCLiqb5cIixcImdlc2NjXCI6XCLiqqlcIixcImdlc1wiOlwi4qm+XCIsXCJnZXNkb3RcIjpcIuKqgFwiLFwiZ2VzZG90b1wiOlwi4qqCXCIsXCJnZXNkb3RvbFwiOlwi4qqEXCIsXCJnZXNsXCI6XCLii5vvuIBcIixcImdlc2xlc1wiOlwi4qqUXCIsXCJHZnJcIjpcIvCdlIpcIixcImdmclwiOlwi8J2UpFwiLFwiZ2dcIjpcIuKJq1wiLFwiR2dcIjpcIuKLmVwiLFwiZ2dnXCI6XCLii5lcIixcImdpbWVsXCI6XCLihLdcIixcIkdKY3lcIjpcItCDXCIsXCJnamN5XCI6XCLRk1wiLFwiZ2xhXCI6XCLiqqVcIixcImdsXCI6XCLiibdcIixcImdsRVwiOlwi4qqSXCIsXCJnbGpcIjpcIuKqpFwiLFwiZ25hcFwiOlwi4qqKXCIsXCJnbmFwcHJveFwiOlwi4qqKXCIsXCJnbmVcIjpcIuKqiFwiLFwiZ25FXCI6XCLiialcIixcImduZXFcIjpcIuKqiFwiLFwiZ25lcXFcIjpcIuKJqVwiLFwiZ25zaW1cIjpcIuKLp1wiLFwiR29wZlwiOlwi8J2UvlwiLFwiZ29wZlwiOlwi8J2VmFwiLFwiZ3JhdmVcIjpcImBcIixcIkdyZWF0ZXJFcXVhbFwiOlwi4omlXCIsXCJHcmVhdGVyRXF1YWxMZXNzXCI6XCLii5tcIixcIkdyZWF0ZXJGdWxsRXF1YWxcIjpcIuKJp1wiLFwiR3JlYXRlckdyZWF0ZXJcIjpcIuKqolwiLFwiR3JlYXRlckxlc3NcIjpcIuKJt1wiLFwiR3JlYXRlclNsYW50RXF1YWxcIjpcIuKpvlwiLFwiR3JlYXRlclRpbGRlXCI6XCLiibNcIixcIkdzY3JcIjpcIvCdkqJcIixcImdzY3JcIjpcIuKEilwiLFwiZ3NpbVwiOlwi4omzXCIsXCJnc2ltZVwiOlwi4qqOXCIsXCJnc2ltbFwiOlwi4qqQXCIsXCJndGNjXCI6XCLiqqdcIixcImd0Y2lyXCI6XCLiqbpcIixcImd0XCI6XCI+XCIsXCJHVFwiOlwiPlwiLFwiR3RcIjpcIuKJq1wiLFwiZ3Rkb3RcIjpcIuKLl1wiLFwiZ3RsUGFyXCI6XCLippVcIixcImd0cXVlc3RcIjpcIuKpvFwiLFwiZ3RyYXBwcm94XCI6XCLiqoZcIixcImd0cmFyclwiOlwi4qW4XCIsXCJndHJkb3RcIjpcIuKLl1wiLFwiZ3RyZXFsZXNzXCI6XCLii5tcIixcImd0cmVxcWxlc3NcIjpcIuKqjFwiLFwiZ3RybGVzc1wiOlwi4om3XCIsXCJndHJzaW1cIjpcIuKJs1wiLFwiZ3ZlcnRuZXFxXCI6XCLiianvuIBcIixcImd2bkVcIjpcIuKJqe+4gFwiLFwiSGFjZWtcIjpcIsuHXCIsXCJoYWlyc3BcIjpcIuKAilwiLFwiaGFsZlwiOlwiwr1cIixcImhhbWlsdFwiOlwi4oSLXCIsXCJIQVJEY3lcIjpcItCqXCIsXCJoYXJkY3lcIjpcItGKXCIsXCJoYXJyY2lyXCI6XCLipYhcIixcImhhcnJcIjpcIuKGlFwiLFwiaEFyclwiOlwi4oeUXCIsXCJoYXJyd1wiOlwi4oatXCIsXCJIYXRcIjpcIl5cIixcImhiYXJcIjpcIuKEj1wiLFwiSGNpcmNcIjpcIsSkXCIsXCJoY2lyY1wiOlwixKVcIixcImhlYXJ0c1wiOlwi4pmlXCIsXCJoZWFydHN1aXRcIjpcIuKZpVwiLFwiaGVsbGlwXCI6XCLigKZcIixcImhlcmNvblwiOlwi4oq5XCIsXCJoZnJcIjpcIvCdlKVcIixcIkhmclwiOlwi4oSMXCIsXCJIaWxiZXJ0U3BhY2VcIjpcIuKEi1wiLFwiaGtzZWFyb3dcIjpcIuKkpVwiLFwiaGtzd2Fyb3dcIjpcIuKkplwiLFwiaG9hcnJcIjpcIuKHv1wiLFwiaG9tdGh0XCI6XCLiiLtcIixcImhvb2tsZWZ0YXJyb3dcIjpcIuKGqVwiLFwiaG9va3JpZ2h0YXJyb3dcIjpcIuKGqlwiLFwiaG9wZlwiOlwi8J2VmVwiLFwiSG9wZlwiOlwi4oSNXCIsXCJob3JiYXJcIjpcIuKAlVwiLFwiSG9yaXpvbnRhbExpbmVcIjpcIuKUgFwiLFwiaHNjclwiOlwi8J2SvVwiLFwiSHNjclwiOlwi4oSLXCIsXCJoc2xhc2hcIjpcIuKEj1wiLFwiSHN0cm9rXCI6XCLEplwiLFwiaHN0cm9rXCI6XCLEp1wiLFwiSHVtcERvd25IdW1wXCI6XCLiiY5cIixcIkh1bXBFcXVhbFwiOlwi4omPXCIsXCJoeWJ1bGxcIjpcIuKBg1wiLFwiaHlwaGVuXCI6XCLigJBcIixcIklhY3V0ZVwiOlwiw41cIixcImlhY3V0ZVwiOlwiw61cIixcImljXCI6XCLigaNcIixcIkljaXJjXCI6XCLDjlwiLFwiaWNpcmNcIjpcIsOuXCIsXCJJY3lcIjpcItCYXCIsXCJpY3lcIjpcItC4XCIsXCJJZG90XCI6XCLEsFwiLFwiSUVjeVwiOlwi0JVcIixcImllY3lcIjpcItC1XCIsXCJpZXhjbFwiOlwiwqFcIixcImlmZlwiOlwi4oeUXCIsXCJpZnJcIjpcIvCdlKZcIixcIklmclwiOlwi4oSRXCIsXCJJZ3JhdmVcIjpcIsOMXCIsXCJpZ3JhdmVcIjpcIsOsXCIsXCJpaVwiOlwi4oWIXCIsXCJpaWlpbnRcIjpcIuKojFwiLFwiaWlpbnRcIjpcIuKIrVwiLFwiaWluZmluXCI6XCLip5xcIixcImlpb3RhXCI6XCLihKlcIixcIklKbGlnXCI6XCLEslwiLFwiaWpsaWdcIjpcIsSzXCIsXCJJbWFjclwiOlwixKpcIixcImltYWNyXCI6XCLEq1wiLFwiaW1hZ2VcIjpcIuKEkVwiLFwiSW1hZ2luYXJ5SVwiOlwi4oWIXCIsXCJpbWFnbGluZVwiOlwi4oSQXCIsXCJpbWFncGFydFwiOlwi4oSRXCIsXCJpbWF0aFwiOlwixLFcIixcIkltXCI6XCLihJFcIixcImltb2ZcIjpcIuKKt1wiLFwiaW1wZWRcIjpcIsa1XCIsXCJJbXBsaWVzXCI6XCLih5JcIixcImluY2FyZVwiOlwi4oSFXCIsXCJpblwiOlwi4oiIXCIsXCJpbmZpblwiOlwi4oieXCIsXCJpbmZpbnRpZVwiOlwi4qedXCIsXCJpbm9kb3RcIjpcIsSxXCIsXCJpbnRjYWxcIjpcIuKKulwiLFwiaW50XCI6XCLiiKtcIixcIkludFwiOlwi4oisXCIsXCJpbnRlZ2Vyc1wiOlwi4oSkXCIsXCJJbnRlZ3JhbFwiOlwi4oirXCIsXCJpbnRlcmNhbFwiOlwi4oq6XCIsXCJJbnRlcnNlY3Rpb25cIjpcIuKLglwiLFwiaW50bGFyaGtcIjpcIuKol1wiLFwiaW50cHJvZFwiOlwi4qi8XCIsXCJJbnZpc2libGVDb21tYVwiOlwi4oGjXCIsXCJJbnZpc2libGVUaW1lc1wiOlwi4oGiXCIsXCJJT2N5XCI6XCLQgVwiLFwiaW9jeVwiOlwi0ZFcIixcIklvZ29uXCI6XCLErlwiLFwiaW9nb25cIjpcIsSvXCIsXCJJb3BmXCI6XCLwnZWAXCIsXCJpb3BmXCI6XCLwnZWaXCIsXCJJb3RhXCI6XCLOmVwiLFwiaW90YVwiOlwizrlcIixcImlwcm9kXCI6XCLiqLxcIixcImlxdWVzdFwiOlwiwr9cIixcImlzY3JcIjpcIvCdkr5cIixcIklzY3JcIjpcIuKEkFwiLFwiaXNpblwiOlwi4oiIXCIsXCJpc2luZG90XCI6XCLii7VcIixcImlzaW5FXCI6XCLii7lcIixcImlzaW5zXCI6XCLii7RcIixcImlzaW5zdlwiOlwi4ouzXCIsXCJpc2ludlwiOlwi4oiIXCIsXCJpdFwiOlwi4oGiXCIsXCJJdGlsZGVcIjpcIsSoXCIsXCJpdGlsZGVcIjpcIsSpXCIsXCJJdWtjeVwiOlwi0IZcIixcIml1a2N5XCI6XCLRllwiLFwiSXVtbFwiOlwiw49cIixcIml1bWxcIjpcIsOvXCIsXCJKY2lyY1wiOlwixLRcIixcImpjaXJjXCI6XCLEtVwiLFwiSmN5XCI6XCLQmVwiLFwiamN5XCI6XCLQuVwiLFwiSmZyXCI6XCLwnZSNXCIsXCJqZnJcIjpcIvCdlKdcIixcImptYXRoXCI6XCLIt1wiLFwiSm9wZlwiOlwi8J2VgVwiLFwiam9wZlwiOlwi8J2Vm1wiLFwiSnNjclwiOlwi8J2SpVwiLFwianNjclwiOlwi8J2Sv1wiLFwiSnNlcmN5XCI6XCLQiFwiLFwianNlcmN5XCI6XCLRmFwiLFwiSnVrY3lcIjpcItCEXCIsXCJqdWtjeVwiOlwi0ZRcIixcIkthcHBhXCI6XCLOmlwiLFwia2FwcGFcIjpcIs66XCIsXCJrYXBwYXZcIjpcIs+wXCIsXCJLY2VkaWxcIjpcIsS2XCIsXCJrY2VkaWxcIjpcIsS3XCIsXCJLY3lcIjpcItCaXCIsXCJrY3lcIjpcItC6XCIsXCJLZnJcIjpcIvCdlI5cIixcImtmclwiOlwi8J2UqFwiLFwia2dyZWVuXCI6XCLEuFwiLFwiS0hjeVwiOlwi0KVcIixcImtoY3lcIjpcItGFXCIsXCJLSmN5XCI6XCLQjFwiLFwia2pjeVwiOlwi0ZxcIixcIktvcGZcIjpcIvCdlYJcIixcImtvcGZcIjpcIvCdlZxcIixcIktzY3JcIjpcIvCdkqZcIixcImtzY3JcIjpcIvCdk4BcIixcImxBYXJyXCI6XCLih5pcIixcIkxhY3V0ZVwiOlwixLlcIixcImxhY3V0ZVwiOlwixLpcIixcImxhZW1wdHl2XCI6XCLiprRcIixcImxhZ3JhblwiOlwi4oSSXCIsXCJMYW1iZGFcIjpcIs6bXCIsXCJsYW1iZGFcIjpcIs67XCIsXCJsYW5nXCI6XCLin6hcIixcIkxhbmdcIjpcIuKfqlwiLFwibGFuZ2RcIjpcIuKmkVwiLFwibGFuZ2xlXCI6XCLin6hcIixcImxhcFwiOlwi4qqFXCIsXCJMYXBsYWNldHJmXCI6XCLihJJcIixcImxhcXVvXCI6XCLCq1wiLFwibGFycmJcIjpcIuKHpFwiLFwibGFycmJmc1wiOlwi4qSfXCIsXCJsYXJyXCI6XCLihpBcIixcIkxhcnJcIjpcIuKGnlwiLFwibEFyclwiOlwi4oeQXCIsXCJsYXJyZnNcIjpcIuKknVwiLFwibGFycmhrXCI6XCLihqlcIixcImxhcnJscFwiOlwi4oarXCIsXCJsYXJycGxcIjpcIuKkuVwiLFwibGFycnNpbVwiOlwi4qWzXCIsXCJsYXJydGxcIjpcIuKGolwiLFwibGF0YWlsXCI6XCLipJlcIixcImxBdGFpbFwiOlwi4qSbXCIsXCJsYXRcIjpcIuKqq1wiLFwibGF0ZVwiOlwi4qqtXCIsXCJsYXRlc1wiOlwi4qqt77iAXCIsXCJsYmFyclwiOlwi4qSMXCIsXCJsQmFyclwiOlwi4qSOXCIsXCJsYmJya1wiOlwi4p2yXCIsXCJsYnJhY2VcIjpcIntcIixcImxicmFja1wiOlwiW1wiLFwibGJya2VcIjpcIuKmi1wiLFwibGJya3NsZFwiOlwi4qaPXCIsXCJsYnJrc2x1XCI6XCLipo1cIixcIkxjYXJvblwiOlwixL1cIixcImxjYXJvblwiOlwixL5cIixcIkxjZWRpbFwiOlwixLtcIixcImxjZWRpbFwiOlwixLxcIixcImxjZWlsXCI6XCLijIhcIixcImxjdWJcIjpcIntcIixcIkxjeVwiOlwi0JtcIixcImxjeVwiOlwi0LtcIixcImxkY2FcIjpcIuKktlwiLFwibGRxdW9cIjpcIuKAnFwiLFwibGRxdW9yXCI6XCLigJ5cIixcImxkcmRoYXJcIjpcIuKlp1wiLFwibGRydXNoYXJcIjpcIuKli1wiLFwibGRzaFwiOlwi4oayXCIsXCJsZVwiOlwi4omkXCIsXCJsRVwiOlwi4ommXCIsXCJMZWZ0QW5nbGVCcmFja2V0XCI6XCLin6hcIixcIkxlZnRBcnJvd0JhclwiOlwi4oekXCIsXCJsZWZ0YXJyb3dcIjpcIuKGkFwiLFwiTGVmdEFycm93XCI6XCLihpBcIixcIkxlZnRhcnJvd1wiOlwi4oeQXCIsXCJMZWZ0QXJyb3dSaWdodEFycm93XCI6XCLih4ZcIixcImxlZnRhcnJvd3RhaWxcIjpcIuKGolwiLFwiTGVmdENlaWxpbmdcIjpcIuKMiFwiLFwiTGVmdERvdWJsZUJyYWNrZXRcIjpcIuKfplwiLFwiTGVmdERvd25UZWVWZWN0b3JcIjpcIuKloVwiLFwiTGVmdERvd25WZWN0b3JCYXJcIjpcIuKlmVwiLFwiTGVmdERvd25WZWN0b3JcIjpcIuKHg1wiLFwiTGVmdEZsb29yXCI6XCLijIpcIixcImxlZnRoYXJwb29uZG93blwiOlwi4oa9XCIsXCJsZWZ0aGFycG9vbnVwXCI6XCLihrxcIixcImxlZnRsZWZ0YXJyb3dzXCI6XCLih4dcIixcImxlZnRyaWdodGFycm93XCI6XCLihpRcIixcIkxlZnRSaWdodEFycm93XCI6XCLihpRcIixcIkxlZnRyaWdodGFycm93XCI6XCLih5RcIixcImxlZnRyaWdodGFycm93c1wiOlwi4oeGXCIsXCJsZWZ0cmlnaHRoYXJwb29uc1wiOlwi4oeLXCIsXCJsZWZ0cmlnaHRzcXVpZ2Fycm93XCI6XCLihq1cIixcIkxlZnRSaWdodFZlY3RvclwiOlwi4qWOXCIsXCJMZWZ0VGVlQXJyb3dcIjpcIuKGpFwiLFwiTGVmdFRlZVwiOlwi4oqjXCIsXCJMZWZ0VGVlVmVjdG9yXCI6XCLipZpcIixcImxlZnR0aHJlZXRpbWVzXCI6XCLii4tcIixcIkxlZnRUcmlhbmdsZUJhclwiOlwi4qePXCIsXCJMZWZ0VHJpYW5nbGVcIjpcIuKKslwiLFwiTGVmdFRyaWFuZ2xlRXF1YWxcIjpcIuKKtFwiLFwiTGVmdFVwRG93blZlY3RvclwiOlwi4qWRXCIsXCJMZWZ0VXBUZWVWZWN0b3JcIjpcIuKloFwiLFwiTGVmdFVwVmVjdG9yQmFyXCI6XCLipZhcIixcIkxlZnRVcFZlY3RvclwiOlwi4oa/XCIsXCJMZWZ0VmVjdG9yQmFyXCI6XCLipZJcIixcIkxlZnRWZWN0b3JcIjpcIuKGvFwiLFwibEVnXCI6XCLiqotcIixcImxlZ1wiOlwi4ouaXCIsXCJsZXFcIjpcIuKJpFwiLFwibGVxcVwiOlwi4ommXCIsXCJsZXFzbGFudFwiOlwi4qm9XCIsXCJsZXNjY1wiOlwi4qqoXCIsXCJsZXNcIjpcIuKpvVwiLFwibGVzZG90XCI6XCLiqb9cIixcImxlc2RvdG9cIjpcIuKqgVwiLFwibGVzZG90b3JcIjpcIuKqg1wiLFwibGVzZ1wiOlwi4oua77iAXCIsXCJsZXNnZXNcIjpcIuKqk1wiLFwibGVzc2FwcHJveFwiOlwi4qqFXCIsXCJsZXNzZG90XCI6XCLii5ZcIixcImxlc3NlcWd0clwiOlwi4ouaXCIsXCJsZXNzZXFxZ3RyXCI6XCLiqotcIixcIkxlc3NFcXVhbEdyZWF0ZXJcIjpcIuKLmlwiLFwiTGVzc0Z1bGxFcXVhbFwiOlwi4ommXCIsXCJMZXNzR3JlYXRlclwiOlwi4om2XCIsXCJsZXNzZ3RyXCI6XCLiibZcIixcIkxlc3NMZXNzXCI6XCLiqqFcIixcImxlc3NzaW1cIjpcIuKJslwiLFwiTGVzc1NsYW50RXF1YWxcIjpcIuKpvVwiLFwiTGVzc1RpbGRlXCI6XCLiibJcIixcImxmaXNodFwiOlwi4qW8XCIsXCJsZmxvb3JcIjpcIuKMilwiLFwiTGZyXCI6XCLwnZSPXCIsXCJsZnJcIjpcIvCdlKlcIixcImxnXCI6XCLiibZcIixcImxnRVwiOlwi4qqRXCIsXCJsSGFyXCI6XCLipaJcIixcImxoYXJkXCI6XCLihr1cIixcImxoYXJ1XCI6XCLihrxcIixcImxoYXJ1bFwiOlwi4qWqXCIsXCJsaGJsa1wiOlwi4paEXCIsXCJMSmN5XCI6XCLQiVwiLFwibGpjeVwiOlwi0ZlcIixcImxsYXJyXCI6XCLih4dcIixcImxsXCI6XCLiiapcIixcIkxsXCI6XCLii5hcIixcImxsY29ybmVyXCI6XCLijJ5cIixcIkxsZWZ0YXJyb3dcIjpcIuKHmlwiLFwibGxoYXJkXCI6XCLipatcIixcImxsdHJpXCI6XCLil7pcIixcIkxtaWRvdFwiOlwixL9cIixcImxtaWRvdFwiOlwixYBcIixcImxtb3VzdGFjaGVcIjpcIuKOsFwiLFwibG1vdXN0XCI6XCLijrBcIixcImxuYXBcIjpcIuKqiVwiLFwibG5hcHByb3hcIjpcIuKqiVwiLFwibG5lXCI6XCLiqodcIixcImxuRVwiOlwi4omoXCIsXCJsbmVxXCI6XCLiqodcIixcImxuZXFxXCI6XCLiiahcIixcImxuc2ltXCI6XCLii6ZcIixcImxvYW5nXCI6XCLin6xcIixcImxvYXJyXCI6XCLih71cIixcImxvYnJrXCI6XCLin6ZcIixcImxvbmdsZWZ0YXJyb3dcIjpcIuKftVwiLFwiTG9uZ0xlZnRBcnJvd1wiOlwi4p+1XCIsXCJMb25nbGVmdGFycm93XCI6XCLin7hcIixcImxvbmdsZWZ0cmlnaHRhcnJvd1wiOlwi4p+3XCIsXCJMb25nTGVmdFJpZ2h0QXJyb3dcIjpcIuKft1wiLFwiTG9uZ2xlZnRyaWdodGFycm93XCI6XCLin7pcIixcImxvbmdtYXBzdG9cIjpcIuKfvFwiLFwibG9uZ3JpZ2h0YXJyb3dcIjpcIuKftlwiLFwiTG9uZ1JpZ2h0QXJyb3dcIjpcIuKftlwiLFwiTG9uZ3JpZ2h0YXJyb3dcIjpcIuKfuVwiLFwibG9vcGFycm93bGVmdFwiOlwi4oarXCIsXCJsb29wYXJyb3dyaWdodFwiOlwi4oasXCIsXCJsb3BhclwiOlwi4qaFXCIsXCJMb3BmXCI6XCLwnZWDXCIsXCJsb3BmXCI6XCLwnZWdXCIsXCJsb3BsdXNcIjpcIuKorVwiLFwibG90aW1lc1wiOlwi4qi0XCIsXCJsb3dhc3RcIjpcIuKIl1wiLFwibG93YmFyXCI6XCJfXCIsXCJMb3dlckxlZnRBcnJvd1wiOlwi4oaZXCIsXCJMb3dlclJpZ2h0QXJyb3dcIjpcIuKGmFwiLFwibG96XCI6XCLil4pcIixcImxvemVuZ2VcIjpcIuKXilwiLFwibG96ZlwiOlwi4qerXCIsXCJscGFyXCI6XCIoXCIsXCJscGFybHRcIjpcIuKmk1wiLFwibHJhcnJcIjpcIuKHhlwiLFwibHJjb3JuZXJcIjpcIuKMn1wiLFwibHJoYXJcIjpcIuKHi1wiLFwibHJoYXJkXCI6XCLipa1cIixcImxybVwiOlwi4oCOXCIsXCJscnRyaVwiOlwi4oq/XCIsXCJsc2FxdW9cIjpcIuKAuVwiLFwibHNjclwiOlwi8J2TgVwiLFwiTHNjclwiOlwi4oSSXCIsXCJsc2hcIjpcIuKGsFwiLFwiTHNoXCI6XCLihrBcIixcImxzaW1cIjpcIuKJslwiLFwibHNpbWVcIjpcIuKqjVwiLFwibHNpbWdcIjpcIuKqj1wiLFwibHNxYlwiOlwiW1wiLFwibHNxdW9cIjpcIuKAmFwiLFwibHNxdW9yXCI6XCLigJpcIixcIkxzdHJva1wiOlwixYFcIixcImxzdHJva1wiOlwixYJcIixcImx0Y2NcIjpcIuKqplwiLFwibHRjaXJcIjpcIuKpuVwiLFwibHRcIjpcIjxcIixcIkxUXCI6XCI8XCIsXCJMdFwiOlwi4omqXCIsXCJsdGRvdFwiOlwi4ouWXCIsXCJsdGhyZWVcIjpcIuKLi1wiLFwibHRpbWVzXCI6XCLii4lcIixcImx0bGFyclwiOlwi4qW2XCIsXCJsdHF1ZXN0XCI6XCLiqbtcIixcImx0cmlcIjpcIuKXg1wiLFwibHRyaWVcIjpcIuKKtFwiLFwibHRyaWZcIjpcIuKXglwiLFwibHRyUGFyXCI6XCLippZcIixcImx1cmRzaGFyXCI6XCLipYpcIixcImx1cnVoYXJcIjpcIuKlplwiLFwibHZlcnRuZXFxXCI6XCLiiajvuIBcIixcImx2bkVcIjpcIuKJqO+4gFwiLFwibWFjclwiOlwiwq9cIixcIm1hbGVcIjpcIuKZglwiLFwibWFsdFwiOlwi4pygXCIsXCJtYWx0ZXNlXCI6XCLinKBcIixcIk1hcFwiOlwi4qSFXCIsXCJtYXBcIjpcIuKGplwiLFwibWFwc3RvXCI6XCLihqZcIixcIm1hcHN0b2Rvd25cIjpcIuKGp1wiLFwibWFwc3RvbGVmdFwiOlwi4oakXCIsXCJtYXBzdG91cFwiOlwi4oalXCIsXCJtYXJrZXJcIjpcIuKWrlwiLFwibWNvbW1hXCI6XCLiqKlcIixcIk1jeVwiOlwi0JxcIixcIm1jeVwiOlwi0LxcIixcIm1kYXNoXCI6XCLigJRcIixcIm1ERG90XCI6XCLiiLpcIixcIm1lYXN1cmVkYW5nbGVcIjpcIuKIoVwiLFwiTWVkaXVtU3BhY2VcIjpcIuKBn1wiLFwiTWVsbGludHJmXCI6XCLihLNcIixcIk1mclwiOlwi8J2UkFwiLFwibWZyXCI6XCLwnZSqXCIsXCJtaG9cIjpcIuKEp1wiLFwibWljcm9cIjpcIsK1XCIsXCJtaWRhc3RcIjpcIipcIixcIm1pZGNpclwiOlwi4quwXCIsXCJtaWRcIjpcIuKIo1wiLFwibWlkZG90XCI6XCLCt1wiLFwibWludXNiXCI6XCLiip9cIixcIm1pbnVzXCI6XCLiiJJcIixcIm1pbnVzZFwiOlwi4oi4XCIsXCJtaW51c2R1XCI6XCLiqKpcIixcIk1pbnVzUGx1c1wiOlwi4oiTXCIsXCJtbGNwXCI6XCLiq5tcIixcIm1sZHJcIjpcIuKAplwiLFwibW5wbHVzXCI6XCLiiJNcIixcIm1vZGVsc1wiOlwi4oqnXCIsXCJNb3BmXCI6XCLwnZWEXCIsXCJtb3BmXCI6XCLwnZWeXCIsXCJtcFwiOlwi4oiTXCIsXCJtc2NyXCI6XCLwnZOCXCIsXCJNc2NyXCI6XCLihLNcIixcIm1zdHBvc1wiOlwi4oi+XCIsXCJNdVwiOlwizpxcIixcIm11XCI6XCLOvFwiLFwibXVsdGltYXBcIjpcIuKKuFwiLFwibXVtYXBcIjpcIuKKuFwiLFwibmFibGFcIjpcIuKIh1wiLFwiTmFjdXRlXCI6XCLFg1wiLFwibmFjdXRlXCI6XCLFhFwiLFwibmFuZ1wiOlwi4oig4oOSXCIsXCJuYXBcIjpcIuKJiVwiLFwibmFwRVwiOlwi4qmwzLhcIixcIm5hcGlkXCI6XCLiiYvMuFwiLFwibmFwb3NcIjpcIsWJXCIsXCJuYXBwcm94XCI6XCLiiYlcIixcIm5hdHVyYWxcIjpcIuKZrlwiLFwibmF0dXJhbHNcIjpcIuKElVwiLFwibmF0dXJcIjpcIuKZrlwiLFwibmJzcFwiOlwiwqBcIixcIm5idW1wXCI6XCLiiY7MuFwiLFwibmJ1bXBlXCI6XCLiiY/MuFwiLFwibmNhcFwiOlwi4qmDXCIsXCJOY2Fyb25cIjpcIsWHXCIsXCJuY2Fyb25cIjpcIsWIXCIsXCJOY2VkaWxcIjpcIsWFXCIsXCJuY2VkaWxcIjpcIsWGXCIsXCJuY29uZ1wiOlwi4omHXCIsXCJuY29uZ2RvdFwiOlwi4qmtzLhcIixcIm5jdXBcIjpcIuKpglwiLFwiTmN5XCI6XCLQnVwiLFwibmN5XCI6XCLQvVwiLFwibmRhc2hcIjpcIuKAk1wiLFwibmVhcmhrXCI6XCLipKRcIixcIm5lYXJyXCI6XCLihpdcIixcIm5lQXJyXCI6XCLih5dcIixcIm5lYXJyb3dcIjpcIuKGl1wiLFwibmVcIjpcIuKJoFwiLFwibmVkb3RcIjpcIuKJkMy4XCIsXCJOZWdhdGl2ZU1lZGl1bVNwYWNlXCI6XCLigItcIixcIk5lZ2F0aXZlVGhpY2tTcGFjZVwiOlwi4oCLXCIsXCJOZWdhdGl2ZVRoaW5TcGFjZVwiOlwi4oCLXCIsXCJOZWdhdGl2ZVZlcnlUaGluU3BhY2VcIjpcIuKAi1wiLFwibmVxdWl2XCI6XCLiiaJcIixcIm5lc2VhclwiOlwi4qSoXCIsXCJuZXNpbVwiOlwi4omCzLhcIixcIk5lc3RlZEdyZWF0ZXJHcmVhdGVyXCI6XCLiiatcIixcIk5lc3RlZExlc3NMZXNzXCI6XCLiiapcIixcIk5ld0xpbmVcIjpcIlxcblwiLFwibmV4aXN0XCI6XCLiiIRcIixcIm5leGlzdHNcIjpcIuKIhFwiLFwiTmZyXCI6XCLwnZSRXCIsXCJuZnJcIjpcIvCdlKtcIixcIm5nRVwiOlwi4omnzLhcIixcIm5nZVwiOlwi4omxXCIsXCJuZ2VxXCI6XCLiibFcIixcIm5nZXFxXCI6XCLiiafMuFwiLFwibmdlcXNsYW50XCI6XCLiqb7MuFwiLFwibmdlc1wiOlwi4qm+zLhcIixcIm5HZ1wiOlwi4ouZzLhcIixcIm5nc2ltXCI6XCLiibVcIixcIm5HdFwiOlwi4omr4oOSXCIsXCJuZ3RcIjpcIuKJr1wiLFwibmd0clwiOlwi4omvXCIsXCJuR3R2XCI6XCLiiavMuFwiLFwibmhhcnJcIjpcIuKGrlwiLFwibmhBcnJcIjpcIuKHjlwiLFwibmhwYXJcIjpcIuKrslwiLFwibmlcIjpcIuKIi1wiLFwibmlzXCI6XCLii7xcIixcIm5pc2RcIjpcIuKLulwiLFwibml2XCI6XCLiiItcIixcIk5KY3lcIjpcItCKXCIsXCJuamN5XCI6XCLRmlwiLFwibmxhcnJcIjpcIuKGmlwiLFwibmxBcnJcIjpcIuKHjVwiLFwibmxkclwiOlwi4oClXCIsXCJubEVcIjpcIuKJpsy4XCIsXCJubGVcIjpcIuKJsFwiLFwibmxlZnRhcnJvd1wiOlwi4oaaXCIsXCJuTGVmdGFycm93XCI6XCLih41cIixcIm5sZWZ0cmlnaHRhcnJvd1wiOlwi4oauXCIsXCJuTGVmdHJpZ2h0YXJyb3dcIjpcIuKHjlwiLFwibmxlcVwiOlwi4omwXCIsXCJubGVxcVwiOlwi4ommzLhcIixcIm5sZXFzbGFudFwiOlwi4qm9zLhcIixcIm5sZXNcIjpcIuKpvcy4XCIsXCJubGVzc1wiOlwi4omuXCIsXCJuTGxcIjpcIuKLmMy4XCIsXCJubHNpbVwiOlwi4om0XCIsXCJuTHRcIjpcIuKJquKDklwiLFwibmx0XCI6XCLiia5cIixcIm5sdHJpXCI6XCLii6pcIixcIm5sdHJpZVwiOlwi4ousXCIsXCJuTHR2XCI6XCLiiarMuFwiLFwibm1pZFwiOlwi4oikXCIsXCJOb0JyZWFrXCI6XCLigaBcIixcIk5vbkJyZWFraW5nU3BhY2VcIjpcIsKgXCIsXCJub3BmXCI6XCLwnZWfXCIsXCJOb3BmXCI6XCLihJVcIixcIk5vdFwiOlwi4qusXCIsXCJub3RcIjpcIsKsXCIsXCJOb3RDb25ncnVlbnRcIjpcIuKJolwiLFwiTm90Q3VwQ2FwXCI6XCLiia1cIixcIk5vdERvdWJsZVZlcnRpY2FsQmFyXCI6XCLiiKZcIixcIk5vdEVsZW1lbnRcIjpcIuKIiVwiLFwiTm90RXF1YWxcIjpcIuKJoFwiLFwiTm90RXF1YWxUaWxkZVwiOlwi4omCzLhcIixcIk5vdEV4aXN0c1wiOlwi4oiEXCIsXCJOb3RHcmVhdGVyXCI6XCLiia9cIixcIk5vdEdyZWF0ZXJFcXVhbFwiOlwi4omxXCIsXCJOb3RHcmVhdGVyRnVsbEVxdWFsXCI6XCLiiafMuFwiLFwiTm90R3JlYXRlckdyZWF0ZXJcIjpcIuKJq8y4XCIsXCJOb3RHcmVhdGVyTGVzc1wiOlwi4om5XCIsXCJOb3RHcmVhdGVyU2xhbnRFcXVhbFwiOlwi4qm+zLhcIixcIk5vdEdyZWF0ZXJUaWxkZVwiOlwi4om1XCIsXCJOb3RIdW1wRG93bkh1bXBcIjpcIuKJjsy4XCIsXCJOb3RIdW1wRXF1YWxcIjpcIuKJj8y4XCIsXCJub3RpblwiOlwi4oiJXCIsXCJub3RpbmRvdFwiOlwi4ou1zLhcIixcIm5vdGluRVwiOlwi4ou5zLhcIixcIm5vdGludmFcIjpcIuKIiVwiLFwibm90aW52YlwiOlwi4ou3XCIsXCJub3RpbnZjXCI6XCLii7ZcIixcIk5vdExlZnRUcmlhbmdsZUJhclwiOlwi4qePzLhcIixcIk5vdExlZnRUcmlhbmdsZVwiOlwi4ouqXCIsXCJOb3RMZWZ0VHJpYW5nbGVFcXVhbFwiOlwi4ousXCIsXCJOb3RMZXNzXCI6XCLiia5cIixcIk5vdExlc3NFcXVhbFwiOlwi4omwXCIsXCJOb3RMZXNzR3JlYXRlclwiOlwi4om4XCIsXCJOb3RMZXNzTGVzc1wiOlwi4omqzLhcIixcIk5vdExlc3NTbGFudEVxdWFsXCI6XCLiqb3MuFwiLFwiTm90TGVzc1RpbGRlXCI6XCLiibRcIixcIk5vdE5lc3RlZEdyZWF0ZXJHcmVhdGVyXCI6XCLiqqLMuFwiLFwiTm90TmVzdGVkTGVzc0xlc3NcIjpcIuKqocy4XCIsXCJub3RuaVwiOlwi4oiMXCIsXCJub3RuaXZhXCI6XCLiiIxcIixcIm5vdG5pdmJcIjpcIuKLvlwiLFwibm90bml2Y1wiOlwi4ou9XCIsXCJOb3RQcmVjZWRlc1wiOlwi4oqAXCIsXCJOb3RQcmVjZWRlc0VxdWFsXCI6XCLiqq/MuFwiLFwiTm90UHJlY2VkZXNTbGFudEVxdWFsXCI6XCLii6BcIixcIk5vdFJldmVyc2VFbGVtZW50XCI6XCLiiIxcIixcIk5vdFJpZ2h0VHJpYW5nbGVCYXJcIjpcIuKnkMy4XCIsXCJOb3RSaWdodFRyaWFuZ2xlXCI6XCLii6tcIixcIk5vdFJpZ2h0VHJpYW5nbGVFcXVhbFwiOlwi4outXCIsXCJOb3RTcXVhcmVTdWJzZXRcIjpcIuKKj8y4XCIsXCJOb3RTcXVhcmVTdWJzZXRFcXVhbFwiOlwi4ouiXCIsXCJOb3RTcXVhcmVTdXBlcnNldFwiOlwi4oqQzLhcIixcIk5vdFNxdWFyZVN1cGVyc2V0RXF1YWxcIjpcIuKLo1wiLFwiTm90U3Vic2V0XCI6XCLiioLig5JcIixcIk5vdFN1YnNldEVxdWFsXCI6XCLiiohcIixcIk5vdFN1Y2NlZWRzXCI6XCLiioFcIixcIk5vdFN1Y2NlZWRzRXF1YWxcIjpcIuKqsMy4XCIsXCJOb3RTdWNjZWVkc1NsYW50RXF1YWxcIjpcIuKLoVwiLFwiTm90U3VjY2VlZHNUaWxkZVwiOlwi4om/zLhcIixcIk5vdFN1cGVyc2V0XCI6XCLiioPig5JcIixcIk5vdFN1cGVyc2V0RXF1YWxcIjpcIuKKiVwiLFwiTm90VGlsZGVcIjpcIuKJgVwiLFwiTm90VGlsZGVFcXVhbFwiOlwi4omEXCIsXCJOb3RUaWxkZUZ1bGxFcXVhbFwiOlwi4omHXCIsXCJOb3RUaWxkZVRpbGRlXCI6XCLiiYlcIixcIk5vdFZlcnRpY2FsQmFyXCI6XCLiiKRcIixcIm5wYXJhbGxlbFwiOlwi4oimXCIsXCJucGFyXCI6XCLiiKZcIixcIm5wYXJzbFwiOlwi4qu94oOlXCIsXCJucGFydFwiOlwi4oiCzLhcIixcIm5wb2xpbnRcIjpcIuKolFwiLFwibnByXCI6XCLiioBcIixcIm5wcmN1ZVwiOlwi4ougXCIsXCJucHJlY1wiOlwi4oqAXCIsXCJucHJlY2VxXCI6XCLiqq/MuFwiLFwibnByZVwiOlwi4qqvzLhcIixcIm5yYXJyY1wiOlwi4qSzzLhcIixcIm5yYXJyXCI6XCLihptcIixcIm5yQXJyXCI6XCLih49cIixcIm5yYXJyd1wiOlwi4oadzLhcIixcIm5yaWdodGFycm93XCI6XCLihptcIixcIm5SaWdodGFycm93XCI6XCLih49cIixcIm5ydHJpXCI6XCLii6tcIixcIm5ydHJpZVwiOlwi4outXCIsXCJuc2NcIjpcIuKKgVwiLFwibnNjY3VlXCI6XCLii6FcIixcIm5zY2VcIjpcIuKqsMy4XCIsXCJOc2NyXCI6XCLwnZKpXCIsXCJuc2NyXCI6XCLwnZODXCIsXCJuc2hvcnRtaWRcIjpcIuKIpFwiLFwibnNob3J0cGFyYWxsZWxcIjpcIuKIplwiLFwibnNpbVwiOlwi4omBXCIsXCJuc2ltZVwiOlwi4omEXCIsXCJuc2ltZXFcIjpcIuKJhFwiLFwibnNtaWRcIjpcIuKIpFwiLFwibnNwYXJcIjpcIuKIplwiLFwibnNxc3ViZVwiOlwi4ouiXCIsXCJuc3FzdXBlXCI6XCLii6NcIixcIm5zdWJcIjpcIuKKhFwiLFwibnN1YkVcIjpcIuKrhcy4XCIsXCJuc3ViZVwiOlwi4oqIXCIsXCJuc3Vic2V0XCI6XCLiioLig5JcIixcIm5zdWJzZXRlcVwiOlwi4oqIXCIsXCJuc3Vic2V0ZXFxXCI6XCLiq4XMuFwiLFwibnN1Y2NcIjpcIuKKgVwiLFwibnN1Y2NlcVwiOlwi4qqwzLhcIixcIm5zdXBcIjpcIuKKhVwiLFwibnN1cEVcIjpcIuKrhsy4XCIsXCJuc3VwZVwiOlwi4oqJXCIsXCJuc3Vwc2V0XCI6XCLiioPig5JcIixcIm5zdXBzZXRlcVwiOlwi4oqJXCIsXCJuc3Vwc2V0ZXFxXCI6XCLiq4bMuFwiLFwibnRnbFwiOlwi4om5XCIsXCJOdGlsZGVcIjpcIsORXCIsXCJudGlsZGVcIjpcIsOxXCIsXCJudGxnXCI6XCLiibhcIixcIm50cmlhbmdsZWxlZnRcIjpcIuKLqlwiLFwibnRyaWFuZ2xlbGVmdGVxXCI6XCLii6xcIixcIm50cmlhbmdsZXJpZ2h0XCI6XCLii6tcIixcIm50cmlhbmdsZXJpZ2h0ZXFcIjpcIuKLrVwiLFwiTnVcIjpcIs6dXCIsXCJudVwiOlwizr1cIixcIm51bVwiOlwiI1wiLFwibnVtZXJvXCI6XCLihJZcIixcIm51bXNwXCI6XCLigIdcIixcIm52YXBcIjpcIuKJjeKDklwiLFwibnZkYXNoXCI6XCLiiqxcIixcIm52RGFzaFwiOlwi4oqtXCIsXCJuVmRhc2hcIjpcIuKKrlwiLFwiblZEYXNoXCI6XCLiiq9cIixcIm52Z2VcIjpcIuKJpeKDklwiLFwibnZndFwiOlwiPuKDklwiLFwibnZIYXJyXCI6XCLipIRcIixcIm52aW5maW5cIjpcIuKnnlwiLFwibnZsQXJyXCI6XCLipIJcIixcIm52bGVcIjpcIuKJpOKDklwiLFwibnZsdFwiOlwiPOKDklwiLFwibnZsdHJpZVwiOlwi4oq04oOSXCIsXCJudnJBcnJcIjpcIuKkg1wiLFwibnZydHJpZVwiOlwi4oq14oOSXCIsXCJudnNpbVwiOlwi4oi84oOSXCIsXCJud2FyaGtcIjpcIuKko1wiLFwibndhcnJcIjpcIuKGllwiLFwibndBcnJcIjpcIuKHllwiLFwibndhcnJvd1wiOlwi4oaWXCIsXCJud25lYXJcIjpcIuKkp1wiLFwiT2FjdXRlXCI6XCLDk1wiLFwib2FjdXRlXCI6XCLDs1wiLFwib2FzdFwiOlwi4oqbXCIsXCJPY2lyY1wiOlwiw5RcIixcIm9jaXJjXCI6XCLDtFwiLFwib2NpclwiOlwi4oqaXCIsXCJPY3lcIjpcItCeXCIsXCJvY3lcIjpcItC+XCIsXCJvZGFzaFwiOlwi4oqdXCIsXCJPZGJsYWNcIjpcIsWQXCIsXCJvZGJsYWNcIjpcIsWRXCIsXCJvZGl2XCI6XCLiqLhcIixcIm9kb3RcIjpcIuKKmVwiLFwib2Rzb2xkXCI6XCLiprxcIixcIk9FbGlnXCI6XCLFklwiLFwib2VsaWdcIjpcIsWTXCIsXCJvZmNpclwiOlwi4qa/XCIsXCJPZnJcIjpcIvCdlJJcIixcIm9mclwiOlwi8J2UrFwiLFwib2dvblwiOlwiy5tcIixcIk9ncmF2ZVwiOlwiw5JcIixcIm9ncmF2ZVwiOlwiw7JcIixcIm9ndFwiOlwi4qeBXCIsXCJvaGJhclwiOlwi4qa1XCIsXCJvaG1cIjpcIs6pXCIsXCJvaW50XCI6XCLiiK5cIixcIm9sYXJyXCI6XCLihrpcIixcIm9sY2lyXCI6XCLipr5cIixcIm9sY3Jvc3NcIjpcIuKmu1wiLFwib2xpbmVcIjpcIuKAvlwiLFwib2x0XCI6XCLip4BcIixcIk9tYWNyXCI6XCLFjFwiLFwib21hY3JcIjpcIsWNXCIsXCJPbWVnYVwiOlwizqlcIixcIm9tZWdhXCI6XCLPiVwiLFwiT21pY3JvblwiOlwizp9cIixcIm9taWNyb25cIjpcIs6/XCIsXCJvbWlkXCI6XCLiprZcIixcIm9taW51c1wiOlwi4oqWXCIsXCJPb3BmXCI6XCLwnZWGXCIsXCJvb3BmXCI6XCLwnZWgXCIsXCJvcGFyXCI6XCLiprdcIixcIk9wZW5DdXJseURvdWJsZVF1b3RlXCI6XCLigJxcIixcIk9wZW5DdXJseVF1b3RlXCI6XCLigJhcIixcIm9wZXJwXCI6XCLiprlcIixcIm9wbHVzXCI6XCLiipVcIixcIm9yYXJyXCI6XCLihrtcIixcIk9yXCI6XCLiqZRcIixcIm9yXCI6XCLiiKhcIixcIm9yZFwiOlwi4qmdXCIsXCJvcmRlclwiOlwi4oS0XCIsXCJvcmRlcm9mXCI6XCLihLRcIixcIm9yZGZcIjpcIsKqXCIsXCJvcmRtXCI6XCLCulwiLFwib3JpZ29mXCI6XCLiirZcIixcIm9yb3JcIjpcIuKpllwiLFwib3JzbG9wZVwiOlwi4qmXXCIsXCJvcnZcIjpcIuKpm1wiLFwib1NcIjpcIuKTiFwiLFwiT3NjclwiOlwi8J2SqlwiLFwib3NjclwiOlwi4oS0XCIsXCJPc2xhc2hcIjpcIsOYXCIsXCJvc2xhc2hcIjpcIsO4XCIsXCJvc29sXCI6XCLiiphcIixcIk90aWxkZVwiOlwiw5VcIixcIm90aWxkZVwiOlwiw7VcIixcIm90aW1lc2FzXCI6XCLiqLZcIixcIk90aW1lc1wiOlwi4qi3XCIsXCJvdGltZXNcIjpcIuKKl1wiLFwiT3VtbFwiOlwiw5ZcIixcIm91bWxcIjpcIsO2XCIsXCJvdmJhclwiOlwi4oy9XCIsXCJPdmVyQmFyXCI6XCLigL5cIixcIk92ZXJCcmFjZVwiOlwi4o+eXCIsXCJPdmVyQnJhY2tldFwiOlwi4o60XCIsXCJPdmVyUGFyZW50aGVzaXNcIjpcIuKPnFwiLFwicGFyYVwiOlwiwrZcIixcInBhcmFsbGVsXCI6XCLiiKVcIixcInBhclwiOlwi4oilXCIsXCJwYXJzaW1cIjpcIuKrs1wiLFwicGFyc2xcIjpcIuKrvVwiLFwicGFydFwiOlwi4oiCXCIsXCJQYXJ0aWFsRFwiOlwi4oiCXCIsXCJQY3lcIjpcItCfXCIsXCJwY3lcIjpcItC/XCIsXCJwZXJjbnRcIjpcIiVcIixcInBlcmlvZFwiOlwiLlwiLFwicGVybWlsXCI6XCLigLBcIixcInBlcnBcIjpcIuKKpVwiLFwicGVydGVua1wiOlwi4oCxXCIsXCJQZnJcIjpcIvCdlJNcIixcInBmclwiOlwi8J2UrVwiLFwiUGhpXCI6XCLOplwiLFwicGhpXCI6XCLPhlwiLFwicGhpdlwiOlwiz5VcIixcInBobW1hdFwiOlwi4oSzXCIsXCJwaG9uZVwiOlwi4piOXCIsXCJQaVwiOlwizqBcIixcInBpXCI6XCLPgFwiLFwicGl0Y2hmb3JrXCI6XCLii5RcIixcInBpdlwiOlwiz5ZcIixcInBsYW5ja1wiOlwi4oSPXCIsXCJwbGFuY2toXCI6XCLihI5cIixcInBsYW5rdlwiOlwi4oSPXCIsXCJwbHVzYWNpclwiOlwi4qijXCIsXCJwbHVzYlwiOlwi4oqeXCIsXCJwbHVzY2lyXCI6XCLiqKJcIixcInBsdXNcIjpcIitcIixcInBsdXNkb1wiOlwi4oiUXCIsXCJwbHVzZHVcIjpcIuKopVwiLFwicGx1c2VcIjpcIuKpslwiLFwiUGx1c01pbnVzXCI6XCLCsVwiLFwicGx1c21uXCI6XCLCsVwiLFwicGx1c3NpbVwiOlwi4qimXCIsXCJwbHVzdHdvXCI6XCLiqKdcIixcInBtXCI6XCLCsVwiLFwiUG9pbmNhcmVwbGFuZVwiOlwi4oSMXCIsXCJwb2ludGludFwiOlwi4qiVXCIsXCJwb3BmXCI6XCLwnZWhXCIsXCJQb3BmXCI6XCLihJlcIixcInBvdW5kXCI6XCLCo1wiLFwicHJhcFwiOlwi4qq3XCIsXCJQclwiOlwi4qq7XCIsXCJwclwiOlwi4om6XCIsXCJwcmN1ZVwiOlwi4om8XCIsXCJwcmVjYXBwcm94XCI6XCLiqrdcIixcInByZWNcIjpcIuKJulwiLFwicHJlY2N1cmx5ZXFcIjpcIuKJvFwiLFwiUHJlY2VkZXNcIjpcIuKJulwiLFwiUHJlY2VkZXNFcXVhbFwiOlwi4qqvXCIsXCJQcmVjZWRlc1NsYW50RXF1YWxcIjpcIuKJvFwiLFwiUHJlY2VkZXNUaWxkZVwiOlwi4om+XCIsXCJwcmVjZXFcIjpcIuKqr1wiLFwicHJlY25hcHByb3hcIjpcIuKquVwiLFwicHJlY25lcXFcIjpcIuKqtVwiLFwicHJlY25zaW1cIjpcIuKLqFwiLFwicHJlXCI6XCLiqq9cIixcInByRVwiOlwi4qqzXCIsXCJwcmVjc2ltXCI6XCLiib5cIixcInByaW1lXCI6XCLigLJcIixcIlByaW1lXCI6XCLigLNcIixcInByaW1lc1wiOlwi4oSZXCIsXCJwcm5hcFwiOlwi4qq5XCIsXCJwcm5FXCI6XCLiqrVcIixcInBybnNpbVwiOlwi4ouoXCIsXCJwcm9kXCI6XCLiiI9cIixcIlByb2R1Y3RcIjpcIuKIj1wiLFwicHJvZmFsYXJcIjpcIuKMrlwiLFwicHJvZmxpbmVcIjpcIuKMklwiLFwicHJvZnN1cmZcIjpcIuKMk1wiLFwicHJvcFwiOlwi4oidXCIsXCJQcm9wb3J0aW9uYWxcIjpcIuKInVwiLFwiUHJvcG9ydGlvblwiOlwi4oi3XCIsXCJwcm9wdG9cIjpcIuKInVwiLFwicHJzaW1cIjpcIuKJvlwiLFwicHJ1cmVsXCI6XCLiirBcIixcIlBzY3JcIjpcIvCdkqtcIixcInBzY3JcIjpcIvCdk4VcIixcIlBzaVwiOlwizqhcIixcInBzaVwiOlwiz4hcIixcInB1bmNzcFwiOlwi4oCIXCIsXCJRZnJcIjpcIvCdlJRcIixcInFmclwiOlwi8J2UrlwiLFwicWludFwiOlwi4qiMXCIsXCJxb3BmXCI6XCLwnZWiXCIsXCJRb3BmXCI6XCLihJpcIixcInFwcmltZVwiOlwi4oGXXCIsXCJRc2NyXCI6XCLwnZKsXCIsXCJxc2NyXCI6XCLwnZOGXCIsXCJxdWF0ZXJuaW9uc1wiOlwi4oSNXCIsXCJxdWF0aW50XCI6XCLiqJZcIixcInF1ZXN0XCI6XCI/XCIsXCJxdWVzdGVxXCI6XCLiiZ9cIixcInF1b3RcIjpcIlxcXCJcIixcIlFVT1RcIjpcIlxcXCJcIixcInJBYXJyXCI6XCLih5tcIixcInJhY2VcIjpcIuKIvcyxXCIsXCJSYWN1dGVcIjpcIsWUXCIsXCJyYWN1dGVcIjpcIsWVXCIsXCJyYWRpY1wiOlwi4oiaXCIsXCJyYWVtcHR5dlwiOlwi4qazXCIsXCJyYW5nXCI6XCLin6lcIixcIlJhbmdcIjpcIuKfq1wiLFwicmFuZ2RcIjpcIuKmklwiLFwicmFuZ2VcIjpcIuKmpVwiLFwicmFuZ2xlXCI6XCLin6lcIixcInJhcXVvXCI6XCLCu1wiLFwicmFycmFwXCI6XCLipbVcIixcInJhcnJiXCI6XCLih6VcIixcInJhcnJiZnNcIjpcIuKkoFwiLFwicmFycmNcIjpcIuKks1wiLFwicmFyclwiOlwi4oaSXCIsXCJSYXJyXCI6XCLihqBcIixcInJBcnJcIjpcIuKHklwiLFwicmFycmZzXCI6XCLipJ5cIixcInJhcnJoa1wiOlwi4oaqXCIsXCJyYXJybHBcIjpcIuKGrFwiLFwicmFycnBsXCI6XCLipYVcIixcInJhcnJzaW1cIjpcIuKltFwiLFwiUmFycnRsXCI6XCLipJZcIixcInJhcnJ0bFwiOlwi4oajXCIsXCJyYXJyd1wiOlwi4oadXCIsXCJyYXRhaWxcIjpcIuKkmlwiLFwickF0YWlsXCI6XCLipJxcIixcInJhdGlvXCI6XCLiiLZcIixcInJhdGlvbmFsc1wiOlwi4oSaXCIsXCJyYmFyclwiOlwi4qSNXCIsXCJyQmFyclwiOlwi4qSPXCIsXCJSQmFyclwiOlwi4qSQXCIsXCJyYmJya1wiOlwi4p2zXCIsXCJyYnJhY2VcIjpcIn1cIixcInJicmFja1wiOlwiXVwiLFwicmJya2VcIjpcIuKmjFwiLFwicmJya3NsZFwiOlwi4qaOXCIsXCJyYnJrc2x1XCI6XCLippBcIixcIlJjYXJvblwiOlwixZhcIixcInJjYXJvblwiOlwixZlcIixcIlJjZWRpbFwiOlwixZZcIixcInJjZWRpbFwiOlwixZdcIixcInJjZWlsXCI6XCLijIlcIixcInJjdWJcIjpcIn1cIixcIlJjeVwiOlwi0KBcIixcInJjeVwiOlwi0YBcIixcInJkY2FcIjpcIuKkt1wiLFwicmRsZGhhclwiOlwi4qWpXCIsXCJyZHF1b1wiOlwi4oCdXCIsXCJyZHF1b3JcIjpcIuKAnVwiLFwicmRzaFwiOlwi4oazXCIsXCJyZWFsXCI6XCLihJxcIixcInJlYWxpbmVcIjpcIuKEm1wiLFwicmVhbHBhcnRcIjpcIuKEnFwiLFwicmVhbHNcIjpcIuKEnVwiLFwiUmVcIjpcIuKEnFwiLFwicmVjdFwiOlwi4patXCIsXCJyZWdcIjpcIsKuXCIsXCJSRUdcIjpcIsKuXCIsXCJSZXZlcnNlRWxlbWVudFwiOlwi4oiLXCIsXCJSZXZlcnNlRXF1aWxpYnJpdW1cIjpcIuKHi1wiLFwiUmV2ZXJzZVVwRXF1aWxpYnJpdW1cIjpcIuKlr1wiLFwicmZpc2h0XCI6XCLipb1cIixcInJmbG9vclwiOlwi4oyLXCIsXCJyZnJcIjpcIvCdlK9cIixcIlJmclwiOlwi4oScXCIsXCJySGFyXCI6XCLipaRcIixcInJoYXJkXCI6XCLih4FcIixcInJoYXJ1XCI6XCLih4BcIixcInJoYXJ1bFwiOlwi4qWsXCIsXCJSaG9cIjpcIs6hXCIsXCJyaG9cIjpcIs+BXCIsXCJyaG92XCI6XCLPsVwiLFwiUmlnaHRBbmdsZUJyYWNrZXRcIjpcIuKfqVwiLFwiUmlnaHRBcnJvd0JhclwiOlwi4oelXCIsXCJyaWdodGFycm93XCI6XCLihpJcIixcIlJpZ2h0QXJyb3dcIjpcIuKGklwiLFwiUmlnaHRhcnJvd1wiOlwi4oeSXCIsXCJSaWdodEFycm93TGVmdEFycm93XCI6XCLih4RcIixcInJpZ2h0YXJyb3d0YWlsXCI6XCLihqNcIixcIlJpZ2h0Q2VpbGluZ1wiOlwi4oyJXCIsXCJSaWdodERvdWJsZUJyYWNrZXRcIjpcIuKfp1wiLFwiUmlnaHREb3duVGVlVmVjdG9yXCI6XCLipZ1cIixcIlJpZ2h0RG93blZlY3RvckJhclwiOlwi4qWVXCIsXCJSaWdodERvd25WZWN0b3JcIjpcIuKHglwiLFwiUmlnaHRGbG9vclwiOlwi4oyLXCIsXCJyaWdodGhhcnBvb25kb3duXCI6XCLih4FcIixcInJpZ2h0aGFycG9vbnVwXCI6XCLih4BcIixcInJpZ2h0bGVmdGFycm93c1wiOlwi4oeEXCIsXCJyaWdodGxlZnRoYXJwb29uc1wiOlwi4oeMXCIsXCJyaWdodHJpZ2h0YXJyb3dzXCI6XCLih4lcIixcInJpZ2h0c3F1aWdhcnJvd1wiOlwi4oadXCIsXCJSaWdodFRlZUFycm93XCI6XCLihqZcIixcIlJpZ2h0VGVlXCI6XCLiiqJcIixcIlJpZ2h0VGVlVmVjdG9yXCI6XCLipZtcIixcInJpZ2h0dGhyZWV0aW1lc1wiOlwi4ouMXCIsXCJSaWdodFRyaWFuZ2xlQmFyXCI6XCLip5BcIixcIlJpZ2h0VHJpYW5nbGVcIjpcIuKKs1wiLFwiUmlnaHRUcmlhbmdsZUVxdWFsXCI6XCLiirVcIixcIlJpZ2h0VXBEb3duVmVjdG9yXCI6XCLipY9cIixcIlJpZ2h0VXBUZWVWZWN0b3JcIjpcIuKlnFwiLFwiUmlnaHRVcFZlY3RvckJhclwiOlwi4qWUXCIsXCJSaWdodFVwVmVjdG9yXCI6XCLihr5cIixcIlJpZ2h0VmVjdG9yQmFyXCI6XCLipZNcIixcIlJpZ2h0VmVjdG9yXCI6XCLih4BcIixcInJpbmdcIjpcIsuaXCIsXCJyaXNpbmdkb3RzZXFcIjpcIuKJk1wiLFwicmxhcnJcIjpcIuKHhFwiLFwicmxoYXJcIjpcIuKHjFwiLFwicmxtXCI6XCLigI9cIixcInJtb3VzdGFjaGVcIjpcIuKOsVwiLFwicm1vdXN0XCI6XCLijrFcIixcInJubWlkXCI6XCLiq65cIixcInJvYW5nXCI6XCLin61cIixcInJvYXJyXCI6XCLih75cIixcInJvYnJrXCI6XCLin6dcIixcInJvcGFyXCI6XCLipoZcIixcInJvcGZcIjpcIvCdlaNcIixcIlJvcGZcIjpcIuKEnVwiLFwicm9wbHVzXCI6XCLiqK5cIixcInJvdGltZXNcIjpcIuKotVwiLFwiUm91bmRJbXBsaWVzXCI6XCLipbBcIixcInJwYXJcIjpcIilcIixcInJwYXJndFwiOlwi4qaUXCIsXCJycHBvbGludFwiOlwi4qiSXCIsXCJycmFyclwiOlwi4oeJXCIsXCJScmlnaHRhcnJvd1wiOlwi4oebXCIsXCJyc2FxdW9cIjpcIuKAulwiLFwicnNjclwiOlwi8J2Th1wiLFwiUnNjclwiOlwi4oSbXCIsXCJyc2hcIjpcIuKGsVwiLFwiUnNoXCI6XCLihrFcIixcInJzcWJcIjpcIl1cIixcInJzcXVvXCI6XCLigJlcIixcInJzcXVvclwiOlwi4oCZXCIsXCJydGhyZWVcIjpcIuKLjFwiLFwicnRpbWVzXCI6XCLii4pcIixcInJ0cmlcIjpcIuKWuVwiLFwicnRyaWVcIjpcIuKKtVwiLFwicnRyaWZcIjpcIuKWuFwiLFwicnRyaWx0cmlcIjpcIuKnjlwiLFwiUnVsZURlbGF5ZWRcIjpcIuKntFwiLFwicnVsdWhhclwiOlwi4qWoXCIsXCJyeFwiOlwi4oSeXCIsXCJTYWN1dGVcIjpcIsWaXCIsXCJzYWN1dGVcIjpcIsWbXCIsXCJzYnF1b1wiOlwi4oCaXCIsXCJzY2FwXCI6XCLiqrhcIixcIlNjYXJvblwiOlwixaBcIixcInNjYXJvblwiOlwixaFcIixcIlNjXCI6XCLiqrxcIixcInNjXCI6XCLiibtcIixcInNjY3VlXCI6XCLiib1cIixcInNjZVwiOlwi4qqwXCIsXCJzY0VcIjpcIuKqtFwiLFwiU2NlZGlsXCI6XCLFnlwiLFwic2NlZGlsXCI6XCLFn1wiLFwiU2NpcmNcIjpcIsWcXCIsXCJzY2lyY1wiOlwixZ1cIixcInNjbmFwXCI6XCLiqrpcIixcInNjbkVcIjpcIuKqtlwiLFwic2Nuc2ltXCI6XCLii6lcIixcInNjcG9saW50XCI6XCLiqJNcIixcInNjc2ltXCI6XCLiib9cIixcIlNjeVwiOlwi0KFcIixcInNjeVwiOlwi0YFcIixcInNkb3RiXCI6XCLiiqFcIixcInNkb3RcIjpcIuKLhVwiLFwic2RvdGVcIjpcIuKpplwiLFwic2VhcmhrXCI6XCLipKVcIixcInNlYXJyXCI6XCLihphcIixcInNlQXJyXCI6XCLih5hcIixcInNlYXJyb3dcIjpcIuKGmFwiLFwic2VjdFwiOlwiwqdcIixcInNlbWlcIjpcIjtcIixcInNlc3dhclwiOlwi4qSpXCIsXCJzZXRtaW51c1wiOlwi4oiWXCIsXCJzZXRtblwiOlwi4oiWXCIsXCJzZXh0XCI6XCLinLZcIixcIlNmclwiOlwi8J2UllwiLFwic2ZyXCI6XCLwnZSwXCIsXCJzZnJvd25cIjpcIuKMolwiLFwic2hhcnBcIjpcIuKZr1wiLFwiU0hDSGN5XCI6XCLQqVwiLFwic2hjaGN5XCI6XCLRiVwiLFwiU0hjeVwiOlwi0KhcIixcInNoY3lcIjpcItGIXCIsXCJTaG9ydERvd25BcnJvd1wiOlwi4oaTXCIsXCJTaG9ydExlZnRBcnJvd1wiOlwi4oaQXCIsXCJzaG9ydG1pZFwiOlwi4oijXCIsXCJzaG9ydHBhcmFsbGVsXCI6XCLiiKVcIixcIlNob3J0UmlnaHRBcnJvd1wiOlwi4oaSXCIsXCJTaG9ydFVwQXJyb3dcIjpcIuKGkVwiLFwic2h5XCI6XCLCrVwiLFwiU2lnbWFcIjpcIs6jXCIsXCJzaWdtYVwiOlwiz4NcIixcInNpZ21hZlwiOlwiz4JcIixcInNpZ21hdlwiOlwiz4JcIixcInNpbVwiOlwi4oi8XCIsXCJzaW1kb3RcIjpcIuKpqlwiLFwic2ltZVwiOlwi4omDXCIsXCJzaW1lcVwiOlwi4omDXCIsXCJzaW1nXCI6XCLiqp5cIixcInNpbWdFXCI6XCLiqqBcIixcInNpbWxcIjpcIuKqnVwiLFwic2ltbEVcIjpcIuKqn1wiLFwic2ltbmVcIjpcIuKJhlwiLFwic2ltcGx1c1wiOlwi4qikXCIsXCJzaW1yYXJyXCI6XCLipbJcIixcInNsYXJyXCI6XCLihpBcIixcIlNtYWxsQ2lyY2xlXCI6XCLiiJhcIixcInNtYWxsc2V0bWludXNcIjpcIuKIllwiLFwic21hc2hwXCI6XCLiqLNcIixcInNtZXBhcnNsXCI6XCLip6RcIixcInNtaWRcIjpcIuKIo1wiLFwic21pbGVcIjpcIuKMo1wiLFwic210XCI6XCLiqqpcIixcInNtdGVcIjpcIuKqrFwiLFwic210ZXNcIjpcIuKqrO+4gFwiLFwiU09GVGN5XCI6XCLQrFwiLFwic29mdGN5XCI6XCLRjFwiLFwic29sYmFyXCI6XCLijL9cIixcInNvbGJcIjpcIuKnhFwiLFwic29sXCI6XCIvXCIsXCJTb3BmXCI6XCLwnZWKXCIsXCJzb3BmXCI6XCLwnZWkXCIsXCJzcGFkZXNcIjpcIuKZoFwiLFwic3BhZGVzdWl0XCI6XCLimaBcIixcInNwYXJcIjpcIuKIpVwiLFwic3FjYXBcIjpcIuKKk1wiLFwic3FjYXBzXCI6XCLiipPvuIBcIixcInNxY3VwXCI6XCLiipRcIixcInNxY3Vwc1wiOlwi4oqU77iAXCIsXCJTcXJ0XCI6XCLiiJpcIixcInNxc3ViXCI6XCLiio9cIixcInNxc3ViZVwiOlwi4oqRXCIsXCJzcXN1YnNldFwiOlwi4oqPXCIsXCJzcXN1YnNldGVxXCI6XCLiipFcIixcInNxc3VwXCI6XCLiipBcIixcInNxc3VwZVwiOlwi4oqSXCIsXCJzcXN1cHNldFwiOlwi4oqQXCIsXCJzcXN1cHNldGVxXCI6XCLiipJcIixcInNxdWFyZVwiOlwi4pahXCIsXCJTcXVhcmVcIjpcIuKWoVwiLFwiU3F1YXJlSW50ZXJzZWN0aW9uXCI6XCLiipNcIixcIlNxdWFyZVN1YnNldFwiOlwi4oqPXCIsXCJTcXVhcmVTdWJzZXRFcXVhbFwiOlwi4oqRXCIsXCJTcXVhcmVTdXBlcnNldFwiOlwi4oqQXCIsXCJTcXVhcmVTdXBlcnNldEVxdWFsXCI6XCLiipJcIixcIlNxdWFyZVVuaW9uXCI6XCLiipRcIixcInNxdWFyZlwiOlwi4paqXCIsXCJzcXVcIjpcIuKWoVwiLFwic3F1ZlwiOlwi4paqXCIsXCJzcmFyclwiOlwi4oaSXCIsXCJTc2NyXCI6XCLwnZKuXCIsXCJzc2NyXCI6XCLwnZOIXCIsXCJzc2V0bW5cIjpcIuKIllwiLFwic3NtaWxlXCI6XCLijKNcIixcInNzdGFyZlwiOlwi4ouGXCIsXCJTdGFyXCI6XCLii4ZcIixcInN0YXJcIjpcIuKYhlwiLFwic3RhcmZcIjpcIuKYhVwiLFwic3RyYWlnaHRlcHNpbG9uXCI6XCLPtVwiLFwic3RyYWlnaHRwaGlcIjpcIs+VXCIsXCJzdHJuc1wiOlwiwq9cIixcInN1YlwiOlwi4oqCXCIsXCJTdWJcIjpcIuKLkFwiLFwic3ViZG90XCI6XCLiqr1cIixcInN1YkVcIjpcIuKrhVwiLFwic3ViZVwiOlwi4oqGXCIsXCJzdWJlZG90XCI6XCLiq4NcIixcInN1Ym11bHRcIjpcIuKrgVwiLFwic3VibkVcIjpcIuKri1wiLFwic3VibmVcIjpcIuKKilwiLFwic3VicGx1c1wiOlwi4qq/XCIsXCJzdWJyYXJyXCI6XCLipblcIixcInN1YnNldFwiOlwi4oqCXCIsXCJTdWJzZXRcIjpcIuKLkFwiLFwic3Vic2V0ZXFcIjpcIuKKhlwiLFwic3Vic2V0ZXFxXCI6XCLiq4VcIixcIlN1YnNldEVxdWFsXCI6XCLiioZcIixcInN1YnNldG5lcVwiOlwi4oqKXCIsXCJzdWJzZXRuZXFxXCI6XCLiq4tcIixcInN1YnNpbVwiOlwi4quHXCIsXCJzdWJzdWJcIjpcIuKrlVwiLFwic3Vic3VwXCI6XCLiq5NcIixcInN1Y2NhcHByb3hcIjpcIuKquFwiLFwic3VjY1wiOlwi4om7XCIsXCJzdWNjY3VybHllcVwiOlwi4om9XCIsXCJTdWNjZWVkc1wiOlwi4om7XCIsXCJTdWNjZWVkc0VxdWFsXCI6XCLiqrBcIixcIlN1Y2NlZWRzU2xhbnRFcXVhbFwiOlwi4om9XCIsXCJTdWNjZWVkc1RpbGRlXCI6XCLiib9cIixcInN1Y2NlcVwiOlwi4qqwXCIsXCJzdWNjbmFwcHJveFwiOlwi4qq6XCIsXCJzdWNjbmVxcVwiOlwi4qq2XCIsXCJzdWNjbnNpbVwiOlwi4oupXCIsXCJzdWNjc2ltXCI6XCLiib9cIixcIlN1Y2hUaGF0XCI6XCLiiItcIixcInN1bVwiOlwi4oiRXCIsXCJTdW1cIjpcIuKIkVwiLFwic3VuZ1wiOlwi4pmqXCIsXCJzdXAxXCI6XCLCuVwiLFwic3VwMlwiOlwiwrJcIixcInN1cDNcIjpcIsKzXCIsXCJzdXBcIjpcIuKKg1wiLFwiU3VwXCI6XCLii5FcIixcInN1cGRvdFwiOlwi4qq+XCIsXCJzdXBkc3ViXCI6XCLiq5hcIixcInN1cEVcIjpcIuKrhlwiLFwic3VwZVwiOlwi4oqHXCIsXCJzdXBlZG90XCI6XCLiq4RcIixcIlN1cGVyc2V0XCI6XCLiioNcIixcIlN1cGVyc2V0RXF1YWxcIjpcIuKKh1wiLFwic3VwaHNvbFwiOlwi4p+JXCIsXCJzdXBoc3ViXCI6XCLiq5dcIixcInN1cGxhcnJcIjpcIuKlu1wiLFwic3VwbXVsdFwiOlwi4quCXCIsXCJzdXBuRVwiOlwi4quMXCIsXCJzdXBuZVwiOlwi4oqLXCIsXCJzdXBwbHVzXCI6XCLiq4BcIixcInN1cHNldFwiOlwi4oqDXCIsXCJTdXBzZXRcIjpcIuKLkVwiLFwic3Vwc2V0ZXFcIjpcIuKKh1wiLFwic3Vwc2V0ZXFxXCI6XCLiq4ZcIixcInN1cHNldG5lcVwiOlwi4oqLXCIsXCJzdXBzZXRuZXFxXCI6XCLiq4xcIixcInN1cHNpbVwiOlwi4quIXCIsXCJzdXBzdWJcIjpcIuKrlFwiLFwic3Vwc3VwXCI6XCLiq5ZcIixcInN3YXJoa1wiOlwi4qSmXCIsXCJzd2FyclwiOlwi4oaZXCIsXCJzd0FyclwiOlwi4oeZXCIsXCJzd2Fycm93XCI6XCLihplcIixcInN3bndhclwiOlwi4qSqXCIsXCJzemxpZ1wiOlwiw59cIixcIlRhYlwiOlwiXFx0XCIsXCJ0YXJnZXRcIjpcIuKMllwiLFwiVGF1XCI6XCLOpFwiLFwidGF1XCI6XCLPhFwiLFwidGJya1wiOlwi4o60XCIsXCJUY2Fyb25cIjpcIsWkXCIsXCJ0Y2Fyb25cIjpcIsWlXCIsXCJUY2VkaWxcIjpcIsWiXCIsXCJ0Y2VkaWxcIjpcIsWjXCIsXCJUY3lcIjpcItCiXCIsXCJ0Y3lcIjpcItGCXCIsXCJ0ZG90XCI6XCLig5tcIixcInRlbHJlY1wiOlwi4oyVXCIsXCJUZnJcIjpcIvCdlJdcIixcInRmclwiOlwi8J2UsVwiLFwidGhlcmU0XCI6XCLiiLRcIixcInRoZXJlZm9yZVwiOlwi4oi0XCIsXCJUaGVyZWZvcmVcIjpcIuKItFwiLFwiVGhldGFcIjpcIs6YXCIsXCJ0aGV0YVwiOlwizrhcIixcInRoZXRhc3ltXCI6XCLPkVwiLFwidGhldGF2XCI6XCLPkVwiLFwidGhpY2thcHByb3hcIjpcIuKJiFwiLFwidGhpY2tzaW1cIjpcIuKIvFwiLFwiVGhpY2tTcGFjZVwiOlwi4oGf4oCKXCIsXCJUaGluU3BhY2VcIjpcIuKAiVwiLFwidGhpbnNwXCI6XCLigIlcIixcInRoa2FwXCI6XCLiiYhcIixcInRoa3NpbVwiOlwi4oi8XCIsXCJUSE9STlwiOlwiw55cIixcInRob3JuXCI6XCLDvlwiLFwidGlsZGVcIjpcIsucXCIsXCJUaWxkZVwiOlwi4oi8XCIsXCJUaWxkZUVxdWFsXCI6XCLiiYNcIixcIlRpbGRlRnVsbEVxdWFsXCI6XCLiiYVcIixcIlRpbGRlVGlsZGVcIjpcIuKJiFwiLFwidGltZXNiYXJcIjpcIuKosVwiLFwidGltZXNiXCI6XCLiiqBcIixcInRpbWVzXCI6XCLDl1wiLFwidGltZXNkXCI6XCLiqLBcIixcInRpbnRcIjpcIuKIrVwiLFwidG9lYVwiOlwi4qSoXCIsXCJ0b3Bib3RcIjpcIuKMtlwiLFwidG9wY2lyXCI6XCLiq7FcIixcInRvcFwiOlwi4oqkXCIsXCJUb3BmXCI6XCLwnZWLXCIsXCJ0b3BmXCI6XCLwnZWlXCIsXCJ0b3Bmb3JrXCI6XCLiq5pcIixcInRvc2FcIjpcIuKkqVwiLFwidHByaW1lXCI6XCLigLRcIixcInRyYWRlXCI6XCLihKJcIixcIlRSQURFXCI6XCLihKJcIixcInRyaWFuZ2xlXCI6XCLilrVcIixcInRyaWFuZ2xlZG93blwiOlwi4pa/XCIsXCJ0cmlhbmdsZWxlZnRcIjpcIuKXg1wiLFwidHJpYW5nbGVsZWZ0ZXFcIjpcIuKKtFwiLFwidHJpYW5nbGVxXCI6XCLiiZxcIixcInRyaWFuZ2xlcmlnaHRcIjpcIuKWuVwiLFwidHJpYW5nbGVyaWdodGVxXCI6XCLiirVcIixcInRyaWRvdFwiOlwi4pesXCIsXCJ0cmllXCI6XCLiiZxcIixcInRyaW1pbnVzXCI6XCLiqLpcIixcIlRyaXBsZURvdFwiOlwi4oObXCIsXCJ0cmlwbHVzXCI6XCLiqLlcIixcInRyaXNiXCI6XCLip41cIixcInRyaXRpbWVcIjpcIuKou1wiLFwidHJwZXppdW1cIjpcIuKPolwiLFwiVHNjclwiOlwi8J2Sr1wiLFwidHNjclwiOlwi8J2TiVwiLFwiVFNjeVwiOlwi0KZcIixcInRzY3lcIjpcItGGXCIsXCJUU0hjeVwiOlwi0ItcIixcInRzaGN5XCI6XCLRm1wiLFwiVHN0cm9rXCI6XCLFplwiLFwidHN0cm9rXCI6XCLFp1wiLFwidHdpeHRcIjpcIuKJrFwiLFwidHdvaGVhZGxlZnRhcnJvd1wiOlwi4oaeXCIsXCJ0d29oZWFkcmlnaHRhcnJvd1wiOlwi4oagXCIsXCJVYWN1dGVcIjpcIsOaXCIsXCJ1YWN1dGVcIjpcIsO6XCIsXCJ1YXJyXCI6XCLihpFcIixcIlVhcnJcIjpcIuKGn1wiLFwidUFyclwiOlwi4oeRXCIsXCJVYXJyb2NpclwiOlwi4qWJXCIsXCJVYnJjeVwiOlwi0I5cIixcInVicmN5XCI6XCLRnlwiLFwiVWJyZXZlXCI6XCLFrFwiLFwidWJyZXZlXCI6XCLFrVwiLFwiVWNpcmNcIjpcIsObXCIsXCJ1Y2lyY1wiOlwiw7tcIixcIlVjeVwiOlwi0KNcIixcInVjeVwiOlwi0YNcIixcInVkYXJyXCI6XCLih4VcIixcIlVkYmxhY1wiOlwixbBcIixcInVkYmxhY1wiOlwixbFcIixcInVkaGFyXCI6XCLipa5cIixcInVmaXNodFwiOlwi4qW+XCIsXCJVZnJcIjpcIvCdlJhcIixcInVmclwiOlwi8J2UslwiLFwiVWdyYXZlXCI6XCLDmVwiLFwidWdyYXZlXCI6XCLDuVwiLFwidUhhclwiOlwi4qWjXCIsXCJ1aGFybFwiOlwi4oa/XCIsXCJ1aGFyclwiOlwi4oa+XCIsXCJ1aGJsa1wiOlwi4paAXCIsXCJ1bGNvcm5cIjpcIuKMnFwiLFwidWxjb3JuZXJcIjpcIuKMnFwiLFwidWxjcm9wXCI6XCLijI9cIixcInVsdHJpXCI6XCLil7hcIixcIlVtYWNyXCI6XCLFqlwiLFwidW1hY3JcIjpcIsWrXCIsXCJ1bWxcIjpcIsKoXCIsXCJVbmRlckJhclwiOlwiX1wiLFwiVW5kZXJCcmFjZVwiOlwi4o+fXCIsXCJVbmRlckJyYWNrZXRcIjpcIuKOtVwiLFwiVW5kZXJQYXJlbnRoZXNpc1wiOlwi4o+dXCIsXCJVbmlvblwiOlwi4ouDXCIsXCJVbmlvblBsdXNcIjpcIuKKjlwiLFwiVW9nb25cIjpcIsWyXCIsXCJ1b2dvblwiOlwixbNcIixcIlVvcGZcIjpcIvCdlYxcIixcInVvcGZcIjpcIvCdlaZcIixcIlVwQXJyb3dCYXJcIjpcIuKkklwiLFwidXBhcnJvd1wiOlwi4oaRXCIsXCJVcEFycm93XCI6XCLihpFcIixcIlVwYXJyb3dcIjpcIuKHkVwiLFwiVXBBcnJvd0Rvd25BcnJvd1wiOlwi4oeFXCIsXCJ1cGRvd25hcnJvd1wiOlwi4oaVXCIsXCJVcERvd25BcnJvd1wiOlwi4oaVXCIsXCJVcGRvd25hcnJvd1wiOlwi4oeVXCIsXCJVcEVxdWlsaWJyaXVtXCI6XCLipa5cIixcInVwaGFycG9vbmxlZnRcIjpcIuKGv1wiLFwidXBoYXJwb29ucmlnaHRcIjpcIuKGvlwiLFwidXBsdXNcIjpcIuKKjlwiLFwiVXBwZXJMZWZ0QXJyb3dcIjpcIuKGllwiLFwiVXBwZXJSaWdodEFycm93XCI6XCLihpdcIixcInVwc2lcIjpcIs+FXCIsXCJVcHNpXCI6XCLPklwiLFwidXBzaWhcIjpcIs+SXCIsXCJVcHNpbG9uXCI6XCLOpVwiLFwidXBzaWxvblwiOlwiz4VcIixcIlVwVGVlQXJyb3dcIjpcIuKGpVwiLFwiVXBUZWVcIjpcIuKKpVwiLFwidXB1cGFycm93c1wiOlwi4oeIXCIsXCJ1cmNvcm5cIjpcIuKMnVwiLFwidXJjb3JuZXJcIjpcIuKMnVwiLFwidXJjcm9wXCI6XCLijI5cIixcIlVyaW5nXCI6XCLFrlwiLFwidXJpbmdcIjpcIsWvXCIsXCJ1cnRyaVwiOlwi4pe5XCIsXCJVc2NyXCI6XCLwnZKwXCIsXCJ1c2NyXCI6XCLwnZOKXCIsXCJ1dGRvdFwiOlwi4ouwXCIsXCJVdGlsZGVcIjpcIsWoXCIsXCJ1dGlsZGVcIjpcIsWpXCIsXCJ1dHJpXCI6XCLilrVcIixcInV0cmlmXCI6XCLilrRcIixcInV1YXJyXCI6XCLih4hcIixcIlV1bWxcIjpcIsOcXCIsXCJ1dW1sXCI6XCLDvFwiLFwidXdhbmdsZVwiOlwi4qanXCIsXCJ2YW5ncnRcIjpcIuKmnFwiLFwidmFyZXBzaWxvblwiOlwiz7VcIixcInZhcmthcHBhXCI6XCLPsFwiLFwidmFybm90aGluZ1wiOlwi4oiFXCIsXCJ2YXJwaGlcIjpcIs+VXCIsXCJ2YXJwaVwiOlwiz5ZcIixcInZhcnByb3B0b1wiOlwi4oidXCIsXCJ2YXJyXCI6XCLihpVcIixcInZBcnJcIjpcIuKHlVwiLFwidmFycmhvXCI6XCLPsVwiLFwidmFyc2lnbWFcIjpcIs+CXCIsXCJ2YXJzdWJzZXRuZXFcIjpcIuKKiu+4gFwiLFwidmFyc3Vic2V0bmVxcVwiOlwi4quL77iAXCIsXCJ2YXJzdXBzZXRuZXFcIjpcIuKKi++4gFwiLFwidmFyc3Vwc2V0bmVxcVwiOlwi4quM77iAXCIsXCJ2YXJ0aGV0YVwiOlwiz5FcIixcInZhcnRyaWFuZ2xlbGVmdFwiOlwi4oqyXCIsXCJ2YXJ0cmlhbmdsZXJpZ2h0XCI6XCLiirNcIixcInZCYXJcIjpcIuKrqFwiLFwiVmJhclwiOlwi4qurXCIsXCJ2QmFydlwiOlwi4qupXCIsXCJWY3lcIjpcItCSXCIsXCJ2Y3lcIjpcItCyXCIsXCJ2ZGFzaFwiOlwi4oqiXCIsXCJ2RGFzaFwiOlwi4oqoXCIsXCJWZGFzaFwiOlwi4oqpXCIsXCJWRGFzaFwiOlwi4oqrXCIsXCJWZGFzaGxcIjpcIuKrplwiLFwidmVlYmFyXCI6XCLiirtcIixcInZlZVwiOlwi4oioXCIsXCJWZWVcIjpcIuKLgVwiLFwidmVlZXFcIjpcIuKJmlwiLFwidmVsbGlwXCI6XCLii65cIixcInZlcmJhclwiOlwifFwiLFwiVmVyYmFyXCI6XCLigJZcIixcInZlcnRcIjpcInxcIixcIlZlcnRcIjpcIuKAllwiLFwiVmVydGljYWxCYXJcIjpcIuKIo1wiLFwiVmVydGljYWxMaW5lXCI6XCJ8XCIsXCJWZXJ0aWNhbFNlcGFyYXRvclwiOlwi4p2YXCIsXCJWZXJ0aWNhbFRpbGRlXCI6XCLiiYBcIixcIlZlcnlUaGluU3BhY2VcIjpcIuKAilwiLFwiVmZyXCI6XCLwnZSZXCIsXCJ2ZnJcIjpcIvCdlLNcIixcInZsdHJpXCI6XCLiirJcIixcInZuc3ViXCI6XCLiioLig5JcIixcInZuc3VwXCI6XCLiioPig5JcIixcIlZvcGZcIjpcIvCdlY1cIixcInZvcGZcIjpcIvCdladcIixcInZwcm9wXCI6XCLiiJ1cIixcInZydHJpXCI6XCLiirNcIixcIlZzY3JcIjpcIvCdkrFcIixcInZzY3JcIjpcIvCdk4tcIixcInZzdWJuRVwiOlwi4quL77iAXCIsXCJ2c3VibmVcIjpcIuKKiu+4gFwiLFwidnN1cG5FXCI6XCLiq4zvuIBcIixcInZzdXBuZVwiOlwi4oqL77iAXCIsXCJWdmRhc2hcIjpcIuKKqlwiLFwidnppZ3phZ1wiOlwi4qaaXCIsXCJXY2lyY1wiOlwixbRcIixcIndjaXJjXCI6XCLFtVwiLFwid2VkYmFyXCI6XCLiqZ9cIixcIndlZGdlXCI6XCLiiKdcIixcIldlZGdlXCI6XCLii4BcIixcIndlZGdlcVwiOlwi4omZXCIsXCJ3ZWllcnBcIjpcIuKEmFwiLFwiV2ZyXCI6XCLwnZSaXCIsXCJ3ZnJcIjpcIvCdlLRcIixcIldvcGZcIjpcIvCdlY5cIixcIndvcGZcIjpcIvCdlahcIixcIndwXCI6XCLihJhcIixcIndyXCI6XCLiiYBcIixcIndyZWF0aFwiOlwi4omAXCIsXCJXc2NyXCI6XCLwnZKyXCIsXCJ3c2NyXCI6XCLwnZOMXCIsXCJ4Y2FwXCI6XCLii4JcIixcInhjaXJjXCI6XCLil69cIixcInhjdXBcIjpcIuKLg1wiLFwieGR0cmlcIjpcIuKWvVwiLFwiWGZyXCI6XCLwnZSbXCIsXCJ4ZnJcIjpcIvCdlLVcIixcInhoYXJyXCI6XCLin7dcIixcInhoQXJyXCI6XCLin7pcIixcIlhpXCI6XCLOnlwiLFwieGlcIjpcIs6+XCIsXCJ4bGFyclwiOlwi4p+1XCIsXCJ4bEFyclwiOlwi4p+4XCIsXCJ4bWFwXCI6XCLin7xcIixcInhuaXNcIjpcIuKLu1wiLFwieG9kb3RcIjpcIuKogFwiLFwiWG9wZlwiOlwi8J2Vj1wiLFwieG9wZlwiOlwi8J2VqVwiLFwieG9wbHVzXCI6XCLiqIFcIixcInhvdGltZVwiOlwi4qiCXCIsXCJ4cmFyclwiOlwi4p+2XCIsXCJ4ckFyclwiOlwi4p+5XCIsXCJYc2NyXCI6XCLwnZKzXCIsXCJ4c2NyXCI6XCLwnZONXCIsXCJ4c3FjdXBcIjpcIuKohlwiLFwieHVwbHVzXCI6XCLiqIRcIixcInh1dHJpXCI6XCLilrNcIixcInh2ZWVcIjpcIuKLgVwiLFwieHdlZGdlXCI6XCLii4BcIixcIllhY3V0ZVwiOlwiw51cIixcInlhY3V0ZVwiOlwiw71cIixcIllBY3lcIjpcItCvXCIsXCJ5YWN5XCI6XCLRj1wiLFwiWWNpcmNcIjpcIsW2XCIsXCJ5Y2lyY1wiOlwixbdcIixcIlljeVwiOlwi0KtcIixcInljeVwiOlwi0YtcIixcInllblwiOlwiwqVcIixcIllmclwiOlwi8J2UnFwiLFwieWZyXCI6XCLwnZS2XCIsXCJZSWN5XCI6XCLQh1wiLFwieWljeVwiOlwi0ZdcIixcIllvcGZcIjpcIvCdlZBcIixcInlvcGZcIjpcIvCdlapcIixcIllzY3JcIjpcIvCdkrRcIixcInlzY3JcIjpcIvCdk45cIixcIllVY3lcIjpcItCuXCIsXCJ5dWN5XCI6XCLRjlwiLFwieXVtbFwiOlwiw79cIixcIll1bWxcIjpcIsW4XCIsXCJaYWN1dGVcIjpcIsW5XCIsXCJ6YWN1dGVcIjpcIsW6XCIsXCJaY2Fyb25cIjpcIsW9XCIsXCJ6Y2Fyb25cIjpcIsW+XCIsXCJaY3lcIjpcItCXXCIsXCJ6Y3lcIjpcItC3XCIsXCJaZG90XCI6XCLFu1wiLFwiemRvdFwiOlwixbxcIixcInplZXRyZlwiOlwi4oSoXCIsXCJaZXJvV2lkdGhTcGFjZVwiOlwi4oCLXCIsXCJaZXRhXCI6XCLOllwiLFwiemV0YVwiOlwizrZcIixcInpmclwiOlwi8J2Ut1wiLFwiWmZyXCI6XCLihKhcIixcIlpIY3lcIjpcItCWXCIsXCJ6aGN5XCI6XCLQtlwiLFwiemlncmFyclwiOlwi4oedXCIsXCJ6b3BmXCI6XCLwnZWrXCIsXCJab3BmXCI6XCLihKRcIixcIlpzY3JcIjpcIvCdkrVcIixcInpzY3JcIjpcIvCdk49cIixcInp3alwiOlwi4oCNXCIsXCJ6d25qXCI6XCLigIxcIn1cblxuLyoqKi8gfSksXG4vKiAxNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcInVuaXZlcnNhbFwiOjUwLFwidGFnXCI6MzAsXCJhdHRyaWJ1dGVcIjoxLFwicHNldWRvXCI6MCxcImRlc2NlbmRhbnRcIjotMSxcImNoaWxkXCI6LTEsXCJwYXJlbnRcIjotMSxcInNpYmxpbmdcIjotMSxcImFkamFjZW50XCI6LTF9XG5cbi8qKiovIH0pLFxuLyogMTYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vLyBJbnNwaXJlZCBieSBHb29nbGUgQ2xvc3VyZTpcbi8vIGh0dHA6Ly9jbG9zdXJlLWxpYnJhcnkuZ29vZ2xlY29kZS5jb20vc3ZuL2RvY3MvXG4vLyBjbG9zdXJlX2dvb2dfYXJyYXlfYXJyYXkuanMuaHRtbCNnb29nLmFycmF5LmNsZWFyXG5cblxuXG52YXIgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblx0dmFsdWUodGhpcykubGVuZ3RoID0gMDtcblx0cmV0dXJuIHRoaXM7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogMTcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5LWZ1bmN0aW9uXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHt9O1xuXG5cbi8qKiovIH0pLFxuLyogMTggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oNTEpXG5cbiAgLCBtYXggPSBNYXRoLm1heDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiByZXR1cm4gbWF4KDAsIHRvSW50ZWdlcih2YWx1ZSkpO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDE5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBjcmVhdGUgPSBPYmplY3QuY3JlYXRlLCBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiwgcGxhaW5PYmplY3QgPSB7fTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoLyogQ3VzdG9tQ3JlYXRlKi8pIHtcblx0dmFyIHNldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mLCBjdXN0b21DcmVhdGUgPSBhcmd1bWVudHNbMF0gfHwgY3JlYXRlO1xuXHRpZiAodHlwZW9mIHNldFByb3RvdHlwZU9mICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIGdldFByb3RvdHlwZU9mKHNldFByb3RvdHlwZU9mKGN1c3RvbUNyZWF0ZShudWxsKSwgcGxhaW5PYmplY3QpKSA9PT0gcGxhaW5PYmplY3Q7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogMjAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBlc2xpbnQgbm8tcHJvdG86IFwib2ZmXCIgKi9cblxuLy8gQmlnIHRoYW5rcyB0byBAV2ViUmVmbGVjdGlvbiBmb3Igc29ydGluZyB0aGlzIG91dFxuLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vV2ViUmVmbGVjdGlvbi81NTkzNTU0XG5cblxuXG52YXIgaXNPYmplY3QgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NSlcbiAgLCB2YWx1ZSAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApXG4gICwgb2JqSXNQcm90b3R5cGVPZiA9IE9iamVjdC5wcm90b3R5cGUuaXNQcm90b3R5cGVPZlxuICAsIGRlZmluZVByb3BlcnR5ICA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eVxuICAsIG51bGxEZXNjICAgICAgICA9IHtcblx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0d3JpdGFibGU6IHRydWUsXG5cdHZhbHVlOiB1bmRlZmluZWRcbn1cbiAgLCB2YWxpZGF0ZTtcblxudmFsaWRhdGUgPSBmdW5jdGlvbiAob2JqLCBwcm90b3R5cGUpIHtcblx0dmFsdWUob2JqKTtcblx0aWYgKHByb3RvdHlwZSA9PT0gbnVsbCB8fCBpc09iamVjdChwcm90b3R5cGUpKSByZXR1cm4gb2JqO1xuXHR0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJvdG90eXBlIG11c3QgYmUgbnVsbCBvciBhbiBvYmplY3RcIik7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbiAoc3RhdHVzKSB7XG5cdHZhciBmbiwgc2V0O1xuXHRpZiAoIXN0YXR1cykgcmV0dXJuIG51bGw7XG5cdGlmIChzdGF0dXMubGV2ZWwgPT09IDIpIHtcblx0XHRpZiAoc3RhdHVzLnNldCkge1xuXHRcdFx0c2V0ID0gc3RhdHVzLnNldDtcblx0XHRcdGZuID0gZnVuY3Rpb24gKG9iaiwgcHJvdG90eXBlKSB7XG5cdFx0XHRcdHNldC5jYWxsKHZhbGlkYXRlKG9iaiwgcHJvdG90eXBlKSwgcHJvdG90eXBlKTtcblx0XHRcdFx0cmV0dXJuIG9iajtcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZuID0gZnVuY3Rpb24gKG9iaiwgcHJvdG90eXBlKSB7XG5cdFx0XHRcdHZhbGlkYXRlKG9iaiwgcHJvdG90eXBlKS5fX3Byb3RvX18gPSBwcm90b3R5cGU7XG5cdFx0XHRcdHJldHVybiBvYmo7XG5cdFx0XHR9O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRmbiA9IGZ1bmN0aW9uIHNlbGYob2JqLCBwcm90b3R5cGUpIHtcblx0XHRcdHZhciBpc051bGxCYXNlO1xuXHRcdFx0dmFsaWRhdGUob2JqLCBwcm90b3R5cGUpO1xuXHRcdFx0aXNOdWxsQmFzZSA9IG9iaklzUHJvdG90eXBlT2YuY2FsbChzZWxmLm51bGxQb2x5ZmlsbCwgb2JqKTtcblx0XHRcdGlmIChpc051bGxCYXNlKSBkZWxldGUgc2VsZi5udWxsUG9seWZpbGwuX19wcm90b19fO1xuXHRcdFx0aWYgKHByb3RvdHlwZSA9PT0gbnVsbCkgcHJvdG90eXBlID0gc2VsZi5udWxsUG9seWZpbGw7XG5cdFx0XHRvYmouX19wcm90b19fID0gcHJvdG90eXBlO1xuXHRcdFx0aWYgKGlzTnVsbEJhc2UpIGRlZmluZVByb3BlcnR5KHNlbGYubnVsbFBvbHlmaWxsLCBcIl9fcHJvdG9fX1wiLCBudWxsRGVzYyk7XG5cdFx0XHRyZXR1cm4gb2JqO1xuXHRcdH07XG5cdH1cblx0cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgXCJsZXZlbFwiLCB7XG5cdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcblx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR3cml0YWJsZTogZmFsc2UsXG5cdFx0dmFsdWU6IHN0YXR1cy5sZXZlbFxuXHR9KTtcbn0oXG5cdChmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHRtcE9iajEgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cdFx0ICAsIHRtcE9iajIgPSB7fVxuXHRcdCAgLCBzZXRcblx0XHQgICwgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LnByb3RvdHlwZSwgXCJfX3Byb3RvX19cIik7XG5cblx0XHRpZiAoZGVzYykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0c2V0ID0gZGVzYy5zZXQ7IC8vIE9wZXJhIGNyYXNoZXMgYXQgdGhpcyBwb2ludFxuXHRcdFx0XHRzZXQuY2FsbCh0bXBPYmoxLCB0bXBPYmoyKTtcblx0XHRcdH0gY2F0Y2ggKGlnbm9yZSkge31cblx0XHRcdGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YodG1wT2JqMSkgPT09IHRtcE9iajIpIHJldHVybiB7IHNldDogc2V0LCBsZXZlbDogMiB9O1xuXHRcdH1cblxuXHRcdHRtcE9iajEuX19wcm90b19fID0gdG1wT2JqMjtcblx0XHRpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRtcE9iajEpID09PSB0bXBPYmoyKSByZXR1cm4geyBsZXZlbDogMiB9O1xuXG5cdFx0dG1wT2JqMSA9IHt9O1xuXHRcdHRtcE9iajEuX19wcm90b19fID0gdG1wT2JqMjtcblx0XHRpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRtcE9iajEpID09PSB0bXBPYmoyKSByZXR1cm4geyBsZXZlbDogMSB9O1xuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KSgpXG4pKTtcblxuX193ZWJwYWNrX3JlcXVpcmVfXyg1Nik7XG5cblxuLyoqKi8gfSksXG4vKiAyMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgaXNWYWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5cbnZhciBmb3JFYWNoID0gQXJyYXkucHJvdG90eXBlLmZvckVhY2gsIGNyZWF0ZSA9IE9iamVjdC5jcmVhdGU7XG5cbnZhciBwcm9jZXNzID0gZnVuY3Rpb24gKHNyYywgb2JqKSB7XG5cdHZhciBrZXk7XG5cdGZvciAoa2V5IGluIHNyYykgb2JqW2tleV0gPSBzcmNba2V5XTtcbn07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0czEgLyosIOKApm9wdGlvbnMqLykge1xuXHR2YXIgcmVzdWx0ID0gY3JlYXRlKG51bGwpO1xuXHRmb3JFYWNoLmNhbGwoYXJndW1lbnRzLCBmdW5jdGlvbiAob3B0aW9ucykge1xuXHRcdGlmICghaXNWYWx1ZShvcHRpb25zKSkgcmV0dXJuO1xuXHRcdHByb2Nlc3MoT2JqZWN0KG9wdGlvbnMpLCByZXN1bHQpO1xuXHR9KTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG5cblxuLyoqKi8gfSksXG4vKiAyMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgaXNJdGVyYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzApO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRpZiAoIWlzSXRlcmFibGUodmFsdWUpKSB0aHJvdyBuZXcgVHlwZUVycm9yKHZhbHVlICsgXCIgaXMgbm90IGl0ZXJhYmxlXCIpO1xuXHRyZXR1cm4gdmFsdWU7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogMjMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGZhbHNlRnVuYyA9IF9fd2VicGFja19yZXF1aXJlX18oNSkuZmFsc2VGdW5jO1xuXG4vL2h0dHBzOi8vZ2l0aHViLmNvbS9zbGV2aXRoYW4vWFJlZ0V4cC9ibG9iL21hc3Rlci9zcmMveHJlZ2V4cC5qcyNMNDY5XG52YXIgcmVDaGFycyA9IC9bLVtcXF17fSgpKis/LixcXFxcXiR8I1xcc10vZztcblxuZnVuY3Rpb24gZmFjdG9yeShhZGFwdGVyKXtcblx0Lypcblx0XHRhdHRyaWJ1dGUgc2VsZWN0b3JzXG5cdCovXG5cdHZhciBhdHRyaWJ1dGVSdWxlcyA9IHtcblx0XHRfX3Byb3RvX186IG51bGwsXG5cdFx0ZXF1YWxzOiBmdW5jdGlvbihuZXh0LCBkYXRhKXtcblx0XHRcdHZhciBuYW1lICA9IGRhdGEubmFtZSxcblx0XHRcdFx0dmFsdWUgPSBkYXRhLnZhbHVlO1xuXG5cdFx0XHRpZihkYXRhLmlnbm9yZUNhc2Upe1xuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGVxdWFsc0lDKGVsZW0pe1xuXHRcdFx0XHRcdHZhciBhdHRyID0gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBuYW1lKTtcblx0XHRcdFx0XHRyZXR1cm4gYXR0ciAhPSBudWxsICYmIGF0dHIudG9Mb3dlckNhc2UoKSA9PT0gdmFsdWUgJiYgbmV4dChlbGVtKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGVxdWFscyhlbGVtKXtcblx0XHRcdFx0cmV0dXJuIGFkYXB0ZXIuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbSwgbmFtZSkgPT09IHZhbHVlICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0aHlwaGVuOiBmdW5jdGlvbihuZXh0LCBkYXRhKXtcblx0XHRcdHZhciBuYW1lICA9IGRhdGEubmFtZSxcblx0XHRcdFx0dmFsdWUgPSBkYXRhLnZhbHVlLFxuXHRcdFx0XHRsZW4gPSB2YWx1ZS5sZW5ndGg7XG5cblx0XHRcdGlmKGRhdGEuaWdub3JlQ2FzZSl7XG5cdFx0XHRcdHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcblxuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gaHlwaGVuSUMoZWxlbSl7XG5cdFx0XHRcdFx0dmFyIGF0dHIgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIG5hbWUpO1xuXHRcdFx0XHRcdHJldHVybiBhdHRyICE9IG51bGwgJiZcblx0XHRcdFx0XHRcdFx0KGF0dHIubGVuZ3RoID09PSBsZW4gfHwgYXR0ci5jaGFyQXQobGVuKSA9PT0gXCItXCIpICYmXG5cdFx0XHRcdFx0XHRcdGF0dHIuc3Vic3RyKDAsIGxlbikudG9Mb3dlckNhc2UoKSA9PT0gdmFsdWUgJiZcblx0XHRcdFx0XHRcdFx0bmV4dChlbGVtKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGh5cGhlbihlbGVtKXtcblx0XHRcdFx0dmFyIGF0dHIgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIG5hbWUpO1xuXHRcdFx0XHRyZXR1cm4gYXR0ciAhPSBudWxsICYmXG5cdFx0XHRcdFx0XHRhdHRyLnN1YnN0cigwLCBsZW4pID09PSB2YWx1ZSAmJlxuXHRcdFx0XHRcdFx0KGF0dHIubGVuZ3RoID09PSBsZW4gfHwgYXR0ci5jaGFyQXQobGVuKSA9PT0gXCItXCIpICYmXG5cdFx0XHRcdFx0XHRuZXh0KGVsZW0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGVsZW1lbnQ6IGZ1bmN0aW9uKG5leHQsIGRhdGEpe1xuXHRcdFx0dmFyIG5hbWUgPSBkYXRhLm5hbWUsXG5cdFx0XHRcdHZhbHVlID0gZGF0YS52YWx1ZTtcblxuXHRcdFx0aWYoL1xccy8udGVzdCh2YWx1ZSkpe1xuXHRcdFx0XHRyZXR1cm4gZmFsc2VGdW5jO1xuXHRcdFx0fVxuXG5cdFx0XHR2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocmVDaGFycywgXCJcXFxcJCZcIik7XG5cblx0XHRcdHZhciBwYXR0ZXJuID0gXCIoPzpefFxcXFxzKVwiICsgdmFsdWUgKyBcIig/OiR8XFxcXHMpXCIsXG5cdFx0XHRcdGZsYWdzID0gZGF0YS5pZ25vcmVDYXNlID8gXCJpXCIgOiBcIlwiLFxuXHRcdFx0XHRyZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybiwgZmxhZ3MpO1xuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gZWxlbWVudChlbGVtKXtcblx0XHRcdFx0dmFyIGF0dHIgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIG5hbWUpO1xuXHRcdFx0XHRyZXR1cm4gYXR0ciAhPSBudWxsICYmIHJlZ2V4LnRlc3QoYXR0cikgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRleGlzdHM6IGZ1bmN0aW9uKG5leHQsIGRhdGEpe1xuXHRcdFx0dmFyIG5hbWUgPSBkYXRhLm5hbWU7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gZXhpc3RzKGVsZW0pe1xuXHRcdFx0XHRyZXR1cm4gYWRhcHRlci5oYXNBdHRyaWIoZWxlbSwgbmFtZSkgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRzdGFydDogZnVuY3Rpb24obmV4dCwgZGF0YSl7XG5cdFx0XHR2YXIgbmFtZSAgPSBkYXRhLm5hbWUsXG5cdFx0XHRcdHZhbHVlID0gZGF0YS52YWx1ZSxcblx0XHRcdFx0bGVuID0gdmFsdWUubGVuZ3RoO1xuXG5cdFx0XHRpZihsZW4gPT09IDApe1xuXHRcdFx0XHRyZXR1cm4gZmFsc2VGdW5jO1xuXHRcdFx0fVxuXG5cdFx0XHRpZihkYXRhLmlnbm9yZUNhc2Upe1xuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uIHN0YXJ0SUMoZWxlbSl7XG5cdFx0XHRcdFx0dmFyIGF0dHIgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIG5hbWUpO1xuXHRcdFx0XHRcdHJldHVybiBhdHRyICE9IG51bGwgJiYgYXR0ci5zdWJzdHIoMCwgbGVuKS50b0xvd2VyQ2FzZSgpID09PSB2YWx1ZSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gc3RhcnQoZWxlbSl7XG5cdFx0XHRcdHZhciBhdHRyID0gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBuYW1lKTtcblx0XHRcdFx0cmV0dXJuIGF0dHIgIT0gbnVsbCAmJiBhdHRyLnN1YnN0cigwLCBsZW4pID09PSB2YWx1ZSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGVuZDogZnVuY3Rpb24obmV4dCwgZGF0YSl7XG5cdFx0XHR2YXIgbmFtZSAgPSBkYXRhLm5hbWUsXG5cdFx0XHRcdHZhbHVlID0gZGF0YS52YWx1ZSxcblx0XHRcdFx0bGVuICAgPSAtdmFsdWUubGVuZ3RoO1xuXG5cdFx0XHRpZihsZW4gPT09IDApe1xuXHRcdFx0XHRyZXR1cm4gZmFsc2VGdW5jO1xuXHRcdFx0fVxuXG5cdFx0XHRpZihkYXRhLmlnbm9yZUNhc2Upe1xuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGVuZElDKGVsZW0pe1xuXHRcdFx0XHRcdHZhciBhdHRyID0gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBuYW1lKTtcblx0XHRcdFx0XHRyZXR1cm4gYXR0ciAhPSBudWxsICYmIGF0dHIuc3Vic3RyKGxlbikudG9Mb3dlckNhc2UoKSA9PT0gdmFsdWUgJiYgbmV4dChlbGVtKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGVuZChlbGVtKXtcblx0XHRcdFx0dmFyIGF0dHIgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIG5hbWUpO1xuXHRcdFx0XHRyZXR1cm4gYXR0ciAhPSBudWxsICYmIGF0dHIuc3Vic3RyKGxlbikgPT09IHZhbHVlICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YW55OiBmdW5jdGlvbihuZXh0LCBkYXRhKXtcblx0XHRcdHZhciBuYW1lICA9IGRhdGEubmFtZSxcblx0XHRcdFx0dmFsdWUgPSBkYXRhLnZhbHVlO1xuXG5cdFx0XHRpZih2YWx1ZSA9PT0gXCJcIil7XG5cdFx0XHRcdHJldHVybiBmYWxzZUZ1bmM7XG5cdFx0XHR9XG5cblx0XHRcdGlmKGRhdGEuaWdub3JlQ2FzZSl7XG5cdFx0XHRcdHZhciByZWdleCA9IG5ldyBSZWdFeHAodmFsdWUucmVwbGFjZShyZUNoYXJzLCBcIlxcXFwkJlwiKSwgXCJpXCIpO1xuXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiBhbnlJQyhlbGVtKXtcblx0XHRcdFx0XHR2YXIgYXR0ciA9IGFkYXB0ZXIuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbSwgbmFtZSk7XG5cdFx0XHRcdFx0cmV0dXJuIGF0dHIgIT0gbnVsbCAmJiByZWdleC50ZXN0KGF0dHIpICYmIG5leHQoZWxlbSk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmdW5jdGlvbiBhbnkoZWxlbSl7XG5cdFx0XHRcdHZhciBhdHRyID0gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBuYW1lKTtcblx0XHRcdFx0cmV0dXJuIGF0dHIgIT0gbnVsbCAmJiBhdHRyLmluZGV4T2YodmFsdWUpID49IDAgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRub3Q6IGZ1bmN0aW9uKG5leHQsIGRhdGEpe1xuXHRcdFx0dmFyIG5hbWUgID0gZGF0YS5uYW1lLFxuXHRcdFx0XHR2YWx1ZSA9IGRhdGEudmFsdWU7XG5cblx0XHRcdGlmKHZhbHVlID09PSBcIlwiKXtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uIG5vdEVtcHR5KGVsZW0pe1xuXHRcdFx0XHRcdHJldHVybiAhIWFkYXB0ZXIuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbSwgbmFtZSkgJiYgbmV4dChlbGVtKTtcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSBpZihkYXRhLmlnbm9yZUNhc2Upe1xuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uIG5vdElDKGVsZW0pe1xuXHRcdFx0XHRcdHZhciBhdHRyID0gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBuYW1lKTtcblx0XHRcdFx0XHRyZXR1cm4gYXR0ciAhPSBudWxsICYmIGF0dHIudG9Mb3dlckNhc2UoKSAhPT0gdmFsdWUgJiYgbmV4dChlbGVtKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIG5vdChlbGVtKXtcblx0XHRcdFx0cmV0dXJuIGFkYXB0ZXIuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbSwgbmFtZSkgIT09IHZhbHVlICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH1cblx0fTtcblxuXHRyZXR1cm4ge1xuXHRcdGNvbXBpbGU6IGZ1bmN0aW9uKG5leHQsIGRhdGEsIG9wdGlvbnMpe1xuXHRcdFx0aWYob3B0aW9ucyAmJiBvcHRpb25zLnN0cmljdCAmJiAoXG5cdFx0XHRcdGRhdGEuaWdub3JlQ2FzZSB8fCBkYXRhLmFjdGlvbiA9PT0gXCJub3RcIlxuXHRcdFx0KSkgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgYXR0cmlidXRlIHNlbGVjdG9yXCIpO1xuXHRcdFx0cmV0dXJuIGF0dHJpYnV0ZVJ1bGVzW2RhdGEuYWN0aW9uXShuZXh0LCBkYXRhKTtcblx0XHR9LFxuXHRcdHJ1bGVzOiBhdHRyaWJ1dGVSdWxlc1xuXHR9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZhY3Rvcnk7XG5cblxuLyoqKi8gfSksXG4vKiAyNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IENTU3NlbGVjdDtcblxudmFyIERvbVV0aWxzICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSksXG5cdGZhbHNlRnVuYyAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KS5mYWxzZUZ1bmMsXG5cdGNvbXBpbGVGYWN0b3J5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MCksXG5cdGRlZmF1bHRDb21waWxlID0gY29tcGlsZUZhY3RvcnkoRG9tVXRpbHMpO1xuXG5mdW5jdGlvbiBhZGFwdGVyQ29tcGlsZShhZGFwdGVyKXtcblx0cmV0dXJuIGFkYXB0ZXIgPT09IERvbVV0aWxzID8gZGVmYXVsdENvbXBpbGUgOiBjb21waWxlRmFjdG9yeShhZGFwdGVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0U2VsZWN0b3JGdW5jKHNlYXJjaEZ1bmMpe1xuXHRyZXR1cm4gZnVuY3Rpb24gc2VsZWN0KHF1ZXJ5LCBlbGVtcywgb3B0aW9ucyl7XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblx0XHRvcHRpb25zLmFkYXB0ZXIgPSBvcHRpb25zLmFkYXB0ZXIgfHwgRG9tVXRpbHM7XG5cdFx0dmFyIGNvbXBpbGUgPSBhZGFwdGVyQ29tcGlsZShvcHRpb25zLmFkYXB0ZXIpO1xuXG5cdFx0aWYodHlwZW9mIHF1ZXJ5ICE9PSBcImZ1bmN0aW9uXCIpIHF1ZXJ5ID0gY29tcGlsZS5jb21waWxlVW5zYWZlKHF1ZXJ5LCBvcHRpb25zLCBlbGVtcyk7XG5cdFx0aWYocXVlcnkuc2hvdWxkVGVzdE5leHRTaWJsaW5ncykgZWxlbXMgPSBhcHBlbmROZXh0U2libGluZ3MoKG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0KSB8fCBlbGVtcywgb3B0aW9ucy5hZGFwdGVyKTtcblx0XHRpZighQXJyYXkuaXNBcnJheShlbGVtcykpIGVsZW1zID0gb3B0aW9ucy5hZGFwdGVyLmdldENoaWxkcmVuKGVsZW1zKTtcblx0XHRlbHNlIGVsZW1zID0gb3B0aW9ucy5hZGFwdGVyLnJlbW92ZVN1YnNldHMoZWxlbXMpO1xuXHRcdHJldHVybiBzZWFyY2hGdW5jKHF1ZXJ5LCBlbGVtcywgb3B0aW9ucyk7XG5cdH07XG59XG5cbmZ1bmN0aW9uIGdldE5leHRTaWJsaW5ncyhlbGVtLCBhZGFwdGVyKXtcblx0dmFyIHNpYmxpbmdzID0gYWRhcHRlci5nZXRTaWJsaW5ncyhlbGVtKTtcblx0aWYoIUFycmF5LmlzQXJyYXkoc2libGluZ3MpKSByZXR1cm4gW107XG5cdHNpYmxpbmdzID0gc2libGluZ3Muc2xpY2UoMCk7XG5cdHdoaWxlKHNpYmxpbmdzLnNoaWZ0KCkgIT09IGVsZW0pO1xuXHRyZXR1cm4gc2libGluZ3M7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZE5leHRTaWJsaW5ncyhlbGVtcywgYWRhcHRlcil7XG5cdC8vIE9yZGVyIG1hdHRlcnMgYmVjYXVzZSBqUXVlcnkgc2VlbXMgdG8gY2hlY2sgdGhlIGNoaWxkcmVuIGJlZm9yZSB0aGUgc2libGluZ3Ncblx0aWYoIUFycmF5LmlzQXJyYXkoZWxlbXMpKSBlbGVtcyA9IFtlbGVtc107XG5cdHZhciBuZXdFbGVtcyA9IGVsZW1zLnNsaWNlKDApO1xuXG5cdGZvcih2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXtcblx0XHR2YXIgbmV4dFNpYmxpbmdzID0gZ2V0TmV4dFNpYmxpbmdzKG5ld0VsZW1zW2ldLCBhZGFwdGVyKTtcblx0XHRuZXdFbGVtcy5wdXNoLmFwcGx5KG5ld0VsZW1zLCBuZXh0U2libGluZ3MpO1xuXHR9XG5cdHJldHVybiBuZXdFbGVtcztcbn1cblxudmFyIHNlbGVjdEFsbCA9IGdldFNlbGVjdG9yRnVuYyhmdW5jdGlvbiBzZWxlY3RBbGwocXVlcnksIGVsZW1zLCBvcHRpb25zKXtcblx0cmV0dXJuIChxdWVyeSA9PT0gZmFsc2VGdW5jIHx8ICFlbGVtcyB8fCBlbGVtcy5sZW5ndGggPT09IDApID8gW10gOiBvcHRpb25zLmFkYXB0ZXIuZmluZEFsbChxdWVyeSwgZWxlbXMpO1xufSk7XG5cbnZhciBzZWxlY3RPbmUgPSBnZXRTZWxlY3RvckZ1bmMoZnVuY3Rpb24gc2VsZWN0T25lKHF1ZXJ5LCBlbGVtcywgb3B0aW9ucyl7XG5cdHJldHVybiAocXVlcnkgPT09IGZhbHNlRnVuYyB8fCAhZWxlbXMgfHwgZWxlbXMubGVuZ3RoID09PSAwKSA/IG51bGwgOiBvcHRpb25zLmFkYXB0ZXIuZmluZE9uZShxdWVyeSwgZWxlbXMpO1xufSk7XG5cbmZ1bmN0aW9uIGlzKGVsZW0sIHF1ZXJ5LCBvcHRpb25zKXtcblx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblx0b3B0aW9ucy5hZGFwdGVyID0gb3B0aW9ucy5hZGFwdGVyIHx8IERvbVV0aWxzO1xuXHR2YXIgY29tcGlsZSA9IGFkYXB0ZXJDb21waWxlKG9wdGlvbnMuYWRhcHRlcik7XG5cdHJldHVybiAodHlwZW9mIHF1ZXJ5ID09PSBcImZ1bmN0aW9uXCIgPyBxdWVyeSA6IGNvbXBpbGUocXVlcnksIG9wdGlvbnMpKShlbGVtKTtcbn1cblxuLypcblx0dGhlIGV4cG9ydGVkIGludGVyZmFjZVxuKi9cbmZ1bmN0aW9uIENTU3NlbGVjdChxdWVyeSwgZWxlbXMsIG9wdGlvbnMpe1xuXHRyZXR1cm4gc2VsZWN0QWxsKHF1ZXJ5LCBlbGVtcywgb3B0aW9ucyk7XG59XG5cbkNTU3NlbGVjdC5jb21waWxlID0gZGVmYXVsdENvbXBpbGU7XG5DU1NzZWxlY3QuZmlsdGVycyA9IGRlZmF1bHRDb21waWxlLlBzZXVkb3MuZmlsdGVycztcbkNTU3NlbGVjdC5wc2V1ZG9zID0gZGVmYXVsdENvbXBpbGUuUHNldWRvcy5wc2V1ZG9zO1xuXG5DU1NzZWxlY3Quc2VsZWN0QWxsID0gc2VsZWN0QWxsO1xuQ1NTc2VsZWN0LnNlbGVjdE9uZSA9IHNlbGVjdE9uZTtcblxuQ1NTc2VsZWN0LmlzID0gaXM7XG5cbi8vbGVnYWN5IG1ldGhvZHMgKG1pZ2h0IGJlIHJlbW92ZWQpXG5DU1NzZWxlY3QucGFyc2UgPSBkZWZhdWx0Q29tcGlsZTtcbkNTU3NlbGVjdC5pdGVyYXRlID0gc2VsZWN0QWxsO1xuXG4vL2hvb2tzXG5DU1NzZWxlY3QuX2NvbXBpbGVVbnNhZmUgPSBkZWZhdWx0Q29tcGlsZS5jb21waWxlVW5zYWZlO1xuQ1NTc2VsZWN0Ll9jb21waWxlVG9rZW4gPSBkZWZhdWx0Q29tcGlsZS5jb21waWxlVG9rZW47XG5cblxuLyoqKi8gfSksXG4vKiAyNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgRG9tVXRpbHMgPSBtb2R1bGUuZXhwb3J0cztcblxuW1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDI2KSxcblx0X193ZWJwYWNrX3JlcXVpcmVfXygzNSksXG5cdF9fd2VicGFja19yZXF1aXJlX18oMzYpLFxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDM3KSxcblx0X193ZWJwYWNrX3JlcXVpcmVfXygzOCksXG5cdF9fd2VicGFja19yZXF1aXJlX18oMzkpXG5dLmZvckVhY2goZnVuY3Rpb24oZXh0KXtcblx0T2JqZWN0LmtleXMoZXh0KS5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7XG5cdFx0RG9tVXRpbHNba2V5XSA9IGV4dFtrZXldLmJpbmQoRG9tVXRpbHMpO1xuXHR9KTtcbn0pO1xuXG5cbi8qKiovIH0pLFxuLyogMjYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIEVsZW1lbnRUeXBlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KSxcbiAgICBnZXRPdXRlckhUTUwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KSxcbiAgICBpc1RhZyA9IEVsZW1lbnRUeXBlLmlzVGFnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0Z2V0SW5uZXJIVE1MOiBnZXRJbm5lckhUTUwsXG5cdGdldE91dGVySFRNTDogZ2V0T3V0ZXJIVE1MLFxuXHRnZXRUZXh0OiBnZXRUZXh0XG59O1xuXG5mdW5jdGlvbiBnZXRJbm5lckhUTUwoZWxlbSwgb3B0cyl7XG5cdHJldHVybiBlbGVtLmNoaWxkcmVuID8gZWxlbS5jaGlsZHJlbi5tYXAoZnVuY3Rpb24oZWxlbSl7XG5cdFx0cmV0dXJuIGdldE91dGVySFRNTChlbGVtLCBvcHRzKTtcblx0fSkuam9pbihcIlwiKSA6IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGdldFRleHQoZWxlbSl7XG5cdGlmKEFycmF5LmlzQXJyYXkoZWxlbSkpIHJldHVybiBlbGVtLm1hcChnZXRUZXh0KS5qb2luKFwiXCIpO1xuXHRpZihpc1RhZyhlbGVtKSB8fCBlbGVtLnR5cGUgPT09IEVsZW1lbnRUeXBlLkNEQVRBKSByZXR1cm4gZ2V0VGV4dChlbGVtLmNoaWxkcmVuKTtcblx0aWYoZWxlbS50eXBlID09PSBFbGVtZW50VHlwZS5UZXh0KSByZXR1cm4gZWxlbS5kYXRhO1xuXHRyZXR1cm4gXCJcIjtcbn1cblxuXG4vKioqLyB9KSxcbi8qIDI3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbi8qXG4gIE1vZHVsZSBkZXBlbmRlbmNpZXNcbiovXG52YXIgRWxlbWVudFR5cGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI4KTtcbnZhciBlbnRpdGllcyA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpO1xuXG4vKlxuICBCb29sZWFuIEF0dHJpYnV0ZXNcbiovXG52YXIgYm9vbGVhbkF0dHJpYnV0ZXMgPSB7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgYWxsb3dmdWxsc2NyZWVuOiB0cnVlLFxuICBhc3luYzogdHJ1ZSxcbiAgYXV0b2ZvY3VzOiB0cnVlLFxuICBhdXRvcGxheTogdHJ1ZSxcbiAgY2hlY2tlZDogdHJ1ZSxcbiAgY29udHJvbHM6IHRydWUsXG4gIGRlZmF1bHQ6IHRydWUsXG4gIGRlZmVyOiB0cnVlLFxuICBkaXNhYmxlZDogdHJ1ZSxcbiAgaGlkZGVuOiB0cnVlLFxuICBpc21hcDogdHJ1ZSxcbiAgbG9vcDogdHJ1ZSxcbiAgbXVsdGlwbGU6IHRydWUsXG4gIG11dGVkOiB0cnVlLFxuICBvcGVuOiB0cnVlLFxuICByZWFkb25seTogdHJ1ZSxcbiAgcmVxdWlyZWQ6IHRydWUsXG4gIHJldmVyc2VkOiB0cnVlLFxuICBzY29wZWQ6IHRydWUsXG4gIHNlYW1sZXNzOiB0cnVlLFxuICBzZWxlY3RlZDogdHJ1ZSxcbiAgdHlwZW11c3RtYXRjaDogdHJ1ZVxufTtcblxudmFyIHVuZW5jb2RlZEVsZW1lbnRzID0ge1xuICBfX3Byb3RvX186IG51bGwsXG4gIHN0eWxlOiB0cnVlLFxuICBzY3JpcHQ6IHRydWUsXG4gIHhtcDogdHJ1ZSxcbiAgaWZyYW1lOiB0cnVlLFxuICBub2VtYmVkOiB0cnVlLFxuICBub2ZyYW1lczogdHJ1ZSxcbiAgcGxhaW50ZXh0OiB0cnVlLFxuICBub3NjcmlwdDogdHJ1ZVxufTtcblxuLypcbiAgRm9ybWF0IGF0dHJpYnV0ZXNcbiovXG5mdW5jdGlvbiBmb3JtYXRBdHRycyhhdHRyaWJ1dGVzLCBvcHRzKSB7XG4gIGlmICghYXR0cmlidXRlcykgcmV0dXJuO1xuXG4gIHZhciBvdXRwdXQgPSAnJyxcbiAgICAgIHZhbHVlO1xuXG4gIC8vIExvb3AgdGhyb3VnaCB0aGUgYXR0cmlidXRlc1xuICBmb3IgKHZhciBrZXkgaW4gYXR0cmlidXRlcykge1xuICAgIHZhbHVlID0gYXR0cmlidXRlc1trZXldO1xuICAgIGlmIChvdXRwdXQpIHtcbiAgICAgIG91dHB1dCArPSAnICc7XG4gICAgfVxuXG4gICAgaWYgKCF2YWx1ZSAmJiBib29sZWFuQXR0cmlidXRlc1trZXldKSB7XG4gICAgICBvdXRwdXQgKz0ga2V5O1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQgKz0ga2V5ICsgJz1cIicgKyAob3B0cy5kZWNvZGVFbnRpdGllcyA/IGVudGl0aWVzLmVuY29kZVhNTCh2YWx1ZSkgOiB2YWx1ZSkgKyAnXCInO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbi8qXG4gIFNlbGYtZW5jbG9zaW5nIHRhZ3MgKHN0b2xlbiBmcm9tIG5vZGUtaHRtbHBhcnNlcilcbiovXG52YXIgc2luZ2xlVGFnID0ge1xuICBfX3Byb3RvX186IG51bGwsXG4gIGFyZWE6IHRydWUsXG4gIGJhc2U6IHRydWUsXG4gIGJhc2Vmb250OiB0cnVlLFxuICBicjogdHJ1ZSxcbiAgY29sOiB0cnVlLFxuICBjb21tYW5kOiB0cnVlLFxuICBlbWJlZDogdHJ1ZSxcbiAgZnJhbWU6IHRydWUsXG4gIGhyOiB0cnVlLFxuICBpbWc6IHRydWUsXG4gIGlucHV0OiB0cnVlLFxuICBpc2luZGV4OiB0cnVlLFxuICBrZXlnZW46IHRydWUsXG4gIGxpbms6IHRydWUsXG4gIG1ldGE6IHRydWUsXG4gIHBhcmFtOiB0cnVlLFxuICBzb3VyY2U6IHRydWUsXG4gIHRyYWNrOiB0cnVlLFxuICB3YnI6IHRydWUsXG59O1xuXG5cbnZhciByZW5kZXIgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRvbSwgb3B0cykge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZG9tKSAmJiAhZG9tLmNoZWVyaW8pIGRvbSA9IFtkb21dO1xuICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICB2YXIgb3V0cHV0ID0gJyc7XG5cbiAgZm9yKHZhciBpID0gMDsgaSA8IGRvbS5sZW5ndGg7IGkrKyl7XG4gICAgdmFyIGVsZW0gPSBkb21baV07XG5cbiAgICBpZiAoZWxlbS50eXBlID09PSAncm9vdCcpXG4gICAgICBvdXRwdXQgKz0gcmVuZGVyKGVsZW0uY2hpbGRyZW4sIG9wdHMpO1xuICAgIGVsc2UgaWYgKEVsZW1lbnRUeXBlLmlzVGFnKGVsZW0pKVxuICAgICAgb3V0cHV0ICs9IHJlbmRlclRhZyhlbGVtLCBvcHRzKTtcbiAgICBlbHNlIGlmIChlbGVtLnR5cGUgPT09IEVsZW1lbnRUeXBlLkRpcmVjdGl2ZSlcbiAgICAgIG91dHB1dCArPSByZW5kZXJEaXJlY3RpdmUoZWxlbSk7XG4gICAgZWxzZSBpZiAoZWxlbS50eXBlID09PSBFbGVtZW50VHlwZS5Db21tZW50KVxuICAgICAgb3V0cHV0ICs9IHJlbmRlckNvbW1lbnQoZWxlbSk7XG4gICAgZWxzZSBpZiAoZWxlbS50eXBlID09PSBFbGVtZW50VHlwZS5DREFUQSlcbiAgICAgIG91dHB1dCArPSByZW5kZXJDZGF0YShlbGVtKTtcbiAgICBlbHNlXG4gICAgICBvdXRwdXQgKz0gcmVuZGVyVGV4dChlbGVtLCBvcHRzKTtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59O1xuXG5mdW5jdGlvbiByZW5kZXJUYWcoZWxlbSwgb3B0cykge1xuICAvLyBIYW5kbGUgU1ZHXG4gIGlmIChlbGVtLm5hbWUgPT09IFwic3ZnXCIpIG9wdHMgPSB7ZGVjb2RlRW50aXRpZXM6IG9wdHMuZGVjb2RlRW50aXRpZXMsIHhtbE1vZGU6IHRydWV9O1xuXG4gIHZhciB0YWcgPSAnPCcgKyBlbGVtLm5hbWUsXG4gICAgICBhdHRyaWJzID0gZm9ybWF0QXR0cnMoZWxlbS5hdHRyaWJzLCBvcHRzKTtcblxuICBpZiAoYXR0cmlicykge1xuICAgIHRhZyArPSAnICcgKyBhdHRyaWJzO1xuICB9XG5cbiAgaWYgKFxuICAgIG9wdHMueG1sTW9kZVxuICAgICYmICghZWxlbS5jaGlsZHJlbiB8fCBlbGVtLmNoaWxkcmVuLmxlbmd0aCA9PT0gMClcbiAgKSB7XG4gICAgdGFnICs9ICcvPic7XG4gIH0gZWxzZSB7XG4gICAgdGFnICs9ICc+JztcbiAgICBpZiAoZWxlbS5jaGlsZHJlbikge1xuICAgICAgdGFnICs9IHJlbmRlcihlbGVtLmNoaWxkcmVuLCBvcHRzKTtcbiAgICB9XG5cbiAgICBpZiAoIXNpbmdsZVRhZ1tlbGVtLm5hbWVdIHx8IG9wdHMueG1sTW9kZSkge1xuICAgICAgdGFnICs9ICc8LycgKyBlbGVtLm5hbWUgKyAnPic7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhZztcbn1cblxuZnVuY3Rpb24gcmVuZGVyRGlyZWN0aXZlKGVsZW0pIHtcbiAgcmV0dXJuICc8JyArIGVsZW0uZGF0YSArICc+Jztcbn1cblxuZnVuY3Rpb24gcmVuZGVyVGV4dChlbGVtLCBvcHRzKSB7XG4gIHZhciBkYXRhID0gZWxlbS5kYXRhIHx8ICcnO1xuXG4gIC8vIGlmIGVudGl0aWVzIHdlcmVuJ3QgZGVjb2RlZCwgbm8gbmVlZCB0byBlbmNvZGUgdGhlbSBiYWNrXG4gIGlmIChvcHRzLmRlY29kZUVudGl0aWVzICYmICEoZWxlbS5wYXJlbnQgJiYgZWxlbS5wYXJlbnQubmFtZSBpbiB1bmVuY29kZWRFbGVtZW50cykpIHtcbiAgICBkYXRhID0gZW50aXRpZXMuZW5jb2RlWE1MKGRhdGEpO1xuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckNkYXRhKGVsZW0pIHtcbiAgcmV0dXJuICc8IVtDREFUQVsnICsgZWxlbS5jaGlsZHJlblswXS5kYXRhICsgJ11dPic7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckNvbW1lbnQoZWxlbSkge1xuICByZXR1cm4gJzwhLS0nICsgZWxlbS5kYXRhICsgJy0tPic7XG59XG5cblxuLyoqKi8gfSksXG4vKiAyOCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG4vL1R5cGVzIG9mIGVsZW1lbnRzIGZvdW5kIGluIHRoZSBET01cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRUZXh0OiBcInRleHRcIiwgLy9UZXh0XG5cdERpcmVjdGl2ZTogXCJkaXJlY3RpdmVcIiwgLy88PyAuLi4gPz5cblx0Q29tbWVudDogXCJjb21tZW50XCIsIC8vPCEtLSAuLi4gLS0+XG5cdFNjcmlwdDogXCJzY3JpcHRcIiwgLy88c2NyaXB0PiB0YWdzXG5cdFN0eWxlOiBcInN0eWxlXCIsIC8vPHN0eWxlPiB0YWdzXG5cdFRhZzogXCJ0YWdcIiwgLy9BbnkgdGFnXG5cdENEQVRBOiBcImNkYXRhXCIsIC8vPCFbQ0RBVEFbIC4uLiBdXT5cblxuXHRpc1RhZzogZnVuY3Rpb24oZWxlbSl7XG5cdFx0cmV0dXJuIGVsZW0udHlwZSA9PT0gXCJ0YWdcIiB8fCBlbGVtLnR5cGUgPT09IFwic2NyaXB0XCIgfHwgZWxlbS50eXBlID09PSBcInN0eWxlXCI7XG5cdH1cbn07XG5cbi8qKiovIH0pLFxuLyogMjkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGVuY29kZSA9IF9fd2VicGFja19yZXF1aXJlX18oMzApLFxuICAgIGRlY29kZSA9IF9fd2VicGFja19yZXF1aXJlX18oMzEpO1xuXG5leHBvcnRzLmRlY29kZSA9IGZ1bmN0aW9uKGRhdGEsIGxldmVsKXtcblx0cmV0dXJuICghbGV2ZWwgfHwgbGV2ZWwgPD0gMCA/IGRlY29kZS5YTUwgOiBkZWNvZGUuSFRNTCkoZGF0YSk7XG59O1xuXG5leHBvcnRzLmRlY29kZVN0cmljdCA9IGZ1bmN0aW9uKGRhdGEsIGxldmVsKXtcblx0cmV0dXJuICghbGV2ZWwgfHwgbGV2ZWwgPD0gMCA/IGRlY29kZS5YTUwgOiBkZWNvZGUuSFRNTFN0cmljdCkoZGF0YSk7XG59O1xuXG5leHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uKGRhdGEsIGxldmVsKXtcblx0cmV0dXJuICghbGV2ZWwgfHwgbGV2ZWwgPD0gMCA/IGVuY29kZS5YTUwgOiBlbmNvZGUuSFRNTCkoZGF0YSk7XG59O1xuXG5leHBvcnRzLmVuY29kZVhNTCA9IGVuY29kZS5YTUw7XG5cbmV4cG9ydHMuZW5jb2RlSFRNTDQgPVxuZXhwb3J0cy5lbmNvZGVIVE1MNSA9XG5leHBvcnRzLmVuY29kZUhUTUwgID0gZW5jb2RlLkhUTUw7XG5cbmV4cG9ydHMuZGVjb2RlWE1MID1cbmV4cG9ydHMuZGVjb2RlWE1MU3RyaWN0ID0gZGVjb2RlLlhNTDtcblxuZXhwb3J0cy5kZWNvZGVIVE1MNCA9XG5leHBvcnRzLmRlY29kZUhUTUw1ID1cbmV4cG9ydHMuZGVjb2RlSFRNTCA9IGRlY29kZS5IVE1MO1xuXG5leHBvcnRzLmRlY29kZUhUTUw0U3RyaWN0ID1cbmV4cG9ydHMuZGVjb2RlSFRNTDVTdHJpY3QgPVxuZXhwb3J0cy5kZWNvZGVIVE1MU3RyaWN0ID0gZGVjb2RlLkhUTUxTdHJpY3Q7XG5cbmV4cG9ydHMuZXNjYXBlID0gZW5jb2RlLmVzY2FwZTtcblxuXG4vKioqLyB9KSxcbi8qIDMwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBpbnZlcnNlWE1MID0gZ2V0SW52ZXJzZU9iaihfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKSksXG4gICAgeG1sUmVwbGFjZXIgPSBnZXRJbnZlcnNlUmVwbGFjZXIoaW52ZXJzZVhNTCk7XG5cbmV4cG9ydHMuWE1MID0gZ2V0SW52ZXJzZShpbnZlcnNlWE1MLCB4bWxSZXBsYWNlcik7XG5cbnZhciBpbnZlcnNlSFRNTCA9IGdldEludmVyc2VPYmooX193ZWJwYWNrX3JlcXVpcmVfXygxNCkpLFxuICAgIGh0bWxSZXBsYWNlciA9IGdldEludmVyc2VSZXBsYWNlcihpbnZlcnNlSFRNTCk7XG5cbmV4cG9ydHMuSFRNTCA9IGdldEludmVyc2UoaW52ZXJzZUhUTUwsIGh0bWxSZXBsYWNlcik7XG5cbmZ1bmN0aW9uIGdldEludmVyc2VPYmoob2JqKXtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG9iaikuc29ydCgpLnJlZHVjZShmdW5jdGlvbihpbnZlcnNlLCBuYW1lKXtcblx0XHRpbnZlcnNlW29ialtuYW1lXV0gPSBcIiZcIiArIG5hbWUgKyBcIjtcIjtcblx0XHRyZXR1cm4gaW52ZXJzZTtcblx0fSwge30pO1xufVxuXG5mdW5jdGlvbiBnZXRJbnZlcnNlUmVwbGFjZXIoaW52ZXJzZSl7XG5cdHZhciBzaW5nbGUgPSBbXSxcblx0ICAgIG11bHRpcGxlID0gW107XG5cblx0T2JqZWN0LmtleXMoaW52ZXJzZSkuZm9yRWFjaChmdW5jdGlvbihrKXtcblx0XHRpZihrLmxlbmd0aCA9PT0gMSl7XG5cdFx0XHRzaW5nbGUucHVzaChcIlxcXFxcIiArIGspO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtdWx0aXBsZS5wdXNoKGspO1xuXHRcdH1cblx0fSk7XG5cblx0Ly9UT0RPIGFkZCByYW5nZXNcblx0bXVsdGlwbGUudW5zaGlmdChcIltcIiArIHNpbmdsZS5qb2luKFwiXCIpICsgXCJdXCIpO1xuXG5cdHJldHVybiBuZXcgUmVnRXhwKG11bHRpcGxlLmpvaW4oXCJ8XCIpLCBcImdcIik7XG59XG5cbnZhciByZV9ub25BU0NJSSA9IC9bXlxcMC1cXHg3Rl0vZyxcbiAgICByZV9hc3RyYWxTeW1ib2xzID0gL1tcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl0vZztcblxuZnVuY3Rpb24gc2luZ2xlQ2hhclJlcGxhY2VyKGMpe1xuXHRyZXR1cm4gXCImI3hcIiArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSArIFwiO1wiO1xufVxuXG5mdW5jdGlvbiBhc3RyYWxSZXBsYWNlcihjKXtcblx0Ly8gaHR0cDovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZyNzdXJyb2dhdGUtZm9ybXVsYWVcblx0dmFyIGhpZ2ggPSBjLmNoYXJDb2RlQXQoMCk7XG5cdHZhciBsb3cgID0gYy5jaGFyQ29kZUF0KDEpO1xuXHR2YXIgY29kZVBvaW50ID0gKGhpZ2ggLSAweEQ4MDApICogMHg0MDAgKyBsb3cgLSAweERDMDAgKyAweDEwMDAwO1xuXHRyZXR1cm4gXCImI3hcIiArIGNvZGVQb2ludC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSArIFwiO1wiO1xufVxuXG5mdW5jdGlvbiBnZXRJbnZlcnNlKGludmVyc2UsIHJlKXtcblx0ZnVuY3Rpb24gZnVuYyhuYW1lKXtcblx0XHRyZXR1cm4gaW52ZXJzZVtuYW1lXTtcblx0fVxuXG5cdHJldHVybiBmdW5jdGlvbihkYXRhKXtcblx0XHRyZXR1cm4gZGF0YVxuXHRcdFx0XHQucmVwbGFjZShyZSwgZnVuYylcblx0XHRcdFx0LnJlcGxhY2UocmVfYXN0cmFsU3ltYm9scywgYXN0cmFsUmVwbGFjZXIpXG5cdFx0XHRcdC5yZXBsYWNlKHJlX25vbkFTQ0lJLCBzaW5nbGVDaGFyUmVwbGFjZXIpO1xuXHR9O1xufVxuXG52YXIgcmVfeG1sQ2hhcnMgPSBnZXRJbnZlcnNlUmVwbGFjZXIoaW52ZXJzZVhNTCk7XG5cbmZ1bmN0aW9uIGVzY2FwZVhNTChkYXRhKXtcblx0cmV0dXJuIGRhdGFcblx0XHRcdC5yZXBsYWNlKHJlX3htbENoYXJzLCBzaW5nbGVDaGFyUmVwbGFjZXIpXG5cdFx0XHQucmVwbGFjZShyZV9hc3RyYWxTeW1ib2xzLCBhc3RyYWxSZXBsYWNlcilcblx0XHRcdC5yZXBsYWNlKHJlX25vbkFTQ0lJLCBzaW5nbGVDaGFyUmVwbGFjZXIpO1xufVxuXG5leHBvcnRzLmVzY2FwZSA9IGVzY2FwZVhNTDtcblxuXG4vKioqLyB9KSxcbi8qIDMxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBlbnRpdHlNYXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KSxcbiAgICBsZWdhY3lNYXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMyKSxcbiAgICB4bWxNYXAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKSxcbiAgICBkZWNvZGVDb2RlUG9pbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMzKTtcblxudmFyIGRlY29kZVhNTFN0cmljdCAgPSBnZXRTdHJpY3REZWNvZGVyKHhtbE1hcCksXG4gICAgZGVjb2RlSFRNTFN0cmljdCA9IGdldFN0cmljdERlY29kZXIoZW50aXR5TWFwKTtcblxuZnVuY3Rpb24gZ2V0U3RyaWN0RGVjb2RlcihtYXApe1xuXHR2YXIga2V5cyA9IE9iamVjdC5rZXlzKG1hcCkuam9pbihcInxcIiksXG5cdCAgICByZXBsYWNlID0gZ2V0UmVwbGFjZXIobWFwKTtcblxuXHRrZXlzICs9IFwifCNbeFhdW1xcXFxkYS1mQS1GXSt8I1xcXFxkK1wiO1xuXG5cdHZhciByZSA9IG5ldyBSZWdFeHAoXCImKD86XCIgKyBrZXlzICsgXCIpO1wiLCBcImdcIik7XG5cblx0cmV0dXJuIGZ1bmN0aW9uKHN0cil7XG5cdFx0cmV0dXJuIFN0cmluZyhzdHIpLnJlcGxhY2UocmUsIHJlcGxhY2UpO1xuXHR9O1xufVxuXG52YXIgZGVjb2RlSFRNTCA9IChmdW5jdGlvbigpe1xuXHR2YXIgbGVnYWN5ID0gT2JqZWN0LmtleXMobGVnYWN5TWFwKVxuXHRcdC5zb3J0KHNvcnRlcik7XG5cblx0dmFyIGtleXMgPSBPYmplY3Qua2V5cyhlbnRpdHlNYXApXG5cdFx0LnNvcnQoc29ydGVyKTtcblxuXHRmb3IodmFyIGkgPSAwLCBqID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspe1xuXHRcdGlmKGxlZ2FjeVtqXSA9PT0ga2V5c1tpXSl7XG5cdFx0XHRrZXlzW2ldICs9IFwiOz9cIjtcblx0XHRcdGorKztcblx0XHR9IGVsc2Uge1xuXHRcdFx0a2V5c1tpXSArPSBcIjtcIjtcblx0XHR9XG5cdH1cblxuXHR2YXIgcmUgPSBuZXcgUmVnRXhwKFwiJig/OlwiICsga2V5cy5qb2luKFwifFwiKSArIFwifCNbeFhdW1xcXFxkYS1mQS1GXSs7P3wjXFxcXGQrOz8pXCIsIFwiZ1wiKSxcblx0ICAgIHJlcGxhY2UgPSBnZXRSZXBsYWNlcihlbnRpdHlNYXApO1xuXG5cdGZ1bmN0aW9uIHJlcGxhY2VyKHN0cil7XG5cdFx0aWYoc3RyLnN1YnN0cigtMSkgIT09IFwiO1wiKSBzdHIgKz0gXCI7XCI7XG5cdFx0cmV0dXJuIHJlcGxhY2Uoc3RyKTtcblx0fVxuXG5cdC8vVE9ETyBjb25zaWRlciBjcmVhdGluZyBhIG1lcmdlZCBtYXBcblx0cmV0dXJuIGZ1bmN0aW9uKHN0cil7XG5cdFx0cmV0dXJuIFN0cmluZyhzdHIpLnJlcGxhY2UocmUsIHJlcGxhY2VyKTtcblx0fTtcbn0oKSk7XG5cbmZ1bmN0aW9uIHNvcnRlcihhLCBiKXtcblx0cmV0dXJuIGEgPCBiID8gMSA6IC0xO1xufVxuXG5mdW5jdGlvbiBnZXRSZXBsYWNlcihtYXApe1xuXHRyZXR1cm4gZnVuY3Rpb24gcmVwbGFjZShzdHIpe1xuXHRcdGlmKHN0ci5jaGFyQXQoMSkgPT09IFwiI1wiKXtcblx0XHRcdGlmKHN0ci5jaGFyQXQoMikgPT09IFwiWFwiIHx8IHN0ci5jaGFyQXQoMikgPT09IFwieFwiKXtcblx0XHRcdFx0cmV0dXJuIGRlY29kZUNvZGVQb2ludChwYXJzZUludChzdHIuc3Vic3RyKDMpLCAxNikpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGRlY29kZUNvZGVQb2ludChwYXJzZUludChzdHIuc3Vic3RyKDIpLCAxMCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gbWFwW3N0ci5zbGljZSgxLCAtMSldO1xuXHR9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0WE1MOiBkZWNvZGVYTUxTdHJpY3QsXG5cdEhUTUw6IGRlY29kZUhUTUwsXG5cdEhUTUxTdHJpY3Q6IGRlY29kZUhUTUxTdHJpY3Rcbn07XG5cbi8qKiovIH0pLFxuLyogMzIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSB7XCJBYWN1dGVcIjpcIsOBXCIsXCJhYWN1dGVcIjpcIsOhXCIsXCJBY2lyY1wiOlwiw4JcIixcImFjaXJjXCI6XCLDolwiLFwiYWN1dGVcIjpcIsK0XCIsXCJBRWxpZ1wiOlwiw4ZcIixcImFlbGlnXCI6XCLDplwiLFwiQWdyYXZlXCI6XCLDgFwiLFwiYWdyYXZlXCI6XCLDoFwiLFwiYW1wXCI6XCImXCIsXCJBTVBcIjpcIiZcIixcIkFyaW5nXCI6XCLDhVwiLFwiYXJpbmdcIjpcIsOlXCIsXCJBdGlsZGVcIjpcIsODXCIsXCJhdGlsZGVcIjpcIsOjXCIsXCJBdW1sXCI6XCLDhFwiLFwiYXVtbFwiOlwiw6RcIixcImJydmJhclwiOlwiwqZcIixcIkNjZWRpbFwiOlwiw4dcIixcImNjZWRpbFwiOlwiw6dcIixcImNlZGlsXCI6XCLCuFwiLFwiY2VudFwiOlwiwqJcIixcImNvcHlcIjpcIsKpXCIsXCJDT1BZXCI6XCLCqVwiLFwiY3VycmVuXCI6XCLCpFwiLFwiZGVnXCI6XCLCsFwiLFwiZGl2aWRlXCI6XCLDt1wiLFwiRWFjdXRlXCI6XCLDiVwiLFwiZWFjdXRlXCI6XCLDqVwiLFwiRWNpcmNcIjpcIsOKXCIsXCJlY2lyY1wiOlwiw6pcIixcIkVncmF2ZVwiOlwiw4hcIixcImVncmF2ZVwiOlwiw6hcIixcIkVUSFwiOlwiw5BcIixcImV0aFwiOlwiw7BcIixcIkV1bWxcIjpcIsOLXCIsXCJldW1sXCI6XCLDq1wiLFwiZnJhYzEyXCI6XCLCvVwiLFwiZnJhYzE0XCI6XCLCvFwiLFwiZnJhYzM0XCI6XCLCvlwiLFwiZ3RcIjpcIj5cIixcIkdUXCI6XCI+XCIsXCJJYWN1dGVcIjpcIsONXCIsXCJpYWN1dGVcIjpcIsOtXCIsXCJJY2lyY1wiOlwiw45cIixcImljaXJjXCI6XCLDrlwiLFwiaWV4Y2xcIjpcIsKhXCIsXCJJZ3JhdmVcIjpcIsOMXCIsXCJpZ3JhdmVcIjpcIsOsXCIsXCJpcXVlc3RcIjpcIsK/XCIsXCJJdW1sXCI6XCLDj1wiLFwiaXVtbFwiOlwiw69cIixcImxhcXVvXCI6XCLCq1wiLFwibHRcIjpcIjxcIixcIkxUXCI6XCI8XCIsXCJtYWNyXCI6XCLCr1wiLFwibWljcm9cIjpcIsK1XCIsXCJtaWRkb3RcIjpcIsK3XCIsXCJuYnNwXCI6XCLCoFwiLFwibm90XCI6XCLCrFwiLFwiTnRpbGRlXCI6XCLDkVwiLFwibnRpbGRlXCI6XCLDsVwiLFwiT2FjdXRlXCI6XCLDk1wiLFwib2FjdXRlXCI6XCLDs1wiLFwiT2NpcmNcIjpcIsOUXCIsXCJvY2lyY1wiOlwiw7RcIixcIk9ncmF2ZVwiOlwiw5JcIixcIm9ncmF2ZVwiOlwiw7JcIixcIm9yZGZcIjpcIsKqXCIsXCJvcmRtXCI6XCLCulwiLFwiT3NsYXNoXCI6XCLDmFwiLFwib3NsYXNoXCI6XCLDuFwiLFwiT3RpbGRlXCI6XCLDlVwiLFwib3RpbGRlXCI6XCLDtVwiLFwiT3VtbFwiOlwiw5ZcIixcIm91bWxcIjpcIsO2XCIsXCJwYXJhXCI6XCLCtlwiLFwicGx1c21uXCI6XCLCsVwiLFwicG91bmRcIjpcIsKjXCIsXCJxdW90XCI6XCJcXFwiXCIsXCJRVU9UXCI6XCJcXFwiXCIsXCJyYXF1b1wiOlwiwrtcIixcInJlZ1wiOlwiwq5cIixcIlJFR1wiOlwiwq5cIixcInNlY3RcIjpcIsKnXCIsXCJzaHlcIjpcIsKtXCIsXCJzdXAxXCI6XCLCuVwiLFwic3VwMlwiOlwiwrJcIixcInN1cDNcIjpcIsKzXCIsXCJzemxpZ1wiOlwiw59cIixcIlRIT1JOXCI6XCLDnlwiLFwidGhvcm5cIjpcIsO+XCIsXCJ0aW1lc1wiOlwiw5dcIixcIlVhY3V0ZVwiOlwiw5pcIixcInVhY3V0ZVwiOlwiw7pcIixcIlVjaXJjXCI6XCLDm1wiLFwidWNpcmNcIjpcIsO7XCIsXCJVZ3JhdmVcIjpcIsOZXCIsXCJ1Z3JhdmVcIjpcIsO5XCIsXCJ1bWxcIjpcIsKoXCIsXCJVdW1sXCI6XCLDnFwiLFwidXVtbFwiOlwiw7xcIixcIllhY3V0ZVwiOlwiw51cIixcInlhY3V0ZVwiOlwiw71cIixcInllblwiOlwiwqVcIixcInl1bWxcIjpcIsO/XCJ9XG5cbi8qKiovIH0pLFxuLyogMzMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGRlY29kZU1hcCA9IF9fd2VicGFja19yZXF1aXJlX18oMzQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlY29kZUNvZGVQb2ludDtcblxuLy8gbW9kaWZpZWQgdmVyc2lvbiBvZiBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9oZS9ibG9iL21hc3Rlci9zcmMvaGUuanMjTDk0LUwxMTlcbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludChjb2RlUG9pbnQpe1xuXG5cdGlmKChjb2RlUG9pbnQgPj0gMHhEODAwICYmIGNvZGVQb2ludCA8PSAweERGRkYpIHx8IGNvZGVQb2ludCA+IDB4MTBGRkZGKXtcblx0XHRyZXR1cm4gXCJcXHVGRkZEXCI7XG5cdH1cblxuXHRpZihjb2RlUG9pbnQgaW4gZGVjb2RlTWFwKXtcblx0XHRjb2RlUG9pbnQgPSBkZWNvZGVNYXBbY29kZVBvaW50XTtcblx0fVxuXG5cdHZhciBvdXRwdXQgPSBcIlwiO1xuXG5cdGlmKGNvZGVQb2ludCA+IDB4RkZGRil7XG5cdFx0Y29kZVBvaW50IC09IDB4MTAwMDA7XG5cdFx0b3V0cHV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKTtcblx0XHRjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRjtcblx0fVxuXG5cdG91dHB1dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGVQb2ludCk7XG5cdHJldHVybiBvdXRwdXQ7XG59XG5cblxuLyoqKi8gfSksXG4vKiAzNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcIjBcIjo2NTUzMyxcIjEyOFwiOjgzNjQsXCIxMzBcIjo4MjE4LFwiMTMxXCI6NDAyLFwiMTMyXCI6ODIyMixcIjEzM1wiOjgyMzAsXCIxMzRcIjo4MjI0LFwiMTM1XCI6ODIyNSxcIjEzNlwiOjcxMCxcIjEzN1wiOjgyNDAsXCIxMzhcIjozNTIsXCIxMzlcIjo4MjQ5LFwiMTQwXCI6MzM4LFwiMTQyXCI6MzgxLFwiMTQ1XCI6ODIxNixcIjE0NlwiOjgyMTcsXCIxNDdcIjo4MjIwLFwiMTQ4XCI6ODIyMSxcIjE0OVwiOjgyMjYsXCIxNTBcIjo4MjExLFwiMTUxXCI6ODIxMixcIjE1MlwiOjczMixcIjE1M1wiOjg0ODIsXCIxNTRcIjozNTMsXCIxNTVcIjo4MjUwLFwiMTU2XCI6MzM5LFwiMTU4XCI6MzgyLFwiMTU5XCI6Mzc2fVxuXG4vKioqLyB9KSxcbi8qIDM1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbnZhciBnZXRDaGlsZHJlbiA9IGV4cG9ydHMuZ2V0Q2hpbGRyZW4gPSBmdW5jdGlvbihlbGVtKXtcblx0cmV0dXJuIGVsZW0uY2hpbGRyZW47XG59O1xuXG52YXIgZ2V0UGFyZW50ID0gZXhwb3J0cy5nZXRQYXJlbnQgPSBmdW5jdGlvbihlbGVtKXtcblx0cmV0dXJuIGVsZW0ucGFyZW50O1xufTtcblxuZXhwb3J0cy5nZXRTaWJsaW5ncyA9IGZ1bmN0aW9uKGVsZW0pe1xuXHR2YXIgcGFyZW50ID0gZ2V0UGFyZW50KGVsZW0pO1xuXHRyZXR1cm4gcGFyZW50ID8gZ2V0Q2hpbGRyZW4ocGFyZW50KSA6IFtlbGVtXTtcbn07XG5cbmV4cG9ydHMuZ2V0QXR0cmlidXRlVmFsdWUgPSBmdW5jdGlvbihlbGVtLCBuYW1lKXtcblx0cmV0dXJuIGVsZW0uYXR0cmlicyAmJiBlbGVtLmF0dHJpYnNbbmFtZV07XG59O1xuXG5leHBvcnRzLmhhc0F0dHJpYiA9IGZ1bmN0aW9uKGVsZW0sIG5hbWUpe1xuXHRyZXR1cm4gISFlbGVtLmF0dHJpYnMgJiYgaGFzT3duUHJvcGVydHkuY2FsbChlbGVtLmF0dHJpYnMsIG5hbWUpO1xufTtcblxuZXhwb3J0cy5nZXROYW1lID0gZnVuY3Rpb24oZWxlbSl7XG5cdHJldHVybiBlbGVtLm5hbWU7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogMzYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuZXhwb3J0cy5yZW1vdmVFbGVtZW50ID0gZnVuY3Rpb24oZWxlbSl7XG5cdGlmKGVsZW0ucHJldikgZWxlbS5wcmV2Lm5leHQgPSBlbGVtLm5leHQ7XG5cdGlmKGVsZW0ubmV4dCkgZWxlbS5uZXh0LnByZXYgPSBlbGVtLnByZXY7XG5cblx0aWYoZWxlbS5wYXJlbnQpe1xuXHRcdHZhciBjaGlsZHMgPSBlbGVtLnBhcmVudC5jaGlsZHJlbjtcblx0XHRjaGlsZHMuc3BsaWNlKGNoaWxkcy5sYXN0SW5kZXhPZihlbGVtKSwgMSk7XG5cdH1cbn07XG5cbmV4cG9ydHMucmVwbGFjZUVsZW1lbnQgPSBmdW5jdGlvbihlbGVtLCByZXBsYWNlbWVudCl7XG5cdHZhciBwcmV2ID0gcmVwbGFjZW1lbnQucHJldiA9IGVsZW0ucHJldjtcblx0aWYocHJldil7XG5cdFx0cHJldi5uZXh0ID0gcmVwbGFjZW1lbnQ7XG5cdH1cblxuXHR2YXIgbmV4dCA9IHJlcGxhY2VtZW50Lm5leHQgPSBlbGVtLm5leHQ7XG5cdGlmKG5leHQpe1xuXHRcdG5leHQucHJldiA9IHJlcGxhY2VtZW50O1xuXHR9XG5cblx0dmFyIHBhcmVudCA9IHJlcGxhY2VtZW50LnBhcmVudCA9IGVsZW0ucGFyZW50O1xuXHRpZihwYXJlbnQpe1xuXHRcdHZhciBjaGlsZHMgPSBwYXJlbnQuY2hpbGRyZW47XG5cdFx0Y2hpbGRzW2NoaWxkcy5sYXN0SW5kZXhPZihlbGVtKV0gPSByZXBsYWNlbWVudDtcblx0fVxufTtcblxuZXhwb3J0cy5hcHBlbmRDaGlsZCA9IGZ1bmN0aW9uKGVsZW0sIGNoaWxkKXtcblx0Y2hpbGQucGFyZW50ID0gZWxlbTtcblxuXHRpZihlbGVtLmNoaWxkcmVuLnB1c2goY2hpbGQpICE9PSAxKXtcblx0XHR2YXIgc2libGluZyA9IGVsZW0uY2hpbGRyZW5bZWxlbS5jaGlsZHJlbi5sZW5ndGggLSAyXTtcblx0XHRzaWJsaW5nLm5leHQgPSBjaGlsZDtcblx0XHRjaGlsZC5wcmV2ID0gc2libGluZztcblx0XHRjaGlsZC5uZXh0ID0gbnVsbDtcblx0fVxufTtcblxuZXhwb3J0cy5hcHBlbmQgPSBmdW5jdGlvbihlbGVtLCBuZXh0KXtcblx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50LFxuXHRcdGN1cnJOZXh0ID0gZWxlbS5uZXh0O1xuXG5cdG5leHQubmV4dCA9IGN1cnJOZXh0O1xuXHRuZXh0LnByZXYgPSBlbGVtO1xuXHRlbGVtLm5leHQgPSBuZXh0O1xuXHRuZXh0LnBhcmVudCA9IHBhcmVudDtcblxuXHRpZihjdXJyTmV4dCl7XG5cdFx0Y3Vyck5leHQucHJldiA9IG5leHQ7XG5cdFx0aWYocGFyZW50KXtcblx0XHRcdHZhciBjaGlsZHMgPSBwYXJlbnQuY2hpbGRyZW47XG5cdFx0XHRjaGlsZHMuc3BsaWNlKGNoaWxkcy5sYXN0SW5kZXhPZihjdXJyTmV4dCksIDAsIG5leHQpO1xuXHRcdH1cblx0fSBlbHNlIGlmKHBhcmVudCl7XG5cdFx0cGFyZW50LmNoaWxkcmVuLnB1c2gobmV4dCk7XG5cdH1cbn07XG5cbmV4cG9ydHMucHJlcGVuZCA9IGZ1bmN0aW9uKGVsZW0sIHByZXYpe1xuXHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnQ7XG5cdGlmKHBhcmVudCl7XG5cdFx0dmFyIGNoaWxkcyA9IHBhcmVudC5jaGlsZHJlbjtcblx0XHRjaGlsZHMuc3BsaWNlKGNoaWxkcy5sYXN0SW5kZXhPZihlbGVtKSwgMCwgcHJldik7XG5cdH1cblxuXHRpZihlbGVtLnByZXYpe1xuXHRcdGVsZW0ucHJldi5uZXh0ID0gcHJldjtcblx0fVxuXHRcblx0cHJldi5wYXJlbnQgPSBwYXJlbnQ7XG5cdHByZXYucHJldiA9IGVsZW0ucHJldjtcblx0cHJldi5uZXh0ID0gZWxlbTtcblx0ZWxlbS5wcmV2ID0gcHJldjtcbn07XG5cblxuXG5cbi8qKiovIH0pLFxuLyogMzcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGlzVGFnID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KS5pc1RhZztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdGZpbHRlcjogZmlsdGVyLFxuXHRmaW5kOiBmaW5kLFxuXHRmaW5kT25lQ2hpbGQ6IGZpbmRPbmVDaGlsZCxcblx0ZmluZE9uZTogZmluZE9uZSxcblx0ZXhpc3RzT25lOiBleGlzdHNPbmUsXG5cdGZpbmRBbGw6IGZpbmRBbGxcbn07XG5cbmZ1bmN0aW9uIGZpbHRlcih0ZXN0LCBlbGVtZW50LCByZWN1cnNlLCBsaW1pdCl7XG5cdGlmKCFBcnJheS5pc0FycmF5KGVsZW1lbnQpKSBlbGVtZW50ID0gW2VsZW1lbnRdO1xuXG5cdGlmKHR5cGVvZiBsaW1pdCAhPT0gXCJudW1iZXJcIiB8fCAhaXNGaW5pdGUobGltaXQpKXtcblx0XHRsaW1pdCA9IEluZmluaXR5O1xuXHR9XG5cdHJldHVybiBmaW5kKHRlc3QsIGVsZW1lbnQsIHJlY3Vyc2UgIT09IGZhbHNlLCBsaW1pdCk7XG59XG5cbmZ1bmN0aW9uIGZpbmQodGVzdCwgZWxlbXMsIHJlY3Vyc2UsIGxpbWl0KXtcblx0dmFyIHJlc3VsdCA9IFtdLCBjaGlsZHM7XG5cblx0Zm9yKHZhciBpID0gMCwgaiA9IGVsZW1zLmxlbmd0aDsgaSA8IGo7IGkrKyl7XG5cdFx0aWYodGVzdChlbGVtc1tpXSkpe1xuXHRcdFx0cmVzdWx0LnB1c2goZWxlbXNbaV0pO1xuXHRcdFx0aWYoLS1saW1pdCA8PSAwKSBicmVhaztcblx0XHR9XG5cblx0XHRjaGlsZHMgPSBlbGVtc1tpXS5jaGlsZHJlbjtcblx0XHRpZihyZWN1cnNlICYmIGNoaWxkcyAmJiBjaGlsZHMubGVuZ3RoID4gMCl7XG5cdFx0XHRjaGlsZHMgPSBmaW5kKHRlc3QsIGNoaWxkcywgcmVjdXJzZSwgbGltaXQpO1xuXHRcdFx0cmVzdWx0ID0gcmVzdWx0LmNvbmNhdChjaGlsZHMpO1xuXHRcdFx0bGltaXQgLT0gY2hpbGRzLmxlbmd0aDtcblx0XHRcdGlmKGxpbWl0IDw9IDApIGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGZpbmRPbmVDaGlsZCh0ZXN0LCBlbGVtcyl7XG5cdGZvcih2YXIgaSA9IDAsIGwgPSBlbGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspe1xuXHRcdGlmKHRlc3QoZWxlbXNbaV0pKSByZXR1cm4gZWxlbXNbaV07XG5cdH1cblxuXHRyZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmluZE9uZSh0ZXN0LCBlbGVtcyl7XG5cdHZhciBlbGVtID0gbnVsbDtcblxuXHRmb3IodmFyIGkgPSAwLCBsID0gZWxlbXMubGVuZ3RoOyBpIDwgbCAmJiAhZWxlbTsgaSsrKXtcblx0XHRpZighaXNUYWcoZWxlbXNbaV0pKXtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH0gZWxzZSBpZih0ZXN0KGVsZW1zW2ldKSl7XG5cdFx0XHRlbGVtID0gZWxlbXNbaV07XG5cdFx0fSBlbHNlIGlmKGVsZW1zW2ldLmNoaWxkcmVuLmxlbmd0aCA+IDApe1xuXHRcdFx0ZWxlbSA9IGZpbmRPbmUodGVzdCwgZWxlbXNbaV0uY2hpbGRyZW4pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG5mdW5jdGlvbiBleGlzdHNPbmUodGVzdCwgZWxlbXMpe1xuXHRmb3IodmFyIGkgPSAwLCBsID0gZWxlbXMubGVuZ3RoOyBpIDwgbDsgaSsrKXtcblx0XHRpZihcblx0XHRcdGlzVGFnKGVsZW1zW2ldKSAmJiAoXG5cdFx0XHRcdHRlc3QoZWxlbXNbaV0pIHx8IChcblx0XHRcdFx0XHRlbGVtc1tpXS5jaGlsZHJlbi5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0ZXhpc3RzT25lKHRlc3QsIGVsZW1zW2ldLmNoaWxkcmVuKVxuXHRcdFx0XHQpXG5cdFx0XHQpXG5cdFx0KXtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZmluZEFsbCh0ZXN0LCBlbGVtcyl7XG5cdHZhciByZXN1bHQgPSBbXTtcblx0Zm9yKHZhciBpID0gMCwgaiA9IGVsZW1zLmxlbmd0aDsgaSA8IGo7IGkrKyl7XG5cdFx0aWYoIWlzVGFnKGVsZW1zW2ldKSkgY29udGludWU7XG5cdFx0aWYodGVzdChlbGVtc1tpXSkpIHJlc3VsdC5wdXNoKGVsZW1zW2ldKTtcblxuXHRcdGlmKGVsZW1zW2ldLmNoaWxkcmVuLmxlbmd0aCA+IDApe1xuXHRcdFx0cmVzdWx0ID0gcmVzdWx0LmNvbmNhdChmaW5kQWxsKHRlc3QsIGVsZW1zW2ldLmNoaWxkcmVuKSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59XG5cblxuLyoqKi8gfSksXG4vKiAzOCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgRWxlbWVudFR5cGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xudmFyIGlzVGFnID0gZXhwb3J0cy5pc1RhZyA9IEVsZW1lbnRUeXBlLmlzVGFnO1xuXG5leHBvcnRzLnRlc3RFbGVtZW50ID0gZnVuY3Rpb24ob3B0aW9ucywgZWxlbWVudCl7XG5cdGZvcih2YXIga2V5IGluIG9wdGlvbnMpe1xuXHRcdGlmKCFvcHRpb25zLmhhc093blByb3BlcnR5KGtleSkpO1xuXHRcdGVsc2UgaWYoa2V5ID09PSBcInRhZ19uYW1lXCIpe1xuXHRcdFx0aWYoIWlzVGFnKGVsZW1lbnQpIHx8ICFvcHRpb25zLnRhZ19uYW1lKGVsZW1lbnQubmFtZSkpe1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmKGtleSA9PT0gXCJ0YWdfdHlwZVwiKXtcblx0XHRcdGlmKCFvcHRpb25zLnRhZ190eXBlKGVsZW1lbnQudHlwZSkpIHJldHVybiBmYWxzZTtcblx0XHR9IGVsc2UgaWYoa2V5ID09PSBcInRhZ19jb250YWluc1wiKXtcblx0XHRcdGlmKGlzVGFnKGVsZW1lbnQpIHx8ICFvcHRpb25zLnRhZ19jb250YWlucyhlbGVtZW50LmRhdGEpKXtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZighZWxlbWVudC5hdHRyaWJzIHx8ICFvcHRpb25zW2tleV0oZWxlbWVudC5hdHRyaWJzW2tleV0pKXtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHRydWU7XG59O1xuXG52YXIgQ2hlY2tzID0ge1xuXHR0YWdfbmFtZTogZnVuY3Rpb24obmFtZSl7XG5cdFx0aWYodHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIil7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oZWxlbSl7IHJldHVybiBpc1RhZyhlbGVtKSAmJiBuYW1lKGVsZW0ubmFtZSk7IH07XG5cdFx0fSBlbHNlIGlmKG5hbWUgPT09IFwiKlwiKXtcblx0XHRcdHJldHVybiBpc1RhZztcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0peyByZXR1cm4gaXNUYWcoZWxlbSkgJiYgZWxlbS5uYW1lID09PSBuYW1lOyB9O1xuXHRcdH1cblx0fSxcblx0dGFnX3R5cGU6IGZ1bmN0aW9uKHR5cGUpe1xuXHRcdGlmKHR5cGVvZiB0eXBlID09PSBcImZ1bmN0aW9uXCIpe1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0peyByZXR1cm4gdHlwZShlbGVtLnR5cGUpOyB9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oZWxlbSl7IHJldHVybiBlbGVtLnR5cGUgPT09IHR5cGU7IH07XG5cdFx0fVxuXHR9LFxuXHR0YWdfY29udGFpbnM6IGZ1bmN0aW9uKGRhdGEpe1xuXHRcdGlmKHR5cGVvZiBkYXRhID09PSBcImZ1bmN0aW9uXCIpe1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0peyByZXR1cm4gIWlzVGFnKGVsZW0pICYmIGRhdGEoZWxlbS5kYXRhKTsgfTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0peyByZXR1cm4gIWlzVGFnKGVsZW0pICYmIGVsZW0uZGF0YSA9PT0gZGF0YTsgfTtcblx0XHR9XG5cdH1cbn07XG5cbmZ1bmN0aW9uIGdldEF0dHJpYkNoZWNrKGF0dHJpYiwgdmFsdWUpe1xuXHRpZih0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIil7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0peyByZXR1cm4gZWxlbS5hdHRyaWJzICYmIHZhbHVlKGVsZW0uYXR0cmlic1thdHRyaWJdKTsgfTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZnVuY3Rpb24oZWxlbSl7IHJldHVybiBlbGVtLmF0dHJpYnMgJiYgZWxlbS5hdHRyaWJzW2F0dHJpYl0gPT09IHZhbHVlOyB9O1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNvbWJpbmVGdW5jcyhhLCBiKXtcblx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0pe1xuXHRcdHJldHVybiBhKGVsZW0pIHx8IGIoZWxlbSk7XG5cdH07XG59XG5cbmV4cG9ydHMuZ2V0RWxlbWVudHMgPSBmdW5jdGlvbihvcHRpb25zLCBlbGVtZW50LCByZWN1cnNlLCBsaW1pdCl7XG5cdHZhciBmdW5jcyA9IE9iamVjdC5rZXlzKG9wdGlvbnMpLm1hcChmdW5jdGlvbihrZXkpe1xuXHRcdHZhciB2YWx1ZSA9IG9wdGlvbnNba2V5XTtcblx0XHRyZXR1cm4ga2V5IGluIENoZWNrcyA/IENoZWNrc1trZXldKHZhbHVlKSA6IGdldEF0dHJpYkNoZWNrKGtleSwgdmFsdWUpO1xuXHR9KTtcblxuXHRyZXR1cm4gZnVuY3MubGVuZ3RoID09PSAwID8gW10gOiB0aGlzLmZpbHRlcihcblx0XHRmdW5jcy5yZWR1Y2UoY29tYmluZUZ1bmNzKSxcblx0XHRlbGVtZW50LCByZWN1cnNlLCBsaW1pdFxuXHQpO1xufTtcblxuZXhwb3J0cy5nZXRFbGVtZW50QnlJZCA9IGZ1bmN0aW9uKGlkLCBlbGVtZW50LCByZWN1cnNlKXtcblx0aWYoIUFycmF5LmlzQXJyYXkoZWxlbWVudCkpIGVsZW1lbnQgPSBbZWxlbWVudF07XG5cdHJldHVybiB0aGlzLmZpbmRPbmUoZ2V0QXR0cmliQ2hlY2soXCJpZFwiLCBpZCksIGVsZW1lbnQsIHJlY3Vyc2UgIT09IGZhbHNlKTtcbn07XG5cbmV4cG9ydHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBmdW5jdGlvbihuYW1lLCBlbGVtZW50LCByZWN1cnNlLCBsaW1pdCl7XG5cdHJldHVybiB0aGlzLmZpbHRlcihDaGVja3MudGFnX25hbWUobmFtZSksIGVsZW1lbnQsIHJlY3Vyc2UsIGxpbWl0KTtcbn07XG5cbmV4cG9ydHMuZ2V0RWxlbWVudHNCeVRhZ1R5cGUgPSBmdW5jdGlvbih0eXBlLCBlbGVtZW50LCByZWN1cnNlLCBsaW1pdCl7XG5cdHJldHVybiB0aGlzLmZpbHRlcihDaGVja3MudGFnX3R5cGUodHlwZSksIGVsZW1lbnQsIHJlY3Vyc2UsIGxpbWl0KTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiAzOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG4vLyByZW1vdmVTdWJzZXRzXG4vLyBHaXZlbiBhbiBhcnJheSBvZiBub2RlcywgcmVtb3ZlIGFueSBtZW1iZXIgdGhhdCBpcyBjb250YWluZWQgYnkgYW5vdGhlci5cbmV4cG9ydHMucmVtb3ZlU3Vic2V0cyA9IGZ1bmN0aW9uKG5vZGVzKSB7XG5cdHZhciBpZHggPSBub2Rlcy5sZW5ndGgsIG5vZGUsIGFuY2VzdG9yLCByZXBsYWNlO1xuXG5cdC8vIENoZWNrIGlmIGVhY2ggbm9kZSAob3Igb25lIG9mIGl0cyBhbmNlc3RvcnMpIGlzIGFscmVhZHkgY29udGFpbmVkIGluIHRoZVxuXHQvLyBhcnJheS5cblx0d2hpbGUgKC0taWR4ID4gLTEpIHtcblx0XHRub2RlID0gYW5jZXN0b3IgPSBub2Rlc1tpZHhdO1xuXG5cdFx0Ly8gVGVtcG9yYXJpbHkgcmVtb3ZlIHRoZSBub2RlIHVuZGVyIGNvbnNpZGVyYXRpb25cblx0XHRub2Rlc1tpZHhdID0gbnVsbDtcblx0XHRyZXBsYWNlID0gdHJ1ZTtcblxuXHRcdHdoaWxlIChhbmNlc3Rvcikge1xuXHRcdFx0aWYgKG5vZGVzLmluZGV4T2YoYW5jZXN0b3IpID4gLTEpIHtcblx0XHRcdFx0cmVwbGFjZSA9IGZhbHNlO1xuXHRcdFx0XHRub2Rlcy5zcGxpY2UoaWR4LCAxKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudDtcblx0XHR9XG5cblx0XHQvLyBJZiB0aGUgbm9kZSBoYXMgYmVlbiBmb3VuZCB0byBiZSB1bmlxdWUsIHJlLWluc2VydCBpdC5cblx0XHRpZiAocmVwbGFjZSkge1xuXHRcdFx0bm9kZXNbaWR4XSA9IG5vZGU7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG5vZGVzO1xufTtcblxuLy8gU291cmNlOiBodHRwOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLW5vZGUtY29tcGFyZWRvY3VtZW50cG9zaXRpb25cbnZhciBQT1NJVElPTiA9IHtcblx0RElTQ09OTkVDVEVEOiAxLFxuXHRQUkVDRURJTkc6IDIsXG5cdEZPTExPV0lORzogNCxcblx0Q09OVEFJTlM6IDgsXG5cdENPTlRBSU5FRF9CWTogMTZcbn07XG5cbi8vIENvbXBhcmUgdGhlIHBvc2l0aW9uIG9mIG9uZSBub2RlIGFnYWluc3QgYW5vdGhlciBub2RlIGluIGFueSBvdGhlciBkb2N1bWVudC5cbi8vIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBiaXRtYXNrIHdpdGggdGhlIGZvbGxvd2luZyB2YWx1ZXM6XG4vL1xuLy8gZG9jdW1lbnQgb3JkZXI6XG4vLyA+IFRoZXJlIGlzIGFuIG9yZGVyaW5nLCBkb2N1bWVudCBvcmRlciwgZGVmaW5lZCBvbiBhbGwgdGhlIG5vZGVzIGluIHRoZVxuLy8gPiBkb2N1bWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZVxuLy8gPiBYTUwgcmVwcmVzZW50YXRpb24gb2YgZWFjaCBub2RlIG9jY3VycyBpbiB0aGUgWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoZVxuLy8gPiBkb2N1bWVudCBhZnRlciBleHBhbnNpb24gb2YgZ2VuZXJhbCBlbnRpdGllcy4gVGh1cywgdGhlIGRvY3VtZW50IGVsZW1lbnRcbi8vID4gbm9kZSB3aWxsIGJlIHRoZSBmaXJzdCBub2RlLiBFbGVtZW50IG5vZGVzIG9jY3VyIGJlZm9yZSB0aGVpciBjaGlsZHJlbi5cbi8vID4gVGh1cywgZG9jdW1lbnQgb3JkZXIgb3JkZXJzIGVsZW1lbnQgbm9kZXMgaW4gb3JkZXIgb2YgdGhlIG9jY3VycmVuY2Ugb2Zcbi8vID4gdGhlaXIgc3RhcnQtdGFnIGluIHRoZSBYTUwgKGFmdGVyIGV4cGFuc2lvbiBvZiBlbnRpdGllcykuIFRoZSBhdHRyaWJ1dGVcbi8vID4gbm9kZXMgb2YgYW4gZWxlbWVudCBvY2N1ciBhZnRlciB0aGUgZWxlbWVudCBhbmQgYmVmb3JlIGl0cyBjaGlsZHJlbi4gVGhlXG4vLyA+IHJlbGF0aXZlIG9yZGVyIG9mIGF0dHJpYnV0ZSBub2RlcyBpcyBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQuL1xuLy8gU291cmNlOlxuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtQ29yZS9nbG9zc2FyeS5odG1sI2R0LWRvY3VtZW50LW9yZGVyXG4vL1xuLy8gQGFyZ3VtZW50IHtOb2RlfSBub2RhQSBUaGUgZmlyc3Qgbm9kZSB0byB1c2UgaW4gdGhlIGNvbXBhcmlzb25cbi8vIEBhcmd1bWVudCB7Tm9kZX0gbm9kZUIgVGhlIHNlY29uZCBub2RlIHRvIHVzZSBpbiB0aGUgY29tcGFyaXNvblxuLy9cbi8vIEByZXR1cm4ge051bWJlcn0gQSBiaXRtYXNrIGRlc2NyaWJpbmcgdGhlIGlucHV0IG5vZGVzJyByZWxhdGl2ZSBwb3NpdGlvbi5cbi8vICAgICAgICAgU2VlIGh0dHA6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tbm9kZS1jb21wYXJlZG9jdW1lbnRwb3NpdGlvbiBmb3Jcbi8vICAgICAgICAgYSBkZXNjcmlwdGlvbiBvZiB0aGVzZSB2YWx1ZXMuXG52YXIgY29tcGFyZVBvcyA9IGV4cG9ydHMuY29tcGFyZURvY3VtZW50UG9zaXRpb24gPSBmdW5jdGlvbihub2RlQSwgbm9kZUIpIHtcblx0dmFyIGFQYXJlbnRzID0gW107XG5cdHZhciBiUGFyZW50cyA9IFtdO1xuXHR2YXIgY3VycmVudCwgc2hhcmVkUGFyZW50LCBzaWJsaW5ncywgYVNpYmxpbmcsIGJTaWJsaW5nLCBpZHg7XG5cblx0aWYgKG5vZGVBID09PSBub2RlQikge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0Y3VycmVudCA9IG5vZGVBO1xuXHR3aGlsZSAoY3VycmVudCkge1xuXHRcdGFQYXJlbnRzLnVuc2hpZnQoY3VycmVudCk7XG5cdFx0Y3VycmVudCA9IGN1cnJlbnQucGFyZW50O1xuXHR9XG5cdGN1cnJlbnQgPSBub2RlQjtcblx0d2hpbGUgKGN1cnJlbnQpIHtcblx0XHRiUGFyZW50cy51bnNoaWZ0KGN1cnJlbnQpO1xuXHRcdGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcblx0fVxuXG5cdGlkeCA9IDA7XG5cdHdoaWxlIChhUGFyZW50c1tpZHhdID09PSBiUGFyZW50c1tpZHhdKSB7XG5cdFx0aWR4Kys7XG5cdH1cblxuXHRpZiAoaWR4ID09PSAwKSB7XG5cdFx0cmV0dXJuIFBPU0lUSU9OLkRJU0NPTk5FQ1RFRDtcblx0fVxuXG5cdHNoYXJlZFBhcmVudCA9IGFQYXJlbnRzW2lkeCAtIDFdO1xuXHRzaWJsaW5ncyA9IHNoYXJlZFBhcmVudC5jaGlsZHJlbjtcblx0YVNpYmxpbmcgPSBhUGFyZW50c1tpZHhdO1xuXHRiU2libGluZyA9IGJQYXJlbnRzW2lkeF07XG5cblx0aWYgKHNpYmxpbmdzLmluZGV4T2YoYVNpYmxpbmcpID4gc2libGluZ3MuaW5kZXhPZihiU2libGluZykpIHtcblx0XHRpZiAoc2hhcmVkUGFyZW50ID09PSBub2RlQikge1xuXHRcdFx0cmV0dXJuIFBPU0lUSU9OLkZPTExPV0lORyB8IFBPU0lUSU9OLkNPTlRBSU5FRF9CWTtcblx0XHR9XG5cdFx0cmV0dXJuIFBPU0lUSU9OLkZPTExPV0lORztcblx0fSBlbHNlIHtcblx0XHRpZiAoc2hhcmVkUGFyZW50ID09PSBub2RlQSkge1xuXHRcdFx0cmV0dXJuIFBPU0lUSU9OLlBSRUNFRElORyB8IFBPU0lUSU9OLkNPTlRBSU5TO1xuXHRcdH1cblx0XHRyZXR1cm4gUE9TSVRJT04uUFJFQ0VESU5HO1xuXHR9XG59O1xuXG4vLyBTb3J0IGFuIGFycmF5IG9mIG5vZGVzIGJhc2VkIG9uIHRoZWlyIHJlbGF0aXZlIHBvc2l0aW9uIGluIHRoZSBkb2N1bWVudCBhbmRcbi8vIHJlbW92ZSBhbnkgZHVwbGljYXRlIG5vZGVzLiBJZiB0aGUgYXJyYXkgY29udGFpbnMgbm9kZXMgdGhhdCBkbyBub3QgYmVsb25nXG4vLyB0byB0aGUgc2FtZSBkb2N1bWVudCwgc29ydCBvcmRlciBpcyB1bnNwZWNpZmllZC5cbi8vXG4vLyBAYXJndW1lbnQge0FycmF5fSBub2RlcyBBcnJheSBvZiBET00gbm9kZXNcbi8vXG4vLyBAcmV0dXJucyB7QXJyYXl9IGNvbGxlY3Rpb24gb2YgdW5pcXVlIG5vZGVzLCBzb3J0ZWQgaW4gZG9jdW1lbnQgb3JkZXJcbmV4cG9ydHMudW5pcXVlU29ydCA9IGZ1bmN0aW9uKG5vZGVzKSB7XG5cdHZhciBpZHggPSBub2Rlcy5sZW5ndGgsIG5vZGUsIHBvc2l0aW9uO1xuXG5cdG5vZGVzID0gbm9kZXMuc2xpY2UoKTtcblxuXHR3aGlsZSAoLS1pZHggPiAtMSkge1xuXHRcdG5vZGUgPSBub2Rlc1tpZHhdO1xuXHRcdHBvc2l0aW9uID0gbm9kZXMuaW5kZXhPZihub2RlKTtcblx0XHRpZiAocG9zaXRpb24gPiAtMSAmJiBwb3NpdGlvbiA8IGlkeCkge1xuXHRcdFx0bm9kZXMuc3BsaWNlKGlkeCwgMSk7XG5cdFx0fVxuXHR9XG5cdG5vZGVzLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuXHRcdHZhciByZWxhdGl2ZSA9IGNvbXBhcmVQb3MoYSwgYik7XG5cdFx0aWYgKHJlbGF0aXZlICYgUE9TSVRJT04uUFJFQ0VESU5HKSB7XG5cdFx0XHRyZXR1cm4gLTE7XG5cdFx0fSBlbHNlIGlmIChyZWxhdGl2ZSAmIFBPU0lUSU9OLkZPTExPV0lORykge1xuXHRcdFx0cmV0dXJuIDE7XG5cdFx0fVxuXHRcdHJldHVybiAwO1xuXHR9KTtcblxuXHRyZXR1cm4gbm9kZXM7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuLypcblx0Y29tcGlsZXMgYSBzZWxlY3RvciB0byBhbiBleGVjdXRhYmxlIGZ1bmN0aW9uXG4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBpbGVGYWN0b3J5O1xuXG52YXIgcGFyc2UgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQxKSxcblx0QmFzZUZ1bmNzICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpLFxuXHRzb3J0UnVsZXMgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDIpLFxuXHRwcm9jZWR1cmUgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpLFxuXHRydWxlc0ZhY3RvcnkgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDMpLFxuXHRwc2V1ZG9zRmFjdG9yeSA9IF9fd2VicGFja19yZXF1aXJlX18oODYpLFxuXHR0cnVlRnVuYyAgICAgICA9IEJhc2VGdW5jcy50cnVlRnVuYyxcblx0ZmFsc2VGdW5jICAgICAgPSBCYXNlRnVuY3MuZmFsc2VGdW5jO1xuXG5mdW5jdGlvbiBjb21waWxlRmFjdG9yeShhZGFwdGVyKXtcblx0dmFyIFBzZXVkb3MgICAgID0gcHNldWRvc0ZhY3RvcnkoYWRhcHRlciksXG5cdFx0ZmlsdGVycyAgICAgPSBQc2V1ZG9zLmZpbHRlcnMsXG5cdFx0UnVsZXMgXHRcdFx0PSBydWxlc0ZhY3RvcnkoYWRhcHRlciwgUHNldWRvcyk7XG5cblx0ZnVuY3Rpb24gY29tcGlsZShzZWxlY3Rvciwgb3B0aW9ucywgY29udGV4dCl7XG5cdFx0dmFyIG5leHQgPSBjb21waWxlVW5zYWZlKHNlbGVjdG9yLCBvcHRpb25zLCBjb250ZXh0KTtcblx0XHRyZXR1cm4gd3JhcChuZXh0KTtcblx0fVxuXG5cdGZ1bmN0aW9uIHdyYXAobmV4dCl7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGJhc2UoZWxlbSl7XG5cdFx0XHRyZXR1cm4gYWRhcHRlci5pc1RhZyhlbGVtKSAmJiBuZXh0KGVsZW0pO1xuXHRcdH07XG5cdH1cblxuXHRmdW5jdGlvbiBjb21waWxlVW5zYWZlKHNlbGVjdG9yLCBvcHRpb25zLCBjb250ZXh0KXtcblx0XHR2YXIgdG9rZW4gPSBwYXJzZShzZWxlY3Rvciwgb3B0aW9ucyk7XG5cdFx0cmV0dXJuIGNvbXBpbGVUb2tlbih0b2tlbiwgb3B0aW9ucywgY29udGV4dCk7XG5cdH1cblxuXHRmdW5jdGlvbiBpbmNsdWRlc1Njb3BlUHNldWRvKHQpe1xuXHRcdHJldHVybiB0LnR5cGUgPT09IFwicHNldWRvXCIgJiYgKFxuXHRcdFx0dC5uYW1lID09PSBcInNjb3BlXCIgfHwgKFxuXHRcdFx0XHRBcnJheS5pc0FycmF5KHQuZGF0YSkgJiZcblx0XHRcdFx0dC5kYXRhLnNvbWUoZnVuY3Rpb24oZGF0YSl7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGEuc29tZShpbmNsdWRlc1Njb3BlUHNldWRvKTtcblx0XHRcdFx0fSlcblx0XHRcdClcblx0XHQpO1xuXHR9XG5cblx0dmFyIERFU0NFTkRBTlRfVE9LRU4gPSB7dHlwZTogXCJkZXNjZW5kYW50XCJ9LFxuXHRcdEZMRVhJQkxFX0RFU0NFTkRBTlRfVE9LRU4gPSB7dHlwZTogXCJfZmxleGlibGVEZXNjZW5kYW50XCJ9LFxuXHRcdFNDT1BFX1RPS0VOID0ge3R5cGU6IFwicHNldWRvXCIsIG5hbWU6IFwic2NvcGVcIn0sXG5cdFx0UExBQ0VIT0xERVJfRUxFTUVOVCA9IHt9O1xuXG5cdC8vQ1NTIDQgU3BlYyAoRHJhZnQpOiAzLjMuMS4gQWJzb2x1dGl6aW5nIGEgU2NvcGUtcmVsYXRpdmUgU2VsZWN0b3Jcblx0Ly9odHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnM0LyNhYnNvbHV0aXppbmdcblx0ZnVuY3Rpb24gYWJzb2x1dGl6ZSh0b2tlbiwgY29udGV4dCl7XG5cdFx0Ly9UT0RPIGJldHRlciBjaGVjayBpZiBjb250ZXh0IGlzIGRvY3VtZW50XG5cdFx0dmFyIGhhc0NvbnRleHQgPSAhIWNvbnRleHQgJiYgISFjb250ZXh0Lmxlbmd0aCAmJiBjb250ZXh0LmV2ZXJ5KGZ1bmN0aW9uKGUpe1xuXHRcdFx0cmV0dXJuIGUgPT09IFBMQUNFSE9MREVSX0VMRU1FTlQgfHwgISFhZGFwdGVyLmdldFBhcmVudChlKTtcblx0XHR9KTtcblxuXG5cdFx0dG9rZW4uZm9yRWFjaChmdW5jdGlvbih0KXtcblx0XHRcdGlmKHQubGVuZ3RoID4gMCAmJiBpc1RyYXZlcnNhbCh0WzBdKSAmJiB0WzBdLnR5cGUgIT09IFwiZGVzY2VuZGFudFwiKXtcblx0XHRcdFx0Ly9kb24ndCByZXR1cm4gaW4gZWxzZSBicmFuY2hcblx0XHRcdH0gZWxzZSBpZihoYXNDb250ZXh0ICYmICFpbmNsdWRlc1Njb3BlUHNldWRvKHQpKXtcblx0XHRcdFx0dC51bnNoaWZ0KERFU0NFTkRBTlRfVE9LRU4pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR0LnVuc2hpZnQoU0NPUEVfVE9LRU4pO1xuXHRcdH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gY29tcGlsZVRva2VuKHRva2VuLCBvcHRpb25zLCBjb250ZXh0KXtcblx0XHR0b2tlbiA9IHRva2VuLmZpbHRlcihmdW5jdGlvbih0KXsgcmV0dXJuIHQubGVuZ3RoID4gMDsgfSk7XG5cblx0XHR0b2tlbi5mb3JFYWNoKHNvcnRSdWxlcyk7XG5cblx0XHR2YXIgaXNBcnJheUNvbnRleHQgPSBBcnJheS5pc0FycmF5KGNvbnRleHQpO1xuXG5cdFx0Y29udGV4dCA9IChvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dCkgfHwgY29udGV4dDtcblxuXHRcdGlmKGNvbnRleHQgJiYgIWlzQXJyYXlDb250ZXh0KSBjb250ZXh0ID0gW2NvbnRleHRdO1xuXG5cdFx0YWJzb2x1dGl6ZSh0b2tlbiwgY29udGV4dCk7XG5cblx0XHR2YXIgc2hvdWxkVGVzdE5leHRTaWJsaW5ncyA9IGZhbHNlO1xuXG5cdFx0dmFyIHF1ZXJ5ID0gdG9rZW5cblx0XHRcdC5tYXAoZnVuY3Rpb24ocnVsZXMpe1xuXHRcdFx0XHRpZihydWxlc1swXSAmJiBydWxlc1sxXSAmJiBydWxlc1swXS5uYW1lID09PSBcInNjb3BlXCIpe1xuXHRcdFx0XHRcdHZhciBydWxlVHlwZSA9IHJ1bGVzWzFdLnR5cGU7XG5cdFx0XHRcdFx0aWYoaXNBcnJheUNvbnRleHQgJiYgcnVsZVR5cGUgPT09IFwiZGVzY2VuZGFudFwiKSBydWxlc1sxXSA9IEZMRVhJQkxFX0RFU0NFTkRBTlRfVE9LRU47XG5cdFx0XHRcdFx0ZWxzZSBpZihydWxlVHlwZSA9PT0gXCJhZGphY2VudFwiIHx8IHJ1bGVUeXBlID09PSBcInNpYmxpbmdcIikgc2hvdWxkVGVzdE5leHRTaWJsaW5ncyA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGNvbXBpbGVSdWxlcyhydWxlcywgb3B0aW9ucywgY29udGV4dCk7XG5cdFx0XHR9KVxuXHRcdFx0LnJlZHVjZShyZWR1Y2VSdWxlcywgZmFsc2VGdW5jKTtcblxuXHRcdHF1ZXJ5LnNob3VsZFRlc3ROZXh0U2libGluZ3MgPSBzaG91bGRUZXN0TmV4dFNpYmxpbmdzO1xuXG5cdFx0cmV0dXJuIHF1ZXJ5O1xuXHR9XG5cblx0ZnVuY3Rpb24gaXNUcmF2ZXJzYWwodCl7XG5cdFx0cmV0dXJuIHByb2NlZHVyZVt0LnR5cGVdIDwgMDtcblx0fVxuXG5cdGZ1bmN0aW9uIGNvbXBpbGVSdWxlcyhydWxlcywgb3B0aW9ucywgY29udGV4dCl7XG5cdFx0cmV0dXJuIHJ1bGVzLnJlZHVjZShmdW5jdGlvbihmdW5jLCBydWxlKXtcblx0XHRcdGlmKGZ1bmMgPT09IGZhbHNlRnVuYykgcmV0dXJuIGZ1bmM7XG5cdFx0XHRyZXR1cm4gUnVsZXNbcnVsZS50eXBlXShmdW5jLCBydWxlLCBvcHRpb25zLCBjb250ZXh0KTtcblx0XHR9LCBvcHRpb25zICYmIG9wdGlvbnMucm9vdEZ1bmMgfHwgdHJ1ZUZ1bmMpO1xuXHR9XG5cblx0ZnVuY3Rpb24gcmVkdWNlUnVsZXMoYSwgYil7XG5cdFx0aWYoYiA9PT0gZmFsc2VGdW5jIHx8IGEgPT09IHRydWVGdW5jKXtcblx0XHRcdHJldHVybiBhO1xuXHRcdH1cblx0XHRpZihhID09PSBmYWxzZUZ1bmMgfHwgYiA9PT0gdHJ1ZUZ1bmMpe1xuXHRcdFx0cmV0dXJuIGI7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNvbWJpbmUoZWxlbSl7XG5cdFx0XHRyZXR1cm4gYShlbGVtKSB8fCBiKGVsZW0pO1xuXHRcdH07XG5cdH1cblxuXHRmdW5jdGlvbiBjb250YWluc1RyYXZlcnNhbCh0KXtcblx0XHRyZXR1cm4gdC5zb21lKGlzVHJhdmVyc2FsKTtcblx0fVxuXG5cdC8vOm5vdCwgOmhhcyBhbmQgOm1hdGNoZXMgaGF2ZSB0byBjb21waWxlIHNlbGVjdG9yc1xuXHQvL2RvaW5nIHRoaXMgaW4gbGliL3BzZXVkb3MuanMgd291bGQgbGVhZCB0byBjaXJjdWxhciBkZXBlbmRlbmNpZXMsXG5cdC8vc28gd2UgYWRkIHRoZW0gaGVyZVxuXHRmaWx0ZXJzLm5vdCA9IGZ1bmN0aW9uKG5leHQsIHRva2VuLCBvcHRpb25zLCBjb250ZXh0KXtcblx0XHR2YXIgb3B0cyA9IHtcblx0XHRcdHhtbE1vZGU6ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy54bWxNb2RlKSxcblx0XHRcdHN0cmljdDogISEob3B0aW9ucyAmJiBvcHRpb25zLnN0cmljdClcblx0XHR9O1xuXG5cdFx0aWYob3B0cy5zdHJpY3Qpe1xuXHRcdFx0aWYodG9rZW4ubGVuZ3RoID4gMSB8fCB0b2tlbi5zb21lKGNvbnRhaW5zVHJhdmVyc2FsKSl7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcImNvbXBsZXggc2VsZWN0b3JzIGluIDpub3QgYXJlbid0IGFsbG93ZWQgaW4gc3RyaWN0IG1vZGVcIik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dmFyIGZ1bmMgPSBjb21waWxlVG9rZW4odG9rZW4sIG9wdHMsIGNvbnRleHQpO1xuXG5cdFx0aWYoZnVuYyA9PT0gZmFsc2VGdW5jKSByZXR1cm4gbmV4dDtcblx0XHRpZihmdW5jID09PSB0cnVlRnVuYykgIHJldHVybiBmYWxzZUZ1bmM7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRyZXR1cm4gIWZ1bmMoZWxlbSkgJiYgbmV4dChlbGVtKTtcblx0XHR9O1xuXHR9O1xuXG5cdGZpbHRlcnMuaGFzID0gZnVuY3Rpb24obmV4dCwgdG9rZW4sIG9wdGlvbnMpe1xuXHRcdHZhciBvcHRzID0ge1xuXHRcdFx0eG1sTW9kZTogISEob3B0aW9ucyAmJiBvcHRpb25zLnhtbE1vZGUpLFxuXHRcdFx0c3RyaWN0OiAhIShvcHRpb25zICYmIG9wdGlvbnMuc3RyaWN0KVxuXHRcdH07XG5cblx0XHQvL0ZJWE1FOiBVc2VzIGFuIGFycmF5IGFzIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBlbGVtZW50IChzaWRlIGVmZmVjdHMpXG5cdFx0dmFyIGNvbnRleHQgPSB0b2tlbi5zb21lKGNvbnRhaW5zVHJhdmVyc2FsKSA/IFtQTEFDRUhPTERFUl9FTEVNRU5UXSA6IG51bGw7XG5cblx0XHR2YXIgZnVuYyA9IGNvbXBpbGVUb2tlbih0b2tlbiwgb3B0cywgY29udGV4dCk7XG5cblx0XHRpZihmdW5jID09PSBmYWxzZUZ1bmMpIHJldHVybiBmYWxzZUZ1bmM7XG5cdFx0aWYoZnVuYyA9PT0gdHJ1ZUZ1bmMpe1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0XHRyZXR1cm4gYWRhcHRlci5nZXRDaGlsZHJlbihlbGVtKS5zb21lKGFkYXB0ZXIuaXNUYWcpICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGZ1bmMgPSB3cmFwKGZ1bmMpO1xuXG5cdFx0aWYoY29udGV4dCl7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gaGFzKGVsZW0pe1xuXHRcdFx0XHRyZXR1cm4gbmV4dChlbGVtKSAmJiAoXG5cdFx0XHRcdFx0KGNvbnRleHRbMF0gPSBlbGVtKSwgYWRhcHRlci5leGlzdHNPbmUoZnVuYywgYWRhcHRlci5nZXRDaGlsZHJlbihlbGVtKSlcblx0XHRcdFx0KTtcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGhhcyhlbGVtKXtcblx0XHRcdHJldHVybiBuZXh0KGVsZW0pICYmIGFkYXB0ZXIuZXhpc3RzT25lKGZ1bmMsIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oZWxlbSkpO1xuXHRcdH07XG5cdH07XG5cblx0ZmlsdGVycy5tYXRjaGVzID0gZnVuY3Rpb24obmV4dCwgdG9rZW4sIG9wdGlvbnMsIGNvbnRleHQpe1xuXHRcdHZhciBvcHRzID0ge1xuXHRcdFx0eG1sTW9kZTogISEob3B0aW9ucyAmJiBvcHRpb25zLnhtbE1vZGUpLFxuXHRcdFx0c3RyaWN0OiAhIShvcHRpb25zICYmIG9wdGlvbnMuc3RyaWN0KSxcblx0XHRcdHJvb3RGdW5jOiBuZXh0XG5cdFx0fTtcblxuXHRcdHJldHVybiBjb21waWxlVG9rZW4odG9rZW4sIG9wdHMsIGNvbnRleHQpO1xuXHR9O1xuXG5cdGNvbXBpbGUuY29tcGlsZVRva2VuID0gY29tcGlsZVRva2VuO1xuXHRjb21waWxlLmNvbXBpbGVVbnNhZmUgPSBjb21waWxlVW5zYWZlO1xuXHRjb21waWxlLlBzZXVkb3MgPSBQc2V1ZG9zO1xuXG5cdHJldHVybiBjb21waWxlO1xufVxuXG5cbi8qKiovIH0pLFxuLyogNDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZTtcblxudmFyIHJlX25hbWUgPSAvXig/OlxcXFwufFtcXHdcXC1cXHUwMGMwLVxcdUZGRkZdKSsvLFxuICAgIHJlX2VzY2FwZSA9IC9cXFxcKFtcXGRhLWZdezEsNn1cXHM/fChcXHMpfC4pL2lnLFxuICAgIC8vbW9kaWZpZWQgdmVyc2lvbiBvZiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L3NpenpsZS9ibG9iL21hc3Rlci9zcmMvc2l6emxlLmpzI0w4N1xuICAgIHJlX2F0dHIgPSAvXlxccyooKD86XFxcXC58W1xcd1xcdTAwYzAtXFx1RkZGRlxcLV0pKylcXHMqKD86KFxcUz8pPVxccyooPzooWydcIl0pKC4qPylcXDN8KCM/KD86XFxcXC58W1xcd1xcdTAwYzAtXFx1RkZGRlxcLV0pKil8KXwpXFxzKihpKT9cXF0vO1xuXG52YXIgYWN0aW9uVHlwZXMgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0XCJ1bmRlZmluZWRcIjogXCJleGlzdHNcIixcblx0XCJcIjogIFwiZXF1YWxzXCIsXG5cdFwiflwiOiBcImVsZW1lbnRcIixcblx0XCJeXCI6IFwic3RhcnRcIixcblx0XCIkXCI6IFwiZW5kXCIsXG5cdFwiKlwiOiBcImFueVwiLFxuXHRcIiFcIjogXCJub3RcIixcblx0XCJ8XCI6IFwiaHlwaGVuXCJcbn07XG5cbnZhciBzaW1wbGVTZWxlY3RvcnMgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0XCI+XCI6IFwiY2hpbGRcIixcblx0XCI8XCI6IFwicGFyZW50XCIsXG5cdFwiflwiOiBcInNpYmxpbmdcIixcblx0XCIrXCI6IFwiYWRqYWNlbnRcIlxufTtcblxudmFyIGF0dHJpYlNlbGVjdG9ycyA9IHtcblx0X19wcm90b19fOiBudWxsLFxuXHRcIiNcIjogW1wiaWRcIiwgXCJlcXVhbHNcIl0sXG5cdFwiLlwiOiBbXCJjbGFzc1wiLCBcImVsZW1lbnRcIl1cbn07XG5cbi8vcHNldWRvcywgd2hvc2UgZGF0YS1wcm9wZXJ0eSBpcyBwYXJzZWQgYXMgd2VsbFxudmFyIHVucGFja1BzZXVkb3MgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0XCJoYXNcIjogdHJ1ZSxcblx0XCJub3RcIjogdHJ1ZSxcblx0XCJtYXRjaGVzXCI6IHRydWVcbn07XG5cbnZhciBzdHJpcFF1b3Rlc0Zyb21Qc2V1ZG9zID0ge1xuXHRfX3Byb3RvX186IG51bGwsXG5cdFwiY29udGFpbnNcIjogdHJ1ZSxcblx0XCJpY29udGFpbnNcIjogdHJ1ZVxufTtcblxudmFyIHF1b3RlcyA9IHtcblx0X19wcm90b19fOiBudWxsLFxuXHRcIlxcXCJcIjogdHJ1ZSxcblx0XCInXCI6IHRydWVcbn07XG5cbi8vdW5lc2NhcGUgZnVuY3Rpb24gdGFrZW4gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L3NpenpsZS9ibG9iL21hc3Rlci9zcmMvc2l6emxlLmpzI0wxMzlcbmZ1bmN0aW9uIGZ1bmVzY2FwZSggXywgZXNjYXBlZCwgZXNjYXBlZFdoaXRlc3BhY2UgKSB7XG5cdHZhciBoaWdoID0gXCIweFwiICsgZXNjYXBlZCAtIDB4MTAwMDA7XG5cdC8vIE5hTiBtZWFucyBub24tY29kZXBvaW50XG5cdC8vIFN1cHBvcnQ6IEZpcmVmb3hcblx0Ly8gV29ya2Fyb3VuZCBlcnJvbmVvdXMgbnVtZXJpYyBpbnRlcnByZXRhdGlvbiBvZiArXCIweFwiXG5cdHJldHVybiBoaWdoICE9PSBoaWdoIHx8IGVzY2FwZWRXaGl0ZXNwYWNlID9cblx0XHRlc2NhcGVkIDpcblx0XHQvLyBCTVAgY29kZXBvaW50XG5cdFx0aGlnaCA8IDAgP1xuXHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCArIDB4MTAwMDAgKSA6XG5cdFx0XHQvLyBTdXBwbGVtZW50YWwgUGxhbmUgY29kZXBvaW50IChzdXJyb2dhdGUgcGFpcilcblx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggPj4gMTAgfCAweEQ4MDAsIGhpZ2ggJiAweDNGRiB8IDB4REMwMCApO1xufVxuXG5mdW5jdGlvbiB1bmVzY2FwZUNTUyhzdHIpe1xuXHRyZXR1cm4gc3RyLnJlcGxhY2UocmVfZXNjYXBlLCBmdW5lc2NhcGUpO1xufVxuXG5mdW5jdGlvbiBpc1doaXRlc3BhY2UoYyl7XG5cdHJldHVybiBjID09PSBcIiBcIiB8fCBjID09PSBcIlxcblwiIHx8IGMgPT09IFwiXFx0XCIgfHwgYyA9PT0gXCJcXGZcIiB8fCBjID09PSBcIlxcclwiO1xufVxuXG5mdW5jdGlvbiBwYXJzZShzZWxlY3Rvciwgb3B0aW9ucyl7XG5cdHZhciBzdWJzZWxlY3RzID0gW107XG5cblx0c2VsZWN0b3IgPSBwYXJzZVNlbGVjdG9yKHN1YnNlbGVjdHMsIHNlbGVjdG9yICsgXCJcIiwgb3B0aW9ucyk7XG5cblx0aWYoc2VsZWN0b3IgIT09IFwiXCIpe1xuXHRcdHRocm93IG5ldyBTeW50YXhFcnJvcihcIlVubWF0Y2hlZCBzZWxlY3RvcjogXCIgKyBzZWxlY3Rvcik7XG5cdH1cblxuXHRyZXR1cm4gc3Vic2VsZWN0cztcbn1cblxuZnVuY3Rpb24gcGFyc2VTZWxlY3RvcihzdWJzZWxlY3RzLCBzZWxlY3Rvciwgb3B0aW9ucyl7XG5cdHZhciB0b2tlbnMgPSBbXSxcblx0XHRzYXdXUyA9IGZhbHNlLFxuXHRcdGRhdGEsIGZpcnN0Q2hhciwgbmFtZSwgcXVvdDtcblxuXHRmdW5jdGlvbiBnZXROYW1lKCl7XG5cdFx0dmFyIHN1YiA9IHNlbGVjdG9yLm1hdGNoKHJlX25hbWUpWzBdO1xuXHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKHN1Yi5sZW5ndGgpO1xuXHRcdHJldHVybiB1bmVzY2FwZUNTUyhzdWIpO1xuXHR9XG5cblx0ZnVuY3Rpb24gc3RyaXBXaGl0ZXNwYWNlKHN0YXJ0KXtcblx0XHR3aGlsZShpc1doaXRlc3BhY2Uoc2VsZWN0b3IuY2hhckF0KHN0YXJ0KSkpIHN0YXJ0Kys7XG5cdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHIoc3RhcnQpO1xuXHR9XG5cblx0c3RyaXBXaGl0ZXNwYWNlKDApO1xuXG5cdHdoaWxlKHNlbGVjdG9yICE9PSBcIlwiKXtcblx0XHRmaXJzdENoYXIgPSBzZWxlY3Rvci5jaGFyQXQoMCk7XG5cblx0XHRpZihpc1doaXRlc3BhY2UoZmlyc3RDaGFyKSl7XG5cdFx0XHRzYXdXUyA9IHRydWU7XG5cdFx0XHRzdHJpcFdoaXRlc3BhY2UoMSk7XG5cdFx0fSBlbHNlIGlmKGZpcnN0Q2hhciBpbiBzaW1wbGVTZWxlY3RvcnMpe1xuXHRcdFx0dG9rZW5zLnB1c2goe3R5cGU6IHNpbXBsZVNlbGVjdG9yc1tmaXJzdENoYXJdfSk7XG5cdFx0XHRzYXdXUyA9IGZhbHNlO1xuXG5cdFx0XHRzdHJpcFdoaXRlc3BhY2UoMSk7XG5cdFx0fSBlbHNlIGlmKGZpcnN0Q2hhciA9PT0gXCIsXCIpe1xuXHRcdFx0aWYodG9rZW5zLmxlbmd0aCA9PT0gMCl7XG5cdFx0XHRcdHRocm93IG5ldyBTeW50YXhFcnJvcihcImVtcHR5IHN1Yi1zZWxlY3RvclwiKTtcblx0XHRcdH1cblx0XHRcdHN1YnNlbGVjdHMucHVzaCh0b2tlbnMpO1xuXHRcdFx0dG9rZW5zID0gW107XG5cdFx0XHRzYXdXUyA9IGZhbHNlO1xuXHRcdFx0c3RyaXBXaGl0ZXNwYWNlKDEpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZihzYXdXUyl7XG5cdFx0XHRcdGlmKHRva2Vucy5sZW5ndGggPiAwKXtcblx0XHRcdFx0XHR0b2tlbnMucHVzaCh7dHlwZTogXCJkZXNjZW5kYW50XCJ9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzYXdXUyA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZihmaXJzdENoYXIgPT09IFwiKlwiKXtcblx0XHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHIoMSk7XG5cdFx0XHRcdHRva2Vucy5wdXNoKHt0eXBlOiBcInVuaXZlcnNhbFwifSk7XG5cdFx0XHR9IGVsc2UgaWYoZmlyc3RDaGFyIGluIGF0dHJpYlNlbGVjdG9ycyl7XG5cdFx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKDEpO1xuXHRcdFx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRcdFx0dHlwZTogXCJhdHRyaWJ1dGVcIixcblx0XHRcdFx0XHRuYW1lOiBhdHRyaWJTZWxlY3RvcnNbZmlyc3RDaGFyXVswXSxcblx0XHRcdFx0XHRhY3Rpb246IGF0dHJpYlNlbGVjdG9yc1tmaXJzdENoYXJdWzFdLFxuXHRcdFx0XHRcdHZhbHVlOiBnZXROYW1lKCksXG5cdFx0XHRcdFx0aWdub3JlQ2FzZTogZmFsc2Vcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2UgaWYoZmlyc3RDaGFyID09PSBcIltcIil7XG5cdFx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKDEpO1xuXHRcdFx0XHRkYXRhID0gc2VsZWN0b3IubWF0Y2gocmVfYXR0cik7XG5cdFx0XHRcdGlmKCFkYXRhKXtcblx0XHRcdFx0XHR0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJNYWxmb3JtZWQgYXR0cmlidXRlIHNlbGVjdG9yOiBcIiArIHNlbGVjdG9yKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cihkYXRhWzBdLmxlbmd0aCk7XG5cdFx0XHRcdG5hbWUgPSB1bmVzY2FwZUNTUyhkYXRhWzFdKTtcblxuXHRcdFx0XHRpZihcblx0XHRcdFx0XHQhb3B0aW9ucyB8fCAoXG5cdFx0XHRcdFx0XHRcImxvd2VyQ2FzZUF0dHJpYnV0ZU5hbWVzXCIgaW4gb3B0aW9ucyA/XG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMubG93ZXJDYXNlQXR0cmlidXRlTmFtZXMgOlxuXHRcdFx0XHRcdFx0XHQhb3B0aW9ucy54bWxNb2RlXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpe1xuXHRcdFx0XHRcdG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRcdFx0dHlwZTogXCJhdHRyaWJ1dGVcIixcblx0XHRcdFx0XHRuYW1lOiBuYW1lLFxuXHRcdFx0XHRcdGFjdGlvbjogYWN0aW9uVHlwZXNbZGF0YVsyXV0sXG5cdFx0XHRcdFx0dmFsdWU6IHVuZXNjYXBlQ1NTKGRhdGFbNF0gfHwgZGF0YVs1XSB8fCBcIlwiKSxcblx0XHRcdFx0XHRpZ25vcmVDYXNlOiAhIWRhdGFbNl1cblx0XHRcdFx0fSk7XG5cblx0XHRcdH0gZWxzZSBpZihmaXJzdENoYXIgPT09IFwiOlwiKXtcblx0XHRcdFx0aWYoc2VsZWN0b3IuY2hhckF0KDEpID09PSBcIjpcIil7XG5cdFx0XHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHIoMik7XG5cdFx0XHRcdFx0dG9rZW5zLnB1c2goe3R5cGU6IFwicHNldWRvLWVsZW1lbnRcIiwgbmFtZTogZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCl9KTtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKDEpO1xuXG5cdFx0XHRcdG5hbWUgPSBnZXROYW1lKCkudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0ZGF0YSA9IG51bGw7XG5cblx0XHRcdFx0aWYoc2VsZWN0b3IuY2hhckF0KDApID09PSBcIihcIil7XG5cdFx0XHRcdFx0aWYobmFtZSBpbiB1bnBhY2tQc2V1ZG9zKXtcblx0XHRcdFx0XHRcdHF1b3QgPSBzZWxlY3Rvci5jaGFyQXQoMSk7XG5cdFx0XHRcdFx0XHR2YXIgcXVvdGVkID0gcXVvdCBpbiBxdW90ZXM7XG5cblx0XHRcdFx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKHF1b3RlZCArIDEpO1xuXG5cdFx0XHRcdFx0XHRkYXRhID0gW107XG5cdFx0XHRcdFx0XHRzZWxlY3RvciA9IHBhcnNlU2VsZWN0b3IoZGF0YSwgc2VsZWN0b3IsIG9wdGlvbnMpO1xuXG5cdFx0XHRcdFx0XHRpZihxdW90ZWQpe1xuXHRcdFx0XHRcdFx0XHRpZihzZWxlY3Rvci5jaGFyQXQoMCkgIT09IHF1b3Qpe1xuXHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBTeW50YXhFcnJvcihcInVubWF0Y2hlZCBxdW90ZXMgaW4gOlwiICsgbmFtZSk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHIoMSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYoc2VsZWN0b3IuY2hhckF0KDApICE9PSBcIilcIil7XG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBTeW50YXhFcnJvcihcIm1pc3NpbmcgY2xvc2luZyBwYXJlbnRoZXNpcyBpbiA6XCIgKyBuYW1lICsgXCIgXCIgKyBzZWxlY3Rvcik7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKDEpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR2YXIgcG9zID0gMSwgY291bnRlciA9IDE7XG5cblx0XHRcdFx0XHRcdGZvcig7IGNvdW50ZXIgPiAwICYmIHBvcyA8IHNlbGVjdG9yLmxlbmd0aDsgcG9zKyspe1xuXHRcdFx0XHRcdFx0XHRpZihzZWxlY3Rvci5jaGFyQXQocG9zKSA9PT0gXCIoXCIpIGNvdW50ZXIrKztcblx0XHRcdFx0XHRcdFx0ZWxzZSBpZihzZWxlY3Rvci5jaGFyQXQocG9zKSA9PT0gXCIpXCIpIGNvdW50ZXItLTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYoY291bnRlcil7XG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBTeW50YXhFcnJvcihcInBhcmVudGhlc2lzIG5vdCBtYXRjaGVkXCIpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRkYXRhID0gc2VsZWN0b3Iuc3Vic3RyKDEsIHBvcyAtIDIpO1xuXHRcdFx0XHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHIocG9zKTtcblxuXHRcdFx0XHRcdFx0aWYobmFtZSBpbiBzdHJpcFF1b3Rlc0Zyb21Qc2V1ZG9zKXtcblx0XHRcdFx0XHRcdFx0cXVvdCA9IGRhdGEuY2hhckF0KDApO1xuXG5cdFx0XHRcdFx0XHRcdGlmKHF1b3QgPT09IGRhdGEuc2xpY2UoLTEpICYmIHF1b3QgaW4gcXVvdGVzKXtcblx0XHRcdFx0XHRcdFx0XHRkYXRhID0gZGF0YS5zbGljZSgxLCAtMSk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRkYXRhID0gdW5lc2NhcGVDU1MoZGF0YSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dG9rZW5zLnB1c2goe3R5cGU6IFwicHNldWRvXCIsIG5hbWU6IG5hbWUsIGRhdGE6IGRhdGF9KTtcblx0XHRcdH0gZWxzZSBpZihyZV9uYW1lLnRlc3Qoc2VsZWN0b3IpKXtcblx0XHRcdFx0bmFtZSA9IGdldE5hbWUoKTtcblxuXHRcdFx0XHRpZighb3B0aW9ucyB8fCAoXCJsb3dlckNhc2VUYWdzXCIgaW4gb3B0aW9ucyA/IG9wdGlvbnMubG93ZXJDYXNlVGFncyA6ICFvcHRpb25zLnhtbE1vZGUpKXtcblx0XHRcdFx0XHRuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dG9rZW5zLnB1c2goe3R5cGU6IFwidGFnXCIsIG5hbWU6IG5hbWV9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmKHRva2Vucy5sZW5ndGggJiYgdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXS50eXBlID09PSBcImRlc2NlbmRhbnRcIil7XG5cdFx0XHRcdFx0dG9rZW5zLnBvcCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFkZFRva2VuKHN1YnNlbGVjdHMsIHRva2Vucyk7XG5cdFx0XHRcdHJldHVybiBzZWxlY3Rvcjtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRhZGRUb2tlbihzdWJzZWxlY3RzLCB0b2tlbnMpO1xuXG5cdHJldHVybiBzZWxlY3Rvcjtcbn1cblxuZnVuY3Rpb24gYWRkVG9rZW4oc3Vic2VsZWN0cywgdG9rZW5zKXtcblx0aWYoc3Vic2VsZWN0cy5sZW5ndGggPiAwICYmIHRva2Vucy5sZW5ndGggPT09IDApe1xuXHRcdHRocm93IG5ldyBTeW50YXhFcnJvcihcImVtcHR5IHN1Yi1zZWxlY3RvclwiKTtcblx0fVxuXG5cdHN1YnNlbGVjdHMucHVzaCh0b2tlbnMpO1xufVxuXG5cbi8qKiovIH0pLFxuLyogNDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxubW9kdWxlLmV4cG9ydHMgPSBzb3J0QnlQcm9jZWR1cmU7XG5cbi8qXG5cdHNvcnQgdGhlIHBhcnRzIG9mIHRoZSBwYXNzZWQgc2VsZWN0b3IsXG5cdGFzIHRoZXJlIGlzIHBvdGVudGlhbCBmb3Igb3B0aW1pemF0aW9uXG5cdChzb21lIHR5cGVzIG9mIHNlbGVjdG9ycyBhcmUgZmFzdGVyIHRoYW4gb3RoZXJzKVxuKi9cblxudmFyIHByb2NlZHVyZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpO1xuXG52YXIgYXR0cmlidXRlcyA9IHtcblx0X19wcm90b19fOiBudWxsLFxuXHRleGlzdHM6IDEwLFxuXHRlcXVhbHM6IDgsXG5cdG5vdDogNyxcblx0c3RhcnQ6IDYsXG5cdGVuZDogNixcblx0YW55OiA1LFxuXHRoeXBoZW46IDQsXG5cdGVsZW1lbnQ6IDRcbn07XG5cbmZ1bmN0aW9uIHNvcnRCeVByb2NlZHVyZShhcnIpe1xuXHR2YXIgcHJvY3MgPSBhcnIubWFwKGdldFByb2NlZHVyZSk7XG5cdGZvcih2YXIgaSA9IDE7IGkgPCBhcnIubGVuZ3RoOyBpKyspe1xuXHRcdHZhciBwcm9jTmV3ID0gcHJvY3NbaV07XG5cblx0XHRpZihwcm9jTmV3IDwgMCkgY29udGludWU7XG5cblx0XHRmb3IodmFyIGogPSBpIC0gMTsgaiA+PSAwICYmIHByb2NOZXcgPCBwcm9jc1tqXTsgai0tKXtcblx0XHRcdHZhciB0b2tlbiA9IGFycltqICsgMV07XG5cdFx0XHRhcnJbaiArIDFdID0gYXJyW2pdO1xuXHRcdFx0YXJyW2pdID0gdG9rZW47XG5cdFx0XHRwcm9jc1tqICsgMV0gPSBwcm9jc1tqXTtcblx0XHRcdHByb2NzW2pdID0gcHJvY05ldztcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0UHJvY2VkdXJlKHRva2VuKXtcblx0dmFyIHByb2MgPSBwcm9jZWR1cmVbdG9rZW4udHlwZV07XG5cblx0aWYocHJvYyA9PT0gcHJvY2VkdXJlLmF0dHJpYnV0ZSl7XG5cdFx0cHJvYyA9IGF0dHJpYnV0ZXNbdG9rZW4uYWN0aW9uXTtcblxuXHRcdGlmKHByb2MgPT09IGF0dHJpYnV0ZXMuZXF1YWxzICYmIHRva2VuLm5hbWUgPT09IFwiaWRcIil7XG5cdFx0XHQvL3ByZWZlciBJRCBzZWxlY3RvcnMgKGVnLiAjSUQpXG5cdFx0XHRwcm9jID0gOTtcblx0XHR9XG5cblx0XHRpZih0b2tlbi5pZ25vcmVDYXNlKXtcblx0XHRcdC8vaWdub3JlQ2FzZSBhZGRzIHNvbWUgb3ZlcmhlYWQsIHByZWZlciBcIm5vcm1hbFwiIHRva2VuXG5cdFx0XHQvL3RoaXMgaXMgYSBiaW5hcnkgb3BlcmF0aW9uLCB0byBlbnN1cmUgaXQncyBzdGlsbCBhbiBpbnRcblx0XHRcdHByb2MgPj49IDE7XG5cdFx0fVxuXHR9IGVsc2UgaWYocHJvYyA9PT0gcHJvY2VkdXJlLnBzZXVkbyl7XG5cdFx0aWYoIXRva2VuLmRhdGEpe1xuXHRcdFx0cHJvYyA9IDM7XG5cdFx0fSBlbHNlIGlmKHRva2VuLm5hbWUgPT09IFwiaGFzXCIgfHwgdG9rZW4ubmFtZSA9PT0gXCJjb250YWluc1wiKXtcblx0XHRcdHByb2MgPSAwOyAvL2V4cGVuc2l2ZSBpbiBhbnkgY2FzZVxuXHRcdH0gZWxzZSBpZih0b2tlbi5uYW1lID09PSBcIm1hdGNoZXNcIiB8fCB0b2tlbi5uYW1lID09PSBcIm5vdFwiKXtcblx0XHRcdHByb2MgPSAwO1xuXHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IHRva2VuLmRhdGEubGVuZ3RoOyBpKyspe1xuXHRcdFx0XHQvL1RPRE8gYmV0dGVyIGhhbmRsaW5nIG9mIGNvbXBsZXggc2VsZWN0b3JzXG5cdFx0XHRcdGlmKHRva2VuLmRhdGFbaV0ubGVuZ3RoICE9PSAxKSBjb250aW51ZTtcblx0XHRcdFx0dmFyIGN1ciA9IGdldFByb2NlZHVyZSh0b2tlbi5kYXRhW2ldWzBdKTtcblx0XHRcdFx0Ly9hdm9pZCBleGVjdXRpbmcgOmhhcyBvciA6Y29udGFpbnNcblx0XHRcdFx0aWYoY3VyID09PSAwKXtcblx0XHRcdFx0XHRwcm9jID0gMDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZihjdXIgPiBwcm9jKSBwcm9jID0gY3VyO1xuXHRcdFx0fVxuXHRcdFx0aWYodG9rZW4uZGF0YS5sZW5ndGggPiAxICYmIHByb2MgPiAwKSBwcm9jIC09IDE7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb2MgPSAxO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcHJvYztcbn1cblxuXG4vKioqLyB9KSxcbi8qIDQzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBTZXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ0KTtcbnZhciBhdHRyaWJ1dGVGYWN0b3J5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMyk7XG5cbmZ1bmN0aW9uIGdlbmVyYWxGYWN0b3J5KGFkYXB0ZXIsIFBzZXVkb3Mpe1xuXHQvKlxuXHRcdGFsbCBhdmFpbGFibGUgcnVsZXNcblx0Ki9cblx0cmV0dXJuIHtcblx0XHRfX3Byb3RvX186IG51bGwsXG5cblx0XHRhdHRyaWJ1dGU6IGF0dHJpYnV0ZUZhY3RvcnkoYWRhcHRlcikuY29tcGlsZSxcblx0XHRwc2V1ZG86IFBzZXVkb3MuY29tcGlsZSxcblxuXHRcdC8vdGFnc1xuXHRcdHRhZzogZnVuY3Rpb24obmV4dCwgZGF0YSl7XG5cdFx0XHR2YXIgbmFtZSA9IGRhdGEubmFtZTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiB0YWcoZWxlbSl7XG5cdFx0XHRcdHJldHVybiBhZGFwdGVyLmdldE5hbWUoZWxlbSkgPT09IG5hbWUgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdC8vdHJhdmVyc2FsXG5cdFx0ZGVzY2VuZGFudDogZnVuY3Rpb24obmV4dCl7XG5cdFx0XHR2YXIgaXNGYWxzZUNhY2hlID0gbmV3IFNldCgpO1xuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gZGVzY2VuZGFudChlbGVtKXtcblx0XHRcdFx0dmFyIGZvdW5kID0gZmFsc2U7XG5cblx0XHRcdFx0d2hpbGUoIWZvdW5kICYmIChlbGVtID0gYWRhcHRlci5nZXRQYXJlbnQoZWxlbSkpKXtcblx0XHRcdFx0XHRpZighaXNGYWxzZUNhY2hlLmhhcyhlbGVtKSl7XG5cdFx0XHRcdFx0XHRmb3VuZCA9IG5leHQoZWxlbSk7XG5cdFx0XHRcdFx0XHRpZighZm91bmQpe1xuXHRcdFx0XHRcdFx0XHRpc0ZhbHNlQ2FjaGUuYWRkKGVsZW0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBmb3VuZDtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRfZmxleGlibGVEZXNjZW5kYW50OiBmdW5jdGlvbihuZXh0KXtcblx0XHRcdC8vIEluY2x1ZGUgZWxlbWVudCBpdHNlbGYsIG9ubHkgdXNlZCB3aGlsZSBxdWVyeWluZyBhbiBhcnJheVxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGRlc2NlbmRhbnQoZWxlbSl7XG5cblx0XHRcdFx0dmFyIGZvdW5kID0gbmV4dChlbGVtKTtcblxuXHRcdFx0XHR3aGlsZSghZm91bmQgJiYgKGVsZW0gPSBhZGFwdGVyLmdldFBhcmVudChlbGVtKSkpe1xuXHRcdFx0XHRcdGZvdW5kID0gbmV4dChlbGVtKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBmb3VuZDtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRwYXJlbnQ6IGZ1bmN0aW9uKG5leHQsIGRhdGEsIG9wdGlvbnMpe1xuXHRcdFx0aWYob3B0aW9ucyAmJiBvcHRpb25zLnN0cmljdCkgdGhyb3cgbmV3IEVycm9yKFwiUGFyZW50IHNlbGVjdG9yIGlzbid0IHBhcnQgb2YgQ1NTM1wiKTtcblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIHBhcmVudChlbGVtKXtcblx0XHRcdFx0cmV0dXJuIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oZWxlbSkuc29tZSh0ZXN0KTtcblx0XHRcdH07XG5cblx0XHRcdGZ1bmN0aW9uIHRlc3QoZWxlbSl7XG5cdFx0XHRcdHJldHVybiBhZGFwdGVyLmlzVGFnKGVsZW0pICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRjaGlsZDogZnVuY3Rpb24obmV4dCl7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gY2hpbGQoZWxlbSl7XG5cdFx0XHRcdHZhciBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChlbGVtKTtcblx0XHRcdFx0cmV0dXJuICEhcGFyZW50ICYmIG5leHQocGFyZW50KTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRzaWJsaW5nOiBmdW5jdGlvbihuZXh0KXtcblx0XHRcdHJldHVybiBmdW5jdGlvbiBzaWJsaW5nKGVsZW0pe1xuXHRcdFx0XHR2YXIgc2libGluZ3MgPSBhZGFwdGVyLmdldFNpYmxpbmdzKGVsZW0pO1xuXG5cdFx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzaWJsaW5ncy5sZW5ndGg7IGkrKyl7XG5cdFx0XHRcdFx0aWYoYWRhcHRlci5pc1RhZyhzaWJsaW5nc1tpXSkpe1xuXHRcdFx0XHRcdFx0aWYoc2libGluZ3NbaV0gPT09IGVsZW0pIGJyZWFrO1xuXHRcdFx0XHRcdFx0aWYobmV4dChzaWJsaW5nc1tpXSkpIHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRhZGphY2VudDogZnVuY3Rpb24obmV4dCl7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gYWRqYWNlbnQoZWxlbSl7XG5cdFx0XHRcdHZhciBzaWJsaW5ncyA9IGFkYXB0ZXIuZ2V0U2libGluZ3MoZWxlbSksXG5cdFx0XHRcdFx0bGFzdEVsZW1lbnQ7XG5cblx0XHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IHNpYmxpbmdzLmxlbmd0aDsgaSsrKXtcblx0XHRcdFx0XHRpZihhZGFwdGVyLmlzVGFnKHNpYmxpbmdzW2ldKSl7XG5cdFx0XHRcdFx0XHRpZihzaWJsaW5nc1tpXSA9PT0gZWxlbSkgYnJlYWs7XG5cdFx0XHRcdFx0XHRsYXN0RWxlbWVudCA9IHNpYmxpbmdzW2ldO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAhIWxhc3RFbGVtZW50ICYmIG5leHQobGFzdEVsZW1lbnQpO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdHVuaXZlcnNhbDogZnVuY3Rpb24obmV4dCl7XG5cdFx0XHRyZXR1cm4gbmV4dDtcblx0XHR9XG5cdH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2VuZXJhbEZhY3Rvcnk7XG5cblxuLyoqKi8gfSksXG4vKiA0NCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNDUpKCkgPyBTZXQgOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ2KTtcblxuXG4vKioqLyB9KSxcbi8qIDQ1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgc2V0LCBpdGVyYXRvciwgcmVzdWx0O1xuXHRpZiAodHlwZW9mIFNldCAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuXHRzZXQgPSBuZXcgU2V0KFsncmF6JywgJ2R3YScsICd0cnp5J10pO1xuXHRpZiAoU3RyaW5nKHNldCkgIT09ICdbb2JqZWN0IFNldF0nKSByZXR1cm4gZmFsc2U7XG5cdGlmIChzZXQuc2l6ZSAhPT0gMykgcmV0dXJuIGZhbHNlO1xuXHRpZiAodHlwZW9mIHNldC5hZGQgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcblx0aWYgKHR5cGVvZiBzZXQuY2xlYXIgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcblx0aWYgKHR5cGVvZiBzZXQuZGVsZXRlICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG5cdGlmICh0eXBlb2Ygc2V0LmVudHJpZXMgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcblx0aWYgKHR5cGVvZiBzZXQuZm9yRWFjaCAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuXHRpZiAodHlwZW9mIHNldC5oYXMgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcblx0aWYgKHR5cGVvZiBzZXQua2V5cyAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuXHRpZiAodHlwZW9mIHNldC52YWx1ZXMgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcblxuXHRpdGVyYXRvciA9IHNldC52YWx1ZXMoKTtcblx0cmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuXHRpZiAocmVzdWx0LmRvbmUgIT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG5cdGlmIChyZXN1bHQudmFsdWUgIT09ICdyYXonKSByZXR1cm4gZmFsc2U7XG5cblx0cmV0dXJuIHRydWU7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNDYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGNsZWFyICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNilcbiAgLCBlSW5kZXhPZiAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDcpXG4gICwgc2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG4gICwgY2FsbGFibGUgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpXG4gICwgZCAgICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpXG4gICwgZWUgICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KVxuICAsIFN5bWJvbCAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKVxuICAsIGl0ZXJhdG9yICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMilcbiAgLCBmb3JPZiAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNzEpXG4gICwgSXRlcmF0b3IgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg0KVxuICAsIGlzTmF0aXZlICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NSlcblxuICAsIGNhbGwgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbFxuICAsIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5LCBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZlxuICAsIFNldFBvbHksIGdldFZhbHVlcywgTmF0aXZlU2V0O1xuXG5pZiAoaXNOYXRpdmUpIE5hdGl2ZVNldCA9IFNldDtcblxubW9kdWxlLmV4cG9ydHMgPSBTZXRQb2x5ID0gZnVuY3Rpb24gU2V0KC8qaXRlcmFibGUqLykge1xuXHR2YXIgaXRlcmFibGUgPSBhcmd1bWVudHNbMF0sIHNlbGY7XG5cdGlmICghKHRoaXMgaW5zdGFuY2VvZiBTZXRQb2x5KSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQ29uc3RydWN0b3IgcmVxdWlyZXMgXFwnbmV3XFwnJyk7XG5cdGlmIChpc05hdGl2ZSAmJiBzZXRQcm90b3R5cGVPZikgc2VsZiA9IHNldFByb3RvdHlwZU9mKG5ldyBOYXRpdmVTZXQoKSwgZ2V0UHJvdG90eXBlT2YodGhpcykpO1xuXHRlbHNlIHNlbGYgPSB0aGlzO1xuXHRpZiAoaXRlcmFibGUgIT0gbnVsbCkgaXRlcmF0b3IoaXRlcmFibGUpO1xuXHRkZWZpbmVQcm9wZXJ0eShzZWxmLCAnX19zZXREYXRhX18nLCBkKCdjJywgW10pKTtcblx0aWYgKCFpdGVyYWJsZSkgcmV0dXJuIHNlbGY7XG5cdGZvck9mKGl0ZXJhYmxlLCBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRpZiAoZUluZGV4T2YuY2FsbCh0aGlzLCB2YWx1ZSkgIT09IC0xKSByZXR1cm47XG5cdFx0dGhpcy5wdXNoKHZhbHVlKTtcblx0fSwgc2VsZi5fX3NldERhdGFfXyk7XG5cdHJldHVybiBzZWxmO1xufTtcblxuaWYgKGlzTmF0aXZlKSB7XG5cdGlmIChzZXRQcm90b3R5cGVPZikgc2V0UHJvdG90eXBlT2YoU2V0UG9seSwgTmF0aXZlU2V0KTtcblx0U2V0UG9seS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE5hdGl2ZVNldC5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IGQoU2V0UG9seSkgfSk7XG59XG5cbmVlKE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFNldFBvbHkucHJvdG90eXBlLCB7XG5cdGFkZDogZChmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRpZiAodGhpcy5oYXModmFsdWUpKSByZXR1cm4gdGhpcztcblx0XHR0aGlzLmVtaXQoJ19hZGQnLCB0aGlzLl9fc2V0RGF0YV9fLnB1c2godmFsdWUpIC0gMSwgdmFsdWUpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9KSxcblx0Y2xlYXI6IGQoZnVuY3Rpb24gKCkge1xuXHRcdGlmICghdGhpcy5fX3NldERhdGFfXy5sZW5ndGgpIHJldHVybjtcblx0XHRjbGVhci5jYWxsKHRoaXMuX19zZXREYXRhX18pO1xuXHRcdHRoaXMuZW1pdCgnX2NsZWFyJyk7XG5cdH0pLFxuXHRkZWxldGU6IGQoZnVuY3Rpb24gKHZhbHVlKSB7XG5cdFx0dmFyIGluZGV4ID0gZUluZGV4T2YuY2FsbCh0aGlzLl9fc2V0RGF0YV9fLCB2YWx1ZSk7XG5cdFx0aWYgKGluZGV4ID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuXHRcdHRoaXMuX19zZXREYXRhX18uc3BsaWNlKGluZGV4LCAxKTtcblx0XHR0aGlzLmVtaXQoJ19kZWxldGUnLCBpbmRleCwgdmFsdWUpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9KSxcblx0ZW50cmllczogZChmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgJ2tleSt2YWx1ZScpOyB9KSxcblx0Zm9yRWFjaDogZChmdW5jdGlvbiAoY2IvKiwgdGhpc0FyZyovKSB7XG5cdFx0dmFyIHRoaXNBcmcgPSBhcmd1bWVudHNbMV0sIGl0ZXJhdG9yLCByZXN1bHQsIHZhbHVlO1xuXHRcdGNhbGxhYmxlKGNiKTtcblx0XHRpdGVyYXRvciA9IHRoaXMudmFsdWVzKCk7XG5cdFx0cmVzdWx0ID0gaXRlcmF0b3IuX25leHQoKTtcblx0XHR3aGlsZSAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHZhbHVlID0gaXRlcmF0b3IuX3Jlc29sdmUocmVzdWx0KTtcblx0XHRcdGNhbGwuY2FsbChjYiwgdGhpc0FyZywgdmFsdWUsIHZhbHVlLCB0aGlzKTtcblx0XHRcdHJlc3VsdCA9IGl0ZXJhdG9yLl9uZXh0KCk7XG5cdFx0fVxuXHR9KSxcblx0aGFzOiBkKGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRcdHJldHVybiAoZUluZGV4T2YuY2FsbCh0aGlzLl9fc2V0RGF0YV9fLCB2YWx1ZSkgIT09IC0xKTtcblx0fSksXG5cdGtleXM6IGQoZ2V0VmFsdWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy52YWx1ZXMoKTsgfSksXG5cdHNpemU6IGQuZ3MoZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fX3NldERhdGFfXy5sZW5ndGg7IH0pLFxuXHR2YWx1ZXM6IGQoZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMpOyB9KSxcblx0dG9TdHJpbmc6IGQoZnVuY3Rpb24gKCkgeyByZXR1cm4gJ1tvYmplY3QgU2V0XSc7IH0pXG59KSk7XG5kZWZpbmVQcm9wZXJ0eShTZXRQb2x5LnByb3RvdHlwZSwgU3ltYm9sLml0ZXJhdG9yLCBkKGdldFZhbHVlcykpO1xuZGVmaW5lUHJvcGVydHkoU2V0UG9seS5wcm90b3R5cGUsIFN5bWJvbC50b1N0cmluZ1RhZywgZCgnYycsICdTZXQnKSk7XG5cblxuLyoqKi8gfSksXG4vKiA0NyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgbnVtYmVySXNOYU4gICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KVxuICAsIHRvUG9zSW50ICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOClcbiAgLCB2YWx1ZSAgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMClcbiAgLCBpbmRleE9mICAgICAgICAgICA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mXG4gICwgb2JqSGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG4gICwgYWJzICAgICAgICAgICAgICAgPSBNYXRoLmFic1xuICAsIGZsb29yICAgICAgICAgICAgID0gTWF0aC5mbG9vcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2VhcmNoRWxlbWVudCAvKiwgZnJvbUluZGV4Ki8pIHtcblx0dmFyIGksIGxlbmd0aCwgZnJvbUluZGV4LCB2YWw7XG5cdGlmICghbnVtYmVySXNOYU4oc2VhcmNoRWxlbWVudCkpIHJldHVybiBpbmRleE9mLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cblx0bGVuZ3RoID0gdG9Qb3NJbnQodmFsdWUodGhpcykubGVuZ3RoKTtcblx0ZnJvbUluZGV4ID0gYXJndW1lbnRzWzFdO1xuXHRpZiAoaXNOYU4oZnJvbUluZGV4KSkgZnJvbUluZGV4ID0gMDtcblx0ZWxzZSBpZiAoZnJvbUluZGV4ID49IDApIGZyb21JbmRleCA9IGZsb29yKGZyb21JbmRleCk7XG5cdGVsc2UgZnJvbUluZGV4ID0gdG9Qb3NJbnQodGhpcy5sZW5ndGgpIC0gZmxvb3IoYWJzKGZyb21JbmRleCkpO1xuXG5cdGZvciAoaSA9IGZyb21JbmRleDsgaSA8IGxlbmd0aDsgKytpKSB7XG5cdFx0aWYgKG9iakhhc093blByb3BlcnR5LmNhbGwodGhpcywgaSkpIHtcblx0XHRcdHZhbCA9IHRoaXNbaV07XG5cdFx0XHRpZiAobnVtYmVySXNOYU4odmFsKSkgcmV0dXJuIGk7IC8vIEpzbGludDogaWdub3JlXG5cdFx0fVxuXHR9XG5cdHJldHVybiAtMTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA0OCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNDkpKClcblx0PyBOdW1iZXIuaXNOYU5cblx0OiBfX3dlYnBhY2tfcmVxdWlyZV9fKDUwKTtcblxuXG4vKioqLyB9KSxcbi8qIDQ5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgbnVtYmVySXNOYU4gPSBOdW1iZXIuaXNOYU47XG5cdGlmICh0eXBlb2YgbnVtYmVySXNOYU4gIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gIW51bWJlcklzTmFOKHt9KSAmJiBudW1iZXJJc05hTihOYU4pICYmICFudW1iZXJJc05hTigzNCk7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNTAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuXHRyZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDUxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBzaWduID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MilcblxuICAsIGFicyA9IE1hdGguYWJzLCBmbG9vciA9IE1hdGguZmxvb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdGlmIChpc05hTih2YWx1ZSkpIHJldHVybiAwO1xuXHR2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XG5cdGlmICgodmFsdWUgPT09IDApIHx8ICFpc0Zpbml0ZSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcblx0cmV0dXJuIHNpZ24odmFsdWUpICogZmxvb3IoYWJzKHZhbHVlKSk7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNTIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUzKSgpXG5cdD8gTWF0aC5zaWduXG5cdDogX193ZWJwYWNrX3JlcXVpcmVfXyg1NCk7XG5cblxuLyoqKi8gfSksXG4vKiA1MyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHNpZ24gPSBNYXRoLnNpZ247XG5cdGlmICh0eXBlb2Ygc2lnbiAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiAoc2lnbigxMCkgPT09IDEpICYmIChzaWduKC0yMCkgPT09IC0xKTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA1NCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHR2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XG5cdGlmIChpc05hTih2YWx1ZSkgfHwgKHZhbHVlID09PSAwKSkgcmV0dXJuIHZhbHVlO1xuXHRyZXR1cm4gdmFsdWUgPiAwID8gMSA6IC0xO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDU1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBpc1ZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblxudmFyIG1hcCA9IHsgZnVuY3Rpb246IHRydWUsIG9iamVjdDogdHJ1ZSB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRyZXR1cm4gKGlzVmFsdWUodmFsdWUpICYmIG1hcFt0eXBlb2YgdmFsdWVdKSB8fCBmYWxzZTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA1NiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8vIFdvcmthcm91bmQgZm9yIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTI4MDRcblxuXG5cbnZhciBjcmVhdGUgPSBPYmplY3QuY3JlYXRlLCBzaGltO1xuXG5pZiAoIV9fd2VicGFja19yZXF1aXJlX18oMTkpKCkpIHtcblx0c2hpbSA9IF9fd2VicGFja19yZXF1aXJlX18oMjApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbiAoKSB7XG5cdHZhciBudWxsT2JqZWN0LCBwb2x5UHJvcHMsIGRlc2M7XG5cdGlmICghc2hpbSkgcmV0dXJuIGNyZWF0ZTtcblx0aWYgKHNoaW0ubGV2ZWwgIT09IDEpIHJldHVybiBjcmVhdGU7XG5cblx0bnVsbE9iamVjdCA9IHt9O1xuXHRwb2x5UHJvcHMgPSB7fTtcblx0ZGVzYyA9IHtcblx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuXHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdHdyaXRhYmxlOiB0cnVlLFxuXHRcdHZhbHVlOiB1bmRlZmluZWRcblx0fTtcblx0T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoT2JqZWN0LnByb3RvdHlwZSkuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuXHRcdGlmIChuYW1lID09PSBcIl9fcHJvdG9fX1wiKSB7XG5cdFx0XHRwb2x5UHJvcHNbbmFtZV0gPSB7XG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0XHRcdHdyaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHR2YWx1ZTogdW5kZWZpbmVkXG5cdFx0XHR9O1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRwb2x5UHJvcHNbbmFtZV0gPSBkZXNjO1xuXHR9KTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobnVsbE9iamVjdCwgcG9seVByb3BzKTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc2hpbSwgXCJudWxsUG9seWZpbGxcIiwge1xuXHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG5cdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0d3JpdGFibGU6IGZhbHNlLFxuXHRcdHZhbHVlOiBudWxsT2JqZWN0XG5cdH0pO1xuXG5cdHJldHVybiBmdW5jdGlvbiAocHJvdG90eXBlLCBwcm9wcykge1xuXHRcdHJldHVybiBjcmVhdGUocHJvdG90eXBlID09PSBudWxsID8gbnVsbE9iamVjdCA6IHByb3RvdHlwZSwgcHJvcHMpO1xuXHR9O1xufSgpKTtcblxuXG4vKioqLyB9KSxcbi8qIDU3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgYXNzaWduID0gT2JqZWN0LmFzc2lnbiwgb2JqO1xuXHRpZiAodHlwZW9mIGFzc2lnbiAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cdG9iaiA9IHsgZm9vOiBcInJhelwiIH07XG5cdGFzc2lnbihvYmosIHsgYmFyOiBcImR3YVwiIH0sIHsgdHJ6eTogXCJ0cnp5XCIgfSk7XG5cdHJldHVybiAob2JqLmZvbyArIG9iai5iYXIgKyBvYmoudHJ6eSkgPT09IFwicmF6ZHdhdHJ6eVwiO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDU4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBrZXlzICA9IF9fd2VicGFja19yZXF1aXJlX18oNTkpXG4gICwgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApXG4gICwgbWF4ICAgPSBNYXRoLm1heDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZGVzdCwgc3JjIC8qLCDigKZzcmNuKi8pIHtcblx0dmFyIGVycm9yLCBpLCBsZW5ndGggPSBtYXgoYXJndW1lbnRzLmxlbmd0aCwgMiksIGFzc2lnbjtcblx0ZGVzdCA9IE9iamVjdCh2YWx1ZShkZXN0KSk7XG5cdGFzc2lnbiA9IGZ1bmN0aW9uIChrZXkpIHtcblx0XHR0cnkge1xuXHRcdFx0ZGVzdFtrZXldID0gc3JjW2tleV07XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0aWYgKCFlcnJvcikgZXJyb3IgPSBlO1xuXHRcdH1cblx0fTtcblx0Zm9yIChpID0gMTsgaSA8IGxlbmd0aDsgKytpKSB7XG5cdFx0c3JjID0gYXJndW1lbnRzW2ldO1xuXHRcdGtleXMoc3JjKS5mb3JFYWNoKGFzc2lnbik7XG5cdH1cblx0aWYgKGVycm9yICE9PSB1bmRlZmluZWQpIHRocm93IGVycm9yO1xuXHRyZXR1cm4gZGVzdDtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA1OSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNjApKClcblx0PyBPYmplY3Qua2V5c1xuXHQ6IF9fd2VicGFja19yZXF1aXJlX18oNjEpO1xuXG5cbi8qKiovIH0pLFxuLyogNjAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG5cdHRyeSB7XG5cdFx0T2JqZWN0LmtleXMoXCJwcmltaXRpdmVcIik7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGUpIHtcbiByZXR1cm4gZmFsc2U7XG59XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNjEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGlzVmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXG52YXIga2V5cyA9IE9iamVjdC5rZXlzO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QpIHtcblx0cmV0dXJuIGtleXMoaXNWYWx1ZShvYmplY3QpID8gT2JqZWN0KG9iamVjdCkgOiBvYmplY3QpO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDYyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLy8gRGVwcmVjYXRlZFxuXG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7XG4gcmV0dXJuIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIjtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA2MyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgc3RyID0gXCJyYXpkd2F0cnp5XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuXHRpZiAodHlwZW9mIHN0ci5jb250YWlucyAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiAoc3RyLmNvbnRhaW5zKFwiZHdhXCIpID09PSB0cnVlKSAmJiAoc3RyLmNvbnRhaW5zKFwiZm9vXCIpID09PSBmYWxzZSk7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNjQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGluZGV4T2YgPSBTdHJpbmcucHJvdG90eXBlLmluZGV4T2Y7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNlYXJjaFN0cmluZy8qLCBwb3NpdGlvbiovKSB7XG5cdHJldHVybiBpbmRleE9mLmNhbGwodGhpcywgc2VhcmNoU3RyaW5nLCBhcmd1bWVudHNbMV0pID4gLTE7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNjUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGQgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKVxuICAsIGNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVxuXG4gICwgYXBwbHkgPSBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHksIGNhbGwgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbFxuICAsIGNyZWF0ZSA9IE9iamVjdC5jcmVhdGUsIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5XG4gICwgZGVmaW5lUHJvcGVydGllcyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzXG4gICwgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG4gICwgZGVzY3JpcHRvciA9IHsgY29uZmlndXJhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUgfVxuXG4gICwgb24sIG9uY2UsIG9mZiwgZW1pdCwgbWV0aG9kcywgZGVzY3JpcHRvcnMsIGJhc2U7XG5cbm9uID0gZnVuY3Rpb24gKHR5cGUsIGxpc3RlbmVyKSB7XG5cdHZhciBkYXRhO1xuXG5cdGNhbGxhYmxlKGxpc3RlbmVyKTtcblxuXHRpZiAoIWhhc093blByb3BlcnR5LmNhbGwodGhpcywgJ19fZWVfXycpKSB7XG5cdFx0ZGF0YSA9IGRlc2NyaXB0b3IudmFsdWUgPSBjcmVhdGUobnVsbCk7XG5cdFx0ZGVmaW5lUHJvcGVydHkodGhpcywgJ19fZWVfXycsIGRlc2NyaXB0b3IpO1xuXHRcdGRlc2NyaXB0b3IudmFsdWUgPSBudWxsO1xuXHR9IGVsc2Uge1xuXHRcdGRhdGEgPSB0aGlzLl9fZWVfXztcblx0fVxuXHRpZiAoIWRhdGFbdHlwZV0pIGRhdGFbdHlwZV0gPSBsaXN0ZW5lcjtcblx0ZWxzZSBpZiAodHlwZW9mIGRhdGFbdHlwZV0gPT09ICdvYmplY3QnKSBkYXRhW3R5cGVdLnB1c2gobGlzdGVuZXIpO1xuXHRlbHNlIGRhdGFbdHlwZV0gPSBbZGF0YVt0eXBlXSwgbGlzdGVuZXJdO1xuXG5cdHJldHVybiB0aGlzO1xufTtcblxub25jZSA9IGZ1bmN0aW9uICh0eXBlLCBsaXN0ZW5lcikge1xuXHR2YXIgb25jZSwgc2VsZjtcblxuXHRjYWxsYWJsZShsaXN0ZW5lcik7XG5cdHNlbGYgPSB0aGlzO1xuXHRvbi5jYWxsKHRoaXMsIHR5cGUsIG9uY2UgPSBmdW5jdGlvbiAoKSB7XG5cdFx0b2ZmLmNhbGwoc2VsZiwgdHlwZSwgb25jZSk7XG5cdFx0YXBwbHkuY2FsbChsaXN0ZW5lciwgdGhpcywgYXJndW1lbnRzKTtcblx0fSk7XG5cblx0b25jZS5fX2VlT25jZUxpc3RlbmVyX18gPSBsaXN0ZW5lcjtcblx0cmV0dXJuIHRoaXM7XG59O1xuXG5vZmYgPSBmdW5jdGlvbiAodHlwZSwgbGlzdGVuZXIpIHtcblx0dmFyIGRhdGEsIGxpc3RlbmVycywgY2FuZGlkYXRlLCBpO1xuXG5cdGNhbGxhYmxlKGxpc3RlbmVyKTtcblxuXHRpZiAoIWhhc093blByb3BlcnR5LmNhbGwodGhpcywgJ19fZWVfXycpKSByZXR1cm4gdGhpcztcblx0ZGF0YSA9IHRoaXMuX19lZV9fO1xuXHRpZiAoIWRhdGFbdHlwZV0pIHJldHVybiB0aGlzO1xuXHRsaXN0ZW5lcnMgPSBkYXRhW3R5cGVdO1xuXG5cdGlmICh0eXBlb2YgbGlzdGVuZXJzID09PSAnb2JqZWN0Jykge1xuXHRcdGZvciAoaSA9IDA7IChjYW5kaWRhdGUgPSBsaXN0ZW5lcnNbaV0pOyArK2kpIHtcblx0XHRcdGlmICgoY2FuZGlkYXRlID09PSBsaXN0ZW5lcikgfHxcblx0XHRcdFx0XHQoY2FuZGlkYXRlLl9fZWVPbmNlTGlzdGVuZXJfXyA9PT0gbGlzdGVuZXIpKSB7XG5cdFx0XHRcdGlmIChsaXN0ZW5lcnMubGVuZ3RoID09PSAyKSBkYXRhW3R5cGVdID0gbGlzdGVuZXJzW2kgPyAwIDogMV07XG5cdFx0XHRcdGVsc2UgbGlzdGVuZXJzLnNwbGljZShpLCAxKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0aWYgKChsaXN0ZW5lcnMgPT09IGxpc3RlbmVyKSB8fFxuXHRcdFx0XHQobGlzdGVuZXJzLl9fZWVPbmNlTGlzdGVuZXJfXyA9PT0gbGlzdGVuZXIpKSB7XG5cdFx0XHRkZWxldGUgZGF0YVt0eXBlXTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdGhpcztcbn07XG5cbmVtaXQgPSBmdW5jdGlvbiAodHlwZSkge1xuXHR2YXIgaSwgbCwgbGlzdGVuZXIsIGxpc3RlbmVycywgYXJncztcblxuXHRpZiAoIWhhc093blByb3BlcnR5LmNhbGwodGhpcywgJ19fZWVfXycpKSByZXR1cm47XG5cdGxpc3RlbmVycyA9IHRoaXMuX19lZV9fW3R5cGVdO1xuXHRpZiAoIWxpc3RlbmVycykgcmV0dXJuO1xuXG5cdGlmICh0eXBlb2YgbGlzdGVuZXJzID09PSAnb2JqZWN0Jykge1xuXHRcdGwgPSBhcmd1bWVudHMubGVuZ3RoO1xuXHRcdGFyZ3MgPSBuZXcgQXJyYXkobCAtIDEpO1xuXHRcdGZvciAoaSA9IDE7IGkgPCBsOyArK2kpIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuXG5cdFx0bGlzdGVuZXJzID0gbGlzdGVuZXJzLnNsaWNlKCk7XG5cdFx0Zm9yIChpID0gMDsgKGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldKTsgKytpKSB7XG5cdFx0XHRhcHBseS5jYWxsKGxpc3RlbmVyLCB0aGlzLCBhcmdzKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0c3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0Y2FzZSAxOlxuXHRcdFx0Y2FsbC5jYWxsKGxpc3RlbmVycywgdGhpcyk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIDI6XG5cdFx0XHRjYWxsLmNhbGwobGlzdGVuZXJzLCB0aGlzLCBhcmd1bWVudHNbMV0pO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAzOlxuXHRcdFx0Y2FsbC5jYWxsKGxpc3RlbmVycywgdGhpcywgYXJndW1lbnRzWzFdLCBhcmd1bWVudHNbMl0pO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdGwgPSBhcmd1bWVudHMubGVuZ3RoO1xuXHRcdFx0YXJncyA9IG5ldyBBcnJheShsIC0gMSk7XG5cdFx0XHRmb3IgKGkgPSAxOyBpIDwgbDsgKytpKSB7XG5cdFx0XHRcdGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuXHRcdFx0fVxuXHRcdFx0YXBwbHkuY2FsbChsaXN0ZW5lcnMsIHRoaXMsIGFyZ3MpO1xuXHRcdH1cblx0fVxufTtcblxubWV0aG9kcyA9IHtcblx0b246IG9uLFxuXHRvbmNlOiBvbmNlLFxuXHRvZmY6IG9mZixcblx0ZW1pdDogZW1pdFxufTtcblxuZGVzY3JpcHRvcnMgPSB7XG5cdG9uOiBkKG9uKSxcblx0b25jZTogZChvbmNlKSxcblx0b2ZmOiBkKG9mZiksXG5cdGVtaXQ6IGQoZW1pdClcbn07XG5cbmJhc2UgPSBkZWZpbmVQcm9wZXJ0aWVzKHt9LCBkZXNjcmlwdG9ycyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZ1bmN0aW9uIChvKSB7XG5cdHJldHVybiAobyA9PSBudWxsKSA/IGNyZWF0ZShiYXNlKSA6IGRlZmluZVByb3BlcnRpZXMoT2JqZWN0KG8pLCBkZXNjcmlwdG9ycyk7XG59O1xuZXhwb3J0cy5tZXRob2RzID0gbWV0aG9kcztcblxuXG4vKioqLyB9KSxcbi8qIDY2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciB2YWxpZFR5cGVzID0geyBvYmplY3Q6IHRydWUsIHN5bWJvbDogdHJ1ZSB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHN5bWJvbDtcblx0aWYgKHR5cGVvZiBTeW1ib2wgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcblx0c3ltYm9sID0gU3ltYm9sKCd0ZXN0IHN5bWJvbCcpO1xuXHR0cnkgeyBTdHJpbmcoc3ltYm9sKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHQvLyBSZXR1cm4gJ3RydWUnIGFsc28gZm9yIHBvbHlmaWxsc1xuXHRpZiAoIXZhbGlkVHlwZXNbdHlwZW9mIFN5bWJvbC5pdGVyYXRvcl0pIHJldHVybiBmYWxzZTtcblx0aWYgKCF2YWxpZFR5cGVzW3R5cGVvZiBTeW1ib2wudG9QcmltaXRpdmVdKSByZXR1cm4gZmFsc2U7XG5cdGlmICghdmFsaWRUeXBlc1t0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnXSkgcmV0dXJuIGZhbHNlO1xuXG5cdHJldHVybiB0cnVlO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDY3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLy8gRVMyMDE1IFN5bWJvbCBwb2x5ZmlsbCBmb3IgZW52aXJvbm1lbnRzIHRoYXQgZG8gbm90IChvciBwYXJ0aWFsbHkpIHN1cHBvcnQgaXRcblxuXG5cbnZhciBkICAgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMylcbiAgLCB2YWxpZGF0ZVN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oNjgpXG5cbiAgLCBjcmVhdGUgPSBPYmplY3QuY3JlYXRlLCBkZWZpbmVQcm9wZXJ0aWVzID0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXNcbiAgLCBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSwgb2JqUHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZVxuICAsIE5hdGl2ZVN5bWJvbCwgU3ltYm9sUG9seWZpbGwsIEhpZGRlblN5bWJvbCwgZ2xvYmFsU3ltYm9scyA9IGNyZWF0ZShudWxsKVxuICAsIGlzTmF0aXZlU2FmZTtcblxuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicpIHtcblx0TmF0aXZlU3ltYm9sID0gU3ltYm9sO1xuXHR0cnkge1xuXHRcdFN0cmluZyhOYXRpdmVTeW1ib2woKSk7XG5cdFx0aXNOYXRpdmVTYWZlID0gdHJ1ZTtcblx0fSBjYXRjaCAoaWdub3JlKSB7fVxufVxuXG52YXIgZ2VuZXJhdGVOYW1lID0gKGZ1bmN0aW9uICgpIHtcblx0dmFyIGNyZWF0ZWQgPSBjcmVhdGUobnVsbCk7XG5cdHJldHVybiBmdW5jdGlvbiAoZGVzYykge1xuXHRcdHZhciBwb3N0Zml4ID0gMCwgbmFtZSwgaWUxMUJ1Z1dvcmthcm91bmQ7XG5cdFx0d2hpbGUgKGNyZWF0ZWRbZGVzYyArIChwb3N0Zml4IHx8ICcnKV0pICsrcG9zdGZpeDtcblx0XHRkZXNjICs9IChwb3N0Zml4IHx8ICcnKTtcblx0XHRjcmVhdGVkW2Rlc2NdID0gdHJ1ZTtcblx0XHRuYW1lID0gJ0BAJyArIGRlc2M7XG5cdFx0ZGVmaW5lUHJvcGVydHkob2JqUHJvdG90eXBlLCBuYW1lLCBkLmdzKG51bGwsIGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRcdFx0Ly8gRm9yIElFMTEgaXNzdWUgc2VlOlxuXHRcdFx0Ly8gaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2tkZXRhaWwvdmlldy8xOTI4NTA4L1xuXHRcdFx0Ly8gICAgaWUxMS1icm9rZW4tZ2V0dGVycy1vbi1kb20tb2JqZWN0c1xuXHRcdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL21lZGlrb28vZXM2LXN5bWJvbC9pc3N1ZXMvMTJcblx0XHRcdGlmIChpZTExQnVnV29ya2Fyb3VuZCkgcmV0dXJuO1xuXHRcdFx0aWUxMUJ1Z1dvcmthcm91bmQgPSB0cnVlO1xuXHRcdFx0ZGVmaW5lUHJvcGVydHkodGhpcywgbmFtZSwgZCh2YWx1ZSkpO1xuXHRcdFx0aWUxMUJ1Z1dvcmthcm91bmQgPSBmYWxzZTtcblx0XHR9KSk7XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH07XG59KCkpO1xuXG4vLyBJbnRlcm5hbCBjb25zdHJ1Y3RvciAobm90IG9uZSBleHBvc2VkKSBmb3IgY3JlYXRpbmcgU3ltYm9sIGluc3RhbmNlcy5cbi8vIFRoaXMgb25lIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgYHNvbWVTeW1ib2wgaW5zdGFuY2VvZiBTeW1ib2xgIGFsd2F5cyByZXR1cm4gZmFsc2VcbkhpZGRlblN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbChkZXNjcmlwdGlvbikge1xuXHRpZiAodGhpcyBpbnN0YW5jZW9mIEhpZGRlblN5bWJvbCkgdGhyb3cgbmV3IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XG5cdHJldHVybiBTeW1ib2xQb2x5ZmlsbChkZXNjcmlwdGlvbik7XG59O1xuXG4vLyBFeHBvc2VkIGBTeW1ib2xgIGNvbnN0cnVjdG9yXG4vLyAocmV0dXJucyBpbnN0YW5jZXMgb2YgSGlkZGVuU3ltYm9sKVxubW9kdWxlLmV4cG9ydHMgPSBTeW1ib2xQb2x5ZmlsbCA9IGZ1bmN0aW9uIFN5bWJvbChkZXNjcmlwdGlvbikge1xuXHR2YXIgc3ltYm9sO1xuXHRpZiAodGhpcyBpbnN0YW5jZW9mIFN5bWJvbCkgdGhyb3cgbmV3IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XG5cdGlmIChpc05hdGl2ZVNhZmUpIHJldHVybiBOYXRpdmVTeW1ib2woZGVzY3JpcHRpb24pO1xuXHRzeW1ib2wgPSBjcmVhdGUoSGlkZGVuU3ltYm9sLnByb3RvdHlwZSk7XG5cdGRlc2NyaXB0aW9uID0gKGRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQgPyAnJyA6IFN0cmluZyhkZXNjcmlwdGlvbikpO1xuXHRyZXR1cm4gZGVmaW5lUHJvcGVydGllcyhzeW1ib2wsIHtcblx0XHRfX2Rlc2NyaXB0aW9uX186IGQoJycsIGRlc2NyaXB0aW9uKSxcblx0XHRfX25hbWVfXzogZCgnJywgZ2VuZXJhdGVOYW1lKGRlc2NyaXB0aW9uKSlcblx0fSk7XG59O1xuZGVmaW5lUHJvcGVydGllcyhTeW1ib2xQb2x5ZmlsbCwge1xuXHRmb3I6IGQoZnVuY3Rpb24gKGtleSkge1xuXHRcdGlmIChnbG9iYWxTeW1ib2xzW2tleV0pIHJldHVybiBnbG9iYWxTeW1ib2xzW2tleV07XG5cdFx0cmV0dXJuIChnbG9iYWxTeW1ib2xzW2tleV0gPSBTeW1ib2xQb2x5ZmlsbChTdHJpbmcoa2V5KSkpO1xuXHR9KSxcblx0a2V5Rm9yOiBkKGZ1bmN0aW9uIChzKSB7XG5cdFx0dmFyIGtleTtcblx0XHR2YWxpZGF0ZVN5bWJvbChzKTtcblx0XHRmb3IgKGtleSBpbiBnbG9iYWxTeW1ib2xzKSBpZiAoZ2xvYmFsU3ltYm9sc1trZXldID09PSBzKSByZXR1cm4ga2V5O1xuXHR9KSxcblxuXHQvLyBUbyBlbnN1cmUgcHJvcGVyIGludGVyb3BlcmFiaWxpdHkgd2l0aCBvdGhlciBuYXRpdmUgZnVuY3Rpb25zIChlLmcuIEFycmF5LmZyb20pXG5cdC8vIGZhbGxiYWNrIHRvIGV2ZW50dWFsIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBvZiBnaXZlbiBzeW1ib2xcblx0aGFzSW5zdGFuY2U6IGQoJycsIChOYXRpdmVTeW1ib2wgJiYgTmF0aXZlU3ltYm9sLmhhc0luc3RhbmNlKSB8fCBTeW1ib2xQb2x5ZmlsbCgnaGFzSW5zdGFuY2UnKSksXG5cdGlzQ29uY2F0U3ByZWFkYWJsZTogZCgnJywgKE5hdGl2ZVN5bWJvbCAmJiBOYXRpdmVTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlKSB8fFxuXHRcdFN5bWJvbFBvbHlmaWxsKCdpc0NvbmNhdFNwcmVhZGFibGUnKSksXG5cdGl0ZXJhdG9yOiBkKCcnLCAoTmF0aXZlU3ltYm9sICYmIE5hdGl2ZVN5bWJvbC5pdGVyYXRvcikgfHwgU3ltYm9sUG9seWZpbGwoJ2l0ZXJhdG9yJykpLFxuXHRtYXRjaDogZCgnJywgKE5hdGl2ZVN5bWJvbCAmJiBOYXRpdmVTeW1ib2wubWF0Y2gpIHx8IFN5bWJvbFBvbHlmaWxsKCdtYXRjaCcpKSxcblx0cmVwbGFjZTogZCgnJywgKE5hdGl2ZVN5bWJvbCAmJiBOYXRpdmVTeW1ib2wucmVwbGFjZSkgfHwgU3ltYm9sUG9seWZpbGwoJ3JlcGxhY2UnKSksXG5cdHNlYXJjaDogZCgnJywgKE5hdGl2ZVN5bWJvbCAmJiBOYXRpdmVTeW1ib2wuc2VhcmNoKSB8fCBTeW1ib2xQb2x5ZmlsbCgnc2VhcmNoJykpLFxuXHRzcGVjaWVzOiBkKCcnLCAoTmF0aXZlU3ltYm9sICYmIE5hdGl2ZVN5bWJvbC5zcGVjaWVzKSB8fCBTeW1ib2xQb2x5ZmlsbCgnc3BlY2llcycpKSxcblx0c3BsaXQ6IGQoJycsIChOYXRpdmVTeW1ib2wgJiYgTmF0aXZlU3ltYm9sLnNwbGl0KSB8fCBTeW1ib2xQb2x5ZmlsbCgnc3BsaXQnKSksXG5cdHRvUHJpbWl0aXZlOiBkKCcnLCAoTmF0aXZlU3ltYm9sICYmIE5hdGl2ZVN5bWJvbC50b1ByaW1pdGl2ZSkgfHwgU3ltYm9sUG9seWZpbGwoJ3RvUHJpbWl0aXZlJykpLFxuXHR0b1N0cmluZ1RhZzogZCgnJywgKE5hdGl2ZVN5bWJvbCAmJiBOYXRpdmVTeW1ib2wudG9TdHJpbmdUYWcpIHx8IFN5bWJvbFBvbHlmaWxsKCd0b1N0cmluZ1RhZycpKSxcblx0dW5zY29wYWJsZXM6IGQoJycsIChOYXRpdmVTeW1ib2wgJiYgTmF0aXZlU3ltYm9sLnVuc2NvcGFibGVzKSB8fCBTeW1ib2xQb2x5ZmlsbCgndW5zY29wYWJsZXMnKSlcbn0pO1xuXG4vLyBJbnRlcm5hbCB0d2Vha3MgZm9yIHJlYWwgc3ltYm9sIHByb2R1Y2VyXG5kZWZpbmVQcm9wZXJ0aWVzKEhpZGRlblN5bWJvbC5wcm90b3R5cGUsIHtcblx0Y29uc3RydWN0b3I6IGQoU3ltYm9sUG9seWZpbGwpLFxuXHR0b1N0cmluZzogZCgnJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fX25hbWVfXzsgfSlcbn0pO1xuXG4vLyBQcm9wZXIgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBleHBvc2VkIG9uIFN5bWJvbC5wcm90b3R5cGVcbi8vIFRoZXkgd29uJ3QgYmUgYWNjZXNzaWJsZSBvbiBwcm9kdWNlZCBzeW1ib2wgaW5zdGFuY2VzIGFzIHRoZXkgZGVyaXZlIGZyb20gSGlkZGVuU3ltYm9sLnByb3RvdHlwZVxuZGVmaW5lUHJvcGVydGllcyhTeW1ib2xQb2x5ZmlsbC5wcm90b3R5cGUsIHtcblx0dG9TdHJpbmc6IGQoZnVuY3Rpb24gKCkgeyByZXR1cm4gJ1N5bWJvbCAoJyArIHZhbGlkYXRlU3ltYm9sKHRoaXMpLl9fZGVzY3JpcHRpb25fXyArICcpJzsgfSksXG5cdHZhbHVlT2Y6IGQoZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsaWRhdGVTeW1ib2wodGhpcyk7IH0pXG59KTtcbmRlZmluZVByb3BlcnR5KFN5bWJvbFBvbHlmaWxsLnByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwudG9QcmltaXRpdmUsIGQoJycsIGZ1bmN0aW9uICgpIHtcblx0dmFyIHN5bWJvbCA9IHZhbGlkYXRlU3ltYm9sKHRoaXMpO1xuXHRpZiAodHlwZW9mIHN5bWJvbCA9PT0gJ3N5bWJvbCcpIHJldHVybiBzeW1ib2w7XG5cdHJldHVybiBzeW1ib2wudG9TdHJpbmcoKTtcbn0pKTtcbmRlZmluZVByb3BlcnR5KFN5bWJvbFBvbHlmaWxsLnByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcsIGQoJ2MnLCAnU3ltYm9sJykpO1xuXG4vLyBQcm9wZXIgaW1wbGVtZW50YXRvbiBvZiB0b1ByaW1pdGl2ZSBhbmQgdG9TdHJpbmdUYWcgZm9yIHJldHVybmVkIHN5bWJvbCBpbnN0YW5jZXNcbmRlZmluZVByb3BlcnR5KEhpZGRlblN5bWJvbC5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnLFxuXHRkKCdjJywgU3ltYm9sUG9seWZpbGwucHJvdG90eXBlW1N5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnXSkpO1xuXG4vLyBOb3RlOiBJdCdzIGltcG9ydGFudCB0byBkZWZpbmUgYHRvUHJpbWl0aXZlYCBhcyBsYXN0IG9uZSwgYXMgc29tZSBpbXBsZW1lbnRhdGlvbnNcbi8vIGltcGxlbWVudCBgdG9QcmltaXRpdmVgIG5hdGl2ZWx5IHdpdGhvdXQgaW1wbGVtZW50aW5nIGB0b1N0cmluZ1RhZ2AgKG9yIG90aGVyIHNwZWNpZmllZCBzeW1ib2xzKVxuLy8gQW5kIHRoYXQgbWF5IGludm9rZSBlcnJvciBpbiBkZWZpbml0aW9uIGZsb3c6XG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9tZWRpa29vL2VzNi1zeW1ib2wvaXNzdWVzLzEzI2lzc3VlY29tbWVudC0xNjQxNDYxNDlcbmRlZmluZVByb3BlcnR5KEhpZGRlblN5bWJvbC5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvUHJpbWl0aXZlLFxuXHRkKCdjJywgU3ltYm9sUG9seWZpbGwucHJvdG90eXBlW1N5bWJvbFBvbHlmaWxsLnRvUHJpbWl0aXZlXSkpO1xuXG5cbi8qKiovIH0pLFxuLyogNjggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGlzU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2OSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdGlmICghaXNTeW1ib2wodmFsdWUpKSB0aHJvdyBuZXcgVHlwZUVycm9yKHZhbHVlICsgXCIgaXMgbm90IGEgc3ltYm9sXCIpO1xuXHRyZXR1cm4gdmFsdWU7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNjkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoeCkge1xuXHRpZiAoIXgpIHJldHVybiBmYWxzZTtcblx0aWYgKHR5cGVvZiB4ID09PSAnc3ltYm9sJykgcmV0dXJuIHRydWU7XG5cdGlmICgheC5jb25zdHJ1Y3RvcikgcmV0dXJuIGZhbHNlO1xuXHRpZiAoeC5jb25zdHJ1Y3Rvci5uYW1lICE9PSAnU3ltYm9sJykgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gKHhbeC5jb25zdHJ1Y3Rvci50b1N0cmluZ1RhZ10gPT09ICdTeW1ib2wnKTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA3MCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgaXNBcmd1bWVudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpXG4gICwgaXNWYWx1ZSAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpXG4gICwgaXNTdHJpbmcgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xuXG52YXIgaXRlcmF0b3JTeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpLml0ZXJhdG9yXG4gICwgaXNBcnJheSAgICAgICAgPSBBcnJheS5pc0FycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRpZiAoIWlzVmFsdWUodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmIChpc0FycmF5KHZhbHVlKSkgcmV0dXJuIHRydWU7XG5cdGlmIChpc1N0cmluZyh2YWx1ZSkpIHJldHVybiB0cnVlO1xuXHRpZiAoaXNBcmd1bWVudHModmFsdWUpKSByZXR1cm4gdHJ1ZTtcblx0cmV0dXJuIHR5cGVvZiB2YWx1ZVtpdGVyYXRvclN5bWJvbF0gPT09IFwiZnVuY3Rpb25cIjtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA3MSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgaXNBcmd1bWVudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpXG4gICwgY2FsbGFibGUgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpXG4gICwgaXNTdHJpbmcgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpXG4gICwgZ2V0ICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcyKTtcblxudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5LCBjYWxsID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwsIHNvbWUgPSBBcnJheS5wcm90b3R5cGUuc29tZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIGNiIC8qLCB0aGlzQXJnKi8pIHtcblx0dmFyIG1vZGUsIHRoaXNBcmcgPSBhcmd1bWVudHNbMl0sIHJlc3VsdCwgZG9CcmVhaywgYnJva2VuLCBpLCBsZW5ndGgsIGNoYXIsIGNvZGU7XG5cdGlmIChpc0FycmF5KGl0ZXJhYmxlKSB8fCBpc0FyZ3VtZW50cyhpdGVyYWJsZSkpIG1vZGUgPSBcImFycmF5XCI7XG5cdGVsc2UgaWYgKGlzU3RyaW5nKGl0ZXJhYmxlKSkgbW9kZSA9IFwic3RyaW5nXCI7XG5cdGVsc2UgaXRlcmFibGUgPSBnZXQoaXRlcmFibGUpO1xuXG5cdGNhbGxhYmxlKGNiKTtcblx0ZG9CcmVhayA9IGZ1bmN0aW9uICgpIHtcblx0XHRicm9rZW4gPSB0cnVlO1xuXHR9O1xuXHRpZiAobW9kZSA9PT0gXCJhcnJheVwiKSB7XG5cdFx0c29tZS5jYWxsKGl0ZXJhYmxlLCBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRcdGNhbGwuY2FsbChjYiwgdGhpc0FyZywgdmFsdWUsIGRvQnJlYWspO1xuXHRcdFx0cmV0dXJuIGJyb2tlbjtcblx0XHR9KTtcblx0XHRyZXR1cm47XG5cdH1cblx0aWYgKG1vZGUgPT09IFwic3RyaW5nXCIpIHtcblx0XHRsZW5ndGggPSBpdGVyYWJsZS5sZW5ndGg7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG5cdFx0XHRjaGFyID0gaXRlcmFibGVbaV07XG5cdFx0XHRpZiAoaSArIDEgPCBsZW5ndGgpIHtcblx0XHRcdFx0Y29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcblx0XHRcdFx0aWYgKGNvZGUgPj0gMHhkODAwICYmIGNvZGUgPD0gMHhkYmZmKSBjaGFyICs9IGl0ZXJhYmxlWysraV07XG5cdFx0XHR9XG5cdFx0XHRjYWxsLmNhbGwoY2IsIHRoaXNBcmcsIGNoYXIsIGRvQnJlYWspO1xuXHRcdFx0aWYgKGJyb2tlbikgYnJlYWs7XG5cdFx0fVxuXHRcdHJldHVybjtcblx0fVxuXHRyZXN1bHQgPSBpdGVyYWJsZS5uZXh0KCk7XG5cblx0d2hpbGUgKCFyZXN1bHQuZG9uZSkge1xuXHRcdGNhbGwuY2FsbChjYiwgdGhpc0FyZywgcmVzdWx0LnZhbHVlLCBkb0JyZWFrKTtcblx0XHRpZiAoYnJva2VuKSByZXR1cm47XG5cdFx0cmVzdWx0ID0gaXRlcmFibGUubmV4dCgpO1xuXHR9XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNzIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGlzQXJndW1lbnRzICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KVxuICAsIGlzU3RyaW5nICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KVxuICAsIEFycmF5SXRlcmF0b3IgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MylcbiAgLCBTdHJpbmdJdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oODMpXG4gICwgaXRlcmFibGUgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKVxuICAsIGl0ZXJhdG9yU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKS5pdGVyYXRvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7XG5cdGlmICh0eXBlb2YgaXRlcmFibGUob2JqKVtpdGVyYXRvclN5bWJvbF0gPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG9ialtpdGVyYXRvclN5bWJvbF0oKTtcblx0aWYgKGlzQXJndW1lbnRzKG9iaikpIHJldHVybiBuZXcgQXJyYXlJdGVyYXRvcihvYmopO1xuXHRpZiAoaXNTdHJpbmcob2JqKSkgcmV0dXJuIG5ldyBTdHJpbmdJdGVyYXRvcihvYmopO1xuXHRyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3Iob2JqKTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA3MyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgc2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG4gICwgY29udGFpbnMgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKVxuICAsIGQgICAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKVxuICAsIFN5bWJvbCAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKVxuICAsIEl0ZXJhdG9yICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSwgQXJyYXlJdGVyYXRvcjtcblxuQXJyYXlJdGVyYXRvciA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyciwga2luZCkge1xuXHRpZiAoISh0aGlzIGluc3RhbmNlb2YgQXJyYXlJdGVyYXRvcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDb25zdHJ1Y3RvciByZXF1aXJlcyAnbmV3J1wiKTtcblx0SXRlcmF0b3IuY2FsbCh0aGlzLCBhcnIpO1xuXHRpZiAoIWtpbmQpIGtpbmQgPSBcInZhbHVlXCI7XG5cdGVsc2UgaWYgKGNvbnRhaW5zLmNhbGwoa2luZCwgXCJrZXkrdmFsdWVcIikpIGtpbmQgPSBcImtleSt2YWx1ZVwiO1xuXHRlbHNlIGlmIChjb250YWlucy5jYWxsKGtpbmQsIFwia2V5XCIpKSBraW5kID0gXCJrZXlcIjtcblx0ZWxzZSBraW5kID0gXCJ2YWx1ZVwiO1xuXHRkZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIl9fa2luZF9fXCIsIGQoXCJcIiwga2luZCkpO1xufTtcbmlmIChzZXRQcm90b3R5cGVPZikgc2V0UHJvdG90eXBlT2YoQXJyYXlJdGVyYXRvciwgSXRlcmF0b3IpO1xuXG4vLyBJbnRlcm5hbCAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUgZG9lc24ndCBleHBvc2UgaXRzIGNvbnN0cnVjdG9yXG5kZWxldGUgQXJyYXlJdGVyYXRvci5wcm90b3R5cGUuY29uc3RydWN0b3I7XG5cbkFycmF5SXRlcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvci5wcm90b3R5cGUsIHtcblx0X3Jlc29sdmU6IGQoZnVuY3Rpb24gKGkpIHtcblx0XHRpZiAodGhpcy5fX2tpbmRfXyA9PT0gXCJ2YWx1ZVwiKSByZXR1cm4gdGhpcy5fX2xpc3RfX1tpXTtcblx0XHRpZiAodGhpcy5fX2tpbmRfXyA9PT0gXCJrZXkrdmFsdWVcIikgcmV0dXJuIFtpLCB0aGlzLl9fbGlzdF9fW2ldXTtcblx0XHRyZXR1cm4gaTtcblx0fSlcbn0pO1xuZGVmaW5lUHJvcGVydHkoQXJyYXlJdGVyYXRvci5wcm90b3R5cGUsIFN5bWJvbC50b1N0cmluZ1RhZywgZChcImNcIiwgXCJBcnJheSBJdGVyYXRvclwiKSk7XG5cblxuLyoqKi8gfSksXG4vKiA3NCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgY29weSAgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNzUpXG4gICwgbm9ybWFsaXplT3B0aW9ucyA9IF9fd2VicGFja19yZXF1aXJlX18oMjEpXG4gICwgZW5zdXJlQ2FsbGFibGUgICA9IF9fd2VicGFja19yZXF1aXJlX18oMSlcbiAgLCBtYXAgICAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MClcbiAgLCBjYWxsYWJsZSAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVxuICAsIHZhbGlkVmFsdWUgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApXG5cbiAgLCBiaW5kID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQsIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5XG4gICwgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG4gICwgZGVmaW5lO1xuXG5kZWZpbmUgPSBmdW5jdGlvbiAobmFtZSwgZGVzYywgb3B0aW9ucykge1xuXHR2YXIgdmFsdWUgPSB2YWxpZFZhbHVlKGRlc2MpICYmIGNhbGxhYmxlKGRlc2MudmFsdWUpLCBkZ3M7XG5cdGRncyA9IGNvcHkoZGVzYyk7XG5cdGRlbGV0ZSBkZ3Mud3JpdGFibGU7XG5cdGRlbGV0ZSBkZ3MudmFsdWU7XG5cdGRncy5nZXQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0aWYgKCFvcHRpb25zLm92ZXJ3cml0ZURlZmluaXRpb24gJiYgaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLCBuYW1lKSkgcmV0dXJuIHZhbHVlO1xuXHRcdGRlc2MudmFsdWUgPSBiaW5kLmNhbGwodmFsdWUsIG9wdGlvbnMucmVzb2x2ZUNvbnRleHQgPyBvcHRpb25zLnJlc29sdmVDb250ZXh0KHRoaXMpIDogdGhpcyk7XG5cdFx0ZGVmaW5lUHJvcGVydHkodGhpcywgbmFtZSwgZGVzYyk7XG5cdFx0cmV0dXJuIHRoaXNbbmFtZV07XG5cdH07XG5cdHJldHVybiBkZ3M7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChwcm9wcy8qLCBvcHRpb25zKi8pIHtcblx0dmFyIG9wdGlvbnMgPSBub3JtYWxpemVPcHRpb25zKGFyZ3VtZW50c1sxXSk7XG5cdGlmIChvcHRpb25zLnJlc29sdmVDb250ZXh0ICE9IG51bGwpIGVuc3VyZUNhbGxhYmxlKG9wdGlvbnMucmVzb2x2ZUNvbnRleHQpO1xuXHRyZXR1cm4gbWFwKHByb3BzLCBmdW5jdGlvbiAoZGVzYywgbmFtZSkgeyByZXR1cm4gZGVmaW5lKG5hbWUsIGRlc2MsIG9wdGlvbnMpOyB9KTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA3NSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgYUZyb20gID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NilcbiAgLCBhc3NpZ24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKVxuICAsIHZhbHVlICA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iai8qLCBwcm9wZXJ0eU5hbWVzLCBvcHRpb25zKi8pIHtcblx0dmFyIGNvcHkgPSBPYmplY3QodmFsdWUob2JqKSksIHByb3BlcnR5TmFtZXMgPSBhcmd1bWVudHNbMV0sIG9wdGlvbnMgPSBPYmplY3QoYXJndW1lbnRzWzJdKTtcblx0aWYgKGNvcHkgIT09IG9iaiAmJiAhcHJvcGVydHlOYW1lcykgcmV0dXJuIGNvcHk7XG5cdHZhciByZXN1bHQgPSB7fTtcblx0aWYgKHByb3BlcnR5TmFtZXMpIHtcblx0XHRhRnJvbShwcm9wZXJ0eU5hbWVzLCBmdW5jdGlvbiAocHJvcGVydHlOYW1lKSB7XG5cdFx0XHRpZiAob3B0aW9ucy5lbnN1cmUgfHwgcHJvcGVydHlOYW1lIGluIG9iaikgcmVzdWx0W3Byb3BlcnR5TmFtZV0gPSBvYmpbcHJvcGVydHlOYW1lXTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRhc3NpZ24ocmVzdWx0LCBvYmopO1xuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNzYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc3KSgpXG5cdD8gQXJyYXkuZnJvbVxuXHQ6IF9fd2VicGFja19yZXF1aXJlX18oNzgpO1xuXG5cbi8qKiovIH0pLFxuLyogNzcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBmcm9tID0gQXJyYXkuZnJvbSwgYXJyLCByZXN1bHQ7XG5cdGlmICh0eXBlb2YgZnJvbSAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cdGFyciA9IFtcInJhelwiLCBcImR3YVwiXTtcblx0cmVzdWx0ID0gZnJvbShhcnIpO1xuXHRyZXR1cm4gQm9vbGVhbihyZXN1bHQgJiYgKHJlc3VsdCAhPT0gYXJyKSAmJiAocmVzdWx0WzFdID09PSBcImR3YVwiKSk7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNzggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGl0ZXJhdG9yU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKS5pdGVyYXRvclxuICAsIGlzQXJndW1lbnRzICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KVxuICAsIGlzRnVuY3Rpb24gICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSlcbiAgLCB0b1Bvc0ludCAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTgpXG4gICwgY2FsbGFibGUgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpXG4gICwgdmFsaWRWYWx1ZSAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApXG4gICwgaXNWYWx1ZSAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpXG4gICwgaXNTdHJpbmcgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpXG4gICwgaXNBcnJheSAgICAgICAgPSBBcnJheS5pc0FycmF5XG4gICwgY2FsbCAgICAgICAgICAgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbFxuICAsIGRlc2MgICAgICAgICAgID0geyBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogbnVsbCB9XG4gICwgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcnJheUxpa2UgLyosIG1hcEZuLCB0aGlzQXJnKi8pIHtcblx0dmFyIG1hcEZuID0gYXJndW1lbnRzWzFdXG5cdCAgLCB0aGlzQXJnID0gYXJndW1lbnRzWzJdXG5cdCAgLCBDb250ZXh0XG5cdCAgLCBpXG5cdCAgLCBqXG5cdCAgLCBhcnJcblx0ICAsIGxlbmd0aFxuXHQgICwgY29kZVxuXHQgICwgaXRlcmF0b3Jcblx0ICAsIHJlc3VsdFxuXHQgICwgZ2V0SXRlcmF0b3Jcblx0ICAsIHZhbHVlO1xuXG5cdGFycmF5TGlrZSA9IE9iamVjdCh2YWxpZFZhbHVlKGFycmF5TGlrZSkpO1xuXG5cdGlmIChpc1ZhbHVlKG1hcEZuKSkgY2FsbGFibGUobWFwRm4pO1xuXHRpZiAoIXRoaXMgfHwgdGhpcyA9PT0gQXJyYXkgfHwgIWlzRnVuY3Rpb24odGhpcykpIHtcblx0XHQvLyBSZXN1bHQ6IFBsYWluIGFycmF5XG5cdFx0aWYgKCFtYXBGbikge1xuXHRcdFx0aWYgKGlzQXJndW1lbnRzKGFycmF5TGlrZSkpIHtcblx0XHRcdFx0Ly8gU291cmNlOiBBcmd1bWVudHNcblx0XHRcdFx0bGVuZ3RoID0gYXJyYXlMaWtlLmxlbmd0aDtcblx0XHRcdFx0aWYgKGxlbmd0aCAhPT0gMSkgcmV0dXJuIEFycmF5LmFwcGx5KG51bGwsIGFycmF5TGlrZSk7XG5cdFx0XHRcdGFyciA9IG5ldyBBcnJheSgxKTtcblx0XHRcdFx0YXJyWzBdID0gYXJyYXlMaWtlWzBdO1xuXHRcdFx0XHRyZXR1cm4gYXJyO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGlzQXJyYXkoYXJyYXlMaWtlKSkge1xuXHRcdFx0XHQvLyBTb3VyY2U6IEFycmF5XG5cdFx0XHRcdGFyciA9IG5ldyBBcnJheShsZW5ndGggPSBhcnJheUxpa2UubGVuZ3RoKTtcblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSBhcnJbaV0gPSBhcnJheUxpa2VbaV07XG5cdFx0XHRcdHJldHVybiBhcnI7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGFyciA9IFtdO1xuXHR9IGVsc2Uge1xuXHRcdC8vIFJlc3VsdDogTm9uIHBsYWluIGFycmF5XG5cdFx0Q29udGV4dCA9IHRoaXM7XG5cdH1cblxuXHRpZiAoIWlzQXJyYXkoYXJyYXlMaWtlKSkge1xuXHRcdGlmICgoZ2V0SXRlcmF0b3IgPSBhcnJheUxpa2VbaXRlcmF0b3JTeW1ib2xdKSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBTb3VyY2U6IEl0ZXJhdG9yXG5cdFx0XHRpdGVyYXRvciA9IGNhbGxhYmxlKGdldEl0ZXJhdG9yKS5jYWxsKGFycmF5TGlrZSk7XG5cdFx0XHRpZiAoQ29udGV4dCkgYXJyID0gbmV3IENvbnRleHQoKTtcblx0XHRcdHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcblx0XHRcdGkgPSAwO1xuXHRcdFx0d2hpbGUgKCFyZXN1bHQuZG9uZSkge1xuXHRcdFx0XHR2YWx1ZSA9IG1hcEZuID8gY2FsbC5jYWxsKG1hcEZuLCB0aGlzQXJnLCByZXN1bHQudmFsdWUsIGkpIDogcmVzdWx0LnZhbHVlO1xuXHRcdFx0XHRpZiAoQ29udGV4dCkge1xuXHRcdFx0XHRcdGRlc2MudmFsdWUgPSB2YWx1ZTtcblx0XHRcdFx0XHRkZWZpbmVQcm9wZXJ0eShhcnIsIGksIGRlc2MpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFycltpXSA9IHZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcblx0XHRcdFx0KytpO1xuXHRcdFx0fVxuXHRcdFx0bGVuZ3RoID0gaTtcblx0XHR9IGVsc2UgaWYgKGlzU3RyaW5nKGFycmF5TGlrZSkpIHtcblx0XHRcdC8vIFNvdXJjZTogU3RyaW5nXG5cdFx0XHRsZW5ndGggPSBhcnJheUxpa2UubGVuZ3RoO1xuXHRcdFx0aWYgKENvbnRleHQpIGFyciA9IG5ldyBDb250ZXh0KCk7XG5cdFx0XHRmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG5cdFx0XHRcdHZhbHVlID0gYXJyYXlMaWtlW2ldO1xuXHRcdFx0XHRpZiAoaSArIDEgPCBsZW5ndGgpIHtcblx0XHRcdFx0XHRjb2RlID0gdmFsdWUuY2hhckNvZGVBdCgwKTtcblx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWRlcHRoXG5cdFx0XHRcdFx0aWYgKGNvZGUgPj0gMHhkODAwICYmIGNvZGUgPD0gMHhkYmZmKSB2YWx1ZSArPSBhcnJheUxpa2VbKytpXTtcblx0XHRcdFx0fVxuXHRcdFx0XHR2YWx1ZSA9IG1hcEZuID8gY2FsbC5jYWxsKG1hcEZuLCB0aGlzQXJnLCB2YWx1ZSwgaikgOiB2YWx1ZTtcblx0XHRcdFx0aWYgKENvbnRleHQpIHtcblx0XHRcdFx0XHRkZXNjLnZhbHVlID0gdmFsdWU7XG5cdFx0XHRcdFx0ZGVmaW5lUHJvcGVydHkoYXJyLCBqLCBkZXNjKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhcnJbal0gPSB2YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHQrK2o7XG5cdFx0XHR9XG5cdFx0XHRsZW5ndGggPSBqO1xuXHRcdH1cblx0fVxuXHRpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcblx0XHQvLyBTb3VyY2U6IGFycmF5IG9yIGFycmF5LWxpa2Vcblx0XHRsZW5ndGggPSB0b1Bvc0ludChhcnJheUxpa2UubGVuZ3RoKTtcblx0XHRpZiAoQ29udGV4dCkgYXJyID0gbmV3IENvbnRleHQobGVuZ3RoKTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcblx0XHRcdHZhbHVlID0gbWFwRm4gPyBjYWxsLmNhbGwobWFwRm4sIHRoaXNBcmcsIGFycmF5TGlrZVtpXSwgaSkgOiBhcnJheUxpa2VbaV07XG5cdFx0XHRpZiAoQ29udGV4dCkge1xuXHRcdFx0XHRkZXNjLnZhbHVlID0gdmFsdWU7XG5cdFx0XHRcdGRlZmluZVByb3BlcnR5KGFyciwgaSwgZGVzYyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhcnJbaV0gPSB2YWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0aWYgKENvbnRleHQpIHtcblx0XHRkZXNjLnZhbHVlID0gbnVsbDtcblx0XHRhcnIubGVuZ3RoID0gbGVuZ3RoO1xuXHR9XG5cdHJldHVybiBhcnI7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNzkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIG9ialRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZywgaWQgPSBvYmpUb1N0cmluZy5jYWxsKF9fd2VicGFja19yZXF1aXJlX18oMTcpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiICYmIG9ialRvU3RyaW5nLmNhbGwodmFsdWUpID09PSBpZDtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA4MCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgY2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpXG4gICwgZm9yRWFjaCAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgxKVxuICAsIGNhbGwgICAgID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaiwgY2IgLyosIHRoaXNBcmcqLykge1xuXHR2YXIgcmVzdWx0ID0ge30sIHRoaXNBcmcgPSBhcmd1bWVudHNbMl07XG5cdGNhbGxhYmxlKGNiKTtcblx0Zm9yRWFjaChvYmosIGZ1bmN0aW9uICh2YWx1ZSwga2V5LCB0YXJnZXRPYmosIGluZGV4KSB7XG5cdFx0cmVzdWx0W2tleV0gPSBjYWxsLmNhbGwoY2IsIHRoaXNBcmcsIHZhbHVlLCBrZXksIHRhcmdldE9iaiwgaW5kZXgpO1xuXHR9KTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA4MSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oODIpKFwiZm9yRWFjaFwiKTtcblxuXG4vKioqLyB9KSxcbi8qIDgyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLy8gSW50ZXJuYWwgbWV0aG9kLCB1c2VkIGJ5IGl0ZXJhdGlvbiBmdW5jdGlvbnMuXG4vLyBDYWxscyBhIGZ1bmN0aW9uIGZvciBlYWNoIGtleS12YWx1ZSBwYWlyIGZvdW5kIGluIG9iamVjdFxuLy8gT3B0aW9uYWxseSB0YWtlcyBjb21wYXJlRm4gdG8gaXRlcmF0ZSBvYmplY3QgaW4gc3BlY2lmaWMgb3JkZXJcblxuXG5cbnZhciBjYWxsYWJsZSAgICAgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMSlcbiAgLCB2YWx1ZSAgICAgICAgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMClcbiAgLCBiaW5kICAgICAgICAgICAgICAgICAgICA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kXG4gICwgY2FsbCAgICAgICAgICAgICAgICAgICAgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbFxuICAsIGtleXMgICAgICAgICAgICAgICAgICAgID0gT2JqZWN0LmtleXNcbiAgLCBvYmpQcm9wZXJ0eUlzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG1ldGhvZCwgZGVmVmFsKSB7XG5cdHJldHVybiBmdW5jdGlvbiAob2JqLCBjYiAvKiwgdGhpc0FyZywgY29tcGFyZUZuKi8pIHtcblx0XHR2YXIgbGlzdCwgdGhpc0FyZyA9IGFyZ3VtZW50c1syXSwgY29tcGFyZUZuID0gYXJndW1lbnRzWzNdO1xuXHRcdG9iaiA9IE9iamVjdCh2YWx1ZShvYmopKTtcblx0XHRjYWxsYWJsZShjYik7XG5cblx0XHRsaXN0ID0ga2V5cyhvYmopO1xuXHRcdGlmIChjb21wYXJlRm4pIHtcblx0XHRcdGxpc3Quc29ydCh0eXBlb2YgY29tcGFyZUZuID09PSBcImZ1bmN0aW9uXCIgPyBiaW5kLmNhbGwoY29tcGFyZUZuLCBvYmopIDogdW5kZWZpbmVkKTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiBtZXRob2QgIT09IFwiZnVuY3Rpb25cIikgbWV0aG9kID0gbGlzdFttZXRob2RdO1xuXHRcdHJldHVybiBjYWxsLmNhbGwobWV0aG9kLCBsaXN0LCBmdW5jdGlvbiAoa2V5LCBpbmRleCkge1xuXHRcdFx0aWYgKCFvYmpQcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iaiwga2V5KSkgcmV0dXJuIGRlZlZhbDtcblx0XHRcdHJldHVybiBjYWxsLmNhbGwoY2IsIHRoaXNBcmcsIG9ialtrZXldLCBrZXksIG9iaiwgaW5kZXgpO1xuXHRcdH0pO1xuXHR9O1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDgzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLy8gVGhhbmtzIEBtYXRoaWFzYnluZW5zXG4vLyBodHRwOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LXVuaWNvZGUjaXRlcmF0aW5nLW92ZXItc3ltYm9sc1xuXG5cblxudmFyIHNldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KVxuICAsIGQgICAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKVxuICAsIFN5bWJvbCAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKVxuICAsIEl0ZXJhdG9yICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSwgU3RyaW5nSXRlcmF0b3I7XG5cblN0cmluZ0l0ZXJhdG9yID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RyKSB7XG5cdGlmICghKHRoaXMgaW5zdGFuY2VvZiBTdHJpbmdJdGVyYXRvcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDb25zdHJ1Y3RvciByZXF1aXJlcyAnbmV3J1wiKTtcblx0c3RyID0gU3RyaW5nKHN0cik7XG5cdEl0ZXJhdG9yLmNhbGwodGhpcywgc3RyKTtcblx0ZGVmaW5lUHJvcGVydHkodGhpcywgXCJfX2xlbmd0aF9fXCIsIGQoXCJcIiwgc3RyLmxlbmd0aCkpO1xufTtcbmlmIChzZXRQcm90b3R5cGVPZikgc2V0UHJvdG90eXBlT2YoU3RyaW5nSXRlcmF0b3IsIEl0ZXJhdG9yKTtcblxuLy8gSW50ZXJuYWwgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlIGRvZXNuJ3QgZXhwb3NlIGl0cyBjb25zdHJ1Y3RvclxuZGVsZXRlIFN0cmluZ0l0ZXJhdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvcjtcblxuU3RyaW5nSXRlcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvci5wcm90b3R5cGUsIHtcblx0X25leHQ6IGQoZnVuY3Rpb24gKCkge1xuXHRcdGlmICghdGhpcy5fX2xpc3RfXykgcmV0dXJuIHVuZGVmaW5lZDtcblx0XHRpZiAodGhpcy5fX25leHRJbmRleF9fIDwgdGhpcy5fX2xlbmd0aF9fKSByZXR1cm4gdGhpcy5fX25leHRJbmRleF9fKys7XG5cdFx0dGhpcy5fdW5CaW5kKCk7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fSksXG5cdF9yZXNvbHZlOiBkKGZ1bmN0aW9uIChpKSB7XG5cdFx0dmFyIGNoYXIgPSB0aGlzLl9fbGlzdF9fW2ldLCBjb2RlO1xuXHRcdGlmICh0aGlzLl9fbmV4dEluZGV4X18gPT09IHRoaXMuX19sZW5ndGhfXykgcmV0dXJuIGNoYXI7XG5cdFx0Y29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcblx0XHRpZiAoY29kZSA+PSAweGQ4MDAgJiYgY29kZSA8PSAweGRiZmYpIHJldHVybiBjaGFyICsgdGhpcy5fX2xpc3RfX1t0aGlzLl9fbmV4dEluZGV4X18rK107XG5cdFx0cmV0dXJuIGNoYXI7XG5cdH0pXG59KTtcbmRlZmluZVByb3BlcnR5KFN0cmluZ0l0ZXJhdG9yLnByb3RvdHlwZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCBkKFwiY1wiLCBcIlN0cmluZyBJdGVyYXRvclwiKSk7XG5cblxuLyoqKi8gfSksXG4vKiA4NCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgc2V0UHJvdG90eXBlT2YgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG4gICwgY29udGFpbnMgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKVxuICAsIGQgICAgICAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKVxuICAsIEl0ZXJhdG9yICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMilcbiAgLCB0b1N0cmluZ1RhZ1N5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oMikudG9TdHJpbmdUYWdcblxuICAsIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5XG4gICwgU2V0SXRlcmF0b3I7XG5cblNldEl0ZXJhdG9yID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2V0LCBraW5kKSB7XG5cdGlmICghKHRoaXMgaW5zdGFuY2VvZiBTZXRJdGVyYXRvcikpIHJldHVybiBuZXcgU2V0SXRlcmF0b3Ioc2V0LCBraW5kKTtcblx0SXRlcmF0b3IuY2FsbCh0aGlzLCBzZXQuX19zZXREYXRhX18sIHNldCk7XG5cdGlmICgha2luZCkga2luZCA9ICd2YWx1ZSc7XG5cdGVsc2UgaWYgKGNvbnRhaW5zLmNhbGwoa2luZCwgJ2tleSt2YWx1ZScpKSBraW5kID0gJ2tleSt2YWx1ZSc7XG5cdGVsc2Uga2luZCA9ICd2YWx1ZSc7XG5cdGRlZmluZVByb3BlcnR5KHRoaXMsICdfX2tpbmRfXycsIGQoJycsIGtpbmQpKTtcbn07XG5pZiAoc2V0UHJvdG90eXBlT2YpIHNldFByb3RvdHlwZU9mKFNldEl0ZXJhdG9yLCBJdGVyYXRvcik7XG5cblNldEl0ZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3IucHJvdG90eXBlLCB7XG5cdGNvbnN0cnVjdG9yOiBkKFNldEl0ZXJhdG9yKSxcblx0X3Jlc29sdmU6IGQoZnVuY3Rpb24gKGkpIHtcblx0XHRpZiAodGhpcy5fX2tpbmRfXyA9PT0gJ3ZhbHVlJykgcmV0dXJuIHRoaXMuX19saXN0X19baV07XG5cdFx0cmV0dXJuIFt0aGlzLl9fbGlzdF9fW2ldLCB0aGlzLl9fbGlzdF9fW2ldXTtcblx0fSksXG5cdHRvU3RyaW5nOiBkKGZ1bmN0aW9uICgpIHsgcmV0dXJuICdbb2JqZWN0IFNldCBJdGVyYXRvcl0nOyB9KVxufSk7XG5kZWZpbmVQcm9wZXJ0eShTZXRJdGVyYXRvci5wcm90b3R5cGUsIHRvU3RyaW5nVGFnU3ltYm9sLCBkKCdjJywgJ1NldCBJdGVyYXRvcicpKTtcblxuXG4vKioqLyB9KSxcbi8qIDg1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLy8gRXhwb3J0cyB0cnVlIGlmIGVudmlyb25tZW50IHByb3ZpZGVzIG5hdGl2ZSBgU2V0YCBpbXBsZW1lbnRhdGlvbixcbi8vIHdoYXRldmVyIHRoYXQgaXMuXG5cblxuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbiAoKSB7XG5cdGlmICh0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJykgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChTZXQucHJvdG90eXBlKSA9PT0gJ1tvYmplY3QgU2V0XScpO1xufSgpKTtcblxuXG4vKioqLyB9KSxcbi8qIDg2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbi8qXG5cdHBzZXVkbyBzZWxlY3RvcnNcblxuXHQtLS1cblxuXHR0aGV5IGFyZSBhdmFpbGFibGUgaW4gdHdvIGZvcm1zOlxuXHQqIGZpbHRlcnMgY2FsbGVkIHdoZW4gdGhlIHNlbGVjdG9yXG5cdCAgaXMgY29tcGlsZWQgYW5kIHJldHVybiBhIGZ1bmN0aW9uXG5cdCAgdGhhdCBuZWVkcyB0byByZXR1cm4gbmV4dCgpXG5cdCogcHNldWRvcyBnZXQgY2FsbGVkIG9uIGV4ZWN1dGlvblxuXHQgIHRoZXkgbmVlZCB0byByZXR1cm4gYSBib29sZWFuXG4qL1xuXG52YXIgZ2V0TkNoZWNrICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg3KSxcblx0QmFzZUZ1bmNzICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpLFxuXHRhdHRyaWJ1dGVzRmFjdG9yeSA9IF9fd2VicGFja19yZXF1aXJlX18oMjMpLFxuXHR0cnVlRnVuYyAgICAgICAgICA9IEJhc2VGdW5jcy50cnVlRnVuYyxcblx0ZmFsc2VGdW5jICAgICAgICAgPSBCYXNlRnVuY3MuZmFsc2VGdW5jO1xuXG5mdW5jdGlvbiBmaWx0ZXJzRmFjdG9yeShhZGFwdGVyKXtcblx0dmFyIGF0dHJpYnV0ZXMgID0gYXR0cmlidXRlc0ZhY3RvcnkoYWRhcHRlciksXG5cdFx0Y2hlY2tBdHRyaWIgPSBhdHRyaWJ1dGVzLnJ1bGVzLmVxdWFscztcblxuXHQvL2hlbHBlciBtZXRob2RzXG5cdGZ1bmN0aW9uIGVxdWFscyhhLCBiKXtcblx0XHRpZih0eXBlb2YgYWRhcHRlci5lcXVhbHMgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGFkYXB0ZXIuZXF1YWxzKGEsIGIpO1xuXG5cdFx0cmV0dXJuIGEgPT09IGI7XG5cdH1cblxuXHRmdW5jdGlvbiBnZXRBdHRyaWJGdW5jKG5hbWUsIHZhbHVlKXtcblx0XHR2YXIgZGF0YSA9IHtuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWV9O1xuXHRcdHJldHVybiBmdW5jdGlvbiBhdHRyaWJGdW5jKG5leHQpe1xuXHRcdFx0cmV0dXJuIGNoZWNrQXR0cmliKG5leHQsIGRhdGEpO1xuXHRcdH07XG5cdH1cblxuXHRmdW5jdGlvbiBnZXRDaGlsZEZ1bmMobmV4dCl7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0cmV0dXJuICEhYWRhcHRlci5nZXRQYXJlbnQoZWxlbSkgJiYgbmV4dChlbGVtKTtcblx0XHR9O1xuXHR9XG5cblx0dmFyIGZpbHRlcnMgPSB7XG5cdFx0Y29udGFpbnM6IGZ1bmN0aW9uKG5leHQsIHRleHQpe1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGNvbnRhaW5zKGVsZW0pe1xuXHRcdFx0XHRyZXR1cm4gbmV4dChlbGVtKSAmJiBhZGFwdGVyLmdldFRleHQoZWxlbSkuaW5kZXhPZih0ZXh0KSA+PSAwO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGljb250YWluczogZnVuY3Rpb24obmV4dCwgdGV4dCl7XG5cdFx0XHR2YXIgaXRleHQgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gaWNvbnRhaW5zKGVsZW0pe1xuXHRcdFx0XHRyZXR1cm4gbmV4dChlbGVtKSAmJlxuXHRcdFx0XHRcdGFkYXB0ZXIuZ2V0VGV4dChlbGVtKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoaXRleHQpID49IDA7XG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHQvL2xvY2F0aW9uIHNwZWNpZmljIG1ldGhvZHNcblx0XHRcIm50aC1jaGlsZFwiOiBmdW5jdGlvbihuZXh0LCBydWxlKXtcblx0XHRcdHZhciBmdW5jID0gZ2V0TkNoZWNrKHJ1bGUpO1xuXG5cdFx0XHRpZihmdW5jID09PSBmYWxzZUZ1bmMpIHJldHVybiBmdW5jO1xuXHRcdFx0aWYoZnVuYyA9PT0gdHJ1ZUZ1bmMpICByZXR1cm4gZ2V0Q2hpbGRGdW5jKG5leHQpO1xuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gbnRoQ2hpbGQoZWxlbSl7XG5cdFx0XHRcdHZhciBzaWJsaW5ncyA9IGFkYXB0ZXIuZ2V0U2libGluZ3MoZWxlbSk7XG5cblx0XHRcdFx0Zm9yKHZhciBpID0gMCwgcG9zID0gMDsgaSA8IHNpYmxpbmdzLmxlbmd0aDsgaSsrKXtcblx0XHRcdFx0XHRpZihhZGFwdGVyLmlzVGFnKHNpYmxpbmdzW2ldKSl7XG5cdFx0XHRcdFx0XHRpZihzaWJsaW5nc1tpXSA9PT0gZWxlbSkgYnJlYWs7XG5cdFx0XHRcdFx0XHRlbHNlIHBvcysrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBmdW5jKHBvcykgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRcIm50aC1sYXN0LWNoaWxkXCI6IGZ1bmN0aW9uKG5leHQsIHJ1bGUpe1xuXHRcdFx0dmFyIGZ1bmMgPSBnZXROQ2hlY2socnVsZSk7XG5cblx0XHRcdGlmKGZ1bmMgPT09IGZhbHNlRnVuYykgcmV0dXJuIGZ1bmM7XG5cdFx0XHRpZihmdW5jID09PSB0cnVlRnVuYykgIHJldHVybiBnZXRDaGlsZEZ1bmMobmV4dCk7XG5cblx0XHRcdHJldHVybiBmdW5jdGlvbiBudGhMYXN0Q2hpbGQoZWxlbSl7XG5cdFx0XHRcdHZhciBzaWJsaW5ncyA9IGFkYXB0ZXIuZ2V0U2libGluZ3MoZWxlbSk7XG5cblx0XHRcdFx0Zm9yKHZhciBwb3MgPSAwLCBpID0gc2libGluZ3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pe1xuXHRcdFx0XHRcdGlmKGFkYXB0ZXIuaXNUYWcoc2libGluZ3NbaV0pKXtcblx0XHRcdFx0XHRcdGlmKHNpYmxpbmdzW2ldID09PSBlbGVtKSBicmVhaztcblx0XHRcdFx0XHRcdGVsc2UgcG9zKys7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGZ1bmMocG9zKSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdFwibnRoLW9mLXR5cGVcIjogZnVuY3Rpb24obmV4dCwgcnVsZSl7XG5cdFx0XHR2YXIgZnVuYyA9IGdldE5DaGVjayhydWxlKTtcblxuXHRcdFx0aWYoZnVuYyA9PT0gZmFsc2VGdW5jKSByZXR1cm4gZnVuYztcblx0XHRcdGlmKGZ1bmMgPT09IHRydWVGdW5jKSAgcmV0dXJuIGdldENoaWxkRnVuYyhuZXh0KTtcblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIG50aE9mVHlwZShlbGVtKXtcblx0XHRcdFx0dmFyIHNpYmxpbmdzID0gYWRhcHRlci5nZXRTaWJsaW5ncyhlbGVtKTtcblxuXHRcdFx0XHRmb3IodmFyIHBvcyA9IDAsIGkgPSAwOyBpIDwgc2libGluZ3MubGVuZ3RoOyBpKyspe1xuXHRcdFx0XHRcdGlmKGFkYXB0ZXIuaXNUYWcoc2libGluZ3NbaV0pKXtcblx0XHRcdFx0XHRcdGlmKHNpYmxpbmdzW2ldID09PSBlbGVtKSBicmVhaztcblx0XHRcdFx0XHRcdGlmKGFkYXB0ZXIuZ2V0TmFtZShzaWJsaW5nc1tpXSkgPT09IGFkYXB0ZXIuZ2V0TmFtZShlbGVtKSkgcG9zKys7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGZ1bmMocG9zKSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdFwibnRoLWxhc3Qtb2YtdHlwZVwiOiBmdW5jdGlvbihuZXh0LCBydWxlKXtcblx0XHRcdHZhciBmdW5jID0gZ2V0TkNoZWNrKHJ1bGUpO1xuXG5cdFx0XHRpZihmdW5jID09PSBmYWxzZUZ1bmMpIHJldHVybiBmdW5jO1xuXHRcdFx0aWYoZnVuYyA9PT0gdHJ1ZUZ1bmMpICByZXR1cm4gZ2V0Q2hpbGRGdW5jKG5leHQpO1xuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gbnRoTGFzdE9mVHlwZShlbGVtKXtcblx0XHRcdFx0dmFyIHNpYmxpbmdzID0gYWRhcHRlci5nZXRTaWJsaW5ncyhlbGVtKTtcblxuXHRcdFx0XHRmb3IodmFyIHBvcyA9IDAsIGkgPSBzaWJsaW5ncy5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7XG5cdFx0XHRcdFx0aWYoYWRhcHRlci5pc1RhZyhzaWJsaW5nc1tpXSkpe1xuXHRcdFx0XHRcdFx0aWYoc2libGluZ3NbaV0gPT09IGVsZW0pIGJyZWFrO1xuXHRcdFx0XHRcdFx0aWYoYWRhcHRlci5nZXROYW1lKHNpYmxpbmdzW2ldKSA9PT0gYWRhcHRlci5nZXROYW1lKGVsZW0pKSBwb3MrKztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZnVuYyhwb3MpICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHQvL1RPRE8gZGV0ZXJtaW5lIHRoZSBhY3R1YWwgcm9vdCBlbGVtZW50XG5cdFx0cm9vdDogZnVuY3Rpb24obmV4dCl7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRcdHJldHVybiAhYWRhcHRlci5nZXRQYXJlbnQoZWxlbSkgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdHNjb3BlOiBmdW5jdGlvbihuZXh0LCBydWxlLCBvcHRpb25zLCBjb250ZXh0KXtcblx0XHRcdGlmKCFjb250ZXh0IHx8IGNvbnRleHQubGVuZ3RoID09PSAwKXtcblx0XHRcdFx0Ly9lcXVpdmFsZW50IHRvIDpyb290XG5cdFx0XHRcdHJldHVybiBmaWx0ZXJzLnJvb3QobmV4dCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmKGNvbnRleHQubGVuZ3RoID09PSAxKXtcblx0XHRcdFx0Ly9OT1RFOiBjYW4ndCBiZSB1bnBhY2tlZCwgYXMgOmhhcyB1c2VzIHRoaXMgZm9yIHNpZGUtZWZmZWN0c1xuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRcdFx0cmV0dXJuIGVxdWFscyhjb250ZXh0WzBdLCBlbGVtKSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0LmluZGV4T2YoZWxlbSkgPj0gMCAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0Ly9qUXVlcnkgZXh0ZW5zaW9ucyAob3RoZXJzIGZvbGxvdyBhcyBwc2V1ZG9zKVxuXHRcdGNoZWNrYm94OiBnZXRBdHRyaWJGdW5jKFwidHlwZVwiLCBcImNoZWNrYm94XCIpLFxuXHRcdGZpbGU6IGdldEF0dHJpYkZ1bmMoXCJ0eXBlXCIsIFwiZmlsZVwiKSxcblx0XHRwYXNzd29yZDogZ2V0QXR0cmliRnVuYyhcInR5cGVcIiwgXCJwYXNzd29yZFwiKSxcblx0XHRyYWRpbzogZ2V0QXR0cmliRnVuYyhcInR5cGVcIiwgXCJyYWRpb1wiKSxcblx0XHRyZXNldDogZ2V0QXR0cmliRnVuYyhcInR5cGVcIiwgXCJyZXNldFwiKSxcblx0XHRpbWFnZTogZ2V0QXR0cmliRnVuYyhcInR5cGVcIiwgXCJpbWFnZVwiKSxcblx0XHRzdWJtaXQ6IGdldEF0dHJpYkZ1bmMoXCJ0eXBlXCIsIFwic3VibWl0XCIpXG5cdH07XG5cdHJldHVybiBmaWx0ZXJzO1xufVxuXG5mdW5jdGlvbiBwc2V1ZG9zRmFjdG9yeShhZGFwdGVyKXtcblx0Ly9oZWxwZXIgbWV0aG9kc1xuXHRmdW5jdGlvbiBnZXRGaXJzdEVsZW1lbnQoZWxlbXMpe1xuXHRcdGZvcih2YXIgaSA9IDA7IGVsZW1zICYmIGkgPCBlbGVtcy5sZW5ndGg7IGkrKyl7XG5cdFx0XHRpZihhZGFwdGVyLmlzVGFnKGVsZW1zW2ldKSkgcmV0dXJuIGVsZW1zW2ldO1xuXHRcdH1cblx0fVxuXG5cdC8vd2hpbGUgZmlsdGVycyBhcmUgcHJlY29tcGlsZWQsIHBzZXVkb3MgZ2V0IGNhbGxlZCB3aGVuIHRoZXkgYXJlIG5lZWRlZFxuXHR2YXIgcHNldWRvcyA9IHtcblx0XHRlbXB0eTogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRyZXR1cm4gIWFkYXB0ZXIuZ2V0Q2hpbGRyZW4oZWxlbSkuc29tZShmdW5jdGlvbihlbGVtKXtcblx0XHRcdFx0cmV0dXJuIGFkYXB0ZXIuaXNUYWcoZWxlbSkgfHwgZWxlbS50eXBlID09PSBcInRleHRcIjtcblx0XHRcdH0pO1xuXHRcdH0sXG5cblx0XHRcImZpcnN0LWNoaWxkXCI6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0cmV0dXJuIGdldEZpcnN0RWxlbWVudChhZGFwdGVyLmdldFNpYmxpbmdzKGVsZW0pKSA9PT0gZWxlbTtcblx0XHR9LFxuXHRcdFwibGFzdC1jaGlsZFwiOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHZhciBzaWJsaW5ncyA9IGFkYXB0ZXIuZ2V0U2libGluZ3MoZWxlbSk7XG5cblx0XHRcdGZvcih2YXIgaSA9IHNpYmxpbmdzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXtcblx0XHRcdFx0aWYoc2libGluZ3NbaV0gPT09IGVsZW0pIHJldHVybiB0cnVlO1xuXHRcdFx0XHRpZihhZGFwdGVyLmlzVGFnKHNpYmxpbmdzW2ldKSkgYnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdFwiZmlyc3Qtb2YtdHlwZVwiOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHZhciBzaWJsaW5ncyA9IGFkYXB0ZXIuZ2V0U2libGluZ3MoZWxlbSk7XG5cblx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzaWJsaW5ncy5sZW5ndGg7IGkrKyl7XG5cdFx0XHRcdGlmKGFkYXB0ZXIuaXNUYWcoc2libGluZ3NbaV0pKXtcblx0XHRcdFx0XHRpZihzaWJsaW5nc1tpXSA9PT0gZWxlbSkgcmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0aWYoYWRhcHRlci5nZXROYW1lKHNpYmxpbmdzW2ldKSA9PT0gYWRhcHRlci5nZXROYW1lKGVsZW0pKSBicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblx0XHRcImxhc3Qtb2YtdHlwZVwiOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHZhciBzaWJsaW5ncyA9IGFkYXB0ZXIuZ2V0U2libGluZ3MoZWxlbSk7XG5cblx0XHRcdGZvcih2YXIgaSA9IHNpYmxpbmdzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXtcblx0XHRcdFx0aWYoYWRhcHRlci5pc1RhZyhzaWJsaW5nc1tpXSkpe1xuXHRcdFx0XHRcdGlmKHNpYmxpbmdzW2ldID09PSBlbGVtKSByZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRpZihhZGFwdGVyLmdldE5hbWUoc2libGluZ3NbaV0pID09PSBhZGFwdGVyLmdldE5hbWUoZWxlbSkpIGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdFwib25seS1vZi10eXBlXCI6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0dmFyIHNpYmxpbmdzID0gYWRhcHRlci5nZXRTaWJsaW5ncyhlbGVtKTtcblxuXHRcdFx0Zm9yKHZhciBpID0gMCwgaiA9IHNpYmxpbmdzLmxlbmd0aDsgaSA8IGo7IGkrKyl7XG5cdFx0XHRcdGlmKGFkYXB0ZXIuaXNUYWcoc2libGluZ3NbaV0pKXtcblx0XHRcdFx0XHRpZihzaWJsaW5nc1tpXSA9PT0gZWxlbSkgY29udGludWU7XG5cdFx0XHRcdFx0aWYoYWRhcHRlci5nZXROYW1lKHNpYmxpbmdzW2ldKSA9PT0gYWRhcHRlci5nZXROYW1lKGVsZW0pKSByZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblx0XHRcIm9ubHktY2hpbGRcIjogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHR2YXIgc2libGluZ3MgPSBhZGFwdGVyLmdldFNpYmxpbmdzKGVsZW0pO1xuXG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgc2libGluZ3MubGVuZ3RoOyBpKyspe1xuXHRcdFx0XHRpZihhZGFwdGVyLmlzVGFnKHNpYmxpbmdzW2ldKSAmJiBzaWJsaW5nc1tpXSAhPT0gZWxlbSkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0Ly86bWF0Y2hlcyhhLCBhcmVhLCBsaW5rKVtocmVmXVxuXHRcdGxpbms6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0cmV0dXJuIGFkYXB0ZXIuaGFzQXR0cmliKGVsZW0sIFwiaHJlZlwiKTtcblx0XHR9LFxuXHRcdHZpc2l0ZWQ6IGZhbHNlRnVuYywgLy9zZWVtcyB0byBiZSBhIHZhbGlkIGltcGxlbWVudGF0aW9uXG5cdFx0Ly9UT0RPOiA6YW55LWxpbmsgb25jZSB0aGUgbmFtZSBpcyBmaW5hbGl6ZWQgKGFzIGFuIGFsaWFzIG9mIDpsaW5rKVxuXG5cdFx0Ly9mb3Jtc1xuXHRcdC8vdG8gY29uc2lkZXI6IDp0YXJnZXRcblxuXHRcdC8vOm1hdGNoZXMoW3NlbGVjdGVkXSwgc2VsZWN0Om5vdChbbXVsdGlwbGVdKTpub3QoPiBvcHRpb25bc2VsZWN0ZWRdKSA+IG9wdGlvbjpmaXJzdC1vZi10eXBlKVxuXHRcdHNlbGVjdGVkOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdGlmKGFkYXB0ZXIuaGFzQXR0cmliKGVsZW0sIFwic2VsZWN0ZWRcIikpIHJldHVybiB0cnVlO1xuXHRcdFx0ZWxzZSBpZihhZGFwdGVyLmdldE5hbWUoZWxlbSkgIT09IFwib3B0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuXHRcdFx0Ly90aGUgZmlyc3QgPG9wdGlvbj4gaW4gYSA8c2VsZWN0PiBpcyBhbHNvIHNlbGVjdGVkXG5cdFx0XHR2YXIgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoZWxlbSk7XG5cblx0XHRcdGlmKFxuXHRcdFx0XHQhcGFyZW50IHx8XG5cdFx0XHRcdGFkYXB0ZXIuZ2V0TmFtZShwYXJlbnQpICE9PSBcInNlbGVjdFwiIHx8XG5cdFx0XHRcdGFkYXB0ZXIuaGFzQXR0cmliKHBhcmVudCwgXCJtdWx0aXBsZVwiKVxuXHRcdFx0KSByZXR1cm4gZmFsc2U7XG5cblx0XHRcdHZhciBzaWJsaW5ncyA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KSxcblx0XHRcdFx0c2F3RWxlbSAgPSBmYWxzZTtcblxuXHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IHNpYmxpbmdzLmxlbmd0aDsgaSsrKXtcblx0XHRcdFx0aWYoYWRhcHRlci5pc1RhZyhzaWJsaW5nc1tpXSkpe1xuXHRcdFx0XHRcdGlmKHNpYmxpbmdzW2ldID09PSBlbGVtKXtcblx0XHRcdFx0XHRcdHNhd0VsZW0gPSB0cnVlO1xuXHRcdFx0XHRcdH0gZWxzZSBpZighc2F3RWxlbSl7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fSBlbHNlIGlmKGFkYXB0ZXIuaGFzQXR0cmliKHNpYmxpbmdzW2ldLCBcInNlbGVjdGVkXCIpKXtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNhd0VsZW07XG5cdFx0fSxcblx0XHQvL2h0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NjcmlwdGluZy5odG1sI2Rpc2FibGVkLWVsZW1lbnRzXG5cdFx0Ly86bWF0Y2hlcyhcblx0XHQvLyAgOm1hdGNoZXMoYnV0dG9uLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgbWVudWl0ZW0sIG9wdGdyb3VwLCBvcHRpb24pW2Rpc2FibGVkXSxcblx0XHQvLyAgb3B0Z3JvdXBbZGlzYWJsZWRdID4gb3B0aW9uKSxcblx0XHQvLyBmaWVsZHNldFtkaXNhYmxlZF0gKiAvL1RPRE8gbm90IGNoaWxkIG9mIGZpcnN0IDxsZWdlbmQ+XG5cdFx0Ly8pXG5cdFx0ZGlzYWJsZWQ6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0cmV0dXJuIGFkYXB0ZXIuaGFzQXR0cmliKGVsZW0sIFwiZGlzYWJsZWRcIik7XG5cdFx0fSxcblx0XHRlbmFibGVkOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHJldHVybiAhYWRhcHRlci5oYXNBdHRyaWIoZWxlbSwgXCJkaXNhYmxlZFwiKTtcblx0XHR9LFxuXHRcdC8vOm1hdGNoZXMoOm1hdGNoZXMoOnJhZGlvLCA6Y2hlY2tib3gpW2NoZWNrZWRdLCA6c2VsZWN0ZWQpIChUT0RPIG1lbnVpdGVtKVxuXHRcdGNoZWNrZWQ6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0cmV0dXJuIGFkYXB0ZXIuaGFzQXR0cmliKGVsZW0sIFwiY2hlY2tlZFwiKSB8fCBwc2V1ZG9zLnNlbGVjdGVkKGVsZW0pO1xuXHRcdH0sXG5cdFx0Ly86bWF0Y2hlcyhpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSlbcmVxdWlyZWRdXG5cdFx0cmVxdWlyZWQ6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0cmV0dXJuIGFkYXB0ZXIuaGFzQXR0cmliKGVsZW0sIFwicmVxdWlyZWRcIik7XG5cdFx0fSxcblx0XHQvLzptYXRjaGVzKGlucHV0LCBzZWxlY3QsIHRleHRhcmVhKTpub3QoW3JlcXVpcmVkXSlcblx0XHRvcHRpb25hbDogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRyZXR1cm4gIWFkYXB0ZXIuaGFzQXR0cmliKGVsZW0sIFwicmVxdWlyZWRcIik7XG5cdFx0fSxcblxuXHRcdC8valF1ZXJ5IGV4dGVuc2lvbnNcblxuXHRcdC8vOm5vdCg6ZW1wdHkpXG5cdFx0cGFyZW50OiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHJldHVybiAhcHNldWRvcy5lbXB0eShlbGVtKTtcblx0XHR9LFxuXHRcdC8vOm1hdGNoZXMoaDEsIGgyLCBoMywgaDQsIGg1LCBoNilcblx0XHRoZWFkZXI6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0dmFyIG5hbWUgPSBhZGFwdGVyLmdldE5hbWUoZWxlbSk7XG5cdFx0XHRyZXR1cm4gbmFtZSA9PT0gXCJoMVwiIHx8XG5cdFx0XHRcdFx0bmFtZSA9PT0gXCJoMlwiIHx8XG5cdFx0XHRcdFx0bmFtZSA9PT0gXCJoM1wiIHx8XG5cdFx0XHRcdFx0bmFtZSA9PT0gXCJoNFwiIHx8XG5cdFx0XHRcdFx0bmFtZSA9PT0gXCJoNVwiIHx8XG5cdFx0XHRcdFx0bmFtZSA9PT0gXCJoNlwiO1xuXHRcdH0sXG5cblx0XHQvLzptYXRjaGVzKGJ1dHRvbiwgaW5wdXRbdHlwZT1idXR0b25dKVxuXHRcdGJ1dHRvbjogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHR2YXIgbmFtZSA9IGFkYXB0ZXIuZ2V0TmFtZShlbGVtKTtcblx0XHRcdHJldHVybiBuYW1lID09PSBcImJ1dHRvblwiIHx8XG5cdFx0XHRcdFx0bmFtZSA9PT0gXCJpbnB1dFwiICYmXG5cdFx0XHRcdFx0YWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBcInR5cGVcIikgPT09IFwiYnV0dG9uXCI7XG5cdFx0fSxcblx0XHQvLzptYXRjaGVzKGlucHV0LCB0ZXh0YXJlYSwgc2VsZWN0LCBidXR0b24pXG5cdFx0aW5wdXQ6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0dmFyIG5hbWUgPSBhZGFwdGVyLmdldE5hbWUoZWxlbSk7XG5cdFx0XHRyZXR1cm4gbmFtZSA9PT0gXCJpbnB1dFwiIHx8XG5cdFx0XHRcdFx0bmFtZSA9PT0gXCJ0ZXh0YXJlYVwiIHx8XG5cdFx0XHRcdFx0bmFtZSA9PT0gXCJzZWxlY3RcIiB8fFxuXHRcdFx0XHRcdG5hbWUgPT09IFwiYnV0dG9uXCI7XG5cdFx0fSxcblx0XHQvL2lucHV0Om1hdGNoZXMoOm5vdChbdHlwZSE9JyddKSwgW3R5cGU9J3RleHQnIGldKVxuXHRcdHRleHQ6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0dmFyIGF0dHI7XG5cdFx0XHRyZXR1cm4gYWRhcHRlci5nZXROYW1lKGVsZW0pID09PSBcImlucHV0XCIgJiYgKFxuXHRcdFx0XHQhKGF0dHIgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIFwidHlwZVwiKSkgfHxcblx0XHRcdFx0YXR0ci50b0xvd2VyQ2FzZSgpID09PSBcInRleHRcIlxuXHRcdFx0KTtcblx0XHR9XG5cdH07XG5cblx0cmV0dXJuIHBzZXVkb3M7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeUFyZ3MoZnVuYywgbmFtZSwgc3Vic2VsZWN0KXtcblx0aWYoc3Vic2VsZWN0ID09PSBudWxsKXtcblx0XHRpZihmdW5jLmxlbmd0aCA+IDEgJiYgbmFtZSAhPT0gXCJzY29wZVwiKXtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInBzZXVkby1zZWxlY3RvciA6XCIgKyBuYW1lICsgXCIgcmVxdWlyZXMgYW4gYXJndW1lbnRcIik7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGlmKGZ1bmMubGVuZ3RoID09PSAxKXtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInBzZXVkby1zZWxlY3RvciA6XCIgKyBuYW1lICsgXCIgZG9lc24ndCBoYXZlIGFueSBhcmd1bWVudHNcIik7XG5cdFx0fVxuXHR9XG59XG5cbi8vRklYTUUgdGhpcyBmZWVscyBoYWNreVxudmFyIHJlX0NTUzMgPSAvXig/Oig/Om50aHxsYXN0fGZpcnN0fG9ubHkpLSg/OmNoaWxkfG9mLXR5cGUpfHJvb3R8ZW1wdHl8KD86ZW58ZGlzKWFibGVkfGNoZWNrZWR8bm90KSQvO1xuXG5mdW5jdGlvbiBmYWN0b3J5KGFkYXB0ZXIpe1xuXHR2YXIgcHNldWRvcyA9IHBzZXVkb3NGYWN0b3J5KGFkYXB0ZXIpO1xuXHR2YXIgZmlsdGVycyA9IGZpbHRlcnNGYWN0b3J5KGFkYXB0ZXIpO1xuXG5cdHJldHVybiB7XG5cdFx0Y29tcGlsZTogZnVuY3Rpb24obmV4dCwgZGF0YSwgb3B0aW9ucywgY29udGV4dCl7XG5cdFx0XHR2YXIgbmFtZSA9IGRhdGEubmFtZSxcblx0XHRcdFx0c3Vic2VsZWN0ID0gZGF0YS5kYXRhO1xuXG5cdFx0XHRpZihvcHRpb25zICYmIG9wdGlvbnMuc3RyaWN0ICYmICFyZV9DU1MzLnRlc3QobmFtZSkpe1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCI6XCIgKyBuYW1lICsgXCIgaXNuJ3QgcGFydCBvZiBDU1MzXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZih0eXBlb2YgZmlsdGVyc1tuYW1lXSA9PT0gXCJmdW5jdGlvblwiKXtcblx0XHRcdFx0dmVyaWZ5QXJncyhmaWx0ZXJzW25hbWVdLCBuYW1lLCAgc3Vic2VsZWN0KTtcblx0XHRcdFx0cmV0dXJuIGZpbHRlcnNbbmFtZV0obmV4dCwgc3Vic2VsZWN0LCBvcHRpb25zLCBjb250ZXh0KTtcblx0XHRcdH0gZWxzZSBpZih0eXBlb2YgcHNldWRvc1tuYW1lXSA9PT0gXCJmdW5jdGlvblwiKXtcblx0XHRcdFx0dmFyIGZ1bmMgPSBwc2V1ZG9zW25hbWVdO1xuXHRcdFx0XHR2ZXJpZnlBcmdzKGZ1bmMsIG5hbWUsIHN1YnNlbGVjdCk7XG5cblx0XHRcdFx0aWYobmV4dCA9PT0gdHJ1ZUZ1bmMpIHJldHVybiBmdW5jO1xuXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiBwc2V1ZG9BcmdzKGVsZW0pe1xuXHRcdFx0XHRcdHJldHVybiBmdW5jKGVsZW0sIHN1YnNlbGVjdCkgJiYgbmV4dChlbGVtKTtcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInVubWF0Y2hlZCBwc2V1ZG8tY2xhc3MgOlwiICsgbmFtZSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRmaWx0ZXJzOiBmaWx0ZXJzLFxuXHRcdHBzZXVkb3M6IHBzZXVkb3Ncblx0fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5O1xuXG5cbi8qKiovIH0pLFxuLyogODcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIHBhcnNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4OCksXG4gICAgY29tcGlsZSA9IF9fd2VicGFja19yZXF1aXJlX18oODkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG50aENoZWNrKGZvcm11bGEpe1xuXHRyZXR1cm4gY29tcGlsZShwYXJzZShmb3JtdWxhKSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xubW9kdWxlLmV4cG9ydHMuY29tcGlsZSA9IGNvbXBpbGU7XG5cbi8qKiovIH0pLFxuLyogODggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZTtcblxuLy9mb2xsb3dpbmcgaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zZWxlY3RvcnMvI250aC1jaGlsZC1wc2V1ZG9cblxuLy9bIFsnLSd8JysnXT8gSU5URUdFUj8ge059IFsgUyogWyctJ3wnKyddIFMqIElOVEVHRVIgXT9cbnZhciByZV9udGhFbGVtZW50ID0gL14oWytcXC1dP1xcZCpuKT9cXHMqKD86KFsrXFwtXT8pXFxzKihcXGQrKSk/JC87XG5cbi8qXG5cdHBhcnNlcyBhIG50aC1jaGVjayBmb3JtdWxhLCByZXR1cm5zIGFuIGFycmF5IG9mIHR3byBudW1iZXJzXG4qL1xuZnVuY3Rpb24gcGFyc2UoZm9ybXVsYSl7XG5cdGZvcm11bGEgPSBmb3JtdWxhLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG5cdGlmKGZvcm11bGEgPT09IFwiZXZlblwiKXtcblx0XHRyZXR1cm4gWzIsIDBdO1xuXHR9IGVsc2UgaWYoZm9ybXVsYSA9PT0gXCJvZGRcIil7XG5cdFx0cmV0dXJuIFsyLCAxXTtcblx0fSBlbHNlIHtcblx0XHR2YXIgcGFyc2VkID0gZm9ybXVsYS5tYXRjaChyZV9udGhFbGVtZW50KTtcblxuXHRcdGlmKCFwYXJzZWQpe1xuXHRcdFx0dGhyb3cgbmV3IFN5bnRheEVycm9yKFwibi10aCBydWxlIGNvdWxkbid0IGJlIHBhcnNlZCAoJ1wiICsgZm9ybXVsYSArIFwiJylcIik7XG5cdFx0fVxuXG5cdFx0dmFyIGE7XG5cblx0XHRpZihwYXJzZWRbMV0pe1xuXHRcdFx0YSA9IHBhcnNlSW50KHBhcnNlZFsxXSwgMTApO1xuXHRcdFx0aWYoaXNOYU4oYSkpe1xuXHRcdFx0XHRpZihwYXJzZWRbMV0uY2hhckF0KDApID09PSBcIi1cIikgYSA9IC0xO1xuXHRcdFx0XHRlbHNlIGEgPSAxO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBhID0gMDtcblxuXHRcdHJldHVybiBbXG5cdFx0XHRhLFxuXHRcdFx0cGFyc2VkWzNdID8gcGFyc2VJbnQoKHBhcnNlZFsyXSB8fCBcIlwiKSArIHBhcnNlZFszXSwgMTApIDogMFxuXHRcdF07XG5cdH1cbn1cblxuXG4vKioqLyB9KSxcbi8qIDg5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGlsZTtcblxudmFyIEJhc2VGdW5jcyA9IF9fd2VicGFja19yZXF1aXJlX18oNSksXG4gICAgdHJ1ZUZ1bmMgID0gQmFzZUZ1bmNzLnRydWVGdW5jLFxuICAgIGZhbHNlRnVuYyA9IEJhc2VGdW5jcy5mYWxzZUZ1bmM7XG5cbi8qXG5cdHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiBhbiBlbGVtZW50cyBpbmRleCBtYXRjaGVzIHRoZSBnaXZlbiBydWxlXG5cdGhpZ2hseSBvcHRpbWl6ZWQgdG8gcmV0dXJuIHRoZSBmYXN0ZXN0IHNvbHV0aW9uXG4qL1xuZnVuY3Rpb24gY29tcGlsZShwYXJzZWQpe1xuXHR2YXIgYSA9IHBhcnNlZFswXSxcblx0ICAgIGIgPSBwYXJzZWRbMV0gLSAxO1xuXG5cdC8vd2hlbiBiIDw9IDAsIGEqbiB3b24ndCBiZSBwb3NzaWJsZSBmb3IgYW55IG1hdGNoZXMgd2hlbiBhIDwgMFxuXHQvL2Jlc2lkZXMsIHRoZSBzcGVjaWZpY2F0aW9uIHNheXMgdGhhdCBubyBlbGVtZW50IGlzIG1hdGNoZWQgd2hlbiBhIGFuZCBiIGFyZSAwXG5cdGlmKGIgPCAwICYmIGEgPD0gMCkgcmV0dXJuIGZhbHNlRnVuYztcblxuXHQvL3doZW4gYSBpcyBpbiB0aGUgcmFuZ2UgLTEuLjEsIGl0IG1hdGNoZXMgYW55IGVsZW1lbnQgKHNvIG9ubHkgYiBpcyBjaGVja2VkKVxuXHRpZihhID09PS0xKSByZXR1cm4gZnVuY3Rpb24ocG9zKXsgcmV0dXJuIHBvcyA8PSBiOyB9O1xuXHRpZihhID09PSAwKSByZXR1cm4gZnVuY3Rpb24ocG9zKXsgcmV0dXJuIHBvcyA9PT0gYjsgfTtcblx0Ly93aGVuIGIgPD0gMCBhbmQgYSA9PT0gMSwgdGhleSBtYXRjaCBhbnkgZWxlbWVudFxuXHRpZihhID09PSAxKSByZXR1cm4gYiA8IDAgPyB0cnVlRnVuYyA6IGZ1bmN0aW9uKHBvcyl7IHJldHVybiBwb3MgPj0gYjsgfTtcblxuXHQvL3doZW4gYSA+IDAsIG1vZHVsbyBjYW4gYmUgdXNlZCB0byBjaGVjayBpZiB0aGVyZSBpcyBhIG1hdGNoXG5cdHZhciBiTW9kID0gYiAlIGE7XG5cdGlmKGJNb2QgPCAwKSBiTW9kICs9IGE7XG5cblx0aWYoYSA+IDEpe1xuXHRcdHJldHVybiBmdW5jdGlvbihwb3Mpe1xuXHRcdFx0cmV0dXJuIHBvcyA+PSBiICYmIHBvcyAlIGEgPT09IGJNb2Q7XG5cdFx0fTtcblx0fVxuXG5cdGEgKj0gLTE7IC8vbWFrZSBgYWAgcG9zaXRpdmVcblxuXHRyZXR1cm4gZnVuY3Rpb24ocG9zKXtcblx0XHRyZXR1cm4gcG9zIDw9IGIgJiYgcG9zICUgYSA9PT0gYk1vZDtcblx0fTtcbn1cblxuLyoqKi8gfSlcbi8qKioqKiovIF0pO1xufSk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY3NzLXNlbGVjdC11bWQvZGlzdC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvY3NzLXNlbGVjdC11bWQvZGlzdC9pbmRleC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCIvKiFcblxuIGRpZmYgdjMuNC4wXG5cblNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSlcblxuQ29weXJpZ2h0IChjKSAyMDA5LTIwMTUsIEtldmluIERlY2tlciA8a3BkZWNrZXJAZ21haWwuY29tPlxuXG5BbGwgcmlnaHRzIHJlc2VydmVkLlxuXG5SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sXG5hcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZVxuICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlXG4gIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmVcbiAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZVxuICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXJcbiAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEtldmluIERlY2tlciBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzXG4gIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3JcbiAgd3JpdHRlbiBwZXJtaXNzaW9uLlxuXG5USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1JcbklNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1JcbkNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUxcbkRBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbkRBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSXG5JTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUXG5PRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG5AbGljZW5zZVxuKi9cbihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIkpzRGlmZlwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJKc0RpZmZcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fSxcbi8qKioqKiovIFx0XHRcdGlkOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGxvYWRlZDogZmFsc2Vcbi8qKioqKiovIFx0XHR9O1xuXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuXG5cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8ndXNlIHN0cmljdCc7XG5cblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0cy5jYW5vbmljYWxpemUgPSBleHBvcnRzLmNvbnZlcnRDaGFuZ2VzVG9YTUwgPSBleHBvcnRzLmNvbnZlcnRDaGFuZ2VzVG9ETVAgPSBleHBvcnRzLm1lcmdlID0gZXhwb3J0cy5wYXJzZVBhdGNoID0gZXhwb3J0cy5hcHBseVBhdGNoZXMgPSBleHBvcnRzLmFwcGx5UGF0Y2ggPSBleHBvcnRzLmNyZWF0ZVBhdGNoID0gZXhwb3J0cy5jcmVhdGVUd29GaWxlc1BhdGNoID0gZXhwb3J0cy5zdHJ1Y3R1cmVkUGF0Y2ggPSBleHBvcnRzLmRpZmZBcnJheXMgPSBleHBvcnRzLmRpZmZKc29uID0gZXhwb3J0cy5kaWZmQ3NzID0gZXhwb3J0cy5kaWZmU2VudGVuY2VzID0gZXhwb3J0cy5kaWZmVHJpbW1lZExpbmVzID0gZXhwb3J0cy5kaWZmTGluZXMgPSBleHBvcnRzLmRpZmZXb3Jkc1dpdGhTcGFjZSA9IGV4cG9ydHMuZGlmZldvcmRzID0gZXhwb3J0cy5kaWZmQ2hhcnMgPSBleHBvcnRzLkRpZmYgPSB1bmRlZmluZWQ7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgZW5kKi92YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19iYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9iYXNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Jhc2UpO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIGVuZCovdmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fY2hhcmFjdGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL193b3JkID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19saW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19zZW50ZW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oNikgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fY3NzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19qc29uID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19hcnJheSA9IF9fd2VicGFja19yZXF1aXJlX18oOSkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fYXBwbHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19wYXJzZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX21lcmdlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMykgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fZG1wID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNikgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9feG1sID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNykgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuXHQvKiBTZWUgTElDRU5TRSBmaWxlIGZvciB0ZXJtcyBvZiB1c2UgKi9cblxuXHQvKlxuXHQgKiBUZXh0IGRpZmYgaW1wbGVtZW50YXRpb24uXG5cdCAqXG5cdCAqIFRoaXMgbGlicmFyeSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIEFQSVM6XG5cdCAqIEpzRGlmZi5kaWZmQ2hhcnM6IENoYXJhY3RlciBieSBjaGFyYWN0ZXIgZGlmZlxuXHQgKiBKc0RpZmYuZGlmZldvcmRzOiBXb3JkIChhcyBkZWZpbmVkIGJ5IFxcYiByZWdleCkgZGlmZiB3aGljaCBpZ25vcmVzIHdoaXRlc3BhY2Vcblx0ICogSnNEaWZmLmRpZmZMaW5lczogTGluZSBiYXNlZCBkaWZmXG5cdCAqXG5cdCAqIEpzRGlmZi5kaWZmQ3NzOiBEaWZmIHRhcmdldGVkIGF0IENTUyBjb250ZW50XG5cdCAqXG5cdCAqIFRoZXNlIG1ldGhvZHMgYXJlIGJhc2VkIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBwcm9wb3NlZCBpblxuXHQgKiBcIkFuIE8oTkQpIERpZmZlcmVuY2UgQWxnb3JpdGhtIGFuZCBpdHMgVmFyaWF0aW9uc1wiIChNeWVycywgMTk4NikuXG5cdCAqIGh0dHA6Ly9jaXRlc2VlcnguaXN0LnBzdS5lZHUvdmlld2RvYy9zdW1tYXJ5P2RvaT0xMC4xLjEuNC42OTI3XG5cdCAqL1xuXHRleHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL0RpZmYgPSBfYmFzZTJbJ2RlZmF1bHQnXTtcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZkNoYXJzID0gX2NoYXJhY3Rlci5kaWZmQ2hhcnM7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2RpZmZXb3JkcyA9IF93b3JkLmRpZmZXb3Jkcztcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZldvcmRzV2l0aFNwYWNlID0gX3dvcmQuZGlmZldvcmRzV2l0aFNwYWNlO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9kaWZmTGluZXMgPSBfbGluZS5kaWZmTGluZXM7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2RpZmZUcmltbWVkTGluZXMgPSBfbGluZS5kaWZmVHJpbW1lZExpbmVzO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9kaWZmU2VudGVuY2VzID0gX3NlbnRlbmNlLmRpZmZTZW50ZW5jZXM7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2RpZmZDc3MgPSBfY3NzLmRpZmZDc3M7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2RpZmZKc29uID0gX2pzb24uZGlmZkpzb247XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2RpZmZBcnJheXMgPSBfYXJyYXkuZGlmZkFycmF5cztcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovc3RydWN0dXJlZFBhdGNoID0gX2NyZWF0ZS5zdHJ1Y3R1cmVkUGF0Y2g7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2NyZWF0ZVR3b0ZpbGVzUGF0Y2ggPSBfY3JlYXRlLmNyZWF0ZVR3b0ZpbGVzUGF0Y2g7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2NyZWF0ZVBhdGNoID0gX2NyZWF0ZS5jcmVhdGVQYXRjaDtcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovYXBwbHlQYXRjaCA9IF9hcHBseS5hcHBseVBhdGNoO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9hcHBseVBhdGNoZXMgPSBfYXBwbHkuYXBwbHlQYXRjaGVzO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9wYXJzZVBhdGNoID0gX3BhcnNlLnBhcnNlUGF0Y2g7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL21lcmdlID0gX21lcmdlLm1lcmdlO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jb252ZXJ0Q2hhbmdlc1RvRE1QID0gX2RtcC5jb252ZXJ0Q2hhbmdlc1RvRE1QO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jb252ZXJ0Q2hhbmdlc1RvWE1MID0gX3htbC5jb252ZXJ0Q2hhbmdlc1RvWE1MO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jYW5vbmljYWxpemUgPSBfanNvbi5jYW5vbmljYWxpemU7XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMM055WXk5cGJtUmxlQzVxY3lKZExDSnVZVzFsY3lJNld5SkVhV1ptSWl3aVpHbG1aa05vWVhKeklpd2laR2xtWmxkdmNtUnpJaXdpWkdsbVpsZHZjbVJ6VjJsMGFGTndZV05sSWl3aVpHbG1aa3hwYm1Weklpd2laR2xtWmxSeWFXMXRaV1JNYVc1bGN5SXNJbVJwWm1aVFpXNTBaVzVqWlhNaUxDSmthV1ptUTNOeklpd2laR2xtWmtwemIyNGlMQ0prYVdabVFYSnlZWGx6SWl3aWMzUnlkV04wZFhKbFpGQmhkR05vSWl3aVkzSmxZWFJsVkhkdlJtbHNaWE5RWVhSamFDSXNJbU55WldGMFpWQmhkR05vSWl3aVlYQndiSGxRWVhSamFDSXNJbUZ3Y0d4NVVHRjBZMmhsY3lJc0luQmhjbk5sVUdGMFkyZ2lMQ0p0WlhKblpTSXNJbU52Ym5abGNuUkRhR0Z1WjJWelZHOUVUVkFpTENKamIyNTJaWEowUTJoaGJtZGxjMVJ2V0UxTUlpd2lZMkZ1YjI1cFkyRnNhWHBsSWwwc0ltMWhjSEJwYm1keklqb2lPenM3T3p0MVFrRm5Ra0U3T3pzN2RVSkJRMEU3TzBGQlEwRTdPMEZCUTBFN08wRkJRMEU3TzBGQlJVRTdPMEZCUTBFN08wRkJSVUU3TzBGQlJVRTdPMEZCUTBFN08wRkJRMEU3TzBGQlEwRTdPMEZCUlVFN08wRkJRMEU3T3pzN1FVRnFRMEU3TzBGQlJVRTdPenM3T3pzN096czdPenM3TzJkRFFXdERSVUVzU1R0NVJFRkZRVU1zVXp0NVJFRkRRVU1zVXp0NVJFRkRRVU1zYTBJN2VVUkJRMEZETEZNN2VVUkJRMEZETEdkQ08zbEVRVU5CUXl4aE8zbEVRVVZCUXl4UE8zbEVRVU5CUXl4Uk8zbEVRVVZCUXl4Vk8zbEVRVVZCUXl4bE8zbEVRVU5CUXl4dFFqdDVSRUZEUVVNc1Z6dDVSRUZEUVVNc1ZUdDVSRUZEUVVNc1dUdDVSRUZEUVVNc1ZUdDVSRUZEUVVNc1N6dDVSRUZEUVVNc2JVSTdlVVJCUTBGRExHMUNPM2xFUVVOQlF5eFpJaXdpWm1sc1pTSTZJbWx1WkdWNExtcHpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpTHlvZ1UyVmxJRXhKUTBWT1UwVWdabWxzWlNCbWIzSWdkR1Z5YlhNZ2IyWWdkWE5sSUNvdlhHNWNiaThxWEc0Z0tpQlVaWGgwSUdScFptWWdhVzF3YkdWdFpXNTBZWFJwYjI0dVhHNGdLbHh1SUNvZ1ZHaHBjeUJzYVdKeVlYSjVJSE4xY0hCdmNuUnpJSFJvWlNCbWIyeHNiM2RwYm1jZ1FWQkpVenBjYmlBcUlFcHpSR2xtWmk1a2FXWm1RMmhoY25NNklFTm9ZWEpoWTNSbGNpQmllU0JqYUdGeVlXTjBaWElnWkdsbVpseHVJQ29nU25ORWFXWm1MbVJwWm1aWGIzSmtjem9nVjI5eVpDQW9ZWE1nWkdWbWFXNWxaQ0JpZVNCY1hHSWdjbVZuWlhncElHUnBabVlnZDJocFkyZ2dhV2R1YjNKbGN5QjNhR2wwWlhOd1lXTmxYRzRnS2lCS2MwUnBabVl1WkdsbVpreHBibVZ6T2lCTWFXNWxJR0poYzJWa0lHUnBabVpjYmlBcVhHNGdLaUJLYzBScFptWXVaR2xtWmtOemN6b2dSR2xtWmlCMFlYSm5aWFJsWkNCaGRDQkRVMU1nWTI5dWRHVnVkRnh1SUNwY2JpQXFJRlJvWlhObElHMWxkR2h2WkhNZ1lYSmxJR0poYzJWa0lHOXVJSFJvWlNCcGJYQnNaVzFsYm5SaGRHbHZiaUJ3Y205d2IzTmxaQ0JwYmx4dUlDb2dYQ0pCYmlCUEtFNUVLU0JFYVdabVpYSmxibU5sSUVGc1oyOXlhWFJvYlNCaGJtUWdhWFJ6SUZaaGNtbGhkR2x2Ym5OY0lpQW9UWGxsY25Nc0lERTVPRFlwTGx4dUlDb2dhSFIwY0RvdkwyTnBkR1Z6WldWeWVDNXBjM1F1Y0hOMUxtVmtkUzkyYVdWM1pHOWpMM04xYlcxaGNuay9aRzlwUFRFd0xqRXVNUzQwTGpZNU1qZGNiaUFxTDF4dWFXMXdiM0owSUVScFptWWdabkp2YlNBbkxpOWthV1ptTDJKaGMyVW5PMXh1YVcxd2IzSjBJSHRrYVdabVEyaGhjbk45SUdaeWIyMGdKeTR2WkdsbVppOWphR0Z5WVdOMFpYSW5PMXh1YVcxd2IzSjBJSHRrYVdabVYyOXlaSE1zSUdScFptWlhiM0prYzFkcGRHaFRjR0ZqWlgwZ1puSnZiU0FuTGk5a2FXWm1MM2R2Y21Rbk8xeHVhVzF3YjNKMElIdGthV1ptVEdsdVpYTXNJR1JwWm1aVWNtbHRiV1ZrVEdsdVpYTjlJR1p5YjIwZ0p5NHZaR2xtWmk5c2FXNWxKenRjYm1sdGNHOXlkQ0I3WkdsbVpsTmxiblJsYm1ObGMzMGdabkp2YlNBbkxpOWthV1ptTDNObGJuUmxibU5sSnp0Y2JseHVhVzF3YjNKMElIdGthV1ptUTNOemZTQm1jbTl0SUNjdUwyUnBabVl2WTNOekp6dGNibWx0Y0c5eWRDQjdaR2xtWmtwemIyNHNJR05oYm05dWFXTmhiR2w2WlgwZ1puSnZiU0FuTGk5a2FXWm1MMnB6YjI0bk8xeHVYRzVwYlhCdmNuUWdlMlJwWm1aQmNuSmhlWE45SUdaeWIyMGdKeTR2WkdsbVppOWhjbkpoZVNjN1hHNWNibWx0Y0c5eWRDQjdZWEJ3YkhsUVlYUmphQ3dnWVhCd2JIbFFZWFJqYUdWemZTQm1jbTl0SUNjdUwzQmhkR05vTDJGd2NHeDVKenRjYm1sdGNHOXlkQ0I3Y0dGeWMyVlFZWFJqYUgwZ1puSnZiU0FuTGk5d1lYUmphQzl3WVhKelpTYzdYRzVwYlhCdmNuUWdlMjFsY21kbGZTQm1jbTl0SUNjdUwzQmhkR05vTDIxbGNtZGxKenRjYm1sdGNHOXlkQ0I3YzNSeWRXTjBkWEpsWkZCaGRHTm9MQ0JqY21WaGRHVlVkMjlHYVd4bGMxQmhkR05vTENCamNtVmhkR1ZRWVhSamFIMGdabkp2YlNBbkxpOXdZWFJqYUM5amNtVmhkR1VuTzF4dVhHNXBiWEJ2Y25RZ2UyTnZiblpsY25SRGFHRnVaMlZ6Vkc5RVRWQjlJR1p5YjIwZ0p5NHZZMjl1ZG1WeWRDOWtiWEFuTzF4dWFXMXdiM0owSUh0amIyNTJaWEowUTJoaGJtZGxjMVJ2V0UxTWZTQm1jbTl0SUNjdUwyTnZiblpsY25RdmVHMXNKenRjYmx4dVpYaHdiM0owSUh0Y2JpQWdSR2xtWml4Y2JseHVJQ0JrYVdabVEyaGhjbk1zWEc0Z0lHUnBabVpYYjNKa2N5eGNiaUFnWkdsbVpsZHZjbVJ6VjJsMGFGTndZV05sTEZ4dUlDQmthV1ptVEdsdVpYTXNYRzRnSUdScFptWlVjbWx0YldWa1RHbHVaWE1zWEc0Z0lHUnBabVpUWlc1MFpXNWpaWE1zWEc1Y2JpQWdaR2xtWmtOemN5eGNiaUFnWkdsbVprcHpiMjRzWEc1Y2JpQWdaR2xtWmtGeWNtRjVjeXhjYmx4dUlDQnpkSEoxWTNSMWNtVmtVR0YwWTJnc1hHNGdJR055WldGMFpWUjNiMFpwYkdWelVHRjBZMmdzWEc0Z0lHTnlaV0YwWlZCaGRHTm9MRnh1SUNCaGNIQnNlVkJoZEdOb0xGeHVJQ0JoY0hCc2VWQmhkR05vWlhNc1hHNGdJSEJoY25ObFVHRjBZMmdzWEc0Z0lHMWxjbWRsTEZ4dUlDQmpiMjUyWlhKMFEyaGhibWRsYzFSdlJFMVFMRnh1SUNCamIyNTJaWEowUTJoaGJtZGxjMVJ2V0UxTUxGeHVJQ0JqWVc1dmJtbGpZV3hwZW1WY2JuMDdYRzRpWFgwPVxuXG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8ndXNlIHN0cmljdCc7XG5cblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0c1snZGVmYXVsdCddID0gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9EaWZmO1xuXHRmdW5jdGlvbiBEaWZmKCkge31cblxuXHREaWZmLnByb3RvdHlwZSA9IHtcblx0ICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZjogZnVuY3Rpb24gZGlmZihvbGRTdHJpbmcsIG5ld1N0cmluZykge1xuXHQgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL29wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXG5cdCAgICB2YXIgY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrO1xuXHQgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcblx0ICAgICAgb3B0aW9ucyA9IHt9O1xuXHQgICAgfVxuXHQgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuXHQgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG5cdCAgICBmdW5jdGlvbiBkb25lKHZhbHVlKSB7XG5cdCAgICAgIGlmIChjYWxsYmFjaykge1xuXHQgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgY2FsbGJhY2sodW5kZWZpbmVkLCB2YWx1ZSk7XG5cdCAgICAgICAgfSwgMCk7XG5cdCAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgcmV0dXJuIHZhbHVlO1xuXHQgICAgICB9XG5cdCAgICB9XG5cblx0ICAgIC8vIEFsbG93IHN1YmNsYXNzZXMgdG8gbWFzc2FnZSB0aGUgaW5wdXQgcHJpb3IgdG8gcnVubmluZ1xuXHQgICAgb2xkU3RyaW5nID0gdGhpcy5jYXN0SW5wdXQob2xkU3RyaW5nKTtcblx0ICAgIG5ld1N0cmluZyA9IHRoaXMuY2FzdElucHV0KG5ld1N0cmluZyk7XG5cblx0ICAgIG9sZFN0cmluZyA9IHRoaXMucmVtb3ZlRW1wdHkodGhpcy50b2tlbml6ZShvbGRTdHJpbmcpKTtcblx0ICAgIG5ld1N0cmluZyA9IHRoaXMucmVtb3ZlRW1wdHkodGhpcy50b2tlbml6ZShuZXdTdHJpbmcpKTtcblxuXHQgICAgdmFyIG5ld0xlbiA9IG5ld1N0cmluZy5sZW5ndGgsXG5cdCAgICAgICAgb2xkTGVuID0gb2xkU3RyaW5nLmxlbmd0aDtcblx0ICAgIHZhciBlZGl0TGVuZ3RoID0gMTtcblx0ICAgIHZhciBtYXhFZGl0TGVuZ3RoID0gbmV3TGVuICsgb2xkTGVuO1xuXHQgICAgdmFyIGJlc3RQYXRoID0gW3sgbmV3UG9zOiAtMSwgY29tcG9uZW50czogW10gfV07XG5cblx0ICAgIC8vIFNlZWQgZWRpdExlbmd0aCA9IDAsIGkuZS4gdGhlIGNvbnRlbnQgc3RhcnRzIHdpdGggdGhlIHNhbWUgdmFsdWVzXG5cdCAgICB2YXIgb2xkUG9zID0gdGhpcy5leHRyYWN0Q29tbW9uKGJlc3RQYXRoWzBdLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgMCk7XG5cdCAgICBpZiAoYmVzdFBhdGhbMF0ubmV3UG9zICsgMSA+PSBuZXdMZW4gJiYgb2xkUG9zICsgMSA+PSBvbGRMZW4pIHtcblx0ICAgICAgLy8gSWRlbnRpdHkgcGVyIHRoZSBlcXVhbGl0eSBhbmQgdG9rZW5pemVyXG5cdCAgICAgIHJldHVybiBkb25lKFt7IHZhbHVlOiB0aGlzLmpvaW4obmV3U3RyaW5nKSwgY291bnQ6IG5ld1N0cmluZy5sZW5ndGggfV0pO1xuXHQgICAgfVxuXG5cdCAgICAvLyBNYWluIHdvcmtlciBtZXRob2QuIGNoZWNrcyBhbGwgcGVybXV0YXRpb25zIG9mIGEgZ2l2ZW4gZWRpdCBsZW5ndGggZm9yIGFjY2VwdGFuY2UuXG5cdCAgICBmdW5jdGlvbiBleGVjRWRpdExlbmd0aCgpIHtcblx0ICAgICAgZm9yICh2YXIgZGlhZ29uYWxQYXRoID0gLTEgKiBlZGl0TGVuZ3RoOyBkaWFnb25hbFBhdGggPD0gZWRpdExlbmd0aDsgZGlhZ29uYWxQYXRoICs9IDIpIHtcblx0ICAgICAgICB2YXIgYmFzZVBhdGggPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdm9pZCAwIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXHQgICAgICAgIHZhciBhZGRQYXRoID0gYmVzdFBhdGhbZGlhZ29uYWxQYXRoIC0gMV0sXG5cdCAgICAgICAgICAgIHJlbW92ZVBhdGggPSBiZXN0UGF0aFtkaWFnb25hbFBhdGggKyAxXSxcblx0ICAgICAgICAgICAgX29sZFBvcyA9IChyZW1vdmVQYXRoID8gcmVtb3ZlUGF0aC5uZXdQb3MgOiAwKSAtIGRpYWdvbmFsUGF0aDtcblx0ICAgICAgICBpZiAoYWRkUGF0aCkge1xuXHQgICAgICAgICAgLy8gTm8gb25lIGVsc2UgaXMgZ29pbmcgdG8gYXR0ZW1wdCB0byB1c2UgdGhpcyB2YWx1ZSwgY2xlYXIgaXRcblx0ICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aCAtIDFdID0gdW5kZWZpbmVkO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHZhciBjYW5BZGQgPSBhZGRQYXRoICYmIGFkZFBhdGgubmV3UG9zICsgMSA8IG5ld0xlbixcblx0ICAgICAgICAgICAgY2FuUmVtb3ZlID0gcmVtb3ZlUGF0aCAmJiAwIDw9IF9vbGRQb3MgJiYgX29sZFBvcyA8IG9sZExlbjtcblx0ICAgICAgICBpZiAoIWNhbkFkZCAmJiAhY2FuUmVtb3ZlKSB7XG5cdCAgICAgICAgICAvLyBJZiB0aGlzIHBhdGggaXMgYSB0ZXJtaW5hbCB0aGVuIHBydW5lXG5cdCAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGhdID0gdW5kZWZpbmVkO1xuXHQgICAgICAgICAgY29udGludWU7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgLy8gU2VsZWN0IHRoZSBkaWFnb25hbCB0aGF0IHdlIHdhbnQgdG8gYnJhbmNoIGZyb20uIFdlIHNlbGVjdCB0aGUgcHJpb3Jcblx0ICAgICAgICAvLyBwYXRoIHdob3NlIHBvc2l0aW9uIGluIHRoZSBuZXcgc3RyaW5nIGlzIHRoZSBmYXJ0aGVzdCBmcm9tIHRoZSBvcmlnaW5cblx0ICAgICAgICAvLyBhbmQgZG9lcyBub3QgcGFzcyB0aGUgYm91bmRzIG9mIHRoZSBkaWZmIGdyYXBoXG5cdCAgICAgICAgaWYgKCFjYW5BZGQgfHwgY2FuUmVtb3ZlICYmIGFkZFBhdGgubmV3UG9zIDwgcmVtb3ZlUGF0aC5uZXdQb3MpIHtcblx0ICAgICAgICAgIGJhc2VQYXRoID0gY2xvbmVQYXRoKHJlbW92ZVBhdGgpO1xuXHQgICAgICAgICAgc2VsZi5wdXNoQ29tcG9uZW50KGJhc2VQYXRoLmNvbXBvbmVudHMsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIGJhc2VQYXRoID0gYWRkUGF0aDsgLy8gTm8gbmVlZCB0byBjbG9uZSwgd2UndmUgcHVsbGVkIGl0IGZyb20gdGhlIGxpc3Rcblx0ICAgICAgICAgIGJhc2VQYXRoLm5ld1BvcysrO1xuXHQgICAgICAgICAgc2VsZi5wdXNoQ29tcG9uZW50KGJhc2VQYXRoLmNvbXBvbmVudHMsIHRydWUsIHVuZGVmaW5lZCk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgX29sZFBvcyA9IHNlbGYuZXh0cmFjdENvbW1vbihiYXNlUGF0aCwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIGRpYWdvbmFsUGF0aCk7XG5cblx0ICAgICAgICAvLyBJZiB3ZSBoYXZlIGhpdCB0aGUgZW5kIG9mIGJvdGggc3RyaW5ncywgdGhlbiB3ZSBhcmUgZG9uZVxuXHQgICAgICAgIGlmIChiYXNlUGF0aC5uZXdQb3MgKyAxID49IG5ld0xlbiAmJiBfb2xkUG9zICsgMSA+PSBvbGRMZW4pIHtcblx0ICAgICAgICAgIHJldHVybiBkb25lKGJ1aWxkVmFsdWVzKHNlbGYsIGJhc2VQYXRoLmNvbXBvbmVudHMsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBzZWxmLnVzZUxvbmdlc3RUb2tlbikpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAvLyBPdGhlcndpc2UgdHJhY2sgdGhpcyBwYXRoIGFzIGEgcG90ZW50aWFsIGNhbmRpZGF0ZSBhbmQgY29udGludWUuXG5cdCAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGhdID0gYmFzZVBhdGg7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cblx0ICAgICAgZWRpdExlbmd0aCsrO1xuXHQgICAgfVxuXG5cdCAgICAvLyBQZXJmb3JtcyB0aGUgbGVuZ3RoIG9mIGVkaXQgaXRlcmF0aW9uLiBJcyBhIGJpdCBmdWdseSBhcyB0aGlzIGhhcyB0byBzdXBwb3J0IHRoZVxuXHQgICAgLy8gc3luYyBhbmQgYXN5bmMgbW9kZSB3aGljaCBpcyBuZXZlciBmdW4uIExvb3BzIG92ZXIgZXhlY0VkaXRMZW5ndGggdW50aWwgYSB2YWx1ZVxuXHQgICAgLy8gaXMgcHJvZHVjZWQuXG5cdCAgICBpZiAoY2FsbGJhY2spIHtcblx0ICAgICAgKGZ1bmN0aW9uIGV4ZWMoKSB7XG5cdCAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCBidXQgd2Ugd2FudCB0byBiZSBzYWZlLlxuXHQgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblx0ICAgICAgICAgIGlmIChlZGl0TGVuZ3RoID4gbWF4RWRpdExlbmd0aCkge1xuXHQgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcblx0ICAgICAgICAgIH1cblxuXHQgICAgICAgICAgaWYgKCFleGVjRWRpdExlbmd0aCgpKSB7XG5cdCAgICAgICAgICAgIGV4ZWMoKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9LCAwKTtcblx0ICAgICAgfSkoKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHdoaWxlIChlZGl0TGVuZ3RoIDw9IG1heEVkaXRMZW5ndGgpIHtcblx0ICAgICAgICB2YXIgcmV0ID0gZXhlY0VkaXRMZW5ndGgoKTtcblx0ICAgICAgICBpZiAocmV0KSB7XG5cdCAgICAgICAgICByZXR1cm4gcmV0O1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3B1c2hDb21wb25lbnQ6IGZ1bmN0aW9uIHB1c2hDb21wb25lbnQoY29tcG9uZW50cywgYWRkZWQsIHJlbW92ZWQpIHtcblx0ICAgIHZhciBsYXN0ID0gY29tcG9uZW50c1tjb21wb25lbnRzLmxlbmd0aCAtIDFdO1xuXHQgICAgaWYgKGxhc3QgJiYgbGFzdC5hZGRlZCA9PT0gYWRkZWQgJiYgbGFzdC5yZW1vdmVkID09PSByZW1vdmVkKSB7XG5cdCAgICAgIC8vIFdlIG5lZWQgdG8gY2xvbmUgaGVyZSBhcyB0aGUgY29tcG9uZW50IGNsb25lIG9wZXJhdGlvbiBpcyBqdXN0XG5cdCAgICAgIC8vIGFzIHNoYWxsb3cgYXJyYXkgY2xvbmVcblx0ICAgICAgY29tcG9uZW50c1tjb21wb25lbnRzLmxlbmd0aCAtIDFdID0geyBjb3VudDogbGFzdC5jb3VudCArIDEsIGFkZGVkOiBhZGRlZCwgcmVtb3ZlZDogcmVtb3ZlZCB9O1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgY29tcG9uZW50cy5wdXNoKHsgY291bnQ6IDEsIGFkZGVkOiBhZGRlZCwgcmVtb3ZlZDogcmVtb3ZlZCB9KTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9leHRyYWN0Q29tbW9uOiBmdW5jdGlvbiBleHRyYWN0Q29tbW9uKGJhc2VQYXRoLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgZGlhZ29uYWxQYXRoKSB7XG5cdCAgICB2YXIgbmV3TGVuID0gbmV3U3RyaW5nLmxlbmd0aCxcblx0ICAgICAgICBvbGRMZW4gPSBvbGRTdHJpbmcubGVuZ3RoLFxuXHQgICAgICAgIG5ld1BvcyA9IGJhc2VQYXRoLm5ld1Bvcyxcblx0ICAgICAgICBvbGRQb3MgPSBuZXdQb3MgLSBkaWFnb25hbFBhdGgsXG5cdCAgICAgICAgY29tbW9uQ291bnQgPSAwO1xuXHQgICAgd2hpbGUgKG5ld1BvcyArIDEgPCBuZXdMZW4gJiYgb2xkUG9zICsgMSA8IG9sZExlbiAmJiB0aGlzLmVxdWFscyhuZXdTdHJpbmdbbmV3UG9zICsgMV0sIG9sZFN0cmluZ1tvbGRQb3MgKyAxXSkpIHtcblx0ICAgICAgbmV3UG9zKys7XG5cdCAgICAgIG9sZFBvcysrO1xuXHQgICAgICBjb21tb25Db3VudCsrO1xuXHQgICAgfVxuXG5cdCAgICBpZiAoY29tbW9uQ291bnQpIHtcblx0ICAgICAgYmFzZVBhdGguY29tcG9uZW50cy5wdXNoKHsgY291bnQ6IGNvbW1vbkNvdW50IH0pO1xuXHQgICAgfVxuXG5cdCAgICBiYXNlUGF0aC5uZXdQb3MgPSBuZXdQb3M7XG5cdCAgICByZXR1cm4gb2xkUG9zO1xuXHQgIH0sXG5cdCAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2VxdWFsczogZnVuY3Rpb24gZXF1YWxzKGxlZnQsIHJpZ2h0KSB7XG5cdCAgICBpZiAodGhpcy5vcHRpb25zLmNvbXBhcmF0b3IpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb21wYXJhdG9yKGxlZnQsIHJpZ2h0KTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHJldHVybiBsZWZ0ID09PSByaWdodCB8fCB0aGlzLm9wdGlvbnMuaWdub3JlQ2FzZSAmJiBsZWZ0LnRvTG93ZXJDYXNlKCkgPT09IHJpZ2h0LnRvTG93ZXJDYXNlKCk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovIC8qaXN0YW5idWwgaWdub3JlIGVuZCovcmVtb3ZlRW1wdHk6IGZ1bmN0aW9uIHJlbW92ZUVtcHR5KGFycmF5KSB7XG5cdCAgICB2YXIgcmV0ID0gW107XG5cdCAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgIGlmIChhcnJheVtpXSkge1xuXHQgICAgICAgIHJldC5wdXNoKGFycmF5W2ldKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIHJldDtcblx0ICB9LFxuXHQgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jYXN0SW5wdXQ6IGZ1bmN0aW9uIGNhc3RJbnB1dCh2YWx1ZSkge1xuXHQgICAgcmV0dXJuIHZhbHVlO1xuXHQgIH0sXG5cdCAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3Rva2VuaXplOiBmdW5jdGlvbiB0b2tlbml6ZSh2YWx1ZSkge1xuXHQgICAgcmV0dXJuIHZhbHVlLnNwbGl0KCcnKTtcblx0ICB9LFxuXHQgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9qb2luOiBmdW5jdGlvbiBqb2luKGNoYXJzKSB7XG5cdCAgICByZXR1cm4gY2hhcnMuam9pbignJyk7XG5cdCAgfVxuXHR9O1xuXG5cdGZ1bmN0aW9uIGJ1aWxkVmFsdWVzKGRpZmYsIGNvbXBvbmVudHMsIG5ld1N0cmluZywgb2xkU3RyaW5nLCB1c2VMb25nZXN0VG9rZW4pIHtcblx0ICB2YXIgY29tcG9uZW50UG9zID0gMCxcblx0ICAgICAgY29tcG9uZW50TGVuID0gY29tcG9uZW50cy5sZW5ndGgsXG5cdCAgICAgIG5ld1BvcyA9IDAsXG5cdCAgICAgIG9sZFBvcyA9IDA7XG5cblx0ICBmb3IgKDsgY29tcG9uZW50UG9zIDwgY29tcG9uZW50TGVuOyBjb21wb25lbnRQb3MrKykge1xuXHQgICAgdmFyIGNvbXBvbmVudCA9IGNvbXBvbmVudHNbY29tcG9uZW50UG9zXTtcblx0ICAgIGlmICghY29tcG9uZW50LnJlbW92ZWQpIHtcblx0ICAgICAgaWYgKCFjb21wb25lbnQuYWRkZWQgJiYgdXNlTG9uZ2VzdFRva2VuKSB7XG5cdCAgICAgICAgdmFyIHZhbHVlID0gbmV3U3RyaW5nLnNsaWNlKG5ld1BvcywgbmV3UG9zICsgY29tcG9uZW50LmNvdW50KTtcblx0ICAgICAgICB2YWx1ZSA9IHZhbHVlLm1hcChmdW5jdGlvbiAodmFsdWUsIGkpIHtcblx0ICAgICAgICAgIHZhciBvbGRWYWx1ZSA9IG9sZFN0cmluZ1tvbGRQb3MgKyBpXTtcblx0ICAgICAgICAgIHJldHVybiBvbGRWYWx1ZS5sZW5ndGggPiB2YWx1ZS5sZW5ndGggPyBvbGRWYWx1ZSA6IHZhbHVlO1xuXHQgICAgICAgIH0pO1xuXG5cdCAgICAgICAgY29tcG9uZW50LnZhbHVlID0gZGlmZi5qb2luKHZhbHVlKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBjb21wb25lbnQudmFsdWUgPSBkaWZmLmpvaW4obmV3U3RyaW5nLnNsaWNlKG5ld1BvcywgbmV3UG9zICsgY29tcG9uZW50LmNvdW50KSk7XG5cdCAgICAgIH1cblx0ICAgICAgbmV3UG9zICs9IGNvbXBvbmVudC5jb3VudDtcblxuXHQgICAgICAvLyBDb21tb24gY2FzZVxuXHQgICAgICBpZiAoIWNvbXBvbmVudC5hZGRlZCkge1xuXHQgICAgICAgIG9sZFBvcyArPSBjb21wb25lbnQuY291bnQ7XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGNvbXBvbmVudC52YWx1ZSA9IGRpZmYuam9pbihvbGRTdHJpbmcuc2xpY2Uob2xkUG9zLCBvbGRQb3MgKyBjb21wb25lbnQuY291bnQpKTtcblx0ICAgICAgb2xkUG9zICs9IGNvbXBvbmVudC5jb3VudDtcblxuXHQgICAgICAvLyBSZXZlcnNlIGFkZCBhbmQgcmVtb3ZlIHNvIHJlbW92ZXMgYXJlIG91dHB1dCBmaXJzdCB0byBtYXRjaCBjb21tb24gY29udmVudGlvblxuXHQgICAgICAvLyBUaGUgZGlmZmluZyBhbGdvcml0aG0gaXMgdGllZCB0byBhZGQgdGhlbiByZW1vdmUgb3V0cHV0IGFuZCB0aGlzIGlzIHRoZSBzaW1wbGVzdFxuXHQgICAgICAvLyByb3V0ZSB0byBnZXQgdGhlIGRlc2lyZWQgb3V0cHV0IHdpdGggbWluaW1hbCBvdmVyaGVhZC5cblx0ICAgICAgaWYgKGNvbXBvbmVudFBvcyAmJiBjb21wb25lbnRzW2NvbXBvbmVudFBvcyAtIDFdLmFkZGVkKSB7XG5cdCAgICAgICAgdmFyIHRtcCA9IGNvbXBvbmVudHNbY29tcG9uZW50UG9zIC0gMV07XG5cdCAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXSA9IGNvbXBvbmVudHNbY29tcG9uZW50UG9zXTtcblx0ICAgICAgICBjb21wb25lbnRzW2NvbXBvbmVudFBvc10gPSB0bXA7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9XG5cblx0ICAvLyBTcGVjaWFsIGNhc2UgaGFuZGxlIGZvciB3aGVuIG9uZSB0ZXJtaW5hbCBpcyBpZ25vcmVkIChpLmUuIHdoaXRlc3BhY2UpLlxuXHQgIC8vIEZvciB0aGlzIGNhc2Ugd2UgbWVyZ2UgdGhlIHRlcm1pbmFsIGludG8gdGhlIHByaW9yIHN0cmluZyBhbmQgZHJvcCB0aGUgY2hhbmdlLlxuXHQgIC8vIFRoaXMgaXMgb25seSBhdmFpbGFibGUgZm9yIHN0cmluZyBtb2RlLlxuXHQgIHZhciBsYXN0Q29tcG9uZW50ID0gY29tcG9uZW50c1tjb21wb25lbnRMZW4gLSAxXTtcblx0ICBpZiAoY29tcG9uZW50TGVuID4gMSAmJiB0eXBlb2YgbGFzdENvbXBvbmVudC52YWx1ZSA9PT0gJ3N0cmluZycgJiYgKGxhc3RDb21wb25lbnQuYWRkZWQgfHwgbGFzdENvbXBvbmVudC5yZW1vdmVkKSAmJiBkaWZmLmVxdWFscygnJywgbGFzdENvbXBvbmVudC52YWx1ZSkpIHtcblx0ICAgIGNvbXBvbmVudHNbY29tcG9uZW50TGVuIC0gMl0udmFsdWUgKz0gbGFzdENvbXBvbmVudC52YWx1ZTtcblx0ICAgIGNvbXBvbmVudHMucG9wKCk7XG5cdCAgfVxuXG5cdCAgcmV0dXJuIGNvbXBvbmVudHM7XG5cdH1cblxuXHRmdW5jdGlvbiBjbG9uZVBhdGgocGF0aCkge1xuXHQgIHJldHVybiB7IG5ld1BvczogcGF0aC5uZXdQb3MsIGNvbXBvbmVudHM6IHBhdGguY29tcG9uZW50cy5zbGljZSgwKSB9O1xuXHR9XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OWthV1ptTDJKaGMyVXVhbk1pWFN3aWJtRnRaWE1pT2xzaVJHbG1aaUlzSW5CeWIzUnZkSGx3WlNJc0ltUnBabVlpTENKdmJHUlRkSEpwYm1jaUxDSnVaWGRUZEhKcGJtY2lMQ0p2Y0hScGIyNXpJaXdpWTJGc2JHSmhZMnNpTENKelpXeG1JaXdpWkc5dVpTSXNJblpoYkhWbElpd2ljMlYwVkdsdFpXOTFkQ0lzSW5WdVpHVm1hVzVsWkNJc0ltTmhjM1JKYm5CMWRDSXNJbkpsYlc5MlpVVnRjSFI1SWl3aWRHOXJaVzVwZW1VaUxDSnVaWGRNWlc0aUxDSnNaVzVuZEdnaUxDSnZiR1JNWlc0aUxDSmxaR2wwVEdWdVozUm9JaXdpYldGNFJXUnBkRXhsYm1kMGFDSXNJbUpsYzNSUVlYUm9JaXdpYm1WM1VHOXpJaXdpWTI5dGNHOXVaVzUwY3lJc0ltOXNaRkJ2Y3lJc0ltVjRkSEpoWTNSRGIyMXRiMjRpTENKcWIybHVJaXdpWTI5MWJuUWlMQ0psZUdWalJXUnBkRXhsYm1kMGFDSXNJbVJwWVdkdmJtRnNVR0YwYUNJc0ltSmhjMlZRWVhSb0lpd2lZV1JrVUdGMGFDSXNJbkpsYlc5MlpWQmhkR2dpTENKallXNUJaR1FpTENKallXNVNaVzF2ZG1VaUxDSmpiRzl1WlZCaGRHZ2lMQ0p3ZFhOb1EyOXRjRzl1Wlc1MElpd2lZblZwYkdSV1lXeDFaWE1pTENKMWMyVk1iMjVuWlhOMFZHOXJaVzRpTENKbGVHVmpJaXdpY21WMElpd2lZV1JrWldRaUxDSnlaVzF2ZG1Wa0lpd2liR0Z6ZENJc0luQjFjMmdpTENKamIyMXRiMjVEYjNWdWRDSXNJbVZ4ZFdGc2N5SXNJbXhsWm5RaUxDSnlhV2RvZENJc0ltTnZiWEJoY21GMGIzSWlMQ0pwWjI1dmNtVkRZWE5sSWl3aWRHOU1iM2RsY2tOaGMyVWlMQ0poY25KaGVTSXNJbWtpTENKemNHeHBkQ0lzSW1Ob1lYSnpJaXdpWTI5dGNHOXVaVzUwVUc5eklpd2lZMjl0Y0c5dVpXNTBUR1Z1SWl3aVkyOXRjRzl1Wlc1MElpd2ljMnhwWTJVaUxDSnRZWEFpTENKdmJHUldZV3gxWlNJc0luUnRjQ0lzSW14aGMzUkRiMjF3YjI1bGJuUWlMQ0p3YjNBaUxDSndZWFJvSWwwc0ltMWhjSEJwYm1keklqb2lPenM3TkVOQlFYZENRU3hKTzBGQlFWUXNVMEZCVTBFc1NVRkJWQ3hIUVVGblFpeERRVUZGT3p0QlFVVnFRMEVzUzBGQlMwTXNVMEZCVEN4SFFVRnBRanRCUVVGQkxHMUVRVU5tUXl4SlFVUmxMR2RDUVVOV1F5eFRRVVJWTEVWQlEwTkRMRk5CUkVRc1JVRkRNRUk3UVVGQlFTeDNSRUZCWkVNc1QwRkJZeXgxUlVGQlNpeEZRVUZKT3p0QlFVTjJReXhSUVVGSlF5eFhRVUZYUkN4UlFVRlJReXhSUVVGMlFqdEJRVU5CTEZGQlFVa3NUMEZCVDBRc1QwRkJVQ3hMUVVGdFFpeFZRVUYyUWl4RlFVRnRRenRCUVVOcVEwTXNhVUpCUVZkRUxFOUJRVmc3UVVGRFFVRXNaMEpCUVZVc1JVRkJWanRCUVVORU8wRkJRMFFzVTBGQlMwRXNUMEZCVEN4SFFVRmxRU3hQUVVGbU96dEJRVVZCTEZGQlFVbEZMRTlCUVU4c1NVRkJXRHM3UVVGRlFTeGhRVUZUUXl4SlFVRlVMRU5CUVdORExFdEJRV1FzUlVGQmNVSTdRVUZEYmtJc1ZVRkJTVWdzVVVGQlNpeEZRVUZqTzBGQlExcEpMRzFDUVVGWExGbEJRVmM3UVVGQlJVb3NiVUpCUVZOTExGTkJRVlFzUlVGQmIwSkdMRXRCUVhCQ08wRkJRVFpDTEZOQlFYSkVMRVZCUVhWRUxFTkJRWFpFTzBGQlEwRXNaVUZCVHl4SlFVRlFPMEZCUTBRc1QwRklSQ3hOUVVkUE8wRkJRMHdzWlVGQlQwRXNTMEZCVUR0QlFVTkVPMEZCUTBZN08wRkJSVVE3UVVGRFFVNHNaMEpCUVZrc1MwRkJTMU1zVTBGQlRDeERRVUZsVkN4VFFVRm1MRU5CUVZvN1FVRkRRVU1zWjBKQlFWa3NTMEZCUzFFc1UwRkJUQ3hEUVVGbFVpeFRRVUZtTEVOQlFWbzdPMEZCUlVGRUxHZENRVUZaTEV0QlFVdFZMRmRCUVV3c1EwRkJhVUlzUzBGQlMwTXNVVUZCVEN4RFFVRmpXQ3hUUVVGa0xFTkJRV3BDTEVOQlFWbzdRVUZEUVVNc1owSkJRVmtzUzBGQlMxTXNWMEZCVEN4RFFVRnBRaXhMUVVGTFF5eFJRVUZNTEVOQlFXTldMRk5CUVdRc1EwRkJha0lzUTBGQldqczdRVUZGUVN4UlFVRkpWeXhUUVVGVFdDeFZRVUZWV1N4TlFVRjJRanRCUVVGQkxGRkJRU3RDUXl4VFFVRlRaQ3hWUVVGVllTeE5RVUZzUkR0QlFVTkJMRkZCUVVsRkxHRkJRV0VzUTBGQmFrSTdRVUZEUVN4UlFVRkpReXhuUWtGQlowSktMRk5CUVZORkxFMUJRVGRDTzBGQlEwRXNVVUZCU1Vjc1YwRkJWeXhEUVVGRExFVkJRVVZETEZGQlFWRXNRMEZCUXl4RFFVRllMRVZCUVdORExGbEJRVmtzUlVGQk1VSXNSVUZCUkN4RFFVRm1PenRCUVVWQk8wRkJRMEVzVVVGQlNVTXNVMEZCVXl4TFFVRkxReXhoUVVGTUxFTkJRVzFDU2l4VFFVRlRMRU5CUVZRc1EwRkJia0lzUlVGQlowTm9RaXhUUVVGb1F5eEZRVUV5UTBRc1UwRkJNME1zUlVGQmMwUXNRMEZCZEVRc1EwRkJZanRCUVVOQkxGRkJRVWxwUWl4VFFVRlRMRU5CUVZRc1JVRkJXVU1zVFVGQldpeEhRVUZ4UWl4RFFVRnlRaXhKUVVFd1FrNHNUVUZCTVVJc1NVRkJiME5STEZOQlFWTXNRMEZCVkN4SlFVRmpUaXhOUVVGMFJDeEZRVUU0UkR0QlFVTTFSRHRCUVVOQkxHRkJRVTlVTEV0QlFVc3NRMEZCUXl4RlFVRkRReXhQUVVGUExFdEJRVXRuUWl4SlFVRk1MRU5CUVZWeVFpeFRRVUZXTEVOQlFWSXNSVUZCT0VKelFpeFBRVUZQZEVJc1ZVRkJWVmtzVFVGQkwwTXNSVUZCUkN4RFFVRk1MRU5CUVZBN1FVRkRSRHM3UVVGRlJEdEJRVU5CTEdGQlFWTlhMR05CUVZRc1IwRkJNRUk3UVVGRGVFSXNWMEZCU3l4SlFVRkpReXhsUVVGbExFTkJRVU1zUTBGQlJDeEhRVUZMVml4VlFVRTNRaXhGUVVGNVExVXNaMEpCUVdkQ1ZpeFZRVUY2UkN4RlFVRnhSVlVzWjBKQlFXZENMRU5CUVhKR0xFVkJRWGRHTzBGQlEzUkdMRmxCUVVsRExEQkRRVUZLTzBGQlEwRXNXVUZCU1VNc1ZVRkJWVllzVTBGQlUxRXNaVUZCWlN4RFFVRjRRaXhEUVVGa08wRkJRVUVzV1VGRFNVY3NZVUZCWVZnc1UwRkJVMUVzWlVGQlpTeERRVUY0UWl4RFFVUnFRanRCUVVGQkxGbEJSVWxNTEZWQlFWTXNRMEZCUTFFc1lVRkJZVUVzVjBGQlYxWXNUVUZCZUVJc1IwRkJhVU1zUTBGQmJFTXNTVUZCZFVOUExGbEJSbkJFTzBGQlIwRXNXVUZCU1VVc1QwRkJTaXhGUVVGaE8wRkJRMWc3UVVGRFFWWXNiVUpCUVZOUkxHVkJRV1VzUTBGQmVFSXNTVUZCTmtKcVFpeFRRVUUzUWp0QlFVTkVPenRCUVVWRUxGbEJRVWx4UWl4VFFVRlRSaXhYUVVGWFFTeFJRVUZSVkN4TlFVRlNMRWRCUVdsQ0xFTkJRV3BDTEVkQlFYRkNUaXhOUVVFM1F6dEJRVUZCTEZsQlEwbHJRaXhaUVVGWlJpeGpRVUZqTEV0QlFVdFNMRTlCUVc1Q0xFbEJRVFpDUVN4VlFVRlRUaXhOUVVSMFJEdEJRVVZCTEZsQlFVa3NRMEZCUTJVc1RVRkJSQ3hKUVVGWExFTkJRVU5ETEZOQlFXaENMRVZCUVRKQ08wRkJRM3BDTzBGQlEwRmlMRzFDUVVGVFVTeFpRVUZVTEVsQlFYbENha0lzVTBGQmVrSTdRVUZEUVR0QlFVTkVPenRCUVVWRU8wRkJRMEU3UVVGRFFUdEJRVU5CTEZsQlFVa3NRMEZCUTNGQ0xFMUJRVVFzU1VGQldVTXNZVUZCWVVnc1VVRkJVVlFzVFVGQlVpeEhRVUZwUWxVc1YwRkJWMVlzVFVGQmVrUXNSVUZCYTBVN1FVRkRhRVZSTEhGQ1FVRlhTeXhWUVVGVlNDeFZRVUZXTEVOQlFWZzdRVUZEUVhoQ0xHVkJRVXMwUWl4aFFVRk1MRU5CUVcxQ1RpeFRRVUZUVUN4VlFVRTFRaXhGUVVGM1ExZ3NVMEZCZUVNc1JVRkJiVVFzU1VGQmJrUTdRVUZEUkN4VFFVaEVMRTFCUjA4N1FVRkRUR3RDTEhGQ1FVRlhReXhQUVVGWUxFTkJSRXNzUTBGRGFVSTdRVUZEZEVKRUxHMUNRVUZUVWl4TlFVRlVPMEZCUTBGa0xHVkJRVXMwUWl4aFFVRk1MRU5CUVcxQ1RpeFRRVUZUVUN4VlFVRTFRaXhGUVVGM1F5eEpRVUY0UXl4RlFVRTRRMWdzVTBGQk9VTTdRVUZEUkRzN1FVRkZSRmtzYTBKQlFWTm9RaXhMUVVGTGFVSXNZVUZCVEN4RFFVRnRRa3NzVVVGQmJrSXNSVUZCTmtKNlFpeFRRVUUzUWl4RlFVRjNRMFFzVTBGQmVFTXNSVUZCYlVSNVFpeFpRVUZ1UkN4RFFVRlVPenRCUVVWQk8wRkJRMEVzV1VGQlNVTXNVMEZCVTFJc1RVRkJWQ3hIUVVGclFpeERRVUZzUWl4SlFVRjFRazRzVFVGQmRrSXNTVUZCYVVOUkxGVkJRVk1zUTBGQlZDeEpRVUZqVGl4TlFVRnVSQ3hGUVVFeVJEdEJRVU42UkN4cFFrRkJUMVFzUzBGQlN6UkNMRmxCUVZrM1FpeEpRVUZhTEVWQlFXdENjMElzVTBGQlUxQXNWVUZCTTBJc1JVRkJkVU5zUWl4VFFVRjJReXhGUVVGclJFUXNVMEZCYkVRc1JVRkJOa1JKTEV0QlFVczRRaXhsUVVGc1JTeERRVUZNTEVOQlFWQTdRVUZEUkN4VFFVWkVMRTFCUlU4N1FVRkRURHRCUVVOQmFrSXNiVUpCUVZOUkxGbEJRVlFzU1VGQmVVSkRMRkZCUVhwQ08wRkJRMFE3UVVGRFJqczdRVUZGUkZnN1FVRkRSRHM3UVVGRlJEdEJRVU5CTzBGQlEwRTdRVUZEUVN4UlFVRkpXaXhSUVVGS0xFVkJRV003UVVGRFdDeG5Ra0ZCVTJkRExFbEJRVlFzUjBGQlowSTdRVUZEWmpWQ0xHMUNRVUZYTEZsQlFWYzdRVUZEY0VJN1FVRkRRVHRCUVVOQkxHTkJRVWxSTEdGQlFXRkRMR0ZCUVdwQ0xFVkJRV2RETzBGQlF6bENMRzFDUVVGUFlpeFZRVUZRTzBGQlEwUTdPMEZCUlVRc1kwRkJTU3hEUVVGRGNVSXNaMEpCUVV3c1JVRkJkVUk3UVVGRGNrSlhPMEZCUTBRN1FVRkRSaXhUUVZaRUxFVkJWVWNzUTBGV1NEdEJRVmRFTEU5QldrRXNSMEZCUkR0QlFXRkVMRXRCWkVRc1RVRmpUenRCUVVOTUxHRkJRVTl3UWl4alFVRmpReXhoUVVGeVFpeEZRVUZ2UXp0QlFVTnNReXhaUVVGSmIwSXNUVUZCVFZvc1owSkJRVlk3UVVGRFFTeFpRVUZKV1N4SFFVRktMRVZCUVZNN1FVRkRVQ3hwUWtGQlQwRXNSMEZCVUR0QlFVTkVPMEZCUTBZN1FVRkRSanRCUVVOR0xFZEJPVWRqTzBGQlFVRXNiVVJCWjBobVNpeGhRV2hJWlN4NVFrRm5TRVJpTEZWQmFFaERMRVZCWjBoWGEwSXNTMEZvU0Znc1JVRm5TR3RDUXl4UFFXaEliRUlzUlVGblNESkNPMEZCUTNoRExGRkJRVWxETEU5QlFVOXdRaXhYUVVGWFFTeFhRVUZYVGl4TlFVRllMRWRCUVc5Q0xFTkJRUzlDTEVOQlFWZzdRVUZEUVN4UlFVRkpNRUlzVVVGQlVVRXNTMEZCUzBZc1MwRkJUQ3hMUVVGbFFTeExRVUYyUWl4SlFVRm5RMFVzUzBGQlMwUXNUMEZCVEN4TFFVRnBRa0VzVDBGQmNrUXNSVUZCT0VRN1FVRkROVVE3UVVGRFFUdEJRVU5CYmtJc2FVSkJRVmRCTEZkQlFWZE9MRTFCUVZnc1IwRkJiMElzUTBGQkwwSXNTVUZCYjBNc1JVRkJRMVVzVDBGQlQyZENMRXRCUVV0b1FpeExRVUZNTEVkQlFXRXNRMEZCY2tJc1JVRkJkMEpqTEU5QlFVOUJMRXRCUVM5Q0xFVkJRWE5EUXl4VFFVRlRRU3hQUVVFdlF5eEZRVUZ3UXp0QlFVTkVMRXRCU2tRc1RVRkpUenRCUVVOTWJrSXNhVUpCUVZkeFFpeEpRVUZZTEVOQlFXZENMRVZCUVVOcVFpeFBRVUZQTEVOQlFWSXNSVUZCVjJNc1QwRkJUMEVzUzBGQmJFSXNSVUZCZVVKRExGTkJRVk5CTEU5QlFXeERMRVZCUVdoQ08wRkJRMFE3UVVGRFJpeEhRWHBJWXp0QlFVRkJMRzFFUVRCSVptcENMR0ZCTVVobExIbENRVEJJUkVzc1VVRXhTRU1zUlVFd1NGTjZRaXhUUVRGSVZDeEZRVEJJYjBKRUxGTkJNVWh3UWl4RlFUQklLMEo1UWl4WlFURklMMElzUlVFd1NEWkRPMEZCUXpGRUxGRkJRVWxpTEZOQlFWTllMRlZCUVZWWkxFMUJRWFpDTzBGQlFVRXNVVUZEU1VNc1UwRkJVMlFzVlVGQlZXRXNUVUZFZGtJN1FVRkJRU3hSUVVWSlN5eFRRVUZUVVN4VFFVRlRVaXhOUVVaMFFqdEJRVUZCTEZGQlIwbEZMRk5CUVZOR0xGTkJRVk5QTEZsQlNIUkNPMEZCUVVFc1VVRkxTV2RDTEdOQlFXTXNRMEZNYkVJN1FVRk5RU3hYUVVGUGRrSXNVMEZCVXl4RFFVRlVMRWRCUVdGT0xFMUJRV0lzU1VGQmRVSlJMRk5CUVZNc1EwRkJWQ3hIUVVGaFRpeE5RVUZ3UXl4SlFVRTRReXhMUVVGTE5FSXNUVUZCVEN4RFFVRlpla01zVlVGQlZXbENMRk5CUVZNc1EwRkJia0lzUTBGQldpeEZRVUZ0UTJ4Q0xGVkJRVlZ2UWl4VFFVRlRMRU5CUVc1Q0xFTkJRVzVETEVOQlFYSkVMRVZCUVdkSU8wRkJRemxIUmp0QlFVTkJSVHRCUVVOQmNVSTdRVUZEUkRzN1FVRkZSQ3hSUVVGSlFTeFhRVUZLTEVWQlFXbENPMEZCUTJabUxHVkJRVk5RTEZWQlFWUXNRMEZCYjBKeFFpeEpRVUZ3UWl4RFFVRjVRaXhGUVVGRGFrSXNUMEZCVDJ0Q0xGZEJRVklzUlVGQmVrSTdRVUZEUkRzN1FVRkZSR1lzWVVGQlUxSXNUVUZCVkN4SFFVRnJRa0VzVFVGQmJFSTdRVUZEUVN4WFFVRlBSU3hOUVVGUU8wRkJRMFFzUjBFM1NXTTdRVUZCUVN4dFJFRXJTV1p6UWl4TlFTOUpaU3hyUWtFclNWSkRMRWxCTDBsUkxFVkJLMGxHUXl4TFFTOUpSU3hGUVN0SlN6dEJRVU5zUWl4UlFVRkpMRXRCUVVzeFF5eFBRVUZNTEVOQlFXRXlReXhWUVVGcVFpeEZRVUUyUWp0QlFVTXpRaXhoUVVGUExFdEJRVXN6UXl4UFFVRk1MRU5CUVdFeVF5eFZRVUZpTEVOQlFYZENSaXhKUVVGNFFpeEZRVUU0UWtNc1MwRkJPVUlzUTBGQlVEdEJRVU5FTEV0QlJrUXNUVUZGVHp0QlFVTk1MR0ZCUVU5RUxGTkJRVk5ETEV0QlFWUXNTVUZEUkN4TFFVRkxNVU1zVDBGQlRDeERRVUZoTkVNc1ZVRkJZaXhKUVVFeVFrZ3NTMEZCUzBrc1YwRkJUQ3hQUVVGMVFrZ3NUVUZCVFVjc1YwRkJUaXhGUVVSNFJEdEJRVVZFTzBGQlEwWXNSMEYwU21NN1FVRkJRU3h0UkVGMVNtWnlReXhYUVhaS1pTeDFRa0YxU2toelF5eExRWFpLUnl4RlFYVktTVHRCUVVOcVFpeFJRVUZKV2l4TlFVRk5MRVZCUVZZN1FVRkRRU3hUUVVGTExFbEJRVWxoTEVsQlFVa3NRMEZCWWl4RlFVRm5Ra0VzU1VGQlNVUXNUVUZCVFc1RExFMUJRVEZDTEVWQlFXdERiME1zUjBGQmJFTXNSVUZCZFVNN1FVRkRja01zVlVGQlNVUXNUVUZCVFVNc1EwRkJUaXhEUVVGS0xFVkJRV003UVVGRFdtSXNXVUZCU1Vrc1NVRkJTaXhEUVVGVFVTeE5RVUZOUXl4RFFVRk9MRU5CUVZRN1FVRkRSRHRCUVVOR08wRkJRMFFzVjBGQlQySXNSMEZCVUR0QlFVTkVMRWRCTDBwak8wRkJRVUVzYlVSQlowdG1NMElzVTBGb1MyVXNjVUpCWjB0TVNDeExRV2hMU3l4RlFXZExSVHRCUVVObUxGZEJRVTlCTEV0QlFWQTdRVUZEUkN4SFFXeExZenRCUVVGQkxHMUVRVzFMWmtzc1VVRnVTMlVzYjBKQmJVdE9UQ3hMUVc1TFRTeEZRVzFMUXp0QlFVTmtMRmRCUVU5QkxFMUJRVTAwUXl4TFFVRk9MRU5CUVZrc1JVRkJXaXhEUVVGUU8wRkJRMFFzUjBGeVMyTTdRVUZCUVN4dFJFRnpTMlkxUWl4SlFYUkxaU3huUWtGelMxWTJRaXhMUVhSTFZTeEZRWE5MU0R0QlFVTldMRmRCUVU5QkxFMUJRVTAzUWl4SlFVRk9MRU5CUVZjc1JVRkJXQ3hEUVVGUU8wRkJRMFE3UVVGNFMyTXNRMEZCYWtJN08wRkJNa3RCTEZOQlFWTlhMRmRCUVZRc1EwRkJjVUpzUXl4SlFVRnlRaXhGUVVFeVFtOUNMRlZCUVROQ0xFVkJRWFZEYkVJc1UwRkJka01zUlVGQmEwUkVMRk5CUVd4RUxFVkJRVFpFYTBNc1pVRkJOMFFzUlVGQk9FVTdRVUZETlVVc1RVRkJTV3RDTEdWQlFXVXNRMEZCYmtJN1FVRkJRU3hOUVVOSlF5eGxRVUZsYkVNc1YwRkJWMDRzVFVGRU9VSTdRVUZCUVN4TlFVVkpTeXhUUVVGVExFTkJSbUk3UVVGQlFTeE5RVWRKUlN4VFFVRlRMRU5CU0dJN08wRkJTMEVzVTBGQlQyZERMR1ZCUVdWRExGbEJRWFJDTEVWQlFXOURSQ3hqUVVGd1F5eEZRVUZ2UkR0QlFVTnNSQ3hSUVVGSlJTeFpRVUZaYmtNc1YwRkJWMmxETEZsQlFWZ3NRMEZCYUVJN1FVRkRRU3hSUVVGSkxFTkJRVU5GTEZWQlFWVm9RaXhQUVVGbUxFVkJRWGRDTzBGQlEzUkNMRlZCUVVrc1EwRkJRMmRDTEZWQlFWVnFRaXhMUVVGWUxFbEJRVzlDU0N4bFFVRjRRaXhGUVVGNVF6dEJRVU4yUXl4WlFVRkpOVUlzVVVGQlVVd3NWVUZCVlhORUxFdEJRVllzUTBGQlowSnlReXhOUVVGb1FpeEZRVUYzUWtFc1UwRkJVMjlETEZWQlFWVXZRaXhMUVVFelF5eERRVUZhTzBGQlEwRnFRaXhuUWtGQlVVRXNUVUZCVFd0RUxFZEJRVTRzUTBGQlZTeFZRVUZUYkVRc1MwRkJWQ3hGUVVGblFqSkRMRU5CUVdoQ0xFVkJRVzFDTzBGQlEyNURMR05CUVVsUkxGZEJRVmQ2UkN4VlFVRlZiMElzVTBGQlV6WkNMRU5CUVc1Q0xFTkJRV1k3UVVGRFFTeHBRa0ZCVDFFc1UwRkJVelZETEUxQlFWUXNSMEZCYTBKUUxFMUJRVTFQTEUxQlFYaENMRWRCUVdsRE5FTXNVVUZCYWtNc1IwRkJORU51UkN4TFFVRnVSRHRCUVVORUxGTkJTRThzUTBGQlVqczdRVUZMUVdkRUxHdENRVUZWYUVRc1MwRkJWaXhIUVVGclFsQXNTMEZCUzNWQ0xFbEJRVXdzUTBGQlZXaENMRXRCUVZZc1EwRkJiRUk3UVVGRFJDeFBRVkpFTEUxQlVVODdRVUZEVEdkRUxHdENRVUZWYUVRc1MwRkJWaXhIUVVGclFsQXNTMEZCUzNWQ0xFbEJRVXdzUTBGQlZYSkNMRlZCUVZWelJDeExRVUZXTEVOQlFXZENja01zVFVGQmFFSXNSVUZCZDBKQkxGTkJRVk52UXl4VlFVRlZMMElzUzBGQk0wTXNRMEZCVml4RFFVRnNRanRCUVVORU8wRkJRMFJNTEdkQ1FVRlZiME1zVlVGQlZTOUNMRXRCUVhCQ096dEJRVVZCTzBGQlEwRXNWVUZCU1N4RFFVRkRLMElzVlVGQlZXcENMRXRCUVdZc1JVRkJjMEk3UVVGRGNFSnFRaXhyUWtGQlZXdERMRlZCUVZVdlFpeExRVUZ3UWp0QlFVTkVPMEZCUTBZc1MwRnNRa1FzVFVGclFrODdRVUZEVEN0Q0xHZENRVUZWYUVRc1MwRkJWaXhIUVVGclFsQXNTMEZCUzNWQ0xFbEJRVXdzUTBGQlZYUkNMRlZCUVZWMVJDeExRVUZXTEVOQlFXZENia01zVFVGQmFFSXNSVUZCZDBKQkxGTkJRVk5yUXl4VlFVRlZMMElzUzBGQk0wTXNRMEZCVml4RFFVRnNRanRCUVVOQlNDeG5Ra0ZCVld0RExGVkJRVlV2UWl4TFFVRndRanM3UVVGRlFUdEJRVU5CTzBGQlEwRTdRVUZEUVN4VlFVRkpOa0lzWjBKQlFXZENha01zVjBGQlYybERMR1ZCUVdVc1EwRkJNVUlzUlVGQk5rSm1MRXRCUVdwRUxFVkJRWGRFTzBGQlEzUkVMRmxCUVVseFFpeE5RVUZOZGtNc1YwRkJWMmxETEdWQlFXVXNRMEZCTVVJc1EwRkJWanRCUVVOQmFrTXNiVUpCUVZkcFF5eGxRVUZsTEVOQlFURkNMRWxCUVN0Q2FrTXNWMEZCVjJsRExGbEJRVmdzUTBGQkwwSTdRVUZEUVdwRExHMUNRVUZYYVVNc1dVRkJXQ3hKUVVFeVFrMHNSMEZCTTBJN1FVRkRSRHRCUVVOR08wRkJRMFk3TzBGQlJVUTdRVUZEUVR0QlFVTkJPMEZCUTBFc1RVRkJTVU1zWjBKQlFXZENlRU1zVjBGQlYydERMR1ZCUVdVc1EwRkJNVUlzUTBGQmNFSTdRVUZEUVN4TlFVRkpRU3hsUVVGbExFTkJRV1lzU1VGRFJ5eFBRVUZQVFN4alFVRmpja1FzUzBGQmNrSXNTMEZCSzBJc1VVRkViRU1zUzBGRlNYRkVMR05CUVdOMFFpeExRVUZrTEVsQlFYVkNjMElzWTBGQlkzSkNMRTlCUm5wRExFdEJSMGQyUXl4TFFVRkxNa01zVFVGQlRDeERRVUZaTEVWQlFWb3NSVUZCWjBKcFFpeGpRVUZqY2tRc1MwRkJPVUlzUTBGSVVDeEZRVWMyUXp0QlFVTXpRMkVzWlVGQlYydERMR1ZCUVdVc1EwRkJNVUlzUlVGQk5rSXZReXhMUVVFM1FpeEpRVUZ6UTNGRUxHTkJRV055UkN4TFFVRndSRHRCUVVOQllTeGxRVUZYZVVNc1IwRkJXRHRCUVVORU96dEJRVVZFTEZOQlFVOTZReXhWUVVGUU8wRkJRMFE3TzBGQlJVUXNVMEZCVTFrc1UwRkJWQ3hEUVVGdFFqaENMRWxCUVc1Q0xFVkJRWGxDTzBGQlEzWkNMRk5CUVU4c1JVRkJSVE5ETEZGQlFWRXlReXhMUVVGTE0wTXNUVUZCWml4RlFVRjFRa01zV1VGQldUQkRMRXRCUVVzeFF5eFZRVUZNTEVOQlFXZENiME1zUzBGQmFFSXNRMEZCYzBJc1EwRkJkRUlzUTBGQmJrTXNSVUZCVUR0QlFVTkVJaXdpWm1sc1pTSTZJbUpoYzJVdWFuTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUpsZUhCdmNuUWdaR1ZtWVhWc2RDQm1kVzVqZEdsdmJpQkVhV1ptS0NrZ2UzMWNibHh1UkdsbVppNXdjbTkwYjNSNWNHVWdQU0I3WEc0Z0lHUnBabVlvYjJ4a1UzUnlhVzVuTENCdVpYZFRkSEpwYm1jc0lHOXdkR2x2Ym5NZ1BTQjdmU2tnZTF4dUlDQWdJR3hsZENCallXeHNZbUZqYXlBOUlHOXdkR2x2Ym5NdVkyRnNiR0poWTJzN1hHNGdJQ0FnYVdZZ0tIUjVjR1Z2WmlCdmNIUnBiMjV6SUQwOVBTQW5ablZ1WTNScGIyNG5LU0I3WEc0Z0lDQWdJQ0JqWVd4c1ltRmpheUE5SUc5d2RHbHZibk03WEc0Z0lDQWdJQ0J2Y0hScGIyNXpJRDBnZTMwN1hHNGdJQ0FnZlZ4dUlDQWdJSFJvYVhNdWIzQjBhVzl1Y3lBOUlHOXdkR2x2Ym5NN1hHNWNiaUFnSUNCc1pYUWdjMlZzWmlBOUlIUm9hWE03WEc1Y2JpQWdJQ0JtZFc1amRHbHZiaUJrYjI1bEtIWmhiSFZsS1NCN1hHNGdJQ0FnSUNCcFppQW9ZMkZzYkdKaFkyc3BJSHRjYmlBZ0lDQWdJQ0FnYzJWMFZHbHRaVzkxZENobWRXNWpkR2x2YmlncElIc2dZMkZzYkdKaFkyc29kVzVrWldacGJtVmtMQ0IyWVd4MVpTazdJSDBzSURBcE8xeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2RISjFaVHRjYmlBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjJZV3gxWlR0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0F2THlCQmJHeHZkeUJ6ZFdKamJHRnpjMlZ6SUhSdklHMWhjM05oWjJVZ2RHaGxJR2x1Y0hWMElIQnlhVzl5SUhSdklISjFibTVwYm1kY2JpQWdJQ0J2YkdSVGRISnBibWNnUFNCMGFHbHpMbU5oYzNSSmJuQjFkQ2h2YkdSVGRISnBibWNwTzF4dUlDQWdJRzVsZDFOMGNtbHVaeUE5SUhSb2FYTXVZMkZ6ZEVsdWNIVjBLRzVsZDFOMGNtbHVaeWs3WEc1Y2JpQWdJQ0J2YkdSVGRISnBibWNnUFNCMGFHbHpMbkpsYlc5MlpVVnRjSFI1S0hSb2FYTXVkRzlyWlc1cGVtVW9iMnhrVTNSeWFXNW5LU2s3WEc0Z0lDQWdibVYzVTNSeWFXNW5JRDBnZEdocGN5NXlaVzF2ZG1WRmJYQjBlU2gwYUdsekxuUnZhMlZ1YVhwbEtHNWxkMU4wY21sdVp5a3BPMXh1WEc0Z0lDQWdiR1YwSUc1bGQweGxiaUE5SUc1bGQxTjBjbWx1Wnk1c1pXNW5kR2dzSUc5c1pFeGxiaUE5SUc5c1pGTjBjbWx1Wnk1c1pXNW5kR2c3WEc0Z0lDQWdiR1YwSUdWa2FYUk1aVzVuZEdnZ1BTQXhPMXh1SUNBZ0lHeGxkQ0J0WVhoRlpHbDBUR1Z1WjNSb0lEMGdibVYzVEdWdUlDc2diMnhrVEdWdU8xeHVJQ0FnSUd4bGRDQmlaWE4wVUdGMGFDQTlJRnQ3SUc1bGQxQnZjem9nTFRFc0lHTnZiWEJ2Ym1WdWRITTZJRnRkSUgxZE8xeHVYRzRnSUNBZ0x5OGdVMlZsWkNCbFpHbDBUR1Z1WjNSb0lEMGdNQ3dnYVM1bExpQjBhR1VnWTI5dWRHVnVkQ0J6ZEdGeWRITWdkMmwwYUNCMGFHVWdjMkZ0WlNCMllXeDFaWE5jYmlBZ0lDQnNaWFFnYjJ4a1VHOXpJRDBnZEdocGN5NWxlSFJ5WVdOMFEyOXRiVzl1S0dKbGMzUlFZWFJvV3pCZExDQnVaWGRUZEhKcGJtY3NJRzlzWkZOMGNtbHVaeXdnTUNrN1hHNGdJQ0FnYVdZZ0tHSmxjM1JRWVhSb1d6QmRMbTVsZDFCdmN5QXJJREVnUGowZ2JtVjNUR1Z1SUNZbUlHOXNaRkJ2Y3lBcklERWdQajBnYjJ4a1RHVnVLU0I3WEc0Z0lDQWdJQ0F2THlCSlpHVnVkR2wwZVNCd1pYSWdkR2hsSUdWeGRXRnNhWFI1SUdGdVpDQjBiMnRsYm1sNlpYSmNiaUFnSUNBZ0lISmxkSFZ5YmlCa2IyNWxLRnQ3ZG1Gc2RXVTZJSFJvYVhNdWFtOXBiaWh1WlhkVGRISnBibWNwTENCamIzVnVkRG9nYm1WM1UzUnlhVzVuTG14bGJtZDBhSDFkS1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0F2THlCTllXbHVJSGR2Y210bGNpQnRaWFJvYjJRdUlHTm9aV05yY3lCaGJHd2djR1Z5YlhWMFlYUnBiMjV6SUc5bUlHRWdaMmwyWlc0Z1pXUnBkQ0JzWlc1bmRHZ2dabTl5SUdGalkyVndkR0Z1WTJVdVhHNGdJQ0FnWm5WdVkzUnBiMjRnWlhobFkwVmthWFJNWlc1bmRHZ29LU0I3WEc0Z0lDQWdJQ0JtYjNJZ0tHeGxkQ0JrYVdGbmIyNWhiRkJoZEdnZ1BTQXRNU0FxSUdWa2FYUk1aVzVuZEdnN0lHUnBZV2R2Ym1Gc1VHRjBhQ0E4UFNCbFpHbDBUR1Z1WjNSb095QmthV0ZuYjI1aGJGQmhkR2dnS3owZ01pa2dlMXh1SUNBZ0lDQWdJQ0JzWlhRZ1ltRnpaVkJoZEdnN1hHNGdJQ0FnSUNBZ0lHeGxkQ0JoWkdSUVlYUm9JRDBnWW1WemRGQmhkR2hiWkdsaFoyOXVZV3hRWVhSb0lDMGdNVjBzWEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaVzF2ZG1WUVlYUm9JRDBnWW1WemRGQmhkR2hiWkdsaFoyOXVZV3hRWVhSb0lDc2dNVjBzWEc0Z0lDQWdJQ0FnSUNBZ0lDQnZiR1JRYjNNZ1BTQW9jbVZ0YjNabFVHRjBhQ0EvSUhKbGJXOTJaVkJoZEdndWJtVjNVRzl6SURvZ01Da2dMU0JrYVdGbmIyNWhiRkJoZEdnN1hHNGdJQ0FnSUNBZ0lHbG1JQ2hoWkdSUVlYUm9LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0x5OGdUbThnYjI1bElHVnNjMlVnYVhNZ1oyOXBibWNnZEc4Z1lYUjBaVzF3ZENCMGJ5QjFjMlVnZEdocGN5QjJZV3gxWlN3Z1kyeGxZWElnYVhSY2JpQWdJQ0FnSUNBZ0lDQmlaWE4wVUdGMGFGdGthV0ZuYjI1aGJGQmhkR2dnTFNBeFhTQTlJSFZ1WkdWbWFXNWxaRHRjYmlBZ0lDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNBZ0lHeGxkQ0JqWVc1QlpHUWdQU0JoWkdSUVlYUm9JQ1ltSUdGa1pGQmhkR2d1Ym1WM1VHOXpJQ3NnTVNBOElHNWxkMHhsYml4Y2JpQWdJQ0FnSUNBZ0lDQWdJR05oYmxKbGJXOTJaU0E5SUhKbGJXOTJaVkJoZEdnZ0ppWWdNQ0E4UFNCdmJHUlFiM01nSmlZZ2IyeGtVRzl6SUR3Z2IyeGtUR1Z1TzF4dUlDQWdJQ0FnSUNCcFppQW9JV05oYmtGa1pDQW1KaUFoWTJGdVVtVnRiM1psS1NCN1hHNGdJQ0FnSUNBZ0lDQWdMeThnU1dZZ2RHaHBjeUJ3WVhSb0lHbHpJR0VnZEdWeWJXbHVZV3dnZEdobGJpQndjblZ1WlZ4dUlDQWdJQ0FnSUNBZ0lHSmxjM1JRWVhSb1cyUnBZV2R2Ym1Gc1VHRjBhRjBnUFNCMWJtUmxabWx1WldRN1hHNGdJQ0FnSUNBZ0lDQWdZMjl1ZEdsdWRXVTdYRzRnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNBdkx5QlRaV3hsWTNRZ2RHaGxJR1JwWVdkdmJtRnNJSFJvWVhRZ2QyVWdkMkZ1ZENCMGJ5QmljbUZ1WTJnZ1puSnZiUzRnVjJVZ2MyVnNaV04wSUhSb1pTQndjbWx2Y2x4dUlDQWdJQ0FnSUNBdkx5QndZWFJvSUhkb2IzTmxJSEJ2YzJsMGFXOXVJR2x1SUhSb1pTQnVaWGNnYzNSeWFXNW5JR2x6SUhSb1pTQm1ZWEowYUdWemRDQm1jbTl0SUhSb1pTQnZjbWxuYVc1Y2JpQWdJQ0FnSUNBZ0x5OGdZVzVrSUdSdlpYTWdibTkwSUhCaGMzTWdkR2hsSUdKdmRXNWtjeUJ2WmlCMGFHVWdaR2xtWmlCbmNtRndhRnh1SUNBZ0lDQWdJQ0JwWmlBb0lXTmhia0ZrWkNCOGZDQW9ZMkZ1VW1WdGIzWmxJQ1ltSUdGa1pGQmhkR2d1Ym1WM1VHOXpJRHdnY21WdGIzWmxVR0YwYUM1dVpYZFFiM01wS1NCN1hHNGdJQ0FnSUNBZ0lDQWdZbUZ6WlZCaGRHZ2dQU0JqYkc5dVpWQmhkR2dvY21WdGIzWmxVR0YwYUNrN1hHNGdJQ0FnSUNBZ0lDQWdjMlZzWmk1d2RYTm9RMjl0Y0c5dVpXNTBLR0poYzJWUVlYUm9MbU52YlhCdmJtVnVkSE1zSUhWdVpHVm1hVzVsWkN3Z2RISjFaU2s3WEc0Z0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ1ltRnpaVkJoZEdnZ1BTQmhaR1JRWVhSb095QWdJQzh2SUU1dklHNWxaV1FnZEc4Z1kyeHZibVVzSUhkbEozWmxJSEIxYkd4bFpDQnBkQ0JtY205dElIUm9aU0JzYVhOMFhHNGdJQ0FnSUNBZ0lDQWdZbUZ6WlZCaGRHZ3VibVYzVUc5ekt5czdYRzRnSUNBZ0lDQWdJQ0FnYzJWc1ppNXdkWE5vUTI5dGNHOXVaVzUwS0dKaGMyVlFZWFJvTG1OdmJYQnZibVZ1ZEhNc0lIUnlkV1VzSUhWdVpHVm1hVzVsWkNrN1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0J2YkdSUWIzTWdQU0J6Wld4bUxtVjRkSEpoWTNSRGIyMXRiMjRvWW1GelpWQmhkR2dzSUc1bGQxTjBjbWx1Wnl3Z2IyeGtVM1J5YVc1bkxDQmthV0ZuYjI1aGJGQmhkR2dwTzF4dVhHNGdJQ0FnSUNBZ0lDOHZJRWxtSUhkbElHaGhkbVVnYUdsMElIUm9aU0JsYm1RZ2IyWWdZbTkwYUNCemRISnBibWR6TENCMGFHVnVJSGRsSUdGeVpTQmtiMjVsWEc0Z0lDQWdJQ0FnSUdsbUlDaGlZWE5sVUdGMGFDNXVaWGRRYjNNZ0t5QXhJRDQ5SUc1bGQweGxiaUFtSmlCdmJHUlFiM01nS3lBeElENDlJRzlzWkV4bGJpa2dlMXh1SUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJrYjI1bEtHSjFhV3hrVm1Gc2RXVnpLSE5sYkdZc0lHSmhjMlZRWVhSb0xtTnZiWEJ2Ym1WdWRITXNJRzVsZDFOMGNtbHVaeXdnYjJ4a1UzUnlhVzVuTENCelpXeG1MblZ6WlV4dmJtZGxjM1JVYjJ0bGJpa3BPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUM4dklFOTBhR1Z5ZDJselpTQjBjbUZqYXlCMGFHbHpJSEJoZEdnZ1lYTWdZU0J3YjNSbGJuUnBZV3dnWTJGdVpHbGtZWFJsSUdGdVpDQmpiMjUwYVc1MVpTNWNiaUFnSUNBZ0lDQWdJQ0JpWlhOMFVHRjBhRnRrYVdGbmIyNWhiRkJoZEdoZElEMGdZbUZ6WlZCaGRHZzdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnWldScGRFeGxibWQwYUNzck8xeHVJQ0FnSUgxY2JseHVJQ0FnSUM4dklGQmxjbVp2Y20xeklIUm9aU0JzWlc1bmRHZ2diMllnWldScGRDQnBkR1Z5WVhScGIyNHVJRWx6SUdFZ1ltbDBJR1oxWjJ4NUlHRnpJSFJvYVhNZ2FHRnpJSFJ2SUhOMWNIQnZjblFnZEdobFhHNGdJQ0FnTHk4Z2MzbHVZeUJoYm1RZ1lYTjVibU1nYlc5a1pTQjNhR2xqYUNCcGN5QnVaWFpsY2lCbWRXNHVJRXh2YjNCeklHOTJaWElnWlhobFkwVmthWFJNWlc1bmRHZ2dkVzUwYVd3Z1lTQjJZV3gxWlZ4dUlDQWdJQzh2SUdseklIQnliMlIxWTJWa0xseHVJQ0FnSUdsbUlDaGpZV3hzWW1GamF5a2dlMXh1SUNBZ0lDQWdLR1oxYm1OMGFXOXVJR1Y0WldNb0tTQjdYRzRnSUNBZ0lDQWdJSE5sZEZScGJXVnZkWFFvWm5WdVkzUnBiMjRvS1NCN1hHNGdJQ0FnSUNBZ0lDQWdMeThnVkdocGN5QnphRzkxYkdRZ2JtOTBJR2hoY0hCbGJpd2dZblYwSUhkbElIZGhiblFnZEc4Z1ltVWdjMkZtWlM1Y2JpQWdJQ0FnSUNBZ0lDQXZLaUJwYzNSaGJtSjFiQ0JwWjI1dmNtVWdibVY0ZENBcUwxeHVJQ0FnSUNBZ0lDQWdJR2xtSUNobFpHbDBUR1Z1WjNSb0lENGdiV0Y0UldScGRFeGxibWQwYUNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR05oYkd4aVlXTnJLQ2s3WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJQ0FnYVdZZ0tDRmxlR1ZqUldScGRFeGxibWQwYUNncEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCbGVHVmpLQ2s3WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQjlMQ0F3S1R0Y2JpQWdJQ0FnSUgwb0tTazdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUhkb2FXeGxJQ2hsWkdsMFRHVnVaM1JvSUR3OUlHMWhlRVZrYVhSTVpXNW5kR2dwSUh0Y2JpQWdJQ0FnSUNBZ2JHVjBJSEpsZENBOUlHVjRaV05GWkdsMFRHVnVaM1JvS0NrN1hHNGdJQ0FnSUNBZ0lHbG1JQ2h5WlhRcElIdGNiaUFnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdjbVYwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQjlMRnh1WEc0Z0lIQjFjMmhEYjIxd2IyNWxiblFvWTI5dGNHOXVaVzUwY3l3Z1lXUmtaV1FzSUhKbGJXOTJaV1FwSUh0Y2JpQWdJQ0JzWlhRZ2JHRnpkQ0E5SUdOdmJYQnZibVZ1ZEhOYlkyOXRjRzl1Wlc1MGN5NXNaVzVuZEdnZ0xTQXhYVHRjYmlBZ0lDQnBaaUFvYkdGemRDQW1KaUJzWVhOMExtRmtaR1ZrSUQwOVBTQmhaR1JsWkNBbUppQnNZWE4wTG5KbGJXOTJaV1FnUFQwOUlISmxiVzkyWldRcElIdGNiaUFnSUNBZ0lDOHZJRmRsSUc1bFpXUWdkRzhnWTJ4dmJtVWdhR1Z5WlNCaGN5QjBhR1VnWTI5dGNHOXVaVzUwSUdOc2IyNWxJRzl3WlhKaGRHbHZiaUJwY3lCcWRYTjBYRzRnSUNBZ0lDQXZMeUJoY3lCemFHRnNiRzkzSUdGeWNtRjVJR05zYjI1bFhHNGdJQ0FnSUNCamIyMXdiMjVsYm5SelcyTnZiWEJ2Ym1WdWRITXViR1Z1WjNSb0lDMGdNVjBnUFNCN1kyOTFiblE2SUd4aGMzUXVZMjkxYm5RZ0t5QXhMQ0JoWkdSbFpEb2dZV1JrWldRc0lISmxiVzkyWldRNklISmxiVzkyWldRZ2ZUdGNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnWTI5dGNHOXVaVzUwY3k1d2RYTm9LSHRqYjNWdWREb2dNU3dnWVdSa1pXUTZJR0ZrWkdWa0xDQnlaVzF2ZG1Wa09pQnlaVzF2ZG1Wa0lIMHBPMXh1SUNBZ0lIMWNiaUFnZlN4Y2JpQWdaWGgwY21GamRFTnZiVzF2YmloaVlYTmxVR0YwYUN3Z2JtVjNVM1J5YVc1bkxDQnZiR1JUZEhKcGJtY3NJR1JwWVdkdmJtRnNVR0YwYUNrZ2UxeHVJQ0FnSUd4bGRDQnVaWGRNWlc0Z1BTQnVaWGRUZEhKcGJtY3ViR1Z1WjNSb0xGeHVJQ0FnSUNBZ0lDQnZiR1JNWlc0Z1BTQnZiR1JUZEhKcGJtY3ViR1Z1WjNSb0xGeHVJQ0FnSUNBZ0lDQnVaWGRRYjNNZ1BTQmlZWE5sVUdGMGFDNXVaWGRRYjNNc1hHNGdJQ0FnSUNBZ0lHOXNaRkJ2Y3lBOUlHNWxkMUJ2Y3lBdElHUnBZV2R2Ym1Gc1VHRjBhQ3hjYmx4dUlDQWdJQ0FnSUNCamIyMXRiMjVEYjNWdWRDQTlJREE3WEc0Z0lDQWdkMmhwYkdVZ0tHNWxkMUJ2Y3lBcklERWdQQ0J1WlhkTVpXNGdKaVlnYjJ4a1VHOXpJQ3NnTVNBOElHOXNaRXhsYmlBbUppQjBhR2x6TG1WeGRXRnNjeWh1WlhkVGRISnBibWRiYm1WM1VHOXpJQ3NnTVYwc0lHOXNaRk4wY21sdVoxdHZiR1JRYjNNZ0t5QXhYU2twSUh0Y2JpQWdJQ0FnSUc1bGQxQnZjeXNyTzF4dUlDQWdJQ0FnYjJ4a1VHOXpLeXM3WEc0Z0lDQWdJQ0JqYjIxdGIyNURiM1Z1ZENzck8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdsbUlDaGpiMjF0YjI1RGIzVnVkQ2tnZTF4dUlDQWdJQ0FnWW1GelpWQmhkR2d1WTI5dGNHOXVaVzUwY3k1d2RYTm9LSHRqYjNWdWREb2dZMjl0Ylc5dVEyOTFiblI5S1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JpWVhObFVHRjBhQzV1WlhkUWIzTWdQU0J1WlhkUWIzTTdYRzRnSUNBZ2NtVjBkWEp1SUc5c1pGQnZjenRjYmlBZ2ZTeGNibHh1SUNCbGNYVmhiSE1vYkdWbWRDd2djbWxuYUhRcElIdGNiaUFnSUNCcFppQW9kR2hwY3k1dmNIUnBiMjV6TG1OdmJYQmhjbUYwYjNJcElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMbTl3ZEdsdmJuTXVZMjl0Y0dGeVlYUnZjaWhzWldaMExDQnlhV2RvZENrN1hHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQnNaV1owSUQwOVBTQnlhV2RvZEZ4dUlDQWdJQ0FnSUNCOGZDQW9kR2hwY3k1dmNIUnBiMjV6TG1sbmJtOXlaVU5oYzJVZ0ppWWdiR1ZtZEM1MGIweHZkMlZ5UTJGelpTZ3BJRDA5UFNCeWFXZG9kQzUwYjB4dmQyVnlRMkZ6WlNncEtUdGNiaUFnSUNCOVhHNGdJSDBzWEc0Z0lISmxiVzkyWlVWdGNIUjVLR0Z5Y21GNUtTQjdYRzRnSUNBZ2JHVjBJSEpsZENBOUlGdGRPMXh1SUNBZ0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dZWEp5WVhrdWJHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQWdJR2xtSUNoaGNuSmhlVnRwWFNrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFF1Y0hWemFDaGhjbkpoZVZ0cFhTazdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVJQ0FnSUhKbGRIVnliaUJ5WlhRN1hHNGdJSDBzWEc0Z0lHTmhjM1JKYm5CMWRDaDJZV3gxWlNrZ2UxeHVJQ0FnSUhKbGRIVnliaUIyWVd4MVpUdGNiaUFnZlN4Y2JpQWdkRzlyWlc1cGVtVW9kbUZzZFdVcElIdGNiaUFnSUNCeVpYUjFjbTRnZG1Gc2RXVXVjM0JzYVhRb0p5Y3BPMXh1SUNCOUxGeHVJQ0JxYjJsdUtHTm9ZWEp6S1NCN1hHNGdJQ0FnY21WMGRYSnVJR05vWVhKekxtcHZhVzRvSnljcE8xeHVJQ0I5WEc1OU8xeHVYRzVtZFc1amRHbHZiaUJpZFdsc1pGWmhiSFZsY3loa2FXWm1MQ0JqYjIxd2IyNWxiblJ6TENCdVpYZFRkSEpwYm1jc0lHOXNaRk4wY21sdVp5d2dkWE5sVEc5dVoyVnpkRlJ2YTJWdUtTQjdYRzRnSUd4bGRDQmpiMjF3YjI1bGJuUlFiM01nUFNBd0xGeHVJQ0FnSUNBZ1kyOXRjRzl1Wlc1MFRHVnVJRDBnWTI5dGNHOXVaVzUwY3k1c1pXNW5kR2dzWEc0Z0lDQWdJQ0J1WlhkUWIzTWdQU0F3TEZ4dUlDQWdJQ0FnYjJ4a1VHOXpJRDBnTUR0Y2JseHVJQ0JtYjNJZ0tEc2dZMjl0Y0c5dVpXNTBVRzl6SUR3Z1kyOXRjRzl1Wlc1MFRHVnVPeUJqYjIxd2IyNWxiblJRYjNNckt5a2dlMXh1SUNBZ0lHeGxkQ0JqYjIxd2IyNWxiblFnUFNCamIyMXdiMjVsYm5SelcyTnZiWEJ2Ym1WdWRGQnZjMTA3WEc0Z0lDQWdhV1lnS0NGamIyMXdiMjVsYm5RdWNtVnRiM1psWkNrZ2UxeHVJQ0FnSUNBZ2FXWWdLQ0ZqYjIxd2IyNWxiblF1WVdSa1pXUWdKaVlnZFhObFRHOXVaMlZ6ZEZSdmEyVnVLU0I3WEc0Z0lDQWdJQ0FnSUd4bGRDQjJZV3gxWlNBOUlHNWxkMU4wY21sdVp5NXpiR2xqWlNodVpYZFFiM01zSUc1bGQxQnZjeUFySUdOdmJYQnZibVZ1ZEM1amIzVnVkQ2s3WEc0Z0lDQWdJQ0FnSUhaaGJIVmxJRDBnZG1Gc2RXVXViV0Z3S0daMWJtTjBhVzl1S0haaGJIVmxMQ0JwS1NCN1hHNGdJQ0FnSUNBZ0lDQWdiR1YwSUc5c1pGWmhiSFZsSUQwZ2IyeGtVM1J5YVc1blcyOXNaRkJ2Y3lBcklHbGRPMXh1SUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJ2YkdSV1lXeDFaUzVzWlc1bmRHZ2dQaUIyWVd4MVpTNXNaVzVuZEdnZ1B5QnZiR1JXWVd4MVpTQTZJSFpoYkhWbE8xeHVJQ0FnSUNBZ0lDQjlLVHRjYmx4dUlDQWdJQ0FnSUNCamIyMXdiMjVsYm5RdWRtRnNkV1VnUFNCa2FXWm1MbXB2YVc0b2RtRnNkV1VwTzF4dUlDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnWTI5dGNHOXVaVzUwTG5aaGJIVmxJRDBnWkdsbVppNXFiMmx1S0c1bGQxTjBjbWx1Wnk1emJHbGpaU2h1WlhkUWIzTXNJRzVsZDFCdmN5QXJJR052YlhCdmJtVnVkQzVqYjNWdWRDa3BPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdibVYzVUc5eklDczlJR052YlhCdmJtVnVkQzVqYjNWdWREdGNibHh1SUNBZ0lDQWdMeThnUTI5dGJXOXVJR05oYzJWY2JpQWdJQ0FnSUdsbUlDZ2hZMjl0Y0c5dVpXNTBMbUZrWkdWa0tTQjdYRzRnSUNBZ0lDQWdJRzlzWkZCdmN5QXJQU0JqYjIxd2IyNWxiblF1WTI5MWJuUTdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUdOdmJYQnZibVZ1ZEM1MllXeDFaU0E5SUdScFptWXVhbTlwYmlodmJHUlRkSEpwYm1jdWMyeHBZMlVvYjJ4a1VHOXpMQ0J2YkdSUWIzTWdLeUJqYjIxd2IyNWxiblF1WTI5MWJuUXBLVHRjYmlBZ0lDQWdJRzlzWkZCdmN5QXJQU0JqYjIxd2IyNWxiblF1WTI5MWJuUTdYRzVjYmlBZ0lDQWdJQzh2SUZKbGRtVnljMlVnWVdSa0lHRnVaQ0J5WlcxdmRtVWdjMjhnY21WdGIzWmxjeUJoY21VZ2IzVjBjSFYwSUdacGNuTjBJSFJ2SUcxaGRHTm9JR052YlcxdmJpQmpiMjUyWlc1MGFXOXVYRzRnSUNBZ0lDQXZMeUJVYUdVZ1pHbG1abWx1WnlCaGJHZHZjbWwwYUcwZ2FYTWdkR2xsWkNCMGJ5QmhaR1FnZEdobGJpQnlaVzF2ZG1VZ2IzVjBjSFYwSUdGdVpDQjBhR2x6SUdseklIUm9aU0J6YVcxd2JHVnpkRnh1SUNBZ0lDQWdMeThnY205MWRHVWdkRzhnWjJWMElIUm9aU0JrWlhOcGNtVmtJRzkxZEhCMWRDQjNhWFJvSUcxcGJtbHRZV3dnYjNabGNtaGxZV1F1WEc0Z0lDQWdJQ0JwWmlBb1kyOXRjRzl1Wlc1MFVHOXpJQ1ltSUdOdmJYQnZibVZ1ZEhOYlkyOXRjRzl1Wlc1MFVHOXpJQzBnTVYwdVlXUmtaV1FwSUh0Y2JpQWdJQ0FnSUNBZ2JHVjBJSFJ0Y0NBOUlHTnZiWEJ2Ym1WdWRITmJZMjl0Y0c5dVpXNTBVRzl6SUMwZ01WMDdYRzRnSUNBZ0lDQWdJR052YlhCdmJtVnVkSE5iWTI5dGNHOXVaVzUwVUc5eklDMGdNVjBnUFNCamIyMXdiMjVsYm5SelcyTnZiWEJ2Ym1WdWRGQnZjMTA3WEc0Z0lDQWdJQ0FnSUdOdmJYQnZibVZ1ZEhOYlkyOXRjRzl1Wlc1MFVHOXpYU0E5SUhSdGNEdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQXZMeUJUY0dWamFXRnNJR05oYzJVZ2FHRnVaR3hsSUdadmNpQjNhR1Z1SUc5dVpTQjBaWEp0YVc1aGJDQnBjeUJwWjI1dmNtVmtJQ2hwTG1VdUlIZG9hWFJsYzNCaFkyVXBMbHh1SUNBdkx5QkdiM0lnZEdocGN5QmpZWE5sSUhkbElHMWxjbWRsSUhSb1pTQjBaWEp0YVc1aGJDQnBiblJ2SUhSb1pTQndjbWx2Y2lCemRISnBibWNnWVc1a0lHUnliM0FnZEdobElHTm9ZVzVuWlM1Y2JpQWdMeThnVkdocGN5QnBjeUJ2Ym14NUlHRjJZV2xzWVdKc1pTQm1iM0lnYzNSeWFXNW5JRzF2WkdVdVhHNGdJR3hsZENCc1lYTjBRMjl0Y0c5dVpXNTBJRDBnWTI5dGNHOXVaVzUwYzF0amIyMXdiMjVsYm5STVpXNGdMU0F4WFR0Y2JpQWdhV1lnS0dOdmJYQnZibVZ1ZEV4bGJpQStJREZjYmlBZ0lDQWdJQ1ltSUhSNWNHVnZaaUJzWVhOMFEyOXRjRzl1Wlc1MExuWmhiSFZsSUQwOVBTQW5jM1J5YVc1bkoxeHVJQ0FnSUNBZ0ppWWdLR3hoYzNSRGIyMXdiMjVsYm5RdVlXUmtaV1FnZkh3Z2JHRnpkRU52YlhCdmJtVnVkQzV5WlcxdmRtVmtLVnh1SUNBZ0lDQWdKaVlnWkdsbVppNWxjWFZoYkhNb0p5Y3NJR3hoYzNSRGIyMXdiMjVsYm5RdWRtRnNkV1VwS1NCN1hHNGdJQ0FnWTI5dGNHOXVaVzUwYzF0amIyMXdiMjVsYm5STVpXNGdMU0F5WFM1MllXeDFaU0FyUFNCc1lYTjBRMjl0Y0c5dVpXNTBMblpoYkhWbE8xeHVJQ0FnSUdOdmJYQnZibVZ1ZEhNdWNHOXdLQ2s3WEc0Z0lIMWNibHh1SUNCeVpYUjFjbTRnWTI5dGNHOXVaVzUwY3p0Y2JuMWNibHh1Wm5WdVkzUnBiMjRnWTJ4dmJtVlFZWFJvS0hCaGRHZ3BJSHRjYmlBZ2NtVjBkWEp1SUhzZ2JtVjNVRzl6T2lCd1lYUm9MbTVsZDFCdmN5d2dZMjl0Y0c5dVpXNTBjem9nY0dGMGFDNWpiMjF3YjI1bGJuUnpMbk5zYVdObEtEQXBJSDA3WEc1OVhHNGlYWDA9XG5cblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyd1c2Ugc3RyaWN0JztcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLmNoYXJhY3RlckRpZmYgPSB1bmRlZmluZWQ7XG5cdGV4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZkNoYXJzID0gZGlmZkNoYXJzO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2Jhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2Jhc2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYmFzZSk7XG5cblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5cdC8qaXN0YW5idWwgaWdub3JlIGVuZCovdmFyIGNoYXJhY3RlckRpZmYgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jaGFyYWN0ZXJEaWZmID0gbmV3IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fYmFzZTJbJ2RlZmF1bHQnXSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLygpO1xuXHRmdW5jdGlvbiBkaWZmQ2hhcnMob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpIHtcblx0ICByZXR1cm4gY2hhcmFjdGVyRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcblx0fVxuXHQvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTlrYVdabUwyTm9ZWEpoWTNSbGNpNXFjeUpkTENKdVlXMWxjeUk2V3lKa2FXWm1RMmhoY25NaUxDSmphR0Z5WVdOMFpYSkVhV1ptSWl3aWIyeGtVM1J5SWl3aWJtVjNVM1J5SWl3aWIzQjBhVzl1Y3lJc0ltUnBabVlpWFN3aWJXRndjR2x1WjNNaU9pSTdPenM3WjBOQlIyZENRU3hUTEVkQlFVRkJMRk03TzBGQlNHaENPenM3T3pzN2RVSkJSVThzU1VGQlRVTXNlVVpCUVdkQ0xIZEZRVUYwUWp0QlFVTkJMRk5CUVZORUxGTkJRVlFzUTBGQmJVSkZMRTFCUVc1Q0xFVkJRVEpDUXl4TlFVRXpRaXhGUVVGdFEwTXNUMEZCYmtNc1JVRkJORU03UVVGQlJTeFRRVUZQU0N4alFVRmpTU3hKUVVGa0xFTkJRVzFDU0N4TlFVRnVRaXhGUVVFeVFrTXNUVUZCTTBJc1JVRkJiVU5ETEU5QlFXNURMRU5CUVZBN1FVRkJjVVFpTENKbWFXeGxJam9pWTJoaGNtRmpkR1Z5TG1weklpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lhVzF3YjNKMElFUnBabVlnWm5KdmJTQW5MaTlpWVhObEp6dGNibHh1Wlhod2IzSjBJR052Ym5OMElHTm9ZWEpoWTNSbGNrUnBabVlnUFNCdVpYY2dSR2xtWmlncE8xeHVaWGh3YjNKMElHWjFibU4wYVc5dUlHUnBabVpEYUdGeWN5aHZiR1JUZEhJc0lHNWxkMU4wY2l3Z2IzQjBhVzl1Y3lrZ2V5QnlaWFIxY200Z1kyaGhjbUZqZEdWeVJHbG1aaTVrYVdabUtHOXNaRk4wY2l3Z2JtVjNVM1J5TENCdmNIUnBiMjV6S1RzZ2ZWeHVJbDE5XG5cblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyd1c2Ugc3RyaWN0JztcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLndvcmREaWZmID0gdW5kZWZpbmVkO1xuXHRleHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2RpZmZXb3JkcyA9IGRpZmZXb3Jkcztcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZldvcmRzV2l0aFNwYWNlID0gZGlmZldvcmRzV2l0aFNwYWNlO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2Jhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2Jhc2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYmFzZSk7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgZW5kKi92YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19wYXJhbXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8gLy8gQmFzZWQgb24gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW5fc2NyaXB0X2luX1VuaWNvZGVcblx0Ly9cblx0Ly8gUmFuZ2VzIGFuZCBleGNlcHRpb25zOlxuXHQvLyBMYXRpbi0xIFN1cHBsZW1lbnQsIDAwODDigJMwMEZGXG5cdC8vICAtIFUrMDBENyAgw5cgTXVsdGlwbGljYXRpb24gc2lnblxuXHQvLyAgLSBVKzAwRjcgIMO3IERpdmlzaW9uIHNpZ25cblx0Ly8gTGF0aW4gRXh0ZW5kZWQtQSwgMDEwMOKAkzAxN0Zcblx0Ly8gTGF0aW4gRXh0ZW5kZWQtQiwgMDE4MOKAkzAyNEZcblx0Ly8gSVBBIEV4dGVuc2lvbnMsIDAyNTDigJMwMkFGXG5cdC8vIFNwYWNpbmcgTW9kaWZpZXIgTGV0dGVycywgMDJCMOKAkzAyRkZcblx0Ly8gIC0gVSswMkM3ICDLhyAmIzcxMTsgIENhcm9uXG5cdC8vICAtIFUrMDJEOCAgy5ggJiM3Mjg7ICBCcmV2ZVxuXHQvLyAgLSBVKzAyRDkgIMuZICYjNzI5OyAgRG90IEFib3ZlXG5cdC8vICAtIFUrMDJEQSAgy5ogJiM3MzA7ICBSaW5nIEFib3ZlXG5cdC8vICAtIFUrMDJEQiAgy5sgJiM3MzE7ICBPZ29uZWtcblx0Ly8gIC0gVSswMkRDICDLnCAmIzczMjsgIFNtYWxsIFRpbGRlXG5cdC8vICAtIFUrMDJERCAgy50gJiM3MzM7ICBEb3VibGUgQWN1dGUgQWNjZW50XG5cdC8vIExhdGluIEV4dGVuZGVkIEFkZGl0aW9uYWwsIDFFMDDigJMxRUZGXG5cdHZhciBleHRlbmRlZFdvcmRDaGFycyA9IC9eW0EtWmEtelxceEMwLVxcdTAyQzZcXHUwMkM4LVxcdTAyRDdcXHUwMkRFLVxcdTAyRkZcXHUxRTAwLVxcdTFFRkZdKyQvO1xuXG5cdHZhciByZVdoaXRlc3BhY2UgPSAvXFxTLztcblxuXHR2YXIgd29yZERpZmYgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi93b3JkRGlmZiA9IG5ldyAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2Jhc2UyWydkZWZhdWx0J10gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8oKTtcblx0d29yZERpZmYuZXF1YWxzID0gZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7XG5cdCAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVDYXNlKSB7XG5cdCAgICBsZWZ0ID0gbGVmdC50b0xvd2VyQ2FzZSgpO1xuXHQgICAgcmlnaHQgPSByaWdodC50b0xvd2VyQ2FzZSgpO1xuXHQgIH1cblx0ICByZXR1cm4gbGVmdCA9PT0gcmlnaHQgfHwgdGhpcy5vcHRpb25zLmlnbm9yZVdoaXRlc3BhY2UgJiYgIXJlV2hpdGVzcGFjZS50ZXN0KGxlZnQpICYmICFyZVdoaXRlc3BhY2UudGVzdChyaWdodCk7XG5cdH07XG5cdHdvcmREaWZmLnRva2VuaXplID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgdmFyIHRva2VucyA9IHZhbHVlLnNwbGl0KC8oXFxzK3xcXGIpLyk7XG5cblx0ICAvLyBKb2luIHRoZSBib3VuZGFyeSBzcGxpdHMgdGhhdCB3ZSBkbyBub3QgY29uc2lkZXIgdG8gYmUgYm91bmRhcmllcy4gVGhpcyBpcyBwcmltYXJpbHkgdGhlIGV4dGVuZGVkIExhdGluIGNoYXJhY3RlciBzZXQuXG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoIC0gMTsgaSsrKSB7XG5cdCAgICAvLyBJZiB3ZSBoYXZlIGFuIGVtcHR5IHN0cmluZyBpbiB0aGUgbmV4dCBmaWVsZCBhbmQgd2UgaGF2ZSBvbmx5IHdvcmQgY2hhcnMgYmVmb3JlIGFuZCBhZnRlciwgbWVyZ2Vcblx0ICAgIGlmICghdG9rZW5zW2kgKyAxXSAmJiB0b2tlbnNbaSArIDJdICYmIGV4dGVuZGVkV29yZENoYXJzLnRlc3QodG9rZW5zW2ldKSAmJiBleHRlbmRlZFdvcmRDaGFycy50ZXN0KHRva2Vuc1tpICsgMl0pKSB7XG5cdCAgICAgIHRva2Vuc1tpXSArPSB0b2tlbnNbaSArIDJdO1xuXHQgICAgICB0b2tlbnMuc3BsaWNlKGkgKyAxLCAyKTtcblx0ICAgICAgaS0tO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHJldHVybiB0b2tlbnM7XG5cdH07XG5cblx0ZnVuY3Rpb24gZGlmZldvcmRzKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKSB7XG5cdCAgb3B0aW9ucyA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oMCwgX3BhcmFtcy5nZW5lcmF0ZU9wdGlvbnMpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovKG9wdGlvbnMsIHsgaWdub3JlV2hpdGVzcGFjZTogdHJ1ZSB9KTtcblx0ICByZXR1cm4gd29yZERpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG5cdH1cblxuXHRmdW5jdGlvbiBkaWZmV29yZHNXaXRoU3BhY2Uob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpIHtcblx0ICByZXR1cm4gd29yZERpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG5cdH1cblx0Ly8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5a2FXWm1MM2R2Y21RdWFuTWlYU3dpYm1GdFpYTWlPbHNpWkdsbVpsZHZjbVJ6SWl3aVpHbG1abGR2Y21SelYybDBhRk53WVdObElpd2laWGgwWlc1a1pXUlhiM0prUTJoaGNuTWlMQ0p5WlZkb2FYUmxjM0JoWTJVaUxDSjNiM0prUkdsbVppSXNJbVZ4ZFdGc2N5SXNJbXhsWm5RaUxDSnlhV2RvZENJc0ltOXdkR2x2Ym5NaUxDSnBaMjV2Y21WRFlYTmxJaXdpZEc5TWIzZGxja05oYzJVaUxDSnBaMjV2Y21WWGFHbDBaWE53WVdObElpd2lkR1Z6ZENJc0luUnZhMlZ1YVhwbElpd2lkbUZzZFdVaUxDSjBiMnRsYm5NaUxDSnpjR3hwZENJc0lta2lMQ0pzWlc1bmRHZ2lMQ0p6Y0d4cFkyVWlMQ0p2YkdSVGRISWlMQ0p1WlhkVGRISWlMQ0prYVdabUlsMHNJbTFoY0hCcGJtZHpJam9pT3pzN08yZERRVzFFWjBKQkxGTXNSMEZCUVVFc1V6dDVSRUZMUVVNc2EwSXNSMEZCUVVFc2EwSTdPMEZCZUVSb1FqczdPenQxUWtGRFFUczdPenQzUWtGRlFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFTeEpRVUZOUXl4dlFrRkJiMElzSzBSQlFURkNPenRCUVVWQkxFbEJRVTFETEdWQlFXVXNTVUZCY2tJN08wRkJSVThzU1VGQlRVTXNLMFZCUVZjc2QwVkJRV3BDTzBGQlExQkJMRk5CUVZORExFMUJRVlFzUjBGQmEwSXNWVUZCVTBNc1NVRkJWQ3hGUVVGbFF5eExRVUZtTEVWQlFYTkNPMEZCUTNSRExFMUJRVWtzUzBGQlMwTXNUMEZCVEN4RFFVRmhReXhWUVVGcVFpeEZRVUUyUWp0QlFVTXpRa2dzVjBGQlQwRXNTMEZCUzBrc1YwRkJUQ3hGUVVGUU8wRkJRMEZJTEZsQlFWRkJMRTFCUVUxSExGZEJRVTRzUlVGQlVqdEJRVU5FTzBGQlEwUXNVMEZCVDBvc1UwRkJVME1zUzBGQlZDeEpRVUZ0UWl4TFFVRkxReXhQUVVGTUxFTkJRV0ZITEdkQ1FVRmlMRWxCUVdsRExFTkJRVU5TTEdGQlFXRlRMRWxCUVdJc1EwRkJhMEpPTEVsQlFXeENMRU5CUVd4RExFbEJRVFpFTEVOQlFVTklMR0ZCUVdGVExFbEJRV0lzUTBGQmEwSk1MRXRCUVd4Q0xFTkJRWGhHTzBGQlEwUXNRMEZPUkR0QlFVOUJTQ3hUUVVGVFV5eFJRVUZVTEVkQlFXOUNMRlZCUVZORExFdEJRVlFzUlVGQlowSTdRVUZEYkVNc1RVRkJTVU1zVTBGQlUwUXNUVUZCVFVVc1MwRkJUaXhEUVVGWkxGVkJRVm9zUTBGQllqczdRVUZGUVR0QlFVTkJMRTlCUVVzc1NVRkJTVU1zU1VGQlNTeERRVUZpTEVWQlFXZENRU3hKUVVGSlJpeFBRVUZQUnl4TlFVRlFMRWRCUVdkQ0xFTkJRWEJETEVWQlFYVkRSQ3hIUVVGMlF5eEZRVUUwUXp0QlFVTXhRenRCUVVOQkxGRkJRVWtzUTBGQlEwWXNUMEZCVDBVc1NVRkJTU3hEUVVGWUxFTkJRVVFzU1VGQmEwSkdMRTlCUVU5RkxFbEJRVWtzUTBGQldDeERRVUZzUWl4SlFVTkxaaXhyUWtGQmEwSlZMRWxCUVd4Q0xFTkJRWFZDUnl4UFFVRlBSU3hEUVVGUUxFTkJRWFpDTEVOQlJFd3NTVUZGUzJZc2EwSkJRV3RDVlN4SlFVRnNRaXhEUVVGMVFrY3NUMEZCVDBVc1NVRkJTU3hEUVVGWUxFTkJRWFpDTEVOQlJsUXNSVUZGWjBRN1FVRkRPVU5HTEdGQlFVOUZMRU5CUVZBc1MwRkJZVVlzVDBGQlQwVXNTVUZCU1N4RFFVRllMRU5CUVdJN1FVRkRRVVlzWVVGQlQwa3NUVUZCVUN4RFFVRmpSaXhKUVVGSkxFTkJRV3hDTEVWQlFYRkNMRU5CUVhKQ08wRkJRMEZCTzBGQlEwUTdRVUZEUmpzN1FVRkZSQ3hUUVVGUFJpeE5RVUZRTzBGQlEwUXNRMEZvUWtRN08wRkJhMEpQTEZOQlFWTm1MRk5CUVZRc1EwRkJiVUp2UWl4TlFVRnVRaXhGUVVFeVFrTXNUVUZCTTBJc1JVRkJiVU5pTEU5QlFXNURMRVZCUVRSRE8wRkJRMnBFUVN4WlFVRlZMRGhGUVVGblFrRXNUMEZCYUVJc1JVRkJlVUlzUlVGQlEwY3NhMEpCUVd0Q0xFbEJRVzVDTEVWQlFYcENMRU5CUVZZN1FVRkRRU3hUUVVGUFVDeFRRVUZUYTBJc1NVRkJWQ3hEUVVGalJpeE5RVUZrTEVWQlFYTkNReXhOUVVGMFFpeEZRVUU0UW1Jc1QwRkJPVUlzUTBGQlVEdEJRVU5FT3p0QlFVVk5MRk5CUVZOUUxHdENRVUZVTEVOQlFUUkNiVUlzVFVGQk5VSXNSVUZCYjBORExFMUJRWEJETEVWQlFUUkRZaXhQUVVFMVF5eEZRVUZ4UkR0QlFVTXhSQ3hUUVVGUFNpeFRRVUZUYTBJc1NVRkJWQ3hEUVVGalJpeE5RVUZrTEVWQlFYTkNReXhOUVVGMFFpeEZRVUU0UW1Jc1QwRkJPVUlzUTBGQlVEdEJRVU5FSWl3aVptbHNaU0k2SW5kdmNtUXVhbk1pTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKcGJYQnZjblFnUkdsbVppQm1jbTl0SUNjdUwySmhjMlVuTzF4dWFXMXdiM0owSUh0blpXNWxjbUYwWlU5d2RHbHZibk45SUdaeWIyMGdKeTR1TDNWMGFXd3ZjR0Z5WVcxekp6dGNibHh1THk4Z1FtRnpaV1FnYjI0Z2FIUjBjSE02THk5bGJpNTNhV3RwY0dWa2FXRXViM0puTDNkcGEya3ZUR0YwYVc1ZmMyTnlhWEIwWDJsdVgxVnVhV052WkdWY2JpOHZYRzR2THlCU1lXNW5aWE1nWVc1a0lHVjRZMlZ3ZEdsdmJuTTZYRzR2THlCTVlYUnBiaTB4SUZOMWNIQnNaVzFsYm5Rc0lEQXdPRERpZ0pNd01FWkdYRzR2THlBZ0xTQlZLekF3UkRjZ0lNT1hJRTExYkhScGNHeHBZMkYwYVc5dUlITnBaMjVjYmk4dklDQXRJRlVyTURCR055QWd3N2NnUkdsMmFYTnBiMjRnYzJsbmJseHVMeThnVEdGMGFXNGdSWGgwWlc1a1pXUXRRU3dnTURFd01PS0FrekF4TjBaY2JpOHZJRXhoZEdsdUlFVjRkR1Z1WkdWa0xVSXNJREF4T0REaWdKTXdNalJHWEc0dkx5QkpVRUVnUlhoMFpXNXphVzl1Y3l3Z01ESTFNT0tBa3pBeVFVWmNiaTh2SUZOd1lXTnBibWNnVFc5a2FXWnBaWElnVEdWMGRHVnljeXdnTURKQ01PS0FrekF5UmtaY2JpOHZJQ0F0SUZVck1ESkROeUFneTRjZ0ppTTNNVEU3SUNCRFlYSnZibHh1THk4Z0lDMGdWU3N3TWtRNElDRExtQ0FtSXpjeU9Ec2dJRUp5WlhabFhHNHZMeUFnTFNCVkt6QXlSRGtnSU11WklDWWpOekk1T3lBZ1JHOTBJRUZpYjNabFhHNHZMeUFnTFNCVkt6QXlSRUVnSU11YUlDWWpOek13T3lBZ1VtbHVaeUJCWW05MlpWeHVMeThnSUMwZ1ZTc3dNa1JDSUNETG15QW1JemN6TVRzZ0lFOW5iMjVsYTF4dUx5OGdJQzBnVlNzd01rUkRJQ0RMbkNBbUl6Y3pNanNnSUZOdFlXeHNJRlJwYkdSbFhHNHZMeUFnTFNCVkt6QXlSRVFnSU11ZElDWWpOek16T3lBZ1JHOTFZbXhsSUVGamRYUmxJRUZqWTJWdWRGeHVMeThnVEdGMGFXNGdSWGgwWlc1a1pXUWdRV1JrYVhScGIyNWhiQ3dnTVVVd01PS0FrekZGUmtaY2JtTnZibk4wSUdWNGRHVnVaR1ZrVjI5eVpFTm9ZWEp6SUQwZ0wxNWJZUzE2UVMxYVhGeDFlME13ZlMxY1hIVjdSa1o5WEZ4MWUwUTRmUzFjWEhWN1JqWjlYRngxZTBZNGZTMWNYSFY3TWtNMmZWeGNkWHN5UXpoOUxWeGNkWHN5UkRkOVhGeDFlekpFUlgwdFhGeDFlekpHUm4xY1hIVjdNVVV3TUgwdFhGeDFlekZGUmtaOVhTc2tMM1U3WEc1Y2JtTnZibk4wSUhKbFYyaHBkR1Z6Y0dGalpTQTlJQzljWEZNdk8xeHVYRzVsZUhCdmNuUWdZMjl1YzNRZ2QyOXlaRVJwWm1ZZ1BTQnVaWGNnUkdsbVppZ3BPMXh1ZDI5eVpFUnBabVl1WlhGMVlXeHpJRDBnWm5WdVkzUnBiMjRvYkdWbWRDd2djbWxuYUhRcElIdGNiaUFnYVdZZ0tIUm9hWE11YjNCMGFXOXVjeTVwWjI1dmNtVkRZWE5sS1NCN1hHNGdJQ0FnYkdWbWRDQTlJR3hsWm5RdWRHOU1iM2RsY2tOaGMyVW9LVHRjYmlBZ0lDQnlhV2RvZENBOUlISnBaMmgwTG5SdlRHOTNaWEpEWVhObEtDazdYRzRnSUgxY2JpQWdjbVYwZFhKdUlHeGxablFnUFQwOUlISnBaMmgwSUh4OElDaDBhR2x6TG05d2RHbHZibk11YVdkdWIzSmxWMmhwZEdWemNHRmpaU0FtSmlBaGNtVlhhR2wwWlhOd1lXTmxMblJsYzNRb2JHVm1kQ2tnSmlZZ0lYSmxWMmhwZEdWemNHRmpaUzUwWlhOMEtISnBaMmgwS1NrN1hHNTlPMXh1ZDI5eVpFUnBabVl1ZEc5clpXNXBlbVVnUFNCbWRXNWpkR2x2YmloMllXeDFaU2tnZTF4dUlDQnNaWFFnZEc5clpXNXpJRDBnZG1Gc2RXVXVjM0JzYVhRb0x5aGNYSE1yZkZ4Y1lpa3ZLVHRjYmx4dUlDQXZMeUJLYjJsdUlIUm9aU0JpYjNWdVpHRnllU0J6Y0d4cGRITWdkR2hoZENCM1pTQmtieUJ1YjNRZ1kyOXVjMmxrWlhJZ2RHOGdZbVVnWW05MWJtUmhjbWxsY3k0Z1ZHaHBjeUJwY3lCd2NtbHRZWEpwYkhrZ2RHaGxJR1Y0ZEdWdVpHVmtJRXhoZEdsdUlHTm9ZWEpoWTNSbGNpQnpaWFF1WEc0Z0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dkRzlyWlc1ekxteGxibWQwYUNBdElERTdJR2tyS3lrZ2UxeHVJQ0FnSUM4dklFbG1JSGRsSUdoaGRtVWdZVzRnWlcxd2RIa2djM1J5YVc1bklHbHVJSFJvWlNCdVpYaDBJR1pwWld4a0lHRnVaQ0IzWlNCb1lYWmxJRzl1YkhrZ2QyOXlaQ0JqYUdGeWN5QmlaV1p2Y21VZ1lXNWtJR0ZtZEdWeUxDQnRaWEpuWlZ4dUlDQWdJR2xtSUNnaGRHOXJaVzV6VzJrZ0t5QXhYU0FtSmlCMGIydGxibk5iYVNBcklESmRYRzRnSUNBZ0lDQWdJQ0FnSmlZZ1pYaDBaVzVrWldSWGIzSmtRMmhoY25NdWRHVnpkQ2gwYjJ0bGJuTmJhVjBwWEc0Z0lDQWdJQ0FnSUNBZ0ppWWdaWGgwWlc1a1pXUlhiM0prUTJoaGNuTXVkR1Z6ZENoMGIydGxibk5iYVNBcklESmRLU2tnZTF4dUlDQWdJQ0FnZEc5clpXNXpXMmxkSUNzOUlIUnZhMlZ1YzF0cElDc2dNbDA3WEc0Z0lDQWdJQ0IwYjJ0bGJuTXVjM0JzYVdObEtHa2dLeUF4TENBeUtUdGNiaUFnSUNBZ0lHa3RMVHRjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0J5WlhSMWNtNGdkRzlyWlc1ek8xeHVmVHRjYmx4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUdScFptWlhiM0prY3lodmJHUlRkSElzSUc1bGQxTjBjaXdnYjNCMGFXOXVjeWtnZTF4dUlDQnZjSFJwYjI1eklEMGdaMlZ1WlhKaGRHVlBjSFJwYjI1ektHOXdkR2x2Ym5Nc0lIdHBaMjV2Y21WWGFHbDBaWE53WVdObE9pQjBjblZsZlNrN1hHNGdJSEpsZEhWeWJpQjNiM0prUkdsbVppNWthV1ptS0c5c1pGTjBjaXdnYm1WM1UzUnlMQ0J2Y0hScGIyNXpLVHRjYm4xY2JseHVaWGh3YjNKMElHWjFibU4wYVc5dUlHUnBabVpYYjNKa2MxZHBkR2hUY0dGalpTaHZiR1JUZEhJc0lHNWxkMU4wY2l3Z2IzQjBhVzl1Y3lrZ2UxeHVJQ0J5WlhSMWNtNGdkMjl5WkVScFptWXVaR2xtWmlodmJHUlRkSElzSUc1bGQxTjBjaXdnYjNCMGFXOXVjeWs3WEc1OVhHNGlYWDA9XG5cblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyd1c2Ugc3RyaWN0JztcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2dlbmVyYXRlT3B0aW9ucyA9IGdlbmVyYXRlT3B0aW9ucztcblx0ZnVuY3Rpb24gZ2VuZXJhdGVPcHRpb25zKG9wdGlvbnMsIGRlZmF1bHRzKSB7XG5cdCAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICBkZWZhdWx0cy5jYWxsYmFjayA9IG9wdGlvbnM7XG5cdCAgfSBlbHNlIGlmIChvcHRpb25zKSB7XG5cdCAgICBmb3IgKHZhciBuYW1lIGluIG9wdGlvbnMpIHtcblx0ICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0ICAgICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcblx0ICAgICAgICBkZWZhdWx0c1tuYW1lXSA9IG9wdGlvbnNbbmFtZV07XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9XG5cdCAgcmV0dXJuIGRlZmF1bHRzO1xuXHR9XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OTFkR2xzTDNCaGNtRnRjeTVxY3lKZExDSnVZVzFsY3lJNld5Sm5aVzVsY21GMFpVOXdkR2x2Ym5NaUxDSnZjSFJwYjI1eklpd2laR1ZtWVhWc2RITWlMQ0pqWVd4c1ltRmpheUlzSW01aGJXVWlMQ0pvWVhOUGQyNVFjbTl3WlhKMGVTSmRMQ0p0WVhCd2FXNW5jeUk2SWpzN08yZERRVUZuUWtFc1pTeEhRVUZCUVN4bE8wRkJRVlFzVTBGQlUwRXNaVUZCVkN4RFFVRjVRa01zVDBGQmVrSXNSVUZCYTBORExGRkJRV3hETEVWQlFUUkRPMEZCUTJwRUxFMUJRVWtzVDBGQlQwUXNUMEZCVUN4TFFVRnRRaXhWUVVGMlFpeEZRVUZ0UXp0QlFVTnFRME1zWVVGQlUwTXNVVUZCVkN4SFFVRnZRa1lzVDBGQmNFSTdRVUZEUkN4SFFVWkVMRTFCUlU4c1NVRkJTVUVzVDBGQlNpeEZRVUZoTzBGQlEyeENMRk5CUVVzc1NVRkJTVWNzU1VGQlZDeEpRVUZwUWtnc1QwRkJha0lzUlVGQk1FSTdRVUZEZUVJN1FVRkRRU3hWUVVGSlFTeFJRVUZSU1N4alFVRlNMRU5CUVhWQ1JDeEpRVUYyUWl4RFFVRktMRVZCUVd0RE8wRkJRMmhEUml4cFFrRkJVMFVzU1VGQlZDeEpRVUZwUWtnc1VVRkJVVWNzU1VGQlVpeERRVUZxUWp0QlFVTkVPMEZCUTBZN1FVRkRSanRCUVVORUxGTkJRVTlHTEZGQlFWQTdRVUZEUkNJc0ltWnBiR1VpT2lKd1lYSmhiWE11YW5NaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SmxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1oyVnVaWEpoZEdWUGNIUnBiMjV6S0c5d2RHbHZibk1zSUdSbFptRjFiSFJ6S1NCN1hHNGdJR2xtSUNoMGVYQmxiMllnYjNCMGFXOXVjeUE5UFQwZ0oyWjFibU4wYVc5dUp5a2dlMXh1SUNBZ0lHUmxabUYxYkhSekxtTmhiR3hpWVdOcklEMGdiM0IwYVc5dWN6dGNiaUFnZlNCbGJITmxJR2xtSUNodmNIUnBiMjV6S1NCN1hHNGdJQ0FnWm05eUlDaHNaWFFnYm1GdFpTQnBiaUJ2Y0hScGIyNXpLU0I3WEc0Z0lDQWdJQ0F2S2lCcGMzUmhibUoxYkNCcFoyNXZjbVVnWld4elpTQXFMMXh1SUNBZ0lDQWdhV1lnS0c5d2RHbHZibk11YUdGelQzZHVVSEp2Y0dWeWRIa29ibUZ0WlNrcElIdGNiaUFnSUNBZ0lDQWdaR1ZtWVhWc2RITmJibUZ0WlYwZ1BTQnZjSFJwYjI1elcyNWhiV1ZkTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdaR1ZtWVhWc2RITTdYRzU5WEc0aVhYMD1cblxuXG4vKioqLyB9KSxcbi8qIDUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovJ3VzZSBzdHJpY3QnO1xuXG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHMubGluZURpZmYgPSB1bmRlZmluZWQ7XG5cdGV4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZkxpbmVzID0gZGlmZkxpbmVzO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9kaWZmVHJpbW1lZExpbmVzID0gZGlmZlRyaW1tZWRMaW5lcztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19iYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9iYXNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Jhc2UpO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIGVuZCovdmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fcGFyYW1zID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5cdC8qaXN0YW5idWwgaWdub3JlIGVuZCovdmFyIGxpbmVEaWZmID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovbGluZURpZmYgPSBuZXcgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19iYXNlMlsnZGVmYXVsdCddIC8qaXN0YW5idWwgaWdub3JlIGVuZCovKCk7XG5cdGxpbmVEaWZmLnRva2VuaXplID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgdmFyIHJldExpbmVzID0gW10sXG5cdCAgICAgIGxpbmVzQW5kTmV3bGluZXMgPSB2YWx1ZS5zcGxpdCgvKFxcbnxcXHJcXG4pLyk7XG5cblx0ICAvLyBJZ25vcmUgdGhlIGZpbmFsIGVtcHR5IHRva2VuIHRoYXQgb2NjdXJzIGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIGEgbmV3IGxpbmVcblx0ICBpZiAoIWxpbmVzQW5kTmV3bGluZXNbbGluZXNBbmROZXdsaW5lcy5sZW5ndGggLSAxXSkge1xuXHQgICAgbGluZXNBbmROZXdsaW5lcy5wb3AoKTtcblx0ICB9XG5cblx0ICAvLyBNZXJnZSB0aGUgY29udGVudCBhbmQgbGluZSBzZXBhcmF0b3JzIGludG8gc2luZ2xlIHRva2Vuc1xuXHQgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXNBbmROZXdsaW5lcy5sZW5ndGg7IGkrKykge1xuXHQgICAgdmFyIGxpbmUgPSBsaW5lc0FuZE5ld2xpbmVzW2ldO1xuXG5cdCAgICBpZiAoaSAlIDIgJiYgIXRoaXMub3B0aW9ucy5uZXdsaW5lSXNUb2tlbikge1xuXHQgICAgICByZXRMaW5lc1tyZXRMaW5lcy5sZW5ndGggLSAxXSArPSBsaW5lO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVXaGl0ZXNwYWNlKSB7XG5cdCAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpO1xuXHQgICAgICB9XG5cdCAgICAgIHJldExpbmVzLnB1c2gobGluZSk7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgcmV0dXJuIHJldExpbmVzO1xuXHR9O1xuXG5cdGZ1bmN0aW9uIGRpZmZMaW5lcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHtcblx0ICByZXR1cm4gbGluZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spO1xuXHR9XG5cdGZ1bmN0aW9uIGRpZmZUcmltbWVkTGluZXMob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKSB7XG5cdCAgdmFyIG9wdGlvbnMgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKDAsIF9wYXJhbXMuZ2VuZXJhdGVPcHRpb25zKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyhjYWxsYmFjaywgeyBpZ25vcmVXaGl0ZXNwYWNlOiB0cnVlIH0pO1xuXHQgIHJldHVybiBsaW5lRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcblx0fVxuXHQvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTlrYVdabUwyeHBibVV1YW5NaVhTd2libUZ0WlhNaU9sc2laR2xtWmt4cGJtVnpJaXdpWkdsbVpsUnlhVzF0WldSTWFXNWxjeUlzSW14cGJtVkVhV1ptSWl3aWRHOXJaVzVwZW1VaUxDSjJZV3gxWlNJc0luSmxkRXhwYm1Weklpd2liR2x1WlhOQmJtUk9aWGRzYVc1bGN5SXNJbk53YkdsMElpd2liR1Z1WjNSb0lpd2ljRzl3SWl3aWFTSXNJbXhwYm1VaUxDSnZjSFJwYjI1eklpd2libVYzYkdsdVpVbHpWRzlyWlc0aUxDSnBaMjV2Y21WWGFHbDBaWE53WVdObElpd2lkSEpwYlNJc0luQjFjMmdpTENKdmJHUlRkSElpTENKdVpYZFRkSElpTENKallXeHNZbUZqYXlJc0ltUnBabVlpWFN3aWJXRndjR2x1WjNNaU9pSTdPenM3WjBOQk9FSm5Ra0VzVXl4SFFVRkJRU3hUTzNsRVFVTkJReXhuUWl4SFFVRkJRU3huUWpzN1FVRXZRbWhDT3pzN08zVkNRVU5CT3pzN08zVkNRVVZQTEVsQlFVMURMQ3RGUVVGWExIZEZRVUZxUWp0QlFVTlFRU3hUUVVGVFF5eFJRVUZVTEVkQlFXOUNMRlZCUVZORExFdEJRVlFzUlVGQlowSTdRVUZEYkVNc1RVRkJTVU1zVjBGQlZ5eEZRVUZtTzBGQlFVRXNUVUZEU1VNc2JVSkJRVzFDUml4TlFVRk5SeXhMUVVGT0xFTkJRVmtzVjBGQldpeERRVVIyUWpzN1FVRkhRVHRCUVVOQkxFMUJRVWtzUTBGQlEwUXNhVUpCUVdsQ1FTeHBRa0ZCYVVKRkxFMUJRV3BDTEVkQlFUQkNMRU5CUVRORExFTkJRVXdzUlVGQmIwUTdRVUZEYkVSR0xIRkNRVUZwUWtjc1IwRkJha0k3UVVGRFJEczdRVUZGUkR0QlFVTkJMRTlCUVVzc1NVRkJTVU1zU1VGQlNTeERRVUZpTEVWQlFXZENRU3hKUVVGSlNpeHBRa0ZCYVVKRkxFMUJRWEpETEVWQlFUWkRSU3hIUVVFM1F5eEZRVUZyUkR0QlFVTm9SQ3hSUVVGSlF5eFBRVUZQVEN4cFFrRkJhVUpKTEVOQlFXcENMRU5CUVZnN08wRkJSVUVzVVVGQlNVRXNTVUZCU1N4RFFVRktMRWxCUVZNc1EwRkJReXhMUVVGTFJTeFBRVUZNTEVOQlFXRkRMR05CUVROQ0xFVkJRVEpETzBGQlEzcERVaXhsUVVGVFFTeFRRVUZUUnl4TlFVRlVMRWRCUVd0Q0xFTkJRVE5DTEV0QlFXbERSeXhKUVVGcVF6dEJRVU5FTEV0QlJrUXNUVUZGVHp0QlFVTk1MRlZCUVVrc1MwRkJTME1zVDBGQlRDeERRVUZoUlN4blFrRkJha0lzUlVGQmJVTTdRVUZEYWtOSUxHVkJRVTlCTEV0QlFVdEpMRWxCUVV3c1JVRkJVRHRCUVVORU8wRkJRMFJXTEdWQlFWTlhMRWxCUVZRc1EwRkJZMHdzU1VGQlpEdEJRVU5FTzBGQlEwWTdPMEZCUlVRc1UwRkJUMDRzVVVGQlVEdEJRVU5FTEVOQmVFSkVPenRCUVRCQ1R5eFRRVUZUVEN4VFFVRlVMRU5CUVcxQ2FVSXNUVUZCYmtJc1JVRkJNa0pETEUxQlFUTkNMRVZCUVcxRFF5eFJRVUZ1UXl4RlFVRTJRenRCUVVGRkxGTkJRVTlxUWl4VFFVRlRhMElzU1VGQlZDeERRVUZqU0N4TlFVRmtMRVZCUVhOQ1F5eE5RVUYwUWl4RlFVRTRRa01zVVVGQk9VSXNRMEZCVUR0QlFVRnBSRHRCUVVOb1J5eFRRVUZUYkVJc1owSkJRVlFzUTBGQk1FSm5RaXhOUVVFeFFpeEZRVUZyUTBNc1RVRkJiRU1zUlVGQk1FTkRMRkZCUVRGRExFVkJRVzlFTzBGQlEzcEVMRTFCUVVsUUxGVkJRVlVzT0VWQlFXZENUeXhSUVVGb1FpeEZRVUV3UWl4RlFVRkRUQ3hyUWtGQmEwSXNTVUZCYmtJc1JVRkJNVUlzUTBGQlpEdEJRVU5CTEZOQlFVOWFMRk5CUVZOclFpeEpRVUZVTEVOQlFXTklMRTFCUVdRc1JVRkJjMEpETEUxQlFYUkNMRVZCUVRoQ1RpeFBRVUU1UWl4RFFVRlFPMEZCUTBRaUxDSm1hV3hsSWpvaWJHbHVaUzVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCRWFXWm1JR1p5YjIwZ0p5NHZZbUZ6WlNjN1hHNXBiWEJ2Y25RZ2UyZGxibVZ5WVhSbFQzQjBhVzl1YzMwZ1puSnZiU0FuTGk0dmRYUnBiQzl3WVhKaGJYTW5PMXh1WEc1bGVIQnZjblFnWTI5dWMzUWdiR2x1WlVScFptWWdQU0J1WlhjZ1JHbG1aaWdwTzF4dWJHbHVaVVJwWm1ZdWRHOXJaVzVwZW1VZ1BTQm1kVzVqZEdsdmJpaDJZV3gxWlNrZ2UxeHVJQ0JzWlhRZ2NtVjBUR2x1WlhNZ1BTQmJYU3hjYmlBZ0lDQWdJR3hwYm1WelFXNWtUbVYzYkdsdVpYTWdQU0IyWVd4MVpTNXpjR3hwZENndktGeGNibnhjWEhKY1hHNHBMeWs3WEc1Y2JpQWdMeThnU1dkdWIzSmxJSFJvWlNCbWFXNWhiQ0JsYlhCMGVTQjBiMnRsYmlCMGFHRjBJRzlqWTNWeWN5QnBaaUIwYUdVZ2MzUnlhVzVuSUdWdVpITWdkMmwwYUNCaElHNWxkeUJzYVc1bFhHNGdJR2xtSUNnaGJHbHVaWE5CYm1ST1pYZHNhVzVsYzF0c2FXNWxjMEZ1WkU1bGQyeHBibVZ6TG14bGJtZDBhQ0F0SURGZEtTQjdYRzRnSUNBZ2JHbHVaWE5CYm1ST1pYZHNhVzVsY3k1d2IzQW9LVHRjYmlBZ2ZWeHVYRzRnSUM4dklFMWxjbWRsSUhSb1pTQmpiMjUwWlc1MElHRnVaQ0JzYVc1bElITmxjR0Z5WVhSdmNuTWdhVzUwYnlCemFXNW5iR1VnZEc5clpXNXpYRzRnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z2JHbHVaWE5CYm1ST1pYZHNhVzVsY3k1c1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lHeGxkQ0JzYVc1bElEMGdiR2x1WlhOQmJtUk9aWGRzYVc1bGMxdHBYVHRjYmx4dUlDQWdJR2xtSUNocElDVWdNaUFtSmlBaGRHaHBjeTV2Y0hScGIyNXpMbTVsZDJ4cGJtVkpjMVJ2YTJWdUtTQjdYRzRnSUNBZ0lDQnlaWFJNYVc1bGMxdHlaWFJNYVc1bGN5NXNaVzVuZEdnZ0xTQXhYU0FyUFNCc2FXNWxPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCcFppQW9kR2hwY3k1dmNIUnBiMjV6TG1sbmJtOXlaVmRvYVhSbGMzQmhZMlVwSUh0Y2JpQWdJQ0FnSUNBZ2JHbHVaU0E5SUd4cGJtVXVkSEpwYlNncE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2NtVjBUR2x1WlhNdWNIVnphQ2hzYVc1bEtUdGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQnlaWFIxY200Z2NtVjBUR2x1WlhNN1hHNTlPMXh1WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWkdsbVpreHBibVZ6S0c5c1pGTjBjaXdnYm1WM1UzUnlMQ0JqWVd4c1ltRmpheWtnZXlCeVpYUjFjbTRnYkdsdVpVUnBabVl1WkdsbVppaHZiR1JUZEhJc0lHNWxkMU4wY2l3Z1kyRnNiR0poWTJzcE95QjlYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdaR2xtWmxSeWFXMXRaV1JNYVc1bGN5aHZiR1JUZEhJc0lHNWxkMU4wY2l3Z1kyRnNiR0poWTJzcElIdGNiaUFnYkdWMElHOXdkR2x2Ym5NZ1BTQm5aVzVsY21GMFpVOXdkR2x2Ym5Nb1kyRnNiR0poWTJzc0lIdHBaMjV2Y21WWGFHbDBaWE53WVdObE9pQjBjblZsZlNrN1hHNGdJSEpsZEhWeWJpQnNhVzVsUkdsbVppNWthV1ptS0c5c1pGTjBjaXdnYm1WM1UzUnlMQ0J2Y0hScGIyNXpLVHRjYm4xY2JpSmRmUT09XG5cblxuLyoqKi8gfSksXG4vKiA2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyd1c2Ugc3RyaWN0JztcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLnNlbnRlbmNlRGlmZiA9IHVuZGVmaW5lZDtcblx0ZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9kaWZmU2VudGVuY2VzID0gZGlmZlNlbnRlbmNlcztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19iYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9iYXNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Jhc2UpO1xuXG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3ZhciBzZW50ZW5jZURpZmYgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9zZW50ZW5jZURpZmYgPSBuZXcgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19iYXNlMlsnZGVmYXVsdCddIC8qaXN0YW5idWwgaWdub3JlIGVuZCovKCk7XG5cdHNlbnRlbmNlRGlmZi50b2tlbml6ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgIHJldHVybiB2YWx1ZS5zcGxpdCgvKFxcUy4rP1suIT9dKSg/PVxccyt8JCkvKTtcblx0fTtcblxuXHRmdW5jdGlvbiBkaWZmU2VudGVuY2VzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykge1xuXHQgIHJldHVybiBzZW50ZW5jZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spO1xuXHR9XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OWthV1ptTDNObGJuUmxibU5sTG1weklsMHNJbTVoYldWeklqcGJJbVJwWm1aVFpXNTBaVzVqWlhNaUxDSnpaVzUwWlc1alpVUnBabVlpTENKMGIydGxibWw2WlNJc0luWmhiSFZsSWl3aWMzQnNhWFFpTENKdmJHUlRkSElpTENKdVpYZFRkSElpTENKallXeHNZbUZqYXlJc0ltUnBabVlpWFN3aWJXRndjR2x1WjNNaU9pSTdPenM3WjBOQlVXZENRU3hoTEVkQlFVRkJMR0U3TzBGQlVtaENPenM3T3pzN2RVSkJSMDhzU1VGQlRVTXNkVVpCUVdVc2QwVkJRWEpDTzBGQlExQkJMR0ZCUVdGRExGRkJRV0lzUjBGQmQwSXNWVUZCVTBNc1MwRkJWQ3hGUVVGblFqdEJRVU4wUXl4VFFVRlBRU3hOUVVGTlF5eExRVUZPTEVOQlFWa3NkVUpCUVZvc1EwRkJVRHRCUVVORUxFTkJSa1E3TzBGQlNVOHNVMEZCVTBvc1lVRkJWQ3hEUVVGMVFrc3NUVUZCZGtJc1JVRkJLMEpETEUxQlFTOUNMRVZCUVhWRFF5eFJRVUYyUXl4RlFVRnBSRHRCUVVGRkxGTkJRVTlPTEdGQlFXRlBMRWxCUVdJc1EwRkJhMEpJTEUxQlFXeENMRVZCUVRCQ1F5eE5RVUV4UWl4RlFVRnJRME1zVVVGQmJFTXNRMEZCVUR0QlFVRnhSQ0lzSW1acGJHVWlPaUp6Wlc1MFpXNWpaUzVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCRWFXWm1JR1p5YjIwZ0p5NHZZbUZ6WlNjN1hHNWNibHh1Wlhod2IzSjBJR052Ym5OMElITmxiblJsYm1ObFJHbG1aaUE5SUc1bGR5QkVhV1ptS0NrN1hHNXpaVzUwWlc1alpVUnBabVl1ZEc5clpXNXBlbVVnUFNCbWRXNWpkR2x2YmloMllXeDFaU2tnZTF4dUlDQnlaWFIxY200Z2RtRnNkV1V1YzNCc2FYUW9MeWhjWEZNdUt6OWJMaUUvWFNrb1B6MWNYSE1yZkNRcEx5azdYRzU5TzF4dVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1pHbG1abE5sYm5SbGJtTmxjeWh2YkdSVGRISXNJRzVsZDFOMGNpd2dZMkZzYkdKaFkyc3BJSHNnY21WMGRYSnVJSE5sYm5SbGJtTmxSR2xtWmk1a2FXWm1LRzlzWkZOMGNpd2dibVYzVTNSeUxDQmpZV3hzWW1GamF5azdJSDFjYmlKZGZRPT1cblxuXG4vKioqLyB9KSxcbi8qIDcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovJ3VzZSBzdHJpY3QnO1xuXG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHMuY3NzRGlmZiA9IHVuZGVmaW5lZDtcblx0ZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9kaWZmQ3NzID0gZGlmZkNzcztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19iYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9iYXNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Jhc2UpO1xuXG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3ZhciBjc3NEaWZmID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovY3NzRGlmZiA9IG5ldyAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2Jhc2UyWydkZWZhdWx0J10gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8oKTtcblx0Y3NzRGlmZi50b2tlbml6ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgIHJldHVybiB2YWx1ZS5zcGxpdCgvKFt7fTo7LF18XFxzKykvKTtcblx0fTtcblxuXHRmdW5jdGlvbiBkaWZmQ3NzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykge1xuXHQgIHJldHVybiBjc3NEaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKTtcblx0fVxuXHQvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTlrYVdabUwyTnpjeTVxY3lKZExDSnVZVzFsY3lJNld5SmthV1ptUTNOeklpd2lZM056UkdsbVppSXNJblJ2YTJWdWFYcGxJaXdpZG1Gc2RXVWlMQ0p6Y0d4cGRDSXNJbTlzWkZOMGNpSXNJbTVsZDFOMGNpSXNJbU5oYkd4aVlXTnJJaXdpWkdsbVppSmRMQ0p0WVhCd2FXNW5jeUk2SWpzN096dG5RMEZQWjBKQkxFOHNSMEZCUVVFc1R6czdRVUZRYUVJN096czdPenQxUWtGRlR5eEpRVUZOUXl3MlJVRkJWU3gzUlVGQmFFSTdRVUZEVUVFc1VVRkJVVU1zVVVGQlVpeEhRVUZ0UWl4VlFVRlRReXhMUVVGVUxFVkJRV2RDTzBGQlEycERMRk5CUVU5QkxFMUJRVTFETEV0QlFVNHNRMEZCV1N4bFFVRmFMRU5CUVZBN1FVRkRSQ3hEUVVaRU96dEJRVWxQTEZOQlFWTktMRTlCUVZRc1EwRkJhVUpMTEUxQlFXcENMRVZCUVhsQ1F5eE5RVUY2UWl4RlFVRnBRME1zVVVGQmFrTXNSVUZCTWtNN1FVRkJSU3hUUVVGUFRpeFJRVUZSVHl4SlFVRlNMRU5CUVdGSUxFMUJRV0lzUlVGQmNVSkRMRTFCUVhKQ0xFVkJRVFpDUXl4UlFVRTNRaXhEUVVGUU8wRkJRV2RFSWl3aVptbHNaU0k2SW1OemN5NXFjeUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSW1sdGNHOXlkQ0JFYVdabUlHWnliMjBnSnk0dlltRnpaU2M3WEc1Y2JtVjRjRzl5ZENCamIyNXpkQ0JqYzNORWFXWm1JRDBnYm1WM0lFUnBabVlvS1R0Y2JtTnpjMFJwWm1ZdWRHOXJaVzVwZW1VZ1BTQm1kVzVqZEdsdmJpaDJZV3gxWlNrZ2UxeHVJQ0J5WlhSMWNtNGdkbUZzZFdVdWMzQnNhWFFvTHloYmUzMDZPeXhkZkZ4Y2N5c3BMeWs3WEc1OU8xeHVYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdaR2xtWmtOemN5aHZiR1JUZEhJc0lHNWxkMU4wY2l3Z1kyRnNiR0poWTJzcElIc2djbVYwZFhKdUlHTnpjMFJwWm1ZdVpHbG1aaWh2YkdSVGRISXNJRzVsZDFOMGNpd2dZMkZzYkdKaFkyc3BPeUI5WEc0aVhYMD1cblxuXG4vKioqLyB9KSxcbi8qIDggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovJ3VzZSBzdHJpY3QnO1xuXG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHMuanNvbkRpZmYgPSB1bmRlZmluZWQ7XG5cblx0dmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5cdGV4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZkpzb24gPSBkaWZmSnNvbjtcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovY2Fub25pY2FsaXplID0gY2Fub25pY2FsaXplO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2Jhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2Jhc2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYmFzZSk7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgZW5kKi92YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19saW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5cdC8qaXN0YW5idWwgaWdub3JlIGVuZCovdmFyIG9iamVjdFByb3RvdHlwZVRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuXHR2YXIganNvbkRpZmYgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9qc29uRGlmZiA9IG5ldyAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2Jhc2UyWydkZWZhdWx0J10gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8oKTtcblx0Ly8gRGlzY3JpbWluYXRlIGJldHdlZW4gdHdvIGxpbmVzIG9mIHByZXR0eS1wcmludGVkLCBzZXJpYWxpemVkIEpTT04gd2hlcmUgb25lIG9mIHRoZW0gaGFzIGFcblx0Ly8gZGFuZ2xpbmcgY29tbWEgYW5kIHRoZSBvdGhlciBkb2Vzbid0LiBUdXJucyBvdXQgaW5jbHVkaW5nIHRoZSBkYW5nbGluZyBjb21tYSB5aWVsZHMgdGhlIG5pY2VzdCBvdXRwdXQ6XG5cdGpzb25EaWZmLnVzZUxvbmdlc3RUb2tlbiA9IHRydWU7XG5cblx0anNvbkRpZmYudG9rZW5pemUgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2xpbmUubGluZURpZmYgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8udG9rZW5pemU7XG5cdGpzb25EaWZmLmNhc3RJbnB1dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi91bmRlZmluZWRSZXBsYWNlbWVudCA9IHRoaXMub3B0aW9ucy51bmRlZmluZWRSZXBsYWNlbWVudDtcblxuXG5cdCAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KGNhbm9uaWNhbGl6ZSh2YWx1ZSksIGZ1bmN0aW9uIChrLCB2KSB7XG5cdCAgICBpZiAodHlwZW9mIHYgPT09ICd1bmRlZmluZWQnKSB7XG5cdCAgICAgIHJldHVybiB1bmRlZmluZWRSZXBsYWNlbWVudDtcblx0ICAgIH1cblxuXHQgICAgcmV0dXJuIHY7XG5cdCAgfSwgJyAgJyk7XG5cdH07XG5cdGpzb25EaWZmLmVxdWFscyA9IGZ1bmN0aW9uIChsZWZ0LCByaWdodCkge1xuXHQgIHJldHVybiAoLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19iYXNlMlsnZGVmYXVsdCddIC8qaXN0YW5idWwgaWdub3JlIGVuZCovLnByb3RvdHlwZS5lcXVhbHMuY2FsbChqc29uRGlmZiwgbGVmdC5yZXBsYWNlKC8sKFtcXHJcXG5dKS9nLCAnJDEnKSwgcmlnaHQucmVwbGFjZSgvLChbXFxyXFxuXSkvZywgJyQxJykpXG5cdCAgKTtcblx0fTtcblxuXHRmdW5jdGlvbiBkaWZmSnNvbihvbGRPYmosIG5ld09iaiwgb3B0aW9ucykge1xuXHQgIHJldHVybiBqc29uRGlmZi5kaWZmKG9sZE9iaiwgbmV3T2JqLCBvcHRpb25zKTtcblx0fVxuXG5cdC8vIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgcHJlc2VuY2Ugb2YgY2lyY3VsYXIgcmVmZXJlbmNlcyBieSBiYWlsaW5nIG91dCB3aGVuIGVuY291bnRlcmluZyBhblxuXHQvLyBvYmplY3QgdGhhdCBpcyBhbHJlYWR5IG9uIHRoZSBcInN0YWNrXCIgb2YgaXRlbXMgYmVpbmcgcHJvY2Vzc2VkLlxuXHRmdW5jdGlvbiBjYW5vbmljYWxpemUob2JqLCBzdGFjaywgcmVwbGFjZW1lbnRTdGFjaykge1xuXHQgIHN0YWNrID0gc3RhY2sgfHwgW107XG5cdCAgcmVwbGFjZW1lbnRTdGFjayA9IHJlcGxhY2VtZW50U3RhY2sgfHwgW107XG5cblx0ICB2YXIgaSA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92b2lkIDAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0ICBmb3IgKGkgPSAwOyBpIDwgc3RhY2subGVuZ3RoOyBpICs9IDEpIHtcblx0ICAgIGlmIChzdGFja1tpXSA9PT0gb2JqKSB7XG5cdCAgICAgIHJldHVybiByZXBsYWNlbWVudFN0YWNrW2ldO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHZhciBjYW5vbmljYWxpemVkT2JqID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZvaWQgMCAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQgIGlmICgnW29iamVjdCBBcnJheV0nID09PSBvYmplY3RQcm90b3R5cGVUb1N0cmluZy5jYWxsKG9iaikpIHtcblx0ICAgIHN0YWNrLnB1c2gob2JqKTtcblx0ICAgIGNhbm9uaWNhbGl6ZWRPYmogPSBuZXcgQXJyYXkob2JqLmxlbmd0aCk7XG5cdCAgICByZXBsYWNlbWVudFN0YWNrLnB1c2goY2Fub25pY2FsaXplZE9iaik7XG5cdCAgICBmb3IgKGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSArPSAxKSB7XG5cdCAgICAgIGNhbm9uaWNhbGl6ZWRPYmpbaV0gPSBjYW5vbmljYWxpemUob2JqW2ldLCBzdGFjaywgcmVwbGFjZW1lbnRTdGFjayk7XG5cdCAgICB9XG5cdCAgICBzdGFjay5wb3AoKTtcblx0ICAgIHJlcGxhY2VtZW50U3RhY2sucG9wKCk7XG5cdCAgICByZXR1cm4gY2Fub25pY2FsaXplZE9iajtcblx0ICB9XG5cblx0ICBpZiAob2JqICYmIG9iai50b0pTT04pIHtcblx0ICAgIG9iaiA9IG9iai50b0pTT04oKTtcblx0ICB9XG5cblx0ICBpZiAoIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8odHlwZW9mIC8qaXN0YW5idWwgaWdub3JlIGVuZCovb2JqID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihvYmopKSA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsKSB7XG5cdCAgICBzdGFjay5wdXNoKG9iaik7XG5cdCAgICBjYW5vbmljYWxpemVkT2JqID0ge307XG5cdCAgICByZXBsYWNlbWVudFN0YWNrLnB1c2goY2Fub25pY2FsaXplZE9iaik7XG5cdCAgICB2YXIgc29ydGVkS2V5cyA9IFtdLFxuXHQgICAgICAgIGtleSA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92b2lkIDAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cdCAgICBmb3IgKGtleSBpbiBvYmopIHtcblx0ICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0ICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdCAgICAgICAgc29ydGVkS2V5cy5wdXNoKGtleSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHNvcnRlZEtleXMuc29ydCgpO1xuXHQgICAgZm9yIChpID0gMDsgaSA8IHNvcnRlZEtleXMubGVuZ3RoOyBpICs9IDEpIHtcblx0ICAgICAga2V5ID0gc29ydGVkS2V5c1tpXTtcblx0ICAgICAgY2Fub25pY2FsaXplZE9ialtrZXldID0gY2Fub25pY2FsaXplKG9ialtrZXldLCBzdGFjaywgcmVwbGFjZW1lbnRTdGFjayk7XG5cdCAgICB9XG5cdCAgICBzdGFjay5wb3AoKTtcblx0ICAgIHJlcGxhY2VtZW50U3RhY2sucG9wKCk7XG5cdCAgfSBlbHNlIHtcblx0ICAgIGNhbm9uaWNhbGl6ZWRPYmogPSBvYmo7XG5cdCAgfVxuXHQgIHJldHVybiBjYW5vbmljYWxpemVkT2JqO1xuXHR9XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OWthV1ptTDJwemIyNHVhbk1pWFN3aWJtRnRaWE1pT2xzaVpHbG1aa3B6YjI0aUxDSmpZVzV2Ym1sallXeHBlbVVpTENKdlltcGxZM1JRY205MGIzUjVjR1ZVYjFOMGNtbHVaeUlzSWs5aWFtVmpkQ0lzSW5CeWIzUnZkSGx3WlNJc0luUnZVM1J5YVc1bklpd2lhbk52YmtScFptWWlMQ0oxYzJWTWIyNW5aWE4wVkc5clpXNGlMQ0owYjJ0bGJtbDZaU0lzSW1OaGMzUkpibkIxZENJc0luWmhiSFZsSWl3aWRXNWtaV1pwYm1Wa1VtVndiR0ZqWlcxbGJuUWlMQ0p2Y0hScGIyNXpJaXdpU2xOUFRpSXNJbk4wY21sdVoybG1lU0lzSW1zaUxDSjJJaXdpWlhGMVlXeHpJaXdpYkdWbWRDSXNJbkpwWjJoMElpd2lZMkZzYkNJc0luSmxjR3hoWTJVaUxDSnZiR1JQWW1vaUxDSnVaWGRQWW1vaUxDSmthV1ptSWl3aWIySnFJaXdpYzNSaFkyc2lMQ0p5WlhCc1lXTmxiV1Z1ZEZOMFlXTnJJaXdpYVNJc0lteGxibWQwYUNJc0ltTmhibTl1YVdOaGJHbDZaV1JQWW1vaUxDSndkWE5vSWl3aVFYSnlZWGtpTENKd2IzQWlMQ0owYjBwVFQwNGlMQ0p6YjNKMFpXUkxaWGx6SWl3aWEyVjVJaXdpYUdGelQzZHVVSEp2Y0dWeWRIa2lMQ0p6YjNKMElsMHNJbTFoY0hCcGJtZHpJam9pT3pzN096czdPMmREUVRKQ1owSkJMRkVzUjBGQlFVRXNVVHQ1UkVGSlFVTXNXU3hIUVVGQlFTeFpPenRCUVM5Q2FFSTdPenM3ZFVKQlEwRTdPenM3ZFVKQlJVRXNTVUZCVFVNc01FSkJRVEJDUXl4UFFVRlBReXhUUVVGUUxFTkJRV2xDUXl4UlFVRnFSRHM3UVVGSFR5eEpRVUZOUXl3clJVRkJWeXgzUlVGQmFrSTdRVUZEVUR0QlFVTkJPMEZCUTBGQkxGTkJRVk5ETEdWQlFWUXNSMEZCTWtJc1NVRkJNMEk3TzBGQlJVRkVMRk5CUVZORkxGRkJRVlFzUjBGQmIwSXNaMFZCUVZOQkxGRkJRVGRDTzBGQlEwRkdMRk5CUVZOSExGTkJRVlFzUjBGQmNVSXNWVUZCVTBNc1MwRkJWQ3hGUVVGblFqdEJRVUZCTEhORVFVTTFRa01zYjBKQlJEUkNMRWRCUTBvc1MwRkJTME1zVDBGRVJDeERRVU0xUWtRc2IwSkJSRFJDT3pzN1FVRkhia01zVTBGQlR5eFBRVUZQUkN4TFFVRlFMRXRCUVdsQ0xGRkJRV3BDTEVkQlFUUkNRU3hMUVVFMVFpeEhRVUZ2UTBjc1MwRkJTME1zVTBGQlRDeERRVUZsWWl4aFFVRmhVeXhMUVVGaUxFTkJRV1lzUlVGQmIwTXNWVUZCVTBzc1EwRkJWQ3hGUVVGWlF5eERRVUZhTEVWQlFXVTdRVUZETlVZc1VVRkJTU3hQUVVGUFFTeERRVUZRTEV0QlFXRXNWMEZCYWtJc1JVRkJPRUk3UVVGRE5VSXNZVUZCVDB3c2IwSkJRVkE3UVVGRFJEczdRVUZGUkN4WFFVRlBTeXhEUVVGUU8wRkJRMFFzUjBGT01FTXNSVUZOZUVNc1NVRk9kME1zUTBGQk0wTTdRVUZQUkN4RFFWWkVPMEZCVjBGV0xGTkJRVk5YTEUxQlFWUXNSMEZCYTBJc1ZVRkJVME1zU1VGQlZDeEZRVUZsUXl4TFFVRm1MRVZCUVhOQ08wRkJRM1JETEZOQlFVOHNiMFZCUVV0bUxGTkJRVXdzUTBGQlpXRXNUVUZCWml4RFFVRnpRa2NzU1VGQmRFSXNRMEZCTWtKa0xGRkJRVE5DTEVWQlFYRkRXU3hMUVVGTFJ5eFBRVUZNTEVOQlFXRXNXVUZCWWl4RlFVRXlRaXhKUVVFelFpeERRVUZ5UXl4RlFVRjFSVVlzVFVGQlRVVXNUMEZCVGl4RFFVRmpMRmxCUVdRc1JVRkJORUlzU1VGQk5VSXNRMEZCZGtVN1FVRkJVRHRCUVVORUxFTkJSa1E3TzBGQlNVOHNVMEZCVTNKQ0xGRkJRVlFzUTBGQmEwSnpRaXhOUVVGc1FpeEZRVUV3UWtNc1RVRkJNVUlzUlVGQmEwTllMRTlCUVd4RExFVkJRVEpETzBGQlFVVXNVMEZCVDA0c1UwRkJVMnRDTEVsQlFWUXNRMEZCWTBZc1RVRkJaQ3hGUVVGelFrTXNUVUZCZEVJc1JVRkJPRUpZTEU5QlFUbENMRU5CUVZBN1FVRkJaMFE3TzBGQlJYQkhPMEZCUTBFN1FVRkRUeXhUUVVGVFdDeFpRVUZVTEVOQlFYTkNkMElzUjBGQmRFSXNSVUZCTWtKRExFdEJRVE5DTEVWQlFXdERReXhuUWtGQmJFTXNSVUZCYjBRN1FVRkRla1JFTEZWQlFWRkJMRk5CUVZNc1JVRkJha0k3UVVGRFFVTXNjVUpCUVcxQ1FTeHZRa0ZCYjBJc1JVRkJka003TzBGQlJVRXNUVUZCU1VNc2JVTkJRVW83TzBGQlJVRXNUMEZCUzBFc1NVRkJTU3hEUVVGVUxFVkJRVmxCTEVsQlFVbEdMRTFCUVUxSExFMUJRWFJDTEVWQlFUaENSQ3hMUVVGTExFTkJRVzVETEVWQlFYTkRPMEZCUTNCRExGRkJRVWxHTEUxQlFVMUZMRU5CUVU0c1RVRkJZVWdzUjBGQmFrSXNSVUZCYzBJN1FVRkRjRUlzWVVGQlQwVXNhVUpCUVdsQ1F5eERRVUZxUWl4RFFVRlFPMEZCUTBRN1FVRkRSanM3UVVGRlJDeE5RVUZKUlN4clJFRkJTanM3UVVGRlFTeE5RVUZKTEhGQ1FVRnhRalZDTEhkQ1FVRjNRbXRDTEVsQlFYaENMRU5CUVRaQ1N5eEhRVUUzUWl4RFFVRjZRaXhGUVVFMFJEdEJRVU14UkVNc1ZVRkJUVXNzU1VGQlRpeERRVUZYVGl4SFFVRllPMEZCUTBGTExIVkNRVUZ0UWl4SlFVRkpSU3hMUVVGS0xFTkJRVlZRTEVsQlFVbEpMRTFCUVdRc1EwRkJia0k3UVVGRFFVWXNjVUpCUVdsQ1NTeEpRVUZxUWl4RFFVRnpRa1FzWjBKQlFYUkNPMEZCUTBFc1UwRkJTMFlzU1VGQlNTeERRVUZVTEVWQlFWbEJMRWxCUVVsSUxFbEJRVWxKTEUxQlFYQkNMRVZCUVRSQ1JDeExRVUZMTEVOQlFXcERMRVZCUVc5RE8wRkJRMnhEUlN4MVFrRkJhVUpHTEVOQlFXcENMRWxCUVhOQ00wSXNZVUZCWVhkQ0xFbEJRVWxITEVOQlFVb3NRMEZCWWl4RlFVRnhRa1lzUzBGQmNrSXNSVUZCTkVKRExHZENRVUUxUWl4RFFVRjBRanRCUVVORU8wRkJRMFJFTEZWQlFVMVBMRWRCUVU0N1FVRkRRVTRzY1VKQlFXbENUU3hIUVVGcVFqdEJRVU5CTEZkQlFVOUlMR2RDUVVGUU8wRkJRMFE3TzBGQlJVUXNUVUZCU1V3c1QwRkJUMEVzU1VGQlNWTXNUVUZCWml4RlFVRjFRanRCUVVOeVFsUXNWVUZCVFVFc1NVRkJTVk1zVFVGQlNpeEZRVUZPTzBGQlEwUTdPMEZCUlVRc1RVRkJTU3g1UkVGQlQxUXNSMEZCVUN4NVEwRkJUMEVzUjBGQlVDeFBRVUZsTEZGQlFXWXNTVUZCTWtKQkxGRkJRVkVzU1VGQmRrTXNSVUZCTmtNN1FVRkRNME5ETEZWQlFVMUxMRWxCUVU0c1EwRkJWMDRzUjBGQldEdEJRVU5CU3l4MVFrRkJiVUlzUlVGQmJrSTdRVUZEUVVnc2NVSkJRV2xDU1N4SlFVRnFRaXhEUVVGelFrUXNaMEpCUVhSQ08wRkJRMEVzVVVGQlNVc3NZVUZCWVN4RlFVRnFRanRCUVVGQkxGRkJRMGxETEhGRFFVUktPMEZCUlVFc1UwRkJTMEVzUjBGQlRDeEpRVUZaV0N4SFFVRmFMRVZCUVdsQ08wRkJRMlk3UVVGRFFTeFZRVUZKUVN4SlFVRkpXU3hqUVVGS0xFTkJRVzFDUkN4SFFVRnVRaXhEUVVGS0xFVkJRVFpDTzBGQlF6TkNSQ3h0UWtGQlYwb3NTVUZCV0N4RFFVRm5Ra3NzUjBGQmFFSTdRVUZEUkR0QlFVTkdPMEZCUTBSRUxHVkJRVmRITEVsQlFWZzdRVUZEUVN4VFFVRkxWaXhKUVVGSkxFTkJRVlFzUlVGQldVRXNTVUZCU1U4c1YwRkJWMDRzVFVGQk0wSXNSVUZCYlVORUxFdEJRVXNzUTBGQmVFTXNSVUZCTWtNN1FVRkRla05STEZsQlFVMUVMRmRCUVZkUUxFTkJRVmdzUTBGQlRqdEJRVU5CUlN4MVFrRkJhVUpOTEVkQlFXcENMRWxCUVhkQ2JrTXNZVUZCWVhkQ0xFbEJRVWxYTEVkQlFVb3NRMEZCWWl4RlFVRjFRbFlzUzBGQmRrSXNSVUZCT0VKRExHZENRVUU1UWl4RFFVRjRRanRCUVVORU8wRkJRMFJFTEZWQlFVMVBMRWRCUVU0N1FVRkRRVTRzY1VKQlFXbENUU3hIUVVGcVFqdEJRVU5FTEVkQmJrSkVMRTFCYlVKUE8wRkJRMHhJTEhWQ1FVRnRRa3dzUjBGQmJrSTdRVUZEUkR0QlFVTkVMRk5CUVU5TExHZENRVUZRTzBGQlEwUWlMQ0ptYVd4bElqb2lhbk52Ymk1cWN5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbWx0Y0c5eWRDQkVhV1ptSUdaeWIyMGdKeTR2WW1GelpTYzdYRzVwYlhCdmNuUWdlMnhwYm1WRWFXWm1mU0JtY205dElDY3VMMnhwYm1Vbk8xeHVYRzVqYjI1emRDQnZZbXBsWTNSUWNtOTBiM1I1Y0dWVWIxTjBjbWx1WnlBOUlFOWlhbVZqZEM1d2NtOTBiM1I1Y0dVdWRHOVRkSEpwYm1jN1hHNWNibHh1Wlhod2IzSjBJR052Ym5OMElHcHpiMjVFYVdabUlEMGdibVYzSUVScFptWW9LVHRjYmk4dklFUnBjMk55YVcxcGJtRjBaU0JpWlhSM1pXVnVJSFIzYnlCc2FXNWxjeUJ2WmlCd2NtVjBkSGt0Y0hKcGJuUmxaQ3dnYzJWeWFXRnNhWHBsWkNCS1UwOU9JSGRvWlhKbElHOXVaU0J2WmlCMGFHVnRJR2hoY3lCaFhHNHZMeUJrWVc1bmJHbHVaeUJqYjIxdFlTQmhibVFnZEdobElHOTBhR1Z5SUdSdlpYTnVKM1F1SUZSMWNtNXpJRzkxZENCcGJtTnNkV1JwYm1jZ2RHaGxJR1JoYm1kc2FXNW5JR052YlcxaElIbHBaV3hrY3lCMGFHVWdibWxqWlhOMElHOTFkSEIxZERwY2JtcHpiMjVFYVdabUxuVnpaVXh2Ym1kbGMzUlViMnRsYmlBOUlIUnlkV1U3WEc1Y2JtcHpiMjVFYVdabUxuUnZhMlZ1YVhwbElEMGdiR2x1WlVScFptWXVkRzlyWlc1cGVtVTdYRzVxYzI5dVJHbG1aaTVqWVhOMFNXNXdkWFFnUFNCbWRXNWpkR2x2YmloMllXeDFaU2tnZTF4dUlDQmpiMjV6ZENCN2RXNWtaV1pwYm1Wa1VtVndiR0ZqWlcxbGJuUjlJRDBnZEdocGN5NXZjSFJwYjI1ek8xeHVYRzRnSUhKbGRIVnliaUIwZVhCbGIyWWdkbUZzZFdVZ1BUMDlJQ2R6ZEhKcGJtY25JRDhnZG1Gc2RXVWdPaUJLVTA5T0xuTjBjbWx1WjJsbWVTaGpZVzV2Ym1sallXeHBlbVVvZG1Gc2RXVXBMQ0JtZFc1amRHbHZiaWhyTENCMktTQjdYRzRnSUNBZ2FXWWdLSFI1Y0dWdlppQjJJRDA5UFNBbmRXNWtaV1pwYm1Wa0p5a2dlMXh1SUNBZ0lDQWdjbVYwZFhKdUlIVnVaR1ZtYVc1bFpGSmxjR3hoWTJWdFpXNTBPMXh1SUNBZ0lIMWNibHh1SUNBZ0lISmxkSFZ5YmlCMk8xeHVJQ0I5TENBbklDQW5LVHRjYm4wN1hHNXFjMjl1UkdsbVppNWxjWFZoYkhNZ1BTQm1kVzVqZEdsdmJpaHNaV1owTENCeWFXZG9kQ2tnZTF4dUlDQnlaWFIxY200Z1JHbG1aaTV3Y205MGIzUjVjR1V1WlhGMVlXeHpMbU5oYkd3b2FuTnZia1JwWm1Zc0lHeGxablF1Y21Wd2JHRmpaU2d2TENoYlhGeHlYRnh1WFNrdlp5d2dKeVF4Snlrc0lISnBaMmgwTG5KbGNHeGhZMlVvTHl3b1cxeGNjbHhjYmwwcEwyY3NJQ2NrTVNjcEtUdGNibjA3WEc1Y2JtVjRjRzl5ZENCbWRXNWpkR2x2YmlCa2FXWm1Tbk52YmlodmJHUlBZbW9zSUc1bGQwOWlhaXdnYjNCMGFXOXVjeWtnZXlCeVpYUjFjbTRnYW5OdmJrUnBabVl1WkdsbVppaHZiR1JQWW1vc0lHNWxkMDlpYWl3Z2IzQjBhVzl1Y3lrN0lIMWNibHh1THk4Z1ZHaHBjeUJtZFc1amRHbHZiaUJvWVc1a2JHVnpJSFJvWlNCd2NtVnpaVzVqWlNCdlppQmphWEpqZFd4aGNpQnlaV1psY21WdVkyVnpJR0o1SUdKaGFXeHBibWNnYjNWMElIZG9aVzRnWlc1amIzVnVkR1Z5YVc1bklHRnVYRzR2THlCdlltcGxZM1FnZEdoaGRDQnBjeUJoYkhKbFlXUjVJRzl1SUhSb1pTQmNJbk4wWVdOclhDSWdiMllnYVhSbGJYTWdZbVZwYm1jZ2NISnZZMlZ6YzJWa0xseHVaWGh3YjNKMElHWjFibU4wYVc5dUlHTmhibTl1YVdOaGJHbDZaU2h2WW1vc0lITjBZV05yTENCeVpYQnNZV05sYldWdWRGTjBZV05yS1NCN1hHNGdJSE4wWVdOcklEMGdjM1JoWTJzZ2ZId2dXMTA3WEc0Z0lISmxjR3hoWTJWdFpXNTBVM1JoWTJzZ1BTQnlaWEJzWVdObGJXVnVkRk4wWVdOcklIeDhJRnRkTzF4dVhHNGdJR3hsZENCcE8xeHVYRzRnSUdadmNpQW9hU0E5SURBN0lHa2dQQ0J6ZEdGamF5NXNaVzVuZEdnN0lHa2dLejBnTVNrZ2UxeHVJQ0FnSUdsbUlDaHpkR0ZqYTF0cFhTQTlQVDBnYjJKcUtTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z2NtVndiR0ZqWlcxbGJuUlRkR0ZqYTF0cFhUdGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQnNaWFFnWTJGdWIyNXBZMkZzYVhwbFpFOWlhanRjYmx4dUlDQnBaaUFvSjF0dlltcGxZM1FnUVhKeVlYbGRKeUE5UFQwZ2IySnFaV04wVUhKdmRHOTBlWEJsVkc5VGRISnBibWN1WTJGc2JDaHZZbW9wS1NCN1hHNGdJQ0FnYzNSaFkyc3VjSFZ6YUNodlltb3BPMXh1SUNBZ0lHTmhibTl1YVdOaGJHbDZaV1JQWW1vZ1BTQnVaWGNnUVhKeVlYa29iMkpxTG14bGJtZDBhQ2s3WEc0Z0lDQWdjbVZ3YkdGalpXMWxiblJUZEdGamF5NXdkWE5vS0dOaGJtOXVhV05oYkdsNlpXUlBZbW9wTzF4dUlDQWdJR1p2Y2lBb2FTQTlJREE3SUdrZ1BDQnZZbW91YkdWdVozUm9PeUJwSUNzOUlERXBJSHRjYmlBZ0lDQWdJR05oYm05dWFXTmhiR2w2WldSUFltcGJhVjBnUFNCallXNXZibWxqWVd4cGVtVW9iMkpxVzJsZExDQnpkR0ZqYXl3Z2NtVndiR0ZqWlcxbGJuUlRkR0ZqYXlrN1hHNGdJQ0FnZlZ4dUlDQWdJSE4wWVdOckxuQnZjQ2dwTzF4dUlDQWdJSEpsY0d4aFkyVnRaVzUwVTNSaFkyc3VjRzl3S0NrN1hHNGdJQ0FnY21WMGRYSnVJR05oYm05dWFXTmhiR2w2WldSUFltbzdYRzRnSUgxY2JseHVJQ0JwWmlBb2IySnFJQ1ltSUc5aWFpNTBiMHBUVDA0cElIdGNiaUFnSUNCdlltb2dQU0J2WW1vdWRHOUtVMDlPS0NrN1hHNGdJSDFjYmx4dUlDQnBaaUFvZEhsd1pXOW1JRzlpYWlBOVBUMGdKMjlpYW1WamRDY2dKaVlnYjJKcUlDRTlQU0J1ZFd4c0tTQjdYRzRnSUNBZ2MzUmhZMnN1Y0hWemFDaHZZbW9wTzF4dUlDQWdJR05oYm05dWFXTmhiR2w2WldSUFltb2dQU0I3ZlR0Y2JpQWdJQ0J5WlhCc1lXTmxiV1Z1ZEZOMFlXTnJMbkIxYzJnb1kyRnViMjVwWTJGc2FYcGxaRTlpYWlrN1hHNGdJQ0FnYkdWMElITnZjblJsWkV0bGVYTWdQU0JiWFN4Y2JpQWdJQ0FnSUNBZ2EyVjVPMXh1SUNBZ0lHWnZjaUFvYTJWNUlHbHVJRzlpYWlrZ2UxeHVJQ0FnSUNBZ0x5b2dhWE4wWVc1aWRXd2dhV2R1YjNKbElHVnNjMlVnS2k5Y2JpQWdJQ0FnSUdsbUlDaHZZbW91YUdGelQzZHVVSEp2Y0dWeWRIa29hMlY1S1NrZ2UxeHVJQ0FnSUNBZ0lDQnpiM0owWldSTFpYbHpMbkIxYzJnb2EyVjVLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzRnSUNBZ2MyOXlkR1ZrUzJWNWN5NXpiM0owS0NrN1hHNGdJQ0FnWm05eUlDaHBJRDBnTURzZ2FTQThJSE52Y25SbFpFdGxlWE11YkdWdVozUm9PeUJwSUNzOUlERXBJSHRjYmlBZ0lDQWdJR3RsZVNBOUlITnZjblJsWkV0bGVYTmJhVjA3WEc0Z0lDQWdJQ0JqWVc1dmJtbGpZV3hwZW1Wa1QySnFXMnRsZVYwZ1BTQmpZVzV2Ym1sallXeHBlbVVvYjJKcVcydGxlVjBzSUhOMFlXTnJMQ0J5WlhCc1lXTmxiV1Z1ZEZOMFlXTnJLVHRjYmlBZ0lDQjlYRzRnSUNBZ2MzUmhZMnN1Y0c5d0tDazdYRzRnSUNBZ2NtVndiR0ZqWlcxbGJuUlRkR0ZqYXk1d2IzQW9LVHRjYmlBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0JqWVc1dmJtbGpZV3hwZW1Wa1QySnFJRDBnYjJKcU8xeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCallXNXZibWxqWVd4cGVtVmtUMkpxTzF4dWZWeHVJbDE5XG5cblxuLyoqKi8gfSksXG4vKiA5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyd1c2Ugc3RyaWN0JztcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLmFycmF5RGlmZiA9IHVuZGVmaW5lZDtcblx0ZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9kaWZmQXJyYXlzID0gZGlmZkFycmF5cztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19iYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9iYXNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Jhc2UpO1xuXG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3ZhciBhcnJheURpZmYgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9hcnJheURpZmYgPSBuZXcgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19iYXNlMlsnZGVmYXVsdCddIC8qaXN0YW5idWwgaWdub3JlIGVuZCovKCk7XG5cdGFycmF5RGlmZi50b2tlbml6ZSA9IGFycmF5RGlmZi5qb2luID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgcmV0dXJuIHZhbHVlLnNsaWNlKCk7XG5cdH07XG5cdGFycmF5RGlmZi5yZW1vdmVFbXB0eSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgIHJldHVybiB2YWx1ZTtcblx0fTtcblxuXHRmdW5jdGlvbiBkaWZmQXJyYXlzKG9sZEFyciwgbmV3QXJyLCBjYWxsYmFjaykge1xuXHQgIHJldHVybiBhcnJheURpZmYuZGlmZihvbGRBcnIsIG5ld0FyciwgY2FsbGJhY2spO1xuXHR9XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OWthV1ptTDJGeWNtRjVMbXB6SWwwc0ltNWhiV1Z6SWpwYkltUnBabVpCY25KaGVYTWlMQ0poY25KaGVVUnBabVlpTENKMGIydGxibWw2WlNJc0ltcHZhVzRpTENKMllXeDFaU0lzSW5Oc2FXTmxJaXdpY21WdGIzWmxSVzF3ZEhraUxDSnZiR1JCY25JaUxDSnVaWGRCY25JaUxDSmpZV3hzWW1GamF5SXNJbVJwWm1ZaVhTd2liV0Z3Y0dsdVozTWlPaUk3T3pzN1owTkJWV2RDUVN4VkxFZEJRVUZCTEZVN08wRkJWbWhDT3pzN096czdkVUpCUlU4c1NVRkJUVU1zYVVaQlFWa3NkMFZCUVd4Q08wRkJRMUJCTEZWQlFWVkRMRkZCUVZZc1IwRkJjVUpFTEZWQlFWVkZMRWxCUVZZc1IwRkJhVUlzVlVGQlUwTXNTMEZCVkN4RlFVRm5RanRCUVVOd1JDeFRRVUZQUVN4TlFVRk5ReXhMUVVGT0xFVkJRVkE3UVVGRFJDeERRVVpFTzBGQlIwRktMRlZCUVZWTExGZEJRVllzUjBGQmQwSXNWVUZCVTBZc1MwRkJWQ3hGUVVGblFqdEJRVU4wUXl4VFFVRlBRU3hMUVVGUU8wRkJRMFFzUTBGR1JEczdRVUZKVHl4VFFVRlRTaXhWUVVGVUxFTkJRVzlDVHl4TlFVRndRaXhGUVVFMFFrTXNUVUZCTlVJc1JVRkJiME5ETEZGQlFYQkRMRVZCUVRoRE8wRkJRVVVzVTBGQlQxSXNWVUZCVlZNc1NVRkJWaXhEUVVGbFNDeE5RVUZtTEVWQlFYVkNReXhOUVVGMlFpeEZRVUVyUWtNc1VVRkJMMElzUTBGQlVEdEJRVUZyUkNJc0ltWnBiR1VpT2lKaGNuSmhlUzVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCRWFXWm1JR1p5YjIwZ0p5NHZZbUZ6WlNjN1hHNWNibVY0Y0c5eWRDQmpiMjV6ZENCaGNuSmhlVVJwWm1ZZ1BTQnVaWGNnUkdsbVppZ3BPMXh1WVhKeVlYbEVhV1ptTG5SdmEyVnVhWHBsSUQwZ1lYSnlZWGxFYVdabUxtcHZhVzRnUFNCbWRXNWpkR2x2YmloMllXeDFaU2tnZTF4dUlDQnlaWFIxY200Z2RtRnNkV1V1YzJ4cFkyVW9LVHRjYm4wN1hHNWhjbkpoZVVScFptWXVjbVZ0YjNabFJXMXdkSGtnUFNCbWRXNWpkR2x2YmloMllXeDFaU2tnZTF4dUlDQnlaWFIxY200Z2RtRnNkV1U3WEc1OU8xeHVYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdaR2xtWmtGeWNtRjVjeWh2YkdSQmNuSXNJRzVsZDBGeWNpd2dZMkZzYkdKaFkyc3BJSHNnY21WMGRYSnVJR0Z5Y21GNVJHbG1aaTVrYVdabUtHOXNaRUZ5Y2l3Z2JtVjNRWEp5TENCallXeHNZbUZqYXlrN0lIMWNiaUpkZlE9PVxuXG5cbi8qKiovIH0pLFxuLyogMTAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovJ3VzZSBzdHJpY3QnO1xuXG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovYXBwbHlQYXRjaCA9IGFwcGx5UGF0Y2g7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2FwcGx5UGF0Y2hlcyA9IGFwcGx5UGF0Y2hlcztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19wYXJzZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2Rpc3RhbmNlSXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9kaXN0YW5jZUl0ZXJhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Rpc3RhbmNlSXRlcmF0b3IpO1xuXG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2Z1bmN0aW9uIGFwcGx5UGF0Y2goc291cmNlLCB1bmlEaWZmKSB7XG5cdCAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL29wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXG5cdCAgaWYgKHR5cGVvZiB1bmlEaWZmID09PSAnc3RyaW5nJykge1xuXHQgICAgdW5pRGlmZiA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oMCwgX3BhcnNlLnBhcnNlUGF0Y2gpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovKHVuaURpZmYpO1xuXHQgIH1cblxuXHQgIGlmIChBcnJheS5pc0FycmF5KHVuaURpZmYpKSB7XG5cdCAgICBpZiAodW5pRGlmZi5sZW5ndGggPiAxKSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcignYXBwbHlQYXRjaCBvbmx5IHdvcmtzIHdpdGggYSBzaW5nbGUgaW5wdXQuJyk7XG5cdCAgICB9XG5cblx0ICAgIHVuaURpZmYgPSB1bmlEaWZmWzBdO1xuXHQgIH1cblxuXHQgIC8vIEFwcGx5IHRoZSBkaWZmIHRvIHRoZSBpbnB1dFxuXHQgIHZhciBsaW5lcyA9IHNvdXJjZS5zcGxpdCgvXFxyXFxufFtcXG5cXHZcXGZcXHJcXHg4NV0vKSxcblx0ICAgICAgZGVsaW1pdGVycyA9IHNvdXJjZS5tYXRjaCgvXFxyXFxufFtcXG5cXHZcXGZcXHJcXHg4NV0vZykgfHwgW10sXG5cdCAgICAgIGh1bmtzID0gdW5pRGlmZi5odW5rcyxcblx0ICAgICAgY29tcGFyZUxpbmUgPSBvcHRpb25zLmNvbXBhcmVMaW5lIHx8IGZ1bmN0aW9uIChsaW5lTnVtYmVyLCBsaW5lLCBvcGVyYXRpb24sIHBhdGNoQ29udGVudCkgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3tcblx0ICAgIHJldHVybiAoLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9saW5lID09PSBwYXRjaENvbnRlbnRcblx0ICAgICk7XG5cdCAgfSxcblx0ICAgICAgZXJyb3JDb3VudCA9IDAsXG5cdCAgICAgIGZ1enpGYWN0b3IgPSBvcHRpb25zLmZ1enpGYWN0b3IgfHwgMCxcblx0ICAgICAgbWluTGluZSA9IDAsXG5cdCAgICAgIG9mZnNldCA9IDAsXG5cdCAgICAgIHJlbW92ZUVPRk5MID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZvaWQgMCAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyxcblx0ICAgICAgYWRkRU9GTkwgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdm9pZCAwIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdCAgLyoqXG5cdCAgICogQ2hlY2tzIGlmIHRoZSBodW5rIGV4YWN0bHkgZml0cyBvbiB0aGUgcHJvdmlkZWQgbG9jYXRpb25cblx0ICAgKi9cblx0ICBmdW5jdGlvbiBodW5rRml0cyhodW5rLCB0b1Bvcykge1xuXHQgICAgZm9yICh2YXIgaiA9IDA7IGogPCBodW5rLmxpbmVzLmxlbmd0aDsgaisrKSB7XG5cdCAgICAgIHZhciBsaW5lID0gaHVuay5saW5lc1tqXSxcblx0ICAgICAgICAgIG9wZXJhdGlvbiA9IGxpbmVbMF0sXG5cdCAgICAgICAgICBjb250ZW50ID0gbGluZS5zdWJzdHIoMSk7XG5cblx0ICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnIHx8IG9wZXJhdGlvbiA9PT0gJy0nKSB7XG5cdCAgICAgICAgLy8gQ29udGV4dCBzYW5pdHkgY2hlY2tcblx0ICAgICAgICBpZiAoIWNvbXBhcmVMaW5lKHRvUG9zICsgMSwgbGluZXNbdG9Qb3NdLCBvcGVyYXRpb24sIGNvbnRlbnQpKSB7XG5cdCAgICAgICAgICBlcnJvckNvdW50Kys7XG5cblx0ICAgICAgICAgIGlmIChlcnJvckNvdW50ID4gZnV6ekZhY3Rvcikge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRvUG9zKys7XG5cdCAgICAgIH1cblx0ICAgIH1cblxuXHQgICAgcmV0dXJuIHRydWU7XG5cdCAgfVxuXG5cdCAgLy8gU2VhcmNoIGJlc3QgZml0IG9mZnNldHMgZm9yIGVhY2ggaHVuayBiYXNlZCBvbiB0aGUgcHJldmlvdXMgb25lc1xuXHQgIGZvciAodmFyIGkgPSAwOyBpIDwgaHVua3MubGVuZ3RoOyBpKyspIHtcblx0ICAgIHZhciBodW5rID0gaHVua3NbaV0sXG5cdCAgICAgICAgbWF4TGluZSA9IGxpbmVzLmxlbmd0aCAtIGh1bmsub2xkTGluZXMsXG5cdCAgICAgICAgbG9jYWxPZmZzZXQgPSAwLFxuXHQgICAgICAgIHRvUG9zID0gb2Zmc2V0ICsgaHVuay5vbGRTdGFydCAtIDE7XG5cblx0ICAgIHZhciBpdGVyYXRvciA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oMCwgX2Rpc3RhbmNlSXRlcmF0b3IyWydkZWZhdWx0J10pIC8qaXN0YW5idWwgaWdub3JlIGVuZCovKHRvUG9zLCBtaW5MaW5lLCBtYXhMaW5lKTtcblxuXHQgICAgZm9yICg7IGxvY2FsT2Zmc2V0ICE9PSB1bmRlZmluZWQ7IGxvY2FsT2Zmc2V0ID0gaXRlcmF0b3IoKSkge1xuXHQgICAgICBpZiAoaHVua0ZpdHMoaHVuaywgdG9Qb3MgKyBsb2NhbE9mZnNldCkpIHtcblx0ICAgICAgICBodW5rLm9mZnNldCA9IG9mZnNldCArPSBsb2NhbE9mZnNldDtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgfVxuXHQgICAgfVxuXG5cdCAgICBpZiAobG9jYWxPZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9XG5cblx0ICAgIC8vIFNldCBsb3dlciB0ZXh0IGxpbWl0IHRvIGVuZCBvZiB0aGUgY3VycmVudCBodW5rLCBzbyBuZXh0IG9uZXMgZG9uJ3QgdHJ5XG5cdCAgICAvLyB0byBmaXQgb3ZlciBhbHJlYWR5IHBhdGNoZWQgdGV4dFxuXHQgICAgbWluTGluZSA9IGh1bmsub2Zmc2V0ICsgaHVuay5vbGRTdGFydCArIGh1bmsub2xkTGluZXM7XG5cdCAgfVxuXG5cdCAgLy8gQXBwbHkgcGF0Y2ggaHVua3Ncblx0ICB2YXIgZGlmZk9mZnNldCA9IDA7XG5cdCAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGh1bmtzLmxlbmd0aDsgX2krKykge1xuXHQgICAgdmFyIF9odW5rID0gaHVua3NbX2ldLFxuXHQgICAgICAgIF90b1BvcyA9IF9odW5rLm9sZFN0YXJ0ICsgX2h1bmsub2Zmc2V0ICsgZGlmZk9mZnNldCAtIDE7XG5cdCAgICBkaWZmT2Zmc2V0ICs9IF9odW5rLm5ld0xpbmVzIC0gX2h1bmsub2xkTGluZXM7XG5cblx0ICAgIGlmIChfdG9Qb3MgPCAwKSB7XG5cdCAgICAgIC8vIENyZWF0aW5nIGEgbmV3IGZpbGVcblx0ICAgICAgX3RvUG9zID0gMDtcblx0ICAgIH1cblxuXHQgICAgZm9yICh2YXIgaiA9IDA7IGogPCBfaHVuay5saW5lcy5sZW5ndGg7IGorKykge1xuXHQgICAgICB2YXIgbGluZSA9IF9odW5rLmxpbmVzW2pdLFxuXHQgICAgICAgICAgb3BlcmF0aW9uID0gbGluZVswXSxcblx0ICAgICAgICAgIGNvbnRlbnQgPSBsaW5lLnN1YnN0cigxKSxcblx0ICAgICAgICAgIGRlbGltaXRlciA9IF9odW5rLmxpbmVkZWxpbWl0ZXJzW2pdO1xuXG5cdCAgICAgIGlmIChvcGVyYXRpb24gPT09ICcgJykge1xuXHQgICAgICAgIF90b1BvcysrO1xuXHQgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJy0nKSB7XG5cdCAgICAgICAgbGluZXMuc3BsaWNlKF90b1BvcywgMSk7XG5cdCAgICAgICAgZGVsaW1pdGVycy5zcGxpY2UoX3RvUG9zLCAxKTtcblx0ICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHQgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJysnKSB7XG5cdCAgICAgICAgbGluZXMuc3BsaWNlKF90b1BvcywgMCwgY29udGVudCk7XG5cdCAgICAgICAgZGVsaW1pdGVycy5zcGxpY2UoX3RvUG9zLCAwLCBkZWxpbWl0ZXIpO1xuXHQgICAgICAgIF90b1BvcysrO1xuXHQgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJ1xcXFwnKSB7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzT3BlcmF0aW9uID0gX2h1bmsubGluZXNbaiAtIDFdID8gX2h1bmsubGluZXNbaiAtIDFdWzBdIDogbnVsbDtcblx0ICAgICAgICBpZiAocHJldmlvdXNPcGVyYXRpb24gPT09ICcrJykge1xuXHQgICAgICAgICAgcmVtb3ZlRU9GTkwgPSB0cnVlO1xuXHQgICAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNPcGVyYXRpb24gPT09ICctJykge1xuXHQgICAgICAgICAgYWRkRU9GTkwgPSB0cnVlO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblxuXHQgIC8vIEhhbmRsZSBFT0ZOTCBpbnNlcnRpb24vcmVtb3ZhbFxuXHQgIGlmIChyZW1vdmVFT0ZOTCkge1xuXHQgICAgd2hpbGUgKCFsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSkge1xuXHQgICAgICBsaW5lcy5wb3AoKTtcblx0ICAgICAgZGVsaW1pdGVycy5wb3AoKTtcblx0ICAgIH1cblx0ICB9IGVsc2UgaWYgKGFkZEVPRk5MKSB7XG5cdCAgICBsaW5lcy5wdXNoKCcnKTtcblx0ICAgIGRlbGltaXRlcnMucHVzaCgnXFxuJyk7XG5cdCAgfVxuXHQgIGZvciAodmFyIF9rID0gMDsgX2sgPCBsaW5lcy5sZW5ndGggLSAxOyBfaysrKSB7XG5cdCAgICBsaW5lc1tfa10gPSBsaW5lc1tfa10gKyBkZWxpbWl0ZXJzW19rXTtcblx0ICB9XG5cdCAgcmV0dXJuIGxpbmVzLmpvaW4oJycpO1xuXHR9XG5cblx0Ly8gV3JhcHBlciB0aGF0IHN1cHBvcnRzIG11bHRpcGxlIGZpbGUgcGF0Y2hlcyB2aWEgY2FsbGJhY2tzLlxuXHRmdW5jdGlvbiBhcHBseVBhdGNoZXModW5pRGlmZiwgb3B0aW9ucykge1xuXHQgIGlmICh0eXBlb2YgdW5pRGlmZiA9PT0gJ3N0cmluZycpIHtcblx0ICAgIHVuaURpZmYgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKDAsIF9wYXJzZS5wYXJzZVBhdGNoKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyh1bmlEaWZmKTtcblx0ICB9XG5cblx0ICB2YXIgY3VycmVudEluZGV4ID0gMDtcblx0ICBmdW5jdGlvbiBwcm9jZXNzSW5kZXgoKSB7XG5cdCAgICB2YXIgaW5kZXggPSB1bmlEaWZmW2N1cnJlbnRJbmRleCsrXTtcblx0ICAgIGlmICghaW5kZXgpIHtcblx0ICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoKTtcblx0ICAgIH1cblxuXHQgICAgb3B0aW9ucy5sb2FkRmlsZShpbmRleCwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuXHQgICAgICBpZiAoZXJyKSB7XG5cdCAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoZXJyKTtcblx0ICAgICAgfVxuXG5cdCAgICAgIHZhciB1cGRhdGVkQ29udGVudCA9IGFwcGx5UGF0Y2goZGF0YSwgaW5kZXgsIG9wdGlvbnMpO1xuXHQgICAgICBvcHRpb25zLnBhdGNoZWQoaW5kZXgsIHVwZGF0ZWRDb250ZW50LCBmdW5jdGlvbiAoZXJyKSB7XG5cdCAgICAgICAgaWYgKGVycikge1xuXHQgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoZXJyKTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBwcm9jZXNzSW5kZXgoKTtcblx0ICAgICAgfSk7XG5cdCAgICB9KTtcblx0ICB9XG5cdCAgcHJvY2Vzc0luZGV4KCk7XG5cdH1cblx0Ly8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5d1lYUmphQzloY0hCc2VTNXFjeUpkTENKdVlXMWxjeUk2V3lKaGNIQnNlVkJoZEdOb0lpd2lZWEJ3YkhsUVlYUmphR1Z6SWl3aWMyOTFjbU5sSWl3aWRXNXBSR2xtWmlJc0ltOXdkR2x2Ym5NaUxDSkJjbkpoZVNJc0ltbHpRWEp5WVhraUxDSnNaVzVuZEdnaUxDSkZjbkp2Y2lJc0lteHBibVZ6SWl3aWMzQnNhWFFpTENKa1pXeHBiV2wwWlhKeklpd2liV0YwWTJnaUxDSm9kVzVyY3lJc0ltTnZiWEJoY21WTWFXNWxJaXdpYkdsdVpVNTFiV0psY2lJc0lteHBibVVpTENKdmNHVnlZWFJwYjI0aUxDSndZWFJqYUVOdmJuUmxiblFpTENKbGNuSnZja052ZFc1MElpd2lablY2ZWtaaFkzUnZjaUlzSW0xcGJreHBibVVpTENKdlptWnpaWFFpTENKeVpXMXZkbVZGVDBaT1RDSXNJbUZrWkVWUFJrNU1JaXdpYUhWdWEwWnBkSE1pTENKb2RXNXJJaXdpZEc5UWIzTWlMQ0pxSWl3aVkyOXVkR1Z1ZENJc0luTjFZbk4wY2lJc0lta2lMQ0p0WVhoTWFXNWxJaXdpYjJ4a1RHbHVaWE1pTENKc2IyTmhiRTltWm5ObGRDSXNJbTlzWkZOMFlYSjBJaXdpYVhSbGNtRjBiM0lpTENKMWJtUmxabWx1WldRaUxDSmthV1ptVDJabWMyVjBJaXdpYm1WM1RHbHVaWE1pTENKa1pXeHBiV2wwWlhJaUxDSnNhVzVsWkdWc2FXMXBkR1Z5Y3lJc0luTndiR2xqWlNJc0luQnlaWFpwYjNWelQzQmxjbUYwYVc5dUlpd2ljRzl3SWl3aWNIVnphQ0lzSWw5cklpd2lhbTlwYmlJc0ltTjFjbkpsYm5SSmJtUmxlQ0lzSW5CeWIyTmxjM05KYm1SbGVDSXNJbWx1WkdWNElpd2lZMjl0Y0d4bGRHVWlMQ0pzYjJGa1JtbHNaU0lzSW1WeWNpSXNJbVJoZEdFaUxDSjFjR1JoZEdWa1EyOXVkR1Z1ZENJc0luQmhkR05vWldRaVhTd2liV0Z3Y0dsdVozTWlPaUk3T3p0blEwRkhaMEpCTEZVc1IwRkJRVUVzVlR0NVJFRnZTVUZETEZrc1IwRkJRVUVzV1RzN1FVRjJTV2hDT3p0QlFVTkJPenM3T3pzN2RVSkJSVThzVTBGQlUwUXNWVUZCVkN4RFFVRnZRa1VzVFVGQmNFSXNSVUZCTkVKRExFOUJRVFZDTEVWQlFXMUVPMEZCUVVFc2MwUkJRV1JETEU5QlFXTXNkVVZCUVVvc1JVRkJTVHM3UVVGRGVFUXNUVUZCU1N4UFFVRlBSQ3hQUVVGUUxFdEJRVzFDTEZGQlFYWkNMRVZCUVdsRE8wRkJReTlDUVN4alFVRlZMSGRGUVVGWFFTeFBRVUZZTEVOQlFWWTdRVUZEUkRzN1FVRkZSQ3hOUVVGSlJTeE5RVUZOUXl4UFFVRk9MRU5CUVdOSUxFOUJRV1FzUTBGQlNpeEZRVUUwUWp0QlFVTXhRaXhSUVVGSlFTeFJRVUZSU1N4TlFVRlNMRWRCUVdsQ0xFTkJRWEpDTEVWQlFYZENPMEZCUTNSQ0xGbEJRVTBzU1VGQlNVTXNTMEZCU2l4RFFVRlZMRFJEUVVGV0xFTkJRVTQ3UVVGRFJEczdRVUZGUkV3c1kwRkJWVUVzVVVGQlVTeERRVUZTTEVOQlFWWTdRVUZEUkRzN1FVRkZSRHRCUVVOQkxFMUJRVWxOTEZGQlFWRlFMRTlCUVU5UkxFdEJRVkFzUTBGQllTeHhRa0ZCWWl4RFFVRmFPMEZCUVVFc1RVRkRTVU1zWVVGQllWUXNUMEZCVDFVc1MwRkJVQ3hEUVVGaExITkNRVUZpTEV0QlFYZERMRVZCUkhwRU8wRkJRVUVzVFVGRlNVTXNVVUZCVVZZc1VVRkJVVlVzUzBGR2NFSTdRVUZCUVN4TlFVbEpReXhqUVVGalZpeFJRVUZSVlN4WFFVRlNMRWxCUVhkQ0xGVkJRVU5ETEZWQlFVUXNSVUZCWVVNc1NVRkJZaXhGUVVGdFFrTXNVMEZCYmtJc1JVRkJPRUpETEZsQlFUbENPMEZCUVVFc2JVTkJRU3REUml4VFFVRlRSVHRCUVVGNFJEdEJRVUZCTEVkQlNqRkRPMEZCUVVFc1RVRkxTVU1zWVVGQllTeERRVXhxUWp0QlFVRkJMRTFCVFVsRExHRkJRV0ZvUWl4UlFVRlJaMElzVlVGQlVpeEpRVUZ6UWl4RFFVNTJRenRCUVVGQkxFMUJUMGxETEZWQlFWVXNRMEZRWkR0QlFVRkJMRTFCVVVsRExGTkJRVk1zUTBGU1lqdEJRVUZCTEUxQlZVbERMRFpEUVZaS08wRkJRVUVzVFVGWFNVTXNNRU5CV0VvN08wRkJZVUU3T3p0QlFVZEJMRmRCUVZORExGRkJRVlFzUTBGQmEwSkRMRWxCUVd4Q0xFVkJRWGRDUXl4TFFVRjRRaXhGUVVFclFqdEJRVU0zUWl4VFFVRkxMRWxCUVVsRExFbEJRVWtzUTBGQllpeEZRVUZuUWtFc1NVRkJTVVlzUzBGQlMycENMRXRCUVV3c1EwRkJWMFlzVFVGQkwwSXNSVUZCZFVOeFFpeEhRVUYyUXl4RlFVRTBRenRCUVVNeFF5eFZRVUZKV2l4UFFVRlBWU3hMUVVGTGFrSXNTMEZCVEN4RFFVRlhiVUlzUTBGQldDeERRVUZZTzBGQlFVRXNWVUZEU1Znc1dVRkJXVVFzUzBGQlN5eERRVUZNTEVOQlJHaENPMEZCUVVFc1ZVRkZTV0VzVlVGQlZXSXNTMEZCUzJNc1RVRkJUQ3hEUVVGWkxFTkJRVm9zUTBGR1pEczdRVUZKUVN4VlFVRkpZaXhqUVVGakxFZEJRV1FzU1VGQmNVSkJMR05CUVdNc1IwRkJka01zUlVGQk5FTTdRVUZETVVNN1FVRkRRU3haUVVGSkxFTkJRVU5JTEZsQlFWbGhMRkZCUVZFc1EwRkJjRUlzUlVGQmRVSnNRaXhOUVVGTmEwSXNTMEZCVGl4RFFVRjJRaXhGUVVGeFExWXNVMEZCY2tNc1JVRkJaMFJaTEU5QlFXaEVMRU5CUVV3c1JVRkJLMFE3UVVGRE4wUldPenRCUVVWQkxHTkJRVWxCTEdGQlFXRkRMRlZCUVdwQ0xFVkJRVFpDTzBGQlF6TkNMRzFDUVVGUExFdEJRVkE3UVVGRFJEdEJRVU5HTzBGQlEwUlBPMEZCUTBRN1FVRkRSanM3UVVGRlJDeFhRVUZQTEVsQlFWQTdRVUZEUkRzN1FVRkZSRHRCUVVOQkxFOUJRVXNzU1VGQlNVa3NTVUZCU1N4RFFVRmlMRVZCUVdkQ1FTeEpRVUZKYkVJc1RVRkJUVTRzVFVGQk1VSXNSVUZCYTBOM1FpeEhRVUZzUXl4RlFVRjFRenRCUVVOeVF5eFJRVUZKVEN4UFFVRlBZaXhOUVVGTmEwSXNRMEZCVGl4RFFVRllPMEZCUVVFc1VVRkRTVU1zVlVGQlZYWkNMRTFCUVUxR0xFMUJRVTRzUjBGQlpXMUNMRXRCUVV0UExGRkJSR3hETzBGQlFVRXNVVUZGU1VNc1kwRkJZeXhEUVVac1FqdEJRVUZCTEZGQlIwbFFMRkZCUVZGTUxGTkJRVk5KTEV0QlFVdFRMRkZCUVdRc1IwRkJlVUlzUTBGSWNrTTdPMEZCUzBFc1VVRkJTVU1zVjBGQlZ5eHZSa0ZCYVVKVUxFdEJRV3BDTEVWQlFYZENUaXhQUVVGNFFpeEZRVUZwUTFjc1QwRkJha01zUTBGQlpqczdRVUZGUVN4WFFVRlBSU3huUWtGQlowSkhMRk5CUVhaQ0xFVkJRV3REU0N4alFVRmpSU3hWUVVGb1JDeEZRVUUwUkR0QlFVTXhSQ3hWUVVGSldDeFRRVUZUUXl4SlFVRlVMRVZCUVdWRExGRkJRVkZQTEZkQlFYWkNMRU5CUVVvc1JVRkJlVU03UVVGRGRrTlNMR0ZCUVV0S0xFMUJRVXdzUjBGQlkwRXNWVUZCVlZrc1YwRkJlRUk3UVVGRFFUdEJRVU5FTzBGQlEwWTdPMEZCUlVRc1VVRkJTVUVzWjBKQlFXZENSeXhUUVVGd1FpeEZRVUVyUWp0QlFVTTNRaXhoUVVGUExFdEJRVkE3UVVGRFJEczdRVUZGUkR0QlFVTkJPMEZCUTBGb1FpeGpRVUZWU3l4TFFVRkxTaXhOUVVGTUxFZEJRV05KTEV0QlFVdFRMRkZCUVc1Q0xFZEJRVGhDVkN4TFFVRkxUeXhSUVVFM1F6dEJRVU5FT3p0QlFVVkVPMEZCUTBFc1RVRkJTVXNzWVVGQllTeERRVUZxUWp0QlFVTkJMRTlCUVVzc1NVRkJTVkFzUzBGQlNTeERRVUZpTEVWQlFXZENRU3hMUVVGSmJFSXNUVUZCVFU0c1RVRkJNVUlzUlVGQmEwTjNRaXhKUVVGc1F5eEZRVUYxUXp0QlFVTnlReXhSUVVGSlRDeFJRVUZQWWl4TlFVRk5hMElzUlVGQlRpeERRVUZZTzBGQlFVRXNVVUZEU1Vvc1UwRkJVVVFzVFVGQlMxTXNVVUZCVEN4SFFVRm5RbFFzVFVGQlMwb3NUVUZCY2tJc1IwRkJPRUpuUWl4VlFVRTVRaXhIUVVFeVF5eERRVVIyUkR0QlFVVkJRU3hyUWtGQlkxb3NUVUZCUzJFc1VVRkJUQ3hIUVVGblFtSXNUVUZCUzA4c1VVRkJia003TzBGQlJVRXNVVUZCU1U0c1UwRkJVU3hEUVVGYUxFVkJRV1U3UVVGQlJUdEJRVU5tUVN4bFFVRlJMRU5CUVZJN1FVRkRSRHM3UVVGRlJDeFRRVUZMTEVsQlFVbERMRWxCUVVrc1EwRkJZaXhGUVVGblFrRXNTVUZCU1VZc1RVRkJTMnBDTEV0QlFVd3NRMEZCVjBZc1RVRkJMMElzUlVGQmRVTnhRaXhIUVVGMlF5eEZRVUUwUXp0QlFVTXhReXhWUVVGSldpeFBRVUZQVlN4TlFVRkxha0lzUzBGQlRDeERRVUZYYlVJc1EwRkJXQ3hEUVVGWU8wRkJRVUVzVlVGRFNWZ3NXVUZCV1VRc1MwRkJTeXhEUVVGTUxFTkJSR2hDTzBGQlFVRXNWVUZGU1dFc1ZVRkJWV0lzUzBGQlMyTXNUVUZCVEN4RFFVRlpMRU5CUVZvc1EwRkdaRHRCUVVGQkxGVkJSMGxWTEZsQlFWbGtMRTFCUVV0bExHTkJRVXdzUTBGQmIwSmlMRU5CUVhCQ0xFTkJTR2hDT3p0QlFVdEJMRlZCUVVsWUxHTkJRV01zUjBGQmJFSXNSVUZCZFVJN1FVRkRja0pWTzBGQlEwUXNUMEZHUkN4TlFVVlBMRWxCUVVsV0xHTkJRV01zUjBGQmJFSXNSVUZCZFVJN1FVRkROVUpTTEdOQlFVMXBReXhOUVVGT0xFTkJRV0ZtTEUxQlFXSXNSVUZCYjBJc1EwRkJjRUk3UVVGRFFXaENMRzFDUVVGWEswSXNUVUZCV0N4RFFVRnJRbVlzVFVGQmJFSXNSVUZCZVVJc1EwRkJla0k3UVVGRFJqdEJRVU5ETEU5QlNrMHNUVUZKUVN4SlFVRkpWaXhqUVVGakxFZEJRV3hDTEVWQlFYVkNPMEZCUXpWQ1VpeGpRVUZOYVVNc1RVRkJUaXhEUVVGaFppeE5RVUZpTEVWQlFXOUNMRU5CUVhCQ0xFVkJRWFZDUlN4UFFVRjJRanRCUVVOQmJFSXNiVUpCUVZjclFpeE5RVUZZTEVOQlFXdENaaXhOUVVGc1FpeEZRVUY1UWl4RFFVRjZRaXhGUVVFMFFtRXNVMEZCTlVJN1FVRkRRV0k3UVVGRFJDeFBRVXBOTEUxQlNVRXNTVUZCU1ZZc1kwRkJZeXhKUVVGc1FpeEZRVUYzUWp0QlFVTTNRaXhaUVVGSk1FSXNiMEpCUVc5Q2FrSXNUVUZCUzJwQ0xFdEJRVXdzUTBGQlYyMUNMRWxCUVVrc1EwRkJaaXhKUVVGdlFrWXNUVUZCUzJwQ0xFdEJRVXdzUTBGQlYyMUNMRWxCUVVrc1EwRkJaaXhGUVVGclFpeERRVUZzUWl4RFFVRndRaXhIUVVFeVF5eEpRVUZ1UlR0QlFVTkJMRmxCUVVsbExITkNRVUZ6UWl4SFFVRXhRaXhGUVVFclFqdEJRVU0zUW5CQ0xIZENRVUZqTEVsQlFXUTdRVUZEUkN4VFFVWkVMRTFCUlU4c1NVRkJTVzlDTEhOQ1FVRnpRaXhIUVVFeFFpeEZRVUVyUWp0QlFVTndRMjVDTEhGQ1FVRlhMRWxCUVZnN1FVRkRSRHRCUVVOR08wRkJRMFk3UVVGRFJqczdRVUZGUkR0QlFVTkJMRTFCUVVsRUxGZEJRVW9zUlVGQmFVSTdRVUZEWml4WFFVRlBMRU5CUVVOa0xFMUJRVTFCTEUxQlFVMUdMRTFCUVU0c1IwRkJaU3hEUVVGeVFpeERRVUZTTEVWQlFXbERPMEZCUXk5Q1JTeFpRVUZOYlVNc1IwRkJUanRCUVVOQmFrTXNhVUpCUVZkcFF5eEhRVUZZTzBGQlEwUTdRVUZEUml4SFFVeEVMRTFCUzA4c1NVRkJTWEJDTEZGQlFVb3NSVUZCWXp0QlFVTnVRbVlzVlVGQlRXOURMRWxCUVU0c1EwRkJWeXhGUVVGWU8wRkJRMEZzUXl4bFFVRlhhME1zU1VGQldDeERRVUZuUWl4SlFVRm9RanRCUVVORU8wRkJRMFFzVDBGQlN5eEpRVUZKUXl4TFFVRkxMRU5CUVdRc1JVRkJhVUpCTEV0QlFVdHlReXhOUVVGTlJpeE5RVUZPTEVkQlFXVXNRMEZCY2tNc1JVRkJkME4xUXl4SlFVRjRReXhGUVVFNFF6dEJRVU0xUTNKRExGVkJRVTF4UXl4RlFVRk9MRWxCUVZseVF5eE5RVUZOY1VNc1JVRkJUaXhKUVVGWmJrTXNWMEZCVjIxRExFVkJRVmdzUTBGQmVFSTdRVUZEUkR0QlFVTkVMRk5CUVU5eVF5eE5RVUZOYzBNc1NVRkJUaXhEUVVGWExFVkJRVmdzUTBGQlVEdEJRVU5FT3p0QlFVVkVPMEZCUTA4c1UwRkJVemxETEZsQlFWUXNRMEZCYzBKRkxFOUJRWFJDTEVWQlFTdENReXhQUVVFdlFpeEZRVUYzUXp0QlFVTTNReXhOUVVGSkxFOUJRVTlFTEU5QlFWQXNTMEZCYlVJc1VVRkJka0lzUlVGQmFVTTdRVUZETDBKQkxHTkJRVlVzZDBWQlFWZEJMRTlCUVZnc1EwRkJWanRCUVVORU96dEJRVVZFTEUxQlFVazJReXhsUVVGbExFTkJRVzVDTzBGQlEwRXNWMEZCVTBNc1dVRkJWQ3hIUVVGM1FqdEJRVU4wUWl4UlFVRkpReXhSUVVGUkwwTXNVVUZCVVRaRExHTkJRVklzUTBGQldqdEJRVU5CTEZGQlFVa3NRMEZCUTBVc1MwRkJUQ3hGUVVGWk8wRkJRMVlzWVVGQlR6bERMRkZCUVZFclF5eFJRVUZTTEVWQlFWQTdRVUZEUkRzN1FVRkZSQzlETEZsQlFWRm5SQ3hSUVVGU0xFTkJRV2xDUml4TFFVRnFRaXhGUVVGM1FpeFZRVUZUUnl4SFFVRlVMRVZCUVdORExFbEJRV1FzUlVGQmIwSTdRVUZETVVNc1ZVRkJTVVFzUjBGQlNpeEZRVUZUTzBGQlExQXNaVUZCVDJwRUxGRkJRVkVyUXl4UlFVRlNMRU5CUVdsQ1JTeEhRVUZxUWl4RFFVRlFPMEZCUTBRN08wRkJSVVFzVlVGQlNVVXNhVUpCUVdsQ2RrUXNWMEZCVjNORUxFbEJRVmdzUlVGQmFVSktMRXRCUVdwQ0xFVkJRWGRDT1VNc1QwRkJlRUlzUTBGQmNrSTdRVUZEUVVFc1kwRkJVVzlFTEU5QlFWSXNRMEZCWjBKT0xFdEJRV2hDTEVWQlFYVkNTeXhqUVVGMlFpeEZRVUYxUXl4VlFVRlRSaXhIUVVGVUxFVkJRV003UVVGRGJrUXNXVUZCU1VFc1IwRkJTaXhGUVVGVE8wRkJRMUFzYVVKQlFVOXFSQ3hSUVVGUkswTXNVVUZCVWl4RFFVRnBRa1VzUjBGQmFrSXNRMEZCVUR0QlFVTkVPenRCUVVWRVNqdEJRVU5FTEU5QlRrUTdRVUZQUkN4TFFXSkVPMEZCWTBRN1FVRkRSRUU3UVVGRFJDSXNJbVpwYkdVaU9pSmhjSEJzZVM1cWN5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbWx0Y0c5eWRDQjdjR0Z5YzJWUVlYUmphSDBnWm5KdmJTQW5MaTl3WVhKelpTYzdYRzVwYlhCdmNuUWdaR2x6ZEdGdVkyVkpkR1Z5WVhSdmNpQm1jbTl0SUNjdUxpOTFkR2xzTDJScGMzUmhibU5sTFdsMFpYSmhkRzl5Snp0Y2JseHVaWGh3YjNKMElHWjFibU4wYVc5dUlHRndjR3g1VUdGMFkyZ29jMjkxY21ObExDQjFibWxFYVdabUxDQnZjSFJwYjI1eklEMGdlMzBwSUh0Y2JpQWdhV1lnS0hSNWNHVnZaaUIxYm1sRWFXWm1JRDA5UFNBbmMzUnlhVzVuSnlrZ2UxeHVJQ0FnSUhWdWFVUnBabVlnUFNCd1lYSnpaVkJoZEdOb0tIVnVhVVJwWm1ZcE8xeHVJQ0I5WEc1Y2JpQWdhV1lnS0VGeWNtRjVMbWx6UVhKeVlYa29kVzVwUkdsbVppa3BJSHRjYmlBZ0lDQnBaaUFvZFc1cFJHbG1aaTVzWlc1bmRHZ2dQaUF4S1NCN1hHNGdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvSjJGd2NHeDVVR0YwWTJnZ2IyNXNlU0IzYjNKcmN5QjNhWFJvSUdFZ2MybHVaMnhsSUdsdWNIVjBMaWNwTzF4dUlDQWdJSDFjYmx4dUlDQWdJSFZ1YVVScFptWWdQU0IxYm1sRWFXWm1XekJkTzF4dUlDQjlYRzVjYmlBZ0x5OGdRWEJ3YkhrZ2RHaGxJR1JwWm1ZZ2RHOGdkR2hsSUdsdWNIVjBYRzRnSUd4bGRDQnNhVzVsY3lBOUlITnZkWEpqWlM1emNHeHBkQ2d2WEZ4eVhGeHVmRnRjWEc1Y1hIWmNYR1pjWEhKY1hIZzROVjB2S1N4Y2JpQWdJQ0FnSUdSbGJHbHRhWFJsY25NZ1BTQnpiM1Z5WTJVdWJXRjBZMmdvTDF4Y2NseGNibnhiWEZ4dVhGeDJYRnhtWEZ4eVhGeDRPRFZkTDJjcElIeDhJRnRkTEZ4dUlDQWdJQ0FnYUhWdWEzTWdQU0IxYm1sRWFXWm1MbWgxYm10ekxGeHVYRzRnSUNBZ0lDQmpiMjF3WVhKbFRHbHVaU0E5SUc5d2RHbHZibk11WTI5dGNHRnlaVXhwYm1VZ2ZId2dLQ2hzYVc1bFRuVnRZbVZ5TENCc2FXNWxMQ0J2Y0dWeVlYUnBiMjRzSUhCaGRHTm9RMjl1ZEdWdWRDa2dQVDRnYkdsdVpTQTlQVDBnY0dGMFkyaERiMjUwWlc1MEtTeGNiaUFnSUNBZ0lHVnljbTl5UTI5MWJuUWdQU0F3TEZ4dUlDQWdJQ0FnWm5WNmVrWmhZM1J2Y2lBOUlHOXdkR2x2Ym5NdVpuVjZla1poWTNSdmNpQjhmQ0F3TEZ4dUlDQWdJQ0FnYldsdVRHbHVaU0E5SURBc1hHNGdJQ0FnSUNCdlptWnpaWFFnUFNBd0xGeHVYRzRnSUNBZ0lDQnlaVzF2ZG1WRlQwWk9UQ3hjYmlBZ0lDQWdJR0ZrWkVWUFJrNU1PMXh1WEc0Z0lDOHFLbHh1SUNBZ0tpQkRhR1ZqYTNNZ2FXWWdkR2hsSUdoMWJtc2daWGhoWTNSc2VTQm1hWFJ6SUc5dUlIUm9aU0J3Y205MmFXUmxaQ0JzYjJOaGRHbHZibHh1SUNBZ0tpOWNiaUFnWm5WdVkzUnBiMjRnYUhWdWEwWnBkSE1vYUhWdWF5d2dkRzlRYjNNcElIdGNiaUFnSUNCbWIzSWdLR3hsZENCcUlEMGdNRHNnYWlBOElHaDFibXN1YkdsdVpYTXViR1Z1WjNSb095QnFLeXNwSUh0Y2JpQWdJQ0FnSUd4bGRDQnNhVzVsSUQwZ2FIVnVheTVzYVc1bGMxdHFYU3hjYmlBZ0lDQWdJQ0FnSUNCdmNHVnlZWFJwYjI0Z1BTQnNhVzVsV3pCZExGeHVJQ0FnSUNBZ0lDQWdJR052Ym5SbGJuUWdQU0JzYVc1bExuTjFZbk4wY2lneEtUdGNibHh1SUNBZ0lDQWdhV1lnS0c5d1pYSmhkR2x2YmlBOVBUMGdKeUFuSUh4OElHOXdaWEpoZEdsdmJpQTlQVDBnSnkwbktTQjdYRzRnSUNBZ0lDQWdJQzh2SUVOdmJuUmxlSFFnYzJGdWFYUjVJR05vWldOclhHNGdJQ0FnSUNBZ0lHbG1JQ2doWTI5dGNHRnlaVXhwYm1Vb2RHOVFiM01nS3lBeExDQnNhVzVsYzF0MGIxQnZjMTBzSUc5d1pYSmhkR2x2Yml3Z1kyOXVkR1Z1ZENrcElIdGNiaUFnSUNBZ0lDQWdJQ0JsY25KdmNrTnZkVzUwS3lzN1hHNWNiaUFnSUNBZ0lDQWdJQ0JwWmlBb1pYSnliM0pEYjNWdWRDQStJR1oxZW5wR1lXTjBiM0lwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQm1ZV3h6WlR0Y2JpQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnZEc5UWIzTXJLenRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzVjYmlBZ0lDQnlaWFIxY200Z2RISjFaVHRjYmlBZ2ZWeHVYRzRnSUM4dklGTmxZWEpqYUNCaVpYTjBJR1pwZENCdlptWnpaWFJ6SUdadmNpQmxZV05vSUdoMWJtc2dZbUZ6WldRZ2IyNGdkR2hsSUhCeVpYWnBiM1Z6SUc5dVpYTmNiaUFnWm05eUlDaHNaWFFnYVNBOUlEQTdJR2tnUENCb2RXNXJjeTVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVJQ0FnSUd4bGRDQm9kVzVySUQwZ2FIVnVhM05iYVYwc1hHNGdJQ0FnSUNBZ0lHMWhlRXhwYm1VZ1BTQnNhVzVsY3k1c1pXNW5kR2dnTFNCb2RXNXJMbTlzWkV4cGJtVnpMRnh1SUNBZ0lDQWdJQ0JzYjJOaGJFOW1abk5sZENBOUlEQXNYRzRnSUNBZ0lDQWdJSFJ2VUc5eklEMGdiMlptYzJWMElDc2dhSFZ1YXk1dmJHUlRkR0Z5ZENBdElERTdYRzVjYmlBZ0lDQnNaWFFnYVhSbGNtRjBiM0lnUFNCa2FYTjBZVzVqWlVsMFpYSmhkRzl5S0hSdlVHOXpMQ0J0YVc1TWFXNWxMQ0J0WVhoTWFXNWxLVHRjYmx4dUlDQWdJR1p2Y2lBb095QnNiMk5oYkU5bVpuTmxkQ0FoUFQwZ2RXNWtaV1pwYm1Wa095QnNiMk5oYkU5bVpuTmxkQ0E5SUdsMFpYSmhkRzl5S0NrcElIdGNiaUFnSUNBZ0lHbG1JQ2hvZFc1clJtbDBjeWhvZFc1ckxDQjBiMUJ2Y3lBcklHeHZZMkZzVDJabWMyVjBLU2tnZTF4dUlDQWdJQ0FnSUNCb2RXNXJMbTltWm5ObGRDQTlJRzltWm5ObGRDQXJQU0JzYjJOaGJFOW1abk5sZER0Y2JpQWdJQ0FnSUNBZ1luSmxZV3M3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1WEc0Z0lDQWdhV1lnS0d4dlkyRnNUMlptYzJWMElEMDlQU0IxYm1SbFptbHVaV1FwSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUJtWVd4elpUdGNiaUFnSUNCOVhHNWNiaUFnSUNBdkx5QlRaWFFnYkc5M1pYSWdkR1Y0ZENCc2FXMXBkQ0IwYnlCbGJtUWdiMllnZEdobElHTjFjbkpsYm5RZ2FIVnVheXdnYzI4Z2JtVjRkQ0J2Ym1WeklHUnZiaWQwSUhSeWVWeHVJQ0FnSUM4dklIUnZJR1pwZENCdmRtVnlJR0ZzY21WaFpIa2djR0YwWTJobFpDQjBaWGgwWEc0Z0lDQWdiV2x1VEdsdVpTQTlJR2gxYm1zdWIyWm1jMlYwSUNzZ2FIVnVheTV2YkdSVGRHRnlkQ0FySUdoMWJtc3ViMnhrVEdsdVpYTTdYRzRnSUgxY2JseHVJQ0F2THlCQmNIQnNlU0J3WVhSamFDQm9kVzVyYzF4dUlDQnNaWFFnWkdsbVprOW1abk5sZENBOUlEQTdYRzRnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z2FIVnVhM011YkdWdVozUm9PeUJwS3lzcElIdGNiaUFnSUNCc1pYUWdhSFZ1YXlBOUlHaDFibXR6VzJsZExGeHVJQ0FnSUNBZ0lDQjBiMUJ2Y3lBOUlHaDFibXN1YjJ4a1UzUmhjblFnS3lCb2RXNXJMbTltWm5ObGRDQXJJR1JwWm1aUFptWnpaWFFnTFNBeE8xeHVJQ0FnSUdScFptWlBabVp6WlhRZ0t6MGdhSFZ1YXk1dVpYZE1hVzVsY3lBdElHaDFibXN1YjJ4a1RHbHVaWE03WEc1Y2JpQWdJQ0JwWmlBb2RHOVFiM01nUENBd0tTQjdJQzh2SUVOeVpXRjBhVzVuSUdFZ2JtVjNJR1pwYkdWY2JpQWdJQ0FnSUhSdlVHOXpJRDBnTUR0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JtYjNJZ0tHeGxkQ0JxSUQwZ01Ec2dhaUE4SUdoMWJtc3ViR2x1WlhNdWJHVnVaM1JvT3lCcUt5c3BJSHRjYmlBZ0lDQWdJR3hsZENCc2FXNWxJRDBnYUhWdWF5NXNhVzVsYzF0cVhTeGNiaUFnSUNBZ0lDQWdJQ0J2Y0dWeVlYUnBiMjRnUFNCc2FXNWxXekJkTEZ4dUlDQWdJQ0FnSUNBZ0lHTnZiblJsYm5RZ1BTQnNhVzVsTG5OMVluTjBjaWd4S1N4Y2JpQWdJQ0FnSUNBZ0lDQmtaV3hwYldsMFpYSWdQU0JvZFc1ckxteHBibVZrWld4cGJXbDBaWEp6VzJwZE8xeHVYRzRnSUNBZ0lDQnBaaUFvYjNCbGNtRjBhVzl1SUQwOVBTQW5JQ2NwSUh0Y2JpQWdJQ0FnSUNBZ2RHOVFiM01yS3p0Y2JpQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb2IzQmxjbUYwYVc5dUlEMDlQU0FuTFNjcElIdGNiaUFnSUNBZ0lDQWdiR2x1WlhNdWMzQnNhV05sS0hSdlVHOXpMQ0F4S1R0Y2JpQWdJQ0FnSUNBZ1pHVnNhVzFwZEdWeWN5NXpjR3hwWTJVb2RHOVFiM01zSURFcE8xeHVJQ0FnSUNBZ0x5b2dhWE4wWVc1aWRXd2dhV2R1YjNKbElHVnNjMlVnS2k5Y2JpQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb2IzQmxjbUYwYVc5dUlEMDlQU0FuS3ljcElIdGNiaUFnSUNBZ0lDQWdiR2x1WlhNdWMzQnNhV05sS0hSdlVHOXpMQ0F3TENCamIyNTBaVzUwS1R0Y2JpQWdJQ0FnSUNBZ1pHVnNhVzFwZEdWeWN5NXpjR3hwWTJVb2RHOVFiM01zSURBc0lHUmxiR2x0YVhSbGNpazdYRzRnSUNBZ0lDQWdJSFJ2VUc5ekt5czdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLRzl3WlhKaGRHbHZiaUE5UFQwZ0oxeGNYRnduS1NCN1hHNGdJQ0FnSUNBZ0lHeGxkQ0J3Y21WMmFXOTFjMDl3WlhKaGRHbHZiaUE5SUdoMWJtc3ViR2x1WlhOYmFpQXRJREZkSUQ4Z2FIVnVheTVzYVc1bGMxdHFJQzBnTVYxYk1GMGdPaUJ1ZFd4c08xeHVJQ0FnSUNBZ0lDQnBaaUFvY0hKbGRtbHZkWE5QY0dWeVlYUnBiMjRnUFQwOUlDY3JKeWtnZTF4dUlDQWdJQ0FnSUNBZ0lISmxiVzkyWlVWUFJrNU1JRDBnZEhKMVpUdGNiaUFnSUNBZ0lDQWdmU0JsYkhObElHbG1JQ2h3Y21WMmFXOTFjMDl3WlhKaGRHbHZiaUE5UFQwZ0p5MG5LU0I3WEc0Z0lDQWdJQ0FnSUNBZ1lXUmtSVTlHVGt3Z1BTQjBjblZsTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQjlYRzVjYmlBZ0x5OGdTR0Z1Wkd4bElFVlBSazVNSUdsdWMyVnlkR2x2Ymk5eVpXMXZkbUZzWEc0Z0lHbG1JQ2h5WlcxdmRtVkZUMFpPVENrZ2UxeHVJQ0FnSUhkb2FXeGxJQ2doYkdsdVpYTmJiR2x1WlhNdWJHVnVaM1JvSUMwZ01WMHBJSHRjYmlBZ0lDQWdJR3hwYm1WekxuQnZjQ2dwTzF4dUlDQWdJQ0FnWkdWc2FXMXBkR1Z5Y3k1d2IzQW9LVHRjYmlBZ0lDQjlYRzRnSUgwZ1pXeHpaU0JwWmlBb1lXUmtSVTlHVGt3cElIdGNiaUFnSUNCc2FXNWxjeTV3ZFhOb0tDY25LVHRjYmlBZ0lDQmtaV3hwYldsMFpYSnpMbkIxYzJnb0oxeGNiaWNwTzF4dUlDQjlYRzRnSUdadmNpQW9iR1YwSUY5cklEMGdNRHNnWDJzZ1BDQnNhVzVsY3k1c1pXNW5kR2dnTFNBeE95QmZheXNyS1NCN1hHNGdJQ0FnYkdsdVpYTmJYMnRkSUQwZ2JHbHVaWE5iWDJ0ZElDc2daR1ZzYVcxcGRHVnljMXRmYTEwN1hHNGdJSDFjYmlBZ2NtVjBkWEp1SUd4cGJtVnpMbXB2YVc0b0p5Y3BPMXh1ZlZ4dVhHNHZMeUJYY21Gd2NHVnlJSFJvWVhRZ2MzVndjRzl5ZEhNZ2JYVnNkR2x3YkdVZ1ptbHNaU0J3WVhSamFHVnpJSFpwWVNCallXeHNZbUZqYTNNdVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1lYQndiSGxRWVhSamFHVnpLSFZ1YVVScFptWXNJRzl3ZEdsdmJuTXBJSHRjYmlBZ2FXWWdLSFI1Y0dWdlppQjFibWxFYVdabUlEMDlQU0FuYzNSeWFXNW5KeWtnZTF4dUlDQWdJSFZ1YVVScFptWWdQU0J3WVhKelpWQmhkR05vS0hWdWFVUnBabVlwTzF4dUlDQjlYRzVjYmlBZ2JHVjBJR04xY25KbGJuUkpibVJsZUNBOUlEQTdYRzRnSUdaMWJtTjBhVzl1SUhCeWIyTmxjM05KYm1SbGVDZ3BJSHRjYmlBZ0lDQnNaWFFnYVc1a1pYZ2dQU0IxYm1sRWFXWm1XMk4xY25KbGJuUkpibVJsZUNzclhUdGNiaUFnSUNCcFppQW9JV2x1WkdWNEtTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z2IzQjBhVzl1Y3k1amIyMXdiR1YwWlNncE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUc5d2RHbHZibk11Ykc5aFpFWnBiR1VvYVc1a1pYZ3NJR1oxYm1OMGFXOXVLR1Z5Y2l3Z1pHRjBZU2tnZTF4dUlDQWdJQ0FnYVdZZ0tHVnljaWtnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnYjNCMGFXOXVjeTVqYjIxd2JHVjBaU2hsY25JcE8xeHVJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQnNaWFFnZFhCa1lYUmxaRU52Ym5SbGJuUWdQU0JoY0hCc2VWQmhkR05vS0dSaGRHRXNJR2x1WkdWNExDQnZjSFJwYjI1ektUdGNiaUFnSUNBZ0lHOXdkR2x2Ym5NdWNHRjBZMmhsWkNocGJtUmxlQ3dnZFhCa1lYUmxaRU52Ym5SbGJuUXNJR1oxYm1OMGFXOXVLR1Z5Y2lrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvWlhKeUtTQjdYRzRnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJRzl3ZEdsdmJuTXVZMjl0Y0d4bGRHVW9aWEp5S1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJSEJ5YjJObGMzTkpibVJsZUNncE8xeHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ2ZTazdYRzRnSUgxY2JpQWdjSEp2WTJWemMwbHVaR1Y0S0NrN1hHNTlYRzRpWFgwPVxuXG5cbi8qKiovIH0pLFxuLyogMTEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovJ3VzZSBzdHJpY3QnO1xuXG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovcGFyc2VQYXRjaCA9IHBhcnNlUGF0Y2g7XG5cdGZ1bmN0aW9uIHBhcnNlUGF0Y2godW5pRGlmZikge1xuXHQgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9vcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuXHQgIHZhciBkaWZmc3RyID0gdW5pRGlmZi5zcGxpdCgvXFxyXFxufFtcXG5cXHZcXGZcXHJcXHg4NV0vKSxcblx0ICAgICAgZGVsaW1pdGVycyA9IHVuaURpZmYubWF0Y2goL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdL2cpIHx8IFtdLFxuXHQgICAgICBsaXN0ID0gW10sXG5cdCAgICAgIGkgPSAwO1xuXG5cdCAgZnVuY3Rpb24gcGFyc2VJbmRleCgpIHtcblx0ICAgIHZhciBpbmRleCA9IHt9O1xuXHQgICAgbGlzdC5wdXNoKGluZGV4KTtcblxuXHQgICAgLy8gUGFyc2UgZGlmZiBtZXRhZGF0YVxuXHQgICAgd2hpbGUgKGkgPCBkaWZmc3RyLmxlbmd0aCkge1xuXHQgICAgICB2YXIgbGluZSA9IGRpZmZzdHJbaV07XG5cblx0ICAgICAgLy8gRmlsZSBoZWFkZXIgZm91bmQsIGVuZCBwYXJzaW5nIGRpZmYgbWV0YWRhdGFcblx0ICAgICAgaWYgKC9eKFxcLVxcLVxcLXxcXCtcXCtcXCt8QEApXFxzLy50ZXN0KGxpbmUpKSB7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIH1cblxuXHQgICAgICAvLyBEaWZmIGluZGV4XG5cdCAgICAgIHZhciBoZWFkZXIgPSAvXig/OkluZGV4OnxkaWZmKD86IC1yIFxcdyspKylcXHMrKC4rPylcXHMqJC8uZXhlYyhsaW5lKTtcblx0ICAgICAgaWYgKGhlYWRlcikge1xuXHQgICAgICAgIGluZGV4LmluZGV4ID0gaGVhZGVyWzFdO1xuXHQgICAgICB9XG5cblx0ICAgICAgaSsrO1xuXHQgICAgfVxuXG5cdCAgICAvLyBQYXJzZSBmaWxlIGhlYWRlcnMgaWYgdGhleSBhcmUgZGVmaW5lZC4gVW5pZmllZCBkaWZmIHJlcXVpcmVzIHRoZW0sIGJ1dFxuXHQgICAgLy8gdGhlcmUncyBubyB0ZWNobmljYWwgaXNzdWVzIHRvIGhhdmUgYW4gaXNvbGF0ZWQgaHVuayB3aXRob3V0IGZpbGUgaGVhZGVyXG5cdCAgICBwYXJzZUZpbGVIZWFkZXIoaW5kZXgpO1xuXHQgICAgcGFyc2VGaWxlSGVhZGVyKGluZGV4KTtcblxuXHQgICAgLy8gUGFyc2UgaHVua3Ncblx0ICAgIGluZGV4Lmh1bmtzID0gW107XG5cblx0ICAgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcblx0ICAgICAgdmFyIF9saW5lID0gZGlmZnN0cltpXTtcblxuXHQgICAgICBpZiAoL14oSW5kZXg6fGRpZmZ8XFwtXFwtXFwtfFxcK1xcK1xcKylcXHMvLnRlc3QoX2xpbmUpKSB7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIH0gZWxzZSBpZiAoL15AQC8udGVzdChfbGluZSkpIHtcblx0ICAgICAgICBpbmRleC5odW5rcy5wdXNoKHBhcnNlSHVuaygpKTtcblx0ICAgICAgfSBlbHNlIGlmIChfbGluZSAmJiBvcHRpb25zLnN0cmljdCkge1xuXHQgICAgICAgIC8vIElnbm9yZSB1bmV4cGVjdGVkIGNvbnRlbnQgdW5sZXNzIGluIHN0cmljdCBtb2RlXG5cdCAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGxpbmUgJyArIChpICsgMSkgKyAnICcgKyBKU09OLnN0cmluZ2lmeShfbGluZSkpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGkrKztcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblxuXHQgIC8vIFBhcnNlcyB0aGUgLS0tIGFuZCArKysgaGVhZGVycywgaWYgbm9uZSBhcmUgZm91bmQsIG5vIGxpbmVzXG5cdCAgLy8gYXJlIGNvbnN1bWVkLlxuXHQgIGZ1bmN0aW9uIHBhcnNlRmlsZUhlYWRlcihpbmRleCkge1xuXHQgICAgdmFyIGhlYWRlclBhdHRlcm4gPSAvXigtLS18XFwrXFwrXFwrKVxccysoW1xcUyBdKikoPzpcXHQoLio/KVxccyopPyQvO1xuXHQgICAgdmFyIGZpbGVIZWFkZXIgPSBoZWFkZXJQYXR0ZXJuLmV4ZWMoZGlmZnN0cltpXSk7XG5cdCAgICBpZiAoZmlsZUhlYWRlcikge1xuXHQgICAgICB2YXIga2V5UHJlZml4ID0gZmlsZUhlYWRlclsxXSA9PT0gJy0tLScgPyAnb2xkJyA6ICduZXcnO1xuXHQgICAgICB2YXIgZmlsZU5hbWUgPSBmaWxlSGVhZGVyWzJdLnJlcGxhY2UoL1xcXFxcXFxcL2csICdcXFxcJyk7XG5cdCAgICAgIGlmICgvXlwiLipcIiQvLnRlc3QoZmlsZU5hbWUpKSB7XG5cdCAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHIoMSwgZmlsZU5hbWUubGVuZ3RoIC0gMik7XG5cdCAgICAgIH1cblx0ICAgICAgaW5kZXhba2V5UHJlZml4ICsgJ0ZpbGVOYW1lJ10gPSBmaWxlTmFtZTtcblx0ICAgICAgaW5kZXhba2V5UHJlZml4ICsgJ0hlYWRlciddID0gZmlsZUhlYWRlclszXTtcblxuXHQgICAgICBpKys7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgLy8gUGFyc2VzIGEgaHVua1xuXHQgIC8vIFRoaXMgYXNzdW1lcyB0aGF0IHdlIGFyZSBhdCB0aGUgc3RhcnQgb2YgYSBodW5rLlxuXHQgIGZ1bmN0aW9uIHBhcnNlSHVuaygpIHtcblx0ICAgIHZhciBjaHVua0hlYWRlckluZGV4ID0gaSxcblx0ICAgICAgICBjaHVua0hlYWRlckxpbmUgPSBkaWZmc3RyW2krK10sXG5cdCAgICAgICAgY2h1bmtIZWFkZXIgPSBjaHVua0hlYWRlckxpbmUuc3BsaXQoL0BAIC0oXFxkKykoPzosKFxcZCspKT8gXFwrKFxcZCspKD86LChcXGQrKSk/IEBALyk7XG5cblx0ICAgIHZhciBodW5rID0ge1xuXHQgICAgICBvbGRTdGFydDogK2NodW5rSGVhZGVyWzFdLFxuXHQgICAgICBvbGRMaW5lczogK2NodW5rSGVhZGVyWzJdIHx8IDEsXG5cdCAgICAgIG5ld1N0YXJ0OiArY2h1bmtIZWFkZXJbM10sXG5cdCAgICAgIG5ld0xpbmVzOiArY2h1bmtIZWFkZXJbNF0gfHwgMSxcblx0ICAgICAgbGluZXM6IFtdLFxuXHQgICAgICBsaW5lZGVsaW1pdGVyczogW11cblx0ICAgIH07XG5cblx0ICAgIHZhciBhZGRDb3VudCA9IDAsXG5cdCAgICAgICAgcmVtb3ZlQ291bnQgPSAwO1xuXHQgICAgZm9yICg7IGkgPCBkaWZmc3RyLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgIC8vIExpbmVzIHN0YXJ0aW5nIHdpdGggJy0tLScgY291bGQgYmUgbWlzdGFrZW4gZm9yIHRoZSBcInJlbW92ZSBsaW5lXCIgb3BlcmF0aW9uXG5cdCAgICAgIC8vIEJ1dCB0aGV5IGNvdWxkIGJlIHRoZSBoZWFkZXIgZm9yIHRoZSBuZXh0IGZpbGUuIFRoZXJlZm9yZSBwcnVuZSBzdWNoIGNhc2VzIG91dC5cblx0ICAgICAgaWYgKGRpZmZzdHJbaV0uaW5kZXhPZignLS0tICcpID09PSAwICYmIGkgKyAyIDwgZGlmZnN0ci5sZW5ndGggJiYgZGlmZnN0cltpICsgMV0uaW5kZXhPZignKysrICcpID09PSAwICYmIGRpZmZzdHJbaSArIDJdLmluZGV4T2YoJ0BAJykgPT09IDApIHtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgfVxuXHQgICAgICB2YXIgb3BlcmF0aW9uID0gZGlmZnN0cltpXVswXTtcblxuXHQgICAgICBpZiAob3BlcmF0aW9uID09PSAnKycgfHwgb3BlcmF0aW9uID09PSAnLScgfHwgb3BlcmF0aW9uID09PSAnICcgfHwgb3BlcmF0aW9uID09PSAnXFxcXCcpIHtcblx0ICAgICAgICBodW5rLmxpbmVzLnB1c2goZGlmZnN0cltpXSk7XG5cdCAgICAgICAgaHVuay5saW5lZGVsaW1pdGVycy5wdXNoKGRlbGltaXRlcnNbaV0gfHwgJ1xcbicpO1xuXG5cdCAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJysnKSB7XG5cdCAgICAgICAgICBhZGRDb3VudCsrO1xuXHQgICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSAnLScpIHtcblx0ICAgICAgICAgIHJlbW92ZUNvdW50Kys7XG5cdCAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICcgJykge1xuXHQgICAgICAgICAgYWRkQ291bnQrKztcblx0ICAgICAgICAgIHJlbW92ZUNvdW50Kys7XG5cdCAgICAgICAgfVxuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICB9XG5cdCAgICB9XG5cblx0ICAgIC8vIEhhbmRsZSB0aGUgZW1wdHkgYmxvY2sgY291bnQgY2FzZVxuXHQgICAgaWYgKCFhZGRDb3VudCAmJiBodW5rLm5ld0xpbmVzID09PSAxKSB7XG5cdCAgICAgIGh1bmsubmV3TGluZXMgPSAwO1xuXHQgICAgfVxuXHQgICAgaWYgKCFyZW1vdmVDb3VudCAmJiBodW5rLm9sZExpbmVzID09PSAxKSB7XG5cdCAgICAgIGh1bmsub2xkTGluZXMgPSAwO1xuXHQgICAgfVxuXG5cdCAgICAvLyBQZXJmb3JtIG9wdGlvbmFsIHNhbml0eSBjaGVja2luZ1xuXHQgICAgaWYgKG9wdGlvbnMuc3RyaWN0KSB7XG5cdCAgICAgIGlmIChhZGRDb3VudCAhPT0gaHVuay5uZXdMaW5lcykge1xuXHQgICAgICAgIHRocm93IG5ldyBFcnJvcignQWRkZWQgbGluZSBjb3VudCBkaWQgbm90IG1hdGNoIGZvciBodW5rIGF0IGxpbmUgJyArIChjaHVua0hlYWRlckluZGV4ICsgMSkpO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChyZW1vdmVDb3VudCAhPT0gaHVuay5vbGRMaW5lcykge1xuXHQgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVtb3ZlZCBsaW5lIGNvdW50IGRpZCBub3QgbWF0Y2ggZm9yIGh1bmsgYXQgbGluZSAnICsgKGNodW5rSGVhZGVySW5kZXggKyAxKSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblxuXHQgICAgcmV0dXJuIGh1bms7XG5cdCAgfVxuXG5cdCAgd2hpbGUgKGkgPCBkaWZmc3RyLmxlbmd0aCkge1xuXHQgICAgcGFyc2VJbmRleCgpO1xuXHQgIH1cblxuXHQgIHJldHVybiBsaXN0O1xuXHR9XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OXdZWFJqYUM5d1lYSnpaUzVxY3lKZExDSnVZVzFsY3lJNld5SndZWEp6WlZCaGRHTm9JaXdpZFc1cFJHbG1aaUlzSW05d2RHbHZibk1pTENKa2FXWm1jM1J5SWl3aWMzQnNhWFFpTENKa1pXeHBiV2wwWlhKeklpd2liV0YwWTJnaUxDSnNhWE4wSWl3aWFTSXNJbkJoY25ObFNXNWtaWGdpTENKcGJtUmxlQ0lzSW5CMWMyZ2lMQ0pzWlc1bmRHZ2lMQ0pzYVc1bElpd2lkR1Z6ZENJc0ltaGxZV1JsY2lJc0ltVjRaV01pTENKd1lYSnpaVVpwYkdWSVpXRmtaWElpTENKb2RXNXJjeUlzSW5CaGNuTmxTSFZ1YXlJc0luTjBjbWxqZENJc0lrVnljbTl5SWl3aVNsTlBUaUlzSW5OMGNtbHVaMmxtZVNJc0ltaGxZV1JsY2xCaGRIUmxjbTRpTENKbWFXeGxTR1ZoWkdWeUlpd2lhMlY1VUhKbFptbDRJaXdpWm1sc1pVNWhiV1VpTENKeVpYQnNZV05sSWl3aWMzVmljM1J5SWl3aVkyaDFibXRJWldGa1pYSkpibVJsZUNJc0ltTm9kVzVyU0dWaFpHVnlUR2x1WlNJc0ltTm9kVzVyU0dWaFpHVnlJaXdpYUhWdWF5SXNJbTlzWkZOMFlYSjBJaXdpYjJ4a1RHbHVaWE1pTENKdVpYZFRkR0Z5ZENJc0ltNWxkMHhwYm1Weklpd2liR2x1WlhNaUxDSnNhVzVsWkdWc2FXMXBkR1Z5Y3lJc0ltRmtaRU52ZFc1MElpd2ljbVZ0YjNabFEyOTFiblFpTENKcGJtUmxlRTltSWl3aWIzQmxjbUYwYVc5dUlsMHNJbTFoY0hCcGJtZHpJam9pT3pzN1owTkJRV2RDUVN4VkxFZEJRVUZCTEZVN1FVRkJWQ3hUUVVGVFFTeFZRVUZVTEVOQlFXOUNReXhQUVVGd1FpeEZRVUV5UXp0QlFVRkJMSE5FUVVGa1F5eFBRVUZqTEhWRlFVRktMRVZCUVVrN08wRkJRMmhFTEUxQlFVbERMRlZCUVZWR0xGRkJRVkZITEV0QlFWSXNRMEZCWXl4eFFrRkJaQ3hEUVVGa08wRkJRVUVzVFVGRFNVTXNZVUZCWVVvc1VVRkJVVXNzUzBGQlVpeERRVUZqTEhOQ1FVRmtMRXRCUVhsRExFVkJSREZFTzBGQlFVRXNUVUZGU1VNc1QwRkJUeXhGUVVaWU8wRkJRVUVzVFVGSFNVTXNTVUZCU1N4RFFVaFNPenRCUVV0QkxGZEJRVk5ETEZWQlFWUXNSMEZCYzBJN1FVRkRjRUlzVVVGQlNVTXNVVUZCVVN4RlFVRmFPMEZCUTBGSUxGTkJRVXRKTEVsQlFVd3NRMEZCVlVRc1MwRkJWanM3UVVGRlFUdEJRVU5CTEZkQlFVOUdMRWxCUVVsTUxGRkJRVkZUTEUxQlFXNUNMRVZCUVRKQ08wRkJRM3BDTEZWQlFVbERMRTlCUVU5V0xGRkJRVkZMTEVOQlFWSXNRMEZCV0RzN1FVRkZRVHRCUVVOQkxGVkJRVWtzZDBKQlFYZENUU3hKUVVGNFFpeERRVUUyUWtRc1NVRkJOMElzUTBGQlNpeEZRVUYzUXp0QlFVTjBRenRCUVVORU96dEJRVVZFTzBGQlEwRXNWVUZCU1VVc1UwRkJWU3d3UTBGQlJDeERRVUUyUTBNc1NVRkJOME1zUTBGQmEwUklMRWxCUVd4RUxFTkJRV0k3UVVGRFFTeFZRVUZKUlN4TlFVRktMRVZCUVZrN1FVRkRWa3dzWTBGQlRVRXNTMEZCVGl4SFFVRmpTeXhQUVVGUExFTkJRVkFzUTBGQlpEdEJRVU5FT3p0QlFVVkVVRHRCUVVORU96dEJRVVZFTzBGQlEwRTdRVUZEUVZNc2IwSkJRV2RDVUN4TFFVRm9RanRCUVVOQlR5eHZRa0ZCWjBKUUxFdEJRV2hDT3p0QlFVVkJPMEZCUTBGQkxGVkJRVTFSTEV0QlFVNHNSMEZCWXl4RlFVRmtPenRCUVVWQkxGZEJRVTlXTEVsQlFVbE1MRkZCUVZGVExFMUJRVzVDTEVWQlFUSkNPMEZCUTNwQ0xGVkJRVWxETEZGQlFVOVdMRkZCUVZGTExFTkJRVklzUTBGQldEczdRVUZGUVN4VlFVRkpMR2xEUVVGcFEwMHNTVUZCYWtNc1EwRkJjME5FTEV0QlFYUkRMRU5CUVVvc1JVRkJhVVE3UVVGREwwTTdRVUZEUkN4UFFVWkVMRTFCUlU4c1NVRkJTU3hOUVVGTlF5eEpRVUZPTEVOQlFWZEVMRXRCUVZnc1EwRkJTaXhGUVVGelFqdEJRVU16UWtnc1kwRkJUVkVzUzBGQlRpeERRVUZaVUN4SlFVRmFMRU5CUVdsQ1VTeFhRVUZxUWp0QlFVTkVMRTlCUmswc1RVRkZRU3hKUVVGSlRpeFRRVUZSV0N4UlFVRlJhMElzVFVGQmNFSXNSVUZCTkVJN1FVRkRha003UVVGRFFTeGpRVUZOTEVsQlFVbERMRXRCUVVvc1EwRkJWU3h0UWtGQmJVSmlMRWxCUVVrc1EwRkJka0lzU1VGQk5FSXNSMEZCTlVJc1IwRkJhME5qTEV0QlFVdERMRk5CUVV3c1EwRkJaVllzUzBGQlppeERRVUUxUXl4RFFVRk9PMEZCUTBRc1QwRklUU3hOUVVkQk8wRkJRMHhNTzBGQlEwUTdRVUZEUmp0QlFVTkdPenRCUVVWRU8wRkJRMEU3UVVGRFFTeFhRVUZUVXl4bFFVRlVMRU5CUVhsQ1VDeExRVUY2UWl4RlFVRm5RenRCUVVNNVFpeFJRVUZOWXl4blFrRkJaMElzTUVOQlFYUkNPMEZCUTBFc1VVRkJUVU1zWVVGQllVUXNZMEZCWTFJc1NVRkJaQ3hEUVVGdFFtSXNVVUZCVVVzc1EwRkJVaXhEUVVGdVFpeERRVUZ1UWp0QlFVTkJMRkZCUVVscFFpeFZRVUZLTEVWQlFXZENPMEZCUTJRc1ZVRkJTVU1zV1VGQldVUXNWMEZCVnl4RFFVRllMRTFCUVd0Q0xFdEJRV3hDTEVkQlFUQkNMRXRCUVRGQ0xFZEJRV3RETEV0QlFXeEVPMEZCUTBFc1ZVRkJTVVVzVjBGQlYwWXNWMEZCVnl4RFFVRllMRVZCUVdOSExFOUJRV1FzUTBGQmMwSXNUMEZCZEVJc1JVRkJLMElzU1VGQkwwSXNRMEZCWmp0QlFVTkJMRlZCUVVrc1UwRkJVMlFzU1VGQlZDeERRVUZqWVN4UlFVRmtMRU5CUVVvc1JVRkJOa0k3UVVGRE0wSkJMRzFDUVVGWFFTeFRRVUZUUlN4TlFVRlVMRU5CUVdkQ0xFTkJRV2hDTEVWQlFXMUNSaXhUUVVGVFppeE5RVUZVTEVkQlFXdENMRU5CUVhKRExFTkJRVmc3UVVGRFJEdEJRVU5FUml4WlFVRk5aMElzV1VGQldTeFZRVUZzUWl4SlFVRm5RME1zVVVGQmFFTTdRVUZEUVdwQ0xGbEJRVTFuUWl4WlFVRlpMRkZCUVd4Q0xFbEJRVGhDUkN4WFFVRlhMRU5CUVZnc1EwRkJPVUk3TzBGQlJVRnFRanRCUVVORU8wRkJRMFk3TzBGQlJVUTdRVUZEUVR0QlFVTkJMRmRCUVZOWExGTkJRVlFzUjBGQmNVSTdRVUZEYmtJc1VVRkJTVmNzYlVKQlFXMUNkRUlzUTBGQmRrSTdRVUZCUVN4UlFVTkpkVUlzYTBKQlFXdENOVUlzVVVGQlVVc3NSMEZCVWl4RFFVUjBRanRCUVVGQkxGRkJSVWwzUWl4alFVRmpSQ3huUWtGQlowSXpRaXhMUVVGb1FpeERRVUZ6UWl3MFEwRkJkRUlzUTBGR2JFSTdPMEZCU1VFc1VVRkJTVFpDTEU5QlFVODdRVUZEVkVNc1owSkJRVlVzUTBGQlEwWXNXVUZCV1N4RFFVRmFMRU5CUkVZN1FVRkZWRWNzWjBKQlFWVXNRMEZCUTBnc1dVRkJXU3hEUVVGYUxFTkJRVVFzU1VGQmJVSXNRMEZHY0VJN1FVRkhWRWtzWjBKQlFWVXNRMEZCUTBvc1dVRkJXU3hEUVVGYUxFTkJTRVk3UVVGSlZFc3NaMEpCUVZVc1EwRkJRMHdzV1VGQldTeERRVUZhTEVOQlFVUXNTVUZCYlVJc1EwRktjRUk3UVVGTFZFMHNZVUZCVHl4RlFVeEZPMEZCVFZSRExITkNRVUZuUWp0QlFVNVFMRXRCUVZnN08wRkJVMEVzVVVGQlNVTXNWMEZCVnl4RFFVRm1PMEZCUVVFc1VVRkRTVU1zWTBGQll5eERRVVJzUWp0QlFVVkJMRmRCUVU5cVF5eEpRVUZKVEN4UlFVRlJVeXhOUVVGdVFpeEZRVUV5UWtvc1IwRkJNMElzUlVGQlowTTdRVUZET1VJN1FVRkRRVHRCUVVOQkxGVkJRVWxNTEZGQlFWRkxMRU5CUVZJc1JVRkJWMnRETEU5QlFWZ3NRMEZCYlVJc1RVRkJia0lzVFVGQkswSXNRMEZCTDBJc1NVRkRUV3hETEVsQlFVa3NRMEZCU2l4SFFVRlJUQ3hSUVVGUlV5eE5RVVIwUWl4SlFVVkxWQ3hSUVVGUlN5eEpRVUZKTEVOQlFWb3NSVUZCWld0RExFOUJRV1lzUTBGQmRVSXNUVUZCZGtJc1RVRkJiVU1zUTBGR2VFTXNTVUZIUzNaRExGRkJRVkZMTEVsQlFVa3NRMEZCV2l4RlFVRmxhME1zVDBGQlppeERRVUYxUWl4SlFVRjJRaXhOUVVGcFF5eERRVWd4UXl4RlFVYzJRenRCUVVONlF6dEJRVU5JTzBGQlEwUXNWVUZCU1VNc1dVRkJXWGhETEZGQlFWRkxMRU5CUVZJc1JVRkJWeXhEUVVGWUxFTkJRV2hDT3p0QlFVVkJMRlZCUVVsdFF5eGpRVUZqTEVkQlFXUXNTVUZCY1VKQkxHTkJRV01zUjBGQmJrTXNTVUZCTUVOQkxHTkJRV01zUjBGQmVFUXNTVUZCSzBSQkxHTkJRV01zU1VGQmFrWXNSVUZCZFVZN1FVRkRja1pXTEdGQlFVdExMRXRCUVV3c1EwRkJWek5DTEVsQlFWZ3NRMEZCWjBKU0xGRkJRVkZMTEVOQlFWSXNRMEZCYUVJN1FVRkRRWGxDTEdGQlFVdE5MR05CUVV3c1EwRkJiMEkxUWl4SlFVRndRaXhEUVVGNVFrNHNWMEZCVjBjc1EwRkJXQ3hMUVVGcFFpeEpRVUV4UXpzN1FVRkZRU3haUVVGSmJVTXNZMEZCWXl4SFFVRnNRaXhGUVVGMVFqdEJRVU55UWtnN1FVRkRSQ3hUUVVaRUxFMUJSVThzU1VGQlNVY3NZMEZCWXl4SFFVRnNRaXhGUVVGMVFqdEJRVU0xUWtZN1FVRkRSQ3hUUVVaTkxFMUJSVUVzU1VGQlNVVXNZMEZCWXl4SFFVRnNRaXhGUVVGMVFqdEJRVU0xUWtnN1FVRkRRVU03UVVGRFJEdEJRVU5HTEU5QldrUXNUVUZaVHp0QlFVTk1PMEZCUTBRN1FVRkRSanM3UVVGRlJEdEJRVU5CTEZGQlFVa3NRMEZCUTBRc1VVRkJSQ3hKUVVGaFVDeExRVUZMU1N4UlFVRk1MRXRCUVd0Q0xFTkJRVzVETEVWQlFYTkRPMEZCUTNCRFNpeFhRVUZMU1N4UlFVRk1MRWRCUVdkQ0xFTkJRV2hDTzBGQlEwUTdRVUZEUkN4UlFVRkpMRU5CUVVOSkxGZEJRVVFzU1VGQlowSlNMRXRCUVV0RkxGRkJRVXdzUzBGQmEwSXNRMEZCZEVNc1JVRkJlVU03UVVGRGRrTkdMRmRCUVV0RkxGRkJRVXdzUjBGQlowSXNRMEZCYUVJN1FVRkRSRHM3UVVGRlJEdEJRVU5CTEZGQlFVbHFReXhSUVVGUmEwSXNUVUZCV2l4RlFVRnZRanRCUVVOc1FpeFZRVUZKYjBJc1lVRkJZVkFzUzBGQlMwa3NVVUZCZEVJc1JVRkJaME03UVVGRE9VSXNZMEZCVFN4SlFVRkphRUlzUzBGQlNpeERRVUZWTEhORVFVRnpSRk1zYlVKQlFXMUNMRU5CUVhwRkxFTkJRVllzUTBGQlRqdEJRVU5FTzBGQlEwUXNWVUZCU1Zjc1owSkJRV2RDVWl4TFFVRkxSU3hSUVVGNlFpeEZRVUZ0UXp0QlFVTnFReXhqUVVGTkxFbEJRVWxrTEV0QlFVb3NRMEZCVlN4M1JFRkJkMFJUTEcxQ1FVRnRRaXhEUVVFelJTeERRVUZXTEVOQlFVNDdRVUZEUkR0QlFVTkdPenRCUVVWRUxGZEJRVTlITEVsQlFWQTdRVUZEUkRzN1FVRkZSQ3hUUVVGUGVrSXNTVUZCU1V3c1VVRkJVVk1zVFVGQmJrSXNSVUZCTWtJN1FVRkRla0pJTzBGQlEwUTdPMEZCUlVRc1UwRkJUMFlzU1VGQlVEdEJRVU5FSWl3aVptbHNaU0k2SW5CaGNuTmxMbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaVpYaHdiM0owSUdaMWJtTjBhVzl1SUhCaGNuTmxVR0YwWTJnb2RXNXBSR2xtWml3Z2IzQjBhVzl1Y3lBOUlIdDlLU0I3WEc0Z0lHeGxkQ0JrYVdabWMzUnlJRDBnZFc1cFJHbG1aaTV6Y0d4cGRDZ3ZYRnh5WEZ4dWZGdGNYRzVjWEhaY1hHWmNYSEpjWEhnNE5WMHZLU3hjYmlBZ0lDQWdJR1JsYkdsdGFYUmxjbk1nUFNCMWJtbEVhV1ptTG0xaGRHTm9LQzljWEhKY1hHNThXMXhjYmx4Y2RseGNabHhjY2x4Y2VEZzFYUzluS1NCOGZDQmJYU3hjYmlBZ0lDQWdJR3hwYzNRZ1BTQmJYU3hjYmlBZ0lDQWdJR2tnUFNBd08xeHVYRzRnSUdaMWJtTjBhVzl1SUhCaGNuTmxTVzVrWlhnb0tTQjdYRzRnSUNBZ2JHVjBJR2x1WkdWNElEMGdlMzA3WEc0Z0lDQWdiR2x6ZEM1d2RYTm9LR2x1WkdWNEtUdGNibHh1SUNBZ0lDOHZJRkJoY25ObElHUnBabVlnYldWMFlXUmhkR0ZjYmlBZ0lDQjNhR2xzWlNBb2FTQThJR1JwWm1aemRISXViR1Z1WjNSb0tTQjdYRzRnSUNBZ0lDQnNaWFFnYkdsdVpTQTlJR1JwWm1aemRISmJhVjA3WEc1Y2JpQWdJQ0FnSUM4dklFWnBiR1VnYUdWaFpHVnlJR1p2ZFc1a0xDQmxibVFnY0dGeWMybHVaeUJrYVdabUlHMWxkR0ZrWVhSaFhHNGdJQ0FnSUNCcFppQW9MMTRvWEZ3dFhGd3RYRnd0ZkZ4Y0sxeGNLMXhjSzN4QVFDbGNYSE12TG5SbGMzUW9iR2x1WlNrcElIdGNiaUFnSUNBZ0lDQWdZbkpsWVdzN1hHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDOHZJRVJwWm1ZZ2FXNWtaWGhjYmlBZ0lDQWdJR3hsZENCb1pXRmtaWElnUFNBb0wxNG9QenBKYm1SbGVEcDhaR2xtWmlnL09pQXRjaUJjWEhjcktTc3BYRnh6S3lndUt6OHBYRnh6S2lRdktTNWxlR1ZqS0d4cGJtVXBPMXh1SUNBZ0lDQWdhV1lnS0dobFlXUmxjaWtnZTF4dUlDQWdJQ0FnSUNCcGJtUmxlQzVwYm1SbGVDQTlJR2hsWVdSbGNsc3hYVHRjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnYVNzck8xeHVJQ0FnSUgxY2JseHVJQ0FnSUM4dklGQmhjbk5sSUdacGJHVWdhR1ZoWkdWeWN5QnBaaUIwYUdWNUlHRnlaU0JrWldacGJtVmtMaUJWYm1sbWFXVmtJR1JwWm1ZZ2NtVnhkV2x5WlhNZ2RHaGxiU3dnWW5WMFhHNGdJQ0FnTHk4Z2RHaGxjbVVuY3lCdWJ5QjBaV05vYm1sallXd2dhWE56ZFdWeklIUnZJR2hoZG1VZ1lXNGdhWE52YkdGMFpXUWdhSFZ1YXlCM2FYUm9iM1YwSUdacGJHVWdhR1ZoWkdWeVhHNGdJQ0FnY0dGeWMyVkdhV3hsU0dWaFpHVnlLR2x1WkdWNEtUdGNiaUFnSUNCd1lYSnpaVVpwYkdWSVpXRmtaWElvYVc1a1pYZ3BPMXh1WEc0Z0lDQWdMeThnVUdGeWMyVWdhSFZ1YTNOY2JpQWdJQ0JwYm1SbGVDNW9kVzVyY3lBOUlGdGRPMXh1WEc0Z0lDQWdkMmhwYkdVZ0tHa2dQQ0JrYVdabWMzUnlMbXhsYm1kMGFDa2dlMXh1SUNBZ0lDQWdiR1YwSUd4cGJtVWdQU0JrYVdabWMzUnlXMmxkTzF4dVhHNGdJQ0FnSUNCcFppQW9MMTRvU1c1a1pYZzZmR1JwWm1aOFhGd3RYRnd0WEZ3dGZGeGNLMXhjSzF4Y0t5bGNYSE12TG5SbGMzUW9iR2x1WlNrcElIdGNiaUFnSUNBZ0lDQWdZbkpsWVdzN1hHNGdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tDOWVRRUF2TG5SbGMzUW9iR2x1WlNrcElIdGNiaUFnSUNBZ0lDQWdhVzVrWlhndWFIVnVhM011Y0hWemFDaHdZWEp6WlVoMWJtc29LU2s3WEc0Z0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0d4cGJtVWdKaVlnYjNCMGFXOXVjeTV6ZEhKcFkzUXBJSHRjYmlBZ0lDQWdJQ0FnTHk4Z1NXZHViM0psSUhWdVpYaHdaV04wWldRZ1kyOXVkR1Z1ZENCMWJteGxjM01nYVc0Z2MzUnlhV04wSUcxdlpHVmNiaUFnSUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtDZFZibXR1YjNkdUlHeHBibVVnSnlBcklDaHBJQ3NnTVNrZ0t5QW5JQ2NnS3lCS1UwOU9Mbk4wY21sdVoybG1lU2hzYVc1bEtTazdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQnBLeXM3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1SUNCOVhHNWNiaUFnTHk4Z1VHRnljMlZ6SUhSb1pTQXRMUzBnWVc1a0lDc3JLeUJvWldGa1pYSnpMQ0JwWmlCdWIyNWxJR0Z5WlNCbWIzVnVaQ3dnYm04Z2JHbHVaWE5jYmlBZ0x5OGdZWEpsSUdOdmJuTjFiV1ZrTGx4dUlDQm1kVzVqZEdsdmJpQndZWEp6WlVacGJHVklaV0ZrWlhJb2FXNWtaWGdwSUh0Y2JpQWdJQ0JqYjI1emRDQm9aV0ZrWlhKUVlYUjBaWEp1SUQwZ0wxNG9MUzB0ZkZ4Y0sxeGNLMXhjS3lsY1hITXJLRnRjWEZNZ1hTb3BLRDg2WEZ4MEtDNHFQeWxjWEhNcUtUOGtMenRjYmlBZ0lDQmpiMjV6ZENCbWFXeGxTR1ZoWkdWeUlEMGdhR1ZoWkdWeVVHRjBkR1Z5Ymk1bGVHVmpLR1JwWm1aemRISmJhVjBwTzF4dUlDQWdJR2xtSUNobWFXeGxTR1ZoWkdWeUtTQjdYRzRnSUNBZ0lDQnNaWFFnYTJWNVVISmxabWw0SUQwZ1ptbHNaVWhsWVdSbGNsc3hYU0E5UFQwZ0p5MHRMU2NnUHlBbmIyeGtKeUE2SUNkdVpYY25PMXh1SUNBZ0lDQWdiR1YwSUdacGJHVk9ZVzFsSUQwZ1ptbHNaVWhsWVdSbGNsc3lYUzV5WlhCc1lXTmxLQzljWEZ4Y1hGeGNYQzluTENBblhGeGNYQ2NwTzF4dUlDQWdJQ0FnYVdZZ0tDOWVYQ0l1S2x3aUpDOHVkR1Z6ZENobWFXeGxUbUZ0WlNrcElIdGNiaUFnSUNBZ0lDQWdabWxzWlU1aGJXVWdQU0JtYVd4bFRtRnRaUzV6ZFdKemRISW9NU3dnWm1sc1pVNWhiV1V1YkdWdVozUm9JQzBnTWlrN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCcGJtUmxlRnRyWlhsUWNtVm1hWGdnS3lBblJtbHNaVTVoYldVblhTQTlJR1pwYkdWT1lXMWxPMXh1SUNBZ0lDQWdhVzVrWlhoYmEyVjVVSEpsWm1sNElDc2dKMGhsWVdSbGNpZGRJRDBnWm1sc1pVaGxZV1JsY2xzelhUdGNibHh1SUNBZ0lDQWdhU3NyTzF4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUM4dklGQmhjbk5sY3lCaElHaDFibXRjYmlBZ0x5OGdWR2hwY3lCaGMzTjFiV1Z6SUhSb1lYUWdkMlVnWVhKbElHRjBJSFJvWlNCemRHRnlkQ0J2WmlCaElHaDFibXN1WEc0Z0lHWjFibU4wYVc5dUlIQmhjbk5sU0hWdWF5Z3BJSHRjYmlBZ0lDQnNaWFFnWTJoMWJtdElaV0ZrWlhKSmJtUmxlQ0E5SUdrc1hHNGdJQ0FnSUNBZ0lHTm9kVzVyU0dWaFpHVnlUR2x1WlNBOUlHUnBabVp6ZEhKYmFTc3JYU3hjYmlBZ0lDQWdJQ0FnWTJoMWJtdElaV0ZrWlhJZ1BTQmphSFZ1YTBobFlXUmxja3hwYm1VdWMzQnNhWFFvTDBCQUlDMG9YRnhrS3lrb1B6b3NLRnhjWkNzcEtUOGdYRndyS0Z4Y1pDc3BLRDg2TENoY1hHUXJLU2svSUVCQUx5azdYRzVjYmlBZ0lDQnNaWFFnYUhWdWF5QTlJSHRjYmlBZ0lDQWdJRzlzWkZOMFlYSjBPaUFyWTJoMWJtdElaV0ZrWlhKYk1WMHNYRzRnSUNBZ0lDQnZiR1JNYVc1bGN6b2dLMk5vZFc1clNHVmhaR1Z5V3pKZElIeDhJREVzWEc0Z0lDQWdJQ0J1WlhkVGRHRnlkRG9nSzJOb2RXNXJTR1ZoWkdWeVd6TmRMRnh1SUNBZ0lDQWdibVYzVEdsdVpYTTZJQ3RqYUhWdWEwaGxZV1JsY2xzMFhTQjhmQ0F4TEZ4dUlDQWdJQ0FnYkdsdVpYTTZJRnRkTEZ4dUlDQWdJQ0FnYkdsdVpXUmxiR2x0YVhSbGNuTTZJRnRkWEc0Z0lDQWdmVHRjYmx4dUlDQWdJR3hsZENCaFpHUkRiM1Z1ZENBOUlEQXNYRzRnSUNBZ0lDQWdJSEpsYlc5MlpVTnZkVzUwSUQwZ01EdGNiaUFnSUNCbWIzSWdLRHNnYVNBOElHUnBabVp6ZEhJdWJHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQWdJQzh2SUV4cGJtVnpJSE4wWVhKMGFXNW5JSGRwZEdnZ0p5MHRMU2NnWTI5MWJHUWdZbVVnYldsemRHRnJaVzRnWm05eUlIUm9aU0JjSW5KbGJXOTJaU0JzYVc1bFhDSWdiM0JsY21GMGFXOXVYRzRnSUNBZ0lDQXZMeUJDZFhRZ2RHaGxlU0JqYjNWc1pDQmlaU0IwYUdVZ2FHVmhaR1Z5SUdadmNpQjBhR1VnYm1WNGRDQm1hV3hsTGlCVWFHVnlaV1p2Y21VZ2NISjFibVVnYzNWamFDQmpZWE5sY3lCdmRYUXVYRzRnSUNBZ0lDQnBaaUFvWkdsbVpuTjBjbHRwWFM1cGJtUmxlRTltS0NjdExTMGdKeWtnUFQwOUlEQmNiaUFnSUNBZ0lDQWdJQ0FnSUNZbUlDaHBJQ3NnTWlBOElHUnBabVp6ZEhJdWJHVnVaM1JvS1Z4dUlDQWdJQ0FnSUNBZ0lDQWdKaVlnWkdsbVpuTjBjbHRwSUNzZ01WMHVhVzVrWlhoUFppZ25LeXNySUNjcElEMDlQU0F3WEc0Z0lDQWdJQ0FnSUNBZ0lDQW1KaUJrYVdabWMzUnlXMmtnS3lBeVhTNXBibVJsZUU5bUtDZEFRQ2NwSUQwOVBTQXdLU0I3WEc0Z0lDQWdJQ0FnSUNBZ1luSmxZV3M3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0JzWlhRZ2IzQmxjbUYwYVc5dUlEMGdaR2xtWm5OMGNsdHBYVnN3WFR0Y2JseHVJQ0FnSUNBZ2FXWWdLRzl3WlhKaGRHbHZiaUE5UFQwZ0p5c25JSHg4SUc5d1pYSmhkR2x2YmlBOVBUMGdKeTBuSUh4OElHOXdaWEpoZEdsdmJpQTlQVDBnSnlBbklIeDhJRzl3WlhKaGRHbHZiaUE5UFQwZ0oxeGNYRnduS1NCN1hHNGdJQ0FnSUNBZ0lHaDFibXN1YkdsdVpYTXVjSFZ6YUNoa2FXWm1jM1J5VzJsZEtUdGNiaUFnSUNBZ0lDQWdhSFZ1YXk1c2FXNWxaR1ZzYVcxcGRHVnljeTV3ZFhOb0tHUmxiR2x0YVhSbGNuTmJhVjBnZkh3Z0oxeGNiaWNwTzF4dVhHNGdJQ0FnSUNBZ0lHbG1JQ2h2Y0dWeVlYUnBiMjRnUFQwOUlDY3JKeWtnZTF4dUlDQWdJQ0FnSUNBZ0lHRmtaRU52ZFc1MEt5czdYRzRnSUNBZ0lDQWdJSDBnWld4elpTQnBaaUFvYjNCbGNtRjBhVzl1SUQwOVBTQW5MU2NwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnlaVzF2ZG1WRGIzVnVkQ3NyTzF4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tHOXdaWEpoZEdsdmJpQTlQVDBnSnlBbktTQjdYRzRnSUNBZ0lDQWdJQ0FnWVdSa1EyOTFiblFyS3p0Y2JpQWdJQ0FnSUNBZ0lDQnlaVzF2ZG1WRGIzVnVkQ3NyTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNCaWNtVmhhenRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzVjYmlBZ0lDQXZMeUJJWVc1a2JHVWdkR2hsSUdWdGNIUjVJR0pzYjJOcklHTnZkVzUwSUdOaGMyVmNiaUFnSUNCcFppQW9JV0ZrWkVOdmRXNTBJQ1ltSUdoMWJtc3VibVYzVEdsdVpYTWdQVDA5SURFcElIdGNiaUFnSUNBZ0lHaDFibXN1Ym1WM1RHbHVaWE1nUFNBd08xeHVJQ0FnSUgxY2JpQWdJQ0JwWmlBb0lYSmxiVzkyWlVOdmRXNTBJQ1ltSUdoMWJtc3ViMnhrVEdsdVpYTWdQVDA5SURFcElIdGNiaUFnSUNBZ0lHaDFibXN1YjJ4a1RHbHVaWE1nUFNBd08xeHVJQ0FnSUgxY2JseHVJQ0FnSUM4dklGQmxjbVp2Y20wZ2IzQjBhVzl1WVd3Z2MyRnVhWFI1SUdOb1pXTnJhVzVuWEc0Z0lDQWdhV1lnS0c5d2RHbHZibk11YzNSeWFXTjBLU0I3WEc0Z0lDQWdJQ0JwWmlBb1lXUmtRMjkxYm5RZ0lUMDlJR2gxYm1zdWJtVjNUR2x1WlhNcElIdGNiaUFnSUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtDZEJaR1JsWkNCc2FXNWxJR052ZFc1MElHUnBaQ0J1YjNRZ2JXRjBZMmdnWm05eUlHaDFibXNnWVhRZ2JHbHVaU0FuSUNzZ0tHTm9kVzVyU0dWaFpHVnlTVzVrWlhnZ0t5QXhLU2s3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0JwWmlBb2NtVnRiM1psUTI5MWJuUWdJVDA5SUdoMWJtc3ViMnhrVEdsdVpYTXBJSHRjYmlBZ0lDQWdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLQ2RTWlcxdmRtVmtJR3hwYm1VZ1kyOTFiblFnWkdsa0lHNXZkQ0J0WVhSamFDQm1iM0lnYUhWdWF5QmhkQ0JzYVc1bElDY2dLeUFvWTJoMWJtdElaV0ZrWlhKSmJtUmxlQ0FySURFcEtUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNWNiaUFnSUNCeVpYUjFjbTRnYUhWdWF6dGNiaUFnZlZ4dVhHNGdJSGRvYVd4bElDaHBJRHdnWkdsbVpuTjBjaTVzWlc1bmRHZ3BJSHRjYmlBZ0lDQndZWEp6WlVsdVpHVjRLQ2s3WEc0Z0lIMWNibHh1SUNCeVpYUjFjbTRnYkdsemREdGNibjFjYmlKZGZRPT1cblxuXG4vKioqLyB9KSxcbi8qIDEyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1widXNlIHN0cmljdFwiO1xuXG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cblx0ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2Z1bmN0aW9uIChzdGFydCwgbWluTGluZSwgbWF4TGluZSkge1xuXHQgIHZhciB3YW50Rm9yd2FyZCA9IHRydWUsXG5cdCAgICAgIGJhY2t3YXJkRXhoYXVzdGVkID0gZmFsc2UsXG5cdCAgICAgIGZvcndhcmRFeGhhdXN0ZWQgPSBmYWxzZSxcblx0ICAgICAgbG9jYWxPZmZzZXQgPSAxO1xuXG5cdCAgcmV0dXJuIGZ1bmN0aW9uIGl0ZXJhdG9yKCkge1xuXHQgICAgaWYgKHdhbnRGb3J3YXJkICYmICFmb3J3YXJkRXhoYXVzdGVkKSB7XG5cdCAgICAgIGlmIChiYWNrd2FyZEV4aGF1c3RlZCkge1xuXHQgICAgICAgIGxvY2FsT2Zmc2V0Kys7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgd2FudEZvcndhcmQgPSBmYWxzZTtcblx0ICAgICAgfVxuXG5cdCAgICAgIC8vIENoZWNrIGlmIHRyeWluZyB0byBmaXQgYmV5b25kIHRleHQgbGVuZ3RoLCBhbmQgaWYgbm90LCBjaGVjayBpdCBmaXRzXG5cdCAgICAgIC8vIGFmdGVyIG9mZnNldCBsb2NhdGlvbiAob3IgZGVzaXJlZCBsb2NhdGlvbiBvbiBmaXJzdCBpdGVyYXRpb24pXG5cdCAgICAgIGlmIChzdGFydCArIGxvY2FsT2Zmc2V0IDw9IG1heExpbmUpIHtcblx0ICAgICAgICByZXR1cm4gbG9jYWxPZmZzZXQ7XG5cdCAgICAgIH1cblxuXHQgICAgICBmb3J3YXJkRXhoYXVzdGVkID0gdHJ1ZTtcblx0ICAgIH1cblxuXHQgICAgaWYgKCFiYWNrd2FyZEV4aGF1c3RlZCkge1xuXHQgICAgICBpZiAoIWZvcndhcmRFeGhhdXN0ZWQpIHtcblx0ICAgICAgICB3YW50Rm9yd2FyZCA9IHRydWU7XG5cdCAgICAgIH1cblxuXHQgICAgICAvLyBDaGVjayBpZiB0cnlpbmcgdG8gZml0IGJlZm9yZSB0ZXh0IGJlZ2lubmluZywgYW5kIGlmIG5vdCwgY2hlY2sgaXQgZml0c1xuXHQgICAgICAvLyBiZWZvcmUgb2Zmc2V0IGxvY2F0aW9uXG5cdCAgICAgIGlmIChtaW5MaW5lIDw9IHN0YXJ0IC0gbG9jYWxPZmZzZXQpIHtcblx0ICAgICAgICByZXR1cm4gLWxvY2FsT2Zmc2V0Kys7XG5cdCAgICAgIH1cblxuXHQgICAgICBiYWNrd2FyZEV4aGF1c3RlZCA9IHRydWU7XG5cdCAgICAgIHJldHVybiBpdGVyYXRvcigpO1xuXHQgICAgfVxuXG5cdCAgICAvLyBXZSB0cmllZCB0byBmaXQgaHVuayBiZWZvcmUgdGV4dCBiZWdpbm5pbmcgYW5kIGJleW9uZCB0ZXh0IGxlbmd0aCwgdGhlblxuXHQgICAgLy8gaHVuayBjYW4ndCBmaXQgb24gdGhlIHRleHQuIFJldHVybiB1bmRlZmluZWRcblx0ICB9O1xuXHR9O1xuXHQvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTkxZEdsc0wyUnBjM1JoYm1ObExXbDBaWEpoZEc5eUxtcHpJbDBzSW01aGJXVnpJanBiSW5OMFlYSjBJaXdpYldsdVRHbHVaU0lzSW0xaGVFeHBibVVpTENKM1lXNTBSbTl5ZDJGeVpDSXNJbUpoWTJ0M1lYSmtSWGhvWVhWemRHVmtJaXdpWm05eWQyRnlaRVY0YUdGMWMzUmxaQ0lzSW14dlkyRnNUMlptYzJWMElpd2lhWFJsY21GMGIzSWlYU3dpYldGd2NHbHVaM01pT2lJN096czdORU5CUjJVc1ZVRkJVMEVzUzBGQlZDeEZRVUZuUWtNc1QwRkJhRUlzUlVGQmVVSkRMRTlCUVhwQ0xFVkJRV3RETzBGQlF5OURMRTFCUVVsRExHTkJRV01zU1VGQmJFSTdRVUZCUVN4TlFVTkpReXh2UWtGQmIwSXNTMEZFZUVJN1FVRkJRU3hOUVVWSlF5eHRRa0ZCYlVJc1MwRkdka0k3UVVGQlFTeE5RVWRKUXl4alFVRmpMRU5CU0d4Q096dEJRVXRCTEZOQlFVOHNVMEZCVTBNc1VVRkJWQ3hIUVVGdlFqdEJRVU42UWl4UlFVRkpTaXhsUVVGbExFTkJRVU5GTEdkQ1FVRndRaXhGUVVGelF6dEJRVU53UXl4VlFVRkpSQ3hwUWtGQlNpeEZRVUYxUWp0QlFVTnlRa1U3UVVGRFJDeFBRVVpFTEUxQlJVODdRVUZEVEVnc2MwSkJRV01zUzBGQlpEdEJRVU5FT3p0QlFVVkVPMEZCUTBFN1FVRkRRU3hWUVVGSlNDeFJRVUZSVFN4WFFVRlNMRWxCUVhWQ1NpeFBRVUV6UWl4RlFVRnZRenRCUVVOc1F5eGxRVUZQU1N4WFFVRlFPMEZCUTBRN08wRkJSVVJFTEhsQ1FVRnRRaXhKUVVGdVFqdEJRVU5FT3p0QlFVVkVMRkZCUVVrc1EwRkJRMFFzYVVKQlFVd3NSVUZCZDBJN1FVRkRkRUlzVlVGQlNTeERRVUZEUXl4blFrRkJUQ3hGUVVGMVFqdEJRVU55UWtZc2MwSkJRV01zU1VGQlpEdEJRVU5FT3p0QlFVVkVPMEZCUTBFN1FVRkRRU3hWUVVGSlJpeFhRVUZYUkN4UlFVRlJUU3hYUVVGMlFpeEZRVUZ2UXp0QlFVTnNReXhsUVVGUExFTkJRVU5CTEdGQlFWSTdRVUZEUkRzN1FVRkZSRVlzTUVKQlFXOUNMRWxCUVhCQ08wRkJRMEVzWVVGQlQwY3NWVUZCVUR0QlFVTkVPenRCUVVWRU8wRkJRMEU3UVVGRFJDeEhRV3hEUkR0QlFXMURSQ3hESWl3aVptbHNaU0k2SW1ScGMzUmhibU5sTFdsMFpYSmhkRzl5TG1weklpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lMeThnU1hSbGNtRjBiM0lnZEdoaGRDQjBjbUYyWlhKelpYTWdhVzRnZEdobElISmhibWRsSUc5bUlGdHRhVzRzSUcxaGVGMHNJSE4wWlhCd2FXNW5YRzR2THlCaWVTQmthWE4wWVc1alpTQm1jbTl0SUdFZ1oybDJaVzRnYzNSaGNuUWdjRzl6YVhScGIyNHVJRWt1WlM0Z1ptOXlJRnN3TENBMFhTd2dkMmwwYUZ4dUx5OGdjM1JoY25RZ2IyWWdNaXdnZEdocGN5QjNhV3hzSUdsMFpYSmhkR1VnTWl3Z015d2dNU3dnTkN3Z01DNWNibVY0Y0c5eWRDQmtaV1poZFd4MElHWjFibU4wYVc5dUtITjBZWEowTENCdGFXNU1hVzVsTENCdFlYaE1hVzVsS1NCN1hHNGdJR3hsZENCM1lXNTBSbTl5ZDJGeVpDQTlJSFJ5ZFdVc1hHNGdJQ0FnSUNCaVlXTnJkMkZ5WkVWNGFHRjFjM1JsWkNBOUlHWmhiSE5sTEZ4dUlDQWdJQ0FnWm05eWQyRnlaRVY0YUdGMWMzUmxaQ0E5SUdaaGJITmxMRnh1SUNBZ0lDQWdiRzlqWVd4UFptWnpaWFFnUFNBeE8xeHVYRzRnSUhKbGRIVnliaUJtZFc1amRHbHZiaUJwZEdWeVlYUnZjaWdwSUh0Y2JpQWdJQ0JwWmlBb2QyRnVkRVp2Y25kaGNtUWdKaVlnSVdadmNuZGhjbVJGZUdoaGRYTjBaV1FwSUh0Y2JpQWdJQ0FnSUdsbUlDaGlZV05yZDJGeVpFVjRhR0YxYzNSbFpDa2dlMXh1SUNBZ0lDQWdJQ0JzYjJOaGJFOW1abk5sZENzck8xeHVJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ2QyRnVkRVp2Y25kaGNtUWdQU0JtWVd4elpUdGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdMeThnUTJobFkyc2dhV1lnZEhKNWFXNW5JSFJ2SUdacGRDQmlaWGx2Ym1RZ2RHVjRkQ0JzWlc1bmRHZ3NJR0Z1WkNCcFppQnViM1FzSUdOb1pXTnJJR2wwSUdacGRITmNiaUFnSUNBZ0lDOHZJR0ZtZEdWeUlHOW1abk5sZENCc2IyTmhkR2x2YmlBb2IzSWdaR1Z6YVhKbFpDQnNiMk5oZEdsdmJpQnZiaUJtYVhKemRDQnBkR1Z5WVhScGIyNHBYRzRnSUNBZ0lDQnBaaUFvYzNSaGNuUWdLeUJzYjJOaGJFOW1abk5sZENBOFBTQnRZWGhNYVc1bEtTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnNiMk5oYkU5bVpuTmxkRHRjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnWm05eWQyRnlaRVY0YUdGMWMzUmxaQ0E5SUhSeWRXVTdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2FXWWdLQ0ZpWVdOcmQyRnlaRVY0YUdGMWMzUmxaQ2tnZTF4dUlDQWdJQ0FnYVdZZ0tDRm1iM0ozWVhKa1JYaG9ZWFZ6ZEdWa0tTQjdYRzRnSUNBZ0lDQWdJSGRoYm5SR2IzSjNZWEprSUQwZ2RISjFaVHRjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnTHk4Z1EyaGxZMnNnYVdZZ2RISjVhVzVuSUhSdklHWnBkQ0JpWldadmNtVWdkR1Y0ZENCaVpXZHBibTVwYm1jc0lHRnVaQ0JwWmlCdWIzUXNJR05vWldOcklHbDBJR1pwZEhOY2JpQWdJQ0FnSUM4dklHSmxabTl5WlNCdlptWnpaWFFnYkc5allYUnBiMjVjYmlBZ0lDQWdJR2xtSUNodGFXNU1hVzVsSUR3OUlITjBZWEowSUMwZ2JHOWpZV3hQWm1aelpYUXBJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJQzFzYjJOaGJFOW1abk5sZENzck8xeHVJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQmlZV05yZDJGeVpFVjRhR0YxYzNSbFpDQTlJSFJ5ZFdVN1hHNGdJQ0FnSUNCeVpYUjFjbTRnYVhSbGNtRjBiM0lvS1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0F2THlCWFpTQjBjbWxsWkNCMGJ5Qm1hWFFnYUhWdWF5QmlaV1p2Y21VZ2RHVjRkQ0JpWldkcGJtNXBibWNnWVc1a0lHSmxlVzl1WkNCMFpYaDBJR3hsYm1kMGFDd2dkR2hsYmx4dUlDQWdJQzh2SUdoMWJtc2dZMkZ1SjNRZ1ptbDBJRzl1SUhSb1pTQjBaWGgwTGlCU1pYUjFjbTRnZFc1a1pXWnBibVZrWEc0Z0lIMDdYRzU5WEc0aVhYMD1cblxuXG4vKioqLyB9KSxcbi8qIDEzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyd1c2Ugc3RyaWN0JztcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2NhbGNMaW5lQ291bnQgPSBjYWxjTGluZUNvdW50O1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9tZXJnZSA9IG1lcmdlO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2NyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX3BhcnNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fYXJyYXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSBlbHNlIHsgcmV0dXJuIEFycmF5LmZyb20oYXJyKTsgfSB9XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9mdW5jdGlvbiBjYWxjTGluZUNvdW50KGh1bmspIHtcblx0ICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9jYWxjT2xkTmV3TGluZUNvdW50ID0gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jYWxjT2xkTmV3TGluZUNvdW50KGh1bmsubGluZXMpLFxuXHQgICAgICBvbGRMaW5lcyA9IF9jYWxjT2xkTmV3TGluZUNvdW50Lm9sZExpbmVzLFxuXHQgICAgICBuZXdMaW5lcyA9IF9jYWxjT2xkTmV3TGluZUNvdW50Lm5ld0xpbmVzO1xuXG5cdCAgaWYgKG9sZExpbmVzICE9PSB1bmRlZmluZWQpIHtcblx0ICAgIGh1bmsub2xkTGluZXMgPSBvbGRMaW5lcztcblx0ICB9IGVsc2Uge1xuXHQgICAgZGVsZXRlIGh1bmsub2xkTGluZXM7XG5cdCAgfVxuXG5cdCAgaWYgKG5ld0xpbmVzICE9PSB1bmRlZmluZWQpIHtcblx0ICAgIGh1bmsubmV3TGluZXMgPSBuZXdMaW5lcztcblx0ICB9IGVsc2Uge1xuXHQgICAgZGVsZXRlIGh1bmsubmV3TGluZXM7XG5cdCAgfVxuXHR9XG5cblx0ZnVuY3Rpb24gbWVyZ2UobWluZSwgdGhlaXJzLCBiYXNlKSB7XG5cdCAgbWluZSA9IGxvYWRQYXRjaChtaW5lLCBiYXNlKTtcblx0ICB0aGVpcnMgPSBsb2FkUGF0Y2godGhlaXJzLCBiYXNlKTtcblxuXHQgIHZhciByZXQgPSB7fTtcblxuXHQgIC8vIEZvciBpbmRleCB3ZSBqdXN0IGxldCBpdCBwYXNzIHRocm91Z2ggYXMgaXQgZG9lc24ndCBoYXZlIGFueSBuZWNlc3NhcnkgbWVhbmluZy5cblx0ICAvLyBMZWF2aW5nIHNhbml0eSBjaGVja3Mgb24gdGhpcyB0byB0aGUgQVBJIGNvbnN1bWVyIHRoYXQgbWF5IGtub3cgbW9yZSBhYm91dCB0aGVcblx0ICAvLyBtZWFuaW5nIGluIHRoZWlyIG93biBjb250ZXh0LlxuXHQgIGlmIChtaW5lLmluZGV4IHx8IHRoZWlycy5pbmRleCkge1xuXHQgICAgcmV0LmluZGV4ID0gbWluZS5pbmRleCB8fCB0aGVpcnMuaW5kZXg7XG5cdCAgfVxuXG5cdCAgaWYgKG1pbmUubmV3RmlsZU5hbWUgfHwgdGhlaXJzLm5ld0ZpbGVOYW1lKSB7XG5cdCAgICBpZiAoIWZpbGVOYW1lQ2hhbmdlZChtaW5lKSkge1xuXHQgICAgICAvLyBObyBoZWFkZXIgb3Igbm8gY2hhbmdlIGluIG91cnMsIHVzZSB0aGVpcnMgKGFuZCBvdXJzIGlmIHRoZWlycyBkb2VzIG5vdCBleGlzdClcblx0ICAgICAgcmV0Lm9sZEZpbGVOYW1lID0gdGhlaXJzLm9sZEZpbGVOYW1lIHx8IG1pbmUub2xkRmlsZU5hbWU7XG5cdCAgICAgIHJldC5uZXdGaWxlTmFtZSA9IHRoZWlycy5uZXdGaWxlTmFtZSB8fCBtaW5lLm5ld0ZpbGVOYW1lO1xuXHQgICAgICByZXQub2xkSGVhZGVyID0gdGhlaXJzLm9sZEhlYWRlciB8fCBtaW5lLm9sZEhlYWRlcjtcblx0ICAgICAgcmV0Lm5ld0hlYWRlciA9IHRoZWlycy5uZXdIZWFkZXIgfHwgbWluZS5uZXdIZWFkZXI7XG5cdCAgICB9IGVsc2UgaWYgKCFmaWxlTmFtZUNoYW5nZWQodGhlaXJzKSkge1xuXHQgICAgICAvLyBObyBoZWFkZXIgb3Igbm8gY2hhbmdlIGluIHRoZWlycywgdXNlIG91cnNcblx0ICAgICAgcmV0Lm9sZEZpbGVOYW1lID0gbWluZS5vbGRGaWxlTmFtZTtcblx0ICAgICAgcmV0Lm5ld0ZpbGVOYW1lID0gbWluZS5uZXdGaWxlTmFtZTtcblx0ICAgICAgcmV0Lm9sZEhlYWRlciA9IG1pbmUub2xkSGVhZGVyO1xuXHQgICAgICByZXQubmV3SGVhZGVyID0gbWluZS5uZXdIZWFkZXI7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICAvLyBCb3RoIGNoYW5nZWQuLi4gZmlndXJlIGl0IG91dFxuXHQgICAgICByZXQub2xkRmlsZU5hbWUgPSBzZWxlY3RGaWVsZChyZXQsIG1pbmUub2xkRmlsZU5hbWUsIHRoZWlycy5vbGRGaWxlTmFtZSk7XG5cdCAgICAgIHJldC5uZXdGaWxlTmFtZSA9IHNlbGVjdEZpZWxkKHJldCwgbWluZS5uZXdGaWxlTmFtZSwgdGhlaXJzLm5ld0ZpbGVOYW1lKTtcblx0ICAgICAgcmV0Lm9sZEhlYWRlciA9IHNlbGVjdEZpZWxkKHJldCwgbWluZS5vbGRIZWFkZXIsIHRoZWlycy5vbGRIZWFkZXIpO1xuXHQgICAgICByZXQubmV3SGVhZGVyID0gc2VsZWN0RmllbGQocmV0LCBtaW5lLm5ld0hlYWRlciwgdGhlaXJzLm5ld0hlYWRlcik7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgcmV0Lmh1bmtzID0gW107XG5cblx0ICB2YXIgbWluZUluZGV4ID0gMCxcblx0ICAgICAgdGhlaXJzSW5kZXggPSAwLFxuXHQgICAgICBtaW5lT2Zmc2V0ID0gMCxcblx0ICAgICAgdGhlaXJzT2Zmc2V0ID0gMDtcblxuXHQgIHdoaWxlIChtaW5lSW5kZXggPCBtaW5lLmh1bmtzLmxlbmd0aCB8fCB0aGVpcnNJbmRleCA8IHRoZWlycy5odW5rcy5sZW5ndGgpIHtcblx0ICAgIHZhciBtaW5lQ3VycmVudCA9IG1pbmUuaHVua3NbbWluZUluZGV4XSB8fCB7IG9sZFN0YXJ0OiBJbmZpbml0eSB9LFxuXHQgICAgICAgIHRoZWlyc0N1cnJlbnQgPSB0aGVpcnMuaHVua3NbdGhlaXJzSW5kZXhdIHx8IHsgb2xkU3RhcnQ6IEluZmluaXR5IH07XG5cblx0ICAgIGlmIChodW5rQmVmb3JlKG1pbmVDdXJyZW50LCB0aGVpcnNDdXJyZW50KSkge1xuXHQgICAgICAvLyBUaGlzIHBhdGNoIGRvZXMgbm90IG92ZXJsYXAgd2l0aCBhbnkgb2YgdGhlIG90aGVycywgeWF5LlxuXHQgICAgICByZXQuaHVua3MucHVzaChjbG9uZUh1bmsobWluZUN1cnJlbnQsIG1pbmVPZmZzZXQpKTtcblx0ICAgICAgbWluZUluZGV4Kys7XG5cdCAgICAgIHRoZWlyc09mZnNldCArPSBtaW5lQ3VycmVudC5uZXdMaW5lcyAtIG1pbmVDdXJyZW50Lm9sZExpbmVzO1xuXHQgICAgfSBlbHNlIGlmIChodW5rQmVmb3JlKHRoZWlyc0N1cnJlbnQsIG1pbmVDdXJyZW50KSkge1xuXHQgICAgICAvLyBUaGlzIHBhdGNoIGRvZXMgbm90IG92ZXJsYXAgd2l0aCBhbnkgb2YgdGhlIG90aGVycywgeWF5LlxuXHQgICAgICByZXQuaHVua3MucHVzaChjbG9uZUh1bmsodGhlaXJzQ3VycmVudCwgdGhlaXJzT2Zmc2V0KSk7XG5cdCAgICAgIHRoZWlyc0luZGV4Kys7XG5cdCAgICAgIG1pbmVPZmZzZXQgKz0gdGhlaXJzQ3VycmVudC5uZXdMaW5lcyAtIHRoZWlyc0N1cnJlbnQub2xkTGluZXM7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICAvLyBPdmVybGFwLCBtZXJnZSBhcyBiZXN0IHdlIGNhblxuXHQgICAgICB2YXIgbWVyZ2VkSHVuayA9IHtcblx0ICAgICAgICBvbGRTdGFydDogTWF0aC5taW4obWluZUN1cnJlbnQub2xkU3RhcnQsIHRoZWlyc0N1cnJlbnQub2xkU3RhcnQpLFxuXHQgICAgICAgIG9sZExpbmVzOiAwLFxuXHQgICAgICAgIG5ld1N0YXJ0OiBNYXRoLm1pbihtaW5lQ3VycmVudC5uZXdTdGFydCArIG1pbmVPZmZzZXQsIHRoZWlyc0N1cnJlbnQub2xkU3RhcnQgKyB0aGVpcnNPZmZzZXQpLFxuXHQgICAgICAgIG5ld0xpbmVzOiAwLFxuXHQgICAgICAgIGxpbmVzOiBbXVxuXHQgICAgICB9O1xuXHQgICAgICBtZXJnZUxpbmVzKG1lcmdlZEh1bmssIG1pbmVDdXJyZW50Lm9sZFN0YXJ0LCBtaW5lQ3VycmVudC5saW5lcywgdGhlaXJzQ3VycmVudC5vbGRTdGFydCwgdGhlaXJzQ3VycmVudC5saW5lcyk7XG5cdCAgICAgIHRoZWlyc0luZGV4Kys7XG5cdCAgICAgIG1pbmVJbmRleCsrO1xuXG5cdCAgICAgIHJldC5odW5rcy5wdXNoKG1lcmdlZEh1bmspO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHJldHVybiByZXQ7XG5cdH1cblxuXHRmdW5jdGlvbiBsb2FkUGF0Y2gocGFyYW0sIGJhc2UpIHtcblx0ICBpZiAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJykge1xuXHQgICAgaWYgKC9eQEAvbS50ZXN0KHBhcmFtKSB8fCAvXkluZGV4Oi9tLnRlc3QocGFyYW0pKSB7XG5cdCAgICAgIHJldHVybiAoLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLygwLCBfcGFyc2UucGFyc2VQYXRjaCkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8ocGFyYW0pWzBdXG5cdCAgICAgICk7XG5cdCAgICB9XG5cblx0ICAgIGlmICghYmFzZSkge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgcHJvdmlkZSBhIGJhc2UgcmVmZXJlbmNlIG9yIHBhc3MgaW4gYSBwYXRjaCcpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuICgvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKDAsIF9jcmVhdGUuc3RydWN0dXJlZFBhdGNoKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyh1bmRlZmluZWQsIHVuZGVmaW5lZCwgYmFzZSwgcGFyYW0pXG5cdCAgICApO1xuXHQgIH1cblxuXHQgIHJldHVybiBwYXJhbTtcblx0fVxuXG5cdGZ1bmN0aW9uIGZpbGVOYW1lQ2hhbmdlZChwYXRjaCkge1xuXHQgIHJldHVybiBwYXRjaC5uZXdGaWxlTmFtZSAmJiBwYXRjaC5uZXdGaWxlTmFtZSAhPT0gcGF0Y2gub2xkRmlsZU5hbWU7XG5cdH1cblxuXHRmdW5jdGlvbiBzZWxlY3RGaWVsZChpbmRleCwgbWluZSwgdGhlaXJzKSB7XG5cdCAgaWYgKG1pbmUgPT09IHRoZWlycykge1xuXHQgICAgcmV0dXJuIG1pbmU7XG5cdCAgfSBlbHNlIHtcblx0ICAgIGluZGV4LmNvbmZsaWN0ID0gdHJ1ZTtcblx0ICAgIHJldHVybiB7IG1pbmU6IG1pbmUsIHRoZWlyczogdGhlaXJzIH07XG5cdCAgfVxuXHR9XG5cblx0ZnVuY3Rpb24gaHVua0JlZm9yZSh0ZXN0LCBjaGVjaykge1xuXHQgIHJldHVybiB0ZXN0Lm9sZFN0YXJ0IDwgY2hlY2sub2xkU3RhcnQgJiYgdGVzdC5vbGRTdGFydCArIHRlc3Qub2xkTGluZXMgPCBjaGVjay5vbGRTdGFydDtcblx0fVxuXG5cdGZ1bmN0aW9uIGNsb25lSHVuayhodW5rLCBvZmZzZXQpIHtcblx0ICByZXR1cm4ge1xuXHQgICAgb2xkU3RhcnQ6IGh1bmsub2xkU3RhcnQsIG9sZExpbmVzOiBodW5rLm9sZExpbmVzLFxuXHQgICAgbmV3U3RhcnQ6IGh1bmsubmV3U3RhcnQgKyBvZmZzZXQsIG5ld0xpbmVzOiBodW5rLm5ld0xpbmVzLFxuXHQgICAgbGluZXM6IGh1bmsubGluZXNcblx0ICB9O1xuXHR9XG5cblx0ZnVuY3Rpb24gbWVyZ2VMaW5lcyhodW5rLCBtaW5lT2Zmc2V0LCBtaW5lTGluZXMsIHRoZWlyT2Zmc2V0LCB0aGVpckxpbmVzKSB7XG5cdCAgLy8gVGhpcyB3aWxsIGdlbmVyYWxseSByZXN1bHQgaW4gYSBjb25mbGljdGVkIGh1bmssIGJ1dCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlIGNvbnRleHRcblx0ICAvLyBpcyB0aGUgb25seSBvdmVybGFwIHdoZXJlIHdlIGNhbiBzdWNjZXNzZnVsbHkgbWVyZ2UgdGhlIGNvbnRlbnQgaGVyZS5cblx0ICB2YXIgbWluZSA9IHsgb2Zmc2V0OiBtaW5lT2Zmc2V0LCBsaW5lczogbWluZUxpbmVzLCBpbmRleDogMCB9LFxuXHQgICAgICB0aGVpciA9IHsgb2Zmc2V0OiB0aGVpck9mZnNldCwgbGluZXM6IHRoZWlyTGluZXMsIGluZGV4OiAwIH07XG5cblx0ICAvLyBIYW5kbGUgYW55IGxlYWRpbmcgY29udGVudFxuXHQgIGluc2VydExlYWRpbmcoaHVuaywgbWluZSwgdGhlaXIpO1xuXHQgIGluc2VydExlYWRpbmcoaHVuaywgdGhlaXIsIG1pbmUpO1xuXG5cdCAgLy8gTm93IGluIHRoZSBvdmVybGFwIGNvbnRlbnQuIFNjYW4gdGhyb3VnaCBhbmQgc2VsZWN0IHRoZSBiZXN0IGNoYW5nZXMgZnJvbSBlYWNoLlxuXHQgIHdoaWxlIChtaW5lLmluZGV4IDwgbWluZS5saW5lcy5sZW5ndGggJiYgdGhlaXIuaW5kZXggPCB0aGVpci5saW5lcy5sZW5ndGgpIHtcblx0ICAgIHZhciBtaW5lQ3VycmVudCA9IG1pbmUubGluZXNbbWluZS5pbmRleF0sXG5cdCAgICAgICAgdGhlaXJDdXJyZW50ID0gdGhlaXIubGluZXNbdGhlaXIuaW5kZXhdO1xuXG5cdCAgICBpZiAoKG1pbmVDdXJyZW50WzBdID09PSAnLScgfHwgbWluZUN1cnJlbnRbMF0gPT09ICcrJykgJiYgKHRoZWlyQ3VycmVudFswXSA9PT0gJy0nIHx8IHRoZWlyQ3VycmVudFswXSA9PT0gJysnKSkge1xuXHQgICAgICAvLyBCb3RoIG1vZGlmaWVkIC4uLlxuXHQgICAgICBtdXR1YWxDaGFuZ2UoaHVuaywgbWluZSwgdGhlaXIpO1xuXHQgICAgfSBlbHNlIGlmIChtaW5lQ3VycmVudFswXSA9PT0gJysnICYmIHRoZWlyQ3VycmVudFswXSA9PT0gJyAnKSB7XG5cdCAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2h1bmskbGluZXM7XG5cblx0ICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8gLy8gTWluZSBpbnNlcnRlZFxuXHQgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKF9odW5rJGxpbmVzID0gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9odW5rLmxpbmVzKS5wdXNoLiAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovYXBwbHkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8oIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9faHVuayRsaW5lcyAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLywgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL190b0NvbnN1bWFibGVBcnJheSggLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jb2xsZWN0Q2hhbmdlKG1pbmUpKSk7XG5cdCAgICB9IGVsc2UgaWYgKHRoZWlyQ3VycmVudFswXSA9PT0gJysnICYmIG1pbmVDdXJyZW50WzBdID09PSAnICcpIHtcblx0ICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciBfaHVuayRsaW5lczI7XG5cblx0ICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8gLy8gVGhlaXJzIGluc2VydGVkXG5cdCAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oX2h1bmskbGluZXMyID0gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9odW5rLmxpbmVzKS5wdXNoLiAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovYXBwbHkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8oIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9faHVuayRsaW5lczIgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8sIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fdG9Db25zdW1hYmxlQXJyYXkoIC8qaXN0YW5idWwgaWdub3JlIGVuZCovY29sbGVjdENoYW5nZSh0aGVpcikpKTtcblx0ICAgIH0gZWxzZSBpZiAobWluZUN1cnJlbnRbMF0gPT09ICctJyAmJiB0aGVpckN1cnJlbnRbMF0gPT09ICcgJykge1xuXHQgICAgICAvLyBNaW5lIHJlbW92ZWQgb3IgZWRpdGVkXG5cdCAgICAgIHJlbW92YWwoaHVuaywgbWluZSwgdGhlaXIpO1xuXHQgICAgfSBlbHNlIGlmICh0aGVpckN1cnJlbnRbMF0gPT09ICctJyAmJiBtaW5lQ3VycmVudFswXSA9PT0gJyAnKSB7XG5cdCAgICAgIC8vIFRoZWlyIHJlbW92ZWQgb3IgZWRpdGVkXG5cdCAgICAgIHJlbW92YWwoaHVuaywgdGhlaXIsIG1pbmUsIHRydWUpO1xuXHQgICAgfSBlbHNlIGlmIChtaW5lQ3VycmVudCA9PT0gdGhlaXJDdXJyZW50KSB7XG5cdCAgICAgIC8vIENvbnRleHQgaWRlbnRpdHlcblx0ICAgICAgaHVuay5saW5lcy5wdXNoKG1pbmVDdXJyZW50KTtcblx0ICAgICAgbWluZS5pbmRleCsrO1xuXHQgICAgICB0aGVpci5pbmRleCsrO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgLy8gQ29udGV4dCBtaXNtYXRjaFxuXHQgICAgICBjb25mbGljdChodW5rLCBjb2xsZWN0Q2hhbmdlKG1pbmUpLCBjb2xsZWN0Q2hhbmdlKHRoZWlyKSk7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgLy8gTm93IHB1c2ggYW55dGhpbmcgdGhhdCBtYXkgYmUgcmVtYWluaW5nXG5cdCAgaW5zZXJ0VHJhaWxpbmcoaHVuaywgbWluZSk7XG5cdCAgaW5zZXJ0VHJhaWxpbmcoaHVuaywgdGhlaXIpO1xuXG5cdCAgY2FsY0xpbmVDb3VudChodW5rKTtcblx0fVxuXG5cdGZ1bmN0aW9uIG11dHVhbENoYW5nZShodW5rLCBtaW5lLCB0aGVpcikge1xuXHQgIHZhciBteUNoYW5nZXMgPSBjb2xsZWN0Q2hhbmdlKG1pbmUpLFxuXHQgICAgICB0aGVpckNoYW5nZXMgPSBjb2xsZWN0Q2hhbmdlKHRoZWlyKTtcblxuXHQgIGlmIChhbGxSZW1vdmVzKG15Q2hhbmdlcykgJiYgYWxsUmVtb3Zlcyh0aGVpckNoYW5nZXMpKSB7XG5cdCAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHJlbW92ZSBjaGFuZ2VzIHRoYXQgYXJlIHN1cGVyc2V0cyBvZiBvbmUgYW5vdGhlclxuXHQgICAgaWYgKCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKDAsIF9hcnJheS5hcnJheVN0YXJ0c1dpdGgpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovKG15Q2hhbmdlcywgdGhlaXJDaGFuZ2VzKSAmJiBza2lwUmVtb3ZlU3VwZXJzZXQodGhlaXIsIG15Q2hhbmdlcywgbXlDaGFuZ2VzLmxlbmd0aCAtIHRoZWlyQ2hhbmdlcy5sZW5ndGgpKSB7XG5cdCAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2h1bmskbGluZXMzO1xuXG5cdCAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oX2h1bmskbGluZXMzID0gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9odW5rLmxpbmVzKS5wdXNoLiAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovYXBwbHkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8oIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9faHVuayRsaW5lczMgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8sIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fdG9Db25zdW1hYmxlQXJyYXkoIC8qaXN0YW5idWwgaWdub3JlIGVuZCovbXlDaGFuZ2VzKSk7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH0gZWxzZSBpZiAoIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oMCwgX2FycmF5LmFycmF5U3RhcnRzV2l0aCkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8odGhlaXJDaGFuZ2VzLCBteUNoYW5nZXMpICYmIHNraXBSZW1vdmVTdXBlcnNldChtaW5lLCB0aGVpckNoYW5nZXMsIHRoZWlyQ2hhbmdlcy5sZW5ndGggLSBteUNoYW5nZXMubGVuZ3RoKSkge1xuXHQgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9odW5rJGxpbmVzNDtcblxuXHQgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKF9odW5rJGxpbmVzNCA9IC8qaXN0YW5idWwgaWdub3JlIGVuZCovaHVuay5saW5lcykucHVzaC4gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2FwcGx5IC8qaXN0YW5idWwgaWdub3JlIGVuZCovKCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2h1bmskbGluZXM0IC8qaXN0YW5idWwgaWdub3JlIGVuZCovLCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX3RvQ29uc3VtYWJsZUFycmF5KCAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3RoZWlyQ2hhbmdlcykpO1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgfSBlbHNlIGlmICggLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLygwLCBfYXJyYXkuYXJyYXlFcXVhbCkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8obXlDaGFuZ2VzLCB0aGVpckNoYW5nZXMpKSB7XG5cdCAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9odW5rJGxpbmVzNTtcblxuXHQgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyhfaHVuayRsaW5lczUgPSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2h1bmsubGluZXMpLnB1c2guIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9hcHBseSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyggLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19odW5rJGxpbmVzNSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLywgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL190b0NvbnN1bWFibGVBcnJheSggLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9teUNoYW5nZXMpKTtcblx0ICAgIHJldHVybjtcblx0ICB9XG5cblx0ICBjb25mbGljdChodW5rLCBteUNoYW5nZXMsIHRoZWlyQ2hhbmdlcyk7XG5cdH1cblxuXHRmdW5jdGlvbiByZW1vdmFsKGh1bmssIG1pbmUsIHRoZWlyLCBzd2FwKSB7XG5cdCAgdmFyIG15Q2hhbmdlcyA9IGNvbGxlY3RDaGFuZ2UobWluZSksXG5cdCAgICAgIHRoZWlyQ2hhbmdlcyA9IGNvbGxlY3RDb250ZXh0KHRoZWlyLCBteUNoYW5nZXMpO1xuXHQgIGlmICh0aGVpckNoYW5nZXMubWVyZ2VkKSB7XG5cdCAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9odW5rJGxpbmVzNjtcblxuXHQgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyhfaHVuayRsaW5lczYgPSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2h1bmsubGluZXMpLnB1c2guIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9hcHBseSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyggLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19odW5rJGxpbmVzNiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLywgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL190b0NvbnN1bWFibGVBcnJheSggLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi90aGVpckNoYW5nZXMubWVyZ2VkKSk7XG5cdCAgfSBlbHNlIHtcblx0ICAgIGNvbmZsaWN0KGh1bmssIHN3YXAgPyB0aGVpckNoYW5nZXMgOiBteUNoYW5nZXMsIHN3YXAgPyBteUNoYW5nZXMgOiB0aGVpckNoYW5nZXMpO1xuXHQgIH1cblx0fVxuXG5cdGZ1bmN0aW9uIGNvbmZsaWN0KGh1bmssIG1pbmUsIHRoZWlyKSB7XG5cdCAgaHVuay5jb25mbGljdCA9IHRydWU7XG5cdCAgaHVuay5saW5lcy5wdXNoKHtcblx0ICAgIGNvbmZsaWN0OiB0cnVlLFxuXHQgICAgbWluZTogbWluZSxcblx0ICAgIHRoZWlyczogdGhlaXJcblx0ICB9KTtcblx0fVxuXG5cdGZ1bmN0aW9uIGluc2VydExlYWRpbmcoaHVuaywgaW5zZXJ0LCB0aGVpcikge1xuXHQgIHdoaWxlIChpbnNlcnQub2Zmc2V0IDwgdGhlaXIub2Zmc2V0ICYmIGluc2VydC5pbmRleCA8IGluc2VydC5saW5lcy5sZW5ndGgpIHtcblx0ICAgIHZhciBsaW5lID0gaW5zZXJ0LmxpbmVzW2luc2VydC5pbmRleCsrXTtcblx0ICAgIGh1bmsubGluZXMucHVzaChsaW5lKTtcblx0ICAgIGluc2VydC5vZmZzZXQrKztcblx0ICB9XG5cdH1cblx0ZnVuY3Rpb24gaW5zZXJ0VHJhaWxpbmcoaHVuaywgaW5zZXJ0KSB7XG5cdCAgd2hpbGUgKGluc2VydC5pbmRleCA8IGluc2VydC5saW5lcy5sZW5ndGgpIHtcblx0ICAgIHZhciBsaW5lID0gaW5zZXJ0LmxpbmVzW2luc2VydC5pbmRleCsrXTtcblx0ICAgIGh1bmsubGluZXMucHVzaChsaW5lKTtcblx0ICB9XG5cdH1cblxuXHRmdW5jdGlvbiBjb2xsZWN0Q2hhbmdlKHN0YXRlKSB7XG5cdCAgdmFyIHJldCA9IFtdLFxuXHQgICAgICBvcGVyYXRpb24gPSBzdGF0ZS5saW5lc1tzdGF0ZS5pbmRleF1bMF07XG5cdCAgd2hpbGUgKHN0YXRlLmluZGV4IDwgc3RhdGUubGluZXMubGVuZ3RoKSB7XG5cdCAgICB2YXIgbGluZSA9IHN0YXRlLmxpbmVzW3N0YXRlLmluZGV4XTtcblxuXHQgICAgLy8gR3JvdXAgYWRkaXRpb25zIHRoYXQgYXJlIGltbWVkaWF0ZWx5IGFmdGVyIHN1YnRyYWN0aW9ucyBhbmQgdHJlYXQgdGhlbSBhcyBvbmUgXCJhdG9taWNcIiBtb2RpZnkgY2hhbmdlLlxuXHQgICAgaWYgKG9wZXJhdGlvbiA9PT0gJy0nICYmIGxpbmVbMF0gPT09ICcrJykge1xuXHQgICAgICBvcGVyYXRpb24gPSAnKyc7XG5cdCAgICB9XG5cblx0ICAgIGlmIChvcGVyYXRpb24gPT09IGxpbmVbMF0pIHtcblx0ICAgICAgcmV0LnB1c2gobGluZSk7XG5cdCAgICAgIHN0YXRlLmluZGV4Kys7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBicmVhaztcblx0ICAgIH1cblx0ICB9XG5cblx0ICByZXR1cm4gcmV0O1xuXHR9XG5cdGZ1bmN0aW9uIGNvbGxlY3RDb250ZXh0KHN0YXRlLCBtYXRjaENoYW5nZXMpIHtcblx0ICB2YXIgY2hhbmdlcyA9IFtdLFxuXHQgICAgICBtZXJnZWQgPSBbXSxcblx0ICAgICAgbWF0Y2hJbmRleCA9IDAsXG5cdCAgICAgIGNvbnRleHRDaGFuZ2VzID0gZmFsc2UsXG5cdCAgICAgIGNvbmZsaWN0ZWQgPSBmYWxzZTtcblx0ICB3aGlsZSAobWF0Y2hJbmRleCA8IG1hdGNoQ2hhbmdlcy5sZW5ndGggJiYgc3RhdGUuaW5kZXggPCBzdGF0ZS5saW5lcy5sZW5ndGgpIHtcblx0ICAgIHZhciBjaGFuZ2UgPSBzdGF0ZS5saW5lc1tzdGF0ZS5pbmRleF0sXG5cdCAgICAgICAgbWF0Y2ggPSBtYXRjaENoYW5nZXNbbWF0Y2hJbmRleF07XG5cblx0ICAgIC8vIE9uY2Ugd2UndmUgaGl0IG91ciBhZGQsIHRoZW4gd2UgYXJlIGRvbmVcblx0ICAgIGlmIChtYXRjaFswXSA9PT0gJysnKSB7XG5cdCAgICAgIGJyZWFrO1xuXHQgICAgfVxuXG5cdCAgICBjb250ZXh0Q2hhbmdlcyA9IGNvbnRleHRDaGFuZ2VzIHx8IGNoYW5nZVswXSAhPT0gJyAnO1xuXG5cdCAgICBtZXJnZWQucHVzaChtYXRjaCk7XG5cdCAgICBtYXRjaEluZGV4Kys7XG5cblx0ICAgIC8vIENvbnN1bWUgYW55IGFkZGl0aW9ucyBpbiB0aGUgb3RoZXIgYmxvY2sgYXMgYSBjb25mbGljdCB0byBhdHRlbXB0XG5cdCAgICAvLyB0byBwdWxsIGluIHRoZSByZW1haW5pbmcgY29udGV4dCBhZnRlciB0aGlzXG5cdCAgICBpZiAoY2hhbmdlWzBdID09PSAnKycpIHtcblx0ICAgICAgY29uZmxpY3RlZCA9IHRydWU7XG5cblx0ICAgICAgd2hpbGUgKGNoYW5nZVswXSA9PT0gJysnKSB7XG5cdCAgICAgICAgY2hhbmdlcy5wdXNoKGNoYW5nZSk7XG5cdCAgICAgICAgY2hhbmdlID0gc3RhdGUubGluZXNbKytzdGF0ZS5pbmRleF07XG5cdCAgICAgIH1cblx0ICAgIH1cblxuXHQgICAgaWYgKG1hdGNoLnN1YnN0cigxKSA9PT0gY2hhbmdlLnN1YnN0cigxKSkge1xuXHQgICAgICBjaGFuZ2VzLnB1c2goY2hhbmdlKTtcblx0ICAgICAgc3RhdGUuaW5kZXgrKztcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGNvbmZsaWN0ZWQgPSB0cnVlO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIGlmICgobWF0Y2hDaGFuZ2VzW21hdGNoSW5kZXhdIHx8ICcnKVswXSA9PT0gJysnICYmIGNvbnRleHRDaGFuZ2VzKSB7XG5cdCAgICBjb25mbGljdGVkID0gdHJ1ZTtcblx0ICB9XG5cblx0ICBpZiAoY29uZmxpY3RlZCkge1xuXHQgICAgcmV0dXJuIGNoYW5nZXM7XG5cdCAgfVxuXG5cdCAgd2hpbGUgKG1hdGNoSW5kZXggPCBtYXRjaENoYW5nZXMubGVuZ3RoKSB7XG5cdCAgICBtZXJnZWQucHVzaChtYXRjaENoYW5nZXNbbWF0Y2hJbmRleCsrXSk7XG5cdCAgfVxuXG5cdCAgcmV0dXJuIHtcblx0ICAgIG1lcmdlZDogbWVyZ2VkLFxuXHQgICAgY2hhbmdlczogY2hhbmdlc1xuXHQgIH07XG5cdH1cblxuXHRmdW5jdGlvbiBhbGxSZW1vdmVzKGNoYW5nZXMpIHtcblx0ICByZXR1cm4gY2hhbmdlcy5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGNoYW5nZSkge1xuXHQgICAgcmV0dXJuIHByZXYgJiYgY2hhbmdlWzBdID09PSAnLSc7XG5cdCAgfSwgdHJ1ZSk7XG5cdH1cblx0ZnVuY3Rpb24gc2tpcFJlbW92ZVN1cGVyc2V0KHN0YXRlLCByZW1vdmVDaGFuZ2VzLCBkZWx0YSkge1xuXHQgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVsdGE7IGkrKykge1xuXHQgICAgdmFyIGNoYW5nZUNvbnRlbnQgPSByZW1vdmVDaGFuZ2VzW3JlbW92ZUNoYW5nZXMubGVuZ3RoIC0gZGVsdGEgKyBpXS5zdWJzdHIoMSk7XG5cdCAgICBpZiAoc3RhdGUubGluZXNbc3RhdGUuaW5kZXggKyBpXSAhPT0gJyAnICsgY2hhbmdlQ29udGVudCkge1xuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgc3RhdGUuaW5kZXggKz0gZGVsdGE7XG5cdCAgcmV0dXJuIHRydWU7XG5cdH1cblxuXHRmdW5jdGlvbiBjYWxjT2xkTmV3TGluZUNvdW50KGxpbmVzKSB7XG5cdCAgdmFyIG9sZExpbmVzID0gMDtcblx0ICB2YXIgbmV3TGluZXMgPSAwO1xuXG5cdCAgbGluZXMuZm9yRWFjaChmdW5jdGlvbiAobGluZSkge1xuXHQgICAgaWYgKHR5cGVvZiBsaW5lICE9PSAnc3RyaW5nJykge1xuXHQgICAgICB2YXIgbXlDb3VudCA9IGNhbGNPbGROZXdMaW5lQ291bnQobGluZS5taW5lKTtcblx0ICAgICAgdmFyIHRoZWlyQ291bnQgPSBjYWxjT2xkTmV3TGluZUNvdW50KGxpbmUudGhlaXJzKTtcblxuXHQgICAgICBpZiAob2xkTGluZXMgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgIGlmIChteUNvdW50Lm9sZExpbmVzID09PSB0aGVpckNvdW50Lm9sZExpbmVzKSB7XG5cdCAgICAgICAgICBvbGRMaW5lcyArPSBteUNvdW50Lm9sZExpbmVzO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBvbGRMaW5lcyA9IHVuZGVmaW5lZDtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblxuXHQgICAgICBpZiAobmV3TGluZXMgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgIGlmIChteUNvdW50Lm5ld0xpbmVzID09PSB0aGVpckNvdW50Lm5ld0xpbmVzKSB7XG5cdCAgICAgICAgICBuZXdMaW5lcyArPSBteUNvdW50Lm5ld0xpbmVzO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBuZXdMaW5lcyA9IHVuZGVmaW5lZDtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGlmIChuZXdMaW5lcyAhPT0gdW5kZWZpbmVkICYmIChsaW5lWzBdID09PSAnKycgfHwgbGluZVswXSA9PT0gJyAnKSkge1xuXHQgICAgICAgIG5ld0xpbmVzKys7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKG9sZExpbmVzICE9PSB1bmRlZmluZWQgJiYgKGxpbmVbMF0gPT09ICctJyB8fCBsaW5lWzBdID09PSAnICcpKSB7XG5cdCAgICAgICAgb2xkTGluZXMrKztcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pO1xuXG5cdCAgcmV0dXJuIHsgb2xkTGluZXM6IG9sZExpbmVzLCBuZXdMaW5lczogbmV3TGluZXMgfTtcblx0fVxuXHQvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTl3WVhSamFDOXRaWEpuWlM1cWN5SmRMQ0p1WVcxbGN5STZXeUpqWVd4alRHbHVaVU52ZFc1MElpd2liV1Z5WjJVaUxDSm9kVzVySWl3aVkyRnNZMDlzWkU1bGQweHBibVZEYjNWdWRDSXNJbXhwYm1Weklpd2liMnhrVEdsdVpYTWlMQ0p1WlhkTWFXNWxjeUlzSW5WdVpHVm1hVzVsWkNJc0ltMXBibVVpTENKMGFHVnBjbk1pTENKaVlYTmxJaXdpYkc5aFpGQmhkR05vSWl3aWNtVjBJaXdpYVc1a1pYZ2lMQ0p1WlhkR2FXeGxUbUZ0WlNJc0ltWnBiR1ZPWVcxbFEyaGhibWRsWkNJc0ltOXNaRVpwYkdWT1lXMWxJaXdpYjJ4a1NHVmhaR1Z5SWl3aWJtVjNTR1ZoWkdWeUlpd2ljMlZzWldOMFJtbGxiR1FpTENKb2RXNXJjeUlzSW0xcGJtVkpibVJsZUNJc0luUm9aV2x5YzBsdVpHVjRJaXdpYldsdVpVOW1abk5sZENJc0luUm9aV2x5YzA5bVpuTmxkQ0lzSW14bGJtZDBhQ0lzSW0xcGJtVkRkWEp5Wlc1MElpd2liMnhrVTNSaGNuUWlMQ0pKYm1acGJtbDBlU0lzSW5Sb1pXbHljME4xY25KbGJuUWlMQ0pvZFc1clFtVm1iM0psSWl3aWNIVnphQ0lzSW1Oc2IyNWxTSFZ1YXlJc0ltMWxjbWRsWkVoMWJtc2lMQ0pOWVhSb0lpd2liV2x1SWl3aWJtVjNVM1JoY25RaUxDSnRaWEpuWlV4cGJtVnpJaXdpY0dGeVlXMGlMQ0owWlhOMElpd2lSWEp5YjNJaUxDSndZWFJqYUNJc0ltTnZibVpzYVdOMElpd2lZMmhsWTJzaUxDSnZabVp6WlhRaUxDSnRhVzVsVEdsdVpYTWlMQ0owYUdWcGNrOW1abk5sZENJc0luUm9aV2x5VEdsdVpYTWlMQ0owYUdWcGNpSXNJbWx1YzJWeWRFeGxZV1JwYm1jaUxDSjBhR1ZwY2tOMWNuSmxiblFpTENKdGRYUjFZV3hEYUdGdVoyVWlMQ0pqYjJ4c1pXTjBRMmhoYm1kbElpd2ljbVZ0YjNaaGJDSXNJbWx1YzJWeWRGUnlZV2xzYVc1bklpd2liWGxEYUdGdVoyVnpJaXdpZEdobGFYSkRhR0Z1WjJWeklpd2lZV3hzVW1WdGIzWmxjeUlzSW5OcmFYQlNaVzF2ZG1WVGRYQmxjbk5sZENJc0luTjNZWEFpTENKamIyeHNaV04wUTI5dWRHVjRkQ0lzSW0xbGNtZGxaQ0lzSW1sdWMyVnlkQ0lzSW14cGJtVWlMQ0p6ZEdGMFpTSXNJbTl3WlhKaGRHbHZiaUlzSW0xaGRHTm9RMmhoYm1kbGN5SXNJbU5vWVc1blpYTWlMQ0p0WVhSamFFbHVaR1Y0SWl3aVkyOXVkR1Y0ZEVOb1lXNW5aWE1pTENKamIyNW1iR2xqZEdWa0lpd2lZMmhoYm1kbElpd2liV0YwWTJnaUxDSnpkV0p6ZEhJaUxDSnlaV1IxWTJVaUxDSndjbVYySWl3aWNtVnRiM1psUTJoaGJtZGxjeUlzSW1SbGJIUmhJaXdpYVNJc0ltTm9ZVzVuWlVOdmJuUmxiblFpTENKbWIzSkZZV05vSWl3aWJYbERiM1Z1ZENJc0luUm9aV2x5UTI5MWJuUWlYU3dpYldGd2NHbHVaM01pT2lJN096dG5RMEZMWjBKQkxHRXNSMEZCUVVFc1lUdDVSRUZuUWtGRExFc3NSMEZCUVVFc1N6czdRVUZ5UW1oQ096dEJRVU5CT3p0QlFVVkJPenM3TzNWQ1FVVlBMRk5CUVZORUxHRkJRVlFzUTBGQmRVSkZMRWxCUVhaQ0xFVkJRVFpDTzBGQlFVRXNOa1ZCUTB4RExHOUNRVUZ2UWtRc1MwRkJTMFVzUzBGQmVrSXNRMEZFU3p0QlFVRkJMRTFCUXpOQ1F5eFJRVVF5UWl4M1FrRkRNMEpCTEZGQlJESkNPMEZCUVVFc1RVRkRha0pETEZGQlJHbENMSGRDUVVOcVFrRXNVVUZFYVVJN08wRkJSMnhETEUxQlFVbEVMR0ZCUVdGRkxGTkJRV3BDTEVWQlFUUkNPMEZCUXpGQ1RDeFRRVUZMUnl4UlFVRk1MRWRCUVdkQ1FTeFJRVUZvUWp0QlFVTkVMRWRCUmtRc1RVRkZUenRCUVVOTUxGZEJRVTlJTEV0QlFVdEhMRkZCUVZvN1FVRkRSRHM3UVVGRlJDeE5RVUZKUXl4aFFVRmhReXhUUVVGcVFpeEZRVUUwUWp0QlFVTXhRa3dzVTBGQlMwa3NVVUZCVEN4SFFVRm5Ra0VzVVVGQmFFSTdRVUZEUkN4SFFVWkVMRTFCUlU4N1FVRkRUQ3hYUVVGUFNpeExRVUZMU1N4UlFVRmFPMEZCUTBRN1FVRkRSanM3UVVGRlRTeFRRVUZUVEN4TFFVRlVMRU5CUVdWUExFbEJRV1lzUlVGQmNVSkRMRTFCUVhKQ0xFVkJRVFpDUXl4SlFVRTNRaXhGUVVGdFF6dEJRVU40UTBZc1UwRkJUMGNzVlVGQlZVZ3NTVUZCVml4RlFVRm5Ra1VzU1VGQmFFSXNRMEZCVUR0QlFVTkJSQ3hYUVVGVFJTeFZRVUZWUml4TlFVRldMRVZCUVd0Q1F5eEpRVUZzUWl4RFFVRlVPenRCUVVWQkxFMUJRVWxGTEUxQlFVMHNSVUZCVmpzN1FVRkZRVHRCUVVOQk8wRkJRMEU3UVVGRFFTeE5RVUZKU2l4TFFVRkxTeXhMUVVGTUxFbEJRV05LTEU5QlFVOUpMRXRCUVhwQ0xFVkJRV2RETzBGQlF6bENSQ3hSUVVGSlF5eExRVUZLTEVkQlFWbE1MRXRCUVV0TExFdEJRVXdzU1VGQlkwb3NUMEZCVDBrc1MwRkJha003UVVGRFJEczdRVUZGUkN4TlFVRkpUQ3hMUVVGTFRTeFhRVUZNTEVsQlFXOUNUQ3hQUVVGUFN5eFhRVUV2UWl4RlFVRTBRenRCUVVNeFF5eFJRVUZKTEVOQlFVTkRMR2RDUVVGblFsQXNTVUZCYUVJc1EwRkJUQ3hGUVVFMFFqdEJRVU14UWp0QlFVTkJTU3hWUVVGSlNTeFhRVUZLTEVkQlFXdENVQ3hQUVVGUFR5eFhRVUZRTEVsQlFYTkNVaXhMUVVGTFVTeFhRVUUzUXp0QlFVTkJTaXhWUVVGSlJTeFhRVUZLTEVkQlFXdENUQ3hQUVVGUFN5eFhRVUZRTEVsQlFYTkNUaXhMUVVGTFRTeFhRVUUzUXp0QlFVTkJSaXhWUVVGSlN5eFRRVUZLTEVkQlFXZENVaXhQUVVGUFVTeFRRVUZRTEVsQlFXOUNWQ3hMUVVGTFV5eFRRVUY2UXp0QlFVTkJUQ3hWUVVGSlRTeFRRVUZLTEVkQlFXZENWQ3hQUVVGUFV5eFRRVUZRTEVsQlFXOUNWaXhMUVVGTFZTeFRRVUY2UXp0QlFVTkVMRXRCVGtRc1RVRk5UeXhKUVVGSkxFTkJRVU5JTEdkQ1FVRm5RazRzVFVGQmFFSXNRMEZCVEN4RlFVRTRRanRCUVVOdVF6dEJRVU5CUnl4VlFVRkpTU3hYUVVGS0xFZEJRV3RDVWl4TFFVRkxVU3hYUVVGMlFqdEJRVU5CU2l4VlFVRkpSU3hYUVVGS0xFZEJRV3RDVGl4TFFVRkxUU3hYUVVGMlFqdEJRVU5CUml4VlFVRkpTeXhUUVVGS0xFZEJRV2RDVkN4TFFVRkxVeXhUUVVGeVFqdEJRVU5CVEN4VlFVRkpUU3hUUVVGS0xFZEJRV2RDVml4TFFVRkxWU3hUUVVGeVFqdEJRVU5FTEV0QlRrMHNUVUZOUVR0QlFVTk1PMEZCUTBGT0xGVkJRVWxKTEZkQlFVb3NSMEZCYTBKSExGbEJRVmxRTEVkQlFWb3NSVUZCYVVKS0xFdEJRVXRSTEZkQlFYUkNMRVZCUVcxRFVDeFBRVUZQVHl4WFFVRXhReXhEUVVGc1FqdEJRVU5CU2l4VlFVRkpSU3hYUVVGS0xFZEJRV3RDU3l4WlFVRlpVQ3hIUVVGYUxFVkJRV2xDU2l4TFFVRkxUU3hYUVVGMFFpeEZRVUZ0UTB3c1QwRkJUMHNzVjBGQk1VTXNRMEZCYkVJN1FVRkRRVVlzVlVGQlNVc3NVMEZCU2l4SFFVRm5Ra1VzV1VGQldWQXNSMEZCV2l4RlFVRnBRa29zUzBGQlMxTXNVMEZCZEVJc1JVRkJhVU5TTEU5QlFVOVJMRk5CUVhoRExFTkJRV2hDTzBGQlEwRk1MRlZCUVVsTkxGTkJRVW9zUjBGQlowSkRMRmxCUVZsUUxFZEJRVm9zUlVGQmFVSktMRXRCUVV0VkxGTkJRWFJDTEVWQlFXbERWQ3hQUVVGUFV5eFRRVUY0UXl4RFFVRm9RanRCUVVORU8wRkJRMFk3TzBGQlJVUk9MRTFCUVVsUkxFdEJRVW9zUjBGQldTeEZRVUZhT3p0QlFVVkJMRTFCUVVsRExGbEJRVmtzUTBGQmFFSTdRVUZCUVN4TlFVTkpReXhqUVVGakxFTkJSR3hDTzBGQlFVRXNUVUZGU1VNc1lVRkJZU3hEUVVacVFqdEJRVUZCTEUxQlIwbERMR1ZCUVdVc1EwRklia0k3TzBGQlMwRXNVMEZCVDBnc1dVRkJXV0lzUzBGQlMxa3NTMEZCVEN4RFFVRlhTeXhOUVVGMlFpeEpRVUZwUTBnc1kwRkJZMklzVDBGQlQxY3NTMEZCVUN4RFFVRmhTeXhOUVVGdVJTeEZRVUV5UlR0QlFVTjZSU3hSUVVGSlF5eGpRVUZqYkVJc1MwRkJTMWtzUzBGQlRDeERRVUZYUXl4VFFVRllMRXRCUVhsQ0xFVkJRVU5OTEZWQlFWVkRMRkZCUVZnc1JVRkJNME03UVVGQlFTeFJRVU5KUXl4blFrRkJaMEp3UWl4UFFVRlBWeXhMUVVGUUxFTkJRV0ZGTEZkQlFXSXNTMEZCTmtJc1JVRkJRMHNzVlVGQlZVTXNVVUZCV0N4RlFVUnFSRHM3UVVGSFFTeFJRVUZKUlN4WFFVRlhTaXhYUVVGWUxFVkJRWGRDUnl4aFFVRjRRaXhEUVVGS0xFVkJRVFJETzBGQlF6RkRPMEZCUTBGcVFpeFZRVUZKVVN4TFFVRktMRU5CUVZWWExFbEJRVllzUTBGQlpVTXNWVUZCVlU0c1YwRkJWaXhGUVVGMVFrZ3NWVUZCZGtJc1EwRkJaanRCUVVOQlJqdEJRVU5CUnl4elFrRkJaMEpGTEZsQlFWbHdRaXhSUVVGYUxFZEJRWFZDYjBJc1dVRkJXWEpDTEZGQlFXNUVPMEZCUTBRc1MwRk1SQ3hOUVV0UExFbEJRVWw1UWl4WFFVRlhSQ3hoUVVGWUxFVkJRVEJDU0N4WFFVRXhRaXhEUVVGS0xFVkJRVFJETzBGQlEycEVPMEZCUTBGa0xGVkJRVWxSTEV0QlFVb3NRMEZCVlZjc1NVRkJWaXhEUVVGbFF5eFZRVUZWU0N4aFFVRldMRVZCUVhsQ1RDeFpRVUY2UWl4RFFVRm1PMEZCUTBGR08wRkJRMEZETEc5Q1FVRmpUU3hqUVVGamRrSXNVVUZCWkN4SFFVRjVRblZDTEdOQlFXTjRRaXhSUVVGeVJEdEJRVU5FTEV0QlRFMHNUVUZMUVR0QlFVTk1PMEZCUTBFc1ZVRkJTVFJDTEdGQlFXRTdRVUZEWms0c2EwSkJRVlZQTEV0QlFVdERMRWRCUVV3c1EwRkJVMVFzV1VGQldVTXNVVUZCY2tJc1JVRkJLMEpGTEdOQlFXTkdMRkZCUVRkRExFTkJSRXM3UVVGRlpuUkNMR3RDUVVGVkxFTkJSa3M3UVVGSFppdENMR3RDUVVGVlJpeExRVUZMUXl4SFFVRk1MRU5CUVZOVUxGbEJRVmxWTEZGQlFWb3NSMEZCZFVKaUxGVkJRV2hETEVWQlFUUkRUU3hqUVVGalJpeFJRVUZrTEVkQlFYbENTQ3haUVVGeVJTeERRVWhMTzBGQlNXWnNRaXhyUWtGQlZTeERRVXBMTzBGQlMyWkdMR1ZCUVU4N1FVRk1VU3hQUVVGcVFqdEJRVTlCYVVNc2FVSkJRVmRLTEZWQlFWZ3NSVUZCZFVKUUxGbEJRVmxETEZGQlFXNURMRVZCUVRaRFJDeFpRVUZaZEVJc1MwRkJla1FzUlVGQlowVjVRaXhqUVVGalJpeFJRVUU1UlN4RlFVRjNSa1VzWTBGQlkzcENMRXRCUVhSSE8wRkJRMEZyUWp0QlFVTkJSRHM3UVVGRlFWUXNWVUZCU1ZFc1MwRkJTaXhEUVVGVlZ5eEpRVUZXTEVOQlFXVkZMRlZCUVdZN1FVRkRSRHRCUVVOR096dEJRVVZFTEZOQlFVOXlRaXhIUVVGUU8wRkJRMFE3TzBGQlJVUXNVMEZCVTBRc1UwRkJWQ3hEUVVGdFFqSkNMRXRCUVc1Q0xFVkJRVEJDTlVJc1NVRkJNVUlzUlVGQlowTTdRVUZET1VJc1RVRkJTU3hQUVVGUE5FSXNTMEZCVUN4TFFVRnBRaXhSUVVGeVFpeEZRVUVyUWp0QlFVTTNRaXhSUVVGSkxFOUJRVTlETEVsQlFWQXNRMEZCV1VRc1MwRkJXaXhMUVVGMVFpeFhRVUZYUXl4SlFVRllMRU5CUVdkQ1JDeExRVUZvUWl4RFFVRXpRaXhGUVVGdlJEdEJRVU5zUkN4aFFVRlBMSGxGUVVGWFFTeExRVUZZTEVWQlFXdENMRU5CUVd4Q08wRkJRVkE3UVVGRFJEczdRVUZGUkN4UlFVRkpMRU5CUVVNMVFpeEpRVUZNTEVWQlFWYzdRVUZEVkN4WlFVRk5MRWxCUVVrNFFpeExRVUZLTEVOQlFWVXNhMFJCUVZZc1EwRkJUanRCUVVORU8wRkJRMFFzVjBGQlR5d3JSVUZCWjBKcVF5eFRRVUZvUWl4RlFVRXlRa0VzVTBGQk0wSXNSVUZCYzBOSExFbEJRWFJETEVWQlFUUkRORUlzUzBGQk5VTTdRVUZCVUR0QlFVTkVPenRCUVVWRUxGTkJRVTlCTEV0QlFWQTdRVUZEUkRzN1FVRkZSQ3hUUVVGVGRrSXNaVUZCVkN4RFFVRjVRakJDTEV0QlFYcENMRVZCUVdkRE8wRkJRemxDTEZOQlFVOUJMRTFCUVUwelFpeFhRVUZPTEVsQlFYRkNNa0lzVFVGQlRUTkNMRmRCUVU0c1MwRkJjMEl5UWl4TlFVRk5la0lzVjBGQmVFUTdRVUZEUkRzN1FVRkZSQ3hUUVVGVFJ5eFhRVUZVTEVOQlFYRkNUaXhMUVVGeVFpeEZRVUUwUWt3c1NVRkJOVUlzUlVGQmEwTkRMRTFCUVd4RExFVkJRVEJETzBGQlEzaERMRTFCUVVsRUxGTkJRVk5ETEUxQlFXSXNSVUZCY1VJN1FVRkRia0lzVjBGQlQwUXNTVUZCVUR0QlFVTkVMRWRCUmtRc1RVRkZUenRCUVVOTVN5eFZRVUZOTmtJc1VVRkJUaXhIUVVGcFFpeEpRVUZxUWp0QlFVTkJMRmRCUVU4c1JVRkJRMnhETEZWQlFVUXNSVUZCVDBNc1kwRkJVQ3hGUVVGUU8wRkJRMFE3UVVGRFJqczdRVUZGUkN4VFFVRlRjVUlzVlVGQlZDeERRVUZ2UWxNc1NVRkJjRUlzUlVGQk1FSkpMRXRCUVRGQ0xFVkJRV2xETzBGQlF5OUNMRk5CUVU5S0xFdEJRVXRhTEZGQlFVd3NSMEZCWjBKblFpeE5RVUZOYUVJc1VVRkJkRUlzU1VGRFJGa3NTMEZCUzFvc1VVRkJUQ3hIUVVGblFsa3NTMEZCUzJ4RExGRkJRWFJDTEVkQlFXdERjME1zVFVGQlRXaENMRkZCUkRkRE8wRkJSVVE3TzBGQlJVUXNVMEZCVTBzc1UwRkJWQ3hEUVVGdFFqbENMRWxCUVc1Q0xFVkJRWGxDTUVNc1RVRkJla0lzUlVGQmFVTTdRVUZETDBJc1UwRkJUenRCUVVOTWFrSXNZMEZCVlhwQ0xFdEJRVXQ1UWl4UlFVUldMRVZCUTI5Q2RFSXNWVUZCVlVnc1MwRkJTMGNzVVVGRWJrTTdRVUZGVEN0Q0xHTkJRVlZzUXl4TFFVRkxhME1zVVVGQlRDeEhRVUZuUWxFc1RVRkdja0lzUlVGRk5rSjBReXhWUVVGVlNpeExRVUZMU1N4UlFVWTFRenRCUVVkTVJpeFhRVUZQUml4TFFVRkxSVHRCUVVoUUxFZEJRVkE3UVVGTFJEczdRVUZGUkN4VFFVRlRhVU1zVlVGQlZDeERRVUZ2UW01RExFbEJRWEJDTEVWQlFUQkNjVUlzVlVGQk1VSXNSVUZCYzBOelFpeFRRVUYwUXl4RlFVRnBSRU1zVjBGQmFrUXNSVUZCT0VSRExGVkJRVGxFTEVWQlFUQkZPMEZCUTNoRk8wRkJRMEU3UVVGRFFTeE5RVUZKZGtNc1QwRkJUeXhGUVVGRGIwTXNVVUZCVVhKQ0xGVkJRVlFzUlVGQmNVSnVRaXhQUVVGUGVVTXNVMEZCTlVJc1JVRkJkVU5vUXl4UFFVRlBMRU5CUVRsRExFVkJRVmc3UVVGQlFTeE5RVU5KYlVNc1VVRkJVU3hGUVVGRFNpeFJRVUZSUlN4WFFVRlVMRVZCUVhOQ01VTXNUMEZCVHpKRExGVkJRVGRDTEVWQlFYbERiRU1zVDBGQlR5eERRVUZvUkN4RlFVUmFPenRCUVVkQk8wRkJRMEZ2UXl4blFrRkJZeTlETEVsQlFXUXNSVUZCYjBKTkxFbEJRWEJDTEVWQlFUQkNkME1zUzBGQk1VSTdRVUZEUVVNc1owSkJRV012UXl4SlFVRmtMRVZCUVc5Q09FTXNTMEZCY0VJc1JVRkJNa0o0UXl4SlFVRXpRanM3UVVGRlFUdEJRVU5CTEZOQlFVOUJMRXRCUVV0TExFdEJRVXdzUjBGQllVd3NTMEZCUzBvc1MwRkJUQ3hEUVVGWGNVSXNUVUZCZUVJc1NVRkJhME4xUWl4TlFVRk5ia01zUzBGQlRpeEhRVUZqYlVNc1RVRkJUVFZETEV0QlFVNHNRMEZCV1hGQ0xFMUJRVzVGTEVWQlFUSkZPMEZCUTNwRkxGRkJRVWxETEdOQlFXTnNRaXhMUVVGTFNpeExRVUZNTEVOQlFWZEpMRXRCUVV0TExFdEJRV2hDTEVOQlFXeENPMEZCUVVFc1VVRkRTWEZETEdWQlFXVkdMRTFCUVUwMVF5eExRVUZPTEVOQlFWazBReXhOUVVGTmJrTXNTMEZCYkVJc1EwRkVia0k3TzBGQlIwRXNVVUZCU1N4RFFVRkRZU3haUVVGWkxFTkJRVm9zVFVGQmJVSXNSMEZCYmtJc1NVRkJNRUpCTEZsQlFWa3NRMEZCV2l4TlFVRnRRaXhIUVVFNVF5eE5RVU5KZDBJc1lVRkJZU3hEUVVGaUxFMUJRVzlDTEVkQlFYQkNMRWxCUVRKQ1FTeGhRVUZoTEVOQlFXSXNUVUZCYjBJc1IwRkVia1FzUTBGQlNpeEZRVU0yUkR0QlFVTXpSRHRCUVVOQlF5eHRRa0ZCWVdwRUxFbEJRV0lzUlVGQmJVSk5MRWxCUVc1Q0xFVkJRWGxDZDBNc1MwRkJla0k3UVVGRFJDeExRVXBFTEUxQlNVOHNTVUZCU1hSQ0xGbEJRVmtzUTBGQldpeE5RVUZ0UWl4SFFVRnVRaXhKUVVFd1FuZENMR0ZCUVdFc1EwRkJZaXhOUVVGdlFpeEhRVUZzUkN4RlFVRjFSRHRCUVVGQk96dEJRVUZCTERoQ1FVTTFSRHRCUVVOQkxEQkZRVUZMT1VNc1MwRkJUQ3hGUVVGWE1rSXNTVUZCV0N3MFRFRkJiMEp4UWl4alFVRmpOVU1zU1VGQlpDeERRVUZ3UWp0QlFVTkVMRXRCU0Uwc1RVRkhRU3hKUVVGSk1FTXNZVUZCWVN4RFFVRmlMRTFCUVc5Q0xFZEJRWEJDTEVsQlFUSkNlRUlzV1VGQldTeERRVUZhTEUxQlFXMUNMRWRCUVd4RUxFVkJRWFZFTzBGQlFVRTdPMEZCUVVFc09FSkJRelZFTzBGQlEwRXNNa1ZCUVV0MFFpeExRVUZNTEVWQlFWY3lRaXhKUVVGWUxEWk1RVUZ2UW5GQ0xHTkJRV05LTEV0QlFXUXNRMEZCY0VJN1FVRkRSQ3hMUVVoTkxFMUJSMEVzU1VGQlNYUkNMRmxCUVZrc1EwRkJXaXhOUVVGdFFpeEhRVUZ1UWl4SlFVRXdRbmRDTEdGQlFXRXNRMEZCWWl4TlFVRnZRaXhIUVVGc1JDeEZRVUYxUkR0QlFVTTFSRHRCUVVOQlJ5eGpRVUZSYmtRc1NVRkJVaXhGUVVGalRTeEpRVUZrTEVWQlFXOUNkME1zUzBGQmNFSTdRVUZEUkN4TFFVaE5MRTFCUjBFc1NVRkJTVVVzWVVGQllTeERRVUZpTEUxQlFXOUNMRWRCUVhCQ0xFbEJRVEpDZUVJc1dVRkJXU3hEUVVGYUxFMUJRVzFDTEVkQlFXeEVMRVZCUVhWRU8wRkJRelZFTzBGQlEwRXlRaXhqUVVGUmJrUXNTVUZCVWl4RlFVRmpPRU1zUzBGQlpDeEZRVUZ4UW5oRExFbEJRWEpDTEVWQlFUSkNMRWxCUVROQ08wRkJRMFFzUzBGSVRTeE5RVWRCTEVsQlFVbHJRaXhuUWtGQlowSjNRaXhaUVVGd1FpeEZRVUZyUXp0QlFVTjJRenRCUVVOQmFFUXNWMEZCUzBVc1MwRkJUQ3hEUVVGWE1rSXNTVUZCV0N4RFFVRm5Ra3dzVjBGQmFFSTdRVUZEUVd4Q0xGZEJRVXRMTEV0QlFVdzdRVUZEUVcxRExGbEJRVTF1UXl4TFFVRk9PMEZCUTBRc1MwRk1UU3hOUVV0Qk8wRkJRMHc3UVVGRFFUWkNMR1ZCUVZONFF5eEpRVUZVTEVWQlFXVnJSQ3hqUVVGak5VTXNTVUZCWkN4RFFVRm1MRVZCUVc5RE5FTXNZMEZCWTBvc1MwRkJaQ3hEUVVGd1F6dEJRVU5FTzBGQlEwWTdPMEZCUlVRN1FVRkRRVTBzYVVKQlFXVndSQ3hKUVVGbUxFVkJRWEZDVFN4SlFVRnlRanRCUVVOQk9FTXNhVUpCUVdWd1JDeEpRVUZtTEVWQlFYRkNPRU1zUzBGQmNrSTdPMEZCUlVGb1JDeG5Ra0ZCWTBVc1NVRkJaRHRCUVVORU96dEJRVVZFTEZOQlFWTnBSQ3haUVVGVUxFTkJRWE5DYWtRc1NVRkJkRUlzUlVGQk5FSk5MRWxCUVRWQ0xFVkJRV3REZDBNc1MwRkJiRU1zUlVGQmVVTTdRVUZEZGtNc1RVRkJTVThzV1VGQldVZ3NZMEZCWXpWRExFbEJRV1FzUTBGQmFFSTdRVUZCUVN4TlFVTkpaMFFzWlVGQlpVb3NZMEZCWTBvc1MwRkJaQ3hEUVVSdVFqczdRVUZIUVN4TlFVRkpVeXhYUVVGWFJpeFRRVUZZTEV0QlFYbENSU3hYUVVGWFJDeFpRVUZZTEVOQlFUZENMRVZCUVhWRU8wRkJRM0pFTzBGQlEwRXNVVUZCU1N3NFJVRkJaMEpFTEZOQlFXaENMRVZCUVRKQ1F5eFpRVUV6UWl4TFFVTkhSU3h0UWtGQmJVSldMRXRCUVc1Q0xFVkJRVEJDVHl4VFFVRXhRaXhGUVVGeFEwRXNWVUZCVlRsQ0xFMUJRVllzUjBGQmJVSXJRaXhoUVVGaEwwSXNUVUZCY2tVc1EwRkVVQ3hGUVVOeFJqdEJRVUZCT3p0QlFVRkJMRFpDUVVOdVJpeHpSVUZCUzNKQ0xFdEJRVXdzUlVGQlZ6SkNMRWxCUVZnc05reEJRVzlDZDBJc1UwRkJjRUk3UVVGRFFUdEJRVU5FTEV0QlNrUXNUVUZKVHl4SlFVRkpMRGhGUVVGblFrTXNXVUZCYUVJc1JVRkJPRUpFTEZOQlFUbENMRXRCUTBwSExHMUNRVUZ0UW14RUxFbEJRVzVDTEVWQlFYbENaMFFzV1VGQmVrSXNSVUZCZFVOQkxHRkJRV0V2UWl4TlFVRmlMRWRCUVhOQ09FSXNWVUZCVlRsQ0xFMUJRWFpGTEVOQlJFRXNSVUZEWjBZN1FVRkJRVHM3UVVGQlFTdzJRa0ZEY2tZc2MwVkJRVXR5UWl4TFFVRk1MRVZCUVZjeVFpeEpRVUZZTERaTVFVRnZRbmxDTEZsQlFYQkNPMEZCUTBFN1FVRkRSRHRCUVVOR0xFZEJXRVFzVFVGWFR5eEpRVUZKTEhsRlFVRlhSQ3hUUVVGWUxFVkJRWE5DUXl4WlFVRjBRaXhEUVVGS0xFVkJRWGxETzBGQlFVRTdPMEZCUVVFc01rSkJRemxETEhORlFVRkxjRVFzUzBGQlRDeEZRVUZYTWtJc1NVRkJXQ3cyVEVGQmIwSjNRaXhUUVVGd1FqdEJRVU5CTzBGQlEwUTdPMEZCUlVSaUxGZEJRVk40UXl4SlFVRlVMRVZCUVdWeFJDeFRRVUZtTEVWQlFUQkNReXhaUVVFeFFqdEJRVU5FT3p0QlFVVkVMRk5CUVZOSUxFOUJRVlFzUTBGQmFVSnVSQ3hKUVVGcVFpeEZRVUYxUWswc1NVRkJka0lzUlVGQk5rSjNReXhMUVVFM1FpeEZRVUZ2UTFjc1NVRkJjRU1zUlVGQk1FTTdRVUZEZUVNc1RVRkJTVW9zV1VGQldVZ3NZMEZCWXpWRExFbEJRV1FzUTBGQmFFSTdRVUZCUVN4TlFVTkpaMFFzWlVGQlpVa3NaVUZCWlZvc1MwRkJaaXhGUVVGelFrOHNVMEZCZEVJc1EwRkVia0k3UVVGRlFTeE5RVUZKUXl4aFFVRmhTeXhOUVVGcVFpeEZRVUY1UWp0QlFVRkJPenRCUVVGQkxESkNRVU4yUWl4elJVRkJTM3BFTEV0QlFVd3NSVUZCVnpKQ0xFbEJRVmdzTmt4QlFXOUNlVUlzWVVGQllVc3NUVUZCYWtNN1FVRkRSQ3hIUVVaRUxFMUJSVTg3UVVGRFRHNUNMR0ZCUVZONFF5eEpRVUZVTEVWQlFXVjVSQ3hQUVVGUFNDeFpRVUZRTEVkQlFYTkNSQ3hUUVVGeVF5eEZRVUZuUkVrc1QwRkJUMG9zVTBGQlVDeEhRVUZ0UWtNc1dVRkJia1U3UVVGRFJEdEJRVU5HT3p0QlFVVkVMRk5CUVZOa0xGRkJRVlFzUTBGQmEwSjRReXhKUVVGc1FpeEZRVUYzUWswc1NVRkJlRUlzUlVGQk9FSjNReXhMUVVFNVFpeEZRVUZ4UXp0QlFVTnVRemxETEU5QlFVdDNReXhSUVVGTUxFZEJRV2RDTEVsQlFXaENPMEZCUTBGNFF5eFBRVUZMUlN4TFFVRk1MRU5CUVZjeVFpeEpRVUZZTEVOQlFXZENPMEZCUTJSWExHTkJRVlVzU1VGRVNUdEJRVVZrYkVNc1ZVRkJUVUVzU1VGR1VUdEJRVWRrUXl4WlFVRlJkVU03UVVGSVRTeEhRVUZvUWp0QlFVdEVPenRCUVVWRUxGTkJRVk5ETEdGQlFWUXNRMEZCZFVJdlF5eEpRVUYyUWl4RlFVRTJRalJFTEUxQlFUZENMRVZCUVhGRFpDeExRVUZ5UXl4RlFVRTBRenRCUVVNeFF5eFRRVUZQWXl4UFFVRlBiRUlzVFVGQlVDeEhRVUZuUWtrc1RVRkJUVW9zVFVGQmRFSXNTVUZCWjBOclFpeFBRVUZQYWtRc1MwRkJVQ3hIUVVGbGFVUXNUMEZCVHpGRUxFdEJRVkFzUTBGQllYRkNMRTFCUVc1RkxFVkJRVEpGTzBGQlEzcEZMRkZCUVVselF5eFBRVUZQUkN4UFFVRlBNVVFzUzBGQlVDeERRVUZoTUVRc1QwRkJUMnBFTEV0QlFWQXNSVUZCWWl4RFFVRllPMEZCUTBGWUxGTkJRVXRGTEV0QlFVd3NRMEZCVnpKQ0xFbEJRVmdzUTBGQlowSm5ReXhKUVVGb1FqdEJRVU5CUkN4WFFVRlBiRUlzVFVGQlVEdEJRVU5FTzBGQlEwWTdRVUZEUkN4VFFVRlRWU3hqUVVGVUxFTkJRWGRDY0VRc1NVRkJlRUlzUlVGQk9FSTBSQ3hOUVVFNVFpeEZRVUZ6UXp0QlFVTndReXhUUVVGUFFTeFBRVUZQYWtRc1MwRkJVQ3hIUVVGbGFVUXNUMEZCVHpGRUxFdEJRVkFzUTBGQllYRkNMRTFCUVc1RExFVkJRVEpETzBGQlEzcERMRkZCUVVselF5eFBRVUZQUkN4UFFVRlBNVVFzUzBGQlVDeERRVUZoTUVRc1QwRkJUMnBFTEV0QlFWQXNSVUZCWWl4RFFVRllPMEZCUTBGWUxGTkJRVXRGTEV0QlFVd3NRMEZCVnpKQ0xFbEJRVmdzUTBGQlowSm5ReXhKUVVGb1FqdEJRVU5FTzBGQlEwWTdPMEZCUlVRc1UwRkJVMWdzWVVGQlZDeERRVUYxUWxrc1MwRkJka0lzUlVGQk9FSTdRVUZETlVJc1RVRkJTWEJFTEUxQlFVMHNSVUZCVmp0QlFVRkJMRTFCUTBseFJDeFpRVUZaUkN4TlFVRk5OVVFzUzBGQlRpeERRVUZaTkVRc1RVRkJUVzVFTEV0QlFXeENMRVZCUVhsQ0xFTkJRWHBDTEVOQlJHaENPMEZCUlVFc1UwRkJUMjFFTEUxQlFVMXVSQ3hMUVVGT0xFZEJRV050UkN4TlFVRk5OVVFzUzBGQlRpeERRVUZaY1VJc1RVRkJha01zUlVGQmVVTTdRVUZEZGtNc1VVRkJTWE5ETEU5QlFVOURMRTFCUVUwMVJDeExRVUZPTEVOQlFWazBSQ3hOUVVGTmJrUXNTMEZCYkVJc1EwRkJXRHM3UVVGRlFUdEJRVU5CTEZGQlFVbHZSQ3hqUVVGakxFZEJRV1FzU1VGQmNVSkdMRXRCUVVzc1EwRkJUQ3hOUVVGWkxFZEJRWEpETEVWQlFUQkRPMEZCUTNoRFJTeHJRa0ZCV1N4SFFVRmFPMEZCUTBRN08wRkJSVVFzVVVGQlNVRXNZMEZCWTBZc1MwRkJTeXhEUVVGTUxFTkJRV3hDTEVWQlFUSkNPMEZCUTNwQ2JrUXNWVUZCU1cxQ0xFbEJRVW9zUTBGQlUyZERMRWxCUVZRN1FVRkRRVU1zV1VGQlRXNUVMRXRCUVU0N1FVRkRSQ3hMUVVoRUxFMUJSMDg3UVVGRFREdEJRVU5FTzBGQlEwWTdPMEZCUlVRc1UwRkJUMFFzUjBGQlVEdEJRVU5FTzBGQlEwUXNVMEZCVTJkRUxHTkJRVlFzUTBGQmQwSkpMRXRCUVhoQ0xFVkJRU3RDUlN4WlFVRXZRaXhGUVVFMlF6dEJRVU16UXl4TlFVRkpReXhWUVVGVkxFVkJRV1E3UVVGQlFTeE5RVU5KVGl4VFFVRlRMRVZCUkdJN1FVRkJRU3hOUVVWSlR5eGhRVUZoTEVOQlJtcENPMEZCUVVFc1RVRkhTVU1zYVVKQlFXbENMRXRCU0hKQ08wRkJRVUVzVFVGSlNVTXNZVUZCWVN4TFFVcHFRanRCUVV0QkxGTkJRVTlHTEdGQlFXRkdMR0ZCUVdGNlF5eE5RVUV4UWl4SlFVTkZkVU1zVFVGQlRXNUVMRXRCUVU0c1IwRkJZMjFFTEUxQlFVMDFSQ3hMUVVGT0xFTkJRVmx4UWl4TlFVUnVReXhGUVVNeVF6dEJRVU42UXl4UlFVRkpPRU1zVTBGQlUxQXNUVUZCVFRWRUxFdEJRVTRzUTBGQldUUkVMRTFCUVUxdVJDeExRVUZzUWl4RFFVRmlPMEZCUVVFc1VVRkRTVEpFTEZGQlFWRk9MR0ZCUVdGRkxGVkJRV0lzUTBGRVdqczdRVUZIUVR0QlFVTkJMRkZCUVVsSkxFMUJRVTBzUTBGQlRpeE5RVUZoTEVkQlFXcENMRVZCUVhOQ08wRkJRM0JDTzBGQlEwUTdPMEZCUlVSSUxIRkNRVUZwUWtFc2EwSkJRV3RDUlN4UFFVRlBMRU5CUVZBc1RVRkJZeXhIUVVGcVJEczdRVUZGUVZZc1YwRkJUemxDTEVsQlFWQXNRMEZCV1hsRExFdEJRVm83UVVGRFFVbzdPMEZCUlVFN1FVRkRRVHRCUVVOQkxGRkJRVWxITEU5QlFVOHNRMEZCVUN4TlFVRmpMRWRCUVd4Q0xFVkJRWFZDTzBGQlEzSkNSQ3h0UWtGQllTeEpRVUZpT3p0QlFVVkJMR0ZCUVU5RExFOUJRVThzUTBGQlVDeE5RVUZqTEVkQlFYSkNMRVZCUVRCQ08wRkJRM2hDU2l4blFrRkJVWEJETEVsQlFWSXNRMEZCWVhkRExFMUJRV0k3UVVGRFFVRXNhVUpCUVZOUUxFMUJRVTAxUkN4TFFVRk9MRU5CUVZrc1JVRkJSVFJFTEUxQlFVMXVSQ3hMUVVGd1FpeERRVUZVTzBGQlEwUTdRVUZEUmpzN1FVRkZSQ3hSUVVGSk1rUXNUVUZCVFVNc1RVRkJUaXhEUVVGaExFTkJRV0lzVFVGQmIwSkdMRTlCUVU5RkxFMUJRVkFzUTBGQll5eERRVUZrTEVOQlFYaENMRVZCUVRCRE8wRkJRM2hEVGl4alFVRlJjRU1zU1VGQlVpeERRVUZoZDBNc1RVRkJZanRCUVVOQlVDeFpRVUZOYmtRc1MwRkJUanRCUVVORUxFdEJTRVFzVFVGSFR6dEJRVU5NZVVRc2JVSkJRV0VzU1VGQllqdEJRVU5FTzBGQlEwWTdPMEZCUlVRc1RVRkJTU3hEUVVGRFNpeGhRVUZoUlN4VlFVRmlMRXRCUVRSQ0xFVkJRVGRDTEVWQlFXbERMRU5CUVdwRExFMUJRWGRETEVkQlFYaERMRWxCUTBkRExHTkJSRkFzUlVGRGRVSTdRVUZEY2tKRExHbENRVUZoTEVsQlFXSTdRVUZEUkRzN1FVRkZSQ3hOUVVGSlFTeFZRVUZLTEVWQlFXZENPMEZCUTJRc1YwRkJUMGdzVDBGQlVEdEJRVU5FT3p0QlFVVkVMRk5CUVU5RExHRkJRV0ZHTEdGQlFXRjZReXhOUVVGcVF5eEZRVUY1UXp0QlFVTjJRMjlETEZkQlFVODVRaXhKUVVGUUxFTkJRVmx0UXl4aFFVRmhSU3haUVVGaUxFTkJRVm83UVVGRFJEczdRVUZGUkN4VFFVRlBPMEZCUTB4UUxHdENRVVJMTzBGQlJVeE5PMEZCUmtzc1IwRkJVRHRCUVVsRU96dEJRVVZFTEZOQlFWTldMRlZCUVZRc1EwRkJiMEpWTEU5QlFYQkNMRVZCUVRaQ08wRkJRek5DTEZOQlFVOUJMRkZCUVZGUExFMUJRVklzUTBGQlpTeFZRVUZUUXl4SlFVRlVMRVZCUVdWS0xFMUJRV1lzUlVGQmRVSTdRVUZETTBNc1YwRkJUMGtzVVVGQlVVb3NUMEZCVHl4RFFVRlFMRTFCUVdNc1IwRkJOMEk3UVVGRFJDeEhRVVpOTEVWQlJVb3NTVUZHU1N4RFFVRlFPMEZCUjBRN1FVRkRSQ3hUUVVGVFlpeHJRa0ZCVkN4RFFVRTBRazBzUzBGQk5VSXNSVUZCYlVOWkxHRkJRVzVETEVWQlFXdEVReXhMUVVGc1JDeEZRVUY1UkR0QlFVTjJSQ3hQUVVGTExFbEJRVWxETEVsQlFVa3NRMEZCWWl4RlFVRm5Ra0VzU1VGQlNVUXNTMEZCY0VJc1JVRkJNa0pETEVkQlFUTkNMRVZCUVdkRE8wRkJRemxDTEZGQlFVbERMR2RDUVVGblFrZ3NZMEZCWTBFc1kwRkJZMjVFTEUxQlFXUXNSMEZCZFVKdlJDeExRVUYyUWl4SFFVRXJRa01zUTBGQk4wTXNSVUZCWjBSTUxFMUJRV2hFTEVOQlFYVkVMRU5CUVhaRUxFTkJRWEJDTzBGQlEwRXNVVUZCU1ZRc1RVRkJUVFZFTEV0QlFVNHNRMEZCV1RSRUxFMUJRVTF1UkN4TFFVRk9MRWRCUVdOcFJTeERRVUV4UWl4TlFVRnBReXhOUVVGTlF5eGhRVUV6UXl4RlFVRXdSRHRCUVVONFJDeGhRVUZQTEV0QlFWQTdRVUZEUkR0QlFVTkdPenRCUVVWRVppeFJRVUZOYmtRc1MwRkJUaXhKUVVGbFowVXNTMEZCWmp0QlFVTkJMRk5CUVU4c1NVRkJVRHRCUVVORU96dEJRVVZFTEZOQlFWTXhSU3h0UWtGQlZDeERRVUUyUWtNc1MwRkJOMElzUlVGQmIwTTdRVUZEYkVNc1RVRkJTVU1zVjBGQlZ5eERRVUZtTzBGQlEwRXNUVUZCU1VNc1YwRkJWeXhEUVVGbU96dEJRVVZCUml4UlFVRk5ORVVzVDBGQlRpeERRVUZqTEZWQlFWTnFRaXhKUVVGVUxFVkJRV1U3UVVGRE0wSXNVVUZCU1N4UFFVRlBRU3hKUVVGUUxFdEJRV2RDTEZGQlFYQkNMRVZCUVRoQ08wRkJRelZDTEZWQlFVbHJRaXhWUVVGVk9VVXNiMEpCUVc5Q05FUXNTMEZCUzNaRUxFbEJRWHBDTEVOQlFXUTdRVUZEUVN4VlFVRkpNRVVzWVVGQllTOUZMRzlDUVVGdlFqUkVMRXRCUVV0MFJDeE5RVUY2UWl4RFFVRnFRanM3UVVGRlFTeFZRVUZKU2l4aFFVRmhSU3hUUVVGcVFpeEZRVUUwUWp0QlFVTXhRaXhaUVVGSk1FVXNVVUZCVVRWRkxGRkJRVklzUzBGQmNVSTJSU3hYUVVGWE4wVXNVVUZCY0VNc1JVRkJPRU03UVVGRE5VTkJMSE5DUVVGWk5FVXNVVUZCVVRWRkxGRkJRWEJDTzBGQlEwUXNVMEZHUkN4TlFVVlBPMEZCUTB4QkxIRkNRVUZYUlN4VFFVRllPMEZCUTBRN1FVRkRSanM3UVVGRlJDeFZRVUZKUkN4aFFVRmhReXhUUVVGcVFpeEZRVUUwUWp0QlFVTXhRaXhaUVVGSk1FVXNVVUZCVVRORkxGRkJRVklzUzBGQmNVSTBSU3hYUVVGWE5VVXNVVUZCY0VNc1JVRkJPRU03UVVGRE5VTkJMSE5DUVVGWk1rVXNVVUZCVVRORkxGRkJRWEJDTzBGQlEwUXNVMEZHUkN4TlFVVlBPMEZCUTB4QkxIRkNRVUZYUXl4VFFVRllPMEZCUTBRN1FVRkRSanRCUVVOR0xFdEJia0pFTEUxQmJVSlBPMEZCUTB3c1ZVRkJTVVFzWVVGQllVTXNVMEZCWWl4TFFVRXlRbmRFTEV0QlFVc3NRMEZCVEN4TlFVRlpMRWRCUVZvc1NVRkJiVUpCTEV0QlFVc3NRMEZCVEN4TlFVRlpMRWRCUVRGRUxFTkJRVW9zUlVGQmIwVTdRVUZEYkVWNlJEdEJRVU5FTzBGQlEwUXNWVUZCU1VRc1lVRkJZVVVzVTBGQllpeExRVUV5UW5kRUxFdEJRVXNzUTBGQlRDeE5RVUZaTEVkQlFWb3NTVUZCYlVKQkxFdEJRVXNzUTBGQlRDeE5RVUZaTEVkQlFURkVMRU5CUVVvc1JVRkJiMFU3UVVGRGJFVXhSRHRCUVVORU8wRkJRMFk3UVVGRFJpeEhRVFZDUkRzN1FVRTRRa0VzVTBGQlR5eEZRVUZEUVN4clFrRkJSQ3hGUVVGWFF5eHJRa0ZCV0N4RlFVRlFPMEZCUTBRaUxDSm1hV3hsSWpvaWJXVnlaMlV1YW5NaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SnBiWEJ2Y25RZ2UzTjBjblZqZEhWeVpXUlFZWFJqYUgwZ1puSnZiU0FuTGk5amNtVmhkR1VuTzF4dWFXMXdiM0owSUh0d1lYSnpaVkJoZEdOb2ZTQm1jbTl0SUNjdUwzQmhjbk5sSnp0Y2JseHVhVzF3YjNKMElIdGhjbkpoZVVWeGRXRnNMQ0JoY25KaGVWTjBZWEowYzFkcGRHaDlJR1p5YjIwZ0p5NHVMM1YwYVd3dllYSnlZWGtuTzF4dVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1kyRnNZMHhwYm1WRGIzVnVkQ2hvZFc1cktTQjdYRzRnSUdOdmJuTjBJSHR2YkdSTWFXNWxjeXdnYm1WM1RHbHVaWE45SUQwZ1kyRnNZMDlzWkU1bGQweHBibVZEYjNWdWRDaG9kVzVyTG14cGJtVnpLVHRjYmx4dUlDQnBaaUFvYjJ4a1RHbHVaWE1nSVQwOUlIVnVaR1ZtYVc1bFpDa2dlMXh1SUNBZ0lHaDFibXN1YjJ4a1RHbHVaWE1nUFNCdmJHUk1hVzVsY3p0Y2JpQWdmU0JsYkhObElIdGNiaUFnSUNCa1pXeGxkR1VnYUhWdWF5NXZiR1JNYVc1bGN6dGNiaUFnZlZ4dVhHNGdJR2xtSUNodVpYZE1hVzVsY3lBaFBUMGdkVzVrWldacGJtVmtLU0I3WEc0Z0lDQWdhSFZ1YXk1dVpYZE1hVzVsY3lBOUlHNWxkMHhwYm1Wek8xeHVJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lHUmxiR1YwWlNCb2RXNXJMbTVsZDB4cGJtVnpPMXh1SUNCOVhHNTlYRzVjYm1WNGNHOXlkQ0JtZFc1amRHbHZiaUJ0WlhKblpTaHRhVzVsTENCMGFHVnBjbk1zSUdKaGMyVXBJSHRjYmlBZ2JXbHVaU0E5SUd4dllXUlFZWFJqYUNodGFXNWxMQ0JpWVhObEtUdGNiaUFnZEdobGFYSnpJRDBnYkc5aFpGQmhkR05vS0hSb1pXbHljeXdnWW1GelpTazdYRzVjYmlBZ2JHVjBJSEpsZENBOUlIdDlPMXh1WEc0Z0lDOHZJRVp2Y2lCcGJtUmxlQ0IzWlNCcWRYTjBJR3hsZENCcGRDQndZWE56SUhSb2NtOTFaMmdnWVhNZ2FYUWdaRzlsYzI0bmRDQm9ZWFpsSUdGdWVTQnVaV05sYzNOaGNua2diV1ZoYm1sdVp5NWNiaUFnTHk4Z1RHVmhkbWx1WnlCellXNXBkSGtnWTJobFkydHpJRzl1SUhSb2FYTWdkRzhnZEdobElFRlFTU0JqYjI1emRXMWxjaUIwYUdGMElHMWhlU0JyYm05M0lHMXZjbVVnWVdKdmRYUWdkR2hsWEc0Z0lDOHZJRzFsWVc1cGJtY2dhVzRnZEdobGFYSWdiM2R1SUdOdmJuUmxlSFF1WEc0Z0lHbG1JQ2h0YVc1bExtbHVaR1Y0SUh4OElIUm9aV2x5Y3k1cGJtUmxlQ2tnZTF4dUlDQWdJSEpsZEM1cGJtUmxlQ0E5SUcxcGJtVXVhVzVrWlhnZ2ZId2dkR2hsYVhKekxtbHVaR1Y0TzF4dUlDQjlYRzVjYmlBZ2FXWWdLRzFwYm1VdWJtVjNSbWxzWlU1aGJXVWdmSHdnZEdobGFYSnpMbTVsZDBacGJHVk9ZVzFsS1NCN1hHNGdJQ0FnYVdZZ0tDRm1hV3hsVG1GdFpVTm9ZVzVuWldRb2JXbHVaU2twSUh0Y2JpQWdJQ0FnSUM4dklFNXZJR2hsWVdSbGNpQnZjaUJ1YnlCamFHRnVaMlVnYVc0Z2IzVnljeXdnZFhObElIUm9aV2x5Y3lBb1lXNWtJRzkxY25NZ2FXWWdkR2hsYVhKeklHUnZaWE1nYm05MElHVjRhWE4wS1Z4dUlDQWdJQ0FnY21WMExtOXNaRVpwYkdWT1lXMWxJRDBnZEdobGFYSnpMbTlzWkVacGJHVk9ZVzFsSUh4OElHMXBibVV1YjJ4a1JtbHNaVTVoYldVN1hHNGdJQ0FnSUNCeVpYUXVibVYzUm1sc1pVNWhiV1VnUFNCMGFHVnBjbk11Ym1WM1JtbHNaVTVoYldVZ2ZId2diV2x1WlM1dVpYZEdhV3hsVG1GdFpUdGNiaUFnSUNBZ0lISmxkQzV2YkdSSVpXRmtaWElnUFNCMGFHVnBjbk11YjJ4a1NHVmhaR1Z5SUh4OElHMXBibVV1YjJ4a1NHVmhaR1Z5TzF4dUlDQWdJQ0FnY21WMExtNWxkMGhsWVdSbGNpQTlJSFJvWldseWN5NXVaWGRJWldGa1pYSWdmSHdnYldsdVpTNXVaWGRJWldGa1pYSTdYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDZ2habWxzWlU1aGJXVkRhR0Z1WjJWa0tIUm9aV2x5Y3lrcElIdGNiaUFnSUNBZ0lDOHZJRTV2SUdobFlXUmxjaUJ2Y2lCdWJ5QmphR0Z1WjJVZ2FXNGdkR2hsYVhKekxDQjFjMlVnYjNWeWMxeHVJQ0FnSUNBZ2NtVjBMbTlzWkVacGJHVk9ZVzFsSUQwZ2JXbHVaUzV2YkdSR2FXeGxUbUZ0WlR0Y2JpQWdJQ0FnSUhKbGRDNXVaWGRHYVd4bFRtRnRaU0E5SUcxcGJtVXVibVYzUm1sc1pVNWhiV1U3WEc0Z0lDQWdJQ0J5WlhRdWIyeGtTR1ZoWkdWeUlEMGdiV2x1WlM1dmJHUklaV0ZrWlhJN1hHNGdJQ0FnSUNCeVpYUXVibVYzU0dWaFpHVnlJRDBnYldsdVpTNXVaWGRJWldGa1pYSTdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUM4dklFSnZkR2dnWTJoaGJtZGxaQzR1TGlCbWFXZDFjbVVnYVhRZ2IzVjBYRzRnSUNBZ0lDQnlaWFF1YjJ4a1JtbHNaVTVoYldVZ1BTQnpaV3hsWTNSR2FXVnNaQ2h5WlhRc0lHMXBibVV1YjJ4a1JtbHNaVTVoYldVc0lIUm9aV2x5Y3k1dmJHUkdhV3hsVG1GdFpTazdYRzRnSUNBZ0lDQnlaWFF1Ym1WM1JtbHNaVTVoYldVZ1BTQnpaV3hsWTNSR2FXVnNaQ2h5WlhRc0lHMXBibVV1Ym1WM1JtbHNaVTVoYldVc0lIUm9aV2x5Y3k1dVpYZEdhV3hsVG1GdFpTazdYRzRnSUNBZ0lDQnlaWFF1YjJ4a1NHVmhaR1Z5SUQwZ2MyVnNaV04wUm1sbGJHUW9jbVYwTENCdGFXNWxMbTlzWkVobFlXUmxjaXdnZEdobGFYSnpMbTlzWkVobFlXUmxjaWs3WEc0Z0lDQWdJQ0J5WlhRdWJtVjNTR1ZoWkdWeUlEMGdjMlZzWldOMFJtbGxiR1FvY21WMExDQnRhVzVsTG01bGQwaGxZV1JsY2l3Z2RHaGxhWEp6TG01bGQwaGxZV1JsY2lrN1hHNGdJQ0FnZlZ4dUlDQjlYRzVjYmlBZ2NtVjBMbWgxYm10eklEMGdXMTA3WEc1Y2JpQWdiR1YwSUcxcGJtVkpibVJsZUNBOUlEQXNYRzRnSUNBZ0lDQjBhR1ZwY25OSmJtUmxlQ0E5SURBc1hHNGdJQ0FnSUNCdGFXNWxUMlptYzJWMElEMGdNQ3hjYmlBZ0lDQWdJSFJvWldseWMwOW1abk5sZENBOUlEQTdYRzVjYmlBZ2QyaHBiR1VnS0cxcGJtVkpibVJsZUNBOElHMXBibVV1YUhWdWEzTXViR1Z1WjNSb0lIeDhJSFJvWldseWMwbHVaR1Y0SUR3Z2RHaGxhWEp6TG1oMWJtdHpMbXhsYm1kMGFDa2dlMXh1SUNBZ0lHeGxkQ0J0YVc1bFEzVnljbVZ1ZENBOUlHMXBibVV1YUhWdWEzTmJiV2x1WlVsdVpHVjRYU0I4ZkNCN2IyeGtVM1JoY25RNklFbHVabWx1YVhSNWZTeGNiaUFnSUNBZ0lDQWdkR2hsYVhKelEzVnljbVZ1ZENBOUlIUm9aV2x5Y3k1b2RXNXJjMXQwYUdWcGNuTkpibVJsZUYwZ2ZId2dlMjlzWkZOMFlYSjBPaUJKYm1acGJtbDBlWDA3WEc1Y2JpQWdJQ0JwWmlBb2FIVnVhMEpsWm05eVpTaHRhVzVsUTNWeWNtVnVkQ3dnZEdobGFYSnpRM1Z5Y21WdWRDa3BJSHRjYmlBZ0lDQWdJQzh2SUZSb2FYTWdjR0YwWTJnZ1pHOWxjeUJ1YjNRZ2IzWmxjbXhoY0NCM2FYUm9JR0Z1ZVNCdlppQjBhR1VnYjNSb1pYSnpMQ0I1WVhrdVhHNGdJQ0FnSUNCeVpYUXVhSFZ1YTNNdWNIVnphQ2hqYkc5dVpVaDFibXNvYldsdVpVTjFjbkpsYm5Rc0lHMXBibVZQWm1aelpYUXBLVHRjYmlBZ0lDQWdJRzFwYm1WSmJtUmxlQ3NyTzF4dUlDQWdJQ0FnZEdobGFYSnpUMlptYzJWMElDczlJRzFwYm1WRGRYSnlaVzUwTG01bGQweHBibVZ6SUMwZ2JXbHVaVU4xY25KbGJuUXViMnhrVEdsdVpYTTdYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDaG9kVzVyUW1WbWIzSmxLSFJvWldseWMwTjFjbkpsYm5Rc0lHMXBibVZEZFhKeVpXNTBLU2tnZTF4dUlDQWdJQ0FnTHk4Z1ZHaHBjeUJ3WVhSamFDQmtiMlZ6SUc1dmRDQnZkbVZ5YkdGd0lIZHBkR2dnWVc1NUlHOW1JSFJvWlNCdmRHaGxjbk1zSUhsaGVTNWNiaUFnSUNBZ0lISmxkQzVvZFc1cmN5NXdkWE5vS0dOc2IyNWxTSFZ1YXloMGFHVnBjbk5EZFhKeVpXNTBMQ0IwYUdWcGNuTlBabVp6WlhRcEtUdGNiaUFnSUNBZ0lIUm9aV2x5YzBsdVpHVjRLeXM3WEc0Z0lDQWdJQ0J0YVc1bFQyWm1jMlYwSUNzOUlIUm9aV2x5YzBOMWNuSmxiblF1Ym1WM1RHbHVaWE1nTFNCMGFHVnBjbk5EZFhKeVpXNTBMbTlzWkV4cGJtVnpPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBdkx5QlBkbVZ5YkdGd0xDQnRaWEpuWlNCaGN5QmlaWE4wSUhkbElHTmhibHh1SUNBZ0lDQWdiR1YwSUcxbGNtZGxaRWgxYm1zZ1BTQjdYRzRnSUNBZ0lDQWdJRzlzWkZOMFlYSjBPaUJOWVhSb0xtMXBiaWh0YVc1bFEzVnljbVZ1ZEM1dmJHUlRkR0Z5ZEN3Z2RHaGxhWEp6UTNWeWNtVnVkQzV2YkdSVGRHRnlkQ2tzWEc0Z0lDQWdJQ0FnSUc5c1pFeHBibVZ6T2lBd0xGeHVJQ0FnSUNBZ0lDQnVaWGRUZEdGeWREb2dUV0YwYUM1dGFXNG9iV2x1WlVOMWNuSmxiblF1Ym1WM1UzUmhjblFnS3lCdGFXNWxUMlptYzJWMExDQjBhR1ZwY25ORGRYSnlaVzUwTG05c1pGTjBZWEowSUNzZ2RHaGxhWEp6VDJabWMyVjBLU3hjYmlBZ0lDQWdJQ0FnYm1WM1RHbHVaWE02SURBc1hHNGdJQ0FnSUNBZ0lHeHBibVZ6T2lCYlhWeHVJQ0FnSUNBZ2ZUdGNiaUFnSUNBZ0lHMWxjbWRsVEdsdVpYTW9iV1Z5WjJWa1NIVnVheXdnYldsdVpVTjFjbkpsYm5RdWIyeGtVM1JoY25Rc0lHMXBibVZEZFhKeVpXNTBMbXhwYm1WekxDQjBhR1ZwY25ORGRYSnlaVzUwTG05c1pGTjBZWEowTENCMGFHVnBjbk5EZFhKeVpXNTBMbXhwYm1WektUdGNiaUFnSUNBZ0lIUm9aV2x5YzBsdVpHVjRLeXM3WEc0Z0lDQWdJQ0J0YVc1bFNXNWtaWGdyS3p0Y2JseHVJQ0FnSUNBZ2NtVjBMbWgxYm10ekxuQjFjMmdvYldWeVoyVmtTSFZ1YXlrN1hHNGdJQ0FnZlZ4dUlDQjlYRzVjYmlBZ2NtVjBkWEp1SUhKbGREdGNibjFjYmx4dVpuVnVZM1JwYjI0Z2JHOWhaRkJoZEdOb0tIQmhjbUZ0TENCaVlYTmxLU0I3WEc0Z0lHbG1JQ2gwZVhCbGIyWWdjR0Z5WVcwZ1BUMDlJQ2R6ZEhKcGJtY25LU0I3WEc0Z0lDQWdhV1lnS0M5ZVFFQXZiUzUwWlhOMEtIQmhjbUZ0S1NCOGZDQW9MMTVKYm1SbGVEb3ZiUzUwWlhOMEtIQmhjbUZ0S1NrcElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCd1lYSnpaVkJoZEdOb0tIQmhjbUZ0S1Zzd1hUdGNiaUFnSUNCOVhHNWNiaUFnSUNCcFppQW9JV0poYzJVcElIdGNiaUFnSUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2lnblRYVnpkQ0J3Y205MmFXUmxJR0VnWW1GelpTQnlaV1psY21WdVkyVWdiM0lnY0dGemN5QnBiaUJoSUhCaGRHTm9KeWs3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCemRISjFZM1IxY21Wa1VHRjBZMmdvZFc1a1pXWnBibVZrTENCMWJtUmxabWx1WldRc0lHSmhjMlVzSUhCaGNtRnRLVHRjYmlBZ2ZWeHVYRzRnSUhKbGRIVnliaUJ3WVhKaGJUdGNibjFjYmx4dVpuVnVZM1JwYjI0Z1ptbHNaVTVoYldWRGFHRnVaMlZrS0hCaGRHTm9LU0I3WEc0Z0lISmxkSFZ5YmlCd1lYUmphQzV1WlhkR2FXeGxUbUZ0WlNBbUppQndZWFJqYUM1dVpYZEdhV3hsVG1GdFpTQWhQVDBnY0dGMFkyZ3ViMnhrUm1sc1pVNWhiV1U3WEc1OVhHNWNibVoxYm1OMGFXOXVJSE5sYkdWamRFWnBaV3hrS0dsdVpHVjRMQ0J0YVc1bExDQjBhR1ZwY25NcElIdGNiaUFnYVdZZ0tHMXBibVVnUFQwOUlIUm9aV2x5Y3lrZ2UxeHVJQ0FnSUhKbGRIVnliaUJ0YVc1bE8xeHVJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lHbHVaR1Y0TG1OdmJtWnNhV04wSUQwZ2RISjFaVHRjYmlBZ0lDQnlaWFIxY200Z2UyMXBibVVzSUhSb1pXbHljMzA3WEc0Z0lIMWNibjFjYmx4dVpuVnVZM1JwYjI0Z2FIVnVhMEpsWm05eVpTaDBaWE4wTENCamFHVmpheWtnZTF4dUlDQnlaWFIxY200Z2RHVnpkQzV2YkdSVGRHRnlkQ0E4SUdOb1pXTnJMbTlzWkZOMFlYSjBYRzRnSUNBZ0ppWWdLSFJsYzNRdWIyeGtVM1JoY25RZ0t5QjBaWE4wTG05c1pFeHBibVZ6S1NBOElHTm9aV05yTG05c1pGTjBZWEowTzF4dWZWeHVYRzVtZFc1amRHbHZiaUJqYkc5dVpVaDFibXNvYUhWdWF5d2diMlptYzJWMEtTQjdYRzRnSUhKbGRIVnliaUI3WEc0Z0lDQWdiMnhrVTNSaGNuUTZJR2gxYm1zdWIyeGtVM1JoY25Rc0lHOXNaRXhwYm1Wek9pQm9kVzVyTG05c1pFeHBibVZ6TEZ4dUlDQWdJRzVsZDFOMFlYSjBPaUJvZFc1ckxtNWxkMU4wWVhKMElDc2diMlptYzJWMExDQnVaWGRNYVc1bGN6b2dhSFZ1YXk1dVpYZE1hVzVsY3l4Y2JpQWdJQ0JzYVc1bGN6b2dhSFZ1YXk1c2FXNWxjMXh1SUNCOU8xeHVmVnh1WEc1bWRXNWpkR2x2YmlCdFpYSm5aVXhwYm1WektHaDFibXNzSUcxcGJtVlBabVp6WlhRc0lHMXBibVZNYVc1bGN5d2dkR2hsYVhKUFptWnpaWFFzSUhSb1pXbHlUR2x1WlhNcElIdGNiaUFnTHk4Z1ZHaHBjeUIzYVd4c0lHZGxibVZ5WVd4c2VTQnlaWE4xYkhRZ2FXNGdZU0JqYjI1bWJHbGpkR1ZrSUdoMWJtc3NJR0oxZENCMGFHVnlaU0JoY21VZ1kyRnpaWE1nZDJobGNtVWdkR2hsSUdOdmJuUmxlSFJjYmlBZ0x5OGdhWE1nZEdobElHOXViSGtnYjNabGNteGhjQ0IzYUdWeVpTQjNaU0JqWVc0Z2MzVmpZMlZ6YzJaMWJHeDVJRzFsY21kbElIUm9aU0JqYjI1MFpXNTBJR2hsY21VdVhHNGdJR3hsZENCdGFXNWxJRDBnZTI5bVpuTmxkRG9nYldsdVpVOW1abk5sZEN3Z2JHbHVaWE02SUcxcGJtVk1hVzVsY3l3Z2FXNWtaWGc2SURCOUxGeHVJQ0FnSUNBZ2RHaGxhWElnUFNCN2IyWm1jMlYwT2lCMGFHVnBjazltWm5ObGRDd2diR2x1WlhNNklIUm9aV2x5VEdsdVpYTXNJR2x1WkdWNE9pQXdmVHRjYmx4dUlDQXZMeUJJWVc1a2JHVWdZVzU1SUd4bFlXUnBibWNnWTI5dWRHVnVkRnh1SUNCcGJuTmxjblJNWldGa2FXNW5LR2gxYm1zc0lHMXBibVVzSUhSb1pXbHlLVHRjYmlBZ2FXNXpaWEowVEdWaFpHbHVaeWhvZFc1ckxDQjBhR1ZwY2l3Z2JXbHVaU2s3WEc1Y2JpQWdMeThnVG05M0lHbHVJSFJvWlNCdmRtVnliR0Z3SUdOdmJuUmxiblF1SUZOallXNGdkR2h5YjNWbmFDQmhibVFnYzJWc1pXTjBJSFJvWlNCaVpYTjBJR05vWVc1blpYTWdabkp2YlNCbFlXTm9MbHh1SUNCM2FHbHNaU0FvYldsdVpTNXBibVJsZUNBOElHMXBibVV1YkdsdVpYTXViR1Z1WjNSb0lDWW1JSFJvWldseUxtbHVaR1Y0SUR3Z2RHaGxhWEl1YkdsdVpYTXViR1Z1WjNSb0tTQjdYRzRnSUNBZ2JHVjBJRzFwYm1WRGRYSnlaVzUwSUQwZ2JXbHVaUzVzYVc1bGMxdHRhVzVsTG1sdVpHVjRYU3hjYmlBZ0lDQWdJQ0FnZEdobGFYSkRkWEp5Wlc1MElEMGdkR2hsYVhJdWJHbHVaWE5iZEdobGFYSXVhVzVrWlhoZE8xeHVYRzRnSUNBZ2FXWWdLQ2h0YVc1bFEzVnljbVZ1ZEZzd1hTQTlQVDBnSnkwbklIeDhJRzFwYm1WRGRYSnlaVzUwV3pCZElEMDlQU0FuS3ljcFhHNGdJQ0FnSUNBZ0lDWW1JQ2gwYUdWcGNrTjFjbkpsYm5SYk1GMGdQVDA5SUNjdEp5QjhmQ0IwYUdWcGNrTjFjbkpsYm5SYk1GMGdQVDA5SUNjckp5a3BJSHRjYmlBZ0lDQWdJQzh2SUVKdmRHZ2diVzlrYVdacFpXUWdMaTR1WEc0Z0lDQWdJQ0J0ZFhSMVlXeERhR0Z1WjJVb2FIVnVheXdnYldsdVpTd2dkR2hsYVhJcE8xeHVJQ0FnSUgwZ1pXeHpaU0JwWmlBb2JXbHVaVU4xY25KbGJuUmJNRjBnUFQwOUlDY3JKeUFtSmlCMGFHVnBja04xY25KbGJuUmJNRjBnUFQwOUlDY2dKeWtnZTF4dUlDQWdJQ0FnTHk4Z1RXbHVaU0JwYm5ObGNuUmxaRnh1SUNBZ0lDQWdhSFZ1YXk1c2FXNWxjeTV3ZFhOb0tDNHVMaUJqYjJ4c1pXTjBRMmhoYm1kbEtHMXBibVVwS1R0Y2JpQWdJQ0I5SUdWc2MyVWdhV1lnS0hSb1pXbHlRM1Z5Y21WdWRGc3dYU0E5UFQwZ0p5c25JQ1ltSUcxcGJtVkRkWEp5Wlc1MFd6QmRJRDA5UFNBbklDY3BJSHRjYmlBZ0lDQWdJQzh2SUZSb1pXbHljeUJwYm5ObGNuUmxaRnh1SUNBZ0lDQWdhSFZ1YXk1c2FXNWxjeTV3ZFhOb0tDNHVMaUJqYjJ4c1pXTjBRMmhoYm1kbEtIUm9aV2x5S1NrN1hHNGdJQ0FnZlNCbGJITmxJR2xtSUNodGFXNWxRM1Z5Y21WdWRGc3dYU0E5UFQwZ0p5MG5JQ1ltSUhSb1pXbHlRM1Z5Y21WdWRGc3dYU0E5UFQwZ0p5QW5LU0I3WEc0Z0lDQWdJQ0F2THlCTmFXNWxJSEpsYlc5MlpXUWdiM0lnWldScGRHVmtYRzRnSUNBZ0lDQnlaVzF2ZG1Gc0tHaDFibXNzSUcxcGJtVXNJSFJvWldseUtUdGNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tIUm9aV2x5UTNWeWNtVnVkRnN3WFNBOVBUMGdKeTBuSUNZbUlHMXBibVZEZFhKeVpXNTBXekJkSUQwOVBTQW5JQ2NwSUh0Y2JpQWdJQ0FnSUM4dklGUm9aV2x5SUhKbGJXOTJaV1FnYjNJZ1pXUnBkR1ZrWEc0Z0lDQWdJQ0J5WlcxdmRtRnNLR2gxYm1zc0lIUm9aV2x5TENCdGFXNWxMQ0IwY25WbEtUdGNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tHMXBibVZEZFhKeVpXNTBJRDA5UFNCMGFHVnBja04xY25KbGJuUXBJSHRjYmlBZ0lDQWdJQzh2SUVOdmJuUmxlSFFnYVdSbGJuUnBkSGxjYmlBZ0lDQWdJR2gxYm1zdWJHbHVaWE11Y0hWemFDaHRhVzVsUTNWeWNtVnVkQ2s3WEc0Z0lDQWdJQ0J0YVc1bExtbHVaR1Y0S3lzN1hHNGdJQ0FnSUNCMGFHVnBjaTVwYm1SbGVDc3JPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBdkx5QkRiMjUwWlhoMElHMXBjMjFoZEdOb1hHNGdJQ0FnSUNCamIyNW1iR2xqZENob2RXNXJMQ0JqYjJ4c1pXTjBRMmhoYm1kbEtHMXBibVVwTENCamIyeHNaV04wUTJoaGJtZGxLSFJvWldseUtTazdYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdMeThnVG05M0lIQjFjMmdnWVc1NWRHaHBibWNnZEdoaGRDQnRZWGtnWW1VZ2NtVnRZV2x1YVc1blhHNGdJR2x1YzJWeWRGUnlZV2xzYVc1bktHaDFibXNzSUcxcGJtVXBPMXh1SUNCcGJuTmxjblJVY21GcGJHbHVaeWhvZFc1ckxDQjBhR1ZwY2lrN1hHNWNiaUFnWTJGc1kweHBibVZEYjNWdWRDaG9kVzVyS1R0Y2JuMWNibHh1Wm5WdVkzUnBiMjRnYlhWMGRXRnNRMmhoYm1kbEtHaDFibXNzSUcxcGJtVXNJSFJvWldseUtTQjdYRzRnSUd4bGRDQnRlVU5vWVc1blpYTWdQU0JqYjJ4c1pXTjBRMmhoYm1kbEtHMXBibVVwTEZ4dUlDQWdJQ0FnZEdobGFYSkRhR0Z1WjJWeklEMGdZMjlzYkdWamRFTm9ZVzVuWlNoMGFHVnBjaWs3WEc1Y2JpQWdhV1lnS0dGc2JGSmxiVzkyWlhNb2JYbERhR0Z1WjJWektTQW1KaUJoYkd4U1pXMXZkbVZ6S0hSb1pXbHlRMmhoYm1kbGN5a3BJSHRjYmlBZ0lDQXZMeUJUY0dWamFXRnNJR05oYzJVZ1ptOXlJSEpsYlc5MlpTQmphR0Z1WjJWeklIUm9ZWFFnWVhKbElITjFjR1Z5YzJWMGN5QnZaaUJ2Ym1VZ1lXNXZkR2hsY2x4dUlDQWdJR2xtSUNoaGNuSmhlVk4wWVhKMGMxZHBkR2dvYlhsRGFHRnVaMlZ6TENCMGFHVnBja05vWVc1blpYTXBYRzRnSUNBZ0lDQWdJQ1ltSUhOcmFYQlNaVzF2ZG1WVGRYQmxjbk5sZENoMGFHVnBjaXdnYlhsRGFHRnVaMlZ6TENCdGVVTm9ZVzVuWlhNdWJHVnVaM1JvSUMwZ2RHaGxhWEpEYUdGdVoyVnpMbXhsYm1kMGFDa3BJSHRjYmlBZ0lDQWdJR2gxYm1zdWJHbHVaWE11Y0hWemFDZ3VMaTRnYlhsRGFHRnVaMlZ6S1R0Y2JpQWdJQ0FnSUhKbGRIVnlianRjYmlBZ0lDQjlJR1ZzYzJVZ2FXWWdLR0Z5Y21GNVUzUmhjblJ6VjJsMGFDaDBhR1ZwY2tOb1lXNW5aWE1zSUcxNVEyaGhibWRsY3lsY2JpQWdJQ0FnSUNBZ0ppWWdjMnRwY0ZKbGJXOTJaVk4xY0dWeWMyVjBLRzFwYm1Vc0lIUm9aV2x5UTJoaGJtZGxjeXdnZEdobGFYSkRhR0Z1WjJWekxteGxibWQwYUNBdElHMTVRMmhoYm1kbGN5NXNaVzVuZEdncEtTQjdYRzRnSUNBZ0lDQm9kVzVyTG14cGJtVnpMbkIxYzJnb0xpNHVJSFJvWldseVEyaGhibWRsY3lrN1hHNGdJQ0FnSUNCeVpYUjFjbTQ3WEc0Z0lDQWdmVnh1SUNCOUlHVnNjMlVnYVdZZ0tHRnljbUY1UlhGMVlXd29iWGxEYUdGdVoyVnpMQ0IwYUdWcGNrTm9ZVzVuWlhNcEtTQjdYRzRnSUNBZ2FIVnVheTVzYVc1bGN5NXdkWE5vS0M0dUxpQnRlVU5vWVc1blpYTXBPMXh1SUNBZ0lISmxkSFZ5Ymp0Y2JpQWdmVnh1WEc0Z0lHTnZibVpzYVdOMEtHaDFibXNzSUcxNVEyaGhibWRsY3l3Z2RHaGxhWEpEYUdGdVoyVnpLVHRjYm4xY2JseHVablZ1WTNScGIyNGdjbVZ0YjNaaGJDaG9kVzVyTENCdGFXNWxMQ0IwYUdWcGNpd2djM2RoY0NrZ2UxeHVJQ0JzWlhRZ2JYbERhR0Z1WjJWeklEMGdZMjlzYkdWamRFTm9ZVzVuWlNodGFXNWxLU3hjYmlBZ0lDQWdJSFJvWldseVEyaGhibWRsY3lBOUlHTnZiR3hsWTNSRGIyNTBaWGgwS0hSb1pXbHlMQ0J0ZVVOb1lXNW5aWE1wTzF4dUlDQnBaaUFvZEdobGFYSkRhR0Z1WjJWekxtMWxjbWRsWkNrZ2UxeHVJQ0FnSUdoMWJtc3ViR2x1WlhNdWNIVnphQ2d1TGk0Z2RHaGxhWEpEYUdGdVoyVnpMbTFsY21kbFpDazdYRzRnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdZMjl1Wm14cFkzUW9hSFZ1YXl3Z2MzZGhjQ0EvSUhSb1pXbHlRMmhoYm1kbGN5QTZJRzE1UTJoaGJtZGxjeXdnYzNkaGNDQS9JRzE1UTJoaGJtZGxjeUE2SUhSb1pXbHlRMmhoYm1kbGN5azdYRzRnSUgxY2JuMWNibHh1Wm5WdVkzUnBiMjRnWTI5dVpteHBZM1FvYUhWdWF5d2diV2x1WlN3Z2RHaGxhWElwSUh0Y2JpQWdhSFZ1YXk1amIyNW1iR2xqZENBOUlIUnlkV1U3WEc0Z0lHaDFibXN1YkdsdVpYTXVjSFZ6YUNoN1hHNGdJQ0FnWTI5dVpteHBZM1E2SUhSeWRXVXNYRzRnSUNBZ2JXbHVaVG9nYldsdVpTeGNiaUFnSUNCMGFHVnBjbk02SUhSb1pXbHlYRzRnSUgwcE8xeHVmVnh1WEc1bWRXNWpkR2x2YmlCcGJuTmxjblJNWldGa2FXNW5LR2gxYm1zc0lHbHVjMlZ5ZEN3Z2RHaGxhWElwSUh0Y2JpQWdkMmhwYkdVZ0tHbHVjMlZ5ZEM1dlptWnpaWFFnUENCMGFHVnBjaTV2Wm1aelpYUWdKaVlnYVc1elpYSjBMbWx1WkdWNElEd2dhVzV6WlhKMExteHBibVZ6TG14bGJtZDBhQ2tnZTF4dUlDQWdJR3hsZENCc2FXNWxJRDBnYVc1elpYSjBMbXhwYm1WelcybHVjMlZ5ZEM1cGJtUmxlQ3NyWFR0Y2JpQWdJQ0JvZFc1ckxteHBibVZ6TG5CMWMyZ29iR2x1WlNrN1hHNGdJQ0FnYVc1elpYSjBMbTltWm5ObGRDc3JPMXh1SUNCOVhHNTlYRzVtZFc1amRHbHZiaUJwYm5ObGNuUlVjbUZwYkdsdVp5aG9kVzVyTENCcGJuTmxjblFwSUh0Y2JpQWdkMmhwYkdVZ0tHbHVjMlZ5ZEM1cGJtUmxlQ0E4SUdsdWMyVnlkQzVzYVc1bGN5NXNaVzVuZEdncElIdGNiaUFnSUNCc1pYUWdiR2x1WlNBOUlHbHVjMlZ5ZEM1c2FXNWxjMXRwYm5ObGNuUXVhVzVrWlhncksxMDdYRzRnSUNBZ2FIVnVheTVzYVc1bGN5NXdkWE5vS0d4cGJtVXBPMXh1SUNCOVhHNTlYRzVjYm1aMWJtTjBhVzl1SUdOdmJHeGxZM1JEYUdGdVoyVW9jM1JoZEdVcElIdGNiaUFnYkdWMElISmxkQ0E5SUZ0ZExGeHVJQ0FnSUNBZ2IzQmxjbUYwYVc5dUlEMGdjM1JoZEdVdWJHbHVaWE5iYzNSaGRHVXVhVzVrWlhoZFd6QmRPMXh1SUNCM2FHbHNaU0FvYzNSaGRHVXVhVzVrWlhnZ1BDQnpkR0YwWlM1c2FXNWxjeTVzWlc1bmRHZ3BJSHRjYmlBZ0lDQnNaWFFnYkdsdVpTQTlJSE4wWVhSbExteHBibVZ6VzNOMFlYUmxMbWx1WkdWNFhUdGNibHh1SUNBZ0lDOHZJRWR5YjNWd0lHRmtaR2wwYVc5dWN5QjBhR0YwSUdGeVpTQnBiVzFsWkdsaGRHVnNlU0JoWm5SbGNpQnpkV0owY21GamRHbHZibk1nWVc1a0lIUnlaV0YwSUhSb1pXMGdZWE1nYjI1bElGd2lZWFJ2YldsalhDSWdiVzlrYVdaNUlHTm9ZVzVuWlM1Y2JpQWdJQ0JwWmlBb2IzQmxjbUYwYVc5dUlEMDlQU0FuTFNjZ0ppWWdiR2x1WlZzd1hTQTlQVDBnSnlzbktTQjdYRzRnSUNBZ0lDQnZjR1Z5WVhScGIyNGdQU0FuS3ljN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnYVdZZ0tHOXdaWEpoZEdsdmJpQTlQVDBnYkdsdVpWc3dYU2tnZTF4dUlDQWdJQ0FnY21WMExuQjFjMmdvYkdsdVpTazdYRzRnSUNBZ0lDQnpkR0YwWlM1cGJtUmxlQ3NyTzF4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQmljbVZoYXp0Y2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNCeVpYUjFjbTRnY21WME8xeHVmVnh1Wm5WdVkzUnBiMjRnWTI5c2JHVmpkRU52Ym5SbGVIUW9jM1JoZEdVc0lHMWhkR05vUTJoaGJtZGxjeWtnZTF4dUlDQnNaWFFnWTJoaGJtZGxjeUE5SUZ0ZExGeHVJQ0FnSUNBZ2JXVnlaMlZrSUQwZ1cxMHNYRzRnSUNBZ0lDQnRZWFJqYUVsdVpHVjRJRDBnTUN4Y2JpQWdJQ0FnSUdOdmJuUmxlSFJEYUdGdVoyVnpJRDBnWm1Gc2MyVXNYRzRnSUNBZ0lDQmpiMjVtYkdsamRHVmtJRDBnWm1Gc2MyVTdYRzRnSUhkb2FXeGxJQ2h0WVhSamFFbHVaR1Y0SUR3Z2JXRjBZMmhEYUdGdVoyVnpMbXhsYm1kMGFGeHVJQ0FnSUNBZ0lDQW1KaUJ6ZEdGMFpTNXBibVJsZUNBOElITjBZWFJsTG14cGJtVnpMbXhsYm1kMGFDa2dlMXh1SUNBZ0lHeGxkQ0JqYUdGdVoyVWdQU0J6ZEdGMFpTNXNhVzVsYzF0emRHRjBaUzVwYm1SbGVGMHNYRzRnSUNBZ0lDQWdJRzFoZEdOb0lEMGdiV0YwWTJoRGFHRnVaMlZ6VzIxaGRHTm9TVzVrWlhoZE8xeHVYRzRnSUNBZ0x5OGdUMjVqWlNCM1pTZDJaU0JvYVhRZ2IzVnlJR0ZrWkN3Z2RHaGxiaUIzWlNCaGNtVWdaRzl1WlZ4dUlDQWdJR2xtSUNodFlYUmphRnN3WFNBOVBUMGdKeXNuS1NCN1hHNGdJQ0FnSUNCaWNtVmhhenRjYmlBZ0lDQjlYRzVjYmlBZ0lDQmpiMjUwWlhoMFEyaGhibWRsY3lBOUlHTnZiblJsZUhSRGFHRnVaMlZ6SUh4OElHTm9ZVzVuWlZzd1hTQWhQVDBnSnlBbk8xeHVYRzRnSUNBZ2JXVnlaMlZrTG5CMWMyZ29iV0YwWTJncE8xeHVJQ0FnSUcxaGRHTm9TVzVrWlhnckt6dGNibHh1SUNBZ0lDOHZJRU52Ym5OMWJXVWdZVzU1SUdGa1pHbDBhVzl1Y3lCcGJpQjBhR1VnYjNSb1pYSWdZbXh2WTJzZ1lYTWdZU0JqYjI1bWJHbGpkQ0IwYnlCaGRIUmxiWEIwWEc0Z0lDQWdMeThnZEc4Z2NIVnNiQ0JwYmlCMGFHVWdjbVZ0WVdsdWFXNW5JR052Ym5SbGVIUWdZV1owWlhJZ2RHaHBjMXh1SUNBZ0lHbG1JQ2hqYUdGdVoyVmJNRjBnUFQwOUlDY3JKeWtnZTF4dUlDQWdJQ0FnWTI5dVpteHBZM1JsWkNBOUlIUnlkV1U3WEc1Y2JpQWdJQ0FnSUhkb2FXeGxJQ2hqYUdGdVoyVmJNRjBnUFQwOUlDY3JKeWtnZTF4dUlDQWdJQ0FnSUNCamFHRnVaMlZ6TG5CMWMyZ29ZMmhoYm1kbEtUdGNiaUFnSUNBZ0lDQWdZMmhoYm1kbElEMGdjM1JoZEdVdWJHbHVaWE5iS3l0emRHRjBaUzVwYm1SbGVGMDdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2FXWWdLRzFoZEdOb0xuTjFZbk4wY2lneEtTQTlQVDBnWTJoaGJtZGxMbk4xWW5OMGNpZ3hLU2tnZTF4dUlDQWdJQ0FnWTJoaGJtZGxjeTV3ZFhOb0tHTm9ZVzVuWlNrN1hHNGdJQ0FnSUNCemRHRjBaUzVwYm1SbGVDc3JPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCamIyNW1iR2xqZEdWa0lEMGdkSEoxWlR0Y2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNCcFppQW9LRzFoZEdOb1EyaGhibWRsYzF0dFlYUmphRWx1WkdWNFhTQjhmQ0FuSnlsYk1GMGdQVDA5SUNjckoxeHVJQ0FnSUNBZ0ppWWdZMjl1ZEdWNGRFTm9ZVzVuWlhNcElIdGNiaUFnSUNCamIyNW1iR2xqZEdWa0lEMGdkSEoxWlR0Y2JpQWdmVnh1WEc0Z0lHbG1JQ2hqYjI1bWJHbGpkR1ZrS1NCN1hHNGdJQ0FnY21WMGRYSnVJR05vWVc1blpYTTdYRzRnSUgxY2JseHVJQ0IzYUdsc1pTQW9iV0YwWTJoSmJtUmxlQ0E4SUcxaGRHTm9RMmhoYm1kbGN5NXNaVzVuZEdncElIdGNiaUFnSUNCdFpYSm5aV1F1Y0hWemFDaHRZWFJqYUVOb1lXNW5aWE5iYldGMFkyaEpibVJsZUNzclhTazdYRzRnSUgxY2JseHVJQ0J5WlhSMWNtNGdlMXh1SUNBZ0lHMWxjbWRsWkN4Y2JpQWdJQ0JqYUdGdVoyVnpYRzRnSUgwN1hHNTlYRzVjYm1aMWJtTjBhVzl1SUdGc2JGSmxiVzkyWlhNb1kyaGhibWRsY3lrZ2UxeHVJQ0J5WlhSMWNtNGdZMmhoYm1kbGN5NXlaV1IxWTJVb1puVnVZM1JwYjI0b2NISmxkaXdnWTJoaGJtZGxLU0I3WEc0Z0lDQWdjbVYwZFhKdUlIQnlaWFlnSmlZZ1kyaGhibWRsV3pCZElEMDlQU0FuTFNjN1hHNGdJSDBzSUhSeWRXVXBPMXh1ZlZ4dVpuVnVZM1JwYjI0Z2MydHBjRkpsYlc5MlpWTjFjR1Z5YzJWMEtITjBZWFJsTENCeVpXMXZkbVZEYUdGdVoyVnpMQ0JrWld4MFlTa2dlMXh1SUNCbWIzSWdLR3hsZENCcElEMGdNRHNnYVNBOElHUmxiSFJoT3lCcEt5c3BJSHRjYmlBZ0lDQnNaWFFnWTJoaGJtZGxRMjl1ZEdWdWRDQTlJSEpsYlc5MlpVTm9ZVzVuWlhOYmNtVnRiM1psUTJoaGJtZGxjeTVzWlc1bmRHZ2dMU0JrWld4MFlTQXJJR2xkTG5OMVluTjBjaWd4S1R0Y2JpQWdJQ0JwWmlBb2MzUmhkR1V1YkdsdVpYTmJjM1JoZEdVdWFXNWtaWGdnS3lCcFhTQWhQVDBnSnlBbklDc2dZMmhoYm1kbFEyOXVkR1Z1ZENrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUdaaGJITmxPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJSE4wWVhSbExtbHVaR1Y0SUNzOUlHUmxiSFJoTzF4dUlDQnlaWFIxY200Z2RISjFaVHRjYm4xY2JseHVablZ1WTNScGIyNGdZMkZzWTA5c1pFNWxkMHhwYm1WRGIzVnVkQ2hzYVc1bGN5a2dlMXh1SUNCc1pYUWdiMnhrVEdsdVpYTWdQU0F3TzF4dUlDQnNaWFFnYm1WM1RHbHVaWE1nUFNBd08xeHVYRzRnSUd4cGJtVnpMbVp2Y2tWaFkyZ29ablZ1WTNScGIyNG9iR2x1WlNrZ2UxeHVJQ0FnSUdsbUlDaDBlWEJsYjJZZ2JHbHVaU0FoUFQwZ0ozTjBjbWx1WnljcElIdGNiaUFnSUNBZ0lHeGxkQ0J0ZVVOdmRXNTBJRDBnWTJGc1kwOXNaRTVsZDB4cGJtVkRiM1Z1ZENoc2FXNWxMbTFwYm1VcE8xeHVJQ0FnSUNBZ2JHVjBJSFJvWldseVEyOTFiblFnUFNCallXeGpUMnhrVG1WM1RHbHVaVU52ZFc1MEtHeHBibVV1ZEdobGFYSnpLVHRjYmx4dUlDQWdJQ0FnYVdZZ0tHOXNaRXhwYm1WeklDRTlQU0IxYm1SbFptbHVaV1FwSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLRzE1UTI5MWJuUXViMnhrVEdsdVpYTWdQVDA5SUhSb1pXbHlRMjkxYm5RdWIyeGtUR2x1WlhNcElIdGNiaUFnSUNBZ0lDQWdJQ0J2YkdSTWFXNWxjeUFyUFNCdGVVTnZkVzUwTG05c1pFeHBibVZ6TzF4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lHOXNaRXhwYm1WeklEMGdkVzVrWldacGJtVmtPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUdsbUlDaHVaWGRNYVc1bGN5QWhQVDBnZFc1a1pXWnBibVZrS1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2h0ZVVOdmRXNTBMbTVsZDB4cGJtVnpJRDA5UFNCMGFHVnBja052ZFc1MExtNWxkMHhwYm1WektTQjdYRzRnSUNBZ0lDQWdJQ0FnYm1WM1RHbHVaWE1nS3owZ2JYbERiM1Z1ZEM1dVpYZE1hVzVsY3p0Y2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQnVaWGRNYVc1bGN5QTlJSFZ1WkdWbWFXNWxaRHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnZlZ4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQnBaaUFvYm1WM1RHbHVaWE1nSVQwOUlIVnVaR1ZtYVc1bFpDQW1KaUFvYkdsdVpWc3dYU0E5UFQwZ0p5c25JSHg4SUd4cGJtVmJNRjBnUFQwOUlDY2dKeWtwSUh0Y2JpQWdJQ0FnSUNBZ2JtVjNUR2x1WlhNckt6dGNiaUFnSUNBZ0lIMWNiaUFnSUNBZ0lHbG1JQ2h2YkdSTWFXNWxjeUFoUFQwZ2RXNWtaV1pwYm1Wa0lDWW1JQ2hzYVc1bFd6QmRJRDA5UFNBbkxTY2dmSHdnYkdsdVpWc3dYU0E5UFQwZ0p5QW5LU2tnZTF4dUlDQWdJQ0FnSUNCdmJHUk1hVzVsY3lzck8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdmU2s3WEc1Y2JpQWdjbVYwZFhKdUlIdHZiR1JNYVc1bGN5d2dibVYzVEdsdVpYTjlPMXh1ZlZ4dUlsMTlcblxuXG4vKioqLyB9KSxcbi8qIDE0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyd1c2Ugc3RyaWN0JztcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3N0cnVjdHVyZWRQYXRjaCA9IHN0cnVjdHVyZWRQYXRjaDtcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovY3JlYXRlVHdvRmlsZXNQYXRjaCA9IGNyZWF0ZVR3b0ZpbGVzUGF0Y2g7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2NyZWF0ZVBhdGNoID0gY3JlYXRlUGF0Y2g7XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fbGluZSA9IF9fd2VicGFja19yZXF1aXJlX18oNSkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2Z1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gZWxzZSB7IHJldHVybiBBcnJheS5mcm9tKGFycik7IH0gfVxuXG5cdC8qaXN0YW5idWwgaWdub3JlIGVuZCovZnVuY3Rpb24gc3RydWN0dXJlZFBhdGNoKG9sZEZpbGVOYW1lLCBuZXdGaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSB7XG5cdCAgaWYgKCFvcHRpb25zKSB7XG5cdCAgICBvcHRpb25zID0ge307XG5cdCAgfVxuXHQgIGlmICh0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAndW5kZWZpbmVkJykge1xuXHQgICAgb3B0aW9ucy5jb250ZXh0ID0gNDtcblx0ICB9XG5cblx0ICB2YXIgZGlmZiA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oMCwgX2xpbmUuZGlmZkxpbmVzKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyhvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG5cdCAgZGlmZi5wdXNoKHsgdmFsdWU6ICcnLCBsaW5lczogW10gfSk7IC8vIEFwcGVuZCBhbiBlbXB0eSB2YWx1ZSB0byBtYWtlIGNsZWFudXAgZWFzaWVyXG5cblx0ICBmdW5jdGlvbiBjb250ZXh0TGluZXMobGluZXMpIHtcblx0ICAgIHJldHVybiBsaW5lcy5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7XG5cdCAgICAgIHJldHVybiAnICcgKyBlbnRyeTtcblx0ICAgIH0pO1xuXHQgIH1cblxuXHQgIHZhciBodW5rcyA9IFtdO1xuXHQgIHZhciBvbGRSYW5nZVN0YXJ0ID0gMCxcblx0ICAgICAgbmV3UmFuZ2VTdGFydCA9IDAsXG5cdCAgICAgIGN1clJhbmdlID0gW10sXG5cdCAgICAgIG9sZExpbmUgPSAxLFxuXHQgICAgICBuZXdMaW5lID0gMTtcblxuXHQgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcCggLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9pKSB7XG5cdCAgICB2YXIgY3VycmVudCA9IGRpZmZbaV0sXG5cdCAgICAgICAgbGluZXMgPSBjdXJyZW50LmxpbmVzIHx8IGN1cnJlbnQudmFsdWUucmVwbGFjZSgvXFxuJC8sICcnKS5zcGxpdCgnXFxuJyk7XG5cdCAgICBjdXJyZW50LmxpbmVzID0gbGluZXM7XG5cblx0ICAgIGlmIChjdXJyZW50LmFkZGVkIHx8IGN1cnJlbnQucmVtb3ZlZCkge1xuXHQgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9jdXJSYW5nZTtcblxuXHQgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyAvLyBJZiB3ZSBoYXZlIHByZXZpb3VzIGNvbnRleHQsIHN0YXJ0IHdpdGggdGhhdFxuXHQgICAgICBpZiAoIW9sZFJhbmdlU3RhcnQpIHtcblx0ICAgICAgICB2YXIgcHJldiA9IGRpZmZbaSAtIDFdO1xuXHQgICAgICAgIG9sZFJhbmdlU3RhcnQgPSBvbGRMaW5lO1xuXHQgICAgICAgIG5ld1JhbmdlU3RhcnQgPSBuZXdMaW5lO1xuXG5cdCAgICAgICAgaWYgKHByZXYpIHtcblx0ICAgICAgICAgIGN1clJhbmdlID0gb3B0aW9ucy5jb250ZXh0ID4gMCA/IGNvbnRleHRMaW5lcyhwcmV2LmxpbmVzLnNsaWNlKC1vcHRpb25zLmNvbnRleHQpKSA6IFtdO1xuXHQgICAgICAgICAgb2xkUmFuZ2VTdGFydCAtPSBjdXJSYW5nZS5sZW5ndGg7XG5cdCAgICAgICAgICBuZXdSYW5nZVN0YXJ0IC09IGN1clJhbmdlLmxlbmd0aDtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblxuXHQgICAgICAvLyBPdXRwdXQgb3VyIGNoYW5nZXNcblx0ICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyhfY3VyUmFuZ2UgPSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2N1clJhbmdlKS5wdXNoLiAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovYXBwbHkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8oIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fY3VyUmFuZ2UgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8sIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fdG9Db25zdW1hYmxlQXJyYXkoIC8qaXN0YW5idWwgaWdub3JlIGVuZCovbGluZXMubWFwKGZ1bmN0aW9uIChlbnRyeSkge1xuXHQgICAgICAgIHJldHVybiAoY3VycmVudC5hZGRlZCA/ICcrJyA6ICctJykgKyBlbnRyeTtcblx0ICAgICAgfSkpKTtcblxuXHQgICAgICAvLyBUcmFjayB0aGUgdXBkYXRlZCBmaWxlIHBvc2l0aW9uXG5cdCAgICAgIGlmIChjdXJyZW50LmFkZGVkKSB7XG5cdCAgICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgb2xkTGluZSArPSBsaW5lcy5sZW5ndGg7XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIC8vIElkZW50aWNhbCBjb250ZXh0IGxpbmVzLiBUcmFjayBsaW5lIGNoYW5nZXNcblx0ICAgICAgaWYgKG9sZFJhbmdlU3RhcnQpIHtcblx0ICAgICAgICAvLyBDbG9zZSBvdXQgYW55IGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gb3V0cHV0IChvciBqb2luIG92ZXJsYXBwaW5nKVxuXHQgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPD0gb3B0aW9ucy5jb250ZXh0ICogMiAmJiBpIDwgZGlmZi5sZW5ndGggLSAyKSB7XG5cdCAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9jdXJSYW5nZTI7XG5cblx0ICAgICAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovIC8vIE92ZXJsYXBwaW5nXG5cdCAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKF9jdXJSYW5nZTIgPSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2N1clJhbmdlKS5wdXNoLiAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovYXBwbHkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8oIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fY3VyUmFuZ2UyIC8qaXN0YW5idWwgaWdub3JlIGVuZCovLCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX3RvQ29uc3VtYWJsZUFycmF5KCAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2NvbnRleHRMaW5lcyhsaW5lcykpKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciBfY3VyUmFuZ2UzO1xuXG5cdCAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyAvLyBlbmQgdGhlIHJhbmdlIGFuZCBvdXRwdXRcblx0ICAgICAgICAgIHZhciBjb250ZXh0U2l6ZSA9IE1hdGgubWluKGxpbmVzLmxlbmd0aCwgb3B0aW9ucy5jb250ZXh0KTtcblx0ICAgICAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oX2N1clJhbmdlMyA9IC8qaXN0YW5idWwgaWdub3JlIGVuZCovY3VyUmFuZ2UpLnB1c2guIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9hcHBseSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyggLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19jdXJSYW5nZTMgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8sIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fdG9Db25zdW1hYmxlQXJyYXkoIC8qaXN0YW5idWwgaWdub3JlIGVuZCovY29udGV4dExpbmVzKGxpbmVzLnNsaWNlKDAsIGNvbnRleHRTaXplKSkpKTtcblxuXHQgICAgICAgICAgdmFyIGh1bmsgPSB7XG5cdCAgICAgICAgICAgIG9sZFN0YXJ0OiBvbGRSYW5nZVN0YXJ0LFxuXHQgICAgICAgICAgICBvbGRMaW5lczogb2xkTGluZSAtIG9sZFJhbmdlU3RhcnQgKyBjb250ZXh0U2l6ZSxcblx0ICAgICAgICAgICAgbmV3U3RhcnQ6IG5ld1JhbmdlU3RhcnQsXG5cdCAgICAgICAgICAgIG5ld0xpbmVzOiBuZXdMaW5lIC0gbmV3UmFuZ2VTdGFydCArIGNvbnRleHRTaXplLFxuXHQgICAgICAgICAgICBsaW5lczogY3VyUmFuZ2Vcblx0ICAgICAgICAgIH07XG5cdCAgICAgICAgICBpZiAoaSA+PSBkaWZmLmxlbmd0aCAtIDIgJiYgbGluZXMubGVuZ3RoIDw9IG9wdGlvbnMuY29udGV4dCkge1xuXHQgICAgICAgICAgICAvLyBFT0YgaXMgaW5zaWRlIHRoaXMgaHVua1xuXHQgICAgICAgICAgICB2YXIgb2xkRU9GTmV3bGluZSA9IC9cXG4kLy50ZXN0KG9sZFN0cik7XG5cdCAgICAgICAgICAgIHZhciBuZXdFT0ZOZXdsaW5lID0gL1xcbiQvLnRlc3QobmV3U3RyKTtcblx0ICAgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA9PSAwICYmICFvbGRFT0ZOZXdsaW5lKSB7XG5cdCAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiBvbGQgaGFzIG5vIGVvbCBhbmQgbm8gdHJhaWxpbmcgY29udGV4dDsgbm8tbmwgY2FuIGVuZCB1cCBiZWZvcmUgYWRkc1xuXHQgICAgICAgICAgICAgIGN1clJhbmdlLnNwbGljZShodW5rLm9sZExpbmVzLCAwLCAnXFxcXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlJyk7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAoIW9sZEVPRk5ld2xpbmUgfHwgIW5ld0VPRk5ld2xpbmUpIHtcblx0ICAgICAgICAgICAgICBjdXJSYW5nZS5wdXNoKCdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgaHVua3MucHVzaChodW5rKTtcblxuXHQgICAgICAgICAgb2xkUmFuZ2VTdGFydCA9IDA7XG5cdCAgICAgICAgICBuZXdSYW5nZVN0YXJ0ID0gMDtcblx0ICAgICAgICAgIGN1clJhbmdlID0gW107XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIG9sZExpbmUgKz0gbGluZXMubGVuZ3RoO1xuXHQgICAgICBuZXdMaW5lICs9IGxpbmVzLmxlbmd0aDtcblx0ICAgIH1cblx0ICB9O1xuXG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaWZmLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2xvb3AoIC8qaXN0YW5idWwgaWdub3JlIGVuZCovaSk7XG5cdCAgfVxuXG5cdCAgcmV0dXJuIHtcblx0ICAgIG9sZEZpbGVOYW1lOiBvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWU6IG5ld0ZpbGVOYW1lLFxuXHQgICAgb2xkSGVhZGVyOiBvbGRIZWFkZXIsIG5ld0hlYWRlcjogbmV3SGVhZGVyLFxuXHQgICAgaHVua3M6IGh1bmtzXG5cdCAgfTtcblx0fVxuXG5cdGZ1bmN0aW9uIGNyZWF0ZVR3b0ZpbGVzUGF0Y2gob2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcblx0ICB2YXIgZGlmZiA9IHN0cnVjdHVyZWRQYXRjaChvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucyk7XG5cblx0ICB2YXIgcmV0ID0gW107XG5cdCAgaWYgKG9sZEZpbGVOYW1lID09IG5ld0ZpbGVOYW1lKSB7XG5cdCAgICByZXQucHVzaCgnSW5kZXg6ICcgKyBvbGRGaWxlTmFtZSk7XG5cdCAgfVxuXHQgIHJldC5wdXNoKCc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Jyk7XG5cdCAgcmV0LnB1c2goJy0tLSAnICsgZGlmZi5vbGRGaWxlTmFtZSArICh0eXBlb2YgZGlmZi5vbGRIZWFkZXIgPT09ICd1bmRlZmluZWQnID8gJycgOiAnXFx0JyArIGRpZmYub2xkSGVhZGVyKSk7XG5cdCAgcmV0LnB1c2goJysrKyAnICsgZGlmZi5uZXdGaWxlTmFtZSArICh0eXBlb2YgZGlmZi5uZXdIZWFkZXIgPT09ICd1bmRlZmluZWQnID8gJycgOiAnXFx0JyArIGRpZmYubmV3SGVhZGVyKSk7XG5cblx0ICBmb3IgKHZhciBpID0gMDsgaSA8IGRpZmYuaHVua3MubGVuZ3RoOyBpKyspIHtcblx0ICAgIHZhciBodW5rID0gZGlmZi5odW5rc1tpXTtcblx0ICAgIHJldC5wdXNoKCdAQCAtJyArIGh1bmsub2xkU3RhcnQgKyAnLCcgKyBodW5rLm9sZExpbmVzICsgJyArJyArIGh1bmsubmV3U3RhcnQgKyAnLCcgKyBodW5rLm5ld0xpbmVzICsgJyBAQCcpO1xuXHQgICAgcmV0LnB1c2guYXBwbHkocmV0LCBodW5rLmxpbmVzKTtcblx0ICB9XG5cblx0ICByZXR1cm4gcmV0LmpvaW4oJ1xcbicpICsgJ1xcbic7XG5cdH1cblxuXHRmdW5jdGlvbiBjcmVhdGVQYXRjaChmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSB7XG5cdCAgcmV0dXJuIGNyZWF0ZVR3b0ZpbGVzUGF0Y2goZmlsZU5hbWUsIGZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpO1xuXHR9XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OXdZWFJqYUM5amNtVmhkR1V1YW5NaVhTd2libUZ0WlhNaU9sc2ljM1J5ZFdOMGRYSmxaRkJoZEdOb0lpd2lZM0psWVhSbFZIZHZSbWxzWlhOUVlYUmphQ0lzSW1OeVpXRjBaVkJoZEdOb0lpd2liMnhrUm1sc1pVNWhiV1VpTENKdVpYZEdhV3hsVG1GdFpTSXNJbTlzWkZOMGNpSXNJbTVsZDFOMGNpSXNJbTlzWkVobFlXUmxjaUlzSW01bGQwaGxZV1JsY2lJc0ltOXdkR2x2Ym5NaUxDSmpiMjUwWlhoMElpd2laR2xtWmlJc0luQjFjMmdpTENKMllXeDFaU0lzSW14cGJtVnpJaXdpWTI5dWRHVjRkRXhwYm1Weklpd2liV0Z3SWl3aVpXNTBjbmtpTENKb2RXNXJjeUlzSW05c1pGSmhibWRsVTNSaGNuUWlMQ0p1WlhkU1lXNW5aVk4wWVhKMElpd2lZM1Z5VW1GdVoyVWlMQ0p2YkdSTWFXNWxJaXdpYm1WM1RHbHVaU0lzSW1raUxDSmpkWEp5Wlc1MElpd2ljbVZ3YkdGalpTSXNJbk53YkdsMElpd2lZV1JrWldRaUxDSnlaVzF2ZG1Wa0lpd2ljSEpsZGlJc0luTnNhV05sSWl3aWJHVnVaM1JvSWl3aVkyOXVkR1Y0ZEZOcGVtVWlMQ0pOWVhSb0lpd2liV2x1SWl3aWFIVnVheUlzSW05c1pGTjBZWEowSWl3aWIyeGtUR2x1WlhNaUxDSnVaWGRUZEdGeWRDSXNJbTVsZDB4cGJtVnpJaXdpYjJ4a1JVOUdUbVYzYkdsdVpTSXNJblJsYzNRaUxDSnVaWGRGVDBaT1pYZHNhVzVsSWl3aWMzQnNhV05sSWl3aWNtVjBJaXdpWVhCd2JIa2lMQ0pxYjJsdUlpd2labWxzWlU1aGJXVWlYU3dpYldGd2NHbHVaM01pT2lJN096dG5RMEZGWjBKQkxHVXNSMEZCUVVFc1pUdDVSRUZwUjBGRExHMUNMRWRCUVVGQkxHMUNPM2xFUVhkQ1FVTXNWeXhIUVVGQlFTeFhPenRCUVROSWFFSTdPenM3ZFVKQlJVOHNVMEZCVTBZc1pVRkJWQ3hEUVVGNVFrY3NWMEZCZWtJc1JVRkJjME5ETEZkQlFYUkRMRVZCUVcxRVF5eE5RVUZ1UkN4RlFVRXlSRU1zVFVGQk0wUXNSVUZCYlVWRExGTkJRVzVGTEVWQlFUaEZReXhUUVVFNVJTeEZRVUY1UmtNc1QwRkJla1lzUlVGQmEwYzdRVUZEZGtjc1RVRkJTU3hEUVVGRFFTeFBRVUZNTEVWQlFXTTdRVUZEV2tFc1kwRkJWU3hGUVVGV08wRkJRMFE3UVVGRFJDeE5RVUZKTEU5QlFVOUJMRkZCUVZGRExFOUJRV1lzUzBGQk1rSXNWMEZCTDBJc1JVRkJORU03UVVGRE1VTkVMRmxCUVZGRExFOUJRVklzUjBGQmEwSXNRMEZCYkVJN1FVRkRSRHM3UVVGRlJDeE5RVUZOUXl4UFFVRlBMSE5GUVVGVlRpeE5RVUZXTEVWQlFXdENReXhOUVVGc1FpeEZRVUV3UWtjc1QwRkJNVUlzUTBGQllqdEJRVU5CUlN4UFFVRkxReXhKUVVGTUxFTkJRVlVzUlVGQlEwTXNUMEZCVHl4RlFVRlNMRVZCUVZsRExFOUJRVThzUlVGQmJrSXNSVUZCVml4RlFWUjFSeXhEUVZOc1JUczdRVUZGY2tNc1YwRkJVME1zV1VGQlZDeERRVUZ6UWtRc1MwRkJkRUlzUlVGQk5rSTdRVUZETTBJc1YwRkJUMEVzVFVGQlRVVXNSMEZCVGl4RFFVRlZMRlZCUVZORExFdEJRVlFzUlVGQlowSTdRVUZCUlN4aFFVRlBMRTFCUVUxQkxFdEJRV0k3UVVGQmNVSXNTMEZCYWtRc1EwRkJVRHRCUVVORU96dEJRVVZFTEUxQlFVbERMRkZCUVZFc1JVRkJXanRCUVVOQkxFMUJRVWxETEdkQ1FVRm5RaXhEUVVGd1FqdEJRVUZCTEUxQlFYVkNReXhuUWtGQlowSXNRMEZCZGtNN1FVRkJRU3hOUVVFd1EwTXNWMEZCVnl4RlFVRnlSRHRCUVVGQkxFMUJRMGxETEZWQlFWVXNRMEZFWkR0QlFVRkJMRTFCUTJsQ1F5eFZRVUZWTEVOQlJETkNPenRCUVdoQ2RVY3NPRVZCYTBJNVJrTXNRMEZzUWpoR08wRkJiVUp5Unl4UlFVRk5ReXhWUVVGVlpDeExRVUZMWVN4RFFVRk1MRU5CUVdoQ08wRkJRVUVzVVVGRFRWWXNVVUZCVVZjc1VVRkJVVmdzUzBGQlVpeEpRVUZwUWxjc1VVRkJVVm9zUzBGQlVpeERRVUZqWVN4UFFVRmtMRU5CUVhOQ0xFdEJRWFJDTEVWQlFUWkNMRVZCUVRkQ0xFVkJRV2xEUXl4TFFVRnFReXhEUVVGMVF5eEpRVUYyUXl4RFFVUXZRanRCUVVWQlJpeFpRVUZSV0N4TFFVRlNMRWRCUVdkQ1FTeExRVUZvUWpzN1FVRkZRU3hSUVVGSlZ5eFJRVUZSUnl4TFFVRlNMRWxCUVdsQ1NDeFJRVUZSU1N4UFFVRTNRaXhGUVVGelF6dEJRVUZCT3p0QlFVRkJMRGhDUVVOd1F6dEJRVU5CTEZWQlFVa3NRMEZCUTFZc1lVRkJUQ3hGUVVGdlFqdEJRVU5zUWl4WlFVRk5WeXhQUVVGUGJrSXNTMEZCUzJFc1NVRkJTU3hEUVVGVUxFTkJRV0k3UVVGRFFVd3NkMEpCUVdkQ1J5eFBRVUZvUWp0QlFVTkJSaXgzUWtGQlowSkhMRTlCUVdoQ096dEJRVVZCTEZsQlFVbFBMRWxCUVVvc1JVRkJWVHRCUVVOU1ZDeHhRa0ZCVjFvc1VVRkJVVU1zVDBGQlVpeEhRVUZyUWl4RFFVRnNRaXhIUVVGelFrc3NZVUZCWVdVc1MwRkJTMmhDTEV0QlFVd3NRMEZCVjJsQ0xFdEJRVmdzUTBGQmFVSXNRMEZCUTNSQ0xGRkJRVkZETEU5QlFURkNMRU5CUVdJc1EwRkJkRUlzUjBGQmVVVXNSVUZCY0VZN1FVRkRRVk1zTWtKQlFXbENSU3hUUVVGVFZ5eE5RVUV4UWp0QlFVTkJXaXd5UWtGQmFVSkRMRk5CUVZOWExFMUJRVEZDTzBGQlEwUTdRVUZEUmpzN1FVRkZSRHRCUVVOQkxEWkZRVUZUY0VJc1NVRkJWQ3d3VEVGQmEwSkZMRTFCUVUxRkxFZEJRVTRzUTBGQlZTeFZRVUZUUXl4TFFVRlVMRVZCUVdkQ08wRkJRekZETEdWQlFVOHNRMEZCUTFFc1VVRkJVVWNzUzBGQlVpeEhRVUZuUWl4SFFVRm9RaXhIUVVGelFpeEhRVUYyUWl4SlFVRTRRbGdzUzBGQmNrTTdRVUZEUkN4UFFVWnBRaXhEUVVGc1FqczdRVUZKUVR0QlFVTkJMRlZCUVVsUkxGRkJRVkZITEV0QlFWb3NSVUZCYlVJN1FVRkRha0pNTEcxQ1FVRlhWQ3hOUVVGTmEwSXNUVUZCYWtJN1FVRkRSQ3hQUVVaRUxFMUJSVTg3UVVGRFRGWXNiVUpCUVZkU0xFMUJRVTFyUWl4TlFVRnFRanRCUVVORU8wRkJRMFlzUzBGNlFrUXNUVUY1UWs4N1FVRkRURHRCUVVOQkxGVkJRVWxpTEdGQlFVb3NSVUZCYlVJN1FVRkRha0k3UVVGRFFTeFpRVUZKVEN4TlFVRk5hMElzVFVGQlRpeEpRVUZuUW5aQ0xGRkJRVkZETEU5QlFWSXNSMEZCYTBJc1EwRkJiRU1zU1VGQmRVTmpMRWxCUVVsaUxFdEJRVXR4UWl4TlFVRk1MRWRCUVdNc1EwRkJOMFFzUlVGQlowVTdRVUZCUVRzN1FVRkJRU3hyUTBGRE9VUTdRVUZEUVN4clJrRkJVM0JDTEVsQlFWUXNNa3hCUVd0Q1J5eGhRVUZoUkN4TFFVRmlMRU5CUVd4Q08wRkJRMFFzVTBGSVJDeE5RVWRQTzBGQlFVRTdPMEZCUVVFc2EwTkJRMHc3UVVGRFFTeGpRVUZKYlVJc1kwRkJZME1zUzBGQlMwTXNSMEZCVEN4RFFVRlRja0lzVFVGQlRXdENMRTFCUVdZc1JVRkJkVUoyUWl4UlFVRlJReXhQUVVFdlFpeERRVUZzUWp0QlFVTkJMR3RHUVVGVFJTeEpRVUZVTERKTVFVRnJRa2NzWVVGQllVUXNUVUZCVFdsQ0xFdEJRVTRzUTBGQldTeERRVUZhTEVWQlFXVkZMRmRCUVdZc1EwRkJZaXhEUVVGc1FqczdRVUZGUVN4alFVRkpSeXhQUVVGUE8wRkJRMVJETEhOQ1FVRlZiRUlzWVVGRVJEdEJRVVZVYlVJc2MwSkJRVmRvUWl4VlFVRlZTQ3hoUVVGV0xFZEJRVEJDWXl4WFFVWTFRanRCUVVkVVRTeHpRa0ZCVlc1Q0xHRkJTRVE3UVVGSlZHOUNMSE5DUVVGWGFrSXNWVUZCVlVnc1lVRkJWaXhIUVVFd1FtRXNWMEZLTlVJN1FVRkxWRzVDTEcxQ1FVRlBUenRCUVV4RkxGZEJRVmc3UVVGUFFTeGpRVUZKUnl4TFFVRkxZaXhMUVVGTGNVSXNUVUZCVEN4SFFVRmpMRU5CUVc1Q0xFbEJRWGRDYkVJc1RVRkJUV3RDTEUxQlFVNHNTVUZCWjBKMlFpeFJRVUZSUXl4UFFVRndSQ3hGUVVFMlJEdEJRVU16UkR0QlFVTkJMR2RDUVVGSkswSXNaMEpCUVdsQ0xFMUJRVTFETEVsQlFVNHNRMEZCVjNKRExFMUJRVmdzUTBGQmNrSTdRVUZEUVN4blFrRkJTWE5ETEdkQ1FVRnBRaXhOUVVGTlJDeEpRVUZPTEVOQlFWZHdReXhOUVVGWUxFTkJRWEpDTzBGQlEwRXNaMEpCUVVsUkxFMUJRVTFyUWl4TlFVRk9MRWxCUVdkQ0xFTkJRV2hDTEVsQlFYRkNMRU5CUVVOVExHRkJRVEZDTEVWQlFYbERPMEZCUTNaRE8wRkJRMEZ3UWl4MVFrRkJVM1ZDTEUxQlFWUXNRMEZCWjBKU0xFdEJRVXRGTEZGQlFYSkNMRVZCUVN0Q0xFTkJRUzlDTEVWQlFXdERMRGhDUVVGc1F6dEJRVU5FTEdGQlNFUXNUVUZIVHl4SlFVRkpMRU5CUVVOSExHRkJRVVFzU1VGQmEwSXNRMEZCUTBVc1lVRkJka0lzUlVGQmMwTTdRVUZETTBOMFFpeDFRa0ZCVTFRc1NVRkJWQ3hEUVVGakxEaENRVUZrTzBGQlEwUTdRVUZEUmp0QlFVTkVUU3huUWtGQlRVNHNTVUZCVGl4RFFVRlhkMElzU1VGQldEczdRVUZGUVdwQ0xEQkNRVUZuUWl4RFFVRm9RanRCUVVOQlF5d3dRa0ZCWjBJc1EwRkJhRUk3UVVGRFFVTXNjVUpCUVZjc1JVRkJXRHRCUVVORU8wRkJRMFk3UVVGRFJFTXNhVUpCUVZkU0xFMUJRVTFyUWl4TlFVRnFRanRCUVVOQlZDeHBRa0ZCVjFRc1RVRkJUV3RDTEUxQlFXcENPMEZCUTBRN1FVRjJSbTlIT3p0QlFXdENka2NzVDBGQlN5eEpRVUZKVWl4SlFVRkpMRU5CUVdJc1JVRkJaMEpCTEVsQlFVbGlMRXRCUVV0eFFpeE5RVUY2UWl4RlFVRnBRMUlzUjBGQmFrTXNSVUZCYzBNN1FVRkJRU3d5UkVGQk4wSkJMRU5CUVRaQ08wRkJjMFZ5UXpzN1FVRkZSQ3hUUVVGUE8wRkJRMHh5UWl4cFFrRkJZVUVzVjBGRVVpeEZRVU54UWtNc1lVRkJZVUVzVjBGRWJFTTdRVUZGVEVjc1pVRkJWMEVzVTBGR1RpeEZRVVZwUWtNc1YwRkJWMEVzVTBGR05VSTdRVUZIVEZVc1YwRkJUMEU3UVVGSVJpeEhRVUZRTzBGQlMwUTdPMEZCUlUwc1UwRkJVMnBDTEcxQ1FVRlVMRU5CUVRaQ1JTeFhRVUUzUWl4RlFVRXdRME1zVjBGQk1VTXNSVUZCZFVSRExFMUJRWFpFTEVWQlFTdEVReXhOUVVFdlJDeEZRVUYxUlVNc1UwRkJka1VzUlVGQmEwWkRMRk5CUVd4R0xFVkJRVFpHUXl4UFFVRTNSaXhGUVVGelJ6dEJRVU16Unl4TlFVRk5SU3hQUVVGUFdDeG5Ra0ZCWjBKSExGZEJRV2hDTEVWQlFUWkNReXhYUVVFM1FpeEZRVUV3UTBNc1RVRkJNVU1zUlVGQmEwUkRMRTFCUVd4RUxFVkJRVEJFUXl4VFFVRXhSQ3hGUVVGeFJVTXNVMEZCY2tVc1JVRkJaMFpETEU5QlFXaEdMRU5CUVdJN08wRkJSVUVzVFVGQlRXOURMRTFCUVUwc1JVRkJXanRCUVVOQkxFMUJRVWt4UXl4bFFVRmxReXhYUVVGdVFpeEZRVUZuUXp0QlFVTTVRbmxETEZGQlFVbHFReXhKUVVGS0xFTkJRVk1zV1VGQldWUXNWMEZCY2tJN1FVRkRSRHRCUVVORU1FTXNUVUZCU1dwRExFbEJRVW9zUTBGQlV5eHhSVUZCVkR0QlFVTkJhVU1zVFVGQlNXcERMRWxCUVVvc1EwRkJVeXhUUVVGVFJDeExRVUZMVWl4WFFVRmtMRWxCUVRaQ0xFOUJRVTlSTEV0QlFVdEtMRk5CUVZvc1MwRkJNRUlzVjBGQk1VSXNSMEZCZDBNc1JVRkJlRU1zUjBGQk5rTXNUMEZCVDBrc1MwRkJTMG9zVTBGQmRFWXNRMEZCVkR0QlFVTkJjME1zVFVGQlNXcERMRWxCUVVvc1EwRkJVeXhUUVVGVFJDeExRVUZMVUN4WFFVRmtMRWxCUVRaQ0xFOUJRVTlQTEV0QlFVdElMRk5CUVZvc1MwRkJNRUlzVjBGQk1VSXNSMEZCZDBNc1JVRkJlRU1zUjBGQk5rTXNUMEZCVDBjc1MwRkJTMGdzVTBGQmRFWXNRMEZCVkRzN1FVRkZRU3hQUVVGTExFbEJRVWxuUWl4SlFVRkpMRU5CUVdJc1JVRkJaMEpCTEVsQlFVbGlMRXRCUVV0UExFdEJRVXdzUTBGQlYyTXNUVUZCTDBJc1JVRkJkVU5TTEVkQlFYWkRMRVZCUVRSRE8wRkJRekZETEZGQlFVMVpMRTlCUVU5NlFpeExRVUZMVHl4TFFVRk1MRU5CUVZkTkxFTkJRVmdzUTBGQllqdEJRVU5CY1VJc1VVRkJTV3BETEVsQlFVb3NRMEZEUlN4VFFVRlRkMElzUzBGQlMwTXNVVUZCWkN4SFFVRjVRaXhIUVVGNlFpeEhRVUVyUWtRc1MwRkJTMFVzVVVGQmNFTXNSMEZEUlN4SlFVUkdMRWRCUTFOR0xFdEJRVXRITEZGQlJHUXNSMEZEZVVJc1IwRkVla0lzUjBGREswSklMRXRCUVV0SkxGRkJSSEJETEVkQlJVVXNTMEZJU2p0QlFVdEJTeXhSUVVGSmFrTXNTVUZCU2l4RFFVRlRhME1zUzBGQlZDeERRVUZsUkN4SFFVRm1MRVZCUVc5Q1ZDeExRVUZMZEVJc1MwRkJla0k3UVVGRFJEczdRVUZGUkN4VFFVRlBLMElzU1VGQlNVVXNTVUZCU2l4RFFVRlRMRWxCUVZRc1NVRkJhVUlzU1VGQmVFSTdRVUZEUkRzN1FVRkZUU3hUUVVGVE4wTXNWMEZCVkN4RFFVRnhRamhETEZGQlFYSkNMRVZCUVN0Q00wTXNUVUZCTDBJc1JVRkJkVU5ETEUxQlFYWkRMRVZCUVN0RFF5eFRRVUV2UXl4RlFVRXdSRU1zVTBGQk1VUXNSVUZCY1VWRExFOUJRWEpGTEVWQlFUaEZPMEZCUTI1R0xGTkJRVTlTTEc5Q1FVRnZRaXRETEZGQlFYQkNMRVZCUVRoQ1FTeFJRVUU1UWl4RlFVRjNRek5ETEUxQlFYaERMRVZCUVdkRVF5eE5RVUZvUkN4RlFVRjNSRU1zVTBGQmVFUXNSVUZCYlVWRExGTkJRVzVGTEVWQlFUaEZReXhQUVVFNVJTeERRVUZRTzBGQlEwUWlMQ0ptYVd4bElqb2lZM0psWVhSbExtcHpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpYVcxd2IzSjBJSHRrYVdabVRHbHVaWE45SUdaeWIyMGdKeTR1TDJScFptWXZiR2x1WlNjN1hHNWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQnpkSEoxWTNSMWNtVmtVR0YwWTJnb2IyeGtSbWxzWlU1aGJXVXNJRzVsZDBacGJHVk9ZVzFsTENCdmJHUlRkSElzSUc1bGQxTjBjaXdnYjJ4a1NHVmhaR1Z5TENCdVpYZElaV0ZrWlhJc0lHOXdkR2x2Ym5NcElIdGNiaUFnYVdZZ0tDRnZjSFJwYjI1ektTQjdYRzRnSUNBZ2IzQjBhVzl1Y3lBOUlIdDlPMXh1SUNCOVhHNGdJR2xtSUNoMGVYQmxiMllnYjNCMGFXOXVjeTVqYjI1MFpYaDBJRDA5UFNBbmRXNWtaV1pwYm1Wa0p5a2dlMXh1SUNBZ0lHOXdkR2x2Ym5NdVkyOXVkR1Y0ZENBOUlEUTdYRzRnSUgxY2JseHVJQ0JqYjI1emRDQmthV1ptSUQwZ1pHbG1aa3hwYm1WektHOXNaRk4wY2l3Z2JtVjNVM1J5TENCdmNIUnBiMjV6S1R0Y2JpQWdaR2xtWmk1d2RYTm9LSHQyWVd4MVpUb2dKeWNzSUd4cGJtVnpPaUJiWFgwcE95QWdJQzh2SUVGd2NHVnVaQ0JoYmlCbGJYQjBlU0IyWVd4MVpTQjBieUJ0WVd0bElHTnNaV0Z1ZFhBZ1pXRnphV1Z5WEc1Y2JpQWdablZ1WTNScGIyNGdZMjl1ZEdWNGRFeHBibVZ6S0d4cGJtVnpLU0I3WEc0Z0lDQWdjbVYwZFhKdUlHeHBibVZ6TG0xaGNDaG1kVzVqZEdsdmJpaGxiblJ5ZVNrZ2V5QnlaWFIxY200Z0p5QW5JQ3NnWlc1MGNuazdJSDBwTzF4dUlDQjlYRzVjYmlBZ2JHVjBJR2gxYm10eklEMGdXMTA3WEc0Z0lHeGxkQ0J2YkdSU1lXNW5aVk4wWVhKMElEMGdNQ3dnYm1WM1VtRnVaMlZUZEdGeWRDQTlJREFzSUdOMWNsSmhibWRsSUQwZ1cxMHNYRzRnSUNBZ0lDQnZiR1JNYVc1bElEMGdNU3dnYm1WM1RHbHVaU0E5SURFN1hHNGdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnWkdsbVppNXNaVzVuZEdnN0lHa3JLeWtnZTF4dUlDQWdJR052Ym5OMElHTjFjbkpsYm5RZ1BTQmthV1ptVzJsZExGeHVJQ0FnSUNBZ0lDQWdJR3hwYm1WeklEMGdZM1Z5Y21WdWRDNXNhVzVsY3lCOGZDQmpkWEp5Wlc1MExuWmhiSFZsTG5KbGNHeGhZMlVvTDF4Y2JpUXZMQ0FuSnlrdWMzQnNhWFFvSjF4Y2JpY3BPMXh1SUNBZ0lHTjFjbkpsYm5RdWJHbHVaWE1nUFNCc2FXNWxjenRjYmx4dUlDQWdJR2xtSUNoamRYSnlaVzUwTG1Ga1pHVmtJSHg4SUdOMWNuSmxiblF1Y21WdGIzWmxaQ2tnZTF4dUlDQWdJQ0FnTHk4Z1NXWWdkMlVnYUdGMlpTQndjbVYyYVc5MWN5QmpiMjUwWlhoMExDQnpkR0Z5ZENCM2FYUm9JSFJvWVhSY2JpQWdJQ0FnSUdsbUlDZ2hiMnhrVW1GdVoyVlRkR0Z5ZENrZ2UxeHVJQ0FnSUNBZ0lDQmpiMjV6ZENCd2NtVjJJRDBnWkdsbVpsdHBJQzBnTVYwN1hHNGdJQ0FnSUNBZ0lHOXNaRkpoYm1kbFUzUmhjblFnUFNCdmJHUk1hVzVsTzF4dUlDQWdJQ0FnSUNCdVpYZFNZVzVuWlZOMFlYSjBJRDBnYm1WM1RHbHVaVHRjYmx4dUlDQWdJQ0FnSUNCcFppQW9jSEpsZGlrZ2UxeHVJQ0FnSUNBZ0lDQWdJR04xY2xKaGJtZGxJRDBnYjNCMGFXOXVjeTVqYjI1MFpYaDBJRDRnTUNBL0lHTnZiblJsZUhSTWFXNWxjeWh3Y21WMkxteHBibVZ6TG5Oc2FXTmxLQzF2Y0hScGIyNXpMbU52Ym5SbGVIUXBLU0E2SUZ0ZE8xeHVJQ0FnSUNBZ0lDQWdJRzlzWkZKaGJtZGxVM1JoY25RZ0xUMGdZM1Z5VW1GdVoyVXViR1Z1WjNSb08xeHVJQ0FnSUNBZ0lDQWdJRzVsZDFKaGJtZGxVM1JoY25RZ0xUMGdZM1Z5VW1GdVoyVXViR1Z1WjNSb08xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQzh2SUU5MWRIQjFkQ0J2ZFhJZ1kyaGhibWRsYzF4dUlDQWdJQ0FnWTNWeVVtRnVaMlV1Y0hWemFDZ3VMaTRnYkdsdVpYTXViV0Z3S0daMWJtTjBhVzl1S0dWdWRISjVLU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUFvWTNWeWNtVnVkQzVoWkdSbFpDQS9JQ2NySnlBNklDY3RKeWtnS3lCbGJuUnllVHRjYmlBZ0lDQWdJSDBwS1R0Y2JseHVJQ0FnSUNBZ0x5OGdWSEpoWTJzZ2RHaGxJSFZ3WkdGMFpXUWdabWxzWlNCd2IzTnBkR2x2Ymx4dUlDQWdJQ0FnYVdZZ0tHTjFjbkpsYm5RdVlXUmtaV1FwSUh0Y2JpQWdJQ0FnSUNBZ2JtVjNUR2x1WlNBclBTQnNhVzVsY3k1c1pXNW5kR2c3WEc0Z0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0J2YkdSTWFXNWxJQ3M5SUd4cGJtVnpMbXhsYm1kMGFEdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnTHk4Z1NXUmxiblJwWTJGc0lHTnZiblJsZUhRZ2JHbHVaWE11SUZSeVlXTnJJR3hwYm1VZ1kyaGhibWRsYzF4dUlDQWdJQ0FnYVdZZ0tHOXNaRkpoYm1kbFUzUmhjblFwSUh0Y2JpQWdJQ0FnSUNBZ0x5OGdRMnh2YzJVZ2IzVjBJR0Z1ZVNCamFHRnVaMlZ6SUhSb1lYUWdhR0YyWlNCaVpXVnVJRzkxZEhCMWRDQW9iM0lnYW05cGJpQnZkbVZ5YkdGd2NHbHVaeWxjYmlBZ0lDQWdJQ0FnYVdZZ0tHeHBibVZ6TG14bGJtZDBhQ0E4UFNCdmNIUnBiMjV6TG1OdmJuUmxlSFFnS2lBeUlDWW1JR2tnUENCa2FXWm1MbXhsYm1kMGFDQXRJRElwSUh0Y2JpQWdJQ0FnSUNBZ0lDQXZMeUJQZG1WeWJHRndjR2x1WjF4dUlDQWdJQ0FnSUNBZ0lHTjFjbEpoYm1kbExuQjFjMmdvTGk0dUlHTnZiblJsZUhSTWFXNWxjeWhzYVc1bGN5a3BPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUM4dklHVnVaQ0IwYUdVZ2NtRnVaMlVnWVc1a0lHOTFkSEIxZEZ4dUlDQWdJQ0FnSUNBZ0lHeGxkQ0JqYjI1MFpYaDBVMmw2WlNBOUlFMWhkR2d1YldsdUtHeHBibVZ6TG14bGJtZDBhQ3dnYjNCMGFXOXVjeTVqYjI1MFpYaDBLVHRjYmlBZ0lDQWdJQ0FnSUNCamRYSlNZVzVuWlM1d2RYTm9LQzR1TGlCamIyNTBaWGgwVEdsdVpYTW9iR2x1WlhNdWMyeHBZMlVvTUN3Z1kyOXVkR1Y0ZEZOcGVtVXBLU2s3WEc1Y2JpQWdJQ0FnSUNBZ0lDQnNaWFFnYUhWdWF5QTlJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHOXNaRk4wWVhKME9pQnZiR1JTWVc1blpWTjBZWEowTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdiMnhrVEdsdVpYTTZJQ2h2YkdSTWFXNWxJQzBnYjJ4a1VtRnVaMlZUZEdGeWRDQXJJR052Ym5SbGVIUlRhWHBsS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJRzVsZDFOMFlYSjBPaUJ1WlhkU1lXNW5aVk4wWVhKMExGeHVJQ0FnSUNBZ0lDQWdJQ0FnYm1WM1RHbHVaWE02SUNodVpYZE1hVzVsSUMwZ2JtVjNVbUZ1WjJWVGRHRnlkQ0FySUdOdmJuUmxlSFJUYVhwbEtTeGNiaUFnSUNBZ0lDQWdJQ0FnSUd4cGJtVnpPaUJqZFhKU1lXNW5aVnh1SUNBZ0lDQWdJQ0FnSUgwN1hHNGdJQ0FnSUNBZ0lDQWdhV1lnS0drZ1BqMGdaR2xtWmk1c1pXNW5kR2dnTFNBeUlDWW1JR3hwYm1WekxteGxibWQwYUNBOFBTQnZjSFJwYjI1ekxtTnZiblJsZUhRcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklFVlBSaUJwY3lCcGJuTnBaR1VnZEdocGN5Qm9kVzVyWEc0Z0lDQWdJQ0FnSUNBZ0lDQnNaWFFnYjJ4a1JVOUdUbVYzYkdsdVpTQTlJQ2d2WEZ4dUpDOHVkR1Z6ZENodmJHUlRkSElwS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJR3hsZENCdVpYZEZUMFpPWlhkc2FXNWxJRDBnS0M5Y1hHNGtMeTUwWlhOMEtHNWxkMU4wY2lrcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHeHBibVZ6TG14bGJtZDBhQ0E5UFNBd0lDWW1JQ0Z2YkdSRlQwWk9aWGRzYVc1bEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJSE53WldOcFlXd2dZMkZ6WlRvZ2IyeGtJR2hoY3lCdWJ5QmxiMndnWVc1a0lHNXZJSFJ5WVdsc2FXNW5JR052Ym5SbGVIUTdJRzV2TFc1c0lHTmhiaUJsYm1RZ2RYQWdZbVZtYjNKbElHRmtaSE5jYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdZM1Z5VW1GdVoyVXVjM0JzYVdObEtHaDFibXN1YjJ4a1RHbHVaWE1zSURBc0lDZGNYRnhjSUU1dklHNWxkMnhwYm1VZ1lYUWdaVzVrSUc5bUlHWnBiR1VuS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQnBaaUFvSVc5c1pFVlBSazVsZDJ4cGJtVWdmSHdnSVc1bGQwVlBSazVsZDJ4cGJtVXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdZM1Z5VW1GdVoyVXVjSFZ6YUNnblhGeGNYQ0JPYnlCdVpYZHNhVzVsSUdGMElHVnVaQ0J2WmlCbWFXeGxKeWs3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lHaDFibXR6TG5CMWMyZ29hSFZ1YXlrN1hHNWNiaUFnSUNBZ0lDQWdJQ0J2YkdSU1lXNW5aVk4wWVhKMElEMGdNRHRjYmlBZ0lDQWdJQ0FnSUNCdVpYZFNZVzVuWlZOMFlYSjBJRDBnTUR0Y2JpQWdJQ0FnSUNBZ0lDQmpkWEpTWVc1blpTQTlJRnRkTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCdmJHUk1hVzVsSUNzOUlHeHBibVZ6TG14bGJtZDBhRHRjYmlBZ0lDQWdJRzVsZDB4cGJtVWdLejBnYkdsdVpYTXViR1Z1WjNSb08xeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lISmxkSFZ5YmlCN1hHNGdJQ0FnYjJ4a1JtbHNaVTVoYldVNklHOXNaRVpwYkdWT1lXMWxMQ0J1WlhkR2FXeGxUbUZ0WlRvZ2JtVjNSbWxzWlU1aGJXVXNYRzRnSUNBZ2IyeGtTR1ZoWkdWeU9pQnZiR1JJWldGa1pYSXNJRzVsZDBobFlXUmxjam9nYm1WM1NHVmhaR1Z5TEZ4dUlDQWdJR2gxYm10ek9pQm9kVzVyYzF4dUlDQjlPMXh1ZlZ4dVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1kzSmxZWFJsVkhkdlJtbHNaWE5RWVhSamFDaHZiR1JHYVd4bFRtRnRaU3dnYm1WM1JtbHNaVTVoYldVc0lHOXNaRk4wY2l3Z2JtVjNVM1J5TENCdmJHUklaV0ZrWlhJc0lHNWxkMGhsWVdSbGNpd2diM0IwYVc5dWN5a2dlMXh1SUNCamIyNXpkQ0JrYVdabUlEMGdjM1J5ZFdOMGRYSmxaRkJoZEdOb0tHOXNaRVpwYkdWT1lXMWxMQ0J1WlhkR2FXeGxUbUZ0WlN3Z2IyeGtVM1J5TENCdVpYZFRkSElzSUc5c1pFaGxZV1JsY2l3Z2JtVjNTR1ZoWkdWeUxDQnZjSFJwYjI1ektUdGNibHh1SUNCamIyNXpkQ0J5WlhRZ1BTQmJYVHRjYmlBZ2FXWWdLRzlzWkVacGJHVk9ZVzFsSUQwOUlHNWxkMFpwYkdWT1lXMWxLU0I3WEc0Z0lDQWdjbVYwTG5CMWMyZ29KMGx1WkdWNE9pQW5JQ3NnYjJ4a1JtbHNaVTVoYldVcE8xeHVJQ0I5WEc0Z0lISmxkQzV3ZFhOb0tDYzlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5SnlrN1hHNGdJSEpsZEM1d2RYTm9LQ2N0TFMwZ0p5QXJJR1JwWm1ZdWIyeGtSbWxzWlU1aGJXVWdLeUFvZEhsd1pXOW1JR1JwWm1ZdWIyeGtTR1ZoWkdWeUlEMDlQU0FuZFc1a1pXWnBibVZrSnlBL0lDY25JRG9nSjF4Y2RDY2dLeUJrYVdabUxtOXNaRWhsWVdSbGNpa3BPMXh1SUNCeVpYUXVjSFZ6YUNnbkt5c3JJQ2NnS3lCa2FXWm1MbTVsZDBacGJHVk9ZVzFsSUNzZ0tIUjVjR1Z2WmlCa2FXWm1MbTVsZDBobFlXUmxjaUE5UFQwZ0ozVnVaR1ZtYVc1bFpDY2dQeUFuSnlBNklDZGNYSFFuSUNzZ1pHbG1aaTV1WlhkSVpXRmtaWElwS1R0Y2JseHVJQ0JtYjNJZ0tHeGxkQ0JwSUQwZ01Ec2dhU0E4SUdScFptWXVhSFZ1YTNNdWJHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQmpiMjV6ZENCb2RXNXJJRDBnWkdsbVppNW9kVzVyYzF0cFhUdGNiaUFnSUNCeVpYUXVjSFZ6YUNoY2JpQWdJQ0FnSUNkQVFDQXRKeUFySUdoMWJtc3ViMnhrVTNSaGNuUWdLeUFuTENjZ0t5Qm9kVzVyTG05c1pFeHBibVZ6WEc0Z0lDQWdJQ0FySUNjZ0t5Y2dLeUJvZFc1ckxtNWxkMU4wWVhKMElDc2dKeXduSUNzZ2FIVnVheTV1WlhkTWFXNWxjMXh1SUNBZ0lDQWdLeUFuSUVCQUoxeHVJQ0FnSUNrN1hHNGdJQ0FnY21WMExuQjFjMmd1WVhCd2JIa29jbVYwTENCb2RXNXJMbXhwYm1WektUdGNiaUFnZlZ4dVhHNGdJSEpsZEhWeWJpQnlaWFF1YW05cGJpZ25YRnh1SnlrZ0t5QW5YRnh1Snp0Y2JuMWNibHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR055WldGMFpWQmhkR05vS0dacGJHVk9ZVzFsTENCdmJHUlRkSElzSUc1bGQxTjBjaXdnYjJ4a1NHVmhaR1Z5TENCdVpYZElaV0ZrWlhJc0lHOXdkR2x2Ym5NcElIdGNiaUFnY21WMGRYSnVJR055WldGMFpWUjNiMFpwYkdWelVHRjBZMmdvWm1sc1pVNWhiV1VzSUdacGJHVk9ZVzFsTENCdmJHUlRkSElzSUc1bGQxTjBjaXdnYjJ4a1NHVmhaR1Z5TENCdVpYZElaV0ZrWlhJc0lHOXdkR2x2Ym5NcE8xeHVmVnh1SWwxOVxuXG5cbi8qKiovIH0pLFxuLyogMTUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXCJ1c2Ugc3RyaWN0XCI7XG5cblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9hcnJheUVxdWFsID0gYXJyYXlFcXVhbDtcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovYXJyYXlTdGFydHNXaXRoID0gYXJyYXlTdGFydHNXaXRoO1xuXHRmdW5jdGlvbiBhcnJheUVxdWFsKGEsIGIpIHtcblx0ICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG5cdCAgICByZXR1cm4gZmFsc2U7XG5cdCAgfVxuXG5cdCAgcmV0dXJuIGFycmF5U3RhcnRzV2l0aChhLCBiKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGFycmF5U3RhcnRzV2l0aChhcnJheSwgc3RhcnQpIHtcblx0ICBpZiAoc3RhcnQubGVuZ3RoID4gYXJyYXkubGVuZ3RoKSB7XG5cdCAgICByZXR1cm4gZmFsc2U7XG5cdCAgfVxuXG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGFydC5sZW5ndGg7IGkrKykge1xuXHQgICAgaWYgKHN0YXJ0W2ldICE9PSBhcnJheVtpXSkge1xuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgcmV0dXJuIHRydWU7XG5cdH1cblx0Ly8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5MWRHbHNMMkZ5Y21GNUxtcHpJbDBzSW01aGJXVnpJanBiSW1GeWNtRjVSWEYxWVd3aUxDSmhjbkpoZVZOMFlYSjBjMWRwZEdnaUxDSmhJaXdpWWlJc0lteGxibWQwYUNJc0ltRnljbUY1SWl3aWMzUmhjblFpTENKcElsMHNJbTFoY0hCcGJtZHpJam9pT3pzN1owTkJRV2RDUVN4VkxFZEJRVUZCTEZVN2VVUkJVVUZETEdVc1IwRkJRVUVzWlR0QlFWSlVMRk5CUVZORUxGVkJRVlFzUTBGQmIwSkZMRU5CUVhCQ0xFVkJRWFZDUXl4RFFVRjJRaXhGUVVFd1FqdEJRVU12UWl4TlFVRkpSQ3hGUVVGRlJTeE5RVUZHTEV0QlFXRkVMRVZCUVVWRExFMUJRVzVDTEVWQlFUSkNPMEZCUTNwQ0xGZEJRVThzUzBGQlVEdEJRVU5FT3p0QlFVVkVMRk5CUVU5SUxHZENRVUZuUWtNc1EwRkJhRUlzUlVGQmJVSkRMRU5CUVc1Q0xFTkJRVkE3UVVGRFJEczdRVUZGVFN4VFFVRlRSaXhsUVVGVUxFTkJRWGxDU1N4TFFVRjZRaXhGUVVGblEwTXNTMEZCYUVNc1JVRkJkVU03UVVGRE5VTXNUVUZCU1VFc1RVRkJUVVlzVFVGQlRpeEhRVUZsUXl4TlFVRk5SQ3hOUVVGNlFpeEZRVUZwUXp0QlFVTXZRaXhYUVVGUExFdEJRVkE3UVVGRFJEczdRVUZGUkN4UFFVRkxMRWxCUVVsSExFbEJRVWtzUTBGQllpeEZRVUZuUWtFc1NVRkJTVVFzVFVGQlRVWXNUVUZCTVVJc1JVRkJhME5ITEVkQlFXeERMRVZCUVhWRE8wRkJRM0pETEZGQlFVbEVMRTFCUVUxRExFTkJRVTRzVFVGQllVWXNUVUZCVFVVc1EwRkJUaXhEUVVGcVFpeEZRVUV5UWp0QlFVTjZRaXhoUVVGUExFdEJRVkE3UVVGRFJEdEJRVU5HT3p0QlFVVkVMRk5CUVU4c1NVRkJVRHRCUVVORUlpd2labWxzWlNJNkltRnljbUY1TG1weklpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2laWGh3YjNKMElHWjFibU4wYVc5dUlHRnljbUY1UlhGMVlXd29ZU3dnWWlrZ2UxeHVJQ0JwWmlBb1lTNXNaVzVuZEdnZ0lUMDlJR0l1YkdWdVozUm9LU0I3WEc0Z0lDQWdjbVYwZFhKdUlHWmhiSE5sTzF4dUlDQjlYRzVjYmlBZ2NtVjBkWEp1SUdGeWNtRjVVM1JoY25SelYybDBhQ2hoTENCaUtUdGNibjFjYmx4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUdGeWNtRjVVM1JoY25SelYybDBhQ2hoY25KaGVTd2djM1JoY25RcElIdGNiaUFnYVdZZ0tITjBZWEowTG14bGJtZDBhQ0ErSUdGeWNtRjVMbXhsYm1kMGFDa2dlMXh1SUNBZ0lISmxkSFZ5YmlCbVlXeHpaVHRjYmlBZ2ZWeHVYRzRnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z2MzUmhjblF1YkdWdVozUm9PeUJwS3lzcElIdGNiaUFnSUNCcFppQW9jM1JoY25SYmFWMGdJVDA5SUdGeWNtRjVXMmxkS1NCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnWm1Gc2MyVTdYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdjbVYwZFhKdUlIUnlkV1U3WEc1OVhHNGlYWDA9XG5cblxuLyoqKi8gfSksXG4vKiAxNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cInVzZSBzdHJpY3RcIjtcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2NvbnZlcnRDaGFuZ2VzVG9ETVAgPSBjb252ZXJ0Q2hhbmdlc1RvRE1QO1xuXHQvLyBTZWU6IGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGUtZGlmZi1tYXRjaC1wYXRjaC93aWtpL0FQSVxuXHRmdW5jdGlvbiBjb252ZXJ0Q2hhbmdlc1RvRE1QKGNoYW5nZXMpIHtcblx0ICB2YXIgcmV0ID0gW10sXG5cdCAgICAgIGNoYW5nZSA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92b2lkIDAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8sXG5cdCAgICAgIG9wZXJhdGlvbiA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92b2lkIDAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICBjaGFuZ2UgPSBjaGFuZ2VzW2ldO1xuXHQgICAgaWYgKGNoYW5nZS5hZGRlZCkge1xuXHQgICAgICBvcGVyYXRpb24gPSAxO1xuXHQgICAgfSBlbHNlIGlmIChjaGFuZ2UucmVtb3ZlZCkge1xuXHQgICAgICBvcGVyYXRpb24gPSAtMTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIG9wZXJhdGlvbiA9IDA7XG5cdCAgICB9XG5cblx0ICAgIHJldC5wdXNoKFtvcGVyYXRpb24sIGNoYW5nZS52YWx1ZV0pO1xuXHQgIH1cblx0ICByZXR1cm4gcmV0O1xuXHR9XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OWpiMjUyWlhKMEwyUnRjQzVxY3lKZExDSnVZVzFsY3lJNld5SmpiMjUyWlhKMFEyaGhibWRsYzFSdlJFMVFJaXdpWTJoaGJtZGxjeUlzSW5KbGRDSXNJbU5vWVc1blpTSXNJbTl3WlhKaGRHbHZiaUlzSW1raUxDSnNaVzVuZEdnaUxDSmhaR1JsWkNJc0luSmxiVzkyWldRaUxDSndkWE5vSWl3aWRtRnNkV1VpWFN3aWJXRndjR2x1WjNNaU9pSTdPenRuUTBGRFowSkJMRzFDTEVkQlFVRkJMRzFDTzBGQlJHaENPMEZCUTA4c1UwRkJVMEVzYlVKQlFWUXNRMEZCTmtKRExFOUJRVGRDTEVWQlFYTkRPMEZCUXpORExFMUJRVWxETEUxQlFVMHNSVUZCVmp0QlFVRkJMRTFCUTBsRExIZERRVVJLTzBGQlFVRXNUVUZGU1VNc01rTkJSa283UVVGSFFTeFBRVUZMTEVsQlFVbERMRWxCUVVrc1EwRkJZaXhGUVVGblFrRXNTVUZCU1Vvc1VVRkJVVXNzVFVGQk5VSXNSVUZCYjBORUxFZEJRWEJETEVWQlFYbERPMEZCUTNaRFJpeGhRVUZUUml4UlFVRlJTU3hEUVVGU0xFTkJRVlE3UVVGRFFTeFJRVUZKUml4UFFVRlBTU3hMUVVGWUxFVkJRV3RDTzBGQlEyaENTQ3hyUWtGQldTeERRVUZhTzBGQlEwUXNTMEZHUkN4TlFVVlBMRWxCUVVsRUxFOUJRVTlMTEU5QlFWZ3NSVUZCYjBJN1FVRkRla0pLTEd0Q1FVRlpMRU5CUVVNc1EwRkJZanRCUVVORUxFdEJSazBzVFVGRlFUdEJRVU5NUVN4clFrRkJXU3hEUVVGYU8wRkJRMFE3TzBGQlJVUkdMRkZCUVVsUExFbEJRVW9zUTBGQlV5eERRVUZEVEN4VFFVRkVMRVZCUVZsRUxFOUJRVTlQTEV0QlFXNUNMRU5CUVZRN1FVRkRSRHRCUVVORUxGTkJRVTlTTEVkQlFWQTdRVUZEUkNJc0ltWnBiR1VpT2lKa2JYQXVhbk1pTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lJdkx5QlRaV1U2SUdoMGRIQTZMeTlqYjJSbExtZHZiMmRzWlM1amIyMHZjQzluYjI5bmJHVXRaR2xtWmkxdFlYUmphQzF3WVhSamFDOTNhV3RwTDBGUVNWeHVaWGh3YjNKMElHWjFibU4wYVc5dUlHTnZiblpsY25SRGFHRnVaMlZ6Vkc5RVRWQW9ZMmhoYm1kbGN5a2dlMXh1SUNCc1pYUWdjbVYwSUQwZ1cxMHNYRzRnSUNBZ0lDQmphR0Z1WjJVc1hHNGdJQ0FnSUNCdmNHVnlZWFJwYjI0N1hHNGdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnWTJoaGJtZGxjeTVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVJQ0FnSUdOb1lXNW5aU0E5SUdOb1lXNW5aWE5iYVYwN1hHNGdJQ0FnYVdZZ0tHTm9ZVzVuWlM1aFpHUmxaQ2tnZTF4dUlDQWdJQ0FnYjNCbGNtRjBhVzl1SUQwZ01UdGNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tHTm9ZVzVuWlM1eVpXMXZkbVZrS1NCN1hHNGdJQ0FnSUNCdmNHVnlZWFJwYjI0Z1BTQXRNVHRjYmlBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ2IzQmxjbUYwYVc5dUlEMGdNRHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQnlaWFF1Y0hWemFDaGJiM0JsY21GMGFXOXVMQ0JqYUdGdVoyVXVkbUZzZFdWZEtUdGNiaUFnZlZ4dUlDQnlaWFIxY200Z2NtVjBPMXh1ZlZ4dUlsMTlcblxuXG4vKioqLyB9KSxcbi8qIDE3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyd1c2Ugc3RyaWN0JztcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2NvbnZlcnRDaGFuZ2VzVG9YTUwgPSBjb252ZXJ0Q2hhbmdlc1RvWE1MO1xuXHRmdW5jdGlvbiBjb252ZXJ0Q2hhbmdlc1RvWE1MKGNoYW5nZXMpIHtcblx0ICB2YXIgcmV0ID0gW107XG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICB2YXIgY2hhbmdlID0gY2hhbmdlc1tpXTtcblx0ICAgIGlmIChjaGFuZ2UuYWRkZWQpIHtcblx0ICAgICAgcmV0LnB1c2goJzxpbnM+Jyk7XG5cdCAgICB9IGVsc2UgaWYgKGNoYW5nZS5yZW1vdmVkKSB7XG5cdCAgICAgIHJldC5wdXNoKCc8ZGVsPicpO1xuXHQgICAgfVxuXG5cdCAgICByZXQucHVzaChlc2NhcGVIVE1MKGNoYW5nZS52YWx1ZSkpO1xuXG5cdCAgICBpZiAoY2hhbmdlLmFkZGVkKSB7XG5cdCAgICAgIHJldC5wdXNoKCc8L2lucz4nKTtcblx0ICAgIH0gZWxzZSBpZiAoY2hhbmdlLnJlbW92ZWQpIHtcblx0ICAgICAgcmV0LnB1c2goJzwvZGVsPicpO1xuXHQgICAgfVxuXHQgIH1cblx0ICByZXR1cm4gcmV0LmpvaW4oJycpO1xuXHR9XG5cblx0ZnVuY3Rpb24gZXNjYXBlSFRNTChzKSB7XG5cdCAgdmFyIG4gPSBzO1xuXHQgIG4gPSBuLnJlcGxhY2UoLyYvZywgJyZhbXA7Jyk7XG5cdCAgbiA9IG4ucmVwbGFjZSgvPC9nLCAnJmx0OycpO1xuXHQgIG4gPSBuLnJlcGxhY2UoLz4vZywgJyZndDsnKTtcblx0ICBuID0gbi5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7Jyk7XG5cblx0ICByZXR1cm4gbjtcblx0fVxuXHQvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTlqYjI1MlpYSjBMM2h0YkM1cWN5SmRMQ0p1WVcxbGN5STZXeUpqYjI1MlpYSjBRMmhoYm1kbGMxUnZXRTFNSWl3aVkyaGhibWRsY3lJc0luSmxkQ0lzSW1raUxDSnNaVzVuZEdnaUxDSmphR0Z1WjJVaUxDSmhaR1JsWkNJc0luQjFjMmdpTENKeVpXMXZkbVZrSWl3aVpYTmpZWEJsU0ZSTlRDSXNJblpoYkhWbElpd2lhbTlwYmlJc0luTWlMQ0p1SWl3aWNtVndiR0ZqWlNKZExDSnRZWEJ3YVc1bmN5STZJanM3TzJkRFFVRm5Ra0VzYlVJc1IwRkJRVUVzYlVJN1FVRkJWQ3hUUVVGVFFTeHRRa0ZCVkN4RFFVRTJRa01zVDBGQk4wSXNSVUZCYzBNN1FVRkRNME1zVFVGQlNVTXNUVUZCVFN4RlFVRldPMEZCUTBFc1QwRkJTeXhKUVVGSlF5eEpRVUZKTEVOQlFXSXNSVUZCWjBKQkxFbEJRVWxHTEZGQlFWRkhMRTFCUVRWQ0xFVkJRVzlEUkN4SFFVRndReXhGUVVGNVF6dEJRVU4yUXl4UlFVRkpSU3hUUVVGVFNpeFJRVUZSUlN4RFFVRlNMRU5CUVdJN1FVRkRRU3hSUVVGSlJTeFBRVUZQUXl4TFFVRllMRVZCUVd0Q08wRkJRMmhDU2l4VlFVRkpTeXhKUVVGS0xFTkJRVk1zVDBGQlZEdEJRVU5FTEV0QlJrUXNUVUZGVHl4SlFVRkpSaXhQUVVGUFJ5eFBRVUZZTEVWQlFXOUNPMEZCUTNwQ1RpeFZRVUZKU3l4SlFVRktMRU5CUVZNc1QwRkJWRHRCUVVORU96dEJRVVZFVEN4UlFVRkpTeXhKUVVGS0xFTkJRVk5GTEZkQlFWZEtMRTlCUVU5TExFdEJRV3hDTEVOQlFWUTdPMEZCUlVFc1VVRkJTVXdzVDBGQlQwTXNTMEZCV0N4RlFVRnJRanRCUVVOb1Frb3NWVUZCU1Vzc1NVRkJTaXhEUVVGVExGRkJRVlE3UVVGRFJDeExRVVpFTEUxQlJVOHNTVUZCU1VZc1QwRkJUMGNzVDBGQldDeEZRVUZ2UWp0QlFVTjZRazRzVlVGQlNVc3NTVUZCU2l4RFFVRlRMRkZCUVZRN1FVRkRSRHRCUVVOR08wRkJRMFFzVTBGQlQwd3NTVUZCU1ZNc1NVRkJTaXhEUVVGVExFVkJRVlFzUTBGQlVEdEJRVU5FT3p0QlFVVkVMRk5CUVZOR0xGVkJRVlFzUTBGQmIwSkhMRU5CUVhCQ0xFVkJRWFZDTzBGQlEzSkNMRTFCUVVsRExFbEJRVWxFTEVOQlFWSTdRVUZEUVVNc1RVRkJTVUVzUlVGQlJVTXNUMEZCUml4RFFVRlZMRWxCUVZZc1JVRkJaMElzVDBGQmFFSXNRMEZCU2p0QlFVTkJSQ3hOUVVGSlFTeEZRVUZGUXl4UFFVRkdMRU5CUVZVc1NVRkJWaXhGUVVGblFpeE5RVUZvUWl4RFFVRktPMEZCUTBGRUxFMUJRVWxCTEVWQlFVVkRMRTlCUVVZc1EwRkJWU3hKUVVGV0xFVkJRV2RDTEUxQlFXaENMRU5CUVVvN1FVRkRRVVFzVFVGQlNVRXNSVUZCUlVNc1QwRkJSaXhEUVVGVkxFbEJRVllzUlVGQlowSXNVVUZCYUVJc1EwRkJTanM3UVVGRlFTeFRRVUZQUkN4RFFVRlFPMEZCUTBRaUxDSm1hV3hsSWpvaWVHMXNMbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaVpYaHdiM0owSUdaMWJtTjBhVzl1SUdOdmJuWmxjblJEYUdGdVoyVnpWRzlZVFV3b1kyaGhibWRsY3lrZ2UxeHVJQ0JzWlhRZ2NtVjBJRDBnVzEwN1hHNGdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnWTJoaGJtZGxjeTVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVJQ0FnSUd4bGRDQmphR0Z1WjJVZ1BTQmphR0Z1WjJWelcybGRPMXh1SUNBZ0lHbG1JQ2hqYUdGdVoyVXVZV1JrWldRcElIdGNiaUFnSUNBZ0lISmxkQzV3ZFhOb0tDYzhhVzV6UGljcE8xeHVJQ0FnSUgwZ1pXeHpaU0JwWmlBb1kyaGhibWRsTG5KbGJXOTJaV1FwSUh0Y2JpQWdJQ0FnSUhKbGRDNXdkWE5vS0NjOFpHVnNQaWNwTzF4dUlDQWdJSDFjYmx4dUlDQWdJSEpsZEM1d2RYTm9LR1Z6WTJGd1pVaFVUVXdvWTJoaGJtZGxMblpoYkhWbEtTazdYRzVjYmlBZ0lDQnBaaUFvWTJoaGJtZGxMbUZrWkdWa0tTQjdYRzRnSUNBZ0lDQnlaWFF1Y0hWemFDZ25QQzlwYm5NK0p5azdYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDaGphR0Z1WjJVdWNtVnRiM1psWkNrZ2UxeHVJQ0FnSUNBZ2NtVjBMbkIxYzJnb0p6d3ZaR1ZzUGljcE8xeHVJQ0FnSUgxY2JpQWdmVnh1SUNCeVpYUjFjbTRnY21WMExtcHZhVzRvSnljcE8xeHVmVnh1WEc1bWRXNWpkR2x2YmlCbGMyTmhjR1ZJVkUxTUtITXBJSHRjYmlBZ2JHVjBJRzRnUFNCek8xeHVJQ0J1SUQwZ2JpNXlaWEJzWVdObEtDOG1MMmNzSUNjbVlXMXdPeWNwTzF4dUlDQnVJRDBnYmk1eVpYQnNZV05sS0M4OEwyY3NJQ2NtYkhRN0p5azdYRzRnSUc0Z1BTQnVMbkpsY0d4aFkyVW9MejR2Wnl3Z0p5Wm5kRHNuS1R0Y2JpQWdiaUE5SUc0dWNtVndiR0ZqWlNndlhDSXZaeXdnSnlaeGRXOTBPeWNwTzF4dVhHNGdJSEpsZEhWeWJpQnVPMXh1ZlZ4dUlsMTlcblxuXG4vKioqLyB9KVxuLyoqKioqKi8gXSlcbn0pO1xuO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2RpZmYvZGlzdC9kaWZmLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9kaWZmL2Rpc3QvZGlmZi5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiKGZ1bmN0aW9uIChnbG9iYWwsIHVuZGVmaW5lZCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgaWYgKGdsb2JhbC5zZXRJbW1lZGlhdGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBuZXh0SGFuZGxlID0gMTsgLy8gU3BlYyBzYXlzIGdyZWF0ZXIgdGhhbiB6ZXJvXG4gICAgdmFyIHRhc2tzQnlIYW5kbGUgPSB7fTtcbiAgICB2YXIgY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgdmFyIGRvYyA9IGdsb2JhbC5kb2N1bWVudDtcbiAgICB2YXIgcmVnaXN0ZXJJbW1lZGlhdGU7XG5cbiAgICBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoY2FsbGJhY2spIHtcbiAgICAgIC8vIENhbGxiYWNrIGNhbiBlaXRoZXIgYmUgYSBmdW5jdGlvbiBvciBhIHN0cmluZ1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNhbGxiYWNrID0gbmV3IEZ1bmN0aW9uKFwiXCIgKyBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgICAvLyBDb3B5IGZ1bmN0aW9uIGFyZ3VtZW50c1xuICAgICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMV07XG4gICAgICB9XG4gICAgICAvLyBTdG9yZSBhbmQgcmVnaXN0ZXIgdGhlIHRhc2tcbiAgICAgIHZhciB0YXNrID0geyBjYWxsYmFjazogY2FsbGJhY2ssIGFyZ3M6IGFyZ3MgfTtcbiAgICAgIHRhc2tzQnlIYW5kbGVbbmV4dEhhbmRsZV0gPSB0YXNrO1xuICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUobmV4dEhhbmRsZSk7XG4gICAgICByZXR1cm4gbmV4dEhhbmRsZSsrO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGhhbmRsZSkge1xuICAgICAgICBkZWxldGUgdGFza3NCeUhhbmRsZVtoYW5kbGVdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJ1bih0YXNrKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IHRhc2suY2FsbGJhY2s7XG4gICAgICAgIHZhciBhcmdzID0gdGFzay5hcmdzO1xuICAgICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgY2FsbGJhY2soYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgY2FsbGJhY2soYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgY2FsbGJhY2soYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJ1bklmUHJlc2VudChoYW5kbGUpIHtcbiAgICAgICAgLy8gRnJvbSB0aGUgc3BlYzogXCJXYWl0IHVudGlsIGFueSBpbnZvY2F0aW9ucyBvZiB0aGlzIGFsZ29yaXRobSBzdGFydGVkIGJlZm9yZSB0aGlzIG9uZSBoYXZlIGNvbXBsZXRlZC5cIlxuICAgICAgICAvLyBTbyBpZiB3ZSdyZSBjdXJyZW50bHkgcnVubmluZyBhIHRhc2ssIHdlJ2xsIG5lZWQgdG8gZGVsYXkgdGhpcyBpbnZvY2F0aW9uLlxuICAgICAgICBpZiAoY3VycmVudGx5UnVubmluZ0FUYXNrKSB7XG4gICAgICAgICAgICAvLyBEZWxheSBieSBkb2luZyBhIHNldFRpbWVvdXQuIHNldEltbWVkaWF0ZSB3YXMgdHJpZWQgaW5zdGVhZCwgYnV0IGluIEZpcmVmb3ggNyBpdCBnZW5lcmF0ZWQgYVxuICAgICAgICAgICAgLy8gXCJ0b28gbXVjaCByZWN1cnNpb25cIiBlcnJvci5cbiAgICAgICAgICAgIHNldFRpbWVvdXQocnVuSWZQcmVzZW50LCAwLCBoYW5kbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHRhc2sgPSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG4gICAgICAgICAgICBpZiAodGFzaykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IHRydWU7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcnVuKHRhc2spO1xuICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW1tZWRpYXRlKGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7IHJ1bklmUHJlc2VudChoYW5kbGUpOyB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYW5Vc2VQb3N0TWVzc2FnZSgpIHtcbiAgICAgICAgLy8gVGhlIHRlc3QgYWdhaW5zdCBgaW1wb3J0U2NyaXB0c2AgcHJldmVudHMgdGhpcyBpbXBsZW1lbnRhdGlvbiBmcm9tIGJlaW5nIGluc3RhbGxlZCBpbnNpZGUgYSB3ZWIgd29ya2VyLFxuICAgICAgICAvLyB3aGVyZSBgZ2xvYmFsLnBvc3RNZXNzYWdlYCBtZWFucyBzb21ldGhpbmcgY29tcGxldGVseSBkaWZmZXJlbnQgYW5kIGNhbid0IGJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZS5cbiAgICAgICAgaWYgKGdsb2JhbC5wb3N0TWVzc2FnZSAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpIHtcbiAgICAgICAgICAgIHZhciBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBvbGRPbk1lc3NhZ2UgPSBnbG9iYWwub25tZXNzYWdlO1xuICAgICAgICAgICAgZ2xvYmFsLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMgPSBmYWxzZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoXCJcIiwgXCIqXCIpO1xuICAgICAgICAgICAgZ2xvYmFsLm9ubWVzc2FnZSA9IG9sZE9uTWVzc2FnZTtcbiAgICAgICAgICAgIHJldHVybiBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFBvc3RNZXNzYWdlSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIC8vIEluc3RhbGxzIGFuIGV2ZW50IGhhbmRsZXIgb24gYGdsb2JhbGAgZm9yIHRoZSBgbWVzc2FnZWAgZXZlbnQ6IHNlZVxuICAgICAgICAvLyAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0RPTS93aW5kb3cucG9zdE1lc3NhZ2VcbiAgICAgICAgLy8gKiBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS9jb21tcy5odG1sI2Nyb3NzRG9jdW1lbnRNZXNzYWdlc1xuXG4gICAgICAgIHZhciBtZXNzYWdlUHJlZml4ID0gXCJzZXRJbW1lZGlhdGUkXCIgKyBNYXRoLnJhbmRvbSgpICsgXCIkXCI7XG4gICAgICAgIHZhciBvbkdsb2JhbE1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZSA9PT0gZ2xvYmFsICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGV2ZW50LmRhdGEgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICBldmVudC5kYXRhLmluZGV4T2YobWVzc2FnZVByZWZpeCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBydW5JZlByZXNlbnQoK2V2ZW50LmRhdGEuc2xpY2UobWVzc2FnZVByZWZpeC5sZW5ndGgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBvbkdsb2JhbE1lc3NhZ2UsIGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdsb2JhbC5hdHRhY2hFdmVudChcIm9ubWVzc2FnZVwiLCBvbkdsb2JhbE1lc3NhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShtZXNzYWdlUHJlZml4ICsgaGFuZGxlLCBcIipcIik7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBldmVudC5kYXRhO1xuICAgICAgICAgICAgcnVuSWZQcmVzZW50KGhhbmRsZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoaGFuZGxlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsUmVhZHlTdGF0ZUNoYW5nZUltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICB2YXIgaHRtbCA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgYSA8c2NyaXB0PiBlbGVtZW50OyBpdHMgcmVhZHlzdGF0ZWNoYW5nZSBldmVudCB3aWxsIGJlIGZpcmVkIGFzeW5jaHJvbm91c2x5IG9uY2UgaXQgaXMgaW5zZXJ0ZWRcbiAgICAgICAgICAgIC8vIGludG8gdGhlIGRvY3VtZW50LiBEbyBzbywgdGh1cyBxdWV1aW5nIHVwIHRoZSB0YXNrLiBSZW1lbWJlciB0byBjbGVhbiB1cCBvbmNlIGl0J3MgYmVlbiBjYWxsZWQuXG4gICAgICAgICAgICB2YXIgc2NyaXB0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICAgICAgICBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJ1bklmUHJlc2VudChoYW5kbGUpO1xuICAgICAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICBzY3JpcHQgPSBudWxsO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgc2V0VGltZW91dChydW5JZlByZXNlbnQsIDAsIGhhbmRsZSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSWYgc3VwcG9ydGVkLCB3ZSBzaG91bGQgYXR0YWNoIHRvIHRoZSBwcm90b3R5cGUgb2YgZ2xvYmFsLCBzaW5jZSB0aGF0IGlzIHdoZXJlIHNldFRpbWVvdXQgZXQgYWwuIGxpdmUuXG4gICAgdmFyIGF0dGFjaFRvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihnbG9iYWwpO1xuICAgIGF0dGFjaFRvID0gYXR0YWNoVG8gJiYgYXR0YWNoVG8uc2V0VGltZW91dCA/IGF0dGFjaFRvIDogZ2xvYmFsO1xuXG4gICAgLy8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBlLmcuIGJyb3dzZXJpZnkgZW52aXJvbm1lbnRzLlxuICAgIGlmICh7fS50b1N0cmluZy5jYWxsKGdsb2JhbC5wcm9jZXNzKSA9PT0gXCJbb2JqZWN0IHByb2Nlc3NdXCIpIHtcbiAgICAgICAgLy8gRm9yIE5vZGUuanMgYmVmb3JlIDAuOVxuICAgICAgICBpbnN0YWxsTmV4dFRpY2tJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChjYW5Vc2VQb3N0TWVzc2FnZSgpKSB7XG4gICAgICAgIC8vIEZvciBub24tSUUxMCBtb2Rlcm4gYnJvd3NlcnNcbiAgICAgICAgaW5zdGFsbFBvc3RNZXNzYWdlSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoZ2xvYmFsLk1lc3NhZ2VDaGFubmVsKSB7XG4gICAgICAgIC8vIEZvciB3ZWIgd29ya2Vycywgd2hlcmUgc3VwcG9ydGVkXG4gICAgICAgIGluc3RhbGxNZXNzYWdlQ2hhbm5lbEltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGRvYyAmJiBcIm9ucmVhZHlzdGF0ZWNoYW5nZVwiIGluIGRvYy5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpKSB7XG4gICAgICAgIC8vIEZvciBJRSA24oCTOFxuICAgICAgICBpbnN0YWxsUmVhZHlTdGF0ZUNoYW5nZUltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGb3Igb2xkZXIgYnJvd3NlcnNcbiAgICAgICAgaW5zdGFsbFNldFRpbWVvdXRJbXBsZW1lbnRhdGlvbigpO1xuICAgIH1cblxuICAgIGF0dGFjaFRvLnNldEltbWVkaWF0ZSA9IHNldEltbWVkaWF0ZTtcbiAgICBhdHRhY2hUby5jbGVhckltbWVkaWF0ZSA9IGNsZWFySW1tZWRpYXRlO1xufSh0eXBlb2Ygc2VsZiA9PT0gXCJ1bmRlZmluZWRcIiA/IHR5cGVvZiBnbG9iYWwgPT09IFwidW5kZWZpbmVkXCIgPyB0aGlzIDogZ2xvYmFsIDogc2VsZikpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvc2V0aW1tZWRpYXRlL3NldEltbWVkaWF0ZS5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvc2V0aW1tZWRpYXRlL3NldEltbWVkaWF0ZS5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCIvKlxuXHRNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuXHRBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xuXG52YXIgc3R5bGVzSW5Eb20gPSB7fTtcblxudmFyXHRtZW1vaXplID0gZnVuY3Rpb24gKGZuKSB7XG5cdHZhciBtZW1vO1xuXG5cdHJldHVybiBmdW5jdGlvbiAoKSB7XG5cdFx0aWYgKHR5cGVvZiBtZW1vID09PSBcInVuZGVmaW5lZFwiKSBtZW1vID0gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0XHRyZXR1cm4gbWVtbztcblx0fTtcbn07XG5cbnZhciBpc09sZElFID0gbWVtb2l6ZShmdW5jdGlvbiAoKSB7XG5cdC8vIFRlc3QgZm9yIElFIDw9IDkgYXMgcHJvcG9zZWQgYnkgQnJvd3NlcmhhY2tzXG5cdC8vIEBzZWUgaHR0cDovL2Jyb3dzZXJoYWNrcy5jb20vI2hhY2stZTcxZDg2OTJmNjUzMzQxNzNmZWU3MTVjMjIyY2I4MDVcblx0Ly8gVGVzdHMgZm9yIGV4aXN0ZW5jZSBvZiBzdGFuZGFyZCBnbG9iYWxzIGlzIHRvIGFsbG93IHN0eWxlLWxvYWRlclxuXHQvLyB0byBvcGVyYXRlIGNvcnJlY3RseSBpbnRvIG5vbi1zdGFuZGFyZCBlbnZpcm9ubWVudHNcblx0Ly8gQHNlZSBodHRwczovL2dpdGh1Yi5jb20vd2VicGFjay1jb250cmliL3N0eWxlLWxvYWRlci9pc3N1ZXMvMTc3XG5cdHJldHVybiB3aW5kb3cgJiYgZG9jdW1lbnQgJiYgZG9jdW1lbnQuYWxsICYmICF3aW5kb3cuYXRvYjtcbn0pO1xuXG52YXIgZ2V0RWxlbWVudCA9IChmdW5jdGlvbiAoZm4pIHtcblx0dmFyIG1lbW8gPSB7fTtcblxuXHRyZXR1cm4gZnVuY3Rpb24oc2VsZWN0b3IpIHtcblx0XHRpZiAodHlwZW9mIG1lbW9bc2VsZWN0b3JdID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0XHR2YXIgc3R5bGVUYXJnZXQgPSBmbi5jYWxsKHRoaXMsIHNlbGVjdG9yKTtcblx0XHRcdC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG5cdFx0XHRpZiAoc3R5bGVUYXJnZXQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHQvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFjY2VzcyB0byBpZnJhbWUgaXMgYmxvY2tlZFxuXHRcdFx0XHRcdC8vIGR1ZSB0byBjcm9zcy1vcmlnaW4gcmVzdHJpY3Rpb25zXG5cdFx0XHRcdFx0c3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcblx0XHRcdFx0fSBjYXRjaChlKSB7XG5cdFx0XHRcdFx0c3R5bGVUYXJnZXQgPSBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRtZW1vW3NlbGVjdG9yXSA9IHN0eWxlVGFyZ2V0O1xuXHRcdH1cblx0XHRyZXR1cm4gbWVtb1tzZWxlY3Rvcl1cblx0fTtcbn0pKGZ1bmN0aW9uICh0YXJnZXQpIHtcblx0cmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KVxufSk7XG5cbnZhciBzaW5nbGV0b24gPSBudWxsO1xudmFyXHRzaW5nbGV0b25Db3VudGVyID0gMDtcbnZhclx0c3R5bGVzSW5zZXJ0ZWRBdFRvcCA9IFtdO1xuXG52YXJcdGZpeFVybHMgPSByZXF1aXJlKFwiLi91cmxzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGxpc3QsIG9wdGlvbnMpIHtcblx0aWYgKHR5cGVvZiBERUJVRyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBERUJVRykge1xuXHRcdGlmICh0eXBlb2YgZG9jdW1lbnQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBFcnJvcihcIlRoZSBzdHlsZS1sb2FkZXIgY2Fubm90IGJlIHVzZWQgaW4gYSBub24tYnJvd3NlciBlbnZpcm9ubWVudFwiKTtcblx0fVxuXG5cdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdG9wdGlvbnMuYXR0cnMgPSB0eXBlb2Ygb3B0aW9ucy5hdHRycyA9PT0gXCJvYmplY3RcIiA/IG9wdGlvbnMuYXR0cnMgOiB7fTtcblxuXHQvLyBGb3JjZSBzaW5nbGUtdGFnIHNvbHV0aW9uIG9uIElFNi05LCB3aGljaCBoYXMgYSBoYXJkIGxpbWl0IG9uIHRoZSAjIG9mIDxzdHlsZT5cblx0Ly8gdGFncyBpdCB3aWxsIGFsbG93IG9uIGEgcGFnZVxuXHRpZiAoIW9wdGlvbnMuc2luZ2xldG9uKSBvcHRpb25zLnNpbmdsZXRvbiA9IGlzT2xkSUUoKTtcblxuXHQvLyBCeSBkZWZhdWx0LCBhZGQgPHN0eWxlPiB0YWdzIHRvIHRoZSA8aGVhZD4gZWxlbWVudFxuXHRpZiAoIW9wdGlvbnMuaW5zZXJ0SW50bykgb3B0aW9ucy5pbnNlcnRJbnRvID0gXCJoZWFkXCI7XG5cblx0Ly8gQnkgZGVmYXVsdCwgYWRkIDxzdHlsZT4gdGFncyB0byB0aGUgYm90dG9tIG9mIHRoZSB0YXJnZXRcblx0aWYgKCFvcHRpb25zLmluc2VydEF0KSBvcHRpb25zLmluc2VydEF0ID0gXCJib3R0b21cIjtcblxuXHR2YXIgc3R5bGVzID0gbGlzdFRvU3R5bGVzKGxpc3QsIG9wdGlvbnMpO1xuXG5cdGFkZFN0eWxlc1RvRG9tKHN0eWxlcywgb3B0aW9ucyk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSAobmV3TGlzdCkge1xuXHRcdHZhciBtYXlSZW1vdmUgPSBbXTtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgaXRlbSA9IHN0eWxlc1tpXTtcblx0XHRcdHZhciBkb21TdHlsZSA9IHN0eWxlc0luRG9tW2l0ZW0uaWRdO1xuXG5cdFx0XHRkb21TdHlsZS5yZWZzLS07XG5cdFx0XHRtYXlSZW1vdmUucHVzaChkb21TdHlsZSk7XG5cdFx0fVxuXG5cdFx0aWYobmV3TGlzdCkge1xuXHRcdFx0dmFyIG5ld1N0eWxlcyA9IGxpc3RUb1N0eWxlcyhuZXdMaXN0LCBvcHRpb25zKTtcblx0XHRcdGFkZFN0eWxlc1RvRG9tKG5ld1N0eWxlcywgb3B0aW9ucyk7XG5cdFx0fVxuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBtYXlSZW1vdmUubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBkb21TdHlsZSA9IG1heVJlbW92ZVtpXTtcblxuXHRcdFx0aWYoZG9tU3R5bGUucmVmcyA9PT0gMCkge1xuXHRcdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IGRvbVN0eWxlLnBhcnRzLmxlbmd0aDsgaisrKSBkb21TdHlsZS5wYXJ0c1tqXSgpO1xuXG5cdFx0XHRcdGRlbGV0ZSBzdHlsZXNJbkRvbVtkb21TdHlsZS5pZF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufTtcblxuZnVuY3Rpb24gYWRkU3R5bGVzVG9Eb20gKHN0eWxlcywgb3B0aW9ucykge1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBpdGVtID0gc3R5bGVzW2ldO1xuXHRcdHZhciBkb21TdHlsZSA9IHN0eWxlc0luRG9tW2l0ZW0uaWRdO1xuXG5cdFx0aWYoZG9tU3R5bGUpIHtcblx0XHRcdGRvbVN0eWxlLnJlZnMrKztcblxuXHRcdFx0Zm9yKHZhciBqID0gMDsgaiA8IGRvbVN0eWxlLnBhcnRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdGRvbVN0eWxlLnBhcnRzW2pdKGl0ZW0ucGFydHNbal0pO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IoOyBqIDwgaXRlbS5wYXJ0cy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRkb21TdHlsZS5wYXJ0cy5wdXNoKGFkZFN0eWxlKGl0ZW0ucGFydHNbal0sIG9wdGlvbnMpKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIHBhcnRzID0gW107XG5cblx0XHRcdGZvcih2YXIgaiA9IDA7IGogPCBpdGVtLnBhcnRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdHBhcnRzLnB1c2goYWRkU3R5bGUoaXRlbS5wYXJ0c1tqXSwgb3B0aW9ucykpO1xuXHRcdFx0fVxuXG5cdFx0XHRzdHlsZXNJbkRvbVtpdGVtLmlkXSA9IHtpZDogaXRlbS5pZCwgcmVmczogMSwgcGFydHM6IHBhcnRzfTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gbGlzdFRvU3R5bGVzIChsaXN0LCBvcHRpb25zKSB7XG5cdHZhciBzdHlsZXMgPSBbXTtcblx0dmFyIG5ld1N0eWxlcyA9IHt9O1xuXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBpdGVtID0gbGlzdFtpXTtcblx0XHR2YXIgaWQgPSBvcHRpb25zLmJhc2UgPyBpdGVtWzBdICsgb3B0aW9ucy5iYXNlIDogaXRlbVswXTtcblx0XHR2YXIgY3NzID0gaXRlbVsxXTtcblx0XHR2YXIgbWVkaWEgPSBpdGVtWzJdO1xuXHRcdHZhciBzb3VyY2VNYXAgPSBpdGVtWzNdO1xuXHRcdHZhciBwYXJ0ID0ge2NzczogY3NzLCBtZWRpYTogbWVkaWEsIHNvdXJjZU1hcDogc291cmNlTWFwfTtcblxuXHRcdGlmKCFuZXdTdHlsZXNbaWRdKSBzdHlsZXMucHVzaChuZXdTdHlsZXNbaWRdID0ge2lkOiBpZCwgcGFydHM6IFtwYXJ0XX0pO1xuXHRcdGVsc2UgbmV3U3R5bGVzW2lkXS5wYXJ0cy5wdXNoKHBhcnQpO1xuXHR9XG5cblx0cmV0dXJuIHN0eWxlcztcbn1cblxuZnVuY3Rpb24gaW5zZXJ0U3R5bGVFbGVtZW50IChvcHRpb25zLCBzdHlsZSkge1xuXHR2YXIgdGFyZ2V0ID0gZ2V0RWxlbWVudChvcHRpb25zLmluc2VydEludG8pXG5cblx0aWYgKCF0YXJnZXQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGEgc3R5bGUgdGFyZ2V0LiBUaGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHZhbHVlIGZvciB0aGUgJ2luc2VydEludG8nIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcblx0fVxuXG5cdHZhciBsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcCA9IHN0eWxlc0luc2VydGVkQXRUb3Bbc3R5bGVzSW5zZXJ0ZWRBdFRvcC5sZW5ndGggLSAxXTtcblxuXHRpZiAob3B0aW9ucy5pbnNlcnRBdCA9PT0gXCJ0b3BcIikge1xuXHRcdGlmICghbGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3ApIHtcblx0XHRcdHRhcmdldC5pbnNlcnRCZWZvcmUoc3R5bGUsIHRhcmdldC5maXJzdENoaWxkKTtcblx0XHR9IGVsc2UgaWYgKGxhc3RTdHlsZUVsZW1lbnRJbnNlcnRlZEF0VG9wLm5leHRTaWJsaW5nKSB7XG5cdFx0XHR0YXJnZXQuaW5zZXJ0QmVmb3JlKHN0eWxlLCBsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcC5uZXh0U2libGluZyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG5cdFx0fVxuXHRcdHN0eWxlc0luc2VydGVkQXRUb3AucHVzaChzdHlsZSk7XG5cdH0gZWxzZSBpZiAob3B0aW9ucy5pbnNlcnRBdCA9PT0gXCJib3R0b21cIikge1xuXHRcdHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG5cdH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMuaW5zZXJ0QXQgPT09IFwib2JqZWN0XCIgJiYgb3B0aW9ucy5pbnNlcnRBdC5iZWZvcmUpIHtcblx0XHR2YXIgbmV4dFNpYmxpbmcgPSBnZXRFbGVtZW50KG9wdGlvbnMuaW5zZXJ0SW50byArIFwiIFwiICsgb3B0aW9ucy5pbnNlcnRBdC5iZWZvcmUpO1xuXHRcdHRhcmdldC5pbnNlcnRCZWZvcmUoc3R5bGUsIG5leHRTaWJsaW5nKTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJbU3R5bGUgTG9hZGVyXVxcblxcbiBJbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXIgJ2luc2VydEF0JyAoJ29wdGlvbnMuaW5zZXJ0QXQnKSBmb3VuZC5cXG4gTXVzdCBiZSAndG9wJywgJ2JvdHRvbScsIG9yIE9iamVjdC5cXG4gKGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJwYWNrLWNvbnRyaWIvc3R5bGUtbG9hZGVyI2luc2VydGF0KVxcblwiKTtcblx0fVxufVxuXG5mdW5jdGlvbiByZW1vdmVTdHlsZUVsZW1lbnQgKHN0eWxlKSB7XG5cdGlmIChzdHlsZS5wYXJlbnROb2RlID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cdHN0eWxlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGUpO1xuXG5cdHZhciBpZHggPSBzdHlsZXNJbnNlcnRlZEF0VG9wLmluZGV4T2Yoc3R5bGUpO1xuXHRpZihpZHggPj0gMCkge1xuXHRcdHN0eWxlc0luc2VydGVkQXRUb3Auc3BsaWNlKGlkeCwgMSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlU3R5bGVFbGVtZW50IChvcHRpb25zKSB7XG5cdHZhciBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcblxuXHRvcHRpb25zLmF0dHJzLnR5cGUgPSBcInRleHQvY3NzXCI7XG5cblx0YWRkQXR0cnMoc3R5bGUsIG9wdGlvbnMuYXR0cnMpO1xuXHRpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucywgc3R5bGUpO1xuXG5cdHJldHVybiBzdHlsZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTGlua0VsZW1lbnQgKG9wdGlvbnMpIHtcblx0dmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlua1wiKTtcblxuXHRvcHRpb25zLmF0dHJzLnR5cGUgPSBcInRleHQvY3NzXCI7XG5cdG9wdGlvbnMuYXR0cnMucmVsID0gXCJzdHlsZXNoZWV0XCI7XG5cblx0YWRkQXR0cnMobGluaywgb3B0aW9ucy5hdHRycyk7XG5cdGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zLCBsaW5rKTtcblxuXHRyZXR1cm4gbGluaztcbn1cblxuZnVuY3Rpb24gYWRkQXR0cnMgKGVsLCBhdHRycykge1xuXHRPYmplY3Qua2V5cyhhdHRycykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0ZWwuc2V0QXR0cmlidXRlKGtleSwgYXR0cnNba2V5XSk7XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBhZGRTdHlsZSAob2JqLCBvcHRpb25zKSB7XG5cdHZhciBzdHlsZSwgdXBkYXRlLCByZW1vdmUsIHJlc3VsdDtcblxuXHQvLyBJZiBhIHRyYW5zZm9ybSBmdW5jdGlvbiB3YXMgZGVmaW5lZCwgcnVuIGl0IG9uIHRoZSBjc3Ncblx0aWYgKG9wdGlvbnMudHJhbnNmb3JtICYmIG9iai5jc3MpIHtcblx0ICAgIHJlc3VsdCA9IG9wdGlvbnMudHJhbnNmb3JtKG9iai5jc3MpO1xuXG5cdCAgICBpZiAocmVzdWx0KSB7XG5cdCAgICBcdC8vIElmIHRyYW5zZm9ybSByZXR1cm5zIGEgdmFsdWUsIHVzZSB0aGF0IGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsIGNzcy5cblx0ICAgIFx0Ly8gVGhpcyBhbGxvd3MgcnVubmluZyBydW50aW1lIHRyYW5zZm9ybWF0aW9ucyBvbiB0aGUgY3NzLlxuXHQgICAgXHRvYmouY3NzID0gcmVzdWx0O1xuXHQgICAgfSBlbHNlIHtcblx0ICAgIFx0Ly8gSWYgdGhlIHRyYW5zZm9ybSBmdW5jdGlvbiByZXR1cm5zIGEgZmFsc3kgdmFsdWUsIGRvbid0IGFkZCB0aGlzIGNzcy5cblx0ICAgIFx0Ly8gVGhpcyBhbGxvd3MgY29uZGl0aW9uYWwgbG9hZGluZyBvZiBjc3Ncblx0ICAgIFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHQgICAgXHRcdC8vIG5vb3Bcblx0ICAgIFx0fTtcblx0ICAgIH1cblx0fVxuXG5cdGlmIChvcHRpb25zLnNpbmdsZXRvbikge1xuXHRcdHZhciBzdHlsZUluZGV4ID0gc2luZ2xldG9uQ291bnRlcisrO1xuXG5cdFx0c3R5bGUgPSBzaW5nbGV0b24gfHwgKHNpbmdsZXRvbiA9IGNyZWF0ZVN0eWxlRWxlbWVudChvcHRpb25zKSk7XG5cblx0XHR1cGRhdGUgPSBhcHBseVRvU2luZ2xldG9uVGFnLmJpbmQobnVsbCwgc3R5bGUsIHN0eWxlSW5kZXgsIGZhbHNlKTtcblx0XHRyZW1vdmUgPSBhcHBseVRvU2luZ2xldG9uVGFnLmJpbmQobnVsbCwgc3R5bGUsIHN0eWxlSW5kZXgsIHRydWUpO1xuXG5cdH0gZWxzZSBpZiAoXG5cdFx0b2JqLnNvdXJjZU1hcCAmJlxuXHRcdHR5cGVvZiBVUkwgPT09IFwiZnVuY3Rpb25cIiAmJlxuXHRcdHR5cGVvZiBVUkwuY3JlYXRlT2JqZWN0VVJMID09PSBcImZ1bmN0aW9uXCIgJiZcblx0XHR0eXBlb2YgVVJMLnJldm9rZU9iamVjdFVSTCA9PT0gXCJmdW5jdGlvblwiICYmXG5cdFx0dHlwZW9mIEJsb2IgPT09IFwiZnVuY3Rpb25cIiAmJlxuXHRcdHR5cGVvZiBidG9hID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdFx0c3R5bGUgPSBjcmVhdGVMaW5rRWxlbWVudChvcHRpb25zKTtcblx0XHR1cGRhdGUgPSB1cGRhdGVMaW5rLmJpbmQobnVsbCwgc3R5bGUsIG9wdGlvbnMpO1xuXHRcdHJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZSk7XG5cblx0XHRcdGlmKHN0eWxlLmhyZWYpIFVSTC5yZXZva2VPYmplY3RVUkwoc3R5bGUuaHJlZik7XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRzdHlsZSA9IGNyZWF0ZVN0eWxlRWxlbWVudChvcHRpb25zKTtcblx0XHR1cGRhdGUgPSBhcHBseVRvVGFnLmJpbmQobnVsbCwgc3R5bGUpO1xuXHRcdHJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZSk7XG5cdFx0fTtcblx0fVxuXG5cdHVwZGF0ZShvYmopO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGVTdHlsZSAobmV3T2JqKSB7XG5cdFx0aWYgKG5ld09iaikge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRuZXdPYmouY3NzID09PSBvYmouY3NzICYmXG5cdFx0XHRcdG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmXG5cdFx0XHRcdG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXBcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHVwZGF0ZShvYmogPSBuZXdPYmopO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZW1vdmUoKTtcblx0XHR9XG5cdH07XG59XG5cbnZhciByZXBsYWNlVGV4dCA9IChmdW5jdGlvbiAoKSB7XG5cdHZhciB0ZXh0U3RvcmUgPSBbXTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gKGluZGV4LCByZXBsYWNlbWVudCkge1xuXHRcdHRleHRTdG9yZVtpbmRleF0gPSByZXBsYWNlbWVudDtcblxuXHRcdHJldHVybiB0ZXh0U3RvcmUuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJ1xcbicpO1xuXHR9O1xufSkoKTtcblxuZnVuY3Rpb24gYXBwbHlUb1NpbmdsZXRvblRhZyAoc3R5bGUsIGluZGV4LCByZW1vdmUsIG9iaikge1xuXHR2YXIgY3NzID0gcmVtb3ZlID8gXCJcIiA6IG9iai5jc3M7XG5cblx0aWYgKHN0eWxlLnN0eWxlU2hlZXQpIHtcblx0XHRzdHlsZS5zdHlsZVNoZWV0LmNzc1RleHQgPSByZXBsYWNlVGV4dChpbmRleCwgY3NzKTtcblx0fSBlbHNlIHtcblx0XHR2YXIgY3NzTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcyk7XG5cdFx0dmFyIGNoaWxkTm9kZXMgPSBzdHlsZS5jaGlsZE5vZGVzO1xuXG5cdFx0aWYgKGNoaWxkTm9kZXNbaW5kZXhdKSBzdHlsZS5yZW1vdmVDaGlsZChjaGlsZE5vZGVzW2luZGV4XSk7XG5cblx0XHRpZiAoY2hpbGROb2Rlcy5sZW5ndGgpIHtcblx0XHRcdHN0eWxlLmluc2VydEJlZm9yZShjc3NOb2RlLCBjaGlsZE5vZGVzW2luZGV4XSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHN0eWxlLmFwcGVuZENoaWxkKGNzc05vZGUpO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBhcHBseVRvVGFnIChzdHlsZSwgb2JqKSB7XG5cdHZhciBjc3MgPSBvYmouY3NzO1xuXHR2YXIgbWVkaWEgPSBvYmoubWVkaWE7XG5cblx0aWYobWVkaWEpIHtcblx0XHRzdHlsZS5zZXRBdHRyaWJ1dGUoXCJtZWRpYVwiLCBtZWRpYSlcblx0fVxuXG5cdGlmKHN0eWxlLnN0eWxlU2hlZXQpIHtcblx0XHRzdHlsZS5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3M7XG5cdH0gZWxzZSB7XG5cdFx0d2hpbGUoc3R5bGUuZmlyc3RDaGlsZCkge1xuXHRcdFx0c3R5bGUucmVtb3ZlQ2hpbGQoc3R5bGUuZmlyc3RDaGlsZCk7XG5cdFx0fVxuXG5cdFx0c3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlTGluayAobGluaywgb3B0aW9ucywgb2JqKSB7XG5cdHZhciBjc3MgPSBvYmouY3NzO1xuXHR2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcblxuXHQvKlxuXHRcdElmIGNvbnZlcnRUb0Fic29sdXRlVXJscyBpc24ndCBkZWZpbmVkLCBidXQgc291cmNlbWFwcyBhcmUgZW5hYmxlZFxuXHRcdGFuZCB0aGVyZSBpcyBubyBwdWJsaWNQYXRoIGRlZmluZWQgdGhlbiBsZXRzIHR1cm4gY29udmVydFRvQWJzb2x1dGVVcmxzXG5cdFx0b24gYnkgZGVmYXVsdC4gIE90aGVyd2lzZSBkZWZhdWx0IHRvIHRoZSBjb252ZXJ0VG9BYnNvbHV0ZVVybHMgb3B0aW9uXG5cdFx0ZGlyZWN0bHlcblx0Ki9cblx0dmFyIGF1dG9GaXhVcmxzID0gb3B0aW9ucy5jb252ZXJ0VG9BYnNvbHV0ZVVybHMgPT09IHVuZGVmaW5lZCAmJiBzb3VyY2VNYXA7XG5cblx0aWYgKG9wdGlvbnMuY29udmVydFRvQWJzb2x1dGVVcmxzIHx8IGF1dG9GaXhVcmxzKSB7XG5cdFx0Y3NzID0gZml4VXJscyhjc3MpO1xuXHR9XG5cblx0aWYgKHNvdXJjZU1hcCkge1xuXHRcdC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzI2NjAzODc1XG5cdFx0Y3NzICs9IFwiXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxcIiArIGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCkpKSkgKyBcIiAqL1wiO1xuXHR9XG5cblx0dmFyIGJsb2IgPSBuZXcgQmxvYihbY3NzXSwgeyB0eXBlOiBcInRleHQvY3NzXCIgfSk7XG5cblx0dmFyIG9sZFNyYyA9IGxpbmsuaHJlZjtcblxuXHRsaW5rLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuXG5cdGlmKG9sZFNyYykgVVJMLnJldm9rZU9iamVjdFVSTChvbGRTcmMpO1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2xpYi9hZGRTdHlsZXMuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlxuLyoqXG4gKiBXaGVuIHNvdXJjZSBtYXBzIGFyZSBlbmFibGVkLCBgc3R5bGUtbG9hZGVyYCB1c2VzIGEgbGluayBlbGVtZW50IHdpdGggYSBkYXRhLXVyaSB0b1xuICogZW1iZWQgdGhlIGNzcyBvbiB0aGUgcGFnZS4gVGhpcyBicmVha3MgYWxsIHJlbGF0aXZlIHVybHMgYmVjYXVzZSBub3cgdGhleSBhcmUgcmVsYXRpdmUgdG8gYVxuICogYnVuZGxlIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgcGFnZS5cbiAqXG4gKiBPbmUgc29sdXRpb24gaXMgdG8gb25seSB1c2UgZnVsbCB1cmxzLCBidXQgdGhhdCBtYXkgYmUgaW1wb3NzaWJsZS5cbiAqXG4gKiBJbnN0ZWFkLCB0aGlzIGZ1bmN0aW9uIFwiZml4ZXNcIiB0aGUgcmVsYXRpdmUgdXJscyB0byBiZSBhYnNvbHV0ZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcGFnZSBsb2NhdGlvbi5cbiAqXG4gKiBBIHJ1ZGltZW50YXJ5IHRlc3Qgc3VpdGUgaXMgbG9jYXRlZCBhdCBgdGVzdC9maXhVcmxzLmpzYCBhbmQgY2FuIGJlIHJ1biB2aWEgdGhlIGBucG0gdGVzdGAgY29tbWFuZC5cbiAqXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzKSB7XG4gIC8vIGdldCBjdXJyZW50IGxvY2F0aW9uXG4gIHZhciBsb2NhdGlvbiA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LmxvY2F0aW9uO1xuXG4gIGlmICghbG9jYXRpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJmaXhVcmxzIHJlcXVpcmVzIHdpbmRvdy5sb2NhdGlvblwiKTtcbiAgfVxuXG5cdC8vIGJsYW5rIG9yIG51bGw/XG5cdGlmICghY3NzIHx8IHR5cGVvZiBjc3MgIT09IFwic3RyaW5nXCIpIHtcblx0ICByZXR1cm4gY3NzO1xuICB9XG5cbiAgdmFyIGJhc2VVcmwgPSBsb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiArIGxvY2F0aW9uLmhvc3Q7XG4gIHZhciBjdXJyZW50RGlyID0gYmFzZVVybCArIGxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoL1xcL1teXFwvXSokLywgXCIvXCIpO1xuXG5cdC8vIGNvbnZlcnQgZWFjaCB1cmwoLi4uKVxuXHQvKlxuXHRUaGlzIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBqdXN0IGEgd2F5IHRvIHJlY3Vyc2l2ZWx5IG1hdGNoIGJyYWNrZXRzIHdpdGhpblxuXHRhIHN0cmluZy5cblxuXHQgL3VybFxccypcXCggID0gTWF0Y2ggb24gdGhlIHdvcmQgXCJ1cmxcIiB3aXRoIGFueSB3aGl0ZXNwYWNlIGFmdGVyIGl0IGFuZCB0aGVuIGEgcGFyZW5zXG5cdCAgICggID0gU3RhcnQgYSBjYXB0dXJpbmcgZ3JvdXBcblx0ICAgICAoPzogID0gU3RhcnQgYSBub24tY2FwdHVyaW5nIGdyb3VwXG5cdCAgICAgICAgIFteKShdICA9IE1hdGNoIGFueXRoaW5nIHRoYXQgaXNuJ3QgYSBwYXJlbnRoZXNlc1xuXHQgICAgICAgICB8ICA9IE9SXG5cdCAgICAgICAgIFxcKCAgPSBNYXRjaCBhIHN0YXJ0IHBhcmVudGhlc2VzXG5cdCAgICAgICAgICAgICAoPzogID0gU3RhcnQgYW5vdGhlciBub24tY2FwdHVyaW5nIGdyb3Vwc1xuXHQgICAgICAgICAgICAgICAgIFteKShdKyAgPSBNYXRjaCBhbnl0aGluZyB0aGF0IGlzbid0IGEgcGFyZW50aGVzZXNcblx0ICAgICAgICAgICAgICAgICB8ICA9IE9SXG5cdCAgICAgICAgICAgICAgICAgXFwoICA9IE1hdGNoIGEgc3RhcnQgcGFyZW50aGVzZXNcblx0ICAgICAgICAgICAgICAgICAgICAgW14pKF0qICA9IE1hdGNoIGFueXRoaW5nIHRoYXQgaXNuJ3QgYSBwYXJlbnRoZXNlc1xuXHQgICAgICAgICAgICAgICAgIFxcKSAgPSBNYXRjaCBhIGVuZCBwYXJlbnRoZXNlc1xuXHQgICAgICAgICAgICAgKSAgPSBFbmQgR3JvdXBcbiAgICAgICAgICAgICAgKlxcKSA9IE1hdGNoIGFueXRoaW5nIGFuZCB0aGVuIGEgY2xvc2UgcGFyZW5zXG4gICAgICAgICAgKSAgPSBDbG9zZSBub24tY2FwdHVyaW5nIGdyb3VwXG4gICAgICAgICAgKiAgPSBNYXRjaCBhbnl0aGluZ1xuICAgICAgICkgID0gQ2xvc2UgY2FwdHVyaW5nIGdyb3VwXG5cdCBcXCkgID0gTWF0Y2ggYSBjbG9zZSBwYXJlbnNcblxuXHQgL2dpICA9IEdldCBhbGwgbWF0Y2hlcywgbm90IHRoZSBmaXJzdC4gIEJlIGNhc2UgaW5zZW5zaXRpdmUuXG5cdCAqL1xuXHR2YXIgZml4ZWRDc3MgPSBjc3MucmVwbGFjZSgvdXJsXFxzKlxcKCgoPzpbXikoXXxcXCgoPzpbXikoXSt8XFwoW14pKF0qXFwpKSpcXCkpKilcXCkvZ2ksIGZ1bmN0aW9uKGZ1bGxNYXRjaCwgb3JpZ1VybCkge1xuXHRcdC8vIHN0cmlwIHF1b3RlcyAoaWYgdGhleSBleGlzdClcblx0XHR2YXIgdW5xdW90ZWRPcmlnVXJsID0gb3JpZ1VybFxuXHRcdFx0LnRyaW0oKVxuXHRcdFx0LnJlcGxhY2UoL15cIiguKilcIiQvLCBmdW5jdGlvbihvLCAkMSl7IHJldHVybiAkMTsgfSlcblx0XHRcdC5yZXBsYWNlKC9eJyguKiknJC8sIGZ1bmN0aW9uKG8sICQxKXsgcmV0dXJuICQxOyB9KTtcblxuXHRcdC8vIGFscmVhZHkgYSBmdWxsIHVybD8gbm8gY2hhbmdlXG5cdFx0aWYgKC9eKCN8ZGF0YTp8aHR0cDpcXC9cXC98aHR0cHM6XFwvXFwvfGZpbGU6XFwvXFwvXFwvKS9pLnRlc3QodW5xdW90ZWRPcmlnVXJsKSkge1xuXHRcdCAgcmV0dXJuIGZ1bGxNYXRjaDtcblx0XHR9XG5cblx0XHQvLyBjb252ZXJ0IHRoZSB1cmwgdG8gYSBmdWxsIHVybFxuXHRcdHZhciBuZXdVcmw7XG5cblx0XHRpZiAodW5xdW90ZWRPcmlnVXJsLmluZGV4T2YoXCIvL1wiKSA9PT0gMCkge1xuXHRcdCAgXHQvL1RPRE86IHNob3VsZCB3ZSBhZGQgcHJvdG9jb2w/XG5cdFx0XHRuZXdVcmwgPSB1bnF1b3RlZE9yaWdVcmw7XG5cdFx0fSBlbHNlIGlmICh1bnF1b3RlZE9yaWdVcmwuaW5kZXhPZihcIi9cIikgPT09IDApIHtcblx0XHRcdC8vIHBhdGggc2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlIHVybFxuXHRcdFx0bmV3VXJsID0gYmFzZVVybCArIHVucXVvdGVkT3JpZ1VybDsgLy8gYWxyZWFkeSBzdGFydHMgd2l0aCAnLydcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gcGF0aCBzaG91bGQgYmUgcmVsYXRpdmUgdG8gY3VycmVudCBkaXJlY3Rvcnlcblx0XHRcdG5ld1VybCA9IGN1cnJlbnREaXIgKyB1bnF1b3RlZE9yaWdVcmwucmVwbGFjZSgvXlxcLlxcLy8sIFwiXCIpOyAvLyBTdHJpcCBsZWFkaW5nICcuLydcblx0XHR9XG5cblx0XHQvLyBzZW5kIGJhY2sgdGhlIGZpeGVkIHVybCguLi4pXG5cdFx0cmV0dXJuIFwidXJsKFwiICsgSlNPTi5zdHJpbmdpZnkobmV3VXJsKSArIFwiKVwiO1xuXHR9KTtcblxuXHQvLyBzZW5kIGJhY2sgdGhlIGZpeGVkIGNzc1xuXHRyZXR1cm4gZml4ZWRDc3M7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2xpYi91cmxzLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvbGliL3VybHMuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwidmFyIHNjb3BlID0gKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsKSB8fFxuICAgICAgICAgICAgKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGYpIHx8XG4gICAgICAgICAgICB3aW5kb3c7XG52YXIgYXBwbHkgPSBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHk7XG5cbi8vIERPTSBBUElzLCBmb3IgY29tcGxldGVuZXNzXG5cbmV4cG9ydHMuc2V0VGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRUaW1lb3V0LCBzY29wZSwgYXJndW1lbnRzKSwgY2xlYXJUaW1lb3V0KTtcbn07XG5leHBvcnRzLnNldEludGVydmFsID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldEludGVydmFsLCBzY29wZSwgYXJndW1lbnRzKSwgY2xlYXJJbnRlcnZhbCk7XG59O1xuZXhwb3J0cy5jbGVhclRpbWVvdXQgPVxuZXhwb3J0cy5jbGVhckludGVydmFsID0gZnVuY3Rpb24odGltZW91dCkge1xuICBpZiAodGltZW91dCkge1xuICAgIHRpbWVvdXQuY2xvc2UoKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gVGltZW91dChpZCwgY2xlYXJGbikge1xuICB0aGlzLl9pZCA9IGlkO1xuICB0aGlzLl9jbGVhckZuID0gY2xlYXJGbjtcbn1cblRpbWVvdXQucHJvdG90eXBlLnVucmVmID0gVGltZW91dC5wcm90b3R5cGUucmVmID0gZnVuY3Rpb24oKSB7fTtcblRpbWVvdXQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX2NsZWFyRm4uY2FsbChzY29wZSwgdGhpcy5faWQpO1xufTtcblxuLy8gRG9lcyBub3Qgc3RhcnQgdGhlIHRpbWUsIGp1c3Qgc2V0cyB1cCB0aGUgbWVtYmVycyBuZWVkZWQuXG5leHBvcnRzLmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0sIG1zZWNzKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSBtc2Vjcztcbn07XG5cbmV4cG9ydHMudW5lbnJvbGwgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSAtMTtcbn07XG5cbmV4cG9ydHMuX3VucmVmQWN0aXZlID0gZXhwb3J0cy5hY3RpdmUgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcblxuICB2YXIgbXNlY3MgPSBpdGVtLl9pZGxlVGltZW91dDtcbiAgaWYgKG1zZWNzID49IDApIHtcbiAgICBpdGVtLl9pZGxlVGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiBvblRpbWVvdXQoKSB7XG4gICAgICBpZiAoaXRlbS5fb25UaW1lb3V0KVxuICAgICAgICBpdGVtLl9vblRpbWVvdXQoKTtcbiAgICB9LCBtc2Vjcyk7XG4gIH1cbn07XG5cbi8vIHNldGltbWVkaWF0ZSBhdHRhY2hlcyBpdHNlbGYgdG8gdGhlIGdsb2JhbCBvYmplY3RcbnJlcXVpcmUoXCJzZXRpbW1lZGlhdGVcIik7XG4vLyBPbiBzb21lIGV4b3RpYyBlbnZpcm9ubWVudHMsIGl0J3Mgbm90IGNsZWFyIHdoaWNoIG9iamVjdCBgc2V0aW1tZWRpYXRlYCB3YXNcbi8vIGFibGUgdG8gaW5zdGFsbCBvbnRvLiAgU2VhcmNoIGVhY2ggcG9zc2liaWxpdHkgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlXG4vLyBgc2V0aW1tZWRpYXRlYCBsaWJyYXJ5LlxuZXhwb3J0cy5zZXRJbW1lZGlhdGUgPSAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZi5zZXRJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbC5zZXRJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICh0aGlzICYmIHRoaXMuc2V0SW1tZWRpYXRlKTtcbmV4cG9ydHMuY2xlYXJJbW1lZGlhdGUgPSAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZi5jbGVhckltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwuY2xlYXJJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgJiYgdGhpcy5jbGVhckltbWVkaWF0ZSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy90aW1lcnMtYnJvd3NlcmlmeS9tYWluLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy90aW1lcnMtYnJvd3NlcmlmeS9tYWluLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXHJcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXHJcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcblxyXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXHJcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcclxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcclxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cclxuXHJcblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xyXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIGlmIChlLmluZGV4T2YocFtpXSkgPCAwKVxyXG4gICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHJlc3VsdC52YWx1ZSk7IH0pLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0geVtvcFswXSAmIDIgPyBcInJldHVyblwiIDogb3BbMF0gPyBcInRocm93XCIgOiBcIm5leHRcIl0pICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gWzAsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBleHBvcnRzKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmICghZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7ICB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAob1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKSB8fCAoMSxldmFsKShcInRoaXNcIik7XG59IGNhdGNoKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIilcblx0XHRnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAod2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3dlYnBhY2svYnVpbGRpbi9nbG9iYWwuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwibnVsbFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9tZW51LWl0ZW0vTWVudUl0ZW0udHMiLCIvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXG4vLyBsb2FkIHRoZSBzdHlsZXNcbnZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWRlY29yYXRvci1sb2FkZXIvaW5kZXguanMhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tMTAtMyEuLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvbGliL2luZGV4LmpzPz9wb3N0Y3NzIS4uLy4uL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kdHMtbG9hZGVyL2luZGV4LmpzP3R5cGU9Y3NzIS4vbWVudUl0ZW0ubS5jc3NcIik7XG5pZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcbi8vIFByZXBhcmUgY3NzVHJhbnNmb3JtYXRpb25cbnZhciB0cmFuc2Zvcm07XG5cbnZhciBvcHRpb25zID0ge1wiaG1yXCI6dHJ1ZX1cbm9wdGlvbnMudHJhbnNmb3JtID0gdHJhbnNmb3JtXG4vLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG52YXIgdXBkYXRlID0gcmVxdWlyZShcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2xpYi9hZGRTdHlsZXMuanNcIikoY29udGVudCwgb3B0aW9ucyk7XG5pZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcbi8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcbmlmKG1vZHVsZS5ob3QpIHtcblx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kZWNvcmF0b3ItbG9hZGVyL2luZGV4LmpzIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTEwLTMhLi4vLi4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL2xpYi9pbmRleC5qcz8/cG9zdGNzcyEuLi8uLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZHRzLWxvYWRlci9pbmRleC5qcz90eXBlPWNzcyEuL21lbnVJdGVtLm0uY3NzXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZGVjb3JhdG9yLWxvYWRlci9pbmRleC5qcyEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS0xMC0zIS4uLy4uL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9saWIvaW5kZXguanM/P3Bvc3Rjc3MhLi4vLi4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWR0cy1sb2FkZXIvaW5kZXguanM/dHlwZT1jc3MhLi9tZW51SXRlbS5tLmNzc1wiKTtcblx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdH0pO1xuXHR9XG5cdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG59XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvbWVudS1pdGVtL21lbnVJdGVtLm0uY3NzXG4vLyBtb2R1bGUgaWQgPSAuL3NyYy9tZW51LWl0ZW0vbWVudUl0ZW0ubS5jc3Ncbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwibnVsbFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9tZW51L01lbnUudHMiLCIvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXG4vLyBsb2FkIHRoZSBzdHlsZXNcbnZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWRlY29yYXRvci1sb2FkZXIvaW5kZXguanMhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tMTAtMyEuLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvbGliL2luZGV4LmpzPz9wb3N0Y3NzIS4uLy4uL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kdHMtbG9hZGVyL2luZGV4LmpzP3R5cGU9Y3NzIS4vbWVudS5tLmNzc1wiKTtcbmlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuLy8gUHJlcGFyZSBjc3NUcmFuc2Zvcm1hdGlvblxudmFyIHRyYW5zZm9ybTtcblxudmFyIG9wdGlvbnMgPSB7XCJobXJcIjp0cnVlfVxub3B0aW9ucy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1cbi8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cbnZhciB1cGRhdGUgPSByZXF1aXJlKFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvbGliL2FkZFN0eWxlcy5qc1wiKShjb250ZW50LCBvcHRpb25zKTtcbmlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuLy8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuaWYobW9kdWxlLmhvdCkge1xuXHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWRlY29yYXRvci1sb2FkZXIvaW5kZXguanMhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tMTAtMyEuLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvbGliL2luZGV4LmpzPz9wb3N0Y3NzIS4uLy4uL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kdHMtbG9hZGVyL2luZGV4LmpzP3R5cGU9Y3NzIS4vbWVudS5tLmNzc1wiLCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWRlY29yYXRvci1sb2FkZXIvaW5kZXguanMhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tMTAtMyEuLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvbGliL2luZGV4LmpzPz9wb3N0Y3NzIS4uLy4uL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kdHMtbG9hZGVyL2luZGV4LmpzP3R5cGU9Y3NzIS4vbWVudS5tLmNzc1wiKTtcblx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdH0pO1xuXHR9XG5cdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG59XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvbWVudS9tZW51Lm0uY3NzXG4vLyBtb2R1bGUgaWQgPSAuL3NyYy9tZW51L21lbnUubS5jc3Ncbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiaW1wb3J0ICcuL21lbnUtaXRlbS9NZW51SXRlbSc7XHJcbmltcG9ydCAnLi9tZW51L01lbnUnO1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZHRzLWxvYWRlcj90eXBlPXRzJmluc3RhbmNlTmFtZT0wX2N1c3RvbS1lbGVtZW50cyEuL3Rlc3RzL3VuaXQvYWxsLnRzIiwiY29uc3QgeyBkZXNjcmliZSwgaXQgfSA9IGludGVybi5nZXRJbnRlcmZhY2UoJ2JkZCcpO1xyXG5pbXBvcnQgaGFybmVzcyBmcm9tICdAZG9qby90ZXN0LWV4dHJhcy9oYXJuZXNzJztcclxuXHJcbmltcG9ydCB7IHYgfSBmcm9tICdAZG9qby93aWRnZXQtY29yZS9kJztcclxuXHJcbmltcG9ydCB7IE1lbnVJdGVtIH0gZnJvbSAnLi4vLi4vLi4vc3JjL21lbnUtaXRlbS9NZW51SXRlbSc7XHJcbmltcG9ydCAqIGFzIGNzcyBmcm9tICcuLi8uLi8uLi9zcmMvbWVudS1pdGVtL21lbnVJdGVtLm0uY3NzJztcclxuXHJcbmRlc2NyaWJlKCdNZW51SXRlbScsICgpID0+IHtcclxuXHRpdCgnc2hvdWxkIHJlbmRlciB3aWRnZXQnLCAoKSA9PiB7XHJcblx0XHRjb25zdCB0ZXN0TWVudUl0ZW0gPSBoYXJuZXNzKE1lbnVJdGVtKTtcclxuXHRcdGNvbnN0IHNlbGVjdGVkID0gdHJ1ZTtcclxuXHRcdGNvbnN0IHRpdGxlID0gJ01lbnUgSXRlbSc7XHJcblx0XHR0ZXN0TWVudUl0ZW0uc2V0UHJvcGVydGllcyh7IHNlbGVjdGVkLCB0aXRsZSB9KTtcclxuXHRcdHRlc3RNZW51SXRlbS5leHBlY3RSZW5kZXIoXHJcblx0XHRcdHYoJ2xpJywgeyBjbGFzc2VzOiBjc3Mucm9vdCB9LCBbXHJcblx0XHRcdFx0dihcclxuXHRcdFx0XHRcdCdzcGFuJyxcclxuXHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0Y2xhc3NlczogW2Nzcy5pdGVtLCBjc3Muc2VsZWN0ZWRdLFxyXG5cdFx0XHRcdFx0XHRvbmNsaWNrOiB0ZXN0TWVudUl0ZW0ubGlzdGVuZXJcclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRbdGl0bGVdXHJcblx0XHRcdFx0KVxyXG5cdFx0XHRdKVxyXG5cdFx0KTtcclxuXHR9KTtcclxufSk7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kdHMtbG9hZGVyP3R5cGU9dHMmaW5zdGFuY2VOYW1lPTBfY3VzdG9tLWVsZW1lbnRzIS4vdGVzdHMvdW5pdC9tZW51LWl0ZW0vTWVudUl0ZW0udHMiLCJjb25zdCB7IGRlc2NyaWJlLCBpdCB9ID0gaW50ZXJuLmdldEludGVyZmFjZSgnYmRkJyk7XHJcbmltcG9ydCBoYXJuZXNzIGZyb20gJ0Bkb2pvL3Rlc3QtZXh0cmFzL2hhcm5lc3MnO1xyXG5cclxuaW1wb3J0IHsgdiB9IGZyb20gJ0Bkb2pvL3dpZGdldC1jb3JlL2QnO1xyXG5cclxuaW1wb3J0IHsgTWVudSB9IGZyb20gJy4uLy4uLy4uL3NyYy9tZW51L01lbnUnO1xyXG5pbXBvcnQgKiBhcyBjc3MgZnJvbSAnLi4vLi4vLi4vc3JjL21lbnUvbWVudS5tLmNzcyc7XHJcblxyXG5kZXNjcmliZSgnTWVudScsICgpID0+IHtcclxuXHRpdCgnc2hvdWxkIHJlbmRlciB3aWRnZXQnLCAoKSA9PiB7XHJcblx0XHRjb25zdCB0ZXN0TWVudSA9IGhhcm5lc3MoTWVudSk7XHJcblx0XHR0ZXN0TWVudS5leHBlY3RSZW5kZXIodignbmF2JywgeyBjbGFzc2VzOiBjc3Mucm9vdCB9LCBbdignb2wnLCB7IGNsYXNzZXM6IGNzcy5tZW51Q29udGFpbmVyIH0pXSkpO1xyXG5cdH0pO1xyXG59KTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWR0cy1sb2FkZXI/dHlwZT10cyZpbnN0YW5jZU5hbWU9MF9jdXN0b20tZWxlbWVudHMhLi90ZXN0cy91bml0L21lbnUvTWVudS50cyJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgNzMyODJlOTgxNzIzN2Q0NTUwMmMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9jb3JlL0Rlc3Ryb3lhYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvY29yZS9FdmVudGVkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvY29yZS9sYW5nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvaGFzL2hhcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vTWFwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9Qcm9taXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9TZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL1N5bWJvbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vV2Vha01hcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL251bWJlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vb2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL3N1cHBvcnQvaGFzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9zdXBwb3J0L3F1ZXVlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9zdXBwb3J0L3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay90ZXN0aW5nL2hhcm5lc3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay90ZXN0aW5nL3N1cHBvcnQvYXNzZXJ0UmVuZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvdGVzdGluZy9zdXBwb3J0L3NlbGVjdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvSW5qZWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9Ob2RlSGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL1JlZ2lzdHJ5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvUmVnaXN0cnlIYW5kbGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvV2lkZ2V0QmFzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2FuaW1hdGlvbnMvY3NzVHJhbnNpdGlvbnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9hZnRlclJlbmRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYWx3YXlzUmVuZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9iZWZvcmVQcm9wZXJ0aWVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9jdXN0b21FbGVtZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9kaWZmUHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2hhbmRsZURlY29yYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaW5qZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGlmZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL21peGlucy9Qcm9qZWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9taXhpbnMvVGhlbWVkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvcmVnaXN0ZXJDdXN0b21FbGVtZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvdmRvbS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbWVudS1pdGVtL21lbnVJdGVtLm0uY3NzPzJlNTYiLCJ3ZWJwYWNrOi8vLy4vc3JjL21lbnUvbWVudS5tLmNzcz80MWNiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY3NzLXNlbGVjdC11bWQvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGlmZi9kaXN0L2RpZmYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2V0aW1tZWRpYXRlL3NldEltbWVkaWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2xpYi9hZGRTdHlsZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9saWIvdXJscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdGltZXJzLWJyb3dzZXJpZnkvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL21lbnUtaXRlbS9NZW51SXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbWVudS1pdGVtL21lbnVJdGVtLm0uY3NzIiwid2VicGFjazovLy8uL3NyYy9tZW51L01lbnUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL21lbnUvbWVudS5tLmNzcyIsIndlYnBhY2s6Ly8vLi90ZXN0cy91bml0L2FsbC50cyIsIndlYnBhY2s6Ly8vLi90ZXN0cy91bml0L21lbnUtaXRlbS9NZW51SXRlbS50cyIsIndlYnBhY2s6Ly8vLi90ZXN0cy91bml0L21lbnUvTWVudS50cyJdLCJuYW1lcyI6WyJkXzEiLCJyZXF1aXJlIiwiY3VzdG9tRWxlbWVudF8xIiwiVGhlbWVkXzEiLCJXaWRnZXRCYXNlXzEiLCJjc3MiLCJNZW51SXRlbSIsIl9zdXBlciIsInRzbGliXzEiLCJfX2V4dGVuZHMiLCJwcm90b3R5cGUiLCJfb25DbGljayIsInByb3BlcnRpZXMiLCJvblNlbGVjdGVkIiwiZGF0YSIsInJlbmRlciIsIl9hIiwidGl0bGUiLCJzZWxlY3RlZCIsInYiLCJjbGFzc2VzIiwidGhlbWUiLCJyb290IiwiaXRlbSIsIm9uY2xpY2siLCJfX2RlY29yYXRlIiwiY3VzdG9tRWxlbWVudCIsInRhZyIsImF0dHJpYnV0ZXMiLCJldmVudHMiLCJUaGVtZWRNaXhpbiIsIldpZGdldEJhc2UiLCJleHBvcnRzIiwiZGVmYXVsdCIsIk1lbnUiLCJfb25TZWxlY3RlZCIsImlkIiwiX3NlbGVjdGVkSWQiLCJpbnZhbGlkYXRlIiwiX3RoaXMiLCJpdGVtcyIsImNoaWxkcmVuIiwibWFwIiwiY2hpbGQiLCJpbmRleCIsInVuZGVmaW5lZCIsIl9fYXNzaWduIiwibWVudUNvbnRhaW5lciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOztB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsdUJBQXVCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQix1QkFBdUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHVCQUF1QjtBQUMzQztBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsb0JBQW9CO0FBQzNDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxzRDs7Ozs7Ozs7dURDNU9BO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDBEQUEwRDtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsZ0NBQWdDO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxrQzs7Ozs7Ozs7QUM1SEE7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFFQUFxRTtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixzQkFBc0I7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUdBQXVHLHFCQUFxQjtBQUM1SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLFFBQVEsZ0JBQWdCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLDBCQUEwQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix1QkFBdUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixZQUFZO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsZUFBZTtBQUNsRDtBQUNBLCtCQUErQixTQUFTO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDOzs7Ozs7Ozs4Q0MvTUE7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsK0I7Ozs7Ozs7OztBQ2xCQTtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsT0FBTztBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQjs7Ozs7Ozs7QUNySEE7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Qjs7Ozs7Ozs7QUM1Q0E7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsMEJBQTBCLHFCQUFxQixFQUFFLEVBQUU7QUFDdEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSwyQjs7Ozs7Ozs7QUM1SEE7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixtQkFBbUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsMEJBQTBCO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQywwQkFBMEI7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qix1QkFBdUI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MscUJBQXFCO0FBQ3pEO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0Esa0M7Ozs7Ozs7O0FDcEZBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLDBCQUEwQjtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyw0QkFBNEI7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiwwQkFBMEI7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHFCQUFxQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiwyQkFBMkI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsdUJBQXVCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLHNCQUFzQixxQ0FBcUM7QUFDdEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsdUJBQXVCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQywwQkFBMEI7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxzQkFBc0IscUNBQXFDO0FBQ3RHLG1CQUFtQixxQkFBcUI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQyxvQ0FBb0M7QUFDcEMsd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCx1REFBdUQ7QUFDeEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyx5Q0FBeUM7QUFDOUU7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkRBQTJELHNCQUFzQiwyQkFBMkI7QUFDNUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsMkNBQTJDO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsc0JBQXNCLDJCQUEyQjtBQUN4RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTs7QUFFQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBLFNBQVM7QUFDVDtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0EsMkNBQTJDOztBQUUzQztBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUMsU0FBUztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0YsQ0FBQzs7O0FBR0QsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLGdCQUFnQixnQkFBZ0I7QUFDaEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUNBQW1DOztBQUVuQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBLEVBQUUsSUFBSTtBQUNOOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwrREFBK0Q7QUFDL0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLHdDQUF3Qzs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsc0JBQXNCLGlCQUFpQjtBQUN2QztBQUNBLGdCQUFnQjtBQUNoQjtBQUNBLEdBQUc7QUFDSCxnQkFBZ0I7QUFDaEI7QUFDQTs7QUFFQSxtRUFBbUUsUUFBUTtBQUMzRTs7QUFFQTtBQUNBLDBCQUEwQixZQUFZO0FBQ3RDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUEsa0JBQWtCOztBQUVsQixPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBLGtCQUFrQjs7QUFFbEIsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpQ0FBaUMsT0FBTztBQUN4QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxpQ0FBaUMsT0FBTztBQUN4QztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpQ0FBaUMsZ0JBQWdCO0FBQ2pEO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxpQ0FBaUMsT0FBTztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlDQUFpQyxPQUFPO0FBQ3hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7O0FBRUE7QUFDQSw0QkFBNEIsSUFBSTtBQUNoQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFlBQVk7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRixDQUFDO0FBQ0Q7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0YsMEJB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OztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlEQUFpRCxxQkFBcUI7QUFDdEUsdURBQXVEOztBQUV2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxpREFBaUQ7QUFDaEUsZ0JBQWdCOztBQUVoQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0Esa0JBQWtCLFdBQVc7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUos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QUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsc0JBQXNCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFVBQVU7Ozs7Ozs7O0FDdkx0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsaUJBQWlCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwwQ0FBMEMsc0JBQXNCLEVBQUU7QUFDbEU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7Ozs7Ozs7OztBQ3pMRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLGlCQUFpQixtQkFBbUI7QUFDcEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLHNCQUFzQjtBQUN2Qzs7QUFFQTtBQUNBLG1CQUFtQiwyQkFBMkI7O0FBRTlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQkFBZ0IsbUJBQW1CO0FBQ25DO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpQkFBaUIsMkJBQTJCO0FBQzVDO0FBQ0E7O0FBRUEsUUFBUSx1QkFBdUI7QUFDL0I7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSxpQkFBaUIsdUJBQXVCO0FBQ3hDO0FBQ0E7O0FBRUEsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsZ0JBQWdCLGlCQUFpQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYzs7QUFFZCxrREFBa0Qsc0JBQXNCO0FBQ3hFO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZEOztBQUVBLDZCQUE2QixtQkFBbUI7O0FBRWhEOztBQUVBOztBQUVBO0FBQ0E7Ozs7Ozs7OztBQzVXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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InVuaXQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAwKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCA3MzI4MmU5ODE3MjM3ZDQ1NTAyYyIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xyXG52YXIgbGFuZ18xID0gcmVxdWlyZShcIi4vbGFuZ1wiKTtcclxudmFyIFByb21pc2VfMSA9IHJlcXVpcmUoXCIuLi9zaGltL1Byb21pc2VcIik7XHJcbi8qKlxyXG4gKiBObyBvcGVyYXRpb24gZnVuY3Rpb24gdG8gcmVwbGFjZSBvd24gb25jZSBpbnN0YW5jZSBpcyBkZXN0b3J5ZWRcclxuICovXHJcbmZ1bmN0aW9uIG5vb3AoKSB7XHJcbiAgICByZXR1cm4gUHJvbWlzZV8xLmRlZmF1bHQucmVzb2x2ZShmYWxzZSk7XHJcbn1cclxuLyoqXHJcbiAqIE5vIG9wIGZ1bmN0aW9uIHVzZWQgdG8gcmVwbGFjZSBvd24sIG9uY2UgaW5zdGFuY2UgaGFzIGJlZW4gZGVzdG9yeWVkXHJcbiAqL1xyXG5mdW5jdGlvbiBkZXN0cm95ZWQoKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbGwgbWFkZSB0byBkZXN0cm95ZWQgbWV0aG9kJyk7XHJcbn1cclxudmFyIERlc3Ryb3lhYmxlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAY29uc3RydWN0b3JcclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gRGVzdHJveWFibGUoKSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVzID0gW107XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIGhhbmRsZXMgZm9yIHRoZSBpbnN0YW5jZSB0aGF0IHdpbGwgYmUgZGVzdHJveWVkIHdoZW4gYHRoaXMuZGVzdHJveWAgaXMgY2FsbGVkXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtIYW5kbGV9IGhhbmRsZSBUaGUgaGFuZGxlIHRvIGFkZCBmb3IgdGhlIGluc3RhbmNlXHJcbiAgICAgKiBAcmV0dXJucyB7SGFuZGxlfSBhIGhhbmRsZSBmb3IgdGhlIGhhbmRsZSwgcmVtb3ZlcyB0aGUgaGFuZGxlIGZvciB0aGUgaW5zdGFuY2UgYW5kIGNhbGxzIGRlc3Ryb3lcclxuICAgICAqL1xyXG4gICAgRGVzdHJveWFibGUucHJvdG90eXBlLm93biA9IGZ1bmN0aW9uIChoYW5kbGVzKSB7XHJcbiAgICAgICAgdmFyIGhhbmRsZSA9IEFycmF5LmlzQXJyYXkoaGFuZGxlcykgPyBsYW5nXzEuY3JlYXRlQ29tcG9zaXRlSGFuZGxlLmFwcGx5KHZvaWQgMCwgdHNsaWJfMS5fX3NwcmVhZChoYW5kbGVzKSkgOiBoYW5kbGVzO1xyXG4gICAgICAgIHZhciBfaGFuZGxlcyA9IHRoaXMuaGFuZGxlcztcclxuICAgICAgICBfaGFuZGxlcy5wdXNoKGhhbmRsZSk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgX2hhbmRsZXMuc3BsaWNlKF9oYW5kbGVzLmluZGV4T2YoaGFuZGxlKSk7XHJcbiAgICAgICAgICAgICAgICBoYW5kbGUuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIERlc3RycHlzIGFsbCBoYW5kZXJzIHJlZ2lzdGVyZWQgZm9yIHRoZSBpbnN0YW5jZVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPGFueX0gYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSBhbGwgaGFuZGxlcyBoYXZlIGJlZW4gZGVzdHJveWVkXHJcbiAgICAgKi9cclxuICAgIERlc3Ryb3lhYmxlLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlXzEuZGVmYXVsdChmdW5jdGlvbiAocmVzb2x2ZSkge1xyXG4gICAgICAgICAgICBfdGhpcy5oYW5kbGVzLmZvckVhY2goZnVuY3Rpb24gKGhhbmRsZSkge1xyXG4gICAgICAgICAgICAgICAgaGFuZGxlICYmIGhhbmRsZS5kZXN0cm95ICYmIGhhbmRsZS5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBfdGhpcy5kZXN0cm95ID0gbm9vcDtcclxuICAgICAgICAgICAgX3RoaXMub3duID0gZGVzdHJveWVkO1xyXG4gICAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBEZXN0cm95YWJsZTtcclxufSgpKTtcclxuZXhwb3J0cy5EZXN0cm95YWJsZSA9IERlc3Ryb3lhYmxlO1xyXG5leHBvcnRzLmRlZmF1bHQgPSBEZXN0cm95YWJsZTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvY29yZS9EZXN0cm95YWJsZS5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL2NvcmUvRGVzdHJveWFibGUuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XHJcbnZhciBNYXBfMSA9IHJlcXVpcmUoXCIuLi9zaGltL01hcFwiKTtcclxudmFyIERlc3Ryb3lhYmxlXzEgPSByZXF1aXJlKFwiLi9EZXN0cm95YWJsZVwiKTtcclxuLyoqXHJcbiAqIE1hcCBvZiBjb21wdXRlZCByZWd1bGFyIGV4cHJlc3Npb25zLCBrZXllZCBieSBzdHJpbmdcclxuICovXHJcbnZhciByZWdleE1hcCA9IG5ldyBNYXBfMS5kZWZhdWx0KCk7XHJcbi8qKlxyXG4gKiBEZXRlcm1pbmVzIGlzIHRoZSBldmVudCB0eXBlIGdsb2IgaGFzIGJlZW4gbWF0Y2hlZFxyXG4gKlxyXG4gKiBAcmV0dXJucyBib29sZWFuIHRoYXQgaW5kaWNhdGVzIGlmIHRoZSBnbG9iIGlzIG1hdGNoZWRcclxuICovXHJcbmZ1bmN0aW9uIGlzR2xvYk1hdGNoKGdsb2JTdHJpbmcsIHRhcmdldFN0cmluZykge1xyXG4gICAgaWYgKHR5cGVvZiB0YXJnZXRTdHJpbmcgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBnbG9iU3RyaW5nID09PSAnc3RyaW5nJyAmJiBnbG9iU3RyaW5nLmluZGV4T2YoJyonKSAhPT0gLTEpIHtcclxuICAgICAgICB2YXIgcmVnZXggPSB2b2lkIDA7XHJcbiAgICAgICAgaWYgKHJlZ2V4TWFwLmhhcyhnbG9iU3RyaW5nKSkge1xyXG4gICAgICAgICAgICByZWdleCA9IHJlZ2V4TWFwLmdldChnbG9iU3RyaW5nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJlZ2V4ID0gbmV3IFJlZ0V4cChcIl5cIiArIGdsb2JTdHJpbmcucmVwbGFjZSgvXFwqL2csICcuKicpICsgXCIkXCIpO1xyXG4gICAgICAgICAgICByZWdleE1hcC5zZXQoZ2xvYlN0cmluZywgcmVnZXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVnZXgudGVzdCh0YXJnZXRTdHJpbmcpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGdsb2JTdHJpbmcgPT09IHRhcmdldFN0cmluZztcclxuICAgIH1cclxufVxyXG5leHBvcnRzLmlzR2xvYk1hdGNoID0gaXNHbG9iTWF0Y2g7XHJcbi8qKlxyXG4gKiBFdmVudCBDbGFzc1xyXG4gKi9cclxudmFyIEV2ZW50ZWQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XHJcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhFdmVudGVkLCBfc3VwZXIpO1xyXG4gICAgZnVuY3Rpb24gRXZlbnRlZCgpIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBtYXAgb2YgbGlzdGVuZXJzIGtleWVkIGJ5IGV2ZW50IHR5cGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfdGhpcy5saXN0ZW5lcnNNYXAgPSBuZXcgTWFwXzEuZGVmYXVsdCgpO1xyXG4gICAgICAgIHJldHVybiBfdGhpcztcclxuICAgIH1cclxuICAgIEV2ZW50ZWQucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMubGlzdGVuZXJzTWFwLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZHMsIHR5cGUpIHtcclxuICAgICAgICAgICAgaWYgKGlzR2xvYk1hdGNoKHR5cGUsIGV2ZW50LnR5cGUpKSB7XHJcbiAgICAgICAgICAgICAgICB0c2xpYl8xLl9fc3ByZWFkKG1ldGhvZHMpLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZC5jYWxsKF90aGlzLCBldmVudCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIEV2ZW50ZWQucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKHR5cGUsIGxpc3RlbmVyKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShsaXN0ZW5lcikpIHtcclxuICAgICAgICAgICAgdmFyIGhhbmRsZXNfMSA9IGxpc3RlbmVyLm1hcChmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIF90aGlzLl9hZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7IH0pO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXNfMS5mb3JFYWNoKGZ1bmN0aW9uIChoYW5kbGUpIHsgcmV0dXJuIGhhbmRsZS5kZXN0cm95KCk7IH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpO1xyXG4gICAgfTtcclxuICAgIEV2ZW50ZWQucHJvdG90eXBlLl9hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uICh0eXBlLCBsaXN0ZW5lcikge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzTWFwLmdldCh0eXBlKSB8fCBbXTtcclxuICAgICAgICBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5saXN0ZW5lcnNNYXAuc2V0KHR5cGUsIGxpc3RlbmVycyk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IF90aGlzLmxpc3RlbmVyc01hcC5nZXQodHlwZSkgfHwgW107XHJcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKSwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfTtcclxuICAgIHJldHVybiBFdmVudGVkO1xyXG59KERlc3Ryb3lhYmxlXzEuRGVzdHJveWFibGUpKTtcclxuZXhwb3J0cy5FdmVudGVkID0gRXZlbnRlZDtcclxuZXhwb3J0cy5kZWZhdWx0ID0gRXZlbnRlZDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvY29yZS9FdmVudGVkLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvY29yZS9FdmVudGVkLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xyXG52YXIgb2JqZWN0XzEgPSByZXF1aXJlKFwiLi4vc2hpbS9vYmplY3RcIik7XHJcbnZhciBvYmplY3RfMiA9IHJlcXVpcmUoXCIuLi9zaGltL29iamVjdFwiKTtcclxuZXhwb3J0cy5hc3NpZ24gPSBvYmplY3RfMi5hc3NpZ247XHJcbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcclxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcclxuLyoqXHJcbiAqIFR5cGUgZ3VhcmQgdGhhdCBlbnN1cmVzIHRoYXQgdGhlIHZhbHVlIGNhbiBiZSBjb2VyY2VkIHRvIE9iamVjdFxyXG4gKiB0byB3ZWVkIG91dCBob3N0IG9iamVjdHMgdGhhdCBkbyBub3QgZGVyaXZlIGZyb20gT2JqZWN0LlxyXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2hlY2sgaWYgd2Ugd2FudCB0byBkZWVwIGNvcHkgYW4gb2JqZWN0IG9yIG5vdC5cclxuICogTm90ZTogSW4gRVM2IGl0IGlzIHBvc3NpYmxlIHRvIG1vZGlmeSBhbiBvYmplY3QncyBTeW1ib2wudG9TdHJpbmdUYWcgcHJvcGVydHksIHdoaWNoIHdpbGxcclxuICogY2hhbmdlIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBgdG9TdHJpbmdgLiBUaGlzIGlzIGEgcmFyZSBlZGdlIGNhc2UgdGhhdCBpcyBkaWZmaWN1bHQgdG8gaGFuZGxlLFxyXG4gKiBzbyBpdCBpcyBub3QgaGFuZGxlZCBoZXJlLlxyXG4gKiBAcGFyYW0gIHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVja1xyXG4gKiBAcmV0dXJuICAgICAgIElmIHRoZSB2YWx1ZSBpcyBjb2VyY2libGUgaW50byBhbiBPYmplY3RcclxuICovXHJcbmZ1bmN0aW9uIHNob3VsZERlZXBDb3B5T2JqZWN0KHZhbHVlKSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XHJcbn1cclxuZnVuY3Rpb24gY29weUFycmF5KGFycmF5LCBpbmhlcml0ZWQpIHtcclxuICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gY29weUFycmF5KGl0ZW0sIGluaGVyaXRlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAhc2hvdWxkRGVlcENvcHlPYmplY3QoaXRlbSlcclxuICAgICAgICAgICAgPyBpdGVtXHJcbiAgICAgICAgICAgIDogX21peGluKHtcclxuICAgICAgICAgICAgICAgIGRlZXA6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBpbmhlcml0ZWQ6IGluaGVyaXRlZCxcclxuICAgICAgICAgICAgICAgIHNvdXJjZXM6IFtpdGVtXSxcclxuICAgICAgICAgICAgICAgIHRhcmdldDoge31cclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9KTtcclxufVxyXG5mdW5jdGlvbiBfbWl4aW4oa3dBcmdzKSB7XHJcbiAgICB2YXIgZGVlcCA9IGt3QXJncy5kZWVwO1xyXG4gICAgdmFyIGluaGVyaXRlZCA9IGt3QXJncy5pbmhlcml0ZWQ7XHJcbiAgICB2YXIgdGFyZ2V0ID0ga3dBcmdzLnRhcmdldDtcclxuICAgIHZhciBjb3BpZWQgPSBrd0FyZ3MuY29waWVkIHx8IFtdO1xyXG4gICAgdmFyIGNvcGllZENsb25lID0gdHNsaWJfMS5fX3NwcmVhZChjb3BpZWQpO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrd0FyZ3Muc291cmNlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHZhciBzb3VyY2UgPSBrd0FyZ3Muc291cmNlc1tpXTtcclxuICAgICAgICBpZiAoc291cmNlID09PSBudWxsIHx8IHNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XHJcbiAgICAgICAgICAgIGlmIChpbmhlcml0ZWQgfHwgaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVtrZXldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvcGllZENsb25lLmluZGV4T2YodmFsdWUpICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGRlZXApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb3B5QXJyYXkodmFsdWUsIGluaGVyaXRlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNob3VsZERlZXBDb3B5T2JqZWN0KHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0VmFsdWUgPSB0YXJnZXRba2V5XSB8fCB7fTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkLnB1c2goc291cmNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBfbWl4aW4oe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRlZDogaW5oZXJpdGVkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlczogW3ZhbHVlXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0VmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWQ6IGNvcGllZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRhcmdldDtcclxufVxyXG5mdW5jdGlvbiBjcmVhdGUocHJvdG90eXBlKSB7XHJcbiAgICB2YXIgbWl4aW5zID0gW107XHJcbiAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgIG1peGluc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcclxuICAgIH1cclxuICAgIGlmICghbWl4aW5zLmxlbmd0aCkge1xyXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdsYW5nLmNyZWF0ZSByZXF1aXJlcyBhdCBsZWFzdCBvbmUgbWl4aW4gb2JqZWN0LicpO1xyXG4gICAgfVxyXG4gICAgdmFyIGFyZ3MgPSBtaXhpbnMuc2xpY2UoKTtcclxuICAgIGFyZ3MudW5zaGlmdChPYmplY3QuY3JlYXRlKHByb3RvdHlwZSkpO1xyXG4gICAgcmV0dXJuIG9iamVjdF8xLmFzc2lnbi5hcHBseShudWxsLCBhcmdzKTtcclxufVxyXG5leHBvcnRzLmNyZWF0ZSA9IGNyZWF0ZTtcclxuZnVuY3Rpb24gZGVlcEFzc2lnbih0YXJnZXQpIHtcclxuICAgIHZhciBzb3VyY2VzID0gW107XHJcbiAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgIHNvdXJjZXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX21peGluKHtcclxuICAgICAgICBkZWVwOiB0cnVlLFxyXG4gICAgICAgIGluaGVyaXRlZDogZmFsc2UsXHJcbiAgICAgICAgc291cmNlczogc291cmNlcyxcclxuICAgICAgICB0YXJnZXQ6IHRhcmdldFxyXG4gICAgfSk7XHJcbn1cclxuZXhwb3J0cy5kZWVwQXNzaWduID0gZGVlcEFzc2lnbjtcclxuZnVuY3Rpb24gZGVlcE1peGluKHRhcmdldCkge1xyXG4gICAgdmFyIHNvdXJjZXMgPSBbXTtcclxuICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgc291cmNlc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcclxuICAgIH1cclxuICAgIHJldHVybiBfbWl4aW4oe1xyXG4gICAgICAgIGRlZXA6IHRydWUsXHJcbiAgICAgICAgaW5oZXJpdGVkOiB0cnVlLFxyXG4gICAgICAgIHNvdXJjZXM6IHNvdXJjZXMsXHJcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRcclxuICAgIH0pO1xyXG59XHJcbmV4cG9ydHMuZGVlcE1peGluID0gZGVlcE1peGluO1xyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3QgdXNpbmcgdGhlIHByb3ZpZGVkIHNvdXJjZSdzIHByb3RvdHlwZSBhcyB0aGUgcHJvdG90eXBlIGZvciB0aGUgbmV3IG9iamVjdCwgYW5kIHRoZW5cclxuICogZGVlcCBjb3BpZXMgdGhlIHByb3ZpZGVkIHNvdXJjZSdzIHZhbHVlcyBpbnRvIHRoZSBuZXcgdGFyZ2V0LlxyXG4gKlxyXG4gKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3QgdG8gZHVwbGljYXRlXHJcbiAqIEByZXR1cm4gVGhlIG5ldyBvYmplY3RcclxuICovXHJcbmZ1bmN0aW9uIGR1cGxpY2F0ZShzb3VyY2UpIHtcclxuICAgIHZhciB0YXJnZXQgPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihzb3VyY2UpKTtcclxuICAgIHJldHVybiBkZWVwTWl4aW4odGFyZ2V0LCBzb3VyY2UpO1xyXG59XHJcbmV4cG9ydHMuZHVwbGljYXRlID0gZHVwbGljYXRlO1xyXG4vKipcclxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHR3byB2YWx1ZXMgYXJlIHRoZSBzYW1lIHZhbHVlLlxyXG4gKlxyXG4gKiBAcGFyYW0gYSBGaXJzdCB2YWx1ZSB0byBjb21wYXJlXHJcbiAqIEBwYXJhbSBiIFNlY29uZCB2YWx1ZSB0byBjb21wYXJlXHJcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWVzIGFyZSB0aGUgc2FtZTsgZmFsc2Ugb3RoZXJ3aXNlXHJcbiAqL1xyXG5mdW5jdGlvbiBpc0lkZW50aWNhbChhLCBiKSB7XHJcbiAgICByZXR1cm4gKGEgPT09IGIgfHxcclxuICAgICAgICAvKiBib3RoIHZhbHVlcyBhcmUgTmFOICovXHJcbiAgICAgICAgKGEgIT09IGEgJiYgYiAhPT0gYikpO1xyXG59XHJcbmV4cG9ydHMuaXNJZGVudGljYWwgPSBpc0lkZW50aWNhbDtcclxuLyoqXHJcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGJpbmRzIGEgbWV0aG9kIHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGF0IHJ1bnRpbWUuIFRoaXMgaXMgc2ltaWxhciB0b1xyXG4gKiBgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRgLCBidXQgaW5zdGVhZCBvZiBhIGZ1bmN0aW9uIGl0IHRha2VzIHRoZSBuYW1lIG9mIGEgbWV0aG9kIG9uIGFuIG9iamVjdC5cclxuICogQXMgYSByZXN1bHQsIHRoZSBmdW5jdGlvbiByZXR1cm5lZCBieSBgbGF0ZUJpbmRgIHdpbGwgYWx3YXlzIGNhbGwgdGhlIGZ1bmN0aW9uIGN1cnJlbnRseSBhc3NpZ25lZCB0b1xyXG4gKiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG9uIHRoZSBvYmplY3QgYXMgb2YgdGhlIG1vbWVudCB0aGUgZnVuY3Rpb24gaXQgcmV0dXJucyBpcyBjYWxsZWQuXHJcbiAqXHJcbiAqIEBwYXJhbSBpbnN0YW5jZSBUaGUgY29udGV4dCBvYmplY3RcclxuICogQHBhcmFtIG1ldGhvZCBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIG9uIHRoZSBjb250ZXh0IG9iamVjdCB0byBiaW5kIHRvIGl0c2VsZlxyXG4gKiBAcGFyYW0gc3VwcGxpZWRBcmdzIEFuIG9wdGlvbmFsIGFycmF5IG9mIHZhbHVlcyB0byBwcmVwZW5kIHRvIHRoZSBgaW5zdGFuY2VbbWV0aG9kXWAgYXJndW1lbnRzIGxpc3RcclxuICogQHJldHVybiBUaGUgYm91bmQgZnVuY3Rpb25cclxuICovXHJcbmZ1bmN0aW9uIGxhdGVCaW5kKGluc3RhbmNlLCBtZXRob2QpIHtcclxuICAgIHZhciBzdXBwbGllZEFyZ3MgPSBbXTtcclxuICAgIGZvciAodmFyIF9pID0gMjsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgc3VwcGxpZWRBcmdzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN1cHBsaWVkQXJncy5sZW5ndGhcclxuICAgICAgICA/IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID8gc3VwcGxpZWRBcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpIDogc3VwcGxpZWRBcmdzO1xyXG4gICAgICAgICAgICAvLyBUUzcwMTdcclxuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlW21ldGhvZF0uYXBwbHkoaW5zdGFuY2UsIGFyZ3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgICA6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgLy8gVFM3MDE3XHJcbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZVttZXRob2RdLmFwcGx5KGluc3RhbmNlLCBhcmd1bWVudHMpO1xyXG4gICAgICAgIH07XHJcbn1cclxuZXhwb3J0cy5sYXRlQmluZCA9IGxhdGVCaW5kO1xyXG5mdW5jdGlvbiBtaXhpbih0YXJnZXQpIHtcclxuICAgIHZhciBzb3VyY2VzID0gW107XHJcbiAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgIHNvdXJjZXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX21peGluKHtcclxuICAgICAgICBkZWVwOiBmYWxzZSxcclxuICAgICAgICBpbmhlcml0ZWQ6IHRydWUsXHJcbiAgICAgICAgc291cmNlczogc291cmNlcyxcclxuICAgICAgICB0YXJnZXQ6IHRhcmdldFxyXG4gICAgfSk7XHJcbn1cclxuZXhwb3J0cy5taXhpbiA9IG1peGluO1xyXG4vKipcclxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHdoaWNoIGludm9rZXMgdGhlIGdpdmVuIGZ1bmN0aW9uIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cyBwcmVwZW5kZWQgdG8gaXRzIGFyZ3VtZW50IGxpc3QuXHJcbiAqIExpa2UgYEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kYCwgYnV0IGRvZXMgbm90IGFsdGVyIGV4ZWN1dGlvbiBjb250ZXh0LlxyXG4gKlxyXG4gKiBAcGFyYW0gdGFyZ2V0RnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRoYXQgbmVlZHMgdG8gYmUgYm91bmRcclxuICogQHBhcmFtIHN1cHBsaWVkQXJncyBBbiBvcHRpb25hbCBhcnJheSBvZiBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aGUgYHRhcmdldEZ1bmN0aW9uYCBhcmd1bWVudHMgbGlzdFxyXG4gKiBAcmV0dXJuIFRoZSBib3VuZCBmdW5jdGlvblxyXG4gKi9cclxuZnVuY3Rpb24gcGFydGlhbCh0YXJnZXRGdW5jdGlvbikge1xyXG4gICAgdmFyIHN1cHBsaWVkQXJncyA9IFtdO1xyXG4gICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICBzdXBwbGllZEFyZ3NbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLmxlbmd0aCA/IHN1cHBsaWVkQXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKSA6IHN1cHBsaWVkQXJncztcclxuICAgICAgICByZXR1cm4gdGFyZ2V0RnVuY3Rpb24uYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydHMucGFydGlhbCA9IHBhcnRpYWw7XHJcbi8qKlxyXG4gKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgZGVzdHJveSBtZXRob2QgdGhhdCwgd2hlbiBjYWxsZWQsIGNhbGxzIHRoZSBwYXNzZWQtaW4gZGVzdHJ1Y3Rvci5cclxuICogVGhpcyBpcyBpbnRlbmRlZCB0byBwcm92aWRlIGEgdW5pZmllZCBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIFwicmVtb3ZlXCIgLyBcImRlc3Ryb3lcIiBoYW5kbGVycyBmb3JcclxuICogZXZlbnQgbGlzdGVuZXJzLCB0aW1lcnMsIGV0Yy5cclxuICpcclxuICogQHBhcmFtIGRlc3RydWN0b3IgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGhhbmRsZSdzIGBkZXN0cm95YCBtZXRob2QgaXMgaW52b2tlZFxyXG4gKiBAcmV0dXJuIFRoZSBoYW5kbGUgb2JqZWN0XHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVIYW5kbGUoZGVzdHJ1Y3Rvcikge1xyXG4gICAgdmFyIGNhbGxlZCA9IGZhbHNlO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICghY2FsbGVkKSB7XHJcbiAgICAgICAgICAgICAgICBjYWxsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgZGVzdHJ1Y3RvcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5leHBvcnRzLmNyZWF0ZUhhbmRsZSA9IGNyZWF0ZUhhbmRsZTtcclxuLyoqXHJcbiAqIFJldHVybnMgYSBzaW5nbGUgaGFuZGxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVzdHJveSBtdWx0aXBsZSBoYW5kbGVzIHNpbXVsdGFuZW91c2x5LlxyXG4gKlxyXG4gKiBAcGFyYW0gaGFuZGxlcyBBbiBhcnJheSBvZiBoYW5kbGVzIHdpdGggYGRlc3Ryb3lgIG1ldGhvZHNcclxuICogQHJldHVybiBUaGUgaGFuZGxlIG9iamVjdFxyXG4gKi9cclxuZnVuY3Rpb24gY3JlYXRlQ29tcG9zaXRlSGFuZGxlKCkge1xyXG4gICAgdmFyIGhhbmRsZXMgPSBbXTtcclxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgaGFuZGxlc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNyZWF0ZUhhbmRsZShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoYW5kbGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGhhbmRsZXNbaV0uZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59XHJcbmV4cG9ydHMuY3JlYXRlQ29tcG9zaXRlSGFuZGxlID0gY3JlYXRlQ29tcG9zaXRlSGFuZGxlO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9jb3JlL2xhbmcuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9jb3JlL2xhbmcuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuZnVuY3Rpb24gaXNGZWF0dXJlVGVzdFRoZW5hYmxlKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gdmFsdWUgJiYgdmFsdWUudGhlbjtcclxufVxyXG4vKipcclxuICogQSBjYWNoZSBvZiByZXN1bHRzIG9mIGZlYXR1cmUgdGVzdHNcclxuICovXHJcbmV4cG9ydHMudGVzdENhY2hlID0ge307XHJcbi8qKlxyXG4gKiBBIGNhY2hlIG9mIHRoZSB1bi1yZXNvbHZlZCBmZWF0dXJlIHRlc3RzXHJcbiAqL1xyXG5leHBvcnRzLnRlc3RGdW5jdGlvbnMgPSB7fTtcclxuLyoqXHJcbiAqIEEgY2FjaGUgb2YgdW5yZXNvbHZlZCB0aGVuYWJsZXMgKHByb2JhYmx5IHByb21pc2VzKVxyXG4gKiBAdHlwZSB7e319XHJcbiAqL1xyXG52YXIgdGVzdFRoZW5hYmxlcyA9IHt9O1xyXG4vKipcclxuICogQSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBzY29wZSAoYHdpbmRvd2AgaW4gYSBicm93c2VyLCBgZ2xvYmFsYCBpbiBOb2RlSlMpXHJcbiAqL1xyXG52YXIgZ2xvYmFsU2NvcGUgPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cclxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIC8vIEJyb3dzZXJzXHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdztcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgLy8gTm9kZVxyXG4gICAgICAgIHJldHVybiBnbG9iYWw7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAvLyBXZWIgd29ya2Vyc1xyXG4gICAgICAgIHJldHVybiBzZWxmO1xyXG4gICAgfVxyXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cclxuICAgIHJldHVybiB7fTtcclxufSkoKTtcclxuLyogR3JhYiB0aGUgc3RhdGljRmVhdHVyZXMgaWYgdGhlcmUgYXJlIGF2YWlsYWJsZSAqL1xyXG52YXIgc3RhdGljRmVhdHVyZXMgPSAoZ2xvYmFsU2NvcGUuRG9qb0hhc0Vudmlyb25tZW50IHx8IHt9KS5zdGF0aWNGZWF0dXJlcztcclxuLyogQ2xlYW5pbmcgdXAgdGhlIERvam9IYXNFbnZpb3JubWVudCAqL1xyXG5pZiAoJ0Rvam9IYXNFbnZpcm9ubWVudCcgaW4gZ2xvYmFsU2NvcGUpIHtcclxuICAgIGRlbGV0ZSBnbG9iYWxTY29wZS5Eb2pvSGFzRW52aXJvbm1lbnQ7XHJcbn1cclxuLyoqXHJcbiAqIEN1c3RvbSB0eXBlIGd1YXJkIHRvIG5hcnJvdyB0aGUgYHN0YXRpY0ZlYXR1cmVzYCB0byBlaXRoZXIgYSBtYXAgb3IgYSBmdW5jdGlvbiB0aGF0XHJcbiAqIHJldHVybnMgYSBtYXAuXHJcbiAqXHJcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gZ3VhcmQgZm9yXHJcbiAqL1xyXG5mdW5jdGlvbiBpc1N0YXRpY0ZlYXR1cmVGdW5jdGlvbih2YWx1ZSkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcclxufVxyXG4vKipcclxuICogVGhlIGNhY2hlIG9mIGFzc2VydGVkIGZlYXR1cmVzIHRoYXQgd2VyZSBhdmFpbGFibGUgaW4gdGhlIGdsb2JhbCBzY29wZSB3aGVuIHRoZVxyXG4gKiBtb2R1bGUgbG9hZGVkXHJcbiAqL1xyXG52YXIgc3RhdGljQ2FjaGUgPSBzdGF0aWNGZWF0dXJlc1xyXG4gICAgPyBpc1N0YXRpY0ZlYXR1cmVGdW5jdGlvbihzdGF0aWNGZWF0dXJlcykgPyBzdGF0aWNGZWF0dXJlcy5hcHBseShnbG9iYWxTY29wZSkgOiBzdGF0aWNGZWF0dXJlc1xyXG4gICAgOiB7fTsvKiBQcm92aWRpbmcgYW4gZW1wdHkgY2FjaGUsIGlmIG5vbmUgd2FzIGluIHRoZSBlbnZpcm9ubWVudFxyXG5cclxuLyoqXHJcbiogQU1EIHBsdWdpbiBmdW5jdGlvbi5cclxuKlxyXG4qIENvbmRpdGlvbmFsIGxvYWRzIG1vZHVsZXMgYmFzZWQgb24gYSBoYXMgZmVhdHVyZSB0ZXN0IHZhbHVlLlxyXG4qXHJcbiogQHBhcmFtIHJlc291cmNlSWQgR2l2ZXMgdGhlIHJlc29sdmVkIG1vZHVsZSBpZCB0byBsb2FkLlxyXG4qIEBwYXJhbSByZXF1aXJlIFRoZSBsb2FkZXIgcmVxdWlyZSBmdW5jdGlvbiB3aXRoIHJlc3BlY3QgdG8gdGhlIG1vZHVsZSB0aGF0IGNvbnRhaW5lZCB0aGUgcGx1Z2luIHJlc291cmNlIGluIGl0c1xyXG4qICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kgbGlzdC5cclxuKiBAcGFyYW0gbG9hZCBDYWxsYmFjayB0byBsb2FkZXIgdGhhdCBjb25zdW1lcyByZXN1bHQgb2YgcGx1Z2luIGRlbWFuZC5cclxuKi9cclxuZnVuY3Rpb24gbG9hZChyZXNvdXJjZUlkLCByZXF1aXJlLCBsb2FkLCBjb25maWcpIHtcclxuICAgIHJlc291cmNlSWQgPyByZXF1aXJlKFtyZXNvdXJjZUlkXSwgbG9hZCkgOiBsb2FkKCk7XHJcbn1cclxuZXhwb3J0cy5sb2FkID0gbG9hZDtcclxuLyoqXHJcbiAqIEFNRCBwbHVnaW4gZnVuY3Rpb24uXHJcbiAqXHJcbiAqIFJlc29sdmVzIHJlc291cmNlSWQgaW50byBhIG1vZHVsZSBpZCBiYXNlZCBvbiBwb3NzaWJseS1uZXN0ZWQgdGVuYXJ5IGV4cHJlc3Npb24gdGhhdCBicmFuY2hlcyBvbiBoYXMgZmVhdHVyZSB0ZXN0XHJcbiAqIHZhbHVlKHMpLlxyXG4gKlxyXG4gKiBAcGFyYW0gcmVzb3VyY2VJZCBUaGUgaWQgb2YgdGhlIG1vZHVsZVxyXG4gKiBAcGFyYW0gbm9ybWFsaXplIFJlc29sdmVzIGEgcmVsYXRpdmUgbW9kdWxlIGlkIGludG8gYW4gYWJzb2x1dGUgbW9kdWxlIGlkXHJcbiAqL1xyXG5mdW5jdGlvbiBub3JtYWxpemUocmVzb3VyY2VJZCwgbm9ybWFsaXplKSB7XHJcbiAgICB2YXIgdG9rZW5zID0gcmVzb3VyY2VJZC5tYXRjaCgvW1xcPzpdfFteOlxcP10qL2cpIHx8IFtdO1xyXG4gICAgdmFyIGkgPSAwO1xyXG4gICAgZnVuY3Rpb24gZ2V0KHNraXApIHtcclxuICAgICAgICB2YXIgdGVybSA9IHRva2Vuc1tpKytdO1xyXG4gICAgICAgIGlmICh0ZXJtID09PSAnOicpIHtcclxuICAgICAgICAgICAgLy8gZW1wdHkgc3RyaW5nIG1vZHVsZSBuYW1lLCByZXNvbHZlcyB0byBudWxsXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gcG9zdGZpeGVkIHdpdGggYSA/IG1lYW5zIGl0IGlzIGEgZmVhdHVyZSB0byBicmFuY2ggb24sIHRoZSB0ZXJtIGlzIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlXHJcbiAgICAgICAgICAgIGlmICh0b2tlbnNbaSsrXSA9PT0gJz8nKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNraXAgJiYgaGFzKHRlcm0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hlZCB0aGUgZmVhdHVyZSwgZ2V0IHRoZSBmaXJzdCB2YWx1ZSBmcm9tIHRoZSBvcHRpb25zXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZGlkIG5vdCBtYXRjaCwgZ2V0IHRoZSBzZWNvbmQgdmFsdWUsIHBhc3Npbmcgb3ZlciB0aGUgZmlyc3RcclxuICAgICAgICAgICAgICAgICAgICBnZXQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChza2lwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBhIG1vZHVsZVxyXG4gICAgICAgICAgICByZXR1cm4gdGVybTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB2YXIgaWQgPSBnZXQoKTtcclxuICAgIHJldHVybiBpZCAmJiBub3JtYWxpemUoaWQpO1xyXG59XHJcbmV4cG9ydHMubm9ybWFsaXplID0gbm9ybWFsaXplO1xyXG4vKipcclxuICogQ2hlY2sgaWYgYSBmZWF0dXJlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZFxyXG4gKlxyXG4gKiBAcGFyYW0gZmVhdHVyZSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZVxyXG4gKi9cclxuZnVuY3Rpb24gZXhpc3RzKGZlYXR1cmUpIHtcclxuICAgIHZhciBub3JtYWxpemVkRmVhdHVyZSA9IGZlYXR1cmUudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiBCb29sZWFuKG5vcm1hbGl6ZWRGZWF0dXJlIGluIHN0YXRpY0NhY2hlIHx8IG5vcm1hbGl6ZWRGZWF0dXJlIGluIGV4cG9ydHMudGVzdENhY2hlIHx8IGV4cG9ydHMudGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV0pO1xyXG59XHJcbmV4cG9ydHMuZXhpc3RzID0gZXhpc3RzO1xyXG4vKipcclxuICogUmVnaXN0ZXIgYSBuZXcgdGVzdCBmb3IgYSBuYW1lZCBmZWF0dXJlLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBoYXMuYWRkKCdkb20tYWRkZXZlbnRsaXN0ZW5lcicsICEhZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcik7XHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGhhcy5hZGQoJ3RvdWNoLWV2ZW50cycsIGZ1bmN0aW9uICgpIHtcclxuICogICAgcmV0dXJuICdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50XHJcbiAqIH0pO1xyXG4gKlxyXG4gKiBAcGFyYW0gZmVhdHVyZSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZVxyXG4gKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHJlcG9ydGVkIG9mIHRoZSBmZWF0dXJlLCBvciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBvbmNlIG9uIGZpcnN0IHRlc3RcclxuICogQHBhcmFtIG92ZXJ3cml0ZSBpZiBhbiBleGlzdGluZyB2YWx1ZSBzaG91bGQgYmUgb3ZlcndyaXR0ZW4uIERlZmF1bHRzIHRvIGZhbHNlLlxyXG4gKi9cclxuZnVuY3Rpb24gYWRkKGZlYXR1cmUsIHZhbHVlLCBvdmVyd3JpdGUpIHtcclxuICAgIGlmIChvdmVyd3JpdGUgPT09IHZvaWQgMCkgeyBvdmVyd3JpdGUgPSBmYWxzZTsgfVxyXG4gICAgdmFyIG5vcm1hbGl6ZWRGZWF0dXJlID0gZmVhdHVyZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgaWYgKGV4aXN0cyhub3JtYWxpemVkRmVhdHVyZSkgJiYgIW92ZXJ3cml0ZSAmJiAhKG5vcm1hbGl6ZWRGZWF0dXJlIGluIHN0YXRpY0NhY2hlKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGZWF0dXJlIFxcXCJcIiArIGZlYXR1cmUgKyBcIlxcXCIgZXhpc3RzIGFuZCBvdmVyd3JpdGUgbm90IHRydWUuXCIpO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIGV4cG9ydHMudGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV0gPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGlzRmVhdHVyZVRlc3RUaGVuYWJsZSh2YWx1ZSkpIHtcclxuICAgICAgICB0ZXN0VGhlbmFibGVzW2ZlYXR1cmVdID0gdmFsdWUudGhlbihmdW5jdGlvbiAocmVzb2x2ZWRWYWx1ZSkge1xyXG4gICAgICAgICAgICBleHBvcnRzLnRlc3RDYWNoZVtmZWF0dXJlXSA9IHJlc29sdmVkVmFsdWU7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0ZXN0VGhlbmFibGVzW2ZlYXR1cmVdO1xyXG4gICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZGVsZXRlIHRlc3RUaGVuYWJsZXNbZmVhdHVyZV07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBleHBvcnRzLnRlc3RDYWNoZVtub3JtYWxpemVkRmVhdHVyZV0gPSB2YWx1ZTtcclxuICAgICAgICBkZWxldGUgZXhwb3J0cy50ZXN0RnVuY3Rpb25zW25vcm1hbGl6ZWRGZWF0dXJlXTtcclxuICAgIH1cclxufVxyXG5leHBvcnRzLmFkZCA9IGFkZDtcclxuLyoqXHJcbiAqIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBvZiBhIG5hbWVkIGZlYXR1cmUuXHJcbiAqXHJcbiAqIEBwYXJhbSBmZWF0dXJlIFRoZSBuYW1lIChpZiBhIHN0cmluZykgb3IgaWRlbnRpZmllciAoaWYgYW4gaW50ZWdlcikgb2YgdGhlIGZlYXR1cmUgdG8gdGVzdC5cclxuICovXHJcbmZ1bmN0aW9uIGhhcyhmZWF0dXJlKSB7XHJcbiAgICB2YXIgcmVzdWx0O1xyXG4gICAgdmFyIG5vcm1hbGl6ZWRGZWF0dXJlID0gZmVhdHVyZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgaWYgKG5vcm1hbGl6ZWRGZWF0dXJlIGluIHN0YXRpY0NhY2hlKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gc3RhdGljQ2FjaGVbbm9ybWFsaXplZEZlYXR1cmVdO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZXhwb3J0cy50ZXN0RnVuY3Rpb25zW25vcm1hbGl6ZWRGZWF0dXJlXSkge1xyXG4gICAgICAgIHJlc3VsdCA9IGV4cG9ydHMudGVzdENhY2hlW25vcm1hbGl6ZWRGZWF0dXJlXSA9IGV4cG9ydHMudGVzdEZ1bmN0aW9uc1tub3JtYWxpemVkRmVhdHVyZV0uY2FsbChudWxsKTtcclxuICAgICAgICBkZWxldGUgZXhwb3J0cy50ZXN0RnVuY3Rpb25zW25vcm1hbGl6ZWRGZWF0dXJlXTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKG5vcm1hbGl6ZWRGZWF0dXJlIGluIGV4cG9ydHMudGVzdENhY2hlKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gZXhwb3J0cy50ZXN0Q2FjaGVbbm9ybWFsaXplZEZlYXR1cmVdO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZmVhdHVyZSBpbiB0ZXN0VGhlbmFibGVzKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkF0dGVtcHQgdG8gZGV0ZWN0IHVucmVnaXN0ZXJlZCBoYXMgZmVhdHVyZSBcXFwiXCIgKyBmZWF0dXJlICsgXCJcXFwiXCIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5leHBvcnRzLmRlZmF1bHQgPSBoYXM7XHJcbi8qXHJcbiAqIE91dCBvZiB0aGUgYm94IGZlYXR1cmUgdGVzdHNcclxuICovXHJcbi8qIEVudmlyb25tZW50cyAqL1xyXG4vKiBVc2VkIGFzIGEgdmFsdWUgdG8gcHJvdmlkZSBhIGRlYnVnIG9ubHkgY29kZSBwYXRoICovXHJcbmFkZCgnZGVidWcnLCB0cnVlKTtcclxuLyogRGV0ZWN0cyBpZiB0aGUgZW52aXJvbm1lbnQgaXMgXCJicm93c2VyIGxpa2VcIiAqL1xyXG5hZGQoJ2hvc3QtYnJvd3NlcicsIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGxvY2F0aW9uICE9PSAndW5kZWZpbmVkJyk7XHJcbi8qIERldGVjdHMgaWYgdGhlIGVudmlyb25tZW50IGFwcGVhcnMgdG8gYmUgTm9kZUpTICovXHJcbmFkZCgnaG9zdC1ub2RlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzLnZlcnNpb25zICYmIHByb2Nlc3MudmVyc2lvbnMubm9kZSkge1xyXG4gICAgICAgIHJldHVybiBwcm9jZXNzLnZlcnNpb25zLm5vZGU7XHJcbiAgICB9XHJcbn0pO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9oYXMvaGFzLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvaGFzL2hhcy5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcclxudmFyIGl0ZXJhdG9yXzEgPSByZXF1aXJlKFwiLi9pdGVyYXRvclwiKTtcclxudmFyIGdsb2JhbF8xID0gcmVxdWlyZShcIi4vZ2xvYmFsXCIpO1xyXG52YXIgb2JqZWN0XzEgPSByZXF1aXJlKFwiLi9vYmplY3RcIik7XHJcbnZhciBoYXNfMSA9IHJlcXVpcmUoXCIuL3N1cHBvcnQvaGFzXCIpO1xyXG5yZXF1aXJlKFwiLi9TeW1ib2xcIik7XHJcbmV4cG9ydHMuTWFwID0gZ2xvYmFsXzEuZGVmYXVsdC5NYXA7XHJcbmlmICghaGFzXzEuZGVmYXVsdCgnZXM2LW1hcCcpKSB7XHJcbiAgICBleHBvcnRzLk1hcCA9IChfYSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZnVuY3Rpb24gTWFwKGl0ZXJhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gW107XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSBbXTtcclxuICAgICAgICAgICAgICAgIHRoaXNbU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdNYXAnO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZXJhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZXJhdG9yXzEuaXNBcnJheUxpa2UoaXRlcmFibGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlcmFibGUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGl0ZXJhYmxlW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQodmFsdWVbMF0sIHZhbHVlWzFdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGl0ZXJhYmxlXzEgPSB0c2xpYl8xLl9fdmFsdWVzKGl0ZXJhYmxlKSwgaXRlcmFibGVfMV8xID0gaXRlcmFibGVfMS5uZXh0KCk7ICFpdGVyYWJsZV8xXzEuZG9uZTsgaXRlcmFibGVfMV8xID0gaXRlcmFibGVfMS5uZXh0KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBpdGVyYWJsZV8xXzEudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQodmFsdWVbMF0sIHZhbHVlWzFdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZXJhYmxlXzFfMSAmJiAhaXRlcmFibGVfMV8xLmRvbmUgJiYgKF9hID0gaXRlcmFibGVfMS5yZXR1cm4pKSBfYS5jYWxsKGl0ZXJhYmxlXzEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFyIGVfMSwgX2E7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEFuIGFsdGVybmF0aXZlIHRvIEFycmF5LnByb3RvdHlwZS5pbmRleE9mIHVzaW5nIE9iamVjdC5pc1xyXG4gICAgICAgICAgICAgKiB0byBjaGVjayBmb3IgZXF1YWxpdHkuIFNlZSBodHRwOi8vbXpsLmxhLzF6dUtPMlZcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuX2luZGV4T2ZLZXkgPSBmdW5jdGlvbiAoa2V5cywga2V5KSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoXzEgPSBrZXlzLmxlbmd0aDsgaSA8IGxlbmd0aF8xOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0XzEuaXMoa2V5c1tpXSwga2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShNYXAucHJvdG90eXBlLCBcInNpemVcIiwge1xyXG4gICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2tleXMubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9rZXlzLmxlbmd0aCA9IHRoaXMuX3ZhbHVlcy5sZW5ndGggPSAwO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBNYXAucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2luZGV4T2ZLZXkodGhpcy5fa2V5cywga2V5KTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9rZXlzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBNYXAucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuX2tleXMubWFwKGZ1bmN0aW9uIChrZXksIGkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgX3RoaXMuX3ZhbHVlc1tpXV07XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgaXRlcmF0b3JfMS5TaGltSXRlcmF0b3IodmFsdWVzKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIga2V5cyA9IHRoaXMuX2tleXM7XHJcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy5fdmFsdWVzO1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aF8yID0ga2V5cy5sZW5ndGg7IGkgPCBsZW5ndGhfMjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCB2YWx1ZXNbaV0sIGtleXNbaV0sIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2luZGV4T2ZLZXkodGhpcy5fa2V5cywga2V5KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiB0aGlzLl92YWx1ZXNbaW5kZXhdO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBNYXAucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbmRleE9mS2V5KHRoaXMuX2tleXMsIGtleSkgPiAtMTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBpdGVyYXRvcl8xLlNoaW1JdGVyYXRvcih0aGlzLl9rZXlzKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5faW5kZXhPZktleSh0aGlzLl9rZXlzLCBrZXkpO1xyXG4gICAgICAgICAgICAgICAgaW5kZXggPSBpbmRleCA8IDAgPyB0aGlzLl9rZXlzLmxlbmd0aCA6IGluZGV4O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fa2V5c1tpbmRleF0gPSBrZXk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNbaW5kZXhdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgTWFwLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGl0ZXJhdG9yXzEuU2hpbUl0ZXJhdG9yKHRoaXMuX3ZhbHVlcyk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIE1hcC5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmV0dXJuIE1hcDtcclxuICAgICAgICB9KCkpLFxyXG4gICAgICAgIF9hW1N5bWJvbC5zcGVjaWVzXSA9IF9hLFxyXG4gICAgICAgIF9hKTtcclxufVxyXG5leHBvcnRzLmRlZmF1bHQgPSBleHBvcnRzLk1hcDtcclxudmFyIF9hO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL01hcC5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vTWFwLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xyXG52YXIgZ2xvYmFsXzEgPSByZXF1aXJlKFwiLi9nbG9iYWxcIik7XHJcbnZhciBxdWV1ZV8xID0gcmVxdWlyZShcIi4vc3VwcG9ydC9xdWV1ZVwiKTtcclxucmVxdWlyZShcIi4vU3ltYm9sXCIpO1xyXG52YXIgaGFzXzEgPSByZXF1aXJlKFwiLi9zdXBwb3J0L2hhc1wiKTtcclxuZXhwb3J0cy5TaGltUHJvbWlzZSA9IGdsb2JhbF8xLmRlZmF1bHQuUHJvbWlzZTtcclxuZXhwb3J0cy5pc1RoZW5hYmxlID0gZnVuY3Rpb24gaXNUaGVuYWJsZSh2YWx1ZSkge1xyXG4gICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nO1xyXG59O1xyXG5pZiAoIWhhc18xLmRlZmF1bHQoJ2VzNi1wcm9taXNlJykpIHtcclxuICAgIGdsb2JhbF8xLmRlZmF1bHQuUHJvbWlzZSA9IGV4cG9ydHMuU2hpbVByb21pc2UgPSAoX2EgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IFByb21pc2UuXHJcbiAgICAgICAgICAgICAqXHJcbiAgICAgICAgICAgICAqIEBjb25zdHJ1Y3RvclxyXG4gICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAgKiBAcGFyYW0gZXhlY3V0b3JcclxuICAgICAgICAgICAgICogVGhlIGV4ZWN1dG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbW1lZGlhdGVseSB3aGVuIHRoZSBQcm9taXNlIGlzIGluc3RhbnRpYXRlZC4gSXQgaXMgcmVzcG9uc2libGUgZm9yXHJcbiAgICAgICAgICAgICAqIHN0YXJ0aW5nIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoZW4gaXQgaXMgaW52b2tlZC5cclxuICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgICogVGhlIGV4ZWN1dG9yIG11c3QgY2FsbCBlaXRoZXIgdGhlIHBhc3NlZCBgcmVzb2x2ZWAgZnVuY3Rpb24gd2hlbiB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkXHJcbiAgICAgICAgICAgICAqIHN1Y2Nlc3NmdWxseSwgb3IgdGhlIGByZWplY3RgIGZ1bmN0aW9uIHdoZW4gdGhlIG9wZXJhdGlvbiBmYWlscy5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcclxuICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoaXMgcHJvbWlzZS5cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IDEgLyogUGVuZGluZyAqLztcclxuICAgICAgICAgICAgICAgIHRoaXNbU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdQcm9taXNlJztcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogSWYgdHJ1ZSwgdGhlIHJlc29sdXRpb24gb2YgdGhpcyBwcm9taXNlIGlzIGNoYWluZWQgKFwibG9ja2VkIGluXCIpIHRvIGFub3RoZXIgcHJvbWlzZS5cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgdmFyIGlzQ2hhaW5lZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGlzIHByb21pc2UgaXMgaW4gYSByZXNvbHZlZCBzdGF0ZS5cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgdmFyIGlzUmVzb2x2ZWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnN0YXRlICE9PSAxIC8qIFBlbmRpbmcgKi8gfHwgaXNDaGFpbmVkO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogQ2FsbGJhY2tzIHRoYXQgc2hvdWxkIGJlIGludm9rZWQgb25jZSB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLlxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2tzID0gW107XHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIEluaXRpYWxseSBwdXNoZXMgY2FsbGJhY2tzIG9udG8gYSBxdWV1ZSBmb3IgZXhlY3V0aW9uIG9uY2UgdGhpcyBwcm9taXNlIHNldHRsZXMuIEFmdGVyIHRoZSBwcm9taXNlIHNldHRsZXMsXHJcbiAgICAgICAgICAgICAgICAgKiBlbnF1ZXVlcyBjYWxsYmFja3MgZm9yIGV4ZWN1dGlvbiBvbiB0aGUgbmV4dCBldmVudCBsb29wIHR1cm4uXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIHZhciB3aGVuRmluaXNoZWQgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBTZXR0bGVzIHRoaXMgcHJvbWlzZS5cclxuICAgICAgICAgICAgICAgICAqXHJcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gbmV3U3RhdGUgVGhlIHJlc29sdmVkIHN0YXRlIGZvciB0aGlzIHByb21pc2UuXHJcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0ge1R8YW55fSB2YWx1ZSBUaGUgcmVzb2x2ZWQgdmFsdWUgZm9yIHRoaXMgcHJvbWlzZS5cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgdmFyIHNldHRsZSA9IGZ1bmN0aW9uIChuZXdTdGF0ZSwgdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBBIHByb21pc2UgY2FuIG9ubHkgYmUgc2V0dGxlZCBvbmNlLlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5zdGF0ZSAhPT0gMSAvKiBQZW5kaW5nICovKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuc3RhdGUgPSBuZXdTdGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZXNvbHZlZFZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgd2hlbkZpbmlzaGVkID0gcXVldWVfMS5xdWV1ZU1pY3JvVGFzaztcclxuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGVucXVldWUgYSBjYWxsYmFjayBydW5uZXIgaWYgdGhlcmUgYXJlIGNhbGxiYWNrcyBzbyB0aGF0IGluaXRpYWxseSBmdWxmaWxsZWQgUHJvbWlzZXMgZG9uJ3QgaGF2ZSB0b1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgYW4gZXh0cmEgdHVybi5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tzICYmIGNhbGxiYWNrcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlXzEucXVldWVNaWNyb1Rhc2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb3VudCA9IGNhbGxiYWNrcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrc1tpXS5jYWxsKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBSZXNvbHZlcyB0aGlzIHByb21pc2UuXHJcbiAgICAgICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIG5ld1N0YXRlIFRoZSByZXNvbHZlZCBzdGF0ZSBmb3IgdGhpcyBwcm9taXNlLlxyXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIHtUfGFueX0gdmFsdWUgVGhlIHJlc29sdmVkIHZhbHVlIGZvciB0aGlzIHByb21pc2UuXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIHZhciByZXNvbHZlID0gZnVuY3Rpb24gKG5ld1N0YXRlLCB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1Jlc29sdmVkKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXhwb3J0cy5pc1RoZW5hYmxlKHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS50aGVuKHNldHRsZS5iaW5kKG51bGwsIDAgLyogRnVsZmlsbGVkICovKSwgc2V0dGxlLmJpbmQobnVsbCwgMiAvKiBSZWplY3RlZCAqLykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NoYWluZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGxlKG5ld1N0YXRlLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHRoaXMudGhlbiA9IGZ1bmN0aW9uIChvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW5GaW5pc2hlZCBpbml0aWFsbHkgcXVldWVzIHVwIGNhbGxiYWNrcyBmb3IgZXhlY3V0aW9uIGFmdGVyIHRoZSBwcm9taXNlIGhhcyBzZXR0bGVkLiBPbmNlIHRoZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9taXNlIGhhcyBzZXR0bGVkLCB3aGVuRmluaXNoZWQgd2lsbCBzY2hlZHVsZSBjYWxsYmFja3MgZm9yIGV4ZWN1dGlvbiBvbiB0aGUgbmV4dCB0dXJuIHRocm91Z2ggdGhlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IGxvb3AuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZW5GaW5pc2hlZChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBfdGhpcy5zdGF0ZSA9PT0gMiAvKiBSZWplY3RlZCAqLyA/IG9uUmVqZWN0ZWQgOiBvbkZ1bGZpbGxlZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNhbGxiYWNrKF90aGlzLnJlc29sdmVkVmFsdWUpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoX3RoaXMuc3RhdGUgPT09IDIgLyogUmVqZWN0ZWQgKi8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoX3RoaXMucmVzb2x2ZWRWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKF90aGlzLnJlc29sdmVkVmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yKHJlc29sdmUuYmluZChudWxsLCAwIC8qIEZ1bGZpbGxlZCAqLyksIHJlc29sdmUuYmluZChudWxsLCAyIC8qIFJlamVjdGVkICovKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXR0bGUoMiAvKiBSZWplY3RlZCAqLywgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFByb21pc2UuYWxsID0gZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgY29tcGxldGUgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB0b3RhbCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBvcHVsYXRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGwoaW5kZXgsIHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc1tpbmRleF0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKytjb21wbGV0ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZpbmlzaCgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcHVsYXRpbmcgfHwgY29tcGxldGUgPCB0b3RhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWVzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcHJvY2Vzc0l0ZW0oaW5kZXgsIGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKyt0b3RhbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cG9ydHMuaXNUaGVuYWJsZShpdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYW4gaXRlbSBQcm9taXNlIHJlamVjdHMsIHRoaXMgUHJvbWlzZSBpcyBpbW1lZGlhdGVseSByZWplY3RlZCB3aXRoIHRoZSBpdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9taXNlJ3MgcmVqZWN0aW9uIGVycm9yLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS50aGVuKGZ1bGZpbGwuYmluZChudWxsLCBpbmRleCksIHJlamVjdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoaXRlbSkudGhlbihmdWxmaWxsLmJpbmQobnVsbCwgaW5kZXgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaXRlcmFibGVfMSA9IHRzbGliXzEuX192YWx1ZXMoaXRlcmFibGUpLCBpdGVyYWJsZV8xXzEgPSBpdGVyYWJsZV8xLm5leHQoKTsgIWl0ZXJhYmxlXzFfMS5kb25lOyBpdGVyYWJsZV8xXzEgPSBpdGVyYWJsZV8xLm5leHQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gaXRlcmFibGVfMV8xLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0l0ZW0oaSwgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XHJcbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlcmFibGVfMV8xICYmICFpdGVyYWJsZV8xXzEuZG9uZSAmJiAoX2EgPSBpdGVyYWJsZV8xLnJldHVybikpIF9hLmNhbGwoaXRlcmFibGVfMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBwb3B1bGF0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVfMSwgX2E7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgUHJvbWlzZS5yYWNlID0gZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGl0ZXJhYmxlXzIgPSB0c2xpYl8xLl9fdmFsdWVzKGl0ZXJhYmxlKSwgaXRlcmFibGVfMl8xID0gaXRlcmFibGVfMi5uZXh0KCk7ICFpdGVyYWJsZV8yXzEuZG9uZTsgaXRlcmFibGVfMl8xID0gaXRlcmFibGVfMi5uZXh0KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gaXRlcmFibGVfMl8xLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSBQcm9taXNlIGl0ZW0gcmVqZWN0cywgdGhpcyBQcm9taXNlIGlzIGltbWVkaWF0ZWx5IHJlamVjdGVkIHdpdGggdGhlIGl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9taXNlJ3MgcmVqZWN0aW9uIGVycm9yLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0udGhlbihyZXNvbHZlLCByZWplY3QpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKGl0ZW0pLnRoZW4ocmVzb2x2ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMl8xKSB7IGVfMiA9IHsgZXJyb3I6IGVfMl8xIH07IH1cclxuICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVyYWJsZV8yXzEgJiYgIWl0ZXJhYmxlXzJfMS5kb25lICYmIChfYSA9IGl0ZXJhYmxlXzIucmV0dXJuKSkgX2EuY2FsbChpdGVyYWJsZV8yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBlXzIsIF9hO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIFByb21pc2UucmVqZWN0ID0gZnVuY3Rpb24gKHJlYXNvbikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcyhmdW5jdGlvbiAocmVzb2x2ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIFByb21pc2UucHJvdG90eXBlLmNhdGNoID0gZnVuY3Rpb24gKG9uUmVqZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2U7XHJcbiAgICAgICAgfSgpKSxcclxuICAgICAgICBfYVtTeW1ib2wuc3BlY2llc10gPSBleHBvcnRzLlNoaW1Qcm9taXNlLFxyXG4gICAgICAgIF9hKTtcclxufVxyXG5leHBvcnRzLmRlZmF1bHQgPSBleHBvcnRzLlNoaW1Qcm9taXNlO1xyXG52YXIgX2E7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vUHJvbWlzZS5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vUHJvbWlzZS5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcclxudmFyIGdsb2JhbF8xID0gcmVxdWlyZShcIi4vZ2xvYmFsXCIpO1xyXG52YXIgaXRlcmF0b3JfMSA9IHJlcXVpcmUoXCIuL2l0ZXJhdG9yXCIpO1xyXG52YXIgaGFzXzEgPSByZXF1aXJlKFwiLi9zdXBwb3J0L2hhc1wiKTtcclxucmVxdWlyZShcIi4vU3ltYm9sXCIpO1xyXG5leHBvcnRzLlNldCA9IGdsb2JhbF8xLmRlZmF1bHQuU2V0O1xyXG5pZiAoIWhhc18xLmRlZmF1bHQoJ2VzNi1zZXQnKSkge1xyXG4gICAgZXhwb3J0cy5TZXQgPSAoX2EgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIFNldChpdGVyYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0RGF0YSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgdGhpc1tTeW1ib2wudG9TdHJpbmdUYWddID0gJ1NldCc7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlcmFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlcmF0b3JfMS5pc0FycmF5TGlrZShpdGVyYWJsZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVyYWJsZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGQoaXRlcmFibGVbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaXRlcmFibGVfMSA9IHRzbGliXzEuX192YWx1ZXMoaXRlcmFibGUpLCBpdGVyYWJsZV8xXzEgPSBpdGVyYWJsZV8xLm5leHQoKTsgIWl0ZXJhYmxlXzFfMS5kb25lOyBpdGVyYWJsZV8xXzEgPSBpdGVyYWJsZV8xLm5leHQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGl0ZXJhYmxlXzFfMS52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZCh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVyYWJsZV8xXzEgJiYgIWl0ZXJhYmxlXzFfMS5kb25lICYmIChfYSA9IGl0ZXJhYmxlXzEucmV0dXJuKSkgX2EuY2FsbChpdGVyYWJsZV8xKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhciBlXzEsIF9hO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFNldC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXModmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXREYXRhLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIFNldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXREYXRhLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIFNldC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaWR4ID0gdGhpcy5fc2V0RGF0YS5pbmRleE9mKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGlmIChpZHggPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0RGF0YS5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBTZXQucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGl0ZXJhdG9yXzEuU2hpbUl0ZXJhdG9yKHRoaXMuX3NldERhdGEubWFwKGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gW3ZhbHVlLCB2YWx1ZV07IH0pKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrZm4sIHRoaXNBcmcpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IHRoaXMudmFsdWVzKCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKCFyZXN1bHQuZG9uZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4uY2FsbCh0aGlzQXJnLCByZXN1bHQudmFsdWUsIHJlc3VsdC52YWx1ZSwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBTZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NldERhdGEuaW5kZXhPZih2YWx1ZSkgPiAtMTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBpdGVyYXRvcl8xLlNoaW1JdGVyYXRvcih0aGlzLl9zZXREYXRhKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNldC5wcm90b3R5cGUsIFwic2l6ZVwiLCB7XHJcbiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2V0RGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgU2V0LnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGl0ZXJhdG9yXzEuU2hpbUl0ZXJhdG9yKHRoaXMuX3NldERhdGEpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBTZXQucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGl0ZXJhdG9yXzEuU2hpbUl0ZXJhdG9yKHRoaXMuX3NldERhdGEpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXR1cm4gU2V0O1xyXG4gICAgICAgIH0oKSksXHJcbiAgICAgICAgX2FbU3ltYm9sLnNwZWNpZXNdID0gX2EsXHJcbiAgICAgICAgX2EpO1xyXG59XHJcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMuU2V0O1xyXG52YXIgX2E7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vU2V0LmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9TZXQuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxudmFyIGhhc18xID0gcmVxdWlyZShcIi4vc3VwcG9ydC9oYXNcIik7XHJcbnZhciBnbG9iYWxfMSA9IHJlcXVpcmUoXCIuL2dsb2JhbFwiKTtcclxudmFyIHV0aWxfMSA9IHJlcXVpcmUoXCIuL3N1cHBvcnQvdXRpbFwiKTtcclxuZXhwb3J0cy5TeW1ib2wgPSBnbG9iYWxfMS5kZWZhdWx0LlN5bWJvbDtcclxuaWYgKCFoYXNfMS5kZWZhdWx0KCdlczYtc3ltYm9sJykpIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhyb3dzIGlmIHRoZSB2YWx1ZSBpcyBub3QgYSBzeW1ib2wsIHVzZWQgaW50ZXJuYWxseSB3aXRoaW4gdGhlIFNoaW1cclxuICAgICAqIEBwYXJhbSAge2FueX0gICAgdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJuIHtzeW1ib2x9ICAgICAgIFJldHVybnMgdGhlIHN5bWJvbCBvciB0aHJvd3NcclxuICAgICAqL1xyXG4gICAgdmFyIHZhbGlkYXRlU3ltYm9sXzEgPSBmdW5jdGlvbiB2YWxpZGF0ZVN5bWJvbCh2YWx1ZSkge1xyXG4gICAgICAgIGlmICghaXNTeW1ib2wodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IodmFsdWUgKyAnIGlzIG5vdCBhIHN5bWJvbCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9O1xyXG4gICAgdmFyIGRlZmluZVByb3BlcnRpZXNfMSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzO1xyXG4gICAgdmFyIGRlZmluZVByb3BlcnR5XzEgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XHJcbiAgICB2YXIgY3JlYXRlXzEgPSBPYmplY3QuY3JlYXRlO1xyXG4gICAgdmFyIG9ialByb3RvdHlwZV8xID0gT2JqZWN0LnByb3RvdHlwZTtcclxuICAgIHZhciBnbG9iYWxTeW1ib2xzXzEgPSB7fTtcclxuICAgIHZhciBnZXRTeW1ib2xOYW1lXzEgPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlXzEobnVsbCk7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChkZXNjKSB7XHJcbiAgICAgICAgICAgIHZhciBwb3N0Zml4ID0gMDtcclxuICAgICAgICAgICAgdmFyIG5hbWU7XHJcbiAgICAgICAgICAgIHdoaWxlIChjcmVhdGVkW1N0cmluZyhkZXNjKSArIChwb3N0Zml4IHx8ICcnKV0pIHtcclxuICAgICAgICAgICAgICAgICsrcG9zdGZpeDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkZXNjICs9IFN0cmluZyhwb3N0Zml4IHx8ICcnKTtcclxuICAgICAgICAgICAgY3JlYXRlZFtkZXNjXSA9IHRydWU7XHJcbiAgICAgICAgICAgIG5hbWUgPSAnQEAnICsgZGVzYztcclxuICAgICAgICAgICAgLy8gRklYTUU6IFRlbXBvcmFyeSBndWFyZCB1bnRpbCB0aGUgZHVwbGljYXRlIGV4ZWN1dGlvbiB3aGVuIHRlc3RpbmcgY2FuIGJlXHJcbiAgICAgICAgICAgIC8vIHBpbm5lZCBkb3duLlxyXG4gICAgICAgICAgICBpZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqUHJvdG90eXBlXzEsIG5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBkZWZpbmVQcm9wZXJ0eV8xKG9ialByb3RvdHlwZV8xLCBuYW1lLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lUHJvcGVydHlfMSh0aGlzLCBuYW1lLCB1dGlsXzEuZ2V0VmFsdWVEZXNjcmlwdG9yKHZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5hbWU7XHJcbiAgICAgICAgfTtcclxuICAgIH0pKCk7XHJcbiAgICB2YXIgSW50ZXJuYWxTeW1ib2xfMSA9IGZ1bmN0aW9uIFN5bWJvbChkZXNjcmlwdGlvbikge1xyXG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgSW50ZXJuYWxTeW1ib2xfMSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUeXBlRXJyb3I6IFN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gU3ltYm9sKGRlc2NyaXB0aW9uKTtcclxuICAgIH07XHJcbiAgICBleHBvcnRzLlN5bWJvbCA9IGdsb2JhbF8xLmRlZmF1bHQuU3ltYm9sID0gZnVuY3Rpb24gU3ltYm9sKGRlc2NyaXB0aW9uKSB7XHJcbiAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBTeW1ib2wpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHlwZUVycm9yOiBTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3InKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHN5bSA9IE9iamVjdC5jcmVhdGUoSW50ZXJuYWxTeW1ib2xfMS5wcm90b3R5cGUpO1xyXG4gICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCA/ICcnIDogU3RyaW5nKGRlc2NyaXB0aW9uKTtcclxuICAgICAgICByZXR1cm4gZGVmaW5lUHJvcGVydGllc18xKHN5bSwge1xyXG4gICAgICAgICAgICBfX2Rlc2NyaXB0aW9uX186IHV0aWxfMS5nZXRWYWx1ZURlc2NyaXB0b3IoZGVzY3JpcHRpb24pLFxyXG4gICAgICAgICAgICBfX25hbWVfXzogdXRpbF8xLmdldFZhbHVlRGVzY3JpcHRvcihnZXRTeW1ib2xOYW1lXzEoZGVzY3JpcHRpb24pKVxyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIC8qIERlY29yYXRlIHRoZSBTeW1ib2wgZnVuY3Rpb24gd2l0aCB0aGUgYXBwcm9wcmlhdGUgcHJvcGVydGllcyAqL1xyXG4gICAgZGVmaW5lUHJvcGVydHlfMShleHBvcnRzLlN5bWJvbCwgJ2ZvcicsIHV0aWxfMS5nZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgIGlmIChnbG9iYWxTeW1ib2xzXzFba2V5XSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsU3ltYm9sc18xW2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoZ2xvYmFsU3ltYm9sc18xW2tleV0gPSBleHBvcnRzLlN5bWJvbChTdHJpbmcoa2V5KSkpO1xyXG4gICAgfSkpO1xyXG4gICAgZGVmaW5lUHJvcGVydGllc18xKGV4cG9ydHMuU3ltYm9sLCB7XHJcbiAgICAgICAga2V5Rm9yOiB1dGlsXzEuZ2V0VmFsdWVEZXNjcmlwdG9yKGZ1bmN0aW9uIChzeW0pIHtcclxuICAgICAgICAgICAgdmFyIGtleTtcclxuICAgICAgICAgICAgdmFsaWRhdGVTeW1ib2xfMShzeW0pO1xyXG4gICAgICAgICAgICBmb3IgKGtleSBpbiBnbG9iYWxTeW1ib2xzXzEpIHtcclxuICAgICAgICAgICAgICAgIGlmIChnbG9iYWxTeW1ib2xzXzFba2V5XSA9PT0gc3ltKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGhhc0luc3RhbmNlOiB1dGlsXzEuZ2V0VmFsdWVEZXNjcmlwdG9yKGV4cG9ydHMuU3ltYm9sLmZvcignaGFzSW5zdGFuY2UnKSwgZmFsc2UsIGZhbHNlKSxcclxuICAgICAgICBpc0NvbmNhdFNwcmVhZGFibGU6IHV0aWxfMS5nZXRWYWx1ZURlc2NyaXB0b3IoZXhwb3J0cy5TeW1ib2wuZm9yKCdpc0NvbmNhdFNwcmVhZGFibGUnKSwgZmFsc2UsIGZhbHNlKSxcclxuICAgICAgICBpdGVyYXRvcjogdXRpbF8xLmdldFZhbHVlRGVzY3JpcHRvcihleHBvcnRzLlN5bWJvbC5mb3IoJ2l0ZXJhdG9yJyksIGZhbHNlLCBmYWxzZSksXHJcbiAgICAgICAgbWF0Y2g6IHV0aWxfMS5nZXRWYWx1ZURlc2NyaXB0b3IoZXhwb3J0cy5TeW1ib2wuZm9yKCdtYXRjaCcpLCBmYWxzZSwgZmFsc2UpLFxyXG4gICAgICAgIG9ic2VydmFibGU6IHV0aWxfMS5nZXRWYWx1ZURlc2NyaXB0b3IoZXhwb3J0cy5TeW1ib2wuZm9yKCdvYnNlcnZhYmxlJyksIGZhbHNlLCBmYWxzZSksXHJcbiAgICAgICAgcmVwbGFjZTogdXRpbF8xLmdldFZhbHVlRGVzY3JpcHRvcihleHBvcnRzLlN5bWJvbC5mb3IoJ3JlcGxhY2UnKSwgZmFsc2UsIGZhbHNlKSxcclxuICAgICAgICBzZWFyY2g6IHV0aWxfMS5nZXRWYWx1ZURlc2NyaXB0b3IoZXhwb3J0cy5TeW1ib2wuZm9yKCdzZWFyY2gnKSwgZmFsc2UsIGZhbHNlKSxcclxuICAgICAgICBzcGVjaWVzOiB1dGlsXzEuZ2V0VmFsdWVEZXNjcmlwdG9yKGV4cG9ydHMuU3ltYm9sLmZvcignc3BlY2llcycpLCBmYWxzZSwgZmFsc2UpLFxyXG4gICAgICAgIHNwbGl0OiB1dGlsXzEuZ2V0VmFsdWVEZXNjcmlwdG9yKGV4cG9ydHMuU3ltYm9sLmZvcignc3BsaXQnKSwgZmFsc2UsIGZhbHNlKSxcclxuICAgICAgICB0b1ByaW1pdGl2ZTogdXRpbF8xLmdldFZhbHVlRGVzY3JpcHRvcihleHBvcnRzLlN5bWJvbC5mb3IoJ3RvUHJpbWl0aXZlJyksIGZhbHNlLCBmYWxzZSksXHJcbiAgICAgICAgdG9TdHJpbmdUYWc6IHV0aWxfMS5nZXRWYWx1ZURlc2NyaXB0b3IoZXhwb3J0cy5TeW1ib2wuZm9yKCd0b1N0cmluZ1RhZycpLCBmYWxzZSwgZmFsc2UpLFxyXG4gICAgICAgIHVuc2NvcGFibGVzOiB1dGlsXzEuZ2V0VmFsdWVEZXNjcmlwdG9yKGV4cG9ydHMuU3ltYm9sLmZvcigndW5zY29wYWJsZXMnKSwgZmFsc2UsIGZhbHNlKVxyXG4gICAgfSk7XHJcbiAgICAvKiBEZWNvcmF0ZSB0aGUgSW50ZXJuYWxTeW1ib2wgb2JqZWN0ICovXHJcbiAgICBkZWZpbmVQcm9wZXJ0aWVzXzEoSW50ZXJuYWxTeW1ib2xfMS5wcm90b3R5cGUsIHtcclxuICAgICAgICBjb25zdHJ1Y3RvcjogdXRpbF8xLmdldFZhbHVlRGVzY3JpcHRvcihleHBvcnRzLlN5bWJvbCksXHJcbiAgICAgICAgdG9TdHJpbmc6IHV0aWxfMS5nZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fX25hbWVfXztcclxuICAgICAgICB9LCBmYWxzZSwgZmFsc2UpXHJcbiAgICB9KTtcclxuICAgIC8qIERlY29yYXRlIHRoZSBTeW1ib2wucHJvdG90eXBlICovXHJcbiAgICBkZWZpbmVQcm9wZXJ0aWVzXzEoZXhwb3J0cy5TeW1ib2wucHJvdG90eXBlLCB7XHJcbiAgICAgICAgdG9TdHJpbmc6IHV0aWxfMS5nZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ1N5bWJvbCAoJyArIHZhbGlkYXRlU3ltYm9sXzEodGhpcykuX19kZXNjcmlwdGlvbl9fICsgJyknO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHZhbHVlT2Y6IHV0aWxfMS5nZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVTeW1ib2xfMSh0aGlzKTtcclxuICAgICAgICB9KVxyXG4gICAgfSk7XHJcbiAgICBkZWZpbmVQcm9wZXJ0eV8xKGV4cG9ydHMuU3ltYm9sLnByb3RvdHlwZSwgZXhwb3J0cy5TeW1ib2wudG9QcmltaXRpdmUsIHV0aWxfMS5nZXRWYWx1ZURlc2NyaXB0b3IoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB2YWxpZGF0ZVN5bWJvbF8xKHRoaXMpO1xyXG4gICAgfSkpO1xyXG4gICAgZGVmaW5lUHJvcGVydHlfMShleHBvcnRzLlN5bWJvbC5wcm90b3R5cGUsIGV4cG9ydHMuU3ltYm9sLnRvU3RyaW5nVGFnLCB1dGlsXzEuZ2V0VmFsdWVEZXNjcmlwdG9yKCdTeW1ib2wnLCBmYWxzZSwgZmFsc2UsIHRydWUpKTtcclxuICAgIGRlZmluZVByb3BlcnR5XzEoSW50ZXJuYWxTeW1ib2xfMS5wcm90b3R5cGUsIGV4cG9ydHMuU3ltYm9sLnRvUHJpbWl0aXZlLCB1dGlsXzEuZ2V0VmFsdWVEZXNjcmlwdG9yKGV4cG9ydHMuU3ltYm9sLnByb3RvdHlwZVtleHBvcnRzLlN5bWJvbC50b1ByaW1pdGl2ZV0sIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpO1xyXG4gICAgZGVmaW5lUHJvcGVydHlfMShJbnRlcm5hbFN5bWJvbF8xLnByb3RvdHlwZSwgZXhwb3J0cy5TeW1ib2wudG9TdHJpbmdUYWcsIHV0aWxfMS5nZXRWYWx1ZURlc2NyaXB0b3IoZXhwb3J0cy5TeW1ib2wucHJvdG90eXBlW2V4cG9ydHMuU3ltYm9sLnRvU3RyaW5nVGFnXSwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7XHJcbn1cclxuLyoqXHJcbiAqIEEgY3VzdG9tIGd1YXJkIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyBpZiBhbiBvYmplY3QgaXMgYSBzeW1ib2wgb3Igbm90XHJcbiAqIEBwYXJhbSAge2FueX0gICAgICAgdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrIHRvIHNlZSBpZiBpdCBpcyBhIHN5bWJvbCBvciBub3RcclxuICogQHJldHVybiB7aXMgc3ltYm9sfSAgICAgICBSZXR1cm5zIHRydWUgaWYgYSBzeW1ib2wgb3Igbm90IChhbmQgbmFycm93cyB0aGUgdHlwZSBndWFyZClcclxuICovXHJcbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gKHZhbHVlICYmICh0eXBlb2YgdmFsdWUgPT09ICdzeW1ib2wnIHx8IHZhbHVlWydAQHRvU3RyaW5nVGFnJ10gPT09ICdTeW1ib2wnKSkgfHwgZmFsc2U7XHJcbn1cclxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xyXG4vKipcclxuICogRmlsbCBhbnkgbWlzc2luZyB3ZWxsIGtub3duIHN5bWJvbHMgaWYgdGhlIG5hdGl2ZSBTeW1ib2wgaXMgbWlzc2luZyB0aGVtXHJcbiAqL1xyXG5bXHJcbiAgICAnaGFzSW5zdGFuY2UnLFxyXG4gICAgJ2lzQ29uY2F0U3ByZWFkYWJsZScsXHJcbiAgICAnaXRlcmF0b3InLFxyXG4gICAgJ3NwZWNpZXMnLFxyXG4gICAgJ3JlcGxhY2UnLFxyXG4gICAgJ3NlYXJjaCcsXHJcbiAgICAnc3BsaXQnLFxyXG4gICAgJ21hdGNoJyxcclxuICAgICd0b1ByaW1pdGl2ZScsXHJcbiAgICAndG9TdHJpbmdUYWcnLFxyXG4gICAgJ3Vuc2NvcGFibGVzJyxcclxuICAgICdvYnNlcnZhYmxlJ1xyXG5dLmZvckVhY2goZnVuY3Rpb24gKHdlbGxLbm93bikge1xyXG4gICAgaWYgKCFleHBvcnRzLlN5bWJvbFt3ZWxsS25vd25dKSB7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMuU3ltYm9sLCB3ZWxsS25vd24sIHV0aWxfMS5nZXRWYWx1ZURlc2NyaXB0b3IoZXhwb3J0cy5TeW1ib2wuZm9yKHdlbGxLbm93biksIGZhbHNlLCBmYWxzZSkpO1xyXG4gICAgfVxyXG59KTtcclxuZXhwb3J0cy5kZWZhdWx0ID0gZXhwb3J0cy5TeW1ib2w7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vU3ltYm9sLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9TeW1ib2wuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XHJcbnZhciBnbG9iYWxfMSA9IHJlcXVpcmUoXCIuL2dsb2JhbFwiKTtcclxudmFyIGl0ZXJhdG9yXzEgPSByZXF1aXJlKFwiLi9pdGVyYXRvclwiKTtcclxudmFyIGhhc18xID0gcmVxdWlyZShcIi4vc3VwcG9ydC9oYXNcIik7XHJcbnJlcXVpcmUoXCIuL1N5bWJvbFwiKTtcclxuZXhwb3J0cy5XZWFrTWFwID0gZ2xvYmFsXzEuZGVmYXVsdC5XZWFrTWFwO1xyXG5pZiAoIWhhc18xLmRlZmF1bHQoJ2VzNi13ZWFrbWFwJykpIHtcclxuICAgIHZhciBERUxFVEVEXzEgPSB7fTtcclxuICAgIHZhciBnZXRVSURfMSA9IGZ1bmN0aW9uIGdldFVJRCgpIHtcclxuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDAwMDAwKTtcclxuICAgIH07XHJcbiAgICB2YXIgZ2VuZXJhdGVOYW1lXzEgPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBzdGFydElkID0gTWF0aC5mbG9vcihEYXRlLm5vdygpICUgMTAwMDAwMDAwKTtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gZ2VuZXJhdGVOYW1lKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ19fd20nICsgZ2V0VUlEXzEoKSArIChzdGFydElkKysgKyAnX18nKTtcclxuICAgICAgICB9O1xyXG4gICAgfSkoKTtcclxuICAgIGV4cG9ydHMuV2Vha01hcCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBmdW5jdGlvbiBXZWFrTWFwKGl0ZXJhYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXNbU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdXZWFrTWFwJztcclxuICAgICAgICAgICAgdGhpcy5fbmFtZSA9IGdlbmVyYXRlTmFtZV8xKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2Zyb3plbkVudHJpZXMgPSBbXTtcclxuICAgICAgICAgICAgaWYgKGl0ZXJhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlcmF0b3JfMS5pc0FycmF5TGlrZShpdGVyYWJsZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZXJhYmxlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gaXRlcmFibGVbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KGl0ZW1bMF0sIGl0ZW1bMV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGl0ZXJhYmxlXzEgPSB0c2xpYl8xLl9fdmFsdWVzKGl0ZXJhYmxlKSwgaXRlcmFibGVfMV8xID0gaXRlcmFibGVfMS5uZXh0KCk7ICFpdGVyYWJsZV8xXzEuZG9uZTsgaXRlcmFibGVfMV8xID0gaXRlcmFibGVfMS5uZXh0KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSA9IHRzbGliXzEuX19yZWFkKGl0ZXJhYmxlXzFfMS52YWx1ZSwgMiksIGtleSA9IF9hWzBdLCB2YWx1ZSA9IF9hWzFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cclxuICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVyYWJsZV8xXzEgJiYgIWl0ZXJhYmxlXzFfMS5kb25lICYmIChfYiA9IGl0ZXJhYmxlXzEucmV0dXJuKSkgX2IuY2FsbChpdGVyYWJsZV8xKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBlXzEsIF9iO1xyXG4gICAgICAgIH1cclxuICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5fZ2V0RnJvemVuRW50cnlJbmRleCA9IGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9mcm96ZW5FbnRyaWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZnJvemVuRW50cmllc1tpXS5rZXkgPT09IGtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIFdlYWtNYXAucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBlbnRyeSA9IGtleVt0aGlzLl9uYW1lXTtcclxuICAgICAgICAgICAgaWYgKGVudHJ5ICYmIGVudHJ5LmtleSA9PT0ga2V5ICYmIGVudHJ5LnZhbHVlICE9PSBERUxFVEVEXzEpIHtcclxuICAgICAgICAgICAgICAgIGVudHJ5LnZhbHVlID0gREVMRVRFRF8xO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGZyb3plbkluZGV4ID0gdGhpcy5fZ2V0RnJvemVuRW50cnlJbmRleChrZXkpO1xyXG4gICAgICAgICAgICBpZiAoZnJvemVuSW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZnJvemVuRW50cmllcy5zcGxpY2UoZnJvemVuSW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwga2V5ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBlbnRyeSA9IGtleVt0aGlzLl9uYW1lXTtcclxuICAgICAgICAgICAgaWYgKGVudHJ5ICYmIGVudHJ5LmtleSA9PT0ga2V5ICYmIGVudHJ5LnZhbHVlICE9PSBERUxFVEVEXzEpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS52YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgZnJvemVuSW5kZXggPSB0aGlzLl9nZXRGcm96ZW5FbnRyeUluZGV4KGtleSk7XHJcbiAgICAgICAgICAgIGlmIChmcm96ZW5JbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZnJvemVuRW50cmllc1tmcm96ZW5JbmRleF0udmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIFdlYWtNYXAucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBlbnRyeSA9IGtleVt0aGlzLl9uYW1lXTtcclxuICAgICAgICAgICAgaWYgKEJvb2xlYW4oZW50cnkgJiYgZW50cnkua2V5ID09PSBrZXkgJiYgZW50cnkudmFsdWUgIT09IERFTEVURURfMSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBmcm96ZW5JbmRleCA9IHRoaXMuX2dldEZyb3plbkVudHJ5SW5kZXgoa2V5KTtcclxuICAgICAgICAgICAgaWYgKGZyb3plbkluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIFdlYWtNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGlmICgha2V5IHx8ICh0eXBlb2Yga2V5ICE9PSAnb2JqZWN0JyAmJiB0eXBlb2Yga2V5ICE9PSAnZnVuY3Rpb24nKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCB2YWx1ZSB1c2VkIGFzIHdlYWsgbWFwIGtleScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBlbnRyeSA9IGtleVt0aGlzLl9uYW1lXTtcclxuICAgICAgICAgICAgaWYgKCFlbnRyeSB8fCBlbnRyeS5rZXkgIT09IGtleSkge1xyXG4gICAgICAgICAgICAgICAgZW50cnkgPSBPYmplY3QuY3JlYXRlKG51bGwsIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IHsgdmFsdWU6IGtleSB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGlmIChPYmplY3QuaXNGcm96ZW4oa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Zyb3plbkVudHJpZXMucHVzaChlbnRyeSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoa2V5LCB0aGlzLl9uYW1lLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlbnRyeVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVudHJ5LnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIFdlYWtNYXA7XHJcbiAgICB9KCkpO1xyXG59XHJcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMuV2Vha01hcDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9XZWFrTWFwLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9XZWFrTWFwLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xyXG52YXIgZ2xvYmFsXzEgPSByZXF1aXJlKFwiLi9nbG9iYWxcIik7XHJcbnZhciBpdGVyYXRvcl8xID0gcmVxdWlyZShcIi4vaXRlcmF0b3JcIik7XHJcbnZhciBudW1iZXJfMSA9IHJlcXVpcmUoXCIuL251bWJlclwiKTtcclxudmFyIGhhc18xID0gcmVxdWlyZShcIi4vc3VwcG9ydC9oYXNcIik7XHJcbnZhciB1dGlsXzEgPSByZXF1aXJlKFwiLi9zdXBwb3J0L3V0aWxcIik7XHJcbmlmIChoYXNfMS5kZWZhdWx0KCdlczYtYXJyYXknKSAmJiBoYXNfMS5kZWZhdWx0KCdlczYtYXJyYXktZmlsbCcpKSB7XHJcbiAgICBleHBvcnRzLmZyb20gPSBnbG9iYWxfMS5kZWZhdWx0LkFycmF5LmZyb207XHJcbiAgICBleHBvcnRzLm9mID0gZ2xvYmFsXzEuZGVmYXVsdC5BcnJheS5vZjtcclxuICAgIGV4cG9ydHMuY29weVdpdGhpbiA9IHV0aWxfMS53cmFwTmF0aXZlKGdsb2JhbF8xLmRlZmF1bHQuQXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4pO1xyXG4gICAgZXhwb3J0cy5maWxsID0gdXRpbF8xLndyYXBOYXRpdmUoZ2xvYmFsXzEuZGVmYXVsdC5BcnJheS5wcm90b3R5cGUuZmlsbCk7XHJcbiAgICBleHBvcnRzLmZpbmQgPSB1dGlsXzEud3JhcE5hdGl2ZShnbG9iYWxfMS5kZWZhdWx0LkFycmF5LnByb3RvdHlwZS5maW5kKTtcclxuICAgIGV4cG9ydHMuZmluZEluZGV4ID0gdXRpbF8xLndyYXBOYXRpdmUoZ2xvYmFsXzEuZGVmYXVsdC5BcnJheS5wcm90b3R5cGUuZmluZEluZGV4KTtcclxufVxyXG5lbHNlIHtcclxuICAgIC8vIEl0IGlzIG9ubHkgb2xkZXIgdmVyc2lvbnMgb2YgU2FmYXJpL2lPUyB0aGF0IGhhdmUgYSBiYWQgZmlsbCBpbXBsZW1lbnRhdGlvbiBhbmQgc28gYXJlbid0IGluIHRoZSB3aWxkXHJcbiAgICAvLyBUbyBtYWtlIHRoaW5ncyBlYXNpZXIsIGlmIHRoZXJlIGlzIGEgYmFkIGZpbGwgaW1wbGVtZW50YXRpb24sIHRoZSB3aG9sZSBzZXQgb2YgZnVuY3Rpb25zIHdpbGwgYmUgZmlsbGVkXHJcbiAgICAvKipcclxuICAgICAqIEVuc3VyZXMgYSBub24tbmVnYXRpdmUsIG5vbi1pbmZpbml0ZSwgc2FmZSBpbnRlZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciB0byB2YWxpZGF0ZVxyXG4gICAgICogQHJldHVybiBBIHByb3BlciBsZW5ndGhcclxuICAgICAqL1xyXG4gICAgdmFyIHRvTGVuZ3RoXzEgPSBmdW5jdGlvbiB0b0xlbmd0aChsZW5ndGgpIHtcclxuICAgICAgICBpZiAoaXNOYU4obGVuZ3RoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aCk7XHJcbiAgICAgICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcclxuICAgICAgICAgICAgbGVuZ3RoID0gTWF0aC5mbG9vcihsZW5ndGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBFbnN1cmUgYSBub24tbmVnYXRpdmUsIHJlYWwsIHNhZmUgaW50ZWdlclxyXG4gICAgICAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heChsZW5ndGgsIDApLCBudW1iZXJfMS5NQVhfU0FGRV9JTlRFR0VSKTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIEZyb20gRVM2IDcuMS40IFRvSW50ZWdlcigpXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHZhbHVlIEEgdmFsdWUgdG8gY29udmVydFxyXG4gICAgICogQHJldHVybiBBbiBpbnRlZ2VyXHJcbiAgICAgKi9cclxuICAgIHZhciB0b0ludGVnZXJfMSA9IGZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSkge1xyXG4gICAgICAgIHZhbHVlID0gTnVtYmVyKHZhbHVlKTtcclxuICAgICAgICBpZiAoaXNOYU4odmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsdWUgPT09IDAgfHwgIWlzRmluaXRlKHZhbHVlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAodmFsdWUgPiAwID8gMSA6IC0xKSAqIE1hdGguZmxvb3IoTWF0aC5hYnModmFsdWUpKTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIE5vcm1hbGl6ZXMgYW4gb2Zmc2V0IGFnYWluc3QgYSBnaXZlbiBsZW5ndGgsIHdyYXBwaW5nIGl0IGlmIG5lZ2F0aXZlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgb3JpZ2luYWwgb2Zmc2V0XHJcbiAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSB0b3RhbCBsZW5ndGggdG8gbm9ybWFsaXplIGFnYWluc3RcclxuICAgICAqIEByZXR1cm4gSWYgbmVnYXRpdmUsIHByb3ZpZGUgYSBkaXN0YW5jZSBmcm9tIHRoZSBlbmQgKGxlbmd0aCk7IG90aGVyd2lzZSBwcm92aWRlIGEgZGlzdGFuY2UgZnJvbSAwXHJcbiAgICAgKi9cclxuICAgIHZhciBub3JtYWxpemVPZmZzZXRfMSA9IGZ1bmN0aW9uIG5vcm1hbGl6ZU9mZnNldCh2YWx1ZSwgbGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlIDwgMCA/IE1hdGgubWF4KGxlbmd0aCArIHZhbHVlLCAwKSA6IE1hdGgubWluKHZhbHVlLCBsZW5ndGgpO1xyXG4gICAgfTtcclxuICAgIGV4cG9ydHMuZnJvbSA9IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlLCBtYXBGdW5jdGlvbiwgdGhpc0FyZykge1xyXG4gICAgICAgIGlmIChhcnJheUxpa2UgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdmcm9tOiByZXF1aXJlcyBhbiBhcnJheS1saWtlIG9iamVjdCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobWFwRnVuY3Rpb24gJiYgdGhpc0FyZykge1xyXG4gICAgICAgICAgICBtYXBGdW5jdGlvbiA9IG1hcEZ1bmN0aW9uLmJpbmQodGhpc0FyZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lICovXHJcbiAgICAgICAgdmFyIENvbnN0cnVjdG9yID0gdGhpcztcclxuICAgICAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGhfMShhcnJheUxpa2UubGVuZ3RoKTtcclxuICAgICAgICAvLyBTdXBwb3J0IGV4dGVuc2lvblxyXG4gICAgICAgIHZhciBhcnJheSA9IHR5cGVvZiBDb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyA/IE9iamVjdChuZXcgQ29uc3RydWN0b3IobGVuZ3RoKSkgOiBuZXcgQXJyYXkobGVuZ3RoKTtcclxuICAgICAgICBpZiAoIWl0ZXJhdG9yXzEuaXNBcnJheUxpa2UoYXJyYXlMaWtlKSAmJiAhaXRlcmF0b3JfMS5pc0l0ZXJhYmxlKGFycmF5TGlrZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFycmF5O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGFycmF5IGFuZCB0aGUgbm9ybWFsaXplZCBsZW5ndGggaXMgMCwganVzdCByZXR1cm4gYW4gZW1wdHkgYXJyYXkuIHRoaXMgcHJldmVudHMgYSBwcm9ibGVtXHJcbiAgICAgICAgLy8gd2l0aCB0aGUgaXRlcmF0aW9uIG9uIElFIHdoZW4gdXNpbmcgYSBOYU4gYXJyYXkgbGVuZ3RoLlxyXG4gICAgICAgIGlmIChpdGVyYXRvcl8xLmlzQXJyYXlMaWtlKGFycmF5TGlrZSkpIHtcclxuICAgICAgICAgICAgaWYgKGxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlMaWtlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IG1hcEZ1bmN0aW9uID8gbWFwRnVuY3Rpb24oYXJyYXlMaWtlW2ldLCBpKSA6IGFycmF5TGlrZVtpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIGkgPSAwO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgYXJyYXlMaWtlXzEgPSB0c2xpYl8xLl9fdmFsdWVzKGFycmF5TGlrZSksIGFycmF5TGlrZV8xXzEgPSBhcnJheUxpa2VfMS5uZXh0KCk7ICFhcnJheUxpa2VfMV8xLmRvbmU7IGFycmF5TGlrZV8xXzEgPSBhcnJheUxpa2VfMS5uZXh0KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBhcnJheUxpa2VfMV8xLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGFycmF5W2ldID0gbWFwRnVuY3Rpb24gPyBtYXBGdW5jdGlvbih2YWx1ZSwgaSkgOiB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cclxuICAgICAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhcnJheUxpa2VfMV8xICYmICFhcnJheUxpa2VfMV8xLmRvbmUgJiYgKF9hID0gYXJyYXlMaWtlXzEucmV0dXJuKSkgX2EuY2FsbChhcnJheUxpa2VfMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFycmF5TGlrZS5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBhcnJheS5sZW5ndGggPSBsZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhcnJheTtcclxuICAgICAgICB2YXIgZV8xLCBfYTtcclxuICAgIH07XHJcbiAgICBleHBvcnRzLm9mID0gZnVuY3Rpb24gb2YoKSB7XHJcbiAgICAgICAgdmFyIGl0ZW1zID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgaXRlbXNbX2ldID0gYXJndW1lbnRzW19pXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGl0ZW1zKTtcclxuICAgIH07XHJcbiAgICBleHBvcnRzLmNvcHlXaXRoaW4gPSBmdW5jdGlvbiBjb3B5V2l0aGluKHRhcmdldCwgb2Zmc2V0LCBzdGFydCwgZW5kKSB7XHJcbiAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NvcHlXaXRoaW46IHRhcmdldCBtdXN0IGJlIGFuIGFycmF5LWxpa2Ugb2JqZWN0Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aF8xKHRhcmdldC5sZW5ndGgpO1xyXG4gICAgICAgIG9mZnNldCA9IG5vcm1hbGl6ZU9mZnNldF8xKHRvSW50ZWdlcl8xKG9mZnNldCksIGxlbmd0aCk7XHJcbiAgICAgICAgc3RhcnQgPSBub3JtYWxpemVPZmZzZXRfMSh0b0ludGVnZXJfMShzdGFydCksIGxlbmd0aCk7XHJcbiAgICAgICAgZW5kID0gbm9ybWFsaXplT2Zmc2V0XzEoZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0ludGVnZXJfMShlbmQpLCBsZW5ndGgpO1xyXG4gICAgICAgIHZhciBjb3VudCA9IE1hdGgubWluKGVuZCAtIHN0YXJ0LCBsZW5ndGggLSBvZmZzZXQpO1xyXG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSAxO1xyXG4gICAgICAgIGlmIChvZmZzZXQgPiBzdGFydCAmJiBvZmZzZXQgPCBzdGFydCArIGNvdW50KSB7XHJcbiAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xO1xyXG4gICAgICAgICAgICBzdGFydCArPSBjb3VudCAtIDE7XHJcbiAgICAgICAgICAgIG9mZnNldCArPSBjb3VudCAtIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHdoaWxlIChjb3VudCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0IGluIHRhcmdldCkge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0W29mZnNldF0gPSB0YXJnZXRbc3RhcnRdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRhcmdldFtvZmZzZXRdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9mZnNldCArPSBkaXJlY3Rpb247XHJcbiAgICAgICAgICAgIHN0YXJ0ICs9IGRpcmVjdGlvbjtcclxuICAgICAgICAgICAgY291bnQtLTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcclxuICAgIH07XHJcbiAgICBleHBvcnRzLmZpbGwgPSBmdW5jdGlvbiBmaWxsKHRhcmdldCwgdmFsdWUsIHN0YXJ0LCBlbmQpIHtcclxuICAgICAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGhfMSh0YXJnZXQubGVuZ3RoKTtcclxuICAgICAgICB2YXIgaSA9IG5vcm1hbGl6ZU9mZnNldF8xKHRvSW50ZWdlcl8xKHN0YXJ0KSwgbGVuZ3RoKTtcclxuICAgICAgICBlbmQgPSBub3JtYWxpemVPZmZzZXRfMShlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvSW50ZWdlcl8xKGVuZCksIGxlbmd0aCk7XHJcbiAgICAgICAgd2hpbGUgKGkgPCBlbmQpIHtcclxuICAgICAgICAgICAgdGFyZ2V0W2krK10gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcclxuICAgIH07XHJcbiAgICBleHBvcnRzLmZpbmQgPSBmdW5jdGlvbiBmaW5kKHRhcmdldCwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcclxuICAgICAgICB2YXIgaW5kZXggPSBleHBvcnRzLmZpbmRJbmRleCh0YXJnZXQsIGNhbGxiYWNrLCB0aGlzQXJnKTtcclxuICAgICAgICByZXR1cm4gaW5kZXggIT09IC0xID8gdGFyZ2V0W2luZGV4XSA6IHVuZGVmaW5lZDtcclxuICAgIH07XHJcbiAgICBleHBvcnRzLmZpbmRJbmRleCA9IGZ1bmN0aW9uIGZpbmRJbmRleCh0YXJnZXQsIGNhbGxiYWNrLCB0aGlzQXJnKSB7XHJcbiAgICAgICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoXzEodGFyZ2V0Lmxlbmd0aCk7XHJcbiAgICAgICAgaWYgKCFjYWxsYmFjaykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdmaW5kOiBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzQXJnKSB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2suYmluZCh0aGlzQXJnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2sodGFyZ2V0W2ldLCBpLCB0YXJnZXQpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICB9O1xyXG59XHJcbmlmIChoYXNfMS5kZWZhdWx0KCdlczctYXJyYXknKSkge1xyXG4gICAgZXhwb3J0cy5pbmNsdWRlcyA9IHV0aWxfMS53cmFwTmF0aXZlKGdsb2JhbF8xLmRlZmF1bHQuQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzKTtcclxufVxyXG5lbHNlIHtcclxuICAgIC8qKlxyXG4gICAgICogRW5zdXJlcyBhIG5vbi1uZWdhdGl2ZSwgbm9uLWluZmluaXRlLCBzYWZlIGludGVnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIHRvIHZhbGlkYXRlXHJcbiAgICAgKiBAcmV0dXJuIEEgcHJvcGVyIGxlbmd0aFxyXG4gICAgICovXHJcbiAgICB2YXIgdG9MZW5ndGhfMiA9IGZ1bmN0aW9uIHRvTGVuZ3RoKGxlbmd0aCkge1xyXG4gICAgICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpO1xyXG4gICAgICAgIGlmIChpc05hTihsZW5ndGgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xyXG4gICAgICAgICAgICBsZW5ndGggPSBNYXRoLmZsb29yKGxlbmd0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEVuc3VyZSBhIG5vbi1uZWdhdGl2ZSwgcmVhbCwgc2FmZSBpbnRlZ2VyXHJcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KGxlbmd0aCwgMCksIG51bWJlcl8xLk1BWF9TQUZFX0lOVEVHRVIpO1xyXG4gICAgfTtcclxuICAgIGV4cG9ydHMuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyh0YXJnZXQsIHNlYXJjaEVsZW1lbnQsIGZyb21JbmRleCkge1xyXG4gICAgICAgIGlmIChmcm9tSW5kZXggPT09IHZvaWQgMCkgeyBmcm9tSW5kZXggPSAwOyB9XHJcbiAgICAgICAgdmFyIGxlbiA9IHRvTGVuZ3RoXzIodGFyZ2V0Lmxlbmd0aCk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IGZyb21JbmRleDsgaSA8IGxlbjsgKytpKSB7XHJcbiAgICAgICAgICAgIHZhciBjdXJyZW50RWxlbWVudCA9IHRhcmdldFtpXTtcclxuICAgICAgICAgICAgaWYgKHNlYXJjaEVsZW1lbnQgPT09IGN1cnJlbnRFbGVtZW50IHx8XHJcbiAgICAgICAgICAgICAgICAoc2VhcmNoRWxlbWVudCAhPT0gc2VhcmNoRWxlbWVudCAmJiBjdXJyZW50RWxlbWVudCAhPT0gY3VycmVudEVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9O1xyXG59XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vYXJyYXkuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL2FycmF5LmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciBnbG9iYWxPYmplY3QgPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgLy8gZ2xvYmFsIHNwZWMgZGVmaW5lcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdCBjYWxsZWQgJ2dsb2JhbCdcclxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1nbG9iYWxcclxuICAgICAgICAvLyBgZ2xvYmFsYCBpcyBhbHNvIGRlZmluZWQgaW4gTm9kZUpTXHJcbiAgICAgICAgcmV0dXJuIGdsb2JhbDtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgLy8gd2luZG93IGlzIGRlZmluZWQgaW4gYnJvd3NlcnNcclxuICAgICAgICByZXR1cm4gd2luZG93O1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgLy8gc2VsZiBpcyBkZWZpbmVkIGluIFdlYldvcmtlcnNcclxuICAgICAgICByZXR1cm4gc2VsZjtcclxuICAgIH1cclxufSkoKTtcclxuZXhwb3J0cy5kZWZhdWx0ID0gZ2xvYmFsT2JqZWN0O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vZ2xvYmFsLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnJlcXVpcmUoXCIuL1N5bWJvbFwiKTtcclxudmFyIHN0cmluZ18xID0gcmVxdWlyZShcIi4vc3RyaW5nXCIpO1xyXG52YXIgc3RhdGljRG9uZSA9IHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xyXG4vKipcclxuICogQSBjbGFzcyB0aGF0IF9zaGltc18gYW4gaXRlcmF0b3IgaW50ZXJmYWNlIG9uIGFycmF5IGxpa2Ugb2JqZWN0cy5cclxuICovXHJcbnZhciBTaGltSXRlcmF0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBTaGltSXRlcmF0b3IobGlzdCkge1xyXG4gICAgICAgIHRoaXMuX25leHRJbmRleCA9IC0xO1xyXG4gICAgICAgIGlmIChpc0l0ZXJhYmxlKGxpc3QpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX25hdGl2ZUl0ZXJhdG9yID0gbGlzdFtTeW1ib2wuaXRlcmF0b3JdKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9saXN0ID0gbGlzdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgbmV4dCBpdGVyYXRpb24gcmVzdWx0IGZvciB0aGUgSXRlcmF0b3JcclxuICAgICAqL1xyXG4gICAgU2hpbUl0ZXJhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9uYXRpdmVJdGVyYXRvcikge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbmF0aXZlSXRlcmF0b3IubmV4dCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuX2xpc3QpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHN0YXRpY0RvbmU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgrK3RoaXMuX25leHRJbmRleCA8IHRoaXMuX2xpc3QubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkb25lOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLl9saXN0W3RoaXMuX25leHRJbmRleF1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0YXRpY0RvbmU7XHJcbiAgICB9O1xyXG4gICAgU2hpbUl0ZXJhdG9yLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBTaGltSXRlcmF0b3I7XHJcbn0oKSk7XHJcbmV4cG9ydHMuU2hpbUl0ZXJhdG9yID0gU2hpbUl0ZXJhdG9yO1xyXG4vKipcclxuICogQSB0eXBlIGd1YXJkIGZvciBjaGVja2luZyBpZiBzb21ldGhpbmcgaGFzIGFuIEl0ZXJhYmxlIGludGVyZmFjZVxyXG4gKlxyXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHR5cGUgZ3VhcmQgYWdhaW5zdFxyXG4gKi9cclxuZnVuY3Rpb24gaXNJdGVyYWJsZSh2YWx1ZSkge1xyXG4gICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZVtTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nO1xyXG59XHJcbmV4cG9ydHMuaXNJdGVyYWJsZSA9IGlzSXRlcmFibGU7XHJcbi8qKlxyXG4gKiBBIHR5cGUgZ3VhcmQgZm9yIGNoZWNraW5nIGlmIHNvbWV0aGluZyBpcyBBcnJheUxpa2VcclxuICpcclxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB0eXBlIGd1YXJkIGFnYWluc3RcclxuICovXHJcbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLmxlbmd0aCA9PT0gJ251bWJlcic7XHJcbn1cclxuZXhwb3J0cy5pc0FycmF5TGlrZSA9IGlzQXJyYXlMaWtlO1xyXG4vKipcclxuICogUmV0dXJucyB0aGUgaXRlcmF0b3IgZm9yIGFuIG9iamVjdFxyXG4gKlxyXG4gKiBAcGFyYW0gaXRlcmFibGUgVGhlIGl0ZXJhYmxlIG9iamVjdCB0byByZXR1cm4gdGhlIGl0ZXJhdG9yIGZvclxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0KGl0ZXJhYmxlKSB7XHJcbiAgICBpZiAoaXNJdGVyYWJsZShpdGVyYWJsZSkpIHtcclxuICAgICAgICByZXR1cm4gaXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoaXNBcnJheUxpa2UoaXRlcmFibGUpKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTaGltSXRlcmF0b3IoaXRlcmFibGUpO1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMuZ2V0ID0gZ2V0O1xyXG4vKipcclxuICogU2hpbXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYGZvciAuLi4gb2ZgIGJsb2Nrc1xyXG4gKlxyXG4gKiBAcGFyYW0gaXRlcmFibGUgVGhlIG9iamVjdCB0aGUgcHJvdmlkZXMgYW4gaW50ZXJhdG9yIGludGVyZmFjZVxyXG4gKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIGl0ZW0gb2YgdGhlIGl0ZXJhYmxlXHJcbiAqIEBwYXJhbSB0aGlzQXJnIE9wdGlvbmFsIHNjb3BlIHRvIHBhc3MgdGhlIGNhbGxiYWNrXHJcbiAqL1xyXG5mdW5jdGlvbiBmb3JPZihpdGVyYWJsZSwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcclxuICAgIHZhciBicm9rZW4gPSBmYWxzZTtcclxuICAgIGZ1bmN0aW9uIGRvQnJlYWsoKSB7XHJcbiAgICAgICAgYnJva2VuID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8qIFdlIG5lZWQgdG8gaGFuZGxlIGl0ZXJhdGlvbiBvZiBkb3VibGUgYnl0ZSBzdHJpbmdzIHByb3Blcmx5ICovXHJcbiAgICBpZiAoaXNBcnJheUxpa2UoaXRlcmFibGUpICYmIHR5cGVvZiBpdGVyYWJsZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICB2YXIgbCA9IGl0ZXJhYmxlLmxlbmd0aDtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7ICsraSkge1xyXG4gICAgICAgICAgICB2YXIgY2hhciA9IGl0ZXJhYmxlW2ldO1xyXG4gICAgICAgICAgICBpZiAoaSArIDEgPCBsKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcclxuICAgICAgICAgICAgICAgIGlmIChjb2RlID49IHN0cmluZ18xLkhJR0hfU1VSUk9HQVRFX01JTiAmJiBjb2RlIDw9IHN0cmluZ18xLkhJR0hfU1VSUk9HQVRFX01BWCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNoYXIgKz0gaXRlcmFibGVbKytpXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIGNoYXIsIGl0ZXJhYmxlLCBkb0JyZWFrKTtcclxuICAgICAgICAgICAgaWYgKGJyb2tlbikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdmFyIGl0ZXJhdG9yID0gZ2V0KGl0ZXJhYmxlKTtcclxuICAgICAgICBpZiAoaXRlcmF0b3IpIHtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcclxuICAgICAgICAgICAgd2hpbGUgKCFyZXN1bHQuZG9uZSkge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzQXJnLCByZXN1bHQudmFsdWUsIGl0ZXJhYmxlLCBkb0JyZWFrKTtcclxuICAgICAgICAgICAgICAgIGlmIChicm9rZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cy5mb3JPZiA9IGZvck9mO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL2l0ZXJhdG9yLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9pdGVyYXRvci5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgZ2xvYmFsXzEgPSByZXF1aXJlKFwiLi9nbG9iYWxcIik7XHJcbi8qKlxyXG4gKiBUaGUgc21hbGxlc3QgaW50ZXJ2YWwgYmV0d2VlbiB0d28gcmVwcmVzZW50YWJsZSBudW1iZXJzLlxyXG4gKi9cclxuZXhwb3J0cy5FUFNJTE9OID0gMTtcclxuLyoqXHJcbiAqIFRoZSBtYXhpbXVtIHNhZmUgaW50ZWdlciBpbiBKYXZhU2NyaXB0XHJcbiAqL1xyXG5leHBvcnRzLk1BWF9TQUZFX0lOVEVHRVIgPSBNYXRoLnBvdygyLCA1MykgLSAxO1xyXG4vKipcclxuICogVGhlIG1pbmltdW0gc2FmZSBpbnRlZ2VyIGluIEphdmFTY3JpcHRcclxuICovXHJcbmV4cG9ydHMuTUlOX1NBRkVfSU5URUdFUiA9IC1leHBvcnRzLk1BWF9TQUZFX0lOVEVHRVI7XHJcbi8qKlxyXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhc3NlZCB2YWx1ZSBpcyBOYU4gd2l0aG91dCBjb2Vyc2lvbi5cclxuICpcclxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB0ZXN0XHJcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgTmFOLCBmYWxzZSBpZiBpdCBpcyBub3RcclxuICovXHJcbmZ1bmN0aW9uIGlzTmFOKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBnbG9iYWxfMS5kZWZhdWx0LmlzTmFOKHZhbHVlKTtcclxufVxyXG5leHBvcnRzLmlzTmFOID0gaXNOYU47XHJcbi8qKlxyXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhc3NlZCB2YWx1ZSBpcyBhIGZpbml0ZSBudW1iZXIgd2l0aG91dCBjb2Vyc2lvbi5cclxuICpcclxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB0ZXN0XHJcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgZmluaXRlLCBmYWxzZSBpZiBpdCBpcyBub3RcclxuICovXHJcbmZ1bmN0aW9uIGlzRmluaXRlKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBnbG9iYWxfMS5kZWZhdWx0LmlzRmluaXRlKHZhbHVlKTtcclxufVxyXG5leHBvcnRzLmlzRmluaXRlID0gaXNGaW5pdGU7XHJcbi8qKlxyXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhc3NlZCB2YWx1ZSBpcyBhbiBpbnRlZ2VyLlxyXG4gKlxyXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3RcclxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLCBmYWxzZSBpZiBpdCBpcyBub3RcclxuICovXHJcbmZ1bmN0aW9uIGlzSW50ZWdlcih2YWx1ZSkge1xyXG4gICAgcmV0dXJuIGlzRmluaXRlKHZhbHVlKSAmJiBNYXRoLmZsb29yKHZhbHVlKSA9PT0gdmFsdWU7XHJcbn1cclxuZXhwb3J0cy5pc0ludGVnZXIgPSBpc0ludGVnZXI7XHJcbi8qKlxyXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhc3NlZCB2YWx1ZSBpcyBhbiBpbnRlZ2VyIHRoYXQgaXMgJ3NhZmUsJyBtZWFuaW5nOlxyXG4gKiAgIDEuIGl0IGNhbiBiZSBleHByZXNzZWQgYXMgYW4gSUVFRS03NTQgZG91YmxlIHByZWNpc2lvbiBudW1iZXJcclxuICogICAyLiBpdCBoYXMgYSBvbmUtdG8tb25lIG1hcHBpbmcgdG8gYSBtYXRoZW1hdGljYWwgaW50ZWdlciwgbWVhbmluZyBpdHNcclxuICogICAgICBJRUVFLTc1NCByZXByZXNlbnRhdGlvbiBjYW5ub3QgYmUgdGhlIHJlc3VsdCBvZiByb3VuZGluZyBhbnkgb3RoZXJcclxuICogICAgICBpbnRlZ2VyIHRvIGZpdCB0aGUgSUVFRS03NTQgcmVwcmVzZW50YXRpb25cclxuICpcclxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB0ZXN0XHJcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlciwgZmFsc2UgaWYgaXQgaXMgbm90XHJcbiAqL1xyXG5mdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSAmJiBNYXRoLmFicyh2YWx1ZSkgPD0gZXhwb3J0cy5NQVhfU0FGRV9JTlRFR0VSO1xyXG59XHJcbmV4cG9ydHMuaXNTYWZlSW50ZWdlciA9IGlzU2FmZUludGVnZXI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vbnVtYmVyLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9udW1iZXIuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxudmFyIGdsb2JhbF8xID0gcmVxdWlyZShcIi4vZ2xvYmFsXCIpO1xyXG52YXIgaGFzXzEgPSByZXF1aXJlKFwiLi9zdXBwb3J0L2hhc1wiKTtcclxudmFyIFN5bWJvbF8xID0gcmVxdWlyZShcIi4vU3ltYm9sXCIpO1xyXG5pZiAoaGFzXzEuZGVmYXVsdCgnZXM2LW9iamVjdCcpKSB7XHJcbiAgICB2YXIgZ2xvYmFsT2JqZWN0ID0gZ2xvYmFsXzEuZGVmYXVsdC5PYmplY3Q7XHJcbiAgICBleHBvcnRzLmFzc2lnbiA9IGdsb2JhbE9iamVjdC5hc3NpZ247XHJcbiAgICBleHBvcnRzLmdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdsb2JhbE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XHJcbiAgICBleHBvcnRzLmdldE93blByb3BlcnR5TmFtZXMgPSBnbG9iYWxPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcclxuICAgIGV4cG9ydHMuZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2xvYmFsT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcclxuICAgIGV4cG9ydHMuaXMgPSBnbG9iYWxPYmplY3QuaXM7XHJcbiAgICBleHBvcnRzLmtleXMgPSBnbG9iYWxPYmplY3Qua2V5cztcclxufVxyXG5lbHNlIHtcclxuICAgIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uIHN5bWJvbEF3YXJlS2V5cyhvKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG8pLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7IHJldHVybiAhQm9vbGVhbihrZXkubWF0Y2goL15AQC4rLykpOyB9KTtcclxuICAgIH07XHJcbiAgICBleHBvcnRzLmFzc2lnbiA9IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQpIHtcclxuICAgICAgICB2YXIgc291cmNlcyA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIHNvdXJjZXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAvLyBUeXBlRXJyb3IgaWYgdW5kZWZpbmVkIG9yIG51bGxcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciB0byA9IE9iamVjdCh0YXJnZXQpO1xyXG4gICAgICAgIHNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAobmV4dFNvdXJjZSkge1xyXG4gICAgICAgICAgICBpZiAobmV4dFNvdXJjZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gU2tpcCBvdmVyIGlmIHVuZGVmaW5lZCBvciBudWxsXHJcbiAgICAgICAgICAgICAgICBleHBvcnRzLmtleXMobmV4dFNvdXJjZSkuZm9yRWFjaChmdW5jdGlvbiAobmV4dEtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvW25leHRLZXldID0gbmV4dFNvdXJjZVtuZXh0S2V5XTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRvO1xyXG4gICAgfTtcclxuICAgIGV4cG9ydHMuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8sIHByb3ApIHtcclxuICAgICAgICBpZiAoU3ltYm9sXzEuaXNTeW1ib2wocHJvcCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobywgcHJvcCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvLCBwcm9wKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgZXhwb3J0cy5nZXRPd25Qcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhvKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG8pLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7IHJldHVybiAhQm9vbGVhbihrZXkubWF0Y2goL15AQC4rLykpOyB9KTtcclxuICAgIH07XHJcbiAgICBleHBvcnRzLmdldE93blByb3BlcnR5U3ltYm9scyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhvKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG8pXHJcbiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gQm9vbGVhbihrZXkubWF0Y2goL15AQC4rLykpOyB9KVxyXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIFN5bWJvbC5mb3Ioa2V5LnN1YnN0cmluZygyKSk7IH0pO1xyXG4gICAgfTtcclxuICAgIGV4cG9ydHMuaXMgPSBmdW5jdGlvbiBpcyh2YWx1ZTEsIHZhbHVlMikge1xyXG4gICAgICAgIGlmICh2YWx1ZTEgPT09IHZhbHVlMikge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUxICE9PSAwIHx8IDEgLyB2YWx1ZTEgPT09IDEgLyB2YWx1ZTI7IC8vIC0wXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWx1ZTEgIT09IHZhbHVlMSAmJiB2YWx1ZTIgIT09IHZhbHVlMjsgLy8gTmFOXHJcbiAgICB9O1xyXG59XHJcbmlmIChoYXNfMS5kZWZhdWx0KCdlczIwMTctb2JqZWN0JykpIHtcclxuICAgIHZhciBnbG9iYWxPYmplY3QgPSBnbG9iYWxfMS5kZWZhdWx0Lk9iamVjdDtcclxuICAgIGV4cG9ydHMuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA9IGdsb2JhbE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzO1xyXG4gICAgZXhwb3J0cy5lbnRyaWVzID0gZ2xvYmFsT2JqZWN0LmVudHJpZXM7XHJcbiAgICBleHBvcnRzLnZhbHVlcyA9IGdsb2JhbE9iamVjdC52YWx1ZXM7XHJcbn1cclxuZWxzZSB7XHJcbiAgICBleHBvcnRzLmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG8pIHtcclxuICAgICAgICByZXR1cm4gZXhwb3J0cy5nZXRPd25Qcm9wZXJ0eU5hbWVzKG8pLnJlZHVjZShmdW5jdGlvbiAocHJldmlvdXMsIGtleSkge1xyXG4gICAgICAgICAgICBwcmV2aW91c1trZXldID0gZXhwb3J0cy5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobywga2V5KTtcclxuICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzO1xyXG4gICAgICAgIH0sIHt9KTtcclxuICAgIH07XHJcbiAgICBleHBvcnRzLmVudHJpZXMgPSBmdW5jdGlvbiBlbnRyaWVzKG8pIHtcclxuICAgICAgICByZXR1cm4gZXhwb3J0cy5rZXlzKG8pLm1hcChmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBba2V5LCBvW2tleV1dOyB9KTtcclxuICAgIH07XHJcbiAgICBleHBvcnRzLnZhbHVlcyA9IGZ1bmN0aW9uIHZhbHVlcyhvKSB7XHJcbiAgICAgICAgcmV0dXJuIGV4cG9ydHMua2V5cyhvKS5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gb1trZXldOyB9KTtcclxuICAgIH07XHJcbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9vYmplY3QuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL29iamVjdC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcclxudmFyIGdsb2JhbF8xID0gcmVxdWlyZShcIi4vZ2xvYmFsXCIpO1xyXG52YXIgaGFzXzEgPSByZXF1aXJlKFwiLi9zdXBwb3J0L2hhc1wiKTtcclxudmFyIHV0aWxfMSA9IHJlcXVpcmUoXCIuL3N1cHBvcnQvdXRpbFwiKTtcclxuLyoqXHJcbiAqIFRoZSBtaW5pbXVtIGxvY2F0aW9uIG9mIGhpZ2ggc3Vycm9nYXRlc1xyXG4gKi9cclxuZXhwb3J0cy5ISUdIX1NVUlJPR0FURV9NSU4gPSAweGQ4MDA7XHJcbi8qKlxyXG4gKiBUaGUgbWF4aW11bSBsb2NhdGlvbiBvZiBoaWdoIHN1cnJvZ2F0ZXNcclxuICovXHJcbmV4cG9ydHMuSElHSF9TVVJST0dBVEVfTUFYID0gMHhkYmZmO1xyXG4vKipcclxuICogVGhlIG1pbmltdW0gbG9jYXRpb24gb2YgbG93IHN1cnJvZ2F0ZXNcclxuICovXHJcbmV4cG9ydHMuTE9XX1NVUlJPR0FURV9NSU4gPSAweGRjMDA7XHJcbi8qKlxyXG4gKiBUaGUgbWF4aW11bSBsb2NhdGlvbiBvZiBsb3cgc3Vycm9nYXRlc1xyXG4gKi9cclxuZXhwb3J0cy5MT1dfU1VSUk9HQVRFX01BWCA9IDB4ZGZmZjtcclxuaWYgKGhhc18xLmRlZmF1bHQoJ2VzNi1zdHJpbmcnKSAmJiBoYXNfMS5kZWZhdWx0KCdlczYtc3RyaW5nLXJhdycpKSB7XHJcbiAgICBleHBvcnRzLmZyb21Db2RlUG9pbnQgPSBnbG9iYWxfMS5kZWZhdWx0LlN0cmluZy5mcm9tQ29kZVBvaW50O1xyXG4gICAgZXhwb3J0cy5yYXcgPSBnbG9iYWxfMS5kZWZhdWx0LlN0cmluZy5yYXc7XHJcbiAgICBleHBvcnRzLmNvZGVQb2ludEF0ID0gdXRpbF8xLndyYXBOYXRpdmUoZ2xvYmFsXzEuZGVmYXVsdC5TdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0KTtcclxuICAgIGV4cG9ydHMuZW5kc1dpdGggPSB1dGlsXzEud3JhcE5hdGl2ZShnbG9iYWxfMS5kZWZhdWx0LlN0cmluZy5wcm90b3R5cGUuZW5kc1dpdGgpO1xyXG4gICAgZXhwb3J0cy5pbmNsdWRlcyA9IHV0aWxfMS53cmFwTmF0aXZlKGdsb2JhbF8xLmRlZmF1bHQuU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlcyk7XHJcbiAgICBleHBvcnRzLm5vcm1hbGl6ZSA9IHV0aWxfMS53cmFwTmF0aXZlKGdsb2JhbF8xLmRlZmF1bHQuU3RyaW5nLnByb3RvdHlwZS5ub3JtYWxpemUpO1xyXG4gICAgZXhwb3J0cy5yZXBlYXQgPSB1dGlsXzEud3JhcE5hdGl2ZShnbG9iYWxfMS5kZWZhdWx0LlN0cmluZy5wcm90b3R5cGUucmVwZWF0KTtcclxuICAgIGV4cG9ydHMuc3RhcnRzV2l0aCA9IHV0aWxfMS53cmFwTmF0aXZlKGdsb2JhbF8xLmRlZmF1bHQuU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoKTtcclxufVxyXG5lbHNlIHtcclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhdGVzIHRoYXQgdGV4dCBpcyBkZWZpbmVkLCBhbmQgbm9ybWFsaXplcyBwb3NpdGlvbiAoYmFzZWQgb24gdGhlIGdpdmVuIGRlZmF1bHQgaWYgdGhlIGlucHV0IGlzIE5hTikuXHJcbiAgICAgKiBVc2VkIGJ5IHN0YXJ0c1dpdGgsIGluY2x1ZGVzLCBhbmQgZW5kc1dpdGguXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiBOb3JtYWxpemVkIHBvc2l0aW9uLlxyXG4gICAgICovXHJcbiAgICB2YXIgbm9ybWFsaXplU3Vic3RyaW5nQXJnc18xID0gZnVuY3Rpb24gKG5hbWUsIHRleHQsIHNlYXJjaCwgcG9zaXRpb24sIGlzRW5kKSB7XHJcbiAgICAgICAgaWYgKGlzRW5kID09PSB2b2lkIDApIHsgaXNFbmQgPSBmYWxzZTsgfVxyXG4gICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RyaW5nLicgKyBuYW1lICsgJyByZXF1aXJlcyBhIHZhbGlkIHN0cmluZyB0byBzZWFyY2ggYWdhaW5zdC4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGxlbmd0aCA9IHRleHQubGVuZ3RoO1xyXG4gICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gIT09IHBvc2l0aW9uID8gKGlzRW5kID8gbGVuZ3RoIDogMCkgOiBwb3NpdGlvbjtcclxuICAgICAgICByZXR1cm4gW3RleHQsIFN0cmluZyhzZWFyY2gpLCBNYXRoLm1pbihNYXRoLm1heChwb3NpdGlvbiwgMCksIGxlbmd0aCldO1xyXG4gICAgfTtcclxuICAgIGV4cG9ydHMuZnJvbUNvZGVQb2ludCA9IGZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoKSB7XHJcbiAgICAgICAgdmFyIGNvZGVQb2ludHMgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICBjb2RlUG9pbnRzW19pXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcuZnJvbUNvZGVQb2ludFxyXG4gICAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xyXG4gICAgICAgIGlmICghbGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGZyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XHJcbiAgICAgICAgdmFyIE1BWF9TSVpFID0gMHg0MDAwO1xyXG4gICAgICAgIHZhciBjb2RlVW5pdHMgPSBbXTtcclxuICAgICAgICB2YXIgaW5kZXggPSAtMTtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gJyc7XHJcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcclxuICAgICAgICAgICAgdmFyIGNvZGVQb2ludCA9IE51bWJlcihhcmd1bWVudHNbaW5kZXhdKTtcclxuICAgICAgICAgICAgLy8gQ29kZSBwb2ludHMgbXVzdCBiZSBmaW5pdGUgaW50ZWdlcnMgd2l0aGluIHRoZSB2YWxpZCByYW5nZVxyXG4gICAgICAgICAgICB2YXIgaXNWYWxpZCA9IGlzRmluaXRlKGNvZGVQb2ludCkgJiYgTWF0aC5mbG9vcihjb2RlUG9pbnQpID09PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50ID49IDAgJiYgY29kZVBvaW50IDw9IDB4MTBmZmZmO1xyXG4gICAgICAgICAgICBpZiAoIWlzVmFsaWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoJ3N0cmluZy5mcm9tQ29kZVBvaW50OiBJbnZhbGlkIGNvZGUgcG9pbnQgJyArIGNvZGVQb2ludCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA8PSAweGZmZmYpIHtcclxuICAgICAgICAgICAgICAgIC8vIEJNUCBjb2RlIHBvaW50XHJcbiAgICAgICAgICAgICAgICBjb2RlVW5pdHMucHVzaChjb2RlUG9pbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gQXN0cmFsIGNvZGUgcG9pbnQ7IHNwbGl0IGluIHN1cnJvZ2F0ZSBoYWx2ZXNcclxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nI3N1cnJvZ2F0ZS1mb3JtdWxhZVxyXG4gICAgICAgICAgICAgICAgY29kZVBvaW50IC09IDB4MTAwMDA7XHJcbiAgICAgICAgICAgICAgICB2YXIgaGlnaFN1cnJvZ2F0ZSA9IChjb2RlUG9pbnQgPj4gMTApICsgZXhwb3J0cy5ISUdIX1NVUlJPR0FURV9NSU47XHJcbiAgICAgICAgICAgICAgICB2YXIgbG93U3Vycm9nYXRlID0gY29kZVBvaW50ICUgMHg0MDAgKyBleHBvcnRzLkxPV19TVVJST0dBVEVfTUlOO1xyXG4gICAgICAgICAgICAgICAgY29kZVVuaXRzLnB1c2goaGlnaFN1cnJvZ2F0ZSwgbG93U3Vycm9nYXRlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaW5kZXggKyAxID09PSBsZW5ndGggfHwgY29kZVVuaXRzLmxlbmd0aCA+IE1BWF9TSVpFKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGNvZGVVbml0cyk7XHJcbiAgICAgICAgICAgICAgICBjb2RlVW5pdHMubGVuZ3RoID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfTtcclxuICAgIGV4cG9ydHMucmF3ID0gZnVuY3Rpb24gcmF3KGNhbGxTaXRlKSB7XHJcbiAgICAgICAgdmFyIHN1YnN0aXR1dGlvbnMgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICBzdWJzdGl0dXRpb25zW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgcmF3U3RyaW5ncyA9IGNhbGxTaXRlLnJhdztcclxuICAgICAgICB2YXIgcmVzdWx0ID0gJyc7XHJcbiAgICAgICAgdmFyIG51bVN1YnN0aXR1dGlvbnMgPSBzdWJzdGl0dXRpb25zLmxlbmd0aDtcclxuICAgICAgICBpZiAoY2FsbFNpdGUgPT0gbnVsbCB8fCBjYWxsU2l0ZS5yYXcgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJpbmcucmF3IHJlcXVpcmVzIGEgdmFsaWQgY2FsbFNpdGUgb2JqZWN0IHdpdGggYSByYXcgdmFsdWUnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aF8xID0gcmF3U3RyaW5ncy5sZW5ndGg7IGkgPCBsZW5ndGhfMTsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCArPSByYXdTdHJpbmdzW2ldICsgKGkgPCBudW1TdWJzdGl0dXRpb25zICYmIGkgPCBsZW5ndGhfMSAtIDEgPyBzdWJzdGl0dXRpb25zW2ldIDogJycpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfTtcclxuICAgIGV4cG9ydHMuY29kZVBvaW50QXQgPSBmdW5jdGlvbiBjb2RlUG9pbnRBdCh0ZXh0LCBwb3NpdGlvbikge1xyXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gdm9pZCAwKSB7IHBvc2l0aW9uID0gMDsgfVxyXG4gICAgICAgIC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0XHJcbiAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJpbmcuY29kZVBvaW50QXQgcmVxdXJpZXMgYSB2YWxpZCBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBsZW5ndGggPSB0ZXh0Lmxlbmd0aDtcclxuICAgICAgICBpZiAocG9zaXRpb24gIT09IHBvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+PSBsZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gR2V0IHRoZSBmaXJzdCBjb2RlIHVuaXRcclxuICAgICAgICB2YXIgZmlyc3QgPSB0ZXh0LmNoYXJDb2RlQXQocG9zaXRpb24pO1xyXG4gICAgICAgIGlmIChmaXJzdCA+PSBleHBvcnRzLkhJR0hfU1VSUk9HQVRFX01JTiAmJiBmaXJzdCA8PSBleHBvcnRzLkhJR0hfU1VSUk9HQVRFX01BWCAmJiBsZW5ndGggPiBwb3NpdGlvbiArIDEpIHtcclxuICAgICAgICAgICAgLy8gU3RhcnQgb2YgYSBzdXJyb2dhdGUgcGFpciAoaGlnaCBzdXJyb2dhdGUgYW5kIHRoZXJlIGlzIGEgbmV4dCBjb2RlIHVuaXQpOyBjaGVjayBmb3IgbG93IHN1cnJvZ2F0ZVxyXG4gICAgICAgICAgICAvLyBodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZyNzdXJyb2dhdGUtZm9ybXVsYWVcclxuICAgICAgICAgICAgdmFyIHNlY29uZCA9IHRleHQuY2hhckNvZGVBdChwb3NpdGlvbiArIDEpO1xyXG4gICAgICAgICAgICBpZiAoc2Vjb25kID49IGV4cG9ydHMuTE9XX1NVUlJPR0FURV9NSU4gJiYgc2Vjb25kIDw9IGV4cG9ydHMuTE9XX1NVUlJPR0FURV9NQVgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAoZmlyc3QgLSBleHBvcnRzLkhJR0hfU1VSUk9HQVRFX01JTikgKiAweDQwMCArIHNlY29uZCAtIGV4cG9ydHMuTE9XX1NVUlJPR0FURV9NSU4gKyAweDEwMDAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmaXJzdDtcclxuICAgIH07XHJcbiAgICBleHBvcnRzLmVuZHNXaXRoID0gZnVuY3Rpb24gZW5kc1dpdGgodGV4dCwgc2VhcmNoLCBlbmRQb3NpdGlvbikge1xyXG4gICAgICAgIGlmIChlbmRQb3NpdGlvbiA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGVuZFBvc2l0aW9uID0gdGV4dC5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIF9hID0gdHNsaWJfMS5fX3JlYWQobm9ybWFsaXplU3Vic3RyaW5nQXJnc18xKCdlbmRzV2l0aCcsIHRleHQsIHNlYXJjaCwgZW5kUG9zaXRpb24sIHRydWUpLCAzKSwgdGV4dCA9IF9hWzBdLCBzZWFyY2ggPSBfYVsxXSwgZW5kUG9zaXRpb24gPSBfYVsyXTtcclxuICAgICAgICB2YXIgc3RhcnQgPSBlbmRQb3NpdGlvbiAtIHNlYXJjaC5sZW5ndGg7XHJcbiAgICAgICAgaWYgKHN0YXJ0IDwgMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKHN0YXJ0LCBlbmRQb3NpdGlvbikgPT09IHNlYXJjaDtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICB9O1xyXG4gICAgZXhwb3J0cy5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzKHRleHQsIHNlYXJjaCwgcG9zaXRpb24pIHtcclxuICAgICAgICBpZiAocG9zaXRpb24gPT09IHZvaWQgMCkgeyBwb3NpdGlvbiA9IDA7IH1cclxuICAgICAgICBfYSA9IHRzbGliXzEuX19yZWFkKG5vcm1hbGl6ZVN1YnN0cmluZ0FyZ3NfMSgnaW5jbHVkZXMnLCB0ZXh0LCBzZWFyY2gsIHBvc2l0aW9uKSwgMyksIHRleHQgPSBfYVswXSwgc2VhcmNoID0gX2FbMV0sIHBvc2l0aW9uID0gX2FbMl07XHJcbiAgICAgICAgcmV0dXJuIHRleHQuaW5kZXhPZihzZWFyY2gsIHBvc2l0aW9uKSAhPT0gLTE7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgfTtcclxuICAgIGV4cG9ydHMucmVwZWF0ID0gZnVuY3Rpb24gcmVwZWF0KHRleHQsIGNvdW50KSB7XHJcbiAgICAgICAgaWYgKGNvdW50ID09PSB2b2lkIDApIHsgY291bnQgPSAwOyB9XHJcbiAgICAgICAgLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUucmVwZWF0XHJcbiAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJpbmcucmVwZWF0IHJlcXVpcmVzIGEgdmFsaWQgc3RyaW5nLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY291bnQgIT09IGNvdW50KSB7XHJcbiAgICAgICAgICAgIGNvdW50ID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvdW50IDwgMCB8fCBjb3VudCA9PT0gSW5maW5pdHkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3N0cmluZy5yZXBlYXQgcmVxdWlyZXMgYSBub24tbmVnYXRpdmUgZmluaXRlIGNvdW50LicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgcmVzdWx0ID0gJyc7XHJcbiAgICAgICAgd2hpbGUgKGNvdW50KSB7XHJcbiAgICAgICAgICAgIGlmIChjb3VudCAlIDIpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSB0ZXh0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjb3VudCA+IDEpIHtcclxuICAgICAgICAgICAgICAgIHRleHQgKz0gdGV4dDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb3VudCA+Pj0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcbiAgICBleHBvcnRzLnN0YXJ0c1dpdGggPSBmdW5jdGlvbiBzdGFydHNXaXRoKHRleHQsIHNlYXJjaCwgcG9zaXRpb24pIHtcclxuICAgICAgICBpZiAocG9zaXRpb24gPT09IHZvaWQgMCkgeyBwb3NpdGlvbiA9IDA7IH1cclxuICAgICAgICBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoKTtcclxuICAgICAgICBfYSA9IHRzbGliXzEuX19yZWFkKG5vcm1hbGl6ZVN1YnN0cmluZ0FyZ3NfMSgnc3RhcnRzV2l0aCcsIHRleHQsIHNlYXJjaCwgcG9zaXRpb24pLCAzKSwgdGV4dCA9IF9hWzBdLCBzZWFyY2ggPSBfYVsxXSwgcG9zaXRpb24gPSBfYVsyXTtcclxuICAgICAgICB2YXIgZW5kID0gcG9zaXRpb24gKyBzZWFyY2gubGVuZ3RoO1xyXG4gICAgICAgIGlmIChlbmQgPiB0ZXh0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKHBvc2l0aW9uLCBlbmQpID09PSBzZWFyY2g7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgfTtcclxufVxyXG5pZiAoaGFzXzEuZGVmYXVsdCgnZXMyMDE3LXN0cmluZycpKSB7XHJcbiAgICBleHBvcnRzLnBhZEVuZCA9IHV0aWxfMS53cmFwTmF0aXZlKGdsb2JhbF8xLmRlZmF1bHQuU3RyaW5nLnByb3RvdHlwZS5wYWRFbmQpO1xyXG4gICAgZXhwb3J0cy5wYWRTdGFydCA9IHV0aWxfMS53cmFwTmF0aXZlKGdsb2JhbF8xLmRlZmF1bHQuU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydCk7XHJcbn1cclxuZWxzZSB7XHJcbiAgICBleHBvcnRzLnBhZEVuZCA9IGZ1bmN0aW9uIHBhZEVuZCh0ZXh0LCBtYXhMZW5ndGgsIGZpbGxTdHJpbmcpIHtcclxuICAgICAgICBpZiAoZmlsbFN0cmluZyA9PT0gdm9pZCAwKSB7IGZpbGxTdHJpbmcgPSAnICc7IH1cclxuICAgICAgICBpZiAodGV4dCA9PT0gbnVsbCB8fCB0ZXh0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RyaW5nLnJlcGVhdCByZXF1aXJlcyBhIHZhbGlkIHN0cmluZy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1heExlbmd0aCA9PT0gSW5maW5pdHkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3N0cmluZy5wYWRFbmQgcmVxdWlyZXMgYSBub24tbmVnYXRpdmUgZmluaXRlIGNvdW50LicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobWF4TGVuZ3RoID09PSBudWxsIHx8IG1heExlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IG1heExlbmd0aCA8IDApIHtcclxuICAgICAgICAgICAgbWF4TGVuZ3RoID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHN0clRleHQgPSBTdHJpbmcodGV4dCk7XHJcbiAgICAgICAgdmFyIHBhZGRpbmcgPSBtYXhMZW5ndGggLSBzdHJUZXh0Lmxlbmd0aDtcclxuICAgICAgICBpZiAocGFkZGluZyA+IDApIHtcclxuICAgICAgICAgICAgc3RyVGV4dCArPVxyXG4gICAgICAgICAgICAgICAgZXhwb3J0cy5yZXBlYXQoZmlsbFN0cmluZywgTWF0aC5mbG9vcihwYWRkaW5nIC8gZmlsbFN0cmluZy5sZW5ndGgpKSArXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbFN0cmluZy5zbGljZSgwLCBwYWRkaW5nICUgZmlsbFN0cmluZy5sZW5ndGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3RyVGV4dDtcclxuICAgIH07XHJcbiAgICBleHBvcnRzLnBhZFN0YXJ0ID0gZnVuY3Rpb24gcGFkU3RhcnQodGV4dCwgbWF4TGVuZ3RoLCBmaWxsU3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKGZpbGxTdHJpbmcgPT09IHZvaWQgMCkgeyBmaWxsU3RyaW5nID0gJyAnOyB9XHJcbiAgICAgICAgaWYgKHRleHQgPT09IG51bGwgfHwgdGV4dCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmluZy5yZXBlYXQgcmVxdWlyZXMgYSB2YWxpZCBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtYXhMZW5ndGggPT09IEluZmluaXR5KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdzdHJpbmcucGFkU3RhcnQgcmVxdWlyZXMgYSBub24tbmVnYXRpdmUgZmluaXRlIGNvdW50LicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobWF4TGVuZ3RoID09PSBudWxsIHx8IG1heExlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IG1heExlbmd0aCA8IDApIHtcclxuICAgICAgICAgICAgbWF4TGVuZ3RoID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHN0clRleHQgPSBTdHJpbmcodGV4dCk7XHJcbiAgICAgICAgdmFyIHBhZGRpbmcgPSBtYXhMZW5ndGggLSBzdHJUZXh0Lmxlbmd0aDtcclxuICAgICAgICBpZiAocGFkZGluZyA+IDApIHtcclxuICAgICAgICAgICAgc3RyVGV4dCA9XHJcbiAgICAgICAgICAgICAgICBleHBvcnRzLnJlcGVhdChmaWxsU3RyaW5nLCBNYXRoLmZsb29yKHBhZGRpbmcgLyBmaWxsU3RyaW5nLmxlbmd0aCkpICtcclxuICAgICAgICAgICAgICAgICAgICBmaWxsU3RyaW5nLnNsaWNlKDAsIHBhZGRpbmcgJSBmaWxsU3RyaW5nLmxlbmd0aCkgK1xyXG4gICAgICAgICAgICAgICAgICAgIHN0clRleHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdHJUZXh0O1xyXG4gICAgfTtcclxufVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL3N0cmluZy5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vc3RyaW5nLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xyXG52YXIgaGFzXzEgPSByZXF1aXJlKFwiLi4vLi4vaGFzL2hhc1wiKTtcclxudmFyIGdsb2JhbF8xID0gcmVxdWlyZShcIi4uL2dsb2JhbFwiKTtcclxuZXhwb3J0cy5kZWZhdWx0ID0gaGFzXzEuZGVmYXVsdDtcclxudHNsaWJfMS5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4uLy4uL2hhcy9oYXNcIiksIGV4cG9ydHMpO1xyXG4vKiBFQ01BU2NyaXB0IDYgYW5kIDcgRmVhdHVyZXMgKi9cclxuLyogQXJyYXkgKi9cclxuaGFzXzEuYWRkKCdlczYtYXJyYXknLCBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gKFsnZnJvbScsICdvZiddLmV2ZXJ5KGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSBpbiBnbG9iYWxfMS5kZWZhdWx0LkFycmF5OyB9KSAmJlxyXG4gICAgICAgIFsnZmluZEluZGV4JywgJ2ZpbmQnLCAnY29weVdpdGhpbiddLmV2ZXJ5KGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSBpbiBnbG9iYWxfMS5kZWZhdWx0LkFycmF5LnByb3RvdHlwZTsgfSkpO1xyXG59LCB0cnVlKTtcclxuaGFzXzEuYWRkKCdlczYtYXJyYXktZmlsbCcsIGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICgnZmlsbCcgaW4gZ2xvYmFsXzEuZGVmYXVsdC5BcnJheS5wcm90b3R5cGUpIHtcclxuICAgICAgICAvKiBTb21lIHZlcnNpb25zIG9mIFNhZmFyaSBkbyBub3QgcHJvcGVybHkgaW1wbGVtZW50IHRoaXMgKi9cclxuICAgICAgICByZXR1cm4gWzFdLmZpbGwoOSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKVswXSA9PT0gMTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxufSwgdHJ1ZSk7XHJcbmhhc18xLmFkZCgnZXM3LWFycmF5JywgZnVuY3Rpb24gKCkgeyByZXR1cm4gJ2luY2x1ZGVzJyBpbiBnbG9iYWxfMS5kZWZhdWx0LkFycmF5LnByb3RvdHlwZTsgfSwgdHJ1ZSk7XHJcbi8qIE1hcCAqL1xyXG5oYXNfMS5hZGQoJ2VzNi1tYXAnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICBpZiAodHlwZW9mIGdsb2JhbF8xLmRlZmF1bHQuTWFwID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgLypcclxuICAgIElFMTEgYW5kIG9sZGVyIHZlcnNpb25zIG9mIFNhZmFyaSBhcmUgbWlzc2luZyBjcml0aWNhbCBFUzYgTWFwIGZ1bmN0aW9uYWxpdHlcclxuICAgIFdlIHdyYXAgdGhpcyBpbiBhIHRyeS9jYXRjaCBiZWNhdXNlIHNvbWV0aW1lcyB0aGUgTWFwIGNvbnN0cnVjdG9yIGV4aXN0cywgYnV0IGRvZXMgbm90XHJcbiAgICB0YWtlIGFyZ3VtZW50cyAoaU9TIDguNClcclxuICAgICAqL1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgZ2xvYmFsXzEuZGVmYXVsdC5NYXAoW1swLCAxXV0pO1xyXG4gICAgICAgICAgICByZXR1cm4gKG1hcC5oYXMoMCkgJiZcclxuICAgICAgICAgICAgICAgIHR5cGVvZiBtYXAua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJlxyXG4gICAgICAgICAgICAgICAgaGFzXzEuZGVmYXVsdCgnZXM2LXN5bWJvbCcpICYmXHJcbiAgICAgICAgICAgICAgICB0eXBlb2YgbWFwLnZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyAmJlxyXG4gICAgICAgICAgICAgICAgdHlwZW9mIG1hcC5lbnRyaWVzID09PSAnZnVuY3Rpb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IG5vdCB0ZXN0aW5nIG9uIGlPUyBhdCB0aGUgbW9tZW50ICovXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn0sIHRydWUpO1xyXG4vKiBNYXRoICovXHJcbmhhc18xLmFkZCgnZXM2LW1hdGgnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAgICdjbHozMicsXHJcbiAgICAgICAgJ3NpZ24nLFxyXG4gICAgICAgICdsb2cxMCcsXHJcbiAgICAgICAgJ2xvZzInLFxyXG4gICAgICAgICdsb2cxcCcsXHJcbiAgICAgICAgJ2V4cG0xJyxcclxuICAgICAgICAnY29zaCcsXHJcbiAgICAgICAgJ3NpbmgnLFxyXG4gICAgICAgICd0YW5oJyxcclxuICAgICAgICAnYWNvc2gnLFxyXG4gICAgICAgICdhc2luaCcsXHJcbiAgICAgICAgJ2F0YW5oJyxcclxuICAgICAgICAndHJ1bmMnLFxyXG4gICAgICAgICdmcm91bmQnLFxyXG4gICAgICAgICdjYnJ0JyxcclxuICAgICAgICAnaHlwb3QnXHJcbiAgICBdLmV2ZXJ5KGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiB0eXBlb2YgZ2xvYmFsXzEuZGVmYXVsdC5NYXRoW25hbWVdID09PSAnZnVuY3Rpb24nOyB9KTtcclxufSwgdHJ1ZSk7XHJcbmhhc18xLmFkZCgnZXM2LW1hdGgtaW11bCcsIGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICgnaW11bCcgaW4gZ2xvYmFsXzEuZGVmYXVsdC5NYXRoKSB7XHJcbiAgICAgICAgLyogU29tZSB2ZXJzaW9ucyBvZiBTYWZhcmkgb24gaW9zIGRvIG5vdCBwcm9wZXJseSBpbXBsZW1lbnQgdGhpcyAqL1xyXG4gICAgICAgIHJldHVybiBNYXRoLmltdWwoMHhmZmZmZmZmZiwgNSkgPT09IC01O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59LCB0cnVlKTtcclxuLyogT2JqZWN0ICovXHJcbmhhc18xLmFkZCgnZXM2LW9iamVjdCcsIGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiAoaGFzXzEuZGVmYXVsdCgnZXM2LXN5bWJvbCcpICYmXHJcbiAgICAgICAgWydhc3NpZ24nLCAnaXMnLCAnZ2V0T3duUHJvcGVydHlTeW1ib2xzJywgJ3NldFByb3RvdHlwZU9mJ10uZXZlcnkoZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIHR5cGVvZiBnbG9iYWxfMS5kZWZhdWx0Lk9iamVjdFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJzsgfSkpO1xyXG59LCB0cnVlKTtcclxuaGFzXzEuYWRkKCdlczIwMTctb2JqZWN0JywgZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIFsndmFsdWVzJywgJ2VudHJpZXMnLCAnZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyddLmV2ZXJ5KGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiB0eXBlb2YgZ2xvYmFsXzEuZGVmYXVsdC5PYmplY3RbbmFtZV0gPT09ICdmdW5jdGlvbic7IH0pO1xyXG59LCB0cnVlKTtcclxuLyogT2JzZXJ2YWJsZSAqL1xyXG5oYXNfMS5hZGQoJ2VzLW9ic2VydmFibGUnLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0eXBlb2YgZ2xvYmFsXzEuZGVmYXVsdC5PYnNlcnZhYmxlICE9PSAndW5kZWZpbmVkJzsgfSwgdHJ1ZSk7XHJcbi8qIFByb21pc2UgKi9cclxuaGFzXzEuYWRkKCdlczYtcHJvbWlzZScsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHR5cGVvZiBnbG9iYWxfMS5kZWZhdWx0LlByb21pc2UgIT09ICd1bmRlZmluZWQnICYmIGhhc18xLmRlZmF1bHQoJ2VzNi1zeW1ib2wnKTsgfSwgdHJ1ZSk7XHJcbi8qIFNldCAqL1xyXG5oYXNfMS5hZGQoJ2VzNi1zZXQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICBpZiAodHlwZW9mIGdsb2JhbF8xLmRlZmF1bHQuU2V0ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgLyogSUUxMSBhbmQgb2xkZXIgdmVyc2lvbnMgb2YgU2FmYXJpIGFyZSBtaXNzaW5nIGNyaXRpY2FsIEVTNiBTZXQgZnVuY3Rpb25hbGl0eSAqL1xyXG4gICAgICAgIHZhciBzZXQgPSBuZXcgZ2xvYmFsXzEuZGVmYXVsdC5TZXQoWzFdKTtcclxuICAgICAgICByZXR1cm4gc2V0LmhhcygxKSAmJiAna2V5cycgaW4gc2V0ICYmIHR5cGVvZiBzZXQua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJiBoYXNfMS5kZWZhdWx0KCdlczYtc3ltYm9sJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn0sIHRydWUpO1xyXG4vKiBTdHJpbmcgKi9cclxuaGFzXzEuYWRkKCdlczYtc3RyaW5nJywgZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIChbXHJcbiAgICAgICAgLyogc3RhdGljIG1ldGhvZHMgKi9cclxuICAgICAgICAnZnJvbUNvZGVQb2ludCdcclxuICAgIF0uZXZlcnkoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gdHlwZW9mIGdsb2JhbF8xLmRlZmF1bHQuU3RyaW5nW2tleV0gPT09ICdmdW5jdGlvbic7IH0pICYmXHJcbiAgICAgICAgW1xyXG4gICAgICAgICAgICAvKiBpbnN0YW5jZSBtZXRob2RzICovXHJcbiAgICAgICAgICAgICdjb2RlUG9pbnRBdCcsXHJcbiAgICAgICAgICAgICdub3JtYWxpemUnLFxyXG4gICAgICAgICAgICAncmVwZWF0JyxcclxuICAgICAgICAgICAgJ3N0YXJ0c1dpdGgnLFxyXG4gICAgICAgICAgICAnZW5kc1dpdGgnLFxyXG4gICAgICAgICAgICAnaW5jbHVkZXMnXHJcbiAgICAgICAgXS5ldmVyeShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiB0eXBlb2YgZ2xvYmFsXzEuZGVmYXVsdC5TdHJpbmcucHJvdG90eXBlW2tleV0gPT09ICdmdW5jdGlvbic7IH0pKTtcclxufSwgdHJ1ZSk7XHJcbmhhc18xLmFkZCgnZXM2LXN0cmluZy1yYXcnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBnZXRDYWxsU2l0ZShjYWxsU2l0ZSkge1xyXG4gICAgICAgIHZhciBzdWJzdGl0dXRpb25zID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgc3Vic3RpdHV0aW9uc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRzbGliXzEuX19zcHJlYWQoY2FsbFNpdGUpO1xyXG4gICAgICAgIHJlc3VsdC5yYXcgPSBjYWxsU2l0ZS5yYXc7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIGlmICgncmF3JyBpbiBnbG9iYWxfMS5kZWZhdWx0LlN0cmluZykge1xyXG4gICAgICAgIHZhciBiID0gMTtcclxuICAgICAgICB2YXIgY2FsbFNpdGUgPSBnZXRDYWxsU2l0ZSh0ZW1wbGF0ZU9iamVjdF8xIHx8ICh0ZW1wbGF0ZU9iamVjdF8xID0gdHNsaWJfMS5fX21ha2VUZW1wbGF0ZU9iamVjdChbXCJhXFxuXCIsIFwiXCJdLCBbXCJhXFxcXG5cIiwgXCJcIl0pKSwgYik7XHJcbiAgICAgICAgY2FsbFNpdGUucmF3ID0gWydhXFxcXG4nXTtcclxuICAgICAgICB2YXIgc3VwcG9ydHNUcnVuYyA9IGdsb2JhbF8xLmRlZmF1bHQuU3RyaW5nLnJhdyhjYWxsU2l0ZSwgNDIpID09PSAnYTpcXFxcbic7XHJcbiAgICAgICAgcmV0dXJuIHN1cHBvcnRzVHJ1bmM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn0sIHRydWUpO1xyXG5oYXNfMS5hZGQoJ2VzMjAxNy1zdHJpbmcnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gWydwYWRTdGFydCcsICdwYWRFbmQnXS5ldmVyeShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiB0eXBlb2YgZ2xvYmFsXzEuZGVmYXVsdC5TdHJpbmcucHJvdG90eXBlW2tleV0gPT09ICdmdW5jdGlvbic7IH0pO1xyXG59LCB0cnVlKTtcclxuLyogU3ltYm9sICovXHJcbmhhc18xLmFkZCgnZXM2LXN5bWJvbCcsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHR5cGVvZiBnbG9iYWxfMS5kZWZhdWx0LlN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIFN5bWJvbCgpID09PSAnc3ltYm9sJzsgfSwgdHJ1ZSk7XHJcbi8qIFdlYWtNYXAgKi9cclxuaGFzXzEuYWRkKCdlczYtd2Vha21hcCcsIGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICh0eXBlb2YgZ2xvYmFsXzEuZGVmYXVsdC5XZWFrTWFwICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIC8qIElFMTEgYW5kIG9sZGVyIHZlcnNpb25zIG9mIFNhZmFyaSBhcmUgbWlzc2luZyBjcml0aWNhbCBFUzYgTWFwIGZ1bmN0aW9uYWxpdHkgKi9cclxuICAgICAgICB2YXIga2V5MSA9IHt9O1xyXG4gICAgICAgIHZhciBrZXkyID0ge307XHJcbiAgICAgICAgdmFyIG1hcCA9IG5ldyBnbG9iYWxfMS5kZWZhdWx0LldlYWtNYXAoW1trZXkxLCAxXV0pO1xyXG4gICAgICAgIE9iamVjdC5mcmVlemUoa2V5MSk7XHJcbiAgICAgICAgcmV0dXJuIG1hcC5nZXQoa2V5MSkgPT09IDEgJiYgbWFwLnNldChrZXkyLCAyKSA9PT0gbWFwICYmIGhhc18xLmRlZmF1bHQoJ2VzNi1zeW1ib2wnKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxufSwgdHJ1ZSk7XHJcbi8qIE1pc2NlbGxhbmVvdXMgZmVhdHVyZXMgKi9cclxuaGFzXzEuYWRkKCdtaWNyb3Rhc2tzJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gaGFzXzEuZGVmYXVsdCgnZXM2LXByb21pc2UnKSB8fCBoYXNfMS5kZWZhdWx0KCdob3N0LW5vZGUnKSB8fCBoYXNfMS5kZWZhdWx0KCdkb20tbXV0YXRpb25vYnNlcnZlcicpOyB9LCB0cnVlKTtcclxuaGFzXzEuYWRkKCdwb3N0bWVzc2FnZScsIGZ1bmN0aW9uICgpIHtcclxuICAgIC8vIElmIHdpbmRvdyBpcyB1bmRlZmluZWQsIGFuZCB3ZSBoYXZlIHBvc3RNZXNzYWdlLCBpdCBwcm9iYWJseSBtZWFucyB3ZSdyZSBpbiBhIHdlYiB3b3JrZXIuIFdlYiB3b3JrZXJzIGhhdmVcclxuICAgIC8vIHBvc3QgbWVzc2FnZSBidXQgaXQgZG9lc24ndCB3b3JrIGhvdyB3ZSBleHBlY3QgaXQgdG8sIHNvIGl0J3MgYmVzdCBqdXN0IHRvIHByZXRlbmQgaXQgZG9lc24ndCBleGlzdC5cclxuICAgIHJldHVybiB0eXBlb2YgZ2xvYmFsXzEuZGVmYXVsdC53aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBnbG9iYWxfMS5kZWZhdWx0LnBvc3RNZXNzYWdlID09PSAnZnVuY3Rpb24nO1xyXG59LCB0cnVlKTtcclxuaGFzXzEuYWRkKCdyYWYnLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0eXBlb2YgZ2xvYmFsXzEuZGVmYXVsdC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbic7IH0sIHRydWUpO1xyXG5oYXNfMS5hZGQoJ3NldGltbWVkaWF0ZScsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHR5cGVvZiBnbG9iYWxfMS5kZWZhdWx0LnNldEltbWVkaWF0ZSAhPT0gJ3VuZGVmaW5lZCc7IH0sIHRydWUpO1xyXG4vKiBET00gRmVhdHVyZXMgKi9cclxuaGFzXzEuYWRkKCdkb20tbXV0YXRpb25vYnNlcnZlcicsIGZ1bmN0aW9uICgpIHtcclxuICAgIGlmIChoYXNfMS5kZWZhdWx0KCdob3N0LWJyb3dzZXInKSAmJiBCb29sZWFuKGdsb2JhbF8xLmRlZmF1bHQuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWxfMS5kZWZhdWx0LldlYktpdE11dGF0aW9uT2JzZXJ2ZXIpKSB7XHJcbiAgICAgICAgLy8gSUUxMSBoYXMgYW4gdW5yZWxpYWJsZSBNdXRhdGlvbk9ic2VydmVyIGltcGxlbWVudGF0aW9uIHdoZXJlIHNldFByb3BlcnR5KCkgZG9lcyBub3RcclxuICAgICAgICAvLyBnZW5lcmF0ZSBhIG11dGF0aW9uIGV2ZW50LCBvYnNlcnZlcnMgY2FuIGNyYXNoLCBhbmQgdGhlIHF1ZXVlIGRvZXMgbm90IGRyYWluXHJcbiAgICAgICAgLy8gcmVsaWFibHkuIFRoZSBmb2xsb3dpbmcgZmVhdHVyZSB0ZXN0IHdhcyBhZGFwdGVkIGZyb21cclxuICAgICAgICAvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS90MTBrby80YWNlYjhjNzE2ODFmZGIyNzVlMzNlZmU1ZTU3NmIxNFxyXG4gICAgICAgIHZhciBleGFtcGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWUgKi9cclxuICAgICAgICB2YXIgSG9zdE11dGF0aW9uT2JzZXJ2ZXIgPSBnbG9iYWxfMS5kZWZhdWx0Lk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsXzEuZGVmYXVsdC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xyXG4gICAgICAgIHZhciBvYnNlcnZlciA9IG5ldyBIb3N0TXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAoKSB7IH0pO1xyXG4gICAgICAgIG9ic2VydmVyLm9ic2VydmUoZXhhbXBsZSwgeyBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xyXG4gICAgICAgIGV4YW1wbGUuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCAnYmxvY2snKTtcclxuICAgICAgICByZXR1cm4gQm9vbGVhbihvYnNlcnZlci50YWtlUmVjb3JkcygpLmxlbmd0aCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn0sIHRydWUpO1xyXG5oYXNfMS5hZGQoJ2RvbS13ZWJhbmltYXRpb24nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBoYXNfMS5kZWZhdWx0KCdob3N0LWJyb3dzZXInKSAmJiBnbG9iYWxfMS5kZWZhdWx0LkFuaW1hdGlvbiAhPT0gdW5kZWZpbmVkICYmIGdsb2JhbF8xLmRlZmF1bHQuS2V5ZnJhbWVFZmZlY3QgIT09IHVuZGVmaW5lZDsgfSwgdHJ1ZSk7XHJcbnZhciB0ZW1wbGF0ZU9iamVjdF8xO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay9zaGltL3N1cHBvcnQvaGFzLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9zdXBwb3J0L2hhcy5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgZ2xvYmFsXzEgPSByZXF1aXJlKFwiLi4vZ2xvYmFsXCIpO1xyXG52YXIgaGFzXzEgPSByZXF1aXJlKFwiLi9oYXNcIik7XHJcbmZ1bmN0aW9uIGV4ZWN1dGVUYXNrKGl0ZW0pIHtcclxuICAgIGlmIChpdGVtICYmIGl0ZW0uaXNBY3RpdmUgJiYgaXRlbS5jYWxsYmFjaykge1xyXG4gICAgICAgIGl0ZW0uY2FsbGJhY2soKTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBnZXRRdWV1ZUhhbmRsZShpdGVtLCBkZXN0cnVjdG9yKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5kZXN0cm95ID0gZnVuY3Rpb24gKCkgeyB9O1xyXG4gICAgICAgICAgICBpdGVtLmlzQWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGl0ZW0uY2FsbGJhY2sgPSBudWxsO1xyXG4gICAgICAgICAgICBpZiAoZGVzdHJ1Y3Rvcikge1xyXG4gICAgICAgICAgICAgICAgZGVzdHJ1Y3RvcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG52YXIgY2hlY2tNaWNyb1Rhc2tRdWV1ZTtcclxudmFyIG1pY3JvVGFza3M7XHJcbi8qKlxyXG4gKiBTY2hlZHVsZXMgYSBjYWxsYmFjayB0byB0aGUgbWFjcm90YXNrIHF1ZXVlLlxyXG4gKlxyXG4gKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGJlIHF1ZXVlZCBhbmQgbGF0ZXIgZXhlY3V0ZWQuXHJcbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIGEgYGRlc3Ryb3lgIG1ldGhvZCB0aGF0LCB3aGVuIGNhbGxlZCwgcHJldmVudHMgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnJvbSBleGVjdXRpbmcuXHJcbiAqL1xyXG5leHBvcnRzLnF1ZXVlVGFzayA9IChmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgZGVzdHJ1Y3RvcjtcclxuICAgIHZhciBlbnF1ZXVlO1xyXG4gICAgLy8gU2luY2UgdGhlIElFIGltcGxlbWVudGF0aW9uIG9mIGBzZXRJbW1lZGlhdGVgIGlzIG5vdCBmbGF3bGVzcywgd2Ugd2lsbCB0ZXN0IGZvciBgcG9zdE1lc3NhZ2VgIGZpcnN0LlxyXG4gICAgaWYgKGhhc18xLmRlZmF1bHQoJ3Bvc3RtZXNzYWdlJykpIHtcclxuICAgICAgICB2YXIgcXVldWVfMSA9IFtdO1xyXG4gICAgICAgIGdsb2JhbF8xLmRlZmF1bHQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAvLyBDb25maXJtIHRoYXQgdGhlIGV2ZW50IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIGN1cnJlbnQgd2luZG93IGFuZCBieSB0aGlzIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24uXHJcbiAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2UgPT09IGdsb2JhbF8xLmRlZmF1bHQgJiYgZXZlbnQuZGF0YSA9PT0gJ2Rvam8tcXVldWUtbWVzc2FnZScpIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlXzEubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVRhc2socXVldWVfMS5zaGlmdCgpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGVucXVldWUgPSBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICBxdWV1ZV8xLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgIGdsb2JhbF8xLmRlZmF1bHQucG9zdE1lc3NhZ2UoJ2Rvam8tcXVldWUtbWVzc2FnZScsICcqJyk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGhhc18xLmRlZmF1bHQoJ3NldGltbWVkaWF0ZScpKSB7XHJcbiAgICAgICAgZGVzdHJ1Y3RvciA9IGdsb2JhbF8xLmRlZmF1bHQuY2xlYXJJbW1lZGlhdGU7XHJcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzZXRJbW1lZGlhdGUoZXhlY3V0ZVRhc2suYmluZChudWxsLCBpdGVtKSk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGRlc3RydWN0b3IgPSBnbG9iYWxfMS5kZWZhdWx0LmNsZWFyVGltZW91dDtcclxuICAgICAgICBlbnF1ZXVlID0gZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZXhlY3V0ZVRhc2suYmluZChudWxsLCBpdGVtKSwgMCk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHF1ZXVlVGFzayhjYWxsYmFjaykge1xyXG4gICAgICAgIHZhciBpdGVtID0ge1xyXG4gICAgICAgICAgICBpc0FjdGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrXHJcbiAgICAgICAgfTtcclxuICAgICAgICB2YXIgaWQgPSBlbnF1ZXVlKGl0ZW0pO1xyXG4gICAgICAgIHJldHVybiBnZXRRdWV1ZUhhbmRsZShpdGVtLCBkZXN0cnVjdG9yICYmXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGRlc3RydWN0b3IoaWQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vIFRPRE86IFVzZSBhc3BlY3QuYmVmb3JlIHdoZW4gaXQgaXMgYXZhaWxhYmxlLlxyXG4gICAgcmV0dXJuIGhhc18xLmRlZmF1bHQoJ21pY3JvdGFza3MnKVxyXG4gICAgICAgID8gcXVldWVUYXNrXHJcbiAgICAgICAgOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgY2hlY2tNaWNyb1Rhc2tRdWV1ZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gcXVldWVUYXNrKGNhbGxiYWNrKTtcclxuICAgICAgICB9O1xyXG59KSgpO1xyXG4vLyBXaGVuIG5vIG1lY2hhbmlzbSBmb3IgcmVnaXN0ZXJpbmcgbWljcm90YXNrcyBpcyBleHBvc2VkIGJ5IHRoZSBlbnZpcm9ubWVudCwgbWljcm90YXNrcyB3aWxsXHJcbi8vIGJlIHF1ZXVlZCBhbmQgdGhlbiBleGVjdXRlZCBpbiBhIHNpbmdsZSBtYWNyb3Rhc2sgYmVmb3JlIHRoZSBvdGhlciBtYWNyb3Rhc2tzIGFyZSBleGVjdXRlZC5cclxuaWYgKCFoYXNfMS5kZWZhdWx0KCdtaWNyb3Rhc2tzJykpIHtcclxuICAgIHZhciBpc01pY3JvVGFza1F1ZXVlZF8xID0gZmFsc2U7XHJcbiAgICBtaWNyb1Rhc2tzID0gW107XHJcbiAgICBjaGVja01pY3JvVGFza1F1ZXVlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICghaXNNaWNyb1Rhc2tRdWV1ZWRfMSkge1xyXG4gICAgICAgICAgICBpc01pY3JvVGFza1F1ZXVlZF8xID0gdHJ1ZTtcclxuICAgICAgICAgICAgZXhwb3J0cy5xdWV1ZVRhc2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaXNNaWNyb1Rhc2tRdWV1ZWRfMSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgaWYgKG1pY3JvVGFza3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChpdGVtID0gbWljcm9UYXNrcy5zaGlmdCgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlVGFzayhpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuLyoqXHJcbiAqIFNjaGVkdWxlcyBhbiBhbmltYXRpb24gdGFzayB3aXRoIGB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lYCBpZiBpdCBleGlzdHMsIG9yIHdpdGggYHF1ZXVlVGFza2Agb3RoZXJ3aXNlLlxyXG4gKlxyXG4gKiBTaW5jZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUncyBiZWhhdmlvciBkb2VzIG5vdCBtYXRjaCB0aGF0IGV4cGVjdGVkIGZyb20gYHF1ZXVlVGFza2AsIGl0IGlzIG5vdCB1c2VkIHRoZXJlLlxyXG4gKiBIb3dldmVyLCBhdCB0aW1lcyBpdCBtYWtlcyBtb3JlIHNlbnNlIHRvIGRlbGVnYXRlIHRvIHJlcXVlc3RBbmltYXRpb25GcmFtZTsgaGVuY2UgdGhlIGZvbGxvd2luZyBtZXRob2QuXHJcbiAqXHJcbiAqIEBwYXJhbSBjYWxsYmFjayB0aGUgZnVuY3Rpb24gdG8gYmUgcXVldWVkIGFuZCBsYXRlciBleGVjdXRlZC5cclxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggYSBgZGVzdHJveWAgbWV0aG9kIHRoYXQsIHdoZW4gY2FsbGVkLCBwcmV2ZW50cyB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmcm9tIGV4ZWN1dGluZy5cclxuICovXHJcbmV4cG9ydHMucXVldWVBbmltYXRpb25UYXNrID0gKGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICghaGFzXzEuZGVmYXVsdCgncmFmJykpIHtcclxuICAgICAgICByZXR1cm4gZXhwb3J0cy5xdWV1ZVRhc2s7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBxdWV1ZUFuaW1hdGlvblRhc2soY2FsbGJhY2spIHtcclxuICAgICAgICB2YXIgaXRlbSA9IHtcclxuICAgICAgICAgICAgaXNBY3RpdmU6IHRydWUsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdmFyIHJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGV4ZWN1dGVUYXNrLmJpbmQobnVsbCwgaXRlbSkpO1xyXG4gICAgICAgIHJldHVybiBnZXRRdWV1ZUhhbmRsZShpdGVtLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vIFRPRE86IFVzZSBhc3BlY3QuYmVmb3JlIHdoZW4gaXQgaXMgYXZhaWxhYmxlLlxyXG4gICAgcmV0dXJuIGhhc18xLmRlZmF1bHQoJ21pY3JvdGFza3MnKVxyXG4gICAgICAgID8gcXVldWVBbmltYXRpb25UYXNrXHJcbiAgICAgICAgOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgY2hlY2tNaWNyb1Rhc2tRdWV1ZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gcXVldWVBbmltYXRpb25UYXNrKGNhbGxiYWNrKTtcclxuICAgICAgICB9O1xyXG59KSgpO1xyXG4vKipcclxuICogU2NoZWR1bGVzIGEgY2FsbGJhY2sgdG8gdGhlIG1pY3JvdGFzayBxdWV1ZS5cclxuICpcclxuICogQW55IGNhbGxiYWNrcyByZWdpc3RlcmVkIHdpdGggYHF1ZXVlTWljcm9UYXNrYCB3aWxsIGJlIGV4ZWN1dGVkIGJlZm9yZSB0aGUgbmV4dCBtYWNyb3Rhc2suIElmIG5vIG5hdGl2ZVxyXG4gKiBtZWNoYW5pc20gZm9yIHNjaGVkdWxpbmcgbWFjcm90YXNrcyBpcyBleHBvc2VkLCB0aGVuIGFueSBjYWxsYmFja3Mgd2lsbCBiZSBmaXJlZCBiZWZvcmUgYW55IG1hY3JvdGFza1xyXG4gKiByZWdpc3RlcmVkIHdpdGggYHF1ZXVlVGFza2Agb3IgYHF1ZXVlQW5pbWF0aW9uVGFza2AuXHJcbiAqXHJcbiAqIEBwYXJhbSBjYWxsYmFjayB0aGUgZnVuY3Rpb24gdG8gYmUgcXVldWVkIGFuZCBsYXRlciBleGVjdXRlZC5cclxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggYSBgZGVzdHJveWAgbWV0aG9kIHRoYXQsIHdoZW4gY2FsbGVkLCBwcmV2ZW50cyB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmcm9tIGV4ZWN1dGluZy5cclxuICovXHJcbmV4cG9ydHMucXVldWVNaWNyb1Rhc2sgPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIGVucXVldWU7XHJcbiAgICBpZiAoaGFzXzEuZGVmYXVsdCgnaG9zdC1ub2RlJykpIHtcclxuICAgICAgICBlbnF1ZXVlID0gZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgZ2xvYmFsXzEuZGVmYXVsdC5wcm9jZXNzLm5leHRUaWNrKGV4ZWN1dGVUYXNrLmJpbmQobnVsbCwgaXRlbSkpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChoYXNfMS5kZWZhdWx0KCdlczYtcHJvbWlzZScpKSB7XHJcbiAgICAgICAgZW5xdWV1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbF8xLmRlZmF1bHQuUHJvbWlzZS5yZXNvbHZlKGl0ZW0pLnRoZW4oZXhlY3V0ZVRhc2spO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChoYXNfMS5kZWZhdWx0KCdkb20tbXV0YXRpb25vYnNlcnZlcicpKSB7XHJcbiAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWUgKi9cclxuICAgICAgICB2YXIgSG9zdE11dGF0aW9uT2JzZXJ2ZXIgPSBnbG9iYWxfMS5kZWZhdWx0Lk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsXzEuZGVmYXVsdC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xyXG4gICAgICAgIHZhciBub2RlXzEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICB2YXIgcXVldWVfMiA9IFtdO1xyXG4gICAgICAgIHZhciBvYnNlcnZlciA9IG5ldyBIb3N0TXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHdoaWxlIChxdWV1ZV8yLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHZhciBpdGVtID0gcXVldWVfMi5zaGlmdCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5pc0FjdGl2ZSAmJiBpdGVtLmNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5jYWxsYmFjaygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShub2RlXzEsIHsgYXR0cmlidXRlczogdHJ1ZSB9KTtcclxuICAgICAgICBlbnF1ZXVlID0gZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgcXVldWVfMi5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICBub2RlXzEuc2V0QXR0cmlidXRlKCdxdWV1ZVN0YXR1cycsICcxJyk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGVucXVldWUgPSBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICBjaGVja01pY3JvVGFza1F1ZXVlKCk7XHJcbiAgICAgICAgICAgIG1pY3JvVGFza3MucHVzaChpdGVtKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChjYWxsYmFjaykge1xyXG4gICAgICAgIHZhciBpdGVtID0ge1xyXG4gICAgICAgICAgICBpc0FjdGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrXHJcbiAgICAgICAgfTtcclxuICAgICAgICBlbnF1ZXVlKGl0ZW0pO1xyXG4gICAgICAgIHJldHVybiBnZXRRdWV1ZUhhbmRsZShpdGVtKTtcclxuICAgIH07XHJcbn0pKCk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vc3VwcG9ydC9xdWV1ZS5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vc3VwcG9ydC9xdWV1ZS5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG4vKipcclxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGEgdmFsdWUgcHJvcGVydHkgZGVzY3JpcHRvclxyXG4gKlxyXG4gKiBAcGFyYW0gdmFsdWUgICAgICAgIFRoZSB2YWx1ZSB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciBzaG91bGQgYmUgc2V0IHRvXHJcbiAqIEBwYXJhbSBlbnVtZXJhYmxlICAgSWYgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBlbnVtYmVyYWJsZSwgZGVmYXVsdHMgdG8gZmFsc2VcclxuICogQHBhcmFtIHdyaXRhYmxlICAgICBJZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIHdyaXRhYmxlLCBkZWZhdWx0cyB0byB0cnVlXHJcbiAqIEBwYXJhbSBjb25maWd1cmFibGUgSWYgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBjb25maWd1cmFibGUsIGRlZmF1bHRzIHRvIHRydWVcclxuICogQHJldHVybiAgICAgICAgICAgICBUaGUgcHJvcGVydHkgZGVzY3JpcHRvciBvYmplY3RcclxuICovXHJcbmZ1bmN0aW9uIGdldFZhbHVlRGVzY3JpcHRvcih2YWx1ZSwgZW51bWVyYWJsZSwgd3JpdGFibGUsIGNvbmZpZ3VyYWJsZSkge1xyXG4gICAgaWYgKGVudW1lcmFibGUgPT09IHZvaWQgMCkgeyBlbnVtZXJhYmxlID0gZmFsc2U7IH1cclxuICAgIGlmICh3cml0YWJsZSA9PT0gdm9pZCAwKSB7IHdyaXRhYmxlID0gdHJ1ZTsgfVxyXG4gICAgaWYgKGNvbmZpZ3VyYWJsZSA9PT0gdm9pZCAwKSB7IGNvbmZpZ3VyYWJsZSA9IHRydWU7IH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxyXG4gICAgICAgIGVudW1lcmFibGU6IGVudW1lcmFibGUsXHJcbiAgICAgICAgd3JpdGFibGU6IHdyaXRhYmxlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogY29uZmlndXJhYmxlXHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydHMuZ2V0VmFsdWVEZXNjcmlwdG9yID0gZ2V0VmFsdWVEZXNjcmlwdG9yO1xyXG5mdW5jdGlvbiB3cmFwTmF0aXZlKG5hdGl2ZUZ1bmN0aW9uKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkge1xyXG4gICAgICAgIHZhciBhcmdzID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgYXJnc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5hdGl2ZUZ1bmN0aW9uLmFwcGx5KHRhcmdldCwgYXJncyk7XHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydHMud3JhcE5hdGl2ZSA9IHdyYXBOYXRpdmU7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3NoaW0vc3VwcG9ydC91dGlsLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvc2hpbS9zdXBwb3J0L3V0aWwuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XHJcbnZhciBhc3NlcnRSZW5kZXJfMSA9IHJlcXVpcmUoXCIuL3N1cHBvcnQvYXNzZXJ0UmVuZGVyXCIpO1xyXG52YXIgc2VsZWN0b3JfMSA9IHJlcXVpcmUoXCIuL3N1cHBvcnQvc2VsZWN0b3JcIik7XHJcbnZhciBkXzEgPSByZXF1aXJlKFwiLi4vd2lkZ2V0LWNvcmUvZFwiKTtcclxuZnVuY3Rpb24gZGVjb3JhdGVOb2RlcyhkTm9kZSkge1xyXG4gICAgdmFyIGhhc0RlZmVycmVkUHJvcGVydGllcyA9IGZhbHNlO1xyXG4gICAgZnVuY3Rpb24gYWRkUGFyZW50KHBhcmVudCkge1xyXG4gICAgICAgIChwYXJlbnQuY2hpbGRyZW4gfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XHJcbiAgICAgICAgICAgIGlmIChkXzEuaXNWTm9kZShjaGlsZCkgfHwgZF8xLmlzV05vZGUoY2hpbGQpKSB7XHJcbiAgICAgICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoZF8xLmlzVk5vZGUocGFyZW50KSAmJiB0eXBlb2YgcGFyZW50LmRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIGhhc0RlZmVycmVkUHJvcGVydGllcyA9IHRydWU7XHJcbiAgICAgICAgICAgIHBhcmVudC5wcm9wZXJ0aWVzID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgcGFyZW50LnByb3BlcnRpZXMsIHBhcmVudC5kZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayhmYWxzZSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHZhciBub2RlcyA9IGRfMS5kZWNvcmF0ZShkTm9kZSwgYWRkUGFyZW50LCBmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gZF8xLmlzV05vZGUobm9kZSkgfHwgZF8xLmlzVk5vZGUobm9kZSk7IH0pO1xyXG4gICAgcmV0dXJuIHsgaGFzRGVmZXJyZWRQcm9wZXJ0aWVzOiBoYXNEZWZlcnJlZFByb3BlcnRpZXMsIG5vZGVzOiBub2RlcyB9O1xyXG59XHJcbmZ1bmN0aW9uIGhhcm5lc3MocmVuZGVyRnVuYywgY3VzdG9tQ29tcGFyYXRvcikge1xyXG4gICAgaWYgKGN1c3RvbUNvbXBhcmF0b3IgPT09IHZvaWQgMCkgeyBjdXN0b21Db21wYXJhdG9yID0gW107IH1cclxuICAgIHZhciBpbnZhbGlkYXRlZCA9IHRydWU7XHJcbiAgICB2YXIgd05vZGUgPSByZW5kZXJGdW5jKCk7XHJcbiAgICB2YXIgd2lkZ2V0O1xyXG4gICAgdmFyIHJlbmRlclN0YWNrID0gW107XHJcbiAgICB2YXIgcHJvcGVydGllcyA9IHdOb2RlLnByb3BlcnRpZXMsIGNoaWxkcmVuID0gd05vZGUuY2hpbGRyZW47XHJcbiAgICB2YXIgd2lkZ2V0Q29uc3RydWN0b3IgPSB3Tm9kZS53aWRnZXRDb25zdHJ1Y3RvcjtcclxuICAgIGlmICh0eXBlb2Ygd2lkZ2V0Q29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICB3aWRnZXQgPSBuZXcgLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xyXG4gICAgICAgICAgICB0c2xpYl8xLl9fZXh0ZW5kcyhjbGFzc18xLCBfc3VwZXIpO1xyXG4gICAgICAgICAgICBmdW5jdGlvbiBjbGFzc18xKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNsYXNzXzEucHJvdG90eXBlLmludmFsaWRhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpbnZhbGlkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmludmFsaWRhdGUuY2FsbCh0aGlzKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmV0dXJuIGNsYXNzXzE7XHJcbiAgICAgICAgfSh3aWRnZXRDb25zdHJ1Y3RvcikpKCk7XHJcbiAgICAgICAgd2lkZ2V0Ll9fc2V0UHJvcGVydGllc19fKHByb3BlcnRpZXMpO1xyXG4gICAgICAgIHdpZGdldC5fX3NldENoaWxkcmVuX18oY2hpbGRyZW4pO1xyXG4gICAgICAgIF90cnlSZW5kZXIoKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSGFybmVzcyBkb2VzIG5vdCBzdXBwb3J0IHJlZ2lzdHJ5IGl0ZW1zJyk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBfZ2V0UmVuZGVyKGNvdW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGNvdW50ID8gcmVuZGVyU3RhY2tbY291bnRdIDogcmVuZGVyU3RhY2tbcmVuZGVyU3RhY2subGVuZ3RoIC0gMV07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBfcnVuQ29tcGFyZXMobm9kZXMsIGlzRXhwZWN0ZWQpIHtcclxuICAgICAgICBpZiAoaXNFeHBlY3RlZCA9PT0gdm9pZCAwKSB7IGlzRXhwZWN0ZWQgPSBmYWxzZTsgfVxyXG4gICAgICAgIGN1c3RvbUNvbXBhcmF0b3IuZm9yRWFjaChmdW5jdGlvbiAoX2EpIHtcclxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yID0gX2Euc2VsZWN0b3IsIHByb3BlcnR5ID0gX2EucHJvcGVydHksIGNvbXBhcmF0b3IgPSBfYS5jb21wYXJhdG9yO1xyXG4gICAgICAgICAgICB2YXIgaXRlbXMgPSBzZWxlY3Rvcl8xLnNlbGVjdChzZWxlY3Rvciwgbm9kZXMpO1xyXG4gICAgICAgICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvbXBhcmF0b3JOYW1lID0gXCJjb21wYXJhdG9yKHNlbGVjdG9yPVwiICsgc2VsZWN0b3IgKyBcIiwgXCIgKyBwcm9wZXJ0eSArIFwiKVwiO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5wcm9wZXJ0aWVzICYmIGl0ZW0ucHJvcGVydGllc1twcm9wZXJ0eV0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb21wYXJhdG9yUmVzdWx0ID0gY29tcGFyYXRvcihpdGVtLnByb3BlcnRpZXNbcHJvcGVydHldKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGNvbXBhcmF0b3JOYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogY29tcGFyYXRvck5hbWUgKyBcIiBGQUlMRURcIjtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLnByb3BlcnRpZXNbcHJvcGVydHldID0gaXNFeHBlY3RlZCA/IGNvbXBhcmF0b3JOYW1lIDogY29tcGFyYXRvclJlc3VsdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBfdHJ5UmVuZGVyKCkge1xyXG4gICAgICAgIHZhciBfYSA9IHJlbmRlckZ1bmMoKSwgcHJvcGVydGllcyA9IF9hLnByb3BlcnRpZXMsIGNoaWxkcmVuID0gX2EuY2hpbGRyZW47XHJcbiAgICAgICAgd2lkZ2V0Ll9fc2V0UHJvcGVydGllc19fKHByb3BlcnRpZXMpO1xyXG4gICAgICAgIHdpZGdldC5fX3NldENoaWxkcmVuX18oY2hpbGRyZW4pO1xyXG4gICAgICAgIGlmIChpbnZhbGlkYXRlZCkge1xyXG4gICAgICAgICAgICB2YXIgcmVuZGVyID0gd2lkZ2V0Ll9fcmVuZGVyX18oKTtcclxuICAgICAgICAgICAgdmFyIF9iID0gZGVjb3JhdGVOb2RlcyhyZW5kZXIpLCBoYXNEZWZlcnJlZFByb3BlcnRpZXMgPSBfYi5oYXNEZWZlcnJlZFByb3BlcnRpZXMsIG5vZGVzID0gX2Iubm9kZXM7XHJcbiAgICAgICAgICAgIF9ydW5Db21wYXJlcyhub2Rlcyk7XHJcbiAgICAgICAgICAgIHJlbmRlclN0YWNrLnB1c2gobm9kZXMpO1xyXG4gICAgICAgICAgICBpZiAoaGFzRGVmZXJyZWRQcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYWZ0ZXJEZWZlcnJlZFByb3BlcnRpZXNOb2RlcyA9IGRlY29yYXRlTm9kZXMocmVuZGVyKS5ub2RlcztcclxuICAgICAgICAgICAgICAgIF9ydW5Db21wYXJlcyhhZnRlckRlZmVycmVkUHJvcGVydGllc05vZGVzKTtcclxuICAgICAgICAgICAgICAgIHJlbmRlclN0YWNrLnB1c2goYWZ0ZXJEZWZlcnJlZFByb3BlcnRpZXNOb2Rlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaW52YWxpZGF0ZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBfZXhwZWN0KGV4cGVjdGVkUmVuZGVyRnVuYywgYWN0dWFsUmVuZGVyRnVuYywgc2VsZWN0b3IpIHtcclxuICAgICAgICB2YXIgcmVuZGVyUmVzdWx0O1xyXG4gICAgICAgIGlmIChhY3R1YWxSZW5kZXJGdW5jID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgX3RyeVJlbmRlcigpO1xyXG4gICAgICAgICAgICByZW5kZXJSZXN1bHQgPSBfZ2V0UmVuZGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZW5kZXJSZXN1bHQgPSBhY3R1YWxSZW5kZXJGdW5jKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBleHBlY3RlZFJlbmRlclJlc3VsdCA9IGRlY29yYXRlTm9kZXMoZXhwZWN0ZWRSZW5kZXJGdW5jKCkpLm5vZGVzO1xyXG4gICAgICAgIF9ydW5Db21wYXJlcyhleHBlY3RlZFJlbmRlclJlc3VsdCwgdHJ1ZSk7XHJcbiAgICAgICAgaWYgKHNlbGVjdG9yKSB7XHJcbiAgICAgICAgICAgIHZhciBfYSA9IHRzbGliXzEuX19yZWFkKHNlbGVjdG9yXzEuc2VsZWN0KHNlbGVjdG9yLCByZW5kZXJSZXN1bHQpLCAxKSwgZmlyc3RJdGVtID0gX2FbMF07XHJcbiAgICAgICAgICAgIGFzc2VydFJlbmRlcl8xLmRlZmF1bHQoZmlyc3RJdGVtLCBleHBlY3RlZFJlbmRlclJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBhc3NlcnRSZW5kZXJfMS5kZWZhdWx0KHJlbmRlclJlc3VsdCwgZXhwZWN0ZWRSZW5kZXJSZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgZXhwZWN0OiBmdW5jdGlvbiAoZXhwZWN0ZWRSZW5kZXJGdW5jLCBhY3R1YWxSZW5kZXJGdW5jKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfZXhwZWN0KGV4cGVjdGVkUmVuZGVyRnVuYywgYWN0dWFsUmVuZGVyRnVuYyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBleHBlY3RQYXJ0aWFsOiBmdW5jdGlvbiAoc2VsZWN0b3IsIGV4cGVjdGVkUmVuZGVyRnVuYywgYWN0dWFsUmVuZGVyRnVuYykge1xyXG4gICAgICAgICAgICByZXR1cm4gX2V4cGVjdChleHBlY3RlZFJlbmRlckZ1bmMsIGFjdHVhbFJlbmRlckZ1bmMsIHNlbGVjdG9yKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRyaWdnZXI6IGZ1bmN0aW9uIChzZWxlY3RvciwgZnVuY3Rpb25TZWxlY3Rvcikge1xyXG4gICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDI7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgYXJnc1tfaSAtIDJdID0gYXJndW1lbnRzW19pXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfdHJ5UmVuZGVyKCk7XHJcbiAgICAgICAgICAgIHZhciBfYSA9IHRzbGliXzEuX19yZWFkKHNlbGVjdG9yXzEuc2VsZWN0KHNlbGVjdG9yLCBfZ2V0UmVuZGVyKCkpLCAxKSwgZmlyc3RJdGVtID0gX2FbMF07XHJcbiAgICAgICAgICAgIGlmIChmaXJzdEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIHZhciB0cmlnZ2VyRnVuY3Rpb24gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZ1bmN0aW9uU2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckZ1bmN0aW9uID0gZmlyc3RJdGVtLnByb3BlcnRpZXNbZnVuY3Rpb25TZWxlY3Rvcl07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyRnVuY3Rpb24gPSBmdW5jdGlvblNlbGVjdG9yKGZpcnN0SXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodHJpZ2dlckZ1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyaWdnZXJGdW5jdGlvbi5hcHBseSh3aWRnZXQsIGFyZ3MpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBnZXRSZW5kZXI6IGZ1bmN0aW9uIChpbmRleCkge1xyXG4gICAgICAgICAgICByZXR1cm4gX2dldFJlbmRlcihpbmRleCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5leHBvcnRzLmhhcm5lc3MgPSBoYXJuZXNzO1xyXG5leHBvcnRzLmRlZmF1bHQgPSBoYXJuZXNzO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay90ZXN0aW5nL2hhcm5lc3MuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay90ZXN0aW5nL2hhcm5lc3MuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxudmFyIGRfMSA9IHJlcXVpcmUoXCIuLi8uLi93aWRnZXQtY29yZS9kXCIpO1xyXG52YXIgZGlmZiA9IHJlcXVpcmUoXCJkaWZmXCIpO1xyXG52YXIgV2Vha01hcF8xID0gcmVxdWlyZShcIi4uLy4uL3NoaW0vV2Vha01hcFwiKTtcclxudmFyIFNldF8xID0gcmVxdWlyZShcIi4uLy4uL3NoaW0vU2V0XCIpO1xyXG52YXIgTWFwXzEgPSByZXF1aXJlKFwiLi4vLi4vc2hpbS9NYXBcIik7XHJcbnZhciBhcnJheV8xID0gcmVxdWlyZShcIi4uLy4uL3NoaW0vYXJyYXlcIik7XHJcbnZhciB3aWRnZXRDbGFzc0NvdW50ZXIgPSAwO1xyXG52YXIgd2lkZ2V0TWFwID0gbmV3IFdlYWtNYXBfMS5kZWZhdWx0KCk7XHJcbmZ1bmN0aW9uIHJlcGxhY2VyKGtleSwgdmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICByZXR1cm4gJ2Z1bmN0aW9uJztcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNldF8xLmRlZmF1bHQgfHwgdmFsdWUgaW5zdGFuY2VvZiBNYXBfMS5kZWZhdWx0KSB7XHJcbiAgICAgICAgcmV0dXJuIGFycmF5XzEuZnJvbSh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbn1cclxuZnVuY3Rpb24gZm9ybWF0RE5vZGVzKG5vZGVzLCBkZXB0aCkge1xyXG4gICAgaWYgKGRlcHRoID09PSB2b2lkIDApIHsgZGVwdGggPSAwOyB9XHJcbiAgICB2YXIgaXNBcnJheUZyYWdtZW50ID0gQXJyYXkuaXNBcnJheShub2RlcykgJiYgZGVwdGggPT09IDA7XHJcbiAgICB2YXIgaW5pdGlhbCA9IGlzQXJyYXlGcmFnbWVudCA/ICdbXFxuJyA6ICcnO1xyXG4gICAgdmFyIHRhYnMgPSAnJztcclxuICAgIGRlcHRoID0gaXNBcnJheUZyYWdtZW50ID8gMSA6IGRlcHRoO1xyXG4gICAgbm9kZXMgPSBBcnJheS5pc0FycmF5KG5vZGVzKSA/IG5vZGVzIDogW25vZGVzXTtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVwdGg7IGkrKykge1xyXG4gICAgICAgIHRhYnMgPSB0YWJzICsgXCJcXHRcIjtcclxuICAgIH1cclxuICAgIHZhciBmb3JtYXR0ZWROb2RlID0gbm9kZXMucmVkdWNlKGZ1bmN0aW9uIChyZXN1bHQsIG5vZGUsIGluZGV4KSB7XHJcbiAgICAgICAgaWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpbmRleCA+IDApIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgXCJcXG5cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzdWx0ID0gXCJcIiArIHJlc3VsdCArIHRhYnM7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBub2RlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgXCJcXFwiXCIgKyBub2RlICsgXCJcXFwiXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3VsdCA9IFwiXCIgKyByZXN1bHQgKyBmb3JtYXROb2RlKG5vZGUsIHRhYnMpO1xyXG4gICAgICAgIGlmIChub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBcIiwgW1xcblwiICsgZm9ybWF0RE5vZGVzKG5vZGUuY2hpbGRyZW4sIGRlcHRoICsgMSkgKyBcIlxcblwiICsgdGFicyArIFwiXVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0ICsgXCIpXCI7XHJcbiAgICB9LCBpbml0aWFsKTtcclxuICAgIHJldHVybiBpc0FycmF5RnJhZ21lbnQgPyAoZm9ybWF0dGVkTm9kZSA9IGZvcm1hdHRlZE5vZGUgKyBcIlxcbl1cIikgOiBmb3JtYXR0ZWROb2RlO1xyXG59XHJcbmV4cG9ydHMuZm9ybWF0RE5vZGVzID0gZm9ybWF0RE5vZGVzO1xyXG5mdW5jdGlvbiBmb3JtYXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMsIHRhYnMpIHtcclxuICAgIHByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKVxyXG4gICAgICAgIC5zb3J0KClcclxuICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChwcm9wcywga2V5KSB7XHJcbiAgICAgICAgcHJvcHNba2V5XSA9IHByb3BlcnRpZXNba2V5XTtcclxuICAgICAgICByZXR1cm4gcHJvcHM7XHJcbiAgICB9LCB7fSk7XHJcbiAgICBwcm9wZXJ0aWVzID0gSlNPTi5zdHJpbmdpZnkocHJvcGVydGllcywgcmVwbGFjZXIsIHRhYnMgKyBcIlxcdFwiKS5zbGljZSgwLCAtMSk7XHJcbiAgICByZXR1cm4gXCJcIiArIHByb3BlcnRpZXMgKyB0YWJzICsgXCJ9XCI7XHJcbn1cclxuZnVuY3Rpb24gZ2V0V2lkZ2V0TmFtZSh3aWRnZXRDb25zdHJ1Y3Rvcikge1xyXG4gICAgdmFyIG5hbWU7XHJcbiAgICBpZiAodHlwZW9mIHdpZGdldENvbnN0cnVjdG9yID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygd2lkZ2V0Q29uc3RydWN0b3IgPT09ICdzeW1ib2wnKSB7XHJcbiAgICAgICAgbmFtZSA9IHdpZGdldENvbnN0cnVjdG9yLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBuYW1lID0gd2lkZ2V0Q29uc3RydWN0b3IubmFtZTtcclxuICAgICAgICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHZhciBpZCA9IHdpZGdldE1hcC5nZXQod2lkZ2V0Q29uc3RydWN0b3IpO1xyXG4gICAgICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaWQgPSArK3dpZGdldENsYXNzQ291bnRlcjtcclxuICAgICAgICAgICAgICAgIHdpZGdldE1hcC5zZXQod2lkZ2V0Q29uc3RydWN0b3IsIGlkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBuYW1lID0gXCJXaWRnZXQtXCIgKyBpZDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmFtZTtcclxufVxyXG5mdW5jdGlvbiBmb3JtYXROb2RlKG5vZGUsIHRhYnMpIHtcclxuICAgIHZhciBwcm9wZXJ0eUtleUNvdW50ID0gT2JqZWN0LmtleXMobm9kZS5wcm9wZXJ0aWVzKS5sZW5ndGg7XHJcbiAgICB2YXIgcHJvcGVydGllcyA9IHByb3BlcnR5S2V5Q291bnQgPiAwID8gZm9ybWF0UHJvcGVydGllcyhub2RlLnByb3BlcnRpZXMsIHRhYnMpIDogJ3t9JztcclxuICAgIGlmIChkXzEuaXNXTm9kZShub2RlKSkge1xyXG4gICAgICAgIHJldHVybiBcIncoXCIgKyBnZXRXaWRnZXROYW1lKG5vZGUud2lkZ2V0Q29uc3RydWN0b3IpICsgXCIsIFwiICsgcHJvcGVydGllcztcclxuICAgIH1cclxuICAgIHJldHVybiBcInYoXFxcIlwiICsgbm9kZS50YWcgKyBcIlxcXCIsIFwiICsgcHJvcGVydGllcztcclxufVxyXG5mdW5jdGlvbiBhc3NlcnRSZW5kZXIoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xyXG4gICAgdmFyIHBhcnNlZEFjdHVhbCA9IGZvcm1hdEROb2RlcyhhY3R1YWwpO1xyXG4gICAgdmFyIHBhcnNlZEV4cGVjdGVkID0gZm9ybWF0RE5vZGVzKGV4cGVjdGVkKTtcclxuICAgIHZhciBkaWZmUmVzdWx0ID0gZGlmZi5kaWZmTGluZXMocGFyc2VkQWN0dWFsLCBwYXJzZWRFeHBlY3RlZCk7XHJcbiAgICB2YXIgZGlmZkZvdW5kID0gZmFsc2U7XHJcbiAgICB2YXIgcGFyc2VkRGlmZiA9IGRpZmZSZXN1bHQucmVkdWNlKGZ1bmN0aW9uIChyZXN1bHQsIHBhcnQsIGluZGV4KSB7XHJcbiAgICAgICAgaWYgKHBhcnQuYWRkZWQpIHtcclxuICAgICAgICAgICAgZGlmZkZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgXCIoRSlcIiArIHBhcnQudmFsdWUucmVwbGFjZSgvXFxuXFx0L2csICdcXG4oRSlcXHQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocGFydC5yZW1vdmVkKSB7XHJcbiAgICAgICAgICAgIGRpZmZGb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIFwiKEEpXCIgKyBwYXJ0LnZhbHVlLnJlcGxhY2UoL1xcblxcdC9nLCAnXFxuKEEpXFx0Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXN1bHQgPSBcIlwiICsgcmVzdWx0ICsgcGFydC52YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH0sICdcXG4nKTtcclxuICAgIGlmIChkaWZmRm91bmQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocGFyc2VkRGlmZik7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cy5hc3NlcnRSZW5kZXIgPSBhc3NlcnRSZW5kZXI7XHJcbmV4cG9ydHMuZGVmYXVsdCA9IGFzc2VydFJlbmRlcjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvdGVzdGluZy9zdXBwb3J0L2Fzc2VydFJlbmRlci5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3Rlc3Rpbmcvc3VwcG9ydC9hc3NlcnRSZW5kZXIuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XHJcbnZhciBkXzEgPSByZXF1aXJlKFwiLi4vLi4vd2lkZ2V0LWNvcmUvZFwiKTtcclxudmFyIGNzc1NlbGVjdCA9IHJlcXVpcmUoXCJjc3Mtc2VsZWN0LXVtZFwiKTtcclxuZXhwb3J0cy5wYXJzZVNlbGVjdG9yID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XHJcbiAgICB2YXIgc2VsZWN0b3JzID0gc2VsZWN0b3Iuc3BsaXQoJyAnKTtcclxuICAgIHJldHVybiBzZWxlY3RvcnNcclxuICAgICAgICAubWFwKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xyXG4gICAgICAgIHZhciBrZXlTaWdpbEluZGV4ID0gc2VsZWN0b3IuaW5kZXhPZignQCcpO1xyXG4gICAgICAgIGlmIChrZXlTaWdpbEluZGV4ID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIltrZXk9XFxcIlwiICsgc2VsZWN0b3Iuc3Vic3RyKDEpICsgXCJcXFwiXVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChrZXlTaWdpbEluZGV4ID4gMCkge1xyXG4gICAgICAgICAgICB2YXIga2V5ID0gc2VsZWN0b3Iuc3Vic3RyaW5nKGtleVNpZ2lsSW5kZXggKyAxKTtcclxuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yLnNsaWNlKDAsIGtleVNpZ2lsSW5kZXgpICsgXCJba2V5PVxcXCJcIiArIGtleSArIFwiXFxcIl1cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yO1xyXG4gICAgfSlcclxuICAgICAgICAuam9pbignICcpO1xyXG59O1xyXG5leHBvcnRzLmFkYXB0ZXIgPSB7XHJcbiAgICBpc1RhZzogZnVuY3Rpb24gKGVsZW0pIHtcclxuICAgICAgICByZXR1cm4gZF8xLmlzVk5vZGUoZWxlbSk7XHJcbiAgICB9LFxyXG4gICAgZ2V0VGV4dDogZnVuY3Rpb24gKGVsZW0pIHtcclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICB9LFxyXG4gICAgcmVtb3ZlU3Vic2V0czogZnVuY3Rpb24gKGVsZW1lbnRzKSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzO1xyXG4gICAgfSxcclxuICAgIGdldENoaWxkcmVuOiBmdW5jdGlvbiAoZWxlbSkge1xyXG4gICAgICAgIHJldHVybiBkXzEuaXNWTm9kZShlbGVtKSB8fCBkXzEuaXNXTm9kZShlbGVtKSA/IGVsZW0uY2hpbGRyZW4gOiBbXTtcclxuICAgIH0sXHJcbiAgICBnZXRBdHRyaWJ1dGVWYWx1ZTogZnVuY3Rpb24gKGVsZW0sIG5hbWUpIHtcclxuICAgICAgICBpZiAoZF8xLmlzVk5vZGUoZWxlbSkgfHwgZF8xLmlzV05vZGUoZWxlbSkpIHtcclxuICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdjbGFzcycpIHtcclxuICAgICAgICAgICAgICAgIHZhciBjbGFzc2VzID0gZWxlbS5wcm9wZXJ0aWVzLmNsYXNzZXM7XHJcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjbGFzc2VzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc2VzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBlbGVtLnByb3BlcnRpZXNbbmFtZV07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIGhhc0F0dHJpYjogZnVuY3Rpb24gKGVsZW0sIG5hbWUpIHtcclxuICAgICAgICBpZiAoZF8xLmlzVk5vZGUoZWxlbSkgfHwgZF8xLmlzV05vZGUoZWxlbSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5hbWUgaW4gZWxlbS5wcm9wZXJ0aWVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9LFxyXG4gICAgZXhpc3RzT25lOiBmdW5jdGlvbiAodGVzdCwgZWxlbWVudHMpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudHMuc29tZShmdW5jdGlvbiAoZWxlbSkgeyByZXR1cm4gdGVzdChlbGVtKTsgfSk7XHJcbiAgICB9LFxyXG4gICAgZ2V0TmFtZTogZnVuY3Rpb24gKGVsZW0pIHtcclxuICAgICAgICBpZiAoZF8xLmlzVk5vZGUoZWxlbSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGVsZW0udGFnO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICBnZXRQYXJlbnQ6IGZ1bmN0aW9uIChlbGVtKSB7XHJcbiAgICAgICAgaWYgKGRfMS5pc1ZOb2RlKGVsZW0pIHx8IGRfMS5pc1dOb2RlKGVsZW0pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbGVtLnBhcmVudDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgZ2V0U2libGluZ3M6IGZ1bmN0aW9uIChlbGVtKSB7XHJcbiAgICAgICAgaWYgKGRfMS5pc1ZOb2RlKGVsZW0pIHx8IGRfMS5pc1dOb2RlKGVsZW0pKSB7XHJcbiAgICAgICAgICAgIGlmIChlbGVtLnBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW0ucGFyZW50LmNoaWxkcmVuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBbZWxlbV07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIGZpbmRPbmU6IGZ1bmN0aW9uICh0ZXN0LCBhcnIpIHtcclxuICAgICAgICB2YXIgZWxlbSA9IG51bGw7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnIubGVuZ3RoOyBpIDwgbCAmJiAhZWxlbTsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0ZXN0KGFycltpXSkpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0gPSBhcnJbaV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBleHBvcnRzLmFkYXB0ZXIuZ2V0Q2hpbGRyZW4oYXJyW2ldKTtcclxuICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbSA9IGV4cG9ydHMuYWRhcHRlci5maW5kT25lKHRlc3QsIGNoaWxkcmVuKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZWxlbTtcclxuICAgIH0sXHJcbiAgICBmaW5kQWxsOiBmdW5jdGlvbiAodGVzdCwgZWxlbWVudHMpIHtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRlc3QoZWxlbWVudHNbaV0pKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChlbGVtZW50c1tpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gZXhwb3J0cy5hZGFwdGVyLmdldENoaWxkcmVuKGVsZW1lbnRzW2ldKTtcclxuICAgICAgICAgICAgaWYgKGNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0c2xpYl8xLl9fc3ByZWFkKHJlc3VsdCwgZXhwb3J0cy5hZGFwdGVyLmZpbmRBbGwodGVzdCwgY2hpbGRyZW4pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG59O1xyXG5mdW5jdGlvbiBzZWxlY3Qoc2VsZWN0b3IsIG5vZGVzKSB7XHJcbiAgICBub2RlcyA9IEFycmF5LmlzQXJyYXkobm9kZXMpID8gbm9kZXMgOiBbbm9kZXNdO1xyXG4gICAgc2VsZWN0b3IgPSBleHBvcnRzLnBhcnNlU2VsZWN0b3Ioc2VsZWN0b3IpO1xyXG4gICAgcmV0dXJuIGNzc1NlbGVjdChzZWxlY3Rvciwgbm9kZXMsIHsgYWRhcHRlcjogZXhwb3J0cy5hZGFwdGVyIH0pO1xyXG59XHJcbmV4cG9ydHMuc2VsZWN0ID0gc2VsZWN0O1xyXG5leHBvcnRzLmRlZmF1bHQgPSBzZWxlY3Q7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3Rlc3Rpbmcvc3VwcG9ydC9zZWxlY3Rvci5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3Rlc3Rpbmcvc3VwcG9ydC9zZWxlY3Rvci5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcclxudmFyIEV2ZW50ZWRfMSA9IHJlcXVpcmUoXCIuLi9jb3JlL0V2ZW50ZWRcIik7XHJcbnZhciBJbmplY3RvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcclxuICAgIHRzbGliXzEuX19leHRlbmRzKEluamVjdG9yLCBfc3VwZXIpO1xyXG4gICAgZnVuY3Rpb24gSW5qZWN0b3IocGF5bG9hZCkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XHJcbiAgICAgICAgX3RoaXMuX3BheWxvYWQgPSBwYXlsb2FkO1xyXG4gICAgICAgIHJldHVybiBfdGhpcztcclxuICAgIH1cclxuICAgIEluamVjdG9yLnByb3RvdHlwZS5zZXRJbnZhbGlkYXRvciA9IGZ1bmN0aW9uIChpbnZhbGlkYXRvcikge1xyXG4gICAgICAgIHRoaXMuX2ludmFsaWRhdG9yID0gaW52YWxpZGF0b3I7XHJcbiAgICB9O1xyXG4gICAgSW5qZWN0b3IucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcGF5bG9hZDtcclxuICAgIH07XHJcbiAgICBJbmplY3Rvci5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHBheWxvYWQpIHtcclxuICAgICAgICB0aGlzLl9wYXlsb2FkID0gcGF5bG9hZDtcclxuICAgICAgICBpZiAodGhpcy5faW52YWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgdGhpcy5faW52YWxpZGF0b3IoKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIEluamVjdG9yO1xyXG59KEV2ZW50ZWRfMS5FdmVudGVkKSk7XHJcbmV4cG9ydHMuSW5qZWN0b3IgPSBJbmplY3RvcjtcclxuZXhwb3J0cy5kZWZhdWx0ID0gSW5qZWN0b3I7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL0luamVjdG9yLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvSW5qZWN0b3IuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XHJcbnZhciBFdmVudGVkXzEgPSByZXF1aXJlKFwiLi4vY29yZS9FdmVudGVkXCIpO1xyXG52YXIgTWFwXzEgPSByZXF1aXJlKFwiLi4vc2hpbS9NYXBcIik7XHJcbi8qKlxyXG4gKiBFbnVtIHRvIGlkZW50aWZ5IHRoZSB0eXBlIG9mIGV2ZW50LlxyXG4gKiBMaXN0ZW5pbmcgdG8gJ1Byb2plY3Rvcicgd2lsbCBub3RpZnkgd2hlbiBwcm9qZWN0b3IgaXMgY3JlYXRlZCBvciB1cGRhdGVkXHJcbiAqIExpc3RlbmluZyB0byAnV2lkZ2V0JyB3aWxsIG5vdGlmeSB3aGVuIHdpZGdldCByb290IGlzIGNyZWF0ZWQgb3IgdXBkYXRlZFxyXG4gKi9cclxudmFyIE5vZGVFdmVudFR5cGU7XHJcbihmdW5jdGlvbiAoTm9kZUV2ZW50VHlwZSkge1xyXG4gICAgTm9kZUV2ZW50VHlwZVtcIlByb2plY3RvclwiXSA9IFwiUHJvamVjdG9yXCI7XHJcbiAgICBOb2RlRXZlbnRUeXBlW1wiV2lkZ2V0XCJdID0gXCJXaWRnZXRcIjtcclxufSkoTm9kZUV2ZW50VHlwZSA9IGV4cG9ydHMuTm9kZUV2ZW50VHlwZSB8fCAoZXhwb3J0cy5Ob2RlRXZlbnRUeXBlID0ge30pKTtcclxudmFyIE5vZGVIYW5kbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xyXG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoTm9kZUhhbmRsZXIsIF9zdXBlcik7XHJcbiAgICBmdW5jdGlvbiBOb2RlSGFuZGxlcigpIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcclxuICAgICAgICBfdGhpcy5fbm9kZU1hcCA9IG5ldyBNYXBfMS5kZWZhdWx0KCk7XHJcbiAgICAgICAgcmV0dXJuIF90aGlzO1xyXG4gICAgfVxyXG4gICAgTm9kZUhhbmRsZXIucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbm9kZU1hcC5nZXQoa2V5KTtcclxuICAgIH07XHJcbiAgICBOb2RlSGFuZGxlci5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ub2RlTWFwLmhhcyhrZXkpO1xyXG4gICAgfTtcclxuICAgIE5vZGVIYW5kbGVyLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoZWxlbWVudCwga2V5KSB7XHJcbiAgICAgICAgdGhpcy5fbm9kZU1hcC5zZXQoa2V5LCBlbGVtZW50KTtcclxuICAgICAgICB0aGlzLmVtaXQoeyB0eXBlOiBrZXkgfSk7XHJcbiAgICB9O1xyXG4gICAgTm9kZUhhbmRsZXIucHJvdG90eXBlLmFkZFJvb3QgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KHsgdHlwZTogTm9kZUV2ZW50VHlwZS5XaWRnZXQgfSk7XHJcbiAgICB9O1xyXG4gICAgTm9kZUhhbmRsZXIucHJvdG90eXBlLmFkZFByb2plY3RvciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLmVtaXQoeyB0eXBlOiBOb2RlRXZlbnRUeXBlLlByb2plY3RvciB9KTtcclxuICAgIH07XHJcbiAgICBOb2RlSGFuZGxlci5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5fbm9kZU1hcC5jbGVhcigpO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBOb2RlSGFuZGxlcjtcclxufShFdmVudGVkXzEuRXZlbnRlZCkpO1xyXG5leHBvcnRzLk5vZGVIYW5kbGVyID0gTm9kZUhhbmRsZXI7XHJcbmV4cG9ydHMuZGVmYXVsdCA9IE5vZGVIYW5kbGVyO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9Ob2RlSGFuZGxlci5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL05vZGVIYW5kbGVyLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xyXG52YXIgUHJvbWlzZV8xID0gcmVxdWlyZShcIi4uL3NoaW0vUHJvbWlzZVwiKTtcclxudmFyIE1hcF8xID0gcmVxdWlyZShcIi4uL3NoaW0vTWFwXCIpO1xyXG52YXIgU3ltYm9sXzEgPSByZXF1aXJlKFwiLi4vc2hpbS9TeW1ib2xcIik7XHJcbnZhciBFdmVudGVkXzEgPSByZXF1aXJlKFwiLi4vY29yZS9FdmVudGVkXCIpO1xyXG4vKipcclxuICogV2lkZ2V0IGJhc2Ugc3ltYm9sIHR5cGVcclxuICovXHJcbmV4cG9ydHMuV0lER0VUX0JBU0VfVFlQRSA9IFN5bWJvbF8xLmRlZmF1bHQoJ1dpZGdldCBCYXNlJyk7XHJcbi8qKlxyXG4gKiBDaGVja3MgaXMgdGhlIGl0ZW0gaXMgYSBzdWJjbGFzcyBvZiBXaWRnZXRCYXNlIChvciBhIFdpZGdldEJhc2UpXHJcbiAqXHJcbiAqIEBwYXJhbSBpdGVtIHRoZSBpdGVtIHRvIGNoZWNrXHJcbiAqIEByZXR1cm5zIHRydWUvZmFsc2UgaW5kaWNhdGluZyBpZiB0aGUgaXRlbSBpcyBhIFdpZGdldEJhc2VDb25zdHJ1Y3RvclxyXG4gKi9cclxuZnVuY3Rpb24gaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IoaXRlbSkge1xyXG4gICAgcmV0dXJuIEJvb2xlYW4oaXRlbSAmJiBpdGVtLl90eXBlID09PSBleHBvcnRzLldJREdFVF9CQVNFX1RZUEUpO1xyXG59XHJcbmV4cG9ydHMuaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IgPSBpc1dpZGdldEJhc2VDb25zdHJ1Y3RvcjtcclxuZnVuY3Rpb24gaXNXaWRnZXRDb25zdHJ1Y3RvckRlZmF1bHRFeHBvcnQoaXRlbSkge1xyXG4gICAgcmV0dXJuIEJvb2xlYW4oaXRlbSAmJlxyXG4gICAgICAgIGl0ZW0uaGFzT3duUHJvcGVydHkoJ19fZXNNb2R1bGUnKSAmJlxyXG4gICAgICAgIGl0ZW0uaGFzT3duUHJvcGVydHkoJ2RlZmF1bHQnKSAmJlxyXG4gICAgICAgIGlzV2lkZ2V0QmFzZUNvbnN0cnVjdG9yKGl0ZW0uZGVmYXVsdCkpO1xyXG59XHJcbmV4cG9ydHMuaXNXaWRnZXRDb25zdHJ1Y3RvckRlZmF1bHRFeHBvcnQgPSBpc1dpZGdldENvbnN0cnVjdG9yRGVmYXVsdEV4cG9ydDtcclxuLyoqXHJcbiAqIFRoZSBSZWdpc3RyeSBpbXBsZW1lbnRhdGlvblxyXG4gKi9cclxudmFyIFJlZ2lzdHJ5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xyXG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoUmVnaXN0cnksIF9zdXBlcik7XHJcbiAgICBmdW5jdGlvbiBSZWdpc3RyeSgpIHtcclxuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEVtaXQgbG9hZGVkIGV2ZW50IGZvciByZWdpc3RyeSBsYWJlbFxyXG4gICAgICovXHJcbiAgICBSZWdpc3RyeS5wcm90b3R5cGUuZW1pdExvYWRlZEV2ZW50ID0gZnVuY3Rpb24gKHdpZGdldExhYmVsLCBpdGVtKSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KHtcclxuICAgICAgICAgICAgdHlwZTogd2lkZ2V0TGFiZWwsXHJcbiAgICAgICAgICAgIGFjdGlvbjogJ2xvYWRlZCcsXHJcbiAgICAgICAgICAgIGl0ZW06IGl0ZW1cclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbiAgICBSZWdpc3RyeS5wcm90b3R5cGUuZGVmaW5lID0gZnVuY3Rpb24gKGxhYmVsLCBpdGVtKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICBpZiAodGhpcy5fd2lkZ2V0UmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLl93aWRnZXRSZWdpc3RyeSA9IG5ldyBNYXBfMS5kZWZhdWx0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl93aWRnZXRSZWdpc3RyeS5oYXMobGFiZWwpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIndpZGdldCBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgZm9yICdcIiArIGxhYmVsLnRvU3RyaW5nKCkgKyBcIidcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3dpZGdldFJlZ2lzdHJ5LnNldChsYWJlbCwgaXRlbSk7XHJcbiAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQcm9taXNlXzEuZGVmYXVsdCkge1xyXG4gICAgICAgICAgICBpdGVtLnRoZW4oZnVuY3Rpb24gKHdpZGdldEN0b3IpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLl93aWRnZXRSZWdpc3RyeS5zZXQobGFiZWwsIHdpZGdldEN0b3IpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuZW1pdExvYWRlZEV2ZW50KGxhYmVsLCB3aWRnZXRDdG9yKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB3aWRnZXRDdG9yO1xyXG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoaXNXaWRnZXRCYXNlQ29uc3RydWN0b3IoaXRlbSkpIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0TG9hZGVkRXZlbnQobGFiZWwsIGl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBSZWdpc3RyeS5wcm90b3R5cGUuZGVmaW5lSW5qZWN0b3IgPSBmdW5jdGlvbiAobGFiZWwsIGluamVjdG9yRmFjdG9yeSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9pbmplY3RvclJlZ2lzdHJ5ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5faW5qZWN0b3JSZWdpc3RyeSA9IG5ldyBNYXBfMS5kZWZhdWx0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9pbmplY3RvclJlZ2lzdHJ5LmhhcyhsYWJlbCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW5qZWN0b3IgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIGZvciAnXCIgKyBsYWJlbC50b1N0cmluZygpICsgXCInXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgaW52YWxpZGF0b3IgPSBuZXcgRXZlbnRlZF8xLkV2ZW50ZWQoKTtcclxuICAgICAgICB2YXIgaW5qZWN0b3JJdGVtID0ge1xyXG4gICAgICAgICAgICBpbmplY3RvcjogaW5qZWN0b3JGYWN0b3J5KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGludmFsaWRhdG9yLmVtaXQoeyB0eXBlOiAnaW52YWxpZGF0ZScgfSk7IH0pLFxyXG4gICAgICAgICAgICBpbnZhbGlkYXRvcjogaW52YWxpZGF0b3JcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX2luamVjdG9yUmVnaXN0cnkuc2V0KGxhYmVsLCBpbmplY3Rvckl0ZW0pO1xyXG4gICAgICAgIHRoaXMuZW1pdExvYWRlZEV2ZW50KGxhYmVsLCBpbmplY3Rvckl0ZW0pO1xyXG4gICAgfTtcclxuICAgIFJlZ2lzdHJ5LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAobGFiZWwpIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGlmICghdGhpcy5fd2lkZ2V0UmVnaXN0cnkgfHwgIXRoaXMuaGFzKGxhYmVsKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLl93aWRnZXRSZWdpc3RyeS5nZXQobGFiZWwpO1xyXG4gICAgICAgIGlmIChpc1dpZGdldEJhc2VDb25zdHJ1Y3RvcihpdGVtKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQcm9taXNlXzEuZGVmYXVsdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHByb21pc2UgPSBpdGVtKCk7XHJcbiAgICAgICAgdGhpcy5fd2lkZ2V0UmVnaXN0cnkuc2V0KGxhYmVsLCBwcm9taXNlKTtcclxuICAgICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKHdpZGdldEN0b3IpIHtcclxuICAgICAgICAgICAgaWYgKGlzV2lkZ2V0Q29uc3RydWN0b3JEZWZhdWx0RXhwb3J0KHdpZGdldEN0b3IpKSB7XHJcbiAgICAgICAgICAgICAgICB3aWRnZXRDdG9yID0gd2lkZ2V0Q3Rvci5kZWZhdWx0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF90aGlzLl93aWRnZXRSZWdpc3RyeS5zZXQobGFiZWwsIHdpZGdldEN0b3IpO1xyXG4gICAgICAgICAgICBfdGhpcy5lbWl0TG9hZGVkRXZlbnQobGFiZWwsIHdpZGdldEN0b3IpO1xyXG4gICAgICAgICAgICByZXR1cm4gd2lkZ2V0Q3RvcjtcclxuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG4gICAgUmVnaXN0cnkucHJvdG90eXBlLmdldEluamVjdG9yID0gZnVuY3Rpb24gKGxhYmVsKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pbmplY3RvclJlZ2lzdHJ5IHx8ICF0aGlzLmhhc0luamVjdG9yKGxhYmVsKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luamVjdG9yUmVnaXN0cnkuZ2V0KGxhYmVsKTtcclxuICAgIH07XHJcbiAgICBSZWdpc3RyeS5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGxhYmVsKSB7XHJcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5fd2lkZ2V0UmVnaXN0cnkgJiYgdGhpcy5fd2lkZ2V0UmVnaXN0cnkuaGFzKGxhYmVsKSk7XHJcbiAgICB9O1xyXG4gICAgUmVnaXN0cnkucHJvdG90eXBlLmhhc0luamVjdG9yID0gZnVuY3Rpb24gKGxhYmVsKSB7XHJcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5faW5qZWN0b3JSZWdpc3RyeSAmJiB0aGlzLl9pbmplY3RvclJlZ2lzdHJ5LmhhcyhsYWJlbCkpO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBSZWdpc3RyeTtcclxufShFdmVudGVkXzEuRXZlbnRlZCkpO1xyXG5leHBvcnRzLlJlZ2lzdHJ5ID0gUmVnaXN0cnk7XHJcbmV4cG9ydHMuZGVmYXVsdCA9IFJlZ2lzdHJ5O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9SZWdpc3RyeS5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL1JlZ2lzdHJ5LmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xyXG52YXIgTWFwXzEgPSByZXF1aXJlKFwiLi4vc2hpbS9NYXBcIik7XHJcbnZhciBFdmVudGVkXzEgPSByZXF1aXJlKFwiLi4vY29yZS9FdmVudGVkXCIpO1xyXG52YXIgUmVnaXN0cnlfMSA9IHJlcXVpcmUoXCIuL1JlZ2lzdHJ5XCIpO1xyXG52YXIgUmVnaXN0cnlIYW5kbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xyXG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoUmVnaXN0cnlIYW5kbGVyLCBfc3VwZXIpO1xyXG4gICAgZnVuY3Rpb24gUmVnaXN0cnlIYW5kbGVyKCkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XHJcbiAgICAgICAgX3RoaXMuX3JlZ2lzdHJ5ID0gbmV3IFJlZ2lzdHJ5XzEuUmVnaXN0cnkoKTtcclxuICAgICAgICBfdGhpcy5fcmVnaXN0cnlXaWRnZXRMYWJlbE1hcCA9IG5ldyBNYXBfMS5NYXAoKTtcclxuICAgICAgICBfdGhpcy5fcmVnaXN0cnlJbmplY3RvckxhYmVsTWFwID0gbmV3IE1hcF8xLk1hcCgpO1xyXG4gICAgICAgIF90aGlzLm93bihfdGhpcy5fcmVnaXN0cnkpO1xyXG4gICAgICAgIHZhciBkZXN0cm95ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoX3RoaXMuYmFzZVJlZ2lzdHJ5KSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fcmVnaXN0cnlXaWRnZXRMYWJlbE1hcC5kZWxldGUoX3RoaXMuYmFzZVJlZ2lzdHJ5KTtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9yZWdpc3RyeUluamVjdG9yTGFiZWxNYXAuZGVsZXRlKF90aGlzLmJhc2VSZWdpc3RyeSk7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5iYXNlUmVnaXN0cnkgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIF90aGlzLm93bih7IGRlc3Ryb3k6IGRlc3Ryb3kgfSk7XHJcbiAgICAgICAgcmV0dXJuIF90aGlzO1xyXG4gICAgfVxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlZ2lzdHJ5SGFuZGxlci5wcm90b3R5cGUsIFwiYmFzZVwiLCB7XHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoYmFzZVJlZ2lzdHJ5KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmJhc2VSZWdpc3RyeSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnlXaWRnZXRMYWJlbE1hcC5kZWxldGUodGhpcy5iYXNlUmVnaXN0cnkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnlJbmplY3RvckxhYmVsTWFwLmRlbGV0ZSh0aGlzLmJhc2VSZWdpc3RyeSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5iYXNlUmVnaXN0cnkgPSBiYXNlUmVnaXN0cnk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBSZWdpc3RyeUhhbmRsZXIucHJvdG90eXBlLmRlZmluZSA9IGZ1bmN0aW9uIChsYWJlbCwgd2lkZ2V0KSB7XHJcbiAgICAgICAgdGhpcy5fcmVnaXN0cnkuZGVmaW5lKGxhYmVsLCB3aWRnZXQpO1xyXG4gICAgfTtcclxuICAgIFJlZ2lzdHJ5SGFuZGxlci5wcm90b3R5cGUuZGVmaW5lSW5qZWN0b3IgPSBmdW5jdGlvbiAobGFiZWwsIGluamVjdG9yKSB7XHJcbiAgICAgICAgdGhpcy5fcmVnaXN0cnkuZGVmaW5lSW5qZWN0b3IobGFiZWwsIGluamVjdG9yKTtcclxuICAgIH07XHJcbiAgICBSZWdpc3RyeUhhbmRsZXIucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChsYWJlbCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9yZWdpc3RyeS5oYXMobGFiZWwpIHx8IEJvb2xlYW4odGhpcy5iYXNlUmVnaXN0cnkgJiYgdGhpcy5iYXNlUmVnaXN0cnkuaGFzKGxhYmVsKSk7XHJcbiAgICB9O1xyXG4gICAgUmVnaXN0cnlIYW5kbGVyLnByb3RvdHlwZS5oYXNJbmplY3RvciA9IGZ1bmN0aW9uIChsYWJlbCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9yZWdpc3RyeS5oYXNJbmplY3RvcihsYWJlbCkgfHwgQm9vbGVhbih0aGlzLmJhc2VSZWdpc3RyeSAmJiB0aGlzLmJhc2VSZWdpc3RyeS5oYXNJbmplY3RvcihsYWJlbCkpO1xyXG4gICAgfTtcclxuICAgIFJlZ2lzdHJ5SGFuZGxlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGxhYmVsLCBnbG9iYWxQcmVjZWRlbmNlKSB7XHJcbiAgICAgICAgaWYgKGdsb2JhbFByZWNlZGVuY2UgPT09IHZvaWQgMCkgeyBnbG9iYWxQcmVjZWRlbmNlID0gZmFsc2U7IH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0KGxhYmVsLCBnbG9iYWxQcmVjZWRlbmNlLCAnZ2V0JywgdGhpcy5fcmVnaXN0cnlXaWRnZXRMYWJlbE1hcCk7XHJcbiAgICB9O1xyXG4gICAgUmVnaXN0cnlIYW5kbGVyLnByb3RvdHlwZS5nZXRJbmplY3RvciA9IGZ1bmN0aW9uIChsYWJlbCwgZ2xvYmFsUHJlY2VkZW5jZSkge1xyXG4gICAgICAgIGlmIChnbG9iYWxQcmVjZWRlbmNlID09PSB2b2lkIDApIHsgZ2xvYmFsUHJlY2VkZW5jZSA9IGZhbHNlOyB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldChsYWJlbCwgZ2xvYmFsUHJlY2VkZW5jZSwgJ2dldEluamVjdG9yJywgdGhpcy5fcmVnaXN0cnlJbmplY3RvckxhYmVsTWFwKTtcclxuICAgIH07XHJcbiAgICBSZWdpc3RyeUhhbmRsZXIucHJvdG90eXBlLl9nZXQgPSBmdW5jdGlvbiAobGFiZWwsIGdsb2JhbFByZWNlZGVuY2UsIGdldEZ1bmN0aW9uTmFtZSwgbGFiZWxNYXApIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHZhciByZWdpc3RyaWVzID0gZ2xvYmFsUHJlY2VkZW5jZSA/IFt0aGlzLmJhc2VSZWdpc3RyeSwgdGhpcy5fcmVnaXN0cnldIDogW3RoaXMuX3JlZ2lzdHJ5LCB0aGlzLmJhc2VSZWdpc3RyeV07XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWdpc3RyaWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciByZWdpc3RyeSA9IHJlZ2lzdHJpZXNbaV07XHJcbiAgICAgICAgICAgIGlmICghcmVnaXN0cnkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBpdGVtID0gcmVnaXN0cnlbZ2V0RnVuY3Rpb25OYW1lXShsYWJlbCk7XHJcbiAgICAgICAgICAgIHZhciByZWdpc3RlcmVkTGFiZWxzID0gbGFiZWxNYXAuZ2V0KHJlZ2lzdHJ5KSB8fCBbXTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHJlZ2lzdGVyZWRMYWJlbHMuaW5kZXhPZihsYWJlbCkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlID0gcmVnaXN0cnkub24obGFiZWwsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5hY3Rpb24gPT09ICdsb2FkZWQnICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzW2dldEZ1bmN0aW9uTmFtZV0obGFiZWwsIGdsb2JhbFByZWNlZGVuY2UpID09PSBldmVudC5pdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmVtaXQoeyB0eXBlOiAnaW52YWxpZGF0ZScgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm93bihoYW5kbGUpO1xyXG4gICAgICAgICAgICAgICAgbGFiZWxNYXAuc2V0KHJlZ2lzdHJ5LCB0c2xpYl8xLl9fc3ByZWFkKHJlZ2lzdGVyZWRMYWJlbHMsIFtsYWJlbF0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH07XHJcbiAgICByZXR1cm4gUmVnaXN0cnlIYW5kbGVyO1xyXG59KEV2ZW50ZWRfMS5FdmVudGVkKSk7XHJcbmV4cG9ydHMuUmVnaXN0cnlIYW5kbGVyID0gUmVnaXN0cnlIYW5kbGVyO1xyXG5leHBvcnRzLmRlZmF1bHQgPSBSZWdpc3RyeUhhbmRsZXI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL1JlZ2lzdHJ5SGFuZGxlci5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL1JlZ2lzdHJ5SGFuZGxlci5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcclxudmFyIE1hcF8xID0gcmVxdWlyZShcIi4uL3NoaW0vTWFwXCIpO1xyXG52YXIgV2Vha01hcF8xID0gcmVxdWlyZShcIi4uL3NoaW0vV2Vha01hcFwiKTtcclxudmFyIFN5bWJvbF8xID0gcmVxdWlyZShcIi4uL3NoaW0vU3ltYm9sXCIpO1xyXG52YXIgZF8xID0gcmVxdWlyZShcIi4vZFwiKTtcclxudmFyIGRpZmZfMSA9IHJlcXVpcmUoXCIuL2RpZmZcIik7XHJcbnZhciBSZWdpc3RyeUhhbmRsZXJfMSA9IHJlcXVpcmUoXCIuL1JlZ2lzdHJ5SGFuZGxlclwiKTtcclxudmFyIE5vZGVIYW5kbGVyXzEgPSByZXF1aXJlKFwiLi9Ob2RlSGFuZGxlclwiKTtcclxudmFyIHZkb21fMSA9IHJlcXVpcmUoXCIuL3Zkb21cIik7XHJcbnZhciBSZWdpc3RyeV8xID0gcmVxdWlyZShcIi4vUmVnaXN0cnlcIik7XHJcbnZhciBkZWNvcmF0b3JNYXAgPSBuZXcgTWFwXzEuZGVmYXVsdCgpO1xyXG52YXIgYm91bmRBdXRvID0gZGlmZl8xLmF1dG8uYmluZChudWxsKTtcclxuZXhwb3J0cy5ub0JpbmQgPSBTeW1ib2xfMS5kZWZhdWx0LmZvcignZG9qb05vQmluZCcpO1xyXG4vKipcclxuICogTWFpbiB3aWRnZXQgYmFzZSBmb3IgYWxsIHdpZGdldHMgdG8gZXh0ZW5kXHJcbiAqL1xyXG52YXIgV2lkZ2V0QmFzZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKlxyXG4gICAgICogQGNvbnN0cnVjdG9yXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIFdpZGdldEJhc2UoKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgaXQgaXMgdGhlIGluaXRpYWwgc2V0IHByb3BlcnRpZXMgY3ljbGVcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9pbml0aWFsUHJvcGVydGllcyA9IHRydWU7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQXJyYXkgb2YgcHJvcGVydHkga2V5cyBjb25zaWRlcmVkIGNoYW5nZWQgZnJvbSB0aGUgcHJldmlvdXMgc2V0IHByb3BlcnRpZXNcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9jaGFuZ2VkUHJvcGVydHlLZXlzID0gW107XHJcbiAgICAgICAgdGhpcy5fbm9kZUhhbmRsZXIgPSBuZXcgTm9kZUhhbmRsZXJfMS5kZWZhdWx0KCk7XHJcbiAgICAgICAgdGhpcy5faGFuZGxlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkcmVuID0gW107XHJcbiAgICAgICAgdGhpcy5fZGVjb3JhdG9yQ2FjaGUgPSBuZXcgTWFwXzEuZGVmYXVsdCgpO1xyXG4gICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSB7fTtcclxuICAgICAgICB0aGlzLl9ib3VuZFJlbmRlckZ1bmMgPSB0aGlzLnJlbmRlci5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX2JvdW5kSW52YWxpZGF0ZSA9IHRoaXMuaW52YWxpZGF0ZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHZkb21fMS53aWRnZXRJbnN0YW5jZU1hcC5zZXQodGhpcywge1xyXG4gICAgICAgICAgICBkaXJ0eTogdHJ1ZSxcclxuICAgICAgICAgICAgb25BdHRhY2g6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLm9uQXR0YWNoKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG9uRGV0YWNoOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5vbkRldGFjaCgpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBub2RlSGFuZGxlcjogdGhpcy5fbm9kZUhhbmRsZXIsXHJcbiAgICAgICAgICAgIHJlZ2lzdHJ5OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMucmVnaXN0cnk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNvcmVQcm9wZXJ0aWVzOiB7fSxcclxuICAgICAgICAgICAgcmVuZGVyaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgaW5wdXRQcm9wZXJ0aWVzOiB7fVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX3J1bkFmdGVyQ29uc3RydWN0b3JzKCk7XHJcbiAgICB9XHJcbiAgICBXaWRnZXRCYXNlLnByb3RvdHlwZS5tZXRhID0gZnVuY3Rpb24gKE1ldGFUeXBlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX21ldGFNYXAgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9tZXRhTWFwID0gbmV3IE1hcF8xLmRlZmF1bHQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGNhY2hlZCA9IHRoaXMuX21ldGFNYXAuZ2V0KE1ldGFUeXBlKTtcclxuICAgICAgICBpZiAoIWNhY2hlZCkge1xyXG4gICAgICAgICAgICBjYWNoZWQgPSBuZXcgTWV0YVR5cGUoe1xyXG4gICAgICAgICAgICAgICAgaW52YWxpZGF0ZTogdGhpcy5fYm91bmRJbnZhbGlkYXRlLFxyXG4gICAgICAgICAgICAgICAgbm9kZUhhbmRsZXI6IHRoaXMuX25vZGVIYW5kbGVyLFxyXG4gICAgICAgICAgICAgICAgYmluZDogdGhpc1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5vd24oY2FjaGVkKTtcclxuICAgICAgICAgICAgdGhpcy5fbWV0YU1hcC5zZXQoTWV0YVR5cGUsIGNhY2hlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjYWNoZWQ7XHJcbiAgICB9O1xyXG4gICAgV2lkZ2V0QmFzZS5wcm90b3R5cGUub25BdHRhY2ggPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gRG8gbm90aGluZyBieSBkZWZhdWx0LlxyXG4gICAgfTtcclxuICAgIFdpZGdldEJhc2UucHJvdG90eXBlLm9uRGV0YWNoID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vIERvIG5vdGhpbmcgYnkgZGVmYXVsdC5cclxuICAgIH07XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV2lkZ2V0QmFzZS5wcm90b3R5cGUsIFwicHJvcGVydGllc1wiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9wZXJ0aWVzO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdpZGdldEJhc2UucHJvdG90eXBlLCBcImNoYW5nZWRQcm9wZXJ0eUtleXNcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHNsaWJfMS5fX3NwcmVhZCh0aGlzLl9jaGFuZ2VkUHJvcGVydHlLZXlzKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIFdpZGdldEJhc2UucHJvdG90eXBlLl9fc2V0Q29yZVByb3BlcnRpZXNfXyA9IGZ1bmN0aW9uIChjb3JlUHJvcGVydGllcykge1xyXG4gICAgICAgIHZhciBiYXNlUmVnaXN0cnkgPSBjb3JlUHJvcGVydGllcy5iYXNlUmVnaXN0cnk7XHJcbiAgICAgICAgdmFyIGluc3RhbmNlRGF0YSA9IHZkb21fMS53aWRnZXRJbnN0YW5jZU1hcC5nZXQodGhpcyk7XHJcbiAgICAgICAgaWYgKGluc3RhbmNlRGF0YS5jb3JlUHJvcGVydGllcy5iYXNlUmVnaXN0cnkgIT09IGJhc2VSZWdpc3RyeSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fcmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnlIYW5kbGVyXzEuZGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vd24odGhpcy5fcmVnaXN0cnkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vd24odGhpcy5fcmVnaXN0cnkub24oJ2ludmFsaWRhdGUnLCB0aGlzLl9ib3VuZEludmFsaWRhdGUpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9yZWdpc3RyeS5iYXNlID0gYmFzZVJlZ2lzdHJ5O1xyXG4gICAgICAgICAgICB0aGlzLmludmFsaWRhdGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5zdGFuY2VEYXRhLmNvcmVQcm9wZXJ0aWVzID0gY29yZVByb3BlcnRpZXM7XHJcbiAgICB9O1xyXG4gICAgV2lkZ2V0QmFzZS5wcm90b3R5cGUuX19zZXRQcm9wZXJ0aWVzX18gPSBmdW5jdGlvbiAob3JpZ2luYWxQcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICB2YXIgaW5zdGFuY2VEYXRhID0gdmRvbV8xLndpZGdldEluc3RhbmNlTWFwLmdldCh0aGlzKTtcclxuICAgICAgICBpbnN0YW5jZURhdGEuaW5wdXRQcm9wZXJ0aWVzID0gb3JpZ2luYWxQcm9wZXJ0aWVzO1xyXG4gICAgICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5fcnVuQmVmb3JlUHJvcGVydGllcyhvcmlnaW5hbFByb3BlcnRpZXMpO1xyXG4gICAgICAgIHZhciByZWdpc3RlcmVkRGlmZlByb3BlcnR5TmFtZXMgPSB0aGlzLmdldERlY29yYXRvcigncmVnaXN0ZXJlZERpZmZQcm9wZXJ0eScpO1xyXG4gICAgICAgIHZhciBjaGFuZ2VkUHJvcGVydHlLZXlzID0gW107XHJcbiAgICAgICAgdmFyIHByb3BlcnR5TmFtZXMgPSBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKTtcclxuICAgICAgICBpZiAodGhpcy5faW5pdGlhbFByb3BlcnRpZXMgPT09IGZhbHNlIHx8IHJlZ2lzdGVyZWREaWZmUHJvcGVydHlOYW1lcy5sZW5ndGggIT09IDApIHtcclxuICAgICAgICAgICAgdmFyIGFsbFByb3BlcnRpZXMgPSB0c2xpYl8xLl9fc3ByZWFkKHByb3BlcnR5TmFtZXMsIE9iamVjdC5rZXlzKHRoaXMuX3Byb3BlcnRpZXMpKTtcclxuICAgICAgICAgICAgdmFyIGNoZWNrZWRQcm9wZXJ0aWVzID0gW107XHJcbiAgICAgICAgICAgIHZhciBkaWZmUHJvcGVydHlSZXN1bHRzXzEgPSB7fTtcclxuICAgICAgICAgICAgdmFyIHJ1blJlYWN0aW9ucyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBhbGxQcm9wZXJ0aWVzW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrZWRQcm9wZXJ0aWVzLmluZGV4T2YocHJvcGVydHlOYW1lKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNoZWNrZWRQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHlOYW1lKTtcclxuICAgICAgICAgICAgICAgIHZhciBwcmV2aW91c1Byb3BlcnR5ID0gdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xyXG4gICAgICAgICAgICAgICAgdmFyIG5ld1Byb3BlcnR5ID0gdGhpcy5fYmluZEZ1bmN0aW9uUHJvcGVydHkocHJvcGVydGllc1twcm9wZXJ0eU5hbWVdLCBpbnN0YW5jZURhdGEuY29yZVByb3BlcnRpZXMuYmluZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVnaXN0ZXJlZERpZmZQcm9wZXJ0eU5hbWVzLmluZGV4T2YocHJvcGVydHlOYW1lKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBydW5SZWFjdGlvbnMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkaWZmRnVuY3Rpb25zID0gdGhpcy5nZXREZWNvcmF0b3IoXCJkaWZmUHJvcGVydHk6XCIgKyBwcm9wZXJ0eU5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGlfMSA9IDA7IGlfMSA8IGRpZmZGdW5jdGlvbnMubGVuZ3RoOyBpXzErKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZGlmZkZ1bmN0aW9uc1tpXzFdKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5jaGFuZ2VkICYmIGNoYW5nZWRQcm9wZXJ0eUtleXMuaW5kZXhPZihwcm9wZXJ0eU5hbWUpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFByb3BlcnR5S2V5cy5wdXNoKHByb3BlcnR5TmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZSBpbiBwcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmUHJvcGVydHlSZXN1bHRzXzFbcHJvcGVydHlOYW1lXSA9IHJlc3VsdC52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBib3VuZEF1dG8ocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuY2hhbmdlZCAmJiBjaGFuZ2VkUHJvcGVydHlLZXlzLmluZGV4T2YocHJvcGVydHlOYW1lKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFByb3BlcnR5S2V5cy5wdXNoKHByb3BlcnR5TmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydGllcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaWZmUHJvcGVydHlSZXN1bHRzXzFbcHJvcGVydHlOYW1lXSA9IHJlc3VsdC52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHJ1blJlYWN0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlYWN0aW9uRnVuY3Rpb25zID0gdGhpcy5nZXREZWNvcmF0b3IoJ2RpZmZSZWFjdGlvbicpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGV4ZWN1dGVkUmVhY3Rpb25zXzEgPSBbXTtcclxuICAgICAgICAgICAgICAgIHJlYWN0aW9uRnVuY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlYWN0aW9uID0gX2EucmVhY3Rpb24sIHByb3BlcnR5TmFtZSA9IF9hLnByb3BlcnR5TmFtZTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlDaGFuZ2VkID0gY2hhbmdlZFByb3BlcnR5S2V5cy5pbmRleE9mKHByb3BlcnR5TmFtZSkgIT09IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZWFjdGlvblJ1biA9IGV4ZWN1dGVkUmVhY3Rpb25zXzEuaW5kZXhPZihyZWFjdGlvbikgIT09IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eUNoYW5nZWQgJiYgIXJlYWN0aW9uUnVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWN0aW9uLmNhbGwoX3RoaXMsIF90aGlzLl9wcm9wZXJ0aWVzLCBkaWZmUHJvcGVydHlSZXN1bHRzXzEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZFJlYWN0aW9uc18xLnB1c2gocmVhY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBkaWZmUHJvcGVydHlSZXN1bHRzXzE7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZWRQcm9wZXJ0eUtleXMgPSBjaGFuZ2VkUHJvcGVydHlLZXlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5faW5pdGlhbFByb3BlcnRpZXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gdGhpcy5fYmluZEZ1bmN0aW9uUHJvcGVydHkocHJvcGVydGllc1twcm9wZXJ0eU5hbWVdLCBpbnN0YW5jZURhdGEuY29yZVByb3BlcnRpZXMuYmluZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkUHJvcGVydHlLZXlzLnB1c2gocHJvcGVydHlOYW1lKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VkUHJvcGVydHlLZXlzID0gY2hhbmdlZFByb3BlcnR5S2V5cztcclxuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHRzbGliXzEuX19hc3NpZ24oe30sIHByb3BlcnRpZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fY2hhbmdlZFByb3BlcnR5S2V5cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV2lkZ2V0QmFzZS5wcm90b3R5cGUsIFwiY2hpbGRyZW5cIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW47XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBXaWRnZXRCYXNlLnByb3RvdHlwZS5fX3NldENoaWxkcmVuX18gPSBmdW5jdGlvbiAoY2hpbGRyZW4pIHtcclxuICAgICAgICBpZiAodGhpcy5fY2hpbGRyZW4ubGVuZ3RoID4gMCB8fCBjaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkcmVuID0gY2hpbGRyZW47XHJcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBXaWRnZXRCYXNlLnByb3RvdHlwZS5fX3JlbmRlcl9fID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBpbnN0YW5jZURhdGEgPSB2ZG9tXzEud2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHRoaXMpO1xyXG4gICAgICAgIGluc3RhbmNlRGF0YS5kaXJ0eSA9IGZhbHNlO1xyXG4gICAgICAgIHZhciByZW5kZXIgPSB0aGlzLl9ydW5CZWZvcmVSZW5kZXJzKCk7XHJcbiAgICAgICAgdmFyIGROb2RlID0gcmVuZGVyKCk7XHJcbiAgICAgICAgZE5vZGUgPSB0aGlzLnJ1bkFmdGVyUmVuZGVycyhkTm9kZSk7XHJcbiAgICAgICAgdGhpcy5fbm9kZUhhbmRsZXIuY2xlYXIoKTtcclxuICAgICAgICByZXR1cm4gZE5vZGU7XHJcbiAgICB9O1xyXG4gICAgV2lkZ2V0QmFzZS5wcm90b3R5cGUuaW52YWxpZGF0ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgaW5zdGFuY2VEYXRhID0gdmRvbV8xLndpZGdldEluc3RhbmNlTWFwLmdldCh0aGlzKTtcclxuICAgICAgICBpZiAoaW5zdGFuY2VEYXRhLmludmFsaWRhdGUpIHtcclxuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLmludmFsaWRhdGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgV2lkZ2V0QmFzZS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBkXzEudignZGl2Jywge30sIHRoaXMuY2hpbGRyZW4pO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogRnVuY3Rpb24gdG8gYWRkIGRlY29yYXRvcnMgdG8gV2lkZ2V0QmFzZVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBkZWNvcmF0b3JLZXkgVGhlIGtleSBvZiB0aGUgZGVjb3JhdG9yXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBkZWNvcmF0b3JcclxuICAgICAqL1xyXG4gICAgV2lkZ2V0QmFzZS5wcm90b3R5cGUuYWRkRGVjb3JhdG9yID0gZnVuY3Rpb24gKGRlY29yYXRvcktleSwgdmFsdWUpIHtcclxuICAgICAgICB2YWx1ZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xyXG4gICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KCdjb25zdHJ1Y3RvcicpKSB7XHJcbiAgICAgICAgICAgIHZhciBkZWNvcmF0b3JMaXN0ID0gZGVjb3JhdG9yTWFwLmdldCh0aGlzLmNvbnN0cnVjdG9yKTtcclxuICAgICAgICAgICAgaWYgKCFkZWNvcmF0b3JMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICBkZWNvcmF0b3JMaXN0ID0gbmV3IE1hcF8xLmRlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGRlY29yYXRvck1hcC5zZXQodGhpcy5jb25zdHJ1Y3RvciwgZGVjb3JhdG9yTGlzdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHNwZWNpZmljRGVjb3JhdG9yTGlzdCA9IGRlY29yYXRvckxpc3QuZ2V0KGRlY29yYXRvcktleSk7XHJcbiAgICAgICAgICAgIGlmICghc3BlY2lmaWNEZWNvcmF0b3JMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICBzcGVjaWZpY0RlY29yYXRvckxpc3QgPSBbXTtcclxuICAgICAgICAgICAgICAgIGRlY29yYXRvckxpc3Quc2V0KGRlY29yYXRvcktleSwgc3BlY2lmaWNEZWNvcmF0b3JMaXN0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzcGVjaWZpY0RlY29yYXRvckxpc3QucHVzaC5hcHBseShzcGVjaWZpY0RlY29yYXRvckxpc3QsIHRzbGliXzEuX19zcHJlYWQodmFsdWUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBkZWNvcmF0b3JzID0gdGhpcy5nZXREZWNvcmF0b3IoZGVjb3JhdG9yS2V5KTtcclxuICAgICAgICAgICAgdGhpcy5fZGVjb3JhdG9yQ2FjaGUuc2V0KGRlY29yYXRvcktleSwgdHNsaWJfMS5fX3NwcmVhZChkZWNvcmF0b3JzLCB2YWx1ZSkpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIEZ1bmN0aW9uIHRvIGJ1aWxkIHRoZSBsaXN0IG9mIGRlY29yYXRvcnMgZnJvbSB0aGUgZ2xvYmFsIGRlY29yYXRvciBtYXAuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGRlY29yYXRvcktleSAgVGhlIGtleSBvZiB0aGUgZGVjb3JhdG9yXHJcbiAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIGRlY29yYXRvciB2YWx1ZXNcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIFdpZGdldEJhc2UucHJvdG90eXBlLl9idWlsZERlY29yYXRvckxpc3QgPSBmdW5jdGlvbiAoZGVjb3JhdG9yS2V5KSB7XHJcbiAgICAgICAgdmFyIGFsbERlY29yYXRvcnMgPSBbXTtcclxuICAgICAgICB2YXIgY29uc3RydWN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yO1xyXG4gICAgICAgIHdoaWxlIChjb25zdHJ1Y3Rvcikge1xyXG4gICAgICAgICAgICB2YXIgaW5zdGFuY2VNYXAgPSBkZWNvcmF0b3JNYXAuZ2V0KGNvbnN0cnVjdG9yKTtcclxuICAgICAgICAgICAgaWYgKGluc3RhbmNlTWFwKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGVjb3JhdG9ycyA9IGluc3RhbmNlTWFwLmdldChkZWNvcmF0b3JLZXkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRlY29yYXRvcnMpIHtcclxuICAgICAgICAgICAgICAgICAgICBhbGxEZWNvcmF0b3JzLnVuc2hpZnQuYXBwbHkoYWxsRGVjb3JhdG9ycywgdHNsaWJfMS5fX3NwcmVhZChkZWNvcmF0b3JzKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3RydWN0b3IgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY29uc3RydWN0b3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYWxsRGVjb3JhdG9ycztcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIEZ1bmN0aW9uIHRvIHJldHJpZXZlIGRlY29yYXRvciB2YWx1ZXNcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZGVjb3JhdG9yS2V5IFRoZSBrZXkgb2YgdGhlIGRlY29yYXRvclxyXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgZGVjb3JhdG9yIHZhbHVlc1xyXG4gICAgICovXHJcbiAgICBXaWRnZXRCYXNlLnByb3RvdHlwZS5nZXREZWNvcmF0b3IgPSBmdW5jdGlvbiAoZGVjb3JhdG9yS2V5KSB7XHJcbiAgICAgICAgdmFyIGFsbERlY29yYXRvcnMgPSB0aGlzLl9kZWNvcmF0b3JDYWNoZS5nZXQoZGVjb3JhdG9yS2V5KTtcclxuICAgICAgICBpZiAoYWxsRGVjb3JhdG9ycyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhbGxEZWNvcmF0b3JzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhbGxEZWNvcmF0b3JzID0gdGhpcy5fYnVpbGREZWNvcmF0b3JMaXN0KGRlY29yYXRvcktleSk7XHJcbiAgICAgICAgdGhpcy5fZGVjb3JhdG9yQ2FjaGUuc2V0KGRlY29yYXRvcktleSwgYWxsRGVjb3JhdG9ycyk7XHJcbiAgICAgICAgcmV0dXJuIGFsbERlY29yYXRvcnM7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBCaW5kcyB1bmJvdW5kIHByb3BlcnR5IGZ1bmN0aW9ucyB0byB0aGUgc3BlY2lmaWVkIGBiaW5kYCBwcm9wZXJ0eVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIHByb3BlcnRpZXMgdG8gY2hlY2sgZm9yIGZ1bmN0aW9uc1xyXG4gICAgICovXHJcbiAgICBXaWRnZXRCYXNlLnByb3RvdHlwZS5fYmluZEZ1bmN0aW9uUHJvcGVydHkgPSBmdW5jdGlvbiAocHJvcGVydHksIGJpbmQpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHByb3BlcnR5ID09PSAnZnVuY3Rpb24nICYmICFwcm9wZXJ0eVtleHBvcnRzLm5vQmluZF0gJiYgUmVnaXN0cnlfMS5pc1dpZGdldEJhc2VDb25zdHJ1Y3Rvcihwcm9wZXJ0eSkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eU1hcCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9iaW5kRnVuY3Rpb25Qcm9wZXJ0eU1hcCA9IG5ldyBXZWFrTWFwXzEuZGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBiaW5kSW5mbyA9IHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5TWFwLmdldChwcm9wZXJ0eSkgfHwge307XHJcbiAgICAgICAgICAgIHZhciBib3VuZEZ1bmMgPSBiaW5kSW5mby5ib3VuZEZ1bmMsIHNjb3BlID0gYmluZEluZm8uc2NvcGU7XHJcbiAgICAgICAgICAgIGlmIChib3VuZEZ1bmMgPT09IHVuZGVmaW5lZCB8fCBzY29wZSAhPT0gYmluZCkge1xyXG4gICAgICAgICAgICAgICAgYm91bmRGdW5jID0gcHJvcGVydHkuYmluZChiaW5kKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2JpbmRGdW5jdGlvblByb3BlcnR5TWFwLnNldChwcm9wZXJ0eSwgeyBib3VuZEZ1bmM6IGJvdW5kRnVuYywgc2NvcGU6IGJpbmQgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGJvdW5kRnVuYztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHByb3BlcnR5O1xyXG4gICAgfTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXaWRnZXRCYXNlLnByb3RvdHlwZSwgXCJyZWdpc3RyeVwiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZWdpc3RyeSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RyeSA9IG5ldyBSZWdpc3RyeUhhbmRsZXJfMS5kZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm93bih0aGlzLl9yZWdpc3RyeS5vbignaW52YWxpZGF0ZScsIHRoaXMuX2JvdW5kSW52YWxpZGF0ZSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWdpc3RyeTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIFdpZGdldEJhc2UucHJvdG90eXBlLl9ydW5CZWZvcmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKHByb3BlcnRpZXMpIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHZhciBiZWZvcmVQcm9wZXJ0aWVzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2JlZm9yZVByb3BlcnRpZXMnKTtcclxuICAgICAgICBpZiAoYmVmb3JlUHJvcGVydGllcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBiZWZvcmVQcm9wZXJ0aWVzLnJlZHVjZShmdW5jdGlvbiAocHJvcGVydGllcywgYmVmb3JlUHJvcGVydGllc0Z1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHNsaWJfMS5fX2Fzc2lnbih7fSwgcHJvcGVydGllcywgYmVmb3JlUHJvcGVydGllc0Z1bmN0aW9uLmNhbGwoX3RoaXMsIHByb3BlcnRpZXMpKTtcclxuICAgICAgICAgICAgfSwgdHNsaWJfMS5fX2Fzc2lnbih7fSwgcHJvcGVydGllcykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcHJvcGVydGllcztcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIFJ1biBhbGwgcmVnaXN0ZXJlZCBiZWZvcmUgcmVuZGVycyBhbmQgcmV0dXJuIHRoZSB1cGRhdGVkIHJlbmRlciBtZXRob2RcclxuICAgICAqL1xyXG4gICAgV2lkZ2V0QmFzZS5wcm90b3R5cGUuX3J1bkJlZm9yZVJlbmRlcnMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICB2YXIgYmVmb3JlUmVuZGVycyA9IHRoaXMuZ2V0RGVjb3JhdG9yKCdiZWZvcmVSZW5kZXInKTtcclxuICAgICAgICBpZiAoYmVmb3JlUmVuZGVycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBiZWZvcmVSZW5kZXJzLnJlZHVjZShmdW5jdGlvbiAocmVuZGVyLCBiZWZvcmVSZW5kZXJGdW5jdGlvbikge1xyXG4gICAgICAgICAgICAgICAgdmFyIHVwZGF0ZWRSZW5kZXIgPSBiZWZvcmVSZW5kZXJGdW5jdGlvbi5jYWxsKF90aGlzLCByZW5kZXIsIF90aGlzLl9wcm9wZXJ0aWVzLCBfdGhpcy5fY2hpbGRyZW4pO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF1cGRhdGVkUmVuZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZW5kZXIgZnVuY3Rpb24gbm90IHJldHVybmVkIGZyb20gYmVmb3JlUmVuZGVyLCB1c2luZyBwcmV2aW91cyByZW5kZXInKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZWRSZW5kZXI7XHJcbiAgICAgICAgICAgIH0sIHRoaXMuX2JvdW5kUmVuZGVyRnVuYyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9ib3VuZFJlbmRlckZ1bmM7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBSdW4gYWxsIHJlZ2lzdGVyZWQgYWZ0ZXIgcmVuZGVycyBhbmQgcmV0dXJuIHRoZSBkZWNvcmF0ZWQgRE5vZGVzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGROb2RlIFRoZSBETm9kZXMgdG8gcnVuIHRocm91Z2ggdGhlIGFmdGVyIHJlbmRlcnNcclxuICAgICAqL1xyXG4gICAgV2lkZ2V0QmFzZS5wcm90b3R5cGUucnVuQWZ0ZXJSZW5kZXJzID0gZnVuY3Rpb24gKGROb2RlKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICB2YXIgYWZ0ZXJSZW5kZXJzID0gdGhpcy5nZXREZWNvcmF0b3IoJ2FmdGVyUmVuZGVyJyk7XHJcbiAgICAgICAgaWYgKGFmdGVyUmVuZGVycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGROb2RlID0gYWZ0ZXJSZW5kZXJzLnJlZHVjZShmdW5jdGlvbiAoZE5vZGUsIGFmdGVyUmVuZGVyRnVuY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhZnRlclJlbmRlckZ1bmN0aW9uLmNhbGwoX3RoaXMsIGROb2RlKTtcclxuICAgICAgICAgICAgfSwgZE5vZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fbWV0YU1hcCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21ldGFNYXAuZm9yRWFjaChmdW5jdGlvbiAobWV0YSkge1xyXG4gICAgICAgICAgICAgICAgbWV0YS5hZnRlclJlbmRlcigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGROb2RlO1xyXG4gICAgfTtcclxuICAgIFdpZGdldEJhc2UucHJvdG90eXBlLl9ydW5BZnRlckNvbnN0cnVjdG9ycyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHZhciBhZnRlckNvbnN0cnVjdG9ycyA9IHRoaXMuZ2V0RGVjb3JhdG9yKCdhZnRlckNvbnN0cnVjdG9yJyk7XHJcbiAgICAgICAgaWYgKGFmdGVyQ29uc3RydWN0b3JzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgYWZ0ZXJDb25zdHJ1Y3RvcnMuZm9yRWFjaChmdW5jdGlvbiAoYWZ0ZXJDb25zdHJ1Y3RvcikgeyByZXR1cm4gYWZ0ZXJDb25zdHJ1Y3Rvci5jYWxsKF90aGlzKTsgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFdpZGdldEJhc2UucHJvdG90eXBlLm93biA9IGZ1bmN0aW9uIChoYW5kbGUpIHtcclxuICAgICAgICB0aGlzLl9oYW5kbGVzLnB1c2goaGFuZGxlKTtcclxuICAgIH07XHJcbiAgICBXaWRnZXRCYXNlLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHdoaWxlICh0aGlzLl9oYW5kbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IHRoaXMuX2hhbmRsZXMucG9wKCk7XHJcbiAgICAgICAgICAgIGlmIChoYW5kbGUpIHtcclxuICAgICAgICAgICAgICAgIGhhbmRsZS5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBzdGF0aWMgaWRlbnRpZmllclxyXG4gICAgICovXHJcbiAgICBXaWRnZXRCYXNlLl90eXBlID0gUmVnaXN0cnlfMS5XSURHRVRfQkFTRV9UWVBFO1xyXG4gICAgcmV0dXJuIFdpZGdldEJhc2U7XHJcbn0oKSk7XHJcbmV4cG9ydHMuV2lkZ2V0QmFzZSA9IFdpZGdldEJhc2U7XHJcbmV4cG9ydHMuZGVmYXVsdCA9IFdpZGdldEJhc2U7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL1dpZGdldEJhc2UuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9XaWRnZXRCYXNlLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciBicm93c2VyU3BlY2lmaWNUcmFuc2l0aW9uRW5kRXZlbnROYW1lID0gJyc7XHJcbnZhciBicm93c2VyU3BlY2lmaWNBbmltYXRpb25FbmRFdmVudE5hbWUgPSAnJztcclxuZnVuY3Rpb24gZGV0ZXJtaW5lQnJvd3NlclN0eWxlTmFtZXMoZWxlbWVudCkge1xyXG4gICAgaWYgKCdXZWJraXRUcmFuc2l0aW9uJyBpbiBlbGVtZW50LnN0eWxlKSB7XHJcbiAgICAgICAgYnJvd3NlclNwZWNpZmljVHJhbnNpdGlvbkVuZEV2ZW50TmFtZSA9ICd3ZWJraXRUcmFuc2l0aW9uRW5kJztcclxuICAgICAgICBicm93c2VyU3BlY2lmaWNBbmltYXRpb25FbmRFdmVudE5hbWUgPSAnd2Via2l0QW5pbWF0aW9uRW5kJztcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKCd0cmFuc2l0aW9uJyBpbiBlbGVtZW50LnN0eWxlIHx8ICdNb3pUcmFuc2l0aW9uJyBpbiBlbGVtZW50LnN0eWxlKSB7XHJcbiAgICAgICAgYnJvd3NlclNwZWNpZmljVHJhbnNpdGlvbkVuZEV2ZW50TmFtZSA9ICd0cmFuc2l0aW9uZW5kJztcclxuICAgICAgICBicm93c2VyU3BlY2lmaWNBbmltYXRpb25FbmRFdmVudE5hbWUgPSAnYW5pbWF0aW9uZW5kJztcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignWW91ciBicm93c2VyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBpbml0aWFsaXplKGVsZW1lbnQpIHtcclxuICAgIGlmIChicm93c2VyU3BlY2lmaWNBbmltYXRpb25FbmRFdmVudE5hbWUgPT09ICcnKSB7XHJcbiAgICAgICAgZGV0ZXJtaW5lQnJvd3NlclN0eWxlTmFtZXMoZWxlbWVudCk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gcnVuQW5kQ2xlYW5VcChlbGVtZW50LCBzdGFydEFuaW1hdGlvbiwgZmluaXNoQW5pbWF0aW9uKSB7XHJcbiAgICBpbml0aWFsaXplKGVsZW1lbnQpO1xyXG4gICAgdmFyIGZpbmlzaGVkID0gZmFsc2U7XHJcbiAgICB2YXIgdHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAoIWZpbmlzaGVkKSB7XHJcbiAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGJyb3dzZXJTcGVjaWZpY1RyYW5zaXRpb25FbmRFdmVudE5hbWUsIHRyYW5zaXRpb25FbmQpO1xyXG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoYnJvd3NlclNwZWNpZmljQW5pbWF0aW9uRW5kRXZlbnROYW1lLCB0cmFuc2l0aW9uRW5kKTtcclxuICAgICAgICAgICAgZmluaXNoQW5pbWF0aW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHN0YXJ0QW5pbWF0aW9uKCk7XHJcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoYnJvd3NlclNwZWNpZmljQW5pbWF0aW9uRW5kRXZlbnROYW1lLCB0cmFuc2l0aW9uRW5kKTtcclxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihicm93c2VyU3BlY2lmaWNUcmFuc2l0aW9uRW5kRXZlbnROYW1lLCB0cmFuc2l0aW9uRW5kKTtcclxufVxyXG5mdW5jdGlvbiBleGl0KG5vZGUsIHByb3BlcnRpZXMsIGV4aXRBbmltYXRpb24sIHJlbW92ZU5vZGUpIHtcclxuICAgIHZhciBhY3RpdmVDbGFzcyA9IHByb3BlcnRpZXMuZXhpdEFuaW1hdGlvbkFjdGl2ZSB8fCBleGl0QW5pbWF0aW9uICsgXCItYWN0aXZlXCI7XHJcbiAgICBydW5BbmRDbGVhblVwKG5vZGUsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBub2RlLmNsYXNzTGlzdC5hZGQoZXhpdEFuaW1hdGlvbik7XHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKGFjdGl2ZUNsYXNzKTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZW1vdmVOb2RlKCk7XHJcbiAgICB9KTtcclxufVxyXG5mdW5jdGlvbiBlbnRlcihub2RlLCBwcm9wZXJ0aWVzLCBlbnRlckFuaW1hdGlvbikge1xyXG4gICAgdmFyIGFjdGl2ZUNsYXNzID0gcHJvcGVydGllcy5lbnRlckFuaW1hdGlvbkFjdGl2ZSB8fCBlbnRlckFuaW1hdGlvbiArIFwiLWFjdGl2ZVwiO1xyXG4gICAgcnVuQW5kQ2xlYW5VcChub2RlLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKGVudGVyQW5pbWF0aW9uKTtcclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBub2RlLmNsYXNzTGlzdC5hZGQoYWN0aXZlQ2xhc3MpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIG5vZGUuY2xhc3NMaXN0LnJlbW92ZShlbnRlckFuaW1hdGlvbik7XHJcbiAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKGFjdGl2ZUNsYXNzKTtcclxuICAgIH0pO1xyXG59XHJcbmV4cG9ydHMuZGVmYXVsdCA9IHtcclxuICAgIGVudGVyOiBlbnRlcixcclxuICAgIGV4aXQ6IGV4aXRcclxufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvYW5pbWF0aW9ucy9jc3NUcmFuc2l0aW9ucy5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2FuaW1hdGlvbnMvY3NzVHJhbnNpdGlvbnMuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XHJcbnZhciBTeW1ib2xfMSA9IHJlcXVpcmUoXCIuLi9zaGltL1N5bWJvbFwiKTtcclxuLyoqXHJcbiAqIFRoZSBzeW1ib2wgaWRlbnRpZmllciBmb3IgYSBXTm9kZSB0eXBlXHJcbiAqL1xyXG5leHBvcnRzLldOT0RFID0gU3ltYm9sXzEuZGVmYXVsdCgnSWRlbnRpZmllciBmb3IgYSBXTm9kZS4nKTtcclxuLyoqXHJcbiAqIFRoZSBzeW1ib2wgaWRlbnRpZmllciBmb3IgYSBWTm9kZSB0eXBlXHJcbiAqL1xyXG5leHBvcnRzLlZOT0RFID0gU3ltYm9sXzEuZGVmYXVsdCgnSWRlbnRpZmllciBmb3IgYSBWTm9kZS4nKTtcclxuLyoqXHJcbiAqIFRoZSBzeW1ib2wgaWRlbnRpZmllciBmb3IgYSBWTm9kZSB0eXBlIGNyZWF0ZWQgdXNpbmcgZG9tKClcclxuICovXHJcbmV4cG9ydHMuRE9NVk5PREUgPSBTeW1ib2xfMS5kZWZhdWx0KCdJZGVudGlmaWVyIGZvciBhIFZOb2RlIGNyZWF0ZWQgdXNpbmcgZXhpc3RpbmcgZG9tLicpO1xyXG4vKipcclxuICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBgRE5vZGVgIGlzIGEgYFdOb2RlYCB1c2luZyB0aGUgYHR5cGVgIHByb3BlcnR5XHJcbiAqL1xyXG5mdW5jdGlvbiBpc1dOb2RlKGNoaWxkKSB7XHJcbiAgICByZXR1cm4gQm9vbGVhbihjaGlsZCAmJiB0eXBlb2YgY2hpbGQgIT09ICdzdHJpbmcnICYmIGNoaWxkLnR5cGUgPT09IGV4cG9ydHMuV05PREUpO1xyXG59XHJcbmV4cG9ydHMuaXNXTm9kZSA9IGlzV05vZGU7XHJcbi8qKlxyXG4gKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIGBETm9kZWAgaXMgYSBgVk5vZGVgIHVzaW5nIHRoZSBgdHlwZWAgcHJvcGVydHlcclxuICovXHJcbmZ1bmN0aW9uIGlzVk5vZGUoY2hpbGQpIHtcclxuICAgIHJldHVybiBCb29sZWFuKGNoaWxkICYmIHR5cGVvZiBjaGlsZCAhPT0gJ3N0cmluZycgJiYgKGNoaWxkLnR5cGUgPT09IGV4cG9ydHMuVk5PREUgfHwgY2hpbGQudHlwZSA9PT0gZXhwb3J0cy5ET01WTk9ERSkpO1xyXG59XHJcbmV4cG9ydHMuaXNWTm9kZSA9IGlzVk5vZGU7XHJcbi8qKlxyXG4gKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIGBETm9kZWAgaXMgYSBgVk5vZGVgIGNyZWF0ZWQgd2l0aCBgZG9tKClgIHVzaW5nIHRoZSBgdHlwZWAgcHJvcGVydHlcclxuICovXHJcbmZ1bmN0aW9uIGlzRG9tVk5vZGUoY2hpbGQpIHtcclxuICAgIHJldHVybiBCb29sZWFuKGNoaWxkICYmIHR5cGVvZiBjaGlsZCAhPT0gJ3N0cmluZycgJiYgY2hpbGQudHlwZSA9PT0gZXhwb3J0cy5ET01WTk9ERSk7XHJcbn1cclxuZXhwb3J0cy5pc0RvbVZOb2RlID0gaXNEb21WTm9kZTtcclxuZnVuY3Rpb24gaXNFbGVtZW50Tm9kZSh2YWx1ZSkge1xyXG4gICAgcmV0dXJuICEhdmFsdWUudGFnTmFtZTtcclxufVxyXG5leHBvcnRzLmlzRWxlbWVudE5vZGUgPSBpc0VsZW1lbnROb2RlO1xyXG5mdW5jdGlvbiBkZWNvcmF0ZShkTm9kZXMsIG9wdGlvbnNPck1vZGlmaWVyLCBwcmVkaWNhdGUpIHtcclxuICAgIHZhciBzaGFsbG93ID0gZmFsc2U7XHJcbiAgICB2YXIgbW9kaWZpZXI7XHJcbiAgICBpZiAodHlwZW9mIG9wdGlvbnNPck1vZGlmaWVyID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgbW9kaWZpZXIgPSBvcHRpb25zT3JNb2RpZmllcjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIG1vZGlmaWVyID0gb3B0aW9uc09yTW9kaWZpZXIubW9kaWZpZXI7XHJcbiAgICAgICAgcHJlZGljYXRlID0gb3B0aW9uc09yTW9kaWZpZXIucHJlZGljYXRlO1xyXG4gICAgICAgIHNoYWxsb3cgPSBvcHRpb25zT3JNb2RpZmllci5zaGFsbG93IHx8IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdmFyIG5vZGVzID0gQXJyYXkuaXNBcnJheShkTm9kZXMpID8gdHNsaWJfMS5fX3NwcmVhZChkTm9kZXMpIDogW2ROb2Rlc107XHJcbiAgICBmdW5jdGlvbiBicmVha2VyKCkge1xyXG4gICAgICAgIG5vZGVzID0gW107XHJcbiAgICB9XHJcbiAgICB3aGlsZSAobm9kZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgdmFyIG5vZGUgPSBub2Rlcy5zaGlmdCgpO1xyXG4gICAgICAgIGlmIChub2RlKSB7XHJcbiAgICAgICAgICAgIGlmICghc2hhbGxvdyAmJiAoaXNXTm9kZShub2RlKSB8fCBpc1ZOb2RlKG5vZGUpKSAmJiBub2RlLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgICBub2RlcyA9IHRzbGliXzEuX19zcHJlYWQobm9kZXMsIG5vZGUuY2hpbGRyZW4pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghcHJlZGljYXRlIHx8IHByZWRpY2F0ZShub2RlKSkge1xyXG4gICAgICAgICAgICAgICAgbW9kaWZpZXIobm9kZSwgYnJlYWtlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZE5vZGVzO1xyXG59XHJcbmV4cG9ydHMuZGVjb3JhdGUgPSBkZWNvcmF0ZTtcclxuLyoqXHJcbiAqIFdyYXBwZXIgZnVuY3Rpb24gZm9yIGNhbGxzIHRvIGNyZWF0ZSBhIHdpZGdldC5cclxuICovXHJcbmZ1bmN0aW9uIHcod2lkZ2V0Q29uc3RydWN0b3IsIHByb3BlcnRpZXMsIGNoaWxkcmVuKSB7XHJcbiAgICBpZiAoY2hpbGRyZW4gPT09IHZvaWQgMCkgeyBjaGlsZHJlbiA9IFtdOyB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcclxuICAgICAgICB3aWRnZXRDb25zdHJ1Y3Rvcjogd2lkZ2V0Q29uc3RydWN0b3IsXHJcbiAgICAgICAgcHJvcGVydGllczogcHJvcGVydGllcyxcclxuICAgICAgICB0eXBlOiBleHBvcnRzLldOT0RFXHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydHMudyA9IHc7XHJcbmZ1bmN0aW9uIHYodGFnLCBwcm9wZXJ0aWVzT3JDaGlsZHJlbiwgY2hpbGRyZW4pIHtcclxuICAgIGlmIChwcm9wZXJ0aWVzT3JDaGlsZHJlbiA9PT0gdm9pZCAwKSB7IHByb3BlcnRpZXNPckNoaWxkcmVuID0ge307IH1cclxuICAgIGlmIChjaGlsZHJlbiA9PT0gdm9pZCAwKSB7IGNoaWxkcmVuID0gdW5kZWZpbmVkOyB9XHJcbiAgICB2YXIgcHJvcGVydGllcyA9IHByb3BlcnRpZXNPckNoaWxkcmVuO1xyXG4gICAgdmFyIGRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrO1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcGVydGllc09yQ2hpbGRyZW4pKSB7XHJcbiAgICAgICAgY2hpbGRyZW4gPSBwcm9wZXJ0aWVzT3JDaGlsZHJlbjtcclxuICAgICAgICBwcm9wZXJ0aWVzID0ge307XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHByb3BlcnRpZXMgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICBkZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayA9IHByb3BlcnRpZXM7XHJcbiAgICAgICAgcHJvcGVydGllcyA9IHt9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB0YWc6IHRhZyxcclxuICAgICAgICBkZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjazogZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2ssXHJcbiAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuLFxyXG4gICAgICAgIHByb3BlcnRpZXM6IHByb3BlcnRpZXMsXHJcbiAgICAgICAgdHlwZTogZXhwb3J0cy5WTk9ERVxyXG4gICAgfTtcclxufVxyXG5leHBvcnRzLnYgPSB2O1xyXG4vKipcclxuICogQ3JlYXRlIGEgVk5vZGUgZm9yIGFuIGV4aXN0aW5nIERPTSBOb2RlLlxyXG4gKi9cclxuZnVuY3Rpb24gZG9tKF9hLCBjaGlsZHJlbikge1xyXG4gICAgdmFyIG5vZGUgPSBfYS5ub2RlLCBfYiA9IF9hLmF0dHJzLCBhdHRycyA9IF9iID09PSB2b2lkIDAgPyB7fSA6IF9iLCBfYyA9IF9hLnByb3BzLCBwcm9wcyA9IF9jID09PSB2b2lkIDAgPyB7fSA6IF9jLCBfZCA9IF9hLm9uLCBvbiA9IF9kID09PSB2b2lkIDAgPyB7fSA6IF9kLCBfZSA9IF9hLmRpZmZUeXBlLCBkaWZmVHlwZSA9IF9lID09PSB2b2lkIDAgPyAnbm9uZScgOiBfZTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgdGFnOiBpc0VsZW1lbnROb2RlKG5vZGUpID8gbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgOiAnJyxcclxuICAgICAgICBwcm9wZXJ0aWVzOiBwcm9wcyxcclxuICAgICAgICBhdHRyaWJ1dGVzOiBhdHRycyxcclxuICAgICAgICBldmVudHM6IG9uLFxyXG4gICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcclxuICAgICAgICB0eXBlOiBleHBvcnRzLkRPTVZOT0RFLFxyXG4gICAgICAgIGRvbU5vZGU6IG5vZGUsXHJcbiAgICAgICAgdGV4dDogaXNFbGVtZW50Tm9kZShub2RlKSA/IHVuZGVmaW5lZCA6IG5vZGUuZGF0YSxcclxuICAgICAgICBkaWZmVHlwZTogZGlmZlR5cGVcclxuICAgIH07XHJcbn1cclxuZXhwb3J0cy5kb20gPSBkb207XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2QuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciBoYW5kbGVEZWNvcmF0b3JfMSA9IHJlcXVpcmUoXCIuL2hhbmRsZURlY29yYXRvclwiKTtcclxuZnVuY3Rpb24gYWZ0ZXJSZW5kZXIobWV0aG9kKSB7XHJcbiAgICByZXR1cm4gaGFuZGxlRGVjb3JhdG9yXzEuaGFuZGxlRGVjb3JhdG9yKGZ1bmN0aW9uICh0YXJnZXQsIHByb3BlcnR5S2V5KSB7XHJcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcignYWZ0ZXJSZW5kZXInLCBwcm9wZXJ0eUtleSA/IHRhcmdldFtwcm9wZXJ0eUtleV0gOiBtZXRob2QpO1xyXG4gICAgfSk7XHJcbn1cclxuZXhwb3J0cy5hZnRlclJlbmRlciA9IGFmdGVyUmVuZGVyO1xyXG5leHBvcnRzLmRlZmF1bHQgPSBhZnRlclJlbmRlcjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9hZnRlclJlbmRlci5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYWZ0ZXJSZW5kZXIuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxudmFyIGhhbmRsZURlY29yYXRvcl8xID0gcmVxdWlyZShcIi4vaGFuZGxlRGVjb3JhdG9yXCIpO1xyXG52YXIgYmVmb3JlUHJvcGVydGllc18xID0gcmVxdWlyZShcIi4vYmVmb3JlUHJvcGVydGllc1wiKTtcclxuZnVuY3Rpb24gYWx3YXlzUmVuZGVyKCkge1xyXG4gICAgcmV0dXJuIGhhbmRsZURlY29yYXRvcl8xLmhhbmRsZURlY29yYXRvcihmdW5jdGlvbiAodGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xyXG4gICAgICAgIGJlZm9yZVByb3BlcnRpZXNfMS5iZWZvcmVQcm9wZXJ0aWVzKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XHJcbiAgICAgICAgfSkodGFyZ2V0KTtcclxuICAgIH0pO1xyXG59XHJcbmV4cG9ydHMuYWx3YXlzUmVuZGVyID0gYWx3YXlzUmVuZGVyO1xyXG5leHBvcnRzLmRlZmF1bHQgPSBhbHdheXNSZW5kZXI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvYWx3YXlzUmVuZGVyLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9hbHdheXNSZW5kZXIuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxudmFyIGhhbmRsZURlY29yYXRvcl8xID0gcmVxdWlyZShcIi4vaGFuZGxlRGVjb3JhdG9yXCIpO1xyXG5mdW5jdGlvbiBiZWZvcmVQcm9wZXJ0aWVzKG1ldGhvZCkge1xyXG4gICAgcmV0dXJuIGhhbmRsZURlY29yYXRvcl8xLmhhbmRsZURlY29yYXRvcihmdW5jdGlvbiAodGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xyXG4gICAgICAgIHRhcmdldC5hZGREZWNvcmF0b3IoJ2JlZm9yZVByb3BlcnRpZXMnLCBwcm9wZXJ0eUtleSA/IHRhcmdldFtwcm9wZXJ0eUtleV0gOiBtZXRob2QpO1xyXG4gICAgfSk7XHJcbn1cclxuZXhwb3J0cy5iZWZvcmVQcm9wZXJ0aWVzID0gYmVmb3JlUHJvcGVydGllcztcclxuZXhwb3J0cy5kZWZhdWx0ID0gYmVmb3JlUHJvcGVydGllcztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9iZWZvcmVQcm9wZXJ0aWVzLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9iZWZvcmVQcm9wZXJ0aWVzLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciByZWdpc3RlckN1c3RvbUVsZW1lbnRfMSA9IHJlcXVpcmUoXCIuLi9yZWdpc3RlckN1c3RvbUVsZW1lbnRcIik7XHJcbnZhciBSZWdpc3RyeV8xID0gcmVxdWlyZShcIi4uL1JlZ2lzdHJ5XCIpO1xyXG4vKipcclxuICogVGhpcyBEZWNvcmF0b3IgaXMgcHJvdmlkZWQgcHJvcGVydGllcyB0aGF0IGRlZmluZSB0aGUgYmVoYXZpb3Igb2YgYSBjdXN0b20gZWxlbWVudCwgYW5kXHJcbiAqIHJlZ2lzdGVycyB0aGF0IGN1c3RvbSBlbGVtZW50LlxyXG4gKi9cclxuZnVuY3Rpb24gY3VzdG9tRWxlbWVudChfYSkge1xyXG4gICAgdmFyIHRhZyA9IF9hLnRhZywgX2IgPSBfYS5wcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzID0gX2IgPT09IHZvaWQgMCA/IFtdIDogX2IsIF9jID0gX2EuYXR0cmlidXRlcywgYXR0cmlidXRlcyA9IF9jID09PSB2b2lkIDAgPyBbXSA6IF9jLCBfZCA9IF9hLmV2ZW50cywgZXZlbnRzID0gX2QgPT09IHZvaWQgMCA/IFtdIDogX2QsIF9lID0gX2EuY2hpbGRUeXBlLCBjaGlsZFR5cGUgPSBfZSA9PT0gdm9pZCAwID8gcmVnaXN0ZXJDdXN0b21FbGVtZW50XzEuQ3VzdG9tRWxlbWVudENoaWxkVHlwZS5ET0pPIDogX2UsIF9mID0gX2EucmVnaXN0cnlGYWN0b3J5LCByZWdpc3RyeUZhY3RvcnkgPSBfZiA9PT0gdm9pZCAwID8gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFJlZ2lzdHJ5XzEuZGVmYXVsdCgpOyB9IDogX2Y7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkge1xyXG4gICAgICAgIHRhcmdldC5wcm90b3R5cGUuX19jdXN0b21FbGVtZW50RGVzY3JpcHRvciA9IHtcclxuICAgICAgICAgICAgdGFnTmFtZTogdGFnLFxyXG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzLFxyXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLFxyXG4gICAgICAgICAgICBldmVudHM6IGV2ZW50cyxcclxuICAgICAgICAgICAgY2hpbGRUeXBlOiBjaGlsZFR5cGUsXHJcbiAgICAgICAgICAgIHJlZ2lzdHJ5RmFjdG9yeTogcmVnaXN0cnlGYWN0b3J5XHJcbiAgICAgICAgfTtcclxuICAgIH07XHJcbn1cclxuZXhwb3J0cy5jdXN0b21FbGVtZW50ID0gY3VzdG9tRWxlbWVudDtcclxuZXhwb3J0cy5kZWZhdWx0ID0gY3VzdG9tRWxlbWVudDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9jdXN0b21FbGVtZW50LmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9jdXN0b21FbGVtZW50LmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciBoYW5kbGVEZWNvcmF0b3JfMSA9IHJlcXVpcmUoXCIuL2hhbmRsZURlY29yYXRvclwiKTtcclxudmFyIGRpZmZfMSA9IHJlcXVpcmUoXCIuLy4uL2RpZmZcIik7XHJcbi8qKlxyXG4gKiBEZWNvcmF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byByZWdpc3RlciBhIGZ1bmN0aW9uIGFzIGEgc3BlY2lmaWMgcHJvcGVydHkgZGlmZlxyXG4gKlxyXG4gKiBAcGFyYW0gcHJvcGVydHlOYW1lICBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb2Ygd2hpY2ggdGhlIGRpZmYgZnVuY3Rpb24gaXMgYXBwbGllZFxyXG4gKiBAcGFyYW0gZGlmZlR5cGUgICAgICBUaGUgZGlmZiB0eXBlLCBkZWZhdWx0IGlzIERpZmZUeXBlLkFVVE8uXHJcbiAqIEBwYXJhbSBkaWZmRnVuY3Rpb24gIEEgZGlmZiBmdW5jdGlvbiB0byBydW4gaWYgZGlmZlR5cGUgaWYgRGlmZlR5cGUuQ1VTVE9NXHJcbiAqL1xyXG5mdW5jdGlvbiBkaWZmUHJvcGVydHkocHJvcGVydHlOYW1lLCBkaWZmRnVuY3Rpb24sIHJlYWN0aW9uRnVuY3Rpb24pIHtcclxuICAgIGlmIChkaWZmRnVuY3Rpb24gPT09IHZvaWQgMCkgeyBkaWZmRnVuY3Rpb24gPSBkaWZmXzEuYXV0bzsgfVxyXG4gICAgcmV0dXJuIGhhbmRsZURlY29yYXRvcl8xLmhhbmRsZURlY29yYXRvcihmdW5jdGlvbiAodGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xyXG4gICAgICAgIHRhcmdldC5hZGREZWNvcmF0b3IoXCJkaWZmUHJvcGVydHk6XCIgKyBwcm9wZXJ0eU5hbWUsIGRpZmZGdW5jdGlvbi5iaW5kKG51bGwpKTtcclxuICAgICAgICB0YXJnZXQuYWRkRGVjb3JhdG9yKCdyZWdpc3RlcmVkRGlmZlByb3BlcnR5JywgcHJvcGVydHlOYW1lKTtcclxuICAgICAgICBpZiAocmVhY3Rpb25GdW5jdGlvbiB8fCBwcm9wZXJ0eUtleSkge1xyXG4gICAgICAgICAgICB0YXJnZXQuYWRkRGVjb3JhdG9yKCdkaWZmUmVhY3Rpb24nLCB7XHJcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcclxuICAgICAgICAgICAgICAgIHJlYWN0aW9uOiBwcm9wZXJ0eUtleSA/IHRhcmdldFtwcm9wZXJ0eUtleV0gOiByZWFjdGlvbkZ1bmN0aW9uXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59XHJcbmV4cG9ydHMuZGlmZlByb3BlcnR5ID0gZGlmZlByb3BlcnR5O1xyXG5leHBvcnRzLmRlZmF1bHQgPSBkaWZmUHJvcGVydHk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvZGlmZlByb3BlcnR5LmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9kaWZmUHJvcGVydHkuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuLyoqXHJcbiAqIEdlbmVyaWMgZGVjb3JhdG9yIGhhbmRsZXIgdG8gdGFrZSBjYXJlIG9mIHdoZXRoZXIgb3Igbm90IHRoZSBkZWNvcmF0b3Igd2FzIGNhbGxlZCBhdCB0aGUgY2xhc3MgbGV2ZWxcclxuICogb3IgdGhlIG1ldGhvZCBsZXZlbC5cclxuICpcclxuICogQHBhcmFtIGhhbmRsZXJcclxuICovXHJcbmZ1bmN0aW9uIGhhbmRsZURlY29yYXRvcihoYW5kbGVyKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICBoYW5kbGVyKHRhcmdldC5wcm90b3R5cGUsIHVuZGVmaW5lZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBoYW5kbGVyKHRhcmdldCwgcHJvcGVydHlLZXkpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuZXhwb3J0cy5oYW5kbGVEZWNvcmF0b3IgPSBoYW5kbGVEZWNvcmF0b3I7XHJcbmV4cG9ydHMuZGVmYXVsdCA9IGhhbmRsZURlY29yYXRvcjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9oYW5kbGVEZWNvcmF0b3IuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kZWNvcmF0b3JzL2hhbmRsZURlY29yYXRvci5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgV2Vha01hcF8xID0gcmVxdWlyZShcIi4uLy4uL3NoaW0vV2Vha01hcFwiKTtcclxudmFyIGhhbmRsZURlY29yYXRvcl8xID0gcmVxdWlyZShcIi4vaGFuZGxlRGVjb3JhdG9yXCIpO1xyXG52YXIgYmVmb3JlUHJvcGVydGllc18xID0gcmVxdWlyZShcIi4vYmVmb3JlUHJvcGVydGllc1wiKTtcclxuLyoqXHJcbiAqIE1hcCBvZiBpbnN0YW5jZXMgYWdhaW5zdCByZWdpc3RlcmVkIGluamVjdG9ycy5cclxuICovXHJcbnZhciByZWdpc3RlcmVkSW5qZWN0b3JzTWFwID0gbmV3IFdlYWtNYXBfMS5kZWZhdWx0KCk7XHJcbi8qKlxyXG4gKiBEZWNvcmF0b3IgcmV0cmlldmVzIGFuIGluamVjdG9yIGZyb20gYW4gYXZhaWxhYmxlIHJlZ2lzdHJ5IHVzaW5nIHRoZSBuYW1lIGFuZFxyXG4gKiBjYWxscyB0aGUgYGdldFByb3BlcnRpZXNgIGZ1bmN0aW9uIHdpdGggdGhlIHBheWxvYWQgZnJvbSB0aGUgaW5qZWN0b3JcclxuICogYW5kIGN1cnJlbnQgcHJvcGVydGllcyB3aXRoIHRoZSB0aGUgaW5qZWN0ZWQgcHJvcGVydGllcyByZXR1cm5lZC5cclxuICpcclxuICogQHBhcmFtIEluamVjdENvbmZpZyB0aGUgaW5qZWN0IGNvbmZpZ3VyYXRpb25cclxuICovXHJcbmZ1bmN0aW9uIGluamVjdChfYSkge1xyXG4gICAgdmFyIG5hbWUgPSBfYS5uYW1lLCBnZXRQcm9wZXJ0aWVzID0gX2EuZ2V0UHJvcGVydGllcztcclxuICAgIHJldHVybiBoYW5kbGVEZWNvcmF0b3JfMS5oYW5kbGVEZWNvcmF0b3IoZnVuY3Rpb24gKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcclxuICAgICAgICBiZWZvcmVQcm9wZXJ0aWVzXzEuYmVmb3JlUHJvcGVydGllcyhmdW5jdGlvbiAocHJvcGVydGllcykge1xyXG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgICAgICB2YXIgaW5qZWN0b3JJdGVtID0gdGhpcy5yZWdpc3RyeS5nZXRJbmplY3RvcihuYW1lKTtcclxuICAgICAgICAgICAgaWYgKGluamVjdG9ySXRlbSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGluamVjdG9yID0gaW5qZWN0b3JJdGVtLmluamVjdG9yLCBpbnZhbGlkYXRvciA9IGluamVjdG9ySXRlbS5pbnZhbGlkYXRvcjtcclxuICAgICAgICAgICAgICAgIHZhciByZWdpc3RlcmVkSW5qZWN0b3JzID0gcmVnaXN0ZXJlZEluamVjdG9yc01hcC5nZXQodGhpcykgfHwgW107XHJcbiAgICAgICAgICAgICAgICBpZiAocmVnaXN0ZXJlZEluamVjdG9ycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICByZWdpc3RlcmVkSW5qZWN0b3JzTWFwLnNldCh0aGlzLCByZWdpc3RlcmVkSW5qZWN0b3JzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChyZWdpc3RlcmVkSW5qZWN0b3JzLmluZGV4T2YoaW5qZWN0b3JJdGVtKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm93bihpbnZhbGlkYXRvci5vbignaW52YWxpZGF0ZScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuaW52YWxpZGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICByZWdpc3RlcmVkSW5qZWN0b3JzLnB1c2goaW5qZWN0b3JJdGVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0aWVzKGluamVjdG9yKCksIHByb3BlcnRpZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkodGFyZ2V0KTtcclxuICAgIH0pO1xyXG59XHJcbmV4cG9ydHMuaW5qZWN0ID0gaW5qZWN0O1xyXG5leHBvcnRzLmRlZmF1bHQgPSBpbmplY3Q7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RlY29yYXRvcnMvaW5qZWN0LmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGVjb3JhdG9ycy9pbmplY3QuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxudmFyIFJlZ2lzdHJ5XzEgPSByZXF1aXJlKFwiLi9SZWdpc3RyeVwiKTtcclxuZnVuY3Rpb24gaXNPYmplY3RPckFycmF5KHZhbHVlKSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSk7XHJcbn1cclxuZnVuY3Rpb24gYWx3YXlzKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGNoYW5nZWQ6IHRydWUsXHJcbiAgICAgICAgdmFsdWU6IG5ld1Byb3BlcnR5XHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydHMuYWx3YXlzID0gYWx3YXlzO1xyXG5mdW5jdGlvbiBpZ25vcmUocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgY2hhbmdlZDogZmFsc2UsXHJcbiAgICAgICAgdmFsdWU6IG5ld1Byb3BlcnR5XHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydHMuaWdub3JlID0gaWdub3JlO1xyXG5mdW5jdGlvbiByZWZlcmVuY2UocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgY2hhbmdlZDogcHJldmlvdXNQcm9wZXJ0eSAhPT0gbmV3UHJvcGVydHksXHJcbiAgICAgICAgdmFsdWU6IG5ld1Byb3BlcnR5XHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydHMucmVmZXJlbmNlID0gcmVmZXJlbmNlO1xyXG5mdW5jdGlvbiBzaGFsbG93KHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KSB7XHJcbiAgICB2YXIgY2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgdmFyIHZhbGlkT2xkUHJvcGVydHkgPSBwcmV2aW91c1Byb3BlcnR5ICYmIGlzT2JqZWN0T3JBcnJheShwcmV2aW91c1Byb3BlcnR5KTtcclxuICAgIHZhciB2YWxpZE5ld1Byb3BlcnR5ID0gbmV3UHJvcGVydHkgJiYgaXNPYmplY3RPckFycmF5KG5ld1Byb3BlcnR5KTtcclxuICAgIGlmICghdmFsaWRPbGRQcm9wZXJ0eSB8fCAhdmFsaWROZXdQcm9wZXJ0eSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGNoYW5nZWQ6IHRydWUsXHJcbiAgICAgICAgICAgIHZhbHVlOiBuZXdQcm9wZXJ0eVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICB2YXIgcHJldmlvdXNLZXlzID0gT2JqZWN0LmtleXMocHJldmlvdXNQcm9wZXJ0eSk7XHJcbiAgICB2YXIgbmV3S2V5cyA9IE9iamVjdC5rZXlzKG5ld1Byb3BlcnR5KTtcclxuICAgIGlmIChwcmV2aW91c0tleXMubGVuZ3RoICE9PSBuZXdLZXlzLmxlbmd0aCkge1xyXG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgY2hhbmdlZCA9IG5ld0tleXMuc29tZShmdW5jdGlvbiAoa2V5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXdQcm9wZXJ0eVtrZXldICE9PSBwcmV2aW91c1Byb3BlcnR5W2tleV07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGNoYW5nZWQ6IGNoYW5nZWQsXHJcbiAgICAgICAgdmFsdWU6IG5ld1Byb3BlcnR5XHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydHMuc2hhbGxvdyA9IHNoYWxsb3c7XHJcbmZ1bmN0aW9uIGF1dG8ocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpIHtcclxuICAgIHZhciByZXN1bHQ7XHJcbiAgICBpZiAodHlwZW9mIG5ld1Byb3BlcnR5ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgaWYgKG5ld1Byb3BlcnR5Ll90eXBlID09PSBSZWdpc3RyeV8xLldJREdFVF9CQVNFX1RZUEUpIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gcmVmZXJlbmNlKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IGlnbm9yZShwcmV2aW91c1Byb3BlcnR5LCBuZXdQcm9wZXJ0eSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoaXNPYmplY3RPckFycmF5KG5ld1Byb3BlcnR5KSkge1xyXG4gICAgICAgIHJlc3VsdCA9IHNoYWxsb3cocHJldmlvdXNQcm9wZXJ0eSwgbmV3UHJvcGVydHkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgcmVzdWx0ID0gcmVmZXJlbmNlKHByZXZpb3VzUHJvcGVydHksIG5ld1Byb3BlcnR5KTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuZXhwb3J0cy5hdXRvID0gYXV0bztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvZGlmZi5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL2RpZmYuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XHJcbnZhciBsYW5nXzEgPSByZXF1aXJlKFwiLi4vLi4vY29yZS9sYW5nXCIpO1xyXG52YXIgY3NzVHJhbnNpdGlvbnNfMSA9IHJlcXVpcmUoXCIuLi9hbmltYXRpb25zL2Nzc1RyYW5zaXRpb25zXCIpO1xyXG52YXIgYWZ0ZXJSZW5kZXJfMSA9IHJlcXVpcmUoXCIuLy4uL2RlY29yYXRvcnMvYWZ0ZXJSZW5kZXJcIik7XHJcbnZhciBkXzEgPSByZXF1aXJlKFwiLi8uLi9kXCIpO1xyXG52YXIgdmRvbV8xID0gcmVxdWlyZShcIi4vLi4vdmRvbVwiKTtcclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgdGhlIGF0dGFjaCBzdGF0ZSBvZiB0aGUgcHJvamVjdG9yXHJcbiAqL1xyXG52YXIgUHJvamVjdG9yQXR0YWNoU3RhdGU7XHJcbihmdW5jdGlvbiAoUHJvamVjdG9yQXR0YWNoU3RhdGUpIHtcclxuICAgIFByb2plY3RvckF0dGFjaFN0YXRlW1Byb2plY3RvckF0dGFjaFN0YXRlW1wiQXR0YWNoZWRcIl0gPSAxXSA9IFwiQXR0YWNoZWRcIjtcclxuICAgIFByb2plY3RvckF0dGFjaFN0YXRlW1Byb2plY3RvckF0dGFjaFN0YXRlW1wiRGV0YWNoZWRcIl0gPSAyXSA9IFwiRGV0YWNoZWRcIjtcclxufSkoUHJvamVjdG9yQXR0YWNoU3RhdGUgPSBleHBvcnRzLlByb2plY3RvckF0dGFjaFN0YXRlIHx8IChleHBvcnRzLlByb2plY3RvckF0dGFjaFN0YXRlID0ge30pKTtcclxuLyoqXHJcbiAqIEF0dGFjaCB0eXBlIGZvciB0aGUgcHJvamVjdG9yXHJcbiAqL1xyXG52YXIgQXR0YWNoVHlwZTtcclxuKGZ1bmN0aW9uIChBdHRhY2hUeXBlKSB7XHJcbiAgICBBdHRhY2hUeXBlW0F0dGFjaFR5cGVbXCJBcHBlbmRcIl0gPSAxXSA9IFwiQXBwZW5kXCI7XHJcbiAgICBBdHRhY2hUeXBlW0F0dGFjaFR5cGVbXCJNZXJnZVwiXSA9IDJdID0gXCJNZXJnZVwiO1xyXG59KShBdHRhY2hUeXBlID0gZXhwb3J0cy5BdHRhY2hUeXBlIHx8IChleHBvcnRzLkF0dGFjaFR5cGUgPSB7fSkpO1xyXG5mdW5jdGlvbiBQcm9qZWN0b3JNaXhpbihCYXNlKSB7XHJcbiAgICB2YXIgUHJvamVjdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xyXG4gICAgICAgIHRzbGliXzEuX19leHRlbmRzKFByb2plY3RvciwgX3N1cGVyKTtcclxuICAgICAgICBmdW5jdGlvbiBQcm9qZWN0b3IoKSB7XHJcbiAgICAgICAgICAgIHZhciBhcmdzID0gW107XHJcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmFwcGx5KHRoaXMsIHRzbGliXzEuX19zcHJlYWQoYXJncykpIHx8IHRoaXM7XHJcbiAgICAgICAgICAgIF90aGlzLl9yb290ID0gZG9jdW1lbnQuYm9keTtcclxuICAgICAgICAgICAgX3RoaXMuX2FzeW5jID0gdHJ1ZTtcclxuICAgICAgICAgICAgX3RoaXMuX3Byb2plY3RvclByb3BlcnRpZXMgPSB7fTtcclxuICAgICAgICAgICAgX3RoaXMuX3Byb2plY3Rpb25PcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbnM6IGNzc1RyYW5zaXRpb25zXzEuZGVmYXVsdFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBfdGhpcy5yb290ID0gZG9jdW1lbnQuYm9keTtcclxuICAgICAgICAgICAgX3RoaXMucHJvamVjdG9yU3RhdGUgPSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5EZXRhY2hlZDtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBQcm9qZWN0b3IucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIChyb290KSB7XHJcbiAgICAgICAgICAgIHZhciBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogQXR0YWNoVHlwZS5BcHBlbmQsXHJcbiAgICAgICAgICAgICAgICByb290OiByb290XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdHRhY2gob3B0aW9ucyk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBQcm9qZWN0b3IucHJvdG90eXBlLm1lcmdlID0gZnVuY3Rpb24gKHJvb3QpIHtcclxuICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBBdHRhY2hUeXBlLk1lcmdlLFxyXG4gICAgICAgICAgICAgICAgcm9vdDogcm9vdFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXR0YWNoKG9wdGlvbnMpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFByb2plY3Rvci5wcm90b3R5cGUsIFwicm9vdFwiLCB7XHJcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3Q7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHJvb3QpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb2plY3RvclN0YXRlID09PSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5BdHRhY2hlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJvamVjdG9yIGFscmVhZHkgYXR0YWNoZWQsIGNhbm5vdCBjaGFuZ2Ugcm9vdCBlbGVtZW50Jyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yb290ID0gcm9vdDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFByb2plY3Rvci5wcm90b3R5cGUsIFwiYXN5bmNcIiwge1xyXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hc3luYztcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoYXN5bmMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb2plY3RvclN0YXRlID09PSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5BdHRhY2hlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJvamVjdG9yIGFscmVhZHkgYXR0YWNoZWQsIGNhbm5vdCBjaGFuZ2UgYXN5bmMgbW9kZScpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fYXN5bmMgPSBhc3luYztcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgUHJvamVjdG9yLnByb3RvdHlwZS5zYW5kYm94ID0gZnVuY3Rpb24gKGRvYykge1xyXG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgICAgICBpZiAoZG9jID09PSB2b2lkIDApIHsgZG9jID0gZG9jdW1lbnQ7IH1cclxuICAgICAgICAgICAgaWYgKHRoaXMucHJvamVjdG9yU3RhdGUgPT09IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2plY3RvciBhbHJlYWR5IGF0dGFjaGVkLCBjYW5ub3QgY3JlYXRlIHNhbmRib3gnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9hc3luYyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2YXIgcHJldmlvdXNSb290ID0gdGhpcy5yb290O1xyXG4gICAgICAgICAgICAvKiBmcmVlIHVwIHRoZSBkb2N1bWVudCBmcmFnbWVudCBmb3IgR0MgKi9cclxuICAgICAgICAgICAgdGhpcy5vd24oe1xyXG4gICAgICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9yb290ID0gcHJldmlvdXNSb290O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5fYXR0YWNoKHtcclxuICAgICAgICAgICAgICAgIC8qIERvY3VtZW50RnJhZ21lbnQgaXMgbm90IGFzc2lnbmFibGUgdG8gRWxlbWVudCwgYnV0IHByb3ZpZGVzIGV2ZXJ5dGhpbmcgbmVlZGVkIHRvIHdvcmsgKi9cclxuICAgICAgICAgICAgICAgIHJvb3Q6IGRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBBdHRhY2hUeXBlLkFwcGVuZFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIFByb2plY3Rvci5wcm90b3R5cGUuc2V0Q2hpbGRyZW4gPSBmdW5jdGlvbiAoY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgdGhpcy5fX3NldENoaWxkcmVuX18oY2hpbGRyZW4pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgUHJvamVjdG9yLnByb3RvdHlwZS5zZXRQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKHByb3BlcnRpZXMpIHtcclxuICAgICAgICAgICAgdGhpcy5fX3NldFByb3BlcnRpZXNfXyhwcm9wZXJ0aWVzKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIFByb2plY3Rvci5wcm90b3R5cGUuX19zZXRQcm9wZXJ0aWVzX18gPSBmdW5jdGlvbiAocHJvcGVydGllcykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fcHJvamVjdG9yUHJvcGVydGllcyAmJiB0aGlzLl9wcm9qZWN0b3JQcm9wZXJ0aWVzLnJlZ2lzdHJ5ICE9PSBwcm9wZXJ0aWVzLnJlZ2lzdHJ5KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcHJvamVjdG9yUHJvcGVydGllcy5yZWdpc3RyeSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2plY3RvclByb3BlcnRpZXMucmVnaXN0cnkuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3Byb2plY3RvclByb3BlcnRpZXMgPSBsYW5nXzEuYXNzaWduKHt9LCBwcm9wZXJ0aWVzKTtcclxuICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fX3NldENvcmVQcm9wZXJ0aWVzX18uY2FsbCh0aGlzLCB7IGJpbmQ6IHRoaXMsIGJhc2VSZWdpc3RyeTogcHJvcGVydGllcy5yZWdpc3RyeSB9KTtcclxuICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fX3NldFByb3BlcnRpZXNfXy5jYWxsKHRoaXMsIHByb3BlcnRpZXMpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgUHJvamVjdG9yLnByb3RvdHlwZS50b0h0bWwgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnByb2plY3RvclN0YXRlICE9PSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5BdHRhY2hlZCB8fCAhdGhpcy5fcHJvamVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9qZWN0b3IgaXMgbm90IGF0dGFjaGVkLCBjYW5ub3QgcmV0dXJuIGFuIEhUTUwgc3RyaW5nIG9mIHByb2plY3Rpb24uJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2plY3Rpb24uZG9tTm9kZS5jaGlsZE5vZGVzWzBdLm91dGVySFRNTDtcclxuICAgICAgICB9O1xyXG4gICAgICAgIFByb2plY3Rvci5wcm90b3R5cGUuYWZ0ZXJSZW5kZXIgPSBmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHZhciBub2RlID0gcmVzdWx0O1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgfHwgcmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBub2RlID0gZF8xLnYoJ3NwYW4nLCB7fSwgW3Jlc3VsdF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgUHJvamVjdG9yLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIFByb2plY3Rvci5wcm90b3R5cGUuX2F0dGFjaCA9IGZ1bmN0aW9uIChfYSkge1xyXG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgICAgICB2YXIgdHlwZSA9IF9hLnR5cGUsIHJvb3QgPSBfYS5yb290O1xyXG4gICAgICAgICAgICBpZiAocm9vdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yb290ID0gcm9vdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5fYXR0YWNoSGFuZGxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYXR0YWNoSGFuZGxlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucHJvamVjdG9yU3RhdGUgPSBQcm9qZWN0b3JBdHRhY2hTdGF0ZS5BdHRhY2hlZDtcclxuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IHtcclxuICAgICAgICAgICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMucHJvamVjdG9yU3RhdGUgPT09IFByb2plY3RvckF0dGFjaFN0YXRlLkF0dGFjaGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLl9wcm9qZWN0aW9uID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5wcm9qZWN0b3JTdGF0ZSA9IFByb2plY3RvckF0dGFjaFN0YXRlLkRldGFjaGVkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5vd24oaGFuZGxlKTtcclxuICAgICAgICAgICAgdGhpcy5fYXR0YWNoSGFuZGxlID0gaGFuZGxlO1xyXG4gICAgICAgICAgICB0aGlzLl9wcm9qZWN0aW9uT3B0aW9ucyA9IHRzbGliXzEuX19hc3NpZ24oe30sIHRoaXMuX3Byb2plY3Rpb25PcHRpb25zLCB7IHN5bmM6ICF0aGlzLl9hc3luYyB9KTtcclxuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIEF0dGFjaFR5cGUuQXBwZW5kOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rpb24gPSB2ZG9tXzEuZG9tLmFwcGVuZCh0aGlzLnJvb3QsIHRoaXMsIHRoaXMuX3Byb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgQXR0YWNoVHlwZS5NZXJnZTpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm9qZWN0aW9uID0gdmRvbV8xLmRvbS5tZXJnZSh0aGlzLnJvb3QsIHRoaXMsIHRoaXMuX3Byb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXR0YWNoSGFuZGxlO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdHNsaWJfMS5fX2RlY29yYXRlKFtcclxuICAgICAgICAgICAgYWZ0ZXJSZW5kZXJfMS5hZnRlclJlbmRlcigpXHJcbiAgICAgICAgXSwgUHJvamVjdG9yLnByb3RvdHlwZSwgXCJhZnRlclJlbmRlclwiLCBudWxsKTtcclxuICAgICAgICByZXR1cm4gUHJvamVjdG9yO1xyXG4gICAgfShCYXNlKSk7XHJcbiAgICByZXR1cm4gUHJvamVjdG9yO1xyXG59XHJcbmV4cG9ydHMuUHJvamVjdG9yTWl4aW4gPSBQcm9qZWN0b3JNaXhpbjtcclxuZXhwb3J0cy5kZWZhdWx0ID0gUHJvamVjdG9yTWl4aW47XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL21peGlucy9Qcm9qZWN0b3IuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9taXhpbnMvUHJvamVjdG9yLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xyXG52YXIgSW5qZWN0b3JfMSA9IHJlcXVpcmUoXCIuLy4uL0luamVjdG9yXCIpO1xyXG52YXIgaW5qZWN0XzEgPSByZXF1aXJlKFwiLi8uLi9kZWNvcmF0b3JzL2luamVjdFwiKTtcclxudmFyIGhhbmRsZURlY29yYXRvcl8xID0gcmVxdWlyZShcIi4vLi4vZGVjb3JhdG9ycy9oYW5kbGVEZWNvcmF0b3JcIik7XHJcbnZhciBkaWZmUHJvcGVydHlfMSA9IHJlcXVpcmUoXCIuLy4uL2RlY29yYXRvcnMvZGlmZlByb3BlcnR5XCIpO1xyXG52YXIgZGlmZl8xID0gcmVxdWlyZShcIi4vLi4vZGlmZlwiKTtcclxudmFyIFRIRU1FX0tFWSA9ICcgX2tleSc7XHJcbmV4cG9ydHMuSU5KRUNURURfVEhFTUVfS0VZID0gU3ltYm9sKCd0aGVtZScpO1xyXG4vKipcclxuICogRGVjb3JhdG9yIGZvciBiYXNlIGNzcyBjbGFzc2VzXHJcbiAqL1xyXG5mdW5jdGlvbiB0aGVtZSh0aGVtZSkge1xyXG4gICAgcmV0dXJuIGhhbmRsZURlY29yYXRvcl8xLmhhbmRsZURlY29yYXRvcihmdW5jdGlvbiAodGFyZ2V0KSB7XHJcbiAgICAgICAgdGFyZ2V0LmFkZERlY29yYXRvcignYmFzZVRoZW1lQ2xhc3NlcycsIHRoZW1lKTtcclxuICAgIH0pO1xyXG59XHJcbmV4cG9ydHMudGhlbWUgPSB0aGVtZTtcclxuLyoqXHJcbiAqIENyZWF0ZXMgYSByZXZlcnNlIGxvb2t1cCBmb3IgdGhlIGNsYXNzZXMgcGFzc2VkIGluIHZpYSB0aGUgYHRoZW1lYCBmdW5jdGlvbi5cclxuICpcclxuICogQHBhcmFtIGNsYXNzZXMgVGhlIGJhc2VDbGFzc2VzIG9iamVjdFxyXG4gKiBAcmVxdWlyZXNcclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZVRoZW1lQ2xhc3Nlc0xvb2t1cChjbGFzc2VzKSB7XHJcbiAgICByZXR1cm4gY2xhc3Nlcy5yZWR1Y2UoZnVuY3Rpb24gKGN1cnJlbnRDbGFzc05hbWVzLCBiYXNlQ2xhc3MpIHtcclxuICAgICAgICBPYmplY3Qua2V5cyhiYXNlQ2xhc3MpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgICAgICBjdXJyZW50Q2xhc3NOYW1lc1tiYXNlQ2xhc3Nba2V5XV0gPSBrZXk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzc05hbWVzO1xyXG4gICAgfSwge30pO1xyXG59XHJcbi8qKlxyXG4gKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0aGF0IGlzIGdpdmVuIGEgdGhlbWUgYW5kIGFuIG9wdGlvbmFsIHJlZ2lzdHJ5LCB0aGUgdGhlbWVcclxuICogaW5qZWN0b3IgaXMgZGVmaW5lZCBhZ2FpbnN0IHRoZSByZWdpc3RyeSwgcmV0dXJuaW5nIHRoZSB0aGVtZS5cclxuICpcclxuICogQHBhcmFtIHRoZW1lIHRoZSB0aGVtZSB0byBzZXRcclxuICogQHBhcmFtIHRoZW1lUmVnaXN0cnkgcmVnaXN0cnkgdG8gZGVmaW5lIHRoZSB0aGVtZSBpbmplY3RvciBhZ2FpbnN0LiBEZWZhdWx0c1xyXG4gKiB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5XHJcbiAqXHJcbiAqIEByZXR1cm5zIHRoZSB0aGVtZSBpbmplY3RvciB1c2VkIHRvIHNldCB0aGUgdGhlbWVcclxuICovXHJcbmZ1bmN0aW9uIHJlZ2lzdGVyVGhlbWVJbmplY3Rvcih0aGVtZSwgdGhlbWVSZWdpc3RyeSkge1xyXG4gICAgdmFyIHRoZW1lSW5qZWN0b3IgPSBuZXcgSW5qZWN0b3JfMS5JbmplY3Rvcih0aGVtZSk7XHJcbiAgICB0aGVtZVJlZ2lzdHJ5LmRlZmluZUluamVjdG9yKGV4cG9ydHMuSU5KRUNURURfVEhFTUVfS0VZLCBmdW5jdGlvbiAoaW52YWxpZGF0b3IpIHtcclxuICAgICAgICB0aGVtZUluamVjdG9yLnNldEludmFsaWRhdG9yKGludmFsaWRhdG9yKTtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhlbWVJbmplY3Rvci5nZXQoKTsgfTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRoZW1lSW5qZWN0b3I7XHJcbn1cclxuZXhwb3J0cy5yZWdpc3RlclRoZW1lSW5qZWN0b3IgPSByZWdpc3RlclRoZW1lSW5qZWN0b3I7XHJcbi8qKlxyXG4gKiBGdW5jdGlvbiB0aGF0IHJldHVybnMgYSBjbGFzcyBkZWNvcmF0ZWQgd2l0aCB3aXRoIFRoZW1lZCBmdW5jdGlvbmFsaXR5XHJcbiAqL1xyXG5mdW5jdGlvbiBUaGVtZWRNaXhpbihCYXNlKSB7XHJcbiAgICB2YXIgVGhlbWVkID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xyXG4gICAgICAgIHRzbGliXzEuX19leHRlbmRzKFRoZW1lZCwgX3N1cGVyKTtcclxuICAgICAgICBmdW5jdGlvbiBUaGVtZWQoKSB7XHJcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogUmVnaXN0ZXJlZCBiYXNlIHRoZW1lIGtleXNcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIF90aGlzLl9yZWdpc3RlcmVkQmFzZVRoZW1lS2V5cyA9IFtdO1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogSW5kaWNhdGVzIGlmIGNsYXNzZXMgbWV0YSBkYXRhIG5lZWQgdG8gYmUgY2FsY3VsYXRlZC5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIF90aGlzLl9yZWNhbGN1bGF0ZUNsYXNzZXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogTG9hZGVkIHRoZW1lXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBfdGhpcy5fdGhlbWUgPSB7fTtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBUaGVtZWQucHJvdG90eXBlLnRoZW1lID0gZnVuY3Rpb24gKGNsYXNzZXMpIHtcclxuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3JlY2FsY3VsYXRlQ2xhc3Nlcykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVjYWxjdWxhdGVUaGVtZUNsYXNzZXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjbGFzc2VzKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzZXMubWFwKGZ1bmN0aW9uIChjbGFzc05hbWUpIHsgcmV0dXJuIF90aGlzLl9nZXRUaGVtZUNsYXNzKGNsYXNzTmFtZSk7IH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRUaGVtZUNsYXNzKGNsYXNzZXMpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRnVuY3Rpb24gZmlyZWQgd2hlbiBgdGhlbWVgIG9yIGBleHRyYUNsYXNzZXNgIGFyZSBjaGFuZ2VkLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIFRoZW1lZC5wcm90b3R5cGUub25Qcm9wZXJ0aWVzQ2hhbmdlZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVjYWxjdWxhdGVDbGFzc2VzID0gdHJ1ZTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIFRoZW1lZC5wcm90b3R5cGUuX2dldFRoZW1lQ2xhc3MgPSBmdW5jdGlvbiAoY2xhc3NOYW1lKSB7XHJcbiAgICAgICAgICAgIGlmIChjbGFzc05hbWUgPT09IHVuZGVmaW5lZCB8fCBjbGFzc05hbWUgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGV4dHJhQ2xhc3NlcyA9IHRoaXMucHJvcGVydGllcy5leHRyYUNsYXNzZXMgfHwge307XHJcbiAgICAgICAgICAgIHZhciB0aGVtZUNsYXNzTmFtZSA9IHRoaXMuX2Jhc2VUaGVtZUNsYXNzZXNSZXZlcnNlTG9va3VwW2NsYXNzTmFtZV07XHJcbiAgICAgICAgICAgIHZhciByZXN1bHRDbGFzc05hbWVzID0gW107XHJcbiAgICAgICAgICAgIGlmICghdGhlbWVDbGFzc05hbWUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIkNsYXNzIG5hbWU6ICdcIiArIGNsYXNzTmFtZSArIFwiJyBub3QgZm91bmQgaW4gdGhlbWVcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZXh0cmFDbGFzc2VzW3RoZW1lQ2xhc3NOYW1lXSkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0Q2xhc3NOYW1lcy5wdXNoKGV4dHJhQ2xhc3Nlc1t0aGVtZUNsYXNzTmFtZV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl90aGVtZVt0aGVtZUNsYXNzTmFtZV0pIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdENsYXNzTmFtZXMucHVzaCh0aGlzLl90aGVtZVt0aGVtZUNsYXNzTmFtZV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0Q2xhc3NOYW1lcy5wdXNoKHRoaXMuX3JlZ2lzdGVyZWRCYXNlVGhlbWVbdGhlbWVDbGFzc05hbWVdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0Q2xhc3NOYW1lcy5qb2luKCcgJyk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBUaGVtZWQucHJvdG90eXBlLl9yZWNhbGN1bGF0ZVRoZW1lQ2xhc3NlcyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICAgICAgdmFyIF9hID0gdGhpcy5wcm9wZXJ0aWVzLnRoZW1lLCB0aGVtZSA9IF9hID09PSB2b2lkIDAgPyB7fSA6IF9hO1xyXG4gICAgICAgICAgICB2YXIgYmFzZVRoZW1lcyA9IHRoaXMuZ2V0RGVjb3JhdG9yKCdiYXNlVGhlbWVDbGFzc2VzJyk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fcmVnaXN0ZXJlZEJhc2VUaGVtZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZEJhc2VUaGVtZSA9IGJhc2VUaGVtZXMucmVkdWNlKGZ1bmN0aW9uIChmaW5hbEJhc2VUaGVtZSwgYmFzZVRoZW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9hID0gVEhFTUVfS0VZLCBrZXkgPSBiYXNlVGhlbWVbX2FdLCBjbGFzc2VzID0gdHNsaWJfMS5fX3Jlc3QoYmFzZVRoZW1lLCBbdHlwZW9mIF9hID09PSBcInN5bWJvbFwiID8gX2EgOiBfYSArIFwiXCJdKTtcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fcmVnaXN0ZXJlZEJhc2VUaGVtZUtleXMucHVzaChrZXkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0c2xpYl8xLl9fYXNzaWduKHt9LCBmaW5hbEJhc2VUaGVtZSwgY2xhc3Nlcyk7XHJcbiAgICAgICAgICAgICAgICB9LCB7fSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9iYXNlVGhlbWVDbGFzc2VzUmV2ZXJzZUxvb2t1cCA9IGNyZWF0ZVRoZW1lQ2xhc3Nlc0xvb2t1cChiYXNlVGhlbWVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl90aGVtZSA9IHRoaXMuX3JlZ2lzdGVyZWRCYXNlVGhlbWVLZXlzLnJlZHVjZShmdW5jdGlvbiAoYmFzZVRoZW1lLCB0aGVtZUtleSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRzbGliXzEuX19hc3NpZ24oe30sIGJhc2VUaGVtZSwgdGhlbWVbdGhlbWVLZXldKTtcclxuICAgICAgICAgICAgfSwge30pO1xyXG4gICAgICAgICAgICB0aGlzLl9yZWNhbGN1bGF0ZUNsYXNzZXMgPSBmYWxzZTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRzbGliXzEuX19kZWNvcmF0ZShbXHJcbiAgICAgICAgICAgIGRpZmZQcm9wZXJ0eV8xLmRpZmZQcm9wZXJ0eSgndGhlbWUnLCBkaWZmXzEuc2hhbGxvdyksXHJcbiAgICAgICAgICAgIGRpZmZQcm9wZXJ0eV8xLmRpZmZQcm9wZXJ0eSgnZXh0cmFDbGFzc2VzJywgZGlmZl8xLnNoYWxsb3cpXHJcbiAgICAgICAgXSwgVGhlbWVkLnByb3RvdHlwZSwgXCJvblByb3BlcnRpZXNDaGFuZ2VkXCIsIG51bGwpO1xyXG4gICAgICAgIFRoZW1lZCA9IHRzbGliXzEuX19kZWNvcmF0ZShbXHJcbiAgICAgICAgICAgIGluamVjdF8xLmluamVjdCh7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBleHBvcnRzLklOSkVDVEVEX1RIRU1FX0tFWSxcclxuICAgICAgICAgICAgICAgIGdldFByb3BlcnRpZXM6IGZ1bmN0aW9uICh0aGVtZSwgcHJvcGVydGllcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghcHJvcGVydGllcy50aGVtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB0aGVtZTogdGhlbWUgfTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIF0sIFRoZW1lZCk7XHJcbiAgICAgICAgcmV0dXJuIFRoZW1lZDtcclxuICAgIH0oQmFzZSkpO1xyXG4gICAgcmV0dXJuIFRoZW1lZDtcclxufVxyXG5leHBvcnRzLlRoZW1lZE1peGluID0gVGhlbWVkTWl4aW47XHJcbmV4cG9ydHMuZGVmYXVsdCA9IFRoZW1lZE1peGluO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9taXhpbnMvVGhlbWVkLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvbWl4aW5zL1RoZW1lZC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcclxudmFyIFdpZGdldEJhc2VfMSA9IHJlcXVpcmUoXCIuL1dpZGdldEJhc2VcIik7XHJcbnZhciBQcm9qZWN0b3JfMSA9IHJlcXVpcmUoXCIuL21peGlucy9Qcm9qZWN0b3JcIik7XHJcbnZhciBhcnJheV8xID0gcmVxdWlyZShcIi4uL3NoaW0vYXJyYXlcIik7XHJcbnZhciBkXzEgPSByZXF1aXJlKFwiLi9kXCIpO1xyXG52YXIgZ2xvYmFsXzEgPSByZXF1aXJlKFwiLi4vc2hpbS9nbG9iYWxcIik7XHJcbnZhciBUaGVtZWRfMSA9IHJlcXVpcmUoXCIuL21peGlucy9UaGVtZWRcIik7XHJcbnZhciBhbHdheXNSZW5kZXJfMSA9IHJlcXVpcmUoXCIuL2RlY29yYXRvcnMvYWx3YXlzUmVuZGVyXCIpO1xyXG52YXIgQ3VzdG9tRWxlbWVudENoaWxkVHlwZTtcclxuKGZ1bmN0aW9uIChDdXN0b21FbGVtZW50Q2hpbGRUeXBlKSB7XHJcbiAgICBDdXN0b21FbGVtZW50Q2hpbGRUeXBlW1wiRE9KT1wiXSA9IFwiRE9KT1wiO1xyXG4gICAgQ3VzdG9tRWxlbWVudENoaWxkVHlwZVtcIk5PREVcIl0gPSBcIk5PREVcIjtcclxuICAgIEN1c3RvbUVsZW1lbnRDaGlsZFR5cGVbXCJURVhUXCJdID0gXCJURVhUXCI7XHJcbn0pKEN1c3RvbUVsZW1lbnRDaGlsZFR5cGUgPSBleHBvcnRzLkN1c3RvbUVsZW1lbnRDaGlsZFR5cGUgfHwgKGV4cG9ydHMuQ3VzdG9tRWxlbWVudENoaWxkVHlwZSA9IHt9KSk7XHJcbmZ1bmN0aW9uIERvbVRvV2lkZ2V0V3JhcHBlcihkb21Ob2RlKSB7XHJcbiAgICB2YXIgRG9tVG9XaWRnZXRXcmFwcGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xyXG4gICAgICAgIHRzbGliXzEuX19leHRlbmRzKERvbVRvV2lkZ2V0V3JhcHBlciwgX3N1cGVyKTtcclxuICAgICAgICBmdW5jdGlvbiBEb21Ub1dpZGdldFdyYXBwZXIoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgRG9tVG9XaWRnZXRXcmFwcGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gT2JqZWN0LmtleXModGhpcy5wcm9wZXJ0aWVzKS5yZWR1Y2UoZnVuY3Rpb24gKHByb3BzLCBrZXkpIHtcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IF90aGlzLnByb3BlcnRpZXNba2V5XTtcclxuICAgICAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZignb24nKSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9IFwiX19cIiArIGtleTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHByb3BzW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwcm9wcztcclxuICAgICAgICAgICAgfSwge30pO1xyXG4gICAgICAgICAgICByZXR1cm4gZF8xLmRvbSh7IG5vZGU6IGRvbU5vZGUsIHByb3BzOiBwcm9wZXJ0aWVzLCBkaWZmVHlwZTogJ2RvbScgfSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9tVG9XaWRnZXRXcmFwcGVyLCBcImRvbU5vZGVcIiwge1xyXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkb21Ob2RlO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgICAgICB9KTtcclxuICAgICAgICBEb21Ub1dpZGdldFdyYXBwZXIgPSB0c2xpYl8xLl9fZGVjb3JhdGUoW1xyXG4gICAgICAgICAgICBhbHdheXNSZW5kZXJfMS5hbHdheXNSZW5kZXIoKVxyXG4gICAgICAgIF0sIERvbVRvV2lkZ2V0V3JhcHBlcik7XHJcbiAgICAgICAgcmV0dXJuIERvbVRvV2lkZ2V0V3JhcHBlcjtcclxuICAgIH0oV2lkZ2V0QmFzZV8xLldpZGdldEJhc2UpKTtcclxuICAgIHJldHVybiBEb21Ub1dpZGdldFdyYXBwZXI7XHJcbn1cclxuZXhwb3J0cy5Eb21Ub1dpZGdldFdyYXBwZXIgPSBEb21Ub1dpZGdldFdyYXBwZXI7XHJcbmZ1bmN0aW9uIGNyZWF0ZShkZXNjcmlwdG9yLCBXaWRnZXRDb25zdHJ1Y3Rvcikge1xyXG4gICAgdmFyIGF0dHJpYnV0ZXMgPSBkZXNjcmlwdG9yLmF0dHJpYnV0ZXMsIGNoaWxkVHlwZSA9IGRlc2NyaXB0b3IuY2hpbGRUeXBlLCByZWdpc3RyeUZhY3RvcnkgPSBkZXNjcmlwdG9yLnJlZ2lzdHJ5RmFjdG9yeTtcclxuICAgIHZhciBhdHRyaWJ1dGVNYXAgPSB7fTtcclxuICAgIGF0dHJpYnV0ZXMuZm9yRWFjaChmdW5jdGlvbiAocHJvcGVydHlOYW1lKSB7XHJcbiAgICAgICAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eU5hbWUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBhdHRyaWJ1dGVNYXBbYXR0cmlidXRlTmFtZV0gPSBwcm9wZXJ0eU5hbWU7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XHJcbiAgICAgICAgdHNsaWJfMS5fX2V4dGVuZHMoY2xhc3NfMSwgX3N1cGVyKTtcclxuICAgICAgICBmdW5jdGlvbiBjbGFzc18xKCkge1xyXG4gICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcclxuICAgICAgICAgICAgX3RoaXMuX3Byb3BlcnRpZXMgPSB7fTtcclxuICAgICAgICAgICAgX3RoaXMuX2NoaWxkcmVuID0gW107XHJcbiAgICAgICAgICAgIF90aGlzLl9ldmVudFByb3BlcnRpZXMgPSB7fTtcclxuICAgICAgICAgICAgX3RoaXMuX2luaXRpYWxpc2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgY2xhc3NfMS5wcm90b3R5cGUuY29ubmVjdGVkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9pbml0aWFsaXNlZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBkb21Qcm9wZXJ0aWVzID0ge307XHJcbiAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVzID0gZGVzY3JpcHRvci5hdHRyaWJ1dGVzLCBwcm9wZXJ0aWVzID0gZGVzY3JpcHRvci5wcm9wZXJ0aWVzLCBldmVudHMgPSBkZXNjcmlwdG9yLmV2ZW50cztcclxuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHRzbGliXzEuX19hc3NpZ24oe30sIHRoaXMuX3Byb3BlcnRpZXMsIHRoaXMuX2F0dHJpYnV0ZXNUb1Byb3BlcnRpZXMoYXR0cmlidXRlcykpO1xyXG4gICAgICAgICAgICB0c2xpYl8xLl9fc3ByZWFkKGF0dHJpYnV0ZXMsIHByb3BlcnRpZXMpLmZvckVhY2goZnVuY3Rpb24gKHByb3BlcnR5TmFtZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gX3RoaXNbcHJvcGVydHlOYW1lXTtcclxuICAgICAgICAgICAgICAgIHZhciBmaWx0ZXJlZFByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZS5yZXBsYWNlKC9eb24vLCAnX18nKTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlcmVkUHJvcGVydHlOYW1lICE9PSBwcm9wZXJ0eU5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBkb21Qcm9wZXJ0aWVzW2ZpbHRlcmVkUHJvcGVydHlOYW1lXSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5fZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIF90aGlzLl9zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkb21Qcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5fZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsgfSxcclxuICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gX3RoaXMuX3NldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUpOyB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKHByb3BlcnR5TmFtZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGV2ZW50TmFtZSA9IHByb3BlcnR5TmFtZS5yZXBsYWNlKC9eb24vLCAnJykudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgIHZhciBmaWx0ZXJlZFByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZS5yZXBsYWNlKC9eb24vLCAnX19vbicpO1xyXG4gICAgICAgICAgICAgICAgZG9tUHJvcGVydGllc1tmaWx0ZXJlZFByb3BlcnR5TmFtZV0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5fZ2V0RXZlbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOyB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBfdGhpcy5fc2V0RXZlbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKTsgfVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9ldmVudFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBldmVudENhbGxiYWNrID0gX3RoaXMuX2dldEV2ZW50UHJvcGVydHkocHJvcGVydHlOYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV2ZW50Q2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRDYWxsYmFjay5hcHBseSh2b2lkIDAsIHRzbGliXzEuX19zcHJlYWQoYXJncykpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlczogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDogYXJnc1xyXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCBkb21Qcm9wZXJ0aWVzKTtcclxuICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gY2hpbGRUeXBlID09PSBDdXN0b21FbGVtZW50Q2hpbGRUeXBlLlRFWFQgPyB0aGlzLmNoaWxkTm9kZXMgOiB0aGlzLmNoaWxkcmVuO1xyXG4gICAgICAgICAgICBhcnJheV8xLmZyb20oY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkVHlwZSA9PT0gQ3VzdG9tRWxlbWVudENoaWxkVHlwZS5ET0pPKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGROb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2Rvam8tY2UtcmVuZGVyJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuX3JlbmRlcigpOyB9KTtcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZE5vZGUuYWRkRXZlbnRMaXN0ZW5lcignZG9qby1jZS1jb25uZWN0ZWQnLCBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5fcmVuZGVyKCk7IH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9jaGlsZHJlbi5wdXNoKERvbVRvV2lkZ2V0V3JhcHBlcihjaGlsZE5vZGUpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9jaGlsZHJlbi5wdXNoKGRfMS5kb20oeyBub2RlOiBjaGlsZE5vZGUsIGRpZmZUeXBlOiAnZG9tJyB9KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2Rvam8tY2UtY29ubmVjdGVkJywgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIF90aGlzLl9jaGlsZENvbm5lY3RlZChlKTsgfSk7XHJcbiAgICAgICAgICAgIHZhciB3aWRnZXRQcm9wZXJ0aWVzID0gdGhpcy5fcHJvcGVydGllcztcclxuICAgICAgICAgICAgdmFyIHJlbmRlckNoaWxkcmVuID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuX19jaGlsZHJlbl9fKCk7IH07XHJcbiAgICAgICAgICAgIHZhciBXcmFwcGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xyXG4gICAgICAgICAgICAgICAgdHNsaWJfMS5fX2V4dGVuZHMoY2xhc3NfMiwgX3N1cGVyKTtcclxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNsYXNzXzIoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2xhc3NfMi5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkXzEudyhXaWRnZXRDb25zdHJ1Y3Rvciwgd2lkZ2V0UHJvcGVydGllcywgcmVuZGVyQ2hpbGRyZW4oKSk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzXzI7XHJcbiAgICAgICAgICAgIH0oV2lkZ2V0QmFzZV8xLldpZGdldEJhc2UpKTtcclxuICAgICAgICAgICAgdmFyIHJlZ2lzdHJ5ID0gcmVnaXN0cnlGYWN0b3J5KCk7XHJcbiAgICAgICAgICAgIHZhciB0aGVtZUNvbnRleHQgPSBUaGVtZWRfMS5yZWdpc3RlclRoZW1lSW5qZWN0b3IodGhpcy5fZ2V0VGhlbWUoKSwgcmVnaXN0cnkpO1xyXG4gICAgICAgICAgICBnbG9iYWxfMS5kZWZhdWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2Rvam8tdGhlbWUtc2V0JywgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhlbWVDb250ZXh0LnNldChfdGhpcy5fZ2V0VGhlbWUoKSk7IH0pO1xyXG4gICAgICAgICAgICB2YXIgUHJvamVjdG9yID0gUHJvamVjdG9yXzEuUHJvamVjdG9yTWl4aW4oV3JhcHBlcik7XHJcbiAgICAgICAgICAgIHRoaXMuX3Byb2plY3RvciA9IG5ldyBQcm9qZWN0b3IoKTtcclxuICAgICAgICAgICAgdGhpcy5fcHJvamVjdG9yLnNldFByb3BlcnRpZXMoeyByZWdpc3RyeTogcmVnaXN0cnkgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rvci5hcHBlbmQodGhpcyk7XHJcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxpc2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnZG9qby1jZS1jb25uZWN0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgZGV0YWlsOiB0aGlzXHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNsYXNzXzEucHJvdG90eXBlLl9nZXRUaGVtZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKGdsb2JhbF8xLmRlZmF1bHQgJiYgZ2xvYmFsXzEuZGVmYXVsdC5kb2pvY2UgJiYgZ2xvYmFsXzEuZGVmYXVsdC5kb2pvY2UudGhlbWUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBnbG9iYWxfMS5kZWZhdWx0LmRvam9jZS50aGVtZXNbZ2xvYmFsXzEuZGVmYXVsdC5kb2pvY2UudGhlbWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICBjbGFzc18xLnByb3RvdHlwZS5fY2hpbGRDb25uZWN0ZWQgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgICAgICB2YXIgbm9kZSA9IGUuZGV0YWlsO1xyXG4gICAgICAgICAgICBpZiAobm9kZS5wYXJlbnROb2RlID09PSB0aGlzKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZXhpc3RzID0gdGhpcy5fY2hpbGRyZW4uc29tZShmdW5jdGlvbiAoY2hpbGQpIHsgcmV0dXJuIGNoaWxkLmRvbU5vZGUgPT09IG5vZGU7IH0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFleGlzdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2Rvam8tY2UtcmVuZGVyJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuX3JlbmRlcigpOyB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGlsZHJlbi5wdXNoKERvbVRvV2lkZ2V0V3JhcHBlcihub2RlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIGNsYXNzXzEucHJvdG90eXBlLl9yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9wcm9qZWN0b3IpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2plY3Rvci5pbnZhbGlkYXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdkb2pvLWNlLXJlbmRlcicsIHtcclxuICAgICAgICAgICAgICAgICAgICBidWJibGVzOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHRoaXNcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY2xhc3NfMS5wcm90b3R5cGUuX19wcm9wZXJ0aWVzX18gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl9wcm9wZXJ0aWVzLCB0aGlzLl9ldmVudFByb3BlcnRpZXMpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgY2xhc3NfMS5wcm90b3R5cGUuX19jaGlsZHJlbl9fID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoY2hpbGRUeXBlID09PSBDdXN0b21FbGVtZW50Q2hpbGRUeXBlLkRPSk8pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jaGlsZHJlbi5maWx0ZXIoZnVuY3Rpb24gKENoaWxkKSB7IHJldHVybiBDaGlsZC5kb21Ob2RlLmlzV2lkZ2V0OyB9KS5tYXAoZnVuY3Rpb24gKENoaWxkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRvbU5vZGUgPSBDaGlsZC5kb21Ob2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkXzEudyhDaGlsZCwgdHNsaWJfMS5fX2Fzc2lnbih7fSwgZG9tTm9kZS5fX3Byb3BlcnRpZXNfXygpKSwgdHNsaWJfMS5fX3NwcmVhZChkb21Ob2RlLl9fY2hpbGRyZW5fXygpKSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jaGlsZHJlbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY2xhc3NfMS5wcm90b3R5cGUuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24gKG5hbWUsIG9sZFZhbHVlLCB2YWx1ZSkge1xyXG4gICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gYXR0cmlidXRlTWFwW25hbWVdO1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNsYXNzXzEucHJvdG90eXBlLl9zZXRFdmVudFByb3BlcnR5ID0gZnVuY3Rpb24gKHByb3BlcnR5TmFtZSwgdmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fZXZlbnRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNsYXNzXzEucHJvdG90eXBlLl9nZXRFdmVudFByb3BlcnR5ID0gZnVuY3Rpb24gKHByb3BlcnR5TmFtZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XHJcbiAgICAgICAgfTtcclxuICAgICAgICBjbGFzc18xLnByb3RvdHlwZS5fc2V0UHJvcGVydHkgPSBmdW5jdGlvbiAocHJvcGVydHlOYW1lLCB2YWx1ZSkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZVtXaWRnZXRCYXNlXzEubm9CaW5kXSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcigpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgY2xhc3NfMS5wcm90b3R5cGUuX2dldFByb3BlcnR5ID0gZnVuY3Rpb24gKHByb3BlcnR5TmFtZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgY2xhc3NfMS5wcm90b3R5cGUuX2F0dHJpYnV0ZXNUb1Byb3BlcnRpZXMgPSBmdW5jdGlvbiAoYXR0cmlidXRlcykge1xyXG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlcy5yZWR1Y2UoZnVuY3Rpb24gKHByb3BlcnRpZXMsIHByb3BlcnR5TmFtZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eU5hbWUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IF90aGlzLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7XHJcbiAgICAgICAgICAgIH0sIHt9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGFzc18xLCBcIm9ic2VydmVkQXR0cmlidXRlc1wiLCB7XHJcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGF0dHJpYnV0ZU1hcCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGFzc18xLnByb3RvdHlwZSwgXCJpc1dpZGdldFwiLCB7XHJcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBjbGFzc18xO1xyXG4gICAgfShIVE1MRWxlbWVudCkpO1xyXG59XHJcbmV4cG9ydHMuY3JlYXRlID0gY3JlYXRlO1xyXG5mdW5jdGlvbiByZWdpc3RlcihXaWRnZXRDb25zdHJ1Y3Rvcikge1xyXG4gICAgdmFyIGRlc2NyaXB0b3IgPSBXaWRnZXRDb25zdHJ1Y3Rvci5wcm90b3R5cGUgJiYgV2lkZ2V0Q29uc3RydWN0b3IucHJvdG90eXBlLl9fY3VzdG9tRWxlbWVudERlc2NyaXB0b3I7XHJcbiAgICBpZiAoIWRlc2NyaXB0b3IpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgZGVzY3JpcHRvciBmb3IgQ3VzdG9tIEVsZW1lbnQsIGhhdmUgeW91IGFkZGVkIHRoZSBAY3VzdG9tRWxlbWVudCBkZWNvcmF0b3IgdG8geW91ciBXaWRnZXQ/Jyk7XHJcbiAgICB9XHJcbiAgICBnbG9iYWxfMS5kZWZhdWx0LmN1c3RvbUVsZW1lbnRzLmRlZmluZShkZXNjcmlwdG9yLnRhZ05hbWUsIGNyZWF0ZShkZXNjcmlwdG9yLCBXaWRnZXRDb25zdHJ1Y3RvcikpO1xyXG59XHJcbmV4cG9ydHMucmVnaXN0ZXIgPSByZWdpc3RlcjtcclxuZXhwb3J0cy5kZWZhdWx0ID0gcmVnaXN0ZXI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL3JlZ2lzdGVyQ3VzdG9tRWxlbWVudC5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvQGRvam8vZnJhbWV3b3JrL3dpZGdldC1jb3JlL3JlZ2lzdGVyQ3VzdG9tRWxlbWVudC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcclxudmFyIGdsb2JhbF8xID0gcmVxdWlyZShcIi4uL3NoaW0vZ2xvYmFsXCIpO1xyXG52YXIgYXJyYXlfMSA9IHJlcXVpcmUoXCIuLi9zaGltL2FycmF5XCIpO1xyXG52YXIgZF8xID0gcmVxdWlyZShcIi4vZFwiKTtcclxudmFyIFJlZ2lzdHJ5XzEgPSByZXF1aXJlKFwiLi9SZWdpc3RyeVwiKTtcclxudmFyIFdlYWtNYXBfMSA9IHJlcXVpcmUoXCIuLi9zaGltL1dlYWtNYXBcIik7XHJcbnZhciBOQU1FU1BBQ0VfVzMgPSAnaHR0cDovL3d3dy53My5vcmcvJztcclxudmFyIE5BTUVTUEFDRV9TVkcgPSBOQU1FU1BBQ0VfVzMgKyAnMjAwMC9zdmcnO1xyXG52YXIgTkFNRVNQQUNFX1hMSU5LID0gTkFNRVNQQUNFX1czICsgJzE5OTkveGxpbmsnO1xyXG52YXIgZW1wdHlBcnJheSA9IFtdO1xyXG52YXIgbm9kZU9wZXJhdGlvbnMgPSBbJ2ZvY3VzJywgJ2JsdXInLCAnc2Nyb2xsSW50b1ZpZXcnLCAnY2xpY2snXTtcclxuZXhwb3J0cy53aWRnZXRJbnN0YW5jZU1hcCA9IG5ldyBXZWFrTWFwXzEuZGVmYXVsdCgpO1xyXG52YXIgaW5zdGFuY2VNYXAgPSBuZXcgV2Vha01hcF8xLmRlZmF1bHQoKTtcclxudmFyIG5leHRTaWJsaW5nTWFwID0gbmV3IFdlYWtNYXBfMS5kZWZhdWx0KCk7XHJcbnZhciBwcm9qZWN0b3JTdGF0ZU1hcCA9IG5ldyBXZWFrTWFwXzEuZGVmYXVsdCgpO1xyXG5mdW5jdGlvbiBzYW1lKGRub2RlMSwgZG5vZGUyKSB7XHJcbiAgICBpZiAoZF8xLmlzVk5vZGUoZG5vZGUxKSAmJiBkXzEuaXNWTm9kZShkbm9kZTIpKSB7XHJcbiAgICAgICAgaWYgKGRfMS5pc0RvbVZOb2RlKGRub2RlMSkgfHwgZF8xLmlzRG9tVk5vZGUoZG5vZGUyKSkge1xyXG4gICAgICAgICAgICBpZiAoZG5vZGUxLmRvbU5vZGUgIT09IGRub2RlMi5kb21Ob2RlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRub2RlMS50YWcgIT09IGRub2RlMi50YWcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZG5vZGUxLnByb3BlcnRpZXMua2V5ICE9PSBkbm9kZTIucHJvcGVydGllcy5rZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGRfMS5pc1dOb2RlKGRub2RlMSkgJiYgZF8xLmlzV05vZGUoZG5vZGUyKSkge1xyXG4gICAgICAgIGlmIChkbm9kZTEuaW5zdGFuY2UgPT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZG5vZGUyLndpZGdldENvbnN0cnVjdG9yID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkbm9kZTEud2lkZ2V0Q29uc3RydWN0b3IgIT09IGRub2RlMi53aWRnZXRDb25zdHJ1Y3Rvcikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkbm9kZTEucHJvcGVydGllcy5rZXkgIT09IGRub2RlMi5wcm9wZXJ0aWVzLmtleSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59XHJcbnZhciBtaXNzaW5nVHJhbnNpdGlvbiA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignUHJvdmlkZSBhIHRyYW5zaXRpb25zIG9iamVjdCB0byB0aGUgcHJvamVjdGlvbk9wdGlvbnMgdG8gZG8gYW5pbWF0aW9ucycpO1xyXG59O1xyXG5mdW5jdGlvbiBnZXRQcm9qZWN0aW9uT3B0aW9ucyhwcm9qZWN0b3JPcHRpb25zLCBwcm9qZWN0b3JJbnN0YW5jZSkge1xyXG4gICAgdmFyIGRlZmF1bHRzID0ge1xyXG4gICAgICAgIG5hbWVzcGFjZTogdW5kZWZpbmVkLFxyXG4gICAgICAgIHN0eWxlQXBwbHllcjogZnVuY3Rpb24gKGRvbU5vZGUsIHN0eWxlTmFtZSwgdmFsdWUpIHtcclxuICAgICAgICAgICAgZG9tTm9kZS5zdHlsZVtzdHlsZU5hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgfSxcclxuICAgICAgICB0cmFuc2l0aW9uczoge1xyXG4gICAgICAgICAgICBlbnRlcjogbWlzc2luZ1RyYW5zaXRpb24sXHJcbiAgICAgICAgICAgIGV4aXQ6IG1pc3NpbmdUcmFuc2l0aW9uXHJcbiAgICAgICAgfSxcclxuICAgICAgICBkZXB0aDogMCxcclxuICAgICAgICBtZXJnZTogZmFsc2UsXHJcbiAgICAgICAgc3luYzogZmFsc2UsXHJcbiAgICAgICAgcHJvamVjdG9ySW5zdGFuY2U6IHByb2plY3Rvckluc3RhbmNlXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHRzbGliXzEuX19hc3NpZ24oe30sIGRlZmF1bHRzLCBwcm9qZWN0b3JPcHRpb25zKTtcclxufVxyXG5mdW5jdGlvbiBjaGVja1N0eWxlVmFsdWUoc3R5bGVWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBzdHlsZVZhbHVlICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU3R5bGUgdmFsdWVzIG11c3QgYmUgc3RyaW5ncycpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHVwZGF0ZUV2ZW50KGRvbU5vZGUsIGV2ZW50TmFtZSwgY3VycmVudFZhbHVlLCBwcm9qZWN0aW9uT3B0aW9ucywgYmluZCwgcHJldmlvdXNWYWx1ZSkge1xyXG4gICAgdmFyIHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgIHZhciBldmVudE1hcCA9IHByb2plY3RvclN0YXRlLm5vZGVNYXAuZ2V0KGRvbU5vZGUpIHx8IG5ldyBXZWFrTWFwXzEuZGVmYXVsdCgpO1xyXG4gICAgaWYgKHByZXZpb3VzVmFsdWUpIHtcclxuICAgICAgICB2YXIgcHJldmlvdXNFdmVudCA9IGV2ZW50TWFwLmdldChwcmV2aW91c1ZhbHVlKTtcclxuICAgICAgICBkb21Ob2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBwcmV2aW91c0V2ZW50KTtcclxuICAgIH1cclxuICAgIHZhciBjYWxsYmFjayA9IGN1cnJlbnRWYWx1ZS5iaW5kKGJpbmQpO1xyXG4gICAgaWYgKGV2ZW50TmFtZSA9PT0gJ2lucHV0Jykge1xyXG4gICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKGV2dCkge1xyXG4gICAgICAgICAgICBjdXJyZW50VmFsdWUuY2FsbCh0aGlzLCBldnQpO1xyXG4gICAgICAgICAgICBldnQudGFyZ2V0WydvbmlucHV0LXZhbHVlJ10gPSBldnQudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIH0uYmluZChiaW5kKTtcclxuICAgIH1cclxuICAgIGRvbU5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrKTtcclxuICAgIGV2ZW50TWFwLnNldChjdXJyZW50VmFsdWUsIGNhbGxiYWNrKTtcclxuICAgIHByb2plY3RvclN0YXRlLm5vZGVNYXAuc2V0KGRvbU5vZGUsIGV2ZW50TWFwKTtcclxufVxyXG5mdW5jdGlvbiBhZGRDbGFzc2VzKGRvbU5vZGUsIGNsYXNzZXMpIHtcclxuICAgIGlmIChjbGFzc2VzKSB7XHJcbiAgICAgICAgdmFyIGNsYXNzTmFtZXMgPSBjbGFzc2VzLnNwbGl0KCcgJyk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGFzc05hbWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGRvbU5vZGUuY2xhc3NMaXN0LmFkZChjbGFzc05hbWVzW2ldKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gcmVtb3ZlQ2xhc3Nlcyhkb21Ob2RlLCBjbGFzc2VzKSB7XHJcbiAgICBpZiAoY2xhc3Nlcykge1xyXG4gICAgICAgIHZhciBjbGFzc05hbWVzID0gY2xhc3Nlcy5zcGxpdCgnICcpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBkb21Ob2RlLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lc1tpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGJ1aWxkUHJldmlvdXNQcm9wZXJ0aWVzKGRvbU5vZGUsIHByZXZpb3VzLCBjdXJyZW50KSB7XHJcbiAgICB2YXIgZGlmZlR5cGUgPSBjdXJyZW50LmRpZmZUeXBlLCBwcm9wZXJ0aWVzID0gY3VycmVudC5wcm9wZXJ0aWVzLCBhdHRyaWJ1dGVzID0gY3VycmVudC5hdHRyaWJ1dGVzO1xyXG4gICAgaWYgKCFkaWZmVHlwZSB8fCBkaWZmVHlwZSA9PT0gJ3Zkb20nKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgcHJvcGVydGllczogcHJldmlvdXMucHJvcGVydGllcywgYXR0cmlidXRlczogcHJldmlvdXMuYXR0cmlidXRlcywgZXZlbnRzOiBwcmV2aW91cy5ldmVudHMgfTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGRpZmZUeXBlID09PSAnbm9uZScpIHtcclxuICAgICAgICByZXR1cm4geyBwcm9wZXJ0aWVzOiB7fSwgYXR0cmlidXRlczogcHJldmlvdXMuYXR0cmlidXRlcyA/IHt9IDogdW5kZWZpbmVkLCBldmVudHM6IHByZXZpb3VzLmV2ZW50cyB9O1xyXG4gICAgfVxyXG4gICAgdmFyIG5ld1Byb3BlcnRpZXMgPSB7XHJcbiAgICAgICAgcHJvcGVydGllczoge31cclxuICAgIH07XHJcbiAgICBpZiAoYXR0cmlidXRlcykge1xyXG4gICAgICAgIG5ld1Byb3BlcnRpZXMuYXR0cmlidXRlcyA9IHt9O1xyXG4gICAgICAgIG5ld1Byb3BlcnRpZXMuZXZlbnRzID0gcHJldmlvdXMuZXZlbnRzO1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHByb3BlcnRpZXMpLmZvckVhY2goZnVuY3Rpb24gKHByb3BOYW1lKSB7XHJcbiAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wTmFtZV0gPSBkb21Ob2RlW3Byb3BOYW1lXTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyTmFtZSkge1xyXG4gICAgICAgICAgICBuZXdQcm9wZXJ0aWVzLmF0dHJpYnV0ZXNbYXR0ck5hbWVdID0gZG9tTm9kZS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBuZXdQcm9wZXJ0aWVzO1xyXG4gICAgfVxyXG4gICAgbmV3UHJvcGVydGllcy5wcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMocHJvcGVydGllcykucmVkdWNlKGZ1bmN0aW9uIChwcm9wcywgcHJvcGVydHkpIHtcclxuICAgICAgICBwcm9wc1twcm9wZXJ0eV0gPSBkb21Ob2RlLmdldEF0dHJpYnV0ZShwcm9wZXJ0eSkgfHwgZG9tTm9kZVtwcm9wZXJ0eV07XHJcbiAgICAgICAgcmV0dXJuIHByb3BzO1xyXG4gICAgfSwge30pO1xyXG4gICAgcmV0dXJuIG5ld1Byb3BlcnRpZXM7XHJcbn1cclxuZnVuY3Rpb24gbm9kZU9wZXJhdGlvbihwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcmV2aW91c1ZhbHVlLCBkb21Ob2RlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgdmFyIHJlc3VsdDtcclxuICAgIGlmICh0eXBlb2YgcHJvcFZhbHVlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gcHJvcFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICByZXN1bHQgPSBwcm9wVmFsdWUgJiYgIXByZXZpb3VzVmFsdWU7XHJcbiAgICB9XHJcbiAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XHJcbiAgICAgICAgdmFyIHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgICAgICBwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5wdXNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZG9tTm9kZVtwcm9wTmFtZV0oKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiByZW1vdmVPcnBoYW5lZEV2ZW50cyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMsIHByb3BlcnRpZXMsIHByb2plY3Rpb25PcHRpb25zLCBvbmx5RXZlbnRzKSB7XHJcbiAgICBpZiAob25seUV2ZW50cyA9PT0gdm9pZCAwKSB7IG9ubHlFdmVudHMgPSBmYWxzZTsgfVxyXG4gICAgdmFyIHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgIHZhciBldmVudE1hcCA9IHByb2plY3RvclN0YXRlLm5vZGVNYXAuZ2V0KGRvbU5vZGUpO1xyXG4gICAgaWYgKGV2ZW50TWFwKSB7XHJcbiAgICAgICAgT2JqZWN0LmtleXMocHJldmlvdXNQcm9wZXJ0aWVzKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xyXG4gICAgICAgICAgICB2YXIgaXNFdmVudCA9IHByb3BOYW1lLnN1YnN0cigwLCAyKSA9PT0gJ29uJyB8fCBvbmx5RXZlbnRzO1xyXG4gICAgICAgICAgICB2YXIgZXZlbnROYW1lID0gb25seUV2ZW50cyA/IHByb3BOYW1lIDogcHJvcE5hbWUuc3Vic3RyKDIpO1xyXG4gICAgICAgICAgICBpZiAoaXNFdmVudCAmJiAhcHJvcGVydGllc1twcm9wTmFtZV0pIHtcclxuICAgICAgICAgICAgICAgIHZhciBldmVudENhbGxiYWNrID0gZXZlbnRNYXAuZ2V0KHByZXZpb3VzUHJvcGVydGllc1twcm9wTmFtZV0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50Q2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICBkb21Ob2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBldmVudENhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHVwZGF0ZUF0dHJpYnV0ZShkb21Ob2RlLCBhdHRyTmFtZSwgYXR0clZhbHVlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgaWYgKHByb2plY3Rpb25PcHRpb25zLm5hbWVzcGFjZSA9PT0gTkFNRVNQQUNFX1NWRyAmJiBhdHRyTmFtZSA9PT0gJ2hyZWYnKSB7XHJcbiAgICAgICAgZG9tTm9kZS5zZXRBdHRyaWJ1dGVOUyhOQU1FU1BBQ0VfWExJTkssIGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoKGF0dHJOYW1lID09PSAncm9sZScgJiYgYXR0clZhbHVlID09PSAnJykgfHwgYXR0clZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBkb21Ob2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyTmFtZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBkb21Ob2RlLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0clZhbHVlKTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiB1cGRhdGVBdHRyaWJ1dGVzKGRvbU5vZGUsIHByZXZpb3VzQXR0cmlidXRlcywgYXR0cmlidXRlcywgcHJvamVjdGlvbk9wdGlvbnMpIHtcclxuICAgIHZhciBhdHRyTmFtZXMgPSBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKTtcclxuICAgIHZhciBhdHRyQ291bnQgPSBhdHRyTmFtZXMubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRyQ291bnQ7IGkrKykge1xyXG4gICAgICAgIHZhciBhdHRyTmFtZSA9IGF0dHJOYW1lc1tpXTtcclxuICAgICAgICB2YXIgYXR0clZhbHVlID0gYXR0cmlidXRlc1thdHRyTmFtZV07XHJcbiAgICAgICAgdmFyIHByZXZpb3VzQXR0clZhbHVlID0gcHJldmlvdXNBdHRyaWJ1dGVzW2F0dHJOYW1lXTtcclxuICAgICAgICBpZiAoYXR0clZhbHVlICE9PSBwcmV2aW91c0F0dHJWYWx1ZSkge1xyXG4gICAgICAgICAgICB1cGRhdGVBdHRyaWJ1dGUoZG9tTm9kZSwgYXR0ck5hbWUsIGF0dHJWYWx1ZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiB1cGRhdGVQcm9wZXJ0aWVzKGRvbU5vZGUsIHByZXZpb3VzUHJvcGVydGllcywgcHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMsIGluY2x1ZGVzRXZlbnRzQW5kQXR0cmlidXRlcykge1xyXG4gICAgaWYgKGluY2x1ZGVzRXZlbnRzQW5kQXR0cmlidXRlcyA9PT0gdm9pZCAwKSB7IGluY2x1ZGVzRXZlbnRzQW5kQXR0cmlidXRlcyA9IHRydWU7IH1cclxuICAgIHZhciBwcm9wZXJ0aWVzVXBkYXRlZCA9IGZhbHNlO1xyXG4gICAgdmFyIHByb3BOYW1lcyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpO1xyXG4gICAgdmFyIHByb3BDb3VudCA9IHByb3BOYW1lcy5sZW5ndGg7XHJcbiAgICBpZiAocHJvcE5hbWVzLmluZGV4T2YoJ2NsYXNzZXMnKSA9PT0gLTEgJiYgcHJldmlvdXNQcm9wZXJ0aWVzLmNsYXNzZXMpIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcmV2aW91c1Byb3BlcnRpZXMuY2xhc3NlcykpIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmV2aW91c1Byb3BlcnRpZXMuY2xhc3Nlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3Nlcyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMuY2xhc3Nlc1tpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJlbW92ZUNsYXNzZXMoZG9tTm9kZSwgcHJldmlvdXNQcm9wZXJ0aWVzLmNsYXNzZXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGluY2x1ZGVzRXZlbnRzQW5kQXR0cmlidXRlcyAmJiByZW1vdmVPcnBoYW5lZEV2ZW50cyhkb21Ob2RlLCBwcmV2aW91c1Byb3BlcnRpZXMsIHByb3BlcnRpZXMsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcENvdW50OyBpKyspIHtcclxuICAgICAgICB2YXIgcHJvcE5hbWUgPSBwcm9wTmFtZXNbaV07XHJcbiAgICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BlcnRpZXNbcHJvcE5hbWVdO1xyXG4gICAgICAgIHZhciBwcmV2aW91c1ZhbHVlID0gcHJldmlvdXNQcm9wZXJ0aWVzW3Byb3BOYW1lXTtcclxuICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdjbGFzc2VzJykge1xyXG4gICAgICAgICAgICB2YXIgcHJldmlvdXNDbGFzc2VzID0gQXJyYXkuaXNBcnJheShwcmV2aW91c1ZhbHVlKSA/IHByZXZpb3VzVmFsdWUgOiBbcHJldmlvdXNWYWx1ZV07XHJcbiAgICAgICAgICAgIHZhciBjdXJyZW50Q2xhc3NlcyA9IEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSA/IHByb3BWYWx1ZSA6IFtwcm9wVmFsdWVdO1xyXG4gICAgICAgICAgICBpZiAocHJldmlvdXNDbGFzc2VzICYmIHByZXZpb3VzQ2xhc3Nlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXByb3BWYWx1ZSB8fCBwcm9wVmFsdWUubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaV8xID0gMDsgaV8xIDwgcHJldmlvdXNDbGFzc2VzLmxlbmd0aDsgaV8xKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3Nlcyhkb21Ob2RlLCBwcmV2aW91c0NsYXNzZXNbaV8xXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0NsYXNzZXMgPSB0c2xpYl8xLl9fc3ByZWFkKGN1cnJlbnRDbGFzc2VzKTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpXzIgPSAwOyBpXzIgPCBwcmV2aW91c0NsYXNzZXMubGVuZ3RoOyBpXzIrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNDbGFzc05hbWUgPSBwcmV2aW91c0NsYXNzZXNbaV8yXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzQ2xhc3NOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2xhc3NJbmRleCA9IG5ld0NsYXNzZXMuaW5kZXhPZihwcmV2aW91c0NsYXNzTmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NJbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDbGFzc2VzKGRvbU5vZGUsIHByZXZpb3VzQ2xhc3NOYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NsYXNzZXMuc3BsaWNlKGNsYXNzSW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGlfMyA9IDA7IGlfMyA8IG5ld0NsYXNzZXMubGVuZ3RoOyBpXzMrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRDbGFzc2VzKGRvbU5vZGUsIG5ld0NsYXNzZXNbaV8zXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaV80ID0gMDsgaV80IDwgY3VycmVudENsYXNzZXMubGVuZ3RoOyBpXzQrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGFkZENsYXNzZXMoZG9tTm9kZSwgY3VycmVudENsYXNzZXNbaV80XSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobm9kZU9wZXJhdGlvbnMuaW5kZXhPZihwcm9wTmFtZSkgIT09IC0xKSB7XHJcbiAgICAgICAgICAgIG5vZGVPcGVyYXRpb24ocHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJldmlvdXNWYWx1ZSwgZG9tTm9kZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChwcm9wTmFtZSA9PT0gJ3N0eWxlcycpIHtcclxuICAgICAgICAgICAgdmFyIHN0eWxlTmFtZXMgPSBPYmplY3Qua2V5cyhwcm9wVmFsdWUpO1xyXG4gICAgICAgICAgICB2YXIgc3R5bGVDb3VudCA9IHN0eWxlTmFtZXMubGVuZ3RoO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHN0eWxlQ291bnQ7IGorKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHN0eWxlTmFtZSA9IHN0eWxlTmFtZXNbal07XHJcbiAgICAgICAgICAgICAgICB2YXIgbmV3U3R5bGVWYWx1ZSA9IHByb3BWYWx1ZVtzdHlsZU5hbWVdO1xyXG4gICAgICAgICAgICAgICAgdmFyIG9sZFN0eWxlVmFsdWUgPSBwcmV2aW91c1ZhbHVlICYmIHByZXZpb3VzVmFsdWVbc3R5bGVOYW1lXTtcclxuICAgICAgICAgICAgICAgIGlmIChuZXdTdHlsZVZhbHVlID09PSBvbGRTdHlsZVZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAobmV3U3R5bGVWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrU3R5bGVWYWx1ZShuZXdTdHlsZVZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uT3B0aW9ucy5zdHlsZUFwcGx5ZXIoZG9tTm9kZSwgc3R5bGVOYW1lLCBuZXdTdHlsZVZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb25PcHRpb25zLnN0eWxlQXBwbHllcihkb21Ob2RlLCBzdHlsZU5hbWUsICcnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCFwcm9wVmFsdWUgJiYgdHlwZW9mIHByZXZpb3VzVmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9wVmFsdWUgPSAnJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICd2YWx1ZScpIHtcclxuICAgICAgICAgICAgICAgIHZhciBkb21WYWx1ZSA9IGRvbU5vZGVbcHJvcE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRvbVZhbHVlICE9PSBwcm9wVmFsdWUgJiZcclxuICAgICAgICAgICAgICAgICAgICAoZG9tTm9kZVsnb25pbnB1dC12YWx1ZSddXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZG9tVmFsdWUgPT09IGRvbU5vZGVbJ29uaW5wdXQtdmFsdWUnXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHByb3BWYWx1ZSAhPT0gcHJldmlvdXNWYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBkb21Ob2RlW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICBkb21Ob2RlWydvbmlucHV0LXZhbHVlJ10gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvcFZhbHVlICE9PSBwcmV2aW91c1ZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc1VwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHByb3BOYW1lICE9PSAna2V5JyAmJiBwcm9wVmFsdWUgIT09IHByZXZpb3VzVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHZhciB0eXBlID0gdHlwZW9mIHByb3BWYWx1ZTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnZnVuY3Rpb24nICYmIHByb3BOYW1lLmxhc3RJbmRleE9mKCdvbicsIDApID09PSAwICYmIGluY2x1ZGVzRXZlbnRzQW5kQXR0cmlidXRlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUV2ZW50KGRvbU5vZGUsIHByb3BOYW1lLnN1YnN0cigyKSwgcHJvcFZhbHVlLCBwcm9qZWN0aW9uT3B0aW9ucywgcHJvcGVydGllcy5iaW5kLCBwcmV2aW91c1ZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHByb3BOYW1lICE9PSAnaW5uZXJIVE1MJyAmJiBpbmNsdWRlc0V2ZW50c0FuZEF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVBdHRyaWJ1dGUoZG9tTm9kZSwgcHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvcE5hbWUgPT09ICdzY3JvbGxMZWZ0JyB8fCBwcm9wTmFtZSA9PT0gJ3Njcm9sbFRvcCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZG9tTm9kZVtwcm9wTmFtZV0gIT09IHByb3BWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb21Ob2RlW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBkb21Ob2RlW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXNVcGRhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBwcm9wZXJ0aWVzVXBkYXRlZDtcclxufVxyXG5mdW5jdGlvbiBmaW5kSW5kZXhPZkNoaWxkKGNoaWxkcmVuLCBzYW1lQXMsIHN0YXJ0KSB7XHJcbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmIChzYW1lKGNoaWxkcmVuW2ldLCBzYW1lQXMpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAtMTtcclxufVxyXG5mdW5jdGlvbiB0b1BhcmVudFZOb2RlKGRvbU5vZGUpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgdGFnOiAnJyxcclxuICAgICAgICBwcm9wZXJ0aWVzOiB7fSxcclxuICAgICAgICBjaGlsZHJlbjogdW5kZWZpbmVkLFxyXG4gICAgICAgIGRvbU5vZGU6IGRvbU5vZGUsXHJcbiAgICAgICAgdHlwZTogZF8xLlZOT0RFXHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydHMudG9QYXJlbnRWTm9kZSA9IHRvUGFyZW50Vk5vZGU7XHJcbmZ1bmN0aW9uIHRvVGV4dFZOb2RlKGRhdGEpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgdGFnOiAnJyxcclxuICAgICAgICBwcm9wZXJ0aWVzOiB7fSxcclxuICAgICAgICBjaGlsZHJlbjogdW5kZWZpbmVkLFxyXG4gICAgICAgIHRleHQ6IFwiXCIgKyBkYXRhLFxyXG4gICAgICAgIGRvbU5vZGU6IHVuZGVmaW5lZCxcclxuICAgICAgICB0eXBlOiBkXzEuVk5PREVcclxuICAgIH07XHJcbn1cclxuZXhwb3J0cy50b1RleHRWTm9kZSA9IHRvVGV4dFZOb2RlO1xyXG5mdW5jdGlvbiB0b0ludGVybmFsV05vZGUoaW5zdGFuY2UsIGluc3RhbmNlRGF0YSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXHJcbiAgICAgICAgcmVuZGVyZWQ6IFtdLFxyXG4gICAgICAgIGNvcmVQcm9wZXJ0aWVzOiBpbnN0YW5jZURhdGEuY29yZVByb3BlcnRpZXMsXHJcbiAgICAgICAgY2hpbGRyZW46IGluc3RhbmNlLmNoaWxkcmVuLFxyXG4gICAgICAgIHdpZGdldENvbnN0cnVjdG9yOiBpbnN0YW5jZS5jb25zdHJ1Y3RvcixcclxuICAgICAgICBwcm9wZXJ0aWVzOiBpbnN0YW5jZURhdGEuaW5wdXRQcm9wZXJ0aWVzLFxyXG4gICAgICAgIHR5cGU6IGRfMS5XTk9ERVxyXG4gICAgfTtcclxufVxyXG5mdW5jdGlvbiBmaWx0ZXJBbmREZWNvcmF0ZUNoaWxkcmVuKGNoaWxkcmVuLCBpbnN0YW5jZSkge1xyXG4gICAgaWYgKGNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4gZW1wdHlBcnJheTtcclxuICAgIH1cclxuICAgIGNoaWxkcmVuID0gQXJyYXkuaXNBcnJheShjaGlsZHJlbikgPyBjaGlsZHJlbiA6IFtjaGlsZHJlbl07XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDspIHtcclxuICAgICAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcclxuICAgICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCB8fCBjaGlsZCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGNoaWxkcmVuW2ldID0gdG9UZXh0Vk5vZGUoY2hpbGQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGRfMS5pc1ZOb2RlKGNoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLnByb3BlcnRpZXMuYmluZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQucHJvcGVydGllcy5iaW5kID0gaW5zdGFuY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuICYmIGNoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihjaGlsZC5jaGlsZHJlbiwgaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICghY2hpbGQuY29yZVByb3BlcnRpZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaW5zdGFuY2VEYXRhID0gZXhwb3J0cy53aWRnZXRJbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLmNvcmVQcm9wZXJ0aWVzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiaW5kOiBpbnN0YW5jZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVJlZ2lzdHJ5OiBpbnN0YW5jZURhdGEuY29yZVByb3BlcnRpZXMuYmFzZVJlZ2lzdHJ5XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5jaGlsZHJlbiAmJiBjaGlsZC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihjaGlsZC5jaGlsZHJlbiwgaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGkrKztcclxuICAgIH1cclxuICAgIHJldHVybiBjaGlsZHJlbjtcclxufVxyXG5leHBvcnRzLmZpbHRlckFuZERlY29yYXRlQ2hpbGRyZW4gPSBmaWx0ZXJBbmREZWNvcmF0ZUNoaWxkcmVuO1xyXG5mdW5jdGlvbiBub2RlQWRkZWQoZG5vZGUsIHRyYW5zaXRpb25zKSB7XHJcbiAgICBpZiAoZF8xLmlzVk5vZGUoZG5vZGUpICYmIGRub2RlLnByb3BlcnRpZXMpIHtcclxuICAgICAgICB2YXIgZW50ZXJBbmltYXRpb24gPSBkbm9kZS5wcm9wZXJ0aWVzLmVudGVyQW5pbWF0aW9uO1xyXG4gICAgICAgIGlmIChlbnRlckFuaW1hdGlvbikge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGVudGVyQW5pbWF0aW9uID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICBlbnRlckFuaW1hdGlvbihkbm9kZS5kb21Ob2RlLCBkbm9kZS5wcm9wZXJ0aWVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25zLmVudGVyKGRub2RlLmRvbU5vZGUsIGRub2RlLnByb3BlcnRpZXMsIGVudGVyQW5pbWF0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBub2RlVG9SZW1vdmUoZG5vZGUsIHRyYW5zaXRpb25zLCBwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgaWYgKGRfMS5pc1dOb2RlKGRub2RlKSkge1xyXG4gICAgICAgIHZhciBpdGVtID0gaW5zdGFuY2VNYXAuZ2V0KGRub2RlLmluc3RhbmNlKTtcclxuICAgICAgICB2YXIgcmVuZGVyZWQgPSAoaXRlbSA/IGl0ZW0uZG5vZGUucmVuZGVyZWQgOiBkbm9kZS5yZW5kZXJlZCkgfHwgZW1wdHlBcnJheTtcclxuICAgICAgICBpZiAoZG5vZGUuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdmFyIGluc3RhbmNlRGF0YSA9IGV4cG9ydHMud2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGRub2RlLmluc3RhbmNlKTtcclxuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLm9uRGV0YWNoKCk7XHJcbiAgICAgICAgICAgIGluc3RhbmNlTWFwLmRlbGV0ZShkbm9kZS5pbnN0YW5jZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVuZGVyZWQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbm9kZVRvUmVtb3ZlKHJlbmRlcmVkW2ldLCB0cmFuc2l0aW9ucywgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHZhciBkb21Ob2RlXzEgPSBkbm9kZS5kb21Ob2RlO1xyXG4gICAgICAgIHZhciBwcm9wZXJ0aWVzID0gZG5vZGUucHJvcGVydGllcztcclxuICAgICAgICBpZiAoZG5vZGUuY2hpbGRyZW4gJiYgZG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBub2RlVG9SZW1vdmUoZG5vZGUuY2hpbGRyZW5baV0sIHRyYW5zaXRpb25zLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGV4aXRBbmltYXRpb24gPSBwcm9wZXJ0aWVzLmV4aXRBbmltYXRpb247XHJcbiAgICAgICAgaWYgKHByb3BlcnRpZXMgJiYgZXhpdEFuaW1hdGlvbikge1xyXG4gICAgICAgICAgICBkb21Ob2RlXzEuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcclxuICAgICAgICAgICAgdmFyIHJlbW92ZURvbU5vZGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBkb21Ob2RlXzEgJiYgZG9tTm9kZV8xLnBhcmVudE5vZGUgJiYgZG9tTm9kZV8xLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZG9tTm9kZV8xKTtcclxuICAgICAgICAgICAgICAgIGRub2RlLmRvbU5vZGUgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXhpdEFuaW1hdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgZXhpdEFuaW1hdGlvbihkb21Ob2RlXzEsIHJlbW92ZURvbU5vZGUsIHByb3BlcnRpZXMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbnMuZXhpdChkbm9kZS5kb21Ob2RlLCBwcm9wZXJ0aWVzLCBleGl0QW5pbWF0aW9uLCByZW1vdmVEb21Ob2RlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBkb21Ob2RlXzEgJiYgZG9tTm9kZV8xLnBhcmVudE5vZGUgJiYgZG9tTm9kZV8xLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZG9tTm9kZV8xKTtcclxuICAgICAgICBkbm9kZS5kb21Ob2RlID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGNoZWNrRGlzdGluZ3Vpc2hhYmxlKGNoaWxkTm9kZXMsIGluZGV4VG9DaGVjaywgcGFyZW50SW5zdGFuY2UpIHtcclxuICAgIHZhciBjaGlsZE5vZGUgPSBjaGlsZE5vZGVzW2luZGV4VG9DaGVja107XHJcbiAgICBpZiAoZF8xLmlzVk5vZGUoY2hpbGROb2RlKSAmJiAhY2hpbGROb2RlLnRhZykge1xyXG4gICAgICAgIHJldHVybjsgLy8gVGV4dCBub2RlcyBuZWVkIG5vdCBiZSBkaXN0aW5ndWlzaGFibGVcclxuICAgIH1cclxuICAgIHZhciBrZXkgPSBjaGlsZE5vZGUucHJvcGVydGllcy5rZXk7XHJcbiAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwga2V5ID09PSBudWxsKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChpICE9PSBpbmRleFRvQ2hlY2spIHtcclxuICAgICAgICAgICAgICAgIHZhciBub2RlID0gY2hpbGROb2Rlc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChzYW1lKG5vZGUsIGNoaWxkTm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZUlkZW50aWZpZXIgPSB2b2lkIDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmVudE5hbWUgPSBwYXJlbnRJbnN0YW5jZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICd1bmtub3duJztcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZF8xLmlzV05vZGUoY2hpbGROb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlSWRlbnRpZmllciA9IGNoaWxkTm9kZS53aWRnZXRDb25zdHJ1Y3Rvci5uYW1lIHx8ICd1bmtub3duJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVJZGVudGlmaWVyID0gY2hpbGROb2RlLnRhZztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiQSB3aWRnZXQgKFwiICsgcGFyZW50TmFtZSArIFwiKSBoYXMgaGFkIGEgY2hpbGQgYWRkZGVkIG9yIHJlbW92ZWQsIGJ1dCB0aGV5IHdlcmUgbm90IGFibGUgdG8gdW5pcXVlbHkgaWRlbnRpZmllZC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gcHJvdmlkZSBhIHVuaXF1ZSAna2V5JyBwcm9wZXJ0eSB3aGVuIHVzaW5nIHRoZSBzYW1lIHdpZGdldCBvciBlbGVtZW50IChcIiArIG5vZGVJZGVudGlmaWVyICsgXCIpIG11bHRpcGxlIHRpbWVzIGFzIHNpYmxpbmdzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHVwZGF0ZUNoaWxkcmVuKHBhcmVudFZOb2RlLCBzaWJsaW5ncywgb2xkQ2hpbGRyZW4sIG5ld0NoaWxkcmVuLCBwYXJlbnRJbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpIHtcclxuICAgIG9sZENoaWxkcmVuID0gb2xkQ2hpbGRyZW4gfHwgZW1wdHlBcnJheTtcclxuICAgIG5ld0NoaWxkcmVuID0gbmV3Q2hpbGRyZW47XHJcbiAgICB2YXIgb2xkQ2hpbGRyZW5MZW5ndGggPSBvbGRDaGlsZHJlbi5sZW5ndGg7XHJcbiAgICB2YXIgbmV3Q2hpbGRyZW5MZW5ndGggPSBuZXdDaGlsZHJlbi5sZW5ndGg7XHJcbiAgICB2YXIgdHJhbnNpdGlvbnMgPSBwcm9qZWN0aW9uT3B0aW9ucy50cmFuc2l0aW9ucztcclxuICAgIHZhciBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XHJcbiAgICBwcm9qZWN0aW9uT3B0aW9ucyA9IHRzbGliXzEuX19hc3NpZ24oe30sIHByb2plY3Rpb25PcHRpb25zLCB7IGRlcHRoOiBwcm9qZWN0aW9uT3B0aW9ucy5kZXB0aCArIDEgfSk7XHJcbiAgICB2YXIgb2xkSW5kZXggPSAwO1xyXG4gICAgdmFyIG5ld0luZGV4ID0gMDtcclxuICAgIHZhciBpO1xyXG4gICAgdmFyIHRleHRVcGRhdGVkID0gZmFsc2U7XHJcbiAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgb2xkQ2hpbGQgPSBvbGRJbmRleCA8IG9sZENoaWxkcmVuTGVuZ3RoID8gb2xkQ2hpbGRyZW5bb2xkSW5kZXhdIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIHZhciBuZXdDaGlsZCA9IG5ld0NoaWxkcmVuW25ld0luZGV4XTtcclxuICAgICAgICBpZiAoZF8xLmlzVk5vZGUobmV3Q2hpbGQpICYmIHR5cGVvZiBuZXdDaGlsZC5kZWZlcnJlZFByb3BlcnRpZXNDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICBuZXdDaGlsZC5pbnNlcnRlZCA9IGRfMS5pc1ZOb2RlKG9sZENoaWxkKSAmJiBvbGRDaGlsZC5pbnNlcnRlZDtcclxuICAgICAgICAgICAgYWRkRGVmZXJyZWRQcm9wZXJ0aWVzKG5ld0NoaWxkLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvbGRDaGlsZCAhPT0gdW5kZWZpbmVkICYmIHNhbWUob2xkQ2hpbGQsIG5ld0NoaWxkKSkge1xyXG4gICAgICAgICAgICBvbGRJbmRleCsrO1xyXG4gICAgICAgICAgICBuZXdJbmRleCsrO1xyXG4gICAgICAgICAgICB0ZXh0VXBkYXRlZCA9XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVEb20ob2xkQ2hpbGQsIG5ld0NoaWxkLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50Vk5vZGUsIHBhcmVudEluc3RhbmNlLCBvbGRDaGlsZHJlbi5zbGljZShvbGRJbmRleCksIG5ld0NoaWxkcmVuLnNsaWNlKG5ld0luZGV4KSkgfHwgdGV4dFVwZGF0ZWQ7XHJcbiAgICAgICAgICAgIHJldHVybiBcImNvbnRpbnVlXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBmaW5kT2xkSW5kZXggPSBmaW5kSW5kZXhPZkNoaWxkKG9sZENoaWxkcmVuLCBuZXdDaGlsZCwgb2xkSW5kZXggKyAxKTtcclxuICAgICAgICB2YXIgYWRkQ2hpbGQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBpbnNlcnRCZWZvcmVEb21Ob2RlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB2YXIgY2hpbGRyZW5BcnJheSA9IG9sZENoaWxkcmVuO1xyXG4gICAgICAgICAgICB2YXIgbmV4dEluZGV4ID0gb2xkSW5kZXggKyAxO1xyXG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBvbGRDaGlsZHJlbltvbGRJbmRleF07XHJcbiAgICAgICAgICAgIGlmICghY2hpbGQpIHtcclxuICAgICAgICAgICAgICAgIGNoaWxkID0gc2libGluZ3NbMF07XHJcbiAgICAgICAgICAgICAgICBuZXh0SW5kZXggPSAxO1xyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW5BcnJheSA9IHNpYmxpbmdzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjaGlsZCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGluc2VydEJlZm9yZUNoaWxkcmVuID0gW2NoaWxkXTtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChpbnNlcnRCZWZvcmVDaGlsZHJlbi5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0QmVmb3JlID0gaW5zZXJ0QmVmb3JlQ2hpbGRyZW4uc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZF8xLmlzV05vZGUoaW5zZXJ0QmVmb3JlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGluc3RhbmNlTWFwLmdldChpbnNlcnRCZWZvcmUuaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLmRub2RlLnJlbmRlcmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRCZWZvcmVDaGlsZHJlbi5wdXNoLmFwcGx5KGluc2VydEJlZm9yZUNoaWxkcmVuLCB0c2xpYl8xLl9fc3ByZWFkKGl0ZW0uZG5vZGUucmVuZGVyZWQpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydEJlZm9yZS5kb21Ob2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlLmRvbU5vZGUucGFyZW50RWxlbWVudCAhPT0gcGFyZW50Vk5vZGUuZG9tTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlRG9tTm9kZSA9IGluc2VydEJlZm9yZS5kb21Ob2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydEJlZm9yZUNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiBjaGlsZHJlbkFycmF5W25leHRJbmRleF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ2hpbGRyZW4ucHVzaChjaGlsZHJlbkFycmF5W25leHRJbmRleF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0SW5kZXgrKztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3JlYXRlRG9tKG5ld0NoaWxkLCBwYXJlbnRWTm9kZSwgbmV3Q2hpbGRyZW4uc2xpY2UobmV3SW5kZXggKyAxKSwgaW5zZXJ0QmVmb3JlRG9tTm9kZSwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudEluc3RhbmNlKTtcclxuICAgICAgICAgICAgbm9kZUFkZGVkKG5ld0NoaWxkLCB0cmFuc2l0aW9ucyk7XHJcbiAgICAgICAgICAgIHZhciBpbmRleFRvQ2hlY2sgPSBuZXdJbmRleDtcclxuICAgICAgICAgICAgcHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MucHVzaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBjaGVja0Rpc3Rpbmd1aXNoYWJsZShuZXdDaGlsZHJlbiwgaW5kZXhUb0NoZWNrLCBwYXJlbnRJbnN0YW5jZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKCFvbGRDaGlsZCB8fCBmaW5kT2xkSW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgIGFkZENoaWxkKCk7XHJcbiAgICAgICAgICAgIG5ld0luZGV4Kys7XHJcbiAgICAgICAgICAgIHJldHVybiBcImNvbnRpbnVlXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciByZW1vdmVDaGlsZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGluZGV4VG9DaGVjayA9IG9sZEluZGV4O1xyXG4gICAgICAgICAgICBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5wdXNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGNoZWNrRGlzdGluZ3Vpc2hhYmxlKG9sZENoaWxkcmVuLCBpbmRleFRvQ2hlY2ssIHBhcmVudEluc3RhbmNlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChkXzEuaXNXTm9kZShvbGRDaGlsZCkpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpdGVtID0gaW5zdGFuY2VNYXAuZ2V0KG9sZENoaWxkLmluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2xkQ2hpbGQgPSBpdGVtLmRub2RlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5vZGVUb1JlbW92ZShvbGRDaGlsZCwgdHJhbnNpdGlvbnMsIHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZhciBmaW5kTmV3SW5kZXggPSBmaW5kSW5kZXhPZkNoaWxkKG5ld0NoaWxkcmVuLCBvbGRDaGlsZCwgbmV3SW5kZXggKyAxKTtcclxuICAgICAgICBpZiAoZmluZE5ld0luZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICByZW1vdmVDaGlsZCgpO1xyXG4gICAgICAgICAgICBvbGRJbmRleCsrO1xyXG4gICAgICAgICAgICByZXR1cm4gXCJjb250aW51ZVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhZGRDaGlsZCgpO1xyXG4gICAgICAgIHJlbW92ZUNoaWxkKCk7XHJcbiAgICAgICAgb2xkSW5kZXgrKztcclxuICAgICAgICBuZXdJbmRleCsrO1xyXG4gICAgfTtcclxuICAgIHdoaWxlIChuZXdJbmRleCA8IG5ld0NoaWxkcmVuTGVuZ3RoKSB7XHJcbiAgICAgICAgX2xvb3BfMSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKG9sZENoaWxkcmVuTGVuZ3RoID4gb2xkSW5kZXgpIHtcclxuICAgICAgICB2YXIgX2xvb3BfMiA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGluZGV4VG9DaGVjayA9IGk7XHJcbiAgICAgICAgICAgIHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnB1c2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgY2hlY2tEaXN0aW5ndWlzaGFibGUob2xkQ2hpbGRyZW4sIGluZGV4VG9DaGVjaywgcGFyZW50SW5zdGFuY2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdmFyIGNoaWxkVG9SZW1vdmUgPSBvbGRDaGlsZHJlbltpXTtcclxuICAgICAgICAgICAgaWYgKGRfMS5pc1dOb2RlKGNoaWxkVG9SZW1vdmUpKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGluc3RhbmNlTWFwLmdldChjaGlsZFRvUmVtb3ZlLmluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRUb1JlbW92ZSA9IGl0ZW0uZG5vZGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbm9kZVRvUmVtb3ZlKGNoaWxkVG9SZW1vdmUsIHRyYW5zaXRpb25zLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvLyBSZW1vdmUgY2hpbGQgZnJhZ21lbnRzXHJcbiAgICAgICAgZm9yIChpID0gb2xkSW5kZXg7IGkgPCBvbGRDaGlsZHJlbkxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIF9sb29wXzIoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGV4dFVwZGF0ZWQ7XHJcbn1cclxuZnVuY3Rpb24gYWRkQ2hpbGRyZW4ocGFyZW50Vk5vZGUsIGNoaWxkcmVuLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UsIGluc2VydEJlZm9yZSwgY2hpbGROb2Rlcykge1xyXG4gICAgaWYgKGluc2VydEJlZm9yZSA9PT0gdm9pZCAwKSB7IGluc2VydEJlZm9yZSA9IHVuZGVmaW5lZDsgfVxyXG4gICAgaWYgKGNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB2YXIgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xyXG4gICAgaWYgKHByb2plY3RvclN0YXRlLm1lcmdlICYmIGNoaWxkTm9kZXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNoaWxkTm9kZXMgPSBhcnJheV8xLmZyb20ocGFyZW50Vk5vZGUuZG9tTm9kZS5jaGlsZE5vZGVzKTtcclxuICAgIH1cclxuICAgIHZhciB0cmFuc2l0aW9ucyA9IHByb2plY3Rpb25PcHRpb25zLnRyYW5zaXRpb25zO1xyXG4gICAgcHJvamVjdGlvbk9wdGlvbnMgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCBwcm9qZWN0aW9uT3B0aW9ucywgeyBkZXB0aDogcHJvamVjdGlvbk9wdGlvbnMuZGVwdGggKyAxIH0pO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xyXG4gICAgICAgIHZhciBuZXh0U2libGluZ3MgPSBjaGlsZHJlbi5zbGljZShpICsgMSk7XHJcbiAgICAgICAgaWYgKGRfMS5pc1ZOb2RlKGNoaWxkKSkge1xyXG4gICAgICAgICAgICBpZiAocHJvamVjdG9yU3RhdGUubWVyZ2UgJiYgY2hpbGROb2Rlcykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGRvbUVsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoY2hpbGQuZG9tTm9kZSA9PT0gdW5kZWZpbmVkICYmIGNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQgPSBjaGlsZE5vZGVzLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbUVsZW1lbnQgJiYgZG9tRWxlbWVudC50YWdOYW1lID09PSAoY2hpbGQudGFnLnRvVXBwZXJDYXNlKCkgfHwgdW5kZWZpbmVkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5kb21Ob2RlID0gZG9tRWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3JlYXRlRG9tKGNoaWxkLCBwYXJlbnRWTm9kZSwgbmV4dFNpYmxpbmdzLCBpbnNlcnRCZWZvcmUsIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRJbnN0YW5jZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjcmVhdGVEb20oY2hpbGQsIHBhcmVudFZOb2RlLCBuZXh0U2libGluZ3MsIGluc2VydEJlZm9yZSwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudEluc3RhbmNlLCBjaGlsZE5vZGVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbm9kZUFkZGVkKGNoaWxkLCB0cmFuc2l0aW9ucyk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gaW5pdFByb3BlcnRpZXNBbmRDaGlsZHJlbihkb21Ob2RlLCBkbm9kZSwgcGFyZW50SW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKSB7XHJcbiAgICBhZGRDaGlsZHJlbihkbm9kZSwgZG5vZGUuY2hpbGRyZW4sIHByb2plY3Rpb25PcHRpb25zLCBwYXJlbnRJbnN0YW5jZSwgdW5kZWZpbmVkKTtcclxuICAgIGlmICh0eXBlb2YgZG5vZGUuZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicgJiYgZG5vZGUuaW5zZXJ0ZWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGFkZERlZmVycmVkUHJvcGVydGllcyhkbm9kZSwgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgfVxyXG4gICAgaWYgKGRub2RlLmF0dHJpYnV0ZXMgJiYgZG5vZGUuZXZlbnRzKSB7XHJcbiAgICAgICAgdXBkYXRlQXR0cmlidXRlcyhkb21Ob2RlLCB7fSwgZG5vZGUuYXR0cmlidXRlcywgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIHVwZGF0ZVByb3BlcnRpZXMoZG9tTm9kZSwge30sIGRub2RlLnByb3BlcnRpZXMsIHByb2plY3Rpb25PcHRpb25zLCBmYWxzZSk7XHJcbiAgICAgICAgcmVtb3ZlT3JwaGFuZWRFdmVudHMoZG9tTm9kZSwge30sIGRub2RlLmV2ZW50cywgcHJvamVjdGlvbk9wdGlvbnMsIHRydWUpO1xyXG4gICAgICAgIHZhciBldmVudHNfMSA9IGRub2RlLmV2ZW50cztcclxuICAgICAgICBPYmplY3Qua2V5cyhldmVudHNfMSkuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgdXBkYXRlRXZlbnQoZG9tTm9kZSwgZXZlbnQsIGV2ZW50c18xW2V2ZW50XSwgcHJvamVjdGlvbk9wdGlvbnMsIGRub2RlLnByb3BlcnRpZXMuYmluZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICB1cGRhdGVQcm9wZXJ0aWVzKGRvbU5vZGUsIHt9LCBkbm9kZS5wcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgICBpZiAoZG5vZGUucHJvcGVydGllcy5rZXkgIT09IG51bGwgJiYgZG5vZGUucHJvcGVydGllcy5rZXkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHZhciBpbnN0YW5jZURhdGEgPSBleHBvcnRzLndpZGdldEluc3RhbmNlTWFwLmdldChwYXJlbnRJbnN0YW5jZSk7XHJcbiAgICAgICAgaW5zdGFuY2VEYXRhLm5vZGVIYW5kbGVyLmFkZChkb21Ob2RlLCBcIlwiICsgZG5vZGUucHJvcGVydGllcy5rZXkpO1xyXG4gICAgfVxyXG4gICAgZG5vZGUuaW5zZXJ0ZWQgPSB0cnVlO1xyXG59XHJcbmZ1bmN0aW9uIGNyZWF0ZURvbShkbm9kZSwgcGFyZW50Vk5vZGUsIG5leHRTaWJsaW5ncywgaW5zZXJ0QmVmb3JlLCBwcm9qZWN0aW9uT3B0aW9ucywgcGFyZW50SW5zdGFuY2UsIGNoaWxkTm9kZXMpIHtcclxuICAgIHZhciBkb21Ob2RlO1xyXG4gICAgdmFyIHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgIGlmIChkXzEuaXNXTm9kZShkbm9kZSkpIHtcclxuICAgICAgICB2YXIgd2lkZ2V0Q29uc3RydWN0b3IgPSBkbm9kZS53aWRnZXRDb25zdHJ1Y3RvcjtcclxuICAgICAgICB2YXIgcGFyZW50SW5zdGFuY2VEYXRhID0gZXhwb3J0cy53aWRnZXRJbnN0YW5jZU1hcC5nZXQocGFyZW50SW5zdGFuY2UpO1xyXG4gICAgICAgIGlmICghUmVnaXN0cnlfMS5pc1dpZGdldEJhc2VDb25zdHJ1Y3Rvcih3aWRnZXRDb25zdHJ1Y3RvcikpIHtcclxuICAgICAgICAgICAgdmFyIGl0ZW0gPSBwYXJlbnRJbnN0YW5jZURhdGEucmVnaXN0cnkoKS5nZXQod2lkZ2V0Q29uc3RydWN0b3IpO1xyXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHdpZGdldENvbnN0cnVjdG9yID0gaXRlbTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGluc3RhbmNlXzEgPSBuZXcgd2lkZ2V0Q29uc3RydWN0b3IoKTtcclxuICAgICAgICBkbm9kZS5pbnN0YW5jZSA9IGluc3RhbmNlXzE7XHJcbiAgICAgICAgbmV4dFNpYmxpbmdNYXAuc2V0KGluc3RhbmNlXzEsIG5leHRTaWJsaW5ncyk7XHJcbiAgICAgICAgdmFyIGluc3RhbmNlRGF0YV8xID0gZXhwb3J0cy53aWRnZXRJbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2VfMSk7XHJcbiAgICAgICAgaW5zdGFuY2VEYXRhXzEuaW52YWxpZGF0ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaW5zdGFuY2VEYXRhXzEuZGlydHkgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VEYXRhXzEucmVuZGVyaW5nID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgcHJvamVjdG9yU3RhdGUucmVuZGVyUXVldWUucHVzaCh7IGluc3RhbmNlOiBpbnN0YW5jZV8xLCBkZXB0aDogcHJvamVjdGlvbk9wdGlvbnMuZGVwdGggfSk7XHJcbiAgICAgICAgICAgICAgICBzY2hlZHVsZVJlbmRlcihwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIGluc3RhbmNlRGF0YV8xLnJlbmRlcmluZyA9IHRydWU7XHJcbiAgICAgICAgaW5zdGFuY2VfMS5fX3NldENvcmVQcm9wZXJ0aWVzX18oZG5vZGUuY29yZVByb3BlcnRpZXMpO1xyXG4gICAgICAgIGluc3RhbmNlXzEuX19zZXRDaGlsZHJlbl9fKGRub2RlLmNoaWxkcmVuKTtcclxuICAgICAgICBpbnN0YW5jZV8xLl9fc2V0UHJvcGVydGllc19fKGRub2RlLnByb3BlcnRpZXMpO1xyXG4gICAgICAgIHZhciByZW5kZXJlZCA9IGluc3RhbmNlXzEuX19yZW5kZXJfXygpO1xyXG4gICAgICAgIGluc3RhbmNlRGF0YV8xLnJlbmRlcmluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChyZW5kZXJlZCkge1xyXG4gICAgICAgICAgICB2YXIgZmlsdGVyZWRSZW5kZXJlZCA9IGZpbHRlckFuZERlY29yYXRlQ2hpbGRyZW4ocmVuZGVyZWQsIGluc3RhbmNlXzEpO1xyXG4gICAgICAgICAgICBkbm9kZS5yZW5kZXJlZCA9IGZpbHRlcmVkUmVuZGVyZWQ7XHJcbiAgICAgICAgICAgIGFkZENoaWxkcmVuKHBhcmVudFZOb2RlLCBmaWx0ZXJlZFJlbmRlcmVkLCBwcm9qZWN0aW9uT3B0aW9ucywgaW5zdGFuY2VfMSwgaW5zZXJ0QmVmb3JlLCBjaGlsZE5vZGVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5zdGFuY2VNYXAuc2V0KGluc3RhbmNlXzEsIHsgZG5vZGU6IGRub2RlLCBwYXJlbnRWTm9kZTogcGFyZW50Vk5vZGUgfSk7XHJcbiAgICAgICAgaW5zdGFuY2VEYXRhXzEubm9kZUhhbmRsZXIuYWRkUm9vdCgpO1xyXG4gICAgICAgIHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnB1c2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpbnN0YW5jZURhdGFfMS5vbkF0dGFjaCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKHByb2plY3RvclN0YXRlLm1lcmdlICYmIHByb2plY3RvclN0YXRlLm1lcmdlRWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlID0gcHJvamVjdGlvbk9wdGlvbnMubWVyZ2VFbGVtZW50O1xyXG4gICAgICAgICAgICBwcm9qZWN0b3JTdGF0ZS5tZXJnZUVsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGluaXRQcm9wZXJ0aWVzQW5kQ2hpbGRyZW4oZG9tTm9kZSwgZG5vZGUsIHBhcmVudEluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGRvYyA9IHBhcmVudFZOb2RlLmRvbU5vZGUub3duZXJEb2N1bWVudDtcclxuICAgICAgICBpZiAoIWRub2RlLnRhZyAmJiB0eXBlb2YgZG5vZGUudGV4dCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgaWYgKGRub2RlLmRvbU5vZGUgIT09IHVuZGVmaW5lZCAmJiBwYXJlbnRWTm9kZS5kb21Ob2RlKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbmV3RG9tTm9kZSA9IGRub2RlLmRvbU5vZGUub3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkbm9kZS50ZXh0KTtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRWTm9kZS5kb21Ob2RlID09PSBkbm9kZS5kb21Ob2RlLnBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRWTm9kZS5kb21Ob2RlLnJlcGxhY2VDaGlsZChuZXdEb21Ob2RlLCBkbm9kZS5kb21Ob2RlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFZOb2RlLmRvbU5vZGUuYXBwZW5kQ2hpbGQobmV3RG9tTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZG5vZGUuZG9tTm9kZS5wYXJlbnROb2RlICYmIGRub2RlLmRvbU5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkbm9kZS5kb21Ob2RlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGRub2RlLmRvbU5vZGUgPSBuZXdEb21Ob2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZG9tTm9kZSA9IGRub2RlLmRvbU5vZGUgPSBkb2MuY3JlYXRlVGV4dE5vZGUoZG5vZGUudGV4dCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRWTm9kZS5kb21Ob2RlLmluc2VydEJlZm9yZShkb21Ob2RlLCBpbnNlcnRCZWZvcmUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Vk5vZGUuZG9tTm9kZS5hcHBlbmRDaGlsZChkb21Ob2RlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGRub2RlLmRvbU5vZGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRub2RlLnRhZyA9PT0gJ3N2ZycpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uT3B0aW9ucyA9IHRzbGliXzEuX19hc3NpZ24oe30sIHByb2plY3Rpb25PcHRpb25zLCB7IG5hbWVzcGFjZTogTkFNRVNQQUNFX1NWRyB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0aW9uT3B0aW9ucy5uYW1lc3BhY2UgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhwcm9qZWN0aW9uT3B0aW9ucy5uYW1lc3BhY2UsIGRub2RlLnRhZyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBkb21Ob2RlID0gZG5vZGUuZG9tTm9kZSA9IGRub2RlLmRvbU5vZGUgfHwgZG9jLmNyZWF0ZUVsZW1lbnQoZG5vZGUudGFnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRvbU5vZGUgPSBkbm9kZS5kb21Ob2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGluaXRQcm9wZXJ0aWVzQW5kQ2hpbGRyZW4oZG9tTm9kZSwgZG5vZGUsIHBhcmVudEluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgICAgIGlmIChpbnNlcnRCZWZvcmUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50Vk5vZGUuZG9tTm9kZS5pbnNlcnRCZWZvcmUoZG9tTm9kZSwgaW5zZXJ0QmVmb3JlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChkb21Ob2RlLnBhcmVudE5vZGUgIT09IHBhcmVudFZOb2RlLmRvbU5vZGUpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudFZOb2RlLmRvbU5vZGUuYXBwZW5kQ2hpbGQoZG9tTm9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gdXBkYXRlRG9tKHByZXZpb3VzLCBkbm9kZSwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudFZOb2RlLCBwYXJlbnRJbnN0YW5jZSwgb2xkTmV4dFNpYmxpbmdzLCBuZXh0U2libGluZ3MpIHtcclxuICAgIGlmIChkXzEuaXNXTm9kZShkbm9kZSkpIHtcclxuICAgICAgICB2YXIgaW5zdGFuY2UgPSBwcmV2aW91cy5pbnN0YW5jZTtcclxuICAgICAgICB2YXIgX2EgPSBpbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpLCBwYXJlbnRWTm9kZV8xID0gX2EucGFyZW50Vk5vZGUsIG5vZGUgPSBfYS5kbm9kZTtcclxuICAgICAgICB2YXIgcHJldmlvdXNSZW5kZXJlZCA9IG5vZGUgPyBub2RlLnJlbmRlcmVkIDogcHJldmlvdXMucmVuZGVyZWQ7XHJcbiAgICAgICAgdmFyIGluc3RhbmNlRGF0YSA9IGV4cG9ydHMud2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KGluc3RhbmNlKTtcclxuICAgICAgICBpbnN0YW5jZURhdGEucmVuZGVyaW5nID0gdHJ1ZTtcclxuICAgICAgICBpbnN0YW5jZS5fX3NldENvcmVQcm9wZXJ0aWVzX18oZG5vZGUuY29yZVByb3BlcnRpZXMpO1xyXG4gICAgICAgIGluc3RhbmNlLl9fc2V0Q2hpbGRyZW5fXyhkbm9kZS5jaGlsZHJlbik7XHJcbiAgICAgICAgaW5zdGFuY2UuX19zZXRQcm9wZXJ0aWVzX18oZG5vZGUucHJvcGVydGllcyk7XHJcbiAgICAgICAgbmV4dFNpYmxpbmdNYXAuc2V0KGluc3RhbmNlLCBuZXh0U2libGluZ3MpO1xyXG4gICAgICAgIGRub2RlLmluc3RhbmNlID0gaW5zdGFuY2U7XHJcbiAgICAgICAgaWYgKGluc3RhbmNlRGF0YS5kaXJ0eSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB2YXIgcmVuZGVyZWQgPSBpbnN0YW5jZS5fX3JlbmRlcl9fKCk7XHJcbiAgICAgICAgICAgIGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgZG5vZGUucmVuZGVyZWQgPSBmaWx0ZXJBbmREZWNvcmF0ZUNoaWxkcmVuKHJlbmRlcmVkLCBpbnN0YW5jZSk7XHJcbiAgICAgICAgICAgIHVwZGF0ZUNoaWxkcmVuKHBhcmVudFZOb2RlXzEsIG9sZE5leHRTaWJsaW5ncywgcHJldmlvdXNSZW5kZXJlZCwgZG5vZGUucmVuZGVyZWQsIGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpbnN0YW5jZURhdGEucmVuZGVyaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGRub2RlLnJlbmRlcmVkID0gcHJldmlvdXNSZW5kZXJlZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5zdGFuY2VNYXAuc2V0KGluc3RhbmNlLCB7IGRub2RlOiBkbm9kZSwgcGFyZW50Vk5vZGU6IHBhcmVudFZOb2RlXzEgfSk7XHJcbiAgICAgICAgaW5zdGFuY2VEYXRhLm5vZGVIYW5kbGVyLmFkZFJvb3QoKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChwcmV2aW91cyA9PT0gZG5vZGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgZG9tTm9kZV8yID0gKGRub2RlLmRvbU5vZGUgPSBwcmV2aW91cy5kb21Ob2RlKTtcclxuICAgICAgICB2YXIgdGV4dFVwZGF0ZWQgPSBmYWxzZTtcclxuICAgICAgICB2YXIgdXBkYXRlZCA9IGZhbHNlO1xyXG4gICAgICAgIGlmICghZG5vZGUudGFnICYmIHR5cGVvZiBkbm9kZS50ZXh0ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBpZiAoZG5vZGUudGV4dCAhPT0gcHJldmlvdXMudGV4dCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG5ld0RvbU5vZGUgPSBkb21Ob2RlXzIub3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkbm9kZS50ZXh0KTtcclxuICAgICAgICAgICAgICAgIGRvbU5vZGVfMi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdEb21Ob2RlLCBkb21Ob2RlXzIpO1xyXG4gICAgICAgICAgICAgICAgZG5vZGUuZG9tTm9kZSA9IG5ld0RvbU5vZGU7XHJcbiAgICAgICAgICAgICAgICB0ZXh0VXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dFVwZGF0ZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChkbm9kZS50YWcgJiYgZG5vZGUudGFnLmxhc3RJbmRleE9mKCdzdmcnLCAwKSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcHJvamVjdGlvbk9wdGlvbnMgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCBwcm9qZWN0aW9uT3B0aW9ucywgeyBuYW1lc3BhY2U6IE5BTUVTUEFDRV9TVkcgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHByZXZpb3VzLmNoaWxkcmVuICE9PSBkbm9kZS5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gZmlsdGVyQW5kRGVjb3JhdGVDaGlsZHJlbihkbm9kZS5jaGlsZHJlbiwgcGFyZW50SW5zdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgZG5vZGUuY2hpbGRyZW4gPSBjaGlsZHJlbjtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZWQgPVxyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNoaWxkcmVuKGRub2RlLCBvbGROZXh0U2libGluZ3MsIHByZXZpb3VzLmNoaWxkcmVuLCBjaGlsZHJlbiwgcGFyZW50SW5zdGFuY2UsIHByb2plY3Rpb25PcHRpb25zKSB8fCB1cGRhdGVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBwcmV2aW91c1Byb3BlcnRpZXNfMSA9IGJ1aWxkUHJldmlvdXNQcm9wZXJ0aWVzKGRvbU5vZGVfMiwgcHJldmlvdXMsIGRub2RlKTtcclxuICAgICAgICAgICAgaWYgKGRub2RlLmF0dHJpYnV0ZXMgJiYgZG5vZGUuZXZlbnRzKSB7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVBdHRyaWJ1dGVzKGRvbU5vZGVfMiwgcHJldmlvdXNQcm9wZXJ0aWVzXzEuYXR0cmlidXRlcywgZG5vZGUuYXR0cmlidXRlcywgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgdXBkYXRlZCA9XHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlUHJvcGVydGllcyhkb21Ob2RlXzIsIHByZXZpb3VzUHJvcGVydGllc18xLnByb3BlcnRpZXMsIGRub2RlLnByb3BlcnRpZXMsIHByb2plY3Rpb25PcHRpb25zLCBmYWxzZSkgfHwgdXBkYXRlZDtcclxuICAgICAgICAgICAgICAgIHJlbW92ZU9ycGhhbmVkRXZlbnRzKGRvbU5vZGVfMiwgcHJldmlvdXNQcm9wZXJ0aWVzXzEuZXZlbnRzLCBkbm9kZS5ldmVudHMsIHByb2plY3Rpb25PcHRpb25zLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIHZhciBldmVudHNfMiA9IGRub2RlLmV2ZW50cztcclxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGV2ZW50c18yKS5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUV2ZW50KGRvbU5vZGVfMiwgZXZlbnQsIGV2ZW50c18yW2V2ZW50XSwgcHJvamVjdGlvbk9wdGlvbnMsIGRub2RlLnByb3BlcnRpZXMuYmluZCwgcHJldmlvdXNQcm9wZXJ0aWVzXzEuZXZlbnRzW2V2ZW50XSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZWQgPVxyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVByb3BlcnRpZXMoZG9tTm9kZV8yLCBwcmV2aW91c1Byb3BlcnRpZXNfMS5wcm9wZXJ0aWVzLCBkbm9kZS5wcm9wZXJ0aWVzLCBwcm9qZWN0aW9uT3B0aW9ucykgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZG5vZGUucHJvcGVydGllcy5rZXkgIT09IG51bGwgJiYgZG5vZGUucHJvcGVydGllcy5rZXkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGluc3RhbmNlRGF0YSA9IGV4cG9ydHMud2lkZ2V0SW5zdGFuY2VNYXAuZ2V0KHBhcmVudEluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgIGluc3RhbmNlRGF0YS5ub2RlSGFuZGxlci5hZGQoZG9tTm9kZV8yLCBcIlwiICsgZG5vZGUucHJvcGVydGllcy5rZXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh1cGRhdGVkICYmIGRub2RlLnByb3BlcnRpZXMgJiYgZG5vZGUucHJvcGVydGllcy51cGRhdGVBbmltYXRpb24pIHtcclxuICAgICAgICAgICAgZG5vZGUucHJvcGVydGllcy51cGRhdGVBbmltYXRpb24oZG9tTm9kZV8yLCBkbm9kZS5wcm9wZXJ0aWVzLCBwcmV2aW91cy5wcm9wZXJ0aWVzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gYWRkRGVmZXJyZWRQcm9wZXJ0aWVzKHZub2RlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgLy8gdHJhbnNmZXIgYW55IHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gcGFzc2VkIC0gYXMgdGhlc2UgbXVzdCBiZSBkZWNvcmF0ZWQgcHJvcGVydGllc1xyXG4gICAgdm5vZGUuZGVjb3JhdGVkRGVmZXJyZWRQcm9wZXJ0aWVzID0gdm5vZGUucHJvcGVydGllcztcclxuICAgIHZhciBwcm9wZXJ0aWVzID0gdm5vZGUuZGVmZXJyZWRQcm9wZXJ0aWVzQ2FsbGJhY2soISF2bm9kZS5pbnNlcnRlZCk7XHJcbiAgICB2YXIgcHJvamVjdG9yU3RhdGUgPSBwcm9qZWN0b3JTdGF0ZU1hcC5nZXQocHJvamVjdGlvbk9wdGlvbnMucHJvamVjdG9ySW5zdGFuY2UpO1xyXG4gICAgdm5vZGUucHJvcGVydGllcyA9IHRzbGliXzEuX19hc3NpZ24oe30sIHByb3BlcnRpZXMsIHZub2RlLmRlY29yYXRlZERlZmVycmVkUHJvcGVydGllcyk7XHJcbiAgICBwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5wdXNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgcHJvcGVydGllcyA9IHRzbGliXzEuX19hc3NpZ24oe30sIHZub2RlLmRlZmVycmVkUHJvcGVydGllc0NhbGxiYWNrKCEhdm5vZGUuaW5zZXJ0ZWQpLCB2bm9kZS5kZWNvcmF0ZWREZWZlcnJlZFByb3BlcnRpZXMpO1xyXG4gICAgICAgIHVwZGF0ZVByb3BlcnRpZXModm5vZGUuZG9tTm9kZSwgdm5vZGUucHJvcGVydGllcywgcHJvcGVydGllcywgcHJvamVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIHZub2RlLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xyXG4gICAgfSk7XHJcbn1cclxuZnVuY3Rpb24gcnVuRGVmZXJyZWRSZW5kZXJDYWxsYmFja3MocHJvamVjdGlvbk9wdGlvbnMpIHtcclxuICAgIHZhciBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XHJcbiAgICBpZiAocHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3MubGVuZ3RoKSB7XHJcbiAgICAgICAgaWYgKHByb2plY3Rpb25PcHRpb25zLnN5bmMpIHtcclxuICAgICAgICAgICAgd2hpbGUgKHByb2plY3RvclN0YXRlLmRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gcHJvamVjdG9yU3RhdGUuZGVmZXJyZWRSZW5kZXJDYWxsYmFja3Muc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGdsb2JhbF8xLmRlZmF1bHQucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBwcm9qZWN0b3JTdGF0ZS5kZWZlcnJlZFJlbmRlckNhbGxiYWNrcy5zaGlmdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBydW5BZnRlclJlbmRlckNhbGxiYWNrcyhwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgdmFyIHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KHByb2plY3Rpb25PcHRpb25zLnByb2plY3Rvckluc3RhbmNlKTtcclxuICAgIGlmIChwcm9qZWN0aW9uT3B0aW9ucy5zeW5jKSB7XHJcbiAgICAgICAgd2hpbGUgKHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5zaGlmdCgpO1xyXG4gICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChnbG9iYWxfMS5kZWZhdWx0LnJlcXVlc3RJZGxlQ2FsbGJhY2spIHtcclxuICAgICAgICAgICAgZ2xvYmFsXzEuZGVmYXVsdC5yZXF1ZXN0SWRsZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBwcm9qZWN0b3JTdGF0ZS5hZnRlclJlbmRlckNhbGxiYWNrcy5zaGlmdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAocHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gcHJvamVjdG9yU3RhdGUuYWZ0ZXJSZW5kZXJDYWxsYmFja3Muc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gc2NoZWR1bGVSZW5kZXIocHJvamVjdGlvbk9wdGlvbnMpIHtcclxuICAgIHZhciBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XHJcbiAgICBpZiAocHJvamVjdGlvbk9wdGlvbnMuc3luYykge1xyXG4gICAgICAgIHJlbmRlcihwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChwcm9qZWN0b3JTdGF0ZS5yZW5kZXJTY2hlZHVsZWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHByb2plY3RvclN0YXRlLnJlbmRlclNjaGVkdWxlZCA9IGdsb2JhbF8xLmRlZmF1bHQucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmVuZGVyKHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiByZW5kZXIocHJvamVjdGlvbk9wdGlvbnMpIHtcclxuICAgIHZhciBwcm9qZWN0b3JTdGF0ZSA9IHByb2plY3RvclN0YXRlTWFwLmdldChwcm9qZWN0aW9uT3B0aW9ucy5wcm9qZWN0b3JJbnN0YW5jZSk7XHJcbiAgICBwcm9qZWN0b3JTdGF0ZS5yZW5kZXJTY2hlZHVsZWQgPSB1bmRlZmluZWQ7XHJcbiAgICB2YXIgcmVuZGVyUXVldWUgPSBwcm9qZWN0b3JTdGF0ZS5yZW5kZXJRdWV1ZTtcclxuICAgIHZhciByZW5kZXJzID0gdHNsaWJfMS5fX3NwcmVhZChyZW5kZXJRdWV1ZSk7XHJcbiAgICBwcm9qZWN0b3JTdGF0ZS5yZW5kZXJRdWV1ZSA9IFtdO1xyXG4gICAgcmVuZGVycy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhLmRlcHRoIC0gYi5kZXB0aDsgfSk7XHJcbiAgICB2YXIgcHJldmlvdXNseVJlbmRlcmVkID0gW107XHJcbiAgICB3aGlsZSAocmVuZGVycy5sZW5ndGgpIHtcclxuICAgICAgICB2YXIgaW5zdGFuY2UgPSByZW5kZXJzLnNoaWZ0KCkuaW5zdGFuY2U7XHJcbiAgICAgICAgaWYgKGluc3RhbmNlTWFwLmhhcyhpbnN0YW5jZSkgJiYgcHJldmlvdXNseVJlbmRlcmVkLmluZGV4T2YoaW5zdGFuY2UpID09PSAtMSkge1xyXG4gICAgICAgICAgICBwcmV2aW91c2x5UmVuZGVyZWQucHVzaChpbnN0YW5jZSk7XHJcbiAgICAgICAgICAgIHZhciBfYSA9IGluc3RhbmNlTWFwLmdldChpbnN0YW5jZSksIHBhcmVudFZOb2RlID0gX2EucGFyZW50Vk5vZGUsIGRub2RlID0gX2EuZG5vZGU7XHJcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZURhdGEgPSBleHBvcnRzLndpZGdldEluc3RhbmNlTWFwLmdldChpbnN0YW5jZSk7XHJcbiAgICAgICAgICAgIHZhciBuZXh0U2libGluZ3MgPSBuZXh0U2libGluZ01hcC5nZXQoaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICB1cGRhdGVEb20oZG5vZGUsIHRvSW50ZXJuYWxXTm9kZShpbnN0YW5jZSwgaW5zdGFuY2VEYXRhKSwgcHJvamVjdGlvbk9wdGlvbnMsIHBhcmVudFZOb2RlLCBpbnN0YW5jZSwgbmV4dFNpYmxpbmdzLCBuZXh0U2libGluZ3MpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJ1bkFmdGVyUmVuZGVyQ2FsbGJhY2tzKHByb2plY3Rpb25PcHRpb25zKTtcclxuICAgIHJ1bkRlZmVycmVkUmVuZGVyQ2FsbGJhY2tzKHByb2plY3Rpb25PcHRpb25zKTtcclxufVxyXG5leHBvcnRzLmRvbSA9IHtcclxuICAgIGFwcGVuZDogZnVuY3Rpb24gKHBhcmVudE5vZGUsIGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucykge1xyXG4gICAgICAgIGlmIChwcm9qZWN0aW9uT3B0aW9ucyA9PT0gdm9pZCAwKSB7IHByb2plY3Rpb25PcHRpb25zID0ge307IH1cclxuICAgICAgICB2YXIgaW5zdGFuY2VEYXRhID0gZXhwb3J0cy53aWRnZXRJbnN0YW5jZU1hcC5nZXQoaW5zdGFuY2UpO1xyXG4gICAgICAgIHZhciBmaW5hbFByb2plY3Rvck9wdGlvbnMgPSBnZXRQcm9qZWN0aW9uT3B0aW9ucyhwcm9qZWN0aW9uT3B0aW9ucywgaW5zdGFuY2UpO1xyXG4gICAgICAgIHZhciBwcm9qZWN0b3JTdGF0ZSA9IHtcclxuICAgICAgICAgICAgYWZ0ZXJSZW5kZXJDYWxsYmFja3M6IFtdLFxyXG4gICAgICAgICAgICBkZWZlcnJlZFJlbmRlckNhbGxiYWNrczogW10sXHJcbiAgICAgICAgICAgIG5vZGVNYXA6IG5ldyBXZWFrTWFwXzEuZGVmYXVsdCgpLFxyXG4gICAgICAgICAgICByZW5kZXJTY2hlZHVsZWQ6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgcmVuZGVyUXVldWU6IFtdLFxyXG4gICAgICAgICAgICBtZXJnZTogcHJvamVjdGlvbk9wdGlvbnMubWVyZ2UgfHwgZmFsc2UsXHJcbiAgICAgICAgICAgIG1lcmdlRWxlbWVudDogcHJvamVjdGlvbk9wdGlvbnMubWVyZ2VFbGVtZW50XHJcbiAgICAgICAgfTtcclxuICAgICAgICBwcm9qZWN0b3JTdGF0ZU1hcC5zZXQoaW5zdGFuY2UsIHByb2plY3RvclN0YXRlKTtcclxuICAgICAgICBmaW5hbFByb2plY3Rvck9wdGlvbnMucm9vdE5vZGUgPSBwYXJlbnROb2RlO1xyXG4gICAgICAgIHZhciBwYXJlbnRWTm9kZSA9IHRvUGFyZW50Vk5vZGUoZmluYWxQcm9qZWN0b3JPcHRpb25zLnJvb3ROb2RlKTtcclxuICAgICAgICB2YXIgbm9kZSA9IHRvSW50ZXJuYWxXTm9kZShpbnN0YW5jZSwgaW5zdGFuY2VEYXRhKTtcclxuICAgICAgICBpbnN0YW5jZU1hcC5zZXQoaW5zdGFuY2UsIHsgZG5vZGU6IG5vZGUsIHBhcmVudFZOb2RlOiBwYXJlbnRWTm9kZSB9KTtcclxuICAgICAgICBpbnN0YW5jZURhdGEuaW52YWxpZGF0ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaW5zdGFuY2VEYXRhLmRpcnR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKGluc3RhbmNlRGF0YS5yZW5kZXJpbmcgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9qZWN0b3JTdGF0ZS5yZW5kZXJRdWV1ZS5wdXNoKHsgaW5zdGFuY2U6IGluc3RhbmNlLCBkZXB0aDogZmluYWxQcm9qZWN0b3JPcHRpb25zLmRlcHRoIH0pO1xyXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVSZW5kZXIoZmluYWxQcm9qZWN0b3JPcHRpb25zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdXBkYXRlRG9tKG5vZGUsIG5vZGUsIGZpbmFsUHJvamVjdG9yT3B0aW9ucywgcGFyZW50Vk5vZGUsIGluc3RhbmNlLCBbXSwgW10pO1xyXG4gICAgICAgIHByb2plY3RvclN0YXRlLmFmdGVyUmVuZGVyQ2FsbGJhY2tzLnB1c2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpbnN0YW5jZURhdGEub25BdHRhY2goKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBydW5EZWZlcnJlZFJlbmRlckNhbGxiYWNrcyhmaW5hbFByb2plY3Rvck9wdGlvbnMpO1xyXG4gICAgICAgIHJ1bkFmdGVyUmVuZGVyQ2FsbGJhY2tzKGZpbmFsUHJvamVjdG9yT3B0aW9ucyk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZG9tTm9kZTogZmluYWxQcm9qZWN0b3JPcHRpb25zLnJvb3ROb2RlXHJcbiAgICAgICAgfTtcclxuICAgIH0sXHJcbiAgICBjcmVhdGU6IGZ1bmN0aW9uIChpbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksIGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICB9LFxyXG4gICAgbWVyZ2U6IGZ1bmN0aW9uIChlbGVtZW50LCBpbnN0YW5jZSwgcHJvamVjdGlvbk9wdGlvbnMpIHtcclxuICAgICAgICBpZiAocHJvamVjdGlvbk9wdGlvbnMgPT09IHZvaWQgMCkgeyBwcm9qZWN0aW9uT3B0aW9ucyA9IHt9OyB9XHJcbiAgICAgICAgcHJvamVjdGlvbk9wdGlvbnMubWVyZ2UgPSB0cnVlO1xyXG4gICAgICAgIHByb2plY3Rpb25PcHRpb25zLm1lcmdlRWxlbWVudCA9IGVsZW1lbnQ7XHJcbiAgICAgICAgdmFyIHByb2plY3Rpb24gPSB0aGlzLmFwcGVuZChlbGVtZW50LnBhcmVudE5vZGUsIGluc3RhbmNlLCBwcm9qZWN0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgdmFyIHByb2plY3RvclN0YXRlID0gcHJvamVjdG9yU3RhdGVNYXAuZ2V0KGluc3RhbmNlKTtcclxuICAgICAgICBwcm9qZWN0b3JTdGF0ZS5tZXJnZSA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiBwcm9qZWN0aW9uO1xyXG4gICAgfVxyXG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS92ZG9tLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9AZG9qby9mcmFtZXdvcmsvd2lkZ2V0LWNvcmUvdmRvbS5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKHRydWUpO1xuLy8gaW1wb3J0c1xuXG5cbi8vIG1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiLnNVbVVpNFNoIHtcXHJcXG5cXHRoZWlnaHQ6IDEwMCU7XFxyXFxuXFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbn1cXHJcXG5cXHJcXG4uXzJNazZSZHFhIHtcXHJcXG5cXHRjb2xvcjogI2ZmZjtcXHJcXG5cXHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxyXFxuXFx0bWFyZ2luOiAwIDYuNHB4O1xcclxcblxcdHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG5cXHRkaXNwbGF5OiAtd2Via2l0LWJveDtcXHJcXG5cXHRkaXNwbGF5OiAtbXMtZmxleGJveDtcXHJcXG5cXHRkaXNwbGF5OiBmbGV4O1xcclxcblxcdC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7XFxyXFxuXFx0LXdlYmtpdC1ib3gtZGlyZWN0aW9uOiBub3JtYWw7XFxyXFxuXFx0ICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcclxcblxcdCAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXHJcXG5cXHQtd2Via2l0LWJveC1wYWNrOiBjZW50ZXI7XFxyXFxuXFx0ICAgIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjtcXHJcXG5cXHQgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcblxcdGhlaWdodDogNDhweDtcXHJcXG5cXHRjdXJzb3I6IHBvaW50ZXI7XFxyXFxufVxcclxcblxcclxcbi5fMk1rNlJkcWE6OmFmdGVyIHtcXHJcXG5cXHRkaXNwbGF5OiBibG9jaztcXHJcXG5cXHRjb250ZW50OiBcXFwiXFxcIjtcXHJcXG5cXHRiYWNrZ3JvdW5kOiAjZmZmO1xcclxcblxcdGhlaWdodDogMnB4O1xcclxcblxcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG5cXHR3aWR0aDogMTAwJTtcXHJcXG5cXHRib3R0b206IDA7XFxyXFxuXFx0LXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAuM3MgZWFzZS1vdXQ7XFxyXFxuXFx0dHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gLjNzIGVhc2Utb3V0O1xcclxcblxcdHRyYW5zaXRpb246IHRyYW5zZm9ybSAuM3MgZWFzZS1vdXQ7XFxyXFxuXFx0dHJhbnNpdGlvbjogdHJhbnNmb3JtIC4zcyBlYXNlLW91dCwgLXdlYmtpdC10cmFuc2Zvcm0gLjNzIGVhc2Utb3V0O1xcclxcblxcdC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDNweCk7XFxyXFxuXFx0ICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoM3B4KTtcXHJcXG59XFxyXFxuXFxyXFxuLl8xLWYzSXRPaDo6YWZ0ZXIge1xcclxcblxcdC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xcclxcblxcdCAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xcclxcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiQzovVXNlcnMvSUVVc2VyL0Rlc2t0b3AvY2xpLWJ1aWxkLXdpZGdldC90ZXN0LWFwcC9zcmMvbWVudS1pdGVtL21lbnVJdGVtLm0uY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0NBQ0MsYUFBYTtDQUNiLHNCQUFzQjtDQUN0Qjs7QUFFRDtDQUNDLFlBQVk7Q0FDWixzQkFBc0I7Q0FDdEIsZ0JBQWdCO0NBQ2hCLG1CQUFtQjtDQUNuQixxQkFBcUI7Q0FDckIscUJBQXFCO0NBQ3JCLGNBQWM7Q0FDZCw2QkFBNkI7Q0FDN0IsOEJBQThCO0tBQzFCLDJCQUEyQjtTQUN2Qix1QkFBdUI7Q0FDL0IseUJBQXlCO0tBQ3JCLHNCQUFzQjtTQUNsQix3QkFBd0I7Q0FDaEMsYUFBYTtDQUNiLGdCQUFnQjtDQUNoQjs7QUFFRDtDQUNDLGVBQWU7Q0FDZixZQUFZO0NBQ1osaUJBQWlCO0NBQ2pCLFlBQVk7Q0FDWixtQkFBbUI7Q0FDbkIsWUFBWTtDQUNaLFVBQVU7Q0FDVixtREFBbUQ7Q0FDbkQsMkNBQTJDO0NBQzNDLG1DQUFtQztDQUNuQyxtRUFBbUU7Q0FDbkUsbUNBQW1DO1NBQzNCLDJCQUEyQjtDQUNuQzs7QUFFRDtDQUNDLGlDQUFpQztTQUN6Qix5QkFBeUI7Q0FDakNcIixcImZpbGVcIjpcIm1lbnVJdGVtLm0uY3NzXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5yb290IHtcXHJcXG5cXHRoZWlnaHQ6IDEwMCU7XFxyXFxuXFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbn1cXHJcXG5cXHJcXG4uaXRlbSB7XFxyXFxuXFx0Y29sb3I6ICNmZmY7XFxyXFxuXFx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xcclxcblxcdG1hcmdpbjogMCA2LjRweDtcXHJcXG5cXHRwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuXFx0ZGlzcGxheTogLXdlYmtpdC1ib3g7XFxyXFxuXFx0ZGlzcGxheTogLW1zLWZsZXhib3g7XFxyXFxuXFx0ZGlzcGxheTogZmxleDtcXHJcXG5cXHQtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xcclxcblxcdC13ZWJraXQtYm94LWRpcmVjdGlvbjogbm9ybWFsO1xcclxcblxcdCAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXHJcXG5cXHQgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxyXFxuXFx0LXdlYmtpdC1ib3gtcGFjazogY2VudGVyO1xcclxcblxcdCAgICAtbXMtZmxleC1wYWNrOiBjZW50ZXI7XFxyXFxuXFx0ICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXHJcXG5cXHRoZWlnaHQ6IDQ4cHg7XFxyXFxuXFx0Y3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG5cXHJcXG4uaXRlbTo6YWZ0ZXIge1xcclxcblxcdGRpc3BsYXk6IGJsb2NrO1xcclxcblxcdGNvbnRlbnQ6IFxcXCJcXFwiO1xcclxcblxcdGJhY2tncm91bmQ6ICNmZmY7XFxyXFxuXFx0aGVpZ2h0OiAycHg7XFxyXFxuXFx0cG9zaXRpb246IGFic29sdXRlO1xcclxcblxcdHdpZHRoOiAxMDAlO1xcclxcblxcdGJvdHRvbTogMDtcXHJcXG5cXHQtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIC4zcyBlYXNlLW91dDtcXHJcXG5cXHR0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAuM3MgZWFzZS1vdXQ7XFxyXFxuXFx0dHJhbnNpdGlvbjogdHJhbnNmb3JtIC4zcyBlYXNlLW91dDtcXHJcXG5cXHR0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gLjNzIGVhc2Utb3V0LCAtd2Via2l0LXRyYW5zZm9ybSAuM3MgZWFzZS1vdXQ7XFxyXFxuXFx0LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoM3B4KTtcXHJcXG5cXHQgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgzcHgpO1xcclxcbn1cXHJcXG5cXHJcXG4uc2VsZWN0ZWQ6OmFmdGVyIHtcXHJcXG5cXHQtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcXHJcXG5cXHQgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcXHJcXG59XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG5cbi8vIGV4cG9ydHNcbmV4cG9ydHMubG9jYWxzID0ge1wiIF9rZXlcIjogXCJ0ZXN0LWFwcC9tZW51SXRlbVwiLFxuXHRcInJvb3RcIjogXCJzVW1VaTRTaFwiLFxuXHRcIml0ZW1cIjogXCJfMk1rNlJkcWFcIixcblx0XCJzZWxlY3RlZFwiOiBcIl8xLWYzSXRPaFwiXG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWRlY29yYXRvci1sb2FkZXIhLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlcj97XCJtb2R1bGVzXCI6dHJ1ZSxcInNvdXJjZU1hcFwiOnRydWUsXCJpbXBvcnRMb2FkZXJzXCI6MSxcImxvY2FsSWRlbnROYW1lXCI6XCJbaGFzaDpiYXNlNjQ6OF1cIn0hLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvbGliP3tcImlkZW50XCI6XCJwb3N0Y3NzXCIsXCJwbHVnaW5zXCI6W251bGwse1widmVyc2lvblwiOlwiNi4wLjIzXCIsXCJwbHVnaW5zXCI6W251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLFwicG9zdGNzc1BsdWdpblwiOlwicG9zdGNzcy1jc3NuZXh0XCIsXCJwb3N0Y3NzVmVyc2lvblwiOlwiNi4wLjIzXCJ9XX0hLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZHRzLWxvYWRlcj90eXBlPWNzcyEuL3NyYy9tZW51LWl0ZW0vbWVudUl0ZW0ubS5jc3Ncbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWRlY29yYXRvci1sb2FkZXIvaW5kZXguanMhLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz97XCJtb2R1bGVzXCI6dHJ1ZSxcInNvdXJjZU1hcFwiOnRydWUsXCJpbXBvcnRMb2FkZXJzXCI6MSxcImxvY2FsSWRlbnROYW1lXCI6XCJbaGFzaDpiYXNlNjQ6OF1cIn0hLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvbGliL2luZGV4LmpzP3tcImlkZW50XCI6XCJwb3N0Y3NzXCIsXCJwbHVnaW5zXCI6W251bGwse1widmVyc2lvblwiOlwiNi4wLjIzXCIsXCJwbHVnaW5zXCI6W251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLFwicG9zdGNzc1BsdWdpblwiOlwicG9zdGNzcy1jc3NuZXh0XCIsXCJwb3N0Y3NzVmVyc2lvblwiOlwiNi4wLjIzXCJ9XX0hLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZHRzLWxvYWRlci9pbmRleC5qcz90eXBlPWNzcyEuL3NyYy9tZW51LWl0ZW0vbWVudUl0ZW0ubS5jc3Ncbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKSh0cnVlKTtcbi8vIGltcG9ydHNcblxuXG4vLyBtb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIi5fM2JBNmpkU24ge1xcclxcblxcdHdpZHRoOiAxMDAlO1xcclxcblxcdHRvcDogMDtcXHJcXG5cXHRoZWlnaHQ6IDQ4cHg7XFxyXFxuXFx0ei1pbmRleDogMTAwO1xcclxcblxcdGJhY2tncm91bmQtY29sb3I6ICMxZDFmMjA7XFxyXFxufVxcclxcblxcclxcbi5fMWVvR2Zxa3Uge1xcclxcblxcdGhlaWdodDogMTAwJTtcXHJcXG5cXHRtYXJnaW46IDAgYXV0bztcXHJcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIkM6L1VzZXJzL0lFVXNlci9EZXNrdG9wL2NsaS1idWlsZC13aWRnZXQvdGVzdC1hcHAvc3JjL21lbnUvbWVudS5tLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtDQUNDLFlBQVk7Q0FDWixPQUFPO0NBQ1AsYUFBYTtDQUNiLGFBQWE7Q0FDYiwwQkFBMEI7Q0FDMUI7O0FBRUQ7Q0FDQyxhQUFhO0NBQ2IsZUFBZTtDQUNmXCIsXCJmaWxlXCI6XCJtZW51Lm0uY3NzXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5yb290IHtcXHJcXG5cXHR3aWR0aDogMTAwJTtcXHJcXG5cXHR0b3A6IDA7XFxyXFxuXFx0aGVpZ2h0OiA0OHB4O1xcclxcblxcdHotaW5kZXg6IDEwMDtcXHJcXG5cXHRiYWNrZ3JvdW5kLWNvbG9yOiAjMWQxZjIwO1xcclxcbn1cXHJcXG5cXHJcXG4ubWVudUNvbnRhaW5lciB7XFxyXFxuXFx0aGVpZ2h0OiAxMDAlO1xcclxcblxcdG1hcmdpbjogMCBhdXRvO1xcclxcbn1cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcblxuLy8gZXhwb3J0c1xuZXhwb3J0cy5sb2NhbHMgPSB7XCIgX2tleVwiOiBcInRlc3QtYXBwL21lbnVcIixcblx0XCJyb290XCI6IFwiXzNiQTZqZFNuXCIsXG5cdFwibWVudUNvbnRhaW5lclwiOiBcIl8xZW9HZnFrdVwiXG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWRlY29yYXRvci1sb2FkZXIhLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlcj97XCJtb2R1bGVzXCI6dHJ1ZSxcInNvdXJjZU1hcFwiOnRydWUsXCJpbXBvcnRMb2FkZXJzXCI6MSxcImxvY2FsSWRlbnROYW1lXCI6XCJbaGFzaDpiYXNlNjQ6OF1cIn0hLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvbGliP3tcImlkZW50XCI6XCJwb3N0Y3NzXCIsXCJwbHVnaW5zXCI6W251bGwse1widmVyc2lvblwiOlwiNi4wLjIzXCIsXCJwbHVnaW5zXCI6W251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLFwicG9zdGNzc1BsdWdpblwiOlwicG9zdGNzcy1jc3NuZXh0XCIsXCJwb3N0Y3NzVmVyc2lvblwiOlwiNi4wLjIzXCJ9XX0hLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZHRzLWxvYWRlcj90eXBlPWNzcyEuL3NyYy9tZW51L21lbnUubS5jc3Ncbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWRlY29yYXRvci1sb2FkZXIvaW5kZXguanMhLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz97XCJtb2R1bGVzXCI6dHJ1ZSxcInNvdXJjZU1hcFwiOnRydWUsXCJpbXBvcnRMb2FkZXJzXCI6MSxcImxvY2FsSWRlbnROYW1lXCI6XCJbaGFzaDpiYXNlNjQ6OF1cIn0hLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvbGliL2luZGV4LmpzP3tcImlkZW50XCI6XCJwb3N0Y3NzXCIsXCJwbHVnaW5zXCI6W251bGwse1widmVyc2lvblwiOlwiNi4wLjIzXCIsXCJwbHVnaW5zXCI6W251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLFwicG9zdGNzc1BsdWdpblwiOlwicG9zdGNzcy1jc3NuZXh0XCIsXCJwb3N0Y3NzVmVyc2lvblwiOlwiNi4wLjIzXCJ9XX0hLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZHRzLWxvYWRlci9pbmRleC5qcz90eXBlPWNzcyEuL3NyYy9tZW51L21lbnUubS5jc3Ncbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiLypcblx0TUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcblx0QXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cbi8vIGNzcyBiYXNlIGNvZGUsIGluamVjdGVkIGJ5IHRoZSBjc3MtbG9hZGVyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHVzZVNvdXJjZU1hcCkge1xuXHR2YXIgbGlzdCA9IFtdO1xuXG5cdC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcblx0bGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuXHRcdHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuXHRcdFx0dmFyIGNvbnRlbnQgPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0sIHVzZVNvdXJjZU1hcCk7XG5cdFx0XHRpZihpdGVtWzJdKSB7XG5cdFx0XHRcdHJldHVybiBcIkBtZWRpYSBcIiArIGl0ZW1bMl0gKyBcIntcIiArIGNvbnRlbnQgKyBcIn1cIjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBjb250ZW50O1xuXHRcdFx0fVxuXHRcdH0pLmpvaW4oXCJcIik7XG5cdH07XG5cblx0Ly8gaW1wb3J0IGEgbGlzdCBvZiBtb2R1bGVzIGludG8gdGhlIGxpc3Rcblx0bGlzdC5pID0gZnVuY3Rpb24obW9kdWxlcywgbWVkaWFRdWVyeSkge1xuXHRcdGlmKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKVxuXHRcdFx0bW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgXCJcIl1dO1xuXHRcdHZhciBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzID0ge307XG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBpZCA9IHRoaXNbaV1bMF07XG5cdFx0XHRpZih0eXBlb2YgaWQgPT09IFwibnVtYmVyXCIpXG5cdFx0XHRcdGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaWRdID0gdHJ1ZTtcblx0XHR9XG5cdFx0Zm9yKGkgPSAwOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGl0ZW0gPSBtb2R1bGVzW2ldO1xuXHRcdFx0Ly8gc2tpcCBhbHJlYWR5IGltcG9ydGVkIG1vZHVsZVxuXHRcdFx0Ly8gdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBub3QgMTAwJSBwZXJmZWN0IGZvciB3ZWlyZCBtZWRpYSBxdWVyeSBjb21iaW5hdGlvbnNcblx0XHRcdC8vICB3aGVuIGEgbW9kdWxlIGlzIGltcG9ydGVkIG11bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50IG1lZGlhIHF1ZXJpZXMuXG5cdFx0XHQvLyAgSSBob3BlIHRoaXMgd2lsbCBuZXZlciBvY2N1ciAoSGV5IHRoaXMgd2F5IHdlIGhhdmUgc21hbGxlciBidW5kbGVzKVxuXHRcdFx0aWYodHlwZW9mIGl0ZW1bMF0gIT09IFwibnVtYmVyXCIgfHwgIWFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcblx0XHRcdFx0aWYobWVkaWFRdWVyeSAmJiAhaXRlbVsyXSkge1xuXHRcdFx0XHRcdGl0ZW1bMl0gPSBtZWRpYVF1ZXJ5O1xuXHRcdFx0XHR9IGVsc2UgaWYobWVkaWFRdWVyeSkge1xuXHRcdFx0XHRcdGl0ZW1bMl0gPSBcIihcIiArIGl0ZW1bMl0gKyBcIikgYW5kIChcIiArIG1lZGlhUXVlcnkgKyBcIilcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRsaXN0LnB1c2goaXRlbSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRyZXR1cm4gbGlzdDtcbn07XG5cbmZ1bmN0aW9uIGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcoaXRlbSwgdXNlU291cmNlTWFwKSB7XG5cdHZhciBjb250ZW50ID0gaXRlbVsxXSB8fCAnJztcblx0dmFyIGNzc01hcHBpbmcgPSBpdGVtWzNdO1xuXHRpZiAoIWNzc01hcHBpbmcpIHtcblx0XHRyZXR1cm4gY29udGVudDtcblx0fVxuXG5cdGlmICh1c2VTb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgPT09ICdmdW5jdGlvbicpIHtcblx0XHR2YXIgc291cmNlTWFwcGluZyA9IHRvQ29tbWVudChjc3NNYXBwaW5nKTtcblx0XHR2YXIgc291cmNlVVJMcyA9IGNzc01hcHBpbmcuc291cmNlcy5tYXAoZnVuY3Rpb24gKHNvdXJjZSkge1xuXHRcdFx0cmV0dXJuICcvKiMgc291cmNlVVJMPScgKyBjc3NNYXBwaW5nLnNvdXJjZVJvb3QgKyBzb3VyY2UgKyAnICovJ1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIFtjb250ZW50XS5jb25jYXQoc291cmNlVVJMcykuY29uY2F0KFtzb3VyY2VNYXBwaW5nXSkuam9pbignXFxuJyk7XG5cdH1cblxuXHRyZXR1cm4gW2NvbnRlbnRdLmpvaW4oJ1xcbicpO1xufVxuXG4vLyBBZGFwdGVkIGZyb20gY29udmVydC1zb3VyY2UtbWFwIChNSVQpXG5mdW5jdGlvbiB0b0NvbW1lbnQoc291cmNlTWFwKSB7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuXHR2YXIgYmFzZTY0ID0gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSkpKTtcblx0dmFyIGRhdGEgPSAnc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsJyArIGJhc2U2NDtcblxuXHRyZXR1cm4gJy8qIyAnICsgZGF0YSArICcgKi8nO1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImNzc1NlbGVjdFwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJjc3NTZWxlY3RcIl0gPSBmYWN0b3J5KCk7XG59KSh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDogdGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuLyoqKioqKi8gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuLyoqKioqKi8gXHRcdFx0XHRnZXQ6IGdldHRlclxuLyoqKioqKi8gXHRcdFx0fSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDI0KTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGlzVmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRpZiAoIWlzVmFsdWUodmFsdWUpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSBudWxsIG9yIHVuZGVmaW5lZFwiKTtcblx0cmV0dXJuIHZhbHVlO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4pIHtcblx0aWYgKHR5cGVvZiBmbiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKGZuICsgXCIgaXMgbm90IGEgZnVuY3Rpb25cIik7XG5cdHJldHVybiBmbjtcbn07XG5cblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NikoKSA/IFN5bWJvbCA6IF9fd2VicGFja19yZXF1aXJlX18oNjcpO1xuXG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgYXNzaWduICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTApXG4gICwgbm9ybWFsaXplT3B0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMjEpXG4gICwgaXNDYWxsYWJsZSAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNjIpXG4gICwgY29udGFpbnMgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpXG5cbiAgLCBkO1xuXG5kID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZHNjciwgdmFsdWUvKiwgb3B0aW9ucyovKSB7XG5cdHZhciBjLCBlLCB3LCBvcHRpb25zLCBkZXNjO1xuXHRpZiAoKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB8fCAodHlwZW9mIGRzY3IgIT09ICdzdHJpbmcnKSkge1xuXHRcdG9wdGlvbnMgPSB2YWx1ZTtcblx0XHR2YWx1ZSA9IGRzY3I7XG5cdFx0ZHNjciA9IG51bGw7XG5cdH0gZWxzZSB7XG5cdFx0b3B0aW9ucyA9IGFyZ3VtZW50c1syXTtcblx0fVxuXHRpZiAoZHNjciA9PSBudWxsKSB7XG5cdFx0YyA9IHcgPSB0cnVlO1xuXHRcdGUgPSBmYWxzZTtcblx0fSBlbHNlIHtcblx0XHRjID0gY29udGFpbnMuY2FsbChkc2NyLCAnYycpO1xuXHRcdGUgPSBjb250YWlucy5jYWxsKGRzY3IsICdlJyk7XG5cdFx0dyA9IGNvbnRhaW5zLmNhbGwoZHNjciwgJ3cnKTtcblx0fVxuXG5cdGRlc2MgPSB7IHZhbHVlOiB2YWx1ZSwgY29uZmlndXJhYmxlOiBjLCBlbnVtZXJhYmxlOiBlLCB3cml0YWJsZTogdyB9O1xuXHRyZXR1cm4gIW9wdGlvbnMgPyBkZXNjIDogYXNzaWduKG5vcm1hbGl6ZU9wdHMob3B0aW9ucyksIGRlc2MpO1xufTtcblxuZC5ncyA9IGZ1bmN0aW9uIChkc2NyLCBnZXQsIHNldC8qLCBvcHRpb25zKi8pIHtcblx0dmFyIGMsIGUsIG9wdGlvbnMsIGRlc2M7XG5cdGlmICh0eXBlb2YgZHNjciAhPT0gJ3N0cmluZycpIHtcblx0XHRvcHRpb25zID0gc2V0O1xuXHRcdHNldCA9IGdldDtcblx0XHRnZXQgPSBkc2NyO1xuXHRcdGRzY3IgPSBudWxsO1xuXHR9IGVsc2Uge1xuXHRcdG9wdGlvbnMgPSBhcmd1bWVudHNbM107XG5cdH1cblx0aWYgKGdldCA9PSBudWxsKSB7XG5cdFx0Z2V0ID0gdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKCFpc0NhbGxhYmxlKGdldCkpIHtcblx0XHRvcHRpb25zID0gZ2V0O1xuXHRcdGdldCA9IHNldCA9IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmIChzZXQgPT0gbnVsbCkge1xuXHRcdHNldCA9IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmICghaXNDYWxsYWJsZShzZXQpKSB7XG5cdFx0b3B0aW9ucyA9IHNldDtcblx0XHRzZXQgPSB1bmRlZmluZWQ7XG5cdH1cblx0aWYgKGRzY3IgPT0gbnVsbCkge1xuXHRcdGMgPSB0cnVlO1xuXHRcdGUgPSBmYWxzZTtcblx0fSBlbHNlIHtcblx0XHRjID0gY29udGFpbnMuY2FsbChkc2NyLCAnYycpO1xuXHRcdGUgPSBjb250YWlucy5jYWxsKGRzY3IsICdlJyk7XG5cdH1cblxuXHRkZXNjID0geyBnZXQ6IGdldCwgc2V0OiBzZXQsIGNvbmZpZ3VyYWJsZTogYywgZW51bWVyYWJsZTogZSB9O1xuXHRyZXR1cm4gIW9wdGlvbnMgPyBkZXNjIDogYXNzaWduKG5vcm1hbGl6ZU9wdHMob3B0aW9ucyksIGRlc2MpO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIF91bmRlZmluZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3KSgpOyAvLyBTdXBwb3J0IEVTMyBlbmdpbmVzXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbCkge1xuIHJldHVybiAodmFsICE9PSBfdW5kZWZpbmVkKSAmJiAodmFsICE9PSBudWxsKTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHR0cnVlRnVuYzogZnVuY3Rpb24gdHJ1ZUZ1bmMoKXtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblx0ZmFsc2VGdW5jOiBmdW5jdGlvbiBmYWxzZUZ1bmMoKXtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbi8qKiovIH0pLFxuLyogNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpKClcblx0PyBPYmplY3Quc2V0UHJvdG90eXBlT2Zcblx0OiBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTtcblxuXG4vKioqLyB9KSxcbi8qIDcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIG9ialRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ1xuICAsIGlkID0gb2JqVG9TdHJpbmcuY2FsbChcblx0KGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gYXJndW1lbnRzO1xuXHR9KSgpXG4pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRyZXR1cm4gb2JqVG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09IGlkO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIG9ialRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZywgaWQgPSBvYmpUb1N0cmluZy5jYWxsKFwiXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRyZXR1cm4gKFxuXHRcdHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fFxuXHRcdCh2YWx1ZSAmJlxuXHRcdFx0dHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG5cdFx0XHQodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgfHwgb2JqVG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09IGlkKSkgfHxcblx0XHRmYWxzZVxuXHQpO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuLy9UeXBlcyBvZiBlbGVtZW50cyBmb3VuZCBpbiB0aGUgRE9NXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0VGV4dDogXCJ0ZXh0XCIsIC8vVGV4dFxuXHREaXJlY3RpdmU6IFwiZGlyZWN0aXZlXCIsIC8vPD8gLi4uID8+XG5cdENvbW1lbnQ6IFwiY29tbWVudFwiLCAvLzwhLS0gLi4uIC0tPlxuXHRTY3JpcHQ6IFwic2NyaXB0XCIsIC8vPHNjcmlwdD4gdGFnc1xuXHRTdHlsZTogXCJzdHlsZVwiLCAvLzxzdHlsZT4gdGFnc1xuXHRUYWc6IFwidGFnXCIsIC8vQW55IHRhZ1xuXHRDREFUQTogXCJjZGF0YVwiLCAvLzwhW0NEQVRBWyAuLi4gXV0+XG5cdERvY3R5cGU6IFwiZG9jdHlwZVwiLFxuXG5cdGlzVGFnOiBmdW5jdGlvbihlbGVtKXtcblx0XHRyZXR1cm4gZWxlbS50eXBlID09PSBcInRhZ1wiIHx8IGVsZW0udHlwZSA9PT0gXCJzY3JpcHRcIiB8fCBlbGVtLnR5cGUgPT09IFwic3R5bGVcIjtcblx0fVxufTtcblxuXG4vKioqLyB9KSxcbi8qIDEwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NykoKVxuXHQ/IE9iamVjdC5hc3NpZ25cblx0OiBfX3dlYnBhY2tfcmVxdWlyZV9fKDU4KTtcblxuXG4vKioqLyB9KSxcbi8qIDExICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MykoKVxuXHQ/IFN0cmluZy5wcm90b3R5cGUuY29udGFpbnNcblx0OiBfX3dlYnBhY2tfcmVxdWlyZV9fKDY0KTtcblxuXG4vKioqLyB9KSxcbi8qIDEyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBjbGVhciAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTYpXG4gICwgYXNzaWduICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKVxuICAsIGNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVxuICAsIHZhbHVlICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKVxuICAsIGQgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKVxuICAsIGF1dG9CaW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NClcbiAgLCBTeW1ib2wgICA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSwgZGVmaW5lUHJvcGVydGllcyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLCBJdGVyYXRvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBJdGVyYXRvciA9IGZ1bmN0aW9uIChsaXN0LCBjb250ZXh0KSB7XG5cdGlmICghKHRoaXMgaW5zdGFuY2VvZiBJdGVyYXRvcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDb25zdHJ1Y3RvciByZXF1aXJlcyAnbmV3J1wiKTtcblx0ZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG5cdFx0X19saXN0X186IGQoXCJ3XCIsIHZhbHVlKGxpc3QpKSxcblx0XHRfX2NvbnRleHRfXzogZChcIndcIiwgY29udGV4dCksXG5cdFx0X19uZXh0SW5kZXhfXzogZChcIndcIiwgMClcblx0fSk7XG5cdGlmICghY29udGV4dCkgcmV0dXJuO1xuXHRjYWxsYWJsZShjb250ZXh0Lm9uKTtcblx0Y29udGV4dC5vbihcIl9hZGRcIiwgdGhpcy5fb25BZGQpO1xuXHRjb250ZXh0Lm9uKFwiX2RlbGV0ZVwiLCB0aGlzLl9vbkRlbGV0ZSk7XG5cdGNvbnRleHQub24oXCJfY2xlYXJcIiwgdGhpcy5fb25DbGVhcik7XG59O1xuXG4vLyBJbnRlcm5hbCAlSXRlcmF0b3JQcm90b3R5cGUlIGRvZXNuJ3QgZXhwb3NlIGl0cyBjb25zdHJ1Y3RvclxuZGVsZXRlIEl0ZXJhdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvcjtcblxuZGVmaW5lUHJvcGVydGllcyhcblx0SXRlcmF0b3IucHJvdG90eXBlLFxuXHRhc3NpZ24oXG5cdFx0e1xuXHRcdFx0X25leHQ6IGQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR2YXIgaTtcblx0XHRcdFx0aWYgKCF0aGlzLl9fbGlzdF9fKSByZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAodGhpcy5fX3JlZG9fXykge1xuXHRcdFx0XHRcdGkgPSB0aGlzLl9fcmVkb19fLnNoaWZ0KCk7XG5cdFx0XHRcdFx0aWYgKGkgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRoaXMuX19uZXh0SW5kZXhfXyA8IHRoaXMuX19saXN0X18ubGVuZ3RoKSByZXR1cm4gdGhpcy5fX25leHRJbmRleF9fKys7XG5cdFx0XHRcdHRoaXMuX3VuQmluZCgpO1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fSksXG5cdFx0XHRuZXh0OiBkKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2NyZWF0ZVJlc3VsdCh0aGlzLl9uZXh0KCkpO1xuXHRcdFx0fSksXG5cdFx0XHRfY3JlYXRlUmVzdWx0OiBkKGZ1bmN0aW9uIChpKSB7XG5cdFx0XHRcdGlmIChpID09PSB1bmRlZmluZWQpIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcblx0XHRcdFx0cmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiB0aGlzLl9yZXNvbHZlKGkpIH07XG5cdFx0XHR9KSxcblx0XHRcdF9yZXNvbHZlOiBkKGZ1bmN0aW9uIChpKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9fbGlzdF9fW2ldO1xuXHRcdFx0fSksXG5cdFx0XHRfdW5CaW5kOiBkKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dGhpcy5fX2xpc3RfXyA9IG51bGw7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLl9fcmVkb19fO1xuXHRcdFx0XHRpZiAoIXRoaXMuX19jb250ZXh0X18pIHJldHVybjtcblx0XHRcdFx0dGhpcy5fX2NvbnRleHRfXy5vZmYoXCJfYWRkXCIsIHRoaXMuX29uQWRkKTtcblx0XHRcdFx0dGhpcy5fX2NvbnRleHRfXy5vZmYoXCJfZGVsZXRlXCIsIHRoaXMuX29uRGVsZXRlKTtcblx0XHRcdFx0dGhpcy5fX2NvbnRleHRfXy5vZmYoXCJfY2xlYXJcIiwgdGhpcy5fb25DbGVhcik7XG5cdFx0XHRcdHRoaXMuX19jb250ZXh0X18gPSBudWxsO1xuXHRcdFx0fSksXG5cdFx0XHR0b1N0cmluZzogZChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBcIltvYmplY3QgXCIgKyAodGhpc1tTeW1ib2wudG9TdHJpbmdUYWddIHx8IFwiT2JqZWN0XCIpICsgXCJdXCI7XG5cdFx0XHR9KVxuXHRcdH0sXG5cdFx0YXV0b0JpbmQoe1xuXHRcdFx0X29uQWRkOiBkKGZ1bmN0aW9uIChpbmRleCkge1xuXHRcdFx0XHRpZiAoaW5kZXggPj0gdGhpcy5fX25leHRJbmRleF9fKSByZXR1cm47XG5cdFx0XHRcdCsrdGhpcy5fX25leHRJbmRleF9fO1xuXHRcdFx0XHRpZiAoIXRoaXMuX19yZWRvX18pIHtcblx0XHRcdFx0XHRkZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIl9fcmVkb19fXCIsIGQoXCJjXCIsIFtpbmRleF0pKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fX3JlZG9fXy5mb3JFYWNoKGZ1bmN0aW9uIChyZWRvLCBpKSB7XG5cdFx0XHRcdFx0aWYgKHJlZG8gPj0gaW5kZXgpIHRoaXMuX19yZWRvX19baV0gPSArK3JlZG87XG5cdFx0XHRcdH0sIHRoaXMpO1xuXHRcdFx0XHR0aGlzLl9fcmVkb19fLnB1c2goaW5kZXgpO1xuXHRcdFx0fSksXG5cdFx0XHRfb25EZWxldGU6IGQoZnVuY3Rpb24gKGluZGV4KSB7XG5cdFx0XHRcdHZhciBpO1xuXHRcdFx0XHRpZiAoaW5kZXggPj0gdGhpcy5fX25leHRJbmRleF9fKSByZXR1cm47XG5cdFx0XHRcdC0tdGhpcy5fX25leHRJbmRleF9fO1xuXHRcdFx0XHRpZiAoIXRoaXMuX19yZWRvX18pIHJldHVybjtcblx0XHRcdFx0aSA9IHRoaXMuX19yZWRvX18uaW5kZXhPZihpbmRleCk7XG5cdFx0XHRcdGlmIChpICE9PSAtMSkgdGhpcy5fX3JlZG9fXy5zcGxpY2UoaSwgMSk7XG5cdFx0XHRcdHRoaXMuX19yZWRvX18uZm9yRWFjaChmdW5jdGlvbiAocmVkbywgaikge1xuXHRcdFx0XHRcdGlmIChyZWRvID4gaW5kZXgpIHRoaXMuX19yZWRvX19bal0gPSAtLXJlZG87XG5cdFx0XHRcdH0sIHRoaXMpO1xuXHRcdFx0fSksXG5cdFx0XHRfb25DbGVhcjogZChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGlmICh0aGlzLl9fcmVkb19fKSBjbGVhci5jYWxsKHRoaXMuX19yZWRvX18pO1xuXHRcdFx0XHR0aGlzLl9fbmV4dEluZGV4X18gPSAwO1xuXHRcdFx0fSlcblx0XHR9KVxuXHQpXG4pO1xuXG5kZWZpbmVQcm9wZXJ0eShcblx0SXRlcmF0b3IucHJvdG90eXBlLFxuXHRTeW1ib2wuaXRlcmF0b3IsXG5cdGQoZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzO1xuXHR9KVxuKTtcblxuXG4vKioqLyB9KSxcbi8qIDEzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0ge1wiYW1wXCI6XCImXCIsXCJhcG9zXCI6XCInXCIsXCJndFwiOlwiPlwiLFwibHRcIjpcIjxcIixcInF1b3RcIjpcIlxcXCJcIn1cblxuLyoqKi8gfSksXG4vKiAxNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcIkFhY3V0ZVwiOlwiw4FcIixcImFhY3V0ZVwiOlwiw6FcIixcIkFicmV2ZVwiOlwixIJcIixcImFicmV2ZVwiOlwixINcIixcImFjXCI6XCLiiL5cIixcImFjZFwiOlwi4oi/XCIsXCJhY0VcIjpcIuKIvsyzXCIsXCJBY2lyY1wiOlwiw4JcIixcImFjaXJjXCI6XCLDolwiLFwiYWN1dGVcIjpcIsK0XCIsXCJBY3lcIjpcItCQXCIsXCJhY3lcIjpcItCwXCIsXCJBRWxpZ1wiOlwiw4ZcIixcImFlbGlnXCI6XCLDplwiLFwiYWZcIjpcIuKBoVwiLFwiQWZyXCI6XCLwnZSEXCIsXCJhZnJcIjpcIvCdlJ5cIixcIkFncmF2ZVwiOlwiw4BcIixcImFncmF2ZVwiOlwiw6BcIixcImFsZWZzeW1cIjpcIuKEtVwiLFwiYWxlcGhcIjpcIuKEtVwiLFwiQWxwaGFcIjpcIs6RXCIsXCJhbHBoYVwiOlwizrFcIixcIkFtYWNyXCI6XCLEgFwiLFwiYW1hY3JcIjpcIsSBXCIsXCJhbWFsZ1wiOlwi4qi/XCIsXCJhbXBcIjpcIiZcIixcIkFNUFwiOlwiJlwiLFwiYW5kYW5kXCI6XCLiqZVcIixcIkFuZFwiOlwi4qmTXCIsXCJhbmRcIjpcIuKIp1wiLFwiYW5kZFwiOlwi4qmcXCIsXCJhbmRzbG9wZVwiOlwi4qmYXCIsXCJhbmR2XCI6XCLiqZpcIixcImFuZ1wiOlwi4oigXCIsXCJhbmdlXCI6XCLipqRcIixcImFuZ2xlXCI6XCLiiKBcIixcImFuZ21zZGFhXCI6XCLipqhcIixcImFuZ21zZGFiXCI6XCLipqlcIixcImFuZ21zZGFjXCI6XCLipqpcIixcImFuZ21zZGFkXCI6XCLipqtcIixcImFuZ21zZGFlXCI6XCLipqxcIixcImFuZ21zZGFmXCI6XCLipq1cIixcImFuZ21zZGFnXCI6XCLipq5cIixcImFuZ21zZGFoXCI6XCLipq9cIixcImFuZ21zZFwiOlwi4oihXCIsXCJhbmdydFwiOlwi4oifXCIsXCJhbmdydHZiXCI6XCLiir5cIixcImFuZ3J0dmJkXCI6XCLipp1cIixcImFuZ3NwaFwiOlwi4oiiXCIsXCJhbmdzdFwiOlwiw4VcIixcImFuZ3phcnJcIjpcIuKNvFwiLFwiQW9nb25cIjpcIsSEXCIsXCJhb2dvblwiOlwixIVcIixcIkFvcGZcIjpcIvCdlLhcIixcImFvcGZcIjpcIvCdlZJcIixcImFwYWNpclwiOlwi4qmvXCIsXCJhcFwiOlwi4omIXCIsXCJhcEVcIjpcIuKpsFwiLFwiYXBlXCI6XCLiiYpcIixcImFwaWRcIjpcIuKJi1wiLFwiYXBvc1wiOlwiJ1wiLFwiQXBwbHlGdW5jdGlvblwiOlwi4oGhXCIsXCJhcHByb3hcIjpcIuKJiFwiLFwiYXBwcm94ZXFcIjpcIuKJilwiLFwiQXJpbmdcIjpcIsOFXCIsXCJhcmluZ1wiOlwiw6VcIixcIkFzY3JcIjpcIvCdkpxcIixcImFzY3JcIjpcIvCdkrZcIixcIkFzc2lnblwiOlwi4omUXCIsXCJhc3RcIjpcIipcIixcImFzeW1wXCI6XCLiiYhcIixcImFzeW1wZXFcIjpcIuKJjVwiLFwiQXRpbGRlXCI6XCLDg1wiLFwiYXRpbGRlXCI6XCLDo1wiLFwiQXVtbFwiOlwiw4RcIixcImF1bWxcIjpcIsOkXCIsXCJhd2NvbmludFwiOlwi4oizXCIsXCJhd2ludFwiOlwi4qiRXCIsXCJiYWNrY29uZ1wiOlwi4omMXCIsXCJiYWNrZXBzaWxvblwiOlwiz7ZcIixcImJhY2twcmltZVwiOlwi4oC1XCIsXCJiYWNrc2ltXCI6XCLiiL1cIixcImJhY2tzaW1lcVwiOlwi4ouNXCIsXCJCYWNrc2xhc2hcIjpcIuKIllwiLFwiQmFydlwiOlwi4qunXCIsXCJiYXJ2ZWVcIjpcIuKKvVwiLFwiYmFyd2VkXCI6XCLijIVcIixcIkJhcndlZFwiOlwi4oyGXCIsXCJiYXJ3ZWRnZVwiOlwi4oyFXCIsXCJiYnJrXCI6XCLijrVcIixcImJicmt0YnJrXCI6XCLijrZcIixcImJjb25nXCI6XCLiiYxcIixcIkJjeVwiOlwi0JFcIixcImJjeVwiOlwi0LFcIixcImJkcXVvXCI6XCLigJ5cIixcImJlY2F1c1wiOlwi4oi1XCIsXCJiZWNhdXNlXCI6XCLiiLVcIixcIkJlY2F1c2VcIjpcIuKItVwiLFwiYmVtcHR5dlwiOlwi4qawXCIsXCJiZXBzaVwiOlwiz7ZcIixcImJlcm5vdVwiOlwi4oSsXCIsXCJCZXJub3VsbGlzXCI6XCLihKxcIixcIkJldGFcIjpcIs6SXCIsXCJiZXRhXCI6XCLOslwiLFwiYmV0aFwiOlwi4oS2XCIsXCJiZXR3ZWVuXCI6XCLiiaxcIixcIkJmclwiOlwi8J2UhVwiLFwiYmZyXCI6XCLwnZSfXCIsXCJiaWdjYXBcIjpcIuKLglwiLFwiYmlnY2lyY1wiOlwi4pevXCIsXCJiaWdjdXBcIjpcIuKLg1wiLFwiYmlnb2RvdFwiOlwi4qiAXCIsXCJiaWdvcGx1c1wiOlwi4qiBXCIsXCJiaWdvdGltZXNcIjpcIuKoglwiLFwiYmlnc3FjdXBcIjpcIuKohlwiLFwiYmlnc3RhclwiOlwi4piFXCIsXCJiaWd0cmlhbmdsZWRvd25cIjpcIuKWvVwiLFwiYmlndHJpYW5nbGV1cFwiOlwi4pazXCIsXCJiaWd1cGx1c1wiOlwi4qiEXCIsXCJiaWd2ZWVcIjpcIuKLgVwiLFwiYmlnd2VkZ2VcIjpcIuKLgFwiLFwiYmthcm93XCI6XCLipI1cIixcImJsYWNrbG96ZW5nZVwiOlwi4qerXCIsXCJibGFja3NxdWFyZVwiOlwi4paqXCIsXCJibGFja3RyaWFuZ2xlXCI6XCLilrRcIixcImJsYWNrdHJpYW5nbGVkb3duXCI6XCLilr5cIixcImJsYWNrdHJpYW5nbGVsZWZ0XCI6XCLil4JcIixcImJsYWNrdHJpYW5nbGVyaWdodFwiOlwi4pa4XCIsXCJibGFua1wiOlwi4pCjXCIsXCJibGsxMlwiOlwi4paSXCIsXCJibGsxNFwiOlwi4paRXCIsXCJibGszNFwiOlwi4paTXCIsXCJibG9ja1wiOlwi4paIXCIsXCJibmVcIjpcIj3ig6VcIixcImJuZXF1aXZcIjpcIuKJoeKDpVwiLFwiYk5vdFwiOlwi4qutXCIsXCJibm90XCI6XCLijJBcIixcIkJvcGZcIjpcIvCdlLlcIixcImJvcGZcIjpcIvCdlZNcIixcImJvdFwiOlwi4oqlXCIsXCJib3R0b21cIjpcIuKKpVwiLFwiYm93dGllXCI6XCLii4hcIixcImJveGJveFwiOlwi4qeJXCIsXCJib3hkbFwiOlwi4pSQXCIsXCJib3hkTFwiOlwi4pWVXCIsXCJib3hEbFwiOlwi4pWWXCIsXCJib3hETFwiOlwi4pWXXCIsXCJib3hkclwiOlwi4pSMXCIsXCJib3hkUlwiOlwi4pWSXCIsXCJib3hEclwiOlwi4pWTXCIsXCJib3hEUlwiOlwi4pWUXCIsXCJib3hoXCI6XCLilIBcIixcImJveEhcIjpcIuKVkFwiLFwiYm94aGRcIjpcIuKUrFwiLFwiYm94SGRcIjpcIuKVpFwiLFwiYm94aERcIjpcIuKVpVwiLFwiYm94SERcIjpcIuKVplwiLFwiYm94aHVcIjpcIuKUtFwiLFwiYm94SHVcIjpcIuKVp1wiLFwiYm94aFVcIjpcIuKVqFwiLFwiYm94SFVcIjpcIuKVqVwiLFwiYm94bWludXNcIjpcIuKKn1wiLFwiYm94cGx1c1wiOlwi4oqeXCIsXCJib3h0aW1lc1wiOlwi4oqgXCIsXCJib3h1bFwiOlwi4pSYXCIsXCJib3h1TFwiOlwi4pWbXCIsXCJib3hVbFwiOlwi4pWcXCIsXCJib3hVTFwiOlwi4pWdXCIsXCJib3h1clwiOlwi4pSUXCIsXCJib3h1UlwiOlwi4pWYXCIsXCJib3hVclwiOlwi4pWZXCIsXCJib3hVUlwiOlwi4pWaXCIsXCJib3h2XCI6XCLilIJcIixcImJveFZcIjpcIuKVkVwiLFwiYm94dmhcIjpcIuKUvFwiLFwiYm94dkhcIjpcIuKVqlwiLFwiYm94VmhcIjpcIuKVq1wiLFwiYm94VkhcIjpcIuKVrFwiLFwiYm94dmxcIjpcIuKUpFwiLFwiYm94dkxcIjpcIuKVoVwiLFwiYm94VmxcIjpcIuKVolwiLFwiYm94VkxcIjpcIuKVo1wiLFwiYm94dnJcIjpcIuKUnFwiLFwiYm94dlJcIjpcIuKVnlwiLFwiYm94VnJcIjpcIuKVn1wiLFwiYm94VlJcIjpcIuKVoFwiLFwiYnByaW1lXCI6XCLigLVcIixcImJyZXZlXCI6XCLLmFwiLFwiQnJldmVcIjpcIsuYXCIsXCJicnZiYXJcIjpcIsKmXCIsXCJic2NyXCI6XCLwnZK3XCIsXCJCc2NyXCI6XCLihKxcIixcImJzZW1pXCI6XCLigY9cIixcImJzaW1cIjpcIuKIvVwiLFwiYnNpbWVcIjpcIuKLjVwiLFwiYnNvbGJcIjpcIuKnhVwiLFwiYnNvbFwiOlwiXFxcXFwiLFwiYnNvbGhzdWJcIjpcIuKfiFwiLFwiYnVsbFwiOlwi4oCiXCIsXCJidWxsZXRcIjpcIuKAolwiLFwiYnVtcFwiOlwi4omOXCIsXCJidW1wRVwiOlwi4qquXCIsXCJidW1wZVwiOlwi4omPXCIsXCJCdW1wZXFcIjpcIuKJjlwiLFwiYnVtcGVxXCI6XCLiiY9cIixcIkNhY3V0ZVwiOlwixIZcIixcImNhY3V0ZVwiOlwixIdcIixcImNhcGFuZFwiOlwi4qmEXCIsXCJjYXBicmN1cFwiOlwi4qmJXCIsXCJjYXBjYXBcIjpcIuKpi1wiLFwiY2FwXCI6XCLiiKlcIixcIkNhcFwiOlwi4ouSXCIsXCJjYXBjdXBcIjpcIuKph1wiLFwiY2FwZG90XCI6XCLiqYBcIixcIkNhcGl0YWxEaWZmZXJlbnRpYWxEXCI6XCLihYVcIixcImNhcHNcIjpcIuKIqe+4gFwiLFwiY2FyZXRcIjpcIuKBgVwiLFwiY2Fyb25cIjpcIsuHXCIsXCJDYXlsZXlzXCI6XCLihK1cIixcImNjYXBzXCI6XCLiqY1cIixcIkNjYXJvblwiOlwixIxcIixcImNjYXJvblwiOlwixI1cIixcIkNjZWRpbFwiOlwiw4dcIixcImNjZWRpbFwiOlwiw6dcIixcIkNjaXJjXCI6XCLEiFwiLFwiY2NpcmNcIjpcIsSJXCIsXCJDY29uaW50XCI6XCLiiLBcIixcImNjdXBzXCI6XCLiqYxcIixcImNjdXBzc21cIjpcIuKpkFwiLFwiQ2RvdFwiOlwixIpcIixcImNkb3RcIjpcIsSLXCIsXCJjZWRpbFwiOlwiwrhcIixcIkNlZGlsbGFcIjpcIsK4XCIsXCJjZW1wdHl2XCI6XCLiprJcIixcImNlbnRcIjpcIsKiXCIsXCJjZW50ZXJkb3RcIjpcIsK3XCIsXCJDZW50ZXJEb3RcIjpcIsK3XCIsXCJjZnJcIjpcIvCdlKBcIixcIkNmclwiOlwi4oStXCIsXCJDSGN5XCI6XCLQp1wiLFwiY2hjeVwiOlwi0YdcIixcImNoZWNrXCI6XCLinJNcIixcImNoZWNrbWFya1wiOlwi4pyTXCIsXCJDaGlcIjpcIs6nXCIsXCJjaGlcIjpcIs+HXCIsXCJjaXJjXCI6XCLLhlwiLFwiY2lyY2VxXCI6XCLiiZdcIixcImNpcmNsZWFycm93bGVmdFwiOlwi4oa6XCIsXCJjaXJjbGVhcnJvd3JpZ2h0XCI6XCLihrtcIixcImNpcmNsZWRhc3RcIjpcIuKKm1wiLFwiY2lyY2xlZGNpcmNcIjpcIuKKmlwiLFwiY2lyY2xlZGRhc2hcIjpcIuKKnVwiLFwiQ2lyY2xlRG90XCI6XCLiiplcIixcImNpcmNsZWRSXCI6XCLCrlwiLFwiY2lyY2xlZFNcIjpcIuKTiFwiLFwiQ2lyY2xlTWludXNcIjpcIuKKllwiLFwiQ2lyY2xlUGx1c1wiOlwi4oqVXCIsXCJDaXJjbGVUaW1lc1wiOlwi4oqXXCIsXCJjaXJcIjpcIuKXi1wiLFwiY2lyRVwiOlwi4qeDXCIsXCJjaXJlXCI6XCLiiZdcIixcImNpcmZuaW50XCI6XCLiqJBcIixcImNpcm1pZFwiOlwi4quvXCIsXCJjaXJzY2lyXCI6XCLip4JcIixcIkNsb2Nrd2lzZUNvbnRvdXJJbnRlZ3JhbFwiOlwi4oiyXCIsXCJDbG9zZUN1cmx5RG91YmxlUXVvdGVcIjpcIuKAnVwiLFwiQ2xvc2VDdXJseVF1b3RlXCI6XCLigJlcIixcImNsdWJzXCI6XCLimaNcIixcImNsdWJzdWl0XCI6XCLimaNcIixcImNvbG9uXCI6XCI6XCIsXCJDb2xvblwiOlwi4oi3XCIsXCJDb2xvbmVcIjpcIuKptFwiLFwiY29sb25lXCI6XCLiiZRcIixcImNvbG9uZXFcIjpcIuKJlFwiLFwiY29tbWFcIjpcIixcIixcImNvbW1hdFwiOlwiQFwiLFwiY29tcFwiOlwi4oiBXCIsXCJjb21wZm5cIjpcIuKImFwiLFwiY29tcGxlbWVudFwiOlwi4oiBXCIsXCJjb21wbGV4ZXNcIjpcIuKEglwiLFwiY29uZ1wiOlwi4omFXCIsXCJjb25nZG90XCI6XCLiqa1cIixcIkNvbmdydWVudFwiOlwi4omhXCIsXCJjb25pbnRcIjpcIuKIrlwiLFwiQ29uaW50XCI6XCLiiK9cIixcIkNvbnRvdXJJbnRlZ3JhbFwiOlwi4oiuXCIsXCJjb3BmXCI6XCLwnZWUXCIsXCJDb3BmXCI6XCLihIJcIixcImNvcHJvZFwiOlwi4oiQXCIsXCJDb3Byb2R1Y3RcIjpcIuKIkFwiLFwiY29weVwiOlwiwqlcIixcIkNPUFlcIjpcIsKpXCIsXCJjb3B5c3JcIjpcIuKEl1wiLFwiQ291bnRlckNsb2Nrd2lzZUNvbnRvdXJJbnRlZ3JhbFwiOlwi4oizXCIsXCJjcmFyclwiOlwi4oa1XCIsXCJjcm9zc1wiOlwi4pyXXCIsXCJDcm9zc1wiOlwi4qivXCIsXCJDc2NyXCI6XCLwnZKeXCIsXCJjc2NyXCI6XCLwnZK4XCIsXCJjc3ViXCI6XCLiq49cIixcImNzdWJlXCI6XCLiq5FcIixcImNzdXBcIjpcIuKrkFwiLFwiY3N1cGVcIjpcIuKrklwiLFwiY3Rkb3RcIjpcIuKLr1wiLFwiY3VkYXJybFwiOlwi4qS4XCIsXCJjdWRhcnJyXCI6XCLipLVcIixcImN1ZXByXCI6XCLii55cIixcImN1ZXNjXCI6XCLii59cIixcImN1bGFyclwiOlwi4oa2XCIsXCJjdWxhcnJwXCI6XCLipL1cIixcImN1cGJyY2FwXCI6XCLiqYhcIixcImN1cGNhcFwiOlwi4qmGXCIsXCJDdXBDYXBcIjpcIuKJjVwiLFwiY3VwXCI6XCLiiKpcIixcIkN1cFwiOlwi4ouTXCIsXCJjdXBjdXBcIjpcIuKpilwiLFwiY3VwZG90XCI6XCLiio1cIixcImN1cG9yXCI6XCLiqYVcIixcImN1cHNcIjpcIuKIqu+4gFwiLFwiY3VyYXJyXCI6XCLihrdcIixcImN1cmFycm1cIjpcIuKkvFwiLFwiY3VybHllcXByZWNcIjpcIuKLnlwiLFwiY3VybHllcXN1Y2NcIjpcIuKLn1wiLFwiY3VybHl2ZWVcIjpcIuKLjlwiLFwiY3VybHl3ZWRnZVwiOlwi4ouPXCIsXCJjdXJyZW5cIjpcIsKkXCIsXCJjdXJ2ZWFycm93bGVmdFwiOlwi4oa2XCIsXCJjdXJ2ZWFycm93cmlnaHRcIjpcIuKGt1wiLFwiY3V2ZWVcIjpcIuKLjlwiLFwiY3V3ZWRcIjpcIuKLj1wiLFwiY3djb25pbnRcIjpcIuKIslwiLFwiY3dpbnRcIjpcIuKIsVwiLFwiY3lsY3R5XCI6XCLijK1cIixcImRhZ2dlclwiOlwi4oCgXCIsXCJEYWdnZXJcIjpcIuKAoVwiLFwiZGFsZXRoXCI6XCLihLhcIixcImRhcnJcIjpcIuKGk1wiLFwiRGFyclwiOlwi4oahXCIsXCJkQXJyXCI6XCLih5NcIixcImRhc2hcIjpcIuKAkFwiLFwiRGFzaHZcIjpcIuKrpFwiLFwiZGFzaHZcIjpcIuKKo1wiLFwiZGJrYXJvd1wiOlwi4qSPXCIsXCJkYmxhY1wiOlwiy51cIixcIkRjYXJvblwiOlwixI5cIixcImRjYXJvblwiOlwixI9cIixcIkRjeVwiOlwi0JRcIixcImRjeVwiOlwi0LRcIixcImRkYWdnZXJcIjpcIuKAoVwiLFwiZGRhcnJcIjpcIuKHilwiLFwiRERcIjpcIuKFhVwiLFwiZGRcIjpcIuKFhlwiLFwiRERvdHJhaGRcIjpcIuKkkVwiLFwiZGRvdHNlcVwiOlwi4qm3XCIsXCJkZWdcIjpcIsKwXCIsXCJEZWxcIjpcIuKIh1wiLFwiRGVsdGFcIjpcIs6UXCIsXCJkZWx0YVwiOlwizrRcIixcImRlbXB0eXZcIjpcIuKmsVwiLFwiZGZpc2h0XCI6XCLipb9cIixcIkRmclwiOlwi8J2Uh1wiLFwiZGZyXCI6XCLwnZShXCIsXCJkSGFyXCI6XCLipaVcIixcImRoYXJsXCI6XCLih4NcIixcImRoYXJyXCI6XCLih4JcIixcIkRpYWNyaXRpY2FsQWN1dGVcIjpcIsK0XCIsXCJEaWFjcml0aWNhbERvdFwiOlwiy5lcIixcIkRpYWNyaXRpY2FsRG91YmxlQWN1dGVcIjpcIsudXCIsXCJEaWFjcml0aWNhbEdyYXZlXCI6XCJgXCIsXCJEaWFjcml0aWNhbFRpbGRlXCI6XCLLnFwiLFwiZGlhbVwiOlwi4ouEXCIsXCJkaWFtb25kXCI6XCLii4RcIixcIkRpYW1vbmRcIjpcIuKLhFwiLFwiZGlhbW9uZHN1aXRcIjpcIuKZplwiLFwiZGlhbXNcIjpcIuKZplwiLFwiZGllXCI6XCLCqFwiLFwiRGlmZmVyZW50aWFsRFwiOlwi4oWGXCIsXCJkaWdhbW1hXCI6XCLPnVwiLFwiZGlzaW5cIjpcIuKLslwiLFwiZGl2XCI6XCLDt1wiLFwiZGl2aWRlXCI6XCLDt1wiLFwiZGl2aWRlb250aW1lc1wiOlwi4ouHXCIsXCJkaXZvbnhcIjpcIuKLh1wiLFwiREpjeVwiOlwi0IJcIixcImRqY3lcIjpcItGSXCIsXCJkbGNvcm5cIjpcIuKMnlwiLFwiZGxjcm9wXCI6XCLijI1cIixcImRvbGxhclwiOlwiJFwiLFwiRG9wZlwiOlwi8J2Uu1wiLFwiZG9wZlwiOlwi8J2VlVwiLFwiRG90XCI6XCLCqFwiLFwiZG90XCI6XCLLmVwiLFwiRG90RG90XCI6XCLig5xcIixcImRvdGVxXCI6XCLiiZBcIixcImRvdGVxZG90XCI6XCLiiZFcIixcIkRvdEVxdWFsXCI6XCLiiZBcIixcImRvdG1pbnVzXCI6XCLiiLhcIixcImRvdHBsdXNcIjpcIuKIlFwiLFwiZG90c3F1YXJlXCI6XCLiiqFcIixcImRvdWJsZWJhcndlZGdlXCI6XCLijIZcIixcIkRvdWJsZUNvbnRvdXJJbnRlZ3JhbFwiOlwi4oivXCIsXCJEb3VibGVEb3RcIjpcIsKoXCIsXCJEb3VibGVEb3duQXJyb3dcIjpcIuKHk1wiLFwiRG91YmxlTGVmdEFycm93XCI6XCLih5BcIixcIkRvdWJsZUxlZnRSaWdodEFycm93XCI6XCLih5RcIixcIkRvdWJsZUxlZnRUZWVcIjpcIuKrpFwiLFwiRG91YmxlTG9uZ0xlZnRBcnJvd1wiOlwi4p+4XCIsXCJEb3VibGVMb25nTGVmdFJpZ2h0QXJyb3dcIjpcIuKfulwiLFwiRG91YmxlTG9uZ1JpZ2h0QXJyb3dcIjpcIuKfuVwiLFwiRG91YmxlUmlnaHRBcnJvd1wiOlwi4oeSXCIsXCJEb3VibGVSaWdodFRlZVwiOlwi4oqoXCIsXCJEb3VibGVVcEFycm93XCI6XCLih5FcIixcIkRvdWJsZVVwRG93bkFycm93XCI6XCLih5VcIixcIkRvdWJsZVZlcnRpY2FsQmFyXCI6XCLiiKVcIixcIkRvd25BcnJvd0JhclwiOlwi4qSTXCIsXCJkb3duYXJyb3dcIjpcIuKGk1wiLFwiRG93bkFycm93XCI6XCLihpNcIixcIkRvd25hcnJvd1wiOlwi4oeTXCIsXCJEb3duQXJyb3dVcEFycm93XCI6XCLih7VcIixcIkRvd25CcmV2ZVwiOlwizJFcIixcImRvd25kb3duYXJyb3dzXCI6XCLih4pcIixcImRvd25oYXJwb29ubGVmdFwiOlwi4oeDXCIsXCJkb3duaGFycG9vbnJpZ2h0XCI6XCLih4JcIixcIkRvd25MZWZ0UmlnaHRWZWN0b3JcIjpcIuKlkFwiLFwiRG93bkxlZnRUZWVWZWN0b3JcIjpcIuKlnlwiLFwiRG93bkxlZnRWZWN0b3JCYXJcIjpcIuKlllwiLFwiRG93bkxlZnRWZWN0b3JcIjpcIuKGvVwiLFwiRG93blJpZ2h0VGVlVmVjdG9yXCI6XCLipZ9cIixcIkRvd25SaWdodFZlY3RvckJhclwiOlwi4qWXXCIsXCJEb3duUmlnaHRWZWN0b3JcIjpcIuKHgVwiLFwiRG93blRlZUFycm93XCI6XCLihqdcIixcIkRvd25UZWVcIjpcIuKKpFwiLFwiZHJia2Fyb3dcIjpcIuKkkFwiLFwiZHJjb3JuXCI6XCLijJ9cIixcImRyY3JvcFwiOlwi4oyMXCIsXCJEc2NyXCI6XCLwnZKfXCIsXCJkc2NyXCI6XCLwnZK5XCIsXCJEU2N5XCI6XCLQhVwiLFwiZHNjeVwiOlwi0ZVcIixcImRzb2xcIjpcIuKntlwiLFwiRHN0cm9rXCI6XCLEkFwiLFwiZHN0cm9rXCI6XCLEkVwiLFwiZHRkb3RcIjpcIuKLsVwiLFwiZHRyaVwiOlwi4pa/XCIsXCJkdHJpZlwiOlwi4pa+XCIsXCJkdWFyclwiOlwi4oe1XCIsXCJkdWhhclwiOlwi4qWvXCIsXCJkd2FuZ2xlXCI6XCLipqZcIixcIkRaY3lcIjpcItCPXCIsXCJkemN5XCI6XCLRn1wiLFwiZHppZ3JhcnJcIjpcIuKfv1wiLFwiRWFjdXRlXCI6XCLDiVwiLFwiZWFjdXRlXCI6XCLDqVwiLFwiZWFzdGVyXCI6XCLiqa5cIixcIkVjYXJvblwiOlwixJpcIixcImVjYXJvblwiOlwixJtcIixcIkVjaXJjXCI6XCLDilwiLFwiZWNpcmNcIjpcIsOqXCIsXCJlY2lyXCI6XCLiiZZcIixcImVjb2xvblwiOlwi4omVXCIsXCJFY3lcIjpcItCtXCIsXCJlY3lcIjpcItGNXCIsXCJlRERvdFwiOlwi4qm3XCIsXCJFZG90XCI6XCLEllwiLFwiZWRvdFwiOlwixJdcIixcImVEb3RcIjpcIuKJkVwiLFwiZWVcIjpcIuKFh1wiLFwiZWZEb3RcIjpcIuKJklwiLFwiRWZyXCI6XCLwnZSIXCIsXCJlZnJcIjpcIvCdlKJcIixcImVnXCI6XCLiqppcIixcIkVncmF2ZVwiOlwiw4hcIixcImVncmF2ZVwiOlwiw6hcIixcImVnc1wiOlwi4qqWXCIsXCJlZ3Nkb3RcIjpcIuKqmFwiLFwiZWxcIjpcIuKqmVwiLFwiRWxlbWVudFwiOlwi4oiIXCIsXCJlbGludGVyc1wiOlwi4o+nXCIsXCJlbGxcIjpcIuKEk1wiLFwiZWxzXCI6XCLiqpVcIixcImVsc2RvdFwiOlwi4qqXXCIsXCJFbWFjclwiOlwixJJcIixcImVtYWNyXCI6XCLEk1wiLFwiZW1wdHlcIjpcIuKIhVwiLFwiZW1wdHlzZXRcIjpcIuKIhVwiLFwiRW1wdHlTbWFsbFNxdWFyZVwiOlwi4pe7XCIsXCJlbXB0eXZcIjpcIuKIhVwiLFwiRW1wdHlWZXJ5U21hbGxTcXVhcmVcIjpcIuKWq1wiLFwiZW1zcDEzXCI6XCLigIRcIixcImVtc3AxNFwiOlwi4oCFXCIsXCJlbXNwXCI6XCLigINcIixcIkVOR1wiOlwixYpcIixcImVuZ1wiOlwixYtcIixcImVuc3BcIjpcIuKAglwiLFwiRW9nb25cIjpcIsSYXCIsXCJlb2dvblwiOlwixJlcIixcIkVvcGZcIjpcIvCdlLxcIixcImVvcGZcIjpcIvCdlZZcIixcImVwYXJcIjpcIuKLlVwiLFwiZXBhcnNsXCI6XCLip6NcIixcImVwbHVzXCI6XCLiqbFcIixcImVwc2lcIjpcIs61XCIsXCJFcHNpbG9uXCI6XCLOlVwiLFwiZXBzaWxvblwiOlwizrVcIixcImVwc2l2XCI6XCLPtVwiLFwiZXFjaXJjXCI6XCLiiZZcIixcImVxY29sb25cIjpcIuKJlVwiLFwiZXFzaW1cIjpcIuKJglwiLFwiZXFzbGFudGd0clwiOlwi4qqWXCIsXCJlcXNsYW50bGVzc1wiOlwi4qqVXCIsXCJFcXVhbFwiOlwi4qm1XCIsXCJlcXVhbHNcIjpcIj1cIixcIkVxdWFsVGlsZGVcIjpcIuKJglwiLFwiZXF1ZXN0XCI6XCLiiZ9cIixcIkVxdWlsaWJyaXVtXCI6XCLih4xcIixcImVxdWl2XCI6XCLiiaFcIixcImVxdWl2RERcIjpcIuKpuFwiLFwiZXF2cGFyc2xcIjpcIuKnpVwiLFwiZXJhcnJcIjpcIuKlsVwiLFwiZXJEb3RcIjpcIuKJk1wiLFwiZXNjclwiOlwi4oSvXCIsXCJFc2NyXCI6XCLihLBcIixcImVzZG90XCI6XCLiiZBcIixcIkVzaW1cIjpcIuKps1wiLFwiZXNpbVwiOlwi4omCXCIsXCJFdGFcIjpcIs6XXCIsXCJldGFcIjpcIs63XCIsXCJFVEhcIjpcIsOQXCIsXCJldGhcIjpcIsOwXCIsXCJFdW1sXCI6XCLDi1wiLFwiZXVtbFwiOlwiw6tcIixcImV1cm9cIjpcIuKCrFwiLFwiZXhjbFwiOlwiIVwiLFwiZXhpc3RcIjpcIuKIg1wiLFwiRXhpc3RzXCI6XCLiiINcIixcImV4cGVjdGF0aW9uXCI6XCLihLBcIixcImV4cG9uZW50aWFsZVwiOlwi4oWHXCIsXCJFeHBvbmVudGlhbEVcIjpcIuKFh1wiLFwiZmFsbGluZ2RvdHNlcVwiOlwi4omSXCIsXCJGY3lcIjpcItCkXCIsXCJmY3lcIjpcItGEXCIsXCJmZW1hbGVcIjpcIuKZgFwiLFwiZmZpbGlnXCI6XCLvrINcIixcImZmbGlnXCI6XCLvrIBcIixcImZmbGxpZ1wiOlwi76yEXCIsXCJGZnJcIjpcIvCdlIlcIixcImZmclwiOlwi8J2Uo1wiLFwiZmlsaWdcIjpcIu+sgVwiLFwiRmlsbGVkU21hbGxTcXVhcmVcIjpcIuKXvFwiLFwiRmlsbGVkVmVyeVNtYWxsU3F1YXJlXCI6XCLilqpcIixcImZqbGlnXCI6XCJmalwiLFwiZmxhdFwiOlwi4pmtXCIsXCJmbGxpZ1wiOlwi76yCXCIsXCJmbHRuc1wiOlwi4paxXCIsXCJmbm9mXCI6XCLGklwiLFwiRm9wZlwiOlwi8J2UvVwiLFwiZm9wZlwiOlwi8J2Vl1wiLFwiZm9yYWxsXCI6XCLiiIBcIixcIkZvckFsbFwiOlwi4oiAXCIsXCJmb3JrXCI6XCLii5RcIixcImZvcmt2XCI6XCLiq5lcIixcIkZvdXJpZXJ0cmZcIjpcIuKEsVwiLFwiZnBhcnRpbnRcIjpcIuKojVwiLFwiZnJhYzEyXCI6XCLCvVwiLFwiZnJhYzEzXCI6XCLihZNcIixcImZyYWMxNFwiOlwiwrxcIixcImZyYWMxNVwiOlwi4oWVXCIsXCJmcmFjMTZcIjpcIuKFmVwiLFwiZnJhYzE4XCI6XCLihZtcIixcImZyYWMyM1wiOlwi4oWUXCIsXCJmcmFjMjVcIjpcIuKFllwiLFwiZnJhYzM0XCI6XCLCvlwiLFwiZnJhYzM1XCI6XCLihZdcIixcImZyYWMzOFwiOlwi4oWcXCIsXCJmcmFjNDVcIjpcIuKFmFwiLFwiZnJhYzU2XCI6XCLihZpcIixcImZyYWM1OFwiOlwi4oWdXCIsXCJmcmFjNzhcIjpcIuKFnlwiLFwiZnJhc2xcIjpcIuKBhFwiLFwiZnJvd25cIjpcIuKMolwiLFwiZnNjclwiOlwi8J2Su1wiLFwiRnNjclwiOlwi4oSxXCIsXCJnYWN1dGVcIjpcIse1XCIsXCJHYW1tYVwiOlwizpNcIixcImdhbW1hXCI6XCLOs1wiLFwiR2FtbWFkXCI6XCLPnFwiLFwiZ2FtbWFkXCI6XCLPnVwiLFwiZ2FwXCI6XCLiqoZcIixcIkdicmV2ZVwiOlwixJ5cIixcImdicmV2ZVwiOlwixJ9cIixcIkdjZWRpbFwiOlwixKJcIixcIkdjaXJjXCI6XCLEnFwiLFwiZ2NpcmNcIjpcIsSdXCIsXCJHY3lcIjpcItCTXCIsXCJnY3lcIjpcItCzXCIsXCJHZG90XCI6XCLEoFwiLFwiZ2RvdFwiOlwixKFcIixcImdlXCI6XCLiiaVcIixcImdFXCI6XCLiiadcIixcImdFbFwiOlwi4qqMXCIsXCJnZWxcIjpcIuKLm1wiLFwiZ2VxXCI6XCLiiaVcIixcImdlcXFcIjpcIuKJp1wiLFwiZ2Vxc2xhbnRcIjpcIuKpvlwiLFwiZ2VzY2NcIjpcIuKqqVwiLFwiZ2VzXCI6XCLiqb5cIixcImdlc2RvdFwiOlwi4qqAXCIsXCJnZXNkb3RvXCI6XCLiqoJcIixcImdlc2RvdG9sXCI6XCLiqoRcIixcImdlc2xcIjpcIuKLm++4gFwiLFwiZ2VzbGVzXCI6XCLiqpRcIixcIkdmclwiOlwi8J2UilwiLFwiZ2ZyXCI6XCLwnZSkXCIsXCJnZ1wiOlwi4omrXCIsXCJHZ1wiOlwi4ouZXCIsXCJnZ2dcIjpcIuKLmVwiLFwiZ2ltZWxcIjpcIuKEt1wiLFwiR0pjeVwiOlwi0INcIixcImdqY3lcIjpcItGTXCIsXCJnbGFcIjpcIuKqpVwiLFwiZ2xcIjpcIuKJt1wiLFwiZ2xFXCI6XCLiqpJcIixcImdsalwiOlwi4qqkXCIsXCJnbmFwXCI6XCLiqopcIixcImduYXBwcm94XCI6XCLiqopcIixcImduZVwiOlwi4qqIXCIsXCJnbkVcIjpcIuKJqVwiLFwiZ25lcVwiOlwi4qqIXCIsXCJnbmVxcVwiOlwi4ompXCIsXCJnbnNpbVwiOlwi4ounXCIsXCJHb3BmXCI6XCLwnZS+XCIsXCJnb3BmXCI6XCLwnZWYXCIsXCJncmF2ZVwiOlwiYFwiLFwiR3JlYXRlckVxdWFsXCI6XCLiiaVcIixcIkdyZWF0ZXJFcXVhbExlc3NcIjpcIuKLm1wiLFwiR3JlYXRlckZ1bGxFcXVhbFwiOlwi4omnXCIsXCJHcmVhdGVyR3JlYXRlclwiOlwi4qqiXCIsXCJHcmVhdGVyTGVzc1wiOlwi4om3XCIsXCJHcmVhdGVyU2xhbnRFcXVhbFwiOlwi4qm+XCIsXCJHcmVhdGVyVGlsZGVcIjpcIuKJs1wiLFwiR3NjclwiOlwi8J2SolwiLFwiZ3NjclwiOlwi4oSKXCIsXCJnc2ltXCI6XCLiibNcIixcImdzaW1lXCI6XCLiqo5cIixcImdzaW1sXCI6XCLiqpBcIixcImd0Y2NcIjpcIuKqp1wiLFwiZ3RjaXJcIjpcIuKpulwiLFwiZ3RcIjpcIj5cIixcIkdUXCI6XCI+XCIsXCJHdFwiOlwi4omrXCIsXCJndGRvdFwiOlwi4ouXXCIsXCJndGxQYXJcIjpcIuKmlVwiLFwiZ3RxdWVzdFwiOlwi4qm8XCIsXCJndHJhcHByb3hcIjpcIuKqhlwiLFwiZ3RyYXJyXCI6XCLipbhcIixcImd0cmRvdFwiOlwi4ouXXCIsXCJndHJlcWxlc3NcIjpcIuKLm1wiLFwiZ3RyZXFxbGVzc1wiOlwi4qqMXCIsXCJndHJsZXNzXCI6XCLiibdcIixcImd0cnNpbVwiOlwi4omzXCIsXCJndmVydG5lcXFcIjpcIuKJqe+4gFwiLFwiZ3ZuRVwiOlwi4omp77iAXCIsXCJIYWNla1wiOlwiy4dcIixcImhhaXJzcFwiOlwi4oCKXCIsXCJoYWxmXCI6XCLCvVwiLFwiaGFtaWx0XCI6XCLihItcIixcIkhBUkRjeVwiOlwi0KpcIixcImhhcmRjeVwiOlwi0YpcIixcImhhcnJjaXJcIjpcIuKliFwiLFwiaGFyclwiOlwi4oaUXCIsXCJoQXJyXCI6XCLih5RcIixcImhhcnJ3XCI6XCLihq1cIixcIkhhdFwiOlwiXlwiLFwiaGJhclwiOlwi4oSPXCIsXCJIY2lyY1wiOlwixKRcIixcImhjaXJjXCI6XCLEpVwiLFwiaGVhcnRzXCI6XCLimaVcIixcImhlYXJ0c3VpdFwiOlwi4pmlXCIsXCJoZWxsaXBcIjpcIuKAplwiLFwiaGVyY29uXCI6XCLiirlcIixcImhmclwiOlwi8J2UpVwiLFwiSGZyXCI6XCLihIxcIixcIkhpbGJlcnRTcGFjZVwiOlwi4oSLXCIsXCJoa3NlYXJvd1wiOlwi4qSlXCIsXCJoa3N3YXJvd1wiOlwi4qSmXCIsXCJob2FyclwiOlwi4oe/XCIsXCJob210aHRcIjpcIuKIu1wiLFwiaG9va2xlZnRhcnJvd1wiOlwi4oapXCIsXCJob29rcmlnaHRhcnJvd1wiOlwi4oaqXCIsXCJob3BmXCI6XCLwnZWZXCIsXCJIb3BmXCI6XCLihI1cIixcImhvcmJhclwiOlwi4oCVXCIsXCJIb3Jpem9udGFsTGluZVwiOlwi4pSAXCIsXCJoc2NyXCI6XCLwnZK9XCIsXCJIc2NyXCI6XCLihItcIixcImhzbGFzaFwiOlwi4oSPXCIsXCJIc3Ryb2tcIjpcIsSmXCIsXCJoc3Ryb2tcIjpcIsSnXCIsXCJIdW1wRG93bkh1bXBcIjpcIuKJjlwiLFwiSHVtcEVxdWFsXCI6XCLiiY9cIixcImh5YnVsbFwiOlwi4oGDXCIsXCJoeXBoZW5cIjpcIuKAkFwiLFwiSWFjdXRlXCI6XCLDjVwiLFwiaWFjdXRlXCI6XCLDrVwiLFwiaWNcIjpcIuKBo1wiLFwiSWNpcmNcIjpcIsOOXCIsXCJpY2lyY1wiOlwiw65cIixcIkljeVwiOlwi0JhcIixcImljeVwiOlwi0LhcIixcIklkb3RcIjpcIsSwXCIsXCJJRWN5XCI6XCLQlVwiLFwiaWVjeVwiOlwi0LVcIixcImlleGNsXCI6XCLCoVwiLFwiaWZmXCI6XCLih5RcIixcImlmclwiOlwi8J2UplwiLFwiSWZyXCI6XCLihJFcIixcIklncmF2ZVwiOlwiw4xcIixcImlncmF2ZVwiOlwiw6xcIixcImlpXCI6XCLihYhcIixcImlpaWludFwiOlwi4qiMXCIsXCJpaWludFwiOlwi4oitXCIsXCJpaW5maW5cIjpcIuKnnFwiLFwiaWlvdGFcIjpcIuKEqVwiLFwiSUpsaWdcIjpcIsSyXCIsXCJpamxpZ1wiOlwixLNcIixcIkltYWNyXCI6XCLEqlwiLFwiaW1hY3JcIjpcIsSrXCIsXCJpbWFnZVwiOlwi4oSRXCIsXCJJbWFnaW5hcnlJXCI6XCLihYhcIixcImltYWdsaW5lXCI6XCLihJBcIixcImltYWdwYXJ0XCI6XCLihJFcIixcImltYXRoXCI6XCLEsVwiLFwiSW1cIjpcIuKEkVwiLFwiaW1vZlwiOlwi4oq3XCIsXCJpbXBlZFwiOlwixrVcIixcIkltcGxpZXNcIjpcIuKHklwiLFwiaW5jYXJlXCI6XCLihIVcIixcImluXCI6XCLiiIhcIixcImluZmluXCI6XCLiiJ5cIixcImluZmludGllXCI6XCLip51cIixcImlub2RvdFwiOlwixLFcIixcImludGNhbFwiOlwi4oq6XCIsXCJpbnRcIjpcIuKIq1wiLFwiSW50XCI6XCLiiKxcIixcImludGVnZXJzXCI6XCLihKRcIixcIkludGVncmFsXCI6XCLiiKtcIixcImludGVyY2FsXCI6XCLiirpcIixcIkludGVyc2VjdGlvblwiOlwi4ouCXCIsXCJpbnRsYXJoa1wiOlwi4qiXXCIsXCJpbnRwcm9kXCI6XCLiqLxcIixcIkludmlzaWJsZUNvbW1hXCI6XCLigaNcIixcIkludmlzaWJsZVRpbWVzXCI6XCLigaJcIixcIklPY3lcIjpcItCBXCIsXCJpb2N5XCI6XCLRkVwiLFwiSW9nb25cIjpcIsSuXCIsXCJpb2dvblwiOlwixK9cIixcIklvcGZcIjpcIvCdlYBcIixcImlvcGZcIjpcIvCdlZpcIixcIklvdGFcIjpcIs6ZXCIsXCJpb3RhXCI6XCLOuVwiLFwiaXByb2RcIjpcIuKovFwiLFwiaXF1ZXN0XCI6XCLCv1wiLFwiaXNjclwiOlwi8J2SvlwiLFwiSXNjclwiOlwi4oSQXCIsXCJpc2luXCI6XCLiiIhcIixcImlzaW5kb3RcIjpcIuKLtVwiLFwiaXNpbkVcIjpcIuKLuVwiLFwiaXNpbnNcIjpcIuKLtFwiLFwiaXNpbnN2XCI6XCLii7NcIixcImlzaW52XCI6XCLiiIhcIixcIml0XCI6XCLigaJcIixcIkl0aWxkZVwiOlwixKhcIixcIml0aWxkZVwiOlwixKlcIixcIkl1a2N5XCI6XCLQhlwiLFwiaXVrY3lcIjpcItGWXCIsXCJJdW1sXCI6XCLDj1wiLFwiaXVtbFwiOlwiw69cIixcIkpjaXJjXCI6XCLEtFwiLFwiamNpcmNcIjpcIsS1XCIsXCJKY3lcIjpcItCZXCIsXCJqY3lcIjpcItC5XCIsXCJKZnJcIjpcIvCdlI1cIixcImpmclwiOlwi8J2Up1wiLFwiam1hdGhcIjpcIsi3XCIsXCJKb3BmXCI6XCLwnZWBXCIsXCJqb3BmXCI6XCLwnZWbXCIsXCJKc2NyXCI6XCLwnZKlXCIsXCJqc2NyXCI6XCLwnZK/XCIsXCJKc2VyY3lcIjpcItCIXCIsXCJqc2VyY3lcIjpcItGYXCIsXCJKdWtjeVwiOlwi0IRcIixcImp1a2N5XCI6XCLRlFwiLFwiS2FwcGFcIjpcIs6aXCIsXCJrYXBwYVwiOlwizrpcIixcImthcHBhdlwiOlwiz7BcIixcIktjZWRpbFwiOlwixLZcIixcImtjZWRpbFwiOlwixLdcIixcIktjeVwiOlwi0JpcIixcImtjeVwiOlwi0LpcIixcIktmclwiOlwi8J2UjlwiLFwia2ZyXCI6XCLwnZSoXCIsXCJrZ3JlZW5cIjpcIsS4XCIsXCJLSGN5XCI6XCLQpVwiLFwia2hjeVwiOlwi0YVcIixcIktKY3lcIjpcItCMXCIsXCJramN5XCI6XCLRnFwiLFwiS29wZlwiOlwi8J2VglwiLFwia29wZlwiOlwi8J2VnFwiLFwiS3NjclwiOlwi8J2SplwiLFwia3NjclwiOlwi8J2TgFwiLFwibEFhcnJcIjpcIuKHmlwiLFwiTGFjdXRlXCI6XCLEuVwiLFwibGFjdXRlXCI6XCLEulwiLFwibGFlbXB0eXZcIjpcIuKmtFwiLFwibGFncmFuXCI6XCLihJJcIixcIkxhbWJkYVwiOlwizptcIixcImxhbWJkYVwiOlwizrtcIixcImxhbmdcIjpcIuKfqFwiLFwiTGFuZ1wiOlwi4p+qXCIsXCJsYW5nZFwiOlwi4qaRXCIsXCJsYW5nbGVcIjpcIuKfqFwiLFwibGFwXCI6XCLiqoVcIixcIkxhcGxhY2V0cmZcIjpcIuKEklwiLFwibGFxdW9cIjpcIsKrXCIsXCJsYXJyYlwiOlwi4oekXCIsXCJsYXJyYmZzXCI6XCLipJ9cIixcImxhcnJcIjpcIuKGkFwiLFwiTGFyclwiOlwi4oaeXCIsXCJsQXJyXCI6XCLih5BcIixcImxhcnJmc1wiOlwi4qSdXCIsXCJsYXJyaGtcIjpcIuKGqVwiLFwibGFycmxwXCI6XCLihqtcIixcImxhcnJwbFwiOlwi4qS5XCIsXCJsYXJyc2ltXCI6XCLipbNcIixcImxhcnJ0bFwiOlwi4oaiXCIsXCJsYXRhaWxcIjpcIuKkmVwiLFwibEF0YWlsXCI6XCLipJtcIixcImxhdFwiOlwi4qqrXCIsXCJsYXRlXCI6XCLiqq1cIixcImxhdGVzXCI6XCLiqq3vuIBcIixcImxiYXJyXCI6XCLipIxcIixcImxCYXJyXCI6XCLipI5cIixcImxiYnJrXCI6XCLinbJcIixcImxicmFjZVwiOlwie1wiLFwibGJyYWNrXCI6XCJbXCIsXCJsYnJrZVwiOlwi4qaLXCIsXCJsYnJrc2xkXCI6XCLipo9cIixcImxicmtzbHVcIjpcIuKmjVwiLFwiTGNhcm9uXCI6XCLEvVwiLFwibGNhcm9uXCI6XCLEvlwiLFwiTGNlZGlsXCI6XCLEu1wiLFwibGNlZGlsXCI6XCLEvFwiLFwibGNlaWxcIjpcIuKMiFwiLFwibGN1YlwiOlwie1wiLFwiTGN5XCI6XCLQm1wiLFwibGN5XCI6XCLQu1wiLFwibGRjYVwiOlwi4qS2XCIsXCJsZHF1b1wiOlwi4oCcXCIsXCJsZHF1b3JcIjpcIuKAnlwiLFwibGRyZGhhclwiOlwi4qWnXCIsXCJsZHJ1c2hhclwiOlwi4qWLXCIsXCJsZHNoXCI6XCLihrJcIixcImxlXCI6XCLiiaRcIixcImxFXCI6XCLiiaZcIixcIkxlZnRBbmdsZUJyYWNrZXRcIjpcIuKfqFwiLFwiTGVmdEFycm93QmFyXCI6XCLih6RcIixcImxlZnRhcnJvd1wiOlwi4oaQXCIsXCJMZWZ0QXJyb3dcIjpcIuKGkFwiLFwiTGVmdGFycm93XCI6XCLih5BcIixcIkxlZnRBcnJvd1JpZ2h0QXJyb3dcIjpcIuKHhlwiLFwibGVmdGFycm93dGFpbFwiOlwi4oaiXCIsXCJMZWZ0Q2VpbGluZ1wiOlwi4oyIXCIsXCJMZWZ0RG91YmxlQnJhY2tldFwiOlwi4p+mXCIsXCJMZWZ0RG93blRlZVZlY3RvclwiOlwi4qWhXCIsXCJMZWZ0RG93blZlY3RvckJhclwiOlwi4qWZXCIsXCJMZWZ0RG93blZlY3RvclwiOlwi4oeDXCIsXCJMZWZ0Rmxvb3JcIjpcIuKMilwiLFwibGVmdGhhcnBvb25kb3duXCI6XCLihr1cIixcImxlZnRoYXJwb29udXBcIjpcIuKGvFwiLFwibGVmdGxlZnRhcnJvd3NcIjpcIuKHh1wiLFwibGVmdHJpZ2h0YXJyb3dcIjpcIuKGlFwiLFwiTGVmdFJpZ2h0QXJyb3dcIjpcIuKGlFwiLFwiTGVmdHJpZ2h0YXJyb3dcIjpcIuKHlFwiLFwibGVmdHJpZ2h0YXJyb3dzXCI6XCLih4ZcIixcImxlZnRyaWdodGhhcnBvb25zXCI6XCLih4tcIixcImxlZnRyaWdodHNxdWlnYXJyb3dcIjpcIuKGrVwiLFwiTGVmdFJpZ2h0VmVjdG9yXCI6XCLipY5cIixcIkxlZnRUZWVBcnJvd1wiOlwi4oakXCIsXCJMZWZ0VGVlXCI6XCLiiqNcIixcIkxlZnRUZWVWZWN0b3JcIjpcIuKlmlwiLFwibGVmdHRocmVldGltZXNcIjpcIuKLi1wiLFwiTGVmdFRyaWFuZ2xlQmFyXCI6XCLip49cIixcIkxlZnRUcmlhbmdsZVwiOlwi4oqyXCIsXCJMZWZ0VHJpYW5nbGVFcXVhbFwiOlwi4oq0XCIsXCJMZWZ0VXBEb3duVmVjdG9yXCI6XCLipZFcIixcIkxlZnRVcFRlZVZlY3RvclwiOlwi4qWgXCIsXCJMZWZ0VXBWZWN0b3JCYXJcIjpcIuKlmFwiLFwiTGVmdFVwVmVjdG9yXCI6XCLihr9cIixcIkxlZnRWZWN0b3JCYXJcIjpcIuKlklwiLFwiTGVmdFZlY3RvclwiOlwi4oa8XCIsXCJsRWdcIjpcIuKqi1wiLFwibGVnXCI6XCLii5pcIixcImxlcVwiOlwi4omkXCIsXCJsZXFxXCI6XCLiiaZcIixcImxlcXNsYW50XCI6XCLiqb1cIixcImxlc2NjXCI6XCLiqqhcIixcImxlc1wiOlwi4qm9XCIsXCJsZXNkb3RcIjpcIuKpv1wiLFwibGVzZG90b1wiOlwi4qqBXCIsXCJsZXNkb3RvclwiOlwi4qqDXCIsXCJsZXNnXCI6XCLii5rvuIBcIixcImxlc2dlc1wiOlwi4qqTXCIsXCJsZXNzYXBwcm94XCI6XCLiqoVcIixcImxlc3Nkb3RcIjpcIuKLllwiLFwibGVzc2VxZ3RyXCI6XCLii5pcIixcImxlc3NlcXFndHJcIjpcIuKqi1wiLFwiTGVzc0VxdWFsR3JlYXRlclwiOlwi4ouaXCIsXCJMZXNzRnVsbEVxdWFsXCI6XCLiiaZcIixcIkxlc3NHcmVhdGVyXCI6XCLiibZcIixcImxlc3NndHJcIjpcIuKJtlwiLFwiTGVzc0xlc3NcIjpcIuKqoVwiLFwibGVzc3NpbVwiOlwi4omyXCIsXCJMZXNzU2xhbnRFcXVhbFwiOlwi4qm9XCIsXCJMZXNzVGlsZGVcIjpcIuKJslwiLFwibGZpc2h0XCI6XCLipbxcIixcImxmbG9vclwiOlwi4oyKXCIsXCJMZnJcIjpcIvCdlI9cIixcImxmclwiOlwi8J2UqVwiLFwibGdcIjpcIuKJtlwiLFwibGdFXCI6XCLiqpFcIixcImxIYXJcIjpcIuKlolwiLFwibGhhcmRcIjpcIuKGvVwiLFwibGhhcnVcIjpcIuKGvFwiLFwibGhhcnVsXCI6XCLipapcIixcImxoYmxrXCI6XCLiloRcIixcIkxKY3lcIjpcItCJXCIsXCJsamN5XCI6XCLRmVwiLFwibGxhcnJcIjpcIuKHh1wiLFwibGxcIjpcIuKJqlwiLFwiTGxcIjpcIuKLmFwiLFwibGxjb3JuZXJcIjpcIuKMnlwiLFwiTGxlZnRhcnJvd1wiOlwi4oeaXCIsXCJsbGhhcmRcIjpcIuKlq1wiLFwibGx0cmlcIjpcIuKXulwiLFwiTG1pZG90XCI6XCLEv1wiLFwibG1pZG90XCI6XCLFgFwiLFwibG1vdXN0YWNoZVwiOlwi4o6wXCIsXCJsbW91c3RcIjpcIuKOsFwiLFwibG5hcFwiOlwi4qqJXCIsXCJsbmFwcHJveFwiOlwi4qqJXCIsXCJsbmVcIjpcIuKqh1wiLFwibG5FXCI6XCLiiahcIixcImxuZXFcIjpcIuKqh1wiLFwibG5lcXFcIjpcIuKJqFwiLFwibG5zaW1cIjpcIuKLplwiLFwibG9hbmdcIjpcIuKfrFwiLFwibG9hcnJcIjpcIuKHvVwiLFwibG9icmtcIjpcIuKfplwiLFwibG9uZ2xlZnRhcnJvd1wiOlwi4p+1XCIsXCJMb25nTGVmdEFycm93XCI6XCLin7VcIixcIkxvbmdsZWZ0YXJyb3dcIjpcIuKfuFwiLFwibG9uZ2xlZnRyaWdodGFycm93XCI6XCLin7dcIixcIkxvbmdMZWZ0UmlnaHRBcnJvd1wiOlwi4p+3XCIsXCJMb25nbGVmdHJpZ2h0YXJyb3dcIjpcIuKfulwiLFwibG9uZ21hcHN0b1wiOlwi4p+8XCIsXCJsb25ncmlnaHRhcnJvd1wiOlwi4p+2XCIsXCJMb25nUmlnaHRBcnJvd1wiOlwi4p+2XCIsXCJMb25ncmlnaHRhcnJvd1wiOlwi4p+5XCIsXCJsb29wYXJyb3dsZWZ0XCI6XCLihqtcIixcImxvb3BhcnJvd3JpZ2h0XCI6XCLihqxcIixcImxvcGFyXCI6XCLipoVcIixcIkxvcGZcIjpcIvCdlYNcIixcImxvcGZcIjpcIvCdlZ1cIixcImxvcGx1c1wiOlwi4qitXCIsXCJsb3RpbWVzXCI6XCLiqLRcIixcImxvd2FzdFwiOlwi4oiXXCIsXCJsb3diYXJcIjpcIl9cIixcIkxvd2VyTGVmdEFycm93XCI6XCLihplcIixcIkxvd2VyUmlnaHRBcnJvd1wiOlwi4oaYXCIsXCJsb3pcIjpcIuKXilwiLFwibG96ZW5nZVwiOlwi4peKXCIsXCJsb3pmXCI6XCLip6tcIixcImxwYXJcIjpcIihcIixcImxwYXJsdFwiOlwi4qaTXCIsXCJscmFyclwiOlwi4oeGXCIsXCJscmNvcm5lclwiOlwi4oyfXCIsXCJscmhhclwiOlwi4oeLXCIsXCJscmhhcmRcIjpcIuKlrVwiLFwibHJtXCI6XCLigI5cIixcImxydHJpXCI6XCLiir9cIixcImxzYXF1b1wiOlwi4oC5XCIsXCJsc2NyXCI6XCLwnZOBXCIsXCJMc2NyXCI6XCLihJJcIixcImxzaFwiOlwi4oawXCIsXCJMc2hcIjpcIuKGsFwiLFwibHNpbVwiOlwi4omyXCIsXCJsc2ltZVwiOlwi4qqNXCIsXCJsc2ltZ1wiOlwi4qqPXCIsXCJsc3FiXCI6XCJbXCIsXCJsc3F1b1wiOlwi4oCYXCIsXCJsc3F1b3JcIjpcIuKAmlwiLFwiTHN0cm9rXCI6XCLFgVwiLFwibHN0cm9rXCI6XCLFglwiLFwibHRjY1wiOlwi4qqmXCIsXCJsdGNpclwiOlwi4qm5XCIsXCJsdFwiOlwiPFwiLFwiTFRcIjpcIjxcIixcIkx0XCI6XCLiiapcIixcImx0ZG90XCI6XCLii5ZcIixcImx0aHJlZVwiOlwi4ouLXCIsXCJsdGltZXNcIjpcIuKLiVwiLFwibHRsYXJyXCI6XCLipbZcIixcImx0cXVlc3RcIjpcIuKpu1wiLFwibHRyaVwiOlwi4peDXCIsXCJsdHJpZVwiOlwi4oq0XCIsXCJsdHJpZlwiOlwi4peCXCIsXCJsdHJQYXJcIjpcIuKmllwiLFwibHVyZHNoYXJcIjpcIuKlilwiLFwibHVydWhhclwiOlwi4qWmXCIsXCJsdmVydG5lcXFcIjpcIuKJqO+4gFwiLFwibHZuRVwiOlwi4omo77iAXCIsXCJtYWNyXCI6XCLCr1wiLFwibWFsZVwiOlwi4pmCXCIsXCJtYWx0XCI6XCLinKBcIixcIm1hbHRlc2VcIjpcIuKcoFwiLFwiTWFwXCI6XCLipIVcIixcIm1hcFwiOlwi4oamXCIsXCJtYXBzdG9cIjpcIuKGplwiLFwibWFwc3RvZG93blwiOlwi4oanXCIsXCJtYXBzdG9sZWZ0XCI6XCLihqRcIixcIm1hcHN0b3VwXCI6XCLihqVcIixcIm1hcmtlclwiOlwi4pauXCIsXCJtY29tbWFcIjpcIuKoqVwiLFwiTWN5XCI6XCLQnFwiLFwibWN5XCI6XCLQvFwiLFwibWRhc2hcIjpcIuKAlFwiLFwibUREb3RcIjpcIuKIulwiLFwibWVhc3VyZWRhbmdsZVwiOlwi4oihXCIsXCJNZWRpdW1TcGFjZVwiOlwi4oGfXCIsXCJNZWxsaW50cmZcIjpcIuKEs1wiLFwiTWZyXCI6XCLwnZSQXCIsXCJtZnJcIjpcIvCdlKpcIixcIm1ob1wiOlwi4oSnXCIsXCJtaWNyb1wiOlwiwrVcIixcIm1pZGFzdFwiOlwiKlwiLFwibWlkY2lyXCI6XCLiq7BcIixcIm1pZFwiOlwi4oijXCIsXCJtaWRkb3RcIjpcIsK3XCIsXCJtaW51c2JcIjpcIuKKn1wiLFwibWludXNcIjpcIuKIklwiLFwibWludXNkXCI6XCLiiLhcIixcIm1pbnVzZHVcIjpcIuKoqlwiLFwiTWludXNQbHVzXCI6XCLiiJNcIixcIm1sY3BcIjpcIuKrm1wiLFwibWxkclwiOlwi4oCmXCIsXCJtbnBsdXNcIjpcIuKIk1wiLFwibW9kZWxzXCI6XCLiiqdcIixcIk1vcGZcIjpcIvCdlYRcIixcIm1vcGZcIjpcIvCdlZ5cIixcIm1wXCI6XCLiiJNcIixcIm1zY3JcIjpcIvCdk4JcIixcIk1zY3JcIjpcIuKEs1wiLFwibXN0cG9zXCI6XCLiiL5cIixcIk11XCI6XCLOnFwiLFwibXVcIjpcIs68XCIsXCJtdWx0aW1hcFwiOlwi4oq4XCIsXCJtdW1hcFwiOlwi4oq4XCIsXCJuYWJsYVwiOlwi4oiHXCIsXCJOYWN1dGVcIjpcIsWDXCIsXCJuYWN1dGVcIjpcIsWEXCIsXCJuYW5nXCI6XCLiiKDig5JcIixcIm5hcFwiOlwi4omJXCIsXCJuYXBFXCI6XCLiqbDMuFwiLFwibmFwaWRcIjpcIuKJi8y4XCIsXCJuYXBvc1wiOlwixYlcIixcIm5hcHByb3hcIjpcIuKJiVwiLFwibmF0dXJhbFwiOlwi4pmuXCIsXCJuYXR1cmFsc1wiOlwi4oSVXCIsXCJuYXR1clwiOlwi4pmuXCIsXCJuYnNwXCI6XCLCoFwiLFwibmJ1bXBcIjpcIuKJjsy4XCIsXCJuYnVtcGVcIjpcIuKJj8y4XCIsXCJuY2FwXCI6XCLiqYNcIixcIk5jYXJvblwiOlwixYdcIixcIm5jYXJvblwiOlwixYhcIixcIk5jZWRpbFwiOlwixYVcIixcIm5jZWRpbFwiOlwixYZcIixcIm5jb25nXCI6XCLiiYdcIixcIm5jb25nZG90XCI6XCLiqa3MuFwiLFwibmN1cFwiOlwi4qmCXCIsXCJOY3lcIjpcItCdXCIsXCJuY3lcIjpcItC9XCIsXCJuZGFzaFwiOlwi4oCTXCIsXCJuZWFyaGtcIjpcIuKkpFwiLFwibmVhcnJcIjpcIuKGl1wiLFwibmVBcnJcIjpcIuKHl1wiLFwibmVhcnJvd1wiOlwi4oaXXCIsXCJuZVwiOlwi4omgXCIsXCJuZWRvdFwiOlwi4omQzLhcIixcIk5lZ2F0aXZlTWVkaXVtU3BhY2VcIjpcIuKAi1wiLFwiTmVnYXRpdmVUaGlja1NwYWNlXCI6XCLigItcIixcIk5lZ2F0aXZlVGhpblNwYWNlXCI6XCLigItcIixcIk5lZ2F0aXZlVmVyeVRoaW5TcGFjZVwiOlwi4oCLXCIsXCJuZXF1aXZcIjpcIuKJolwiLFwibmVzZWFyXCI6XCLipKhcIixcIm5lc2ltXCI6XCLiiYLMuFwiLFwiTmVzdGVkR3JlYXRlckdyZWF0ZXJcIjpcIuKJq1wiLFwiTmVzdGVkTGVzc0xlc3NcIjpcIuKJqlwiLFwiTmV3TGluZVwiOlwiXFxuXCIsXCJuZXhpc3RcIjpcIuKIhFwiLFwibmV4aXN0c1wiOlwi4oiEXCIsXCJOZnJcIjpcIvCdlJFcIixcIm5mclwiOlwi8J2Uq1wiLFwibmdFXCI6XCLiiafMuFwiLFwibmdlXCI6XCLiibFcIixcIm5nZXFcIjpcIuKJsVwiLFwibmdlcXFcIjpcIuKJp8y4XCIsXCJuZ2Vxc2xhbnRcIjpcIuKpvsy4XCIsXCJuZ2VzXCI6XCLiqb7MuFwiLFwibkdnXCI6XCLii5nMuFwiLFwibmdzaW1cIjpcIuKJtVwiLFwibkd0XCI6XCLiiavig5JcIixcIm5ndFwiOlwi4omvXCIsXCJuZ3RyXCI6XCLiia9cIixcIm5HdHZcIjpcIuKJq8y4XCIsXCJuaGFyclwiOlwi4oauXCIsXCJuaEFyclwiOlwi4oeOXCIsXCJuaHBhclwiOlwi4quyXCIsXCJuaVwiOlwi4oiLXCIsXCJuaXNcIjpcIuKLvFwiLFwibmlzZFwiOlwi4ou6XCIsXCJuaXZcIjpcIuKIi1wiLFwiTkpjeVwiOlwi0IpcIixcIm5qY3lcIjpcItGaXCIsXCJubGFyclwiOlwi4oaaXCIsXCJubEFyclwiOlwi4oeNXCIsXCJubGRyXCI6XCLigKVcIixcIm5sRVwiOlwi4ommzLhcIixcIm5sZVwiOlwi4omwXCIsXCJubGVmdGFycm93XCI6XCLihppcIixcIm5MZWZ0YXJyb3dcIjpcIuKHjVwiLFwibmxlZnRyaWdodGFycm93XCI6XCLihq5cIixcIm5MZWZ0cmlnaHRhcnJvd1wiOlwi4oeOXCIsXCJubGVxXCI6XCLiibBcIixcIm5sZXFxXCI6XCLiiabMuFwiLFwibmxlcXNsYW50XCI6XCLiqb3MuFwiLFwibmxlc1wiOlwi4qm9zLhcIixcIm5sZXNzXCI6XCLiia5cIixcIm5MbFwiOlwi4ouYzLhcIixcIm5sc2ltXCI6XCLiibRcIixcIm5MdFwiOlwi4omq4oOSXCIsXCJubHRcIjpcIuKJrlwiLFwibmx0cmlcIjpcIuKLqlwiLFwibmx0cmllXCI6XCLii6xcIixcIm5MdHZcIjpcIuKJqsy4XCIsXCJubWlkXCI6XCLiiKRcIixcIk5vQnJlYWtcIjpcIuKBoFwiLFwiTm9uQnJlYWtpbmdTcGFjZVwiOlwiwqBcIixcIm5vcGZcIjpcIvCdlZ9cIixcIk5vcGZcIjpcIuKElVwiLFwiTm90XCI6XCLiq6xcIixcIm5vdFwiOlwiwqxcIixcIk5vdENvbmdydWVudFwiOlwi4omiXCIsXCJOb3RDdXBDYXBcIjpcIuKJrVwiLFwiTm90RG91YmxlVmVydGljYWxCYXJcIjpcIuKIplwiLFwiTm90RWxlbWVudFwiOlwi4oiJXCIsXCJOb3RFcXVhbFwiOlwi4omgXCIsXCJOb3RFcXVhbFRpbGRlXCI6XCLiiYLMuFwiLFwiTm90RXhpc3RzXCI6XCLiiIRcIixcIk5vdEdyZWF0ZXJcIjpcIuKJr1wiLFwiTm90R3JlYXRlckVxdWFsXCI6XCLiibFcIixcIk5vdEdyZWF0ZXJGdWxsRXF1YWxcIjpcIuKJp8y4XCIsXCJOb3RHcmVhdGVyR3JlYXRlclwiOlwi4omrzLhcIixcIk5vdEdyZWF0ZXJMZXNzXCI6XCLiiblcIixcIk5vdEdyZWF0ZXJTbGFudEVxdWFsXCI6XCLiqb7MuFwiLFwiTm90R3JlYXRlclRpbGRlXCI6XCLiibVcIixcIk5vdEh1bXBEb3duSHVtcFwiOlwi4omOzLhcIixcIk5vdEh1bXBFcXVhbFwiOlwi4omPzLhcIixcIm5vdGluXCI6XCLiiIlcIixcIm5vdGluZG90XCI6XCLii7XMuFwiLFwibm90aW5FXCI6XCLii7nMuFwiLFwibm90aW52YVwiOlwi4oiJXCIsXCJub3RpbnZiXCI6XCLii7dcIixcIm5vdGludmNcIjpcIuKLtlwiLFwiTm90TGVmdFRyaWFuZ2xlQmFyXCI6XCLip4/MuFwiLFwiTm90TGVmdFRyaWFuZ2xlXCI6XCLii6pcIixcIk5vdExlZnRUcmlhbmdsZUVxdWFsXCI6XCLii6xcIixcIk5vdExlc3NcIjpcIuKJrlwiLFwiTm90TGVzc0VxdWFsXCI6XCLiibBcIixcIk5vdExlc3NHcmVhdGVyXCI6XCLiibhcIixcIk5vdExlc3NMZXNzXCI6XCLiiarMuFwiLFwiTm90TGVzc1NsYW50RXF1YWxcIjpcIuKpvcy4XCIsXCJOb3RMZXNzVGlsZGVcIjpcIuKJtFwiLFwiTm90TmVzdGVkR3JlYXRlckdyZWF0ZXJcIjpcIuKqosy4XCIsXCJOb3ROZXN0ZWRMZXNzTGVzc1wiOlwi4qqhzLhcIixcIm5vdG5pXCI6XCLiiIxcIixcIm5vdG5pdmFcIjpcIuKIjFwiLFwibm90bml2YlwiOlwi4ou+XCIsXCJub3RuaXZjXCI6XCLii71cIixcIk5vdFByZWNlZGVzXCI6XCLiioBcIixcIk5vdFByZWNlZGVzRXF1YWxcIjpcIuKqr8y4XCIsXCJOb3RQcmVjZWRlc1NsYW50RXF1YWxcIjpcIuKLoFwiLFwiTm90UmV2ZXJzZUVsZW1lbnRcIjpcIuKIjFwiLFwiTm90UmlnaHRUcmlhbmdsZUJhclwiOlwi4qeQzLhcIixcIk5vdFJpZ2h0VHJpYW5nbGVcIjpcIuKLq1wiLFwiTm90UmlnaHRUcmlhbmdsZUVxdWFsXCI6XCLii61cIixcIk5vdFNxdWFyZVN1YnNldFwiOlwi4oqPzLhcIixcIk5vdFNxdWFyZVN1YnNldEVxdWFsXCI6XCLii6JcIixcIk5vdFNxdWFyZVN1cGVyc2V0XCI6XCLiipDMuFwiLFwiTm90U3F1YXJlU3VwZXJzZXRFcXVhbFwiOlwi4oujXCIsXCJOb3RTdWJzZXRcIjpcIuKKguKDklwiLFwiTm90U3Vic2V0RXF1YWxcIjpcIuKKiFwiLFwiTm90U3VjY2VlZHNcIjpcIuKKgVwiLFwiTm90U3VjY2VlZHNFcXVhbFwiOlwi4qqwzLhcIixcIk5vdFN1Y2NlZWRzU2xhbnRFcXVhbFwiOlwi4ouhXCIsXCJOb3RTdWNjZWVkc1RpbGRlXCI6XCLiib/MuFwiLFwiTm90U3VwZXJzZXRcIjpcIuKKg+KDklwiLFwiTm90U3VwZXJzZXRFcXVhbFwiOlwi4oqJXCIsXCJOb3RUaWxkZVwiOlwi4omBXCIsXCJOb3RUaWxkZUVxdWFsXCI6XCLiiYRcIixcIk5vdFRpbGRlRnVsbEVxdWFsXCI6XCLiiYdcIixcIk5vdFRpbGRlVGlsZGVcIjpcIuKJiVwiLFwiTm90VmVydGljYWxCYXJcIjpcIuKIpFwiLFwibnBhcmFsbGVsXCI6XCLiiKZcIixcIm5wYXJcIjpcIuKIplwiLFwibnBhcnNsXCI6XCLiq73ig6VcIixcIm5wYXJ0XCI6XCLiiILMuFwiLFwibnBvbGludFwiOlwi4qiUXCIsXCJucHJcIjpcIuKKgFwiLFwibnByY3VlXCI6XCLii6BcIixcIm5wcmVjXCI6XCLiioBcIixcIm5wcmVjZXFcIjpcIuKqr8y4XCIsXCJucHJlXCI6XCLiqq/MuFwiLFwibnJhcnJjXCI6XCLipLPMuFwiLFwibnJhcnJcIjpcIuKGm1wiLFwibnJBcnJcIjpcIuKHj1wiLFwibnJhcnJ3XCI6XCLihp3MuFwiLFwibnJpZ2h0YXJyb3dcIjpcIuKGm1wiLFwiblJpZ2h0YXJyb3dcIjpcIuKHj1wiLFwibnJ0cmlcIjpcIuKLq1wiLFwibnJ0cmllXCI6XCLii61cIixcIm5zY1wiOlwi4oqBXCIsXCJuc2NjdWVcIjpcIuKLoVwiLFwibnNjZVwiOlwi4qqwzLhcIixcIk5zY3JcIjpcIvCdkqlcIixcIm5zY3JcIjpcIvCdk4NcIixcIm5zaG9ydG1pZFwiOlwi4oikXCIsXCJuc2hvcnRwYXJhbGxlbFwiOlwi4oimXCIsXCJuc2ltXCI6XCLiiYFcIixcIm5zaW1lXCI6XCLiiYRcIixcIm5zaW1lcVwiOlwi4omEXCIsXCJuc21pZFwiOlwi4oikXCIsXCJuc3BhclwiOlwi4oimXCIsXCJuc3FzdWJlXCI6XCLii6JcIixcIm5zcXN1cGVcIjpcIuKLo1wiLFwibnN1YlwiOlwi4oqEXCIsXCJuc3ViRVwiOlwi4quFzLhcIixcIm5zdWJlXCI6XCLiiohcIixcIm5zdWJzZXRcIjpcIuKKguKDklwiLFwibnN1YnNldGVxXCI6XCLiiohcIixcIm5zdWJzZXRlcXFcIjpcIuKrhcy4XCIsXCJuc3VjY1wiOlwi4oqBXCIsXCJuc3VjY2VxXCI6XCLiqrDMuFwiLFwibnN1cFwiOlwi4oqFXCIsXCJuc3VwRVwiOlwi4quGzLhcIixcIm5zdXBlXCI6XCLiiolcIixcIm5zdXBzZXRcIjpcIuKKg+KDklwiLFwibnN1cHNldGVxXCI6XCLiiolcIixcIm5zdXBzZXRlcXFcIjpcIuKrhsy4XCIsXCJudGdsXCI6XCLiiblcIixcIk50aWxkZVwiOlwiw5FcIixcIm50aWxkZVwiOlwiw7FcIixcIm50bGdcIjpcIuKJuFwiLFwibnRyaWFuZ2xlbGVmdFwiOlwi4ouqXCIsXCJudHJpYW5nbGVsZWZ0ZXFcIjpcIuKLrFwiLFwibnRyaWFuZ2xlcmlnaHRcIjpcIuKLq1wiLFwibnRyaWFuZ2xlcmlnaHRlcVwiOlwi4outXCIsXCJOdVwiOlwizp1cIixcIm51XCI6XCLOvVwiLFwibnVtXCI6XCIjXCIsXCJudW1lcm9cIjpcIuKEllwiLFwibnVtc3BcIjpcIuKAh1wiLFwibnZhcFwiOlwi4omN4oOSXCIsXCJudmRhc2hcIjpcIuKKrFwiLFwibnZEYXNoXCI6XCLiiq1cIixcIm5WZGFzaFwiOlwi4oquXCIsXCJuVkRhc2hcIjpcIuKKr1wiLFwibnZnZVwiOlwi4oml4oOSXCIsXCJudmd0XCI6XCI+4oOSXCIsXCJudkhhcnJcIjpcIuKkhFwiLFwibnZpbmZpblwiOlwi4qeeXCIsXCJudmxBcnJcIjpcIuKkglwiLFwibnZsZVwiOlwi4omk4oOSXCIsXCJudmx0XCI6XCI84oOSXCIsXCJudmx0cmllXCI6XCLiirTig5JcIixcIm52ckFyclwiOlwi4qSDXCIsXCJudnJ0cmllXCI6XCLiirXig5JcIixcIm52c2ltXCI6XCLiiLzig5JcIixcIm53YXJoa1wiOlwi4qSjXCIsXCJud2FyclwiOlwi4oaWXCIsXCJud0FyclwiOlwi4oeWXCIsXCJud2Fycm93XCI6XCLihpZcIixcIm53bmVhclwiOlwi4qSnXCIsXCJPYWN1dGVcIjpcIsOTXCIsXCJvYWN1dGVcIjpcIsOzXCIsXCJvYXN0XCI6XCLiiptcIixcIk9jaXJjXCI6XCLDlFwiLFwib2NpcmNcIjpcIsO0XCIsXCJvY2lyXCI6XCLiippcIixcIk9jeVwiOlwi0J5cIixcIm9jeVwiOlwi0L5cIixcIm9kYXNoXCI6XCLiip1cIixcIk9kYmxhY1wiOlwixZBcIixcIm9kYmxhY1wiOlwixZFcIixcIm9kaXZcIjpcIuKouFwiLFwib2RvdFwiOlwi4oqZXCIsXCJvZHNvbGRcIjpcIuKmvFwiLFwiT0VsaWdcIjpcIsWSXCIsXCJvZWxpZ1wiOlwixZNcIixcIm9mY2lyXCI6XCLipr9cIixcIk9mclwiOlwi8J2UklwiLFwib2ZyXCI6XCLwnZSsXCIsXCJvZ29uXCI6XCLLm1wiLFwiT2dyYXZlXCI6XCLDklwiLFwib2dyYXZlXCI6XCLDslwiLFwib2d0XCI6XCLip4FcIixcIm9oYmFyXCI6XCLiprVcIixcIm9obVwiOlwizqlcIixcIm9pbnRcIjpcIuKIrlwiLFwib2xhcnJcIjpcIuKGulwiLFwib2xjaXJcIjpcIuKmvlwiLFwib2xjcm9zc1wiOlwi4qa7XCIsXCJvbGluZVwiOlwi4oC+XCIsXCJvbHRcIjpcIuKngFwiLFwiT21hY3JcIjpcIsWMXCIsXCJvbWFjclwiOlwixY1cIixcIk9tZWdhXCI6XCLOqVwiLFwib21lZ2FcIjpcIs+JXCIsXCJPbWljcm9uXCI6XCLOn1wiLFwib21pY3JvblwiOlwizr9cIixcIm9taWRcIjpcIuKmtlwiLFwib21pbnVzXCI6XCLiipZcIixcIk9vcGZcIjpcIvCdlYZcIixcIm9vcGZcIjpcIvCdlaBcIixcIm9wYXJcIjpcIuKmt1wiLFwiT3BlbkN1cmx5RG91YmxlUXVvdGVcIjpcIuKAnFwiLFwiT3BlbkN1cmx5UXVvdGVcIjpcIuKAmFwiLFwib3BlcnBcIjpcIuKmuVwiLFwib3BsdXNcIjpcIuKKlVwiLFwib3JhcnJcIjpcIuKGu1wiLFwiT3JcIjpcIuKplFwiLFwib3JcIjpcIuKIqFwiLFwib3JkXCI6XCLiqZ1cIixcIm9yZGVyXCI6XCLihLRcIixcIm9yZGVyb2ZcIjpcIuKEtFwiLFwib3JkZlwiOlwiwqpcIixcIm9yZG1cIjpcIsK6XCIsXCJvcmlnb2ZcIjpcIuKKtlwiLFwib3JvclwiOlwi4qmWXCIsXCJvcnNsb3BlXCI6XCLiqZdcIixcIm9ydlwiOlwi4qmbXCIsXCJvU1wiOlwi4pOIXCIsXCJPc2NyXCI6XCLwnZKqXCIsXCJvc2NyXCI6XCLihLRcIixcIk9zbGFzaFwiOlwiw5hcIixcIm9zbGFzaFwiOlwiw7hcIixcIm9zb2xcIjpcIuKKmFwiLFwiT3RpbGRlXCI6XCLDlVwiLFwib3RpbGRlXCI6XCLDtVwiLFwib3RpbWVzYXNcIjpcIuKotlwiLFwiT3RpbWVzXCI6XCLiqLdcIixcIm90aW1lc1wiOlwi4oqXXCIsXCJPdW1sXCI6XCLDllwiLFwib3VtbFwiOlwiw7ZcIixcIm92YmFyXCI6XCLijL1cIixcIk92ZXJCYXJcIjpcIuKAvlwiLFwiT3ZlckJyYWNlXCI6XCLij55cIixcIk92ZXJCcmFja2V0XCI6XCLijrRcIixcIk92ZXJQYXJlbnRoZXNpc1wiOlwi4o+cXCIsXCJwYXJhXCI6XCLCtlwiLFwicGFyYWxsZWxcIjpcIuKIpVwiLFwicGFyXCI6XCLiiKVcIixcInBhcnNpbVwiOlwi4quzXCIsXCJwYXJzbFwiOlwi4qu9XCIsXCJwYXJ0XCI6XCLiiIJcIixcIlBhcnRpYWxEXCI6XCLiiIJcIixcIlBjeVwiOlwi0J9cIixcInBjeVwiOlwi0L9cIixcInBlcmNudFwiOlwiJVwiLFwicGVyaW9kXCI6XCIuXCIsXCJwZXJtaWxcIjpcIuKAsFwiLFwicGVycFwiOlwi4oqlXCIsXCJwZXJ0ZW5rXCI6XCLigLFcIixcIlBmclwiOlwi8J2Uk1wiLFwicGZyXCI6XCLwnZStXCIsXCJQaGlcIjpcIs6mXCIsXCJwaGlcIjpcIs+GXCIsXCJwaGl2XCI6XCLPlVwiLFwicGhtbWF0XCI6XCLihLNcIixcInBob25lXCI6XCLimI5cIixcIlBpXCI6XCLOoFwiLFwicGlcIjpcIs+AXCIsXCJwaXRjaGZvcmtcIjpcIuKLlFwiLFwicGl2XCI6XCLPllwiLFwicGxhbmNrXCI6XCLihI9cIixcInBsYW5ja2hcIjpcIuKEjlwiLFwicGxhbmt2XCI6XCLihI9cIixcInBsdXNhY2lyXCI6XCLiqKNcIixcInBsdXNiXCI6XCLiip5cIixcInBsdXNjaXJcIjpcIuKoolwiLFwicGx1c1wiOlwiK1wiLFwicGx1c2RvXCI6XCLiiJRcIixcInBsdXNkdVwiOlwi4qilXCIsXCJwbHVzZVwiOlwi4qmyXCIsXCJQbHVzTWludXNcIjpcIsKxXCIsXCJwbHVzbW5cIjpcIsKxXCIsXCJwbHVzc2ltXCI6XCLiqKZcIixcInBsdXN0d29cIjpcIuKop1wiLFwicG1cIjpcIsKxXCIsXCJQb2luY2FyZXBsYW5lXCI6XCLihIxcIixcInBvaW50aW50XCI6XCLiqJVcIixcInBvcGZcIjpcIvCdlaFcIixcIlBvcGZcIjpcIuKEmVwiLFwicG91bmRcIjpcIsKjXCIsXCJwcmFwXCI6XCLiqrdcIixcIlByXCI6XCLiqrtcIixcInByXCI6XCLiibpcIixcInByY3VlXCI6XCLiibxcIixcInByZWNhcHByb3hcIjpcIuKqt1wiLFwicHJlY1wiOlwi4om6XCIsXCJwcmVjY3VybHllcVwiOlwi4om8XCIsXCJQcmVjZWRlc1wiOlwi4om6XCIsXCJQcmVjZWRlc0VxdWFsXCI6XCLiqq9cIixcIlByZWNlZGVzU2xhbnRFcXVhbFwiOlwi4om8XCIsXCJQcmVjZWRlc1RpbGRlXCI6XCLiib5cIixcInByZWNlcVwiOlwi4qqvXCIsXCJwcmVjbmFwcHJveFwiOlwi4qq5XCIsXCJwcmVjbmVxcVwiOlwi4qq1XCIsXCJwcmVjbnNpbVwiOlwi4ouoXCIsXCJwcmVcIjpcIuKqr1wiLFwicHJFXCI6XCLiqrNcIixcInByZWNzaW1cIjpcIuKJvlwiLFwicHJpbWVcIjpcIuKAslwiLFwiUHJpbWVcIjpcIuKAs1wiLFwicHJpbWVzXCI6XCLihJlcIixcInBybmFwXCI6XCLiqrlcIixcInBybkVcIjpcIuKqtVwiLFwicHJuc2ltXCI6XCLii6hcIixcInByb2RcIjpcIuKIj1wiLFwiUHJvZHVjdFwiOlwi4oiPXCIsXCJwcm9mYWxhclwiOlwi4oyuXCIsXCJwcm9mbGluZVwiOlwi4oySXCIsXCJwcm9mc3VyZlwiOlwi4oyTXCIsXCJwcm9wXCI6XCLiiJ1cIixcIlByb3BvcnRpb25hbFwiOlwi4oidXCIsXCJQcm9wb3J0aW9uXCI6XCLiiLdcIixcInByb3B0b1wiOlwi4oidXCIsXCJwcnNpbVwiOlwi4om+XCIsXCJwcnVyZWxcIjpcIuKKsFwiLFwiUHNjclwiOlwi8J2Sq1wiLFwicHNjclwiOlwi8J2ThVwiLFwiUHNpXCI6XCLOqFwiLFwicHNpXCI6XCLPiFwiLFwicHVuY3NwXCI6XCLigIhcIixcIlFmclwiOlwi8J2UlFwiLFwicWZyXCI6XCLwnZSuXCIsXCJxaW50XCI6XCLiqIxcIixcInFvcGZcIjpcIvCdlaJcIixcIlFvcGZcIjpcIuKEmlwiLFwicXByaW1lXCI6XCLigZdcIixcIlFzY3JcIjpcIvCdkqxcIixcInFzY3JcIjpcIvCdk4ZcIixcInF1YXRlcm5pb25zXCI6XCLihI1cIixcInF1YXRpbnRcIjpcIuKollwiLFwicXVlc3RcIjpcIj9cIixcInF1ZXN0ZXFcIjpcIuKJn1wiLFwicXVvdFwiOlwiXFxcIlwiLFwiUVVPVFwiOlwiXFxcIlwiLFwickFhcnJcIjpcIuKHm1wiLFwicmFjZVwiOlwi4oi9zLFcIixcIlJhY3V0ZVwiOlwixZRcIixcInJhY3V0ZVwiOlwixZVcIixcInJhZGljXCI6XCLiiJpcIixcInJhZW1wdHl2XCI6XCLiprNcIixcInJhbmdcIjpcIuKfqVwiLFwiUmFuZ1wiOlwi4p+rXCIsXCJyYW5nZFwiOlwi4qaSXCIsXCJyYW5nZVwiOlwi4qalXCIsXCJyYW5nbGVcIjpcIuKfqVwiLFwicmFxdW9cIjpcIsK7XCIsXCJyYXJyYXBcIjpcIuKltVwiLFwicmFycmJcIjpcIuKHpVwiLFwicmFycmJmc1wiOlwi4qSgXCIsXCJyYXJyY1wiOlwi4qSzXCIsXCJyYXJyXCI6XCLihpJcIixcIlJhcnJcIjpcIuKGoFwiLFwickFyclwiOlwi4oeSXCIsXCJyYXJyZnNcIjpcIuKknlwiLFwicmFycmhrXCI6XCLihqpcIixcInJhcnJscFwiOlwi4oasXCIsXCJyYXJycGxcIjpcIuKlhVwiLFwicmFycnNpbVwiOlwi4qW0XCIsXCJSYXJydGxcIjpcIuKkllwiLFwicmFycnRsXCI6XCLihqNcIixcInJhcnJ3XCI6XCLihp1cIixcInJhdGFpbFwiOlwi4qSaXCIsXCJyQXRhaWxcIjpcIuKknFwiLFwicmF0aW9cIjpcIuKItlwiLFwicmF0aW9uYWxzXCI6XCLihJpcIixcInJiYXJyXCI6XCLipI1cIixcInJCYXJyXCI6XCLipI9cIixcIlJCYXJyXCI6XCLipJBcIixcInJiYnJrXCI6XCLinbNcIixcInJicmFjZVwiOlwifVwiLFwicmJyYWNrXCI6XCJdXCIsXCJyYnJrZVwiOlwi4qaMXCIsXCJyYnJrc2xkXCI6XCLipo5cIixcInJicmtzbHVcIjpcIuKmkFwiLFwiUmNhcm9uXCI6XCLFmFwiLFwicmNhcm9uXCI6XCLFmVwiLFwiUmNlZGlsXCI6XCLFllwiLFwicmNlZGlsXCI6XCLFl1wiLFwicmNlaWxcIjpcIuKMiVwiLFwicmN1YlwiOlwifVwiLFwiUmN5XCI6XCLQoFwiLFwicmN5XCI6XCLRgFwiLFwicmRjYVwiOlwi4qS3XCIsXCJyZGxkaGFyXCI6XCLipalcIixcInJkcXVvXCI6XCLigJ1cIixcInJkcXVvclwiOlwi4oCdXCIsXCJyZHNoXCI6XCLihrNcIixcInJlYWxcIjpcIuKEnFwiLFwicmVhbGluZVwiOlwi4oSbXCIsXCJyZWFscGFydFwiOlwi4oScXCIsXCJyZWFsc1wiOlwi4oSdXCIsXCJSZVwiOlwi4oScXCIsXCJyZWN0XCI6XCLilq1cIixcInJlZ1wiOlwiwq5cIixcIlJFR1wiOlwiwq5cIixcIlJldmVyc2VFbGVtZW50XCI6XCLiiItcIixcIlJldmVyc2VFcXVpbGlicml1bVwiOlwi4oeLXCIsXCJSZXZlcnNlVXBFcXVpbGlicml1bVwiOlwi4qWvXCIsXCJyZmlzaHRcIjpcIuKlvVwiLFwicmZsb29yXCI6XCLijItcIixcInJmclwiOlwi8J2Ur1wiLFwiUmZyXCI6XCLihJxcIixcInJIYXJcIjpcIuKlpFwiLFwicmhhcmRcIjpcIuKHgVwiLFwicmhhcnVcIjpcIuKHgFwiLFwicmhhcnVsXCI6XCLipaxcIixcIlJob1wiOlwizqFcIixcInJob1wiOlwiz4FcIixcInJob3ZcIjpcIs+xXCIsXCJSaWdodEFuZ2xlQnJhY2tldFwiOlwi4p+pXCIsXCJSaWdodEFycm93QmFyXCI6XCLih6VcIixcInJpZ2h0YXJyb3dcIjpcIuKGklwiLFwiUmlnaHRBcnJvd1wiOlwi4oaSXCIsXCJSaWdodGFycm93XCI6XCLih5JcIixcIlJpZ2h0QXJyb3dMZWZ0QXJyb3dcIjpcIuKHhFwiLFwicmlnaHRhcnJvd3RhaWxcIjpcIuKGo1wiLFwiUmlnaHRDZWlsaW5nXCI6XCLijIlcIixcIlJpZ2h0RG91YmxlQnJhY2tldFwiOlwi4p+nXCIsXCJSaWdodERvd25UZWVWZWN0b3JcIjpcIuKlnVwiLFwiUmlnaHREb3duVmVjdG9yQmFyXCI6XCLipZVcIixcIlJpZ2h0RG93blZlY3RvclwiOlwi4oeCXCIsXCJSaWdodEZsb29yXCI6XCLijItcIixcInJpZ2h0aGFycG9vbmRvd25cIjpcIuKHgVwiLFwicmlnaHRoYXJwb29udXBcIjpcIuKHgFwiLFwicmlnaHRsZWZ0YXJyb3dzXCI6XCLih4RcIixcInJpZ2h0bGVmdGhhcnBvb25zXCI6XCLih4xcIixcInJpZ2h0cmlnaHRhcnJvd3NcIjpcIuKHiVwiLFwicmlnaHRzcXVpZ2Fycm93XCI6XCLihp1cIixcIlJpZ2h0VGVlQXJyb3dcIjpcIuKGplwiLFwiUmlnaHRUZWVcIjpcIuKKolwiLFwiUmlnaHRUZWVWZWN0b3JcIjpcIuKlm1wiLFwicmlnaHR0aHJlZXRpbWVzXCI6XCLii4xcIixcIlJpZ2h0VHJpYW5nbGVCYXJcIjpcIuKnkFwiLFwiUmlnaHRUcmlhbmdsZVwiOlwi4oqzXCIsXCJSaWdodFRyaWFuZ2xlRXF1YWxcIjpcIuKKtVwiLFwiUmlnaHRVcERvd25WZWN0b3JcIjpcIuKlj1wiLFwiUmlnaHRVcFRlZVZlY3RvclwiOlwi4qWcXCIsXCJSaWdodFVwVmVjdG9yQmFyXCI6XCLipZRcIixcIlJpZ2h0VXBWZWN0b3JcIjpcIuKGvlwiLFwiUmlnaHRWZWN0b3JCYXJcIjpcIuKlk1wiLFwiUmlnaHRWZWN0b3JcIjpcIuKHgFwiLFwicmluZ1wiOlwiy5pcIixcInJpc2luZ2RvdHNlcVwiOlwi4omTXCIsXCJybGFyclwiOlwi4oeEXCIsXCJybGhhclwiOlwi4oeMXCIsXCJybG1cIjpcIuKAj1wiLFwicm1vdXN0YWNoZVwiOlwi4o6xXCIsXCJybW91c3RcIjpcIuKOsVwiLFwicm5taWRcIjpcIuKrrlwiLFwicm9hbmdcIjpcIuKfrVwiLFwicm9hcnJcIjpcIuKHvlwiLFwicm9icmtcIjpcIuKfp1wiLFwicm9wYXJcIjpcIuKmhlwiLFwicm9wZlwiOlwi8J2Vo1wiLFwiUm9wZlwiOlwi4oSdXCIsXCJyb3BsdXNcIjpcIuKorlwiLFwicm90aW1lc1wiOlwi4qi1XCIsXCJSb3VuZEltcGxpZXNcIjpcIuKlsFwiLFwicnBhclwiOlwiKVwiLFwicnBhcmd0XCI6XCLippRcIixcInJwcG9saW50XCI6XCLiqJJcIixcInJyYXJyXCI6XCLih4lcIixcIlJyaWdodGFycm93XCI6XCLih5tcIixcInJzYXF1b1wiOlwi4oC6XCIsXCJyc2NyXCI6XCLwnZOHXCIsXCJSc2NyXCI6XCLihJtcIixcInJzaFwiOlwi4oaxXCIsXCJSc2hcIjpcIuKGsVwiLFwicnNxYlwiOlwiXVwiLFwicnNxdW9cIjpcIuKAmVwiLFwicnNxdW9yXCI6XCLigJlcIixcInJ0aHJlZVwiOlwi4ouMXCIsXCJydGltZXNcIjpcIuKLilwiLFwicnRyaVwiOlwi4pa5XCIsXCJydHJpZVwiOlwi4oq1XCIsXCJydHJpZlwiOlwi4pa4XCIsXCJydHJpbHRyaVwiOlwi4qeOXCIsXCJSdWxlRGVsYXllZFwiOlwi4qe0XCIsXCJydWx1aGFyXCI6XCLipahcIixcInJ4XCI6XCLihJ5cIixcIlNhY3V0ZVwiOlwixZpcIixcInNhY3V0ZVwiOlwixZtcIixcInNicXVvXCI6XCLigJpcIixcInNjYXBcIjpcIuKquFwiLFwiU2Nhcm9uXCI6XCLFoFwiLFwic2Nhcm9uXCI6XCLFoVwiLFwiU2NcIjpcIuKqvFwiLFwic2NcIjpcIuKJu1wiLFwic2NjdWVcIjpcIuKJvVwiLFwic2NlXCI6XCLiqrBcIixcInNjRVwiOlwi4qq0XCIsXCJTY2VkaWxcIjpcIsWeXCIsXCJzY2VkaWxcIjpcIsWfXCIsXCJTY2lyY1wiOlwixZxcIixcInNjaXJjXCI6XCLFnVwiLFwic2NuYXBcIjpcIuKqulwiLFwic2NuRVwiOlwi4qq2XCIsXCJzY25zaW1cIjpcIuKLqVwiLFwic2Nwb2xpbnRcIjpcIuKok1wiLFwic2NzaW1cIjpcIuKJv1wiLFwiU2N5XCI6XCLQoVwiLFwic2N5XCI6XCLRgVwiLFwic2RvdGJcIjpcIuKKoVwiLFwic2RvdFwiOlwi4ouFXCIsXCJzZG90ZVwiOlwi4qmmXCIsXCJzZWFyaGtcIjpcIuKkpVwiLFwic2VhcnJcIjpcIuKGmFwiLFwic2VBcnJcIjpcIuKHmFwiLFwic2VhcnJvd1wiOlwi4oaYXCIsXCJzZWN0XCI6XCLCp1wiLFwic2VtaVwiOlwiO1wiLFwic2Vzd2FyXCI6XCLipKlcIixcInNldG1pbnVzXCI6XCLiiJZcIixcInNldG1uXCI6XCLiiJZcIixcInNleHRcIjpcIuKctlwiLFwiU2ZyXCI6XCLwnZSWXCIsXCJzZnJcIjpcIvCdlLBcIixcInNmcm93blwiOlwi4oyiXCIsXCJzaGFycFwiOlwi4pmvXCIsXCJTSENIY3lcIjpcItCpXCIsXCJzaGNoY3lcIjpcItGJXCIsXCJTSGN5XCI6XCLQqFwiLFwic2hjeVwiOlwi0YhcIixcIlNob3J0RG93bkFycm93XCI6XCLihpNcIixcIlNob3J0TGVmdEFycm93XCI6XCLihpBcIixcInNob3J0bWlkXCI6XCLiiKNcIixcInNob3J0cGFyYWxsZWxcIjpcIuKIpVwiLFwiU2hvcnRSaWdodEFycm93XCI6XCLihpJcIixcIlNob3J0VXBBcnJvd1wiOlwi4oaRXCIsXCJzaHlcIjpcIsKtXCIsXCJTaWdtYVwiOlwizqNcIixcInNpZ21hXCI6XCLPg1wiLFwic2lnbWFmXCI6XCLPglwiLFwic2lnbWF2XCI6XCLPglwiLFwic2ltXCI6XCLiiLxcIixcInNpbWRvdFwiOlwi4qmqXCIsXCJzaW1lXCI6XCLiiYNcIixcInNpbWVxXCI6XCLiiYNcIixcInNpbWdcIjpcIuKqnlwiLFwic2ltZ0VcIjpcIuKqoFwiLFwic2ltbFwiOlwi4qqdXCIsXCJzaW1sRVwiOlwi4qqfXCIsXCJzaW1uZVwiOlwi4omGXCIsXCJzaW1wbHVzXCI6XCLiqKRcIixcInNpbXJhcnJcIjpcIuKlslwiLFwic2xhcnJcIjpcIuKGkFwiLFwiU21hbGxDaXJjbGVcIjpcIuKImFwiLFwic21hbGxzZXRtaW51c1wiOlwi4oiWXCIsXCJzbWFzaHBcIjpcIuKos1wiLFwic21lcGFyc2xcIjpcIuKnpFwiLFwic21pZFwiOlwi4oijXCIsXCJzbWlsZVwiOlwi4oyjXCIsXCJzbXRcIjpcIuKqqlwiLFwic210ZVwiOlwi4qqsXCIsXCJzbXRlc1wiOlwi4qqs77iAXCIsXCJTT0ZUY3lcIjpcItCsXCIsXCJzb2Z0Y3lcIjpcItGMXCIsXCJzb2xiYXJcIjpcIuKMv1wiLFwic29sYlwiOlwi4qeEXCIsXCJzb2xcIjpcIi9cIixcIlNvcGZcIjpcIvCdlYpcIixcInNvcGZcIjpcIvCdlaRcIixcInNwYWRlc1wiOlwi4pmgXCIsXCJzcGFkZXN1aXRcIjpcIuKZoFwiLFwic3BhclwiOlwi4oilXCIsXCJzcWNhcFwiOlwi4oqTXCIsXCJzcWNhcHNcIjpcIuKKk++4gFwiLFwic3FjdXBcIjpcIuKKlFwiLFwic3FjdXBzXCI6XCLiipTvuIBcIixcIlNxcnRcIjpcIuKImlwiLFwic3FzdWJcIjpcIuKKj1wiLFwic3FzdWJlXCI6XCLiipFcIixcInNxc3Vic2V0XCI6XCLiio9cIixcInNxc3Vic2V0ZXFcIjpcIuKKkVwiLFwic3FzdXBcIjpcIuKKkFwiLFwic3FzdXBlXCI6XCLiipJcIixcInNxc3Vwc2V0XCI6XCLiipBcIixcInNxc3Vwc2V0ZXFcIjpcIuKKklwiLFwic3F1YXJlXCI6XCLilqFcIixcIlNxdWFyZVwiOlwi4pahXCIsXCJTcXVhcmVJbnRlcnNlY3Rpb25cIjpcIuKKk1wiLFwiU3F1YXJlU3Vic2V0XCI6XCLiio9cIixcIlNxdWFyZVN1YnNldEVxdWFsXCI6XCLiipFcIixcIlNxdWFyZVN1cGVyc2V0XCI6XCLiipBcIixcIlNxdWFyZVN1cGVyc2V0RXF1YWxcIjpcIuKKklwiLFwiU3F1YXJlVW5pb25cIjpcIuKKlFwiLFwic3F1YXJmXCI6XCLilqpcIixcInNxdVwiOlwi4pahXCIsXCJzcXVmXCI6XCLilqpcIixcInNyYXJyXCI6XCLihpJcIixcIlNzY3JcIjpcIvCdkq5cIixcInNzY3JcIjpcIvCdk4hcIixcInNzZXRtblwiOlwi4oiWXCIsXCJzc21pbGVcIjpcIuKMo1wiLFwic3N0YXJmXCI6XCLii4ZcIixcIlN0YXJcIjpcIuKLhlwiLFwic3RhclwiOlwi4piGXCIsXCJzdGFyZlwiOlwi4piFXCIsXCJzdHJhaWdodGVwc2lsb25cIjpcIs+1XCIsXCJzdHJhaWdodHBoaVwiOlwiz5VcIixcInN0cm5zXCI6XCLCr1wiLFwic3ViXCI6XCLiioJcIixcIlN1YlwiOlwi4ouQXCIsXCJzdWJkb3RcIjpcIuKqvVwiLFwic3ViRVwiOlwi4quFXCIsXCJzdWJlXCI6XCLiioZcIixcInN1YmVkb3RcIjpcIuKrg1wiLFwic3VibXVsdFwiOlwi4quBXCIsXCJzdWJuRVwiOlwi4quLXCIsXCJzdWJuZVwiOlwi4oqKXCIsXCJzdWJwbHVzXCI6XCLiqr9cIixcInN1YnJhcnJcIjpcIuKluVwiLFwic3Vic2V0XCI6XCLiioJcIixcIlN1YnNldFwiOlwi4ouQXCIsXCJzdWJzZXRlcVwiOlwi4oqGXCIsXCJzdWJzZXRlcXFcIjpcIuKrhVwiLFwiU3Vic2V0RXF1YWxcIjpcIuKKhlwiLFwic3Vic2V0bmVxXCI6XCLiiopcIixcInN1YnNldG5lcXFcIjpcIuKri1wiLFwic3Vic2ltXCI6XCLiq4dcIixcInN1YnN1YlwiOlwi4quVXCIsXCJzdWJzdXBcIjpcIuKrk1wiLFwic3VjY2FwcHJveFwiOlwi4qq4XCIsXCJzdWNjXCI6XCLiibtcIixcInN1Y2NjdXJseWVxXCI6XCLiib1cIixcIlN1Y2NlZWRzXCI6XCLiibtcIixcIlN1Y2NlZWRzRXF1YWxcIjpcIuKqsFwiLFwiU3VjY2VlZHNTbGFudEVxdWFsXCI6XCLiib1cIixcIlN1Y2NlZWRzVGlsZGVcIjpcIuKJv1wiLFwic3VjY2VxXCI6XCLiqrBcIixcInN1Y2NuYXBwcm94XCI6XCLiqrpcIixcInN1Y2NuZXFxXCI6XCLiqrZcIixcInN1Y2Nuc2ltXCI6XCLii6lcIixcInN1Y2NzaW1cIjpcIuKJv1wiLFwiU3VjaFRoYXRcIjpcIuKIi1wiLFwic3VtXCI6XCLiiJFcIixcIlN1bVwiOlwi4oiRXCIsXCJzdW5nXCI6XCLimapcIixcInN1cDFcIjpcIsK5XCIsXCJzdXAyXCI6XCLCslwiLFwic3VwM1wiOlwiwrNcIixcInN1cFwiOlwi4oqDXCIsXCJTdXBcIjpcIuKLkVwiLFwic3VwZG90XCI6XCLiqr5cIixcInN1cGRzdWJcIjpcIuKrmFwiLFwic3VwRVwiOlwi4quGXCIsXCJzdXBlXCI6XCLiiodcIixcInN1cGVkb3RcIjpcIuKrhFwiLFwiU3VwZXJzZXRcIjpcIuKKg1wiLFwiU3VwZXJzZXRFcXVhbFwiOlwi4oqHXCIsXCJzdXBoc29sXCI6XCLin4lcIixcInN1cGhzdWJcIjpcIuKrl1wiLFwic3VwbGFyclwiOlwi4qW7XCIsXCJzdXBtdWx0XCI6XCLiq4JcIixcInN1cG5FXCI6XCLiq4xcIixcInN1cG5lXCI6XCLiiotcIixcInN1cHBsdXNcIjpcIuKrgFwiLFwic3Vwc2V0XCI6XCLiioNcIixcIlN1cHNldFwiOlwi4ouRXCIsXCJzdXBzZXRlcVwiOlwi4oqHXCIsXCJzdXBzZXRlcXFcIjpcIuKrhlwiLFwic3Vwc2V0bmVxXCI6XCLiiotcIixcInN1cHNldG5lcXFcIjpcIuKrjFwiLFwic3Vwc2ltXCI6XCLiq4hcIixcInN1cHN1YlwiOlwi4quUXCIsXCJzdXBzdXBcIjpcIuKrllwiLFwic3dhcmhrXCI6XCLipKZcIixcInN3YXJyXCI6XCLihplcIixcInN3QXJyXCI6XCLih5lcIixcInN3YXJyb3dcIjpcIuKGmVwiLFwic3dud2FyXCI6XCLipKpcIixcInN6bGlnXCI6XCLDn1wiLFwiVGFiXCI6XCJcXHRcIixcInRhcmdldFwiOlwi4oyWXCIsXCJUYXVcIjpcIs6kXCIsXCJ0YXVcIjpcIs+EXCIsXCJ0YnJrXCI6XCLijrRcIixcIlRjYXJvblwiOlwixaRcIixcInRjYXJvblwiOlwixaVcIixcIlRjZWRpbFwiOlwixaJcIixcInRjZWRpbFwiOlwixaNcIixcIlRjeVwiOlwi0KJcIixcInRjeVwiOlwi0YJcIixcInRkb3RcIjpcIuKDm1wiLFwidGVscmVjXCI6XCLijJVcIixcIlRmclwiOlwi8J2Ul1wiLFwidGZyXCI6XCLwnZSxXCIsXCJ0aGVyZTRcIjpcIuKItFwiLFwidGhlcmVmb3JlXCI6XCLiiLRcIixcIlRoZXJlZm9yZVwiOlwi4oi0XCIsXCJUaGV0YVwiOlwizphcIixcInRoZXRhXCI6XCLOuFwiLFwidGhldGFzeW1cIjpcIs+RXCIsXCJ0aGV0YXZcIjpcIs+RXCIsXCJ0aGlja2FwcHJveFwiOlwi4omIXCIsXCJ0aGlja3NpbVwiOlwi4oi8XCIsXCJUaGlja1NwYWNlXCI6XCLigZ/igIpcIixcIlRoaW5TcGFjZVwiOlwi4oCJXCIsXCJ0aGluc3BcIjpcIuKAiVwiLFwidGhrYXBcIjpcIuKJiFwiLFwidGhrc2ltXCI6XCLiiLxcIixcIlRIT1JOXCI6XCLDnlwiLFwidGhvcm5cIjpcIsO+XCIsXCJ0aWxkZVwiOlwiy5xcIixcIlRpbGRlXCI6XCLiiLxcIixcIlRpbGRlRXF1YWxcIjpcIuKJg1wiLFwiVGlsZGVGdWxsRXF1YWxcIjpcIuKJhVwiLFwiVGlsZGVUaWxkZVwiOlwi4omIXCIsXCJ0aW1lc2JhclwiOlwi4qixXCIsXCJ0aW1lc2JcIjpcIuKKoFwiLFwidGltZXNcIjpcIsOXXCIsXCJ0aW1lc2RcIjpcIuKosFwiLFwidGludFwiOlwi4oitXCIsXCJ0b2VhXCI6XCLipKhcIixcInRvcGJvdFwiOlwi4oy2XCIsXCJ0b3BjaXJcIjpcIuKrsVwiLFwidG9wXCI6XCLiiqRcIixcIlRvcGZcIjpcIvCdlYtcIixcInRvcGZcIjpcIvCdlaVcIixcInRvcGZvcmtcIjpcIuKrmlwiLFwidG9zYVwiOlwi4qSpXCIsXCJ0cHJpbWVcIjpcIuKAtFwiLFwidHJhZGVcIjpcIuKEolwiLFwiVFJBREVcIjpcIuKEolwiLFwidHJpYW5nbGVcIjpcIuKWtVwiLFwidHJpYW5nbGVkb3duXCI6XCLilr9cIixcInRyaWFuZ2xlbGVmdFwiOlwi4peDXCIsXCJ0cmlhbmdsZWxlZnRlcVwiOlwi4oq0XCIsXCJ0cmlhbmdsZXFcIjpcIuKJnFwiLFwidHJpYW5nbGVyaWdodFwiOlwi4pa5XCIsXCJ0cmlhbmdsZXJpZ2h0ZXFcIjpcIuKKtVwiLFwidHJpZG90XCI6XCLil6xcIixcInRyaWVcIjpcIuKJnFwiLFwidHJpbWludXNcIjpcIuKoulwiLFwiVHJpcGxlRG90XCI6XCLig5tcIixcInRyaXBsdXNcIjpcIuKouVwiLFwidHJpc2JcIjpcIuKnjVwiLFwidHJpdGltZVwiOlwi4qi7XCIsXCJ0cnBleml1bVwiOlwi4o+iXCIsXCJUc2NyXCI6XCLwnZKvXCIsXCJ0c2NyXCI6XCLwnZOJXCIsXCJUU2N5XCI6XCLQplwiLFwidHNjeVwiOlwi0YZcIixcIlRTSGN5XCI6XCLQi1wiLFwidHNoY3lcIjpcItGbXCIsXCJUc3Ryb2tcIjpcIsWmXCIsXCJ0c3Ryb2tcIjpcIsWnXCIsXCJ0d2l4dFwiOlwi4omsXCIsXCJ0d29oZWFkbGVmdGFycm93XCI6XCLihp5cIixcInR3b2hlYWRyaWdodGFycm93XCI6XCLihqBcIixcIlVhY3V0ZVwiOlwiw5pcIixcInVhY3V0ZVwiOlwiw7pcIixcInVhcnJcIjpcIuKGkVwiLFwiVWFyclwiOlwi4oafXCIsXCJ1QXJyXCI6XCLih5FcIixcIlVhcnJvY2lyXCI6XCLipYlcIixcIlVicmN5XCI6XCLQjlwiLFwidWJyY3lcIjpcItGeXCIsXCJVYnJldmVcIjpcIsWsXCIsXCJ1YnJldmVcIjpcIsWtXCIsXCJVY2lyY1wiOlwiw5tcIixcInVjaXJjXCI6XCLDu1wiLFwiVWN5XCI6XCLQo1wiLFwidWN5XCI6XCLRg1wiLFwidWRhcnJcIjpcIuKHhVwiLFwiVWRibGFjXCI6XCLFsFwiLFwidWRibGFjXCI6XCLFsVwiLFwidWRoYXJcIjpcIuKlrlwiLFwidWZpc2h0XCI6XCLipb5cIixcIlVmclwiOlwi8J2UmFwiLFwidWZyXCI6XCLwnZSyXCIsXCJVZ3JhdmVcIjpcIsOZXCIsXCJ1Z3JhdmVcIjpcIsO5XCIsXCJ1SGFyXCI6XCLipaNcIixcInVoYXJsXCI6XCLihr9cIixcInVoYXJyXCI6XCLihr5cIixcInVoYmxrXCI6XCLiloBcIixcInVsY29yblwiOlwi4oycXCIsXCJ1bGNvcm5lclwiOlwi4oycXCIsXCJ1bGNyb3BcIjpcIuKMj1wiLFwidWx0cmlcIjpcIuKXuFwiLFwiVW1hY3JcIjpcIsWqXCIsXCJ1bWFjclwiOlwixatcIixcInVtbFwiOlwiwqhcIixcIlVuZGVyQmFyXCI6XCJfXCIsXCJVbmRlckJyYWNlXCI6XCLij59cIixcIlVuZGVyQnJhY2tldFwiOlwi4o61XCIsXCJVbmRlclBhcmVudGhlc2lzXCI6XCLij51cIixcIlVuaW9uXCI6XCLii4NcIixcIlVuaW9uUGx1c1wiOlwi4oqOXCIsXCJVb2dvblwiOlwixbJcIixcInVvZ29uXCI6XCLFs1wiLFwiVW9wZlwiOlwi8J2VjFwiLFwidW9wZlwiOlwi8J2VplwiLFwiVXBBcnJvd0JhclwiOlwi4qSSXCIsXCJ1cGFycm93XCI6XCLihpFcIixcIlVwQXJyb3dcIjpcIuKGkVwiLFwiVXBhcnJvd1wiOlwi4oeRXCIsXCJVcEFycm93RG93bkFycm93XCI6XCLih4VcIixcInVwZG93bmFycm93XCI6XCLihpVcIixcIlVwRG93bkFycm93XCI6XCLihpVcIixcIlVwZG93bmFycm93XCI6XCLih5VcIixcIlVwRXF1aWxpYnJpdW1cIjpcIuKlrlwiLFwidXBoYXJwb29ubGVmdFwiOlwi4oa/XCIsXCJ1cGhhcnBvb25yaWdodFwiOlwi4oa+XCIsXCJ1cGx1c1wiOlwi4oqOXCIsXCJVcHBlckxlZnRBcnJvd1wiOlwi4oaWXCIsXCJVcHBlclJpZ2h0QXJyb3dcIjpcIuKGl1wiLFwidXBzaVwiOlwiz4VcIixcIlVwc2lcIjpcIs+SXCIsXCJ1cHNpaFwiOlwiz5JcIixcIlVwc2lsb25cIjpcIs6lXCIsXCJ1cHNpbG9uXCI6XCLPhVwiLFwiVXBUZWVBcnJvd1wiOlwi4oalXCIsXCJVcFRlZVwiOlwi4oqlXCIsXCJ1cHVwYXJyb3dzXCI6XCLih4hcIixcInVyY29yblwiOlwi4oydXCIsXCJ1cmNvcm5lclwiOlwi4oydXCIsXCJ1cmNyb3BcIjpcIuKMjlwiLFwiVXJpbmdcIjpcIsWuXCIsXCJ1cmluZ1wiOlwixa9cIixcInVydHJpXCI6XCLil7lcIixcIlVzY3JcIjpcIvCdkrBcIixcInVzY3JcIjpcIvCdk4pcIixcInV0ZG90XCI6XCLii7BcIixcIlV0aWxkZVwiOlwixahcIixcInV0aWxkZVwiOlwixalcIixcInV0cmlcIjpcIuKWtVwiLFwidXRyaWZcIjpcIuKWtFwiLFwidXVhcnJcIjpcIuKHiFwiLFwiVXVtbFwiOlwiw5xcIixcInV1bWxcIjpcIsO8XCIsXCJ1d2FuZ2xlXCI6XCLipqdcIixcInZhbmdydFwiOlwi4qacXCIsXCJ2YXJlcHNpbG9uXCI6XCLPtVwiLFwidmFya2FwcGFcIjpcIs+wXCIsXCJ2YXJub3RoaW5nXCI6XCLiiIVcIixcInZhcnBoaVwiOlwiz5VcIixcInZhcnBpXCI6XCLPllwiLFwidmFycHJvcHRvXCI6XCLiiJ1cIixcInZhcnJcIjpcIuKGlVwiLFwidkFyclwiOlwi4oeVXCIsXCJ2YXJyaG9cIjpcIs+xXCIsXCJ2YXJzaWdtYVwiOlwiz4JcIixcInZhcnN1YnNldG5lcVwiOlwi4oqK77iAXCIsXCJ2YXJzdWJzZXRuZXFxXCI6XCLiq4vvuIBcIixcInZhcnN1cHNldG5lcVwiOlwi4oqL77iAXCIsXCJ2YXJzdXBzZXRuZXFxXCI6XCLiq4zvuIBcIixcInZhcnRoZXRhXCI6XCLPkVwiLFwidmFydHJpYW5nbGVsZWZ0XCI6XCLiirJcIixcInZhcnRyaWFuZ2xlcmlnaHRcIjpcIuKKs1wiLFwidkJhclwiOlwi4quoXCIsXCJWYmFyXCI6XCLiq6tcIixcInZCYXJ2XCI6XCLiq6lcIixcIlZjeVwiOlwi0JJcIixcInZjeVwiOlwi0LJcIixcInZkYXNoXCI6XCLiiqJcIixcInZEYXNoXCI6XCLiiqhcIixcIlZkYXNoXCI6XCLiiqlcIixcIlZEYXNoXCI6XCLiiqtcIixcIlZkYXNobFwiOlwi4qumXCIsXCJ2ZWViYXJcIjpcIuKKu1wiLFwidmVlXCI6XCLiiKhcIixcIlZlZVwiOlwi4ouBXCIsXCJ2ZWVlcVwiOlwi4omaXCIsXCJ2ZWxsaXBcIjpcIuKLrlwiLFwidmVyYmFyXCI6XCJ8XCIsXCJWZXJiYXJcIjpcIuKAllwiLFwidmVydFwiOlwifFwiLFwiVmVydFwiOlwi4oCWXCIsXCJWZXJ0aWNhbEJhclwiOlwi4oijXCIsXCJWZXJ0aWNhbExpbmVcIjpcInxcIixcIlZlcnRpY2FsU2VwYXJhdG9yXCI6XCLinZhcIixcIlZlcnRpY2FsVGlsZGVcIjpcIuKJgFwiLFwiVmVyeVRoaW5TcGFjZVwiOlwi4oCKXCIsXCJWZnJcIjpcIvCdlJlcIixcInZmclwiOlwi8J2Us1wiLFwidmx0cmlcIjpcIuKKslwiLFwidm5zdWJcIjpcIuKKguKDklwiLFwidm5zdXBcIjpcIuKKg+KDklwiLFwiVm9wZlwiOlwi8J2VjVwiLFwidm9wZlwiOlwi8J2Vp1wiLFwidnByb3BcIjpcIuKInVwiLFwidnJ0cmlcIjpcIuKKs1wiLFwiVnNjclwiOlwi8J2SsVwiLFwidnNjclwiOlwi8J2Ti1wiLFwidnN1Ym5FXCI6XCLiq4vvuIBcIixcInZzdWJuZVwiOlwi4oqK77iAXCIsXCJ2c3VwbkVcIjpcIuKrjO+4gFwiLFwidnN1cG5lXCI6XCLiiovvuIBcIixcIlZ2ZGFzaFwiOlwi4oqqXCIsXCJ2emlnemFnXCI6XCLipppcIixcIldjaXJjXCI6XCLFtFwiLFwid2NpcmNcIjpcIsW1XCIsXCJ3ZWRiYXJcIjpcIuKpn1wiLFwid2VkZ2VcIjpcIuKIp1wiLFwiV2VkZ2VcIjpcIuKLgFwiLFwid2VkZ2VxXCI6XCLiiZlcIixcIndlaWVycFwiOlwi4oSYXCIsXCJXZnJcIjpcIvCdlJpcIixcIndmclwiOlwi8J2UtFwiLFwiV29wZlwiOlwi8J2VjlwiLFwid29wZlwiOlwi8J2VqFwiLFwid3BcIjpcIuKEmFwiLFwid3JcIjpcIuKJgFwiLFwid3JlYXRoXCI6XCLiiYBcIixcIldzY3JcIjpcIvCdkrJcIixcIndzY3JcIjpcIvCdk4xcIixcInhjYXBcIjpcIuKLglwiLFwieGNpcmNcIjpcIuKXr1wiLFwieGN1cFwiOlwi4ouDXCIsXCJ4ZHRyaVwiOlwi4pa9XCIsXCJYZnJcIjpcIvCdlJtcIixcInhmclwiOlwi8J2UtVwiLFwieGhhcnJcIjpcIuKft1wiLFwieGhBcnJcIjpcIuKfulwiLFwiWGlcIjpcIs6eXCIsXCJ4aVwiOlwizr5cIixcInhsYXJyXCI6XCLin7VcIixcInhsQXJyXCI6XCLin7hcIixcInhtYXBcIjpcIuKfvFwiLFwieG5pc1wiOlwi4ou7XCIsXCJ4b2RvdFwiOlwi4qiAXCIsXCJYb3BmXCI6XCLwnZWPXCIsXCJ4b3BmXCI6XCLwnZWpXCIsXCJ4b3BsdXNcIjpcIuKogVwiLFwieG90aW1lXCI6XCLiqIJcIixcInhyYXJyXCI6XCLin7ZcIixcInhyQXJyXCI6XCLin7lcIixcIlhzY3JcIjpcIvCdkrNcIixcInhzY3JcIjpcIvCdk41cIixcInhzcWN1cFwiOlwi4qiGXCIsXCJ4dXBsdXNcIjpcIuKohFwiLFwieHV0cmlcIjpcIuKWs1wiLFwieHZlZVwiOlwi4ouBXCIsXCJ4d2VkZ2VcIjpcIuKLgFwiLFwiWWFjdXRlXCI6XCLDnVwiLFwieWFjdXRlXCI6XCLDvVwiLFwiWUFjeVwiOlwi0K9cIixcInlhY3lcIjpcItGPXCIsXCJZY2lyY1wiOlwixbZcIixcInljaXJjXCI6XCLFt1wiLFwiWWN5XCI6XCLQq1wiLFwieWN5XCI6XCLRi1wiLFwieWVuXCI6XCLCpVwiLFwiWWZyXCI6XCLwnZScXCIsXCJ5ZnJcIjpcIvCdlLZcIixcIllJY3lcIjpcItCHXCIsXCJ5aWN5XCI6XCLRl1wiLFwiWW9wZlwiOlwi8J2VkFwiLFwieW9wZlwiOlwi8J2VqlwiLFwiWXNjclwiOlwi8J2StFwiLFwieXNjclwiOlwi8J2TjlwiLFwiWVVjeVwiOlwi0K5cIixcInl1Y3lcIjpcItGOXCIsXCJ5dW1sXCI6XCLDv1wiLFwiWXVtbFwiOlwixbhcIixcIlphY3V0ZVwiOlwixblcIixcInphY3V0ZVwiOlwixbpcIixcIlpjYXJvblwiOlwixb1cIixcInpjYXJvblwiOlwixb5cIixcIlpjeVwiOlwi0JdcIixcInpjeVwiOlwi0LdcIixcIlpkb3RcIjpcIsW7XCIsXCJ6ZG90XCI6XCLFvFwiLFwiemVldHJmXCI6XCLihKhcIixcIlplcm9XaWR0aFNwYWNlXCI6XCLigItcIixcIlpldGFcIjpcIs6WXCIsXCJ6ZXRhXCI6XCLOtlwiLFwiemZyXCI6XCLwnZS3XCIsXCJaZnJcIjpcIuKEqFwiLFwiWkhjeVwiOlwi0JZcIixcInpoY3lcIjpcItC2XCIsXCJ6aWdyYXJyXCI6XCLih51cIixcInpvcGZcIjpcIvCdlatcIixcIlpvcGZcIjpcIuKEpFwiLFwiWnNjclwiOlwi8J2StVwiLFwienNjclwiOlwi8J2Tj1wiLFwiendqXCI6XCLigI1cIixcInp3bmpcIjpcIuKAjFwifVxuXG4vKioqLyB9KSxcbi8qIDE1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0ge1widW5pdmVyc2FsXCI6NTAsXCJ0YWdcIjozMCxcImF0dHJpYnV0ZVwiOjEsXCJwc2V1ZG9cIjowLFwiZGVzY2VuZGFudFwiOi0xLFwiY2hpbGRcIjotMSxcInBhcmVudFwiOi0xLFwic2libGluZ1wiOi0xLFwiYWRqYWNlbnRcIjotMX1cblxuLyoqKi8gfSksXG4vKiAxNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8vIEluc3BpcmVkIGJ5IEdvb2dsZSBDbG9zdXJlOlxuLy8gaHR0cDovL2Nsb3N1cmUtbGlicmFyeS5nb29nbGVjb2RlLmNvbS9zdm4vZG9jcy9cbi8vIGNsb3N1cmVfZ29vZ19hcnJheV9hcnJheS5qcy5odG1sI2dvb2cuYXJyYXkuY2xlYXJcblxuXG5cbnZhciB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuXHR2YWx1ZSh0aGlzKS5sZW5ndGggPSAwO1xuXHRyZXR1cm4gdGhpcztcbn07XG5cblxuLyoqKi8gfSksXG4vKiAxNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHktZnVuY3Rpb25cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge307XG5cblxuLyoqKi8gfSksXG4vKiAxOCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgdG9JbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MSlcblxuICAsIG1heCA9IE1hdGgubWF4O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuIHJldHVybiBtYXgoMCwgdG9JbnRlZ2VyKHZhbHVlKSk7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogMTkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGNyZWF0ZSA9IE9iamVjdC5jcmVhdGUsIGdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mLCBwbGFpbk9iamVjdCA9IHt9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgvKiBDdXN0b21DcmVhdGUqLykge1xuXHR2YXIgc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YsIGN1c3RvbUNyZWF0ZSA9IGFyZ3VtZW50c1swXSB8fCBjcmVhdGU7XG5cdGlmICh0eXBlb2Ygc2V0UHJvdG90eXBlT2YgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gZ2V0UHJvdG90eXBlT2Yoc2V0UHJvdG90eXBlT2YoY3VzdG9tQ3JlYXRlKG51bGwpLCBwbGFpbk9iamVjdCkpID09PSBwbGFpbk9iamVjdDtcbn07XG5cblxuLyoqKi8gfSksXG4vKiAyMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGVzbGludCBuby1wcm90bzogXCJvZmZcIiAqL1xuXG4vLyBCaWcgdGhhbmtzIHRvIEBXZWJSZWZsZWN0aW9uIGZvciBzb3J0aW5nIHRoaXMgb3V0XG4vLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9XZWJSZWZsZWN0aW9uLzU1OTM1NTRcblxuXG5cbnZhciBpc09iamVjdCAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1KVxuICAsIHZhbHVlICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMClcbiAgLCBvYmpJc1Byb3RvdHlwZU9mID0gT2JqZWN0LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mXG4gICwgZGVmaW5lUHJvcGVydHkgID0gT2JqZWN0LmRlZmluZVByb3BlcnR5XG4gICwgbnVsbERlc2MgICAgICAgID0ge1xuXHRjb25maWd1cmFibGU6IHRydWUsXG5cdGVudW1lcmFibGU6IGZhbHNlLFxuXHR3cml0YWJsZTogdHJ1ZSxcblx0dmFsdWU6IHVuZGVmaW5lZFxufVxuICAsIHZhbGlkYXRlO1xuXG52YWxpZGF0ZSA9IGZ1bmN0aW9uIChvYmosIHByb3RvdHlwZSkge1xuXHR2YWx1ZShvYmopO1xuXHRpZiAocHJvdG90eXBlID09PSBudWxsIHx8IGlzT2JqZWN0KHByb3RvdHlwZSkpIHJldHVybiBvYmo7XG5cdHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcm90b3R5cGUgbXVzdCBiZSBudWxsIG9yIGFuIG9iamVjdFwiKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uIChzdGF0dXMpIHtcblx0dmFyIGZuLCBzZXQ7XG5cdGlmICghc3RhdHVzKSByZXR1cm4gbnVsbDtcblx0aWYgKHN0YXR1cy5sZXZlbCA9PT0gMikge1xuXHRcdGlmIChzdGF0dXMuc2V0KSB7XG5cdFx0XHRzZXQgPSBzdGF0dXMuc2V0O1xuXHRcdFx0Zm4gPSBmdW5jdGlvbiAob2JqLCBwcm90b3R5cGUpIHtcblx0XHRcdFx0c2V0LmNhbGwodmFsaWRhdGUob2JqLCBwcm90b3R5cGUpLCBwcm90b3R5cGUpO1xuXHRcdFx0XHRyZXR1cm4gb2JqO1xuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm4gPSBmdW5jdGlvbiAob2JqLCBwcm90b3R5cGUpIHtcblx0XHRcdFx0dmFsaWRhdGUob2JqLCBwcm90b3R5cGUpLl9fcHJvdG9fXyA9IHByb3RvdHlwZTtcblx0XHRcdFx0cmV0dXJuIG9iajtcblx0XHRcdH07XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGZuID0gZnVuY3Rpb24gc2VsZihvYmosIHByb3RvdHlwZSkge1xuXHRcdFx0dmFyIGlzTnVsbEJhc2U7XG5cdFx0XHR2YWxpZGF0ZShvYmosIHByb3RvdHlwZSk7XG5cdFx0XHRpc051bGxCYXNlID0gb2JqSXNQcm90b3R5cGVPZi5jYWxsKHNlbGYubnVsbFBvbHlmaWxsLCBvYmopO1xuXHRcdFx0aWYgKGlzTnVsbEJhc2UpIGRlbGV0ZSBzZWxmLm51bGxQb2x5ZmlsbC5fX3Byb3RvX187XG5cdFx0XHRpZiAocHJvdG90eXBlID09PSBudWxsKSBwcm90b3R5cGUgPSBzZWxmLm51bGxQb2x5ZmlsbDtcblx0XHRcdG9iai5fX3Byb3RvX18gPSBwcm90b3R5cGU7XG5cdFx0XHRpZiAoaXNOdWxsQmFzZSkgZGVmaW5lUHJvcGVydHkoc2VsZi5udWxsUG9seWZpbGwsIFwiX19wcm90b19fXCIsIG51bGxEZXNjKTtcblx0XHRcdHJldHVybiBvYmo7XG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCBcImxldmVsXCIsIHtcblx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuXHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdHdyaXRhYmxlOiBmYWxzZSxcblx0XHR2YWx1ZTogc3RhdHVzLmxldmVsXG5cdH0pO1xufShcblx0KGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgdG1wT2JqMSA9IE9iamVjdC5jcmVhdGUobnVsbClcblx0XHQgICwgdG1wT2JqMiA9IHt9XG5cdFx0ICAsIHNldFxuXHRcdCAgLCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCBcIl9fcHJvdG9fX1wiKTtcblxuXHRcdGlmIChkZXNjKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRzZXQgPSBkZXNjLnNldDsgLy8gT3BlcmEgY3Jhc2hlcyBhdCB0aGlzIHBvaW50XG5cdFx0XHRcdHNldC5jYWxsKHRtcE9iajEsIHRtcE9iajIpO1xuXHRcdFx0fSBjYXRjaCAoaWdub3JlKSB7fVxuXHRcdFx0aWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZih0bXBPYmoxKSA9PT0gdG1wT2JqMikgcmV0dXJuIHsgc2V0OiBzZXQsIGxldmVsOiAyIH07XG5cdFx0fVxuXG5cdFx0dG1wT2JqMS5fX3Byb3RvX18gPSB0bXBPYmoyO1xuXHRcdGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YodG1wT2JqMSkgPT09IHRtcE9iajIpIHJldHVybiB7IGxldmVsOiAyIH07XG5cblx0XHR0bXBPYmoxID0ge307XG5cdFx0dG1wT2JqMS5fX3Byb3RvX18gPSB0bXBPYmoyO1xuXHRcdGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YodG1wT2JqMSkgPT09IHRtcE9iajIpIHJldHVybiB7IGxldmVsOiAxIH07XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0pKClcbikpO1xuXG5fX3dlYnBhY2tfcmVxdWlyZV9fKDU2KTtcblxuXG4vKioqLyB9KSxcbi8qIDIxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBpc1ZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblxudmFyIGZvckVhY2ggPSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCwgY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcblxudmFyIHByb2Nlc3MgPSBmdW5jdGlvbiAoc3JjLCBvYmopIHtcblx0dmFyIGtleTtcblx0Zm9yIChrZXkgaW4gc3JjKSBvYmpba2V5XSA9IHNyY1trZXldO1xufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcHRzMSAvKiwg4oCmb3B0aW9ucyovKSB7XG5cdHZhciByZXN1bHQgPSBjcmVhdGUobnVsbCk7XG5cdGZvckVhY2guY2FsbChhcmd1bWVudHMsIGZ1bmN0aW9uIChvcHRpb25zKSB7XG5cdFx0aWYgKCFpc1ZhbHVlKG9wdGlvbnMpKSByZXR1cm47XG5cdFx0cHJvY2VzcyhPYmplY3Qob3B0aW9ucyksIHJlc3VsdCk7XG5cdH0pO1xuXHRyZXR1cm4gcmVzdWx0O1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDIyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBpc0l0ZXJhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdGlmICghaXNJdGVyYWJsZSh2YWx1ZSkpIHRocm93IG5ldyBUeXBlRXJyb3IodmFsdWUgKyBcIiBpcyBub3QgaXRlcmFibGVcIik7XG5cdHJldHVybiB2YWx1ZTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiAyMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgZmFsc2VGdW5jID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KS5mYWxzZUZ1bmM7XG5cbi8vaHR0cHM6Ly9naXRodWIuY29tL3NsZXZpdGhhbi9YUmVnRXhwL2Jsb2IvbWFzdGVyL3NyYy94cmVnZXhwLmpzI0w0NjlcbnZhciByZUNoYXJzID0gL1stW1xcXXt9KCkqKz8uLFxcXFxeJHwjXFxzXS9nO1xuXG5mdW5jdGlvbiBmYWN0b3J5KGFkYXB0ZXIpe1xuXHQvKlxuXHRcdGF0dHJpYnV0ZSBzZWxlY3RvcnNcblx0Ki9cblx0dmFyIGF0dHJpYnV0ZVJ1bGVzID0ge1xuXHRcdF9fcHJvdG9fXzogbnVsbCxcblx0XHRlcXVhbHM6IGZ1bmN0aW9uKG5leHQsIGRhdGEpe1xuXHRcdFx0dmFyIG5hbWUgID0gZGF0YS5uYW1lLFxuXHRcdFx0XHR2YWx1ZSA9IGRhdGEudmFsdWU7XG5cblx0XHRcdGlmKGRhdGEuaWdub3JlQ2FzZSl7XG5cdFx0XHRcdHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcblxuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gZXF1YWxzSUMoZWxlbSl7XG5cdFx0XHRcdFx0dmFyIGF0dHIgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIG5hbWUpO1xuXHRcdFx0XHRcdHJldHVybiBhdHRyICE9IG51bGwgJiYgYXR0ci50b0xvd2VyQ2FzZSgpID09PSB2YWx1ZSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gZXF1YWxzKGVsZW0pe1xuXHRcdFx0XHRyZXR1cm4gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBuYW1lKSA9PT0gdmFsdWUgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRoeXBoZW46IGZ1bmN0aW9uKG5leHQsIGRhdGEpe1xuXHRcdFx0dmFyIG5hbWUgID0gZGF0YS5uYW1lLFxuXHRcdFx0XHR2YWx1ZSA9IGRhdGEudmFsdWUsXG5cdFx0XHRcdGxlbiA9IHZhbHVlLmxlbmd0aDtcblxuXHRcdFx0aWYoZGF0YS5pZ25vcmVDYXNlKXtcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiBoeXBoZW5JQyhlbGVtKXtcblx0XHRcdFx0XHR2YXIgYXR0ciA9IGFkYXB0ZXIuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbSwgbmFtZSk7XG5cdFx0XHRcdFx0cmV0dXJuIGF0dHIgIT0gbnVsbCAmJlxuXHRcdFx0XHRcdFx0XHQoYXR0ci5sZW5ndGggPT09IGxlbiB8fCBhdHRyLmNoYXJBdChsZW4pID09PSBcIi1cIikgJiZcblx0XHRcdFx0XHRcdFx0YXR0ci5zdWJzdHIoMCwgbGVuKS50b0xvd2VyQ2FzZSgpID09PSB2YWx1ZSAmJlxuXHRcdFx0XHRcdFx0XHRuZXh0KGVsZW0pO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gaHlwaGVuKGVsZW0pe1xuXHRcdFx0XHR2YXIgYXR0ciA9IGFkYXB0ZXIuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbSwgbmFtZSk7XG5cdFx0XHRcdHJldHVybiBhdHRyICE9IG51bGwgJiZcblx0XHRcdFx0XHRcdGF0dHIuc3Vic3RyKDAsIGxlbikgPT09IHZhbHVlICYmXG5cdFx0XHRcdFx0XHQoYXR0ci5sZW5ndGggPT09IGxlbiB8fCBhdHRyLmNoYXJBdChsZW4pID09PSBcIi1cIikgJiZcblx0XHRcdFx0XHRcdG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0ZWxlbWVudDogZnVuY3Rpb24obmV4dCwgZGF0YSl7XG5cdFx0XHR2YXIgbmFtZSA9IGRhdGEubmFtZSxcblx0XHRcdFx0dmFsdWUgPSBkYXRhLnZhbHVlO1xuXG5cdFx0XHRpZigvXFxzLy50ZXN0KHZhbHVlKSl7XG5cdFx0XHRcdHJldHVybiBmYWxzZUZ1bmM7XG5cdFx0XHR9XG5cblx0XHRcdHZhbHVlID0gdmFsdWUucmVwbGFjZShyZUNoYXJzLCBcIlxcXFwkJlwiKTtcblxuXHRcdFx0dmFyIHBhdHRlcm4gPSBcIig/Ol58XFxcXHMpXCIgKyB2YWx1ZSArIFwiKD86JHxcXFxccylcIixcblx0XHRcdFx0ZmxhZ3MgPSBkYXRhLmlnbm9yZUNhc2UgPyBcImlcIiA6IFwiXCIsXG5cdFx0XHRcdHJlZ2V4ID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCBmbGFncyk7XG5cblx0XHRcdHJldHVybiBmdW5jdGlvbiBlbGVtZW50KGVsZW0pe1xuXHRcdFx0XHR2YXIgYXR0ciA9IGFkYXB0ZXIuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbSwgbmFtZSk7XG5cdFx0XHRcdHJldHVybiBhdHRyICE9IG51bGwgJiYgcmVnZXgudGVzdChhdHRyKSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGV4aXN0czogZnVuY3Rpb24obmV4dCwgZGF0YSl7XG5cdFx0XHR2YXIgbmFtZSA9IGRhdGEubmFtZTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiBleGlzdHMoZWxlbSl7XG5cdFx0XHRcdHJldHVybiBhZGFwdGVyLmhhc0F0dHJpYihlbGVtLCBuYW1lKSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdHN0YXJ0OiBmdW5jdGlvbihuZXh0LCBkYXRhKXtcblx0XHRcdHZhciBuYW1lICA9IGRhdGEubmFtZSxcblx0XHRcdFx0dmFsdWUgPSBkYXRhLnZhbHVlLFxuXHRcdFx0XHRsZW4gPSB2YWx1ZS5sZW5ndGg7XG5cblx0XHRcdGlmKGxlbiA9PT0gMCl7XG5cdFx0XHRcdHJldHVybiBmYWxzZUZ1bmM7XG5cdFx0XHR9XG5cblx0XHRcdGlmKGRhdGEuaWdub3JlQ2FzZSl7XG5cdFx0XHRcdHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcblxuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gc3RhcnRJQyhlbGVtKXtcblx0XHRcdFx0XHR2YXIgYXR0ciA9IGFkYXB0ZXIuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbSwgbmFtZSk7XG5cdFx0XHRcdFx0cmV0dXJuIGF0dHIgIT0gbnVsbCAmJiBhdHRyLnN1YnN0cigwLCBsZW4pLnRvTG93ZXJDYXNlKCkgPT09IHZhbHVlICYmIG5leHQoZWxlbSk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmdW5jdGlvbiBzdGFydChlbGVtKXtcblx0XHRcdFx0dmFyIGF0dHIgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIG5hbWUpO1xuXHRcdFx0XHRyZXR1cm4gYXR0ciAhPSBudWxsICYmIGF0dHIuc3Vic3RyKDAsIGxlbikgPT09IHZhbHVlICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0ZW5kOiBmdW5jdGlvbihuZXh0LCBkYXRhKXtcblx0XHRcdHZhciBuYW1lICA9IGRhdGEubmFtZSxcblx0XHRcdFx0dmFsdWUgPSBkYXRhLnZhbHVlLFxuXHRcdFx0XHRsZW4gICA9IC12YWx1ZS5sZW5ndGg7XG5cblx0XHRcdGlmKGxlbiA9PT0gMCl7XG5cdFx0XHRcdHJldHVybiBmYWxzZUZ1bmM7XG5cdFx0XHR9XG5cblx0XHRcdGlmKGRhdGEuaWdub3JlQ2FzZSl7XG5cdFx0XHRcdHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcblxuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gZW5kSUMoZWxlbSl7XG5cdFx0XHRcdFx0dmFyIGF0dHIgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIG5hbWUpO1xuXHRcdFx0XHRcdHJldHVybiBhdHRyICE9IG51bGwgJiYgYXR0ci5zdWJzdHIobGVuKS50b0xvd2VyQ2FzZSgpID09PSB2YWx1ZSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gZW5kKGVsZW0pe1xuXHRcdFx0XHR2YXIgYXR0ciA9IGFkYXB0ZXIuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbSwgbmFtZSk7XG5cdFx0XHRcdHJldHVybiBhdHRyICE9IG51bGwgJiYgYXR0ci5zdWJzdHIobGVuKSA9PT0gdmFsdWUgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRhbnk6IGZ1bmN0aW9uKG5leHQsIGRhdGEpe1xuXHRcdFx0dmFyIG5hbWUgID0gZGF0YS5uYW1lLFxuXHRcdFx0XHR2YWx1ZSA9IGRhdGEudmFsdWU7XG5cblx0XHRcdGlmKHZhbHVlID09PSBcIlwiKXtcblx0XHRcdFx0cmV0dXJuIGZhbHNlRnVuYztcblx0XHRcdH1cblxuXHRcdFx0aWYoZGF0YS5pZ25vcmVDYXNlKXtcblx0XHRcdFx0dmFyIHJlZ2V4ID0gbmV3IFJlZ0V4cCh2YWx1ZS5yZXBsYWNlKHJlQ2hhcnMsIFwiXFxcXCQmXCIpLCBcImlcIik7XG5cblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGFueUlDKGVsZW0pe1xuXHRcdFx0XHRcdHZhciBhdHRyID0gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBuYW1lKTtcblx0XHRcdFx0XHRyZXR1cm4gYXR0ciAhPSBudWxsICYmIHJlZ2V4LnRlc3QoYXR0cikgJiYgbmV4dChlbGVtKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGFueShlbGVtKXtcblx0XHRcdFx0dmFyIGF0dHIgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIG5hbWUpO1xuXHRcdFx0XHRyZXR1cm4gYXR0ciAhPSBudWxsICYmIGF0dHIuaW5kZXhPZih2YWx1ZSkgPj0gMCAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdG5vdDogZnVuY3Rpb24obmV4dCwgZGF0YSl7XG5cdFx0XHR2YXIgbmFtZSAgPSBkYXRhLm5hbWUsXG5cdFx0XHRcdHZhbHVlID0gZGF0YS52YWx1ZTtcblxuXHRcdFx0aWYodmFsdWUgPT09IFwiXCIpe1xuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gbm90RW1wdHkoZWxlbSl7XG5cdFx0XHRcdFx0cmV0dXJuICEhYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBuYW1lKSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0XHR9O1xuXHRcdFx0fSBlbHNlIGlmKGRhdGEuaWdub3JlQ2FzZSl7XG5cdFx0XHRcdHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcblxuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gbm90SUMoZWxlbSl7XG5cdFx0XHRcdFx0dmFyIGF0dHIgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIG5hbWUpO1xuXHRcdFx0XHRcdHJldHVybiBhdHRyICE9IG51bGwgJiYgYXR0ci50b0xvd2VyQ2FzZSgpICE9PSB2YWx1ZSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gbm90KGVsZW0pe1xuXHRcdFx0XHRyZXR1cm4gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBuYW1lKSAhPT0gdmFsdWUgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fVxuXHR9O1xuXG5cdHJldHVybiB7XG5cdFx0Y29tcGlsZTogZnVuY3Rpb24obmV4dCwgZGF0YSwgb3B0aW9ucyl7XG5cdFx0XHRpZihvcHRpb25zICYmIG9wdGlvbnMuc3RyaWN0ICYmIChcblx0XHRcdFx0ZGF0YS5pZ25vcmVDYXNlIHx8IGRhdGEuYWN0aW9uID09PSBcIm5vdFwiXG5cdFx0XHQpKSB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBhdHRyaWJ1dGUgc2VsZWN0b3JcIik7XG5cdFx0XHRyZXR1cm4gYXR0cmlidXRlUnVsZXNbZGF0YS5hY3Rpb25dKG5leHQsIGRhdGEpO1xuXHRcdH0sXG5cdFx0cnVsZXM6IGF0dHJpYnV0ZVJ1bGVzXG5cdH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmFjdG9yeTtcblxuXG4vKioqLyB9KSxcbi8qIDI0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gQ1NTc2VsZWN0O1xuXG52YXIgRG9tVXRpbHMgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KSxcblx0ZmFsc2VGdW5jICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpLmZhbHNlRnVuYyxcblx0Y29tcGlsZUZhY3RvcnkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQwKSxcblx0ZGVmYXVsdENvbXBpbGUgPSBjb21waWxlRmFjdG9yeShEb21VdGlscyk7XG5cbmZ1bmN0aW9uIGFkYXB0ZXJDb21waWxlKGFkYXB0ZXIpe1xuXHRyZXR1cm4gYWRhcHRlciA9PT0gRG9tVXRpbHMgPyBkZWZhdWx0Q29tcGlsZSA6IGNvbXBpbGVGYWN0b3J5KGFkYXB0ZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRTZWxlY3RvckZ1bmMoc2VhcmNoRnVuYyl7XG5cdHJldHVybiBmdW5jdGlvbiBzZWxlY3QocXVlcnksIGVsZW1zLCBvcHRpb25zKXtcblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuXHRcdG9wdGlvbnMuYWRhcHRlciA9IG9wdGlvbnMuYWRhcHRlciB8fCBEb21VdGlscztcblx0XHR2YXIgY29tcGlsZSA9IGFkYXB0ZXJDb21waWxlKG9wdGlvbnMuYWRhcHRlcik7XG5cblx0XHRpZih0eXBlb2YgcXVlcnkgIT09IFwiZnVuY3Rpb25cIikgcXVlcnkgPSBjb21waWxlLmNvbXBpbGVVbnNhZmUocXVlcnksIG9wdGlvbnMsIGVsZW1zKTtcblx0XHRpZihxdWVyeS5zaG91bGRUZXN0TmV4dFNpYmxpbmdzKSBlbGVtcyA9IGFwcGVuZE5leHRTaWJsaW5ncygob3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQpIHx8IGVsZW1zLCBvcHRpb25zLmFkYXB0ZXIpO1xuXHRcdGlmKCFBcnJheS5pc0FycmF5KGVsZW1zKSkgZWxlbXMgPSBvcHRpb25zLmFkYXB0ZXIuZ2V0Q2hpbGRyZW4oZWxlbXMpO1xuXHRcdGVsc2UgZWxlbXMgPSBvcHRpb25zLmFkYXB0ZXIucmVtb3ZlU3Vic2V0cyhlbGVtcyk7XG5cdFx0cmV0dXJuIHNlYXJjaEZ1bmMocXVlcnksIGVsZW1zLCBvcHRpb25zKTtcblx0fTtcbn1cblxuZnVuY3Rpb24gZ2V0TmV4dFNpYmxpbmdzKGVsZW0sIGFkYXB0ZXIpe1xuXHR2YXIgc2libGluZ3MgPSBhZGFwdGVyLmdldFNpYmxpbmdzKGVsZW0pO1xuXHRpZighQXJyYXkuaXNBcnJheShzaWJsaW5ncykpIHJldHVybiBbXTtcblx0c2libGluZ3MgPSBzaWJsaW5ncy5zbGljZSgwKTtcblx0d2hpbGUoc2libGluZ3Muc2hpZnQoKSAhPT0gZWxlbSk7XG5cdHJldHVybiBzaWJsaW5ncztcbn1cblxuZnVuY3Rpb24gYXBwZW5kTmV4dFNpYmxpbmdzKGVsZW1zLCBhZGFwdGVyKXtcblx0Ly8gT3JkZXIgbWF0dGVycyBiZWNhdXNlIGpRdWVyeSBzZWVtcyB0byBjaGVjayB0aGUgY2hpbGRyZW4gYmVmb3JlIHRoZSBzaWJsaW5nc1xuXHRpZighQXJyYXkuaXNBcnJheShlbGVtcykpIGVsZW1zID0gW2VsZW1zXTtcblx0dmFyIG5ld0VsZW1zID0gZWxlbXMuc2xpY2UoMCk7XG5cblx0Zm9yKHZhciBpID0gMCwgbGVuID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspe1xuXHRcdHZhciBuZXh0U2libGluZ3MgPSBnZXROZXh0U2libGluZ3MobmV3RWxlbXNbaV0sIGFkYXB0ZXIpO1xuXHRcdG5ld0VsZW1zLnB1c2guYXBwbHkobmV3RWxlbXMsIG5leHRTaWJsaW5ncyk7XG5cdH1cblx0cmV0dXJuIG5ld0VsZW1zO1xufVxuXG52YXIgc2VsZWN0QWxsID0gZ2V0U2VsZWN0b3JGdW5jKGZ1bmN0aW9uIHNlbGVjdEFsbChxdWVyeSwgZWxlbXMsIG9wdGlvbnMpe1xuXHRyZXR1cm4gKHF1ZXJ5ID09PSBmYWxzZUZ1bmMgfHwgIWVsZW1zIHx8IGVsZW1zLmxlbmd0aCA9PT0gMCkgPyBbXSA6IG9wdGlvbnMuYWRhcHRlci5maW5kQWxsKHF1ZXJ5LCBlbGVtcyk7XG59KTtcblxudmFyIHNlbGVjdE9uZSA9IGdldFNlbGVjdG9yRnVuYyhmdW5jdGlvbiBzZWxlY3RPbmUocXVlcnksIGVsZW1zLCBvcHRpb25zKXtcblx0cmV0dXJuIChxdWVyeSA9PT0gZmFsc2VGdW5jIHx8ICFlbGVtcyB8fCBlbGVtcy5sZW5ndGggPT09IDApID8gbnVsbCA6IG9wdGlvbnMuYWRhcHRlci5maW5kT25lKHF1ZXJ5LCBlbGVtcyk7XG59KTtcblxuZnVuY3Rpb24gaXMoZWxlbSwgcXVlcnksIG9wdGlvbnMpe1xuXHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuXHRvcHRpb25zLmFkYXB0ZXIgPSBvcHRpb25zLmFkYXB0ZXIgfHwgRG9tVXRpbHM7XG5cdHZhciBjb21waWxlID0gYWRhcHRlckNvbXBpbGUob3B0aW9ucy5hZGFwdGVyKTtcblx0cmV0dXJuICh0eXBlb2YgcXVlcnkgPT09IFwiZnVuY3Rpb25cIiA/IHF1ZXJ5IDogY29tcGlsZShxdWVyeSwgb3B0aW9ucykpKGVsZW0pO1xufVxuXG4vKlxuXHR0aGUgZXhwb3J0ZWQgaW50ZXJmYWNlXG4qL1xuZnVuY3Rpb24gQ1NTc2VsZWN0KHF1ZXJ5LCBlbGVtcywgb3B0aW9ucyl7XG5cdHJldHVybiBzZWxlY3RBbGwocXVlcnksIGVsZW1zLCBvcHRpb25zKTtcbn1cblxuQ1NTc2VsZWN0LmNvbXBpbGUgPSBkZWZhdWx0Q29tcGlsZTtcbkNTU3NlbGVjdC5maWx0ZXJzID0gZGVmYXVsdENvbXBpbGUuUHNldWRvcy5maWx0ZXJzO1xuQ1NTc2VsZWN0LnBzZXVkb3MgPSBkZWZhdWx0Q29tcGlsZS5Qc2V1ZG9zLnBzZXVkb3M7XG5cbkNTU3NlbGVjdC5zZWxlY3RBbGwgPSBzZWxlY3RBbGw7XG5DU1NzZWxlY3Quc2VsZWN0T25lID0gc2VsZWN0T25lO1xuXG5DU1NzZWxlY3QuaXMgPSBpcztcblxuLy9sZWdhY3kgbWV0aG9kcyAobWlnaHQgYmUgcmVtb3ZlZClcbkNTU3NlbGVjdC5wYXJzZSA9IGRlZmF1bHRDb21waWxlO1xuQ1NTc2VsZWN0Lml0ZXJhdGUgPSBzZWxlY3RBbGw7XG5cbi8vaG9va3NcbkNTU3NlbGVjdC5fY29tcGlsZVVuc2FmZSA9IGRlZmF1bHRDb21waWxlLmNvbXBpbGVVbnNhZmU7XG5DU1NzZWxlY3QuX2NvbXBpbGVUb2tlbiA9IGRlZmF1bHRDb21waWxlLmNvbXBpbGVUb2tlbjtcblxuXG4vKioqLyB9KSxcbi8qIDI1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBEb21VdGlscyA9IG1vZHVsZS5leHBvcnRzO1xuXG5bXG5cdF9fd2VicGFja19yZXF1aXJlX18oMjYpLFxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDM1KSxcblx0X193ZWJwYWNrX3JlcXVpcmVfXygzNiksXG5cdF9fd2VicGFja19yZXF1aXJlX18oMzcpLFxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDM4KSxcblx0X193ZWJwYWNrX3JlcXVpcmVfXygzOSlcbl0uZm9yRWFjaChmdW5jdGlvbihleHQpe1xuXHRPYmplY3Qua2V5cyhleHQpLmZvckVhY2goZnVuY3Rpb24oa2V5KXtcblx0XHREb21VdGlsc1trZXldID0gZXh0W2tleV0uYmluZChEb21VdGlscyk7XG5cdH0pO1xufSk7XG5cblxuLyoqKi8gfSksXG4vKiAyNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgRWxlbWVudFR5cGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpLFxuICAgIGdldE91dGVySFRNTCA9IF9fd2VicGFja19yZXF1aXJlX18oMjcpLFxuICAgIGlzVGFnID0gRWxlbWVudFR5cGUuaXNUYWc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRnZXRJbm5lckhUTUw6IGdldElubmVySFRNTCxcblx0Z2V0T3V0ZXJIVE1MOiBnZXRPdXRlckhUTUwsXG5cdGdldFRleHQ6IGdldFRleHRcbn07XG5cbmZ1bmN0aW9uIGdldElubmVySFRNTChlbGVtLCBvcHRzKXtcblx0cmV0dXJuIGVsZW0uY2hpbGRyZW4gPyBlbGVtLmNoaWxkcmVuLm1hcChmdW5jdGlvbihlbGVtKXtcblx0XHRyZXR1cm4gZ2V0T3V0ZXJIVE1MKGVsZW0sIG9wdHMpO1xuXHR9KS5qb2luKFwiXCIpIDogXCJcIjtcbn1cblxuZnVuY3Rpb24gZ2V0VGV4dChlbGVtKXtcblx0aWYoQXJyYXkuaXNBcnJheShlbGVtKSkgcmV0dXJuIGVsZW0ubWFwKGdldFRleHQpLmpvaW4oXCJcIik7XG5cdGlmKGlzVGFnKGVsZW0pIHx8IGVsZW0udHlwZSA9PT0gRWxlbWVudFR5cGUuQ0RBVEEpIHJldHVybiBnZXRUZXh0KGVsZW0uY2hpbGRyZW4pO1xuXHRpZihlbGVtLnR5cGUgPT09IEVsZW1lbnRUeXBlLlRleHQpIHJldHVybiBlbGVtLmRhdGE7XG5cdHJldHVybiBcIlwiO1xufVxuXG5cbi8qKiovIH0pLFxuLyogMjcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuLypcbiAgTW9kdWxlIGRlcGVuZGVuY2llc1xuKi9cbnZhciBFbGVtZW50VHlwZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjgpO1xudmFyIGVudGl0aWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSk7XG5cbi8qXG4gIEJvb2xlYW4gQXR0cmlidXRlc1xuKi9cbnZhciBib29sZWFuQXR0cmlidXRlcyA9IHtcbiAgX19wcm90b19fOiBudWxsLFxuICBhbGxvd2Z1bGxzY3JlZW46IHRydWUsXG4gIGFzeW5jOiB0cnVlLFxuICBhdXRvZm9jdXM6IHRydWUsXG4gIGF1dG9wbGF5OiB0cnVlLFxuICBjaGVja2VkOiB0cnVlLFxuICBjb250cm9sczogdHJ1ZSxcbiAgZGVmYXVsdDogdHJ1ZSxcbiAgZGVmZXI6IHRydWUsXG4gIGRpc2FibGVkOiB0cnVlLFxuICBoaWRkZW46IHRydWUsXG4gIGlzbWFwOiB0cnVlLFxuICBsb29wOiB0cnVlLFxuICBtdWx0aXBsZTogdHJ1ZSxcbiAgbXV0ZWQ6IHRydWUsXG4gIG9wZW46IHRydWUsXG4gIHJlYWRvbmx5OiB0cnVlLFxuICByZXF1aXJlZDogdHJ1ZSxcbiAgcmV2ZXJzZWQ6IHRydWUsXG4gIHNjb3BlZDogdHJ1ZSxcbiAgc2VhbWxlc3M6IHRydWUsXG4gIHNlbGVjdGVkOiB0cnVlLFxuICB0eXBlbXVzdG1hdGNoOiB0cnVlXG59O1xuXG52YXIgdW5lbmNvZGVkRWxlbWVudHMgPSB7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgc3R5bGU6IHRydWUsXG4gIHNjcmlwdDogdHJ1ZSxcbiAgeG1wOiB0cnVlLFxuICBpZnJhbWU6IHRydWUsXG4gIG5vZW1iZWQ6IHRydWUsXG4gIG5vZnJhbWVzOiB0cnVlLFxuICBwbGFpbnRleHQ6IHRydWUsXG4gIG5vc2NyaXB0OiB0cnVlXG59O1xuXG4vKlxuICBGb3JtYXQgYXR0cmlidXRlc1xuKi9cbmZ1bmN0aW9uIGZvcm1hdEF0dHJzKGF0dHJpYnV0ZXMsIG9wdHMpIHtcbiAgaWYgKCFhdHRyaWJ1dGVzKSByZXR1cm47XG5cbiAgdmFyIG91dHB1dCA9ICcnLFxuICAgICAgdmFsdWU7XG5cbiAgLy8gTG9vcCB0aHJvdWdoIHRoZSBhdHRyaWJ1dGVzXG4gIGZvciAodmFyIGtleSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgdmFsdWUgPSBhdHRyaWJ1dGVzW2tleV07XG4gICAgaWYgKG91dHB1dCkge1xuICAgICAgb3V0cHV0ICs9ICcgJztcbiAgICB9XG5cbiAgICBpZiAoIXZhbHVlICYmIGJvb2xlYW5BdHRyaWJ1dGVzW2tleV0pIHtcbiAgICAgIG91dHB1dCArPSBrZXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dCArPSBrZXkgKyAnPVwiJyArIChvcHRzLmRlY29kZUVudGl0aWVzID8gZW50aXRpZXMuZW5jb2RlWE1MKHZhbHVlKSA6IHZhbHVlKSArICdcIic7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLypcbiAgU2VsZi1lbmNsb3NpbmcgdGFncyAoc3RvbGVuIGZyb20gbm9kZS1odG1scGFyc2VyKVxuKi9cbnZhciBzaW5nbGVUYWcgPSB7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgYXJlYTogdHJ1ZSxcbiAgYmFzZTogdHJ1ZSxcbiAgYmFzZWZvbnQ6IHRydWUsXG4gIGJyOiB0cnVlLFxuICBjb2w6IHRydWUsXG4gIGNvbW1hbmQ6IHRydWUsXG4gIGVtYmVkOiB0cnVlLFxuICBmcmFtZTogdHJ1ZSxcbiAgaHI6IHRydWUsXG4gIGltZzogdHJ1ZSxcbiAgaW5wdXQ6IHRydWUsXG4gIGlzaW5kZXg6IHRydWUsXG4gIGtleWdlbjogdHJ1ZSxcbiAgbGluazogdHJ1ZSxcbiAgbWV0YTogdHJ1ZSxcbiAgcGFyYW06IHRydWUsXG4gIHNvdXJjZTogdHJ1ZSxcbiAgdHJhY2s6IHRydWUsXG4gIHdicjogdHJ1ZSxcbn07XG5cblxudmFyIHJlbmRlciA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZG9tLCBvcHRzKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShkb20pICYmICFkb20uY2hlZXJpbykgZG9tID0gW2RvbV07XG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuXG4gIHZhciBvdXRwdXQgPSAnJztcblxuICBmb3IodmFyIGkgPSAwOyBpIDwgZG9tLmxlbmd0aDsgaSsrKXtcbiAgICB2YXIgZWxlbSA9IGRvbVtpXTtcblxuICAgIGlmIChlbGVtLnR5cGUgPT09ICdyb290JylcbiAgICAgIG91dHB1dCArPSByZW5kZXIoZWxlbS5jaGlsZHJlbiwgb3B0cyk7XG4gICAgZWxzZSBpZiAoRWxlbWVudFR5cGUuaXNUYWcoZWxlbSkpXG4gICAgICBvdXRwdXQgKz0gcmVuZGVyVGFnKGVsZW0sIG9wdHMpO1xuICAgIGVsc2UgaWYgKGVsZW0udHlwZSA9PT0gRWxlbWVudFR5cGUuRGlyZWN0aXZlKVxuICAgICAgb3V0cHV0ICs9IHJlbmRlckRpcmVjdGl2ZShlbGVtKTtcbiAgICBlbHNlIGlmIChlbGVtLnR5cGUgPT09IEVsZW1lbnRUeXBlLkNvbW1lbnQpXG4gICAgICBvdXRwdXQgKz0gcmVuZGVyQ29tbWVudChlbGVtKTtcbiAgICBlbHNlIGlmIChlbGVtLnR5cGUgPT09IEVsZW1lbnRUeXBlLkNEQVRBKVxuICAgICAgb3V0cHV0ICs9IHJlbmRlckNkYXRhKGVsZW0pO1xuICAgIGVsc2VcbiAgICAgIG91dHB1dCArPSByZW5kZXJUZXh0KGVsZW0sIG9wdHMpO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn07XG5cbmZ1bmN0aW9uIHJlbmRlclRhZyhlbGVtLCBvcHRzKSB7XG4gIC8vIEhhbmRsZSBTVkdcbiAgaWYgKGVsZW0ubmFtZSA9PT0gXCJzdmdcIikgb3B0cyA9IHtkZWNvZGVFbnRpdGllczogb3B0cy5kZWNvZGVFbnRpdGllcywgeG1sTW9kZTogdHJ1ZX07XG5cbiAgdmFyIHRhZyA9ICc8JyArIGVsZW0ubmFtZSxcbiAgICAgIGF0dHJpYnMgPSBmb3JtYXRBdHRycyhlbGVtLmF0dHJpYnMsIG9wdHMpO1xuXG4gIGlmIChhdHRyaWJzKSB7XG4gICAgdGFnICs9ICcgJyArIGF0dHJpYnM7XG4gIH1cblxuICBpZiAoXG4gICAgb3B0cy54bWxNb2RlXG4gICAgJiYgKCFlbGVtLmNoaWxkcmVuIHx8IGVsZW0uY2hpbGRyZW4ubGVuZ3RoID09PSAwKVxuICApIHtcbiAgICB0YWcgKz0gJy8+JztcbiAgfSBlbHNlIHtcbiAgICB0YWcgKz0gJz4nO1xuICAgIGlmIChlbGVtLmNoaWxkcmVuKSB7XG4gICAgICB0YWcgKz0gcmVuZGVyKGVsZW0uY2hpbGRyZW4sIG9wdHMpO1xuICAgIH1cblxuICAgIGlmICghc2luZ2xlVGFnW2VsZW0ubmFtZV0gfHwgb3B0cy54bWxNb2RlKSB7XG4gICAgICB0YWcgKz0gJzwvJyArIGVsZW0ubmFtZSArICc+JztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFnO1xufVxuXG5mdW5jdGlvbiByZW5kZXJEaXJlY3RpdmUoZWxlbSkge1xuICByZXR1cm4gJzwnICsgZWxlbS5kYXRhICsgJz4nO1xufVxuXG5mdW5jdGlvbiByZW5kZXJUZXh0KGVsZW0sIG9wdHMpIHtcbiAgdmFyIGRhdGEgPSBlbGVtLmRhdGEgfHwgJyc7XG5cbiAgLy8gaWYgZW50aXRpZXMgd2VyZW4ndCBkZWNvZGVkLCBubyBuZWVkIHRvIGVuY29kZSB0aGVtIGJhY2tcbiAgaWYgKG9wdHMuZGVjb2RlRW50aXRpZXMgJiYgIShlbGVtLnBhcmVudCAmJiBlbGVtLnBhcmVudC5uYW1lIGluIHVuZW5jb2RlZEVsZW1lbnRzKSkge1xuICAgIGRhdGEgPSBlbnRpdGllcy5lbmNvZGVYTUwoZGF0YSk7XG4gIH1cblxuICByZXR1cm4gZGF0YTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyQ2RhdGEoZWxlbSkge1xuICByZXR1cm4gJzwhW0NEQVRBWycgKyBlbGVtLmNoaWxkcmVuWzBdLmRhdGEgKyAnXV0+Jztcbn1cblxuZnVuY3Rpb24gcmVuZGVyQ29tbWVudChlbGVtKSB7XG4gIHJldHVybiAnPCEtLScgKyBlbGVtLmRhdGEgKyAnLS0+Jztcbn1cblxuXG4vKioqLyB9KSxcbi8qIDI4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbi8vVHlwZXMgb2YgZWxlbWVudHMgZm91bmQgaW4gdGhlIERPTVxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdFRleHQ6IFwidGV4dFwiLCAvL1RleHRcblx0RGlyZWN0aXZlOiBcImRpcmVjdGl2ZVwiLCAvLzw/IC4uLiA/PlxuXHRDb21tZW50OiBcImNvbW1lbnRcIiwgLy88IS0tIC4uLiAtLT5cblx0U2NyaXB0OiBcInNjcmlwdFwiLCAvLzxzY3JpcHQ+IHRhZ3Ncblx0U3R5bGU6IFwic3R5bGVcIiwgLy88c3R5bGU+IHRhZ3Ncblx0VGFnOiBcInRhZ1wiLCAvL0FueSB0YWdcblx0Q0RBVEE6IFwiY2RhdGFcIiwgLy88IVtDREFUQVsgLi4uIF1dPlxuXG5cdGlzVGFnOiBmdW5jdGlvbihlbGVtKXtcblx0XHRyZXR1cm4gZWxlbS50eXBlID09PSBcInRhZ1wiIHx8IGVsZW0udHlwZSA9PT0gXCJzY3JpcHRcIiB8fCBlbGVtLnR5cGUgPT09IFwic3R5bGVcIjtcblx0fVxufTtcblxuLyoqKi8gfSksXG4vKiAyOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgZW5jb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMCksXG4gICAgZGVjb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMSk7XG5cbmV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24oZGF0YSwgbGV2ZWwpe1xuXHRyZXR1cm4gKCFsZXZlbCB8fCBsZXZlbCA8PSAwID8gZGVjb2RlLlhNTCA6IGRlY29kZS5IVE1MKShkYXRhKTtcbn07XG5cbmV4cG9ydHMuZGVjb2RlU3RyaWN0ID0gZnVuY3Rpb24oZGF0YSwgbGV2ZWwpe1xuXHRyZXR1cm4gKCFsZXZlbCB8fCBsZXZlbCA8PSAwID8gZGVjb2RlLlhNTCA6IGRlY29kZS5IVE1MU3RyaWN0KShkYXRhKTtcbn07XG5cbmV4cG9ydHMuZW5jb2RlID0gZnVuY3Rpb24oZGF0YSwgbGV2ZWwpe1xuXHRyZXR1cm4gKCFsZXZlbCB8fCBsZXZlbCA8PSAwID8gZW5jb2RlLlhNTCA6IGVuY29kZS5IVE1MKShkYXRhKTtcbn07XG5cbmV4cG9ydHMuZW5jb2RlWE1MID0gZW5jb2RlLlhNTDtcblxuZXhwb3J0cy5lbmNvZGVIVE1MNCA9XG5leHBvcnRzLmVuY29kZUhUTUw1ID1cbmV4cG9ydHMuZW5jb2RlSFRNTCAgPSBlbmNvZGUuSFRNTDtcblxuZXhwb3J0cy5kZWNvZGVYTUwgPVxuZXhwb3J0cy5kZWNvZGVYTUxTdHJpY3QgPSBkZWNvZGUuWE1MO1xuXG5leHBvcnRzLmRlY29kZUhUTUw0ID1cbmV4cG9ydHMuZGVjb2RlSFRNTDUgPVxuZXhwb3J0cy5kZWNvZGVIVE1MID0gZGVjb2RlLkhUTUw7XG5cbmV4cG9ydHMuZGVjb2RlSFRNTDRTdHJpY3QgPVxuZXhwb3J0cy5kZWNvZGVIVE1MNVN0cmljdCA9XG5leHBvcnRzLmRlY29kZUhUTUxTdHJpY3QgPSBkZWNvZGUuSFRNTFN0cmljdDtcblxuZXhwb3J0cy5lc2NhcGUgPSBlbmNvZGUuZXNjYXBlO1xuXG5cbi8qKiovIH0pLFxuLyogMzAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGludmVyc2VYTUwgPSBnZXRJbnZlcnNlT2JqKF9fd2VicGFja19yZXF1aXJlX18oMTMpKSxcbiAgICB4bWxSZXBsYWNlciA9IGdldEludmVyc2VSZXBsYWNlcihpbnZlcnNlWE1MKTtcblxuZXhwb3J0cy5YTUwgPSBnZXRJbnZlcnNlKGludmVyc2VYTUwsIHhtbFJlcGxhY2VyKTtcblxudmFyIGludmVyc2VIVE1MID0gZ2V0SW52ZXJzZU9iaihfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KSksXG4gICAgaHRtbFJlcGxhY2VyID0gZ2V0SW52ZXJzZVJlcGxhY2VyKGludmVyc2VIVE1MKTtcblxuZXhwb3J0cy5IVE1MID0gZ2V0SW52ZXJzZShpbnZlcnNlSFRNTCwgaHRtbFJlcGxhY2VyKTtcblxuZnVuY3Rpb24gZ2V0SW52ZXJzZU9iaihvYmope1xuXHRyZXR1cm4gT2JqZWN0LmtleXMob2JqKS5zb3J0KCkucmVkdWNlKGZ1bmN0aW9uKGludmVyc2UsIG5hbWUpe1xuXHRcdGludmVyc2Vbb2JqW25hbWVdXSA9IFwiJlwiICsgbmFtZSArIFwiO1wiO1xuXHRcdHJldHVybiBpbnZlcnNlO1xuXHR9LCB7fSk7XG59XG5cbmZ1bmN0aW9uIGdldEludmVyc2VSZXBsYWNlcihpbnZlcnNlKXtcblx0dmFyIHNpbmdsZSA9IFtdLFxuXHQgICAgbXVsdGlwbGUgPSBbXTtcblxuXHRPYmplY3Qua2V5cyhpbnZlcnNlKS5mb3JFYWNoKGZ1bmN0aW9uKGspe1xuXHRcdGlmKGsubGVuZ3RoID09PSAxKXtcblx0XHRcdHNpbmdsZS5wdXNoKFwiXFxcXFwiICsgayk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG11bHRpcGxlLnB1c2goayk7XG5cdFx0fVxuXHR9KTtcblxuXHQvL1RPRE8gYWRkIHJhbmdlc1xuXHRtdWx0aXBsZS51bnNoaWZ0KFwiW1wiICsgc2luZ2xlLmpvaW4oXCJcIikgKyBcIl1cIik7XG5cblx0cmV0dXJuIG5ldyBSZWdFeHAobXVsdGlwbGUuam9pbihcInxcIiksIFwiZ1wiKTtcbn1cblxudmFyIHJlX25vbkFTQ0lJID0gL1teXFwwLVxceDdGXS9nLFxuICAgIHJlX2FzdHJhbFN5bWJvbHMgPSAvW1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXS9nO1xuXG5mdW5jdGlvbiBzaW5nbGVDaGFyUmVwbGFjZXIoYyl7XG5cdHJldHVybiBcIiYjeFwiICsgYy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpICsgXCI7XCI7XG59XG5cbmZ1bmN0aW9uIGFzdHJhbFJlcGxhY2VyKGMpe1xuXHQvLyBodHRwOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nI3N1cnJvZ2F0ZS1mb3JtdWxhZVxuXHR2YXIgaGlnaCA9IGMuY2hhckNvZGVBdCgwKTtcblx0dmFyIGxvdyAgPSBjLmNoYXJDb2RlQXQoMSk7XG5cdHZhciBjb2RlUG9pbnQgPSAoaGlnaCAtIDB4RDgwMCkgKiAweDQwMCArIGxvdyAtIDB4REMwMCArIDB4MTAwMDA7XG5cdHJldHVybiBcIiYjeFwiICsgY29kZVBvaW50LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpICsgXCI7XCI7XG59XG5cbmZ1bmN0aW9uIGdldEludmVyc2UoaW52ZXJzZSwgcmUpe1xuXHRmdW5jdGlvbiBmdW5jKG5hbWUpe1xuXHRcdHJldHVybiBpbnZlcnNlW25hbWVdO1xuXHR9XG5cblx0cmV0dXJuIGZ1bmN0aW9uKGRhdGEpe1xuXHRcdHJldHVybiBkYXRhXG5cdFx0XHRcdC5yZXBsYWNlKHJlLCBmdW5jKVxuXHRcdFx0XHQucmVwbGFjZShyZV9hc3RyYWxTeW1ib2xzLCBhc3RyYWxSZXBsYWNlcilcblx0XHRcdFx0LnJlcGxhY2UocmVfbm9uQVNDSUksIHNpbmdsZUNoYXJSZXBsYWNlcik7XG5cdH07XG59XG5cbnZhciByZV94bWxDaGFycyA9IGdldEludmVyc2VSZXBsYWNlcihpbnZlcnNlWE1MKTtcblxuZnVuY3Rpb24gZXNjYXBlWE1MKGRhdGEpe1xuXHRyZXR1cm4gZGF0YVxuXHRcdFx0LnJlcGxhY2UocmVfeG1sQ2hhcnMsIHNpbmdsZUNoYXJSZXBsYWNlcilcblx0XHRcdC5yZXBsYWNlKHJlX2FzdHJhbFN5bWJvbHMsIGFzdHJhbFJlcGxhY2VyKVxuXHRcdFx0LnJlcGxhY2UocmVfbm9uQVNDSUksIHNpbmdsZUNoYXJSZXBsYWNlcik7XG59XG5cbmV4cG9ydHMuZXNjYXBlID0gZXNjYXBlWE1MO1xuXG5cbi8qKiovIH0pLFxuLyogMzEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGVudGl0eU1hcCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpLFxuICAgIGxlZ2FjeU1hcCA9IF9fd2VicGFja19yZXF1aXJlX18oMzIpLFxuICAgIHhtbE1hcCAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpLFxuICAgIGRlY29kZUNvZGVQb2ludCA9IF9fd2VicGFja19yZXF1aXJlX18oMzMpO1xuXG52YXIgZGVjb2RlWE1MU3RyaWN0ICA9IGdldFN0cmljdERlY29kZXIoeG1sTWFwKSxcbiAgICBkZWNvZGVIVE1MU3RyaWN0ID0gZ2V0U3RyaWN0RGVjb2RlcihlbnRpdHlNYXApO1xuXG5mdW5jdGlvbiBnZXRTdHJpY3REZWNvZGVyKG1hcCl7XG5cdHZhciBrZXlzID0gT2JqZWN0LmtleXMobWFwKS5qb2luKFwifFwiKSxcblx0ICAgIHJlcGxhY2UgPSBnZXRSZXBsYWNlcihtYXApO1xuXG5cdGtleXMgKz0gXCJ8I1t4WF1bXFxcXGRhLWZBLUZdK3wjXFxcXGQrXCI7XG5cblx0dmFyIHJlID0gbmV3IFJlZ0V4cChcIiYoPzpcIiArIGtleXMgKyBcIik7XCIsIFwiZ1wiKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24oc3RyKXtcblx0XHRyZXR1cm4gU3RyaW5nKHN0cikucmVwbGFjZShyZSwgcmVwbGFjZSk7XG5cdH07XG59XG5cbnZhciBkZWNvZGVIVE1MID0gKGZ1bmN0aW9uKCl7XG5cdHZhciBsZWdhY3kgPSBPYmplY3Qua2V5cyhsZWdhY3lNYXApXG5cdFx0LnNvcnQoc29ydGVyKTtcblxuXHR2YXIga2V5cyA9IE9iamVjdC5rZXlzKGVudGl0eU1hcClcblx0XHQuc29ydChzb3J0ZXIpO1xuXG5cdGZvcih2YXIgaSA9IDAsIGogPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKyl7XG5cdFx0aWYobGVnYWN5W2pdID09PSBrZXlzW2ldKXtcblx0XHRcdGtleXNbaV0gKz0gXCI7P1wiO1xuXHRcdFx0aisrO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRrZXlzW2ldICs9IFwiO1wiO1xuXHRcdH1cblx0fVxuXG5cdHZhciByZSA9IG5ldyBSZWdFeHAoXCImKD86XCIgKyBrZXlzLmpvaW4oXCJ8XCIpICsgXCJ8I1t4WF1bXFxcXGRhLWZBLUZdKzs/fCNcXFxcZCs7PylcIiwgXCJnXCIpLFxuXHQgICAgcmVwbGFjZSA9IGdldFJlcGxhY2VyKGVudGl0eU1hcCk7XG5cblx0ZnVuY3Rpb24gcmVwbGFjZXIoc3RyKXtcblx0XHRpZihzdHIuc3Vic3RyKC0xKSAhPT0gXCI7XCIpIHN0ciArPSBcIjtcIjtcblx0XHRyZXR1cm4gcmVwbGFjZShzdHIpO1xuXHR9XG5cblx0Ly9UT0RPIGNvbnNpZGVyIGNyZWF0aW5nIGEgbWVyZ2VkIG1hcFxuXHRyZXR1cm4gZnVuY3Rpb24oc3RyKXtcblx0XHRyZXR1cm4gU3RyaW5nKHN0cikucmVwbGFjZShyZSwgcmVwbGFjZXIpO1xuXHR9O1xufSgpKTtcblxuZnVuY3Rpb24gc29ydGVyKGEsIGIpe1xuXHRyZXR1cm4gYSA8IGIgPyAxIDogLTE7XG59XG5cbmZ1bmN0aW9uIGdldFJlcGxhY2VyKG1hcCl7XG5cdHJldHVybiBmdW5jdGlvbiByZXBsYWNlKHN0cil7XG5cdFx0aWYoc3RyLmNoYXJBdCgxKSA9PT0gXCIjXCIpe1xuXHRcdFx0aWYoc3RyLmNoYXJBdCgyKSA9PT0gXCJYXCIgfHwgc3RyLmNoYXJBdCgyKSA9PT0gXCJ4XCIpe1xuXHRcdFx0XHRyZXR1cm4gZGVjb2RlQ29kZVBvaW50KHBhcnNlSW50KHN0ci5zdWJzdHIoMyksIDE2KSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZGVjb2RlQ29kZVBvaW50KHBhcnNlSW50KHN0ci5zdWJzdHIoMiksIDEwKSk7XG5cdFx0fVxuXHRcdHJldHVybiBtYXBbc3RyLnNsaWNlKDEsIC0xKV07XG5cdH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRYTUw6IGRlY29kZVhNTFN0cmljdCxcblx0SFRNTDogZGVjb2RlSFRNTCxcblx0SFRNTFN0cmljdDogZGVjb2RlSFRNTFN0cmljdFxufTtcblxuLyoqKi8gfSksXG4vKiAzMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcIkFhY3V0ZVwiOlwiw4FcIixcImFhY3V0ZVwiOlwiw6FcIixcIkFjaXJjXCI6XCLDglwiLFwiYWNpcmNcIjpcIsOiXCIsXCJhY3V0ZVwiOlwiwrRcIixcIkFFbGlnXCI6XCLDhlwiLFwiYWVsaWdcIjpcIsOmXCIsXCJBZ3JhdmVcIjpcIsOAXCIsXCJhZ3JhdmVcIjpcIsOgXCIsXCJhbXBcIjpcIiZcIixcIkFNUFwiOlwiJlwiLFwiQXJpbmdcIjpcIsOFXCIsXCJhcmluZ1wiOlwiw6VcIixcIkF0aWxkZVwiOlwiw4NcIixcImF0aWxkZVwiOlwiw6NcIixcIkF1bWxcIjpcIsOEXCIsXCJhdW1sXCI6XCLDpFwiLFwiYnJ2YmFyXCI6XCLCplwiLFwiQ2NlZGlsXCI6XCLDh1wiLFwiY2NlZGlsXCI6XCLDp1wiLFwiY2VkaWxcIjpcIsK4XCIsXCJjZW50XCI6XCLColwiLFwiY29weVwiOlwiwqlcIixcIkNPUFlcIjpcIsKpXCIsXCJjdXJyZW5cIjpcIsKkXCIsXCJkZWdcIjpcIsKwXCIsXCJkaXZpZGVcIjpcIsO3XCIsXCJFYWN1dGVcIjpcIsOJXCIsXCJlYWN1dGVcIjpcIsOpXCIsXCJFY2lyY1wiOlwiw4pcIixcImVjaXJjXCI6XCLDqlwiLFwiRWdyYXZlXCI6XCLDiFwiLFwiZWdyYXZlXCI6XCLDqFwiLFwiRVRIXCI6XCLDkFwiLFwiZXRoXCI6XCLDsFwiLFwiRXVtbFwiOlwiw4tcIixcImV1bWxcIjpcIsOrXCIsXCJmcmFjMTJcIjpcIsK9XCIsXCJmcmFjMTRcIjpcIsK8XCIsXCJmcmFjMzRcIjpcIsK+XCIsXCJndFwiOlwiPlwiLFwiR1RcIjpcIj5cIixcIklhY3V0ZVwiOlwiw41cIixcImlhY3V0ZVwiOlwiw61cIixcIkljaXJjXCI6XCLDjlwiLFwiaWNpcmNcIjpcIsOuXCIsXCJpZXhjbFwiOlwiwqFcIixcIklncmF2ZVwiOlwiw4xcIixcImlncmF2ZVwiOlwiw6xcIixcImlxdWVzdFwiOlwiwr9cIixcIkl1bWxcIjpcIsOPXCIsXCJpdW1sXCI6XCLDr1wiLFwibGFxdW9cIjpcIsKrXCIsXCJsdFwiOlwiPFwiLFwiTFRcIjpcIjxcIixcIm1hY3JcIjpcIsKvXCIsXCJtaWNyb1wiOlwiwrVcIixcIm1pZGRvdFwiOlwiwrdcIixcIm5ic3BcIjpcIsKgXCIsXCJub3RcIjpcIsKsXCIsXCJOdGlsZGVcIjpcIsORXCIsXCJudGlsZGVcIjpcIsOxXCIsXCJPYWN1dGVcIjpcIsOTXCIsXCJvYWN1dGVcIjpcIsOzXCIsXCJPY2lyY1wiOlwiw5RcIixcIm9jaXJjXCI6XCLDtFwiLFwiT2dyYXZlXCI6XCLDklwiLFwib2dyYXZlXCI6XCLDslwiLFwib3JkZlwiOlwiwqpcIixcIm9yZG1cIjpcIsK6XCIsXCJPc2xhc2hcIjpcIsOYXCIsXCJvc2xhc2hcIjpcIsO4XCIsXCJPdGlsZGVcIjpcIsOVXCIsXCJvdGlsZGVcIjpcIsO1XCIsXCJPdW1sXCI6XCLDllwiLFwib3VtbFwiOlwiw7ZcIixcInBhcmFcIjpcIsK2XCIsXCJwbHVzbW5cIjpcIsKxXCIsXCJwb3VuZFwiOlwiwqNcIixcInF1b3RcIjpcIlxcXCJcIixcIlFVT1RcIjpcIlxcXCJcIixcInJhcXVvXCI6XCLCu1wiLFwicmVnXCI6XCLCrlwiLFwiUkVHXCI6XCLCrlwiLFwic2VjdFwiOlwiwqdcIixcInNoeVwiOlwiwq1cIixcInN1cDFcIjpcIsK5XCIsXCJzdXAyXCI6XCLCslwiLFwic3VwM1wiOlwiwrNcIixcInN6bGlnXCI6XCLDn1wiLFwiVEhPUk5cIjpcIsOeXCIsXCJ0aG9yblwiOlwiw75cIixcInRpbWVzXCI6XCLDl1wiLFwiVWFjdXRlXCI6XCLDmlwiLFwidWFjdXRlXCI6XCLDulwiLFwiVWNpcmNcIjpcIsObXCIsXCJ1Y2lyY1wiOlwiw7tcIixcIlVncmF2ZVwiOlwiw5lcIixcInVncmF2ZVwiOlwiw7lcIixcInVtbFwiOlwiwqhcIixcIlV1bWxcIjpcIsOcXCIsXCJ1dW1sXCI6XCLDvFwiLFwiWWFjdXRlXCI6XCLDnVwiLFwieWFjdXRlXCI6XCLDvVwiLFwieWVuXCI6XCLCpVwiLFwieXVtbFwiOlwiw79cIn1cblxuLyoqKi8gfSksXG4vKiAzMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgZGVjb2RlTWFwID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVjb2RlQ29kZVBvaW50O1xuXG4vLyBtb2RpZmllZCB2ZXJzaW9uIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL2hlL2Jsb2IvbWFzdGVyL3NyYy9oZS5qcyNMOTQtTDExOVxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50KGNvZGVQb2ludCl7XG5cblx0aWYoKGNvZGVQb2ludCA+PSAweEQ4MDAgJiYgY29kZVBvaW50IDw9IDB4REZGRikgfHwgY29kZVBvaW50ID4gMHgxMEZGRkYpe1xuXHRcdHJldHVybiBcIlxcdUZGRkRcIjtcblx0fVxuXG5cdGlmKGNvZGVQb2ludCBpbiBkZWNvZGVNYXApe1xuXHRcdGNvZGVQb2ludCA9IGRlY29kZU1hcFtjb2RlUG9pbnRdO1xuXHR9XG5cblx0dmFyIG91dHB1dCA9IFwiXCI7XG5cblx0aWYoY29kZVBvaW50ID4gMHhGRkZGKXtcblx0XHRjb2RlUG9pbnQgLT0gMHgxMDAwMDtcblx0XHRvdXRwdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApO1xuXHRcdGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGO1xuXHR9XG5cblx0b3V0cHV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZVBvaW50KTtcblx0cmV0dXJuIG91dHB1dDtcbn1cblxuXG4vKioqLyB9KSxcbi8qIDM0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0ge1wiMFwiOjY1NTMzLFwiMTI4XCI6ODM2NCxcIjEzMFwiOjgyMTgsXCIxMzFcIjo0MDIsXCIxMzJcIjo4MjIyLFwiMTMzXCI6ODIzMCxcIjEzNFwiOjgyMjQsXCIxMzVcIjo4MjI1LFwiMTM2XCI6NzEwLFwiMTM3XCI6ODI0MCxcIjEzOFwiOjM1MixcIjEzOVwiOjgyNDksXCIxNDBcIjozMzgsXCIxNDJcIjozODEsXCIxNDVcIjo4MjE2LFwiMTQ2XCI6ODIxNyxcIjE0N1wiOjgyMjAsXCIxNDhcIjo4MjIxLFwiMTQ5XCI6ODIyNixcIjE1MFwiOjgyMTEsXCIxNTFcIjo4MjEyLFwiMTUyXCI6NzMyLFwiMTUzXCI6ODQ4MixcIjE1NFwiOjM1MyxcIjE1NVwiOjgyNTAsXCIxNTZcIjozMzksXCIxNThcIjozODIsXCIxNTlcIjozNzZ9XG5cbi8qKiovIH0pLFxuLyogMzUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxudmFyIGdldENoaWxkcmVuID0gZXhwb3J0cy5nZXRDaGlsZHJlbiA9IGZ1bmN0aW9uKGVsZW0pe1xuXHRyZXR1cm4gZWxlbS5jaGlsZHJlbjtcbn07XG5cbnZhciBnZXRQYXJlbnQgPSBleHBvcnRzLmdldFBhcmVudCA9IGZ1bmN0aW9uKGVsZW0pe1xuXHRyZXR1cm4gZWxlbS5wYXJlbnQ7XG59O1xuXG5leHBvcnRzLmdldFNpYmxpbmdzID0gZnVuY3Rpb24oZWxlbSl7XG5cdHZhciBwYXJlbnQgPSBnZXRQYXJlbnQoZWxlbSk7XG5cdHJldHVybiBwYXJlbnQgPyBnZXRDaGlsZHJlbihwYXJlbnQpIDogW2VsZW1dO1xufTtcblxuZXhwb3J0cy5nZXRBdHRyaWJ1dGVWYWx1ZSA9IGZ1bmN0aW9uKGVsZW0sIG5hbWUpe1xuXHRyZXR1cm4gZWxlbS5hdHRyaWJzICYmIGVsZW0uYXR0cmlic1tuYW1lXTtcbn07XG5cbmV4cG9ydHMuaGFzQXR0cmliID0gZnVuY3Rpb24oZWxlbSwgbmFtZSl7XG5cdHJldHVybiAhIWVsZW0uYXR0cmlicyAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGVsZW0uYXR0cmlicywgbmFtZSk7XG59O1xuXG5leHBvcnRzLmdldE5hbWUgPSBmdW5jdGlvbihlbGVtKXtcblx0cmV0dXJuIGVsZW0ubmFtZTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiAzNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5leHBvcnRzLnJlbW92ZUVsZW1lbnQgPSBmdW5jdGlvbihlbGVtKXtcblx0aWYoZWxlbS5wcmV2KSBlbGVtLnByZXYubmV4dCA9IGVsZW0ubmV4dDtcblx0aWYoZWxlbS5uZXh0KSBlbGVtLm5leHQucHJldiA9IGVsZW0ucHJldjtcblxuXHRpZihlbGVtLnBhcmVudCl7XG5cdFx0dmFyIGNoaWxkcyA9IGVsZW0ucGFyZW50LmNoaWxkcmVuO1xuXHRcdGNoaWxkcy5zcGxpY2UoY2hpbGRzLmxhc3RJbmRleE9mKGVsZW0pLCAxKTtcblx0fVxufTtcblxuZXhwb3J0cy5yZXBsYWNlRWxlbWVudCA9IGZ1bmN0aW9uKGVsZW0sIHJlcGxhY2VtZW50KXtcblx0dmFyIHByZXYgPSByZXBsYWNlbWVudC5wcmV2ID0gZWxlbS5wcmV2O1xuXHRpZihwcmV2KXtcblx0XHRwcmV2Lm5leHQgPSByZXBsYWNlbWVudDtcblx0fVxuXG5cdHZhciBuZXh0ID0gcmVwbGFjZW1lbnQubmV4dCA9IGVsZW0ubmV4dDtcblx0aWYobmV4dCl7XG5cdFx0bmV4dC5wcmV2ID0gcmVwbGFjZW1lbnQ7XG5cdH1cblxuXHR2YXIgcGFyZW50ID0gcmVwbGFjZW1lbnQucGFyZW50ID0gZWxlbS5wYXJlbnQ7XG5cdGlmKHBhcmVudCl7XG5cdFx0dmFyIGNoaWxkcyA9IHBhcmVudC5jaGlsZHJlbjtcblx0XHRjaGlsZHNbY2hpbGRzLmxhc3RJbmRleE9mKGVsZW0pXSA9IHJlcGxhY2VtZW50O1xuXHR9XG59O1xuXG5leHBvcnRzLmFwcGVuZENoaWxkID0gZnVuY3Rpb24oZWxlbSwgY2hpbGQpe1xuXHRjaGlsZC5wYXJlbnQgPSBlbGVtO1xuXG5cdGlmKGVsZW0uY2hpbGRyZW4ucHVzaChjaGlsZCkgIT09IDEpe1xuXHRcdHZhciBzaWJsaW5nID0gZWxlbS5jaGlsZHJlbltlbGVtLmNoaWxkcmVuLmxlbmd0aCAtIDJdO1xuXHRcdHNpYmxpbmcubmV4dCA9IGNoaWxkO1xuXHRcdGNoaWxkLnByZXYgPSBzaWJsaW5nO1xuXHRcdGNoaWxkLm5leHQgPSBudWxsO1xuXHR9XG59O1xuXG5leHBvcnRzLmFwcGVuZCA9IGZ1bmN0aW9uKGVsZW0sIG5leHQpe1xuXHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnQsXG5cdFx0Y3Vyck5leHQgPSBlbGVtLm5leHQ7XG5cblx0bmV4dC5uZXh0ID0gY3Vyck5leHQ7XG5cdG5leHQucHJldiA9IGVsZW07XG5cdGVsZW0ubmV4dCA9IG5leHQ7XG5cdG5leHQucGFyZW50ID0gcGFyZW50O1xuXG5cdGlmKGN1cnJOZXh0KXtcblx0XHRjdXJyTmV4dC5wcmV2ID0gbmV4dDtcblx0XHRpZihwYXJlbnQpe1xuXHRcdFx0dmFyIGNoaWxkcyA9IHBhcmVudC5jaGlsZHJlbjtcblx0XHRcdGNoaWxkcy5zcGxpY2UoY2hpbGRzLmxhc3RJbmRleE9mKGN1cnJOZXh0KSwgMCwgbmV4dCk7XG5cdFx0fVxuXHR9IGVsc2UgaWYocGFyZW50KXtcblx0XHRwYXJlbnQuY2hpbGRyZW4ucHVzaChuZXh0KTtcblx0fVxufTtcblxuZXhwb3J0cy5wcmVwZW5kID0gZnVuY3Rpb24oZWxlbSwgcHJldil7XG5cdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudDtcblx0aWYocGFyZW50KXtcblx0XHR2YXIgY2hpbGRzID0gcGFyZW50LmNoaWxkcmVuO1xuXHRcdGNoaWxkcy5zcGxpY2UoY2hpbGRzLmxhc3RJbmRleE9mKGVsZW0pLCAwLCBwcmV2KTtcblx0fVxuXG5cdGlmKGVsZW0ucHJldil7XG5cdFx0ZWxlbS5wcmV2Lm5leHQgPSBwcmV2O1xuXHR9XG5cdFxuXHRwcmV2LnBhcmVudCA9IHBhcmVudDtcblx0cHJldi5wcmV2ID0gZWxlbS5wcmV2O1xuXHRwcmV2Lm5leHQgPSBlbGVtO1xuXHRlbGVtLnByZXYgPSBwcmV2O1xufTtcblxuXG5cblxuLyoqKi8gfSksXG4vKiAzNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgaXNUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpLmlzVGFnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0ZmlsdGVyOiBmaWx0ZXIsXG5cdGZpbmQ6IGZpbmQsXG5cdGZpbmRPbmVDaGlsZDogZmluZE9uZUNoaWxkLFxuXHRmaW5kT25lOiBmaW5kT25lLFxuXHRleGlzdHNPbmU6IGV4aXN0c09uZSxcblx0ZmluZEFsbDogZmluZEFsbFxufTtcblxuZnVuY3Rpb24gZmlsdGVyKHRlc3QsIGVsZW1lbnQsIHJlY3Vyc2UsIGxpbWl0KXtcblx0aWYoIUFycmF5LmlzQXJyYXkoZWxlbWVudCkpIGVsZW1lbnQgPSBbZWxlbWVudF07XG5cblx0aWYodHlwZW9mIGxpbWl0ICE9PSBcIm51bWJlclwiIHx8ICFpc0Zpbml0ZShsaW1pdCkpe1xuXHRcdGxpbWl0ID0gSW5maW5pdHk7XG5cdH1cblx0cmV0dXJuIGZpbmQodGVzdCwgZWxlbWVudCwgcmVjdXJzZSAhPT0gZmFsc2UsIGxpbWl0KTtcbn1cblxuZnVuY3Rpb24gZmluZCh0ZXN0LCBlbGVtcywgcmVjdXJzZSwgbGltaXQpe1xuXHR2YXIgcmVzdWx0ID0gW10sIGNoaWxkcztcblxuXHRmb3IodmFyIGkgPSAwLCBqID0gZWxlbXMubGVuZ3RoOyBpIDwgajsgaSsrKXtcblx0XHRpZih0ZXN0KGVsZW1zW2ldKSl7XG5cdFx0XHRyZXN1bHQucHVzaChlbGVtc1tpXSk7XG5cdFx0XHRpZigtLWxpbWl0IDw9IDApIGJyZWFrO1xuXHRcdH1cblxuXHRcdGNoaWxkcyA9IGVsZW1zW2ldLmNoaWxkcmVuO1xuXHRcdGlmKHJlY3Vyc2UgJiYgY2hpbGRzICYmIGNoaWxkcy5sZW5ndGggPiAwKXtcblx0XHRcdGNoaWxkcyA9IGZpbmQodGVzdCwgY2hpbGRzLCByZWN1cnNlLCBsaW1pdCk7XG5cdFx0XHRyZXN1bHQgPSByZXN1bHQuY29uY2F0KGNoaWxkcyk7XG5cdFx0XHRsaW1pdCAtPSBjaGlsZHMubGVuZ3RoO1xuXHRcdFx0aWYobGltaXQgPD0gMCkgYnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZmluZE9uZUNoaWxkKHRlc3QsIGVsZW1zKXtcblx0Zm9yKHZhciBpID0gMCwgbCA9IGVsZW1zLmxlbmd0aDsgaSA8IGw7IGkrKyl7XG5cdFx0aWYodGVzdChlbGVtc1tpXSkpIHJldHVybiBlbGVtc1tpXTtcblx0fVxuXG5cdHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kT25lKHRlc3QsIGVsZW1zKXtcblx0dmFyIGVsZW0gPSBudWxsO1xuXG5cdGZvcih2YXIgaSA9IDAsIGwgPSBlbGVtcy5sZW5ndGg7IGkgPCBsICYmICFlbGVtOyBpKyspe1xuXHRcdGlmKCFpc1RhZyhlbGVtc1tpXSkpe1xuXHRcdFx0Y29udGludWU7XG5cdFx0fSBlbHNlIGlmKHRlc3QoZWxlbXNbaV0pKXtcblx0XHRcdGVsZW0gPSBlbGVtc1tpXTtcblx0XHR9IGVsc2UgaWYoZWxlbXNbaV0uY2hpbGRyZW4ubGVuZ3RoID4gMCl7XG5cdFx0XHRlbGVtID0gZmluZE9uZSh0ZXN0LCBlbGVtc1tpXS5jaGlsZHJlbik7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbmZ1bmN0aW9uIGV4aXN0c09uZSh0ZXN0LCBlbGVtcyl7XG5cdGZvcih2YXIgaSA9IDAsIGwgPSBlbGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspe1xuXHRcdGlmKFxuXHRcdFx0aXNUYWcoZWxlbXNbaV0pICYmIChcblx0XHRcdFx0dGVzdChlbGVtc1tpXSkgfHwgKFxuXHRcdFx0XHRcdGVsZW1zW2ldLmNoaWxkcmVuLmxlbmd0aCA+IDAgJiZcblx0XHRcdFx0XHRleGlzdHNPbmUodGVzdCwgZWxlbXNbaV0uY2hpbGRyZW4pXG5cdFx0XHRcdClcblx0XHRcdClcblx0XHQpe1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBmaW5kQWxsKHRlc3QsIGVsZW1zKXtcblx0dmFyIHJlc3VsdCA9IFtdO1xuXHRmb3IodmFyIGkgPSAwLCBqID0gZWxlbXMubGVuZ3RoOyBpIDwgajsgaSsrKXtcblx0XHRpZighaXNUYWcoZWxlbXNbaV0pKSBjb250aW51ZTtcblx0XHRpZih0ZXN0KGVsZW1zW2ldKSkgcmVzdWx0LnB1c2goZWxlbXNbaV0pO1xuXG5cdFx0aWYoZWxlbXNbaV0uY2hpbGRyZW4ubGVuZ3RoID4gMCl7XG5cdFx0XHRyZXN1bHQgPSByZXN1bHQuY29uY2F0KGZpbmRBbGwodGVzdCwgZWxlbXNbaV0uY2hpbGRyZW4pKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuXG4vKioqLyB9KSxcbi8qIDM4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBFbGVtZW50VHlwZSA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG52YXIgaXNUYWcgPSBleHBvcnRzLmlzVGFnID0gRWxlbWVudFR5cGUuaXNUYWc7XG5cbmV4cG9ydHMudGVzdEVsZW1lbnQgPSBmdW5jdGlvbihvcHRpb25zLCBlbGVtZW50KXtcblx0Zm9yKHZhciBrZXkgaW4gb3B0aW9ucyl7XG5cdFx0aWYoIW9wdGlvbnMuaGFzT3duUHJvcGVydHkoa2V5KSk7XG5cdFx0ZWxzZSBpZihrZXkgPT09IFwidGFnX25hbWVcIil7XG5cdFx0XHRpZighaXNUYWcoZWxlbWVudCkgfHwgIW9wdGlvbnMudGFnX25hbWUoZWxlbWVudC5uYW1lKSl7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYoa2V5ID09PSBcInRhZ190eXBlXCIpe1xuXHRcdFx0aWYoIW9wdGlvbnMudGFnX3R5cGUoZWxlbWVudC50eXBlKSkgcmV0dXJuIGZhbHNlO1xuXHRcdH0gZWxzZSBpZihrZXkgPT09IFwidGFnX2NvbnRhaW5zXCIpe1xuXHRcdFx0aWYoaXNUYWcoZWxlbWVudCkgfHwgIW9wdGlvbnMudGFnX2NvbnRhaW5zKGVsZW1lbnQuZGF0YSkpe1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmKCFlbGVtZW50LmF0dHJpYnMgfHwgIW9wdGlvbnNba2V5XShlbGVtZW50LmF0dHJpYnNba2V5XSkpe1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gdHJ1ZTtcbn07XG5cbnZhciBDaGVja3MgPSB7XG5cdHRhZ19uYW1lOiBmdW5jdGlvbihuYW1lKXtcblx0XHRpZih0eXBlb2YgbmFtZSA9PT0gXCJmdW5jdGlvblwiKXtcblx0XHRcdHJldHVybiBmdW5jdGlvbihlbGVtKXsgcmV0dXJuIGlzVGFnKGVsZW0pICYmIG5hbWUoZWxlbS5uYW1lKTsgfTtcblx0XHR9IGVsc2UgaWYobmFtZSA9PT0gXCIqXCIpe1xuXHRcdFx0cmV0dXJuIGlzVGFnO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oZWxlbSl7IHJldHVybiBpc1RhZyhlbGVtKSAmJiBlbGVtLm5hbWUgPT09IG5hbWU7IH07XG5cdFx0fVxuXHR9LFxuXHR0YWdfdHlwZTogZnVuY3Rpb24odHlwZSl7XG5cdFx0aWYodHlwZW9mIHR5cGUgPT09IFwiZnVuY3Rpb25cIil7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oZWxlbSl7IHJldHVybiB0eXBlKGVsZW0udHlwZSk7IH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbihlbGVtKXsgcmV0dXJuIGVsZW0udHlwZSA9PT0gdHlwZTsgfTtcblx0XHR9XG5cdH0sXG5cdHRhZ19jb250YWluczogZnVuY3Rpb24oZGF0YSl7XG5cdFx0aWYodHlwZW9mIGRhdGEgPT09IFwiZnVuY3Rpb25cIil7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oZWxlbSl7IHJldHVybiAhaXNUYWcoZWxlbSkgJiYgZGF0YShlbGVtLmRhdGEpOyB9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oZWxlbSl7IHJldHVybiAhaXNUYWcoZWxlbSkgJiYgZWxlbS5kYXRhID09PSBkYXRhOyB9O1xuXHRcdH1cblx0fVxufTtcblxuZnVuY3Rpb24gZ2V0QXR0cmliQ2hlY2soYXR0cmliLCB2YWx1ZSl7XG5cdGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKXtcblx0XHRyZXR1cm4gZnVuY3Rpb24oZWxlbSl7IHJldHVybiBlbGVtLmF0dHJpYnMgJiYgdmFsdWUoZWxlbS5hdHRyaWJzW2F0dHJpYl0pOyB9O1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBmdW5jdGlvbihlbGVtKXsgcmV0dXJuIGVsZW0uYXR0cmlicyAmJiBlbGVtLmF0dHJpYnNbYXR0cmliXSA9PT0gdmFsdWU7IH07XG5cdH1cbn1cblxuZnVuY3Rpb24gY29tYmluZUZ1bmNzKGEsIGIpe1xuXHRyZXR1cm4gZnVuY3Rpb24oZWxlbSl7XG5cdFx0cmV0dXJuIGEoZWxlbSkgfHwgYihlbGVtKTtcblx0fTtcbn1cblxuZXhwb3J0cy5nZXRFbGVtZW50cyA9IGZ1bmN0aW9uKG9wdGlvbnMsIGVsZW1lbnQsIHJlY3Vyc2UsIGxpbWl0KXtcblx0dmFyIGZ1bmNzID0gT2JqZWN0LmtleXMob3B0aW9ucykubWFwKGZ1bmN0aW9uKGtleSl7XG5cdFx0dmFyIHZhbHVlID0gb3B0aW9uc1trZXldO1xuXHRcdHJldHVybiBrZXkgaW4gQ2hlY2tzID8gQ2hlY2tzW2tleV0odmFsdWUpIDogZ2V0QXR0cmliQ2hlY2soa2V5LCB2YWx1ZSk7XG5cdH0pO1xuXG5cdHJldHVybiBmdW5jcy5sZW5ndGggPT09IDAgPyBbXSA6IHRoaXMuZmlsdGVyKFxuXHRcdGZ1bmNzLnJlZHVjZShjb21iaW5lRnVuY3MpLFxuXHRcdGVsZW1lbnQsIHJlY3Vyc2UsIGxpbWl0XG5cdCk7XG59O1xuXG5leHBvcnRzLmdldEVsZW1lbnRCeUlkID0gZnVuY3Rpb24oaWQsIGVsZW1lbnQsIHJlY3Vyc2Upe1xuXHRpZighQXJyYXkuaXNBcnJheShlbGVtZW50KSkgZWxlbWVudCA9IFtlbGVtZW50XTtcblx0cmV0dXJuIHRoaXMuZmluZE9uZShnZXRBdHRyaWJDaGVjayhcImlkXCIsIGlkKSwgZWxlbWVudCwgcmVjdXJzZSAhPT0gZmFsc2UpO1xufTtcblxuZXhwb3J0cy5nZXRFbGVtZW50c0J5VGFnTmFtZSA9IGZ1bmN0aW9uKG5hbWUsIGVsZW1lbnQsIHJlY3Vyc2UsIGxpbWl0KXtcblx0cmV0dXJuIHRoaXMuZmlsdGVyKENoZWNrcy50YWdfbmFtZShuYW1lKSwgZWxlbWVudCwgcmVjdXJzZSwgbGltaXQpO1xufTtcblxuZXhwb3J0cy5nZXRFbGVtZW50c0J5VGFnVHlwZSA9IGZ1bmN0aW9uKHR5cGUsIGVsZW1lbnQsIHJlY3Vyc2UsIGxpbWl0KXtcblx0cmV0dXJuIHRoaXMuZmlsdGVyKENoZWNrcy50YWdfdHlwZSh0eXBlKSwgZWxlbWVudCwgcmVjdXJzZSwgbGltaXQpO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDM5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbi8vIHJlbW92ZVN1YnNldHNcbi8vIEdpdmVuIGFuIGFycmF5IG9mIG5vZGVzLCByZW1vdmUgYW55IG1lbWJlciB0aGF0IGlzIGNvbnRhaW5lZCBieSBhbm90aGVyLlxuZXhwb3J0cy5yZW1vdmVTdWJzZXRzID0gZnVuY3Rpb24obm9kZXMpIHtcblx0dmFyIGlkeCA9IG5vZGVzLmxlbmd0aCwgbm9kZSwgYW5jZXN0b3IsIHJlcGxhY2U7XG5cblx0Ly8gQ2hlY2sgaWYgZWFjaCBub2RlIChvciBvbmUgb2YgaXRzIGFuY2VzdG9ycykgaXMgYWxyZWFkeSBjb250YWluZWQgaW4gdGhlXG5cdC8vIGFycmF5LlxuXHR3aGlsZSAoLS1pZHggPiAtMSkge1xuXHRcdG5vZGUgPSBhbmNlc3RvciA9IG5vZGVzW2lkeF07XG5cblx0XHQvLyBUZW1wb3JhcmlseSByZW1vdmUgdGhlIG5vZGUgdW5kZXIgY29uc2lkZXJhdGlvblxuXHRcdG5vZGVzW2lkeF0gPSBudWxsO1xuXHRcdHJlcGxhY2UgPSB0cnVlO1xuXG5cdFx0d2hpbGUgKGFuY2VzdG9yKSB7XG5cdFx0XHRpZiAobm9kZXMuaW5kZXhPZihhbmNlc3RvcikgPiAtMSkge1xuXHRcdFx0XHRyZXBsYWNlID0gZmFsc2U7XG5cdFx0XHRcdG5vZGVzLnNwbGljZShpZHgsIDEpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50O1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZSBub2RlIGhhcyBiZWVuIGZvdW5kIHRvIGJlIHVuaXF1ZSwgcmUtaW5zZXJ0IGl0LlxuXHRcdGlmIChyZXBsYWNlKSB7XG5cdFx0XHRub2Rlc1tpZHhdID0gbm9kZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbm9kZXM7XG59O1xuXG4vLyBTb3VyY2U6IGh0dHA6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tbm9kZS1jb21wYXJlZG9jdW1lbnRwb3NpdGlvblxudmFyIFBPU0lUSU9OID0ge1xuXHRESVNDT05ORUNURUQ6IDEsXG5cdFBSRUNFRElORzogMixcblx0Rk9MTE9XSU5HOiA0LFxuXHRDT05UQUlOUzogOCxcblx0Q09OVEFJTkVEX0JZOiAxNlxufTtcblxuLy8gQ29tcGFyZSB0aGUgcG9zaXRpb24gb2Ygb25lIG5vZGUgYWdhaW5zdCBhbm90aGVyIG5vZGUgaW4gYW55IG90aGVyIGRvY3VtZW50LlxuLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBhIGJpdG1hc2sgd2l0aCB0aGUgZm9sbG93aW5nIHZhbHVlczpcbi8vXG4vLyBkb2N1bWVudCBvcmRlcjpcbi8vID4gVGhlcmUgaXMgYW4gb3JkZXJpbmcsIGRvY3VtZW50IG9yZGVyLCBkZWZpbmVkIG9uIGFsbCB0aGUgbm9kZXMgaW4gdGhlXG4vLyA+IGRvY3VtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlXG4vLyA+IFhNTCByZXByZXNlbnRhdGlvbiBvZiBlYWNoIG5vZGUgb2NjdXJzIGluIHRoZSBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhlXG4vLyA+IGRvY3VtZW50IGFmdGVyIGV4cGFuc2lvbiBvZiBnZW5lcmFsIGVudGl0aWVzLiBUaHVzLCB0aGUgZG9jdW1lbnQgZWxlbWVudFxuLy8gPiBub2RlIHdpbGwgYmUgdGhlIGZpcnN0IG5vZGUuIEVsZW1lbnQgbm9kZXMgb2NjdXIgYmVmb3JlIHRoZWlyIGNoaWxkcmVuLlxuLy8gPiBUaHVzLCBkb2N1bWVudCBvcmRlciBvcmRlcnMgZWxlbWVudCBub2RlcyBpbiBvcmRlciBvZiB0aGUgb2NjdXJyZW5jZSBvZlxuLy8gPiB0aGVpciBzdGFydC10YWcgaW4gdGhlIFhNTCAoYWZ0ZXIgZXhwYW5zaW9uIG9mIGVudGl0aWVzKS4gVGhlIGF0dHJpYnV0ZVxuLy8gPiBub2RlcyBvZiBhbiBlbGVtZW50IG9jY3VyIGFmdGVyIHRoZSBlbGVtZW50IGFuZCBiZWZvcmUgaXRzIGNoaWxkcmVuLiBUaGVcbi8vID4gcmVsYXRpdmUgb3JkZXIgb2YgYXR0cmlidXRlIG5vZGVzIGlzIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudC4vXG4vLyBTb3VyY2U6XG4vLyBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1Db3JlL2dsb3NzYXJ5Lmh0bWwjZHQtZG9jdW1lbnQtb3JkZXJcbi8vXG4vLyBAYXJndW1lbnQge05vZGV9IG5vZGFBIFRoZSBmaXJzdCBub2RlIHRvIHVzZSBpbiB0aGUgY29tcGFyaXNvblxuLy8gQGFyZ3VtZW50IHtOb2RlfSBub2RlQiBUaGUgc2Vjb25kIG5vZGUgdG8gdXNlIGluIHRoZSBjb21wYXJpc29uXG4vL1xuLy8gQHJldHVybiB7TnVtYmVyfSBBIGJpdG1hc2sgZGVzY3JpYmluZyB0aGUgaW5wdXQgbm9kZXMnIHJlbGF0aXZlIHBvc2l0aW9uLlxuLy8gICAgICAgICBTZWUgaHR0cDovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ub2RlLWNvbXBhcmVkb2N1bWVudHBvc2l0aW9uIGZvclxuLy8gICAgICAgICBhIGRlc2NyaXB0aW9uIG9mIHRoZXNlIHZhbHVlcy5cbnZhciBjb21wYXJlUG9zID0gZXhwb3J0cy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA9IGZ1bmN0aW9uKG5vZGVBLCBub2RlQikge1xuXHR2YXIgYVBhcmVudHMgPSBbXTtcblx0dmFyIGJQYXJlbnRzID0gW107XG5cdHZhciBjdXJyZW50LCBzaGFyZWRQYXJlbnQsIHNpYmxpbmdzLCBhU2libGluZywgYlNpYmxpbmcsIGlkeDtcblxuXHRpZiAobm9kZUEgPT09IG5vZGVCKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRjdXJyZW50ID0gbm9kZUE7XG5cdHdoaWxlIChjdXJyZW50KSB7XG5cdFx0YVBhcmVudHMudW5zaGlmdChjdXJyZW50KTtcblx0XHRjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG5cdH1cblx0Y3VycmVudCA9IG5vZGVCO1xuXHR3aGlsZSAoY3VycmVudCkge1xuXHRcdGJQYXJlbnRzLnVuc2hpZnQoY3VycmVudCk7XG5cdFx0Y3VycmVudCA9IGN1cnJlbnQucGFyZW50O1xuXHR9XG5cblx0aWR4ID0gMDtcblx0d2hpbGUgKGFQYXJlbnRzW2lkeF0gPT09IGJQYXJlbnRzW2lkeF0pIHtcblx0XHRpZHgrKztcblx0fVxuXG5cdGlmIChpZHggPT09IDApIHtcblx0XHRyZXR1cm4gUE9TSVRJT04uRElTQ09OTkVDVEVEO1xuXHR9XG5cblx0c2hhcmVkUGFyZW50ID0gYVBhcmVudHNbaWR4IC0gMV07XG5cdHNpYmxpbmdzID0gc2hhcmVkUGFyZW50LmNoaWxkcmVuO1xuXHRhU2libGluZyA9IGFQYXJlbnRzW2lkeF07XG5cdGJTaWJsaW5nID0gYlBhcmVudHNbaWR4XTtcblxuXHRpZiAoc2libGluZ3MuaW5kZXhPZihhU2libGluZykgPiBzaWJsaW5ncy5pbmRleE9mKGJTaWJsaW5nKSkge1xuXHRcdGlmIChzaGFyZWRQYXJlbnQgPT09IG5vZGVCKSB7XG5cdFx0XHRyZXR1cm4gUE9TSVRJT04uRk9MTE9XSU5HIHwgUE9TSVRJT04uQ09OVEFJTkVEX0JZO1xuXHRcdH1cblx0XHRyZXR1cm4gUE9TSVRJT04uRk9MTE9XSU5HO1xuXHR9IGVsc2Uge1xuXHRcdGlmIChzaGFyZWRQYXJlbnQgPT09IG5vZGVBKSB7XG5cdFx0XHRyZXR1cm4gUE9TSVRJT04uUFJFQ0VESU5HIHwgUE9TSVRJT04uQ09OVEFJTlM7XG5cdFx0fVxuXHRcdHJldHVybiBQT1NJVElPTi5QUkVDRURJTkc7XG5cdH1cbn07XG5cbi8vIFNvcnQgYW4gYXJyYXkgb2Ygbm9kZXMgYmFzZWQgb24gdGhlaXIgcmVsYXRpdmUgcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50IGFuZFxuLy8gcmVtb3ZlIGFueSBkdXBsaWNhdGUgbm9kZXMuIElmIHRoZSBhcnJheSBjb250YWlucyBub2RlcyB0aGF0IGRvIG5vdCBiZWxvbmdcbi8vIHRvIHRoZSBzYW1lIGRvY3VtZW50LCBzb3J0IG9yZGVyIGlzIHVuc3BlY2lmaWVkLlxuLy9cbi8vIEBhcmd1bWVudCB7QXJyYXl9IG5vZGVzIEFycmF5IG9mIERPTSBub2Rlc1xuLy9cbi8vIEByZXR1cm5zIHtBcnJheX0gY29sbGVjdGlvbiBvZiB1bmlxdWUgbm9kZXMsIHNvcnRlZCBpbiBkb2N1bWVudCBvcmRlclxuZXhwb3J0cy51bmlxdWVTb3J0ID0gZnVuY3Rpb24obm9kZXMpIHtcblx0dmFyIGlkeCA9IG5vZGVzLmxlbmd0aCwgbm9kZSwgcG9zaXRpb247XG5cblx0bm9kZXMgPSBub2Rlcy5zbGljZSgpO1xuXG5cdHdoaWxlICgtLWlkeCA+IC0xKSB7XG5cdFx0bm9kZSA9IG5vZGVzW2lkeF07XG5cdFx0cG9zaXRpb24gPSBub2Rlcy5pbmRleE9mKG5vZGUpO1xuXHRcdGlmIChwb3NpdGlvbiA+IC0xICYmIHBvc2l0aW9uIDwgaWR4KSB7XG5cdFx0XHRub2Rlcy5zcGxpY2UoaWR4LCAxKTtcblx0XHR9XG5cdH1cblx0bm9kZXMuc29ydChmdW5jdGlvbihhLCBiKSB7XG5cdFx0dmFyIHJlbGF0aXZlID0gY29tcGFyZVBvcyhhLCBiKTtcblx0XHRpZiAocmVsYXRpdmUgJiBQT1NJVElPTi5QUkVDRURJTkcpIHtcblx0XHRcdHJldHVybiAtMTtcblx0XHR9IGVsc2UgaWYgKHJlbGF0aXZlICYgUE9TSVRJT04uRk9MTE9XSU5HKSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cdFx0cmV0dXJuIDA7XG5cdH0pO1xuXG5cdHJldHVybiBub2Rlcztcbn07XG5cblxuLyoqKi8gfSksXG4vKiA0MCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG4vKlxuXHRjb21waWxlcyBhIHNlbGVjdG9yIHRvIGFuIGV4ZWN1dGFibGUgZnVuY3Rpb25cbiovXG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGlsZUZhY3Rvcnk7XG5cbnZhciBwYXJzZSAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDEpLFxuXHRCYXNlRnVuY3MgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNSksXG5cdHNvcnRSdWxlcyAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MiksXG5cdHByb2NlZHVyZSAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSksXG5cdHJ1bGVzRmFjdG9yeSAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MyksXG5cdHBzZXVkb3NGYWN0b3J5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NiksXG5cdHRydWVGdW5jICAgICAgID0gQmFzZUZ1bmNzLnRydWVGdW5jLFxuXHRmYWxzZUZ1bmMgICAgICA9IEJhc2VGdW5jcy5mYWxzZUZ1bmM7XG5cbmZ1bmN0aW9uIGNvbXBpbGVGYWN0b3J5KGFkYXB0ZXIpe1xuXHR2YXIgUHNldWRvcyAgICAgPSBwc2V1ZG9zRmFjdG9yeShhZGFwdGVyKSxcblx0XHRmaWx0ZXJzICAgICA9IFBzZXVkb3MuZmlsdGVycyxcblx0XHRSdWxlcyBcdFx0XHQ9IHJ1bGVzRmFjdG9yeShhZGFwdGVyLCBQc2V1ZG9zKTtcblxuXHRmdW5jdGlvbiBjb21waWxlKHNlbGVjdG9yLCBvcHRpb25zLCBjb250ZXh0KXtcblx0XHR2YXIgbmV4dCA9IGNvbXBpbGVVbnNhZmUoc2VsZWN0b3IsIG9wdGlvbnMsIGNvbnRleHQpO1xuXHRcdHJldHVybiB3cmFwKG5leHQpO1xuXHR9XG5cblx0ZnVuY3Rpb24gd3JhcChuZXh0KXtcblx0XHRyZXR1cm4gZnVuY3Rpb24gYmFzZShlbGVtKXtcblx0XHRcdHJldHVybiBhZGFwdGVyLmlzVGFnKGVsZW0pICYmIG5leHQoZWxlbSk7XG5cdFx0fTtcblx0fVxuXG5cdGZ1bmN0aW9uIGNvbXBpbGVVbnNhZmUoc2VsZWN0b3IsIG9wdGlvbnMsIGNvbnRleHQpe1xuXHRcdHZhciB0b2tlbiA9IHBhcnNlKHNlbGVjdG9yLCBvcHRpb25zKTtcblx0XHRyZXR1cm4gY29tcGlsZVRva2VuKHRva2VuLCBvcHRpb25zLCBjb250ZXh0KTtcblx0fVxuXG5cdGZ1bmN0aW9uIGluY2x1ZGVzU2NvcGVQc2V1ZG8odCl7XG5cdFx0cmV0dXJuIHQudHlwZSA9PT0gXCJwc2V1ZG9cIiAmJiAoXG5cdFx0XHR0Lm5hbWUgPT09IFwic2NvcGVcIiB8fCAoXG5cdFx0XHRcdEFycmF5LmlzQXJyYXkodC5kYXRhKSAmJlxuXHRcdFx0XHR0LmRhdGEuc29tZShmdW5jdGlvbihkYXRhKXtcblx0XHRcdFx0XHRyZXR1cm4gZGF0YS5zb21lKGluY2x1ZGVzU2NvcGVQc2V1ZG8pO1xuXHRcdFx0XHR9KVxuXHRcdFx0KVxuXHRcdCk7XG5cdH1cblxuXHR2YXIgREVTQ0VOREFOVF9UT0tFTiA9IHt0eXBlOiBcImRlc2NlbmRhbnRcIn0sXG5cdFx0RkxFWElCTEVfREVTQ0VOREFOVF9UT0tFTiA9IHt0eXBlOiBcIl9mbGV4aWJsZURlc2NlbmRhbnRcIn0sXG5cdFx0U0NPUEVfVE9LRU4gPSB7dHlwZTogXCJwc2V1ZG9cIiwgbmFtZTogXCJzY29wZVwifSxcblx0XHRQTEFDRUhPTERFUl9FTEVNRU5UID0ge307XG5cblx0Ly9DU1MgNCBTcGVjIChEcmFmdCk6IDMuMy4xLiBBYnNvbHV0aXppbmcgYSBTY29wZS1yZWxhdGl2ZSBTZWxlY3RvclxuXHQvL2h0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9yczQvI2Fic29sdXRpemluZ1xuXHRmdW5jdGlvbiBhYnNvbHV0aXplKHRva2VuLCBjb250ZXh0KXtcblx0XHQvL1RPRE8gYmV0dGVyIGNoZWNrIGlmIGNvbnRleHQgaXMgZG9jdW1lbnRcblx0XHR2YXIgaGFzQ29udGV4dCA9ICEhY29udGV4dCAmJiAhIWNvbnRleHQubGVuZ3RoICYmIGNvbnRleHQuZXZlcnkoZnVuY3Rpb24oZSl7XG5cdFx0XHRyZXR1cm4gZSA9PT0gUExBQ0VIT0xERVJfRUxFTUVOVCB8fCAhIWFkYXB0ZXIuZ2V0UGFyZW50KGUpO1xuXHRcdH0pO1xuXG5cblx0XHR0b2tlbi5mb3JFYWNoKGZ1bmN0aW9uKHQpe1xuXHRcdFx0aWYodC5sZW5ndGggPiAwICYmIGlzVHJhdmVyc2FsKHRbMF0pICYmIHRbMF0udHlwZSAhPT0gXCJkZXNjZW5kYW50XCIpe1xuXHRcdFx0XHQvL2Rvbid0IHJldHVybiBpbiBlbHNlIGJyYW5jaFxuXHRcdFx0fSBlbHNlIGlmKGhhc0NvbnRleHQgJiYgIWluY2x1ZGVzU2NvcGVQc2V1ZG8odCkpe1xuXHRcdFx0XHR0LnVuc2hpZnQoREVTQ0VOREFOVF9UT0tFTik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHQudW5zaGlmdChTQ09QRV9UT0tFTik7XG5cdFx0fSk7XG5cdH1cblxuXHRmdW5jdGlvbiBjb21waWxlVG9rZW4odG9rZW4sIG9wdGlvbnMsIGNvbnRleHQpe1xuXHRcdHRva2VuID0gdG9rZW4uZmlsdGVyKGZ1bmN0aW9uKHQpeyByZXR1cm4gdC5sZW5ndGggPiAwOyB9KTtcblxuXHRcdHRva2VuLmZvckVhY2goc29ydFJ1bGVzKTtcblxuXHRcdHZhciBpc0FycmF5Q29udGV4dCA9IEFycmF5LmlzQXJyYXkoY29udGV4dCk7XG5cblx0XHRjb250ZXh0ID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0KSB8fCBjb250ZXh0O1xuXG5cdFx0aWYoY29udGV4dCAmJiAhaXNBcnJheUNvbnRleHQpIGNvbnRleHQgPSBbY29udGV4dF07XG5cblx0XHRhYnNvbHV0aXplKHRva2VuLCBjb250ZXh0KTtcblxuXHRcdHZhciBzaG91bGRUZXN0TmV4dFNpYmxpbmdzID0gZmFsc2U7XG5cblx0XHR2YXIgcXVlcnkgPSB0b2tlblxuXHRcdFx0Lm1hcChmdW5jdGlvbihydWxlcyl7XG5cdFx0XHRcdGlmKHJ1bGVzWzBdICYmIHJ1bGVzWzFdICYmIHJ1bGVzWzBdLm5hbWUgPT09IFwic2NvcGVcIil7XG5cdFx0XHRcdFx0dmFyIHJ1bGVUeXBlID0gcnVsZXNbMV0udHlwZTtcblx0XHRcdFx0XHRpZihpc0FycmF5Q29udGV4dCAmJiBydWxlVHlwZSA9PT0gXCJkZXNjZW5kYW50XCIpIHJ1bGVzWzFdID0gRkxFWElCTEVfREVTQ0VOREFOVF9UT0tFTjtcblx0XHRcdFx0XHRlbHNlIGlmKHJ1bGVUeXBlID09PSBcImFkamFjZW50XCIgfHwgcnVsZVR5cGUgPT09IFwic2libGluZ1wiKSBzaG91bGRUZXN0TmV4dFNpYmxpbmdzID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gY29tcGlsZVJ1bGVzKHJ1bGVzLCBvcHRpb25zLCBjb250ZXh0KTtcblx0XHRcdH0pXG5cdFx0XHQucmVkdWNlKHJlZHVjZVJ1bGVzLCBmYWxzZUZ1bmMpO1xuXG5cdFx0cXVlcnkuc2hvdWxkVGVzdE5leHRTaWJsaW5ncyA9IHNob3VsZFRlc3ROZXh0U2libGluZ3M7XG5cblx0XHRyZXR1cm4gcXVlcnk7XG5cdH1cblxuXHRmdW5jdGlvbiBpc1RyYXZlcnNhbCh0KXtcblx0XHRyZXR1cm4gcHJvY2VkdXJlW3QudHlwZV0gPCAwO1xuXHR9XG5cblx0ZnVuY3Rpb24gY29tcGlsZVJ1bGVzKHJ1bGVzLCBvcHRpb25zLCBjb250ZXh0KXtcblx0XHRyZXR1cm4gcnVsZXMucmVkdWNlKGZ1bmN0aW9uKGZ1bmMsIHJ1bGUpe1xuXHRcdFx0aWYoZnVuYyA9PT0gZmFsc2VGdW5jKSByZXR1cm4gZnVuYztcblx0XHRcdHJldHVybiBSdWxlc1tydWxlLnR5cGVdKGZ1bmMsIHJ1bGUsIG9wdGlvbnMsIGNvbnRleHQpO1xuXHRcdH0sIG9wdGlvbnMgJiYgb3B0aW9ucy5yb290RnVuYyB8fCB0cnVlRnVuYyk7XG5cdH1cblxuXHRmdW5jdGlvbiByZWR1Y2VSdWxlcyhhLCBiKXtcblx0XHRpZihiID09PSBmYWxzZUZ1bmMgfHwgYSA9PT0gdHJ1ZUZ1bmMpe1xuXHRcdFx0cmV0dXJuIGE7XG5cdFx0fVxuXHRcdGlmKGEgPT09IGZhbHNlRnVuYyB8fCBiID09PSB0cnVlRnVuYyl7XG5cdFx0XHRyZXR1cm4gYjtcblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY29tYmluZShlbGVtKXtcblx0XHRcdHJldHVybiBhKGVsZW0pIHx8IGIoZWxlbSk7XG5cdFx0fTtcblx0fVxuXG5cdGZ1bmN0aW9uIGNvbnRhaW5zVHJhdmVyc2FsKHQpe1xuXHRcdHJldHVybiB0LnNvbWUoaXNUcmF2ZXJzYWwpO1xuXHR9XG5cblx0Ly86bm90LCA6aGFzIGFuZCA6bWF0Y2hlcyBoYXZlIHRvIGNvbXBpbGUgc2VsZWN0b3JzXG5cdC8vZG9pbmcgdGhpcyBpbiBsaWIvcHNldWRvcy5qcyB3b3VsZCBsZWFkIHRvIGNpcmN1bGFyIGRlcGVuZGVuY2llcyxcblx0Ly9zbyB3ZSBhZGQgdGhlbSBoZXJlXG5cdGZpbHRlcnMubm90ID0gZnVuY3Rpb24obmV4dCwgdG9rZW4sIG9wdGlvbnMsIGNvbnRleHQpe1xuXHRcdHZhciBvcHRzID0ge1xuXHRcdFx0eG1sTW9kZTogISEob3B0aW9ucyAmJiBvcHRpb25zLnhtbE1vZGUpLFxuXHRcdFx0c3RyaWN0OiAhIShvcHRpb25zICYmIG9wdGlvbnMuc3RyaWN0KVxuXHRcdH07XG5cblx0XHRpZihvcHRzLnN0cmljdCl7XG5cdFx0XHRpZih0b2tlbi5sZW5ndGggPiAxIHx8IHRva2VuLnNvbWUoY29udGFpbnNUcmF2ZXJzYWwpKXtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiY29tcGxleCBzZWxlY3RvcnMgaW4gOm5vdCBhcmVuJ3QgYWxsb3dlZCBpbiBzdHJpY3QgbW9kZVwiKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR2YXIgZnVuYyA9IGNvbXBpbGVUb2tlbih0b2tlbiwgb3B0cywgY29udGV4dCk7XG5cblx0XHRpZihmdW5jID09PSBmYWxzZUZ1bmMpIHJldHVybiBuZXh0O1xuXHRcdGlmKGZ1bmMgPT09IHRydWVGdW5jKSAgcmV0dXJuIGZhbHNlRnVuYztcblxuXHRcdHJldHVybiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHJldHVybiAhZnVuYyhlbGVtKSAmJiBuZXh0KGVsZW0pO1xuXHRcdH07XG5cdH07XG5cblx0ZmlsdGVycy5oYXMgPSBmdW5jdGlvbihuZXh0LCB0b2tlbiwgb3B0aW9ucyl7XG5cdFx0dmFyIG9wdHMgPSB7XG5cdFx0XHR4bWxNb2RlOiAhIShvcHRpb25zICYmIG9wdGlvbnMueG1sTW9kZSksXG5cdFx0XHRzdHJpY3Q6ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5zdHJpY3QpXG5cdFx0fTtcblxuXHRcdC8vRklYTUU6IFVzZXMgYW4gYXJyYXkgYXMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGVsZW1lbnQgKHNpZGUgZWZmZWN0cylcblx0XHR2YXIgY29udGV4dCA9IHRva2VuLnNvbWUoY29udGFpbnNUcmF2ZXJzYWwpID8gW1BMQUNFSE9MREVSX0VMRU1FTlRdIDogbnVsbDtcblxuXHRcdHZhciBmdW5jID0gY29tcGlsZVRva2VuKHRva2VuLCBvcHRzLCBjb250ZXh0KTtcblxuXHRcdGlmKGZ1bmMgPT09IGZhbHNlRnVuYykgcmV0dXJuIGZhbHNlRnVuYztcblx0XHRpZihmdW5jID09PSB0cnVlRnVuYyl7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRcdHJldHVybiBhZGFwdGVyLmdldENoaWxkcmVuKGVsZW0pLnNvbWUoYWRhcHRlci5pc1RhZykgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0ZnVuYyA9IHdyYXAoZnVuYyk7XG5cblx0XHRpZihjb250ZXh0KXtcblx0XHRcdHJldHVybiBmdW5jdGlvbiBoYXMoZWxlbSl7XG5cdFx0XHRcdHJldHVybiBuZXh0KGVsZW0pICYmIChcblx0XHRcdFx0XHQoY29udGV4dFswXSA9IGVsZW0pLCBhZGFwdGVyLmV4aXN0c09uZShmdW5jLCBhZGFwdGVyLmdldENoaWxkcmVuKGVsZW0pKVxuXHRcdFx0XHQpO1xuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaGFzKGVsZW0pe1xuXHRcdFx0cmV0dXJuIG5leHQoZWxlbSkgJiYgYWRhcHRlci5leGlzdHNPbmUoZnVuYywgYWRhcHRlci5nZXRDaGlsZHJlbihlbGVtKSk7XG5cdFx0fTtcblx0fTtcblxuXHRmaWx0ZXJzLm1hdGNoZXMgPSBmdW5jdGlvbihuZXh0LCB0b2tlbiwgb3B0aW9ucywgY29udGV4dCl7XG5cdFx0dmFyIG9wdHMgPSB7XG5cdFx0XHR4bWxNb2RlOiAhIShvcHRpb25zICYmIG9wdGlvbnMueG1sTW9kZSksXG5cdFx0XHRzdHJpY3Q6ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5zdHJpY3QpLFxuXHRcdFx0cm9vdEZ1bmM6IG5leHRcblx0XHR9O1xuXG5cdFx0cmV0dXJuIGNvbXBpbGVUb2tlbih0b2tlbiwgb3B0cywgY29udGV4dCk7XG5cdH07XG5cblx0Y29tcGlsZS5jb21waWxlVG9rZW4gPSBjb21waWxlVG9rZW47XG5cdGNvbXBpbGUuY29tcGlsZVVuc2FmZSA9IGNvbXBpbGVVbnNhZmU7XG5cdGNvbXBpbGUuUHNldWRvcyA9IFBzZXVkb3M7XG5cblx0cmV0dXJuIGNvbXBpbGU7XG59XG5cblxuLyoqKi8gfSksXG4vKiA0MSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlO1xuXG52YXIgcmVfbmFtZSA9IC9eKD86XFxcXC58W1xcd1xcLVxcdTAwYzAtXFx1RkZGRl0pKy8sXG4gICAgcmVfZXNjYXBlID0gL1xcXFwoW1xcZGEtZl17MSw2fVxccz98KFxccyl8LikvaWcsXG4gICAgLy9tb2RpZmllZCB2ZXJzaW9uIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL2Jsb2IvbWFzdGVyL3NyYy9zaXp6bGUuanMjTDg3XG4gICAgcmVfYXR0ciA9IC9eXFxzKigoPzpcXFxcLnxbXFx3XFx1MDBjMC1cXHVGRkZGXFwtXSkrKVxccyooPzooXFxTPyk9XFxzKig/OihbJ1wiXSkoLio/KVxcM3woIz8oPzpcXFxcLnxbXFx3XFx1MDBjMC1cXHVGRkZGXFwtXSkqKXwpfClcXHMqKGkpP1xcXS87XG5cbnZhciBhY3Rpb25UeXBlcyA9IHtcblx0X19wcm90b19fOiBudWxsLFxuXHRcInVuZGVmaW5lZFwiOiBcImV4aXN0c1wiLFxuXHRcIlwiOiAgXCJlcXVhbHNcIixcblx0XCJ+XCI6IFwiZWxlbWVudFwiLFxuXHRcIl5cIjogXCJzdGFydFwiLFxuXHRcIiRcIjogXCJlbmRcIixcblx0XCIqXCI6IFwiYW55XCIsXG5cdFwiIVwiOiBcIm5vdFwiLFxuXHRcInxcIjogXCJoeXBoZW5cIlxufTtcblxudmFyIHNpbXBsZVNlbGVjdG9ycyA9IHtcblx0X19wcm90b19fOiBudWxsLFxuXHRcIj5cIjogXCJjaGlsZFwiLFxuXHRcIjxcIjogXCJwYXJlbnRcIixcblx0XCJ+XCI6IFwic2libGluZ1wiLFxuXHRcIitcIjogXCJhZGphY2VudFwiXG59O1xuXG52YXIgYXR0cmliU2VsZWN0b3JzID0ge1xuXHRfX3Byb3RvX186IG51bGwsXG5cdFwiI1wiOiBbXCJpZFwiLCBcImVxdWFsc1wiXSxcblx0XCIuXCI6IFtcImNsYXNzXCIsIFwiZWxlbWVudFwiXVxufTtcblxuLy9wc2V1ZG9zLCB3aG9zZSBkYXRhLXByb3BlcnR5IGlzIHBhcnNlZCBhcyB3ZWxsXG52YXIgdW5wYWNrUHNldWRvcyA9IHtcblx0X19wcm90b19fOiBudWxsLFxuXHRcImhhc1wiOiB0cnVlLFxuXHRcIm5vdFwiOiB0cnVlLFxuXHRcIm1hdGNoZXNcIjogdHJ1ZVxufTtcblxudmFyIHN0cmlwUXVvdGVzRnJvbVBzZXVkb3MgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0XCJjb250YWluc1wiOiB0cnVlLFxuXHRcImljb250YWluc1wiOiB0cnVlXG59O1xuXG52YXIgcXVvdGVzID0ge1xuXHRfX3Byb3RvX186IG51bGwsXG5cdFwiXFxcIlwiOiB0cnVlLFxuXHRcIidcIjogdHJ1ZVxufTtcblxuLy91bmVzY2FwZSBmdW5jdGlvbiB0YWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL2Jsb2IvbWFzdGVyL3NyYy9zaXp6bGUuanMjTDEzOVxuZnVuY3Rpb24gZnVuZXNjYXBlKCBfLCBlc2NhcGVkLCBlc2NhcGVkV2hpdGVzcGFjZSApIHtcblx0dmFyIGhpZ2ggPSBcIjB4XCIgKyBlc2NhcGVkIC0gMHgxMDAwMDtcblx0Ly8gTmFOIG1lYW5zIG5vbi1jb2RlcG9pbnRcblx0Ly8gU3VwcG9ydDogRmlyZWZveFxuXHQvLyBXb3JrYXJvdW5kIGVycm9uZW91cyBudW1lcmljIGludGVycHJldGF0aW9uIG9mICtcIjB4XCJcblx0cmV0dXJuIGhpZ2ggIT09IGhpZ2ggfHwgZXNjYXBlZFdoaXRlc3BhY2UgP1xuXHRcdGVzY2FwZWQgOlxuXHRcdC8vIEJNUCBjb2RlcG9pbnRcblx0XHRoaWdoIDwgMCA/XG5cdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoICsgMHgxMDAwMCApIDpcblx0XHRcdC8vIFN1cHBsZW1lbnRhbCBQbGFuZSBjb2RlcG9pbnQgKHN1cnJvZ2F0ZSBwYWlyKVxuXHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7XG59XG5cbmZ1bmN0aW9uIHVuZXNjYXBlQ1NTKHN0cil7XG5cdHJldHVybiBzdHIucmVwbGFjZShyZV9lc2NhcGUsIGZ1bmVzY2FwZSk7XG59XG5cbmZ1bmN0aW9uIGlzV2hpdGVzcGFjZShjKXtcblx0cmV0dXJuIGMgPT09IFwiIFwiIHx8IGMgPT09IFwiXFxuXCIgfHwgYyA9PT0gXCJcXHRcIiB8fCBjID09PSBcIlxcZlwiIHx8IGMgPT09IFwiXFxyXCI7XG59XG5cbmZ1bmN0aW9uIHBhcnNlKHNlbGVjdG9yLCBvcHRpb25zKXtcblx0dmFyIHN1YnNlbGVjdHMgPSBbXTtcblxuXHRzZWxlY3RvciA9IHBhcnNlU2VsZWN0b3Ioc3Vic2VsZWN0cywgc2VsZWN0b3IgKyBcIlwiLCBvcHRpb25zKTtcblxuXHRpZihzZWxlY3RvciAhPT0gXCJcIil7XG5cdFx0dGhyb3cgbmV3IFN5bnRheEVycm9yKFwiVW5tYXRjaGVkIHNlbGVjdG9yOiBcIiArIHNlbGVjdG9yKTtcblx0fVxuXG5cdHJldHVybiBzdWJzZWxlY3RzO1xufVxuXG5mdW5jdGlvbiBwYXJzZVNlbGVjdG9yKHN1YnNlbGVjdHMsIHNlbGVjdG9yLCBvcHRpb25zKXtcblx0dmFyIHRva2VucyA9IFtdLFxuXHRcdHNhd1dTID0gZmFsc2UsXG5cdFx0ZGF0YSwgZmlyc3RDaGFyLCBuYW1lLCBxdW90O1xuXG5cdGZ1bmN0aW9uIGdldE5hbWUoKXtcblx0XHR2YXIgc3ViID0gc2VsZWN0b3IubWF0Y2gocmVfbmFtZSlbMF07XG5cdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHIoc3ViLmxlbmd0aCk7XG5cdFx0cmV0dXJuIHVuZXNjYXBlQ1NTKHN1Yik7XG5cdH1cblxuXHRmdW5jdGlvbiBzdHJpcFdoaXRlc3BhY2Uoc3RhcnQpe1xuXHRcdHdoaWxlKGlzV2hpdGVzcGFjZShzZWxlY3Rvci5jaGFyQXQoc3RhcnQpKSkgc3RhcnQrKztcblx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cihzdGFydCk7XG5cdH1cblxuXHRzdHJpcFdoaXRlc3BhY2UoMCk7XG5cblx0d2hpbGUoc2VsZWN0b3IgIT09IFwiXCIpe1xuXHRcdGZpcnN0Q2hhciA9IHNlbGVjdG9yLmNoYXJBdCgwKTtcblxuXHRcdGlmKGlzV2hpdGVzcGFjZShmaXJzdENoYXIpKXtcblx0XHRcdHNhd1dTID0gdHJ1ZTtcblx0XHRcdHN0cmlwV2hpdGVzcGFjZSgxKTtcblx0XHR9IGVsc2UgaWYoZmlyc3RDaGFyIGluIHNpbXBsZVNlbGVjdG9ycyl7XG5cdFx0XHR0b2tlbnMucHVzaCh7dHlwZTogc2ltcGxlU2VsZWN0b3JzW2ZpcnN0Q2hhcl19KTtcblx0XHRcdHNhd1dTID0gZmFsc2U7XG5cblx0XHRcdHN0cmlwV2hpdGVzcGFjZSgxKTtcblx0XHR9IGVsc2UgaWYoZmlyc3RDaGFyID09PSBcIixcIil7XG5cdFx0XHRpZih0b2tlbnMubGVuZ3RoID09PSAwKXtcblx0XHRcdFx0dGhyb3cgbmV3IFN5bnRheEVycm9yKFwiZW1wdHkgc3ViLXNlbGVjdG9yXCIpO1xuXHRcdFx0fVxuXHRcdFx0c3Vic2VsZWN0cy5wdXNoKHRva2Vucyk7XG5cdFx0XHR0b2tlbnMgPSBbXTtcblx0XHRcdHNhd1dTID0gZmFsc2U7XG5cdFx0XHRzdHJpcFdoaXRlc3BhY2UoMSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmKHNhd1dTKXtcblx0XHRcdFx0aWYodG9rZW5zLmxlbmd0aCA+IDApe1xuXHRcdFx0XHRcdHRva2Vucy5wdXNoKHt0eXBlOiBcImRlc2NlbmRhbnRcIn0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNhd1dTID0gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGlmKGZpcnN0Q2hhciA9PT0gXCIqXCIpe1xuXHRcdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cigxKTtcblx0XHRcdFx0dG9rZW5zLnB1c2goe3R5cGU6IFwidW5pdmVyc2FsXCJ9KTtcblx0XHRcdH0gZWxzZSBpZihmaXJzdENoYXIgaW4gYXR0cmliU2VsZWN0b3JzKXtcblx0XHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHIoMSk7XG5cdFx0XHRcdHRva2Vucy5wdXNoKHtcblx0XHRcdFx0XHR0eXBlOiBcImF0dHJpYnV0ZVwiLFxuXHRcdFx0XHRcdG5hbWU6IGF0dHJpYlNlbGVjdG9yc1tmaXJzdENoYXJdWzBdLFxuXHRcdFx0XHRcdGFjdGlvbjogYXR0cmliU2VsZWN0b3JzW2ZpcnN0Q2hhcl1bMV0sXG5cdFx0XHRcdFx0dmFsdWU6IGdldE5hbWUoKSxcblx0XHRcdFx0XHRpZ25vcmVDYXNlOiBmYWxzZVxuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSBpZihmaXJzdENoYXIgPT09IFwiW1wiKXtcblx0XHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHIoMSk7XG5cdFx0XHRcdGRhdGEgPSBzZWxlY3Rvci5tYXRjaChyZV9hdHRyKTtcblx0XHRcdFx0aWYoIWRhdGEpe1xuXHRcdFx0XHRcdHRocm93IG5ldyBTeW50YXhFcnJvcihcIk1hbGZvcm1lZCBhdHRyaWJ1dGUgc2VsZWN0b3I6IFwiICsgc2VsZWN0b3IpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKGRhdGFbMF0ubGVuZ3RoKTtcblx0XHRcdFx0bmFtZSA9IHVuZXNjYXBlQ1NTKGRhdGFbMV0pO1xuXG5cdFx0XHRcdGlmKFxuXHRcdFx0XHRcdCFvcHRpb25zIHx8IChcblx0XHRcdFx0XHRcdFwibG93ZXJDYXNlQXR0cmlidXRlTmFtZXNcIiBpbiBvcHRpb25zID9cblx0XHRcdFx0XHRcdFx0b3B0aW9ucy5sb3dlckNhc2VBdHRyaWJ1dGVOYW1lcyA6XG5cdFx0XHRcdFx0XHRcdCFvcHRpb25zLnhtbE1vZGVcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCl7XG5cdFx0XHRcdFx0bmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRva2Vucy5wdXNoKHtcblx0XHRcdFx0XHR0eXBlOiBcImF0dHJpYnV0ZVwiLFxuXHRcdFx0XHRcdG5hbWU6IG5hbWUsXG5cdFx0XHRcdFx0YWN0aW9uOiBhY3Rpb25UeXBlc1tkYXRhWzJdXSxcblx0XHRcdFx0XHR2YWx1ZTogdW5lc2NhcGVDU1MoZGF0YVs0XSB8fCBkYXRhWzVdIHx8IFwiXCIpLFxuXHRcdFx0XHRcdGlnbm9yZUNhc2U6ICEhZGF0YVs2XVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0fSBlbHNlIGlmKGZpcnN0Q2hhciA9PT0gXCI6XCIpe1xuXHRcdFx0XHRpZihzZWxlY3Rvci5jaGFyQXQoMSkgPT09IFwiOlwiKXtcblx0XHRcdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cigyKTtcblx0XHRcdFx0XHR0b2tlbnMucHVzaCh7dHlwZTogXCJwc2V1ZG8tZWxlbWVudFwiLCBuYW1lOiBnZXROYW1lKCkudG9Mb3dlckNhc2UoKX0pO1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHIoMSk7XG5cblx0XHRcdFx0bmFtZSA9IGdldE5hbWUoKS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRkYXRhID0gbnVsbDtcblxuXHRcdFx0XHRpZihzZWxlY3Rvci5jaGFyQXQoMCkgPT09IFwiKFwiKXtcblx0XHRcdFx0XHRpZihuYW1lIGluIHVucGFja1BzZXVkb3Mpe1xuXHRcdFx0XHRcdFx0cXVvdCA9IHNlbGVjdG9yLmNoYXJBdCgxKTtcblx0XHRcdFx0XHRcdHZhciBxdW90ZWQgPSBxdW90IGluIHF1b3RlcztcblxuXHRcdFx0XHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHIocXVvdGVkICsgMSk7XG5cblx0XHRcdFx0XHRcdGRhdGEgPSBbXTtcblx0XHRcdFx0XHRcdHNlbGVjdG9yID0gcGFyc2VTZWxlY3RvcihkYXRhLCBzZWxlY3Rvciwgb3B0aW9ucyk7XG5cblx0XHRcdFx0XHRcdGlmKHF1b3RlZCl7XG5cdFx0XHRcdFx0XHRcdGlmKHNlbGVjdG9yLmNoYXJBdCgwKSAhPT0gcXVvdCl7XG5cdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IFN5bnRheEVycm9yKFwidW5tYXRjaGVkIHF1b3RlcyBpbiA6XCIgKyBuYW1lKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cigxKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZihzZWxlY3Rvci5jaGFyQXQoMCkgIT09IFwiKVwiKXtcblx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IFN5bnRheEVycm9yKFwibWlzc2luZyBjbG9zaW5nIHBhcmVudGhlc2lzIGluIDpcIiArIG5hbWUgKyBcIiBcIiArIHNlbGVjdG9yKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHIoMSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHZhciBwb3MgPSAxLCBjb3VudGVyID0gMTtcblxuXHRcdFx0XHRcdFx0Zm9yKDsgY291bnRlciA+IDAgJiYgcG9zIDwgc2VsZWN0b3IubGVuZ3RoOyBwb3MrKyl7XG5cdFx0XHRcdFx0XHRcdGlmKHNlbGVjdG9yLmNoYXJBdChwb3MpID09PSBcIihcIikgY291bnRlcisrO1xuXHRcdFx0XHRcdFx0XHRlbHNlIGlmKHNlbGVjdG9yLmNoYXJBdChwb3MpID09PSBcIilcIikgY291bnRlci0tO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZihjb3VudGVyKXtcblx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IFN5bnRheEVycm9yKFwicGFyZW50aGVzaXMgbm90IG1hdGNoZWRcIik7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGRhdGEgPSBzZWxlY3Rvci5zdWJzdHIoMSwgcG9zIC0gMik7XG5cdFx0XHRcdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cihwb3MpO1xuXG5cdFx0XHRcdFx0XHRpZihuYW1lIGluIHN0cmlwUXVvdGVzRnJvbVBzZXVkb3Mpe1xuXHRcdFx0XHRcdFx0XHRxdW90ID0gZGF0YS5jaGFyQXQoMCk7XG5cblx0XHRcdFx0XHRcdFx0aWYocXVvdCA9PT0gZGF0YS5zbGljZSgtMSkgJiYgcXVvdCBpbiBxdW90ZXMpe1xuXHRcdFx0XHRcdFx0XHRcdGRhdGEgPSBkYXRhLnNsaWNlKDEsIC0xKTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGRhdGEgPSB1bmVzY2FwZUNTUyhkYXRhKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0b2tlbnMucHVzaCh7dHlwZTogXCJwc2V1ZG9cIiwgbmFtZTogbmFtZSwgZGF0YTogZGF0YX0pO1xuXHRcdFx0fSBlbHNlIGlmKHJlX25hbWUudGVzdChzZWxlY3Rvcikpe1xuXHRcdFx0XHRuYW1lID0gZ2V0TmFtZSgpO1xuXG5cdFx0XHRcdGlmKCFvcHRpb25zIHx8IChcImxvd2VyQ2FzZVRhZ3NcIiBpbiBvcHRpb25zID8gb3B0aW9ucy5sb3dlckNhc2VUYWdzIDogIW9wdGlvbnMueG1sTW9kZSkpe1xuXHRcdFx0XHRcdG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0b2tlbnMucHVzaCh7dHlwZTogXCJ0YWdcIiwgbmFtZTogbmFtZX0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdLnR5cGUgPT09IFwiZGVzY2VuZGFudFwiKXtcblx0XHRcdFx0XHR0b2tlbnMucG9wKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YWRkVG9rZW4oc3Vic2VsZWN0cywgdG9rZW5zKTtcblx0XHRcdFx0cmV0dXJuIHNlbGVjdG9yO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGFkZFRva2VuKHN1YnNlbGVjdHMsIHRva2Vucyk7XG5cblx0cmV0dXJuIHNlbGVjdG9yO1xufVxuXG5mdW5jdGlvbiBhZGRUb2tlbihzdWJzZWxlY3RzLCB0b2tlbnMpe1xuXHRpZihzdWJzZWxlY3RzLmxlbmd0aCA+IDAgJiYgdG9rZW5zLmxlbmd0aCA9PT0gMCl7XG5cdFx0dGhyb3cgbmV3IFN5bnRheEVycm9yKFwiZW1wdHkgc3ViLXNlbGVjdG9yXCIpO1xuXHR9XG5cblx0c3Vic2VsZWN0cy5wdXNoKHRva2Vucyk7XG59XG5cblxuLyoqKi8gfSksXG4vKiA0MiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNvcnRCeVByb2NlZHVyZTtcblxuLypcblx0c29ydCB0aGUgcGFydHMgb2YgdGhlIHBhc3NlZCBzZWxlY3Rvcixcblx0YXMgdGhlcmUgaXMgcG90ZW50aWFsIGZvciBvcHRpbWl6YXRpb25cblx0KHNvbWUgdHlwZXMgb2Ygc2VsZWN0b3JzIGFyZSBmYXN0ZXIgdGhhbiBvdGhlcnMpXG4qL1xuXG52YXIgcHJvY2VkdXJlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSk7XG5cbnZhciBhdHRyaWJ1dGVzID0ge1xuXHRfX3Byb3RvX186IG51bGwsXG5cdGV4aXN0czogMTAsXG5cdGVxdWFsczogOCxcblx0bm90OiA3LFxuXHRzdGFydDogNixcblx0ZW5kOiA2LFxuXHRhbnk6IDUsXG5cdGh5cGhlbjogNCxcblx0ZWxlbWVudDogNFxufTtcblxuZnVuY3Rpb24gc29ydEJ5UHJvY2VkdXJlKGFycil7XG5cdHZhciBwcm9jcyA9IGFyci5tYXAoZ2V0UHJvY2VkdXJlKTtcblx0Zm9yKHZhciBpID0gMTsgaSA8IGFyci5sZW5ndGg7IGkrKyl7XG5cdFx0dmFyIHByb2NOZXcgPSBwcm9jc1tpXTtcblxuXHRcdGlmKHByb2NOZXcgPCAwKSBjb250aW51ZTtcblxuXHRcdGZvcih2YXIgaiA9IGkgLSAxOyBqID49IDAgJiYgcHJvY05ldyA8IHByb2NzW2pdOyBqLS0pe1xuXHRcdFx0dmFyIHRva2VuID0gYXJyW2ogKyAxXTtcblx0XHRcdGFycltqICsgMV0gPSBhcnJbal07XG5cdFx0XHRhcnJbal0gPSB0b2tlbjtcblx0XHRcdHByb2NzW2ogKyAxXSA9IHByb2NzW2pdO1xuXHRcdFx0cHJvY3Nbal0gPSBwcm9jTmV3O1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBnZXRQcm9jZWR1cmUodG9rZW4pe1xuXHR2YXIgcHJvYyA9IHByb2NlZHVyZVt0b2tlbi50eXBlXTtcblxuXHRpZihwcm9jID09PSBwcm9jZWR1cmUuYXR0cmlidXRlKXtcblx0XHRwcm9jID0gYXR0cmlidXRlc1t0b2tlbi5hY3Rpb25dO1xuXG5cdFx0aWYocHJvYyA9PT0gYXR0cmlidXRlcy5lcXVhbHMgJiYgdG9rZW4ubmFtZSA9PT0gXCJpZFwiKXtcblx0XHRcdC8vcHJlZmVyIElEIHNlbGVjdG9ycyAoZWcuICNJRClcblx0XHRcdHByb2MgPSA5O1xuXHRcdH1cblxuXHRcdGlmKHRva2VuLmlnbm9yZUNhc2Upe1xuXHRcdFx0Ly9pZ25vcmVDYXNlIGFkZHMgc29tZSBvdmVyaGVhZCwgcHJlZmVyIFwibm9ybWFsXCIgdG9rZW5cblx0XHRcdC8vdGhpcyBpcyBhIGJpbmFyeSBvcGVyYXRpb24sIHRvIGVuc3VyZSBpdCdzIHN0aWxsIGFuIGludFxuXHRcdFx0cHJvYyA+Pj0gMTtcblx0XHR9XG5cdH0gZWxzZSBpZihwcm9jID09PSBwcm9jZWR1cmUucHNldWRvKXtcblx0XHRpZighdG9rZW4uZGF0YSl7XG5cdFx0XHRwcm9jID0gMztcblx0XHR9IGVsc2UgaWYodG9rZW4ubmFtZSA9PT0gXCJoYXNcIiB8fCB0b2tlbi5uYW1lID09PSBcImNvbnRhaW5zXCIpe1xuXHRcdFx0cHJvYyA9IDA7IC8vZXhwZW5zaXZlIGluIGFueSBjYXNlXG5cdFx0fSBlbHNlIGlmKHRva2VuLm5hbWUgPT09IFwibWF0Y2hlc1wiIHx8IHRva2VuLm5hbWUgPT09IFwibm90XCIpe1xuXHRcdFx0cHJvYyA9IDA7XG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgdG9rZW4uZGF0YS5sZW5ndGg7IGkrKyl7XG5cdFx0XHRcdC8vVE9ETyBiZXR0ZXIgaGFuZGxpbmcgb2YgY29tcGxleCBzZWxlY3RvcnNcblx0XHRcdFx0aWYodG9rZW4uZGF0YVtpXS5sZW5ndGggIT09IDEpIGNvbnRpbnVlO1xuXHRcdFx0XHR2YXIgY3VyID0gZ2V0UHJvY2VkdXJlKHRva2VuLmRhdGFbaV1bMF0pO1xuXHRcdFx0XHQvL2F2b2lkIGV4ZWN1dGluZyA6aGFzIG9yIDpjb250YWluc1xuXHRcdFx0XHRpZihjdXIgPT09IDApe1xuXHRcdFx0XHRcdHByb2MgPSAwO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKGN1ciA+IHByb2MpIHByb2MgPSBjdXI7XG5cdFx0XHR9XG5cdFx0XHRpZih0b2tlbi5kYXRhLmxlbmd0aCA+IDEgJiYgcHJvYyA+IDApIHByb2MgLT0gMTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvYyA9IDE7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBwcm9jO1xufVxuXG5cbi8qKiovIH0pLFxuLyogNDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIFNldCA9IF9fd2VicGFja19yZXF1aXJlX18oNDQpO1xudmFyIGF0dHJpYnV0ZUZhY3RvcnkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIzKTtcblxuZnVuY3Rpb24gZ2VuZXJhbEZhY3RvcnkoYWRhcHRlciwgUHNldWRvcyl7XG5cdC8qXG5cdFx0YWxsIGF2YWlsYWJsZSBydWxlc1xuXHQqL1xuXHRyZXR1cm4ge1xuXHRcdF9fcHJvdG9fXzogbnVsbCxcblxuXHRcdGF0dHJpYnV0ZTogYXR0cmlidXRlRmFjdG9yeShhZGFwdGVyKS5jb21waWxlLFxuXHRcdHBzZXVkbzogUHNldWRvcy5jb21waWxlLFxuXG5cdFx0Ly90YWdzXG5cdFx0dGFnOiBmdW5jdGlvbihuZXh0LCBkYXRhKXtcblx0XHRcdHZhciBuYW1lID0gZGF0YS5uYW1lO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIHRhZyhlbGVtKXtcblx0XHRcdFx0cmV0dXJuIGFkYXB0ZXIuZ2V0TmFtZShlbGVtKSA9PT0gbmFtZSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0Ly90cmF2ZXJzYWxcblx0XHRkZXNjZW5kYW50OiBmdW5jdGlvbihuZXh0KXtcblx0XHRcdHZhciBpc0ZhbHNlQ2FjaGUgPSBuZXcgU2V0KCk7XG5cblx0XHRcdHJldHVybiBmdW5jdGlvbiBkZXNjZW5kYW50KGVsZW0pe1xuXHRcdFx0XHR2YXIgZm91bmQgPSBmYWxzZTtcblxuXHRcdFx0XHR3aGlsZSghZm91bmQgJiYgKGVsZW0gPSBhZGFwdGVyLmdldFBhcmVudChlbGVtKSkpe1xuXHRcdFx0XHRcdGlmKCFpc0ZhbHNlQ2FjaGUuaGFzKGVsZW0pKXtcblx0XHRcdFx0XHRcdGZvdW5kID0gbmV4dChlbGVtKTtcblx0XHRcdFx0XHRcdGlmKCFmb3VuZCl7XG5cdFx0XHRcdFx0XHRcdGlzRmFsc2VDYWNoZS5hZGQoZWxlbSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGZvdW5kO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdF9mbGV4aWJsZURlc2NlbmRhbnQ6IGZ1bmN0aW9uKG5leHQpe1xuXHRcdFx0Ly8gSW5jbHVkZSBlbGVtZW50IGl0c2VsZiwgb25seSB1c2VkIHdoaWxlIHF1ZXJ5aW5nIGFuIGFycmF5XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gZGVzY2VuZGFudChlbGVtKXtcblxuXHRcdFx0XHR2YXIgZm91bmQgPSBuZXh0KGVsZW0pO1xuXG5cdFx0XHRcdHdoaWxlKCFmb3VuZCAmJiAoZWxlbSA9IGFkYXB0ZXIuZ2V0UGFyZW50KGVsZW0pKSl7XG5cdFx0XHRcdFx0Zm91bmQgPSBuZXh0KGVsZW0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGZvdW5kO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdHBhcmVudDogZnVuY3Rpb24obmV4dCwgZGF0YSwgb3B0aW9ucyl7XG5cdFx0XHRpZihvcHRpb25zICYmIG9wdGlvbnMuc3RyaWN0KSB0aHJvdyBuZXcgRXJyb3IoXCJQYXJlbnQgc2VsZWN0b3IgaXNuJ3QgcGFydCBvZiBDU1MzXCIpO1xuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gcGFyZW50KGVsZW0pe1xuXHRcdFx0XHRyZXR1cm4gYWRhcHRlci5nZXRDaGlsZHJlbihlbGVtKS5zb21lKHRlc3QpO1xuXHRcdFx0fTtcblxuXHRcdFx0ZnVuY3Rpb24gdGVzdChlbGVtKXtcblx0XHRcdFx0cmV0dXJuIGFkYXB0ZXIuaXNUYWcoZWxlbSkgJiYgbmV4dChlbGVtKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGNoaWxkOiBmdW5jdGlvbihuZXh0KXtcblx0XHRcdHJldHVybiBmdW5jdGlvbiBjaGlsZChlbGVtKXtcblx0XHRcdFx0dmFyIHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGVsZW0pO1xuXHRcdFx0XHRyZXR1cm4gISFwYXJlbnQgJiYgbmV4dChwYXJlbnQpO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdHNpYmxpbmc6IGZ1bmN0aW9uKG5leHQpe1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIHNpYmxpbmcoZWxlbSl7XG5cdFx0XHRcdHZhciBzaWJsaW5ncyA9IGFkYXB0ZXIuZ2V0U2libGluZ3MoZWxlbSk7XG5cblx0XHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IHNpYmxpbmdzLmxlbmd0aDsgaSsrKXtcblx0XHRcdFx0XHRpZihhZGFwdGVyLmlzVGFnKHNpYmxpbmdzW2ldKSl7XG5cdFx0XHRcdFx0XHRpZihzaWJsaW5nc1tpXSA9PT0gZWxlbSkgYnJlYWs7XG5cdFx0XHRcdFx0XHRpZihuZXh0KHNpYmxpbmdzW2ldKSkgcmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGFkamFjZW50OiBmdW5jdGlvbihuZXh0KXtcblx0XHRcdHJldHVybiBmdW5jdGlvbiBhZGphY2VudChlbGVtKXtcblx0XHRcdFx0dmFyIHNpYmxpbmdzID0gYWRhcHRlci5nZXRTaWJsaW5ncyhlbGVtKSxcblx0XHRcdFx0XHRsYXN0RWxlbWVudDtcblxuXHRcdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgc2libGluZ3MubGVuZ3RoOyBpKyspe1xuXHRcdFx0XHRcdGlmKGFkYXB0ZXIuaXNUYWcoc2libGluZ3NbaV0pKXtcblx0XHRcdFx0XHRcdGlmKHNpYmxpbmdzW2ldID09PSBlbGVtKSBicmVhaztcblx0XHRcdFx0XHRcdGxhc3RFbGVtZW50ID0gc2libGluZ3NbaV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuICEhbGFzdEVsZW1lbnQgJiYgbmV4dChsYXN0RWxlbWVudCk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0dW5pdmVyc2FsOiBmdW5jdGlvbihuZXh0KXtcblx0XHRcdHJldHVybiBuZXh0O1xuXHRcdH1cblx0fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZW5lcmFsRmFjdG9yeTtcblxuXG4vKioqLyB9KSxcbi8qIDQ0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NSkoKSA/IFNldCA6IF9fd2VicGFja19yZXF1aXJlX18oNDYpO1xuXG5cbi8qKiovIH0pLFxuLyogNDUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBzZXQsIGl0ZXJhdG9yLCByZXN1bHQ7XG5cdGlmICh0eXBlb2YgU2V0ICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG5cdHNldCA9IG5ldyBTZXQoWydyYXonLCAnZHdhJywgJ3RyenknXSk7XG5cdGlmIChTdHJpbmcoc2V0KSAhPT0gJ1tvYmplY3QgU2V0XScpIHJldHVybiBmYWxzZTtcblx0aWYgKHNldC5zaXplICE9PSAzKSByZXR1cm4gZmFsc2U7XG5cdGlmICh0eXBlb2Ygc2V0LmFkZCAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuXHRpZiAodHlwZW9mIHNldC5jbGVhciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuXHRpZiAodHlwZW9mIHNldC5kZWxldGUgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcblx0aWYgKHR5cGVvZiBzZXQuZW50cmllcyAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuXHRpZiAodHlwZW9mIHNldC5mb3JFYWNoICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG5cdGlmICh0eXBlb2Ygc2V0LmhhcyAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuXHRpZiAodHlwZW9mIHNldC5rZXlzICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG5cdGlmICh0eXBlb2Ygc2V0LnZhbHVlcyAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuXG5cdGl0ZXJhdG9yID0gc2V0LnZhbHVlcygpO1xuXHRyZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG5cdGlmIChyZXN1bHQuZG9uZSAhPT0gZmFsc2UpIHJldHVybiBmYWxzZTtcblx0aWYgKHJlc3VsdC52YWx1ZSAhPT0gJ3JheicpIHJldHVybiBmYWxzZTtcblxuXHRyZXR1cm4gdHJ1ZTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA0NiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgY2xlYXIgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KVxuICAsIGVJbmRleE9mICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NylcbiAgLCBzZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oNilcbiAgLCBjYWxsYWJsZSAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMSlcbiAgLCBkICAgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMylcbiAgLCBlZSAgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpXG4gICwgU3ltYm9sICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpXG4gICwgaXRlcmF0b3IgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKVxuICAsIGZvck9mICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MSlcbiAgLCBJdGVyYXRvciAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oODQpXG4gICwgaXNOYXRpdmUgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg1KVxuXG4gICwgY2FsbCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsXG4gICwgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHksIGdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mXG4gICwgU2V0UG9seSwgZ2V0VmFsdWVzLCBOYXRpdmVTZXQ7XG5cbmlmIChpc05hdGl2ZSkgTmF0aXZlU2V0ID0gU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNldFBvbHkgPSBmdW5jdGlvbiBTZXQoLyppdGVyYWJsZSovKSB7XG5cdHZhciBpdGVyYWJsZSA9IGFyZ3VtZW50c1swXSwgc2VsZjtcblx0aWYgKCEodGhpcyBpbnN0YW5jZW9mIFNldFBvbHkpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb25zdHJ1Y3RvciByZXF1aXJlcyBcXCduZXdcXCcnKTtcblx0aWYgKGlzTmF0aXZlICYmIHNldFByb3RvdHlwZU9mKSBzZWxmID0gc2V0UHJvdG90eXBlT2YobmV3IE5hdGl2ZVNldCgpLCBnZXRQcm90b3R5cGVPZih0aGlzKSk7XG5cdGVsc2Ugc2VsZiA9IHRoaXM7XG5cdGlmIChpdGVyYWJsZSAhPSBudWxsKSBpdGVyYXRvcihpdGVyYWJsZSk7XG5cdGRlZmluZVByb3BlcnR5KHNlbGYsICdfX3NldERhdGFfXycsIGQoJ2MnLCBbXSkpO1xuXHRpZiAoIWl0ZXJhYmxlKSByZXR1cm4gc2VsZjtcblx0Zm9yT2YoaXRlcmFibGUsIGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRcdGlmIChlSW5kZXhPZi5jYWxsKHRoaXMsIHZhbHVlKSAhPT0gLTEpIHJldHVybjtcblx0XHR0aGlzLnB1c2godmFsdWUpO1xuXHR9LCBzZWxmLl9fc2V0RGF0YV9fKTtcblx0cmV0dXJuIHNlbGY7XG59O1xuXG5pZiAoaXNOYXRpdmUpIHtcblx0aWYgKHNldFByb3RvdHlwZU9mKSBzZXRQcm90b3R5cGVPZihTZXRQb2x5LCBOYXRpdmVTZXQpO1xuXHRTZXRQb2x5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTmF0aXZlU2V0LnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogZChTZXRQb2x5KSB9KTtcbn1cblxuZWUoT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoU2V0UG9seS5wcm90b3R5cGUsIHtcblx0YWRkOiBkKGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRcdGlmICh0aGlzLmhhcyh2YWx1ZSkpIHJldHVybiB0aGlzO1xuXHRcdHRoaXMuZW1pdCgnX2FkZCcsIHRoaXMuX19zZXREYXRhX18ucHVzaCh2YWx1ZSkgLSAxLCB2YWx1ZSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0pLFxuXHRjbGVhcjogZChmdW5jdGlvbiAoKSB7XG5cdFx0aWYgKCF0aGlzLl9fc2V0RGF0YV9fLmxlbmd0aCkgcmV0dXJuO1xuXHRcdGNsZWFyLmNhbGwodGhpcy5fX3NldERhdGFfXyk7XG5cdFx0dGhpcy5lbWl0KCdfY2xlYXInKTtcblx0fSksXG5cdGRlbGV0ZTogZChmdW5jdGlvbiAodmFsdWUpIHtcblx0XHR2YXIgaW5kZXggPSBlSW5kZXhPZi5jYWxsKHRoaXMuX19zZXREYXRhX18sIHZhbHVlKTtcblx0XHRpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gZmFsc2U7XG5cdFx0dGhpcy5fX3NldERhdGFfXy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdHRoaXMuZW1pdCgnX2RlbGV0ZScsIGluZGV4LCB2YWx1ZSk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0pLFxuXHRlbnRyaWVzOiBkKGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCAna2V5K3ZhbHVlJyk7IH0pLFxuXHRmb3JFYWNoOiBkKGZ1bmN0aW9uIChjYi8qLCB0aGlzQXJnKi8pIHtcblx0XHR2YXIgdGhpc0FyZyA9IGFyZ3VtZW50c1sxXSwgaXRlcmF0b3IsIHJlc3VsdCwgdmFsdWU7XG5cdFx0Y2FsbGFibGUoY2IpO1xuXHRcdGl0ZXJhdG9yID0gdGhpcy52YWx1ZXMoKTtcblx0XHRyZXN1bHQgPSBpdGVyYXRvci5fbmV4dCgpO1xuXHRcdHdoaWxlIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dmFsdWUgPSBpdGVyYXRvci5fcmVzb2x2ZShyZXN1bHQpO1xuXHRcdFx0Y2FsbC5jYWxsKGNiLCB0aGlzQXJnLCB2YWx1ZSwgdmFsdWUsIHRoaXMpO1xuXHRcdFx0cmVzdWx0ID0gaXRlcmF0b3IuX25leHQoKTtcblx0XHR9XG5cdH0pLFxuXHRoYXM6IGQoZnVuY3Rpb24gKHZhbHVlKSB7XG5cdFx0cmV0dXJuIChlSW5kZXhPZi5jYWxsKHRoaXMuX19zZXREYXRhX18sIHZhbHVlKSAhPT0gLTEpO1xuXHR9KSxcblx0a2V5czogZChnZXRWYWx1ZXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnZhbHVlcygpOyB9KSxcblx0c2l6ZTogZC5ncyhmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9fc2V0RGF0YV9fLmxlbmd0aDsgfSksXG5cdHZhbHVlczogZChmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgSXRlcmF0b3IodGhpcyk7IH0pLFxuXHR0b1N0cmluZzogZChmdW5jdGlvbiAoKSB7IHJldHVybiAnW29iamVjdCBTZXRdJzsgfSlcbn0pKTtcbmRlZmluZVByb3BlcnR5KFNldFBvbHkucHJvdG90eXBlLCBTeW1ib2wuaXRlcmF0b3IsIGQoZ2V0VmFsdWVzKSk7XG5kZWZpbmVQcm9wZXJ0eShTZXRQb2x5LnByb3RvdHlwZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCBkKCdjJywgJ1NldCcpKTtcblxuXG4vKioqLyB9KSxcbi8qIDQ3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBudW1iZXJJc05hTiAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDgpXG4gICwgdG9Qb3NJbnQgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4KVxuICAsIHZhbHVlICAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKVxuICAsIGluZGV4T2YgICAgICAgICAgID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2ZcbiAgLCBvYmpIYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcbiAgLCBhYnMgICAgICAgICAgICAgICA9IE1hdGguYWJzXG4gICwgZmxvb3IgICAgICAgICAgICAgPSBNYXRoLmZsb29yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzZWFyY2hFbGVtZW50IC8qLCBmcm9tSW5kZXgqLykge1xuXHR2YXIgaSwgbGVuZ3RoLCBmcm9tSW5kZXgsIHZhbDtcblx0aWYgKCFudW1iZXJJc05hTihzZWFyY2hFbGVtZW50KSkgcmV0dXJuIGluZGV4T2YuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuXHRsZW5ndGggPSB0b1Bvc0ludCh2YWx1ZSh0aGlzKS5sZW5ndGgpO1xuXHRmcm9tSW5kZXggPSBhcmd1bWVudHNbMV07XG5cdGlmIChpc05hTihmcm9tSW5kZXgpKSBmcm9tSW5kZXggPSAwO1xuXHRlbHNlIGlmIChmcm9tSW5kZXggPj0gMCkgZnJvbUluZGV4ID0gZmxvb3IoZnJvbUluZGV4KTtcblx0ZWxzZSBmcm9tSW5kZXggPSB0b1Bvc0ludCh0aGlzLmxlbmd0aCkgLSBmbG9vcihhYnMoZnJvbUluZGV4KSk7XG5cblx0Zm9yIChpID0gZnJvbUluZGV4OyBpIDwgbGVuZ3RoOyArK2kpIHtcblx0XHRpZiAob2JqSGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLCBpKSkge1xuXHRcdFx0dmFsID0gdGhpc1tpXTtcblx0XHRcdGlmIChudW1iZXJJc05hTih2YWwpKSByZXR1cm4gaTsgLy8gSnNsaW50OiBpZ25vcmVcblx0XHR9XG5cdH1cblx0cmV0dXJuIC0xO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDQ4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OSkoKVxuXHQ/IE51bWJlci5pc05hTlxuXHQ6IF9fd2VicGFja19yZXF1aXJlX18oNTApO1xuXG5cbi8qKiovIH0pLFxuLyogNDkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBudW1iZXJJc05hTiA9IE51bWJlci5pc05hTjtcblx0aWYgKHR5cGVvZiBudW1iZXJJc05hTiAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiAhbnVtYmVySXNOYU4oe30pICYmIG51bWJlcklzTmFOKE5hTikgJiYgIW51bWJlcklzTmFOKDM0KTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA1MCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG5cdHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNTEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIHNpZ24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUyKVxuXG4gICwgYWJzID0gTWF0aC5hYnMsIGZsb29yID0gTWF0aC5mbG9vcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0aWYgKGlzTmFOKHZhbHVlKSkgcmV0dXJuIDA7XG5cdHZhbHVlID0gTnVtYmVyKHZhbHVlKTtcblx0aWYgKCh2YWx1ZSA9PT0gMCkgfHwgIWlzRmluaXRlKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuXHRyZXR1cm4gc2lnbih2YWx1ZSkgKiBmbG9vcihhYnModmFsdWUpKTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA1MiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNTMpKClcblx0PyBNYXRoLnNpZ25cblx0OiBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0KTtcblxuXG4vKioqLyB9KSxcbi8qIDUzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgc2lnbiA9IE1hdGguc2lnbjtcblx0aWYgKHR5cGVvZiBzaWduICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIChzaWduKDEwKSA9PT0gMSkgJiYgKHNpZ24oLTIwKSA9PT0gLTEpO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDU0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdHZhbHVlID0gTnVtYmVyKHZhbHVlKTtcblx0aWYgKGlzTmFOKHZhbHVlKSB8fCAodmFsdWUgPT09IDApKSByZXR1cm4gdmFsdWU7XG5cdHJldHVybiB2YWx1ZSA+IDAgPyAxIDogLTE7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNTUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGlzVmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXG52YXIgbWFwID0geyBmdW5jdGlvbjogdHJ1ZSwgb2JqZWN0OiB0cnVlIH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdHJldHVybiAoaXNWYWx1ZSh2YWx1ZSkgJiYgbWFwW3R5cGVvZiB2YWx1ZV0pIHx8IGZhbHNlO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDU2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLy8gV29ya2Fyb3VuZCBmb3IgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MjgwNFxuXG5cblxudmFyIGNyZWF0ZSA9IE9iamVjdC5jcmVhdGUsIHNoaW07XG5cbmlmICghX193ZWJwYWNrX3JlcXVpcmVfXygxOSkoKSkge1xuXHRzaGltID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uICgpIHtcblx0dmFyIG51bGxPYmplY3QsIHBvbHlQcm9wcywgZGVzYztcblx0aWYgKCFzaGltKSByZXR1cm4gY3JlYXRlO1xuXHRpZiAoc2hpbS5sZXZlbCAhPT0gMSkgcmV0dXJuIGNyZWF0ZTtcblxuXHRudWxsT2JqZWN0ID0ge307XG5cdHBvbHlQcm9wcyA9IHt9O1xuXHRkZXNjID0ge1xuXHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG5cdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0d3JpdGFibGU6IHRydWUsXG5cdFx0dmFsdWU6IHVuZGVmaW5lZFxuXHR9O1xuXHRPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPYmplY3QucHJvdG90eXBlKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG5cdFx0aWYgKG5hbWUgPT09IFwiX19wcm90b19fXCIpIHtcblx0XHRcdHBvbHlQcm9wc1tuYW1lXSA9IHtcblx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHRcdFx0d3JpdGFibGU6IHRydWUsXG5cdFx0XHRcdHZhbHVlOiB1bmRlZmluZWRcblx0XHRcdH07XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHBvbHlQcm9wc1tuYW1lXSA9IGRlc2M7XG5cdH0pO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyhudWxsT2JqZWN0LCBwb2x5UHJvcHMpO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzaGltLCBcIm51bGxQb2x5ZmlsbFwiLCB7XG5cdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcblx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR3cml0YWJsZTogZmFsc2UsXG5cdFx0dmFsdWU6IG51bGxPYmplY3Rcblx0fSk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIChwcm90b3R5cGUsIHByb3BzKSB7XG5cdFx0cmV0dXJuIGNyZWF0ZShwcm90b3R5cGUgPT09IG51bGwgPyBudWxsT2JqZWN0IDogcHJvdG90eXBlLCBwcm9wcyk7XG5cdH07XG59KCkpO1xuXG5cbi8qKiovIH0pLFxuLyogNTcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBhc3NpZ24gPSBPYmplY3QuYXNzaWduLCBvYmo7XG5cdGlmICh0eXBlb2YgYXNzaWduICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBmYWxzZTtcblx0b2JqID0geyBmb286IFwicmF6XCIgfTtcblx0YXNzaWduKG9iaiwgeyBiYXI6IFwiZHdhXCIgfSwgeyB0cnp5OiBcInRyenlcIiB9KTtcblx0cmV0dXJuIChvYmouZm9vICsgb2JqLmJhciArIG9iai50cnp5KSA9PT0gXCJyYXpkd2F0cnp5XCI7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNTggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGtleXMgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1OSlcbiAgLCB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18oMClcbiAgLCBtYXggICA9IE1hdGgubWF4O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChkZXN0LCBzcmMgLyosIOKApnNyY24qLykge1xuXHR2YXIgZXJyb3IsIGksIGxlbmd0aCA9IG1heChhcmd1bWVudHMubGVuZ3RoLCAyKSwgYXNzaWduO1xuXHRkZXN0ID0gT2JqZWN0KHZhbHVlKGRlc3QpKTtcblx0YXNzaWduID0gZnVuY3Rpb24gKGtleSkge1xuXHRcdHRyeSB7XG5cdFx0XHRkZXN0W2tleV0gPSBzcmNba2V5XTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRpZiAoIWVycm9yKSBlcnJvciA9IGU7XG5cdFx0fVxuXHR9O1xuXHRmb3IgKGkgPSAxOyBpIDwgbGVuZ3RoOyArK2kpIHtcblx0XHRzcmMgPSBhcmd1bWVudHNbaV07XG5cdFx0a2V5cyhzcmMpLmZvckVhY2goYXNzaWduKTtcblx0fVxuXHRpZiAoZXJyb3IgIT09IHVuZGVmaW5lZCkgdGhyb3cgZXJyb3I7XG5cdHJldHVybiBkZXN0O1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDU5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MCkoKVxuXHQ/IE9iamVjdC5rZXlzXG5cdDogX193ZWJwYWNrX3JlcXVpcmVfXyg2MSk7XG5cblxuLyoqKi8gfSksXG4vKiA2MCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblx0dHJ5IHtcblx0XHRPYmplY3Qua2V5cyhcInByaW1pdGl2ZVwiKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZSkge1xuIHJldHVybiBmYWxzZTtcbn1cbn07XG5cblxuLyoqKi8gfSksXG4vKiA2MSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgaXNWYWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5cbnZhciBrZXlzID0gT2JqZWN0LmtleXM7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCkge1xuXHRyZXR1cm4ga2V5cyhpc1ZhbHVlKG9iamVjdCkgPyBPYmplY3Qob2JqZWN0KSA6IG9iamVjdCk7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNjIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vLyBEZXByZWNhdGVkXG5cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmopIHtcbiByZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDYzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBzdHIgPSBcInJhemR3YXRyenlcIjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG5cdGlmICh0eXBlb2Ygc3RyLmNvbnRhaW5zICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIChzdHIuY29udGFpbnMoXCJkd2FcIikgPT09IHRydWUpICYmIChzdHIuY29udGFpbnMoXCJmb29cIikgPT09IGZhbHNlKTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA2NCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgaW5kZXhPZiA9IFN0cmluZy5wcm90b3R5cGUuaW5kZXhPZjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2VhcmNoU3RyaW5nLyosIHBvc2l0aW9uKi8pIHtcblx0cmV0dXJuIGluZGV4T2YuY2FsbCh0aGlzLCBzZWFyY2hTdHJpbmcsIGFyZ3VtZW50c1sxXSkgPiAtMTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA2NSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgZCAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpXG4gICwgY2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpXG5cbiAgLCBhcHBseSA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseSwgY2FsbCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsXG4gICwgY3JlYXRlID0gT2JqZWN0LmNyZWF0ZSwgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHlcbiAgLCBkZWZpbmVQcm9wZXJ0aWVzID0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXNcbiAgLCBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcbiAgLCBkZXNjcmlwdG9yID0geyBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSB9XG5cbiAgLCBvbiwgb25jZSwgb2ZmLCBlbWl0LCBtZXRob2RzLCBkZXNjcmlwdG9ycywgYmFzZTtcblxub24gPSBmdW5jdGlvbiAodHlwZSwgbGlzdGVuZXIpIHtcblx0dmFyIGRhdGE7XG5cblx0Y2FsbGFibGUobGlzdGVuZXIpO1xuXG5cdGlmICghaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLCAnX19lZV9fJykpIHtcblx0XHRkYXRhID0gZGVzY3JpcHRvci52YWx1ZSA9IGNyZWF0ZShudWxsKTtcblx0XHRkZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX19lZV9fJywgZGVzY3JpcHRvcik7XG5cdFx0ZGVzY3JpcHRvci52YWx1ZSA9IG51bGw7XG5cdH0gZWxzZSB7XG5cdFx0ZGF0YSA9IHRoaXMuX19lZV9fO1xuXHR9XG5cdGlmICghZGF0YVt0eXBlXSkgZGF0YVt0eXBlXSA9IGxpc3RlbmVyO1xuXHRlbHNlIGlmICh0eXBlb2YgZGF0YVt0eXBlXSA9PT0gJ29iamVjdCcpIGRhdGFbdHlwZV0ucHVzaChsaXN0ZW5lcik7XG5cdGVsc2UgZGF0YVt0eXBlXSA9IFtkYXRhW3R5cGVdLCBsaXN0ZW5lcl07XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5vbmNlID0gZnVuY3Rpb24gKHR5cGUsIGxpc3RlbmVyKSB7XG5cdHZhciBvbmNlLCBzZWxmO1xuXG5cdGNhbGxhYmxlKGxpc3RlbmVyKTtcblx0c2VsZiA9IHRoaXM7XG5cdG9uLmNhbGwodGhpcywgdHlwZSwgb25jZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRvZmYuY2FsbChzZWxmLCB0eXBlLCBvbmNlKTtcblx0XHRhcHBseS5jYWxsKGxpc3RlbmVyLCB0aGlzLCBhcmd1bWVudHMpO1xuXHR9KTtcblxuXHRvbmNlLl9fZWVPbmNlTGlzdGVuZXJfXyA9IGxpc3RlbmVyO1xuXHRyZXR1cm4gdGhpcztcbn07XG5cbm9mZiA9IGZ1bmN0aW9uICh0eXBlLCBsaXN0ZW5lcikge1xuXHR2YXIgZGF0YSwgbGlzdGVuZXJzLCBjYW5kaWRhdGUsIGk7XG5cblx0Y2FsbGFibGUobGlzdGVuZXIpO1xuXG5cdGlmICghaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLCAnX19lZV9fJykpIHJldHVybiB0aGlzO1xuXHRkYXRhID0gdGhpcy5fX2VlX187XG5cdGlmICghZGF0YVt0eXBlXSkgcmV0dXJuIHRoaXM7XG5cdGxpc3RlbmVycyA9IGRhdGFbdHlwZV07XG5cblx0aWYgKHR5cGVvZiBsaXN0ZW5lcnMgPT09ICdvYmplY3QnKSB7XG5cdFx0Zm9yIChpID0gMDsgKGNhbmRpZGF0ZSA9IGxpc3RlbmVyc1tpXSk7ICsraSkge1xuXHRcdFx0aWYgKChjYW5kaWRhdGUgPT09IGxpc3RlbmVyKSB8fFxuXHRcdFx0XHRcdChjYW5kaWRhdGUuX19lZU9uY2VMaXN0ZW5lcl9fID09PSBsaXN0ZW5lcikpIHtcblx0XHRcdFx0aWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDIpIGRhdGFbdHlwZV0gPSBsaXN0ZW5lcnNbaSA/IDAgOiAxXTtcblx0XHRcdFx0ZWxzZSBsaXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRpZiAoKGxpc3RlbmVycyA9PT0gbGlzdGVuZXIpIHx8XG5cdFx0XHRcdChsaXN0ZW5lcnMuX19lZU9uY2VMaXN0ZW5lcl9fID09PSBsaXN0ZW5lcikpIHtcblx0XHRcdGRlbGV0ZSBkYXRhW3R5cGVdO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0aGlzO1xufTtcblxuZW1pdCA9IGZ1bmN0aW9uICh0eXBlKSB7XG5cdHZhciBpLCBsLCBsaXN0ZW5lciwgbGlzdGVuZXJzLCBhcmdzO1xuXG5cdGlmICghaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLCAnX19lZV9fJykpIHJldHVybjtcblx0bGlzdGVuZXJzID0gdGhpcy5fX2VlX19bdHlwZV07XG5cdGlmICghbGlzdGVuZXJzKSByZXR1cm47XG5cblx0aWYgKHR5cGVvZiBsaXN0ZW5lcnMgPT09ICdvYmplY3QnKSB7XG5cdFx0bCA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cdFx0YXJncyA9IG5ldyBBcnJheShsIC0gMSk7XG5cdFx0Zm9yIChpID0gMTsgaSA8IGw7ICsraSkgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG5cblx0XHRsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuc2xpY2UoKTtcblx0XHRmb3IgKGkgPSAwOyAobGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV0pOyArK2kpIHtcblx0XHRcdGFwcGx5LmNhbGwobGlzdGVuZXIsIHRoaXMsIGFyZ3MpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRjYXNlIDE6XG5cdFx0XHRjYWxsLmNhbGwobGlzdGVuZXJzLCB0aGlzKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgMjpcblx0XHRcdGNhbGwuY2FsbChsaXN0ZW5lcnMsIHRoaXMsIGFyZ3VtZW50c1sxXSk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIDM6XG5cdFx0XHRjYWxsLmNhbGwobGlzdGVuZXJzLCB0aGlzLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSk7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0bCA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cdFx0XHRhcmdzID0gbmV3IEFycmF5KGwgLSAxKTtcblx0XHRcdGZvciAoaSA9IDE7IGkgPCBsOyArK2kpIHtcblx0XHRcdFx0YXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG5cdFx0XHR9XG5cdFx0XHRhcHBseS5jYWxsKGxpc3RlbmVycywgdGhpcywgYXJncyk7XG5cdFx0fVxuXHR9XG59O1xuXG5tZXRob2RzID0ge1xuXHRvbjogb24sXG5cdG9uY2U6IG9uY2UsXG5cdG9mZjogb2ZmLFxuXHRlbWl0OiBlbWl0XG59O1xuXG5kZXNjcmlwdG9ycyA9IHtcblx0b246IGQob24pLFxuXHRvbmNlOiBkKG9uY2UpLFxuXHRvZmY6IGQob2ZmKSxcblx0ZW1pdDogZChlbWl0KVxufTtcblxuYmFzZSA9IGRlZmluZVByb3BlcnRpZXMoe30sIGRlc2NyaXB0b3JzKTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZnVuY3Rpb24gKG8pIHtcblx0cmV0dXJuIChvID09IG51bGwpID8gY3JlYXRlKGJhc2UpIDogZGVmaW5lUHJvcGVydGllcyhPYmplY3QobyksIGRlc2NyaXB0b3JzKTtcbn07XG5leHBvcnRzLm1ldGhvZHMgPSBtZXRob2RzO1xuXG5cbi8qKiovIH0pLFxuLyogNjYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIHZhbGlkVHlwZXMgPSB7IG9iamVjdDogdHJ1ZSwgc3ltYm9sOiB0cnVlIH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgc3ltYm9sO1xuXHRpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuXHRzeW1ib2wgPSBTeW1ib2woJ3Rlc3Qgc3ltYm9sJyk7XG5cdHRyeSB7IFN0cmluZyhzeW1ib2wpOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdC8vIFJldHVybiAndHJ1ZScgYWxzbyBmb3IgcG9seWZpbGxzXG5cdGlmICghdmFsaWRUeXBlc1t0eXBlb2YgU3ltYm9sLml0ZXJhdG9yXSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIXZhbGlkVHlwZXNbdHlwZW9mIFN5bWJvbC50b1ByaW1pdGl2ZV0pIHJldHVybiBmYWxzZTtcblx0aWYgKCF2YWxpZFR5cGVzW3R5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWddKSByZXR1cm4gZmFsc2U7XG5cblx0cmV0dXJuIHRydWU7XG59O1xuXG5cbi8qKiovIH0pLFxuLyogNjcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vLyBFUzIwMTUgU3ltYm9sIHBvbHlmaWxsIGZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgKG9yIHBhcnRpYWxseSkgc3VwcG9ydCBpdFxuXG5cblxudmFyIGQgICAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKVxuICAsIHZhbGlkYXRlU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2OClcblxuICAsIGNyZWF0ZSA9IE9iamVjdC5jcmVhdGUsIGRlZmluZVByb3BlcnRpZXMgPSBPYmplY3QuZGVmaW5lUHJvcGVydGllc1xuICAsIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5LCBvYmpQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlXG4gICwgTmF0aXZlU3ltYm9sLCBTeW1ib2xQb2x5ZmlsbCwgSGlkZGVuU3ltYm9sLCBnbG9iYWxTeW1ib2xzID0gY3JlYXRlKG51bGwpXG4gICwgaXNOYXRpdmVTYWZlO1xuXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJykge1xuXHROYXRpdmVTeW1ib2wgPSBTeW1ib2w7XG5cdHRyeSB7XG5cdFx0U3RyaW5nKE5hdGl2ZVN5bWJvbCgpKTtcblx0XHRpc05hdGl2ZVNhZmUgPSB0cnVlO1xuXHR9IGNhdGNoIChpZ25vcmUpIHt9XG59XG5cbnZhciBnZW5lcmF0ZU5hbWUgPSAoZnVuY3Rpb24gKCkge1xuXHR2YXIgY3JlYXRlZCA9IGNyZWF0ZShudWxsKTtcblx0cmV0dXJuIGZ1bmN0aW9uIChkZXNjKSB7XG5cdFx0dmFyIHBvc3RmaXggPSAwLCBuYW1lLCBpZTExQnVnV29ya2Fyb3VuZDtcblx0XHR3aGlsZSAoY3JlYXRlZFtkZXNjICsgKHBvc3RmaXggfHwgJycpXSkgKytwb3N0Zml4O1xuXHRcdGRlc2MgKz0gKHBvc3RmaXggfHwgJycpO1xuXHRcdGNyZWF0ZWRbZGVzY10gPSB0cnVlO1xuXHRcdG5hbWUgPSAnQEAnICsgZGVzYztcblx0XHRkZWZpbmVQcm9wZXJ0eShvYmpQcm90b3R5cGUsIG5hbWUsIGQuZ3MobnVsbCwgZnVuY3Rpb24gKHZhbHVlKSB7XG5cdFx0XHQvLyBGb3IgSUUxMSBpc3N1ZSBzZWU6XG5cdFx0XHQvLyBodHRwczovL2Nvbm5lY3QubWljcm9zb2Z0LmNvbS9JRS9mZWVkYmFja2RldGFpbC92aWV3LzE5Mjg1MDgvXG5cdFx0XHQvLyAgICBpZTExLWJyb2tlbi1nZXR0ZXJzLW9uLWRvbS1vYmplY3RzXG5cdFx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vbWVkaWtvby9lczYtc3ltYm9sL2lzc3Vlcy8xMlxuXHRcdFx0aWYgKGllMTFCdWdXb3JrYXJvdW5kKSByZXR1cm47XG5cdFx0XHRpZTExQnVnV29ya2Fyb3VuZCA9IHRydWU7XG5cdFx0XHRkZWZpbmVQcm9wZXJ0eSh0aGlzLCBuYW1lLCBkKHZhbHVlKSk7XG5cdFx0XHRpZTExQnVnV29ya2Fyb3VuZCA9IGZhbHNlO1xuXHRcdH0pKTtcblx0XHRyZXR1cm4gbmFtZTtcblx0fTtcbn0oKSk7XG5cbi8vIEludGVybmFsIGNvbnN0cnVjdG9yIChub3Qgb25lIGV4cG9zZWQpIGZvciBjcmVhdGluZyBTeW1ib2wgaW5zdGFuY2VzLlxuLy8gVGhpcyBvbmUgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCBgc29tZVN5bWJvbCBpbnN0YW5jZW9mIFN5bWJvbGAgYWx3YXlzIHJldHVybiBmYWxzZVxuSGlkZGVuU3ltYm9sID0gZnVuY3Rpb24gU3ltYm9sKGRlc2NyaXB0aW9uKSB7XG5cdGlmICh0aGlzIGluc3RhbmNlb2YgSGlkZGVuU3ltYm9sKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3InKTtcblx0cmV0dXJuIFN5bWJvbFBvbHlmaWxsKGRlc2NyaXB0aW9uKTtcbn07XG5cbi8vIEV4cG9zZWQgYFN5bWJvbGAgY29uc3RydWN0b3Jcbi8vIChyZXR1cm5zIGluc3RhbmNlcyBvZiBIaWRkZW5TeW1ib2wpXG5tb2R1bGUuZXhwb3J0cyA9IFN5bWJvbFBvbHlmaWxsID0gZnVuY3Rpb24gU3ltYm9sKGRlc2NyaXB0aW9uKSB7XG5cdHZhciBzeW1ib2w7XG5cdGlmICh0aGlzIGluc3RhbmNlb2YgU3ltYm9sKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3InKTtcblx0aWYgKGlzTmF0aXZlU2FmZSkgcmV0dXJuIE5hdGl2ZVN5bWJvbChkZXNjcmlwdGlvbik7XG5cdHN5bWJvbCA9IGNyZWF0ZShIaWRkZW5TeW1ib2wucHJvdG90eXBlKTtcblx0ZGVzY3JpcHRpb24gPSAoZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCA/ICcnIDogU3RyaW5nKGRlc2NyaXB0aW9uKSk7XG5cdHJldHVybiBkZWZpbmVQcm9wZXJ0aWVzKHN5bWJvbCwge1xuXHRcdF9fZGVzY3JpcHRpb25fXzogZCgnJywgZGVzY3JpcHRpb24pLFxuXHRcdF9fbmFtZV9fOiBkKCcnLCBnZW5lcmF0ZU5hbWUoZGVzY3JpcHRpb24pKVxuXHR9KTtcbn07XG5kZWZpbmVQcm9wZXJ0aWVzKFN5bWJvbFBvbHlmaWxsLCB7XG5cdGZvcjogZChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0aWYgKGdsb2JhbFN5bWJvbHNba2V5XSkgcmV0dXJuIGdsb2JhbFN5bWJvbHNba2V5XTtcblx0XHRyZXR1cm4gKGdsb2JhbFN5bWJvbHNba2V5XSA9IFN5bWJvbFBvbHlmaWxsKFN0cmluZyhrZXkpKSk7XG5cdH0pLFxuXHRrZXlGb3I6IGQoZnVuY3Rpb24gKHMpIHtcblx0XHR2YXIga2V5O1xuXHRcdHZhbGlkYXRlU3ltYm9sKHMpO1xuXHRcdGZvciAoa2V5IGluIGdsb2JhbFN5bWJvbHMpIGlmIChnbG9iYWxTeW1ib2xzW2tleV0gPT09IHMpIHJldHVybiBrZXk7XG5cdH0pLFxuXG5cdC8vIFRvIGVuc3VyZSBwcm9wZXIgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIG90aGVyIG5hdGl2ZSBmdW5jdGlvbnMgKGUuZy4gQXJyYXkuZnJvbSlcblx0Ly8gZmFsbGJhY2sgdG8gZXZlbnR1YWwgbmF0aXZlIGltcGxlbWVudGF0aW9uIG9mIGdpdmVuIHN5bWJvbFxuXHRoYXNJbnN0YW5jZTogZCgnJywgKE5hdGl2ZVN5bWJvbCAmJiBOYXRpdmVTeW1ib2wuaGFzSW5zdGFuY2UpIHx8IFN5bWJvbFBvbHlmaWxsKCdoYXNJbnN0YW5jZScpKSxcblx0aXNDb25jYXRTcHJlYWRhYmxlOiBkKCcnLCAoTmF0aXZlU3ltYm9sICYmIE5hdGl2ZVN5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGUpIHx8XG5cdFx0U3ltYm9sUG9seWZpbGwoJ2lzQ29uY2F0U3ByZWFkYWJsZScpKSxcblx0aXRlcmF0b3I6IGQoJycsIChOYXRpdmVTeW1ib2wgJiYgTmF0aXZlU3ltYm9sLml0ZXJhdG9yKSB8fCBTeW1ib2xQb2x5ZmlsbCgnaXRlcmF0b3InKSksXG5cdG1hdGNoOiBkKCcnLCAoTmF0aXZlU3ltYm9sICYmIE5hdGl2ZVN5bWJvbC5tYXRjaCkgfHwgU3ltYm9sUG9seWZpbGwoJ21hdGNoJykpLFxuXHRyZXBsYWNlOiBkKCcnLCAoTmF0aXZlU3ltYm9sICYmIE5hdGl2ZVN5bWJvbC5yZXBsYWNlKSB8fCBTeW1ib2xQb2x5ZmlsbCgncmVwbGFjZScpKSxcblx0c2VhcmNoOiBkKCcnLCAoTmF0aXZlU3ltYm9sICYmIE5hdGl2ZVN5bWJvbC5zZWFyY2gpIHx8IFN5bWJvbFBvbHlmaWxsKCdzZWFyY2gnKSksXG5cdHNwZWNpZXM6IGQoJycsIChOYXRpdmVTeW1ib2wgJiYgTmF0aXZlU3ltYm9sLnNwZWNpZXMpIHx8IFN5bWJvbFBvbHlmaWxsKCdzcGVjaWVzJykpLFxuXHRzcGxpdDogZCgnJywgKE5hdGl2ZVN5bWJvbCAmJiBOYXRpdmVTeW1ib2wuc3BsaXQpIHx8IFN5bWJvbFBvbHlmaWxsKCdzcGxpdCcpKSxcblx0dG9QcmltaXRpdmU6IGQoJycsIChOYXRpdmVTeW1ib2wgJiYgTmF0aXZlU3ltYm9sLnRvUHJpbWl0aXZlKSB8fCBTeW1ib2xQb2x5ZmlsbCgndG9QcmltaXRpdmUnKSksXG5cdHRvU3RyaW5nVGFnOiBkKCcnLCAoTmF0aXZlU3ltYm9sICYmIE5hdGl2ZVN5bWJvbC50b1N0cmluZ1RhZykgfHwgU3ltYm9sUG9seWZpbGwoJ3RvU3RyaW5nVGFnJykpLFxuXHR1bnNjb3BhYmxlczogZCgnJywgKE5hdGl2ZVN5bWJvbCAmJiBOYXRpdmVTeW1ib2wudW5zY29wYWJsZXMpIHx8IFN5bWJvbFBvbHlmaWxsKCd1bnNjb3BhYmxlcycpKVxufSk7XG5cbi8vIEludGVybmFsIHR3ZWFrcyBmb3IgcmVhbCBzeW1ib2wgcHJvZHVjZXJcbmRlZmluZVByb3BlcnRpZXMoSGlkZGVuU3ltYm9sLnByb3RvdHlwZSwge1xuXHRjb25zdHJ1Y3RvcjogZChTeW1ib2xQb2x5ZmlsbCksXG5cdHRvU3RyaW5nOiBkKCcnLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9fbmFtZV9fOyB9KVxufSk7XG5cbi8vIFByb3BlciBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGV4cG9zZWQgb24gU3ltYm9sLnByb3RvdHlwZVxuLy8gVGhleSB3b24ndCBiZSBhY2Nlc3NpYmxlIG9uIHByb2R1Y2VkIHN5bWJvbCBpbnN0YW5jZXMgYXMgdGhleSBkZXJpdmUgZnJvbSBIaWRkZW5TeW1ib2wucHJvdG90eXBlXG5kZWZpbmVQcm9wZXJ0aWVzKFN5bWJvbFBvbHlmaWxsLnByb3RvdHlwZSwge1xuXHR0b1N0cmluZzogZChmdW5jdGlvbiAoKSB7IHJldHVybiAnU3ltYm9sICgnICsgdmFsaWRhdGVTeW1ib2wodGhpcykuX19kZXNjcmlwdGlvbl9fICsgJyknOyB9KSxcblx0dmFsdWVPZjogZChmdW5jdGlvbiAoKSB7IHJldHVybiB2YWxpZGF0ZVN5bWJvbCh0aGlzKTsgfSlcbn0pO1xuZGVmaW5lUHJvcGVydHkoU3ltYm9sUG9seWZpbGwucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1ByaW1pdGl2ZSwgZCgnJywgZnVuY3Rpb24gKCkge1xuXHR2YXIgc3ltYm9sID0gdmFsaWRhdGVTeW1ib2wodGhpcyk7XG5cdGlmICh0eXBlb2Ygc3ltYm9sID09PSAnc3ltYm9sJykgcmV0dXJuIHN5bWJvbDtcblx0cmV0dXJuIHN5bWJvbC50b1N0cmluZygpO1xufSkpO1xuZGVmaW5lUHJvcGVydHkoU3ltYm9sUG9seWZpbGwucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZywgZCgnYycsICdTeW1ib2wnKSk7XG5cbi8vIFByb3BlciBpbXBsZW1lbnRhdG9uIG9mIHRvUHJpbWl0aXZlIGFuZCB0b1N0cmluZ1RhZyBmb3IgcmV0dXJuZWQgc3ltYm9sIGluc3RhbmNlc1xuZGVmaW5lUHJvcGVydHkoSGlkZGVuU3ltYm9sLnByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcsXG5cdGQoJ2MnLCBTeW1ib2xQb2x5ZmlsbC5wcm90b3R5cGVbU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWddKSk7XG5cbi8vIE5vdGU6IEl0J3MgaW1wb3J0YW50IHRvIGRlZmluZSBgdG9QcmltaXRpdmVgIGFzIGxhc3Qgb25lLCBhcyBzb21lIGltcGxlbWVudGF0aW9uc1xuLy8gaW1wbGVtZW50IGB0b1ByaW1pdGl2ZWAgbmF0aXZlbHkgd2l0aG91dCBpbXBsZW1lbnRpbmcgYHRvU3RyaW5nVGFnYCAob3Igb3RoZXIgc3BlY2lmaWVkIHN5bWJvbHMpXG4vLyBBbmQgdGhhdCBtYXkgaW52b2tlIGVycm9yIGluIGRlZmluaXRpb24gZmxvdzpcbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL21lZGlrb28vZXM2LXN5bWJvbC9pc3N1ZXMvMTMjaXNzdWVjb21tZW50LTE2NDE0NjE0OVxuZGVmaW5lUHJvcGVydHkoSGlkZGVuU3ltYm9sLnByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwudG9QcmltaXRpdmUsXG5cdGQoJ2MnLCBTeW1ib2xQb2x5ZmlsbC5wcm90b3R5cGVbU3ltYm9sUG9seWZpbGwudG9QcmltaXRpdmVdKSk7XG5cblxuLyoqKi8gfSksXG4vKiA2OCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgaXNTeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY5KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0aWYgKCFpc1N5bWJvbCh2YWx1ZSkpIHRocm93IG5ldyBUeXBlRXJyb3IodmFsdWUgKyBcIiBpcyBub3QgYSBzeW1ib2xcIik7XG5cdHJldHVybiB2YWx1ZTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA2OSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh4KSB7XG5cdGlmICgheCkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodHlwZW9mIHggPT09ICdzeW1ib2wnKSByZXR1cm4gdHJ1ZTtcblx0aWYgKCF4LmNvbnN0cnVjdG9yKSByZXR1cm4gZmFsc2U7XG5cdGlmICh4LmNvbnN0cnVjdG9yLm5hbWUgIT09ICdTeW1ib2wnKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiAoeFt4LmNvbnN0cnVjdG9yLnRvU3RyaW5nVGFnXSA9PT0gJ1N5bWJvbCcpO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDcwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBpc0FyZ3VtZW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oNylcbiAgLCBpc1ZhbHVlICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNClcbiAgLCBpc1N0cmluZyAgICA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7XG5cbnZhciBpdGVyYXRvclN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oMikuaXRlcmF0b3JcbiAgLCBpc0FycmF5ICAgICAgICA9IEFycmF5LmlzQXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdGlmICghaXNWYWx1ZSh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKGlzQXJyYXkodmFsdWUpKSByZXR1cm4gdHJ1ZTtcblx0aWYgKGlzU3RyaW5nKHZhbHVlKSkgcmV0dXJuIHRydWU7XG5cdGlmIChpc0FyZ3VtZW50cyh2YWx1ZSkpIHJldHVybiB0cnVlO1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlW2l0ZXJhdG9yU3ltYm9sXSA9PT0gXCJmdW5jdGlvblwiO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDcxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBpc0FyZ3VtZW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oNylcbiAgLCBjYWxsYWJsZSAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMSlcbiAgLCBpc1N0cmluZyAgICA9IF9fd2VicGFja19yZXF1aXJlX18oOClcbiAgLCBnZXQgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNzIpO1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXksIGNhbGwgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCwgc29tZSA9IEFycmF5LnByb3RvdHlwZS5zb21lO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYWJsZSwgY2IgLyosIHRoaXNBcmcqLykge1xuXHR2YXIgbW9kZSwgdGhpc0FyZyA9IGFyZ3VtZW50c1syXSwgcmVzdWx0LCBkb0JyZWFrLCBicm9rZW4sIGksIGxlbmd0aCwgY2hhciwgY29kZTtcblx0aWYgKGlzQXJyYXkoaXRlcmFibGUpIHx8IGlzQXJndW1lbnRzKGl0ZXJhYmxlKSkgbW9kZSA9IFwiYXJyYXlcIjtcblx0ZWxzZSBpZiAoaXNTdHJpbmcoaXRlcmFibGUpKSBtb2RlID0gXCJzdHJpbmdcIjtcblx0ZWxzZSBpdGVyYWJsZSA9IGdldChpdGVyYWJsZSk7XG5cblx0Y2FsbGFibGUoY2IpO1xuXHRkb0JyZWFrID0gZnVuY3Rpb24gKCkge1xuXHRcdGJyb2tlbiA9IHRydWU7XG5cdH07XG5cdGlmIChtb2RlID09PSBcImFycmF5XCIpIHtcblx0XHRzb21lLmNhbGwoaXRlcmFibGUsIGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRcdFx0Y2FsbC5jYWxsKGNiLCB0aGlzQXJnLCB2YWx1ZSwgZG9CcmVhayk7XG5cdFx0XHRyZXR1cm4gYnJva2VuO1xuXHRcdH0pO1xuXHRcdHJldHVybjtcblx0fVxuXHRpZiAobW9kZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdGxlbmd0aCA9IGl0ZXJhYmxlLmxlbmd0aDtcblx0XHRmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcblx0XHRcdGNoYXIgPSBpdGVyYWJsZVtpXTtcblx0XHRcdGlmIChpICsgMSA8IGxlbmd0aCkge1xuXHRcdFx0XHRjb2RlID0gY2hhci5jaGFyQ29kZUF0KDApO1xuXHRcdFx0XHRpZiAoY29kZSA+PSAweGQ4MDAgJiYgY29kZSA8PSAweGRiZmYpIGNoYXIgKz0gaXRlcmFibGVbKytpXTtcblx0XHRcdH1cblx0XHRcdGNhbGwuY2FsbChjYiwgdGhpc0FyZywgY2hhciwgZG9CcmVhayk7XG5cdFx0XHRpZiAoYnJva2VuKSBicmVhaztcblx0XHR9XG5cdFx0cmV0dXJuO1xuXHR9XG5cdHJlc3VsdCA9IGl0ZXJhYmxlLm5leHQoKTtcblxuXHR3aGlsZSAoIXJlc3VsdC5kb25lKSB7XG5cdFx0Y2FsbC5jYWxsKGNiLCB0aGlzQXJnLCByZXN1bHQudmFsdWUsIGRvQnJlYWspO1xuXHRcdGlmIChicm9rZW4pIHJldHVybjtcblx0XHRyZXN1bHQgPSBpdGVyYWJsZS5uZXh0KCk7XG5cdH1cbn07XG5cblxuLyoqKi8gfSksXG4vKiA3MiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgaXNBcmd1bWVudHMgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpXG4gICwgaXNTdHJpbmcgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpXG4gICwgQXJyYXlJdGVyYXRvciAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDczKVxuICAsIFN0cmluZ0l0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MylcbiAgLCBpdGVyYWJsZSAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjIpXG4gICwgaXRlcmF0b3JTeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpLml0ZXJhdG9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmopIHtcblx0aWYgKHR5cGVvZiBpdGVyYWJsZShvYmopW2l0ZXJhdG9yU3ltYm9sXSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gb2JqW2l0ZXJhdG9yU3ltYm9sXSgpO1xuXHRpZiAoaXNBcmd1bWVudHMob2JqKSkgcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yKG9iaik7XG5cdGlmIChpc1N0cmluZyhvYmopKSByZXR1cm4gbmV3IFN0cmluZ0l0ZXJhdG9yKG9iaik7XG5cdHJldHVybiBuZXcgQXJyYXlJdGVyYXRvcihvYmopO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDczICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBzZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oNilcbiAgLCBjb250YWlucyAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpXG4gICwgZCAgICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpXG4gICwgU3ltYm9sICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpXG4gICwgSXRlcmF0b3IgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5LCBBcnJheUl0ZXJhdG9yO1xuXG5BcnJheUl0ZXJhdG9yID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJyLCBraW5kKSB7XG5cdGlmICghKHRoaXMgaW5zdGFuY2VvZiBBcnJheUl0ZXJhdG9yKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNvbnN0cnVjdG9yIHJlcXVpcmVzICduZXcnXCIpO1xuXHRJdGVyYXRvci5jYWxsKHRoaXMsIGFycik7XG5cdGlmICgha2luZCkga2luZCA9IFwidmFsdWVcIjtcblx0ZWxzZSBpZiAoY29udGFpbnMuY2FsbChraW5kLCBcImtleSt2YWx1ZVwiKSkga2luZCA9IFwia2V5K3ZhbHVlXCI7XG5cdGVsc2UgaWYgKGNvbnRhaW5zLmNhbGwoa2luZCwgXCJrZXlcIikpIGtpbmQgPSBcImtleVwiO1xuXHRlbHNlIGtpbmQgPSBcInZhbHVlXCI7XG5cdGRlZmluZVByb3BlcnR5KHRoaXMsIFwiX19raW5kX19cIiwgZChcIlwiLCBraW5kKSk7XG59O1xuaWYgKHNldFByb3RvdHlwZU9mKSBzZXRQcm90b3R5cGVPZihBcnJheUl0ZXJhdG9yLCBJdGVyYXRvcik7XG5cbi8vIEludGVybmFsICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJSBkb2Vzbid0IGV4cG9zZSBpdHMgY29uc3RydWN0b3JcbmRlbGV0ZSBBcnJheUl0ZXJhdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvcjtcblxuQXJyYXlJdGVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yLnByb3RvdHlwZSwge1xuXHRfcmVzb2x2ZTogZChmdW5jdGlvbiAoaSkge1xuXHRcdGlmICh0aGlzLl9fa2luZF9fID09PSBcInZhbHVlXCIpIHJldHVybiB0aGlzLl9fbGlzdF9fW2ldO1xuXHRcdGlmICh0aGlzLl9fa2luZF9fID09PSBcImtleSt2YWx1ZVwiKSByZXR1cm4gW2ksIHRoaXMuX19saXN0X19baV1dO1xuXHRcdHJldHVybiBpO1xuXHR9KVxufSk7XG5kZWZpbmVQcm9wZXJ0eShBcnJheUl0ZXJhdG9yLnByb3RvdHlwZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCBkKFwiY1wiLCBcIkFycmF5IEl0ZXJhdG9yXCIpKTtcblxuXG4vKioqLyB9KSxcbi8qIDc0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBjb3B5ICAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NSlcbiAgLCBub3JtYWxpemVPcHRpb25zID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMSlcbiAgLCBlbnN1cmVDYWxsYWJsZSAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVxuICAsIG1hcCAgICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgwKVxuICAsIGNhbGxhYmxlICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpXG4gICwgdmFsaWRWYWx1ZSAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMClcblxuICAsIGJpbmQgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCwgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHlcbiAgLCBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcbiAgLCBkZWZpbmU7XG5cbmRlZmluZSA9IGZ1bmN0aW9uIChuYW1lLCBkZXNjLCBvcHRpb25zKSB7XG5cdHZhciB2YWx1ZSA9IHZhbGlkVmFsdWUoZGVzYykgJiYgY2FsbGFibGUoZGVzYy52YWx1ZSksIGRncztcblx0ZGdzID0gY29weShkZXNjKTtcblx0ZGVsZXRlIGRncy53cml0YWJsZTtcblx0ZGVsZXRlIGRncy52YWx1ZTtcblx0ZGdzLmdldCA9IGZ1bmN0aW9uICgpIHtcblx0XHRpZiAoIW9wdGlvbnMub3ZlcndyaXRlRGVmaW5pdGlvbiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsIG5hbWUpKSByZXR1cm4gdmFsdWU7XG5cdFx0ZGVzYy52YWx1ZSA9IGJpbmQuY2FsbCh2YWx1ZSwgb3B0aW9ucy5yZXNvbHZlQ29udGV4dCA/IG9wdGlvbnMucmVzb2x2ZUNvbnRleHQodGhpcykgOiB0aGlzKTtcblx0XHRkZWZpbmVQcm9wZXJ0eSh0aGlzLCBuYW1lLCBkZXNjKTtcblx0XHRyZXR1cm4gdGhpc1tuYW1lXTtcblx0fTtcblx0cmV0dXJuIGRncztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHByb3BzLyosIG9wdGlvbnMqLykge1xuXHR2YXIgb3B0aW9ucyA9IG5vcm1hbGl6ZU9wdGlvbnMoYXJndW1lbnRzWzFdKTtcblx0aWYgKG9wdGlvbnMucmVzb2x2ZUNvbnRleHQgIT0gbnVsbCkgZW5zdXJlQ2FsbGFibGUob3B0aW9ucy5yZXNvbHZlQ29udGV4dCk7XG5cdHJldHVybiBtYXAocHJvcHMsIGZ1bmN0aW9uIChkZXNjLCBuYW1lKSB7IHJldHVybiBkZWZpbmUobmFtZSwgZGVzYywgb3B0aW9ucyk7IH0pO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDc1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBhRnJvbSAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc2KVxuICAsIGFzc2lnbiA9IF9fd2VicGFja19yZXF1aXJlX18oMTApXG4gICwgdmFsdWUgID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqLyosIHByb3BlcnR5TmFtZXMsIG9wdGlvbnMqLykge1xuXHR2YXIgY29weSA9IE9iamVjdCh2YWx1ZShvYmopKSwgcHJvcGVydHlOYW1lcyA9IGFyZ3VtZW50c1sxXSwgb3B0aW9ucyA9IE9iamVjdChhcmd1bWVudHNbMl0pO1xuXHRpZiAoY29weSAhPT0gb2JqICYmICFwcm9wZXJ0eU5hbWVzKSByZXR1cm4gY29weTtcblx0dmFyIHJlc3VsdCA9IHt9O1xuXHRpZiAocHJvcGVydHlOYW1lcykge1xuXHRcdGFGcm9tKHByb3BlcnR5TmFtZXMsIGZ1bmN0aW9uIChwcm9wZXJ0eU5hbWUpIHtcblx0XHRcdGlmIChvcHRpb25zLmVuc3VyZSB8fCBwcm9wZXJ0eU5hbWUgaW4gb2JqKSByZXN1bHRbcHJvcGVydHlOYW1lXSA9IG9ialtwcm9wZXJ0eU5hbWVdO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdGFzc2lnbihyZXN1bHQsIG9iaik7XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA3NiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzcpKClcblx0PyBBcnJheS5mcm9tXG5cdDogX193ZWJwYWNrX3JlcXVpcmVfXyg3OCk7XG5cblxuLyoqKi8gfSksXG4vKiA3NyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGZyb20gPSBBcnJheS5mcm9tLCBhcnIsIHJlc3VsdDtcblx0aWYgKHR5cGVvZiBmcm9tICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBmYWxzZTtcblx0YXJyID0gW1wicmF6XCIsIFwiZHdhXCJdO1xuXHRyZXN1bHQgPSBmcm9tKGFycik7XG5cdHJldHVybiBCb29sZWFuKHJlc3VsdCAmJiAocmVzdWx0ICE9PSBhcnIpICYmIChyZXN1bHRbMV0gPT09IFwiZHdhXCIpKTtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA3OCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgaXRlcmF0b3JTeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpLml0ZXJhdG9yXG4gICwgaXNBcmd1bWVudHMgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpXG4gICwgaXNGdW5jdGlvbiAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KVxuICAsIHRvUG9zSW50ICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOClcbiAgLCBjYWxsYWJsZSAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMSlcbiAgLCB2YWxpZFZhbHVlICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMClcbiAgLCBpc1ZhbHVlICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNClcbiAgLCBpc1N0cmluZyAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oOClcbiAgLCBpc0FycmF5ICAgICAgICA9IEFycmF5LmlzQXJyYXlcbiAgLCBjYWxsICAgICAgICAgICA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsXG4gICwgZGVzYyAgICAgICAgICAgPSB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBudWxsIH1cbiAgLCBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFycmF5TGlrZSAvKiwgbWFwRm4sIHRoaXNBcmcqLykge1xuXHR2YXIgbWFwRm4gPSBhcmd1bWVudHNbMV1cblx0ICAsIHRoaXNBcmcgPSBhcmd1bWVudHNbMl1cblx0ICAsIENvbnRleHRcblx0ICAsIGlcblx0ICAsIGpcblx0ICAsIGFyclxuXHQgICwgbGVuZ3RoXG5cdCAgLCBjb2RlXG5cdCAgLCBpdGVyYXRvclxuXHQgICwgcmVzdWx0XG5cdCAgLCBnZXRJdGVyYXRvclxuXHQgICwgdmFsdWU7XG5cblx0YXJyYXlMaWtlID0gT2JqZWN0KHZhbGlkVmFsdWUoYXJyYXlMaWtlKSk7XG5cblx0aWYgKGlzVmFsdWUobWFwRm4pKSBjYWxsYWJsZShtYXBGbik7XG5cdGlmICghdGhpcyB8fCB0aGlzID09PSBBcnJheSB8fCAhaXNGdW5jdGlvbih0aGlzKSkge1xuXHRcdC8vIFJlc3VsdDogUGxhaW4gYXJyYXlcblx0XHRpZiAoIW1hcEZuKSB7XG5cdFx0XHRpZiAoaXNBcmd1bWVudHMoYXJyYXlMaWtlKSkge1xuXHRcdFx0XHQvLyBTb3VyY2U6IEFyZ3VtZW50c1xuXHRcdFx0XHRsZW5ndGggPSBhcnJheUxpa2UubGVuZ3RoO1xuXHRcdFx0XHRpZiAobGVuZ3RoICE9PSAxKSByZXR1cm4gQXJyYXkuYXBwbHkobnVsbCwgYXJyYXlMaWtlKTtcblx0XHRcdFx0YXJyID0gbmV3IEFycmF5KDEpO1xuXHRcdFx0XHRhcnJbMF0gPSBhcnJheUxpa2VbMF07XG5cdFx0XHRcdHJldHVybiBhcnI7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaXNBcnJheShhcnJheUxpa2UpKSB7XG5cdFx0XHRcdC8vIFNvdXJjZTogQXJyYXlcblx0XHRcdFx0YXJyID0gbmV3IEFycmF5KGxlbmd0aCA9IGFycmF5TGlrZS5sZW5ndGgpO1xuXHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIGFycltpXSA9IGFycmF5TGlrZVtpXTtcblx0XHRcdFx0cmV0dXJuIGFycjtcblx0XHRcdH1cblx0XHR9XG5cdFx0YXJyID0gW107XG5cdH0gZWxzZSB7XG5cdFx0Ly8gUmVzdWx0OiBOb24gcGxhaW4gYXJyYXlcblx0XHRDb250ZXh0ID0gdGhpcztcblx0fVxuXG5cdGlmICghaXNBcnJheShhcnJheUxpa2UpKSB7XG5cdFx0aWYgKChnZXRJdGVyYXRvciA9IGFycmF5TGlrZVtpdGVyYXRvclN5bWJvbF0pICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFNvdXJjZTogSXRlcmF0b3Jcblx0XHRcdGl0ZXJhdG9yID0gY2FsbGFibGUoZ2V0SXRlcmF0b3IpLmNhbGwoYXJyYXlMaWtlKTtcblx0XHRcdGlmIChDb250ZXh0KSBhcnIgPSBuZXcgQ29udGV4dCgpO1xuXHRcdFx0cmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuXHRcdFx0aSA9IDA7XG5cdFx0XHR3aGlsZSAoIXJlc3VsdC5kb25lKSB7XG5cdFx0XHRcdHZhbHVlID0gbWFwRm4gPyBjYWxsLmNhbGwobWFwRm4sIHRoaXNBcmcsIHJlc3VsdC52YWx1ZSwgaSkgOiByZXN1bHQudmFsdWU7XG5cdFx0XHRcdGlmIChDb250ZXh0KSB7XG5cdFx0XHRcdFx0ZGVzYy52YWx1ZSA9IHZhbHVlO1xuXHRcdFx0XHRcdGRlZmluZVByb3BlcnR5KGFyciwgaSwgZGVzYyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YXJyW2ldID0gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuXHRcdFx0XHQrK2k7XG5cdFx0XHR9XG5cdFx0XHRsZW5ndGggPSBpO1xuXHRcdH0gZWxzZSBpZiAoaXNTdHJpbmcoYXJyYXlMaWtlKSkge1xuXHRcdFx0Ly8gU291cmNlOiBTdHJpbmdcblx0XHRcdGxlbmd0aCA9IGFycmF5TGlrZS5sZW5ndGg7XG5cdFx0XHRpZiAoQ29udGV4dCkgYXJyID0gbmV3IENvbnRleHQoKTtcblx0XHRcdGZvciAoaSA9IDAsIGogPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcblx0XHRcdFx0dmFsdWUgPSBhcnJheUxpa2VbaV07XG5cdFx0XHRcdGlmIChpICsgMSA8IGxlbmd0aCkge1xuXHRcdFx0XHRcdGNvZGUgPSB2YWx1ZS5jaGFyQ29kZUF0KDApO1xuXHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtZGVwdGhcblx0XHRcdFx0XHRpZiAoY29kZSA+PSAweGQ4MDAgJiYgY29kZSA8PSAweGRiZmYpIHZhbHVlICs9IGFycmF5TGlrZVsrK2ldO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHZhbHVlID0gbWFwRm4gPyBjYWxsLmNhbGwobWFwRm4sIHRoaXNBcmcsIHZhbHVlLCBqKSA6IHZhbHVlO1xuXHRcdFx0XHRpZiAoQ29udGV4dCkge1xuXHRcdFx0XHRcdGRlc2MudmFsdWUgPSB2YWx1ZTtcblx0XHRcdFx0XHRkZWZpbmVQcm9wZXJ0eShhcnIsIGosIGRlc2MpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFycltqXSA9IHZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdCsrajtcblx0XHRcdH1cblx0XHRcdGxlbmd0aCA9IGo7XG5cdFx0fVxuXHR9XG5cdGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuXHRcdC8vIFNvdXJjZTogYXJyYXkgb3IgYXJyYXktbGlrZVxuXHRcdGxlbmd0aCA9IHRvUG9zSW50KGFycmF5TGlrZS5sZW5ndGgpO1xuXHRcdGlmIChDb250ZXh0KSBhcnIgPSBuZXcgQ29udGV4dChsZW5ndGgpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuXHRcdFx0dmFsdWUgPSBtYXBGbiA/IGNhbGwuY2FsbChtYXBGbiwgdGhpc0FyZywgYXJyYXlMaWtlW2ldLCBpKSA6IGFycmF5TGlrZVtpXTtcblx0XHRcdGlmIChDb250ZXh0KSB7XG5cdFx0XHRcdGRlc2MudmFsdWUgPSB2YWx1ZTtcblx0XHRcdFx0ZGVmaW5lUHJvcGVydHkoYXJyLCBpLCBkZXNjKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGFycltpXSA9IHZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRpZiAoQ29udGV4dCkge1xuXHRcdGRlc2MudmFsdWUgPSBudWxsO1xuXHRcdGFyci5sZW5ndGggPSBsZW5ndGg7XG5cdH1cblx0cmV0dXJuIGFycjtcbn07XG5cblxuLyoqKi8gfSksXG4vKiA3OSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgb2JqVG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLCBpZCA9IG9ialRvU3RyaW5nLmNhbGwoX193ZWJwYWNrX3JlcXVpcmVfXygxNykpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqVG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09IGlkO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDgwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBjYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSlcbiAgLCBmb3JFYWNoICA9IF9fd2VicGFja19yZXF1aXJlX18oODEpXG4gICwgY2FsbCAgICAgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqLCBjYiAvKiwgdGhpc0FyZyovKSB7XG5cdHZhciByZXN1bHQgPSB7fSwgdGhpc0FyZyA9IGFyZ3VtZW50c1syXTtcblx0Y2FsbGFibGUoY2IpO1xuXHRmb3JFYWNoKG9iaiwgZnVuY3Rpb24gKHZhbHVlLCBrZXksIHRhcmdldE9iaiwgaW5kZXgpIHtcblx0XHRyZXN1bHRba2V5XSA9IGNhbGwuY2FsbChjYiwgdGhpc0FyZywgdmFsdWUsIGtleSwgdGFyZ2V0T2JqLCBpbmRleCk7XG5cdH0pO1xuXHRyZXR1cm4gcmVzdWx0O1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDgxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MikoXCJmb3JFYWNoXCIpO1xuXG5cbi8qKiovIH0pLFxuLyogODIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vLyBJbnRlcm5hbCBtZXRob2QsIHVzZWQgYnkgaXRlcmF0aW9uIGZ1bmN0aW9ucy5cbi8vIENhbGxzIGEgZnVuY3Rpb24gZm9yIGVhY2gga2V5LXZhbHVlIHBhaXIgZm91bmQgaW4gb2JqZWN0XG4vLyBPcHRpb25hbGx5IHRha2VzIGNvbXBhcmVGbiB0byBpdGVyYXRlIG9iamVjdCBpbiBzcGVjaWZpYyBvcmRlclxuXG5cblxudmFyIGNhbGxhYmxlICAgICAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVxuICAsIHZhbHVlICAgICAgICAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKVxuICAsIGJpbmQgICAgICAgICAgICAgICAgICAgID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRcbiAgLCBjYWxsICAgICAgICAgICAgICAgICAgICA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsXG4gICwga2V5cyAgICAgICAgICAgICAgICAgICAgPSBPYmplY3Qua2V5c1xuICAsIG9ialByb3BlcnR5SXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobWV0aG9kLCBkZWZWYWwpIHtcblx0cmV0dXJuIGZ1bmN0aW9uIChvYmosIGNiIC8qLCB0aGlzQXJnLCBjb21wYXJlRm4qLykge1xuXHRcdHZhciBsaXN0LCB0aGlzQXJnID0gYXJndW1lbnRzWzJdLCBjb21wYXJlRm4gPSBhcmd1bWVudHNbM107XG5cdFx0b2JqID0gT2JqZWN0KHZhbHVlKG9iaikpO1xuXHRcdGNhbGxhYmxlKGNiKTtcblxuXHRcdGxpc3QgPSBrZXlzKG9iaik7XG5cdFx0aWYgKGNvbXBhcmVGbikge1xuXHRcdFx0bGlzdC5zb3J0KHR5cGVvZiBjb21wYXJlRm4gPT09IFwiZnVuY3Rpb25cIiA/IGJpbmQuY2FsbChjb21wYXJlRm4sIG9iaikgOiB1bmRlZmluZWQpO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIG1ldGhvZCAhPT0gXCJmdW5jdGlvblwiKSBtZXRob2QgPSBsaXN0W21ldGhvZF07XG5cdFx0cmV0dXJuIGNhbGwuY2FsbChtZXRob2QsIGxpc3QsIGZ1bmN0aW9uIChrZXksIGluZGV4KSB7XG5cdFx0XHRpZiAoIW9ialByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqLCBrZXkpKSByZXR1cm4gZGVmVmFsO1xuXHRcdFx0cmV0dXJuIGNhbGwuY2FsbChjYiwgdGhpc0FyZywgb2JqW2tleV0sIGtleSwgb2JqLCBpbmRleCk7XG5cdFx0fSk7XG5cdH07XG59O1xuXG5cbi8qKiovIH0pLFxuLyogODMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vLyBUaGFua3MgQG1hdGhpYXNieW5lbnNcbi8vIGh0dHA6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtdW5pY29kZSNpdGVyYXRpbmctb3Zlci1zeW1ib2xzXG5cblxuXG52YXIgc2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG4gICwgZCAgICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpXG4gICwgU3ltYm9sICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpXG4gICwgSXRlcmF0b3IgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5LCBTdHJpbmdJdGVyYXRvcjtcblxuU3RyaW5nSXRlcmF0b3IgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzdHIpIHtcblx0aWYgKCEodGhpcyBpbnN0YW5jZW9mIFN0cmluZ0l0ZXJhdG9yKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNvbnN0cnVjdG9yIHJlcXVpcmVzICduZXcnXCIpO1xuXHRzdHIgPSBTdHJpbmcoc3RyKTtcblx0SXRlcmF0b3IuY2FsbCh0aGlzLCBzdHIpO1xuXHRkZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIl9fbGVuZ3RoX19cIiwgZChcIlwiLCBzdHIubGVuZ3RoKSk7XG59O1xuaWYgKHNldFByb3RvdHlwZU9mKSBzZXRQcm90b3R5cGVPZihTdHJpbmdJdGVyYXRvciwgSXRlcmF0b3IpO1xuXG4vLyBJbnRlcm5hbCAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUgZG9lc24ndCBleHBvc2UgaXRzIGNvbnN0cnVjdG9yXG5kZWxldGUgU3RyaW5nSXRlcmF0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yO1xuXG5TdHJpbmdJdGVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yLnByb3RvdHlwZSwge1xuXHRfbmV4dDogZChmdW5jdGlvbiAoKSB7XG5cdFx0aWYgKCF0aGlzLl9fbGlzdF9fKSByZXR1cm4gdW5kZWZpbmVkO1xuXHRcdGlmICh0aGlzLl9fbmV4dEluZGV4X18gPCB0aGlzLl9fbGVuZ3RoX18pIHJldHVybiB0aGlzLl9fbmV4dEluZGV4X18rKztcblx0XHR0aGlzLl91bkJpbmQoKTtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9KSxcblx0X3Jlc29sdmU6IGQoZnVuY3Rpb24gKGkpIHtcblx0XHR2YXIgY2hhciA9IHRoaXMuX19saXN0X19baV0sIGNvZGU7XG5cdFx0aWYgKHRoaXMuX19uZXh0SW5kZXhfXyA9PT0gdGhpcy5fX2xlbmd0aF9fKSByZXR1cm4gY2hhcjtcblx0XHRjb2RlID0gY2hhci5jaGFyQ29kZUF0KDApO1xuXHRcdGlmIChjb2RlID49IDB4ZDgwMCAmJiBjb2RlIDw9IDB4ZGJmZikgcmV0dXJuIGNoYXIgKyB0aGlzLl9fbGlzdF9fW3RoaXMuX19uZXh0SW5kZXhfXysrXTtcblx0XHRyZXR1cm4gY2hhcjtcblx0fSlcbn0pO1xuZGVmaW5lUHJvcGVydHkoU3RyaW5nSXRlcmF0b3IucHJvdG90eXBlLCBTeW1ib2wudG9TdHJpbmdUYWcsIGQoXCJjXCIsIFwiU3RyaW5nIEl0ZXJhdG9yXCIpKTtcblxuXG4vKioqLyB9KSxcbi8qIDg0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBzZXRQcm90b3R5cGVPZiAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNilcbiAgLCBjb250YWlucyAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpXG4gICwgZCAgICAgICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpXG4gICwgSXRlcmF0b3IgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKVxuICAsIHRvU3RyaW5nVGFnU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKS50b1N0cmluZ1RhZ1xuXG4gICwgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHlcbiAgLCBTZXRJdGVyYXRvcjtcblxuU2V0SXRlcmF0b3IgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzZXQsIGtpbmQpIHtcblx0aWYgKCEodGhpcyBpbnN0YW5jZW9mIFNldEl0ZXJhdG9yKSkgcmV0dXJuIG5ldyBTZXRJdGVyYXRvcihzZXQsIGtpbmQpO1xuXHRJdGVyYXRvci5jYWxsKHRoaXMsIHNldC5fX3NldERhdGFfXywgc2V0KTtcblx0aWYgKCFraW5kKSBraW5kID0gJ3ZhbHVlJztcblx0ZWxzZSBpZiAoY29udGFpbnMuY2FsbChraW5kLCAna2V5K3ZhbHVlJykpIGtpbmQgPSAna2V5K3ZhbHVlJztcblx0ZWxzZSBraW5kID0gJ3ZhbHVlJztcblx0ZGVmaW5lUHJvcGVydHkodGhpcywgJ19fa2luZF9fJywgZCgnJywga2luZCkpO1xufTtcbmlmIChzZXRQcm90b3R5cGVPZikgc2V0UHJvdG90eXBlT2YoU2V0SXRlcmF0b3IsIEl0ZXJhdG9yKTtcblxuU2V0SXRlcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvci5wcm90b3R5cGUsIHtcblx0Y29uc3RydWN0b3I6IGQoU2V0SXRlcmF0b3IpLFxuXHRfcmVzb2x2ZTogZChmdW5jdGlvbiAoaSkge1xuXHRcdGlmICh0aGlzLl9fa2luZF9fID09PSAndmFsdWUnKSByZXR1cm4gdGhpcy5fX2xpc3RfX1tpXTtcblx0XHRyZXR1cm4gW3RoaXMuX19saXN0X19baV0sIHRoaXMuX19saXN0X19baV1dO1xuXHR9KSxcblx0dG9TdHJpbmc6IGQoZnVuY3Rpb24gKCkgeyByZXR1cm4gJ1tvYmplY3QgU2V0IEl0ZXJhdG9yXSc7IH0pXG59KTtcbmRlZmluZVByb3BlcnR5KFNldEl0ZXJhdG9yLnByb3RvdHlwZSwgdG9TdHJpbmdUYWdTeW1ib2wsIGQoJ2MnLCAnU2V0IEl0ZXJhdG9yJykpO1xuXG5cbi8qKiovIH0pLFxuLyogODUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vLyBFeHBvcnRzIHRydWUgaWYgZW52aXJvbm1lbnQgcHJvdmlkZXMgbmF0aXZlIGBTZXRgIGltcGxlbWVudGF0aW9uLFxuLy8gd2hhdGV2ZXIgdGhhdCBpcy5cblxuXG5cbm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uICgpIHtcblx0aWYgKHR5cGVvZiBTZXQgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFNldC5wcm90b3R5cGUpID09PSAnW29iamVjdCBTZXRdJyk7XG59KCkpO1xuXG5cbi8qKiovIH0pLFxuLyogODYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuLypcblx0cHNldWRvIHNlbGVjdG9yc1xuXG5cdC0tLVxuXG5cdHRoZXkgYXJlIGF2YWlsYWJsZSBpbiB0d28gZm9ybXM6XG5cdCogZmlsdGVycyBjYWxsZWQgd2hlbiB0aGUgc2VsZWN0b3Jcblx0ICBpcyBjb21waWxlZCBhbmQgcmV0dXJuIGEgZnVuY3Rpb25cblx0ICB0aGF0IG5lZWRzIHRvIHJldHVybiBuZXh0KClcblx0KiBwc2V1ZG9zIGdldCBjYWxsZWQgb24gZXhlY3V0aW9uXG5cdCAgdGhleSBuZWVkIHRvIHJldHVybiBhIGJvb2xlYW5cbiovXG5cbnZhciBnZXROQ2hlY2sgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oODcpLFxuXHRCYXNlRnVuY3MgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNSksXG5cdGF0dHJpYnV0ZXNGYWN0b3J5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMyksXG5cdHRydWVGdW5jICAgICAgICAgID0gQmFzZUZ1bmNzLnRydWVGdW5jLFxuXHRmYWxzZUZ1bmMgICAgICAgICA9IEJhc2VGdW5jcy5mYWxzZUZ1bmM7XG5cbmZ1bmN0aW9uIGZpbHRlcnNGYWN0b3J5KGFkYXB0ZXIpe1xuXHR2YXIgYXR0cmlidXRlcyAgPSBhdHRyaWJ1dGVzRmFjdG9yeShhZGFwdGVyKSxcblx0XHRjaGVja0F0dHJpYiA9IGF0dHJpYnV0ZXMucnVsZXMuZXF1YWxzO1xuXG5cdC8vaGVscGVyIG1ldGhvZHNcblx0ZnVuY3Rpb24gZXF1YWxzKGEsIGIpe1xuXHRcdGlmKHR5cGVvZiBhZGFwdGVyLmVxdWFscyA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gYWRhcHRlci5lcXVhbHMoYSwgYik7XG5cblx0XHRyZXR1cm4gYSA9PT0gYjtcblx0fVxuXG5cdGZ1bmN0aW9uIGdldEF0dHJpYkZ1bmMobmFtZSwgdmFsdWUpe1xuXHRcdHZhciBkYXRhID0ge25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX07XG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGF0dHJpYkZ1bmMobmV4dCl7XG5cdFx0XHRyZXR1cm4gY2hlY2tBdHRyaWIobmV4dCwgZGF0YSk7XG5cdFx0fTtcblx0fVxuXG5cdGZ1bmN0aW9uIGdldENoaWxkRnVuYyhuZXh0KXtcblx0XHRyZXR1cm4gZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRyZXR1cm4gISFhZGFwdGVyLmdldFBhcmVudChlbGVtKSAmJiBuZXh0KGVsZW0pO1xuXHRcdH07XG5cdH1cblxuXHR2YXIgZmlsdGVycyA9IHtcblx0XHRjb250YWluczogZnVuY3Rpb24obmV4dCwgdGV4dCl7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gY29udGFpbnMoZWxlbSl7XG5cdFx0XHRcdHJldHVybiBuZXh0KGVsZW0pICYmIGFkYXB0ZXIuZ2V0VGV4dChlbGVtKS5pbmRleE9mKHRleHQpID49IDA7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0aWNvbnRhaW5zOiBmdW5jdGlvbihuZXh0LCB0ZXh0KXtcblx0XHRcdHZhciBpdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiBpY29udGFpbnMoZWxlbSl7XG5cdFx0XHRcdHJldHVybiBuZXh0KGVsZW0pICYmXG5cdFx0XHRcdFx0YWRhcHRlci5nZXRUZXh0KGVsZW0pLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihpdGV4dCkgPj0gMDtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdC8vbG9jYXRpb24gc3BlY2lmaWMgbWV0aG9kc1xuXHRcdFwibnRoLWNoaWxkXCI6IGZ1bmN0aW9uKG5leHQsIHJ1bGUpe1xuXHRcdFx0dmFyIGZ1bmMgPSBnZXROQ2hlY2socnVsZSk7XG5cblx0XHRcdGlmKGZ1bmMgPT09IGZhbHNlRnVuYykgcmV0dXJuIGZ1bmM7XG5cdFx0XHRpZihmdW5jID09PSB0cnVlRnVuYykgIHJldHVybiBnZXRDaGlsZEZ1bmMobmV4dCk7XG5cblx0XHRcdHJldHVybiBmdW5jdGlvbiBudGhDaGlsZChlbGVtKXtcblx0XHRcdFx0dmFyIHNpYmxpbmdzID0gYWRhcHRlci5nZXRTaWJsaW5ncyhlbGVtKTtcblxuXHRcdFx0XHRmb3IodmFyIGkgPSAwLCBwb3MgPSAwOyBpIDwgc2libGluZ3MubGVuZ3RoOyBpKyspe1xuXHRcdFx0XHRcdGlmKGFkYXB0ZXIuaXNUYWcoc2libGluZ3NbaV0pKXtcblx0XHRcdFx0XHRcdGlmKHNpYmxpbmdzW2ldID09PSBlbGVtKSBicmVhaztcblx0XHRcdFx0XHRcdGVsc2UgcG9zKys7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGZ1bmMocG9zKSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdFwibnRoLWxhc3QtY2hpbGRcIjogZnVuY3Rpb24obmV4dCwgcnVsZSl7XG5cdFx0XHR2YXIgZnVuYyA9IGdldE5DaGVjayhydWxlKTtcblxuXHRcdFx0aWYoZnVuYyA9PT0gZmFsc2VGdW5jKSByZXR1cm4gZnVuYztcblx0XHRcdGlmKGZ1bmMgPT09IHRydWVGdW5jKSAgcmV0dXJuIGdldENoaWxkRnVuYyhuZXh0KTtcblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIG50aExhc3RDaGlsZChlbGVtKXtcblx0XHRcdFx0dmFyIHNpYmxpbmdzID0gYWRhcHRlci5nZXRTaWJsaW5ncyhlbGVtKTtcblxuXHRcdFx0XHRmb3IodmFyIHBvcyA9IDAsIGkgPSBzaWJsaW5ncy5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7XG5cdFx0XHRcdFx0aWYoYWRhcHRlci5pc1RhZyhzaWJsaW5nc1tpXSkpe1xuXHRcdFx0XHRcdFx0aWYoc2libGluZ3NbaV0gPT09IGVsZW0pIGJyZWFrO1xuXHRcdFx0XHRcdFx0ZWxzZSBwb3MrKztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZnVuYyhwb3MpICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0XCJudGgtb2YtdHlwZVwiOiBmdW5jdGlvbihuZXh0LCBydWxlKXtcblx0XHRcdHZhciBmdW5jID0gZ2V0TkNoZWNrKHJ1bGUpO1xuXG5cdFx0XHRpZihmdW5jID09PSBmYWxzZUZ1bmMpIHJldHVybiBmdW5jO1xuXHRcdFx0aWYoZnVuYyA9PT0gdHJ1ZUZ1bmMpICByZXR1cm4gZ2V0Q2hpbGRGdW5jKG5leHQpO1xuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gbnRoT2ZUeXBlKGVsZW0pe1xuXHRcdFx0XHR2YXIgc2libGluZ3MgPSBhZGFwdGVyLmdldFNpYmxpbmdzKGVsZW0pO1xuXG5cdFx0XHRcdGZvcih2YXIgcG9zID0gMCwgaSA9IDA7IGkgPCBzaWJsaW5ncy5sZW5ndGg7IGkrKyl7XG5cdFx0XHRcdFx0aWYoYWRhcHRlci5pc1RhZyhzaWJsaW5nc1tpXSkpe1xuXHRcdFx0XHRcdFx0aWYoc2libGluZ3NbaV0gPT09IGVsZW0pIGJyZWFrO1xuXHRcdFx0XHRcdFx0aWYoYWRhcHRlci5nZXROYW1lKHNpYmxpbmdzW2ldKSA9PT0gYWRhcHRlci5nZXROYW1lKGVsZW0pKSBwb3MrKztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZnVuYyhwb3MpICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0XCJudGgtbGFzdC1vZi10eXBlXCI6IGZ1bmN0aW9uKG5leHQsIHJ1bGUpe1xuXHRcdFx0dmFyIGZ1bmMgPSBnZXROQ2hlY2socnVsZSk7XG5cblx0XHRcdGlmKGZ1bmMgPT09IGZhbHNlRnVuYykgcmV0dXJuIGZ1bmM7XG5cdFx0XHRpZihmdW5jID09PSB0cnVlRnVuYykgIHJldHVybiBnZXRDaGlsZEZ1bmMobmV4dCk7XG5cblx0XHRcdHJldHVybiBmdW5jdGlvbiBudGhMYXN0T2ZUeXBlKGVsZW0pe1xuXHRcdFx0XHR2YXIgc2libGluZ3MgPSBhZGFwdGVyLmdldFNpYmxpbmdzKGVsZW0pO1xuXG5cdFx0XHRcdGZvcih2YXIgcG9zID0gMCwgaSA9IHNpYmxpbmdzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXtcblx0XHRcdFx0XHRpZihhZGFwdGVyLmlzVGFnKHNpYmxpbmdzW2ldKSl7XG5cdFx0XHRcdFx0XHRpZihzaWJsaW5nc1tpXSA9PT0gZWxlbSkgYnJlYWs7XG5cdFx0XHRcdFx0XHRpZihhZGFwdGVyLmdldE5hbWUoc2libGluZ3NbaV0pID09PSBhZGFwdGVyLmdldE5hbWUoZWxlbSkpIHBvcysrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBmdW5jKHBvcykgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdC8vVE9ETyBkZXRlcm1pbmUgdGhlIGFjdHVhbCByb290IGVsZW1lbnRcblx0XHRyb290OiBmdW5jdGlvbihuZXh0KXtcblx0XHRcdHJldHVybiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdFx0cmV0dXJuICFhZGFwdGVyLmdldFBhcmVudChlbGVtKSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0c2NvcGU6IGZ1bmN0aW9uKG5leHQsIHJ1bGUsIG9wdGlvbnMsIGNvbnRleHQpe1xuXHRcdFx0aWYoIWNvbnRleHQgfHwgY29udGV4dC5sZW5ndGggPT09IDApe1xuXHRcdFx0XHQvL2VxdWl2YWxlbnQgdG8gOnJvb3Rcblx0XHRcdFx0cmV0dXJuIGZpbHRlcnMucm9vdChuZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYoY29udGV4dC5sZW5ndGggPT09IDEpe1xuXHRcdFx0XHQvL05PVEU6IGNhbid0IGJlIHVucGFja2VkLCBhcyA6aGFzIHVzZXMgdGhpcyBmb3Igc2lkZS1lZmZlY3RzXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdFx0XHRyZXR1cm4gZXF1YWxzKGNvbnRleHRbMF0sIGVsZW0pICYmIG5leHQoZWxlbSk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdFx0cmV0dXJuIGNvbnRleHQuaW5kZXhPZihlbGVtKSA+PSAwICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHQvL2pRdWVyeSBleHRlbnNpb25zIChvdGhlcnMgZm9sbG93IGFzIHBzZXVkb3MpXG5cdFx0Y2hlY2tib3g6IGdldEF0dHJpYkZ1bmMoXCJ0eXBlXCIsIFwiY2hlY2tib3hcIiksXG5cdFx0ZmlsZTogZ2V0QXR0cmliRnVuYyhcInR5cGVcIiwgXCJmaWxlXCIpLFxuXHRcdHBhc3N3b3JkOiBnZXRBdHRyaWJGdW5jKFwidHlwZVwiLCBcInBhc3N3b3JkXCIpLFxuXHRcdHJhZGlvOiBnZXRBdHRyaWJGdW5jKFwidHlwZVwiLCBcInJhZGlvXCIpLFxuXHRcdHJlc2V0OiBnZXRBdHRyaWJGdW5jKFwidHlwZVwiLCBcInJlc2V0XCIpLFxuXHRcdGltYWdlOiBnZXRBdHRyaWJGdW5jKFwidHlwZVwiLCBcImltYWdlXCIpLFxuXHRcdHN1Ym1pdDogZ2V0QXR0cmliRnVuYyhcInR5cGVcIiwgXCJzdWJtaXRcIilcblx0fTtcblx0cmV0dXJuIGZpbHRlcnM7XG59XG5cbmZ1bmN0aW9uIHBzZXVkb3NGYWN0b3J5KGFkYXB0ZXIpe1xuXHQvL2hlbHBlciBtZXRob2RzXG5cdGZ1bmN0aW9uIGdldEZpcnN0RWxlbWVudChlbGVtcyl7XG5cdFx0Zm9yKHZhciBpID0gMDsgZWxlbXMgJiYgaSA8IGVsZW1zLmxlbmd0aDsgaSsrKXtcblx0XHRcdGlmKGFkYXB0ZXIuaXNUYWcoZWxlbXNbaV0pKSByZXR1cm4gZWxlbXNbaV07XG5cdFx0fVxuXHR9XG5cblx0Ly93aGlsZSBmaWx0ZXJzIGFyZSBwcmVjb21waWxlZCwgcHNldWRvcyBnZXQgY2FsbGVkIHdoZW4gdGhleSBhcmUgbmVlZGVkXG5cdHZhciBwc2V1ZG9zID0ge1xuXHRcdGVtcHR5OiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHJldHVybiAhYWRhcHRlci5nZXRDaGlsZHJlbihlbGVtKS5zb21lKGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0XHRyZXR1cm4gYWRhcHRlci5pc1RhZyhlbGVtKSB8fCBlbGVtLnR5cGUgPT09IFwidGV4dFwiO1xuXHRcdFx0fSk7XG5cdFx0fSxcblxuXHRcdFwiZmlyc3QtY2hpbGRcIjogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRyZXR1cm4gZ2V0Rmlyc3RFbGVtZW50KGFkYXB0ZXIuZ2V0U2libGluZ3MoZWxlbSkpID09PSBlbGVtO1xuXHRcdH0sXG5cdFx0XCJsYXN0LWNoaWxkXCI6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0dmFyIHNpYmxpbmdzID0gYWRhcHRlci5nZXRTaWJsaW5ncyhlbGVtKTtcblxuXHRcdFx0Zm9yKHZhciBpID0gc2libGluZ3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pe1xuXHRcdFx0XHRpZihzaWJsaW5nc1tpXSA9PT0gZWxlbSkgcmV0dXJuIHRydWU7XG5cdFx0XHRcdGlmKGFkYXB0ZXIuaXNUYWcoc2libGluZ3NbaV0pKSBicmVhaztcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0sXG5cdFx0XCJmaXJzdC1vZi10eXBlXCI6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0dmFyIHNpYmxpbmdzID0gYWRhcHRlci5nZXRTaWJsaW5ncyhlbGVtKTtcblxuXHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IHNpYmxpbmdzLmxlbmd0aDsgaSsrKXtcblx0XHRcdFx0aWYoYWRhcHRlci5pc1RhZyhzaWJsaW5nc1tpXSkpe1xuXHRcdFx0XHRcdGlmKHNpYmxpbmdzW2ldID09PSBlbGVtKSByZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRpZihhZGFwdGVyLmdldE5hbWUoc2libGluZ3NbaV0pID09PSBhZGFwdGVyLmdldE5hbWUoZWxlbSkpIGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdFwibGFzdC1vZi10eXBlXCI6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0dmFyIHNpYmxpbmdzID0gYWRhcHRlci5nZXRTaWJsaW5ncyhlbGVtKTtcblxuXHRcdFx0Zm9yKHZhciBpID0gc2libGluZ3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pe1xuXHRcdFx0XHRpZihhZGFwdGVyLmlzVGFnKHNpYmxpbmdzW2ldKSl7XG5cdFx0XHRcdFx0aWYoc2libGluZ3NbaV0gPT09IGVsZW0pIHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdGlmKGFkYXB0ZXIuZ2V0TmFtZShzaWJsaW5nc1tpXSkgPT09IGFkYXB0ZXIuZ2V0TmFtZShlbGVtKSkgYnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0sXG5cdFx0XCJvbmx5LW9mLXR5cGVcIjogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHR2YXIgc2libGluZ3MgPSBhZGFwdGVyLmdldFNpYmxpbmdzKGVsZW0pO1xuXG5cdFx0XHRmb3IodmFyIGkgPSAwLCBqID0gc2libGluZ3MubGVuZ3RoOyBpIDwgajsgaSsrKXtcblx0XHRcdFx0aWYoYWRhcHRlci5pc1RhZyhzaWJsaW5nc1tpXSkpe1xuXHRcdFx0XHRcdGlmKHNpYmxpbmdzW2ldID09PSBlbGVtKSBjb250aW51ZTtcblx0XHRcdFx0XHRpZihhZGFwdGVyLmdldE5hbWUoc2libGluZ3NbaV0pID09PSBhZGFwdGVyLmdldE5hbWUoZWxlbSkpIHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXHRcdFwib25seS1jaGlsZFwiOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHZhciBzaWJsaW5ncyA9IGFkYXB0ZXIuZ2V0U2libGluZ3MoZWxlbSk7XG5cblx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzaWJsaW5ncy5sZW5ndGg7IGkrKyl7XG5cdFx0XHRcdGlmKGFkYXB0ZXIuaXNUYWcoc2libGluZ3NbaV0pICYmIHNpYmxpbmdzW2ldICE9PSBlbGVtKSByZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHQvLzptYXRjaGVzKGEsIGFyZWEsIGxpbmspW2hyZWZdXG5cdFx0bGluazogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRyZXR1cm4gYWRhcHRlci5oYXNBdHRyaWIoZWxlbSwgXCJocmVmXCIpO1xuXHRcdH0sXG5cdFx0dmlzaXRlZDogZmFsc2VGdW5jLCAvL3NlZW1zIHRvIGJlIGEgdmFsaWQgaW1wbGVtZW50YXRpb25cblx0XHQvL1RPRE86IDphbnktbGluayBvbmNlIHRoZSBuYW1lIGlzIGZpbmFsaXplZCAoYXMgYW4gYWxpYXMgb2YgOmxpbmspXG5cblx0XHQvL2Zvcm1zXG5cdFx0Ly90byBjb25zaWRlcjogOnRhcmdldFxuXG5cdFx0Ly86bWF0Y2hlcyhbc2VsZWN0ZWRdLCBzZWxlY3Q6bm90KFttdWx0aXBsZV0pOm5vdCg+IG9wdGlvbltzZWxlY3RlZF0pID4gb3B0aW9uOmZpcnN0LW9mLXR5cGUpXG5cdFx0c2VsZWN0ZWQ6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0aWYoYWRhcHRlci5oYXNBdHRyaWIoZWxlbSwgXCJzZWxlY3RlZFwiKSkgcmV0dXJuIHRydWU7XG5cdFx0XHRlbHNlIGlmKGFkYXB0ZXIuZ2V0TmFtZShlbGVtKSAhPT0gXCJvcHRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG5cdFx0XHQvL3RoZSBmaXJzdCA8b3B0aW9uPiBpbiBhIDxzZWxlY3Q+IGlzIGFsc28gc2VsZWN0ZWRcblx0XHRcdHZhciBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChlbGVtKTtcblxuXHRcdFx0aWYoXG5cdFx0XHRcdCFwYXJlbnQgfHxcblx0XHRcdFx0YWRhcHRlci5nZXROYW1lKHBhcmVudCkgIT09IFwic2VsZWN0XCIgfHxcblx0XHRcdFx0YWRhcHRlci5oYXNBdHRyaWIocGFyZW50LCBcIm11bHRpcGxlXCIpXG5cdFx0XHQpIHJldHVybiBmYWxzZTtcblxuXHRcdFx0dmFyIHNpYmxpbmdzID0gYWRhcHRlci5nZXRDaGlsZHJlbihwYXJlbnQpLFxuXHRcdFx0XHRzYXdFbGVtICA9IGZhbHNlO1xuXG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgc2libGluZ3MubGVuZ3RoOyBpKyspe1xuXHRcdFx0XHRpZihhZGFwdGVyLmlzVGFnKHNpYmxpbmdzW2ldKSl7XG5cdFx0XHRcdFx0aWYoc2libGluZ3NbaV0gPT09IGVsZW0pe1xuXHRcdFx0XHRcdFx0c2F3RWxlbSA9IHRydWU7XG5cdFx0XHRcdFx0fSBlbHNlIGlmKCFzYXdFbGVtKXtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9IGVsc2UgaWYoYWRhcHRlci5oYXNBdHRyaWIoc2libGluZ3NbaV0sIFwic2VsZWN0ZWRcIikpe1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gc2F3RWxlbTtcblx0XHR9LFxuXHRcdC8vaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2NyaXB0aW5nLmh0bWwjZGlzYWJsZWQtZWxlbWVudHNcblx0XHQvLzptYXRjaGVzKFxuXHRcdC8vICA6bWF0Y2hlcyhidXR0b24sIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBtZW51aXRlbSwgb3B0Z3JvdXAsIG9wdGlvbilbZGlzYWJsZWRdLFxuXHRcdC8vICBvcHRncm91cFtkaXNhYmxlZF0gPiBvcHRpb24pLFxuXHRcdC8vIGZpZWxkc2V0W2Rpc2FibGVkXSAqIC8vVE9ETyBub3QgY2hpbGQgb2YgZmlyc3QgPGxlZ2VuZD5cblx0XHQvLylcblx0XHRkaXNhYmxlZDogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRyZXR1cm4gYWRhcHRlci5oYXNBdHRyaWIoZWxlbSwgXCJkaXNhYmxlZFwiKTtcblx0XHR9LFxuXHRcdGVuYWJsZWQ6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0cmV0dXJuICFhZGFwdGVyLmhhc0F0dHJpYihlbGVtLCBcImRpc2FibGVkXCIpO1xuXHRcdH0sXG5cdFx0Ly86bWF0Y2hlcyg6bWF0Y2hlcyg6cmFkaW8sIDpjaGVja2JveClbY2hlY2tlZF0sIDpzZWxlY3RlZCkgKFRPRE8gbWVudWl0ZW0pXG5cdFx0Y2hlY2tlZDogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRyZXR1cm4gYWRhcHRlci5oYXNBdHRyaWIoZWxlbSwgXCJjaGVja2VkXCIpIHx8IHBzZXVkb3Muc2VsZWN0ZWQoZWxlbSk7XG5cdFx0fSxcblx0XHQvLzptYXRjaGVzKGlucHV0LCBzZWxlY3QsIHRleHRhcmVhKVtyZXF1aXJlZF1cblx0XHRyZXF1aXJlZDogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRyZXR1cm4gYWRhcHRlci5oYXNBdHRyaWIoZWxlbSwgXCJyZXF1aXJlZFwiKTtcblx0XHR9LFxuXHRcdC8vOm1hdGNoZXMoaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEpOm5vdChbcmVxdWlyZWRdKVxuXHRcdG9wdGlvbmFsOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHJldHVybiAhYWRhcHRlci5oYXNBdHRyaWIoZWxlbSwgXCJyZXF1aXJlZFwiKTtcblx0XHR9LFxuXG5cdFx0Ly9qUXVlcnkgZXh0ZW5zaW9uc1xuXG5cdFx0Ly86bm90KDplbXB0eSlcblx0XHRwYXJlbnQ6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0cmV0dXJuICFwc2V1ZG9zLmVtcHR5KGVsZW0pO1xuXHRcdH0sXG5cdFx0Ly86bWF0Y2hlcyhoMSwgaDIsIGgzLCBoNCwgaDUsIGg2KVxuXHRcdGhlYWRlcjogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHR2YXIgbmFtZSA9IGFkYXB0ZXIuZ2V0TmFtZShlbGVtKTtcblx0XHRcdHJldHVybiBuYW1lID09PSBcImgxXCIgfHxcblx0XHRcdFx0XHRuYW1lID09PSBcImgyXCIgfHxcblx0XHRcdFx0XHRuYW1lID09PSBcImgzXCIgfHxcblx0XHRcdFx0XHRuYW1lID09PSBcImg0XCIgfHxcblx0XHRcdFx0XHRuYW1lID09PSBcImg1XCIgfHxcblx0XHRcdFx0XHRuYW1lID09PSBcImg2XCI7XG5cdFx0fSxcblxuXHRcdC8vOm1hdGNoZXMoYnV0dG9uLCBpbnB1dFt0eXBlPWJ1dHRvbl0pXG5cdFx0YnV0dG9uOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHZhciBuYW1lID0gYWRhcHRlci5nZXROYW1lKGVsZW0pO1xuXHRcdFx0cmV0dXJuIG5hbWUgPT09IFwiYnV0dG9uXCIgfHxcblx0XHRcdFx0XHRuYW1lID09PSBcImlucHV0XCIgJiZcblx0XHRcdFx0XHRhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIFwidHlwZVwiKSA9PT0gXCJidXR0b25cIjtcblx0XHR9LFxuXHRcdC8vOm1hdGNoZXMoaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QsIGJ1dHRvbilcblx0XHRpbnB1dDogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHR2YXIgbmFtZSA9IGFkYXB0ZXIuZ2V0TmFtZShlbGVtKTtcblx0XHRcdHJldHVybiBuYW1lID09PSBcImlucHV0XCIgfHxcblx0XHRcdFx0XHRuYW1lID09PSBcInRleHRhcmVhXCIgfHxcblx0XHRcdFx0XHRuYW1lID09PSBcInNlbGVjdFwiIHx8XG5cdFx0XHRcdFx0bmFtZSA9PT0gXCJidXR0b25cIjtcblx0XHR9LFxuXHRcdC8vaW5wdXQ6bWF0Y2hlcyg6bm90KFt0eXBlIT0nJ10pLCBbdHlwZT0ndGV4dCcgaV0pXG5cdFx0dGV4dDogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHR2YXIgYXR0cjtcblx0XHRcdHJldHVybiBhZGFwdGVyLmdldE5hbWUoZWxlbSkgPT09IFwiaW5wdXRcIiAmJiAoXG5cdFx0XHRcdCEoYXR0ciA9IGFkYXB0ZXIuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbSwgXCJ0eXBlXCIpKSB8fFxuXHRcdFx0XHRhdHRyLnRvTG93ZXJDYXNlKCkgPT09IFwidGV4dFwiXG5cdFx0XHQpO1xuXHRcdH1cblx0fTtcblxuXHRyZXR1cm4gcHNldWRvcztcbn1cblxuZnVuY3Rpb24gdmVyaWZ5QXJncyhmdW5jLCBuYW1lLCBzdWJzZWxlY3Qpe1xuXHRpZihzdWJzZWxlY3QgPT09IG51bGwpe1xuXHRcdGlmKGZ1bmMubGVuZ3RoID4gMSAmJiBuYW1lICE9PSBcInNjb3BlXCIpe1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwicHNldWRvLXNlbGVjdG9yIDpcIiArIG5hbWUgKyBcIiByZXF1aXJlcyBhbiBhcmd1bWVudFwiKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0aWYoZnVuYy5sZW5ndGggPT09IDEpe1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwicHNldWRvLXNlbGVjdG9yIDpcIiArIG5hbWUgKyBcIiBkb2Vzbid0IGhhdmUgYW55IGFyZ3VtZW50c1wiKTtcblx0XHR9XG5cdH1cbn1cblxuLy9GSVhNRSB0aGlzIGZlZWxzIGhhY2t5XG52YXIgcmVfQ1NTMyA9IC9eKD86KD86bnRofGxhc3R8Zmlyc3R8b25seSktKD86Y2hpbGR8b2YtdHlwZSl8cm9vdHxlbXB0eXwoPzplbnxkaXMpYWJsZWR8Y2hlY2tlZHxub3QpJC87XG5cbmZ1bmN0aW9uIGZhY3RvcnkoYWRhcHRlcil7XG5cdHZhciBwc2V1ZG9zID0gcHNldWRvc0ZhY3RvcnkoYWRhcHRlcik7XG5cdHZhciBmaWx0ZXJzID0gZmlsdGVyc0ZhY3RvcnkoYWRhcHRlcik7XG5cblx0cmV0dXJuIHtcblx0XHRjb21waWxlOiBmdW5jdGlvbihuZXh0LCBkYXRhLCBvcHRpb25zLCBjb250ZXh0KXtcblx0XHRcdHZhciBuYW1lID0gZGF0YS5uYW1lLFxuXHRcdFx0XHRzdWJzZWxlY3QgPSBkYXRhLmRhdGE7XG5cblx0XHRcdGlmKG9wdGlvbnMgJiYgb3B0aW9ucy5zdHJpY3QgJiYgIXJlX0NTUzMudGVzdChuYW1lKSl7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIjpcIiArIG5hbWUgKyBcIiBpc24ndCBwYXJ0IG9mIENTUzNcIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmKHR5cGVvZiBmaWx0ZXJzW25hbWVdID09PSBcImZ1bmN0aW9uXCIpe1xuXHRcdFx0XHR2ZXJpZnlBcmdzKGZpbHRlcnNbbmFtZV0sIG5hbWUsICBzdWJzZWxlY3QpO1xuXHRcdFx0XHRyZXR1cm4gZmlsdGVyc1tuYW1lXShuZXh0LCBzdWJzZWxlY3QsIG9wdGlvbnMsIGNvbnRleHQpO1xuXHRcdFx0fSBlbHNlIGlmKHR5cGVvZiBwc2V1ZG9zW25hbWVdID09PSBcImZ1bmN0aW9uXCIpe1xuXHRcdFx0XHR2YXIgZnVuYyA9IHBzZXVkb3NbbmFtZV07XG5cdFx0XHRcdHZlcmlmeUFyZ3MoZnVuYywgbmFtZSwgc3Vic2VsZWN0KTtcblxuXHRcdFx0XHRpZihuZXh0ID09PSB0cnVlRnVuYykgcmV0dXJuIGZ1bmM7XG5cblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uIHBzZXVkb0FyZ3MoZWxlbSl7XG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmMoZWxlbSwgc3Vic2VsZWN0KSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0XHR9O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidW5tYXRjaGVkIHBzZXVkby1jbGFzcyA6XCIgKyBuYW1lKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGZpbHRlcnM6IGZpbHRlcnMsXG5cdFx0cHNldWRvczogcHNldWRvc1xuXHR9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZhY3Rvcnk7XG5cblxuLyoqKi8gfSksXG4vKiA4NyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgcGFyc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg4KSxcbiAgICBjb21waWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4OSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbnRoQ2hlY2soZm9ybXVsYSl7XG5cdHJldHVybiBjb21waWxlKHBhcnNlKGZvcm11bGEpKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzLnBhcnNlID0gcGFyc2U7XG5tb2R1bGUuZXhwb3J0cy5jb21waWxlID0gY29tcGlsZTtcblxuLyoqKi8gfSksXG4vKiA4OCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlO1xuXG4vL2ZvbGxvd2luZyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jbnRoLWNoaWxkLXBzZXVkb1xuXG4vL1sgWyctJ3wnKyddPyBJTlRFR0VSPyB7Tn0gWyBTKiBbJy0nfCcrJ10gUyogSU5URUdFUiBdP1xudmFyIHJlX250aEVsZW1lbnQgPSAvXihbK1xcLV0/XFxkKm4pP1xccyooPzooWytcXC1dPylcXHMqKFxcZCspKT8kLztcblxuLypcblx0cGFyc2VzIGEgbnRoLWNoZWNrIGZvcm11bGEsIHJldHVybnMgYW4gYXJyYXkgb2YgdHdvIG51bWJlcnNcbiovXG5mdW5jdGlvbiBwYXJzZShmb3JtdWxhKXtcblx0Zm9ybXVsYSA9IGZvcm11bGEudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG5cblx0aWYoZm9ybXVsYSA9PT0gXCJldmVuXCIpe1xuXHRcdHJldHVybiBbMiwgMF07XG5cdH0gZWxzZSBpZihmb3JtdWxhID09PSBcIm9kZFwiKXtcblx0XHRyZXR1cm4gWzIsIDFdO1xuXHR9IGVsc2Uge1xuXHRcdHZhciBwYXJzZWQgPSBmb3JtdWxhLm1hdGNoKHJlX250aEVsZW1lbnQpO1xuXG5cdFx0aWYoIXBhcnNlZCl7XG5cdFx0XHR0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJuLXRoIHJ1bGUgY291bGRuJ3QgYmUgcGFyc2VkICgnXCIgKyBmb3JtdWxhICsgXCInKVwiKTtcblx0XHR9XG5cblx0XHR2YXIgYTtcblxuXHRcdGlmKHBhcnNlZFsxXSl7XG5cdFx0XHRhID0gcGFyc2VJbnQocGFyc2VkWzFdLCAxMCk7XG5cdFx0XHRpZihpc05hTihhKSl7XG5cdFx0XHRcdGlmKHBhcnNlZFsxXS5jaGFyQXQoMCkgPT09IFwiLVwiKSBhID0gLTE7XG5cdFx0XHRcdGVsc2UgYSA9IDE7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGEgPSAwO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdGEsXG5cdFx0XHRwYXJzZWRbM10gPyBwYXJzZUludCgocGFyc2VkWzJdIHx8IFwiXCIpICsgcGFyc2VkWzNdLCAxMCkgOiAwXG5cdFx0XTtcblx0fVxufVxuXG5cbi8qKiovIH0pLFxuLyogODkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxubW9kdWxlLmV4cG9ydHMgPSBjb21waWxlO1xuXG52YXIgQmFzZUZ1bmNzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KSxcbiAgICB0cnVlRnVuYyAgPSBCYXNlRnVuY3MudHJ1ZUZ1bmMsXG4gICAgZmFsc2VGdW5jID0gQmFzZUZ1bmNzLmZhbHNlRnVuYztcblxuLypcblx0cmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmIGFuIGVsZW1lbnRzIGluZGV4IG1hdGNoZXMgdGhlIGdpdmVuIHJ1bGVcblx0aGlnaGx5IG9wdGltaXplZCB0byByZXR1cm4gdGhlIGZhc3Rlc3Qgc29sdXRpb25cbiovXG5mdW5jdGlvbiBjb21waWxlKHBhcnNlZCl7XG5cdHZhciBhID0gcGFyc2VkWzBdLFxuXHQgICAgYiA9IHBhcnNlZFsxXSAtIDE7XG5cblx0Ly93aGVuIGIgPD0gMCwgYSpuIHdvbid0IGJlIHBvc3NpYmxlIGZvciBhbnkgbWF0Y2hlcyB3aGVuIGEgPCAwXG5cdC8vYmVzaWRlcywgdGhlIHNwZWNpZmljYXRpb24gc2F5cyB0aGF0IG5vIGVsZW1lbnQgaXMgbWF0Y2hlZCB3aGVuIGEgYW5kIGIgYXJlIDBcblx0aWYoYiA8IDAgJiYgYSA8PSAwKSByZXR1cm4gZmFsc2VGdW5jO1xuXG5cdC8vd2hlbiBhIGlzIGluIHRoZSByYW5nZSAtMS4uMSwgaXQgbWF0Y2hlcyBhbnkgZWxlbWVudCAoc28gb25seSBiIGlzIGNoZWNrZWQpXG5cdGlmKGEgPT09LTEpIHJldHVybiBmdW5jdGlvbihwb3MpeyByZXR1cm4gcG9zIDw9IGI7IH07XG5cdGlmKGEgPT09IDApIHJldHVybiBmdW5jdGlvbihwb3MpeyByZXR1cm4gcG9zID09PSBiOyB9O1xuXHQvL3doZW4gYiA8PSAwIGFuZCBhID09PSAxLCB0aGV5IG1hdGNoIGFueSBlbGVtZW50XG5cdGlmKGEgPT09IDEpIHJldHVybiBiIDwgMCA/IHRydWVGdW5jIDogZnVuY3Rpb24ocG9zKXsgcmV0dXJuIHBvcyA+PSBiOyB9O1xuXG5cdC8vd2hlbiBhID4gMCwgbW9kdWxvIGNhbiBiZSB1c2VkIHRvIGNoZWNrIGlmIHRoZXJlIGlzIGEgbWF0Y2hcblx0dmFyIGJNb2QgPSBiICUgYTtcblx0aWYoYk1vZCA8IDApIGJNb2QgKz0gYTtcblxuXHRpZihhID4gMSl7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uKHBvcyl7XG5cdFx0XHRyZXR1cm4gcG9zID49IGIgJiYgcG9zICUgYSA9PT0gYk1vZDtcblx0XHR9O1xuXHR9XG5cblx0YSAqPSAtMTsgLy9tYWtlIGBhYCBwb3NpdGl2ZVxuXG5cdHJldHVybiBmdW5jdGlvbihwb3Mpe1xuXHRcdHJldHVybiBwb3MgPD0gYiAmJiBwb3MgJSBhID09PSBiTW9kO1xuXHR9O1xufVxuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG59KTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jc3Mtc2VsZWN0LXVtZC9kaXN0L2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9jc3Mtc2VsZWN0LXVtZC9kaXN0L2luZGV4LmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIi8qIVxuXG4gZGlmZiB2My40LjBcblxuU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKVxuXG5Db3B5cmlnaHQgKGMpIDIwMDktMjAxNSwgS2V2aW4gRGVja2VyIDxrcGRlY2tlckBnbWFpbC5jb20+XG5cbkFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cblJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbixcbmFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlXG4gIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGVcbiAgZm9sbG93aW5nIGRpc2NsYWltZXIuXG5cbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZVxuICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlXG4gIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlclxuICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgS2V2aW4gRGVja2VyIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4gIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHNcbiAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvclxuICB3cml0dGVuIHBlcm1pc3Npb24uXG5cblRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUlxuSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EXG5GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUlxuQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTFxuREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLFxuREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVJcbklOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVRcbk9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbkBsaWNlbnNlXG4qL1xuKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiSnNEaWZmXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIkpzRGlmZlwiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9LFxuLyoqKioqKi8gXHRcdFx0aWQ6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bG9hZGVkOiBmYWxzZVxuLyoqKioqKi8gXHRcdH07XG5cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG5cblxuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyd1c2Ugc3RyaWN0JztcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLmNhbm9uaWNhbGl6ZSA9IGV4cG9ydHMuY29udmVydENoYW5nZXNUb1hNTCA9IGV4cG9ydHMuY29udmVydENoYW5nZXNUb0RNUCA9IGV4cG9ydHMubWVyZ2UgPSBleHBvcnRzLnBhcnNlUGF0Y2ggPSBleHBvcnRzLmFwcGx5UGF0Y2hlcyA9IGV4cG9ydHMuYXBwbHlQYXRjaCA9IGV4cG9ydHMuY3JlYXRlUGF0Y2ggPSBleHBvcnRzLmNyZWF0ZVR3b0ZpbGVzUGF0Y2ggPSBleHBvcnRzLnN0cnVjdHVyZWRQYXRjaCA9IGV4cG9ydHMuZGlmZkFycmF5cyA9IGV4cG9ydHMuZGlmZkpzb24gPSBleHBvcnRzLmRpZmZDc3MgPSBleHBvcnRzLmRpZmZTZW50ZW5jZXMgPSBleHBvcnRzLmRpZmZUcmltbWVkTGluZXMgPSBleHBvcnRzLmRpZmZMaW5lcyA9IGV4cG9ydHMuZGlmZldvcmRzV2l0aFNwYWNlID0gZXhwb3J0cy5kaWZmV29yZHMgPSBleHBvcnRzLmRpZmZDaGFycyA9IGV4cG9ydHMuRGlmZiA9IHVuZGVmaW5lZDtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3ZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2Jhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2Jhc2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYmFzZSk7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgZW5kKi92YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19jaGFyYWN0ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX3dvcmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2xpbmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX3NlbnRlbmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19jc3MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2pzb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2FycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19hcHBseSA9IF9fd2VicGFja19yZXF1aXJlX18oMTApIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX3BhcnNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fbWVyZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19jcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19kbXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL194bWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3KSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5cdC8qIFNlZSBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zIG9mIHVzZSAqL1xuXG5cdC8qXG5cdCAqIFRleHQgZGlmZiBpbXBsZW1lbnRhdGlvbi5cblx0ICpcblx0ICogVGhpcyBsaWJyYXJ5IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgQVBJUzpcblx0ICogSnNEaWZmLmRpZmZDaGFyczogQ2hhcmFjdGVyIGJ5IGNoYXJhY3RlciBkaWZmXG5cdCAqIEpzRGlmZi5kaWZmV29yZHM6IFdvcmQgKGFzIGRlZmluZWQgYnkgXFxiIHJlZ2V4KSBkaWZmIHdoaWNoIGlnbm9yZXMgd2hpdGVzcGFjZVxuXHQgKiBKc0RpZmYuZGlmZkxpbmVzOiBMaW5lIGJhc2VkIGRpZmZcblx0ICpcblx0ICogSnNEaWZmLmRpZmZDc3M6IERpZmYgdGFyZ2V0ZWQgYXQgQ1NTIGNvbnRlbnRcblx0ICpcblx0ICogVGhlc2UgbWV0aG9kcyBhcmUgYmFzZWQgb24gdGhlIGltcGxlbWVudGF0aW9uIHByb3Bvc2VkIGluXG5cdCAqIFwiQW4gTyhORCkgRGlmZmVyZW5jZSBBbGdvcml0aG0gYW5kIGl0cyBWYXJpYXRpb25zXCIgKE15ZXJzLCAxOTg2KS5cblx0ICogaHR0cDovL2NpdGVzZWVyeC5pc3QucHN1LmVkdS92aWV3ZG9jL3N1bW1hcnk/ZG9pPTEwLjEuMS40LjY5Mjdcblx0ICovXG5cdGV4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovRGlmZiA9IF9iYXNlMlsnZGVmYXVsdCddO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9kaWZmQ2hhcnMgPSBfY2hhcmFjdGVyLmRpZmZDaGFycztcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZldvcmRzID0gX3dvcmQuZGlmZldvcmRzO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9kaWZmV29yZHNXaXRoU3BhY2UgPSBfd29yZC5kaWZmV29yZHNXaXRoU3BhY2U7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2RpZmZMaW5lcyA9IF9saW5lLmRpZmZMaW5lcztcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZlRyaW1tZWRMaW5lcyA9IF9saW5lLmRpZmZUcmltbWVkTGluZXM7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2RpZmZTZW50ZW5jZXMgPSBfc2VudGVuY2UuZGlmZlNlbnRlbmNlcztcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZkNzcyA9IF9jc3MuZGlmZkNzcztcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZkpzb24gPSBfanNvbi5kaWZmSnNvbjtcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZkFycmF5cyA9IF9hcnJheS5kaWZmQXJyYXlzO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9zdHJ1Y3R1cmVkUGF0Y2ggPSBfY3JlYXRlLnN0cnVjdHVyZWRQYXRjaDtcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovY3JlYXRlVHdvRmlsZXNQYXRjaCA9IF9jcmVhdGUuY3JlYXRlVHdvRmlsZXNQYXRjaDtcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovY3JlYXRlUGF0Y2ggPSBfY3JlYXRlLmNyZWF0ZVBhdGNoO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9hcHBseVBhdGNoID0gX2FwcGx5LmFwcGx5UGF0Y2g7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2FwcGx5UGF0Y2hlcyA9IF9hcHBseS5hcHBseVBhdGNoZXM7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3BhcnNlUGF0Y2ggPSBfcGFyc2UucGFyc2VQYXRjaDtcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovbWVyZ2UgPSBfbWVyZ2UubWVyZ2U7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2NvbnZlcnRDaGFuZ2VzVG9ETVAgPSBfZG1wLmNvbnZlcnRDaGFuZ2VzVG9ETVA7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2NvbnZlcnRDaGFuZ2VzVG9YTUwgPSBfeG1sLmNvbnZlcnRDaGFuZ2VzVG9YTUw7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2Nhbm9uaWNhbGl6ZSA9IF9qc29uLmNhbm9uaWNhbGl6ZTtcblx0Ly8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUwzTnlZeTlwYm1SbGVDNXFjeUpkTENKdVlXMWxjeUk2V3lKRWFXWm1JaXdpWkdsbVprTm9ZWEp6SWl3aVpHbG1abGR2Y21Seklpd2laR2xtWmxkdmNtUnpWMmwwYUZOd1lXTmxJaXdpWkdsbVpreHBibVZ6SWl3aVpHbG1abFJ5YVcxdFpXUk1hVzVsY3lJc0ltUnBabVpUWlc1MFpXNWpaWE1pTENKa2FXWm1RM056SWl3aVpHbG1aa3B6YjI0aUxDSmthV1ptUVhKeVlYbHpJaXdpYzNSeWRXTjBkWEpsWkZCaGRHTm9JaXdpWTNKbFlYUmxWSGR2Um1sc1pYTlFZWFJqYUNJc0ltTnlaV0YwWlZCaGRHTm9JaXdpWVhCd2JIbFFZWFJqYUNJc0ltRndjR3g1VUdGMFkyaGxjeUlzSW5CaGNuTmxVR0YwWTJnaUxDSnRaWEpuWlNJc0ltTnZiblpsY25SRGFHRnVaMlZ6Vkc5RVRWQWlMQ0pqYjI1MlpYSjBRMmhoYm1kbGMxUnZXRTFNSWl3aVkyRnViMjVwWTJGc2FYcGxJbDBzSW0xaGNIQnBibWR6SWpvaU96czdPenQxUWtGblFrRTdPenM3ZFVKQlEwRTdPMEZCUTBFN08wRkJRMEU3TzBGQlEwRTdPMEZCUlVFN08wRkJRMEU3TzBGQlJVRTdPMEZCUlVFN08wRkJRMEU3TzBGQlEwRTdPMEZCUTBFN08wRkJSVUU3TzBGQlEwRTdPenM3UVVGcVEwRTdPMEZCUlVFN096czdPenM3T3pzN096czdPMmREUVd0RFJVRXNTVHQ1UkVGRlFVTXNVenQ1UkVGRFFVTXNVenQ1UkVGRFFVTXNhMEk3ZVVSQlEwRkRMRk03ZVVSQlEwRkRMR2RDTzNsRVFVTkJReXhoTzNsRVFVVkJReXhQTzNsRVFVTkJReXhSTzNsRVFVVkJReXhWTzNsRVFVVkJReXhsTzNsRVFVTkJReXh0UWp0NVJFRkRRVU1zVnp0NVJFRkRRVU1zVlR0NVJFRkRRVU1zV1R0NVJFRkRRVU1zVlR0NVJFRkRRVU1zU3p0NVJFRkRRVU1zYlVJN2VVUkJRMEZETEcxQ08zbEVRVU5CUXl4Wklpd2labWxzWlNJNkltbHVaR1Y0TG1weklpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lMeW9nVTJWbElFeEpRMFZPVTBVZ1ptbHNaU0JtYjNJZ2RHVnliWE1nYjJZZ2RYTmxJQ292WEc1Y2JpOHFYRzRnS2lCVVpYaDBJR1JwWm1ZZ2FXMXdiR1Z0Wlc1MFlYUnBiMjR1WEc0Z0tseHVJQ29nVkdocGN5QnNhV0p5WVhKNUlITjFjSEJ2Y25SeklIUm9aU0JtYjJ4c2IzZHBibWNnUVZCSlV6cGNiaUFxSUVwelJHbG1aaTVrYVdabVEyaGhjbk02SUVOb1lYSmhZM1JsY2lCaWVTQmphR0Z5WVdOMFpYSWdaR2xtWmx4dUlDb2dTbk5FYVdabUxtUnBabVpYYjNKa2N6b2dWMjl5WkNBb1lYTWdaR1ZtYVc1bFpDQmllU0JjWEdJZ2NtVm5aWGdwSUdScFptWWdkMmhwWTJnZ2FXZHViM0psY3lCM2FHbDBaWE53WVdObFhHNGdLaUJLYzBScFptWXVaR2xtWmt4cGJtVnpPaUJNYVc1bElHSmhjMlZrSUdScFptWmNiaUFxWEc0Z0tpQktjMFJwWm1ZdVpHbG1aa056Y3pvZ1JHbG1aaUIwWVhKblpYUmxaQ0JoZENCRFUxTWdZMjl1ZEdWdWRGeHVJQ3BjYmlBcUlGUm9aWE5sSUcxbGRHaHZaSE1nWVhKbElHSmhjMlZrSUc5dUlIUm9aU0JwYlhCc1pXMWxiblJoZEdsdmJpQndjbTl3YjNObFpDQnBibHh1SUNvZ1hDSkJiaUJQS0U1RUtTQkVhV1ptWlhKbGJtTmxJRUZzWjI5eWFYUm9iU0JoYm1RZ2FYUnpJRlpoY21saGRHbHZibk5jSWlBb1RYbGxjbk1zSURFNU9EWXBMbHh1SUNvZ2FIUjBjRG92TDJOcGRHVnpaV1Z5ZUM1cGMzUXVjSE4xTG1Wa2RTOTJhV1YzWkc5akwzTjFiVzFoY25rL1pHOXBQVEV3TGpFdU1TNDBMalk1TWpkY2JpQXFMMXh1YVcxd2IzSjBJRVJwWm1ZZ1puSnZiU0FuTGk5a2FXWm1MMkpoYzJVbk8xeHVhVzF3YjNKMElIdGthV1ptUTJoaGNuTjlJR1p5YjIwZ0p5NHZaR2xtWmk5amFHRnlZV04wWlhJbk8xeHVhVzF3YjNKMElIdGthV1ptVjI5eVpITXNJR1JwWm1aWGIzSmtjMWRwZEdoVGNHRmpaWDBnWm5KdmJTQW5MaTlrYVdabUwzZHZjbVFuTzF4dWFXMXdiM0owSUh0a2FXWm1UR2x1WlhNc0lHUnBabVpVY21sdGJXVmtUR2x1WlhOOUlHWnliMjBnSnk0dlpHbG1aaTlzYVc1bEp6dGNibWx0Y0c5eWRDQjdaR2xtWmxObGJuUmxibU5sYzMwZ1puSnZiU0FuTGk5a2FXWm1MM05sYm5SbGJtTmxKenRjYmx4dWFXMXdiM0owSUh0a2FXWm1RM056ZlNCbWNtOXRJQ2N1TDJScFptWXZZM056Snp0Y2JtbHRjRzl5ZENCN1pHbG1aa3B6YjI0c0lHTmhibTl1YVdOaGJHbDZaWDBnWm5KdmJTQW5MaTlrYVdabUwycHpiMjRuTzF4dVhHNXBiWEJ2Y25RZ2UyUnBabVpCY25KaGVYTjlJR1p5YjIwZ0p5NHZaR2xtWmk5aGNuSmhlU2M3WEc1Y2JtbHRjRzl5ZENCN1lYQndiSGxRWVhSamFDd2dZWEJ3YkhsUVlYUmphR1Z6ZlNCbWNtOXRJQ2N1TDNCaGRHTm9MMkZ3Y0d4NUp6dGNibWx0Y0c5eWRDQjdjR0Z5YzJWUVlYUmphSDBnWm5KdmJTQW5MaTl3WVhSamFDOXdZWEp6WlNjN1hHNXBiWEJ2Y25RZ2UyMWxjbWRsZlNCbWNtOXRJQ2N1TDNCaGRHTm9MMjFsY21kbEp6dGNibWx0Y0c5eWRDQjdjM1J5ZFdOMGRYSmxaRkJoZEdOb0xDQmpjbVZoZEdWVWQyOUdhV3hsYzFCaGRHTm9MQ0JqY21WaGRHVlFZWFJqYUgwZ1puSnZiU0FuTGk5d1lYUmphQzlqY21WaGRHVW5PMXh1WEc1cGJYQnZjblFnZTJOdmJuWmxjblJEYUdGdVoyVnpWRzlFVFZCOUlHWnliMjBnSnk0dlkyOXVkbVZ5ZEM5a2JYQW5PMXh1YVcxd2IzSjBJSHRqYjI1MlpYSjBRMmhoYm1kbGMxUnZXRTFNZlNCbWNtOXRJQ2N1TDJOdmJuWmxjblF2ZUcxc0p6dGNibHh1Wlhod2IzSjBJSHRjYmlBZ1JHbG1aaXhjYmx4dUlDQmthV1ptUTJoaGNuTXNYRzRnSUdScFptWlhiM0prY3l4Y2JpQWdaR2xtWmxkdmNtUnpWMmwwYUZOd1lXTmxMRnh1SUNCa2FXWm1UR2x1WlhNc1hHNGdJR1JwWm1aVWNtbHRiV1ZrVEdsdVpYTXNYRzRnSUdScFptWlRaVzUwWlc1alpYTXNYRzVjYmlBZ1pHbG1aa056Y3l4Y2JpQWdaR2xtWmtwemIyNHNYRzVjYmlBZ1pHbG1aa0Z5Y21GNWN5eGNibHh1SUNCemRISjFZM1IxY21Wa1VHRjBZMmdzWEc0Z0lHTnlaV0YwWlZSM2IwWnBiR1Z6VUdGMFkyZ3NYRzRnSUdOeVpXRjBaVkJoZEdOb0xGeHVJQ0JoY0hCc2VWQmhkR05vTEZ4dUlDQmhjSEJzZVZCaGRHTm9aWE1zWEc0Z0lIQmhjbk5sVUdGMFkyZ3NYRzRnSUcxbGNtZGxMRnh1SUNCamIyNTJaWEowUTJoaGJtZGxjMVJ2UkUxUUxGeHVJQ0JqYjI1MlpYSjBRMmhoYm1kbGMxUnZXRTFNTEZ4dUlDQmpZVzV2Ym1sallXeHBlbVZjYm4wN1hHNGlYWDA9XG5cblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyd1c2Ugc3RyaWN0JztcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzWydkZWZhdWx0J10gPSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL0RpZmY7XG5cdGZ1bmN0aW9uIERpZmYoKSB7fVxuXG5cdERpZmYucHJvdG90eXBlID0ge1xuXHQgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9kaWZmOiBmdW5jdGlvbiBkaWZmKG9sZFN0cmluZywgbmV3U3RyaW5nKSB7XG5cdCAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIC8qaXN0YW5idWwgaWdub3JlIGVuZCovb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cblx0ICAgIHZhciBjYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2s7XG5cdCAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuXHQgICAgICBvcHRpb25zID0ge307XG5cdCAgICB9XG5cdCAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG5cdCAgICB2YXIgc2VsZiA9IHRoaXM7XG5cblx0ICAgIGZ1bmN0aW9uIGRvbmUodmFsdWUpIHtcblx0ICAgICAgaWYgKGNhbGxiYWNrKSB7XG5cdCAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICBjYWxsYmFjayh1bmRlZmluZWQsIHZhbHVlKTtcblx0ICAgICAgICB9LCAwKTtcblx0ICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICByZXR1cm4gdmFsdWU7XG5cdCAgICAgIH1cblx0ICAgIH1cblxuXHQgICAgLy8gQWxsb3cgc3ViY2xhc3NlcyB0byBtYXNzYWdlIHRoZSBpbnB1dCBwcmlvciB0byBydW5uaW5nXG5cdCAgICBvbGRTdHJpbmcgPSB0aGlzLmNhc3RJbnB1dChvbGRTdHJpbmcpO1xuXHQgICAgbmV3U3RyaW5nID0gdGhpcy5jYXN0SW5wdXQobmV3U3RyaW5nKTtcblxuXHQgICAgb2xkU3RyaW5nID0gdGhpcy5yZW1vdmVFbXB0eSh0aGlzLnRva2VuaXplKG9sZFN0cmluZykpO1xuXHQgICAgbmV3U3RyaW5nID0gdGhpcy5yZW1vdmVFbXB0eSh0aGlzLnRva2VuaXplKG5ld1N0cmluZykpO1xuXG5cdCAgICB2YXIgbmV3TGVuID0gbmV3U3RyaW5nLmxlbmd0aCxcblx0ICAgICAgICBvbGRMZW4gPSBvbGRTdHJpbmcubGVuZ3RoO1xuXHQgICAgdmFyIGVkaXRMZW5ndGggPSAxO1xuXHQgICAgdmFyIG1heEVkaXRMZW5ndGggPSBuZXdMZW4gKyBvbGRMZW47XG5cdCAgICB2YXIgYmVzdFBhdGggPSBbeyBuZXdQb3M6IC0xLCBjb21wb25lbnRzOiBbXSB9XTtcblxuXHQgICAgLy8gU2VlZCBlZGl0TGVuZ3RoID0gMCwgaS5lLiB0aGUgY29udGVudCBzdGFydHMgd2l0aCB0aGUgc2FtZSB2YWx1ZXNcblx0ICAgIHZhciBvbGRQb3MgPSB0aGlzLmV4dHJhY3RDb21tb24oYmVzdFBhdGhbMF0sIG5ld1N0cmluZywgb2xkU3RyaW5nLCAwKTtcblx0ICAgIGlmIChiZXN0UGF0aFswXS5uZXdQb3MgKyAxID49IG5ld0xlbiAmJiBvbGRQb3MgKyAxID49IG9sZExlbikge1xuXHQgICAgICAvLyBJZGVudGl0eSBwZXIgdGhlIGVxdWFsaXR5IGFuZCB0b2tlbml6ZXJcblx0ICAgICAgcmV0dXJuIGRvbmUoW3sgdmFsdWU6IHRoaXMuam9pbihuZXdTdHJpbmcpLCBjb3VudDogbmV3U3RyaW5nLmxlbmd0aCB9XSk7XG5cdCAgICB9XG5cblx0ICAgIC8vIE1haW4gd29ya2VyIG1ldGhvZC4gY2hlY2tzIGFsbCBwZXJtdXRhdGlvbnMgb2YgYSBnaXZlbiBlZGl0IGxlbmd0aCBmb3IgYWNjZXB0YW5jZS5cblx0ICAgIGZ1bmN0aW9uIGV4ZWNFZGl0TGVuZ3RoKCkge1xuXHQgICAgICBmb3IgKHZhciBkaWFnb25hbFBhdGggPSAtMSAqIGVkaXRMZW5ndGg7IGRpYWdvbmFsUGF0aCA8PSBlZGl0TGVuZ3RoOyBkaWFnb25hbFBhdGggKz0gMikge1xuXHQgICAgICAgIHZhciBiYXNlUGF0aCA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92b2lkIDAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cdCAgICAgICAgdmFyIGFkZFBhdGggPSBiZXN0UGF0aFtkaWFnb25hbFBhdGggLSAxXSxcblx0ICAgICAgICAgICAgcmVtb3ZlUGF0aCA9IGJlc3RQYXRoW2RpYWdvbmFsUGF0aCArIDFdLFxuXHQgICAgICAgICAgICBfb2xkUG9zID0gKHJlbW92ZVBhdGggPyByZW1vdmVQYXRoLm5ld1BvcyA6IDApIC0gZGlhZ29uYWxQYXRoO1xuXHQgICAgICAgIGlmIChhZGRQYXRoKSB7XG5cdCAgICAgICAgICAvLyBObyBvbmUgZWxzZSBpcyBnb2luZyB0byBhdHRlbXB0IHRvIHVzZSB0aGlzIHZhbHVlLCBjbGVhciBpdFxuXHQgICAgICAgICAgYmVzdFBhdGhbZGlhZ29uYWxQYXRoIC0gMV0gPSB1bmRlZmluZWQ7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgdmFyIGNhbkFkZCA9IGFkZFBhdGggJiYgYWRkUGF0aC5uZXdQb3MgKyAxIDwgbmV3TGVuLFxuXHQgICAgICAgICAgICBjYW5SZW1vdmUgPSByZW1vdmVQYXRoICYmIDAgPD0gX29sZFBvcyAmJiBfb2xkUG9zIDwgb2xkTGVuO1xuXHQgICAgICAgIGlmICghY2FuQWRkICYmICFjYW5SZW1vdmUpIHtcblx0ICAgICAgICAgIC8vIElmIHRoaXMgcGF0aCBpcyBhIHRlcm1pbmFsIHRoZW4gcHJ1bmVcblx0ICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aF0gPSB1bmRlZmluZWQ7XG5cdCAgICAgICAgICBjb250aW51ZTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyBTZWxlY3QgdGhlIGRpYWdvbmFsIHRoYXQgd2Ugd2FudCB0byBicmFuY2ggZnJvbS4gV2Ugc2VsZWN0IHRoZSBwcmlvclxuXHQgICAgICAgIC8vIHBhdGggd2hvc2UgcG9zaXRpb24gaW4gdGhlIG5ldyBzdHJpbmcgaXMgdGhlIGZhcnRoZXN0IGZyb20gdGhlIG9yaWdpblxuXHQgICAgICAgIC8vIGFuZCBkb2VzIG5vdCBwYXNzIHRoZSBib3VuZHMgb2YgdGhlIGRpZmYgZ3JhcGhcblx0ICAgICAgICBpZiAoIWNhbkFkZCB8fCBjYW5SZW1vdmUgJiYgYWRkUGF0aC5uZXdQb3MgPCByZW1vdmVQYXRoLm5ld1Bvcykge1xuXHQgICAgICAgICAgYmFzZVBhdGggPSBjbG9uZVBhdGgocmVtb3ZlUGF0aCk7XG5cdCAgICAgICAgICBzZWxmLnB1c2hDb21wb25lbnQoYmFzZVBhdGguY29tcG9uZW50cywgdW5kZWZpbmVkLCB0cnVlKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgYmFzZVBhdGggPSBhZGRQYXRoOyAvLyBObyBuZWVkIHRvIGNsb25lLCB3ZSd2ZSBwdWxsZWQgaXQgZnJvbSB0aGUgbGlzdFxuXHQgICAgICAgICAgYmFzZVBhdGgubmV3UG9zKys7XG5cdCAgICAgICAgICBzZWxmLnB1c2hDb21wb25lbnQoYmFzZVBhdGguY29tcG9uZW50cywgdHJ1ZSwgdW5kZWZpbmVkKTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBfb2xkUG9zID0gc2VsZi5leHRyYWN0Q29tbW9uKGJhc2VQYXRoLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgZGlhZ29uYWxQYXRoKTtcblxuXHQgICAgICAgIC8vIElmIHdlIGhhdmUgaGl0IHRoZSBlbmQgb2YgYm90aCBzdHJpbmdzLCB0aGVuIHdlIGFyZSBkb25lXG5cdCAgICAgICAgaWYgKGJhc2VQYXRoLm5ld1BvcyArIDEgPj0gbmV3TGVuICYmIF9vbGRQb3MgKyAxID49IG9sZExlbikge1xuXHQgICAgICAgICAgcmV0dXJuIGRvbmUoYnVpbGRWYWx1ZXMoc2VsZiwgYmFzZVBhdGguY29tcG9uZW50cywgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIHNlbGYudXNlTG9uZ2VzdFRva2VuKSk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIC8vIE90aGVyd2lzZSB0cmFjayB0aGlzIHBhdGggYXMgYSBwb3RlbnRpYWwgY2FuZGlkYXRlIGFuZCBjb250aW51ZS5cblx0ICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aF0gPSBiYXNlUGF0aDtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblxuXHQgICAgICBlZGl0TGVuZ3RoKys7XG5cdCAgICB9XG5cblx0ICAgIC8vIFBlcmZvcm1zIHRoZSBsZW5ndGggb2YgZWRpdCBpdGVyYXRpb24uIElzIGEgYml0IGZ1Z2x5IGFzIHRoaXMgaGFzIHRvIHN1cHBvcnQgdGhlXG5cdCAgICAvLyBzeW5jIGFuZCBhc3luYyBtb2RlIHdoaWNoIGlzIG5ldmVyIGZ1bi4gTG9vcHMgb3ZlciBleGVjRWRpdExlbmd0aCB1bnRpbCBhIHZhbHVlXG5cdCAgICAvLyBpcyBwcm9kdWNlZC5cblx0ICAgIGlmIChjYWxsYmFjaykge1xuXHQgICAgICAoZnVuY3Rpb24gZXhlYygpIHtcblx0ICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCB3ZSB3YW50IHRvIGJlIHNhZmUuXG5cdCAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXHQgICAgICAgICAgaWYgKGVkaXRMZW5ndGggPiBtYXhFZGl0TGVuZ3RoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuXHQgICAgICAgICAgfVxuXG5cdCAgICAgICAgICBpZiAoIWV4ZWNFZGl0TGVuZ3RoKCkpIHtcblx0ICAgICAgICAgICAgZXhlYygpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0sIDApO1xuXHQgICAgICB9KSgpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgd2hpbGUgKGVkaXRMZW5ndGggPD0gbWF4RWRpdExlbmd0aCkge1xuXHQgICAgICAgIHZhciByZXQgPSBleGVjRWRpdExlbmd0aCgpO1xuXHQgICAgICAgIGlmIChyZXQpIHtcblx0ICAgICAgICAgIHJldHVybiByZXQ7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovIC8qaXN0YW5idWwgaWdub3JlIGVuZCovcHVzaENvbXBvbmVudDogZnVuY3Rpb24gcHVzaENvbXBvbmVudChjb21wb25lbnRzLCBhZGRlZCwgcmVtb3ZlZCkge1xuXHQgICAgdmFyIGxhc3QgPSBjb21wb25lbnRzW2NvbXBvbmVudHMubGVuZ3RoIC0gMV07XG5cdCAgICBpZiAobGFzdCAmJiBsYXN0LmFkZGVkID09PSBhZGRlZCAmJiBsYXN0LnJlbW92ZWQgPT09IHJlbW92ZWQpIHtcblx0ICAgICAgLy8gV2UgbmVlZCB0byBjbG9uZSBoZXJlIGFzIHRoZSBjb21wb25lbnQgY2xvbmUgb3BlcmF0aW9uIGlzIGp1c3Rcblx0ICAgICAgLy8gYXMgc2hhbGxvdyBhcnJheSBjbG9uZVxuXHQgICAgICBjb21wb25lbnRzW2NvbXBvbmVudHMubGVuZ3RoIC0gMV0gPSB7IGNvdW50OiBsYXN0LmNvdW50ICsgMSwgYWRkZWQ6IGFkZGVkLCByZW1vdmVkOiByZW1vdmVkIH07XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBjb21wb25lbnRzLnB1c2goeyBjb3VudDogMSwgYWRkZWQ6IGFkZGVkLCByZW1vdmVkOiByZW1vdmVkIH0pO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2V4dHJhY3RDb21tb246IGZ1bmN0aW9uIGV4dHJhY3RDb21tb24oYmFzZVBhdGgsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBkaWFnb25hbFBhdGgpIHtcblx0ICAgIHZhciBuZXdMZW4gPSBuZXdTdHJpbmcubGVuZ3RoLFxuXHQgICAgICAgIG9sZExlbiA9IG9sZFN0cmluZy5sZW5ndGgsXG5cdCAgICAgICAgbmV3UG9zID0gYmFzZVBhdGgubmV3UG9zLFxuXHQgICAgICAgIG9sZFBvcyA9IG5ld1BvcyAtIGRpYWdvbmFsUGF0aCxcblx0ICAgICAgICBjb21tb25Db3VudCA9IDA7XG5cdCAgICB3aGlsZSAobmV3UG9zICsgMSA8IG5ld0xlbiAmJiBvbGRQb3MgKyAxIDwgb2xkTGVuICYmIHRoaXMuZXF1YWxzKG5ld1N0cmluZ1tuZXdQb3MgKyAxXSwgb2xkU3RyaW5nW29sZFBvcyArIDFdKSkge1xuXHQgICAgICBuZXdQb3MrKztcblx0ICAgICAgb2xkUG9zKys7XG5cdCAgICAgIGNvbW1vbkNvdW50Kys7XG5cdCAgICB9XG5cblx0ICAgIGlmIChjb21tb25Db3VudCkge1xuXHQgICAgICBiYXNlUGF0aC5jb21wb25lbnRzLnB1c2goeyBjb3VudDogY29tbW9uQ291bnQgfSk7XG5cdCAgICB9XG5cblx0ICAgIGJhc2VQYXRoLm5ld1BvcyA9IG5ld1Bvcztcblx0ICAgIHJldHVybiBvbGRQb3M7XG5cdCAgfSxcblx0ICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZXF1YWxzOiBmdW5jdGlvbiBlcXVhbHMobGVmdCwgcmlnaHQpIHtcblx0ICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGFyYXRvcikge1xuXHQgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNvbXBhcmF0b3IobGVmdCwgcmlnaHQpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0IHx8IHRoaXMub3B0aW9ucy5pZ25vcmVDYXNlICYmIGxlZnQudG9Mb3dlckNhc2UoKSA9PT0gcmlnaHQudG9Mb3dlckNhc2UoKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9yZW1vdmVFbXB0eTogZnVuY3Rpb24gcmVtb3ZlRW1wdHkoYXJyYXkpIHtcblx0ICAgIHZhciByZXQgPSBbXTtcblx0ICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgaWYgKGFycmF5W2ldKSB7XG5cdCAgICAgICAgcmV0LnB1c2goYXJyYXlbaV0pO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gcmV0O1xuXHQgIH0sXG5cdCAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2Nhc3RJbnB1dDogZnVuY3Rpb24gY2FzdElucHV0KHZhbHVlKSB7XG5cdCAgICByZXR1cm4gdmFsdWU7XG5cdCAgfSxcblx0ICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovIC8qaXN0YW5idWwgaWdub3JlIGVuZCovdG9rZW5pemU6IGZ1bmN0aW9uIHRva2VuaXplKHZhbHVlKSB7XG5cdCAgICByZXR1cm4gdmFsdWUuc3BsaXQoJycpO1xuXHQgIH0sXG5cdCAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2pvaW46IGZ1bmN0aW9uIGpvaW4oY2hhcnMpIHtcblx0ICAgIHJldHVybiBjaGFycy5qb2luKCcnKTtcblx0ICB9XG5cdH07XG5cblx0ZnVuY3Rpb24gYnVpbGRWYWx1ZXMoZGlmZiwgY29tcG9uZW50cywgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIHVzZUxvbmdlc3RUb2tlbikge1xuXHQgIHZhciBjb21wb25lbnRQb3MgPSAwLFxuXHQgICAgICBjb21wb25lbnRMZW4gPSBjb21wb25lbnRzLmxlbmd0aCxcblx0ICAgICAgbmV3UG9zID0gMCxcblx0ICAgICAgb2xkUG9zID0gMDtcblxuXHQgIGZvciAoOyBjb21wb25lbnRQb3MgPCBjb21wb25lbnRMZW47IGNvbXBvbmVudFBvcysrKSB7XG5cdCAgICB2YXIgY29tcG9uZW50ID0gY29tcG9uZW50c1tjb21wb25lbnRQb3NdO1xuXHQgICAgaWYgKCFjb21wb25lbnQucmVtb3ZlZCkge1xuXHQgICAgICBpZiAoIWNvbXBvbmVudC5hZGRlZCAmJiB1c2VMb25nZXN0VG9rZW4pIHtcblx0ICAgICAgICB2YXIgdmFsdWUgPSBuZXdTdHJpbmcuc2xpY2UobmV3UG9zLCBuZXdQb3MgKyBjb21wb25lbnQuY291bnQpO1xuXHQgICAgICAgIHZhbHVlID0gdmFsdWUubWFwKGZ1bmN0aW9uICh2YWx1ZSwgaSkge1xuXHQgICAgICAgICAgdmFyIG9sZFZhbHVlID0gb2xkU3RyaW5nW29sZFBvcyArIGldO1xuXHQgICAgICAgICAgcmV0dXJuIG9sZFZhbHVlLmxlbmd0aCA+IHZhbHVlLmxlbmd0aCA/IG9sZFZhbHVlIDogdmFsdWU7XG5cdCAgICAgICAgfSk7XG5cblx0ICAgICAgICBjb21wb25lbnQudmFsdWUgPSBkaWZmLmpvaW4odmFsdWUpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGNvbXBvbmVudC52YWx1ZSA9IGRpZmYuam9pbihuZXdTdHJpbmcuc2xpY2UobmV3UG9zLCBuZXdQb3MgKyBjb21wb25lbnQuY291bnQpKTtcblx0ICAgICAgfVxuXHQgICAgICBuZXdQb3MgKz0gY29tcG9uZW50LmNvdW50O1xuXG5cdCAgICAgIC8vIENvbW1vbiBjYXNlXG5cdCAgICAgIGlmICghY29tcG9uZW50LmFkZGVkKSB7XG5cdCAgICAgICAgb2xkUG9zICs9IGNvbXBvbmVudC5jb3VudDtcblx0ICAgICAgfVxuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgY29tcG9uZW50LnZhbHVlID0gZGlmZi5qb2luKG9sZFN0cmluZy5zbGljZShvbGRQb3MsIG9sZFBvcyArIGNvbXBvbmVudC5jb3VudCkpO1xuXHQgICAgICBvbGRQb3MgKz0gY29tcG9uZW50LmNvdW50O1xuXG5cdCAgICAgIC8vIFJldmVyc2UgYWRkIGFuZCByZW1vdmUgc28gcmVtb3ZlcyBhcmUgb3V0cHV0IGZpcnN0IHRvIG1hdGNoIGNvbW1vbiBjb252ZW50aW9uXG5cdCAgICAgIC8vIFRoZSBkaWZmaW5nIGFsZ29yaXRobSBpcyB0aWVkIHRvIGFkZCB0aGVuIHJlbW92ZSBvdXRwdXQgYW5kIHRoaXMgaXMgdGhlIHNpbXBsZXN0XG5cdCAgICAgIC8vIHJvdXRlIHRvIGdldCB0aGUgZGVzaXJlZCBvdXRwdXQgd2l0aCBtaW5pbWFsIG92ZXJoZWFkLlxuXHQgICAgICBpZiAoY29tcG9uZW50UG9zICYmIGNvbXBvbmVudHNbY29tcG9uZW50UG9zIC0gMV0uYWRkZWQpIHtcblx0ICAgICAgICB2YXIgdG1wID0gY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXTtcblx0ICAgICAgICBjb21wb25lbnRzW2NvbXBvbmVudFBvcyAtIDFdID0gY29tcG9uZW50c1tjb21wb25lbnRQb3NdO1xuXHQgICAgICAgIGNvbXBvbmVudHNbY29tcG9uZW50UG9zXSA9IHRtcDtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblxuXHQgIC8vIFNwZWNpYWwgY2FzZSBoYW5kbGUgZm9yIHdoZW4gb25lIHRlcm1pbmFsIGlzIGlnbm9yZWQgKGkuZS4gd2hpdGVzcGFjZSkuXG5cdCAgLy8gRm9yIHRoaXMgY2FzZSB3ZSBtZXJnZSB0aGUgdGVybWluYWwgaW50byB0aGUgcHJpb3Igc3RyaW5nIGFuZCBkcm9wIHRoZSBjaGFuZ2UuXG5cdCAgLy8gVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBmb3Igc3RyaW5nIG1vZGUuXG5cdCAgdmFyIGxhc3RDb21wb25lbnQgPSBjb21wb25lbnRzW2NvbXBvbmVudExlbiAtIDFdO1xuXHQgIGlmIChjb21wb25lbnRMZW4gPiAxICYmIHR5cGVvZiBsYXN0Q29tcG9uZW50LnZhbHVlID09PSAnc3RyaW5nJyAmJiAobGFzdENvbXBvbmVudC5hZGRlZCB8fCBsYXN0Q29tcG9uZW50LnJlbW92ZWQpICYmIGRpZmYuZXF1YWxzKCcnLCBsYXN0Q29tcG9uZW50LnZhbHVlKSkge1xuXHQgICAgY29tcG9uZW50c1tjb21wb25lbnRMZW4gLSAyXS52YWx1ZSArPSBsYXN0Q29tcG9uZW50LnZhbHVlO1xuXHQgICAgY29tcG9uZW50cy5wb3AoKTtcblx0ICB9XG5cblx0ICByZXR1cm4gY29tcG9uZW50cztcblx0fVxuXG5cdGZ1bmN0aW9uIGNsb25lUGF0aChwYXRoKSB7XG5cdCAgcmV0dXJuIHsgbmV3UG9zOiBwYXRoLm5ld1BvcywgY29tcG9uZW50czogcGF0aC5jb21wb25lbnRzLnNsaWNlKDApIH07XG5cdH1cblx0Ly8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5a2FXWm1MMkpoYzJVdWFuTWlYU3dpYm1GdFpYTWlPbHNpUkdsbVppSXNJbkJ5YjNSdmRIbHdaU0lzSW1ScFptWWlMQ0p2YkdSVGRISnBibWNpTENKdVpYZFRkSEpwYm1jaUxDSnZjSFJwYjI1eklpd2lZMkZzYkdKaFkyc2lMQ0p6Wld4bUlpd2laRzl1WlNJc0luWmhiSFZsSWl3aWMyVjBWR2x0Wlc5MWRDSXNJblZ1WkdWbWFXNWxaQ0lzSW1OaGMzUkpibkIxZENJc0luSmxiVzkyWlVWdGNIUjVJaXdpZEc5clpXNXBlbVVpTENKdVpYZE1aVzRpTENKc1pXNW5kR2dpTENKdmJHUk1aVzRpTENKbFpHbDBUR1Z1WjNSb0lpd2liV0Y0UldScGRFeGxibWQwYUNJc0ltSmxjM1JRWVhSb0lpd2libVYzVUc5eklpd2lZMjl0Y0c5dVpXNTBjeUlzSW05c1pGQnZjeUlzSW1WNGRISmhZM1JEYjIxdGIyNGlMQ0pxYjJsdUlpd2lZMjkxYm5RaUxDSmxlR1ZqUldScGRFeGxibWQwYUNJc0ltUnBZV2R2Ym1Gc1VHRjBhQ0lzSW1KaGMyVlFZWFJvSWl3aVlXUmtVR0YwYUNJc0luSmxiVzkyWlZCaGRHZ2lMQ0pqWVc1QlpHUWlMQ0pqWVc1U1pXMXZkbVVpTENKamJHOXVaVkJoZEdnaUxDSndkWE5vUTI5dGNHOXVaVzUwSWl3aVluVnBiR1JXWVd4MVpYTWlMQ0oxYzJWTWIyNW5aWE4wVkc5clpXNGlMQ0psZUdWaklpd2ljbVYwSWl3aVlXUmtaV1FpTENKeVpXMXZkbVZrSWl3aWJHRnpkQ0lzSW5CMWMyZ2lMQ0pqYjIxdGIyNURiM1Z1ZENJc0ltVnhkV0ZzY3lJc0lteGxablFpTENKeWFXZG9kQ0lzSW1OdmJYQmhjbUYwYjNJaUxDSnBaMjV2Y21WRFlYTmxJaXdpZEc5TWIzZGxja05oYzJVaUxDSmhjbkpoZVNJc0lta2lMQ0p6Y0d4cGRDSXNJbU5vWVhKeklpd2lZMjl0Y0c5dVpXNTBVRzl6SWl3aVkyOXRjRzl1Wlc1MFRHVnVJaXdpWTI5dGNHOXVaVzUwSWl3aWMyeHBZMlVpTENKdFlYQWlMQ0p2YkdSV1lXeDFaU0lzSW5SdGNDSXNJbXhoYzNSRGIyMXdiMjVsYm5RaUxDSndiM0FpTENKd1lYUm9JbDBzSW0xaGNIQnBibWR6SWpvaU96czdORU5CUVhkQ1FTeEpPMEZCUVZRc1UwRkJVMEVzU1VGQlZDeEhRVUZuUWl4RFFVRkZPenRCUVVWcVEwRXNTMEZCUzBNc1UwRkJUQ3hIUVVGcFFqdEJRVUZCTEcxRVFVTm1ReXhKUVVSbExHZENRVU5XUXl4VFFVUlZMRVZCUTBORExGTkJSRVFzUlVGRE1FSTdRVUZCUVN4M1JFRkJaRU1zVDBGQll5eDFSVUZCU2l4RlFVRkpPenRCUVVOMlF5eFJRVUZKUXl4WFFVRlhSQ3hSUVVGUlF5eFJRVUYyUWp0QlFVTkJMRkZCUVVrc1QwRkJUMFFzVDBGQlVDeExRVUZ0UWl4VlFVRjJRaXhGUVVGdFF6dEJRVU5xUTBNc2FVSkJRVmRFTEU5QlFWZzdRVUZEUVVFc1owSkJRVlVzUlVGQlZqdEJRVU5FTzBGQlEwUXNVMEZCUzBFc1QwRkJUQ3hIUVVGbFFTeFBRVUZtT3p0QlFVVkJMRkZCUVVsRkxFOUJRVThzU1VGQldEczdRVUZGUVN4aFFVRlRReXhKUVVGVUxFTkJRV05ETEV0QlFXUXNSVUZCY1VJN1FVRkRia0lzVlVGQlNVZ3NVVUZCU2l4RlFVRmpPMEZCUTFwSkxHMUNRVUZYTEZsQlFWYzdRVUZCUlVvc2JVSkJRVk5MTEZOQlFWUXNSVUZCYjBKR0xFdEJRWEJDTzBGQlFUWkNMRk5CUVhKRUxFVkJRWFZFTEVOQlFYWkVPMEZCUTBFc1pVRkJUeXhKUVVGUU8wRkJRMFFzVDBGSVJDeE5RVWRQTzBGQlEwd3NaVUZCVDBFc1MwRkJVRHRCUVVORU8wRkJRMFk3TzBGQlJVUTdRVUZEUVU0c1owSkJRVmtzUzBGQlMxTXNVMEZCVEN4RFFVRmxWQ3hUUVVGbUxFTkJRVm83UVVGRFFVTXNaMEpCUVZrc1MwRkJTMUVzVTBGQlRDeERRVUZsVWl4VFFVRm1MRU5CUVZvN08wRkJSVUZFTEdkQ1FVRlpMRXRCUVV0VkxGZEJRVXdzUTBGQmFVSXNTMEZCUzBNc1VVRkJUQ3hEUVVGaldDeFRRVUZrTEVOQlFXcENMRU5CUVZvN1FVRkRRVU1zWjBKQlFWa3NTMEZCUzFNc1YwRkJUQ3hEUVVGcFFpeExRVUZMUXl4UlFVRk1MRU5CUVdOV0xGTkJRV1FzUTBGQmFrSXNRMEZCV2pzN1FVRkZRU3hSUVVGSlZ5eFRRVUZUV0N4VlFVRlZXU3hOUVVGMlFqdEJRVUZCTEZGQlFTdENReXhUUVVGVFpDeFZRVUZWWVN4TlFVRnNSRHRCUVVOQkxGRkJRVWxGTEdGQlFXRXNRMEZCYWtJN1FVRkRRU3hSUVVGSlF5eG5Ra0ZCWjBKS0xGTkJRVk5GTEUxQlFUZENPMEZCUTBFc1VVRkJTVWNzVjBGQlZ5eERRVUZETEVWQlFVVkRMRkZCUVZFc1EwRkJReXhEUVVGWUxFVkJRV05ETEZsQlFWa3NSVUZCTVVJc1JVRkJSQ3hEUVVGbU96dEJRVVZCTzBGQlEwRXNVVUZCU1VNc1UwRkJVeXhMUVVGTFF5eGhRVUZNTEVOQlFXMUNTaXhUUVVGVExFTkJRVlFzUTBGQmJrSXNSVUZCWjBOb1FpeFRRVUZvUXl4RlFVRXlRMFFzVTBGQk0wTXNSVUZCYzBRc1EwRkJkRVFzUTBGQllqdEJRVU5CTEZGQlFVbHBRaXhUUVVGVExFTkJRVlFzUlVGQldVTXNUVUZCV2l4SFFVRnhRaXhEUVVGeVFpeEpRVUV3UWs0c1RVRkJNVUlzU1VGQmIwTlJMRk5CUVZNc1EwRkJWQ3hKUVVGalRpeE5RVUYwUkN4RlFVRTRSRHRCUVVNMVJEdEJRVU5CTEdGQlFVOVVMRXRCUVVzc1EwRkJReXhGUVVGRFF5eFBRVUZQTEV0QlFVdG5RaXhKUVVGTUxFTkJRVlZ5UWl4VFFVRldMRU5CUVZJc1JVRkJPRUp6UWl4UFFVRlBkRUlzVlVGQlZWa3NUVUZCTDBNc1JVRkJSQ3hEUVVGTUxFTkJRVkE3UVVGRFJEczdRVUZGUkR0QlFVTkJMR0ZCUVZOWExHTkJRVlFzUjBGQk1FSTdRVUZEZUVJc1YwRkJTeXhKUVVGSlF5eGxRVUZsTEVOQlFVTXNRMEZCUkN4SFFVRkxWaXhWUVVFM1FpeEZRVUY1UTFVc1owSkJRV2RDVml4VlFVRjZSQ3hGUVVGeFJWVXNaMEpCUVdkQ0xFTkJRWEpHTEVWQlFYZEdPMEZCUTNSR0xGbEJRVWxETERCRFFVRktPMEZCUTBFc1dVRkJTVU1zVlVGQlZWWXNVMEZCVTFFc1pVRkJaU3hEUVVGNFFpeERRVUZrTzBGQlFVRXNXVUZEU1Vjc1lVRkJZVmdzVTBGQlUxRXNaVUZCWlN4RFFVRjRRaXhEUVVScVFqdEJRVUZCTEZsQlJVbE1MRlZCUVZNc1EwRkJRMUVzWVVGQllVRXNWMEZCVjFZc1RVRkJlRUlzUjBGQmFVTXNRMEZCYkVNc1NVRkJkVU5QTEZsQlJuQkVPMEZCUjBFc1dVRkJTVVVzVDBGQlNpeEZRVUZoTzBGQlExZzdRVUZEUVZZc2JVSkJRVk5STEdWQlFXVXNRMEZCZUVJc1NVRkJOa0pxUWl4VFFVRTNRanRCUVVORU96dEJRVVZFTEZsQlFVbHhRaXhUUVVGVFJpeFhRVUZYUVN4UlFVRlJWQ3hOUVVGU0xFZEJRV2xDTEVOQlFXcENMRWRCUVhGQ1RpeE5RVUUzUXp0QlFVRkJMRmxCUTBsclFpeFpRVUZaUml4alFVRmpMRXRCUVV0U0xFOUJRVzVDTEVsQlFUWkNRU3hWUVVGVFRpeE5RVVIwUkR0QlFVVkJMRmxCUVVrc1EwRkJRMlVzVFVGQlJDeEpRVUZYTEVOQlFVTkRMRk5CUVdoQ0xFVkJRVEpDTzBGQlEzcENPMEZCUTBGaUxHMUNRVUZUVVN4WlFVRlVMRWxCUVhsQ2FrSXNVMEZCZWtJN1FVRkRRVHRCUVVORU96dEJRVVZFTzBGQlEwRTdRVUZEUVR0QlFVTkJMRmxCUVVrc1EwRkJRM0ZDTEUxQlFVUXNTVUZCV1VNc1lVRkJZVWdzVVVGQlVWUXNUVUZCVWl4SFFVRnBRbFVzVjBGQlYxWXNUVUZCZWtRc1JVRkJhMFU3UVVGRGFFVlJMSEZDUVVGWFN5eFZRVUZWU0N4VlFVRldMRU5CUVZnN1FVRkRRWGhDTEdWQlFVczBRaXhoUVVGTUxFTkJRVzFDVGl4VFFVRlRVQ3hWUVVFMVFpeEZRVUYzUTFnc1UwRkJlRU1zUlVGQmJVUXNTVUZCYmtRN1FVRkRSQ3hUUVVoRUxFMUJSMDg3UVVGRFRHdENMSEZDUVVGWFF5eFBRVUZZTEVOQlJFc3NRMEZEYVVJN1FVRkRkRUpFTEcxQ1FVRlRVaXhOUVVGVU8wRkJRMEZrTEdWQlFVczBRaXhoUVVGTUxFTkJRVzFDVGl4VFFVRlRVQ3hWUVVFMVFpeEZRVUYzUXl4SlFVRjRReXhGUVVFNFExZ3NVMEZCT1VNN1FVRkRSRHM3UVVGRlJGa3NhMEpCUVZOb1FpeExRVUZMYVVJc1lVRkJUQ3hEUVVGdFFrc3NVVUZCYmtJc1JVRkJOa0o2UWl4VFFVRTNRaXhGUVVGM1EwUXNVMEZCZUVNc1JVRkJiVVI1UWl4WlFVRnVSQ3hEUVVGVU96dEJRVVZCTzBGQlEwRXNXVUZCU1VNc1UwRkJVMUlzVFVGQlZDeEhRVUZyUWl4RFFVRnNRaXhKUVVGMVFrNHNUVUZCZGtJc1NVRkJhVU5STEZWQlFWTXNRMEZCVkN4SlFVRmpUaXhOUVVGdVJDeEZRVUV5UkR0QlFVTjZSQ3hwUWtGQlQxUXNTMEZCU3pSQ0xGbEJRVmszUWl4SlFVRmFMRVZCUVd0Q2MwSXNVMEZCVTFBc1ZVRkJNMElzUlVGQmRVTnNRaXhUUVVGMlF5eEZRVUZyUkVRc1UwRkJiRVFzUlVGQk5rUkpMRXRCUVVzNFFpeGxRVUZzUlN4RFFVRk1MRU5CUVZBN1FVRkRSQ3hUUVVaRUxFMUJSVTg3UVVGRFREdEJRVU5CYWtJc2JVSkJRVk5STEZsQlFWUXNTVUZCZVVKRExGRkJRWHBDTzBGQlEwUTdRVUZEUmpzN1FVRkZSRmc3UVVGRFJEczdRVUZGUkR0QlFVTkJPMEZCUTBFN1FVRkRRU3hSUVVGSldpeFJRVUZLTEVWQlFXTTdRVUZEV0N4blFrRkJVMmRETEVsQlFWUXNSMEZCWjBJN1FVRkRaalZDTEcxQ1FVRlhMRmxCUVZjN1FVRkRjRUk3UVVGRFFUdEJRVU5CTEdOQlFVbFJMR0ZCUVdGRExHRkJRV3BDTEVWQlFXZERPMEZCUXpsQ0xHMUNRVUZQWWl4VlFVRlFPMEZCUTBRN08wRkJSVVFzWTBGQlNTeERRVUZEY1VJc1owSkJRVXdzUlVGQmRVSTdRVUZEY2tKWE8wRkJRMFE3UVVGRFJpeFRRVlpFTEVWQlZVY3NRMEZXU0R0QlFWZEVMRTlCV2tFc1IwRkJSRHRCUVdGRUxFdEJaRVFzVFVGalR6dEJRVU5NTEdGQlFVOXdRaXhqUVVGalF5eGhRVUZ5UWl4RlFVRnZRenRCUVVOc1F5eFpRVUZKYjBJc1RVRkJUVm9zWjBKQlFWWTdRVUZEUVN4WlFVRkpXU3hIUVVGS0xFVkJRVk03UVVGRFVDeHBRa0ZCVDBFc1IwRkJVRHRCUVVORU8wRkJRMFk3UVVGRFJqdEJRVU5HTEVkQk9VZGpPMEZCUVVFc2JVUkJaMGhtU2l4aFFXaElaU3g1UWtGblNFUmlMRlZCYUVoRExFVkJaMGhYYTBJc1MwRm9TRmdzUlVGblNHdENReXhQUVdoSWJFSXNSVUZuU0RKQ08wRkJRM2hETEZGQlFVbERMRTlCUVU5d1FpeFhRVUZYUVN4WFFVRlhUaXhOUVVGWUxFZEJRVzlDTEVOQlFTOUNMRU5CUVZnN1FVRkRRU3hSUVVGSk1FSXNVVUZCVVVFc1MwRkJTMFlzUzBGQlRDeExRVUZsUVN4TFFVRjJRaXhKUVVGblEwVXNTMEZCUzBRc1QwRkJUQ3hMUVVGcFFrRXNUMEZCY2tRc1JVRkJPRVE3UVVGRE5VUTdRVUZEUVR0QlFVTkJia0lzYVVKQlFWZEJMRmRCUVZkT0xFMUJRVmdzUjBGQmIwSXNRMEZCTDBJc1NVRkJiME1zUlVGQlExVXNUMEZCVDJkQ0xFdEJRVXRvUWl4TFFVRk1MRWRCUVdFc1EwRkJja0lzUlVGQmQwSmpMRTlCUVU5QkxFdEJRUzlDTEVWQlFYTkRReXhUUVVGVFFTeFBRVUV2UXl4RlFVRndRenRCUVVORUxFdEJTa1FzVFVGSlR6dEJRVU5NYmtJc2FVSkJRVmR4UWl4SlFVRllMRU5CUVdkQ0xFVkJRVU5xUWl4UFFVRlBMRU5CUVZJc1JVRkJWMk1zVDBGQlQwRXNTMEZCYkVJc1JVRkJlVUpETEZOQlFWTkJMRTlCUVd4RExFVkJRV2hDTzBGQlEwUTdRVUZEUml4SFFYcElZenRCUVVGQkxHMUVRVEJJWm1wQ0xHRkJNVWhsTEhsQ1FUQklSRXNzVVVFeFNFTXNSVUV3U0ZONlFpeFRRVEZJVkN4RlFUQkliMEpFTEZOQk1VaHdRaXhGUVRCSUswSjVRaXhaUVRGSUwwSXNSVUV3U0RaRE8wRkJRekZFTEZGQlFVbGlMRk5CUVZOWUxGVkJRVlZaTEUxQlFYWkNPMEZCUVVFc1VVRkRTVU1zVTBGQlUyUXNWVUZCVldFc1RVRkVka0k3UVVGQlFTeFJRVVZKU3l4VFFVRlRVU3hUUVVGVFVpeE5RVVowUWp0QlFVRkJMRkZCUjBsRkxGTkJRVk5HTEZOQlFWTlBMRmxCU0hSQ08wRkJRVUVzVVVGTFNXZENMR05CUVdNc1EwRk1iRUk3UVVGTlFTeFhRVUZQZGtJc1UwRkJVeXhEUVVGVUxFZEJRV0ZPTEUxQlFXSXNTVUZCZFVKUkxGTkJRVk1zUTBGQlZDeEhRVUZoVGl4TlFVRndReXhKUVVFNFF5eExRVUZMTkVJc1RVRkJUQ3hEUVVGWmVrTXNWVUZCVldsQ0xGTkJRVk1zUTBGQmJrSXNRMEZCV2l4RlFVRnRRMnhDTEZWQlFWVnZRaXhUUVVGVExFTkJRVzVDTEVOQlFXNURMRU5CUVhKRUxFVkJRV2RJTzBGQlF6bEhSanRCUVVOQlJUdEJRVU5CY1VJN1FVRkRSRHM3UVVGRlJDeFJRVUZKUVN4WFFVRktMRVZCUVdsQ08wRkJRMlptTEdWQlFWTlFMRlZCUVZRc1EwRkJiMEp4UWl4SlFVRndRaXhEUVVGNVFpeEZRVUZEYWtJc1QwRkJUMnRDTEZkQlFWSXNSVUZCZWtJN1FVRkRSRHM3UVVGRlJHWXNZVUZCVTFJc1RVRkJWQ3hIUVVGclFrRXNUVUZCYkVJN1FVRkRRU3hYUVVGUFJTeE5RVUZRTzBGQlEwUXNSMEUzU1dNN1FVRkJRU3h0UkVFclNXWnpRaXhOUVM5SlpTeHJRa0VyU1ZKRExFbEJMMGxSTEVWQkswbEdReXhMUVM5SlJTeEZRU3RKU3p0QlFVTnNRaXhSUVVGSkxFdEJRVXN4UXl4UFFVRk1MRU5CUVdFeVF5eFZRVUZxUWl4RlFVRTJRanRCUVVNelFpeGhRVUZQTEV0QlFVc3pReXhQUVVGTUxFTkJRV0V5UXl4VlFVRmlMRU5CUVhkQ1JpeEpRVUY0UWl4RlFVRTRRa01zUzBGQk9VSXNRMEZCVUR0QlFVTkVMRXRCUmtRc1RVRkZUenRCUVVOTUxHRkJRVTlFTEZOQlFWTkRMRXRCUVZRc1NVRkRSQ3hMUVVGTE1VTXNUMEZCVEN4RFFVRmhORU1zVlVGQllpeEpRVUV5UWtnc1MwRkJTMGtzVjBGQlRDeFBRVUYxUWtnc1RVRkJUVWNzVjBGQlRpeEZRVVI0UkR0QlFVVkVPMEZCUTBZc1IwRjBTbU03UVVGQlFTeHRSRUYxU21aeVF5eFhRWFpLWlN4MVFrRjFTa2h6UXl4TFFYWktSeXhGUVhWS1NUdEJRVU5xUWl4UlFVRkpXaXhOUVVGTkxFVkJRVlk3UVVGRFFTeFRRVUZMTEVsQlFVbGhMRWxCUVVrc1EwRkJZaXhGUVVGblFrRXNTVUZCU1VRc1RVRkJUVzVETEUxQlFURkNMRVZCUVd0RGIwTXNSMEZCYkVNc1JVRkJkVU03UVVGRGNrTXNWVUZCU1VRc1RVRkJUVU1zUTBGQlRpeERRVUZLTEVWQlFXTTdRVUZEV21Jc1dVRkJTVWtzU1VGQlNpeERRVUZUVVN4TlFVRk5ReXhEUVVGT0xFTkJRVlE3UVVGRFJEdEJRVU5HTzBGQlEwUXNWMEZCVDJJc1IwRkJVRHRCUVVORUxFZEJMMHBqTzBGQlFVRXNiVVJCWjB0bU0wSXNVMEZvUzJVc2NVSkJaMHRNU0N4TFFXaExTeXhGUVdkTFJUdEJRVU5tTEZkQlFVOUJMRXRCUVZBN1FVRkRSQ3hIUVd4TFl6dEJRVUZCTEcxRVFXMUxaa3NzVVVGdVMyVXNiMEpCYlV0T1RDeExRVzVMVFN4RlFXMUxRenRCUVVOa0xGZEJRVTlCTEUxQlFVMDBReXhMUVVGT0xFTkJRVmtzUlVGQldpeERRVUZRTzBGQlEwUXNSMEZ5UzJNN1FVRkJRU3h0UkVGelMyWTFRaXhKUVhSTFpTeG5Ra0Z6UzFZMlFpeExRWFJMVlN4RlFYTkxTRHRCUVVOV0xGZEJRVTlCTEUxQlFVMDNRaXhKUVVGT0xFTkJRVmNzUlVGQldDeERRVUZRTzBGQlEwUTdRVUY0UzJNc1EwRkJha0k3TzBGQk1rdEJMRk5CUVZOWExGZEJRVlFzUTBGQmNVSnNReXhKUVVGeVFpeEZRVUV5UW05Q0xGVkJRVE5DTEVWQlFYVkRiRUlzVTBGQmRrTXNSVUZCYTBSRUxGTkJRV3hFTEVWQlFUWkVhME1zWlVGQk4wUXNSVUZCT0VVN1FVRkROVVVzVFVGQlNXdENMR1ZCUVdVc1EwRkJia0k3UVVGQlFTeE5RVU5KUXl4bFFVRmxiRU1zVjBGQlYwNHNUVUZFT1VJN1FVRkJRU3hOUVVWSlN5eFRRVUZUTEVOQlJtSTdRVUZCUVN4TlFVZEpSU3hUUVVGVExFTkJTR0k3TzBGQlMwRXNVMEZCVDJkRExHVkJRV1ZETEZsQlFYUkNMRVZCUVc5RFJDeGpRVUZ3UXl4RlFVRnZSRHRCUVVOc1JDeFJRVUZKUlN4WlFVRlpia01zVjBGQlYybERMRmxCUVZnc1EwRkJhRUk3UVVGRFFTeFJRVUZKTEVOQlFVTkZMRlZCUVZWb1FpeFBRVUZtTEVWQlFYZENPMEZCUTNSQ0xGVkJRVWtzUTBGQlEyZENMRlZCUVZWcVFpeExRVUZZTEVsQlFXOUNTQ3hsUVVGNFFpeEZRVUY1UXp0QlFVTjJReXhaUVVGSk5VSXNVVUZCVVV3c1ZVRkJWWE5FTEV0QlFWWXNRMEZCWjBKeVF5eE5RVUZvUWl4RlFVRjNRa0VzVTBGQlUyOURMRlZCUVZVdlFpeExRVUV6UXl4RFFVRmFPMEZCUTBGcVFpeG5Ra0ZCVVVFc1RVRkJUV3RFTEVkQlFVNHNRMEZCVlN4VlFVRlRiRVFzUzBGQlZDeEZRVUZuUWpKRExFTkJRV2hDTEVWQlFXMUNPMEZCUTI1RExHTkJRVWxSTEZkQlFWZDZSQ3hWUVVGVmIwSXNVMEZCVXpaQ0xFTkJRVzVDTEVOQlFXWTdRVUZEUVN4cFFrRkJUMUVzVTBGQlV6VkRMRTFCUVZRc1IwRkJhMEpRTEUxQlFVMVBMRTFCUVhoQ0xFZEJRV2xETkVNc1VVRkJha01zUjBGQk5FTnVSQ3hMUVVGdVJEdEJRVU5FTEZOQlNFOHNRMEZCVWpzN1FVRkxRV2RFTEd0Q1FVRlZhRVFzUzBGQlZpeEhRVUZyUWxBc1MwRkJTM1ZDTEVsQlFVd3NRMEZCVldoQ0xFdEJRVllzUTBGQmJFSTdRVUZEUkN4UFFWSkVMRTFCVVU4N1FVRkRUR2RFTEd0Q1FVRlZhRVFzUzBGQlZpeEhRVUZyUWxBc1MwRkJTM1ZDTEVsQlFVd3NRMEZCVlhKQ0xGVkJRVlZ6UkN4TFFVRldMRU5CUVdkQ2NrTXNUVUZCYUVJc1JVRkJkMEpCTEZOQlFWTnZReXhWUVVGVkwwSXNTMEZCTTBNc1EwRkJWaXhEUVVGc1FqdEJRVU5FTzBGQlEwUk1MR2RDUVVGVmIwTXNWVUZCVlM5Q0xFdEJRWEJDT3p0QlFVVkJPMEZCUTBFc1ZVRkJTU3hEUVVGREswSXNWVUZCVldwQ0xFdEJRV1lzUlVGQmMwSTdRVUZEY0VKcVFpeHJRa0ZCVld0RExGVkJRVlV2UWl4TFFVRndRanRCUVVORU8wRkJRMFlzUzBGc1FrUXNUVUZyUWs4N1FVRkRUQ3RDTEdkQ1FVRlZhRVFzUzBGQlZpeEhRVUZyUWxBc1MwRkJTM1ZDTEVsQlFVd3NRMEZCVlhSQ0xGVkJRVlYxUkN4TFFVRldMRU5CUVdkQ2JrTXNUVUZCYUVJc1JVRkJkMEpCTEZOQlFWTnJReXhWUVVGVkwwSXNTMEZCTTBNc1EwRkJWaXhEUVVGc1FqdEJRVU5CU0N4blFrRkJWV3RETEZWQlFWVXZRaXhMUVVGd1FqczdRVUZGUVR0QlFVTkJPMEZCUTBFN1FVRkRRU3hWUVVGSk5rSXNaMEpCUVdkQ2FrTXNWMEZCVjJsRExHVkJRV1VzUTBGQk1VSXNSVUZCTmtKbUxFdEJRV3BFTEVWQlFYZEVPMEZCUTNSRUxGbEJRVWx4UWl4TlFVRk5ka01zVjBGQlYybERMR1ZCUVdVc1EwRkJNVUlzUTBGQlZqdEJRVU5CYWtNc2JVSkJRVmRwUXl4bFFVRmxMRU5CUVRGQ0xFbEJRU3RDYWtNc1YwRkJWMmxETEZsQlFWZ3NRMEZCTDBJN1FVRkRRV3BETEcxQ1FVRlhhVU1zV1VGQldDeEpRVUV5UWswc1IwRkJNMEk3UVVGRFJEdEJRVU5HTzBGQlEwWTdPMEZCUlVRN1FVRkRRVHRCUVVOQk8wRkJRMEVzVFVGQlNVTXNaMEpCUVdkQ2VFTXNWMEZCVjJ0RExHVkJRV1VzUTBGQk1VSXNRMEZCY0VJN1FVRkRRU3hOUVVGSlFTeGxRVUZsTEVOQlFXWXNTVUZEUnl4UFFVRlBUU3hqUVVGamNrUXNTMEZCY2tJc1MwRkJLMElzVVVGRWJFTXNTMEZGU1hGRUxHTkJRV04wUWl4TFFVRmtMRWxCUVhWQ2MwSXNZMEZCWTNKQ0xFOUJSbnBETEV0QlIwZDJReXhMUVVGTE1rTXNUVUZCVEN4RFFVRlpMRVZCUVZvc1JVRkJaMEpwUWl4alFVRmpja1FzUzBGQk9VSXNRMEZJVUN4RlFVYzJRenRCUVVNelEyRXNaVUZCVjJ0RExHVkJRV1VzUTBGQk1VSXNSVUZCTmtJdlF5eExRVUUzUWl4SlFVRnpRM0ZFTEdOQlFXTnlSQ3hMUVVGd1JEdEJRVU5CWVN4bFFVRlhlVU1zUjBGQldEdEJRVU5FT3p0QlFVVkVMRk5CUVU5NlF5eFZRVUZRTzBGQlEwUTdPMEZCUlVRc1UwRkJVMWtzVTBGQlZDeERRVUZ0UWpoQ0xFbEJRVzVDTEVWQlFYbENPMEZCUTNaQ0xGTkJRVThzUlVGQlJUTkRMRkZCUVZFeVF5eExRVUZMTTBNc1RVRkJaaXhGUVVGMVFrTXNXVUZCV1RCRExFdEJRVXN4UXl4VlFVRk1MRU5CUVdkQ2IwTXNTMEZCYUVJc1EwRkJjMElzUTBGQmRFSXNRMEZCYmtNc1JVRkJVRHRCUVVORUlpd2labWxzWlNJNkltSmhjMlV1YW5NaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SmxlSEJ2Y25RZ1pHVm1ZWFZzZENCbWRXNWpkR2x2YmlCRWFXWm1LQ2tnZTMxY2JseHVSR2xtWmk1d2NtOTBiM1I1Y0dVZ1BTQjdYRzRnSUdScFptWW9iMnhrVTNSeWFXNW5MQ0J1WlhkVGRISnBibWNzSUc5d2RHbHZibk1nUFNCN2ZTa2dlMXh1SUNBZ0lHeGxkQ0JqWVd4c1ltRmpheUE5SUc5d2RHbHZibk11WTJGc2JHSmhZMnM3WEc0Z0lDQWdhV1lnS0hSNWNHVnZaaUJ2Y0hScGIyNXpJRDA5UFNBblpuVnVZM1JwYjI0bktTQjdYRzRnSUNBZ0lDQmpZV3hzWW1GamF5QTlJRzl3ZEdsdmJuTTdYRzRnSUNBZ0lDQnZjSFJwYjI1eklEMGdlMzA3WEc0Z0lDQWdmVnh1SUNBZ0lIUm9hWE11YjNCMGFXOXVjeUE5SUc5d2RHbHZibk03WEc1Y2JpQWdJQ0JzWlhRZ2MyVnNaaUE5SUhSb2FYTTdYRzVjYmlBZ0lDQm1kVzVqZEdsdmJpQmtiMjVsS0haaGJIVmxLU0I3WEc0Z0lDQWdJQ0JwWmlBb1kyRnNiR0poWTJzcElIdGNiaUFnSUNBZ0lDQWdjMlYwVkdsdFpXOTFkQ2htZFc1amRHbHZiaWdwSUhzZ1kyRnNiR0poWTJzb2RXNWtaV1pwYm1Wa0xDQjJZV3gxWlNrN0lIMHNJREFwTzF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnZEhKMVpUdGNiaUFnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCMllXeDFaVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzVjYmlBZ0lDQXZMeUJCYkd4dmR5QnpkV0pqYkdGemMyVnpJSFJ2SUcxaGMzTmhaMlVnZEdobElHbHVjSFYwSUhCeWFXOXlJSFJ2SUhKMWJtNXBibWRjYmlBZ0lDQnZiR1JUZEhKcGJtY2dQU0IwYUdsekxtTmhjM1JKYm5CMWRDaHZiR1JUZEhKcGJtY3BPMXh1SUNBZ0lHNWxkMU4wY21sdVp5QTlJSFJvYVhNdVkyRnpkRWx1Y0hWMEtHNWxkMU4wY21sdVp5azdYRzVjYmlBZ0lDQnZiR1JUZEhKcGJtY2dQU0IwYUdsekxuSmxiVzkyWlVWdGNIUjVLSFJvYVhNdWRHOXJaVzVwZW1Vb2IyeGtVM1J5YVc1bktTazdYRzRnSUNBZ2JtVjNVM1J5YVc1bklEMGdkR2hwY3k1eVpXMXZkbVZGYlhCMGVTaDBhR2x6TG5SdmEyVnVhWHBsS0c1bGQxTjBjbWx1WnlrcE8xeHVYRzRnSUNBZ2JHVjBJRzVsZDB4bGJpQTlJRzVsZDFOMGNtbHVaeTVzWlc1bmRHZ3NJRzlzWkV4bGJpQTlJRzlzWkZOMGNtbHVaeTVzWlc1bmRHZzdYRzRnSUNBZ2JHVjBJR1ZrYVhSTVpXNW5kR2dnUFNBeE8xeHVJQ0FnSUd4bGRDQnRZWGhGWkdsMFRHVnVaM1JvSUQwZ2JtVjNUR1Z1SUNzZ2IyeGtUR1Z1TzF4dUlDQWdJR3hsZENCaVpYTjBVR0YwYUNBOUlGdDdJRzVsZDFCdmN6b2dMVEVzSUdOdmJYQnZibVZ1ZEhNNklGdGRJSDFkTzF4dVhHNGdJQ0FnTHk4Z1UyVmxaQ0JsWkdsMFRHVnVaM1JvSUQwZ01Dd2dhUzVsTGlCMGFHVWdZMjl1ZEdWdWRDQnpkR0Z5ZEhNZ2QybDBhQ0IwYUdVZ2MyRnRaU0IyWVd4MVpYTmNiaUFnSUNCc1pYUWdiMnhrVUc5eklEMGdkR2hwY3k1bGVIUnlZV04wUTI5dGJXOXVLR0psYzNSUVlYUm9XekJkTENCdVpYZFRkSEpwYm1jc0lHOXNaRk4wY21sdVp5d2dNQ2s3WEc0Z0lDQWdhV1lnS0dKbGMzUlFZWFJvV3pCZExtNWxkMUJ2Y3lBcklERWdQajBnYm1WM1RHVnVJQ1ltSUc5c1pGQnZjeUFySURFZ1BqMGdiMnhrVEdWdUtTQjdYRzRnSUNBZ0lDQXZMeUJKWkdWdWRHbDBlU0J3WlhJZ2RHaGxJR1Z4ZFdGc2FYUjVJR0Z1WkNCMGIydGxibWw2WlhKY2JpQWdJQ0FnSUhKbGRIVnliaUJrYjI1bEtGdDdkbUZzZFdVNklIUm9hWE11YW05cGJpaHVaWGRUZEhKcGJtY3BMQ0JqYjNWdWREb2dibVYzVTNSeWFXNW5MbXhsYm1kMGFIMWRLVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQXZMeUJOWVdsdUlIZHZjbXRsY2lCdFpYUm9iMlF1SUdOb1pXTnJjeUJoYkd3Z2NHVnliWFYwWVhScGIyNXpJRzltSUdFZ1oybDJaVzRnWldScGRDQnNaVzVuZEdnZ1ptOXlJR0ZqWTJWd2RHRnVZMlV1WEc0Z0lDQWdablZ1WTNScGIyNGdaWGhsWTBWa2FYUk1aVzVuZEdnb0tTQjdYRzRnSUNBZ0lDQm1iM0lnS0d4bGRDQmthV0ZuYjI1aGJGQmhkR2dnUFNBdE1TQXFJR1ZrYVhSTVpXNW5kR2c3SUdScFlXZHZibUZzVUdGMGFDQThQU0JsWkdsMFRHVnVaM1JvT3lCa2FXRm5iMjVoYkZCaGRHZ2dLejBnTWlrZ2UxeHVJQ0FnSUNBZ0lDQnNaWFFnWW1GelpWQmhkR2c3WEc0Z0lDQWdJQ0FnSUd4bGRDQmhaR1JRWVhSb0lEMGdZbVZ6ZEZCaGRHaGJaR2xoWjI5dVlXeFFZWFJvSUMwZ01WMHNYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpXMXZkbVZRWVhSb0lEMGdZbVZ6ZEZCaGRHaGJaR2xoWjI5dVlXeFFZWFJvSUNzZ01WMHNYRzRnSUNBZ0lDQWdJQ0FnSUNCdmJHUlFiM01nUFNBb2NtVnRiM1psVUdGMGFDQS9JSEpsYlc5MlpWQmhkR2d1Ym1WM1VHOXpJRG9nTUNrZ0xTQmthV0ZuYjI1aGJGQmhkR2c3WEc0Z0lDQWdJQ0FnSUdsbUlDaGhaR1JRWVhSb0tTQjdYRzRnSUNBZ0lDQWdJQ0FnTHk4Z1RtOGdiMjVsSUdWc2MyVWdhWE1nWjI5cGJtY2dkRzhnWVhSMFpXMXdkQ0IwYnlCMWMyVWdkR2hwY3lCMllXeDFaU3dnWTJ4bFlYSWdhWFJjYmlBZ0lDQWdJQ0FnSUNCaVpYTjBVR0YwYUZ0a2FXRm5iMjVoYkZCaGRHZ2dMU0F4WFNBOUlIVnVaR1ZtYVc1bFpEdGNiaUFnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUd4bGRDQmpZVzVCWkdRZ1BTQmhaR1JRWVhSb0lDWW1JR0ZrWkZCaGRHZ3VibVYzVUc5eklDc2dNU0E4SUc1bGQweGxiaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lHTmhibEpsYlc5MlpTQTlJSEpsYlc5MlpWQmhkR2dnSmlZZ01DQThQU0J2YkdSUWIzTWdKaVlnYjJ4a1VHOXpJRHdnYjJ4a1RHVnVPMXh1SUNBZ0lDQWdJQ0JwWmlBb0lXTmhia0ZrWkNBbUppQWhZMkZ1VW1WdGIzWmxLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0x5OGdTV1lnZEdocGN5QndZWFJvSUdseklHRWdkR1Z5YldsdVlXd2dkR2hsYmlCd2NuVnVaVnh1SUNBZ0lDQWdJQ0FnSUdKbGMzUlFZWFJvVzJScFlXZHZibUZzVUdGMGFGMGdQU0IxYm1SbFptbHVaV1E3WEc0Z0lDQWdJQ0FnSUNBZ1kyOXVkR2x1ZFdVN1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0F2THlCVFpXeGxZM1FnZEdobElHUnBZV2R2Ym1Gc0lIUm9ZWFFnZDJVZ2QyRnVkQ0IwYnlCaWNtRnVZMmdnWm5KdmJTNGdWMlVnYzJWc1pXTjBJSFJvWlNCd2NtbHZjbHh1SUNBZ0lDQWdJQ0F2THlCd1lYUm9JSGRvYjNObElIQnZjMmwwYVc5dUlHbHVJSFJvWlNCdVpYY2djM1J5YVc1bklHbHpJSFJvWlNCbVlYSjBhR1Z6ZENCbWNtOXRJSFJvWlNCdmNtbG5hVzVjYmlBZ0lDQWdJQ0FnTHk4Z1lXNWtJR1J2WlhNZ2JtOTBJSEJoYzNNZ2RHaGxJR0p2ZFc1a2N5QnZaaUIwYUdVZ1pHbG1aaUJuY21Gd2FGeHVJQ0FnSUNBZ0lDQnBaaUFvSVdOaGJrRmtaQ0I4ZkNBb1kyRnVVbVZ0YjNabElDWW1JR0ZrWkZCaGRHZ3VibVYzVUc5eklEd2djbVZ0YjNabFVHRjBhQzV1WlhkUWIzTXBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ1ltRnpaVkJoZEdnZ1BTQmpiRzl1WlZCaGRHZ29jbVZ0YjNabFVHRjBhQ2s3WEc0Z0lDQWdJQ0FnSUNBZ2MyVnNaaTV3ZFhOb1EyOXRjRzl1Wlc1MEtHSmhjMlZRWVhSb0xtTnZiWEJ2Ym1WdWRITXNJSFZ1WkdWbWFXNWxaQ3dnZEhKMVpTazdYRzRnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnWW1GelpWQmhkR2dnUFNCaFpHUlFZWFJvT3lBZ0lDOHZJRTV2SUc1bFpXUWdkRzhnWTJ4dmJtVXNJSGRsSjNabElIQjFiR3hsWkNCcGRDQm1jbTl0SUhSb1pTQnNhWE4wWEc0Z0lDQWdJQ0FnSUNBZ1ltRnpaVkJoZEdndWJtVjNVRzl6S3lzN1hHNGdJQ0FnSUNBZ0lDQWdjMlZzWmk1d2RYTm9RMjl0Y0c5dVpXNTBLR0poYzJWUVlYUm9MbU52YlhCdmJtVnVkSE1zSUhSeWRXVXNJSFZ1WkdWbWFXNWxaQ2s3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQnZiR1JRYjNNZ1BTQnpaV3htTG1WNGRISmhZM1JEYjIxdGIyNG9ZbUZ6WlZCaGRHZ3NJRzVsZDFOMGNtbHVaeXdnYjJ4a1UzUnlhVzVuTENCa2FXRm5iMjVoYkZCaGRHZ3BPMXh1WEc0Z0lDQWdJQ0FnSUM4dklFbG1JSGRsSUdoaGRtVWdhR2wwSUhSb1pTQmxibVFnYjJZZ1ltOTBhQ0J6ZEhKcGJtZHpMQ0IwYUdWdUlIZGxJR0Z5WlNCa2IyNWxYRzRnSUNBZ0lDQWdJR2xtSUNoaVlYTmxVR0YwYUM1dVpYZFFiM01nS3lBeElENDlJRzVsZDB4bGJpQW1KaUJ2YkdSUWIzTWdLeUF4SUQ0OUlHOXNaRXhsYmlrZ2UxeHVJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQmtiMjVsS0dKMWFXeGtWbUZzZFdWektITmxiR1lzSUdKaGMyVlFZWFJvTG1OdmJYQnZibVZ1ZEhNc0lHNWxkMU4wY21sdVp5d2diMnhrVTNSeWFXNW5MQ0J6Wld4bUxuVnpaVXh2Ym1kbGMzUlViMnRsYmlrcE8xeHVJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJQzh2SUU5MGFHVnlkMmx6WlNCMGNtRmpheUIwYUdseklIQmhkR2dnWVhNZ1lTQndiM1JsYm5ScFlXd2dZMkZ1Wkdsa1lYUmxJR0Z1WkNCamIyNTBhVzUxWlM1Y2JpQWdJQ0FnSUNBZ0lDQmlaWE4wVUdGMGFGdGthV0ZuYjI1aGJGQmhkR2hkSUQwZ1ltRnpaVkJoZEdnN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdaV1JwZEV4bGJtZDBhQ3NyTzF4dUlDQWdJSDFjYmx4dUlDQWdJQzh2SUZCbGNtWnZjbTF6SUhSb1pTQnNaVzVuZEdnZ2IyWWdaV1JwZENCcGRHVnlZWFJwYjI0dUlFbHpJR0VnWW1sMElHWjFaMng1SUdGeklIUm9hWE1nYUdGeklIUnZJSE4xY0hCdmNuUWdkR2hsWEc0Z0lDQWdMeThnYzNsdVl5QmhibVFnWVhONWJtTWdiVzlrWlNCM2FHbGphQ0JwY3lCdVpYWmxjaUJtZFc0dUlFeHZiM0J6SUc5MlpYSWdaWGhsWTBWa2FYUk1aVzVuZEdnZ2RXNTBhV3dnWVNCMllXeDFaVnh1SUNBZ0lDOHZJR2x6SUhCeWIyUjFZMlZrTGx4dUlDQWdJR2xtSUNoallXeHNZbUZqYXlrZ2UxeHVJQ0FnSUNBZ0tHWjFibU4wYVc5dUlHVjRaV01vS1NCN1hHNGdJQ0FnSUNBZ0lITmxkRlJwYldWdmRYUW9ablZ1WTNScGIyNG9LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0x5OGdWR2hwY3lCemFHOTFiR1FnYm05MElHaGhjSEJsYml3Z1luVjBJSGRsSUhkaGJuUWdkRzhnWW1VZ2MyRm1aUzVjYmlBZ0lDQWdJQ0FnSUNBdktpQnBjM1JoYm1KMWJDQnBaMjV2Y21VZ2JtVjRkQ0FxTDF4dUlDQWdJQ0FnSUNBZ0lHbG1JQ2hsWkdsMFRHVnVaM1JvSUQ0Z2JXRjRSV1JwZEV4bGJtZDBhQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHTmhiR3hpWVdOcktDazdYRzRnSUNBZ0lDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNBZ0lDQWdhV1lnS0NGbGVHVmpSV1JwZEV4bGJtZDBhQ2dwS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JsZUdWaktDazdYRzRnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCOUxDQXdLVHRjYmlBZ0lDQWdJSDBvS1NrN1hHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJSGRvYVd4bElDaGxaR2wwVEdWdVozUm9JRHc5SUcxaGVFVmthWFJNWlc1bmRHZ3BJSHRjYmlBZ0lDQWdJQ0FnYkdWMElISmxkQ0E5SUdWNFpXTkZaR2wwVEdWdVozUm9LQ2s3WEc0Z0lDQWdJQ0FnSUdsbUlDaHlaWFFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2NtVjBPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1SUNCOUxGeHVYRzRnSUhCMWMyaERiMjF3YjI1bGJuUW9ZMjl0Y0c5dVpXNTBjeXdnWVdSa1pXUXNJSEpsYlc5MlpXUXBJSHRjYmlBZ0lDQnNaWFFnYkdGemRDQTlJR052YlhCdmJtVnVkSE5iWTI5dGNHOXVaVzUwY3k1c1pXNW5kR2dnTFNBeFhUdGNiaUFnSUNCcFppQW9iR0Z6ZENBbUppQnNZWE4wTG1Ga1pHVmtJRDA5UFNCaFpHUmxaQ0FtSmlCc1lYTjBMbkpsYlc5MlpXUWdQVDA5SUhKbGJXOTJaV1FwSUh0Y2JpQWdJQ0FnSUM4dklGZGxJRzVsWldRZ2RHOGdZMnh2Ym1VZ2FHVnlaU0JoY3lCMGFHVWdZMjl0Y0c5dVpXNTBJR05zYjI1bElHOXdaWEpoZEdsdmJpQnBjeUJxZFhOMFhHNGdJQ0FnSUNBdkx5QmhjeUJ6YUdGc2JHOTNJR0Z5Y21GNUlHTnNiMjVsWEc0Z0lDQWdJQ0JqYjIxd2IyNWxiblJ6VzJOdmJYQnZibVZ1ZEhNdWJHVnVaM1JvSUMwZ01WMGdQU0I3WTI5MWJuUTZJR3hoYzNRdVkyOTFiblFnS3lBeExDQmhaR1JsWkRvZ1lXUmtaV1FzSUhKbGJXOTJaV1E2SUhKbGJXOTJaV1FnZlR0Y2JpQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdZMjl0Y0c5dVpXNTBjeTV3ZFhOb0tIdGpiM1Z1ZERvZ01Td2dZV1JrWldRNklHRmtaR1ZrTENCeVpXMXZkbVZrT2lCeVpXMXZkbVZrSUgwcE8xeHVJQ0FnSUgxY2JpQWdmU3hjYmlBZ1pYaDBjbUZqZEVOdmJXMXZiaWhpWVhObFVHRjBhQ3dnYm1WM1UzUnlhVzVuTENCdmJHUlRkSEpwYm1jc0lHUnBZV2R2Ym1Gc1VHRjBhQ2tnZTF4dUlDQWdJR3hsZENCdVpYZE1aVzRnUFNCdVpYZFRkSEpwYm1jdWJHVnVaM1JvTEZ4dUlDQWdJQ0FnSUNCdmJHUk1aVzRnUFNCdmJHUlRkSEpwYm1jdWJHVnVaM1JvTEZ4dUlDQWdJQ0FnSUNCdVpYZFFiM01nUFNCaVlYTmxVR0YwYUM1dVpYZFFiM01zWEc0Z0lDQWdJQ0FnSUc5c1pGQnZjeUE5SUc1bGQxQnZjeUF0SUdScFlXZHZibUZzVUdGMGFDeGNibHh1SUNBZ0lDQWdJQ0JqYjIxdGIyNURiM1Z1ZENBOUlEQTdYRzRnSUNBZ2QyaHBiR1VnS0c1bGQxQnZjeUFySURFZ1BDQnVaWGRNWlc0Z0ppWWdiMnhrVUc5eklDc2dNU0E4SUc5c1pFeGxiaUFtSmlCMGFHbHpMbVZ4ZFdGc2N5aHVaWGRUZEhKcGJtZGJibVYzVUc5eklDc2dNVjBzSUc5c1pGTjBjbWx1WjF0dmJHUlFiM01nS3lBeFhTa3BJSHRjYmlBZ0lDQWdJRzVsZDFCdmN5c3JPMXh1SUNBZ0lDQWdiMnhrVUc5ekt5czdYRzRnSUNBZ0lDQmpiMjF0YjI1RGIzVnVkQ3NyTzF4dUlDQWdJSDFjYmx4dUlDQWdJR2xtSUNoamIyMXRiMjVEYjNWdWRDa2dlMXh1SUNBZ0lDQWdZbUZ6WlZCaGRHZ3VZMjl0Y0c5dVpXNTBjeTV3ZFhOb0tIdGpiM1Z1ZERvZ1kyOXRiVzl1UTI5MWJuUjlLVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQmlZWE5sVUdGMGFDNXVaWGRRYjNNZ1BTQnVaWGRRYjNNN1hHNGdJQ0FnY21WMGRYSnVJRzlzWkZCdmN6dGNiaUFnZlN4Y2JseHVJQ0JsY1hWaGJITW9iR1ZtZEN3Z2NtbG5hSFFwSUh0Y2JpQWdJQ0JwWmlBb2RHaHBjeTV2Y0hScGIyNXpMbU52YlhCaGNtRjBiM0lwSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxtOXdkR2x2Ym5NdVkyOXRjR0Z5WVhSdmNpaHNaV1owTENCeWFXZG9kQ2s3WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCc1pXWjBJRDA5UFNCeWFXZG9kRnh1SUNBZ0lDQWdJQ0I4ZkNBb2RHaHBjeTV2Y0hScGIyNXpMbWxuYm05eVpVTmhjMlVnSmlZZ2JHVm1kQzUwYjB4dmQyVnlRMkZ6WlNncElEMDlQU0J5YVdkb2RDNTBiMHh2ZDJWeVEyRnpaU2dwS1R0Y2JpQWdJQ0I5WEc0Z0lIMHNYRzRnSUhKbGJXOTJaVVZ0Y0hSNUtHRnljbUY1S1NCN1hHNGdJQ0FnYkdWMElISmxkQ0E5SUZ0ZE8xeHVJQ0FnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z1lYSnlZWGt1YkdWdVozUm9PeUJwS3lzcElIdGNiaUFnSUNBZ0lHbG1JQ2hoY25KaGVWdHBYU2tnZTF4dUlDQWdJQ0FnSUNCeVpYUXVjSFZ6YUNoaGNuSmhlVnRwWFNrN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQnlaWFE3WEc0Z0lIMHNYRzRnSUdOaGMzUkpibkIxZENoMllXeDFaU2tnZTF4dUlDQWdJSEpsZEhWeWJpQjJZV3gxWlR0Y2JpQWdmU3hjYmlBZ2RHOXJaVzVwZW1Vb2RtRnNkV1VwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdkbUZzZFdVdWMzQnNhWFFvSnljcE8xeHVJQ0I5TEZ4dUlDQnFiMmx1S0dOb1lYSnpLU0I3WEc0Z0lDQWdjbVYwZFhKdUlHTm9ZWEp6TG1wdmFXNG9KeWNwTzF4dUlDQjlYRzU5TzF4dVhHNW1kVzVqZEdsdmJpQmlkV2xzWkZaaGJIVmxjeWhrYVdabUxDQmpiMjF3YjI1bGJuUnpMQ0J1WlhkVGRISnBibWNzSUc5c1pGTjBjbWx1Wnl3Z2RYTmxURzl1WjJWemRGUnZhMlZ1S1NCN1hHNGdJR3hsZENCamIyMXdiMjVsYm5SUWIzTWdQU0F3TEZ4dUlDQWdJQ0FnWTI5dGNHOXVaVzUwVEdWdUlEMGdZMjl0Y0c5dVpXNTBjeTVzWlc1bmRHZ3NYRzRnSUNBZ0lDQnVaWGRRYjNNZ1BTQXdMRnh1SUNBZ0lDQWdiMnhrVUc5eklEMGdNRHRjYmx4dUlDQm1iM0lnS0RzZ1kyOXRjRzl1Wlc1MFVHOXpJRHdnWTI5dGNHOXVaVzUwVEdWdU95QmpiMjF3YjI1bGJuUlFiM01yS3lrZ2UxeHVJQ0FnSUd4bGRDQmpiMjF3YjI1bGJuUWdQU0JqYjIxd2IyNWxiblJ6VzJOdmJYQnZibVZ1ZEZCdmMxMDdYRzRnSUNBZ2FXWWdLQ0ZqYjIxd2IyNWxiblF1Y21WdGIzWmxaQ2tnZTF4dUlDQWdJQ0FnYVdZZ0tDRmpiMjF3YjI1bGJuUXVZV1JrWldRZ0ppWWdkWE5sVEc5dVoyVnpkRlJ2YTJWdUtTQjdYRzRnSUNBZ0lDQWdJR3hsZENCMllXeDFaU0E5SUc1bGQxTjBjbWx1Wnk1emJHbGpaU2h1WlhkUWIzTXNJRzVsZDFCdmN5QXJJR052YlhCdmJtVnVkQzVqYjNWdWRDazdYRzRnSUNBZ0lDQWdJSFpoYkhWbElEMGdkbUZzZFdVdWJXRndLR1oxYm1OMGFXOXVLSFpoYkhWbExDQnBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2JHVjBJRzlzWkZaaGJIVmxJRDBnYjJ4a1UzUnlhVzVuVzI5c1pGQnZjeUFySUdsZE8xeHVJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQnZiR1JXWVd4MVpTNXNaVzVuZEdnZ1BpQjJZV3gxWlM1c1pXNW5kR2dnUHlCdmJHUldZV3gxWlNBNklIWmhiSFZsTzF4dUlDQWdJQ0FnSUNCOUtUdGNibHh1SUNBZ0lDQWdJQ0JqYjIxd2IyNWxiblF1ZG1Gc2RXVWdQU0JrYVdabUxtcHZhVzRvZG1Gc2RXVXBPMXh1SUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdZMjl0Y0c5dVpXNTBMblpoYkhWbElEMGdaR2xtWmk1cWIybHVLRzVsZDFOMGNtbHVaeTV6YkdsalpTaHVaWGRRYjNNc0lHNWxkMUJ2Y3lBcklHTnZiWEJ2Ym1WdWRDNWpiM1Z1ZENrcE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2JtVjNVRzl6SUNzOUlHTnZiWEJ2Ym1WdWRDNWpiM1Z1ZER0Y2JseHVJQ0FnSUNBZ0x5OGdRMjl0Ylc5dUlHTmhjMlZjYmlBZ0lDQWdJR2xtSUNnaFkyOXRjRzl1Wlc1MExtRmtaR1ZrS1NCN1hHNGdJQ0FnSUNBZ0lHOXNaRkJ2Y3lBclBTQmpiMjF3YjI1bGJuUXVZMjkxYm5RN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJR052YlhCdmJtVnVkQzUyWVd4MVpTQTlJR1JwWm1ZdWFtOXBiaWh2YkdSVGRISnBibWN1YzJ4cFkyVW9iMnhrVUc5ekxDQnZiR1JRYjNNZ0t5QmpiMjF3YjI1bGJuUXVZMjkxYm5RcEtUdGNiaUFnSUNBZ0lHOXNaRkJ2Y3lBclBTQmpiMjF3YjI1bGJuUXVZMjkxYm5RN1hHNWNiaUFnSUNBZ0lDOHZJRkpsZG1WeWMyVWdZV1JrSUdGdVpDQnlaVzF2ZG1VZ2MyOGdjbVZ0YjNabGN5QmhjbVVnYjNWMGNIVjBJR1pwY25OMElIUnZJRzFoZEdOb0lHTnZiVzF2YmlCamIyNTJaVzUwYVc5dVhHNGdJQ0FnSUNBdkx5QlVhR1VnWkdsbVptbHVaeUJoYkdkdmNtbDBhRzBnYVhNZ2RHbGxaQ0IwYnlCaFpHUWdkR2hsYmlCeVpXMXZkbVVnYjNWMGNIVjBJR0Z1WkNCMGFHbHpJR2x6SUhSb1pTQnphVzF3YkdWemRGeHVJQ0FnSUNBZ0x5OGdjbTkxZEdVZ2RHOGdaMlYwSUhSb1pTQmtaWE5wY21Wa0lHOTFkSEIxZENCM2FYUm9JRzFwYm1sdFlXd2diM1psY21obFlXUXVYRzRnSUNBZ0lDQnBaaUFvWTI5dGNHOXVaVzUwVUc5eklDWW1JR052YlhCdmJtVnVkSE5iWTI5dGNHOXVaVzUwVUc5eklDMGdNVjB1WVdSa1pXUXBJSHRjYmlBZ0lDQWdJQ0FnYkdWMElIUnRjQ0E5SUdOdmJYQnZibVZ1ZEhOYlkyOXRjRzl1Wlc1MFVHOXpJQzBnTVYwN1hHNGdJQ0FnSUNBZ0lHTnZiWEJ2Ym1WdWRITmJZMjl0Y0c5dVpXNTBVRzl6SUMwZ01WMGdQU0JqYjIxd2IyNWxiblJ6VzJOdmJYQnZibVZ1ZEZCdmMxMDdYRzRnSUNBZ0lDQWdJR052YlhCdmJtVnVkSE5iWTI5dGNHOXVaVzUwVUc5elhTQTlJSFJ0Y0R0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNBdkx5QlRjR1ZqYVdGc0lHTmhjMlVnYUdGdVpHeGxJR1p2Y2lCM2FHVnVJRzl1WlNCMFpYSnRhVzVoYkNCcGN5QnBaMjV2Y21Wa0lDaHBMbVV1SUhkb2FYUmxjM0JoWTJVcExseHVJQ0F2THlCR2IzSWdkR2hwY3lCallYTmxJSGRsSUcxbGNtZGxJSFJvWlNCMFpYSnRhVzVoYkNCcGJuUnZJSFJvWlNCd2NtbHZjaUJ6ZEhKcGJtY2dZVzVrSUdSeWIzQWdkR2hsSUdOb1lXNW5aUzVjYmlBZ0x5OGdWR2hwY3lCcGN5QnZibXg1SUdGMllXbHNZV0pzWlNCbWIzSWdjM1J5YVc1bklHMXZaR1V1WEc0Z0lHeGxkQ0JzWVhOMFEyOXRjRzl1Wlc1MElEMGdZMjl0Y0c5dVpXNTBjMXRqYjIxd2IyNWxiblJNWlc0Z0xTQXhYVHRjYmlBZ2FXWWdLR052YlhCdmJtVnVkRXhsYmlBK0lERmNiaUFnSUNBZ0lDWW1JSFI1Y0dWdlppQnNZWE4wUTI5dGNHOXVaVzUwTG5aaGJIVmxJRDA5UFNBbmMzUnlhVzVuSjF4dUlDQWdJQ0FnSmlZZ0tHeGhjM1JEYjIxd2IyNWxiblF1WVdSa1pXUWdmSHdnYkdGemRFTnZiWEJ2Ym1WdWRDNXlaVzF2ZG1Wa0tWeHVJQ0FnSUNBZ0ppWWdaR2xtWmk1bGNYVmhiSE1vSnljc0lHeGhjM1JEYjIxd2IyNWxiblF1ZG1Gc2RXVXBLU0I3WEc0Z0lDQWdZMjl0Y0c5dVpXNTBjMXRqYjIxd2IyNWxiblJNWlc0Z0xTQXlYUzUyWVd4MVpTQXJQU0JzWVhOMFEyOXRjRzl1Wlc1MExuWmhiSFZsTzF4dUlDQWdJR052YlhCdmJtVnVkSE11Y0c5d0tDazdYRzRnSUgxY2JseHVJQ0J5WlhSMWNtNGdZMjl0Y0c5dVpXNTBjenRjYm4xY2JseHVablZ1WTNScGIyNGdZMnh2Ym1WUVlYUm9LSEJoZEdncElIdGNiaUFnY21WMGRYSnVJSHNnYm1WM1VHOXpPaUJ3WVhSb0xtNWxkMUJ2Y3l3Z1kyOXRjRzl1Wlc1MGN6b2djR0YwYUM1amIyMXdiMjVsYm5SekxuTnNhV05sS0RBcElIMDdYRzU5WEc0aVhYMD1cblxuXG4vKioqLyB9KSxcbi8qIDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovJ3VzZSBzdHJpY3QnO1xuXG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHMuY2hhcmFjdGVyRGlmZiA9IHVuZGVmaW5lZDtcblx0ZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9kaWZmQ2hhcnMgPSBkaWZmQ2hhcnM7XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fYmFzZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciBfYmFzZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9iYXNlKTtcblxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgZW5kKi92YXIgY2hhcmFjdGVyRGlmZiA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2NoYXJhY3RlckRpZmYgPSBuZXcgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19iYXNlMlsnZGVmYXVsdCddIC8qaXN0YW5idWwgaWdub3JlIGVuZCovKCk7XG5cdGZ1bmN0aW9uIGRpZmZDaGFycyhvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykge1xuXHQgIHJldHVybiBjaGFyYWN0ZXJEaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpO1xuXHR9XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OWthV1ptTDJOb1lYSmhZM1JsY2k1cWN5SmRMQ0p1WVcxbGN5STZXeUprYVdabVEyaGhjbk1pTENKamFHRnlZV04wWlhKRWFXWm1JaXdpYjJ4a1UzUnlJaXdpYm1WM1UzUnlJaXdpYjNCMGFXOXVjeUlzSW1ScFptWWlYU3dpYldGd2NHbHVaM01pT2lJN096czdaME5CUjJkQ1FTeFRMRWRCUVVGQkxGTTdPMEZCU0doQ096czdPenM3ZFVKQlJVOHNTVUZCVFVNc2VVWkJRV2RDTEhkRlFVRjBRanRCUVVOQkxGTkJRVk5FTEZOQlFWUXNRMEZCYlVKRkxFMUJRVzVDTEVWQlFUSkNReXhOUVVFelFpeEZRVUZ0UTBNc1QwRkJia01zUlVGQk5FTTdRVUZCUlN4VFFVRlBTQ3hqUVVGalNTeEpRVUZrTEVOQlFXMUNTQ3hOUVVGdVFpeEZRVUV5UWtNc1RVRkJNMElzUlVGQmJVTkRMRTlCUVc1RExFTkJRVkE3UVVGQmNVUWlMQ0ptYVd4bElqb2lZMmhoY21GamRHVnlMbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaWFXMXdiM0owSUVScFptWWdabkp2YlNBbkxpOWlZWE5sSnp0Y2JseHVaWGh3YjNKMElHTnZibk4wSUdOb1lYSmhZM1JsY2tScFptWWdQU0J1WlhjZ1JHbG1aaWdwTzF4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUdScFptWkRhR0Z5Y3lodmJHUlRkSElzSUc1bGQxTjBjaXdnYjNCMGFXOXVjeWtnZXlCeVpYUjFjbTRnWTJoaGNtRmpkR1Z5UkdsbVppNWthV1ptS0c5c1pGTjBjaXdnYm1WM1UzUnlMQ0J2Y0hScGIyNXpLVHNnZlZ4dUlsMTlcblxuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovJ3VzZSBzdHJpY3QnO1xuXG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHMud29yZERpZmYgPSB1bmRlZmluZWQ7XG5cdGV4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZGlmZldvcmRzID0gZGlmZldvcmRzO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9kaWZmV29yZHNXaXRoU3BhY2UgPSBkaWZmV29yZHNXaXRoU3BhY2U7XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fYmFzZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciBfYmFzZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9iYXNlKTtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3ZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX3BhcmFtcyA9IF9fd2VicGFja19yZXF1aXJlX18oNCkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyAvLyBCYXNlZCBvbiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MYXRpbl9zY3JpcHRfaW5fVW5pY29kZVxuXHQvL1xuXHQvLyBSYW5nZXMgYW5kIGV4Y2VwdGlvbnM6XG5cdC8vIExhdGluLTEgU3VwcGxlbWVudCwgMDA4MOKAkzAwRkZcblx0Ly8gIC0gVSswMEQ3ICDDlyBNdWx0aXBsaWNhdGlvbiBzaWduXG5cdC8vICAtIFUrMDBGNyAgw7cgRGl2aXNpb24gc2lnblxuXHQvLyBMYXRpbiBFeHRlbmRlZC1BLCAwMTAw4oCTMDE3RlxuXHQvLyBMYXRpbiBFeHRlbmRlZC1CLCAwMTgw4oCTMDI0RlxuXHQvLyBJUEEgRXh0ZW5zaW9ucywgMDI1MOKAkzAyQUZcblx0Ly8gU3BhY2luZyBNb2RpZmllciBMZXR0ZXJzLCAwMkIw4oCTMDJGRlxuXHQvLyAgLSBVKzAyQzcgIMuHICYjNzExOyAgQ2Fyb25cblx0Ly8gIC0gVSswMkQ4ICDLmCAmIzcyODsgIEJyZXZlXG5cdC8vICAtIFUrMDJEOSAgy5kgJiM3Mjk7ICBEb3QgQWJvdmVcblx0Ly8gIC0gVSswMkRBICDLmiAmIzczMDsgIFJpbmcgQWJvdmVcblx0Ly8gIC0gVSswMkRCICDLmyAmIzczMTsgIE9nb25la1xuXHQvLyAgLSBVKzAyREMgIMucICYjNzMyOyAgU21hbGwgVGlsZGVcblx0Ly8gIC0gVSswMkREICDLnSAmIzczMzsgIERvdWJsZSBBY3V0ZSBBY2NlbnRcblx0Ly8gTGF0aW4gRXh0ZW5kZWQgQWRkaXRpb25hbCwgMUUwMOKAkzFFRkZcblx0dmFyIGV4dGVuZGVkV29yZENoYXJzID0gL15bQS1aYS16XFx4QzAtXFx1MDJDNlxcdTAyQzgtXFx1MDJEN1xcdTAyREUtXFx1MDJGRlxcdTFFMDAtXFx1MUVGRl0rJC87XG5cblx0dmFyIHJlV2hpdGVzcGFjZSA9IC9cXFMvO1xuXG5cdHZhciB3b3JkRGlmZiA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3dvcmREaWZmID0gbmV3IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fYmFzZTJbJ2RlZmF1bHQnXSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLygpO1xuXHR3b3JkRGlmZi5lcXVhbHMgPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHtcblx0ICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZUNhc2UpIHtcblx0ICAgIGxlZnQgPSBsZWZ0LnRvTG93ZXJDYXNlKCk7XG5cdCAgICByaWdodCA9IHJpZ2h0LnRvTG93ZXJDYXNlKCk7XG5cdCAgfVxuXHQgIHJldHVybiBsZWZ0ID09PSByaWdodCB8fCB0aGlzLm9wdGlvbnMuaWdub3JlV2hpdGVzcGFjZSAmJiAhcmVXaGl0ZXNwYWNlLnRlc3QobGVmdCkgJiYgIXJlV2hpdGVzcGFjZS50ZXN0KHJpZ2h0KTtcblx0fTtcblx0d29yZERpZmYudG9rZW5pemUgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICB2YXIgdG9rZW5zID0gdmFsdWUuc3BsaXQoLyhcXHMrfFxcYikvKTtcblxuXHQgIC8vIEpvaW4gdGhlIGJvdW5kYXJ5IHNwbGl0cyB0aGF0IHdlIGRvIG5vdCBjb25zaWRlciB0byBiZSBib3VuZGFyaWVzLiBUaGlzIGlzIHByaW1hcmlseSB0aGUgZXh0ZW5kZWQgTGF0aW4gY2hhcmFjdGVyIHNldC5cblx0ICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGggLSAxOyBpKyspIHtcblx0ICAgIC8vIElmIHdlIGhhdmUgYW4gZW1wdHkgc3RyaW5nIGluIHRoZSBuZXh0IGZpZWxkIGFuZCB3ZSBoYXZlIG9ubHkgd29yZCBjaGFycyBiZWZvcmUgYW5kIGFmdGVyLCBtZXJnZVxuXHQgICAgaWYgKCF0b2tlbnNbaSArIDFdICYmIHRva2Vuc1tpICsgMl0gJiYgZXh0ZW5kZWRXb3JkQ2hhcnMudGVzdCh0b2tlbnNbaV0pICYmIGV4dGVuZGVkV29yZENoYXJzLnRlc3QodG9rZW5zW2kgKyAyXSkpIHtcblx0ICAgICAgdG9rZW5zW2ldICs9IHRva2Vuc1tpICsgMl07XG5cdCAgICAgIHRva2Vucy5zcGxpY2UoaSArIDEsIDIpO1xuXHQgICAgICBpLS07XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgcmV0dXJuIHRva2Vucztcblx0fTtcblxuXHRmdW5jdGlvbiBkaWZmV29yZHMob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpIHtcblx0ICBvcHRpb25zID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLygwLCBfcGFyYW1zLmdlbmVyYXRlT3B0aW9ucykgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8ob3B0aW9ucywgeyBpZ25vcmVXaGl0ZXNwYWNlOiB0cnVlIH0pO1xuXHQgIHJldHVybiB3b3JkRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGRpZmZXb3Jkc1dpdGhTcGFjZShvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykge1xuXHQgIHJldHVybiB3b3JkRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcblx0fVxuXHQvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTlrYVdabUwzZHZjbVF1YW5NaVhTd2libUZ0WlhNaU9sc2laR2xtWmxkdmNtUnpJaXdpWkdsbVpsZHZjbVJ6VjJsMGFGTndZV05sSWl3aVpYaDBaVzVrWldSWGIzSmtRMmhoY25NaUxDSnlaVmRvYVhSbGMzQmhZMlVpTENKM2IzSmtSR2xtWmlJc0ltVnhkV0ZzY3lJc0lteGxablFpTENKeWFXZG9kQ0lzSW05d2RHbHZibk1pTENKcFoyNXZjbVZEWVhObElpd2lkRzlNYjNkbGNrTmhjMlVpTENKcFoyNXZjbVZYYUdsMFpYTndZV05sSWl3aWRHVnpkQ0lzSW5SdmEyVnVhWHBsSWl3aWRtRnNkV1VpTENKMGIydGxibk1pTENKemNHeHBkQ0lzSW1raUxDSnNaVzVuZEdnaUxDSnpjR3hwWTJVaUxDSnZiR1JUZEhJaUxDSnVaWGRUZEhJaUxDSmthV1ptSWwwc0ltMWhjSEJwYm1keklqb2lPenM3TzJkRFFXMUVaMEpCTEZNc1IwRkJRVUVzVXp0NVJFRkxRVU1zYTBJc1IwRkJRVUVzYTBJN08wRkJlRVJvUWpzN096dDFRa0ZEUVRzN096dDNRa0ZGUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVN4SlFVRk5ReXh2UWtGQmIwSXNLMFJCUVRGQ096dEJRVVZCTEVsQlFVMURMR1ZCUVdVc1NVRkJja0k3TzBGQlJVOHNTVUZCVFVNc0swVkJRVmNzZDBWQlFXcENPMEZCUTFCQkxGTkJRVk5ETEUxQlFWUXNSMEZCYTBJc1ZVRkJVME1zU1VGQlZDeEZRVUZsUXl4TFFVRm1MRVZCUVhOQ08wRkJRM1JETEUxQlFVa3NTMEZCUzBNc1QwRkJUQ3hEUVVGaFF5eFZRVUZxUWl4RlFVRTJRanRCUVVNelFrZ3NWMEZCVDBFc1MwRkJTMGtzVjBGQlRDeEZRVUZRTzBGQlEwRklMRmxCUVZGQkxFMUJRVTFITEZkQlFVNHNSVUZCVWp0QlFVTkVPMEZCUTBRc1UwRkJUMG9zVTBGQlUwTXNTMEZCVkN4SlFVRnRRaXhMUVVGTFF5eFBRVUZNTEVOQlFXRkhMR2RDUVVGaUxFbEJRV2xETEVOQlFVTlNMR0ZCUVdGVExFbEJRV0lzUTBGQmEwSk9MRWxCUVd4Q0xFTkJRV3hETEVsQlFUWkVMRU5CUVVOSUxHRkJRV0ZUTEVsQlFXSXNRMEZCYTBKTUxFdEJRV3hDTEVOQlFYaEdPMEZCUTBRc1EwRk9SRHRCUVU5QlNDeFRRVUZUVXl4UlFVRlVMRWRCUVc5Q0xGVkJRVk5ETEV0QlFWUXNSVUZCWjBJN1FVRkRiRU1zVFVGQlNVTXNVMEZCVTBRc1RVRkJUVVVzUzBGQlRpeERRVUZaTEZWQlFWb3NRMEZCWWpzN1FVRkZRVHRCUVVOQkxFOUJRVXNzU1VGQlNVTXNTVUZCU1N4RFFVRmlMRVZCUVdkQ1FTeEpRVUZKUml4UFFVRlBSeXhOUVVGUUxFZEJRV2RDTEVOQlFYQkRMRVZCUVhWRFJDeEhRVUYyUXl4RlFVRTBRenRCUVVNeFF6dEJRVU5CTEZGQlFVa3NRMEZCUTBZc1QwRkJUMFVzU1VGQlNTeERRVUZZTEVOQlFVUXNTVUZCYTBKR0xFOUJRVTlGTEVsQlFVa3NRMEZCV0N4RFFVRnNRaXhKUVVOTFppeHJRa0ZCYTBKVkxFbEJRV3hDTEVOQlFYVkNSeXhQUVVGUFJTeERRVUZRTEVOQlFYWkNMRU5CUkV3c1NVRkZTMllzYTBKQlFXdENWU3hKUVVGc1FpeERRVUYxUWtjc1QwRkJUMFVzU1VGQlNTeERRVUZZTEVOQlFYWkNMRU5CUmxRc1JVRkZaMFE3UVVGRE9VTkdMR0ZCUVU5RkxFTkJRVkFzUzBGQllVWXNUMEZCVDBVc1NVRkJTU3hEUVVGWUxFTkJRV0k3UVVGRFFVWXNZVUZCVDBrc1RVRkJVQ3hEUVVGalJpeEpRVUZKTEVOQlFXeENMRVZCUVhGQ0xFTkJRWEpDTzBGQlEwRkJPMEZCUTBRN1FVRkRSanM3UVVGRlJDeFRRVUZQUml4TlFVRlFPMEZCUTBRc1EwRm9Ra1E3TzBGQmEwSlBMRk5CUVZObUxGTkJRVlFzUTBGQmJVSnZRaXhOUVVGdVFpeEZRVUV5UWtNc1RVRkJNMElzUlVGQmJVTmlMRTlCUVc1RExFVkJRVFJETzBGQlEycEVRU3haUVVGVkxEaEZRVUZuUWtFc1QwRkJhRUlzUlVGQmVVSXNSVUZCUTBjc2EwSkJRV3RDTEVsQlFXNUNMRVZCUVhwQ0xFTkJRVlk3UVVGRFFTeFRRVUZQVUN4VFFVRlRhMElzU1VGQlZDeERRVUZqUml4TlFVRmtMRVZCUVhOQ1F5eE5RVUYwUWl4RlFVRTRRbUlzVDBGQk9VSXNRMEZCVUR0QlFVTkVPenRCUVVWTkxGTkJRVk5RTEd0Q1FVRlVMRU5CUVRSQ2JVSXNUVUZCTlVJc1JVRkJiME5ETEUxQlFYQkRMRVZCUVRSRFlpeFBRVUUxUXl4RlFVRnhSRHRCUVVNeFJDeFRRVUZQU2l4VFFVRlRhMElzU1VGQlZDeERRVUZqUml4TlFVRmtMRVZCUVhOQ1F5eE5RVUYwUWl4RlFVRTRRbUlzVDBGQk9VSXNRMEZCVUR0QlFVTkVJaXdpWm1sc1pTSTZJbmR2Y21RdWFuTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUpwYlhCdmNuUWdSR2xtWmlCbWNtOXRJQ2N1TDJKaGMyVW5PMXh1YVcxd2IzSjBJSHRuWlc1bGNtRjBaVTl3ZEdsdmJuTjlJR1p5YjIwZ0p5NHVMM1YwYVd3dmNHRnlZVzF6Snp0Y2JseHVMeThnUW1GelpXUWdiMjRnYUhSMGNITTZMeTlsYmk1M2FXdHBjR1ZrYVdFdWIzSm5MM2RwYTJrdlRHRjBhVzVmYzJOeWFYQjBYMmx1WDFWdWFXTnZaR1ZjYmk4dlhHNHZMeUJTWVc1blpYTWdZVzVrSUdWNFkyVndkR2x2Ym5NNlhHNHZMeUJNWVhScGJpMHhJRk4xY0hCc1pXMWxiblFzSURBd09ERGlnSk13TUVaR1hHNHZMeUFnTFNCVkt6QXdSRGNnSU1PWElFMTFiSFJwY0d4cFkyRjBhVzl1SUhOcFoyNWNiaTh2SUNBdElGVXJNREJHTnlBZ3c3Y2dSR2wyYVhOcGIyNGdjMmxuYmx4dUx5OGdUR0YwYVc0Z1JYaDBaVzVrWldRdFFTd2dNREV3TU9LQWt6QXhOMFpjYmk4dklFeGhkR2x1SUVWNGRHVnVaR1ZrTFVJc0lEQXhPRERpZ0pNd01qUkdYRzR2THlCSlVFRWdSWGgwWlc1emFXOXVjeXdnTURJMU1PS0FrekF5UVVaY2JpOHZJRk53WVdOcGJtY2dUVzlrYVdacFpYSWdUR1YwZEdWeWN5d2dNREpDTU9LQWt6QXlSa1pjYmk4dklDQXRJRlVyTURKRE55QWd5NGNnSmlNM01URTdJQ0JEWVhKdmJseHVMeThnSUMwZ1ZTc3dNa1E0SUNETG1DQW1JemN5T0RzZ0lFSnlaWFpsWEc0dkx5QWdMU0JWS3pBeVJEa2dJTXVaSUNZak56STVPeUFnUkc5MElFRmliM1psWEc0dkx5QWdMU0JWS3pBeVJFRWdJTXVhSUNZak56TXdPeUFnVW1sdVp5QkJZbTkyWlZ4dUx5OGdJQzBnVlNzd01rUkNJQ0RMbXlBbUl6Y3pNVHNnSUU5bmIyNWxhMXh1THk4Z0lDMGdWU3N3TWtSRElDRExuQ0FtSXpjek1qc2dJRk50WVd4c0lGUnBiR1JsWEc0dkx5QWdMU0JWS3pBeVJFUWdJTXVkSUNZak56TXpPeUFnUkc5MVlteGxJRUZqZFhSbElFRmpZMlZ1ZEZ4dUx5OGdUR0YwYVc0Z1JYaDBaVzVrWldRZ1FXUmthWFJwYjI1aGJDd2dNVVV3TU9LQWt6RkZSa1pjYm1OdmJuTjBJR1Y0ZEdWdVpHVmtWMjl5WkVOb1lYSnpJRDBnTDE1YllTMTZRUzFhWEZ4MWUwTXdmUzFjWEhWN1JrWjlYRngxZTBRNGZTMWNYSFY3UmpaOVhGeDFlMFk0ZlMxY1hIVjdNa00yZlZ4Y2RYc3lRemg5TFZ4Y2RYc3lSRGQ5WEZ4MWV6SkVSWDB0WEZ4MWV6SkdSbjFjWEhWN01VVXdNSDB0WEZ4MWV6RkZSa1o5WFNza0wzVTdYRzVjYm1OdmJuTjBJSEpsVjJocGRHVnpjR0ZqWlNBOUlDOWNYRk12TzF4dVhHNWxlSEJ2Y25RZ1kyOXVjM1FnZDI5eVpFUnBabVlnUFNCdVpYY2dSR2xtWmlncE8xeHVkMjl5WkVScFptWXVaWEYxWVd4eklEMGdablZ1WTNScGIyNG9iR1ZtZEN3Z2NtbG5hSFFwSUh0Y2JpQWdhV1lnS0hSb2FYTXViM0IwYVc5dWN5NXBaMjV2Y21WRFlYTmxLU0I3WEc0Z0lDQWdiR1ZtZENBOUlHeGxablF1ZEc5TWIzZGxja05oYzJVb0tUdGNiaUFnSUNCeWFXZG9kQ0E5SUhKcFoyaDBMblJ2VEc5M1pYSkRZWE5sS0NrN1hHNGdJSDFjYmlBZ2NtVjBkWEp1SUd4bFpuUWdQVDA5SUhKcFoyaDBJSHg4SUNoMGFHbHpMbTl3ZEdsdmJuTXVhV2R1YjNKbFYyaHBkR1Z6Y0dGalpTQW1KaUFoY21WWGFHbDBaWE53WVdObExuUmxjM1FvYkdWbWRDa2dKaVlnSVhKbFYyaHBkR1Z6Y0dGalpTNTBaWE4wS0hKcFoyaDBLU2s3WEc1OU8xeHVkMjl5WkVScFptWXVkRzlyWlc1cGVtVWdQU0JtZFc1amRHbHZiaWgyWVd4MVpTa2dlMXh1SUNCc1pYUWdkRzlyWlc1eklEMGdkbUZzZFdVdWMzQnNhWFFvTHloY1hITXJmRnhjWWlrdktUdGNibHh1SUNBdkx5QktiMmx1SUhSb1pTQmliM1Z1WkdGeWVTQnpjR3hwZEhNZ2RHaGhkQ0IzWlNCa2J5QnViM1FnWTI5dWMybGtaWElnZEc4Z1ltVWdZbTkxYm1SaGNtbGxjeTRnVkdocGN5QnBjeUJ3Y21sdFlYSnBiSGtnZEdobElHVjRkR1Z1WkdWa0lFeGhkR2x1SUdOb1lYSmhZM1JsY2lCelpYUXVYRzRnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z2RHOXJaVzV6TG14bGJtZDBhQ0F0SURFN0lHa3JLeWtnZTF4dUlDQWdJQzh2SUVsbUlIZGxJR2hoZG1VZ1lXNGdaVzF3ZEhrZ2MzUnlhVzVuSUdsdUlIUm9aU0J1WlhoMElHWnBaV3hrSUdGdVpDQjNaU0JvWVhabElHOXViSGtnZDI5eVpDQmphR0Z5Y3lCaVpXWnZjbVVnWVc1a0lHRm1kR1Z5TENCdFpYSm5aVnh1SUNBZ0lHbG1JQ2doZEc5clpXNXpXMmtnS3lBeFhTQW1KaUIwYjJ0bGJuTmJhU0FySURKZFhHNGdJQ0FnSUNBZ0lDQWdKaVlnWlhoMFpXNWtaV1JYYjNKa1EyaGhjbk11ZEdWemRDaDBiMnRsYm5OYmFWMHBYRzRnSUNBZ0lDQWdJQ0FnSmlZZ1pYaDBaVzVrWldSWGIzSmtRMmhoY25NdWRHVnpkQ2gwYjJ0bGJuTmJhU0FySURKZEtTa2dlMXh1SUNBZ0lDQWdkRzlyWlc1elcybGRJQ3M5SUhSdmEyVnVjMXRwSUNzZ01sMDdYRzRnSUNBZ0lDQjBiMnRsYm5NdWMzQnNhV05sS0drZ0t5QXhMQ0F5S1R0Y2JpQWdJQ0FnSUdrdExUdGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQnlaWFIxY200Z2RHOXJaVzV6TzF4dWZUdGNibHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR1JwWm1aWGIzSmtjeWh2YkdSVGRISXNJRzVsZDFOMGNpd2diM0IwYVc5dWN5a2dlMXh1SUNCdmNIUnBiMjV6SUQwZ1oyVnVaWEpoZEdWUGNIUnBiMjV6S0c5d2RHbHZibk1zSUh0cFoyNXZjbVZYYUdsMFpYTndZV05sT2lCMGNuVmxmU2s3WEc0Z0lISmxkSFZ5YmlCM2IzSmtSR2xtWmk1a2FXWm1LRzlzWkZOMGNpd2dibVYzVTNSeUxDQnZjSFJwYjI1ektUdGNibjFjYmx4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUdScFptWlhiM0prYzFkcGRHaFRjR0ZqWlNodmJHUlRkSElzSUc1bGQxTjBjaXdnYjNCMGFXOXVjeWtnZTF4dUlDQnlaWFIxY200Z2QyOXlaRVJwWm1ZdVpHbG1aaWh2YkdSVGRISXNJRzVsZDFOMGNpd2diM0IwYVc5dWN5azdYRzU5WEc0aVhYMD1cblxuXG4vKioqLyB9KSxcbi8qIDQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovJ3VzZSBzdHJpY3QnO1xuXG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovZ2VuZXJhdGVPcHRpb25zID0gZ2VuZXJhdGVPcHRpb25zO1xuXHRmdW5jdGlvbiBnZW5lcmF0ZU9wdGlvbnMob3B0aW9ucywgZGVmYXVsdHMpIHtcblx0ICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgIGRlZmF1bHRzLmNhbGxiYWNrID0gb3B0aW9ucztcblx0ICB9IGVsc2UgaWYgKG9wdGlvbnMpIHtcblx0ICAgIGZvciAodmFyIG5hbWUgaW4gb3B0aW9ucykge1xuXHQgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHQgICAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuXHQgICAgICAgIGRlZmF1bHRzW25hbWVdID0gb3B0aW9uc1tuYW1lXTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0ICByZXR1cm4gZGVmYXVsdHM7XG5cdH1cblx0Ly8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5MWRHbHNMM0JoY21GdGN5NXFjeUpkTENKdVlXMWxjeUk2V3lKblpXNWxjbUYwWlU5d2RHbHZibk1pTENKdmNIUnBiMjV6SWl3aVpHVm1ZWFZzZEhNaUxDSmpZV3hzWW1GamF5SXNJbTVoYldVaUxDSm9ZWE5QZDI1UWNtOXdaWEowZVNKZExDSnRZWEJ3YVc1bmN5STZJanM3TzJkRFFVRm5Ra0VzWlN4SFFVRkJRU3hsTzBGQlFWUXNVMEZCVTBFc1pVRkJWQ3hEUVVGNVFrTXNUMEZCZWtJc1JVRkJhME5ETEZGQlFXeERMRVZCUVRSRE8wRkJRMnBFTEUxQlFVa3NUMEZCVDBRc1QwRkJVQ3hMUVVGdFFpeFZRVUYyUWl4RlFVRnRRenRCUVVOcVEwTXNZVUZCVTBNc1VVRkJWQ3hIUVVGdlFrWXNUMEZCY0VJN1FVRkRSQ3hIUVVaRUxFMUJSVThzU1VGQlNVRXNUMEZCU2l4RlFVRmhPMEZCUTJ4Q0xGTkJRVXNzU1VGQlNVY3NTVUZCVkN4SlFVRnBRa2dzVDBGQmFrSXNSVUZCTUVJN1FVRkRlRUk3UVVGRFFTeFZRVUZKUVN4UlFVRlJTU3hqUVVGU0xFTkJRWFZDUkN4SlFVRjJRaXhEUVVGS0xFVkJRV3RETzBGQlEyaERSaXhwUWtGQlUwVXNTVUZCVkN4SlFVRnBRa2dzVVVGQlVVY3NTVUZCVWl4RFFVRnFRanRCUVVORU8wRkJRMFk3UVVGRFJqdEJRVU5FTEZOQlFVOUdMRkZCUVZBN1FVRkRSQ0lzSW1acGJHVWlPaUp3WVhKaGJYTXVhbk1pTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKbGVIQnZjblFnWm5WdVkzUnBiMjRnWjJWdVpYSmhkR1ZQY0hScGIyNXpLRzl3ZEdsdmJuTXNJR1JsWm1GMWJIUnpLU0I3WEc0Z0lHbG1JQ2gwZVhCbGIyWWdiM0IwYVc5dWN5QTlQVDBnSjJaMWJtTjBhVzl1SnlrZ2UxeHVJQ0FnSUdSbFptRjFiSFJ6TG1OaGJHeGlZV05ySUQwZ2IzQjBhVzl1Y3p0Y2JpQWdmU0JsYkhObElHbG1JQ2h2Y0hScGIyNXpLU0I3WEc0Z0lDQWdabTl5SUNoc1pYUWdibUZ0WlNCcGJpQnZjSFJwYjI1ektTQjdYRzRnSUNBZ0lDQXZLaUJwYzNSaGJtSjFiQ0JwWjI1dmNtVWdaV3h6WlNBcUwxeHVJQ0FnSUNBZ2FXWWdLRzl3ZEdsdmJuTXVhR0Z6VDNkdVVISnZjR1Z5ZEhrb2JtRnRaU2twSUh0Y2JpQWdJQ0FnSUNBZ1pHVm1ZWFZzZEhOYmJtRnRaVjBnUFNCdmNIUnBiMjV6VzI1aGJXVmRPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNiaUFnZlZ4dUlDQnlaWFIxY200Z1pHVm1ZWFZzZEhNN1hHNTlYRzRpWFgwPVxuXG5cbi8qKiovIH0pLFxuLyogNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8ndXNlIHN0cmljdCc7XG5cblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0cy5saW5lRGlmZiA9IHVuZGVmaW5lZDtcblx0ZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9kaWZmTGluZXMgPSBkaWZmTGluZXM7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2RpZmZUcmltbWVkTGluZXMgPSBkaWZmVHJpbW1lZExpbmVzO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2Jhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2Jhc2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYmFzZSk7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgZW5kKi92YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19wYXJhbXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgZW5kKi92YXIgbGluZURpZmYgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9saW5lRGlmZiA9IG5ldyAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2Jhc2UyWydkZWZhdWx0J10gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8oKTtcblx0bGluZURpZmYudG9rZW5pemUgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICB2YXIgcmV0TGluZXMgPSBbXSxcblx0ICAgICAgbGluZXNBbmROZXdsaW5lcyA9IHZhbHVlLnNwbGl0KC8oXFxufFxcclxcbikvKTtcblxuXHQgIC8vIElnbm9yZSB0aGUgZmluYWwgZW1wdHkgdG9rZW4gdGhhdCBvY2N1cnMgaWYgdGhlIHN0cmluZyBlbmRzIHdpdGggYSBuZXcgbGluZVxuXHQgIGlmICghbGluZXNBbmROZXdsaW5lc1tsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aCAtIDFdKSB7XG5cdCAgICBsaW5lc0FuZE5ld2xpbmVzLnBvcCgpO1xuXHQgIH1cblxuXHQgIC8vIE1lcmdlIHRoZSBjb250ZW50IGFuZCBsaW5lIHNlcGFyYXRvcnMgaW50byBzaW5nbGUgdG9rZW5zXG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICB2YXIgbGluZSA9IGxpbmVzQW5kTmV3bGluZXNbaV07XG5cblx0ICAgIGlmIChpICUgMiAmJiAhdGhpcy5vcHRpb25zLm5ld2xpbmVJc1Rva2VuKSB7XG5cdCAgICAgIHJldExpbmVzW3JldExpbmVzLmxlbmd0aCAtIDFdICs9IGxpbmU7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZVdoaXRlc3BhY2UpIHtcblx0ICAgICAgICBsaW5lID0gbGluZS50cmltKCk7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0TGluZXMucHVzaChsaW5lKTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICByZXR1cm4gcmV0TGluZXM7XG5cdH07XG5cblx0ZnVuY3Rpb24gZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykge1xuXHQgIHJldHVybiBsaW5lRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjayk7XG5cdH1cblx0ZnVuY3Rpb24gZGlmZlRyaW1tZWRMaW5lcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHtcblx0ICB2YXIgb3B0aW9ucyA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oMCwgX3BhcmFtcy5nZW5lcmF0ZU9wdGlvbnMpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovKGNhbGxiYWNrLCB7IGlnbm9yZVdoaXRlc3BhY2U6IHRydWUgfSk7XG5cdCAgcmV0dXJuIGxpbmVEaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpO1xuXHR9XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OWthV1ptTDJ4cGJtVXVhbk1pWFN3aWJtRnRaWE1pT2xzaVpHbG1aa3hwYm1Weklpd2laR2xtWmxSeWFXMXRaV1JNYVc1bGN5SXNJbXhwYm1WRWFXWm1JaXdpZEc5clpXNXBlbVVpTENKMllXeDFaU0lzSW5KbGRFeHBibVZ6SWl3aWJHbHVaWE5CYm1ST1pYZHNhVzVsY3lJc0luTndiR2wwSWl3aWJHVnVaM1JvSWl3aWNHOXdJaXdpYVNJc0lteHBibVVpTENKdmNIUnBiMjV6SWl3aWJtVjNiR2x1WlVselZHOXJaVzRpTENKcFoyNXZjbVZYYUdsMFpYTndZV05sSWl3aWRISnBiU0lzSW5CMWMyZ2lMQ0p2YkdSVGRISWlMQ0p1WlhkVGRISWlMQ0pqWVd4c1ltRmpheUlzSW1ScFptWWlYU3dpYldGd2NHbHVaM01pT2lJN096czdaME5CT0VKblFrRXNVeXhIUVVGQlFTeFRPM2xFUVVOQlF5eG5RaXhIUVVGQlFTeG5RanM3UVVFdlFtaENPenM3TzNWQ1FVTkJPenM3TzNWQ1FVVlBMRWxCUVUxRExDdEZRVUZYTEhkRlFVRnFRanRCUVVOUVFTeFRRVUZUUXl4UlFVRlVMRWRCUVc5Q0xGVkJRVk5ETEV0QlFWUXNSVUZCWjBJN1FVRkRiRU1zVFVGQlNVTXNWMEZCVnl4RlFVRm1PMEZCUVVFc1RVRkRTVU1zYlVKQlFXMUNSaXhOUVVGTlJ5eExRVUZPTEVOQlFWa3NWMEZCV2l4RFFVUjJRanM3UVVGSFFUdEJRVU5CTEUxQlFVa3NRMEZCUTBRc2FVSkJRV2xDUVN4cFFrRkJhVUpGTEUxQlFXcENMRWRCUVRCQ0xFTkJRVE5ETEVOQlFVd3NSVUZCYjBRN1FVRkRiRVJHTEhGQ1FVRnBRa2NzUjBGQmFrSTdRVUZEUkRzN1FVRkZSRHRCUVVOQkxFOUJRVXNzU1VGQlNVTXNTVUZCU1N4RFFVRmlMRVZCUVdkQ1FTeEpRVUZKU2l4cFFrRkJhVUpGTEUxQlFYSkRMRVZCUVRaRFJTeEhRVUUzUXl4RlFVRnJSRHRCUVVOb1JDeFJRVUZKUXl4UFFVRlBUQ3hwUWtGQmFVSkpMRU5CUVdwQ0xFTkJRVmc3TzBGQlJVRXNVVUZCU1VFc1NVRkJTU3hEUVVGS0xFbEJRVk1zUTBGQlF5eExRVUZMUlN4UFFVRk1MRU5CUVdGRExHTkJRVE5DTEVWQlFUSkRPMEZCUTNwRFVpeGxRVUZUUVN4VFFVRlRSeXhOUVVGVUxFZEJRV3RDTEVOQlFUTkNMRXRCUVdsRFJ5eEpRVUZxUXp0QlFVTkVMRXRCUmtRc1RVRkZUenRCUVVOTUxGVkJRVWtzUzBGQlMwTXNUMEZCVEN4RFFVRmhSU3huUWtGQmFrSXNSVUZCYlVNN1FVRkRha05JTEdWQlFVOUJMRXRCUVV0SkxFbEJRVXdzUlVGQlVEdEJRVU5FTzBGQlEwUldMR1ZCUVZOWExFbEJRVlFzUTBGQlkwd3NTVUZCWkR0QlFVTkVPMEZCUTBZN08wRkJSVVFzVTBGQlQwNHNVVUZCVUR0QlFVTkVMRU5CZUVKRU96dEJRVEJDVHl4VFFVRlRUQ3hUUVVGVUxFTkJRVzFDYVVJc1RVRkJia0lzUlVGQk1rSkRMRTFCUVROQ0xFVkJRVzFEUXl4UlFVRnVReXhGUVVFMlF6dEJRVUZGTEZOQlFVOXFRaXhUUVVGVGEwSXNTVUZCVkN4RFFVRmpTQ3hOUVVGa0xFVkJRWE5DUXl4TlFVRjBRaXhGUVVFNFFrTXNVVUZCT1VJc1EwRkJVRHRCUVVGcFJEdEJRVU5vUnl4VFFVRlRiRUlzWjBKQlFWUXNRMEZCTUVKblFpeE5RVUV4UWl4RlFVRnJRME1zVFVGQmJFTXNSVUZCTUVORExGRkJRVEZETEVWQlFXOUVPMEZCUTNwRUxFMUJRVWxRTEZWQlFWVXNPRVZCUVdkQ1R5eFJRVUZvUWl4RlFVRXdRaXhGUVVGRFRDeHJRa0ZCYTBJc1NVRkJia0lzUlVGQk1VSXNRMEZCWkR0QlFVTkJMRk5CUVU5YUxGTkJRVk5yUWl4SlFVRlVMRU5CUVdOSUxFMUJRV1FzUlVGQmMwSkRMRTFCUVhSQ0xFVkJRVGhDVGl4UFFVRTVRaXhEUVVGUU8wRkJRMFFpTENKbWFXeGxJam9pYkdsdVpTNXFjeUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSW1sdGNHOXlkQ0JFYVdabUlHWnliMjBnSnk0dlltRnpaU2M3WEc1cGJYQnZjblFnZTJkbGJtVnlZWFJsVDNCMGFXOXVjMzBnWm5KdmJTQW5MaTR2ZFhScGJDOXdZWEpoYlhNbk8xeHVYRzVsZUhCdmNuUWdZMjl1YzNRZ2JHbHVaVVJwWm1ZZ1BTQnVaWGNnUkdsbVppZ3BPMXh1YkdsdVpVUnBabVl1ZEc5clpXNXBlbVVnUFNCbWRXNWpkR2x2YmloMllXeDFaU2tnZTF4dUlDQnNaWFFnY21WMFRHbHVaWE1nUFNCYlhTeGNiaUFnSUNBZ0lHeHBibVZ6UVc1a1RtVjNiR2x1WlhNZ1BTQjJZV3gxWlM1emNHeHBkQ2d2S0Z4Y2JueGNYSEpjWEc0cEx5azdYRzVjYmlBZ0x5OGdTV2R1YjNKbElIUm9aU0JtYVc1aGJDQmxiWEIwZVNCMGIydGxiaUIwYUdGMElHOWpZM1Z5Y3lCcFppQjBhR1VnYzNSeWFXNW5JR1Z1WkhNZ2QybDBhQ0JoSUc1bGR5QnNhVzVsWEc0Z0lHbG1JQ2doYkdsdVpYTkJibVJPWlhkc2FXNWxjMXRzYVc1bGMwRnVaRTVsZDJ4cGJtVnpMbXhsYm1kMGFDQXRJREZkS1NCN1hHNGdJQ0FnYkdsdVpYTkJibVJPWlhkc2FXNWxjeTV3YjNBb0tUdGNiaUFnZlZ4dVhHNGdJQzh2SUUxbGNtZGxJSFJvWlNCamIyNTBaVzUwSUdGdVpDQnNhVzVsSUhObGNHRnlZWFJ2Y25NZ2FXNTBieUJ6YVc1bmJHVWdkRzlyWlc1elhHNGdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnYkdsdVpYTkJibVJPWlhkc2FXNWxjeTVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVJQ0FnSUd4bGRDQnNhVzVsSUQwZ2JHbHVaWE5CYm1ST1pYZHNhVzVsYzF0cFhUdGNibHh1SUNBZ0lHbG1JQ2hwSUNVZ01pQW1KaUFoZEdocGN5NXZjSFJwYjI1ekxtNWxkMnhwYm1WSmMxUnZhMlZ1S1NCN1hHNGdJQ0FnSUNCeVpYUk1hVzVsYzF0eVpYUk1hVzVsY3k1c1pXNW5kR2dnTFNBeFhTQXJQU0JzYVc1bE8xeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0JwWmlBb2RHaHBjeTV2Y0hScGIyNXpMbWxuYm05eVpWZG9hWFJsYzNCaFkyVXBJSHRjYmlBZ0lDQWdJQ0FnYkdsdVpTQTlJR3hwYm1VdWRISnBiU2dwTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJQ0FnY21WMFRHbHVaWE11Y0hWemFDaHNhVzVsS1R0Y2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNCeVpYUjFjbTRnY21WMFRHbHVaWE03WEc1OU8xeHVYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdaR2xtWmt4cGJtVnpLRzlzWkZOMGNpd2dibVYzVTNSeUxDQmpZV3hzWW1GamF5a2dleUJ5WlhSMWNtNGdiR2x1WlVScFptWXVaR2xtWmlodmJHUlRkSElzSUc1bGQxTjBjaXdnWTJGc2JHSmhZMnNwT3lCOVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1pHbG1abFJ5YVcxdFpXUk1hVzVsY3lodmJHUlRkSElzSUc1bGQxTjBjaXdnWTJGc2JHSmhZMnNwSUh0Y2JpQWdiR1YwSUc5d2RHbHZibk1nUFNCblpXNWxjbUYwWlU5d2RHbHZibk1vWTJGc2JHSmhZMnNzSUh0cFoyNXZjbVZYYUdsMFpYTndZV05sT2lCMGNuVmxmU2s3WEc0Z0lISmxkSFZ5YmlCc2FXNWxSR2xtWmk1a2FXWm1LRzlzWkZOMGNpd2dibVYzVTNSeUxDQnZjSFJwYjI1ektUdGNibjFjYmlKZGZRPT1cblxuXG4vKioqLyB9KSxcbi8qIDYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovJ3VzZSBzdHJpY3QnO1xuXG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHMuc2VudGVuY2VEaWZmID0gdW5kZWZpbmVkO1xuXHRleHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2RpZmZTZW50ZW5jZXMgPSBkaWZmU2VudGVuY2VzO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2Jhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2Jhc2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYmFzZSk7XG5cblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5cdC8qaXN0YW5idWwgaWdub3JlIGVuZCovdmFyIHNlbnRlbmNlRGlmZiA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3NlbnRlbmNlRGlmZiA9IG5ldyAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2Jhc2UyWydkZWZhdWx0J10gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8oKTtcblx0c2VudGVuY2VEaWZmLnRva2VuaXplID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgcmV0dXJuIHZhbHVlLnNwbGl0KC8oXFxTLis/Wy4hP10pKD89XFxzK3wkKS8pO1xuXHR9O1xuXG5cdGZ1bmN0aW9uIGRpZmZTZW50ZW5jZXMob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKSB7XG5cdCAgcmV0dXJuIHNlbnRlbmNlRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjayk7XG5cdH1cblx0Ly8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5a2FXWm1MM05sYm5SbGJtTmxMbXB6SWwwc0ltNWhiV1Z6SWpwYkltUnBabVpUWlc1MFpXNWpaWE1pTENKelpXNTBaVzVqWlVScFptWWlMQ0owYjJ0bGJtbDZaU0lzSW5aaGJIVmxJaXdpYzNCc2FYUWlMQ0p2YkdSVGRISWlMQ0p1WlhkVGRISWlMQ0pqWVd4c1ltRmpheUlzSW1ScFptWWlYU3dpYldGd2NHbHVaM01pT2lJN096czdaME5CVVdkQ1FTeGhMRWRCUVVGQkxHRTdPMEZCVW1oQ096czdPenM3ZFVKQlIwOHNTVUZCVFVNc2RVWkJRV1VzZDBWQlFYSkNPMEZCUTFCQkxHRkJRV0ZETEZGQlFXSXNSMEZCZDBJc1ZVRkJVME1zUzBGQlZDeEZRVUZuUWp0QlFVTjBReXhUUVVGUFFTeE5RVUZOUXl4TFFVRk9MRU5CUVZrc2RVSkJRVm9zUTBGQlVEdEJRVU5FTEVOQlJrUTdPMEZCU1U4c1UwRkJVMG9zWVVGQlZDeERRVUYxUWtzc1RVRkJka0lzUlVGQkswSkRMRTFCUVM5Q0xFVkJRWFZEUXl4UlFVRjJReXhGUVVGcFJEdEJRVUZGTEZOQlFVOU9MR0ZCUVdGUExFbEJRV0lzUTBGQmEwSklMRTFCUVd4Q0xFVkJRVEJDUXl4TlFVRXhRaXhGUVVGclEwTXNVVUZCYkVNc1EwRkJVRHRCUVVGeFJDSXNJbVpwYkdVaU9pSnpaVzUwWlc1alpTNXFjeUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSW1sdGNHOXlkQ0JFYVdabUlHWnliMjBnSnk0dlltRnpaU2M3WEc1Y2JseHVaWGh3YjNKMElHTnZibk4wSUhObGJuUmxibU5sUkdsbVppQTlJRzVsZHlCRWFXWm1LQ2s3WEc1elpXNTBaVzVqWlVScFptWXVkRzlyWlc1cGVtVWdQU0JtZFc1amRHbHZiaWgyWVd4MVpTa2dlMXh1SUNCeVpYUjFjbTRnZG1Gc2RXVXVjM0JzYVhRb0x5aGNYRk11S3o5YkxpRS9YU2tvUHoxY1hITXJmQ1FwTHlrN1hHNTlPMXh1WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWkdsbVpsTmxiblJsYm1ObGN5aHZiR1JUZEhJc0lHNWxkMU4wY2l3Z1kyRnNiR0poWTJzcElIc2djbVYwZFhKdUlITmxiblJsYm1ObFJHbG1aaTVrYVdabUtHOXNaRk4wY2l3Z2JtVjNVM1J5TENCallXeHNZbUZqYXlrN0lIMWNiaUpkZlE9PVxuXG5cbi8qKiovIH0pLFxuLyogNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8ndXNlIHN0cmljdCc7XG5cblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0cy5jc3NEaWZmID0gdW5kZWZpbmVkO1xuXHRleHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2RpZmZDc3MgPSBkaWZmQ3NzO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2Jhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2Jhc2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYmFzZSk7XG5cblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5cdC8qaXN0YW5idWwgaWdub3JlIGVuZCovdmFyIGNzc0RpZmYgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jc3NEaWZmID0gbmV3IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fYmFzZTJbJ2RlZmF1bHQnXSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLygpO1xuXHRjc3NEaWZmLnRva2VuaXplID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgcmV0dXJuIHZhbHVlLnNwbGl0KC8oW3t9OjssXXxcXHMrKS8pO1xuXHR9O1xuXG5cdGZ1bmN0aW9uIGRpZmZDc3Mob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKSB7XG5cdCAgcmV0dXJuIGNzc0RpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spO1xuXHR9XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OWthV1ptTDJOemN5NXFjeUpkTENKdVlXMWxjeUk2V3lKa2FXWm1RM056SWl3aVkzTnpSR2xtWmlJc0luUnZhMlZ1YVhwbElpd2lkbUZzZFdVaUxDSnpjR3hwZENJc0ltOXNaRk4wY2lJc0ltNWxkMU4wY2lJc0ltTmhiR3hpWVdOcklpd2laR2xtWmlKZExDSnRZWEJ3YVc1bmN5STZJanM3T3p0blEwRlBaMEpCTEU4c1IwRkJRVUVzVHpzN1FVRlFhRUk3T3pzN096dDFRa0ZGVHl4SlFVRk5ReXcyUlVGQlZTeDNSVUZCYUVJN1FVRkRVRUVzVVVGQlVVTXNVVUZCVWl4SFFVRnRRaXhWUVVGVFF5eExRVUZVTEVWQlFXZENPMEZCUTJwRExGTkJRVTlCTEUxQlFVMURMRXRCUVU0c1EwRkJXU3hsUVVGYUxFTkJRVkE3UVVGRFJDeERRVVpFT3p0QlFVbFBMRk5CUVZOS0xFOUJRVlFzUTBGQmFVSkxMRTFCUVdwQ0xFVkJRWGxDUXl4TlFVRjZRaXhGUVVGcFEwTXNVVUZCYWtNc1JVRkJNa003UVVGQlJTeFRRVUZQVGl4UlFVRlJUeXhKUVVGU0xFTkJRV0ZJTEUxQlFXSXNSVUZCY1VKRExFMUJRWEpDTEVWQlFUWkNReXhSUVVFM1FpeERRVUZRTzBGQlFXZEVJaXdpWm1sc1pTSTZJbU56Y3k1cWN5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbWx0Y0c5eWRDQkVhV1ptSUdaeWIyMGdKeTR2WW1GelpTYzdYRzVjYm1WNGNHOXlkQ0JqYjI1emRDQmpjM05FYVdabUlEMGdibVYzSUVScFptWW9LVHRjYm1OemMwUnBabVl1ZEc5clpXNXBlbVVnUFNCbWRXNWpkR2x2YmloMllXeDFaU2tnZTF4dUlDQnlaWFIxY200Z2RtRnNkV1V1YzNCc2FYUW9MeWhiZTMwNk95eGRmRnhjY3lzcEx5azdYRzU5TzF4dVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1pHbG1aa056Y3lodmJHUlRkSElzSUc1bGQxTjBjaXdnWTJGc2JHSmhZMnNwSUhzZ2NtVjBkWEp1SUdOemMwUnBabVl1WkdsbVppaHZiR1JUZEhJc0lHNWxkMU4wY2l3Z1kyRnNiR0poWTJzcE95QjlYRzRpWFgwPVxuXG5cbi8qKiovIH0pLFxuLyogOCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8ndXNlIHN0cmljdCc7XG5cblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0cy5qc29uRGlmZiA9IHVuZGVmaW5lZDtcblxuXHR2YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cblx0ZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9kaWZmSnNvbiA9IGRpZmZKc29uO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jYW5vbmljYWxpemUgPSBjYW5vbmljYWxpemU7XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fYmFzZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciBfYmFzZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9iYXNlKTtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3ZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2xpbmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgZW5kKi92YXIgb2JqZWN0UHJvdG90eXBlVG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG5cdHZhciBqc29uRGlmZiA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2pzb25EaWZmID0gbmV3IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fYmFzZTJbJ2RlZmF1bHQnXSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLygpO1xuXHQvLyBEaXNjcmltaW5hdGUgYmV0d2VlbiB0d28gbGluZXMgb2YgcHJldHR5LXByaW50ZWQsIHNlcmlhbGl6ZWQgSlNPTiB3aGVyZSBvbmUgb2YgdGhlbSBoYXMgYVxuXHQvLyBkYW5nbGluZyBjb21tYSBhbmQgdGhlIG90aGVyIGRvZXNuJ3QuIFR1cm5zIG91dCBpbmNsdWRpbmcgdGhlIGRhbmdsaW5nIGNvbW1hIHlpZWxkcyB0aGUgbmljZXN0IG91dHB1dDpcblx0anNvbkRpZmYudXNlTG9uZ2VzdFRva2VuID0gdHJ1ZTtcblxuXHRqc29uRGlmZi50b2tlbml6ZSA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fbGluZS5saW5lRGlmZiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLy50b2tlbml6ZTtcblx0anNvbkRpZmYuY2FzdElucHV0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3VuZGVmaW5lZFJlcGxhY2VtZW50ID0gdGhpcy5vcHRpb25zLnVuZGVmaW5lZFJlcGxhY2VtZW50O1xuXG5cblx0ICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkoY2Fub25pY2FsaXplKHZhbHVlKSwgZnVuY3Rpb24gKGssIHYpIHtcblx0ICAgIGlmICh0eXBlb2YgdiA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0ICAgICAgcmV0dXJuIHVuZGVmaW5lZFJlcGxhY2VtZW50O1xuXHQgICAgfVxuXG5cdCAgICByZXR1cm4gdjtcblx0ICB9LCAnICAnKTtcblx0fTtcblx0anNvbkRpZmYuZXF1YWxzID0gZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7XG5cdCAgcmV0dXJuICgvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2Jhc2UyWydkZWZhdWx0J10gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8ucHJvdG90eXBlLmVxdWFscy5jYWxsKGpzb25EaWZmLCBsZWZ0LnJlcGxhY2UoLywoW1xcclxcbl0pL2csICckMScpLCByaWdodC5yZXBsYWNlKC8sKFtcXHJcXG5dKS9nLCAnJDEnKSlcblx0ICApO1xuXHR9O1xuXG5cdGZ1bmN0aW9uIGRpZmZKc29uKG9sZE9iaiwgbmV3T2JqLCBvcHRpb25zKSB7XG5cdCAgcmV0dXJuIGpzb25EaWZmLmRpZmYob2xkT2JqLCBuZXdPYmosIG9wdGlvbnMpO1xuXHR9XG5cblx0Ly8gVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBwcmVzZW5jZSBvZiBjaXJjdWxhciByZWZlcmVuY2VzIGJ5IGJhaWxpbmcgb3V0IHdoZW4gZW5jb3VudGVyaW5nIGFuXG5cdC8vIG9iamVjdCB0aGF0IGlzIGFscmVhZHkgb24gdGhlIFwic3RhY2tcIiBvZiBpdGVtcyBiZWluZyBwcm9jZXNzZWQuXG5cdGZ1bmN0aW9uIGNhbm9uaWNhbGl6ZShvYmosIHN0YWNrLCByZXBsYWNlbWVudFN0YWNrKSB7XG5cdCAgc3RhY2sgPSBzdGFjayB8fCBbXTtcblx0ICByZXBsYWNlbWVudFN0YWNrID0gcmVwbGFjZW1lbnRTdGFjayB8fCBbXTtcblxuXHQgIHZhciBpID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZvaWQgMCAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQgIGZvciAoaSA9IDA7IGkgPCBzdGFjay5sZW5ndGg7IGkgKz0gMSkge1xuXHQgICAgaWYgKHN0YWNrW2ldID09PSBvYmopIHtcblx0ICAgICAgcmV0dXJuIHJlcGxhY2VtZW50U3RhY2tbaV07XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgdmFyIGNhbm9uaWNhbGl6ZWRPYmogPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdm9pZCAwIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdCAgaWYgKCdbb2JqZWN0IEFycmF5XScgPT09IG9iamVjdFByb3RvdHlwZVRvU3RyaW5nLmNhbGwob2JqKSkge1xuXHQgICAgc3RhY2sucHVzaChvYmopO1xuXHQgICAgY2Fub25pY2FsaXplZE9iaiA9IG5ldyBBcnJheShvYmoubGVuZ3RoKTtcblx0ICAgIHJlcGxhY2VtZW50U3RhY2sucHVzaChjYW5vbmljYWxpemVkT2JqKTtcblx0ICAgIGZvciAoaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpICs9IDEpIHtcblx0ICAgICAgY2Fub25pY2FsaXplZE9ialtpXSA9IGNhbm9uaWNhbGl6ZShvYmpbaV0sIHN0YWNrLCByZXBsYWNlbWVudFN0YWNrKTtcblx0ICAgIH1cblx0ICAgIHN0YWNrLnBvcCgpO1xuXHQgICAgcmVwbGFjZW1lbnRTdGFjay5wb3AoKTtcblx0ICAgIHJldHVybiBjYW5vbmljYWxpemVkT2JqO1xuXHQgIH1cblxuXHQgIGlmIChvYmogJiYgb2JqLnRvSlNPTikge1xuXHQgICAgb2JqID0gb2JqLnRvSlNPTigpO1xuXHQgIH1cblxuXHQgIGlmICggLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyh0eXBlb2YgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9vYmogPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG9iaikpID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwpIHtcblx0ICAgIHN0YWNrLnB1c2gob2JqKTtcblx0ICAgIGNhbm9uaWNhbGl6ZWRPYmogPSB7fTtcblx0ICAgIHJlcGxhY2VtZW50U3RhY2sucHVzaChjYW5vbmljYWxpemVkT2JqKTtcblx0ICAgIHZhciBzb3J0ZWRLZXlzID0gW10sXG5cdCAgICAgICAga2V5ID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZvaWQgMCAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblx0ICAgIGZvciAoa2V5IGluIG9iaikge1xuXHQgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHQgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0ICAgICAgICBzb3J0ZWRLZXlzLnB1c2goa2V5KTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgc29ydGVkS2V5cy5zb3J0KCk7XG5cdCAgICBmb3IgKGkgPSAwOyBpIDwgc29ydGVkS2V5cy5sZW5ndGg7IGkgKz0gMSkge1xuXHQgICAgICBrZXkgPSBzb3J0ZWRLZXlzW2ldO1xuXHQgICAgICBjYW5vbmljYWxpemVkT2JqW2tleV0gPSBjYW5vbmljYWxpemUob2JqW2tleV0sIHN0YWNrLCByZXBsYWNlbWVudFN0YWNrKTtcblx0ICAgIH1cblx0ICAgIHN0YWNrLnBvcCgpO1xuXHQgICAgcmVwbGFjZW1lbnRTdGFjay5wb3AoKTtcblx0ICB9IGVsc2Uge1xuXHQgICAgY2Fub25pY2FsaXplZE9iaiA9IG9iajtcblx0ICB9XG5cdCAgcmV0dXJuIGNhbm9uaWNhbGl6ZWRPYmo7XG5cdH1cblx0Ly8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5a2FXWm1MMnB6YjI0dWFuTWlYU3dpYm1GdFpYTWlPbHNpWkdsbVprcHpiMjRpTENKallXNXZibWxqWVd4cGVtVWlMQ0p2WW1wbFkzUlFjbTkwYjNSNWNHVlViMU4wY21sdVp5SXNJazlpYW1WamRDSXNJbkJ5YjNSdmRIbHdaU0lzSW5SdlUzUnlhVzVuSWl3aWFuTnZia1JwWm1ZaUxDSjFjMlZNYjI1blpYTjBWRzlyWlc0aUxDSjBiMnRsYm1sNlpTSXNJbU5oYzNSSmJuQjFkQ0lzSW5aaGJIVmxJaXdpZFc1a1pXWnBibVZrVW1Wd2JHRmpaVzFsYm5RaUxDSnZjSFJwYjI1eklpd2lTbE5QVGlJc0luTjBjbWx1WjJsbWVTSXNJbXNpTENKMklpd2laWEYxWVd4eklpd2liR1ZtZENJc0luSnBaMmgwSWl3aVkyRnNiQ0lzSW5KbGNHeGhZMlVpTENKdmJHUlBZbW9pTENKdVpYZFBZbW9pTENKa2FXWm1JaXdpYjJKcUlpd2ljM1JoWTJzaUxDSnlaWEJzWVdObGJXVnVkRk4wWVdOcklpd2lhU0lzSW14bGJtZDBhQ0lzSW1OaGJtOXVhV05oYkdsNlpXUlBZbW9pTENKd2RYTm9JaXdpUVhKeVlYa2lMQ0p3YjNBaUxDSjBiMHBUVDA0aUxDSnpiM0owWldSTFpYbHpJaXdpYTJWNUlpd2lhR0Z6VDNkdVVISnZjR1Z5ZEhraUxDSnpiM0owSWwwc0ltMWhjSEJwYm1keklqb2lPenM3T3pzN08yZERRVEpDWjBKQkxGRXNSMEZCUVVFc1VUdDVSRUZKUVVNc1dTeEhRVUZCUVN4Wk96dEJRUzlDYUVJN096czdkVUpCUTBFN096czdkVUpCUlVFc1NVRkJUVU1zTUVKQlFUQkNReXhQUVVGUFF5eFRRVUZRTEVOQlFXbENReXhSUVVGcVJEczdRVUZIVHl4SlFVRk5ReXdyUlVGQlZ5eDNSVUZCYWtJN1FVRkRVRHRCUVVOQk8wRkJRMEZCTEZOQlFWTkRMR1ZCUVZRc1IwRkJNa0lzU1VGQk0wSTdPMEZCUlVGRUxGTkJRVk5GTEZGQlFWUXNSMEZCYjBJc1owVkJRVk5CTEZGQlFUZENPMEZCUTBGR0xGTkJRVk5ITEZOQlFWUXNSMEZCY1VJc1ZVRkJVME1zUzBGQlZDeEZRVUZuUWp0QlFVRkJMSE5FUVVNMVFrTXNiMEpCUkRSQ0xFZEJRMG9zUzBGQlMwTXNUMEZFUkN4RFFVTTFRa1FzYjBKQlJEUkNPenM3UVVGSGJrTXNVMEZCVHl4UFFVRlBSQ3hMUVVGUUxFdEJRV2xDTEZGQlFXcENMRWRCUVRSQ1FTeExRVUUxUWl4SFFVRnZRMGNzUzBGQlMwTXNVMEZCVEN4RFFVRmxZaXhoUVVGaFV5eExRVUZpTEVOQlFXWXNSVUZCYjBNc1ZVRkJVMHNzUTBGQlZDeEZRVUZaUXl4RFFVRmFMRVZCUVdVN1FVRkROVVlzVVVGQlNTeFBRVUZQUVN4RFFVRlFMRXRCUVdFc1YwRkJha0lzUlVGQk9FSTdRVUZETlVJc1lVRkJUMHdzYjBKQlFWQTdRVUZEUkRzN1FVRkZSQ3hYUVVGUFN5eERRVUZRTzBGQlEwUXNSMEZPTUVNc1JVRk5lRU1zU1VGT2QwTXNRMEZCTTBNN1FVRlBSQ3hEUVZaRU8wRkJWMEZXTEZOQlFWTlhMRTFCUVZRc1IwRkJhMElzVlVGQlUwTXNTVUZCVkN4RlFVRmxReXhMUVVGbUxFVkJRWE5DTzBGQlEzUkRMRk5CUVU4c2IwVkJRVXRtTEZOQlFVd3NRMEZCWldFc1RVRkJaaXhEUVVGelFrY3NTVUZCZEVJc1EwRkJNa0prTEZGQlFUTkNMRVZCUVhGRFdTeExRVUZMUnl4UFFVRk1MRU5CUVdFc1dVRkJZaXhGUVVFeVFpeEpRVUV6UWl4RFFVRnlReXhGUVVGMVJVWXNUVUZCVFVVc1QwRkJUaXhEUVVGakxGbEJRV1FzUlVGQk5FSXNTVUZCTlVJc1EwRkJka1U3UVVGQlVEdEJRVU5FTEVOQlJrUTdPMEZCU1U4c1UwRkJVM0pDTEZGQlFWUXNRMEZCYTBKelFpeE5RVUZzUWl4RlFVRXdRa01zVFVGQk1VSXNSVUZCYTBOWUxFOUJRV3hETEVWQlFUSkRPMEZCUVVVc1UwRkJUMDRzVTBGQlUydENMRWxCUVZRc1EwRkJZMFlzVFVGQlpDeEZRVUZ6UWtNc1RVRkJkRUlzUlVGQk9FSllMRTlCUVRsQ0xFTkJRVkE3UVVGQlowUTdPMEZCUlhCSE8wRkJRMEU3UVVGRFR5eFRRVUZUV0N4WlFVRlVMRU5CUVhOQ2QwSXNSMEZCZEVJc1JVRkJNa0pETEV0QlFUTkNMRVZCUVd0RFF5eG5Ra0ZCYkVNc1JVRkJiMFE3UVVGRGVrUkVMRlZCUVZGQkxGTkJRVk1zUlVGQmFrSTdRVUZEUVVNc2NVSkJRVzFDUVN4dlFrRkJiMElzUlVGQmRrTTdPMEZCUlVFc1RVRkJTVU1zYlVOQlFVbzdPMEZCUlVFc1QwRkJTMEVzU1VGQlNTeERRVUZVTEVWQlFWbEJMRWxCUVVsR0xFMUJRVTFITEUxQlFYUkNMRVZCUVRoQ1JDeExRVUZMTEVOQlFXNURMRVZCUVhORE8wRkJRM0JETEZGQlFVbEdMRTFCUVUxRkxFTkJRVTRzVFVGQllVZ3NSMEZCYWtJc1JVRkJjMEk3UVVGRGNFSXNZVUZCVDBVc2FVSkJRV2xDUXl4RFFVRnFRaXhEUVVGUU8wRkJRMFE3UVVGRFJqczdRVUZGUkN4TlFVRkpSU3hyUkVGQlNqczdRVUZGUVN4TlFVRkpMSEZDUVVGeFFqVkNMSGRDUVVGM1FtdENMRWxCUVhoQ0xFTkJRVFpDU3l4SFFVRTNRaXhEUVVGNlFpeEZRVUUwUkR0QlFVTXhSRU1zVlVGQlRVc3NTVUZCVGl4RFFVRlhUaXhIUVVGWU8wRkJRMEZMTEhWQ1FVRnRRaXhKUVVGSlJTeExRVUZLTEVOQlFWVlFMRWxCUVVsSkxFMUJRV1FzUTBGQmJrSTdRVUZEUVVZc2NVSkJRV2xDU1N4SlFVRnFRaXhEUVVGelFrUXNaMEpCUVhSQ08wRkJRMEVzVTBGQlMwWXNTVUZCU1N4RFFVRlVMRVZCUVZsQkxFbEJRVWxJTEVsQlFVbEpMRTFCUVhCQ0xFVkJRVFJDUkN4TFFVRkxMRU5CUVdwRExFVkJRVzlETzBGQlEyeERSU3gxUWtGQmFVSkdMRU5CUVdwQ0xFbEJRWE5DTTBJc1lVRkJZWGRDTEVsQlFVbEhMRU5CUVVvc1EwRkJZaXhGUVVGeFFrWXNTMEZCY2tJc1JVRkJORUpETEdkQ1FVRTFRaXhEUVVGMFFqdEJRVU5FTzBGQlEwUkVMRlZCUVUxUExFZEJRVTQ3UVVGRFFVNHNjVUpCUVdsQ1RTeEhRVUZxUWp0QlFVTkJMRmRCUVU5SUxHZENRVUZRTzBGQlEwUTdPMEZCUlVRc1RVRkJTVXdzVDBGQlQwRXNTVUZCU1ZNc1RVRkJaaXhGUVVGMVFqdEJRVU55UWxRc1ZVRkJUVUVzU1VGQlNWTXNUVUZCU2l4RlFVRk9PMEZCUTBRN08wRkJSVVFzVFVGQlNTeDVSRUZCVDFRc1IwRkJVQ3g1UTBGQlQwRXNSMEZCVUN4UFFVRmxMRkZCUVdZc1NVRkJNa0pCTEZGQlFWRXNTVUZCZGtNc1JVRkJOa003UVVGRE0wTkRMRlZCUVUxTExFbEJRVTRzUTBGQlYwNHNSMEZCV0R0QlFVTkJTeXgxUWtGQmJVSXNSVUZCYmtJN1FVRkRRVWdzY1VKQlFXbENTU3hKUVVGcVFpeERRVUZ6UWtRc1owSkJRWFJDTzBGQlEwRXNVVUZCU1Vzc1lVRkJZU3hGUVVGcVFqdEJRVUZCTEZGQlEwbERMSEZEUVVSS08wRkJSVUVzVTBGQlMwRXNSMEZCVEN4SlFVRlpXQ3hIUVVGYUxFVkJRV2xDTzBGQlEyWTdRVUZEUVN4VlFVRkpRU3hKUVVGSldTeGpRVUZLTEVOQlFXMUNSQ3hIUVVGdVFpeERRVUZLTEVWQlFUWkNPMEZCUXpOQ1JDeHRRa0ZCVjBvc1NVRkJXQ3hEUVVGblFrc3NSMEZCYUVJN1FVRkRSRHRCUVVOR08wRkJRMFJFTEdWQlFWZEhMRWxCUVZnN1FVRkRRU3hUUVVGTFZpeEpRVUZKTEVOQlFWUXNSVUZCV1VFc1NVRkJTVThzVjBGQlYwNHNUVUZCTTBJc1JVRkJiVU5FTEV0QlFVc3NRMEZCZUVNc1JVRkJNa003UVVGRGVrTlJMRmxCUVUxRUxGZEJRVmRRTEVOQlFWZ3NRMEZCVGp0QlFVTkJSU3gxUWtGQmFVSk5MRWRCUVdwQ0xFbEJRWGRDYmtNc1lVRkJZWGRDTEVsQlFVbFhMRWRCUVVvc1EwRkJZaXhGUVVGMVFsWXNTMEZCZGtJc1JVRkJPRUpETEdkQ1FVRTVRaXhEUVVGNFFqdEJRVU5FTzBGQlEwUkVMRlZCUVUxUExFZEJRVTQ3UVVGRFFVNHNjVUpCUVdsQ1RTeEhRVUZxUWp0QlFVTkVMRWRCYmtKRUxFMUJiVUpQTzBGQlEweElMSFZDUVVGdFFrd3NSMEZCYmtJN1FVRkRSRHRCUVVORUxGTkJRVTlMTEdkQ1FVRlFPMEZCUTBRaUxDSm1hV3hsSWpvaWFuTnZiaTVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCRWFXWm1JR1p5YjIwZ0p5NHZZbUZ6WlNjN1hHNXBiWEJ2Y25RZ2UyeHBibVZFYVdabWZTQm1jbTl0SUNjdUwyeHBibVVuTzF4dVhHNWpiMjV6ZENCdlltcGxZM1JRY205MGIzUjVjR1ZVYjFOMGNtbHVaeUE5SUU5aWFtVmpkQzV3Y205MGIzUjVjR1V1ZEc5VGRISnBibWM3WEc1Y2JseHVaWGh3YjNKMElHTnZibk4wSUdwemIyNUVhV1ptSUQwZ2JtVjNJRVJwWm1Zb0tUdGNiaTh2SUVScGMyTnlhVzFwYm1GMFpTQmlaWFIzWldWdUlIUjNieUJzYVc1bGN5QnZaaUJ3Y21WMGRIa3RjSEpwYm5SbFpDd2djMlZ5YVdGc2FYcGxaQ0JLVTA5T0lIZG9aWEpsSUc5dVpTQnZaaUIwYUdWdElHaGhjeUJoWEc0dkx5QmtZVzVuYkdsdVp5QmpiMjF0WVNCaGJtUWdkR2hsSUc5MGFHVnlJR1J2WlhOdUozUXVJRlIxY201eklHOTFkQ0JwYm1Oc2RXUnBibWNnZEdobElHUmhibWRzYVc1bklHTnZiVzFoSUhscFpXeGtjeUIwYUdVZ2JtbGpaWE4wSUc5MWRIQjFkRHBjYm1wemIyNUVhV1ptTG5WelpVeHZibWRsYzNSVWIydGxiaUE5SUhSeWRXVTdYRzVjYm1wemIyNUVhV1ptTG5SdmEyVnVhWHBsSUQwZ2JHbHVaVVJwWm1ZdWRHOXJaVzVwZW1VN1hHNXFjMjl1UkdsbVppNWpZWE4wU1c1d2RYUWdQU0JtZFc1amRHbHZiaWgyWVd4MVpTa2dlMXh1SUNCamIyNXpkQ0I3ZFc1a1pXWnBibVZrVW1Wd2JHRmpaVzFsYm5SOUlEMGdkR2hwY3k1dmNIUnBiMjV6TzF4dVhHNGdJSEpsZEhWeWJpQjBlWEJsYjJZZ2RtRnNkV1VnUFQwOUlDZHpkSEpwYm1jbklEOGdkbUZzZFdVZ09pQktVMDlPTG5OMGNtbHVaMmxtZVNoallXNXZibWxqWVd4cGVtVW9kbUZzZFdVcExDQm1kVzVqZEdsdmJpaHJMQ0IyS1NCN1hHNGdJQ0FnYVdZZ0tIUjVjR1Z2WmlCMklEMDlQU0FuZFc1a1pXWnBibVZrSnlrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUhWdVpHVm1hVzVsWkZKbGNHeGhZMlZ0Wlc1ME8xeHVJQ0FnSUgxY2JseHVJQ0FnSUhKbGRIVnliaUIyTzF4dUlDQjlMQ0FuSUNBbktUdGNibjA3WEc1cWMyOXVSR2xtWmk1bGNYVmhiSE1nUFNCbWRXNWpkR2x2Ymloc1pXWjBMQ0J5YVdkb2RDa2dlMXh1SUNCeVpYUjFjbTRnUkdsbVppNXdjbTkwYjNSNWNHVXVaWEYxWVd4ekxtTmhiR3dvYW5OdmJrUnBabVlzSUd4bFpuUXVjbVZ3YkdGalpTZ3ZMQ2hiWEZ4eVhGeHVYU2t2Wnl3Z0p5UXhKeWtzSUhKcFoyaDBMbkpsY0d4aFkyVW9MeXdvVzF4Y2NseGNibDBwTDJjc0lDY2tNU2NwS1R0Y2JuMDdYRzVjYm1WNGNHOXlkQ0JtZFc1amRHbHZiaUJrYVdabVNuTnZiaWh2YkdSUFltb3NJRzVsZDA5aWFpd2diM0IwYVc5dWN5a2dleUJ5WlhSMWNtNGdhbk52YmtScFptWXVaR2xtWmlodmJHUlBZbW9zSUc1bGQwOWlhaXdnYjNCMGFXOXVjeWs3SUgxY2JseHVMeThnVkdocGN5Qm1kVzVqZEdsdmJpQm9ZVzVrYkdWeklIUm9aU0J3Y21WelpXNWpaU0J2WmlCamFYSmpkV3hoY2lCeVpXWmxjbVZ1WTJWeklHSjVJR0poYVd4cGJtY2diM1YwSUhkb1pXNGdaVzVqYjNWdWRHVnlhVzVuSUdGdVhHNHZMeUJ2WW1wbFkzUWdkR2hoZENCcGN5QmhiSEpsWVdSNUlHOXVJSFJvWlNCY0luTjBZV05yWENJZ2IyWWdhWFJsYlhNZ1ltVnBibWNnY0hKdlkyVnpjMlZrTGx4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUdOaGJtOXVhV05oYkdsNlpTaHZZbW9zSUhOMFlXTnJMQ0J5WlhCc1lXTmxiV1Z1ZEZOMFlXTnJLU0I3WEc0Z0lITjBZV05ySUQwZ2MzUmhZMnNnZkh3Z1cxMDdYRzRnSUhKbGNHeGhZMlZ0Wlc1MFUzUmhZMnNnUFNCeVpYQnNZV05sYldWdWRGTjBZV05ySUh4OElGdGRPMXh1WEc0Z0lHeGxkQ0JwTzF4dVhHNGdJR1p2Y2lBb2FTQTlJREE3SUdrZ1BDQnpkR0ZqYXk1c1pXNW5kR2c3SUdrZ0t6MGdNU2tnZTF4dUlDQWdJR2xtSUNoemRHRmphMXRwWFNBOVBUMGdiMkpxS1NCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnY21Wd2JHRmpaVzFsYm5SVGRHRmphMXRwWFR0Y2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNCc1pYUWdZMkZ1YjI1cFkyRnNhWHBsWkU5aWFqdGNibHh1SUNCcFppQW9KMXR2WW1wbFkzUWdRWEp5WVhsZEp5QTlQVDBnYjJKcVpXTjBVSEp2ZEc5MGVYQmxWRzlUZEhKcGJtY3VZMkZzYkNodlltb3BLU0I3WEc0Z0lDQWdjM1JoWTJzdWNIVnphQ2h2WW1vcE8xeHVJQ0FnSUdOaGJtOXVhV05oYkdsNlpXUlBZbW9nUFNCdVpYY2dRWEp5WVhrb2IySnFMbXhsYm1kMGFDazdYRzRnSUNBZ2NtVndiR0ZqWlcxbGJuUlRkR0ZqYXk1d2RYTm9LR05oYm05dWFXTmhiR2w2WldSUFltb3BPMXh1SUNBZ0lHWnZjaUFvYVNBOUlEQTdJR2tnUENCdlltb3ViR1Z1WjNSb095QnBJQ3M5SURFcElIdGNiaUFnSUNBZ0lHTmhibTl1YVdOaGJHbDZaV1JQWW1wYmFWMGdQU0JqWVc1dmJtbGpZV3hwZW1Vb2IySnFXMmxkTENCemRHRmpheXdnY21Wd2JHRmpaVzFsYm5SVGRHRmpheWs3WEc0Z0lDQWdmVnh1SUNBZ0lITjBZV05yTG5CdmNDZ3BPMXh1SUNBZ0lISmxjR3hoWTJWdFpXNTBVM1JoWTJzdWNHOXdLQ2s3WEc0Z0lDQWdjbVYwZFhKdUlHTmhibTl1YVdOaGJHbDZaV1JQWW1vN1hHNGdJSDFjYmx4dUlDQnBaaUFvYjJKcUlDWW1JRzlpYWk1MGIwcFRUMDRwSUh0Y2JpQWdJQ0J2WW1vZ1BTQnZZbW91ZEc5S1UwOU9LQ2s3WEc0Z0lIMWNibHh1SUNCcFppQW9kSGx3Wlc5bUlHOWlhaUE5UFQwZ0oyOWlhbVZqZENjZ0ppWWdiMkpxSUNFOVBTQnVkV3hzS1NCN1hHNGdJQ0FnYzNSaFkyc3VjSFZ6YUNodlltb3BPMXh1SUNBZ0lHTmhibTl1YVdOaGJHbDZaV1JQWW1vZ1BTQjdmVHRjYmlBZ0lDQnlaWEJzWVdObGJXVnVkRk4wWVdOckxuQjFjMmdvWTJGdWIyNXBZMkZzYVhwbFpFOWlhaWs3WEc0Z0lDQWdiR1YwSUhOdmNuUmxaRXRsZVhNZ1BTQmJYU3hjYmlBZ0lDQWdJQ0FnYTJWNU8xeHVJQ0FnSUdadmNpQW9hMlY1SUdsdUlHOWlhaWtnZTF4dUlDQWdJQ0FnTHlvZ2FYTjBZVzVpZFd3Z2FXZHViM0psSUdWc2MyVWdLaTljYmlBZ0lDQWdJR2xtSUNodlltb3VhR0Z6VDNkdVVISnZjR1Z5ZEhrb2EyVjVLU2tnZTF4dUlDQWdJQ0FnSUNCemIzSjBaV1JMWlhsekxuQjFjMmdvYTJWNUtUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJQ0FnYzI5eWRHVmtTMlY1Y3k1emIzSjBLQ2s3WEc0Z0lDQWdabTl5SUNocElEMGdNRHNnYVNBOElITnZjblJsWkV0bGVYTXViR1Z1WjNSb095QnBJQ3M5SURFcElIdGNiaUFnSUNBZ0lHdGxlU0E5SUhOdmNuUmxaRXRsZVhOYmFWMDdYRzRnSUNBZ0lDQmpZVzV2Ym1sallXeHBlbVZrVDJKcVcydGxlVjBnUFNCallXNXZibWxqWVd4cGVtVW9iMkpxVzJ0bGVWMHNJSE4wWVdOckxDQnlaWEJzWVdObGJXVnVkRk4wWVdOcktUdGNiaUFnSUNCOVhHNGdJQ0FnYzNSaFkyc3VjRzl3S0NrN1hHNGdJQ0FnY21Wd2JHRmpaVzFsYm5SVGRHRmpheTV3YjNBb0tUdGNiaUFnZlNCbGJITmxJSHRjYmlBZ0lDQmpZVzV2Ym1sallXeHBlbVZrVDJKcUlEMGdiMkpxTzF4dUlDQjlYRzRnSUhKbGRIVnliaUJqWVc1dmJtbGpZV3hwZW1Wa1QySnFPMXh1ZlZ4dUlsMTlcblxuXG4vKioqLyB9KSxcbi8qIDkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovJ3VzZSBzdHJpY3QnO1xuXG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHMuYXJyYXlEaWZmID0gdW5kZWZpbmVkO1xuXHRleHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2RpZmZBcnJheXMgPSBkaWZmQXJyYXlzO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2Jhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2Jhc2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYmFzZSk7XG5cblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5cdC8qaXN0YW5idWwgaWdub3JlIGVuZCovdmFyIGFycmF5RGlmZiA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2FycmF5RGlmZiA9IG5ldyAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2Jhc2UyWydkZWZhdWx0J10gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8oKTtcblx0YXJyYXlEaWZmLnRva2VuaXplID0gYXJyYXlEaWZmLmpvaW4gPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICByZXR1cm4gdmFsdWUuc2xpY2UoKTtcblx0fTtcblx0YXJyYXlEaWZmLnJlbW92ZUVtcHR5ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgcmV0dXJuIHZhbHVlO1xuXHR9O1xuXG5cdGZ1bmN0aW9uIGRpZmZBcnJheXMob2xkQXJyLCBuZXdBcnIsIGNhbGxiYWNrKSB7XG5cdCAgcmV0dXJuIGFycmF5RGlmZi5kaWZmKG9sZEFyciwgbmV3QXJyLCBjYWxsYmFjayk7XG5cdH1cblx0Ly8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5a2FXWm1MMkZ5Y21GNUxtcHpJbDBzSW01aGJXVnpJanBiSW1ScFptWkJjbkpoZVhNaUxDSmhjbkpoZVVScFptWWlMQ0owYjJ0bGJtbDZaU0lzSW1wdmFXNGlMQ0oyWVd4MVpTSXNJbk5zYVdObElpd2ljbVZ0YjNabFJXMXdkSGtpTENKdmJHUkJjbklpTENKdVpYZEJjbklpTENKallXeHNZbUZqYXlJc0ltUnBabVlpWFN3aWJXRndjR2x1WjNNaU9pSTdPenM3WjBOQlZXZENRU3hWTEVkQlFVRkJMRlU3TzBGQlZtaENPenM3T3pzN2RVSkJSVThzU1VGQlRVTXNhVVpCUVZrc2QwVkJRV3hDTzBGQlExQkJMRlZCUVZWRExGRkJRVllzUjBGQmNVSkVMRlZCUVZWRkxFbEJRVllzUjBGQmFVSXNWVUZCVTBNc1MwRkJWQ3hGUVVGblFqdEJRVU53UkN4VFFVRlBRU3hOUVVGTlF5eExRVUZPTEVWQlFWQTdRVUZEUkN4RFFVWkVPMEZCUjBGS0xGVkJRVlZMTEZkQlFWWXNSMEZCZDBJc1ZVRkJVMFlzUzBGQlZDeEZRVUZuUWp0QlFVTjBReXhUUVVGUFFTeExRVUZRTzBGQlEwUXNRMEZHUkRzN1FVRkpUeXhUUVVGVFNpeFZRVUZVTEVOQlFXOUNUeXhOUVVGd1FpeEZRVUUwUWtNc1RVRkJOVUlzUlVGQmIwTkRMRkZCUVhCRExFVkJRVGhETzBGQlFVVXNVMEZCVDFJc1ZVRkJWVk1zU1VGQlZpeERRVUZsU0N4TlFVRm1MRVZCUVhWQ1F5eE5RVUYyUWl4RlFVRXJRa01zVVVGQkwwSXNRMEZCVUR0QlFVRnJSQ0lzSW1acGJHVWlPaUpoY25KaGVTNXFjeUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSW1sdGNHOXlkQ0JFYVdabUlHWnliMjBnSnk0dlltRnpaU2M3WEc1Y2JtVjRjRzl5ZENCamIyNXpkQ0JoY25KaGVVUnBabVlnUFNCdVpYY2dSR2xtWmlncE8xeHVZWEp5WVhsRWFXWm1MblJ2YTJWdWFYcGxJRDBnWVhKeVlYbEVhV1ptTG1wdmFXNGdQU0JtZFc1amRHbHZiaWgyWVd4MVpTa2dlMXh1SUNCeVpYUjFjbTRnZG1Gc2RXVXVjMnhwWTJVb0tUdGNibjA3WEc1aGNuSmhlVVJwWm1ZdWNtVnRiM1psUlcxd2RIa2dQU0JtZFc1amRHbHZiaWgyWVd4MVpTa2dlMXh1SUNCeVpYUjFjbTRnZG1Gc2RXVTdYRzU5TzF4dVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1pHbG1aa0Z5Y21GNWN5aHZiR1JCY25Jc0lHNWxkMEZ5Y2l3Z1kyRnNiR0poWTJzcElIc2djbVYwZFhKdUlHRnljbUY1UkdsbVppNWthV1ptS0c5c1pFRnljaXdnYm1WM1FYSnlMQ0JqWVd4c1ltRmpheWs3SUgxY2JpSmRmUT09XG5cblxuLyoqKi8gfSksXG4vKiAxMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8ndXNlIHN0cmljdCc7XG5cblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9hcHBseVBhdGNoID0gYXBwbHlQYXRjaDtcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovYXBwbHlQYXRjaGVzID0gYXBwbHlQYXRjaGVzO1xuXG5cdHZhciAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX3BhcnNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fZGlzdGFuY2VJdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2Rpc3RhbmNlSXRlcmF0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGlzdGFuY2VJdGVyYXRvcik7XG5cblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5cdC8qaXN0YW5idWwgaWdub3JlIGVuZCovZnVuY3Rpb24gYXBwbHlQYXRjaChzb3VyY2UsIHVuaURpZmYpIHtcblx0ICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIC8qaXN0YW5idWwgaWdub3JlIGVuZCovb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cblx0ICBpZiAodHlwZW9mIHVuaURpZmYgPT09ICdzdHJpbmcnKSB7XG5cdCAgICB1bmlEaWZmID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLygwLCBfcGFyc2UucGFyc2VQYXRjaCkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8odW5pRGlmZik7XG5cdCAgfVxuXG5cdCAgaWYgKEFycmF5LmlzQXJyYXkodW5pRGlmZikpIHtcblx0ICAgIGlmICh1bmlEaWZmLmxlbmd0aCA+IDEpIHtcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKCdhcHBseVBhdGNoIG9ubHkgd29ya3Mgd2l0aCBhIHNpbmdsZSBpbnB1dC4nKTtcblx0ICAgIH1cblxuXHQgICAgdW5pRGlmZiA9IHVuaURpZmZbMF07XG5cdCAgfVxuXG5cdCAgLy8gQXBwbHkgdGhlIGRpZmYgdG8gdGhlIGlucHV0XG5cdCAgdmFyIGxpbmVzID0gc291cmNlLnNwbGl0KC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS8pLFxuXHQgICAgICBkZWxpbWl0ZXJzID0gc291cmNlLm1hdGNoKC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS9nKSB8fCBbXSxcblx0ICAgICAgaHVua3MgPSB1bmlEaWZmLmh1bmtzLFxuXHQgICAgICBjb21wYXJlTGluZSA9IG9wdGlvbnMuY29tcGFyZUxpbmUgfHwgZnVuY3Rpb24gKGxpbmVOdW1iZXIsIGxpbmUsIG9wZXJhdGlvbiwgcGF0Y2hDb250ZW50KSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCove1xuXHQgICAgcmV0dXJuICgvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2xpbmUgPT09IHBhdGNoQ29udGVudFxuXHQgICAgKTtcblx0ICB9LFxuXHQgICAgICBlcnJvckNvdW50ID0gMCxcblx0ICAgICAgZnV6ekZhY3RvciA9IG9wdGlvbnMuZnV6ekZhY3RvciB8fCAwLFxuXHQgICAgICBtaW5MaW5lID0gMCxcblx0ICAgICAgb2Zmc2V0ID0gMCxcblx0ICAgICAgcmVtb3ZlRU9GTkwgPSAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdm9pZCAwIC8qaXN0YW5idWwgaWdub3JlIGVuZCovLFxuXHQgICAgICBhZGRFT0ZOTCA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92b2lkIDAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0ICAvKipcblx0ICAgKiBDaGVja3MgaWYgdGhlIGh1bmsgZXhhY3RseSBmaXRzIG9uIHRoZSBwcm92aWRlZCBsb2NhdGlvblxuXHQgICAqL1xuXHQgIGZ1bmN0aW9uIGh1bmtGaXRzKGh1bmssIHRvUG9zKSB7XG5cdCAgICBmb3IgKHZhciBqID0gMDsgaiA8IGh1bmsubGluZXMubGVuZ3RoOyBqKyspIHtcblx0ICAgICAgdmFyIGxpbmUgPSBodW5rLmxpbmVzW2pdLFxuXHQgICAgICAgICAgb3BlcmF0aW9uID0gbGluZVswXSxcblx0ICAgICAgICAgIGNvbnRlbnQgPSBsaW5lLnN1YnN0cigxKTtcblxuXHQgICAgICBpZiAob3BlcmF0aW9uID09PSAnICcgfHwgb3BlcmF0aW9uID09PSAnLScpIHtcblx0ICAgICAgICAvLyBDb250ZXh0IHNhbml0eSBjaGVja1xuXHQgICAgICAgIGlmICghY29tcGFyZUxpbmUodG9Qb3MgKyAxLCBsaW5lc1t0b1Bvc10sIG9wZXJhdGlvbiwgY29udGVudCkpIHtcblx0ICAgICAgICAgIGVycm9yQ291bnQrKztcblxuXHQgICAgICAgICAgaWYgKGVycm9yQ291bnQgPiBmdXp6RmFjdG9yKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdG9Qb3MrKztcblx0ICAgICAgfVxuXHQgICAgfVxuXG5cdCAgICByZXR1cm4gdHJ1ZTtcblx0ICB9XG5cblx0ICAvLyBTZWFyY2ggYmVzdCBmaXQgb2Zmc2V0cyBmb3IgZWFjaCBodW5rIGJhc2VkIG9uIHRoZSBwcmV2aW91cyBvbmVzXG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBodW5rcy5sZW5ndGg7IGkrKykge1xuXHQgICAgdmFyIGh1bmsgPSBodW5rc1tpXSxcblx0ICAgICAgICBtYXhMaW5lID0gbGluZXMubGVuZ3RoIC0gaHVuay5vbGRMaW5lcyxcblx0ICAgICAgICBsb2NhbE9mZnNldCA9IDAsXG5cdCAgICAgICAgdG9Qb3MgPSBvZmZzZXQgKyBodW5rLm9sZFN0YXJ0IC0gMTtcblxuXHQgICAgdmFyIGl0ZXJhdG9yID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLygwLCBfZGlzdGFuY2VJdGVyYXRvcjJbJ2RlZmF1bHQnXSkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8odG9Qb3MsIG1pbkxpbmUsIG1heExpbmUpO1xuXG5cdCAgICBmb3IgKDsgbG9jYWxPZmZzZXQgIT09IHVuZGVmaW5lZDsgbG9jYWxPZmZzZXQgPSBpdGVyYXRvcigpKSB7XG5cdCAgICAgIGlmIChodW5rRml0cyhodW5rLCB0b1BvcyArIGxvY2FsT2Zmc2V0KSkge1xuXHQgICAgICAgIGh1bmsub2Zmc2V0ID0gb2Zmc2V0ICs9IGxvY2FsT2Zmc2V0O1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICB9XG5cdCAgICB9XG5cblx0ICAgIGlmIChsb2NhbE9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgIH1cblxuXHQgICAgLy8gU2V0IGxvd2VyIHRleHQgbGltaXQgdG8gZW5kIG9mIHRoZSBjdXJyZW50IGh1bmssIHNvIG5leHQgb25lcyBkb24ndCB0cnlcblx0ICAgIC8vIHRvIGZpdCBvdmVyIGFscmVhZHkgcGF0Y2hlZCB0ZXh0XG5cdCAgICBtaW5MaW5lID0gaHVuay5vZmZzZXQgKyBodW5rLm9sZFN0YXJ0ICsgaHVuay5vbGRMaW5lcztcblx0ICB9XG5cblx0ICAvLyBBcHBseSBwYXRjaCBodW5rc1xuXHQgIHZhciBkaWZmT2Zmc2V0ID0gMDtcblx0ICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgaHVua3MubGVuZ3RoOyBfaSsrKSB7XG5cdCAgICB2YXIgX2h1bmsgPSBodW5rc1tfaV0sXG5cdCAgICAgICAgX3RvUG9zID0gX2h1bmsub2xkU3RhcnQgKyBfaHVuay5vZmZzZXQgKyBkaWZmT2Zmc2V0IC0gMTtcblx0ICAgIGRpZmZPZmZzZXQgKz0gX2h1bmsubmV3TGluZXMgLSBfaHVuay5vbGRMaW5lcztcblxuXHQgICAgaWYgKF90b1BvcyA8IDApIHtcblx0ICAgICAgLy8gQ3JlYXRpbmcgYSBuZXcgZmlsZVxuXHQgICAgICBfdG9Qb3MgPSAwO1xuXHQgICAgfVxuXG5cdCAgICBmb3IgKHZhciBqID0gMDsgaiA8IF9odW5rLmxpbmVzLmxlbmd0aDsgaisrKSB7XG5cdCAgICAgIHZhciBsaW5lID0gX2h1bmsubGluZXNbal0sXG5cdCAgICAgICAgICBvcGVyYXRpb24gPSBsaW5lWzBdLFxuXHQgICAgICAgICAgY29udGVudCA9IGxpbmUuc3Vic3RyKDEpLFxuXHQgICAgICAgICAgZGVsaW1pdGVyID0gX2h1bmsubGluZWRlbGltaXRlcnNbal07XG5cblx0ICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG5cdCAgICAgICAgX3RvUG9zKys7XG5cdCAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSAnLScpIHtcblx0ICAgICAgICBsaW5lcy5zcGxpY2UoX3RvUG9zLCAxKTtcblx0ICAgICAgICBkZWxpbWl0ZXJzLnNwbGljZShfdG9Qb3MsIDEpO1xuXHQgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cdCAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSAnKycpIHtcblx0ICAgICAgICBsaW5lcy5zcGxpY2UoX3RvUG9zLCAwLCBjb250ZW50KTtcblx0ICAgICAgICBkZWxpbWl0ZXJzLnNwbGljZShfdG9Qb3MsIDAsIGRlbGltaXRlcik7XG5cdCAgICAgICAgX3RvUG9zKys7XG5cdCAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSAnXFxcXCcpIHtcblx0ICAgICAgICB2YXIgcHJldmlvdXNPcGVyYXRpb24gPSBfaHVuay5saW5lc1tqIC0gMV0gPyBfaHVuay5saW5lc1tqIC0gMV1bMF0gOiBudWxsO1xuXHQgICAgICAgIGlmIChwcmV2aW91c09wZXJhdGlvbiA9PT0gJysnKSB7XG5cdCAgICAgICAgICByZW1vdmVFT0ZOTCA9IHRydWU7XG5cdCAgICAgICAgfSBlbHNlIGlmIChwcmV2aW91c09wZXJhdGlvbiA9PT0gJy0nKSB7XG5cdCAgICAgICAgICBhZGRFT0ZOTCA9IHRydWU7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgLy8gSGFuZGxlIEVPRk5MIGluc2VydGlvbi9yZW1vdmFsXG5cdCAgaWYgKHJlbW92ZUVPRk5MKSB7XG5cdCAgICB3aGlsZSAoIWxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdKSB7XG5cdCAgICAgIGxpbmVzLnBvcCgpO1xuXHQgICAgICBkZWxpbWl0ZXJzLnBvcCgpO1xuXHQgICAgfVxuXHQgIH0gZWxzZSBpZiAoYWRkRU9GTkwpIHtcblx0ICAgIGxpbmVzLnB1c2goJycpO1xuXHQgICAgZGVsaW1pdGVycy5wdXNoKCdcXG4nKTtcblx0ICB9XG5cdCAgZm9yICh2YXIgX2sgPSAwOyBfayA8IGxpbmVzLmxlbmd0aCAtIDE7IF9rKyspIHtcblx0ICAgIGxpbmVzW19rXSA9IGxpbmVzW19rXSArIGRlbGltaXRlcnNbX2tdO1xuXHQgIH1cblx0ICByZXR1cm4gbGluZXMuam9pbignJyk7XG5cdH1cblxuXHQvLyBXcmFwcGVyIHRoYXQgc3VwcG9ydHMgbXVsdGlwbGUgZmlsZSBwYXRjaGVzIHZpYSBjYWxsYmFja3MuXG5cdGZ1bmN0aW9uIGFwcGx5UGF0Y2hlcyh1bmlEaWZmLCBvcHRpb25zKSB7XG5cdCAgaWYgKHR5cGVvZiB1bmlEaWZmID09PSAnc3RyaW5nJykge1xuXHQgICAgdW5pRGlmZiA9IC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oMCwgX3BhcnNlLnBhcnNlUGF0Y2gpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovKHVuaURpZmYpO1xuXHQgIH1cblxuXHQgIHZhciBjdXJyZW50SW5kZXggPSAwO1xuXHQgIGZ1bmN0aW9uIHByb2Nlc3NJbmRleCgpIHtcblx0ICAgIHZhciBpbmRleCA9IHVuaURpZmZbY3VycmVudEluZGV4KytdO1xuXHQgICAgaWYgKCFpbmRleCkge1xuXHQgICAgICByZXR1cm4gb3B0aW9ucy5jb21wbGV0ZSgpO1xuXHQgICAgfVxuXG5cdCAgICBvcHRpb25zLmxvYWRGaWxlKGluZGV4LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG5cdCAgICAgIGlmIChlcnIpIHtcblx0ICAgICAgICByZXR1cm4gb3B0aW9ucy5jb21wbGV0ZShlcnIpO1xuXHQgICAgICB9XG5cblx0ICAgICAgdmFyIHVwZGF0ZWRDb250ZW50ID0gYXBwbHlQYXRjaChkYXRhLCBpbmRleCwgb3B0aW9ucyk7XG5cdCAgICAgIG9wdGlvbnMucGF0Y2hlZChpbmRleCwgdXBkYXRlZENvbnRlbnQsIGZ1bmN0aW9uIChlcnIpIHtcblx0ICAgICAgICBpZiAoZXJyKSB7XG5cdCAgICAgICAgICByZXR1cm4gb3B0aW9ucy5jb21wbGV0ZShlcnIpO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHByb2Nlc3NJbmRleCgpO1xuXHQgICAgICB9KTtcblx0ICAgIH0pO1xuXHQgIH1cblx0ICBwcm9jZXNzSW5kZXgoKTtcblx0fVxuXHQvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTl3WVhSamFDOWhjSEJzZVM1cWN5SmRMQ0p1WVcxbGN5STZXeUpoY0hCc2VWQmhkR05vSWl3aVlYQndiSGxRWVhSamFHVnpJaXdpYzI5MWNtTmxJaXdpZFc1cFJHbG1aaUlzSW05d2RHbHZibk1pTENKQmNuSmhlU0lzSW1selFYSnlZWGtpTENKc1pXNW5kR2dpTENKRmNuSnZjaUlzSW14cGJtVnpJaXdpYzNCc2FYUWlMQ0prWld4cGJXbDBaWEp6SWl3aWJXRjBZMmdpTENKb2RXNXJjeUlzSW1OdmJYQmhjbVZNYVc1bElpd2liR2x1WlU1MWJXSmxjaUlzSW14cGJtVWlMQ0p2Y0dWeVlYUnBiMjRpTENKd1lYUmphRU52Ym5SbGJuUWlMQ0psY25KdmNrTnZkVzUwSWl3aVpuVjZla1poWTNSdmNpSXNJbTFwYmt4cGJtVWlMQ0p2Wm1aelpYUWlMQ0p5WlcxdmRtVkZUMFpPVENJc0ltRmtaRVZQUms1TUlpd2lhSFZ1YTBacGRITWlMQ0pvZFc1cklpd2lkRzlRYjNNaUxDSnFJaXdpWTI5dWRHVnVkQ0lzSW5OMVluTjBjaUlzSW1raUxDSnRZWGhNYVc1bElpd2liMnhrVEdsdVpYTWlMQ0pzYjJOaGJFOW1abk5sZENJc0ltOXNaRk4wWVhKMElpd2lhWFJsY21GMGIzSWlMQ0oxYm1SbFptbHVaV1FpTENKa2FXWm1UMlptYzJWMElpd2libVYzVEdsdVpYTWlMQ0prWld4cGJXbDBaWElpTENKc2FXNWxaR1ZzYVcxcGRHVnljeUlzSW5Od2JHbGpaU0lzSW5CeVpYWnBiM1Z6VDNCbGNtRjBhVzl1SWl3aWNHOXdJaXdpY0hWemFDSXNJbDlySWl3aWFtOXBiaUlzSW1OMWNuSmxiblJKYm1SbGVDSXNJbkJ5YjJObGMzTkpibVJsZUNJc0ltbHVaR1Y0SWl3aVkyOXRjR3hsZEdVaUxDSnNiMkZrUm1sc1pTSXNJbVZ5Y2lJc0ltUmhkR0VpTENKMWNHUmhkR1ZrUTI5dWRHVnVkQ0lzSW5CaGRHTm9aV1FpWFN3aWJXRndjR2x1WjNNaU9pSTdPenRuUTBGSFowSkJMRlVzUjBGQlFVRXNWVHQ1UkVGdlNVRkRMRmtzUjBGQlFVRXNXVHM3UVVGMlNXaENPenRCUVVOQk96czdPenM3ZFVKQlJVOHNVMEZCVTBRc1ZVRkJWQ3hEUVVGdlFrVXNUVUZCY0VJc1JVRkJORUpETEU5QlFUVkNMRVZCUVcxRU8wRkJRVUVzYzBSQlFXUkRMRTlCUVdNc2RVVkJRVW9zUlVGQlNUczdRVUZEZUVRc1RVRkJTU3hQUVVGUFJDeFBRVUZRTEV0QlFXMUNMRkZCUVhaQ0xFVkJRV2xETzBGQlF5OUNRU3hqUVVGVkxIZEZRVUZYUVN4UFFVRllMRU5CUVZZN1FVRkRSRHM3UVVGRlJDeE5RVUZKUlN4TlFVRk5ReXhQUVVGT0xFTkJRV05JTEU5QlFXUXNRMEZCU2l4RlFVRTBRanRCUVVNeFFpeFJRVUZKUVN4UlFVRlJTU3hOUVVGU0xFZEJRV2xDTEVOQlFYSkNMRVZCUVhkQ08wRkJRM1JDTEZsQlFVMHNTVUZCU1VNc1MwRkJTaXhEUVVGVkxEUkRRVUZXTEVOQlFVNDdRVUZEUkRzN1FVRkZSRXdzWTBGQlZVRXNVVUZCVVN4RFFVRlNMRU5CUVZZN1FVRkRSRHM3UVVGRlJEdEJRVU5CTEUxQlFVbE5MRkZCUVZGUUxFOUJRVTlSTEV0QlFWQXNRMEZCWVN4eFFrRkJZaXhEUVVGYU8wRkJRVUVzVFVGRFNVTXNZVUZCWVZRc1QwRkJUMVVzUzBGQlVDeERRVUZoTEhOQ1FVRmlMRXRCUVhkRExFVkJSSHBFTzBGQlFVRXNUVUZGU1VNc1VVRkJVVllzVVVGQlVWVXNTMEZHY0VJN1FVRkJRU3hOUVVsSlF5eGpRVUZqVml4UlFVRlJWU3hYUVVGU0xFbEJRWGRDTEZWQlFVTkRMRlZCUVVRc1JVRkJZVU1zU1VGQllpeEZRVUZ0UWtNc1UwRkJia0lzUlVGQk9FSkRMRmxCUVRsQ08wRkJRVUVzYlVOQlFTdERSaXhUUVVGVFJUdEJRVUY0UkR0QlFVRkJMRWRCU2pGRE8wRkJRVUVzVFVGTFNVTXNZVUZCWVN4RFFVeHFRanRCUVVGQkxFMUJUVWxETEdGQlFXRm9RaXhSUVVGUlowSXNWVUZCVWl4SlFVRnpRaXhEUVU1MlF6dEJRVUZCTEUxQlQwbERMRlZCUVZVc1EwRlFaRHRCUVVGQkxFMUJVVWxETEZOQlFWTXNRMEZTWWp0QlFVRkJMRTFCVlVsRExEWkRRVlpLTzBGQlFVRXNUVUZYU1VNc01FTkJXRW83TzBGQllVRTdPenRCUVVkQkxGZEJRVk5ETEZGQlFWUXNRMEZCYTBKRExFbEJRV3hDTEVWQlFYZENReXhMUVVGNFFpeEZRVUVyUWp0QlFVTTNRaXhUUVVGTExFbEJRVWxETEVsQlFVa3NRMEZCWWl4RlFVRm5Ra0VzU1VGQlNVWXNTMEZCUzJwQ0xFdEJRVXdzUTBGQlYwWXNUVUZCTDBJc1JVRkJkVU54UWl4SFFVRjJReXhGUVVFMFF6dEJRVU14UXl4VlFVRkpXaXhQUVVGUFZTeExRVUZMYWtJc1MwRkJUQ3hEUVVGWGJVSXNRMEZCV0N4RFFVRllPMEZCUVVFc1ZVRkRTVmdzV1VGQldVUXNTMEZCU3l4RFFVRk1MRU5CUkdoQ08wRkJRVUVzVlVGRlNXRXNWVUZCVldJc1MwRkJTMk1zVFVGQlRDeERRVUZaTEVOQlFWb3NRMEZHWkRzN1FVRkpRU3hWUVVGSllpeGpRVUZqTEVkQlFXUXNTVUZCY1VKQkxHTkJRV01zUjBGQmRrTXNSVUZCTkVNN1FVRkRNVU03UVVGRFFTeFpRVUZKTEVOQlFVTklMRmxCUVZsaExGRkJRVkVzUTBGQmNFSXNSVUZCZFVKc1FpeE5RVUZOYTBJc1MwRkJUaXhEUVVGMlFpeEZRVUZ4UTFZc1UwRkJja01zUlVGQlowUlpMRTlCUVdoRUxFTkJRVXdzUlVGQkswUTdRVUZETjBSV096dEJRVVZCTEdOQlFVbEJMR0ZCUVdGRExGVkJRV3BDTEVWQlFUWkNPMEZCUXpOQ0xHMUNRVUZQTEV0QlFWQTdRVUZEUkR0QlFVTkdPMEZCUTBSUE8wRkJRMFE3UVVGRFJqczdRVUZGUkN4WFFVRlBMRWxCUVZBN1FVRkRSRHM3UVVGRlJEdEJRVU5CTEU5QlFVc3NTVUZCU1Vrc1NVRkJTU3hEUVVGaUxFVkJRV2RDUVN4SlFVRkpiRUlzVFVGQlRVNHNUVUZCTVVJc1JVRkJhME4zUWl4SFFVRnNReXhGUVVGMVF6dEJRVU55UXl4UlFVRkpUQ3hQUVVGUFlpeE5RVUZOYTBJc1EwRkJUaXhEUVVGWU8wRkJRVUVzVVVGRFNVTXNWVUZCVlhaQ0xFMUJRVTFHTEUxQlFVNHNSMEZCWlcxQ0xFdEJRVXRQTEZGQlJHeERPMEZCUVVFc1VVRkZTVU1zWTBGQll5eERRVVpzUWp0QlFVRkJMRkZCUjBsUUxGRkJRVkZNTEZOQlFWTkpMRXRCUVV0VExGRkJRV1FzUjBGQmVVSXNRMEZJY2tNN08wRkJTMEVzVVVGQlNVTXNWMEZCVnl4dlJrRkJhVUpVTEV0QlFXcENMRVZCUVhkQ1RpeFBRVUY0UWl4RlFVRnBRMWNzVDBGQmFrTXNRMEZCWmpzN1FVRkZRU3hYUVVGUFJTeG5Ra0ZCWjBKSExGTkJRWFpDTEVWQlFXdERTQ3hqUVVGalJTeFZRVUZvUkN4RlFVRTBSRHRCUVVNeFJDeFZRVUZKV0N4VFFVRlRReXhKUVVGVUxFVkJRV1ZETEZGQlFWRlBMRmRCUVhaQ0xFTkJRVW9zUlVGQmVVTTdRVUZEZGtOU0xHRkJRVXRLTEUxQlFVd3NSMEZCWTBFc1ZVRkJWVmtzVjBGQmVFSTdRVUZEUVR0QlFVTkVPMEZCUTBZN08wRkJSVVFzVVVGQlNVRXNaMEpCUVdkQ1J5eFRRVUZ3UWl4RlFVRXJRanRCUVVNM1FpeGhRVUZQTEV0QlFWQTdRVUZEUkRzN1FVRkZSRHRCUVVOQk8wRkJRMEZvUWl4alFVRlZTeXhMUVVGTFNpeE5RVUZNTEVkQlFXTkpMRXRCUVV0VExGRkJRVzVDTEVkQlFUaENWQ3hMUVVGTFR5eFJRVUUzUXp0QlFVTkVPenRCUVVWRU8wRkJRMEVzVFVGQlNVc3NZVUZCWVN4RFFVRnFRanRCUVVOQkxFOUJRVXNzU1VGQlNWQXNTMEZCU1N4RFFVRmlMRVZCUVdkQ1FTeExRVUZKYkVJc1RVRkJUVTRzVFVGQk1VSXNSVUZCYTBOM1FpeEpRVUZzUXl4RlFVRjFRenRCUVVOeVF5eFJRVUZKVEN4UlFVRlBZaXhOUVVGTmEwSXNSVUZCVGl4RFFVRllPMEZCUVVFc1VVRkRTVW9zVTBGQlVVUXNUVUZCUzFNc1VVRkJUQ3hIUVVGblFsUXNUVUZCUzBvc1RVRkJja0lzUjBGQk9FSm5RaXhWUVVFNVFpeEhRVUV5UXl4RFFVUjJSRHRCUVVWQlFTeHJRa0ZCWTFvc1RVRkJTMkVzVVVGQlRDeEhRVUZuUW1Jc1RVRkJTMDhzVVVGQmJrTTdPMEZCUlVFc1VVRkJTVTRzVTBGQlVTeERRVUZhTEVWQlFXVTdRVUZCUlR0QlFVTm1RU3hsUVVGUkxFTkJRVkk3UVVGRFJEczdRVUZGUkN4VFFVRkxMRWxCUVVsRExFbEJRVWtzUTBGQllpeEZRVUZuUWtFc1NVRkJTVVlzVFVGQlMycENMRXRCUVV3c1EwRkJWMFlzVFVGQkwwSXNSVUZCZFVOeFFpeEhRVUYyUXl4RlFVRTBRenRCUVVNeFF5eFZRVUZKV2l4UFFVRlBWU3hOUVVGTGFrSXNTMEZCVEN4RFFVRlhiVUlzUTBGQldDeERRVUZZTzBGQlFVRXNWVUZEU1Znc1dVRkJXVVFzUzBGQlN5eERRVUZNTEVOQlJHaENPMEZCUVVFc1ZVRkZTV0VzVlVGQlZXSXNTMEZCUzJNc1RVRkJUQ3hEUVVGWkxFTkJRVm9zUTBGR1pEdEJRVUZCTEZWQlIwbFZMRmxCUVZsa0xFMUJRVXRsTEdOQlFVd3NRMEZCYjBKaUxFTkJRWEJDTEVOQlNHaENPenRCUVV0QkxGVkJRVWxZTEdOQlFXTXNSMEZCYkVJc1JVRkJkVUk3UVVGRGNrSlZPMEZCUTBRc1QwRkdSQ3hOUVVWUExFbEJRVWxXTEdOQlFXTXNSMEZCYkVJc1JVRkJkVUk3UVVGRE5VSlNMR05CUVUxcFF5eE5RVUZPTEVOQlFXRm1MRTFCUVdJc1JVRkJiMElzUTBGQmNFSTdRVUZEUVdoQ0xHMUNRVUZYSzBJc1RVRkJXQ3hEUVVGclFtWXNUVUZCYkVJc1JVRkJlVUlzUTBGQmVrSTdRVUZEUmp0QlFVTkRMRTlCU2swc1RVRkpRU3hKUVVGSlZpeGpRVUZqTEVkQlFXeENMRVZCUVhWQ08wRkJRelZDVWl4alFVRk5hVU1zVFVGQlRpeERRVUZoWml4TlFVRmlMRVZCUVc5Q0xFTkJRWEJDTEVWQlFYVkNSU3hQUVVGMlFqdEJRVU5CYkVJc2JVSkJRVmNyUWl4TlFVRllMRU5CUVd0Q1ppeE5RVUZzUWl4RlFVRjVRaXhEUVVGNlFpeEZRVUUwUW1Fc1UwRkJOVUk3UVVGRFFXSTdRVUZEUkN4UFFVcE5MRTFCU1VFc1NVRkJTVllzWTBGQll5eEpRVUZzUWl4RlFVRjNRanRCUVVNM1FpeFpRVUZKTUVJc2IwSkJRVzlDYWtJc1RVRkJTMnBDTEV0QlFVd3NRMEZCVjIxQ0xFbEJRVWtzUTBGQlppeEpRVUZ2UWtZc1RVRkJTMnBDTEV0QlFVd3NRMEZCVjIxQ0xFbEJRVWtzUTBGQlppeEZRVUZyUWl4RFFVRnNRaXhEUVVGd1FpeEhRVUV5UXl4SlFVRnVSVHRCUVVOQkxGbEJRVWxsTEhOQ1FVRnpRaXhIUVVFeFFpeEZRVUVyUWp0QlFVTTNRbkJDTEhkQ1FVRmpMRWxCUVdRN1FVRkRSQ3hUUVVaRUxFMUJSVThzU1VGQlNXOUNMSE5DUVVGelFpeEhRVUV4UWl4RlFVRXJRanRCUVVOd1EyNUNMSEZDUVVGWExFbEJRVmc3UVVGRFJEdEJRVU5HTzBGQlEwWTdRVUZEUmpzN1FVRkZSRHRCUVVOQkxFMUJRVWxFTEZkQlFVb3NSVUZCYVVJN1FVRkRaaXhYUVVGUExFTkJRVU5rTEUxQlFVMUJMRTFCUVUxR0xFMUJRVTRzUjBGQlpTeERRVUZ5UWl4RFFVRlNMRVZCUVdsRE8wRkJReTlDUlN4WlFVRk5iVU1zUjBGQlRqdEJRVU5CYWtNc2FVSkJRVmRwUXl4SFFVRllPMEZCUTBRN1FVRkRSaXhIUVV4RUxFMUJTMDhzU1VGQlNYQkNMRkZCUVVvc1JVRkJZenRCUVVOdVFtWXNWVUZCVFc5RExFbEJRVTRzUTBGQlZ5eEZRVUZZTzBGQlEwRnNReXhsUVVGWGEwTXNTVUZCV0N4RFFVRm5RaXhKUVVGb1FqdEJRVU5FTzBGQlEwUXNUMEZCU3l4SlFVRkpReXhMUVVGTExFTkJRV1FzUlVGQmFVSkJMRXRCUVV0eVF5eE5RVUZOUml4TlFVRk9MRWRCUVdVc1EwRkJja01zUlVGQmQwTjFReXhKUVVGNFF5eEZRVUU0UXp0QlFVTTFRM0pETEZWQlFVMXhReXhGUVVGT0xFbEJRVmx5UXl4TlFVRk5jVU1zUlVGQlRpeEpRVUZaYmtNc1YwRkJWMjFETEVWQlFWZ3NRMEZCZUVJN1FVRkRSRHRCUVVORUxGTkJRVTl5UXl4TlFVRk5jME1zU1VGQlRpeERRVUZYTEVWQlFWZ3NRMEZCVUR0QlFVTkVPenRCUVVWRU8wRkJRMDhzVTBGQlV6bERMRmxCUVZRc1EwRkJjMEpGTEU5QlFYUkNMRVZCUVN0Q1F5eFBRVUV2UWl4RlFVRjNRenRCUVVNM1F5eE5RVUZKTEU5QlFVOUVMRTlCUVZBc1MwRkJiVUlzVVVGQmRrSXNSVUZCYVVNN1FVRkRMMEpCTEdOQlFWVXNkMFZCUVZkQkxFOUJRVmdzUTBGQlZqdEJRVU5FT3p0QlFVVkVMRTFCUVVrMlF5eGxRVUZsTEVOQlFXNUNPMEZCUTBFc1YwRkJVME1zV1VGQlZDeEhRVUYzUWp0QlFVTjBRaXhSUVVGSlF5eFJRVUZSTDBNc1VVRkJVVFpETEdOQlFWSXNRMEZCV2p0QlFVTkJMRkZCUVVrc1EwRkJRMFVzUzBGQlRDeEZRVUZaTzBGQlExWXNZVUZCVHpsRExGRkJRVkVyUXl4UlFVRlNMRVZCUVZBN1FVRkRSRHM3UVVGRlJDOURMRmxCUVZGblJDeFJRVUZTTEVOQlFXbENSaXhMUVVGcVFpeEZRVUYzUWl4VlFVRlRSeXhIUVVGVUxFVkJRV05ETEVsQlFXUXNSVUZCYjBJN1FVRkRNVU1zVlVGQlNVUXNSMEZCU2l4RlFVRlRPMEZCUTFBc1pVRkJUMnBFTEZGQlFWRXJReXhSUVVGU0xFTkJRV2xDUlN4SFFVRnFRaXhEUVVGUU8wRkJRMFE3TzBGQlJVUXNWVUZCU1VVc2FVSkJRV2xDZGtRc1YwRkJWM05FTEVsQlFWZ3NSVUZCYVVKS0xFdEJRV3BDTEVWQlFYZENPVU1zVDBGQmVFSXNRMEZCY2tJN1FVRkRRVUVzWTBGQlVXOUVMRTlCUVZJc1EwRkJaMEpPTEV0QlFXaENMRVZCUVhWQ1N5eGpRVUYyUWl4RlFVRjFReXhWUVVGVFJpeEhRVUZVTEVWQlFXTTdRVUZEYmtRc1dVRkJTVUVzUjBGQlNpeEZRVUZUTzBGQlExQXNhVUpCUVU5cVJDeFJRVUZSSzBNc1VVRkJVaXhEUVVGcFFrVXNSMEZCYWtJc1EwRkJVRHRCUVVORU96dEJRVVZFU2p0QlFVTkVMRTlCVGtRN1FVRlBSQ3hMUVdKRU8wRkJZMFE3UVVGRFJFRTdRVUZEUkNJc0ltWnBiR1VpT2lKaGNIQnNlUzVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCN2NHRnljMlZRWVhSamFIMGdabkp2YlNBbkxpOXdZWEp6WlNjN1hHNXBiWEJ2Y25RZ1pHbHpkR0Z1WTJWSmRHVnlZWFJ2Y2lCbWNtOXRJQ2N1TGk5MWRHbHNMMlJwYzNSaGJtTmxMV2wwWlhKaGRHOXlKenRjYmx4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUdGd2NHeDVVR0YwWTJnb2MyOTFjbU5sTENCMWJtbEVhV1ptTENCdmNIUnBiMjV6SUQwZ2UzMHBJSHRjYmlBZ2FXWWdLSFI1Y0dWdlppQjFibWxFYVdabUlEMDlQU0FuYzNSeWFXNW5KeWtnZTF4dUlDQWdJSFZ1YVVScFptWWdQU0J3WVhKelpWQmhkR05vS0hWdWFVUnBabVlwTzF4dUlDQjlYRzVjYmlBZ2FXWWdLRUZ5Y21GNUxtbHpRWEp5WVhrb2RXNXBSR2xtWmlrcElIdGNiaUFnSUNCcFppQW9kVzVwUkdsbVppNXNaVzVuZEdnZ1BpQXhLU0I3WEc0Z0lDQWdJQ0IwYUhKdmR5QnVaWGNnUlhKeWIzSW9KMkZ3Y0d4NVVHRjBZMmdnYjI1c2VTQjNiM0pyY3lCM2FYUm9JR0VnYzJsdVoyeGxJR2x1Y0hWMExpY3BPMXh1SUNBZ0lIMWNibHh1SUNBZ0lIVnVhVVJwWm1ZZ1BTQjFibWxFYVdabVd6QmRPMXh1SUNCOVhHNWNiaUFnTHk4Z1FYQndiSGtnZEdobElHUnBabVlnZEc4Z2RHaGxJR2x1Y0hWMFhHNGdJR3hsZENCc2FXNWxjeUE5SUhOdmRYSmpaUzV6Y0d4cGRDZ3ZYRnh5WEZ4dWZGdGNYRzVjWEhaY1hHWmNYSEpjWEhnNE5WMHZLU3hjYmlBZ0lDQWdJR1JsYkdsdGFYUmxjbk1nUFNCemIzVnlZMlV1YldGMFkyZ29MMXhjY2x4Y2JueGJYRnh1WEZ4MlhGeG1YRnh5WEZ4NE9EVmRMMmNwSUh4OElGdGRMRnh1SUNBZ0lDQWdhSFZ1YTNNZ1BTQjFibWxFYVdabUxtaDFibXR6TEZ4dVhHNGdJQ0FnSUNCamIyMXdZWEpsVEdsdVpTQTlJRzl3ZEdsdmJuTXVZMjl0Y0dGeVpVeHBibVVnZkh3Z0tDaHNhVzVsVG5WdFltVnlMQ0JzYVc1bExDQnZjR1Z5WVhScGIyNHNJSEJoZEdOb1EyOXVkR1Z1ZENrZ1BUNGdiR2x1WlNBOVBUMGdjR0YwWTJoRGIyNTBaVzUwS1N4Y2JpQWdJQ0FnSUdWeWNtOXlRMjkxYm5RZ1BTQXdMRnh1SUNBZ0lDQWdablY2ZWtaaFkzUnZjaUE5SUc5d2RHbHZibk11Wm5WNmVrWmhZM1J2Y2lCOGZDQXdMRnh1SUNBZ0lDQWdiV2x1VEdsdVpTQTlJREFzWEc0Z0lDQWdJQ0J2Wm1aelpYUWdQU0F3TEZ4dVhHNGdJQ0FnSUNCeVpXMXZkbVZGVDBaT1RDeGNiaUFnSUNBZ0lHRmtaRVZQUms1TU8xeHVYRzRnSUM4cUtseHVJQ0FnS2lCRGFHVmphM01nYVdZZ2RHaGxJR2gxYm1zZ1pYaGhZM1JzZVNCbWFYUnpJRzl1SUhSb1pTQndjbTkyYVdSbFpDQnNiMk5oZEdsdmJseHVJQ0FnS2k5Y2JpQWdablZ1WTNScGIyNGdhSFZ1YTBacGRITW9hSFZ1YXl3Z2RHOVFiM01wSUh0Y2JpQWdJQ0JtYjNJZ0tHeGxkQ0JxSUQwZ01Ec2dhaUE4SUdoMWJtc3ViR2x1WlhNdWJHVnVaM1JvT3lCcUt5c3BJSHRjYmlBZ0lDQWdJR3hsZENCc2FXNWxJRDBnYUhWdWF5NXNhVzVsYzF0cVhTeGNiaUFnSUNBZ0lDQWdJQ0J2Y0dWeVlYUnBiMjRnUFNCc2FXNWxXekJkTEZ4dUlDQWdJQ0FnSUNBZ0lHTnZiblJsYm5RZ1BTQnNhVzVsTG5OMVluTjBjaWd4S1R0Y2JseHVJQ0FnSUNBZ2FXWWdLRzl3WlhKaGRHbHZiaUE5UFQwZ0p5QW5JSHg4SUc5d1pYSmhkR2x2YmlBOVBUMGdKeTBuS1NCN1hHNGdJQ0FnSUNBZ0lDOHZJRU52Ym5SbGVIUWdjMkZ1YVhSNUlHTm9aV05yWEc0Z0lDQWdJQ0FnSUdsbUlDZ2hZMjl0Y0dGeVpVeHBibVVvZEc5UWIzTWdLeUF4TENCc2FXNWxjMXQwYjFCdmMxMHNJRzl3WlhKaGRHbHZiaXdnWTI5dWRHVnVkQ2twSUh0Y2JpQWdJQ0FnSUNBZ0lDQmxjbkp2Y2tOdmRXNTBLeXM3WEc1Y2JpQWdJQ0FnSUNBZ0lDQnBaaUFvWlhKeWIzSkRiM1Z1ZENBK0lHWjFlbnBHWVdOMGIzSXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCbVlXeHpaVHRjYmlBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdkRzlRYjNNckt6dGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNWNiaUFnSUNCeVpYUjFjbTRnZEhKMVpUdGNiaUFnZlZ4dVhHNGdJQzh2SUZObFlYSmphQ0JpWlhOMElHWnBkQ0J2Wm1aelpYUnpJR1p2Y2lCbFlXTm9JR2gxYm1zZ1ltRnpaV1FnYjI0Z2RHaGxJSEJ5WlhacGIzVnpJRzl1WlhOY2JpQWdabTl5SUNoc1pYUWdhU0E5SURBN0lHa2dQQ0JvZFc1cmN5NXNaVzVuZEdnN0lHa3JLeWtnZTF4dUlDQWdJR3hsZENCb2RXNXJJRDBnYUhWdWEzTmJhVjBzWEc0Z0lDQWdJQ0FnSUcxaGVFeHBibVVnUFNCc2FXNWxjeTVzWlc1bmRHZ2dMU0JvZFc1ckxtOXNaRXhwYm1WekxGeHVJQ0FnSUNBZ0lDQnNiMk5oYkU5bVpuTmxkQ0E5SURBc1hHNGdJQ0FnSUNBZ0lIUnZVRzl6SUQwZ2IyWm1jMlYwSUNzZ2FIVnVheTV2YkdSVGRHRnlkQ0F0SURFN1hHNWNiaUFnSUNCc1pYUWdhWFJsY21GMGIzSWdQU0JrYVhOMFlXNWpaVWwwWlhKaGRHOXlLSFJ2VUc5ekxDQnRhVzVNYVc1bExDQnRZWGhNYVc1bEtUdGNibHh1SUNBZ0lHWnZjaUFvT3lCc2IyTmhiRTltWm5ObGRDQWhQVDBnZFc1a1pXWnBibVZrT3lCc2IyTmhiRTltWm5ObGRDQTlJR2wwWlhKaGRHOXlLQ2twSUh0Y2JpQWdJQ0FnSUdsbUlDaG9kVzVyUm1sMGN5aG9kVzVyTENCMGIxQnZjeUFySUd4dlkyRnNUMlptYzJWMEtTa2dlMXh1SUNBZ0lDQWdJQ0JvZFc1ckxtOW1abk5sZENBOUlHOW1abk5sZENBclBTQnNiMk5oYkU5bVpuTmxkRHRjYmlBZ0lDQWdJQ0FnWW5KbFlXczdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2FXWWdLR3h2WTJGc1QyWm1jMlYwSUQwOVBTQjFibVJsWm1sdVpXUXBJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQm1ZV3h6WlR0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0F2THlCVFpYUWdiRzkzWlhJZ2RHVjRkQ0JzYVcxcGRDQjBieUJsYm1RZ2IyWWdkR2hsSUdOMWNuSmxiblFnYUhWdWF5d2djMjhnYm1WNGRDQnZibVZ6SUdSdmJpZDBJSFJ5ZVZ4dUlDQWdJQzh2SUhSdklHWnBkQ0J2ZG1WeUlHRnNjbVZoWkhrZ2NHRjBZMmhsWkNCMFpYaDBYRzRnSUNBZ2JXbHVUR2x1WlNBOUlHaDFibXN1YjJabWMyVjBJQ3NnYUhWdWF5NXZiR1JUZEdGeWRDQXJJR2gxYm1zdWIyeGtUR2x1WlhNN1hHNGdJSDFjYmx4dUlDQXZMeUJCY0hCc2VTQndZWFJqYUNCb2RXNXJjMXh1SUNCc1pYUWdaR2xtWms5bVpuTmxkQ0E5SURBN1hHNGdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnYUhWdWEzTXViR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0JzWlhRZ2FIVnVheUE5SUdoMWJtdHpXMmxkTEZ4dUlDQWdJQ0FnSUNCMGIxQnZjeUE5SUdoMWJtc3ViMnhrVTNSaGNuUWdLeUJvZFc1ckxtOW1abk5sZENBcklHUnBabVpQWm1aelpYUWdMU0F4TzF4dUlDQWdJR1JwWm1aUFptWnpaWFFnS3owZ2FIVnVheTV1WlhkTWFXNWxjeUF0SUdoMWJtc3ViMnhrVEdsdVpYTTdYRzVjYmlBZ0lDQnBaaUFvZEc5UWIzTWdQQ0F3S1NCN0lDOHZJRU55WldGMGFXNW5JR0VnYm1WM0lHWnBiR1ZjYmlBZ0lDQWdJSFJ2VUc5eklEMGdNRHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQm1iM0lnS0d4bGRDQnFJRDBnTURzZ2FpQThJR2gxYm1zdWJHbHVaWE11YkdWdVozUm9PeUJxS3lzcElIdGNiaUFnSUNBZ0lHeGxkQ0JzYVc1bElEMGdhSFZ1YXk1c2FXNWxjMXRxWFN4Y2JpQWdJQ0FnSUNBZ0lDQnZjR1Z5WVhScGIyNGdQU0JzYVc1bFd6QmRMRnh1SUNBZ0lDQWdJQ0FnSUdOdmJuUmxiblFnUFNCc2FXNWxMbk4xWW5OMGNpZ3hLU3hjYmlBZ0lDQWdJQ0FnSUNCa1pXeHBiV2wwWlhJZ1BTQm9kVzVyTG14cGJtVmtaV3hwYldsMFpYSnpXMnBkTzF4dVhHNGdJQ0FnSUNCcFppQW9iM0JsY21GMGFXOXVJRDA5UFNBbklDY3BJSHRjYmlBZ0lDQWdJQ0FnZEc5UWIzTXJLenRjYmlBZ0lDQWdJSDBnWld4elpTQnBaaUFvYjNCbGNtRjBhVzl1SUQwOVBTQW5MU2NwSUh0Y2JpQWdJQ0FnSUNBZ2JHbHVaWE11YzNCc2FXTmxLSFJ2VUc5ekxDQXhLVHRjYmlBZ0lDQWdJQ0FnWkdWc2FXMXBkR1Z5Y3k1emNHeHBZMlVvZEc5UWIzTXNJREVwTzF4dUlDQWdJQ0FnTHlvZ2FYTjBZVzVpZFd3Z2FXZHViM0psSUdWc2MyVWdLaTljYmlBZ0lDQWdJSDBnWld4elpTQnBaaUFvYjNCbGNtRjBhVzl1SUQwOVBTQW5LeWNwSUh0Y2JpQWdJQ0FnSUNBZ2JHbHVaWE11YzNCc2FXTmxLSFJ2VUc5ekxDQXdMQ0JqYjI1MFpXNTBLVHRjYmlBZ0lDQWdJQ0FnWkdWc2FXMXBkR1Z5Y3k1emNHeHBZMlVvZEc5UWIzTXNJREFzSUdSbGJHbHRhWFJsY2lrN1hHNGdJQ0FnSUNBZ0lIUnZVRzl6S3lzN1hHNGdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tHOXdaWEpoZEdsdmJpQTlQVDBnSjF4Y1hGd25LU0I3WEc0Z0lDQWdJQ0FnSUd4bGRDQndjbVYyYVc5MWMwOXdaWEpoZEdsdmJpQTlJR2gxYm1zdWJHbHVaWE5iYWlBdElERmRJRDhnYUhWdWF5NXNhVzVsYzF0cUlDMGdNVjFiTUYwZ09pQnVkV3hzTzF4dUlDQWdJQ0FnSUNCcFppQW9jSEpsZG1sdmRYTlBjR1Z5WVhScGIyNGdQVDA5SUNjckp5a2dlMXh1SUNBZ0lDQWdJQ0FnSUhKbGJXOTJaVVZQUms1TUlEMGdkSEoxWlR0Y2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaHdjbVYyYVc5MWMwOXdaWEpoZEdsdmJpQTlQVDBnSnkwbktTQjdYRzRnSUNBZ0lDQWdJQ0FnWVdSa1JVOUdUa3dnUFNCMGNuVmxPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1SUNCOVhHNWNiaUFnTHk4Z1NHRnVaR3hsSUVWUFJrNU1JR2x1YzJWeWRHbHZiaTl5WlcxdmRtRnNYRzRnSUdsbUlDaHlaVzF2ZG1WRlQwWk9UQ2tnZTF4dUlDQWdJSGRvYVd4bElDZ2hiR2x1WlhOYmJHbHVaWE11YkdWdVozUm9JQzBnTVYwcElIdGNiaUFnSUNBZ0lHeHBibVZ6TG5CdmNDZ3BPMXh1SUNBZ0lDQWdaR1ZzYVcxcGRHVnljeTV3YjNBb0tUdGNiaUFnSUNCOVhHNGdJSDBnWld4elpTQnBaaUFvWVdSa1JVOUdUa3dwSUh0Y2JpQWdJQ0JzYVc1bGN5NXdkWE5vS0NjbktUdGNiaUFnSUNCa1pXeHBiV2wwWlhKekxuQjFjMmdvSjF4Y2JpY3BPMXh1SUNCOVhHNGdJR1p2Y2lBb2JHVjBJRjlySUQwZ01Ec2dYMnNnUENCc2FXNWxjeTVzWlc1bmRHZ2dMU0F4T3lCZmF5c3JLU0I3WEc0Z0lDQWdiR2x1WlhOYlgydGRJRDBnYkdsdVpYTmJYMnRkSUNzZ1pHVnNhVzFwZEdWeWMxdGZhMTA3WEc0Z0lIMWNiaUFnY21WMGRYSnVJR3hwYm1WekxtcHZhVzRvSnljcE8xeHVmVnh1WEc0dkx5QlhjbUZ3Y0dWeUlIUm9ZWFFnYzNWd2NHOXlkSE1nYlhWc2RHbHdiR1VnWm1sc1pTQndZWFJqYUdWeklIWnBZU0JqWVd4c1ltRmphM011WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWVhCd2JIbFFZWFJqYUdWektIVnVhVVJwWm1Zc0lHOXdkR2x2Ym5NcElIdGNiaUFnYVdZZ0tIUjVjR1Z2WmlCMWJtbEVhV1ptSUQwOVBTQW5jM1J5YVc1bkp5a2dlMXh1SUNBZ0lIVnVhVVJwWm1ZZ1BTQndZWEp6WlZCaGRHTm9LSFZ1YVVScFptWXBPMXh1SUNCOVhHNWNiaUFnYkdWMElHTjFjbkpsYm5SSmJtUmxlQ0E5SURBN1hHNGdJR1oxYm1OMGFXOXVJSEJ5YjJObGMzTkpibVJsZUNncElIdGNiaUFnSUNCc1pYUWdhVzVrWlhnZ1BTQjFibWxFYVdabVcyTjFjbkpsYm5SSmJtUmxlQ3NyWFR0Y2JpQWdJQ0JwWmlBb0lXbHVaR1Y0S1NCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnYjNCMGFXOXVjeTVqYjIxd2JHVjBaU2dwTzF4dUlDQWdJSDFjYmx4dUlDQWdJRzl3ZEdsdmJuTXViRzloWkVacGJHVW9hVzVrWlhnc0lHWjFibU4wYVc5dUtHVnljaXdnWkdGMFlTa2dlMXh1SUNBZ0lDQWdhV1lnS0dWeWNpa2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdiM0IwYVc5dWN5NWpiMjF3YkdWMFpTaGxjbklwTzF4dUlDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNCc1pYUWdkWEJrWVhSbFpFTnZiblJsYm5RZ1BTQmhjSEJzZVZCaGRHTm9LR1JoZEdFc0lHbHVaR1Y0TENCdmNIUnBiMjV6S1R0Y2JpQWdJQ0FnSUc5d2RHbHZibk11Y0dGMFkyaGxaQ2hwYm1SbGVDd2dkWEJrWVhSbFpFTnZiblJsYm5Rc0lHWjFibU4wYVc5dUtHVnljaWtnZTF4dUlDQWdJQ0FnSUNCcFppQW9aWEp5S1NCN1hHNGdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHOXdkR2x2Ym5NdVkyOXRjR3hsZEdVb1pYSnlLVHRjYmlBZ0lDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNBZ0lIQnliMk5sYzNOSmJtUmxlQ2dwTzF4dUlDQWdJQ0FnZlNrN1hHNGdJQ0FnZlNrN1hHNGdJSDFjYmlBZ2NISnZZMlZ6YzBsdVpHVjRLQ2s3WEc1OVhHNGlYWDA9XG5cblxuLyoqKi8gfSksXG4vKiAxMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8ndXNlIHN0cmljdCc7XG5cblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0ZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9wYXJzZVBhdGNoID0gcGFyc2VQYXRjaDtcblx0ZnVuY3Rpb24gcGFyc2VQYXRjaCh1bmlEaWZmKSB7XG5cdCAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL29wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG5cdCAgdmFyIGRpZmZzdHIgPSB1bmlEaWZmLnNwbGl0KC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS8pLFxuXHQgICAgICBkZWxpbWl0ZXJzID0gdW5pRGlmZi5tYXRjaCgvXFxyXFxufFtcXG5cXHZcXGZcXHJcXHg4NV0vZykgfHwgW10sXG5cdCAgICAgIGxpc3QgPSBbXSxcblx0ICAgICAgaSA9IDA7XG5cblx0ICBmdW5jdGlvbiBwYXJzZUluZGV4KCkge1xuXHQgICAgdmFyIGluZGV4ID0ge307XG5cdCAgICBsaXN0LnB1c2goaW5kZXgpO1xuXG5cdCAgICAvLyBQYXJzZSBkaWZmIG1ldGFkYXRhXG5cdCAgICB3aGlsZSAoaSA8IGRpZmZzdHIubGVuZ3RoKSB7XG5cdCAgICAgIHZhciBsaW5lID0gZGlmZnN0cltpXTtcblxuXHQgICAgICAvLyBGaWxlIGhlYWRlciBmb3VuZCwgZW5kIHBhcnNpbmcgZGlmZiBtZXRhZGF0YVxuXHQgICAgICBpZiAoL14oXFwtXFwtXFwtfFxcK1xcK1xcK3xAQClcXHMvLnRlc3QobGluZSkpIHtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgfVxuXG5cdCAgICAgIC8vIERpZmYgaW5kZXhcblx0ICAgICAgdmFyIGhlYWRlciA9IC9eKD86SW5kZXg6fGRpZmYoPzogLXIgXFx3KykrKVxccysoLis/KVxccyokLy5leGVjKGxpbmUpO1xuXHQgICAgICBpZiAoaGVhZGVyKSB7XG5cdCAgICAgICAgaW5kZXguaW5kZXggPSBoZWFkZXJbMV07XG5cdCAgICAgIH1cblxuXHQgICAgICBpKys7XG5cdCAgICB9XG5cblx0ICAgIC8vIFBhcnNlIGZpbGUgaGVhZGVycyBpZiB0aGV5IGFyZSBkZWZpbmVkLiBVbmlmaWVkIGRpZmYgcmVxdWlyZXMgdGhlbSwgYnV0XG5cdCAgICAvLyB0aGVyZSdzIG5vIHRlY2huaWNhbCBpc3N1ZXMgdG8gaGF2ZSBhbiBpc29sYXRlZCBodW5rIHdpdGhvdXQgZmlsZSBoZWFkZXJcblx0ICAgIHBhcnNlRmlsZUhlYWRlcihpbmRleCk7XG5cdCAgICBwYXJzZUZpbGVIZWFkZXIoaW5kZXgpO1xuXG5cdCAgICAvLyBQYXJzZSBodW5rc1xuXHQgICAgaW5kZXguaHVua3MgPSBbXTtcblxuXHQgICAgd2hpbGUgKGkgPCBkaWZmc3RyLmxlbmd0aCkge1xuXHQgICAgICB2YXIgX2xpbmUgPSBkaWZmc3RyW2ldO1xuXG5cdCAgICAgIGlmICgvXihJbmRleDp8ZGlmZnxcXC1cXC1cXC18XFwrXFwrXFwrKVxccy8udGVzdChfbGluZSkpIHtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgfSBlbHNlIGlmICgvXkBALy50ZXN0KF9saW5lKSkge1xuXHQgICAgICAgIGluZGV4Lmh1bmtzLnB1c2gocGFyc2VIdW5rKCkpO1xuXHQgICAgICB9IGVsc2UgaWYgKF9saW5lICYmIG9wdGlvbnMuc3RyaWN0KSB7XG5cdCAgICAgICAgLy8gSWdub3JlIHVuZXhwZWN0ZWQgY29udGVudCB1bmxlc3MgaW4gc3RyaWN0IG1vZGVcblx0ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbGluZSAnICsgKGkgKyAxKSArICcgJyArIEpTT04uc3RyaW5naWZ5KF9saW5lKSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgaSsrO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgLy8gUGFyc2VzIHRoZSAtLS0gYW5kICsrKyBoZWFkZXJzLCBpZiBub25lIGFyZSBmb3VuZCwgbm8gbGluZXNcblx0ICAvLyBhcmUgY29uc3VtZWQuXG5cdCAgZnVuY3Rpb24gcGFyc2VGaWxlSGVhZGVyKGluZGV4KSB7XG5cdCAgICB2YXIgaGVhZGVyUGF0dGVybiA9IC9eKC0tLXxcXCtcXCtcXCspXFxzKyhbXFxTIF0qKSg/OlxcdCguKj8pXFxzKik/JC87XG5cdCAgICB2YXIgZmlsZUhlYWRlciA9IGhlYWRlclBhdHRlcm4uZXhlYyhkaWZmc3RyW2ldKTtcblx0ICAgIGlmIChmaWxlSGVhZGVyKSB7XG5cdCAgICAgIHZhciBrZXlQcmVmaXggPSBmaWxlSGVhZGVyWzFdID09PSAnLS0tJyA/ICdvbGQnIDogJ25ldyc7XG5cdCAgICAgIHZhciBmaWxlTmFtZSA9IGZpbGVIZWFkZXJbMl0ucmVwbGFjZSgvXFxcXFxcXFwvZywgJ1xcXFwnKTtcblx0ICAgICAgaWYgKC9eXCIuKlwiJC8udGVzdChmaWxlTmFtZSkpIHtcblx0ICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cigxLCBmaWxlTmFtZS5sZW5ndGggLSAyKTtcblx0ICAgICAgfVxuXHQgICAgICBpbmRleFtrZXlQcmVmaXggKyAnRmlsZU5hbWUnXSA9IGZpbGVOYW1lO1xuXHQgICAgICBpbmRleFtrZXlQcmVmaXggKyAnSGVhZGVyJ10gPSBmaWxlSGVhZGVyWzNdO1xuXG5cdCAgICAgIGkrKztcblx0ICAgIH1cblx0ICB9XG5cblx0ICAvLyBQYXJzZXMgYSBodW5rXG5cdCAgLy8gVGhpcyBhc3N1bWVzIHRoYXQgd2UgYXJlIGF0IHRoZSBzdGFydCBvZiBhIGh1bmsuXG5cdCAgZnVuY3Rpb24gcGFyc2VIdW5rKCkge1xuXHQgICAgdmFyIGNodW5rSGVhZGVySW5kZXggPSBpLFxuXHQgICAgICAgIGNodW5rSGVhZGVyTGluZSA9IGRpZmZzdHJbaSsrXSxcblx0ICAgICAgICBjaHVua0hlYWRlciA9IGNodW5rSGVhZGVyTGluZS5zcGxpdCgvQEAgLShcXGQrKSg/OiwoXFxkKykpPyBcXCsoXFxkKykoPzosKFxcZCspKT8gQEAvKTtcblxuXHQgICAgdmFyIGh1bmsgPSB7XG5cdCAgICAgIG9sZFN0YXJ0OiArY2h1bmtIZWFkZXJbMV0sXG5cdCAgICAgIG9sZExpbmVzOiArY2h1bmtIZWFkZXJbMl0gfHwgMSxcblx0ICAgICAgbmV3U3RhcnQ6ICtjaHVua0hlYWRlclszXSxcblx0ICAgICAgbmV3TGluZXM6ICtjaHVua0hlYWRlcls0XSB8fCAxLFxuXHQgICAgICBsaW5lczogW10sXG5cdCAgICAgIGxpbmVkZWxpbWl0ZXJzOiBbXVxuXHQgICAgfTtcblxuXHQgICAgdmFyIGFkZENvdW50ID0gMCxcblx0ICAgICAgICByZW1vdmVDb3VudCA9IDA7XG5cdCAgICBmb3IgKDsgaSA8IGRpZmZzdHIubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgLy8gTGluZXMgc3RhcnRpbmcgd2l0aCAnLS0tJyBjb3VsZCBiZSBtaXN0YWtlbiBmb3IgdGhlIFwicmVtb3ZlIGxpbmVcIiBvcGVyYXRpb25cblx0ICAgICAgLy8gQnV0IHRoZXkgY291bGQgYmUgdGhlIGhlYWRlciBmb3IgdGhlIG5leHQgZmlsZS4gVGhlcmVmb3JlIHBydW5lIHN1Y2ggY2FzZXMgb3V0LlxuXHQgICAgICBpZiAoZGlmZnN0cltpXS5pbmRleE9mKCctLS0gJykgPT09IDAgJiYgaSArIDIgPCBkaWZmc3RyLmxlbmd0aCAmJiBkaWZmc3RyW2kgKyAxXS5pbmRleE9mKCcrKysgJykgPT09IDAgJiYgZGlmZnN0cltpICsgMl0uaW5kZXhPZignQEAnKSA9PT0gMCkge1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICB9XG5cdCAgICAgIHZhciBvcGVyYXRpb24gPSBkaWZmc3RyW2ldWzBdO1xuXG5cdCAgICAgIGlmIChvcGVyYXRpb24gPT09ICcrJyB8fCBvcGVyYXRpb24gPT09ICctJyB8fCBvcGVyYXRpb24gPT09ICcgJyB8fCBvcGVyYXRpb24gPT09ICdcXFxcJykge1xuXHQgICAgICAgIGh1bmsubGluZXMucHVzaChkaWZmc3RyW2ldKTtcblx0ICAgICAgICBodW5rLmxpbmVkZWxpbWl0ZXJzLnB1c2goZGVsaW1pdGVyc1tpXSB8fCAnXFxuJyk7XG5cblx0ICAgICAgICBpZiAob3BlcmF0aW9uID09PSAnKycpIHtcblx0ICAgICAgICAgIGFkZENvdW50Kys7XG5cdCAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICctJykge1xuXHQgICAgICAgICAgcmVtb3ZlQ291bnQrKztcblx0ICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG5cdCAgICAgICAgICBhZGRDb3VudCsrO1xuXHQgICAgICAgICAgcmVtb3ZlQ291bnQrKztcblx0ICAgICAgICB9XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIH1cblx0ICAgIH1cblxuXHQgICAgLy8gSGFuZGxlIHRoZSBlbXB0eSBibG9jayBjb3VudCBjYXNlXG5cdCAgICBpZiAoIWFkZENvdW50ICYmIGh1bmsubmV3TGluZXMgPT09IDEpIHtcblx0ICAgICAgaHVuay5uZXdMaW5lcyA9IDA7XG5cdCAgICB9XG5cdCAgICBpZiAoIXJlbW92ZUNvdW50ICYmIGh1bmsub2xkTGluZXMgPT09IDEpIHtcblx0ICAgICAgaHVuay5vbGRMaW5lcyA9IDA7XG5cdCAgICB9XG5cblx0ICAgIC8vIFBlcmZvcm0gb3B0aW9uYWwgc2FuaXR5IGNoZWNraW5nXG5cdCAgICBpZiAob3B0aW9ucy5zdHJpY3QpIHtcblx0ICAgICAgaWYgKGFkZENvdW50ICE9PSBodW5rLm5ld0xpbmVzKSB7XG5cdCAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBZGRlZCBsaW5lIGNvdW50IGRpZCBub3QgbWF0Y2ggZm9yIGh1bmsgYXQgbGluZSAnICsgKGNodW5rSGVhZGVySW5kZXggKyAxKSk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHJlbW92ZUNvdW50ICE9PSBodW5rLm9sZExpbmVzKSB7XG5cdCAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZW1vdmVkIGxpbmUgY291bnQgZGlkIG5vdCBtYXRjaCBmb3IgaHVuayBhdCBsaW5lICcgKyAoY2h1bmtIZWFkZXJJbmRleCArIDEpKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXG5cdCAgICByZXR1cm4gaHVuaztcblx0ICB9XG5cblx0ICB3aGlsZSAoaSA8IGRpZmZzdHIubGVuZ3RoKSB7XG5cdCAgICBwYXJzZUluZGV4KCk7XG5cdCAgfVxuXG5cdCAgcmV0dXJuIGxpc3Q7XG5cdH1cblx0Ly8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5d1lYUmphQzl3WVhKelpTNXFjeUpkTENKdVlXMWxjeUk2V3lKd1lYSnpaVkJoZEdOb0lpd2lkVzVwUkdsbVppSXNJbTl3ZEdsdmJuTWlMQ0prYVdabWMzUnlJaXdpYzNCc2FYUWlMQ0prWld4cGJXbDBaWEp6SWl3aWJXRjBZMmdpTENKc2FYTjBJaXdpYVNJc0luQmhjbk5sU1c1a1pYZ2lMQ0pwYm1SbGVDSXNJbkIxYzJnaUxDSnNaVzVuZEdnaUxDSnNhVzVsSWl3aWRHVnpkQ0lzSW1obFlXUmxjaUlzSW1WNFpXTWlMQ0p3WVhKelpVWnBiR1ZJWldGa1pYSWlMQ0pvZFc1cmN5SXNJbkJoY25ObFNIVnVheUlzSW5OMGNtbGpkQ0lzSWtWeWNtOXlJaXdpU2xOUFRpSXNJbk4wY21sdVoybG1lU0lzSW1obFlXUmxjbEJoZEhSbGNtNGlMQ0ptYVd4bFNHVmhaR1Z5SWl3aWEyVjVVSEpsWm1sNElpd2labWxzWlU1aGJXVWlMQ0p5WlhCc1lXTmxJaXdpYzNWaWMzUnlJaXdpWTJoMWJtdElaV0ZrWlhKSmJtUmxlQ0lzSW1Ob2RXNXJTR1ZoWkdWeVRHbHVaU0lzSW1Ob2RXNXJTR1ZoWkdWeUlpd2lhSFZ1YXlJc0ltOXNaRk4wWVhKMElpd2liMnhrVEdsdVpYTWlMQ0p1WlhkVGRHRnlkQ0lzSW01bGQweHBibVZ6SWl3aWJHbHVaWE1pTENKc2FXNWxaR1ZzYVcxcGRHVnljeUlzSW1Ga1pFTnZkVzUwSWl3aWNtVnRiM1psUTI5MWJuUWlMQ0pwYm1SbGVFOW1JaXdpYjNCbGNtRjBhVzl1SWwwc0ltMWhjSEJwYm1keklqb2lPenM3WjBOQlFXZENRU3hWTEVkQlFVRkJMRlU3UVVGQlZDeFRRVUZUUVN4VlFVRlVMRU5CUVc5Q1F5eFBRVUZ3UWl4RlFVRXlRenRCUVVGQkxITkVRVUZrUXl4UFFVRmpMSFZGUVVGS0xFVkJRVWs3TzBGQlEyaEVMRTFCUVVsRExGVkJRVlZHTEZGQlFWRkhMRXRCUVZJc1EwRkJZeXh4UWtGQlpDeERRVUZrTzBGQlFVRXNUVUZEU1VNc1lVRkJZVW9zVVVGQlVVc3NTMEZCVWl4RFFVRmpMSE5DUVVGa0xFdEJRWGxETEVWQlJERkVPMEZCUVVFc1RVRkZTVU1zVDBGQlR5eEZRVVpZTzBGQlFVRXNUVUZIU1VNc1NVRkJTU3hEUVVoU096dEJRVXRCTEZkQlFWTkRMRlZCUVZRc1IwRkJjMEk3UVVGRGNFSXNVVUZCU1VNc1VVRkJVU3hGUVVGYU8wRkJRMEZJTEZOQlFVdEpMRWxCUVV3c1EwRkJWVVFzUzBGQlZqczdRVUZGUVR0QlFVTkJMRmRCUVU5R0xFbEJRVWxNTEZGQlFWRlRMRTFCUVc1Q0xFVkJRVEpDTzBGQlEzcENMRlZCUVVsRExFOUJRVTlXTEZGQlFWRkxMRU5CUVZJc1EwRkJXRHM3UVVGRlFUdEJRVU5CTEZWQlFVa3NkMEpCUVhkQ1RTeEpRVUY0UWl4RFFVRTJRa1FzU1VGQk4wSXNRMEZCU2l4RlFVRjNRenRCUVVOMFF6dEJRVU5FT3p0QlFVVkVPMEZCUTBFc1ZVRkJTVVVzVTBGQlZTd3dRMEZCUkN4RFFVRTJRME1zU1VGQk4wTXNRMEZCYTBSSUxFbEJRV3hFTEVOQlFXSTdRVUZEUVN4VlFVRkpSU3hOUVVGS0xFVkJRVms3UVVGRFZrd3NZMEZCVFVFc1MwRkJUaXhIUVVGalN5eFBRVUZQTEVOQlFWQXNRMEZCWkR0QlFVTkVPenRCUVVWRVVEdEJRVU5FT3p0QlFVVkVPMEZCUTBFN1FVRkRRVk1zYjBKQlFXZENVQ3hMUVVGb1FqdEJRVU5CVHl4dlFrRkJaMEpRTEV0QlFXaENPenRCUVVWQk8wRkJRMEZCTEZWQlFVMVJMRXRCUVU0c1IwRkJZeXhGUVVGa096dEJRVVZCTEZkQlFVOVdMRWxCUVVsTUxGRkJRVkZUTEUxQlFXNUNMRVZCUVRKQ08wRkJRM3BDTEZWQlFVbERMRkZCUVU5V0xGRkJRVkZMTEVOQlFWSXNRMEZCV0RzN1FVRkZRU3hWUVVGSkxHbERRVUZwUTAwc1NVRkJha01zUTBGQmMwTkVMRXRCUVhSRExFTkJRVW9zUlVGQmFVUTdRVUZETDBNN1FVRkRSQ3hQUVVaRUxFMUJSVThzU1VGQlNTeE5RVUZOUXl4SlFVRk9MRU5CUVZkRUxFdEJRVmdzUTBGQlNpeEZRVUZ6UWp0QlFVTXpRa2dzWTBGQlRWRXNTMEZCVGl4RFFVRlpVQ3hKUVVGYUxFTkJRV2xDVVN4WFFVRnFRanRCUVVORUxFOUJSazBzVFVGRlFTeEpRVUZKVGl4VFFVRlJXQ3hSUVVGUmEwSXNUVUZCY0VJc1JVRkJORUk3UVVGRGFrTTdRVUZEUVN4alFVRk5MRWxCUVVsRExFdEJRVW9zUTBGQlZTeHRRa0ZCYlVKaUxFbEJRVWtzUTBGQmRrSXNTVUZCTkVJc1IwRkJOVUlzUjBGQmEwTmpMRXRCUVV0RExGTkJRVXdzUTBGQlpWWXNTMEZCWml4RFFVRTFReXhEUVVGT08wRkJRMFFzVDBGSVRTeE5RVWRCTzBGQlEweE1PMEZCUTBRN1FVRkRSanRCUVVOR096dEJRVVZFTzBGQlEwRTdRVUZEUVN4WFFVRlRVeXhsUVVGVUxFTkJRWGxDVUN4TFFVRjZRaXhGUVVGblF6dEJRVU01UWl4UlFVRk5ZeXhuUWtGQlowSXNNRU5CUVhSQ08wRkJRMEVzVVVGQlRVTXNZVUZCWVVRc1kwRkJZMUlzU1VGQlpDeERRVUZ0UW1Jc1VVRkJVVXNzUTBGQlVpeERRVUZ1UWl4RFFVRnVRanRCUVVOQkxGRkJRVWxwUWl4VlFVRktMRVZCUVdkQ08wRkJRMlFzVlVGQlNVTXNXVUZCV1VRc1YwRkJWeXhEUVVGWUxFMUJRV3RDTEV0QlFXeENMRWRCUVRCQ0xFdEJRVEZDTEVkQlFXdERMRXRCUVd4RU8wRkJRMEVzVlVGQlNVVXNWMEZCVjBZc1YwRkJWeXhEUVVGWUxFVkJRV05ITEU5QlFXUXNRMEZCYzBJc1QwRkJkRUlzUlVGQkswSXNTVUZCTDBJc1EwRkJaanRCUVVOQkxGVkJRVWtzVTBGQlUyUXNTVUZCVkN4RFFVRmpZU3hSUVVGa0xFTkJRVW9zUlVGQk5rSTdRVUZETTBKQkxHMUNRVUZYUVN4VFFVRlRSU3hOUVVGVUxFTkJRV2RDTEVOQlFXaENMRVZCUVcxQ1JpeFRRVUZUWml4TlFVRlVMRWRCUVd0Q0xFTkJRWEpETEVOQlFWZzdRVUZEUkR0QlFVTkVSaXhaUVVGTlowSXNXVUZCV1N4VlFVRnNRaXhKUVVGblEwTXNVVUZCYUVNN1FVRkRRV3BDTEZsQlFVMW5RaXhaUVVGWkxGRkJRV3hDTEVsQlFUaENSQ3hYUVVGWExFTkJRVmdzUTBGQk9VSTdPMEZCUlVGcVFqdEJRVU5FTzBGQlEwWTdPMEZCUlVRN1FVRkRRVHRCUVVOQkxGZEJRVk5YTEZOQlFWUXNSMEZCY1VJN1FVRkRia0lzVVVGQlNWY3NiVUpCUVcxQ2RFSXNRMEZCZGtJN1FVRkJRU3hSUVVOSmRVSXNhMEpCUVd0Q05VSXNVVUZCVVVzc1IwRkJVaXhEUVVSMFFqdEJRVUZCTEZGQlJVbDNRaXhqUVVGalJDeG5Ra0ZCWjBJelFpeExRVUZvUWl4RFFVRnpRaXcwUTBGQmRFSXNRMEZHYkVJN08wRkJTVUVzVVVGQlNUWkNMRTlCUVU4N1FVRkRWRU1zWjBKQlFWVXNRMEZCUTBZc1dVRkJXU3hEUVVGYUxFTkJSRVk3UVVGRlZFY3NaMEpCUVZVc1EwRkJRMGdzV1VGQldTeERRVUZhTEVOQlFVUXNTVUZCYlVJc1EwRkdjRUk3UVVGSFZFa3NaMEpCUVZVc1EwRkJRMG9zV1VGQldTeERRVUZhTEVOQlNFWTdRVUZKVkVzc1owSkJRVlVzUTBGQlEwd3NXVUZCV1N4RFFVRmFMRU5CUVVRc1NVRkJiVUlzUTBGS2NFSTdRVUZMVkUwc1lVRkJUeXhGUVV4Rk8wRkJUVlJETEhOQ1FVRm5RanRCUVU1UUxFdEJRVmc3TzBGQlUwRXNVVUZCU1VNc1YwRkJWeXhEUVVGbU8wRkJRVUVzVVVGRFNVTXNZMEZCWXl4RFFVUnNRanRCUVVWQkxGZEJRVTlxUXl4SlFVRkpUQ3hSUVVGUlV5eE5RVUZ1UWl4RlFVRXlRa29zUjBGQk0wSXNSVUZCWjBNN1FVRkRPVUk3UVVGRFFUdEJRVU5CTEZWQlFVbE1MRkZCUVZGTExFTkJRVklzUlVGQlYydERMRTlCUVZnc1EwRkJiVUlzVFVGQmJrSXNUVUZCSzBJc1EwRkJMMElzU1VGRFRXeERMRWxCUVVrc1EwRkJTaXhIUVVGUlRDeFJRVUZSVXl4TlFVUjBRaXhKUVVWTFZDeFJRVUZSU3l4SlFVRkpMRU5CUVZvc1JVRkJaV3RETEU5QlFXWXNRMEZCZFVJc1RVRkJka0lzVFVGQmJVTXNRMEZHZUVNc1NVRkhTM1pETEZGQlFWRkxMRWxCUVVrc1EwRkJXaXhGUVVGbGEwTXNUMEZCWml4RFFVRjFRaXhKUVVGMlFpeE5RVUZwUXl4RFFVZ3hReXhGUVVjMlF6dEJRVU42UXp0QlFVTklPMEZCUTBRc1ZVRkJTVU1zV1VGQldYaERMRkZCUVZGTExFTkJRVklzUlVGQlZ5eERRVUZZTEVOQlFXaENPenRCUVVWQkxGVkJRVWx0UXl4alFVRmpMRWRCUVdRc1NVRkJjVUpCTEdOQlFXTXNSMEZCYmtNc1NVRkJNRU5CTEdOQlFXTXNSMEZCZUVRc1NVRkJLMFJCTEdOQlFXTXNTVUZCYWtZc1JVRkJkVVk3UVVGRGNrWldMR0ZCUVV0TExFdEJRVXdzUTBGQlZ6TkNMRWxCUVZnc1EwRkJaMEpTTEZGQlFWRkxMRU5CUVZJc1EwRkJhRUk3UVVGRFFYbENMR0ZCUVV0TkxHTkJRVXdzUTBGQmIwSTFRaXhKUVVGd1FpeERRVUY1UWs0c1YwRkJWMGNzUTBGQldDeExRVUZwUWl4SlFVRXhRenM3UVVGRlFTeFpRVUZKYlVNc1kwRkJZeXhIUVVGc1FpeEZRVUYxUWp0QlFVTnlRa2c3UVVGRFJDeFRRVVpFTEUxQlJVOHNTVUZCU1Vjc1kwRkJZeXhIUVVGc1FpeEZRVUYxUWp0QlFVTTFRa1k3UVVGRFJDeFRRVVpOTEUxQlJVRXNTVUZCU1VVc1kwRkJZeXhIUVVGc1FpeEZRVUYxUWp0QlFVTTFRa2c3UVVGRFFVTTdRVUZEUkR0QlFVTkdMRTlCV2tRc1RVRlpUenRCUVVOTU8wRkJRMFE3UVVGRFJqczdRVUZGUkR0QlFVTkJMRkZCUVVrc1EwRkJRMFFzVVVGQlJDeEpRVUZoVUN4TFFVRkxTU3hSUVVGTUxFdEJRV3RDTEVOQlFXNURMRVZCUVhORE8wRkJRM0JEU2l4WFFVRkxTU3hSUVVGTUxFZEJRV2RDTEVOQlFXaENPMEZCUTBRN1FVRkRSQ3hSUVVGSkxFTkJRVU5KTEZkQlFVUXNTVUZCWjBKU0xFdEJRVXRGTEZGQlFVd3NTMEZCYTBJc1EwRkJkRU1zUlVGQmVVTTdRVUZEZGtOR0xGZEJRVXRGTEZGQlFVd3NSMEZCWjBJc1EwRkJhRUk3UVVGRFJEczdRVUZGUkR0QlFVTkJMRkZCUVVscVF5eFJRVUZSYTBJc1RVRkJXaXhGUVVGdlFqdEJRVU5zUWl4VlFVRkpiMElzWVVGQllWQXNTMEZCUzBrc1VVRkJkRUlzUlVGQlowTTdRVUZET1VJc1kwRkJUU3hKUVVGSmFFSXNTMEZCU2l4RFFVRlZMSE5FUVVGelJGTXNiVUpCUVcxQ0xFTkJRWHBGTEVOQlFWWXNRMEZCVGp0QlFVTkVPMEZCUTBRc1ZVRkJTVmNzWjBKQlFXZENVaXhMUVVGTFJTeFJRVUY2UWl4RlFVRnRRenRCUVVOcVF5eGpRVUZOTEVsQlFVbGtMRXRCUVVvc1EwRkJWU3gzUkVGQmQwUlRMRzFDUVVGdFFpeERRVUV6UlN4RFFVRldMRU5CUVU0N1FVRkRSRHRCUVVOR096dEJRVVZFTEZkQlFVOUhMRWxCUVZBN1FVRkRSRHM3UVVGRlJDeFRRVUZQZWtJc1NVRkJTVXdzVVVGQlVWTXNUVUZCYmtJc1JVRkJNa0k3UVVGRGVrSklPMEZCUTBRN08wRkJSVVFzVTBGQlQwWXNTVUZCVUR0QlFVTkVJaXdpWm1sc1pTSTZJbkJoY25ObExtcHpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpWlhod2IzSjBJR1oxYm1OMGFXOXVJSEJoY25ObFVHRjBZMmdvZFc1cFJHbG1aaXdnYjNCMGFXOXVjeUE5SUh0OUtTQjdYRzRnSUd4bGRDQmthV1ptYzNSeUlEMGdkVzVwUkdsbVppNXpjR3hwZENndlhGeHlYRnh1ZkZ0Y1hHNWNYSFpjWEdaY1hISmNYSGc0TlYwdktTeGNiaUFnSUNBZ0lHUmxiR2x0YVhSbGNuTWdQU0IxYm1sRWFXWm1MbTFoZEdOb0tDOWNYSEpjWEc1OFcxeGNibHhjZGx4Y1pseGNjbHhjZURnMVhTOW5LU0I4ZkNCYlhTeGNiaUFnSUNBZ0lHeHBjM1FnUFNCYlhTeGNiaUFnSUNBZ0lHa2dQU0F3TzF4dVhHNGdJR1oxYm1OMGFXOXVJSEJoY25ObFNXNWtaWGdvS1NCN1hHNGdJQ0FnYkdWMElHbHVaR1Y0SUQwZ2UzMDdYRzRnSUNBZ2JHbHpkQzV3ZFhOb0tHbHVaR1Y0S1R0Y2JseHVJQ0FnSUM4dklGQmhjbk5sSUdScFptWWdiV1YwWVdSaGRHRmNiaUFnSUNCM2FHbHNaU0FvYVNBOElHUnBabVp6ZEhJdWJHVnVaM1JvS1NCN1hHNGdJQ0FnSUNCc1pYUWdiR2x1WlNBOUlHUnBabVp6ZEhKYmFWMDdYRzVjYmlBZ0lDQWdJQzh2SUVacGJHVWdhR1ZoWkdWeUlHWnZkVzVrTENCbGJtUWdjR0Z5YzJsdVp5QmthV1ptSUcxbGRHRmtZWFJoWEc0Z0lDQWdJQ0JwWmlBb0wxNG9YRnd0WEZ3dFhGd3RmRnhjSzF4Y0sxeGNLM3hBUUNsY1hITXZMblJsYzNRb2JHbHVaU2twSUh0Y2JpQWdJQ0FnSUNBZ1luSmxZV3M3WEc0Z0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUM4dklFUnBabVlnYVc1a1pYaGNiaUFnSUNBZ0lHeGxkQ0JvWldGa1pYSWdQU0FvTDE0b1B6cEpibVJsZURwOFpHbG1aaWcvT2lBdGNpQmNYSGNyS1NzcFhGeHpLeWd1S3o4cFhGeHpLaVF2S1M1bGVHVmpLR3hwYm1VcE8xeHVJQ0FnSUNBZ2FXWWdLR2hsWVdSbGNpa2dlMXh1SUNBZ0lDQWdJQ0JwYm1SbGVDNXBibVJsZUNBOUlHaGxZV1JsY2xzeFhUdGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdhU3NyTzF4dUlDQWdJSDFjYmx4dUlDQWdJQzh2SUZCaGNuTmxJR1pwYkdVZ2FHVmhaR1Z5Y3lCcFppQjBhR1Y1SUdGeVpTQmtaV1pwYm1Wa0xpQlZibWxtYVdWa0lHUnBabVlnY21WeGRXbHlaWE1nZEdobGJTd2dZblYwWEc0Z0lDQWdMeThnZEdobGNtVW5jeUJ1YnlCMFpXTm9ibWxqWVd3Z2FYTnpkV1Z6SUhSdklHaGhkbVVnWVc0Z2FYTnZiR0YwWldRZ2FIVnVheUIzYVhSb2IzVjBJR1pwYkdVZ2FHVmhaR1Z5WEc0Z0lDQWdjR0Z5YzJWR2FXeGxTR1ZoWkdWeUtHbHVaR1Y0S1R0Y2JpQWdJQ0J3WVhKelpVWnBiR1ZJWldGa1pYSW9hVzVrWlhncE8xeHVYRzRnSUNBZ0x5OGdVR0Z5YzJVZ2FIVnVhM05jYmlBZ0lDQnBibVJsZUM1b2RXNXJjeUE5SUZ0ZE8xeHVYRzRnSUNBZ2QyaHBiR1VnS0drZ1BDQmthV1ptYzNSeUxteGxibWQwYUNrZ2UxeHVJQ0FnSUNBZ2JHVjBJR3hwYm1VZ1BTQmthV1ptYzNSeVcybGRPMXh1WEc0Z0lDQWdJQ0JwWmlBb0wxNG9TVzVrWlhnNmZHUnBabVo4WEZ3dFhGd3RYRnd0ZkZ4Y0sxeGNLMXhjS3lsY1hITXZMblJsYzNRb2JHbHVaU2twSUh0Y2JpQWdJQ0FnSUNBZ1luSmxZV3M3WEc0Z0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0M5ZVFFQXZMblJsYzNRb2JHbHVaU2twSUh0Y2JpQWdJQ0FnSUNBZ2FXNWtaWGd1YUhWdWEzTXVjSFZ6YUNod1lYSnpaVWgxYm1zb0tTazdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLR3hwYm1VZ0ppWWdiM0IwYVc5dWN5NXpkSEpwWTNRcElIdGNiaUFnSUNBZ0lDQWdMeThnU1dkdWIzSmxJSFZ1Wlhod1pXTjBaV1FnWTI5dWRHVnVkQ0IxYm14bGMzTWdhVzRnYzNSeWFXTjBJRzF2WkdWY2JpQWdJQ0FnSUNBZ2RHaHliM2NnYm1WM0lFVnljbTl5S0NkVmJtdHViM2R1SUd4cGJtVWdKeUFySUNocElDc2dNU2tnS3lBbklDY2dLeUJLVTA5T0xuTjBjbWx1WjJsbWVTaHNhVzVsS1NrN1hHNGdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNCcEt5czdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdMeThnVUdGeWMyVnpJSFJvWlNBdExTMGdZVzVrSUNzckt5Qm9aV0ZrWlhKekxDQnBaaUJ1YjI1bElHRnlaU0JtYjNWdVpDd2dibThnYkdsdVpYTmNiaUFnTHk4Z1lYSmxJR052Ym5OMWJXVmtMbHh1SUNCbWRXNWpkR2x2YmlCd1lYSnpaVVpwYkdWSVpXRmtaWElvYVc1a1pYZ3BJSHRjYmlBZ0lDQmpiMjV6ZENCb1pXRmtaWEpRWVhSMFpYSnVJRDBnTDE0b0xTMHRmRnhjSzF4Y0sxeGNLeWxjWEhNcktGdGNYRk1nWFNvcEtEODZYRngwS0M0cVB5bGNYSE1xS1Q4a0x6dGNiaUFnSUNCamIyNXpkQ0JtYVd4bFNHVmhaR1Z5SUQwZ2FHVmhaR1Z5VUdGMGRHVnliaTVsZUdWaktHUnBabVp6ZEhKYmFWMHBPMXh1SUNBZ0lHbG1JQ2htYVd4bFNHVmhaR1Z5S1NCN1hHNGdJQ0FnSUNCc1pYUWdhMlY1VUhKbFptbDRJRDBnWm1sc1pVaGxZV1JsY2xzeFhTQTlQVDBnSnkwdExTY2dQeUFuYjJ4a0p5QTZJQ2R1Wlhjbk8xeHVJQ0FnSUNBZ2JHVjBJR1pwYkdWT1lXMWxJRDBnWm1sc1pVaGxZV1JsY2xzeVhTNXlaWEJzWVdObEtDOWNYRnhjWEZ4Y1hDOW5MQ0FuWEZ4Y1hDY3BPMXh1SUNBZ0lDQWdhV1lnS0M5ZVhDSXVLbHdpSkM4dWRHVnpkQ2htYVd4bFRtRnRaU2twSUh0Y2JpQWdJQ0FnSUNBZ1ptbHNaVTVoYldVZ1BTQm1hV3hsVG1GdFpTNXpkV0p6ZEhJb01Td2dabWxzWlU1aGJXVXViR1Z1WjNSb0lDMGdNaWs3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0JwYm1SbGVGdHJaWGxRY21WbWFYZ2dLeUFuUm1sc1pVNWhiV1VuWFNBOUlHWnBiR1ZPWVcxbE8xeHVJQ0FnSUNBZ2FXNWtaWGhiYTJWNVVISmxabWw0SUNzZ0owaGxZV1JsY2lkZElEMGdabWxzWlVobFlXUmxjbHN6WFR0Y2JseHVJQ0FnSUNBZ2FTc3JPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJQzh2SUZCaGNuTmxjeUJoSUdoMWJtdGNiaUFnTHk4Z1ZHaHBjeUJoYzNOMWJXVnpJSFJvWVhRZ2QyVWdZWEpsSUdGMElIUm9aU0J6ZEdGeWRDQnZaaUJoSUdoMWJtc3VYRzRnSUdaMWJtTjBhVzl1SUhCaGNuTmxTSFZ1YXlncElIdGNiaUFnSUNCc1pYUWdZMmgxYm10SVpXRmtaWEpKYm1SbGVDQTlJR2tzWEc0Z0lDQWdJQ0FnSUdOb2RXNXJTR1ZoWkdWeVRHbHVaU0E5SUdScFptWnpkSEpiYVNzclhTeGNiaUFnSUNBZ0lDQWdZMmgxYm10SVpXRmtaWElnUFNCamFIVnVhMGhsWVdSbGNreHBibVV1YzNCc2FYUW9MMEJBSUMwb1hGeGtLeWtvUHpvc0tGeGNaQ3NwS1Q4Z1hGd3JLRnhjWkNzcEtEODZMQ2hjWEdRcktTay9JRUJBTHlrN1hHNWNiaUFnSUNCc1pYUWdhSFZ1YXlBOUlIdGNiaUFnSUNBZ0lHOXNaRk4wWVhKME9pQXJZMmgxYm10SVpXRmtaWEpiTVYwc1hHNGdJQ0FnSUNCdmJHUk1hVzVsY3pvZ0syTm9kVzVyU0dWaFpHVnlXekpkSUh4OElERXNYRzRnSUNBZ0lDQnVaWGRUZEdGeWREb2dLMk5vZFc1clNHVmhaR1Z5V3pOZExGeHVJQ0FnSUNBZ2JtVjNUR2x1WlhNNklDdGphSFZ1YTBobFlXUmxjbHMwWFNCOGZDQXhMRnh1SUNBZ0lDQWdiR2x1WlhNNklGdGRMRnh1SUNBZ0lDQWdiR2x1WldSbGJHbHRhWFJsY25NNklGdGRYRzRnSUNBZ2ZUdGNibHh1SUNBZ0lHeGxkQ0JoWkdSRGIzVnVkQ0E5SURBc1hHNGdJQ0FnSUNBZ0lISmxiVzkyWlVOdmRXNTBJRDBnTUR0Y2JpQWdJQ0JtYjNJZ0tEc2dhU0E4SUdScFptWnpkSEl1YkdWdVozUm9PeUJwS3lzcElIdGNiaUFnSUNBZ0lDOHZJRXhwYm1WeklITjBZWEowYVc1bklIZHBkR2dnSnkwdExTY2dZMjkxYkdRZ1ltVWdiV2x6ZEdGclpXNGdabTl5SUhSb1pTQmNJbkpsYlc5MlpTQnNhVzVsWENJZ2IzQmxjbUYwYVc5dVhHNGdJQ0FnSUNBdkx5QkNkWFFnZEdobGVTQmpiM1ZzWkNCaVpTQjBhR1VnYUdWaFpHVnlJR1p2Y2lCMGFHVWdibVY0ZENCbWFXeGxMaUJVYUdWeVpXWnZjbVVnY0hKMWJtVWdjM1ZqYUNCallYTmxjeUJ2ZFhRdVhHNGdJQ0FnSUNCcFppQW9aR2xtWm5OMGNsdHBYUzVwYm1SbGVFOW1LQ2N0TFMwZ0p5a2dQVDA5SURCY2JpQWdJQ0FnSUNBZ0lDQWdJQ1ltSUNocElDc2dNaUE4SUdScFptWnpkSEl1YkdWdVozUm9LVnh1SUNBZ0lDQWdJQ0FnSUNBZ0ppWWdaR2xtWm5OMGNsdHBJQ3NnTVYwdWFXNWtaWGhQWmlnbkt5c3JJQ2NwSUQwOVBTQXdYRzRnSUNBZ0lDQWdJQ0FnSUNBbUppQmthV1ptYzNSeVcya2dLeUF5WFM1cGJtUmxlRTltS0NkQVFDY3BJRDA5UFNBd0tTQjdYRzRnSUNBZ0lDQWdJQ0FnWW5KbFlXczdYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQnNaWFFnYjNCbGNtRjBhVzl1SUQwZ1pHbG1abk4wY2x0cFhWc3dYVHRjYmx4dUlDQWdJQ0FnYVdZZ0tHOXdaWEpoZEdsdmJpQTlQVDBnSnlzbklIeDhJRzl3WlhKaGRHbHZiaUE5UFQwZ0p5MG5JSHg4SUc5d1pYSmhkR2x2YmlBOVBUMGdKeUFuSUh4OElHOXdaWEpoZEdsdmJpQTlQVDBnSjF4Y1hGd25LU0I3WEc0Z0lDQWdJQ0FnSUdoMWJtc3ViR2x1WlhNdWNIVnphQ2hrYVdabWMzUnlXMmxkS1R0Y2JpQWdJQ0FnSUNBZ2FIVnVheTVzYVc1bFpHVnNhVzFwZEdWeWN5NXdkWE5vS0dSbGJHbHRhWFJsY25OYmFWMGdmSHdnSjF4Y2JpY3BPMXh1WEc0Z0lDQWdJQ0FnSUdsbUlDaHZjR1Z5WVhScGIyNGdQVDA5SUNjckp5a2dlMXh1SUNBZ0lDQWdJQ0FnSUdGa1pFTnZkVzUwS3lzN1hHNGdJQ0FnSUNBZ0lIMGdaV3h6WlNCcFppQW9iM0JsY21GMGFXOXVJRDA5UFNBbkxTY3BJSHRjYmlBZ0lDQWdJQ0FnSUNCeVpXMXZkbVZEYjNWdWRDc3JPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0c5d1pYSmhkR2x2YmlBOVBUMGdKeUFuS1NCN1hHNGdJQ0FnSUNBZ0lDQWdZV1JrUTI5MWJuUXJLenRjYmlBZ0lDQWdJQ0FnSUNCeVpXMXZkbVZEYjNWdWRDc3JPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0JpY21WaGF6dGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNWNiaUFnSUNBdkx5QklZVzVrYkdVZ2RHaGxJR1Z0Y0hSNUlHSnNiMk5ySUdOdmRXNTBJR05oYzJWY2JpQWdJQ0JwWmlBb0lXRmtaRU52ZFc1MElDWW1JR2gxYm1zdWJtVjNUR2x1WlhNZ1BUMDlJREVwSUh0Y2JpQWdJQ0FnSUdoMWJtc3VibVYzVEdsdVpYTWdQU0F3TzF4dUlDQWdJSDFjYmlBZ0lDQnBaaUFvSVhKbGJXOTJaVU52ZFc1MElDWW1JR2gxYm1zdWIyeGtUR2x1WlhNZ1BUMDlJREVwSUh0Y2JpQWdJQ0FnSUdoMWJtc3ViMnhrVEdsdVpYTWdQU0F3TzF4dUlDQWdJSDFjYmx4dUlDQWdJQzh2SUZCbGNtWnZjbTBnYjNCMGFXOXVZV3dnYzJGdWFYUjVJR05vWldOcmFXNW5YRzRnSUNBZ2FXWWdLRzl3ZEdsdmJuTXVjM1J5YVdOMEtTQjdYRzRnSUNBZ0lDQnBaaUFvWVdSa1EyOTFiblFnSVQwOUlHaDFibXN1Ym1WM1RHbHVaWE1wSUh0Y2JpQWdJQ0FnSUNBZ2RHaHliM2NnYm1WM0lFVnljbTl5S0NkQlpHUmxaQ0JzYVc1bElHTnZkVzUwSUdScFpDQnViM1FnYldGMFkyZ2dabTl5SUdoMWJtc2dZWFFnYkdsdVpTQW5JQ3NnS0dOb2RXNXJTR1ZoWkdWeVNXNWtaWGdnS3lBeEtTazdYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQnBaaUFvY21WdGIzWmxRMjkxYm5RZ0lUMDlJR2gxYm1zdWIyeGtUR2x1WlhNcElIdGNiaUFnSUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtDZFNaVzF2ZG1Wa0lHeHBibVVnWTI5MWJuUWdaR2xrSUc1dmRDQnRZWFJqYUNCbWIzSWdhSFZ1YXlCaGRDQnNhVzVsSUNjZ0t5QW9ZMmgxYm10SVpXRmtaWEpKYm1SbGVDQXJJREVwS1R0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0J5WlhSMWNtNGdhSFZ1YXp0Y2JpQWdmVnh1WEc0Z0lIZG9hV3hsSUNocElEd2daR2xtWm5OMGNpNXNaVzVuZEdncElIdGNiaUFnSUNCd1lYSnpaVWx1WkdWNEtDazdYRzRnSUgxY2JseHVJQ0J5WlhSMWNtNGdiR2x6ZER0Y2JuMWNiaUpkZlE9PVxuXG5cbi8qKiovIH0pLFxuLyogMTIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXCJ1c2Ugc3RyaWN0XCI7XG5cblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxuXHRleHBvcnRzW1wiZGVmYXVsdFwiXSA9IC8qaXN0YW5idWwgaWdub3JlIGVuZCovZnVuY3Rpb24gKHN0YXJ0LCBtaW5MaW5lLCBtYXhMaW5lKSB7XG5cdCAgdmFyIHdhbnRGb3J3YXJkID0gdHJ1ZSxcblx0ICAgICAgYmFja3dhcmRFeGhhdXN0ZWQgPSBmYWxzZSxcblx0ICAgICAgZm9yd2FyZEV4aGF1c3RlZCA9IGZhbHNlLFxuXHQgICAgICBsb2NhbE9mZnNldCA9IDE7XG5cblx0ICByZXR1cm4gZnVuY3Rpb24gaXRlcmF0b3IoKSB7XG5cdCAgICBpZiAod2FudEZvcndhcmQgJiYgIWZvcndhcmRFeGhhdXN0ZWQpIHtcblx0ICAgICAgaWYgKGJhY2t3YXJkRXhoYXVzdGVkKSB7XG5cdCAgICAgICAgbG9jYWxPZmZzZXQrKztcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB3YW50Rm9yd2FyZCA9IGZhbHNlO1xuXHQgICAgICB9XG5cblx0ICAgICAgLy8gQ2hlY2sgaWYgdHJ5aW5nIHRvIGZpdCBiZXlvbmQgdGV4dCBsZW5ndGgsIGFuZCBpZiBub3QsIGNoZWNrIGl0IGZpdHNcblx0ICAgICAgLy8gYWZ0ZXIgb2Zmc2V0IGxvY2F0aW9uIChvciBkZXNpcmVkIGxvY2F0aW9uIG9uIGZpcnN0IGl0ZXJhdGlvbilcblx0ICAgICAgaWYgKHN0YXJ0ICsgbG9jYWxPZmZzZXQgPD0gbWF4TGluZSkge1xuXHQgICAgICAgIHJldHVybiBsb2NhbE9mZnNldDtcblx0ICAgICAgfVxuXG5cdCAgICAgIGZvcndhcmRFeGhhdXN0ZWQgPSB0cnVlO1xuXHQgICAgfVxuXG5cdCAgICBpZiAoIWJhY2t3YXJkRXhoYXVzdGVkKSB7XG5cdCAgICAgIGlmICghZm9yd2FyZEV4aGF1c3RlZCkge1xuXHQgICAgICAgIHdhbnRGb3J3YXJkID0gdHJ1ZTtcblx0ICAgICAgfVxuXG5cdCAgICAgIC8vIENoZWNrIGlmIHRyeWluZyB0byBmaXQgYmVmb3JlIHRleHQgYmVnaW5uaW5nLCBhbmQgaWYgbm90LCBjaGVjayBpdCBmaXRzXG5cdCAgICAgIC8vIGJlZm9yZSBvZmZzZXQgbG9jYXRpb25cblx0ICAgICAgaWYgKG1pbkxpbmUgPD0gc3RhcnQgLSBsb2NhbE9mZnNldCkge1xuXHQgICAgICAgIHJldHVybiAtbG9jYWxPZmZzZXQrKztcblx0ICAgICAgfVxuXG5cdCAgICAgIGJhY2t3YXJkRXhoYXVzdGVkID0gdHJ1ZTtcblx0ICAgICAgcmV0dXJuIGl0ZXJhdG9yKCk7XG5cdCAgICB9XG5cblx0ICAgIC8vIFdlIHRyaWVkIHRvIGZpdCBodW5rIGJlZm9yZSB0ZXh0IGJlZ2lubmluZyBhbmQgYmV5b25kIHRleHQgbGVuZ3RoLCB0aGVuXG5cdCAgICAvLyBodW5rIGNhbid0IGZpdCBvbiB0aGUgdGV4dC4gUmV0dXJuIHVuZGVmaW5lZFxuXHQgIH07XG5cdH07XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OTFkR2xzTDJScGMzUmhibU5sTFdsMFpYSmhkRzl5TG1weklsMHNJbTVoYldWeklqcGJJbk4wWVhKMElpd2liV2x1VEdsdVpTSXNJbTFoZUV4cGJtVWlMQ0ozWVc1MFJtOXlkMkZ5WkNJc0ltSmhZMnQzWVhKa1JYaG9ZWFZ6ZEdWa0lpd2labTl5ZDJGeVpFVjRhR0YxYzNSbFpDSXNJbXh2WTJGc1QyWm1jMlYwSWl3aWFYUmxjbUYwYjNJaVhTd2liV0Z3Y0dsdVozTWlPaUk3T3pzN05FTkJSMlVzVlVGQlUwRXNTMEZCVkN4RlFVRm5Ra01zVDBGQmFFSXNSVUZCZVVKRExFOUJRWHBDTEVWQlFXdERPMEZCUXk5RExFMUJRVWxETEdOQlFXTXNTVUZCYkVJN1FVRkJRU3hOUVVOSlF5eHZRa0ZCYjBJc1MwRkVlRUk3UVVGQlFTeE5RVVZKUXl4dFFrRkJiVUlzUzBGR2RrSTdRVUZCUVN4TlFVZEpReXhqUVVGakxFTkJTR3hDT3p0QlFVdEJMRk5CUVU4c1UwRkJVME1zVVVGQlZDeEhRVUZ2UWp0QlFVTjZRaXhSUVVGSlNpeGxRVUZsTEVOQlFVTkZMR2RDUVVGd1FpeEZRVUZ6UXp0QlFVTndReXhWUVVGSlJDeHBRa0ZCU2l4RlFVRjFRanRCUVVOeVFrVTdRVUZEUkN4UFFVWkVMRTFCUlU4N1FVRkRURWdzYzBKQlFXTXNTMEZCWkR0QlFVTkVPenRCUVVWRU8wRkJRMEU3UVVGRFFTeFZRVUZKU0N4UlFVRlJUU3hYUVVGU0xFbEJRWFZDU2l4UFFVRXpRaXhGUVVGdlF6dEJRVU5zUXl4bFFVRlBTU3hYUVVGUU8wRkJRMFE3TzBGQlJVUkVMSGxDUVVGdFFpeEpRVUZ1UWp0QlFVTkVPenRCUVVWRUxGRkJRVWtzUTBGQlEwUXNhVUpCUVV3c1JVRkJkMEk3UVVGRGRFSXNWVUZCU1N4RFFVRkRReXhuUWtGQlRDeEZRVUYxUWp0QlFVTnlRa1lzYzBKQlFXTXNTVUZCWkR0QlFVTkVPenRCUVVWRU8wRkJRMEU3UVVGRFFTeFZRVUZKUml4WFFVRlhSQ3hSUVVGUlRTeFhRVUYyUWl4RlFVRnZRenRCUVVOc1F5eGxRVUZQTEVOQlFVTkJMR0ZCUVZJN1FVRkRSRHM3UVVGRlJFWXNNRUpCUVc5Q0xFbEJRWEJDTzBGQlEwRXNZVUZCVDBjc1ZVRkJVRHRCUVVORU96dEJRVVZFTzBGQlEwRTdRVUZEUkN4SFFXeERSRHRCUVcxRFJDeERJaXdpWm1sc1pTSTZJbVJwYzNSaGJtTmxMV2wwWlhKaGRHOXlMbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaUx5OGdTWFJsY21GMGIzSWdkR2hoZENCMGNtRjJaWEp6WlhNZ2FXNGdkR2hsSUhKaGJtZGxJRzltSUZ0dGFXNHNJRzFoZUYwc0lITjBaWEJ3YVc1blhHNHZMeUJpZVNCa2FYTjBZVzVqWlNCbWNtOXRJR0VnWjJsMlpXNGdjM1JoY25RZ2NHOXphWFJwYjI0dUlFa3VaUzRnWm05eUlGc3dMQ0EwWFN3Z2QybDBhRnh1THk4Z2MzUmhjblFnYjJZZ01pd2dkR2hwY3lCM2FXeHNJR2wwWlhKaGRHVWdNaXdnTXl3Z01Td2dOQ3dnTUM1Y2JtVjRjRzl5ZENCa1pXWmhkV3gwSUdaMWJtTjBhVzl1S0hOMFlYSjBMQ0J0YVc1TWFXNWxMQ0J0WVhoTWFXNWxLU0I3WEc0Z0lHeGxkQ0IzWVc1MFJtOXlkMkZ5WkNBOUlIUnlkV1VzWEc0Z0lDQWdJQ0JpWVdOcmQyRnlaRVY0YUdGMWMzUmxaQ0E5SUdaaGJITmxMRnh1SUNBZ0lDQWdabTl5ZDJGeVpFVjRhR0YxYzNSbFpDQTlJR1poYkhObExGeHVJQ0FnSUNBZ2JHOWpZV3hQWm1aelpYUWdQU0F4TzF4dVhHNGdJSEpsZEhWeWJpQm1kVzVqZEdsdmJpQnBkR1Z5WVhSdmNpZ3BJSHRjYmlBZ0lDQnBaaUFvZDJGdWRFWnZjbmRoY21RZ0ppWWdJV1p2Y25kaGNtUkZlR2hoZFhOMFpXUXBJSHRjYmlBZ0lDQWdJR2xtSUNoaVlXTnJkMkZ5WkVWNGFHRjFjM1JsWkNrZ2UxeHVJQ0FnSUNBZ0lDQnNiMk5oYkU5bVpuTmxkQ3NyTzF4dUlDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnZDJGdWRFWnZjbmRoY21RZ1BTQm1ZV3h6WlR0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0x5OGdRMmhsWTJzZ2FXWWdkSEo1YVc1bklIUnZJR1pwZENCaVpYbHZibVFnZEdWNGRDQnNaVzVuZEdnc0lHRnVaQ0JwWmlCdWIzUXNJR05vWldOcklHbDBJR1pwZEhOY2JpQWdJQ0FnSUM4dklHRm1kR1Z5SUc5bVpuTmxkQ0JzYjJOaGRHbHZiaUFvYjNJZ1pHVnphWEpsWkNCc2IyTmhkR2x2YmlCdmJpQm1hWEp6ZENCcGRHVnlZWFJwYjI0cFhHNGdJQ0FnSUNCcFppQW9jM1JoY25RZ0t5QnNiMk5oYkU5bVpuTmxkQ0E4UFNCdFlYaE1hVzVsS1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCc2IyTmhiRTltWm5ObGREdGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdabTl5ZDJGeVpFVjRhR0YxYzNSbFpDQTlJSFJ5ZFdVN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnYVdZZ0tDRmlZV05yZDJGeVpFVjRhR0YxYzNSbFpDa2dlMXh1SUNBZ0lDQWdhV1lnS0NGbWIzSjNZWEprUlhob1lYVnpkR1ZrS1NCN1hHNGdJQ0FnSUNBZ0lIZGhiblJHYjNKM1lYSmtJRDBnZEhKMVpUdGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdMeThnUTJobFkyc2dhV1lnZEhKNWFXNW5JSFJ2SUdacGRDQmlaV1p2Y21VZ2RHVjRkQ0JpWldkcGJtNXBibWNzSUdGdVpDQnBaaUJ1YjNRc0lHTm9aV05ySUdsMElHWnBkSE5jYmlBZ0lDQWdJQzh2SUdKbFptOXlaU0J2Wm1aelpYUWdiRzlqWVhScGIyNWNiaUFnSUNBZ0lHbG1JQ2h0YVc1TWFXNWxJRHc5SUhOMFlYSjBJQzBnYkc5allXeFBabVp6WlhRcElIdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlDMXNiMk5oYkU5bVpuTmxkQ3NyTzF4dUlDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNCaVlXTnJkMkZ5WkVWNGFHRjFjM1JsWkNBOUlIUnlkV1U3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdhWFJsY21GMGIzSW9LVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQXZMeUJYWlNCMGNtbGxaQ0IwYnlCbWFYUWdhSFZ1YXlCaVpXWnZjbVVnZEdWNGRDQmlaV2RwYm01cGJtY2dZVzVrSUdKbGVXOXVaQ0IwWlhoMElHeGxibWQwYUN3Z2RHaGxibHh1SUNBZ0lDOHZJR2gxYm1zZ1kyRnVKM1FnWm1sMElHOXVJSFJvWlNCMFpYaDBMaUJTWlhSMWNtNGdkVzVrWldacGJtVmtYRzRnSUgwN1hHNTlYRzRpWFgwPVxuXG5cbi8qKiovIH0pLFxuLyogMTMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovJ3VzZSBzdHJpY3QnO1xuXG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovY2FsY0xpbmVDb3VudCA9IGNhbGNMaW5lQ291bnQ7XG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9leHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL21lcmdlID0gbWVyZ2U7XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi87XG5cblx0dmFyIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fcGFyc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19hcnJheSA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovO1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IGVsc2UgeyByZXR1cm4gQXJyYXkuZnJvbShhcnIpOyB9IH1cblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2Z1bmN0aW9uIGNhbGNMaW5lQ291bnQoaHVuaykge1xuXHQgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2NhbGNPbGROZXdMaW5lQ291bnQgPSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2NhbGNPbGROZXdMaW5lQ291bnQoaHVuay5saW5lcyksXG5cdCAgICAgIG9sZExpbmVzID0gX2NhbGNPbGROZXdMaW5lQ291bnQub2xkTGluZXMsXG5cdCAgICAgIG5ld0xpbmVzID0gX2NhbGNPbGROZXdMaW5lQ291bnQubmV3TGluZXM7XG5cblx0ICBpZiAob2xkTGluZXMgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgaHVuay5vbGRMaW5lcyA9IG9sZExpbmVzO1xuXHQgIH0gZWxzZSB7XG5cdCAgICBkZWxldGUgaHVuay5vbGRMaW5lcztcblx0ICB9XG5cblx0ICBpZiAobmV3TGluZXMgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgaHVuay5uZXdMaW5lcyA9IG5ld0xpbmVzO1xuXHQgIH0gZWxzZSB7XG5cdCAgICBkZWxldGUgaHVuay5uZXdMaW5lcztcblx0ICB9XG5cdH1cblxuXHRmdW5jdGlvbiBtZXJnZShtaW5lLCB0aGVpcnMsIGJhc2UpIHtcblx0ICBtaW5lID0gbG9hZFBhdGNoKG1pbmUsIGJhc2UpO1xuXHQgIHRoZWlycyA9IGxvYWRQYXRjaCh0aGVpcnMsIGJhc2UpO1xuXG5cdCAgdmFyIHJldCA9IHt9O1xuXG5cdCAgLy8gRm9yIGluZGV4IHdlIGp1c3QgbGV0IGl0IHBhc3MgdGhyb3VnaCBhcyBpdCBkb2Vzbid0IGhhdmUgYW55IG5lY2Vzc2FyeSBtZWFuaW5nLlxuXHQgIC8vIExlYXZpbmcgc2FuaXR5IGNoZWNrcyBvbiB0aGlzIHRvIHRoZSBBUEkgY29uc3VtZXIgdGhhdCBtYXkga25vdyBtb3JlIGFib3V0IHRoZVxuXHQgIC8vIG1lYW5pbmcgaW4gdGhlaXIgb3duIGNvbnRleHQuXG5cdCAgaWYgKG1pbmUuaW5kZXggfHwgdGhlaXJzLmluZGV4KSB7XG5cdCAgICByZXQuaW5kZXggPSBtaW5lLmluZGV4IHx8IHRoZWlycy5pbmRleDtcblx0ICB9XG5cblx0ICBpZiAobWluZS5uZXdGaWxlTmFtZSB8fCB0aGVpcnMubmV3RmlsZU5hbWUpIHtcblx0ICAgIGlmICghZmlsZU5hbWVDaGFuZ2VkKG1pbmUpKSB7XG5cdCAgICAgIC8vIE5vIGhlYWRlciBvciBubyBjaGFuZ2UgaW4gb3VycywgdXNlIHRoZWlycyAoYW5kIG91cnMgaWYgdGhlaXJzIGRvZXMgbm90IGV4aXN0KVxuXHQgICAgICByZXQub2xkRmlsZU5hbWUgPSB0aGVpcnMub2xkRmlsZU5hbWUgfHwgbWluZS5vbGRGaWxlTmFtZTtcblx0ICAgICAgcmV0Lm5ld0ZpbGVOYW1lID0gdGhlaXJzLm5ld0ZpbGVOYW1lIHx8IG1pbmUubmV3RmlsZU5hbWU7XG5cdCAgICAgIHJldC5vbGRIZWFkZXIgPSB0aGVpcnMub2xkSGVhZGVyIHx8IG1pbmUub2xkSGVhZGVyO1xuXHQgICAgICByZXQubmV3SGVhZGVyID0gdGhlaXJzLm5ld0hlYWRlciB8fCBtaW5lLm5ld0hlYWRlcjtcblx0ICAgIH0gZWxzZSBpZiAoIWZpbGVOYW1lQ2hhbmdlZCh0aGVpcnMpKSB7XG5cdCAgICAgIC8vIE5vIGhlYWRlciBvciBubyBjaGFuZ2UgaW4gdGhlaXJzLCB1c2Ugb3Vyc1xuXHQgICAgICByZXQub2xkRmlsZU5hbWUgPSBtaW5lLm9sZEZpbGVOYW1lO1xuXHQgICAgICByZXQubmV3RmlsZU5hbWUgPSBtaW5lLm5ld0ZpbGVOYW1lO1xuXHQgICAgICByZXQub2xkSGVhZGVyID0gbWluZS5vbGRIZWFkZXI7XG5cdCAgICAgIHJldC5uZXdIZWFkZXIgPSBtaW5lLm5ld0hlYWRlcjtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIC8vIEJvdGggY2hhbmdlZC4uLiBmaWd1cmUgaXQgb3V0XG5cdCAgICAgIHJldC5vbGRGaWxlTmFtZSA9IHNlbGVjdEZpZWxkKHJldCwgbWluZS5vbGRGaWxlTmFtZSwgdGhlaXJzLm9sZEZpbGVOYW1lKTtcblx0ICAgICAgcmV0Lm5ld0ZpbGVOYW1lID0gc2VsZWN0RmllbGQocmV0LCBtaW5lLm5ld0ZpbGVOYW1lLCB0aGVpcnMubmV3RmlsZU5hbWUpO1xuXHQgICAgICByZXQub2xkSGVhZGVyID0gc2VsZWN0RmllbGQocmV0LCBtaW5lLm9sZEhlYWRlciwgdGhlaXJzLm9sZEhlYWRlcik7XG5cdCAgICAgIHJldC5uZXdIZWFkZXIgPSBzZWxlY3RGaWVsZChyZXQsIG1pbmUubmV3SGVhZGVyLCB0aGVpcnMubmV3SGVhZGVyKTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICByZXQuaHVua3MgPSBbXTtcblxuXHQgIHZhciBtaW5lSW5kZXggPSAwLFxuXHQgICAgICB0aGVpcnNJbmRleCA9IDAsXG5cdCAgICAgIG1pbmVPZmZzZXQgPSAwLFxuXHQgICAgICB0aGVpcnNPZmZzZXQgPSAwO1xuXG5cdCAgd2hpbGUgKG1pbmVJbmRleCA8IG1pbmUuaHVua3MubGVuZ3RoIHx8IHRoZWlyc0luZGV4IDwgdGhlaXJzLmh1bmtzLmxlbmd0aCkge1xuXHQgICAgdmFyIG1pbmVDdXJyZW50ID0gbWluZS5odW5rc1ttaW5lSW5kZXhdIHx8IHsgb2xkU3RhcnQ6IEluZmluaXR5IH0sXG5cdCAgICAgICAgdGhlaXJzQ3VycmVudCA9IHRoZWlycy5odW5rc1t0aGVpcnNJbmRleF0gfHwgeyBvbGRTdGFydDogSW5maW5pdHkgfTtcblxuXHQgICAgaWYgKGh1bmtCZWZvcmUobWluZUN1cnJlbnQsIHRoZWlyc0N1cnJlbnQpKSB7XG5cdCAgICAgIC8vIFRoaXMgcGF0Y2ggZG9lcyBub3Qgb3ZlcmxhcCB3aXRoIGFueSBvZiB0aGUgb3RoZXJzLCB5YXkuXG5cdCAgICAgIHJldC5odW5rcy5wdXNoKGNsb25lSHVuayhtaW5lQ3VycmVudCwgbWluZU9mZnNldCkpO1xuXHQgICAgICBtaW5lSW5kZXgrKztcblx0ICAgICAgdGhlaXJzT2Zmc2V0ICs9IG1pbmVDdXJyZW50Lm5ld0xpbmVzIC0gbWluZUN1cnJlbnQub2xkTGluZXM7XG5cdCAgICB9IGVsc2UgaWYgKGh1bmtCZWZvcmUodGhlaXJzQ3VycmVudCwgbWluZUN1cnJlbnQpKSB7XG5cdCAgICAgIC8vIFRoaXMgcGF0Y2ggZG9lcyBub3Qgb3ZlcmxhcCB3aXRoIGFueSBvZiB0aGUgb3RoZXJzLCB5YXkuXG5cdCAgICAgIHJldC5odW5rcy5wdXNoKGNsb25lSHVuayh0aGVpcnNDdXJyZW50LCB0aGVpcnNPZmZzZXQpKTtcblx0ICAgICAgdGhlaXJzSW5kZXgrKztcblx0ICAgICAgbWluZU9mZnNldCArPSB0aGVpcnNDdXJyZW50Lm5ld0xpbmVzIC0gdGhlaXJzQ3VycmVudC5vbGRMaW5lcztcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIC8vIE92ZXJsYXAsIG1lcmdlIGFzIGJlc3Qgd2UgY2FuXG5cdCAgICAgIHZhciBtZXJnZWRIdW5rID0ge1xuXHQgICAgICAgIG9sZFN0YXJ0OiBNYXRoLm1pbihtaW5lQ3VycmVudC5vbGRTdGFydCwgdGhlaXJzQ3VycmVudC5vbGRTdGFydCksXG5cdCAgICAgICAgb2xkTGluZXM6IDAsXG5cdCAgICAgICAgbmV3U3RhcnQ6IE1hdGgubWluKG1pbmVDdXJyZW50Lm5ld1N0YXJ0ICsgbWluZU9mZnNldCwgdGhlaXJzQ3VycmVudC5vbGRTdGFydCArIHRoZWlyc09mZnNldCksXG5cdCAgICAgICAgbmV3TGluZXM6IDAsXG5cdCAgICAgICAgbGluZXM6IFtdXG5cdCAgICAgIH07XG5cdCAgICAgIG1lcmdlTGluZXMobWVyZ2VkSHVuaywgbWluZUN1cnJlbnQub2xkU3RhcnQsIG1pbmVDdXJyZW50LmxpbmVzLCB0aGVpcnNDdXJyZW50Lm9sZFN0YXJ0LCB0aGVpcnNDdXJyZW50LmxpbmVzKTtcblx0ICAgICAgdGhlaXJzSW5kZXgrKztcblx0ICAgICAgbWluZUluZGV4Kys7XG5cblx0ICAgICAgcmV0Lmh1bmtzLnB1c2gobWVyZ2VkSHVuayk7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgcmV0dXJuIHJldDtcblx0fVxuXG5cdGZ1bmN0aW9uIGxvYWRQYXRjaChwYXJhbSwgYmFzZSkge1xuXHQgIGlmICh0eXBlb2YgcGFyYW0gPT09ICdzdHJpbmcnKSB7XG5cdCAgICBpZiAoL15AQC9tLnRlc3QocGFyYW0pIHx8IC9eSW5kZXg6L20udGVzdChwYXJhbSkpIHtcblx0ICAgICAgcmV0dXJuICgvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKDAsIF9wYXJzZS5wYXJzZVBhdGNoKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyhwYXJhbSlbMF1cblx0ICAgICAgKTtcblx0ICAgIH1cblxuXHQgICAgaWYgKCFiYXNlKSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBwcm92aWRlIGEgYmFzZSByZWZlcmVuY2Ugb3IgcGFzcyBpbiBhIHBhdGNoJyk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gKC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oMCwgX2NyZWF0ZS5zdHJ1Y3R1cmVkUGF0Y2gpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBiYXNlLCBwYXJhbSlcblx0ICAgICk7XG5cdCAgfVxuXG5cdCAgcmV0dXJuIHBhcmFtO1xuXHR9XG5cblx0ZnVuY3Rpb24gZmlsZU5hbWVDaGFuZ2VkKHBhdGNoKSB7XG5cdCAgcmV0dXJuIHBhdGNoLm5ld0ZpbGVOYW1lICYmIHBhdGNoLm5ld0ZpbGVOYW1lICE9PSBwYXRjaC5vbGRGaWxlTmFtZTtcblx0fVxuXG5cdGZ1bmN0aW9uIHNlbGVjdEZpZWxkKGluZGV4LCBtaW5lLCB0aGVpcnMpIHtcblx0ICBpZiAobWluZSA9PT0gdGhlaXJzKSB7XG5cdCAgICByZXR1cm4gbWluZTtcblx0ICB9IGVsc2Uge1xuXHQgICAgaW5kZXguY29uZmxpY3QgPSB0cnVlO1xuXHQgICAgcmV0dXJuIHsgbWluZTogbWluZSwgdGhlaXJzOiB0aGVpcnMgfTtcblx0ICB9XG5cdH1cblxuXHRmdW5jdGlvbiBodW5rQmVmb3JlKHRlc3QsIGNoZWNrKSB7XG5cdCAgcmV0dXJuIHRlc3Qub2xkU3RhcnQgPCBjaGVjay5vbGRTdGFydCAmJiB0ZXN0Lm9sZFN0YXJ0ICsgdGVzdC5vbGRMaW5lcyA8IGNoZWNrLm9sZFN0YXJ0O1xuXHR9XG5cblx0ZnVuY3Rpb24gY2xvbmVIdW5rKGh1bmssIG9mZnNldCkge1xuXHQgIHJldHVybiB7XG5cdCAgICBvbGRTdGFydDogaHVuay5vbGRTdGFydCwgb2xkTGluZXM6IGh1bmsub2xkTGluZXMsXG5cdCAgICBuZXdTdGFydDogaHVuay5uZXdTdGFydCArIG9mZnNldCwgbmV3TGluZXM6IGh1bmsubmV3TGluZXMsXG5cdCAgICBsaW5lczogaHVuay5saW5lc1xuXHQgIH07XG5cdH1cblxuXHRmdW5jdGlvbiBtZXJnZUxpbmVzKGh1bmssIG1pbmVPZmZzZXQsIG1pbmVMaW5lcywgdGhlaXJPZmZzZXQsIHRoZWlyTGluZXMpIHtcblx0ICAvLyBUaGlzIHdpbGwgZ2VuZXJhbGx5IHJlc3VsdCBpbiBhIGNvbmZsaWN0ZWQgaHVuaywgYnV0IHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB0aGUgY29udGV4dFxuXHQgIC8vIGlzIHRoZSBvbmx5IG92ZXJsYXAgd2hlcmUgd2UgY2FuIHN1Y2Nlc3NmdWxseSBtZXJnZSB0aGUgY29udGVudCBoZXJlLlxuXHQgIHZhciBtaW5lID0geyBvZmZzZXQ6IG1pbmVPZmZzZXQsIGxpbmVzOiBtaW5lTGluZXMsIGluZGV4OiAwIH0sXG5cdCAgICAgIHRoZWlyID0geyBvZmZzZXQ6IHRoZWlyT2Zmc2V0LCBsaW5lczogdGhlaXJMaW5lcywgaW5kZXg6IDAgfTtcblxuXHQgIC8vIEhhbmRsZSBhbnkgbGVhZGluZyBjb250ZW50XG5cdCAgaW5zZXJ0TGVhZGluZyhodW5rLCBtaW5lLCB0aGVpcik7XG5cdCAgaW5zZXJ0TGVhZGluZyhodW5rLCB0aGVpciwgbWluZSk7XG5cblx0ICAvLyBOb3cgaW4gdGhlIG92ZXJsYXAgY29udGVudC4gU2NhbiB0aHJvdWdoIGFuZCBzZWxlY3QgdGhlIGJlc3QgY2hhbmdlcyBmcm9tIGVhY2guXG5cdCAgd2hpbGUgKG1pbmUuaW5kZXggPCBtaW5lLmxpbmVzLmxlbmd0aCAmJiB0aGVpci5pbmRleCA8IHRoZWlyLmxpbmVzLmxlbmd0aCkge1xuXHQgICAgdmFyIG1pbmVDdXJyZW50ID0gbWluZS5saW5lc1ttaW5lLmluZGV4XSxcblx0ICAgICAgICB0aGVpckN1cnJlbnQgPSB0aGVpci5saW5lc1t0aGVpci5pbmRleF07XG5cblx0ICAgIGlmICgobWluZUN1cnJlbnRbMF0gPT09ICctJyB8fCBtaW5lQ3VycmVudFswXSA9PT0gJysnKSAmJiAodGhlaXJDdXJyZW50WzBdID09PSAnLScgfHwgdGhlaXJDdXJyZW50WzBdID09PSAnKycpKSB7XG5cdCAgICAgIC8vIEJvdGggbW9kaWZpZWQgLi4uXG5cdCAgICAgIG11dHVhbENoYW5nZShodW5rLCBtaW5lLCB0aGVpcik7XG5cdCAgICB9IGVsc2UgaWYgKG1pbmVDdXJyZW50WzBdID09PSAnKycgJiYgdGhlaXJDdXJyZW50WzBdID09PSAnICcpIHtcblx0ICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciBfaHVuayRsaW5lcztcblxuXHQgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyAvLyBNaW5lIGluc2VydGVkXG5cdCAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oX2h1bmskbGluZXMgPSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2h1bmsubGluZXMpLnB1c2guIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9hcHBseSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyggLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19odW5rJGxpbmVzIC8qaXN0YW5idWwgaWdub3JlIGVuZCovLCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX3RvQ29uc3VtYWJsZUFycmF5KCAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2NvbGxlY3RDaGFuZ2UobWluZSkpKTtcblx0ICAgIH0gZWxzZSBpZiAodGhlaXJDdXJyZW50WzBdID09PSAnKycgJiYgbWluZUN1cnJlbnRbMF0gPT09ICcgJykge1xuXHQgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9odW5rJGxpbmVzMjtcblxuXHQgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyAvLyBUaGVpcnMgaW5zZXJ0ZWRcblx0ICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyhfaHVuayRsaW5lczIgPSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2h1bmsubGluZXMpLnB1c2guIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9hcHBseSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyggLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19odW5rJGxpbmVzMiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLywgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL190b0NvbnN1bWFibGVBcnJheSggLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jb2xsZWN0Q2hhbmdlKHRoZWlyKSkpO1xuXHQgICAgfSBlbHNlIGlmIChtaW5lQ3VycmVudFswXSA9PT0gJy0nICYmIHRoZWlyQ3VycmVudFswXSA9PT0gJyAnKSB7XG5cdCAgICAgIC8vIE1pbmUgcmVtb3ZlZCBvciBlZGl0ZWRcblx0ICAgICAgcmVtb3ZhbChodW5rLCBtaW5lLCB0aGVpcik7XG5cdCAgICB9IGVsc2UgaWYgKHRoZWlyQ3VycmVudFswXSA9PT0gJy0nICYmIG1pbmVDdXJyZW50WzBdID09PSAnICcpIHtcblx0ICAgICAgLy8gVGhlaXIgcmVtb3ZlZCBvciBlZGl0ZWRcblx0ICAgICAgcmVtb3ZhbChodW5rLCB0aGVpciwgbWluZSwgdHJ1ZSk7XG5cdCAgICB9IGVsc2UgaWYgKG1pbmVDdXJyZW50ID09PSB0aGVpckN1cnJlbnQpIHtcblx0ICAgICAgLy8gQ29udGV4dCBpZGVudGl0eVxuXHQgICAgICBodW5rLmxpbmVzLnB1c2gobWluZUN1cnJlbnQpO1xuXHQgICAgICBtaW5lLmluZGV4Kys7XG5cdCAgICAgIHRoZWlyLmluZGV4Kys7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICAvLyBDb250ZXh0IG1pc21hdGNoXG5cdCAgICAgIGNvbmZsaWN0KGh1bmssIGNvbGxlY3RDaGFuZ2UobWluZSksIGNvbGxlY3RDaGFuZ2UodGhlaXIpKTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICAvLyBOb3cgcHVzaCBhbnl0aGluZyB0aGF0IG1heSBiZSByZW1haW5pbmdcblx0ICBpbnNlcnRUcmFpbGluZyhodW5rLCBtaW5lKTtcblx0ICBpbnNlcnRUcmFpbGluZyhodW5rLCB0aGVpcik7XG5cblx0ICBjYWxjTGluZUNvdW50KGh1bmspO1xuXHR9XG5cblx0ZnVuY3Rpb24gbXV0dWFsQ2hhbmdlKGh1bmssIG1pbmUsIHRoZWlyKSB7XG5cdCAgdmFyIG15Q2hhbmdlcyA9IGNvbGxlY3RDaGFuZ2UobWluZSksXG5cdCAgICAgIHRoZWlyQ2hhbmdlcyA9IGNvbGxlY3RDaGFuZ2UodGhlaXIpO1xuXG5cdCAgaWYgKGFsbFJlbW92ZXMobXlDaGFuZ2VzKSAmJiBhbGxSZW1vdmVzKHRoZWlyQ2hhbmdlcykpIHtcblx0ICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgcmVtb3ZlIGNoYW5nZXMgdGhhdCBhcmUgc3VwZXJzZXRzIG9mIG9uZSBhbm90aGVyXG5cdCAgICBpZiAoIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oMCwgX2FycmF5LmFycmF5U3RhcnRzV2l0aCkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8obXlDaGFuZ2VzLCB0aGVpckNoYW5nZXMpICYmIHNraXBSZW1vdmVTdXBlcnNldCh0aGVpciwgbXlDaGFuZ2VzLCBteUNoYW5nZXMubGVuZ3RoIC0gdGhlaXJDaGFuZ2VzLmxlbmd0aCkpIHtcblx0ICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciBfaHVuayRsaW5lczM7XG5cblx0ICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyhfaHVuayRsaW5lczMgPSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2h1bmsubGluZXMpLnB1c2guIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9hcHBseSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyggLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19odW5rJGxpbmVzMyAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLywgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL190b0NvbnN1bWFibGVBcnJheSggLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9teUNoYW5nZXMpKTtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfSBlbHNlIGlmICggLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLygwLCBfYXJyYXkuYXJyYXlTdGFydHNXaXRoKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyh0aGVpckNoYW5nZXMsIG15Q2hhbmdlcykgJiYgc2tpcFJlbW92ZVN1cGVyc2V0KG1pbmUsIHRoZWlyQ2hhbmdlcywgdGhlaXJDaGFuZ2VzLmxlbmd0aCAtIG15Q2hhbmdlcy5sZW5ndGgpKSB7XG5cdCAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2h1bmskbGluZXM0O1xuXG5cdCAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oX2h1bmskbGluZXM0ID0gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9odW5rLmxpbmVzKS5wdXNoLiAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovYXBwbHkgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8oIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9faHVuayRsaW5lczQgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8sIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fdG9Db25zdW1hYmxlQXJyYXkoIC8qaXN0YW5idWwgaWdub3JlIGVuZCovdGhlaXJDaGFuZ2VzKSk7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICB9IGVsc2UgaWYgKCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKDAsIF9hcnJheS5hcnJheUVxdWFsKSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyhteUNoYW5nZXMsIHRoZWlyQ2hhbmdlcykpIHtcblx0ICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2h1bmskbGluZXM1O1xuXG5cdCAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKF9odW5rJGxpbmVzNSA9IC8qaXN0YW5idWwgaWdub3JlIGVuZCovaHVuay5saW5lcykucHVzaC4gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2FwcGx5IC8qaXN0YW5idWwgaWdub3JlIGVuZCovKCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2h1bmskbGluZXM1IC8qaXN0YW5idWwgaWdub3JlIGVuZCovLCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX3RvQ29uc3VtYWJsZUFycmF5KCAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL215Q2hhbmdlcykpO1xuXHQgICAgcmV0dXJuO1xuXHQgIH1cblxuXHQgIGNvbmZsaWN0KGh1bmssIG15Q2hhbmdlcywgdGhlaXJDaGFuZ2VzKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHJlbW92YWwoaHVuaywgbWluZSwgdGhlaXIsIHN3YXApIHtcblx0ICB2YXIgbXlDaGFuZ2VzID0gY29sbGVjdENoYW5nZShtaW5lKSxcblx0ICAgICAgdGhlaXJDaGFuZ2VzID0gY29sbGVjdENvbnRleHQodGhlaXIsIG15Q2hhbmdlcyk7XG5cdCAgaWYgKHRoZWlyQ2hhbmdlcy5tZXJnZWQpIHtcblx0ICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2h1bmskbGluZXM2O1xuXG5cdCAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKF9odW5rJGxpbmVzNiA9IC8qaXN0YW5idWwgaWdub3JlIGVuZCovaHVuay5saW5lcykucHVzaC4gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2FwcGx5IC8qaXN0YW5idWwgaWdub3JlIGVuZCovKCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2h1bmskbGluZXM2IC8qaXN0YW5idWwgaWdub3JlIGVuZCovLCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX3RvQ29uc3VtYWJsZUFycmF5KCAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL3RoZWlyQ2hhbmdlcy5tZXJnZWQpKTtcblx0ICB9IGVsc2Uge1xuXHQgICAgY29uZmxpY3QoaHVuaywgc3dhcCA/IHRoZWlyQ2hhbmdlcyA6IG15Q2hhbmdlcywgc3dhcCA/IG15Q2hhbmdlcyA6IHRoZWlyQ2hhbmdlcyk7XG5cdCAgfVxuXHR9XG5cblx0ZnVuY3Rpb24gY29uZmxpY3QoaHVuaywgbWluZSwgdGhlaXIpIHtcblx0ICBodW5rLmNvbmZsaWN0ID0gdHJ1ZTtcblx0ICBodW5rLmxpbmVzLnB1c2goe1xuXHQgICAgY29uZmxpY3Q6IHRydWUsXG5cdCAgICBtaW5lOiBtaW5lLFxuXHQgICAgdGhlaXJzOiB0aGVpclxuXHQgIH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gaW5zZXJ0TGVhZGluZyhodW5rLCBpbnNlcnQsIHRoZWlyKSB7XG5cdCAgd2hpbGUgKGluc2VydC5vZmZzZXQgPCB0aGVpci5vZmZzZXQgJiYgaW5zZXJ0LmluZGV4IDwgaW5zZXJ0LmxpbmVzLmxlbmd0aCkge1xuXHQgICAgdmFyIGxpbmUgPSBpbnNlcnQubGluZXNbaW5zZXJ0LmluZGV4KytdO1xuXHQgICAgaHVuay5saW5lcy5wdXNoKGxpbmUpO1xuXHQgICAgaW5zZXJ0Lm9mZnNldCsrO1xuXHQgIH1cblx0fVxuXHRmdW5jdGlvbiBpbnNlcnRUcmFpbGluZyhodW5rLCBpbnNlcnQpIHtcblx0ICB3aGlsZSAoaW5zZXJ0LmluZGV4IDwgaW5zZXJ0LmxpbmVzLmxlbmd0aCkge1xuXHQgICAgdmFyIGxpbmUgPSBpbnNlcnQubGluZXNbaW5zZXJ0LmluZGV4KytdO1xuXHQgICAgaHVuay5saW5lcy5wdXNoKGxpbmUpO1xuXHQgIH1cblx0fVxuXG5cdGZ1bmN0aW9uIGNvbGxlY3RDaGFuZ2Uoc3RhdGUpIHtcblx0ICB2YXIgcmV0ID0gW10sXG5cdCAgICAgIG9wZXJhdGlvbiA9IHN0YXRlLmxpbmVzW3N0YXRlLmluZGV4XVswXTtcblx0ICB3aGlsZSAoc3RhdGUuaW5kZXggPCBzdGF0ZS5saW5lcy5sZW5ndGgpIHtcblx0ICAgIHZhciBsaW5lID0gc3RhdGUubGluZXNbc3RhdGUuaW5kZXhdO1xuXG5cdCAgICAvLyBHcm91cCBhZGRpdGlvbnMgdGhhdCBhcmUgaW1tZWRpYXRlbHkgYWZ0ZXIgc3VidHJhY3Rpb25zIGFuZCB0cmVhdCB0aGVtIGFzIG9uZSBcImF0b21pY1wiIG1vZGlmeSBjaGFuZ2UuXG5cdCAgICBpZiAob3BlcmF0aW9uID09PSAnLScgJiYgbGluZVswXSA9PT0gJysnKSB7XG5cdCAgICAgIG9wZXJhdGlvbiA9ICcrJztcblx0ICAgIH1cblxuXHQgICAgaWYgKG9wZXJhdGlvbiA9PT0gbGluZVswXSkge1xuXHQgICAgICByZXQucHVzaChsaW5lKTtcblx0ICAgICAgc3RhdGUuaW5kZXgrKztcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGJyZWFrO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHJldHVybiByZXQ7XG5cdH1cblx0ZnVuY3Rpb24gY29sbGVjdENvbnRleHQoc3RhdGUsIG1hdGNoQ2hhbmdlcykge1xuXHQgIHZhciBjaGFuZ2VzID0gW10sXG5cdCAgICAgIG1lcmdlZCA9IFtdLFxuXHQgICAgICBtYXRjaEluZGV4ID0gMCxcblx0ICAgICAgY29udGV4dENoYW5nZXMgPSBmYWxzZSxcblx0ICAgICAgY29uZmxpY3RlZCA9IGZhbHNlO1xuXHQgIHdoaWxlIChtYXRjaEluZGV4IDwgbWF0Y2hDaGFuZ2VzLmxlbmd0aCAmJiBzdGF0ZS5pbmRleCA8IHN0YXRlLmxpbmVzLmxlbmd0aCkge1xuXHQgICAgdmFyIGNoYW5nZSA9IHN0YXRlLmxpbmVzW3N0YXRlLmluZGV4XSxcblx0ICAgICAgICBtYXRjaCA9IG1hdGNoQ2hhbmdlc1ttYXRjaEluZGV4XTtcblxuXHQgICAgLy8gT25jZSB3ZSd2ZSBoaXQgb3VyIGFkZCwgdGhlbiB3ZSBhcmUgZG9uZVxuXHQgICAgaWYgKG1hdGNoWzBdID09PSAnKycpIHtcblx0ICAgICAgYnJlYWs7XG5cdCAgICB9XG5cblx0ICAgIGNvbnRleHRDaGFuZ2VzID0gY29udGV4dENoYW5nZXMgfHwgY2hhbmdlWzBdICE9PSAnICc7XG5cblx0ICAgIG1lcmdlZC5wdXNoKG1hdGNoKTtcblx0ICAgIG1hdGNoSW5kZXgrKztcblxuXHQgICAgLy8gQ29uc3VtZSBhbnkgYWRkaXRpb25zIGluIHRoZSBvdGhlciBibG9jayBhcyBhIGNvbmZsaWN0IHRvIGF0dGVtcHRcblx0ICAgIC8vIHRvIHB1bGwgaW4gdGhlIHJlbWFpbmluZyBjb250ZXh0IGFmdGVyIHRoaXNcblx0ICAgIGlmIChjaGFuZ2VbMF0gPT09ICcrJykge1xuXHQgICAgICBjb25mbGljdGVkID0gdHJ1ZTtcblxuXHQgICAgICB3aGlsZSAoY2hhbmdlWzBdID09PSAnKycpIHtcblx0ICAgICAgICBjaGFuZ2VzLnB1c2goY2hhbmdlKTtcblx0ICAgICAgICBjaGFuZ2UgPSBzdGF0ZS5saW5lc1srK3N0YXRlLmluZGV4XTtcblx0ICAgICAgfVxuXHQgICAgfVxuXG5cdCAgICBpZiAobWF0Y2guc3Vic3RyKDEpID09PSBjaGFuZ2Uuc3Vic3RyKDEpKSB7XG5cdCAgICAgIGNoYW5nZXMucHVzaChjaGFuZ2UpO1xuXHQgICAgICBzdGF0ZS5pbmRleCsrO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgY29uZmxpY3RlZCA9IHRydWU7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgaWYgKChtYXRjaENoYW5nZXNbbWF0Y2hJbmRleF0gfHwgJycpWzBdID09PSAnKycgJiYgY29udGV4dENoYW5nZXMpIHtcblx0ICAgIGNvbmZsaWN0ZWQgPSB0cnVlO1xuXHQgIH1cblxuXHQgIGlmIChjb25mbGljdGVkKSB7XG5cdCAgICByZXR1cm4gY2hhbmdlcztcblx0ICB9XG5cblx0ICB3aGlsZSAobWF0Y2hJbmRleCA8IG1hdGNoQ2hhbmdlcy5sZW5ndGgpIHtcblx0ICAgIG1lcmdlZC5wdXNoKG1hdGNoQ2hhbmdlc1ttYXRjaEluZGV4KytdKTtcblx0ICB9XG5cblx0ICByZXR1cm4ge1xuXHQgICAgbWVyZ2VkOiBtZXJnZWQsXG5cdCAgICBjaGFuZ2VzOiBjaGFuZ2VzXG5cdCAgfTtcblx0fVxuXG5cdGZ1bmN0aW9uIGFsbFJlbW92ZXMoY2hhbmdlcykge1xuXHQgIHJldHVybiBjaGFuZ2VzLnJlZHVjZShmdW5jdGlvbiAocHJldiwgY2hhbmdlKSB7XG5cdCAgICByZXR1cm4gcHJldiAmJiBjaGFuZ2VbMF0gPT09ICctJztcblx0ICB9LCB0cnVlKTtcblx0fVxuXHRmdW5jdGlvbiBza2lwUmVtb3ZlU3VwZXJzZXQoc3RhdGUsIHJlbW92ZUNoYW5nZXMsIGRlbHRhKSB7XG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWx0YTsgaSsrKSB7XG5cdCAgICB2YXIgY2hhbmdlQ29udGVudCA9IHJlbW92ZUNoYW5nZXNbcmVtb3ZlQ2hhbmdlcy5sZW5ndGggLSBkZWx0YSArIGldLnN1YnN0cigxKTtcblx0ICAgIGlmIChzdGF0ZS5saW5lc1tzdGF0ZS5pbmRleCArIGldICE9PSAnICcgKyBjaGFuZ2VDb250ZW50KSB7XG5cdCAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICBzdGF0ZS5pbmRleCArPSBkZWx0YTtcblx0ICByZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGZ1bmN0aW9uIGNhbGNPbGROZXdMaW5lQ291bnQobGluZXMpIHtcblx0ICB2YXIgb2xkTGluZXMgPSAwO1xuXHQgIHZhciBuZXdMaW5lcyA9IDA7XG5cblx0ICBsaW5lcy5mb3JFYWNoKGZ1bmN0aW9uIChsaW5lKSB7XG5cdCAgICBpZiAodHlwZW9mIGxpbmUgIT09ICdzdHJpbmcnKSB7XG5cdCAgICAgIHZhciBteUNvdW50ID0gY2FsY09sZE5ld0xpbmVDb3VudChsaW5lLm1pbmUpO1xuXHQgICAgICB2YXIgdGhlaXJDb3VudCA9IGNhbGNPbGROZXdMaW5lQ291bnQobGluZS50aGVpcnMpO1xuXG5cdCAgICAgIGlmIChvbGRMaW5lcyAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgaWYgKG15Q291bnQub2xkTGluZXMgPT09IHRoZWlyQ291bnQub2xkTGluZXMpIHtcblx0ICAgICAgICAgIG9sZExpbmVzICs9IG15Q291bnQub2xkTGluZXM7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIG9sZExpbmVzID0gdW5kZWZpbmVkO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXG5cdCAgICAgIGlmIChuZXdMaW5lcyAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgaWYgKG15Q291bnQubmV3TGluZXMgPT09IHRoZWlyQ291bnQubmV3TGluZXMpIHtcblx0ICAgICAgICAgIG5ld0xpbmVzICs9IG15Q291bnQubmV3TGluZXM7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIG5ld0xpbmVzID0gdW5kZWZpbmVkO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgaWYgKG5ld0xpbmVzICE9PSB1bmRlZmluZWQgJiYgKGxpbmVbMF0gPT09ICcrJyB8fCBsaW5lWzBdID09PSAnICcpKSB7XG5cdCAgICAgICAgbmV3TGluZXMrKztcblx0ICAgICAgfVxuXHQgICAgICBpZiAob2xkTGluZXMgIT09IHVuZGVmaW5lZCAmJiAobGluZVswXSA9PT0gJy0nIHx8IGxpbmVbMF0gPT09ICcgJykpIHtcblx0ICAgICAgICBvbGRMaW5lcysrO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSk7XG5cblx0ICByZXR1cm4geyBvbGRMaW5lczogb2xkTGluZXMsIG5ld0xpbmVzOiBuZXdMaW5lcyB9O1xuXHR9XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OXdZWFJqYUM5dFpYSm5aUzVxY3lKZExDSnVZVzFsY3lJNld5SmpZV3hqVEdsdVpVTnZkVzUwSWl3aWJXVnlaMlVpTENKb2RXNXJJaXdpWTJGc1kwOXNaRTVsZDB4cGJtVkRiM1Z1ZENJc0lteHBibVZ6SWl3aWIyeGtUR2x1WlhNaUxDSnVaWGRNYVc1bGN5SXNJblZ1WkdWbWFXNWxaQ0lzSW0xcGJtVWlMQ0owYUdWcGNuTWlMQ0ppWVhObElpd2liRzloWkZCaGRHTm9JaXdpY21WMElpd2lhVzVrWlhnaUxDSnVaWGRHYVd4bFRtRnRaU0lzSW1acGJHVk9ZVzFsUTJoaGJtZGxaQ0lzSW05c1pFWnBiR1ZPWVcxbElpd2liMnhrU0dWaFpHVnlJaXdpYm1WM1NHVmhaR1Z5SWl3aWMyVnNaV04wUm1sbGJHUWlMQ0pvZFc1cmN5SXNJbTFwYm1WSmJtUmxlQ0lzSW5Sb1pXbHljMGx1WkdWNElpd2liV2x1WlU5bVpuTmxkQ0lzSW5Sb1pXbHljMDltWm5ObGRDSXNJbXhsYm1kMGFDSXNJbTFwYm1WRGRYSnlaVzUwSWl3aWIyeGtVM1JoY25RaUxDSkpibVpwYm1sMGVTSXNJblJvWldseWMwTjFjbkpsYm5RaUxDSm9kVzVyUW1WbWIzSmxJaXdpY0hWemFDSXNJbU5zYjI1bFNIVnVheUlzSW0xbGNtZGxaRWgxYm1zaUxDSk5ZWFJvSWl3aWJXbHVJaXdpYm1WM1UzUmhjblFpTENKdFpYSm5aVXhwYm1Weklpd2ljR0Z5WVcwaUxDSjBaWE4wSWl3aVJYSnliM0lpTENKd1lYUmphQ0lzSW1OdmJtWnNhV04wSWl3aVkyaGxZMnNpTENKdlptWnpaWFFpTENKdGFXNWxUR2x1WlhNaUxDSjBhR1ZwY2s5bVpuTmxkQ0lzSW5Sb1pXbHlUR2x1WlhNaUxDSjBhR1ZwY2lJc0ltbHVjMlZ5ZEV4bFlXUnBibWNpTENKMGFHVnBja04xY25KbGJuUWlMQ0p0ZFhSMVlXeERhR0Z1WjJVaUxDSmpiMnhzWldOMFEyaGhibWRsSWl3aWNtVnRiM1poYkNJc0ltbHVjMlZ5ZEZSeVlXbHNhVzVuSWl3aWJYbERhR0Z1WjJWeklpd2lkR2hsYVhKRGFHRnVaMlZ6SWl3aVlXeHNVbVZ0YjNabGN5SXNJbk5yYVhCU1pXMXZkbVZUZFhCbGNuTmxkQ0lzSW5OM1lYQWlMQ0pqYjJ4c1pXTjBRMjl1ZEdWNGRDSXNJbTFsY21kbFpDSXNJbWx1YzJWeWRDSXNJbXhwYm1VaUxDSnpkR0YwWlNJc0ltOXdaWEpoZEdsdmJpSXNJbTFoZEdOb1EyaGhibWRsY3lJc0ltTm9ZVzVuWlhNaUxDSnRZWFJqYUVsdVpHVjRJaXdpWTI5dWRHVjRkRU5vWVc1blpYTWlMQ0pqYjI1bWJHbGpkR1ZrSWl3aVkyaGhibWRsSWl3aWJXRjBZMmdpTENKemRXSnpkSElpTENKeVpXUjFZMlVpTENKd2NtVjJJaXdpY21WdGIzWmxRMmhoYm1kbGN5SXNJbVJsYkhSaElpd2lhU0lzSW1Ob1lXNW5aVU52Ym5SbGJuUWlMQ0ptYjNKRllXTm9JaXdpYlhsRGIzVnVkQ0lzSW5Sb1pXbHlRMjkxYm5RaVhTd2liV0Z3Y0dsdVozTWlPaUk3T3p0blEwRkxaMEpCTEdFc1IwRkJRVUVzWVR0NVJFRm5Ra0ZETEVzc1IwRkJRVUVzU3pzN1FVRnlRbWhDT3p0QlFVTkJPenRCUVVWQk96czdPM1ZDUVVWUExGTkJRVk5FTEdGQlFWUXNRMEZCZFVKRkxFbEJRWFpDTEVWQlFUWkNPMEZCUVVFc05rVkJRMHhETEc5Q1FVRnZRa1FzUzBGQlMwVXNTMEZCZWtJc1EwRkVTenRCUVVGQkxFMUJRek5DUXl4UlFVUXlRaXgzUWtGRE0wSkJMRkZCUkRKQ08wRkJRVUVzVFVGRGFrSkRMRkZCUkdsQ0xIZENRVU5xUWtFc1VVRkVhVUk3TzBGQlIyeERMRTFCUVVsRUxHRkJRV0ZGTEZOQlFXcENMRVZCUVRSQ08wRkJRekZDVEN4VFFVRkxSeXhSUVVGTUxFZEJRV2RDUVN4UlFVRm9RanRCUVVORUxFZEJSa1FzVFVGRlR6dEJRVU5NTEZkQlFVOUlMRXRCUVV0SExGRkJRVm83UVVGRFJEczdRVUZGUkN4TlFVRkpReXhoUVVGaFF5eFRRVUZxUWl4RlFVRTBRanRCUVVNeFFrd3NVMEZCUzBrc1VVRkJUQ3hIUVVGblFrRXNVVUZCYUVJN1FVRkRSQ3hIUVVaRUxFMUJSVTg3UVVGRFRDeFhRVUZQU2l4TFFVRkxTU3hSUVVGYU8wRkJRMFE3UVVGRFJqczdRVUZGVFN4VFFVRlRUQ3hMUVVGVUxFTkJRV1ZQTEVsQlFXWXNSVUZCY1VKRExFMUJRWEpDTEVWQlFUWkNReXhKUVVFM1FpeEZRVUZ0UXp0QlFVTjRRMFlzVTBGQlQwY3NWVUZCVlVnc1NVRkJWaXhGUVVGblFrVXNTVUZCYUVJc1EwRkJVRHRCUVVOQlJDeFhRVUZUUlN4VlFVRlZSaXhOUVVGV0xFVkJRV3RDUXl4SlFVRnNRaXhEUVVGVU96dEJRVVZCTEUxQlFVbEZMRTFCUVUwc1JVRkJWanM3UVVGRlFUdEJRVU5CTzBGQlEwRTdRVUZEUVN4TlFVRkpTaXhMUVVGTFN5eExRVUZNTEVsQlFXTktMRTlCUVU5SkxFdEJRWHBDTEVWQlFXZERPMEZCUXpsQ1JDeFJRVUZKUXl4TFFVRktMRWRCUVZsTUxFdEJRVXRMTEV0QlFVd3NTVUZCWTBvc1QwRkJUMGtzUzBGQmFrTTdRVUZEUkRzN1FVRkZSQ3hOUVVGSlRDeExRVUZMVFN4WFFVRk1MRWxCUVc5Q1RDeFBRVUZQU3l4WFFVRXZRaXhGUVVFMFF6dEJRVU14UXl4UlFVRkpMRU5CUVVORExHZENRVUZuUWxBc1NVRkJhRUlzUTBGQlRDeEZRVUUwUWp0QlFVTXhRanRCUVVOQlNTeFZRVUZKU1N4WFFVRktMRWRCUVd0Q1VDeFBRVUZQVHl4WFFVRlFMRWxCUVhOQ1VpeExRVUZMVVN4WFFVRTNRenRCUVVOQlNpeFZRVUZKUlN4WFFVRktMRWRCUVd0Q1RDeFBRVUZQU3l4WFFVRlFMRWxCUVhOQ1RpeExRVUZMVFN4WFFVRTNRenRCUVVOQlJpeFZRVUZKU3l4VFFVRktMRWRCUVdkQ1VpeFBRVUZQVVN4VFFVRlFMRWxCUVc5Q1ZDeExRVUZMVXl4VFFVRjZRenRCUVVOQlRDeFZRVUZKVFN4VFFVRktMRWRCUVdkQ1ZDeFBRVUZQVXl4VFFVRlFMRWxCUVc5Q1ZpeExRVUZMVlN4VFFVRjZRenRCUVVORUxFdEJUa1FzVFVGTlR5eEpRVUZKTEVOQlFVTklMR2RDUVVGblFrNHNUVUZCYUVJc1EwRkJUQ3hGUVVFNFFqdEJRVU51UXp0QlFVTkJSeXhWUVVGSlNTeFhRVUZLTEVkQlFXdENVaXhMUVVGTFVTeFhRVUYyUWp0QlFVTkJTaXhWUVVGSlJTeFhRVUZLTEVkQlFXdENUaXhMUVVGTFRTeFhRVUYyUWp0QlFVTkJSaXhWUVVGSlN5eFRRVUZLTEVkQlFXZENWQ3hMUVVGTFV5eFRRVUZ5UWp0QlFVTkJUQ3hWUVVGSlRTeFRRVUZLTEVkQlFXZENWaXhMUVVGTFZTeFRRVUZ5UWp0QlFVTkVMRXRCVGswc1RVRk5RVHRCUVVOTU8wRkJRMEZPTEZWQlFVbEpMRmRCUVVvc1IwRkJhMEpITEZsQlFWbFFMRWRCUVZvc1JVRkJhVUpLTEV0QlFVdFJMRmRCUVhSQ0xFVkJRVzFEVUN4UFFVRlBUeXhYUVVFeFF5eERRVUZzUWp0QlFVTkJTaXhWUVVGSlJTeFhRVUZLTEVkQlFXdENTeXhaUVVGWlVDeEhRVUZhTEVWQlFXbENTaXhMUVVGTFRTeFhRVUYwUWl4RlFVRnRRMHdzVDBGQlQwc3NWMEZCTVVNc1EwRkJiRUk3UVVGRFFVWXNWVUZCU1Vzc1UwRkJTaXhIUVVGblFrVXNXVUZCV1ZBc1IwRkJXaXhGUVVGcFFrb3NTMEZCUzFNc1UwRkJkRUlzUlVGQmFVTlNMRTlCUVU5UkxGTkJRWGhETEVOQlFXaENPMEZCUTBGTUxGVkJRVWxOTEZOQlFVb3NSMEZCWjBKRExGbEJRVmxRTEVkQlFWb3NSVUZCYVVKS0xFdEJRVXRWTEZOQlFYUkNMRVZCUVdsRFZDeFBRVUZQVXl4VFFVRjRReXhEUVVGb1FqdEJRVU5FTzBGQlEwWTdPMEZCUlVST0xFMUJRVWxSTEV0QlFVb3NSMEZCV1N4RlFVRmFPenRCUVVWQkxFMUJRVWxETEZsQlFWa3NRMEZCYUVJN1FVRkJRU3hOUVVOSlF5eGpRVUZqTEVOQlJHeENPMEZCUVVFc1RVRkZTVU1zWVVGQllTeERRVVpxUWp0QlFVRkJMRTFCUjBsRExHVkJRV1VzUTBGSWJrSTdPMEZCUzBFc1UwRkJUMGdzV1VGQldXSXNTMEZCUzFrc1MwRkJUQ3hEUVVGWFN5eE5RVUYyUWl4SlFVRnBRMGdzWTBGQlkySXNUMEZCVDFjc1MwRkJVQ3hEUVVGaFN5eE5RVUZ1UlN4RlFVRXlSVHRCUVVONlJTeFJRVUZKUXl4alFVRmpiRUlzUzBGQlMxa3NTMEZCVEN4RFFVRlhReXhUUVVGWUxFdEJRWGxDTEVWQlFVTk5MRlZCUVZWRExGRkJRVmdzUlVGQk0wTTdRVUZCUVN4UlFVTkpReXhuUWtGQlowSndRaXhQUVVGUFZ5eExRVUZRTEVOQlFXRkZMRmRCUVdJc1MwRkJOa0lzUlVGQlEwc3NWVUZCVlVNc1VVRkJXQ3hGUVVScVJEczdRVUZIUVN4UlFVRkpSU3hYUVVGWFNpeFhRVUZZTEVWQlFYZENSeXhoUVVGNFFpeERRVUZLTEVWQlFUUkRPMEZCUXpGRE8wRkJRMEZxUWl4VlFVRkpVU3hMUVVGS0xFTkJRVlZYTEVsQlFWWXNRMEZCWlVNc1ZVRkJWVTRzVjBGQlZpeEZRVUYxUWtnc1ZVRkJka0lzUTBGQlpqdEJRVU5CUmp0QlFVTkJSeXh6UWtGQlowSkZMRmxCUVZsd1FpeFJRVUZhTEVkQlFYVkNiMElzV1VGQldYSkNMRkZCUVc1RU8wRkJRMFFzUzBGTVJDeE5RVXRQTEVsQlFVbDVRaXhYUVVGWFJDeGhRVUZZTEVWQlFUQkNTQ3hYUVVFeFFpeERRVUZLTEVWQlFUUkRPMEZCUTJwRU8wRkJRMEZrTEZWQlFVbFJMRXRCUVVvc1EwRkJWVmNzU1VGQlZpeERRVUZsUXl4VlFVRlZTQ3hoUVVGV0xFVkJRWGxDVEN4WlFVRjZRaXhEUVVGbU8wRkJRMEZHTzBGQlEwRkRMRzlDUVVGalRTeGpRVUZqZGtJc1VVRkJaQ3hIUVVGNVFuVkNMR05CUVdONFFpeFJRVUZ5UkR0QlFVTkVMRXRCVEUwc1RVRkxRVHRCUVVOTU8wRkJRMEVzVlVGQlNUUkNMR0ZCUVdFN1FVRkRaazRzYTBKQlFWVlBMRXRCUVV0RExFZEJRVXdzUTBGQlUxUXNXVUZCV1VNc1VVRkJja0lzUlVGQkswSkZMR05CUVdOR0xGRkJRVGRETEVOQlJFczdRVUZGWm5SQ0xHdENRVUZWTEVOQlJrczdRVUZIWml0Q0xHdENRVUZWUml4TFFVRkxReXhIUVVGTUxFTkJRVk5VTEZsQlFWbFZMRkZCUVZvc1IwRkJkVUppTEZWQlFXaERMRVZCUVRSRFRTeGpRVUZqUml4UlFVRmtMRWRCUVhsQ1NDeFpRVUZ5UlN4RFFVaExPMEZCU1dac1FpeHJRa0ZCVlN4RFFVcExPMEZCUzJaR0xHVkJRVTg3UVVGTVVTeFBRVUZxUWp0QlFVOUJhVU1zYVVKQlFWZEtMRlZCUVZnc1JVRkJkVUpRTEZsQlFWbERMRkZCUVc1RExFVkJRVFpEUkN4WlFVRlpkRUlzUzBGQmVrUXNSVUZCWjBWNVFpeGpRVUZqUml4UlFVRTVSU3hGUVVGM1JrVXNZMEZCWTNwQ0xFdEJRWFJITzBGQlEwRnJRanRCUVVOQlJEczdRVUZGUVZRc1ZVRkJTVkVzUzBGQlNpeERRVUZWVnl4SlFVRldMRU5CUVdWRkxGVkJRV1k3UVVGRFJEdEJRVU5HT3p0QlFVVkVMRk5CUVU5eVFpeEhRVUZRTzBGQlEwUTdPMEZCUlVRc1UwRkJVMFFzVTBGQlZDeERRVUZ0UWpKQ0xFdEJRVzVDTEVWQlFUQkNOVUlzU1VGQk1VSXNSVUZCWjBNN1FVRkRPVUlzVFVGQlNTeFBRVUZQTkVJc1MwRkJVQ3hMUVVGcFFpeFJRVUZ5UWl4RlFVRXJRanRCUVVNM1FpeFJRVUZKTEU5QlFVOURMRWxCUVZBc1EwRkJXVVFzUzBGQldpeExRVUYxUWl4WFFVRlhReXhKUVVGWUxFTkJRV2RDUkN4TFFVRm9RaXhEUVVFelFpeEZRVUZ2UkR0QlFVTnNSQ3hoUVVGUExIbEZRVUZYUVN4TFFVRllMRVZCUVd0Q0xFTkJRV3hDTzBGQlFWQTdRVUZEUkRzN1FVRkZSQ3hSUVVGSkxFTkJRVU0xUWl4SlFVRk1MRVZCUVZjN1FVRkRWQ3haUVVGTkxFbEJRVWs0UWl4TFFVRktMRU5CUVZVc2EwUkJRVllzUTBGQlRqdEJRVU5FTzBGQlEwUXNWMEZCVHl3clJVRkJaMEpxUXl4VFFVRm9RaXhGUVVFeVFrRXNVMEZCTTBJc1JVRkJjME5ITEVsQlFYUkRMRVZCUVRSRE5FSXNTMEZCTlVNN1FVRkJVRHRCUVVORU96dEJRVVZFTEZOQlFVOUJMRXRCUVZBN1FVRkRSRHM3UVVGRlJDeFRRVUZUZGtJc1pVRkJWQ3hEUVVGNVFqQkNMRXRCUVhwQ0xFVkJRV2RETzBGQlF6bENMRk5CUVU5QkxFMUJRVTB6UWl4WFFVRk9MRWxCUVhGQ01rSXNUVUZCVFROQ0xGZEJRVTRzUzBGQmMwSXlRaXhOUVVGTmVrSXNWMEZCZUVRN1FVRkRSRHM3UVVGRlJDeFRRVUZUUnl4WFFVRlVMRU5CUVhGQ1RpeExRVUZ5UWl4RlFVRTBRa3dzU1VGQk5VSXNSVUZCYTBORExFMUJRV3hETEVWQlFUQkRPMEZCUTNoRExFMUJRVWxFTEZOQlFWTkRMRTFCUVdJc1JVRkJjVUk3UVVGRGJrSXNWMEZCVDBRc1NVRkJVRHRCUVVORUxFZEJSa1FzVFVGRlR6dEJRVU5NU3l4VlFVRk5Oa0lzVVVGQlRpeEhRVUZwUWl4SlFVRnFRanRCUVVOQkxGZEJRVThzUlVGQlEyeERMRlZCUVVRc1JVRkJUME1zWTBGQlVDeEZRVUZRTzBGQlEwUTdRVUZEUmpzN1FVRkZSQ3hUUVVGVGNVSXNWVUZCVkN4RFFVRnZRbE1zU1VGQmNFSXNSVUZCTUVKSkxFdEJRVEZDTEVWQlFXbERPMEZCUXk5Q0xGTkJRVTlLTEV0QlFVdGFMRkZCUVV3c1IwRkJaMEpuUWl4TlFVRk5hRUlzVVVGQmRFSXNTVUZEUkZrc1MwRkJTMW9zVVVGQlRDeEhRVUZuUWxrc1MwRkJTMnhETEZGQlFYUkNMRWRCUVd0RGMwTXNUVUZCVFdoQ0xGRkJSRGRETzBGQlJVUTdPMEZCUlVRc1UwRkJVMHNzVTBGQlZDeERRVUZ0UWpsQ0xFbEJRVzVDTEVWQlFYbENNRU1zVFVGQmVrSXNSVUZCYVVNN1FVRkRMMElzVTBGQlR6dEJRVU5NYWtJc1kwRkJWWHBDTEV0QlFVdDVRaXhSUVVSV0xFVkJRMjlDZEVJc1ZVRkJWVWdzUzBGQlMwY3NVVUZFYmtNN1FVRkZUQ3RDTEdOQlFWVnNReXhMUVVGTGEwTXNVVUZCVEN4SFFVRm5RbEVzVFVGR2NrSXNSVUZGTmtKMFF5eFZRVUZWU2l4TFFVRkxTU3hSUVVZMVF6dEJRVWRNUml4WFFVRlBSaXhMUVVGTFJUdEJRVWhRTEVkQlFWQTdRVUZMUkRzN1FVRkZSQ3hUUVVGVGFVTXNWVUZCVkN4RFFVRnZRbTVETEVsQlFYQkNMRVZCUVRCQ2NVSXNWVUZCTVVJc1JVRkJjME56UWl4VFFVRjBReXhGUVVGcFJFTXNWMEZCYWtRc1JVRkJPRVJETEZWQlFUbEVMRVZCUVRCRk8wRkJRM2hGTzBGQlEwRTdRVUZEUVN4TlFVRkpka01zVDBGQlR5eEZRVUZEYjBNc1VVRkJVWEpDTEZWQlFWUXNSVUZCY1VKdVFpeFBRVUZQZVVNc1UwRkJOVUlzUlVGQmRVTm9ReXhQUVVGUExFTkJRVGxETEVWQlFWZzdRVUZCUVN4TlFVTkpiVU1zVVVGQlVTeEZRVUZEU2l4UlFVRlJSU3hYUVVGVUxFVkJRWE5DTVVNc1QwRkJUekpETEZWQlFUZENMRVZCUVhsRGJFTXNUMEZCVHl4RFFVRm9SQ3hGUVVSYU96dEJRVWRCTzBGQlEwRnZReXhuUWtGQll5OURMRWxCUVdRc1JVRkJiMEpOTEVsQlFYQkNMRVZCUVRCQ2QwTXNTMEZCTVVJN1FVRkRRVU1zWjBKQlFXTXZReXhKUVVGa0xFVkJRVzlDT0VNc1MwRkJjRUlzUlVGQk1rSjRReXhKUVVFelFqczdRVUZGUVR0QlFVTkJMRk5CUVU5QkxFdEJRVXRMTEV0QlFVd3NSMEZCWVV3c1MwRkJTMG9zUzBGQlRDeERRVUZYY1VJc1RVRkJlRUlzU1VGQmEwTjFRaXhOUVVGTmJrTXNTMEZCVGl4SFFVRmpiVU1zVFVGQlRUVkRMRXRCUVU0c1EwRkJXWEZDTEUxQlFXNUZMRVZCUVRKRk8wRkJRM3BGTEZGQlFVbERMR05CUVdOc1FpeExRVUZMU2l4TFFVRk1MRU5CUVZkSkxFdEJRVXRMTEV0QlFXaENMRU5CUVd4Q08wRkJRVUVzVVVGRFNYRkRMR1ZCUVdWR0xFMUJRVTAxUXl4TFFVRk9MRU5CUVZrMFF5eE5RVUZOYmtNc1MwRkJiRUlzUTBGRWJrSTdPMEZCUjBFc1VVRkJTU3hEUVVGRFlTeFpRVUZaTEVOQlFWb3NUVUZCYlVJc1IwRkJia0lzU1VGQk1FSkJMRmxCUVZrc1EwRkJXaXhOUVVGdFFpeEhRVUU1UXl4TlFVTkpkMElzWVVGQllTeERRVUZpTEUxQlFXOUNMRWRCUVhCQ0xFbEJRVEpDUVN4aFFVRmhMRU5CUVdJc1RVRkJiMElzUjBGRWJrUXNRMEZCU2l4RlFVTTJSRHRCUVVNelJEdEJRVU5CUXl4dFFrRkJZV3BFTEVsQlFXSXNSVUZCYlVKTkxFbEJRVzVDTEVWQlFYbENkME1zUzBGQmVrSTdRVUZEUkN4TFFVcEVMRTFCU1U4c1NVRkJTWFJDTEZsQlFWa3NRMEZCV2l4TlFVRnRRaXhIUVVGdVFpeEpRVUV3UW5kQ0xHRkJRV0VzUTBGQllpeE5RVUZ2UWl4SFFVRnNSQ3hGUVVGMVJEdEJRVUZCT3p0QlFVRkJMRGhDUVVNMVJEdEJRVU5CTERCRlFVRkxPVU1zUzBGQlRDeEZRVUZYTWtJc1NVRkJXQ3cwVEVGQmIwSnhRaXhqUVVGak5VTXNTVUZCWkN4RFFVRndRanRCUVVORUxFdEJTRTBzVFVGSFFTeEpRVUZKTUVNc1lVRkJZU3hEUVVGaUxFMUJRVzlDTEVkQlFYQkNMRWxCUVRKQ2VFSXNXVUZCV1N4RFFVRmFMRTFCUVcxQ0xFZEJRV3hFTEVWQlFYVkVPMEZCUVVFN08wRkJRVUVzT0VKQlF6VkVPMEZCUTBFc01rVkJRVXQwUWl4TFFVRk1MRVZCUVZjeVFpeEpRVUZZTERaTVFVRnZRbkZDTEdOQlFXTktMRXRCUVdRc1EwRkJjRUk3UVVGRFJDeExRVWhOTEUxQlIwRXNTVUZCU1hSQ0xGbEJRVmtzUTBGQldpeE5RVUZ0UWl4SFFVRnVRaXhKUVVFd1FuZENMR0ZCUVdFc1EwRkJZaXhOUVVGdlFpeEhRVUZzUkN4RlFVRjFSRHRCUVVNMVJEdEJRVU5CUnl4alFVRlJia1FzU1VGQlVpeEZRVUZqVFN4SlFVRmtMRVZCUVc5Q2QwTXNTMEZCY0VJN1FVRkRSQ3hMUVVoTkxFMUJSMEVzU1VGQlNVVXNZVUZCWVN4RFFVRmlMRTFCUVc5Q0xFZEJRWEJDTEVsQlFUSkNlRUlzV1VGQldTeERRVUZhTEUxQlFXMUNMRWRCUVd4RUxFVkJRWFZFTzBGQlF6VkVPMEZCUTBFeVFpeGpRVUZSYmtRc1NVRkJVaXhGUVVGak9FTXNTMEZCWkN4RlFVRnhRbmhETEVsQlFYSkNMRVZCUVRKQ0xFbEJRVE5DTzBGQlEwUXNTMEZJVFN4TlFVZEJMRWxCUVVsclFpeG5Ra0ZCWjBKM1FpeFpRVUZ3UWl4RlFVRnJRenRCUVVOMlF6dEJRVU5CYUVRc1YwRkJTMFVzUzBGQlRDeERRVUZYTWtJc1NVRkJXQ3hEUVVGblFrd3NWMEZCYUVJN1FVRkRRV3hDTEZkQlFVdExMRXRCUVV3N1FVRkRRVzFETEZsQlFVMXVReXhMUVVGT08wRkJRMFFzUzBGTVRTeE5RVXRCTzBGQlEwdzdRVUZEUVRaQ0xHVkJRVk40UXl4SlFVRlVMRVZCUVdWclJDeGpRVUZqTlVNc1NVRkJaQ3hEUVVGbUxFVkJRVzlETkVNc1kwRkJZMG9zUzBGQlpDeERRVUZ3UXp0QlFVTkVPMEZCUTBZN08wRkJSVVE3UVVGRFFVMHNhVUpCUVdWd1JDeEpRVUZtTEVWQlFYRkNUU3hKUVVGeVFqdEJRVU5CT0VNc2FVSkJRV1Z3UkN4SlFVRm1MRVZCUVhGQ09FTXNTMEZCY2tJN08wRkJSVUZvUkN4blFrRkJZMFVzU1VGQlpEdEJRVU5FT3p0QlFVVkVMRk5CUVZOcFJDeFpRVUZVTEVOQlFYTkNha1FzU1VGQmRFSXNSVUZCTkVKTkxFbEJRVFZDTEVWQlFXdERkME1zUzBGQmJFTXNSVUZCZVVNN1FVRkRka01zVFVGQlNVOHNXVUZCV1Vnc1kwRkJZelZETEVsQlFXUXNRMEZCYUVJN1FVRkJRU3hOUVVOSlowUXNaVUZCWlVvc1kwRkJZMG9zUzBGQlpDeERRVVJ1UWpzN1FVRkhRU3hOUVVGSlV5eFhRVUZYUml4VFFVRllMRXRCUVhsQ1JTeFhRVUZYUkN4WlFVRllMRU5CUVRkQ0xFVkJRWFZFTzBGQlEzSkVPMEZCUTBFc1VVRkJTU3c0UlVGQlowSkVMRk5CUVdoQ0xFVkJRVEpDUXl4WlFVRXpRaXhMUVVOSFJTeHRRa0ZCYlVKV0xFdEJRVzVDTEVWQlFUQkNUeXhUUVVFeFFpeEZRVUZ4UTBFc1ZVRkJWVGxDTEUxQlFWWXNSMEZCYlVJclFpeGhRVUZoTDBJc1RVRkJja1VzUTBGRVVDeEZRVU54Ump0QlFVRkJPenRCUVVGQkxEWkNRVU51Uml4elJVRkJTM0pDTEV0QlFVd3NSVUZCVnpKQ0xFbEJRVmdzTmt4QlFXOUNkMElzVTBGQmNFSTdRVUZEUVR0QlFVTkVMRXRCU2tRc1RVRkpUeXhKUVVGSkxEaEZRVUZuUWtNc1dVRkJhRUlzUlVGQk9FSkVMRk5CUVRsQ0xFdEJRMHBITEcxQ1FVRnRRbXhFTEVsQlFXNUNMRVZCUVhsQ1owUXNXVUZCZWtJc1JVRkJkVU5CTEdGQlFXRXZRaXhOUVVGaUxFZEJRWE5DT0VJc1ZVRkJWVGxDTEUxQlFYWkZMRU5CUkVFc1JVRkRaMFk3UVVGQlFUczdRVUZCUVN3MlFrRkRja1lzYzBWQlFVdHlRaXhMUVVGTUxFVkJRVmN5UWl4SlFVRllMRFpNUVVGdlFubENMRmxCUVhCQ08wRkJRMEU3UVVGRFJEdEJRVU5HTEVkQldFUXNUVUZYVHl4SlFVRkpMSGxGUVVGWFJDeFRRVUZZTEVWQlFYTkNReXhaUVVGMFFpeERRVUZLTEVWQlFYbERPMEZCUVVFN08wRkJRVUVzTWtKQlF6bERMSE5GUVVGTGNFUXNTMEZCVEN4RlFVRlhNa0lzU1VGQldDdzJURUZCYjBKM1FpeFRRVUZ3UWp0QlFVTkJPMEZCUTBRN08wRkJSVVJpTEZkQlFWTjRReXhKUVVGVUxFVkJRV1Z4UkN4VFFVRm1MRVZCUVRCQ1F5eFpRVUV4UWp0QlFVTkVPenRCUVVWRUxGTkJRVk5JTEU5QlFWUXNRMEZCYVVKdVJDeEpRVUZxUWl4RlFVRjFRazBzU1VGQmRrSXNSVUZCTmtKM1F5eExRVUUzUWl4RlFVRnZRMWNzU1VGQmNFTXNSVUZCTUVNN1FVRkRlRU1zVFVGQlNVb3NXVUZCV1Vnc1kwRkJZelZETEVsQlFXUXNRMEZCYUVJN1FVRkJRU3hOUVVOSlowUXNaVUZCWlVrc1pVRkJaVm9zUzBGQlppeEZRVUZ6UWs4c1UwRkJkRUlzUTBGRWJrSTdRVUZGUVN4TlFVRkpReXhoUVVGaFN5eE5RVUZxUWl4RlFVRjVRanRCUVVGQk96dEJRVUZCTERKQ1FVTjJRaXh6UlVGQlMzcEVMRXRCUVV3c1JVRkJWekpDTEVsQlFWZ3NOa3hCUVc5Q2VVSXNZVUZCWVVzc1RVRkJha003UVVGRFJDeEhRVVpFTEUxQlJVODdRVUZEVEc1Q0xHRkJRVk40UXl4SlFVRlVMRVZCUVdWNVJDeFBRVUZQU0N4WlFVRlFMRWRCUVhOQ1JDeFRRVUZ5UXl4RlFVRm5SRWtzVDBGQlQwb3NVMEZCVUN4SFFVRnRRa01zV1VGQmJrVTdRVUZEUkR0QlFVTkdPenRCUVVWRUxGTkJRVk5rTEZGQlFWUXNRMEZCYTBKNFF5eEpRVUZzUWl4RlFVRjNRazBzU1VGQmVFSXNSVUZCT0VKM1F5eExRVUU1UWl4RlFVRnhRenRCUVVOdVF6bERMRTlCUVV0M1F5eFJRVUZNTEVkQlFXZENMRWxCUVdoQ08wRkJRMEY0UXl4UFFVRkxSU3hMUVVGTUxFTkJRVmN5UWl4SlFVRllMRU5CUVdkQ08wRkJRMlJYTEdOQlFWVXNTVUZFU1R0QlFVVmtiRU1zVlVGQlRVRXNTVUZHVVR0QlFVZGtReXhaUVVGUmRVTTdRVUZJVFN4SFFVRm9RanRCUVV0RU96dEJRVVZFTEZOQlFWTkRMR0ZCUVZRc1EwRkJkVUl2UXl4SlFVRjJRaXhGUVVFMlFqUkVMRTFCUVRkQ0xFVkJRWEZEWkN4TFFVRnlReXhGUVVFMFF6dEJRVU14UXl4VFFVRlBZeXhQUVVGUGJFSXNUVUZCVUN4SFFVRm5Ra2tzVFVGQlRVb3NUVUZCZEVJc1NVRkJaME5yUWl4UFFVRlBha1FzUzBGQlVDeEhRVUZsYVVRc1QwRkJUekZFTEV0QlFWQXNRMEZCWVhGQ0xFMUJRVzVGTEVWQlFUSkZPMEZCUTNwRkxGRkJRVWx6UXl4UFFVRlBSQ3hQUVVGUE1VUXNTMEZCVUN4RFFVRmhNRVFzVDBGQlQycEVMRXRCUVZBc1JVRkJZaXhEUVVGWU8wRkJRMEZZTEZOQlFVdEZMRXRCUVV3c1EwRkJWekpDTEVsQlFWZ3NRMEZCWjBKblF5eEpRVUZvUWp0QlFVTkJSQ3hYUVVGUGJFSXNUVUZCVUR0QlFVTkVPMEZCUTBZN1FVRkRSQ3hUUVVGVFZTeGpRVUZVTEVOQlFYZENjRVFzU1VGQmVFSXNSVUZCT0VJMFJDeE5RVUU1UWl4RlFVRnpRenRCUVVOd1F5eFRRVUZQUVN4UFFVRlBha1FzUzBGQlVDeEhRVUZsYVVRc1QwRkJUekZFTEV0QlFWQXNRMEZCWVhGQ0xFMUJRVzVETEVWQlFUSkRPMEZCUTNwRExGRkJRVWx6UXl4UFFVRlBSQ3hQUVVGUE1VUXNTMEZCVUN4RFFVRmhNRVFzVDBGQlQycEVMRXRCUVZBc1JVRkJZaXhEUVVGWU8wRkJRMEZZTEZOQlFVdEZMRXRCUVV3c1EwRkJWekpDTEVsQlFWZ3NRMEZCWjBKblF5eEpRVUZvUWp0QlFVTkVPMEZCUTBZN08wRkJSVVFzVTBGQlUxZ3NZVUZCVkN4RFFVRjFRbGtzUzBGQmRrSXNSVUZCT0VJN1FVRkROVUlzVFVGQlNYQkVMRTFCUVUwc1JVRkJWanRCUVVGQkxFMUJRMGx4UkN4WlFVRlpSQ3hOUVVGTk5VUXNTMEZCVGl4RFFVRlpORVFzVFVGQlRXNUVMRXRCUVd4Q0xFVkJRWGxDTEVOQlFYcENMRU5CUkdoQ08wRkJSVUVzVTBGQlQyMUVMRTFCUVUxdVJDeExRVUZPTEVkQlFXTnRSQ3hOUVVGTk5VUXNTMEZCVGl4RFFVRlpjVUlzVFVGQmFrTXNSVUZCZVVNN1FVRkRka01zVVVGQlNYTkRMRTlCUVU5RExFMUJRVTAxUkN4TFFVRk9MRU5CUVZrMFJDeE5RVUZOYmtRc1MwRkJiRUlzUTBGQldEczdRVUZGUVR0QlFVTkJMRkZCUVVsdlJDeGpRVUZqTEVkQlFXUXNTVUZCY1VKR0xFdEJRVXNzUTBGQlRDeE5RVUZaTEVkQlFYSkRMRVZCUVRCRE8wRkJRM2hEUlN4clFrRkJXU3hIUVVGYU8wRkJRMFE3TzBGQlJVUXNVVUZCU1VFc1kwRkJZMFlzUzBGQlN5eERRVUZNTEVOQlFXeENMRVZCUVRKQ08wRkJRM3BDYmtRc1ZVRkJTVzFDTEVsQlFVb3NRMEZCVTJkRExFbEJRVlE3UVVGRFFVTXNXVUZCVFc1RUxFdEJRVTQ3UVVGRFJDeExRVWhFTEUxQlIwODdRVUZEVER0QlFVTkVPMEZCUTBZN08wRkJSVVFzVTBGQlQwUXNSMEZCVUR0QlFVTkVPMEZCUTBRc1UwRkJVMmRFTEdOQlFWUXNRMEZCZDBKSkxFdEJRWGhDTEVWQlFTdENSU3haUVVFdlFpeEZRVUUyUXp0QlFVTXpReXhOUVVGSlF5eFZRVUZWTEVWQlFXUTdRVUZCUVN4TlFVTkpUaXhUUVVGVExFVkJSR0k3UVVGQlFTeE5RVVZKVHl4aFFVRmhMRU5CUm1wQ08wRkJRVUVzVFVGSFNVTXNhVUpCUVdsQ0xFdEJTSEpDTzBGQlFVRXNUVUZKU1VNc1lVRkJZU3hMUVVwcVFqdEJRVXRCTEZOQlFVOUdMR0ZCUVdGR0xHRkJRV0Y2UXl4TlFVRXhRaXhKUVVORmRVTXNUVUZCVFc1RUxFdEJRVTRzUjBGQlkyMUVMRTFCUVUwMVJDeExRVUZPTEVOQlFWbHhRaXhOUVVSdVF5eEZRVU15UXp0QlFVTjZReXhSUVVGSk9FTXNVMEZCVTFBc1RVRkJUVFZFTEV0QlFVNHNRMEZCV1RSRUxFMUJRVTF1UkN4TFFVRnNRaXhEUVVGaU8wRkJRVUVzVVVGRFNUSkVMRkZCUVZGT0xHRkJRV0ZGTEZWQlFXSXNRMEZFV2pzN1FVRkhRVHRCUVVOQkxGRkJRVWxKTEUxQlFVMHNRMEZCVGl4TlFVRmhMRWRCUVdwQ0xFVkJRWE5DTzBGQlEzQkNPMEZCUTBRN08wRkJSVVJJTEhGQ1FVRnBRa0VzYTBKQlFXdENSU3hQUVVGUExFTkJRVkFzVFVGQll5eEhRVUZxUkRzN1FVRkZRVllzVjBGQlR6bENMRWxCUVZBc1EwRkJXWGxETEV0QlFWbzdRVUZEUVVvN08wRkJSVUU3UVVGRFFUdEJRVU5CTEZGQlFVbEhMRTlCUVU4c1EwRkJVQ3hOUVVGakxFZEJRV3hDTEVWQlFYVkNPMEZCUTNKQ1JDeHRRa0ZCWVN4SlFVRmlPenRCUVVWQkxHRkJRVTlETEU5QlFVOHNRMEZCVUN4TlFVRmpMRWRCUVhKQ0xFVkJRVEJDTzBGQlEzaENTaXhuUWtGQlVYQkRMRWxCUVZJc1EwRkJZWGRETEUxQlFXSTdRVUZEUVVFc2FVSkJRVk5RTEUxQlFVMDFSQ3hMUVVGT0xFTkJRVmtzUlVGQlJUUkVMRTFCUVUxdVJDeExRVUZ3UWl4RFFVRlVPMEZCUTBRN1FVRkRSanM3UVVGRlJDeFJRVUZKTWtRc1RVRkJUVU1zVFVGQlRpeERRVUZoTEVOQlFXSXNUVUZCYjBKR0xFOUJRVTlGTEUxQlFWQXNRMEZCWXl4RFFVRmtMRU5CUVhoQ0xFVkJRVEJETzBGQlEzaERUaXhqUVVGUmNFTXNTVUZCVWl4RFFVRmhkME1zVFVGQllqdEJRVU5CVUN4WlFVRk5ia1FzUzBGQlRqdEJRVU5FTEV0QlNFUXNUVUZIVHp0QlFVTk1lVVFzYlVKQlFXRXNTVUZCWWp0QlFVTkVPMEZCUTBZN08wRkJSVVFzVFVGQlNTeERRVUZEU2l4aFFVRmhSU3hWUVVGaUxFdEJRVFJDTEVWQlFUZENMRVZCUVdsRExFTkJRV3BETEUxQlFYZERMRWRCUVhoRExFbEJRMGRETEdOQlJGQXNSVUZEZFVJN1FVRkRja0pETEdsQ1FVRmhMRWxCUVdJN1FVRkRSRHM3UVVGRlJDeE5RVUZKUVN4VlFVRktMRVZCUVdkQ08wRkJRMlFzVjBGQlQwZ3NUMEZCVUR0QlFVTkVPenRCUVVWRUxGTkJRVTlETEdGQlFXRkdMR0ZCUVdGNlF5eE5RVUZxUXl4RlFVRjVRenRCUVVOMlEyOURMRmRCUVU4NVFpeEpRVUZRTEVOQlFWbHRReXhoUVVGaFJTeFpRVUZpTEVOQlFWbzdRVUZEUkRzN1FVRkZSQ3hUUVVGUE8wRkJRMHhRTEd0Q1FVUkxPMEZCUlV4Tk8wRkJSa3NzUjBGQlVEdEJRVWxFT3p0QlFVVkVMRk5CUVZOV0xGVkJRVlFzUTBGQmIwSlZMRTlCUVhCQ0xFVkJRVFpDTzBGQlF6TkNMRk5CUVU5QkxGRkJRVkZQTEUxQlFWSXNRMEZCWlN4VlFVRlRReXhKUVVGVUxFVkJRV1ZLTEUxQlFXWXNSVUZCZFVJN1FVRkRNME1zVjBGQlQwa3NVVUZCVVVvc1QwRkJUeXhEUVVGUUxFMUJRV01zUjBGQk4wSTdRVUZEUkN4SFFVWk5MRVZCUlVvc1NVRkdTU3hEUVVGUU8wRkJSMFE3UVVGRFJDeFRRVUZUWWl4clFrRkJWQ3hEUVVFMFFrMHNTMEZCTlVJc1JVRkJiVU5aTEdGQlFXNURMRVZCUVd0RVF5eExRVUZzUkN4RlFVRjVSRHRCUVVOMlJDeFBRVUZMTEVsQlFVbERMRWxCUVVrc1EwRkJZaXhGUVVGblFrRXNTVUZCU1VRc1MwRkJjRUlzUlVGQk1rSkRMRWRCUVROQ0xFVkJRV2RETzBGQlF6bENMRkZCUVVsRExHZENRVUZuUWtnc1kwRkJZMEVzWTBGQlkyNUVMRTFCUVdRc1IwRkJkVUp2UkN4TFFVRjJRaXhIUVVFclFrTXNRMEZCTjBNc1JVRkJaMFJNTEUxQlFXaEVMRU5CUVhWRUxFTkJRWFpFTEVOQlFYQkNPMEZCUTBFc1VVRkJTVlFzVFVGQlRUVkVMRXRCUVU0c1EwRkJXVFJFTEUxQlFVMXVSQ3hMUVVGT0xFZEJRV05wUlN4RFFVRXhRaXhOUVVGcFF5eE5RVUZOUXl4aFFVRXpReXhGUVVFd1JEdEJRVU40UkN4aFFVRlBMRXRCUVZBN1FVRkRSRHRCUVVOR096dEJRVVZFWml4UlFVRk5ia1FzUzBGQlRpeEpRVUZsWjBVc1MwRkJaanRCUVVOQkxGTkJRVThzU1VGQlVEdEJRVU5FT3p0QlFVVkVMRk5CUVZNeFJTeHRRa0ZCVkN4RFFVRTJRa01zUzBGQk4wSXNSVUZCYjBNN1FVRkRiRU1zVFVGQlNVTXNWMEZCVnl4RFFVRm1PMEZCUTBFc1RVRkJTVU1zVjBGQlZ5eERRVUZtT3p0QlFVVkJSaXhSUVVGTk5FVXNUMEZCVGl4RFFVRmpMRlZCUVZOcVFpeEpRVUZVTEVWQlFXVTdRVUZETTBJc1VVRkJTU3hQUVVGUFFTeEpRVUZRTEV0QlFXZENMRkZCUVhCQ0xFVkJRVGhDTzBGQlF6VkNMRlZCUVVsclFpeFZRVUZWT1VVc2IwSkJRVzlDTkVRc1MwRkJTM1pFTEVsQlFYcENMRU5CUVdRN1FVRkRRU3hWUVVGSk1FVXNZVUZCWVM5RkxHOUNRVUZ2UWpSRUxFdEJRVXQwUkN4TlFVRjZRaXhEUVVGcVFqczdRVUZGUVN4VlFVRkpTaXhoUVVGaFJTeFRRVUZxUWl4RlFVRTBRanRCUVVNeFFpeFpRVUZKTUVVc1VVRkJVVFZGTEZGQlFWSXNTMEZCY1VJMlJTeFhRVUZYTjBVc1VVRkJjRU1zUlVGQk9FTTdRVUZETlVOQkxITkNRVUZaTkVVc1VVRkJVVFZGTEZGQlFYQkNPMEZCUTBRc1UwRkdSQ3hOUVVWUE8wRkJRMHhCTEhGQ1FVRlhSU3hUUVVGWU8wRkJRMFE3UVVGRFJqczdRVUZGUkN4VlFVRkpSQ3hoUVVGaFF5eFRRVUZxUWl4RlFVRTBRanRCUVVNeFFpeFpRVUZKTUVVc1VVRkJVVE5GTEZGQlFWSXNTMEZCY1VJMFJTeFhRVUZYTlVVc1VVRkJjRU1zUlVGQk9FTTdRVUZETlVOQkxITkNRVUZaTWtVc1VVRkJVVE5GTEZGQlFYQkNPMEZCUTBRc1UwRkdSQ3hOUVVWUE8wRkJRMHhCTEhGQ1FVRlhReXhUUVVGWU8wRkJRMFE3UVVGRFJqdEJRVU5HTEV0QmJrSkVMRTFCYlVKUE8wRkJRMHdzVlVGQlNVUXNZVUZCWVVNc1UwRkJZaXhMUVVFeVFuZEVMRXRCUVVzc1EwRkJUQ3hOUVVGWkxFZEJRVm9zU1VGQmJVSkJMRXRCUVVzc1EwRkJUQ3hOUVVGWkxFZEJRVEZFTEVOQlFVb3NSVUZCYjBVN1FVRkRiRVY2UkR0QlFVTkVPMEZCUTBRc1ZVRkJTVVFzWVVGQllVVXNVMEZCWWl4TFFVRXlRbmRFTEV0QlFVc3NRMEZCVEN4TlFVRlpMRWRCUVZvc1NVRkJiVUpCTEV0QlFVc3NRMEZCVEN4TlFVRlpMRWRCUVRGRUxFTkJRVW9zUlVGQmIwVTdRVUZEYkVVeFJEdEJRVU5FTzBGQlEwWTdRVUZEUml4SFFUVkNSRHM3UVVFNFFrRXNVMEZCVHl4RlFVRkRRU3hyUWtGQlJDeEZRVUZYUXl4clFrRkJXQ3hGUVVGUU8wRkJRMFFpTENKbWFXeGxJam9pYldWeVoyVXVhbk1pTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKcGJYQnZjblFnZTNOMGNuVmpkSFZ5WldSUVlYUmphSDBnWm5KdmJTQW5MaTlqY21WaGRHVW5PMXh1YVcxd2IzSjBJSHR3WVhKelpWQmhkR05vZlNCbWNtOXRJQ2N1TDNCaGNuTmxKenRjYmx4dWFXMXdiM0owSUh0aGNuSmhlVVZ4ZFdGc0xDQmhjbkpoZVZOMFlYSjBjMWRwZEdoOUlHWnliMjBnSnk0dUwzVjBhV3d2WVhKeVlYa25PMXh1WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWTJGc1kweHBibVZEYjNWdWRDaG9kVzVyS1NCN1hHNGdJR052Ym5OMElIdHZiR1JNYVc1bGN5d2dibVYzVEdsdVpYTjlJRDBnWTJGc1kwOXNaRTVsZDB4cGJtVkRiM1Z1ZENob2RXNXJMbXhwYm1WektUdGNibHh1SUNCcFppQW9iMnhrVEdsdVpYTWdJVDA5SUhWdVpHVm1hVzVsWkNrZ2UxeHVJQ0FnSUdoMWJtc3ViMnhrVEdsdVpYTWdQU0J2YkdSTWFXNWxjenRjYmlBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0JrWld4bGRHVWdhSFZ1YXk1dmJHUk1hVzVsY3p0Y2JpQWdmVnh1WEc0Z0lHbG1JQ2h1WlhkTWFXNWxjeUFoUFQwZ2RXNWtaV1pwYm1Wa0tTQjdYRzRnSUNBZ2FIVnVheTV1WlhkTWFXNWxjeUE5SUc1bGQweHBibVZ6TzF4dUlDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUdSbGJHVjBaU0JvZFc1ckxtNWxkMHhwYm1Wek8xeHVJQ0I5WEc1OVhHNWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQnRaWEpuWlNodGFXNWxMQ0IwYUdWcGNuTXNJR0poYzJVcElIdGNiaUFnYldsdVpTQTlJR3h2WVdSUVlYUmphQ2h0YVc1bExDQmlZWE5sS1R0Y2JpQWdkR2hsYVhKeklEMGdiRzloWkZCaGRHTm9LSFJvWldseWN5d2dZbUZ6WlNrN1hHNWNiaUFnYkdWMElISmxkQ0E5SUh0OU8xeHVYRzRnSUM4dklFWnZjaUJwYm1SbGVDQjNaU0JxZFhOMElHeGxkQ0JwZENCd1lYTnpJSFJvY205MVoyZ2dZWE1nYVhRZ1pHOWxjMjRuZENCb1lYWmxJR0Z1ZVNCdVpXTmxjM05oY25rZ2JXVmhibWx1Wnk1Y2JpQWdMeThnVEdWaGRtbHVaeUJ6WVc1cGRIa2dZMmhsWTJ0eklHOXVJSFJvYVhNZ2RHOGdkR2hsSUVGUVNTQmpiMjV6ZFcxbGNpQjBhR0YwSUcxaGVTQnJibTkzSUcxdmNtVWdZV0p2ZFhRZ2RHaGxYRzRnSUM4dklHMWxZVzVwYm1jZ2FXNGdkR2hsYVhJZ2IzZHVJR052Ym5SbGVIUXVYRzRnSUdsbUlDaHRhVzVsTG1sdVpHVjRJSHg4SUhSb1pXbHljeTVwYm1SbGVDa2dlMXh1SUNBZ0lISmxkQzVwYm1SbGVDQTlJRzFwYm1VdWFXNWtaWGdnZkh3Z2RHaGxhWEp6TG1sdVpHVjRPMXh1SUNCOVhHNWNiaUFnYVdZZ0tHMXBibVV1Ym1WM1JtbHNaVTVoYldVZ2ZId2dkR2hsYVhKekxtNWxkMFpwYkdWT1lXMWxLU0I3WEc0Z0lDQWdhV1lnS0NGbWFXeGxUbUZ0WlVOb1lXNW5aV1FvYldsdVpTa3BJSHRjYmlBZ0lDQWdJQzh2SUU1dklHaGxZV1JsY2lCdmNpQnVieUJqYUdGdVoyVWdhVzRnYjNWeWN5d2dkWE5sSUhSb1pXbHljeUFvWVc1a0lHOTFjbk1nYVdZZ2RHaGxhWEp6SUdSdlpYTWdibTkwSUdWNGFYTjBLVnh1SUNBZ0lDQWdjbVYwTG05c1pFWnBiR1ZPWVcxbElEMGdkR2hsYVhKekxtOXNaRVpwYkdWT1lXMWxJSHg4SUcxcGJtVXViMnhrUm1sc1pVNWhiV1U3WEc0Z0lDQWdJQ0J5WlhRdWJtVjNSbWxzWlU1aGJXVWdQU0IwYUdWcGNuTXVibVYzUm1sc1pVNWhiV1VnZkh3Z2JXbHVaUzV1WlhkR2FXeGxUbUZ0WlR0Y2JpQWdJQ0FnSUhKbGRDNXZiR1JJWldGa1pYSWdQU0IwYUdWcGNuTXViMnhrU0dWaFpHVnlJSHg4SUcxcGJtVXViMnhrU0dWaFpHVnlPMXh1SUNBZ0lDQWdjbVYwTG01bGQwaGxZV1JsY2lBOUlIUm9aV2x5Y3k1dVpYZElaV0ZrWlhJZ2ZId2diV2x1WlM1dVpYZElaV0ZrWlhJN1hHNGdJQ0FnZlNCbGJITmxJR2xtSUNnaFptbHNaVTVoYldWRGFHRnVaMlZrS0hSb1pXbHljeWtwSUh0Y2JpQWdJQ0FnSUM4dklFNXZJR2hsWVdSbGNpQnZjaUJ1YnlCamFHRnVaMlVnYVc0Z2RHaGxhWEp6TENCMWMyVWdiM1Z5YzF4dUlDQWdJQ0FnY21WMExtOXNaRVpwYkdWT1lXMWxJRDBnYldsdVpTNXZiR1JHYVd4bFRtRnRaVHRjYmlBZ0lDQWdJSEpsZEM1dVpYZEdhV3hsVG1GdFpTQTlJRzFwYm1VdWJtVjNSbWxzWlU1aGJXVTdYRzRnSUNBZ0lDQnlaWFF1YjJ4a1NHVmhaR1Z5SUQwZ2JXbHVaUzV2YkdSSVpXRmtaWEk3WEc0Z0lDQWdJQ0J5WlhRdWJtVjNTR1ZoWkdWeUlEMGdiV2x1WlM1dVpYZElaV0ZrWlhJN1hHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQzh2SUVKdmRHZ2dZMmhoYm1kbFpDNHVMaUJtYVdkMWNtVWdhWFFnYjNWMFhHNGdJQ0FnSUNCeVpYUXViMnhrUm1sc1pVNWhiV1VnUFNCelpXeGxZM1JHYVdWc1pDaHlaWFFzSUcxcGJtVXViMnhrUm1sc1pVNWhiV1VzSUhSb1pXbHljeTV2YkdSR2FXeGxUbUZ0WlNrN1hHNGdJQ0FnSUNCeVpYUXVibVYzUm1sc1pVNWhiV1VnUFNCelpXeGxZM1JHYVdWc1pDaHlaWFFzSUcxcGJtVXVibVYzUm1sc1pVNWhiV1VzSUhSb1pXbHljeTV1WlhkR2FXeGxUbUZ0WlNrN1hHNGdJQ0FnSUNCeVpYUXViMnhrU0dWaFpHVnlJRDBnYzJWc1pXTjBSbWxsYkdRb2NtVjBMQ0J0YVc1bExtOXNaRWhsWVdSbGNpd2dkR2hsYVhKekxtOXNaRWhsWVdSbGNpazdYRzRnSUNBZ0lDQnlaWFF1Ym1WM1NHVmhaR1Z5SUQwZ2MyVnNaV04wUm1sbGJHUW9jbVYwTENCdGFXNWxMbTVsZDBobFlXUmxjaXdnZEdobGFYSnpMbTVsZDBobFlXUmxjaWs3WEc0Z0lDQWdmVnh1SUNCOVhHNWNiaUFnY21WMExtaDFibXR6SUQwZ1cxMDdYRzVjYmlBZ2JHVjBJRzFwYm1WSmJtUmxlQ0E5SURBc1hHNGdJQ0FnSUNCMGFHVnBjbk5KYm1SbGVDQTlJREFzWEc0Z0lDQWdJQ0J0YVc1bFQyWm1jMlYwSUQwZ01DeGNiaUFnSUNBZ0lIUm9aV2x5YzA5bVpuTmxkQ0E5SURBN1hHNWNiaUFnZDJocGJHVWdLRzFwYm1WSmJtUmxlQ0E4SUcxcGJtVXVhSFZ1YTNNdWJHVnVaM1JvSUh4OElIUm9aV2x5YzBsdVpHVjRJRHdnZEdobGFYSnpMbWgxYm10ekxteGxibWQwYUNrZ2UxeHVJQ0FnSUd4bGRDQnRhVzVsUTNWeWNtVnVkQ0E5SUcxcGJtVXVhSFZ1YTNOYmJXbHVaVWx1WkdWNFhTQjhmQ0I3YjJ4a1UzUmhjblE2SUVsdVptbHVhWFI1ZlN4Y2JpQWdJQ0FnSUNBZ2RHaGxhWEp6UTNWeWNtVnVkQ0E5SUhSb1pXbHljeTVvZFc1cmMxdDBhR1ZwY25OSmJtUmxlRjBnZkh3Z2UyOXNaRk4wWVhKME9pQkpibVpwYm1sMGVYMDdYRzVjYmlBZ0lDQnBaaUFvYUhWdWEwSmxabTl5WlNodGFXNWxRM1Z5Y21WdWRDd2dkR2hsYVhKelEzVnljbVZ1ZENrcElIdGNiaUFnSUNBZ0lDOHZJRlJvYVhNZ2NHRjBZMmdnWkc5bGN5QnViM1FnYjNabGNteGhjQ0IzYVhSb0lHRnVlU0J2WmlCMGFHVWdiM1JvWlhKekxDQjVZWGt1WEc0Z0lDQWdJQ0J5WlhRdWFIVnVhM011Y0hWemFDaGpiRzl1WlVoMWJtc29iV2x1WlVOMWNuSmxiblFzSUcxcGJtVlBabVp6WlhRcEtUdGNiaUFnSUNBZ0lHMXBibVZKYm1SbGVDc3JPMXh1SUNBZ0lDQWdkR2hsYVhKelQyWm1jMlYwSUNzOUlHMXBibVZEZFhKeVpXNTBMbTVsZDB4cGJtVnpJQzBnYldsdVpVTjFjbkpsYm5RdWIyeGtUR2x1WlhNN1hHNGdJQ0FnZlNCbGJITmxJR2xtSUNob2RXNXJRbVZtYjNKbEtIUm9aV2x5YzBOMWNuSmxiblFzSUcxcGJtVkRkWEp5Wlc1MEtTa2dlMXh1SUNBZ0lDQWdMeThnVkdocGN5QndZWFJqYUNCa2IyVnpJRzV2ZENCdmRtVnliR0Z3SUhkcGRHZ2dZVzU1SUc5bUlIUm9aU0J2ZEdobGNuTXNJSGxoZVM1Y2JpQWdJQ0FnSUhKbGRDNW9kVzVyY3k1d2RYTm9LR05zYjI1bFNIVnVheWgwYUdWcGNuTkRkWEp5Wlc1MExDQjBhR1ZwY25OUFptWnpaWFFwS1R0Y2JpQWdJQ0FnSUhSb1pXbHljMGx1WkdWNEt5czdYRzRnSUNBZ0lDQnRhVzVsVDJabWMyVjBJQ3M5SUhSb1pXbHljME4xY25KbGJuUXVibVYzVEdsdVpYTWdMU0IwYUdWcGNuTkRkWEp5Wlc1MExtOXNaRXhwYm1Wek8xeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0F2THlCUGRtVnliR0Z3TENCdFpYSm5aU0JoY3lCaVpYTjBJSGRsSUdOaGJseHVJQ0FnSUNBZ2JHVjBJRzFsY21kbFpFaDFibXNnUFNCN1hHNGdJQ0FnSUNBZ0lHOXNaRk4wWVhKME9pQk5ZWFJvTG0xcGJpaHRhVzVsUTNWeWNtVnVkQzV2YkdSVGRHRnlkQ3dnZEdobGFYSnpRM1Z5Y21WdWRDNXZiR1JUZEdGeWRDa3NYRzRnSUNBZ0lDQWdJRzlzWkV4cGJtVnpPaUF3TEZ4dUlDQWdJQ0FnSUNCdVpYZFRkR0Z5ZERvZ1RXRjBhQzV0YVc0b2JXbHVaVU4xY25KbGJuUXVibVYzVTNSaGNuUWdLeUJ0YVc1bFQyWm1jMlYwTENCMGFHVnBjbk5EZFhKeVpXNTBMbTlzWkZOMFlYSjBJQ3NnZEdobGFYSnpUMlptYzJWMEtTeGNiaUFnSUNBZ0lDQWdibVYzVEdsdVpYTTZJREFzWEc0Z0lDQWdJQ0FnSUd4cGJtVnpPaUJiWFZ4dUlDQWdJQ0FnZlR0Y2JpQWdJQ0FnSUcxbGNtZGxUR2x1WlhNb2JXVnlaMlZrU0hWdWF5d2diV2x1WlVOMWNuSmxiblF1YjJ4a1UzUmhjblFzSUcxcGJtVkRkWEp5Wlc1MExteHBibVZ6TENCMGFHVnBjbk5EZFhKeVpXNTBMbTlzWkZOMFlYSjBMQ0IwYUdWcGNuTkRkWEp5Wlc1MExteHBibVZ6S1R0Y2JpQWdJQ0FnSUhSb1pXbHljMGx1WkdWNEt5czdYRzRnSUNBZ0lDQnRhVzVsU1c1a1pYZ3JLenRjYmx4dUlDQWdJQ0FnY21WMExtaDFibXR6TG5CMWMyZ29iV1Z5WjJWa1NIVnVheWs3WEc0Z0lDQWdmVnh1SUNCOVhHNWNiaUFnY21WMGRYSnVJSEpsZER0Y2JuMWNibHh1Wm5WdVkzUnBiMjRnYkc5aFpGQmhkR05vS0hCaGNtRnRMQ0JpWVhObEtTQjdYRzRnSUdsbUlDaDBlWEJsYjJZZ2NHRnlZVzBnUFQwOUlDZHpkSEpwYm1jbktTQjdYRzRnSUNBZ2FXWWdLQzllUUVBdmJTNTBaWE4wS0hCaGNtRnRLU0I4ZkNBb0wxNUpibVJsZURvdmJTNTBaWE4wS0hCaGNtRnRLU2twSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUJ3WVhKelpWQmhkR05vS0hCaGNtRnRLVnN3WFR0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JwWmlBb0lXSmhjMlVwSUh0Y2JpQWdJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWduVFhWemRDQndjbTkyYVdSbElHRWdZbUZ6WlNCeVpXWmxjbVZ1WTJVZ2IzSWdjR0Z6Y3lCcGJpQmhJSEJoZEdOb0p5azdYRzRnSUNBZ2ZWeHVJQ0FnSUhKbGRIVnliaUJ6ZEhKMVkzUjFjbVZrVUdGMFkyZ29kVzVrWldacGJtVmtMQ0IxYm1SbFptbHVaV1FzSUdKaGMyVXNJSEJoY21GdEtUdGNiaUFnZlZ4dVhHNGdJSEpsZEhWeWJpQndZWEpoYlR0Y2JuMWNibHh1Wm5WdVkzUnBiMjRnWm1sc1pVNWhiV1ZEYUdGdVoyVmtLSEJoZEdOb0tTQjdYRzRnSUhKbGRIVnliaUJ3WVhSamFDNXVaWGRHYVd4bFRtRnRaU0FtSmlCd1lYUmphQzV1WlhkR2FXeGxUbUZ0WlNBaFBUMGdjR0YwWTJndWIyeGtSbWxzWlU1aGJXVTdYRzU5WEc1Y2JtWjFibU4wYVc5dUlITmxiR1ZqZEVacFpXeGtLR2x1WkdWNExDQnRhVzVsTENCMGFHVnBjbk1wSUh0Y2JpQWdhV1lnS0cxcGJtVWdQVDA5SUhSb1pXbHljeWtnZTF4dUlDQWdJSEpsZEhWeWJpQnRhVzVsTzF4dUlDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUdsdVpHVjRMbU52Ym1ac2FXTjBJRDBnZEhKMVpUdGNiaUFnSUNCeVpYUjFjbTRnZTIxcGJtVXNJSFJvWldseWMzMDdYRzRnSUgxY2JuMWNibHh1Wm5WdVkzUnBiMjRnYUhWdWEwSmxabTl5WlNoMFpYTjBMQ0JqYUdWamF5a2dlMXh1SUNCeVpYUjFjbTRnZEdWemRDNXZiR1JUZEdGeWRDQThJR05vWldOckxtOXNaRk4wWVhKMFhHNGdJQ0FnSmlZZ0tIUmxjM1F1YjJ4a1UzUmhjblFnS3lCMFpYTjBMbTlzWkV4cGJtVnpLU0E4SUdOb1pXTnJMbTlzWkZOMFlYSjBPMXh1ZlZ4dVhHNW1kVzVqZEdsdmJpQmpiRzl1WlVoMWJtc29hSFZ1YXl3Z2IyWm1jMlYwS1NCN1hHNGdJSEpsZEhWeWJpQjdYRzRnSUNBZ2IyeGtVM1JoY25RNklHaDFibXN1YjJ4a1UzUmhjblFzSUc5c1pFeHBibVZ6T2lCb2RXNXJMbTlzWkV4cGJtVnpMRnh1SUNBZ0lHNWxkMU4wWVhKME9pQm9kVzVyTG01bGQxTjBZWEowSUNzZ2IyWm1jMlYwTENCdVpYZE1hVzVsY3pvZ2FIVnVheTV1WlhkTWFXNWxjeXhjYmlBZ0lDQnNhVzVsY3pvZ2FIVnVheTVzYVc1bGMxeHVJQ0I5TzF4dWZWeHVYRzVtZFc1amRHbHZiaUJ0WlhKblpVeHBibVZ6S0doMWJtc3NJRzFwYm1WUFptWnpaWFFzSUcxcGJtVk1hVzVsY3l3Z2RHaGxhWEpQWm1aelpYUXNJSFJvWldseVRHbHVaWE1wSUh0Y2JpQWdMeThnVkdocGN5QjNhV3hzSUdkbGJtVnlZV3hzZVNCeVpYTjFiSFFnYVc0Z1lTQmpiMjVtYkdsamRHVmtJR2gxYm1zc0lHSjFkQ0IwYUdWeVpTQmhjbVVnWTJGelpYTWdkMmhsY21VZ2RHaGxJR052Ym5SbGVIUmNiaUFnTHk4Z2FYTWdkR2hsSUc5dWJIa2diM1psY214aGNDQjNhR1Z5WlNCM1pTQmpZVzRnYzNWalkyVnpjMloxYkd4NUlHMWxjbWRsSUhSb1pTQmpiMjUwWlc1MElHaGxjbVV1WEc0Z0lHeGxkQ0J0YVc1bElEMGdlMjltWm5ObGREb2diV2x1WlU5bVpuTmxkQ3dnYkdsdVpYTTZJRzFwYm1WTWFXNWxjeXdnYVc1a1pYZzZJREI5TEZ4dUlDQWdJQ0FnZEdobGFYSWdQU0I3YjJabWMyVjBPaUIwYUdWcGNrOW1abk5sZEN3Z2JHbHVaWE02SUhSb1pXbHlUR2x1WlhNc0lHbHVaR1Y0T2lBd2ZUdGNibHh1SUNBdkx5QklZVzVrYkdVZ1lXNTVJR3hsWVdScGJtY2dZMjl1ZEdWdWRGeHVJQ0JwYm5ObGNuUk1aV0ZrYVc1bktHaDFibXNzSUcxcGJtVXNJSFJvWldseUtUdGNiaUFnYVc1elpYSjBUR1ZoWkdsdVp5aG9kVzVyTENCMGFHVnBjaXdnYldsdVpTazdYRzVjYmlBZ0x5OGdUbTkzSUdsdUlIUm9aU0J2ZG1WeWJHRndJR052Ym5SbGJuUXVJRk5qWVc0Z2RHaHliM1ZuYUNCaGJtUWdjMlZzWldOMElIUm9aU0JpWlhOMElHTm9ZVzVuWlhNZ1puSnZiU0JsWVdOb0xseHVJQ0IzYUdsc1pTQW9iV2x1WlM1cGJtUmxlQ0E4SUcxcGJtVXViR2x1WlhNdWJHVnVaM1JvSUNZbUlIUm9aV2x5TG1sdVpHVjRJRHdnZEdobGFYSXViR2x1WlhNdWJHVnVaM1JvS1NCN1hHNGdJQ0FnYkdWMElHMXBibVZEZFhKeVpXNTBJRDBnYldsdVpTNXNhVzVsYzF0dGFXNWxMbWx1WkdWNFhTeGNiaUFnSUNBZ0lDQWdkR2hsYVhKRGRYSnlaVzUwSUQwZ2RHaGxhWEl1YkdsdVpYTmJkR2hsYVhJdWFXNWtaWGhkTzF4dVhHNGdJQ0FnYVdZZ0tDaHRhVzVsUTNWeWNtVnVkRnN3WFNBOVBUMGdKeTBuSUh4OElHMXBibVZEZFhKeVpXNTBXekJkSUQwOVBTQW5LeWNwWEc0Z0lDQWdJQ0FnSUNZbUlDaDBhR1ZwY2tOMWNuSmxiblJiTUYwZ1BUMDlJQ2N0SnlCOGZDQjBhR1ZwY2tOMWNuSmxiblJiTUYwZ1BUMDlJQ2NySnlrcElIdGNiaUFnSUNBZ0lDOHZJRUp2ZEdnZ2JXOWthV1pwWldRZ0xpNHVYRzRnSUNBZ0lDQnRkWFIxWVd4RGFHRnVaMlVvYUhWdWF5d2diV2x1WlN3Z2RHaGxhWElwTzF4dUlDQWdJSDBnWld4elpTQnBaaUFvYldsdVpVTjFjbkpsYm5SYk1GMGdQVDA5SUNjckp5QW1KaUIwYUdWcGNrTjFjbkpsYm5SYk1GMGdQVDA5SUNjZ0p5a2dlMXh1SUNBZ0lDQWdMeThnVFdsdVpTQnBibk5sY25SbFpGeHVJQ0FnSUNBZ2FIVnVheTVzYVc1bGN5NXdkWE5vS0M0dUxpQmpiMnhzWldOMFEyaGhibWRsS0cxcGJtVXBLVHRjYmlBZ0lDQjlJR1ZzYzJVZ2FXWWdLSFJvWldseVEzVnljbVZ1ZEZzd1hTQTlQVDBnSnlzbklDWW1JRzFwYm1WRGRYSnlaVzUwV3pCZElEMDlQU0FuSUNjcElIdGNiaUFnSUNBZ0lDOHZJRlJvWldseWN5QnBibk5sY25SbFpGeHVJQ0FnSUNBZ2FIVnVheTVzYVc1bGN5NXdkWE5vS0M0dUxpQmpiMnhzWldOMFEyaGhibWRsS0hSb1pXbHlLU2s3WEc0Z0lDQWdmU0JsYkhObElHbG1JQ2h0YVc1bFEzVnljbVZ1ZEZzd1hTQTlQVDBnSnkwbklDWW1JSFJvWldseVEzVnljbVZ1ZEZzd1hTQTlQVDBnSnlBbktTQjdYRzRnSUNBZ0lDQXZMeUJOYVc1bElISmxiVzkyWldRZ2IzSWdaV1JwZEdWa1hHNGdJQ0FnSUNCeVpXMXZkbUZzS0doMWJtc3NJRzFwYm1Vc0lIUm9aV2x5S1R0Y2JpQWdJQ0I5SUdWc2MyVWdhV1lnS0hSb1pXbHlRM1Z5Y21WdWRGc3dYU0E5UFQwZ0p5MG5JQ1ltSUcxcGJtVkRkWEp5Wlc1MFd6QmRJRDA5UFNBbklDY3BJSHRjYmlBZ0lDQWdJQzh2SUZSb1pXbHlJSEpsYlc5MlpXUWdiM0lnWldScGRHVmtYRzRnSUNBZ0lDQnlaVzF2ZG1Gc0tHaDFibXNzSUhSb1pXbHlMQ0J0YVc1bExDQjBjblZsS1R0Y2JpQWdJQ0I5SUdWc2MyVWdhV1lnS0cxcGJtVkRkWEp5Wlc1MElEMDlQU0IwYUdWcGNrTjFjbkpsYm5RcElIdGNiaUFnSUNBZ0lDOHZJRU52Ym5SbGVIUWdhV1JsYm5ScGRIbGNiaUFnSUNBZ0lHaDFibXN1YkdsdVpYTXVjSFZ6YUNodGFXNWxRM1Z5Y21WdWRDazdYRzRnSUNBZ0lDQnRhVzVsTG1sdVpHVjRLeXM3WEc0Z0lDQWdJQ0IwYUdWcGNpNXBibVJsZUNzck8xeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0F2THlCRGIyNTBaWGgwSUcxcGMyMWhkR05vWEc0Z0lDQWdJQ0JqYjI1bWJHbGpkQ2hvZFc1ckxDQmpiMnhzWldOMFEyaGhibWRsS0cxcGJtVXBMQ0JqYjJ4c1pXTjBRMmhoYm1kbEtIUm9aV2x5S1NrN1hHNGdJQ0FnZlZ4dUlDQjlYRzVjYmlBZ0x5OGdUbTkzSUhCMWMyZ2dZVzU1ZEdocGJtY2dkR2hoZENCdFlYa2dZbVVnY21WdFlXbHVhVzVuWEc0Z0lHbHVjMlZ5ZEZSeVlXbHNhVzVuS0doMWJtc3NJRzFwYm1VcE8xeHVJQ0JwYm5ObGNuUlVjbUZwYkdsdVp5aG9kVzVyTENCMGFHVnBjaWs3WEc1Y2JpQWdZMkZzWTB4cGJtVkRiM1Z1ZENob2RXNXJLVHRjYm4xY2JseHVablZ1WTNScGIyNGdiWFYwZFdGc1EyaGhibWRsS0doMWJtc3NJRzFwYm1Vc0lIUm9aV2x5S1NCN1hHNGdJR3hsZENCdGVVTm9ZVzVuWlhNZ1BTQmpiMnhzWldOMFEyaGhibWRsS0cxcGJtVXBMRnh1SUNBZ0lDQWdkR2hsYVhKRGFHRnVaMlZ6SUQwZ1kyOXNiR1ZqZEVOb1lXNW5aU2gwYUdWcGNpazdYRzVjYmlBZ2FXWWdLR0ZzYkZKbGJXOTJaWE1vYlhsRGFHRnVaMlZ6S1NBbUppQmhiR3hTWlcxdmRtVnpLSFJvWldseVEyaGhibWRsY3lrcElIdGNiaUFnSUNBdkx5QlRjR1ZqYVdGc0lHTmhjMlVnWm05eUlISmxiVzkyWlNCamFHRnVaMlZ6SUhSb1lYUWdZWEpsSUhOMWNHVnljMlYwY3lCdlppQnZibVVnWVc1dmRHaGxjbHh1SUNBZ0lHbG1JQ2hoY25KaGVWTjBZWEowYzFkcGRHZ29iWGxEYUdGdVoyVnpMQ0IwYUdWcGNrTm9ZVzVuWlhNcFhHNGdJQ0FnSUNBZ0lDWW1JSE5yYVhCU1pXMXZkbVZUZFhCbGNuTmxkQ2gwYUdWcGNpd2diWGxEYUdGdVoyVnpMQ0J0ZVVOb1lXNW5aWE11YkdWdVozUm9JQzBnZEdobGFYSkRhR0Z1WjJWekxteGxibWQwYUNrcElIdGNiaUFnSUNBZ0lHaDFibXN1YkdsdVpYTXVjSFZ6YUNndUxpNGdiWGxEYUdGdVoyVnpLVHRjYmlBZ0lDQWdJSEpsZEhWeWJqdGNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tHRnljbUY1VTNSaGNuUnpWMmwwYUNoMGFHVnBja05vWVc1blpYTXNJRzE1UTJoaGJtZGxjeWxjYmlBZ0lDQWdJQ0FnSmlZZ2MydHBjRkpsYlc5MlpWTjFjR1Z5YzJWMEtHMXBibVVzSUhSb1pXbHlRMmhoYm1kbGN5d2dkR2hsYVhKRGFHRnVaMlZ6TG14bGJtZDBhQ0F0SUcxNVEyaGhibWRsY3k1c1pXNW5kR2dwS1NCN1hHNGdJQ0FnSUNCb2RXNXJMbXhwYm1WekxuQjFjMmdvTGk0dUlIUm9aV2x5UTJoaGJtZGxjeWs3WEc0Z0lDQWdJQ0J5WlhSMWNtNDdYRzRnSUNBZ2ZWeHVJQ0I5SUdWc2MyVWdhV1lnS0dGeWNtRjVSWEYxWVd3b2JYbERhR0Z1WjJWekxDQjBhR1ZwY2tOb1lXNW5aWE1wS1NCN1hHNGdJQ0FnYUhWdWF5NXNhVzVsY3k1d2RYTm9LQzR1TGlCdGVVTm9ZVzVuWlhNcE8xeHVJQ0FnSUhKbGRIVnlianRjYmlBZ2ZWeHVYRzRnSUdOdmJtWnNhV04wS0doMWJtc3NJRzE1UTJoaGJtZGxjeXdnZEdobGFYSkRhR0Z1WjJWektUdGNibjFjYmx4dVpuVnVZM1JwYjI0Z2NtVnRiM1poYkNob2RXNXJMQ0J0YVc1bExDQjBhR1ZwY2l3Z2MzZGhjQ2tnZTF4dUlDQnNaWFFnYlhsRGFHRnVaMlZ6SUQwZ1kyOXNiR1ZqZEVOb1lXNW5aU2h0YVc1bEtTeGNiaUFnSUNBZ0lIUm9aV2x5UTJoaGJtZGxjeUE5SUdOdmJHeGxZM1JEYjI1MFpYaDBLSFJvWldseUxDQnRlVU5vWVc1blpYTXBPMXh1SUNCcFppQW9kR2hsYVhKRGFHRnVaMlZ6TG0xbGNtZGxaQ2tnZTF4dUlDQWdJR2gxYm1zdWJHbHVaWE11Y0hWemFDZ3VMaTRnZEdobGFYSkRhR0Z1WjJWekxtMWxjbWRsWkNrN1hHNGdJSDBnWld4elpTQjdYRzRnSUNBZ1kyOXVabXhwWTNRb2FIVnVheXdnYzNkaGNDQS9JSFJvWldseVEyaGhibWRsY3lBNklHMTVRMmhoYm1kbGN5d2djM2RoY0NBL0lHMTVRMmhoYm1kbGN5QTZJSFJvWldseVEyaGhibWRsY3lrN1hHNGdJSDFjYm4xY2JseHVablZ1WTNScGIyNGdZMjl1Wm14cFkzUW9hSFZ1YXl3Z2JXbHVaU3dnZEdobGFYSXBJSHRjYmlBZ2FIVnVheTVqYjI1bWJHbGpkQ0E5SUhSeWRXVTdYRzRnSUdoMWJtc3ViR2x1WlhNdWNIVnphQ2g3WEc0Z0lDQWdZMjl1Wm14cFkzUTZJSFJ5ZFdVc1hHNGdJQ0FnYldsdVpUb2diV2x1WlN4Y2JpQWdJQ0IwYUdWcGNuTTZJSFJvWldseVhHNGdJSDBwTzF4dWZWeHVYRzVtZFc1amRHbHZiaUJwYm5ObGNuUk1aV0ZrYVc1bktHaDFibXNzSUdsdWMyVnlkQ3dnZEdobGFYSXBJSHRjYmlBZ2QyaHBiR1VnS0dsdWMyVnlkQzV2Wm1aelpYUWdQQ0IwYUdWcGNpNXZabVp6WlhRZ0ppWWdhVzV6WlhKMExtbHVaR1Y0SUR3Z2FXNXpaWEowTG14cGJtVnpMbXhsYm1kMGFDa2dlMXh1SUNBZ0lHeGxkQ0JzYVc1bElEMGdhVzV6WlhKMExteHBibVZ6VzJsdWMyVnlkQzVwYm1SbGVDc3JYVHRjYmlBZ0lDQm9kVzVyTG14cGJtVnpMbkIxYzJnb2JHbHVaU2s3WEc0Z0lDQWdhVzV6WlhKMExtOW1abk5sZENzck8xeHVJQ0I5WEc1OVhHNW1kVzVqZEdsdmJpQnBibk5sY25SVWNtRnBiR2x1Wnlob2RXNXJMQ0JwYm5ObGNuUXBJSHRjYmlBZ2QyaHBiR1VnS0dsdWMyVnlkQzVwYm1SbGVDQThJR2x1YzJWeWRDNXNhVzVsY3k1c1pXNW5kR2dwSUh0Y2JpQWdJQ0JzWlhRZ2JHbHVaU0E5SUdsdWMyVnlkQzVzYVc1bGMxdHBibk5sY25RdWFXNWtaWGdySzEwN1hHNGdJQ0FnYUhWdWF5NXNhVzVsY3k1d2RYTm9LR3hwYm1VcE8xeHVJQ0I5WEc1OVhHNWNibVoxYm1OMGFXOXVJR052Ykd4bFkzUkRhR0Z1WjJVb2MzUmhkR1VwSUh0Y2JpQWdiR1YwSUhKbGRDQTlJRnRkTEZ4dUlDQWdJQ0FnYjNCbGNtRjBhVzl1SUQwZ2MzUmhkR1V1YkdsdVpYTmJjM1JoZEdVdWFXNWtaWGhkV3pCZE8xeHVJQ0IzYUdsc1pTQW9jM1JoZEdVdWFXNWtaWGdnUENCemRHRjBaUzVzYVc1bGN5NXNaVzVuZEdncElIdGNiaUFnSUNCc1pYUWdiR2x1WlNBOUlITjBZWFJsTG14cGJtVnpXM04wWVhSbExtbHVaR1Y0WFR0Y2JseHVJQ0FnSUM4dklFZHliM1Z3SUdGa1pHbDBhVzl1Y3lCMGFHRjBJR0Z5WlNCcGJXMWxaR2xoZEdWc2VTQmhablJsY2lCemRXSjBjbUZqZEdsdmJuTWdZVzVrSUhSeVpXRjBJSFJvWlcwZ1lYTWdiMjVsSUZ3aVlYUnZiV2xqWENJZ2JXOWthV1o1SUdOb1lXNW5aUzVjYmlBZ0lDQnBaaUFvYjNCbGNtRjBhVzl1SUQwOVBTQW5MU2NnSmlZZ2JHbHVaVnN3WFNBOVBUMGdKeXNuS1NCN1hHNGdJQ0FnSUNCdmNHVnlZWFJwYjI0Z1BTQW5LeWM3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdhV1lnS0c5d1pYSmhkR2x2YmlBOVBUMGdiR2x1WlZzd1hTa2dlMXh1SUNBZ0lDQWdjbVYwTG5CMWMyZ29iR2x1WlNrN1hHNGdJQ0FnSUNCemRHRjBaUzVwYm1SbGVDc3JPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCaWNtVmhhenRjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0J5WlhSMWNtNGdjbVYwTzF4dWZWeHVablZ1WTNScGIyNGdZMjlzYkdWamRFTnZiblJsZUhRb2MzUmhkR1VzSUcxaGRHTm9RMmhoYm1kbGN5a2dlMXh1SUNCc1pYUWdZMmhoYm1kbGN5QTlJRnRkTEZ4dUlDQWdJQ0FnYldWeVoyVmtJRDBnVzEwc1hHNGdJQ0FnSUNCdFlYUmphRWx1WkdWNElEMGdNQ3hjYmlBZ0lDQWdJR052Ym5SbGVIUkRhR0Z1WjJWeklEMGdabUZzYzJVc1hHNGdJQ0FnSUNCamIyNW1iR2xqZEdWa0lEMGdabUZzYzJVN1hHNGdJSGRvYVd4bElDaHRZWFJqYUVsdVpHVjRJRHdnYldGMFkyaERhR0Z1WjJWekxteGxibWQwYUZ4dUlDQWdJQ0FnSUNBbUppQnpkR0YwWlM1cGJtUmxlQ0E4SUhOMFlYUmxMbXhwYm1WekxteGxibWQwYUNrZ2UxeHVJQ0FnSUd4bGRDQmphR0Z1WjJVZ1BTQnpkR0YwWlM1c2FXNWxjMXR6ZEdGMFpTNXBibVJsZUYwc1hHNGdJQ0FnSUNBZ0lHMWhkR05vSUQwZ2JXRjBZMmhEYUdGdVoyVnpXMjFoZEdOb1NXNWtaWGhkTzF4dVhHNGdJQ0FnTHk4Z1QyNWpaU0IzWlNkMlpTQm9hWFFnYjNWeUlHRmtaQ3dnZEdobGJpQjNaU0JoY21VZ1pHOXVaVnh1SUNBZ0lHbG1JQ2h0WVhSamFGc3dYU0E5UFQwZ0p5c25LU0I3WEc0Z0lDQWdJQ0JpY21WaGF6dGNiaUFnSUNCOVhHNWNiaUFnSUNCamIyNTBaWGgwUTJoaGJtZGxjeUE5SUdOdmJuUmxlSFJEYUdGdVoyVnpJSHg4SUdOb1lXNW5aVnN3WFNBaFBUMGdKeUFuTzF4dVhHNGdJQ0FnYldWeVoyVmtMbkIxYzJnb2JXRjBZMmdwTzF4dUlDQWdJRzFoZEdOb1NXNWtaWGdyS3p0Y2JseHVJQ0FnSUM4dklFTnZibk4xYldVZ1lXNTVJR0ZrWkdsMGFXOXVjeUJwYmlCMGFHVWdiM1JvWlhJZ1lteHZZMnNnWVhNZ1lTQmpiMjVtYkdsamRDQjBieUJoZEhSbGJYQjBYRzRnSUNBZ0x5OGdkRzhnY0hWc2JDQnBiaUIwYUdVZ2NtVnRZV2x1YVc1bklHTnZiblJsZUhRZ1lXWjBaWElnZEdocGMxeHVJQ0FnSUdsbUlDaGphR0Z1WjJWYk1GMGdQVDA5SUNjckp5a2dlMXh1SUNBZ0lDQWdZMjl1Wm14cFkzUmxaQ0E5SUhSeWRXVTdYRzVjYmlBZ0lDQWdJSGRvYVd4bElDaGphR0Z1WjJWYk1GMGdQVDA5SUNjckp5a2dlMXh1SUNBZ0lDQWdJQ0JqYUdGdVoyVnpMbkIxYzJnb1kyaGhibWRsS1R0Y2JpQWdJQ0FnSUNBZ1kyaGhibWRsSUQwZ2MzUmhkR1V1YkdsdVpYTmJLeXR6ZEdGMFpTNXBibVJsZUYwN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dVhHNGdJQ0FnYVdZZ0tHMWhkR05vTG5OMVluTjBjaWd4S1NBOVBUMGdZMmhoYm1kbExuTjFZbk4wY2lneEtTa2dlMXh1SUNBZ0lDQWdZMmhoYm1kbGN5NXdkWE5vS0dOb1lXNW5aU2s3WEc0Z0lDQWdJQ0J6ZEdGMFpTNXBibVJsZUNzck8xeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0JqYjI1bWJHbGpkR1ZrSUQwZ2RISjFaVHRjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0JwWmlBb0tHMWhkR05vUTJoaGJtZGxjMXR0WVhSamFFbHVaR1Y0WFNCOGZDQW5KeWxiTUYwZ1BUMDlJQ2NySjF4dUlDQWdJQ0FnSmlZZ1kyOXVkR1Y0ZEVOb1lXNW5aWE1wSUh0Y2JpQWdJQ0JqYjI1bWJHbGpkR1ZrSUQwZ2RISjFaVHRjYmlBZ2ZWeHVYRzRnSUdsbUlDaGpiMjVtYkdsamRHVmtLU0I3WEc0Z0lDQWdjbVYwZFhKdUlHTm9ZVzVuWlhNN1hHNGdJSDFjYmx4dUlDQjNhR2xzWlNBb2JXRjBZMmhKYm1SbGVDQThJRzFoZEdOb1EyaGhibWRsY3k1c1pXNW5kR2dwSUh0Y2JpQWdJQ0J0WlhKblpXUXVjSFZ6YUNodFlYUmphRU5vWVc1blpYTmJiV0YwWTJoSmJtUmxlQ3NyWFNrN1hHNGdJSDFjYmx4dUlDQnlaWFIxY200Z2UxeHVJQ0FnSUcxbGNtZGxaQ3hjYmlBZ0lDQmphR0Z1WjJWelhHNGdJSDA3WEc1OVhHNWNibVoxYm1OMGFXOXVJR0ZzYkZKbGJXOTJaWE1vWTJoaGJtZGxjeWtnZTF4dUlDQnlaWFIxY200Z1kyaGhibWRsY3k1eVpXUjFZMlVvWm5WdVkzUnBiMjRvY0hKbGRpd2dZMmhoYm1kbEtTQjdYRzRnSUNBZ2NtVjBkWEp1SUhCeVpYWWdKaVlnWTJoaGJtZGxXekJkSUQwOVBTQW5MU2M3WEc0Z0lIMHNJSFJ5ZFdVcE8xeHVmVnh1Wm5WdVkzUnBiMjRnYzJ0cGNGSmxiVzkyWlZOMWNHVnljMlYwS0hOMFlYUmxMQ0J5WlcxdmRtVkRhR0Z1WjJWekxDQmtaV3gwWVNrZ2UxeHVJQ0JtYjNJZ0tHeGxkQ0JwSUQwZ01Ec2dhU0E4SUdSbGJIUmhPeUJwS3lzcElIdGNiaUFnSUNCc1pYUWdZMmhoYm1kbFEyOXVkR1Z1ZENBOUlISmxiVzkyWlVOb1lXNW5aWE5iY21WdGIzWmxRMmhoYm1kbGN5NXNaVzVuZEdnZ0xTQmtaV3gwWVNBcklHbGRMbk4xWW5OMGNpZ3hLVHRjYmlBZ0lDQnBaaUFvYzNSaGRHVXViR2x1WlhOYmMzUmhkR1V1YVc1a1pYZ2dLeUJwWFNBaFBUMGdKeUFuSUNzZ1kyaGhibWRsUTI5dWRHVnVkQ2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVJR1poYkhObE8xeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lITjBZWFJsTG1sdVpHVjRJQ3M5SUdSbGJIUmhPMXh1SUNCeVpYUjFjbTRnZEhKMVpUdGNibjFjYmx4dVpuVnVZM1JwYjI0Z1kyRnNZMDlzWkU1bGQweHBibVZEYjNWdWRDaHNhVzVsY3lrZ2UxeHVJQ0JzWlhRZ2IyeGtUR2x1WlhNZ1BTQXdPMXh1SUNCc1pYUWdibVYzVEdsdVpYTWdQU0F3TzF4dVhHNGdJR3hwYm1WekxtWnZja1ZoWTJnb1puVnVZM1JwYjI0b2JHbHVaU2tnZTF4dUlDQWdJR2xtSUNoMGVYQmxiMllnYkdsdVpTQWhQVDBnSjNOMGNtbHVaeWNwSUh0Y2JpQWdJQ0FnSUd4bGRDQnRlVU52ZFc1MElEMGdZMkZzWTA5c1pFNWxkMHhwYm1WRGIzVnVkQ2hzYVc1bExtMXBibVVwTzF4dUlDQWdJQ0FnYkdWMElIUm9aV2x5UTI5MWJuUWdQU0JqWVd4alQyeGtUbVYzVEdsdVpVTnZkVzUwS0d4cGJtVXVkR2hsYVhKektUdGNibHh1SUNBZ0lDQWdhV1lnS0c5c1pFeHBibVZ6SUNFOVBTQjFibVJsWm1sdVpXUXBJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tHMTVRMjkxYm5RdWIyeGtUR2x1WlhNZ1BUMDlJSFJvWldseVEyOTFiblF1YjJ4a1RHbHVaWE1wSUh0Y2JpQWdJQ0FnSUNBZ0lDQnZiR1JNYVc1bGN5QXJQU0J0ZVVOdmRXNTBMbTlzWkV4cGJtVnpPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUc5c1pFeHBibVZ6SUQwZ2RXNWtaV1pwYm1Wa08xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJR2xtSUNodVpYZE1hVzVsY3lBaFBUMGdkVzVrWldacGJtVmtLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaHRlVU52ZFc1MExtNWxkMHhwYm1WeklEMDlQU0IwYUdWcGNrTnZkVzUwTG01bGQweHBibVZ6S1NCN1hHNGdJQ0FnSUNBZ0lDQWdibVYzVEdsdVpYTWdLejBnYlhsRGIzVnVkQzV1WlhkTWFXNWxjenRjYmlBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNCdVpYZE1hVzVsY3lBOUlIVnVaR1ZtYVc1bFpEdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdmVnh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCcFppQW9ibVYzVEdsdVpYTWdJVDA5SUhWdVpHVm1hVzVsWkNBbUppQW9iR2x1WlZzd1hTQTlQVDBnSnlzbklIeDhJR3hwYm1WYk1GMGdQVDA5SUNjZ0p5a3BJSHRjYmlBZ0lDQWdJQ0FnYm1WM1RHbHVaWE1yS3p0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0FnSUdsbUlDaHZiR1JNYVc1bGN5QWhQVDBnZFc1a1pXWnBibVZrSUNZbUlDaHNhVzVsV3pCZElEMDlQU0FuTFNjZ2ZId2diR2x1WlZzd1hTQTlQVDBnSnlBbktTa2dlMXh1SUNBZ0lDQWdJQ0J2YkdSTWFXNWxjeXNyTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ2ZTazdYRzVjYmlBZ2NtVjBkWEp1SUh0dmJHUk1hVzVsY3l3Z2JtVjNUR2x1WlhOOU8xeHVmVnh1SWwxOVxuXG5cbi8qKiovIH0pLFxuLyogMTQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovJ3VzZSBzdHJpY3QnO1xuXG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovc3RydWN0dXJlZFBhdGNoID0gc3RydWN0dXJlZFBhdGNoO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jcmVhdGVUd29GaWxlc1BhdGNoID0gY3JlYXRlVHdvRmlsZXNQYXRjaDtcblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2V4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovY3JlYXRlUGF0Y2ggPSBjcmVhdGVQYXRjaDtcblxuXHR2YXIgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19saW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSBlbHNlIHsgcmV0dXJuIEFycmF5LmZyb20oYXJyKTsgfSB9XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9mdW5jdGlvbiBzdHJ1Y3R1cmVkUGF0Y2gob2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcblx0ICBpZiAoIW9wdGlvbnMpIHtcblx0ICAgIG9wdGlvbnMgPSB7fTtcblx0ICB9XG5cdCAgaWYgKHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICd1bmRlZmluZWQnKSB7XG5cdCAgICBvcHRpb25zLmNvbnRleHQgPSA0O1xuXHQgIH1cblxuXHQgIHZhciBkaWZmID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLygwLCBfbGluZS5kaWZmTGluZXMpIC8qaXN0YW5idWwgaWdub3JlIGVuZCovKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcblx0ICBkaWZmLnB1c2goeyB2YWx1ZTogJycsIGxpbmVzOiBbXSB9KTsgLy8gQXBwZW5kIGFuIGVtcHR5IHZhbHVlIHRvIG1ha2UgY2xlYW51cCBlYXNpZXJcblxuXHQgIGZ1bmN0aW9uIGNvbnRleHRMaW5lcyhsaW5lcykge1xuXHQgICAgcmV0dXJuIGxpbmVzLm1hcChmdW5jdGlvbiAoZW50cnkpIHtcblx0ICAgICAgcmV0dXJuICcgJyArIGVudHJ5O1xuXHQgICAgfSk7XG5cdCAgfVxuXG5cdCAgdmFyIGh1bmtzID0gW107XG5cdCAgdmFyIG9sZFJhbmdlU3RhcnQgPSAwLFxuXHQgICAgICBuZXdSYW5nZVN0YXJ0ID0gMCxcblx0ICAgICAgY3VyUmFuZ2UgPSBbXSxcblx0ICAgICAgb2xkTGluZSA9IDEsXG5cdCAgICAgIG5ld0xpbmUgPSAxO1xuXG5cdCAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2kpIHtcblx0ICAgIHZhciBjdXJyZW50ID0gZGlmZltpXSxcblx0ICAgICAgICBsaW5lcyA9IGN1cnJlbnQubGluZXMgfHwgY3VycmVudC52YWx1ZS5yZXBsYWNlKC9cXG4kLywgJycpLnNwbGl0KCdcXG4nKTtcblx0ICAgIGN1cnJlbnQubGluZXMgPSBsaW5lcztcblxuXHQgICAgaWYgKGN1cnJlbnQuYWRkZWQgfHwgY3VycmVudC5yZW1vdmVkKSB7XG5cdCAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2N1clJhbmdlO1xuXG5cdCAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovIC8vIElmIHdlIGhhdmUgcHJldmlvdXMgY29udGV4dCwgc3RhcnQgd2l0aCB0aGF0XG5cdCAgICAgIGlmICghb2xkUmFuZ2VTdGFydCkge1xuXHQgICAgICAgIHZhciBwcmV2ID0gZGlmZltpIC0gMV07XG5cdCAgICAgICAgb2xkUmFuZ2VTdGFydCA9IG9sZExpbmU7XG5cdCAgICAgICAgbmV3UmFuZ2VTdGFydCA9IG5ld0xpbmU7XG5cblx0ICAgICAgICBpZiAocHJldikge1xuXHQgICAgICAgICAgY3VyUmFuZ2UgPSBvcHRpb25zLmNvbnRleHQgPiAwID8gY29udGV4dExpbmVzKHByZXYubGluZXMuc2xpY2UoLW9wdGlvbnMuY29udGV4dCkpIDogW107XG5cdCAgICAgICAgICBvbGRSYW5nZVN0YXJ0IC09IGN1clJhbmdlLmxlbmd0aDtcblx0ICAgICAgICAgIG5ld1JhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXG5cdCAgICAgIC8vIE91dHB1dCBvdXIgY2hhbmdlc1xuXHQgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovKF9jdXJSYW5nZSA9IC8qaXN0YW5idWwgaWdub3JlIGVuZCovY3VyUmFuZ2UpLnB1c2guIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9hcHBseSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyggLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19jdXJSYW5nZSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLywgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL190b0NvbnN1bWFibGVBcnJheSggLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9saW5lcy5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7XG5cdCAgICAgICAgcmV0dXJuIChjdXJyZW50LmFkZGVkID8gJysnIDogJy0nKSArIGVudHJ5O1xuXHQgICAgICB9KSkpO1xuXG5cdCAgICAgIC8vIFRyYWNrIHRoZSB1cGRhdGVkIGZpbGUgcG9zaXRpb25cblx0ICAgICAgaWYgKGN1cnJlbnQuYWRkZWQpIHtcblx0ICAgICAgICBuZXdMaW5lICs9IGxpbmVzLmxlbmd0aDtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBvbGRMaW5lICs9IGxpbmVzLmxlbmd0aDtcblx0ICAgICAgfVxuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgLy8gSWRlbnRpY2FsIGNvbnRleHQgbGluZXMuIFRyYWNrIGxpbmUgY2hhbmdlc1xuXHQgICAgICBpZiAob2xkUmFuZ2VTdGFydCkge1xuXHQgICAgICAgIC8vIENsb3NlIG91dCBhbnkgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBvdXRwdXQgKG9yIGpvaW4gb3ZlcmxhcHBpbmcpXG5cdCAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQgKiAyICYmIGkgPCBkaWZmLmxlbmd0aCAtIDIpIHtcblx0ICAgICAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki92YXIgX2N1clJhbmdlMjtcblxuXHQgICAgICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8gLy8gT3ZlcmxhcHBpbmdcblx0ICAgICAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8oX2N1clJhbmdlMiA9IC8qaXN0YW5idWwgaWdub3JlIGVuZCovY3VyUmFuZ2UpLnB1c2guIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9hcHBseSAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyggLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL19jdXJSYW5nZTIgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi8sIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fdG9Db25zdW1hYmxlQXJyYXkoIC8qaXN0YW5idWwgaWdub3JlIGVuZCovY29udGV4dExpbmVzKGxpbmVzKSkpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovdmFyIF9jdXJSYW5nZTM7XG5cblx0ICAgICAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovIC8vIGVuZCB0aGUgcmFuZ2UgYW5kIG91dHB1dFxuXHQgICAgICAgICAgdmFyIGNvbnRleHRTaXplID0gTWF0aC5taW4obGluZXMubGVuZ3RoLCBvcHRpb25zLmNvbnRleHQpO1xuXHQgICAgICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyhfY3VyUmFuZ2UzID0gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jdXJSYW5nZSkucHVzaC4gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL2FwcGx5IC8qaXN0YW5idWwgaWdub3JlIGVuZCovKCAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovX2N1clJhbmdlMyAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLywgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL190b0NvbnN1bWFibGVBcnJheSggLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9jb250ZXh0TGluZXMobGluZXMuc2xpY2UoMCwgY29udGV4dFNpemUpKSkpO1xuXG5cdCAgICAgICAgICB2YXIgaHVuayA9IHtcblx0ICAgICAgICAgICAgb2xkU3RhcnQ6IG9sZFJhbmdlU3RhcnQsXG5cdCAgICAgICAgICAgIG9sZExpbmVzOiBvbGRMaW5lIC0gb2xkUmFuZ2VTdGFydCArIGNvbnRleHRTaXplLFxuXHQgICAgICAgICAgICBuZXdTdGFydDogbmV3UmFuZ2VTdGFydCxcblx0ICAgICAgICAgICAgbmV3TGluZXM6IG5ld0xpbmUgLSBuZXdSYW5nZVN0YXJ0ICsgY29udGV4dFNpemUsXG5cdCAgICAgICAgICAgIGxpbmVzOiBjdXJSYW5nZVxuXHQgICAgICAgICAgfTtcblx0ICAgICAgICAgIGlmIChpID49IGRpZmYubGVuZ3RoIC0gMiAmJiBsaW5lcy5sZW5ndGggPD0gb3B0aW9ucy5jb250ZXh0KSB7XG5cdCAgICAgICAgICAgIC8vIEVPRiBpcyBpbnNpZGUgdGhpcyBodW5rXG5cdCAgICAgICAgICAgIHZhciBvbGRFT0ZOZXdsaW5lID0gL1xcbiQvLnRlc3Qob2xkU3RyKTtcblx0ICAgICAgICAgICAgdmFyIG5ld0VPRk5ld2xpbmUgPSAvXFxuJC8udGVzdChuZXdTdHIpO1xuXHQgICAgICAgICAgICBpZiAobGluZXMubGVuZ3RoID09IDAgJiYgIW9sZEVPRk5ld2xpbmUpIHtcblx0ICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2U6IG9sZCBoYXMgbm8gZW9sIGFuZCBubyB0cmFpbGluZyBjb250ZXh0OyBuby1ubCBjYW4gZW5kIHVwIGJlZm9yZSBhZGRzXG5cdCAgICAgICAgICAgICAgY3VyUmFuZ2Uuc3BsaWNlKGh1bmsub2xkTGluZXMsIDAsICdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcblx0ICAgICAgICAgICAgfSBlbHNlIGlmICghb2xkRU9GTmV3bGluZSB8fCAhbmV3RU9GTmV3bGluZSkge1xuXHQgICAgICAgICAgICAgIGN1clJhbmdlLnB1c2goJ1xcXFwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZScpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBodW5rcy5wdXNoKGh1bmspO1xuXG5cdCAgICAgICAgICBvbGRSYW5nZVN0YXJ0ID0gMDtcblx0ICAgICAgICAgIG5ld1JhbmdlU3RhcnQgPSAwO1xuXHQgICAgICAgICAgY3VyUmFuZ2UgPSBbXTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgb2xkTGluZSArPSBsaW5lcy5sZW5ndGg7XG5cdCAgICAgIG5ld0xpbmUgKz0gbGluZXMubGVuZ3RoO1xuXHQgICAgfVxuXHQgIH07XG5cblx0ICBmb3IgKHZhciBpID0gMDsgaSA8IGRpZmYubGVuZ3RoOyBpKyspIHtcblx0ICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9fbG9vcCggLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9pKTtcblx0ICB9XG5cblx0ICByZXR1cm4ge1xuXHQgICAgb2xkRmlsZU5hbWU6IG9sZEZpbGVOYW1lLCBuZXdGaWxlTmFtZTogbmV3RmlsZU5hbWUsXG5cdCAgICBvbGRIZWFkZXI6IG9sZEhlYWRlciwgbmV3SGVhZGVyOiBuZXdIZWFkZXIsXG5cdCAgICBodW5rczogaHVua3Ncblx0ICB9O1xuXHR9XG5cblx0ZnVuY3Rpb24gY3JlYXRlVHdvRmlsZXNQYXRjaChvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucykge1xuXHQgIHZhciBkaWZmID0gc3RydWN0dXJlZFBhdGNoKG9sZEZpbGVOYW1lLCBuZXdGaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKTtcblxuXHQgIHZhciByZXQgPSBbXTtcblx0ICBpZiAob2xkRmlsZU5hbWUgPT0gbmV3RmlsZU5hbWUpIHtcblx0ICAgIHJldC5wdXNoKCdJbmRleDogJyArIG9sZEZpbGVOYW1lKTtcblx0ICB9XG5cdCAgcmV0LnB1c2goJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nKTtcblx0ICByZXQucHVzaCgnLS0tICcgKyBkaWZmLm9sZEZpbGVOYW1lICsgKHR5cGVvZiBkaWZmLm9sZEhlYWRlciA9PT0gJ3VuZGVmaW5lZCcgPyAnJyA6ICdcXHQnICsgZGlmZi5vbGRIZWFkZXIpKTtcblx0ICByZXQucHVzaCgnKysrICcgKyBkaWZmLm5ld0ZpbGVOYW1lICsgKHR5cGVvZiBkaWZmLm5ld0hlYWRlciA9PT0gJ3VuZGVmaW5lZCcgPyAnJyA6ICdcXHQnICsgZGlmZi5uZXdIZWFkZXIpKTtcblxuXHQgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlmZi5odW5rcy5sZW5ndGg7IGkrKykge1xuXHQgICAgdmFyIGh1bmsgPSBkaWZmLmh1bmtzW2ldO1xuXHQgICAgcmV0LnB1c2goJ0BAIC0nICsgaHVuay5vbGRTdGFydCArICcsJyArIGh1bmsub2xkTGluZXMgKyAnICsnICsgaHVuay5uZXdTdGFydCArICcsJyArIGh1bmsubmV3TGluZXMgKyAnIEBAJyk7XG5cdCAgICByZXQucHVzaC5hcHBseShyZXQsIGh1bmsubGluZXMpO1xuXHQgIH1cblxuXHQgIHJldHVybiByZXQuam9pbignXFxuJykgKyAnXFxuJztcblx0fVxuXG5cdGZ1bmN0aW9uIGNyZWF0ZVBhdGNoKGZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcblx0ICByZXR1cm4gY3JlYXRlVHdvRmlsZXNQYXRjaChmaWxlTmFtZSwgZmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucyk7XG5cdH1cblx0Ly8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5d1lYUmphQzlqY21WaGRHVXVhbk1pWFN3aWJtRnRaWE1pT2xzaWMzUnlkV04wZFhKbFpGQmhkR05vSWl3aVkzSmxZWFJsVkhkdlJtbHNaWE5RWVhSamFDSXNJbU55WldGMFpWQmhkR05vSWl3aWIyeGtSbWxzWlU1aGJXVWlMQ0p1WlhkR2FXeGxUbUZ0WlNJc0ltOXNaRk4wY2lJc0ltNWxkMU4wY2lJc0ltOXNaRWhsWVdSbGNpSXNJbTVsZDBobFlXUmxjaUlzSW05d2RHbHZibk1pTENKamIyNTBaWGgwSWl3aVpHbG1aaUlzSW5CMWMyZ2lMQ0oyWVd4MVpTSXNJbXhwYm1Weklpd2lZMjl1ZEdWNGRFeHBibVZ6SWl3aWJXRndJaXdpWlc1MGNua2lMQ0pvZFc1cmN5SXNJbTlzWkZKaGJtZGxVM1JoY25RaUxDSnVaWGRTWVc1blpWTjBZWEowSWl3aVkzVnlVbUZ1WjJVaUxDSnZiR1JNYVc1bElpd2libVYzVEdsdVpTSXNJbWtpTENKamRYSnlaVzUwSWl3aWNtVndiR0ZqWlNJc0luTndiR2wwSWl3aVlXUmtaV1FpTENKeVpXMXZkbVZrSWl3aWNISmxkaUlzSW5Oc2FXTmxJaXdpYkdWdVozUm9JaXdpWTI5dWRHVjRkRk5wZW1VaUxDSk5ZWFJvSWl3aWJXbHVJaXdpYUhWdWF5SXNJbTlzWkZOMFlYSjBJaXdpYjJ4a1RHbHVaWE1pTENKdVpYZFRkR0Z5ZENJc0ltNWxkMHhwYm1Weklpd2liMnhrUlU5R1RtVjNiR2x1WlNJc0luUmxjM1FpTENKdVpYZEZUMFpPWlhkc2FXNWxJaXdpYzNCc2FXTmxJaXdpY21WMElpd2lZWEJ3YkhraUxDSnFiMmx1SWl3aVptbHNaVTVoYldVaVhTd2liV0Z3Y0dsdVozTWlPaUk3T3p0blEwRkZaMEpCTEdVc1IwRkJRVUVzWlR0NVJFRnBSMEZETEcxQ0xFZEJRVUZCTEcxQ08zbEVRWGRDUVVNc1Z5eEhRVUZCUVN4WE96dEJRVE5JYUVJN096czdkVUpCUlU4c1UwRkJVMFlzWlVGQlZDeERRVUY1UWtjc1YwRkJla0lzUlVGQmMwTkRMRmRCUVhSRExFVkJRVzFFUXl4TlFVRnVSQ3hGUVVFeVJFTXNUVUZCTTBRc1JVRkJiVVZETEZOQlFXNUZMRVZCUVRoRlF5eFRRVUU1UlN4RlFVRjVSa01zVDBGQmVrWXNSVUZCYTBjN1FVRkRka2NzVFVGQlNTeERRVUZEUVN4UFFVRk1MRVZCUVdNN1FVRkRXa0VzWTBGQlZTeEZRVUZXTzBGQlEwUTdRVUZEUkN4TlFVRkpMRTlCUVU5QkxGRkJRVkZETEU5QlFXWXNTMEZCTWtJc1YwRkJMMElzUlVGQk5FTTdRVUZETVVORUxGbEJRVkZETEU5QlFWSXNSMEZCYTBJc1EwRkJiRUk3UVVGRFJEczdRVUZGUkN4TlFVRk5ReXhQUVVGUExITkZRVUZWVGl4TlFVRldMRVZCUVd0Q1F5eE5RVUZzUWl4RlFVRXdRa2NzVDBGQk1VSXNRMEZCWWp0QlFVTkJSU3hQUVVGTFF5eEpRVUZNTEVOQlFWVXNSVUZCUTBNc1QwRkJUeXhGUVVGU0xFVkJRVmxETEU5QlFVOHNSVUZCYmtJc1JVRkJWaXhGUVZSMVJ5eERRVk5zUlRzN1FVRkZja01zVjBGQlUwTXNXVUZCVkN4RFFVRnpRa1FzUzBGQmRFSXNSVUZCTmtJN1FVRkRNMElzVjBGQlQwRXNUVUZCVFVVc1IwRkJUaXhEUVVGVkxGVkJRVk5ETEV0QlFWUXNSVUZCWjBJN1FVRkJSU3hoUVVGUExFMUJRVTFCTEV0QlFXSTdRVUZCY1VJc1MwRkJha1FzUTBGQlVEdEJRVU5FT3p0QlFVVkVMRTFCUVVsRExGRkJRVkVzUlVGQldqdEJRVU5CTEUxQlFVbERMR2RDUVVGblFpeERRVUZ3UWp0QlFVRkJMRTFCUVhWQ1F5eG5Ra0ZCWjBJc1EwRkJka003UVVGQlFTeE5RVUV3UTBNc1YwRkJWeXhGUVVGeVJEdEJRVUZCTEUxQlEwbERMRlZCUVZVc1EwRkVaRHRCUVVGQkxFMUJRMmxDUXl4VlFVRlZMRU5CUkROQ096dEJRV2hDZFVjc09FVkJhMEk1UmtNc1EwRnNRamhHTzBGQmJVSnlSeXhSUVVGTlF5eFZRVUZWWkN4TFFVRkxZU3hEUVVGTUxFTkJRV2hDTzBGQlFVRXNVVUZEVFZZc1VVRkJVVmNzVVVGQlVWZ3NTMEZCVWl4SlFVRnBRbGNzVVVGQlVWb3NTMEZCVWl4RFFVRmpZU3hQUVVGa0xFTkJRWE5DTEV0QlFYUkNMRVZCUVRaQ0xFVkJRVGRDTEVWQlFXbERReXhMUVVGcVF5eERRVUYxUXl4SlFVRjJReXhEUVVRdlFqdEJRVVZCUml4WlFVRlJXQ3hMUVVGU0xFZEJRV2RDUVN4TFFVRm9RanM3UVVGRlFTeFJRVUZKVnl4UlFVRlJSeXhMUVVGU0xFbEJRV2xDU0N4UlFVRlJTU3hQUVVFM1FpeEZRVUZ6UXp0QlFVRkJPenRCUVVGQkxEaENRVU53UXp0QlFVTkJMRlZCUVVrc1EwRkJRMVlzWVVGQlRDeEZRVUZ2UWp0QlFVTnNRaXhaUVVGTlZ5eFBRVUZQYmtJc1MwRkJTMkVzU1VGQlNTeERRVUZVTEVOQlFXSTdRVUZEUVV3c2QwSkJRV2RDUnl4UFFVRm9RanRCUVVOQlJpeDNRa0ZCWjBKSExFOUJRV2hDT3p0QlFVVkJMRmxCUVVsUExFbEJRVW9zUlVGQlZUdEJRVU5TVkN4eFFrRkJWMW9zVVVGQlVVTXNUMEZCVWl4SFFVRnJRaXhEUVVGc1FpeEhRVUZ6UWtzc1lVRkJZV1VzUzBGQlMyaENMRXRCUVV3c1EwRkJWMmxDTEV0QlFWZ3NRMEZCYVVJc1EwRkJRM1JDTEZGQlFWRkRMRTlCUVRGQ0xFTkJRV0lzUTBGQmRFSXNSMEZCZVVVc1JVRkJjRVk3UVVGRFFWTXNNa0pCUVdsQ1JTeFRRVUZUVnl4TlFVRXhRanRCUVVOQldpd3lRa0ZCYVVKRExGTkJRVk5YTEUxQlFURkNPMEZCUTBRN1FVRkRSanM3UVVGRlJEdEJRVU5CTERaRlFVRlRjRUlzU1VGQlZDd3dURUZCYTBKRkxFMUJRVTFGTEVkQlFVNHNRMEZCVlN4VlFVRlRReXhMUVVGVUxFVkJRV2RDTzBGQlF6RkRMR1ZCUVU4c1EwRkJRMUVzVVVGQlVVY3NTMEZCVWl4SFFVRm5RaXhIUVVGb1FpeEhRVUZ6UWl4SFFVRjJRaXhKUVVFNFFsZ3NTMEZCY2tNN1FVRkRSQ3hQUVVacFFpeERRVUZzUWpzN1FVRkpRVHRCUVVOQkxGVkJRVWxSTEZGQlFWRkhMRXRCUVZvc1JVRkJiVUk3UVVGRGFrSk1MRzFDUVVGWFZDeE5RVUZOYTBJc1RVRkJha0k3UVVGRFJDeFBRVVpFTEUxQlJVODdRVUZEVEZZc2JVSkJRVmRTTEUxQlFVMXJRaXhOUVVGcVFqdEJRVU5FTzBGQlEwWXNTMEY2UWtRc1RVRjVRazg3UVVGRFREdEJRVU5CTEZWQlFVbGlMR0ZCUVVvc1JVRkJiVUk3UVVGRGFrSTdRVUZEUVN4WlFVRkpUQ3hOUVVGTmEwSXNUVUZCVGl4SlFVRm5RblpDTEZGQlFWRkRMRTlCUVZJc1IwRkJhMElzUTBGQmJFTXNTVUZCZFVOakxFbEJRVWxpTEV0QlFVdHhRaXhOUVVGTUxFZEJRV01zUTBGQk4wUXNSVUZCWjBVN1FVRkJRVHM3UVVGQlFTeHJRMEZET1VRN1FVRkRRU3hyUmtGQlUzQkNMRWxCUVZRc01reEJRV3RDUnl4aFFVRmhSQ3hMUVVGaUxFTkJRV3hDTzBGQlEwUXNVMEZJUkN4TlFVZFBPMEZCUVVFN08wRkJRVUVzYTBOQlEwdzdRVUZEUVN4alFVRkpiVUlzWTBGQlkwTXNTMEZCUzBNc1IwRkJUQ3hEUVVGVGNrSXNUVUZCVFd0Q0xFMUJRV1lzUlVGQmRVSjJRaXhSUVVGUlF5eFBRVUV2UWl4RFFVRnNRanRCUVVOQkxHdEdRVUZUUlN4SlFVRlVMREpNUVVGclFrY3NZVUZCWVVRc1RVRkJUV2xDTEV0QlFVNHNRMEZCV1N4RFFVRmFMRVZCUVdWRkxGZEJRV1lzUTBGQllpeERRVUZzUWpzN1FVRkZRU3hqUVVGSlJ5eFBRVUZQTzBGQlExUkRMSE5DUVVGVmJFSXNZVUZFUkR0QlFVVlViVUlzYzBKQlFWZG9RaXhWUVVGVlNDeGhRVUZXTEVkQlFUQkNZeXhYUVVZMVFqdEJRVWRVVFN4elFrRkJWVzVDTEdGQlNFUTdRVUZKVkc5Q0xITkNRVUZYYWtJc1ZVRkJWVWdzWVVGQlZpeEhRVUV3UW1Fc1YwRktOVUk3UVVGTFZHNUNMRzFDUVVGUFR6dEJRVXhGTEZkQlFWZzdRVUZQUVN4alFVRkpSeXhMUVVGTFlpeExRVUZMY1VJc1RVRkJUQ3hIUVVGakxFTkJRVzVDTEVsQlFYZENiRUlzVFVGQlRXdENMRTFCUVU0c1NVRkJaMEoyUWl4UlFVRlJReXhQUVVGd1JDeEZRVUUyUkR0QlFVTXpSRHRCUVVOQkxHZENRVUZKSzBJc1owSkJRV2xDTEUxQlFVMURMRWxCUVU0c1EwRkJWM0pETEUxQlFWZ3NRMEZCY2tJN1FVRkRRU3huUWtGQlNYTkRMR2RDUVVGcFFpeE5RVUZOUkN4SlFVRk9MRU5CUVZkd1F5eE5RVUZZTEVOQlFYSkNPMEZCUTBFc1owSkJRVWxSTEUxQlFVMXJRaXhOUVVGT0xFbEJRV2RDTEVOQlFXaENMRWxCUVhGQ0xFTkJRVU5UTEdGQlFURkNMRVZCUVhsRE8wRkJRM1pETzBGQlEwRndRaXgxUWtGQlUzVkNMRTFCUVZRc1EwRkJaMEpTTEV0QlFVdEZMRkZCUVhKQ0xFVkJRU3RDTEVOQlFTOUNMRVZCUVd0RExEaENRVUZzUXp0QlFVTkVMR0ZCU0VRc1RVRkhUeXhKUVVGSkxFTkJRVU5ITEdGQlFVUXNTVUZCYTBJc1EwRkJRMFVzWVVGQmRrSXNSVUZCYzBNN1FVRkRNME4wUWl4MVFrRkJVMVFzU1VGQlZDeERRVUZqTERoQ1FVRmtPMEZCUTBRN1FVRkRSanRCUVVORVRTeG5Ra0ZCVFU0c1NVRkJUaXhEUVVGWGQwSXNTVUZCV0RzN1FVRkZRV3BDTERCQ1FVRm5RaXhEUVVGb1FqdEJRVU5CUXl3d1FrRkJaMElzUTBGQmFFSTdRVUZEUVVNc2NVSkJRVmNzUlVGQldEdEJRVU5FTzBGQlEwWTdRVUZEUkVNc2FVSkJRVmRTTEUxQlFVMXJRaXhOUVVGcVFqdEJRVU5CVkN4cFFrRkJWMVFzVFVGQlRXdENMRTFCUVdwQ08wRkJRMFE3UVVGMlJtOUhPenRCUVd0Q2RrY3NUMEZCU3l4SlFVRkpVaXhKUVVGSkxFTkJRV0lzUlVGQlowSkJMRWxCUVVsaUxFdEJRVXR4UWl4TlFVRjZRaXhGUVVGcFExSXNSMEZCYWtNc1JVRkJjME03UVVGQlFTd3lSRUZCTjBKQkxFTkJRVFpDTzBGQmMwVnlRenM3UVVGRlJDeFRRVUZQTzBGQlEweHlRaXhwUWtGQllVRXNWMEZFVWl4RlFVTnhRa01zWVVGQllVRXNWMEZFYkVNN1FVRkZURWNzWlVGQlYwRXNVMEZHVGl4RlFVVnBRa01zVjBGQlYwRXNVMEZHTlVJN1FVRkhURlVzVjBGQlQwRTdRVUZJUml4SFFVRlFPMEZCUzBRN08wRkJSVTBzVTBGQlUycENMRzFDUVVGVUxFTkJRVFpDUlN4WFFVRTNRaXhGUVVFd1EwTXNWMEZCTVVNc1JVRkJkVVJETEUxQlFYWkVMRVZCUVN0RVF5eE5RVUV2UkN4RlFVRjFSVU1zVTBGQmRrVXNSVUZCYTBaRExGTkJRV3hHTEVWQlFUWkdReXhQUVVFM1JpeEZRVUZ6Unp0QlFVTXpSeXhOUVVGTlJTeFBRVUZQV0N4blFrRkJaMEpITEZkQlFXaENMRVZCUVRaQ1F5eFhRVUUzUWl4RlFVRXdRME1zVFVGQk1VTXNSVUZCYTBSRExFMUJRV3hFTEVWQlFUQkVReXhUUVVFeFJDeEZRVUZ4UlVNc1UwRkJja1VzUlVGQlowWkRMRTlCUVdoR0xFTkJRV0k3TzBGQlJVRXNUVUZCVFc5RExFMUJRVTBzUlVGQldqdEJRVU5CTEUxQlFVa3hReXhsUVVGbFF5eFhRVUZ1UWl4RlFVRm5RenRCUVVNNVFubERMRkZCUVVscVF5eEpRVUZLTEVOQlFWTXNXVUZCV1ZRc1YwRkJja0k3UVVGRFJEdEJRVU5FTUVNc1RVRkJTV3BETEVsQlFVb3NRMEZCVXl4eFJVRkJWRHRCUVVOQmFVTXNUVUZCU1dwRExFbEJRVW9zUTBGQlV5eFRRVUZUUkN4TFFVRkxVaXhYUVVGa0xFbEJRVFpDTEU5QlFVOVJMRXRCUVV0S0xGTkJRVm9zUzBGQk1FSXNWMEZCTVVJc1IwRkJkME1zUlVGQmVFTXNSMEZCTmtNc1QwRkJUMGtzUzBGQlMwb3NVMEZCZEVZc1EwRkJWRHRCUVVOQmMwTXNUVUZCU1dwRExFbEJRVW9zUTBGQlV5eFRRVUZUUkN4TFFVRkxVQ3hYUVVGa0xFbEJRVFpDTEU5QlFVOVBMRXRCUVV0SUxGTkJRVm9zUzBGQk1FSXNWMEZCTVVJc1IwRkJkME1zUlVGQmVFTXNSMEZCTmtNc1QwRkJUMGNzUzBGQlMwZ3NVMEZCZEVZc1EwRkJWRHM3UVVGRlFTeFBRVUZMTEVsQlFVbG5RaXhKUVVGSkxFTkJRV0lzUlVGQlowSkJMRWxCUVVsaUxFdEJRVXRQTEV0QlFVd3NRMEZCVjJNc1RVRkJMMElzUlVGQmRVTlNMRWRCUVhaRExFVkJRVFJETzBGQlF6RkRMRkZCUVUxWkxFOUJRVTk2UWl4TFFVRkxUeXhMUVVGTUxFTkJRVmROTEVOQlFWZ3NRMEZCWWp0QlFVTkJjVUlzVVVGQlNXcERMRWxCUVVvc1EwRkRSU3hUUVVGVGQwSXNTMEZCUzBNc1VVRkJaQ3hIUVVGNVFpeEhRVUY2UWl4SFFVRXJRa1FzUzBGQlMwVXNVVUZCY0VNc1IwRkRSU3hKUVVSR0xFZEJRMU5HTEV0QlFVdEhMRkZCUkdRc1IwRkRlVUlzUjBGRWVrSXNSMEZESzBKSUxFdEJRVXRKTEZGQlJIQkRMRWRCUlVVc1MwRklTanRCUVV0QlN5eFJRVUZKYWtNc1NVRkJTaXhEUVVGVGEwTXNTMEZCVkN4RFFVRmxSQ3hIUVVGbUxFVkJRVzlDVkN4TFFVRkxkRUlzUzBGQmVrSTdRVUZEUkRzN1FVRkZSQ3hUUVVGUEswSXNTVUZCU1VVc1NVRkJTaXhEUVVGVExFbEJRVlFzU1VGQmFVSXNTVUZCZUVJN1FVRkRSRHM3UVVGRlRTeFRRVUZUTjBNc1YwRkJWQ3hEUVVGeFFqaERMRkZCUVhKQ0xFVkJRU3RDTTBNc1RVRkJMMElzUlVGQmRVTkRMRTFCUVhaRExFVkJRU3REUXl4VFFVRXZReXhGUVVFd1JFTXNVMEZCTVVRc1JVRkJjVVZETEU5QlFYSkZMRVZCUVRoRk8wRkJRMjVHTEZOQlFVOVNMRzlDUVVGdlFpdERMRkZCUVhCQ0xFVkJRVGhDUVN4UlFVRTVRaXhGUVVGM1F6TkRMRTFCUVhoRExFVkJRV2RFUXl4TlFVRm9SQ3hGUVVGM1JFTXNVMEZCZUVRc1JVRkJiVVZETEZOQlFXNUZMRVZCUVRoRlF5eFBRVUU1UlN4RFFVRlFPMEZCUTBRaUxDSm1hV3hsSWpvaVkzSmxZWFJsTG1weklpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lhVzF3YjNKMElIdGthV1ptVEdsdVpYTjlJR1p5YjIwZ0p5NHVMMlJwWm1ZdmJHbHVaU2M3WEc1Y2JtVjRjRzl5ZENCbWRXNWpkR2x2YmlCemRISjFZM1IxY21Wa1VHRjBZMmdvYjJ4a1JtbHNaVTVoYldVc0lHNWxkMFpwYkdWT1lXMWxMQ0J2YkdSVGRISXNJRzVsZDFOMGNpd2diMnhrU0dWaFpHVnlMQ0J1WlhkSVpXRmtaWElzSUc5d2RHbHZibk1wSUh0Y2JpQWdhV1lnS0NGdmNIUnBiMjV6S1NCN1hHNGdJQ0FnYjNCMGFXOXVjeUE5SUh0OU8xeHVJQ0I5WEc0Z0lHbG1JQ2gwZVhCbGIyWWdiM0IwYVc5dWN5NWpiMjUwWlhoMElEMDlQU0FuZFc1a1pXWnBibVZrSnlrZ2UxeHVJQ0FnSUc5d2RHbHZibk11WTI5dWRHVjRkQ0E5SURRN1hHNGdJSDFjYmx4dUlDQmpiMjV6ZENCa2FXWm1JRDBnWkdsbVpreHBibVZ6S0c5c1pGTjBjaXdnYm1WM1UzUnlMQ0J2Y0hScGIyNXpLVHRjYmlBZ1pHbG1aaTV3ZFhOb0tIdDJZV3gxWlRvZ0p5Y3NJR3hwYm1Wek9pQmJYWDBwT3lBZ0lDOHZJRUZ3Y0dWdVpDQmhiaUJsYlhCMGVTQjJZV3gxWlNCMGJ5QnRZV3RsSUdOc1pXRnVkWEFnWldGemFXVnlYRzVjYmlBZ1puVnVZM1JwYjI0Z1kyOXVkR1Y0ZEV4cGJtVnpLR3hwYm1WektTQjdYRzRnSUNBZ2NtVjBkWEp1SUd4cGJtVnpMbTFoY0NobWRXNWpkR2x2YmlobGJuUnllU2tnZXlCeVpYUjFjbTRnSnlBbklDc2daVzUwY25rN0lIMHBPMXh1SUNCOVhHNWNiaUFnYkdWMElHaDFibXR6SUQwZ1cxMDdYRzRnSUd4bGRDQnZiR1JTWVc1blpWTjBZWEowSUQwZ01Dd2dibVYzVW1GdVoyVlRkR0Z5ZENBOUlEQXNJR04xY2xKaGJtZGxJRDBnVzEwc1hHNGdJQ0FnSUNCdmJHUk1hVzVsSUQwZ01Td2dibVYzVEdsdVpTQTlJREU3WEc0Z0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2daR2xtWmk1c1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lHTnZibk4wSUdOMWNuSmxiblFnUFNCa2FXWm1XMmxkTEZ4dUlDQWdJQ0FnSUNBZ0lHeHBibVZ6SUQwZ1kzVnljbVZ1ZEM1c2FXNWxjeUI4ZkNCamRYSnlaVzUwTG5aaGJIVmxMbkpsY0d4aFkyVW9MMXhjYmlRdkxDQW5KeWt1YzNCc2FYUW9KMXhjYmljcE8xeHVJQ0FnSUdOMWNuSmxiblF1YkdsdVpYTWdQU0JzYVc1bGN6dGNibHh1SUNBZ0lHbG1JQ2hqZFhKeVpXNTBMbUZrWkdWa0lIeDhJR04xY25KbGJuUXVjbVZ0YjNabFpDa2dlMXh1SUNBZ0lDQWdMeThnU1dZZ2QyVWdhR0YyWlNCd2NtVjJhVzkxY3lCamIyNTBaWGgwTENCemRHRnlkQ0IzYVhSb0lIUm9ZWFJjYmlBZ0lDQWdJR2xtSUNnaGIyeGtVbUZ1WjJWVGRHRnlkQ2tnZTF4dUlDQWdJQ0FnSUNCamIyNXpkQ0J3Y21WMklEMGdaR2xtWmx0cElDMGdNVjA3WEc0Z0lDQWdJQ0FnSUc5c1pGSmhibWRsVTNSaGNuUWdQU0J2YkdSTWFXNWxPMXh1SUNBZ0lDQWdJQ0J1WlhkU1lXNW5aVk4wWVhKMElEMGdibVYzVEdsdVpUdGNibHh1SUNBZ0lDQWdJQ0JwWmlBb2NISmxkaWtnZTF4dUlDQWdJQ0FnSUNBZ0lHTjFjbEpoYm1kbElEMGdiM0IwYVc5dWN5NWpiMjUwWlhoMElENGdNQ0EvSUdOdmJuUmxlSFJNYVc1bGN5aHdjbVYyTG14cGJtVnpMbk5zYVdObEtDMXZjSFJwYjI1ekxtTnZiblJsZUhRcEtTQTZJRnRkTzF4dUlDQWdJQ0FnSUNBZ0lHOXNaRkpoYm1kbFUzUmhjblFnTFQwZ1kzVnlVbUZ1WjJVdWJHVnVaM1JvTzF4dUlDQWdJQ0FnSUNBZ0lHNWxkMUpoYm1kbFUzUmhjblFnTFQwZ1kzVnlVbUZ1WjJVdWJHVnVaM1JvTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDOHZJRTkxZEhCMWRDQnZkWElnWTJoaGJtZGxjMXh1SUNBZ0lDQWdZM1Z5VW1GdVoyVXVjSFZ6YUNndUxpNGdiR2x1WlhNdWJXRndLR1oxYm1OMGFXOXVLR1Z1ZEhKNUtTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQW9ZM1Z5Y21WdWRDNWhaR1JsWkNBL0lDY3JKeUE2SUNjdEp5a2dLeUJsYm5SeWVUdGNiaUFnSUNBZ0lIMHBLVHRjYmx4dUlDQWdJQ0FnTHk4Z1ZISmhZMnNnZEdobElIVndaR0YwWldRZ1ptbHNaU0J3YjNOcGRHbHZibHh1SUNBZ0lDQWdhV1lnS0dOMWNuSmxiblF1WVdSa1pXUXBJSHRjYmlBZ0lDQWdJQ0FnYm1WM1RHbHVaU0FyUFNCc2FXNWxjeTVzWlc1bmRHZzdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQnZiR1JNYVc1bElDczlJR3hwYm1WekxteGxibWQwYUR0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdMeThnU1dSbGJuUnBZMkZzSUdOdmJuUmxlSFFnYkdsdVpYTXVJRlJ5WVdOcklHeHBibVVnWTJoaGJtZGxjMXh1SUNBZ0lDQWdhV1lnS0c5c1pGSmhibWRsVTNSaGNuUXBJSHRjYmlBZ0lDQWdJQ0FnTHk4Z1EyeHZjMlVnYjNWMElHRnVlU0JqYUdGdVoyVnpJSFJvWVhRZ2FHRjJaU0JpWldWdUlHOTFkSEIxZENBb2IzSWdhbTlwYmlCdmRtVnliR0Z3Y0dsdVp5bGNiaUFnSUNBZ0lDQWdhV1lnS0d4cGJtVnpMbXhsYm1kMGFDQThQU0J2Y0hScGIyNXpMbU52Ym5SbGVIUWdLaUF5SUNZbUlHa2dQQ0JrYVdabUxteGxibWQwYUNBdElESXBJSHRjYmlBZ0lDQWdJQ0FnSUNBdkx5QlBkbVZ5YkdGd2NHbHVaMXh1SUNBZ0lDQWdJQ0FnSUdOMWNsSmhibWRsTG5CMWMyZ29MaTR1SUdOdmJuUmxlSFJNYVc1bGN5aHNhVzVsY3lrcE8xeHVJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJQzh2SUdWdVpDQjBhR1VnY21GdVoyVWdZVzVrSUc5MWRIQjFkRnh1SUNBZ0lDQWdJQ0FnSUd4bGRDQmpiMjUwWlhoMFUybDZaU0E5SUUxaGRHZ3ViV2x1S0d4cGJtVnpMbXhsYm1kMGFDd2diM0IwYVc5dWN5NWpiMjUwWlhoMEtUdGNiaUFnSUNBZ0lDQWdJQ0JqZFhKU1lXNW5aUzV3ZFhOb0tDNHVMaUJqYjI1MFpYaDBUR2x1WlhNb2JHbHVaWE11YzJ4cFkyVW9NQ3dnWTI5dWRHVjRkRk5wZW1VcEtTazdYRzVjYmlBZ0lDQWdJQ0FnSUNCc1pYUWdhSFZ1YXlBOUlIdGNiaUFnSUNBZ0lDQWdJQ0FnSUc5c1pGTjBZWEowT2lCdmJHUlNZVzVuWlZOMFlYSjBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ2IyeGtUR2x1WlhNNklDaHZiR1JNYVc1bElDMGdiMnhrVW1GdVoyVlRkR0Z5ZENBcklHTnZiblJsZUhSVGFYcGxLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lHNWxkMU4wWVhKME9pQnVaWGRTWVc1blpWTjBZWEowTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdibVYzVEdsdVpYTTZJQ2h1WlhkTWFXNWxJQzBnYm1WM1VtRnVaMlZUZEdGeWRDQXJJR052Ym5SbGVIUlRhWHBsS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJR3hwYm1Wek9pQmpkWEpTWVc1blpWeHVJQ0FnSUNBZ0lDQWdJSDA3WEc0Z0lDQWdJQ0FnSUNBZ2FXWWdLR2tnUGowZ1pHbG1aaTVzWlc1bmRHZ2dMU0F5SUNZbUlHeHBibVZ6TG14bGJtZDBhQ0E4UFNCdmNIUnBiMjV6TG1OdmJuUmxlSFFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUVWUFJpQnBjeUJwYm5OcFpHVWdkR2hwY3lCb2RXNXJYRzRnSUNBZ0lDQWdJQ0FnSUNCc1pYUWdiMnhrUlU5R1RtVjNiR2x1WlNBOUlDZ3ZYRnh1SkM4dWRHVnpkQ2h2YkdSVGRISXBLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHeGxkQ0J1WlhkRlQwWk9aWGRzYVc1bElEMGdLQzljWEc0a0x5NTBaWE4wS0c1bGQxTjBjaWtwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0d4cGJtVnpMbXhsYm1kMGFDQTlQU0F3SUNZbUlDRnZiR1JGVDBaT1pYZHNhVzVsS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklITndaV05wWVd3Z1kyRnpaVG9nYjJ4a0lHaGhjeUJ1YnlCbGIyd2dZVzVrSUc1dklIUnlZV2xzYVc1bklHTnZiblJsZUhRN0lHNXZMVzVzSUdOaGJpQmxibVFnZFhBZ1ltVm1iM0psSUdGa1pITmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ1kzVnlVbUZ1WjJVdWMzQnNhV05sS0doMWJtc3ViMnhrVEdsdVpYTXNJREFzSUNkY1hGeGNJRTV2SUc1bGQyeHBibVVnWVhRZ1pXNWtJRzltSUdacGJHVW5LVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCcFppQW9JVzlzWkVWUFJrNWxkMnhwYm1VZ2ZId2dJVzVsZDBWUFJrNWxkMnhwYm1VcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ1kzVnlVbUZ1WjJVdWNIVnphQ2duWEZ4Y1hDQk9ieUJ1Wlhkc2FXNWxJR0YwSUdWdVpDQnZaaUJtYVd4bEp5azdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUdoMWJtdHpMbkIxYzJnb2FIVnVheWs3WEc1Y2JpQWdJQ0FnSUNBZ0lDQnZiR1JTWVc1blpWTjBZWEowSUQwZ01EdGNiaUFnSUNBZ0lDQWdJQ0J1WlhkU1lXNW5aVk4wWVhKMElEMGdNRHRjYmlBZ0lDQWdJQ0FnSUNCamRYSlNZVzVuWlNBOUlGdGRPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0J2YkdSTWFXNWxJQ3M5SUd4cGJtVnpMbXhsYm1kMGFEdGNiaUFnSUNBZ0lHNWxkMHhwYm1VZ0t6MGdiR2x1WlhNdWJHVnVaM1JvTzF4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUhKbGRIVnliaUI3WEc0Z0lDQWdiMnhrUm1sc1pVNWhiV1U2SUc5c1pFWnBiR1ZPWVcxbExDQnVaWGRHYVd4bFRtRnRaVG9nYm1WM1JtbHNaVTVoYldVc1hHNGdJQ0FnYjJ4a1NHVmhaR1Z5T2lCdmJHUklaV0ZrWlhJc0lHNWxkMGhsWVdSbGNqb2dibVYzU0dWaFpHVnlMRnh1SUNBZ0lHaDFibXR6T2lCb2RXNXJjMXh1SUNCOU8xeHVmVnh1WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWTNKbFlYUmxWSGR2Um1sc1pYTlFZWFJqYUNodmJHUkdhV3hsVG1GdFpTd2dibVYzUm1sc1pVNWhiV1VzSUc5c1pGTjBjaXdnYm1WM1UzUnlMQ0J2YkdSSVpXRmtaWElzSUc1bGQwaGxZV1JsY2l3Z2IzQjBhVzl1Y3lrZ2UxeHVJQ0JqYjI1emRDQmthV1ptSUQwZ2MzUnlkV04wZFhKbFpGQmhkR05vS0c5c1pFWnBiR1ZPWVcxbExDQnVaWGRHYVd4bFRtRnRaU3dnYjJ4a1UzUnlMQ0J1WlhkVGRISXNJRzlzWkVobFlXUmxjaXdnYm1WM1NHVmhaR1Z5TENCdmNIUnBiMjV6S1R0Y2JseHVJQ0JqYjI1emRDQnlaWFFnUFNCYlhUdGNiaUFnYVdZZ0tHOXNaRVpwYkdWT1lXMWxJRDA5SUc1bGQwWnBiR1ZPWVcxbEtTQjdYRzRnSUNBZ2NtVjBMbkIxYzJnb0owbHVaR1Y0T2lBbklDc2diMnhrUm1sc1pVNWhiV1VwTzF4dUlDQjlYRzRnSUhKbGRDNXdkWE5vS0NjOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlKeWs3WEc0Z0lISmxkQzV3ZFhOb0tDY3RMUzBnSnlBcklHUnBabVl1YjJ4a1JtbHNaVTVoYldVZ0t5QW9kSGx3Wlc5bUlHUnBabVl1YjJ4a1NHVmhaR1Z5SUQwOVBTQW5kVzVrWldacGJtVmtKeUEvSUNjbklEb2dKMXhjZENjZ0t5QmthV1ptTG05c1pFaGxZV1JsY2lrcE8xeHVJQ0J5WlhRdWNIVnphQ2duS3lzcklDY2dLeUJrYVdabUxtNWxkMFpwYkdWT1lXMWxJQ3NnS0hSNWNHVnZaaUJrYVdabUxtNWxkMGhsWVdSbGNpQTlQVDBnSjNWdVpHVm1hVzVsWkNjZ1B5QW5KeUE2SUNkY1hIUW5JQ3NnWkdsbVppNXVaWGRJWldGa1pYSXBLVHRjYmx4dUlDQm1iM0lnS0d4bGRDQnBJRDBnTURzZ2FTQThJR1JwWm1ZdWFIVnVhM011YkdWdVozUm9PeUJwS3lzcElIdGNiaUFnSUNCamIyNXpkQ0JvZFc1cklEMGdaR2xtWmk1b2RXNXJjMXRwWFR0Y2JpQWdJQ0J5WlhRdWNIVnphQ2hjYmlBZ0lDQWdJQ2RBUUNBdEp5QXJJR2gxYm1zdWIyeGtVM1JoY25RZ0t5QW5MQ2NnS3lCb2RXNXJMbTlzWkV4cGJtVnpYRzRnSUNBZ0lDQXJJQ2NnS3ljZ0t5Qm9kVzVyTG01bGQxTjBZWEowSUNzZ0p5d25JQ3NnYUhWdWF5NXVaWGRNYVc1bGMxeHVJQ0FnSUNBZ0t5QW5JRUJBSjF4dUlDQWdJQ2s3WEc0Z0lDQWdjbVYwTG5CMWMyZ3VZWEJ3Ykhrb2NtVjBMQ0JvZFc1ckxteHBibVZ6S1R0Y2JpQWdmVnh1WEc0Z0lISmxkSFZ5YmlCeVpYUXVhbTlwYmlnblhGeHVKeWtnS3lBblhGeHVKenRjYm4xY2JseHVaWGh3YjNKMElHWjFibU4wYVc5dUlHTnlaV0YwWlZCaGRHTm9LR1pwYkdWT1lXMWxMQ0J2YkdSVGRISXNJRzVsZDFOMGNpd2diMnhrU0dWaFpHVnlMQ0J1WlhkSVpXRmtaWElzSUc5d2RHbHZibk1wSUh0Y2JpQWdjbVYwZFhKdUlHTnlaV0YwWlZSM2IwWnBiR1Z6VUdGMFkyZ29abWxzWlU1aGJXVXNJR1pwYkdWT1lXMWxMQ0J2YkdSVGRISXNJRzVsZDFOMGNpd2diMnhrU0dWaFpHVnlMQ0J1WlhkSVpXRmtaWElzSUc5d2RHbHZibk1wTzF4dWZWeHVJbDE5XG5cblxuLyoqKi8gfSksXG4vKiAxNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cInVzZSBzdHJpY3RcIjtcblxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRleHBvcnRzLiAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL2FycmF5RXF1YWwgPSBhcnJheUVxdWFsO1xuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovZXhwb3J0cy4gLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9hcnJheVN0YXJ0c1dpdGggPSBhcnJheVN0YXJ0c1dpdGg7XG5cdGZ1bmN0aW9uIGFycmF5RXF1YWwoYSwgYikge1xuXHQgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcblx0ICAgIHJldHVybiBmYWxzZTtcblx0ICB9XG5cblx0ICByZXR1cm4gYXJyYXlTdGFydHNXaXRoKGEsIGIpO1xuXHR9XG5cblx0ZnVuY3Rpb24gYXJyYXlTdGFydHNXaXRoKGFycmF5LCBzdGFydCkge1xuXHQgIGlmIChzdGFydC5sZW5ndGggPiBhcnJheS5sZW5ndGgpIHtcblx0ICAgIHJldHVybiBmYWxzZTtcblx0ICB9XG5cblx0ICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXJ0Lmxlbmd0aDsgaSsrKSB7XG5cdCAgICBpZiAoc3RhcnRbaV0gIT09IGFycmF5W2ldKSB7XG5cdCAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICByZXR1cm4gdHJ1ZTtcblx0fVxuXHQvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTkxZEdsc0wyRnljbUY1TG1weklsMHNJbTVoYldWeklqcGJJbUZ5Y21GNVJYRjFZV3dpTENKaGNuSmhlVk4wWVhKMGMxZHBkR2dpTENKaElpd2lZaUlzSW14bGJtZDBhQ0lzSW1GeWNtRjVJaXdpYzNSaGNuUWlMQ0pwSWwwc0ltMWhjSEJwYm1keklqb2lPenM3WjBOQlFXZENRU3hWTEVkQlFVRkJMRlU3ZVVSQlVVRkRMR1VzUjBGQlFVRXNaVHRCUVZKVUxGTkJRVk5FTEZWQlFWUXNRMEZCYjBKRkxFTkJRWEJDTEVWQlFYVkNReXhEUVVGMlFpeEZRVUV3UWp0QlFVTXZRaXhOUVVGSlJDeEZRVUZGUlN4TlFVRkdMRXRCUVdGRUxFVkJRVVZETEUxQlFXNUNMRVZCUVRKQ08wRkJRM3BDTEZkQlFVOHNTMEZCVUR0QlFVTkVPenRCUVVWRUxGTkJRVTlJTEdkQ1FVRm5Ra01zUTBGQmFFSXNSVUZCYlVKRExFTkJRVzVDTEVOQlFWQTdRVUZEUkRzN1FVRkZUU3hUUVVGVFJpeGxRVUZVTEVOQlFYbENTU3hMUVVGNlFpeEZRVUZuUTBNc1MwRkJhRU1zUlVGQmRVTTdRVUZETlVNc1RVRkJTVUVzVFVGQlRVWXNUVUZCVGl4SFFVRmxReXhOUVVGTlJDeE5RVUY2UWl4RlFVRnBRenRCUVVNdlFpeFhRVUZQTEV0QlFWQTdRVUZEUkRzN1FVRkZSQ3hQUVVGTExFbEJRVWxITEVsQlFVa3NRMEZCWWl4RlFVRm5Ra0VzU1VGQlNVUXNUVUZCVFVZc1RVRkJNVUlzUlVGQmEwTkhMRWRCUVd4RExFVkJRWFZETzBGQlEzSkRMRkZCUVVsRUxFMUJRVTFETEVOQlFVNHNUVUZCWVVZc1RVRkJUVVVzUTBGQlRpeERRVUZxUWl4RlFVRXlRanRCUVVONlFpeGhRVUZQTEV0QlFWQTdRVUZEUkR0QlFVTkdPenRCUVVWRUxGTkJRVThzU1VGQlVEdEJRVU5FSWl3aVptbHNaU0k2SW1GeWNtRjVMbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaVpYaHdiM0owSUdaMWJtTjBhVzl1SUdGeWNtRjVSWEYxWVd3b1lTd2dZaWtnZTF4dUlDQnBaaUFvWVM1c1pXNW5kR2dnSVQwOUlHSXViR1Z1WjNSb0tTQjdYRzRnSUNBZ2NtVjBkWEp1SUdaaGJITmxPMXh1SUNCOVhHNWNiaUFnY21WMGRYSnVJR0Z5Y21GNVUzUmhjblJ6VjJsMGFDaGhMQ0JpS1R0Y2JuMWNibHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR0Z5Y21GNVUzUmhjblJ6VjJsMGFDaGhjbkpoZVN3Z2MzUmhjblFwSUh0Y2JpQWdhV1lnS0hOMFlYSjBMbXhsYm1kMGFDQStJR0Z5Y21GNUxteGxibWQwYUNrZ2UxeHVJQ0FnSUhKbGRIVnliaUJtWVd4elpUdGNiaUFnZlZ4dVhHNGdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnYzNSaGNuUXViR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0JwWmlBb2MzUmhjblJiYVYwZ0lUMDlJR0Z5Y21GNVcybGRLU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdabUZzYzJVN1hHNGdJQ0FnZlZ4dUlDQjlYRzVjYmlBZ2NtVjBkWEp1SUhSeWRXVTdYRzU5WEc0aVhYMD1cblxuXG4vKioqLyB9KSxcbi8qIDE2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Lyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1widXNlIHN0cmljdFwiO1xuXG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovY29udmVydENoYW5nZXNUb0RNUCA9IGNvbnZlcnRDaGFuZ2VzVG9ETVA7XG5cdC8vIFNlZTogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZS1kaWZmLW1hdGNoLXBhdGNoL3dpa2kvQVBJXG5cdGZ1bmN0aW9uIGNvbnZlcnRDaGFuZ2VzVG9ETVAoY2hhbmdlcykge1xuXHQgIHZhciByZXQgPSBbXSxcblx0ICAgICAgY2hhbmdlID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZvaWQgMCAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLyxcblx0ICAgICAgb3BlcmF0aW9uID0gLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL3ZvaWQgMCAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqLztcblx0ICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoOyBpKyspIHtcblx0ICAgIGNoYW5nZSA9IGNoYW5nZXNbaV07XG5cdCAgICBpZiAoY2hhbmdlLmFkZGVkKSB7XG5cdCAgICAgIG9wZXJhdGlvbiA9IDE7XG5cdCAgICB9IGVsc2UgaWYgKGNoYW5nZS5yZW1vdmVkKSB7XG5cdCAgICAgIG9wZXJhdGlvbiA9IC0xO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgb3BlcmF0aW9uID0gMDtcblx0ICAgIH1cblxuXHQgICAgcmV0LnB1c2goW29wZXJhdGlvbiwgY2hhbmdlLnZhbHVlXSk7XG5cdCAgfVxuXHQgIHJldHVybiByZXQ7XG5cdH1cblx0Ly8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5amIyNTJaWEowTDJSdGNDNXFjeUpkTENKdVlXMWxjeUk2V3lKamIyNTJaWEowUTJoaGJtZGxjMVJ2UkUxUUlpd2lZMmhoYm1kbGN5SXNJbkpsZENJc0ltTm9ZVzVuWlNJc0ltOXdaWEpoZEdsdmJpSXNJbWtpTENKc1pXNW5kR2dpTENKaFpHUmxaQ0lzSW5KbGJXOTJaV1FpTENKd2RYTm9JaXdpZG1Gc2RXVWlYU3dpYldGd2NHbHVaM01pT2lJN096dG5RMEZEWjBKQkxHMUNMRWRCUVVGQkxHMUNPMEZCUkdoQ08wRkJRMDhzVTBGQlUwRXNiVUpCUVZRc1EwRkJOa0pETEU5QlFUZENMRVZCUVhORE8wRkJRek5ETEUxQlFVbERMRTFCUVUwc1JVRkJWanRCUVVGQkxFMUJRMGxETEhkRFFVUktPMEZCUVVFc1RVRkZTVU1zTWtOQlJrbzdRVUZIUVN4UFFVRkxMRWxCUVVsRExFbEJRVWtzUTBGQllpeEZRVUZuUWtFc1NVRkJTVW9zVVVGQlVVc3NUVUZCTlVJc1JVRkJiME5FTEVkQlFYQkRMRVZCUVhsRE8wRkJRM1pEUml4aFFVRlRSaXhSUVVGUlNTeERRVUZTTEVOQlFWUTdRVUZEUVN4UlFVRkpSaXhQUVVGUFNTeExRVUZZTEVWQlFXdENPMEZCUTJoQ1NDeHJRa0ZCV1N4RFFVRmFPMEZCUTBRc1MwRkdSQ3hOUVVWUExFbEJRVWxFTEU5QlFVOUxMRTlCUVZnc1JVRkJiMEk3UVVGRGVrSktMR3RDUVVGWkxFTkJRVU1zUTBGQllqdEJRVU5FTEV0QlJrMHNUVUZGUVR0QlFVTk1RU3hyUWtGQldTeERRVUZhTzBGQlEwUTdPMEZCUlVSR0xGRkJRVWxQTEVsQlFVb3NRMEZCVXl4RFFVRkRUQ3hUUVVGRUxFVkJRVmxFTEU5QlFVOVBMRXRCUVc1Q0xFTkJRVlE3UVVGRFJEdEJRVU5FTEZOQlFVOVNMRWRCUVZBN1FVRkRSQ0lzSW1acGJHVWlPaUprYlhBdWFuTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUl2THlCVFpXVTZJR2gwZEhBNkx5OWpiMlJsTG1kdmIyZHNaUzVqYjIwdmNDOW5iMjluYkdVdFpHbG1aaTF0WVhSamFDMXdZWFJqYUM5M2FXdHBMMEZRU1Z4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUdOdmJuWmxjblJEYUdGdVoyVnpWRzlFVFZBb1kyaGhibWRsY3lrZ2UxeHVJQ0JzWlhRZ2NtVjBJRDBnVzEwc1hHNGdJQ0FnSUNCamFHRnVaMlVzWEc0Z0lDQWdJQ0J2Y0dWeVlYUnBiMjQ3WEc0Z0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dZMmhoYm1kbGN5NXNaVzVuZEdnN0lHa3JLeWtnZTF4dUlDQWdJR05vWVc1blpTQTlJR05vWVc1blpYTmJhVjA3WEc0Z0lDQWdhV1lnS0dOb1lXNW5aUzVoWkdSbFpDa2dlMXh1SUNBZ0lDQWdiM0JsY21GMGFXOXVJRDBnTVR0Y2JpQWdJQ0I5SUdWc2MyVWdhV1lnS0dOb1lXNW5aUzV5WlcxdmRtVmtLU0I3WEc0Z0lDQWdJQ0J2Y0dWeVlYUnBiMjRnUFNBdE1UdGNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnYjNCbGNtRjBhVzl1SUQwZ01EdGNiaUFnSUNCOVhHNWNiaUFnSUNCeVpYUXVjSFZ6YUNoYmIzQmxjbUYwYVc5dUxDQmphR0Z1WjJVdWRtRnNkV1ZkS1R0Y2JpQWdmVnh1SUNCeVpYUjFjbTRnY21WME8xeHVmVnh1SWwxOVxuXG5cbi8qKiovIH0pLFxuLyogMTcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovJ3VzZSBzdHJpY3QnO1xuXG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdGV4cG9ydHMuIC8qaXN0YW5idWwgaWdub3JlIGVuZCovY29udmVydENoYW5nZXNUb1hNTCA9IGNvbnZlcnRDaGFuZ2VzVG9YTUw7XG5cdGZ1bmN0aW9uIGNvbnZlcnRDaGFuZ2VzVG9YTUwoY2hhbmdlcykge1xuXHQgIHZhciByZXQgPSBbXTtcblx0ICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoOyBpKyspIHtcblx0ICAgIHZhciBjaGFuZ2UgPSBjaGFuZ2VzW2ldO1xuXHQgICAgaWYgKGNoYW5nZS5hZGRlZCkge1xuXHQgICAgICByZXQucHVzaCgnPGlucz4nKTtcblx0ICAgIH0gZWxzZSBpZiAoY2hhbmdlLnJlbW92ZWQpIHtcblx0ICAgICAgcmV0LnB1c2goJzxkZWw+Jyk7XG5cdCAgICB9XG5cblx0ICAgIHJldC5wdXNoKGVzY2FwZUhUTUwoY2hhbmdlLnZhbHVlKSk7XG5cblx0ICAgIGlmIChjaGFuZ2UuYWRkZWQpIHtcblx0ICAgICAgcmV0LnB1c2goJzwvaW5zPicpO1xuXHQgICAgfSBlbHNlIGlmIChjaGFuZ2UucmVtb3ZlZCkge1xuXHQgICAgICByZXQucHVzaCgnPC9kZWw+Jyk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIHJldHVybiByZXQuam9pbignJyk7XG5cdH1cblxuXHRmdW5jdGlvbiBlc2NhcGVIVE1MKHMpIHtcblx0ICB2YXIgbiA9IHM7XG5cdCAgbiA9IG4ucmVwbGFjZSgvJi9nLCAnJmFtcDsnKTtcblx0ICBuID0gbi5yZXBsYWNlKC88L2csICcmbHQ7Jyk7XG5cdCAgbiA9IG4ucmVwbGFjZSgvPi9nLCAnJmd0OycpO1xuXHQgIG4gPSBuLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKTtcblxuXHQgIHJldHVybiBuO1xuXHR9XG5cdC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OWpiMjUyWlhKMEwzaHRiQzVxY3lKZExDSnVZVzFsY3lJNld5SmpiMjUyWlhKMFEyaGhibWRsYzFSdldFMU1JaXdpWTJoaGJtZGxjeUlzSW5KbGRDSXNJbWtpTENKc1pXNW5kR2dpTENKamFHRnVaMlVpTENKaFpHUmxaQ0lzSW5CMWMyZ2lMQ0p5WlcxdmRtVmtJaXdpWlhOallYQmxTRlJOVENJc0luWmhiSFZsSWl3aWFtOXBiaUlzSW5NaUxDSnVJaXdpY21Wd2JHRmpaU0pkTENKdFlYQndhVzVuY3lJNklqczdPMmREUVVGblFrRXNiVUlzUjBGQlFVRXNiVUk3UVVGQlZDeFRRVUZUUVN4dFFrRkJWQ3hEUVVFMlFrTXNUMEZCTjBJc1JVRkJjME03UVVGRE0wTXNUVUZCU1VNc1RVRkJUU3hGUVVGV08wRkJRMEVzVDBGQlN5eEpRVUZKUXl4SlFVRkpMRU5CUVdJc1JVRkJaMEpCTEVsQlFVbEdMRkZCUVZGSExFMUJRVFZDTEVWQlFXOURSQ3hIUVVGd1F5eEZRVUY1UXp0QlFVTjJReXhSUVVGSlJTeFRRVUZUU2l4UlFVRlJSU3hEUVVGU0xFTkJRV0k3UVVGRFFTeFJRVUZKUlN4UFFVRlBReXhMUVVGWUxFVkJRV3RDTzBGQlEyaENTaXhWUVVGSlN5eEpRVUZLTEVOQlFWTXNUMEZCVkR0QlFVTkVMRXRCUmtRc1RVRkZUeXhKUVVGSlJpeFBRVUZQUnl4UFFVRllMRVZCUVc5Q08wRkJRM3BDVGl4VlFVRkpTeXhKUVVGS0xFTkJRVk1zVDBGQlZEdEJRVU5FT3p0QlFVVkVUQ3hSUVVGSlN5eEpRVUZLTEVOQlFWTkZMRmRCUVZkS0xFOUJRVTlMTEV0QlFXeENMRU5CUVZRN08wRkJSVUVzVVVGQlNVd3NUMEZCVDBNc1MwRkJXQ3hGUVVGclFqdEJRVU5vUWtvc1ZVRkJTVXNzU1VGQlNpeERRVUZUTEZGQlFWUTdRVUZEUkN4TFFVWkVMRTFCUlU4c1NVRkJTVVlzVDBGQlQwY3NUMEZCV0N4RlFVRnZRanRCUVVONlFrNHNWVUZCU1Vzc1NVRkJTaXhEUVVGVExGRkJRVlE3UVVGRFJEdEJRVU5HTzBGQlEwUXNVMEZCVDB3c1NVRkJTVk1zU1VGQlNpeERRVUZUTEVWQlFWUXNRMEZCVUR0QlFVTkVPenRCUVVWRUxGTkJRVk5HTEZWQlFWUXNRMEZCYjBKSExFTkJRWEJDTEVWQlFYVkNPMEZCUTNKQ0xFMUJRVWxETEVsQlFVbEVMRU5CUVZJN1FVRkRRVU1zVFVGQlNVRXNSVUZCUlVNc1QwRkJSaXhEUVVGVkxFbEJRVllzUlVGQlowSXNUMEZCYUVJc1EwRkJTanRCUVVOQlJDeE5RVUZKUVN4RlFVRkZReXhQUVVGR0xFTkJRVlVzU1VGQlZpeEZRVUZuUWl4TlFVRm9RaXhEUVVGS08wRkJRMEZFTEUxQlFVbEJMRVZCUVVWRExFOUJRVVlzUTBGQlZTeEpRVUZXTEVWQlFXZENMRTFCUVdoQ0xFTkJRVW83UVVGRFFVUXNUVUZCU1VFc1JVRkJSVU1zVDBGQlJpeERRVUZWTEVsQlFWWXNSVUZCWjBJc1VVRkJhRUlzUTBGQlNqczdRVUZGUVN4VFFVRlBSQ3hEUVVGUU8wRkJRMFFpTENKbWFXeGxJam9pZUcxc0xtcHpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpWlhod2IzSjBJR1oxYm1OMGFXOXVJR052Ym5abGNuUkRhR0Z1WjJWelZHOVlUVXdvWTJoaGJtZGxjeWtnZTF4dUlDQnNaWFFnY21WMElEMGdXMTA3WEc0Z0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dZMmhoYm1kbGN5NXNaVzVuZEdnN0lHa3JLeWtnZTF4dUlDQWdJR3hsZENCamFHRnVaMlVnUFNCamFHRnVaMlZ6VzJsZE8xeHVJQ0FnSUdsbUlDaGphR0Z1WjJVdVlXUmtaV1FwSUh0Y2JpQWdJQ0FnSUhKbGRDNXdkWE5vS0NjOGFXNXpQaWNwTzF4dUlDQWdJSDBnWld4elpTQnBaaUFvWTJoaGJtZGxMbkpsYlc5MlpXUXBJSHRjYmlBZ0lDQWdJSEpsZEM1d2RYTm9LQ2M4WkdWc1BpY3BPMXh1SUNBZ0lIMWNibHh1SUNBZ0lISmxkQzV3ZFhOb0tHVnpZMkZ3WlVoVVRVd29ZMmhoYm1kbExuWmhiSFZsS1NrN1hHNWNiaUFnSUNCcFppQW9ZMmhoYm1kbExtRmtaR1ZrS1NCN1hHNGdJQ0FnSUNCeVpYUXVjSFZ6YUNnblBDOXBibk0rSnlrN1hHNGdJQ0FnZlNCbGJITmxJR2xtSUNoamFHRnVaMlV1Y21WdGIzWmxaQ2tnZTF4dUlDQWdJQ0FnY21WMExuQjFjMmdvSnp3dlpHVnNQaWNwTzF4dUlDQWdJSDFjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdjbVYwTG1wdmFXNG9KeWNwTzF4dWZWeHVYRzVtZFc1amRHbHZiaUJsYzJOaGNHVklWRTFNS0hNcElIdGNiaUFnYkdWMElHNGdQU0J6TzF4dUlDQnVJRDBnYmk1eVpYQnNZV05sS0M4bUwyY3NJQ2NtWVcxd095Y3BPMXh1SUNCdUlEMGdiaTV5WlhCc1lXTmxLQzg4TDJjc0lDY21iSFE3SnlrN1hHNGdJRzRnUFNCdUxuSmxjR3hoWTJVb0x6NHZaeXdnSnlabmREc25LVHRjYmlBZ2JpQTlJRzR1Y21Wd2JHRmpaU2d2WENJdlp5d2dKeVp4ZFc5ME95Y3BPMXh1WEc0Z0lISmxkSFZ5YmlCdU8xeHVmVnh1SWwxOVxuXG5cbi8qKiovIH0pXG4vKioqKioqLyBdKVxufSk7XG47XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvZGlmZi9kaXN0L2RpZmYuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL2RpZmYvZGlzdC9kaWZmLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCIoZnVuY3Rpb24gKGdsb2JhbCwgdW5kZWZpbmVkKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBpZiAoZ2xvYmFsLnNldEltbWVkaWF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5leHRIYW5kbGUgPSAxOyAvLyBTcGVjIHNheXMgZ3JlYXRlciB0aGFuIHplcm9cbiAgICB2YXIgdGFza3NCeUhhbmRsZSA9IHt9O1xuICAgIHZhciBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICB2YXIgZG9jID0gZ2xvYmFsLmRvY3VtZW50O1xuICAgIHZhciByZWdpc3RlckltbWVkaWF0ZTtcblxuICAgIGZ1bmN0aW9uIHNldEltbWVkaWF0ZShjYWxsYmFjaykge1xuICAgICAgLy8gQ2FsbGJhY2sgY2FuIGVpdGhlciBiZSBhIGZ1bmN0aW9uIG9yIGEgc3RyaW5nXG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBuZXcgRnVuY3Rpb24oXCJcIiArIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIC8vIENvcHkgZnVuY3Rpb24gYXJndW1lbnRzXG4gICAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAxXTtcbiAgICAgIH1cbiAgICAgIC8vIFN0b3JlIGFuZCByZWdpc3RlciB0aGUgdGFza1xuICAgICAgdmFyIHRhc2sgPSB7IGNhbGxiYWNrOiBjYWxsYmFjaywgYXJnczogYXJncyB9O1xuICAgICAgdGFza3NCeUhhbmRsZVtuZXh0SGFuZGxlXSA9IHRhc2s7XG4gICAgICByZWdpc3RlckltbWVkaWF0ZShuZXh0SGFuZGxlKTtcbiAgICAgIHJldHVybiBuZXh0SGFuZGxlKys7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaGFuZGxlKSB7XG4gICAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuKHRhc2spIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdGFzay5jYWxsYmFjaztcbiAgICAgICAgdmFyIGFyZ3MgPSB0YXNrLmFyZ3M7XG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuSWZQcmVzZW50KGhhbmRsZSkge1xuICAgICAgICAvLyBGcm9tIHRoZSBzcGVjOiBcIldhaXQgdW50aWwgYW55IGludm9jYXRpb25zIG9mIHRoaXMgYWxnb3JpdGhtIHN0YXJ0ZWQgYmVmb3JlIHRoaXMgb25lIGhhdmUgY29tcGxldGVkLlwiXG4gICAgICAgIC8vIFNvIGlmIHdlJ3JlIGN1cnJlbnRseSBydW5uaW5nIGEgdGFzaywgd2UnbGwgbmVlZCB0byBkZWxheSB0aGlzIGludm9jYXRpb24uXG4gICAgICAgIGlmIChjdXJyZW50bHlSdW5uaW5nQVRhc2spIHtcbiAgICAgICAgICAgIC8vIERlbGF5IGJ5IGRvaW5nIGEgc2V0VGltZW91dC4gc2V0SW1tZWRpYXRlIHdhcyB0cmllZCBpbnN0ZWFkLCBidXQgaW4gRmlyZWZveCA3IGl0IGdlbmVyYXRlZCBhXG4gICAgICAgICAgICAvLyBcInRvbyBtdWNoIHJlY3Vyc2lvblwiIGVycm9yLlxuICAgICAgICAgICAgc2V0VGltZW91dChydW5JZlByZXNlbnQsIDAsIGhhbmRsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdGFzayA9IHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICAgICAgICAgIGlmICh0YXNrKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBydW4odGFzayk7XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbW1lZGlhdGUoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHsgcnVuSWZQcmVzZW50KGhhbmRsZSk7IH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhblVzZVBvc3RNZXNzYWdlKCkge1xuICAgICAgICAvLyBUaGUgdGVzdCBhZ2FpbnN0IGBpbXBvcnRTY3JpcHRzYCBwcmV2ZW50cyB0aGlzIGltcGxlbWVudGF0aW9uIGZyb20gYmVpbmcgaW5zdGFsbGVkIGluc2lkZSBhIHdlYiB3b3JrZXIsXG4gICAgICAgIC8vIHdoZXJlIGBnbG9iYWwucG9zdE1lc3NhZ2VgIG1lYW5zIHNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudCBhbmQgY2FuJ3QgYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLlxuICAgICAgICBpZiAoZ2xvYmFsLnBvc3RNZXNzYWdlICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIG9sZE9uTWVzc2FnZSA9IGdsb2JhbC5vbm1lc3NhZ2U7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IGZhbHNlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShcIlwiLCBcIipcIik7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gb2xkT25NZXNzYWdlO1xuICAgICAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgLy8gSW5zdGFsbHMgYW4gZXZlbnQgaGFuZGxlciBvbiBgZ2xvYmFsYCBmb3IgdGhlIGBtZXNzYWdlYCBldmVudDogc2VlXG4gICAgICAgIC8vICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vRE9NL3dpbmRvdy5wb3N0TWVzc2FnZVxuICAgICAgICAvLyAqIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL2NvbW1zLmh0bWwjY3Jvc3NEb2N1bWVudE1lc3NhZ2VzXG5cbiAgICAgICAgdmFyIG1lc3NhZ2VQcmVmaXggPSBcInNldEltbWVkaWF0ZSRcIiArIE1hdGgucmFuZG9tKCkgKyBcIiRcIjtcbiAgICAgICAgdmFyIG9uR2xvYmFsTWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlID09PSBnbG9iYWwgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEuaW5kZXhPZihtZXNzYWdlUHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJ1bklmUHJlc2VudCgrZXZlbnQuZGF0YS5zbGljZShtZXNzYWdlUHJlZml4Lmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSwgZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2xvYmFsLmF0dGFjaEV2ZW50KFwib25tZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKG1lc3NhZ2VQcmVmaXggKyBoYW5kbGUsIFwiKlwiKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGV2ZW50LmRhdGE7XG4gICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZShoYW5kbGUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBodG1sID0gZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIDxzY3JpcHQ+IGVsZW1lbnQ7IGl0cyByZWFkeXN0YXRlY2hhbmdlIGV2ZW50IHdpbGwgYmUgZmlyZWQgYXN5bmNocm9ub3VzbHkgb25jZSBpdCBpcyBpbnNlcnRlZFxuICAgICAgICAgICAgLy8gaW50byB0aGUgZG9jdW1lbnQuIERvIHNvLCB0aHVzIHF1ZXVpbmcgdXAgdGhlIHRhc2suIFJlbWVtYmVyIHRvIGNsZWFuIHVwIG9uY2UgaXQncyBiZWVuIGNhbGxlZC5cbiAgICAgICAgICAgIHZhciBzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaHRtbC5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIHNjcmlwdCA9IG51bGw7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaHRtbC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwgMCwgaGFuZGxlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJZiBzdXBwb3J0ZWQsIHdlIHNob3VsZCBhdHRhY2ggdG8gdGhlIHByb3RvdHlwZSBvZiBnbG9iYWwsIHNpbmNlIHRoYXQgaXMgd2hlcmUgc2V0VGltZW91dCBldCBhbC4gbGl2ZS5cbiAgICB2YXIgYXR0YWNoVG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKGdsb2JhbCk7XG4gICAgYXR0YWNoVG8gPSBhdHRhY2hUbyAmJiBhdHRhY2hUby5zZXRUaW1lb3V0ID8gYXR0YWNoVG8gOiBnbG9iYWw7XG5cbiAgICAvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IGUuZy4gYnJvd3NlcmlmeSBlbnZpcm9ubWVudHMuXG4gICAgaWYgKHt9LnRvU3RyaW5nLmNhbGwoZ2xvYmFsLnByb2Nlc3MpID09PSBcIltvYmplY3QgcHJvY2Vzc11cIikge1xuICAgICAgICAvLyBGb3IgTm9kZS5qcyBiZWZvcmUgMC45XG4gICAgICAgIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGNhblVzZVBvc3RNZXNzYWdlKCkpIHtcbiAgICAgICAgLy8gRm9yIG5vbi1JRTEwIG1vZGVybiBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChnbG9iYWwuTWVzc2FnZUNoYW5uZWwpIHtcbiAgICAgICAgLy8gRm9yIHdlYiB3b3JrZXJzLCB3aGVyZSBzdXBwb3J0ZWRcbiAgICAgICAgaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoZG9jICYmIFwib25yZWFkeXN0YXRlY2hhbmdlXCIgaW4gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIikpIHtcbiAgICAgICAgLy8gRm9yIElFIDbigJM4XG4gICAgICAgIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBvbGRlciBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uKCk7XG4gICAgfVxuXG4gICAgYXR0YWNoVG8uc2V0SW1tZWRpYXRlID0gc2V0SW1tZWRpYXRlO1xuICAgIGF0dGFjaFRvLmNsZWFySW1tZWRpYXRlID0gY2xlYXJJbW1lZGlhdGU7XG59KHR5cGVvZiBzZWxmID09PSBcInVuZGVmaW5lZFwiID8gdHlwZW9mIGdsb2JhbCA9PT0gXCJ1bmRlZmluZWRcIiA/IHRoaXMgOiBnbG9iYWwgOiBzZWxmKSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9zZXRpbW1lZGlhdGUvc2V0SW1tZWRpYXRlLmpzXG4vLyBtb2R1bGUgaWQgPSAuL25vZGVfbW9kdWxlcy9zZXRpbW1lZGlhdGUvc2V0SW1tZWRpYXRlLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsIi8qXG5cdE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG5cdEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcbiovXG5cbnZhciBzdHlsZXNJbkRvbSA9IHt9O1xuXG52YXJcdG1lbW9pemUgPSBmdW5jdGlvbiAoZm4pIHtcblx0dmFyIG1lbW87XG5cblx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0XHRpZiAodHlwZW9mIG1lbW8gPT09IFwidW5kZWZpbmVkXCIpIG1lbW8gPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHRcdHJldHVybiBtZW1vO1xuXHR9O1xufTtcblxudmFyIGlzT2xkSUUgPSBtZW1vaXplKGZ1bmN0aW9uICgpIHtcblx0Ly8gVGVzdCBmb3IgSUUgPD0gOSBhcyBwcm9wb3NlZCBieSBCcm93c2VyaGFja3Ncblx0Ly8gQHNlZSBodHRwOi8vYnJvd3NlcmhhY2tzLmNvbS8jaGFjay1lNzFkODY5MmY2NTMzNDE3M2ZlZTcxNWMyMjJjYjgwNVxuXHQvLyBUZXN0cyBmb3IgZXhpc3RlbmNlIG9mIHN0YW5kYXJkIGdsb2JhbHMgaXMgdG8gYWxsb3cgc3R5bGUtbG9hZGVyXG5cdC8vIHRvIG9wZXJhdGUgY29ycmVjdGx5IGludG8gbm9uLXN0YW5kYXJkIGVudmlyb25tZW50c1xuXHQvLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJwYWNrLWNvbnRyaWIvc3R5bGUtbG9hZGVyL2lzc3Vlcy8xNzdcblx0cmV0dXJuIHdpbmRvdyAmJiBkb2N1bWVudCAmJiBkb2N1bWVudC5hbGwgJiYgIXdpbmRvdy5hdG9iO1xufSk7XG5cbnZhciBnZXRFbGVtZW50ID0gKGZ1bmN0aW9uIChmbikge1xuXHR2YXIgbWVtbyA9IHt9O1xuXG5cdHJldHVybiBmdW5jdGlvbihzZWxlY3Rvcikge1xuXHRcdGlmICh0eXBlb2YgbWVtb1tzZWxlY3Rvcl0gPT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRcdHZhciBzdHlsZVRhcmdldCA9IGZuLmNhbGwodGhpcywgc2VsZWN0b3IpO1xuXHRcdFx0Ly8gU3BlY2lhbCBjYXNlIHRvIHJldHVybiBoZWFkIG9mIGlmcmFtZSBpbnN0ZWFkIG9mIGlmcmFtZSBpdHNlbGZcblx0XHRcdGlmIChzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdC8vIFRoaXMgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgYWNjZXNzIHRvIGlmcmFtZSBpcyBibG9ja2VkXG5cdFx0XHRcdFx0Ly8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcblx0XHRcdFx0XHRzdHlsZVRhcmdldCA9IHN0eWxlVGFyZ2V0LmNvbnRlbnREb2N1bWVudC5oZWFkO1xuXHRcdFx0XHR9IGNhdGNoKGUpIHtcblx0XHRcdFx0XHRzdHlsZVRhcmdldCA9IG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdG1lbW9bc2VsZWN0b3JdID0gc3R5bGVUYXJnZXQ7XG5cdFx0fVxuXHRcdHJldHVybiBtZW1vW3NlbGVjdG9yXVxuXHR9O1xufSkoZnVuY3Rpb24gKHRhcmdldCkge1xuXHRyZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpXG59KTtcblxudmFyIHNpbmdsZXRvbiA9IG51bGw7XG52YXJcdHNpbmdsZXRvbkNvdW50ZXIgPSAwO1xudmFyXHRzdHlsZXNJbnNlcnRlZEF0VG9wID0gW107XG5cbnZhclx0Zml4VXJscyA9IHJlcXVpcmUoXCIuL3VybHNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obGlzdCwgb3B0aW9ucykge1xuXHRpZiAodHlwZW9mIERFQlVHICE9PSBcInVuZGVmaW5lZFwiICYmIERFQlVHKSB7XG5cdFx0aWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHN0eWxlLWxvYWRlciBjYW5ub3QgYmUgdXNlZCBpbiBhIG5vbi1icm93c2VyIGVudmlyb25tZW50XCIpO1xuXHR9XG5cblx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0b3B0aW9ucy5hdHRycyA9IHR5cGVvZiBvcHRpb25zLmF0dHJzID09PSBcIm9iamVjdFwiID8gb3B0aW9ucy5hdHRycyA6IHt9O1xuXG5cdC8vIEZvcmNlIHNpbmdsZS10YWcgc29sdXRpb24gb24gSUU2LTksIHdoaWNoIGhhcyBhIGhhcmQgbGltaXQgb24gdGhlICMgb2YgPHN0eWxlPlxuXHQvLyB0YWdzIGl0IHdpbGwgYWxsb3cgb24gYSBwYWdlXG5cdGlmICghb3B0aW9ucy5zaW5nbGV0b24pIG9wdGlvbnMuc2luZ2xldG9uID0gaXNPbGRJRSgpO1xuXG5cdC8vIEJ5IGRlZmF1bHQsIGFkZCA8c3R5bGU+IHRhZ3MgdG8gdGhlIDxoZWFkPiBlbGVtZW50XG5cdGlmICghb3B0aW9ucy5pbnNlcnRJbnRvKSBvcHRpb25zLmluc2VydEludG8gPSBcImhlYWRcIjtcblxuXHQvLyBCeSBkZWZhdWx0LCBhZGQgPHN0eWxlPiB0YWdzIHRvIHRoZSBib3R0b20gb2YgdGhlIHRhcmdldFxuXHRpZiAoIW9wdGlvbnMuaW5zZXJ0QXQpIG9wdGlvbnMuaW5zZXJ0QXQgPSBcImJvdHRvbVwiO1xuXG5cdHZhciBzdHlsZXMgPSBsaXN0VG9TdHlsZXMobGlzdCwgb3B0aW9ucyk7XG5cblx0YWRkU3R5bGVzVG9Eb20oc3R5bGVzLCBvcHRpb25zKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlIChuZXdMaXN0KSB7XG5cdFx0dmFyIG1heVJlbW92ZSA9IFtdO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBpdGVtID0gc3R5bGVzW2ldO1xuXHRcdFx0dmFyIGRvbVN0eWxlID0gc3R5bGVzSW5Eb21baXRlbS5pZF07XG5cblx0XHRcdGRvbVN0eWxlLnJlZnMtLTtcblx0XHRcdG1heVJlbW92ZS5wdXNoKGRvbVN0eWxlKTtcblx0XHR9XG5cblx0XHRpZihuZXdMaXN0KSB7XG5cdFx0XHR2YXIgbmV3U3R5bGVzID0gbGlzdFRvU3R5bGVzKG5ld0xpc3QsIG9wdGlvbnMpO1xuXHRcdFx0YWRkU3R5bGVzVG9Eb20obmV3U3R5bGVzLCBvcHRpb25zKTtcblx0XHR9XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IG1heVJlbW92ZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGRvbVN0eWxlID0gbWF5UmVtb3ZlW2ldO1xuXG5cdFx0XHRpZihkb21TdHlsZS5yZWZzID09PSAwKSB7XG5cdFx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgZG9tU3R5bGUucGFydHMubGVuZ3RoOyBqKyspIGRvbVN0eWxlLnBhcnRzW2pdKCk7XG5cblx0XHRcdFx0ZGVsZXRlIHN0eWxlc0luRG9tW2RvbVN0eWxlLmlkXTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG59O1xuXG5mdW5jdGlvbiBhZGRTdHlsZXNUb0RvbSAoc3R5bGVzLCBvcHRpb25zKSB7XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIGl0ZW0gPSBzdHlsZXNbaV07XG5cdFx0dmFyIGRvbVN0eWxlID0gc3R5bGVzSW5Eb21baXRlbS5pZF07XG5cblx0XHRpZihkb21TdHlsZSkge1xuXHRcdFx0ZG9tU3R5bGUucmVmcysrO1xuXG5cdFx0XHRmb3IodmFyIGogPSAwOyBqIDwgZG9tU3R5bGUucGFydHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0ZG9tU3R5bGUucGFydHNbal0oaXRlbS5wYXJ0c1tqXSk7XG5cdFx0XHR9XG5cblx0XHRcdGZvcig7IGogPCBpdGVtLnBhcnRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdGRvbVN0eWxlLnBhcnRzLnB1c2goYWRkU3R5bGUoaXRlbS5wYXJ0c1tqXSwgb3B0aW9ucykpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgcGFydHMgPSBbXTtcblxuXHRcdFx0Zm9yKHZhciBqID0gMDsgaiA8IGl0ZW0ucGFydHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0cGFydHMucHVzaChhZGRTdHlsZShpdGVtLnBhcnRzW2pdLCBvcHRpb25zKSk7XG5cdFx0XHR9XG5cblx0XHRcdHN0eWxlc0luRG9tW2l0ZW0uaWRdID0ge2lkOiBpdGVtLmlkLCByZWZzOiAxLCBwYXJ0czogcGFydHN9O1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBsaXN0VG9TdHlsZXMgKGxpc3QsIG9wdGlvbnMpIHtcblx0dmFyIHN0eWxlcyA9IFtdO1xuXHR2YXIgbmV3U3R5bGVzID0ge307XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIGl0ZW0gPSBsaXN0W2ldO1xuXHRcdHZhciBpZCA9IG9wdGlvbnMuYmFzZSA/IGl0ZW1bMF0gKyBvcHRpb25zLmJhc2UgOiBpdGVtWzBdO1xuXHRcdHZhciBjc3MgPSBpdGVtWzFdO1xuXHRcdHZhciBtZWRpYSA9IGl0ZW1bMl07XG5cdFx0dmFyIHNvdXJjZU1hcCA9IGl0ZW1bM107XG5cdFx0dmFyIHBhcnQgPSB7Y3NzOiBjc3MsIG1lZGlhOiBtZWRpYSwgc291cmNlTWFwOiBzb3VyY2VNYXB9O1xuXG5cdFx0aWYoIW5ld1N0eWxlc1tpZF0pIHN0eWxlcy5wdXNoKG5ld1N0eWxlc1tpZF0gPSB7aWQ6IGlkLCBwYXJ0czogW3BhcnRdfSk7XG5cdFx0ZWxzZSBuZXdTdHlsZXNbaWRdLnBhcnRzLnB1c2gocGFydCk7XG5cdH1cblxuXHRyZXR1cm4gc3R5bGVzO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRTdHlsZUVsZW1lbnQgKG9wdGlvbnMsIHN0eWxlKSB7XG5cdHZhciB0YXJnZXQgPSBnZXRFbGVtZW50KG9wdGlvbnMuaW5zZXJ0SW50bylcblxuXHRpZiAoIXRhcmdldCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGZpbmQgYSBzdHlsZSB0YXJnZXQuIFRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgdmFsdWUgZm9yIHRoZSAnaW5zZXJ0SW50bycgcGFyYW1ldGVyIGlzIGludmFsaWQuXCIpO1xuXHR9XG5cblx0dmFyIGxhc3RTdHlsZUVsZW1lbnRJbnNlcnRlZEF0VG9wID0gc3R5bGVzSW5zZXJ0ZWRBdFRvcFtzdHlsZXNJbnNlcnRlZEF0VG9wLmxlbmd0aCAtIDFdO1xuXG5cdGlmIChvcHRpb25zLmluc2VydEF0ID09PSBcInRvcFwiKSB7XG5cdFx0aWYgKCFsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcCkge1xuXHRcdFx0dGFyZ2V0Lmluc2VydEJlZm9yZShzdHlsZSwgdGFyZ2V0LmZpcnN0Q2hpbGQpO1xuXHRcdH0gZWxzZSBpZiAobGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3AubmV4dFNpYmxpbmcpIHtcblx0XHRcdHRhcmdldC5pbnNlcnRCZWZvcmUoc3R5bGUsIGxhc3RTdHlsZUVsZW1lbnRJbnNlcnRlZEF0VG9wLm5leHRTaWJsaW5nKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGFyZ2V0LmFwcGVuZENoaWxkKHN0eWxlKTtcblx0XHR9XG5cdFx0c3R5bGVzSW5zZXJ0ZWRBdFRvcC5wdXNoKHN0eWxlKTtcblx0fSBlbHNlIGlmIChvcHRpb25zLmluc2VydEF0ID09PSBcImJvdHRvbVwiKSB7XG5cdFx0dGFyZ2V0LmFwcGVuZENoaWxkKHN0eWxlKTtcblx0fSBlbHNlIGlmICh0eXBlb2Ygb3B0aW9ucy5pbnNlcnRBdCA9PT0gXCJvYmplY3RcIiAmJiBvcHRpb25zLmluc2VydEF0LmJlZm9yZSkge1xuXHRcdHZhciBuZXh0U2libGluZyA9IGdldEVsZW1lbnQob3B0aW9ucy5pbnNlcnRJbnRvICsgXCIgXCIgKyBvcHRpb25zLmluc2VydEF0LmJlZm9yZSk7XG5cdFx0dGFyZ2V0Lmluc2VydEJlZm9yZShzdHlsZSwgbmV4dFNpYmxpbmcpO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIltTdHlsZSBMb2FkZXJdXFxuXFxuIEludmFsaWQgdmFsdWUgZm9yIHBhcmFtZXRlciAnaW5zZXJ0QXQnICgnb3B0aW9ucy5pbnNlcnRBdCcpIGZvdW5kLlxcbiBNdXN0IGJlICd0b3AnLCAnYm90dG9tJywgb3IgT2JqZWN0LlxcbiAoaHR0cHM6Ly9naXRodWIuY29tL3dlYnBhY2stY29udHJpYi9zdHlsZS1sb2FkZXIjaW5zZXJ0YXQpXFxuXCIpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVN0eWxlRWxlbWVudCAoc3R5bGUpIHtcblx0aWYgKHN0eWxlLnBhcmVudE5vZGUgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblx0c3R5bGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZSk7XG5cblx0dmFyIGlkeCA9IHN0eWxlc0luc2VydGVkQXRUb3AuaW5kZXhPZihzdHlsZSk7XG5cdGlmKGlkeCA+PSAwKSB7XG5cdFx0c3R5bGVzSW5zZXJ0ZWRBdFRvcC5zcGxpY2UoaWR4LCAxKTtcblx0fVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTdHlsZUVsZW1lbnQgKG9wdGlvbnMpIHtcblx0dmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuXG5cdG9wdGlvbnMuYXR0cnMudHlwZSA9IFwidGV4dC9jc3NcIjtcblxuXHRhZGRBdHRycyhzdHlsZSwgb3B0aW9ucy5hdHRycyk7XG5cdGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zLCBzdHlsZSk7XG5cblx0cmV0dXJuIHN0eWxlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVMaW5rRWxlbWVudCAob3B0aW9ucykge1xuXHR2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsaW5rXCIpO1xuXG5cdG9wdGlvbnMuYXR0cnMudHlwZSA9IFwidGV4dC9jc3NcIjtcblx0b3B0aW9ucy5hdHRycy5yZWwgPSBcInN0eWxlc2hlZXRcIjtcblxuXHRhZGRBdHRycyhsaW5rLCBvcHRpb25zLmF0dHJzKTtcblx0aW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMsIGxpbmspO1xuXG5cdHJldHVybiBsaW5rO1xufVxuXG5mdW5jdGlvbiBhZGRBdHRycyAoZWwsIGF0dHJzKSB7XG5cdE9iamVjdC5rZXlzKGF0dHJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcblx0XHRlbC5zZXRBdHRyaWJ1dGUoa2V5LCBhdHRyc1trZXldKTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIGFkZFN0eWxlIChvYmosIG9wdGlvbnMpIHtcblx0dmFyIHN0eWxlLCB1cGRhdGUsIHJlbW92ZSwgcmVzdWx0O1xuXG5cdC8vIElmIGEgdHJhbnNmb3JtIGZ1bmN0aW9uIHdhcyBkZWZpbmVkLCBydW4gaXQgb24gdGhlIGNzc1xuXHRpZiAob3B0aW9ucy50cmFuc2Zvcm0gJiYgb2JqLmNzcykge1xuXHQgICAgcmVzdWx0ID0gb3B0aW9ucy50cmFuc2Zvcm0ob2JqLmNzcyk7XG5cblx0ICAgIGlmIChyZXN1bHQpIHtcblx0ICAgIFx0Ly8gSWYgdHJhbnNmb3JtIHJldHVybnMgYSB2YWx1ZSwgdXNlIHRoYXQgaW5zdGVhZCBvZiB0aGUgb3JpZ2luYWwgY3NzLlxuXHQgICAgXHQvLyBUaGlzIGFsbG93cyBydW5uaW5nIHJ1bnRpbWUgdHJhbnNmb3JtYXRpb25zIG9uIHRoZSBjc3MuXG5cdCAgICBcdG9iai5jc3MgPSByZXN1bHQ7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgXHQvLyBJZiB0aGUgdHJhbnNmb3JtIGZ1bmN0aW9uIHJldHVybnMgYSBmYWxzeSB2YWx1ZSwgZG9uJ3QgYWRkIHRoaXMgY3NzLlxuXHQgICAgXHQvLyBUaGlzIGFsbG93cyBjb25kaXRpb25hbCBsb2FkaW5nIG9mIGNzc1xuXHQgICAgXHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdCAgICBcdFx0Ly8gbm9vcFxuXHQgICAgXHR9O1xuXHQgICAgfVxuXHR9XG5cblx0aWYgKG9wdGlvbnMuc2luZ2xldG9uKSB7XG5cdFx0dmFyIHN0eWxlSW5kZXggPSBzaW5nbGV0b25Db3VudGVyKys7XG5cblx0XHRzdHlsZSA9IHNpbmdsZXRvbiB8fCAoc2luZ2xldG9uID0gY3JlYXRlU3R5bGVFbGVtZW50KG9wdGlvbnMpKTtcblxuXHRcdHVwZGF0ZSA9IGFwcGx5VG9TaW5nbGV0b25UYWcuYmluZChudWxsLCBzdHlsZSwgc3R5bGVJbmRleCwgZmFsc2UpO1xuXHRcdHJlbW92ZSA9IGFwcGx5VG9TaW5nbGV0b25UYWcuYmluZChudWxsLCBzdHlsZSwgc3R5bGVJbmRleCwgdHJ1ZSk7XG5cblx0fSBlbHNlIGlmIChcblx0XHRvYmouc291cmNlTWFwICYmXG5cdFx0dHlwZW9mIFVSTCA9PT0gXCJmdW5jdGlvblwiICYmXG5cdFx0dHlwZW9mIFVSTC5jcmVhdGVPYmplY3RVUkwgPT09IFwiZnVuY3Rpb25cIiAmJlxuXHRcdHR5cGVvZiBVUkwucmV2b2tlT2JqZWN0VVJMID09PSBcImZ1bmN0aW9uXCIgJiZcblx0XHR0eXBlb2YgQmxvYiA9PT0gXCJmdW5jdGlvblwiICYmXG5cdFx0dHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0XHRzdHlsZSA9IGNyZWF0ZUxpbmtFbGVtZW50KG9wdGlvbnMpO1xuXHRcdHVwZGF0ZSA9IHVwZGF0ZUxpbmsuYmluZChudWxsLCBzdHlsZSwgb3B0aW9ucyk7XG5cdFx0cmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlKTtcblxuXHRcdFx0aWYoc3R5bGUuaHJlZikgVVJMLnJldm9rZU9iamVjdFVSTChzdHlsZS5ocmVmKTtcblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdHN0eWxlID0gY3JlYXRlU3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuXHRcdHVwZGF0ZSA9IGFwcGx5VG9UYWcuYmluZChudWxsLCBzdHlsZSk7XG5cdFx0cmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlKTtcblx0XHR9O1xuXHR9XG5cblx0dXBkYXRlKG9iaik7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZVN0eWxlIChuZXdPYmopIHtcblx0XHRpZiAobmV3T2JqKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdG5ld09iai5jc3MgPT09IG9iai5jc3MgJiZcblx0XHRcdFx0bmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiZcblx0XHRcdFx0bmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcFxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dXBkYXRlKG9iaiA9IG5ld09iaik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlbW92ZSgpO1xuXHRcdH1cblx0fTtcbn1cblxudmFyIHJlcGxhY2VUZXh0ID0gKGZ1bmN0aW9uICgpIHtcblx0dmFyIHRleHRTdG9yZSA9IFtdO1xuXG5cdHJldHVybiBmdW5jdGlvbiAoaW5kZXgsIHJlcGxhY2VtZW50KSB7XG5cdFx0dGV4dFN0b3JlW2luZGV4XSA9IHJlcGxhY2VtZW50O1xuXG5cdFx0cmV0dXJuIHRleHRTdG9yZS5maWx0ZXIoQm9vbGVhbikuam9pbignXFxuJyk7XG5cdH07XG59KSgpO1xuXG5mdW5jdGlvbiBhcHBseVRvU2luZ2xldG9uVGFnIChzdHlsZSwgaW5kZXgsIHJlbW92ZSwgb2JqKSB7XG5cdHZhciBjc3MgPSByZW1vdmUgPyBcIlwiIDogb2JqLmNzcztcblxuXHRpZiAoc3R5bGUuc3R5bGVTaGVldCkge1xuXHRcdHN0eWxlLnN0eWxlU2hlZXQuY3NzVGV4dCA9IHJlcGxhY2VUZXh0KGluZGV4LCBjc3MpO1xuXHR9IGVsc2Uge1xuXHRcdHZhciBjc3NOb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKTtcblx0XHR2YXIgY2hpbGROb2RlcyA9IHN0eWxlLmNoaWxkTm9kZXM7XG5cblx0XHRpZiAoY2hpbGROb2Rlc1tpbmRleF0pIHN0eWxlLnJlbW92ZUNoaWxkKGNoaWxkTm9kZXNbaW5kZXhdKTtcblxuXHRcdGlmIChjaGlsZE5vZGVzLmxlbmd0aCkge1xuXHRcdFx0c3R5bGUuaW5zZXJ0QmVmb3JlKGNzc05vZGUsIGNoaWxkTm9kZXNbaW5kZXhdKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c3R5bGUuYXBwZW5kQ2hpbGQoY3NzTm9kZSk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGFwcGx5VG9UYWcgKHN0eWxlLCBvYmopIHtcblx0dmFyIGNzcyA9IG9iai5jc3M7XG5cdHZhciBtZWRpYSA9IG9iai5tZWRpYTtcblxuXHRpZihtZWRpYSkge1xuXHRcdHN0eWxlLnNldEF0dHJpYnV0ZShcIm1lZGlhXCIsIG1lZGlhKVxuXHR9XG5cblx0aWYoc3R5bGUuc3R5bGVTaGVldCkge1xuXHRcdHN0eWxlLnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcblx0fSBlbHNlIHtcblx0XHR3aGlsZShzdHlsZS5maXJzdENoaWxkKSB7XG5cdFx0XHRzdHlsZS5yZW1vdmVDaGlsZChzdHlsZS5maXJzdENoaWxkKTtcblx0XHR9XG5cblx0XHRzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcblx0fVxufVxuXG5mdW5jdGlvbiB1cGRhdGVMaW5rIChsaW5rLCBvcHRpb25zLCBvYmopIHtcblx0dmFyIGNzcyA9IG9iai5jc3M7XG5cdHZhciBzb3VyY2VNYXAgPSBvYmouc291cmNlTWFwO1xuXG5cdC8qXG5cdFx0SWYgY29udmVydFRvQWJzb2x1dGVVcmxzIGlzbid0IGRlZmluZWQsIGJ1dCBzb3VyY2VtYXBzIGFyZSBlbmFibGVkXG5cdFx0YW5kIHRoZXJlIGlzIG5vIHB1YmxpY1BhdGggZGVmaW5lZCB0aGVuIGxldHMgdHVybiBjb252ZXJ0VG9BYnNvbHV0ZVVybHNcblx0XHRvbiBieSBkZWZhdWx0LiAgT3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlIGNvbnZlcnRUb0Fic29sdXRlVXJscyBvcHRpb25cblx0XHRkaXJlY3RseVxuXHQqL1xuXHR2YXIgYXV0b0ZpeFVybHMgPSBvcHRpb25zLmNvbnZlcnRUb0Fic29sdXRlVXJscyA9PT0gdW5kZWZpbmVkICYmIHNvdXJjZU1hcDtcblxuXHRpZiAob3B0aW9ucy5jb252ZXJ0VG9BYnNvbHV0ZVVybHMgfHwgYXV0b0ZpeFVybHMpIHtcblx0XHRjc3MgPSBmaXhVcmxzKGNzcyk7XG5cdH1cblxuXHRpZiAoc291cmNlTWFwKSB7XG5cdFx0Ly8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjY2MDM4NzVcblx0XHRjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiICsgYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSkpKSArIFwiICovXCI7XG5cdH1cblxuXHR2YXIgYmxvYiA9IG5ldyBCbG9iKFtjc3NdLCB7IHR5cGU6IFwidGV4dC9jc3NcIiB9KTtcblxuXHR2YXIgb2xkU3JjID0gbGluay5ocmVmO1xuXG5cdGxpbmsuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG5cblx0aWYob2xkU3JjKSBVUkwucmV2b2tlT2JqZWN0VVJMKG9sZFNyYyk7XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvbGliL2FkZFN0eWxlcy5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2xpYi9hZGRTdHlsZXMuanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiXG4vKipcbiAqIFdoZW4gc291cmNlIG1hcHMgYXJlIGVuYWJsZWQsIGBzdHlsZS1sb2FkZXJgIHVzZXMgYSBsaW5rIGVsZW1lbnQgd2l0aCBhIGRhdGEtdXJpIHRvXG4gKiBlbWJlZCB0aGUgY3NzIG9uIHRoZSBwYWdlLiBUaGlzIGJyZWFrcyBhbGwgcmVsYXRpdmUgdXJscyBiZWNhdXNlIG5vdyB0aGV5IGFyZSByZWxhdGl2ZSB0byBhXG4gKiBidW5kbGUgaW5zdGVhZCBvZiB0aGUgY3VycmVudCBwYWdlLlxuICpcbiAqIE9uZSBzb2x1dGlvbiBpcyB0byBvbmx5IHVzZSBmdWxsIHVybHMsIGJ1dCB0aGF0IG1heSBiZSBpbXBvc3NpYmxlLlxuICpcbiAqIEluc3RlYWQsIHRoaXMgZnVuY3Rpb24gXCJmaXhlc1wiIHRoZSByZWxhdGl2ZSB1cmxzIHRvIGJlIGFic29sdXRlIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBwYWdlIGxvY2F0aW9uLlxuICpcbiAqIEEgcnVkaW1lbnRhcnkgdGVzdCBzdWl0ZSBpcyBsb2NhdGVkIGF0IGB0ZXN0L2ZpeFVybHMuanNgIGFuZCBjYW4gYmUgcnVuIHZpYSB0aGUgYG5wbSB0ZXN0YCBjb21tYW5kLlxuICpcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjc3MpIHtcbiAgLy8gZ2V0IGN1cnJlbnQgbG9jYXRpb25cbiAgdmFyIGxvY2F0aW9uID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cubG9jYXRpb247XG5cbiAgaWYgKCFsb2NhdGlvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcImZpeFVybHMgcmVxdWlyZXMgd2luZG93LmxvY2F0aW9uXCIpO1xuICB9XG5cblx0Ly8gYmxhbmsgb3IgbnVsbD9cblx0aWYgKCFjc3MgfHwgdHlwZW9mIGNzcyAhPT0gXCJzdHJpbmdcIikge1xuXHQgIHJldHVybiBjc3M7XG4gIH1cblxuICB2YXIgYmFzZVVybCA9IGxvY2F0aW9uLnByb3RvY29sICsgXCIvL1wiICsgbG9jYXRpb24uaG9zdDtcbiAgdmFyIGN1cnJlbnREaXIgPSBiYXNlVXJsICsgbG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgvXFwvW15cXC9dKiQvLCBcIi9cIik7XG5cblx0Ly8gY29udmVydCBlYWNoIHVybCguLi4pXG5cdC8qXG5cdFRoaXMgcmVndWxhciBleHByZXNzaW9uIGlzIGp1c3QgYSB3YXkgdG8gcmVjdXJzaXZlbHkgbWF0Y2ggYnJhY2tldHMgd2l0aGluXG5cdGEgc3RyaW5nLlxuXG5cdCAvdXJsXFxzKlxcKCAgPSBNYXRjaCBvbiB0aGUgd29yZCBcInVybFwiIHdpdGggYW55IHdoaXRlc3BhY2UgYWZ0ZXIgaXQgYW5kIHRoZW4gYSBwYXJlbnNcblx0ICAgKCAgPSBTdGFydCBhIGNhcHR1cmluZyBncm91cFxuXHQgICAgICg/OiAgPSBTdGFydCBhIG5vbi1jYXB0dXJpbmcgZ3JvdXBcblx0ICAgICAgICAgW14pKF0gID0gTWF0Y2ggYW55dGhpbmcgdGhhdCBpc24ndCBhIHBhcmVudGhlc2VzXG5cdCAgICAgICAgIHwgID0gT1Jcblx0ICAgICAgICAgXFwoICA9IE1hdGNoIGEgc3RhcnQgcGFyZW50aGVzZXNcblx0ICAgICAgICAgICAgICg/OiAgPSBTdGFydCBhbm90aGVyIG5vbi1jYXB0dXJpbmcgZ3JvdXBzXG5cdCAgICAgICAgICAgICAgICAgW14pKF0rICA9IE1hdGNoIGFueXRoaW5nIHRoYXQgaXNuJ3QgYSBwYXJlbnRoZXNlc1xuXHQgICAgICAgICAgICAgICAgIHwgID0gT1Jcblx0ICAgICAgICAgICAgICAgICBcXCggID0gTWF0Y2ggYSBzdGFydCBwYXJlbnRoZXNlc1xuXHQgICAgICAgICAgICAgICAgICAgICBbXikoXSogID0gTWF0Y2ggYW55dGhpbmcgdGhhdCBpc24ndCBhIHBhcmVudGhlc2VzXG5cdCAgICAgICAgICAgICAgICAgXFwpICA9IE1hdGNoIGEgZW5kIHBhcmVudGhlc2VzXG5cdCAgICAgICAgICAgICApICA9IEVuZCBHcm91cFxuICAgICAgICAgICAgICAqXFwpID0gTWF0Y2ggYW55dGhpbmcgYW5kIHRoZW4gYSBjbG9zZSBwYXJlbnNcbiAgICAgICAgICApICA9IENsb3NlIG5vbi1jYXB0dXJpbmcgZ3JvdXBcbiAgICAgICAgICAqICA9IE1hdGNoIGFueXRoaW5nXG4gICAgICAgKSAgPSBDbG9zZSBjYXB0dXJpbmcgZ3JvdXBcblx0IFxcKSAgPSBNYXRjaCBhIGNsb3NlIHBhcmVuc1xuXG5cdCAvZ2kgID0gR2V0IGFsbCBtYXRjaGVzLCBub3QgdGhlIGZpcnN0LiAgQmUgY2FzZSBpbnNlbnNpdGl2ZS5cblx0ICovXG5cdHZhciBmaXhlZENzcyA9IGNzcy5yZXBsYWNlKC91cmxcXHMqXFwoKCg/OlteKShdfFxcKCg/OlteKShdK3xcXChbXikoXSpcXCkpKlxcKSkqKVxcKS9naSwgZnVuY3Rpb24oZnVsbE1hdGNoLCBvcmlnVXJsKSB7XG5cdFx0Ly8gc3RyaXAgcXVvdGVzIChpZiB0aGV5IGV4aXN0KVxuXHRcdHZhciB1bnF1b3RlZE9yaWdVcmwgPSBvcmlnVXJsXG5cdFx0XHQudHJpbSgpXG5cdFx0XHQucmVwbGFjZSgvXlwiKC4qKVwiJC8sIGZ1bmN0aW9uKG8sICQxKXsgcmV0dXJuICQxOyB9KVxuXHRcdFx0LnJlcGxhY2UoL14nKC4qKSckLywgZnVuY3Rpb24obywgJDEpeyByZXR1cm4gJDE7IH0pO1xuXG5cdFx0Ly8gYWxyZWFkeSBhIGZ1bGwgdXJsPyBubyBjaGFuZ2Vcblx0XHRpZiAoL14oI3xkYXRhOnxodHRwOlxcL1xcL3xodHRwczpcXC9cXC98ZmlsZTpcXC9cXC9cXC8pL2kudGVzdCh1bnF1b3RlZE9yaWdVcmwpKSB7XG5cdFx0ICByZXR1cm4gZnVsbE1hdGNoO1xuXHRcdH1cblxuXHRcdC8vIGNvbnZlcnQgdGhlIHVybCB0byBhIGZ1bGwgdXJsXG5cdFx0dmFyIG5ld1VybDtcblxuXHRcdGlmICh1bnF1b3RlZE9yaWdVcmwuaW5kZXhPZihcIi8vXCIpID09PSAwKSB7XG5cdFx0ICBcdC8vVE9ETzogc2hvdWxkIHdlIGFkZCBwcm90b2NvbD9cblx0XHRcdG5ld1VybCA9IHVucXVvdGVkT3JpZ1VybDtcblx0XHR9IGVsc2UgaWYgKHVucXVvdGVkT3JpZ1VybC5pbmRleE9mKFwiL1wiKSA9PT0gMCkge1xuXHRcdFx0Ly8gcGF0aCBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIGJhc2UgdXJsXG5cdFx0XHRuZXdVcmwgPSBiYXNlVXJsICsgdW5xdW90ZWRPcmlnVXJsOyAvLyBhbHJlYWR5IHN0YXJ0cyB3aXRoICcvJ1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBwYXRoIHNob3VsZCBiZSByZWxhdGl2ZSB0byBjdXJyZW50IGRpcmVjdG9yeVxuXHRcdFx0bmV3VXJsID0gY3VycmVudERpciArIHVucXVvdGVkT3JpZ1VybC5yZXBsYWNlKC9eXFwuXFwvLywgXCJcIik7IC8vIFN0cmlwIGxlYWRpbmcgJy4vJ1xuXHRcdH1cblxuXHRcdC8vIHNlbmQgYmFjayB0aGUgZml4ZWQgdXJsKC4uLilcblx0XHRyZXR1cm4gXCJ1cmwoXCIgKyBKU09OLnN0cmluZ2lmeShuZXdVcmwpICsgXCIpXCI7XG5cdH0pO1xuXG5cdC8vIHNlbmQgYmFjayB0aGUgZml4ZWQgY3NzXG5cdHJldHVybiBmaXhlZENzcztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvbGliL3VybHMuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9saWIvdXJscy5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJ2YXIgc2NvcGUgPSAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwpIHx8XG4gICAgICAgICAgICAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZikgfHxcbiAgICAgICAgICAgIHdpbmRvdztcbnZhciBhcHBseSA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtcblxuLy8gRE9NIEFQSXMsIGZvciBjb21wbGV0ZW5lc3NcblxuZXhwb3J0cy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldFRpbWVvdXQsIHNjb3BlLCBhcmd1bWVudHMpLCBjbGVhclRpbWVvdXQpO1xufTtcbmV4cG9ydHMuc2V0SW50ZXJ2YWwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0SW50ZXJ2YWwsIHNjb3BlLCBhcmd1bWVudHMpLCBjbGVhckludGVydmFsKTtcbn07XG5leHBvcnRzLmNsZWFyVGltZW91dCA9XG5leHBvcnRzLmNsZWFySW50ZXJ2YWwgPSBmdW5jdGlvbih0aW1lb3V0KSB7XG4gIGlmICh0aW1lb3V0KSB7XG4gICAgdGltZW91dC5jbG9zZSgpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBUaW1lb3V0KGlkLCBjbGVhckZuKSB7XG4gIHRoaXMuX2lkID0gaWQ7XG4gIHRoaXMuX2NsZWFyRm4gPSBjbGVhckZuO1xufVxuVGltZW91dC5wcm90b3R5cGUudW5yZWYgPSBUaW1lb3V0LnByb3RvdHlwZS5yZWYgPSBmdW5jdGlvbigpIHt9O1xuVGltZW91dC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fY2xlYXJGbi5jYWxsKHNjb3BlLCB0aGlzLl9pZCk7XG59O1xuXG4vLyBEb2VzIG5vdCBzdGFydCB0aGUgdGltZSwganVzdCBzZXRzIHVwIHRoZSBtZW1iZXJzIG5lZWRlZC5cbmV4cG9ydHMuZW5yb2xsID0gZnVuY3Rpb24oaXRlbSwgbXNlY3MpIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IG1zZWNzO1xufTtcblxuZXhwb3J0cy51bmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IC0xO1xufTtcblxuZXhwb3J0cy5fdW5yZWZBY3RpdmUgPSBleHBvcnRzLmFjdGl2ZSA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuXG4gIHZhciBtc2VjcyA9IGl0ZW0uX2lkbGVUaW1lb3V0O1xuICBpZiAobXNlY3MgPj0gMCkge1xuICAgIGl0ZW0uX2lkbGVUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIG9uVGltZW91dCgpIHtcbiAgICAgIGlmIChpdGVtLl9vblRpbWVvdXQpXG4gICAgICAgIGl0ZW0uX29uVGltZW91dCgpO1xuICAgIH0sIG1zZWNzKTtcbiAgfVxufTtcblxuLy8gc2V0aW1tZWRpYXRlIGF0dGFjaGVzIGl0c2VsZiB0byB0aGUgZ2xvYmFsIG9iamVjdFxucmVxdWlyZShcInNldGltbWVkaWF0ZVwiKTtcbi8vIE9uIHNvbWUgZXhvdGljIGVudmlyb25tZW50cywgaXQncyBub3QgY2xlYXIgd2hpY2ggb2JqZWN0IGBzZXRpbW1lZGlhdGVgIHdhc1xuLy8gYWJsZSB0byBpbnN0YWxsIG9udG8uICBTZWFyY2ggZWFjaCBwb3NzaWJpbGl0eSBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGVcbi8vIGBzZXRpbW1lZGlhdGVgIGxpYnJhcnkuXG5leHBvcnRzLnNldEltbWVkaWF0ZSA9ICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmLnNldEltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsLnNldEltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgJiYgdGhpcy5zZXRJbW1lZGlhdGUpO1xuZXhwb3J0cy5jbGVhckltbWVkaWF0ZSA9ICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmLmNsZWFySW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbC5jbGVhckltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcyAmJiB0aGlzLmNsZWFySW1tZWRpYXRlKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3RpbWVycy1icm93c2VyaWZ5L21haW4uanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3RpbWVycy1icm93c2VyaWZ5L21haW4uanNcbi8vIG1vZHVsZSBjaHVua3MgPSB1bml0IiwiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcclxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcclxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuXHJcblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxyXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxyXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxyXG5cclxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXHJcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDApXHJcbiAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUocmVzdWx0LnZhbHVlKTsgfSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSB5W29wWzBdICYgMiA/IFwicmV0dXJuXCIgOiBvcFswXSA/IFwidGhyb3dcIiA6IFwibmV4dFwiXSkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbMCwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIGV4cG9ydHMpIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKCFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBleHBvcnRzW3BdID0gbVtwXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgIH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChvW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9OyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gdW5pdCIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpIHx8ICgxLGV2YWwpKFwidGhpc1wiKTtcbn0gY2F0Y2goZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZih0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKVxuXHRcdGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vICh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvd2VicGFjay9idWlsZGluL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJudWxsXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL21lbnUtaXRlbS9NZW51SXRlbS50cyIsIi8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cbi8vIGxvYWQgdGhlIHN0eWxlc1xudmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZGVjb3JhdG9yLWxvYWRlci9pbmRleC5qcyEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS0xMC0zIS4uLy4uL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9saWIvaW5kZXguanM/P3Bvc3Rjc3MhLi4vLi4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWR0cy1sb2FkZXIvaW5kZXguanM/dHlwZT1jc3MhLi9tZW51SXRlbS5tLmNzc1wiKTtcbmlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuLy8gUHJlcGFyZSBjc3NUcmFuc2Zvcm1hdGlvblxudmFyIHRyYW5zZm9ybTtcblxudmFyIG9wdGlvbnMgPSB7XCJobXJcIjp0cnVlfVxub3B0aW9ucy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1cbi8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cbnZhciB1cGRhdGUgPSByZXF1aXJlKFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvbGliL2FkZFN0eWxlcy5qc1wiKShjb250ZW50LCBvcHRpb25zKTtcbmlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuLy8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuaWYobW9kdWxlLmhvdCkge1xuXHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWRlY29yYXRvci1sb2FkZXIvaW5kZXguanMhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tMTAtMyEuLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvbGliL2luZGV4LmpzPz9wb3N0Y3NzIS4uLy4uL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kdHMtbG9hZGVyL2luZGV4LmpzP3R5cGU9Y3NzIS4vbWVudUl0ZW0ubS5jc3NcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kZWNvcmF0b3ItbG9hZGVyL2luZGV4LmpzIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTEwLTMhLi4vLi4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL2xpYi9pbmRleC5qcz8/cG9zdGNzcyEuLi8uLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZHRzLWxvYWRlci9pbmRleC5qcz90eXBlPWNzcyEuL21lbnVJdGVtLm0uY3NzXCIpO1xuXHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0fSk7XG5cdH1cblx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9tZW51LWl0ZW0vbWVudUl0ZW0ubS5jc3Ncbi8vIG1vZHVsZSBpZCA9IC4vc3JjL21lbnUtaXRlbS9tZW51SXRlbS5tLmNzc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJudWxsXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL21lbnUvTWVudS50cyIsIi8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cbi8vIGxvYWQgdGhlIHN0eWxlc1xudmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZGVjb3JhdG9yLWxvYWRlci9pbmRleC5qcyEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS0xMC0zIS4uLy4uL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9saWIvaW5kZXguanM/P3Bvc3Rjc3MhLi4vLi4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWR0cy1sb2FkZXIvaW5kZXguanM/dHlwZT1jc3MhLi9tZW51Lm0uY3NzXCIpO1xuaWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG4vLyBQcmVwYXJlIGNzc1RyYW5zZm9ybWF0aW9uXG52YXIgdHJhbnNmb3JtO1xuXG52YXIgb3B0aW9ucyA9IHtcImhtclwiOnRydWV9XG5vcHRpb25zLnRyYW5zZm9ybSA9IHRyYW5zZm9ybVxuLy8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxudmFyIHVwZGF0ZSA9IHJlcXVpcmUoXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzLmpzXCIpKGNvbnRlbnQsIG9wdGlvbnMpO1xuaWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG4vLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5pZihtb2R1bGUuaG90KSB7XG5cdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLi8uLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZGVjb3JhdG9yLWxvYWRlci9pbmRleC5qcyEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS0xMC0zIS4uLy4uL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9saWIvaW5kZXguanM/P3Bvc3Rjc3MhLi4vLi4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWR0cy1sb2FkZXIvaW5kZXguanM/dHlwZT1jc3MhLi9tZW51Lm0uY3NzXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi9ub2RlX21vZHVsZXMvQGRvam8vd2VicGFjay1jb250cmliL2Nzcy1tb2R1bGUtZGVjb3JhdG9yLWxvYWRlci9pbmRleC5qcyEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS0xMC0zIS4uLy4uL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9saWIvaW5kZXguanM/P3Bvc3Rjc3MhLi4vLi4vbm9kZV9tb2R1bGVzL0Bkb2pvL3dlYnBhY2stY29udHJpYi9jc3MtbW9kdWxlLWR0cy1sb2FkZXIvaW5kZXguanM/dHlwZT1jc3MhLi9tZW51Lm0uY3NzXCIpO1xuXHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0fSk7XG5cdH1cblx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9tZW51L21lbnUubS5jc3Ncbi8vIG1vZHVsZSBpZCA9IC4vc3JjL21lbnUvbWVudS5tLmNzc1xuLy8gbW9kdWxlIGNodW5rcyA9IHVuaXQiLCJpbXBvcnQgJy4vbWVudS1pdGVtL01lbnVJdGVtJztcclxuaW1wb3J0ICcuL21lbnUvTWVudSc7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kdHMtbG9hZGVyP3R5cGU9dHMmaW5zdGFuY2VOYW1lPTBfY3VzdG9tLWVsZW1lbnRzIS4vdGVzdHMvdW5pdC9hbGwudHMiLCJjb25zdCB7IGRlc2NyaWJlLCBpdCB9ID0gaW50ZXJuLmdldEludGVyZmFjZSgnYmRkJyk7XHJcbmltcG9ydCBoYXJuZXNzIGZyb20gJ0Bkb2pvL2ZyYW1ld29yay90ZXN0aW5nL2hhcm5lc3MnO1xyXG5cclxuaW1wb3J0IHsgdiB9IGZyb20gJ0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kJztcclxuXHJcbmltcG9ydCB7IE1lbnVJdGVtIH0gZnJvbSAnLi4vLi4vLi4vc3JjL21lbnUtaXRlbS9NZW51SXRlbSc7XHJcbmltcG9ydCAqIGFzIGNzcyBmcm9tICcuLi8uLi8uLi9zcmMvbWVudS1pdGVtL21lbnVJdGVtLm0uY3NzJztcclxuXHJcbmRlc2NyaWJlKCdNZW51SXRlbScsICgpID0+IHtcclxuXHRpdCgnc2hvdWxkIHJlbmRlciB3aWRnZXQnLCAoKSA9PiB7XHJcblx0XHRjb25zdCB0ZXN0TWVudUl0ZW0gPSBoYXJuZXNzKE1lbnVJdGVtKTtcclxuXHRcdGNvbnN0IHNlbGVjdGVkID0gdHJ1ZTtcclxuXHRcdGNvbnN0IHRpdGxlID0gJ01lbnUgSXRlbSc7XHJcblx0XHR0ZXN0TWVudUl0ZW0uc2V0UHJvcGVydGllcyh7IHNlbGVjdGVkLCB0aXRsZSB9KTtcclxuXHRcdHRlc3RNZW51SXRlbS5leHBlY3RSZW5kZXIoXHJcblx0XHRcdHYoJ2xpJywgeyBjbGFzc2VzOiBjc3Mucm9vdCB9LCBbXHJcblx0XHRcdFx0dihcclxuXHRcdFx0XHRcdCdzcGFuJyxcclxuXHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0Y2xhc3NlczogW2Nzcy5pdGVtLCBjc3Muc2VsZWN0ZWRdLFxyXG5cdFx0XHRcdFx0XHRvbmNsaWNrOiB0ZXN0TWVudUl0ZW0ubGlzdGVuZXJcclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRbdGl0bGVdXHJcblx0XHRcdFx0KVxyXG5cdFx0XHRdKVxyXG5cdFx0KTtcclxuXHR9KTtcclxufSk7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kdHMtbG9hZGVyP3R5cGU9dHMmaW5zdGFuY2VOYW1lPTBfY3VzdG9tLWVsZW1lbnRzIS4vdGVzdHMvdW5pdC9tZW51LWl0ZW0vTWVudUl0ZW0udHMiLCJjb25zdCB7IGRlc2NyaWJlLCBpdCB9ID0gaW50ZXJuLmdldEludGVyZmFjZSgnYmRkJyk7XHJcbmltcG9ydCBoYXJuZXNzIGZyb20gJ0Bkb2pvL2ZyYW1ld29yay90ZXN0aW5nL2hhcm5lc3MnO1xyXG5cclxuaW1wb3J0IHsgdiB9IGZyb20gJ0Bkb2pvL2ZyYW1ld29yay93aWRnZXQtY29yZS9kJztcclxuXHJcbmltcG9ydCB7IE1lbnUgfSBmcm9tICcuLi8uLi8uLi9zcmMvbWVudS9NZW51JztcclxuaW1wb3J0ICogYXMgY3NzIGZyb20gJy4uLy4uLy4uL3NyYy9tZW51L21lbnUubS5jc3MnO1xyXG5cclxuZGVzY3JpYmUoJ01lbnUnLCAoKSA9PiB7XHJcblx0aXQoJ3Nob3VsZCByZW5kZXIgd2lkZ2V0JywgKCkgPT4ge1xyXG5cdFx0Y29uc3QgdGVzdE1lbnUgPSBoYXJuZXNzKE1lbnUpO1xyXG5cdFx0dGVzdE1lbnUuZXhwZWN0UmVuZGVyKHYoJ25hdicsIHsgY2xhc3NlczogY3NzLnJvb3QgfSwgW3YoJ29sJywgeyBjbGFzc2VzOiBjc3MubWVudUNvbnRhaW5lciB9KV0pKTtcclxuXHR9KTtcclxufSk7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL25vZGVfbW9kdWxlcy9AZG9qby93ZWJwYWNrLWNvbnRyaWIvY3NzLW1vZHVsZS1kdHMtbG9hZGVyP3R5cGU9dHMmaW5zdGFuY2VOYW1lPTBfY3VzdG9tLWVsZW1lbnRzIS4vdGVzdHMvdW5pdC9tZW51L01lbnUudHMiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/test-app/npm-shrinkwrap.json b/test-app/package-lock.json similarity index 51% rename from test-app/npm-shrinkwrap.json rename to test-app/package-lock.json index 8dea7b8..f3a91fe 100644 --- a/test-app/npm-shrinkwrap.json +++ b/test-app/package-lock.json @@ -4,502 +4,32 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@dojo/cli": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@dojo/cli/-/cli-2.0.0.tgz", - "integrity": "sha512-MIJDEZOE9rQuch31NF24QvpvewzB9h6pj2qrXcjaj2/PYmIHBGlcAOCRZ/JBesPjbYTwasU4pqygTsf2mQt0zA==", - "requires": { - "chalk": "2.4.1", - "cliui": "4.1.0", - "configstore": "3.1.2", - "cross-spawn": "5.1.0", - "detect-indent": "5.0.0", - "ejs": "2.5.7", - "execa": "0.8.0", - "fs-extra": "5.0.0", - "globby": "6.1.0", - "inquirer": "4.0.2", - "pkg-dir": "2.0.0", - "slice-ansi": "1.0.0", - "string-width": "2.1.1", - "tslib": "1.8.1", - "typings-core": "2.3.3", - "update-notifier": "2.5.0", - "yargs": "10.1.2" - }, - "dependencies": { - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "requires": { - "string-width": "2.1.1" - } - }, - "ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==" - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "1.9.1" - } - }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "requires": { - "ansi-align": "2.0.0", - "camelcase": "4.1.0", - "chalk": "2.4.1", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "2.0.0" - } - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "requires": { - "restore-cursor": "2.0.0" - } - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" - } - }, - "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", - "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.11", - "make-dir": "1.2.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.3.0", - "xdg-basedir": "3.0.0" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "requires": { - "is-obj": "1.0.1" - } - }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.21", - "tmp": "0.0.33" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "2.0.0" - } - }, - "fs-extra": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "4.0.0", - "universalify": "0.1.1" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.0", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "iconv-lite": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", - "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", - "requires": { - "safer-buffer": "2.1.2" - } - }, - "inquirer": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-4.0.2.tgz", - "integrity": "sha512-+f3qDNeZpkhFJ61NBA9jXDrGGhoQuqfEum9A681c9oHoIbGgVqjogKynjB/vNVP+nVu9w3FbFQ35c0ibU0MaIQ==", - "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.4.1", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.2.0", - "figures": "2.0.0", - "lodash": "4.17.5", - "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "4.1.11" - } - }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "requires": { - "package-json": "4.0.1" - } - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "requires": { - "mimic-fn": "1.2.0" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - }, - "dependencies": { - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } - } - } - }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "requires": { - "got": "6.7.1", - "registry-auth-token": "3.3.2", - "registry-url": "3.1.0", - "semver": "5.5.0" - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "requires": { - "find-up": "2.1.0" - } - }, - "popsicle": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/popsicle/-/popsicle-9.2.0.tgz", - "integrity": "sha512-petRj39w05GvH1WKuGFmzxR9+k+R9E7zX5XWTFee7P/qf88hMuLT7aAO/RsmldpQMtJsWQISkTQlfMRECKlxhw==", - "requires": { - "concat-stream": "1.6.0", - "form-data": "2.3.2", - "make-error-cause": "1.2.2", - "tough-cookie": "2.3.4" - } - }, - "promise-finally": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/promise-finally/-/promise-finally-3.0.0.tgz", - "integrity": "sha1-3dXQ+JVDKxIGzrjaEnUGTRjnqiM=" - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "requires": { - "has-flag": "3.0.0" - } - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "1.0.2" - } - }, - "tslib": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.8.1.tgz", - "integrity": "sha1-aUavLR1lGnsYY7Ux1uWvpBqkTqw=" - }, - "typings-core": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/typings-core/-/typings-core-2.3.3.tgz", - "integrity": "sha1-CexUzVsR3V8e8vwKsx03ACyita0=", - "requires": { - "array-uniq": "1.0.3", - "configstore": "3.1.2", - "debug": "2.6.9", - "detect-indent": "5.0.0", - "graceful-fs": "4.1.11", - "has": "1.0.1", - "invariant": "2.2.3", - "is-absolute": "0.2.6", - "jspm-config": "0.3.4", - "listify": "1.0.0", - "lockfile": "1.0.3", - "make-error-cause": "1.2.2", - "mkdirp": "0.5.1", - "object.pick": "1.3.0", - "parse-json": "2.2.0", - "popsicle": "9.2.0", - "popsicle-proxy-agent": "3.0.0", - "popsicle-retry": "3.2.1", - "popsicle-rewrite": "1.0.0", - "popsicle-status": "2.0.1", - "promise-finally": "3.0.0", - "rc": "1.2.5", - "rimraf": "2.6.2", - "sort-keys": "1.1.2", - "string-template": "1.0.0", - "strip-bom": "3.0.0", - "thenify": "3.3.0", - "throat": "3.2.0", - "touch": "1.0.0", - "typescript": "2.6.2", - "xtend": "4.0.1", - "zip-object": "0.1.0" - } - }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" - }, - "update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", - "requires": { - "boxen": "1.3.0", - "chalk": "2.4.1", - "configstore": "3.1.2", - "import-lazy": "2.1.0", - "is-ci": "1.1.0", - "is-installed-globally": "0.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "widest-line": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", - "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", - "requires": { - "string-width": "2.1.1" - } - }, - "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" - } - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" - }, - "yargs": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", - "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", - "requires": { - "cliui": "4.1.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "8.1.0" - } - }, - "yargs-parser": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", - "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", - "requires": { - "camelcase": "4.1.0" - } - } - } - }, "@dojo/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@dojo/core/-/core-2.0.0.tgz", - "integrity": "sha512-iojqMIn49L/bwv/Ryy2v7qKeioHxjHQqJNLhEXBJ+zJoQ47IeG92Y5tmdGsZ6SKZk6sFuWHl7gL9Wbw0qVySHw==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@dojo/core/-/core-0.5.0.tgz", + "integrity": "sha512-kEyKjH/HRMf7rXxFiOvM0Lco8fPcoGtECZx8kr2tskgrIBPN8F3aaRTT8GZ9duUjoIp953RK8ggbMzBt7+ap+Q==", + "dev": true, "requires": { "tslib": "1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.8.1.tgz", - "integrity": "sha1-aUavLR1lGnsYY7Ux1uWvpBqkTqw=" - } + } + }, + "@dojo/framework": { + "version": "3.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@dojo/framework/-/framework-3.0.0-alpha.1.tgz", + "integrity": "sha512-Bpu7K7xQ210BH9mVBHYHIZ4CyNiDyUGSEyTZ0AKkRHy6+bggPN6hyatO5rbAhxrksMvk3Rgwi1nCosvLA4d6jQ==", + "requires": { + "@types/cldrjs": "0.4.20", + "@types/globalize": "0.0.34", + "@types/web-animations-js": "2.2.5", + "@webcomponents/webcomponentsjs": "1.1.0", + "cldr-data": "32.0.1", + "css-select-umd": "1.3.0-rc0", + "diff": "3.4.0", + "globalize": "1.3.0", + "intersection-observer": "0.4.2", + "pepjs": "0.4.2", + "tslib": "1.8.1", + "web-animations-js": "2.3.1" } }, "@dojo/has": { @@ -508,22 +38,6 @@ "integrity": "sha512-122xXU9xHjG/EayITIAiIdKVphZTZ2wM9IEBArarkBQzXZP1shGAbTJq7NHWUoTemw48tvTxr+OOi7wVCm7IXg==", "dev": true }, - "@dojo/i18n": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@dojo/i18n/-/i18n-2.0.0.tgz", - "integrity": "sha512-N7waSXe8ER602TW6WzEaqxMgbjGkFeu6B6xgRFQHoT08MuuwnnFAvjpBG3k3JVq1Kn6hBZqOYP2Fi2xqtdlasA==", - "requires": { - "globalize": "1.3.0", - "tslib": "1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.8.1.tgz", - "integrity": "sha1-aUavLR1lGnsYY7Ux1uWvpBqkTqw=" - } - } - }, "@dojo/interfaces": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/@dojo/interfaces/-/interfaces-0.2.1.tgz", @@ -534,69 +48,37 @@ } }, "@dojo/shim": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@dojo/shim/-/shim-2.0.0.tgz", - "integrity": "sha512-v/zD80U+8ajNrfxwKH6yy//l6ATQ/LzeYVXcqmBkGQ0NA4vDujLS3ceF3Wt0XL55JXLUYaVSQACMqy0H9DPD3A==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@dojo/shim/-/shim-0.2.7.tgz", + "integrity": "sha512-3R/n4a1/17acl9S5Wtay/0rcKzUqtVVJkCLPrGZq4NmRzWop09Unryqg/GV0Y1V7SbcILHKBL7bOTEfrpVX63g==", + "dev": true, "requires": { "intersection-observer": "0.4.2", "pepjs": "0.4.2", - "tslib": "1.8.0", + "tslib": "1.8.1", "web-animations-js": "2.3.1" } }, - "@dojo/test-extras": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@dojo/test-extras/-/test-extras-2.0.0.tgz", - "integrity": "sha512-+jyiGgAtYTgz5FLeQiFp3MFBwT5ZrSUc/Ol96acDv//0IeOD11SDw90f4g7D69LGbbevnX2HuyCQ4n/GNrJ7Hg==", - "dev": true, - "requires": { - "css-select-umd": "1.3.0-rc0", - "diff": "3.4.0", - "tslib": "1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.8.1.tgz", - "integrity": "sha1-aUavLR1lGnsYY7Ux1uWvpBqkTqw=", - "dev": true - } - } - }, - "@dojo/widget-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@dojo/widget-core/-/widget-core-2.0.0.tgz", - "integrity": "sha512-D58yrDvAvlTmOySHA4gminwKU3zJfs8UwQ6MWauI35rwCo+ssFkWWEly2j7YJa3L8e1dHxe6YoFKhK5bc4ZIFA==", - "requires": { - "@types/web-animations-js": "2.2.5", - "tslib": "1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.8.1.tgz", - "integrity": "sha1-aUavLR1lGnsYY7Ux1uWvpBqkTqw=" - } - } - }, "@theintern/digdug": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@theintern/digdug/-/digdug-2.0.4.tgz", - "integrity": "sha512-BTcYNMxOnGlTEaOYqab9WygE2sLz9ZRWRsuTwUttceewzEDn/Ok/4lWdIgwwX+bb3MybvFPU1wBkq8Co+Bfqyw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@theintern/digdug/-/digdug-2.1.2.tgz", + "integrity": "sha512-r1QjsLCeBk6UiK2nA6g3P+nc5V/drSU6w8zmvEWIsCl397xog1h6yEovu8V9KVjISL2LbyyOLEGGnNDSlEpcVQ==", "dev": true, "requires": { - "@dojo/core": "0.3.1", - "@dojo/has": "0.1.2", + "@dojo/core": "2.0.0", + "@dojo/has": "2.0.0", "@dojo/interfaces": "0.2.1", + "@dojo/shim": "2.0.0", + "command-exists": "1.2.7", "decompress": "4.2.0", - "semver": "5.4.1", - "tslib": "1.8.0" + "semver": "5.5.0", + "tslib": "1.9.3" }, "dependencies": { "@dojo/core": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@dojo/core/-/core-0.3.1.tgz", - "integrity": "sha512-PEwqxpsuTTG0b2wwy0TLHEFf/R6ZBE4zizo4EXzGUVRc5O44w5Hbn+NN48v/o8hwQRKxmX3ywLI0Z1CMZ6NM6w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@dojo/core/-/core-2.0.0.tgz", + "integrity": "sha512-iojqMIn49L/bwv/Ryy2v7qKeioHxjHQqJNLhEXBJ+zJoQ47IeG92Y5tmdGsZ6SKZk6sFuWHl7gL9Wbw0qVySHw==", "dev": true, "requires": { "tslib": "1.8.1" @@ -610,35 +92,22 @@ } } }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "@dojo/has": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@dojo/has/-/has-2.0.0.tgz", + "integrity": "sha512-WFdsD2jVqsLvOTtEs8Q9TlJF7f0VgO8NXRccuOPKjw9tXKvB6XrnZjGgh+zkLxOUrm8m3rExMu8MHGM8ZHLPPQ==", "dev": true - } - } - }, - "@theintern/leadfoot": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@theintern/leadfoot/-/leadfoot-2.0.3.tgz", - "integrity": "sha512-J9wLAMjAU+Wyv5jGmHdVN4xnuyaD24kK7mAoLUPBLRNxflkJoTo9Ph5g4BKUHp+xpKd/IMU00ulgMMf++Xqm4A==", - "dev": true, - "requires": { - "@dojo/core": "0.3.1", - "@dojo/has": "0.1.2", - "@dojo/interfaces": "0.2.1", - "@types/jszip": "0.0.33", - "jszip": "3.1.5", - "tslib": "1.8.0" - }, - "dependencies": { - "@dojo/core": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@dojo/core/-/core-0.3.1.tgz", - "integrity": "sha512-PEwqxpsuTTG0b2wwy0TLHEFf/R6ZBE4zizo4EXzGUVRc5O44w5Hbn+NN48v/o8hwQRKxmX3ywLI0Z1CMZ6NM6w==", + }, + "@dojo/shim": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@dojo/shim/-/shim-2.0.0.tgz", + "integrity": "sha512-v/zD80U+8ajNrfxwKH6yy//l6ATQ/LzeYVXcqmBkGQ0NA4vDujLS3ceF3Wt0XL55JXLUYaVSQACMqy0H9DPD3A==", "dev": true, "requires": { - "tslib": "1.8.1" + "intersection-observer": "0.4.2", + "pepjs": "0.4.2", + "tslib": "1.8.1", + "web-animations-js": "2.3.1" }, "dependencies": { "tslib": { @@ -648,13 +117,42 @@ "dev": true } } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + } + } + }, + "@theintern/leadfoot": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@theintern/leadfoot/-/leadfoot-2.1.0.tgz", + "integrity": "sha512-GRl2RUMVOBDFAPHzMTH5vI+MvZNfhmMeb0vh640q4BMVZqoxXmIbRtW5bcJ3M580u56CcrMDCauLAYqQ5NUjFw==", + "dev": true, + "requires": { + "@dojo/core": "0.5.0", + "@dojo/has": "0.1.2", + "@dojo/interfaces": "0.2.1", + "@dojo/shim": "0.2.7", + "@types/jszip": "3.1.4", + "jszip": "3.1.5", + "tslib": "1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true } } }, "@types/babel-types": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.1.tgz", - "integrity": "sha512-EkcOk09rjhivbovP8WreGRbXW20YRfe/qdgXOGq3it3u3aAOWDRNsQhL/XPAWFF7zhZZ+uR+nT+3b+TCkIap1w==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.4.tgz", + "integrity": "sha512-WiZhq3SVJHFRgRYLXvpf65XnV6ipVHhnNaNvE8yCimejrGglkg38kEj0JcizqwSHxmPSjcTlig/6JouxLGEhGw==", "dev": true }, "@types/benchmark": { @@ -664,19 +162,19 @@ "dev": true }, "@types/body-parser": { - "version": "1.16.8", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.16.8.tgz", - "integrity": "sha512-BdN2PXxOFnTXFcyONPW6t0fHjz2fvRZHVMFpaS0wYr+Y8fWEaNOs4V8LEu/fpzQlMx+ahdndgTaGTwPC+J/EeA==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz", + "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==", "dev": true, "requires": { - "@types/express": "4.0.39", - "@types/node": "9.4.6" + "@types/connect": "3.4.32", + "@types/node": "10.5.2" } }, "@types/chai": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.0.10.tgz", - "integrity": "sha512-Ejh1AXTY8lm+x91X/yar3G2z4x9RyKwdTVdyyu7Xj3dNB35fMNCnEWqTO9FgS3zjzlRNqk1MruYhgb8yhRN9rA==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.4.tgz", + "integrity": "sha512-h6+VEw2Vr3ORiFCyyJmcho2zALnUq9cvdB/IO8Xs9itrJVCenC7o26A6+m7D0ihTTr65eS259H5/Ghl/VjYs6g==", "dev": true }, "@types/charm": { @@ -685,13 +183,27 @@ "integrity": "sha512-F9OalGhk60p/DnACfa1SWtmVTMni0+w9t/qfb5Bu7CsurkEjZFN7Z+ii/VGmYpaViPz7o3tBahRQae9O7skFlQ==", "dev": true, "requires": { - "@types/node": "9.4.6" + "@types/node": "10.5.2" + } + }, + "@types/cldrjs": { + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/@types/cldrjs/-/cldrjs-0.4.20.tgz", + "integrity": "sha512-vQe6BQF9QCHSLUlNjRa/1zicRCnQnTRwhW/FqgVv26A85COY1jfkkO6JjogDv22U3LRhu9pY4uPQOlxGnsuJPA==" + }, + "@types/connect": { + "version": "3.4.32", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", + "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", + "dev": true, + "requires": { + "@types/node": "10.5.2" } }, "@types/diff": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@types/diff/-/diff-3.2.2.tgz", - "integrity": "sha512-q3zfJvaTroV5BjAAR+peTHEGAAhGrPX0z2EzCzpt2mwFA+qzUn2nigJLqSekXRtdULKmT8am7zjvTMZSapIgHw==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@types/diff/-/diff-3.5.1.tgz", + "integrity": "sha512-nkT7bd/YM6QRDQjww8PYf0kOj1MvwxQ/WaCinj2Hm1HlL+JqGTm4cDoQeROfiWX/B3SNI1nyLLhLAQpp5sE3hw==", "dev": true }, "@types/events": { @@ -701,30 +213,39 @@ "dev": true }, "@types/express": { - "version": "4.0.39", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.0.39.tgz", - "integrity": "sha512-dBUam7jEjyuEofigUXCtublUHknRZvcRgITlGsTbFgPvnTwtQUt2NgLakbsf+PsGo/Nupqr3IXCYsOpBpofyrA==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.11.1.tgz", + "integrity": "sha512-ttWle8cnPA5rAelauSWeWJimtY2RsUf2aspYZs7xPHiWgOlPn6nnUfBMtrkcnjFJuIHJF4gNOdVvpLK2Zmvh6g==", "dev": true, "requires": { - "@types/body-parser": "1.16.8", - "@types/express-serve-static-core": "4.11.1", - "@types/serve-static": "1.13.1" + "@types/body-parser": "1.17.0", + "@types/express-serve-static-core": "4.16.0", + "@types/serve-static": "1.13.2" } }, "@types/express-serve-static-core": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.11.1.tgz", - "integrity": "sha512-EehCl3tpuqiM8RUb+0255M8PhhSwTtLfmO7zBBdv0ay/VTd/zmrqDfQdZFsa5z/PVMbH2yCMZPXsnrImpATyIw==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz", + "integrity": "sha512-lTeoCu5NxJU4OD9moCgm0ESZzweAx0YqsAcab6OB0EB3+As1OaHtKnaGJvcngQxYsi9UNv0abn4/DRavrRxt4w==", "dev": true, "requires": { "@types/events": "1.2.0", - "@types/node": "9.4.6" + "@types/node": "10.5.2", + "@types/range-parser": "1.2.2" + } + }, + "@types/globalize": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/globalize/-/globalize-0.0.34.tgz", + "integrity": "sha512-FQTLuqZxqf+T1Ao6RzaIP7HcTcNvgDf0YQfK90YGYt1N6KeU5GE0M/hsxdQlpqvuztxjEwEQqIO3paSO/tZ4Pw==", + "requires": { + "@types/cldrjs": "0.4.20" } }, "@types/http-errors": { - "version": "1.5.34", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.5.34.tgz", - "integrity": "sha1-1qVvJde5XdBwR2gL+CVjLil5aBU=", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.6.1.tgz", + "integrity": "sha512-s+RHKSGc3r0m3YEE2UXomJYrpQaY9cDmNDLU2XvG1/LAZsQ7y8emYkTLfcw/ByDtcsTyRQKwr76Bj4PkN2hfWg==", "dev": true }, "@types/istanbul-lib-coverage": { @@ -740,22 +261,14 @@ "dev": true }, "@types/istanbul-lib-instrument": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.1.tgz", - "integrity": "sha512-Ll2qAzv7NItqVliZZ8OMAgAvGstddK2995/7X5YPU84lD3CFnqDfP4sTu5Q1GKReh5Ttw3shKR2e3Fe6Xo0C7A==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.2.tgz", + "integrity": "sha512-SWIpdKneXqThfrKIokt9dXSPeslS2NWcxhtr+/a2+N81aLyOMAsVTMmwaKuCoEahcI0FfhY3/79AR6Vilk9i8A==", "dev": true, "requires": { - "@types/babel-types": "7.0.1", + "@types/babel-types": "7.0.4", "@types/istanbul-lib-coverage": "1.1.0", "source-map": "0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "@types/istanbul-lib-report": { @@ -775,14 +288,6 @@ "requires": { "@types/istanbul-lib-coverage": "1.1.0", "source-map": "0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "@types/istanbul-reports": { @@ -796,15 +301,18 @@ } }, "@types/jszip": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/jszip/-/jszip-0.0.33.tgz", - "integrity": "sha512-zAbqAUQmXP9/ryVysJO6XkogdIdtVIYYGmV7BzhKuagaS+75QZ6muJjeSaG5M8rdE5jQ8gyhkZ23r6l4ICmxyQ==", - "dev": true + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/jszip/-/jszip-3.1.4.tgz", + "integrity": "sha512-UaVbz4buRlBEolZYrxqkrGDOypugYlbqGNrUFB4qBaexrLypTH0jyvaF5jolNy5D+5C4kKV1WJ3Yx9cn/JH8oA==", + "dev": true, + "requires": { + "@types/node": "10.5.2" + } }, "@types/lodash": { - "version": "4.14.104", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.104.tgz", - "integrity": "sha512-ufQcVg4daO8xQ5kopxRHanqFdL4AI7ondQkV+2f+7mz3gvp0LkBx2zBRC6hfs3T87mzQFmf5Fck7Fi145Ul6NQ==", + "version": "4.14.112", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.112.tgz", + "integrity": "sha512-jDD7sendv3V7iwyRXSlECOR8HCtMN2faVA9ngLdHHihSVIwY7nbfsKl2kA6fimUDU1i5l/zgpG3aevwWnN3zCQ==", "dev": true }, "@types/mime": { @@ -820,9 +328,9 @@ "dev": true }, "@types/node": { - "version": "9.4.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.6.tgz", - "integrity": "sha512-CTUtLb6WqCCgp6P59QintjHWqzf4VL1uPA27bipLAPxFqrtK1gEYllePzTICGqQ8rYsCbpnsNypXjjDzGAAjEQ==", + "version": "10.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.5.2.tgz", + "integrity": "sha512-m9zXmifkZsMHZBOyxZWilMwmTlpC8x5Ty360JKTiXvlXZfBWYpsg9ZZvP/Ye+iZUh+Q+MxDLjItVTWIsfwz+8Q==", "dev": true }, "@types/platform": { @@ -831,22 +339,28 @@ "integrity": "sha512-XI6JKLFNBmkADRd2FtUYtEuq5LDKTNXwUIodV3ZfTNkA+g4yo+rXXXdZL3fTE24S92BjpiEVaL3f64Fxm2JOgg==", "dev": true }, + "@types/range-parser": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.2.tgz", + "integrity": "sha512-HtKGu+qG1NPvYe1z7ezLsyIaXYyi8SoAVqWDZgDQ8dLrsZvSzUNCwZyfX33uhWxL/SU0ZDQZ3nwZ0nimt507Kw==", + "dev": true + }, "@types/resolve": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.4.tgz", - "integrity": "sha1-m1htZalH3qiMS8JNoLkF/pUgoNU=", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.7.tgz", + "integrity": "sha512-GPewdjkb0Q76o459qgp6pBLzJj/bD3oveS2kfLhIkZ9U3t3AFKtl5DlFB6lGTw0iZmcmxoGC8lpLW3NNJKrN9A==", "dev": true, "requires": { - "@types/node": "9.4.6" + "@types/node": "10.5.2" } }, "@types/serve-static": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.1.tgz", - "integrity": "sha512-jDMH+3BQPtvqZVIcsH700Dfi8Q3MIcEx16g/VdxjoqiGR/NntekB10xdBpirMKnPe9z2C5cBmL0vte0YttOr3Q==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==", "dev": true, "requires": { - "@types/express-serve-static-core": "4.11.1", + "@types/express-serve-static-core": "4.16.0", "@types/mime": "2.0.0" } }, @@ -856,16 +370,10 @@ "integrity": "sha512-BFonQx849sYB2YOJZBUEfbWdaJcqRb6+ASvgUBtcmg2JRTjBaV2Wgn0SD0gWNIZ+rd7KPysPCjLUOUXnBDUlBg==", "dev": true }, - "@types/source-map": { - "version": "0.1.29", - "resolved": "https://registry.npmjs.org/@types/source-map/-/source-map-0.1.29.tgz", - "integrity": "sha1-1wSKYBgLCfiqbVO9oxHGtRy9cBg=", - "dev": true - }, "@types/statuses": { - "version": "1.2.28", - "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-1.2.28.tgz", - "integrity": "sha1-zF8Z0haUFtVWzcoFtZsp5F+kl+I=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-1.3.0.tgz", + "integrity": "sha512-E0QjLIX1q+ThpQ7HLh5SjMtUtPl0tQjxoLMPwJtFDFtH7C0qdXmCgNcBplZ9m24+sOoQBpc0PT/aMW4jlm3K6g==", "dev": true }, "@types/web-animations-js": { @@ -874,12 +382,13 @@ "integrity": "sha512-3kjO6yvLt1e673wtcKEz0lgLKqPkBiuwxQj0DQ1jj+48HB03emIlTQYcqKAvB9UwOXq09QrWy/Dm6ZU8xMZVTw==" }, "@types/ws": { - "version": "0.0.42", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-0.0.42.tgz", - "integrity": "sha512-+30f9gcx24GZRD9EqqiQM+I5pRf/MJiJoEqp2X62QRwfEjdqyn9mPmjxZAEXBUVunWotE5qkadIPqf2MMcDYNw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-4.0.2.tgz", + "integrity": "sha512-tlDVFHCcJdNqYgjGNDPDCo4tNqhFMymIAdJCcykFbdhYr4X6vD7IlMxY0t3/k6Pfup68YNkMTpRfLKTRuKDmnQ==", "dev": true, "requires": { - "@types/node": "9.4.6" + "@types/events": "1.2.0", + "@types/node": "10.5.2" } }, "@types/yargs": { @@ -888,35 +397,40 @@ "integrity": "sha512-YdxO7zGQf2qJeMgR0fNO8QTlj88L2zCP5GOddovoTyetgLiNDOUXcWzhWKb4EdZZlOjLQUA0JM8lW7VcKQL+9w==", "dev": true }, + "@webcomponents/webcomponentsjs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-1.1.0.tgz", + "integrity": "sha512-7toNyVlrl7vJnY3PU0eXIK1KWq8phfnEe1IwOdCMxkIl/BfUkUB2aaVs45R0LSx1qxHRnkqj0vlGtskUvKkNkA==" + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "accepts": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", - "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "dev": true, "requires": { "mime-types": "2.1.18", "negotiator": "0.6.1" } }, - "agent-base": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", - "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", + "adm-zip": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz", + "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==" + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "extend": "3.0.1", - "semver": "5.0.3" - }, - "dependencies": { - "semver": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", - "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=" - } + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" } }, "align-text": { @@ -939,7 +453,8 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true }, "ansi-styles": { "version": "2.2.1", @@ -947,11 +462,6 @@ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, "append-transform": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", @@ -985,18 +495,15 @@ "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", "dev": true }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "requires": { - "array-uniq": "1.0.3" - } + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "assertion-error": { "version": "1.1.0", @@ -1004,11 +511,33 @@ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -1031,19 +560,16 @@ "babel-types": "6.26.0", "detect-indent": "4.0.0", "jsesc": "1.3.0", - "lodash": "4.17.5", + "lodash": "4.17.10", "source-map": "0.5.7", "trim-right": "1.0.1" }, "dependencies": { - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -1062,14 +588,14 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.3", + "core-js": "2.5.7", "regenerator-runtime": "0.11.1" }, "dependencies": { "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", "dev": true } } @@ -1084,7 +610,7 @@ "babel-traverse": "6.26.0", "babel-types": "6.26.0", "babylon": "6.18.0", - "lodash": "4.17.5" + "lodash": "4.17.10" } }, "babel-traverse": { @@ -1100,8 +626,8 @@ "babylon": "6.18.0", "debug": "2.6.9", "globals": "9.18.0", - "invariant": "2.2.3", - "lodash": "4.17.5" + "invariant": "2.2.4", + "lodash": "4.17.10" } }, "babel-types": { @@ -1112,7 +638,7 @@ "requires": { "babel-runtime": "6.26.0", "esutils": "2.0.2", - "lodash": "4.17.5", + "lodash": "4.17.10", "to-fast-properties": "1.0.3" } }, @@ -1133,59 +659,65 @@ "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=", "dev": true }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, "benchmark": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=", "dev": true, "requires": { - "lodash": "4.17.5", + "lodash": "4.17.10", "platform": "1.3.5" } }, "bl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", - "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "dev": true, "requires": { - "readable-stream": "2.3.4" + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2" } }, "body-parser": { - "version": "1.17.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz", - "integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=", + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", "dev": true, "requires": { - "bytes": "2.4.0", + "bytes": "3.0.0", "content-type": "1.0.4", - "debug": "2.6.7", + "debug": "2.6.9", "depd": "1.1.2", - "http-errors": "1.6.2", - "iconv-lite": "0.4.15", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", "on-finished": "2.3.0", - "qs": "6.4.0", - "raw-body": "2.2.0", + "qs": "6.5.2", + "raw-body": "2.3.3", "type-is": "1.6.16" - }, - "dependencies": { - "debug": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", - "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } } }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "requires": { + "hoek": "4.2.1" + } }, "brace-expansion": { "version": "1.1.11", @@ -1203,26 +735,55 @@ "dev": true, "requires": { "base64-js": "0.0.8", - "ieee754": "1.1.8", + "ieee754": "1.1.12", "isarray": "1.0.0" } }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "1.1.0", + "buffer-fill": "1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", "dev": true }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, "bytes": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", - "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", "dev": true }, - "capture-stack-trace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "center-align": { "version": "0.1.3", @@ -1262,11 +823,6 @@ "supports-color": "2.0.0" } }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" - }, "charm": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/charm/-/charm-1.0.2.tgz", @@ -1282,43 +838,59 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, - "ci-info": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", - "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==" + "cldr-data": { + "version": "32.0.1", + "resolved": "https://registry.npmjs.org/cldr-data/-/cldr-data-32.0.1.tgz", + "integrity": "sha1-eWCDKDbgpkp0voi1XuEF8pgKDyo=", + "requires": { + "cldr-data-downloader": "0.3.4", + "glob": "5.0.15" + } + }, + "cldr-data-downloader": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/cldr-data-downloader/-/cldr-data-downloader-0.3.4.tgz", + "integrity": "sha1-SiWXAiHvg5vh7LWKFnEdo/Pk1sA=", + "requires": { + "adm-zip": "0.4.11", + "mkdirp": "0.5.0", + "nopt": "3.0.6", + "progress": "1.1.8", + "q": "1.0.1", + "request": "2.83.0", + "request-progress": "0.3.1" + } }, "cldrjs": { "version": "0.4.8", "resolved": "https://registry.npmjs.org/cldrjs/-/cldrjs-0.4.8.tgz", "integrity": "sha1-O5lMRk0qMrWsp8XeF6YKh+RdxPk=" }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, "requires": { - "color-name": "1.1.3" + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "optional": true + } } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "combined-stream": { "version": "1.0.6", @@ -1328,6 +900,12 @@ "delayed-stream": "1.0.0" } }, + "command-exists": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.7.tgz", + "integrity": "sha512-doWDvhXCcW5LK0cIUWrOQ8oMFXJv3lEQCkJpGVjM8v9SV0uhqYXB943538tEA2CiaWqSyuYUGAm5ezDwEx9xlw==", + "dev": true + }, "commander": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", @@ -1342,16 +920,6 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4", - "typedarray": "0.0.6" - } - }, "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", @@ -1387,24 +955,28 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", "requires": { - "capture-stack-trace": "1.0.0" + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "requires": { + "hoek": "4.2.1" + } + } } }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" - }, "css-select-umd": { "version": "1.3.0-rc0", "resolved": "https://registry.npmjs.org/css-select-umd/-/css-select-umd-1.3.0-rc0.tgz", "integrity": "sha512-ggouX0yWeql8nZobF5jscijHx/WIDkEuy7Iq6fU2X6ogQyIPpJ/aGn4ZYM0jpfI0LbvDaQustkj0az/hN1BqwA==", - "dev": true, "requires": { "boolbase": "1.0.0", "css-what": "2.1.0", @@ -1416,22 +988,29 @@ "css-what": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", - "dev": true + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=" }, "d": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, "requires": { - "es5-ext": "0.10.39" + "es5-ext": "0.10.45" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "1.0.0" } }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "requires": { "ms": "2.0.0" } @@ -1439,7 +1018,9 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "optional": true }, "decompress": { "version": "4.2.0", @@ -1452,7 +1033,7 @@ "decompress-targz": "4.1.1", "decompress-unzip": "4.0.1", "graceful-fs": "4.1.11", - "make-dir": "1.2.0", + "make-dir": "1.3.0", "pify": "2.3.0", "strip-dirs": "2.1.0" } @@ -1465,7 +1046,7 @@ "requires": { "file-type": "5.2.0", "is-stream": "1.1.0", - "tar-stream": "1.5.5" + "tar-stream": "1.6.1" } }, "decompress-tarbz2": { @@ -1509,7 +1090,7 @@ "file-type": "3.9.0", "get-stream": "2.3.1", "pify": "2.3.0", - "yauzl": "2.9.1" + "yauzl": "2.10.0" }, "dependencies": { "file-type": { @@ -1529,11 +1110,6 @@ "type-detect": "4.0.8" } }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" - }, "default-require-extensions": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", @@ -1561,21 +1137,23 @@ "dev": true }, "detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } }, "diff": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz", - "integrity": "sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA==", - "dev": true + "integrity": "sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA==" }, "dom-serializer": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "dev": true, "requires": { "domelementtype": "1.1.3", "entities": "1.1.1" @@ -1584,31 +1162,32 @@ "domelementtype": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" } } }, "domelementtype": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" }, "domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, "requires": { "dom-serializer": "0.1.0", "domelementtype": "1.3.0" } }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "0.1.1" + } }, "ee-first": { "version": "1.1.1", @@ -1616,11 +1195,6 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, - "ejs": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", - "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=" - }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -1639,35 +1213,25 @@ "entities": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "requires": { - "is-arrayish": "0.2.1" - } + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" }, "es5-ext": { - "version": "0.10.39", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.39.tgz", - "integrity": "sha512-AlaXZhPHl0po/uxMx1tyrlt1O86M6D5iVaDH8UgLfgek4kXTX6vzsRfJQWC2Ku+aG8pkw1XWzh9eTkwfVrsD5g==", - "dev": true, + "version": "0.10.45", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", + "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", "requires": { "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "es6-symbol": "3.1.1", + "next-tick": "1.0.0" } }, "es6-iterator": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.39", + "es5-ext": "0.10.45", "es6-symbol": "3.1.1" } }, @@ -1687,10 +1251,9 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.39", + "es5-ext": "0.10.45", "es6-iterator": "2.0.3", "es6-symbol": "3.1.1", "event-emitter": "0.3.5" @@ -1700,10 +1263,9 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.39" + "es5-ext": "0.10.45" } }, "escape-html": { @@ -1715,7 +1277,8 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "esutils": { "version": "2.0.2", @@ -1733,51 +1296,20 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.39" - } - }, - "execa": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", - "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - } + "es5-ext": "0.10.45" } }, "express": { - "version": "4.15.5", - "resolved": "https://registry.npmjs.org/express/-/express-4.15.5.tgz", - "integrity": "sha1-ZwI1ypWYiQpa6BcLg9tyK4Qu2Sc=", + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", "dev": true, "requires": { - "accepts": "1.3.4", + "accepts": "1.3.5", "array-flatten": "1.1.1", + "body-parser": "1.18.2", "content-disposition": "0.5.2", "content-type": "1.0.4", "cookie": "0.3.1", @@ -1787,55 +1319,137 @@ "encodeurl": "1.0.2", "escape-html": "1.0.3", "etag": "1.8.1", - "finalhandler": "1.0.6", + "finalhandler": "1.1.1", "fresh": "0.5.2", "merge-descriptors": "1.0.1", "methods": "1.1.2", "on-finished": "2.3.0", "parseurl": "1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "1.1.5", - "qs": "6.5.0", + "proxy-addr": "2.0.3", + "qs": "6.5.1", "range-parser": "1.2.0", - "send": "0.15.6", - "serve-static": "1.12.6", - "setprototypeof": "1.0.3", - "statuses": "1.3.1", + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "1.4.0", "type-is": "1.6.16", - "utils-merge": "1.0.0", + "utils-merge": "1.0.1", "vary": "1.1.2" }, "dependencies": { + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.2", + "http-errors": "1.6.3", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.16" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, "qs": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.0.tgz", - "integrity": "sha512-fjVFjW9yhqMhVGwRExCXLhJKrLlkYSaxNWdyc9rmHlrVZbk35YHH312dFd7191uQeXkI3mKLZTIbSvIeFwFemg==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.4.0" + } + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", "dev": true } } }, "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", "dev": true, "requires": { "pend": "1.2.0" } }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "requires": { - "escape-string-regexp": "1.0.5" - } - }, "file-type": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", @@ -1843,9 +1457,9 @@ "dev": true }, "finalhandler": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz", - "integrity": "sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "dev": true, "requires": { "debug": "2.6.9", @@ -1853,10 +1467,23 @@ "escape-html": "1.0.3", "on-finished": "2.3.0", "parseurl": "1.3.2", - "statuses": "1.3.1", + "statuses": "1.4.0", "unpipe": "1.0.0" + }, + "dependencies": { + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + } } }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, "form-data": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", @@ -1879,20 +1506,17 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "get-func-name": { "version": "2.0.0", @@ -1910,12 +1534,19 @@ "pinkie-promise": "2.0.1" } }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "1.0.0" + } + }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "requires": { - "fs.realpath": "1.0.0", "inflight": "1.0.6", "inherits": "2.0.3", "minimatch": "3.0.4", @@ -1923,14 +1554,6 @@ "path-is-absolute": "1.0.1" } }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "requires": { - "ini": "1.3.5" - } - }, "globalize": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/globalize/-/globalize-1.3.0.tgz", @@ -1945,22 +1568,11 @@ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true }, "graceful-readlink": { "version": "1.0.1", @@ -1980,12 +1592,6 @@ "uglify-js": "2.8.29" }, "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, "source-map": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", @@ -1997,12 +1603,18 @@ } } }, - "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "requires": { - "function-bind": "1.1.1" + "ajv": "5.5.2", + "har-schema": "2.0.0" } }, "has-ansi": { @@ -2020,56 +1632,57 @@ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", "dev": true }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.1", + "sntp": "2.1.0" + } + }, + "hoek": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" + }, "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { - "depd": "1.1.1", + "depd": "1.1.2", "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": "1.3.1" - }, - "dependencies": { - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", - "dev": true - } + "setprototypeof": "1.1.0", + "statuses": "1.5.0" } }, - "http-proxy-agent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-1.0.0.tgz", - "integrity": "sha1-zBzjjkU7+YSg93AtLdWcc9CBKEo=", + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "agent-base": "2.1.1", - "debug": "2.6.9", - "extend": "3.0.1" + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.2" } }, - "https-proxy-agent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", - "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, "requires": { - "agent-base": "2.1.1", - "debug": "2.6.9", - "extend": "3.0.1" + "safer-buffer": "2.1.2" } }, - "iconv-lite": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", - "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=", - "dev": true - }, "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", "dev": true }, "immediate": { @@ -2078,16 +1691,6 @@ "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", "dev": true }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2102,89 +1705,87 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" - }, "intern": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/intern/-/intern-4.1.5.tgz", - "integrity": "sha512-wY3xxstQ2zHpOU/ktjMcyvzmzazyjvlcipD79RqDGm+kyMdJcyI+00qfHvPlzrwhGwX+XVs2+tqwJCiSMKzYUg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/intern/-/intern-4.2.2.tgz", + "integrity": "sha512-yVe+IsWXAdZaj2LX9PiZ9KUQzru67zuCcIf28ulxh9bp7dvLvmyeEH1d+DpF78+zvl7ebAOEvX3NDQSc/PEdOQ==", "dev": true, "requires": { - "@dojo/core": "0.3.1", + "@dojo/core": "0.5.0", "@dojo/has": "0.1.2", "@dojo/interfaces": "0.2.1", - "@theintern/digdug": "2.0.4", - "@theintern/leadfoot": "2.0.3", + "@dojo/shim": "0.2.7", + "@theintern/digdug": "2.1.2", + "@theintern/leadfoot": "2.1.0", "@types/benchmark": "1.0.31", - "@types/chai": "4.0.10", + "@types/chai": "4.1.4", "@types/charm": "1.0.1", - "@types/diff": "3.2.2", - "@types/express": "4.0.39", - "@types/http-errors": "1.5.34", + "@types/diff": "3.5.1", + "@types/express": "4.11.1", + "@types/http-errors": "1.6.1", "@types/istanbul-lib-coverage": "1.1.0", "@types/istanbul-lib-hook": "1.0.0", - "@types/istanbul-lib-instrument": "1.7.1", + "@types/istanbul-lib-instrument": "1.7.2", "@types/istanbul-lib-report": "1.1.0", "@types/istanbul-lib-source-maps": "1.2.1", "@types/istanbul-reports": "1.1.0", - "@types/lodash": "4.14.104", + "@types/lodash": "4.14.112", "@types/mime-types": "2.1.0", "@types/platform": "1.3.1", - "@types/resolve": "0.0.4", + "@types/resolve": "0.0.7", "@types/shell-quote": "1.6.0", - "@types/source-map": "0.1.29", - "@types/statuses": "1.2.28", - "@types/ws": "0.0.42", + "@types/statuses": "1.3.0", + "@types/ws": "4.0.2", "benchmark": "2.1.4", - "body-parser": "1.17.2", + "body-parser": "1.18.3", "chai": "4.1.2", "charm": "1.0.2", - "diff": "3.2.0", - "express": "4.15.5", + "diff": "3.5.0", + "express": "4.16.3", "glob": "7.1.2", - "http-errors": "1.6.2", - "istanbul-lib-coverage": "1.1.2", - "istanbul-lib-hook": "1.0.7", - "istanbul-lib-instrument": "1.7.5", + "http-errors": "1.6.3", + "istanbul-lib-coverage": "1.2.0", + "istanbul-lib-hook": "1.1.0", + "istanbul-lib-instrument": "1.10.1", "istanbul-lib-report": "1.1.3", - "istanbul-lib-source-maps": "1.2.3", - "istanbul-reports": "1.1.4", - "lodash": "4.17.5", + "istanbul-lib-source-maps": "1.2.5", + "istanbul-reports": "1.3.0", + "lodash": "4.17.10", "mime-types": "2.1.18", "minimatch": "3.0.4", "platform": "1.3.5", - "resolve": "1.4.0", + "resolve": "1.7.1", "shell-quote": "1.6.1", - "source-map": "0.5.7", - "statuses": "1.3.1", - "tslib": "1.8.0", - "ws": "2.3.1" + "source-map": "0.6.1", + "statuses": "1.5.0", + "tslib": "1.9.3", + "ws": "5.1.1" }, "dependencies": { - "@dojo/core": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@dojo/core/-/core-0.3.1.tgz", - "integrity": "sha512-PEwqxpsuTTG0b2wwy0TLHEFf/R6ZBE4zizo4EXzGUVRc5O44w5Hbn+NN48v/o8hwQRKxmX3ywLI0Z1CMZ6NM6w==", + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "tslib": "1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.8.1.tgz", - "integrity": "sha1-aUavLR1lGnsYY7Ux1uWvpBqkTqw=", - "dev": true - } + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, - "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", "dev": true } } @@ -2201,52 +1802,26 @@ "integrity": "sha512-SFGCL4d6A7J+aXNHTx94zV7ydngTKraDBvoJjn5iGgsXYhXgAXIYj8i3ewJoO80BRB7qtBB3sBlrdGNwTktzLg==" }, "invariant": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.3.tgz", - "integrity": "sha512-7Z5PPegwDTyjbaeCnV0efcyS6vdKAU51kpEmS7QFib3P4822l8ICYyMn7qvJnc+WzLoDsuI9gPMKbJ8pCu8XtA==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, "requires": { - "loose-envify": "1.3.1" + "loose-envify": "1.4.0" } }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, "ipaddr.js": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", - "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", "dev": true }, - "is-absolute": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", - "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", - "requires": { - "is-relative": "0.2.1", - "is-windows": "0.2.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "is-ci": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", - "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", - "requires": { - "ci-info": "1.1.3" - } - }, "is-finite": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", @@ -2256,87 +1831,22 @@ "number-is-nan": "1.0.1" } }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "requires": { - "global-dirs": "0.1.1", - "is-path-inside": "1.0.1" - } - }, "is-natural-number": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=", "dev": true }, - "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "requires": { - "path-is-inside": "1.0.2" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" - }, - "is-relative": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", - "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", - "requires": { - "is-unc-path": "0.1.2" - } - }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" - }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true }, - "is-unc-path": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", - "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", - "requires": { - "unc-path-regex": "0.1.2" - } + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "is-utf8": { "version": "0.2.1", @@ -2344,45 +1854,36 @@ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul-lib-coverage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.2.tgz", - "integrity": "sha512-tZYA0v5A7qBSsOzcebJJ/z3lk3oSzH62puG78DbBA1+zupipX2CakDyiPV3pOb8He+jBwVimuwB0dTnh38hX0w==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", + "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", "dev": true }, "istanbul-lib-hook": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz", - "integrity": "sha512-3U2HB9y1ZV9UmFlE12Fx+nPtFqIymzrqCksrXujm3NVbAZIJg/RfYgO1XiIa0mbmxTjWpVEVlkIZJ25xVIAfkQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz", + "integrity": "sha512-U3qEgwVDUerZ0bt8cfl3dSP3S6opBoOtk3ROO5f2EfBr/SRiD9FQqzwaZBqFORu8W7O0EXpai+k7kxHK13beRg==", "dev": true, "requires": { "append-transform": "0.4.0" } }, "istanbul-lib-instrument": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.5.tgz", - "integrity": "sha1-rbWW+PDLi5XnOSBjUaOKWGryGx4=", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", + "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", "dev": true, "requires": { "babel-generator": "6.26.1", @@ -2390,7 +1891,7 @@ "babel-traverse": "6.26.0", "babel-types": "6.26.0", "babylon": "6.18.0", - "istanbul-lib-coverage": "1.1.2", + "istanbul-lib-coverage": "1.2.0", "semver": "5.5.0" } }, @@ -2400,12 +1901,21 @@ "integrity": "sha512-D4jVbMDtT2dPmloPJS/rmeP626N5Pr3Rp+SovrPn1+zPChGHcggd/0sL29jnbm4oK9W0wHjCRsdch9oLd7cm6g==", "dev": true, "requires": { - "istanbul-lib-coverage": "1.1.2", + "istanbul-lib-coverage": "1.2.0", "mkdirp": "0.5.1", "path-parse": "1.0.5", "supports-color": "3.2.3" }, "dependencies": { + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -2418,13 +1928,13 @@ } }, "istanbul-lib-source-maps": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz", - "integrity": "sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz", + "integrity": "sha512-8O2T/3VhrQHn0XcJbP1/GN7kXMiRAlPi+fj3uEHrjBD8Oz7Py0prSC25C09NuAZS6bgW1NNKAvCSHZXB0irSGA==", "dev": true, "requires": { "debug": "3.1.0", - "istanbul-lib-coverage": "1.1.2", + "istanbul-lib-coverage": "1.2.0", "mkdirp": "0.5.1", "rimraf": "2.6.2", "source-map": "0.5.7" @@ -2438,13 +1948,28 @@ "requires": { "ms": "2.0.0" } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, "istanbul-reports": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.4.tgz", - "integrity": "sha512-DfSTVOTkuO+kRmbO8Gk650Wqm1WRGr6lrdi2EwDK1vxpS71vdlLd613EpzOKdIFioB5f/scJTjeWBnvd1FWejg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz", + "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==", "dev": true, "requires": { "handlebars": "4.0.11" @@ -2453,7 +1978,14 @@ "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true }, "jsesc": { "version": "1.3.0", @@ -2461,33 +1993,36 @@ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, "jsonify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "dev": true }, - "jspm-config": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/jspm-config/-/jspm-config-0.3.4.tgz", - "integrity": "sha1-RMJpAuSujs4jZs7cn/FrEKXzkcY=", + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "requires": { - "any-promise": "1.3.0", - "graceful-fs": "4.1.11", - "make-error-cause": "1.2.2", - "object.pick": "1.3.0", - "parse-json": "2.2.0", - "strip-bom": "3.0.0", - "thenify": "3.3.0", - "throat": "3.2.0", - "xtend": "4.0.1" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - } + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" } }, "jszip": { @@ -2547,14 +2082,6 @@ "dev": true, "optional": true }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "1.0.0" - } - }, "lie": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", @@ -2564,36 +2091,11 @@ "immediate": "3.0.6" } }, - "listify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/listify/-/listify-1.0.0.tgz", - "integrity": "sha1-A8p7otFQ1CZ3c/dOV1WNEFPSvuM=" - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - } - } - }, - "lockfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.3.tgz", - "integrity": "sha1-Jjj8OaAzHpysGgS3F5mTHJxQ33k=" - }, "lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true }, "longest": { "version": "1.0.1", @@ -2602,31 +2104,19 @@ "dev": true }, "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, "requires": { "js-tokens": "3.0.2" } }, - "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" - }, - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, "make-dir": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", - "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, "requires": { "pify": "3.0.0" }, @@ -2634,37 +2124,17 @@ "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true } } }, - "make-error": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", - "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==" - }, - "make-error-cause": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-1.2.2.tgz", - "integrity": "sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0=", - "requires": { - "make-error": "1.3.4" - } - }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "requires": { - "mimic-fn": "1.2.0" - } - }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -2678,9 +2148,9 @@ "dev": true }, "mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", "dev": true }, "mime-db": { @@ -2696,11 +2166,6 @@ "mime-db": "1.33.0" } }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -2710,29 +2175,23 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", "requires": { "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true }, "negotiator": { "version": "0.6.1", @@ -2740,27 +2199,23 @@ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", "dev": true }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "requires": { "abbrev": "1.1.1" } }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "2.0.1" - } - }, "nth-check": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", - "dev": true, "requires": { "boolbase": "1.0.0" } @@ -2768,20 +2223,19 @@ "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "3.0.1" - } + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true }, "on-finished": { "version": "2.3.0", @@ -2792,77 +2246,30 @@ "ee-first": "1.1.1" } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1.0.2" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "0.0.10", - "wordwrap": "0.0.3" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - } - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "p-try": "1.0.0" + "wrappy": "1.0.2" } }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, "requires": { - "p-limit": "1.2.0" + "minimist": "0.0.8", + "wordwrap": "0.0.3" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, "pako": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", "dev": true }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "1.3.1" - } - }, "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", @@ -2874,16 +2281,6 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, "path-parse": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", @@ -2913,20 +2310,28 @@ "resolved": "https://registry.npmjs.org/pepjs/-/pepjs-0.4.2.tgz", "integrity": "sha1-EyZO6olJhP9CPIPkDS+k4d7Byfo=" }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, "requires": { "pinkie": "2.0.4" } @@ -2937,69 +2342,41 @@ "integrity": "sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q==", "dev": true }, - "popsicle-proxy-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/popsicle-proxy-agent/-/popsicle-proxy-agent-3.0.0.tgz", - "integrity": "sha1-uRM8VdlFdZq37mG3cRNkYg066tw=", - "requires": { - "http-proxy-agent": "1.0.0", - "https-proxy-agent": "1.0.0" - } - }, - "popsicle-retry": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/popsicle-retry/-/popsicle-retry-3.2.1.tgz", - "integrity": "sha1-4G6GZTO0KnoSPrMwy+Y6fOvLoQw=", - "requires": { - "any-promise": "1.3.0", - "xtend": "4.0.1" - } - }, - "popsicle-rewrite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/popsicle-rewrite/-/popsicle-rewrite-1.0.0.tgz", - "integrity": "sha1-HdTo6pwxgjUfuCD4eTTZkvf7kAc=" - }, - "popsicle-status": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/popsicle-status/-/popsicle-status-2.0.1.tgz", - "integrity": "sha1-jdcMT+fGlBCa3XhP/oDqysHnso0=" - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=" }, "proxy-addr": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", - "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", "dev": true, "requires": { "forwarded": "0.1.2", - "ipaddr.js": "1.4.0" + "ipaddr.js": "1.6.0" } }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, + "q": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.0.1.tgz", + "integrity": "sha1-EYcq7t7okmgRCxCnGESP+xARKhQ=" + }, "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "range-parser": { "version": "1.2.0", @@ -3008,38 +2385,29 @@ "dev": true }, "raw-body": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz", - "integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", "dev": true, "requires": { - "bytes": "2.4.0", - "iconv-lite": "0.4.15", + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", "unpipe": "1.0.0" } }, - "rc": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.5.tgz", - "integrity": "sha1-J1zWh/bjs2zHVrqibf7oCnkDAf0=", - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - } - }, "readable-stream": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", - "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", "isarray": "1.0.0", "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", "util-deprecate": "1.0.2" } }, @@ -3049,7 +2417,7 @@ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "1.4.0" + "resolve": "1.7.1" } }, "regenerator-runtime": { @@ -3058,23 +2426,6 @@ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", "dev": true }, - "registry-auth-token": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", - "requires": { - "rc": "1.2.5", - "safe-buffer": "5.1.1" - } - }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "requires": { - "rc": "1.2.5" - } - }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", @@ -3090,20 +2441,47 @@ "is-finite": "1.0.2" } }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + "request": { + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.7.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.2", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "stringstream": "0.0.6", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.3.2" + } }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + "request-progress": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-0.3.1.tgz", + "integrity": "sha1-ByHBBdipasayzossia4tXs/Pazo=", + "requires": { + "throttleit": "0.0.2" + } }, "resolve": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, "requires": { "path-parse": "1.0.5" @@ -3123,35 +2501,31 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, "requires": { "glob": "7.1.2" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "requires": { - "is-promise": "2.1.0" - } - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "requires": { - "rx-lite": "4.0.8" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + } } }, "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safer-buffer": { "version": "2.1.2", @@ -3170,20 +2544,13 @@ "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" - }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "requires": { - "semver": "5.5.0" - } + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true }, "send": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/send/-/send-0.15.6.tgz", - "integrity": "sha1-IPI6nJJbdiq4JwX+L52yUqzkfjQ=", + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "dev": true, "requires": { "debug": "2.6.9", @@ -3193,50 +2560,40 @@ "escape-html": "1.0.3", "etag": "1.8.1", "fresh": "0.5.2", - "http-errors": "1.6.2", - "mime": "1.3.4", + "http-errors": "1.6.3", + "mime": "1.4.1", "ms": "2.0.0", "on-finished": "2.3.0", "range-parser": "1.2.0", - "statuses": "1.3.1" + "statuses": "1.4.0" + }, + "dependencies": { + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + } } }, "serve-static": { - "version": "1.12.6", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.6.tgz", - "integrity": "sha1-uXN3P2NEmTTaVOW+ul4x2fQhFXc=", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "dev": true, "requires": { "encodeurl": "1.0.2", "escape-html": "1.0.3", "parseurl": "1.3.2", - "send": "0.15.6" + "send": "0.16.2" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, "shell-quote": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", @@ -3258,6 +2615,22 @@ "glob": "7.1.2", "interpret": "1.1.0", "rechoir": "0.6.2" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + } } }, "shx": { @@ -3269,75 +2642,71 @@ "es6-object-assign": "1.1.0", "minimist": "1.2.0", "shelljs": "0.7.8" - } - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "requires": { - "is-fullwidth-code-point": "2.0.0" }, "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "requires": { - "is-plain-obj": "1.1.0" + "hoek": "4.2.1" } }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "string-template": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string-template/-/string-template-1.0.0.tgz", - "integrity": "sha1-np8iM9wA8hhxjsN5oopWc+zKi5Y=" - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "sshpk": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.2", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "safer-buffer": "2.1.2", + "tweetnacl": "0.14.5" } }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" } }, + "stringstream": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", + "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==" + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -3360,16 +2729,6 @@ "is-natural-number": "4.0.1" } }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -3377,73 +2736,36 @@ "dev": true }, "tar-stream": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz", - "integrity": "sha512-mQdgLPc/Vjfr3VWqWbfxW8yQNiJCbAZ+Gf6GDu1Cy0bdb33ofyiNGBtAY96jHFhDuivCwgW1H9DgTON+INiXgg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", + "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==", "dev": true, "requires": { - "bl": "1.2.1", + "bl": "1.2.2", + "buffer-alloc": "1.2.0", "end-of-stream": "1.4.1", - "readable-stream": "2.3.4", + "fs-constants": "1.0.0", + "readable-stream": "2.3.6", + "to-buffer": "1.1.1", "xtend": "4.0.1" } }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "requires": { - "execa": "0.7.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - } - } - }, - "thenify": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", - "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", - "requires": { - "any-promise": "1.3.0" - } - }, - "throat": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-3.2.0.tgz", - "integrity": "sha512-/EY8VpvlqJ+sFtLPeOgc8Pl7kQVOWv0woD87KTXVHPIAE842FGT+rokxIhe8xIUP1cfgrkt0as0vDLjDiMtr8w==" + "throttleit": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", + "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=" }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true }, "to-fast-properties": { "version": "1.0.3", @@ -3451,14 +2773,6 @@ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true }, - "touch": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-1.0.0.tgz", - "integrity": "sha1-RJy+LbrlqMgDjjDXH6D/RklHxN4=", - "requires": { - "nopt": "1.0.10" - } - }, "tough-cookie": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", @@ -3474,9 +2788,23 @@ "dev": true }, "tslib": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.8.0.tgz", - "integrity": "sha512-ymKWWZJST0/CkgduC2qkzjMOWr4bouhuURNXCn/inEX0L57BnRG6FhX76o7FOnsjHazCjfU2LKeSrlS2sIKQJg==" + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.8.1.tgz", + "integrity": "sha1-aUavLR1lGnsYY7Ux1uWvpBqkTqw=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true }, "type-detect": { "version": "4.0.8", @@ -3494,11 +2822,6 @@ "mime-types": "2.1.18" } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, "typescript": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", @@ -3516,51 +2839,12 @@ "yargs": "3.10.0" }, "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "optional": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true, - "optional": true - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true, "optional": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } } } }, @@ -3571,12 +2855,6 @@ "dev": true, "optional": true }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true - }, "unbzip2-stream": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz", @@ -3587,67 +2865,56 @@ "through": "2.3.8" } }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" - }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "requires": { - "crypto-random-string": "1.0.0" - } - }, - "universalify": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", - "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" - }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "requires": { - "prepend-http": "1.0.4" - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "utils-merge": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, "web-animations-js": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/web-animations-js/-/web-animations-js-2.3.1.tgz", "integrity": "sha1-Om2bwVGWN3qQ+OKAP6UmIWWwRRA=" }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "requires": { - "isexe": "2.0.0" - } + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true, + "optional": true }, "wordwrap": { "version": "0.0.3", @@ -3655,67 +2922,48 @@ "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", "dev": true }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-2.3.1.tgz", - "integrity": "sha1-a5Sz5EfLajY/eF6vlK9jWejoHIA=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.1.1.tgz", + "integrity": "sha512-bOusvpCb09TOBLbpMKszd45WKC2KPtxiyiHanv+H2DE3Az+1db5a/L7sVJZVDPUC1Br8f0SKRr1KjLpD1U/IAw==", "dev": true, "requires": { - "safe-buffer": "5.0.1", - "ultron": "1.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=", - "dev": true - } + "async-limiter": "1.0.0" } }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } }, "yauzl": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz", - "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", "dev": true, "requires": { "buffer-crc32": "0.2.13", - "fd-slicer": "1.0.1" + "fd-slicer": "1.1.0" } - }, - "zip-object": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/zip-object/-/zip-object-0.1.0.tgz", - "integrity": "sha1-waDaBMiMg3dW4khoCgP/kC7D9To=" } } } diff --git a/test-app/package.json b/test-app/package.json index e02bf82..2ae5c93 100644 --- a/test-app/package.json +++ b/test-app/package.json @@ -12,17 +12,12 @@ "build-test": "dojo build --mode test" }, "dependencies": { - "@dojo/cli": "2.0.0", - "@dojo/shim": "2.0.0", - "@dojo/core": "2.0.0", - "@dojo/i18n": "2.0.0", - "@dojo/widget-core": "2.0.0", - "tslib": "1.8.0", + "@dojo/framework": "^3.0.0-alpha.1", + "tslib": "~1.8.0", "typescript": "2.6.2" }, "devDependencies": { - "@dojo/test-extras": "2.0.0", "shx": "0.2.2", - "intern": "4.1.5" + "intern": "4.2.2" } } diff --git a/test-app/src/menu-item/MenuItem.ts b/test-app/src/menu-item/MenuItem.ts index c16f7ed..49a05b7 100644 --- a/test-app/src/menu-item/MenuItem.ts +++ b/test-app/src/menu-item/MenuItem.ts @@ -1,8 +1,8 @@ -import { v } from '@dojo/widget-core/d'; -import { customElement } from '@dojo/widget-core/decorators/customElement'; -import { WidgetProperties } from '@dojo/widget-core/interfaces'; -import { theme, ThemedMixin } from '@dojo/widget-core/mixins/Themed'; -import { WidgetBase } from '@dojo/widget-core/WidgetBase'; +import { v } from '@dojo/framework/widget-core/d'; +import { customElement } from '@dojo/framework/widget-core/decorators/customElement'; +import { WidgetProperties } from '@dojo/framework/widget-core/interfaces'; +import { theme, ThemedMixin } from '@dojo/framework/widget-core/mixins/Themed'; +import { WidgetBase } from '@dojo/framework/widget-core/WidgetBase'; import * as css from './menuItem.m.css'; diff --git a/test-app/src/menu/Menu.ts b/test-app/src/menu/Menu.ts index ae92b68..5e396d2 100644 --- a/test-app/src/menu/Menu.ts +++ b/test-app/src/menu/Menu.ts @@ -1,8 +1,8 @@ -import { v } from '@dojo/widget-core/d'; -import { customElement } from '@dojo/widget-core/decorators/customElement'; -import { WidgetProperties, WNode } from '@dojo/widget-core/interfaces'; -import { theme, ThemedMixin } from '@dojo/widget-core/mixins/Themed'; -import { WidgetBase } from '@dojo/widget-core/WidgetBase'; +import { v } from '@dojo/framework/widget-core/d'; +import { customElement } from '@dojo/framework/widget-core/decorators/customElement'; +import { WidgetProperties, WNode } from '@dojo/framework/widget-core/interfaces'; +import { theme, ThemedMixin } from '@dojo/framework/widget-core/mixins/Themed'; +import { WidgetBase } from '@dojo/framework/widget-core/WidgetBase'; import { MenuItem, MenuItemProperties } from '../menu-item/MenuItem'; import * as css from './menu.m.css'; diff --git a/test-app/tests/unit/menu-item/MenuItem.ts b/test-app/tests/unit/menu-item/MenuItem.ts index 99ca084..d79d056 100644 --- a/test-app/tests/unit/menu-item/MenuItem.ts +++ b/test-app/tests/unit/menu-item/MenuItem.ts @@ -1,7 +1,7 @@ const { describe, it } = intern.getInterface('bdd'); -import harness from '@dojo/test-extras/harness'; +import harness from '@dojo/framework/testing/harness'; -import { v } from '@dojo/widget-core/d'; +import { v } from '@dojo/framework/widget-core/d'; import { MenuItem } from '../../../src/menu-item/MenuItem'; import * as css from '../../../src/menu-item/menuItem.m.css'; diff --git a/test-app/tests/unit/menu/Menu.ts b/test-app/tests/unit/menu/Menu.ts index 95d1198..6664aa6 100644 --- a/test-app/tests/unit/menu/Menu.ts +++ b/test-app/tests/unit/menu/Menu.ts @@ -1,7 +1,7 @@ const { describe, it } = intern.getInterface('bdd'); -import harness from '@dojo/test-extras/harness'; +import harness from '@dojo/framework/testing/harness'; -import { v } from '@dojo/widget-core/d'; +import { v } from '@dojo/framework/widget-core/d'; import { Menu } from '../../../src/menu/Menu'; import * as css from '../../../src/menu/menu.m.css'; diff --git a/tests/functional/main.ts b/tests/functional/main.ts index 988b06c..af0ef3f 100644 --- a/tests/functional/main.ts +++ b/tests/functional/main.ts @@ -6,7 +6,7 @@ import * as rimraf from 'rimraf'; import * as execa from 'execa'; import * as os from 'os'; -const appRootDir = path.join(__dirname, '..', '..', '..', 'test-app'); +const appRootDir = path.join(__dirname, '..', '..', '..', '..', 'test-app'); const platform = os.platform().startsWith('win') ? 'windows' : 'unix'; diff --git a/tests/unit/main.ts b/tests/unit/main.ts index 6b9101d..befbfe4 100644 --- a/tests/unit/main.ts +++ b/tests/unit/main.ts @@ -396,7 +396,7 @@ describe('command', () => { ejectOptions.copy.files = ejectOptions.copy.files.filter((file: string) => !rcPattern.test(file)); assert.deepEqual(ejectOptions, { copy: { - path: join(basePath, '_build/src'), + path: join(basePath, 'dist/dev/src'), files: [ './base.config.js', './dev.config.js', diff --git a/tsconfig.json b/tsconfig.json index d0149cf..cebc6c4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,17 +1,6 @@ { + "extends": "./node_modules/@dojo/scripts/tsconfig/commonjs.json", "compilerOptions": { - "declaration": false, - "module": "commonjs", - "strict": true, - "outDir": "_build/", - "removeComments": false, - "sourceMap": true, - "target": "es5", - "noUnusedLocals": true, - "moduleResolution": "node", - "importHelpers": true, - "downlevelIteration": true, - "types": [ "intern" ], "lib": [ "dom", "es5", @@ -22,7 +11,9 @@ "es2015.promise", "es2015.symbol", "es2015.symbol.wellknown" - ] + ], + "target": "es2015", + "types": [ "intern" ] }, "include": [ "./src/**/*.ts", diff --git a/tslint.json b/tslint.json index 72f7401..1b8db13 100644 --- a/tslint.json +++ b/tslint.json @@ -1,65 +1,3 @@ { - "rules": { - "align": false, - "ban": [], - "class-name": true, - "comment-format": [ true, "check-space" ], - "curly": true, - "eofline": true, - "forin": false, - "indent": [ true, "tabs" ], - "interface-name": [ true, "never-prefix" ], - "jsdoc-format": true, - "label-position": true, - "max-line-length": 120, - "member-access": false, - "member-ordering": false, - "no-any": false, - "no-arg": true, - "no-bitwise": false, - "no-consecutive-blank-lines": true, - "no-console": false, - "no-construct": false, - "no-debugger": true, - "no-duplicate-variable": true, - "no-empty": false, - "no-eval": true, - "no-inferrable-types": [ true, "ignore-params" ], - "no-shadowed-variable": false, - "no-string-literal": false, - "no-switch-case-fall-through": false, - "no-trailing-whitespace": true, - "no-unused-expression": false, - "no-unused-variable": true, - "no-use-before-declare": false, - "no-var-keyword": true, - "no-var-requires": false, - "object-literal-sort-keys": false, - "one-line": [ true, "check-open-brace", "check-whitespace" ], - "quotemark": [ true, "single" ], - "radix": true, - "semicolon": [ true, "always" ], - "trailing-comma": [ true, { - "multiline": "never", - "singleline": "never" - } ], - "triple-equals": [ true, "allow-null-check" ], - "typedef": false, - "typedef-whitespace": [ true, { - "call-signature": "nospace", - "index-signature": "nospace", - "parameter": "nospace", - "property-declaration": "nospace", - "variable-declaration": "nospace" - }, { - "call-signature": "onespace", - "index-signature": "onespace", - "parameter": "onespace", - "property-declaration": "onespace", - "variable-declaration": "onespace" - } ], - "use-strict": false, - "variable-name": [ true, "check-format", "allow-pascal-case", "allow-leading-underscore", "ban-keywords" ], - "whitespace": [ true, "check-branch", "check-decl", "check-operator", "check-module", "check-separator", "check-type", "check-typecast" ] - } + "extends": "./node_modules/@dojo/scripts/tslint/base.json" }